/ Hex Artifact Content
Login

Artifact e31bb60d3de960aa0f7d08af7ae59c6dfecc552b:


0000: 2f 2a 0a 2a 2a 20 32 30 31 33 2d 30 34 2d 30 35  /*.** 2013-04-05
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
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 0a  ***************.
0170: 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ** .** This is a
0180: 20 70 72 6f 67 72 61 6d 20 75 73 65 64 20 66 6f   program used fo
0190: 72 20 74 65 73 74 69 6e 67 20 53 51 4c 69 74 65  r testing SQLite
01a0: 2c 20 61 6e 64 20 73 70 65 63 69 66 69 63 61 6c  , and specifical
01b0: 6c 79 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a  ly for testing.*
01c0: 2a 20 74 68 65 20 61 62 69 6c 69 74 79 20 6f 66  * the ability of
01d0: 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 70 72 6f   independent pro
01e0: 63 65 73 73 65 73 20 74 6f 20 61 63 63 65 73 73  cesses to access
01f0: 20 74 68 65 20 73 61 6d 65 20 53 51 4c 69 74 65   the same SQLite
0200: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
0210: 63 75 72 72 65 6e 74 6c 79 2e 0a 2a 2a 0a 2a 2a  currently..**.**
0220: 20 43 6f 6d 70 69 6c 65 20 74 68 69 73 20 70 72   Compile this pr
0230: 6f 67 72 61 6d 20 61 73 20 66 6f 6c 6c 6f 77 73  ogram as follows
0240: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 67 63 63 20 2d  :.**.**    gcc -
0250: 67 20 2d 63 20 2d 57 61 6c 6c 20 73 71 6c 69 74  g -c -Wall sqlit
0260: 65 33 2e 63 20 24 28 4f 50 54 53 29 0a 2a 2a 20  e3.c $(OPTS).** 
0270: 20 20 20 67 63 63 20 2d 67 20 2d 6f 20 6d 70 74     gcc -g -o mpt
0280: 65 73 74 20 6d 70 74 65 73 74 2e 63 20 73 71 6c  est mptest.c sql
0290: 69 74 65 33 2e 6f 20 24 28 4c 49 42 53 29 0a 2a  ite3.o $(LIBS).*
02a0: 2a 0a 2a 2a 20 52 65 63 6f 6d 6d 65 6e 64 65 64  *.** Recommended
02b0: 20 6f 70 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20   options:.**.** 
02c0: 20 20 20 2d 44 48 41 56 45 5f 55 53 4c 45 45 50     -DHAVE_USLEEP
02d0: 0a 2a 2a 20 20 20 20 2d 44 53 51 4c 49 54 45 5f  .**    -DSQLITE_
02e0: 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 20 20 20 2d 44  NO_SYNC.**    -D
02f0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
0300: 45 3d 30 0a 2a 2a 20 20 20 20 2d 44 53 51 4c 49  E=0.**    -DSQLI
0310: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
0320: 45 4e 53 49 4f 4e 0a 2a 2a 0a 2a 2a 20 52 75 6e  ENSION.**.** Run
0330: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
0340: 2a 20 20 20 20 20 2e 2f 6d 70 74 65 73 74 20 24  *     ./mptest $
0350: 64 61 74 61 62 61 73 65 20 24 73 63 72 69 70 74  database $script
0360: 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 24 64 61  .**.** where $da
0370: 74 61 62 61 73 65 20 69 73 20 74 68 65 20 64 61  tabase is the da
0380: 74 61 62 61 73 65 20 74 6f 20 75 73 65 20 66 6f  tabase to use fo
0390: 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 24 73  r testing and $s
03a0: 63 72 69 70 74 20 69 73 20 61 0a 2a 2a 20 74 65  cript is a.** te
03b0: 73 74 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 23 69  st script..*/.#i
03c0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e  nclude "sqlite3.
03d0: 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h".#include <std
03e0: 69 6f 2e 68 3e 0a 23 69 66 20 64 65 66 69 6e 65  io.h>.#if define
03f0: 64 28 5f 57 49 4e 33 32 29 0a 23 20 69 6e 63 6c  d(_WIN32).# incl
0400: 75 64 65 20 3c 70 72 6f 63 65 73 73 2e 68 3e 0a  ude <process.h>.
0410: 23 65 6c 73 65 0a 23 20 69 6e 63 6c 75 64 65 20  #else.# include 
0420: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 65 6e 64 69  <unistd.h>.#endi
0430: 66 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  f.#include <stdl
0440: 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ib.h>.#include <
0450: 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75  string.h>.#inclu
0460: 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69  de <assert.h>.#i
0470: 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e  nclude <ctype.h>
0480: 0a 0a 2f 2a 20 4d 61 72 6b 20 61 20 70 61 72 61  ../* Mark a para
0490: 6d 65 74 65 72 20 61 73 20 75 6e 75 73 65 64 20  meter as unused 
04a0: 74 6f 20 73 75 70 70 72 65 73 73 20 63 6f 6d 70  to suppress comp
04b0: 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 2a 2f  iler warnings */
04c0: 0a 23 64 65 66 69 6e 65 20 55 4e 55 53 45 44 5f  .#define UNUSED_
04d0: 50 41 52 41 4d 45 54 45 52 28 78 29 20 20 28 76  PARAMETER(x)  (v
04e0: 6f 69 64 29 78 0a 0a 2f 2a 20 47 6c 6f 62 61 6c  oid)x../* Global
04f0: 20 64 61 74 61 0a 2a 2f 0a 73 74 61 74 69 63 20   data.*/.static 
0500: 73 74 72 75 63 74 20 47 6c 6f 62 61 6c 20 7b 0a  struct Global {.
0510: 20 20 63 68 61 72 20 2a 61 72 67 76 30 3b 20 20    char *argv0;  
0520: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
0530: 20 6f 66 20 74 68 65 20 65 78 65 63 75 74 61 62   of the executab
0540: 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  le */.  const ch
0550: 61 72 20 2a 7a 56 66 73 3b 20 20 20 20 20 20 2f  ar *zVfs;      /
0560: 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53 20 74 6f  * Name of VFS to
0570: 20 75 73 65 2e 20 4f 66 74 65 6e 20 4e 55 4c 4c   use. Often NULL
0580: 20 6d 65 61 6e 69 6e 67 20 22 64 65 66 61 75 6c   meaning "defaul
0590: 74 22 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44  t" */.  char *zD
05a0: 62 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 2f  bFile;         /
05b0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
05c0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69  tabase */.  sqli
05d0: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
05e0: 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 6e 65     /* Open conne
05f0: 63 74 69 6f 6e 20 74 6f 20 64 61 74 61 62 61 73  ction to databas
0600: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72  e */.  char *zEr
0610: 72 4c 6f 67 3b 20 20 20 20 20 20 20 20 20 2f 2a  rLog;         /*
0620: 20 46 69 6c 65 6e 61 6d 65 20 66 6f 72 20 65 72   Filename for er
0630: 72 6f 72 20 6c 6f 67 20 2a 2f 0a 20 20 46 49 4c  ror log */.  FIL
0640: 45 20 2a 70 45 72 72 4c 6f 67 3b 20 20 20 20 20  E *pErrLog;     
0650: 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
0660: 77 72 69 74 65 20 65 72 72 6f 72 73 20 2a 2f 0a  write errors */.
0670: 20 20 63 68 61 72 20 2a 7a 4c 6f 67 3b 20 20 20    char *zLog;   
0680: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
0690: 20 6f 66 20 6f 75 74 70 75 74 20 6c 6f 67 20 66   of output log f
06a0: 69 6c 65 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 70  ile */.  FILE *p
06b0: 4c 6f 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Log;            
06c0: 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
06d0: 65 20 6c 6f 67 20 6d 65 73 73 61 67 65 73 20 2a  e log messages *
06e0: 2f 0a 20 20 63 68 61 72 20 7a 4e 61 6d 65 5b 31  /.  char zName[1
06f0: 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 79  2];        /* Sy
0700: 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 6f 66 20 74  mbolic name of t
0710: 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20  his process */. 
0720: 20 69 6e 74 20 74 61 73 6b 49 64 3b 20 20 20 20   int taskId;    
0730: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 73 6b 20          /* Task 
0740: 49 44 2e 20 20 30 20 6d 65 61 6e 73 20 73 75 70  ID.  0 means sup
0750: 65 72 76 69 73 6f 72 2e 20 2a 2f 0a 20 20 69 6e  ervisor. */.  in
0760: 74 20 69 54 72 61 63 65 3b 20 20 20 20 20 20 20  t iTrace;       
0770: 20 20 20 20 20 2f 2a 20 54 72 61 63 69 6e 67 20       /* Tracing 
0780: 6c 65 76 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 62  level */.  int b
0790: 53 71 6c 54 72 61 63 65 3b 20 20 20 20 20 20 20  SqlTrace;       
07a0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 74 72 61    /* True to tra
07b0: 63 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 73 20  ce SQL commands 
07c0: 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 6f 72 3b  */.  int nError;
07d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
07e0: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
07f0: 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 73 74 3b 20  */.  int nTest; 
0800: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
0810: 75 6d 62 65 72 20 6f 66 20 2d 2d 6d 61 74 63 68  umber of --match
0820: 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20   operators */.  
0830: 69 6e 74 20 69 54 69 6d 65 6f 75 74 3b 20 20 20  int iTimeout;   
0840: 20 20 20 20 20 20 20 2f 2a 20 4d 69 6c 6c 69 73         /* Millis
0850: 65 63 6f 6e 64 73 20 75 6e 74 69 6c 20 61 20 62  econds until a b
0860: 75 73 79 20 74 69 6d 65 6f 75 74 20 2a 2f 0a 20  usy timeout */. 
0870: 20 69 6e 74 20 62 53 79 6e 63 3b 20 20 20 20 20   int bSync;     
0880: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20          /* Call 
0890: 66 73 79 6e 63 28 29 20 2a 2f 0a 7d 20 67 3b 0a  fsync() */.} g;.
08a0: 0a 2f 2a 20 44 65 66 61 75 6c 74 20 74 69 6d 65  ./* Default time
08b0: 6f 75 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 44  out */.#define D
08c0: 45 46 41 55 4c 54 5f 54 49 4d 45 4f 55 54 20 31  EFAULT_TIMEOUT 1
08d0: 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  0000../*.** Prin
08e0: 74 20 61 20 6d 65 73 73 61 67 65 20 61 64 64 69  t a message addi
08f0: 6e 67 20 7a 50 72 65 66 69 78 5b 5d 20 74 6f 20  ng zPrefix[] to 
0900: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
0910: 20 65 76 65 72 79 20 6c 69 6e 65 2e 0a 2a 2f 0a   every line..*/.
0920: 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 69 6e  static void prin
0930: 74 57 69 74 68 50 72 65 66 69 78 28 46 49 4c 45  tWithPrefix(FILE
0940: 20 2a 70 4f 75 74 2c 20 63 6f 6e 73 74 20 63 68   *pOut, const ch
0950: 61 72 20 2a 7a 50 72 65 66 69 78 2c 20 63 6f 6e  ar *zPrefix, con
0960: 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a  st char *zMsg){.
0970: 20 20 77 68 69 6c 65 28 20 7a 4d 73 67 20 26 26    while( zMsg &&
0980: 20 7a 4d 73 67 5b 30 5d 20 29 7b 0a 20 20 20 20   zMsg[0] ){.    
0990: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
09a0: 3d 30 3b 20 7a 4d 73 67 5b 69 5d 20 26 26 20 7a  =0; zMsg[i] && z
09b0: 4d 73 67 5b 69 5d 21 3d 27 5c 6e 27 20 26 26 20  Msg[i]!='\n' && 
09c0: 7a 4d 73 67 5b 69 5d 21 3d 27 5c 72 27 3b 20 69  zMsg[i]!='\r'; i
09d0: 2b 2b 29 7b 7d 0a 20 20 20 20 66 70 72 69 6e 74  ++){}.    fprint
09e0: 66 28 70 4f 75 74 2c 20 22 25 73 25 2e 2a 73 5c  f(pOut, "%s%.*s\
09f0: 6e 22 2c 20 7a 50 72 65 66 69 78 2c 20 69 2c 20  n", zPrefix, i, 
0a00: 7a 4d 73 67 29 3b 0a 20 20 20 20 7a 4d 73 67 20  zMsg);.    zMsg 
0a10: 2b 3d 20 69 3b 0a 20 20 20 20 77 68 69 6c 65 28  += i;.    while(
0a20: 20 7a 4d 73 67 5b 30 5d 3d 3d 27 5c 6e 27 20 7c   zMsg[0]=='\n' |
0a30: 7c 20 7a 4d 73 67 5b 30 5d 3d 3d 27 5c 72 27 20  | zMsg[0]=='\r' 
0a40: 29 20 7a 4d 73 67 2b 2b 3b 0a 20 20 7d 0a 7d 0a  ) zMsg++;.  }.}.
0a50: 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
0a60: 77 6f 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73  wo pointers to s
0a70: 74 72 69 6e 67 73 2c 20 77 68 65 72 65 20 74 68  trings, where th
0a80: 65 20 70 6f 69 6e 74 65 72 73 20 6d 69 67 68 74  e pointers might
0a90: 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61   be NULL..*/.sta
0aa0: 74 69 63 20 69 6e 74 20 73 61 66 65 5f 73 74 72  tic int safe_str
0ab0: 63 6d 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  cmp(const char *
0ac0: 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 62  a, const char *b
0ad0: 29 7b 0a 20 20 69 66 28 20 61 3d 3d 62 20 29 20  ){.  if( a==b ) 
0ae0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
0af0: 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31  a==0 ) return -1
0b00: 3b 0a 20 20 69 66 28 20 62 3d 3d 30 20 29 20 72  ;.  if( b==0 ) r
0b10: 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
0b20: 6e 20 73 74 72 63 6d 70 28 61 2c 62 29 3b 0a 7d  n strcmp(a,b);.}
0b30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
0b40: 52 55 45 20 69 66 20 73 74 72 69 6e 67 20 7a 5b  RUE if string z[
0b50: 5d 20 6d 61 74 63 68 65 73 20 67 6c 6f 62 20 70  ] matches glob p
0b60: 61 74 74 65 72 6e 20 7a 47 6c 6f 62 5b 5d 2e 0a  attern zGlob[]..
0b70: 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20  ** Return FALSE 
0b80: 69 66 20 74 68 65 20 70 61 74 74 65 72 6e 20 64  if the pattern d
0b90: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a  oes not match..*
0ba0: 2a 0a 2a 2a 20 47 6c 6f 62 62 69 6e 67 20 72 75  *.** Globbing ru
0bb0: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  les:.**.**      
0bc0: 27 2a 27 20 20 20 20 20 20 20 4d 61 74 63 68 65  '*'       Matche
0bd0: 73 20 61 6e 79 20 73 65 71 75 65 6e 63 65 20 6f  s any sequence o
0be0: 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 63  f zero or more c
0bf0: 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a  haracters..**.**
0c00: 20 20 20 20 20 20 27 3f 27 20 20 20 20 20 20 20        '?'       
0c10: 4d 61 74 63 68 65 73 20 65 78 61 63 74 6c 79 20  Matches exactly 
0c20: 6f 6e 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a  one character..*
0c30: 2a 0a 2a 2a 20 20 20 20 20 5b 2e 2e 2e 5d 20 20  *.**     [...]  
0c40: 20 20 20 20 4d 61 74 63 68 65 73 20 6f 6e 65 20      Matches one 
0c50: 63 68 61 72 61 63 74 65 72 20 66 72 6f 6d 20 74  character from t
0c60: 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74  he enclosed list
0c70: 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   of.**          
0c80: 20 20 20 20 20 20 63 68 61 72 61 63 74 65 72 73        characters
0c90: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 5e 2e 2e  ..**.**     [^..
0ca0: 2e 5d 20 20 20 20 20 4d 61 74 63 68 65 73 20 6f  .]     Matches o
0cb0: 6e 65 20 63 68 61 72 61 63 74 65 72 20 6e 6f 74  ne character not
0cc0: 20 69 6e 20 74 68 65 20 65 6e 63 6c 6f 73 65 64   in the enclosed
0cd0: 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   list..**.**    
0ce0: 20 20 27 23 27 20 20 20 20 20 20 20 4d 61 74 63    '#'       Matc
0cf0: 68 65 73 20 61 6e 79 20 73 65 71 75 65 6e 63 65  hes any sequence
0d00: 20 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20   of one or more 
0d10: 64 69 67 69 74 73 20 77 69 74 68 20 61 6e 0a 2a  digits with an.*
0d20: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0d30: 20 6f 70 74 69 6f 6e 61 6c 20 2b 20 6f 72 20 2d   optional + or -
0d40: 20 73 69 67 6e 20 69 6e 20 66 72 6f 6e 74 0a 2a   sign in front.*
0d50: 2f 0a 69 6e 74 20 73 74 72 67 6c 6f 62 28 63 6f  /.int strglob(co
0d60: 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62 2c  nst char *zGlob,
0d70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b   const char *z){
0d80: 0a 20 20 69 6e 74 20 63 2c 20 63 32 3b 0a 20 20  .  int c, c2;.  
0d90: 69 6e 74 20 69 6e 76 65 72 74 3b 0a 20 20 69 6e  int invert;.  in
0da0: 74 20 73 65 65 6e 3b 0a 0a 20 20 77 68 69 6c 65  t seen;..  while
0db0: 28 20 28 63 20 3d 20 28 2a 28 7a 47 6c 6f 62 2b  ( (c = (*(zGlob+
0dc0: 2b 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  +)))!=0 ){.    i
0dd0: 66 28 20 63 3d 3d 27 2a 27 20 29 7b 0a 20 20 20  f( c=='*' ){.   
0de0: 20 20 20 77 68 69 6c 65 28 20 28 63 3d 28 2a 28     while( (c=(*(
0df0: 7a 47 6c 6f 62 2b 2b 29 29 29 20 3d 3d 20 27 2a  zGlob++))) == '*
0e00: 27 20 7c 7c 20 63 3d 3d 27 3f 27 20 29 7b 0a 20  ' || c=='?' ){. 
0e10: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 3f         if( c=='?
0e20: 27 20 26 26 20 28 2a 28 7a 2b 2b 29 29 3d 3d 30  ' && (*(z++))==0
0e30: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
0e40: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
0e50: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
0e60: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
0e70: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b 27 20  else if( c=='[' 
0e80: 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
0e90: 28 20 2a 7a 20 26 26 20 73 74 72 67 6c 6f 62 28  ( *z && strglob(
0ea0: 7a 47 6c 6f 62 2d 31 2c 7a 29 20 29 7b 0a 20 20  zGlob-1,z) ){.  
0eb0: 20 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20          z++;.   
0ec0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
0ed0: 65 74 75 72 6e 20 28 2a 7a 29 21 3d 30 3b 0a 20  eturn (*z)!=0;. 
0ee0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69       }.      whi
0ef0: 6c 65 28 20 28 63 32 20 3d 20 28 2a 28 7a 2b 2b  le( (c2 = (*(z++
0f00: 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  )))!=0 ){.      
0f10: 20 20 77 68 69 6c 65 28 20 63 32 21 3d 63 20 29    while( c2!=c )
0f20: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 32 20 3d  {.          c2 =
0f30: 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 20 20 20   *(z++);.       
0f40: 20 20 20 69 66 28 20 63 32 3d 3d 30 20 29 20 72     if( c2==0 ) r
0f50: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
0f60: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73   }.        if( s
0f70: 74 72 67 6c 6f 62 28 7a 47 6c 6f 62 2c 7a 29 20  trglob(zGlob,z) 
0f80: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
0f90: 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
0fa0: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
0fb0: 28 20 63 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20  ( c=='?' ){.    
0fc0: 20 20 69 66 28 20 28 2a 28 7a 2b 2b 29 29 3d 3d    if( (*(z++))==
0fd0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
0fe0: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
0ff0: 5b 27 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  [' ){.      int 
1000: 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20  prior_c = 0;.   
1010: 20 20 20 73 65 65 6e 20 3d 20 30 3b 0a 20 20 20     seen = 0;.   
1020: 20 20 20 69 6e 76 65 72 74 20 3d 20 30 3b 0a 20     invert = 0;. 
1030: 20 20 20 20 20 63 20 3d 20 2a 28 7a 2b 2b 29 3b       c = *(z++);
1040: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
1050: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
1060: 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b    c2 = *(zGlob++
1070: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d  );.      if( c2=
1080: 3d 27 5e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='^' ){.        
1090: 69 6e 76 65 72 74 20 3d 20 31 3b 0a 20 20 20 20  invert = 1;.    
10a0: 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62      c2 = *(zGlob
10b0: 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ++);.      }.   
10c0: 20 20 20 69 66 28 20 63 32 3d 3d 27 5d 27 20 29     if( c2==']' )
10d0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  {.        if( c=
10e0: 3d 27 5d 27 20 29 20 73 65 65 6e 20 3d 20 31 3b  =']' ) seen = 1;
10f0: 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28  .        c2 = *(
1100: 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20  zGlob++);.      
1110: 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 63  }.      while( c
1120: 32 20 26 26 20 63 32 21 3d 27 5d 27 20 29 7b 0a  2 && c2!=']' ){.
1130: 20 20 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d          if( c2==
1140: 27 2d 27 20 26 26 20 7a 47 6c 6f 62 5b 30 5d 21  '-' && zGlob[0]!
1150: 3d 27 5d 27 20 26 26 20 7a 47 6c 6f 62 5b 30 5d  =']' && zGlob[0]
1160: 21 3d 30 20 26 26 20 70 72 69 6f 72 5f 63 3e 30  !=0 && prior_c>0
1170: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 32   ){.          c2
1180: 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20   = *(zGlob++);. 
1190: 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3e 3d           if( c>=
11a0: 70 72 69 6f 72 5f 63 20 26 26 20 63 3c 3d 63 32  prior_c && c<=c2
11b0: 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20   ) seen = 1;.   
11c0: 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d         prior_c =
11d0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
11e0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e{.          if(
11f0: 20 63 3d 3d 63 32 20 29 7b 0a 20 20 20 20 20 20   c==c2 ){.      
1200: 20 20 20 20 20 20 73 65 65 6e 20 3d 20 31 3b 0a        seen = 1;.
1210: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1220: 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d 20        prior_c = 
1230: 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  c2;.        }.  
1240: 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c        c2 = *(zGl
1250: 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ob++);.      }. 
1260: 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20 7c       if( c2==0 |
1270: 7c 20 28 73 65 65 6e 20 5e 20 69 6e 76 65 72 74  | (seen ^ invert
1280: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
1290: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
12a0: 3d 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20 69  =='#' ){.      i
12b0: 66 28 20 28 7a 5b 30 5d 3d 3d 27 2d 27 20 7c 7c  f( (z[0]=='-' ||
12c0: 20 7a 5b 30 5d 3d 3d 27 2b 27 29 20 26 26 20 69   z[0]=='+') && i
12d0: 73 64 69 67 69 74 28 7a 5b 31 5d 29 20 29 20 7a  sdigit(z[1]) ) z
12e0: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 21 69  ++;.      if( !i
12f0: 73 64 69 67 69 74 28 7a 5b 30 5d 29 20 29 20 72  sdigit(z[0]) ) r
1300: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7a  eturn 0;.      z
1310: 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ++;.      while(
1320: 20 69 73 64 69 67 69 74 28 7a 5b 30 5d 29 20 29   isdigit(z[0]) )
1330: 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65 6c  { z++; }.    }el
1340: 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 63 21  se{.      if( c!
1350: 3d 28 2a 28 7a 2b 2b 29 29 20 29 20 72 65 74 75  =(*(z++)) ) retu
1360: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
1370: 20 20 72 65 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a    return *z==0;.
1380: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 6f  }../*.** Close o
1390: 75 74 70 75 74 20 73 74 72 65 61 6d 20 70 4f 75  utput stream pOu
13a0: 74 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 73  t if it is not s
13b0: 74 64 6f 75 74 20 6f 72 20 73 74 64 65 72 72 0a  tdout or stderr.
13c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
13d0: 61 79 62 65 43 6c 6f 73 65 28 46 49 4c 45 20 2a  aybeClose(FILE *
13e0: 70 4f 75 74 29 7b 0a 20 20 69 66 28 20 70 4f 75  pOut){.  if( pOu
13f0: 74 21 3d 73 74 64 6f 75 74 20 26 26 20 70 4f 75  t!=stdout && pOu
1400: 74 21 3d 73 74 64 65 72 72 20 29 20 66 63 6c 6f  t!=stderr ) fclo
1410: 73 65 28 70 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a  se(pOut);.}../*.
1420: 2a 2a 20 50 72 69 6e 74 20 61 6e 20 65 72 72 6f  ** Print an erro
1430: 72 20 6d 65 73 73 61 67 65 0a 2a 2f 0a 73 74 61  r message.*/.sta
1440: 74 69 63 20 76 6f 69 64 20 65 72 72 6f 72 4d 65  tic void errorMe
1450: 73 73 61 67 65 28 63 6f 6e 73 74 20 63 68 61 72  ssage(const char
1460: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
1470: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
1480: 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 63   char *zMsg;.  c
1490: 68 61 72 20 7a 50 72 65 66 69 78 5b 33 30 5d 3b  har zPrefix[30];
14a0: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
14b0: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 4d 73 67  zFormat);.  zMsg
14c0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69   = sqlite3_vmpri
14d0: 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29  ntf(zFormat, ap)
14e0: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
14f0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
1500: 74 66 28 73 69 7a 65 6f 66 28 7a 50 72 65 66 69  tf(sizeof(zPrefi
1510: 78 29 2c 20 7a 50 72 65 66 69 78 2c 20 22 25 73  x), zPrefix, "%s
1520: 3a 45 52 52 4f 52 3a 20 22 2c 20 67 2e 7a 4e 61  :ERROR: ", g.zNa
1530: 6d 65 29 3b 0a 20 20 69 66 28 20 67 2e 70 4c 6f  me);.  if( g.pLo
1540: 67 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 57 69  g ){.    printWi
1550: 74 68 50 72 65 66 69 78 28 67 2e 70 4c 6f 67 2c  thPrefix(g.pLog,
1560: 20 7a 50 72 65 66 69 78 2c 20 7a 4d 73 67 29 3b   zPrefix, zMsg);
1570: 0a 20 20 20 20 66 66 6c 75 73 68 28 67 2e 70 4c  .    fflush(g.pL
1580: 6f 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  og);.  }.  if( g
1590: 2e 70 45 72 72 4c 6f 67 20 26 26 20 73 61 66 65  .pErrLog && safe
15a0: 5f 73 74 72 63 6d 70 28 67 2e 7a 45 72 72 4c 6f  _strcmp(g.zErrLo
15b0: 67 2c 67 2e 7a 4c 6f 67 29 20 29 7b 0a 20 20 20  g,g.zLog) ){.   
15c0: 20 70 72 69 6e 74 57 69 74 68 50 72 65 66 69 78   printWithPrefix
15d0: 28 67 2e 70 45 72 72 4c 6f 67 2c 20 7a 50 72 65  (g.pErrLog, zPre
15e0: 66 69 78 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  fix, zMsg);.    
15f0: 66 66 6c 75 73 68 28 67 2e 70 45 72 72 4c 6f 67  fflush(g.pErrLog
1600: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1610: 5f 66 72 65 65 28 7a 4d 73 67 29 3b 0a 20 20 67  _free(zMsg);.  g
1620: 2e 6e 45 72 72 6f 72 2b 2b 3b 0a 7d 0a 0a 2f 2a  .nError++;.}../*
1630: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
1640: 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69  tion */.static i
1650: 6e 74 20 74 72 79 53 71 6c 28 63 6f 6e 73 74 20  nt trySql(const 
1660: 63 68 61 72 2a 2c 20 2e 2e 2e 29 3b 0a 0a 2f 2a  char*, ...);../*
1670: 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 65 72 72  .** Print an err
1680: 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 74  or message and t
1690: 68 65 6e 20 71 75 69 74 2e 0a 2a 2f 0a 73 74 61  hen quit..*/.sta
16a0: 74 69 63 20 76 6f 69 64 20 66 61 74 61 6c 45 72  tic void fatalEr
16b0: 72 6f 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ror(const char *
16c0: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20  zFormat, ...){. 
16d0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63   va_list ap;.  c
16e0: 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 63 68 61  har *zMsg;.  cha
16f0: 72 20 7a 50 72 65 66 69 78 5b 33 30 5d 3b 0a 20  r zPrefix[30];. 
1700: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
1710: 6f 72 6d 61 74 29 3b 0a 20 20 7a 4d 73 67 20 3d  ormat);.  zMsg =
1720: 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74   sqlite3_vmprint
1730: 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  f(zFormat, ap);.
1740: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
1750: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1760: 28 73 69 7a 65 6f 66 28 7a 50 72 65 66 69 78 29  (sizeof(zPrefix)
1770: 2c 20 7a 50 72 65 66 69 78 2c 20 22 25 73 3a 46  , zPrefix, "%s:F
1780: 41 54 41 4c 3a 20 22 2c 20 67 2e 7a 4e 61 6d 65  ATAL: ", g.zName
1790: 29 3b 0a 20 20 69 66 28 20 67 2e 70 4c 6f 67 20  );.  if( g.pLog 
17a0: 29 7b 0a 20 20 20 20 70 72 69 6e 74 57 69 74 68  ){.    printWith
17b0: 50 72 65 66 69 78 28 67 2e 70 4c 6f 67 2c 20 7a  Prefix(g.pLog, z
17c0: 50 72 65 66 69 78 2c 20 7a 4d 73 67 29 3b 0a 20  Prefix, zMsg);. 
17d0: 20 20 20 66 66 6c 75 73 68 28 67 2e 70 4c 6f 67     fflush(g.pLog
17e0: 29 3b 0a 20 20 20 20 6d 61 79 62 65 43 6c 6f 73  );.    maybeClos
17f0: 65 28 67 2e 70 4c 6f 67 29 3b 0a 20 20 7d 0a 20  e(g.pLog);.  }. 
1800: 20 69 66 28 20 67 2e 70 45 72 72 4c 6f 67 20 26   if( g.pErrLog &
1810: 26 20 73 61 66 65 5f 73 74 72 63 6d 70 28 67 2e  & safe_strcmp(g.
1820: 7a 45 72 72 4c 6f 67 2c 67 2e 7a 4c 6f 67 29 20  zErrLog,g.zLog) 
1830: 29 7b 0a 20 20 20 20 70 72 69 6e 74 57 69 74 68  ){.    printWith
1840: 50 72 65 66 69 78 28 67 2e 70 45 72 72 4c 6f 67  Prefix(g.pErrLog
1850: 2c 20 7a 50 72 65 66 69 78 2c 20 7a 4d 73 67 29  , zPrefix, zMsg)
1860: 3b 0a 20 20 20 20 66 66 6c 75 73 68 28 67 2e 70  ;.    fflush(g.p
1870: 45 72 72 4c 6f 67 29 3b 0a 20 20 20 20 6d 61 79  ErrLog);.    may
1880: 62 65 43 6c 6f 73 65 28 67 2e 70 45 72 72 4c 6f  beClose(g.pErrLo
1890: 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  g);.  }.  sqlite
18a0: 33 5f 66 72 65 65 28 7a 4d 73 67 29 3b 0a 20 20  3_free(zMsg);.  
18b0: 69 66 28 20 67 2e 64 62 20 29 7b 0a 20 20 20 20  if( g.db ){.    
18c0: 69 6e 74 20 6e 54 72 79 20 3d 20 30 3b 0a 20 20  int nTry = 0;.  
18d0: 20 20 67 2e 69 54 69 6d 65 6f 75 74 20 3d 20 30    g.iTimeout = 0
18e0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 74 72 79  ;.    while( try
18f0: 53 71 6c 28 22 55 50 44 41 54 45 20 63 6c 69 65  Sql("UPDATE clie
1900: 6e 74 20 53 45 54 20 77 61 6e 74 48 61 6c 74 3d  nt SET wantHalt=
1910: 31 3b 22 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53  1;")==SQLITE_BUS
1920: 59 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  Y.           && 
1930: 28 6e 54 72 79 2b 2b 29 3c 31 30 30 20 29 7b 0a  (nTry++)<100 ){.
1940: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6c        sqlite3_sl
1950: 65 65 70 28 31 30 29 3b 0a 20 20 20 20 7d 0a 20  eep(10);.    }. 
1960: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f   }.  sqlite3_clo
1970: 73 65 28 67 2e 64 62 29 3b 0a 20 20 65 78 69 74  se(g.db);.  exit
1980: 28 31 29 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  (1);  .}.../*.**
1990: 20 50 72 69 6e 74 20 61 20 6c 6f 67 20 6d 65 73   Print a log mes
19a0: 73 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76  sage.*/.static v
19b0: 6f 69 64 20 6c 6f 67 4d 65 73 73 61 67 65 28 63  oid logMessage(c
19c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
19d0: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
19e0: 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a  ist ap;.  char *
19f0: 7a 4d 73 67 3b 0a 20 20 63 68 61 72 20 7a 50 72  zMsg;.  char zPr
1a00: 65 66 69 78 5b 33 30 5d 3b 0a 20 20 76 61 5f 73  efix[30];.  va_s
1a10: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
1a20: 29 3b 0a 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69  );.  zMsg = sqli
1a30: 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f  te3_vmprintf(zFo
1a40: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
1a50: 65 6e 64 28 61 70 29 3b 0a 20 20 73 71 6c 69 74  end(ap);.  sqlit
1a60: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
1a70: 6f 66 28 7a 50 72 65 66 69 78 29 2c 20 7a 50 72  of(zPrefix), zPr
1a80: 65 66 69 78 2c 20 22 25 73 3a 20 22 2c 20 67 2e  efix, "%s: ", g.
1a90: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 67 2e  zName);.  if( g.
1aa0: 70 4c 6f 67 20 29 7b 0a 20 20 20 20 70 72 69 6e  pLog ){.    prin
1ab0: 74 57 69 74 68 50 72 65 66 69 78 28 67 2e 70 4c  tWithPrefix(g.pL
1ac0: 6f 67 2c 20 7a 50 72 65 66 69 78 2c 20 7a 4d 73  og, zPrefix, zMs
1ad0: 67 29 3b 0a 20 20 20 20 66 66 6c 75 73 68 28 67  g);.    fflush(g
1ae0: 2e 70 4c 6f 67 29 3b 0a 20 20 7d 0a 20 20 73 71  .pLog);.  }.  sq
1af0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 73 67 29  lite3_free(zMsg)
1b00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1b10: 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  n the length of 
1b20: 61 20 73 74 72 69 6e 67 20 6f 6d 69 74 74 69 6e  a string omittin
1b30: 67 20 74 72 61 69 6c 69 6e 67 20 77 68 69 74 65  g trailing white
1b40: 73 70 61 63 65 0a 2a 2f 0a 73 74 61 74 69 63 20  space.*/.static 
1b50: 69 6e 74 20 63 6c 69 70 4c 65 6e 67 74 68 28 63  int clipLength(c
1b60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
1b70: 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 73 74   int n = (int)st
1b80: 72 6c 65 6e 28 7a 29 3b 0a 20 20 77 68 69 6c 65  rlen(z);.  while
1b90: 28 20 6e 3e 30 20 26 26 20 69 73 73 70 61 63 65  ( n>0 && isspace
1ba0: 28 7a 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b  (z[n-1]) ){ n--;
1bb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
1bc0: 0a 0a 2f 2a 0a 2a 2a 20 41 75 78 69 6c 69 61 72  ../*.** Auxiliar
1bd0: 79 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74  y SQL function t
1be0: 6f 20 72 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  o return the nam
1bf0: 65 20 6f 66 20 74 68 65 20 56 46 53 0a 2a 2f 0a  e of the VFS.*/.
1c00: 73 74 61 74 69 63 20 76 6f 69 64 20 76 66 73 4e  static void vfsN
1c10: 61 6d 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  ameFunc(.  sqlit
1c20: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
1c30: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
1c40: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
1c50: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c   **argv.){.  sql
1c60: 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74  ite3 *db = sqlit
1c70: 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
1c80: 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20  ndle(context);. 
1c90: 20 63 68 61 72 20 2a 7a 56 66 73 20 3d 20 30 3b   char *zVfs = 0;
1ca0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1cb0: 54 45 52 28 61 72 67 63 29 3b 0a 20 20 55 4e 55  TER(argc);.  UNU
1cc0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72  SED_PARAMETER(ar
1cd0: 67 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  gv);.  sqlite3_f
1ce0: 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
1cf0: 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f 46  "main", SQLITE_F
1d00: 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 2c 20 26 7a  CNTL_VFSNAME, &z
1d10: 56 66 73 29 3b 0a 20 20 69 66 28 20 7a 56 66 73  Vfs);.  if( zVfs
1d20: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1d30: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
1d40: 65 78 74 2c 20 7a 56 66 73 2c 20 2d 31 2c 20 73  ext, zVfs, -1, s
1d50: 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20  qlite3_free);.  
1d60: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 73 79 20  }.}../*.** Busy 
1d70: 68 61 6e 64 6c 65 72 20 77 69 74 68 20 61 20 67  handler with a g
1d80: 2e 69 54 69 6d 65 6f 75 74 2d 6d 69 6c 6c 69 73  .iTimeout-millis
1d90: 65 63 6f 6e 64 20 74 69 6d 65 6f 75 74 0a 2a 2f  econd timeout.*/
1da0: 0a 73 74 61 74 69 63 20 69 6e 74 20 62 75 73 79  .static int busy
1db0: 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 43  Handler(void *pC
1dc0: 44 2c 20 69 6e 74 20 63 6f 75 6e 74 29 7b 0a 20  D, int count){. 
1dd0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1de0: 52 28 70 43 44 29 3b 0a 20 20 69 66 28 20 63 6f  R(pCD);.  if( co
1df0: 75 6e 74 2a 31 30 3e 67 2e 69 54 69 6d 65 6f 75  unt*10>g.iTimeou
1e00: 74 20 29 7b 0a 20 20 20 20 69 66 28 20 67 2e 69  t ){.    if( g.i
1e10: 54 69 6d 65 6f 75 74 3e 30 20 29 20 65 72 72 6f  Timeout>0 ) erro
1e20: 72 4d 65 73 73 61 67 65 28 22 74 69 6d 65 6f 75  rMessage("timeou
1e30: 74 20 61 66 74 65 72 20 25 64 6d 73 22 2c 20 67  t after %dms", g
1e40: 2e 69 54 69 6d 65 6f 75 74 29 3b 0a 20 20 20 20  .iTimeout);.    
1e50: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1e60: 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 31 30  sqlite3_sleep(10
1e70: 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  );.  return 1;.}
1e80: 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 54 72 61 63  ../*.** SQL Trac
1e90: 65 20 63 61 6c 6c 62 61 63 6b 0a 2a 2f 0a 73 74  e callback.*/.st
1ea0: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 54 72 61  atic void sqlTra
1eb0: 63 65 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20  ceCallback(void 
1ec0: 2a 4e 6f 74 55 73 65 64 31 2c 20 63 6f 6e 73 74  *NotUsed1, const
1ed0: 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20   char *zSql){.  
1ee0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1ef0: 28 4e 6f 74 55 73 65 64 31 29 3b 0a 20 20 6c 6f  (NotUsed1);.  lo
1f00: 67 4d 65 73 73 61 67 65 28 22 5b 25 2e 2a 73 5d  gMessage("[%.*s]
1f10: 22 2c 20 63 6c 69 70 4c 65 6e 67 74 68 28 7a 53  ", clipLength(zS
1f20: 71 6c 29 2c 20 7a 53 71 6c 29 3b 0a 7d 0a 0a 2f  ql), zSql);.}../
1f30: 2a 0a 2a 2a 20 53 51 4c 20 65 72 72 6f 72 20 6c  *.** SQL error l
1f40: 6f 67 20 63 61 6c 6c 62 61 63 6b 0a 2a 2f 0a 73  og callback.*/.s
1f50: 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 45 72  tatic void sqlEr
1f60: 72 6f 72 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64  rorCallback(void
1f70: 20 2a 70 41 72 67 2c 20 69 6e 74 20 69 45 72 72   *pArg, int iErr
1f80: 43 6f 64 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  Code, const char
1f90: 20 2a 7a 4d 73 67 29 7b 0a 20 20 55 4e 55 53 45   *zMsg){.  UNUSE
1fa0: 44 5f 50 41 52 41 4d 45 54 45 52 28 70 41 72 67  D_PARAMETER(pArg
1fb0: 29 3b 0a 20 20 69 66 28 20 28 69 45 72 72 43 6f  );.  if( (iErrCo
1fc0: 64 65 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  de&0xff)==SQLITE
1fd0: 5f 53 43 48 45 4d 41 20 26 26 20 67 2e 69 54 72  _SCHEMA && g.iTr
1fe0: 61 63 65 3c 33 20 29 20 72 65 74 75 72 6e 3b 0a  ace<3 ) return;.
1ff0: 20 20 69 66 28 20 67 2e 69 54 69 6d 65 6f 75 74    if( g.iTimeout
2000: 3d 3d 30 20 26 26 20 28 69 45 72 72 43 6f 64 65  ==0 && (iErrCode
2010: 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 42  &0xff)==SQLITE_B
2020: 55 53 59 20 26 26 20 67 2e 69 54 72 61 63 65 3c  USY && g.iTrace<
2030: 33 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 65 72  3 ) return;.  er
2040: 72 6f 72 4d 65 73 73 61 67 65 28 22 28 65 72 72  rorMessage("(err
2050: 63 6f 64 65 3d 25 64 29 20 25 73 22 2c 20 69 45  code=%d) %s", iE
2060: 72 72 43 6f 64 65 2c 20 7a 4d 73 67 29 3b 0a 7d  rrCode, zMsg);.}
2070: 0a 0a 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20  ../*.** Prepare 
2080: 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
2090: 2e 20 20 49 73 73 75 65 20 61 20 66 61 74 61 6c  .  Issue a fatal
20a0: 20 65 72 72 6f 72 20 69 66 20 75 6e 61 62 6c 65   error if unable
20b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  ..*/.static sqli
20c0: 74 65 33 5f 73 74 6d 74 20 2a 70 72 65 70 61 72  te3_stmt *prepar
20d0: 65 53 71 6c 28 63 6f 6e 73 74 20 63 68 61 72 20  eSql(const char 
20e0: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
20f0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
2100: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e  char *zSql;.  in
2110: 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t rc;.  sqlite3_
2120: 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
2130: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
2140: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c  zFormat);.  zSql
2150: 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69   = sqlite3_vmpri
2160: 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29  ntf(zFormat, ap)
2170: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
2180: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
2190: 72 65 70 61 72 65 5f 76 32 28 67 2e 64 62 2c 20  repare_v2(g.db, 
21a0: 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
21b0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
21c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21d0: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
21e0: 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 66 61  e(pStmt);.    fa
21f0: 74 61 6c 45 72 72 6f 72 28 22 25 73 5c 6e 25 73  talError("%s\n%s
2200: 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
2210: 6d 73 67 28 67 2e 64 62 29 2c 20 7a 53 71 6c 29  msg(g.db), zSql)
2220: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
2230: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 72 65  free(zSql);.  re
2240: 74 75 72 6e 20 70 53 74 6d 74 3b 0a 7d 0a 0a 2f  turn pStmt;.}../
2250: 2a 0a 2a 2a 20 52 75 6e 20 61 72 62 69 74 72 61  *.** Run arbitra
2260: 72 79 20 53 51 4c 2e 20 20 49 73 73 75 65 20 61  ry SQL.  Issue a
2270: 20 66 61 74 61 6c 20 65 72 72 6f 72 20 6f 6e 20   fatal error on 
2280: 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
2290: 69 63 20 76 6f 69 64 20 72 75 6e 53 71 6c 28 63  ic void runSql(c
22a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
22b0: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
22c0: 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a  ist ap;.  char *
22d0: 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  zSql;.  int rc;.
22e0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
22f0: 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20  Format);.  zSql 
2300: 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e  = sqlite3_vmprin
2310: 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  tf(zFormat, ap);
2320: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
2330: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
2340: 65 63 28 67 2e 64 62 2c 20 7a 53 71 6c 2c 20 30  ec(g.db, zSql, 0
2350: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
2360: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2370: 20 20 20 20 66 61 74 61 6c 45 72 72 6f 72 28 22      fatalError("
2380: 25 73 5c 6e 25 73 5c 6e 22 2c 20 73 71 6c 69 74  %s\n%s\n", sqlit
2390: 65 33 5f 65 72 72 6d 73 67 28 67 2e 64 62 29 2c  e3_errmsg(g.db),
23a0: 20 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20 20 73 71   zSql);.  }.  sq
23b0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
23c0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  ;.}../*.** Try t
23d0: 6f 20 72 75 6e 20 61 72 62 69 74 72 61 72 79 20  o run arbitrary 
23e0: 53 51 4c 2e 20 20 52 65 74 75 72 6e 20 73 75 63  SQL.  Return suc
23f0: 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  cess code..*/.st
2400: 61 74 69 63 20 69 6e 74 20 74 72 79 53 71 6c 28  atic int trySql(
2410: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
2420: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
2430: 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20  list ap;.  char 
2440: 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 72 63 3b  *zSql;.  int rc;
2450: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
2460: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c  zFormat);.  zSql
2470: 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69   = sqlite3_vmpri
2480: 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29  ntf(zFormat, ap)
2490: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  ;.  va_end(ap);.
24a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
24b0: 78 65 63 28 67 2e 64 62 2c 20 7a 53 71 6c 2c 20  xec(g.db, zSql, 
24c0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69  0, 0, 0);.  sqli
24d0: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
24e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
24f0: 2f 2a 20 53 74 72 75 63 74 75 72 65 20 66 6f 72  /* Structure for
2500: 20 68 6f 6c 64 69 6e 67 20 61 6e 20 61 72 62 69   holding an arbi
2510: 74 72 61 72 79 20 6c 65 6e 67 74 68 20 73 74 72  trary length str
2520: 69 6e 67 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ing.*/.typedef s
2530: 74 72 75 63 74 20 53 74 72 69 6e 67 20 53 74 72  truct String Str
2540: 69 6e 67 3b 0a 73 74 72 75 63 74 20 53 74 72 69  ing;.struct Stri
2550: 6e 67 20 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 20  ng {.  char *z; 
2560: 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 73          /* the s
2570: 74 72 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e  tring */.  int n
2580: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
2590: 6c 6f 74 73 20 6f 66 20 7a 5b 5d 20 75 73 65 64  lots of z[] used
25a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63   */.  int nAlloc
25b0: 3b 20 20 20 20 20 20 2f 2a 20 53 6c 6f 74 73 20  ;      /* Slots 
25c0: 6f 66 20 7a 5b 5d 20 61 6c 6c 6f 63 61 74 65 64  of z[] allocated
25d0: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 46 72 65 65 20   */.};../* Free 
25e0: 61 20 73 74 72 69 6e 67 20 2a 2f 0a 73 74 61 74  a string */.stat
25f0: 69 63 20 76 6f 69 64 20 73 74 72 69 6e 67 46 72  ic void stringFr
2600: 65 65 28 53 74 72 69 6e 67 20 2a 70 29 7b 0a 20  ee(String *p){. 
2610: 20 69 66 28 20 70 2d 3e 7a 20 29 20 73 71 6c 69   if( p->z ) sqli
2620: 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 29 3b 0a  te3_free(p->z);.
2630: 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
2640: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 7d 0a 0a 2f  izeof(*p));.}../
2650: 2a 20 41 70 70 65 6e 64 20 6e 20 62 79 74 65 73  * Append n bytes
2660: 20 6f 66 20 74 65 78 74 20 74 6f 20 61 20 73 74   of text to a st
2670: 72 69 6e 67 2e 20 20 49 66 20 6e 3c 30 20 61 70  ring.  If n<0 ap
2680: 70 65 6e 64 20 74 68 65 20 65 6e 74 69 72 65 20  pend the entire 
2690: 73 74 72 69 6e 67 2e 20 2a 2f 0a 73 74 61 74 69  string. */.stati
26a0: 63 20 76 6f 69 64 20 73 74 72 69 6e 67 41 70 70  c void stringApp
26b0: 65 6e 64 28 53 74 72 69 6e 67 20 2a 70 2c 20 63  end(String *p, c
26c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
26d0: 74 20 6e 29 7b 0a 20 20 69 66 28 20 6e 3c 30 20  t n){.  if( n<0 
26e0: 29 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  ) n = (int)strle
26f0: 6e 28 7a 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  n(z);.  if( p->n
2700: 2b 6e 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b  +n>=p->nAlloc ){
2710: 0a 20 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20  .    int nAlloc 
2720: 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20  = p->nAlloc*2 + 
2730: 6e 20 2b 20 31 30 30 3b 0a 20 20 20 20 63 68 61  n + 100;.    cha
2740: 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 72  r *z = sqlite3_r
2750: 65 61 6c 6c 6f 63 28 70 2d 3e 7a 2c 20 6e 41 6c  ealloc(p->z, nAl
2760: 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d  loc);.    if( z=
2770: 3d 30 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28  =0 ) fatalError(
2780: 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29  "out of memory")
2790: 3b 0a 20 20 20 20 70 2d 3e 7a 20 3d 20 7a 3b 0a  ;.    p->z = z;.
27a0: 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20      p->nAlloc = 
27b0: 6e 41 6c 6c 6f 63 3b 0a 20 20 7d 0a 20 20 6d 65  nAlloc;.  }.  me
27c0: 6d 63 70 79 28 70 2d 3e 7a 2b 70 2d 3e 6e 2c 20  mcpy(p->z+p->n, 
27d0: 7a 2c 20 6e 29 3b 0a 20 20 70 2d 3e 6e 20 2b 3d  z, n);.  p->n +=
27e0: 20 6e 3b 0a 20 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d   n;.  p->z[p->n]
27f0: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 73 65   = 0;.}../* Rese
2800: 74 20 61 20 73 74 72 69 6e 67 20 74 6f 20 61 6e  t a string to an
2810: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 2a 2f   empty string */
2820: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 74 72  .static void str
2830: 69 6e 67 52 65 73 65 74 28 53 74 72 69 6e 67 20  ingReset(String 
2840: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 7a 3d  *p){.  if( p->z=
2850: 3d 30 20 29 20 73 74 72 69 6e 67 41 70 70 65 6e  =0 ) stringAppen
2860: 64 28 70 2c 20 22 20 22 2c 20 31 29 3b 0a 20 20  d(p, " ", 1);.  
2870: 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 70 2d 3e 7a  p->n = 0;.  p->z
2880: 5b 30 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 41  [0] = 0;.}../* A
2890: 70 70 65 6e 64 20 61 20 6e 65 77 20 74 6f 6b 65  ppend a new toke
28a0: 6e 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  n onto the end o
28b0: 66 20 74 68 65 20 73 74 72 69 6e 67 20 2a 2f 0a  f the string */.
28c0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 74 72 69  static void stri
28d0: 6e 67 41 70 70 65 6e 64 54 65 72 6d 28 53 74 72  ngAppendTerm(Str
28e0: 69 6e 67 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ing *p, const ch
28f0: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b  ar *z){.  int i;
2900: 0a 20 20 69 66 28 20 70 2d 3e 6e 20 29 20 73 74  .  if( p->n ) st
2910: 72 69 6e 67 41 70 70 65 6e 64 28 70 2c 20 22 20  ringAppend(p, " 
2920: 22 2c 20 31 29 3b 0a 20 20 69 66 28 20 7a 3d 3d  ", 1);.  if( z==
2930: 30 20 29 7b 0a 20 20 20 20 73 74 72 69 6e 67 41  0 ){.    stringA
2940: 70 70 65 6e 64 28 70 2c 20 22 6e 69 6c 22 2c 20  ppend(p, "nil", 
2950: 33 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  3);.    return;.
2960: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a    }.  for(i=0; z
2970: 5b 69 5d 20 26 26 20 21 69 73 73 70 61 63 65 28  [i] && !isspace(
2980: 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20  z[i]); i++){}.  
2990: 69 66 28 20 69 3e 30 20 26 26 20 7a 5b 69 5d 3d  if( i>0 && z[i]=
29a0: 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 69 6e 67  =0 ){.    string
29b0: 41 70 70 65 6e 64 28 70 2c 20 7a 2c 20 69 29 3b  Append(p, z, i);
29c0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
29d0: 0a 20 20 73 74 72 69 6e 67 41 70 70 65 6e 64 28  .  stringAppend(
29e0: 70 2c 20 22 27 22 2c 20 31 29 3b 0a 20 20 77 68  p, "'", 1);.  wh
29f0: 69 6c 65 28 20 7a 5b 30 5d 20 29 7b 0a 20 20 20  ile( z[0] ){.   
2a00: 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 20 26   for(i=0; z[i] &
2a10: 26 20 7a 5b 69 5d 21 3d 27 5c 27 27 3b 20 69 2b  & z[i]!='\''; i+
2a20: 2b 29 7b 7d 0a 20 20 20 20 69 66 28 20 7a 5b 69  +){}.    if( z[i
2a30: 5d 20 29 7b 0a 20 20 20 20 20 20 73 74 72 69 6e  ] ){.      strin
2a40: 67 41 70 70 65 6e 64 28 70 2c 20 7a 2c 20 69 2b  gAppend(p, z, i+
2a50: 31 29 3b 0a 20 20 20 20 20 20 73 74 72 69 6e 67  1);.      string
2a60: 41 70 70 65 6e 64 28 70 2c 20 22 27 22 2c 20 31  Append(p, "'", 1
2a70: 29 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 69 2b  );.      z += i+
2a80: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
2a90: 20 20 20 20 73 74 72 69 6e 67 41 70 70 65 6e 64      stringAppend
2aa0: 28 70 2c 20 7a 2c 20 69 29 3b 0a 20 20 20 20 20  (p, z, i);.     
2ab0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2ac0: 7d 0a 20 20 73 74 72 69 6e 67 41 70 70 65 6e 64  }.  stringAppend
2ad0: 28 70 2c 20 22 27 22 2c 20 31 29 3b 0a 7d 0a 0a  (p, "'", 1);.}..
2ae0: 2f 2a 0a 2a 2a 20 43 61 6c 6c 62 61 63 6b 20 66  /*.** Callback f
2af0: 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 76 61 6c  unction for eval
2b00: 53 71 6c 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20  Sql().*/.static 
2b10: 69 6e 74 20 65 76 61 6c 43 61 6c 6c 62 61 63 6b  int evalCallback
2b20: 28 76 6f 69 64 20 2a 70 43 44 61 74 61 2c 20 69  (void *pCData, i
2b30: 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a  nt argc, char **
2b40: 61 72 67 76 2c 20 63 68 61 72 20 2a 2a 61 7a 43  argv, char **azC
2b50: 6f 6c 29 7b 0a 20 20 53 74 72 69 6e 67 20 2a 70  ol){.  String *p
2b60: 20 3d 20 28 53 74 72 69 6e 67 2a 29 70 43 44 61   = (String*)pCDa
2b70: 74 61 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 55  ta;.  int i;.  U
2b80: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
2b90: 61 7a 43 6f 6c 29 3b 0a 20 20 66 6f 72 28 69 3d  azCol);.  for(i=
2ba0: 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 20  0; i<argc; i++) 
2bb0: 73 74 72 69 6e 67 41 70 70 65 6e 64 54 65 72 6d  stringAppendTerm
2bc0: 28 70 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20  (p, argv[i]);.  
2bd0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
2be0: 2a 2a 20 52 75 6e 20 61 72 62 69 74 72 61 72 79  ** Run arbitrary
2bf0: 20 53 51 4c 20 61 6e 64 20 72 65 63 6f 72 64 20   SQL and record 
2c00: 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61  the results in a
2c10: 6e 20 6f 75 74 70 75 74 20 73 74 72 69 6e 67 0a  n output string.
2c20: 2a 2a 20 67 69 76 65 6e 20 62 79 20 74 68 65 20  ** given by the 
2c30: 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 2e  first parameter.
2c40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
2c50: 76 61 6c 53 71 6c 28 53 74 72 69 6e 67 20 2a 70  valSql(String *p
2c60: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
2c70: 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76  ormat, ...){.  v
2c80: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61  a_list ap;.  cha
2c90: 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 72  r *zSql;.  int r
2ca0: 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  c;.  char *zErrM
2cb0: 73 67 20 3d 20 30 3b 0a 20 20 76 61 5f 73 74 61  sg = 0;.  va_sta
2cc0: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
2cd0: 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
2ce0: 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d  3_vmprintf(zForm
2cf0: 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  at, ap);.  va_en
2d00: 64 28 61 70 29 3b 0a 20 20 61 73 73 65 72 74 28  d(ap);.  assert(
2d10: 20 67 2e 69 54 69 6d 65 6f 75 74 3e 30 20 29 3b   g.iTimeout>0 );
2d20: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
2d30: 65 78 65 63 28 67 2e 64 62 2c 20 7a 53 71 6c 2c  exec(g.db, zSql,
2d40: 20 65 76 61 6c 43 61 6c 6c 62 61 63 6b 2c 20 70   evalCallback, p
2d50: 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73  , &zErrMsg);.  s
2d60: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
2d70: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
2d80: 20 20 20 63 68 61 72 20 7a 45 72 72 5b 33 30 5d     char zErr[30]
2d90: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
2da0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 45  printf(sizeof(zE
2db0: 72 72 29 2c 20 7a 45 72 72 2c 20 22 65 72 72 6f  rr), zErr, "erro
2dc0: 72 28 25 64 29 22 2c 20 72 63 29 3b 0a 20 20 20  r(%d)", rc);.   
2dd0: 20 73 74 72 69 6e 67 41 70 70 65 6e 64 54 65 72   stringAppendTer
2de0: 6d 28 70 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20  m(p, zErr);.    
2df0: 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20  if( zErrMsg ){. 
2e00: 20 20 20 20 20 73 74 72 69 6e 67 41 70 70 65 6e       stringAppen
2e10: 64 54 65 72 6d 28 70 2c 20 7a 45 72 72 4d 73 67  dTerm(p, zErrMsg
2e20: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2e30: 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
2e40: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2e50: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2e60: 41 75 78 69 6c 69 61 72 79 20 53 51 4c 20 66 75  Auxiliary SQL fu
2e70: 6e 63 74 69 6f 6e 20 74 6f 20 72 65 63 75 72 73  nction to recurs
2e80: 69 76 65 6c 79 20 65 76 61 6c 75 61 74 65 20 53  ively evaluate S
2e90: 51 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  QL..*/.static vo
2ea0: 69 64 20 65 76 61 6c 46 75 6e 63 28 0a 20 20 73  id evalFunc(.  s
2eb0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
2ec0: 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61  context,.  int a
2ed0: 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  rgc,.  sqlite3_v
2ee0: 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
2ef0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
2f00: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
2f10: 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74  b_handle(context
2f20: 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  );.  const char 
2f30: 2a 7a 53 71 6c 20 3d 20 28 63 6f 6e 73 74 20 63  *zSql = (const c
2f40: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
2f50: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
2f60: 3b 0a 20 20 53 74 72 69 6e 67 20 72 65 73 3b 0a  ;.  String res;.
2f70: 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
2f80: 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
2f90: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2fa0: 52 28 61 72 67 63 29 3b 0a 20 20 6d 65 6d 73 65  R(argc);.  memse
2fb0: 74 28 26 72 65 73 2c 20 30 2c 20 73 69 7a 65 6f  t(&res, 0, sizeo
2fc0: 66 28 72 65 73 29 29 3b 0a 20 20 72 63 20 3d 20  f(res));.  rc = 
2fd0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
2fe0: 20 7a 53 71 6c 2c 20 65 76 61 6c 43 61 6c 6c 62   zSql, evalCallb
2ff0: 61 63 6b 2c 20 26 72 65 73 2c 20 26 7a 45 72 72  ack, &res, &zErr
3000: 4d 73 67 29 3b 0a 20 20 69 66 28 20 7a 45 72 72  Msg);.  if( zErr
3010: 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Msg ){.    sqlit
3020: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
3030: 63 6f 6e 74 65 78 74 2c 20 7a 45 72 72 4d 73 67  context, zErrMsg
3040: 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  , -1);.    sqlit
3050: 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
3060: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63  ;.  }else if( rc
3070: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
3080: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64  result_error_cod
3090: 65 28 63 6f 6e 74 65 78 74 2c 20 72 63 29 3b 0a  e(context, rc);.
30a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
30b0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
30c0: 28 63 6f 6e 74 65 78 74 2c 20 72 65 73 2e 7a 2c  (context, res.z,
30d0: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
30e0: 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 20 20 73 74  SIENT);.  }.  st
30f0: 72 69 6e 67 46 72 65 65 28 26 72 65 73 29 3b 0a  ringFree(&res);.
3100: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 75 70  }../*.** Look up
3110: 20 74 68 65 20 6e 65 78 74 20 74 61 73 6b 20 66   the next task f
3120: 6f 72 20 63 6c 69 65 6e 74 20 69 43 6c 69 65 6e  or client iClien
3130: 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  t in the databas
3140: 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  e..** Return the
3150: 20 74 61 73 6b 20 73 63 72 69 70 74 20 61 6e 64   task script and
3160: 20 74 68 65 20 74 61 73 6b 20 6e 75 6d 62 65 72   the task number
3170: 20 61 6e 64 20 6d 61 72 6b 20 74 68 61 74 0a 2a   and mark that.*
3180: 2a 20 74 61 73 6b 20 61 73 20 62 65 69 6e 67 20  * task as being 
3190: 75 6e 64 65 72 20 77 61 79 2e 0a 2a 2f 0a 73 74  under way..*/.st
31a0: 61 74 69 63 20 69 6e 74 20 73 74 61 72 74 53 63  atic int startSc
31b0: 72 69 70 74 28 0a 20 20 69 6e 74 20 69 43 6c 69  ript(.  int iCli
31c0: 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20  ent,            
31d0: 20 20 2f 2a 20 54 68 65 20 63 6c 69 65 6e 74 20    /* The client 
31e0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61 72  number */.  char
31f0: 20 2a 2a 70 7a 53 63 72 69 70 74 2c 20 20 20 20   **pzScript,    
3200: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
3210: 61 73 6b 20 73 63 72 69 70 74 20 68 65 72 65 20  ask script here 
3220: 2a 2f 0a 20 20 69 6e 74 20 2a 70 54 61 73 6b 49  */.  int *pTaskI
3230: 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d              /
3240: 2a 20 57 72 69 74 65 20 74 61 73 6b 20 6e 75 6d  * Write task num
3250: 62 65 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  ber here */.){. 
3260: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
3270: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Stmt = 0;.  int 
3280: 74 61 73 6b 49 64 3b 0a 20 20 69 6e 74 20 72 63  taskId;.  int rc
3290: 3b 0a 20 20 69 6e 74 20 74 6f 74 61 6c 54 69 6d  ;.  int totalTim
32a0: 65 20 3d 20 30 3b 0a 0a 20 20 2a 70 7a 53 63 72  e = 0;..  *pzScr
32b0: 69 70 74 20 3d 20 30 3b 0a 20 20 67 2e 69 54 69  ipt = 0;.  g.iTi
32c0: 6d 65 6f 75 74 20 3d 20 30 3b 0a 20 20 77 68 69  meout = 0;.  whi
32d0: 6c 65 28 31 29 7b 0a 20 20 20 20 72 63 20 3d 20  le(1){.    rc = 
32e0: 74 72 79 53 71 6c 28 22 42 45 47 49 4e 20 49 4d  trySql("BEGIN IM
32f0: 4d 45 44 49 41 54 45 22 29 3b 0a 20 20 20 20 69  MEDIATE");.    i
3300: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
3310: 53 59 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  SY ){.      sqli
3320: 74 65 33 5f 73 6c 65 65 70 28 31 30 29 3b 0a 20  te3_sleep(10);. 
3330: 20 20 20 20 20 74 6f 74 61 6c 54 69 6d 65 20 2b       totalTime +
3340: 3d 20 31 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74  = 10;.      cont
3350: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  inue;.    }.    
3360: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
3370: 4b 20 29 7b 0a 20 20 20 20 20 20 66 61 74 61 6c  K ){.      fatal
3380: 45 72 72 6f 72 28 22 69 6e 20 73 74 61 72 74 53  Error("in startS
3390: 63 72 69 70 74 3a 20 25 73 22 2c 20 73 71 6c 69  cript: %s", sqli
33a0: 74 65 33 5f 65 72 72 6d 73 67 28 67 2e 64 62 29  te3_errmsg(g.db)
33b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
33c0: 20 67 2e 6e 45 72 72 6f 72 20 7c 7c 20 67 2e 6e   g.nError || g.n
33d0: 54 65 73 74 20 29 7b 0a 20 20 20 20 20 20 72 75  Test ){.      ru
33e0: 6e 53 71 6c 28 22 55 50 44 41 54 45 20 63 6f 75  nSql("UPDATE cou
33f0: 6e 74 65 72 73 20 53 45 54 20 6e 45 72 72 6f 72  nters SET nError
3400: 3d 6e 45 72 72 6f 72 2b 25 64 2c 20 6e 54 65 73  =nError+%d, nTes
3410: 74 3d 6e 54 65 73 74 2b 25 64 22 2c 0a 20 20 20  t=nTest+%d",.   
3420: 20 20 20 20 20 20 20 20 20 20 67 2e 6e 45 72 72            g.nErr
3430: 6f 72 2c 20 67 2e 6e 54 65 73 74 29 3b 0a 20 20  or, g.nTest);.  
3440: 20 20 20 20 67 2e 6e 45 72 72 6f 72 20 3d 20 30      g.nError = 0
3450: 3b 0a 20 20 20 20 20 20 67 2e 6e 54 65 73 74 20  ;.      g.nTest 
3460: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
3470: 53 74 6d 74 20 3d 20 70 72 65 70 61 72 65 53 71  Stmt = prepareSq
3480: 6c 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d  l("SELECT 1 FROM
3490: 20 63 6c 69 65 6e 74 20 57 48 45 52 45 20 69 64   client WHERE id
34a0: 3d 25 64 20 41 4e 44 20 77 61 6e 74 48 61 6c 74  =%d AND wantHalt
34b0: 22 2c 69 43 6c 69 65 6e 74 29 3b 0a 20 20 20 20  ",iClient);.    
34c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
34d0: 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 71  p(pStmt);.    sq
34e0: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
34f0: 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 72  Stmt);.    if( r
3500: 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  c==SQLITE_ROW ){
3510: 0a 20 20 20 20 20 20 72 75 6e 53 71 6c 28 22 44  .      runSql("D
3520: 45 4c 45 54 45 20 46 52 4f 4d 20 63 6c 69 65 6e  ELETE FROM clien
3530: 74 20 57 48 45 52 45 20 69 64 3d 25 64 22 2c 20  t WHERE id=%d", 
3540: 69 43 6c 69 65 6e 74 29 3b 0a 20 20 20 20 20 20  iClient);.      
3550: 67 2e 69 54 69 6d 65 6f 75 74 20 3d 20 44 45 46  g.iTimeout = DEF
3560: 41 55 4c 54 5f 54 49 4d 45 4f 55 54 3b 0a 20 20  AULT_TIMEOUT;.  
3570: 20 20 20 20 72 75 6e 53 71 6c 28 22 43 4f 4d 4d      runSql("COMM
3580: 49 54 20 54 52 41 4e 53 41 43 54 49 4f 4e 3b 22  IT TRANSACTION;"
3590: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
35a0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
35b0: 20 7d 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 70   }.    pStmt = p
35c0: 72 65 70 61 72 65 53 71 6c 28 0a 20 20 20 20 20  repareSql(.     
35d0: 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54           "SELECT
35e0: 20 73 63 72 69 70 74 2c 20 69 64 20 46 52 4f 4d   script, id FROM
35f0: 20 74 61 73 6b 22 0a 20 20 20 20 20 20 20 20 20   task".         
3600: 20 20 20 20 20 22 20 57 48 45 52 45 20 63 6c 69       " WHERE cli
3610: 65 6e 74 3d 25 64 20 41 4e 44 20 73 74 61 72 74  ent=%d AND start
3620: 74 69 6d 65 20 49 53 20 4e 55 4c 4c 22 0a 20 20  time IS NULL".  
3630: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 4f 52              " OR
3640: 44 45 52 20 42 59 20 69 64 20 4c 49 4d 49 54 20  DER BY id LIMIT 
3650: 31 22 2c 20 69 43 6c 69 65 6e 74 29 3b 0a 20 20  1", iClient);.  
3660: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
3670: 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  tep(pStmt);.    
3680: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52  if( rc==SQLITE_R
3690: 4f 57 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OW ){.      int 
36a0: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  n = sqlite3_colu
36b0: 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20  mn_bytes(pStmt, 
36c0: 30 29 3b 0a 20 20 20 20 20 20 2a 70 7a 53 63 72  0);.      *pzScr
36d0: 69 70 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ipt = sqlite3_ma
36e0: 6c 6c 6f 63 28 6e 2b 31 29 3b 0a 20 20 20 20 20  lloc(n+1);.     
36f0: 20 73 74 72 63 70 79 28 2a 70 7a 53 63 72 69 70   strcpy(*pzScrip
3700: 74 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  t, (const char*)
3710: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
3720: 65 78 74 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a  ext(pStmt, 0));.
3730: 20 20 20 20 20 20 2a 70 54 61 73 6b 49 64 20 3d        *pTaskId =
3740: 20 74 61 73 6b 49 64 20 3d 20 73 71 6c 69 74 65   taskId = sqlite
3750: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
3760: 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73 71  mt, 1);.      sq
3770: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
3780: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 75 6e  Stmt);.      run
3790: 53 71 6c 28 22 55 50 44 41 54 45 20 74 61 73 6b  Sql("UPDATE task
37a0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ".             "
37b0: 20 20 20 53 45 54 20 73 74 61 72 74 74 69 6d 65     SET starttime
37c0: 3d 73 74 72 66 74 69 6d 65 28 27 25 25 59 2d 25  =strftime('%%Y-%
37d0: 25 6d 2d 25 25 64 20 25 25 48 3a 25 25 4d 3a 25  %m-%%d %%H:%%M:%
37e0: 25 66 27 2c 27 6e 6f 77 27 29 22 0a 20 20 20 20  %f','now')".    
37f0: 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45           " WHERE
3800: 20 69 64 3d 25 64 3b 22 2c 20 74 61 73 6b 49 64   id=%d;", taskId
3810: 29 3b 0a 20 20 20 20 20 20 67 2e 69 54 69 6d 65  );.      g.iTime
3820: 6f 75 74 20 3d 20 44 45 46 41 55 4c 54 5f 54 49  out = DEFAULT_TI
3830: 4d 45 4f 55 54 3b 0a 20 20 20 20 20 20 72 75 6e  MEOUT;.      run
3840: 53 71 6c 28 22 43 4f 4d 4d 49 54 20 54 52 41 4e  Sql("COMMIT TRAN
3850: 53 41 43 54 49 4f 4e 3b 22 29 3b 0a 20 20 20 20  SACTION;");.    
3860: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
3870: 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  OK;.    }.    sq
3880: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
3890: 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 72  Stmt);.    if( r
38a0: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
38b0: 7b 0a 20 20 20 20 20 20 69 66 28 20 74 6f 74 61  {.      if( tota
38c0: 6c 54 69 6d 65 3e 33 30 30 30 30 20 29 7b 0a 20  lTime>30000 ){. 
38d0: 20 20 20 20 20 20 20 65 72 72 6f 72 4d 65 73 73         errorMess
38e0: 61 67 65 28 22 57 61 69 74 65 64 20 6f 76 65 72  age("Waited over
38f0: 20 33 30 20 73 65 63 6f 6e 64 73 20 77 69 74 68   30 seconds with
3900: 20 6e 6f 20 77 6f 72 6b 2e 20 20 47 69 76 69 6e   no work.  Givin
3910: 67 20 75 70 2e 22 29 3b 0a 20 20 20 20 20 20 20  g up.");.       
3920: 20 72 75 6e 53 71 6c 28 22 44 45 4c 45 54 45 20   runSql("DELETE 
3930: 46 52 4f 4d 20 63 6c 69 65 6e 74 20 57 48 45 52  FROM client WHER
3940: 45 20 69 64 3d 25 64 3b 20 43 4f 4d 4d 49 54 3b  E id=%d; COMMIT;
3950: 22 2c 20 69 43 6c 69 65 6e 74 29 3b 0a 20 20 20  ", iClient);.   
3960: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f       sqlite3_clo
3970: 73 65 28 67 2e 64 62 29 3b 0a 20 20 20 20 20 20  se(g.db);.      
3980: 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20    exit(1);.     
3990: 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20   }.      while( 
39a0: 74 72 79 53 71 6c 28 22 43 4f 4d 4d 49 54 22 29  trySql("COMMIT")
39b0: 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b  ==SQLITE_BUSY ){
39c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
39d0: 5f 73 6c 65 65 70 28 31 30 29 3b 0a 20 20 20 20  _sleep(10);.    
39e0: 20 20 20 20 74 6f 74 61 6c 54 69 6d 65 20 2b 3d      totalTime +=
39f0: 20 31 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   10;.      }.   
3a00: 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70     sqlite3_sleep
3a10: 28 31 30 30 29 3b 0a 20 20 20 20 20 20 74 6f 74  (100);.      tot
3a20: 61 6c 54 69 6d 65 20 2b 3d 20 31 30 30 3b 0a 20  alTime += 100;. 
3a30: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
3a40: 20 20 20 7d 0a 20 20 20 20 66 61 74 61 6c 45 72     }.    fatalEr
3a50: 72 6f 72 28 22 25 73 22 2c 20 73 71 6c 69 74 65  ror("%s", sqlite
3a60: 33 5f 65 72 72 6d 73 67 28 67 2e 64 62 29 29 3b  3_errmsg(g.db));
3a70: 0a 20 20 7d 0a 20 20 67 2e 69 54 69 6d 65 6f 75  .  }.  g.iTimeou
3a80: 74 20 3d 20 44 45 46 41 55 4c 54 5f 54 49 4d 45  t = DEFAULT_TIME
3a90: 4f 55 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  OUT;.}../*.** Ma
3aa0: 72 6b 20 61 20 73 63 72 69 70 74 20 61 73 20 68  rk a script as h
3ab0: 61 76 69 6e 67 20 66 69 6e 69 73 68 65 64 2e 20  aving finished. 
3ac0: 20 20 52 65 6d 6f 76 65 20 74 68 65 20 43 4c 49    Remove the CLI
3ad0: 45 4e 54 20 74 61 62 6c 65 20 65 6e 74 72 79 0a  ENT table entry.
3ae0: 2a 2a 20 69 66 20 62 53 68 75 74 64 6f 77 6e 20  ** if bShutdown 
3af0: 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74  is true..*/.stat
3b00: 69 63 20 69 6e 74 20 66 69 6e 69 73 68 53 63 72  ic int finishScr
3b10: 69 70 74 28 69 6e 74 20 69 43 6c 69 65 6e 74 2c  ipt(int iClient,
3b20: 20 69 6e 74 20 74 61 73 6b 49 64 2c 20 69 6e 74   int taskId, int
3b30: 20 62 53 68 75 74 64 6f 77 6e 29 7b 0a 20 20 72   bShutdown){.  r
3b40: 75 6e 53 71 6c 28 22 55 50 44 41 54 45 20 74 61  unSql("UPDATE ta
3b50: 73 6b 22 0a 20 20 20 20 20 20 20 20 20 22 20 20  sk".         "  
3b60: 20 53 45 54 20 65 6e 64 74 69 6d 65 3d 73 74 72   SET endtime=str
3b70: 66 74 69 6d 65 28 27 25 25 59 2d 25 25 6d 2d 25  ftime('%%Y-%%m-%
3b80: 25 64 20 25 25 48 3a 25 25 4d 3a 25 25 66 27 2c  %d %%H:%%M:%%f',
3b90: 27 6e 6f 77 27 29 22 0a 20 20 20 20 20 20 20 20  'now')".        
3ba0: 20 22 20 57 48 45 52 45 20 69 64 3d 25 64 3b 22   " WHERE id=%d;"
3bb0: 2c 20 74 61 73 6b 49 64 29 3b 0a 20 20 69 66 28  , taskId);.  if(
3bc0: 20 62 53 68 75 74 64 6f 77 6e 20 29 7b 0a 20 20   bShutdown ){.  
3bd0: 20 20 72 75 6e 53 71 6c 28 22 44 45 4c 45 54 45    runSql("DELETE
3be0: 20 46 52 4f 4d 20 63 6c 69 65 6e 74 20 57 48 45   FROM client WHE
3bf0: 52 45 20 69 64 3d 25 64 22 2c 20 69 43 6c 69 65  RE id=%d", iClie
3c00: 6e 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  nt);.  }.  retur
3c10: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
3c20: 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 75 70 20 61  /*.** Start up a
3c30: 20 63 6c 69 65 6e 74 20 70 72 6f 63 65 73 73 20   client process 
3c40: 66 6f 72 20 69 43 6c 69 65 6e 74 2c 20 69 66 20  for iClient, if 
3c50: 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  it is not alread
3c60: 79 0a 2a 2a 20 72 75 6e 6e 69 6e 67 2e 20 20 49  y.** running.  I
3c70: 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69 73 20  f the client is 
3c80: 61 6c 72 65 61 64 79 20 72 75 6e 6e 69 6e 67 2c  already running,
3c90: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
3ca0: 6e 65 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d 6f 70  ne.** is a no-op
3cb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
3cc0: 20 73 74 61 72 74 43 6c 69 65 6e 74 28 69 6e 74   startClient(int
3cd0: 20 69 43 6c 69 65 6e 74 29 7b 0a 20 20 72 75 6e   iClient){.  run
3ce0: 53 71 6c 28 22 49 4e 53 45 52 54 20 4f 52 20 49  Sql("INSERT OR I
3cf0: 47 4e 4f 52 45 20 49 4e 54 4f 20 63 6c 69 65 6e  GNORE INTO clien
3d00: 74 20 56 41 4c 55 45 53 28 25 64 2c 30 29 22 2c  t VALUES(%d,0)",
3d10: 20 69 43 6c 69 65 6e 74 29 3b 0a 20 20 69 66 28   iClient);.  if(
3d20: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
3d30: 28 67 2e 64 62 29 20 29 7b 0a 23 69 66 20 21 64  (g.db) ){.#if !d
3d40: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20  efined(_WIN32). 
3d50: 20 20 20 63 68 61 72 20 2a 7a 53 79 73 3b 0a 20     char *zSys;. 
3d60: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 7a     int rc;.    z
3d70: 53 79 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sys = sqlite3_mp
3d80: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20  rintf(.         
3d90: 20 20 20 20 20 20 20 20 22 25 73 20 5c 22 25 73          "%s \"%s
3da0: 5c 22 20 2d 2d 63 6c 69 65 6e 74 20 25 64 20 2d  \" --client %d -
3db0: 2d 74 72 61 63 65 20 25 64 20 25 73 25 73 26 22  -trace %d %s%s&"
3dc0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3dd0: 20 20 20 67 2e 61 72 67 76 30 2c 20 67 2e 7a 44     g.argv0, g.zD
3de0: 62 46 69 6c 65 2c 20 69 43 6c 69 65 6e 74 2c 20  bFile, iClient, 
3df0: 67 2e 69 54 72 61 63 65 2c 0a 20 20 20 20 20 20  g.iTrace,.      
3e00: 20 20 20 20 20 20 20 20 20 20 20 67 2e 62 53 71             g.bSq
3e10: 6c 54 72 61 63 65 20 3f 20 22 2d 2d 73 71 6c 74  lTrace ? "--sqlt
3e20: 72 61 63 65 20 22 20 3a 20 22 22 2c 0a 20 20 20  race " : "",.   
3e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67 2e                g.
3e40: 62 53 79 6e 63 20 3f 20 22 2d 2d 73 79 6e 63 20  bSync ? "--sync 
3e50: 22 20 3a 20 22 22 0a 20 20 20 20 29 3b 0a 20 20  " : "".    );.  
3e60: 20 20 72 63 20 3d 20 73 79 73 74 65 6d 28 7a 53    rc = system(zS
3e70: 79 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  ys);.    if( rc 
3e80: 29 20 65 72 72 6f 72 4d 65 73 73 61 67 65 28 22  ) errorMessage("
3e90: 73 79 73 74 65 6d 28 29 20 66 61 69 6c 73 20 77  system() fails w
3ea0: 69 74 68 20 65 72 72 6f 72 20 63 6f 64 65 20 25  ith error code %
3eb0: 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 73 71 6c  d", rc);.    sql
3ec0: 69 74 65 33 5f 66 72 65 65 28 7a 53 79 73 29 3b  ite3_free(zSys);
3ed0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
3ee0: 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20 20 20 20  ned(_WIN32).    
3ef0: 63 68 61 72 20 2a 61 72 67 76 5b 31 30 5d 3b 0a  char *argv[10];.
3f00: 20 20 20 20 63 68 61 72 20 7a 43 6c 69 65 6e 74      char zClient
3f10: 5b 32 30 5d 3b 0a 20 20 20 20 63 68 61 72 20 7a  [20];.    char z
3f20: 54 72 61 63 65 5b 32 30 5d 3b 0a 20 20 20 20 61  Trace[20];.    a
3f30: 72 67 76 5b 30 5d 20 3d 20 67 2e 61 72 67 76 30  rgv[0] = g.argv0
3f40: 3b 0a 20 20 20 20 61 72 67 76 5b 31 5d 20 3d 20  ;.    argv[1] = 
3f50: 67 2e 7a 44 62 46 69 6c 65 3b 0a 20 20 20 20 61  g.zDbFile;.    a
3f60: 72 67 76 5b 32 5d 20 3d 20 22 2d 2d 63 6c 69 65  rgv[2] = "--clie
3f70: 6e 74 22 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nt";.    sqlite3
3f80: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
3f90: 28 7a 43 6c 69 65 6e 74 29 2c 7a 43 6c 69 65 6e  (zClient),zClien
3fa0: 74 2c 22 25 64 22 2c 69 43 6c 69 65 6e 74 29 3b  t,"%d",iClient);
3fb0: 0a 20 20 20 20 61 72 67 76 5b 33 5d 20 3d 20 7a  .    argv[3] = z
3fc0: 43 6c 69 65 6e 74 3b 0a 20 20 20 20 61 72 67 76  Client;.    argv
3fd0: 5b 34 5d 20 3d 20 22 2d 2d 74 72 61 63 65 22 3b  [4] = "--trace";
3fe0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
3ff0: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 72  rintf(sizeof(zTr
4000: 61 63 65 29 2c 7a 54 72 61 63 65 2c 22 25 64 22  ace),zTrace,"%d"
4010: 2c 67 2e 69 54 72 61 63 65 29 3b 0a 20 20 20 20  ,g.iTrace);.    
4020: 61 72 67 76 5b 35 5d 20 3d 20 7a 54 72 61 63 65  argv[5] = zTrace
4030: 3b 0a 20 20 20 20 69 66 28 20 67 2e 62 53 71 6c  ;.    if( g.bSql
4040: 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 61  Trace ){.      a
4050: 72 67 76 5b 36 5d 20 3d 20 22 2d 2d 73 71 6c 74  rgv[6] = "--sqlt
4060: 72 61 63 65 22 3b 0a 20 20 20 20 20 20 61 72 67  race";.      arg
4070: 76 5b 37 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 65  v[7] = 0;.    }e
4080: 6c 73 65 7b 0a 20 20 20 20 20 20 61 72 67 76 5b  lse{.      argv[
4090: 36 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  6] = 0;.    }.  
40a0: 20 20 5f 73 70 61 77 6e 76 28 5f 50 5f 4e 4f 57    _spawnv(_P_NOW
40b0: 41 49 54 2c 20 67 2e 61 72 67 76 30 2c 20 28 63  AIT, g.argv0, (c
40c0: 6f 6e 73 74 20 63 68 61 72 2a 63 6f 6e 73 74 2a  onst char*const*
40d0: 29 61 72 67 76 29 3b 0a 23 65 6e 64 69 66 0a 20  )argv);.#endif. 
40e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64   }.}../*.** Read
40f0: 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74   the entire cont
4100: 65 6e 74 20 6f 66 20 61 20 66 69 6c 65 20 69 6e  ent of a file in
4110: 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2f 0a 73 74 61  to memory.*/.sta
4120: 74 69 63 20 63 68 61 72 20 2a 72 65 61 64 46 69  tic char *readFi
4130: 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  le(const char *z
4140: 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 46 49 4c  Filename){.  FIL
4150: 45 20 2a 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 46  E *in = fopen(zF
4160: 69 6c 65 6e 61 6d 65 2c 20 22 72 62 22 29 3b 0a  ilename, "rb");.
4170: 20 20 6c 6f 6e 67 20 73 7a 3b 0a 20 20 63 68 61    long sz;.  cha
4180: 72 20 2a 7a 3b 0a 20 20 69 66 28 20 69 6e 3d 3d  r *z;.  if( in==
4190: 30 20 29 7b 0a 20 20 20 20 66 61 74 61 6c 45 72  0 ){.    fatalEr
41a0: 72 6f 72 28 22 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror("cannot open
41b0: 20 5c 22 25 73 5c 22 20 66 6f 72 20 72 65 61 64   \"%s\" for read
41c0: 69 6e 67 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ing", zFilename)
41d0: 3b 0a 20 20 7d 0a 20 20 66 73 65 65 6b 28 69 6e  ;.  }.  fseek(in
41e0: 2c 20 30 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a  , 0, SEEK_END);.
41f0: 20 20 73 7a 20 3d 20 66 74 65 6c 6c 28 69 6e 29    sz = ftell(in)
4200: 3b 0a 20 20 72 65 77 69 6e 64 28 69 6e 29 3b 0a  ;.  rewind(in);.
4210: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61    z = sqlite3_ma
4220: 6c 6c 6f 63 28 20 73 7a 2b 31 20 29 3b 0a 20 20  lloc( sz+1 );.  
4230: 73 7a 20 3d 20 28 6c 6f 6e 67 29 66 72 65 61 64  sz = (long)fread
4240: 28 7a 2c 20 31 2c 20 73 7a 2c 20 69 6e 29 3b 0a  (z, 1, sz, in);.
4250: 20 20 7a 5b 73 7a 5d 20 3d 20 30 3b 0a 20 20 66    z[sz] = 0;.  f
4260: 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 72 65 74  close(in);.  ret
4270: 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn z;.}../*.** 
4280: 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67 74  Return the lengt
4290: 68 20 6f 66 20 74 68 65 20 6e 65 78 74 20 74 6f  h of the next to
42a0: 6b 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ken..*/.static i
42b0: 6e 74 20 74 6f 6b 65 6e 4c 65 6e 67 74 68 28 63  nt tokenLength(c
42c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
42d0: 74 20 2a 70 6e 4c 69 6e 65 29 7b 0a 20 20 69 6e  t *pnLine){.  in
42e0: 74 20 6e 20 3d 20 30 3b 0a 20 20 69 66 28 20 69  t n = 0;.  if( i
42f0: 73 73 70 61 63 65 28 7a 5b 30 5d 29 20 7c 7c 20  sspace(z[0]) || 
4300: 28 7a 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 7a 5b  (z[0]=='/' && z[
4310: 31 5d 3d 3d 27 2a 27 29 20 29 7b 0a 20 20 20 20  1]=='*') ){.    
4320: 69 6e 74 20 69 6e 43 20 3d 20 30 3b 0a 20 20 20  int inC = 0;.   
4330: 20 69 6e 74 20 63 3b 0a 20 20 20 20 69 66 28 20   int c;.    if( 
4340: 7a 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  z[0]=='/' ){.   
4350: 20 20 20 69 6e 43 20 3d 20 31 3b 0a 20 20 20 20     inC = 1;.    
4360: 20 20 6e 20 3d 20 32 3b 0a 20 20 20 20 7d 0a 20    n = 2;.    }. 
4370: 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a     while( (c = z
4380: 5b 6e 2b 2b 5d 29 21 3d 30 20 29 7b 0a 20 20 20  [n++])!=0 ){.   
4390: 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29     if( c=='\n' )
43a0: 20 28 2a 70 6e 4c 69 6e 65 29 2b 2b 3b 0a 20 20   (*pnLine)++;.  
43b0: 20 20 20 20 69 66 28 20 69 73 73 70 61 63 65 28      if( isspace(
43c0: 63 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  c) ) continue;. 
43d0: 20 20 20 20 20 69 66 28 20 69 6e 43 20 26 26 20       if( inC && 
43e0: 63 3d 3d 27 2a 27 20 26 26 20 7a 5b 6e 5d 3d 3d  c=='*' && z[n]==
43f0: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  '/' ){.        n
4400: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 6e 43 20  ++;.        inC 
4410: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
4420: 20 69 66 28 20 21 69 6e 43 20 26 26 20 63 3d 3d   if( !inC && c==
4430: 27 2f 27 20 26 26 20 7a 5b 6e 5d 3d 3d 27 2a 27  '/' && z[n]=='*'
4440: 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b   ){.        n++;
4450: 0a 20 20 20 20 20 20 20 20 69 6e 43 20 3d 20 31  .        inC = 1
4460: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
4470: 28 20 21 69 6e 43 20 29 7b 0a 20 20 20 20 20 20  ( !inC ){.      
4480: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
4490: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 2d 2d 3b 0a  .    }.    n--;.
44a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 30 5d    }else if( z[0]
44b0: 3d 3d 27 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d 27  =='-' && z[1]=='
44c0: 2d 27 20 29 7b 0a 20 20 20 20 66 6f 72 28 6e 3d  -' ){.    for(n=
44d0: 32 3b 20 7a 5b 6e 5d 20 26 26 20 7a 5b 6e 5d 21  2; z[n] && z[n]!
44e0: 3d 27 5c 6e 27 3b 20 6e 2b 2b 29 7b 7d 0a 20 20  ='\n'; n++){}.  
44f0: 20 20 69 66 28 20 7a 5b 6e 5d 20 29 7b 20 28 2a    if( z[n] ){ (*
4500: 70 6e 4c 69 6e 65 29 2b 2b 3b 20 6e 2b 2b 3b 20  pnLine)++; n++; 
4510: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b  }.  }else if( z[
4520: 30 5d 3d 3d 27 22 27 20 7c 7c 20 7a 5b 30 5d 3d  0]=='"' || z[0]=
4530: 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 69 6e 74  ='\'' ){.    int
4540: 20 64 65 6c 69 6d 20 3d 20 7a 5b 30 5d 3b 0a 20   delim = z[0];. 
4550: 20 20 20 66 6f 72 28 6e 3d 31 3b 20 7a 5b 6e 5d     for(n=1; z[n]
4560: 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; n++){.      if
4570: 28 20 7a 5b 6e 5d 3d 3d 27 5c 6e 27 20 29 20 28  ( z[n]=='\n' ) (
4580: 2a 70 6e 4c 69 6e 65 29 2b 2b 3b 0a 20 20 20 20  *pnLine)++;.    
4590: 20 20 69 66 28 20 7a 5b 6e 5d 3d 3d 64 65 6c 69    if( z[n]==deli
45a0: 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 2b 2b  m ){.        n++
45b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  ;.        if( z[
45c0: 6e 2b 31 5d 21 3d 64 65 6c 69 6d 20 29 20 62 72  n+1]!=delim ) br
45d0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
45e0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
45f0: 69 6e 74 20 63 3b 0a 20 20 20 20 66 6f 72 28 6e  int c;.    for(n
4600: 3d 31 3b 20 28 63 20 3d 20 7a 5b 6e 5d 29 21 3d  =1; (c = z[n])!=
4610: 30 20 26 26 20 21 69 73 73 70 61 63 65 28 63 29  0 && !isspace(c)
4620: 20 26 26 20 63 21 3d 27 22 27 20 26 26 20 63 21   && c!='"' && c!
4630: 3d 27 5c 27 27 20 26 26 20 63 21 3d 27 3b 27 3b  ='\'' && c!=';';
4640: 20 6e 2b 2b 29 7b 7d 0a 20 20 7d 0a 20 20 72 65   n++){}.  }.  re
4650: 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
4660: 20 43 6f 70 79 20 61 20 73 69 6e 67 6c 65 20 74   Copy a single t
4670: 6f 6b 65 6e 20 69 6e 74 6f 20 61 20 73 74 72 69  oken into a stri
4680: 6e 67 20 62 75 66 66 65 72 2e 0a 2a 2f 0a 73 74  ng buffer..*/.st
4690: 61 74 69 63 20 69 6e 74 20 65 78 74 72 61 63 74  atic int extract
46a0: 54 6f 6b 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  Token(const char
46b0: 20 2a 7a 49 6e 2c 20 69 6e 74 20 6e 49 6e 2c 20   *zIn, int nIn, 
46c0: 63 68 61 72 20 2a 7a 4f 75 74 2c 20 69 6e 74 20  char *zOut, int 
46d0: 6e 4f 75 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  nOut){.  int i;.
46e0: 20 20 69 66 28 20 6e 49 6e 3c 3d 30 20 29 7b 0a    if( nIn<=0 ){.
46f0: 20 20 20 20 7a 4f 75 74 5b 30 5d 20 3d 20 30 3b      zOut[0] = 0;
4700: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
4710: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
4720: 6e 49 6e 20 26 26 20 69 3c 6e 4f 75 74 2d 31 20  nIn && i<nOut-1 
4730: 26 26 20 21 69 73 73 70 61 63 65 28 7a 49 6e 5b  && !isspace(zIn[
4740: 69 5d 29 3b 20 69 2b 2b 29 7b 20 7a 4f 75 74 5b  i]); i++){ zOut[
4750: 69 5d 20 3d 20 7a 49 6e 5b 69 5d 3b 20 7d 0a 20  i] = zIn[i]; }. 
4760: 20 7a 4f 75 74 5b 69 5d 20 3d 20 30 3b 0a 20 20   zOut[i] = 0;.  
4770: 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a  return i;.}../*.
4780: 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 75 6d 62  ** Find the numb
4790: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
47a0: 20 75 70 20 74 6f 20 74 68 65 20 73 74 61 72 74   up to the start
47b0: 20 6f 66 20 74 68 65 20 6e 65 78 74 20 22 2d 2d   of the next "--
47c0: 65 6e 64 22 20 74 6f 6b 65 6e 2e 0a 2a 2f 0a 73  end" token..*/.s
47d0: 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 45 6e  tatic int findEn
47e0: 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  d(const char *z,
47f0: 20 69 6e 74 20 2a 70 6e 4c 69 6e 65 29 7b 0a 20   int *pnLine){. 
4800: 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 77 68   int n = 0;.  wh
4810: 69 6c 65 28 20 7a 5b 6e 5d 20 26 26 20 28 73 74  ile( z[n] && (st
4820: 72 6e 63 6d 70 28 7a 2b 6e 2c 22 2d 2d 65 6e 64  rncmp(z+n,"--end
4830: 22 2c 35 29 20 7c 7c 20 21 69 73 73 70 61 63 65  ",5) || !isspace
4840: 28 7a 5b 6e 2b 35 5d 29 29 20 29 7b 0a 20 20 20  (z[n+5])) ){.   
4850: 20 6e 20 2b 3d 20 74 6f 6b 65 6e 4c 65 6e 67 74   n += tokenLengt
4860: 68 28 7a 2b 6e 2c 20 70 6e 4c 69 6e 65 29 3b 0a  h(z+n, pnLine);.
4870: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a    }.  return n;.
4880: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68  }../*.** Find th
4890: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  e number of char
48a0: 61 63 74 65 72 73 20 75 70 20 74 6f 20 74 68 65  acters up to the
48b0: 20 66 69 72 73 74 20 63 68 61 72 61 63 74 65 72   first character
48c0: 20 70 61 73 74 20 74 68 65 0a 2a 2a 20 6f 66 20   past the.** of 
48d0: 74 68 65 20 6e 65 78 74 20 22 2d 2d 65 6e 64 69  the next "--endi
48e0: 66 22 20 20 6f 72 20 22 2d 2d 65 6c 73 65 22 20  f"  or "--else" 
48f0: 74 6f 6b 65 6e 2e 20 4e 65 73 74 65 64 20 2d 2d  token. Nested --
4900: 69 66 20 63 6f 6d 6d 61 6e 64 73 20 61 72 65 0a  if commands are.
4910: 2a 2a 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e  ** also skipped.
4920: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
4930: 69 6e 64 45 6e 64 69 66 28 63 6f 6e 73 74 20 63  indEndif(const c
4940: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 73 74 6f 70  har *z, int stop
4950: 41 74 45 6c 73 65 2c 20 69 6e 74 20 2a 70 6e 4c  AtElse, int *pnL
4960: 69 6e 65 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20  ine){.  int n = 
4970: 30 3b 0a 20 20 77 68 69 6c 65 28 20 7a 5b 6e 5d  0;.  while( z[n]
4980: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 20   ){.    int len 
4990: 3d 20 74 6f 6b 65 6e 4c 65 6e 67 74 68 28 7a 2b  = tokenLength(z+
49a0: 6e 2c 20 70 6e 4c 69 6e 65 29 3b 0a 20 20 20 20  n, pnLine);.    
49b0: 69 66 28 20 28 73 74 72 6e 63 6d 70 28 7a 2b 6e  if( (strncmp(z+n
49c0: 2c 22 2d 2d 65 6e 64 69 66 22 2c 37 29 3d 3d 30  ,"--endif",7)==0
49d0: 20 26 26 20 69 73 73 70 61 63 65 28 7a 5b 6e 2b   && isspace(z[n+
49e0: 37 5d 29 29 0a 20 20 20 20 20 7c 7c 20 28 73 74  7])).     || (st
49f0: 6f 70 41 74 45 6c 73 65 20 26 26 20 73 74 72 6e  opAtElse && strn
4a00: 63 6d 70 28 7a 2b 6e 2c 22 2d 2d 65 6c 73 65 22  cmp(z+n,"--else"
4a10: 2c 36 29 3d 3d 30 20 26 26 20 69 73 73 70 61 63  ,6)==0 && isspac
4a20: 65 28 7a 5b 6e 2b 36 5d 29 29 0a 20 20 20 20 29  e(z[n+6])).    )
4a30: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e  {.      return n
4a40: 2b 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20  +len;.    }.    
4a50: 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 2b 6e 2c  if( strncmp(z+n,
4a60: 22 2d 2d 69 66 22 2c 34 29 3d 3d 30 20 26 26 20  "--if",4)==0 && 
4a70: 69 73 73 70 61 63 65 28 7a 5b 6e 2b 34 5d 29 20  isspace(z[n+4]) 
4a80: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 6b 69  ){.      int ski
4a90: 70 20 3d 20 66 69 6e 64 45 6e 64 69 66 28 7a 2b  p = findEndif(z+
4aa0: 6e 2b 6c 65 6e 2c 20 30 2c 20 70 6e 4c 69 6e 65  n+len, 0, pnLine
4ab0: 29 3b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 73 6b  );.      n += sk
4ac0: 69 70 20 2b 20 6c 65 6e 3b 0a 20 20 20 20 7d 65  ip + len;.    }e
4ad0: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20  lse{.      n += 
4ae0: 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  len;.    }.  }. 
4af0: 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
4b00: 0a 2a 2a 20 57 61 69 74 20 66 6f 72 20 61 20 63  .** Wait for a c
4b10: 6c 69 65 6e 74 20 70 72 6f 63 65 73 73 20 74 6f  lient process to
4b20: 20 63 6f 6d 70 6c 65 74 65 20 61 6c 6c 20 69 74   complete all it
4b30: 73 20 74 61 73 6b 73 0a 2a 2f 0a 73 74 61 74 69  s tasks.*/.stati
4b40: 63 20 76 6f 69 64 20 77 61 69 74 46 6f 72 43 6c  c void waitForCl
4b50: 69 65 6e 74 28 69 6e 74 20 69 43 6c 69 65 6e 74  ient(int iClient
4b60: 2c 20 69 6e 74 20 69 54 69 6d 65 6f 75 74 2c 20  , int iTimeout, 
4b70: 63 68 61 72 20 2a 7a 45 72 72 50 72 65 66 69 78  char *zErrPrefix
4b80: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
4b90: 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
4ba0: 72 63 3b 0a 20 20 69 66 28 20 69 43 6c 69 65 6e  rc;.  if( iClien
4bb0: 74 3e 30 20 29 7b 0a 20 20 20 20 70 53 74 6d 74  t>0 ){.    pStmt
4bc0: 20 3d 20 70 72 65 70 61 72 65 53 71 6c 28 0a 20   = prepareSql(. 
4bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
4be0: 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 74 61 73  ELECT 1 FROM tas
4bf0: 6b 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k".             
4c00: 20 20 22 20 57 48 45 52 45 20 63 6c 69 65 6e 74    " WHERE client
4c10: 3d 25 64 22 0a 20 20 20 20 20 20 20 20 20 20 20  =%d".           
4c20: 20 20 20 20 22 20 20 20 41 4e 44 20 63 6c 69 65      "   AND clie
4c30: 6e 74 20 49 4e 20 28 53 45 4c 45 43 54 20 69 64  nt IN (SELECT id
4c40: 20 46 52 4f 4d 20 63 6c 69 65 6e 74 29 22 0a 20   FROM client)". 
4c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
4c60: 20 41 4e 44 20 65 6e 64 74 69 6d 65 20 49 53 20   AND endtime IS 
4c70: 4e 55 4c 4c 22 2c 0a 20 20 20 20 20 20 20 20 20  NULL",.         
4c80: 20 20 20 20 20 20 69 43 6c 69 65 6e 74 29 3b 0a        iClient);.
4c90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 74    }else{.    pSt
4ca0: 6d 74 20 3d 20 70 72 65 70 61 72 65 53 71 6c 28  mt = prepareSql(
4cb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4cc0: 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 74  "SELECT 1 FROM t
4cd0: 61 73 6b 22 0a 20 20 20 20 20 20 20 20 20 20 20  ask".           
4ce0: 20 20 20 20 22 20 57 48 45 52 45 20 63 6c 69 65      " WHERE clie
4cf0: 6e 74 20 49 4e 20 28 53 45 4c 45 43 54 20 69 64  nt IN (SELECT id
4d00: 20 46 52 4f 4d 20 63 6c 69 65 6e 74 29 22 0a 20   FROM client)". 
4d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
4d20: 20 20 41 4e 44 20 65 6e 64 74 69 6d 65 20 49 53    AND endtime IS
4d30: 20 4e 55 4c 4c 22 29 3b 0a 20 20 7d 0a 20 20 67   NULL");.  }.  g
4d40: 2e 69 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 20  .iTimeout = 0;. 
4d50: 20 77 68 69 6c 65 28 20 28 28 72 63 20 3d 20 73   while( ((rc = s
4d60: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
4d70: 74 29 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  t))==SQLITE_BUSY
4d80: 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52   || rc==SQLITE_R
4d90: 4f 57 29 0a 20 20 20 20 26 26 20 69 54 69 6d 65  OW).    && iTime
4da0: 6f 75 74 3e 30 0a 20 20 29 7b 0a 20 20 20 20 73  out>0.  ){.    s
4db0: 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
4dc0: 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mt);.    sqlite3
4dd0: 5f 73 6c 65 65 70 28 35 30 29 3b 0a 20 20 20 20  _sleep(50);.    
4de0: 69 54 69 6d 65 6f 75 74 20 2d 3d 20 35 30 3b 0a  iTimeout -= 50;.
4df0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69    }.  sqlite3_fi
4e00: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
4e10: 20 67 2e 69 54 69 6d 65 6f 75 74 20 3d 20 44 45   g.iTimeout = DE
4e20: 46 41 55 4c 54 5f 54 49 4d 45 4f 55 54 3b 0a 20  FAULT_TIMEOUT;. 
4e30: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
4e40: 44 4f 4e 45 20 29 7b 0a 20 20 20 20 69 66 28 20  DONE ){.    if( 
4e50: 7a 45 72 72 50 72 65 66 69 78 3d 3d 30 20 29 20  zErrPrefix==0 ) 
4e60: 7a 45 72 72 50 72 65 66 69 78 20 3d 20 22 22 3b  zErrPrefix = "";
4e70: 0a 20 20 20 20 69 66 28 20 69 43 6c 69 65 6e 74  .    if( iClient
4e80: 3e 30 20 29 7b 0a 20 20 20 20 20 20 65 72 72 6f  >0 ){.      erro
4e90: 72 4d 65 73 73 61 67 65 28 22 25 73 74 69 6d 65  rMessage("%stime
4ea0: 6f 75 74 20 77 61 69 74 69 6e 67 20 66 6f 72 20  out waiting for 
4eb0: 63 6c 69 65 6e 74 20 25 64 22 2c 20 7a 45 72 72  client %d", zErr
4ec0: 50 72 65 66 69 78 2c 20 69 43 6c 69 65 6e 74 29  Prefix, iClient)
4ed0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4ee0: 20 20 20 65 72 72 6f 72 4d 65 73 73 61 67 65 28     errorMessage(
4ef0: 22 25 73 74 69 6d 65 6f 75 74 20 77 61 69 74 69  "%stimeout waiti
4f00: 6e 67 20 66 6f 72 20 61 6c 6c 20 63 6c 69 65 6e  ng for all clien
4f10: 74 73 22 2c 20 7a 45 72 72 50 72 65 66 69 78 29  ts", zErrPrefix)
4f20: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
4f30: 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
4f40: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f   of arguments to
4f50: 20 61 20 2d 2d 63 6f 6d 6d 61 6e 64 20 2a 2f 0a   a --command */.
4f60: 23 64 65 66 69 6e 65 20 4d 58 5f 41 52 47 20 32  #define MX_ARG 2
4f70: 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 73 63  ../*.** Run a sc
4f80: 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ript..*/.static 
4f90: 76 6f 69 64 20 72 75 6e 53 63 72 69 70 74 28 0a  void runScript(.
4fa0: 20 20 69 6e 74 20 69 43 6c 69 65 6e 74 2c 20 20    int iClient,  
4fb0: 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6c 69 65       /* The clie
4fc0: 6e 74 20 6e 75 6d 62 65 72 2c 20 6f 72 20 30 20  nt number, or 0 
4fd0: 66 6f 72 20 74 68 65 20 6d 61 73 74 65 72 20 2a  for the master *
4fe0: 2f 0a 20 20 69 6e 74 20 74 61 73 6b 49 64 2c 20  /.  int taskId, 
4ff0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61         /* The ta
5000: 73 6b 20 49 44 20 66 6f 72 20 63 6c 69 65 6e 74  sk ID for client
5010: 73 2e 20 20 30 20 66 6f 72 20 6d 61 73 74 65 72  s.  0 for master
5020: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 63 72   */.  char *zScr
5030: 69 70 74 2c 20 20 20 20 20 2f 2a 20 54 65 78 74  ipt,     /* Text
5040: 20 6f 66 20 74 68 65 20 73 63 72 69 70 74 20 2a   of the script *
5050: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
5060: 61 6d 65 20 20 20 20 2f 2a 20 46 69 6c 65 20 66  ame    /* File f
5070: 72 6f 6d 20 77 68 69 63 68 20 73 63 72 69 70 74  rom which script
5080: 20 77 61 73 20 72 65 61 64 2e 20 2a 2f 0a 29 7b   was read. */.){
5090: 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20  .  int lineno = 
50a0: 31 3b 0a 20 20 69 6e 74 20 70 72 65 76 4c 69 6e  1;.  int prevLin
50b0: 65 20 3d 20 31 3b 0a 20 20 69 6e 74 20 69 69 20  e = 1;.  int ii 
50c0: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 42 65 67 69  = 0;.  int iBegi
50d0: 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 2c 20  n = 0;.  int n, 
50e0: 63 2c 20 6a 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b  c, j;.  int len;
50f0: 0a 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 53  .  int nArg;.  S
5100: 74 72 69 6e 67 20 73 52 65 73 75 6c 74 3b 0a 20  tring sResult;. 
5110: 20 63 68 61 72 20 7a 43 6d 64 5b 33 30 5d 3b 0a   char zCmd[30];.
5120: 20 20 63 68 61 72 20 7a 45 72 72 6f 72 5b 31 30    char zError[10
5130: 30 30 5d 3b 0a 20 20 63 68 61 72 20 61 7a 41 72  00];.  char azAr
5140: 67 5b 4d 58 5f 41 52 47 5d 5b 31 30 30 5d 3b 0a  g[MX_ARG][100];.
5150: 0a 20 20 6d 65 6d 73 65 74 28 26 73 52 65 73 75  .  memset(&sResu
5160: 6c 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 52  lt, 0, sizeof(sR
5170: 65 73 75 6c 74 29 29 3b 0a 20 20 73 74 72 69 6e  esult));.  strin
5180: 67 52 65 73 65 74 28 26 73 52 65 73 75 6c 74 29  gReset(&sResult)
5190: 3b 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20  ;.  while( (c = 
51a0: 7a 53 63 72 69 70 74 5b 69 69 5d 29 21 3d 30 20  zScript[ii])!=0 
51b0: 29 7b 0a 20 20 20 20 70 72 65 76 4c 69 6e 65 20  ){.    prevLine 
51c0: 3d 20 6c 69 6e 65 6e 6f 3b 0a 20 20 20 20 6c 65  = lineno;.    le
51d0: 6e 20 3d 20 74 6f 6b 65 6e 4c 65 6e 67 74 68 28  n = tokenLength(
51e0: 7a 53 63 72 69 70 74 2b 69 69 2c 20 26 6c 69 6e  zScript+ii, &lin
51f0: 65 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 69 73  eno);.    if( is
5200: 73 70 61 63 65 28 63 29 20 7c 7c 20 28 63 3d 3d  space(c) || (c==
5210: 27 2f 27 20 26 26 20 7a 53 63 72 69 70 74 5b 69  '/' && zScript[i
5220: 69 2b 31 5d 3d 3d 27 2a 27 29 20 29 7b 0a 20 20  i+1]=='*') ){.  
5230: 20 20 20 20 69 69 20 2b 3d 20 6c 65 6e 3b 0a 20      ii += len;. 
5240: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
5250: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 21 3d     }.    if( c!=
5260: 27 2d 27 20 7c 7c 20 7a 53 63 72 69 70 74 5b 69  '-' || zScript[i
5270: 69 2b 31 5d 21 3d 27 2d 27 20 7c 7c 20 21 69 73  i+1]!='-' || !is
5280: 61 6c 70 68 61 28 7a 53 63 72 69 70 74 5b 69 69  alpha(zScript[ii
5290: 2b 32 5d 29 20 29 7b 0a 20 20 20 20 20 20 69 69  +2]) ){.      ii
52a0: 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 63   += len;.      c
52b0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a  ontinue;.    }..
52c0: 20 20 20 20 2f 2a 20 52 75 6e 20 61 6e 79 20 70      /* Run any p
52d0: 72 69 6f 72 20 53 51 4c 20 62 65 66 6f 72 65 20  rior SQL before 
52e0: 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65 20 6e  processing the n
52f0: 65 77 20 2d 2d 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  ew --command */.
5300: 20 20 20 20 69 66 28 20 69 69 3e 69 42 65 67 69      if( ii>iBegi
5310: 6e 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  n ){.      char 
5320: 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f  *zSql = sqlite3_
5330: 6d 70 72 69 6e 74 66 28 22 25 2e 2a 73 22 2c 20  mprintf("%.*s", 
5340: 69 69 2d 69 42 65 67 69 6e 2c 20 7a 53 63 72 69  ii-iBegin, zScri
5350: 70 74 2b 69 42 65 67 69 6e 29 3b 0a 20 20 20 20  pt+iBegin);.    
5360: 20 20 65 76 61 6c 53 71 6c 28 26 73 52 65 73 75    evalSql(&sResu
5370: 6c 74 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20  lt, zSql);.     
5380: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
5390: 71 6c 29 3b 0a 20 20 20 20 20 20 69 42 65 67 69  ql);.      iBegi
53a0: 6e 20 3d 20 69 69 20 2b 20 6c 65 6e 3b 0a 20 20  n = ii + len;.  
53b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 61 72 73    }..    /* Pars
53c0: 65 20 74 68 65 20 2d 2d 63 6f 6d 6d 61 6e 64 20  e the --command 
53d0: 2a 2f 0a 20 20 20 20 69 66 28 20 67 2e 69 54 72  */.    if( g.iTr
53e0: 61 63 65 3e 3d 32 20 29 20 6c 6f 67 4d 65 73 73  ace>=2 ) logMess
53f0: 61 67 65 28 22 25 2e 2a 73 22 2c 20 6c 65 6e 2c  age("%.*s", len,
5400: 20 7a 53 63 72 69 70 74 2b 69 69 29 3b 0a 20 20   zScript+ii);.  
5410: 20 20 6e 20 3d 20 65 78 74 72 61 63 74 54 6f 6b    n = extractTok
5420: 65 6e 28 7a 53 63 72 69 70 74 2b 69 69 2b 32 2c  en(zScript+ii+2,
5430: 20 6c 65 6e 2d 32 2c 20 7a 43 6d 64 2c 20 73 69   len-2, zCmd, si
5440: 7a 65 6f 66 28 7a 43 6d 64 29 29 3b 0a 20 20 20  zeof(zCmd));.   
5450: 20 66 6f 72 28 6e 41 72 67 3d 30 3b 20 6e 3c 6c   for(nArg=0; n<l
5460: 65 6e 2d 32 20 26 26 20 6e 41 72 67 3c 4d 58 5f  en-2 && nArg<MX_
5470: 41 52 47 3b 20 6e 41 72 67 2b 2b 29 7b 0a 20 20  ARG; nArg++){.  
5480: 20 20 20 20 77 68 69 6c 65 28 20 6e 3c 6c 65 6e      while( n<len
5490: 2d 32 20 26 26 20 69 73 73 70 61 63 65 28 7a 53  -2 && isspace(zS
54a0: 63 72 69 70 74 5b 69 69 2b 32 2b 6e 5d 29 20 29  cript[ii+2+n]) )
54b0: 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69  { n++; }.      i
54c0: 66 28 20 6e 3e 3d 6c 65 6e 2d 32 20 29 20 62 72  f( n>=len-2 ) br
54d0: 65 61 6b 3b 0a 20 20 20 20 20 20 6e 20 2b 3d 20  eak;.      n += 
54e0: 65 78 74 72 61 63 74 54 6f 6b 65 6e 28 7a 53 63  extractToken(zSc
54f0: 72 69 70 74 2b 69 69 2b 32 2b 6e 2c 20 6c 65 6e  ript+ii+2+n, len
5500: 2d 32 2d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  -2-n,.          
5510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a                az
5520: 41 72 67 5b 6e 41 72 67 5d 2c 20 73 69 7a 65 6f  Arg[nArg], sizeo
5530: 66 28 61 7a 41 72 67 5b 6e 41 72 67 5d 29 29 3b  f(azArg[nArg]));
5540: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a  .    }.    for(j
5550: 3d 6e 41 72 67 3b 20 6a 3c 4d 58 5f 41 52 47 3b  =nArg; j<MX_ARG;
5560: 20 6a 2b 2b 29 20 61 7a 41 72 67 5b 6a 2b 2b 5d   j++) azArg[j++]
5570: 5b 30 5d 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  [0] = 0;..    /*
5580: 0a 20 20 20 20 2a 2a 20 20 2d 2d 73 6c 65 65 70  .    **  --sleep
5590: 20 4e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a   N.    **.    **
55a0: 20 50 61 75 73 65 20 66 6f 72 20 4e 20 6d 69 6c   Pause for N mil
55b0: 6c 69 73 65 63 6f 6e 64 73 0a 20 20 20 20 2a 2f  liseconds.    */
55c0: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
55d0: 7a 43 6d 64 2c 20 22 73 6c 65 65 70 22 29 3d 3d  zCmd, "sleep")==
55e0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
55f0: 65 33 5f 73 6c 65 65 70 28 61 74 6f 69 28 61 7a  e3_sleep(atoi(az
5600: 41 72 67 5b 30 5d 29 29 3b 0a 20 20 20 20 7d 65  Arg[0]));.    }e
5610: 6c 73 65 20 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  lse ..    /*.   
5620: 20 2a 2a 20 20 20 2d 2d 65 78 69 74 20 4e 0a 20   **   --exit N. 
5630: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 69     **.    ** Exi
5640: 74 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 20  t this process. 
5650: 20 49 66 20 4e 3e 30 20 74 68 65 6e 20 65 78 69   If N>0 then exi
5660: 74 20 77 69 74 68 6f 75 74 20 73 68 75 74 74 69  t without shutti
5670: 6e 67 20 64 6f 77 6e 0a 20 20 20 20 2a 2a 20 53  ng down.    ** S
5680: 51 4c 69 74 65 2e 20 20 28 49 6e 20 6f 74 68 65  QLite.  (In othe
5690: 72 20 77 6f 72 64 73 2c 20 73 69 6d 75 6c 61 74  r words, simulat
56a0: 65 20 61 20 63 72 61 73 68 2e 29 0a 20 20 20 20  e a crash.).    
56b0: 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  */.    if( strcm
56c0: 70 28 7a 43 6d 64 2c 20 22 65 78 69 74 22 29 3d  p(zCmd, "exit")=
56d0: 3d 30 20 26 26 20 69 43 6c 69 65 6e 74 3e 30 20  =0 && iClient>0 
56e0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  ){.      int rc 
56f0: 3d 20 61 74 6f 69 28 61 7a 41 72 67 5b 30 5d 29  = atoi(azArg[0])
5700: 3b 0a 20 20 20 20 20 20 66 69 6e 69 73 68 53 63  ;.      finishSc
5710: 72 69 70 74 28 69 43 6c 69 65 6e 74 2c 20 74 61  ript(iClient, ta
5720: 73 6b 49 64 2c 20 31 29 3b 0a 20 20 20 20 20 20  skId, 1);.      
5730: 69 66 28 20 72 63 3d 3d 30 20 29 20 73 71 6c 69  if( rc==0 ) sqli
5740: 74 65 33 5f 63 6c 6f 73 65 28 67 2e 64 62 29 3b  te3_close(g.db);
5750: 0a 20 20 20 20 20 20 65 78 69 74 28 72 63 29 3b  .      exit(rc);
5760: 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20  .    }else..    
5770: 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 2d 2d 66 69  /*.    **   --fi
5780: 6e 69 73 68 0a 20 20 20 20 2a 2a 0a 20 20 20 20  nish.    **.    
5790: 2a 2a 20 4d 61 72 6b 20 74 68 65 20 63 75 72 72  ** Mark the curr
57a0: 65 6e 74 20 74 61 73 6b 20 61 73 20 68 61 76 69  ent task as havi
57b0: 6e 67 20 66 69 6e 69 73 68 65 64 2c 20 65 76 65  ng finished, eve
57c0: 6e 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 0a  n if it is not..
57d0: 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61 6e 20      ** This can 
57e0: 62 65 20 75 73 65 64 20 69 6e 20 63 6f 6e 6a 75  be used in conju
57f0: 6e 63 74 69 6f 6e 20 77 69 74 68 20 2d 2d 65 78  nction with --ex
5800: 69 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61  it to simulate a
5810: 20 63 72 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20   crash..    */. 
5820: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43     if( strcmp(zC
5830: 6d 64 2c 20 22 66 69 6e 69 73 68 22 29 3d 3d 30  md, "finish")==0
5840: 20 26 26 20 69 43 6c 69 65 6e 74 3e 30 20 29 7b   && iClient>0 ){
5850: 0a 20 20 20 20 20 20 66 69 6e 69 73 68 53 63 72  .      finishScr
5860: 69 70 74 28 69 43 6c 69 65 6e 74 2c 20 74 61 73  ipt(iClient, tas
5870: 6b 49 64 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c  kId, 1);.    }el
5880: 73 65 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  se..    /*.    *
5890: 2a 20 20 2d 2d 72 65 73 65 74 0a 20 20 20 20 2a  *  --reset.    *
58a0: 2a 0a 20 20 20 20 2a 2a 20 52 65 73 65 74 20 61  *.    ** Reset a
58b0: 63 63 75 6d 75 6c 61 74 65 64 20 72 65 73 75 6c  ccumulated resul
58c0: 74 73 20 62 61 63 6b 20 74 6f 20 61 6e 20 65 6d  ts back to an em
58d0: 70 74 79 20 73 74 72 69 6e 67 0a 20 20 20 20 2a  pty string.    *
58e0: 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  /.    if( strcmp
58f0: 28 7a 43 6d 64 2c 20 22 72 65 73 65 74 22 29 3d  (zCmd, "reset")=
5900: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 69  =0 ){.      stri
5910: 6e 67 52 65 73 65 74 28 26 73 52 65 73 75 6c 74  ngReset(&sResult
5920: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20  );.    }else..  
5930: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 2d 2d 6d    /*.    **  --m
5940: 61 74 63 68 20 41 4e 53 57 45 52 2e 2e 2e 0a 20  atch ANSWER.... 
5950: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 68 65     **.    ** Che
5960: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 6f 75 74  ck to see if out
5970: 70 75 74 20 6d 61 74 63 68 65 73 20 41 4e 53 57  put matches ANSW
5980: 45 52 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65  ER.  Report an e
5990: 72 72 6f 72 20 69 66 20 6e 6f 74 2e 0a 20 20 20  rror if not..   
59a0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63   */.    if( strc
59b0: 6d 70 28 7a 43 6d 64 2c 20 22 6d 61 74 63 68 22  mp(zCmd, "match"
59c0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
59d0: 74 20 6a 6a 3b 0a 20 20 20 20 20 20 63 68 61 72  t jj;.      char
59e0: 20 2a 7a 41 6e 73 20 3d 20 7a 53 63 72 69 70 74   *zAns = zScript
59f0: 2b 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  +ii;.      for(j
5a00: 6a 3d 37 3b 20 6a 6a 3c 6c 65 6e 2d 31 20 26 26  j=7; jj<len-1 &&
5a10: 20 69 73 73 70 61 63 65 28 7a 41 6e 73 5b 6a 6a   isspace(zAns[jj
5a20: 5d 29 3b 20 6a 6a 2b 2b 29 7b 7d 0a 20 20 20 20  ]); jj++){}.    
5a30: 20 20 7a 41 6e 73 20 2b 3d 20 6a 6a 3b 0a 20 20    zAns += jj;.  
5a40: 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
5a50: 73 52 65 73 75 6c 74 2e 7a 2c 20 7a 41 6e 73 2c  sResult.z, zAns,
5a60: 20 6c 65 6e 2d 6a 6a 2d 31 29 20 29 7b 0a 20 20   len-jj-1) ){.  
5a70: 20 20 20 20 20 20 65 72 72 6f 72 4d 65 73 73 61        errorMessa
5a80: 67 65 28 22 6c 69 6e 65 20 25 64 20 6f 66 20 25  ge("line %d of %
5a90: 73 3a 5c 6e 45 78 70 65 63 74 65 64 20 5b 25 2e  s:\nExpected [%.
5aa0: 2a 73 5d 5c 6e 20 20 20 20 20 47 6f 74 20 5b 25  *s]\n     Got [%
5ab0: 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  s]",.          p
5ac0: 72 65 76 4c 69 6e 65 2c 20 7a 46 69 6c 65 6e 61  revLine, zFilena
5ad0: 6d 65 2c 20 6c 65 6e 2d 6a 6a 2d 31 2c 20 7a 41  me, len-jj-1, zA
5ae0: 6e 73 2c 20 73 52 65 73 75 6c 74 2e 7a 29 3b 0a  ns, sResult.z);.
5af0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 2e        }.      g.
5b00: 6e 54 65 73 74 2b 2b 3b 0a 20 20 20 20 20 20 73  nTest++;.      s
5b10: 74 72 69 6e 67 52 65 73 65 74 28 26 73 52 65 73  tringReset(&sRes
5b20: 75 6c 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  ult);.    }else.
5b30: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
5b40: 2d 2d 6f 75 74 70 75 74 0a 20 20 20 20 2a 2a 0a  --output.    **.
5b50: 20 20 20 20 2a 2a 20 4f 75 74 70 75 74 20 74 68      ** Output th
5b60: 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20  e result of the 
5b70: 70 72 65 76 69 6f 75 73 20 53 51 4c 2e 0a 20 20  previous SQL..  
5b80: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72    */.    if( str
5b90: 63 6d 70 28 7a 43 6d 64 2c 20 22 6f 75 74 70 75  cmp(zCmd, "outpu
5ba0: 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
5bb0: 6c 6f 67 4d 65 73 73 61 67 65 28 22 25 73 22 2c  logMessage("%s",
5bc0: 20 73 52 65 73 75 6c 74 2e 7a 29 3b 0a 20 20 20   sResult.z);.   
5bd0: 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a 20   }else..    /*. 
5be0: 20 20 20 2a 2a 20 20 2d 2d 73 6f 75 72 63 65 20     **  --source 
5bf0: 46 49 4c 45 4e 41 4d 45 0a 20 20 20 20 2a 2a 0a  FILENAME.    **.
5c00: 20 20 20 20 2a 2a 20 52 75 6e 20 61 20 73 75 62      ** Run a sub
5c10: 73 63 72 69 70 74 20 66 72 6f 6d 20 61 20 73 65  script from a se
5c20: 70 61 72 61 74 65 20 66 69 6c 65 2e 0a 20 20 20  parate file..   
5c30: 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63   */.    if( strc
5c40: 6d 70 28 7a 43 6d 64 2c 20 22 73 6f 75 72 63 65  mp(zCmd, "source
5c50: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  ")==0 ){.      c
5c60: 68 61 72 20 2a 7a 4e 65 77 46 69 6c 65 2c 20 2a  har *zNewFile, *
5c70: 7a 4e 65 77 53 63 72 69 70 74 3b 0a 20 20 20 20  zNewScript;.    
5c80: 20 20 63 68 61 72 20 2a 7a 54 6f 44 65 6c 20 3d    char *zToDel =
5c90: 20 30 3b 0a 20 20 20 20 20 20 7a 4e 65 77 46 69   0;.      zNewFi
5ca0: 6c 65 20 3d 20 61 7a 41 72 67 5b 30 5d 3b 0a 20  le = azArg[0];. 
5cb0: 20 20 20 20 20 69 66 28 20 7a 4e 65 77 46 69 6c       if( zNewFil
5cc0: 65 5b 30 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20  e[0]!='/' ){.   
5cd0: 20 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20       int k;.    
5ce0: 20 20 20 20 66 6f 72 28 6b 3d 28 69 6e 74 29 73      for(k=(int)s
5cf0: 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29  trlen(zFilename)
5d00: 2d 31 3b 20 6b 3e 3d 30 20 26 26 20 7a 46 69 6c  -1; k>=0 && zFil
5d10: 65 6e 61 6d 65 5b 6b 5d 21 3d 27 2f 27 3b 20 6b  ename[k]!='/'; k
5d20: 2d 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66  --){}.        if
5d30: 28 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ( k>0 ){.       
5d40: 20 20 20 7a 4e 65 77 46 69 6c 65 20 3d 20 7a 54     zNewFile = zT
5d50: 6f 44 65 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  oDel = sqlite3_m
5d60: 70 72 69 6e 74 66 28 22 25 2e 2a 73 2f 25 73 22  printf("%.*s/%s"
5d70: 2c 20 6b 2c 7a 46 69 6c 65 6e 61 6d 65 2c 7a 4e  , k,zFilename,zN
5d80: 65 77 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  ewFile);.       
5d90: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
5da0: 20 7a 4e 65 77 53 63 72 69 70 74 20 3d 20 72 65   zNewScript = re
5db0: 61 64 46 69 6c 65 28 7a 4e 65 77 46 69 6c 65 29  adFile(zNewFile)
5dc0: 3b 0a 20 20 20 20 20 20 69 66 28 20 67 2e 69 54  ;.      if( g.iT
5dd0: 72 61 63 65 20 29 20 6c 6f 67 4d 65 73 73 61 67  race ) logMessag
5de0: 65 28 22 62 65 67 69 6e 20 73 63 72 69 70 74 20  e("begin script 
5df0: 5b 25 73 5d 5c 6e 22 2c 20 7a 4e 65 77 46 69 6c  [%s]\n", zNewFil
5e00: 65 29 3b 0a 20 20 20 20 20 20 72 75 6e 53 63 72  e);.      runScr
5e10: 69 70 74 28 30 2c 20 30 2c 20 7a 4e 65 77 53 63  ipt(0, 0, zNewSc
5e20: 72 69 70 74 2c 20 7a 4e 65 77 46 69 6c 65 29 3b  ript, zNewFile);
5e30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
5e40: 72 65 65 28 7a 4e 65 77 53 63 72 69 70 74 29 3b  ree(zNewScript);
5e50: 0a 20 20 20 20 20 20 69 66 28 20 67 2e 69 54 72  .      if( g.iTr
5e60: 61 63 65 20 29 20 6c 6f 67 4d 65 73 73 61 67 65  ace ) logMessage
5e70: 28 22 65 6e 64 20 73 63 72 69 70 74 20 5b 25 73  ("end script [%s
5e80: 5d 5c 6e 22 2c 20 7a 4e 65 77 46 69 6c 65 29 3b  ]\n", zNewFile);
5e90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
5ea0: 72 65 65 28 7a 54 6f 44 65 6c 29 3b 0a 20 20 20  ree(zToDel);.   
5eb0: 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a 20   }else..    /*. 
5ec0: 20 20 20 2a 2a 20 20 2d 2d 70 72 69 6e 74 20 4d     **  --print M
5ed0: 45 53 53 41 47 45 2e 2e 2e 2e 0a 20 20 20 20 2a  ESSAGE.....    *
5ee0: 2a 0a 20 20 20 20 2a 2a 20 4f 75 74 70 75 74 20  *.    ** Output 
5ef0: 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66  the remainder of
5f00: 20 74 68 65 20 6c 69 6e 65 20 74 6f 20 74 68 65   the line to the
5f10: 20 6c 6f 67 20 66 69 6c 65 0a 20 20 20 20 2a 2f   log file.    */
5f20: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
5f30: 7a 43 6d 64 2c 20 22 70 72 69 6e 74 22 29 3d 3d  zCmd, "print")==
5f40: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a  0 ){.      int j
5f50: 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d  j;.      for(jj=
5f60: 37 3b 20 6a 6a 3c 6c 65 6e 20 26 26 20 69 73 73  7; jj<len && iss
5f70: 70 61 63 65 28 7a 53 63 72 69 70 74 5b 69 69 2b  pace(zScript[ii+
5f80: 6a 6a 5d 29 3b 20 6a 6a 2b 2b 29 7b 7d 0a 20 20  jj]); jj++){}.  
5f90: 20 20 20 20 6c 6f 67 4d 65 73 73 61 67 65 28 22      logMessage("
5fa0: 25 2e 2a 73 22 2c 20 6c 65 6e 2d 6a 6a 2c 20 7a  %.*s", len-jj, z
5fb0: 53 63 72 69 70 74 2b 69 69 2b 6a 6a 29 3b 0a 20  Script+ii+jj);. 
5fc0: 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a     }else..    /*
5fd0: 0a 20 20 20 20 2a 2a 20 20 2d 2d 69 66 20 45 58  .    **  --if EX
5fe0: 50 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  PR.    **.    **
5ff0: 20 53 6b 69 70 20 66 6f 72 77 61 72 64 20 74 6f   Skip forward to
6000: 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69   the next matchi
6010: 6e 67 20 2d 2d 65 6e 64 69 66 20 6f 72 20 2d 2d  ng --endif or --
6020: 65 6c 73 65 20 69 66 20 45 58 50 52 20 69 73 20  else if EXPR is 
6030: 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  false..    */.  
6040: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d    if( strcmp(zCm
6050: 64 2c 20 22 69 66 22 29 3d 3d 30 20 29 7b 0a 20  d, "if")==0 ){. 
6060: 20 20 20 20 20 69 6e 74 20 6a 6a 2c 20 72 63 3b       int jj, rc;
6070: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
6080: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20  tmt *pStmt;.    
6090: 20 20 66 6f 72 28 6a 6a 3d 34 3b 20 6a 6a 3c 6c    for(jj=4; jj<l
60a0: 65 6e 20 26 26 20 69 73 73 70 61 63 65 28 7a 53  en && isspace(zS
60b0: 63 72 69 70 74 5b 69 69 2b 6a 6a 5d 29 3b 20 6a  cript[ii+jj]); j
60c0: 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 70 53 74  j++){}.      pSt
60d0: 6d 74 20 3d 20 70 72 65 70 61 72 65 53 71 6c 28  mt = prepareSql(
60e0: 22 53 45 4c 45 43 54 20 25 2e 2a 73 22 2c 20 6c  "SELECT %.*s", l
60f0: 65 6e 2d 6a 6a 2c 20 7a 53 63 72 69 70 74 2b 69  en-jj, zScript+i
6100: 69 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 72 63 20  i+jj);.      rc 
6110: 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
6120: 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Stmt);.      if(
6130: 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20   rc!=SQLITE_ROW 
6140: 7c 7c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  || sqlite3_colum
6150: 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3d  n_int(pStmt, 0)=
6160: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 69  =0 ){.        ii
6170: 20 2b 3d 20 66 69 6e 64 45 6e 64 69 66 28 7a 53   += findEndif(zS
6180: 63 72 69 70 74 2b 69 69 2b 6c 65 6e 2c 20 31 2c  cript+ii+len, 1,
6190: 20 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20   &lineno);.     
61a0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
61b0: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
61c0: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20  ;.    }else..   
61d0: 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 2d 2d 65 6c   /*.    **  --el
61e0: 73 65 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  se.    **.    **
61f0: 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63 61   This command ca
6200: 6e 20 6f 6e 6c 79 20 62 65 20 65 6e 63 6f 75 6e  n only be encoun
6210: 74 65 72 65 64 20 69 66 20 63 75 72 72 65 6e 74  tered if current
6220: 6c 79 20 69 6e 73 69 64 65 20 61 6e 20 2d 2d 69  ly inside an --i
6230: 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73  f that.    ** is
6240: 20 74 72 75 65 2e 20 20 53 6b 69 70 20 66 6f 72   true.  Skip for
6250: 77 61 72 64 20 74 6f 20 74 68 65 20 6e 65 78 74  ward to the next
6260: 20 6d 61 74 63 68 69 6e 67 20 2d 2d 65 6e 64 69   matching --endi
6270: 66 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  f..    */.    if
6280: 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22  ( strcmp(zCmd, "
6290: 65 6c 73 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  else")==0 ){.   
62a0: 20 20 20 69 69 20 2b 3d 20 66 69 6e 64 45 6e 64     ii += findEnd
62b0: 69 66 28 7a 53 63 72 69 70 74 2b 69 69 2b 6c 65  if(zScript+ii+le
62c0: 6e 2c 20 30 2c 20 26 6c 69 6e 65 6e 6f 29 3b 0a  n, 0, &lineno);.
62d0: 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f      }else..    /
62e0: 2a 0a 20 20 20 20 2a 2a 20 20 2d 2d 65 6e 64 69  *.    **  --endi
62f0: 66 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  f.    **.    ** 
6300: 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63 61 6e  This command can
6310: 20 6f 6e 6c 79 20 62 65 20 65 6e 63 6f 75 6e 74   only be encount
6320: 65 72 65 64 20 69 66 20 63 75 72 72 65 6e 74 6c  ered if currentl
6330: 79 20 69 6e 73 69 64 65 20 61 6e 20 2d 2d 69 66  y inside an --if
6340: 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20   that.    ** is 
6350: 74 72 75 65 20 6f 72 20 61 6e 20 2d 2d 65 6c 73  true or an --els
6360: 65 20 6f 66 20 61 20 66 61 6c 73 65 20 69 66 2e  e of a false if.
6370: 20 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f    This is a no-o
6380: 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  p..    */.    if
6390: 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22  ( strcmp(zCmd, "
63a0: 65 6e 64 69 66 22 29 3d 3d 30 20 29 7b 0a 20 20  endif")==0 ){.  
63b0: 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a      /* no-op */.
63c0: 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f      }else..    /
63d0: 2a 0a 20 20 20 20 2a 2a 20 20 2d 2d 73 74 61 72  *.    **  --star
63e0: 74 20 43 4c 49 45 4e 54 0a 20 20 20 20 2a 2a 0a  t CLIENT.    **.
63f0: 20 20 20 20 2a 2a 20 53 74 61 72 74 20 75 70 20      ** Start up 
6400: 74 68 65 20 67 69 76 65 6e 20 63 6c 69 65 6e 74  the given client
6410: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
6420: 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 73   strcmp(zCmd, "s
6430: 74 61 72 74 22 29 3d 3d 30 20 26 26 20 69 43 6c  tart")==0 && iCl
6440: 69 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ient==0 ){.     
6450: 20 69 6e 74 20 69 4e 65 77 43 6c 69 65 6e 74 20   int iNewClient 
6460: 3d 20 61 74 6f 69 28 61 7a 41 72 67 5b 30 5d 29  = atoi(azArg[0])
6470: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4e 65 77  ;.      if( iNew
6480: 43 6c 69 65 6e 74 3e 30 20 29 7b 0a 20 20 20 20  Client>0 ){.    
6490: 20 20 20 20 73 74 61 72 74 43 6c 69 65 6e 74 28      startClient(
64a0: 69 4e 65 77 43 6c 69 65 6e 74 29 3b 0a 20 20 20  iNewClient);.   
64b0: 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a     }.    }else..
64c0: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 2d      /*.    **  -
64d0: 2d 77 61 69 74 20 43 4c 49 45 4e 54 20 54 49 4d  -wait CLIENT TIM
64e0: 45 4f 55 54 0a 20 20 20 20 2a 2a 0a 20 20 20 20  EOUT.    **.    
64f0: 2a 2a 20 57 61 69 74 20 75 6e 74 69 6c 20 61 6c  ** Wait until al
6500: 6c 20 74 61 73 6b 73 20 63 6f 6d 70 6c 65 74 65  l tasks complete
6510: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63   for the given c
6520: 6c 69 65 6e 74 2e 20 20 49 66 20 43 4c 49 45 4e  lient.  If CLIEN
6530: 54 20 69 73 0a 20 20 20 20 2a 2a 20 22 61 6c 6c  T is.    ** "all
6540: 22 20 74 68 65 6e 20 77 61 69 74 20 66 6f 72 20  " then wait for 
6550: 61 6c 6c 20 63 6c 69 65 6e 74 73 20 74 6f 20 63  all clients to c
6560: 6f 6d 70 6c 65 74 65 2e 20 20 57 61 69 74 20 6e  omplete.  Wait n
6570: 6f 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 20 20  o longer than.  
6580: 20 20 2a 2a 20 54 49 4d 45 4f 55 54 20 6d 69 6c    ** TIMEOUT mil
6590: 6c 69 73 65 63 6f 6e 64 73 20 28 64 65 66 61 75  liseconds (defau
65a0: 6c 74 20 31 30 2c 30 30 30 29 0a 20 20 20 20 2a  lt 10,000).    *
65b0: 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  /.    if( strcmp
65c0: 28 7a 43 6d 64 2c 20 22 77 61 69 74 22 29 3d 3d  (zCmd, "wait")==
65d0: 30 20 26 26 20 69 43 6c 69 65 6e 74 3d 3d 30 20  0 && iClient==0 
65e0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 69  ){.      int iTi
65f0: 6d 65 6f 75 74 20 3d 20 6e 41 72 67 3e 3d 32 20  meout = nArg>=2 
6600: 3f 20 61 74 6f 69 28 61 7a 41 72 67 5b 31 5d 29  ? atoi(azArg[1])
6610: 20 3a 20 31 30 30 30 30 3b 0a 20 20 20 20 20 20   : 10000;.      
6620: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
6630: 28 73 69 7a 65 6f 66 28 7a 45 72 72 6f 72 29 2c  (sizeof(zError),
6640: 7a 45 72 72 6f 72 2c 22 6c 69 6e 65 20 25 64 20  zError,"line %d 
6650: 6f 66 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  of %s\n",.      
6660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6670: 20 70 72 65 76 4c 69 6e 65 2c 20 7a 46 69 6c 65   prevLine, zFile
6680: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 77 61 69  name);.      wai
6690: 74 46 6f 72 43 6c 69 65 6e 74 28 61 74 6f 69 28  tForClient(atoi(
66a0: 61 7a 41 72 67 5b 30 5d 29 2c 20 69 54 69 6d 65  azArg[0]), iTime
66b0: 6f 75 74 2c 20 7a 45 72 72 6f 72 29 3b 0a 20 20  out, zError);.  
66c0: 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a    }else..    /*.
66d0: 20 20 20 20 2a 2a 20 20 2d 2d 74 61 73 6b 20 43      **  --task C
66e0: 4c 49 45 4e 54 0a 20 20 20 20 2a 2a 20 20 20 20  LIENT.    **    
66f0: 20 3c 74 61 73 6b 2d 63 6f 6e 74 65 6e 74 2d 68   <task-content-h
6700: 65 72 65 3e 0a 20 20 20 20 2a 2a 20 20 2d 2d 65  ere>.    **  --e
6710: 6e 64 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  nd.    **.    **
6720: 20 41 73 73 69 67 6e 20 77 6f 72 6b 20 74 6f 20   Assign work to 
6730: 61 20 63 6c 69 65 6e 74 2e 20 20 53 74 61 72 74  a client.  Start
6740: 20 74 68 65 20 63 6c 69 65 6e 74 20 69 66 20 69   the client if i
6750: 74 20 69 73 20 6e 6f 74 20 72 75 6e 6e 69 6e 67  t is not running
6760: 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e  .    ** already.
6770: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
6780: 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 74 61  strcmp(zCmd, "ta
6790: 73 6b 22 29 3d 3d 30 20 26 26 20 69 43 6c 69 65  sk")==0 && iClie
67a0: 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  nt==0 ){.      i
67b0: 6e 74 20 69 54 61 72 67 65 74 20 3d 20 61 74 6f  nt iTarget = ato
67c0: 69 28 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20  i(azArg[0]);.   
67d0: 20 20 20 69 6e 74 20 69 45 6e 64 3b 0a 20 20 20     int iEnd;.   
67e0: 20 20 20 63 68 61 72 20 2a 7a 54 61 73 6b 3b 0a     char *zTask;.
67f0: 20 20 20 20 20 20 69 45 6e 64 20 3d 20 66 69 6e        iEnd = fin
6800: 64 45 6e 64 28 7a 53 63 72 69 70 74 2b 69 69 2b  dEnd(zScript+ii+
6810: 6c 65 6e 2c 20 26 6c 69 6e 65 6e 6f 29 3b 0a 20  len, &lineno);. 
6820: 20 20 20 20 20 69 66 28 20 69 54 61 72 67 65 74       if( iTarget
6830: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72  <0 ){.        er
6840: 72 6f 72 4d 65 73 73 61 67 65 28 22 6c 69 6e 65  rorMessage("line
6850: 20 25 64 20 6f 66 20 25 73 3a 20 62 61 64 20 63   %d of %s: bad c
6860: 6c 69 65 6e 74 20 6e 75 6d 62 65 72 3a 20 25 64  lient number: %d
6870: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
6880: 20 20 20 20 20 20 20 20 70 72 65 76 4c 69 6e 65          prevLine
6890: 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 54 61  , zFilename, iTa
68a0: 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  rget);.      }el
68b0: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 61 73  se{.        zTas
68c0: 6b 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  k = sqlite3_mpri
68d0: 6e 74 66 28 22 25 2e 2a 73 22 2c 20 69 45 6e 64  ntf("%.*s", iEnd
68e0: 2c 20 7a 53 63 72 69 70 74 2b 69 69 2b 6c 65 6e  , zScript+ii+len
68f0: 29 3b 0a 20 20 20 20 20 20 20 20 73 74 61 72 74  );.        start
6900: 43 6c 69 65 6e 74 28 69 54 61 72 67 65 74 29 3b  Client(iTarget);
6910: 0a 20 20 20 20 20 20 20 20 72 75 6e 53 71 6c 28  .        runSql(
6920: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 61 73  "INSERT INTO tas
6930: 6b 28 63 6c 69 65 6e 74 2c 73 63 72 69 70 74 29  k(client,script)
6940: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
6950: 20 22 20 56 41 4c 55 45 53 28 25 64 2c 27 25 71   " VALUES(%d,'%q
6960: 27 29 22 2c 20 69 54 61 72 67 65 74 2c 20 7a 54  ')", iTarget, zT
6970: 61 73 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ask);.        sq
6980: 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 61 73 6b  lite3_free(zTask
6990: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
69a0: 20 69 45 6e 64 20 2b 3d 20 74 6f 6b 65 6e 4c 65   iEnd += tokenLe
69b0: 6e 67 74 68 28 7a 53 63 72 69 70 74 2b 69 69 2b  ngth(zScript+ii+
69c0: 6c 65 6e 2b 69 45 6e 64 2c 20 26 6c 69 6e 65 6e  len+iEnd, &linen
69d0: 6f 29 3b 0a 20 20 20 20 20 20 6c 65 6e 20 2b 3d  o);.      len +=
69e0: 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 69 42 65   iEnd;.      iBe
69f0: 67 69 6e 20 3d 20 69 69 2b 6c 65 6e 3b 0a 20 20  gin = ii+len;.  
6a00: 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20    }else..    /* 
6a10: 65 72 72 6f 72 20 2a 2f 7b 0a 20 20 20 20 20 20  error */{.      
6a20: 65 72 72 6f 72 4d 65 73 73 61 67 65 28 22 6c 69  errorMessage("li
6a30: 6e 65 20 25 64 20 6f 66 20 25 73 3a 20 75 6e 6b  ne %d of %s: unk
6a40: 6e 6f 77 6e 20 63 6f 6d 6d 61 6e 64 20 2d 2d 25  nown command --%
6a50: 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  s",.            
6a60: 20 20 20 20 20 20 20 70 72 65 76 4c 69 6e 65 2c         prevLine,
6a70: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 43 6d 64   zFilename, zCmd
6a80: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 69 20  );.    }.    ii 
6a90: 2b 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 69 66  += len;.  }.  if
6aa0: 28 20 69 42 65 67 69 6e 3c 69 69 20 29 7b 0a 20  ( iBegin<ii ){. 
6ab0: 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20     char *zSql = 
6ac0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
6ad0: 22 25 2e 2a 73 22 2c 20 69 69 2d 69 42 65 67 69  "%.*s", ii-iBegi
6ae0: 6e 2c 20 7a 53 63 72 69 70 74 2b 69 42 65 67 69  n, zScript+iBegi
6af0: 6e 29 3b 0a 20 20 20 20 72 75 6e 53 71 6c 28 7a  n);.    runSql(z
6b00: 53 71 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Sql);.    sqlite
6b10: 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
6b20: 7d 0a 20 20 73 74 72 69 6e 67 46 72 65 65 28 26  }.  stringFree(&
6b30: 73 52 65 73 75 6c 74 29 3b 0a 7d 0a 0a 2f 2a 0a  sResult);.}../*.
6b40: 2a 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 20 63 6f  ** Look for a co
6b50: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f  mmand-line optio
6b60: 6e 2e 20 20 49 66 20 70 72 65 73 65 6e 74 2c 20  n.  If present, 
6b70: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
6b80: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c  ..** Return NULL
6b90: 20 69 66 20 6d 69 73 73 69 6e 67 2e 0a 2a 2a 0a   if missing..**.
6ba0: 2a 2a 20 68 61 73 41 72 67 3d 3d 30 20 6d 65 61  ** hasArg==0 mea
6bb0: 6e 73 20 74 68 65 20 6f 70 74 69 6f 6e 20 69 73  ns the option is
6bc0: 20 61 20 66 6c 61 67 2e 20 20 49 74 20 69 73 20   a flag.  It is 
6bd0: 65 69 74 68 65 72 20 70 72 65 73 65 6e 74 20 6f  either present o
6be0: 72 20 6e 6f 74 2e 0a 2a 2a 20 68 61 73 41 72 67  r not..** hasArg
6bf0: 3d 3d 31 20 6d 65 61 6e 73 20 74 68 65 20 6f 70  ==1 means the op
6c00: 74 69 6f 6e 20 68 61 73 20 61 6e 20 61 72 67 75  tion has an argu
6c10: 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20  ment.  Return a 
6c20: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a  pointer to the.*
6c30: 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  * argument..*/.s
6c40: 74 61 74 69 63 20 63 68 61 72 20 2a 66 69 6e 64  tatic char *find
6c50: 4f 70 74 69 6f 6e 28 0a 20 20 63 68 61 72 20 2a  Option(.  char *
6c60: 2a 61 7a 41 72 67 2c 0a 20 20 69 6e 74 20 2a 70  *azArg,.  int *p
6c70: 6e 41 72 67 2c 0a 20 20 63 6f 6e 73 74 20 63 68  nArg,.  const ch
6c80: 61 72 20 2a 7a 4f 70 74 69 6f 6e 2c 0a 20 20 69  ar *zOption,.  i
6c90: 6e 74 20 68 61 73 41 72 67 0a 29 7b 0a 20 20 69  nt hasArg.){.  i
6ca0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20  nt i, j;.  char 
6cb0: 2a 7a 52 65 74 75 72 6e 20 3d 20 30 3b 0a 20 20  *zReturn = 0;.  
6cc0: 69 6e 74 20 6e 41 72 67 20 3d 20 2a 70 6e 41 72  int nArg = *pnAr
6cd0: 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 68 61  g;..  assert( ha
6ce0: 73 41 72 67 3d 3d 30 20 7c 7c 20 68 61 73 41 72  sArg==0 || hasAr
6cf0: 67 3d 3d 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d  g==1 );.  for(i=
6d00: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
6d10: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
6d20: 2a 7a 3b 0a 20 20 20 20 69 66 28 20 69 2b 68 61  *z;.    if( i+ha
6d30: 73 41 72 67 20 3e 3d 20 6e 41 72 67 20 29 20 62  sArg >= nArg ) b
6d40: 72 65 61 6b 3b 0a 20 20 20 20 7a 20 3d 20 61 7a  reak;.    z = az
6d50: 41 72 67 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  Arg[i];.    if( 
6d60: 7a 5b 30 5d 21 3d 27 2d 27 20 29 20 63 6f 6e 74  z[0]!='-' ) cont
6d70: 69 6e 75 65 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20  inue;.    z++;. 
6d80: 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27     if( z[0]=='-'
6d90: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b   ){.      if( z[
6da0: 31 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  1]==0 ) break;. 
6db0: 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a       z++;.    }.
6dc0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
6dd0: 2c 7a 4f 70 74 69 6f 6e 29 3d 3d 30 20 29 7b 0a  ,zOption)==0 ){.
6de0: 20 20 20 20 20 20 69 66 28 20 68 61 73 41 72 67        if( hasArg
6df0: 20 26 26 20 69 3d 3d 6e 41 72 67 2d 31 20 29 7b   && i==nArg-1 ){
6e00: 0a 20 20 20 20 20 20 20 20 66 61 74 61 6c 45 72  .        fatalEr
6e10: 72 6f 72 28 22 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  ror("command-lin
6e20: 65 20 6f 70 74 69 6f 6e 20 5c 22 2d 2d 25 73 5c  e option \"--%s\
6e30: 22 20 72 65 71 75 69 72 65 73 20 61 6e 20 61 72  " requires an ar
6e40: 67 75 6d 65 6e 74 22 2c 20 7a 29 3b 0a 20 20 20  gument", z);.   
6e50: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 68     }.      if( h
6e60: 61 73 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20  asArg ){.       
6e70: 20 7a 52 65 74 75 72 6e 20 3d 20 61 7a 41 72 67   zReturn = azArg
6e80: 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c  [i+1];.      }el
6e90: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74  se{.        zRet
6ea0: 75 72 6e 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a  urn = azArg[i];.
6eb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 20        }.      j 
6ec0: 3d 20 69 2b 31 2b 28 68 61 73 41 72 67 21 3d 30  = i+1+(hasArg!=0
6ed0: 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  );.      while( 
6ee0: 6a 3c 6e 41 72 67 20 29 20 61 7a 41 72 67 5b 69  j<nArg ) azArg[i
6ef0: 2b 2b 5d 20 3d 20 61 7a 41 72 67 5b 6a 2b 2b 5d  ++] = azArg[j++]
6f00: 3b 0a 20 20 20 20 20 20 2a 70 6e 41 72 67 20 3d  ;.      *pnArg =
6f10: 20 69 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   i;.      return
6f20: 20 7a 52 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a   zReturn;.    }.
6f30: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65    }.  return zRe
6f40: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e  turn;.}../* Prin
6f50: 74 20 61 20 75 73 61 67 65 20 6d 65 73 73 61 67  t a usage messag
6f60: 65 20 66 6f 72 20 74 68 65 20 70 72 6f 67 72 61  e for the progra
6f70: 6d 20 61 6e 64 20 65 78 69 74 20 2a 2f 0a 73 74  m and exit */.st
6f80: 61 74 69 63 20 76 6f 69 64 20 75 73 61 67 65 28  atic void usage(
6f90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 72 67 76  const char *argv
6fa0: 30 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  0){.  int i;.  c
6fb0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c  onst char *zTail
6fc0: 20 3d 20 61 72 67 76 30 3b 0a 20 20 66 6f 72 28   = argv0;.  for(
6fd0: 69 3d 30 3b 20 61 72 67 76 30 5b 69 5d 3b 20 69  i=0; argv0[i]; i
6fe0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 72 67  ++){.    if( arg
6ff0: 76 30 5b 69 5d 3d 3d 27 2f 27 20 29 20 7a 54 61  v0[i]=='/' ) zTa
7000: 69 6c 20 3d 20 61 72 67 76 30 2b 69 2b 31 3b 0a  il = argv0+i+1;.
7010: 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 73 74    }.  fprintf(st
7020: 64 65 72 72 2c 22 55 73 61 67 65 3a 20 25 73 20  derr,"Usage: %s 
7030: 44 41 54 41 42 41 53 45 20 3f 4f 50 54 49 4f 4e  DATABASE ?OPTION
7040: 53 3f 20 3f 53 43 52 49 50 54 3f 5c 6e 22 2c 20  S? ?SCRIPT?\n", 
7050: 7a 54 61 69 6c 29 3b 0a 20 20 65 78 69 74 28 31  zTail);.  exit(1
7060: 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 70 6f 72 74 20  );.}../* Report 
7070: 6f 6e 20 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20  on unrecognized 
7080: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 73 74 61  arguments */.sta
7090: 74 69 63 20 76 6f 69 64 20 75 6e 72 65 63 6f 67  tic void unrecog
70a0: 6e 69 7a 65 64 41 72 67 75 6d 65 6e 74 73 28 0a  nizedArguments(.
70b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 72    const char *ar
70c0: 67 76 30 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  gv0,.  int nArg,
70d0: 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 0a  .  char **azArg.
70e0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 70  ){.  int i;.  fp
70f0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73  rintf(stderr,"%s
7100: 3a 20 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 61  : unrecognized a
7110: 72 67 75 6d 65 6e 74 73 3a 22 2c 20 61 72 67 76  rguments:", argv
7120: 30 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  0);.  for(i=0; i
7130: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
7140: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
7150: 22 20 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29  " %s", azArg[i])
7160: 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28  ;.  }.  fprintf(
7170: 73 74 64 65 72 72 2c 22 5c 6e 22 29 3b 0a 20 20  stderr,"\n");.  
7180: 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 69 6e 74 20  exit(1);.}..int 
7190: 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63  main(int argc, c
71a0: 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63  har **argv){.  c
71b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6c 69 65  onst char *zClie
71c0: 6e 74 3b 0a 20 20 69 6e 74 20 69 43 6c 69 65 6e  nt;.  int iClien
71d0: 74 3b 0a 20 20 69 6e 74 20 6e 2c 20 69 3b 0a 20  t;.  int n, i;. 
71e0: 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d   int openFlags =
71f0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
7200: 44 57 52 49 54 45 3b 0a 20 20 69 6e 74 20 72 63  DWRITE;.  int rc
7210: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 63 72 69 70  ;.  char *zScrip
7220: 74 3b 0a 20 20 69 6e 74 20 74 61 73 6b 49 64 3b  t;.  int taskId;
7230: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7240: 54 72 61 63 65 3b 0a 20 20 63 6f 6e 73 74 20 63  Trace;.  const c
7250: 68 61 72 20 2a 7a 43 4f 70 74 69 6f 6e 3b 0a 0a  har *zCOption;..
7260: 20 20 67 2e 61 72 67 76 30 20 3d 20 61 72 67 76    g.argv0 = argv
7270: 5b 30 5d 3b 0a 20 20 67 2e 69 54 72 61 63 65 20  [0];.  g.iTrace 
7280: 3d 20 31 3b 0a 20 20 69 66 28 20 61 72 67 63 3c  = 1;.  if( argc<
7290: 32 20 29 20 75 73 61 67 65 28 61 72 67 76 5b 30  2 ) usage(argv[0
72a0: 5d 29 3b 0a 20 20 67 2e 7a 44 62 46 69 6c 65 20  ]);.  g.zDbFile 
72b0: 3d 20 61 72 67 76 5b 31 5d 3b 0a 20 20 69 66 28  = argv[1];.  if(
72c0: 20 73 74 72 67 6c 6f 62 28 22 2a 2e 74 65 73 74   strglob("*.test
72d0: 22 2c 20 67 2e 7a 44 62 46 69 6c 65 29 20 29 20  ", g.zDbFile) ) 
72e0: 75 73 61 67 65 28 61 72 67 76 5b 30 5d 29 3b 0a  usage(argv[0]);.
72f0: 20 20 69 66 28 20 73 74 72 63 6d 70 28 73 71 6c    if( strcmp(sql
7300: 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 2c  ite3_sourceid(),
7310: 20 53 51 4c 49 54 45 5f 53 4f 55 52 43 45 5f 49   SQLITE_SOURCE_I
7320: 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 70 72  D)!=0 ){.    fpr
7330: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 51  intf(stderr, "SQ
7340: 4c 69 74 65 20 6c 69 62 72 61 72 79 20 61 6e 64  Lite library and
7350: 20 68 65 61 64 65 72 20 6d 69 73 6d 61 74 63 68   header mismatch
7360: 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  \n".            
7370: 20 20 20 20 20 20 20 20 22 4c 69 62 72 61 72 79          "Library
7380: 3a 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 20 20  : %s\n".        
7390: 20 20 20 20 20 20 20 20 20 20 20 20 22 48 65 61              "Hea
73a0: 64 65 72 3a 20 20 25 73 5c 6e 22 2c 0a 20 20 20  der:  %s\n",.   
73b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73c0: 20 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69   sqlite3_sourcei
73d0: 64 28 29 2c 20 53 51 4c 49 54 45 5f 53 4f 55 52  d(), SQLITE_SOUR
73e0: 43 45 5f 49 44 29 3b 0a 20 20 20 20 65 78 69 74  CE_ID);.    exit
73f0: 28 31 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 61  (1);.  }.  n = a
7400: 72 67 63 2d 32 3b 0a 20 20 73 71 6c 69 74 65 33  rgc-2;.  sqlite3
7410: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
7420: 28 67 2e 7a 4e 61 6d 65 29 2c 20 67 2e 7a 4e 61  (g.zName), g.zNa
7430: 6d 65 2c 20 22 6d 70 74 65 73 74 22 29 3b 0a 20  me, "mptest");. 
7440: 20 67 2e 7a 56 66 73 20 3d 20 66 69 6e 64 4f 70   g.zVfs = findOp
7450: 74 69 6f 6e 28 61 72 67 76 2b 32 2c 20 26 6e 2c  tion(argv+2, &n,
7460: 20 22 76 66 73 22 2c 20 31 29 3b 0a 20 20 7a 43   "vfs", 1);.  zC
7470: 6c 69 65 6e 74 20 3d 20 66 69 6e 64 4f 70 74 69  lient = findOpti
7480: 6f 6e 28 61 72 67 76 2b 32 2c 20 26 6e 2c 20 22  on(argv+2, &n, "
7490: 63 6c 69 65 6e 74 22 2c 20 31 29 3b 0a 20 20 67  client", 1);.  g
74a0: 2e 7a 45 72 72 4c 6f 67 20 3d 20 66 69 6e 64 4f  .zErrLog = findO
74b0: 70 74 69 6f 6e 28 61 72 67 76 2b 32 2c 20 26 6e  ption(argv+2, &n
74c0: 2c 20 22 65 72 72 6c 6f 67 22 2c 20 31 29 3b 0a  , "errlog", 1);.
74d0: 20 20 67 2e 7a 4c 6f 67 20 3d 20 66 69 6e 64 4f    g.zLog = findO
74e0: 70 74 69 6f 6e 28 61 72 67 76 2b 32 2c 20 26 6e  ption(argv+2, &n
74f0: 2c 20 22 6c 6f 67 22 2c 20 31 29 3b 0a 20 20 7a  , "log", 1);.  z
7500: 54 72 61 63 65 20 3d 20 66 69 6e 64 4f 70 74 69  Trace = findOpti
7510: 6f 6e 28 61 72 67 76 2b 32 2c 20 26 6e 2c 20 22  on(argv+2, &n, "
7520: 74 72 61 63 65 22 2c 20 31 29 3b 0a 20 20 69 66  trace", 1);.  if
7530: 28 20 7a 54 72 61 63 65 20 29 20 67 2e 69 54 72  ( zTrace ) g.iTr
7540: 61 63 65 20 3d 20 61 74 6f 69 28 7a 54 72 61 63  ace = atoi(zTrac
7550: 65 29 3b 0a 20 20 69 66 28 20 66 69 6e 64 4f 70  e);.  if( findOp
7560: 74 69 6f 6e 28 61 72 67 76 2b 32 2c 20 26 6e 2c  tion(argv+2, &n,
7570: 20 22 71 75 69 65 74 22 2c 20 30 29 21 3d 30 20   "quiet", 0)!=0 
7580: 29 20 67 2e 69 54 72 61 63 65 20 3d 20 30 3b 0a  ) g.iTrace = 0;.
7590: 20 20 67 2e 62 53 71 6c 54 72 61 63 65 20 3d 20    g.bSqlTrace = 
75a0: 66 69 6e 64 4f 70 74 69 6f 6e 28 61 72 67 76 2b  findOption(argv+
75b0: 32 2c 20 26 6e 2c 20 22 73 71 6c 74 72 61 63 65  2, &n, "sqltrace
75c0: 22 2c 20 30 29 21 3d 30 3b 0a 20 20 67 2e 62 53  ", 0)!=0;.  g.bS
75d0: 79 6e 63 20 3d 20 66 69 6e 64 4f 70 74 69 6f 6e  ync = findOption
75e0: 28 61 72 67 76 2b 32 2c 20 26 6e 2c 20 22 73 79  (argv+2, &n, "sy
75f0: 6e 63 22 2c 20 30 29 21 3d 30 3b 0a 20 20 69 66  nc", 0)!=0;.  if
7600: 28 20 67 2e 7a 45 72 72 4c 6f 67 20 29 7b 0a 20  ( g.zErrLog ){. 
7610: 20 20 20 67 2e 70 45 72 72 4c 6f 67 20 3d 20 66     g.pErrLog = f
7620: 6f 70 65 6e 28 67 2e 7a 45 72 72 4c 6f 67 2c 20  open(g.zErrLog, 
7630: 22 61 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  "a");.  }else{. 
7640: 20 20 20 67 2e 70 45 72 72 4c 6f 67 20 3d 20 73     g.pErrLog = s
7650: 74 64 65 72 72 3b 0a 20 20 7d 0a 20 20 69 66 28  tderr;.  }.  if(
7660: 20 67 2e 7a 4c 6f 67 20 29 7b 0a 20 20 20 20 67   g.zLog ){.    g
7670: 2e 70 4c 6f 67 20 3d 20 66 6f 70 65 6e 28 67 2e  .pLog = fopen(g.
7680: 7a 4c 6f 67 2c 20 22 61 22 29 3b 0a 20 20 7d 65  zLog, "a");.  }e
7690: 6c 73 65 7b 0a 20 20 20 20 67 2e 70 4c 6f 67 20  lse{.    g.pLog 
76a0: 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7d 0a 20 20  = stdout;.  }.  
76b0: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53  sqlite3_config(S
76c0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47  QLITE_CONFIG_LOG
76d0: 2c 20 73 71 6c 45 72 72 6f 72 43 61 6c 6c 62 61  , sqlErrorCallba
76e0: 63 6b 2c 20 30 29 3b 0a 20 20 69 66 28 20 7a 43  ck, 0);.  if( zC
76f0: 6c 69 65 6e 74 20 29 7b 0a 20 20 20 20 69 43 6c  lient ){.    iCl
7700: 69 65 6e 74 20 3d 20 61 74 6f 69 28 7a 43 6c 69  ient = atoi(zCli
7710: 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 69 43  ent);.    if( iC
7720: 6c 69 65 6e 74 3c 31 20 29 20 66 61 74 61 6c 45  lient<1 ) fatalE
7730: 72 72 6f 72 28 22 69 6c 6c 65 67 61 6c 20 63 6c  rror("illegal cl
7740: 69 65 6e 74 20 6e 75 6d 62 65 72 3a 20 25 64 5c  ient number: %d\
7750: 6e 22 2c 20 69 43 6c 69 65 6e 74 29 3b 0a 20 20  n", iClient);.  
7760: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
7770: 74 66 28 73 69 7a 65 6f 66 28 67 2e 7a 4e 61 6d  tf(sizeof(g.zNam
7780: 65 29 2c 20 67 2e 7a 4e 61 6d 65 2c 20 22 63 6c  e), g.zName, "cl
7790: 69 65 6e 74 25 30 32 64 22 2c 20 69 43 6c 69 65  ient%02d", iClie
77a0: 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  nt);.  }else{.  
77b0: 20 20 69 66 28 20 67 2e 69 54 72 61 63 65 3e 30    if( g.iTrace>0
77c0: 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e 74 66   ){.      printf
77d0: 28 22 57 69 74 68 20 53 51 4c 69 74 65 20 22 20  ("With SQLite " 
77e0: 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 20 22  SQLITE_VERSION "
77f0: 20 22 20 53 51 4c 49 54 45 5f 53 4f 55 52 43 45   " SQLITE_SOURCE
7800: 5f 49 44 20 22 5c 6e 22 20 29 3b 0a 20 20 20 20  _ID "\n" );.    
7810: 20 20 66 6f 72 28 69 3d 30 3b 20 28 7a 43 4f 70    for(i=0; (zCOp
7820: 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63  tion = sqlite3_c
7830: 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65 74  ompileoption_get
7840: 28 69 29 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20  (i))!=0; i++){. 
7850: 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 2d         printf("-
7860: 44 53 51 4c 49 54 45 5f 25 73 5c 6e 22 2c 20 7a  DSQLITE_%s\n", z
7870: 43 4f 70 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20  COption);.      
7880: 7d 0a 20 20 20 20 20 20 66 66 6c 75 73 68 28 73  }.      fflush(s
7890: 74 64 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20  tdout);.    }.  
78a0: 20 20 69 43 6c 69 65 6e 74 20 3d 20 20 30 3b 0a    iClient =  0;.
78b0: 20 20 20 20 75 6e 6c 69 6e 6b 28 67 2e 7a 44 62      unlink(g.zDb
78c0: 46 69 6c 65 29 3b 0a 20 20 20 20 6f 70 65 6e 46  File);.    openF
78d0: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
78e0: 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 7d 0a  PEN_CREATE;.  }.
78f0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f    rc = sqlite3_o
7900: 70 65 6e 5f 76 32 28 67 2e 7a 44 62 46 69 6c 65  pen_v2(g.zDbFile
7910: 2c 20 26 67 2e 64 62 2c 20 6f 70 65 6e 46 6c 61  , &g.db, openFla
7920: 67 73 2c 20 67 2e 7a 56 66 73 29 3b 0a 20 20 69  gs, g.zVfs);.  i
7930: 66 28 20 72 63 20 29 20 66 61 74 61 6c 45 72 72  f( rc ) fatalErr
7940: 6f 72 28 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  or("cannot open 
7950: 5b 25 73 5d 22 2c 20 67 2e 7a 44 62 46 69 6c 65  [%s]", g.zDbFile
7960: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 75 73  );.  sqlite3_bus
7970: 79 5f 68 61 6e 64 6c 65 72 28 67 2e 64 62 2c 20  y_handler(g.db, 
7980: 62 75 73 79 48 61 6e 64 6c 65 72 2c 20 30 29 3b  busyHandler, 0);
7990: 0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  .  sqlite3_creat
79a0: 65 5f 66 75 6e 63 74 69 6f 6e 28 67 2e 64 62 2c  e_function(g.db,
79b0: 20 22 76 66 73 6e 61 6d 65 22 2c 20 30 2c 20 53   "vfsname", 0, S
79c0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20  QLITE_UTF8, 0,. 
79d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
79e0: 20 20 20 20 20 20 20 20 20 76 66 73 4e 61 6d 65           vfsName
79f0: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 73  Func, 0, 0);.  s
7a00: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
7a10: 6e 63 74 69 6f 6e 28 67 2e 64 62 2c 20 22 65 76  nction(g.db, "ev
7a20: 61 6c 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55  al", 1, SQLITE_U
7a30: 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  TF8, 0,.        
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a50: 20 20 65 76 61 6c 46 75 6e 63 2c 20 30 2c 20 30    evalFunc, 0, 0
7a60: 29 3b 0a 20 20 67 2e 69 54 69 6d 65 6f 75 74 20  );.  g.iTimeout 
7a70: 3d 20 44 45 46 41 55 4c 54 5f 54 49 4d 45 4f 55  = DEFAULT_TIMEOU
7a80: 54 3b 0a 20 20 69 66 28 20 67 2e 62 53 71 6c 54  T;.  if( g.bSqlT
7a90: 72 61 63 65 20 29 20 73 71 6c 69 74 65 33 5f 74  race ) sqlite3_t
7aa0: 72 61 63 65 28 67 2e 64 62 2c 20 73 71 6c 54 72  race(g.db, sqlTr
7ab0: 61 63 65 43 61 6c 6c 62 61 63 6b 2c 20 30 29 3b  aceCallback, 0);
7ac0: 0a 20 20 69 66 28 20 21 67 2e 62 53 79 6e 63 20  .  if( !g.bSync 
7ad0: 29 20 74 72 79 53 71 6c 28 22 50 52 41 47 4d 41  ) trySql("PRAGMA
7ae0: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46   synchronous=OFF
7af0: 22 29 3b 0a 20 20 69 66 28 20 69 43 6c 69 65 6e  ");.  if( iClien
7b00: 74 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  t>0 ){.    if( n
7b10: 3e 30 20 29 20 75 6e 72 65 63 6f 67 6e 69 7a 65  >0 ) unrecognize
7b20: 64 41 72 67 75 6d 65 6e 74 73 28 61 72 67 76 5b  dArguments(argv[
7b30: 30 5d 2c 20 6e 2c 20 61 72 67 76 2b 32 29 3b 0a  0], n, argv+2);.
7b40: 20 20 20 20 69 66 28 20 67 2e 69 54 72 61 63 65      if( g.iTrace
7b50: 20 29 20 6c 6f 67 4d 65 73 73 61 67 65 28 22 73   ) logMessage("s
7b60: 74 61 72 74 2d 63 6c 69 65 6e 74 22 29 3b 0a 20  tart-client");. 
7b70: 20 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20 20     while(1){.   
7b80: 20 20 20 63 68 61 72 20 7a 54 61 73 6b 4e 61 6d     char zTaskNam
7b90: 65 5b 35 30 5d 3b 0a 20 20 20 20 20 20 72 63 20  e[50];.      rc 
7ba0: 3d 20 73 74 61 72 74 53 63 72 69 70 74 28 69 43  = startScript(iC
7bb0: 6c 69 65 6e 74 2c 20 26 7a 53 63 72 69 70 74 2c  lient, &zScript,
7bc0: 20 26 74 61 73 6b 49 64 29 3b 0a 20 20 20 20 20   &taskId);.     
7bd0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7be0: 44 4f 4e 45 20 29 20 62 72 65 61 6b 3b 0a 20 20  DONE ) break;.  
7bf0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
7c00: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 61 73  intf(sizeof(zTas
7c10: 6b 4e 61 6d 65 29 2c 20 7a 54 61 73 6b 4e 61 6d  kName), zTaskNam
7c20: 65 2c 20 22 63 6c 69 65 6e 74 25 30 32 64 2d 74  e, "client%02d-t
7c30: 61 73 6b 2d 25 64 22 2c 0a 20 20 20 20 20 20 20  ask-%d",.       
7c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c50: 69 43 6c 69 65 6e 74 2c 20 74 61 73 6b 49 64 29  iClient, taskId)
7c60: 3b 0a 20 20 20 20 20 20 69 66 28 20 67 2e 69 54  ;.      if( g.iT
7c70: 72 61 63 65 20 29 20 6c 6f 67 4d 65 73 73 61 67  race ) logMessag
7c80: 65 28 22 62 65 67 69 6e 20 25 73 22 2c 20 7a 54  e("begin %s", zT
7c90: 61 73 6b 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  askName);.      
7ca0: 72 75 6e 53 63 72 69 70 74 28 69 43 6c 69 65 6e  runScript(iClien
7cb0: 74 2c 20 74 61 73 6b 49 64 2c 20 7a 53 63 72 69  t, taskId, zScri
7cc0: 70 74 2c 20 7a 54 61 73 6b 4e 61 6d 65 29 3b 0a  pt, zTaskName);.
7cd0: 20 20 20 20 20 20 69 66 28 20 67 2e 69 54 72 61        if( g.iTra
7ce0: 63 65 20 29 20 6c 6f 67 4d 65 73 73 61 67 65 28  ce ) logMessage(
7cf0: 22 65 6e 64 20 25 73 22 2c 20 7a 54 61 73 6b 4e  "end %s", zTaskN
7d00: 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 69 6e 69  ame);.      fini
7d10: 73 68 53 63 72 69 70 74 28 69 43 6c 69 65 6e 74  shScript(iClient
7d20: 2c 20 74 61 73 6b 49 64 2c 20 30 29 3b 0a 20 20  , taskId, 0);.  
7d30: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65      sqlite3_slee
7d40: 70 28 31 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  p(10);.    }.   
7d50: 20 69 66 28 20 67 2e 69 54 72 61 63 65 20 29 20   if( g.iTrace ) 
7d60: 6c 6f 67 4d 65 73 73 61 67 65 28 22 65 6e 64 2d  logMessage("end-
7d70: 63 6c 69 65 6e 74 22 29 3b 0a 20 20 7d 65 6c 73  client");.  }els
7d80: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  e{.    sqlite3_s
7d90: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20  tmt *pStmt;.    
7da0: 69 6e 74 20 69 54 69 6d 65 6f 75 74 3b 0a 20 20  int iTimeout;.  
7db0: 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
7dc0: 20 20 20 20 66 61 74 61 6c 45 72 72 6f 72 28 22      fatalError("
7dd0: 6d 69 73 73 69 6e 67 20 73 63 72 69 70 74 20 66  missing script f
7de0: 69 6c 65 6e 61 6d 65 22 29 3b 0a 20 20 20 20 7d  ilename");.    }
7df0: 0a 20 20 20 20 69 66 28 20 6e 3e 31 20 29 20 75  .    if( n>1 ) u
7e00: 6e 72 65 63 6f 67 6e 69 7a 65 64 41 72 67 75 6d  nrecognizedArgum
7e10: 65 6e 74 73 28 61 72 67 76 5b 30 5d 2c 20 6e 2c  ents(argv[0], n,
7e20: 20 61 72 67 76 2b 32 29 3b 0a 20 20 20 20 72 75   argv+2);.    ru
7e30: 6e 53 71 6c 28 0a 20 20 20 20 20 20 22 43 52 45  nSql(.      "CRE
7e40: 41 54 45 20 54 41 42 4c 45 20 74 61 73 6b 28 5c  ATE TABLE task(\
7e50: 6e 22 0a 20 20 20 20 20 20 22 20 20 69 64 20 49  n".      "  id I
7e60: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
7e70: 45 59 2c 5c 6e 22 0a 20 20 20 20 20 20 22 20 20  EY,\n".      "  
7e80: 63 6c 69 65 6e 74 20 49 4e 54 45 47 45 52 2c 5c  client INTEGER,\
7e90: 6e 22 0a 20 20 20 20 20 20 22 20 20 73 74 61 72  n".      "  star
7ea0: 74 74 69 6d 65 20 44 41 54 45 2c 5c 6e 22 0a 20  ttime DATE,\n". 
7eb0: 20 20 20 20 20 22 20 20 65 6e 64 74 69 6d 65 20       "  endtime 
7ec0: 44 41 54 45 2c 5c 6e 22 0a 20 20 20 20 20 20 22  DATE,\n".      "
7ed0: 20 20 73 63 72 69 70 74 20 54 45 58 54 5c 6e 22    script TEXT\n"
7ee0: 0a 20 20 20 20 20 20 22 29 3b 22 0a 20 20 20 20  .      ");".    
7ef0: 20 20 22 43 52 45 41 54 45 20 49 4e 44 45 58 20    "CREATE INDEX 
7f00: 74 61 73 6b 5f 69 31 20 4f 4e 20 74 61 73 6b 28  task_i1 ON task(
7f10: 63 6c 69 65 6e 74 2c 20 73 74 61 72 74 74 69 6d  client, starttim
7f20: 65 29 3b 5c 6e 22 0a 20 20 20 20 20 20 22 43 52  e);\n".      "CR
7f30: 45 41 54 45 20 49 4e 44 45 58 20 74 61 73 6b 5f  EATE INDEX task_
7f40: 69 32 20 4f 4e 20 74 61 73 6b 28 63 6c 69 65 6e  i2 ON task(clien
7f50: 74 2c 20 65 6e 64 74 69 6d 65 29 3b 5c 6e 22 0a  t, endtime);\n".
7f60: 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41        "CREATE TA
7f70: 42 4c 45 20 63 6f 75 6e 74 65 72 73 28 6e 45 72  BLE counters(nEr
7f80: 72 6f 72 2c 6e 54 65 73 74 29 3b 5c 6e 22 0a 20  ror,nTest);\n". 
7f90: 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54       "INSERT INT
7fa0: 4f 20 63 6f 75 6e 74 65 72 73 20 56 41 4c 55 45  O counters VALUE
7fb0: 53 28 30 2c 30 29 3b 5c 6e 22 0a 20 20 20 20 20  S(0,0);\n".     
7fc0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 63   "CREATE TABLE c
7fd0: 6c 69 65 6e 74 28 69 64 20 49 4e 54 45 47 45 52  lient(id INTEGER
7fe0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 77 61   PRIMARY KEY, wa
7ff0: 6e 74 48 61 6c 74 29 3b 5c 6e 22 0a 20 20 20 20  ntHalt);\n".    
8000: 29 3b 0a 20 20 20 20 7a 53 63 72 69 70 74 20 3d  );.    zScript =
8010: 20 72 65 61 64 46 69 6c 65 28 61 72 67 76 5b 32   readFile(argv[2
8020: 5d 29 3b 0a 20 20 20 20 69 66 28 20 67 2e 69 54  ]);.    if( g.iT
8030: 72 61 63 65 20 29 20 6c 6f 67 4d 65 73 73 61 67  race ) logMessag
8040: 65 28 22 62 65 67 69 6e 20 73 63 72 69 70 74 20  e("begin script 
8050: 5b 25 73 5d 5c 6e 22 2c 20 61 72 67 76 5b 32 5d  [%s]\n", argv[2]
8060: 29 3b 0a 20 20 20 20 72 75 6e 53 63 72 69 70 74  );.    runScript
8070: 28 30 2c 20 30 2c 20 7a 53 63 72 69 70 74 2c 20  (0, 0, zScript, 
8080: 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 73 71  argv[2]);.    sq
8090: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 63 72 69  lite3_free(zScri
80a0: 70 74 29 3b 0a 20 20 20 20 69 66 28 20 67 2e 69  pt);.    if( g.i
80b0: 54 72 61 63 65 20 29 20 6c 6f 67 4d 65 73 73 61  Trace ) logMessa
80c0: 67 65 28 22 65 6e 64 20 73 63 72 69 70 74 20 5b  ge("end script [
80d0: 25 73 5d 5c 6e 22 2c 20 61 72 67 76 5b 32 5d 29  %s]\n", argv[2])
80e0: 3b 0a 20 20 20 20 77 61 69 74 46 6f 72 43 6c 69  ;.    waitForCli
80f0: 65 6e 74 28 30 2c 20 32 30 30 30 2c 20 22 64 75  ent(0, 2000, "du
8100: 72 69 6e 67 20 73 68 75 74 64 6f 77 6e 2e 2e 2e  ring shutdown...
8110: 5c 6e 22 29 3b 0a 20 20 20 20 74 72 79 53 71 6c  \n");.    trySql
8120: 28 22 55 50 44 41 54 45 20 63 6c 69 65 6e 74 20  ("UPDATE client 
8130: 53 45 54 20 77 61 6e 74 48 61 6c 74 3d 31 22 29  SET wantHalt=1")
8140: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6c  ;.    sqlite3_sl
8150: 65 65 70 28 31 30 29 3b 0a 20 20 20 20 67 2e 69  eep(10);.    g.i
8160: 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 20 20 20  Timeout = 0;.   
8170: 20 69 54 69 6d 65 6f 75 74 20 3d 20 31 30 30 30   iTimeout = 1000
8180: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 28 72  ;.    while( ((r
8190: 63 20 3d 20 74 72 79 53 71 6c 28 22 53 45 4c 45  c = trySql("SELE
81a0: 43 54 20 31 20 46 52 4f 4d 20 63 6c 69 65 6e 74  CT 1 FROM client
81b0: 22 29 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  "))==SQLITE_BUSY
81c0: 0a 20 20 20 20 20 20 20 20 7c 7c 20 72 63 3d 3d  .        || rc==
81d0: 53 51 4c 49 54 45 5f 52 4f 57 29 20 26 26 20 69  SQLITE_ROW) && i
81e0: 54 69 6d 65 6f 75 74 3e 30 20 29 7b 0a 20 20 20  Timeout>0 ){.   
81f0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70     sqlite3_sleep
8200: 28 31 30 29 3b 0a 20 20 20 20 20 20 69 54 69 6d  (10);.      iTim
8210: 65 6f 75 74 20 2d 3d 20 31 30 3b 0a 20 20 20 20  eout -= 10;.    
8220: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6c  }.    sqlite3_sl
8230: 65 65 70 28 31 30 30 29 3b 0a 20 20 20 20 70 53  eep(100);.    pS
8240: 74 6d 74 20 3d 20 70 72 65 70 61 72 65 53 71 6c  tmt = prepareSql
8250: 28 22 53 45 4c 45 43 54 20 6e 45 72 72 6f 72 2c  ("SELECT nError,
8260: 20 6e 54 65 73 74 20 46 52 4f 4d 20 63 6f 75 6e   nTest FROM coun
8270: 74 65 72 73 22 29 3b 0a 20 20 20 20 69 54 69 6d  ters");.    iTim
8280: 65 6f 75 74 20 3d 20 31 30 30 30 3b 0a 20 20 20  eout = 1000;.   
8290: 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71   while( (rc = sq
82a0: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
82b0: 29 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  ))==SQLITE_BUSY 
82c0: 26 26 20 69 54 69 6d 65 6f 75 74 3e 30 20 29 7b  && iTimeout>0 ){
82d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
82e0: 6c 65 65 70 28 31 30 29 3b 0a 20 20 20 20 20 20  leep(10);.      
82f0: 69 54 69 6d 65 6f 75 74 20 2d 3d 20 31 30 3b 0a  iTimeout -= 10;.
8300: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
8310: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
8320: 20 20 20 20 20 20 67 2e 6e 45 72 72 6f 72 20 2b        g.nError +
8330: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
8340: 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  _int(pStmt, 0);.
8350: 20 20 20 20 20 20 67 2e 6e 54 65 73 74 20 2b 3d        g.nTest +=
8360: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
8370: 69 6e 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20  int(pStmt, 1);. 
8380: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
8390: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
83a0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
83b0: 63 6c 6f 73 65 28 67 2e 64 62 29 3b 20 20 0a 20  close(g.db);  . 
83c0: 20 6d 61 79 62 65 43 6c 6f 73 65 28 67 2e 70 4c   maybeClose(g.pL
83d0: 6f 67 29 3b 0a 20 20 6d 61 79 62 65 43 6c 6f 73  og);.  maybeClos
83e0: 65 28 67 2e 70 45 72 72 4c 6f 67 29 3b 0a 20 20  e(g.pErrLog);.  
83f0: 69 66 28 20 69 43 6c 69 65 6e 74 3d 3d 30 20 29  if( iClient==0 )
8400: 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 53 75  {.    printf("Su
8410: 6d 6d 61 72 79 3a 20 25 64 20 65 72 72 6f 72 73  mmary: %d errors
8420: 20 69 6e 20 25 64 20 74 65 73 74 73 5c 6e 22 2c   in %d tests\n",
8430: 20 67 2e 6e 45 72 72 6f 72 2c 20 67 2e 6e 54 65   g.nError, g.nTe
8440: 73 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  st);.  }.  retur
8450: 6e 20 67 2e 6e 45 72 72 6f 72 3e 30 3b 0a 7d 0a  n g.nError>0;.}.