aboutsummaryrefslogtreecommitdiff
path: root/src/backup.c
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2011-01-16 22:37:09 +0000
committerdrh <drh@noemail.net>2011-01-16 22:37:09 +0000
commitc6aed5424b37c0432fd6f5d8def4bed32ed8fb47 (patch)
treef49ab90149332fc7e72764c85fb50366f59ec4a9 /src/backup.c
parentd40d7ec78b4ac44c1b94fd8ac7356868966c811a (diff)
downloadsqlite-c6aed5424b37c0432fd6f5d8def4bed32ed8fb47.tar.gz
sqlite-c6aed5424b37c0432fd6f5d8def4bed32ed8fb47.zip
On a backup from a smaller to a larger page size, do not begin committing
the transaction until the source pages after the pending byte have been copied. FossilOrigin-Name: 612e2599d3e1a17c268402fce018a53dee6dffe1
Diffstat (limited to 'src/backup.c')
-rw-r--r--src/backup.c38
1 files changed, 20 insertions, 18 deletions
diff --git a/src/backup.c b/src/backup.c
index a37065080..7258b26aa 100644
--- a/src/backup.c
+++ b/src/backup.c
@@ -441,31 +441,33 @@ int sqlite3_backup_step(sqlite3_backup *p, int nPage){
*/
const i64 iSize = (i64)pgszSrc * (i64)nSrcPage;
sqlite3_file * const pFile = sqlite3PagerFile(pDestPager);
+ i64 iOff;
+ i64 iEnd;
assert( pFile );
assert( (i64)nDestTruncate*(i64)pgszDest >= iSize || (
nDestTruncate==(int)(PENDING_BYTE_PAGE(p->pDest->pBt)-1)
&& iSize>=PENDING_BYTE && iSize<=PENDING_BYTE+pgszDest
));
- if( SQLITE_OK==(rc = sqlite3PagerCommitPhaseOne(pDestPager, 0, 1))
- && SQLITE_OK==(rc = backupTruncateFile(pFile, iSize))
- && SQLITE_OK==(rc = sqlite3PagerSync(pDestPager))
+ iEnd = MIN(PENDING_BYTE + pgszDest, iSize);
+ for(
+ iOff=PENDING_BYTE+pgszSrc;
+ rc==SQLITE_OK && iOff<iEnd;
+ iOff+=pgszSrc
){
- i64 iOff;
- i64 iEnd = MIN(PENDING_BYTE + pgszDest, iSize);
- for(
- iOff=PENDING_BYTE+pgszSrc;
- rc==SQLITE_OK && iOff<iEnd;
- iOff+=pgszSrc
- ){
- PgHdr *pSrcPg = 0;
- const Pgno iSrcPg = (Pgno)((iOff/pgszSrc)+1);
- rc = sqlite3PagerGet(pSrcPager, iSrcPg, &pSrcPg);
- if( rc==SQLITE_OK ){
- u8 *zData = sqlite3PagerGetData(pSrcPg);
- rc = sqlite3OsWrite(pFile, zData, pgszSrc, iOff);
- }
- sqlite3PagerUnref(pSrcPg);
+ PgHdr *pSrcPg = 0;
+ const Pgno iSrcPg = (Pgno)((iOff/pgszSrc)+1);
+ rc = sqlite3PagerGet(pSrcPager, iSrcPg, &pSrcPg);
+ if( rc==SQLITE_OK ){
+ u8 *zData = sqlite3PagerGetData(pSrcPg);
+ rc = sqlite3OsWrite(pFile, zData, pgszSrc, iOff);
+ }
+ sqlite3PagerUnref(pSrcPg);
+ }
+ if( rc==SQLITE_OK ){
+ rc = sqlite3PagerCommitPhaseOne(pDestPager, 0, 1);
+ if( rc==SQLITE_OK ){
+ rc = backupTruncateFile(pFile, iSize);
}
}
}else{