From 294af53678cda18e5f6e5f2007daa0893c1250d0 Mon Sep 17 00:00:00 2001 From: Bibiko Date: Fri, 1 Oct 2010 12:20:30 +0000 Subject: =?UTF-8?q?=E2=80=A2=20added=20basic=20support=20for=20spatial=20d?= =?UTF-8?q?ata=20-=20while=20querying=20and=20writing=20back=20make=20usag?= =?UTF-8?q?e=20of=20AsText()=20and=20GeomFromText()=20to=20allow=20to=20ed?= =?UTF-8?q?it=20each=20GEOMETRY=20field=20as=20text=20simple=20string=20-?= =?UTF-8?q?=20works=20only=20in=20Content=20Tab=20so=20far=20-=20the=20spa?= =?UTF-8?q?tial=20data=20are=20not=20yet=20editable=20inside=20views?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MCPKit/MCPFoundationKit/MCPStreamingResult.m | 4 +++ Source/SPTableContent.m | 38 +++++++++++++++++----- Source/SPTableData.h | 1 + Source/SPTableData.m | 29 +++++++++++++++++ 4 files changed, 64 insertions(+), 8 deletions(-) diff --git a/Frameworks/MCPKit/MCPFoundationKit/MCPStreamingResult.m b/Frameworks/MCPKit/MCPFoundationKit/MCPStreamingResult.m index 5c607912..5883bdc2 100644 --- a/Frameworks/MCPKit/MCPFoundationKit/MCPStreamingResult.m +++ b/Frameworks/MCPKit/MCPFoundationKit/MCPStreamingResult.m @@ -320,6 +320,10 @@ void _bytes2bin(Byte *n, NSUInteger nbytes, NSUInteger len, char *buf); cellData = [NSNull null]; break; + case FIELD_TYPE_GEOMETRY: + cellData = [NSData dataWithBytes:theData length:fieldLengths[i]]; + break; + default: NSLog(@"in fetchNextRowAsArray : Unknown type : %ld for column %ld, sending back a NSData object", (NSInteger)fieldDefinitions[i].type, (NSInteger)i); cellData = [NSData dataWithBytes:theData length:fieldLengths[i]]; diff --git a/Source/SPTableContent.m b/Source/SPTableContent.m index 71173f96..b620cf0b 100644 --- a/Source/SPTableContent.m +++ b/Source/SPTableContent.m @@ -2387,6 +2387,8 @@ { [rowValue setString:@"CURRENT_TIMESTAMP"]; + } else if ( [[NSArrayObjectAtIndex(dataColumns, i) objectForKey:@"typegrouping"] isEqualToString:@"geometry"] ) { + [rowValue setString:[NSString stringWithFormat:@"GeomFromText('%@')", rowObject]]; // Convert the object to a string (here we can add special treatment for date-, number- and data-fields) } else if ( [rowObject isNSNull] || ([rowObject isMemberOfClass:[NSString class]] && [[rowObject description] isEqualToString:@""]) ) { @@ -2672,8 +2674,12 @@ [value setString:[NSString stringWithFormat:@"b'%@'", [mySQLConnection prepareString:tempValue]]]; } // BLOB/TEXT data - else if ([tempValue isKindOfClass:[NSData class]]) - [value setString:[NSString stringWithFormat:@"X'%@'", [mySQLConnection prepareBinaryData:tempValue]]]; + else if ([tempValue isKindOfClass:[NSData class]]) { + if([tableDataInstance columnIsGeometry:NSArrayObjectAtIndex(keys, i)]) + [value setString:[NSString stringWithFormat:@"GeomFromText('%@')", [[[NSString alloc] initWithData:tempValue encoding:NSASCIIStringEncoding] autorelease]]]; + else + [value setString:[NSString stringWithFormat:@"X'%@'", [mySQLConnection prepareBinaryData:tempValue]]]; + } else [value setString:[NSString stringWithFormat:@"'%@'", [mySQLConnection prepareString:tempValue]]]; @@ -2712,15 +2718,18 @@ { NSInteger i; NSMutableArray *fields = [NSMutableArray array]; + NSArray *columnNames = [tableDataInstance columnNames]; + BOOL hasGeometryFields = NO; if (([prefs boolForKey:SPLoadBlobsAsNeeded]) && ([dataColumns count] > 0)) { - NSArray *columnNames = [tableDataInstance columnNames]; - for (i = 0 ; i < [columnNames count]; i++) { if (![tableDataInstance columnIsBlobOrText:[NSArrayObjectAtIndex(dataColumns, i) objectForKey:@"name"]] ) { - [fields addObject:[NSArrayObjectAtIndex(columnNames, i) backtickQuotedString]]; + if([tableDataInstance columnIsGeometry:[NSArrayObjectAtIndex(dataColumns, i) objectForKey:@"name"]]) + [fields addObject:[NSString stringWithFormat:@"AsText(%@)", [NSArrayObjectAtIndex(columnNames, i) backtickQuotedString]]]; + else + [fields addObject:[NSArrayObjectAtIndex(columnNames, i) backtickQuotedString]]; } else { // For blob/text fields, select a null placeholder so the column count is still correct @@ -2729,9 +2738,22 @@ } return [fields componentsJoinedByString:@","]; - } - else { - return @"*"; + } else { + + for (i = 0 ; i < [columnNames count]; i++) + { + if([tableDataInstance columnIsGeometry:[NSArrayObjectAtIndex(dataColumns, i) objectForKey:@"name"]]) { + [fields addObject:[NSString stringWithFormat:@"AsText(%@)", [NSArrayObjectAtIndex(columnNames, i) backtickQuotedString]]]; + hasGeometryFields = YES; + } + else + [fields addObject:[NSArrayObjectAtIndex(columnNames, i) backtickQuotedString]]; + } + if(hasGeometryFields) + return [fields componentsJoinedByString:@","]; + else + return @"*"; + } } diff --git a/Source/SPTableData.h b/Source/SPTableData.h index ade1d30e..69a6ed2f 100644 --- a/Source/SPTableData.h +++ b/Source/SPTableData.h @@ -57,6 +57,7 @@ - (NSArray *) getConstraints; - (NSArray *) triggers; - (BOOL) columnIsBlobOrText:(NSString *)colName; +- (BOOL) columnIsGeometry:(NSString *)colName; - (NSString *) statusValueForKey:(NSString *)aKey; - (void)setStatusValue:(NSString *)value forKey:(NSString *)key; - (NSDictionary *) statusValues; diff --git a/Source/SPTableData.m b/Source/SPTableData.m index edff16b6..fc410044 100644 --- a/Source/SPTableData.m +++ b/Source/SPTableData.m @@ -258,6 +258,30 @@ return (BOOL) ([[[self columnWithName:colName] objectForKey:@"typegrouping"] isEqualToString:@"textdata" ] || [[[self columnWithName:colName] objectForKey:@"typegrouping"] isEqualToString:@"blobdata"]); } +/** + * Checks if this column is type geometry. + * Used to determine if we have to use AsText() in SELECT. + * + * @param colName The column name which should be checked. + */ + +- (BOOL) columnIsGeometry:(NSString *)colName +{ + + // Return if CREATE SYNTAX is being parsed + if(isWorking) return YES; // to be at the safe side + + if ([columns count] == 0) { + if ([tableListInstance tableType] == SPTableTypeView) { + [self updateInformationForCurrentView]; + } else { + [self updateInformationForCurrentTable]; + } + } + + return (BOOL) ([[[self columnWithName:colName] objectForKey:@"typegrouping"] isEqualToString:@"geometry"]); +} + /** * Retrieve the table status value for a supplied key, using or refreshing the cache as appropriate. @@ -1147,6 +1171,11 @@ } else if ([detailString isEqualToString:@"TINYTEXT"] || [detailString isEqualToString:@"TEXT"] || [detailString isEqualToString:@"MEDIUMTEXT"] || [detailString isEqualToString:@"LONGTEXT"]) { [fieldDetails setObject:@"textdata" forKey:@"typegrouping"]; + } else if ([detailString isEqualToString:@"POINT"] || [detailString isEqualToString:@"GEOMETRY"] + || [detailString isEqualToString:@"LINESTRING"] || [detailString isEqualToString:@"POLYGON"] + || [detailString isEqualToString:@"MULTIPOLYGON"] || [detailString isEqualToString:@"GEOMETRYCOLLECTION"] + || [detailString isEqualToString:@"MULTIPOINT"] || [detailString isEqualToString:@"MULTILINESTRING"]) { + [fieldDetails setObject:@"geometry" forKey:@"typegrouping"]; // Default to "blobdata". This means that future and currently unsupported types - including spatial extensions - // will be preserved unmangled. -- cgit v1.2.3