xref: /sqlite-3.40.0/src/tclsqlite.c (revision ef5ecb41)
1 /*
2 ** 2001 September 15
3 **
4 ** The author disclaims copyright to this source code.  In place of
5 ** a legal notice, here is a blessing:
6 **
7 **    May you do good and not evil.
8 **    May you find forgiveness for yourself and forgive others.
9 **    May you share freely, never taking more than you give.
10 **
11 *************************************************************************
12 ** A TCL Interface to SQLite
13 **
14 ** $Id: tclsqlite.c,v 1.83 2004/06/10 10:50:38 danielk1977 Exp $
15 */
16 #ifndef NO_TCL     /* Omit this whole file if TCL is unavailable */
17 
18 #include "sqliteInt.h"
19 #include "tcl.h"
20 #include <stdlib.h>
21 #include <string.h>
22 #include <assert.h>
23 
24 /*
25 ** If TCL uses UTF-8 and SQLite is configured to use iso8859, then we
26 ** have to do a translation when going between the two.  Set the
27 ** UTF_TRANSLATION_NEEDED macro to indicate that we need to do
28 ** this translation.
29 */
30 #if defined(TCL_UTF_MAX) && !defined(SQLITE_UTF8)
31 # define UTF_TRANSLATION_NEEDED 1
32 #endif
33 
34 /*
35 ** New SQL functions can be created as TCL scripts.  Each such function
36 ** is described by an instance of the following structure.
37 */
38 typedef struct SqlFunc SqlFunc;
39 struct SqlFunc {
40   Tcl_Interp *interp;   /* The TCL interpret to execute the function */
41   char *zScript;        /* The script to be run */
42   SqlFunc *pNext;       /* Next function on the list of them all */
43 };
44 
45 /*
46 ** New collation sequences function can be created as TCL scripts.  Each such
47 ** function is described by an instance of the following structure.
48 */
49 typedef struct SqlCollate SqlCollate;
50 struct SqlCollate {
51   Tcl_Interp *interp;   /* The TCL interpret to execute the function */
52   char *zScript;        /* The script to be run */
53   SqlCollate *pNext;       /* Next function on the list of them all */
54 };
55 
56 /*
57 ** There is one instance of this structure for each SQLite database
58 ** that has been opened by the SQLite TCL interface.
59 */
60 typedef struct SqliteDb SqliteDb;
61 struct SqliteDb {
62   sqlite *db;           /* The "real" database structure */
63   Tcl_Interp *interp;   /* The interpreter used for this database */
64   char *zBusy;          /* The busy callback routine */
65   char *zCommit;        /* The commit hook callback routine */
66   char *zTrace;         /* The trace callback routine */
67   char *zProgress;      /* The progress callback routine */
68   char *zAuth;          /* The authorization callback routine */
69   SqlFunc *pFunc;       /* List of SQL functions */
70   SqlCollate *pCollate; /* List of SQL collation functions */
71   int rc;               /* Return code of most recent sqlite3_exec() */
72   int nChange;          /* Database changes for the most recent eval */
73   Tcl_Obj *pCollateNeeded;  /* Collation needed script */
74 };
75 
76 /*
77 ** An instance of this structure passes information thru the sqlite
78 ** logic from the original TCL command into the callback routine.
79 */
80 typedef struct CallbackData CallbackData;
81 struct CallbackData {
82   Tcl_Interp *interp;       /* The TCL interpreter */
83   char *zArray;             /* The array into which data is written */
84   Tcl_Obj *pCode;           /* The code to execute for each row */
85   int once;                 /* Set for first callback only */
86   int tcl_rc;               /* Return code from TCL script */
87   int nColName;             /* Number of entries in the azColName[] array */
88   char **azColName;         /* Column names translated to UTF-8 */
89 };
90 
91 /*
92 ** This is a second alternative callback for database queries.  A the
93 ** first column of the first row of the result is made the TCL result.
94 */
95 static int DbEvalCallback3(
96   void *clientData,      /* An instance of CallbackData */
97   int nCol,              /* Number of columns in the result */
98   char ** azCol,         /* Data for each column */
99   char ** azN            /* Name for each column */
100 ){
101   Tcl_Interp *interp = (Tcl_Interp*)clientData;
102   Tcl_Obj *pElem;
103   if( azCol==0 ) return 1;
104   if( nCol==0 ) return 1;
105 #ifdef UTF_TRANSLATION_NEEDED
106   {
107     Tcl_DString dCol;
108     Tcl_DStringInit(&dCol);
109     Tcl_ExternalToUtfDString(NULL, azCol[0], -1, &dCol);
110     pElem = Tcl_NewStringObj(Tcl_DStringValue(&dCol), -1);
111     Tcl_DStringFree(&dCol);
112   }
113 #else
114   pElem = Tcl_NewStringObj(azCol[0], -1);
115 #endif
116   Tcl_SetObjResult(interp, pElem);
117   return 1;
118 }
119 
120 /*
121 ** Called when the command is deleted.
122 */
123 static void DbDeleteCmd(void *db){
124   SqliteDb *pDb = (SqliteDb*)db;
125   sqlite3_close(pDb->db);
126   while( pDb->pFunc ){
127     SqlFunc *pFunc = pDb->pFunc;
128     pDb->pFunc = pFunc->pNext;
129     Tcl_Free((char*)pFunc);
130   }
131   while( pDb->pCollate ){
132     SqlCollate *pCollate = pDb->pCollate;
133     pDb->pCollate = pCollate->pNext;
134     Tcl_Free((char*)pCollate);
135   }
136   if( pDb->zBusy ){
137     Tcl_Free(pDb->zBusy);
138   }
139   if( pDb->zTrace ){
140     Tcl_Free(pDb->zTrace);
141   }
142   if( pDb->zAuth ){
143     Tcl_Free(pDb->zAuth);
144   }
145   Tcl_Free((char*)pDb);
146 }
147 
148 /*
149 ** This routine is called when a database file is locked while trying
150 ** to execute SQL.
151 */
152 static int DbBusyHandler(void *cd, const char *zTable, int nTries){
153   SqliteDb *pDb = (SqliteDb*)cd;
154   int rc;
155   char zVal[30];
156   char *zCmd;
157   Tcl_DString cmd;
158 
159   Tcl_DStringInit(&cmd);
160   Tcl_DStringAppend(&cmd, pDb->zBusy, -1);
161   Tcl_DStringAppendElement(&cmd, zTable);
162   sprintf(zVal, " %d", nTries);
163   Tcl_DStringAppend(&cmd, zVal, -1);
164   zCmd = Tcl_DStringValue(&cmd);
165   rc = Tcl_Eval(pDb->interp, zCmd);
166   Tcl_DStringFree(&cmd);
167   if( rc!=TCL_OK || atoi(Tcl_GetStringResult(pDb->interp)) ){
168     return 0;
169   }
170   return 1;
171 }
172 
173 /*
174 ** This routine is invoked as the 'progress callback' for the database.
175 */
176 static int DbProgressHandler(void *cd){
177   SqliteDb *pDb = (SqliteDb*)cd;
178   int rc;
179 
180   assert( pDb->zProgress );
181   rc = Tcl_Eval(pDb->interp, pDb->zProgress);
182   if( rc!=TCL_OK || atoi(Tcl_GetStringResult(pDb->interp)) ){
183     return 1;
184   }
185   return 0;
186 }
187 
188 /*
189 ** This routine is called by the SQLite trace handler whenever a new
190 ** block of SQL is executed.  The TCL script in pDb->zTrace is executed.
191 */
192 static void DbTraceHandler(void *cd, const char *zSql){
193   SqliteDb *pDb = (SqliteDb*)cd;
194   Tcl_DString str;
195 
196   Tcl_DStringInit(&str);
197   Tcl_DStringAppend(&str, pDb->zTrace, -1);
198   Tcl_DStringAppendElement(&str, zSql);
199   Tcl_Eval(pDb->interp, Tcl_DStringValue(&str));
200   Tcl_DStringFree(&str);
201   Tcl_ResetResult(pDb->interp);
202 }
203 
204 /*
205 ** This routine is called when a transaction is committed.  The
206 ** TCL script in pDb->zCommit is executed.  If it returns non-zero or
207 ** if it throws an exception, the transaction is rolled back instead
208 ** of being committed.
209 */
210 static int DbCommitHandler(void *cd){
211   SqliteDb *pDb = (SqliteDb*)cd;
212   int rc;
213 
214   rc = Tcl_Eval(pDb->interp, pDb->zCommit);
215   if( rc!=TCL_OK || atoi(Tcl_GetStringResult(pDb->interp)) ){
216     return 1;
217   }
218   return 0;
219 }
220 
221 static void tclCollateNeeded(
222   void *pCtx,
223   sqlite *db,
224   int enc,
225   const char *zName
226 ){
227   SqliteDb *pDb = (SqliteDb *)pCtx;
228   Tcl_Obj *pScript = Tcl_DuplicateObj(pDb->pCollateNeeded);
229   Tcl_IncrRefCount(pScript);
230   Tcl_ListObjAppendElement(0, pScript, Tcl_NewStringObj(zName, -1));
231   Tcl_EvalObjEx(pDb->interp, pScript, 0);
232   Tcl_DecrRefCount(pScript);
233 }
234 
235 /*
236 ** This routine is called to evaluate an SQL collation function implemented
237 ** using TCL script.
238 */
239 static int tclSqlCollate(
240   void *pCtx,
241   int nA,
242   const void *zA,
243   int nB,
244   const void *zB
245 ){
246   SqlCollate *p = (SqlCollate *)pCtx;
247   Tcl_Obj *pCmd;
248 
249   pCmd = Tcl_NewStringObj(p->zScript, -1);
250   Tcl_IncrRefCount(pCmd);
251   Tcl_ListObjAppendElement(p->interp, pCmd, Tcl_NewStringObj(zA, nA));
252   Tcl_ListObjAppendElement(p->interp, pCmd, Tcl_NewStringObj(zB, nB));
253   Tcl_EvalObjEx(p->interp, pCmd, 0);
254   Tcl_DecrRefCount(pCmd);
255   return (atoi(Tcl_GetStringResult(p->interp)));
256 }
257 
258 /*
259 ** This routine is called to evaluate an SQL function implemented
260 ** using TCL script.
261 */
262 static void tclSqlFunc(sqlite3_context *context, int argc, sqlite3_value **argv){
263   SqlFunc *p = sqlite3_user_data(context);
264   Tcl_DString cmd;
265   int i;
266   int rc;
267 
268   Tcl_DStringInit(&cmd);
269   Tcl_DStringAppend(&cmd, p->zScript, -1);
270   for(i=0; i<argc; i++){
271     if( SQLITE_NULL==sqlite3_value_type(argv[i]) ){
272       Tcl_DStringAppendElement(&cmd, "");
273     }else{
274       Tcl_DStringAppendElement(&cmd, sqlite3_value_text(argv[i]));
275     }
276   }
277   rc = Tcl_Eval(p->interp, Tcl_DStringValue(&cmd));
278   if( rc ){
279     sqlite3_result_error(context, Tcl_GetStringResult(p->interp), -1);
280   }else{
281     sqlite3_result_text(context, Tcl_GetStringResult(p->interp), -1, 1);
282   }
283 }
284 #ifndef SQLITE_OMIT_AUTHORIZATION
285 /*
286 ** This is the authentication function.  It appends the authentication
287 ** type code and the two arguments to zCmd[] then invokes the result
288 ** on the interpreter.  The reply is examined to determine if the
289 ** authentication fails or succeeds.
290 */
291 static int auth_callback(
292   void *pArg,
293   int code,
294   const char *zArg1,
295   const char *zArg2,
296   const char *zArg3,
297   const char *zArg4
298 ){
299   char *zCode;
300   Tcl_DString str;
301   int rc;
302   const char *zReply;
303   SqliteDb *pDb = (SqliteDb*)pArg;
304 
305   switch( code ){
306     case SQLITE_COPY              : zCode="SQLITE_COPY"; break;
307     case SQLITE_CREATE_INDEX      : zCode="SQLITE_CREATE_INDEX"; break;
308     case SQLITE_CREATE_TABLE      : zCode="SQLITE_CREATE_TABLE"; break;
309     case SQLITE_CREATE_TEMP_INDEX : zCode="SQLITE_CREATE_TEMP_INDEX"; break;
310     case SQLITE_CREATE_TEMP_TABLE : zCode="SQLITE_CREATE_TEMP_TABLE"; break;
311     case SQLITE_CREATE_TEMP_TRIGGER: zCode="SQLITE_CREATE_TEMP_TRIGGER"; break;
312     case SQLITE_CREATE_TEMP_VIEW  : zCode="SQLITE_CREATE_TEMP_VIEW"; break;
313     case SQLITE_CREATE_TRIGGER    : zCode="SQLITE_CREATE_TRIGGER"; break;
314     case SQLITE_CREATE_VIEW       : zCode="SQLITE_CREATE_VIEW"; break;
315     case SQLITE_DELETE            : zCode="SQLITE_DELETE"; break;
316     case SQLITE_DROP_INDEX        : zCode="SQLITE_DROP_INDEX"; break;
317     case SQLITE_DROP_TABLE        : zCode="SQLITE_DROP_TABLE"; break;
318     case SQLITE_DROP_TEMP_INDEX   : zCode="SQLITE_DROP_TEMP_INDEX"; break;
319     case SQLITE_DROP_TEMP_TABLE   : zCode="SQLITE_DROP_TEMP_TABLE"; break;
320     case SQLITE_DROP_TEMP_TRIGGER : zCode="SQLITE_DROP_TEMP_TRIGGER"; break;
321     case SQLITE_DROP_TEMP_VIEW    : zCode="SQLITE_DROP_TEMP_VIEW"; break;
322     case SQLITE_DROP_TRIGGER      : zCode="SQLITE_DROP_TRIGGER"; break;
323     case SQLITE_DROP_VIEW         : zCode="SQLITE_DROP_VIEW"; break;
324     case SQLITE_INSERT            : zCode="SQLITE_INSERT"; break;
325     case SQLITE_PRAGMA            : zCode="SQLITE_PRAGMA"; break;
326     case SQLITE_READ              : zCode="SQLITE_READ"; break;
327     case SQLITE_SELECT            : zCode="SQLITE_SELECT"; break;
328     case SQLITE_TRANSACTION       : zCode="SQLITE_TRANSACTION"; break;
329     case SQLITE_UPDATE            : zCode="SQLITE_UPDATE"; break;
330     case SQLITE_ATTACH            : zCode="SQLITE_ATTACH"; break;
331     case SQLITE_DETACH            : zCode="SQLITE_DETACH"; break;
332     default                       : zCode="????"; break;
333   }
334   Tcl_DStringInit(&str);
335   Tcl_DStringAppend(&str, pDb->zAuth, -1);
336   Tcl_DStringAppendElement(&str, zCode);
337   Tcl_DStringAppendElement(&str, zArg1 ? zArg1 : "");
338   Tcl_DStringAppendElement(&str, zArg2 ? zArg2 : "");
339   Tcl_DStringAppendElement(&str, zArg3 ? zArg3 : "");
340   Tcl_DStringAppendElement(&str, zArg4 ? zArg4 : "");
341   rc = Tcl_GlobalEval(pDb->interp, Tcl_DStringValue(&str));
342   Tcl_DStringFree(&str);
343   zReply = Tcl_GetStringResult(pDb->interp);
344   if( strcmp(zReply,"SQLITE_OK")==0 ){
345     rc = SQLITE_OK;
346   }else if( strcmp(zReply,"SQLITE_DENY")==0 ){
347     rc = SQLITE_DENY;
348   }else if( strcmp(zReply,"SQLITE_IGNORE")==0 ){
349     rc = SQLITE_IGNORE;
350   }else{
351     rc = 999;
352   }
353   return rc;
354 }
355 #endif /* SQLITE_OMIT_AUTHORIZATION */
356 
357 /*
358 ** zText is a pointer to text obtained via an sqlite3_result_text()
359 ** or similar interface. This routine returns a Tcl string object,
360 ** reference count set to 0, containing the text. If a translation
361 ** between iso8859 and UTF-8 is required, it is preformed.
362 */
363 static Tcl_Obj *dbTextToObj(char const *zText){
364   Tcl_Obj *pVal;
365 #ifdef UTF_TRANSLATION_NEEDED
366   Tcl_DString dCol;
367   Tcl_DStringInit(&dCol);
368   Tcl_ExternalToUtfDString(NULL, zText, -1, &dCol);
369   pVal = Tcl_NewStringObj(Tcl_DStringValue(&dCol), -1);
370   Tcl_DStringFree(&dCol);
371 #else
372   pVal = Tcl_NewStringObj(zText, -1);
373 #endif
374   return pVal;
375 }
376 
377 /*
378 ** The "sqlite" command below creates a new Tcl command for each
379 ** connection it opens to an SQLite database.  This routine is invoked
380 ** whenever one of those connection-specific commands is executed
381 ** in Tcl.  For example, if you run Tcl code like this:
382 **
383 **       sqlite db1  "my_database"
384 **       db1 close
385 **
386 ** The first command opens a connection to the "my_database" database
387 ** and calls that connection "db1".  The second command causes this
388 ** subroutine to be invoked.
389 */
390 static int DbObjCmd(void *cd, Tcl_Interp *interp, int objc,Tcl_Obj *const*objv){
391   SqliteDb *pDb = (SqliteDb*)cd;
392   int choice;
393   int rc = TCL_OK;
394   static const char *DB_strs[] = {
395     "authorizer",         "busy",                   "changes",
396     "close",              "commit_hook",            "complete",
397     "errorcode",          "eval",                   "function",
398     "last_insert_rowid",  "last_statement_changes", "onecolumn",
399     "progress",           "rekey",                  "timeout",
400     "trace",              "collate",                "collation_needed",
401     0
402   };
403   enum DB_enum {
404     DB_AUTHORIZER,        DB_BUSY,                   DB_CHANGES,
405     DB_CLOSE,             DB_COMMIT_HOOK,            DB_COMPLETE,
406     DB_ERRORCODE,         DB_EVAL,                   DB_FUNCTION,
407     DB_LAST_INSERT_ROWID, DB_LAST_STATEMENT_CHANGES, DB_ONECOLUMN,
408     DB_PROGRESS,          DB_REKEY,                  DB_TIMEOUT,
409     DB_TRACE,             DB_COLLATE,                DB_COLLATION_NEEDED
410   };
411 
412   if( objc<2 ){
413     Tcl_WrongNumArgs(interp, 1, objv, "SUBCOMMAND ...");
414     return TCL_ERROR;
415   }
416   if( Tcl_GetIndexFromObj(interp, objv[1], DB_strs, "option", 0, &choice) ){
417     return TCL_ERROR;
418   }
419 
420   switch( (enum DB_enum)choice ){
421 
422   /*    $db authorizer ?CALLBACK?
423   **
424   ** Invoke the given callback to authorize each SQL operation as it is
425   ** compiled.  5 arguments are appended to the callback before it is
426   ** invoked:
427   **
428   **   (1) The authorization type (ex: SQLITE_CREATE_TABLE, SQLITE_INSERT, ...)
429   **   (2) First descriptive name (depends on authorization type)
430   **   (3) Second descriptive name
431   **   (4) Name of the database (ex: "main", "temp")
432   **   (5) Name of trigger that is doing the access
433   **
434   ** The callback should return on of the following strings: SQLITE_OK,
435   ** SQLITE_IGNORE, or SQLITE_DENY.  Any other return value is an error.
436   **
437   ** If this method is invoked with no arguments, the current authorization
438   ** callback string is returned.
439   */
440   case DB_AUTHORIZER: {
441     if( objc>3 ){
442       Tcl_WrongNumArgs(interp, 2, objv, "?CALLBACK?");
443     }else if( objc==2 ){
444       if( pDb->zAuth ){
445         Tcl_AppendResult(interp, pDb->zAuth, 0);
446       }
447     }else{
448       char *zAuth;
449       int len;
450       if( pDb->zAuth ){
451         Tcl_Free(pDb->zAuth);
452       }
453       zAuth = Tcl_GetStringFromObj(objv[2], &len);
454       if( zAuth && len>0 ){
455         pDb->zAuth = Tcl_Alloc( len + 1 );
456         strcpy(pDb->zAuth, zAuth);
457       }else{
458         pDb->zAuth = 0;
459       }
460 #ifndef SQLITE_OMIT_AUTHORIZATION
461       if( pDb->zAuth ){
462         pDb->interp = interp;
463         sqlite3_set_authorizer(pDb->db, auth_callback, pDb);
464       }else{
465         sqlite3_set_authorizer(pDb->db, 0, 0);
466       }
467 #endif
468     }
469     break;
470   }
471 
472   /*    $db busy ?CALLBACK?
473   **
474   ** Invoke the given callback if an SQL statement attempts to open
475   ** a locked database file.
476   */
477   case DB_BUSY: {
478     if( objc>3 ){
479       Tcl_WrongNumArgs(interp, 2, objv, "CALLBACK");
480       return TCL_ERROR;
481     }else if( objc==2 ){
482       if( pDb->zBusy ){
483         Tcl_AppendResult(interp, pDb->zBusy, 0);
484       }
485     }else{
486       char *zBusy;
487       int len;
488       if( pDb->zBusy ){
489         Tcl_Free(pDb->zBusy);
490       }
491       zBusy = Tcl_GetStringFromObj(objv[2], &len);
492       if( zBusy && len>0 ){
493         pDb->zBusy = Tcl_Alloc( len + 1 );
494         strcpy(pDb->zBusy, zBusy);
495       }else{
496         pDb->zBusy = 0;
497       }
498       if( pDb->zBusy ){
499         pDb->interp = interp;
500         sqlite3_busy_handler(pDb->db, DbBusyHandler, pDb);
501       }else{
502         sqlite3_busy_handler(pDb->db, 0, 0);
503       }
504     }
505     break;
506   }
507 
508   /*    $db progress ?N CALLBACK?
509   **
510   ** Invoke the given callback every N virtual machine opcodes while executing
511   ** queries.
512   */
513   case DB_PROGRESS: {
514     if( objc==2 ){
515       if( pDb->zProgress ){
516         Tcl_AppendResult(interp, pDb->zProgress, 0);
517       }
518     }else if( objc==4 ){
519       char *zProgress;
520       int len;
521       int N;
522       if( TCL_OK!=Tcl_GetIntFromObj(interp, objv[2], &N) ){
523 	return TCL_ERROR;
524       };
525       if( pDb->zProgress ){
526         Tcl_Free(pDb->zProgress);
527       }
528       zProgress = Tcl_GetStringFromObj(objv[3], &len);
529       if( zProgress && len>0 ){
530         pDb->zProgress = Tcl_Alloc( len + 1 );
531         strcpy(pDb->zProgress, zProgress);
532       }else{
533         pDb->zProgress = 0;
534       }
535 #ifndef SQLITE_OMIT_PROGRESS_CALLBACK
536       if( pDb->zProgress ){
537         pDb->interp = interp;
538         sqlite3_progress_handler(pDb->db, N, DbProgressHandler, pDb);
539       }else{
540         sqlite3_progress_handler(pDb->db, 0, 0, 0);
541       }
542 #endif
543     }else{
544       Tcl_WrongNumArgs(interp, 2, objv, "N CALLBACK");
545       return TCL_ERROR;
546     }
547     break;
548   }
549 
550   /*
551   **     $db changes
552   **
553   ** Return the number of rows that were modified, inserted, or deleted by
554   ** the most recent "eval".
555   */
556   case DB_CHANGES: {
557     Tcl_Obj *pResult;
558     int nChange;
559     if( objc!=2 ){
560       Tcl_WrongNumArgs(interp, 2, objv, "");
561       return TCL_ERROR;
562     }
563     /* nChange = sqlite3_changes(pDb->db); */
564     nChange = pDb->nChange;
565     pResult = Tcl_GetObjResult(interp);
566     Tcl_SetIntObj(pResult, nChange);
567     break;
568   }
569 
570   /*
571   **     $db last_statement_changes
572   **
573   ** Return the number of rows that were modified, inserted, or deleted by
574   ** the last statment to complete execution (excluding changes due to
575   ** triggers)
576   */
577   case DB_LAST_STATEMENT_CHANGES: {
578     Tcl_Obj *pResult;
579     int lsChange;
580     if( objc!=2 ){
581       Tcl_WrongNumArgs(interp, 2, objv, "");
582       return TCL_ERROR;
583     }
584     lsChange = sqlite3_last_statement_changes(pDb->db);
585     pResult = Tcl_GetObjResult(interp);
586     Tcl_SetIntObj(pResult, lsChange);
587     break;
588   }
589 
590   /*    $db close
591   **
592   ** Shutdown the database
593   */
594   case DB_CLOSE: {
595     Tcl_DeleteCommand(interp, Tcl_GetStringFromObj(objv[0], 0));
596     break;
597   }
598 
599   /*    $db commit_hook ?CALLBACK?
600   **
601   ** Invoke the given callback just before committing every SQL transaction.
602   ** If the callback throws an exception or returns non-zero, then the
603   ** transaction is aborted.  If CALLBACK is an empty string, the callback
604   ** is disabled.
605   */
606   case DB_COMMIT_HOOK: {
607     if( objc>3 ){
608       Tcl_WrongNumArgs(interp, 2, objv, "?CALLBACK?");
609     }else if( objc==2 ){
610       if( pDb->zCommit ){
611         Tcl_AppendResult(interp, pDb->zCommit, 0);
612       }
613     }else{
614       char *zCommit;
615       int len;
616       if( pDb->zCommit ){
617         Tcl_Free(pDb->zCommit);
618       }
619       zCommit = Tcl_GetStringFromObj(objv[2], &len);
620       if( zCommit && len>0 ){
621         pDb->zCommit = Tcl_Alloc( len + 1 );
622         strcpy(pDb->zCommit, zCommit);
623       }else{
624         pDb->zCommit = 0;
625       }
626       if( pDb->zCommit ){
627         pDb->interp = interp;
628         sqlite3_commit_hook(pDb->db, DbCommitHandler, pDb);
629       }else{
630         sqlite3_commit_hook(pDb->db, 0, 0);
631       }
632     }
633     break;
634   }
635 
636   /*    $db complete SQL
637   **
638   ** Return TRUE if SQL is a complete SQL statement.  Return FALSE if
639   ** additional lines of input are needed.  This is similar to the
640   ** built-in "info complete" command of Tcl.
641   */
642   case DB_COMPLETE: {
643     Tcl_Obj *pResult;
644     int isComplete;
645     if( objc!=3 ){
646       Tcl_WrongNumArgs(interp, 2, objv, "SQL");
647       return TCL_ERROR;
648     }
649     isComplete = sqlite3_complete( Tcl_GetStringFromObj(objv[2], 0) );
650     pResult = Tcl_GetObjResult(interp);
651     Tcl_SetBooleanObj(pResult, isComplete);
652     break;
653   }
654 
655   /*
656   **    $db errorcode
657   **
658   ** Return the numeric error code that was returned by the most recent
659   ** call to sqlite3_exec().
660   */
661   case DB_ERRORCODE: {
662     Tcl_SetObjResult(interp, Tcl_NewIntObj(pDb->rc));
663     break;
664   }
665 
666   /*
667   **    $db eval $sql ?array {  ...code... }?
668   **
669   ** The SQL statement in $sql is evaluated.  For each row, the values are
670   ** placed in elements of the array named "array" and ...code... is executed.
671   ** If "array" and "code" are omitted, then no callback is every invoked.
672   ** If "array" is an empty string, then the values are placed in variables
673   ** that have the same name as the fields extracted by the query.
674   */
675   case DB_EVAL: {
676     char const *zSql;
677     char const *zLeft;
678     sqlite3_stmt *pStmt;
679 
680     Tcl_Obj *pRet = Tcl_NewObj();
681     Tcl_IncrRefCount(pRet);
682 
683     if( objc!=5 && objc!=3 ){
684       Tcl_WrongNumArgs(interp, 2, objv, "SQL ?ARRAY-NAME CODE?");
685       return TCL_ERROR;
686     }
687 
688     pDb->nChange = 0;
689     zSql = Tcl_GetStringFromObj(objv[2], 0);
690     while( zSql[0] ){
691       int i;
692 
693       if( SQLITE_OK!=sqlite3_prepare(pDb->db, zSql, -1, &pStmt, &zLeft) ){
694         Tcl_SetObjResult(interp, dbTextToObj(sqlite3_errmsg(pDb->db)));
695         rc = TCL_ERROR;
696         break;
697       }
698 
699       if( pStmt && objc==5 ){
700         Tcl_Obj *pColList = Tcl_NewObj();
701         Tcl_IncrRefCount(pColList);
702 
703         for(i=0; i<sqlite3_column_count(pStmt); i++){
704           Tcl_ListObjAppendElement(interp, pColList,
705               dbTextToObj(sqlite3_column_name(pStmt, i))
706           );
707         }
708         Tcl_ObjSetVar2(interp,objv[3],Tcl_NewStringObj("*",-1),pColList,0);
709       }
710 
711       while( pStmt && SQLITE_ROW==sqlite3_step(pStmt) ){
712         for(i=0; i<sqlite3_column_count(pStmt); i++){
713           Tcl_Obj *pVal;
714 
715           /* Set pVal to contain the i'th column of this row. */
716           if( SQLITE_BLOB!=sqlite3_column_type(pStmt, i) ){
717             pVal = dbTextToObj(sqlite3_column_text(pStmt, i));
718           }else{
719             int bytes = sqlite3_column_bytes(pStmt, i);
720             pVal = Tcl_NewByteArrayObj(sqlite3_column_blob(pStmt, i), bytes);
721           }
722 
723           if( objc==5 ){
724             Tcl_Obj *pName = dbTextToObj(sqlite3_column_name(pStmt, i));
725             Tcl_IncrRefCount(pName);
726             if( !strcmp("", Tcl_GetString(objv[3])) ){
727               Tcl_ObjSetVar2(interp, pName, 0, pVal, 0);
728             }else{
729               Tcl_ObjSetVar2(interp, objv[3], pName, pVal, 0);
730             }
731             Tcl_DecrRefCount(pName);
732           }else{
733             Tcl_ListObjAppendElement(interp, pRet, pVal);
734           }
735         }
736 
737         if( objc==5 ){
738           rc = Tcl_EvalObjEx(interp, objv[4], 0);
739           if( rc!=TCL_ERROR ) rc = TCL_OK;
740         }
741       }
742 
743       if( pStmt && SQLITE_SCHEMA==sqlite3_finalize(pStmt) ){
744         continue;
745       }
746 
747       if( pStmt && SQLITE_OK!=sqlite3_errcode(pDb->db) ){
748         Tcl_SetObjResult(interp, dbTextToObj(sqlite3_errmsg(pDb->db)));
749         rc = TCL_ERROR;
750         break;
751       }
752 
753       pDb->nChange += sqlite3_changes(pDb->db);
754       zSql = zLeft;
755     }
756 
757     if( rc==TCL_OK ){
758       Tcl_SetObjResult(interp, pRet);
759     }
760     Tcl_DecrRefCount(pRet);
761 
762     break;
763   }
764 
765   /*
766   **     $db function NAME SCRIPT
767   **
768   ** Create a new SQL function called NAME.  Whenever that function is
769   ** called, invoke SCRIPT to evaluate the function.
770   */
771   case DB_FUNCTION: {
772     SqlFunc *pFunc;
773     char *zName;
774     char *zScript;
775     int nScript;
776     if( objc!=4 ){
777       Tcl_WrongNumArgs(interp, 2, objv, "NAME SCRIPT");
778       return TCL_ERROR;
779     }
780     zName = Tcl_GetStringFromObj(objv[2], 0);
781     zScript = Tcl_GetStringFromObj(objv[3], &nScript);
782     pFunc = (SqlFunc*)Tcl_Alloc( sizeof(*pFunc) + nScript + 1 );
783     if( pFunc==0 ) return TCL_ERROR;
784     pFunc->interp = interp;
785     pFunc->pNext = pDb->pFunc;
786     pFunc->zScript = (char*)&pFunc[1];
787     strcpy(pFunc->zScript, zScript);
788     sqlite3_create_function(pDb->db, zName, -1, 0, 0, pFunc, tclSqlFunc, 0, 0);
789     break;
790   }
791 
792   /*
793   **     $db last_insert_rowid
794   **
795   ** Return an integer which is the ROWID for the most recent insert.
796   */
797   case DB_LAST_INSERT_ROWID: {
798     Tcl_Obj *pResult;
799     int rowid;
800     if( objc!=2 ){
801       Tcl_WrongNumArgs(interp, 2, objv, "");
802       return TCL_ERROR;
803     }
804     rowid = sqlite3_last_insert_rowid(pDb->db);
805     pResult = Tcl_GetObjResult(interp);
806     Tcl_SetIntObj(pResult, rowid);
807     break;
808   }
809 
810   /*
811   **     $db onecolumn SQL
812   **
813   ** Return a single column from a single row of the given SQL query.
814   */
815   case DB_ONECOLUMN: {
816     char *zSql;
817     char *zErrMsg = 0;
818     if( objc!=3 ){
819       Tcl_WrongNumArgs(interp, 2, objv, "SQL");
820       return TCL_ERROR;
821     }
822     zSql = Tcl_GetStringFromObj(objv[2], 0);
823     rc = sqlite3_exec(pDb->db, zSql, DbEvalCallback3, interp, &zErrMsg);
824     if( rc==SQLITE_ABORT ){
825       rc = SQLITE_OK;
826     }else if( zErrMsg ){
827       Tcl_SetResult(interp, zErrMsg, TCL_VOLATILE);
828       free(zErrMsg);
829       rc = TCL_ERROR;
830     }else if( rc!=SQLITE_OK ){
831       Tcl_AppendResult(interp, sqlite3ErrStr(rc), 0);
832       rc = TCL_ERROR;
833     }
834     break;
835   }
836 
837   /*
838   **     $db rekey KEY
839   **
840   ** Change the encryption key on the currently open database.
841   */
842   case DB_REKEY: {
843     int nKey;
844     void *pKey;
845     if( objc!=3 ){
846       Tcl_WrongNumArgs(interp, 2, objv, "KEY");
847       return TCL_ERROR;
848     }
849     pKey = Tcl_GetByteArrayFromObj(objv[2], &nKey);
850 #ifdef SQLITE_HAS_CODEC
851     rc = sqlite_rekey(pDb->db, pKey, nKey);
852     if( rc ){
853       Tcl_AppendResult(interp, sqlite3ErrStr(rc), 0);
854       rc = TCL_ERROR;
855     }
856 #endif
857     break;
858   }
859 
860   /*
861   **     $db timeout MILLESECONDS
862   **
863   ** Delay for the number of milliseconds specified when a file is locked.
864   */
865   case DB_TIMEOUT: {
866     int ms;
867     if( objc!=3 ){
868       Tcl_WrongNumArgs(interp, 2, objv, "MILLISECONDS");
869       return TCL_ERROR;
870     }
871     if( Tcl_GetIntFromObj(interp, objv[2], &ms) ) return TCL_ERROR;
872     sqlite3_busy_timeout(pDb->db, ms);
873     break;
874   }
875 
876   /*    $db trace ?CALLBACK?
877   **
878   ** Make arrangements to invoke the CALLBACK routine for each SQL statement
879   ** that is executed.  The text of the SQL is appended to CALLBACK before
880   ** it is executed.
881   */
882   case DB_TRACE: {
883     if( objc>3 ){
884       Tcl_WrongNumArgs(interp, 2, objv, "?CALLBACK?");
885     }else if( objc==2 ){
886       if( pDb->zTrace ){
887         Tcl_AppendResult(interp, pDb->zTrace, 0);
888       }
889     }else{
890       char *zTrace;
891       int len;
892       if( pDb->zTrace ){
893         Tcl_Free(pDb->zTrace);
894       }
895       zTrace = Tcl_GetStringFromObj(objv[2], &len);
896       if( zTrace && len>0 ){
897         pDb->zTrace = Tcl_Alloc( len + 1 );
898         strcpy(pDb->zTrace, zTrace);
899       }else{
900         pDb->zTrace = 0;
901       }
902       if( pDb->zTrace ){
903         pDb->interp = interp;
904         sqlite3_trace(pDb->db, DbTraceHandler, pDb);
905       }else{
906         sqlite3_trace(pDb->db, 0, 0);
907       }
908     }
909     break;
910   }
911 
912   /*
913   **     $db collate NAME SCRIPT
914   **
915   ** Create a new SQL collation function called NAME.  Whenever
916   ** that function is called, invoke SCRIPT to evaluate the function.
917   */
918   case DB_COLLATE: {
919     SqlCollate *pCollate;
920     char *zName;
921     char *zScript;
922     int nScript;
923     if( objc!=4 ){
924       Tcl_WrongNumArgs(interp, 2, objv, "NAME SCRIPT");
925       return TCL_ERROR;
926     }
927     zName = Tcl_GetStringFromObj(objv[2], 0);
928     zScript = Tcl_GetStringFromObj(objv[3], &nScript);
929     pCollate = (SqlCollate*)Tcl_Alloc( sizeof(*pCollate) + nScript + 1 );
930     if( pCollate==0 ) return TCL_ERROR;
931     pCollate->interp = interp;
932     pCollate->pNext = pDb->pCollate;
933     pCollate->zScript = (char*)&pCollate[1];
934     strcpy(pCollate->zScript, zScript);
935     if( sqlite3_create_collation(pDb->db, zName, SQLITE_UTF8,
936         pCollate, tclSqlCollate) ){
937       return TCL_ERROR;
938     }
939     break;
940   }
941 
942   /*
943   **     $db collate_needed SCRIPT
944   **
945   ** Create a new SQL collation function called NAME.  Whenever
946   ** that function is called, invoke SCRIPT to evaluate the function.
947   */
948   case DB_COLLATION_NEEDED: {
949     if( objc!=3 ){
950       Tcl_WrongNumArgs(interp, 2, objv, "SCRIPT");
951       return TCL_ERROR;
952     }
953     if( pDb->pCollateNeeded ){
954       Tcl_DecrRefCount(pDb->pCollateNeeded);
955     }
956     pDb->pCollateNeeded = Tcl_DuplicateObj(objv[2]);
957     Tcl_IncrRefCount(pDb->pCollateNeeded);
958     sqlite3_collation_needed(pDb->db, pDb, tclCollateNeeded);
959     break;
960   }
961 
962   } /* End of the SWITCH statement */
963   return rc;
964 }
965 
966 /*
967 **   sqlite DBNAME FILENAME ?MODE? ?-key KEY?
968 **
969 ** This is the main Tcl command.  When the "sqlite" Tcl command is
970 ** invoked, this routine runs to process that command.
971 **
972 ** The first argument, DBNAME, is an arbitrary name for a new
973 ** database connection.  This command creates a new command named
974 ** DBNAME that is used to control that connection.  The database
975 ** connection is deleted when the DBNAME command is deleted.
976 **
977 ** The second argument is the name of the directory that contains
978 ** the sqlite database that is to be accessed.
979 **
980 ** For testing purposes, we also support the following:
981 **
982 **  sqlite -encoding
983 **
984 **       Return the encoding used by LIKE and GLOB operators.  Choices
985 **       are UTF-8 and iso8859.
986 **
987 **  sqlite -version
988 **
989 **       Return the version number of the SQLite library.
990 **
991 **  sqlite -tcl-uses-utf
992 **
993 **       Return "1" if compiled with a Tcl uses UTF-8.  Return "0" if
994 **       not.  Used by tests to make sure the library was compiled
995 **       correctly.
996 */
997 static int DbMain(void *cd, Tcl_Interp *interp, int objc,Tcl_Obj *const*objv){
998   SqliteDb *p;
999   void *pKey = 0;
1000   int nKey = 0;
1001   const char *zArg;
1002   char *zErrMsg;
1003   const char *zFile;
1004   char zBuf[80];
1005   if( objc==2 ){
1006     zArg = Tcl_GetStringFromObj(objv[1], 0);
1007     if( strcmp(zArg,"-version")==0 ){
1008       Tcl_AppendResult(interp,sqlite3_version,0);
1009       return TCL_OK;
1010     }
1011     if( strcmp(zArg,"-has-codec")==0 ){
1012 #ifdef SQLITE_HAS_CODEC
1013       Tcl_AppendResult(interp,"1",0);
1014 #else
1015       Tcl_AppendResult(interp,"0",0);
1016 #endif
1017       return TCL_OK;
1018     }
1019     if( strcmp(zArg,"-tcl-uses-utf")==0 ){
1020 #ifdef TCL_UTF_MAX
1021       Tcl_AppendResult(interp,"1",0);
1022 #else
1023       Tcl_AppendResult(interp,"0",0);
1024 #endif
1025       return TCL_OK;
1026     }
1027   }
1028   if( objc==5 || objc==6 ){
1029     zArg = Tcl_GetStringFromObj(objv[objc-2], 0);
1030     if( strcmp(zArg,"-key")==0 ){
1031       pKey = Tcl_GetByteArrayFromObj(objv[objc-1], &nKey);
1032       objc -= 2;
1033     }
1034   }
1035   if( objc!=3 && objc!=4 ){
1036     Tcl_WrongNumArgs(interp, 1, objv,
1037 #ifdef SQLITE_HAS_CODEC
1038       "HANDLE FILENAME ?-key CODEC-KEY?"
1039 #else
1040       "HANDLE FILENAME ?MODE?"
1041 #endif
1042     );
1043     return TCL_ERROR;
1044   }
1045   zErrMsg = 0;
1046   p = (SqliteDb*)Tcl_Alloc( sizeof(*p) );
1047   if( p==0 ){
1048     Tcl_SetResult(interp, "malloc failed", TCL_STATIC);
1049     return TCL_ERROR;
1050   }
1051   memset(p, 0, sizeof(*p));
1052   zFile = Tcl_GetStringFromObj(objv[2], 0);
1053 #ifdef SQLITE_HAS_CODEC
1054   p->db = sqlite3_open_encrypted(zFile, pKey, nKey, 0, &zErrMsg);
1055 #else
1056   sqlite3_open(zFile, &p->db);
1057   if( SQLITE_OK!=sqlite3_errcode(p->db) ){
1058     zErrMsg = strdup(sqlite3_errmsg(p->db));
1059     sqlite3_close(p->db);
1060     p->db = 0;
1061   }
1062 #endif
1063   if( p->db==0 ){
1064     Tcl_SetResult(interp, zErrMsg, TCL_VOLATILE);
1065     Tcl_Free((char*)p);
1066     free(zErrMsg);
1067     return TCL_ERROR;
1068   }
1069   zArg = Tcl_GetStringFromObj(objv[1], 0);
1070   Tcl_CreateObjCommand(interp, zArg, DbObjCmd, (char*)p, DbDeleteCmd);
1071 
1072   /* The return value is the value of the sqlite* pointer
1073   */
1074   sprintf(zBuf, "%p", p->db);
1075   if( strncmp(zBuf,"0x",2) ){
1076     sprintf(zBuf, "0x%p", p->db);
1077   }
1078   Tcl_AppendResult(interp, zBuf, 0);
1079 
1080   /* If compiled with SQLITE_TEST turned on, then register the "md5sum"
1081   ** SQL function.
1082   */
1083 #ifdef SQLITE_TEST
1084   {
1085     extern void Md5_Register(sqlite*);
1086     Md5_Register(p->db);
1087    }
1088 #endif
1089   p->interp = interp;
1090   return TCL_OK;
1091 }
1092 
1093 /*
1094 ** Provide a dummy Tcl_InitStubs if we are using this as a static
1095 ** library.
1096 */
1097 #ifndef USE_TCL_STUBS
1098 # undef  Tcl_InitStubs
1099 # define Tcl_InitStubs(a,b,c)
1100 #endif
1101 
1102 /*
1103 ** Initialize this module.
1104 **
1105 ** This Tcl module contains only a single new Tcl command named "sqlite".
1106 ** (Hence there is no namespace.  There is no point in using a namespace
1107 ** if the extension only supplies one new name!)  The "sqlite" command is
1108 ** used to open a new SQLite database.  See the DbMain() routine above
1109 ** for additional information.
1110 */
1111 int Sqlite_Init(Tcl_Interp *interp){
1112   Tcl_InitStubs(interp, "8.0", 0);
1113   Tcl_CreateObjCommand(interp, "sqlite", (Tcl_ObjCmdProc*)DbMain, 0, 0);
1114   Tcl_PkgProvide(interp, "sqlite", "2.0");
1115   return TCL_OK;
1116 }
1117 int Tclsqlite_Init(Tcl_Interp *interp){
1118   Tcl_InitStubs(interp, "8.0", 0);
1119   Tcl_CreateObjCommand(interp, "sqlite", (Tcl_ObjCmdProc*)DbMain, 0, 0);
1120   Tcl_PkgProvide(interp, "sqlite", "2.0");
1121   return TCL_OK;
1122 }
1123 int Sqlite_SafeInit(Tcl_Interp *interp){
1124   return TCL_OK;
1125 }
1126 int Tclsqlite_SafeInit(Tcl_Interp *interp){
1127   return TCL_OK;
1128 }
1129 
1130 #if 0
1131 /*
1132 ** If compiled using mktclapp, this routine runs to initialize
1133 ** everything.
1134 */
1135 int Et_AppInit(Tcl_Interp *interp){
1136   return Sqlite_Init(interp);
1137 }
1138 #endif
1139 
1140 /*
1141 ** If the macro TCLSH is defined and is one, then put in code for the
1142 ** "main" routine that will initialize Tcl.
1143 */
1144 #if defined(TCLSH) && TCLSH==1
1145 static char zMainloop[] =
1146   "set line {}\n"
1147   "while {![eof stdin]} {\n"
1148     "if {$line!=\"\"} {\n"
1149       "puts -nonewline \"> \"\n"
1150     "} else {\n"
1151       "puts -nonewline \"% \"\n"
1152     "}\n"
1153     "flush stdout\n"
1154     "append line [gets stdin]\n"
1155     "if {[info complete $line]} {\n"
1156       "if {[catch {uplevel #0 $line} result]} {\n"
1157         "puts stderr \"Error: $result\"\n"
1158       "} elseif {$result!=\"\"} {\n"
1159         "puts $result\n"
1160       "}\n"
1161       "set line {}\n"
1162     "} else {\n"
1163       "append line \\n\n"
1164     "}\n"
1165   "}\n"
1166 ;
1167 
1168 #define TCLSH_MAIN main   /* Needed to fake out mktclapp */
1169 int TCLSH_MAIN(int argc, char **argv){
1170   Tcl_Interp *interp;
1171   Tcl_FindExecutable(argv[0]);
1172   interp = Tcl_CreateInterp();
1173   Sqlite_Init(interp);
1174 #ifdef SQLITE_TEST
1175   {
1176     extern int Sqlitetest1_Init(Tcl_Interp*);
1177     extern int Sqlitetest2_Init(Tcl_Interp*);
1178     extern int Sqlitetest3_Init(Tcl_Interp*);
1179     extern int Sqlitetest4_Init(Tcl_Interp*);
1180     extern int Sqlitetest5_Init(Tcl_Interp*);
1181     extern int Md5_Init(Tcl_Interp*);
1182     Sqlitetest1_Init(interp);
1183     Sqlitetest2_Init(interp);
1184     Sqlitetest3_Init(interp);
1185     Sqlitetest4_Init(interp);
1186     Sqlitetest5_Init(interp);
1187     Md5_Init(interp);
1188   }
1189 #endif
1190   if( argc>=2 ){
1191     int i;
1192     Tcl_SetVar(interp,"argv0",argv[1],TCL_GLOBAL_ONLY);
1193     Tcl_SetVar(interp,"argv", "", TCL_GLOBAL_ONLY);
1194     for(i=2; i<argc; i++){
1195       Tcl_SetVar(interp, "argv", argv[i],
1196           TCL_GLOBAL_ONLY | TCL_LIST_ELEMENT | TCL_APPEND_VALUE);
1197     }
1198     if( Tcl_EvalFile(interp, argv[1])!=TCL_OK ){
1199       const char *zInfo = Tcl_GetVar(interp, "errorInfo", TCL_GLOBAL_ONLY);
1200       if( zInfo==0 ) zInfo = interp->result;
1201       fprintf(stderr,"%s: %s\n", *argv, zInfo);
1202       return 1;
1203     }
1204   }else{
1205     Tcl_GlobalEval(interp, zMainloop);
1206   }
1207   return 0;
1208 }
1209 #endif /* TCLSH */
1210 
1211 #endif /* !defined(NO_TCL) */
1212