1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-11-12 13:01:09 +03:00

Add a logfile option to test_osinst.c. (CVS 4994)

FossilOrigin-Name: f97d89458259978b7b1b5c5e5a0d19cabcb9e536
This commit is contained in:
danielk1977
2008-04-12 10:53:11 +00:00
parent c2a721f73a
commit 70b9b04c7c
3 changed files with 172 additions and 44 deletions

View File

@@ -1,5 +1,5 @@
C Add\sthe\sspeedtest8inst1.c\sprogram\sfor\srunning\sspeed\stests\swith\san\ninstrumented\sVFS.\s(CVS\s4993) C Add\sa\slogfile\soption\sto\stest_osinst.c.\s(CVS\s4994)
D 2008-04-11T21:20:49 D 2008-04-12T10:53:11
F Makefile.arm-wince-mingw32ce-gcc ac5f7b2cef0cd850d6f755ba6ee4ab961b1fadf7 F Makefile.arm-wince-mingw32ce-gcc ac5f7b2cef0cd850d6f755ba6ee4ab961b1fadf7
F Makefile.in b861627d91df5ee422c54237aa38296954dc0151 F Makefile.in b861627d91df5ee422c54237aa38296954dc0151
F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654 F Makefile.linux-gcc d53183f4aa6a9192d249731c90dbdffbd2c68654
@@ -164,7 +164,7 @@ F src/test_loadext.c 22065d601a18878e5542191001f0eaa5d77c0ed8
F src/test_malloc.c c92a65e8f9b31bb2b332448d92d2016c000a963d F src/test_malloc.c c92a65e8f9b31bb2b332448d92d2016c000a963d
F src/test_md5.c bca40b727c57462ddb415e57c5323445a1bb1a40 F src/test_md5.c bca40b727c57462ddb415e57c5323445a1bb1a40
F src/test_onefile.c 2fea6d22f13f5f286356c80c77ffd41f995f2b7a F src/test_onefile.c 2fea6d22f13f5f286356c80c77ffd41f995f2b7a
F src/test_osinst.c 1a2d6de4ce031ccc53fb346be2352173465f4e2e F src/test_osinst.c be328c7c1e3ef671a1e833eb2b29048c22ebad73
F src/test_schema.c 12c9de7661d6294eec2d57afbb52e2af1128084f F src/test_schema.c 12c9de7661d6294eec2d57afbb52e2af1128084f
F src/test_server.c a6ece6c835e7eae835054124e09e947e422b1ac5 F src/test_server.c a6ece6c835e7eae835054124e09e947e422b1ac5
F src/test_tclvar.c b2d1115e4d489179d3f029e765211b2ad527ba59 F src/test_tclvar.c b2d1115e4d489179d3f029e765211b2ad527ba59
@@ -628,7 +628,7 @@ F www/tclsqlite.tcl 8be95ee6dba05eabcd27a9d91331c803f2ce2130
F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0 F www/vdbe.tcl 87a31ace769f20d3627a64fa1fade7fed47b90d0
F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b F www/version3.tcl 890248cf7b70e60c383b0e84d77d5132b3ead42b
F www/whentouse.tcl fc46eae081251c3c181bd79c5faef8195d7991a5 F www/whentouse.tcl fc46eae081251c3c181bd79c5faef8195d7991a5
P a70e9587569c99dd05e79c6745ff930aa31d763c P baa8056c67c03ac78a1ed6da5a46fda793340739
R 9c5ff1287eaf10cf60991e88a0854ca2 R c2ecb8d36d87497209adf45f490c6c49
U drh U danielk1977
Z daa0cde1bcb6eff40ce7d638cd073f72 Z f46f1d82d8c452c3cd3a8844ac5c2cb4

View File

@@ -1 +1 @@
baa8056c67c03ac78a1ed6da5a46fda793340739 f97d89458259978b7b1b5c5e5a0d19cabcb9e536

View File

@@ -14,10 +14,9 @@
** adds instrumentation to all vfs and file methods. C and Tcl interfaces ** adds instrumentation to all vfs and file methods. C and Tcl interfaces
** are provided to control the instrumentation. ** are provided to control the instrumentation.
*/ */
#if SQLITE_TEST /* This file is used for testing only */
/* /*
** Public interface: ** C interface:
** **
** sqlite3_instvfs_create() ** sqlite3_instvfs_create()
** sqlite3_instvfs_destroy() ** sqlite3_instvfs_destroy()
@@ -26,7 +25,9 @@
** sqlite3_instvfs_reset() ** sqlite3_instvfs_reset()
** sqlite3_instvfs_get() ** sqlite3_instvfs_get()
** **
** Tcl interface: ** sqlite3_instvfs_binarylog
**
** Tcl interface (omitted if SQLITE_TEST is not set):
** **
** sqlite3_instvfs create NAME ?PARENT? ** sqlite3_instvfs create NAME ?PARENT?
** **
@@ -91,28 +92,27 @@
/* File methods */ /* File methods */
#define OS_CLOSE 1
#define OS_READ 2
#define OS_WRITE 3
#define OS_TRUNCATE 4
#define OS_SYNC 5
#define OS_FILESIZE 6
#define OS_LOCK 7
#define OS_UNLOCK 8
#define OS_CHECKRESERVEDLOCK 9
#define OS_FILECONTROL 10
#define OS_SECTORSIZE 11
#define OS_DEVCHAR 12
/* Vfs methods */ /* Vfs methods */
#define OS_OPEN 13 #define OS_ACCESS 1
#define OS_DELETE 14 #define OS_CHECKRESERVEDLOCK 2
#define OS_ACCESS 15 #define OS_CLOSE 3
#define OS_GETTEMPNAME 16 #define OS_CURRENTTIME 4
#define OS_FULLPATHNAME 17 #define OS_DELETE 5
#define OS_RANDOMNESS 18 #define OS_DEVCHAR 6
#define OS_SLEEP 19 #define OS_FILECONTROL 7
#define OS_CURRENTTIME 20 #define OS_FILESIZE 8
#define OS_FULLPATHNAME 9
#define OS_GETTEMPNAME 10
#define OS_LOCK 11
#define OS_OPEN 12
#define OS_RANDOMNESS 13
#define OS_READ 14
#define OS_SECTORSIZE 15
#define OS_SLEEP 16
#define OS_SYNC 17
#define OS_TRUNCATE 18
#define OS_UNLOCK 19
#define OS_WRITE 20
#define OS_NUMEVENTS 21 #define OS_NUMEVENTS 21
@@ -122,7 +122,7 @@ struct InstVfs {
void *pClient; void *pClient;
void (*xDel)(void *); void (*xDel)(void *);
void (*xCall)(void *, int, sqlite3_int64, const char *, int, sqlite3_int64); void (*xCall)(void *, int, sqlite3_int64, const char *, int, int, sqlite3_int64);
/* Counters */ /* Counters */
i64 aTime[OS_NUMEVENTS]; i64 aTime[OS_NUMEVENTS];
@@ -138,6 +138,7 @@ struct inst_file {
sqlite3_file *pReal; sqlite3_file *pReal;
InstVfs *pInstVfs; InstVfs *pInstVfs;
const char *zName; const char *zName;
int flags;
}; };
/* /*
@@ -217,11 +218,10 @@ static sqlite3_io_methods inst_io_methods = {
*/ */
#if defined(i386) || defined(__i386__) || defined(_M_IX86) #if defined(i386) || defined(__i386__) || defined(_M_IX86)
__inline__ unsigned long long int hwtime(void){ __inline__ unsigned long long int hwtime(void){
unsigned long long int x; unsigned int lo, hi;
__asm__("rdtsc\n\t" /* We cannot use "=A", since this would use %rax on x86_64 */
"mov %%edx, %%ecx\n\t" __asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
:"=A" (x)); return (unsigned long long int)hi << 32 | lo;
return x;
} }
#else #else
static unsigned long long int hwtime(void){ return 0; } static unsigned long long int hwtime(void){ return 0; }
@@ -237,7 +237,7 @@ __inline__ unsigned long long int hwtime(void){
pInstVfs->aTime[eEvent] += t; \ pInstVfs->aTime[eEvent] += t; \
pInstVfs->aCount[eEvent] += 1; \ pInstVfs->aCount[eEvent] += 1; \
if( pInstVfs->xCall ){ \ if( pInstVfs->xCall ){ \
pInstVfs->xCall(pInstVfs->pClient, eEvent, t, p->zName, A, B); \ pInstVfs->xCall(pInstVfs->pClient, eEvent, t, p->zName, p->flags, A, B); \
} \ } \
return rc; \ return rc; \
} }
@@ -251,7 +251,7 @@ __inline__ unsigned long long int hwtime(void){
pInstVfs->aTime[eEvent] += t; \ pInstVfs->aTime[eEvent] += t; \
pInstVfs->aCount[eEvent] += 1; \ pInstVfs->aCount[eEvent] += 1; \
if( pInstVfs->xCall ){ \ if( pInstVfs->xCall ){ \
pInstVfs->xCall(pInstVfs->pClient, eEvent, t, Z, A, B); \ pInstVfs->xCall(pInstVfs->pClient, eEvent, t, Z, 0, A, B); \
} \ } \
return rc; \ return rc; \
} }
@@ -365,6 +365,7 @@ static int instOpen(
p->pReal = (sqlite3_file *)&p[1]; p->pReal = (sqlite3_file *)&p[1];
p->pInstVfs = (InstVfs *)pVfs; p->pInstVfs = (InstVfs *)pVfs;
p->zName = zName; p->zName = zName;
p->flags = flags;
OS_TIME_VFS(OS_OPEN, zName, flags, 0, OS_TIME_VFS(OS_OPEN, zName, flags, 0,
sqlite3OsOpen(REALVFS(pVfs), zName, p->pReal, flags, pOutFlags) sqlite3OsOpen(REALVFS(pVfs), zName, p->pReal, flags, pOutFlags)
@@ -478,7 +479,7 @@ static int instCurrentTime(sqlite3_vfs *pVfs, double *pTimeOut){
); );
} }
sqlite3_vfs *sqlite3_instvfs_create(char *zName, char *zParent){ sqlite3_vfs *sqlite3_instvfs_create(const char *zName, const char *zParent){
int nByte; int nByte;
InstVfs *p; InstVfs *p;
sqlite3_vfs *pParent; sqlite3_vfs *pParent;
@@ -506,7 +507,7 @@ sqlite3_vfs *sqlite3_instvfs_create(char *zName, char *zParent){
void sqlite3_instvfs_configure( void sqlite3_instvfs_configure(
sqlite3_vfs *pVfs, sqlite3_vfs *pVfs,
void (*xCall)(void *, int, sqlite3_int64, const char *, int, sqlite3_int64), void (*xCall)(void*, int, sqlite3_int64, const char*, int, int, i64),
void *pClient, void *pClient,
void (*xDel)(void *) void (*xDel)(void *)
){ ){
@@ -583,10 +584,111 @@ void sqlite3_instvfs_get(
*pnCall = p->aCount[eEvent]; *pnCall = p->aCount[eEvent];
} }
#define BINARYLOG_BUFFERSIZE 1024
struct InstVfsBinaryLog {
int nBuf;
char *zBuf;
sqlite3_int64 iOffset;
sqlite3_file *pOut;
};
typedef struct InstVfsBinaryLog InstVfsBinaryLog;
static void put32bits(unsigned char *p, u32 v){
p[0] = v>>24;
p[1] = v>>16;
p[2] = v>>8;
p[3] = v;
}
static void binarylog_xcall(
void *p,
int eEvent,
sqlite3_int64 nClick,
const char *zName,
int flags,
int nByte,
sqlite3_int64 iOffset
){
InstVfsBinaryLog *pLog = (InstVfsBinaryLog *)p;
unsigned char *zRec;
if( (20+pLog->nBuf)>BINARYLOG_BUFFERSIZE ){
sqlite3_file *pFile = pLog->pOut;
pFile->pMethods->xWrite(pFile, pLog->zBuf, pLog->nBuf, pLog->iOffset);
pLog->iOffset += pLog->nBuf;
pLog->nBuf = 0;
}
zRec = (unsigned char *)&pLog->zBuf[pLog->nBuf];
put32bits(&zRec[0], eEvent);
put32bits(&zRec[4], (int)nClick);
put32bits(&zRec[8], flags);
put32bits(&zRec[12], nByte);
put32bits(&zRec[16], (int)iOffset);
pLog->nBuf += 20;
}
static void binarylog_xdel(void *p){
/* Close the log file and free the memory allocated for the
** InstVfsBinaryLog structure.
*/
InstVfsBinaryLog *pLog = (InstVfsBinaryLog *)p;
sqlite3_file *pFile = pLog->pOut;
if( pLog->nBuf ){
pFile->pMethods->xWrite(pFile, pLog->zBuf, pLog->nBuf, pLog->iOffset);
}
pFile->pMethods->xClose(pFile);
sqlite3_free(pLog->zBuf);
sqlite3_free(pLog);
}
sqlite3_vfs *sqlite3_instvfs_binarylog(
const char *zVfs,
const char *zParentVfs,
const char *zLog
){
InstVfsBinaryLog *p;
sqlite3_vfs *pVfs;
sqlite3_vfs *pParent;
int nByte;
int flags;
int rc;
pParent = sqlite3_vfs_find(zParentVfs);
if( !pParent ){
return 0;
}
nByte = sizeof(InstVfsBinaryLog) + pParent->szOsFile;
p = (InstVfsBinaryLog *)sqlite3_malloc(nByte);
memset(p, 0, nByte);
p->zBuf = sqlite3_malloc(BINARYLOG_BUFFERSIZE);
p->pOut = (sqlite3_file *)&p[1];
flags = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE|SQLITE_OPEN_MASTER_JOURNAL;
rc = pParent->xOpen(pParent, zLog, p->pOut, flags, &flags);
if( rc==SQLITE_OK ){
rc = p->pOut->pMethods->xWrite(p->pOut, "sqlite_ostrace1.....", 20, 0);
p->iOffset = 20;
}
if( rc ){
binarylog_xdel(p);
return 0;
}
pVfs = sqlite3_instvfs_create(zVfs, zParentVfs);
if( pVfs ){
sqlite3_instvfs_configure(pVfs, binarylog_xcall, p, binarylog_xdel);
}
return pVfs;
}
/************************************************************************** /**************************************************************************
*************************************************************************** ***************************************************************************
** Tcl interface starts here. ** Tcl interface starts here.
*/ */
#if SQLITE_TEST
#include <tcl.h> #include <tcl.h>
@@ -601,6 +703,7 @@ static void test_instvfs_xcall(
int eEvent, int eEvent,
sqlite3_int64 nClick, sqlite3_int64 nClick,
const char *zName, const char *zName,
int flags,
int nByte, int nByte,
sqlite3_int64 iOffset sqlite3_int64 iOffset
){ ){
@@ -636,8 +739,8 @@ static int test_sqlite3_instvfs(
Tcl_Obj *CONST objv[] Tcl_Obj *CONST objv[]
){ ){
static const char *IV_strs[] = static const char *IV_strs[] =
{ "create", "destroy", "reset", "report", "configure", 0 }; { "create", "destroy", "reset", "report", "configure", "binarylog", 0 };
enum IV_enum { IV_CREATE, IV_DESTROY, IV_RESET, IV_REPORT, IV_CONFIGURE }; enum IV_enum { IV_CREATE, IV_DESTROY, IV_RESET, IV_REPORT, IV_CONFIGURE, IV_BINARYLOG };
int iSub; int iSub;
if( objc<2 ){ if( objc<2 ){
@@ -673,6 +776,31 @@ static int test_sqlite3_instvfs(
Tcl_SetObjResult(interp, objv[2]); Tcl_SetObjResult(interp, objv[2]);
break; break;
} }
case IV_BINARYLOG: {
char *zName = 0;
char *zLog = 0;
sqlite3_vfs *p;
int isDefault = 0;
if( objc>2 && 0==strcmp("-default", Tcl_GetString(objv[2])) ){
isDefault = 1;
}
if( (objc-isDefault)!=4 ){
Tcl_WrongNumArgs(interp, 2, objv, "?-default? NAME LOGFILE");
return TCL_ERROR;
}
zName = Tcl_GetString(objv[2+isDefault]);
zLog = Tcl_GetString(objv[3+isDefault]);
p = sqlite3_instvfs_binarylog(zName, 0, zLog);
if( !p ){
Tcl_AppendResult(interp, "error creating vfs ", 0);
return TCL_ERROR;
}
if( isDefault ){
sqlite3_vfs_register(p, 1);
}
Tcl_SetObjResult(interp, objv[2]);
break;
}
case IV_CONFIGURE: { case IV_CONFIGURE: {
InstVfsCall *pCall; InstVfsCall *pCall;