From 4b2704021a4984b60e1514401b4cddfb52e26bf3 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 25 Aug 2011 19:28:47 +0000 Subject: [PATCH] Replace an assert() that a condition may not occur in backup.c with code to handle that condition, which can occur. FossilOrigin-Name: 472c74b3452c5a07dfb006010441232b09599ad5 --- manifest | 14 ++-- manifest.uuid | 2 +- src/backup.c | 175 ++++++++++++++++++++++++-------------------------- 3 files changed, 93 insertions(+), 98 deletions(-) diff --git a/manifest b/manifest index 84f710ea47..689b0d09bb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\scompiler\swarnings\sin\stest\scode.\s\sNo\schanges\sto\sthe\score. -D 2011-08-25T18:54:46.949 +C Replace\san\sassert()\sthat\sa\scondition\smay\snot\soccur\sin\sbackup.c\swith\scode\sto\shandle\sthat\scondition,\swhich\scan\soccur. +D 2011-08-25T19:28:47.374 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 8c930e7b493d59099ea1304bd0f2aed152eb3315 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -121,7 +121,7 @@ F src/alter.c ac80a0f31189f8b4a524ebf661e47e84536ee7f5 F src/analyze.c a425d62e8fa9ebcb4359ab84ff0c62c6563d2e2a F src/attach.c 12c6957996908edc31c96d7c68d4942c2474405f F src/auth.c 523da7fb4979469955d822ff9298352d6b31de34 -F src/backup.c 4dfc39043a42cbe47f22b2da47065ae5377f44fd +F src/backup.c 2d879fd8bf2d40011d0d67233842b0367ce95ac7 F src/bitvec.c af50f1c8c0ff54d6bdb7a80e2fceca5a93670bef F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7 F src/btree.c 97cf3ba4ff067e716753b33661035e50853aebba @@ -961,7 +961,7 @@ F tool/symbols.sh caaf6ccc7300fd43353318b44524853e222557d5 F tool/tostr.awk 11760e1b94a5d3dcd42378f3cc18544c06cfa576 F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f F tool/warnings.sh b7fdb2cc525f5ef4fa43c80e771636dd3690f9d2 -P 5a690486811379cea40c6ed48b2902f421234832 -R b670a9b478c564906fde521e9e611e80 -U drh -Z 37f19f515aa327db72395c72e711b78f +P 16f83fec77668c021694fbb189b415bd3b90adc8 +R 3935a8b1957579da0f0f48128e347d0c +U dan +Z da737978f8355147bae2811829cc97da diff --git a/manifest.uuid b/manifest.uuid index 54c90d5412..1442b76640 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -16f83fec77668c021694fbb189b415bd3b90adc8 \ No newline at end of file +472c74b3452c5a07dfb006010441232b09599ad5 \ No newline at end of file diff --git a/src/backup.c b/src/backup.c index 83fa747672..9a43f670cc 100644 --- a/src/backup.c +++ b/src/backup.c @@ -413,108 +413,103 @@ int sqlite3_backup_step(sqlite3_backup *p, int nPage){ if( rc==SQLITE_DONE && (rc = sqlite3BtreeUpdateMeta(p->pDest,1,p->iDestSchema+1))==SQLITE_OK ){ - int nDestTruncate; - if( p->pDestDb ){ sqlite3ResetInternalSchema(p->pDestDb, -1); } - if( destMode==PAGER_JOURNALMODE_WAL ){ - /* This call cannot fail. The success of the BtreeUpdateMeta() - ** method above indicates that a write transaction has been opened - ** and page 1 is already dirty. Therefore this always succeeds. - */ - TESTONLY(int rc2 =) sqlite3BtreeSetVersion(p->pDest, 2); - assert( rc2==SQLITE_OK ); + rc = sqlite3BtreeSetVersion(p->pDest, 2); } - /* Set nDestTruncate to the final number of pages in the destination - ** database. The complication here is that the destination page - ** size may be different to the source page size. - ** - ** If the source page size is smaller than the destination page size, - ** round up. In this case the call to sqlite3OsTruncate() below will - ** fix the size of the file. However it is important to call - ** sqlite3PagerTruncateImage() here so that any pages in the - ** destination file that lie beyond the nDestTruncate page mark are - ** journalled by PagerCommitPhaseOne() before they are destroyed - ** by the file truncation. - */ - assert( pgszSrc==sqlite3BtreeGetPageSize(p->pSrc) ); - assert( pgszDest==sqlite3BtreeGetPageSize(p->pDest) ); - if( pgszSrcpDest->pBt) ){ - nDestTruncate--; - } - }else{ - nDestTruncate = nSrcPage * (pgszSrc/pgszDest); - } - sqlite3PagerTruncateImage(pDestPager, nDestTruncate); - - if( pgszSrc= iSize || ( - nDestTruncate==(int)(PENDING_BYTE_PAGE(p->pDest->pBt)-1) - && iSize>=PENDING_BYTE && iSize<=PENDING_BYTE+pgszDest - )); - - /* This call ensures that all data required to recreate the original - ** database has been stored in the journal for pDestPager and the - ** journal synced to disk. So at this point we may safely modify - ** the database file in any way, knowing that if a power failure - ** occurs, the original database will be reconstructed from the - ** journal file. */ - rc = sqlite3PagerCommitPhaseOne(pDestPager, 0, 1); - - /* Write the extra pages and truncate the database file as required. */ - iEnd = MIN(PENDING_BYTE + pgszDest, iSize); - for( - iOff=PENDING_BYTE+pgszSrc; - rc==SQLITE_OK && iOffpSrc) ); + assert( pgszDest==sqlite3BtreeGetPageSize(p->pDest) ); + if( pgszSrcpDest->pBt) ){ + nDestTruncate--; } - sqlite3PagerUnref(pSrcPg); - } - if( rc==SQLITE_OK ){ - rc = backupTruncateFile(pFile, iSize); + }else{ + nDestTruncate = nSrcPage * (pgszSrc/pgszDest); } + sqlite3PagerTruncateImage(pDestPager, nDestTruncate); - /* Sync the database file to disk. */ - if( rc==SQLITE_OK ){ - rc = sqlite3PagerSync(pDestPager); + if( pgszSrc= iSize || ( + nDestTruncate==(int)(PENDING_BYTE_PAGE(p->pDest->pBt)-1) + && iSize>=PENDING_BYTE && iSize<=PENDING_BYTE+pgszDest + )); + + /* This call ensures that all data required to recreate the original + ** database has been stored in the journal for pDestPager and the + ** journal synced to disk. So at this point we may safely modify + ** the database file in any way, knowing that if a power failure + ** occurs, the original database will be reconstructed from the + ** journal file. */ + rc = sqlite3PagerCommitPhaseOne(pDestPager, 0, 1); + + /* Write the extra pages and truncate the database file as required */ + iEnd = MIN(PENDING_BYTE + pgszDest, iSize); + for( + iOff=PENDING_BYTE+pgszSrc; + rc==SQLITE_OK && iOffpDest, 0)) + ){ + rc = SQLITE_DONE; } - }else{ - rc = sqlite3PagerCommitPhaseOne(pDestPager, 0, 0); - } - - /* Finish committing the transaction to the destination database. */ - if( SQLITE_OK==rc - && SQLITE_OK==(rc = sqlite3BtreeCommitPhaseTwo(p->pDest, 0)) - ){ - rc = SQLITE_DONE; } }