From 6ba4c3a6b913a3c2a3b42c84835ddf6b5014a057 Mon Sep 17 00:00:00 2001
From: Sunil Sharma <sunilsharma.ss08@gmail.com>
Date: Mon, 22 Feb 2016 14:40:38 +0530
Subject: [PATCH 1/2] Asynchronously perform database operations on queue,
 using transactions.

---
 src/fmdb/FMDatabaseQueue.h |  7 +++++++
 src/fmdb/FMDatabaseQueue.m | 31 +++++++++++++++++++++++++++++++
 2 files changed, 38 insertions(+)

diff --git a/src/fmdb/FMDatabaseQueue.h b/src/fmdb/FMDatabaseQueue.h
index ae45b658..a281d22e 100644
--- a/src/fmdb/FMDatabaseQueue.h
+++ b/src/fmdb/FMDatabaseQueue.h
@@ -158,6 +158,13 @@
 
 - (void)inTransaction:(void (^)(FMDatabase *db, BOOL *rollback))block;
 
+/** Asynchronously perform database operations on queue, using transactions.
+ 
+ @param block The code to be run on the queue of `FMDatabaseQueue`
+ */
+
+- (void)inTransactionAsync:(void (^)(FMDatabase *db, BOOL *rollback))block;
+
 /** Synchronously perform database operations on queue, using deferred transactions.
 
  @param block The code to be run on the queue of `FMDatabaseQueue`
diff --git a/src/fmdb/FMDatabaseQueue.m b/src/fmdb/FMDatabaseQueue.m
index c877a341..7f885cab 100644
--- a/src/fmdb/FMDatabaseQueue.m
+++ b/src/fmdb/FMDatabaseQueue.m
@@ -210,6 +210,37 @@ - (void)inTransaction:(void (^)(FMDatabase *db, BOOL *rollback))block {
     [self beginTransaction:NO withBlock:block];
 }
 
+- (void)inTransactionAsync:(void (^)(FMDatabase *db, BOOL *rollback))block{
+    [self beginTransactionAsync:NO withBlock:block];
+}
+
+- (void)beginTransactionAsync:(BOOL)useDeferred withBlock:(void (^)(FMDatabase *db, BOOL *rollback))block {
+    FMDBRetain(self);
+    dispatch_async(_queue, ^() {
+        
+        BOOL shouldRollback = NO;
+        
+        if (useDeferred) {
+            [[self database] beginDeferredTransaction];
+        }
+        else {
+            [[self database] beginTransaction];
+        }
+        
+        block([self database], &shouldRollback);
+        
+        if (shouldRollback) {
+            [[self database] rollback];
+        }
+        else {
+            [[self database] commit];
+        }
+    });
+    
+    FMDBRelease(self);
+}
+
+
 - (NSError*)inSavePoint:(void (^)(FMDatabase *db, BOOL *rollback))block {
 #if SQLITE_VERSION_NUMBER >= 3007000
     static unsigned long savePointIdx = 0;

From a55602c2d899be4c6bd81202f2479bc2933d5ee3 Mon Sep 17 00:00:00 2001
From: Sunil Sharma <sunilsharma.ss08@gmail.com>
Date: Wed, 24 Feb 2016 15:35:14 +0530
Subject: [PATCH 2/2] FMDBRetain and FMDBRelease has been put inside the
 asynchronous block

---
 src/fmdb/FMDatabaseQueue.m | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/src/fmdb/FMDatabaseQueue.m b/src/fmdb/FMDatabaseQueue.m
index 7f885cab..be2088fc 100644
--- a/src/fmdb/FMDatabaseQueue.m
+++ b/src/fmdb/FMDatabaseQueue.m
@@ -215,9 +215,9 @@ - (void)inTransactionAsync:(void (^)(FMDatabase *db, BOOL *rollback))block{
 }
 
 - (void)beginTransactionAsync:(BOOL)useDeferred withBlock:(void (^)(FMDatabase *db, BOOL *rollback))block {
-    FMDBRetain(self);
+    
     dispatch_async(_queue, ^() {
-        
+        FMDBRetain(self);
         BOOL shouldRollback = NO;
         
         if (useDeferred) {
@@ -235,9 +235,9 @@ - (void)beginTransactionAsync:(BOOL)useDeferred withBlock:(void (^)(FMDatabase *
         else {
             [[self database] commit];
         }
+        FMDBRelease(self);
     });
     
-    FMDBRelease(self);
 }