From: dan Date: Thu, 21 Mar 2013 20:39:55 +0000 (+0000) Subject: Fix cases where xRead() was being used to read from a memory mapped part of the datab... X-Git-Tag: version-3.7.17~114^2~61 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b26e6c14fe6b89b89c0281319743e488d8bfe6ec;p=thirdparty%2Fsqlite.git Fix cases where xRead() was being used to read from a memory mapped part of the database file. FossilOrigin-Name: 5c9e9df27b9f2c46cd55388a858d4e78ee564975 --- diff --git a/manifest b/manifest index b91c073e14..4b2a8a6d5d 100644 --- 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 diff --git a/manifest.uuid b/manifest.uuid index 0a2c6d8ff4..50136e7e1b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c8eac290a7240d69494bd0dad5ed1fdc2505f703 \ No newline at end of file +5c9e9df27b9f2c46cd55388a858d4e78ee564975 \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index 913ae74c46..0ff894bd87 100644 --- a/src/pager.c +++ b/src/pager.c @@ -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;