From 8f8b2312394426f18008e05be2c109c5f5aac0b2 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 18 Oct 2013 20:03:43 +0000 Subject: [PATCH] Add the SQLITE_FCNTL_TRACE file control and generate it for OP_Trace when compiled with SQLITE_USE_FCNTL_TRACE. Update vfslog.c to make use of the new file control. Also update vfslog.c to log UNLOCK events before the fact, rather than afterwards. FossilOrigin-Name: e801f35a96d861a1e5f223655af4c8a6a7e356bc --- ext/misc/vfslog.c | 13 +++++++------ manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/sqlite.h.in | 9 +++++++++ src/vdbe.c | 10 ++++++++++ 5 files changed, 35 insertions(+), 15 deletions(-) diff --git a/ext/misc/vfslog.c b/ext/misc/vfslog.c index 3e4fed6147..4854ca9a4c 100644 --- a/ext/misc/vfslog.c +++ b/ext/misc/vfslog.c @@ -190,7 +190,7 @@ static void vlogLogPrint( const char *zArg3, /* Third argument */ int iRes /* Result */ ){ - char z1[40], z2[40], z3[70]; + char z1[40], z2[40], z3[2000]; if( pLog==0 ) return; if( iArg1>=0 ){ sqlite3_snprintf(sizeof(z1), z1, "%lld", iArg1); @@ -203,7 +203,7 @@ static void vlogLogPrint( z2[0] = 0; } if( zArg3 ){ - sqlite3_snprintf(sizeof(z3), z3, "\"%s\"", zArg3); + sqlite3_snprintf(sizeof(z3), z3, "\"%.*w\"", sizeof(z3)-4, zArg3); }else{ z3[0] = 0; } @@ -498,12 +498,11 @@ static int vlogLock(sqlite3_file *pFile, int eLock){ */ static int vlogUnlock(sqlite3_file *pFile, int eLock){ int rc; - sqlite3_uint64 tStart, tElapse; + sqlite3_uint64 tStart; VLogFile *p = (VLogFile *)pFile; tStart = vlog_time(); + vlogLogPrint(p->pLog, tStart, 0, "UNLOCK", eLock, -1, 0, 0); rc = p->pReal->pMethods->xUnlock(p->pReal, eLock); - tElapse = vlog_time() - tStart; - vlogLogPrint(p->pLog, tStart, tElapse, "UNLOCK", eLock, -1, 0, rc); return rc; } @@ -535,7 +534,9 @@ static int vlogFileControl(sqlite3_file *pFile, int op, void *pArg){ *(char**)pArg = sqlite3_mprintf("vlog/%z", *(char**)pArg); } tElapse = vlog_time() - tStart; - if( op==SQLITE_FCNTL_PRAGMA ){ + if( op==SQLITE_FCNTL_TRACE ){ + vlogLogPrint(p->pLog, tStart, tElapse, "TRACE", op, -1, pArg, rc); + }else if( op==SQLITE_FCNTL_PRAGMA ){ const char **azArg = (const char **)pArg; vlogLogPrint(p->pLog, tStart, tElapse, "FILECONTROL", op, -1, azArg[1], rc); }else if( op==SQLITE_FCNTL_SIZE_HINT ){ diff --git a/manifest b/manifest index 7849a01980..90cad9ccce 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Further\senhance\sthe\svfslog\sextension\sto\srecord\sthe\snumber\sof\sfreelist\spages\nand\sthe\sfirst\sfreelist\spage\sin\sCHNGCTR-READ\sand\sCHNGCTR-WRITE\srecords. -D 2013-10-18T17:42:35.202 +C Add\sthe\sSQLITE_FCNTL_TRACE\sfile\scontrol\sand\sgenerate\sit\sfor\sOP_Trace\nwhen\scompiled\swith\sSQLITE_USE_FCNTL_TRACE.\s\sUpdate\svfslog.c\sto\smake\nuse\sof\sthe\snew\sfile\scontrol.\s\sAlso\supdate\svfslog.c\sto\slog\sUNLOCK\sevents\nbefore\sthe\sfact,\srather\sthan\safterwards. +D 2013-10-18T20:03:43.147 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 0522b53cdc1fcfc18f3a98e0246add129136c654 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -116,7 +116,7 @@ F ext/misc/regexp.c af92cdaa5058fcec1451e49becc7ba44dba023dc F ext/misc/rot13.c 1ac6f95f99b575907b9b09c81a349114cf9be45a F ext/misc/spellfix.c 5e1d547e9a2aed13897fa91bac924333f62fd2d9 F ext/misc/totype.c 4a167594e791abeed95e0a8db028822b5e8fe512 -F ext/misc/vfslog.c b11228f567ddd251706ece5f1bb7bdc218eec825 +F ext/misc/vfslog.c db244ca9e64d5e036499c81806a5aabf23695b77 F ext/misc/vtshim.c babb0dc2bf116029e3e7c9a618b8a1377045303e F ext/misc/wholenumber.c 784b12543d60702ebdd47da936e278aa03076212 F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 @@ -220,7 +220,7 @@ F src/resolve.c 572585a96bf282bb9c3d9e08785ec3cae21dc488 F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0 F src/select.c 15127b54cc11defb2cddef6914e1f384501a61c4 F src/shell.c 6f11f0e9ded63d48e306f2c6858c521e568a47bb -F src/sqlite.h.in 4c6eb96fded1d56a27cec04b6b6803789eb28f54 +F src/sqlite.h.in 547a44dd4ff4d975e92a645ea2d609e543a83d0f F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e F src/sqlite3ext.h 886f5a34de171002ad46fae8c36a7d8051c190fc F src/sqliteInt.h 4dd81a25a919509ce94b1f8f120bbef14458d4b9 @@ -279,7 +279,7 @@ F src/update.c f5182157f5d0d0a97bc5f5e3c9bdba0dfbe08f08 F src/utf.c 6fc6c88d50448c469c5c196acf21617a24f90269 F src/util.c 2fa6c821d28bbdbeec1b2a7b091a281c9ef8f918 F src/vacuum.c f313bc97123a4dd4bfd3f50a00c4d44c08a5b1b7 -F src/vdbe.c 56e648f5ba9a91810caf216857adfed9039cd174 +F src/vdbe.c 3d960c844cee53830f33717b4f5d23d7ee56685f F src/vdbe.h 4f554b5627f26710c4c36d919110a3fc611ca5c4 F src/vdbeInt.h ff57f67aee1ba26a3a47e786533dab155ab6dad6 F src/vdbeapi.c 93a22a9ba2abe292d5c2cf304d7eb2e894dde0ed @@ -1126,7 +1126,7 @@ F tool/vdbe-compress.tcl f12c884766bd14277f4fcedcae07078011717381 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P f062969548da26850ceeb48d4283f6567f828887 -R 5457e72ad1d4f1c29d635ec2528114d5 +P 08157524ca816a81f3c341097e23982727eaa125 +R b5e11ff6727594b43ff93bb892fab8c2 U drh -Z e59d2038662ec722e3001c7ec97e56fb +Z 7548807539fd3c35be5b6a1dc8066c33 diff --git a/manifest.uuid b/manifest.uuid index 6b389e75e7..e832cb0471 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -08157524ca816a81f3c341097e23982727eaa125 \ No newline at end of file +e801f35a96d861a1e5f223655af4c8a6a7e356bc \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 2206704f4e..d9f9feb31b 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -907,6 +907,14 @@ struct sqlite3_io_methods { ** can be queried by passing in a pointer to a negative number. This ** file-control is used internally to implement [PRAGMA mmap_size]. ** +**
  • [[SQLITE_FCNTL_TRACE]] +** The [SQLITE_FCNTL_TRACE] file control provides advisory information +** to the VFS about what the higher layers of the SQLite stack are doing. +** This file control is used by some VFS activity tracing [shims]. +** The argument is a zero-terminated string. Higher layers in the +** SQLite stack may generate instances of this file control if +** the [SQLITE_USE_FCNTL_TRACE] compile-time option is enabled. +** ** */ #define SQLITE_FCNTL_LOCKSTATE 1 @@ -926,6 +934,7 @@ struct sqlite3_io_methods { #define SQLITE_FCNTL_BUSYHANDLER 15 #define SQLITE_FCNTL_TEMPFILENAME 16 #define SQLITE_FCNTL_MMAP_SIZE 18 +#define SQLITE_FCNTL_TRACE 19 /* ** CAPI3REF: Mutex Handle diff --git a/src/vdbe.c b/src/vdbe.c index c75aadb19c..29adca6326 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -6138,6 +6138,16 @@ case OP_Trace: { db->xTrace(db->pTraceArg, z); sqlite3DbFree(db, z); } +#ifdef SQLITE_USE_FCNTL_TRACE + zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql); + if( zTrace ){ + int i; + for(i=0; inDb; i++){ + if( ((1<btreeMask)==0 ) continue; + sqlite3_file_control(db, db->aDb[i].zName, SQLITE_FCNTL_TRACE, zTrace); + } + } +#endif /* SQLITE_USE_FCNTL_TRACE */ #ifdef SQLITE_DEBUG if( (db->flags & SQLITE_SqlTrace)!=0 && (zTrace = (pOp->p4.z ? pOp->p4.z : p->zSql))!=0 -- 2.47.2