Nicer API.

-[executeCommand:parameters:] is now a variadic function instead of
taking an array as argument.

FossilOrigin-Name: d2fe40f16065b5ccf5ba135af1ec95f09ed2f8ee96e661a7a7d085da833e972e
This commit is contained in:
Jonathan Schleifer 2012-10-05 20:17:44 +00:00
parent f232e248cb
commit 6e1eda2f24
3 changed files with 18 additions and 10 deletions

View file

@ -20,6 +20,6 @@
- (void)reset; - (void)reset;
- (PGResult*)executeCommand: (OFString*)command; - (PGResult*)executeCommand: (OFString*)command;
- (PGResult*)executeCommand: (OFString*)command - (PGResult*)executeCommand: (OFString*)command
parameters: (OFArray*)parameters; parameters: (id)firstParameter, ...;
- (PGconn*)PG_connection; - (PGconn*)PG_connection;
@end @end

View file

@ -78,28 +78,33 @@
} }
- (PGResult*)executeCommand: (OFString*)command - (PGResult*)executeCommand: (OFString*)command
parameters: (OFArray*)parameters_ parameters: (id)parameter, ...
{ {
OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init]; OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init];
PGresult *result; PGresult *result;
const char **values; const char **values;
va_list args, args2;
size_t argsCount;
va_start(args, parameter);
va_copy(args2, args);
for (argsCount = 1; va_arg(args2, id) != nil; argsCount++);
values = [self allocMemoryWithSize: sizeof(*values) values = [self allocMemoryWithSize: sizeof(*values)
count: [parameters_ count]]; count: argsCount];
@try { @try {
OFEnumerator *enumerator = [parameters_ objectEnumerator];
size_t i = 0; size_t i = 0;
id parameter;
while ((parameter = [enumerator nextObject]) != nil) { do {
if ([parameter isKindOfClass: [OFNull class]]) if ([parameter isKindOfClass: [OFNull class]])
values[i++] = NULL; values[i++] = NULL;
else else
values[i++] = [parameter UTF8String]; values[i++] = [parameter UTF8String];
} } while ((parameter = va_arg(args, id)) != nil);
result = PQexecParams(conn, [command UTF8String], result = PQexecParams(conn, [command UTF8String],
[parameters_ count], NULL, values, NULL, NULL, 0); argsCount, NULL, values, NULL, NULL, 0);
} @finally { } @finally {
[self freeMemory: values]; [self freeMemory: values];
} }

7
test.m
View file

@ -30,15 +30,18 @@ OF_APPLICATION_DELEGATE(Test)
@")"]; @")"];
[connection executeCommand: @"INSERT INTO test (id, name, content) " [connection executeCommand: @"INSERT INTO test (id, name, content) "
@"VALUES($1, $2, $3)" @"VALUES($1, $2, $3)"
parameters: @[@"1", @"foo", @"Hallo Welt!"]]; parameters: @"1", @"foo", @"Hallo Welt!", nil];
[connection executeCommand: @"INSERT INTO test (id, content) " [connection executeCommand: @"INSERT INTO test (id, content) "
@"VALUES($1, $2)" @"VALUES($1, $2)"
parameters: @[@"2", @"Blup!!"]]; parameters: @"2", @"Blup!!", nil];
result = [connection executeCommand: @"SELECT * FROM test"]; result = [connection executeCommand: @"SELECT * FROM test"];
of_log(@"%@", result); of_log(@"%@", result);
of_log(@"JSON: %@", [result JSONRepresentation]); of_log(@"JSON: %@", [result JSONRepresentation]);
result = [connection executeCommand: @"SELECT COUNT(*) FROM test"];
of_log(@"%@", result);
[OFApplication terminate]; [OFApplication terminate];
} }
@end @end