From c641caab35db8e28620295f5dec72e733e1ff744 Mon Sep 17 00:00:00 2001 From: Igor Sutton Date: Mon, 12 Apr 2010 12:27:48 +0200 Subject: [PATCH 1/2] keep track of prepared statements. We need to finish all prepared statements if not finished yet. --- Source/CocoaSQL/CSQLDatabase.h | 7 +++++++ Source/CocoaSQL/CSQLDatabase.m | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) diff --git a/Source/CocoaSQL/CSQLDatabase.h b/Source/CocoaSQL/CSQLDatabase.h index db8a926..2fdeebd 100644 --- a/Source/CocoaSQL/CSQLDatabase.h +++ b/Source/CocoaSQL/CSQLDatabase.h @@ -14,6 +14,7 @@ @interface CSQLDatabase : NSObject { voidPtr databaseHandle; + NSMutableArray *preparedStatements; } @property (readwrite,assign) voidPtr databaseHandle; @@ -21,12 +22,18 @@ + (CSQLDatabase *)databaseWithDSN:(NSString *)aDSN error:(NSError **)error; + (CSQLDatabase *)databaseWithDriver:(NSString *)aDriver options:(NSDictionary *)options error:(NSError **)error; +- (CSQLPreparedStatement *)prepareStatement:(NSString *)sql; +- (CSQLPreparedStatement *)prepareStatement:(NSString *)sql error:(NSError **)error; + - (NSNumber *)affectedRows; - (NSNumber *)lastInsertID; + - (BOOL)disconnect; - (BOOL)disconnect:(NSError **)error; + - (BOOL)isActive; - (BOOL)isActive:(NSError **)error; + @end #pragma mark - diff --git a/Source/CocoaSQL/CSQLDatabase.m b/Source/CocoaSQL/CSQLDatabase.m index ff0df26..f18e9b4 100644 --- a/Source/CocoaSQL/CSQLDatabase.m +++ b/Source/CocoaSQL/CSQLDatabase.m @@ -53,6 +53,14 @@ + (CSQLDatabase *)databaseWithDSN:(NSString *)aDSN error:(NSError **)error return [self databaseWithDriver:aDriver options:options error:error]; } +- (id)init +{ + if (self = [super init]) { + preparedStatements = [NSMutableArray array]; + } + return self; +} + - (BOOL)isActive:(NSError **)error { // MUST be overridden by subclasses @@ -91,6 +99,32 @@ - (NSNumber *)lastInsertID return [NSNumber numberWithInt:0]; } +- (void)dealloc +{ + for (CSQLPreparedStatement *statement in preparedStatements) { + NSLog(@"Finishing statement %@", statement); + [statement finish]; + } + [super dealloc]; +} + +- (CSQLPreparedStatement *)prepareStatement:(NSString *)sql +{ + return [self prepareStatement:sql error:nil]; +} + +- (CSQLPreparedStatement *)prepareStatement:(NSString *)sql error:(NSError **)error +{ + CSQLPreparedStatement *statement = nil; + if ([self respondsToSelector:@selector(prepareStatementImpl:error:)]) { + statement = [[self prepareStatementImpl:sql error:error] retain]; + if (statement) { + [preparedStatements addObject:statement]; + } + } + return statement; +} + @end From 7b628a27754cedfadf78d63dd882c7a2d040423d Mon Sep 17 00:00:00 2001 From: Igor Sutton Date: Mon, 12 Apr 2010 12:28:35 +0200 Subject: [PATCH 2/2] changed message signature. --- Source/SQLite/CSSQLiteDatabase.h | 2 +- Source/SQLite/CSSQLiteDatabase.m | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Source/SQLite/CSSQLiteDatabase.h b/Source/SQLite/CSSQLiteDatabase.h index 4f7cf4c..8125b3a 100644 --- a/Source/SQLite/CSSQLiteDatabase.h +++ b/Source/SQLite/CSSQLiteDatabase.h @@ -23,7 +23,7 @@ + (id)databaseWithPath:(NSString *)aPath error:(NSError **)error; - - (id)initWithPath:(NSString *)aPath error:(NSError **)error; +- (CSQLPreparedStatement *)prepareStatementImpl:(NSString *)sql error:(NSError **)error; @end diff --git a/Source/SQLite/CSSQLiteDatabase.m b/Source/SQLite/CSSQLiteDatabase.m index 38d4043..cb81b51 100644 --- a/Source/SQLite/CSSQLiteDatabase.m +++ b/Source/SQLite/CSSQLiteDatabase.m @@ -185,7 +185,7 @@ - (NSArray *)fetchRowsAsArraysWithSQL:(NSString *)sql error:(NSError **)error #pragma mark - #pragma mark Prepared Statement messages -- (CSQLPreparedStatement *)prepareStatement:(NSString *)sql error:(NSError **)error +- (CSQLPreparedStatement *)prepareStatementImpl:(NSString *)sql error:(NSError **)error { return [CSSQLitePreparedStatement preparedStatementWithDatabase:self andSQL:sql error:error]; }