-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
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
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
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
-9bf153b54c6e9ba16914dedd9e2949f32d7550ea
\ No newline at end of file
+6324ea811eec1200cee89e6f377368eaf2fcda77
\ No newline at end of file
** 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
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;
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 ){
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;
}
/*
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 ){
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;
}
}
** 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"
** 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;
}
/*
}
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);
}
** 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_
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);