[metaString appendString:@"/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;\n"];
[metaString appendString:@"/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;\n"];
/* A note on SQL_MODE:
*
* BEFORE 3.23.6
@@ -228,6 +224,40 @@ - (void)exportOperation
* (trivia: internally it has become MODE_NOT_USED: 16 = "?")
*
*/
BOOL sqlModeIsValid = NO;
//fetch old sql mode to restore it later
{
SPMySQLResult *result = [connection queryString:@"SHOW VARIABLES LIKE 'sql_mode'"];
if(![connection queryErrored]) {
[result setReturnDataAsStrings:YES];
NSArray *row = [result getRowAsArray];
oldSqlMode = [[row objectAtIndex:1] unboxNull];
}
}
//set sql mode for export
if([@""isEqualToString:oldSqlMode]) {
// the current sql_mode is already the one we want (empty string), no need to change+revert it
oldSqlMode = nil;
sqlModeIsValid = YES;
}
else {
[connection queryString:@"SET SQL_MODE=''"]; //mysqldump uses a conditional comment for 40100 here, but we want to see the error, since it can't simply be ignored (also ANSI mode is supported before 4.1)
if (![connection queryErrored]) {
sqlModeIsValid = YES;
}
else {
[errors appendFormat:@"%@ (%@)\n", NSLocalizedString(@"The server's SQL_MODE could not be changed to one suitable for export. The export may be missing important details or may not be importable at all!", @"sql export : 'set @@sql_mode' query failed message"), [connection lastErrorMessage]];
[selfwriteUTF8String:[NSStringstringWithFormat:@"# SET SQL_MODE Error: %@\n\n\n", [connection lastErrorMessage]]];
//if we couldn't change it, we don't need to restore it either
oldSqlMode = nil;
}
}
// there is no point in writing out that the file should use a specific SQL mode when we don't even know which one was active during export
if(sqlModeIsValid) {
[metaString appendString:@"/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;\n"];
}
[metaString appendString:@"/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;\n\n\n"];