瀏覽代碼

Reapplied [cbc4188] (Added interrupt method to cancel/interrupt pending database operation - Marek Serafin <marek@snowheads.pl>) which was (presumably accidentally) removed in [59f8d63].

Evan D. Schoenberg, M.D 9 年之前
父節點
當前提交
23097205d7
共有 4 個文件被更改,包括 33 次插入0 次删除
  1. 9 0
      src/fmdb/FMDatabase.h
  2. 15 0
      src/fmdb/FMDatabase.m
  3. 4 0
      src/fmdb/FMDatabaseQueue.h
  4. 5 0
      src/fmdb/FMDatabaseQueue.m

+ 9 - 0
src/fmdb/FMDatabase.h

@@ -734,6 +734,15 @@ typedef int(^FMDBExecuteStatementsCallbackBlock)(NSDictionary *resultsDictionary
 
 - (void)setShouldCacheStatements:(BOOL)value;
 
+/** Interupt pending database operation
+ 
+ This method causes any pending database operation to abort and return at its earliest opportunity
+ 
+ @return `YES` on success; `NO` on failure. If failed, you can call `<lastError>`, `<lastErrorCode>`, or `<lastErrorMessage>` for diagnostic information regarding the failure.
+ 
+ */
+
+- (BOOL)interrupt;
 
 ///-------------------------
 /// @name Encryption methods

+ 15 - 0
src/fmdb/FMDatabase.m

@@ -1077,6 +1077,12 @@ - (BOOL)executeUpdate:(NSString*)sql error:(NSError**)outErr withArgumentsInArra
     if (SQLITE_DONE == rc) {
         // all is well, let's return.
     }
+    else if (SQLITE_INTERRUPT == rc) {
+        if (_logsErrors) {
+            NSLog(@"Error calling sqlite3_step. Query was interrupted (%d: %s) SQLITE_INTERRUPT", rc, sqlite3_errmsg(_db));
+            NSLog(@"DB Query: %@", sql);
+        }
+    }
     else if (rc == SQLITE_ROW) {
         NSString *message = [NSString stringWithFormat:@"A executeUpdate is being called with a query string '%@'", sql];
         if (_logsErrors) {
@@ -1301,6 +1307,15 @@ - (BOOL)inTransaction {
     return _inTransaction;
 }
 
+- (BOOL)interrupt
+{
+    if (_db) {
+        sqlite3_interrupt([self sqliteHandle]);
+        return YES;
+    }
+    return NO;
+}
+
 static NSString *FMDBEscapeSavePointName(NSString *savepointName) {
     return [savepointName stringByReplacingOccurrencesOfString:@"'" withString:@"''"];
 }

+ 4 - 0
src/fmdb/FMDatabaseQueue.h

@@ -145,6 +145,10 @@
 
 - (void)close;
 
+/** Interupt pending database operation. */
+
+- (void)interrupt;
+
 ///-----------------------------------------------
 /// @name Dispatching database operations to queue
 ///-----------------------------------------------

+ 5 - 0
src/fmdb/FMDatabaseQueue.m

@@ -128,6 +128,11 @@ - (void)close {
     FMDBRelease(self);
 }
 
+- (void)interrupt
+{
+    [[self database] interrupt];
+}
+
 - (FMDatabase*)database {
     if (!_db) {
        _db = FMDBReturnRetained([[[self class] databaseClass] databaseWithPath:_path]);