From f9bc4936e4601ea494fde59105f4f507427a942d Mon Sep 17 00:00:00 2001 From: Jonathan Schleifer Date: Mon, 31 Aug 2020 22:19:00 +0000 Subject: [PATCH] Add SL3OpenFailedException FossilOrigin-Name: 26a83e91f0807f2af6b7b95b33482e55c12ddd3365db835ed7d05e68738a399f --- src/SL3Connection.m | 10 ++-- src/exceptions/Makefile | 3 +- src/exceptions/SL3Exception.h | 2 + src/exceptions/SL3Exception.m | 10 ++++ src/exceptions/SL3OpenFailedException.h | 48 ++++++++++++++++++ src/exceptions/SL3OpenFailedException.m | 66 +++++++++++++++++++++++++ 6 files changed, 133 insertions(+), 6 deletions(-) create mode 100644 src/exceptions/SL3OpenFailedException.h create mode 100644 src/exceptions/SL3OpenFailedException.m diff --git a/src/SL3Connection.m b/src/SL3Connection.m index 460b6f4..944e80c 100644 --- a/src/SL3Connection.m +++ b/src/SL3Connection.m @@ -22,7 +22,7 @@ #import "SL3Connection.h" -#import "SL3Exception.h" +#import "SL3OpenFailedException.h" @implementation SL3Connection + (instancetype)connectionWithPath: (OFString *)path @@ -42,10 +42,10 @@ 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; diff --git a/src/exceptions/Makefile b/src/exceptions/Makefile index 2f07ace..26c4120 100644 --- a/src/exceptions/Makefile +++ b/src/exceptions/Makefile @@ -3,7 +3,8 @@ 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} diff --git a/src/exceptions/SL3Exception.h b/src/exceptions/SL3Exception.h index 88faad5..b084497 100644 --- a/src/exceptions/SL3Exception.h +++ b/src/exceptions/SL3Exception.h @@ -35,8 +35,10 @@ OF_ASSUME_NONNULL_BEGIN @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 diff --git a/src/exceptions/SL3Exception.m b/src/exceptions/SL3Exception.m index c808386..1ce4658 100644 --- a/src/exceptions/SL3Exception.m +++ b/src/exceptions/SL3Exception.m @@ -25,6 +25,11 @@ @implementation SL3Exception @synthesize connection = _connection, errorCode = _errorCode; ++ (instancetype)exception +{ + OF_UNRECOGNIZED_SELECTOR +} + + (instancetype)exceptionWithConnection: (SL3Connection *)connection errorCode: (int)errorCode { @@ -32,6 +37,11 @@ errorCode: errorCode] autorelease]; } +- (instancetype)init +{ + OF_INVALID_INIT_METHOD +} + - (instancetype)initWithConnection: (SL3Connection *)connection errorCode: (int)errorCode { diff --git a/src/exceptions/SL3OpenFailedException.h b/src/exceptions/SL3OpenFailedException.h new file mode 100644 index 0000000..b168988 --- /dev/null +++ b/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 diff --git a/src/exceptions/SL3OpenFailedException.m b/src/exceptions/SL3OpenFailedException.m new file mode 100644 index 0000000..c92fd1b --- /dev/null +++ b/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