]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Another change to test_journal.c to account for (6817). Again, only test code has...
authordanielk1977 <danielk1977@noemail.net>
Fri, 26 Jun 2009 10:39:36 +0000 (10:39 +0000)
committerdanielk1977 <danielk1977@noemail.net>
Fri, 26 Jun 2009 10:39:36 +0000 (10:39 +0000)
FossilOrigin-Name: 58884b6c50f927c5606d857b2865d788a5147060

manifest
manifest.uuid
src/test_journal.c

index 4eac77ea18b7796173fea9f81b2f4f3128691ac3..d04f6a79d5cc4d68e2cf319af36f56f71754768f 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Update\stest_journal.c\sto\saccount\sfor\s(6817).\sChanges\sto\stest\scode\sonly.\s(CVS\s6818)
-D 2009-06-26T09:01:28
+C Another\schange\sto\stest_journal.c\sto\saccount\sfor\s(6817).\sAgain,\sonly\stest\scode\shas\schanged.\s(CVS\s6819)
+D 2009-06-26T10:39:36
 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0
 F Makefile.in 8b8fb7823264331210cddf103831816c286ba446
 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -184,7 +184,7 @@ F src/test_config.c 63d1b08809ca182ee75429573111b44735861c64
 F src/test_devsym.c 9f4bc2551e267ce7aeda195f3897d0f30c5228f4
 F src/test_func.c b8140bc4ed0d290d5e22972eb2a3bfd40aa798dc
 F src/test_hexio.c 2f1122aa3f012fa0142ee3c36ce5c902a70cd12f
-F src/test_journal.c de9b1c132fa7b81b40ddba1e1cc219cfa7f71593
+F src/test_journal.c dab49b7c47b53242f039c9563b18cafb67ebfe03
 F src/test_loadext.c 97dc8800e46a46ed002c2968572656f37e9c0dd9
 F src/test_malloc.c c3aabe4b48d1f4f1e78b6561ce92ca04b7495ee5
 F src/test_md5.c 032ae2bb6f81da350d2404e81fa8d560c8268026
@@ -737,7 +737,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff
 F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224
 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e
 F tool/vdbe-compress.tcl 672f81d693a03f80f5ae60bfefacd8a349e76746
-P a5ecffcf025da2fcb241e83c7bebc1095a3b51d6
-R c676cf0f55e46f711692cbb781213a1a
+P 542ee8cced2a37095808d8baf5002dc66f4a64d6
+R c84107e8653fbec4d656c36416c49db0
 U danielk1977
-Z afb621a0d984d29cdcb0c1a658c4dfbf
+Z 3ae5a098ab66146aa838154cfa456687
index 539a3f2c68bf33d7ee2e954d830774c4fa78b9d6..297be3ffe4f74859e1570e0546bc077ce4ed2b16 100644 (file)
@@ -1 +1 @@
-542ee8cced2a37095808d8baf5002dc66f4a64d6
\ No newline at end of file
+58884b6c50f927c5606d857b2865d788a5147060
\ No newline at end of file
index d5fd5da68c6d357b13a694868df46bb13107c96a..9db8b3864f7fb61bcd65dbf9ee5fc7fc42060e9a 100644 (file)
@@ -15,7 +15,7 @@
 ** correctly populates and syncs a journal file before writing to a
 ** corresponding database file.
 **
-** $Id: test_journal.c,v 1.16 2009/06/26 09:01:28 danielk1977 Exp $
+** $Id: test_journal.c,v 1.17 2009/06/26 10:39:36 danielk1977 Exp $
 */
 #if SQLITE_TEST          /* This file is used for testing only */
 
@@ -218,12 +218,16 @@ static void leaveJtMutex(void){
 }
 
 extern int sqlite3_io_error_pending;
-static void stop_ioerr_simulation(int *piSave){
+extern int sqlite3_io_error_hit;
+static void stop_ioerr_simulation(int *piSave, int *piSave2){
   *piSave = sqlite3_io_error_pending;
+  *piSave2 = sqlite3_io_error_hit;
   sqlite3_io_error_pending = -1;
+  sqlite3_io_error_hit = 0;
 }
-static void start_ioerr_simulation(int iSave){
+static void start_ioerr_simulation(int iSave, int iSave2){
   sqlite3_io_error_pending = iSave;
+  sqlite3_io_error_hit = iSave2;
 }
 
 /*
@@ -366,8 +370,9 @@ static int openTransaction(jt_file *pMain, jt_file *pJournal){
   }else if( pMain->nPage>0 ){
     u32 iTrunk;
     int iSave;
+    int iSave2;
 
-    stop_ioerr_simulation(&iSave);
+    stop_ioerr_simulation(&iSave, &iSave2);
 
     /* Read the database free-list. Add the page-number for each free-list
     ** leaf to the jt_file.pWritable bitvec.
@@ -398,91 +403,13 @@ static int openTransaction(jt_file *pMain, jt_file *pJournal){
       }
     }
 
-    start_ioerr_simulation(iSave);
+    start_ioerr_simulation(iSave, iSave2);
   }
 
   sqlite3_free(aData);
   return rc;
 }
 
-/*
-** Write data to an jt-file.
-*/
-static int jtWrite(
-  sqlite3_file *pFile, 
-  const void *zBuf, 
-  int iAmt, 
-  sqlite_int64 iOfst
-){
-  jt_file *p = (jt_file *)pFile;
-  if( p->flags&SQLITE_OPEN_MAIN_JOURNAL ){
-    if( iOfst==0 ){
-      jt_file *pMain = locateDatabaseHandle(p->zName);
-      assert( pMain );
-  
-      if( iAmt==28 ){
-        /* Zeroing the first journal-file header. This is the end of a
-        ** transaction. */
-        closeTransaction(pMain);
-      }else if( iAmt!=12 ){
-        /* Writing the first journal header to a journal file. This happens
-        ** when a transaction is first started.  */
-        int rc;
-        u8 *z = (u8 *)zBuf;
-        pMain->nPage = decodeUint32(&z[16]);
-        pMain->nPagesize = decodeUint32(&z[24]);
-        if( SQLITE_OK!=(rc=openTransaction(pMain, p)) ){
-          return rc;
-        }
-      }
-    }
-    if( p->iMaxOff<(iOfst + iAmt) ){
-      p->iMaxOff = iOfst + iAmt;
-    }
-  }
-
-  if( p->flags&SQLITE_OPEN_MAIN_DB && p->pWritable ){
-    if( iAmt<p->nPagesize 
-     && p->nPagesize%iAmt==0 
-     && iOfst>=(PENDING_BYTE+512) 
-     && iOfst+iAmt<=PENDING_BYTE+p->nPagesize
-    ){
-      /* No-op. This special case is hit when the backup code is copying a
-      ** to a database with a larger page-size than the source database and
-      ** it needs to fill in the non-locking-region part of the original
-      ** pending-byte page.
-      */
-    }else{
-      u32 pgno = iOfst/p->nPagesize + 1;
-      assert( (iAmt==1||iAmt==p->nPagesize) && ((iOfst+iAmt)%p->nPagesize)==0 );
-      assert( pgno<=p->nPage || p->nSync>0 );
-      assert( pgno>p->nPage || sqlite3BitvecTest(p->pWritable, pgno) );
-    }
-  }
-
-  return sqlite3OsWrite(p->pReal, zBuf, iAmt, iOfst);
-}
-
-/*
-** Truncate an jt-file.
-*/
-static int jtTruncate(sqlite3_file *pFile, sqlite_int64 size){
-  jt_file *p = (jt_file *)pFile;
-  if( p->flags&SQLITE_OPEN_MAIN_JOURNAL && size==0 ){
-    /* Truncating a journal file. This is the end of a transaction. */
-    jt_file *pMain = locateDatabaseHandle(p->zName);
-    closeTransaction(pMain);
-  }
-  if( p->flags&SQLITE_OPEN_MAIN_DB && p->pWritable ){
-    u32 pgno;
-    u32 locking_page = (u32)(PENDING_BYTE/p->nPagesize+1);
-    for(pgno=size/p->nPagesize+1; pgno<=p->nPage; pgno++){
-      assert( pgno==locking_page || sqlite3BitvecTest(p->pWritable, pgno) );
-    }
-  }
-  return sqlite3OsTruncate(p->pReal, size);
-}
-
 /*
 ** The first argument to this function is a handle open on a journal file.
 ** This function reads the journal file and adds the page number for each
@@ -496,13 +423,14 @@ static int readJournalFile(jt_file *p, jt_file *pMain){
   sqlite3_int64 iSize = p->iMaxOff;
   unsigned char *aPage;
   int iSave;
+  int iSave2;
 
   aPage = sqlite3_malloc(pMain->nPagesize);
   if( !aPage ){
     return SQLITE_IOERR_NOMEM;
   }
 
-  stop_ioerr_simulation(&iSave);
+  stop_ioerr_simulation(&iSave, &iSave2);
 
   while( rc==SQLITE_OK && iOff<iSize ){
     u32 nRec, nPage, nSector, nPagesize;
@@ -555,7 +483,7 @@ static int readJournalFile(jt_file *p, jt_file *pMain){
   }
 
 finish_rjf:
-  start_ioerr_simulation(iSave);
+  start_ioerr_simulation(iSave, iSave2);
   sqlite3_free(aPage);
   if( rc==SQLITE_IOERR_SHORT_READ ){
     rc = SQLITE_OK;
@@ -563,6 +491,91 @@ finish_rjf:
   return rc;
 }
 
+
+/*
+** Write data to an jt-file.
+*/
+static int jtWrite(
+  sqlite3_file *pFile, 
+  const void *zBuf, 
+  int iAmt, 
+  sqlite_int64 iOfst
+){
+  int rc;
+  jt_file *p = (jt_file *)pFile;
+  if( p->flags&SQLITE_OPEN_MAIN_JOURNAL ){
+    if( iOfst==0 ){
+      jt_file *pMain = locateDatabaseHandle(p->zName);
+      assert( pMain );
+  
+      if( iAmt==28 ){
+        /* Zeroing the first journal-file header. This is the end of a
+        ** transaction. */
+        closeTransaction(pMain);
+      }else if( iAmt!=12 ){
+        /* Writing the first journal header to a journal file. This happens
+        ** when a transaction is first started.  */
+        u8 *z = (u8 *)zBuf;
+        pMain->nPage = decodeUint32(&z[16]);
+        pMain->nPagesize = decodeUint32(&z[24]);
+        if( SQLITE_OK!=(rc=openTransaction(pMain, p)) ){
+          return rc;
+        }
+      }
+    }
+    if( p->iMaxOff<(iOfst + iAmt) ){
+      p->iMaxOff = iOfst + iAmt;
+    }
+  }
+
+  if( p->flags&SQLITE_OPEN_MAIN_DB && p->pWritable ){
+    if( iAmt<p->nPagesize 
+     && p->nPagesize%iAmt==0 
+     && iOfst>=(PENDING_BYTE+512) 
+     && iOfst+iAmt<=PENDING_BYTE+p->nPagesize
+    ){
+      /* No-op. This special case is hit when the backup code is copying a
+      ** to a database with a larger page-size than the source database and
+      ** it needs to fill in the non-locking-region part of the original
+      ** pending-byte page.
+      */
+    }else{
+      u32 pgno = iOfst/p->nPagesize + 1;
+      assert( (iAmt==1||iAmt==p->nPagesize) && ((iOfst+iAmt)%p->nPagesize)==0 );
+      assert( pgno<=p->nPage || p->nSync>0 );
+      assert( pgno>p->nPage || sqlite3BitvecTest(p->pWritable, pgno) );
+    }
+  }
+
+  rc = sqlite3OsWrite(p->pReal, zBuf, iAmt, iOfst);
+  if( (p->flags&SQLITE_OPEN_MAIN_JOURNAL) && iAmt==12 ){
+    jt_file *pMain = locateDatabaseHandle(p->zName);
+    int rc2 = readJournalFile(p, pMain);
+    if( rc==SQLITE_OK ) rc = rc2;
+  }
+  return rc;
+}
+
+/*
+** Truncate an jt-file.
+*/
+static int jtTruncate(sqlite3_file *pFile, sqlite_int64 size){
+  jt_file *p = (jt_file *)pFile;
+  if( p->flags&SQLITE_OPEN_MAIN_JOURNAL && size==0 ){
+    /* Truncating a journal file. This is the end of a transaction. */
+    jt_file *pMain = locateDatabaseHandle(p->zName);
+    closeTransaction(pMain);
+  }
+  if( p->flags&SQLITE_OPEN_MAIN_DB && p->pWritable ){
+    u32 pgno;
+    u32 locking_page = (u32)(PENDING_BYTE/p->nPagesize+1);
+    for(pgno=size/p->nPagesize+1; pgno<=p->nPage; pgno++){
+      assert( pgno==locking_page || sqlite3BitvecTest(p->pWritable, pgno) );
+    }
+  }
+  return sqlite3OsTruncate(p->pReal, size);
+}
+
 /*
 ** Sync an jt-file.
 */