aboutsummaryrefslogtreecommitdiffstats
path: root/Frameworks/PostgresKit/Source/PGPostgresConnectionQueryPreparation.m
diff options
context:
space:
mode:
Diffstat (limited to 'Frameworks/PostgresKit/Source/PGPostgresConnectionQueryPreparation.m')
-rw-r--r--Frameworks/PostgresKit/Source/PGPostgresConnectionQueryPreparation.m108
1 files changed, 108 insertions, 0 deletions
diff --git a/Frameworks/PostgresKit/Source/PGPostgresConnectionQueryPreparation.m b/Frameworks/PostgresKit/Source/PGPostgresConnectionQueryPreparation.m
new file mode 100644
index 00000000..f773da42
--- /dev/null
+++ b/Frameworks/PostgresKit/Source/PGPostgresConnectionQueryPreparation.m
@@ -0,0 +1,108 @@
+//
+// $Id: PGPostgresConnectionQueryPreparation.m 3848 2012-09-12 12:19:31Z stuart02 $
+//
+// PGPostgresConnectionQueryPreparation.m
+// PostgresKit
+//
+// Copyright (c) 2008-2009 David Thorpe, djt@mutablelogic.com
+//
+// Forked by the Sequel Pro Team on July 22, 2012.
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not
+// use this file except in compliance with the License. You may obtain a copy of
+// the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+// License for the specific language governing permissions and limitations under
+// the License.
+
+#import "PGPostgresConnectionQueryPreparation.h"
+#import "PGPostgresConnectionTypeHandling.h"
+#import "PGPostgresKitPrivateAPI.h"
+#import "PGPostgresStatement.h"
+#import "PGPostgresException.h"
+
+@implementation PGPostgresConnection (PGPostgresConnectionQueryPreparation)
+
+/**
+ * Creates a prepared statment from the supplied query.
+ *
+ * @param query The query to create the statement from.
+ *
+ * @return The prepared statement instance.
+ */
+- (PGPostgresStatement *)prepare:(NSString *)query
+{
+ if (!query || ![query length]) return nil;
+
+ return [[[PGPostgresStatement alloc] initWithStatement:query] autorelease];
+}
+
+/**
+ * Creates a prepared statment from the supplied query format and values.
+ *
+ * @param query The query to create the statement from.
+ * @param ... Any values to insert into the query (optional).
+ *
+ * @return The prepared statement instance.
+ */
+- (PGPostgresStatement *)prepareWithFormat:(NSString *)query, ...
+{
+ if (!query || ![query length]) return nil;
+
+ va_list args;
+ va_start(args, query);
+
+ NSMutableString *string = [[NSMutableString alloc] initWithFormat:query arguments:args];
+
+ va_end(args);
+
+ PGPostgresStatement *statement = [self prepare:string];
+
+ [string release];
+
+ return statement;
+}
+
+#pragma mark -
+#pragma mark Private API
+
+/**
+ * Actually prepares the supplied statement against the database.
+ *
+ * @param statement The statement to prepare.
+ * @param paranNum The number of parameters the statement contains.
+ * @param paramTypes Any of Postgres parameter types.
+ *
+ * @return A BOOL indicating succes. Returns NO if there's no statement, statement name or current connection.
+ */
+- (BOOL)_prepare:(PGPostgresStatement *)statement num:(NSInteger)paramNum types:(PGPostgresOid *)paramTypes
+{
+ if (!statement || ![statement name] || ![self isConnected]) return NO;
+
+ NSString *name = [[NSProcessInfo processInfo] globallyUniqueString];
+
+ PGresult *result = PQprepare(_connection, [name UTF8String], [statement UTF8Statement], (int)paramNum, paramTypes);
+
+ if (!result) return NO;
+
+ ExecStatusType resultStatus = PQresultStatus(result);
+
+ if (resultStatus == PGRES_BAD_RESPONSE || resultStatus == PGRES_FATAL_ERROR) {
+ PQclear(result);
+
+ return NO;
+ }
+
+ PQclear(result);
+
+ [statement setName:name];
+
+ return YES;
+}
+
+@end