Browse Source

Added support for open flags to FMDatabaseQueue

Gwyn Judd 12 years ago
parent
commit
846fde3523
3 changed files with 73 additions and 3 deletions
  1. 21 0
      src/FMDatabaseQueue.h
  2. 27 2
      src/FMDatabaseQueue.m
  3. 25 1
      src/fmdb.m

+ 21 - 0
src/FMDatabaseQueue.h

@@ -65,9 +65,11 @@
     NSString            *_path;
     dispatch_queue_t    _queue;
     FMDatabase          *_db;
+    int                 _openFlags;
 }
 
 @property (atomic, retain) NSString *path;
+@property (atomic) int openFlags;
 
 ///----------------------------------------------------
 /// @name Initialization, opening, and closing of queue
@@ -82,6 +84,15 @@
 
 + (instancetype)databaseQueueWithPath:(NSString*)aPath;
 
+/** Create queue using path and specified flags.
+ 
+ @param aPath The file path of the database.
+ @param openFlags Flags passed to the openWithFlags method of the database
+ 
+ @return The `FMDatabaseQueue` object. `nil` on error.
+ */
++ (instancetype)databaseQueueWithPath:(NSString*)aPath flags:(int)openFlags;
+
 /** Create queue using path.
 
  @param aPath The file path of the database.
@@ -91,6 +102,16 @@
 
 - (instancetype)initWithPath:(NSString*)aPath;
 
+/** Create queue using path and specified flags.
+ 
+ @param aPath The file path of the database.
+ @param openFlags Flags passed to the openWithFlags method of the database
+ 
+ @return The `FMDatabaseQueue` object. `nil` on error.
+ */
+
+- (instancetype)initWithPath:(NSString*)aPath flags:(int)openFlags;
+
 /** Close database used by queue. */
 
 - (void)close;

+ 27 - 2
src/FMDatabaseQueue.m

@@ -20,6 +20,7 @@
 @implementation FMDatabaseQueue
 
 @synthesize path = _path;
+@synthesize openFlags = _openFlags;
 
 + (instancetype)databaseQueueWithPath:(NSString*)aPath {
     
@@ -30,7 +31,16 @@ + (instancetype)databaseQueueWithPath:(NSString*)aPath {
     return q;
 }
 
-- (instancetype)initWithPath:(NSString*)aPath {
++ (instancetype)databaseQueueWithPath:(NSString*)aPath flags:(int)openFlags {
+    
+    FMDatabaseQueue *q = [[self alloc] initWithPath:aPath flags:openFlags];
+    
+    FMDBAutorelease(q);
+    
+    return q;
+}
+
+- (instancetype)initWithPath:(NSString*)aPath flags:(int)openFlags {
     
     self = [super init];
     
@@ -39,7 +49,11 @@ - (instancetype)initWithPath:(NSString*)aPath {
         _db = [FMDatabase databaseWithPath:aPath];
         FMDBRetain(_db);
         
+#if SQLITE_VERSION_NUMBER >= 3005000
+        if (![_db openWithFlags:openFlags]) {
+#else
         if (![_db open]) {
+#endif
             NSLog(@"Could not create database queue for path %@", aPath);
             FMDBRelease(self);
             return 0x00;
@@ -48,11 +62,18 @@ - (instancetype)initWithPath:(NSString*)aPath {
         _path = FMDBReturnRetained(aPath);
         
         _queue = dispatch_queue_create([[NSString stringWithFormat:@"fmdb.%@", self] UTF8String], NULL);
+        _openFlags = openFlags;
     }
     
     return self;
 }
 
+- (instancetype)initWithPath:(NSString*)aPath {
+    
+    // default flags for sqlite3_open
+    return [self initWithPath:aPath flags:SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE];
+}
+
 - (void)dealloc {
     
     FMDBRelease(_db);
@@ -81,7 +102,11 @@ - (FMDatabase*)database {
     if (!_db) {
         _db = FMDBReturnRetained([FMDatabase databaseWithPath:_path]);
         
-        if (![_db open]) {
+#if SQLITE_VERSION_NUMBER >= 3005000
+        if (![_db openWithFlags:_openFlags]) {
+#else
+			if (![db open])
+#endif
             NSLog(@"FMDatabaseQueue could not reopen database for path %@", _path);
             FMDBRelease(_db);
             _db  = 0x00;

+ 25 - 1
src/fmdb.m

@@ -889,8 +889,32 @@ int main (int argc, const char * argv[]) {
         }];
         
     }
+	
+	FMDatabaseQueue *queue2 = [FMDatabaseQueue databaseQueueWithPath:dbPath flags:SQLITE_OPEN_READONLY];
     
-    
+    FMDBQuickCheck(queue2);
+    {
+        [queue2 inDatabase:^(FMDatabase *db2) {
+            FMResultSet *rs1 = [db2 executeQuery:@"SELECT * FROM test"];
+            FMDBQuickCheck(rs1 != nil);
+            [rs1 close];
+            
+            BOOL ok = [db2 executeUpdate:@"insert into easy values (?)", [NSNumber numberWithInt:3]];
+            FMDBQuickCheck(!ok);
+        }];
+        
+        [queue2 close];
+        
+        [queue2 inDatabase:^(FMDatabase *db2) {
+            FMResultSet *rs1 = [db2 executeQuery:@"SELECT * FROM test"];
+            FMDBQuickCheck(rs1 != nil);
+            [rs1 close];
+            
+            BOOL ok = [db2 executeUpdate:@"insert into easy values (?)", [NSNumber numberWithInt:3]];
+            FMDBQuickCheck(!ok);
+        }];
+    }
+	
     {
         // You should see pairs of numbers show up in stdout for this stuff:
         size_t ops = 16;