aboutsummaryrefslogtreecommitdiff
path: root/src/tclsqlite.c
diff options
context:
space:
mode:
authordrh <drh@noemail.net>2001-04-03 16:53:21 +0000
committerdrh <drh@noemail.net>2001-04-03 16:53:21 +0000
commit960e8c6317c3550faa1dab181a473d611f2fe378 (patch)
treec9716248e42d548ffe0f31bc8fbd34adf9832588 /src/tclsqlite.c
parent15c29be81cd9b4691057125a007e73cd24377ac8 (diff)
downloadsqlite-960e8c6317c3550faa1dab181a473d611f2fe378.tar.gz
sqlite-960e8c6317c3550faa1dab181a473d611f2fe378.zip
Bug fixes from Oleg Oleinick (CVS 195)
FossilOrigin-Name: 1f0197d504fa2bde15b287ac6c0102cacdb1e482
Diffstat (limited to 'src/tclsqlite.c')
-rw-r--r--src/tclsqlite.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/src/tclsqlite.c b/src/tclsqlite.c
index 81c9ddb7e..c88052422 100644
--- a/src/tclsqlite.c
+++ b/src/tclsqlite.c
@@ -23,7 +23,7 @@
*************************************************************************
** A TCL Interface to SQLite
**
-** $Id: tclsqlite.c,v 1.13 2001/01/31 13:28:09 drh Exp $
+** $Id: tclsqlite.c,v 1.14 2001/04/03 16:53:22 drh Exp $
*/
#ifndef NO_TCL /* Omit this whole file if TCL is unavailable */
@@ -53,6 +53,7 @@ struct CallbackData {
char *zArray; /* The array into which data is written */
Tcl_Obj *pCode; /* The code to execute for each row */
int once; /* Set only for the first invocation of callback */
+ int tcl_rc; /* Return code from TCL script */
};
/*
@@ -88,7 +89,9 @@ static int DbEvalCallback(
}
cbData->once = 0;
rc = Tcl_EvalObj(cbData->interp, cbData->pCode);
- return rc!=TCL_OK && rc!=TCL_CONTINUE;
+ if( rc==TCL_CONTINUE ) rc = TCL_OK;
+ cbData->tcl_rc = rc;
+ return rc!=TCL_OK;
}
/*
@@ -171,7 +174,7 @@ static int DbObjCmd(void *cd, Tcl_Interp *interp, int objc,Tcl_Obj *const*objv){
SqliteDb *pDb = (SqliteDb*)cd;
int choice;
static char *DB_optStrs[] = {
- "busy", "close", "complete", "eval", "timeout"
+ "busy", "close", "complete", "eval", "timeout", 0
};
enum DB_opts {
DB_BUSY, DB_CLOSE, DB_COMPLETE, DB_EVAL, DB_TIMEOUT
@@ -278,20 +281,26 @@ static int DbObjCmd(void *cd, Tcl_Interp *interp, int objc,Tcl_Obj *const*objv){
cbData.once = 1;
cbData.zArray = Tcl_GetStringFromObj(objv[3], 0);
cbData.pCode = objv[4];
+ cbData.tcl_rc = TCL_OK;
zErrMsg = 0;
Tcl_IncrRefCount(objv[3]);
Tcl_IncrRefCount(objv[4]);
rc = sqlite_exec(pDb->db, zSql, DbEvalCallback, &cbData, &zErrMsg);
Tcl_DecrRefCount(objv[4]);
Tcl_DecrRefCount(objv[3]);
+ if( cbData.tcl_rc==TCL_BREAK ){ cbData.tcl_rc = TCL_OK; }
}else{
Tcl_Obj *pList = Tcl_NewObj();
+ cbData.tcl_rc = TCL_OK;
rc = sqlite_exec(pDb->db, zSql, DbEvalCallback2, pList, &zErrMsg);
Tcl_SetObjResult(interp, pList);
}
if( zErrMsg ){
Tcl_SetResult(interp, zErrMsg, TCL_VOLATILE);
free(zErrMsg);
+ rc = TCL_ERROR;
+ }else{
+ rc = cbData.tcl_rc;
}
Tcl_DecrRefCount(objv[2]);
return rc;