Эх сурвалжийг харах

Merge pull request #480 from gloubibou/master

Added support for custom database class and vfsName
August "Gus" Mueller 9 жил өмнө
parent
commit
dee075fa20

+ 25 - 0
src/fmdb/FMDatabasePool.h

@@ -40,6 +40,7 @@
     
     NSUInteger          _maximumNumberOfDatabasesToCreate;
     int                 _openFlags;
+    NSString            *_vfsName;
 }
 
 /** Database path */
@@ -58,6 +59,10 @@
 
 @property (atomic, readonly) int openFlags;
 
+/**  Custom virtual file system name */
+
+@property (atomic, copy) NSString *vfsName;
+
 
 ///---------------------
 /// @name Initialization
@@ -101,6 +106,26 @@
 
 - (instancetype)initWithPath:(NSString*)aPath flags:(int)openFlags;
 
+/** 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
+ @param vfsName The name of a custom virtual file system
+
+ @return The `FMDatabasePool` object. `nil` on error.
+ */
+
+- (instancetype)initWithPath:(NSString*)aPath flags:(int)openFlags vfs:(NSString *)vfsName;
+
+/** Returns the Class of 'FMDatabase' subclass, that will be used to instantiate database object.
+
+ Subclasses can override this method to return specified Class of 'FMDatabase' subclass.
+
+ @return The Class of 'FMDatabase' subclass, that will be used to instantiate database object.
+ */
+
++ (Class)databaseClass;
+
 ///------------------------------------------------
 /// @name Keeping track of checked in/out databases
 ///------------------------------------------------

+ 11 - 3
src/fmdb/FMDatabasePool.m

@@ -38,7 +38,7 @@ + (instancetype)databasePoolWithPath:(NSString*)aPath flags:(int)openFlags {
     return FMDBReturnAutoreleased([[self alloc] initWithPath:aPath flags:openFlags]);
 }
 
-- (instancetype)initWithPath:(NSString*)aPath flags:(int)openFlags {
+- (instancetype)initWithPath:(NSString*)aPath flags:(int)openFlags vfs:(NSString *)vfsName {
     
     self = [super init];
     
@@ -48,11 +48,16 @@ - (instancetype)initWithPath:(NSString*)aPath flags:(int)openFlags {
         _databaseInPool     = FMDBReturnRetained([NSMutableArray array]);
         _databaseOutPool    = FMDBReturnRetained([NSMutableArray array]);
         _openFlags          = openFlags;
+        _vfsName            = [vfsName copy];
     }
     
     return self;
 }
 
+- (instancetype)initWithPath:(NSString*)aPath flags:(int)openFlags {
+    return [self initWithPath:aPath flags:openFlags vfs:nil];
+}
+
 - (instancetype)initWithPath:(NSString*)aPath
 {
     // default flags for sqlite3_open
@@ -63,6 +68,9 @@ - (instancetype)init {
     return [self initWithPath:nil];
 }
 
++ (Class)databaseClass {
+    return [FMDatabase class];
+}
 
 - (void)dealloc {
     
@@ -128,13 +136,13 @@ - (FMDatabase*)db {
                 }
             }
             
-            db = [FMDatabase databaseWithPath:self->_path];
+            db = [[[self class] databaseClass] databaseWithPath:self->_path];
             shouldNotifyDelegate = YES;
         }
         
         //This ensures that the db is opened before returning
 #if SQLITE_VERSION_NUMBER >= 3005000
-        BOOL success = [db openWithFlags:self->_openFlags];
+        BOOL success = [db openWithFlags:self->_openFlags vfs:self->_vfsName];
 #else
         BOOL success = [db open];
 #endif

+ 5 - 0
src/fmdb/FMDatabaseQueue.h

@@ -65,6 +65,7 @@
     dispatch_queue_t    _queue;
     FMDatabase          *_db;
     int                 _openFlags;
+    NSString            *_vfsName;
 }
 
 /** Path of database */
@@ -75,6 +76,10 @@
 
 @property (atomic, readonly) int openFlags;
 
+/**  Custom virtual file system name */
+
+@property (atomic, copy) NSString *vfsName;
+
 ///----------------------------------------------------
 /// @name Initialization, opening, and closing of queue
 ///----------------------------------------------------

+ 4 - 2
src/fmdb/FMDatabaseQueue.m

@@ -34,6 +34,7 @@ @implementation FMDatabaseQueue
 
 @synthesize path = _path;
 @synthesize openFlags = _openFlags;
+@synthesize vfsName = _vfsName;
 
 + (instancetype)databaseQueueWithPath:(NSString*)aPath {
     
@@ -82,6 +83,7 @@ - (instancetype)initWithPath:(NSString*)aPath flags:(int)openFlags vfs:(NSString
         _queue = dispatch_queue_create([[NSString stringWithFormat:@"fmdb.%@", self] UTF8String], NULL);
         dispatch_queue_set_specific(_queue, kDispatchQueueSpecificKey, (__bridge void *)self, NULL);
         _openFlags = openFlags;
+        _vfsName = [vfsName copy];
     }
     
     return self;
@@ -128,10 +130,10 @@ - (void)close {
 
 - (FMDatabase*)database {
     if (!_db) {
-        _db = FMDBReturnRetained([FMDatabase databaseWithPath:_path]);
+       _db = FMDBReturnRetained([[[self class] databaseClass] databaseWithPath:_path]);
         
 #if SQLITE_VERSION_NUMBER >= 3005000
-        BOOL success = [_db openWithFlags:_openFlags];
+        BOOL success = [_db openWithFlags:_openFlags vfs:_vfsName];
 #else
         BOOL success = [_db open];
 #endif