Add -[insertRows:intoTable:].
FossilOrigin-Name: 7b335b3af81d4506f2842748671541073f4c455b4a0ce8a108eab0d43280f3ad
This commit is contained in:
parent
f9be9ea547
commit
728b3d1e2a
4 changed files with 97 additions and 4 deletions
|
@ -21,7 +21,7 @@
|
||||||
4BCC7456161F82820074ED30 /* PGConnectionFailedException.m in Sources */ = {isa = PBXBuildFile; fileRef = 4BCC7450161F82820074ED30 /* PGConnectionFailedException.m */; };
|
4BCC7456161F82820074ED30 /* PGConnectionFailedException.m in Sources */ = {isa = PBXBuildFile; fileRef = 4BCC7450161F82820074ED30 /* PGConnectionFailedException.m */; };
|
||||||
4BCC7457161F82820074ED30 /* PGException.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BCC7451161F82820074ED30 /* PGException.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
4BCC7457161F82820074ED30 /* PGException.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BCC7451161F82820074ED30 /* PGException.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||||
4BCC7458161F82820074ED30 /* PGException.m in Sources */ = {isa = PBXBuildFile; fileRef = 4BCC7452161F82820074ED30 /* PGException.m */; };
|
4BCC7458161F82820074ED30 /* PGException.m in Sources */ = {isa = PBXBuildFile; fileRef = 4BCC7452161F82820074ED30 /* PGException.m */; };
|
||||||
4BCC7460161F842F0074ED30 /* libpq.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 4BCC745F161F842F0074ED30 /* libpq.dylib */; };
|
4BCC74B0162036A70074ED30 /* libpq.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 4BCC74AF162036A70074ED30 /* libpq.dylib */; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
|
@ -40,8 +40,8 @@
|
||||||
4BCC7450161F82820074ED30 /* PGConnectionFailedException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PGConnectionFailedException.m; path = exceptions/PGConnectionFailedException.m; sourceTree = SOURCE_ROOT; };
|
4BCC7450161F82820074ED30 /* PGConnectionFailedException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PGConnectionFailedException.m; path = exceptions/PGConnectionFailedException.m; sourceTree = SOURCE_ROOT; };
|
||||||
4BCC7451161F82820074ED30 /* PGException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PGException.h; path = exceptions/PGException.h; sourceTree = SOURCE_ROOT; };
|
4BCC7451161F82820074ED30 /* PGException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PGException.h; path = exceptions/PGException.h; sourceTree = SOURCE_ROOT; };
|
||||||
4BCC7452161F82820074ED30 /* PGException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PGException.m; path = exceptions/PGException.m; sourceTree = SOURCE_ROOT; };
|
4BCC7452161F82820074ED30 /* PGException.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = PGException.m; path = exceptions/PGException.m; sourceTree = SOURCE_ROOT; };
|
||||||
4BCC745F161F842F0074ED30 /* libpq.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libpq.dylib; path = usr/lib/libpq.dylib; sourceTree = SDKROOT; };
|
|
||||||
4BCC7464161F85DF0074ED30 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };
|
4BCC7464161F85DF0074ED30 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = SOURCE_ROOT; };
|
||||||
|
4BCC74AF162036A70074ED30 /* libpq.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libpq.dylib; path = /usr/local/lib/libpq.dylib; sourceTree = "<absolute>"; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
|
@ -49,8 +49,8 @@
|
||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
4BCC74B0162036A70074ED30 /* libpq.dylib in Frameworks */,
|
||||||
4BCC743D161F82000074ED30 /* ObjFW.framework in Frameworks */,
|
4BCC743D161F82000074ED30 /* ObjFW.framework in Frameworks */,
|
||||||
4BCC7460161F842F0074ED30 /* libpq.dylib in Frameworks */,
|
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
@ -115,7 +115,7 @@
|
||||||
4BCC7461161F843F0074ED30 /* Libraries */ = {
|
4BCC7461161F843F0074ED30 /* Libraries */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
4BCC745F161F842F0074ED30 /* libpq.dylib */,
|
4BCC74AF162036A70074ED30 /* libpq.dylib */,
|
||||||
);
|
);
|
||||||
name = Libraries;
|
name = Libraries;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
|
@ -281,6 +281,10 @@
|
||||||
FRAMEWORK_VERSION = A;
|
FRAMEWORK_VERSION = A;
|
||||||
GCC_PRECOMPILE_PREFIX_HEADER = NO;
|
GCC_PRECOMPILE_PREFIX_HEADER = NO;
|
||||||
INFOPLIST_FILE = Info.plist;
|
INFOPLIST_FILE = Info.plist;
|
||||||
|
LIBRARY_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
/usr/local/lib,
|
||||||
|
);
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
WRAPPER_EXTENSION = framework;
|
WRAPPER_EXTENSION = framework;
|
||||||
};
|
};
|
||||||
|
@ -295,6 +299,10 @@
|
||||||
FRAMEWORK_VERSION = A;
|
FRAMEWORK_VERSION = A;
|
||||||
GCC_PRECOMPILE_PREFIX_HEADER = NO;
|
GCC_PRECOMPILE_PREFIX_HEADER = NO;
|
||||||
INFOPLIST_FILE = Info.plist;
|
INFOPLIST_FILE = Info.plist;
|
||||||
|
LIBRARY_SEARCH_PATHS = (
|
||||||
|
"$(inherited)",
|
||||||
|
/usr/local/lib,
|
||||||
|
);
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
WRAPPER_EXTENSION = framework;
|
WRAPPER_EXTENSION = framework;
|
||||||
};
|
};
|
||||||
|
|
|
@ -22,4 +22,8 @@
|
||||||
- (PGResult*)executeCommand: (OFString*)command
|
- (PGResult*)executeCommand: (OFString*)command
|
||||||
parameters: (id)firstParameter, ...;
|
parameters: (id)firstParameter, ...;
|
||||||
- (PGconn*)PG_connection;
|
- (PGconn*)PG_connection;
|
||||||
|
- (void)insertRow: (OFDictionary*)row
|
||||||
|
intoTable: (OFString*)table;
|
||||||
|
- (void)insertRows: (OFArray*)rows
|
||||||
|
intoTable: (OFString*)table;
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -126,6 +126,85 @@
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)insertRow: (OFDictionary*)row
|
||||||
|
intoTable: (OFString*)table
|
||||||
|
{
|
||||||
|
OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init];
|
||||||
|
OFMutableString *command;
|
||||||
|
OFEnumerator *enumerator;
|
||||||
|
const char **values;
|
||||||
|
PGresult *result;
|
||||||
|
OFString *key, *value;
|
||||||
|
size_t i, count;
|
||||||
|
|
||||||
|
command = [OFMutableString stringWithString: @"INSERT INTO "];
|
||||||
|
[command appendString: table];
|
||||||
|
[command appendString: @" ("];
|
||||||
|
|
||||||
|
count = [row count];
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
enumerator = [row keyEnumerator];
|
||||||
|
while ((key = [enumerator nextObject]) != nil) {
|
||||||
|
if (i > 0)
|
||||||
|
[command appendString: @", "];
|
||||||
|
|
||||||
|
[command appendString: key];
|
||||||
|
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
[command appendString: @") VALUES ("];
|
||||||
|
|
||||||
|
values = [self allocMemoryWithSize: sizeof(*values)
|
||||||
|
count: count];
|
||||||
|
@try {
|
||||||
|
i = 0;
|
||||||
|
enumerator = [row objectEnumerator];
|
||||||
|
while ((value = [enumerator nextObject]) != nil) {
|
||||||
|
if (i > 0)
|
||||||
|
[command appendString: @", "];
|
||||||
|
|
||||||
|
values[i] = [value UTF8String];
|
||||||
|
|
||||||
|
[command appendFormat: @"$%zd", ++i];
|
||||||
|
}
|
||||||
|
|
||||||
|
[command appendString: @")"];
|
||||||
|
|
||||||
|
result = PQexecParams(conn, [command UTF8String], (int)count,
|
||||||
|
NULL, values, NULL, NULL, 0);
|
||||||
|
} @finally {
|
||||||
|
[self freeMemory: values];
|
||||||
|
}
|
||||||
|
|
||||||
|
[pool release];
|
||||||
|
|
||||||
|
if (PQresultStatus(result) != PGRES_COMMAND_OK) {
|
||||||
|
PQclear(result);
|
||||||
|
@throw [PGCommandFailedException
|
||||||
|
exceptionWithClass: [self class]
|
||||||
|
connection: self
|
||||||
|
command: command];
|
||||||
|
}
|
||||||
|
|
||||||
|
PQclear(result);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)insertRows: (OFArray*)rows
|
||||||
|
intoTable: (OFString*)table
|
||||||
|
{
|
||||||
|
OFAutoreleasePool *pool = [[OFAutoreleasePool alloc] init];
|
||||||
|
OFEnumerator *enumerator = [rows objectEnumerator];
|
||||||
|
OFDictionary *row;
|
||||||
|
|
||||||
|
while ((row = [enumerator nextObject]) != nil)
|
||||||
|
[self insertRow: row
|
||||||
|
intoTable: table];
|
||||||
|
|
||||||
|
[pool release];
|
||||||
|
}
|
||||||
|
|
||||||
- (PGconn*)PG_connection
|
- (PGconn*)PG_connection
|
||||||
{
|
{
|
||||||
return conn;
|
return conn;
|
||||||
|
|
2
test.m
2
test.m
|
@ -34,6 +34,8 @@ OF_APPLICATION_DELEGATE(Test)
|
||||||
[connection executeCommand: @"INSERT INTO test (id, content) "
|
[connection executeCommand: @"INSERT INTO test (id, content) "
|
||||||
@"VALUES($1, $2)"
|
@"VALUES($1, $2)"
|
||||||
parameters: @"2", @"Blup!!", nil];
|
parameters: @"2", @"Blup!!", nil];
|
||||||
|
[connection insertRow: @{ @"content": @"Hallo!", @"name": @"foo" }
|
||||||
|
intoTable: @"test"];
|
||||||
|
|
||||||
result = [connection executeCommand: @"SELECT * FROM test"];
|
result = [connection executeCommand: @"SELECT * FROM test"];
|
||||||
of_log(@"%@", result);
|
of_log(@"%@", result);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue