mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-08 14:02:16 +03:00
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
This commit is contained in:
22
manifest
22
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
|
||||
|
@@ -1 +1 @@
|
||||
9bf153b54c6e9ba16914dedd9e2949f32d7550ea
|
||||
6324ea811eec1200cee89e6f377368eaf2fcda77
|
10
src/btree.c
10
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 ){
|
||||
|
@@ -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;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@@ -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 ){
|
||||
|
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
22
src/pager.c
22
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. */
|
||||
if( rc!=SQLITE_OK && rc!=SQLITE_IOERR_SHORT_READ ){
|
||||
pPg->pgno = 0;
|
||||
sqlite3pager_unref(PGHDR_TO_DATA(pPg));
|
||||
return rc;
|
||||
}else{
|
||||
clear_simulated_io_error();
|
||||
memset(PGHDR_TO_DATA(pPg), 0, pPager->pageSize);
|
||||
}
|
||||
}else{
|
||||
TEST_INCR(pPager->nRead);
|
||||
}
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user