aboutsummaryrefslogtreecommitdiff
path: root/src/test1.c
diff options
context:
space:
mode:
authordrh <>2021-10-30 20:22:32 +0000
committerdrh <>2021-10-30 20:22:32 +0000
commitd4cc4d02cbfbf82bcba3b3f594a66acc4111d23f (patch)
tree96010f2239a298e63c0cb1be47366f8b1837989f /src/test1.c
parent362c181913a419ceda8f69a3fc12d829c2be2e9c (diff)
parent21b1c6ddaca2de314f18d0a6756bd443f9bb2f8c (diff)
downloadsqlite-d4cc4d02cbfbf82bcba3b3f594a66acc4111d23f.tar.gz
sqlite-d4cc4d02cbfbf82bcba3b3f594a66acc4111d23f.zip
Add the sqlite3_autovacuum_pages() interface.
FossilOrigin-Name: ca2703c339f76101f25051a2ed380398b018782883bfee68b5f2d69a1de9091a
Diffstat (limited to 'src/test1.c')
-rw-r--r--src/test1.c91
1 files changed, 91 insertions, 0 deletions
diff --git a/src/test1.c b/src/test1.c
index ceafbe503..db14a607d 100644
--- a/src/test1.c
+++ b/src/test1.c
@@ -8233,6 +8233,96 @@ static int SQLITE_TCLAPI test_decode_hexdb(
return TCL_OK;
}
+/*
+** Client data for the autovacuum_pages callback.
+*/
+struct AutovacPageData {
+ Tcl_Interp *interp;
+ char *zScript;
+};
+typedef struct AutovacPageData AutovacPageData;
+
+/*
+** Callback functions for sqlite3_autovacuum_pages
+*/
+static unsigned int test_autovacuum_pages_callback(
+ void *pClientData,
+ const char *zSchema,
+ unsigned int nFilePages,
+ unsigned int nFreePages,
+ unsigned int nBytePerPage
+){
+ AutovacPageData *pData = (AutovacPageData*)pClientData;
+ Tcl_DString str;
+ unsigned int x;
+ char zBuf[100];
+ Tcl_DStringInit(&str);
+ Tcl_DStringAppend(&str, pData->zScript, -1);
+ Tcl_DStringAppendElement(&str, zSchema);
+ sqlite3_snprintf(sizeof(zBuf), zBuf, "%u", nFilePages);
+ Tcl_DStringAppendElement(&str, zBuf);
+ sqlite3_snprintf(sizeof(zBuf), zBuf, "%u", nFreePages);
+ Tcl_DStringAppendElement(&str, zBuf);
+ sqlite3_snprintf(sizeof(zBuf), zBuf, "%u", nBytePerPage);
+ Tcl_DStringAppendElement(&str, zBuf);
+ Tcl_ResetResult(pData->interp);
+ Tcl_Eval(pData->interp, Tcl_DStringValue(&str));
+ Tcl_DStringFree(&str);
+ x = nFreePages;
+ (void)Tcl_GetIntFromObj(0, Tcl_GetObjResult(pData->interp), (int*)&x);
+ return x;
+}
+
+/*
+** Usage: sqlite3_autovacuum_pages DB SCRIPT
+**
+** Add an autovacuum-pages callback to database connection DB. The callback
+** will invoke SCRIPT, after appending parameters.
+**
+** If SCRIPT is an empty string or is omitted, then the callback is
+** cancelled.
+*/
+static int SQLITE_TCLAPI test_autovacuum_pages(
+ void * clientData,
+ Tcl_Interp *interp,
+ int objc,
+ Tcl_Obj *CONST objv[]
+){
+ AutovacPageData *pData;
+ sqlite3 *db;
+ int rc;
+ const char *zScript;
+ if( objc!=2 && objc!=3 ){
+ Tcl_WrongNumArgs(interp, 1, objv, "DB ?SCRIPT?");
+ return TCL_ERROR;
+ }
+ if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) ) return TCL_ERROR;
+ zScript = objc==3 ? Tcl_GetString(objv[2]) : 0;
+ if( zScript ){
+ size_t nScript = strlen(zScript);
+ pData = sqlite3_malloc64( sizeof(*pData) + nScript + 1 );
+ if( pData==0 ){
+ Tcl_AppendResult(interp, "out of memory", (void*)0);
+ return TCL_ERROR;
+ }
+ pData->interp = interp;
+ pData->zScript = (char*)&pData[1];
+ memcpy(pData->zScript, zScript, nScript+1);
+ rc = sqlite3_autovacuum_pages(db,test_autovacuum_pages_callback,
+ pData, sqlite3_free);
+ }else{
+ rc = sqlite3_autovacuum_pages(db, 0, 0, 0);
+ }
+ if( rc ){
+ char zBuf[1000];
+ sqlite3_snprintf(sizeof(zBuf), zBuf,
+ "sqlite3_autovacuum_pages() returns %d", rc);
+ Tcl_AppendResult(interp, zBuf, (void*)0);
+ return TCL_ERROR;
+ }
+ return TCL_OK;
+}
+
/*
** Register commands with the TCL interpreter.
@@ -8524,6 +8614,7 @@ int Sqlitetest1_Init(Tcl_Interp *interp){
{ "atomic_batch_write", test_atomic_batch_write, 0 },
{ "sqlite3_mmap_warm", test_mmap_warm, 0 },
{ "sqlite3_config_sorterref", test_config_sorterref, 0 },
+ { "sqlite3_autovacuum_pages", test_autovacuum_pages, 0 },
{ "decode_hexdb", test_decode_hexdb, 0 },
{ "test_write_db", test_write_db, 0 },
{ "sqlite3_register_cksumvfs", test_register_cksumvfs, 0 },