1/* 2** This function is used to load the contents of a database file on disk
3** into the "main" database of open database connection pInMemory, or
4** to save the current contents of the database opened by pInMemory into
5** a database file on disk. pInMemory is probably an in-memory database,
6** but this function will also work fine if it is not.
7**
8** Parameter zFilename points to a nul-terminated string containing the
9** name of the database file on disk to load from or save to. If parameter
10** isSave is non-zero, then the contents of the file zFilename are
11** overwritten with the contents of the database opened by pInMemory. If
12** parameter isSave is zero, then the contents of the database opened by
13** pInMemory are replaced by data loaded from the file zFilename.
14**
15** If the operation is successful, SQLITE_OK is returned. Otherwise, if
16** an error occurs, an SQLite error code is returned.
17*/18int loadOrSaveDb(sqlite3 *pInMemory, constchar *zFilename, int isSave){
19int rc; /* Function return code */20 sqlite3 *pFile; /* Database connection opened on zFilename */21 sqlite3_backup *pBackup; /* Backup object used to copy data */22 sqlite3 *pTo; /* Database to copy to (pFile or pInMemory) */23 sqlite3 *pFrom; /* Database to copy from (pFile or pInMemory) */2425/* Open the database file identified by zFilename. Exit early if this fails
26 ** for any reason. */27 rc = sqlite3_open(zFilename, &pFile);
28if( rc==SQLITE_OK ){
2930/* If this is a 'load' operation (isSave==0), then data is copied
31 ** from the database file just opened to database pInMemory.
32 ** Otherwise, if this is a 'save' operation (isSave==1), then data
33 ** is copied from pInMemory to pFile. Set the variables pFrom and
34 ** pTo accordingly. */35 pFrom = (isSave ? pInMemory : pFile);
36 pTo = (isSave ? pFile : pInMemory);
3738/* Set up the backup procedure to copy from the "main" database of
39 ** connection pFile to the main database of connection pInMemory.
40 ** If something goes wrong, pBackup will be set to NULL and an error
41 ** code and message left in connection pTo.
42 **
43 ** If the backup object is successfully created, call backup_step()
44 ** to copy data from pFile to pInMemory. Then call backup_finish()
45 ** to release resources associated with the pBackup object. If an
46 ** error occurred, then an error code and message will be left in
47 ** connection pTo. If no error occurred, then the error code belonging
48 ** to pTo is set to SQLITE_OK.
49*/50 pBackup = sqlite3_backup_init(pTo, "main", pFrom, "main");
51if( pBackup ){
52 (void)sqlite3_backup_step(pBackup, -1);
53 (void)sqlite3_backup_finish(pBackup);
54 }
55 rc = sqlite3_errcode(pTo);
56 }
5758/* Close the database connection opened on database file zFilename
59 ** and return the result of this function. */60 (void)sqlite3_close(pFile);
61return rc;
62 }
1/* 2** Perform an online backup of database pDb to the database file named
3** by zFilename. This function copies 5 database pages from pDb to
4** zFilename, then unlocks pDb and sleeps for 250 ms, then repeats the
5** process until the entire database is backed up.
6**
7** The third argument passed to this function must be a pointer to a progress
8** function. After each set of 5 pages is backed up, the progress function
9** is invoked with two integer parameters: the number of pages left to
10** copy, and the total number of pages in the source file. This information
11** may be used, for example, to update a GUI progress bar.
12**
13** While this function is running, another thread may use the database pDb, or
14** another process may access the underlying database file via a separate
15** connection.
16**
17** If the backup process is successfully completed, SQLITE_OK is returned.
18** Otherwise, if an error occurs, an SQLite error code is returned.
19*/20int backupDb(
21 sqlite3 *pDb, /* Database to back up */22constchar *zFilename, /* Name of file to back up to */23void(*xProgress)(int, int) /* Progress function to invoke */24 ){
25int rc; /* Function return code */26 sqlite3 *pFile; /* Database connection opened on zFilename */27 sqlite3_backup *pBackup; /* Backup handle used to copy data */2829/* Open the database file identified by zFilename. */30 rc = sqlite3_open(zFilename, &pFile);
31if( rc==SQLITE_OK ){
3233/* Open the sqlite3_backup object used to accomplish the transfer */34 pBackup = sqlite3_backup_init(pFile, "main", pDb, "main");
35if( pBackup ){
3637/* Each iteration of this loop copies 5 database pages from database
38 ** pDb to the backup database. If the return value of backup_step()
39 ** indicates that there are still further pages to copy, sleep for
40 ** 250 ms before repeating. */41do {
42 rc = sqlite3_backup_step(pBackup, 5);
43 xProgress(
44 sqlite3_backup_remaining(pBackup),
45 sqlite3_backup_pagecount(pBackup)
46 );
47if( rc==SQLITE_OK || rc==SQLITE_BUSY || rc==SQLITE_LOCKED ){
48 sqlite3_sleep(250);
49 }
50 } while( rc==SQLITE_OK || rc==SQLITE_BUSY || rc==SQLITE_LOCKED );
5152/* Release resources allocated by backup_init(). */53 (void)sqlite3_backup_finish(pBackup);
54 }
55 rc = sqlite3_errcode(pFile);
56 }
5758/* Close the database connection opened on database file zFilename
59 ** and return the result of this function. */60 (void)sqlite3_close(pFile);
61return rc;
62 }