mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-10 01:02:56 +03:00
Alter the Tcl eval sub-command so that it supports blobs. (CVS 1473)
FossilOrigin-Name: b5d5f0ad717ef43a9714dd1cc40e20d1b94a3e58
This commit is contained in:
12
manifest
12
manifest
@@ -1,5 +1,5 @@
|
|||||||
C A\sfew\smore\sbugfixes.\sTest\scases\spass\snow.\s(CVS\s1472)
|
C Alter\sthe\sTcl\seval\ssub-command\sso\sthat\sit\ssupports\sblobs.\s(CVS\s1473)
|
||||||
D 2004-05-27T10:30:53
|
D 2004-05-27T12:11:32
|
||||||
F Makefile.in ab7b0d5118e2da97bac66be8684a1034e3500f5a
|
F Makefile.in ab7b0d5118e2da97bac66be8684a1034e3500f5a
|
||||||
F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906
|
F Makefile.linux-gcc b86a99c493a5bfb402d1d9178dcdc4bd4b32f906
|
||||||
F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd
|
F README f1de682fbbd94899d50aca13d387d1b3fd3be2dd
|
||||||
@@ -58,7 +58,7 @@ F src/shell.c ed4d237b3e52a0a42512bfcc53530e46de20c28f
|
|||||||
F src/sqlite.h.in cda883efb11c6f767eaf3fea06b3e3419d9cfe7f
|
F src/sqlite.h.in cda883efb11c6f767eaf3fea06b3e3419d9cfe7f
|
||||||
F src/sqliteInt.h dbf4fd06e89cdab13f4f1129d76bf79a38ec2b39
|
F src/sqliteInt.h dbf4fd06e89cdab13f4f1129d76bf79a38ec2b39
|
||||||
F src/table.c af14284fa36c8d41f6829e3f2819dce07d3e2de2
|
F src/table.c af14284fa36c8d41f6829e3f2819dce07d3e2de2
|
||||||
F src/tclsqlite.c 86daf7bf6ba715bf0f0c7a47beb1d947a15cb868
|
F src/tclsqlite.c 6fab79639917c37dce1ddb2e9dcf3bc1b09001ec
|
||||||
F src/test1.c 08da53d31d5b3eb11ac988f933fc6efa508712e4
|
F src/test1.c 08da53d31d5b3eb11ac988f933fc6efa508712e4
|
||||||
F src/test2.c 6195a1ca2c8d0d2d93644e86da3289b403486872
|
F src/test2.c 6195a1ca2c8d0d2d93644e86da3289b403486872
|
||||||
F src/test3.c 5e4a6d596f982f6f47a5f9f75ede9b4a3b739968
|
F src/test3.c 5e4a6d596f982f6f47a5f9f75ede9b4a3b739968
|
||||||
@@ -205,7 +205,7 @@ F www/sqlite.tcl 3c83b08cf9f18aa2d69453ff441a36c40e431604
|
|||||||
F www/tclsqlite.tcl b9271d44dcf147a93c98f8ecf28c927307abd6da
|
F www/tclsqlite.tcl b9271d44dcf147a93c98f8ecf28c927307abd6da
|
||||||
F www/vdbe.tcl 9b9095d4495f37697fd1935d10e14c6015e80aa1
|
F www/vdbe.tcl 9b9095d4495f37697fd1935d10e14c6015e80aa1
|
||||||
F www/whentouse.tcl a8335bce47cc2fddb07f19052cb0cb4d9129a8e4
|
F www/whentouse.tcl a8335bce47cc2fddb07f19052cb0cb4d9129a8e4
|
||||||
P 67a140cf78d99e38ccd94751c4f8ead1a2b96859
|
P c9e3015faffb650d8dbf1f7f95a7057a36361bac
|
||||||
R 382aedd8344dcd75ae00b092ce46368c
|
R f916301fbb891efd9f50955fcfaa0d10
|
||||||
U danielk1977
|
U danielk1977
|
||||||
Z f32afbbe0a3d491153953c08c35e38ee
|
Z c10836444240fdf809d1ebf5efde5c0a
|
||||||
|
@@ -1 +1 @@
|
|||||||
c9e3015faffb650d8dbf1f7f95a7057a36361bac
|
b5d5f0ad717ef43a9714dd1cc40e20d1b94a3e58
|
101
src/tclsqlite.c
101
src/tclsqlite.c
@@ -11,7 +11,7 @@
|
|||||||
*************************************************************************
|
*************************************************************************
|
||||||
** A TCL Interface to SQLite
|
** 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 */
|
#ifndef NO_TCL /* Omit this whole file if TCL is unavailable */
|
||||||
|
|
||||||
@@ -57,6 +57,7 @@ struct SqliteDb {
|
|||||||
char *zAuth; /* The authorization callback routine */
|
char *zAuth; /* The authorization callback routine */
|
||||||
SqlFunc *pFunc; /* List of SQL functions */
|
SqlFunc *pFunc; /* List of SQL functions */
|
||||||
int rc; /* Return code of most recent sqlite3_exec() */
|
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, "");
|
Tcl_WrongNumArgs(interp, 2, objv, "");
|
||||||
return TCL_ERROR;
|
return TCL_ERROR;
|
||||||
}
|
}
|
||||||
nChange = sqlite3_changes(pDb->db);
|
/* nChange = sqlite3_changes(pDb->db); */
|
||||||
|
nChange = pDb->nChange;
|
||||||
pResult = Tcl_GetObjResult(interp);
|
pResult = Tcl_GetObjResult(interp);
|
||||||
Tcl_SetIntObj(pResult, nChange);
|
Tcl_SetIntObj(pResult, nChange);
|
||||||
break;
|
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
|
** 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.
|
** 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: {
|
case DB_EVAL: {
|
||||||
CallbackData cbData;
|
CallbackData cbData;
|
||||||
char *zErrMsg;
|
char *zErrMsg;
|
||||||
@@ -839,6 +935,7 @@ static int DbObjCmd(void *cd, Tcl_Interp *interp, int objc,Tcl_Obj *const*objv){
|
|||||||
#endif
|
#endif
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** $db function NAME SCRIPT
|
** $db function NAME SCRIPT
|
||||||
|
Reference in New Issue
Block a user