Sfoglia il codice sorgente

Add support for openFlags to FMDatabasePool.

Also specify that openFlags is read-only on FMDatabaseQueue.
Graham Dennis 12 anni fa
parent
commit
aa3a3a207e
5 ha cambiato i file con 58 aggiunte e 5 eliminazioni
  1. 22 0
      src/FMDatabasePool.h
  2. 20 3
      src/FMDatabasePool.m
  3. 1 1
      src/FMDatabaseQueue.h
  4. 1 1
      src/FMDatabaseQueue.m
  5. 14 0
      src/fmdb.m

+ 22 - 0
src/FMDatabasePool.h

@@ -40,11 +40,13 @@
     __unsafe_unretained id _delegate;
     __unsafe_unretained id _delegate;
     
     
     NSUInteger          _maximumNumberOfDatabasesToCreate;
     NSUInteger          _maximumNumberOfDatabasesToCreate;
+    int                 _openFlags;
 }
 }
 
 
 @property (atomic, retain) NSString *path;
 @property (atomic, retain) NSString *path;
 @property (atomic, assign) id delegate;
 @property (atomic, assign) id delegate;
 @property (atomic, assign) NSUInteger maximumNumberOfDatabasesToCreate;
 @property (atomic, assign) NSUInteger maximumNumberOfDatabasesToCreate;
+@property (atomic, readonly) int openFlags;
 
 
 ///---------------------
 ///---------------------
 /// @name Initialization
 /// @name Initialization
@@ -59,6 +61,16 @@
 
 
 + (instancetype)databasePoolWithPath:(NSString*)aPath;
 + (instancetype)databasePoolWithPath:(NSString*)aPath;
 
 
+/** Create pool 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 `FMDatabasePool` object. `nil` on error.
+ */
+
++ (instancetype)databasePoolWithPath:(NSString*)aPath flags:(int)openFlags;
+
 /** Create pool using path.
 /** Create pool using path.
 
 
  @param aPath The file path of the database.
  @param aPath The file path of the database.
@@ -68,6 +80,16 @@
 
 
 - (instancetype)initWithPath:(NSString*)aPath;
 - (instancetype)initWithPath:(NSString*)aPath;
 
 
+/** Create pool 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 `FMDatabasePool` object. `nil` on error.
+ */
+
+- (instancetype)initWithPath:(NSString*)aPath flags:(int)openFlags;
+
 ///------------------------------------------------
 ///------------------------------------------------
 /// @name Keeping track of checked in/out databases
 /// @name Keeping track of checked in/out databases
 ///------------------------------------------------
 ///------------------------------------------------

+ 20 - 3
src/FMDatabasePool.m

@@ -21,17 +21,18 @@ @implementation FMDatabasePool
 @synthesize path=_path;
 @synthesize path=_path;
 @synthesize delegate=_delegate;
 @synthesize delegate=_delegate;
 @synthesize maximumNumberOfDatabasesToCreate=_maximumNumberOfDatabasesToCreate;
 @synthesize maximumNumberOfDatabasesToCreate=_maximumNumberOfDatabasesToCreate;
+@synthesize openFlags=_openFlags;
 
 
 
 
 + (instancetype)databasePoolWithPath:(NSString*)aPath {
 + (instancetype)databasePoolWithPath:(NSString*)aPath {
     return FMDBReturnAutoreleased([[self alloc] initWithPath:aPath]);
     return FMDBReturnAutoreleased([[self alloc] initWithPath:aPath]);
 }
 }
 
 
-- (instancetype)init {
-    return [self initWithPath:nil];
++ (instancetype)databasePoolWithPath:(NSString*)aPath flags:(int)openFlags {
+    return FMDBReturnAutoreleased([[self alloc] initWithPath:aPath flags:openFlags]);
 }
 }
 
 
-- (instancetype)initWithPath:(NSString*)aPath {
+- (instancetype)initWithPath:(NSString*)aPath flags:(int)openFlags {
     
     
     self = [super init];
     self = [super init];
     
     
@@ -40,11 +41,23 @@ - (instancetype)initWithPath:(NSString*)aPath {
         _lockQueue          = dispatch_queue_create([[NSString stringWithFormat:@"fmdb.%@", self] UTF8String], NULL);
         _lockQueue          = dispatch_queue_create([[NSString stringWithFormat:@"fmdb.%@", self] UTF8String], NULL);
         _databaseInPool     = FMDBReturnRetained([NSMutableArray array]);
         _databaseInPool     = FMDBReturnRetained([NSMutableArray array]);
         _databaseOutPool    = FMDBReturnRetained([NSMutableArray array]);
         _databaseOutPool    = FMDBReturnRetained([NSMutableArray array]);
+        _openFlags          = openFlags;
     }
     }
     
     
     return self;
     return self;
 }
 }
 
 
+- (instancetype)initWithPath:(NSString*)aPath
+{
+    // default flags for sqlite3_open
+    return [self initWithPath:aPath flags:SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE];
+}
+
+- (instancetype)init {
+    return [self initWithPath:nil];
+}
+
+
 - (void)dealloc {
 - (void)dealloc {
     
     
     _delegate = 0x00;
     _delegate = 0x00;
@@ -110,7 +123,11 @@ - (FMDatabase*)db {
         }
         }
         
         
         //This ensures that the db is opened before returning
         //This ensures that the db is opened before returning
+#if SQLITE_VERSION_NUMBER >= 3005000
+        if ([db openWithFlags:_openFlags]) {
+#else
         if ([db open]) {
         if ([db open]) {
+#endif
             if ([_delegate respondsToSelector:@selector(databasePool:shouldAddDatabaseToPool:)] && ![_delegate databasePool:self shouldAddDatabaseToPool:db]) {
             if ([_delegate respondsToSelector:@selector(databasePool:shouldAddDatabaseToPool:)] && ![_delegate databasePool:self shouldAddDatabaseToPool:db]) {
                 [db close];
                 [db close];
                 db = 0x00;
                 db = 0x00;

+ 1 - 1
src/FMDatabaseQueue.h

@@ -69,7 +69,7 @@
 }
 }
 
 
 @property (atomic, retain) NSString *path;
 @property (atomic, retain) NSString *path;
-@property (atomic) int openFlags;
+@property (atomic, readonly) int openFlags;
 
 
 ///----------------------------------------------------
 ///----------------------------------------------------
 /// @name Initialization, opening, and closing of queue
 /// @name Initialization, opening, and closing of queue

+ 1 - 1
src/FMDatabaseQueue.m

@@ -111,7 +111,7 @@ - (FMDatabase*)database {
 #if SQLITE_VERSION_NUMBER >= 3005000
 #if SQLITE_VERSION_NUMBER >= 3005000
         if (![_db openWithFlags:_openFlags]) {
         if (![_db openWithFlags:_openFlags]) {
 #else
 #else
-			if (![db open])
+        if (![db open]) {
 #endif
 #endif
             NSLog(@"FMDatabaseQueue could not reopen database for path %@", _path);
             NSLog(@"FMDatabaseQueue could not reopen database for path %@", _path);
             FMDBRelease(_db);
             FMDBRelease(_db);

+ 14 - 0
src/fmdb.m

@@ -1377,6 +1377,20 @@ void testPool(NSString *dbPath) {
         NSLog(@"Number of open databases after crazy gcd stuff: %ld", [dbPool countOfOpenDatabases]);
         NSLog(@"Number of open databases after crazy gcd stuff: %ld", [dbPool countOfOpenDatabases]);
     }
     }
     
     
+	FMDatabasePool *dbPool2 = [FMDatabasePool databasePoolWithPath:dbPath flags:SQLITE_OPEN_READONLY];
+    
+    FMDBQuickCheck(dbPool2);
+    {
+        [dbPool2 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);
+        }];
+    }
+    
     
     
     // if you want to see a deadlock, just uncomment this line and run:
     // if you want to see a deadlock, just uncomment this line and run:
     //#define ONLY_USE_THE_POOL_IF_YOU_ARE_DOING_READS_OTHERWISE_YOULL_DEADLOCK_USE_FMDATABASEQUEUE_INSTEAD 1
     //#define ONLY_USE_THE_POOL_IF_YOU_ARE_DOING_READS_OTHERWISE_YOULL_DEADLOCK_USE_FMDATABASEQUEUE_INSTEAD 1