From: drh Date: Mon, 6 Nov 2006 21:20:25 +0000 (+0000) Subject: Use the difference between the SQLITE_IOERR_SHORT_READ and SQLITE_IOERR_READ X-Git-Tag: version-3.6.10~2665 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=551b77365eac72179ed3ab47e94a1702edecf31a;p=thirdparty%2Fsqlite.git Use the difference between the SQLITE_IOERR_SHORT_READ and SQLITE_IOERR_READ returns from sqlite3OsRead() to make decisions about what to do with the error. (CVS 3503) FossilOrigin-Name: 6324ea811eec1200cee89e6f377368eaf2fcda77 --- diff --git a/manifest b/manifest index e2a9a9fcf9..d42630072f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sbug\sin\sthe\soptimizer\sthat\swas\scausing\sit\sto\smiss\san\sOR\soptimization\nopportunity.\s(CVS\s3502) -D 2006-11-06T15:10:05 +C Use\sthe\sdifference\sbetween\sthe\sSQLITE_IOERR_SHORT_READ\sand\sSQLITE_IOERR_READ\nreturns\sfrom\ssqlite3OsRead()\sto\smake\sdecisions\sabout\swhat\sto\sdo\swith\sthe\nerror.\s(CVS\s3503) +D 2006-11-06T21:20:26 F Makefile.in 8e14898d41a53033ecb687d93c9cd5d109fb9ae3 F Makefile.linux-gcc 2d8574d1ba75f129aba2019f0b959db380a90935 F README 9c4e2d6706bdcc3efdd773ce752a8cdab4f90028 @@ -57,7 +57,7 @@ F src/alter.c 2c79ec40f65e33deaf90ca493422c74586e481a3 F src/analyze.c 7d2b7ab9a9c2fd6e55700f69064dfdd3e36d7a8a F src/attach.c b11eb4d5d3fb99a10a626956bccc7215f6b68b16 F src/auth.c 902f4722661c796b97f007d9606bd7529c02597f -F src/btree.c 6c6a106d47e9c18047ab8740d3c9712b20ecd754 +F src/btree.c c9d52b0827d80238e6ded523deec0cee20456fe2 F src/btree.h 061c50e37de7f50b58528e352d400cf33ead7418 F src/build.c 7199949a6a3449e9ec69408cc79a48ed04fd0b85 F src/callback.c fd9bb39f7ff6b52bad8365617abc61c720640429 @@ -77,16 +77,16 @@ F src/md5.c c5fdfa5c2593eaee2e32a5ce6c6927c986eaf217 F src/os.c 59f05de8c5777c34876607114a2fbe55ae578235 F src/os.h fa6fcf5e4614a20ca2c90cddda0b40199360f27e F src/os_common.h 545426356f0868a6765e70cb59e319d3acad0ed6 -F src/os_os2.c 361964755f361b5ba879549c201284ce61ee9431 +F src/os_os2.c c1bfc0c326f63caf0c94ab5523010ce0f5458070 F src/os_os2.h e5f17dd69333632bbc3112881ea407c37d245eb3 F src/os_test.c 49833426101f99aee4bb5f6a44b7c4b2029fda1c F src/os_test.h 903c93554c23d88f34f667f1979e4a1cee792af3 -F src/os_unix.c 523b674d93e0017320bb48b83fc0f9c9d07d3548 +F src/os_unix.c f9a46b57af055b2c02ec040c86ab74111eca12e8 F src/os_unix.h 5768d56d28240d3fe4537fac08cc85e4fb52279e -F src/os_win.c 1be3a56e96eae0561c000ba70428294a1621960d +F src/os_win.c 06e11389bd7680adb75865e5e8ee48e28d2352e5 F src/os_win.h 41a946bea10f61c158ce8645e7646b29d44f122b -F src/pager.c a1293bb4d318cfa9fa7100a08c38ad5598cb4436 -F src/pager.h 0cff9de5e9019cb695a04d18df8caaaff933a272 +F src/pager.c 3114c819a6cb86a2499396819c5fd6f4f8165546 +F src/pager.h 2e6d42f4ae004ae748a037b8468112b851c447a7 F src/parse.y 8c79a1debbd92a4f5609511e9bf0222de78f5ecb F src/pragma.c 2ef4353448e202961a22312f34695128bbb6d69a F src/prepare.c 3d9a1bb0644e8bccb3b78cb0833d269719237f4e @@ -419,7 +419,7 @@ F www/tclsqlite.tcl bb0d1357328a42b1993d78573e587c6dcbc964b9 F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0 F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b F www/whentouse.tcl 97e2b5cd296f7d8057e11f44427dea8a4c2db513 -P 35c8c4781736d45019d8b823b8517c24622d3313 -R 72648fe2d8ddbd1ade2ac2a1d6675f54 +P 9bf153b54c6e9ba16914dedd9e2949f32d7550ea +R b573ccb3eff0c85b71bcf63ab1ad1984 U drh -Z 542e53251a657546cd65151f3319f13c +Z 3b4e8d75bb8a7df67499084016ece007 diff --git a/manifest.uuid b/manifest.uuid index 60ff4f74e6..59254c2296 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9bf153b54c6e9ba16914dedd9e2949f32d7550ea \ No newline at end of file +6324ea811eec1200cee89e6f377368eaf2fcda77 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index b683d20894..322199bf0d 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.329 2006/11/01 12:08:41 drh Exp $ +** $Id: btree.c,v 1.330 2006/11/06 21:20:26 drh Exp $ ** ** This file implements a external (disk-based) database using BTrees. ** For a detailed discussion of BTrees, refer to @@ -1549,8 +1549,13 @@ int sqlite3BtreeOpen( return SQLITE_NOMEM; } rc = sqlite3pager_open(&pBt->pPager, zFilename, EXTRA_SIZE, flags); + if( rc==SQLITE_OK ){ + rc = sqlite3pager_read_fileheader(pBt->pPager,sizeof(zDbHeader),zDbHeader); + } if( rc!=SQLITE_OK ){ - if( pBt->pPager ) sqlite3pager_close(pBt->pPager); + if( pBt->pPager ){ + sqlite3pager_close(pBt->pPager); + } sqliteFree(pBt); sqliteFree(p); *ppBtree = 0; @@ -1563,7 +1568,6 @@ int sqlite3BtreeOpen( pBt->pCursor = 0; pBt->pPage1 = 0; pBt->readOnly = sqlite3pager_isreadonly(pBt->pPager); - sqlite3pager_read_fileheader(pBt->pPager, sizeof(zDbHeader), zDbHeader); pBt->pageSize = get2byte(&zDbHeader[16]); if( pBt->pageSize<512 || pBt->pageSize>SQLITE_MAX_PAGE_SIZE || ((pBt->pageSize-1)&pBt->pageSize)!=0 ){ diff --git a/src/os_os2.c b/src/os_os2.c index b29e965a5d..bdb31b8213 100644 --- a/src/os_os2.c +++ b/src/os_os2.c @@ -290,7 +290,7 @@ int os2Read( OsFile *id, void *pBuf, int amt ){ SimulateIOError( return SQLITE_IOERR ); TRACE3( "READ %d lock=%d\n", ((os2File*)id)->h, ((os2File*)id)->locktype ); DosRead( ((os2File*)id)->h, pBuf, amt, &got ); - return (got == (ULONG)amt) ? SQLITE_OK : SQLITE_IOERR; + return (got == (ULONG)amt) ? SQLITE_OK : SQLITE_IOERR_SHORT_READ; } /* diff --git a/src/os_unix.c b/src/os_unix.c index 4aa8ad0232..3152190c46 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -1026,7 +1026,7 @@ static int unixRead(OsFile *id, void *pBuf, int amt){ TRACE5("READ %-3d %5d %7d %d\n", ((unixFile*)id)->h, got, last_page, TIMER_ELAPSED); SEEK(0); - SimulateIOError( got=0 ); + SimulateIOError( got = -1 ); if( got==amt ){ return SQLITE_OK; }else if( got<0 ){ diff --git a/src/os_win.c b/src/os_win.c index dfb6bf800c..92c6b7e47d 100644 --- a/src/os_win.c +++ b/src/os_win.c @@ -993,12 +993,14 @@ static int winRead(OsFile *id, void *pBuf, int amt){ SimulateIOError(return SQLITE_IOERR); TRACE3("READ %d lock=%d\n", ((winFile*)id)->h, ((winFile*)id)->locktype); if( !ReadFile(((winFile*)id)->h, pBuf, amt, &got, 0) ){ - got = 0; + got = -1; } if( got==(DWORD)amt ){ return SQLITE_OK; + }else if( goc<0 ){ + return SQLITE_IOERR_READ; }else{ - return SQLITE_IOERR; + return SQLITE_IOERR_SHORT_READ; } } diff --git a/src/pager.c b/src/pager.c index 3129bcd940..16b3d350c6 100644 --- a/src/pager.c +++ b/src/pager.c @@ -18,7 +18,7 @@ ** file simultaneously, or one process from reading the database while ** another is writing. ** -** @(#) $Id: pager.c,v 1.274 2006/10/03 19:05:19 drh Exp $ +** @(#) $Id: pager.c,v 1.275 2006/11/06 21:20:26 drh Exp $ */ #ifndef SQLITE_OMIT_DISKIO #include "sqliteInt.h" @@ -1798,14 +1798,19 @@ void enable_simulated_io_errors(void){ ** response is to zero the memory at pDest and continue. A real IO error ** will presumably recur and be picked up later (Todo: Think about this). */ -void sqlite3pager_read_fileheader(Pager *pPager, int N, unsigned char *pDest){ +int sqlite3pager_read_fileheader(Pager *pPager, int N, unsigned char *pDest){ + int rc = SQLITE_OK; memset(pDest, 0, N); if( MEMDB==0 ){ disable_simulated_io_errors(); sqlite3OsSeek(pPager->fd, 0); - sqlite3OsRead(pPager->fd, pDest, N); enable_simulated_io_errors(); + rc = sqlite3OsRead(pPager->fd, pDest, N); + if( rc==SQLITE_IOERR_SHORT_READ ){ + rc = SQLITE_OK; + } } + return rc; } /* @@ -2789,19 +2794,10 @@ int sqlite3pager_get(Pager *pPager, Pgno pgno, void **ppPage){ } TRACE3("FETCH %d page %d\n", PAGERID(pPager), pPg->pgno); CODEC1(pPager, PGHDR_TO_DATA(pPg), pPg->pgno, 3); - if( rc!=SQLITE_OK ){ - i64 fileSize; - int rc2 = sqlite3OsFileSize(pPager->fd, &fileSize); - if( rc2!=SQLITE_OK || fileSize>=pgno*pPager->pageSize ){ - /* An IO error occured in one of the the sqlite3OsSeek() or - ** sqlite3OsRead() calls above. */ - pPg->pgno = 0; - sqlite3pager_unref(PGHDR_TO_DATA(pPg)); - return rc; - }else{ - clear_simulated_io_error(); - memset(PGHDR_TO_DATA(pPg), 0, pPager->pageSize); - } + if( rc!=SQLITE_OK && rc!=SQLITE_IOERR_SHORT_READ ){ + pPg->pgno = 0; + sqlite3pager_unref(PGHDR_TO_DATA(pPg)); + return rc; }else{ TEST_INCR(pPager->nRead); } diff --git a/src/pager.h b/src/pager.h index 8b9c6e7528..ca5711457b 100644 --- a/src/pager.h +++ b/src/pager.h @@ -13,7 +13,7 @@ ** subsystem. The page cache subsystem reads and writes a file a page ** at a time and provides a journal for rollback. ** -** @(#) $Id: pager.h,v 1.51 2006/08/08 13:51:43 drh Exp $ +** @(#) $Id: pager.h,v 1.52 2006/11/06 21:20:26 drh Exp $ */ #ifndef _PAGER_H_ @@ -75,7 +75,7 @@ void sqlite3pager_set_busyhandler(Pager*, BusyHandler *pBusyHandler); void sqlite3pager_set_destructor(Pager*, void(*)(void*,int)); void sqlite3pager_set_reiniter(Pager*, void(*)(void*,int)); int sqlite3pager_set_pagesize(Pager*, int); -void sqlite3pager_read_fileheader(Pager*, int, unsigned char*); +int sqlite3pager_read_fileheader(Pager*, int, unsigned char*); void sqlite3pager_set_cachesize(Pager*, int); int sqlite3pager_close(Pager *pPager); int sqlite3pager_get(Pager *pPager, Pgno pgno, void **ppPage);