From: dan Date: Mon, 3 May 2010 12:14:15 +0000 (+0000) Subject: Have sqlite3_wal_checkpoint() populate the database handle error message and error... X-Git-Tag: version-3.7.2~455^2~2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=87c1fe1b69aa55598c3ba5d8a0bb9cf76ed8dda1;p=thirdparty%2Fsqlite.git Have sqlite3_wal_checkpoint() populate the database handle error message and error code (as returned by sqlite3_errmsg() and sqlite3_errcode()). FossilOrigin-Name: ff234cf574c7ae384ab1ebc79b2171ef0541bc91 --- diff --git a/manifest b/manifest index bfd14bcdd6..4bc4e4a91f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\s"PRAGMA\swal_autocheckpoint"\scommand.\sRename\s"PRAGMA\scheckpoint"\sto\s"PRAGMA\swal_checkpoint". -D 2010-05-03T11:05:09 +C Have\ssqlite3_wal_checkpoint()\spopulate\sthe\sdatabase\shandle\serror\smessage\sand\serror\scode\s(as\sreturned\sby\ssqlite3_errmsg()\sand\ssqlite3_errcode()). +D 2010-05-03T12:14:16 F Makefile.arm-wince-mingw32ce-gcc fcd5e9cd67fe88836360bb4f9ef4cb7f8e2fb5a0 F Makefile.in d83a0ffef3dcbfb08b410a6c6dd6c009ec9167fb F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654 @@ -131,7 +131,7 @@ F src/journal.c b0ea6b70b532961118ab70301c00a33089f9315c F src/legacy.c a199d7683d60cef73089e892409113e69c23a99f F src/lempar.c 7f026423f4d71d989e719a743f98a1cbd4e6d99e F src/loadext.c 1c7a61ce1281041f437333f366a96aa0d29bb581 -F src/main.c d08f2f34e92e5ad7b5ab605a2d22d24e12567efa +F src/main.c 1cc6f391018f2b868d812bf2b1be7c20a5269805 F src/malloc.c a08f16d134f0bfab6b20c3cd142ebf3e58235a6a F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c 89d4ea8d5cdd55635cbaa48ad53132af6294cbb2 @@ -173,7 +173,7 @@ F src/sqliteLimit.h 196e2f83c3b444c4548fc1874f52f84fdbda40f3 F src/status.c 4df6fe7dce2d256130b905847c6c60055882bdbe F src/table.c 2cd62736f845d82200acfa1287e33feb3c15d62e F src/tclsqlite.c 4de81521174fedacd8393ea7b70b730ce17f8eae -F src/test1.c 8b4c246c41e75c3ff033edb2e8c2cf15820861ae +F src/test1.c ff95ca772d1df51618f9f1ef7ea432cdf851f97b F src/test2.c b6b43413d495addd039a88b87d65c839f86b18cb F src/test3.c 4c21700c73a890a47fc685c1097bfb661346ac94 F src/test4.c ad03bb987ddedce928f4258c1e7fa4109a73497d @@ -758,7 +758,7 @@ F test/vtabE.test 7c4693638d7797ce2eda17af74292b97e705cc61 F test/vtab_alter.test 9e374885248f69e251bdaacf480b04a197f125e5 F test/vtab_err.test 0d4d8eb4def1d053ac7c5050df3024fd47a3fbd8 F test/vtab_shared.test 0eff9ce4f19facbe0a3e693f6c14b80711a4222d -F test/wal.test 9f142c65c436b209ffdce0eba37b1b90d2998c1a +F test/wal.test 0c7c059c194871dd42811c31599cf74f1e1123e4 F test/walbak.test a0e45187c7d8928df035dfea29b99b016b21ca3c F test/walcrash.test 63edc6a9e05f645b54d649186a5818fc82953e2e F test/walhook.test 5f18e0fc8787f1f8889d7a9971af18f334f83786 @@ -808,7 +808,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 293327bc76823f473684d589a8160bde1f52c14e F tool/vdbe-compress.tcl d70ea6d8a19e3571d7ab8c9b75cba86d1173ff0f -P 23c0e6c3f333e878fe5a2ae5d61df0d765f437b4 -R f8f9e7aa1d48de791ac4d31549cb2c66 +P 714e5947264571386f966aa8fcdd5607b5832238 +R 10b5fe590305e038296dabbf1b136051 U dan -Z 864d996940b21341339cd035e1e7f0cc +Z 5bc5dc751e1eadc239ebcfefeac3d5fa diff --git a/manifest.uuid b/manifest.uuid index 3309d97d6c..170e46abc9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -714e5947264571386f966aa8fcdd5607b5832238 \ No newline at end of file +ff234cf574c7ae384ab1ebc79b2171ef0541bc91 \ No newline at end of file diff --git a/src/main.c b/src/main.c index f6a343e85f..2767878f8e 100644 --- a/src/main.c +++ b/src/main.c @@ -1254,12 +1254,14 @@ int sqlite3_wal_checkpoint(sqlite3 *db, const char *zDb){ } if( iDb<0 ){ rc = SQLITE_ERROR; + sqlite3Error(db, SQLITE_ERROR, "unknown database: %s", zDb); }else{ rc = sqlite3Checkpoint(db, iDb); + sqlite3Error(db, rc, 0); } sqlite3_mutex_leave(db->mutex); - return rc; + return sqlite3ApiExit(db, rc); } /* diff --git a/src/test1.c b/src/test1.c index b5fda952c0..0a886e9b44 100644 --- a/src/test1.c +++ b/src/test1.c @@ -4868,6 +4868,35 @@ static int test_unlock_notify( } #endif +/* +** tclcmd: sqlite3_wal_checkpoint db ?NAME? +*/ +static int test_wal_checkpoint( + ClientData clientData, /* Unused */ + Tcl_Interp *interp, /* The TCL interpreter that invoked this command */ + int objc, /* Number of arguments */ + Tcl_Obj *CONST objv[] /* Command arguments */ +){ + char *zDb = 0; + sqlite3 *db; + int rc; + + if( objc!=3 && objc!=2 ){ + Tcl_WrongNumArgs(interp, 1, objv, "DB ?NAME?"); + return TCL_ERROR; + } + + if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ){ + return TCL_ERROR; + } + if( objc==3 ){ + zDb = Tcl_GetString(objv[2]); + } + rc = sqlite3_wal_checkpoint(db, zDb); + Tcl_SetResult(interp, (char *)t1ErrorName(rc), TCL_STATIC); + return TCL_OK; +} + /* ** tcl_objproc COMMANDNAME ARGS... @@ -5089,6 +5118,7 @@ int Sqlitetest1_Init(Tcl_Interp *interp){ #ifdef SQLITE_ENABLE_UNLOCK_NOTIFY { "sqlite3_unlock_notify", test_unlock_notify, 0 }, #endif + { "sqlite3_wal_checkpoint", test_wal_checkpoint, 0 }, }; static int bitmask_size = sizeof(Bitmask)*8; int i; diff --git a/test/wal.test b/test/wal.test index e5c1d6cdc1..01e68e9437 100644 --- a/test/wal.test +++ b/test/wal.test @@ -968,4 +968,86 @@ do_test wal-14 { catch { db close } catch { db2 close } + +#------------------------------------------------------------------------- +# The following block of tests - wal-15.* - focus on testing the +# implementation of the sqlite3_wal_checkpoint() interface. +# +file delete -force test.db test.db-wal +sqlite3 db test.db +do_test wal-15.1 { + execsql { + PRAGMA page_size = 1024; + PRAGMA journal_mode = WAL; + } + execsql { + CREATE TABLE t1(a, b); + INSERT INTO t1 VALUES(1, 2); + } +} {} + +# Test that an error is returned if the database name is not recognized +# +do_test wal-15.2.1 { + sqlite3_wal_checkpoint db aux +} {SQLITE_ERROR} +do_test wal-15.2.2 { + sqlite3_errcode db +} {SQLITE_ERROR} +do_test wal-15.2.3 { + sqlite3_errmsg db +} {unknown database: aux} + +# Test that an error is returned if an attempt is made to checkpoint +# if a transaction is open on the database. +# +do_test wal-15.3.1 { + execsql { + BEGIN; + INSERT INTO t1 VALUES(3, 4); + } + sqlite3_wal_checkpoint db main +} {SQLITE_LOCKED} +do_test wal-15.3.2 { + sqlite3_errcode db +} {SQLITE_LOCKED} +do_test wal-15.3.3 { + sqlite3_errmsg db +} {database table is locked} + +# Also test that an error is returned if the db cannot be checkpointed +# because of locks held by another connection. +# +sqlite3 db2 test.db +do_test wal-15.4.1 { + execsql { + BEGIN; + SELECT * FROM t1; + } db2 +} {1 2} +do_test wal-15.4.2 { + execsql { COMMIT } + sqlite3_wal_checkpoint db +} {SQLITE_BUSY} +do_test wal-15.4.3 { + sqlite3_errmsg db +} {database is locked} + +# After [db2] drops its lock, [db] may checkpoint the db. +# +do_test wal-15.4.4 { + execsql { COMMIT } db2 + sqlite3_wal_checkpoint db +} {SQLITE_OK} +do_test wal-15.4.5 { + sqlite3_errmsg db +} {not an error} +do_test wal-15.4.6 { + file size test.db +} [expr 1024*2] + +catch { db2 close } +catch { db close } finish_test + +