Bug fixes from Oleg Oleinick (CVS 195)

FossilOrigin-Name: 1f0197d504fa2bde15b287ac6c0102cacdb1e482
diff --git a/src/tclsqlite.c b/src/tclsqlite.c
index 81c9ddb..c880524 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 @@
   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 @@
   }
   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 @@
   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 @@
       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;