diff options
author | drh <drh@noemail.net> | 2003-04-25 15:37:57 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2003-04-25 15:37:57 +0000 |
commit | 2e6d11bc07ca73239a49d25fd8313713f6eeb75e (patch) | |
tree | c1c60078b7fc365913d74d9ea1b020610bda7c98 /src/btree.c | |
parent | 9c05dc6298e529bbdd78726dc99b110f641b0c58 (diff) | |
download | sqlite-2e6d11bc07ca73239a49d25fd8313713f6eeb75e.tar.gz sqlite-2e6d11bc07ca73239a49d25fd8313713f6eeb75e.zip |
Add tests to insure VACUUM works in the presence of I/O errors. Fix some
problems that came to light by these tests. (CVS 935)
FossilOrigin-Name: 8d3e879349fc9523c72cb46111e0058b57ce9341
Diffstat (limited to 'src/btree.c')
-rw-r--r-- | src/btree.c | 24 |
1 files changed, 18 insertions, 6 deletions
diff --git a/src/btree.c b/src/btree.c index 46a27e7c2..dccb96059 100644 --- a/src/btree.c +++ b/src/btree.c @@ -9,7 +9,7 @@ ** May you share freely, never taking more than you give. ** ************************************************************************* -** $Id: btree.c,v 1.91 2003/04/25 13:22:52 drh Exp $ +** $Id: btree.c,v 1.92 2003/04/25 15:37:58 drh Exp $ ** ** This file implements a external (disk-based) database using BTrees. ** For a detailed discussion of BTrees, refer to @@ -3498,22 +3498,34 @@ static const char *fileBtreeGetFilename(Btree *pBt){ */ static int fileBtreeCopyFile(Btree *pBtTo, Btree *pBtFrom){ int rc = SQLITE_OK; - Pgno i, nPage; + Pgno i, nPage, nToPage; if( !pBtTo->inTrans || !pBtFrom->inTrans ) return SQLITE_ERROR; if( pBtTo->needSwab!=pBtFrom->needSwab ) return SQLITE_ERROR; if( pBtTo->pCursor ) return SQLITE_BUSY; memcpy(pBtTo->page1, pBtFrom->page1, SQLITE_PAGE_SIZE); - sqlitepager_overwrite(pBtTo->pPager, 1, pBtFrom->page1); + rc = sqlitepager_overwrite(pBtTo->pPager, 1, pBtFrom->page1); + nToPage = sqlitepager_pagecount(pBtTo->pPager); nPage = sqlitepager_pagecount(pBtFrom->pPager); - for(i=2; i<=nPage; i++){ + for(i=2; rc==SQLITE_OK && i<=nPage; i++){ void *pPage; rc = sqlitepager_get(pBtFrom->pPager, i, &pPage); if( rc ) break; - sqlitepager_overwrite(pBtTo->pPager, i, pPage); + rc = sqlitepager_overwrite(pBtTo->pPager, i, pPage); + if( rc ) break; sqlitepager_unref(pPage); } - if( !rc ) rc = sqlitepager_truncate(pBtTo->pPager, nPage); + for(i=nPage+1; rc==SQLITE_OK && i<=nToPage; i++){ + void *pPage; + rc = sqlitepager_get(pBtTo->pPager, i, &pPage); + if( rc ) break; + rc = sqlitepager_write(pPage); + sqlitepager_unref(pPage); + sqlitepager_dont_write(pBtTo->pPager, i); + } + if( !rc && nPage<nToPage ){ + rc = sqlitepager_truncate(pBtTo->pPager, nPage); + } if( rc ){ fileBtreeRollback(pBtTo); } |