diff options
author | drh <drh@noemail.net> | 2001-11-09 13:41:09 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2001-11-09 13:41:09 +0000 |
commit | ce927065c21c89a019ff8601da8ae64b473f048d (patch) | |
tree | e6f545fefbdce72d8e5146c0349a9fc59650ffe8 /src/tclsqlite.c | |
parent | 487ab3ca18834979fe1a3e08ba03296caa2b518e (diff) | |
download | sqlite-ce927065c21c89a019ff8601da8ae64b473f048d.tar.gz sqlite-ce927065c21c89a019ff8601da8ae64b473f048d.zip |
Bug fixes. (CVS 306)
FossilOrigin-Name: 84997fda33fd6ce93b821d3da3a7251cf60e06ec
Diffstat (limited to 'src/tclsqlite.c')
-rw-r--r-- | src/tclsqlite.c | 35 |
1 files changed, 20 insertions, 15 deletions
diff --git a/src/tclsqlite.c b/src/tclsqlite.c index 4806a51d9..a604afc08 100644 --- a/src/tclsqlite.c +++ b/src/tclsqlite.c @@ -11,7 +11,7 @@ ************************************************************************* ** A TCL Interface to SQLite ** -** $Id: tclsqlite.c,v 1.27 2001/10/22 02:58:10 drh Exp $ +** $Id: tclsqlite.c,v 1.28 2001/11/09 13:41:10 drh Exp $ */ #ifndef NO_TCL /* Omit this whole file if TCL is unavailable */ @@ -19,6 +19,7 @@ #include "tcl.h" #include <stdlib.h> #include <string.h> +#include <assert.h> /* ** If TCL uses UTF-8 and SQLite is configured to use iso8859, then we @@ -50,7 +51,7 @@ struct CallbackData { Tcl_Interp *interp; /* The TCL interpreter */ 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 once; /* Set for first callback only */ int tcl_rc; /* Return code from TCL script */ int nColName; /* Number of entries in the azColName[] array */ char **azColName; /* Column names translated to UTF-8 */ @@ -74,26 +75,29 @@ static int DbEvalCallback( int i, rc; Tcl_DString dCol; Tcl_DStringInit(&dCol); - if( azCol==0 || (cbData->once && cbData->zArray[0]) ){ - Tcl_SetVar2(cbData->interp, cbData->zArray, "*", "", 0); - if( azCol ){ - cbData->azColName = malloc( nCol*sizeof(char*) ); - if( cbData->azColName==0 ){ return 1; } + if( cbData->azColName==0 ){ + assert( cbData->once ); + cbData->once = 0; + if( cbData->zArray[0] ){ + Tcl_SetVar2(cbData->interp, cbData->zArray, "*", "", 0); } + cbData->azColName = malloc( nCol*sizeof(char*) ); + if( cbData->azColName==0 ){ return 1; } cbData->nColName = nCol; for(i=0; i<nCol; i++){ Tcl_ExternalToUtfDString(NULL, azN[i], -1, &dCol); - if( azCol ){ - cbData->azColName[i] = malloc( Tcl_DStringLength(&dCol) + 1); - if( cbData->azColName[i] ){ - strcpy(cbData->azColName[i], Tcl_DStringValue(&dCol)); - } + cbData->azColName[i] = malloc( Tcl_DStringLength(&dCol) + 1 ); + if( cbData->azColName[i] ){ + strcpy(cbData->azColName[i], Tcl_DStringValue(&dCol)); + }else{ + return 1; + } + if( cbData->zArray[0] ){ + Tcl_SetVar2(cbData->interp, cbData->zArray, "*", + Tcl_DStringValue(&dCol), TCL_LIST_ELEMENT|TCL_APPEND_VALUE); } - Tcl_SetVar2(cbData->interp, cbData->zArray, "*", Tcl_DStringValue(&dCol), - TCL_LIST_ELEMENT|TCL_APPEND_VALUE); Tcl_DStringFree(&dCol); } - cbData->once = 0; } if( azCol!=0 ){ if( cbData->zArray[0] ){ @@ -414,6 +418,7 @@ static int DbObjCmd(void *cd, Tcl_Interp *interp, int objc,Tcl_Obj *const*objv){ if( cbData.azColName[i] ) free(cbData.azColName[i]); } free(cbData.azColName); + cbData.azColName = 0; } #endif return rc; |