/ Hex Artifact Content
Login

Artifact fbf0fac73624ae246551a6c671f1de0235b5faa1:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 41 20 54 43 4c 20  ******.** A TCL 
0180: 49 6e 74 65 72 66 61 63 65 20 74 6f 20 53 51 4c  Interface to SQL
0190: 69 74 65 0a 2a 2a 0a 2a 2a 20 24 49 64 3a 20 74  ite.**.** $Id: t
01a0: 63 6c 73 71 6c 69 74 65 2e 63 2c 76 20 31 2e 36  clsqlite.c,v 1.6
01b0: 35 20 32 30 30 34 2f 30 35 2f 31 31 20 30 36 3a  5 2004/05/11 06:
01c0: 31 37 3a 32 32 20 64 61 6e 69 65 6c 6b 31 39 37  17:22 danielk197
01d0: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 66 6e 64  7 Exp $.*/.#ifnd
01e0: 65 66 20 4e 4f 5f 54 43 4c 20 20 20 20 20 2f 2a  ef NO_TCL     /*
01f0: 20 4f 6d 69 74 20 74 68 69 73 20 77 68 6f 6c 65   Omit this whole
0200: 20 66 69 6c 65 20 69 66 20 54 43 4c 20 69 73 20   file if TCL is 
0210: 75 6e 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a 0a  unavailable */..
0220: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0230: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0240: 22 74 63 6c 2e 68 22 0a 23 69 6e 63 6c 75 64 65  "tcl.h".#include
0250: 20 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63   <stdlib.h>.#inc
0260: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
0270: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
0280: 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 54 43  .h>../*.** If TC
0290: 4c 20 75 73 65 73 20 55 54 46 2d 38 20 61 6e 64  L uses UTF-8 and
02a0: 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 66 69   SQLite is confi
02b0: 67 75 72 65 64 20 74 6f 20 75 73 65 20 69 73 6f  gured to use iso
02c0: 38 38 35 39 2c 20 74 68 65 6e 20 77 65 0a 2a 2a  8859, then we.**
02d0: 20 68 61 76 65 20 74 6f 20 64 6f 20 61 20 74 72   have to do a tr
02e0: 61 6e 73 6c 61 74 69 6f 6e 20 77 68 65 6e 20 67  anslation when g
02f0: 6f 69 6e 67 20 62 65 74 77 65 65 6e 20 74 68 65  oing between the
0300: 20 74 77 6f 2e 20 20 53 65 74 20 74 68 65 20 0a   two.  Set the .
0310: 2a 2a 20 55 54 46 5f 54 52 41 4e 53 4c 41 54 49  ** UTF_TRANSLATI
0320: 4f 4e 5f 4e 45 45 44 45 44 20 6d 61 63 72 6f 20  ON_NEEDED macro 
0330: 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
0340: 20 77 65 20 6e 65 65 64 20 74 6f 20 64 6f 0a 2a   we need to do.*
0350: 2a 20 74 68 69 73 20 74 72 61 6e 73 6c 61 74 69  * this translati
0360: 6f 6e 2e 20 20 0a 2a 2f 0a 23 69 66 20 64 65 66  on.  .*/.#if def
0370: 69 6e 65 64 28 54 43 4c 5f 55 54 46 5f 4d 41 58  ined(TCL_UTF_MAX
0380: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
0390: 4c 49 54 45 5f 55 54 46 38 29 0a 23 20 64 65 66  LITE_UTF8).# def
03a0: 69 6e 65 20 55 54 46 5f 54 52 41 4e 53 4c 41 54  ine UTF_TRANSLAT
03b0: 49 4f 4e 5f 4e 45 45 44 45 44 20 31 0a 23 65 6e  ION_NEEDED 1.#en
03c0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4e 65 77 20 53  dif../*.** New S
03d0: 51 4c 20 66 75 6e 63 74 69 6f 6e 73 20 63 61 6e  QL functions can
03e0: 20 62 65 20 63 72 65 61 74 65 64 20 61 73 20 54   be created as T
03f0: 43 4c 20 73 63 72 69 70 74 73 2e 20 20 45 61 63  CL scripts.  Eac
0400: 68 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 0a  h such function.
0410: 2a 2a 20 69 73 20 64 65 73 63 72 69 62 65 64 20  ** is described 
0420: 62 79 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  by an instance o
0430: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
0440: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79  structure..*/.ty
0450: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 71 6c  pedef struct Sql
0460: 46 75 6e 63 20 53 71 6c 46 75 6e 63 3b 0a 73 74  Func SqlFunc;.st
0470: 72 75 63 74 20 53 71 6c 46 75 6e 63 20 7b 0a 20  ruct SqlFunc {. 
0480: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
0490: 65 72 70 3b 20 20 20 2f 2a 20 54 68 65 20 54 43  erp;   /* The TC
04a0: 4c 20 69 6e 74 65 72 70 72 65 74 20 74 6f 20 65  L interpret to e
04b0: 78 65 63 75 74 65 20 74 68 65 20 66 75 6e 63 74  xecute the funct
04c0: 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ion */.  char *z
04d0: 53 63 72 69 70 74 3b 20 20 20 20 20 20 20 20 2f  Script;        /
04e0: 2a 20 54 68 65 20 73 63 72 69 70 74 20 74 6f 20  * The script to 
04f0: 62 65 20 72 75 6e 20 2a 2f 0a 20 20 53 71 6c 46  be run */.  SqlF
0500: 75 6e 63 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  unc *pNext;     
0510: 20 20 2f 2a 20 4e 65 78 74 20 66 75 6e 63 74 69    /* Next functi
0520: 6f 6e 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 6f  on on the list o
0530: 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 7d 3b  f them all */.};
0540: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 72 65 20 69 73  ../*.** There is
0550: 20 6f 6e 65 20 69 6e 73 74 61 6e 63 65 20 6f 66   one instance of
0560: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20   this structure 
0570: 66 6f 72 20 65 61 63 68 20 53 51 4c 69 74 65 20  for each SQLite 
0580: 64 61 74 61 62 61 73 65 0a 2a 2a 20 74 68 61 74  database.** that
0590: 20 68 61 73 20 62 65 65 6e 20 6f 70 65 6e 65 64   has been opened
05a0: 20 62 79 20 74 68 65 20 53 51 4c 69 74 65 20 54   by the SQLite T
05b0: 43 4c 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  CL interface..*/
05c0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
05d0: 53 71 6c 69 74 65 44 62 20 53 71 6c 69 74 65 44  SqliteDb SqliteD
05e0: 62 3b 0a 73 74 72 75 63 74 20 53 71 6c 69 74 65  b;.struct Sqlite
05f0: 44 62 20 7b 0a 20 20 73 71 6c 69 74 65 20 2a 64  Db {.  sqlite *d
0600: 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b;           /* 
0610: 54 68 65 20 22 72 65 61 6c 22 20 64 61 74 61 62  The "real" datab
0620: 61 73 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ase structure */
0630: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
0640: 6e 74 65 72 70 3b 20 20 20 2f 2a 20 54 68 65 20  nterp;   /* The 
0650: 69 6e 74 65 72 70 72 65 74 65 72 20 75 73 65 64  interpreter used
0660: 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
0670: 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42  se */.  char *zB
0680: 75 73 79 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  usy;          /*
0690: 20 54 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   The busy callba
06a0: 63 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  ck routine */.  
06b0: 63 68 61 72 20 2a 7a 43 6f 6d 6d 69 74 3b 20 20  char *zCommit;  
06c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6d        /* The com
06d0: 6d 69 74 20 68 6f 6f 6b 20 63 61 6c 6c 62 61 63  mit hook callbac
06e0: 6b 20 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63  k routine */.  c
06f0: 68 61 72 20 2a 7a 54 72 61 63 65 3b 20 20 20 20  har *zTrace;    
0700: 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61 63       /* The trac
0710: 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  e callback routi
0720: 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50  ne */.  char *zP
0730: 72 6f 67 72 65 73 73 3b 20 20 20 20 20 20 2f 2a  rogress;      /*
0740: 20 54 68 65 20 70 72 6f 67 72 65 73 73 20 63 61   The progress ca
0750: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 2a  llback routine *
0760: 2f 0a 20 20 63 68 61 72 20 2a 7a 41 75 74 68 3b  /.  char *zAuth;
0770: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
0780: 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 63   authorization c
0790: 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20  allback routine 
07a0: 2a 2f 0a 20 20 53 71 6c 46 75 6e 63 20 2a 70 46  */.  SqlFunc *pF
07b0: 75 6e 63 3b 20 20 20 20 20 20 20 2f 2a 20 4c 69  unc;       /* Li
07c0: 73 74 20 6f 66 20 53 51 4c 20 66 75 6e 63 74 69  st of SQL functi
07d0: 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ons */.  int rc;
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
07f0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 6f 66  * Return code of
0800: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
0810: 69 74 65 33 5f 65 78 65 63 28 29 20 2a 2f 0a 7d  ite3_exec() */.}
0820: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  ;../*.** An inst
0830: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
0840: 75 63 74 75 72 65 20 70 61 73 73 65 73 20 69 6e  ucture passes in
0850: 66 6f 72 6d 61 74 69 6f 6e 20 74 68 72 75 20 74  formation thru t
0860: 68 65 20 73 71 6c 69 74 65 0a 2a 2a 20 6c 6f 67  he sqlite.** log
0870: 69 63 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67  ic from the orig
0880: 69 6e 61 6c 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  inal TCL command
0890: 20 69 6e 74 6f 20 74 68 65 20 63 61 6c 6c 62 61   into the callba
08a0: 63 6b 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 74  ck routine..*/.t
08b0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 43 61  ypedef struct Ca
08c0: 6c 6c 62 61 63 6b 44 61 74 61 20 43 61 6c 6c 62  llbackData Callb
08d0: 61 63 6b 44 61 74 61 3b 0a 73 74 72 75 63 74 20  ackData;.struct 
08e0: 43 61 6c 6c 62 61 63 6b 44 61 74 61 20 7b 0a 20  CallbackData {. 
08f0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
0900: 65 72 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  erp;       /* Th
0910: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
0920: 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 41 72  r */.  char *zAr
0930: 72 61 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  ray;            
0940: 20 2f 2a 20 54 68 65 20 61 72 72 61 79 20 69 6e   /* The array in
0950: 74 6f 20 77 68 69 63 68 20 64 61 74 61 20 69 73  to which data is
0960: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 54 63   written */.  Tc
0970: 6c 5f 4f 62 6a 20 2a 70 43 6f 64 65 3b 20 20 20  l_Obj *pCode;   
0980: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
0990: 6f 64 65 20 74 6f 20 65 78 65 63 75 74 65 20 66  ode to execute f
09a0: 6f 72 20 65 61 63 68 20 72 6f 77 20 2a 2f 0a 20  or each row */. 
09b0: 20 69 6e 74 20 6f 6e 63 65 3b 20 20 20 20 20 20   int once;      
09c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
09d0: 74 20 66 6f 72 20 66 69 72 73 74 20 63 61 6c 6c  t for first call
09e0: 62 61 63 6b 20 6f 6e 6c 79 20 2a 2f 0a 20 20 69  back only */.  i
09f0: 6e 74 20 74 63 6c 5f 72 63 3b 20 20 20 20 20 20  nt tcl_rc;      
0a00: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
0a10: 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 54 43 4c  rn code from TCL
0a20: 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 69 6e 74   script */.  int
0a30: 20 6e 43 6f 6c 4e 61 6d 65 3b 20 20 20 20 20 20   nColName;      
0a40: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
0a50: 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 74   of entries in t
0a60: 68 65 20 61 7a 43 6f 6c 4e 61 6d 65 5b 5d 20 61  he azColName[] a
0a70: 72 72 61 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a  rray */.  char *
0a80: 2a 61 7a 43 6f 6c 4e 61 6d 65 3b 20 20 20 20 20  *azColName;     
0a90: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61      /* Column na
0aa0: 6d 65 73 20 74 72 61 6e 73 6c 61 74 65 64 20 74  mes translated t
0ab0: 6f 20 55 54 46 2d 38 20 2a 2f 0a 7d 3b 0a 0a 23  o UTF-8 */.};..#
0ac0: 69 66 64 65 66 20 55 54 46 5f 54 52 41 4e 53 4c  ifdef UTF_TRANSL
0ad0: 41 54 49 4f 4e 5f 4e 45 45 44 45 44 0a 2f 2a 0a  ATION_NEEDED./*.
0ae0: 2a 2a 20 43 61 6c 6c 65 64 20 66 6f 72 20 65 61  ** Called for ea
0af0: 63 68 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65  ch row of the re
0b00: 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  sult..**.** This
0b10: 20 76 65 72 73 69 6f 6e 20 69 73 20 75 73 65 64   version is used
0b20: 20 77 68 65 6e 20 54 43 4c 20 65 78 70 65 63 74   when TCL expect
0b30: 73 20 55 54 46 2d 38 20 64 61 74 61 20 62 75 74  s UTF-8 data but
0b40: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
0b50: 20 75 73 65 73 20 74 68 65 20 49 53 4f 38 38 35   uses the ISO885
0b60: 39 20 66 6f 72 6d 61 74 2e 20 20 41 20 74 72 61  9 format.  A tra
0b70: 6e 73 6c 61 74 69 6f 6e 20 6d 75 73 74 20 6f 63  nslation must oc
0b80: 63 75 72 20 66 72 6f 6d 20 49 53 4f 38 38 35 39  cur from ISO8859
0b90: 20 69 6e 74 6f 0a 2a 2a 20 55 54 46 2d 38 2e 0a   into.** UTF-8..
0ba0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
0bb0: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 0a 20 20  EvalCallback(.  
0bc0: 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61  void *clientData
0bd0: 2c 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 73  ,      /* An ins
0be0: 74 61 6e 63 65 20 6f 66 20 43 61 6c 6c 62 61 63  tance of Callbac
0bf0: 6b 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e  kData */.  int n
0c00: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
0c10: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
0c20: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
0c30: 73 75 6c 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  sult */.  char *
0c40: 2a 20 61 7a 43 6f 6c 2c 20 20 20 20 20 20 20 20  * azCol,        
0c50: 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 65 61 63   /* Data for eac
0c60: 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68  h column */.  ch
0c70: 61 72 20 2a 2a 20 61 7a 4e 20 20 20 20 20 20 20  ar ** azN       
0c80: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 66 6f 72       /* Name for
0c90: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a   each column */.
0ca0: 29 7b 0a 20 20 43 61 6c 6c 62 61 63 6b 44 61 74  ){.  CallbackDat
0cb0: 61 20 2a 63 62 44 61 74 61 20 3d 20 28 43 61 6c  a *cbData = (Cal
0cc0: 6c 62 61 63 6b 44 61 74 61 2a 29 63 6c 69 65 6e  lbackData*)clien
0cd0: 74 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 2c 20  tData;.  int i, 
0ce0: 72 63 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  rc;.  Tcl_DStrin
0cf0: 67 20 64 43 6f 6c 3b 0a 20 20 54 63 6c 5f 44 53  g dCol;.  Tcl_DS
0d00: 74 72 69 6e 67 49 6e 69 74 28 26 64 43 6f 6c 29  tringInit(&dCol)
0d10: 3b 0a 20 20 69 66 28 20 63 62 44 61 74 61 2d 3e  ;.  if( cbData->
0d20: 61 7a 43 6f 6c 4e 61 6d 65 3d 3d 30 20 29 7b 0a  azColName==0 ){.
0d30: 20 20 20 20 61 73 73 65 72 74 28 20 63 62 44 61      assert( cbDa
0d40: 74 61 2d 3e 6f 6e 63 65 20 29 3b 0a 20 20 20 20  ta->once );.    
0d50: 63 62 44 61 74 61 2d 3e 6f 6e 63 65 20 3d 20 30  cbData->once = 0
0d60: 3b 0a 20 20 20 20 69 66 28 20 63 62 44 61 74 61  ;.    if( cbData
0d70: 2d 3e 7a 41 72 72 61 79 5b 30 5d 20 29 7b 0a 20  ->zArray[0] ){. 
0d80: 20 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 32       Tcl_SetVar2
0d90: 28 63 62 44 61 74 61 2d 3e 69 6e 74 65 72 70 2c  (cbData->interp,
0da0: 20 63 62 44 61 74 61 2d 3e 7a 41 72 72 61 79 2c   cbData->zArray,
0db0: 20 22 2a 22 2c 20 22 22 2c 20 30 29 3b 0a 20 20   "*", "", 0);.  
0dc0: 20 20 7d 0a 20 20 20 20 63 62 44 61 74 61 2d 3e    }.    cbData->
0dd0: 61 7a 43 6f 6c 4e 61 6d 65 20 3d 20 6d 61 6c 6c  azColName = mall
0de0: 6f 63 28 20 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28  oc( nCol*sizeof(
0df0: 63 68 61 72 2a 29 20 29 3b 0a 20 20 20 20 69 66  char*) );.    if
0e00: 28 20 63 62 44 61 74 61 2d 3e 61 7a 43 6f 6c 4e  ( cbData->azColN
0e10: 61 6d 65 3d 3d 30 20 29 7b 20 72 65 74 75 72 6e  ame==0 ){ return
0e20: 20 31 3b 20 7d 0a 20 20 20 20 63 62 44 61 74 61   1; }.    cbData
0e30: 2d 3e 6e 43 6f 6c 4e 61 6d 65 20 3d 20 6e 43 6f  ->nColName = nCo
0e40: 6c 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  l;.    for(i=0; 
0e50: 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
0e60: 20 20 20 20 54 63 6c 5f 45 78 74 65 72 6e 61 6c      Tcl_External
0e70: 54 6f 55 74 66 44 53 74 72 69 6e 67 28 4e 55 4c  ToUtfDString(NUL
0e80: 4c 2c 20 61 7a 4e 5b 69 5d 2c 20 2d 31 2c 20 26  L, azN[i], -1, &
0e90: 64 43 6f 6c 29 3b 0a 20 20 20 20 20 20 63 62 44  dCol);.      cbD
0ea0: 61 74 61 2d 3e 61 7a 43 6f 6c 4e 61 6d 65 5b 69  ata->azColName[i
0eb0: 5d 20 3d 20 6d 61 6c 6c 6f 63 28 20 54 63 6c 5f  ] = malloc( Tcl_
0ec0: 44 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 26 64  DStringLength(&d
0ed0: 43 6f 6c 29 20 2b 20 31 20 29 3b 0a 20 20 20 20  Col) + 1 );.    
0ee0: 20 20 69 66 28 20 63 62 44 61 74 61 2d 3e 61 7a    if( cbData->az
0ef0: 43 6f 6c 4e 61 6d 65 5b 69 5d 20 29 7b 0a 20 20  ColName[i] ){.  
0f00: 20 20 20 20 20 20 73 74 72 63 70 79 28 63 62 44        strcpy(cbD
0f10: 61 74 61 2d 3e 61 7a 43 6f 6c 4e 61 6d 65 5b 69  ata->azColName[i
0f20: 5d 2c 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61  ], Tcl_DStringVa
0f30: 6c 75 65 28 26 64 43 6f 6c 29 29 3b 0a 20 20 20  lue(&dCol));.   
0f40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
0f50: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
0f60: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 62    }.      if( cb
0f70: 44 61 74 61 2d 3e 7a 41 72 72 61 79 5b 30 5d 20  Data->zArray[0] 
0f80: 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 53  ){.        Tcl_S
0f90: 65 74 56 61 72 32 28 63 62 44 61 74 61 2d 3e 69  etVar2(cbData->i
0fa0: 6e 74 65 72 70 2c 20 63 62 44 61 74 61 2d 3e 7a  nterp, cbData->z
0fb0: 41 72 72 61 79 2c 20 22 2a 22 2c 0a 20 20 20 20  Array, "*",.    
0fc0: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 44 53 74           Tcl_DSt
0fd0: 72 69 6e 67 56 61 6c 75 65 28 26 64 43 6f 6c 29  ringValue(&dCol)
0fe0: 2c 20 54 43 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45  , TCL_LIST_ELEME
0ff0: 4e 54 7c 54 43 4c 5f 41 50 50 45 4e 44 5f 56 41  NT|TCL_APPEND_VA
1000: 4c 55 45 29 3b 0a 20 20 20 20 20 20 20 20 69 66  LUE);.        if
1010: 28 20 61 7a 4e 5b 6e 43 6f 6c 5d 21 3d 30 20 29  ( azN[nCol]!=0 )
1020: 7b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  {.          Tcl_
1030: 44 53 74 72 69 6e 67 20 64 54 79 70 65 3b 0a 20  DString dType;. 
1040: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 44 53 74           Tcl_DSt
1050: 72 69 6e 67 49 6e 69 74 28 26 64 54 79 70 65 29  ringInit(&dType)
1060: 3b 0a 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  ;.          Tcl_
1070: 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26 64  DStringAppend(&d
1080: 54 79 70 65 2c 20 22 74 79 70 65 6f 66 3a 22 2c  Type, "typeof:",
1090: 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20   -1);.          
10a0: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
10b0: 64 28 26 64 54 79 70 65 2c 20 54 63 6c 5f 44 53  d(&dType, Tcl_DS
10c0: 74 72 69 6e 67 56 61 6c 75 65 28 26 64 43 6f 6c  tringValue(&dCol
10d0: 29 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  ), -1);.        
10e0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
10f0: 65 28 26 64 43 6f 6c 29 3b 0a 20 20 20 20 20 20  e(&dCol);.      
1100: 20 20 20 20 54 63 6c 5f 45 78 74 65 72 6e 61 6c      Tcl_External
1110: 54 6f 55 74 66 44 53 74 72 69 6e 67 28 4e 55 4c  ToUtfDString(NUL
1120: 4c 2c 20 61 7a 4e 5b 69 2b 6e 43 6f 6c 5d 2c 20  L, azN[i+nCol], 
1130: 2d 31 2c 20 26 64 43 6f 6c 29 3b 0a 20 20 20 20  -1, &dCol);.    
1140: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72        Tcl_SetVar
1150: 32 28 63 62 44 61 74 61 2d 3e 69 6e 74 65 72 70  2(cbData->interp
1160: 2c 20 63 62 44 61 74 61 2d 3e 7a 41 72 72 61 79  , cbData->zArray
1170: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
1180: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c    Tcl_DStringVal
1190: 75 65 28 26 64 54 79 70 65 29 2c 20 54 63 6c 5f  ue(&dType), Tcl_
11a0: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 64 43  DStringValue(&dC
11b0: 6f 6c 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ol),.           
11c0: 20 20 20 20 54 43 4c 5f 4c 49 53 54 5f 45 4c 45      TCL_LIST_ELE
11d0: 4d 45 4e 54 7c 54 43 4c 5f 41 50 50 45 4e 44 5f  MENT|TCL_APPEND_
11e0: 56 41 4c 55 45 29 3b 0a 20 20 20 20 20 20 20 20  VALUE);.        
11f0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
1200: 65 28 26 64 54 79 70 65 29 3b 0a 20 20 20 20 20  e(&dType);.     
1210: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1220: 20 20 20 0a 20 20 20 20 20 20 54 63 6c 5f 44 53     .      Tcl_DS
1230: 74 72 69 6e 67 46 72 65 65 28 26 64 43 6f 6c 29  tringFree(&dCol)
1240: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1250: 28 20 61 7a 43 6f 6c 21 3d 30 20 29 7b 0a 20 20  ( azCol!=0 ){.  
1260: 20 20 69 66 28 20 63 62 44 61 74 61 2d 3e 7a 41    if( cbData->zA
1270: 72 72 61 79 5b 30 5d 20 29 7b 0a 20 20 20 20 20  rray[0] ){.     
1280: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
1290: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
12a0: 63 68 61 72 20 2a 7a 20 3d 20 61 7a 43 6f 6c 5b  char *z = azCol[
12b0: 69 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i];.        if( 
12c0: 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20  z==0 ) z = "";. 
12d0: 20 20 20 20 20 20 20 54 63 6c 5f 44 53 74 72 69         Tcl_DStri
12e0: 6e 67 49 6e 69 74 28 26 64 43 6f 6c 29 3b 0a 20  ngInit(&dCol);. 
12f0: 20 20 20 20 20 20 20 54 63 6c 5f 45 78 74 65 72         Tcl_Exter
1300: 6e 61 6c 54 6f 55 74 66 44 53 74 72 69 6e 67 28  nalToUtfDString(
1310: 4e 55 4c 4c 2c 20 7a 2c 20 2d 31 2c 20 26 64 43  NULL, z, -1, &dC
1320: 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 54 63 6c  ol);.        Tcl
1330: 5f 53 65 74 56 61 72 32 28 63 62 44 61 74 61 2d  _SetVar2(cbData-
1340: 3e 69 6e 74 65 72 70 2c 20 63 62 44 61 74 61 2d  >interp, cbData-
1350: 3e 7a 41 72 72 61 79 2c 20 63 62 44 61 74 61 2d  >zArray, cbData-
1360: 3e 61 7a 43 6f 6c 4e 61 6d 65 5b 69 5d 2c 20 0a  >azColName[i], .
1370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
1380: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
1390: 64 43 6f 6c 29 2c 20 30 29 3b 0a 20 20 20 20 20  dCol), 0);.     
13a0: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72     Tcl_DStringFr
13b0: 65 65 28 26 64 43 6f 6c 29 3b 0a 20 20 20 20 20  ee(&dCol);.     
13c0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
13d0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
13e0: 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
13f0: 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 43     char *z = azC
1400: 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 69  ol[i];.        i
1410: 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 22  f( z==0 ) z = ""
1420: 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44 53  ;.        Tcl_DS
1430: 74 72 69 6e 67 49 6e 69 74 28 26 64 43 6f 6c 29  tringInit(&dCol)
1440: 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 45 78  ;.        Tcl_Ex
1450: 74 65 72 6e 61 6c 54 6f 55 74 66 44 53 74 72 69  ternalToUtfDStri
1460: 6e 67 28 4e 55 4c 4c 2c 20 7a 2c 20 2d 31 2c 20  ng(NULL, z, -1, 
1470: 26 64 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  &dCol);.        
1480: 54 63 6c 5f 53 65 74 56 61 72 28 63 62 44 61 74  Tcl_SetVar(cbDat
1490: 61 2d 3e 69 6e 74 65 72 70 2c 20 63 62 44 61 74  a->interp, cbDat
14a0: 61 2d 3e 61 7a 43 6f 6c 4e 61 6d 65 5b 69 5d 2c  a->azColName[i],
14b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14c0: 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 56      Tcl_DStringV
14d0: 61 6c 75 65 28 26 64 43 6f 6c 29 2c 20 30 29 3b  alue(&dCol), 0);
14e0: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 44 53 74  .        Tcl_DSt
14f0: 72 69 6e 67 46 72 65 65 28 26 64 43 6f 6c 29 3b  ringFree(&dCol);
1500: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1510: 20 7d 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76   }.  rc = Tcl_Ev
1520: 61 6c 4f 62 6a 28 63 62 44 61 74 61 2d 3e 69 6e  alObj(cbData->in
1530: 74 65 72 70 2c 20 63 62 44 61 74 61 2d 3e 70 43  terp, cbData->pC
1540: 6f 64 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ode);.  if( rc==
1550: 54 43 4c 5f 43 4f 4e 54 49 4e 55 45 20 29 20 72  TCL_CONTINUE ) r
1560: 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 63 62  c = TCL_OK;.  cb
1570: 44 61 74 61 2d 3e 74 63 6c 5f 72 63 20 3d 20 72  Data->tcl_rc = r
1580: 63 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 21 3d  c;.  return rc!=
1590: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
15a0: 20 2f 2a 20 55 54 46 5f 54 52 41 4e 53 4c 41 54   /* UTF_TRANSLAT
15b0: 49 4f 4e 5f 4e 45 45 44 45 44 20 2a 2f 0a 0a 23  ION_NEEDED */..#
15c0: 69 66 6e 64 65 66 20 55 54 46 5f 54 52 41 4e 53  ifndef UTF_TRANS
15d0: 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 0a 2f 2a  LATION_NEEDED./*
15e0: 0a 2a 2a 20 43 61 6c 6c 65 64 20 66 6f 72 20 65  .** Called for e
15f0: 61 63 68 20 72 6f 77 20 6f 66 20 74 68 65 20 72  ach row of the r
1600: 65 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  esult..**.** Thi
1610: 73 20 76 65 72 73 69 6f 6e 20 69 73 20 75 73 65  s version is use
1620: 64 20 77 68 65 6e 20 65 69 74 68 65 72 20 6f 66  d when either of
1630: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
1640: 73 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  s true:.**.**   
1650: 20 28 31 29 20 54 68 69 73 20 76 65 72 73 69 6f   (1) This versio
1660: 6e 20 6f 66 20 54 43 4c 20 75 73 65 73 20 55 54  n of TCL uses UT
1670: 46 2d 38 20 61 6e 64 20 74 68 65 20 64 61 74 61  F-8 and the data
1680: 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   in the.**      
1690: 20 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73    SQLite databas
16a0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  e is already in 
16b0: 74 68 65 20 55 54 46 2d 38 20 66 6f 72 6d 61 74  the UTF-8 format
16c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 54  ..**.**    (2) T
16d0: 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 54  his version of T
16e0: 43 4c 20 75 73 65 73 20 49 53 4f 38 38 35 39 20  CL uses ISO8859 
16f0: 61 6e 64 20 74 68 65 20 64 61 74 61 20 69 6e 20  and the data in 
1700: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 53 51  the.**        SQ
1710: 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 69 73  Lite database is
1720: 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
1730: 49 53 4f 38 38 35 39 20 66 6f 72 6d 61 74 2e 0a  ISO8859 format..
1740: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 62  */.static int Db
1750: 45 76 61 6c 43 61 6c 6c 62 61 63 6b 28 0a 20 20  EvalCallback(.  
1760: 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61  void *clientData
1770: 2c 20 20 20 20 20 20 2f 2a 20 41 6e 20 69 6e 73  ,      /* An ins
1780: 74 61 6e 63 65 20 6f 66 20 43 61 6c 6c 62 61 63  tance of Callbac
1790: 6b 44 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e  kData */.  int n
17a0: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Col,            
17b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
17c0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
17d0: 73 75 6c 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  sult */.  char *
17e0: 2a 20 61 7a 43 6f 6c 2c 20 20 20 20 20 20 20 20  * azCol,        
17f0: 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 65 61 63   /* Data for eac
1800: 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68  h column */.  ch
1810: 61 72 20 2a 2a 20 61 7a 4e 20 20 20 20 20 20 20  ar ** azN       
1820: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 66 6f 72       /* Name for
1830: 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a   each column */.
1840: 29 7b 0a 20 20 43 61 6c 6c 62 61 63 6b 44 61 74  ){.  CallbackDat
1850: 61 20 2a 63 62 44 61 74 61 20 3d 20 28 43 61 6c  a *cbData = (Cal
1860: 6c 62 61 63 6b 44 61 74 61 2a 29 63 6c 69 65 6e  lbackData*)clien
1870: 74 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 2c 20  tData;.  int i, 
1880: 72 63 3b 0a 20 20 69 66 28 20 61 7a 43 6f 6c 3d  rc;.  if( azCol=
1890: 3d 30 20 7c 7c 20 28 63 62 44 61 74 61 2d 3e 6f  =0 || (cbData->o
18a0: 6e 63 65 20 26 26 20 63 62 44 61 74 61 2d 3e 7a  nce && cbData->z
18b0: 41 72 72 61 79 5b 30 5d 29 20 29 7b 0a 20 20 20  Array[0]) ){.   
18c0: 20 54 63 6c 5f 53 65 74 56 61 72 32 28 63 62 44   Tcl_SetVar2(cbD
18d0: 61 74 61 2d 3e 69 6e 74 65 72 70 2c 20 63 62 44  ata->interp, cbD
18e0: 61 74 61 2d 3e 7a 41 72 72 61 79 2c 20 22 2a 22  ata->zArray, "*"
18f0: 2c 20 22 22 2c 20 30 29 3b 0a 20 20 20 20 66 6f  , "", 0);.    fo
1900: 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
1910: 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53  ++){.      Tcl_S
1920: 65 74 56 61 72 32 28 63 62 44 61 74 61 2d 3e 69  etVar2(cbData->i
1930: 6e 74 65 72 70 2c 20 63 62 44 61 74 61 2d 3e 7a  nterp, cbData->z
1940: 41 72 72 61 79 2c 20 22 2a 22 2c 20 61 7a 4e 5b  Array, "*", azN[
1950: 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 54 43 4c  i],.         TCL
1960: 5f 4c 49 53 54 5f 45 4c 45 4d 45 4e 54 7c 54 43  _LIST_ELEMENT|TC
1970: 4c 5f 41 50 50 45 4e 44 5f 56 41 4c 55 45 29 3b  L_APPEND_VALUE);
1980: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 4e 5b 6e  .      if( azN[n
1990: 43 6f 6c 5d 20 29 7b 0a 20 20 20 20 20 20 20 20  Col] ){.        
19a0: 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65  char *z = sqlite
19b0: 33 5f 6d 70 72 69 6e 74 66 28 22 74 79 70 65 6f  3_mprintf("typeo
19c0: 66 3a 25 73 22 2c 20 61 7a 4e 5b 69 5d 29 3b 0a  f:%s", azN[i]);.
19d0: 20 20 20 20 20 20 20 20 54 63 6c 5f 53 65 74 56          Tcl_SetV
19e0: 61 72 32 28 63 62 44 61 74 61 2d 3e 69 6e 74 65  ar2(cbData->inte
19f0: 72 70 2c 20 63 62 44 61 74 61 2d 3e 7a 41 72 72  rp, cbData->zArr
1a00: 61 79 2c 20 7a 2c 20 61 7a 4e 5b 69 2b 6e 43 6f  ay, z, azN[i+nCo
1a10: 6c 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 54  l],.           T
1a20: 43 4c 5f 4c 49 53 54 5f 45 4c 45 4d 45 4e 54 7c  CL_LIST_ELEMENT|
1a30: 54 43 4c 5f 41 50 50 45 4e 44 5f 56 41 4c 55 45  TCL_APPEND_VALUE
1a40: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1a50: 65 33 5f 66 72 65 65 6d 65 6d 28 7a 29 3b 0a 20  e3_freemem(z);. 
1a60: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1a70: 20 63 62 44 61 74 61 2d 3e 6f 6e 63 65 20 3d 20   cbData->once = 
1a80: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 7a 43  0;.  }.  if( azC
1a90: 6f 6c 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ol!=0 ){.    if(
1aa0: 20 63 62 44 61 74 61 2d 3e 7a 41 72 72 61 79 5b   cbData->zArray[
1ab0: 30 5d 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  0] ){.      for(
1ac0: 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b  i=0; i<nCol; i++
1ad0: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
1ae0: 2a 7a 20 3d 20 61 7a 43 6f 6c 5b 69 5d 3b 0a 20  *z = azCol[i];. 
1af0: 20 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20         if( z==0 
1b00: 29 20 7a 20 3d 20 22 22 3b 0a 20 20 20 20 20 20  ) z = "";.      
1b10: 20 20 54 63 6c 5f 53 65 74 56 61 72 32 28 63 62    Tcl_SetVar2(cb
1b20: 44 61 74 61 2d 3e 69 6e 74 65 72 70 2c 20 63 62  Data->interp, cb
1b30: 44 61 74 61 2d 3e 7a 41 72 72 61 79 2c 20 61 7a  Data->zArray, az
1b40: 4e 5b 69 5d 2c 20 7a 2c 20 30 29 3b 0a 20 20 20  N[i], z, 0);.   
1b50: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
1b60: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
1b70: 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nCol; i++){.   
1b80: 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61       char *z = a
1b90: 7a 43 6f 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 20  zCol[i];.       
1ba0: 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20   if( z==0 ) z = 
1bb0: 22 22 3b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "";.        Tcl_
1bc0: 53 65 74 56 61 72 28 63 62 44 61 74 61 2d 3e 69  SetVar(cbData->i
1bd0: 6e 74 65 72 70 2c 20 61 7a 4e 5b 69 5d 2c 20 7a  nterp, azN[i], z
1be0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
1bf0: 20 20 7d 0a 20 20 7d 0a 20 20 72 63 20 3d 20 54    }.  }.  rc = T
1c00: 63 6c 5f 45 76 61 6c 4f 62 6a 28 63 62 44 61 74  cl_EvalObj(cbDat
1c10: 61 2d 3e 69 6e 74 65 72 70 2c 20 63 62 44 61 74  a->interp, cbDat
1c20: 61 2d 3e 70 43 6f 64 65 29 3b 0a 20 20 69 66 28  a->pCode);.  if(
1c30: 20 72 63 3d 3d 54 43 4c 5f 43 4f 4e 54 49 4e 55   rc==TCL_CONTINU
1c40: 45 20 29 20 72 63 20 3d 20 54 43 4c 5f 4f 4b 3b  E ) rc = TCL_OK;
1c50: 0a 20 20 63 62 44 61 74 61 2d 3e 74 63 6c 5f 72  .  cbData->tcl_r
1c60: 63 20 3d 20 72 63 3b 0a 20 20 72 65 74 75 72 6e  c = rc;.  return
1c70: 20 72 63 21 3d 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23   rc!=TCL_OK;.}.#
1c80: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
1c90: 73 20 69 73 20 61 6e 20 61 6c 74 65 72 6e 61 74  s is an alternat
1ca0: 69 76 65 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ive callback for
1cb0: 20 64 61 74 61 62 61 73 65 20 71 75 65 72 69 65   database querie
1cc0: 73 2e 20 20 49 6e 73 74 65 61 64 0a 2a 2a 20 6f  s.  Instead.** o
1cd0: 66 20 69 6e 76 6f 6b 69 6e 67 20 61 20 54 43 4c  f invoking a TCL
1ce0: 20 73 63 72 69 70 74 20 74 6f 20 68 61 6e 64 6c   script to handl
1cf0: 65 20 74 68 65 20 72 65 73 75 6c 74 2c 20 74 68  e the result, th
1d00: 69 73 20 63 61 6c 6c 62 61 63 6b 20 6a 75 73 74  is callback just
1d10: 0a 2a 2a 20 61 70 70 65 6e 64 73 20 65 61 63 68  .** appends each
1d20: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72   column of the r
1d30: 65 73 75 6c 74 20 74 6f 20 61 20 6c 69 73 74 2e  esult to a list.
1d40: 20 20 41 66 74 65 72 20 74 68 65 20 71 75 65 72    After the quer
1d50: 79 0a 2a 2a 20 69 73 20 63 6f 6d 70 6c 65 74 65  y.** is complete
1d60: 2c 20 74 68 65 20 6c 69 73 74 20 69 73 20 72 65  , the list is re
1d70: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
1d80: 63 20 69 6e 74 20 44 62 45 76 61 6c 43 61 6c 6c  c int DbEvalCall
1d90: 62 61 63 6b 32 28 0a 20 20 76 6f 69 64 20 2a 63  back2(.  void *c
1da0: 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20 20  lientData,      
1db0: 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  /* An instance o
1dc0: 66 20 43 61 6c 6c 62 61 63 6b 44 61 74 61 20 2a  f CallbackData *
1dd0: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c 20 20 20  /.  int nCol,   
1de0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1df0: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
1e00: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f  in the result */
1e10: 0a 20 20 63 68 61 72 20 2a 2a 20 61 7a 43 6f 6c  .  char ** azCol
1e20: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  ,         /* Dat
1e30: 61 20 66 6f 72 20 65 61 63 68 20 63 6f 6c 75 6d  a for each colum
1e40: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 20 61  n */.  char ** a
1e50: 7a 4e 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  zN            /*
1e60: 20 4e 61 6d 65 20 66 6f 72 20 65 61 63 68 20 63   Name for each c
1e70: 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 54 63  olumn */.){.  Tc
1e80: 6c 5f 4f 62 6a 20 2a 70 4c 69 73 74 20 3d 20 28  l_Obj *pList = (
1e90: 54 63 6c 5f 4f 62 6a 2a 29 63 6c 69 65 6e 74 44  Tcl_Obj*)clientD
1ea0: 61 74 61 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ata;.  int i;.  
1eb0: 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20 72  if( azCol==0 ) r
1ec0: 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69  eturn 0;.  for(i
1ed0: 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
1ee0: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  {.    Tcl_Obj *p
1ef0: 45 6c 65 6d 3b 0a 20 20 20 20 69 66 28 20 61 7a  Elem;.    if( az
1f00: 43 6f 6c 5b 69 5d 20 26 26 20 2a 61 7a 43 6f 6c  Col[i] && *azCol
1f10: 5b 69 5d 20 29 7b 0a 23 69 66 64 65 66 20 55 54  [i] ){.#ifdef UT
1f20: 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45  F_TRANSLATION_NE
1f30: 45 44 45 44 0a 20 20 20 20 20 20 54 63 6c 5f 44  EDED.      Tcl_D
1f40: 53 74 72 69 6e 67 20 64 43 6f 6c 3b 0a 20 20 20  String dCol;.   
1f50: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e     Tcl_DStringIn
1f60: 69 74 28 26 64 43 6f 6c 29 3b 0a 20 20 20 20 20  it(&dCol);.     
1f70: 20 54 63 6c 5f 45 78 74 65 72 6e 61 6c 54 6f 55   Tcl_ExternalToU
1f80: 74 66 44 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 20  tfDString(NULL, 
1f90: 61 7a 43 6f 6c 5b 69 5d 2c 20 2d 31 2c 20 26 64  azCol[i], -1, &d
1fa0: 43 6f 6c 29 3b 0a 20 20 20 20 20 20 70 45 6c 65  Col);.      pEle
1fb0: 6d 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  m = Tcl_NewStrin
1fc0: 67 4f 62 6a 28 54 63 6c 5f 44 53 74 72 69 6e 67  gObj(Tcl_DString
1fd0: 56 61 6c 75 65 28 26 64 43 6f 6c 29 2c 20 2d 31  Value(&dCol), -1
1fe0: 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f 44 53 74  );.      Tcl_DSt
1ff0: 72 69 6e 67 46 72 65 65 28 26 64 43 6f 6c 29 3b  ringFree(&dCol);
2000: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70 45 6c  .#else.      pEl
2010: 65 6d 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69  em = Tcl_NewStri
2020: 6e 67 4f 62 6a 28 61 7a 43 6f 6c 5b 69 5d 2c 20  ngObj(azCol[i], 
2030: 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  -1);.#endif.    
2040: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 45 6c  }else{.      pEl
2050: 65 6d 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28  em = Tcl_NewObj(
2060: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  );.    }.    Tcl
2070: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2080: 65 6d 65 6e 74 28 30 2c 20 70 4c 69 73 74 2c 20  ement(0, pList, 
2090: 70 45 6c 65 6d 29 3b 0a 20 20 7d 0a 20 20 72 65  pElem);.  }.  re
20a0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
20b0: 20 54 68 69 73 20 69 73 20 61 20 73 65 63 6f 6e   This is a secon
20c0: 64 20 61 6c 74 65 72 6e 61 74 69 76 65 20 63 61  d alternative ca
20d0: 6c 6c 62 61 63 6b 20 66 6f 72 20 64 61 74 61 62  llback for datab
20e0: 61 73 65 20 71 75 65 72 69 65 73 2e 20 20 41 20  ase queries.  A 
20f0: 74 68 65 0a 2a 2a 20 66 69 72 73 74 20 63 6f 6c  the.** first col
2100: 75 6d 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74  umn of the first
2110: 20 72 6f 77 20 6f 66 20 74 68 65 20 72 65 73 75   row of the resu
2120: 6c 74 20 69 73 20 6d 61 64 65 20 74 68 65 20 54  lt is made the T
2130: 43 4c 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74  CL result..*/.st
2140: 61 74 69 63 20 69 6e 74 20 44 62 45 76 61 6c 43  atic int DbEvalC
2150: 61 6c 6c 62 61 63 6b 33 28 0a 20 20 76 6f 69 64  allback3(.  void
2160: 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 20 20 20   *clientData,   
2170: 20 20 20 2f 2a 20 41 6e 20 69 6e 73 74 61 6e 63     /* An instanc
2180: 65 20 6f 66 20 43 61 6c 6c 62 61 63 6b 44 61 74  e of CallbackDat
2190: 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6c 2c  a */.  int nCol,
21a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21b0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   Number of colum
21c0: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
21d0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 20 61 7a   */.  char ** az
21e0: 43 6f 6c 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  Col,         /* 
21f0: 44 61 74 61 20 66 6f 72 20 65 61 63 68 20 63 6f  Data for each co
2200: 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a  lumn */.  char *
2210: 2a 20 61 7a 4e 20 20 20 20 20 20 20 20 20 20 20  * azN           
2220: 20 2f 2a 20 4e 61 6d 65 20 66 6f 72 20 65 61 63   /* Name for eac
2230: 68 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20  h column */.){. 
2240: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
2250: 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72  erp = (Tcl_Inter
2260: 70 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  p*)clientData;. 
2270: 20 54 63 6c 5f 4f 62 6a 20 2a 70 45 6c 65 6d 3b   Tcl_Obj *pElem;
2280: 0a 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20  .  if( azCol==0 
2290: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
22a0: 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75  ( nCol==0 ) retu
22b0: 72 6e 20 31 3b 0a 23 69 66 64 65 66 20 55 54 46  rn 1;.#ifdef UTF
22c0: 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45  _TRANSLATION_NEE
22d0: 44 45 44 0a 20 20 7b 0a 20 20 20 20 54 63 6c 5f  DED.  {.    Tcl_
22e0: 44 53 74 72 69 6e 67 20 64 43 6f 6c 3b 0a 20 20  DString dCol;.  
22f0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
2300: 74 28 26 64 43 6f 6c 29 3b 0a 20 20 20 20 54 63  t(&dCol);.    Tc
2310: 6c 5f 45 78 74 65 72 6e 61 6c 54 6f 55 74 66 44  l_ExternalToUtfD
2320: 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 20 61 7a 43  String(NULL, azC
2330: 6f 6c 5b 30 5d 2c 20 2d 31 2c 20 26 64 43 6f 6c  ol[0], -1, &dCol
2340: 29 3b 0a 20 20 20 20 70 45 6c 65 6d 20 3d 20 54  );.    pElem = T
2350: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
2360: 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65  Tcl_DStringValue
2370: 28 26 64 43 6f 6c 29 2c 20 2d 31 29 3b 0a 20 20  (&dCol), -1);.  
2380: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65    Tcl_DStringFre
2390: 65 28 26 64 43 6f 6c 29 3b 0a 20 20 7d 0a 23 65  e(&dCol);.  }.#e
23a0: 6c 73 65 0a 20 20 70 45 6c 65 6d 20 3d 20 54 63  lse.  pElem = Tc
23b0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 61  l_NewStringObj(a
23c0: 7a 43 6f 6c 5b 30 5d 2c 20 2d 31 29 3b 0a 23 65  zCol[0], -1);.#e
23d0: 6e 64 69 66 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ndif.  Tcl_SetOb
23e0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
23f0: 70 45 6c 65 6d 29 3b 0a 20 20 72 65 74 75 72 6e  pElem);.  return
2400: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c   1;.}../*.** Cal
2410: 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6d  led when the com
2420: 6d 61 6e 64 20 69 73 20 64 65 6c 65 74 65 64 2e  mand is deleted.
2430: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2440: 44 62 44 65 6c 65 74 65 43 6d 64 28 76 6f 69 64  DbDeleteCmd(void
2450: 20 2a 64 62 29 7b 0a 20 20 53 71 6c 69 74 65 44   *db){.  SqliteD
2460: 62 20 2a 70 44 62 20 3d 20 28 53 71 6c 69 74 65  b *pDb = (Sqlite
2470: 44 62 2a 29 64 62 3b 0a 20 20 73 71 6c 69 74 65  Db*)db;.  sqlite
2480: 33 5f 63 6c 6f 73 65 28 70 44 62 2d 3e 64 62 29  3_close(pDb->db)
2490: 3b 0a 20 20 77 68 69 6c 65 28 20 70 44 62 2d 3e  ;.  while( pDb->
24a0: 70 46 75 6e 63 20 29 7b 0a 20 20 20 20 53 71 6c  pFunc ){.    Sql
24b0: 46 75 6e 63 20 2a 70 46 75 6e 63 20 3d 20 70 44  Func *pFunc = pD
24c0: 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20 70 44  b->pFunc;.    pD
24d0: 62 2d 3e 70 46 75 6e 63 20 3d 20 70 46 75 6e 63  b->pFunc = pFunc
24e0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 54 63 6c  ->pNext;.    Tcl
24f0: 5f 46 72 65 65 28 28 63 68 61 72 2a 29 70 46 75  _Free((char*)pFu
2500: 6e 63 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  nc);.  }.  if( p
2510: 44 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20  Db->zBusy ){.   
2520: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
2530: 42 75 73 79 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Busy);.  }.  if(
2540: 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b 0a   pDb->zTrace ){.
2550: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
2560: 2d 3e 7a 54 72 61 63 65 29 3b 0a 20 20 7d 0a 20  ->zTrace);.  }. 
2570: 20 69 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20   if( pDb->zAuth 
2580: 29 7b 0a 20 20 20 20 54 63 6c 5f 46 72 65 65 28  ){.    Tcl_Free(
2590: 70 44 62 2d 3e 7a 41 75 74 68 29 3b 0a 20 20 7d  pDb->zAuth);.  }
25a0: 0a 20 20 54 63 6c 5f 46 72 65 65 28 28 63 68 61  .  Tcl_Free((cha
25b0: 72 2a 29 70 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  r*)pDb);.}../*.*
25c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
25d0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
25e0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
25f0: 20 6c 6f 63 6b 65 64 20 77 68 69 6c 65 20 74 72   locked while tr
2600: 79 69 6e 67 0a 2a 2a 20 74 6f 20 65 78 65 63 75  ying.** to execu
2610: 74 65 20 53 51 4c 2e 0a 2a 2f 0a 73 74 61 74 69  te SQL..*/.stati
2620: 63 20 69 6e 74 20 44 62 42 75 73 79 48 61 6e 64  c int DbBusyHand
2630: 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c 20 63 6f  ler(void *cd, co
2640: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65  nst char *zTable
2650: 2c 20 69 6e 74 20 6e 54 72 69 65 73 29 7b 0a 20  , int nTries){. 
2660: 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d   SqliteDb *pDb =
2670: 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b 0a   (SqliteDb*)cd;.
2680: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
2690: 20 7a 56 61 6c 5b 33 30 5d 3b 0a 20 20 63 68 61   zVal[30];.  cha
26a0: 72 20 2a 7a 43 6d 64 3b 0a 20 20 54 63 6c 5f 44  r *zCmd;.  Tcl_D
26b0: 53 74 72 69 6e 67 20 63 6d 64 3b 0a 0a 20 20 54  String cmd;..  T
26c0: 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26  cl_DStringInit(&
26d0: 63 6d 64 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72  cmd);.  Tcl_DStr
26e0: 69 6e 67 41 70 70 65 6e 64 28 26 63 6d 64 2c 20  ingAppend(&cmd, 
26f0: 70 44 62 2d 3e 7a 42 75 73 79 2c 20 2d 31 29 3b  pDb->zBusy, -1);
2700: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
2710: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 63 6d 64  pendElement(&cmd
2720: 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 73 70 72  , zTable);.  spr
2730: 69 6e 74 66 28 7a 56 61 6c 2c 20 22 20 25 64 22  intf(zVal, " %d"
2740: 2c 20 6e 54 72 69 65 73 29 3b 0a 20 20 54 63 6c  , nTries);.  Tcl
2750: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26  _DStringAppend(&
2760: 63 6d 64 2c 20 7a 56 61 6c 2c 20 2d 31 29 3b 0a  cmd, zVal, -1);.
2770: 20 20 7a 43 6d 64 20 3d 20 54 63 6c 5f 44 53 74    zCmd = Tcl_DSt
2780: 72 69 6e 67 56 61 6c 75 65 28 26 63 6d 64 29 3b  ringValue(&cmd);
2790: 0a 20 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c  .  rc = Tcl_Eval
27a0: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 7a 43  (pDb->interp, zC
27b0: 6d 64 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  md);.  Tcl_DStri
27c0: 6e 67 46 72 65 65 28 26 63 6d 64 29 3b 0a 20 20  ngFree(&cmd);.  
27d0: 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 7c  if( rc!=TCL_OK |
27e0: 7c 20 61 74 6f 69 28 54 63 6c 5f 47 65 74 53 74  | atoi(Tcl_GetSt
27f0: 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e  ringResult(pDb->
2800: 69 6e 74 65 72 70 29 29 20 29 7b 0a 20 20 20 20  interp)) ){.    
2810: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
2820: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
2830: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2840: 69 73 20 69 6e 76 6f 6b 65 64 20 61 73 20 74 68  is invoked as th
2850: 65 20 27 70 72 6f 67 72 65 73 73 20 63 61 6c 6c  e 'progress call
2860: 62 61 63 6b 27 20 66 6f 72 20 74 68 65 20 64 61  back' for the da
2870: 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  tabase..*/.stati
2880: 63 20 69 6e 74 20 44 62 50 72 6f 67 72 65 73 73  c int DbProgress
2890: 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64  Handler(void *cd
28a0: 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70  ){.  SqliteDb *p
28b0: 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29  Db = (SqliteDb*)
28c0: 63 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  cd;.  int rc;.. 
28d0: 20 61 73 73 65 72 74 28 20 70 44 62 2d 3e 7a 50   assert( pDb->zP
28e0: 72 6f 67 72 65 73 73 20 29 3b 0a 20 20 72 63 20  rogress );.  rc 
28f0: 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62 2d 3e  = Tcl_Eval(pDb->
2900: 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 50 72  interp, pDb->zPr
2910: 6f 67 72 65 73 73 29 3b 0a 20 20 69 66 28 20 72  ogress);.  if( r
2920: 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f  c!=TCL_OK || ato
2930: 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  i(Tcl_GetStringR
2940: 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72  esult(pDb->inter
2950: 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  p)) ){.    retur
2960: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
2970: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
2980: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
2990: 6c 6c 65 64 20 62 79 20 74 68 65 20 53 51 4c 69  lled by the SQLi
29a0: 74 65 20 74 72 61 63 65 20 68 61 6e 64 6c 65 72  te trace handler
29b0: 20 77 68 65 6e 65 76 65 72 20 61 20 6e 65 77 0a   whenever a new.
29c0: 2a 2a 20 62 6c 6f 63 6b 20 6f 66 20 53 51 4c 20  ** block of SQL 
29d0: 69 73 20 65 78 65 63 75 74 65 64 2e 20 20 54 68  is executed.  Th
29e0: 65 20 54 43 4c 20 73 63 72 69 70 74 20 69 6e 20  e TCL script in 
29f0: 70 44 62 2d 3e 7a 54 72 61 63 65 20 69 73 20 65  pDb->zTrace is e
2a00: 78 65 63 75 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  xecuted..*/.stat
2a10: 69 63 20 76 6f 69 64 20 44 62 54 72 61 63 65 48  ic void DbTraceH
2a20: 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 2c  andler(void *cd,
2a30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
2a40: 6c 29 7b 0a 20 20 53 71 6c 69 74 65 44 62 20 2a  l){.  SqliteDb *
2a50: 70 44 62 20 3d 20 28 53 71 6c 69 74 65 44 62 2a  pDb = (SqliteDb*
2a60: 29 63 64 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  )cd;.  Tcl_DStri
2a70: 6e 67 20 73 74 72 3b 0a 0a 20 20 54 63 6c 5f 44  ng str;..  Tcl_D
2a80: 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29  StringInit(&str)
2a90: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41  ;.  Tcl_DStringA
2aa0: 70 70 65 6e 64 28 26 73 74 72 2c 20 70 44 62 2d  ppend(&str, pDb-
2ab0: 3e 7a 54 72 61 63 65 2c 20 2d 31 29 3b 0a 20 20  >zTrace, -1);.  
2ac0: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
2ad0: 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a  dElement(&str, z
2ae0: 53 71 6c 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c  Sql);.  Tcl_Eval
2af0: 28 70 44 62 2d 3e 69 6e 74 65 72 70 2c 20 54 63  (pDb->interp, Tc
2b00: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
2b10: 73 74 72 29 29 3b 0a 20 20 54 63 6c 5f 44 53 74  str));.  Tcl_DSt
2b20: 72 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a  ringFree(&str);.
2b30: 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
2b40: 74 28 70 44 62 2d 3e 69 6e 74 65 72 70 29 3b 0a  t(pDb->interp);.
2b50: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
2b60: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
2b70: 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
2b80: 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e  on is committed.
2b90: 20 20 54 68 65 0a 2a 2a 20 54 43 4c 20 73 63 72    The.** TCL scr
2ba0: 69 70 74 20 69 6e 20 70 44 62 2d 3e 7a 43 6f 6d  ipt in pDb->zCom
2bb0: 6d 69 74 20 69 73 20 65 78 65 63 75 74 65 64 2e  mit is executed.
2bc0: 20 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20    If it returns 
2bd0: 6e 6f 6e 2d 7a 65 72 6f 20 6f 72 0a 2a 2a 20 69  non-zero or.** i
2be0: 66 20 69 74 20 74 68 72 6f 77 73 20 61 6e 20 65  f it throws an e
2bf0: 78 63 65 70 74 69 6f 6e 2c 20 74 68 65 20 74 72  xception, the tr
2c00: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c  ansaction is rol
2c10: 6c 65 64 20 62 61 63 6b 20 69 6e 73 74 65 61 64  led back instead
2c20: 0a 2a 2a 20 6f 66 20 62 65 69 6e 67 20 63 6f 6d  .** of being com
2c30: 6d 69 74 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mitted..*/.stati
2c40: 63 20 69 6e 74 20 44 62 43 6f 6d 6d 69 74 48 61  c int DbCommitHa
2c50: 6e 64 6c 65 72 28 76 6f 69 64 20 2a 63 64 29 7b  ndler(void *cd){
2c60: 0a 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62  .  SqliteDb *pDb
2c70: 20 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64   = (SqliteDb*)cd
2c80: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72  ;.  int rc;..  r
2c90: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70 44 62  c = Tcl_Eval(pDb
2ca0: 2d 3e 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  ->interp, pDb->z
2cb0: 43 6f 6d 6d 69 74 29 3b 0a 20 20 69 66 28 20 72  Commit);.  if( r
2cc0: 63 21 3d 54 43 4c 5f 4f 4b 20 7c 7c 20 61 74 6f  c!=TCL_OK || ato
2cd0: 69 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  i(Tcl_GetStringR
2ce0: 65 73 75 6c 74 28 70 44 62 2d 3e 69 6e 74 65 72  esult(pDb->inter
2cf0: 70 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  p)) ){.    retur
2d00: 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
2d10: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n 0;.}../*.** Th
2d20: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
2d30: 6c 6c 65 64 20 74 6f 20 65 76 61 6c 75 61 74 65  lled to evaluate
2d40: 20 61 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e   an SQL function
2d50: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 0a 2a 2a 20   implemented.** 
2d60: 75 73 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74  using TCL script
2d70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2d80: 20 74 63 6c 53 71 6c 46 75 6e 63 28 73 71 6c 69   tclSqlFunc(sqli
2d90: 74 65 5f 66 75 6e 63 20 2a 63 6f 6e 74 65 78 74  te_func *context
2da0: 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 6f 6e 73  , int argc, cons
2db0: 74 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a  t char **argv){.
2dc0: 20 20 53 71 6c 46 75 6e 63 20 2a 70 20 3d 20 73    SqlFunc *p = s
2dd0: 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
2de0: 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 54 63 6c  (context);.  Tcl
2df0: 5f 44 53 74 72 69 6e 67 20 63 6d 64 3b 0a 20 20  _DString cmd;.  
2e00: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b  int i;.  int rc;
2e10: 0a 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49  ..  Tcl_DStringI
2e20: 6e 69 74 28 26 63 6d 64 29 3b 0a 20 20 54 63 6c  nit(&cmd);.  Tcl
2e30: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26  _DStringAppend(&
2e40: 63 6d 64 2c 20 70 2d 3e 7a 53 63 72 69 70 74 2c  cmd, p->zScript,
2e50: 20 2d 31 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   -1);.  for(i=0;
2e60: 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20   i<argc; i++){. 
2e70: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70     Tcl_DStringAp
2e80: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 63 6d 64  pendElement(&cmd
2e90: 2c 20 61 72 67 76 5b 69 5d 20 3f 20 61 72 67 76  , argv[i] ? argv
2ea0: 5b 69 5d 20 3a 20 22 22 29 3b 0a 20 20 7d 0a 20  [i] : "");.  }. 
2eb0: 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 28 70   rc = Tcl_Eval(p
2ec0: 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53  ->interp, Tcl_DS
2ed0: 74 72 69 6e 67 56 61 6c 75 65 28 26 63 6d 64 29  tringValue(&cmd)
2ee0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
2ef0: 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 72     sqlite3_set_r
2f00: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
2f10: 65 78 74 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  ext, Tcl_GetStri
2f20: 6e 67 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65  ngResult(p->inte
2f30: 72 70 29 2c 20 2d 31 29 3b 20 0a 20 20 7d 65 6c  rp), -1); .  }el
2f40: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
2f50: 73 65 74 5f 72 65 73 75 6c 74 5f 73 74 72 69 6e  set_result_strin
2f60: 67 28 63 6f 6e 74 65 78 74 2c 20 54 63 6c 5f 47  g(context, Tcl_G
2f70: 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 70  etStringResult(p
2f80: 2d 3e 69 6e 74 65 72 70 29 2c 20 2d 31 29 3b 0a  ->interp), -1);.
2f90: 20 20 7d 0a 7d 0a 23 69 66 6e 64 65 66 20 53 51    }.}.#ifndef SQ
2fa0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
2fb0: 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 54 68  IZATION./*.** Th
2fc0: 69 73 20 69 73 20 74 68 65 20 61 75 74 68 65 6e  is is the authen
2fd0: 74 69 63 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  tication functio
2fe0: 6e 2e 20 20 49 74 20 61 70 70 65 6e 64 73 20 74  n.  It appends t
2ff0: 68 65 20 61 75 74 68 65 6e 74 69 63 61 74 69 6f  he authenticatio
3000: 6e 0a 2a 2a 20 74 79 70 65 20 63 6f 64 65 20 61  n.** type code a
3010: 6e 64 20 74 68 65 20 74 77 6f 20 61 72 67 75 6d  nd the two argum
3020: 65 6e 74 73 20 74 6f 20 7a 43 6d 64 5b 5d 20 74  ents to zCmd[] t
3030: 68 65 6e 20 69 6e 76 6f 6b 65 73 20 74 68 65 20  hen invokes the 
3040: 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68 65  result.** on the
3050: 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20 20 54   interpreter.  T
3060: 68 65 20 72 65 70 6c 79 20 69 73 20 65 78 61 6d  he reply is exam
3070: 69 6e 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  ined to determin
3080: 65 20 69 66 20 74 68 65 0a 2a 2a 20 61 75 74 68  e if the.** auth
3090: 65 6e 74 69 63 61 74 69 6f 6e 20 66 61 69 6c 73  entication fails
30a0: 20 6f 72 20 73 75 63 63 65 65 64 73 2e 0a 2a 2f   or succeeds..*/
30b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75 74 68  .static int auth
30c0: 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69  _callback(.  voi
30d0: 64 20 2a 70 41 72 67 2c 0a 20 20 69 6e 74 20 63  d *pArg,.  int c
30e0: 6f 64 65 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  ode,.  const cha
30f0: 72 20 2a 7a 41 72 67 31 2c 0a 20 20 63 6f 6e 73  r *zArg1,.  cons
3100: 74 20 63 68 61 72 20 2a 7a 41 72 67 32 2c 0a 20  t char *zArg2,. 
3110: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
3120: 67 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  g3,.  const char
3130: 20 2a 7a 41 72 67 34 0a 29 7b 0a 20 20 63 68 61   *zArg4.){.  cha
3140: 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 54 63 6c 5f  r *zCode;.  Tcl_
3150: 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69  DString str;.  i
3160: 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63  nt rc;.  const c
3170: 68 61 72 20 2a 7a 52 65 70 6c 79 3b 0a 20 20 53  har *zReply;.  S
3180: 71 6c 69 74 65 44 62 20 2a 70 44 62 20 3d 20 28  qliteDb *pDb = (
3190: 53 71 6c 69 74 65 44 62 2a 29 70 41 72 67 3b 0a  SqliteDb*)pArg;.
31a0: 0a 20 20 73 77 69 74 63 68 28 20 63 6f 64 65 20  .  switch( code 
31b0: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
31c0: 54 45 5f 43 4f 50 59 20 20 20 20 20 20 20 20 20  TE_COPY         
31d0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
31e0: 4c 49 54 45 5f 43 4f 50 59 22 3b 20 62 72 65 61  LITE_COPY"; brea
31f0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
3200: 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45 58 20  TE_CREATE_INDEX 
3210: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
3220: 4c 49 54 45 5f 43 52 45 41 54 45 5f 49 4e 44 45  LITE_CREATE_INDE
3230: 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  X"; break;.    c
3240: 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54  ase SQLITE_CREAT
3250: 45 5f 54 41 42 4c 45 20 20 20 20 20 20 3a 20 7a  E_TABLE      : z
3260: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45  Code="SQLITE_CRE
3270: 41 54 45 5f 54 41 42 4c 45 22 3b 20 62 72 65 61  ATE_TABLE"; brea
3280: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
3290: 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 49  TE_CREATE_TEMP_I
32a0: 4e 44 45 58 20 3a 20 7a 43 6f 64 65 3d 22 53 51  NDEX : zCode="SQ
32b0: 4c 49 54 45 5f 43 52 45 41 54 45 5f 54 45 4d 50  LITE_CREATE_TEMP
32c0: 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b 3b 0a  _INDEX"; break;.
32d0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
32e0: 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c  CREATE_TEMP_TABL
32f0: 45 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54  E : zCode="SQLIT
3300: 45 5f 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41  E_CREATE_TEMP_TA
3310: 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  BLE"; break;.   
3320: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
3330: 41 54 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52  ATE_TEMP_TRIGGER
3340: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
3350: 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49 47  CREATE_TEMP_TRIG
3360: 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  GER"; break;.   
3370: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 52 45   case SQLITE_CRE
3380: 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 20 20 3a  ATE_TEMP_VIEW  :
3390: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 43   zCode="SQLITE_C
33a0: 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 22  REATE_TEMP_VIEW"
33b0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
33c0: 65 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  e SQLITE_CREATE_
33d0: 54 52 49 47 47 45 52 20 20 20 20 3a 20 7a 43 6f  TRIGGER    : zCo
33e0: 64 65 3d 22 53 51 4c 49 54 45 5f 43 52 45 41 54  de="SQLITE_CREAT
33f0: 45 5f 54 52 49 47 47 45 52 22 3b 20 62 72 65 61  E_TRIGGER"; brea
3400: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
3410: 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57 20 20  TE_CREATE_VIEW  
3420: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
3430: 4c 49 54 45 5f 43 52 45 41 54 45 5f 56 49 45 57  LITE_CREATE_VIEW
3440: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  "; break;.    ca
3450: 73 65 20 53 51 4c 49 54 45 5f 44 45 4c 45 54 45  se SQLITE_DELETE
3460: 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 7a 43              : zC
3470: 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 45 4c 45  ode="SQLITE_DELE
3480: 54 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  TE"; break;.    
3490: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50  case SQLITE_DROP
34a0: 5f 49 4e 44 45 58 20 20 20 20 20 20 20 20 3a 20  _INDEX        : 
34b0: 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52  zCode="SQLITE_DR
34c0: 4f 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b  OP_INDEX"; break
34d0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
34e0: 45 5f 44 52 4f 50 5f 54 41 42 4c 45 20 20 20 20  E_DROP_TABLE    
34f0: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
3500: 49 54 45 5f 44 52 4f 50 5f 54 41 42 4c 45 22 3b  ITE_DROP_TABLE";
3510: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
3520: 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d   SQLITE_DROP_TEM
3530: 50 5f 49 4e 44 45 58 20 20 20 3a 20 7a 43 6f 64  P_INDEX   : zCod
3540: 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54  e="SQLITE_DROP_T
3550: 45 4d 50 5f 49 4e 44 45 58 22 3b 20 62 72 65 61  EMP_INDEX"; brea
3560: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
3570: 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42  TE_DROP_TEMP_TAB
3580: 4c 45 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51  LE   : zCode="SQ
3590: 4c 49 54 45 5f 44 52 4f 50 5f 54 45 4d 50 5f 54  LITE_DROP_TEMP_T
35a0: 41 42 4c 45 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ABLE"; break;.  
35b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52    case SQLITE_DR
35c0: 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 20  OP_TEMP_TRIGGER 
35d0: 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f  : zCode="SQLITE_
35e0: 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47 45  DROP_TEMP_TRIGGE
35f0: 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  R"; break;.    c
3600: 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f 50 5f  ase SQLITE_DROP_
3610: 54 45 4d 50 5f 56 49 45 57 20 20 20 20 3a 20 7a  TEMP_VIEW    : z
3620: 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44 52 4f  Code="SQLITE_DRO
3630: 50 5f 54 45 4d 50 5f 56 49 45 57 22 3b 20 62 72  P_TEMP_VIEW"; br
3640: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
3650: 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49 47 47 45  LITE_DROP_TRIGGE
3660: 52 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22  R      : zCode="
3670: 53 51 4c 49 54 45 5f 44 52 4f 50 5f 54 52 49 47  SQLITE_DROP_TRIG
3680: 47 45 52 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  GER"; break;.   
3690: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 52 4f   case SQLITE_DRO
36a0: 50 5f 56 49 45 57 20 20 20 20 20 20 20 20 20 3a  P_VIEW         :
36b0: 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45 5f 44   zCode="SQLITE_D
36c0: 52 4f 50 5f 56 49 45 57 22 3b 20 62 72 65 61 6b  ROP_VIEW"; break
36d0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
36e0: 45 5f 49 4e 53 45 52 54 20 20 20 20 20 20 20 20  E_INSERT        
36f0: 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c      : zCode="SQL
3700: 49 54 45 5f 49 4e 53 45 52 54 22 3b 20 62 72 65  ITE_INSERT"; bre
3710: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
3720: 49 54 45 5f 50 52 41 47 4d 41 20 20 20 20 20 20  ITE_PRAGMA      
3730: 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53        : zCode="S
3740: 51 4c 49 54 45 5f 50 52 41 47 4d 41 22 3b 20 62  QLITE_PRAGMA"; b
3750: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
3760: 51 4c 49 54 45 5f 52 45 41 44 20 20 20 20 20 20  QLITE_READ      
3770: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
3780: 22 53 51 4c 49 54 45 5f 52 45 41 44 22 3b 20 62  "SQLITE_READ"; b
3790: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
37a0: 51 4c 49 54 45 5f 53 45 4c 45 43 54 20 20 20 20  QLITE_SELECT    
37b0: 20 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d          : zCode=
37c0: 22 53 51 4c 49 54 45 5f 53 45 4c 45 43 54 22 3b  "SQLITE_SELECT";
37d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
37e0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 41 43 54   SQLITE_TRANSACT
37f0: 49 4f 4e 20 20 20 20 20 20 20 3a 20 7a 43 6f 64  ION       : zCod
3800: 65 3d 22 53 51 4c 49 54 45 5f 54 52 41 4e 53 41  e="SQLITE_TRANSA
3810: 43 54 49 4f 4e 22 3b 20 62 72 65 61 6b 3b 0a 20  CTION"; break;. 
3820: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55     case SQLITE_U
3830: 50 44 41 54 45 20 20 20 20 20 20 20 20 20 20 20  PDATE           
3840: 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49 54 45   : zCode="SQLITE
3850: 5f 55 50 44 41 54 45 22 3b 20 62 72 65 61 6b 3b  _UPDATE"; break;
3860: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
3870: 5f 41 54 54 41 43 48 20 20 20 20 20 20 20 20 20  _ATTACH         
3880: 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51 4c 49     : zCode="SQLI
3890: 54 45 5f 41 54 54 41 43 48 22 3b 20 62 72 65 61  TE_ATTACH"; brea
38a0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
38b0: 54 45 5f 44 45 54 41 43 48 20 20 20 20 20 20 20  TE_DETACH       
38c0: 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22 53 51       : zCode="SQ
38d0: 4c 49 54 45 5f 44 45 54 41 43 48 22 3b 20 62 72  LITE_DETACH"; br
38e0: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
38f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3900: 20 20 20 20 20 20 20 3a 20 7a 43 6f 64 65 3d 22         : zCode="
3910: 3f 3f 3f 3f 22 3b 20 62 72 65 61 6b 3b 0a 20 20  ????"; break;.  
3920: 7d 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49  }.  Tcl_DStringI
3930: 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 54 63 6c  nit(&str);.  Tcl
3940: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 28 26  _DStringAppend(&
3950: 73 74 72 2c 20 70 44 62 2d 3e 7a 41 75 74 68 2c  str, pDb->zAuth,
3960: 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72   -1);.  Tcl_DStr
3970: 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ingAppendElement
3980: 28 26 73 74 72 2c 20 7a 43 6f 64 65 29 3b 0a 20  (&str, zCode);. 
3990: 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65   Tcl_DStringAppe
39a0: 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72 2c 20  ndElement(&str, 
39b0: 7a 41 72 67 31 20 3f 20 7a 41 72 67 31 20 3a 20  zArg1 ? zArg1 : 
39c0: 22 22 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  "");.  Tcl_DStri
39d0: 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  ngAppendElement(
39e0: 26 73 74 72 2c 20 7a 41 72 67 32 20 3f 20 7a 41  &str, zArg2 ? zA
39f0: 72 67 32 20 3a 20 22 22 29 3b 0a 20 20 54 63 6c  rg2 : "");.  Tcl
3a00: 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c  _DStringAppendEl
3a10: 65 6d 65 6e 74 28 26 73 74 72 2c 20 7a 41 72 67  ement(&str, zArg
3a20: 33 20 3f 20 7a 41 72 67 33 20 3a 20 22 22 29 3b  3 ? zArg3 : "");
3a30: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70  .  Tcl_DStringAp
3a40: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 26 73 74 72  pendElement(&str
3a50: 2c 20 7a 41 72 67 34 20 3f 20 7a 41 72 67 34 20  , zArg4 ? zArg4 
3a60: 3a 20 22 22 29 3b 0a 20 20 72 63 20 3d 20 54 63  : "");.  rc = Tc
3a70: 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 70 44 62  l_GlobalEval(pDb
3a80: 2d 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 44 53  ->interp, Tcl_DS
3a90: 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29  tringValue(&str)
3aa0: 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  );.  Tcl_DString
3ab0: 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 7a 52  Free(&str);.  zR
3ac0: 65 70 6c 79 20 3d 20 54 63 6c 5f 47 65 74 53 74  eply = Tcl_GetSt
3ad0: 72 69 6e 67 52 65 73 75 6c 74 28 70 44 62 2d 3e  ringResult(pDb->
3ae0: 69 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20 73  interp);.  if( s
3af0: 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53 51  trcmp(zReply,"SQ
3b00: 4c 49 54 45 5f 4f 4b 22 29 3d 3d 30 20 29 7b 0a  LITE_OK")==0 ){.
3b10: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
3b20: 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OK;.  }else if( 
3b30: 73 74 72 63 6d 70 28 7a 52 65 70 6c 79 2c 22 53  strcmp(zReply,"S
3b40: 51 4c 49 54 45 5f 44 45 4e 59 22 29 3d 3d 30 20  QLITE_DENY")==0 
3b50: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
3b60: 54 45 5f 44 45 4e 59 3b 0a 20 20 7d 65 6c 73 65  TE_DENY;.  }else
3b70: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 52 65 70   if( strcmp(zRep
3b80: 6c 79 2c 22 53 51 4c 49 54 45 5f 49 47 4e 4f 52  ly,"SQLITE_IGNOR
3b90: 45 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  E")==0 ){.    rc
3ba0: 20 3d 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45   = SQLITE_IGNORE
3bb0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
3bc0: 63 20 3d 20 39 39 39 3b 0a 20 20 7d 0a 20 20 72  c = 999;.  }.  r
3bd0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
3be0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
3bf0: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 20  T_AUTHORIZATION 
3c00: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 22 73  */../*.** The "s
3c10: 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20 62  qlite" command b
3c20: 65 6c 6f 77 20 63 72 65 61 74 65 73 20 61 20 6e  elow creates a n
3c30: 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 66  ew Tcl command f
3c40: 6f 72 20 65 61 63 68 0a 2a 2a 20 63 6f 6e 6e 65  or each.** conne
3c50: 63 74 69 6f 6e 20 69 74 20 6f 70 65 6e 73 20 74  ction it opens t
3c60: 6f 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61  o an SQLite data
3c70: 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  base.  This rout
3c80: 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 0a 2a  ine is invoked.*
3c90: 2a 20 77 68 65 6e 65 76 65 72 20 6f 6e 65 20 6f  * whenever one o
3ca0: 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69  f those connecti
3cb0: 6f 6e 2d 73 70 65 63 69 66 69 63 20 63 6f 6d 6d  on-specific comm
3cc0: 61 6e 64 73 20 69 73 20 65 78 65 63 75 74 65 64  ands is executed
3cd0: 0a 2a 2a 20 69 6e 20 54 63 6c 2e 20 20 46 6f 72  .** in Tcl.  For
3ce0: 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 79 6f 75   example, if you
3cf0: 20 72 75 6e 20 54 63 6c 20 63 6f 64 65 20 6c 69   run Tcl code li
3d00: 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20  ke this:.**.**  
3d10: 20 20 20 20 20 73 71 6c 69 74 65 20 64 62 31 20       sqlite db1 
3d20: 20 22 6d 79 5f 64 61 74 61 62 61 73 65 22 0a 2a   "my_database".*
3d30: 2a 20 20 20 20 20 20 20 64 62 31 20 63 6c 6f 73  *       db1 clos
3d40: 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  e.**.** The firs
3d50: 74 20 63 6f 6d 6d 61 6e 64 20 6f 70 65 6e 73 20  t command opens 
3d60: 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
3d70: 74 68 65 20 22 6d 79 5f 64 61 74 61 62 61 73 65  the "my_database
3d80: 22 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 61 6e  " database.** an
3d90: 64 20 63 61 6c 6c 73 20 74 68 61 74 20 63 6f 6e  d calls that con
3da0: 6e 65 63 74 69 6f 6e 20 22 64 62 31 22 2e 20 20  nection "db1".  
3db0: 54 68 65 20 73 65 63 6f 6e 64 20 63 6f 6d 6d 61  The second comma
3dc0: 6e 64 20 63 61 75 73 65 73 20 74 68 69 73 0a 2a  nd causes this.*
3dd0: 2a 20 73 75 62 72 6f 75 74 69 6e 65 20 74 6f 20  * subroutine to 
3de0: 62 65 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 73  be invoked..*/.s
3df0: 74 61 74 69 63 20 69 6e 74 20 44 62 4f 62 6a 43  tatic int DbObjC
3e00: 6d 64 28 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c  md(void *cd, Tcl
3e10: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
3e20: 20 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62   int objc,Tcl_Ob
3e30: 6a 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a  j *const*objv){.
3e40: 20 20 53 71 6c 69 74 65 44 62 20 2a 70 44 62 20    SqliteDb *pDb 
3e50: 3d 20 28 53 71 6c 69 74 65 44 62 2a 29 63 64 3b  = (SqliteDb*)cd;
3e60: 0a 20 20 69 6e 74 20 63 68 6f 69 63 65 3b 0a 20  .  int choice;. 
3e70: 20 69 6e 74 20 72 63 20 3d 20 54 43 4c 5f 4f 4b   int rc = TCL_OK
3e80: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
3e90: 20 63 68 61 72 20 2a 44 42 5f 73 74 72 73 5b 5d   char *DB_strs[]
3ea0: 20 3d 20 7b 0a 20 20 20 20 22 61 75 74 68 6f 72   = {.    "author
3eb0: 69 7a 65 72 22 2c 20 20 20 20 20 20 20 20 20 22  izer",         "
3ec0: 62 75 73 79 22 2c 20 20 20 20 20 20 20 20 20 20  busy",          
3ed0: 20 20 20 20 20 20 20 20 20 22 63 68 61 6e 67 65           "change
3ee0: 73 22 2c 0a 20 20 20 20 22 63 6c 6f 73 65 22 2c  s",.    "close",
3ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
3f00: 6f 6d 6d 69 74 5f 68 6f 6f 6b 22 2c 20 20 20 20  ommit_hook",    
3f10: 20 20 20 20 20 20 20 20 22 63 6f 6d 70 6c 65 74          "complet
3f20: 65 22 2c 0a 20 20 20 20 22 65 72 72 6f 72 63 6f  e",.    "errorco
3f30: 64 65 22 2c 20 20 20 20 20 20 20 20 20 20 22 65  de",          "e
3f40: 76 61 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20  val",           
3f50: 20 20 20 20 20 20 20 20 22 66 75 6e 63 74 69 6f          "functio
3f60: 6e 22 2c 0a 20 20 20 20 22 6c 61 73 74 5f 69 6e  n",.    "last_in
3f70: 73 65 72 74 5f 72 6f 77 69 64 22 2c 20 20 22 6c  sert_rowid",  "l
3f80: 61 73 74 5f 73 74 61 74 65 6d 65 6e 74 5f 63 68  ast_statement_ch
3f90: 61 6e 67 65 73 22 2c 20 22 6f 6e 65 63 6f 6c 75  anges", "onecolu
3fa0: 6d 6e 22 2c 0a 20 20 20 20 22 70 72 6f 67 72 65  mn",.    "progre
3fb0: 73 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 22  ss",           "
3fc0: 72 65 6b 65 79 22 2c 20 20 20 20 20 20 20 20 20  rekey",         
3fd0: 20 20 20 20 20 20 20 20 20 22 74 69 6d 65 6f 75           "timeou
3fe0: 74 22 2c 0a 20 20 20 20 22 74 72 61 63 65 22 2c  t",.    "trace",
3ff0: 0a 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20  .    0          
4000: 20 20 20 20 20 20 20 20 20 20 0a 20 20 7d 3b 0a            .  };.
4010: 20 20 65 6e 75 6d 20 44 42 5f 65 6e 75 6d 20 7b    enum DB_enum {
4020: 0a 20 20 20 20 44 42 5f 41 55 54 48 4f 52 49 5a  .    DB_AUTHORIZ
4030: 45 52 2c 20 20 20 20 20 20 20 20 44 42 5f 42 55  ER,        DB_BU
4040: 53 59 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  SY,             
4050: 20 20 20 20 20 20 44 42 5f 43 48 41 4e 47 45 53        DB_CHANGES
4060: 2c 0a 20 20 20 20 44 42 5f 43 4c 4f 53 45 2c 20  ,.    DB_CLOSE, 
4070: 20 20 20 20 20 20 20 20 20 20 20 20 44 42 5f 43              DB_C
4080: 4f 4d 4d 49 54 5f 48 4f 4f 4b 2c 20 20 20 20 20  OMMIT_HOOK,     
4090: 20 20 20 20 20 20 20 44 42 5f 43 4f 4d 50 4c 45         DB_COMPLE
40a0: 54 45 2c 0a 20 20 20 20 44 42 5f 45 52 52 4f 52  TE,.    DB_ERROR
40b0: 43 4f 44 45 2c 20 20 20 20 20 20 20 20 20 44 42  CODE,         DB
40c0: 5f 45 56 41 4c 2c 20 20 20 20 20 20 20 20 20 20  _EVAL,          
40d0: 20 20 20 20 20 20 20 20 20 44 42 5f 46 55 4e 43           DB_FUNC
40e0: 54 49 4f 4e 2c 0a 20 20 20 20 44 42 5f 4c 41 53  TION,.    DB_LAS
40f0: 54 5f 49 4e 53 45 52 54 5f 52 4f 57 49 44 2c 20  T_INSERT_ROWID, 
4100: 44 42 5f 4c 41 53 54 5f 53 54 41 54 45 4d 45 4e  DB_LAST_STATEMEN
4110: 54 5f 43 48 41 4e 47 45 53 2c 20 44 42 5f 4f 4e  T_CHANGES, DB_ON
4120: 45 43 4f 4c 55 4d 4e 2c 20 20 20 20 20 20 20 20  ECOLUMN,        
4130: 0a 20 20 20 20 44 42 5f 50 52 4f 47 52 45 53 53  .    DB_PROGRESS
4140: 2c 20 20 20 20 20 20 20 20 20 20 44 42 5f 52 45  ,          DB_RE
4150: 4b 45 59 2c 20 20 20 20 20 20 20 20 20 20 20 20  KEY,            
4160: 20 20 20 20 20 20 44 42 5f 54 49 4d 45 4f 55 54        DB_TIMEOUT
4170: 2c 0a 20 20 20 20 44 42 5f 54 52 41 43 45 0a 20  ,.    DB_TRACE. 
4180: 20 7d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c   };..  if( objc<
4190: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
41a0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
41b0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 55 42 43  , 1, objv, "SUBC
41c0: 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20 20  OMMAND ...");.  
41d0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
41e0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63  OR;.  }.  if( Tc
41f0: 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62  l_GetIndexFromOb
4200: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31  j(interp, objv[1
4210: 5d 2c 20 44 42 5f 73 74 72 73 2c 20 22 6f 70 74  ], DB_strs, "opt
4220: 69 6f 6e 22 2c 20 30 2c 20 26 63 68 6f 69 63 65  ion", 0, &choice
4230: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
4240: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
4250: 20 20 73 77 69 74 63 68 28 20 28 65 6e 75 6d 20    switch( (enum 
4260: 44 42 5f 65 6e 75 6d 29 63 68 6f 69 63 65 20 29  DB_enum)choice )
4270: 7b 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62 20 61  {..  /*    $db a
4280: 75 74 68 6f 72 69 7a 65 72 20 3f 43 41 4c 4c 42  uthorizer ?CALLB
4290: 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ACK?.  **.  ** I
42a0: 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20  nvoke the given 
42b0: 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74 68  callback to auth
42c0: 6f 72 69 7a 65 20 65 61 63 68 20 53 51 4c 20 6f  orize each SQL o
42d0: 70 65 72 61 74 69 6f 6e 20 61 73 20 69 74 20 69  peration as it i
42e0: 73 0a 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 64 2e  s.  ** compiled.
42f0: 20 20 35 20 61 72 67 75 6d 65 6e 74 73 20 61 72    5 arguments ar
4300: 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  e appended to th
4310: 65 20 63 61 6c 6c 62 61 63 6b 20 62 65 66 6f 72  e callback befor
4320: 65 20 69 74 20 69 73 0a 20 20 2a 2a 20 69 6e 76  e it is.  ** inv
4330: 6f 6b 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  oked:.  **.  ** 
4340: 20 20 28 31 29 20 54 68 65 20 61 75 74 68 6f 72    (1) The author
4350: 69 7a 61 74 69 6f 6e 20 74 79 70 65 20 28 65 78  ization type (ex
4360: 3a 20 53 51 4c 49 54 45 5f 43 52 45 41 54 45 5f  : SQLITE_CREATE_
4370: 54 41 42 4c 45 2c 20 53 51 4c 49 54 45 5f 49 4e  TABLE, SQLITE_IN
4380: 53 45 52 54 2c 20 2e 2e 2e 29 0a 20 20 2a 2a 20  SERT, ...).  ** 
4390: 20 20 28 32 29 20 46 69 72 73 74 20 64 65 73 63    (2) First desc
43a0: 72 69 70 74 69 76 65 20 6e 61 6d 65 20 28 64 65  riptive name (de
43b0: 70 65 6e 64 73 20 6f 6e 20 61 75 74 68 6f 72 69  pends on authori
43c0: 7a 61 74 69 6f 6e 20 74 79 70 65 29 0a 20 20 2a  zation type).  *
43d0: 2a 20 20 20 28 33 29 20 53 65 63 6f 6e 64 20 64  *   (3) Second d
43e0: 65 73 63 72 69 70 74 69 76 65 20 6e 61 6d 65 0a  escriptive name.
43f0: 20 20 2a 2a 20 20 20 28 34 29 20 4e 61 6d 65 20    **   (4) Name 
4400: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
4410: 28 65 78 3a 20 22 6d 61 69 6e 22 2c 20 22 74 65  (ex: "main", "te
4420: 6d 70 22 29 0a 20 20 2a 2a 20 20 20 28 35 29 20  mp").  **   (5) 
4430: 4e 61 6d 65 20 6f 66 20 74 72 69 67 67 65 72 20  Name of trigger 
4440: 74 68 61 74 20 69 73 20 64 6f 69 6e 67 20 74 68  that is doing th
4450: 65 20 61 63 63 65 73 73 0a 20 20 2a 2a 0a 20 20  e access.  **.  
4460: 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20  ** The callback 
4470: 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 6f 6e  should return on
4480: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
4490: 67 20 73 74 72 69 6e 67 73 3a 20 53 51 4c 49 54  g strings: SQLIT
44a0: 45 5f 4f 4b 2c 0a 20 20 2a 2a 20 53 51 4c 49 54  E_OK,.  ** SQLIT
44b0: 45 5f 49 47 4e 4f 52 45 2c 20 6f 72 20 53 51 4c  E_IGNORE, or SQL
44c0: 49 54 45 5f 44 45 4e 59 2e 20 20 41 6e 79 20 6f  ITE_DENY.  Any o
44d0: 74 68 65 72 20 72 65 74 75 72 6e 20 76 61 6c 75  ther return valu
44e0: 65 20 69 73 20 61 6e 20 65 72 72 6f 72 2e 0a 20  e is an error.. 
44f0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73   **.  ** If this
4500: 20 6d 65 74 68 6f 64 20 69 73 20 69 6e 76 6f 6b   method is invok
4510: 65 64 20 77 69 74 68 20 6e 6f 20 61 72 67 75 6d  ed with no argum
4520: 65 6e 74 73 2c 20 74 68 65 20 63 75 72 72 65 6e  ents, the curren
4530: 74 20 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 0a  t authorization.
4540: 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b 20 73 74    ** callback st
4550: 72 69 6e 67 20 69 73 20 72 65 74 75 72 6e 65 64  ring is returned
4560: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
4570: 5f 41 55 54 48 4f 52 49 5a 45 52 3a 20 7b 0a 20  _AUTHORIZER: {. 
4580: 20 20 20 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b     if( objc>3 ){
4590: 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  .      Tcl_Wrong
45a0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
45b0: 32 2c 20 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42  2, objv, "?CALLB
45c0: 41 43 4b 3f 22 29 3b 0a 20 20 20 20 7d 65 6c 73  ACK?");.    }els
45d0: 65 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b  e if( objc==2 ){
45e0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e  .      if( pDb->
45f0: 7a 41 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20  zAuth ){.       
4600: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
4610: 74 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a  t(interp, pDb->z
4620: 41 75 74 68 2c 20 30 29 3b 0a 20 20 20 20 20 20  Auth, 0);.      
4630: 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
4640: 20 20 20 63 68 61 72 20 2a 7a 41 75 74 68 3b 0a     char *zAuth;.
4650: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20        int len;. 
4660: 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 41       if( pDb->zA
4670: 75 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 54  uth ){.        T
4680: 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a 41 75  cl_Free(pDb->zAu
4690: 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  th);.      }.   
46a0: 20 20 20 7a 41 75 74 68 20 3d 20 54 63 6c 5f 47     zAuth = Tcl_G
46b0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
46c0: 6f 62 6a 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[2], &len);.
46d0: 20 20 20 20 20 20 69 66 28 20 7a 41 75 74 68 20        if( zAuth 
46e0: 26 26 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20  && len>0 ){.    
46f0: 20 20 20 20 70 44 62 2d 3e 7a 41 75 74 68 20 3d      pDb->zAuth =
4700: 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20   Tcl_Alloc( len 
4710: 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73  + 1 );.        s
4720: 74 72 63 70 79 28 70 44 62 2d 3e 7a 41 75 74 68  trcpy(pDb->zAuth
4730: 2c 20 7a 41 75 74 68 29 3b 0a 20 20 20 20 20 20  , zAuth);.      
4740: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
4750: 44 62 2d 3e 7a 41 75 74 68 20 3d 20 30 3b 0a 20  Db->zAuth = 0;. 
4760: 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
4770: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
4780: 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 20 20 69  RIZATION.      i
4790: 66 28 20 70 44 62 2d 3e 7a 41 75 74 68 20 29 7b  f( pDb->zAuth ){
47a0: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69 6e  .        pDb->in
47b0: 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20  terp = interp;. 
47c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
47d0: 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 44  et_authorizer(pD
47e0: 62 2d 3e 64 62 2c 20 61 75 74 68 5f 63 61 6c 6c  b->db, auth_call
47f0: 62 61 63 6b 2c 20 70 44 62 29 3b 0a 20 20 20 20  back, pDb);.    
4800: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4810: 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74   sqlite3_set_aut
4820: 68 6f 72 69 7a 65 72 28 70 44 62 2d 3e 64 62 2c  horizer(pDb->db,
4830: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
4840: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
4850: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
4860: 2a 20 20 20 20 24 64 62 20 62 75 73 79 20 3f 43  *    $db busy ?C
4870: 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20  ALLBACK?.  **.  
4880: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69  ** Invoke the gi
4890: 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  ven callback if 
48a0: 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
48b0: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65   attempts to ope
48c0: 6e 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b 65 64 20  n.  ** a locked 
48d0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
48e0: 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 42 55   */.  case DB_BU
48f0: 53 59 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62  SY: {.    if( ob
4900: 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63  jc>3 ){.      Tc
4910: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
4920: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
4930: 22 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20 20 20  "CALLBACK");.   
4940: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
4950: 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ROR;.    }else i
4960: 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20  f( objc==2 ){.  
4970: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75      if( pDb->zBu
4980: 73 79 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  sy ){.        Tc
4990: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
49a0: 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 42 75 73  nterp, pDb->zBus
49b0: 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  y, 0);.      }. 
49c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
49d0: 63 68 61 72 20 2a 7a 42 75 73 79 3b 0a 20 20 20  char *zBusy;.   
49e0: 20 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20     int len;.    
49f0: 20 20 69 66 28 20 70 44 62 2d 3e 7a 42 75 73 79    if( pDb->zBusy
4a00: 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
4a10: 46 72 65 65 28 70 44 62 2d 3e 7a 42 75 73 79 29  Free(pDb->zBusy)
4a20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
4a30: 7a 42 75 73 79 20 3d 20 54 63 6c 5f 47 65 74 53  zBusy = Tcl_GetS
4a40: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
4a50: 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20  v[2], &len);.   
4a60: 20 20 20 69 66 28 20 7a 42 75 73 79 20 26 26 20     if( zBusy && 
4a70: 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  len>0 ){.       
4a80: 20 70 44 62 2d 3e 7a 42 75 73 79 20 3d 20 54 63   pDb->zBusy = Tc
4a90: 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
4aa0: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72 63   );.        strc
4ab0: 70 79 28 70 44 62 2d 3e 7a 42 75 73 79 2c 20 7a  py(pDb->zBusy, z
4ac0: 42 75 73 79 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Busy);.      }el
4ad0: 73 65 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d  se{.        pDb-
4ae0: 3e 7a 42 75 73 79 20 3d 20 30 3b 0a 20 20 20 20  >zBusy = 0;.    
4af0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44    }.      if( pD
4b00: 62 2d 3e 7a 42 75 73 79 20 29 7b 0a 20 20 20 20  b->zBusy ){.    
4b10: 20 20 20 20 70 44 62 2d 3e 69 6e 74 65 72 70 20      pDb->interp 
4b20: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
4b30: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68    sqlite3_busy_h
4b40: 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20  andler(pDb->db, 
4b50: 44 62 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70  DbBusyHandler, p
4b60: 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
4b70: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
4b80: 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 70  3_busy_handler(p
4b90: 44 62 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  Db->db, 0, 0);. 
4ba0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
4bb0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
4bc0: 2a 20 20 20 20 24 64 62 20 70 72 6f 67 72 65 73  *    $db progres
4bd0: 73 20 3f 4e 20 43 41 4c 4c 42 41 43 4b 3f 0a 20  s ?N CALLBACK?. 
4be0: 20 2a 2a 20 0a 20 20 2a 2a 20 49 6e 76 6f 6b 65   ** .  ** Invoke
4bf0: 20 74 68 65 20 67 69 76 65 6e 20 63 61 6c 6c 62   the given callb
4c00: 61 63 6b 20 65 76 65 72 79 20 4e 20 76 69 72 74  ack every N virt
4c10: 75 61 6c 20 6d 61 63 68 69 6e 65 20 6f 70 63 6f  ual machine opco
4c20: 64 65 73 20 77 68 69 6c 65 20 65 78 65 63 75 74  des while execut
4c30: 69 6e 67 0a 20 20 2a 2a 20 71 75 65 72 69 65 73  ing.  ** queries
4c40: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
4c50: 5f 50 52 4f 47 52 45 53 53 3a 20 7b 0a 20 20 20  _PROGRESS: {.   
4c60: 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a   if( objc==2 ){.
4c70: 20 20 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a        if( pDb->z
4c80: 50 72 6f 67 72 65 73 73 20 29 7b 0a 20 20 20 20  Progress ){.    
4c90: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
4ca0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 44 62  sult(interp, pDb
4cb0: 2d 3e 7a 50 72 6f 67 72 65 73 73 2c 20 30 29 3b  ->zProgress, 0);
4cc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
4cd0: 73 65 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29  se if( objc==4 )
4ce0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 50  {.      char *zP
4cf0: 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 20 20 69  rogress;.      i
4d00: 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69 6e  nt len;.      in
4d10: 74 20 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 54  t N;.      if( T
4d20: 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e  CL_OK!=Tcl_GetIn
4d30: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
4d40: 20 6f 62 6a 76 5b 32 5d 2c 20 26 4e 29 20 29 7b   objv[2], &N) ){
4d50: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
4d60: 4f 52 3b 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20  OR;.      };.   
4d70: 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f     if( pDb->zPro
4d80: 67 72 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20  gress ){.       
4d90: 20 54 63 6c 5f 46 72 65 65 28 70 44 62 2d 3e 7a   Tcl_Free(pDb->z
4da0: 50 72 6f 67 72 65 73 73 29 3b 0a 20 20 20 20 20  Progress);.     
4db0: 20 7d 0a 20 20 20 20 20 20 7a 50 72 6f 67 72 65   }.      zProgre
4dc0: 73 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ss = Tcl_GetStri
4dd0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33  ngFromObj(objv[3
4de0: 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20  ], &len);.      
4df0: 69 66 28 20 7a 50 72 6f 67 72 65 73 73 20 26 26  if( zProgress &&
4e00: 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
4e10: 20 20 70 44 62 2d 3e 7a 50 72 6f 67 72 65 73 73    pDb->zProgress
4e20: 20 3d 20 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65   = Tcl_Alloc( le
4e30: 6e 20 2b 20 31 20 29 3b 0a 20 20 20 20 20 20 20  n + 1 );.       
4e40: 20 73 74 72 63 70 79 28 70 44 62 2d 3e 7a 50 72   strcpy(pDb->zPr
4e50: 6f 67 72 65 73 73 2c 20 7a 50 72 6f 67 72 65 73  ogress, zProgres
4e60: 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  s);.      }else{
4e70: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 7a 50  .        pDb->zP
4e80: 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20  rogress = 0;.   
4e90: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
4ea0: 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53  ITE_OMIT_PROGRES
4eb0: 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 20 20 20  S_CALLBACK.     
4ec0: 20 69 66 28 20 70 44 62 2d 3e 7a 50 72 6f 67 72   if( pDb->zProgr
4ed0: 65 73 73 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ess ){.        p
4ee0: 44 62 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74  Db->interp = int
4ef0: 65 72 70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  erp;.        sql
4f00: 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61  ite3_progress_ha
4f10: 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62 2c 20 4e  ndler(pDb->db, N
4f20: 2c 20 44 62 50 72 6f 67 72 65 73 73 48 61 6e 64  , DbProgressHand
4f30: 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20 20 20 20  ler, pDb);.     
4f40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4f50: 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73  sqlite3_progress
4f60: 5f 68 61 6e 64 6c 65 72 28 70 44 62 2d 3e 64 62  _handler(pDb->db
4f70: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
4f80: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
4f90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 63 6c 5f  else{.      Tcl_
4fa0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
4fb0: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4e  erp, 2, objv, "N
4fc0: 20 43 41 4c 4c 42 41 43 4b 22 29 3b 0a 20 20 20   CALLBACK");.   
4fd0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
4fe0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  ROR;.    }.    b
4ff0: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
5000: 20 20 2a 2a 20 20 20 20 20 24 64 62 20 63 68 61    **     $db cha
5010: 6e 67 65 73 0a 20 20 2a 2a 0a 20 20 2a 2a 20 52  nges.  **.  ** R
5020: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
5030: 20 6f 66 20 72 6f 77 73 20 74 68 61 74 20 77 65   of rows that we
5040: 72 65 20 6d 6f 64 69 66 69 65 64 2c 20 69 6e 73  re modified, ins
5050: 65 72 74 65 64 2c 20 6f 72 20 64 65 6c 65 74 65  erted, or delete
5060: 64 20 62 79 0a 20 20 2a 2a 20 74 68 65 20 6d 6f  d by.  ** the mo
5070: 73 74 20 72 65 63 65 6e 74 20 22 65 76 61 6c 22  st recent "eval"
5080: 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42  ..  */.  case DB
5090: 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20 20 20  _CHANGES: {.    
50a0: 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74  Tcl_Obj *pResult
50b0: 3b 0a 20 20 20 20 69 6e 74 20 6e 43 68 61 6e 67  ;.    int nChang
50c0: 65 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 21  e;.    if( objc!
50d0: 3d 32 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  =2 ){.      Tcl_
50e0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
50f0: 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22  erp, 2, objv, ""
5100: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
5110: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
5120: 0a 20 20 20 20 6e 43 68 61 6e 67 65 20 3d 20 73  .    nChange = s
5130: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 70  qlite3_changes(p
5140: 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20 70 52 65  Db->db);.    pRe
5150: 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62  sult = Tcl_GetOb
5160: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  jResult(interp);
5170: 0a 20 20 20 20 54 63 6c 5f 53 65 74 49 6e 74 4f  .    Tcl_SetIntO
5180: 62 6a 28 70 52 65 73 75 6c 74 2c 20 6e 43 68 61  bj(pResult, nCha
5190: 6e 67 65 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b  nge);.    break;
51a0: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
51b0: 20 20 20 20 24 64 62 20 6c 61 73 74 5f 73 74 61      $db last_sta
51c0: 74 65 6d 65 6e 74 5f 63 68 61 6e 67 65 73 0a 20  tement_changes. 
51d0: 20 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20   **.  ** Return 
51e0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f  the number of ro
51f0: 77 73 20 74 68 61 74 20 77 65 72 65 20 6d 6f 64  ws that were mod
5200: 69 66 69 65 64 2c 20 69 6e 73 65 72 74 65 64 2c  ified, inserted,
5210: 20 6f 72 20 64 65 6c 65 74 65 64 20 62 79 0a 20   or deleted by. 
5220: 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 73 74 61   ** the last sta
5230: 74 6d 65 6e 74 20 74 6f 20 63 6f 6d 70 6c 65 74  tment to complet
5240: 65 20 65 78 65 63 75 74 69 6f 6e 20 28 65 78 63  e execution (exc
5250: 6c 75 64 69 6e 67 20 63 68 61 6e 67 65 73 20 64  luding changes d
5260: 75 65 20 74 6f 0a 20 20 2a 2a 20 74 72 69 67 67  ue to.  ** trigg
5270: 65 72 73 29 0a 20 20 2a 2f 0a 20 20 63 61 73 65  ers).  */.  case
5280: 20 44 42 5f 4c 41 53 54 5f 53 54 41 54 45 4d 45   DB_LAST_STATEME
5290: 4e 54 5f 43 48 41 4e 47 45 53 3a 20 7b 0a 20 20  NT_CHANGES: {.  
52a0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
52b0: 6c 74 3b 0a 20 20 20 20 69 6e 74 20 6c 73 43 68  lt;.    int lsCh
52c0: 61 6e 67 65 3b 0a 20 20 20 20 69 66 28 20 6f 62  ange;.    if( ob
52d0: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 54  jc!=2 ){.      T
52e0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
52f0: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
5300: 20 22 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75   "");.      retu
5310: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
5320: 20 20 7d 0a 20 20 20 20 6c 73 43 68 61 6e 67 65    }.    lsChange
5330: 20 3d 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f   = sqlite3_last_
5340: 73 74 61 74 65 6d 65 6e 74 5f 63 68 61 6e 67 65  statement_change
5350: 73 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20 20 20  s(pDb->db);.    
5360: 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 47 65  pResult = Tcl_Ge
5370: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
5380: 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 49  p);.    Tcl_SetI
5390: 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 6c  ntObj(pResult, l
53a0: 73 43 68 61 6e 67 65 29 3b 0a 20 20 20 20 62 72  sChange);.    br
53b0: 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 20  eak;.  }..  /*  
53c0: 20 20 24 64 62 20 63 6c 6f 73 65 0a 20 20 2a 2a    $db close.  **
53d0: 0a 20 20 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  .  ** Shutdown t
53e0: 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2f  he database.  */
53f0: 0a 20 20 63 61 73 65 20 44 42 5f 43 4c 4f 53 45  .  case DB_CLOSE
5400: 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65  : {.    Tcl_Dele
5410: 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70  teCommand(interp
5420: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  , Tcl_GetStringF
5430: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
5440: 30 29 29 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a  0));.    break;.
5450: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
5460: 20 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 20 3f 43 41   commit_hook ?CA
5470: 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a 0a 20 20 2a  LLBACK?.  **.  *
5480: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76  * Invoke the giv
5490: 65 6e 20 63 61 6c 6c 62 61 63 6b 20 6a 75 73 74  en callback just
54a0: 20 62 65 66 6f 72 65 20 63 6f 6d 6d 69 74 74 69   before committi
54b0: 6e 67 20 65 76 65 72 79 20 53 51 4c 20 74 72 61  ng every SQL tra
54c0: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 49  nsaction..  ** I
54d0: 66 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 74  f the callback t
54e0: 68 72 6f 77 73 20 61 6e 20 65 78 63 65 70 74 69  hrows an excepti
54f0: 6f 6e 20 6f 72 20 72 65 74 75 72 6e 73 20 6e 6f  on or returns no
5500: 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n-zero, then the
5510: 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
5520: 6e 20 69 73 20 61 62 6f 72 74 65 64 2e 20 20 49  n is aborted.  I
5530: 66 20 43 41 4c 4c 42 41 43 4b 20 69 73 20 61 6e  f CALLBACK is an
5540: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 20 74   empty string, t
5550: 68 65 20 63 61 6c 6c 62 61 63 6b 0a 20 20 2a 2a  he callback.  **
5560: 20 69 73 20 64 69 73 61 62 6c 65 64 2e 0a 20 20   is disabled..  
5570: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 43 4f 4d  */.  case DB_COM
5580: 4d 49 54 5f 48 4f 4f 4b 3a 20 7b 0a 20 20 20 20  MIT_HOOK: {.    
5590: 69 66 28 20 6f 62 6a 63 3e 33 20 29 7b 0a 20 20  if( objc>3 ){.  
55a0: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
55b0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20  Args(interp, 2, 
55c0: 6f 62 6a 76 2c 20 22 3f 43 41 4c 4c 42 41 43 4b  objv, "?CALLBACK
55d0: 3f 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ?");.    }else i
55e0: 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20  f( objc==2 ){.  
55f0: 20 20 20 20 69 66 28 20 70 44 62 2d 3e 7a 43 6f      if( pDb->zCo
5600: 6d 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  mmit ){.        
5610: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
5620: 28 69 6e 74 65 72 70 2c 20 70 44 62 2d 3e 7a 43  (interp, pDb->zC
5630: 6f 6d 6d 69 74 2c 20 30 29 3b 0a 20 20 20 20 20  ommit, 0);.     
5640: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
5650: 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6d 6d 69      char *zCommi
5660: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6c 65 6e  t;.      int len
5670: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 62 2d  ;.      if( pDb-
5680: 3e 7a 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  >zCommit ){.    
5690: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 44 62      Tcl_Free(pDb
56a0: 2d 3e 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20  ->zCommit);.    
56b0: 20 20 7d 0a 20 20 20 20 20 20 7a 43 6f 6d 6d 69    }.      zCommi
56c0: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  t = Tcl_GetStrin
56d0: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
56e0: 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 20 20 69  , &len);.      i
56f0: 66 28 20 7a 43 6f 6d 6d 69 74 20 26 26 20 6c 65  f( zCommit && le
5700: 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  n>0 ){.        p
5710: 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 54 63  Db->zCommit = Tc
5720: 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b 20 31  l_Alloc( len + 1
5730: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74 72 63   );.        strc
5740: 70 79 28 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 2c  py(pDb->zCommit,
5750: 20 7a 43 6f 6d 6d 69 74 29 3b 0a 20 20 20 20 20   zCommit);.     
5760: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
5770: 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74 20 3d 20 30  pDb->zCommit = 0
5780: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
5790: 69 66 28 20 70 44 62 2d 3e 7a 43 6f 6d 6d 69 74  if( pDb->zCommit
57a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d   ){.        pDb-
57b0: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
57c0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
57d0: 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 70 44  3_commit_hook(pD
57e0: 62 2d 3e 64 62 2c 20 44 62 43 6f 6d 6d 69 74 48  b->db, DbCommitH
57f0: 61 6e 64 6c 65 72 2c 20 70 44 62 29 3b 0a 20 20  andler, pDb);.  
5800: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5810: 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69     sqlite3_commi
5820: 74 5f 68 6f 6f 6b 28 70 44 62 2d 3e 64 62 2c 20  t_hook(pDb->db, 
5830: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
5840: 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a     }.    break;.
5850: 20 20 7d 0a 0a 20 20 2f 2a 20 20 20 20 24 64 62    }..  /*    $db
5860: 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 0a 20 20   complete SQL.  
5870: 2a 2a 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 54  **.  ** Return T
5880: 52 55 45 20 69 66 20 53 51 4c 20 69 73 20 61 20  RUE if SQL is a 
5890: 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61  complete SQL sta
58a0: 74 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20  tement.  Return 
58b0: 46 41 4c 53 45 20 69 66 0a 20 20 2a 2a 20 61 64  FALSE if.  ** ad
58c0: 64 69 74 69 6f 6e 61 6c 20 6c 69 6e 65 73 20 6f  ditional lines o
58d0: 66 20 69 6e 70 75 74 20 61 72 65 20 6e 65 65 64  f input are need
58e0: 65 64 2e 20 20 54 68 69 73 20 69 73 20 73 69 6d  ed.  This is sim
58f0: 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a  ilar to the.  **
5900: 20 62 75 69 6c 74 2d 69 6e 20 22 69 6e 66 6f 20   built-in "info 
5910: 63 6f 6d 70 6c 65 74 65 22 20 63 6f 6d 6d 61 6e  complete" comman
5920: 64 20 6f 66 20 54 63 6c 2e 0a 20 20 2a 2f 0a 20  d of Tcl..  */. 
5930: 20 63 61 73 65 20 44 42 5f 43 4f 4d 50 4c 45 54   case DB_COMPLET
5940: 45 3a 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  E: {.    Tcl_Obj
5950: 20 2a 70 52 65 73 75 6c 74 3b 0a 20 20 20 20 69   *pResult;.    i
5960: 6e 74 20 69 73 43 6f 6d 70 6c 65 74 65 3b 0a 20  nt isComplete;. 
5970: 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29     if( objc!=3 )
5980: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e  {.      Tcl_Wron
5990: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
59a0: 20 32 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22 29   2, objv, "SQL")
59b0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
59c0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
59d0: 20 20 20 20 69 73 43 6f 6d 70 6c 65 74 65 20 3d      isComplete =
59e0: 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74   sqlite3_complet
59f0: 65 28 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  e( Tcl_GetString
5a00: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
5a10: 20 30 29 20 29 3b 0a 20 20 20 20 70 52 65 73 75   0) );.    pResu
5a20: 6c 74 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52  lt = Tcl_GetObjR
5a30: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
5a40: 20 20 20 54 63 6c 5f 53 65 74 42 6f 6f 6c 65 61     Tcl_SetBoolea
5a50: 6e 4f 62 6a 28 70 52 65 73 75 6c 74 2c 20 69 73  nObj(pResult, is
5a60: 43 6f 6d 70 6c 65 74 65 29 3b 0a 20 20 20 20 62  Complete);.    b
5a70: 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  reak;.  }..  /*.
5a80: 20 20 2a 2a 20 20 20 20 24 64 62 20 65 72 72 6f    **    $db erro
5a90: 72 63 6f 64 65 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rcode.  **.  ** 
5aa0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 65 72  Return the numer
5ab0: 69 63 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68  ic error code th
5ac0: 61 74 20 77 61 73 20 72 65 74 75 72 6e 65 64 20  at was returned 
5ad0: 62 79 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  by the most rece
5ae0: 6e 74 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20  nt.  ** call to 
5af0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a  sqlite3_exec()..
5b00: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 45    */.  case DB_E
5b10: 52 52 4f 52 43 4f 44 45 3a 20 7b 0a 20 20 20 20  RRORCODE: {.    
5b20: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
5b30: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
5b40: 49 6e 74 4f 62 6a 28 70 44 62 2d 3e 72 63 29 29  IntObj(pDb->rc))
5b50: 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
5b60: 0a 20 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20  .   .  /*.  **  
5b70: 20 20 24 64 62 20 65 76 61 6c 20 24 73 71 6c 20    $db eval $sql 
5b80: 3f 61 72 72 61 79 20 7b 20 20 2e 2e 2e 63 6f 64  ?array {  ...cod
5b90: 65 2e 2e 2e 20 7d 3f 0a 20 20 2a 2a 0a 20 20 2a  e... }?.  **.  *
5ba0: 2a 20 54 68 65 20 53 51 4c 20 73 74 61 74 65 6d  * The SQL statem
5bb0: 65 6e 74 20 69 6e 20 24 73 71 6c 20 69 73 20 65  ent in $sql is e
5bc0: 76 61 6c 75 61 74 65 64 2e 20 20 46 6f 72 20 65  valuated.  For e
5bd0: 61 63 68 20 72 6f 77 2c 20 74 68 65 20 76 61 6c  ach row, the val
5be0: 75 65 73 20 61 72 65 0a 20 20 2a 2a 20 70 6c 61  ues are.  ** pla
5bf0: 63 65 64 20 69 6e 20 65 6c 65 6d 65 6e 74 73 20  ced in elements 
5c00: 6f 66 20 74 68 65 20 61 72 72 61 79 20 6e 61 6d  of the array nam
5c10: 65 64 20 22 61 72 72 61 79 22 20 61 6e 64 20 2e  ed "array" and .
5c20: 2e 2e 63 6f 64 65 2e 2e 2e 20 69 73 20 65 78 65  ..code... is exe
5c30: 63 75 74 65 64 2e 0a 20 20 2a 2a 20 49 66 20 22  cuted..  ** If "
5c40: 61 72 72 61 79 22 20 61 6e 64 20 22 63 6f 64 65  array" and "code
5c50: 22 20 61 72 65 20 6f 6d 69 74 74 65 64 2c 20 74  " are omitted, t
5c60: 68 65 6e 20 6e 6f 20 63 61 6c 6c 62 61 63 6b 20  hen no callback 
5c70: 69 73 20 65 76 65 72 79 20 69 6e 76 6f 6b 65 64  is every invoked
5c80: 2e 0a 20 20 2a 2a 20 49 66 20 22 61 72 72 61 79  ..  ** If "array
5c90: 22 20 69 73 20 61 6e 20 65 6d 70 74 79 20 73 74  " is an empty st
5ca0: 72 69 6e 67 2c 20 74 68 65 6e 20 74 68 65 20 76  ring, then the v
5cb0: 61 6c 75 65 73 20 61 72 65 20 70 6c 61 63 65 64  alues are placed
5cc0: 20 69 6e 20 76 61 72 69 61 62 6c 65 73 0a 20 20   in variables.  
5cd0: 2a 2a 20 74 68 61 74 20 68 61 76 65 20 74 68 65  ** that have the
5ce0: 20 73 61 6d 65 20 6e 61 6d 65 20 61 73 20 74 68   same name as th
5cf0: 65 20 66 69 65 6c 64 73 20 65 78 74 72 61 63 74  e fields extract
5d00: 65 64 20 62 79 20 74 68 65 20 71 75 65 72 79 2e  ed by the query.
5d10: 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f  .  */.  case DB_
5d20: 45 56 41 4c 3a 20 7b 0a 20 20 20 20 43 61 6c 6c  EVAL: {.    Call
5d30: 62 61 63 6b 44 61 74 61 20 63 62 44 61 74 61 3b  backData cbData;
5d40: 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  .    char *zErrM
5d50: 73 67 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  sg;.    char *zS
5d60: 71 6c 3b 0a 23 69 66 64 65 66 20 55 54 46 5f 54  ql;.#ifdef UTF_T
5d70: 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e 45 45 44 45  RANSLATION_NEEDE
5d80: 44 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e  D.    Tcl_DStrin
5d90: 67 20 64 53 71 6c 3b 0a 20 20 20 20 69 6e 74 20  g dSql;.    int 
5da0: 69 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 69  i;.#endif..    i
5db0: 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62  f( objc!=5 && ob
5dc0: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54  jc!=3 ){.      T
5dd0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
5de0: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
5df0: 20 22 53 51 4c 20 3f 41 52 52 41 59 2d 4e 41 4d   "SQL ?ARRAY-NAM
5e00: 45 20 43 4f 44 45 3f 22 29 3b 0a 20 20 20 20 20  E CODE?");.     
5e10: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
5e20: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 44 62  R;.    }.    pDb
5e30: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72  ->interp = inter
5e40: 70 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 54 63  p;.    zSql = Tc
5e50: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
5e60: 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a  bj(objv[2], 0);.
5e70: 23 69 66 64 65 66 20 55 54 46 5f 54 52 41 4e 53  #ifdef UTF_TRANS
5e80: 4c 41 54 49 4f 4e 5f 4e 45 45 44 45 44 0a 20 20  LATION_NEEDED.  
5e90: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
5ea0: 74 28 26 64 53 71 6c 29 3b 0a 20 20 20 20 54 63  t(&dSql);.    Tc
5eb0: 6c 5f 55 74 66 54 6f 45 78 74 65 72 6e 61 6c 44  l_UtfToExternalD
5ec0: 53 74 72 69 6e 67 28 4e 55 4c 4c 2c 20 7a 53 71  String(NULL, zSq
5ed0: 6c 2c 20 2d 31 2c 20 26 64 53 71 6c 29 3b 0a 20  l, -1, &dSql);. 
5ee0: 20 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 44 53     zSql = Tcl_DS
5ef0: 74 72 69 6e 67 56 61 6c 75 65 28 26 64 53 71 6c  tringValue(&dSql
5f00: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 54 63  );.#endif.    Tc
5f10: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 6f  l_IncrRefCount(o
5f20: 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 69 66 28  bjv[2]);.    if(
5f30: 20 6f 62 6a 63 3d 3d 35 20 29 7b 0a 20 20 20 20   objc==5 ){.    
5f40: 20 20 63 62 44 61 74 61 2e 69 6e 74 65 72 70 20    cbData.interp 
5f50: 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 20 20  = interp;.      
5f60: 63 62 44 61 74 61 2e 6f 6e 63 65 20 3d 20 31 3b  cbData.once = 1;
5f70: 0a 20 20 20 20 20 20 63 62 44 61 74 61 2e 7a 41  .      cbData.zA
5f80: 72 72 61 79 20 3d 20 54 63 6c 5f 47 65 74 53 74  rray = Tcl_GetSt
5f90: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
5fa0: 5b 33 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 63  [3], 0);.      c
5fb0: 62 44 61 74 61 2e 70 43 6f 64 65 20 3d 20 6f 62  bData.pCode = ob
5fc0: 6a 76 5b 34 5d 3b 0a 20 20 20 20 20 20 63 62 44  jv[4];.      cbD
5fd0: 61 74 61 2e 74 63 6c 5f 72 63 20 3d 20 54 43 4c  ata.tcl_rc = TCL
5fe0: 5f 4f 4b 3b 0a 20 20 20 20 20 20 63 62 44 61 74  _OK;.      cbDat
5ff0: 61 2e 6e 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b 0a  a.nColName = 0;.
6000: 20 20 20 20 20 20 63 62 44 61 74 61 2e 61 7a 43        cbData.azC
6010: 6f 6c 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  olName = 0;.    
6020: 20 20 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20    zErrMsg = 0;. 
6030: 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66       Tcl_IncrRef
6040: 43 6f 75 6e 74 28 6f 62 6a 76 5b 33 5d 29 3b 0a  Count(objv[3]);.
6050: 20 20 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65        Tcl_IncrRe
6060: 66 43 6f 75 6e 74 28 6f 62 6a 76 5b 34 5d 29 3b  fCount(objv[4]);
6070: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
6080: 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e 64 62  te3_exec(pDb->db
6090: 2c 20 7a 53 71 6c 2c 20 44 62 45 76 61 6c 43 61  , zSql, DbEvalCa
60a0: 6c 6c 62 61 63 6b 2c 20 26 63 62 44 61 74 61 2c  llback, &cbData,
60b0: 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20   &zErrMsg);.    
60c0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
60d0: 6e 74 28 6f 62 6a 76 5b 34 5d 29 3b 0a 20 20 20  nt(objv[4]);.   
60e0: 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
60f0: 75 6e 74 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20  unt(objv[3]);.  
6100: 20 20 20 20 69 66 28 20 63 62 44 61 74 61 2e 74      if( cbData.t
6110: 63 6c 5f 72 63 3d 3d 54 43 4c 5f 42 52 45 41 4b  cl_rc==TCL_BREAK
6120: 20 29 7b 20 63 62 44 61 74 61 2e 74 63 6c 5f 72   ){ cbData.tcl_r
6130: 63 20 3d 20 54 43 4c 5f 4f 4b 3b 20 7d 0a 20 20  c = TCL_OK; }.  
6140: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54    }else{.      T
6150: 63 6c 5f 4f 62 6a 20 2a 70 4c 69 73 74 20 3d 20  cl_Obj *pList = 
6160: 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20  Tcl_NewObj();.  
6170: 20 20 20 20 63 62 44 61 74 61 2e 74 63 6c 5f 72      cbData.tcl_r
6180: 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20  c = TCL_OK;.    
6190: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
61a0: 78 65 63 28 70 44 62 2d 3e 64 62 2c 20 7a 53 71  xec(pDb->db, zSq
61b0: 6c 2c 20 44 62 45 76 61 6c 43 61 6c 6c 62 61 63  l, DbEvalCallbac
61c0: 6b 32 2c 20 70 4c 69 73 74 2c 20 26 7a 45 72 72  k2, pList, &zErr
61d0: 4d 73 67 29 3b 0a 20 20 20 20 20 20 54 63 6c 5f  Msg);.      Tcl_
61e0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
61f0: 65 72 70 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  erp, pList);.   
6200: 20 7d 0a 20 20 20 20 70 44 62 2d 3e 72 63 20 3d   }.    pDb->rc =
6210: 20 72 63 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   rc;.    if( rc=
6220: 3d 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 29 7b  =SQLITE_ABORT ){
6230: 0a 20 20 20 20 20 20 69 66 28 20 7a 45 72 72 4d  .      if( zErrM
6240: 73 67 20 29 20 66 72 65 65 28 7a 45 72 72 4d 73  sg ) free(zErrMs
6250: 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 63  g);.      rc = c
6260: 62 44 61 74 61 2e 74 63 6c 5f 72 63 3b 0a 20 20  bData.tcl_rc;.  
6270: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 45 72 72    }else if( zErr
6280: 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  Msg ){.      Tcl
6290: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
62a0: 70 2c 20 7a 45 72 72 4d 73 67 2c 20 54 43 4c 5f  p, zErrMsg, TCL_
62b0: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 20  VOLATILE);.     
62c0: 20 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a   free(zErrMsg);.
62d0: 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c 5f 45        rc = TCL_E
62e0: 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20  RROR;.    }else 
62f0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
6300: 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  K ){.      Tcl_A
6310: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
6320: 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6f  rp, sqlite3_erro
6330: 72 5f 73 74 72 69 6e 67 28 72 63 29 2c 20 30 29  r_string(rc), 0)
6340: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  ;.      rc = TCL
6350: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
6360: 65 7b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  e{.    }.    Tcl
6370: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 6f 62  _DecrRefCount(ob
6380: 6a 76 5b 32 5d 29 3b 0a 23 69 66 64 65 66 20 55  jv[2]);.#ifdef U
6390: 54 46 5f 54 52 41 4e 53 4c 41 54 49 4f 4e 5f 4e  TF_TRANSLATION_N
63a0: 45 45 44 45 44 0a 20 20 20 20 54 63 6c 5f 44 53  EEDED.    Tcl_DS
63b0: 74 72 69 6e 67 46 72 65 65 28 26 64 53 71 6c 29  tringFree(&dSql)
63c0: 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d 3d  ;.    if( objc==
63d0: 35 20 26 26 20 63 62 44 61 74 61 2e 61 7a 43 6f  5 && cbData.azCo
63e0: 6c 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 66  lName ){.      f
63f0: 6f 72 28 69 3d 30 3b 20 69 3c 63 62 44 61 74 61  or(i=0; i<cbData
6400: 2e 6e 43 6f 6c 4e 61 6d 65 3b 20 69 2b 2b 29 7b  .nColName; i++){
6410: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 62 44  .        if( cbD
6420: 61 74 61 2e 61 7a 43 6f 6c 4e 61 6d 65 5b 69 5d  ata.azColName[i]
6430: 20 29 20 66 72 65 65 28 63 62 44 61 74 61 2e 61   ) free(cbData.a
6440: 7a 43 6f 6c 4e 61 6d 65 5b 69 5d 29 3b 0a 20 20  zColName[i]);.  
6450: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 72 65 65      }.      free
6460: 28 63 62 44 61 74 61 2e 61 7a 43 6f 6c 4e 61 6d  (cbData.azColNam
6470: 65 29 3b 0a 20 20 20 20 20 20 63 62 44 61 74 61  e);.      cbData
6480: 2e 61 7a 43 6f 6c 4e 61 6d 65 20 3d 20 30 3b 0a  .azColName = 0;.
6490: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
64a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
64b0: 0a 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24  .  /*.  **     $
64c0: 64 62 20 66 75 6e 63 74 69 6f 6e 20 4e 41 4d 45  db function NAME
64d0: 20 53 43 52 49 50 54 0a 20 20 2a 2a 0a 20 20 2a   SCRIPT.  **.  *
64e0: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53  * Create a new S
64f0: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  QL function call
6500: 65 64 20 4e 41 4d 45 2e 20 20 57 68 65 6e 65 76  ed NAME.  Whenev
6510: 65 72 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e  er that function
6520: 20 69 73 0a 20 20 2a 2a 20 63 61 6c 6c 65 64 2c   is.  ** called,
6530: 20 69 6e 76 6f 6b 65 20 53 43 52 49 50 54 20 74   invoke SCRIPT t
6540: 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 66  o evaluate the f
6550: 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  unction..  */.  
6560: 63 61 73 65 20 44 42 5f 46 55 4e 43 54 49 4f 4e  case DB_FUNCTION
6570: 3a 20 7b 0a 20 20 20 20 53 71 6c 46 75 6e 63 20  : {.    SqlFunc 
6580: 2a 70 46 75 6e 63 3b 0a 20 20 20 20 63 68 61 72  *pFunc;.    char
6590: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 63 68 61   *zName;.    cha
65a0: 72 20 2a 7a 53 63 72 69 70 74 3b 0a 20 20 20 20  r *zScript;.    
65b0: 69 6e 74 20 6e 53 63 72 69 70 74 3b 0a 20 20 20  int nScript;.   
65c0: 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
65d0: 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e        Tcl_WrongN
65e0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32  umArgs(interp, 2
65f0: 2c 20 6f 62 6a 76 2c 20 22 4e 41 4d 45 20 53 43  , objv, "NAME SC
6600: 52 49 50 54 22 29 3b 0a 20 20 20 20 20 20 72 65  RIPT");.      re
6610: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
6620: 20 20 20 20 7d 0a 20 20 20 20 7a 4e 61 6d 65 20      }.    zName 
6630: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
6640: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
6650: 30 29 3b 0a 20 20 20 20 7a 53 63 72 69 70 74 20  0);.    zScript 
6660: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
6670: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20  romObj(objv[3], 
6680: 26 6e 53 63 72 69 70 74 29 3b 0a 20 20 20 20 70  &nScript);.    p
6690: 46 75 6e 63 20 3d 20 28 53 71 6c 46 75 6e 63 2a  Func = (SqlFunc*
66a0: 29 54 63 6c 5f 41 6c 6c 6f 63 28 20 73 69 7a 65  )Tcl_Alloc( size
66b0: 6f 66 28 2a 70 46 75 6e 63 29 20 2b 20 6e 53 63  of(*pFunc) + nSc
66c0: 72 69 70 74 20 2b 20 31 20 29 3b 0a 20 20 20 20  ript + 1 );.    
66d0: 69 66 28 20 70 46 75 6e 63 3d 3d 30 20 29 20 72  if( pFunc==0 ) r
66e0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
66f0: 0a 20 20 20 20 70 46 75 6e 63 2d 3e 69 6e 74 65  .    pFunc->inte
6700: 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
6710: 20 70 46 75 6e 63 2d 3e 70 4e 65 78 74 20 3d 20   pFunc->pNext = 
6720: 70 44 62 2d 3e 70 46 75 6e 63 3b 0a 20 20 20 20  pDb->pFunc;.    
6730: 70 46 75 6e 63 2d 3e 7a 53 63 72 69 70 74 20 3d  pFunc->zScript =
6740: 20 28 63 68 61 72 2a 29 26 70 46 75 6e 63 5b 31   (char*)&pFunc[1
6750: 5d 3b 0a 20 20 20 20 73 74 72 63 70 79 28 70 46  ];.    strcpy(pF
6760: 75 6e 63 2d 3e 7a 53 63 72 69 70 74 2c 20 7a 53  unc->zScript, zS
6770: 63 72 69 70 74 29 3b 0a 20 20 20 20 73 71 6c 69  cript);.    sqli
6780: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
6790: 69 6f 6e 28 70 44 62 2d 3e 64 62 2c 20 7a 4e 61  ion(pDb->db, zNa
67a0: 6d 65 2c 20 2d 31 2c 20 74 63 6c 53 71 6c 46 75  me, -1, tclSqlFu
67b0: 6e 63 2c 20 70 46 75 6e 63 29 3b 0a 20 20 20 20  nc, pFunc);.    
67c0: 73 71 6c 69 74 65 33 5f 66 75 6e 63 74 69 6f 6e  sqlite3_function
67d0: 5f 74 79 70 65 28 70 44 62 2d 3e 64 62 2c 20 7a  _type(pDb->db, z
67e0: 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 4e 55 4d  Name, SQLITE_NUM
67f0: 45 52 49 43 29 3b 0a 20 20 20 20 62 72 65 61 6b  ERIC);.    break
6800: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
6810: 20 20 20 20 20 24 64 62 20 6c 61 73 74 5f 69 6e       $db last_in
6820: 73 65 72 74 5f 72 6f 77 69 64 20 0a 20 20 2a 2a  sert_rowid .  **
6830: 0a 20 20 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  .  ** Return an 
6840: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
6850: 20 74 68 65 20 52 4f 57 49 44 20 66 6f 72 20 74   the ROWID for t
6860: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69  he most recent i
6870: 6e 73 65 72 74 2e 0a 20 20 2a 2f 0a 20 20 63 61  nsert..  */.  ca
6880: 73 65 20 44 42 5f 4c 41 53 54 5f 49 4e 53 45 52  se DB_LAST_INSER
6890: 54 5f 52 4f 57 49 44 3a 20 7b 0a 20 20 20 20 54  T_ROWID: {.    T
68a0: 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75 6c 74 3b  cl_Obj *pResult;
68b0: 0a 20 20 20 20 69 6e 74 20 72 6f 77 69 64 3b 0a  .    int rowid;.
68c0: 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20      if( objc!=2 
68d0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  ){.      Tcl_Wro
68e0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
68f0: 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a  , 2, objv, "");.
6900: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
6910: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
6920: 20 20 72 6f 77 69 64 20 3d 20 73 71 6c 69 74 65    rowid = sqlite
6930: 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  3_last_insert_ro
6940: 77 69 64 28 70 44 62 2d 3e 64 62 29 3b 0a 20 20  wid(pDb->db);.  
6950: 20 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f    pResult = Tcl_
6960: 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  GetObjResult(int
6970: 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  erp);.    Tcl_Se
6980: 74 49 6e 74 4f 62 6a 28 70 52 65 73 75 6c 74 2c  tIntObj(pResult,
6990: 20 72 6f 77 69 64 29 3b 0a 20 20 20 20 62 72 65   rowid);.    bre
69a0: 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  ak;.  }..  /*.  
69b0: 2a 2a 20 20 20 20 20 24 64 62 20 6f 6e 65 63 6f  **     $db oneco
69c0: 6c 75 6d 6e 20 53 51 4c 0a 20 20 2a 2a 0a 20 20  lumn SQL.  **.  
69d0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 69 6e 67  ** Return a sing
69e0: 6c 65 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61  le column from a
69f0: 20 73 69 6e 67 6c 65 20 72 6f 77 20 6f 66 20 74   single row of t
6a00: 68 65 20 67 69 76 65 6e 20 53 51 4c 20 71 75 65  he given SQL que
6a10: 72 79 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ry..  */.  case 
6a20: 44 42 5f 4f 4e 45 43 4f 4c 55 4d 4e 3a 20 7b 0a  DB_ONECOLUMN: {.
6a30: 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a      char *zSql;.
6a40: 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73      char *zErrMs
6a50: 67 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6f  g = 0;.    if( o
6a60: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
6a70: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
6a80: 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76  (interp, 2, objv
6a90: 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20 20 20 20  , "SQL");.      
6aa0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
6ab0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c  ;.    }.    zSql
6ac0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
6ad0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
6ae0: 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   0);.    rc = sq
6af0: 6c 69 74 65 33 5f 65 78 65 63 28 70 44 62 2d 3e  lite3_exec(pDb->
6b00: 64 62 2c 20 7a 53 71 6c 2c 20 44 62 45 76 61 6c  db, zSql, DbEval
6b10: 43 61 6c 6c 62 61 63 6b 33 2c 20 69 6e 74 65 72  Callback3, inter
6b20: 70 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  p, &zErrMsg);.  
6b30: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6b40: 5f 41 42 4f 52 54 20 29 7b 0a 20 20 20 20 20 20  _ABORT ){.      
6b50: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
6b60: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 45      }else if( zE
6b70: 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 54  rrMsg ){.      T
6b80: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
6b90: 65 72 70 2c 20 7a 45 72 72 4d 73 67 2c 20 54 43  erp, zErrMsg, TC
6ba0: 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20  L_VOLATILE);.   
6bb0: 20 20 20 66 72 65 65 28 7a 45 72 72 4d 73 67 29     free(zErrMsg)
6bc0: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54 43 4c  ;.      rc = TCL
6bd0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
6be0: 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45  e if( rc!=SQLITE
6bf0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  _OK ){.      Tcl
6c00: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
6c10: 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72  terp, sqlite3_er
6c20: 72 6f 72 5f 73 74 72 69 6e 67 28 72 63 29 2c 20  ror_string(rc), 
6c30: 30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 54  0);.      rc = T
6c40: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
6c50: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a      break;.  }..
6c60: 20 20 2f 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64    /*.  **     $d
6c70: 62 20 72 65 6b 65 79 20 4b 45 59 0a 20 20 2a 2a  b rekey KEY.  **
6c80: 0a 20 20 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  .  ** Change the
6c90: 20 65 6e 63 72 79 70 74 69 6f 6e 20 6b 65 79 20   encryption key 
6ca0: 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  on the currently
6cb0: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 2e 0a   open database..
6cc0: 20 20 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 52    */.  case DB_R
6cd0: 45 4b 45 59 3a 20 7b 0a 20 20 20 20 69 6e 74 20  EKEY: {.    int 
6ce0: 6e 4b 65 79 3b 0a 20 20 20 20 76 6f 69 64 20 2a  nKey;.    void *
6cf0: 70 4b 65 79 3b 0a 20 20 20 20 69 66 28 20 6f 62  pKey;.    if( ob
6d00: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 54  jc!=3 ){.      T
6d10: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
6d20: 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
6d30: 20 22 4b 45 59 22 29 3b 0a 20 20 20 20 20 20 72   "KEY");.      r
6d40: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
6d50: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4b 65 79 20  .    }.    pKey 
6d60: 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
6d70: 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ayFromObj(objv[2
6d80: 5d 2c 20 26 6e 4b 65 79 29 3b 0a 23 69 66 64 65  ], &nKey);.#ifde
6d90: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
6da0: 45 43 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  EC.    rc = sqli
6db0: 74 65 5f 72 65 6b 65 79 28 70 44 62 2d 3e 64 62  te_rekey(pDb->db
6dc0: 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 20  , pKey, nKey);. 
6dd0: 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
6de0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
6df0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
6e00: 74 65 33 5f 65 72 72 6f 72 5f 73 74 72 69 6e 67  te3_error_string
6e10: 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 20 20  (rc), 0);.      
6e20: 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  rc = TCL_ERROR;.
6e30: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
6e40: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f   break;.  }..  /
6e50: 2a 0a 20 20 2a 2a 20 20 20 20 20 24 64 62 20 74  *.  **     $db t
6e60: 69 6d 65 6f 75 74 20 4d 49 4c 4c 45 53 45 43 4f  imeout MILLESECO
6e70: 4e 44 53 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 65  NDS.  **.  ** De
6e80: 6c 61 79 20 66 6f 72 20 74 68 65 20 6e 75 6d 62  lay for the numb
6e90: 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
6ea0: 64 73 20 73 70 65 63 69 66 69 65 64 20 77 68 65  ds specified whe
6eb0: 6e 20 61 20 66 69 6c 65 20 69 73 20 6c 6f 63 6b  n a file is lock
6ec0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20  ed..  */.  case 
6ed0: 44 42 5f 54 49 4d 45 4f 55 54 3a 20 7b 0a 20 20  DB_TIMEOUT: {.  
6ee0: 20 20 69 6e 74 20 6d 73 3b 0a 20 20 20 20 69 66    int ms;.    if
6ef0: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
6f00: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
6f10: 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
6f20: 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45 43 4f 4e  bjv, "MILLISECON
6f30: 44 53 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  DS");.      retu
6f40: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
6f50: 20 20 7d 0a 20 20 20 20 69 66 28 20 54 63 6c 5f    }.    if( Tcl_
6f60: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
6f70: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
6f80: 6d 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ms) ) return TCL
6f90: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69  _ERROR;.    sqli
6fa0: 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74  te3_busy_timeout
6fb0: 28 70 44 62 2d 3e 64 62 2c 20 6d 73 29 3b 0a 20  (pDb->db, ms);. 
6fc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20     break;.  }.. 
6fd0: 20 2f 2a 20 20 20 20 24 64 62 20 74 72 61 63 65   /*    $db trace
6fe0: 20 3f 43 41 4c 4c 42 41 43 4b 3f 0a 20 20 2a 2a   ?CALLBACK?.  **
6ff0: 0a 20 20 2a 2a 20 4d 61 6b 65 20 61 72 72 61 6e  .  ** Make arran
7000: 67 65 6d 65 6e 74 73 20 74 6f 20 69 6e 76 6f 6b  gements to invok
7010: 65 20 74 68 65 20 43 41 4c 4c 42 41 43 4b 20 72  e the CALLBACK r
7020: 6f 75 74 69 6e 65 20 66 6f 72 20 65 61 63 68 20  outine for each 
7030: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 0a 20 20  SQL statement.  
7040: 2a 2a 20 74 68 61 74 20 69 73 20 65 78 65 63 75  ** that is execu
7050: 74 65 64 2e 20 20 54 68 65 20 74 65 78 74 20 6f  ted.  The text o
7060: 66 20 74 68 65 20 53 51 4c 20 69 73 20 61 70 70  f the SQL is app
7070: 65 6e 64 65 64 20 74 6f 20 43 41 4c 4c 42 41 43  ended to CALLBAC
7080: 4b 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 69 74  K before.  ** it
7090: 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20   is executed..  
70a0: 2a 2f 0a 20 20 63 61 73 65 20 44 42 5f 54 52 41  */.  case DB_TRA
70b0: 43 45 3a 20 7b 0a 20 20 20 20 69 66 28 20 6f 62  CE: {.    if( ob
70c0: 6a 63 3e 33 20 29 7b 0a 20 20 20 20 20 20 54 63  jc>3 ){.      Tc
70d0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
70e0: 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
70f0: 22 3f 43 41 4c 4c 42 41 43 4b 3f 22 29 3b 0a 20  "?CALLBACK?");. 
7100: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 62 6a     }else if( obj
7110: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  c==2 ){.      if
7120: 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29 7b  ( pDb->zTrace ){
7130: 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
7140: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
7150: 2c 20 70 44 62 2d 3e 7a 54 72 61 63 65 2c 20 30  , pDb->zTrace, 0
7160: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
7170: 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
7180: 20 2a 7a 54 72 61 63 65 3b 0a 20 20 20 20 20 20   *zTrace;.      
7190: 69 6e 74 20 6c 65 6e 3b 0a 20 20 20 20 20 20 69  int len;.      i
71a0: 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29  f( pDb->zTrace )
71b0: 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 46 72  {.        Tcl_Fr
71c0: 65 65 28 70 44 62 2d 3e 7a 54 72 61 63 65 29 3b  ee(pDb->zTrace);
71d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
71e0: 54 72 61 63 65 20 3d 20 54 63 6c 5f 47 65 74 53  Trace = Tcl_GetS
71f0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
7200: 76 5b 32 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20  v[2], &len);.   
7210: 20 20 20 69 66 28 20 7a 54 72 61 63 65 20 26 26     if( zTrace &&
7220: 20 6c 65 6e 3e 30 20 29 7b 0a 20 20 20 20 20 20   len>0 ){.      
7230: 20 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20    pDb->zTrace = 
7240: 54 63 6c 5f 41 6c 6c 6f 63 28 20 6c 65 6e 20 2b  Tcl_Alloc( len +
7250: 20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 73 74   1 );.        st
7260: 72 63 70 79 28 70 44 62 2d 3e 7a 54 72 61 63 65  rcpy(pDb->zTrace
7270: 2c 20 7a 54 72 61 63 65 29 3b 0a 20 20 20 20 20  , zTrace);.     
7280: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7290: 70 44 62 2d 3e 7a 54 72 61 63 65 20 3d 20 30 3b  pDb->zTrace = 0;
72a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
72b0: 66 28 20 70 44 62 2d 3e 7a 54 72 61 63 65 20 29  f( pDb->zTrace )
72c0: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 69  {.        pDb->i
72d0: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
72e0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
72f0: 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c 20 44  trace(pDb->db, D
7300: 62 54 72 61 63 65 48 61 6e 64 6c 65 72 2c 20 70  bTraceHandler, p
7310: 44 62 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Db);.      }else
7320: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
7330: 33 5f 74 72 61 63 65 28 70 44 62 2d 3e 64 62 2c  3_trace(pDb->db,
7340: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
7350: 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b      }.    break;
7360: 0a 20 20 7d 0a 0a 20 20 7d 20 2f 2a 20 45 6e 64  .  }..  } /* End
7370: 20 6f 66 20 74 68 65 20 53 57 49 54 43 48 20 73   of the SWITCH s
7380: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 72 65  tatement */.  re
7390: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
73a0: 2a 20 20 20 73 71 6c 69 74 65 20 44 42 4e 41 4d  *   sqlite DBNAM
73b0: 45 20 46 49 4c 45 4e 41 4d 45 20 3f 4d 4f 44 45  E FILENAME ?MODE
73c0: 3f 20 3f 2d 6b 65 79 20 4b 45 59 3f 0a 2a 2a 0a  ? ?-key KEY?.**.
73d0: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 6d  ** This is the m
73e0: 61 69 6e 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 2e  ain Tcl command.
73f0: 20 20 57 68 65 6e 20 74 68 65 20 22 73 71 6c 69    When the "sqli
7400: 74 65 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20  te" Tcl command 
7410: 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64 2c 20 74  is.** invoked, t
7420: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
7430: 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68 61 74   to process that
7440: 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20   command..**.** 
7450: 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
7460: 6e 74 2c 20 44 42 4e 41 4d 45 2c 20 69 73 20 61  nt, DBNAME, is a
7470: 6e 20 61 72 62 69 74 72 61 72 79 20 6e 61 6d 65  n arbitrary name
7480: 20 66 6f 72 20 61 20 6e 65 77 0a 2a 2a 20 64 61   for a new.** da
7490: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
74a0: 6e 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  n.  This command
74b0: 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 20 63   creates a new c
74c0: 6f 6d 6d 61 6e 64 20 6e 61 6d 65 64 0a 2a 2a 20  ommand named.** 
74d0: 44 42 4e 41 4d 45 20 74 68 61 74 20 69 73 20 75  DBNAME that is u
74e0: 73 65 64 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74  sed to control t
74f0: 68 61 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20  hat connection. 
7500: 20 54 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   The database.**
7510: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 64   connection is d
7520: 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20  eleted when the 
7530: 44 42 4e 41 4d 45 20 63 6f 6d 6d 61 6e 64 20 69  DBNAME command i
7540: 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a  s deleted..**.**
7550: 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
7560: 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65  ment is the name
7570: 20 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f 72   of the director
7580: 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 0a  y that contains.
7590: 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 20 64 61  ** the sqlite da
75a0: 74 61 62 61 73 65 20 74 68 61 74 20 69 73 20 74  tabase that is t
75b0: 6f 20 62 65 20 61 63 63 65 73 73 65 64 2e 0a 2a  o be accessed..*
75c0: 2a 0a 2a 2a 20 46 6f 72 20 74 65 73 74 69 6e 67  *.** For testing
75d0: 20 70 75 72 70 6f 73 65 73 2c 20 77 65 20 61 6c   purposes, we al
75e0: 73 6f 20 73 75 70 70 6f 72 74 20 74 68 65 20 66  so support the f
75f0: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
7600: 20 73 71 6c 69 74 65 20 2d 65 6e 63 6f 64 69 6e   sqlite -encodin
7610: 67 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 52 65  g.**.**       Re
7620: 74 75 72 6e 20 74 68 65 20 65 6e 63 6f 64 69 6e  turn the encodin
7630: 67 20 75 73 65 64 20 62 79 20 4c 49 4b 45 20 61  g used by LIKE a
7640: 6e 64 20 47 4c 4f 42 20 6f 70 65 72 61 74 6f 72  nd GLOB operator
7650: 73 2e 20 20 43 68 6f 69 63 65 73 0a 2a 2a 20 20  s.  Choices.**  
7660: 20 20 20 20 20 61 72 65 20 55 54 46 2d 38 20 61       are UTF-8 a
7670: 6e 64 20 69 73 6f 38 38 35 39 2e 0a 2a 2a 0a 2a  nd iso8859..**.*
7680: 2a 20 20 73 71 6c 69 74 65 20 2d 76 65 72 73 69  *  sqlite -versi
7690: 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 52  on.**.**       R
76a0: 65 74 75 72 6e 20 74 68 65 20 76 65 72 73 69 6f  eturn the versio
76b0: 6e 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  n number of the 
76c0: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 0a  SQLite library..
76d0: 2a 2a 0a 2a 2a 20 20 73 71 6c 69 74 65 20 2d 74  **.**  sqlite -t
76e0: 63 6c 2d 75 73 65 73 2d 75 74 66 0a 2a 2a 0a 2a  cl-uses-utf.**.*
76f0: 2a 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 22  *       Return "
7700: 31 22 20 69 66 20 63 6f 6d 70 69 6c 65 64 20 77  1" if compiled w
7710: 69 74 68 20 61 20 54 63 6c 20 75 73 65 73 20 55  ith a Tcl uses U
7720: 54 46 2d 38 2e 20 20 52 65 74 75 72 6e 20 22 30  TF-8.  Return "0
7730: 22 20 69 66 0a 2a 2a 20 20 20 20 20 20 20 6e 6f  " if.**       no
7740: 74 2e 20 20 55 73 65 64 20 62 79 20 74 65 73 74  t.  Used by test
7750: 73 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  s to make sure t
7760: 68 65 20 6c 69 62 72 61 72 79 20 77 61 73 20 63  he library was c
7770: 6f 6d 70 69 6c 65 64 20 0a 2a 2a 20 20 20 20 20  ompiled .**     
7780: 20 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a    correctly..*/.
7790: 73 74 61 74 69 63 20 69 6e 74 20 44 62 4d 61 69  static int DbMai
77a0: 6e 28 76 6f 69 64 20 2a 63 64 2c 20 54 63 6c 5f  n(void *cd, Tcl_
77b0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
77c0: 69 6e 74 20 6f 62 6a 63 2c 54 63 6c 5f 4f 62 6a  int objc,Tcl_Obj
77d0: 20 2a 63 6f 6e 73 74 2a 6f 62 6a 76 29 7b 0a 20   *const*objv){. 
77e0: 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 53 71 6c   int mode;.  Sql
77f0: 69 74 65 44 62 20 2a 70 3b 0a 20 20 76 6f 69 64  iteDb *p;.  void
7800: 20 2a 70 4b 65 79 20 3d 20 30 3b 0a 20 20 69 6e   *pKey = 0;.  in
7810: 74 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 63 6f  t nKey = 0;.  co
7820: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 3b 0a  nst char *zArg;.
7830: 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 3b    char *zErrMsg;
7840: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7850: 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 7a 42 75  File;.  char zBu
7860: 66 5b 38 30 5d 3b 0a 20 20 69 66 28 20 6f 62 6a  f[80];.  if( obj
7870: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 41 72 67  c==2 ){.    zArg
7880: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
7890: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
78a0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72   0);.    if( str
78b0: 63 6d 70 28 7a 41 72 67 2c 22 2d 65 6e 63 6f 64  cmp(zArg,"-encod
78c0: 69 6e 67 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ing")==0 ){.    
78d0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
78e0: 6c 74 28 69 6e 74 65 72 70 2c 73 71 6c 69 74 65  lt(interp,sqlite
78f0: 33 5f 65 6e 63 6f 64 69 6e 67 2c 30 29 3b 0a 20  3_encoding,0);. 
7900: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
7910: 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
7920: 28 20 73 74 72 63 6d 70 28 7a 41 72 67 2c 22 2d  ( strcmp(zArg,"-
7930: 76 65 72 73 69 6f 6e 22 29 3d 3d 30 20 29 7b 0a  version")==0 ){.
7940: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
7950: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 73 71  Result(interp,sq
7960: 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 2c 30 29  lite3_version,0)
7970: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
7980: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  CL_OK;.    }.   
7990: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 41 72 67   if( strcmp(zArg
79a0: 2c 22 2d 68 61 73 2d 63 6f 64 65 63 22 29 3d 3d  ,"-has-codec")==
79b0: 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  0 ){.#ifdef SQLI
79c0: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 20  TE_HAS_CODEC.   
79d0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
79e0: 75 6c 74 28 69 6e 74 65 72 70 2c 22 31 22 2c 30  ult(interp,"1",0
79f0: 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 54  );.#else.      T
7a00: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
7a10: 69 6e 74 65 72 70 2c 22 30 22 2c 30 29 3b 0a 23  interp,"0",0);.#
7a20: 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65 74 75  endif.      retu
7a30: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d  rn TCL_OK;.    }
7a40: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
7a50: 7a 41 72 67 2c 22 2d 74 63 6c 2d 75 73 65 73 2d  zArg,"-tcl-uses-
7a60: 75 74 66 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64  utf")==0 ){.#ifd
7a70: 65 66 20 54 43 4c 5f 55 54 46 5f 4d 41 58 0a 20  ef TCL_UTF_MAX. 
7a80: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
7a90: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 22 31 22  esult(interp,"1"
7aa0: 2c 30 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  ,0);.#else.     
7ab0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
7ac0: 74 28 69 6e 74 65 72 70 2c 22 30 22 2c 30 29 3b  t(interp,"0",0);
7ad0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65  .#endif.      re
7ae0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20  turn TCL_OK;.   
7af0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a   }.  }.  if( obj
7b00: 63 3d 3d 35 20 7c 7c 20 6f 62 6a 63 3d 3d 36 20  c==5 || objc==6 
7b10: 29 7b 0a 20 20 20 20 7a 41 72 67 20 3d 20 54 63  ){.    zArg = Tc
7b20: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
7b30: 62 6a 28 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d 2c  bj(objv[objc-2],
7b40: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72   0);.    if( str
7b50: 63 6d 70 28 7a 41 72 67 2c 22 2d 6b 65 79 22 29  cmp(zArg,"-key")
7b60: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4b 65  ==0 ){.      pKe
7b70: 79 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  y = Tcl_GetByteA
7b80: 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  rrayFromObj(objv
7b90: 5b 6f 62 6a 63 2d 31 5d 2c 20 26 6e 4b 65 79 29  [objc-1], &nKey)
7ba0: 3b 0a 20 20 20 20 20 20 6f 62 6a 63 20 2d 3d 20  ;.      objc -= 
7bb0: 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  2;.    }.  }.  i
7bc0: 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62  f( objc!=3 && ob
7bd0: 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
7be0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
7bf0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 0a  terp, 1, objv, .
7c00: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
7c10: 53 5f 43 4f 44 45 43 0a 20 20 20 20 20 20 22 48  S_CODEC.      "H
7c20: 41 4e 44 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f  ANDLE FILENAME ?
7c30: 2d 6b 65 79 20 43 4f 44 45 43 2d 4b 45 59 3f 22  -key CODEC-KEY?"
7c40: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 22 48 41  .#else.      "HA
7c50: 4e 44 4c 45 20 46 49 4c 45 4e 41 4d 45 20 3f 4d  NDLE FILENAME ?M
7c60: 4f 44 45 3f 22 0a 23 65 6e 64 69 66 0a 20 20 20  ODE?".#endif.   
7c70: 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   );.    return T
7c80: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
7c90: 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20  if( objc==3 ){. 
7ca0: 20 20 20 6d 6f 64 65 20 3d 20 30 36 36 36 3b 0a     mode = 0666;.
7cb0: 20 20 7d 65 6c 73 65 20 69 66 28 20 54 63 6c 5f    }else if( Tcl_
7cc0: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
7cd0: 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
7ce0: 6d 6f 64 65 29 21 3d 54 43 4c 5f 4f 4b 20 29 7b  mode)!=TCL_OK ){
7cf0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
7d00: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 45 72  ERROR;.  }.  zEr
7d10: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 70 20 3d 20  rMsg = 0;.  p = 
7d20: 28 53 71 6c 69 74 65 44 62 2a 29 54 63 6c 5f 41  (SqliteDb*)Tcl_A
7d30: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29  lloc( sizeof(*p)
7d40: 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
7d50: 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
7d60: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6d 61 6c  ult(interp, "mal
7d70: 6c 6f 63 20 66 61 69 6c 65 64 22 2c 20 54 43 4c  loc failed", TCL
7d80: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65  _STATIC);.    re
7d90: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7da0: 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20    }.  memset(p, 
7db0: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
7dc0: 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65    zFile = Tcl_Ge
7dd0: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
7de0: 62 6a 76 5b 32 5d 2c 20 30 29 3b 0a 23 69 66 64  bjv[2], 0);.#ifd
7df0: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
7e00: 44 45 43 0a 20 20 70 2d 3e 64 62 20 3d 20 73 71  DEC.  p->db = sq
7e10: 6c 69 74 65 33 5f 6f 70 65 6e 5f 65 6e 63 72 79  lite3_open_encry
7e20: 70 74 65 64 28 7a 46 69 6c 65 2c 20 70 4b 65 79  pted(zFile, pKey
7e30: 2c 20 6e 4b 65 79 2c 20 30 2c 20 26 7a 45 72 72  , nKey, 0, &zErr
7e40: 4d 73 67 29 3b 0a 23 65 6c 73 65 0a 20 20 70 2d  Msg);.#else.  p-
7e50: 3e 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70  >db = sqlite3_op
7e60: 65 6e 28 7a 46 69 6c 65 2c 20 6d 6f 64 65 2c 20  en(zFile, mode, 
7e70: 26 7a 45 72 72 4d 73 67 29 3b 0a 23 65 6e 64 69  &zErrMsg);.#endi
7e80: 66 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30  f.  if( p->db==0
7e90: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
7ea0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45  esult(interp, zE
7eb0: 72 72 4d 73 67 2c 20 54 43 4c 5f 56 4f 4c 41 54  rrMsg, TCL_VOLAT
7ec0: 49 4c 45 29 3b 0a 20 20 20 20 54 63 6c 5f 46 72  ILE);.    Tcl_Fr
7ed0: 65 65 28 28 63 68 61 72 2a 29 70 29 3b 0a 20 20  ee((char*)p);.  
7ee0: 20 20 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b    free(zErrMsg);
7ef0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
7f00: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 41 72  ERROR;.  }.  zAr
7f10: 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  g = Tcl_GetStrin
7f20: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d  gFromObj(objv[1]
7f30: 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61  , 0);.  Tcl_Crea
7f40: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
7f50: 65 72 70 2c 20 7a 41 72 67 2c 20 44 62 4f 62 6a  erp, zArg, DbObj
7f60: 43 6d 64 2c 20 28 63 68 61 72 2a 29 70 2c 20 44  Cmd, (char*)p, D
7f70: 62 44 65 6c 65 74 65 43 6d 64 29 3b 0a 0a 20 20  bDeleteCmd);..  
7f80: 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  /* The return va
7f90: 6c 75 65 20 69 73 20 74 68 65 20 76 61 6c 75 65  lue is the value
7fa0: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 2a 20   of the sqlite* 
7fb0: 70 6f 69 6e 74 65 72 0a 20 20 2a 2f 0a 20 20 73  pointer.  */.  s
7fc0: 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 70  printf(zBuf, "%p
7fd0: 22 2c 20 70 2d 3e 64 62 29 3b 0a 20 20 69 66 28  ", p->db);.  if(
7fe0: 20 73 74 72 6e 63 6d 70 28 7a 42 75 66 2c 22 30   strncmp(zBuf,"0
7ff0: 78 22 2c 32 29 20 29 7b 0a 20 20 20 20 73 70 72  x",2) ){.    spr
8000: 69 6e 74 66 28 7a 42 75 66 2c 20 22 30 78 25 70  intf(zBuf, "0x%p
8010: 22 2c 20 70 2d 3e 64 62 29 3b 0a 20 20 7d 0a 20  ", p->db);.  }. 
8020: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8030: 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
8040: 30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6d  0);..  /* If com
8050: 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54  piled with SQLIT
8060: 45 5f 54 45 53 54 20 74 75 72 6e 65 64 20 6f 6e  E_TEST turned on
8070: 2c 20 74 68 65 6e 20 72 65 67 69 73 74 65 72 20  , then register 
8080: 74 68 65 20 22 6d 64 35 73 75 6d 22 0a 20 20 2a  the "md5sum".  *
8090: 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 0a  * SQL function..
80a0: 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
80b0: 54 45 5f 54 45 53 54 0a 20 20 7b 0a 20 20 20 20  TE_TEST.  {.    
80c0: 65 78 74 65 72 6e 20 76 6f 69 64 20 4d 64 35 5f  extern void Md5_
80d0: 52 65 67 69 73 74 65 72 28 73 71 6c 69 74 65 2a  Register(sqlite*
80e0: 29 3b 0a 20 20 20 20 4d 64 35 5f 52 65 67 69 73  );.    Md5_Regis
80f0: 74 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20 7d  ter(p->db);.   }
8100: 0a 23 65 6e 64 69 66 20 20 0a 20 20 72 65 74 75  .#endif  .  retu
8110: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
8120: 0a 2a 2a 20 50 72 6f 76 69 64 65 20 61 20 64 75  .** Provide a du
8130: 6d 6d 79 20 54 63 6c 5f 49 6e 69 74 53 74 75 62  mmy Tcl_InitStub
8140: 73 20 69 66 20 77 65 20 61 72 65 20 75 73 69 6e  s if we are usin
8150: 67 20 74 68 69 73 20 61 73 20 61 20 73 74 61 74  g this as a stat
8160: 69 63 0a 2a 2a 20 6c 69 62 72 61 72 79 2e 0a 2a  ic.** library..*
8170: 2f 0a 23 69 66 6e 64 65 66 20 55 53 45 5f 54 43  /.#ifndef USE_TC
8180: 4c 5f 53 54 55 42 53 0a 23 20 75 6e 64 65 66 20  L_STUBS.# undef 
8190: 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73 0a 23   Tcl_InitStubs.#
81a0: 20 64 65 66 69 6e 65 20 54 63 6c 5f 49 6e 69 74   define Tcl_Init
81b0: 53 74 75 62 73 28 61 2c 62 2c 63 29 0a 23 65 6e  Stubs(a,b,c).#en
81c0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69  dif../*.** Initi
81d0: 61 6c 69 7a 65 20 74 68 69 73 20 6d 6f 64 75 6c  alize this modul
81e0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 63  e..**.** This Tc
81f0: 6c 20 6d 6f 64 75 6c 65 20 63 6f 6e 74 61 69 6e  l module contain
8200: 73 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  s only a single 
8210: 6e 65 77 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20  new Tcl command 
8220: 6e 61 6d 65 64 20 22 73 71 6c 69 74 65 22 2e 0a  named "sqlite"..
8230: 2a 2a 20 28 48 65 6e 63 65 20 74 68 65 72 65 20  ** (Hence there 
8240: 69 73 20 6e 6f 20 6e 61 6d 65 73 70 61 63 65 2e  is no namespace.
8250: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 20 70 6f    There is no po
8260: 69 6e 74 20 69 6e 20 75 73 69 6e 67 20 61 20 6e  int in using a n
8270: 61 6d 65 73 70 61 63 65 0a 2a 2a 20 69 66 20 74  amespace.** if t
8280: 68 65 20 65 78 74 65 6e 73 69 6f 6e 20 6f 6e 6c  he extension onl
8290: 79 20 73 75 70 70 6c 69 65 73 20 6f 6e 65 20 6e  y supplies one n
82a0: 65 77 20 6e 61 6d 65 21 29 20 20 54 68 65 20 22  ew name!)  The "
82b0: 73 71 6c 69 74 65 22 20 63 6f 6d 6d 61 6e 64 20  sqlite" command 
82c0: 69 73 0a 2a 2a 20 75 73 65 64 20 74 6f 20 6f 70  is.** used to op
82d0: 65 6e 20 61 20 6e 65 77 20 53 51 4c 69 74 65 20  en a new SQLite 
82e0: 64 61 74 61 62 61 73 65 2e 20 20 53 65 65 20 74  database.  See t
82f0: 68 65 20 44 62 4d 61 69 6e 28 29 20 72 6f 75 74  he DbMain() rout
8300: 69 6e 65 20 61 62 6f 76 65 0a 2a 2a 20 66 6f 72  ine above.** for
8310: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
8320: 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  rmation..*/.int 
8330: 53 71 6c 69 74 65 5f 49 6e 69 74 28 54 63 6c 5f  Sqlite_Init(Tcl_
8340: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 7b  Interp *interp){
8350: 0a 20 20 54 63 6c 5f 49 6e 69 74 53 74 75 62 73  .  Tcl_InitStubs
8360: 28 69 6e 74 65 72 70 2c 20 22 38 2e 30 22 2c 20  (interp, "8.0", 
8370: 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61 74 65  0);.  Tcl_Create
8380: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72  ObjCommand(inter
8390: 70 2c 20 22 73 71 6c 69 74 65 22 2c 20 28 54 63  p, "sqlite", (Tc
83a0: 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29 44 62  l_ObjCmdProc*)Db
83b0: 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 54  Main, 0, 0);.  T
83c0: 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28 69 6e  cl_PkgProvide(in
83d0: 74 65 72 70 2c 20 22 73 71 6c 69 74 65 22 2c 20  terp, "sqlite", 
83e0: 22 32 2e 30 22 29 3b 0a 20 20 72 65 74 75 72 6e  "2.0");.  return
83f0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 54   TCL_OK;.}.int T
8400: 63 6c 73 71 6c 69 74 65 5f 49 6e 69 74 28 54 63  clsqlite_Init(Tc
8410: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
8420: 29 7b 0a 20 20 54 63 6c 5f 49 6e 69 74 53 74 75  ){.  Tcl_InitStu
8430: 62 73 28 69 6e 74 65 72 70 2c 20 22 38 2e 30 22  bs(interp, "8.0"
8440: 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 43 72 65 61  , 0);.  Tcl_Crea
8450: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
8460: 65 72 70 2c 20 22 73 71 6c 69 74 65 22 2c 20 28  erp, "sqlite", (
8470: 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 2a 29  Tcl_ObjCmdProc*)
8480: 44 62 4d 61 69 6e 2c 20 30 2c 20 30 29 3b 0a 20  DbMain, 0, 0);. 
8490: 20 54 63 6c 5f 50 6b 67 50 72 6f 76 69 64 65 28   Tcl_PkgProvide(
84a0: 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 22  interp, "sqlite"
84b0: 2c 20 22 32 2e 30 22 29 3b 0a 20 20 72 65 74 75  , "2.0");.  retu
84c0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 69 6e 74  rn TCL_OK;.}.int
84d0: 20 53 71 6c 69 74 65 5f 53 61 66 65 49 6e 69 74   Sqlite_SafeInit
84e0: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
84f0: 65 72 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 54  erp){.  return T
8500: 43 4c 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 54 63 6c  CL_OK;.}.int Tcl
8510: 73 71 6c 69 74 65 5f 53 61 66 65 49 6e 69 74 28  sqlite_SafeInit(
8520: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
8530: 72 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 54 43  rp){.  return TC
8540: 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 30 0a 2f  L_OK;.}..#if 0./
8550: 2a 0a 2a 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64  *.** If compiled
8560: 20 75 73 69 6e 67 20 6d 6b 74 63 6c 61 70 70 2c   using mktclapp,
8570: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   this routine ru
8580: 6e 73 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ns to initialize
8590: 0a 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 2e 0a  .** everything..
85a0: 2a 2f 0a 69 6e 74 20 45 74 5f 41 70 70 49 6e 69  */.int Et_AppIni
85b0: 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
85c0: 74 65 72 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  terp){.  return 
85d0: 53 71 6c 69 74 65 5f 49 6e 69 74 28 69 6e 74 65  Sqlite_Init(inte
85e0: 72 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  rp);.}.#endif../
85f0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 63 72  *.** If the macr
8600: 6f 20 54 43 4c 53 48 20 69 73 20 64 65 66 69 6e  o TCLSH is defin
8610: 65 64 20 61 6e 64 20 69 73 20 6f 6e 65 2c 20 74  ed and is one, t
8620: 68 65 6e 20 70 75 74 20 69 6e 20 63 6f 64 65 20  hen put in code 
8630: 66 6f 72 20 74 68 65 0a 2a 2a 20 22 6d 61 69 6e  for the.** "main
8640: 22 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 77  " routine that w
8650: 69 6c 6c 20 69 6e 69 74 69 61 6c 69 7a 65 20 54  ill initialize T
8660: 63 6c 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  cl..*/.#if defin
8670: 65 64 28 54 43 4c 53 48 29 20 26 26 20 54 43 4c  ed(TCLSH) && TCL
8680: 53 48 3d 3d 31 0a 73 74 61 74 69 63 20 63 68 61  SH==1.static cha
8690: 72 20 7a 4d 61 69 6e 6c 6f 6f 70 5b 5d 20 3d 0a  r zMainloop[] =.
86a0: 20 20 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e    "set line {}\n
86b0: 22 0a 20 20 22 77 68 69 6c 65 20 7b 21 5b 65 6f  ".  "while {![eo
86c0: 66 20 73 74 64 69 6e 5d 7d 20 7b 5c 6e 22 0a 20  f stdin]} {\n". 
86d0: 20 20 20 22 69 66 20 7b 24 6c 69 6e 65 21 3d 5c     "if {$line!=\
86e0: 22 5c 22 7d 20 7b 5c 6e 22 0a 20 20 20 20 20 20  "\"} {\n".      
86f0: 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65  "puts -nonewline
8700: 20 5c 22 3e 20 5c 22 5c 6e 22 0a 20 20 20 20 22   \"> \"\n".    "
8710: 7d 20 65 6c 73 65 20 7b 5c 6e 22 0a 20 20 20 20  } else {\n".    
8720: 20 20 22 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69    "puts -nonewli
8730: 6e 65 20 5c 22 25 20 5c 22 5c 6e 22 0a 20 20 20  ne \"% \"\n".   
8740: 20 22 7d 5c 6e 22 0a 20 20 20 20 22 66 6c 75 73   "}\n".    "flus
8750: 68 20 73 74 64 6f 75 74 5c 6e 22 0a 20 20 20 20  h stdout\n".    
8760: 22 61 70 70 65 6e 64 20 6c 69 6e 65 20 5b 67 65  "append line [ge
8770: 74 73 20 73 74 64 69 6e 5d 5c 6e 22 0a 20 20 20  ts stdin]\n".   
8780: 20 22 69 66 20 7b 5b 69 6e 66 6f 20 63 6f 6d 70   "if {[info comp
8790: 6c 65 74 65 20 24 6c 69 6e 65 5d 7d 20 7b 5c 6e  lete $line]} {\n
87a0: 22 0a 20 20 20 20 20 20 22 69 66 20 7b 5b 63 61  ".      "if {[ca
87b0: 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 23 30 20  tch {uplevel #0 
87c0: 24 6c 69 6e 65 7d 20 72 65 73 75 6c 74 5d 7d 20  $line} result]} 
87d0: 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75  {\n".        "pu
87e0: 74 73 20 73 74 64 65 72 72 20 5c 22 45 72 72 6f  ts stderr \"Erro
87f0: 72 3a 20 24 72 65 73 75 6c 74 5c 22 5c 6e 22 0a  r: $result\"\n".
8800: 20 20 20 20 20 20 22 7d 20 65 6c 73 65 69 66 20        "} elseif 
8810: 7b 24 72 65 73 75 6c 74 21 3d 5c 22 5c 22 7d 20  {$result!=\"\"} 
8820: 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 22 70 75  {\n".        "pu
8830: 74 73 20 24 72 65 73 75 6c 74 5c 6e 22 0a 20 20  ts $result\n".  
8840: 20 20 20 20 22 7d 5c 6e 22 0a 20 20 20 20 20 20      "}\n".      
8850: 22 73 65 74 20 6c 69 6e 65 20 7b 7d 5c 6e 22 0a  "set line {}\n".
8860: 20 20 20 20 22 7d 20 65 6c 73 65 20 7b 5c 6e 22      "} else {\n"
8870: 0a 20 20 20 20 20 20 22 61 70 70 65 6e 64 20 6c  .      "append l
8880: 69 6e 65 20 5c 5c 6e 5c 6e 22 0a 20 20 20 20 22  ine \\n\n".    "
8890: 7d 5c 6e 22 0a 20 20 22 7d 5c 6e 22 0a 3b 0a 0a  }\n".  "}\n".;..
88a0: 23 64 65 66 69 6e 65 20 54 43 4c 53 48 5f 4d 41  #define TCLSH_MA
88b0: 49 4e 20 6d 61 69 6e 20 20 20 2f 2a 20 4e 65 65  IN main   /* Nee
88c0: 64 65 64 20 74 6f 20 66 61 6b 65 20 6f 75 74 20  ded to fake out 
88d0: 6d 6b 74 63 6c 61 70 70 20 2a 2f 0a 69 6e 74 20  mktclapp */.int 
88e0: 54 43 4c 53 48 5f 4d 41 49 4e 28 69 6e 74 20 61  TCLSH_MAIN(int a
88f0: 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76  rgc, char **argv
8900: 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  ){.  Tcl_Interp 
8910: 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 46  *interp;.  Tcl_F
8920: 69 6e 64 45 78 65 63 75 74 61 62 6c 65 28 61 72  indExecutable(ar
8930: 67 76 5b 30 5d 29 3b 0a 20 20 69 6e 74 65 72 70  gv[0]);.  interp
8940: 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 49 6e 74   = Tcl_CreateInt
8950: 65 72 70 28 29 3b 0a 20 20 53 71 6c 69 74 65 5f  erp();.  Sqlite_
8960: 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 23 69  Init(interp);.#i
8970: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
8980: 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72 6e 20  .  {.    extern 
8990: 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 31 5f  int Sqlitetest1_
89a0: 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a  Init(Tcl_Interp*
89b0: 29 3b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  );.    extern in
89c0: 74 20 53 71 6c 69 74 65 74 65 73 74 32 5f 49 6e  t Sqlitetest2_In
89d0: 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
89e0: 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
89f0: 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e 69 74  Sqlitetest3_Init
8a00: 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20  (Tcl_Interp*);. 
8a10: 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71     extern int Sq
8a20: 6c 69 74 65 74 65 73 74 34 5f 49 6e 69 74 28 54  litetest4_Init(T
8a30: 63 6c 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20  cl_Interp*);.   
8a40: 20 65 78 74 65 72 6e 20 69 6e 74 20 53 71 6c 69   extern int Sqli
8a50: 74 65 74 65 73 74 35 5f 49 6e 69 74 28 54 63 6c  tetest5_Init(Tcl
8a60: 5f 49 6e 74 65 72 70 2a 29 3b 0a 20 20 20 20 65  _Interp*);.    e
8a70: 78 74 65 72 6e 20 69 6e 74 20 4d 64 35 5f 49 6e  xtern int Md5_In
8a80: 69 74 28 54 63 6c 5f 49 6e 74 65 72 70 2a 29 3b  it(Tcl_Interp*);
8a90: 0a 20 20 20 20 53 71 6c 69 74 65 74 65 73 74 31  .    Sqlitetest1
8aa0: 5f 49 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20  _Init(interp);. 
8ab0: 20 20 20 53 71 6c 69 74 65 74 65 73 74 32 5f 49     Sqlitetest2_I
8ac0: 6e 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  nit(interp);.   
8ad0: 20 53 71 6c 69 74 65 74 65 73 74 33 5f 49 6e 69   Sqlitetest3_Ini
8ae0: 74 28 69 6e 74 65 72 70 29 3b 0a 2f 2a 20 20 20  t(interp);./*   
8af0: 20 53 71 6c 69 74 65 74 65 73 74 34 5f 49 6e 69   Sqlitetest4_Ini
8b00: 74 28 69 6e 74 65 72 70 29 3b 20 2a 2f 0a 20 20  t(interp); */.  
8b10: 20 20 53 71 6c 69 74 65 74 65 73 74 35 5f 49 6e    Sqlitetest5_In
8b20: 69 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  it(interp);.    
8b30: 4d 64 35 5f 49 6e 69 74 28 69 6e 74 65 72 70 29  Md5_Init(interp)
8b40: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
8b50: 66 28 20 61 72 67 63 3e 3d 32 20 29 7b 0a 20 20  f( argc>=2 ){.  
8b60: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 54 63 6c    int i;.    Tcl
8b70: 5f 53 65 74 56 61 72 28 69 6e 74 65 72 70 2c 22  _SetVar(interp,"
8b80: 61 72 67 76 30 22 2c 61 72 67 76 5b 31 5d 2c 54  argv0",argv[1],T
8b90: 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b  CL_GLOBAL_ONLY);
8ba0: 0a 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72 28  .    Tcl_SetVar(
8bb0: 69 6e 74 65 72 70 2c 22 61 72 67 76 22 2c 20 22  interp,"argv", "
8bc0: 22 2c 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f 4e  ", TCL_GLOBAL_ON
8bd0: 4c 59 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 32  LY);.    for(i=2
8be0: 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a  ; i<argc; i++){.
8bf0: 20 20 20 20 20 20 54 63 6c 5f 53 65 74 56 61 72        Tcl_SetVar
8c00: 28 69 6e 74 65 72 70 2c 20 22 61 72 67 76 22 2c  (interp, "argv",
8c10: 20 61 72 67 76 5b 69 5d 2c 0a 20 20 20 20 20 20   argv[i],.      
8c20: 20 20 20 20 54 43 4c 5f 47 4c 4f 42 41 4c 5f 4f      TCL_GLOBAL_O
8c30: 4e 4c 59 20 7c 20 54 43 4c 5f 4c 49 53 54 5f 45  NLY | TCL_LIST_E
8c40: 4c 45 4d 45 4e 54 20 7c 20 54 43 4c 5f 41 50 50  LEMENT | TCL_APP
8c50: 45 4e 44 5f 56 41 4c 55 45 29 3b 0a 20 20 20 20  END_VALUE);.    
8c60: 7d 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 45 76  }.    if( Tcl_Ev
8c70: 61 6c 46 69 6c 65 28 69 6e 74 65 72 70 2c 20 61  alFile(interp, a
8c80: 72 67 76 5b 31 5d 29 21 3d 54 43 4c 5f 4f 4b 20  rgv[1])!=TCL_OK 
8c90: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
8ca0: 68 61 72 20 2a 7a 49 6e 66 6f 20 3d 20 54 63 6c  har *zInfo = Tcl
8cb0: 5f 47 65 74 56 61 72 28 69 6e 74 65 72 70 2c 20  _GetVar(interp, 
8cc0: 22 65 72 72 6f 72 49 6e 66 6f 22 2c 20 54 43 4c  "errorInfo", TCL
8cd0: 5f 47 4c 4f 42 41 4c 5f 4f 4e 4c 59 29 3b 0a 20  _GLOBAL_ONLY);. 
8ce0: 20 20 20 20 20 69 66 28 20 7a 49 6e 66 6f 3d 3d       if( zInfo==
8cf0: 30 20 29 20 7a 49 6e 66 6f 20 3d 20 69 6e 74 65  0 ) zInfo = inte
8d00: 72 70 2d 3e 72 65 73 75 6c 74 3b 0a 20 20 20 20  rp->result;.    
8d10: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
8d20: 2c 22 25 73 3a 20 25 73 5c 6e 22 2c 20 2a 61 72  ,"%s: %s\n", *ar
8d30: 67 76 2c 20 7a 49 6e 66 6f 29 3b 0a 20 20 20 20  gv, zInfo);.    
8d40: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
8d50: 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54  }.  }else{.    T
8d60: 63 6c 5f 47 6c 6f 62 61 6c 45 76 61 6c 28 69 6e  cl_GlobalEval(in
8d70: 74 65 72 70 2c 20 7a 4d 61 69 6e 6c 6f 6f 70 29  terp, zMainloop)
8d80: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
8d90: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 54 43  ;.}.#endif /* TC
8da0: 4c 53 48 20 2a 2f 0a 0a 23 65 6e 64 69 66 20 2f  LSH */..#endif /
8db0: 2a 20 21 64 65 66 69 6e 65 64 28 4e 4f 5f 54 43  * !defined(NO_TC
8dc0: 4c 29 20 2a 2f 0a 0a 0a 0a                       L) */....