From 901180573c489a08ac4f22a05c0a80bc51307d5f Mon Sep 17 00:00:00 2001 From: stuconnolly Date: Thu, 27 Sep 2012 22:49:52 +0000 Subject: Add a binary data handler. --- Frameworks/PostgresKit/Source/PGConstants.h | 1 + Frameworks/PostgresKit/Source/PGConstants.m | 1 + .../Source/PGPostgresConnectionTypeHandling.m | 2 + .../Source/PGPostgresTypeBinaryHandler.h | 63 +++++++++++++ .../Source/PGPostgresTypeBinaryHandler.m | 103 +++++++++++++++++++++ 5 files changed, 170 insertions(+) create mode 100644 Frameworks/PostgresKit/Source/PGPostgresTypeBinaryHandler.h create mode 100644 Frameworks/PostgresKit/Source/PGPostgresTypeBinaryHandler.m (limited to 'Frameworks/PostgresKit/Source') 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 +{ + 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 -- cgit v1.2.3