/ Hex Artifact Content
Login

Artifact b9cf346e95291cb4c4f1bf5ac1d77db6b8ad023d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 41 20 54 43 4c 20  ******.** A TCL 
0180: 49 6e 74 65 72 66 61 63 65 20 74 6f 20 53 51 4c  Interface to SQL
0190: 69 74 65 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 74  ite.**.** $Id: t
01a0: 63 6c 73 71 6c 69 74 65 2e 63 2c 76 20 31 2e 32  clsqlite.c,v 1.2
01b0: 39 20 32 30 30 32 2f 30 31 2f 31 36 20 32 31 3a  9 2002/01/16 21:
01c0: 30 30 3a 32 37 20 64 72 68 20 45 78 70 20 24 0a  00:27 drh Exp $.
01d0: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 4f 5f 54 43  */.#ifndef NO_TC
01e0: 4c 20 20 20 20 20 2f 2a 20 4f 6d 69 74 20 74 68  L     /* Omit th
01f0: 69 73 20 77 68 6f 6c 65 20 66 69 6c 65 20 69 66  is whole file if
0200: 20 54 43 4c 20 69 73 20 75 6e 61 76 61 69 6c 61   TCL is unavaila
0210: 62 6c 65 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65  ble */..#include
0220: 20 22 73 71 6c 69 74 65 2e 68 22 0a 23 69 6e 63   "sqlite.h".#inc
0230: 6c 75 64 65 20 22 74 63 6c 2e 68 22 0a 23 69 6e  lude "tcl.h".#in
0240: 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e  clude <stdlib.h>
0250: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e  .#include <strin
0260: 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 61  g.h>.#include <a
0270: 73 73 65 72 74 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20  ssert.h>../*.** 
0280: 49 66 20 54 43 4c 20 75 73 65 73 20 55 54 46 2d  If TCL uses UTF-
0290: 38 20 61 6e 64 20 53 51 4c 69 74 65 20 69 73 20  8 and SQLite is 
02a0: 63 6f 6e 66 69 67 75 72 65 64 20 74 6f 20 75 73  configured to us
02b0: 65 20 69 73 6f 38 38 35 39 2c 20 74 68 65 6e 20  e iso8859, then 
02c0: 77 65 0a 2a 2a 20 68 61 76 65 20 74 6f 20 64 6f  we.** have to do
02d0: 20 61 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 77   a translation w
02e0: 68 65 6e 20 67 6f 69 6e 67 20 62 65 74 77 65 65  hen going betwee
02f0: 6e 20 74 68 65 20 74 77 6f 2e 20 20 53 65 74 20  n the two.  Set 
0300: 74 68 65 20 0a 2a 2a 20 55 54 46 5f 54 52 41 4e  the .** UTF_TRAN
0310: 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 20 6d  SLATION_NEEDED m
0320: 61 63 72 6f 20 74 6f 20 69 6e 64 69 63 61 74 65  acro to indicate
0330: 20 74 68 61 74 20 77 65 20 6e 65 65 64 20 74 6f   that we need to
0340: 20 64 6f 0a 2a 2a 20 74 68 69 73 20 74 72 61 6e   do.** this tran
0350: 73 6c 61 74 69 6f 6e 2e 20 20 0a 2a 2f 0a 23 69  slation.  .*/.#i
0360: 66 20 64 65 66 69 6e 65 64 28 54 43 4c 5f 55 54  f defined(TCL_UT
0370: 46 5f 4d 41 58 29 20 26 26 20 21 64 65 66 69 6e  F_MAX) && !defin
0380: 65 64 28 53 51 4c 49 54 45 5f 55 54 46 38 29 0a  ed(SQLITE_UTF8).
0390: 23 20 64 65 66 69 6e 65 20 55 54 46 5f 54 52 41  # define UTF_TRA
03a0: 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 20  NSLATION_NEEDED 
03b0: 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  1.#endif../*.** 
03c0: 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e 73  There is one ins
03d0: 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74  tance of this st
03e0: 72 75 63 74 75 72 65 20 66 6f 72 20 65 61 63 68  ructure for each
03f0: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
0400: 0a 2a 2a 20 74 68 61 74 20 68 61 73 20 62 65 65  .** that has bee
0410: 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  n opened by the 
0420: 53 51 4c 69 74 65 20 54 43 4c 20 69 6e 74 65 72  SQLite TCL inter
0430: 66 61 63 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  face..*/.typedef
0440: 20 73 74 72 75 63 74 20 53 71 6c 69 74 65 44 62   struct SqliteDb
0450: 20 53 71 6c 69 74 65 44 62 3b 0a 73 74 72 75 63   SqliteDb;.struc
0460: 74 20 53 71 6c 69 74 65 44 62 20 7b 0a 20 20 73  t SqliteDb {.  s
0470: 71 6c 69 74 65 20 2a 64 62 3b 20 20 20 20 20 20  qlite *db;      
0480: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 72 65 61       /* The "rea
0490: 6c 22 20 64 61 74 61 62 61 73 65 20 73 74 72 75  l" database stru
04a0: 63 74 75 72 65 20 2a 2f 0a 20 20 54 63 6c 5f 49  cture */.  Tcl_I
04b0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 20 20  nterp *interp;  
04c0: 20 2f 2a 20 54 68 65 20 69 6e 74 65 72 70 72 65   /* The interpre
04d0: 74 65 72 20 75 73 65 64 20 66 6f 72 20 74 68 69  ter used for thi
04e0: 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  s database */.  
04f0: 63 68 61 72 20 2a 7a 42 75 73 79 3b 20 20 20 20  char *zBusy;    
0500: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 75 73        /* The bus
0510: 79 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  y callback routi
0520: 6e 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ne */.};../*.** 
0530: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
0540: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 70 61  his structure pa
0550: 73 73 65 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  sses information
0560: 20 74 68 72 75 20 74 68 65 20 73 71 6c 69 74 65   thru the sqlite
0570: 0a 2a 2a 20 6c 6f 67 69 63 20 66 72 6f 6d 20 74  .** logic from t
0580: 68 65 20 6f 72 69 67 69 6e 61 6c 20 54 43 4c 20  he original TCL 
0590: 63 6f 6d 6d 61 6e 64 20 69 6e 74 6f 20 74 68 65  command into the
05a0: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
05b0: 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  e..*/.typedef st
05c0: 72 75 63 74 20 43 61 6c 6c 62 61 63 6b 44 61 74  ruct CallbackDat
05d0: 61 20 43 61 6c 6c 62 61 63 6b 44 61 74 61 3b 0a  a CallbackData;.
05e0: 73 74 72 75 63 74 20 43 61 6c 6c 62 61 63 6b 44  struct CallbackD
05f0: 61 74 61 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  ata {.  Tcl_Inte
0600: 72 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 20 20  rp *interp;     
0610: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
0620: 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 63 68  erpreter */.  ch
0630: 61 72 20 2a 7a 41 72 72 61 79 3b 20 20 20 20 20  ar *zArray;     
0640: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 61          /* The a
0650: 72 72 61 79 20 69 6e 74 6f 20 77 68 69 63 68 20  rray into which 
0660: 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
0670: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43  */.  Tcl_Obj *pC
0680: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ode;           /
0690: 2a 20 54 68 65 20 63 6f 64 65 20 74 6f 20 65 78  * The code to ex
06a0: 65 63 75 74 65 20 66 6f 72 20 65 61 63 68 20 72  ecute for each r
06b0: 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 6f 6e 63 65  ow */.  int once
06c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
06d0: 20 20 2f 2a 20 53 65 74 20 66 6f 72 20 66 69 72    /* Set for fir
06e0: 73 74 20 63 61 6c 6c 62 61 63 6b 20 6f 6e 6c 79  st callback only
06f0: 20 2a 2f 0a 20 20 69 6e 74 20 74 63 6c 5f 72 63   */.  int tcl_rc
0700: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
0710: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66  /* Return code f
0720: 72 6f 6d 20 54 43 4c 20 73 63 72 69 70 74 20 2a  rom TCL script *
0730: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 4e 61 6d 65  /.  int nColName
0740: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
0750: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
0760: 65 73 20 69 6e 20 74 68 65 20 61 7a 43 6f 6c 4e  es in the azColN
0770: 61 6d 65 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20  ame[] array */. 
0780: 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 4e 61 6d   char **azColNam
0790: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  e;         /* Co
07a0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 74 72 61 6e 73  lumn names trans
07b0: 6c 61 74 65 64 20 74 6f 20 55 54 46 2d 38 20 2a  lated to UTF-8 *
07c0: 2f 0a 7d 3b 0a 0a 23 69 66 64 65 66 20 55 54 46  /.};..#ifdef UTF
07d0: 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45  _TRANSLATION_NEE
07e0: 44 45 44 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64  DED./*.** Called
07f0: 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66   for each row of
0800: 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a   the result..**.
0810: 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20  ** This version 
0820: 69 73 20 75 73 65 64 20 77 68 65 6e 20 54 43 4c  is used when TCL
0830: 20 65 78 70 65 63 74 73 20 55 54 46 2d 38 20 64   expects UTF-8 d
0840: 61 74 61 20 62 75 74 20 74 68 65 20 64 61 74 61  ata but the data
0850: 62 61 73 65 0a 2a 2a 20 75 73 65 73 20 74 68 65  base.** uses the
0860: 20 49 53 4f 38 38 35 39 20 66 6f 72 6d 61 74 2e   ISO8859 format.
0870: 20 20 41 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20    A translation 
0880: 6d 75 73 74 20 6f 63 63 75 72 20 66 72 6f 6d 20  must occur from 
0890: 49 53 4f 38 38 35 39 20 69 6e 74 6f 0a 2a 2a 20  ISO8859 into.** 
08a0: 55 54 46 2d 38 2e 0a 2a 2f 0a 73 74 61 74 69 63  UTF-8..*/.static
08b0: 20 69 6e 74 20 44 62 45 76 61 6c 43 61 6c 6c 62   int DbEvalCallb
08c0: 61 63 6b 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69  ack(.  void *cli
08d0: 65 6e 74 44 61 74 61 2c 20 20 20 20 20 20 2f 2a  entData,      /*
08e0: 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   An instance of 
08f0: 43 61 6c 6c 62 61 63 6b 44 61 74 61 20 2a 2f 0a  CallbackData */.
0900: 20 20 69 6e 74 20 6e 43 6f 6c 2c 20 20 20 20 20    int nCol,     
0910: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
0920: 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
0930: 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20   the result */. 
0940: 20 63 68 61 72 20 2a 2a 20 61 7a 43 6f 6c 2c 20   char ** azCol, 
0950: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
0960: 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20  for each column 
0970: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 20 61 7a 4e  */.  char ** azN
0980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
0990: 61 6d 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c  ame for each col
09a0: 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 43 61 6c 6c  umn */.){.  Call
09b0: 62 61 63 6b 44 61 74 61 20 2a 63 62 44 61 74 61  backData *cbData
09c0: 20 3d 20 28 43 61 6c 6c 62 61 63 6b 44 61 74 61   = (CallbackData
09d0: 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20  *)clientData;.  
09e0: 69 6e 74 20 69 2c 20 72 63 3b 0a 20 20 54 63 6c  int i, rc;.  Tcl
09f0: 5f 44 53 74 72 69 6e 67 20 64 43 6f 6c 3b 0a 20  _DString dCol;. 
0a00: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
0a10: 28 26 64 43 6f 6c 29 3b 0a 20 20 69 66 28 20 63  (&dCol);.  if( c
0a20: 62 44 61 74 61 2d 3e 61 7a 43 6f 6c 4e 61 6d 65  bData->azColName
0a30: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
0a40: 74 28 20 63 62 44 61 74 61 2d 3e 6f 6e 63 65 20  t( cbData->once 
0a50: 29 3b 0a 20 20 20 20 63 62 44 61 74 61 2d 3e 6f  );.    cbData->o
0a60: 6e 63 65 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  nce = 0;.    if(
0a70: 20 63 62 44 61 74 61 2d 3e 7a 41 72 72 61 79 5b   cbData->zArray[
0a80: 30 5d 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  0] ){.      Tcl_
0a90: 53 65 74 56 61 72 32 28 63 62 44 61 74 61 2d 3e  SetVar2(cbData->
0aa0: 69 6e 74 65 72 70 2c 20 63 62 44 61 74 61 2d 3e  interp, cbData->
0ab0: 7a 41 72 72 61 79 2c 20 22 2a 22 2c 20 22 22 2c  zArray, "*", "",
0ac0: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63   0);.    }.    c
0ad0: 62 44 61 74 61 2d 3e 61 7a 43 6f 6c 4e 61 6d 65  bData->azColName
0ae0: 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 43 6f 6c 2a   = malloc( nCol*
0af0: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 20 29 3b  sizeof(char*) );
0b00: 0a 20 20 20 20 69 66 28 20 63 62 44 61 74 61 2d  .    if( cbData-
0b10: 3e 61 7a 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 7b  >azColName==0 ){
0b20: 20 72 65 74 75 72 6e 20 31 3b 20 7d 0a 20 20 20   return 1; }.   
0b30: 20 63 62 44 61 74 61 2d 3e 6e 43 6f 6c 4e 61 6d   cbData->nColNam
0b40: 65 20 3d 20 6e 43 6f 6c 3b 0a 20 20 20 20 66 6f  e = nCol;.    fo
0b50: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
0b60: 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 45  ++){.      Tcl_E
0b70: 78 74 65 72 6e 61 6c 54 6f 55 74 66 44 53 74 72  xternalToUtfDStr
0b80: 69 6e 67 28 4e 55 4c 4c 2c 20 61 7a 4e 5b 69 5d  ing(NULL, azN[i]
0b90: 2c 20 2d 31 2c 20 26 64 43 6f 6c 29 3b 0a 20 20  , -1, &dCol);.  
0ba0: 20 20 20 20 63 62 44 61 74 61 2d 3e 61 7a 43 6f      cbData->azCo
0bb0: 6c 4e 61 6d 65 5b 69 5d 20 3d 20 6d 61 6c 6c 6f  lName[i] = mallo
0bc0: 63 28 20 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65  c( Tcl_DStringLe
0bd0: 6e 67 74 68 28 26 64 43 6f 6c 29 20 2b 20 31 20  ngth(&dCol) + 1 
0be0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 62 44  );.      if( cbD
0bf0: 61 74 61 2d 3e 61 7a 43 6f 6c 4e 61 6d 65 5b 69  ata->azColName[i
0c00: 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 72  ] ){.        str
0c10: 63 70 79 28 63 62 44 61 74 61 2d 3e 61 7a 43 6f  cpy(cbData->azCo
0c20: 6c 4e 61 6d 65 5b 69 5d 2c 20 54 63 6c 5f 44 53  lName[i], Tcl_DS
0c30: 74 72 69 6e 67 56 61 6c 75 65 28 26 64 43 6f 6c  tringValue(&dCol
0c40: 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
0c50: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
0c60: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
0c70: 20 69 66 28 20 63 62 44 61 74 61 2d 3e 7a 41 72   if( cbData->zAr
0c80: 72 61 79 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  ray[0] ){.      
0c90: 20 20 54 63 6c 5f 53 65 74 56 61 72 32 28 63 62    Tcl_SetVar2(cb
0ca0: 44 61 74 61 2d 3e 69 6e 74 65 72 70 2c 20 63 62  Data->interp, cb
0cb0: 44 61 74 61 2d 3e 7a 41 72 72 61 79 2c 20 22 2a  Data->zArray, "*
0cc0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
0cd0: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
0ce0: 28 26 64 43 6f 6c 29 2c 20 54 43 4c 5f 4c 49 53  (&dCol), TCL_LIS
0cf0: 54 5f 45 4c 45 4d 45 4e 54 7c 54 43 4c 5f 41 50  T_ELEMENT|TCL_AP
0d00: 50 45 4e 44 5f 56 41 4c 55 45 29 3b 0a 20 20 20  PEND_VALUE);.   
0d10: 20 20 20 7d 0a 20 20 20 20 20 20 54 63 6c 5f 44     }.      Tcl_D
0d20: 53 74 72 69 6e 67 46 72 65 65 28 26 64 43 6f 6c  StringFree(&dCol
0d30: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
0d40: 66 28 20 61 7a 43 6f 6c 21 3d 30 20 29 7b 0a 20  f( azCol!=0 ){. 
0d50: 20 20 20 69 66 28 20 63 62 44 61 74 61 2d 3e 7a     if( cbData->z
0d60: 41 72 72 61 79 5b 30 5d 20 29 7b 0a 20 20 20 20  Array[0] ){.    
0d70: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
0d80: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
0d90: 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 43 6f 6c   char *z = azCol
0da0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28  [i];.        if(
0db0: 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a   z==0 ) z = "";.
0dc0: 20 20 20 20 20 20 20 20 54 63 6c 5f 44 53 74 72          Tcl_DStr
0dd0: 69 6e 67 49 6e 69 74 28 26 64 43 6f 6c 29 3b 0a  ingInit(&dCol);.
0de0: 20 20 20 20 20 20 20 20 54 63 6c 5f 45 78 74 65          Tcl_Exte
0df0: 72 6e 61 6c 54 6f 55 74 66 44 53 74 72 69 6e 67  rnalToUtfDString
0e00: 28 4e 55 4c 4c 2c 20 7a 2c 20 2d 31 2c 20 26 64  (NULL, z, -1, &d
0e10: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 54 63  Col);.        Tc
0e20: 6c 5f 53 65 74 56 61 72 32 28 63 62 44 61 74 61  l_SetVar2(cbData
0e30: 2d 3e 69 6e 74 65 72 70 2c 20 63 62 44 61 74 61  ->interp, cbData
0e40: 2d 3e 7a 41 72 72 61 79 2c 20 63 62 44 61 74 61  ->zArray, cbData
0e50: 2d 3e 61 7a 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20  ->azColName[i], 
0e60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54  .              T
0e70: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
0e80: 26 64 43 6f 6c 29 2c 20 30 29 3b 0a 20 20 20 20  &dCol), 0);.    
0e90: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
0ea0: 72 65 65 28 26 64 43 6f 6c 29 3b 0a 20 20 20 20  ree(&dCol);.    
0eb0: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
0ec0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
0ed0: 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
0ee0: 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a      char *z = az
0ef0: 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20  Col[i];.        
0f00: 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 22  if( z==0 ) z = "
0f10: 22 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44  ";.        Tcl_D
0f20: 53 74 72 69 6e 67 49 6e 69 74 28 26 64 43 6f 6c  StringInit(&dCol
0f30: 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 45  );.        Tcl_E
0f40: 78 74 65 72 6e 61 6c 54 6f 55 74 66 44 53 74 72  xternalToUtfDStr
0f50: 69 6e 67 28 4e 55 4c 4c 2c 20 7a 2c 20 2d 31 2c  ing(NULL, z, -1,
0f60: 20 26 64 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20   &dCol);.       
0f70: 20 54 63 6c 5f 53 65 74 56 61 72 28 63 62 44 61   Tcl_SetVar(cbDa
0f80: 74 61 2d 3e 69 6e 74 65 72 70 2c 20 63 62 44 61  ta->interp, cbDa
0f90: 74 61 2d 3e 61 7a 43 6f 6c 4e 61 6d 65 5b 69 5d  ta->azColName[i]
0fa0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
0fb0: 20 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67       Tcl_DString
0fc0: 56 61 6c 75 65 28 26 64 43 6f 6c 29 2c 20 30 29  Value(&dCol), 0)
0fd0: 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44 53  ;.        Tcl_DS
0fe0: 74 72 69 6e 67 46 72 65 65 28 26 64 43 6f 6c 29  tringFree(&dCol)
0ff0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1000: 20 20 7d 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45    }.  rc = Tcl_E
1010: 76 61 6c 4f 62 6a 28 63 62 44 61 74 61 2d 3e 69  valObj(cbData->i
1020: 6e 74 65 72 70 2c 20 63 62 44 61 74 61 2d 3e 70  nterp, cbData->p
1030: 43 6f 64 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  Code);.  if( rc=
1040: 3d 54 43 4c 5f 43 4f 4e 54 49 4e 55 45 20 29 20  =TCL_CONTINUE ) 
1050: 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 63  rc = TCL_OK;.  c
1060: 62 44 61 74 61 2d 3e 74 63 6c 5f 72 63 20 3d 20  bData->tcl_rc = 
1070: 72 63 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 21  rc;.  return rc!
1080: 3d 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  =TCL_OK;.}.#endi
1090: 66 20 2f 2a 20 55 54 46 5f 54 52 41 4e 53 4c 41  f /* UTF_TRANSLA
10a0: 54 49 4f 4e 5f 4e 45 45 44 45 44 20 2a 2f 0a 0a  TION_NEEDED */..
10b0: 23 69 66 6e 64 65 66 20 55 54 46 5f 54 52 41 4e  #ifndef UTF_TRAN
10c0: 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 0a 2f  SLATION_NEEDED./
10d0: 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 66 6f 72 20  *.** Called for 
10e0: 65 61 63 68 20 72 6f 77 20 6f 66 20 74 68 65 20  each row of the 
10f0: 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  result..**.** Th
1100: 69 73 20 76 65 72 73 69 6f 6e 20 69 73 20 75 73  is version is us
1110: 65 64 20 77 68 65 6e 20 65 69 74 68 65 72 20 6f  ed when either o
1120: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1130: 69 73 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  is true:.**.**  
1140: 20 20 28 31 29 20 54 68 69 73 20 76 65 72 73 69    (1) This versi
1150: 6f 6e 20 6f 66 20 54 43 4c 20 75 73 65 73 20 55  on of TCL uses U
1160: 54 46 2d 38 20 61 6e 64 20 74 68 65 20 64 61 74  TF-8 and the dat
1170: 61 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  a in the.**     
1180: 20 20 20 53 51 4c 69 74 65 20 64 61 74 61 62 61     SQLite databa
1190: 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  se is already in
11a0: 20 74 68 65 20 55 54 46 2d 38 20 66 6f 72 6d 61   the UTF-8 forma
11b0: 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  t..**.**    (2) 
11c0: 54 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20  This version of 
11d0: 54 43 4c 20 75 73 65 73 20 49 53 4f 38 38 35 39  TCL uses ISO8859
11e0: 20 61 6e 64 20 74 68 65 20 64 61 74 61 20 69 6e   and the data in
11f0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 53   the.**        S
1200: 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 69  QLite database i
1210: 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
1220: 20 49 53 4f 38 38 35 39 20 66 6f 72 6d 61 74 2e   ISO8859 format.
1230: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44  .*/.static int D
1240: 62 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 0a 20  bEvalCallback(. 
1250: 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74   void *clientDat
1260: 61 2c 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e  a,      /* An in
1270: 73 74 61 6e 63 65 20 6f 66 20 43 61 6c 6c 62 61  stance of Callba
1280: 63 6b 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  ckData */.  int 
1290: 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20  nCol,           
12a0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
12b0: 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72  columns in the r
12c0: 65 73 75 6c 74 20 2a 2f 0a 20 20 63 68 61 72 20  esult */.  char 
12d0: 2a 2a 20 61 7a 43 6f 6c 2c 20 20 20 20 20 20 20  ** azCol,       
12e0: 20 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 65 61    /* Data for ea
12f0: 63 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  ch column */.  c
1300: 68 61 72 20 2a 2a 20 61 7a 4e 20 20 20 20 20 20  har ** azN      
1310: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 66 6f        /* Name fo
1320: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 2a 2f  r each column */
1330: 0a 29 7b 0a 20 20 43 61 6c 6c 62 61 63 6b 44 61  .){.  CallbackDa
1340: 74 61 20 2a 63 62 44 61 74 61 20 3d 20 28 43 61  ta *cbData = (Ca
1350: 6c 6c 62 61 63 6b 44 61 74 61 2a 29 63 6c 69 65  llbackData*)clie
1360: 6e 74 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 2c  ntData;.  int i,
1370: 20 72 63 3b 0a 20 20 69 66 28 20 61 7a 43 6f 6c   rc;.  if( azCol
1380: 3d 3d 30 20 7c 7c 20 28 63 62 44 61 74 61 2d 3e  ==0 || (cbData->
1390: 6f 6e 63 65 20 26 26 20 63 62 44 61 74 61 2d 3e  once && cbData->
13a0: 7a 41 72 72 61 79 5b 30 5d 29 20 29 7b 0a 20 20  zArray[0]) ){.  
13b0: 20 20 54 63 6c 5f 53 65 74 56 61 72 32 28 63 62    Tcl_SetVar2(cb
13c0: 44 61 74 61 2d 3e 69 6e 74 65 72 70 2c 20 63 62  Data->interp, cb
13d0: 44 61 74 61 2d 3e 7a 41 72 72 61 79 2c 20 22 2a  Data->zArray, "*
13e0: 22 2c 20 22 22 2c 20 30 29 3b 0a 20 20 20 20 66  ", "", 0);.    f
13f0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
1400: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  i++){.      Tcl_
1410: 53 65 74 56 61 72 32 28 63 62 44 61 74 61 2d 3e  SetVar2(cbData->
1420: 69 6e 74 65 72 70 2c 20 63 62 44 61 74 61 2d 3e  interp, cbData->
1430: 7a 41 72 72 61 79 2c 20 22 2a 22 2c 20 61 7a 4e  zArray, "*", azN
1440: 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 54 43  [i],.         TC
1450: 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45 4e 54 7c 54  L_LIST_ELEMENT|T
1460: 43 4c 5f 41 50 50 45 4e 44 5f 56 41 4c 55 45 29  CL_APPEND_VALUE)
1470: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 62 44 61  ;.    }.    cbDa
1480: 74 61 2d 3e 6f 6e 63 65 20 3d 20 30 3b 0a 20 20  ta->once = 0;.  
1490: 7d 0a 20 20 69 66 28 20 61 7a 43 6f 6c 21 3d 30  }.  if( azCol!=0
14a0: 20 29 7b 0a 20 20 20 20 69 66 28 20 63 62 44 61   ){.    if( cbDa
14b0: 74 61 2d 3e 7a 41 72 72 61 79 5b 30 5d 20 29 7b  ta->zArray[0] ){
14c0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
14d0: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
14e0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
14f0: 61 7a 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20  azCol[i];.      
1500: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d    if( z==0 ) z =
1510: 20 22 22 3b 0a 20 20 20 20 20 20 20 20 54 63 6c   "";.        Tcl
1520: 5f 53 65 74 56 61 72 32 28 63 62 44 61 74 61 2d  _SetVar2(cbData-
1530: 3e 69 6e 74 65 72 70 2c 20 63 62 44 61 74 61 2d  >interp, cbData-
1540: 3e 7a 41 72 72 61 79 2c 20 61 7a 4e 5b 69 5d 2c  >zArray, azN[i],
1550: 20 7a 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   z, 0);.      }.
1560: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1570: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
1580: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1590: 63 68 61 72 20 2a 7a 20 3d 20 61 7a 43 6f 6c 5b  char *z = azCol[
15a0: 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
15b0: 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20  z==0 ) z = "";. 
15c0: 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 56 61         Tcl_SetVa
15d0: 72 28 63 62 44 61 74 61 2d 3e 69 6e 74 65 72 70  r(cbData->interp
15e0: 2c 20 61 7a 4e 5b 69 5d 2c 20 7a 2c 20 30 29 3b  , azN[i], z, 0);
15f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1600: 20 7d 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76   }.  rc = Tcl_Ev
1610: 61 6c 4f 62 6a 28 63 62 44 61 74 61 2d 3e 69 6e  alObj(cbData->in
1620: 74 65 72 70 2c 20 63 62 44 61 74 61 2d 3e 70 43  terp, cbData->pC
1630: 6f 64 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ode);.  if( rc==
1640: 54 43 4c 5f 43 4f 4e 54 49 4e 55 45 20 29 20 72  TCL_CONTINUE ) r
1650: 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 63 62  c = TCL_OK;.  cb
1660: 44 61 74 61 2d 3e 74 63 6c 5f 72 63 20 3d 20 72  Data->tcl_rc = r
1670: 63 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 21 3d  c;.  return rc!=
1680: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
1690: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
16a0: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63  an alternative c
16b0: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 64 61 74 61  allback for data
16c0: 62 61 73 65 20 71 75 65 72 69 65 73 2e 20 20 49  base queries.  I
16d0: 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 69 6e 76  nstead.** of inv
16e0: 6f 6b 69 6e 67 20 61 20 54 43 4c 20 73 63 72 69  oking a TCL scri
16f0: 70 74 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65  pt to handle the
1700: 20 72 65 73 75 6c 74 2c 20 74 68 69 73 20 63 61   result, this ca
1710: 6c 6c 62 61 63 6b 20 6a 75 73 74 0a 2a 2a 20 61  llback just.** a
1720: 70 70 65 6e 64 73 20 65 61 63 68 20 63 6f 6c 75  ppends each colu
1730: 6d 6e 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  mn of the result
1740: 20 74 6f 20 61 20 6c 69 73 74 2e 20 20 41 66 74   to a list.  Aft
1750: 65 72 20 74 68 65 20 71 75 65 72 79 0a 2a 2a 20  er the query.** 
1760: 69 73 20 63 6f 6d 70 6c 65 74 65 2c 20 74 68 65  is complete, the
1770: 20 6c 69 73 74 20 69 73 20 72 65 74 75 72 6e 65   list is returne
1780: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1790: 20 44 62 45 76 61 6c 43 61 6c 6c 62 61 63 6b 32   DbEvalCallback2
17a0: 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74  (.  void *client
17b0: 44 61 74 61 2c 20 20 20 20 20 20 2f 2a 20 41 6e  Data,      /* An
17c0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 43 61 6c   instance of Cal
17d0: 6c 62 61 63 6b 44 61 74 61 20 2a 2f 0a 20 20 69  lbackData */.  i
17e0: 6e 74 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20 20  nt nCol,        
17f0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1800: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
1810: 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 63 68  e result */.  ch
1820: 61 72 20 2a 2a 20 61 7a 43 6f 6c 2c 20 20 20 20  ar ** azCol,    
1830: 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72       /* Data for
1840: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a   each column */.
1850: 20 20 63 68 61 72 20 2a 2a 20 61 7a 4e 20 20 20    char ** azN   
1860: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
1870: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
1880: 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a   */.){.  Tcl_Obj
1890: 20 2a 70 4c 69 73 74 20 3d 20 28 54 63 6c 5f 4f   *pList = (Tcl_O
18a0: 62 6a 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a  bj*)clientData;.
18b0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 61    int i;.  if( a
18c0: 7a 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  zCol==0 ) return
18d0: 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
18e0: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
18f0: 20 54 63 6c 5f 4f 62 6a 20 2a 70 45 6c 65 6d 3b   Tcl_Obj *pElem;
1900: 0a 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 5b 69  .    if( azCol[i
1910: 5d 20 26 26 20 2a 61 7a 43 6f 6c 5b 69 5d 20 29  ] && *azCol[i] )
1920: 7b 0a 23 69 66 64 65 66 20 55 54 46 5f 54 52 41  {.#ifdef UTF_TRA
1930: 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 0a  NSLATION_NEEDED.
1940: 20 20 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e        Tcl_DStrin
1950: 67 20 64 43 6f 6c 3b 0a 20 20 20 20 20 20 54 63  g dCol;.      Tc
1960: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 64  l_DStringInit(&d
1970: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  Col);.      Tcl_
1980: 45 78 74 65 72 6e 61 6c 54 6f 55 74 66 44 53 74  ExternalToUtfDSt
1990: 72 69 6e 67 28 4e 55 4c 4c 2c 20 61 7a 43 6f 6c  ring(NULL, azCol
19a0: 5b 69 5d 2c 20 2d 31 2c 20 26 64 43 6f 6c 29 3b  [i], -1, &dCol);
19b0: 0a 20 20 20 20 20 20 70 45 6c 65 6d 20 3d 20 54  .      pElem = T
19c0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
19d0: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
19e0: 28 26 64 43 6f 6c 29 2c 20 2d 31 29 3b 0a 20 20  (&dCol), -1);.  
19f0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46      Tcl_DStringF
1a00: 72 65 65 28 26 64 43 6f 6c 29 3b 0a 23 65 6c 73  ree(&dCol);.#els
1a10: 65 0a 20 20 20 20 20 20 70 45 6c 65 6d 20 3d 20  e.      pElem = 
1a20: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1a30: 28 61 7a 43 6f 6c 5b 69 5d 2c 20 2d 31 29 3b 0a  (azCol[i], -1);.
1a40: 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
1a50: 7b 0a 20 20 20 20 20 20 70 45 6c 65 6d 20 3d 20  {.      pElem = 
1a60: 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20  Tcl_NewObj();.  
1a70: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74    }.    Tcl_List
1a80: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
1a90: 28 30 2c 20 70 4c 69 73 74 2c 20 70 45 6c 65 6d  (0, pList, pElem
1aa0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1ab0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  0;.}../*.** Call
1ac0: 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6d 6d  ed when the comm
1ad0: 61 6e 64 20 69 73 20 64 65 6c 65 74 65 64 2e 0a  and is deleted..
1ae0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44  */.static void D
1af0: 62 44 65 6c 65 74 65 43 6d 64 28 76 6f 69 64 20  bDeleteCmd(void 
1b00: 2a 64 62 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  *db){.  SqliteDb
1b10: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
1b20: 62 2a 29 64 62 3b 0a 20 20 73 71 6c 69 74 65 5f  b*)db;.  sqlite_
1b30: 63 6c 6f 73 65 28 70 44 62 2d 3e 64 62 29 3b 0a  close(pDb->db);.
1b40: 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79    if( pDb->zBusy
1b50: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65   ){.    Tcl_Free
1b60: 28 70 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20  (pDb->zBusy);.  
1b70: 7d 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68  }.  Tcl_Free((ch
1b80: 61 72 2a 29 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a  ar*)pDb);.}../*.
1b90: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1ba0: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
1bb0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1bc0: 73 20 6c 6f 63 6b 65 64 20 77 68 69 6c 65 20 74  s locked while t
1bd0: 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 65 78 65 63  rying.** to exec
1be0: 75 74 65 20 53 51 4c 2e 0a 2a 2f 0a 73 74 61 74  ute SQL..*/.stat
1bf0: 69 63 20 69 6e 74 20 44 62 42 75 73 79 48 61 6e  ic int DbBusyHan
1c00: 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 63  dler(void *cd, c
1c10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c  onst char *zTabl
1c20: 65 2c 20 69 6e 74 20 6e 54 72 69 65 73 29 7b 0a  e, int nTries){.
1c30: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
1c40: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b  = (SqliteDb*)cd;
1c50: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
1c60: 72 20 7a 56 61 6c 5b 33 30 5d 3b 0a 20 20 63 68  r zVal[30];.  ch
1c70: 61 72 20 2a 7a 43 6d 64 3b 0a 20 20 54 63 6c 5f  ar *zCmd;.  Tcl_
1c80: 44 53 74 72 69 6e 67 20 63 6d 64 3b 0a 0a 20 20  DString cmd;..  
1c90: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
1ca0: 26 63 6d 64 29 3b 0a 20 20 54 63 6c 5f 44 53 74  &cmd);.  Tcl_DSt
1cb0: 72 69 6e 67 41 70 70 65 6e 64 28 26 63 6d 64 2c  ringAppend(&cmd,
1cc0: 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20 2d 31 29   pDb->zBusy, -1)
1cd0: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
1ce0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 63 6d  ppendElement(&cm
1cf0: 64 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 73 70  d, zTable);.  sp
1d00: 72 69 6e 74 66 28 7a 56 61 6c 2c 20 22 20 25 64  rintf(zVal, " %d
1d10: 22 2c 20 6e 54 72 69 65 73 29 3b 0a 20 20 54 63  ", nTries);.  Tc
1d20: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28  l_DStringAppend(
1d30: 26 63 6d 64 2c 20 7a 56 61 6c 2c 20 2d 31 29 3b  &cmd, zVal, -1);
1d40: 0a 20 20 7a 43 6d 64 20 3d 20 54 63 6c 5f 44 53  .  zCmd = Tcl_DS
1d50: 74 72 69 6e 67 56 61 6c 75 65 28 26 63 6d 64 29  tringValue(&cmd)
1d60: 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61  ;.  rc = Tcl_Eva
1d70: 6c 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 7a  l(pDb->interp, z
1d80: 43 6d 64 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  Cmd);.  Tcl_DStr
1d90: 69 6e 67 46 72 65 65 28 26 63 6d 64 29 3b 0a 20  ingFree(&cmd);. 
1da0: 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20   if( rc!=TCL_OK 
1db0: 7c 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74 53  || atoi(Tcl_GetS
1dc0: 74 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d  tringResult(pDb-
1dd0: 3e 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20 20  >interp)) ){.   
1de0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1df0: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
1e00: 0a 2a 2a 20 54 68 65 20 22 73 71 6c 69 74 65 22  .** The "sqlite"
1e10: 20 63 6f 6d 6d 61 6e 64 20 62 65 6c 6f 77 20 63   command below c
1e20: 72 65 61 74 65 73 20 61 20 6e 65 77 20 54 63 6c  reates a new Tcl
1e30: 20 63 6f 6d 6d 61 6e 64 20 66 6f 72 20 65 61 63   command for eac
1e40: 68 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  h.** connection 
1e50: 69 74 20 6f 70 65 6e 73 20 74 6f 20 61 6e 20 53  it opens to an S
1e60: 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20  QLite database. 
1e70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
1e80: 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20 77 68 65 6e   invoked.** when
1e90: 65 76 65 72 20 6f 6e 65 20 6f 66 20 74 68 6f 73  ever one of thos
1ea0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2d 73 70 65  e connection-spe
1eb0: 63 69 66 69 63 20 63 6f 6d 6d 61 6e 64 73 20 69  cific commands i
1ec0: 73 20 65 78 65 63 75 74 65 64 0a 2a 2a 20 69 6e  s executed.** in
1ed0: 20 54 63 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70   Tcl.  For examp
1ee0: 6c 65 2c 20 69 66 20 79 6f 75 20 72 75 6e 20 54  le, if you run T
1ef0: 63 6c 20 63 6f 64 65 20 6c 69 6b 65 20 74 68 69  cl code like thi
1f00: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 73  s:.**.**       s
1f10: 71 6c 69 74 65 20 64 62 31 20 20 22 6d 79 5f 64  qlite db1  "my_d
1f20: 61 74 61 62 61 73 65 22 0a 2a 2a 20 20 20 20 20  atabase".**     
1f30: 20 20 64 62 31 20 63 6c 6f 73 65 0a 2a 2a 0a 2a    db1 close.**.*
1f40: 2a 20 54 68 65 20 66 69 72 73 74 20 63 6f 6d 6d  * The first comm
1f50: 61 6e 64 20 6f 70 65 6e 73 20 61 20 63 6f 6e 6e  and opens a conn
1f60: 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 22 6d  ection to the "m
1f70: 79 5f 64 61 74 61 62 61 73 65 22 20 64 61 74 61  y_database" data
1f80: 62 61 73 65 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c  base.** and call
1f90: 73 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f  s that connectio
1fa0: 6e 20 22 64 62 31 22 2e 20 20 54 68 65 20 73 65  n "db1".  The se
1fb0: 63 6f 6e 64 20 63 6f 6d 6d 61 6e 64 20 63 61 75  cond command cau
1fc0: 73 65 73 20 74 68 69 73 0a 2a 2a 20 73 75 62 72  ses this.** subr
1fd0: 6f 75 74 69 6e 65 20 74 6f 20 62 65 20 69 6e 76  outine to be inv
1fe0: 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oked..*/.static 
1ff0: 69 6e 74 20 44 62 4f 62 6a 43 6d 64 28 76 6f 69  int DbObjCmd(voi
2000: 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72  d *cd, Tcl_Inter
2010: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f  p *interp, int o
2020: 62 6a 63 2c 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e  bjc,Tcl_Obj *con
2030: 73 74 2a 6f 62 6a 76 29 7b 0a 20 20 53 71 6c 69  st*objv){.  Sqli
2040: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
2050: 69 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74  iteDb*)cd;.  int
2060: 20 63 68 6f 69 63 65 3b 0a 20 20 73 74 61 74 69   choice;.  stati
2070: 63 20 63 68 61 72 20 2a 44 42 5f 6f 70 74 53 74  c char *DB_optSt
2080: 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 22 62  rs[] = {.     "b
2090: 75 73 79 22 2c 20 20 20 22 63 6c 6f 73 65 22 2c  usy",   "close",
20a0: 20 20 22 63 6f 6d 70 6c 65 74 65 22 2c 20 20 22    "complete",  "
20b0: 65 76 61 6c 22 2c 20 20 22 6c 61 73 74 5f 69 6e  eval",  "last_in
20c0: 73 65 72 74 5f 72 6f 77 69 64 22 2c 20 22 74 69  sert_rowid", "ti
20d0: 6d 65 6f 75 74 22 2c 20 30 0a 20 20 7d 3b 0a 20  meout", 0.  };. 
20e0: 20 65 6e 75 6d 20 44 42 5f 6f 70 74 73 20 7b 0a   enum DB_opts {.
20f0: 20 20 20 20 20 44 42 5f 42 55 53 59 2c 20 20 44       DB_BUSY,  D
2100: 42 5f 43 4c 4f 53 45 2c 20 44 42 5f 43 4f 4d 50  B_CLOSE, DB_COMP
2110: 4c 45 54 45 2c 20 44 42 5f 45 56 41 4c 2c 20 44  LETE, DB_EVAL, D
2120: 42 5f 4c 41 53 54 5f 49 4e 53 45 52 54 5f 52 4f  B_LAST_INSERT_RO
2130: 57 49 44 2c 20 44 42 5f 54 49 4d 45 4f 55 54 0a  WID, DB_TIMEOUT.
2140: 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63    };..  if( objc
2150: 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  <2 ){.    Tcl_Wr
2160: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
2170: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 55 42  p, 1, objv, "SUB
2180: 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20  COMMAND ...");. 
2190: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
21a0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
21b0: 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
21c0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
21d0: 31 5d 2c 20 44 42 5f 6f 70 74 53 74 72 73 2c 20  1], DB_optStrs, 
21e0: 22 6f 70 74 69 6f 6e 22 2c 20 30 2c 20 26 63 68  "option", 0, &ch
21f0: 6f 69 63 65 29 20 29 7b 0a 20 20 20 20 72 65 74  oice) ){.    ret
2200: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2210: 20 7d 0a 0a 20 20 73 77 69 74 63 68 28 20 28 65   }..  switch( (e
2220: 6e 75 6d 20 44 42 5f 6f 70 74 73 29 63 68 6f 69  num DB_opts)choi
2230: 63 65 20 29 7b 0a 0a 20 20 2f 2a 20 20 20 20 24  ce ){..  /*    $
2240: 64 62 20 62 75 73 79 20 3f 43 41 4c 4c 42 41 43  db busy ?CALLBAC
2250: 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76  K?.  **.  ** Inv
2260: 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 63 61  oke the given ca
2270: 6c 6c 62 61 63 6b 20 69 66 20 61 6e 20 53 51 4c  llback if an SQL
2280: 20 73 74 61 74 65 6d 65 6e 74 20 61 74 74 65 6d   statement attem
2290: 70 74 73 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a  pts to open.  **
22a0: 20 61 20 6c 6f 63 6b 65 64 20 64 61 74 61 62 61   a locked databa
22b0: 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  se file..  */.  
22c0: 63 61 73 65 20 44 42 5f 42 55 53 59 3a 20 7b 0a  case DB_BUSY: {.
22d0: 20 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29      if( objc>3 )
22e0: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
22f0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
2300: 20 32 2c 20 6f 62 6a 76 2c 20 22 43 41 4c 4c 42   2, objv, "CALLB
2310: 41 43 4b 22 29 3b 0a 20 20 20 20 20 20 72 65 74  ACK");.      ret
2320: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2330: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
2340: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  c==2 ){.      if
2350: 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a  ( pDb->zBusy ){.
2360: 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
2370: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2380: 20 70 44 62 2d 3e 7a 42 75 73 79 2c 20 30 29 3b   pDb->zBusy, 0);
2390: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
23a0: 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
23b0: 7a 42 75 73 79 3b 0a 20 20 20 20 20 20 69 6e 74  zBusy;.      int
23c0: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20   len;.      if( 
23d0: 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20  pDb->zBusy ){.  
23e0: 20 20 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70        Tcl_Free(p
23f0: 44 62 2d 3e 7a 42 75 73 79 29 3b 0a 20 20 20 20  Db->zBusy);.    
2400: 20 20 7d 0a 20 20 20 20 20 20 7a 42 75 73 79 20    }.      zBusy 
2410: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
2420: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
2430: 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  &len);.      if(
2440: 20 7a 42 75 73 79 20 26 26 20 6c 65 6e 3e 30 20   zBusy && len>0 
2450: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e  ){.        pDb->
2460: 7a 42 75 73 79 20 3d 20 54 63 6c 5f 41 6c 6c 6f  zBusy = Tcl_Allo
2470: 63 28 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20  c( len + 1 );.  
2480: 20 20 20 20 20 20 73 74 72 63 70 79 28 70 44 62        strcpy(pDb
2490: 2d 3e 7a 42 75 73 79 2c 20 7a 42 75 73 79 29 3b  ->zBusy, zBusy);
24a0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
24b0: 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79        pDb->zBusy
24c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
24d0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75      if( pDb->zBu
24e0: 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  sy ){.        pD
24f0: 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65  b->interp = inte
2500: 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  rp;.        sqli
2510: 74 65 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28  te_busy_handler(
2520: 70 44 62 2d 3e 64 62 2c 20 44 62 42 75 73 79 48  pDb->db, DbBusyH
2530: 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20  andler, pDb);.  
2540: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2550: 20 20 20 73 71 6c 69 74 65 5f 62 75 73 79 5f 68     sqlite_busy_h
2560: 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20  andler(pDb->db, 
2570: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
2580: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
2590: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
25a0: 20 63 6c 6f 73 65 0a 20 20 2a 2a 0a 20 20 2a 2a   close.  **.  **
25b0: 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 64 61   Shutdown the da
25c0: 74 61 62 61 73 65 0a 20 20 2a 2f 0a 20 20 63 61  tabase.  */.  ca
25d0: 73 65 20 44 42 5f 43 4c 4f 53 45 3a 20 7b 0a 20  se DB_CLOSE: {. 
25e0: 20 20 20 54 63 6c 5f 44 65 6c 65 74 65 43 6f 6d     Tcl_DeleteCom
25f0: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 54 63 6c  mand(interp, Tcl
2600: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
2610: 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 29 3b 0a  j(objv[0], 0));.
2620: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
2630: 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d 70    /*    $db comp
2640: 6c 65 74 65 20 53 51 4c 0a 20 20 2a 2a 0a 20 20  lete SQL.  **.  
2650: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
2660: 66 20 53 51 4c 20 69 73 20 61 20 63 6f 6d 70 6c  f SQL is a compl
2670: 65 74 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ete SQL statemen
2680: 74 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45  t.  Return FALSE
2690: 20 69 66 0a 20 20 2a 2a 20 61 64 64 69 74 69 6f   if.  ** additio
26a0: 6e 61 6c 20 6c 69 6e 65 73 20 6f 66 20 69 6e 70  nal lines of inp
26b0: 75 74 20 61 72 65 20 6e 65 65 64 65 64 2e 20 20  ut are needed.  
26c0: 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20  This is similar 
26d0: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 62 75 69 6c  to the.  ** buil
26e0: 74 2d 69 6e 20 22 69 6e 66 6f 20 63 6f 6d 70 6c  t-in "info compl
26f0: 65 74 65 22 20 63 6f 6d 6d 61 6e 64 20 6f 66 20  ete" command of 
2700: 54 63 6c 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  Tcl..  */.  case
2710: 20 44 42 5f 43 4f 4d 50 4c 45 54 45 3a 20 7b 0a   DB_COMPLETE: {.
2720: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65      Tcl_Obj *pRe
2730: 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20 69 73  sult;.    int is
2740: 43 6f 6d 70 6c 65 74 65 3b 0a 20 20 20 20 69 66  Complete;.    if
2750: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
2760: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
2770: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
2780: 62 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20  bjv, "SQL");.   
2790: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
27a0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
27b0: 73 43 6f 6d 70 6c 65 74 65 20 3d 20 73 71 6c 69  sComplete = sqli
27c0: 74 65 5f 63 6f 6d 70 6c 65 74 65 28 20 54 63 6c  te_complete( Tcl
27d0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
27e0: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 20 29 3b  j(objv[2], 0) );
27f0: 0a 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54  .    pResult = T
2800: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
2810: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c  interp);.    Tcl
2820: 5f 53 65 74 42 6f 6f 6c 65 61 6e 4f 62 6a 28 70  _SetBooleanObj(p
2830: 52 65 73 75 6c 74 2c 20 69 73 43 6f 6d 70 6c 65  Result, isComple
2840: 74 65 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  te);.    break;.
2850: 20 20 7d 0a 20 20 20 0a 20 20 2f 2a 0a 20 20 2a    }.   .  /*.  *
2860: 2a 20 20 20 20 24 64 62 20 65 76 61 6c 20 24 73  *    $db eval $s
2870: 71 6c 20 3f 61 72 72 61 79 20 7b 20 20 2e 2e 2e  ql ?array {  ...
2880: 63 6f 64 65 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 0a  code... }?.  **.
2890: 20 20 2a 2a 20 54 68 65 20 53 51 4c 20 73 74 61    ** The SQL sta
28a0: 74 65 6d 65 6e 74 20 69 6e 20 24 73 71 6c 20 69  tement in $sql i
28b0: 73 20 65 76 61 6c 75 61 74 65 64 2e 20 20 46 6f  s evaluated.  Fo
28c0: 72 20 65 61 63 68 20 72 6f 77 2c 20 74 68 65 20  r each row, the 
28d0: 76 61 6c 75 65 73 20 61 72 65 0a 20 20 2a 2a 20  values are.  ** 
28e0: 70 6c 61 63 65 64 20 69 6e 20 65 6c 65 6d 65 6e  placed in elemen
28f0: 74 73 20 6f 66 20 74 68 65 20 61 72 72 61 79 20  ts of the array 
2900: 6e 61 6d 65 64 20 22 61 72 72 61 79 22 20 61 6e  named "array" an
2910: 64 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 69 73 20  d ...code... is 
2920: 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2a 20 49  executed..  ** I
2930: 66 20 22 61 72 72 61 79 22 20 61 6e 64 20 22 63  f "array" and "c
2940: 6f 64 65 22 20 61 72 65 20 6f 6d 69 74 74 65 64  ode" are omitted
2950: 2c 20 74 68 65 6e 20 6e 6f 20 63 61 6c 6c 62 61  , then no callba
2960: 63 6b 20 69 73 20 65 76 65 72 79 20 69 6e 76 6f  ck is every invo
2970: 6b 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72  ked..  ** If "ar
2980: 72 61 79 22 20 69 73 20 61 6e 20 65 6d 70 74 79  ray" is an empty
2990: 20 73 74 72 69 6e 67 2c 20 74 68 65 6e 20 74 68   string, then th
29a0: 65 20 76 61 6c 75 65 73 20 61 72 65 20 70 6c 61  e values are pla
29b0: 63 65 64 20 69 6e 20 76 61 72 69 61 62 6c 65 73  ced in variables
29c0: 0a 20 20 2a 2a 20 74 68 61 74 20 68 61 76 65 20  .  ** that have 
29d0: 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73  the same name as
29e0: 20 74 68 65 20 66 69 65 6c 64 73 20 65 78 74 72   the fields extr
29f0: 61 63 74 65 64 20 62 79 20 74 68 65 20 71 75 65  acted by the que
2a00: 72 79 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ry..  */.  case 
2a10: 44 42 5f 45 56 41 4c 3a 20 7b 0a 20 20 20 20 43  DB_EVAL: {.    C
2a20: 61 6c 6c 62 61 63 6b 44 61 74 61 20 63 62 44 61  allbackData cbDa
2a30: 74 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45  ta;.    char *zE
2a40: 72 72 4d 73 67 3b 0a 20 20 20 20 63 68 61 72 20  rrMsg;.    char 
2a50: 2a 7a 53 71 6c 3b 0a 20 20 20 20 69 6e 74 20 72  *zSql;.    int r
2a60: 63 3b 0a 23 69 66 64 65 66 20 55 54 46 5f 54 52  c;.#ifdef UTF_TR
2a70: 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44  ANSLATION_NEEDED
2a80: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
2a90: 20 64 53 71 6c 3b 0a 20 20 20 20 69 6e 74 20 69   dSql;.    int i
2aa0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66  ;.#endif..    if
2ab0: 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a  ( objc!=5 && obj
2ac0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63  c!=3 ){.      Tc
2ad0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
2ae0: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
2af0: 22 53 51 4c 20 3f 41 52 52 41 59 2d 4e 41 4d 45  "SQL ?ARRAY-NAME
2b00: 20 43 4f 44 45 3f 22 29 3b 0a 20 20 20 20 20 20   CODE?");.      
2b10: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2b20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 62 2d  ;.    }.    pDb-
2b30: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
2b40: 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 54 63 6c  ;.    zSql = Tcl
2b50: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
2b60: 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 23  j(objv[2], 0);.#
2b70: 69 66 64 65 66 20 55 54 46 5f 54 52 41 4e 53 4c  ifdef UTF_TRANSL
2b80: 41 54 49 4f 4e 5f 4e 45 45 44 45 44 0a 20 20 20  ATION_NEEDED.   
2b90: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
2ba0: 28 26 64 53 71 6c 29 3b 0a 20 20 20 20 54 63 6c  (&dSql);.    Tcl
2bb0: 5f 55 74 66 54 6f 45 78 74 65 72 6e 61 6c 44 53  _UtfToExternalDS
2bc0: 74 72 69 6e 67 28 4e 55 4c 4c 2c 20 7a 53 71 6c  tring(NULL, zSql
2bd0: 2c 20 2d 31 2c 20 26 64 53 71 6c 29 3b 0a 20 20  , -1, &dSql);.  
2be0: 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 44 53 74    zSql = Tcl_DSt
2bf0: 72 69 6e 67 56 61 6c 75 65 28 26 64 53 71 6c 29  ringValue(&dSql)
2c00: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 54 63 6c  ;.#endif.    Tcl
2c10: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 6f 62  _IncrRefCount(ob
2c20: 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20  jv[2]);.    if( 
2c30: 6f 62 6a 63 3d 3d 35 20 29 7b 0a 20 20 20 20 20  objc==5 ){.     
2c40: 20 63 62 44 61 74 61 2e 69 6e 74 65 72 70 20 3d   cbData.interp =
2c50: 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 63   interp;.      c
2c60: 62 44 61 74 61 2e 6f 6e 63 65 20 3d 20 31 3b 0a  bData.once = 1;.
2c70: 20 20 20 20 20 20 63 62 44 61 74 61 2e 7a 41 72        cbData.zAr
2c80: 72 61 79 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ray = Tcl_GetStr
2c90: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
2ca0: 33 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 63 62  3], 0);.      cb
2cb0: 44 61 74 61 2e 70 43 6f 64 65 20 3d 20 6f 62 6a  Data.pCode = obj
2cc0: 76 5b 34 5d 3b 0a 20 20 20 20 20 20 63 62 44 61  v[4];.      cbDa
2cd0: 74 61 2e 74 63 6c 5f 72 63 20 3d 20 54 43 4c 5f  ta.tcl_rc = TCL_
2ce0: 4f 4b 3b 0a 20 20 20 20 20 20 63 62 44 61 74 61  OK;.      cbData
2cf0: 2e 6e 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20  .nColName = 0;. 
2d00: 20 20 20 20 20 63 62 44 61 74 61 2e 61 7a 43 6f       cbData.azCo
2d10: 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  lName = 0;.     
2d20: 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20   zErrMsg = 0;.  
2d30: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
2d40: 6f 75 6e 74 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20  ount(objv[3]);. 
2d50: 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
2d60: 43 6f 75 6e 74 28 6f 62 6a 76 5b 34 5d 29 3b 0a  Count(objv[4]);.
2d70: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2d80: 65 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20  e_exec(pDb->db, 
2d90: 7a 53 71 6c 2c 20 44 62 45 76 61 6c 43 61 6c 6c  zSql, DbEvalCall
2da0: 62 61 63 6b 2c 20 26 63 62 44 61 74 61 2c 20 26  back, &cbData, &
2db0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
2dc0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
2dd0: 28 6f 62 6a 76 5b 34 5d 29 3b 0a 20 20 20 20 20  (objv[4]);.     
2de0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
2df0: 74 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20  t(objv[3]);.    
2e00: 20 20 69 66 28 20 63 62 44 61 74 61 2e 74 63 6c    if( cbData.tcl
2e10: 5f 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29  _rc==TCL_BREAK )
2e20: 7b 20 63 62 44 61 74 61 2e 74 63 6c 5f 72 63 20  { cbData.tcl_rc 
2e30: 3d 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 20 20 20 20  = TCL_OK; }.    
2e40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c  }else{.      Tcl
2e50: 5f 4f 62 6a 20 2a 70 4c 69 73 74 20 3d 20 54 63  _Obj *pList = Tc
2e60: 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20  l_NewObj();.    
2e70: 20 20 63 62 44 61 74 61 2e 74 63 6c 5f 72 63 20    cbData.tcl_rc 
2e80: 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20  = TCL_OK;.      
2e90: 72 63 20 3d 20 73 71 6c 69 74 65 5f 65 78 65 63  rc = sqlite_exec
2ea0: 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  (pDb->db, zSql, 
2eb0: 44 62 45 76 61 6c 43 61 6c 6c 62 61 63 6b 32 2c  DbEvalCallback2,
2ec0: 20 70 4c 69 73 74 2c 20 26 7a 45 72 72 4d 73 67   pList, &zErrMsg
2ed0: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  );.      Tcl_Set
2ee0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
2ef0: 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  , pList);.    }.
2f00: 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20      if( zErrMsg 
2f10: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
2f20: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
2f30: 45 72 72 4d 73 67 2c 20 54 43 4c 5f 56 4f 4c 41  ErrMsg, TCL_VOLA
2f40: 54 49 4c 45 29 3b 0a 20 20 20 20 20 20 66 72 65  TILE);.      fre
2f50: 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
2f60: 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
2f70: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2f80: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
2f90: 20 72 63 21 3d 53 51 4c 49 54 45 5f 41 42 4f 52   rc!=SQLITE_ABOR
2fa0: 54 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  T ){.      Tcl_A
2fb0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2fc0: 72 70 2c 20 73 71 6c 69 74 65 5f 65 72 72 6f 72  rp, sqlite_error
2fd0: 5f 73 74 72 69 6e 67 28 72 63 29 2c 20 30 29 3b  _string(rc), 0);
2fe0: 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  .      rc = TCL_
2ff0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65  ERROR;.    }else
3000: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 63 62 44  {.      rc = cbD
3010: 61 74 61 2e 74 63 6c 5f 72 63 3b 0a 20 20 20 20  ata.tcl_rc;.    
3020: 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  }.    Tcl_DecrRe
3030: 66 43 6f 75 6e 74 28 6f 62 6a 76 5b 32 5d 29 3b  fCount(objv[2]);
3040: 0a 23 69 66 64 65 66 20 55 54 46 5f 54 52 41 4e  .#ifdef UTF_TRAN
3050: 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 0a 20  SLATION_NEEDED. 
3060: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
3070: 65 65 28 26 64 53 71 6c 29 3b 0a 20 20 20 20 69  ee(&dSql);.    i
3080: 66 28 20 6f 62 6a 63 3d 3d 35 20 26 26 20 63 62  f( objc==5 && cb
3090: 44 61 74 61 2e 61 7a 43 6f 6c 4e 61 6d 65 20 29  Data.azColName )
30a0: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
30b0: 20 69 3c 63 62 44 61 74 61 2e 6e 43 6f 6c 4e 61   i<cbData.nColNa
30c0: 6d 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  me; i++){.      
30d0: 20 20 69 66 28 20 63 62 44 61 74 61 2e 61 7a 43    if( cbData.azC
30e0: 6f 6c 4e 61 6d 65 5b 69 5d 20 29 20 66 72 65 65  olName[i] ) free
30f0: 28 63 62 44 61 74 61 2e 61 7a 43 6f 6c 4e 61 6d  (cbData.azColNam
3100: 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e[i]);.      }. 
3110: 20 20 20 20 20 66 72 65 65 28 63 62 44 61 74 61       free(cbData
3120: 2e 61 7a 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20  .azColName);.   
3130: 20 20 20 63 62 44 61 74 61 2e 61 7a 43 6f 6c 4e     cbData.azColN
3140: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23  ame = 0;.    }.#
3150: 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
3160: 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20   rc;.  }..  /*. 
3170: 20 2a 2a 20 20 20 20 20 24 64 62 20 6c 61 73 74   **     $db last
3180: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 0a 20  _insert_rowid . 
3190: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
31a0: 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
31b0: 20 69 73 20 74 68 65 20 52 4f 57 49 44 20 66 6f   is the ROWID fo
31c0: 72 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  r the most recen
31d0: 74 20 69 6e 73 65 72 74 2e 0a 20 20 2a 2f 0a 20  t insert..  */. 
31e0: 20 63 61 73 65 20 44 42 5f 4c 41 53 54 5f 49 4e   case DB_LAST_IN
31f0: 53 45 52 54 5f 52 4f 57 49 44 3a 20 7b 0a 20 20  SERT_ROWID: {.  
3200: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
3210: 6c 74 3b 0a 20 20 20 20 69 6e 74 20 72 6f 77 69  lt;.    int rowi
3220: 64 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  d;.    if( objc!
3230: 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =2 ){.      Tcl_
3240: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
3250: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22  erp, 2, objv, ""
3260: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
3270: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
3280: 0a 20 20 20 20 72 6f 77 69 64 20 3d 20 73 71 6c  .    rowid = sql
3290: 69 74 65 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f  ite_last_insert_
32a0: 72 6f 77 69 64 28 70 44 62 2d 3e 64 62 29 3b 0a  rowid(pDb->db);.
32b0: 20 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63      pResult = Tc
32c0: 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_GetObjResult(i
32d0: 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
32e0: 53 65 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c  SetIntObj(pResul
32f0: 74 2c 20 72 6f 77 69 64 29 3b 0a 20 20 20 20 62  t, rowid);.    b
3300: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
3310: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 74 69 6d    **     $db tim
3320: 65 6f 75 74 20 4d 49 4c 4c 45 53 45 43 4f 4e 44  eout MILLESECOND
3330: 53 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 65 6c 61  S.  **.  ** Dela
3340: 79 20 66 6f 72 20 74 68 65 20 6e 75 6d 62 65 72  y for the number
3350: 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
3360: 20 73 70 65 63 69 66 69 65 64 20 77 68 65 6e 20   specified when 
3370: 61 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64  a file is locked
3380: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
3390: 5f 54 49 4d 45 4f 55 54 3a 20 7b 0a 20 20 20 20  _TIMEOUT: {.    
33a0: 69 6e 74 20 6d 73 3b 0a 20 20 20 20 69 66 28 20  int ms;.    if( 
33b0: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
33c0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
33d0: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
33e0: 76 2c 20 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53  v, "MILLISECONDS
33f0: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
3400: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
3410: 7d 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  }.    if( Tcl_Ge
3420: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
3430: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6d 73  rp, objv[2], &ms
3440: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
3450: 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65  RROR;.    sqlite
3460: 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 70 44  _busy_timeout(pD
3470: 62 2d 3e 64 62 2c 20 6d 73 29 3b 0a 20 20 20 20  b->db, ms);.    
3480: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 7d 20 2f  break;.  }.  } /
3490: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 53 57 49  * End of the SWI
34a0: 54 43 48 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  TCH statement */
34b0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
34c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 73 71 6c  ;.}../*.**   sql
34d0: 69 74 65 20 44 42 4e 41 4d 45 20 46 49 4c 45 4e  ite DBNAME FILEN
34e0: 41 4d 45 20 3f 4d 4f 44 45 3f 0a 2a 2a 0a 2a 2a  AME ?MODE?.**.**
34f0: 20 54 68 69 73 20 69 73 20 74 68 65 20 6d 61 69   This is the mai
3500: 6e 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20 20  n Tcl command.  
3510: 57 68 65 6e 20 74 68 65 20 22 73 71 6c 69 74 65  When the "sqlite
3520: 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 69 73  " Tcl command is
3530: 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2c 20 74 68 69  .** invoked, thi
3540: 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 74  s routine runs t
3550: 6f 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  o process that c
3560: 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  ommand..**.** Th
3570: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
3580: 2c 20 44 42 4e 41 4d 45 2c 20 69 73 20 61 6e 20  , DBNAME, is an 
3590: 61 72 62 69 74 72 61 72 79 20 6e 61 6d 65 20 66  arbitrary name f
35a0: 6f 72 20 61 20 6e 65 77 0a 2a 2a 20 64 61 74 61  or a new.** data
35b0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
35c0: 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63    This command c
35d0: 72 65 61 74 65 73 20 61 20 6e 65 77 20 63 6f 6d  reates a new com
35e0: 6d 61 6e 64 20 6e 61 6d 65 64 0a 2a 2a 20 44 42  mand named.** DB
35f0: 4e 41 4d 45 20 74 68 61 74 20 69 73 20 75 73 65  NAME that is use
3600: 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 61  d to control tha
3610: 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54  t connection.  T
3620: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  he database.** c
3630: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 64 65 6c  onnection is del
3640: 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 44 42  eted when the DB
3650: 4e 41 4d 45 20 63 6f 6d 6d 61 6e 64 20 69 73 20  NAME command is 
3660: 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  deleted..**.** T
3670: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
3680: 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  nt is the name o
3690: 66 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  f the directory 
36a0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  that contains.**
36b0: 20 74 68 65 20 73 71 6c 69 74 65 20 64 61 74 61   the sqlite data
36c0: 62 61 73 65 20 74 68 61 74 20 69 73 20 74 6f 20  base that is to 
36d0: 62 65 20 61 63 63 65 73 73 65 64 2e 0a 2a 2a 0a  be accessed..**.
36e0: 2a 2a 20 46 6f 72 20 74 65 73 74 69 6e 67 20 70  ** For testing p
36f0: 75 72 70 6f 73 65 73 2c 20 77 65 20 61 6c 73 6f  urposes, we also
3700: 20 73 75 70 70 6f 72 74 20 74 68 65 20 66 6f 6c   support the fol
3710: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 73  lowing:.**.**  s
3720: 71 6c 69 74 65 20 2d 65 6e 63 6f 64 69 6e 67 0a  qlite -encoding.
3730: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 52 65 74 75  **.**       Retu
3740: 72 6e 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  rn the encoding 
3750: 75 73 65 64 20 62 79 20 4c 49 4b 45 20 61 6e 64  used by LIKE and
3760: 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 73 2e   GLOB operators.
3770: 20 20 43 68 6f 69 63 65 73 0a 2a 2a 20 20 20 20    Choices.**    
3780: 20 20 20 61 72 65 20 55 54 46 2d 38 20 61 6e 64     are UTF-8 and
3790: 20 69 73 6f 38 38 35 39 2e 0a 2a 2a 0a 2a 2a 20   iso8859..**.** 
37a0: 20 73 71 6c 69 74 65 20 2d 74 63 6c 2d 75 73 65   sqlite -tcl-use
37b0: 73 2d 75 74 66 0a 2a 2a 0a 2a 2a 20 20 20 20 20  s-utf.**.**     
37c0: 20 20 52 65 74 75 72 6e 20 22 31 22 20 69 66 20    Return "1" if 
37d0: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 61 20  compiled with a 
37e0: 54 63 6c 20 75 73 65 73 20 55 54 46 2d 38 2e 20  Tcl uses UTF-8. 
37f0: 20 52 65 74 75 72 6e 20 22 30 22 20 69 66 0a 2a   Return "0" if.*
3800: 2a 20 20 20 20 20 20 20 6e 6f 74 2e 20 20 55 73  *       not.  Us
3810: 65 64 20 62 79 20 74 65 73 74 73 20 74 6f 20 6d  ed by tests to m
3820: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 69 62  ake sure the lib
3830: 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65  rary was compile
3840: 64 20 0a 2a 2a 20 20 20 20 20 20 20 63 6f 72 72  d .**       corr
3850: 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ectly..*/.static
3860: 20 69 6e 74 20 44 62 4d 61 69 6e 28 76 6f 69 64   int DbMain(void
3870: 20 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70   *cd, Tcl_Interp
3880: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 61 72   *interp, int ar
3890: 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29  gc, char **argv)
38a0: 7b 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20  {.  int mode;.  
38b0: 53 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 63  SqliteDb *p;.  c
38c0: 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 0a 20 20  har *zErrMsg;.  
38d0: 69 66 28 20 61 72 67 63 3d 3d 32 20 29 7b 0a 20  if( argc==2 ){. 
38e0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72     if( strcmp(ar
38f0: 67 76 5b 31 5d 2c 22 2d 65 6e 63 6f 64 69 6e 67  gv[1],"-encoding
3900: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  ")==0 ){.      T
3910: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
3920: 69 6e 74 65 72 70 2c 73 71 6c 69 74 65 5f 65 6e  interp,sqlite_en
3930: 63 6f 64 69 6e 67 2c 30 29 3b 0a 20 20 20 20 20  coding,0);.     
3940: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
3950: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
3960: 72 63 6d 70 28 61 72 67 76 5b 31 5d 2c 22 2d 74  rcmp(argv[1],"-t
3970: 63 6c 2d 75 73 65 73 2d 75 74 66 22 29 3d 3d 30  cl-uses-utf")==0
3980: 20 29 7b 0a 23 69 66 64 65 66 20 54 43 4c 5f 55   ){.#ifdef TCL_U
3990: 54 46 5f 4d 41 58 0a 20 20 20 20 20 20 54 63 6c  TF_MAX.      Tcl
39a0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
39b0: 74 65 72 70 2c 22 31 22 2c 30 29 3b 0a 23 65 6c  terp,"1",0);.#el
39c0: 73 65 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  se.      Tcl_App
39d0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
39e0: 2c 22 30 22 2c 30 29 3b 0a 23 65 6e 64 69 66 0a  ,"0",0);.#endif.
39f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
3a00: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
3a10: 20 69 66 28 20 61 72 67 63 21 3d 33 20 26 26 20   if( argc!=3 && 
3a20: 61 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  argc!=4 ){.    T
3a30: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
3a40: 69 6e 74 65 72 70 2c 22 77 72 6f 6e 67 20 23 20  interp,"wrong # 
3a50: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
3a60: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
3a70: 20 20 20 20 20 22 20 48 41 4e 44 4c 45 20 46 49       " HANDLE FI
3a80: 4c 45 4e 41 4d 45 20 3f 4d 4f 44 45 3f 5c 22 22  LENAME ?MODE?\""
3a90: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
3aa0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
3ab0: 20 20 69 66 28 20 61 72 67 63 3d 3d 33 20 29 7b    if( argc==3 ){
3ac0: 0a 20 20 20 20 6d 6f 64 65 20 3d 20 30 36 36 36  .    mode = 0666
3ad0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 54 63  ;.  }else if( Tc
3ae0: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
3af0: 20 61 72 67 76 5b 33 5d 2c 20 26 6d 6f 64 65 29   argv[3], &mode)
3b00: 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20  !=TCL_OK ){.    
3b10: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
3b20: 3b 0a 20 20 7d 0a 20 20 7a 45 72 72 4d 73 67 20  ;.  }.  zErrMsg 
3b30: 3d 20 30 3b 0a 20 20 70 20 3d 20 28 53 71 6c 69  = 0;.  p = (Sqli
3b40: 74 65 44 62 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  teDb*)Tcl_Alloc(
3b50: 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
3b60: 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
3b70: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
3b80: 6e 74 65 72 70 2c 20 22 6d 61 6c 6c 6f 63 20 66  nterp, "malloc f
3b90: 61 69 6c 65 64 22 2c 20 54 43 4c 5f 53 54 41 54  ailed", TCL_STAT
3ba0: 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  IC);.    return 
3bb0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
3bc0: 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
3bd0: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 70 2d 3e  zeof(*p));.  p->
3be0: 64 62 20 3d 20 73 71 6c 69 74 65 5f 6f 70 65 6e  db = sqlite_open
3bf0: 28 61 72 67 76 5b 32 5d 2c 20 6d 6f 64 65 2c 20  (argv[2], mode, 
3c00: 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28  &zErrMsg);.  if(
3c10: 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20   p->db==0 ){.   
3c20: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
3c30: 6e 74 65 72 70 2c 20 7a 45 72 72 4d 73 67 2c 20  nterp, zErrMsg, 
3c40: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20  TCL_VOLATILE);. 
3c50: 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61     Tcl_Free((cha
3c60: 72 2a 29 70 29 3b 0a 20 20 20 20 66 72 65 65 28  r*)p);.    free(
3c70: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 72 65  zErrMsg);.    re
3c80: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
3c90: 20 20 7d 0a 20 20 54 63 6c 5f 43 72 65 61 74 65    }.  Tcl_Create
3ca0: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
3cb0: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 44 62 4f 62  p, argv[1], DbOb
3cc0: 6a 43 6d 64 2c 20 28 63 68 61 72 2a 29 70 2c 20  jCmd, (char*)p, 
3cd0: 44 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a 20 20  DbDeleteCmd);.  
3ce0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
3cf0: 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65 20  ../*.** Provide 
3d00: 61 20 64 75 6d 6d 79 20 54 63 6c 5f 49 6e 69 74  a dummy Tcl_Init
3d10: 53 74 75 62 73 20 69 66 20 77 65 20 61 72 65 20  Stubs if we are 
3d20: 75 73 69 6e 67 20 74 68 69 73 20 61 73 20 61 20  using this as a 
3d30: 73 74 61 74 69 63 0a 2a 2a 20 6c 69 62 72 61 72  static.** librar
3d40: 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 55 53  y..*/.#ifndef US
3d50: 45 5f 54 43 4c 5f 53 54 55 42 53 0a 23 20 75 6e  E_TCL_STUBS.# un
3d60: 64 65 66 20 20 54 63 6c 5f 49 6e 69 74 53 74 75  def  Tcl_InitStu
3d70: 62 73 0a 23 20 64 65 66 69 6e 65 20 54 63 6c 5f  bs.# define Tcl_
3d80: 49 6e 69 74 53 74 75 62 73 28 61 2c 62 2c 63 29  InitStubs(a,b,c)
3d90: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
3da0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20 6d  nitialize this m
3db0: 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  odule..**.** Thi
3dc0: 73 20 54 63 6c 20 6d 6f 64 75 6c 65 20 63 6f 6e  s Tcl module con
3dd0: 74 61 69 6e 73 20 6f 6e 6c 79 20 61 20 73 69 6e  tains only a sin
3de0: 67 6c 65 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d  gle new Tcl comm
3df0: 61 6e 64 20 6e 61 6d 65 64 20 22 73 71 6c 69 74  and named "sqlit
3e00: 65 22 2e 0a 2a 2a 20 28 48 65 6e 63 65 20 74 68  e"..** (Hence th
3e10: 65 72 65 20 69 73 20 6e 6f 20 6e 61 6d 65 73 70  ere is no namesp
3e20: 61 63 65 2e 20 20 54 68 65 72 65 20 69 73 20 6e  ace.  There is n
3e30: 6f 20 70 6f 69 6e 74 20 69 6e 20 75 73 69 6e 67  o point in using
3e40: 20 61 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a 20   a namespace.** 
3e50: 69 66 20 74 68 65 20 65 78 74 65 6e 73 69 6f 6e  if the extension
3e60: 20 6f 6e 6c 79 20 73 75 70 70 6c 69 65 73 20 6f   only supplies o
3e70: 6e 65 20 6e 65 77 20 6e 61 6d 65 21 29 20 20 54  ne new name!)  T
3e80: 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d  he "sqlite" comm
3e90: 61 6e 64 20 69 73 0a 2a 2a 20 75 73 65 64 20 74  and is.** used t
3ea0: 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 53 51 4c  o open a new SQL
3eb0: 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 53  ite database.  S
3ec0: 65 65 20 74 68 65 20 44 62 4d 61 69 6e 28 29 20  ee the DbMain() 
3ed0: 72 6f 75 74 69 6e 65 20 61 62 6f 76 65 0a 2a 2a  routine above.**
3ee0: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
3ef0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
3f00: 69 6e 74 20 53 71 6c 69 74 65 5f 49 6e 69 74 28  int Sqlite_Init(
3f10: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
3f20: 72 70 29 7b 0a 20 20 54 63 6c 5f 49 6e 69 74 53  rp){.  Tcl_InitS
3f30: 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e  tubs(interp, "8.
3f40: 30 22 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72  0", 0);.  Tcl_Cr
3f50: 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eateCommand(inte
3f60: 72 70 2c 20 22 73 71 6c 69 74 65 22 2c 20 44 62  rp, "sqlite", Db
3f70: 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54  Main, 0, 0);.  T
3f80: 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e  cl_PkgProvide(in
3f90: 74 65 72 70 2c 20 22 73 71 6c 69 74 65 22 2c 20  terp, "sqlite", 
3fa0: 22 32 2e 30 22 29 3b 0a 20 20 72 65 74 75 72 6e  "2.0");.  return
3fb0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 54   TCL_OK;.}.int T
3fc0: 63 6c 73 71 6c 69 74 65 5f 49 6e 69 74 28 54 63  clsqlite_Init(Tc
3fd0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
3fe0: 29 7b 0a 20 20 54 63 6c 5f 49 6e 69 74 53 74 75  ){.  Tcl_InitStu
3ff0: 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e 30 22  bs(interp, "8.0"
4000: 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61  , 0);.  Tcl_Crea
4010: 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  teCommand(interp
4020: 2c 20 22 73 71 6c 69 74 65 22 2c 20 44 62 4d 61  , "sqlite", DbMa
4030: 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c  in, 0, 0);.  Tcl
4040: 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74 65  _PkgProvide(inte
4050: 72 70 2c 20 22 73 71 6c 69 74 65 22 2c 20 22 32  rp, "sqlite", "2
4060: 2e 30 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  .0");.  return T
4070: 43 4c 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 53 71 6c  CL_OK;.}.int Sql
4080: 69 74 65 5f 53 61 66 65 49 6e 69 74 28 54 63 6c  ite_SafeInit(Tcl
4090: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
40a0: 7b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  {.  return TCL_O
40b0: 4b 3b 0a 7d 0a 69 6e 74 20 54 63 6c 73 71 6c 69  K;.}.int Tclsqli
40c0: 74 65 5f 53 61 66 65 49 6e 69 74 28 54 63 6c 5f  te_SafeInit(Tcl_
40d0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
40e0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
40f0: 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a 2a  ;.}..#if 0./*.**
4100: 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 75 73 69   If compiled usi
4110: 6e 67 20 6d 6b 74 63 6c 61 70 70 2c 20 74 68 69  ng mktclapp, thi
4120: 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 74  s routine runs t
4130: 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 2a 2a 20  o initialize.** 
4140: 65 76 65 72 79 74 68 69 6e 67 2e 0a 2a 2f 0a 69  everything..*/.i
4150: 6e 74 20 45 74 5f 41 70 70 49 6e 69 74 28 54 63  nt Et_AppInit(Tc
4160: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
4170: 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 71 6c 69  ){.  return Sqli
4180: 74 65 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  te_Init(interp);
4190: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
41a0: 20 49 66 20 74 68 65 20 6d 61 63 72 6f 20 54 43   If the macro TC
41b0: 4c 53 48 20 69 73 20 64 65 66 69 6e 65 64 20 61  LSH is defined a
41c0: 6e 64 20 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20  nd is one, then 
41d0: 70 75 74 20 69 6e 20 63 6f 64 65 20 66 6f 72 20  put in code for 
41e0: 74 68 65 0a 2a 2a 20 22 6d 61 69 6e 22 20 72 6f  the.** "main" ro
41f0: 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20  utine that will 
4200: 69 6e 69 74 69 61 6c 69 7a 65 20 54 63 6c 2e 0a  initialize Tcl..
4210: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 54  */.#if defined(T
4220: 43 4c 53 48 29 20 26 26 20 54 43 4c 53 48 3d 3d  CLSH) && TCLSH==
4230: 31 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a 4d  1.static char zM
4240: 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20 20 22 73  ainloop[] =.  "s
4250: 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20  et line {}\n".  
4260: 22 77 68 69 6c 65 20 7b 21 5b 65 6f 66 20 73 74  "while {![eof st
4270: 64 69 6e 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 22  din]} {\n".    "
4280: 69 66 20 7b 24 6c 69 6e 65 21 3d 5c 22 5c 22 7d  if {$line!=\"\"}
4290: 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 70 75 74   {\n".      "put
42a0: 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 3e  s -nonewline \">
42b0: 20 5c 22 5c 6e 22 0a 20 20 20 20 22 7d 20 65 6c   \"\n".    "} el
42c0: 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 70  se {\n".      "p
42d0: 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c  uts -nonewline \
42e0: 22 25 20 5c 22 5c 6e 22 0a 20 20 20 20 22 7d 5c  "% \"\n".    "}\
42f0: 6e 22 0a 20 20 20 20 22 66 6c 75 73 68 20 73 74  n".    "flush st
4300: 64 6f 75 74 5c 6e 22 0a 20 20 20 20 22 61 70 70  dout\n".    "app
4310: 65 6e 64 20 6c 69 6e 65 20 5b 67 65 74 73 20 73  end line [gets s
4320: 74 64 69 6e 5d 5c 6e 22 0a 20 20 20 20 22 69 66  tdin]\n".    "if
4330: 20 7b 5b 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65   {[info complete
4340: 20 24 6c 69 6e 65 5d 7d 20 7b 5c 6e 22 0a 20 20   $line]} {\n".  
4350: 20 20 20 20 22 69 66 20 7b 5b 63 61 74 63 68 20      "if {[catch 
4360: 7b 75 70 6c 65 76 65 6c 20 23 30 20 24 6c 69 6e  {uplevel #0 $lin
4370: 65 7d 20 72 65 73 75 6c 74 5d 7d 20 7b 5c 6e 22  e} result]} {\n"
4380: 0a 20 20 20 20 20 20 20 20 22 70 75 74 73 20 73  .        "puts s
4390: 74 64 65 72 72 20 5c 22 45 72 72 6f 72 3a 20 24  tderr \"Error: $
43a0: 72 65 73 75 6c 74 5c 22 5c 6e 22 0a 20 20 20 20  result\"\n".    
43b0: 20 20 22 7d 20 65 6c 73 65 69 66 20 7b 24 72 65    "} elseif {$re
43c0: 73 75 6c 74 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22  sult!=\"\"} {\n"
43d0: 0a 20 20 20 20 20 20 20 20 22 70 75 74 73 20 24  .        "puts $
43e0: 72 65 73 75 6c 74 5c 6e 22 0a 20 20 20 20 20 20  result\n".      
43f0: 22 7d 5c 6e 22 0a 20 20 20 20 20 20 22 73 65 74  "}\n".      "set
4400: 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 20 20   line {}\n".    
4410: 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20  "} else {\n".   
4420: 20 20 20 22 61 70 70 65 6e 64 20 6c 69 6e 65 20     "append line 
4430: 5c 5c 6e 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22  \\n\n".    "}\n"
4440: 0a 20 20 22 7d 5c 6e 22 0a 3b 0a 0a 23 64 65 66  .  "}\n".;..#def
4450: 69 6e 65 20 54 43 4c 53 48 5f 4d 41 49 4e 20 6d  ine TCLSH_MAIN m
4460: 61 69 6e 20 20 20 2f 2a 20 4e 65 65 64 65 64 20  ain   /* Needed 
4470: 74 6f 20 66 61 6b 65 20 6f 75 74 20 6d 6b 74 63  to fake out mktc
4480: 6c 61 70 70 20 2a 2f 0a 69 6e 74 20 54 43 4c 53  lapp */.int TCLS
4490: 48 5f 4d 41 49 4e 28 69 6e 74 20 61 72 67 63 2c  H_MAIN(int argc,
44a0: 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20   char **argv){. 
44b0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
44c0: 65 72 70 3b 0a 20 20 54 63 6c 5f 46 69 6e 64 45  erp;.  Tcl_FindE
44d0: 78 65 63 75 74 61 62 6c 65 28 61 72 67 76 5b 30  xecutable(argv[0
44e0: 5d 29 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 54  ]);.  interp = T
44f0: 63 6c 5f 43 72 65 61 74 65 49 6e 74 65 72 70 28  cl_CreateInterp(
4500: 29 3b 0a 20 20 53 71 6c 69 74 65 5f 49 6e 69 74  );.  Sqlite_Init
4510: 28 69 6e 74 65 72 70 29 3b 0a 23 69 66 64 65 66  (interp);.#ifdef
4520: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 7b   SQLITE_TEST.  {
4530: 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
4540: 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74  Sqlitetest1_Init
4550: 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
4560: 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
4570: 6c 69 74 65 74 65 73 74 32 5f 49 6e 69 74 28 54  litetest2_Init(T
4580: 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
4590: 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
45a0: 74 65 74 65 73 74 33 5f 49 6e 69 74 28 54 63 6c  tetest3_Init(Tcl
45b0: 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
45c0: 78 74 65 72 6e 20 69 6e 74 20 4d 64 35 5f 49 6e  xtern int Md5_In
45d0: 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
45e0: 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 31  .    Sqlitetest1
45f0: 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
4600: 20 20 20 53 71 6c 69 74 65 74 65 73 74 32 5f 49     Sqlitetest2_I
4610: 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
4620: 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e 69   Sqlitetest3_Ini
4630: 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 4d  t(interp);.    M
4640: 64 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b  d5_Init(interp);
4650: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
4660: 28 20 61 72 67 63 3e 3d 32 20 29 7b 0a 20 20 20  ( argc>=2 ){.   
4670: 20 69 6e 74 20 69 3b 0a 20 20 20 20 54 63 6c 5f   int i;.    Tcl_
4680: 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61  SetVar(interp,"a
4690: 72 67 76 30 22 2c 61 72 67 76 5b 31 5d 2c 54 43  rgv0",argv[1],TC
46a0: 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a  L_GLOBAL_ONLY);.
46b0: 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69      Tcl_SetVar(i
46c0: 6e 74 65 72 70 2c 22 61 72 67 76 22 2c 20 22 22  nterp,"argv", ""
46d0: 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c  , TCL_GLOBAL_ONL
46e0: 59 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 32 3b  Y);.    for(i=2;
46f0: 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20   i<argc; i++){. 
4700: 20 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28       Tcl_SetVar(
4710: 69 6e 74 65 72 70 2c 20 22 61 72 67 76 22 2c 20  interp, "argv", 
4720: 61 72 67 76 5b 69 5d 2c 0a 20 20 20 20 20 20 20  argv[i],.       
4730: 20 20 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e     TCL_GLOBAL_ON
4740: 4c 59 20 7c 20 54 43 4c 5f 4c 49 53 54 5f 45 4c  LY | TCL_LIST_EL
4750: 45 4d 45 4e 54 20 7c 20 54 43 4c 5f 41 50 50 45  EMENT | TCL_APPE
4760: 4e 44 5f 56 41 4c 55 45 29 3b 0a 20 20 20 20 7d  ND_VALUE);.    }
4770: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 45 76 61  .    if( Tcl_Eva
4780: 6c 46 69 6c 65 28 69 6e 74 65 72 70 2c 20 61 72  lFile(interp, ar
4790: 67 76 5b 31 5d 29 21 3d 54 43 4c 5f 4f 4b 20 29  gv[1])!=TCL_OK )
47a0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 49  {.      char *zI
47b0: 6e 66 6f 20 3d 20 54 63 6c 5f 47 65 74 56 61 72  nfo = Tcl_GetVar
47c0: 28 69 6e 74 65 72 70 2c 20 22 65 72 72 6f 72 49  (interp, "errorI
47d0: 6e 66 6f 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c  nfo", TCL_GLOBAL
47e0: 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 69 66  _ONLY);.      if
47f0: 28 20 7a 49 6e 66 6f 3d 3d 30 20 29 20 7a 49 6e  ( zInfo==0 ) zIn
4800: 66 6f 20 3d 20 69 6e 74 65 72 70 2d 3e 72 65 73  fo = interp->res
4810: 75 6c 74 3b 0a 20 20 20 20 20 20 66 70 72 69 6e  ult;.      fprin
4820: 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20 25  tf(stderr,"%s: %
4830: 73 5c 6e 22 2c 20 2a 61 72 67 76 2c 20 7a 49 6e  s\n", *argv, zIn
4840: 66 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  fo);.      retur
4850: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  n 1;.    }.  }el
4860: 73 65 7b 0a 20 20 20 20 54 63 6c 5f 47 6c 6f 62  se{.    Tcl_Glob
4870: 61 6c 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 7a  alEval(interp, z
4880: 4d 61 69 6e 6c 6f 6f 70 29 3b 0a 20 20 7d 0a 20  Mainloop);.  }. 
4890: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e   return 0;.}.#en
48a0: 64 69 66 20 2f 2a 20 54 43 4c 53 48 20 2a 2f 0a  dif /* TCLSH */.
48b0: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
48c0: 6e 65 64 28 4e 4f 5f 54 43 4c 29 20 2a 2f 0a     ned(NO_TCL) */.