]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Alter the Tcl eval sub-command so that it supports blobs. (CVS 1473)
authordanielk1977 <danielk1977@noemail.net>
Thu, 27 May 2004 12:11:31 +0000 (12:11 +0000)
committerdanielk1977 <danielk1977@noemail.net>
Thu, 27 May 2004 12:11:31 +0000 (12:11 +0000)
FossilOrigin-Name: b5d5f0ad717ef43a9714dd1cc40e20d1b94a3e58

manifest
manifest.uuid
src/tclsqlite.c

index fd9f36f69349adf0c85d3cc12813db8b0b5053c3..123e64a487ea9487fa8b9e2fd22feb3dfba3f9c2 100644 (file)
--- a/manifest
+++ b/manifest
@@ -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
index e88bc0fa28cd0545854fc122d93606f39d4d1bfd..9840f247a24c144e5f4b952f957d2215218b3219 100644 (file)
@@ -1 +1 @@
-c9e3015faffb650d8dbf1f7f95a7057a36361bac
\ No newline at end of file
+b5d5f0ad717ef43a9714dd1cc40e20d1b94a3e58
\ No newline at end of file
index 33355ba2b05a0cf0144a9e81609daae46645d2f7..a8dc7c09ba24a90674adbd7f22393ff5fa4d247d 100644 (file)
@@ -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;
@@ -771,6 +773,100 @@ static int DbObjCmd(void *cd, Tcl_Interp *interp, int objc,Tcl_Obj *const*objv){
   ** If "array" is an empty string, then the values are placed in variables
   ** 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;
@@ -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