aboutsummaryrefslogtreecommitdiffstats
path: root/Frameworks/MCPKit
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
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')
-rw-r--r--Frameworks/MCPKit/MCPFoundationKit/MCPResult.m9
-rw-r--r--Frameworks/MCPKit/MCPFoundationKit/MCPStreamingResult.m11
2 files changed, 5 insertions, 15 deletions
diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPResult.m b/Frameworks/MCPKit/MCPFoundationKit/MCPResult.m
index 53066c14..84793e44 100644
--- a/Frameworks/MCPKit/MCPFoundationKit/MCPResult.m
+++ b/Frameworks/MCPKit/MCPFoundationKit/MCPResult.m
@@ -419,10 +419,7 @@ const OUR_CHARSET our_charsets60[] =
if (theRow[i] == NULL) {
theCurrentObj = [NSNull null];
} else {
- char *theData = calloc(sizeof(char),theLengths[i]+1);
- //char *theUselLess;
- memcpy(theData, theRow[i],theLengths[i]);
- theData[theLengths[i]] = '\0';
+ char *theData = theRow[i];
switch (theField[i].type) {
case FIELD_TYPE_TINY:
@@ -444,7 +441,7 @@ const OUR_CHARSET our_charsets60[] =
case FIELD_TYPE_SET:
case FIELD_TYPE_ENUM:
case FIELD_TYPE_NEWDATE: // Don't know what the format for this type is...
- theCurrentObj = [NSString stringWithCString:theData encoding:mEncoding];
+ theCurrentObj = [[[NSString alloc] initWithBytes:theData length:theLengths[i] encoding:mEncoding] autorelease];
break;
case FIELD_TYPE_BIT:
@@ -479,8 +476,6 @@ const OUR_CHARSET our_charsets60[] =
break;
}
- free(theData);
-
// Some of the creators return nil object...
if (theCurrentObj == nil) {
theCurrentObj = [NSNull null];
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];
}