aboutsummaryrefslogtreecommitdiffstats
path: root/Frameworks/PostgresKit/Source/FLXPostgresError.m
diff options
context:
space:
mode:
authorstuconnolly <stuart02@gmail.com>2012-09-03 10:22:17 +0000
committerstuconnolly <stuart02@gmail.com>2012-09-03 10:22:17 +0000
commite124a1d0fb576c311a6ac601b1c08e6ce51bcd30 (patch)
tree5a3350fc75bcad1f5c8d07f8a66ea53b0a07805f /Frameworks/PostgresKit/Source/FLXPostgresError.m
parentd4e8474b3437771fd6891def8324981d82186a88 (diff)
downloadsequelpro-e124a1d0fb576c311a6ac601b1c08e6ce51bcd30.tar.gz
sequelpro-e124a1d0fb576c311a6ac601b1c08e6ce51bcd30.tar.bz2
sequelpro-e124a1d0fb576c311a6ac601b1c08e6ce51bcd30.zip
Initial commit of PostgresKit, our new Postgres framework as a start towards adding PostgreSQL support to Sequel Pro.
Note, that the framerwork is by no means feature complete and in it's current state has quite a few limitations: - No support for Postgres' asynchronous query API - Only supports the very basic data types (char/text and numerics) - No support (outide of libpq) for re-establishing dropped connections Current feature support includes: - Basic connection handling - Query execution - Prepared statement execution - Encoding support similar to SPMySQL's
Diffstat (limited to 'Frameworks/PostgresKit/Source/FLXPostgresError.m')
-rw-r--r--Frameworks/PostgresKit/Source/FLXPostgresError.m136
1 files changed, 136 insertions, 0 deletions
diff --git a/Frameworks/PostgresKit/Source/FLXPostgresError.m b/Frameworks/PostgresKit/Source/FLXPostgresError.m
new file mode 100644
index 00000000..6a0a6210
--- /dev/null
+++ b/Frameworks/PostgresKit/Source/FLXPostgresError.m
@@ -0,0 +1,136 @@
+//
+// $Id$
+//
+// FLXPostgresError.m
+// PostgresKit
+//
+// Created by Stuart Connolly (stuconnolly.com) on September 3, 2012.
+// Copyright (c) 2012 Stuart Connolly. All rights reserved.
+//
+// Permission is hereby granted, free of charge, to any person
+// obtaining a copy of this software and associated documentation
+// files (the "Software"), to deal in the Software without
+// restriction, including without limitation the rights to use,
+// copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following
+// conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+// OTHER DEALINGS IN THE SOFTWARE.
+
+#import "FLXPostgresError.h"
+#import "FLXPostgresException.h"
+
+@interface FLXPostgresError ()
+
+- (void)_extractErrorDetailsFromResult:(PGresult *)result;
+- (NSString *)_extractErrorField:(int)field fromResult:(PGresult *)result;
+
+@end
+
+@implementation FLXPostgresError
+
+@synthesize errorSeverity = _errorSeverity;
+@synthesize errorStateCode = _errorStateCode;
+@synthesize errorPrimaryMessage = _errorPrimaryMessage;
+@synthesize errorDetailMessage = _errorDetailMessage;
+@synthesize errorMessageHint = _errorMessageHint;
+@synthesize errorStatementPosition = _errorStatementPosition;
+
+#pragma mark -
+
+- (id)init
+{
+ [FLXPostgresException raise:NSInternalInconsistencyException
+ reason:@"%@ shouldn't be init'd directly; use initWithResult: instead.", [self className]];
+
+ return nil;
+}
+
+- (id)initWithResult:(PGresult *)result
+{
+ if ((self = [super init])) {
+
+ _errorSeverity = nil;
+ _errorStateCode = nil;
+ _errorPrimaryMessage = nil;
+ _errorDetailMessage = nil;
+ _errorMessageHint = nil;
+ _errorStatementPosition = -1;
+
+ if (result) [self _extractErrorDetailsFromResult:result];
+ }
+
+ return self;
+}
+
+- (NSString *)description
+{
+ return [NSString stringWithFormat:@"<%@: Sev %@ (%@): %@>", [self className], _errorSeverity, _errorStateCode, _errorPrimaryMessage];
+}
+
+#pragma mark -
+#pragma mark Private API
+
+/**
+ * Extracts all the error information from the supplied result.
+ *
+ * @param result The Postgres result to extract the information from.
+ */
+- (void)_extractErrorDetailsFromResult:(PGresult *)result
+{
+ // Note that we don't expose all the fields that are available.
+ // The ones we don't mostly include information internal to Postgres
+ // that generally isn't useful to end users.
+ _errorSeverity = [self _extractErrorField:PG_DIAG_SEVERITY fromResult:result];
+ _errorStateCode = [self _extractErrorField:PG_DIAG_SQLSTATE fromResult:result];
+ _errorPrimaryMessage = [self _extractErrorField:PG_DIAG_MESSAGE_PRIMARY fromResult:result];
+ _errorDetailMessage = [self _extractErrorField:PG_DIAG_MESSAGE_DETAIL fromResult:result];
+ _errorMessageHint = [self _extractErrorField:PG_DIAG_MESSAGE_HINT fromResult:result];
+
+ NSString *statementPosition = [self _extractErrorField:PG_DIAG_STATEMENT_POSITION fromResult:result];
+
+ _errorStatementPosition = [statementPosition integerValue];
+
+ [statementPosition release];
+}
+
+/**
+ * Extracts the supplied error field from the supplied Postgres result.
+ *
+ * @param field The error field to extract.
+ * @param result The Postgres result to extract the field from.
+ *
+ * @return A string representing the error value. The caller is responsible for freeing the associated memory.
+ */
+- (NSString *)_extractErrorField:(int)field fromResult:(PGresult *)result
+{
+ const char *errorData = PQresultErrorField(result, field);
+
+ return [[NSString alloc] initWithBytes:errorData length:strlen(errorData) encoding:NSUTF8StringEncoding];
+}
+
+#pragma mark -
+
+- (void)dealloc
+{
+ if (_errorSeverity) [_errorSeverity release], _errorSeverity = nil;
+ if (_errorStateCode) [_errorStateCode release], _errorStateCode = nil;
+ if (_errorPrimaryMessage) [_errorPrimaryMessage release], _errorPrimaryMessage = nil;
+ if (_errorDetailMessage) [_errorDetailMessage release], _errorDetailMessage = nil;
+ if (_errorMessageHint) [_errorMessageHint release], _errorMessageHint = nil;
+
+ [super dealloc];
+}
+
+@end