15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** 2005 December 14
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** The author disclaims copyright to this source code.  In place of
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** a legal notice, here is a blessing:
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    May you do good and not evil.
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    May you find forgiveness for yourself and forgive others.
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**    May you share freely, never taking more than you give.
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*************************************************************************
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This file contains a binding of the asynchronous IO extension interface
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** (defined in ext/async/sqlite3async.h) to Tcl.
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define TCL_THREADS
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <tcl.h>
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_ENABLE_ASYNCIO
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sqlite3async.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sqlite3.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <assert.h>
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* From test1.c */
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char *sqlite3TestErrorName(int);
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct TestAsyncGlobal {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int isInstalled;                     /* True when async VFS is installed */
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} testasync_g = { 0 };
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TCL_DECLARE_MUTEX(testasync_g_writerMutex);
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3async_initialize PARENT-VFS ISDEFAULT
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int testAsyncInit(
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void * clientData,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Tcl_Interp *interp,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int objc,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Tcl_Obj *CONST objv[]
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *zParent;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int isDefault;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rc;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( objc!=3 ){
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Tcl_WrongNumArgs(interp, 1, objv, "PARENT-VFS ISDEFAULT");
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return TCL_ERROR;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  zParent = Tcl_GetString(objv[1]);
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( !*zParent ) {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    zParent = 0;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( Tcl_GetBooleanFromObj(interp, objv[2], &isDefault) ){
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return TCL_ERROR;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = sqlite3async_initialize(zParent, isDefault);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( rc!=SQLITE_OK ){
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3TestErrorName(rc), -1));
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return TCL_ERROR;
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TCL_OK;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3async_shutdown
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int testAsyncShutdown(
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void * clientData,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Tcl_Interp *interp,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int objc,
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Tcl_Obj *CONST objv[]
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3async_shutdown();
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TCL_OK;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static Tcl_ThreadCreateType tclWriterThread(ClientData pIsStarted){
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Tcl_MutexLock(&testasync_g_writerMutex);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *((int *)pIsStarted) = 1;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3async_run();
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Tcl_MutexUnlock(&testasync_g_writerMutex);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Tcl_ExitThread(0);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TCL_THREAD_CREATE_RETURN;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3async_start
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Start a new writer thread.
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int testAsyncStart(
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void * clientData,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Tcl_Interp *interp,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int objc,
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Tcl_Obj *CONST objv[]
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  volatile int isStarted = 0;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ClientData threadData = (ClientData)&isStarted;
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Tcl_ThreadId x;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int nStack = TCL_THREAD_STACK_DEFAULT;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const int flags = TCL_THREAD_NOFLAGS;
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rc;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rc = Tcl_CreateThread(&x, tclWriterThread, threadData, nStack, flags);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( rc!=TCL_OK ){
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Tcl_AppendResult(interp, "Tcl_CreateThread() failed", 0);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return TCL_ERROR;
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while( isStarted==0 ) { /* Busy loop */ }
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TCL_OK;
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3async_wait
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** Wait for the current writer thread to terminate.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)**
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** If the current writer thread is set to run forever then this
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** command would block forever.  To prevent that, an error is returned.
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int testAsyncWait(
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void * clientData,
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Tcl_Interp *interp,
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int objc,
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Tcl_Obj *CONST objv[]
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int eCond;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( objc!=1 ){
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Tcl_WrongNumArgs(interp, 1, objv, "");
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return TCL_ERROR;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sqlite3async_control(SQLITEASYNC_GET_HALT, &eCond);
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( eCond==SQLITEASYNC_HALT_NEVER ){
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Tcl_AppendResult(interp, "would block forever", (char*)0);
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return TCL_ERROR;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Tcl_MutexLock(&testasync_g_writerMutex);
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Tcl_MutexUnlock(&testasync_g_writerMutex);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TCL_OK;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** sqlite3async_control OPTION ?VALUE?
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static int testAsyncControl(
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void * clientData,
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Tcl_Interp *interp,
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int objc,
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Tcl_Obj *CONST objv[]
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)){
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int rc = SQLITE_OK;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int aeOpt[] = { SQLITEASYNC_HALT, SQLITEASYNC_DELAY, SQLITEASYNC_LOCKFILES };
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *azOpt[] = { "halt", "delay", "lockfiles", 0 };
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char *az[] = { "never", "now", "idle", 0 };
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int iVal;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int eOpt;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( objc!=2 && objc!=3 ){
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Tcl_WrongNumArgs(interp, 1, objv, "OPTION ?VALUE?");
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return TCL_ERROR;
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( Tcl_GetIndexFromObj(interp, objv[1], azOpt, "option", 0, &eOpt) ){
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return TCL_ERROR;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  eOpt = aeOpt[eOpt];
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( objc==3 ){
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch( eOpt ){
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case SQLITEASYNC_HALT: {
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert( SQLITEASYNC_HALT_NEVER==0 );
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert( SQLITEASYNC_HALT_NOW==1 );
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        assert( SQLITEASYNC_HALT_IDLE==2 );
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( Tcl_GetIndexFromObj(interp, objv[2], az, "value", 0, &iVal) ){
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return TCL_ERROR;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case SQLITEASYNC_DELAY:
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( Tcl_GetIntFromObj(interp, objv[2], &iVal) ){
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return TCL_ERROR;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      case SQLITEASYNC_LOCKFILES:
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        if( Tcl_GetBooleanFromObj(interp, objv[2], &iVal) ){
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          return TCL_ERROR;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        }
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = sqlite3async_control(eOpt, iVal);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( rc==SQLITE_OK ){
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rc = sqlite3async_control(
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        eOpt==SQLITEASYNC_HALT ? SQLITEASYNC_GET_HALT :
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        eOpt==SQLITEASYNC_DELAY ? SQLITEASYNC_GET_DELAY :
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        SQLITEASYNC_GET_LOCKFILES, &iVal);
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( rc!=SQLITE_OK ){
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3TestErrorName(rc), -1));
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return TCL_ERROR;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if( eOpt==SQLITEASYNC_HALT ){
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Tcl_SetObjResult(interp, Tcl_NewStringObj(az[iVal], -1));
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }else{
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Tcl_SetObjResult(interp, Tcl_NewIntObj(iVal));
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TCL_OK;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  /* SQLITE_ENABLE_ASYNCIO */
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** This routine registers the custom TCL commands defined in this
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** module.  This should be the only procedure visible from outside
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)** of this module.
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int Sqlitetestasync_Init(Tcl_Interp *interp){
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef SQLITE_ENABLE_ASYNCIO
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Tcl_CreateObjCommand(interp,"sqlite3async_start",testAsyncStart,0,0);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Tcl_CreateObjCommand(interp,"sqlite3async_wait",testAsyncWait,0,0);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Tcl_CreateObjCommand(interp,"sqlite3async_control",testAsyncControl,0,0);
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Tcl_CreateObjCommand(interp,"sqlite3async_initialize",testAsyncInit,0,0);
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Tcl_CreateObjCommand(interp,"sqlite3async_shutdown",testAsyncShutdown,0,0);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  /* SQLITE_ENABLE_ASYNCIO */
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return TCL_OK;
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
242