/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 6ced80832c13e70dae5a176da2dff3d5f4801d92:


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 36 20 32 30 30 30  ite.c,v 1.6 2000
03e0: 2f 30 38 2f 30 34 20 31 33 3a 34 39 3a 30 32 20  /08/04 13:49:02 
03f0: 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e  drh Exp $.*/.#in
0400: 63 6c 75 64 65 20 22 73 71 6c 69 74 65 2e 68 22  clude "sqlite.h"
0410: 0a 23 69 6e 63 6c 75 64 65 20 3c 74 63 6c 2e 68  .#include <tcl.h
0420: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  >.#include <stdl
0430: 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ib.h>.#include <
0440: 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a 0a 2a 2a  string.h>../*.**
0450: 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 69 6e   There is one in
0460: 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73  stance of this s
0470: 74 72 75 63 74 75 72 65 20 66 6f 72 20 65 61 63  tructure for eac
0480: 68 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  h SQLite databas
0490: 65 0a 2a 2a 20 74 68 61 74 20 68 61 73 20 62 65  e.** that has be
04a0: 65 6e 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65  en opened by the
04b0: 20 53 51 4c 69 74 65 20 54 43 4c 20 69 6e 74 65   SQLite TCL inte
04c0: 72 66 61 63 65 2e 0a 2a 2f 0a 74 79 70 65 64 65  rface..*/.typede
04d0: 66 20 73 74 72 75 63 74 20 53 71 6c 69 74 65 44  f struct SqliteD
04e0: 62 20 53 71 6c 69 74 65 44 62 3b 0a 73 74 72 75  b SqliteDb;.stru
04f0: 63 74 20 53 71 6c 69 74 65 44 62 20 7b 0a 20 20  ct SqliteDb {.  
0500: 73 71 6c 69 74 65 20 2a 64 62 3b 20 20 20 20 20  sqlite *db;     
0510: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 22 72 65        /* The "re
0520: 61 6c 22 20 64 61 74 61 62 61 73 65 20 73 74 72  al" database str
0530: 75 63 74 75 72 65 20 2a 2f 0a 20 20 54 63 6c 5f  ucture */.  Tcl_
0540: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 20  Interp *interp; 
0550: 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 72 70 72    /* The interpr
0560: 65 74 65 72 20 75 73 65 64 20 66 6f 72 20 74 68  eter used for th
0570: 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
0580: 20 63 68 61 72 20 2a 7a 42 75 73 79 3b 20 20 20   char *zBusy;   
0590: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 61         /* The na
05a0: 6d 65 20 6f 66 20 74 68 65 20 62 75 73 79 20 63  me of the busy c
05b0: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
05c0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  */.};../*.** An 
05d0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
05e0: 20 73 74 72 75 63 74 75 72 65 20 70 61 73 73 65   structure passe
05f0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68  s information th
0600: 72 75 20 74 68 65 20 73 71 6c 69 74 65 0a 2a 2a  ru the sqlite.**
0610: 20 6c 6f 67 69 63 20 66 72 6f 6d 20 74 68 65 20   logic from the 
0620: 6f 72 69 67 69 6e 61 6c 20 54 43 4c 20 63 6f 6d  original TCL com
0630: 6d 61 6e 64 20 69 6e 74 6f 20 74 68 65 20 63 61  mand into the ca
0640: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 2e 0a  llback routine..
0650: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
0660: 74 20 43 61 6c 6c 62 61 63 6b 44 61 74 61 20 43  t CallbackData C
0670: 61 6c 6c 62 61 63 6b 44 61 74 61 3b 0a 73 74 72  allbackData;.str
0680: 75 63 74 20 43 61 6c 6c 62 61 63 6b 44 61 74 61  uct CallbackData
0690: 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20   {.  Tcl_Interp 
06a0: 2a 69 6e 74 65 72 70 3b 20 20 20 20 20 20 20 2f  *interp;       /
06b0: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
06c0: 72 65 74 65 72 20 2a 2f 0a 20 20 63 68 61 72 20  reter */.  char 
06d0: 2a 7a 41 72 72 61 79 3b 20 20 20 20 20 20 20 20  *zArray;        
06e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 61 72 72 61       /* The arra
06f0: 79 20 69 6e 74 6f 20 77 68 69 63 68 20 64 61 74  y into which dat
0700: 61 20 69 73 20 77 72 69 74 74 65 6e 20 2a 2f 0a  a is written */.
0710: 20 20 63 68 61 72 20 2a 7a 43 6f 64 65 3b 20 20    char *zCode;  
0720: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0730: 68 65 20 63 6f 64 65 20 74 6f 20 65 78 65 63 75  he code to execu
0740: 74 65 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  te for each row 
0750: 2a 2f 0a 20 20 69 6e 74 20 6f 6e 63 65 3b 20 20  */.  int once;  
0760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
0770: 2a 20 53 65 74 20 6f 6e 6c 79 20 66 6f 72 20 74  * Set only for t
0780: 68 65 20 66 69 72 73 74 20 69 6e 76 6f 63 61 74  he first invocat
0790: 69 6f 6e 20 6f 66 20 63 61 6c 6c 62 61 63 6b 20  ion of callback 
07a0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  */.};../*.** Cal
07b0: 6c 65 64 20 66 6f 72 20 65 61 63 68 20 72 6f 77  led for each row
07c0: 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2e 0a   of the result..
07d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
07e0: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 0a 20 20  EvalCallback(.  
07f0: 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61  void *clientData
0800: 2c 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 73  ,      /* An ins
0810: 74 61 6e 63 65 20 6f 66 20 43 61 6c 6c 62 61 63  tance of Callbac
0820: 6b 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e  kData */.  int n
0830: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
0840: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
0850: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
0860: 73 75 6c 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  sult */.  char *
0870: 2a 20 61 7a 43 6f 6c 2c 20 20 20 20 20 20 20 20  * azCol,        
0880: 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 65 61 63   /* Data for eac
0890: 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68  h column */.  ch
08a0: 61 72 20 2a 2a 20 61 7a 4e 20 20 20 20 20 20 20  ar ** azN       
08b0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 66 6f 72       /* Name for
08c0: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a   each column */.
08d0: 29 7b 0a 20 20 43 61 6c 6c 62 61 63 6b 44 61 74  ){.  CallbackDat
08e0: 61 20 2a 63 62 44 61 74 61 20 3d 20 28 43 61 6c  a *cbData = (Cal
08f0: 6c 62 61 63 6b 44 61 74 61 2a 29 63 6c 69 65 6e  lbackData*)clien
0900: 74 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 2c 20  tData;.  int i, 
0910: 72 63 3b 0a 20 20 69 66 28 20 63 62 44 61 74 61  rc;.  if( cbData
0920: 2d 3e 7a 41 72 72 61 79 5b 30 5d 20 29 7b 0a 20  ->zArray[0] ){. 
0930: 20 20 20 69 66 28 20 63 62 44 61 74 61 2d 3e 6f     if( cbData->o
0940: 6e 63 65 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  nce ){.      for
0950: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
0960: 2b 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  +){.        Tcl_
0970: 53 65 74 56 61 72 32 28 63 62 44 61 74 61 2d 3e  SetVar2(cbData->
0980: 69 6e 74 65 72 70 2c 20 63 62 44 61 74 61 2d 3e  interp, cbData->
0990: 7a 41 72 72 61 79 2c 20 22 2a 22 2c 20 61 7a 4e  zArray, "*", azN
09a0: 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [i],.           
09b0: 54 43 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45 4e 54  TCL_LIST_ELEMENT
09c0: 7c 54 43 4c 5f 41 50 50 45 4e 44 5f 56 41 4c 55  |TCL_APPEND_VALU
09d0: 45 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  E);.      }.    
09e0: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  }.    for(i=0; i
09f0: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
0a00: 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 43     char *z = azC
0a10: 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28  ol[i];.      if(
0a20: 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a   z==0 ) z = "";.
0a30: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72        Tcl_SetVar
0a40: 32 28 63 62 44 61 74 61 2d 3e 69 6e 74 65 72 70  2(cbData->interp
0a50: 2c 20 63 62 44 61 74 61 2d 3e 7a 41 72 72 61 79  , cbData->zArray
0a60: 2c 20 61 7a 4e 5b 69 5d 2c 20 7a 2c 20 30 29 3b  , azN[i], z, 0);
0a70: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
0a80: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
0a90: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
0aa0: 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 43 6f 6c   char *z = azCol
0ab0: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  [i];.      if( z
0ac0: 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20  ==0 ) z = "";.  
0ad0: 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 63      Tcl_SetVar(c
0ae0: 62 44 61 74 61 2d 3e 69 6e 74 65 72 70 2c 20 61  bData->interp, a
0af0: 7a 4e 5b 69 5d 2c 20 7a 2c 20 30 29 3b 0a 20 20  zN[i], z, 0);.  
0b00: 20 20 7d 0a 20 20 7d 0a 20 20 63 62 44 61 74 61    }.  }.  cbData
0b10: 2d 3e 6f 6e 63 65 20 3d 20 30 3b 0a 20 20 72 63  ->once = 0;.  rc
0b20: 20 3d 20 54 63 6c 5f 45 76 61 6c 28 63 62 44 61   = Tcl_Eval(cbDa
0b30: 74 61 2d 3e 69 6e 74 65 72 70 2c 20 63 62 44 61  ta->interp, cbDa
0b40: 74 61 2d 3e 7a 43 6f 64 65 29 3b 0a 20 20 72 65  ta->zCode);.  re
0b50: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
0b60: 2a 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  * Called when th
0b70: 65 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64 65 6c  e command is del
0b80: 65 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eted..*/.static 
0b90: 76 6f 69 64 20 44 62 44 65 6c 65 74 65 43 6d 64  void DbDeleteCmd
0ba0: 28 76 6f 69 64 20 2a 64 62 29 7b 0a 20 20 53 71  (void *db){.  Sq
0bb0: 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53  liteDb *pDb = (S
0bc0: 71 6c 69 74 65 44 62 2a 29 64 62 3b 0a 20 20 73  qliteDb*)db;.  s
0bd0: 71 6c 69 74 65 5f 63 6c 6f 73 65 28 70 44 62 2d  qlite_close(pDb-
0be0: 3e 64 62 29 3b 0a 20 20 69 66 28 20 70 44 62 2d  >db);.  if( pDb-
0bf0: 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20 54 63  >zBusy ){.    Tc
0c00: 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42 75 73  l_Free(pDb->zBus
0c10: 79 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 46 72  y);.  }.  Tcl_Fr
0c20: 65 65 28 28 63 68 61 72 2a 29 70 44 62 29 3b 0a  ee((char*)pDb);.
0c30: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
0c40: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
0c50: 77 68 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  when a database 
0c60: 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20 77  file is locked w
0c70: 68 69 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74  hile trying.** t
0c80: 6f 20 65 78 65 63 75 74 65 20 53 51 4c 2e 0a 2a  o execute SQL..*
0c90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62 42  /.static int DbB
0ca0: 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20  usyHandler(void 
0cb0: 2a 63 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *cd, const char 
0cc0: 2a 7a 54 61 62 6c 65 2c 20 69 6e 74 20 6e 54 72  *zTable, int nTr
0cd0: 69 65 73 29 7b 0a 20 20 53 71 6c 69 74 65 44 62  ies){.  SqliteDb
0ce0: 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44   *pDb = (SqliteD
0cf0: 62 2a 29 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b  b*)cd;.  int rc;
0d00: 0a 20 20 63 68 61 72 20 7a 56 61 6c 5b 33 30 5d  .  char zVal[30]
0d10: 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a  ;.  char *zCmd;.
0d20: 20 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 3b    char *zResult;
0d30: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 63  .  Tcl_DString c
0d40: 6d 64 3b 0a 0a 20 20 54 63 6c 5f 44 53 74 72 69  md;..  Tcl_DStri
0d50: 6e 67 49 6e 69 74 28 26 63 6d 64 29 3b 0a 20 20  ngInit(&cmd);.  
0d60: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
0d70: 64 28 26 63 6d 64 2c 20 70 44 62 2d 3e 7a 42 75  d(&cmd, pDb->zBu
0d80: 73 79 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44  sy, -1);.  Tcl_D
0d90: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
0da0: 65 6e 74 28 26 63 6d 64 2c 20 7a 54 61 62 6c 65  ent(&cmd, zTable
0db0: 29 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 56 61  );.  sprintf(zVa
0dc0: 6c 2c 20 22 20 25 64 22 2c 20 6e 54 72 69 65 73  l, " %d", nTries
0dd0: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
0de0: 41 70 70 65 6e 64 28 26 63 6d 64 2c 20 7a 56 61  Append(&cmd, zVa
0df0: 6c 2c 20 2d 31 29 3b 0a 20 20 7a 43 6d 64 20 3d  l, -1);.  zCmd =
0e00: 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75   Tcl_DStringValu
0e10: 65 28 26 63 6d 64 29 3b 0a 20 20 72 63 20 3d 20  e(&cmd);.  rc = 
0e20: 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e  Tcl_Eval(pDb->in
0e30: 74 65 72 70 2c 20 7a 43 6d 64 29 3b 0a 20 20 54  terp, zCmd);.  T
0e40: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
0e50: 63 6d 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  cmd);.  if( rc!=
0e60: 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54  TCL_OK || atoi(T
0e70: 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
0e80: 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29  lt(pDb->interp))
0e90: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
0ea0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31  ;.  }.  return 1
0eb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22  ;.}../*.** The "
0ec0: 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20  sqlite" command 
0ed0: 62 65 6c 6f 77 20 63 72 65 61 74 65 73 20 61 20  below creates a 
0ee0: 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20  new Tcl command 
0ef0: 66 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6e 6e  for each.** conn
0f00: 65 63 74 69 6f 6e 20 69 74 20 6f 70 65 6e 73 20  ection it opens 
0f10: 74 6f 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74  to an SQLite dat
0f20: 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75  abase.  This rou
0f30: 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 0a  tine is invoked.
0f40: 2a 2a 20 77 68 65 6e 65 76 65 72 20 6f 6e 65 20  ** whenever one 
0f50: 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74  of those connect
0f60: 69 6f 6e 2d 73 70 65 63 69 66 69 63 20 63 6f 6d  ion-specific com
0f70: 6d 61 6e 64 73 20 69 73 20 65 78 65 63 75 74 65  mands is execute
0f80: 64 0a 2a 2a 20 69 6e 20 54 63 6c 2e 20 20 46 6f  d.** in Tcl.  Fo
0f90: 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 79 6f  r example, if yo
0fa0: 75 20 72 75 6e 20 54 63 6c 20 63 6f 64 65 20 6c  u run Tcl code l
0fb0: 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20  ike this:.**.** 
0fc0: 20 20 20 20 20 20 73 71 6c 69 74 65 20 64 62 31        sqlite db1
0fd0: 20 20 22 6d 79 5f 64 61 74 61 62 61 73 65 22 0a    "my_database".
0fe0: 2a 2a 20 20 20 20 20 20 20 64 62 31 20 63 6c 6f  **       db1 clo
0ff0: 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  se.**.** The fir
1000: 73 74 20 63 6f 6d 6d 61 6e 64 20 6f 70 65 6e 73  st command opens
1010: 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f   a connection to
1020: 20 74 68 65 20 22 6d 79 5f 64 61 74 61 62 61 73   the "my_databas
1030: 65 22 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61  e" database.** a
1040: 6e 64 20 63 61 6c 6c 73 20 74 68 61 74 20 63 6f  nd calls that co
1050: 6e 6e 65 63 74 69 6f 6e 20 22 64 62 31 22 2e 20  nnection "db1". 
1060: 20 54 68 65 20 73 65 63 6f 6e 64 20 63 6f 6d 6d   The second comm
1070: 61 6e 64 20 63 61 75 73 65 73 20 74 68 69 73 0a  and causes this.
1080: 2a 2a 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f  ** subroutine to
1090: 20 62 65 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a   be invoked..*/.
10a0: 73 74 61 74 69 63 20 69 6e 74 20 44 62 43 6d 64  static int DbCmd
10b0: 28 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49  (void *cd, Tcl_I
10c0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69  nterp *interp, i
10d0: 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a  nt argc, char **
10e0: 61 72 67 76 29 7b 0a 20 20 63 68 61 72 20 2a 7a  argv){.  char *z
10f0: 3b 0a 20 20 69 6e 74 20 6e 2c 20 63 3b 0a 20 20  ;.  int n, c;.  
1100: 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20  SqliteDb *pDb = 
1110: 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a 20  (SqliteDb*)cd;. 
1120: 20 69 66 28 20 61 72 67 63 3c 32 20 29 7b 0a 20   if( argc<2 ){. 
1130: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1140: 75 6c 74 28 69 6e 74 65 72 70 2c 22 77 72 6f 6e  ult(interp,"wron
1150: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1160: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
1170: 2c 0a 20 20 20 20 20 20 20 20 22 20 53 55 42 43  ,.        " SUBC
1180: 4f 4d 4d 41 4e 44 20 2e 2e 2e 5c 22 22 2c 20 30  OMMAND ...\"", 0
1190: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
11a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
11b0: 20 3d 20 61 72 67 76 5b 31 5d 3b 0a 20 20 6e 20   = argv[1];.  n 
11c0: 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 63  = strlen(z);.  c
11d0: 20 3d 20 7a 5b 30 5d 3b 0a 0a 20 20 2f 2a 20 20   = z[0];..  /*  
11e0: 20 20 24 64 62 20 62 75 73 79 20 3f 43 41 4c 4c    $db busy ?CALL
11f0: 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20  BACK?.  **.  ** 
1200: 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e  Invoke the given
1210: 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 61 6e 20   callback if an 
1220: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61 74  SQL statement at
1230: 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 0a 20  tempts to open. 
1240: 20 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 64 61 74   ** a locked dat
1250: 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f  abase file..  */
1260: 0a 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26  .  if( c=='b' &&
1270: 20 73 74 72 6e 63 6d 70 28 7a 2c 22 62 75 73 79   strncmp(z,"busy
1280: 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ",n)==0 ){.    i
1290: 66 28 20 61 72 67 63 3e 33 20 29 7b 0a 20 20 20  f( argc>3 ){.   
12a0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
12b0: 75 6c 74 28 69 6e 74 65 72 70 2c 22 77 72 6f 6e  ult(interp,"wron
12c0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
12d0: 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
12e0: 20 20 61 72 67 76 5b 30 5d 2c 20 22 20 62 75 73    argv[0], " bus
12f0: 79 20 3f 43 41 4c 4c 42 41 43 4b 3f 22 2c 20 30  y ?CALLBACK?", 0
1300: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1310: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
1320: 65 6c 73 65 20 69 66 28 20 61 72 67 63 3d 3d 32  else if( argc==2
1330: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 44   ){.      if( pD
1340: 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20  b->zBusy ){.    
1350: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1360: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62  sult(interp, pDb
1370: 2d 3e 7a 42 75 73 79 2c 20 30 29 3b 0a 20 20 20  ->zBusy, 0);.   
1380: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
1390: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
13a0: 42 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20  Busy ){.        
13b0: 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42  Tcl_Free(pDb->zB
13c0: 75 73 79 29 3b 0a 20 20 20 20 20 20 20 20 70 44  usy);.        pD
13d0: 62 2d 3e 7a 42 75 73 79 20 3d 20 30 3b 0a 20 20  b->zBusy = 0;.  
13e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
13f0: 61 72 67 76 5b 32 5d 5b 30 5d 20 29 7b 0a 20 20  argv[2][0] ){.  
1400: 20 20 20 20 20 20 70 44 62 2d 3e 7a 42 75 73 79        pDb->zBusy
1410: 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 74   = Tcl_Alloc( st
1420: 72 6c 65 6e 28 61 72 67 76 5b 32 5d 29 20 2b 20  rlen(argv[2]) + 
1430: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1 );.        if(
1440: 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20   pDb->zBusy ){. 
1450: 20 20 20 20 20 20 20 20 20 73 74 72 63 70 79 28           strcpy(
1460: 70 44 62 2d 3e 7a 42 75 73 79 2c 20 61 72 67 76  pDb->zBusy, argv
1470: 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  [2]);.        }.
1480: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1490: 28 20 70 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a  ( pDb->zBusy ){.
14a0: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e 74          pDb->int
14b0: 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20  erp = interp;.  
14c0: 20 20 20 20 20 20 73 71 6c 69 74 65 5f 62 75 73        sqlite_bus
14d0: 79 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64  y_handler(pDb->d
14e0: 62 2c 20 44 62 42 75 73 79 48 61 6e 64 6c 65 72  b, DbBusyHandler
14f0: 2c 20 70 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a  , pDb);.      }.
1500: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
1510: 20 2f 2a 20 20 20 20 24 64 62 20 63 6c 6f 73 65   /*    $db close
1520: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 68 75 74 64  .  **.  ** Shutd
1530: 6f 77 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  own the database
1540: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27  .  */.  if( c=='
1550: 63 27 20 26 26 20 6e 3e 3d 32 20 26 26 20 73 74  c' && n>=2 && st
1560: 72 6e 63 6d 70 28 7a 2c 22 63 6c 6f 73 65 22 2c  rncmp(z,"close",
1570: 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c  n)==0 ){.    Tcl
1580: 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64 28 69  _DeleteCommand(i
1590: 6e 74 65 72 70 2c 20 61 72 67 76 5b 30 5d 29 3b  nterp, argv[0]);
15a0: 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 20  .  }else..  /*  
15b0: 20 20 24 64 62 20 63 6f 6d 70 6c 65 74 65 20 53    $db complete S
15c0: 51 4c 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74  QL.  **.  ** Ret
15d0: 75 72 6e 20 54 52 55 45 20 69 66 20 53 51 4c 20  urn TRUE if SQL 
15e0: 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 53 51  is a complete SQ
15f0: 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65  L statement.  Re
1600: 74 75 72 6e 20 46 41 4c 53 45 20 69 66 0a 20 20  turn FALSE if.  
1610: 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 69  ** additional li
1620: 6e 65 73 20 6f 66 20 69 6e 70 75 74 20 61 72 65  nes of input are
1630: 20 6e 65 65 64 65 64 2e 20 20 54 68 69 73 20 69   needed.  This i
1640: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 68 65  s similar to the
1650: 0a 20 20 2a 2a 20 62 75 69 6c 74 2d 69 6e 20 22  .  ** built-in "
1660: 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 22 20 63  info complete" c
1670: 6f 6d 6d 61 6e 64 20 6f 66 20 54 63 6c 2e 0a 20  ommand of Tcl.. 
1680: 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 63 27   */.  if( c=='c'
1690: 20 26 26 20 6e 3e 3d 32 20 26 26 20 73 74 72 6e   && n>=2 && strn
16a0: 63 6d 70 28 7a 2c 22 63 6f 6d 70 6c 65 74 65 22  cmp(z,"complete"
16b0: 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68  ,n)==0 ){.    ch
16c0: 61 72 20 2a 7a 52 65 73 3b 0a 20 20 20 20 69 66  ar *zRes;.    if
16d0: 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20  ( argc!=3 ){.   
16e0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
16f0: 75 6c 74 28 69 6e 74 65 72 70 2c 22 77 72 6f 6e  ult(interp,"wron
1700: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1710: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
1720: 2c 0a 20 20 20 20 20 20 20 20 20 20 22 20 63 6f  ,.          " co
1730: 6d 70 6c 65 74 65 20 53 51 4c 5c 22 22 2c 20 30  mplete SQL\"", 0
1740: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1750: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
1760: 0a 20 20 20 20 7a 52 65 73 20 3d 20 73 71 6c 69  .    zRes = sqli
1770: 74 65 5f 63 6f 6d 70 6c 65 74 65 28 61 72 67 76  te_complete(argv
1780: 5b 32 5d 29 20 3f 20 22 31 22 20 3a 20 22 30 22  [2]) ? "1" : "0"
1790: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  ;.    Tcl_SetRes
17a0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 52 65 73  ult(interp, zRes
17b0: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
17c0: 0a 20 20 7d 65 6c 73 65 0a 20 20 20 0a 20 20 2f  .  }else.   .  /
17d0: 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20 65 76  *.  **    $db ev
17e0: 61 6c 20 24 73 71 6c 20 3f 61 72 72 61 79 20 7b  al $sql ?array {
17f0: 20 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 7d 3f 0a    ...code... }?.
1800: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51    **.  ** The SQ
1810: 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 24  L statement in $
1820: 73 71 6c 20 69 73 20 65 76 61 6c 75 61 74 65 64  sql is evaluated
1830: 2e 20 20 46 6f 72 20 65 61 63 68 20 72 6f 77 2c  .  For each row,
1840: 20 74 68 65 20 76 61 6c 75 65 73 20 61 72 65 0a   the values are.
1850: 20 20 2a 2a 20 70 6c 61 63 65 64 20 69 6e 20 65    ** placed in e
1860: 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 61  lements of the a
1870: 72 72 61 79 20 6e 61 6d 65 64 20 22 61 72 72 61  rray named "arra
1880: 79 22 20 61 6e 64 20 2e 2e 2e 63 6f 64 65 2e 2e  y" and ...code..
1890: 2e 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20  . is executed.. 
18a0: 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22 20 61   ** If "array" a
18b0: 6e 64 20 22 63 6f 64 65 22 20 61 72 65 20 6f 6d  nd "code" are om
18c0: 69 74 74 65 64 2c 20 74 68 65 6e 20 6e 6f 20 63  itted, then no c
18d0: 61 6c 6c 62 61 63 6b 20 69 73 20 65 76 65 72 79  allback is every
18e0: 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 2a 2a 20 49   invoked..  ** I
18f0: 66 20 22 61 72 72 61 79 22 20 69 73 20 61 6e 20  f "array" is an 
1900: 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 74 68  empty string, th
1910: 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20 61 72  en the values ar
1920: 65 20 70 6c 61 63 65 64 20 69 6e 20 76 61 72 69  e placed in vari
1930: 61 62 6c 65 73 0a 20 20 2a 2a 20 74 68 61 74 20  ables.  ** that 
1940: 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 6e 61  have the same na
1950: 6d 65 20 61 73 20 74 68 65 20 66 69 65 6c 64 73  me as the fields
1960: 20 65 78 74 72 61 63 74 65 64 20 62 79 20 74 68   extracted by th
1970: 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a 20 20  e query..  */.  
1980: 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74  if( c=='e' && st
1990: 72 6e 63 6d 70 28 7a 2c 22 65 76 61 6c 22 2c 6e  rncmp(z,"eval",n
19a0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 43 61 6c 6c  )==0 ){.    Call
19b0: 62 61 63 6b 44 61 74 61 20 63 62 44 61 74 61 3b  backData cbData;
19c0: 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  .    char *zErrM
19d0: 73 67 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  sg;.    int rc;.
19e0: 0a 20 20 20 20 69 66 28 20 61 72 67 63 21 3d 35  .    if( argc!=5
19f0: 20 26 26 20 61 72 67 63 21 3d 33 20 29 7b 0a 20   && argc!=3 ){. 
1a00: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
1a10: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 77 72  esult(interp,"wr
1a20: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1a30: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
1a40: 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 22 20 65  0],.         " e
1a50: 76 61 6c 20 53 51 4c 20 3f 41 52 52 41 59 2d 4e  val SQL ?ARRAY-N
1a60: 41 4d 45 20 43 4f 44 45 3f 22 2c 20 30 29 3b 0a  AME CODE?", 0);.
1a70: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
1a80: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
1a90: 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20    pDb->interp = 
1aa0: 69 6e 74 65 72 70 3b 0a 20 20 20 20 69 66 28 20  interp;.    if( 
1ab0: 61 72 67 63 3d 3d 35 20 29 7b 0a 20 20 20 20 20  argc==5 ){.     
1ac0: 20 63 62 44 61 74 61 2e 69 6e 74 65 72 70 20 3d   cbData.interp =
1ad0: 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20 63   interp;.      c
1ae0: 62 44 61 74 61 2e 6f 6e 63 65 20 3d 20 31 3b 0a  bData.once = 1;.
1af0: 20 20 20 20 20 20 63 62 44 61 74 61 2e 7a 41 72        cbData.zAr
1b00: 72 61 79 20 3d 20 61 72 67 76 5b 33 5d 3b 0a 20  ray = argv[3];. 
1b10: 20 20 20 20 20 63 62 44 61 74 61 2e 7a 43 6f 64       cbData.zCod
1b20: 65 20 3d 20 61 72 67 76 5b 34 5d 3b 0a 20 20 20  e = argv[4];.   
1b30: 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a     zErrMsg = 0;.
1b40: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1b50: 65 5f 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20  e_exec(pDb->db, 
1b60: 61 72 67 76 5b 32 5d 2c 20 44 62 45 76 61 6c 43  argv[2], DbEvalC
1b70: 61 6c 6c 62 61 63 6b 2c 20 26 63 62 44 61 74 61  allback, &cbData
1b80: 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  , &zErrMsg);.   
1b90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1ba0: 20 3d 20 73 71 6c 69 74 65 5f 65 78 65 63 28 70   = sqlite_exec(p
1bb0: 44 62 2d 3e 64 62 2c 20 61 72 67 76 5b 32 5d 2c  Db->db, argv[2],
1bc0: 20 30 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67 29   0, 0, &zErrMsg)
1bd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1be0: 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
1bf0: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
1c00: 6e 74 65 72 70 2c 20 7a 45 72 72 4d 73 67 2c 20  nterp, zErrMsg, 
1c10: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20  TCL_VOLATILE);. 
1c20: 20 20 20 20 20 66 72 65 65 28 7a 45 72 72 4d 73       free(zErrMs
1c30: 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  g);.    }.    re
1c40: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 65 6c 73 65  turn rc;.  }else
1c50: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  /*.  **     
1c60: 24 64 62 20 74 69 6d 65 6f 75 74 20 4d 49 4c 4c  $db timeout MILL
1c70: 45 53 45 43 4f 4e 44 53 0a 20 20 2a 2a 0a 20 20  ESECONDS.  **.  
1c80: 2a 2a 20 44 65 6c 61 79 20 66 6f 72 20 74 68 65  ** Delay for the
1c90: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
1ca0: 73 65 63 6f 6e 64 73 20 73 70 65 63 69 66 69 65  seconds specifie
1cb0: 64 20 77 68 65 6e 20 61 20 66 69 6c 65 20 69 73  d when a file is
1cc0: 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a 20 20   locked..  */.  
1cd0: 69 66 28 20 63 3d 3d 27 74 27 20 26 26 20 73 74  if( c=='t' && st
1ce0: 72 6e 63 6d 70 28 7a 2c 22 74 69 6d 65 6f 75 74  rncmp(z,"timeout
1cf0: 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ",n)==0 ){.    i
1d00: 6e 74 20 6d 73 3b 0a 20 20 20 20 69 66 28 20 61  nt ms;.    if( a
1d10: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  rgc!=3 ){.      
1d20: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1d30: 28 69 6e 74 65 72 70 2c 22 77 72 6f 6e 67 20 23  (interp,"wrong #
1d40: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1d50: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
1d60: 20 20 20 20 20 20 20 20 20 22 20 74 69 6d 65 6f           " timeo
1d70: 75 74 20 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22  ut MILLISECONDS"
1d80: 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
1d90: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1da0: 20 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c 5f    }.    if( Tcl_
1db0: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
1dc0: 72 67 76 5b 32 5d 2c 20 26 6d 73 29 20 29 20 72  rgv[2], &ms) ) r
1dd0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1de0: 0a 20 20 20 20 73 71 6c 69 74 65 5f 62 75 73 79  .    sqlite_busy
1df0: 5f 74 69 6d 65 6f 75 74 28 70 44 62 2d 3e 64 62  _timeout(pDb->db
1e00: 2c 20 6d 73 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  , ms);.  }else..
1e10: 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74    /* The default
1e20: 0a 20 20 2a 2f 0a 20 20 7b 0a 20 20 20 20 54 63  .  */.  {.    Tc
1e30: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1e40: 6e 74 65 72 70 2c 22 75 6e 6b 6e 6f 77 6e 20 73  nterp,"unknown s
1e50: 75 62 63 6f 6d 6d 61 6e 64 20 5c 22 22 2c 20 7a  ubcommand \"", z
1e60: 2c 20 0a 20 20 20 20 20 20 20 20 22 5c 22 20 2d  , .        "\" -
1e70: 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f   should be one o
1e80: 66 3a 20 63 6c 6f 73 65 20 63 6f 6d 70 6c 65 74  f: close complet
1e90: 65 20 65 76 61 6c 22 2c 20 30 29 3b 0a 20 20 20  e eval", 0);.   
1ea0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1eb0: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
1ec0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1ed0: 20 20 20 73 71 6c 69 74 65 20 44 42 4e 41 4d 45     sqlite DBNAME
1ee0: 20 46 49 4c 45 4e 41 4d 45 20 3f 4d 4f 44 45 3f   FILENAME ?MODE?
1ef0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74  .**.** This is t
1f00: 68 65 20 6d 61 69 6e 20 54 63 6c 20 63 6f 6d 6d  he main Tcl comm
1f10: 61 6e 64 2e 20 20 57 68 65 6e 20 74 68 65 20 22  and.  When the "
1f20: 73 71 6c 69 74 65 22 20 54 63 6c 20 63 6f 6d 6d  sqlite" Tcl comm
1f30: 61 6e 64 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65  and is.** invoke
1f40: 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  d, this routine 
1f50: 72 75 6e 73 20 74 6f 20 70 72 6f 63 65 73 73 20  runs to process 
1f60: 74 68 61 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  that command..**
1f70: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
1f80: 67 75 6d 65 6e 74 2c 20 44 42 4e 41 4d 45 2c 20  gument, DBNAME, 
1f90: 69 73 20 61 6e 20 61 72 62 69 74 72 61 72 79 20  is an arbitrary 
1fa0: 6e 61 6d 65 20 66 6f 72 20 61 20 6e 65 77 0a 2a  name for a new.*
1fb0: 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
1fc0: 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 63 6f 6d  ction.  This com
1fd0: 6d 61 6e 64 20 63 72 65 61 74 65 73 20 61 20 6e  mand creates a n
1fe0: 65 77 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64  ew command named
1ff0: 0a 2a 2a 20 44 42 4e 41 4d 45 20 74 68 61 74 20  .** DBNAME that 
2000: 69 73 20 75 73 65 64 20 74 6f 20 63 6f 6e 74 72  is used to contr
2010: 6f 6c 20 74 68 61 74 20 63 6f 6e 6e 65 63 74 69  ol that connecti
2020: 6f 6e 2e 20 20 54 68 65 20 64 61 74 61 62 61 73  on.  The databas
2030: 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  e.** connection 
2040: 69 73 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  is deleted when 
2050: 74 68 65 20 44 42 4e 41 4d 45 20 63 6f 6d 6d 61  the DBNAME comma
2060: 6e 64 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a  nd is deleted..*
2070: 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20  *.** The second 
2080: 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
2090: 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65  name of the dire
20a0: 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61  ctory that conta
20b0: 69 6e 73 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74  ins.** the sqlit
20c0: 65 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  e database that 
20d0: 69 73 20 74 6f 20 62 65 20 61 63 63 65 73 73 65  is to be accesse
20e0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
20f0: 20 44 62 4d 61 69 6e 28 76 6f 69 64 20 2a 63 64   DbMain(void *cd
2100: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  , Tcl_Interp *in
2110: 74 65 72 70 2c 20 69 6e 74 20 61 72 67 63 2c 20  terp, int argc, 
2120: 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20  char **argv){.  
2130: 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 53 71 6c 69  int mode;.  Sqli
2140: 74 65 44 62 20 2a 70 3b 0a 20 20 63 68 61 72 20  teDb *p;.  char 
2150: 2a 7a 45 72 72 4d 73 67 3b 0a 20 20 69 66 28 20  *zErrMsg;.  if( 
2160: 61 72 67 63 21 3d 33 20 26 26 20 61 72 67 63 21  argc!=3 && argc!
2170: 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =4 ){.    Tcl_Ap
2180: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
2190: 70 2c 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  p,"wrong # args:
21a0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
21b0: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
21c0: 22 20 48 41 4e 44 4c 45 20 46 49 4c 45 4e 41 4d  " HANDLE FILENAM
21d0: 45 20 3f 4d 4f 44 45 3f 5c 22 22 2c 20 30 29 3b  E ?MODE?\"", 0);
21e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
21f0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
2200: 20 61 72 67 63 3d 3d 33 20 29 7b 0a 20 20 20 20   argc==3 ){.    
2210: 6d 6f 64 65 20 3d 20 30 36 36 36 3b 0a 20 20 7d  mode = 0666;.  }
2220: 65 6c 73 65 20 69 66 28 20 54 63 6c 5f 47 65 74  else if( Tcl_Get
2230: 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76  Int(interp, argv
2240: 5b 33 5d 2c 20 26 6d 6f 64 65 29 21 3d 54 43 4c  [3], &mode)!=TCL
2250: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
2260: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2270: 0a 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  .  zErrMsg = 0;.
2280: 20 20 70 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28    p = Tcl_Alloc(
2290: 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
22a0: 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20   if( p==0 ){.   
22b0: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
22c0: 6e 74 65 72 70 2c 20 22 6d 61 6c 6c 6f 63 20 66  nterp, "malloc f
22d0: 61 69 6c 65 64 22 2c 20 54 43 4c 5f 53 54 41 54  ailed", TCL_STAT
22e0: 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  IC);.    return 
22f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2300: 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
2310: 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 70 2d 3e  zeof(*p));.  p->
2320: 64 62 20 3d 20 73 71 6c 69 74 65 5f 6f 70 65 6e  db = sqlite_open
2330: 28 61 72 67 76 5b 32 5d 2c 20 6d 6f 64 65 2c 20  (argv[2], mode, 
2340: 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28  &zErrMsg);.  if(
2350: 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20   p->db==0 ){.   
2360: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
2370: 6e 74 65 72 70 2c 20 7a 45 72 72 4d 73 67 2c 20  nterp, zErrMsg, 
2380: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20  TCL_VOLATILE);. 
2390: 20 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61     Tcl_Free((cha
23a0: 72 2a 29 70 29 3b 0a 20 20 20 20 66 72 65 65 28  r*)p);.    free(
23b0: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 72 65  zErrMsg);.    re
23c0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
23d0: 20 20 7d 0a 20 20 54 63 6c 5f 43 72 65 61 74 65    }.  Tcl_Create
23e0: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20  Command(interp, 
23f0: 61 72 67 76 5b 31 5d 2c 20 44 62 43 6d 64 2c 20  argv[1], DbCmd, 
2400: 28 63 68 61 72 2a 29 70 2c 20 44 62 44 65 6c 65  (char*)p, DbDele
2410: 74 65 43 6d 64 29 3b 0a 20 20 72 65 74 75 72 6e  teCmd);.  return
2420: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
2430: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 69  * Initialize thi
2440: 73 20 6d 6f 64 75 6c 65 2e 0a 2a 2a 0a 2a 2a 20  s module..**.** 
2450: 54 68 69 73 20 54 63 6c 20 6d 6f 64 75 6c 65 20  This Tcl module 
2460: 63 6f 6e 74 61 69 6e 73 20 6f 6e 6c 79 20 61 20  contains only a 
2470: 73 69 6e 67 6c 65 20 6e 65 77 20 54 63 6c 20 63  single new Tcl c
2480: 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 20 22 73 71  ommand named "sq
2490: 6c 69 74 65 22 2e 0a 2a 2a 20 28 48 65 6e 63 65  lite"..** (Hence
24a0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 61 6d   there is no nam
24b0: 65 73 70 61 63 65 2e 20 20 54 68 65 72 65 20 69  espace.  There i
24c0: 73 20 6e 6f 20 70 6f 69 6e 74 20 69 6e 20 75 73  s no point in us
24d0: 69 6e 67 20 61 20 6e 61 6d 65 73 70 61 63 65 0a  ing a namespace.
24e0: 2a 2a 20 69 66 20 74 68 65 20 65 78 74 65 6e 73  ** if the extens
24f0: 69 6f 6e 20 6f 6e 6c 79 20 73 75 70 70 6c 69 65  ion only supplie
2500: 73 20 6f 6e 65 20 6e 65 77 20 6e 61 6d 65 21 29  s one new name!)
2510: 20 20 54 68 65 20 22 73 71 6c 69 74 65 22 20 63    The "sqlite" c
2520: 6f 6d 6d 61 6e 64 20 69 73 0a 2a 2a 20 75 73 65  ommand is.** use
2530: 64 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20  d to open a new 
2540: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 2e  SQLite database.
2550: 20 20 53 65 65 20 74 68 65 20 44 62 4d 61 69 6e    See the DbMain
2560: 28 29 20 72 6f 75 74 69 6e 65 20 61 62 6f 76 65  () routine above
2570: 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .** for addition
2580: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
2590: 2a 2f 0a 69 6e 74 20 53 71 6c 69 74 65 5f 49 6e  */.int Sqlite_In
25a0: 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  it(Tcl_Interp *i
25b0: 6e 74 65 72 70 29 7b 0a 20 20 54 63 6c 5f 43 72  nterp){.  Tcl_Cr
25c0: 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eateCommand(inte
25d0: 72 70 2c 20 22 73 71 6c 69 74 65 22 2c 20 44 62  rp, "sqlite", Db
25e0: 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 72  Main, 0, 0);.  r
25f0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
2600: 69 6e 74 20 53 71 6c 69 74 65 5f 53 61 66 65 49  int Sqlite_SafeI
2610: 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
2620: 69 6e 74 65 72 70 29 7b 0a 20 20 72 65 74 75 72  interp){.  retur
2630: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
2640: 2a 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 75  ** If compiled u
2650: 73 69 6e 67 20 6d 6b 74 63 6c 61 70 70 2c 20 74  sing mktclapp, t
2660: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
2670: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 0a 2a   to initialize.*
2680: 2a 20 65 76 65 72 79 74 68 69 6e 67 2e 0a 2a 2f  * everything..*/
2690: 0a 69 6e 74 20 45 74 5f 41 70 70 49 6e 69 74 28  .int Et_AppInit(
26a0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
26b0: 72 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 71  rp){.  return Sq
26c0: 6c 69 74 65 5f 49 6e 69 74 28 69 6e 74 65 72 70  lite_Init(interp
26d0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  );.}../*.** If t
26e0: 68 65 20 6d 61 63 72 6f 20 54 43 4c 53 48 20 69  he macro TCLSH i
26f0: 73 20 64 65 66 69 6e 65 64 20 61 6e 64 20 69 73  s defined and is
2700: 20 6f 6e 65 2c 20 74 68 65 6e 20 70 75 74 20 69   one, then put i
2710: 6e 20 63 6f 64 65 20 66 6f 72 20 74 68 65 0a 2a  n code for the.*
2720: 2a 20 22 6d 61 69 6e 22 20 72 6f 75 74 69 6e 65  * "main" routine
2730: 20 74 68 61 74 20 77 69 6c 6c 20 69 6e 69 74 69   that will initi
2740: 61 6c 69 7a 65 20 54 63 6c 2e 0a 2a 2f 0a 23 69  alize Tcl..*/.#i
2750: 66 20 64 65 66 69 6e 65 64 28 54 43 4c 53 48 29  f defined(TCLSH)
2760: 20 26 26 20 54 43 4c 53 48 3d 3d 31 0a 73 74 61   && TCLSH==1.sta
2770: 74 69 63 20 63 68 61 72 20 7a 4d 61 69 6e 6c 6f  tic char zMainlo
2780: 6f 70 5b 5d 20 3d 0a 20 20 22 73 65 74 20 6c 69  op[] =.  "set li
2790: 6e 65 20 7b 7d 5c 6e 22 0a 20 20 22 77 68 69 6c  ne {}\n".  "whil
27a0: 65 20 7b 21 5b 65 6f 66 20 73 74 64 69 6e 5d 7d  e {![eof stdin]}
27b0: 20 7b 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b 24   {\n".    "if {$
27c0: 6c 69 6e 65 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22  line!=\"\"} {\n"
27d0: 0a 20 20 20 20 20 20 22 70 75 74 73 20 2d 6e 6f  .      "puts -no
27e0: 6e 65 77 6c 69 6e 65 20 5c 22 3e 20 5c 22 5c 6e  newline \"> \"\n
27f0: 22 0a 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c  ".    "} else {\
2800: 6e 22 0a 20 20 20 20 20 20 22 70 75 74 73 20 2d  n".      "puts -
2810: 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 25 20 5c 22  nonewline \"% \"
2820: 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20  \n".    "}\n".  
2830: 20 20 22 66 6c 75 73 68 20 73 74 64 6f 75 74 5c    "flush stdout\
2840: 6e 22 0a 20 20 20 20 22 61 70 70 65 6e 64 20 6c  n".    "append l
2850: 69 6e 65 20 5b 67 65 74 73 20 73 74 64 69 6e 5d  ine [gets stdin]
2860: 5c 6e 22 0a 20 20 20 20 22 69 66 20 7b 5b 69 6e  \n".    "if {[in
2870: 66 6f 20 63 6f 6d 70 6c 65 74 65 20 24 6c 69 6e  fo complete $lin
2880: 65 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22  e]} {\n".      "
2890: 69 66 20 7b 5b 63 61 74 63 68 20 7b 75 70 6c 65  if {[catch {uple
28a0: 76 65 6c 20 23 30 20 24 6c 69 6e 65 7d 20 72 65  vel #0 $line} re
28b0: 73 75 6c 74 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20  sult]} {\n".    
28c0: 20 20 20 20 22 70 75 74 73 20 73 74 64 65 72 72      "puts stderr
28d0: 20 5c 22 45 72 72 6f 72 3a 20 24 72 65 73 75 6c   \"Error: $resul
28e0: 74 5c 22 5c 6e 22 0a 20 20 20 20 20 20 22 7d 20  t\"\n".      "} 
28f0: 65 6c 73 65 69 66 20 7b 24 72 65 73 75 6c 74 21  elseif {$result!
2900: 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20  =\"\"} {\n".    
2910: 20 20 20 20 22 70 75 74 73 20 24 72 65 73 75 6c      "puts $resul
2920: 74 5c 6e 22 0a 20 20 20 20 20 20 22 7d 5c 6e 22  t\n".      "}\n"
2930: 0a 20 20 20 20 20 20 22 73 65 74 20 6c 69 6e 65  .      "set line
2940: 20 7b 7d 5c 6e 22 0a 20 20 20 20 22 7d 20 65 6c   {}\n".    "} el
2950: 73 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 61  se {\n".      "a
2960: 70 70 65 6e 64 20 6c 69 6e 65 20 5c 5c 6e 5c 6e  ppend line \\n\n
2970: 22 0a 20 20 20 20 22 7d 5c 6e 22 0a 20 20 22 7d  ".    "}\n".  "}
2980: 5c 6e 22 0a 3b 0a 0a 23 64 65 66 69 6e 65 20 54  \n".;..#define T
2990: 43 4c 53 48 5f 4d 41 49 4e 20 6d 61 69 6e 20 20  CLSH_MAIN main  
29a0: 20 2f 2a 20 4e 65 65 64 65 64 20 74 6f 20 66 61   /* Needed to fa
29b0: 6b 65 20 6f 75 74 20 6d 6b 74 63 6c 61 70 70 20  ke out mktclapp 
29c0: 2a 2f 0a 69 6e 74 20 54 43 4c 53 48 5f 4d 41 49  */.int TCLSH_MAI
29d0: 4e 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72  N(int argc, char
29e0: 20 2a 2a 61 72 67 76 29 7b 0a 20 20 54 63 6c 5f   **argv){.  Tcl_
29f0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a  Interp *interp;.
2a00: 20 20 69 6e 74 65 72 70 20 3d 20 54 63 6c 5f 43    interp = Tcl_C
2a10: 72 65 61 74 65 49 6e 74 65 72 70 28 29 3b 0a 20  reateInterp();. 
2a20: 20 53 71 6c 69 74 65 5f 49 6e 69 74 28 69 6e 74   Sqlite_Init(int
2a30: 65 72 70 29 3b 0a 20 20 69 66 28 20 61 72 67 63  erp);.  if( argc
2a40: 3e 3d 32 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  >=2 ){.    int i
2a50: 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72  ;.    Tcl_SetVar
2a60: 28 69 6e 74 65 72 70 2c 22 61 72 67 76 30 22 2c  (interp,"argv0",
2a70: 61 72 67 76 5b 31 5d 2c 54 43 4c 5f 47 4c 4f 42  argv[1],TCL_GLOB
2a80: 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20 20 20 54 63  AL_ONLY);.    Tc
2a90: 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c  l_SetVar(interp,
2aa0: 22 61 72 67 76 22 2c 20 22 22 2c 20 54 43 4c 5f  "argv", "", TCL_
2ab0: 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20  GLOBAL_ONLY);.  
2ac0: 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 61 72 67    for(i=2; i<arg
2ad0: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54  c; i++){.      T
2ae0: 63 6c 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70  cl_SetVar(interp
2af0: 2c 20 22 61 72 67 76 22 2c 20 61 72 67 76 5b 69  , "argv", argv[i
2b00: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 54 43 4c  ],.          TCL
2b10: 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 20 7c 20 54  _GLOBAL_ONLY | T
2b20: 43 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45 4e 54 20  CL_LIST_ELEMENT 
2b30: 7c 20 54 43 4c 5f 41 50 50 45 4e 44 5f 56 41 4c  | TCL_APPEND_VAL
2b40: 55 45 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  UE);.    }.    i
2b50: 66 28 20 54 63 6c 5f 45 76 61 6c 46 69 6c 65 28  f( Tcl_EvalFile(
2b60: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 29  interp, argv[1])
2b70: 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20  !=TCL_OK ){.    
2b80: 20 20 63 68 61 72 20 2a 7a 49 6e 66 6f 20 3d 20    char *zInfo = 
2b90: 54 63 6c 5f 47 65 74 56 61 72 28 69 6e 74 65 72  Tcl_GetVar(inter
2ba0: 70 2c 20 22 65 72 72 6f 72 49 6e 66 6f 22 2c 20  p, "errorInfo", 
2bb0: 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29  TCL_GLOBAL_ONLY)
2bc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 49 6e 66  ;.      if( zInf
2bd0: 6f 3d 3d 30 20 29 20 7a 49 6e 66 6f 20 3d 20 69  o==0 ) zInfo = i
2be0: 6e 74 65 72 70 2d 3e 72 65 73 75 6c 74 3b 0a 20  nterp->result;. 
2bf0: 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
2c00: 65 72 72 2c 22 25 73 3a 20 25 73 5c 6e 22 2c 20  err,"%s: %s\n", 
2c10: 2a 61 72 67 76 2c 20 7a 49 6e 66 6f 29 3b 0a 20  *argv, zInfo);. 
2c20: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2c30: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2c40: 20 20 54 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c    Tcl_GlobalEval
2c50: 28 69 6e 74 65 72 70 2c 20 7a 4d 61 69 6e 6c 6f  (interp, zMainlo
2c60: 6f 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  op);.  }.  retur
2c70: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 0;.}.#endif /*
2c80: 20 54 43 4c 53 48 20 2a 2f 0a                     TCLSH */.