]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Use the difference between the SQLITE_IOERR_SHORT_READ and SQLITE_IOERR_READ
authordrh <drh@noemail.net>
Mon, 6 Nov 2006 21:20:25 +0000 (21:20 +0000)
committerdrh <drh@noemail.net>
Mon, 6 Nov 2006 21:20:25 +0000 (21:20 +0000)
returns from sqlite3OsRead() to make decisions about what to do with the
error. (CVS 3503)

FossilOrigin-Name: 6324ea811eec1200cee89e6f377368eaf2fcda77

manifest
manifest.uuid
src/btree.c
src/os_os2.c
src/os_unix.c
src/os_win.c
src/pager.c
src/pager.h

index e2a9a9fcf92b33df747512db230074b8ba209b4d..d42630072fd07d7a8e73f2c9689da3f4d320c9e1 100644 (file)
--- 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
index 60ff4f74e6fd9a2ceca33cb633350756812d9f79..59254c2296c44d02a1240486dba54f68040ee613 100644 (file)
@@ -1 +1 @@
-9bf153b54c6e9ba16914dedd9e2949f32d7550ea
\ No newline at end of file
+6324ea811eec1200cee89e6f377368eaf2fcda77
\ No newline at end of file
index b683d2089438c839ff71186693a8e7036535ea44..322199bf0d5687a6d636afd3eb4806bfba7f0458 100644 (file)
@@ -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 ){
index b29e965a5d195988baed54ebe232a188109feb92..bdb31b8213e6006b5d6f31006490aeb4728ecbfc 100644 (file)
@@ -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;
 }
 
 /*
index 4aa8ad0232a9146289f84c372e81e7eeefa80870..3152190c46a27df563e936214bc2ef064dc653ae 100644 (file)
@@ -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 ){
index dfb6bf800c5df5bc39a5690cbe22397c2bf83f00..92c6b7e47d560c487aa9c05c0aa5d01dd7580fa8 100644 (file)
@@ -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;
   }
 }
 
index 3129bcd9401081b17a1ef41eb44ab6325511ec37..16b3d350c6a1fa971c38ce72c42d62c387269433 100644 (file)
@@ -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);
       }
index 8b9c6e75286aded37cbfde36fd1bec71f644a899..ca5711457be404084db70c6cac6fcb5aa6a6e6bd 100644 (file)
@@ -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);