From b21ab51d37672f7e5934938d0ffde641f4de3a26 Mon Sep 17 00:00:00 2001 From: stuconnolly Date: Thu, 15 Jul 2010 10:57:32 +0000 Subject: Improve handling of BIT fields, including: - Exporting BIT fields properly in SQL dumps using b'x' notation. - Properly handling editing of BIT fields in both the content and custom query results views. - Correctly display BIT fields in the content view, where binary values are zero-padded to the specified length of the field. (Note, that the new BIT handling logic has only been added to MCPKit's MCPStreamingResult and MCPResult as the latter does not keep a record of the field's length which the new functionality depends on. Needs to be discussed). --- .../MCPKit/MCPFoundationKit/MCPStreamingResult.m | 35 ++++++++++++++++++++-- 1 file changed, 32 insertions(+), 3 deletions(-) (limited to 'Frameworks') diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPStreamingResult.m b/Frameworks/MCPKit/MCPFoundationKit/MCPStreamingResult.m index 3b39738b..be09ed44 100644 --- a/Frameworks/MCPKit/MCPFoundationKit/MCPStreamingResult.m +++ b/Frameworks/MCPKit/MCPFoundationKit/MCPStreamingResult.m @@ -45,8 +45,12 @@ @interface MCPStreamingResult (PrivateAPI) + +const char *_int2bin(unsigned int n, unsigned long len, char *buf); + - (void) _downloadAllData; - (void) _freeAllDataWhenDone; + @end @implementation MCPStreamingResult : MCPResult @@ -159,7 +163,7 @@ - (NSArray *)fetchNextRowAsArray { MYSQL_ROW theRow; - char *theRowData; + char *theRowData, *buf; unsigned long *fieldLengths; NSInteger i, copiedDataLength; NSMutableArray *returnArray; @@ -242,7 +246,12 @@ copiedDataLength += fieldLengths[i] + 1; } } - + + // If the field is of type BIT, then allocate the binary buffer + if (fieldDefinitions[i].type == FIELD_TYPE_BIT) { + buf = malloc(fieldDefinitions[i].length + 1); + } + // If the data hasn't already been detected as NULL - in which case it will have been // set to NSNull - process the data by type if (cellData == nil) { @@ -283,7 +292,12 @@ break; case FIELD_TYPE_BIT: - cellData = (theData != NULL) ? [NSString stringWithFormat:@"%u", theData[0]] : @""; + // Get a binary representation of the data + _int2bin(theData[1], fieldDefinitions[i].length, buf); + + cellData = (theData != NULL) ? [NSString stringWithUTF8String:buf] : @""; + + free(buf); break; case FIELD_TYPE_TINY_BLOB: @@ -413,6 +427,21 @@ @implementation MCPStreamingResult (PrivateAPI) +/** + * Provides a binary representation of the supplied integer (n) in the supplied buffer (buf). The resulting + * binary representation will be zero-padded according to the supplied field length (len). + */ +const char *_int2bin(unsigned int n, unsigned long len, char *buf) +{ + for (int i = (len - 1); i >= 0; --i) + { + buf[i] = (n & 1) ? '1' : '0'; + n >>= 1; + } + + buf[len] = '\0'; +} + /** * Used internally to download results in a background thread */ -- cgit v1.2.3