aboutsummaryrefslogtreecommitdiffstats
path: root/Source/SPXMLExporter.m
diff options
context:
space:
mode:
authorstuconnolly <stuart02@gmail.com>2010-11-04 16:10:33 +0000
committerstuconnolly <stuart02@gmail.com>2010-11-04 16:10:33 +0000
commit286d4ef211a7ab3e9564bbe6a099021e0064c941 (patch)
treeca94de4210172d8315c616bb2447db855fe4d979 /Source/SPXMLExporter.m
parent970535298acfe00937792e4e7d9d03b51fc26f76 (diff)
downloadsequelpro-286d4ef211a7ab3e9564bbe6a099021e0064c941.tar.gz
sequelpro-286d4ef211a7ab3e9564bbe6a099021e0064c941.tar.bz2
sequelpro-286d4ef211a7ab3e9564bbe6a099021e0064c941.zip
Start moving towards using the same XML format as MySQL uses. The inclusion of the query executed for filtered and query results as well as the table structure when exporting entire tables still needs to be added. Part of issue #840.
Diffstat (limited to 'Source/SPXMLExporter.m')
-rw-r--r--Source/SPXMLExporter.m41
1 files changed, 19 insertions, 22 deletions
diff --git a/Source/SPXMLExporter.m b/Source/SPXMLExporter.m
index c3fee7c2..1ff32018 100644
--- a/Source/SPXMLExporter.m
+++ b/Source/SPXMLExporter.m
@@ -63,10 +63,10 @@
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSArray *xmlRow = nil;
+ NSArray *fieldNames = nil;
NSString *dataConversionString = nil;
MCPStreamingResult *streamingResult = nil;
- NSMutableArray *xmlTags = [NSMutableArray array];
NSMutableString *xmlString = [NSMutableString string];
NSMutableString *xmlItem = [NSMutableString string];
@@ -94,27 +94,18 @@
if ((![self xmlDataArray]) && [self xmlTableName]) {
totalRows = [[[[connection queryString:[NSString stringWithFormat:@"SELECT COUNT(1) FROM %@", [[self xmlTableName] backtickQuotedString]]] fetchRowAsArray] objectAtIndex:0] integerValue];
streamingResult = [connection streamingQueryString:[NSString stringWithFormat:@"SELECT * FROM %@", [[self xmlTableName] backtickQuotedString]] useLowMemoryBlockingStreaming:[self exportUsingLowMemoryBlockingStreaming]];
+
+ [xmlString appendFormat:@"\t<table_data name=\"%@\">\n\n", [self xmlTableName]];
}
else {
totalRows = [[self xmlDataArray] count];
}
// Set up an array of encoded field names as opening and closing tags
- xmlRow = ([self xmlDataArray]) ? [[self xmlDataArray] objectAtIndex:0] : [streamingResult fetchFieldNames];
-
- for (i = 0; i < [xmlRow count]; i++)
- {
- [xmlTags addObject:[NSMutableArray array]];
-
- [[xmlTags objectAtIndex:i] addObject:[NSString stringWithFormat:@"\t\t<%@>", [[[xmlRow objectAtIndex:i] description] HTMLEscapeString]]];
- [[xmlTags objectAtIndex:i] addObject:[NSString stringWithFormat:@"</%@>\n", [[[xmlRow objectAtIndex:i] description] HTMLEscapeString]]];
- }
+ fieldNames = ([self xmlDataArray]) ? [[self xmlDataArray] objectAtIndex:0] : [streamingResult fetchFieldNames];
[[self exportOutputFile] writeData:[xmlString dataUsingEncoding:[self exportOutputEncoding]]];
- // Write an opening tag in the form of the table name
- [[self exportOutputFile] writeData:[[NSString stringWithFormat:@"\t<%@>\n", ([self xmlTableName]) ? [[self xmlTableName] HTMLEscapeString] : @"custom"] dataUsingEncoding:[self exportOutputEncoding]]];
-
// Set up the starting row, which is 0 for streaming result sets and
// 1 for supplied arrays which include the column headers as the first row.
currentRowIndex = 0;
@@ -176,6 +167,7 @@
return;
}
+ BOOL dataIsNULL = NO;
id data = NSArrayObjectAtIndex(xmlRow, i);
// Retrieve the contents of this tag
@@ -190,7 +182,7 @@
[dataConversionString release];
}
else if ([data isKindOfClass:[NSNull class]]) {
- [xmlItem setString:[self xmlNULLString]];
+ dataIsNULL = YES;
}
else if ([data isKindOfClass:[MCPGeometryData class]]) {
[xmlItem setString:[data wktString]];
@@ -198,15 +190,19 @@
else {
[xmlItem setString:[data description]];
}
+
+ [xmlString appendFormat:@"\t\t<field name=\"%@\"", [[NSArrayObjectAtIndex(fieldNames, i) description] HTMLEscapeString]];
- // Add the opening and closing tag and the contents to the XML string
- [xmlString appendString:NSArrayObjectAtIndex(NSArrayObjectAtIndex(xmlTags, i), 0)];
- [xmlString appendString:[xmlItem HTMLEscapeString]];
- [xmlString appendString:NSArrayObjectAtIndex(NSArrayObjectAtIndex(xmlTags, i), 1)];
+ if (dataIsNULL) {
+ [xmlString appendString:@" xsi:nil=\"true\" \\>\n"];
+ }
+ else {
+ [xmlString appendFormat:@">%@</field>\n", [xmlItem HTMLEscapeString]];
+ }
}
- [xmlString appendString:@"\t</row>\n"];
-
+ [xmlString appendString:@"\t</row>\n\n"];
+
// Record the total length for use with pool flushing
currentPoolDataLength += [xmlString length];
@@ -239,8 +235,9 @@
if ([self xmlDataArray] && totalRows == currentRowIndex) break;
}
- // Write the closing tag for the table
- [[self exportOutputFile] writeData:[[NSString stringWithFormat:@"\t</%@>\n\n", ([self xmlTableName]) ? [[self xmlTableName] HTMLEscapeString] : @"custom"] dataUsingEncoding:[self exportOutputEncoding]]];
+ if ((![self xmlDataArray]) && [self xmlTableName]) {
+ [[self exportOutputFile] writeData:[@"\t</table_data>\n\n" dataUsingEncoding:[self exportOutputEncoding]]];
+ }
// Write data to disk
[[[self exportOutputFile] exportFileHandle] synchronizeFile];