aboutsummaryrefslogtreecommitdiff
path: root/src/test_async.c
diff options
context:
space:
mode:
authordanielk1977 <danielk1977@noemail.net>2009-04-25 08:39:14 +0000
committerdanielk1977 <danielk1977@noemail.net>2009-04-25 08:39:14 +0000
commit6f050aa2bf87ebea21e95231a80aec68b1363e30 (patch)
tree2516b0c778e24d4a79646c64fabe12516a89d12c /src/test_async.c
parent4fa326564a6af062eaa4f035e0fe1a228e71252e (diff)
downloadsqlite-6f050aa2bf87ebea21e95231a80aec68b1363e30.tar.gz
sqlite-6f050aa2bf87ebea21e95231a80aec68b1363e30.zip
Tests for the new asynchronous IO API. (CVS 6549)
FossilOrigin-Name: 11b2564e7159168cd0815bb9bc93688586fad1e0
Diffstat (limited to 'src/test_async.c')
-rw-r--r--src/test_async.c178
1 files changed, 101 insertions, 77 deletions
diff --git a/src/test_async.c b/src/test_async.c
index 8787d4c22..4faa51ea9 100644
--- a/src/test_async.c
+++ b/src/test_async.c
@@ -10,7 +10,7 @@
**
*************************************************************************
**
-** $Id: test_async.c,v 1.60 2009/04/24 10:13:06 danielk1977 Exp $
+** $Id: test_async.c,v 1.61 2009/04/25 08:39:15 danielk1977 Exp $
**
** This file contains a binding of the asynchronous IO extension interface
** (defined in ext/async/sqlite3async.h) to Tcl.
@@ -25,6 +25,9 @@
#include "sqlite3.h"
#include <assert.h>
+/* From test1.c */
+const char *sqlite3TestErrorName(int);
+
struct TestAsyncGlobal {
int isInstalled; /* True when async VFS is installed */
@@ -33,101 +36,48 @@ struct TestAsyncGlobal {
TCL_DECLARE_MUTEX(testasync_g_writerMutex);
/*
-** sqlite3async_enable ?YES/NO?
-**
-** Enable or disable the asynchronous I/O backend. This command is
-** not thread-safe. Do not call it while any database connections
-** are open.
+** sqlite3async_initialize PARENT-VFS ISDEFAULT
*/
-static int testAsyncEnable(
+static int testAsyncInit(
void * clientData,
Tcl_Interp *interp,
int objc,
Tcl_Obj *CONST objv[]
){
- if( objc!=1 && objc!=2 ){
- Tcl_WrongNumArgs(interp, 1, objv, "?YES/NO?");
+ const char *zParent;
+ int isDefault;
+ int rc;
+
+ if( objc!=3 ){
+ Tcl_WrongNumArgs(interp, 1, objv, "PARENT-VFS ISDEFAULT");
return TCL_ERROR;
}
- if( objc==1 ){
- Tcl_SetObjResult(interp, Tcl_NewIntObj(testasync_g.isInstalled));
- }else{
- int enable;
- if( Tcl_GetBooleanFromObj(interp, objv[1], &enable) ) return TCL_ERROR;
- if( enable ){
- sqlite3async_initialize(0, 1);
- }else{
- sqlite3async_shutdown();
- }
- testasync_g.isInstalled = enable;
+ zParent = Tcl_GetString(objv[1]);
+ if( !*zParent ) {
+ zParent = 0;
}
- return TCL_OK;
-}
-
-/*
-** sqlite3async_halt ?"now"|"idle"|"never"?
-**
-** Set the conditions at which the writer thread will halt.
-*/
-static int testAsyncHalt(
- void * clientData,
- Tcl_Interp *interp,
- int objc,
- Tcl_Obj *CONST objv[]
-){
- int eWhen;
- const char *azConstant[] = { "never", "now", "idle", 0 };
-
- assert( SQLITEASYNC_HALT_NEVER==0 );
- assert( SQLITEASYNC_HALT_NOW==1 );
- assert( SQLITEASYNC_HALT_IDLE==2 );
-
- if( objc!=1 && objc!=2 ){
- Tcl_WrongNumArgs(interp, 1, objv, "?OPTION?");
+ if( Tcl_GetBooleanFromObj(interp, objv[2], &isDefault) ){
return TCL_ERROR;
}
- if( objc==2 ){
- if( Tcl_GetIndexFromObj(interp, objv[1], azConstant, "option", 0, &eWhen) ){
- return TCL_ERROR;
- }
- sqlite3async_control(SQLITEASYNC_HALT, eWhen);
- }
-
- /* Always return the current value of the 'halt' option. */
- sqlite3async_control(SQLITEASYNC_GET_HALT, &eWhen);
- Tcl_SetObjResult(interp, Tcl_NewStringObj(azConstant[eWhen], -1));
+ rc = sqlite3async_initialize(zParent, isDefault);
+ if( rc!=SQLITE_OK ){
+ Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3TestErrorName(rc), -1));
+ return TCL_ERROR;
+ }
return TCL_OK;
}
/*
-** sqlite3async_delay ?MS?
-**
-** Query or set the number of milliseconds of delay in the writer
-** thread after each write operation. The default is 0. By increasing
-** the memory delay we can simulate the effect of slow disk I/O.
+** sqlite3async_shutdown
*/
-static int testAsyncDelay(
+static int testAsyncShutdown(
void * clientData,
Tcl_Interp *interp,
int objc,
Tcl_Obj *CONST objv[]
){
- int iMs;
- if( objc!=1 && objc!=2 ){
- Tcl_WrongNumArgs(interp, 1, objv, "?MS?");
- return TCL_ERROR;
- }
- if( objc==2 ){
- if( Tcl_GetIntFromObj(interp, objv[1], &iMs) ){
- return TCL_ERROR;
- }
- sqlite3async_control(SQLITEASYNC_DELAY, iMs);
- }
-
- /* Always return the current value of the 'delay' option. */
- sqlite3async_control(SQLITEASYNC_GET_DELAY, &iMs);
- Tcl_SetObjResult(interp, Tcl_NewIntObj(iMs));
+ sqlite3async_shutdown();
return TCL_OK;
}
@@ -199,6 +149,79 @@ static int testAsyncWait(
return TCL_OK;
}
+/*
+** sqlite3async_control OPTION ?VALUE?
+*/
+static int testAsyncControl(
+ void * clientData,
+ Tcl_Interp *interp,
+ int objc,
+ Tcl_Obj *CONST objv[]
+){
+ int rc = SQLITE_OK;
+ int aeOpt[] = { SQLITEASYNC_HALT, SQLITEASYNC_DELAY, SQLITEASYNC_LOCKFILES };
+ const char *azOpt[] = { "halt", "delay", "lockfiles", 0 };
+ const char *az[] = { "never", "now", "idle", 0 };
+ int iVal;
+ int eOpt;
+
+ if( objc!=2 && objc!=3 ){
+ Tcl_WrongNumArgs(interp, 1, objv, "OPTION ?VALUE?");
+ return TCL_ERROR;
+ }
+ if( Tcl_GetIndexFromObj(interp, objv[1], azOpt, "option", 0, &eOpt) ){
+ return TCL_ERROR;
+ }
+ eOpt = aeOpt[eOpt];
+
+ if( objc==3 ){
+ switch( eOpt ){
+ case SQLITEASYNC_HALT: {
+ assert( SQLITEASYNC_HALT_NEVER==0 );
+ assert( SQLITEASYNC_HALT_NOW==1 );
+ assert( SQLITEASYNC_HALT_IDLE==2 );
+ if( Tcl_GetIndexFromObj(interp, objv[2], az, "value", 0, &iVal) ){
+ return TCL_ERROR;
+ }
+ break;
+ }
+ case SQLITEASYNC_DELAY:
+ if( Tcl_GetIntFromObj(interp, objv[2], &iVal) ){
+ return TCL_ERROR;
+ }
+ break;
+
+ case SQLITEASYNC_LOCKFILES:
+ if( Tcl_GetBooleanFromObj(interp, objv[2], &iVal) ){
+ return TCL_ERROR;
+ }
+ break;
+ }
+
+ rc = sqlite3async_control(eOpt, iVal);
+ }
+
+ if( rc==SQLITE_OK ){
+ rc = sqlite3async_control(
+ eOpt==SQLITEASYNC_HALT ? SQLITEASYNC_GET_HALT :
+ eOpt==SQLITEASYNC_DELAY ? SQLITEASYNC_GET_DELAY :
+ SQLITEASYNC_GET_LOCKFILES, &iVal);
+ }
+
+ if( rc!=SQLITE_OK ){
+ Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3TestErrorName(rc), -1));
+ return TCL_ERROR;
+ }
+
+ if( eOpt==SQLITEASYNC_HALT ){
+ Tcl_SetObjResult(interp, Tcl_NewStringObj(az[iVal], -1));
+ }else{
+ Tcl_SetObjResult(interp, Tcl_NewIntObj(iVal));
+ }
+
+ return TCL_OK;
+}
+
#endif /* SQLITE_ENABLE_ASYNCIO */
/*
@@ -208,11 +231,12 @@ static int testAsyncWait(
*/
int Sqlitetestasync_Init(Tcl_Interp *interp){
#if SQLITE_ENABLE_ASYNCIO
- Tcl_CreateObjCommand(interp,"sqlite3async_enable",testAsyncEnable,0,0);
- Tcl_CreateObjCommand(interp,"sqlite3async_halt",testAsyncHalt,0,0);
- Tcl_CreateObjCommand(interp,"sqlite3async_delay",testAsyncDelay,0,0);
Tcl_CreateObjCommand(interp,"sqlite3async_start",testAsyncStart,0,0);
Tcl_CreateObjCommand(interp,"sqlite3async_wait",testAsyncWait,0,0);
+
+ Tcl_CreateObjCommand(interp,"sqlite3async_control",testAsyncControl,0,0);
+ Tcl_CreateObjCommand(interp,"sqlite3async_initialize",testAsyncInit,0,0);
+ Tcl_CreateObjCommand(interp,"sqlite3async_shutdown",testAsyncShutdown,0,0);
#endif /* SQLITE_ENABLE_ASYNCIO */
return TCL_OK;
}