From 95812d29c63f792bfe3c5b009bbbf50c8c54d41b Mon Sep 17 00:00:00 2001 From: MartinChoo <214582617@qq.com> Date: Thu, 28 Aug 2025 17:32:48 +0800 Subject: [PATCH] Bugfix on multi-process open new db Signed-off-by: MartinChoo <214582617@qq.com> --- patch/0012-Bugfix-on-current-version.patch | 93 +++++++++++++--------- 1 file changed, 54 insertions(+), 39 deletions(-) diff --git a/patch/0012-Bugfix-on-current-version.patch b/patch/0012-Bugfix-on-current-version.patch index 4284a6f..5d3a5a5 100644 --- a/patch/0012-Bugfix-on-current-version.patch +++ b/patch/0012-Bugfix-on-current-version.patch @@ -1,13 +1,13 @@ -From 61984da0804f6d602bde57125322482d0ce1f0ba Mon Sep 17 00:00:00 2001 +From f9968372d4d494fe406b080b8b8cf2304911bf53 Mon Sep 17 00:00:00 2001 From: MartinChoo <214582617@qq.com> -Date: Thu, 14 Aug 2025 19:51:56 +0800 +Date: Thu, 28 Aug 2025 17:19:41 +0800 Subject: [PATCH] Bugfix on current version --- ext/misc/cksumvfs.c | 11 +- - src/compressvfs.c | 271 +++++++++++++++++++++++----------- + src/compressvfs.c | 294 +++++++++++++++++++++++++------------ src/sqlite3.c | 349 ++++++++++++++++++++++++++++++++++++-------- - 3 files changed, 481 insertions(+), 150 deletions(-) + 3 files changed, 495 insertions(+), 159 deletions(-) diff --git a/ext/misc/cksumvfs.c b/ext/misc/cksumvfs.c index 27b1028..e89edcd 100644 @@ -53,7 +53,7 @@ index 27b1028..e89edcd 100644 ((u8*)zBuf)[iAmt-CKSUMVFS_RESERVED_SIZE]=CKSUMVFS_MAGIC_NUM; ((u8*)zBuf)[iAmt-CKSUMVFS_RESERVED_SIZE+1]=p->verifyCksm ? CKSUMVFS_CALC_CHECKSUM : CKSUMVFS_WITHOUT_CHECKSUM; diff --git a/src/compressvfs.c b/src/compressvfs.c -index f2fe169..64a1421 100644 +index f2fe169..23c21b4 100644 --- a/src/compressvfs.c +++ b/src/compressvfs.c @@ -151,6 +151,7 @@ typedef INT8_TYPE i8; /* 1-byte signed integer */ @@ -85,11 +85,13 @@ index f2fe169..64a1421 100644 } CompressFile; -@@ -505,14 +510,14 @@ static void getCompression(sqlite3 *db, CompressFile *pCompress){ +@@ -504,15 +509,15 @@ static void getCompression(sqlite3 *db, CompressFile *pCompress){ + sqlite3_stmt *stmt = NULL; const char *sql = "SELECT count(*), compression, pagesize FROM vfs_compression;"; int count = 0; - pCompress->compression = COMPRESSION_UNDEFINED; +- pCompress->compression = COMPRESSION_UNDEFINED; - pCompress->page_size = 0; ++ pCompress->compression = COMPRESSION_ZSTD; + pCompress->pageSize = 0; if( sqlite3_prepare_v2(db, sql, -1, &stmt, NULL)==SQLITE_OK ){ @@ -377,13 +379,13 @@ index f2fe169..64a1421 100644 } return rc; } -@@ -888,6 +926,40 @@ static int compressUnfetch(sqlite3_file *pFile, sqlite3_int64 iOfst, void *pPage +@@ -888,6 +926,70 @@ static int compressUnfetch(sqlite3_file *pFile, sqlite3_int64 iOfst, void *pPage return SQLITE_OK; } +static int compressOpenLockFile(sqlite3_vfs *pVfs, const char *zName, int flags, sqlite3_file **pFile){ + const char *walPath = sqlite3_filename_wal(zName); -+ const char *lockPath = walPath + strlen(walPath) + 1; // For compress vfs, lock path place at thie position ++ const char *lockPath = walPath + strlen(walPath) + 1; // For compress vfs, lock path place at this position + int isLockExist = 0; + int rc = ORIGVFS(pVfs)->xAccess(ORIGVFS(pVfs), lockPath, SQLITE_ACCESS_READWRITE, &isLockExist); + if( rc!=SQLITE_OK ){ @@ -414,11 +416,41 @@ index f2fe169..64a1421 100644 + *pFile = pLockFd; + return rc; +} ++ ++static int compressDbInitCompression(CompressFile *pCompress, sqlite3 *db, u32 compression){ ++ const char *pragmaStr = "PRAGMA checksum_persist_enable=ON;PRAGMA page_size=4096;"\ ++ "PRAGMA auto_vacuum=INCREMENTAL;PRAGMA journal_mode=OFF;"; ++ int rc = sqlite3_exec(db, pragmaStr, NULL, NULL, NULL); ++ if( rc!=SQLITE_OK ){ ++ sqlite3_log(rc, "Config compress db wrong, name"); ++ return SQLITE_CANTOPEN; ++ } ++ const char *initCompressionStr = "CREATE TABLE IF NOT EXISTS vfs_compression(compression INTEGER, pagesize INTEGER);"; ++ rc = sqlite3_exec(db, initCompressionStr, NULL, NULL, NULL); ++ if( rc!=SQLITE_OK ){ ++ sqlite3_log(rc, "Configure compress db wrong, create vfs_compression failed"); ++ return SQLITE_CANTOPEN; ++ } ++ char compressionSql[COMPRESSION_SQL_MAX_LENGTH] = {0}; ++ if( sprintf_s(compressionSql, COMPRESSION_SQL_MAX_LENGTH, ++ "INSERT OR IGNORE INTO vfs_compression(compression, pagesize) VALUES (%u, 0);", compression)<=0 ){ ++ sqlite3_log(rc, "Concatenate config stat wrong, compression(%u)", compression); ++ return SQLITE_CANTOPEN; ++ } ++ rc = sqlite3_exec(db, compressionSql, NULL, NULL, NULL); ++ if( rc!=SQLITE_OK ){ ++ sqlite3_log(rc, "Config compress db wrong, insert compression(%u) failed", compression); ++ return SQLITE_CANTOPEN; ++ } ++ pCompress->compression = compression; ++ pCompress->pageSize = 0; ++ return SQLITE_OK; ++} + /* ** Open a compress file.If this file is not a journal or wal file, ** it will open a OutterDB and create vfs_pages and vfs_compression table -@@ -902,87 +974,114 @@ static int compressOpen( +@@ -902,87 +1004,89 @@ static int compressOpen( ){ sqlite3_file *pSubFile = ORIGFILE(pFile); CompressFile *pCompress = (CompressFile *)pFile; @@ -490,47 +522,30 @@ index f2fe169..64a1421 100644 if( loadCompressAlgorithmExtension(COMPRESSION_UNDEFINED)==SQLITE_ERROR ){ rc = SQLITE_CANTOPEN; - goto open_end; -+ goto END_OUT; -+ } -+ const char *pragmaStr = "PRAGMA checksum_persist_enable=ON;PRAGMA page_size=4096;"\ -+ "PRAGMA auto_vacuum=INCREMENTAL;PRAGMA journal_mode=OFF;"; -+ rc = sqlite3_exec(db, pragmaStr, NULL, NULL, NULL); -+ if( rc!=SQLITE_OK ){ -+ sqlite3_log(rc, "Config compress db wrong, name:%s", zName); -+ rc = SQLITE_CANTOPEN; -+ goto END_OUT; - } +- } - const char *init_compression_sql = "CREATE TABLE vfs_compression (compression INTEGER, pagesize INTEGER);"; - rc = sqlite3_exec(db, init_compression_sql, NULL, NULL, NULL); -+ const char *initCompressionStr = "CREATE TABLE vfs_compression (compression INTEGER, pagesize INTEGER);"; -+ rc = sqlite3_exec(db, initCompressionStr, NULL, NULL, NULL); - if( rc!=SQLITE_OK ){ -+ sqlite3_log(rc, "Configure compress db wrong, name:%s, create vfs_compression failed", zName); - rc = SQLITE_CANTOPEN; +- if( rc!=SQLITE_OK ){ +- rc = SQLITE_CANTOPEN; - goto open_end; + goto END_OUT; } - char set_compression_sql[COMPRESSION_SQL_MAX_LENGTH] = {0}; - if( sprintf_s(set_compression_sql, COMPRESSION_SQL_MAX_LENGTH, -+ char compressionSql[COMPRESSION_SQL_MAX_LENGTH] = {0}; -+ if( sprintf_s(compressionSql, COMPRESSION_SQL_MAX_LENGTH, - "INSERT INTO vfs_compression(compression, pagesize) VALUES (%u, 0);", g_compress_algo_load)<=0 ){ - rc = SQLITE_CANTOPEN; +- "INSERT INTO vfs_compression(compression, pagesize) VALUES (%u, 0);", g_compress_algo_load)<=0 ){ +- rc = SQLITE_CANTOPEN; - goto open_end; -+ sqlite3_log(rc, "Concatenate config stat wrong, name:%s, compression(%u)", zName, g_compress_algo_load); -+ goto END_OUT; - } +- } - rc = sqlite3_exec(db, set_compression_sql, NULL, NULL, NULL); -+ rc = sqlite3_exec(db, compressionSql, NULL, NULL, NULL); ++ rc = compressDbInitCompression(pCompress, db, g_compress_algo_load); if( rc!=SQLITE_OK ){ -+ sqlite3_log(rc, "Config compress db wrong, name:%s, insert compression(%u) failed", zName, g_compress_algo_load); - rc = SQLITE_CANTOPEN; +- rc = SQLITE_CANTOPEN; - goto open_end; ++ sqlite3_log(rc, "Init compression info wrong, name:%s", zName); + goto END_OUT; } - pCompress->compression = g_compress_algo_load; +- pCompress->compression = g_compress_algo_load; - pCompress->page_size = 0; -+ pCompress->pageSize = 0; } if( tableExists(db, "vfs_pages") ){ - goto open_end; @@ -538,7 +553,7 @@ index f2fe169..64a1421 100644 } - const char *create_sql = "CREATE TABLE vfs_pages (pageno INTEGER PRIMARY KEY, data BLOB NOT NULL);"; - rc = sqlite3_exec(db, create_sql, NULL, NULL, NULL); -+ const char *pageDdlStr = "CREATE TABLE vfs_pages (pageno INTEGER PRIMARY KEY, data BLOB NOT NULL);"; ++ const char *pageDdlStr = "CREATE TABLE IF NOT EXISTS vfs_pages (pageno INTEGER PRIMARY KEY, data BLOB NOT NULL);"; + rc = sqlite3_exec(db, pageDdlStr, NULL, NULL, NULL); if( rc!=SQLITE_OK ){ + sqlite3_log(rc, "Config compress db wrong, name:%s, create page table failed", zName); @@ -1232,5 +1247,5 @@ index 692520d..ff0f0b4 100644 int (*compressdb_backup)(sqlite3*, const char*); #else -- -2.34.1 +2.47.0.windows.2 -- Gitee