Compare commits

...

2 Commits

Author SHA1 Message Date
mistachkin f623d90a79 Experimental changes to use GetFileInformationByHandle instead of GetFileSize in the Win32 VFS.
FossilOrigin-Name: d22c8142972dec13435f2023fbaf51dd012b5896
2014-06-17 18:43:42 +00:00
drh d8cdc5a548 Add sqlite3_log() diagnostic messages for a specific type of corruption
where the file size is reported to be too small relative to the size in
the header.  This branch is intended to help debug a specific problem
reported from the wild and is not for general use.

FossilOrigin-Name: 34155c406c7135accdc25e4828cb28137d3840fb
2014-04-24 13:20:33 +00:00
7 changed files with 43 additions and 22 deletions
+11 -11
View File
@@ -1,5 +1,5 @@
C Version\s3.7.8\srelease\scandidate
D 2011-09-19T14:49:19.255
C Experimental\schanges\sto\suse\sGetFileInformationByHandle\sinstead\sof\sGetFileSize\sin\sthe\sWin32\sVFS.
D 2014-06-17T18:43:42.173
F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
F Makefile.in d314143fa6be24828021d3f583ad37d9afdce505
F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -124,7 +124,7 @@ F src/auth.c 523da7fb4979469955d822ff9298352d6b31de34
F src/backup.c 28a4fe55327ff708bfaf9d4326d02686f7a553c3
F src/bitvec.c af50f1c8c0ff54d6bdb7a80e2fceca5a93670bef
F src/btmutex.c 976f45a12e37293e32cae0281b15a21d48a8aaa7
F src/btree.c 77b09c69d4849a90361e6fe5db36d167f20600c0
F src/btree.c 7339c511e4c356611ab059dd12980d9931dc5d48
F src/btree.h f5d775cd6cfc7ac32a2535b70e8d2af48ef5f2ce
F src/btreeInt.h 67978c014fa4f7cc874032dd3aacadd8db656bc3
F src/build.c 851e81f26a75abbb98bd99a7c5f10e8670d867bb
@@ -166,16 +166,16 @@ F src/os.h 9dbed8c2b9c1f2f2ebabc09e49829d4777c26bf9
F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04
F src/os_os2.c 4a75888ba3dfc820ad5e8177025972d74d7f2440
F src/os_unix.c 10e0c4dcdbec8d4189890fdf3e71b32efae194e3
F src/os_win.c 0fc0f46c94b0385a940b0ee32992a833019a5985
F src/pager.c 15d10371e2d560b68870a9ccec022ad8f01e70a2
F src/pager.h 3f8c783de1d4706b40b1ac15b64f5f896bcc78d1
F src/os_win.c 20a15a885fc5947fe8f9fc175049b5f7d30621ab
F src/pager.c ddf6e9950ccf70e2b7381d45120c14af910770b6
F src/pager.h 996123976d473220d2a9c3e8f8609e9cce1c87ee
F src/parse.y 12b7ebd61ea54f0e1b1083ff69cc2c8ce9353d58
F src/pcache.c 49e718c095810c6b3334e3a6d89970aceaddefce
F src/pcache.h c683390d50f856d4cd8e24342ae62027d1bb6050
F src/pcache1.c c8982f7048a70b7fd37975a8f6c84d6bc294175a
F src/pragma.c ebcd20f1e654f5cb3aeef864ed69c4697719fbaa
F src/prepare.c e64261559a3187698a3e7e6c8b001a4f4f98dab4
F src/printf.c 585a36b6a963df832cfb69505afa3a34ed5ef8a1
F src/printf.c eca1a6289fa6e2ea71a45174d5c8bc862e5fb0fb
F src/random.c cd4a67b3953b88019f8cd4ccd81394a8ddfaba50
F src/resolve.c 36368f44569208fa074e61f4dd0b6c4fb60ca2b4
F src/rowset.c 69afa95a97c524ba6faf3805e717b5b7ae85a697
@@ -963,7 +963,7 @@ F tool/symbols.sh caaf6ccc7300fd43353318b44524853e222557d5
F tool/tostr.awk e75472c2f98dd76e06b8c9c1367f4ab07e122d06
F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f
F tool/warnings.sh b7fdb2cc525f5ef4fa43c80e771636dd3690f9d2
P db019465036171fcad31181bec7d6ac185f50430
R 0a2782a80f1b08369498ecce1d7a7aa8
U drh
Z 5f8dabab2a44903caad40fc4aceed901
P 34155c406c7135accdc25e4828cb28137d3840fb
R 3058df9a712ad8bd7e6e0b38ee343f17
U mistachkin
Z 237e76772eab49f2aa7f7ab4b4f8db7b
+1 -1
View File
@@ -1 +1 @@
3e0da808d2f5b4d12046e05980ca04578f581177
d22c8142972dec13435f2023fbaf51dd012b5896
+2
View File
@@ -2393,6 +2393,8 @@ static int lockBtree(BtShared *pBt){
return rc;
}
if( (pBt->db->flags & SQLITE_RecoveryMode)==0 && nPage>nPageFile ){
sqlite3_log(SQLITE_CORRUPT, "nPage=%d nPageFile=%d", nPage, nPageFile);
sqlite3PagerLogDiagnostics(pBt->pPager);
rc = SQLITE_CORRUPT_BKPT;
goto page1_init_failed;
}
+8 -10
View File
@@ -1305,22 +1305,20 @@ static int winSync(sqlite3_file *id, int flags){
** Determine the current size of a file in bytes
*/
static int winFileSize(sqlite3_file *id, sqlite3_int64 *pSize){
DWORD upperBits;
DWORD lowerBits;
BY_HANDLE_FILE_INFORMATION info;
winFile *pFile = (winFile*)id;
DWORD error;
assert( id!=0 );
SimulateIOError(return SQLITE_IOERR_FSTAT);
lowerBits = GetFileSize(pFile->h, &upperBits);
if( (lowerBits == INVALID_FILE_SIZE)
&& ((error = GetLastError()) != NO_ERROR) )
{
pFile->lastErrno = error;
memset(&info, 0, sizeof(BY_HANDLE_FILE_INFORMATION));
if( GetFileInformationByHandle(pFile->h, &info) ){
*pSize = (((u64)info.nFileSizeHigh)<<32) + info.nFileSizeLow;
return SQLITE_OK;
}else{
pFile->lastErrno = GetLastError();
return winLogError(SQLITE_IOERR_FSTAT, "winFileSize", pFile->zPath);
}
*pSize = (((sqlite3_int64)upperBits)<<32) + lowerBits;
return SQLITE_OK;
}
/*
+19
View File
@@ -3092,6 +3092,25 @@ static int pagerPagecount(Pager *pPager, Pgno *pnPage){
return SQLITE_OK;
}
/* Log diagnostic information about the pager */
void sqlite3PagerLogDiagnostics(Pager *pPager){
int rc;
i64 n;
sqlite3_log(SQLITE_INTERNAL, "Pager filename=[%s]", pPager->zFilename);
sqlite3_log(SQLITE_INTERNAL, "Pager journal=[%s]", pPager->zJournal);
sqlite3_log(SQLITE_INTERNAL,
"Pager diagnostics: pWal=%p isOpen=%d pageSize=%d dbSize=%d eState=%d",
pPager->pWal, isOpen(pPager->fd)!=0,
pPager->pageSize, pPager->dbSize, pPager->eState
);
if( isOpen(pPager->fd) ){
n = 0;
rc = sqlite3OsFileSize(pPager->fd, &n);
sqlite3_log(SQLITE_INTERNAL, "Pager OsFileSize: %lld (%d)", n, rc);
}
}
#ifndef SQLITE_OMIT_WAL
/*
** Check if the *-wal file that corresponds to the database opened by pPager
+1
View File
@@ -155,6 +155,7 @@ const char *sqlite3PagerJournalname(Pager*);
int sqlite3PagerNosync(Pager*);
void *sqlite3PagerTempSpace(Pager*);
int sqlite3PagerIsMemdb(Pager*);
void sqlite3PagerLogDiagnostics(Pager*);
/* Functions used to truncate the database file. */
void sqlite3PagerTruncateImage(Pager*,Pgno);
+1
View File
@@ -189,6 +189,7 @@ static void appendSpace(StrAccum *pAccum, int N){
** On machines with a small stack size, you can redefine the
** SQLITE_PRINT_BUF_SIZE to be less than 350.
*/
#define SQLITE_PRINT_BUF_SIZE 2000
#ifndef SQLITE_PRINT_BUF_SIZE
# if defined(SQLITE_SMALL_STACK)
# define SQLITE_PRINT_BUF_SIZE 50