diff options
6 files changed, 188 insertions, 2 deletions
diff --git a/Frameworks/PostgresKit/PostgresKit.xcodeproj/project.pbxproj b/Frameworks/PostgresKit/PostgresKit.xcodeproj/project.pbxproj index c3928a59..ad2a51ee 100644 --- a/Frameworks/PostgresKit/PostgresKit.xcodeproj/project.pbxproj +++ b/Frameworks/PostgresKit/PostgresKit.xcodeproj/project.pbxproj @@ -56,6 +56,8 @@ 177C9BAB15CD37E000128642 /* PGPostgresConnectionEncoding.h in Headers */ = {isa = PBXBuildFile; fileRef = 177C9BA915CD37E000128642 /* PGPostgresConnectionEncoding.h */; }; 177C9BAC15CD37E000128642 /* PGPostgresConnectionEncoding.m in Sources */ = {isa = PBXBuildFile; fileRef = 177C9BAA15CD37E000128642 /* PGPostgresConnectionEncoding.m */; }; 17E595F214F3058F0054EE08 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 17E595F114F3058F0054EE08 /* Foundation.framework */; }; + 17F7963116150C0100E21D82 /* PGPostgresTypeBinaryHandler.h in Headers */ = {isa = PBXBuildFile; fileRef = 17F7962F16150C0100E21D82 /* PGPostgresTypeBinaryHandler.h */; }; + 17F7963216150C0100E21D82 /* PGPostgresTypeBinaryHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = 17F7963016150C0100E21D82 /* PGPostgresTypeBinaryHandler.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -124,6 +126,8 @@ 177C9BAA15CD37E000128642 /* PGPostgresConnectionEncoding.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PGPostgresConnectionEncoding.m; sourceTree = "<group>"; }; 17E595F114F3058F0054EE08 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 17F5B77C15C9D092006DA689 /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README; sourceTree = "<group>"; }; + 17F7962F16150C0100E21D82 /* PGPostgresTypeBinaryHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PGPostgresTypeBinaryHandler.h; sourceTree = "<group>"; }; + 17F7963016150C0100E21D82 /* PGPostgresTypeBinaryHandler.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PGPostgresTypeBinaryHandler.m; sourceTree = "<group>"; }; 8DC2EF5A0486A6940098B216 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = Resources/Info.plist; sourceTree = "<group>"; }; 8DC2EF5B0486A6940098B216 /* PostgresKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = PostgresKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ @@ -304,6 +308,7 @@ 173D4E9F15BAB2A80007F267 /* PostgresKit.h */, 177AC67D15C53FA400A3658D /* PGPostgresKitPrivateAPI.h */, 1731F52B15F48B4400D973EB /* Domain */, + 17F7962A1615001D00E21D82 /* Protocols */, 173D513315BBE4230007F267 /* Connection */, 173D508D15BBD99B0007F267 /* Constants */, 173D4E5015BAB17A0007F267 /* Types */, @@ -315,7 +320,6 @@ isa = PBXGroup; children = ( 173D4F5615BAD3030007F267 /* PGPostgresTypes.h */, - 173D4EA015BAB2A80007F267 /* PGPostgresTypeHandlerProtocol.h */, 1724CC8715FB4BF400AB2291 /* Domain */, 17F5B62215C7D1DA006DA689 /* Handlers */, ); @@ -362,7 +366,6 @@ children = ( 173D4E9515BAB2A80007F267 /* PGPostgresConnection.h */, 173D4E9615BAB2A80007F267 /* PGPostgresConnection.m */, - 173D513415BBE50D0007F267 /* PGPostgresConnectionDelegate.h */, 1731F50515F369FE00D973EB /* Encoding */, 1731F50415F369E400D973EB /* Query */, 1731F50615F36A3E00D973EB /* Other */, @@ -375,6 +378,8 @@ children = ( 170465CC15C2960F00DC5BE5 /* PGPostgresTypeHandler.h */, 170465CD15C2960F00DC5BE5 /* PGPostgresTypeHandler.m */, + 17F7962F16150C0100E21D82 /* PGPostgresTypeBinaryHandler.h */, + 17F7963016150C0100E21D82 /* PGPostgresTypeBinaryHandler.m */, 173D4E5815BAB1DD0007F267 /* PGPostgresTypeStringHandler.h */, 173D4E5915BAB1DD0007F267 /* PGPostgresTypeStringHandler.m */, 173D4E5615BAB1DD0007F267 /* PGPostgresTypeNumberHandler.h */, @@ -385,6 +390,15 @@ name = Handlers; sourceTree = "<group>"; }; + 17F7962A1615001D00E21D82 /* Protocols */ = { + isa = PBXGroup; + children = ( + 173D513415BBE50D0007F267 /* PGPostgresConnectionDelegate.h */, + 173D4EA015BAB2A80007F267 /* PGPostgresTypeHandlerProtocol.h */, + ); + name = Protocols; + sourceTree = "<group>"; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -415,6 +429,7 @@ 1731F52E15F48BA500D973EB /* PGPostgresError.h in Headers */, 1724CC9215FB4CC200AB2291 /* PGPostgresTimeTZ.h in Headers */, 1724CD5915FB8A3300AB2291 /* PGPostgresTimeInterval.h in Headers */, + 17F7963116150C0100E21D82 /* PGPostgresTypeBinaryHandler.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -530,6 +545,7 @@ 1731F52F15F48BA500D973EB /* PGPostgresError.m in Sources */, 1724CC9315FB4CC200AB2291 /* PGPostgresTimeTZ.m in Sources */, 1724CD5A15FB8A3300AB2291 /* PGPostgresTimeInterval.m in Sources */, + 17F7963216150C0100E21D82 /* PGPostgresTypeBinaryHandler.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 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 |