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

Artifact a08428125ba2429b71764d5365653771ded4a2b8:


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 39 20 32 30 30 30  ite.c,v 1.9 2000
03e0: 2f 30 39 2f 32 31 20 31 33 3a 30 31 3a 33 37 20  /09/21 13:01:37 
03f0: 64 72 68 20 45 78 70 20 24 0a 2a 2f 0a 23 69 66  drh Exp $.*/.#if
0400: 6e 64 65 66 20 4e 4f 5f 54 43 4c 20 20 20 20 20  ndef NO_TCL     
0410: 2f 2a 20 4f 6d 69 74 20 74 68 69 73 20 77 68 6f  /* Omit this who
0420: 6c 65 20 66 69 6c 65 20 69 66 20 54 43 4c 20 69  le file if TCL i
0430: 73 20 75 6e 61 76 61 69 6c 61 62 6c 65 20 2a 2f  s unavailable */
0440: 0a 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  ..#include "sqli
0450: 74 65 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c  te.h".#include <
0460: 74 63 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  tcl.h>.#include 
0470: 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c  <stdlib.h>.#incl
0480: 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a  ude <string.h>..
0490: 2f 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73 20 6f  /*.** There is o
04a0: 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ne instance of t
04b0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 66 6f  his structure fo
04c0: 72 20 65 61 63 68 20 53 51 4c 69 74 65 20 64 61  r each SQLite da
04d0: 74 61 62 61 73 65 0a 2a 2a 20 74 68 61 74 20 68  tabase.** that h
04e0: 61 73 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 62  as been opened b
04f0: 79 20 74 68 65 20 53 51 4c 69 74 65 20 54 43 4c  y the SQLite TCL
0500: 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 74   interface..*/.t
0510: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53 71  ypedef struct Sq
0520: 6c 69 74 65 44 62 20 53 71 6c 69 74 65 44 62 3b  liteDb SqliteDb;
0530: 0a 73 74 72 75 63 74 20 53 71 6c 69 74 65 44 62  .struct SqliteDb
0540: 20 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 3b   {.  sqlite *db;
0550: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
0560: 65 20 22 72 65 61 6c 22 20 64 61 74 61 62 61 73  e "real" databas
0570: 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  e structure */. 
0580: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
0590: 65 72 70 3b 20 20 20 2f 2a 20 54 68 65 20 69 6e  erp;   /* The in
05a0: 74 65 72 70 72 65 74 65 72 20 75 73 65 64 20 66  terpreter used f
05b0: 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65  or this database
05c0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75 73   */.  char *zBus
05d0: 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  y;          /* T
05e0: 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
05f0: 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 7d 3b 0a 0a   routine */.};..
0600: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
0610: 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74  e of this struct
0620: 75 72 65 20 70 61 73 73 65 73 20 69 6e 66 6f 72  ure passes infor
0630: 6d 61 74 69 6f 6e 20 74 68 72 75 20 74 68 65 20  mation thru the 
0640: 73 71 6c 69 74 65 0a 2a 2a 20 6c 6f 67 69 63 20  sqlite.** logic 
0650: 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61  from the origina
0660: 6c 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 69 6e  l TCL command in
0670: 74 6f 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  to the callback 
0680: 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74 79 70 65  routine..*/.type
0690: 64 65 66 20 73 74 72 75 63 74 20 43 61 6c 6c 62  def struct Callb
06a0: 61 63 6b 44 61 74 61 20 43 61 6c 6c 62 61 63 6b  ackData Callback
06b0: 44 61 74 61 3b 0a 73 74 72 75 63 74 20 43 61 6c  Data;.struct Cal
06c0: 6c 62 61 63 6b 44 61 74 61 20 7b 0a 20 20 54 63  lbackData {.  Tc
06d0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
06e0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 54  ;       /* The T
06f0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a  CL interpreter *
0700: 2f 0a 20 20 63 68 61 72 20 2a 7a 41 72 72 61 79  /.  char *zArray
0710: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
0720: 20 54 68 65 20 61 72 72 61 79 20 69 6e 74 6f 20   The array into 
0730: 77 68 69 63 68 20 64 61 74 61 20 69 73 20 77 72  which data is wr
0740: 69 74 74 65 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f  itten */.  Tcl_O
0750: 62 6a 20 2a 70 43 6f 64 65 3b 20 20 20 20 20 20  bj *pCode;      
0760: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64 65       /* The code
0770: 20 74 6f 20 65 78 65 63 75 74 65 20 66 6f 72 20   to execute for 
0780: 65 61 63 68 20 72 6f 77 20 2a 2f 0a 20 20 69 6e  each row */.  in
0790: 74 20 6f 6e 63 65 3b 20 20 20 20 20 20 20 20 20  t once;         
07a0: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f          /* Set o
07b0: 6e 6c 79 20 66 6f 72 20 74 68 65 20 66 69 72 73  nly for the firs
07c0: 74 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20  t invocation of 
07d0: 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 7d 3b 0a 0a  callback */.};..
07e0: 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 66 6f 72  /*.** Called for
07f0: 20 65 61 63 68 20 72 6f 77 20 6f 66 20 74 68 65   each row of the
0800: 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74   result..*/.stat
0810: 69 63 20 69 6e 74 20 44 62 45 76 61 6c 43 61 6c  ic int DbEvalCal
0820: 6c 62 61 63 6b 28 0a 20 20 76 6f 69 64 20 2a 63  lback(.  void *c
0830: 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20 20  lientData,      
0840: 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  /* An instance o
0850: 66 20 43 61 6c 6c 62 61 63 6b 44 61 74 61 20 2a  f CallbackData *
0860: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c 20 20 20  /.  int nCol,   
0870: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
0880: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
0890: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
08a0: 0a 20 20 63 68 61 72 20 2a 2a 20 61 7a 43 6f 6c  .  char ** azCol
08b0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  ,         /* Dat
08c0: 61 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  a for each colum
08d0: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 20 61  n */.  char ** a
08e0: 7a 4e 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  zN            /*
08f0: 20 4e 61 6d 65 20 66 6f 72 20 65 61 63 68 20 63   Name for each c
0900: 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 43 61  olumn */.){.  Ca
0910: 6c 6c 62 61 63 6b 44 61 74 61 20 2a 63 62 44 61  llbackData *cbDa
0920: 74 61 20 3d 20 28 43 61 6c 6c 62 61 63 6b 44 61  ta = (CallbackDa
0930: 74 61 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a  ta*)clientData;.
0940: 20 20 69 6e 74 20 69 2c 20 72 63 3b 0a 20 20 69    int i, rc;.  i
0950: 66 28 20 63 62 44 61 74 61 2d 3e 7a 41 72 72 61  f( cbData->zArra
0960: 79 5b 30 5d 20 29 7b 0a 20 20 20 20 69 66 28 20  y[0] ){.    if( 
0970: 63 62 44 61 74 61 2d 3e 6f 6e 63 65 20 29 7b 0a  cbData->once ){.
0980: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
0990: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
09a0: 20 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 32       Tcl_SetVar2
09b0: 28 63 62 44 61 74 61 2d 3e 69 6e 74 65 72 70 2c  (cbData->interp,
09c0: 20 63 62 44 61 74 61 2d 3e 7a 41 72 72 61 79 2c   cbData->zArray,
09d0: 20 22 2a 22 2c 20 61 7a 4e 5b 69 5d 2c 0a 20 20   "*", azN[i],.  
09e0: 20 20 20 20 20 20 20 20 20 54 43 4c 5f 4c 49 53           TCL_LIS
09f0: 54 5f 45 4c 45 4d 45 4e 54 7c 54 43 4c 5f 41 50  T_ELEMENT|TCL_AP
0a00: 50 45 4e 44 5f 56 41 4c 55 45 29 3b 0a 20 20 20  PEND_VALUE);.   
0a10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66     }.    }.    f
0a20: 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
0a30: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72  i++){.      char
0a40: 20 2a 7a 20 3d 20 61 7a 43 6f 6c 5b 69 5d 3b 0a   *z = azCol[i];.
0a50: 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29        if( z==0 )
0a60: 20 7a 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 54   z = "";.      T
0a70: 63 6c 5f 53 65 74 56 61 72 32 28 63 62 44 61 74  cl_SetVar2(cbDat
0a80: 61 2d 3e 69 6e 74 65 72 70 2c 20 63 62 44 61 74  a->interp, cbDat
0a90: 61 2d 3e 7a 41 72 72 61 79 2c 20 61 7a 4e 5b 69  a->zArray, azN[i
0aa0: 5d 2c 20 7a 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  ], z, 0);.    }.
0ab0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72    }else{.    for
0ac0: 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
0ad0: 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +){.      char *
0ae0: 7a 20 3d 20 61 7a 43 6f 6c 5b 69 5d 3b 0a 20 20  z = azCol[i];.  
0af0: 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a      if( z==0 ) z
0b00: 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 54 63 6c   = "";.      Tcl
0b10: 5f 53 65 74 56 61 72 28 63 62 44 61 74 61 2d 3e  _SetVar(cbData->
0b20: 69 6e 74 65 72 70 2c 20 61 7a 4e 5b 69 5d 2c 20  interp, azN[i], 
0b30: 7a 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  z, 0);.    }.  }
0b40: 0a 20 20 63 62 44 61 74 61 2d 3e 6f 6e 63 65 20  .  cbData->once 
0b50: 3d 20 30 3b 0a 20 20 72 63 20 3d 20 54 63 6c 5f  = 0;.  rc = Tcl_
0b60: 45 76 61 6c 4f 62 6a 28 63 62 44 61 74 61 2d 3e  EvalObj(cbData->
0b70: 69 6e 74 65 72 70 2c 20 63 62 44 61 74 61 2d 3e  interp, cbData->
0b80: 70 43 6f 64 65 29 3b 0a 20 20 72 65 74 75 72 6e  pCode);.  return
0b90: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
0ba0: 69 73 20 69 73 20 61 6e 20 61 6c 74 65 72 6e 61  is is an alterna
0bb0: 74 69 76 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f  tive callback fo
0bc0: 72 20 64 61 74 61 62 61 73 65 20 71 75 65 72 69  r database queri
0bd0: 65 73 2e 20 20 49 6e 73 74 65 61 64 0a 2a 2a 20  es.  Instead.** 
0be0: 6f 66 20 69 6e 76 6f 6b 69 6e 67 20 61 20 54 43  of invoking a TC
0bf0: 4c 20 73 63 72 69 70 74 20 74 6f 20 68 61 6e 64  L script to hand
0c00: 6c 65 20 74 68 65 20 72 65 73 75 6c 74 2c 20 74  le the result, t
0c10: 68 69 73 20 63 61 6c 6c 62 61 63 6b 20 6a 75 73  his callback jus
0c20: 74 0a 2a 2a 20 61 70 70 65 6e 64 73 20 65 61 63  t.** appends eac
0c30: 68 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  h column of the 
0c40: 72 65 73 75 6c 74 20 74 6f 20 61 20 6c 69 73 74  result to a list
0c50: 2e 20 20 41 66 74 65 72 20 74 68 65 20 71 75 65  .  After the que
0c60: 72 79 0a 2a 2a 20 69 73 20 63 6f 6d 70 6c 65 74  ry.** is complet
0c70: 65 2c 20 74 68 65 20 6c 69 73 74 20 69 73 20 72  e, the list is r
0c80: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
0c90: 69 63 20 69 6e 74 20 44 62 45 76 61 6c 43 61 6c  ic int DbEvalCal
0ca0: 6c 62 61 63 6b 32 28 0a 20 20 76 6f 69 64 20 2a  lback2(.  void *
0cb0: 63 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20  clientData,     
0cc0: 20 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20   /* An instance 
0cd0: 6f 66 20 43 61 6c 6c 62 61 63 6b 44 61 74 61 20  of CallbackData 
0ce0: 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c 20 20  */.  int nCol,  
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
0d00: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
0d10: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a   in the result *
0d20: 2f 0a 20 20 63 68 61 72 20 2a 2a 20 61 7a 43 6f  /.  char ** azCo
0d30: 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61  l,         /* Da
0d40: 74 61 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75  ta for each colu
0d50: 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 20  mn */.  char ** 
0d60: 61 7a 4e 20 20 20 20 20 20 20 20 20 20 20 20 2f  azN            /
0d70: 2a 20 4e 61 6d 65 20 66 6f 72 20 65 61 63 68 20  * Name for each 
0d80: 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 54  column */.){.  T
0d90: 63 6c 5f 4f 62 6a 20 2a 70 4c 69 73 74 20 3d 20  cl_Obj *pList = 
0da0: 28 54 63 6c 5f 4f 62 6a 2a 29 63 6c 69 65 6e 74  (Tcl_Obj*)client
0db0: 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Data;.  int i;. 
0dc0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
0dd0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f  ; i++){.    Tcl_
0de0: 4f 62 6a 20 2a 70 45 6c 65 6d 3b 0a 20 20 20 20  Obj *pElem;.    
0df0: 69 66 28 20 61 7a 43 6f 6c 5b 69 5d 20 26 26 20  if( azCol[i] && 
0e00: 2a 61 7a 43 6f 6c 5b 69 5d 20 29 7b 0a 20 20 20  *azCol[i] ){.   
0e10: 20 20 20 70 45 6c 65 6d 20 3d 20 54 63 6c 5f 4e     pElem = Tcl_N
0e20: 65 77 53 74 72 69 6e 67 4f 62 6a 28 61 7a 43 6f  ewStringObj(azCo
0e30: 6c 5b 69 5d 2c 20 2d 31 29 3b 0a 20 20 20 20 7d  l[i], -1);.    }
0e40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 45 6c 65  else{.      pEle
0e50: 6d 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29  m = Tcl_NewObj()
0e60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  ;.    }.    Tcl_
0e70: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
0e80: 6d 65 6e 74 28 30 2c 20 70 4c 69 73 74 2c 20 70  ment(0, pList, p
0e90: 45 6c 65 6d 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Elem);.  }.  ret
0ea0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
0eb0: 43 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20  Called when the 
0ec0: 63 6f 6d 6d 61 6e 64 20 69 73 20 64 65 6c 65 74  command is delet
0ed0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
0ee0: 69 64 20 44 62 44 65 6c 65 74 65 43 6d 64 28 76  id DbDeleteCmd(v
0ef0: 6f 69 64 20 2a 64 62 29 7b 0a 20 20 53 71 6c 69  oid *db){.  Sqli
0f00: 74 65 44 62 20 2a 70 44 62 20 3d 20 28 53 71 6c  teDb *pDb = (Sql
0f10: 69 74 65 44 62 2a 29 64 62 3b 0a 20 20 73 71 6c  iteDb*)db;.  sql
0f20: 69 74 65 5f 63 6c 6f 73 65 28 70 44 62 2d 3e 64  ite_close(pDb->d
0f30: 62 29 3b 0a 20 20 69 66 28 20 70 44 62 2d 3e 7a  b);.  if( pDb->z
0f40: 42 75 73 79 20 29 7b 0a 20 20 20 20 54 63 6c 5f  Busy ){.    Tcl_
0f50: 46 72 65 65 28 70 44 62 2d 3e 7a 42 75 73 79 29  Free(pDb->zBusy)
0f60: 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 46 72 65 65  ;.  }.  Tcl_Free
0f70: 28 28 63 68 61 72 2a 29 70 44 62 29 3b 0a 7d 0a  ((char*)pDb);.}.
0f80: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
0f90: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
0fa0: 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69  en a database fi
0fb0: 6c 65 20 69 73 20 6c 6f 63 6b 65 64 20 77 68 69  le is locked whi
0fc0: 6c 65 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20  le trying.** to 
0fd0: 65 78 65 63 75 74 65 20 53 51 4c 2e 0a 2a 2f 0a  execute SQL..*/.
0fe0: 73 74 61 74 69 63 20 69 6e 74 20 44 62 42 75 73  static int DbBus
0ff0: 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63  yHandler(void *c
1000: 64 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  d, const char *z
1010: 54 61 62 6c 65 2c 20 69 6e 74 20 6e 54 72 69 65  Table, int nTrie
1020: 73 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  s){.  SqliteDb *
1030: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
1040: 29 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  )cd;.  int rc;. 
1050: 20 63 68 61 72 20 7a 56 61 6c 5b 33 30 5d 3b 0a   char zVal[30];.
1060: 20 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20    char *zCmd;.  
1070: 63 68 61 72 20 2a 7a 52 65 73 75 6c 74 3b 0a 20  char *zResult;. 
1080: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 63 6d 64   Tcl_DString cmd
1090: 3b 0a 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  ;..  Tcl_DString
10a0: 49 6e 69 74 28 26 63 6d 64 29 3b 0a 20 20 54 63  Init(&cmd);.  Tc
10b0: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28  l_DStringAppend(
10c0: 26 63 6d 64 2c 20 70 44 62 2d 3e 7a 42 75 73 79  &cmd, pDb->zBusy
10d0: 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74  , -1);.  Tcl_DSt
10e0: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
10f0: 74 28 26 63 6d 64 2c 20 7a 54 61 62 6c 65 29 3b  t(&cmd, zTable);
1100: 0a 20 20 73 70 72 69 6e 74 66 28 7a 56 61 6c 2c  .  sprintf(zVal,
1110: 20 22 20 25 64 22 2c 20 6e 54 72 69 65 73 29 3b   " %d", nTries);
1120: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
1130: 70 65 6e 64 28 26 63 6d 64 2c 20 7a 56 61 6c 2c  pend(&cmd, zVal,
1140: 20 2d 31 29 3b 0a 20 20 7a 43 6d 64 20 3d 20 54   -1);.  zCmd = T
1150: 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28  cl_DStringValue(
1160: 26 63 6d 64 29 3b 0a 20 20 72 63 20 3d 20 54 63  &cmd);.  rc = Tc
1170: 6c 5f 45 76 61 6c 28 70 44 62 2d 3e 69 6e 74 65  l_Eval(pDb->inte
1180: 72 70 2c 20 7a 43 6d 64 29 3b 0a 20 20 54 63 6c  rp, zCmd);.  Tcl
1190: 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 63 6d  _DStringFree(&cm
11a0: 64 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43  d);.  if( rc!=TC
11b0: 4c 5f 4f 4b 20 7c 7c 20 61 74 6f 69 28 54 63 6c  L_OK || atoi(Tcl
11c0: 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
11d0: 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 29 20 29  (pDb->interp)) )
11e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
11f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
1200: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 73 71  }../*.** The "sq
1210: 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20 62 65  lite" command be
1220: 6c 6f 77 20 63 72 65 61 74 65 73 20 61 20 6e 65  low creates a ne
1230: 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 66 6f  w Tcl command fo
1240: 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6e 6e 65 63  r each.** connec
1250: 74 69 6f 6e 20 69 74 20 6f 70 65 6e 73 20 74 6f  tion it opens to
1260: 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62   an SQLite datab
1270: 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ase.  This routi
1280: 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 0a 2a 2a  ne is invoked.**
1290: 20 77 68 65 6e 65 76 65 72 20 6f 6e 65 20 6f 66   whenever one of
12a0: 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69 6f   those connectio
12b0: 6e 2d 73 70 65 63 69 66 69 63 20 63 6f 6d 6d 61  n-specific comma
12c0: 6e 64 73 20 69 73 20 65 78 65 63 75 74 65 64 0a  nds is executed.
12d0: 2a 2a 20 69 6e 20 54 63 6c 2e 20 20 46 6f 72 20  ** in Tcl.  For 
12e0: 65 78 61 6d 70 6c 65 2c 20 69 66 20 79 6f 75 20  example, if you 
12f0: 72 75 6e 20 54 63 6c 20 63 6f 64 65 20 6c 69 6b  run Tcl code lik
1300: 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  e this:.**.**   
1310: 20 20 20 20 73 71 6c 69 74 65 20 64 62 31 20 20      sqlite db1  
1320: 22 6d 79 5f 64 61 74 61 62 61 73 65 22 0a 2a 2a  "my_database".**
1330: 20 20 20 20 20 20 20 64 62 31 20 63 6c 6f 73 65         db1 close
1340: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
1350: 20 63 6f 6d 6d 61 6e 64 20 6f 70 65 6e 73 20 61   command opens a
1360: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74   connection to t
1370: 68 65 20 22 6d 79 5f 64 61 74 61 62 61 73 65 22  he "my_database"
1380: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e 64   database.** and
1390: 20 63 61 6c 6c 73 20 74 68 61 74 20 63 6f 6e 6e   calls that conn
13a0: 65 63 74 69 6f 6e 20 22 64 62 31 22 2e 20 20 54  ection "db1".  T
13b0: 68 65 20 73 65 63 6f 6e 64 20 63 6f 6d 6d 61 6e  he second comman
13c0: 64 20 63 61 75 73 65 73 20 74 68 69 73 0a 2a 2a  d causes this.**
13d0: 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20 62   subroutine to b
13e0: 65 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74  e invoked..*/.st
13f0: 61 74 69 63 20 69 6e 74 20 44 62 4f 62 6a 43 6d  atic int DbObjCm
1400: 64 28 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f  d(void *cd, Tcl_
1410: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
1420: 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a  int objc,Tcl_Obj
1430: 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20   *const*objv){. 
1440: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
1450: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
1460: 20 20 69 6e 74 20 63 68 6f 69 63 65 3b 0a 20 20    int choice;.  
1470: 73 74 61 74 69 63 20 63 68 61 72 20 2a 44 42 5f  static char *DB_
1480: 6f 70 74 53 74 72 73 5b 5d 20 3d 20 7b 0a 20 20  optStrs[] = {.  
1490: 20 20 20 22 62 75 73 79 22 2c 20 20 20 22 63 6c     "busy",   "cl
14a0: 6f 73 65 22 2c 20 20 22 63 6f 6d 70 6c 65 74 65  ose",  "complete
14b0: 22 2c 20 20 22 65 76 61 6c 22 2c 20 20 22 74 69  ",  "eval",  "ti
14c0: 6d 65 6f 75 74 22 0a 20 20 7d 3b 0a 20 20 65 6e  meout".  };.  en
14d0: 75 6d 20 44 42 5f 6f 70 74 73 20 7b 0a 20 20 20  um DB_opts {.   
14e0: 20 20 44 42 5f 42 55 53 59 2c 20 20 44 42 5f 43    DB_BUSY,  DB_C
14f0: 4c 4f 53 45 2c 20 44 42 5f 43 4f 4d 50 4c 45 54  LOSE, DB_COMPLET
1500: 45 2c 20 44 42 5f 45 56 41 4c 2c 20 44 42 5f 54  E, DB_EVAL, DB_T
1510: 49 4d 45 4f 55 54 0a 20 20 7d 3b 0a 0a 20 20 69  IMEOUT.  };..  i
1520: 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20  f( objc<2 ){.   
1530: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
1540: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
1550: 76 2c 20 22 53 55 42 43 4f 4d 4d 41 4e 44 20 2e  v, "SUBCOMMAND .
1560: 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ..");.    return
1570: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1580: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64    if( Tcl_GetInd
1590: 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
15a0: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 44 42 5f 6f 70  , objv[1], DB_op
15b0: 74 53 74 72 73 2c 20 22 6f 70 74 69 6f 6e 22 2c  tStrs, "option",
15c0: 20 30 2c 20 26 63 68 6f 69 63 65 29 20 29 7b 0a   0, &choice) ){.
15d0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
15e0: 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 73 77 69  RROR;.  }..  swi
15f0: 74 63 68 28 20 28 65 6e 75 6d 20 44 42 5f 6f 70  tch( (enum DB_op
1600: 74 73 29 63 68 6f 69 63 65 20 29 7b 0a 0a 20 20  ts)choice ){..  
1610: 2f 2a 20 20 20 20 24 64 62 20 62 75 73 79 20 3f  /*    $db busy ?
1620: 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20  CALLBACK?.  **. 
1630: 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67   ** Invoke the g
1640: 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 69 66  iven callback if
1650: 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e   an SQL statemen
1660: 74 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70  t attempts to op
1670: 65 6e 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b 65 64  en.  ** a locked
1680: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
1690: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 42    */.  case DB_B
16a0: 55 53 59 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f  USY: {.    if( o
16b0: 62 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54  bjc>3 ){.      T
16c0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
16d0: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
16e0: 20 22 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20 20   "CALLBACK");.  
16f0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1700: 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20  RROR;.    }else 
1710: 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
1720: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42       if( pDb->zB
1730: 75 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54  usy ){.        T
1740: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1750: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 42 75  interp, pDb->zBu
1760: 73 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  sy, 0);.      }.
1770: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1780: 20 63 68 61 72 20 2a 7a 42 75 73 79 3b 0a 20 20   char *zBusy;.  
1790: 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20      int len;.   
17a0: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73     if( pDb->zBus
17b0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  y ){.        Tcl
17c0: 5f 46 72 65 65 28 70 44 62 2d 3e 7a 42 75 73 79  _Free(pDb->zBusy
17d0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
17e0: 20 7a 42 75 73 79 20 3d 20 54 63 6c 5f 47 65 74   zBusy = Tcl_Get
17f0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
1800: 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20  jv[2], &len);.  
1810: 20 20 20 20 69 66 28 20 7a 42 75 73 79 20 26 26      if( zBusy &&
1820: 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
1830: 20 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d 20 54    pDb->zBusy = T
1840: 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20  cl_Alloc( len + 
1850: 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72  1 );.        str
1860: 63 70 79 28 70 44 62 2d 3e 7a 42 75 73 79 2c 20  cpy(pDb->zBusy, 
1870: 7a 42 75 73 79 29 3b 0a 20 20 20 20 20 20 7d 65  zBusy);.      }e
1880: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62  lse{.        pDb
1890: 2d 3e 7a 42 75 73 79 20 3d 20 30 3b 0a 20 20 20  ->zBusy = 0;.   
18a0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
18b0: 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20  Db->zBusy ){.   
18c0: 20 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70       pDb->interp
18d0: 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20   = interp;.     
18e0: 20 20 20 73 71 6c 69 74 65 5f 62 75 73 79 5f 68     sqlite_busy_h
18f0: 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20  andler(pDb->db, 
1900: 44 62 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70  DbBusyHandler, p
1910: 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
1920: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1930: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 70 44  _busy_handler(pD
1940: 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  b->db, 0, 0);.  
1950: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1960: 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
1970: 20 20 20 20 24 64 62 20 63 6c 6f 73 65 0a 20 20      $db close.  
1980: 2a 2a 0a 20 20 2a 2a 20 53 68 75 74 64 6f 77 6e  **.  ** Shutdown
1990: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
19a0: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4c 4f  */.  case DB_CLO
19b0: 53 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 44 65  SE: {.    Tcl_De
19c0: 6c 65 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  leteCommand(inte
19d0: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
19e0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
19f0: 2c 20 30 29 29 3b 0a 20 20 20 20 62 72 65 61 6b  , 0));.    break
1a00: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24  ;.  }..  /*    $
1a10: 64 62 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 0a  db complete SQL.
1a20: 20 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e    **.  ** Return
1a30: 20 54 52 55 45 20 69 66 20 53 51 4c 20 69 73 20   TRUE if SQL is 
1a40: 61 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73  a complete SQL s
1a50: 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72  tatement.  Retur
1a60: 6e 20 46 41 4c 53 45 20 69 66 0a 20 20 2a 2a 20  n FALSE if.  ** 
1a70: 61 64 64 69 74 69 6f 6e 61 6c 20 6c 69 6e 65 73  additional lines
1a80: 20 6f 66 20 69 6e 70 75 74 20 61 72 65 20 6e 65   of input are ne
1a90: 65 64 65 64 2e 20 20 54 68 69 73 20 69 73 20 73  eded.  This is s
1aa0: 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20  imilar to the.  
1ab0: 2a 2a 20 62 75 69 6c 74 2d 69 6e 20 22 69 6e 66  ** built-in "inf
1ac0: 6f 20 63 6f 6d 70 6c 65 74 65 22 20 63 6f 6d 6d  o complete" comm
1ad0: 61 6e 64 20 6f 66 20 54 63 6c 2e 0a 20 20 2a 2f  and of Tcl..  */
1ae0: 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4d 50 4c  .  case DB_COMPL
1af0: 45 54 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f  ETE: {.    Tcl_O
1b00: 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20  bj *pResult;.   
1b10: 20 69 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65 3b   int isComplete;
1b20: 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  .    if( objc!=3
1b30: 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72   ){.      Tcl_Wr
1b40: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
1b50: 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c  p, 2, objv, "SQL
1b60: 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
1b70: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
1b80: 7d 0a 20 20 20 20 69 73 43 6f 6d 70 6c 65 74 65  }.    isComplete
1b90: 20 3d 20 73 71 6c 69 74 65 5f 63 6f 6d 70 6c 65   = sqlite_comple
1ba0: 74 65 28 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  te( Tcl_GetStrin
1bb0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
1bc0: 2c 20 30 29 20 29 3b 0a 20 20 20 20 70 52 65 73  , 0) );.    pRes
1bd0: 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a  ult = Tcl_GetObj
1be0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
1bf0: 20 20 20 20 54 63 6c 5f 53 65 74 42 6f 6f 6c 65      Tcl_SetBoole
1c00: 61 6e 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 69  anObj(pResult, i
1c10: 73 43 6f 6d 70 6c 65 74 65 29 3b 0a 20 20 20 20  sComplete);.    
1c20: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 20 0a 20  break;.  }.   . 
1c30: 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 24 64 62 20   /*.  **    $db 
1c40: 65 76 61 6c 20 24 73 71 6c 20 3f 61 72 72 61 79  eval $sql ?array
1c50: 20 7b 20 20 2e 2e 2e 63 6f 64 65 2e 2e 2e 20 7d   {  ...code... }
1c60: 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ?.  **.  ** The 
1c70: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69 6e  SQL statement in
1c80: 20 24 73 71 6c 20 69 73 20 65 76 61 6c 75 61 74   $sql is evaluat
1c90: 65 64 2e 20 20 46 6f 72 20 65 61 63 68 20 72 6f  ed.  For each ro
1ca0: 77 2c 20 74 68 65 20 76 61 6c 75 65 73 20 61 72  w, the values ar
1cb0: 65 0a 20 20 2a 2a 20 70 6c 61 63 65 64 20 69 6e  e.  ** placed in
1cc0: 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 74 68 65   elements of the
1cd0: 20 61 72 72 61 79 20 6e 61 6d 65 64 20 22 61 72   array named "ar
1ce0: 72 61 79 22 20 61 6e 64 20 2e 2e 2e 63 6f 64 65  ray" and ...code
1cf0: 2e 2e 2e 20 69 73 20 65 78 65 63 75 74 65 64 2e  ... is executed.
1d00: 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79 22  .  ** If "array"
1d10: 20 61 6e 64 20 22 63 6f 64 65 22 20 61 72 65 20   and "code" are 
1d20: 6f 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 6e 6f  omitted, then no
1d30: 20 63 61 6c 6c 62 61 63 6b 20 69 73 20 65 76 65   callback is eve
1d40: 72 79 20 69 6e 76 6f 6b 65 64 2e 0a 20 20 2a 2a  ry invoked..  **
1d50: 20 49 66 20 22 61 72 72 61 79 22 20 69 73 20 61   If "array" is a
1d60: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20  n empty string, 
1d70: 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 73 20  then the values 
1d80: 61 72 65 20 70 6c 61 63 65 64 20 69 6e 20 76 61  are placed in va
1d90: 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20 74 68 61  riables.  ** tha
1da0: 74 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  t have the same 
1db0: 6e 61 6d 65 20 61 73 20 74 68 65 20 66 69 65 6c  name as the fiel
1dc0: 64 73 20 65 78 74 72 61 63 74 65 64 20 62 79 20  ds extracted by 
1dd0: 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2f 0a  the query..  */.
1de0: 20 20 63 61 73 65 20 44 42 5f 45 56 41 4c 3a 20    case DB_EVAL: 
1df0: 7b 0a 20 20 20 20 43 61 6c 6c 62 61 63 6b 44 61  {.    CallbackDa
1e00: 74 61 20 63 62 44 61 74 61 3b 0a 20 20 20 20 63  ta cbData;.    c
1e10: 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b 0a 20 20  har *zErrMsg;.  
1e20: 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
1e30: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 69    int rc;..    i
1e40: 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62  f( objc!=5 && ob
1e50: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54  jc!=3 ){.      T
1e60: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
1e70: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
1e80: 20 22 53 51 4c 20 3f 41 52 52 41 59 2d 4e 41 4d   "SQL ?ARRAY-NAM
1e90: 45 20 43 4f 44 45 3f 22 29 3b 0a 20 20 20 20 20  E CODE?");.     
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 20 20 7d 0a 20 20 20 20 70 44 62  R;.    }.    pDb
1ec0: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
1ed0: 70 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 54 63  p;.    zSql = Tc
1ee0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
1ef0: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a  bj(objv[2], 0);.
1f00: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
1f10: 6f 75 6e 74 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ount(objv[2]);. 
1f20: 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d 35 20 29     if( objc==5 )
1f30: 7b 0a 20 20 20 20 20 20 63 62 44 61 74 61 2e 69  {.      cbData.i
1f40: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
1f50: 20 20 20 20 20 20 63 62 44 61 74 61 2e 6f 6e 63        cbData.onc
1f60: 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 63 62 44  e = 1;.      cbD
1f70: 61 74 61 2e 7a 41 72 72 61 79 20 3d 20 54 63 6c  ata.zArray = Tcl
1f80: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
1f90: 6a 28 6f 62 6a 76 5b 33 5d 2c 20 30 29 3b 0a 20  j(objv[3], 0);. 
1fa0: 20 20 20 20 20 63 62 44 61 74 61 2e 70 43 6f 64       cbData.pCod
1fb0: 65 20 3d 20 6f 62 6a 76 5b 34 5d 3b 0a 20 20 20  e = objv[4];.   
1fc0: 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a     zErrMsg = 0;.
1fd0: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
1fe0: 66 43 6f 75 6e 74 28 6f 62 6a 76 5b 33 5d 29 3b  fCount(objv[3]);
1ff0: 0a 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  .      Tcl_IncrR
2000: 65 66 43 6f 75 6e 74 28 6f 62 6a 76 5b 34 5d 29  efCount(objv[4])
2010: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
2020: 69 74 65 5f 65 78 65 63 28 70 44 62 2d 3e 64 62  ite_exec(pDb->db
2030: 2c 20 7a 53 71 6c 2c 20 44 62 45 76 61 6c 43 61  , zSql, DbEvalCa
2040: 6c 6c 62 61 63 6b 2c 20 26 63 62 44 61 74 61 2c  llback, &cbData,
2050: 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20   &zErrMsg);.    
2060: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
2070: 6e 74 28 6f 62 6a 76 5b 34 5d 29 3b 0a 20 20 20  nt(objv[4]);.   
2080: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
2090: 75 6e 74 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20  unt(objv[3]);.  
20a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54    }else{.      T
20b0: 63 6c 5f 4f 62 6a 20 2a 70 4c 69 73 74 20 3d 20  cl_Obj *pList = 
20c0: 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20  Tcl_NewObj();.  
20d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 5f      rc = sqlite_
20e0: 65 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 53  exec(pDb->db, zS
20f0: 71 6c 2c 20 44 62 45 76 61 6c 43 61 6c 6c 62 61  ql, DbEvalCallba
2100: 63 6b 32 2c 20 70 4c 69 73 74 2c 20 26 7a 45 72  ck2, pList, &zEr
2110: 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 54 63 6c  rMsg);.      Tcl
2120: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
2130: 74 65 72 70 2c 20 70 4c 69 73 74 29 3b 0a 20 20  terp, pList);.  
2140: 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 45 72 72    }.    if( zErr
2150: 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  Msg ){.      Tcl
2160: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
2170: 70 2c 20 7a 45 72 72 4d 73 67 2c 20 54 43 4c 5f  p, zErrMsg, TCL_
2180: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 20  VOLATILE);.     
2190: 20 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a   free(zErrMsg);.
21a0: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65      }.    Tcl_De
21b0: 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76 5b  crRefCount(objv[
21c0: 32 5d 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  2]);.    return 
21d0: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  rc;.  }..  /*.  
21e0: 2a 2a 20 20 20 20 20 24 64 62 20 74 69 6d 65 6f  **     $db timeo
21f0: 75 74 20 4d 49 4c 4c 45 53 45 43 4f 4e 44 53 0a  ut MILLESECONDS.
2200: 20 20 2a 2a 0a 20 20 2a 2a 20 44 65 6c 61 79 20    **.  ** Delay 
2210: 66 6f 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  for the number o
2220: 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 73  f milliseconds s
2230: 70 65 63 69 66 69 65 64 20 77 68 65 6e 20 61 20  pecified when a 
2240: 66 69 6c 65 20 69 73 20 6c 6f 63 6b 65 64 2e 0a  file is locked..
2250: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54    */.  case DB_T
2260: 49 4d 45 4f 55 54 3a 20 7b 0a 20 20 20 20 69 6e  IMEOUT: {.    in
2270: 74 20 6d 73 3b 0a 20 20 20 20 69 66 28 20 6f 62  t ms;.    if( ob
2280: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54  jc!=3 ){.      T
2290: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
22a0: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
22b0: 20 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29   "MILLISECONDS")
22c0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
22d0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
22e0: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
22f0: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
2300: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6d 73 29 20  , objv[2], &ms) 
2310: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
2320: 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 5f 62  OR;.    sqlite_b
2330: 75 73 79 5f 74 69 6d 65 6f 75 74 28 70 44 62 2d  usy_timeout(pDb-
2340: 3e 64 62 2c 20 6d 73 29 3b 0a 20 20 20 20 62 72  >db, ms);.    br
2350: 65 61 6b 3b 0a 20 20 7d 0a 20 20 7d 20 2f 2a 20  eak;.  }.  } /* 
2360: 45 6e 64 20 6f 66 20 74 68 65 20 53 57 49 54 43  End of the SWITC
2370: 48 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  H statement */. 
2380: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2390: 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 73 71 6c 69 74  }../*.**   sqlit
23a0: 65 20 44 42 4e 41 4d 45 20 46 49 4c 45 4e 41 4d  e DBNAME FILENAM
23b0: 45 20 3f 4d 4f 44 45 3f 0a 2a 2a 0a 2a 2a 20 54  E ?MODE?.**.** T
23c0: 68 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e 20  his is the main 
23d0: 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e 20 20 57 68  Tcl command.  Wh
23e0: 65 6e 20 74 68 65 20 22 73 71 6c 69 74 65 22 20  en the "sqlite" 
23f0: 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 69 73 0a 2a  Tcl command is.*
2400: 2a 20 69 6e 76 6f 6b 65 64 2c 20 74 68 69 73 20  * invoked, this 
2410: 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 74 6f 20  routine runs to 
2420: 70 72 6f 63 65 73 73 20 74 68 61 74 20 63 6f 6d  process that com
2430: 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  mand..**.** The 
2440: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2c 20  first argument, 
2450: 44 42 4e 41 4d 45 2c 20 69 73 20 61 6e 20 61 72  DBNAME, is an ar
2460: 62 69 74 72 61 72 79 20 6e 61 6d 65 20 66 6f 72  bitrary name for
2470: 20 61 20 6e 65 77 0a 2a 2a 20 64 61 74 61 62 61   a new.** databa
2480: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20  se connection.  
2490: 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63 72 65  This command cre
24a0: 61 74 65 73 20 61 20 6e 65 77 20 63 6f 6d 6d 61  ates a new comma
24b0: 6e 64 20 6e 61 6d 65 64 0a 2a 2a 20 44 42 4e 41  nd named.** DBNA
24c0: 4d 45 20 74 68 61 74 20 69 73 20 75 73 65 64 20  ME that is used 
24d0: 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 61 74 20  to control that 
24e0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 20 54 68 65  connection.  The
24f0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
2500: 6e 65 63 74 69 6f 6e 20 69 73 20 64 65 6c 65 74  nection is delet
2510: 65 64 20 77 68 65 6e 20 74 68 65 20 44 42 4e 41  ed when the DBNA
2520: 4d 45 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64 65  ME command is de
2530: 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  leted..**.** The
2540: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
2550: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
2560: 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68  the directory th
2570: 61 74 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 74  at contains.** t
2580: 68 65 20 73 71 6c 69 74 65 20 64 61 74 61 62 61  he sqlite databa
2590: 73 65 20 74 68 61 74 20 69 73 20 74 6f 20 62 65  se that is to be
25a0: 20 61 63 63 65 73 73 65 64 2e 0a 2a 2f 0a 73 74   accessed..*/.st
25b0: 61 74 69 63 20 69 6e 74 20 44 62 4d 61 69 6e 28  atic int DbMain(
25c0: 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f 49 6e  void *cd, Tcl_In
25d0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e  terp *interp, in
25e0: 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61  t argc, char **a
25f0: 72 67 76 29 7b 0a 20 20 69 6e 74 20 6d 6f 64 65  rgv){.  int mode
2600: 3b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 3b  ;.  SqliteDb *p;
2610: 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
2620: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
2630: 26 26 20 61 72 67 63 21 3d 34 20 29 7b 0a 20 20  && argc!=4 ){.  
2640: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
2650: 6c 74 28 69 6e 74 65 72 70 2c 22 77 72 6f 6e 67  lt(interp,"wrong
2660: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
2670: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
2680: 0a 20 20 20 20 20 20 20 22 20 48 41 4e 44 4c 45  .       " HANDLE
2690: 20 46 49 4c 45 4e 41 4d 45 20 3f 4d 4f 44 45 3f   FILENAME ?MODE?
26a0: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
26b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
26c0: 20 7d 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 33   }.  if( argc==3
26d0: 20 29 7b 0a 20 20 20 20 6d 6f 64 65 20 3d 20 30   ){.    mode = 0
26e0: 36 36 36 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  666;.  }else if(
26f0: 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
2700: 72 70 2c 20 61 72 67 76 5b 33 5d 2c 20 26 6d 6f  rp, argv[3], &mo
2710: 64 65 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20  de)!=TCL_OK ){. 
2720: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2730: 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 45 72 72 4d  ROR;.  }.  zErrM
2740: 73 67 20 3d 20 30 3b 0a 20 20 70 20 3d 20 28 53  sg = 0;.  p = (S
2750: 71 6c 69 74 65 44 62 2a 29 54 63 6c 5f 41 6c 6c  qliteDb*)Tcl_All
2760: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  oc( sizeof(*p) )
2770: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
2780: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
2790: 74 28 69 6e 74 65 72 70 2c 20 22 6d 61 6c 6c 6f  t(interp, "mallo
27a0: 63 20 66 61 69 6c 65 64 22 2c 20 54 43 4c 5f 53  c failed", TCL_S
27b0: 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75  TATIC);.    retu
27c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
27d0: 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  }.  memset(p, 0,
27e0: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
27f0: 70 2d 3e 64 62 20 3d 20 73 71 6c 69 74 65 5f 6f  p->db = sqlite_o
2800: 70 65 6e 28 61 72 67 76 5b 32 5d 2c 20 6d 6f 64  pen(argv[2], mod
2810: 65 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  e, &zErrMsg);.  
2820: 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a  if( p->db==0 ){.
2830: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
2840: 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 4d 73  t(interp, zErrMs
2850: 67 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  g, TCL_VOLATILE)
2860: 3b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28 28  ;.    Tcl_Free((
2870: 63 68 61 72 2a 29 70 29 3b 0a 20 20 20 20 66 72  char*)p);.    fr
2880: 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
2890: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
28a0: 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 43 72 65  R;.  }.  Tcl_Cre
28b0: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e  ateObjCommand(in
28c0: 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 44  terp, argv[1], D
28d0: 62 4f 62 6a 43 6d 64 2c 20 28 63 68 61 72 2a 29  bObjCmd, (char*)
28e0: 70 2c 20 44 62 44 65 6c 65 74 65 43 6d 64 29 3b  p, DbDeleteCmd);
28f0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2900: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  ;.}../*.** Initi
2910: 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c  alize this modul
2920: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 63  e..**.** This Tc
2930: 6c 20 6d 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e  l module contain
2940: 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  s only a single 
2950: 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20  new Tcl command 
2960: 6e 61 6d 65 64 20 22 73 71 6c 69 74 65 22 2e 0a  named "sqlite"..
2970: 2a 2a 20 28 48 65 6e 63 65 20 74 68 65 72 65 20  ** (Hence there 
2980: 69 73 20 6e 6f 20 6e 61 6d 65 73 70 61 63 65 2e  is no namespace.
2990: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70 6f    There is no po
29a0: 69 6e 74 20 69 6e 20 75 73 69 6e 67 20 61 20 6e  int in using a n
29b0: 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 66 20 74  amespace.** if t
29c0: 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 6f 6e 6c  he extension onl
29d0: 79 20 73 75 70 70 6c 69 65 73 20 6f 6e 65 20 6e  y supplies one n
29e0: 65 77 20 6e 61 6d 65 21 29 20 20 54 68 65 20 22  ew name!)  The "
29f0: 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20  sqlite" command 
2a00: 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 6f 70  is.** used to op
2a10: 65 6e 20 61 20 6e 65 77 20 53 51 4c 69 74 65 20  en a new SQLite 
2a20: 64 61 74 61 62 61 73 65 2e 20 20 53 65 65 20 74  database.  See t
2a30: 68 65 20 44 62 4d 61 69 6e 28 29 20 72 6f 75 74  he DbMain() rout
2a40: 69 6e 65 20 61 62 6f 76 65 0a 2a 2a 20 66 6f 72  ine above.** for
2a50: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
2a60: 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  rmation..*/.int 
2a70: 53 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f  Sqlite_Init(Tcl_
2a80: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
2a90: 0a 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d  .  Tcl_CreateCom
2aa0: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 73 71  mand(interp, "sq
2ab0: 6c 69 74 65 22 2c 20 44 62 4d 61 69 6e 2c 20 30  lite", DbMain, 0
2ac0: 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 50 6b 67 50  , 0);.  Tcl_PkgP
2ad0: 72 6f 76 69 64 65 28 69 6e 74 65 72 70 2c 20 22  rovide(interp, "
2ae0: 73 71 6c 69 74 65 22 2c 20 22 31 2e 30 22 29 3b  sqlite", "1.0");
2af0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2b00: 3b 0a 7d 0a 69 6e 74 20 53 71 6c 69 74 65 5f 53  ;.}.int Sqlite_S
2b10: 61 66 65 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65  afeInit(Tcl_Inte
2b20: 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 72  rp *interp){.  r
2b30: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
2b40: 0a 2f 2a 0a 2a 2a 20 49 66 20 63 6f 6d 70 69 6c  ./*.** If compil
2b50: 65 64 20 75 73 69 6e 67 20 6d 6b 74 63 6c 61 70  ed using mktclap
2b60: 70 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  p, this routine 
2b70: 72 75 6e 73 20 74 6f 20 69 6e 69 74 69 61 6c 69  runs to initiali
2b80: 7a 65 0a 2a 2a 20 65 76 65 72 79 74 68 69 6e 67  ze.** everything
2b90: 2e 0a 2a 2f 0a 69 6e 74 20 45 74 5f 41 70 70 49  ..*/.int Et_AppI
2ba0: 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a  nit(Tcl_Interp *
2bb0: 69 6e 74 65 72 70 29 7b 0a 20 20 72 65 74 75 72  interp){.  retur
2bc0: 6e 20 53 71 6c 69 74 65 5f 49 6e 69 74 28 69 6e  n Sqlite_Init(in
2bd0: 74 65 72 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  terp);.}../*.** 
2be0: 49 66 20 74 68 65 20 6d 61 63 72 6f 20 54 43 4c  If the macro TCL
2bf0: 53 48 20 69 73 20 64 65 66 69 6e 65 64 20 61 6e  SH is defined an
2c00: 64 20 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 70  d is one, then p
2c10: 75 74 20 69 6e 20 63 6f 64 65 20 66 6f 72 20 74  ut in code for t
2c20: 68 65 0a 2a 2a 20 22 6d 61 69 6e 22 20 72 6f 75  he.** "main" rou
2c30: 74 69 6e 65 20 74 68 61 74 20 77 69 6c 6c 20 69  tine that will i
2c40: 6e 69 74 69 61 6c 69 7a 65 20 54 63 6c 2e 0a 2a  nitialize Tcl..*
2c50: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 54 43  /.#if defined(TC
2c60: 4c 53 48 29 20 26 26 20 54 43 4c 53 48 3d 3d 31  LSH) && TCLSH==1
2c70: 0a 73 74 61 74 69 63 20 63 68 61 72 20 7a 4d 61  .static char zMa
2c80: 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a 20 20 22 73 65  inloop[] =.  "se
2c90: 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 22  t line {}\n".  "
2ca0: 77 68 69 6c 65 20 7b 21 5b 65 6f 66 20 73 74 64  while {![eof std
2cb0: 69 6e 5d 7d 20 7b 5c 6e 22 0a 20 20 20 20 22 69  in]} {\n".    "i
2cc0: 66 20 7b 24 6c 69 6e 65 21 3d 5c 22 5c 22 7d 20  f {$line!=\"\"} 
2cd0: 7b 5c 6e 22 0a 20 20 20 20 20 20 22 70 75 74 73  {\n".      "puts
2ce0: 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22 3e 20   -nonewline \"> 
2cf0: 5c 22 5c 6e 22 0a 20 20 20 20 22 7d 20 65 6c 73  \"\n".    "} els
2d00: 65 20 7b 5c 6e 22 0a 20 20 20 20 20 20 22 70 75  e {\n".      "pu
2d10: 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5c 22  ts -nonewline \"
2d20: 25 20 5c 22 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e  % \"\n".    "}\n
2d30: 22 0a 20 20 20 20 22 66 6c 75 73 68 20 73 74 64  ".    "flush std
2d40: 6f 75 74 5c 6e 22 0a 20 20 20 20 22 61 70 70 65  out\n".    "appe
2d50: 6e 64 20 6c 69 6e 65 20 5b 67 65 74 73 20 73 74  nd line [gets st
2d60: 64 69 6e 5d 5c 6e 22 0a 20 20 20 20 22 69 66 20  din]\n".    "if 
2d70: 7b 5b 69 6e 66 6f 20 63 6f 6d 70 6c 65 74 65 20  {[info complete 
2d80: 24 6c 69 6e 65 5d 7d 20 7b 5c 6e 22 0a 20 20 20  $line]} {\n".   
2d90: 20 20 20 22 69 66 20 7b 5b 63 61 74 63 68 20 7b     "if {[catch {
2da0: 75 70 6c 65 76 65 6c 20 23 30 20 24 6c 69 6e 65  uplevel #0 $line
2db0: 7d 20 72 65 73 75 6c 74 5d 7d 20 7b 5c 6e 22 0a  } result]} {\n".
2dc0: 20 20 20 20 20 20 20 20 22 70 75 74 73 20 73 74          "puts st
2dd0: 64 65 72 72 20 5c 22 45 72 72 6f 72 3a 20 24 72  derr \"Error: $r
2de0: 65 73 75 6c 74 5c 22 5c 6e 22 0a 20 20 20 20 20  esult\"\n".     
2df0: 20 22 7d 20 65 6c 73 65 69 66 20 7b 24 72 65 73   "} elseif {$res
2e00: 75 6c 74 21 3d 5c 22 5c 22 7d 20 7b 5c 6e 22 0a  ult!=\"\"} {\n".
2e10: 20 20 20 20 20 20 20 20 22 70 75 74 73 20 24 72          "puts $r
2e20: 65 73 75 6c 74 5c 6e 22 0a 20 20 20 20 20 20 22  esult\n".      "
2e30: 7d 5c 6e 22 0a 20 20 20 20 20 20 22 73 65 74 20  }\n".      "set 
2e40: 6c 69 6e 65 20 7b 7d 5c 6e 22 0a 20 20 20 20 22  line {}\n".    "
2e50: 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20  } else {\n".    
2e60: 20 20 22 61 70 70 65 6e 64 20 6c 69 6e 65 20 5c    "append line \
2e70: 5c 6e 5c 6e 22 0a 20 20 20 20 22 7d 5c 6e 22 0a  \n\n".    "}\n".
2e80: 20 20 22 7d 5c 6e 22 0a 3b 0a 0a 23 64 65 66 69    "}\n".;..#defi
2e90: 6e 65 20 54 43 4c 53 48 5f 4d 41 49 4e 20 6d 61  ne TCLSH_MAIN ma
2ea0: 69 6e 20 20 20 2f 2a 20 4e 65 65 64 65 64 20 74  in   /* Needed t
2eb0: 6f 20 66 61 6b 65 20 6f 75 74 20 6d 6b 74 63 6c  o fake out mktcl
2ec0: 61 70 70 20 2a 2f 0a 69 6e 74 20 54 43 4c 53 48  app */.int TCLSH
2ed0: 5f 4d 41 49 4e 28 69 6e 74 20 61 72 67 63 2c 20  _MAIN(int argc, 
2ee0: 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20  char **argv){.  
2ef0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2f00: 72 70 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 54  rp;.  interp = T
2f10: 63 6c 5f 43 72 65 61 74 65 49 6e 74 65 72 70 28  cl_CreateInterp(
2f20: 29 3b 0a 20 20 53 71 6c 69 74 65 5f 49 6e 69 74  );.  Sqlite_Init
2f30: 28 69 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20  (interp);.  if( 
2f40: 61 72 67 63 3e 3d 32 20 29 7b 0a 20 20 20 20 69  argc>=2 ){.    i
2f50: 6e 74 20 69 3b 0a 20 20 20 20 54 63 6c 5f 53 65  nt i;.    Tcl_Se
2f60: 74 56 61 72 28 69 6e 74 65 72 70 2c 22 61 72 67  tVar(interp,"arg
2f70: 76 30 22 2c 61 72 67 76 5b 31 5d 2c 54 43 4c 5f  v0",argv[1],TCL_
2f80: 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20 20  GLOBAL_ONLY);.  
2f90: 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e 74    Tcl_SetVar(int
2fa0: 65 72 70 2c 22 61 72 67 76 22 2c 20 22 22 2c 20  erp,"argv", "", 
2fb0: 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29  TCL_GLOBAL_ONLY)
2fc0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 32 3b 20 69  ;.    for(i=2; i
2fd0: 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
2fe0: 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28 69 6e     Tcl_SetVar(in
2ff0: 74 65 72 70 2c 20 22 61 72 67 76 22 2c 20 61 72  terp, "argv", ar
3000: 67 76 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20  gv[i],.         
3010: 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59   TCL_GLOBAL_ONLY
3020: 20 7c 20 54 43 4c 5f 4c 49 53 54 5f 45 4c 45 4d   | TCL_LIST_ELEM
3030: 45 4e 54 20 7c 20 54 43 4c 5f 41 50 50 45 4e 44  ENT | TCL_APPEND
3040: 5f 56 41 4c 55 45 29 3b 0a 20 20 20 20 7d 0a 20  _VALUE);.    }. 
3050: 20 20 20 69 66 28 20 54 63 6c 5f 45 76 61 6c 46     if( Tcl_EvalF
3060: 69 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ile(interp, argv
3070: 5b 31 5d 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a  [1])!=TCL_OK ){.
3080: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 49 6e 66        char *zInf
3090: 6f 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 28 69  o = Tcl_GetVar(i
30a0: 6e 74 65 72 70 2c 20 22 65 72 72 6f 72 49 6e 66  nterp, "errorInf
30b0: 6f 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f  o", TCL_GLOBAL_O
30c0: 4e 4c 59 29 3b 0a 20 20 20 20 20 20 69 66 28 20  NLY);.      if( 
30d0: 7a 49 6e 66 6f 3d 3d 30 20 29 20 7a 49 6e 66 6f  zInfo==0 ) zInfo
30e0: 20 3d 20 69 6e 74 65 72 70 2d 3e 72 65 73 75 6c   = interp->resul
30f0: 74 3b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 66  t;.      fprintf
3100: 28 73 74 64 65 72 72 2c 22 25 73 3a 20 25 73 5c  (stderr,"%s: %s\
3110: 6e 22 2c 20 2a 61 72 67 76 2c 20 7a 49 6e 66 6f  n", *argv, zInfo
3120: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
3130: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
3140: 7b 0a 20 20 20 20 54 63 6c 5f 47 6c 6f 62 61 6c  {.    Tcl_Global
3150: 45 76 61 6c 28 69 6e 74 65 72 70 2c 20 7a 4d 61  Eval(interp, zMa
3160: 69 6e 6c 6f 6f 70 29 3b 0a 20 20 7d 0a 20 20 72  inloop);.  }.  r
3170: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
3180: 66 20 2f 2a 20 54 43 4c 53 48 20 2a 2f 0a 0a 23  f /* TCLSH */..#
3190: 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
31a0: 64 28 4e 4f 5f 54 43 4c 29 20 2a 2f 0a           d(NO_TCL) */.