/ Hex Artifact Content
Login

Artifact 4896e078495bf868742f5394dcf01c5efe5bea02:


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: 37 20 32 30 30 31 2f 31 30 2f 32 32 20 30 32 3a  7 2001/10/22 02:
01c0: 35 38 3a 31 30 20 64 72 68 20 45 78 70 20 24 0a  58:10 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 0a 2f 2a 0a 2a 2a 20 49 66 20 54  g.h>../*.** If T
0270: 43 4c 20 75 73 65 73 20 55 54 46 2d 38 20 61 6e  CL uses UTF-8 an
0280: 64 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 66  d SQLite is conf
0290: 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 69 73  igured to use is
02a0: 6f 38 38 35 39 2c 20 74 68 65 6e 20 77 65 0a 2a  o8859, then we.*
02b0: 2a 20 68 61 76 65 20 74 6f 20 64 6f 20 61 20 74  * have to do a t
02c0: 72 61 6e 73 6c 61 74 69 6f 6e 20 77 68 65 6e 20  ranslation when 
02d0: 67 6f 69 6e 67 20 62 65 74 77 65 65 6e 20 74 68  going between th
02e0: 65 20 74 77 6f 2e 20 20 53 65 74 20 74 68 65 20  e two.  Set the 
02f0: 0a 2a 2a 20 55 54 46 5f 54 52 41 4e 53 4c 41 54  .** UTF_TRANSLAT
0300: 49 4f 4e 5f 4e 45 45 44 45 44 20 6d 61 63 72 6f  ION_NEEDED macro
0310: 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61   to indicate tha
0320: 74 20 77 65 20 6e 65 65 64 20 74 6f 20 64 6f 0a  t we need to do.
0330: 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 6c 61 74  ** this translat
0340: 69 6f 6e 2e 20 20 0a 2a 2f 0a 23 69 66 20 64 65  ion.  .*/.#if de
0350: 66 69 6e 65 64 28 54 43 4c 5f 55 54 46 5f 4d 41  fined(TCL_UTF_MA
0360: 58 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  X) && !defined(S
0370: 51 4c 49 54 45 5f 55 54 46 38 29 0a 23 20 64 65  QLITE_UTF8).# de
0380: 66 69 6e 65 20 55 54 46 5f 54 52 41 4e 53 4c 41  fine UTF_TRANSLA
0390: 54 49 4f 4e 5f 4e 45 45 44 45 44 20 31 0a 23 65  TION_NEEDED 1.#e
03a0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 72  ndif../*.** Ther
03b0: 65 20 69 73 20 6f 6e 65 20 69 6e 73 74 61 6e 63  e is one instanc
03c0: 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
03d0: 75 72 65 20 66 6f 72 20 65 61 63 68 20 53 51 4c  ure for each SQL
03e0: 69 74 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ite database.** 
03f0: 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 6f 70  that has been op
0400: 65 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 69  ened by the SQLi
0410: 74 65 20 54 43 4c 20 69 6e 74 65 72 66 61 63 65  te TCL interface
0420: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
0430: 75 63 74 20 53 71 6c 69 74 65 44 62 20 53 71 6c  uct SqliteDb Sql
0440: 69 74 65 44 62 3b 0a 73 74 72 75 63 74 20 53 71  iteDb;.struct Sq
0450: 6c 69 74 65 44 62 20 7b 0a 20 20 73 71 6c 69 74  liteDb {.  sqlit
0460: 65 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  e *db;          
0470: 20 2f 2a 20 54 68 65 20 22 72 65 61 6c 22 20 64   /* The "real" d
0480: 61 74 61 62 61 73 65 20 73 74 72 75 63 74 75 72  atabase structur
0490: 65 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  e */.  Tcl_Inter
04a0: 70 20 2a 69 6e 74 65 72 70 3b 20 20 20 2f 2a 20  p *interp;   /* 
04b0: 54 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 20  The interpreter 
04c0: 75 73 65 64 20 66 6f 72 20 74 68 69 73 20 64 61  used for this da
04d0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72  tabase */.  char
04e0: 20 2a 7a 42 75 73 79 3b 20 20 20 20 20 20 20 20   *zBusy;        
04f0: 20 20 2f 2a 20 54 68 65 20 62 75 73 79 20 63 61    /* The busy ca
0500: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a  llback routine *
0510: 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  /.};../*.** An i
0520: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
0530: 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65 73  structure passes
0540: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 72   information thr
0550: 75 20 74 68 65 20 73 71 6c 69 74 65 0a 2a 2a 20  u the sqlite.** 
0560: 6c 6f 67 69 63 20 66 72 6f 6d 20 74 68 65 20 6f  logic from the o
0570: 72 69 67 69 6e 61 6c 20 54 43 4c 20 63 6f 6d 6d  riginal TCL comm
0580: 61 6e 64 20 69 6e 74 6f 20 74 68 65 20 63 61 6c  and into the cal
0590: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 0a 2a  lback routine..*
05a0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
05b0: 20 43 61 6c 6c 62 61 63 6b 44 61 74 61 20 43 61   CallbackData Ca
05c0: 6c 6c 62 61 63 6b 44 61 74 61 3b 0a 73 74 72 75  llbackData;.stru
05d0: 63 74 20 43 61 6c 6c 62 61 63 6b 44 61 74 61 20  ct CallbackData 
05e0: 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  {.  Tcl_Interp *
05f0: 69 6e 74 65 72 70 3b 20 20 20 20 20 20 20 2f 2a  interp;       /*
0600: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
0610: 65 74 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  eter */.  char *
0620: 7a 41 72 72 61 79 3b 20 20 20 20 20 20 20 20 20  zArray;         
0630: 20 20 20 20 2f 2a 20 54 68 65 20 61 72 72 61 79      /* The array
0640: 20 69 6e 74 6f 20 77 68 69 63 68 20 64 61 74 61   into which data
0650: 20 69 73 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20   is written */. 
0660: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6f 64 65 3b   Tcl_Obj *pCode;
0670: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
0680: 65 20 63 6f 64 65 20 74 6f 20 65 78 65 63 75 74  e code to execut
0690: 65 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 2a  e for each row *
06a0: 2f 0a 20 20 69 6e 74 20 6f 6e 63 65 3b 20 20 20  /.  int once;   
06b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
06c0: 20 53 65 74 20 6f 6e 6c 79 20 66 6f 72 20 74 68   Set only for th
06d0: 65 20 66 69 72 73 74 20 69 6e 76 6f 63 61 74 69  e first invocati
06e0: 6f 6e 20 6f 66 20 63 61 6c 6c 62 61 63 6b 20 2a  on of callback *
06f0: 2f 0a 20 20 69 6e 74 20 74 63 6c 5f 72 63 3b 20  /.  int tcl_rc; 
0700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
0710: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   Return code fro
0720: 6d 20 54 43 4c 20 73 63 72 69 70 74 20 2a 2f 0a  m TCL script */.
0730: 20 20 69 6e 74 20 6e 43 6f 6c 4e 61 6d 65 3b 20    int nColName; 
0740: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
0750: 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73  umber of entries
0760: 20 69 6e 20 74 68 65 20 61 7a 43 6f 6c 4e 61 6d   in the azColNam
0770: 65 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20 63  e[] array */.  c
0780: 68 61 72 20 2a 2a 61 7a 43 6f 6c 4e 61 6d 65 3b  har **azColName;
0790: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75           /* Colu
07a0: 6d 6e 20 6e 61 6d 65 73 20 74 72 61 6e 73 6c 61  mn names transla
07b0: 74 65 64 20 74 6f 20 55 54 46 2d 38 20 2a 2f 0a  ted to UTF-8 */.
07c0: 7d 3b 0a 0a 23 69 66 64 65 66 20 55 54 46 5f 54  };..#ifdef UTF_T
07d0: 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45  RANSLATION_NEEDE
07e0: 44 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 66  D./*.** Called f
07f0: 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66 20 74  or each row of t
0800: 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a  he result..**.**
0810: 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20 69 73   This version is
0820: 20 75 73 65 64 20 77 68 65 6e 20 54 43 4c 20 65   used when TCL e
0830: 78 70 65 63 74 73 20 55 54 46 2d 38 20 64 61 74  xpects UTF-8 dat
0840: 61 20 62 75 74 20 74 68 65 20 64 61 74 61 62 61  a but the databa
0850: 73 65 0a 2a 2a 20 75 73 65 73 20 74 68 65 20 49  se.** uses the I
0860: 53 4f 38 38 35 39 20 66 6f 72 6d 61 74 2e 20 20  SO8859 format.  
0870: 41 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 6d 75  A translation mu
0880: 73 74 20 6f 63 63 75 72 20 66 72 6f 6d 20 49 53  st occur from IS
0890: 4f 38 38 35 39 20 69 6e 74 6f 0a 2a 2a 20 55 54  O8859 into.** UT
08a0: 46 2d 38 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  F-8..*/.static i
08b0: 6e 74 20 44 62 45 76 61 6c 43 61 6c 6c 62 61 63  nt DbEvalCallbac
08c0: 6b 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e  k(.  void *clien
08d0: 74 44 61 74 61 2c 20 20 20 20 20 20 2f 2a 20 41  tData,      /* A
08e0: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 43 61  n instance of Ca
08f0: 6c 6c 62 61 63 6b 44 61 74 61 20 2a 2f 0a 20 20  llbackData */.  
0900: 69 6e 74 20 6e 43 6f 6c 2c 20 20 20 20 20 20 20  int nCol,       
0910: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
0920: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
0930: 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 63  he result */.  c
0940: 68 61 72 20 2a 2a 20 61 7a 43 6f 6c 2c 20 20 20  har ** azCol,   
0950: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f        /* Data fo
0960: 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 2a 2f  r each column */
0970: 0a 20 20 63 68 61 72 20 2a 2a 20 61 7a 4e 20 20  .  char ** azN  
0980: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
0990: 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  e for each colum
09a0: 6e 20 2a 2f 0a 29 7b 0a 20 20 43 61 6c 6c 62 61  n */.){.  Callba
09b0: 63 6b 44 61 74 61 20 2a 63 62 44 61 74 61 20 3d  ckData *cbData =
09c0: 20 28 43 61 6c 6c 62 61 63 6b 44 61 74 61 2a 29   (CallbackData*)
09d0: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 69 6e  clientData;.  in
09e0: 74 20 69 2c 20 72 63 3b 0a 20 20 54 63 6c 5f 44  t i, rc;.  Tcl_D
09f0: 53 74 72 69 6e 67 20 64 43 6f 6c 3b 0a 20 20 54  String dCol;.  T
0a00: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
0a10: 64 43 6f 6c 29 3b 0a 20 20 69 66 28 20 61 7a 43  dCol);.  if( azC
0a20: 6f 6c 3d 3d 30 20 7c 7c 20 28 63 62 44 61 74 61  ol==0 || (cbData
0a30: 2d 3e 6f 6e 63 65 20 26 26 20 63 62 44 61 74 61  ->once && cbData
0a40: 2d 3e 7a 41 72 72 61 79 5b 30 5d 29 20 29 7b 0a  ->zArray[0]) ){.
0a50: 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 32 28      Tcl_SetVar2(
0a60: 63 62 44 61 74 61 2d 3e 69 6e 74 65 72 70 2c 20  cbData->interp, 
0a70: 63 62 44 61 74 61 2d 3e 7a 41 72 72 61 79 2c 20  cbData->zArray, 
0a80: 22 2a 22 2c 20 22 22 2c 20 30 29 3b 0a 20 20 20  "*", "", 0);.   
0a90: 20 69 66 28 20 61 7a 43 6f 6c 20 29 7b 0a 20 20   if( azCol ){.  
0aa0: 20 20 20 20 63 62 44 61 74 61 2d 3e 61 7a 43 6f      cbData->azCo
0ab0: 6c 4e 61 6d 65 20 3d 20 6d 61 6c 6c 6f 63 28 20  lName = malloc( 
0ac0: 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 63 68 61 72  nCol*sizeof(char
0ad0: 2a 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  *) );.      if( 
0ae0: 63 62 44 61 74 61 2d 3e 61 7a 43 6f 6c 4e 61 6d  cbData->azColNam
0af0: 65 3d 3d 30 20 29 7b 20 72 65 74 75 72 6e 20 31  e==0 ){ return 1
0b00: 3b 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63 62  ; }.    }.    cb
0b10: 44 61 74 61 2d 3e 6e 43 6f 6c 4e 61 6d 65 20 3d  Data->nColName =
0b20: 20 6e 43 6f 6c 3b 0a 20 20 20 20 66 6f 72 28 69   nCol;.    for(i
0b30: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
0b40: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 45 78 74 65  {.      Tcl_Exte
0b50: 72 6e 61 6c 54 6f 55 74 66 44 53 74 72 69 6e 67  rnalToUtfDString
0b60: 28 4e 55 4c 4c 2c 20 61 7a 4e 5b 69 5d 2c 20 2d  (NULL, azN[i], -
0b70: 31 2c 20 26 64 43 6f 6c 29 3b 0a 20 20 20 20 20  1, &dCol);.     
0b80: 20 69 66 28 20 61 7a 43 6f 6c 20 29 7b 0a 20 20   if( azCol ){.  
0b90: 20 20 20 20 20 20 63 62 44 61 74 61 2d 3e 61 7a        cbData->az
0ba0: 43 6f 6c 4e 61 6d 65 5b 69 5d 20 3d 20 6d 61 6c  ColName[i] = mal
0bb0: 6c 6f 63 28 20 54 63 6c 5f 44 53 74 72 69 6e 67  loc( Tcl_DString
0bc0: 4c 65 6e 67 74 68 28 26 64 43 6f 6c 29 20 2b 20  Length(&dCol) + 
0bd0: 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
0be0: 63 62 44 61 74 61 2d 3e 61 7a 43 6f 6c 4e 61 6d  cbData->azColNam
0bf0: 65 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  e[i] ){.        
0c00: 20 20 73 74 72 63 70 79 28 63 62 44 61 74 61 2d    strcpy(cbData-
0c10: 3e 61 7a 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 54  >azColName[i], T
0c20: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
0c30: 26 64 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20 20  &dCol));.       
0c40: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
0c50: 20 54 63 6c 5f 53 65 74 56 61 72 32 28 63 62 44   Tcl_SetVar2(cbD
0c60: 61 74 61 2d 3e 69 6e 74 65 72 70 2c 20 63 62 44  ata->interp, cbD
0c70: 61 74 61 2d 3e 7a 41 72 72 61 79 2c 20 22 2a 22  ata->zArray, "*"
0c80: 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  , Tcl_DStringVal
0c90: 75 65 28 26 64 43 6f 6c 29 2c 0a 20 20 20 20 20  ue(&dCol),.     
0ca0: 20 20 20 20 54 43 4c 5f 4c 49 53 54 5f 45 4c 45      TCL_LIST_ELE
0cb0: 4d 45 4e 54 7c 54 43 4c 5f 41 50 50 45 4e 44 5f  MENT|TCL_APPEND_
0cc0: 56 41 4c 55 45 29 3b 0a 20 20 20 20 20 20 54 63  VALUE);.      Tc
0cd0: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64  l_DStringFree(&d
0ce0: 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Col);.    }.    
0cf0: 63 62 44 61 74 61 2d 3e 6f 6e 63 65 20 3d 20 30  cbData->once = 0
0d00: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 7a 43 6f  ;.  }.  if( azCo
0d10: 6c 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  l!=0 ){.    if( 
0d20: 63 62 44 61 74 61 2d 3e 7a 41 72 72 61 79 5b 30  cbData->zArray[0
0d30: 5d 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  ] ){.      for(i
0d40: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
0d50: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
0d60: 7a 20 3d 20 61 7a 43 6f 6c 5b 69 5d 3b 0a 20 20  z = azCol[i];.  
0d70: 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29        if( z==0 )
0d80: 20 7a 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20   z = "";.       
0d90: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
0da0: 28 26 64 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20  (&dCol);.       
0db0: 20 54 63 6c 5f 45 78 74 65 72 6e 61 6c 54 6f 55   Tcl_ExternalToU
0dc0: 74 66 44 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 20  tfDString(NULL, 
0dd0: 7a 2c 20 2d 31 2c 20 26 64 43 6f 6c 29 3b 0a 20  z, -1, &dCol);. 
0de0: 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 56 61         Tcl_SetVa
0df0: 72 32 28 63 62 44 61 74 61 2d 3e 69 6e 74 65 72  r2(cbData->inter
0e00: 70 2c 20 63 62 44 61 74 61 2d 3e 7a 41 72 72 61  p, cbData->zArra
0e10: 79 2c 20 63 62 44 61 74 61 2d 3e 61 7a 43 6f 6c  y, cbData->azCol
0e20: 4e 61 6d 65 5b 69 5d 2c 20 0a 20 20 20 20 20 20  Name[i], .      
0e30: 20 20 20 20 20 20 20 20 54 63 6c 5f 44 53 74 72          Tcl_DStr
0e40: 69 6e 67 56 61 6c 75 65 28 26 64 43 6f 6c 29 2c  ingValue(&dCol),
0e50: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c   0);.        Tcl
0e60: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 43  _DStringFree(&dC
0e70: 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ol);.      }.   
0e80: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f   }else{.      fo
0e90: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
0ea0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
0eb0: 72 20 2a 7a 20 3d 20 61 7a 43 6f 6c 5b 69 5d 3b  r *z = azCol[i];
0ec0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 3d 3d  .        if( z==
0ed0: 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20 20 20  0 ) z = "";.    
0ee0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49      Tcl_DStringI
0ef0: 6e 69 74 28 26 64 43 6f 6c 29 3b 0a 20 20 20 20  nit(&dCol);.    
0f00: 20 20 20 20 54 63 6c 5f 45 78 74 65 72 6e 61 6c      Tcl_External
0f10: 54 6f 55 74 66 44 53 74 72 69 6e 67 28 4e 55 4c  ToUtfDString(NUL
0f20: 4c 2c 20 7a 2c 20 2d 31 2c 20 26 64 43 6f 6c 29  L, z, -1, &dCol)
0f30: 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65  ;.        Tcl_Se
0f40: 74 56 61 72 28 63 62 44 61 74 61 2d 3e 69 6e 74  tVar(cbData->int
0f50: 65 72 70 2c 20 63 62 44 61 74 61 2d 3e 61 7a 43  erp, cbData->azC
0f60: 6f 6c 4e 61 6d 65 5b 69 5d 2c 0a 20 20 20 20 20  olName[i],.     
0f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
0f80: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
0f90: 64 43 6f 6c 29 2c 20 30 29 3b 0a 20 20 20 20 20  dCol), 0);.     
0fa0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
0fb0: 65 65 28 26 64 43 6f 6c 29 3b 0a 20 20 20 20 20  ee(&dCol);.     
0fc0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
0fd0: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 28  c = Tcl_EvalObj(
0fe0: 63 62 44 61 74 61 2d 3e 69 6e 74 65 72 70 2c 20  cbData->interp, 
0ff0: 63 62 44 61 74 61 2d 3e 70 43 6f 64 65 29 3b 0a  cbData->pCode);.
1000: 20 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 43 4f    if( rc==TCL_CO
1010: 4e 54 49 4e 55 45 20 29 20 72 63 20 3d 20 54 43  NTINUE ) rc = TC
1020: 4c 5f 4f 4b 3b 0a 20 20 63 62 44 61 74 61 2d 3e  L_OK;.  cbData->
1030: 74 63 6c 5f 72 63 20 3d 20 72 63 3b 0a 20 20 72  tcl_rc = rc;.  r
1040: 65 74 75 72 6e 20 72 63 21 3d 54 43 4c 5f 4f 4b  eturn rc!=TCL_OK
1050: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 55 54  ;.}.#endif /* UT
1060: 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45  F_TRANSLATION_NE
1070: 45 44 45 44 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  EDED */..#ifndef
1080: 20 55 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e   UTF_TRANSLATION
1090: 5f 4e 45 45 44 45 44 0a 2f 2a 0a 2a 2a 20 43 61  _NEEDED./*.** Ca
10a0: 6c 6c 65 64 20 66 6f 72 20 65 61 63 68 20 72 6f  lled for each ro
10b0: 77 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e  w of the result.
10c0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73  .**.** This vers
10d0: 69 6f 6e 20 69 73 20 75 73 65 64 20 77 68 65 6e  ion is used when
10e0: 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 66   either of the f
10f0: 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72 75 65  ollowing is true
1100: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 54  :.**.**    (1) T
1110: 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 54  his version of T
1120: 43 4c 20 75 73 65 73 20 55 54 46 2d 38 20 61 6e  CL uses UTF-8 an
1130: 64 20 74 68 65 20 64 61 74 61 20 69 6e 20 74 68  d the data in th
1140: 65 0a 2a 2a 20 20 20 20 20 20 20 20 53 51 4c 69  e.**        SQLi
1150: 74 65 20 64 61 74 61 62 61 73 65 20 69 73 20 61  te database is a
1160: 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 55 54  lready in the UT
1170: 46 2d 38 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  F-8 format..**.*
1180: 2a 20 20 20 20 28 32 29 20 54 68 69 73 20 76 65  *    (2) This ve
1190: 72 73 69 6f 6e 20 6f 66 20 54 43 4c 20 75 73 65  rsion of TCL use
11a0: 73 20 49 53 4f 38 38 35 39 20 61 6e 64 20 74 68  s ISO8859 and th
11b0: 65 20 64 61 74 61 20 69 6e 20 74 68 65 0a 2a 2a  e data in the.**
11c0: 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 20 64          SQLite d
11d0: 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61  atabase is alrea
11e0: 64 79 20 69 6e 20 74 68 65 20 49 53 4f 38 38 35  dy in the ISO885
11f0: 39 20 66 6f 72 6d 61 74 2e 0a 2a 2f 0a 73 74 61  9 format..*/.sta
1200: 74 69 63 20 69 6e 74 20 44 62 45 76 61 6c 43 61  tic int DbEvalCa
1210: 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69 64 20 2a  llback(.  void *
1220: 63 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20  clientData,     
1230: 20 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20   /* An instance 
1240: 6f 66 20 43 61 6c 6c 62 61 63 6b 44 61 74 61 20  of CallbackData 
1250: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c 20 20  */.  int nCol,  
1260: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1270: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
1280: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a   in the result *
1290: 2f 0a 20 20 63 68 61 72 20 2a 2a 20 61 7a 43 6f  /.  char ** azCo
12a0: 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  l,         /* Da
12b0: 74 61 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ta for each colu
12c0: 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 20  mn */.  char ** 
12d0: 61 7a 4e 20 20 20 20 20 20 20 20 20 20 20 20 2f  azN            /
12e0: 2a 20 4e 61 6d 65 20 66 6f 72 20 65 61 63 68 20  * Name for each 
12f0: 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 43  column */.){.  C
1300: 61 6c 6c 62 61 63 6b 44 61 74 61 20 2a 63 62 44  allbackData *cbD
1310: 61 74 61 20 3d 20 28 43 61 6c 6c 62 61 63 6b 44  ata = (CallbackD
1320: 61 74 61 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b  ata*)clientData;
1330: 0a 20 20 69 6e 74 20 69 2c 20 72 63 3b 0a 20 20  .  int i, rc;.  
1340: 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 7c 7c 20  if( azCol==0 || 
1350: 28 63 62 44 61 74 61 2d 3e 6f 6e 63 65 20 26 26  (cbData->once &&
1360: 20 63 62 44 61 74 61 2d 3e 7a 41 72 72 61 79 5b   cbData->zArray[
1370: 30 5d 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  0]) ){.    Tcl_S
1380: 65 74 56 61 72 32 28 63 62 44 61 74 61 2d 3e 69  etVar2(cbData->i
1390: 6e 74 65 72 70 2c 20 63 62 44 61 74 61 2d 3e 7a  nterp, cbData->z
13a0: 41 72 72 61 79 2c 20 22 2a 22 2c 20 22 22 2c 20  Array, "*", "", 
13b0: 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  0);.    for(i=0;
13c0: 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
13d0: 20 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 32       Tcl_SetVar2
13e0: 28 63 62 44 61 74 61 2d 3e 69 6e 74 65 72 70 2c  (cbData->interp,
13f0: 20 63 62 44 61 74 61 2d 3e 7a 41 72 72 61 79 2c   cbData->zArray,
1400: 20 22 2a 22 2c 20 61 7a 4e 5b 69 5d 2c 0a 20 20   "*", azN[i],.  
1410: 20 20 20 20 20 20 20 54 43 4c 5f 4c 49 53 54 5f         TCL_LIST_
1420: 45 4c 45 4d 45 4e 54 7c 54 43 4c 5f 41 50 50 45  ELEMENT|TCL_APPE
1430: 4e 44 5f 56 41 4c 55 45 29 3b 0a 20 20 20 20 7d  ND_VALUE);.    }
1440: 0a 20 20 20 20 63 62 44 61 74 61 2d 3e 6f 6e 63  .    cbData->onc
1450: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
1460: 20 61 7a 43 6f 6c 21 3d 30 20 29 7b 0a 20 20 20   azCol!=0 ){.   
1470: 20 69 66 28 20 63 62 44 61 74 61 2d 3e 7a 41 72   if( cbData->zAr
1480: 72 61 79 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  ray[0] ){.      
1490: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
14a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   i++){.        c
14b0: 68 61 72 20 2a 7a 20 3d 20 61 7a 43 6f 6c 5b 69  har *z = azCol[i
14c0: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ];.        if( z
14d0: 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20  ==0 ) z = "";.  
14e0: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72        Tcl_SetVar
14f0: 32 28 63 62 44 61 74 61 2d 3e 69 6e 74 65 72 70  2(cbData->interp
1500: 2c 20 63 62 44 61 74 61 2d 3e 7a 41 72 72 61 79  , cbData->zArray
1510: 2c 20 61 7a 4e 5b 69 5d 2c 20 7a 2c 20 30 29 3b  , azN[i], z, 0);
1520: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
1530: 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  se{.      for(i=
1540: 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
1550: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
1560: 20 3d 20 61 7a 43 6f 6c 5b 69 5d 3b 0a 20 20 20   = azCol[i];.   
1570: 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20       if( z==0 ) 
1580: 7a 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20  z = "";.        
1590: 54 63 6c 5f 53 65 74 56 61 72 28 63 62 44 61 74  Tcl_SetVar(cbDat
15a0: 61 2d 3e 69 6e 74 65 72 70 2c 20 61 7a 4e 5b 69  a->interp, azN[i
15b0: 5d 2c 20 7a 2c 20 30 29 3b 0a 20 20 20 20 20 20  ], z, 0);.      
15c0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 63  }.    }.  }.  rc
15d0: 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 28 63   = Tcl_EvalObj(c
15e0: 62 44 61 74 61 2d 3e 69 6e 74 65 72 70 2c 20 63  bData->interp, c
15f0: 62 44 61 74 61 2d 3e 70 43 6f 64 65 29 3b 0a 20  bData->pCode);. 
1600: 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e   if( rc==TCL_CON
1610: 54 49 4e 55 45 20 29 20 72 63 20 3d 20 54 43 4c  TINUE ) rc = TCL
1620: 5f 4f 4b 3b 0a 20 20 63 62 44 61 74 61 2d 3e 74  _OK;.  cbData->t
1630: 63 6c 5f 72 63 20 3d 20 72 63 3b 0a 20 20 72 65  cl_rc = rc;.  re
1640: 74 75 72 6e 20 72 63 21 3d 54 43 4c 5f 4f 4b 3b  turn rc!=TCL_OK;
1650: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1660: 20 54 68 69 73 20 69 73 20 61 6e 20 61 6c 74 65   This is an alte
1670: 72 6e 61 74 69 76 65 20 63 61 6c 6c 62 61 63 6b  rnative callback
1680: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 71 75   for database qu
1690: 65 72 69 65 73 2e 20 20 49 6e 73 74 65 61 64 0a  eries.  Instead.
16a0: 2a 2a 20 6f 66 20 69 6e 76 6f 6b 69 6e 67 20 61  ** of invoking a
16b0: 20 54 43 4c 20 73 63 72 69 70 74 20 74 6f 20 68   TCL script to h
16c0: 61 6e 64 6c 65 20 74 68 65 20 72 65 73 75 6c 74  andle the result
16d0: 2c 20 74 68 69 73 20 63 61 6c 6c 62 61 63 6b 20  , this callback 
16e0: 6a 75 73 74 0a 2a 2a 20 61 70 70 65 6e 64 73 20  just.** appends 
16f0: 65 61 63 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  each column of t
1700: 68 65 20 72 65 73 75 6c 74 20 74 6f 20 61 20 6c  he result to a l
1710: 69 73 74 2e 20 20 41 66 74 65 72 20 74 68 65 20  ist.  After the 
1720: 71 75 65 72 79 0a 2a 2a 20 69 73 20 63 6f 6d 70  query.** is comp
1730: 6c 65 74 65 2c 20 74 68 65 20 6c 69 73 74 20 69  lete, the list i
1740: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
1750: 74 61 74 69 63 20 69 6e 74 20 44 62 45 76 61 6c  tatic int DbEval
1760: 43 61 6c 6c 62 61 63 6b 32 28 0a 20 20 76 6f 69  Callback2(.  voi
1770: 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 20 20  d *clientData,  
1780: 20 20 20 20 2f 2a 20 41 6e 20 69 6e 73 74 61 6e      /* An instan
1790: 63 65 20 6f 66 20 43 61 6c 6c 62 61 63 6b 44 61  ce of CallbackDa
17a0: 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c  ta */.  int nCol
17b0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
17c0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  * Number of colu
17d0: 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mns in the resul
17e0: 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 20 61  t */.  char ** a
17f0: 7a 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a  zCol,         /*
1800: 20 44 61 74 61 20 66 6f 72 20 65 61 63 68 20 63   Data for each c
1810: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20  olumn */.  char 
1820: 2a 2a 20 61 7a 4e 20 20 20 20 20 20 20 20 20 20  ** azN          
1830: 20 20 2f 2a 20 4e 61 6d 65 20 66 6f 72 20 65 61    /* Name for ea
1840: 63 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a  ch column */.){.
1850: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4c 69 73 74    Tcl_Obj *pList
1860: 20 3d 20 28 54 63 6c 5f 4f 62 6a 2a 29 63 6c 69   = (Tcl_Obj*)cli
1870: 65 6e 74 44 61 74 61 3b 0a 20 20 69 6e 74 20 69  entData;.  int i
1880: 3b 0a 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30  ;.  if( azCol==0
1890: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66   ) return 0;.  f
18a0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
18b0: 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  i++){.    Tcl_Ob
18c0: 6a 20 2a 70 45 6c 65 6d 3b 0a 20 20 20 20 69 66  j *pElem;.    if
18d0: 28 20 61 7a 43 6f 6c 5b 69 5d 20 26 26 20 2a 61  ( azCol[i] && *a
18e0: 7a 43 6f 6c 5b 69 5d 20 29 7b 0a 23 69 66 64 65  zCol[i] ){.#ifde
18f0: 66 20 55 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f  f UTF_TRANSLATIO
1900: 4e 5f 4e 45 45 44 45 44 0a 20 20 20 20 20 20 54  N_NEEDED.      T
1910: 63 6c 5f 44 53 74 72 69 6e 67 20 64 43 6f 6c 3b  cl_DString dCol;
1920: 0a 20 20 20 20 20 20 54 63 6c 5f 44 53 74 72 69  .      Tcl_DStri
1930: 6e 67 49 6e 69 74 28 26 64 43 6f 6c 29 3b 0a 20  ngInit(&dCol);. 
1940: 20 20 20 20 20 54 63 6c 5f 45 78 74 65 72 6e 61       Tcl_Externa
1950: 6c 54 6f 55 74 66 44 53 74 72 69 6e 67 28 4e 55  lToUtfDString(NU
1960: 4c 4c 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 2d 31  LL, azCol[i], -1
1970: 2c 20 26 64 43 6f 6c 29 3b 0a 20 20 20 20 20 20  , &dCol);.      
1980: 70 45 6c 65 6d 20 3d 20 54 63 6c 5f 4e 65 77 53  pElem = Tcl_NewS
1990: 74 72 69 6e 67 4f 62 6a 28 54 63 6c 5f 44 53 74  tringObj(Tcl_DSt
19a0: 72 69 6e 67 56 61 6c 75 65 28 26 64 43 6f 6c 29  ringValue(&dCol)
19b0: 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 54 63 6c  , -1);.      Tcl
19c0: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 64 43  _DStringFree(&dC
19d0: 6f 6c 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  ol);.#else.     
19e0: 20 70 45 6c 65 6d 20 3d 20 54 63 6c 5f 4e 65 77   pElem = Tcl_New
19f0: 53 74 72 69 6e 67 4f 62 6a 28 61 7a 43 6f 6c 5b  StringObj(azCol[
1a00: 69 5d 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a  i], -1);.#endif.
1a10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a20: 20 70 45 6c 65 6d 20 3d 20 54 63 6c 5f 4e 65 77   pElem = Tcl_New
1a30: 4f 62 6a 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Obj();.    }.   
1a40: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
1a50: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 4c 69  ndElement(0, pLi
1a60: 73 74 2c 20 70 45 6c 65 6d 29 3b 0a 20 20 7d 0a  st, pElem);.  }.
1a70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1a80: 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 77 68 65 6e  *.** Called when
1a90: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 69 73 20   the command is 
1aa0: 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  deleted..*/.stat
1ab0: 69 63 20 76 6f 69 64 20 44 62 44 65 6c 65 74 65  ic void DbDelete
1ac0: 43 6d 64 28 76 6f 69 64 20 2a 64 62 29 7b 0a 20  Cmd(void *db){. 
1ad0: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
1ae0: 20 28 53 71 6c 69 74 65 44 62 2a 29 64 62 3b 0a   (SqliteDb*)db;.
1af0: 20 20 73 71 6c 69 74 65 5f 63 6c 6f 73 65 28 70    sqlite_close(p
1b00: 44 62 2d 3e 64 62 29 3b 0a 20 20 69 66 28 20 70  Db->db);.  if( p
1b10: 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20  Db->zBusy ){.   
1b20: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
1b30: 42 75 73 79 29 3b 0a 20 20 7d 0a 20 20 54 63 6c  Busy);.  }.  Tcl
1b40: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 44 62  _Free((char*)pDb
1b50: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
1b60: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1b70: 65 64 20 77 68 65 6e 20 61 20 64 61 74 61 62 61  ed when a databa
1b80: 73 65 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65  se file is locke
1b90: 64 20 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a  d while trying.*
1ba0: 2a 20 74 6f 20 65 78 65 63 75 74 65 20 53 51 4c  * to execute SQL
1bb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1bc0: 44 62 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f  DbBusyHandler(vo
1bd0: 69 64 20 2a 63 64 2c 20 63 6f 6e 73 74 20 63 68  id *cd, const ch
1be0: 61 72 20 2a 7a 54 61 62 6c 65 2c 20 69 6e 74 20  ar *zTable, int 
1bf0: 6e 54 72 69 65 73 29 7b 0a 20 20 53 71 6c 69 74  nTries){.  Sqlit
1c00: 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69  eDb *pDb = (Sqli
1c10: 74 65 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20  teDb*)cd;.  int 
1c20: 72 63 3b 0a 20 20 63 68 61 72 20 7a 56 61 6c 5b  rc;.  char zVal[
1c30: 33 30 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6d  30];.  char *zCm
1c40: 64 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  d;.  Tcl_DString
1c50: 20 63 6d 64 3b 0a 0a 20 20 54 63 6c 5f 44 53 74   cmd;..  Tcl_DSt
1c60: 72 69 6e 67 49 6e 69 74 28 26 63 6d 64 29 3b 0a  ringInit(&cmd);.
1c70: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70    Tcl_DStringApp
1c80: 65 6e 64 28 26 63 6d 64 2c 20 70 44 62 2d 3e 7a  end(&cmd, pDb->z
1c90: 42 75 73 79 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  Busy, -1);.  Tcl
1ca0: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
1cb0: 65 6d 65 6e 74 28 26 63 6d 64 2c 20 7a 54 61 62  ement(&cmd, zTab
1cc0: 6c 65 29 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a  le);.  sprintf(z
1cd0: 56 61 6c 2c 20 22 20 25 64 22 2c 20 6e 54 72 69  Val, " %d", nTri
1ce0: 65 73 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  es);.  Tcl_DStri
1cf0: 6e 67 41 70 70 65 6e 64 28 26 63 6d 64 2c 20 7a  ngAppend(&cmd, z
1d00: 56 61 6c 2c 20 2d 31 29 3b 0a 20 20 7a 43 6d 64  Val, -1);.  zCmd
1d10: 20 3d 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61   = Tcl_DStringVa
1d20: 6c 75 65 28 26 63 6d 64 29 3b 0a 20 20 72 63 20  lue(&cmd);.  rc 
1d30: 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e  = Tcl_Eval(pDb->
1d40: 69 6e 74 65 72 70 2c 20 7a 43 6d 64 29 3b 0a 20  interp, zCmd);. 
1d50: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
1d60: 28 26 63 6d 64 29 3b 0a 20 20 69 66 28 20 72 63  (&cmd);.  if( rc
1d70: 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69  !=TCL_OK || atoi
1d80: 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65  (Tcl_GetStringRe
1d90: 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70  sult(pDb->interp
1da0: 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
1db0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
1dc0: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   1;.}../*.** The
1dd0: 20 22 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e   "sqlite" comman
1de0: 64 20 62 65 6c 6f 77 20 63 72 65 61 74 65 73 20  d below creates 
1df0: 61 20 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e  a new Tcl comman
1e00: 64 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f  d for each.** co
1e10: 6e 6e 65 63 74 69 6f 6e 20 69 74 20 6f 70 65 6e  nnection it open
1e20: 73 20 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 64  s to an SQLite d
1e30: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72  atabase.  This r
1e40: 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65  outine is invoke
1e50: 64 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20 6f 6e  d.** whenever on
1e60: 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65  e of those conne
1e70: 63 74 69 6f 6e 2d 73 70 65 63 69 66 69 63 20 63  ction-specific c
1e80: 6f 6d 6d 61 6e 64 73 20 69 73 20 65 78 65 63 75  ommands is execu
1e90: 74 65 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e 20 20  ted.** in Tcl.  
1ea0: 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
1eb0: 79 6f 75 20 72 75 6e 20 54 63 6c 20 63 6f 64 65  you run Tcl code
1ec0: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
1ed0: 2a 20 20 20 20 20 20 20 73 71 6c 69 74 65 20 64  *       sqlite d
1ee0: 62 31 20 20 22 6d 79 5f 64 61 74 61 62 61 73 65  b1  "my_database
1ef0: 22 0a 2a 2a 20 20 20 20 20 20 20 64 62 31 20 63  ".**       db1 c
1f00: 6c 6f 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  lose.**.** The f
1f10: 69 72 73 74 20 63 6f 6d 6d 61 6e 64 20 6f 70 65  irst command ope
1f20: 6e 73 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ns a connection 
1f30: 74 6f 20 74 68 65 20 22 6d 79 5f 64 61 74 61 62  to the "my_datab
1f40: 61 73 65 22 20 64 61 74 61 62 61 73 65 0a 2a 2a  ase" database.**
1f50: 20 61 6e 64 20 63 61 6c 6c 73 20 74 68 61 74 20   and calls that 
1f60: 63 6f 6e 6e 65 63 74 69 6f 6e 20 22 64 62 31 22  connection "db1"
1f70: 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 63 6f  .  The second co
1f80: 6d 6d 61 6e 64 20 63 61 75 73 65 73 20 74 68 69  mmand causes thi
1f90: 73 0a 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 20  s.** subroutine 
1fa0: 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 2e 0a 2a  to be invoked..*
1fb0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 4f  /.static int DbO
1fc0: 62 6a 43 6d 64 28 76 6f 69 64 20 2a 63 64 2c 20  bjCmd(void *cd, 
1fd0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1fe0: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63 6c  rp, int objc,Tcl
1ff0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76  _Obj *const*objv
2000: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
2010: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
2020: 63 64 3b 0a 20 20 69 6e 74 20 63 68 6f 69 63 65  cd;.  int choice
2030: 3b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  ;.  static char 
2040: 2a 44 42 5f 6f 70 74 53 74 72 73 5b 5d 20 3d 20  *DB_optStrs[] = 
2050: 7b 0a 20 20 20 20 20 22 62 75 73 79 22 2c 20 20  {.     "busy",  
2060: 20 22 63 6c 6f 73 65 22 2c 20 20 22 63 6f 6d 70   "close",  "comp
2070: 6c 65 74 65 22 2c 20 20 22 65 76 61 6c 22 2c 20  lete",  "eval", 
2080: 20 22 74 69 6d 65 6f 75 74 22 2c 20 30 0a 20 20   "timeout", 0.  
2090: 7d 3b 0a 20 20 65 6e 75 6d 20 44 42 5f 6f 70 74  };.  enum DB_opt
20a0: 73 20 7b 0a 20 20 20 20 20 44 42 5f 42 55 53 59  s {.     DB_BUSY
20b0: 2c 20 20 44 42 5f 43 4c 4f 53 45 2c 20 44 42 5f  ,  DB_CLOSE, DB_
20c0: 43 4f 4d 50 4c 45 54 45 2c 20 44 42 5f 45 56 41  COMPLETE, DB_EVA
20d0: 4c 2c 20 44 42 5f 54 49 4d 45 4f 55 54 0a 20 20  L, DB_TIMEOUT.  
20e0: 7d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32  };..  if( objc<2
20f0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
2100: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
2110: 20 31 2c 20 6f 62 6a 76 2c 20 22 53 55 42 43 4f   1, objv, "SUBCO
2120: 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20  MMAND ...");.   
2130: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2140: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c  R;.  }.  if( Tcl
2150: 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a  _GetIndexFromObj
2160: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
2170: 2c 20 44 42 5f 6f 70 74 53 74 72 73 2c 20 22 6f  , DB_optStrs, "o
2180: 70 74 69 6f 6e 22 2c 20 30 2c 20 26 63 68 6f 69  ption", 0, &choi
2190: 63 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ce) ){.    retur
21a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
21b0: 0a 0a 20 20 73 77 69 74 63 68 28 20 28 65 6e 75  ..  switch( (enu
21c0: 6d 20 44 42 5f 6f 70 74 73 29 63 68 6f 69 63 65  m DB_opts)choice
21d0: 20 29 7b 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62   ){..  /*    $db
21e0: 20 62 75 73 79 20 3f 43 41 4c 4c 42 41 43 4b 3f   busy ?CALLBACK?
21f0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b  .  **.  ** Invok
2200: 65 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c  e the given call
2210: 62 61 63 6b 20 69 66 20 61 6e 20 53 51 4c 20 73  back if an SQL s
2220: 74 61 74 65 6d 65 6e 74 20 61 74 74 65 6d 70 74  tatement attempt
2230: 73 20 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61  s to open.  ** a
2240: 20 6c 6f 63 6b 65 64 20 64 61 74 61 62 61 73 65   locked database
2250: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 63 61   file..  */.  ca
2260: 73 65 20 44 42 5f 42 55 53 59 3a 20 7b 0a 20 20  se DB_BUSY: {.  
2270: 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a    if( objc>3 ){.
2280: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
2290: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
22a0: 2c 20 6f 62 6a 76 2c 20 22 43 41 4c 4c 42 41 43  , objv, "CALLBAC
22b0: 4b 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  K");.      retur
22c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
22d0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d   }else if( objc=
22e0: 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =2 ){.      if( 
22f0: 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20  pDb->zBusy ){.  
2300: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
2310: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
2320: 44 62 2d 3e 7a 42 75 73 79 2c 20 30 29 3b 0a 20  Db->zBusy, 0);. 
2330: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
2340: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42  {.      char *zB
2350: 75 73 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c  usy;.      int l
2360: 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  en;.      if( pD
2370: 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20  b->zBusy ){.    
2380: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
2390: 2d 3e 7a 42 75 73 79 29 3b 0a 20 20 20 20 20 20  ->zBusy);.      
23a0: 7d 0a 20 20 20 20 20 20 7a 42 75 73 79 20 3d 20  }.      zBusy = 
23b0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
23c0: 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c  mObj(objv[2], &l
23d0: 65 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  en);.      if( z
23e0: 42 75 73 79 20 26 26 20 6c 65 6e 3e 30 20 29 7b  Busy && len>0 ){
23f0: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 42  .        pDb->zB
2400: 75 73 79 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28  usy = Tcl_Alloc(
2410: 20 6c 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20   len + 1 );.    
2420: 20 20 20 20 73 74 72 63 70 79 28 70 44 62 2d 3e      strcpy(pDb->
2430: 7a 42 75 73 79 2c 20 7a 42 75 73 79 29 3b 0a 20  zBusy, zBusy);. 
2440: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2450: 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d      pDb->zBusy =
2460: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
2470: 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79    if( pDb->zBusy
2480: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
2490: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
24a0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
24b0: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 70 44  _busy_handler(pD
24c0: 62 2d 3e 64 62 2c 20 44 62 42 75 73 79 48 61 6e  b->db, DbBusyHan
24d0: 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20  dler, pDb);.    
24e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
24f0: 20 73 71 6c 69 74 65 5f 62 75 73 79 5f 68 61 6e   sqlite_busy_han
2500: 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c  dler(pDb->db, 0,
2510: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
2520: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
2530: 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63  }..  /*    $db c
2540: 6c 6f 73 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53  lose.  **.  ** S
2550: 68 75 74 64 6f 77 6e 20 74 68 65 20 64 61 74 61  hutdown the data
2560: 62 61 73 65 0a 20 20 2a 2f 0a 20 20 63 61 73 65  base.  */.  case
2570: 20 44 42 5f 43 4c 4f 53 45 3a 20 7b 0a 20 20 20   DB_CLOSE: {.   
2580: 20 54 63 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d 61   Tcl_DeleteComma
2590: 6e 64 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  nd(interp, Tcl_G
25a0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
25b0: 6f 62 6a 76 5b 30 5d 2c 20 30 29 29 3b 0a 20 20  objv[0], 0));.  
25c0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
25d0: 2f 2a 20 20 20 20 24 64 62 20 63 6f 6d 70 6c 65  /*    $db comple
25e0: 74 65 20 53 51 4c 0a 20 20 2a 2a 0a 20 20 2a 2a  te SQL.  **.  **
25f0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
2600: 53 51 4c 20 69 73 20 61 20 63 6f 6d 70 6c 65 74  SQL is a complet
2610: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  e SQL statement.
2620: 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69    Return FALSE i
2630: 66 0a 20 20 2a 2a 20 61 64 64 69 74 69 6f 6e 61  f.  ** additiona
2640: 6c 20 6c 69 6e 65 73 20 6f 66 20 69 6e 70 75 74  l lines of input
2650: 20 61 72 65 20 6e 65 65 64 65 64 2e 20 20 54 68   are needed.  Th
2660: 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  is is similar to
2670: 20 74 68 65 0a 20 20 2a 2a 20 62 75 69 6c 74 2d   the.  ** built-
2680: 69 6e 20 22 69 6e 66 6f 20 63 6f 6d 70 6c 65 74  in "info complet
2690: 65 22 20 63 6f 6d 6d 61 6e 64 20 6f 66 20 54 63  e" command of Tc
26a0: 6c 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  l..  */.  case D
26b0: 42 5f 43 4f 4d 50 4c 45 54 45 3a 20 7b 0a 20 20  B_COMPLETE: {.  
26c0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
26d0: 6c 74 3b 0a 20 20 20 20 69 6e 74 20 69 73 43 6f  lt;.    int isCo
26e0: 6d 70 6c 65 74 65 3b 0a 20 20 20 20 69 66 28 20  mplete;.    if( 
26f0: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
2700: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
2710: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
2720: 76 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20 20 20  v, "SQL");.     
2730: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2740: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 73 43  R;.    }.    isC
2750: 6f 6d 70 6c 65 74 65 20 3d 20 73 71 6c 69 74 65  omplete = sqlite
2760: 5f 63 6f 6d 70 6c 65 74 65 28 20 54 63 6c 5f 47  _complete( Tcl_G
2770: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
2780: 6f 62 6a 76 5b 32 5d 2c 20 30 29 20 29 3b 0a 20  objv[2], 0) );. 
2790: 20 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c     pResult = Tcl
27a0: 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _GetObjResult(in
27b0: 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53  terp);.    Tcl_S
27c0: 65 74 42 6f 6f 6c 65 61 6e 4f 62 6a 28 70 52 65  etBooleanObj(pRe
27d0: 73 75 6c 74 2c 20 69 73 43 6f 6d 70 6c 65 74 65  sult, isComplete
27e0: 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  );.    break;.  
27f0: 7d 0a 20 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20  }.   .  /*.  ** 
2800: 20 20 20 24 64 62 20 65 76 61 6c 20 24 73 71 6c     $db eval $sql
2810: 20 3f 61 72 72 61 79 20 7b 20 20 2e 2e 2e 63 6f   ?array {  ...co
2820: 64 65 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 0a 20 20  de... }?.  **.  
2830: 2a 2a 20 54 68 65 20 53 51 4c 20 73 74 61 74 65  ** The SQL state
2840: 6d 65 6e 74 20 69 6e 20 24 73 71 6c 20 69 73 20  ment in $sql is 
2850: 65 76 61 6c 75 61 74 65 64 2e 20 20 46 6f 72 20  evaluated.  For 
2860: 65 61 63 68 20 72 6f 77 2c 20 74 68 65 20 76 61  each row, the va
2870: 6c 75 65 73 20 61 72 65 0a 20 20 2a 2a 20 70 6c  lues are.  ** pl
2880: 61 63 65 64 20 69 6e 20 65 6c 65 6d 65 6e 74 73  aced in elements
2890: 20 6f 66 20 74 68 65 20 61 72 72 61 79 20 6e 61   of the array na
28a0: 6d 65 64 20 22 61 72 72 61 79 22 20 61 6e 64 20  med "array" and 
28b0: 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 69 73 20 65 78  ...code... is ex
28c0: 65 63 75 74 65 64 2e 0a 20 20 2a 2a 20 49 66 20  ecuted..  ** If 
28d0: 22 61 72 72 61 79 22 20 61 6e 64 20 22 63 6f 64  "array" and "cod
28e0: 65 22 20 61 72 65 20 6f 6d 69 74 74 65 64 2c 20  e" are omitted, 
28f0: 74 68 65 6e 20 6e 6f 20 63 61 6c 6c 62 61 63 6b  then no callback
2900: 20 69 73 20 65 76 65 72 79 20 69 6e 76 6f 6b 65   is every invoke
2910: 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61  d..  ** If "arra
2920: 79 22 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73  y" is an empty s
2930: 74 72 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20  tring, then the 
2940: 76 61 6c 75 65 73 20 61 72 65 20 70 6c 61 63 65  values are place
2950: 64 20 69 6e 20 76 61 72 69 61 62 6c 65 73 0a 20  d in variables. 
2960: 20 2a 2a 20 74 68 61 74 20 68 61 76 65 20 74 68   ** that have th
2970: 65 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74  e same name as t
2980: 68 65 20 66 69 65 6c 64 73 20 65 78 74 72 61 63  he fields extrac
2990: 74 65 64 20 62 79 20 74 68 65 20 71 75 65 72 79  ted by the query
29a0: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
29b0: 5f 45 56 41 4c 3a 20 7b 0a 20 20 20 20 43 61 6c  _EVAL: {.    Cal
29c0: 6c 62 61 63 6b 44 61 74 61 20 63 62 44 61 74 61  lbackData cbData
29d0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72  ;.    char *zErr
29e0: 4d 73 67 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  Msg;.    char *z
29f0: 53 71 6c 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b  Sql;.    int rc;
2a00: 0a 23 69 66 64 65 66 20 55 54 46 5f 54 52 41 4e  .#ifdef UTF_TRAN
2a10: 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 0a 20  SLATION_NEEDED. 
2a20: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64     Tcl_DString d
2a30: 53 71 6c 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  Sql;.    int i;.
2a40: 23 65 6e 64 69 66 0a 0a 20 20 20 20 69 66 28 20  #endif..    if( 
2a50: 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21  objc!=5 && objc!
2a60: 3d 33 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =3 ){.      Tcl_
2a70: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
2a80: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53  erp, 2, objv, "S
2a90: 51 4c 20 3f 41 52 52 41 59 2d 4e 41 4d 45 20 43  QL ?ARRAY-NAME C
2aa0: 4f 44 45 3f 22 29 3b 0a 20 20 20 20 20 20 72 65  ODE?");.      re
2ab0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2ac0: 20 20 20 20 7d 0a 20 20 20 20 70 44 62 2d 3e 69      }.    pDb->i
2ad0: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
2ae0: 20 20 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47      zSql = Tcl_G
2af0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
2b00: 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 23 69 66  objv[2], 0);.#if
2b10: 64 65 66 20 55 54 46 5f 54 52 41 4e 53 4c 41 54  def UTF_TRANSLAT
2b20: 49 4f 4e 5f 4e 45 45 44 45 44 0a 20 20 20 20 54  ION_NEEDED.    T
2b30: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
2b40: 64 53 71 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 55  dSql);.    Tcl_U
2b50: 74 66 54 6f 45 78 74 65 72 6e 61 6c 44 53 74 72  tfToExternalDStr
2b60: 69 6e 67 28 4e 55 4c 4c 2c 20 7a 53 71 6c 2c 20  ing(NULL, zSql, 
2b70: 2d 31 2c 20 26 64 53 71 6c 29 3b 0a 20 20 20 20  -1, &dSql);.    
2b80: 7a 53 71 6c 20 3d 20 54 63 6c 5f 44 53 74 72 69  zSql = Tcl_DStri
2b90: 6e 67 56 61 6c 75 65 28 26 64 53 71 6c 29 3b 0a  ngValue(&dSql);.
2ba0: 23 65 6e 64 69 66 0a 20 20 20 20 54 63 6c 5f 49  #endif.    Tcl_I
2bb0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76  ncrRefCount(objv
2bc0: 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28 20 6f 62  [2]);.    if( ob
2bd0: 6a 63 3d 3d 35 20 29 7b 0a 20 20 20 20 20 20 63  jc==5 ){.      c
2be0: 62 44 61 74 61 2e 69 6e 74 65 72 70 20 3d 20 69  bData.interp = i
2bf0: 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 63 62 44  nterp;.      cbD
2c00: 61 74 61 2e 6f 6e 63 65 20 3d 20 31 3b 0a 20 20  ata.once = 1;.  
2c10: 20 20 20 20 63 62 44 61 74 61 2e 7a 41 72 72 61      cbData.zArra
2c20: 79 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  y = Tcl_GetStrin
2c30: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d  gFromObj(objv[3]
2c40: 2c 20 30 29 3b 0a 20 20 20 20 20 20 63 62 44 61  , 0);.      cbDa
2c50: 74 61 2e 70 43 6f 64 65 20 3d 20 6f 62 6a 76 5b  ta.pCode = objv[
2c60: 34 5d 3b 0a 20 20 20 20 20 20 63 62 44 61 74 61  4];.      cbData
2c70: 2e 74 63 6c 5f 72 63 20 3d 20 54 43 4c 5f 4f 4b  .tcl_rc = TCL_OK
2c80: 3b 0a 20 20 20 20 20 20 63 62 44 61 74 61 2e 6e  ;.      cbData.n
2c90: 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20  ColName = 0;.   
2ca0: 20 20 20 63 62 44 61 74 61 2e 61 7a 43 6f 6c 4e     cbData.azColN
2cb0: 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a  ame = 0;.      z
2cc0: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20  ErrMsg = 0;.    
2cd0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
2ce0: 6e 74 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20  nt(objv[3]);.   
2cf0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
2d00: 75 6e 74 28 6f 62 6a 76 5b 34 5d 29 3b 0a 20 20  unt(objv[4]);.  
2d10: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 5f      rc = sqlite_
2d20: 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 53  exec(pDb->db, zS
2d30: 71 6c 2c 20 44 62 45 76 61 6c 43 61 6c 6c 62 61  ql, DbEvalCallba
2d40: 63 6b 2c 20 26 63 62 44 61 74 61 2c 20 26 7a 45  ck, &cbData, &zE
2d50: 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 54 63  rrMsg);.      Tc
2d60: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 6f  l_DecrRefCount(o
2d70: 62 6a 76 5b 34 5d 29 3b 0a 20 20 20 20 20 20 54  bjv[4]);.      T
2d80: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
2d90: 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 20 20  objv[3]);.      
2da0: 69 66 28 20 63 62 44 61 74 61 2e 74 63 6c 5f 72  if( cbData.tcl_r
2db0: 63 3d 3d 54 43 4c 5f 42 52 45 41 4b 20 29 7b 20  c==TCL_BREAK ){ 
2dc0: 63 62 44 61 74 61 2e 74 63 6c 5f 72 63 20 3d 20  cbData.tcl_rc = 
2dd0: 54 43 4c 5f 4f 4b 3b 20 7d 0a 20 20 20 20 7d 65  TCL_OK; }.    }e
2de0: 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f 4f  lse{.      Tcl_O
2df0: 62 6a 20 2a 70 4c 69 73 74 20 3d 20 54 63 6c 5f  bj *pList = Tcl_
2e00: 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 20 20  NewObj();.      
2e10: 63 62 44 61 74 61 2e 74 63 6c 5f 72 63 20 3d 20  cbData.tcl_rc = 
2e20: 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 20 20 72 63  TCL_OK;.      rc
2e30: 20 3d 20 73 71 6c 69 74 65 5f 65 78 65 63 28 70   = sqlite_exec(p
2e40: 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 44 62  Db->db, zSql, Db
2e50: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 32 2c 20 70  EvalCallback2, p
2e60: 4c 69 73 74 2c 20 26 7a 45 72 72 4d 73 67 29 3b  List, &zErrMsg);
2e70: 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  .      Tcl_SetOb
2e80: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
2e90: 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pList);.    }.  
2ea0: 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b    if( zErrMsg ){
2eb0: 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65  .      Tcl_SetRe
2ec0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72  sult(interp, zEr
2ed0: 72 4d 73 67 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  rMsg, TCL_VOLATI
2ee0: 4c 45 29 3b 0a 20 20 20 20 20 20 66 72 65 65 28  LE);.      free(
2ef0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
2f00: 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
2f10: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
2f20: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
2f30: 63 21 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54 20  c!=SQLITE_ABORT 
2f40: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
2f50: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2f60: 2c 20 73 71 6c 69 74 65 5f 65 72 72 6f 72 5f 73  , sqlite_error_s
2f70: 74 72 69 6e 67 28 72 63 29 2c 20 30 29 3b 0a 20  tring(rc), 0);. 
2f80: 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45 52       rc = TCL_ER
2f90: 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ROR;.    }else{.
2fa0: 20 20 20 20 20 20 72 63 20 3d 20 63 62 44 61 74        rc = cbDat
2fb0: 61 2e 74 63 6c 5f 72 63 3b 0a 20 20 20 20 7d 0a  a.tcl_rc;.    }.
2fc0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
2fd0: 6f 75 6e 74 28 6f 62 6a 76 5b 32 5d 29 3b 0a 23  ount(objv[2]);.#
2fe0: 69 66 64 65 66 20 55 54 46 5f 54 52 41 4e 53 4c  ifdef UTF_TRANSL
2ff0: 41 54 49 4f 4e 5f 4e 45 45 44 45 44 0a 20 20 20  ATION_NEEDED.   
3000: 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65   Tcl_DStringFree
3010: 28 26 64 53 71 6c 29 3b 0a 20 20 20 20 69 66 28  (&dSql);.    if(
3020: 20 6f 62 6a 63 3d 3d 35 20 26 26 20 63 62 44 61   objc==5 && cbDa
3030: 74 61 2e 61 7a 43 6f 6c 4e 61 6d 65 20 29 7b 0a  ta.azColName ){.
3040: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
3050: 3c 63 62 44 61 74 61 2e 6e 43 6f 6c 4e 61 6d 65  <cbData.nColName
3060: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
3070: 69 66 28 20 63 62 44 61 74 61 2e 61 7a 43 6f 6c  if( cbData.azCol
3080: 4e 61 6d 65 5b 69 5d 20 29 20 66 72 65 65 28 63  Name[i] ) free(c
3090: 62 44 61 74 61 2e 61 7a 43 6f 6c 4e 61 6d 65 5b  bData.azColName[
30a0: 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i]);.      }.   
30b0: 20 20 20 66 72 65 65 28 63 62 44 61 74 61 2e 61     free(cbData.a
30c0: 7a 43 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  zColName);.    }
30d0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
30e0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
30f0: 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 74 69  .  **     $db ti
3100: 6d 65 6f 75 74 20 4d 49 4c 4c 45 53 45 43 4f 4e  meout MILLESECON
3110: 44 53 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 65 6c  DS.  **.  ** Del
3120: 61 79 20 66 6f 72 20 74 68 65 20 6e 75 6d 62 65  ay for the numbe
3130: 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r of millisecond
3140: 73 20 73 70 65 63 69 66 69 65 64 20 77 68 65 6e  s specified when
3150: 20 61 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65   a file is locke
3160: 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  d..  */.  case D
3170: 42 5f 54 49 4d 45 4f 55 54 3a 20 7b 0a 20 20 20  B_TIMEOUT: {.   
3180: 20 69 6e 74 20 6d 73 3b 0a 20 20 20 20 69 66 28   int ms;.    if(
3190: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
31a0: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
31b0: 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
31c0: 6a 76 2c 20 22 4d 49 4c 4c 49 53 45 43 4f 4e 44  jv, "MILLISECOND
31d0: 53 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  S");.      retur
31e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
31f0: 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47   }.    if( Tcl_G
3200: 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
3210: 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6d  erp, objv[2], &m
3220: 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  s) ) return TCL_
3230: 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
3240: 65 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 70  e_busy_timeout(p
3250: 44 62 2d 3e 64 62 2c 20 6d 73 29 3b 0a 20 20 20  Db->db, ms);.   
3260: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 7d 20   break;.  }.  } 
3270: 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 53 57  /* End of the SW
3280: 49 54 43 48 20 73 74 61 74 65 6d 65 6e 74 20 2a  ITCH statement *
3290: 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  /.  return TCL_O
32a0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 73 71  K;.}../*.**   sq
32b0: 6c 69 74 65 20 44 42 4e 41 4d 45 20 46 49 4c 45  lite DBNAME FILE
32c0: 4e 41 4d 45 20 3f 4d 4f 44 45 3f 0a 2a 2a 0a 2a  NAME ?MODE?.**.*
32d0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 6d 61  * This is the ma
32e0: 69 6e 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20  in Tcl command. 
32f0: 20 57 68 65 6e 20 74 68 65 20 22 73 71 6c 69 74   When the "sqlit
3300: 65 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 69  e" Tcl command i
3310: 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2c 20 74 68  s.** invoked, th
3320: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
3330: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  to process that 
3340: 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54  command..**.** T
3350: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
3360: 74 2c 20 44 42 4e 41 4d 45 2c 20 69 73 20 61 6e  t, DBNAME, is an
3370: 20 61 72 62 69 74 72 61 72 79 20 6e 61 6d 65 20   arbitrary name 
3380: 66 6f 72 20 61 20 6e 65 77 0a 2a 2a 20 64 61 74  for a new.** dat
3390: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
33a0: 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20  .  This command 
33b0: 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 63 6f  creates a new co
33c0: 6d 6d 61 6e 64 20 6e 61 6d 65 64 0a 2a 2a 20 44  mmand named.** D
33d0: 42 4e 41 4d 45 20 74 68 61 74 20 69 73 20 75 73  BNAME that is us
33e0: 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68  ed to control th
33f0: 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20  at connection.  
3400: 54 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  The database.** 
3410: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 64 65  connection is de
3420: 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 44  leted when the D
3430: 42 4e 41 4d 45 20 63 6f 6d 6d 61 6e 64 20 69 73  BNAME command is
3440: 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   deleted..**.** 
3450: 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
3460: 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ent is the name 
3470: 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  of the directory
3480: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a   that contains.*
3490: 2a 20 74 68 65 20 73 71 6c 69 74 65 20 64 61 74  * the sqlite dat
34a0: 61 62 61 73 65 20 74 68 61 74 20 69 73 20 74 6f  abase that is to
34b0: 20 62 65 20 61 63 63 65 73 73 65 64 2e 0a 2a 2a   be accessed..**
34c0: 0a 2a 2a 20 46 6f 72 20 74 65 73 74 69 6e 67 20  .** For testing 
34d0: 70 75 72 70 6f 73 65 73 2c 20 77 65 20 61 6c 73  purposes, we als
34e0: 6f 20 73 75 70 70 6f 72 74 20 74 68 65 20 66 6f  o support the fo
34f0: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
3500: 73 71 6c 69 74 65 20 2d 65 6e 63 6f 64 69 6e 67  sqlite -encoding
3510: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 52 65 74  .**.**       Ret
3520: 75 72 6e 20 74 68 65 20 65 6e 63 6f 64 69 6e 67  urn the encoding
3530: 20 75 73 65 64 20 62 79 20 4c 49 4b 45 20 61 6e   used by LIKE an
3540: 64 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 73  d GLOB operators
3550: 2e 20 20 43 68 6f 69 63 65 73 0a 2a 2a 20 20 20  .  Choices.**   
3560: 20 20 20 20 61 72 65 20 55 54 46 2d 38 20 61 6e      are UTF-8 an
3570: 64 20 69 73 6f 38 38 35 39 2e 0a 2a 2a 0a 2a 2a  d iso8859..**.**
3580: 20 20 73 71 6c 69 74 65 20 2d 74 63 6c 2d 75 73    sqlite -tcl-us
3590: 65 73 2d 75 74 66 0a 2a 2a 0a 2a 2a 20 20 20 20  es-utf.**.**    
35a0: 20 20 20 52 65 74 75 72 6e 20 22 31 22 20 69 66     Return "1" if
35b0: 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 61   compiled with a
35c0: 20 54 63 6c 20 75 73 65 73 20 55 54 46 2d 38 2e   Tcl uses UTF-8.
35d0: 20 20 52 65 74 75 72 6e 20 22 30 22 20 69 66 0a    Return "0" if.
35e0: 2a 2a 20 20 20 20 20 20 20 6e 6f 74 2e 20 20 55  **       not.  U
35f0: 73 65 64 20 62 79 20 74 65 73 74 73 20 74 6f 20  sed by tests to 
3600: 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 69  make sure the li
3610: 62 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69 6c  brary was compil
3620: 65 64 20 0a 2a 2a 20 20 20 20 20 20 20 63 6f 72  ed .**       cor
3630: 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  rectly..*/.stati
3640: 63 20 69 6e 74 20 44 62 4d 61 69 6e 28 76 6f 69  c int DbMain(voi
3650: 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72  d *cd, Tcl_Inter
3660: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 61  p *interp, int a
3670: 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76  rgc, char **argv
3680: 29 7b 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20  ){.  int mode;. 
3690: 20 53 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20   SqliteDb *p;.  
36a0: 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 0a 20  char *zErrMsg;. 
36b0: 20 69 66 28 20 61 72 67 63 3d 3d 32 20 29 7b 0a   if( argc==2 ){.
36c0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
36d0: 72 67 76 5b 31 5d 2c 22 2d 65 6e 63 6f 64 69 6e  rgv[1],"-encodin
36e0: 67 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  g")==0 ){.      
36f0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
3700: 28 69 6e 74 65 72 70 2c 73 71 6c 69 74 65 5f 65  (interp,sqlite_e
3710: 6e 63 6f 64 69 6e 67 2c 30 29 3b 0a 20 20 20 20  ncoding,0);.    
3720: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
3730: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
3740: 74 72 63 6d 70 28 61 72 67 76 5b 31 5d 2c 22 2d  trcmp(argv[1],"-
3750: 74 63 6c 2d 75 73 65 73 2d 75 74 66 22 29 3d 3d  tcl-uses-utf")==
3760: 30 20 29 7b 0a 23 69 66 64 65 66 20 54 43 4c 5f  0 ){.#ifdef TCL_
3770: 55 54 46 5f 4d 41 58 0a 20 20 20 20 20 20 54 63  UTF_MAX.      Tc
3780: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
3790: 6e 74 65 72 70 2c 22 31 22 2c 30 29 3b 0a 23 65  nterp,"1",0);.#e
37a0: 6c 73 65 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  lse.      Tcl_Ap
37b0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
37c0: 70 2c 22 30 22 2c 30 29 3b 0a 23 65 6e 64 69 66  p,"0",0);.#endif
37d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
37e0: 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  L_OK;.    }.  }.
37f0: 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 26 26    if( argc!=3 &&
3800: 20 61 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20   argc!=4 ){.    
3810: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
3820: 28 69 6e 74 65 72 70 2c 22 77 72 6f 6e 67 20 23  (interp,"wrong #
3830: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
3840: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
3850: 20 20 20 20 20 20 22 20 48 41 4e 44 4c 45 20 46        " HANDLE F
3860: 49 4c 45 4e 41 4d 45 20 3f 4d 4f 44 45 3f 5c 22  ILENAME ?MODE?\"
3870: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
3880: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
3890: 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 33 20 29  .  if( argc==3 )
38a0: 7b 0a 20 20 20 20 6d 6f 64 65 20 3d 20 30 36 36  {.    mode = 066
38b0: 36 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 54  6;.  }else if( T
38c0: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
38d0: 2c 20 61 72 67 76 5b 33 5d 2c 20 26 6d 6f 64 65  , argv[3], &mode
38e0: 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20  )!=TCL_OK ){.   
38f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
3900: 52 3b 0a 20 20 7d 0a 20 20 7a 45 72 72 4d 73 67  R;.  }.  zErrMsg
3910: 20 3d 20 30 3b 0a 20 20 70 20 3d 20 28 53 71 6c   = 0;.  p = (Sql
3920: 69 74 65 44 62 2a 29 54 63 6c 5f 41 6c 6c 6f 63  iteDb*)Tcl_Alloc
3930: 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  ( sizeof(*p) );.
3940: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
3950: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
3960: 69 6e 74 65 72 70 2c 20 22 6d 61 6c 6c 6f 63 20  interp, "malloc 
3970: 66 61 69 6c 65 64 22 2c 20 54 43 4c 5f 53 54 41  failed", TCL_STA
3980: 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  TIC);.    return
3990: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
39a0: 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
39b0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 70 2d  izeof(*p));.  p-
39c0: 3e 64 62 20 3d 20 73 71 6c 69 74 65 5f 6f 70 65  >db = sqlite_ope
39d0: 6e 28 61 72 67 76 5b 32 5d 2c 20 6d 6f 64 65 2c  n(argv[2], mode,
39e0: 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66   &zErrMsg);.  if
39f0: 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20  ( p->db==0 ){.  
3a00: 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
3a10: 69 6e 74 65 72 70 2c 20 7a 45 72 72 4d 73 67 2c  interp, zErrMsg,
3a20: 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
3a30: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68      Tcl_Free((ch
3a40: 61 72 2a 29 70 29 3b 0a 20 20 20 20 66 72 65 65  ar*)p);.    free
3a50: 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 72  (zErrMsg);.    r
3a60: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
3a70: 0a 20 20 7d 0a 20 20 54 63 6c 5f 43 72 65 61 74  .  }.  Tcl_Creat
3a80: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eObjCommand(inte
3a90: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 44 62 4f  rp, argv[1], DbO
3aa0: 62 6a 43 6d 64 2c 20 28 63 68 61 72 2a 29 70 2c  bjCmd, (char*)p,
3ab0: 20 44 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a 20   DbDeleteCmd);. 
3ac0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
3ad0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 76 69 64 65  }../*.** Provide
3ae0: 20 61 20 64 75 6d 6d 79 20 54 63 6c 5f 49 6e 69   a dummy Tcl_Ini
3af0: 74 53 74 75 62 73 20 69 66 20 77 65 20 61 72 65  tStubs if we are
3b00: 20 75 73 69 6e 67 20 74 68 69 73 20 61 73 20 61   using this as a
3b10: 20 73 74 61 74 69 63 0a 2a 2a 20 6c 69 62 72 61   static.** libra
3b20: 72 79 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 55  ry..*/.#ifndef U
3b30: 53 45 5f 54 43 4c 5f 53 54 55 42 53 0a 23 20 75  SE_TCL_STUBS.# u
3b40: 6e 64 65 66 20 20 54 63 6c 5f 49 6e 69 74 53 74  ndef  Tcl_InitSt
3b50: 75 62 73 0a 23 20 64 65 66 69 6e 65 20 54 63 6c  ubs.# define Tcl
3b60: 5f 49 6e 69 74 53 74 75 62 73 28 61 2c 62 2c 63  _InitStubs(a,b,c
3b70: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
3b80: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69 73 20  Initialize this 
3b90: 6d 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  module..**.** Th
3ba0: 69 73 20 54 63 6c 20 6d 6f 64 75 6c 65 20 63 6f  is Tcl module co
3bb0: 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 61 20 73 69  ntains only a si
3bc0: 6e 67 6c 65 20 6e 65 77 20 54 63 6c 20 63 6f 6d  ngle new Tcl com
3bd0: 6d 61 6e 64 20 6e 61 6d 65 64 20 22 73 71 6c 69  mand named "sqli
3be0: 74 65 22 2e 0a 2a 2a 20 28 48 65 6e 63 65 20 74  te"..** (Hence t
3bf0: 68 65 72 65 20 69 73 20 6e 6f 20 6e 61 6d 65 73  here is no names
3c00: 70 61 63 65 2e 20 20 54 68 65 72 65 20 69 73 20  pace.  There is 
3c10: 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 75 73 69 6e  no point in usin
3c20: 67 20 61 20 6e 61 6d 65 73 70 61 63 65 0a 2a 2a  g a namespace.**
3c30: 20 69 66 20 74 68 65 20 65 78 74 65 6e 73 69 6f   if the extensio
3c40: 6e 20 6f 6e 6c 79 20 73 75 70 70 6c 69 65 73 20  n only supplies 
3c50: 6f 6e 65 20 6e 65 77 20 6e 61 6d 65 21 29 20 20  one new name!)  
3c60: 54 68 65 20 22 73 71 6c 69 74 65 22 20 63 6f 6d  The "sqlite" com
3c70: 6d 61 6e 64 20 69 73 0a 2a 2a 20 75 73 65 64 20  mand is.** used 
3c80: 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20 53 51  to open a new SQ
3c90: 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20  Lite database.  
3ca0: 53 65 65 20 74 68 65 20 44 62 4d 61 69 6e 28 29  See the DbMain()
3cb0: 20 72 6f 75 74 69 6e 65 20 61 62 6f 76 65 0a 2a   routine above.*
3cc0: 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  * for additional
3cd0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f   information..*/
3ce0: 0a 69 6e 74 20 53 71 6c 69 74 65 5f 49 6e 69 74  .int Sqlite_Init
3cf0: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
3d00: 65 72 70 29 7b 0a 20 20 54 63 6c 5f 49 6e 69 74  erp){.  Tcl_Init
3d10: 53 74 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38  Stubs(interp, "8
3d20: 2e 30 22 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43  .0", 0);.  Tcl_C
3d30: 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74  reateCommand(int
3d40: 65 72 70 2c 20 22 73 71 6c 69 74 65 22 2c 20 44  erp, "sqlite", D
3d50: 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  bMain, 0, 0);.  
3d60: 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69  Tcl_PkgProvide(i
3d70: 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 22 2c  nterp, "sqlite",
3d80: 20 22 32 2e 30 22 29 3b 0a 20 20 72 65 74 75 72   "2.0");.  retur
3d90: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20  n TCL_OK;.}.int 
3da0: 54 63 6c 73 71 6c 69 74 65 5f 49 6e 69 74 28 54  Tclsqlite_Init(T
3db0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
3dc0: 70 29 7b 0a 20 20 54 63 6c 5f 49 6e 69 74 53 74  p){.  Tcl_InitSt
3dd0: 75 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e 30  ubs(interp, "8.0
3de0: 22 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65  ", 0);.  Tcl_Cre
3df0: 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ateCommand(inter
3e00: 70 2c 20 22 73 71 6c 69 74 65 22 2c 20 44 62 4d  p, "sqlite", DbM
3e10: 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54 63  ain, 0, 0);.  Tc
3e20: 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e 74  l_PkgProvide(int
3e30: 65 72 70 2c 20 22 73 71 6c 69 74 65 22 2c 20 22  erp, "sqlite", "
3e40: 32 2e 30 22 29 3b 0a 20 20 72 65 74 75 72 6e 20  2.0");.  return 
3e50: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 53 71  TCL_OK;.}.int Sq
3e60: 6c 69 74 65 5f 53 61 66 65 49 6e 69 74 28 54 63  lite_SafeInit(Tc
3e70: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
3e80: 29 7b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  ){.  return TCL_
3e90: 4f 4b 3b 0a 7d 0a 69 6e 74 20 54 63 6c 73 71 6c  OK;.}.int Tclsql
3ea0: 69 74 65 5f 53 61 66 65 49 6e 69 74 28 54 63 6c  ite_SafeInit(Tcl
3eb0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29  _Interp *interp)
3ec0: 7b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  {.  return TCL_O
3ed0: 4b 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f 2a 0a 2a  K;.}..#if 0./*.*
3ee0: 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 75 73  * If compiled us
3ef0: 69 6e 67 20 6d 6b 74 63 6c 61 70 70 2c 20 74 68  ing mktclapp, th
3f00: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
3f10: 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 2a 2a  to initialize.**
3f20: 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 2a 2f 0a   everything..*/.
3f30: 69 6e 74 20 45 74 5f 41 70 70 49 6e 69 74 28 54  int Et_AppInit(T
3f40: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
3f50: 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 71 6c  p){.  return Sql
3f60: 69 74 65 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  ite_Init(interp)
3f70: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
3f80: 2a 20 49 66 20 74 68 65 20 6d 61 63 72 6f 20 54  * If the macro T
3f90: 43 4c 53 48 20 69 73 20 64 65 66 69 6e 65 64 20  CLSH is defined 
3fa0: 61 6e 64 20 69 73 20 6f 6e 65 2c 20 74 68 65 6e  and is one, then
3fb0: 20 70 75 74 20 69 6e 20 63 6f 64 65 20 66 6f 72   put in code for
3fc0: 20 74 68 65 0a 2a 2a 20 22 6d 61 69 6e 22 20 72   the.** "main" r
3fd0: 6f 75 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c  outine that will
3fe0: 20 69 6e 69 74 69 61 6c 69 7a 65 20 54 63 6c 2e   initialize Tcl.
3ff0: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
4000: 54 43 4c 53 48 29 20 26 26 20 54 43 4c 53 48 3d  TCLSH) && TCLSH=
4010: 3d 31 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a  =1.static char z
4020: 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20 20 22  Mainloop[] =.  "
4030: 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20  set line {}\n". 
4040: 20 22 77 68 69 6c 65 20 7b 21 5b 65 6f 66 20 73   "while {![eof s
4050: 74 64 69 6e 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20  tdin]} {\n".    
4060: 22 69 66 20 7b 24 6c 69 6e 65 21 3d 5c 22 5c 22  "if {$line!=\"\"
4070: 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 70 75  } {\n".      "pu
4080: 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22  ts -nonewline \"
4090: 3e 20 5c 22 5c 6e 22 0a 20 20 20 20 22 7d 20 65  > \"\n".    "} e
40a0: 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22  lse {\n".      "
40b0: 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20  puts -nonewline 
40c0: 5c 22 25 20 5c 22 5c 6e 22 0a 20 20 20 20 22 7d  \"% \"\n".    "}
40d0: 5c 6e 22 0a 20 20 20 20 22 66 6c 75 73 68 20 73  \n".    "flush s
40e0: 74 64 6f 75 74 5c 6e 22 0a 20 20 20 20 22 61 70  tdout\n".    "ap
40f0: 70 65 6e 64 20 6c 69 6e 65 20 5b 67 65 74 73 20  pend line [gets 
4100: 73 74 64 69 6e 5d 5c 6e 22 0a 20 20 20 20 22 69  stdin]\n".    "i
4110: 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d 70 6c 65 74  f {[info complet
4120: 65 20 24 6c 69 6e 65 5d 7d 20 7b 5c 6e 22 0a 20  e $line]} {\n". 
4130: 20 20 20 20 20 22 69 66 20 7b 5b 63 61 74 63 68       "if {[catch
4140: 20 7b 75 70 6c 65 76 65 6c 20 23 30 20 24 6c 69   {uplevel #0 $li
4150: 6e 65 7d 20 72 65 73 75 6c 74 5d 7d 20 7b 5c 6e  ne} result]} {\n
4160: 22 0a 20 20 20 20 20 20 20 20 22 70 75 74 73 20  ".        "puts 
4170: 73 74 64 65 72 72 20 5c 22 45 72 72 6f 72 3a 20  stderr \"Error: 
4180: 24 72 65 73 75 6c 74 5c 22 5c 6e 22 0a 20 20 20  $result\"\n".   
4190: 20 20 20 22 7d 20 65 6c 73 65 69 66 20 7b 24 72     "} elseif {$r
41a0: 65 73 75 6c 74 21 3d 5c 22 5c 22 7d 20 7b 5c 6e  esult!=\"\"} {\n
41b0: 22 0a 20 20 20 20 20 20 20 20 22 70 75 74 73 20  ".        "puts 
41c0: 24 72 65 73 75 6c 74 5c 6e 22 0a 20 20 20 20 20  $result\n".     
41d0: 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20 22 73 65   "}\n".      "se
41e0: 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 20  t line {}\n".   
41f0: 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20   "} else {\n".  
4200: 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69 6e 65      "append line
4210: 20 5c 5c 6e 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e   \\n\n".    "}\n
4220: 22 0a 20 20 22 7d 5c 6e 22 0a 3b 0a 0a 23 64 65  ".  "}\n".;..#de
4230: 66 69 6e 65 20 54 43 4c 53 48 5f 4d 41 49 4e 20  fine TCLSH_MAIN 
4240: 6d 61 69 6e 20 20 20 2f 2a 20 4e 65 65 64 65 64  main   /* Needed
4250: 20 74 6f 20 66 61 6b 65 20 6f 75 74 20 6d 6b 74   to fake out mkt
4260: 63 6c 61 70 70 20 2a 2f 0a 69 6e 74 20 54 43 4c  clapp */.int TCL
4270: 53 48 5f 4d 41 49 4e 28 69 6e 74 20 61 72 67 63  SH_MAIN(int argc
4280: 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a  , char **argv){.
4290: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
42a0: 74 65 72 70 3b 0a 20 20 54 63 6c 5f 46 69 6e 64  terp;.  Tcl_Find
42b0: 45 78 65 63 75 74 61 62 6c 65 28 61 72 67 76 5b  Executable(argv[
42c0: 30 5d 29 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20  0]);.  interp = 
42d0: 54 63 6c 5f 43 72 65 61 74 65 49 6e 74 65 72 70  Tcl_CreateInterp
42e0: 28 29 3b 0a 20 20 53 71 6c 69 74 65 5f 49 6e 69  ();.  Sqlite_Ini
42f0: 74 28 69 6e 74 65 72 70 29 3b 0a 23 69 66 64 65  t(interp);.#ifde
4300: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
4310: 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  {.    extern int
4320: 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69   Sqlitetest1_Ini
4330: 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a  t(Tcl_Interp*);.
4340: 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53      extern int S
4350: 71 6c 69 74 65 74 65 73 74 32 5f 49 6e 69 74 28  qlitetest2_Init(
4360: 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
4370: 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c    extern int Sql
4380: 69 74 65 74 65 73 74 33 5f 49 6e 69 74 28 54 63  itetest3_Init(Tc
4390: 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20  l_Interp*);.    
43a0: 65 78 74 65 72 6e 20 69 6e 74 20 4d 64 35 5f 49  extern int Md5_I
43b0: 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29  nit(Tcl_Interp*)
43c0: 3b 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74  ;.    Sqlitetest
43d0: 31 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a  1_Init(interp);.
43e0: 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 32 5f      Sqlitetest2_
43f0: 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  Init(interp);.  
4400: 20 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e    Sqlitetest3_In
4410: 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
4420: 4d 64 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  Md5_Init(interp)
4430: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
4440: 66 28 20 61 72 67 63 3e 3d 32 20 29 7b 0a 20 20  f( argc>=2 ){.  
4450: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 54 63 6c    int i;.    Tcl
4460: 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22  _SetVar(interp,"
4470: 61 72 67 76 30 22 2c 61 72 67 76 5b 31 5d 2c 54  argv0",argv[1],T
4480: 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
4490: 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28  .    Tcl_SetVar(
44a0: 69 6e 74 65 72 70 2c 22 61 72 67 76 22 2c 20 22  interp,"argv", "
44b0: 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  ", TCL_GLOBAL_ON
44c0: 4c 59 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 32  LY);.    for(i=2
44d0: 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
44e0: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72        Tcl_SetVar
44f0: 28 69 6e 74 65 72 70 2c 20 22 61 72 67 76 22 2c  (interp, "argv",
4500: 20 61 72 67 76 5b 69 5d 2c 0a 20 20 20 20 20 20   argv[i],.      
4510: 20 20 20 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f      TCL_GLOBAL_O
4520: 4e 4c 59 20 7c 20 54 43 4c 5f 4c 49 53 54 5f 45  NLY | TCL_LIST_E
4530: 4c 45 4d 45 4e 54 20 7c 20 54 43 4c 5f 41 50 50  LEMENT | TCL_APP
4540: 45 4e 44 5f 56 41 4c 55 45 29 3b 0a 20 20 20 20  END_VALUE);.    
4550: 7d 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 45 76  }.    if( Tcl_Ev
4560: 61 6c 46 69 6c 65 28 69 6e 74 65 72 70 2c 20 61  alFile(interp, a
4570: 72 67 76 5b 31 5d 29 21 3d 54 43 4c 5f 4f 4b 20  rgv[1])!=TCL_OK 
4580: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
4590: 49 6e 66 6f 20 3d 20 54 63 6c 5f 47 65 74 56 61  Info = Tcl_GetVa
45a0: 72 28 69 6e 74 65 72 70 2c 20 22 65 72 72 6f 72  r(interp, "error
45b0: 49 6e 66 6f 22 2c 20 54 43 4c 5f 47 4c 4f 42 41  Info", TCL_GLOBA
45c0: 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 69  L_ONLY);.      i
45d0: 66 28 20 7a 49 6e 66 6f 3d 3d 30 20 29 20 7a 49  f( zInfo==0 ) zI
45e0: 6e 66 6f 20 3d 20 69 6e 74 65 72 70 2d 3e 72 65  nfo = interp->re
45f0: 73 75 6c 74 3b 0a 20 20 20 20 20 20 66 70 72 69  sult;.      fpri
4600: 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20  ntf(stderr,"%s: 
4610: 25 73 5c 6e 22 2c 20 2a 61 72 67 76 2c 20 7a 49  %s\n", *argv, zI
4620: 6e 66 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75  nfo);.      retu
4630: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  rn 1;.    }.  }e
4640: 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 47 6c 6f  lse{.    Tcl_Glo
4650: 62 61 6c 45 76 61 6c 28 69 6e 74 65 72 70 2c 20  balEval(interp, 
4660: 7a 4d 61 69 6e 6c 6f 6f 70 29 3b 0a 20 20 7d 0a  zMainloop);.  }.
4670: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
4680: 6e 64 69 66 20 2f 2a 20 54 43 4c 53 48 20 2a 2f  ndif /* TCLSH */
4690: 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  ..#endif /* !def
46a0: 69 6e 65 64 28 4e 4f 5f 54 43 4c 29 20 2a 2f 0a  ined(NO_TCL) */.