forked from ccgus/fmdb
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
100 additions
and
97 deletions.
There are no files selected for viewing
194 changes: 98 additions & 96 deletions
194
src/extra/InMemoryOnDiskIO/FMDatabase+InMemoryOnDiskIO.m
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,96 +1,98 @@ | ||
#import "FMDatabase+InMemoryOnDiskIO.h" | ||
|
||
// http://www.sqlite.org/backup.html | ||
static | ||
int loadOrSaveDb(sqlite3 *pInMemory, const char *zFilename, int isSave) | ||
{ | ||
int rc; /* Function return code */ | ||
sqlite3 *pFile; /* Database connection opened on zFilename */ | ||
sqlite3_backup *pBackup; /* Backup object used to copy data */ | ||
sqlite3 *pTo; /* Database to copy to (pFile or pInMemory) */ | ||
sqlite3 *pFrom; /* Database to copy from (pFile or pInMemory) */ | ||
|
||
/* Open the database file identified by zFilename. Exit early if this fails | ||
** for any reason. */ | ||
rc = sqlite3_open(zFilename, &pFile); | ||
if( rc==SQLITE_OK ){ | ||
|
||
/* If this is a 'load' operation (isSave==0), then data is copied | ||
** from the database file just opened to database pInMemory. | ||
** Otherwise, if this is a 'save' operation (isSave==1), then data | ||
** is copied from pInMemory to pFile. Set the variables pFrom and | ||
** pTo accordingly. */ | ||
pFrom = (isSave ? pInMemory : pFile); | ||
pTo = (isSave ? pFile : pInMemory); | ||
|
||
/* Set up the backup procedure to copy from the "main" database of | ||
** connection pFile to the main database of connection pInMemory. | ||
** If something goes wrong, pBackup will be set to NULL and an error | ||
** code and message left in connection pTo. | ||
** | ||
** If the backup object is successfully created, call backup_step() | ||
** to copy data from pFile to pInMemory. Then call backup_finish() | ||
** to release resources associated with the pBackup object. If an | ||
** error occurred, then an error code and message will be left in | ||
** connection pTo. If no error occurred, then the error code belonging | ||
** to pTo is set to SQLITE_OK. | ||
*/ | ||
pBackup = sqlite3_backup_init(pTo, "main", pFrom, "main"); | ||
if( pBackup ){ | ||
(void)sqlite3_backup_step(pBackup, -1); | ||
(void)sqlite3_backup_finish(pBackup); | ||
} | ||
rc = sqlite3_errcode(pTo); | ||
} | ||
|
||
/* Close the database connection opened on database file zFilename | ||
** and return the result of this function. */ | ||
(void)sqlite3_close(pFile); | ||
return rc; | ||
} | ||
|
||
|
||
|
||
@implementation FMDatabase (InMemoryOnDiskIO) | ||
|
||
- (BOOL)readFromFile:(NSString*)filePath | ||
{ | ||
// only attempt to load an on-disk representation for an in-memory database | ||
if ( self->_databasePath != nil ) | ||
{ | ||
NSLog(@"Database is not an in-memory representation." ); | ||
return NO; | ||
} | ||
|
||
// and only if the database is open | ||
if ( self->_db == nil ) | ||
{ | ||
NSLog(@"Invalid database connection." ); | ||
return NO; | ||
} | ||
|
||
return ( SQLITE_OK == loadOrSaveDb( self->_db, [filePath fileSystemRepresentation], false ) ); | ||
|
||
} | ||
|
||
- (BOOL)writeToFile:(NSString *)filePath | ||
{ | ||
// only attempt to save an on-disk representation for an in-memory database | ||
if ( self->_databasePath != nil ) | ||
{ | ||
NSLog(@"Database is not an in-memory representation." ); | ||
return NO; | ||
} | ||
|
||
// and only if the database is open | ||
if ( self->_db == nil ) | ||
{ | ||
NSLog(@"Invalid database connection." ); | ||
return NO; | ||
} | ||
|
||
// save the in-memory representation | ||
return ( SQLITE_OK == loadOrSaveDb( self->_db, [filePath fileSystemRepresentation], true ) ); | ||
} | ||
|
||
@end | ||
#import "FMDatabase+InMemoryOnDiskIO.h" | ||
#import <sqlite3.h> | ||
|
||
|
||
// http://www.sqlite.org/backup.html | ||
static | ||
int loadOrSaveDb(sqlite3 *pInMemory, const char *zFilename, int isSave) | ||
{ | ||
int rc; /* Function return code */ | ||
sqlite3 *pFile; /* Database connection opened on zFilename */ | ||
sqlite3_backup *pBackup; /* Backup object used to copy data */ | ||
sqlite3 *pTo; /* Database to copy to (pFile or pInMemory) */ | ||
sqlite3 *pFrom; /* Database to copy from (pFile or pInMemory) */ | ||
|
||
/* Open the database file identified by zFilename. Exit early if this fails | ||
** for any reason. */ | ||
rc = sqlite3_open(zFilename, &pFile); | ||
if( rc==SQLITE_OK ){ | ||
|
||
/* If this is a 'load' operation (isSave==0), then data is copied | ||
** from the database file just opened to database pInMemory. | ||
** Otherwise, if this is a 'save' operation (isSave==1), then data | ||
** is copied from pInMemory to pFile. Set the variables pFrom and | ||
** pTo accordingly. */ | ||
pFrom = (isSave ? pInMemory : pFile); | ||
pTo = (isSave ? pFile : pInMemory); | ||
|
||
/* Set up the backup procedure to copy from the "main" database of | ||
** connection pFile to the main database of connection pInMemory. | ||
** If something goes wrong, pBackup will be set to NULL and an error | ||
** code and message left in connection pTo. | ||
** | ||
** If the backup object is successfully created, call backup_step() | ||
** to copy data from pFile to pInMemory. Then call backup_finish() | ||
** to release resources associated with the pBackup object. If an | ||
** error occurred, then an error code and message will be left in | ||
** connection pTo. If no error occurred, then the error code belonging | ||
** to pTo is set to SQLITE_OK. | ||
*/ | ||
pBackup = sqlite3_backup_init(pTo, "main", pFrom, "main"); | ||
if( pBackup ){ | ||
(void)sqlite3_backup_step(pBackup, -1); | ||
(void)sqlite3_backup_finish(pBackup); | ||
} | ||
rc = sqlite3_errcode(pTo); | ||
} | ||
|
||
/* Close the database connection opened on database file zFilename | ||
** and return the result of this function. */ | ||
(void)sqlite3_close(pFile); | ||
return rc; | ||
} | ||
|
||
|
||
|
||
@implementation FMDatabase (InMemoryOnDiskIO) | ||
|
||
- (BOOL)readFromFile:(NSString*)filePath | ||
{ | ||
// only attempt to load an on-disk representation for an in-memory database | ||
if ( self->_databasePath != nil ) | ||
{ | ||
NSLog(@"Database is not an in-memory representation." ); | ||
return NO; | ||
} | ||
|
||
// and only if the database is open | ||
if ( self->_db == nil ) | ||
{ | ||
NSLog(@"Invalid database connection." ); | ||
return NO; | ||
} | ||
|
||
return ( SQLITE_OK == loadOrSaveDb( self->_db, [filePath fileSystemRepresentation], false ) ); | ||
|
||
} | ||
|
||
- (BOOL)writeToFile:(NSString *)filePath | ||
{ | ||
// only attempt to save an on-disk representation for an in-memory database | ||
if ( self->_databasePath != nil ) | ||
{ | ||
NSLog(@"Database is not an in-memory representation." ); | ||
return NO; | ||
} | ||
|
||
// and only if the database is open | ||
if ( self->_db == nil ) | ||
{ | ||
NSLog(@"Invalid database connection." ); | ||
return NO; | ||
} | ||
|
||
// save the in-memory representation | ||
return ( SQLITE_OK == loadOrSaveDb( self->_db, [filePath fileSystemRepresentation], true ) ); | ||
} | ||
|
||
@end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters