]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Improvements to the vtablog.c extension, for better logging of virtual
authordrh <>
Mon, 25 Mar 2024 00:38:55 +0000 (00:38 +0000)
committerdrh <>
Mon, 25 Mar 2024 00:38:55 +0000 (00:38 +0000)
table interactions.

FossilOrigin-Name: e253bb36a5f4f601c9b08858b55a9ce198239ace8efa8dab7c0ec019028967c1

ext/misc/vtablog.c
manifest
manifest.uuid

index e414e7afa7e570b47ad1cf774fee20bdbb681437..301e82fcc141a8d954868c57a9ca9890513dccfc 100644 (file)
@@ -38,8 +38,9 @@ SQLITE_EXTENSION_INIT1
 typedef struct vtablog_vtab vtablog_vtab;
 struct vtablog_vtab {
   sqlite3_vtab base;  /* Base class - must be first */
+  char *zDb;          /* Schema name.  argv[1] of xConnect/xCreate */
+  char *zName;        /* Table name.  argv[2] of xConnect/xCreate */
   int nRow;           /* Number of rows in the table */
-  int iInst;          /* Instance number for this vtablog table */
   int nCursor;        /* Number of cursors created */
 };
 
@@ -167,15 +168,14 @@ static int vtablogConnectCreate(
   char **pzErr,
   int isCreate
 ){
-  static int nInst = 0;
   vtablog_vtab *pNew;
   int i;
   int rc;
-  int iInst = ++nInst;
   char *zSchema = 0;
   char *zNRow = 0;
 
-  printf("vtablog%s(tab=%d):\n", isCreate ? "Create" : "Connect", iInst);
+  printf("%s.%s.%s():\n", argv[1], argv[2], 
+         isCreate ? "xCreate" : "xConnect");
   printf("  argc=%d\n", argc);
   for(i=0; i<argc; i++){
     printf("  argv[%d] = ", i);
@@ -195,10 +195,8 @@ static int vtablogConnectCreate(
       return SQLITE_ERROR;
     }
   }
-
   if( zSchema==0 ){
-    *pzErr = sqlite3_mprintf("no schema defined");
-    return SQLITE_ERROR;
+    zSchema = "CREATE TABLE x(a,b);";
   }
   rc = sqlite3_declare_vtab(db, zSchema);
   if( rc==SQLITE_OK ){
@@ -208,7 +206,8 @@ static int vtablogConnectCreate(
     memset(pNew, 0, sizeof(*pNew));
     pNew->nRow = 10;
     if( zNRow ) pNew->nRow = atoi(zNRow);
-    pNew->iInst = iInst;
+    pNew->zDb = sqlite3_mprintf("%s", argv[1]);
+    pNew->zName = sqlite3_mprintf("%s", argv[2]);
   }
   return rc;
 }
@@ -237,7 +236,9 @@ static int vtablogConnect(
 */
 static int vtablogDisconnect(sqlite3_vtab *pVtab){
   vtablog_vtab *pTab = (vtablog_vtab*)pVtab;
-  printf("vtablogDisconnect(%d)\n", pTab->iInst);
+  printf("%s.%s.xDisconnect()\n", pTab->zDb, pTab->zName);
+  sqlite3_free(pTab->zDb);
+  sqlite3_free(pTab->zName);
   sqlite3_free(pVtab);
   return SQLITE_OK;
 }
@@ -247,7 +248,8 @@ static int vtablogDisconnect(sqlite3_vtab *pVtab){
 */
 static int vtablogDestroy(sqlite3_vtab *pVtab){
   vtablog_vtab *pTab = (vtablog_vtab*)pVtab;
-  printf("vtablogDestroy(%d)\n", pTab->iInst);
+  printf("%s.%s.xDestroy()\n", pTab->zDb, pTab->zName);
+  sqlite3_free(pTab->zName);
   sqlite3_free(pVtab);
   return SQLITE_OK;
 }
@@ -258,7 +260,8 @@ static int vtablogDestroy(sqlite3_vtab *pVtab){
 static int vtablogOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
   vtablog_vtab *pTab = (vtablog_vtab*)p;
   vtablog_cursor *pCur;
-  printf("vtablogOpen(tab=%d, cursor=%d)\n", pTab->iInst, ++pTab->nCursor);
+  printf("%s.%s.xOpen(cursor=%d)\n", pTab->zDb, pTab->zName,
+         ++pTab->nCursor);
   pCur = sqlite3_malloc( sizeof(*pCur) );
   if( pCur==0 ) return SQLITE_NOMEM;
   memset(pCur, 0, sizeof(*pCur));
@@ -273,7 +276,7 @@ static int vtablogOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){
 static int vtablogClose(sqlite3_vtab_cursor *cur){
   vtablog_cursor *pCur = (vtablog_cursor*)cur;
   vtablog_vtab *pTab = (vtablog_vtab*)cur->pVtab;
-  printf("vtablogClose(tab=%d, cursor=%d)\n", pTab->iInst, pCur->iCursor);
+  printf("%s.%s.xClose(cursor=%d)\n", pTab->zDb, pTab->zName, pCur->iCursor);
   sqlite3_free(cur);
   return SQLITE_OK;
 }
@@ -285,8 +288,9 @@ static int vtablogClose(sqlite3_vtab_cursor *cur){
 static int vtablogNext(sqlite3_vtab_cursor *cur){
   vtablog_cursor *pCur = (vtablog_cursor*)cur;
   vtablog_vtab *pTab = (vtablog_vtab*)cur->pVtab;
-  printf("vtablogNext(tab=%d, cursor=%d)  rowid %d -> %d\n", 
-         pTab->iInst, pCur->iCursor, (int)pCur->iRowid, (int)pCur->iRowid+1);
+  printf("%s.%s.xNext(cursor=%d)  rowid %d -> %d\n", 
+         pTab->zDb, pTab->zName, pCur->iCursor,
+         (int)pCur->iRowid, (int)pCur->iRowid+1);
   pCur->iRowid++;
   return SQLITE_OK;
 }
@@ -310,8 +314,8 @@ static int vtablogColumn(
   }else{
     sqlite3_snprintf(sizeof(zVal),zVal,"{%d}%d", i, pCur->iRowid);
   }
-  printf("vtablogColumn(tab=%d, cursor=%d, i=%d): [%s]\n",
-         pTab->iInst, pCur->iCursor, i, zVal);
+  printf("%s.%s.xColumn(cursor=%d, i=%d): [%s]\n",
+         pTab->zDb, pTab->zName, pCur->iCursor, i, zVal);
   sqlite3_result_text(ctx, zVal, -1, SQLITE_TRANSIENT);
   return SQLITE_OK;
 }
@@ -323,8 +327,8 @@ static int vtablogColumn(
 static int vtablogRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){
   vtablog_cursor *pCur = (vtablog_cursor*)cur;
   vtablog_vtab *pTab = (vtablog_vtab*)cur->pVtab;
-  printf("vtablogRowid(tab=%d, cursor=%d): %d\n",
-         pTab->iInst, pCur->iCursor, (int)pCur->iRowid);
+  printf("%s.%s.xRowid(cursor=%d): %d\n",
+         pTab->zDb, pTab->zName, pCur->iCursor, (int)pCur->iRowid);
   *pRowid = pCur->iRowid;
   return SQLITE_OK;
 }
@@ -337,8 +341,8 @@ static int vtablogEof(sqlite3_vtab_cursor *cur){
   vtablog_cursor *pCur = (vtablog_cursor*)cur;
   vtablog_vtab *pTab = (vtablog_vtab*)cur->pVtab;
   int rc = pCur->iRowid >= pTab->nRow;
-  printf("vtablogEof(tab=%d, cursor=%d): %d\n",
-         pTab->iInst, pCur->iCursor, rc);
+  printf("%s.%s.xEof(cursor=%d): %d\n",
+         pTab->zDb, pTab->zName, pCur->iCursor, rc);
   return rc;
 }
 
@@ -417,7 +421,7 @@ static int vtablogFilter(
 ){
   vtablog_cursor *pCur = (vtablog_cursor *)cur;
   vtablog_vtab *pTab = (vtablog_vtab*)cur->pVtab;
-  printf("vtablogFilter(tab=%d, cursor=%d):\n", pTab->iInst, pCur->iCursor);
+  printf("%s.%s.xFilter(cursor=%d):\n", pTab->zDb, pTab->zName, pCur->iCursor);
   pCur->iRowid = 0;
   return SQLITE_OK;
 }
@@ -433,7 +437,7 @@ static int vtablogBestIndex(
   sqlite3_index_info *pIdxInfo
 ){
   vtablog_vtab *pTab = (vtablog_vtab*)tab;
-  printf("vtablogBestIndex(tab=%d):\n", pTab->iInst);
+  printf("%s.%s.xBestIndex():\n", pTab->zDb, pTab->zName);
   pIdxInfo->estimatedCost = (double)500;
   pIdxInfo->estimatedRows = 500;
   return SQLITE_OK;
@@ -454,7 +458,7 @@ static int vtablogUpdate(
 ){
   vtablog_vtab *pTab = (vtablog_vtab*)tab;
   int i;
-  printf("vtablogUpdate(tab=%d):\n", pTab->iInst);
+  printf("%s.%s.xUpdate():\n", pTab->zDb, pTab->zName);
   printf("  argc=%d\n", argc);
   for(i=0; i<argc; i++){
     printf("  argv[%d]=", i);
@@ -464,12 +468,85 @@ static int vtablogUpdate(
   return SQLITE_OK;
 }
 
+static int vtablogBegin(sqlite3_vtab *tab){
+  vtablog_vtab *pTab = (vtablog_vtab*)tab;
+  printf("%s.%s.xBegin()\n", pTab->zDb, pTab->zName);
+  return SQLITE_OK;
+}
+static int vtablogSync(sqlite3_vtab *tab){
+  vtablog_vtab *pTab = (vtablog_vtab*)tab;
+  printf("%s.%s.xSync()\n", pTab->zDb, pTab->zName);
+  return SQLITE_OK;
+}
+static int vtablogCommit(sqlite3_vtab *tab){
+  vtablog_vtab *pTab = (vtablog_vtab*)tab;
+  printf("%s.%s.xCommit()\n", pTab->zDb, pTab->zName);
+  return SQLITE_OK;
+}
+static int vtablogRollback(sqlite3_vtab *tab){
+  vtablog_vtab *pTab = (vtablog_vtab*)tab;
+  printf("%s.%s.xRollback()\n", pTab->zDb, pTab->zName);
+  return SQLITE_OK;
+}
+static int vtablogSavepoint(sqlite3_vtab *tab, int N){
+  vtablog_vtab *pTab = (vtablog_vtab*)tab;
+  printf("%s.%s.xSavepoint(%d)\n", pTab->zDb, pTab->zName, N);
+  return SQLITE_OK;
+}
+static int vtablogRelease(sqlite3_vtab *tab, int N){
+  vtablog_vtab *pTab = (vtablog_vtab*)tab;
+  printf("%s.%s.xRelease(%d)\n", pTab->zDb, pTab->zName, N);
+  return SQLITE_OK;
+}
+static int vtablogRollbackTo(sqlite3_vtab *tab, int N){
+  vtablog_vtab *pTab = (vtablog_vtab*)tab;
+  printf("%s.%s.xRollbackTo(%d)\n", pTab->zDb, pTab->zName, N);
+  return SQLITE_OK;
+}
+
+static int vtablogFindMethod(
+  sqlite3_vtab *tab,
+  int nArg,
+  const char *zName,
+  void (**pxFunc)(sqlite3_context*,int,sqlite3_value**),
+  void **ppArg
+){
+  vtablog_vtab *pTab = (vtablog_vtab*)tab;
+  printf("%s.%s.xFindMethod(nArg=%d, zName=%s)\n",
+         pTab->zDb, pTab->zName, nArg, zName);
+  return SQLITE_OK;
+}
+static int vtablogRename(sqlite3_vtab *tab, const char *zNew){
+  vtablog_vtab *pTab = (vtablog_vtab*)tab;
+  printf("%s.%s.xRename('%s')\n", pTab->zDb, pTab->zName, zNew);
+  sqlite3_free(pTab->zName);
+  pTab->zName = sqlite3_mprintf("%s", zNew);
+  return SQLITE_OK;
+}
+
+static int vtablogShadowName(const char *zName){
+  printf("vtablog.xShadowName('%s')\n", zName);
+  return 0;
+}
+
+static int vtablogIntegrity(
+  sqlite3_vtab *tab,
+  const char *zSchema,
+  const char *zTabName,
+  int mFlags,
+  char **pzErr
+){
+  vtablog_vtab *pTab = (vtablog_vtab*)tab;
+  printf("%s.%s.xIntegrity(mFlags=0x%x)\n", pTab->zDb, pTab->zName, mFlags);
+  return 0;
+}
+
 /*
 ** This following structure defines all the methods for the 
 ** vtablog virtual table.
 */
 static sqlite3_module vtablogModule = {
-  0,                         /* iVersion */
+  4,                         /* iVersion */
   vtablogCreate,             /* xCreate */
   vtablogConnect,            /* xConnect */
   vtablogBestIndex,          /* xBestIndex */
@@ -483,17 +560,17 @@ static sqlite3_module vtablogModule = {
   vtablogColumn,             /* xColumn - read data */
   vtablogRowid,              /* xRowid - read data */
   vtablogUpdate,             /* xUpdate */
-  0,                         /* xBegin */
-  0,                         /* xSync */
-  0,                         /* xCommit */
-  0,                         /* xRollback */
-  0,                         /* xFindMethod */
-  0,                         /* xRename */
-  0,                         /* xSavepoint */
-  0,                         /* xRelease */
-  0,                         /* xRollbackTo */
-  0,                         /* xShadowName */
-  0                          /* xIntegrity */
+  vtablogBegin,              /* xBegin */
+  vtablogSync,               /* xSync */
+  vtablogCommit,             /* xCommit */
+  vtablogRollback,           /* xRollback */
+  vtablogFindMethod,         /* xFindMethod */
+  vtablogRename,             /* xRename */
+  vtablogSavepoint,          /* xSavepoint */
+  vtablogRelease,            /* xRelease */
+  vtablogRollbackTo,         /* xRollbackTo */
+  vtablogShadowName,         /* xShadowName */
+  vtablogIntegrity           /* xIntegrity */
 };
 
 #ifdef _WIN32
index d0fa3fb808f699980df6d5bcc290a57fda0dfdfb..cfb54dfdeb5c8bbd75819cc2b34be6ee8e23fbf0 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sthe\sxBestIndex\smethod\sof\sthe\spragma\svirtual\stable\sso\sthat\sit\scorrectly\ngives\sa\shigher\scost\sto\splans\swhere\sthe\sschema\shidden\sparameter\sis\nunconstrained.\s\sFix\sfor\sthe\sproblem\sreported\sby\n[forum:/forumpost/85b6a8b6705fb77a|forum\spost\s85b6a8b6705fb77a].
-D 2024-03-24T21:10:45.270
+C Improvements\sto\sthe\svtablog.c\sextension,\sfor\sbetter\slogging\sof\svirtual\ntable\sinteractions.
+D 2024-03-25T00:38:55.563
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -426,7 +426,7 @@ F ext/misc/urifuncs.c f71360d14fa9e7626b563f1f781c6148109462741c5235ac63ae0f8917
 F ext/misc/uuid.c 5bb2264c1b64d163efa46509544fd7500cb8769cb7c16dd52052da8d961505cf
 F ext/misc/vfslog.c 3932ab932eeb2601dbc4447cb14d445aaa9fbe43b863ef5f014401c3420afd20
 F ext/misc/vfsstat.c a85df08654743922a19410d7b1e3111de41bb7cd07d20dd16eda4e2b808d269d
-F ext/misc/vtablog.c f2c9d41afe00b51b2c8307b79f508eb0c2dcd57bae074807944e73376fcf15b7
+F ext/misc/vtablog.c 10b3b8abb57c9e6ad5b9fd7789a15359931f4ae7eea1ce4c42692b5ab458b58d
 F ext/misc/vtshim.c 1976e6dd68dd0d64508c91a6dfab8e75f8aaf6cd
 F ext/misc/wholenumber.c 0fa0c082676b7868bf2fa918e911133f2b349bcdceabd1198bba5f65b4fc0668
 F ext/misc/zipfile.c 64cb3d98b6316586e6056d182051aa9d28fdedfbf4b908e6b7a7d70209b1db11
@@ -2182,8 +2182,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 33966bb06ce9a8e90734de59a8d43c523f60870d20be64789638da4c84a8b81b
-R 97fc378a830906e74d1623fece2781ad
+P bc516ff5202ee6e9834266bf755fe26e30ac557dcc7975ca7a06dfe33874fcd2
+R 73586b393bce9c1bed9e065f652632d2
 U drh
-Z 0dbd1f88ff00b9d3018bd54394a97ce0
+Z 2f68833aa47d50c9278d5d5a2c9b24b3
 # Remove this line to create a well-formed Fossil manifest.
index cc6bf08fca6ec090a7cd85979059bf776a4f4650..fe309677dfcbfe63278dab0a60dced0b6e71cb38 100644 (file)
@@ -1 +1 @@
-bc516ff5202ee6e9834266bf755fe26e30ac557dcc7975ca7a06dfe33874fcd2
\ No newline at end of file
+e253bb36a5f4f601c9b08858b55a9ce198239ace8efa8dab7c0ec019028967c1
\ No newline at end of file