diff options
-rw-r--r-- | manifest | 12 | ||||
-rw-r--r-- | manifest.uuid | 2 | ||||
-rw-r--r-- | src/tclsqlite.c | 101 |
3 files changed, 106 insertions, 9 deletions
@@ -1,5 +1,5 @@ -C A\sfew\smore\sbugfixes.\sTest\scases\spass\snow.\s(CVS\s1472) -D 2004-05-27T10:30:53 +C Alter\sthe\sTcl\seval\ssub-command\sso\sthat\sit\ssupports\sblobs.\s(CVS\s1473) +D 2004-05-27T12:11:32 F Makefile.in ab7b0d5118e2da97bac66be8684a1034e3500f5a F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906 F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd @@ -58,7 +58,7 @@ F src/shell.c ed4d237b3e52a0a42512bfcc53530e46de20c28f F src/sqlite.h.in cda883efb11c6f767eaf3fea06b3e3419d9cfe7f F src/sqliteInt.h dbf4fd06e89cdab13f4f1129d76bf79a38ec2b39 F src/table.c af14284fa36c8d41f6829e3f2819dce07d3e2de2 -F src/tclsqlite.c 86daf7bf6ba715bf0f0c7a47beb1d947a15cb868 +F src/tclsqlite.c 6fab79639917c37dce1ddb2e9dcf3bc1b09001ec F src/test1.c 08da53d31d5b3eb11ac988f933fc6efa508712e4 F src/test2.c 6195a1ca2c8d0d2d93644e86da3289b403486872 F src/test3.c 5e4a6d596f982f6f47a5f9f75ede9b4a3b739968 @@ -205,7 +205,7 @@ F www/sqlite.tcl 3c83b08cf9f18aa2d69453ff441a36c40e431604 F www/tclsqlite.tcl b9271d44dcf147a93c98f8ecf28c927307abd6da F www/vdbe.tcl 9b9095d4495f37697fd1935d10e14c6015e80aa1 F www/whentouse.tcl a8335bce47cc2fddb07f19052cb0cb4d9129a8e4 -P 67a140cf78d99e38ccd94751c4f8ead1a2b96859 -R 382aedd8344dcd75ae00b092ce46368c +P c9e3015faffb650d8dbf1f7f95a7057a36361bac +R f916301fbb891efd9f50955fcfaa0d10 U danielk1977 -Z f32afbbe0a3d491153953c08c35e38ee +Z c10836444240fdf809d1ebf5efde5c0a diff --git a/manifest.uuid b/manifest.uuid index e88bc0fa2..9840f247a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c9e3015faffb650d8dbf1f7f95a7057a36361bac
\ No newline at end of file +b5d5f0ad717ef43a9714dd1cc40e20d1b94a3e58
\ No newline at end of file diff --git a/src/tclsqlite.c b/src/tclsqlite.c index 33355ba2b..a8dc7c09b 100644 --- a/src/tclsqlite.c +++ b/src/tclsqlite.c @@ -11,7 +11,7 @@ ************************************************************************* ** A TCL Interface to SQLite ** -** $Id: tclsqlite.c,v 1.73 2004/05/26 23:25:31 drh Exp $ +** $Id: tclsqlite.c,v 1.74 2004/05/27 12:11:32 danielk1977 Exp $ */ #ifndef NO_TCL /* Omit this whole file if TCL is unavailable */ @@ -57,6 +57,7 @@ struct SqliteDb { char *zAuth; /* The authorization callback routine */ SqlFunc *pFunc; /* List of SQL functions */ int rc; /* Return code of most recent sqlite3_exec() */ + int nChange; /* Database changes for the most recent eval */ }; /* @@ -660,7 +661,8 @@ static int DbObjCmd(void *cd, Tcl_Interp *interp, int objc,Tcl_Obj *const*objv){ Tcl_WrongNumArgs(interp, 2, objv, ""); return TCL_ERROR; } - nChange = sqlite3_changes(pDb->db); + /* nChange = sqlite3_changes(pDb->db); */ + nChange = pDb->nChange; pResult = Tcl_GetObjResult(interp); Tcl_SetIntObj(pResult, nChange); break; @@ -772,6 +774,100 @@ static int DbObjCmd(void *cd, Tcl_Interp *interp, int objc,Tcl_Obj *const*objv){ ** that have the same name as the fields extracted by the query. */ case DB_EVAL: { + char const *zSql; + char const *zLeft; + sqlite3_stmt *pStmt; + Tcl_Obj *pRet = 0; + + if( objc!=5 && objc!=3 ){ + Tcl_WrongNumArgs(interp, 2, objv, "SQL ?ARRAY-NAME CODE?"); + return TCL_ERROR; + } + + pDb->nChange = 0; + zSql = Tcl_GetStringFromObj(objv[2], 0); + while( zSql[0] ){ + int i; + + if( SQLITE_OK!=sqlite3_prepare(pDb->db, zSql, -1, &pStmt, &zLeft) ){ + Tcl_SetResult(interp, (char *)sqlite3_errmsg(pDb->db), TCL_STATIC); + rc = TCL_ERROR; + break; + } + + if( pStmt && objc==5 ){ + Tcl_Obj *pColList = Tcl_NewObj(); + Tcl_IncrRefCount(pColList); + + for(i=0; i<sqlite3_column_count(pStmt); i++){ + Tcl_ListObjAppendElement(interp, pColList, + Tcl_NewStringObj(sqlite3_column_name(pStmt, i), -1) + ); + } + Tcl_ObjSetVar2(interp,objv[3],Tcl_NewStringObj("*",-1),pColList,0); + } + + while( pStmt && SQLITE_ROW==sqlite3_step(pStmt) ){ + for(i=0; i<sqlite3_column_count(pStmt); i++){ + Tcl_Obj *pVal; + + /* Set pVal to contain the i'th column of this row. */ + if( SQLITE3_BLOB!=sqlite3_column_type(pStmt, i) ){ + pVal = Tcl_NewStringObj(sqlite3_column_text(pStmt, i), -1); + }else{ + pVal = Tcl_NewByteArrayObj( + sqlite3_column_blob(pStmt, i), + sqlite3_column_bytes(pStmt, i) + ); + } + + if( objc==5 ){ + Tcl_Obj *pName = Tcl_NewStringObj(sqlite3_column_name(pStmt, i), -1); + Tcl_IncrRefCount(pName); + if( !strcmp("", Tcl_GetString(objv[3])) ){ + Tcl_ObjSetVar2(interp, pName, 0, pVal, 0); + }else{ + Tcl_ObjSetVar2(interp, objv[3], pName, pVal, 0); + } + Tcl_DecrRefCount(pName); + }else{ + if( !pRet ){ + pRet = Tcl_NewObj(); + Tcl_IncrRefCount(pRet); + } + Tcl_ListObjAppendElement(interp, pRet, pVal); + } + } + + if( objc==5 ){ + rc = Tcl_EvalObjEx(interp, objv[4], 0); + if( rc!=TCL_ERROR ) rc = TCL_OK; + } + } + + if( pStmt && SQLITE_SCHEMA==sqlite3_finalize(pStmt) ){ + continue; + } + + if( pStmt && SQLITE_OK!=sqlite3_errcode(pDb->db) ){ + Tcl_SetResult(interp, (char *)sqlite3_errmsg(pDb->db), TCL_STATIC); + rc = TCL_ERROR; + break; + } + + pDb->nChange += sqlite3_changes(pDb->db); + zSql = zLeft; + } + + if( rc==TCL_OK && pRet ){ + Tcl_SetObjResult(interp, pRet); + Tcl_DecrRefCount(pRet); + } + + break; + } +#if 0 + case DB_EVAL: { CallbackData cbData; char *zErrMsg; char *zSql; @@ -839,6 +935,7 @@ static int DbObjCmd(void *cd, Tcl_Interp *interp, int objc,Tcl_Obj *const*objv){ #endif return rc; } +#endif /* ** $db function NAME SCRIPT |