diff options
author | Graham Dennis <graham.dennis@gmail.com> | 2013-11-22 02:26:31 +0400 |
---|---|---|
committer | Graham Dennis <graham.dennis@gmail.com> | 2013-11-22 16:07:02 +0400 |
commit | aa3a3a207e39135e223e3e51e48ca36a52539758 (patch) | |
tree | fbfdcedee10deeeb131099ff6d763a63a5541813 | |
parent | e70cd055a6440f1ef254a4549117553b1f97e5b8 (diff) |
Add support for openFlags to FMDatabasePool.
Also specify that openFlags is read-only on FMDatabaseQueue.
-rw-r--r-- | src/FMDatabasePool.h | 22 | ||||
-rw-r--r-- | src/FMDatabasePool.m | 23 | ||||
-rw-r--r-- | src/FMDatabaseQueue.h | 2 | ||||
-rw-r--r-- | src/FMDatabaseQueue.m | 2 | ||||
-rw-r--r-- | src/fmdb.m | 14 |
5 files changed, 58 insertions, 5 deletions
diff --git a/src/FMDatabasePool.h b/src/FMDatabasePool.h index 5af0305..3e1d53b 100644 --- a/src/FMDatabasePool.h +++ b/src/FMDatabasePool.h @@ -40,11 +40,13 @@ __unsafe_unretained id _delegate; NSUInteger _maximumNumberOfDatabasesToCreate; + int _openFlags; } @property (atomic, retain) NSString *path; @property (atomic, assign) id delegate; @property (atomic, assign) NSUInteger maximumNumberOfDatabasesToCreate; +@property (atomic, readonly) int openFlags; ///--------------------- /// @name Initialization @@ -59,6 +61,16 @@ + (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. @param aPath The file path of the database. @@ -68,6 +80,16 @@ - (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 ///------------------------------------------------ diff --git a/src/FMDatabasePool.m b/src/FMDatabasePool.m index ee0611b..ccf4628 100644 --- a/src/FMDatabasePool.m +++ b/src/FMDatabasePool.m @@ -21,17 +21,18 @@ @synthesize path=_path; @synthesize delegate=_delegate; @synthesize maximumNumberOfDatabasesToCreate=_maximumNumberOfDatabasesToCreate; +@synthesize openFlags=_openFlags; + (instancetype)databasePoolWithPath:(NSString*)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]; @@ -40,11 +41,23 @@ _lockQueue = dispatch_queue_create([[NSString stringWithFormat:@"fmdb.%@", self] UTF8String], NULL); _databaseInPool = FMDBReturnRetained([NSMutableArray array]); _databaseOutPool = FMDBReturnRetained([NSMutableArray array]); + _openFlags = openFlags; } 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 { _delegate = 0x00; @@ -110,7 +123,11 @@ } //This ensures that the db is opened before returning +#if SQLITE_VERSION_NUMBER >= 3005000 + if ([db openWithFlags:_openFlags]) { +#else if ([db open]) { +#endif if ([_delegate respondsToSelector:@selector(databasePool:shouldAddDatabaseToPool:)] && ![_delegate databasePool:self shouldAddDatabaseToPool:db]) { [db close]; db = 0x00; diff --git a/src/FMDatabaseQueue.h b/src/FMDatabaseQueue.h index 555c2d2..59c197e 100644 --- a/src/FMDatabaseQueue.h +++ b/src/FMDatabaseQueue.h @@ -69,7 +69,7 @@ } @property (atomic, retain) NSString *path; -@property (atomic) int openFlags; +@property (atomic, readonly) int openFlags; ///---------------------------------------------------- /// @name Initialization, opening, and closing of queue diff --git a/src/FMDatabaseQueue.m b/src/FMDatabaseQueue.m index c302093..9b4a564 100644 --- a/src/FMDatabaseQueue.m +++ b/src/FMDatabaseQueue.m @@ -111,7 +111,7 @@ #if SQLITE_VERSION_NUMBER >= 3005000 if (![_db openWithFlags:_openFlags]) { #else - if (![db open]) + if (![db open]) { #endif NSLog(@"FMDatabaseQueue could not reopen database for path %@", _path); FMDBRelease(_db); @@ -1377,6 +1377,20 @@ void testPool(NSString *dbPath) { 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: //#define ONLY_USE_THE_POOL_IF_YOU_ARE_DOING_READS_OTHERWISE_YOULL_DEADLOCK_USE_FMDATABASEQUEUE_INSTEAD 1 |