diff options
author | drh <drh@noemail.net> | 2011-01-16 22:37:09 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2011-01-16 22:37:09 +0000 |
commit | c6aed5424b37c0432fd6f5d8def4bed32ed8fb47 (patch) | |
tree | f49ab90149332fc7e72764c85fb50366f59ec4a9 /src/backup.c | |
parent | d40d7ec78b4ac44c1b94fd8ac7356868966c811a (diff) | |
download | sqlite-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.c | 38 |
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{ |