]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Avoid non-contiguous writes when creating a journal header. (CVS 5035)
authordanielk1977 <danielk1977@noemail.net>
Tue, 22 Apr 2008 14:31:48 +0000 (14:31 +0000)
committerdanielk1977 <danielk1977@noemail.net>
Tue, 22 Apr 2008 14:31:48 +0000 (14:31 +0000)
FossilOrigin-Name: dfacddbb5055b4e104bf536d5f5b35287fbbb904

manifest
manifest.uuid
src/pager.c

index aff99292ec34f9638c6ef416c6bc90a3a70abef4..83d4c056173976e3844c86249d92918578dca7a1 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\ssome\stests\sfor\sjournal_mode=off.\s\sNeed\sto\scome\sup\swith\sa\sway\sof\shandling\nrollback\sattempts\swhen\sthere\sis\sno\sjournal.\s(CVS\s5034)
-D 2008-04-19T20:53:26
+C Avoid\snon-contiguous\swrites\swhen\screating\sa\sjournal\sheader.\s(CVS\s5035)
+D 2008-04-22T14:31:48
 F Makefile.arm-wince-mingw32ce-gcc ac5f7b2cef0cd850d6f755ba6ee4ab961b1fadf7
 F Makefile.in 25b3282a4ac39388632c2fb0e044ff494d490952
 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -127,7 +127,7 @@ F src/os_unix.c fdec4e5ee5dd555a6ad4a69f38ab35f0788536b4
 F src/os_unix.h 5768d56d28240d3fe4537fac08cc85e4fb52279e
 F src/os_win.c 3a60bddd07ea6f8adb2314dd5996ac97b988f403
 F src/os_win.h 41a946bea10f61c158ce8645e7646b29d44f122b
-F src/pager.c 008ec5a602d2e8c2f46fff64468fffd6537ed938
+F src/pager.c e164d0fc4160e5a34e7633aa493194e20c41ee8a
 F src/pager.h 45ec2188593afd48a25c743529646771d75e83e4
 F src/parse.y fc4bd35c6088901f7c8daead26c6fb11c87d22e7
 F src/pragma.c 2e4bb2e76e48a32750529fdc4bfe86ac5f54e01b
@@ -635,7 +635,7 @@ F www/tclsqlite.tcl 8be95ee6dba05eabcd27a9d91331c803f2ce2130
 F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
 F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b
 F www/whentouse.tcl fc46eae081251c3c181bd79c5faef8195d7991a5
-P 277e4099cee9105e1801a6d7f5d477f0d2efa858
-R 91f87b04b1a638984e55a8af93bfa847
-U drh
-Z 5219086565bb85263845c2c6918f4999
+P e29b870ed0db6360a95fb017f56c0b5388efb437
+R 436443469e9b85c7665118e338b3a570
+U danielk1977
+Z 64c57677c26295d2b7511003088df817
index 3a294312aed12f4fc5b5f29ae877d7773b9dae31..7e043ac78d7dba0f3480b0e28dd59f6416e0d9ed 100644 (file)
@@ -1 +1 @@
-e29b870ed0db6360a95fb017f56c0b5388efb437
\ No newline at end of file
+dfacddbb5055b4e104bf536d5f5b35287fbbb904
\ No newline at end of file
index 5a18dfa1ef899a5be4f909c91c7d62cdfeb70607..6200772939469862d0e9ff304277a52786508fe2 100644 (file)
@@ -18,7 +18,7 @@
 ** file simultaneously, or one process from reading the database while
 ** another is writing.
 **
-** @(#) $Id: pager.c,v 1.431 2008/04/19 20:53:26 drh Exp $
+** @(#) $Id: pager.c,v 1.432 2008/04/22 14:31:48 danielk1977 Exp $
 */
 #ifndef SQLITE_OMIT_DISKIO
 #include "sqliteInt.h"
@@ -991,8 +991,14 @@ static int zeroJournalHdr(Pager *pPager){
 ** Followed by (JOURNAL_HDR_SZ - 28) bytes of unused space.
 */
 static int writeJournalHdr(Pager *pPager){
-  char zHeader[sizeof(aJournalMagic)+20];
-  int rc;
+  int rc = SQLITE_OK;
+  char *zHeader = pPager->pTmpSpace;
+  int nHeader = pPager->pageSize;
+  int nWrite;
+
+  if( nHeader>JOURNAL_HDR_SZ(pPager) ){
+    nHeader = JOURNAL_HDR_SZ(pPager);
+  }
 
   if( pPager->stmtHdrOff==0 ){
     pPager->stmtHdrOff = pPager->journalOff;
@@ -1043,17 +1049,13 @@ static int writeJournalHdr(Pager *pPager){
     /* The page size */
     put32bits(&zHeader[sizeof(aJournalMagic)+16], pPager->pageSize);
   }
-  IOTRACE(("JHDR %p %lld %d\n", pPager, pPager->journalHdr, sizeof(zHeader)))
-  rc = sqlite3OsWrite(pPager->jfd, zHeader, sizeof(zHeader),pPager->journalOff);
-  pPager->journalOff += JOURNAL_HDR_SZ(pPager);
 
-  /* The journal header has been written successfully. Seek the journal
-  ** file descriptor to the end of the journal header sector.
-  */
-  if( rc==SQLITE_OK ){
-    IOTRACE(("JTAIL %p %lld\n", pPager, pPager->journalOff-1))
-    rc = sqlite3OsWrite(pPager->jfd, "\000", 1, pPager->journalOff-1);
+  for(nWrite=0; rc==SQLITE_OK&&nWrite<JOURNAL_HDR_SZ(pPager); nWrite+=nHeader){
+    IOTRACE(("JHDR %p %lld %d\n", pPager, pPager->journalHdr, nHeader))
+    rc = sqlite3OsWrite(pPager->jfd, zHeader, nHeader, pPager->journalOff);
+    pPager->journalOff += nHeader;
   }
+
   return rc;
 }