aboutsummaryrefslogtreecommitdiffstats
path: root/Frameworks/PostgresKit/Source
diff options
context:
space:
mode:
authorstuconnolly <stuart02@gmail.com>2012-09-27 22:49:52 +0000
committerstuconnolly <stuart02@gmail.com>2012-09-27 22:49:52 +0000
commit901180573c489a08ac4f22a05c0a80bc51307d5f (patch)
tree27f7cac294c36bbe3b6900a003aea95d777462e6 /Frameworks/PostgresKit/Source
parenta12ab1dd775188342087b848653565d227dd8ecb (diff)
downloadsequelpro-901180573c489a08ac4f22a05c0a80bc51307d5f.tar.gz
sequelpro-901180573c489a08ac4f22a05c0a80bc51307d5f.tar.bz2
sequelpro-901180573c489a08ac4f22a05c0a80bc51307d5f.zip
Add a binary data handler.
Diffstat (limited to 'Frameworks/PostgresKit/Source')
-rw-r--r--Frameworks/PostgresKit/Source/PGConstants.h1
-rw-r--r--Frameworks/PostgresKit/Source/PGConstants.m1
-rw-r--r--Frameworks/PostgresKit/Source/PGPostgresConnectionTypeHandling.m2
-rw-r--r--Frameworks/PostgresKit/Source/PGPostgresTypeBinaryHandler.h63
-rw-r--r--Frameworks/PostgresKit/Source/PGPostgresTypeBinaryHandler.m103
5 files changed, 170 insertions, 0 deletions
diff --git a/Frameworks/PostgresKit/Source/PGConstants.h b/Frameworks/PostgresKit/Source/PGConstants.h
index d8ac3641..fc0e081c 100644
--- a/Frameworks/PostgresKit/Source/PGConstants.h
+++ b/Frameworks/PostgresKit/Source/PGConstants.h
@@ -53,6 +53,7 @@ extern const char *PGPostgresResultValueInt4;
extern const char *PGPostgresResultValueInt8;
extern const char *PGPostgresResultValueFloat4;
extern const char *PGPostgresResultValueFloat8;
+extern const char *PGPostgresResultValueByteA;
// Connection parameters
extern const char *PGPostgresKitApplicationName;
diff --git a/Frameworks/PostgresKit/Source/PGConstants.m b/Frameworks/PostgresKit/Source/PGConstants.m
index 169dd85c..4cac546e 100644
--- a/Frameworks/PostgresKit/Source/PGConstants.m
+++ b/Frameworks/PostgresKit/Source/PGConstants.m
@@ -53,6 +53,7 @@ const char *PGPostgresResultValueInt4 = "%int4";
const char *PGPostgresResultValueInt8 = "%int8";
const char *PGPostgresResultValueFloat4 = "%float4";
const char *PGPostgresResultValueFloat8 = "%float8";
+const char *PGPostgresResultValueByteA = "%bytea";
// Connection parameters
const char *PGPostgresKitApplicationName = "PostgresKit";
diff --git a/Frameworks/PostgresKit/Source/PGPostgresConnectionTypeHandling.m b/Frameworks/PostgresKit/Source/PGPostgresConnectionTypeHandling.m
index ddd6e745..22394d88 100644
--- a/Frameworks/PostgresKit/Source/PGPostgresConnectionTypeHandling.m
+++ b/Frameworks/PostgresKit/Source/PGPostgresConnectionTypeHandling.m
@@ -23,6 +23,7 @@
#import "PGPostgresTypeStringHandler.h"
#import "PGPostgresTypeNumberHandler.h"
#import "PGPostgresTypeDateTimeHandler.h"
+#import "PGPostgresTypeBinaryHandler.h"
#import "PGPostgresException.h"
@implementation PGPostgresConnection (PGPostgresConnectionTypeHandling)
@@ -41,6 +42,7 @@
[self registerTypeHandler:[PGPostgresTypeStringHandler class]];
[self registerTypeHandler:[PGPostgresTypeNumberHandler class]];
[self registerTypeHandler:[PGPostgresTypeDateTimeHandler class]];
+ [self registerTypeHandler:[PGPostgresTypeBinaryHandler class]];
}
/**
diff --git a/Frameworks/PostgresKit/Source/PGPostgresTypeBinaryHandler.h b/Frameworks/PostgresKit/Source/PGPostgresTypeBinaryHandler.h
new file mode 100644
index 00000000..067c0d8c
--- /dev/null
+++ b/Frameworks/PostgresKit/Source/PGPostgresTypeBinaryHandler.h
@@ -0,0 +1,63 @@
+//
+// $Id$
+//
+// PGPostgresTypeBinaryHandler.h
+// PostgresKit
+//
+// Created by Stuart Connolly (stuconnolly.com) on September 28, 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 "PGPostgresTypeHandler.h"
+
+@interface PGPostgresTypeBinaryHandler : PGPostgresTypeHandler <PGPostgresTypeHandlerProtocol>
+{
+ NSUInteger _row;
+ NSUInteger _column;
+
+ const PGresult *_result;
+
+ PGPostgresOid _type;
+}
+
+/**
+ * @property The row within the result the handler is being queried about.
+ */
+@property (readwrite, assign) NSUInteger row;
+
+/**
+ * @property The column within the result the handler is being queried about.
+ */
+@property (readwrite, assign) NSUInteger column;
+
+/**
+ * @property The type of data within the result the handler is being queried about.
+ */
+@property (readwrite, assign) PGPostgresOid type;
+
+/**
+ * @property The result the handler is being asked to operate on.
+ */
+@property (readwrite, assign) const PGresult *result;
+
+@end
diff --git a/Frameworks/PostgresKit/Source/PGPostgresTypeBinaryHandler.m b/Frameworks/PostgresKit/Source/PGPostgresTypeBinaryHandler.m
new file mode 100644
index 00000000..f544fb39
--- /dev/null
+++ b/Frameworks/PostgresKit/Source/PGPostgresTypeBinaryHandler.m
@@ -0,0 +1,103 @@
+//
+// $Id$
+//
+// PGPostgresTypeBinaryHandler.m
+// PostgresKit
+//
+// Created by Stuart Connolly (stuconnolly.com) on September 28, 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 "PGPostgresTypeBinaryHandler.h"
+
+static PGPostgresOid PGPostgresTypeBinaryTypes[] =
+{
+ PGPostgresOidByteData,
+ 0
+};
+
+@interface PGPostgresTypeBinaryHandler ()
+
+- (id)_binaryDataFromResult;
+
+@end
+
+
+@implementation PGPostgresTypeBinaryHandler
+
+@synthesize row = _row;
+@synthesize type = _type;
+@synthesize column = _column;
+@synthesize result = _result;
+
+#pragma mark -
+#pragma mark Protocol Implementation
+
+- (PGPostgresOid *)remoteTypes
+{
+ return PGPostgresTypeBinaryTypes;
+}
+
+- (Class)nativeClass
+{
+ return [NSString class];
+}
+
+- (NSArray *)classAliases
+{
+ return nil;
+}
+
+- (id)objectFromResult
+{
+ if (!_result || !_type) return [NSNull null];
+
+ switch (_type)
+ {
+ case PGPostgresOidByteData:
+ return [self _binaryDataFromResult];
+ }
+
+ return [NSNull null];
+}
+
+#pragma mark -
+#pragma mark Private API
+
+/**
+ * Converts a binary data value to an NSData instance.
+ *
+ * @return The NSData representation of the data.
+ */
+- (id)_binaryDataFromResult
+{
+ PGbytea data;
+
+ if (!PQgetf(_result, _row, PGPostgresResultValueByteA, _column)) return [NSNull null];
+
+ if (!data.data || !data.len) return [NSNull null];
+
+ return [NSData dataWithBytes:data.data length:data.len];
+}
+
+@end