]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix cases where xRead() was being used to read from a memory mapped part of the datab...
authordan <dan@noemail.net>
Thu, 21 Mar 2013 20:39:55 +0000 (20:39 +0000)
committerdan <dan@noemail.net>
Thu, 21 Mar 2013 20:39:55 +0000 (20:39 +0000)
FossilOrigin-Name: 5c9e9df27b9f2c46cd55388a858d4e78ee564975

manifest
manifest.uuid
src/pager.c

index b91c073e14af3e819f4a1704509bbd1513a703a4..4b2a8a6d5df1892b2390538556da955575e4ac71 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Avoid\scalling\sxRead()\son\sa\spart\sof\sthe\sdatabase\sfile\sthat\sis\smemory\smapped.
-D 2013-03-21T20:00:07.703
+C Fix\scases\swhere\sxRead()\swas\sbeing\sused\sto\sread\sfrom\sa\smemory\smapped\spart\sof\sthe\sdatabase\sfile.
+D 2013-03-21T20:39:55.225
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 9a804abbd3cae82d196e4d33aba13239e32522a5
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -162,7 +162,7 @@ F src/os.h 8d92f87f5fe14b060a853ca704b8ef6d3daee79b
 F src/os_common.h 92815ed65f805560b66166e3583470ff94478f04
 F src/os_unix.c be66c31337361a72227638d6f41c7f2031739642
 F src/os_win.c f7da4dc0a2545c0a430080380809946ae4d676d6
-F src/pager.c 5ee2ec6a10aa3d85548e6f0337260f0b2a670899
+F src/pager.c 520001015155efee9599c807dfd38e5fff9c6e36
 F src/pager.h 241d72dc0905df042da165f086d03505cb0bb50c
 F src/parse.y 5d5e12772845805fdfeb889163516b84fbb9ae95
 F src/pcache.c f8043b433a57aba85384a531e3937a804432a346
@@ -1039,7 +1039,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh fbc018d67fd7395f440c28f33ef0f94420226381
 F tool/win/sqlite.vsix 97894c2790eda7b5bce3cc79cb2a8ec2fde9b3ac
-P 32e0bbb73609ac3ad096a60f1de3095bc79fb0cc
-R 78d8196d81dc00ab1ac5a50caf4d157f
+P c8eac290a7240d69494bd0dad5ed1fdc2505f703
+R 0cdb7517bc23cd336050741c62097e56
 U dan
-Z e76f59323062e94934c6de1e92e548e8
+Z 0dd43854f08b06a022f11b1a174cdf13
index 0a2c6d8ff41f83443e0e614dbe97f7c644ad9c60..50136e7e1b91d3f39fa2241234b8886577e74973 100644 (file)
@@ -1 +1 @@
-c8eac290a7240d69494bd0dad5ed1fdc2505f703
\ No newline at end of file
+5c9e9df27b9f2c46cd55388a858d4e78ee564975
\ No newline at end of file
index 913ae74c46af30048047c37b44cbc3827fde184c..0ff894bd877d6465a558602e8fc784c320721762 100644 (file)
@@ -2087,6 +2087,24 @@ static void pagerReportSize(Pager *pPager){
 # define pagerReportSize(X)     /* No-op if we do not support a codec */
 #endif
 
+/*
+** Write nBuf bytes of data from buffer pBuf to offset iOff of the 
+** database file. If this part of the database file is memory mapped,
+** use memcpy() to do so. Otherwise, call sqlite3OsWrite().
+**
+** Return SQLITE_OK if successful, or an SQLite error code if an error 
+** occurs.
+*/
+static int pagerWriteData(Pager *pPager, const void *pBuf, int nBuf, i64 iOff){
+  int rc = SQLITE_OK;
+  if( pPager->nMapValid>=(iOff+nBuf) ){
+    memcpy(&((u8 *)(pPager->pMap))[iOff], pBuf, nBuf);
+  }else{
+    rc = sqlite3OsWrite(pPager->fd, pBuf, nBuf, iOff);
+  }
+  return rc;
+}
+
 /*
 ** Read a single page from either the journal file (if isMainJrnl==1) or
 ** from the sub-journal (if isMainJrnl==0) and playback that page.
@@ -2261,7 +2279,7 @@ static int pager_playback_one_page(
     i64 ofst = (pgno-1)*(i64)pPager->pageSize;
     testcase( !isSavepnt && pPg!=0 && (pPg->flags&PGHDR_NEED_SYNC)!=0 );
     assert( !pagerUseWal(pPager) );
-    rc = sqlite3OsWrite(pPager->fd, (u8*)aData, pPager->pageSize, ofst);
+    rc = pagerWriteData(pPager, aData, pPager->pageSize, ofst);
     if( pgno>pPager->dbFileSize ){
       pPager->dbFileSize = pgno;
     }
@@ -3853,6 +3871,7 @@ static int pagerSyncHotJournal(Pager *pPager){
 ** Unmap any memory mapping of the database file.
 */
 static int pagerUnmap(Pager *pPager){
+  assert( pPager->nMmapOut==0 );
   if( pPager->pMap ){
     sqlite3OsMremap(pPager->fd, 0, 0, pPager->nMap, 0, &pPager->pMap);
     pPager->nMap = 0;
@@ -4282,11 +4301,7 @@ static int pager_write_pagelist(Pager *pPager, PgHdr *pList){
       CODEC2(pPager, pList->pData, pgno, 6, return SQLITE_NOMEM, pData);
 
       /* Write out the page data. */
-      if( pPager->nMapValid>=(offset+pPager->pageSize) ){
-        memcpy(&((u8 *)(pPager->pMap))[offset], pData, pPager->pageSize);
-      }else{
-        rc = sqlite3OsWrite(pPager->fd, pData, pPager->pageSize, offset);
-      }
+      pagerWriteData(pPager, pData, pPager->pageSize, offset);
 
       /* If page 1 was just written, update Pager.dbFileVers to match
       ** the value now stored in the database file. If writing this 
@@ -7086,6 +7101,8 @@ int sqlite3PagerOpenWal(
   assert( pbOpen==0 || *pbOpen==0 );
   assert( pbOpen!=0 || (!pPager->tempFile && !pPager->pWal) );
 
+  pagerUnmap(pPager);
+
   if( !pPager->tempFile && !pPager->pWal ){
     if( !sqlite3PagerWalSupported(pPager) ) return SQLITE_CANTOPEN;