From: drh Date: Tue, 6 Mar 2018 04:01:08 +0000 (+0000) Subject: Improvements to the memdb VFS. X-Git-Tag: version-3.23.0~85^2~4 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5f9d192de9a336f8bb3ed63181cf190d06c60ee0;p=thirdparty%2Fsqlite.git Improvements to the memdb VFS. FossilOrigin-Name: a14fed69d0d4932fc6c71cf8acc5199cca4efbd10bca563a8e86038d6afd5c64 --- diff --git a/manifest b/manifest index 0daa75ee51..3dabf8b492 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\sthe\swalIteratorInit()\sfix\sfrom\strunk. -D 2018-03-06T02:00:20.576 +C Improvements\sto\sthe\smemdb\sVFS. +D 2018-03-06T04:01:08.317 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 1d5a68043cc4d8a6e45b37e2639b148cdd7973aa75e90ec71e12d55cd95e32c0 @@ -460,7 +460,7 @@ F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3 F src/mem3.c 8768ac94694f31ffaf8b4d0ea5dc08af7010a35a F src/mem5.c 9bf955937b07f8c32541c8a9991f33ce3173d944 -F src/memdb.c f01e30a224d22e0487bf42028249d09ddccfed18ac03002d24b70a832d53ac1e +F src/memdb.c a559d61e55a715ec48b48685d20431fde1e114fb4df689df89334cedf4c0101c F src/memjournal.c 6f3d36a0a8f72f48f6c3c722f04301ac64f2515435fa42924293e46fc7994661 F src/msvc.h 4942752b6a253116baaa8de75256c51a459a5e81 F src/mutex.c b021263554c8a3995e9d53193b8194b96d1ed28e06c3b532dd7f7d29cf0c7d53 @@ -1710,7 +1710,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 6274cf1f397d36be9e9b65b1935a776c834e4512e0e89f82c132efd4d1e8ef82 e5ce256aa1f7a8ae995b79c9da895827bee5d8d0724fc15413ff203dc9e2602d -R 4fdec0179640fc276902d16463f8cb6d +P 6399e101d5f6b8582640e0d90783e56042eaa1600db3bd02f8df5e7b01ac1cab +R 308fbe14b615cda601b7af6fc89baf23 U drh -Z bbb52f4afaed03841603241952a4da37 +Z b79ee0d17ceeeb3759cd662f53a7e6c2 diff --git a/manifest.uuid b/manifest.uuid index 854da70375..bbe7322aa5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6399e101d5f6b8582640e0d90783e56042eaa1600db3bd02f8df5e7b01ac1cab \ No newline at end of file +a14fed69d0d4932fc6c71cf8acc5199cca4efbd10bca563a8e86038d6afd5c64 \ No newline at end of file diff --git a/src/memdb.c b/src/memdb.c index 24c676e75d..ec917e776b 100644 --- a/src/memdb.c +++ b/src/memdb.c @@ -53,7 +53,7 @@ static int memdbFileSize(sqlite3_file*, sqlite3_int64 *pSize); static int memdbLock(sqlite3_file*, int); static int memdbCheckReservedLock(sqlite3_file*, int *pResOut); static int memdbFileControl(sqlite3_file*, int op, void *pArg); -static int memdbSectorSize(sqlite3_file*); +/* static int memdbSectorSize(sqlite3_file*); // not used */ static int memdbDeviceCharacteristics(sqlite3_file*); static int memdbFetch(sqlite3_file*, sqlite3_int64 iOfst, int iAmt, void **pp); static int memdbUnfetch(sqlite3_file*, sqlite3_int64 iOfst, void *p); @@ -109,7 +109,7 @@ static const sqlite3_io_methods memdb_io_methods = { memdbLock, /* xUnlock - same as xLock in this case */ memdbCheckReservedLock, /* xCheckReservedLock */ memdbFileControl, /* xFileControl */ - memdbSectorSize, /* xSectorSize */ + 0, /* memdbSectorSize,*/ /* xSectorSize */ memdbDeviceCharacteristics, /* xDeviceCharacteristics */ 0, /* xShmMap */ 0, /* xShmLock */ @@ -157,10 +157,11 @@ static int memdbRead( */ static int memdbEnlarge(MemFile *p, sqlite3_int64 newSz){ unsigned char *pNew; - if( (p->mFlags & SQLITE_DESERIALIZE_RESIZEABLE)==0 ) return SQLITE_FULL; - if( p->nMmap>0 ) return SQLITE_FULL; + if( (p->mFlags & SQLITE_DESERIALIZE_RESIZEABLE)==0 || p->nMmap>0 ){ + return SQLITE_FULL; + } pNew = sqlite3_realloc64(p->aData, newSz); - if( pNew==0 ) return SQLITE_FULL; + if( pNew==0 ) return SQLITE_NOMEM; p->aData = pNew; p->szMax = newSz; return SQLITE_OK; @@ -177,8 +178,11 @@ static int memdbWrite( ){ MemFile *p = (MemFile *)pFile; if( iOfst+iAmt>p->sz ){ - if( iOfst+iAmt>p->szMax && memdbEnlarge(p, (iOfst+iAmt)*2) ){ - return SQLITE_FULL; + int rc; + if( iOfst+iAmt>p->szMax + && (rc = memdbEnlarge(p, (iOfst+iAmt)*2))!=SQLITE_OK + ){ + return rc; } if( iOfst>p->sz ) memset(p->aData+p->sz, 0, iOfst-p->sz); p->sz = iOfst+iAmt; @@ -193,7 +197,10 @@ static int memdbWrite( static int memdbTruncate(sqlite3_file *pFile, sqlite_int64 size){ MemFile *p = (MemFile *)pFile; if( size>p->sz ){ - if( size>p->szMax && memdbEnlarge(p, size) ) return SQLITE_FULL; + int rc; + if( size>p->szMax && (rc = memdbEnlarge(p, size))!=SQLITE_OK ){ + return rc; + } memset(p->aData+p->sz, 0, size-p->sz); } p->sz = size; @@ -246,12 +253,14 @@ static int memdbFileControl(sqlite3_file *pFile, int op, void *pArg){ return rc; } +#if 0 /* Not used because of SQLITE_IOCAP_POWERSAFE_OVERWRITE */ /* ** Return the sector-size in bytes for an memdb-file. */ static int memdbSectorSize(sqlite3_file *pFile){ return 1024; } +#endif /* ** Return the device characteristic flags supported by an memdb-file. @@ -294,10 +303,12 @@ static int memdbOpen( int *pOutFlags ){ MemFile *p = (MemFile*)pFile; + if( (flags & SQLITE_OPEN_MAIN_DB)==0 ){ + return ORIGVFS(pVfs)->xOpen(ORIGVFS(pVfs), zName, pFile, flags, pOutFlags); + } memset(p, 0, sizeof(*p)); - if( (flags & SQLITE_OPEN_MAIN_DB)==0 ) return SQLITE_CANTOPEN; p->mFlags = SQLITE_DESERIALIZE_RESIZEABLE | SQLITE_DESERIALIZE_FREEONCLOSE; - *pOutFlags = flags | SQLITE_OPEN_MEMORY; + if( pOutFlags ) *pOutFlags = flags | SQLITE_OPEN_MEMORY; p->base.pMethods = &memdb_io_methods; return SQLITE_OK; } @@ -537,8 +548,11 @@ end_deserialize: ** Register the new VFS. */ int sqlite3MemdbInit(void){ - memdb_vfs.pAppData = sqlite3_vfs_find(0); - memdb_vfs.szOsFile = sizeof(MemFile); + sqlite3_vfs *pLower = sqlite3_vfs_find(0); + int sz = pLower->szOsFile; + memdb_vfs.pAppData = pLower; + if( sz