Index: src/SL3Connection.m ================================================================== --- src/SL3Connection.m +++ src/SL3Connection.m @@ -20,11 +20,11 @@ * POSSIBILITY OF SUCH DAMAGE. */ #import "SL3Connection.h" -#import "SL3Exception.h" +#import "SL3OpenFailedException.h" @implementation SL3Connection + (instancetype)connectionWithPath: (OFString *)path flags: (int)flags { @@ -40,14 +40,14 @@ @try { int errorCode = sqlite3_open_v2(path.UTF8String, &_database, flags, NULL); if (errorCode != SQLITE_OK) - /* TODO: Use an SL3Exception subclass. */ - @throw [SL3Exception - exceptionWithConnection: nil - errorCode: errorCode]; + @throw [SL3OpenFailedException + exceptionWithPath: path + flags: flags + errorCode: errorCode]; } @catch (id e) { [self release]; @throw e; } Index: src/exceptions/Makefile ================================================================== --- src/exceptions/Makefile +++ src/exceptions/Makefile @@ -1,11 +1,12 @@ include ../../extra.mk STATIC_PIC_LIB_NOINST = ${EXCEPTIONS_LIB_A} STATIC_LIB_NOINST = ${EXCEPTIONS_A} -SRCS = SL3Exception.m +SRCS = SL3Exception.m \ + SL3OpenFailedException.m INCLUDES = ${SRCS:.m=.h} include ../../buildsys.mk Index: src/exceptions/SL3Exception.h ================================================================== --- src/exceptions/SL3Exception.h +++ src/exceptions/SL3Exception.h @@ -33,12 +33,14 @@ } @property OF_NULLABLE_PROPERTY (readonly, nonatomic) SL3Connection *connection; @property (readonly, nonatomic) int errorCode; ++ (instancetype)exception OF_UNAVAILABLE; + (instancetype)exceptionWithConnection: (nullable SL3Connection *)connection errorCode: (int)errorCode; +- (instancetype)init OF_UNAVAILABLE; - (instancetype)initWithConnection: (nullable SL3Connection *)connection errorCode: (int)errorCode OF_DESIGNATED_INITIALIZER; @end OF_ASSUME_NONNULL_END Index: src/exceptions/SL3Exception.m ================================================================== --- src/exceptions/SL3Exception.m +++ src/exceptions/SL3Exception.m @@ -22,17 +22,27 @@ #import "SL3Exception.h" @implementation SL3Exception @synthesize connection = _connection, errorCode = _errorCode; + ++ (instancetype)exception +{ + OF_UNRECOGNIZED_SELECTOR +} + (instancetype)exceptionWithConnection: (SL3Connection *)connection errorCode: (int)errorCode { return [[[self alloc] initWithConnection: connection errorCode: errorCode] autorelease]; } + +- (instancetype)init +{ + OF_INVALID_INIT_METHOD +} - (instancetype)initWithConnection: (SL3Connection *)connection errorCode: (int)errorCode { self = [super init]; ADDED src/exceptions/SL3OpenFailedException.h Index: src/exceptions/SL3OpenFailedException.h ================================================================== --- /dev/null +++ src/exceptions/SL3OpenFailedException.h @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2020, Jonathan Schleifer + * + * https://fossil.nil.im/objsqlite3 + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice is present in all copies. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#import "SL3Exception.h" + +OF_ASSUME_NONNULL_BEGIN + +@interface SL3OpenFailedException: SL3Exception +{ + OFString *_path; + int _flags; +} + +@property (readonly, nonatomic) OFString *path; +@property (readonly, nonatomic) int flags; + ++ (instancetype)exceptionWithConnection: (nullable SL3Connection *)connection + errorCode: (int)errorCode OF_UNAVAILABLE; ++ (instancetype)exceptionWithPath: (OFString *)path + flags: (int)flags + errorCode: (int)errorCode; +- (instancetype)initWithConnection: (nullable SL3Connection *)connection + errorCode: (int)errorCode OF_UNAVAILABLE; +- (instancetype)initWithPath: (OFString *)path + flags: (int)flags + errorCode: (int)errorCode OF_DESIGNATED_INITIALIZER; +@end + +OF_ASSUME_NONNULL_END ADDED src/exceptions/SL3OpenFailedException.m Index: src/exceptions/SL3OpenFailedException.m ================================================================== --- /dev/null +++ src/exceptions/SL3OpenFailedException.m @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2020, Jonathan Schleifer + * + * https://fossil.nil.im/objsqlite3 + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice is present in all copies. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#import "SL3OpenFailedException.h" + +@implementation SL3OpenFailedException +@synthesize path = _Path, flags = _flags; + ++ (instancetype)exceptionWithConnection: (SL3Connection *)connection + errorCode: (int)errorCode OF_UNAVAILABLE +{ + OF_UNRECOGNIZED_SELECTOR +} + ++ (instancetype)exceptionWithPath: (OFString *)path + flags: (int)flags + errorCode: (int)errorCode +{ + return [[[self alloc] initWithPath: path + flags: flags + errorCode: errorCode] autorelease]; +} + +- (instancetype)initWithConnection: (SL3Connection *)connection + errorCode: (int)errorCode OF_UNAVAILABLE +{ + OF_INVALID_INIT_METHOD +} + +- (instancetype)initWithPath: (OFString *)path + flags: (int)flags + errorCode: (int)errorCode +{ + self = [super initWithConnection: nil + errorCode: errorCode]; + + @try { + _path = [path copy]; + _flags = flags; + } @catch (id e) { + [self release]; + @throw e; + } + + return self; +} +@end