aboutsummaryrefslogtreecommitdiffstats
path: root/Frameworks/MCPKit/MCPFoundationKit/MCPStreamingResult.m
diff options
context:
space:
mode:
authorrowanbeentje <rowan@beent.je>2011-04-23 17:15:18 +0000
committerrowanbeentje <rowan@beent.je>2011-04-23 17:15:18 +0000
commitd60880e78188b4ef7cc2e73106eb980af3c13642 (patch)
tree1b3e064f9909c9e8d9f5afd7342c49b671dbb048 /Frameworks/MCPKit/MCPFoundationKit/MCPStreamingResult.m
parent555cb252a3e42d0df5835a18df4abbe1a0b0725a (diff)
downloadsequelpro-d60880e78188b4ef7cc2e73106eb980af3c13642.tar.gz
sequelpro-d60880e78188b4ef7cc2e73106eb980af3c13642.tar.bz2
sequelpro-d60880e78188b4ef7cc2e73106eb980af3c13642.zip
Alter result string processing to use returned string length and not null-terminated string processing:
- This fixes issues caused by null characters in strings - addressing Issue 1029 - Also appears to be a few percent faster than the old approach when processing lots of short strings - Allows significant simplification of MCPResult and low-memory MCPStreamingResult code, avoiding a memory copy; this also gives a significant speedup and can actually make full streaming in MCPStreamingResult faster than "fast streaming". The code will be reviewed further in future to improve on the gains seen here.
Diffstat (limited to 'Frameworks/MCPKit/MCPFoundationKit/MCPStreamingResult.m')
-rw-r--r--Frameworks/MCPKit/MCPFoundationKit/MCPStreamingResult.m11
1 files changed, 3 insertions, 8 deletions
diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPStreamingResult.m b/Frameworks/MCPKit/MCPFoundationKit/MCPStreamingResult.m
index 465221fe..ec4aa44b 100644
--- a/Frameworks/MCPKit/MCPFoundationKit/MCPStreamingResult.m
+++ b/Frameworks/MCPKit/MCPFoundationKit/MCPStreamingResult.m
@@ -226,14 +226,12 @@ void _bytes2bin(Byte *n, NSUInteger nbytes, NSUInteger len, char *buf);
id cellData = nil;
char *theData = NULL;
- // In fully streaming mode, copy across the data for the MYSQL_ROW
+ // In fully streaming mode, get a reference to the data for the MYSQL_ROW
if (fullyStreaming) {
if (theRow[i] == NULL) {
cellData = [NSNull null];
} else {
- theData = calloc(sizeof(char), fieldLengths[i]+1);
- memcpy(theData, theRow[i], fieldLengths[i]);
- theData[fieldLengths[i]] = '\0';
+ theData = theRow[i];
}
// In cached-streaming mode, use a reference to the downloaded data
@@ -281,7 +279,7 @@ void _bytes2bin(Byte *n, NSUInteger nbytes, NSUInteger len, char *buf);
}
// For string data, convert to text
else {
- cellData = [NSString stringWithCString:theData encoding:mEncoding];
+ cellData = [[[NSString alloc] initWithBytes:theData length:fieldLengths[i] encoding:mEncoding] autorelease];
}
break;
@@ -328,9 +326,6 @@ void _bytes2bin(Byte *n, NSUInteger nbytes, NSUInteger len, char *buf);
break;
}
- // Free the data if it was originally allocated
- if (fullyStreaming) free(theData);
-
// If a creator returned a nil object, replace with NSNull
if (cellData == nil) cellData = [NSNull null];
}