Improvements to the vtablog.c extension, for better logging of virtual
table interactions. FossilOrigin-Name: e253bb36a5f4f601c9b08858b55a9ce198239ace8efa8dab7c0ec019028967c1
This commit is contained in:
parent
cf84ae0189
commit
d2b3b72a2b
@ -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
|
||||
|
12
manifest
12
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.
|
||||
|
@ -1 +1 @@
|
||||
bc516ff5202ee6e9834266bf755fe26e30ac557dcc7975ca7a06dfe33874fcd2
|
||||
e253bb36a5f4f601c9b08858b55a9ce198239ace8efa8dab7c0ec019028967c1
|
Loading…
x
Reference in New Issue
Block a user