aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/tclsqlite.c64
1 files changed, 61 insertions, 3 deletions
diff --git a/src/tclsqlite.c b/src/tclsqlite.c
index 20d7499f0..6f186028f 100644
--- a/src/tclsqlite.c
+++ b/src/tclsqlite.c
@@ -11,7 +11,7 @@
*************************************************************************
** A TCL Interface to SQLite
**
-** $Id: tclsqlite.c,v 1.49 2003/06/06 19:00:42 drh Exp $
+** $Id: tclsqlite.c,v 1.50 2003/08/19 14:31:02 drh Exp $
*/
#ifndef NO_TCL /* Omit this whole file if TCL is unavailable */
@@ -249,6 +249,35 @@ static int DbEvalCallback2(
}
/*
+** This is a second alternative callback for database queries. A the
+** first column of the first row of the result is made the TCL result.
+*/
+static int DbEvalCallback3(
+ void *clientData, /* An instance of CallbackData */
+ int nCol, /* Number of columns in the result */
+ char ** azCol, /* Data for each column */
+ char ** azN /* Name for each column */
+){
+ Tcl_Interp *interp = (Tcl_Interp*)clientData;
+ Tcl_Obj *pElem;
+ if( azCol==0 ) return 1;
+ if( nCol==0 ) return 1;
+#ifdef UTF_TRANSLATION_NEEDED
+ {
+ Tcl_DString dCol;
+ Tcl_DStringInit(&dCol);
+ Tcl_ExternalToUtfDString(NULL, azCol[0], -1, &dCol);
+ pElem = Tcl_NewStringObj(Tcl_DStringValue(&dCol), -1);
+ Tcl_DStringFree(&dCol);
+ }
+#else
+ pElem = Tcl_NewStringObj(azCol[0], -1);
+#endif
+ Tcl_SetObjResult(interp, pElem);
+ return 1;
+}
+
+/*
** Called when the command is deleted.
*/
static void DbDeleteCmd(void *db){
@@ -427,13 +456,14 @@ static int DbObjCmd(void *cd, Tcl_Interp *interp, int objc,Tcl_Obj *const*objv){
"authorizer", "busy", "changes",
"close", "complete", "errorcode",
"eval", "function", "last_insert_rowid",
- "timeout", "trace", 0
+ "onecolumn", "timeout", "trace",
+ 0
};
enum DB_enum {
DB_AUTHORIZER, DB_BUSY, DB_CHANGES,
DB_CLOSE, DB_COMPLETE, DB_ERRORCODE,
DB_EVAL, DB_FUNCTION, DB_LAST_INSERT_ROWID,
- DB_TIMEOUT, DB_TRACE,
+ DB_ONECOLUMN, DB_TIMEOUT, DB_TRACE,
};
if( objc<2 ){
@@ -716,6 +746,34 @@ static int DbObjCmd(void *cd, Tcl_Interp *interp, int objc,Tcl_Obj *const*objv){
}
/*
+ ** $db onecolumn SQL
+ **
+ ** Return a single column from a single row of the given SQL query.
+ */
+ case DB_ONECOLUMN: {
+ int rc;
+ char *zSql;
+ char *zErrMsg = 0;
+ if( objc!=3 ){
+ Tcl_WrongNumArgs(interp, 2, objv, "SQL");
+ return TCL_ERROR;
+ }
+ zSql = Tcl_GetStringFromObj(objv[2], 0);
+ rc = sqlite_exec(pDb->db, zSql, DbEvalCallback3, interp, &zErrMsg);
+ if( rc==SQLITE_ABORT ){
+ /* Do nothing. This is normal. */
+ }else if( zErrMsg ){
+ Tcl_SetResult(interp, zErrMsg, TCL_VOLATILE);
+ free(zErrMsg);
+ rc = TCL_ERROR;
+ }else if( rc!=SQLITE_OK ){
+ Tcl_AppendResult(interp, sqlite_error_string(rc), 0);
+ rc = TCL_ERROR;
+ }
+ break;
+ }
+
+ /*
** $db timeout MILLESECONDS
**
** Delay for the number of milliseconds specified when a file is locked.