+- (NSString *)generateSQLForUpdate {
+ NSMutableString *sql;
+ unsigned i, count;
+
+ if ([self->values count] == 0)
+ return nil;
+
+ sql = [NSMutableString stringWithCapacity:2048];
+
+ [sql appendString:@"UPDATE "];
+ [sql appendString:[[self tableURL] gcsTableName]];
+ [sql appendString:@" SET "];
+
+ for (i = 0, count = [self->fieldNames count]; i < count; i++) {
+ EOAttribute *attr;
+ NSString *name;
+ id value;
+
+ name = [self->fieldNames objectAtIndex:i];
+ value = [self->values objectForKey:name];
+ attr = [self->attributes objectForKey:name];
+
+ if (i != 0) [sql appendString:@", "];
+ [sql appendString:[attr columnName]];
+
+ if ([value isNotNull]) {
+ /* a rather limited set of supported value types */
+
+ if ([[attr externalType] hasPrefix:@"int"])
+ [sql appendFormat:@" = %i", [value intValue]];
+ else {
+ // TODO: any other escaping?! move to adaptor?
+ value = [value stringValue];
+ value = [value stringByReplacingString:@"'" withString:@"''"];
+ [sql appendString:@" = '"];
+ [sql appendString:value];
+ [sql appendString:@"'"];
+ }
+ }
+ else
+ [sql appendString:@" = NULL"];
+ }
+
+ [sql appendString:@" WHERE "];
+ [sql appendString:uidColumnName];
+ [sql appendString:@" = '"];
+ [sql appendString:[self uid]];
+ [sql appendString:@"'"];
+ return sql;
+}
+
+- (BOOL)primaryStoreProfile {
+ GCSChannelManager *cm;
+ EOAdaptorChannel *channel;
+ NSException *ex;
+ NSString *sql;
+
+ cm = [GCSChannelManager defaultChannelManager];
+ if ((channel = [cm acquireOpenChannelForURL:[self tableURL]]) == nil) {
+ [self errorWithFormat:@"failed to acquire channel for URL: %@",
+ [self tableURL]];
+ return NO;
+ }
+
+ /* run SQL */
+
+ sql = [self generateSQLForUpdate];
+ if ((ex = [channel evaluateExpressionX:sql]) != nil) {
+ [self errorWithFormat:@"could not run SQL '%@': %@", sql, ex];
+ [cm releaseChannel:channel];
+ return NO;
+ }
+
+ /* commit */
+
+ ex = nil;
+ if ([[channel adaptorContext] hasOpenTransaction])
+ ex = [channel evaluateExpressionX:@"COMMIT TRANSACTION"];
+
+ [cm releaseChannel:channel];
+
+ if (ex != nil) {
+ [self errorWithFormat:@"could not commit transaction for update: %@", ex];
+ return NO;
+ }
+
+ self->defFlags.modified = 0;
+ return YES;
+}
+
+