|
|
@@ -15,6 +15,12 @@
|
|
|
#import <sqlite3.h>
|
|
|
#endif
|
|
|
|
|
|
+typedef NS_ENUM(NSInteger, FMDBTransaction) {
|
|
|
+ FMDBTransactionExclusive,
|
|
|
+ FMDBTransactionDeferred,
|
|
|
+ FMDBTransactionImmediate,
|
|
|
+};
|
|
|
+
|
|
|
/*
|
|
|
|
|
|
Note: we call [self retain]; before using dispatch_sync, just incase
|
|
|
@@ -201,17 +207,22 @@ - (void)inDatabase:(void (^)(FMDatabase *db))block {
|
|
|
FMDBRelease(self);
|
|
|
}
|
|
|
|
|
|
-- (void)beginTransaction:(BOOL)useDeferred withBlock:(void (^)(FMDatabase *db, BOOL *rollback))block {
|
|
|
+- (void)beginTransaction:(FMDBTransaction)transaction withBlock:(void (^)(FMDatabase *db, BOOL *rollback))block {
|
|
|
FMDBRetain(self);
|
|
|
dispatch_sync(_queue, ^() {
|
|
|
|
|
|
BOOL shouldRollback = NO;
|
|
|
-
|
|
|
- if (useDeferred) {
|
|
|
- [[self database] beginDeferredTransaction];
|
|
|
- }
|
|
|
- else {
|
|
|
- [[self database] beginTransaction];
|
|
|
+
|
|
|
+ switch (transaction) {
|
|
|
+ case FMDBTransactionExclusive:
|
|
|
+ [[self database] beginTransaction];
|
|
|
+ break;
|
|
|
+ case FMDBTransactionDeferred:
|
|
|
+ [[self database] beginDeferredTransaction];
|
|
|
+ break;
|
|
|
+ case FMDBTransactionImmediate:
|
|
|
+ [[self database] beginImmediateTransaction];
|
|
|
+ break;
|
|
|
}
|
|
|
|
|
|
block([self database], &shouldRollback);
|
|
|
@@ -228,11 +239,15 @@ - (void)beginTransaction:(BOOL)useDeferred withBlock:(void (^)(FMDatabase *db, B
|
|
|
}
|
|
|
|
|
|
- (void)inDeferredTransaction:(void (^)(FMDatabase *db, BOOL *rollback))block {
|
|
|
- [self beginTransaction:YES withBlock:block];
|
|
|
+ [self beginTransaction:FMDBTransactionDeferred withBlock:block];
|
|
|
}
|
|
|
|
|
|
- (void)inTransaction:(void (^)(FMDatabase *db, BOOL *rollback))block {
|
|
|
- [self beginTransaction:NO withBlock:block];
|
|
|
+ [self beginTransaction:FMDBTransactionExclusive withBlock:block];
|
|
|
+}
|
|
|
+
|
|
|
+- (void)inImmediateTransaction:(void (^)(FMDatabase * _Nonnull, BOOL * _Nonnull))block {
|
|
|
+ [self beginTransaction:FMDBTransactionImmediate withBlock:block];
|
|
|
}
|
|
|
|
|
|
- (NSError*)inSavePoint:(void (^)(FMDatabase *db, BOOL *rollback))block {
|
|
|
@@ -267,4 +282,21 @@ - (NSError*)inSavePoint:(void (^)(FMDatabase *db, BOOL *rollback))block {
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
+- (BOOL)checkpoint:(int)mode dbName:(NSString *)name error:(NSError * __autoreleasing *)error
|
|
|
+{
|
|
|
+ __block BOOL result;
|
|
|
+ __block NSError *blockError;
|
|
|
+
|
|
|
+ FMDBRetain(self);
|
|
|
+ dispatch_sync(_queue, ^() {
|
|
|
+ result = [self.database checkpoint:mode dbName:name error:&blockError];
|
|
|
+ });
|
|
|
+ FMDBRelease(self);
|
|
|
+
|
|
|
+ if (error) {
|
|
|
+ *error = blockError;
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
@end
|