|
|
@@ -94,6 +94,8 @@ - (BOOL)close {
|
|
|
int rc;
|
|
|
BOOL retry;
|
|
|
int numberOfRetries = 0;
|
|
|
+ BOOL triedFinalizingOpenStatements = NO;
|
|
|
+
|
|
|
do {
|
|
|
retry = NO;
|
|
|
rc = sqlite3_close(db);
|
|
|
@@ -105,6 +107,15 @@ - (BOOL)close {
|
|
|
NSLog(@"Database busy, unable to close");
|
|
|
return NO;
|
|
|
}
|
|
|
+
|
|
|
+ if (!triedFinalizingOpenStatements) {
|
|
|
+ triedFinalizingOpenStatements = YES;
|
|
|
+ sqlite3_stmt *pStmt;
|
|
|
+ while ((pStmt = sqlite3_next_stmt(db, 0x00)) !=0) {
|
|
|
+ NSLog(@"Closing leaked statement");
|
|
|
+ sqlite3_finalize(pStmt);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
else if (SQLITE_OK != rc) {
|
|
|
NSLog(@"error closing!: %d", rc);
|
|
|
@@ -859,6 +870,10 @@ - (void)setShouldCacheStatements:(BOOL)value {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
++ (BOOL)isThreadSafe {
|
|
|
+ // make sure to read the sqlite headers on this guy!
|
|
|
+ return sqlite3_threadsafe();
|
|
|
+}
|
|
|
|
|
|
@end
|
|
|
|