/ Hex Artifact Content
Login

Artifact 386f502060325d9cb05d418bf0f1cf6a4b57c873:


0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 31 39 39 39 2c 20 32 30 30 30 20 44  (c) 1999, 2000 D
0020: 2e 20 52 69 63 68 61 72 64 20 48 69 70 70 0a 2a  . Richard Hipp.*
0030: 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72 61  *.** This progra
0040: 6d 20 69 73 20 66 72 65 65 20 73 6f 66 74 77 61  m is free softwa
0050: 72 65 3b 20 79 6f 75 20 63 61 6e 20 72 65 64 69  re; you can redi
0060: 73 74 72 69 62 75 74 65 20 69 74 20 61 6e 64 2f  stribute it and/
0070: 6f 72 0a 2a 2a 20 6d 6f 64 69 66 79 20 69 74 20  or.** modify it 
0080: 75 6e 64 65 72 20 74 68 65 20 74 65 72 6d 73 20  under the terms 
0090: 6f 66 20 74 68 65 20 47 4e 55 20 47 65 6e 65 72  of the GNU Gener
00a0: 61 6c 20 50 75 62 6c 69 63 0a 2a 2a 20 4c 69 63  al Public.** Lic
00b0: 65 6e 73 65 20 61 73 20 70 75 62 6c 69 73 68 65  ense as publishe
00c0: 64 20 62 79 20 74 68 65 20 46 72 65 65 20 53 6f  d by the Free So
00d0: 66 74 77 61 72 65 20 46 6f 75 6e 64 61 74 69 6f  ftware Foundatio
00e0: 6e 3b 20 65 69 74 68 65 72 0a 2a 2a 20 76 65 72  n; either.** ver
00f0: 73 69 6f 6e 20 32 20 6f 66 20 74 68 65 20 4c 69  sion 2 of the Li
0100: 63 65 6e 73 65 2c 20 6f 72 20 28 61 74 20 79 6f  cense, or (at yo
0110: 75 72 20 6f 70 74 69 6f 6e 29 20 61 6e 79 20 6c  ur option) any l
0120: 61 74 65 72 20 76 65 72 73 69 6f 6e 2e 0a 2a 2a  ater version..**
0130: 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72 61 6d  .** This program
0140: 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20   is distributed 
0150: 69 6e 20 74 68 65 20 68 6f 70 65 20 74 68 61 74  in the hope that
0160: 20 69 74 20 77 69 6c 6c 20 62 65 20 75 73 65 66   it will be usef
0170: 75 6c 2c 0a 2a 2a 20 62 75 74 20 57 49 54 48 4f  ul,.** but WITHO
0180: 55 54 20 41 4e 59 20 57 41 52 52 41 4e 54 59 3b  UT ANY WARRANTY;
0190: 20 77 69 74 68 6f 75 74 20 65 76 65 6e 20 74 68   without even th
01a0: 65 20 69 6d 70 6c 69 65 64 20 77 61 72 72 61 6e  e implied warran
01b0: 74 79 20 6f 66 0a 2a 2a 20 4d 45 52 43 48 41 4e  ty of.** MERCHAN
01c0: 54 41 42 49 4c 49 54 59 20 6f 72 20 46 49 54 4e  TABILITY or FITN
01d0: 45 53 53 20 46 4f 52 20 41 20 50 41 52 54 49 43  ESS FOR A PARTIC
01e0: 55 4c 41 52 20 50 55 52 50 4f 53 45 2e 20 20 53  ULAR PURPOSE.  S
01f0: 65 65 20 74 68 65 20 47 4e 55 0a 2a 2a 20 47 65  ee the GNU.** Ge
0200: 6e 65 72 61 6c 20 50 75 62 6c 69 63 20 4c 69 63  neral Public Lic
0210: 65 6e 73 65 20 66 6f 72 20 6d 6f 72 65 20 64 65  ense for more de
0220: 74 61 69 6c 73 2e 0a 2a 2a 20 0a 2a 2a 20 59 6f  tails..** .** Yo
0230: 75 20 73 68 6f 75 6c 64 20 68 61 76 65 20 72 65  u should have re
0240: 63 65 69 76 65 64 20 61 20 63 6f 70 79 20 6f 66  ceived a copy of
0250: 20 74 68 65 20 47 4e 55 20 47 65 6e 65 72 61 6c   the GNU General
0260: 20 50 75 62 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e   Public.** Licen
0270: 73 65 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  se along with th
0280: 69 73 20 6c 69 62 72 61 72 79 3b 20 69 66 20 6e  is library; if n
0290: 6f 74 2c 20 77 72 69 74 65 20 74 6f 20 74 68 65  ot, write to the
02a0: 0a 2a 2a 20 46 72 65 65 20 53 6f 66 74 77 61 72  .** Free Softwar
02b0: 65 20 46 6f 75 6e 64 61 74 69 6f 6e 2c 20 49 6e  e Foundation, In
02c0: 63 2e 2c 20 35 39 20 54 65 6d 70 6c 65 20 50 6c  c., 59 Temple Pl
02d0: 61 63 65 20 2d 20 53 75 69 74 65 20 33 33 30 2c  ace - Suite 330,
02e0: 0a 2a 2a 20 42 6f 73 74 6f 6e 2c 20 4d 41 20 20  .** Boston, MA  
02f0: 30 32 31 31 31 2d 31 33 30 37 2c 20 55 53 41 2e  02111-1307, USA.
0300: 0a 2a 2a 0a 2a 2a 20 41 75 74 68 6f 72 20 63 6f  .**.** Author co
0310: 6e 74 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f  ntact informatio
0320: 6e 3a 0a 2a 2a 20 20 20 64 72 68 40 68 77 61 63  n:.**   drh@hwac
0330: 69 2e 63 6f 6d 0a 2a 2a 20 20 20 68 74 74 70 3a  i.com.**   http:
0340: 2f 2f 77 77 77 2e 68 77 61 63 69 2e 63 6f 6d 2f  //www.hwaci.com/
0350: 64 72 68 2f 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  drh/.**.********
0360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03a0: 2a 0a 2a 2a 20 41 20 54 43 4c 20 49 6e 74 65 72  *.** A TCL Inter
03b0: 66 61 63 65 20 74 6f 20 53 51 4c 69 74 65 0a 2a  face to SQLite.*
03c0: 2a 0a 2a 2a 20 24 49 64 3a 20 74 63 6c 73 71 6c  *.** $Id: tclsql
03d0: 69 74 65 2e 63 2c 76 20 31 2e 32 31 20 32 30 30  ite.c,v 1.21 200
03e0: 31 2f 30 37 2f 32 33 20 31 34 3a 33 33 3a 30 34  1/07/23 14:33:04
03f0: 20 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69   drh Exp $.*/.#i
0400: 66 6e 64 65 66 20 4e 4f 5f 54 43 4c 20 20 20 20  fndef NO_TCL    
0410: 20 2f 2a 20 4f 6d 69 74 20 74 68 69 73 20 77 68   /* Omit this wh
0420: 6f 6c 65 20 66 69 6c 65 20 69 66 20 54 43 4c 20  ole file if TCL 
0430: 69 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 20 2a  is unavailable *
0440: 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c  /..#include "sql
0450: 69 74 65 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  ite.h".#include 
0460: 22 74 63 6c 2e 68 22 0a 23 69 6e 63 6c 75 64 65  "tcl.h".#include
0470: 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63   <stdlib.h>.#inc
0480: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
0490: 0a 2f 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20  ./*.** There is 
04a0: 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  one instance of 
04b0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 66  this structure f
04c0: 6f 72 20 65 61 63 68 20 53 51 4c 69 74 65 20 64  or each SQLite d
04d0: 61 74 61 62 61 73 65 0a 2a 2a 20 74 68 61 74 20  atabase.** that 
04e0: 68 61 73 20 62 65 65 6e 20 6f 70 65 6e 65 64 20  has been opened 
04f0: 62 79 20 74 68 65 20 53 51 4c 69 74 65 20 54 43  by the SQLite TC
0500: 4c 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  L interface..*/.
0510: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
0520: 71 6c 69 74 65 44 62 20 53 71 6c 69 74 65 44 62  qliteDb SqliteDb
0530: 3b 0a 73 74 72 75 63 74 20 53 71 6c 69 74 65 44  ;.struct SqliteD
0540: 62 20 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62  b {.  sqlite *db
0550: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
0560: 68 65 20 22 72 65 61 6c 22 20 64 61 74 61 62 61  he "real" databa
0570: 73 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  se structure */.
0580: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
0590: 74 65 72 70 3b 20 20 20 2f 2a 20 54 68 65 20 69  terp;   /* The i
05a0: 6e 74 65 72 70 72 65 74 65 72 20 75 73 65 64 20  nterpreter used 
05b0: 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73  for this databas
05c0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75  e */.  char *zBu
05d0: 73 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  sy;          /* 
05e0: 54 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63  The busy callbac
05f0: 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 7d 3b 0a  k routine */.};.
0600: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
0610: 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
0620: 74 75 72 65 20 70 61 73 73 65 73 20 69 6e 66 6f  ture passes info
0630: 72 6d 61 74 69 6f 6e 20 74 68 72 75 20 74 68 65  rmation thru the
0640: 20 73 71 6c 69 74 65 0a 2a 2a 20 6c 6f 67 69 63   sqlite.** logic
0650: 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e   from the origin
0660: 61 6c 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 69  al TCL command i
0670: 6e 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b  nto the callback
0680: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70   routine..*/.typ
0690: 65 64 65 66 20 73 74 72 75 63 74 20 43 61 6c 6c  edef struct Call
06a0: 62 61 63 6b 44 61 74 61 20 43 61 6c 6c 62 61 63  backData Callbac
06b0: 6b 44 61 74 61 3b 0a 73 74 72 75 63 74 20 43 61  kData;.struct Ca
06c0: 6c 6c 62 61 63 6b 44 61 74 61 20 7b 0a 20 20 54  llbackData {.  T
06d0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
06e0: 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  p;       /* The 
06f0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
0700: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 72 72 61  */.  char *zArra
0710: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  y;             /
0720: 2a 20 54 68 65 20 61 72 72 61 79 20 69 6e 74 6f  * The array into
0730: 20 77 68 69 63 68 20 64 61 74 61 20 69 73 20 77   which data is w
0740: 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 63 6c 5f  ritten */.  Tcl_
0750: 4f 62 6a 20 2a 70 43 6f 64 65 3b 20 20 20 20 20  Obj *pCode;     
0760: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64        /* The cod
0770: 65 20 74 6f 20 65 78 65 63 75 74 65 20 66 6f 72  e to execute for
0780: 20 65 61 63 68 20 72 6f 77 20 2a 2f 0a 20 20 69   each row */.  i
0790: 6e 74 20 6f 6e 63 65 3b 20 20 20 20 20 20 20 20  nt once;        
07a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20           /* Set 
07b0: 6f 6e 6c 79 20 66 6f 72 20 74 68 65 20 66 69 72  only for the fir
07c0: 73 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66  st invocation of
07d0: 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 69   callback */.  i
07e0: 6e 74 20 74 63 6c 5f 72 63 3b 20 20 20 20 20 20  nt tcl_rc;      
07f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
0800: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 54 43 4c  rn code from TCL
0810: 20 73 63 72 69 70 74 20 2a 2f 0a 7d 3b 0a 0a 2f   script */.};../
0820: 2a 0a 2a 2a 20 49 66 20 54 43 4c 20 75 73 65 73  *.** If TCL uses
0830: 20 55 54 46 2d 38 20 61 6e 64 20 53 51 4c 69 74   UTF-8 and SQLit
0840: 65 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20  e is configured 
0850: 74 6f 20 75 73 65 20 69 73 6f 38 38 35 39 2c 20  to use iso8859, 
0860: 74 68 65 6e 20 77 65 0a 2a 2a 20 68 61 76 65 20  then we.** have 
0870: 74 6f 20 64 6f 20 61 20 74 72 61 6e 73 6c 61 74  to do a translat
0880: 69 6f 6e 20 77 68 65 6e 20 67 6f 69 6e 67 20 62  ion when going b
0890: 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 2e 20  etween the two. 
08a0: 20 53 65 74 20 74 68 65 20 0a 2a 2a 20 55 54 46   Set the .** UTF
08b0: 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45  _TRANSLATION_NEE
08c0: 44 45 44 20 6d 61 63 72 6f 20 74 6f 20 69 6e 64  DED macro to ind
08d0: 69 63 61 74 65 20 74 68 61 74 20 77 65 20 6e 65  icate that we ne
08e0: 65 64 20 74 6f 20 64 6f 0a 2a 2a 20 74 68 69 73  ed to do.** this
08f0: 20 74 72 61 6e 73 6c 61 74 69 6f 6e 2e 20 20 0a   translation.  .
0900: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 54  */.#if defined(T
0910: 43 4c 5f 55 54 46 5f 4d 41 58 29 20 26 26 20 21  CL_UTF_MAX) && !
0920: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 55  defined(SQLITE_U
0930: 54 46 38 29 0a 23 20 64 65 66 69 6e 65 20 55 54  TF8).# define UT
0940: 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45  F_TRANSLATION_NE
0950: 45 44 45 44 20 31 0a 23 65 6e 64 69 66 0a 0a 2f  EDED 1.#endif../
0960: 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 66 6f 72 20  *.** Called for 
0970: 65 61 63 68 20 72 6f 77 20 6f 66 20 74 68 65 20  each row of the 
0980: 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69  result..*/.stati
0990: 63 20 69 6e 74 20 44 62 45 76 61 6c 43 61 6c 6c  c int DbEvalCall
09a0: 62 61 63 6b 28 0a 20 20 76 6f 69 64 20 2a 63 6c  back(.  void *cl
09b0: 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20 20 2f  ientData,      /
09c0: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
09d0: 20 43 61 6c 6c 62 61 63 6b 44 61 74 61 20 2a 2f   CallbackData */
09e0: 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c 20 20 20 20  .  int nCol,    
09f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
0a00: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
0a10: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a  n the result */.
0a20: 20 20 63 68 61 72 20 2a 2a 20 61 7a 43 6f 6c 2c    char ** azCol,
0a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
0a40: 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e   for each column
0a50: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 20 61 7a   */.  char ** az
0a60: 4e 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  N            /* 
0a70: 4e 61 6d 65 20 66 6f 72 20 65 61 63 68 20 63 6f  Name for each co
0a80: 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 43 61 6c  lumn */.){.  Cal
0a90: 6c 62 61 63 6b 44 61 74 61 20 2a 63 62 44 61 74  lbackData *cbDat
0aa0: 61 20 3d 20 28 43 61 6c 6c 62 61 63 6b 44 61 74  a = (CallbackDat
0ab0: 61 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  a*)clientData;. 
0ac0: 20 69 6e 74 20 69 2c 20 72 63 3b 0a 23 69 66 64   int i, rc;.#ifd
0ad0: 65 66 20 55 54 46 5f 54 52 41 4e 53 4c 41 54 49  ef UTF_TRANSLATI
0ae0: 4f 4e 5f 4e 45 45 44 45 44 0a 20 20 54 63 6c 5f  ON_NEEDED.  Tcl_
0af0: 44 53 74 72 69 6e 67 20 64 43 6f 6c 3b 0a 23 65  DString dCol;.#e
0b00: 6e 64 69 66 0a 20 20 69 66 28 20 63 62 44 61 74  ndif.  if( cbDat
0b10: 61 2d 3e 7a 41 72 72 61 79 5b 30 5d 20 29 7b 0a  a->zArray[0] ){.
0b20: 20 20 20 20 69 66 28 20 63 62 44 61 74 61 2d 3e      if( cbData->
0b30: 6f 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 54 63  once ){.      Tc
0b40: 6c 5f 53 65 74 56 61 72 32 28 63 62 44 61 74 61  l_SetVar2(cbData
0b50: 2d 3e 69 6e 74 65 72 70 2c 20 63 62 44 61 74 61  ->interp, cbData
0b60: 2d 3e 7a 41 72 72 61 79 2c 20 22 2a 22 2c 20 22  ->zArray, "*", "
0b70: 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72  ", 0);.      for
0b80: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
0b90: 2b 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  +){.        Tcl_
0ba0: 53 65 74 56 61 72 32 28 63 62 44 61 74 61 2d 3e  SetVar2(cbData->
0bb0: 69 6e 74 65 72 70 2c 20 63 62 44 61 74 61 2d 3e  interp, cbData->
0bc0: 7a 41 72 72 61 79 2c 20 22 2a 22 2c 20 61 7a 4e  zArray, "*", azN
0bd0: 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [i],.           
0be0: 54 43 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45 4e 54  TCL_LIST_ELEMENT
0bf0: 7c 54 43 4c 5f 41 50 50 45 4e 44 5f 56 41 4c 55  |TCL_APPEND_VALU
0c00: 45 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  E);.      }.    
0c10: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
0c20: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
0c30: 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 43     char *z = azC
0c40: 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  ol[i];.      if(
0c50: 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a   z==0 ) z = "";.
0c60: 23 69 66 64 65 66 20 55 54 46 5f 54 52 41 4e 53  #ifdef UTF_TRANS
0c70: 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 0a 20 20  LATION_NEEDED.  
0c80: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49      Tcl_DStringI
0c90: 6e 69 74 28 26 64 43 6f 6c 29 3b 0a 20 20 20 20  nit(&dCol);.    
0ca0: 20 20 54 63 6c 5f 45 78 74 65 72 6e 61 6c 54 6f    Tcl_ExternalTo
0cb0: 55 74 66 44 53 74 72 69 6e 67 28 4e 55 4c 4c 2c  UtfDString(NULL,
0cc0: 20 7a 2c 20 2d 31 2c 20 26 64 43 6f 6c 29 3b 0a   z, -1, &dCol);.
0cd0: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72        Tcl_SetVar
0ce0: 32 28 63 62 44 61 74 61 2d 3e 69 6e 74 65 72 70  2(cbData->interp
0cf0: 2c 20 63 62 44 61 74 61 2d 3e 7a 41 72 72 61 79  , cbData->zArray
0d00: 2c 20 61 7a 4e 5b 69 5d 2c 20 0a 20 20 20 20 20  , azN[i], .     
0d10: 20 20 20 20 20 20 20 54 63 6c 5f 44 53 74 72 69         Tcl_DStri
0d20: 6e 67 56 61 6c 75 65 28 26 64 43 6f 6c 29 2c 20  ngValue(&dCol), 
0d30: 30 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 44 53  0);.      Tcl_DS
0d40: 74 72 69 6e 67 46 72 65 65 28 26 64 43 6f 6c 29  tringFree(&dCol)
0d50: 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 54 63  ;.#else.      Tc
0d60: 6c 5f 53 65 74 56 61 72 32 28 63 62 44 61 74 61  l_SetVar2(cbData
0d70: 2d 3e 69 6e 74 65 72 70 2c 20 63 62 44 61 74 61  ->interp, cbData
0d80: 2d 3e 7a 41 72 72 61 79 2c 20 61 7a 4e 5b 69 5d  ->zArray, azN[i]
0d90: 2c 20 7a 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  , z, 0);.#endif.
0da0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
0db0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
0dc0: 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
0dd0: 63 68 61 72 20 2a 7a 20 3d 20 61 7a 43 6f 6c 5b  char *z = azCol[
0de0: 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 3d  i];.      if( z=
0df0: 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 23 69 66  =0 ) z = "";.#if
0e00: 64 65 66 20 55 54 46 5f 54 52 41 4e 53 4c 41 54  def UTF_TRANSLAT
0e10: 49 4f 4e 5f 4e 45 45 44 45 44 0a 20 20 20 20 20  ION_NEEDED.     
0e20: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
0e30: 28 26 64 43 6f 6c 29 3b 0a 20 20 20 20 20 20 54  (&dCol);.      T
0e40: 63 6c 5f 45 78 74 65 72 6e 61 6c 54 6f 55 74 66  cl_ExternalToUtf
0e50: 44 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 20 7a 2c  DString(NULL, z,
0e60: 20 2d 31 2c 20 26 64 43 6f 6c 29 3b 0a 20 20 20   -1, &dCol);.   
0e70: 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 63 62     Tcl_SetVar(cb
0e80: 44 61 74 61 2d 3e 69 6e 74 65 72 70 2c 20 61 7a  Data->interp, az
0e90: 4e 5b 69 5d 2c 20 54 63 6c 5f 44 53 74 72 69 6e  N[i], Tcl_DStrin
0ea0: 67 56 61 6c 75 65 28 26 64 43 6f 6c 29 2c 20 30  gValue(&dCol), 0
0eb0: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 44 53 74  );.      Tcl_DSt
0ec0: 72 69 6e 67 46 72 65 65 28 26 64 43 6f 6c 29 3b  ringFree(&dCol);
0ed0: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 54 63 6c  .#else.      Tcl
0ee0: 5f 53 65 74 56 61 72 28 63 62 44 61 74 61 2d 3e  _SetVar(cbData->
0ef0: 69 6e 74 65 72 70 2c 20 61 7a 4e 5b 69 5d 2c 20  interp, azN[i], 
0f00: 7a 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  z, 0);.#endif.  
0f10: 20 20 7d 0a 20 20 7d 0a 20 20 63 62 44 61 74 61    }.  }.  cbData
0f20: 2d 3e 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 72 63  ->once = 0;.  rc
0f30: 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 28 63   = Tcl_EvalObj(c
0f40: 62 44 61 74 61 2d 3e 69 6e 74 65 72 70 2c 20 63  bData->interp, c
0f50: 62 44 61 74 61 2d 3e 70 43 6f 64 65 29 3b 0a 20  bData->pCode);. 
0f60: 20 69 66 28 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e   if( rc==TCL_CON
0f70: 54 49 4e 55 45 20 29 20 72 63 20 3d 20 54 43 4c  TINUE ) rc = TCL
0f80: 5f 4f 4b 3b 0a 20 20 63 62 44 61 74 61 2d 3e 74  _OK;.  cbData->t
0f90: 63 6c 5f 72 63 20 3d 20 72 63 3b 0a 20 20 72 65  cl_rc = rc;.  re
0fa0: 74 75 72 6e 20 72 63 21 3d 54 43 4c 5f 4f 4b 3b  turn rc!=TCL_OK;
0fb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
0fc0: 73 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65  s an alternative
0fd0: 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 64 61   callback for da
0fe0: 74 61 62 61 73 65 20 71 75 65 72 69 65 73 2e 20  tabase queries. 
0ff0: 20 49 6e 73 74 65 61 64 0a 2a 2a 20 6f 66 20 69   Instead.** of i
1000: 6e 76 6f 6b 69 6e 67 20 61 20 54 43 4c 20 73 63  nvoking a TCL sc
1010: 72 69 70 74 20 74 6f 20 68 61 6e 64 6c 65 20 74  ript to handle t
1020: 68 65 20 72 65 73 75 6c 74 2c 20 74 68 69 73 20  he result, this 
1030: 63 61 6c 6c 62 61 63 6b 20 6a 75 73 74 0a 2a 2a  callback just.**
1040: 20 61 70 70 65 6e 64 73 20 65 61 63 68 20 63 6f   appends each co
1050: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72 65 73 75  lumn of the resu
1060: 6c 74 20 74 6f 20 61 20 6c 69 73 74 2e 20 20 41  lt to a list.  A
1070: 66 74 65 72 20 74 68 65 20 71 75 65 72 79 0a 2a  fter the query.*
1080: 2a 20 69 73 20 63 6f 6d 70 6c 65 74 65 2c 20 74  * is complete, t
1090: 68 65 20 6c 69 73 74 20 69 73 20 72 65 74 75 72  he list is retur
10a0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
10b0: 6e 74 20 44 62 45 76 61 6c 43 61 6c 6c 62 61 63  nt DbEvalCallbac
10c0: 6b 32 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65  k2(.  void *clie
10d0: 6e 74 44 61 74 61 2c 20 20 20 20 20 20 2f 2a 20  ntData,      /* 
10e0: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 43  An instance of C
10f0: 61 6c 6c 62 61 63 6b 44 61 74 61 20 2a 2f 0a 20  allbackData */. 
1100: 20 69 6e 74 20 6e 43 6f 6c 2c 20 20 20 20 20 20   int nCol,      
1110: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1120: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
1130: 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20  the result */.  
1140: 63 68 61 72 20 2a 2a 20 61 7a 43 6f 6c 2c 20 20  char ** azCol,  
1150: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66         /* Data f
1160: 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 2a  or each column *
1170: 2f 0a 20 20 63 68 61 72 20 2a 2a 20 61 7a 4e 20  /.  char ** azN 
1180: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
1190: 6d 65 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  me for each colu
11a0: 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 4f  mn */.){.  Tcl_O
11b0: 62 6a 20 2a 70 4c 69 73 74 20 3d 20 28 54 63 6c  bj *pList = (Tcl
11c0: 5f 4f 62 6a 2a 29 63 6c 69 65 6e 74 44 61 74 61  _Obj*)clientData
11d0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
11e0: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
11f0: 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  +){.    Tcl_Obj 
1200: 2a 70 45 6c 65 6d 3b 0a 20 20 20 20 69 66 28 20  *pElem;.    if( 
1210: 61 7a 43 6f 6c 5b 69 5d 20 26 26 20 2a 61 7a 43  azCol[i] && *azC
1220: 6f 6c 5b 69 5d 20 29 7b 0a 23 69 66 64 65 66 20  ol[i] ){.#ifdef 
1230: 55 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f  UTF_TRANSLATION_
1240: 4e 45 45 44 45 44 0a 20 20 20 20 20 20 54 63 6c  NEEDED.      Tcl
1250: 5f 44 53 74 72 69 6e 67 20 64 43 6f 6c 3b 0a 20  _DString dCol;. 
1260: 20 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67       Tcl_DString
1270: 49 6e 69 74 28 26 64 43 6f 6c 29 3b 0a 20 20 20  Init(&dCol);.   
1280: 20 20 20 54 63 6c 5f 45 78 74 65 72 6e 61 6c 54     Tcl_ExternalT
1290: 6f 55 74 66 44 53 74 72 69 6e 67 28 4e 55 4c 4c  oUtfDString(NULL
12a0: 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 2d 31 2c 20  , azCol[i], -1, 
12b0: 26 64 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 45  &dCol);.      pE
12c0: 6c 65 6d 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72  lem = Tcl_NewStr
12d0: 69 6e 67 4f 62 6a 28 54 63 6c 5f 44 53 74 72 69  ingObj(Tcl_DStri
12e0: 6e 67 56 61 6c 75 65 28 26 64 43 6f 6c 29 2c 20  ngValue(&dCol), 
12f0: 2d 31 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 44  -1);.      Tcl_D
1300: 53 74 72 69 6e 67 46 72 65 65 28 26 64 43 6f 6c  StringFree(&dCol
1310: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70  );.#else.      p
1320: 45 6c 65 6d 20 3d 20 54 63 6c 5f 4e 65 77 53 74  Elem = Tcl_NewSt
1330: 72 69 6e 67 4f 62 6a 28 61 7a 43 6f 6c 5b 69 5d  ringObj(azCol[i]
1340: 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20  , -1);.#endif.  
1350: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1360: 45 6c 65 6d 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  Elem = Tcl_NewOb
1370: 6a 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  j();.    }.    T
1380: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
1390: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 4c 69 73 74  Element(0, pList
13a0: 2c 20 70 45 6c 65 6d 29 3b 0a 20 20 7d 0a 20 20  , pElem);.  }.  
13b0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
13c0: 2a 2a 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74  ** Called when t
13d0: 68 65 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64 65  he command is de
13e0: 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  leted..*/.static
13f0: 20 76 6f 69 64 20 44 62 44 65 6c 65 74 65 43 6d   void DbDeleteCm
1400: 64 28 76 6f 69 64 20 2a 64 62 29 7b 0a 20 20 53  d(void *db){.  S
1410: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
1420: 53 71 6c 69 74 65 44 62 2a 29 64 62 3b 0a 20 20  SqliteDb*)db;.  
1430: 73 71 6c 69 74 65 5f 63 6c 6f 73 65 28 70 44 62  sqlite_close(pDb
1440: 2d 3e 64 62 29 3b 0a 20 20 69 66 28 20 70 44 62  ->db);.  if( pDb
1450: 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 54  ->zBusy ){.    T
1460: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42 75  cl_Free(pDb->zBu
1470: 73 79 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 46  sy);.  }.  Tcl_F
1480: 72 65 65 28 28 63 68 61 72 2a 29 70 44 62 29 3b  ree((char*)pDb);
1490: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
14a0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
14b0: 20 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65   when a database
14c0: 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20   file is locked 
14d0: 77 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20  while trying.** 
14e0: 74 6f 20 65 78 65 63 75 74 65 20 53 51 4c 2e 0a  to execute SQL..
14f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
1500: 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64  BusyHandler(void
1510: 20 2a 63 64 2c 20 63 6f 6e 73 74 20 63 68 61 72   *cd, const char
1520: 20 2a 7a 54 61 62 6c 65 2c 20 69 6e 74 20 6e 54   *zTable, int nT
1530: 72 69 65 73 29 7b 0a 20 20 53 71 6c 69 74 65 44  ries){.  SqliteD
1540: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
1550: 44 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 72 63  Db*)cd;.  int rc
1560: 3b 0a 20 20 63 68 61 72 20 7a 56 61 6c 5b 33 30  ;.  char zVal[30
1570: 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6d 64 3b  ];.  char *zCmd;
1580: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 63  .  Tcl_DString c
1590: 6d 64 3b 0a 0a 20 20 54 63 6c 5f 44 53 74 72 69  md;..  Tcl_DStri
15a0: 6e 67 49 6e 69 74 28 26 63 6d 64 29 3b 0a 20 20  ngInit(&cmd);.  
15b0: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
15c0: 64 28 26 63 6d 64 2c 20 70 44 62 2d 3e 7a 42 75  d(&cmd, pDb->zBu
15d0: 73 79 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44  sy, -1);.  Tcl_D
15e0: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
15f0: 65 6e 74 28 26 63 6d 64 2c 20 7a 54 61 62 6c 65  ent(&cmd, zTable
1600: 29 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 56 61  );.  sprintf(zVa
1610: 6c 2c 20 22 20 25 64 22 2c 20 6e 54 72 69 65 73  l, " %d", nTries
1620: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
1630: 41 70 70 65 6e 64 28 26 63 6d 64 2c 20 7a 56 61  Append(&cmd, zVa
1640: 6c 2c 20 2d 31 29 3b 0a 20 20 7a 43 6d 64 20 3d  l, -1);.  zCmd =
1650: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
1660: 65 28 26 63 6d 64 29 3b 0a 20 20 72 63 20 3d 20  e(&cmd);.  rc = 
1670: 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e  Tcl_Eval(pDb->in
1680: 74 65 72 70 2c 20 7a 43 6d 64 29 3b 0a 20 20 54  terp, zCmd);.  T
1690: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
16a0: 63 6d 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  cmd);.  if( rc!=
16b0: 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54  TCL_OK || atoi(T
16c0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
16d0: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29  lt(pDb->interp))
16e0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
16f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
1700: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22  ;.}../*.** The "
1710: 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20  sqlite" command 
1720: 62 65 6c 6f 77 20 63 72 65 61 74 65 73 20 61 20  below creates a 
1730: 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20  new Tcl command 
1740: 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6e 6e  for each.** conn
1750: 65 63 74 69 6f 6e 20 69 74 20 6f 70 65 6e 73 20  ection it opens 
1760: 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74  to an SQLite dat
1770: 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75  abase.  This rou
1780: 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 0a  tine is invoked.
1790: 2a 2a 20 77 68 65 6e 65 76 65 72 20 6f 6e 65 20  ** whenever one 
17a0: 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74  of those connect
17b0: 69 6f 6e 2d 73 70 65 63 69 66 69 63 20 63 6f 6d  ion-specific com
17c0: 6d 61 6e 64 73 20 69 73 20 65 78 65 63 75 74 65  mands is execute
17d0: 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e 20 20 46 6f  d.** in Tcl.  Fo
17e0: 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 79 6f  r example, if yo
17f0: 75 20 72 75 6e 20 54 63 6c 20 63 6f 64 65 20 6c  u run Tcl code l
1800: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
1810: 20 20 20 20 20 20 73 71 6c 69 74 65 20 64 62 31        sqlite db1
1820: 20 20 22 6d 79 5f 64 61 74 61 62 61 73 65 22 0a    "my_database".
1830: 2a 2a 20 20 20 20 20 20 20 64 62 31 20 63 6c 6f  **       db1 clo
1840: 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  se.**.** The fir
1850: 73 74 20 63 6f 6d 6d 61 6e 64 20 6f 70 65 6e 73  st command opens
1860: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   a connection to
1870: 20 74 68 65 20 22 6d 79 5f 64 61 74 61 62 61 73   the "my_databas
1880: 65 22 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61  e" database.** a
1890: 6e 64 20 63 61 6c 6c 73 20 74 68 61 74 20 63 6f  nd calls that co
18a0: 6e 6e 65 63 74 69 6f 6e 20 22 64 62 31 22 2e 20  nnection "db1". 
18b0: 20 54 68 65 20 73 65 63 6f 6e 64 20 63 6f 6d 6d   The second comm
18c0: 61 6e 64 20 63 61 75 73 65 73 20 74 68 69 73 0a  and causes this.
18d0: 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f  ** subroutine to
18e0: 20 62 65 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a   be invoked..*/.
18f0: 73 74 61 74 69 63 20 69 6e 74 20 44 62 4f 62 6a  static int DbObj
1900: 43 6d 64 28 76 6f 69 64 20 2a 63 64 2c 20 54 63  Cmd(void *cd, Tc
1910: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1920: 2c 20 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f  , int objc,Tcl_O
1930: 62 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b  bj *const*objv){
1940: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
1950: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64   = (SqliteDb*)cd
1960: 3b 0a 20 20 69 6e 74 20 63 68 6f 69 63 65 3b 0a  ;.  int choice;.
1970: 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a 44    static char *D
1980: 42 5f 6f 70 74 53 74 72 73 5b 5d 20 3d 20 7b 0a  B_optStrs[] = {.
1990: 20 20 20 20 20 22 62 75 73 79 22 2c 20 20 20 22       "busy",   "
19a0: 63 6c 6f 73 65 22 2c 20 20 22 63 6f 6d 70 6c 65  close",  "comple
19b0: 74 65 22 2c 20 20 22 65 76 61 6c 22 2c 20 20 22  te",  "eval",  "
19c0: 74 69 6d 65 6f 75 74 22 2c 20 30 0a 20 20 7d 3b  timeout", 0.  };
19d0: 0a 20 20 65 6e 75 6d 20 44 42 5f 6f 70 74 73 20  .  enum DB_opts 
19e0: 7b 0a 20 20 20 20 20 44 42 5f 42 55 53 59 2c 20  {.     DB_BUSY, 
19f0: 20 44 42 5f 43 4c 4f 53 45 2c 20 44 42 5f 43 4f   DB_CLOSE, DB_CO
1a00: 4d 50 4c 45 54 45 2c 20 44 42 5f 45 56 41 4c 2c  MPLETE, DB_EVAL,
1a10: 20 44 42 5f 54 49 4d 45 4f 55 54 0a 20 20 7d 3b   DB_TIMEOUT.  };
1a20: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29  ..  if( objc<2 )
1a30: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
1a40: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
1a50: 2c 20 6f 62 6a 76 2c 20 22 53 55 42 43 4f 4d 4d  , objv, "SUBCOMM
1a60: 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72  AND ...");.    r
1a70: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1a80: 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
1a90: 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69  etIndexFromObj(i
1aa0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
1ab0: 44 42 5f 6f 70 74 53 74 72 73 2c 20 22 6f 70 74  DB_optStrs, "opt
1ac0: 69 6f 6e 22 2c 20 30 2c 20 26 63 68 6f 69 63 65  ion", 0, &choice
1ad0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1ae0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1af0: 20 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d 20    switch( (enum 
1b00: 44 42 5f 6f 70 74 73 29 63 68 6f 69 63 65 20 29  DB_opts)choice )
1b10: 7b 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 62  {..  /*    $db b
1b20: 75 73 79 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20  usy ?CALLBACK?. 
1b30: 20 2a 2a 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65 20   **.  ** Invoke 
1b40: 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  the given callba
1b50: 63 6b 20 69 66 20 61 6e 20 53 51 4c 20 73 74 61  ck if an SQL sta
1b60: 74 65 6d 65 6e 74 20 61 74 74 65 6d 70 74 73 20  tement attempts 
1b70: 74 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 6c  to open.  ** a l
1b80: 6f 63 6b 65 64 20 64 61 74 61 62 61 73 65 20 66  ocked database f
1b90: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ile..  */.  case
1ba0: 20 44 42 5f 42 55 53 59 3a 20 7b 0a 20 20 20 20   DB_BUSY: {.    
1bb0: 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20  if( objc>3 ){.  
1bc0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
1bd0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
1be0: 6f 62 6a 76 2c 20 22 43 41 4c 4c 42 41 43 4b 22  objv, "CALLBACK"
1bf0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1c00: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
1c10: 65 6c 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32  else if( objc==2
1c20: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44   ){.      if( pD
1c30: 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20  b->zBusy ){.    
1c40: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1c50: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62  sult(interp, pDb
1c60: 2d 3e 7a 42 75 73 79 2c 20 30 29 3b 0a 20 20 20  ->zBusy, 0);.   
1c70: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
1c80: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 42 75 73        char *zBus
1c90: 79 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  y;.      int len
1ca0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
1cb0: 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20  >zBusy ){.      
1cc0: 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e    Tcl_Free(pDb->
1cd0: 7a 42 75 73 79 29 3b 0a 20 20 20 20 20 20 7d 0a  zBusy);.      }.
1ce0: 20 20 20 20 20 20 7a 42 75 73 79 20 3d 20 54 63        zBusy = Tc
1cf0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
1d00: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e  bj(objv[2], &len
1d10: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 42 75  );.      if( zBu
1d20: 73 79 20 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20  sy && len>0 ){. 
1d30: 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73         pDb->zBus
1d40: 79 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c  y = Tcl_Alloc( l
1d50: 65 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20  en + 1 );.      
1d60: 20 20 73 74 72 63 70 79 28 70 44 62 2d 3e 7a 42    strcpy(pDb->zB
1d70: 75 73 79 2c 20 7a 42 75 73 79 29 3b 0a 20 20 20  usy, zBusy);.   
1d80: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d90: 20 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d 20 30    pDb->zBusy = 0
1da0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1db0: 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29  if( pDb->zBusy )
1dc0: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69  {.        pDb->i
1dd0: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
1de0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 5f 62          sqlite_b
1df0: 75 73 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d  usy_handler(pDb-
1e00: 3e 64 62 2c 20 44 62 42 75 73 79 48 61 6e 64 6c  >db, DbBusyHandl
1e10: 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20  er, pDb);.      
1e20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
1e30: 71 6c 69 74 65 5f 62 75 73 79 5f 68 61 6e 64 6c  qlite_busy_handl
1e40: 65 72 28 70 44 62 2d 3e 64 62 2c 20 30 2c 20 30  er(pDb->db, 0, 0
1e50: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
1e60: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
1e70: 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 63 6c 6f  .  /*    $db clo
1e80: 73 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 68 75  se.  **.  ** Shu
1e90: 74 64 6f 77 6e 20 74 68 65 20 64 61 74 61 62 61  tdown the databa
1ea0: 73 65 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44  se.  */.  case D
1eb0: 42 5f 43 4c 4f 53 45 3a 20 7b 0a 20 20 20 20 54  B_CLOSE: {.    T
1ec0: 63 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64  cl_DeleteCommand
1ed0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1ee0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
1ef0: 6a 76 5b 30 5d 2c 20 30 29 29 3b 0a 20 20 20 20  jv[0], 0));.    
1f00: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
1f10: 20 20 20 20 24 64 62 20 63 6f 6d 70 6c 65 74 65      $db complete
1f20: 20 53 51 4c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52   SQL.  **.  ** R
1f30: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 53 51  eturn TRUE if SQ
1f40: 4c 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20  L is a complete 
1f50: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  SQL statement.  
1f60: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 0a  Return FALSE if.
1f70: 20 20 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20    ** additional 
1f80: 6c 69 6e 65 73 20 6f 66 20 69 6e 70 75 74 20 61  lines of input a
1f90: 72 65 20 6e 65 65 64 65 64 2e 20 20 54 68 69 73  re needed.  This
1fa0: 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74   is similar to t
1fb0: 68 65 0a 20 20 2a 2a 20 62 75 69 6c 74 2d 69 6e  he.  ** built-in
1fc0: 20 22 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 22   "info complete"
1fd0: 20 63 6f 6d 6d 61 6e 64 20 6f 66 20 54 63 6c 2e   command of Tcl.
1fe0: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
1ff0: 43 4f 4d 50 4c 45 54 45 3a 20 7b 0a 20 20 20 20  COMPLETE: {.    
2000: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74  Tcl_Obj *pResult
2010: 3b 0a 20 20 20 20 69 6e 74 20 69 73 43 6f 6d 70  ;.    int isComp
2020: 6c 65 74 65 3b 0a 20 20 20 20 69 66 28 20 6f 62  lete;.    if( ob
2030: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54  jc!=3 ){.      T
2040: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
2050: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
2060: 20 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20 72   "SQL");.      r
2070: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2080: 0a 20 20 20 20 7d 0a 20 20 20 20 69 73 43 6f 6d  .    }.    isCom
2090: 70 6c 65 74 65 20 3d 20 73 71 6c 69 74 65 5f 63  plete = sqlite_c
20a0: 6f 6d 70 6c 65 74 65 28 20 54 63 6c 5f 47 65 74  omplete( Tcl_Get
20b0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
20c0: 6a 76 5b 32 5d 2c 20 30 29 20 29 3b 0a 20 20 20  jv[2], 0) );.   
20d0: 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47   pResult = Tcl_G
20e0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
20f0: 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  rp);.    Tcl_Set
2100: 42 6f 6f 6c 65 61 6e 4f 62 6a 28 70 52 65 73 75  BooleanObj(pResu
2110: 6c 74 2c 20 69 73 43 6f 6d 70 6c 65 74 65 29 3b  lt, isComplete);
2120: 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  .    break;.  }.
2130: 20 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20     .  /*.  **   
2140: 20 24 64 62 20 65 76 61 6c 20 24 73 71 6c 20 3f   $db eval $sql ?
2150: 61 72 72 61 79 20 7b 20 20 2e 2e 2e 63 6f 64 65  array {  ...code
2160: 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 0a 20 20 2a 2a  ... }?.  **.  **
2170: 20 54 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   The SQL stateme
2180: 6e 74 20 69 6e 20 24 73 71 6c 20 69 73 20 65 76  nt in $sql is ev
2190: 61 6c 75 61 74 65 64 2e 20 20 46 6f 72 20 65 61  aluated.  For ea
21a0: 63 68 20 72 6f 77 2c 20 74 68 65 20 76 61 6c 75  ch row, the valu
21b0: 65 73 20 61 72 65 0a 20 20 2a 2a 20 70 6c 61 63  es are.  ** plac
21c0: 65 64 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20 6f  ed in elements o
21d0: 66 20 74 68 65 20 61 72 72 61 79 20 6e 61 6d 65  f the array name
21e0: 64 20 22 61 72 72 61 79 22 20 61 6e 64 20 2e 2e  d "array" and ..
21f0: 2e 63 6f 64 65 2e 2e 2e 20 69 73 20 65 78 65 63  .code... is exec
2200: 75 74 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22 61  uted..  ** If "a
2210: 72 72 61 79 22 20 61 6e 64 20 22 63 6f 64 65 22  rray" and "code"
2220: 20 61 72 65 20 6f 6d 69 74 74 65 64 2c 20 74 68   are omitted, th
2230: 65 6e 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 20 69  en no callback i
2240: 73 20 65 76 65 72 79 20 69 6e 76 6f 6b 65 64 2e  s every invoked.
2250: 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22  .  ** If "array"
2260: 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72   is an empty str
2270: 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 76 61  ing, then the va
2280: 6c 75 65 73 20 61 72 65 20 70 6c 61 63 65 64 20  lues are placed 
2290: 69 6e 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a  in variables.  *
22a0: 2a 20 74 68 61 74 20 68 61 76 65 20 74 68 65 20  * that have the 
22b0: 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68 65  same name as the
22c0: 20 66 69 65 6c 64 73 20 65 78 74 72 61 63 74 65   fields extracte
22d0: 64 20 62 79 20 74 68 65 20 71 75 65 72 79 2e 0a  d by the query..
22e0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45    */.  case DB_E
22f0: 56 41 4c 3a 20 7b 0a 20 20 20 20 43 61 6c 6c 62  VAL: {.    Callb
2300: 61 63 6b 44 61 74 61 20 63 62 44 61 74 61 3b 0a  ackData cbData;.
2310: 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73      char *zErrMs
2320: 67 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  g;.    char *zSq
2330: 6c 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 23  l;.    int rc;.#
2340: 69 66 64 65 66 20 55 54 46 5f 54 52 41 4e 53 4c  ifdef UTF_TRANSL
2350: 41 54 49 4f 4e 5f 4e 45 45 44 45 44 0a 20 20 20  ATION_NEEDED.   
2360: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 64 53 71   Tcl_DString dSq
2370: 6c 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69  l;.#endif..    i
2380: 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62  f( objc!=5 && ob
2390: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54  jc!=3 ){.      T
23a0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
23b0: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
23c0: 20 22 53 51 4c 20 3f 41 52 52 41 59 2d 4e 41 4d   "SQL ?ARRAY-NAM
23d0: 45 20 43 4f 44 45 3f 22 29 3b 0a 20 20 20 20 20  E CODE?");.     
23e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
23f0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 62  R;.    }.    pDb
2400: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
2410: 70 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 54 63  p;.    zSql = Tc
2420: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
2430: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a  bj(objv[2], 0);.
2440: 23 69 66 64 65 66 20 55 54 46 5f 54 52 41 4e 53  #ifdef UTF_TRANS
2450: 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 0a 20 20  LATION_NEEDED.  
2460: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
2470: 74 28 26 64 53 71 6c 29 3b 0a 20 20 20 20 54 63  t(&dSql);.    Tc
2480: 6c 5f 55 74 66 54 6f 45 78 74 65 72 6e 61 6c 44  l_UtfToExternalD
2490: 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 20 7a 53 71  String(NULL, zSq
24a0: 6c 2c 20 2d 31 2c 20 26 64 53 71 6c 29 3b 0a 20  l, -1, &dSql);. 
24b0: 20 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 44 53     zSql = Tcl_DS
24c0: 74 72 69 6e 67 56 61 6c 75 65 28 26 64 53 71 6c  tringValue(&dSql
24d0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 54 63  );.#endif.    Tc
24e0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 6f  l_IncrRefCount(o
24f0: 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28  bjv[2]);.    if(
2500: 20 6f 62 6a 63 3d 3d 35 20 29 7b 0a 20 20 20 20   objc==5 ){.    
2510: 20 20 63 62 44 61 74 61 2e 69 6e 74 65 72 70 20    cbData.interp 
2520: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
2530: 63 62 44 61 74 61 2e 6f 6e 63 65 20 3d 20 31 3b  cbData.once = 1;
2540: 0a 20 20 20 20 20 20 63 62 44 61 74 61 2e 7a 41  .      cbData.zA
2550: 72 72 61 79 20 3d 20 54 63 6c 5f 47 65 74 53 74  rray = Tcl_GetSt
2560: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
2570: 5b 33 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 63  [3], 0);.      c
2580: 62 44 61 74 61 2e 70 43 6f 64 65 20 3d 20 6f 62  bData.pCode = ob
2590: 6a 76 5b 34 5d 3b 0a 20 20 20 20 20 20 63 62 44  jv[4];.      cbD
25a0: 61 74 61 2e 74 63 6c 5f 72 63 20 3d 20 54 43 4c  ata.tcl_rc = TCL
25b0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7a 45 72 72 4d  _OK;.      zErrM
25c0: 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 54 63  sg = 0;.      Tc
25d0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 6f  l_IncrRefCount(o
25e0: 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 20 20 54  bjv[3]);.      T
25f0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
2600: 6f 62 6a 76 5b 34 5d 29 3b 0a 20 20 20 20 20 20  objv[4]);.      
2610: 72 63 20 3d 20 73 71 6c 69 74 65 5f 65 78 65 63  rc = sqlite_exec
2620: 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  (pDb->db, zSql, 
2630: 44 62 45 76 61 6c 43 61 6c 6c 62 61 63 6b 2c 20  DbEvalCallback, 
2640: 26 63 62 44 61 74 61 2c 20 26 7a 45 72 72 4d 73  &cbData, &zErrMs
2650: 67 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 44 65  g);.      Tcl_De
2660: 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76 5b  crRefCount(objv[
2670: 34 5d 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 44  4]);.      Tcl_D
2680: 65 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76  ecrRefCount(objv
2690: 5b 33 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [3]);.      if( 
26a0: 63 62 44 61 74 61 2e 74 63 6c 5f 72 63 3d 3d 54  cbData.tcl_rc==T
26b0: 43 4c 5f 42 52 45 41 4b 20 29 7b 20 63 62 44 61  CL_BREAK ){ cbDa
26c0: 74 61 2e 74 63 6c 5f 72 63 20 3d 20 54 43 4c 5f  ta.tcl_rc = TCL_
26d0: 4f 4b 3b 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b  OK; }.    }else{
26e0: 0a 20 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  .      Tcl_Obj *
26f0: 70 4c 69 73 74 20 3d 20 54 63 6c 5f 4e 65 77 4f  pList = Tcl_NewO
2700: 62 6a 28 29 3b 0a 20 20 20 20 20 20 63 62 44 61  bj();.      cbDa
2710: 74 61 2e 74 63 6c 5f 72 63 20 3d 20 54 43 4c 5f  ta.tcl_rc = TCL_
2720: 4f 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  OK;.      rc = s
2730: 71 6c 69 74 65 5f 65 78 65 63 28 70 44 62 2d 3e  qlite_exec(pDb->
2740: 64 62 2c 20 7a 53 71 6c 2c 20 44 62 45 76 61 6c  db, zSql, DbEval
2750: 43 61 6c 6c 62 61 63 6b 32 2c 20 70 4c 69 73 74  Callback2, pList
2760: 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  , &zErrMsg);.   
2770: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
2780: 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 4c 69 73  ult(interp, pLis
2790: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  t);.    }.    if
27a0: 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ( zErrMsg ){.   
27b0: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
27c0: 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 4d 73 67  (interp, zErrMsg
27d0: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
27e0: 0a 20 20 20 20 20 20 66 72 65 65 28 7a 45 72 72  .      free(zErr
27f0: 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  Msg);.      rc =
2800: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
2810: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2820: 3d 20 63 62 44 61 74 61 2e 74 63 6c 5f 72 63 3b  = cbData.tcl_rc;
2830: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44  .    }.    Tcl_D
2840: 65 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76  ecrRefCount(objv
2850: 5b 32 5d 29 3b 0a 23 69 66 64 65 66 20 55 54 46  [2]);.#ifdef UTF
2860: 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45  _TRANSLATION_NEE
2870: 44 45 44 0a 20 20 20 20 54 63 6c 5f 44 53 74 72  DED.    Tcl_DStr
2880: 69 6e 67 46 72 65 65 28 26 64 53 71 6c 29 3b 0a  ingFree(&dSql);.
2890: 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
28a0: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  n rc;.  }..  /*.
28b0: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 74 69 6d    **     $db tim
28c0: 65 6f 75 74 20 4d 49 4c 4c 45 53 45 43 4f 4e 44  eout MILLESECOND
28d0: 53 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 65 6c 61  S.  **.  ** Dela
28e0: 79 20 66 6f 72 20 74 68 65 20 6e 75 6d 62 65 72  y for the number
28f0: 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
2900: 20 73 70 65 63 69 66 69 65 64 20 77 68 65 6e 20   specified when 
2910: 61 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64  a file is locked
2920: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
2930: 5f 54 49 4d 45 4f 55 54 3a 20 7b 0a 20 20 20 20  _TIMEOUT: {.    
2940: 69 6e 74 20 6d 73 3b 0a 20 20 20 20 69 66 28 20  int ms;.    if( 
2950: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20  objc!=3 ){.     
2960: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
2970: 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
2980: 76 2c 20 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53  v, "MILLISECONDS
2990: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
29a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
29b0: 7d 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  }.    if( Tcl_Ge
29c0: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
29d0: 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6d 73  rp, objv[2], &ms
29e0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
29f0: 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65  RROR;.    sqlite
2a00: 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 70 44  _busy_timeout(pD
2a10: 62 2d 3e 64 62 2c 20 6d 73 29 3b 0a 20 20 20 20  b->db, ms);.    
2a20: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 7d 20 2f  break;.  }.  } /
2a30: 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 53 57 49  * End of the SWI
2a40: 54 43 48 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  TCH statement */
2a50: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2a60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 73 71 6c  ;.}../*.**   sql
2a70: 69 74 65 20 44 42 4e 41 4d 45 20 46 49 4c 45 4e  ite DBNAME FILEN
2a80: 41 4d 45 20 3f 4d 4f 44 45 3f 0a 2a 2a 0a 2a 2a  AME ?MODE?.**.**
2a90: 20 54 68 69 73 20 69 73 20 74 68 65 20 6d 61 69   This is the mai
2aa0: 6e 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20 20  n Tcl command.  
2ab0: 57 68 65 6e 20 74 68 65 20 22 73 71 6c 69 74 65  When the "sqlite
2ac0: 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 69 73  " Tcl command is
2ad0: 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2c 20 74 68 69  .** invoked, thi
2ae0: 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 74  s routine runs t
2af0: 6f 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 63  o process that c
2b00: 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  ommand..**.** Th
2b10: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
2b20: 2c 20 44 42 4e 41 4d 45 2c 20 69 73 20 61 6e 20  , DBNAME, is an 
2b30: 61 72 62 69 74 72 61 72 79 20 6e 61 6d 65 20 66  arbitrary name f
2b40: 6f 72 20 61 20 6e 65 77 0a 2a 2a 20 64 61 74 61  or a new.** data
2b50: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
2b60: 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63    This command c
2b70: 72 65 61 74 65 73 20 61 20 6e 65 77 20 63 6f 6d  reates a new com
2b80: 6d 61 6e 64 20 6e 61 6d 65 64 0a 2a 2a 20 44 42  mand named.** DB
2b90: 4e 41 4d 45 20 74 68 61 74 20 69 73 20 75 73 65  NAME that is use
2ba0: 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 61  d to control tha
2bb0: 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54  t connection.  T
2bc0: 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63  he database.** c
2bd0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 64 65 6c  onnection is del
2be0: 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 44 42  eted when the DB
2bf0: 4e 41 4d 45 20 63 6f 6d 6d 61 6e 64 20 69 73 20  NAME command is 
2c00: 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  deleted..**.** T
2c10: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
2c20: 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  nt is the name o
2c30: 66 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20  f the directory 
2c40: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  that contains.**
2c50: 20 74 68 65 20 73 71 6c 69 74 65 20 64 61 74 61   the sqlite data
2c60: 62 61 73 65 20 74 68 61 74 20 69 73 20 74 6f 20  base that is to 
2c70: 62 65 20 61 63 63 65 73 73 65 64 2e 0a 2a 2a 0a  be accessed..**.
2c80: 2a 2a 20 46 6f 72 20 74 65 73 74 69 6e 67 20 70  ** For testing p
2c90: 75 72 70 6f 73 65 73 2c 20 77 65 20 61 6c 73 6f  urposes, we also
2ca0: 20 73 75 70 70 6f 72 74 20 74 68 65 20 66 6f 6c   support the fol
2cb0: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 73  lowing:.**.**  s
2cc0: 71 6c 69 74 65 20 2d 65 6e 63 6f 64 69 6e 67 0a  qlite -encoding.
2cd0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 52 65 74 75  **.**       Retu
2ce0: 72 6e 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  rn the encoding 
2cf0: 75 73 65 64 20 62 79 20 4c 49 4b 45 20 61 6e 64  used by LIKE and
2d00: 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72 73 2e   GLOB operators.
2d10: 20 20 43 68 6f 69 63 65 73 0a 2a 2a 20 20 20 20    Choices.**    
2d20: 20 20 20 61 72 65 20 55 54 46 2d 38 20 61 6e 64     are UTF-8 and
2d30: 20 69 73 6f 38 38 35 39 2e 0a 2a 2a 0a 2a 2a 20   iso8859..**.** 
2d40: 20 73 71 6c 69 74 65 20 2d 74 63 6c 2d 75 73 65   sqlite -tcl-use
2d50: 73 2d 75 74 66 0a 2a 2a 0a 2a 2a 20 20 20 20 20  s-utf.**.**     
2d60: 20 20 52 65 74 75 72 6e 20 22 31 22 20 69 66 20    Return "1" if 
2d70: 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 61 20  compiled with a 
2d80: 54 63 6c 20 75 73 65 73 20 55 54 46 2d 38 2e 20  Tcl uses UTF-8. 
2d90: 20 52 65 74 75 72 6e 20 22 30 22 20 69 66 0a 2a   Return "0" if.*
2da0: 2a 20 20 20 20 20 20 20 6e 6f 74 2e 20 20 55 73  *       not.  Us
2db0: 65 64 20 62 79 20 74 65 73 74 73 20 74 6f 20 6d  ed by tests to m
2dc0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 69 62  ake sure the lib
2dd0: 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65  rary was compile
2de0: 64 20 0a 2a 2a 20 20 20 20 20 20 20 63 6f 72 72  d .**       corr
2df0: 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ectly..*/.static
2e00: 20 69 6e 74 20 44 62 4d 61 69 6e 28 76 6f 69 64   int DbMain(void
2e10: 20 2a 63 64 2c 20 54 63 6c 5f 49 6e 74 65 72 70   *cd, Tcl_Interp
2e20: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 61 72   *interp, int ar
2e30: 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29  gc, char **argv)
2e40: 7b 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20  {.  int mode;.  
2e50: 53 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 63  SqliteDb *p;.  c
2e60: 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 0a 20 20  har *zErrMsg;.  
2e70: 69 66 28 20 61 72 67 63 3d 3d 32 20 29 7b 0a 20  if( argc==2 ){. 
2e80: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72     if( strcmp(ar
2e90: 67 76 5b 31 5d 2c 22 2d 65 6e 63 6f 64 69 6e 67  gv[1],"-encoding
2ea0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 54  ")==0 ){.      T
2eb0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2ec0: 69 6e 74 65 72 70 2c 73 71 6c 69 74 65 5f 65 6e  interp,sqlite_en
2ed0: 63 6f 64 69 6e 67 2c 30 29 3b 0a 20 20 20 20 20  coding,0);.     
2ee0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2ef0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
2f00: 72 63 6d 70 28 61 72 67 76 5b 31 5d 2c 22 2d 74  rcmp(argv[1],"-t
2f10: 63 6c 2d 75 73 65 73 2d 75 74 66 22 29 3d 3d 30  cl-uses-utf")==0
2f20: 20 29 7b 0a 23 69 66 64 65 66 20 54 43 4c 5f 55   ){.#ifdef TCL_U
2f30: 54 46 5f 4d 41 58 0a 20 20 20 20 20 20 54 63 6c  TF_MAX.      Tcl
2f40: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
2f50: 74 65 72 70 2c 22 31 22 2c 30 29 3b 0a 23 65 6c  terp,"1",0);.#el
2f60: 73 65 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  se.      Tcl_App
2f70: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2f80: 2c 22 30 22 2c 30 29 3b 0a 23 65 6e 64 69 66 0a  ,"0",0);.#endif.
2f90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
2fa0: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
2fb0: 20 69 66 28 20 61 72 67 63 21 3d 33 20 26 26 20   if( argc!=3 && 
2fc0: 61 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  argc!=4 ){.    T
2fd0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2fe0: 69 6e 74 65 72 70 2c 22 77 72 6f 6e 67 20 23 20  interp,"wrong # 
2ff0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
3000: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
3010: 20 20 20 20 20 22 20 48 41 4e 44 4c 45 20 46 49       " HANDLE FI
3020: 4c 45 4e 41 4d 45 20 3f 4d 4f 44 45 3f 5c 22 22  LENAME ?MODE?\""
3030: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
3040: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
3050: 20 20 69 66 28 20 61 72 67 63 3d 3d 33 20 29 7b    if( argc==3 ){
3060: 0a 20 20 20 20 6d 6f 64 65 20 3d 20 30 36 36 36  .    mode = 0666
3070: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 54 63  ;.  }else if( Tc
3080: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
3090: 20 61 72 67 76 5b 33 5d 2c 20 26 6d 6f 64 65 29   argv[3], &mode)
30a0: 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20  !=TCL_OK ){.    
30b0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
30c0: 3b 0a 20 20 7d 0a 20 20 7a 45 72 72 4d 73 67 20  ;.  }.  zErrMsg 
30d0: 3d 20 30 3b 0a 20 20 70 20 3d 20 28 53 71 6c 69  = 0;.  p = (Sqli
30e0: 74 65 44 62 2a 29 54 63 6c 5f 41 6c 6c 6f 63 28  teDb*)Tcl_Alloc(
30f0: 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
3100: 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
3110: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
3120: 6e 74 65 72 70 2c 20 22 6d 61 6c 6c 6f 63 20 66  nterp, "malloc f
3130: 61 69 6c 65 64 22 2c 20 54 43 4c 5f 53 54 41 54  ailed", TCL_STAT
3140: 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  IC);.    return 
3150: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
3160: 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
3170: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 70 2d 3e  zeof(*p));.  p->
3180: 64 62 20 3d 20 73 71 6c 69 74 65 5f 6f 70 65 6e  db = sqlite_open
3190: 28 61 72 67 76 5b 32 5d 2c 20 6d 6f 64 65 2c 20  (argv[2], mode, 
31a0: 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28  &zErrMsg);.  if(
31b0: 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20   p->db==0 ){.   
31c0: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
31d0: 6e 74 65 72 70 2c 20 7a 45 72 72 4d 73 67 2c 20  nterp, zErrMsg, 
31e0: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20  TCL_VOLATILE);. 
31f0: 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61     Tcl_Free((cha
3200: 72 2a 29 70 29 3b 0a 20 20 20 20 66 72 65 65 28  r*)p);.    free(
3210: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 72 65  zErrMsg);.    re
3220: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
3230: 20 20 7d 0a 20 20 54 63 6c 5f 43 72 65 61 74 65    }.  Tcl_Create
3240: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
3250: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 44 62 4f 62  p, argv[1], DbOb
3260: 6a 43 6d 64 2c 20 28 63 68 61 72 2a 29 70 2c 20  jCmd, (char*)p, 
3270: 44 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a 20 20  DbDeleteCmd);.  
3280: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
3290: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
32a0: 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a  ze this module..
32b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 63 6c 20 6d  **.** This Tcl m
32c0: 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6f  odule contains o
32d0: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 6e 65 77  nly a single new
32e0: 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d   Tcl command nam
32f0: 65 64 20 22 73 71 6c 69 74 65 22 2e 0a 2a 2a 20  ed "sqlite"..** 
3300: 28 48 65 6e 63 65 20 74 68 65 72 65 20 69 73 20  (Hence there is 
3310: 6e 6f 20 6e 61 6d 65 73 70 61 63 65 2e 20 20 54  no namespace.  T
3320: 68 65 72 65 20 69 73 20 6e 6f 20 70 6f 69 6e 74  here is no point
3330: 20 69 6e 20 75 73 69 6e 67 20 61 20 6e 61 6d 65   in using a name
3340: 73 70 61 63 65 0a 2a 2a 20 69 66 20 74 68 65 20  space.** if the 
3350: 65 78 74 65 6e 73 69 6f 6e 20 6f 6e 6c 79 20 73  extension only s
3360: 75 70 70 6c 69 65 73 20 6f 6e 65 20 6e 65 77 20  upplies one new 
3370: 6e 61 6d 65 21 29 20 20 54 68 65 20 22 73 71 6c  name!)  The "sql
3380: 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20 69 73 0a  ite" command is.
3390: 2a 2a 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20  ** used to open 
33a0: 61 20 6e 65 77 20 53 51 4c 69 74 65 20 64 61 74  a new SQLite dat
33b0: 61 62 61 73 65 2e 20 20 53 65 65 20 74 68 65 20  abase.  See the 
33c0: 44 62 4d 61 69 6e 28 29 20 72 6f 75 74 69 6e 65  DbMain() routine
33d0: 20 61 62 6f 76 65 0a 2a 2a 20 66 6f 72 20 61 64   above.** for ad
33e0: 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
33f0: 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 53 71 6c  tion..*/.int Sql
3400: 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  ite_Init(Tcl_Int
3410: 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20  erp *interp){.  
3420: 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e  Tcl_CreateComman
3430: 64 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  d(interp, "sqlit
3440: 65 22 2c 20 44 62 4d 61 69 6e 2c 20 30 2c 20 30  e", DbMain, 0, 0
3450: 29 3b 0a 20 20 54 63 6c 5f 50 6b 67 50 72 6f 76  );.  Tcl_PkgProv
3460: 69 64 65 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  ide(interp, "sql
3470: 69 74 65 22 2c 20 22 31 2e 30 22 29 3b 0a 20 20  ite", "1.0");.  
3480: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
3490: 0a 69 6e 74 20 53 71 6c 69 74 65 5f 53 61 66 65  .int Sqlite_Safe
34a0: 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20  Init(Tcl_Interp 
34b0: 2a 69 6e 74 65 72 70 29 7b 0a 20 20 72 65 74 75  *interp){.  retu
34c0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69  rn TCL_OK;.}..#i
34d0: 66 20 30 0a 2f 2a 0a 2a 2a 20 49 66 20 63 6f 6d  f 0./*.** If com
34e0: 70 69 6c 65 64 20 75 73 69 6e 67 20 6d 6b 74 63  piled using mktc
34f0: 6c 61 70 70 2c 20 74 68 69 73 20 72 6f 75 74 69  lapp, this routi
3500: 6e 65 20 72 75 6e 73 20 74 6f 20 69 6e 69 74 69  ne runs to initi
3510: 61 6c 69 7a 65 0a 2a 2a 20 65 76 65 72 79 74 68  alize.** everyth
3520: 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 45 74 5f 41  ing..*/.int Et_A
3530: 70 70 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72  ppInit(Tcl_Inter
3540: 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 72 65  p *interp){.  re
3550: 74 75 72 6e 20 53 71 6c 69 74 65 5f 49 6e 69 74  turn Sqlite_Init
3560: 28 69 6e 74 65 72 70 29 3b 0a 7d 0a 23 65 6e 64  (interp);.}.#end
3570: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  if../*.** If the
3580: 20 6d 61 63 72 6f 20 54 43 4c 53 48 20 69 73 20   macro TCLSH is 
3590: 64 65 66 69 6e 65 64 20 61 6e 64 20 69 73 20 6f  defined and is o
35a0: 6e 65 2c 20 74 68 65 6e 20 70 75 74 20 69 6e 20  ne, then put in 
35b0: 63 6f 64 65 20 66 6f 72 20 74 68 65 0a 2a 2a 20  code for the.** 
35c0: 22 6d 61 69 6e 22 20 72 6f 75 74 69 6e 65 20 74  "main" routine t
35d0: 68 61 74 20 77 69 6c 6c 20 69 6e 69 74 69 61 6c  hat will initial
35e0: 69 7a 65 20 54 63 6c 2e 0a 2a 2f 0a 23 69 66 20  ize Tcl..*/.#if 
35f0: 64 65 66 69 6e 65 64 28 54 43 4c 53 48 29 20 26  defined(TCLSH) &
3600: 26 20 54 43 4c 53 48 3d 3d 31 0a 73 74 61 74 69  & TCLSH==1.stati
3610: 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f 6f 70  c char zMainloop
3620: 5b 5d 20 3d 0a 20 20 22 73 65 74 20 6c 69 6e 65  [] =.  "set line
3630: 20 7b 7d 5c 6e 22 0a 20 20 22 77 68 69 6c 65 20   {}\n".  "while 
3640: 7b 21 5b 65 6f 66 20 73 74 64 69 6e 5d 7d 20 7b  {![eof stdin]} {
3650: 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b 24 6c 69  \n".    "if {$li
3660: 6e 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20  ne!=\"\"} {\n". 
3670: 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65       "puts -none
3680: 77 6c 69 6e 65 20 5c 22 3e 20 5c 22 5c 6e 22 0a  wline \"> \"\n".
3690: 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22      "} else {\n"
36a0: 0a 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f  .      "puts -no
36b0: 6e 65 77 6c 69 6e 65 20 5c 22 25 20 5c 22 5c 6e  newline \"% \"\n
36c0: 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20  ".    "}\n".    
36d0: 22 66 6c 75 73 68 20 73 74 64 6f 75 74 5c 6e 22  "flush stdout\n"
36e0: 0a 20 20 20 20 22 61 70 70 65 6e 64 20 6c 69 6e  .    "append lin
36f0: 65 20 5b 67 65 74 73 20 73 74 64 69 6e 5d 5c 6e  e [gets stdin]\n
3700: 22 0a 20 20 20 20 22 69 66 20 7b 5b 69 6e 66 6f  ".    "if {[info
3710: 20 63 6f 6d 70 6c 65 74 65 20 24 6c 69 6e 65 5d   complete $line]
3720: 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 69 66  } {\n".      "if
3730: 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65 76 65   {[catch {upleve
3740: 6c 20 23 30 20 24 6c 69 6e 65 7d 20 72 65 73 75  l #0 $line} resu
3750: 6c 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  lt]} {\n".      
3760: 20 20 22 70 75 74 73 20 73 74 64 65 72 72 20 5c    "puts stderr \
3770: 22 45 72 72 6f 72 3a 20 24 72 65 73 75 6c 74 5c  "Error: $result\
3780: 22 5c 6e 22 0a 20 20 20 20 20 20 22 7d 20 65 6c  "\n".      "} el
3790: 73 65 69 66 20 7b 24 72 65 73 75 6c 74 21 3d 5c  seif {$result!=\
37a0: 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  "\"} {\n".      
37b0: 20 20 22 70 75 74 73 20 24 72 65 73 75 6c 74 5c    "puts $result\
37c0: 6e 22 0a 20 20 20 20 20 20 22 7d 5c 6e 22 0a 20  n".      "}\n". 
37d0: 20 20 20 20 20 22 73 65 74 20 6c 69 6e 65 20 7b       "set line {
37e0: 7d 5c 6e 22 0a 20 20 20 20 22 7d 20 65 6c 73 65  }\n".    "} else
37f0: 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 61 70 70   {\n".      "app
3800: 65 6e 64 20 6c 69 6e 65 20 5c 5c 6e 5c 6e 22 0a  end line \\n\n".
3810: 20 20 20 20 22 7d 5c 6e 22 0a 20 20 22 7d 5c 6e      "}\n".  "}\n
3820: 22 0a 3b 0a 0a 23 64 65 66 69 6e 65 20 54 43 4c  ".;..#define TCL
3830: 53 48 5f 4d 41 49 4e 20 6d 61 69 6e 20 20 20 2f  SH_MAIN main   /
3840: 2a 20 4e 65 65 64 65 64 20 74 6f 20 66 61 6b 65  * Needed to fake
3850: 20 6f 75 74 20 6d 6b 74 63 6c 61 70 70 20 2a 2f   out mktclapp */
3860: 0a 69 6e 74 20 54 43 4c 53 48 5f 4d 41 49 4e 28  .int TCLSH_MAIN(
3870: 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a  int argc, char *
3880: 2a 61 72 67 76 29 7b 0a 20 20 54 63 6c 5f 49 6e  *argv){.  Tcl_In
3890: 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20  terp *interp;.  
38a0: 54 63 6c 5f 46 69 6e 64 45 78 65 63 75 74 61 62  Tcl_FindExecutab
38b0: 6c 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69  le(argv[0]);.  i
38c0: 6e 74 65 72 70 20 3d 20 54 63 6c 5f 43 72 65 61  nterp = Tcl_Crea
38d0: 74 65 49 6e 74 65 72 70 28 29 3b 0a 20 20 53 71  teInterp();.  Sq
38e0: 6c 69 74 65 5f 49 6e 69 74 28 69 6e 74 65 72 70  lite_Init(interp
38f0: 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
3900: 5f 54 45 53 54 0a 20 20 7b 0a 20 20 20 20 65 78  _TEST.  {.    ex
3910: 74 65 72 6e 20 69 6e 74 20 53 71 6c 69 74 65 74  tern int Sqlitet
3920: 65 73 74 31 5f 49 6e 69 74 28 54 63 6c 5f 49 6e  est1_Init(Tcl_In
3930: 74 65 72 70 2a 29 3b 0a 20 20 20 20 65 78 74 65  terp*);.    exte
3940: 72 6e 20 69 6e 74 20 4d 64 35 5f 49 6e 69 74 28  rn int Md5_Init(
3950: 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20  Tcl_Interp*);.  
3960: 20 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e    Sqlitetest1_In
3970: 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
3980: 4d 64 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  Md5_Init(interp)
3990: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
39a0: 66 28 20 61 72 67 63 3e 3d 32 20 29 7b 0a 20 20  f( argc>=2 ){.  
39b0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 54 63 6c    int i;.    Tcl
39c0: 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22  _SetVar(interp,"
39d0: 61 72 67 76 30 22 2c 61 72 67 76 5b 31 5d 2c 54  argv0",argv[1],T
39e0: 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
39f0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28  .    Tcl_SetVar(
3a00: 69 6e 74 65 72 70 2c 22 61 72 67 76 22 2c 20 22  interp,"argv", "
3a10: 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  ", TCL_GLOBAL_ON
3a20: 4c 59 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 32  LY);.    for(i=2
3a30: 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
3a40: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72        Tcl_SetVar
3a50: 28 69 6e 74 65 72 70 2c 20 22 61 72 67 76 22 2c  (interp, "argv",
3a60: 20 61 72 67 76 5b 69 5d 2c 0a 20 20 20 20 20 20   argv[i],.      
3a70: 20 20 20 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f      TCL_GLOBAL_O
3a80: 4e 4c 59 20 7c 20 54 43 4c 5f 4c 49 53 54 5f 45  NLY | TCL_LIST_E
3a90: 4c 45 4d 45 4e 54 20 7c 20 54 43 4c 5f 41 50 50  LEMENT | TCL_APP
3aa0: 45 4e 44 5f 56 41 4c 55 45 29 3b 0a 20 20 20 20  END_VALUE);.    
3ab0: 7d 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 45 76  }.    if( Tcl_Ev
3ac0: 61 6c 46 69 6c 65 28 69 6e 74 65 72 70 2c 20 61  alFile(interp, a
3ad0: 72 67 76 5b 31 5d 29 21 3d 54 43 4c 5f 4f 4b 20  rgv[1])!=TCL_OK 
3ae0: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
3af0: 49 6e 66 6f 20 3d 20 54 63 6c 5f 47 65 74 56 61  Info = Tcl_GetVa
3b00: 72 28 69 6e 74 65 72 70 2c 20 22 65 72 72 6f 72  r(interp, "error
3b10: 49 6e 66 6f 22 2c 20 54 43 4c 5f 47 4c 4f 42 41  Info", TCL_GLOBA
3b20: 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 69  L_ONLY);.      i
3b30: 66 28 20 7a 49 6e 66 6f 3d 3d 30 20 29 20 7a 49  f( zInfo==0 ) zI
3b40: 6e 66 6f 20 3d 20 69 6e 74 65 72 70 2d 3e 72 65  nfo = interp->re
3b50: 73 75 6c 74 3b 0a 20 20 20 20 20 20 66 70 72 69  sult;.      fpri
3b60: 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a 20  ntf(stderr,"%s: 
3b70: 25 73 5c 6e 22 2c 20 2a 61 72 67 76 2c 20 7a 49  %s\n", *argv, zI
3b80: 6e 66 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75  nfo);.      retu
3b90: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  rn 1;.    }.  }e
3ba0: 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 47 6c 6f  lse{.    Tcl_Glo
3bb0: 62 61 6c 45 76 61 6c 28 69 6e 74 65 72 70 2c 20  balEval(interp, 
3bc0: 7a 4d 61 69 6e 6c 6f 6f 70 29 3b 0a 20 20 7d 0a  zMainloop);.  }.
3bd0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
3be0: 6e 64 69 66 20 2f 2a 20 54 43 4c 53 48 20 2a 2f  ndif /* TCLSH */
3bf0: 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  ..#endif /* !def
3c00: 69 6e 65 64 28 4e 4f 5f 54 43 4c 29 20 2a 2f 0a  ined(NO_TCL) */.