aboutsummaryrefslogtreecommitdiff
path: root/src/backup.c
diff options
context:
space:
mode:
authordan <dan@noemail.net>2012-12-21 16:15:35 +0000
committerdan <dan@noemail.net>2012-12-21 16:15:35 +0000
commit5cc3bea44ad2dc8008330934d7f8e65d4059b1fb (patch)
treee9324e5436401418557db1547ead4a4dd8b051ea /src/backup.c
parentb2bb176b7043dab7a20e2eb535ec2e73e3f583fe (diff)
downloadsqlite-5cc3bea44ad2dc8008330934d7f8e65d4059b1fb.tar.gz
sqlite-5cc3bea44ad2dc8008330934d7f8e65d4059b1fb.zip
Ensure the database size field in the db header of a backup database is set correctly. Fix for [0cfd98ee201].
FossilOrigin-Name: ff6857b6ed6a46671006b75157d8cf853a816ef9
Diffstat (limited to 'src/backup.c')
-rw-r--r--src/backup.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/src/backup.c b/src/backup.c
index b234716d6..d3614b88c 100644
--- a/src/backup.c
+++ b/src/backup.c
@@ -212,7 +212,12 @@ static int isFatalError(int rc){
** page iSrcPg from the source database. Copy this data into the
** destination database.
*/
-static int backupOnePage(sqlite3_backup *p, Pgno iSrcPg, const u8 *zSrcData){
+static int backupOnePage(
+ sqlite3_backup *p, /* Backup handle */
+ Pgno iSrcPg, /* Source database page to backup */
+ const u8 *zSrcData, /* Source database page data */
+ int bUpdate /* True for an update, false otherwise */
+){
Pager * const pDestPager = sqlite3BtreePager(p->pDest);
const int nSrcPgsz = sqlite3BtreeGetPageSize(p->pSrc);
int nDestPgsz = sqlite3BtreeGetPageSize(p->pDest);
@@ -285,6 +290,9 @@ static int backupOnePage(sqlite3_backup *p, Pgno iSrcPg, const u8 *zSrcData){
*/
memcpy(zOut, zIn, nCopy);
((u8 *)sqlite3PagerGetExtra(pDestPg))[0] = 0;
+ if( iOff==0 && bUpdate==0 ){
+ sqlite3Put4byte(&zOut[28], sqlite3BtreeLastPage(p->pSrc));
+ }
}
sqlite3PagerUnref(pDestPg);
}
@@ -391,7 +399,7 @@ int sqlite3_backup_step(sqlite3_backup *p, int nPage){
DbPage *pSrcPg; /* Source page object */
rc = sqlite3PagerGet(pSrcPager, iSrcPg, &pSrcPg);
if( rc==SQLITE_OK ){
- rc = backupOnePage(p, iSrcPg, sqlite3PagerGetData(pSrcPg));
+ rc = backupOnePage(p, iSrcPg, sqlite3PagerGetData(pSrcPg), 0);
sqlite3PagerUnref(pSrcPg);
}
}
@@ -639,7 +647,7 @@ void sqlite3BackupUpdate(sqlite3_backup *pBackup, Pgno iPage, const u8 *aData){
int rc;
assert( p->pDestDb );
sqlite3_mutex_enter(p->pDestDb->mutex);
- rc = backupOnePage(p, iPage, aData);
+ rc = backupOnePage(p, iPage, aData, 1);
sqlite3_mutex_leave(p->pDestDb->mutex);
assert( rc!=SQLITE_BUSY && rc!=SQLITE_LOCKED );
if( rc!=SQLITE_OK ){