Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/ccgus/fmdb.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGraham Dennis <graham.dennis@gmail.com>2013-11-22 02:26:31 +0400
committerGraham Dennis <graham.dennis@gmail.com>2013-11-22 16:07:02 +0400
commitaa3a3a207e39135e223e3e51e48ca36a52539758 (patch)
treefbfdcedee10deeeb131099ff6d763a63a5541813
parente70cd055a6440f1ef254a4549117553b1f97e5b8 (diff)
Add support for openFlags to FMDatabasePool.
Also specify that openFlags is read-only on FMDatabaseQueue.
-rw-r--r--src/FMDatabasePool.h22
-rw-r--r--src/FMDatabasePool.m23
-rw-r--r--src/FMDatabaseQueue.h2
-rw-r--r--src/FMDatabaseQueue.m2
-rw-r--r--src/fmdb.m14
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);
diff --git a/src/fmdb.m b/src/fmdb.m
index 2616a3f..ae8806f 100644
--- a/src/fmdb.m
+++ b/src/fmdb.m
@@ -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