From 5fd8f27bfb5abf924ca26d239b3352d7b6d82264 Mon Sep 17 00:00:00 2001 From: stephan Date: Mon, 12 Sep 2022 20:21:34 +0000 Subject: [PATCH 1/3] Remove an extraneous key-copy op in the EM_JS impl of kvstorageDelete(). FossilOrigin-Name: 1c5aeee45564c14e7e2e7730f3f52106339ea3148fb5aa786fa767a35db46f51 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/os_kv.c | 1 - 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 69204b63ea..e8ffc8d53e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\s<sys/time.h>\sinclude\sin\sos_kv.c. -D 2022-09-12T19:33:20.055 +C Remove\san\sextraneous\skey-copy\sop\sin\sthe\sEM_JS\simpl\sof\skvstorageDelete(). +D 2022-09-12T20:21:34.667 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -574,7 +574,7 @@ F src/notify.c 89a97dc854c3aa62ad5f384ef50c5a4a11d70fcc69f86de3e991573421130ed6 F src/os.c 0eb831ba3575af5277e47f4edd14fdfc90025c67eb25ce5cda634518d308d4e9 F src/os.h 1ff5ae51d339d0e30d8a9d814f4b8f8e448169304d83a7ed9db66a65732f3e63 F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85 -F src/os_kv.c 395b3ab831e0d2b172e6dccf6bae3e21b141f3b6d8b3aa828630634edac2604d +F src/os_kv.c 889c6f9b59702859f9041549845769bae2cbd6b59cf15bd7904551a676b85533 F src/os_setup.h 0711dbc4678f3ac52d7fe736951b6384a0615387c4ba5135a4764e4e31f4b6a6 F src/os_unix.c 0fa91925f0b8831fc0156a9c04d39d86f85baf9eef66c98712395e1715cb75cc F src/os_win.c e9454cb141908e8eef2102180bad353a36480612d5b736e4c2bd5777d9b25a34 @@ -2004,8 +2004,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e393ed650ef124143f84e9d787fb996e308dd7af6b8f50df72a6f085b67bf9c3 -R 7d043d1f24831e04bac4a09dedf809ea -U drh -Z f4bc361a8f5540cb46c54b92ebd31edc +P 878cc93e779c3857adc711f212520f007256274fcd3f6f3d72c754a937fcd198 +R ea387427fef090c92e0fdcd9a6ab25a2 +U stephan +Z d8eaf9989333b333239c3719fa4ba2d7 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index f40ca1a770..8dbaf37dda 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -878cc93e779c3857adc711f212520f007256274fcd3f6f3d72c754a937fcd198 \ No newline at end of file +1c5aeee45564c14e7e2e7730f3f52106339ea3148fb5aa786fa767a35db46f51 \ No newline at end of file diff --git a/src/os_kv.c b/src/os_kv.c index eebbcd17cd..62214a13ad 100644 --- a/src/os_kv.c +++ b/src/os_kv.c @@ -284,7 +284,6 @@ EM_JS(int, kvstorageDelete, try { const zXKey = kvstorageMakeKeyOnJSStack(zClass,zKey); if(!zXKey) return 1/*OOM*/; - _sqlite3_wasm__kvvfsMakeKey(zClass, zKey, zXKey); const jKey = UTF8ToString(zXKey); ((115/*=='s'*/===getValue(zClass)) ? sessionStorage : localStorage).removeItem(jKey); From d22cfa8c80e9d95ed4068083f7dd5ffbb8f29dda Mon Sep 17 00:00:00 2001 From: stephan Date: Fri, 16 Sep 2022 01:08:06 +0000 Subject: [PATCH 2/3] Pull the src/os_kv.c part of [13839759f8f4] into the kv-vfs branch. FossilOrigin-Name: e334449912d5176e355d02024a07ed867741f71c9d10ce6744ca800414bf3eeb --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/os_kv.c | 26 ++++++++++++++------------ 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/manifest b/manifest index e8ffc8d53e..da3fab544e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\san\sextraneous\skey-copy\sop\sin\sthe\sEM_JS\simpl\sof\skvstorageDelete(). -D 2022-09-12T20:21:34.667 +C Pull\sthe\ssrc/os_kv.c\spart\sof\s[13839759f8f4]\sinto\sthe\skv-vfs\sbranch. +D 2022-09-16T01:08:06.279 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -574,7 +574,7 @@ F src/notify.c 89a97dc854c3aa62ad5f384ef50c5a4a11d70fcc69f86de3e991573421130ed6 F src/os.c 0eb831ba3575af5277e47f4edd14fdfc90025c67eb25ce5cda634518d308d4e9 F src/os.h 1ff5ae51d339d0e30d8a9d814f4b8f8e448169304d83a7ed9db66a65732f3e63 F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85 -F src/os_kv.c 889c6f9b59702859f9041549845769bae2cbd6b59cf15bd7904551a676b85533 +F src/os_kv.c d4909b439043183f9b6aec65528a7433cee49d41cca95b9a3a4c8fb6bbedc0c2 F src/os_setup.h 0711dbc4678f3ac52d7fe736951b6384a0615387c4ba5135a4764e4e31f4b6a6 F src/os_unix.c 0fa91925f0b8831fc0156a9c04d39d86f85baf9eef66c98712395e1715cb75cc F src/os_win.c e9454cb141908e8eef2102180bad353a36480612d5b736e4c2bd5777d9b25a34 @@ -2004,8 +2004,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 878cc93e779c3857adc711f212520f007256274fcd3f6f3d72c754a937fcd198 -R ea387427fef090c92e0fdcd9a6ab25a2 +P 1c5aeee45564c14e7e2e7730f3f52106339ea3148fb5aa786fa767a35db46f51 +R 06fb792046d4c535864a12af9a1a5d61 U stephan -Z d8eaf9989333b333239c3719fa4ba2d7 +Z 125d6637967f22bfb5b9fb3681eda03b # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 8dbaf37dda..445b7e7e25 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1c5aeee45564c14e7e2e7730f3f52106339ea3148fb5aa786fa767a35db46f51 \ No newline at end of file +e334449912d5176e355d02024a07ed867741f71c9d10ce6744ca800414bf3eeb \ No newline at end of file diff --git a/src/os_kv.c b/src/os_kv.c index 62214a13ad..17d4c254e1 100644 --- a/src/os_kv.c +++ b/src/os_kv.c @@ -351,7 +351,7 @@ int sqlite3__wasm_emjs_kvvfs(int whichOp){ switch( whichOp ){ case 0: break; case 1: - kvstorageWrite(zClass, zKey, "world"); + rc = kvstorageWrite(zClass, zKey, "world"); break; case 2: { char buffer[128] = {0}; @@ -602,7 +602,7 @@ static void kvvfsDecodeJournal( const char *zTxt, /* Text encoding. Zero-terminated */ int nTxt /* Bytes in zTxt, excluding zero terminator */ ){ - unsigned int n = 0; + unsigned int n; int c, i, mult; i = 0; mult = 1; @@ -634,10 +634,10 @@ static sqlite3_int64 kvvfsReadFileSize(KVVfsFile *pFile){ kvstorageRead(pFile->zClass, "sz", zData, sizeof(zData)-1); return strtoll(zData, 0, 0); } -static void kvvfsWriteFileSize(KVVfsFile *pFile, sqlite3_int64 sz){ +static int kvvfsWriteFileSize(KVVfsFile *pFile, sqlite3_int64 sz){ char zData[50]; sqlite3_snprintf(sizeof(zData), zData, "%lld", sz); - kvstorageWrite(pFile->zClass, "sz", zData); + return kvstorageWrite(pFile->zClass, "sz", zData); } /****** sqlite3_io_methods methods ******************************************/ @@ -788,7 +788,9 @@ static int kvvfsWriteDb( pgno = 1 + iOfst/iAmt; sqlite3_snprintf(sizeof(zKey), zKey, "%u", pgno); kvvfsEncode(zBuf, iAmt, aData); - kvstorageWrite(pFile->zClass, zKey, aData); + if( kvstorageWrite(pFile->zClass, zKey, aData) ){ + return SQLITE_IOERR; + } if( iOfst+iAmt > pFile->szDb ){ pFile->szDb = iOfst + iAmt; } @@ -825,8 +827,7 @@ static int kvvfsTruncateDb(sqlite3_file *pProtoFile, sqlite_int64 size){ pgno++; } pFile->szDb = size; - kvvfsWriteFileSize(pFile, size); - return SQLITE_OK; + return kvvfsWriteFileSize(pFile, size) ? SQLITE_IOERR : SQLITE_OK; } return SQLITE_IOERR; } @@ -854,17 +855,18 @@ static int kvvfsSyncJrnl(sqlite3_file *pProtoFile, int flags){ }while( n>0 ); zOut[i++] = ' '; kvvfsEncode(pFile->aJrnl, pFile->nJrnl, &zOut[i]); - kvstorageWrite(pFile->zClass, "jrnl", zOut); + i = kvstorageWrite(pFile->zClass, "jrnl", zOut); sqlite3_free(zOut); - return SQLITE_OK; + return i ? SQLITE_IOERR : SQLITE_OK; } static int kvvfsSyncDb(sqlite3_file *pProtoFile, int flags){ KVVfsFile *pFile = (KVVfsFile *)pProtoFile; + int rc = SQLITE_OK; SQLITE_KV_LOG(("xSync('%s-db')\n", pFile->zClass)); - if( pFile->szDb>0 ){ - kvvfsWriteFileSize(pFile, pFile->szDb); + if( pFile->szDb>0 && 0!=kvvfsWriteFileSize(pFile, pFile->szDb) ){ + rc = SQLITE_IOERR; } - return SQLITE_OK; + return rc; } /* From 84e50767871d64ed2e9ffcf7dbee49d97746ce6f Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 16 Sep 2022 11:37:01 +0000 Subject: [PATCH 3/3] Fix os_kv.c so that it uses SQLITE_FCNTL_SYNC and hence works even with PRAGMA synchronous=OFF. FossilOrigin-Name: 21915af560b111aeeaee751790356151a5f063c2fc703dd4b35b22dc393409fb --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/os_kv.c | 31 ++++++++++++++++++++----------- 3 files changed, 28 insertions(+), 19 deletions(-) diff --git a/manifest b/manifest index da3fab544e..57b3e2ecad 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Pull\sthe\ssrc/os_kv.c\spart\sof\s[13839759f8f4]\sinto\sthe\skv-vfs\sbranch. -D 2022-09-16T01:08:06.279 +C Fix\sos_kv.c\sso\sthat\sit\suses\sSQLITE_FCNTL_SYNC\sand\shence\nworks\seven\swith\sPRAGMA\ssynchronous=OFF. +D 2022-09-16T11:37:01.212 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -574,7 +574,7 @@ F src/notify.c 89a97dc854c3aa62ad5f384ef50c5a4a11d70fcc69f86de3e991573421130ed6 F src/os.c 0eb831ba3575af5277e47f4edd14fdfc90025c67eb25ce5cda634518d308d4e9 F src/os.h 1ff5ae51d339d0e30d8a9d814f4b8f8e448169304d83a7ed9db66a65732f3e63 F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85 -F src/os_kv.c d4909b439043183f9b6aec65528a7433cee49d41cca95b9a3a4c8fb6bbedc0c2 +F src/os_kv.c 554a2c109f8810b743af2eed4ba732d18dfdbc4d073e3a9bd8b8e828215a9692 F src/os_setup.h 0711dbc4678f3ac52d7fe736951b6384a0615387c4ba5135a4764e4e31f4b6a6 F src/os_unix.c 0fa91925f0b8831fc0156a9c04d39d86f85baf9eef66c98712395e1715cb75cc F src/os_win.c e9454cb141908e8eef2102180bad353a36480612d5b736e4c2bd5777d9b25a34 @@ -2004,8 +2004,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 1c5aeee45564c14e7e2e7730f3f52106339ea3148fb5aa786fa767a35db46f51 -R 06fb792046d4c535864a12af9a1a5d61 -U stephan -Z 125d6637967f22bfb5b9fb3681eda03b +P e334449912d5176e355d02024a07ed867741f71c9d10ce6744ca800414bf3eeb +R a55522768af3f3b5d07199ad1dd4c789 +U drh +Z d50c7a05ab573e361ead585b4e643b32 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 445b7e7e25..c9139459b8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e334449912d5176e355d02024a07ed867741f71c9d10ce6744ca800414bf3eeb \ No newline at end of file +21915af560b111aeeaee751790356151a5f063c2fc703dd4b35b22dc393409fb \ No newline at end of file diff --git a/src/os_kv.c b/src/os_kv.c index 17d4c254e1..b99f5574c7 100644 --- a/src/os_kv.c +++ b/src/os_kv.c @@ -71,7 +71,8 @@ static int kvvfsFileSizeJrnl(sqlite3_file*, sqlite3_int64 *pSize); static int kvvfsLock(sqlite3_file*, int); static int kvvfsUnlock(sqlite3_file*, int); static int kvvfsCheckReservedLock(sqlite3_file*, int *pResOut); -static int kvvfsFileControl(sqlite3_file*, int op, void *pArg); +static int kvvfsFileControlDb(sqlite3_file*, int op, void *pArg); +static int kvvfsFileControlJrnl(sqlite3_file*, int op, void *pArg); static int kvvfsSectorSize(sqlite3_file*); static int kvvfsDeviceCharacteristics(sqlite3_file*); @@ -123,7 +124,7 @@ static sqlite3_io_methods kvvfs_db_io_methods = { kvvfsLock, /* xLock */ kvvfsUnlock, /* xUnlock */ kvvfsCheckReservedLock, /* xCheckReservedLock */ - kvvfsFileControl, /* xFileControl */ + kvvfsFileControlDb, /* xFileControl */ kvvfsSectorSize, /* xSectorSize */ kvvfsDeviceCharacteristics, /* xDeviceCharacteristics */ 0, /* xShmMap */ @@ -147,7 +148,7 @@ static sqlite3_io_methods kvvfs_jrnl_io_methods = { kvvfsLock, /* xLock */ kvvfsUnlock, /* xUnlock */ kvvfsCheckReservedLock, /* xCheckReservedLock */ - kvvfsFileControl, /* xFileControl */ + kvvfsFileControlJrnl, /* xFileControl */ kvvfsSectorSize, /* xSectorSize */ kvvfsDeviceCharacteristics, /* xDeviceCharacteristics */ 0, /* xShmMap */ @@ -860,13 +861,7 @@ static int kvvfsSyncJrnl(sqlite3_file *pProtoFile, int flags){ return i ? SQLITE_IOERR : SQLITE_OK; } static int kvvfsSyncDb(sqlite3_file *pProtoFile, int flags){ - KVVfsFile *pFile = (KVVfsFile *)pProtoFile; - int rc = SQLITE_OK; - SQLITE_KV_LOG(("xSync('%s-db')\n", pFile->zClass)); - if( pFile->szDb>0 && 0!=kvvfsWriteFileSize(pFile, pFile->szDb) ){ - rc = SQLITE_IOERR; - } - return rc; + return SQLITE_OK; } /* @@ -928,7 +923,21 @@ static int kvvfsCheckReservedLock(sqlite3_file *pProtoFile, int *pResOut){ /* ** File control method. For custom operations on an kvvfs-file. */ -static int kvvfsFileControl(sqlite3_file *pProtoFile, int op, void *pArg){ +static int kvvfsFileControlJrnl(sqlite3_file *pProtoFile, int op, void *pArg){ + SQLITE_KV_LOG(("xFileControl(%d) on journal\n", op)); + return SQLITE_NOTFOUND; +} +static int kvvfsFileControlDb(sqlite3_file *pProtoFile, int op, void *pArg){ + SQLITE_KV_LOG(("xFileControl(%d) on database\n", op)); + if( op==SQLITE_FCNTL_SYNC ){ + KVVfsFile *pFile = (KVVfsFile *)pProtoFile; + int rc = SQLITE_OK; + SQLITE_KV_LOG(("xSync('%s-db')\n", pFile->zClass)); + if( pFile->szDb>0 && 0!=kvvfsWriteFileSize(pFile, pFile->szDb) ){ + rc = SQLITE_IOERR; + } + return rc; + } return SQLITE_NOTFOUND; }