/ Hex Artifact Content
Login

Artifact 7048030a410707f77845c0fda9c4a223c7069e0b:


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 25 73 5c 6e 42 45 47 49 4e  Error("%s\nBEGIN
3390: 20 49 4d 4d 45 44 49 41 54 45 22 2c 20 73 71 6c   IMMEDIATE", sql
33a0: 69 74 65 33 5f 65 72 72 6d 73 67 28 67 2e 64 62  ite3_errmsg(g.db
33b0: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ));.    }.    if
33c0: 28 20 67 2e 6e 45 72 72 6f 72 20 7c 7c 20 67 2e  ( g.nError || g.
33d0: 6e 54 65 73 74 20 29 7b 0a 20 20 20 20 20 20 72  nTest ){.      r
33e0: 75 6e 53 71 6c 28 22 55 50 44 41 54 45 20 63 6f  unSql("UPDATE co
33f0: 75 6e 74 65 72 73 20 53 45 54 20 6e 45 72 72 6f  unters SET nErro
3400: 72 3d 6e 45 72 72 6f 72 2b 25 64 2c 20 6e 54 65  r=nError+%d, nTe
3410: 73 74 3d 6e 54 65 73 74 2b 25 64 22 2c 0a 20 20  st=nTest+%d",.  
3420: 20 20 20 20 20 20 20 20 20 20 20 67 2e 6e 45 72             g.nEr
3430: 72 6f 72 2c 20 67 2e 6e 54 65 73 74 29 3b 0a 20  ror, g.nTest);. 
3440: 20 20 20 20 20 67 2e 6e 45 72 72 6f 72 20 3d 20       g.nError = 
3450: 30 3b 0a 20 20 20 20 20 20 67 2e 6e 54 65 73 74  0;.      g.nTest
3460: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
3470: 70 53 74 6d 74 20 3d 20 70 72 65 70 61 72 65 53  pStmt = prepareS
3480: 71 6c 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f  ql("SELECT 1 FRO
3490: 4d 20 63 6c 69 65 6e 74 20 57 48 45 52 45 20 69  M client WHERE i
34a0: 64 3d 25 64 20 41 4e 44 20 77 61 6e 74 48 61 6c  d=%d AND wantHal
34b0: 74 22 2c 69 43 6c 69 65 6e 74 29 3b 0a 20 20 20  t",iClient);.   
34c0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
34d0: 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 73  ep(pStmt);.    s
34e0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
34f0: 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20  pStmt);.    if( 
3500: 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  rc==SQLITE_ROW )
3510: 7b 0a 20 20 20 20 20 20 72 75 6e 53 71 6c 28 22  {.      runSql("
3520: 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 6c 69 65  DELETE FROM clie
3530: 6e 74 20 57 48 45 52 45 20 69 64 3d 25 64 22 2c  nt WHERE id=%d",
3540: 20 69 43 6c 69 65 6e 74 29 3b 0a 20 20 20 20 20   iClient);.     
3550: 20 72 75 6e 53 71 6c 28 22 43 4f 4d 4d 49 54 22   runSql("COMMIT"
3560: 29 3b 0a 20 20 20 20 20 20 67 2e 69 54 69 6d 65  );.      g.iTime
3570: 6f 75 74 20 3d 20 44 45 46 41 55 4c 54 5f 54 49  out = DEFAULT_TI
3580: 4d 45 4f 55 54 3b 0a 20 20 20 20 20 20 72 65 74  MEOUT;.      ret
3590: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
35a0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 74 6d 74  .    }.    pStmt
35b0: 20 3d 20 70 72 65 70 61 72 65 53 71 6c 28 0a 20   = prepareSql(. 
35c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53 45               "SE
35d0: 4c 45 43 54 20 73 63 72 69 70 74 2c 20 69 64 20  LECT script, id 
35e0: 46 52 4f 4d 20 74 61 73 6b 22 0a 20 20 20 20 20  FROM task".     
35f0: 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45           " WHERE
3600: 20 63 6c 69 65 6e 74 3d 25 64 20 41 4e 44 20 73   client=%d AND s
3610: 74 61 72 74 74 69 6d 65 20 49 53 20 4e 55 4c 4c  tarttime IS NULL
3620: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
3630: 22 20 4f 52 44 45 52 20 42 59 20 69 64 20 4c 49  " ORDER BY id LI
3640: 4d 49 54 20 31 22 2c 20 69 43 6c 69 65 6e 74 29  MIT 1", iClient)
3650: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
3660: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
3670: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
3680: 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
3690: 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f  int n = sqlite3_
36a0: 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
36b0: 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 2a 70  mt, 0);.      *p
36c0: 7a 53 63 72 69 70 74 20 3d 20 73 71 6c 69 74 65  zScript = sqlite
36d0: 33 5f 6d 61 6c 6c 6f 63 28 20 6e 2b 20 31 20 29  3_malloc( n+ 1 )
36e0: 3b 0a 20 20 20 20 20 20 73 74 72 63 70 79 28 2a  ;.      strcpy(*
36f0: 70 7a 53 63 72 69 70 74 2c 20 28 63 6f 6e 73 74  pzScript, (const
3700: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
3710: 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
3720: 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 2a 70 54  , 0));.      *pT
3730: 61 73 6b 49 64 20 3d 20 74 61 73 6b 49 64 20 3d  askId = taskId =
3740: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
3750: 69 6e 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20  int(pStmt, 1);. 
3760: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
3770: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
3780: 20 20 20 20 72 75 6e 53 71 6c 28 22 55 50 44 41      runSql("UPDA
3790: 54 45 20 74 61 73 6b 22 0a 20 20 20 20 20 20 20  TE task".       
37a0: 20 20 20 20 20 20 22 20 20 20 53 45 54 20 73 74        "   SET st
37b0: 61 72 74 74 69 6d 65 3d 73 74 72 66 74 69 6d 65  arttime=strftime
37c0: 28 27 25 25 59 2d 25 25 6d 2d 25 25 64 20 25 25  ('%%Y-%%m-%%d %%
37d0: 48 3a 25 25 4d 3a 25 25 66 27 2c 27 6e 6f 77 27  H:%%M:%%f','now'
37e0: 29 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )".             
37f0: 22 20 57 48 45 52 45 20 69 64 3d 25 64 3b 22 2c  " WHERE id=%d;",
3800: 20 74 61 73 6b 49 64 29 3b 0a 20 20 20 20 20 20   taskId);.      
3810: 72 75 6e 53 71 6c 28 22 43 4f 4d 4d 49 54 3b 22  runSql("COMMIT;"
3820: 29 3b 0a 20 20 20 20 20 20 67 2e 69 54 69 6d 65  );.      g.iTime
3830: 6f 75 74 20 3d 20 44 45 46 41 55 4c 54 5f 54 49  out = DEFAULT_TI
3840: 4d 45 4f 55 54 3b 0a 20 20 20 20 20 20 72 65 74  MEOUT;.      ret
3850: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
3860: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
3870: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
3880: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
3890: 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
38a0: 20 20 20 69 66 28 20 74 6f 74 61 6c 54 69 6d 65     if( totalTime
38b0: 3e 33 30 30 30 30 20 29 7b 0a 20 20 20 20 20 20  >30000 ){.      
38c0: 20 20 65 72 72 6f 72 4d 65 73 73 61 67 65 28 22    errorMessage("
38d0: 57 61 69 74 65 64 20 6f 76 65 72 20 33 30 20 73  Waited over 30 s
38e0: 65 63 6f 6e 64 73 20 77 69 74 68 20 6e 6f 20 77  econds with no w
38f0: 6f 72 6b 2e 20 20 47 69 76 69 6e 67 20 75 70 2e  ork.  Giving up.
3900: 22 29 3b 0a 20 20 20 20 20 20 20 20 72 75 6e 53  ");.        runS
3910: 71 6c 28 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  ql("DELETE FROM 
3920: 63 6c 69 65 6e 74 20 57 48 45 52 45 20 69 64 3d  client WHERE id=
3930: 25 64 3b 20 43 4f 4d 4d 49 54 3b 22 2c 20 69 43  %d; COMMIT;", iC
3940: 6c 69 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  lient);.        
3950: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 67 2e  sqlite3_close(g.
3960: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 65 78 69  db);.        exi
3970: 74 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  t(1);.      }.  
3980: 20 20 20 20 72 75 6e 53 71 6c 28 22 43 4f 4d 4d      runSql("COMM
3990: 49 54 3b 22 29 3b 0a 20 20 20 20 20 20 73 71 6c  IT;");.      sql
39a0: 69 74 65 33 5f 73 6c 65 65 70 28 31 30 30 29 3b  ite3_sleep(100);
39b0: 0a 20 20 20 20 20 20 74 6f 74 61 6c 54 69 6d 65  .      totalTime
39c0: 20 2b 3d 20 31 30 30 3b 0a 20 20 20 20 20 20 63   += 100;.      c
39d0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
39e0: 20 20 20 66 61 74 61 6c 45 72 72 6f 72 28 22 25     fatalError("%
39f0: 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  s", sqlite3_errm
3a00: 73 67 28 67 2e 64 62 29 29 3b 0a 20 20 7d 0a 20  sg(g.db));.  }. 
3a10: 20 67 2e 69 54 69 6d 65 6f 75 74 20 3d 20 44 45   g.iTimeout = DE
3a20: 46 41 55 4c 54 5f 54 49 4d 45 4f 55 54 3b 0a 7d  FAULT_TIMEOUT;.}
3a30: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73  ../*.** Mark a s
3a40: 63 72 69 70 74 20 61 73 20 68 61 76 69 6e 67 20  cript as having 
3a50: 66 69 6e 69 73 68 65 64 2e 20 20 20 52 65 6d 6f  finished.   Remo
3a60: 76 65 20 74 68 65 20 43 4c 49 45 4e 54 20 74 61  ve the CLIENT ta
3a70: 62 6c 65 20 65 6e 74 72 79 0a 2a 2a 20 69 66 20  ble entry.** if 
3a80: 62 53 68 75 74 64 6f 77 6e 20 69 73 20 74 72 75  bShutdown is tru
3a90: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
3aa0: 20 66 69 6e 69 73 68 53 63 72 69 70 74 28 69 6e   finishScript(in
3ab0: 74 20 69 43 6c 69 65 6e 74 2c 20 69 6e 74 20 74  t iClient, int t
3ac0: 61 73 6b 49 64 2c 20 69 6e 74 20 62 53 68 75 74  askId, int bShut
3ad0: 64 6f 77 6e 29 7b 0a 20 20 72 75 6e 53 71 6c 28  down){.  runSql(
3ae0: 22 55 50 44 41 54 45 20 74 61 73 6b 22 0a 20 20  "UPDATE task".  
3af0: 20 20 20 20 20 20 20 22 20 20 20 53 45 54 20 65         "   SET e
3b00: 6e 64 74 69 6d 65 3d 73 74 72 66 74 69 6d 65 28  ndtime=strftime(
3b10: 27 25 25 59 2d 25 25 6d 2d 25 25 64 20 25 25 48  '%%Y-%%m-%%d %%H
3b20: 3a 25 25 4d 3a 25 25 66 27 2c 27 6e 6f 77 27 29  :%%M:%%f','now')
3b30: 22 0a 20 20 20 20 20 20 20 20 20 22 20 57 48 45  ".         " WHE
3b40: 52 45 20 69 64 3d 25 64 3b 22 2c 20 74 61 73 6b  RE id=%d;", task
3b50: 49 64 29 3b 0a 20 20 69 66 28 20 62 53 68 75 74  Id);.  if( bShut
3b60: 64 6f 77 6e 20 29 7b 0a 20 20 20 20 72 75 6e 53  down ){.    runS
3b70: 71 6c 28 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  ql("DELETE FROM 
3b80: 63 6c 69 65 6e 74 20 57 48 45 52 45 20 69 64 3d  client WHERE id=
3b90: 25 64 22 2c 20 69 43 6c 69 65 6e 74 29 3b 0a 20  %d", iClient);. 
3ba0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
3bb0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
3bc0: 53 74 61 72 74 20 75 70 20 61 20 63 6c 69 65 6e  Start up a clien
3bd0: 74 20 70 72 6f 63 65 73 73 20 66 6f 72 20 69 43  t process for iC
3be0: 6c 69 65 6e 74 2c 20 69 66 20 69 74 20 69 73 20  lient, if it is 
3bf0: 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 72  not already.** r
3c00: 75 6e 6e 69 6e 67 2e 20 20 49 66 20 74 68 65 20  unning.  If the 
3c10: 63 6c 69 65 6e 74 20 69 73 20 61 6c 72 65 61 64  client is alread
3c20: 79 20 72 75 6e 6e 69 6e 67 2c 20 74 68 65 6e 20  y running, then 
3c30: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
3c40: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
3c50: 74 61 74 69 63 20 76 6f 69 64 20 73 74 61 72 74  tatic void start
3c60: 43 6c 69 65 6e 74 28 69 6e 74 20 69 43 6c 69 65  Client(int iClie
3c70: 6e 74 29 7b 0a 20 20 72 75 6e 53 71 6c 28 22 49  nt){.  runSql("I
3c80: 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20  NSERT OR IGNORE 
3c90: 49 4e 54 4f 20 63 6c 69 65 6e 74 20 56 41 4c 55  INTO client VALU
3ca0: 45 53 28 25 64 2c 30 29 22 2c 20 69 43 6c 69 65  ES(%d,0)", iClie
3cb0: 6e 74 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  nt);.  if( sqlit
3cc0: 65 33 5f 63 68 61 6e 67 65 73 28 67 2e 64 62 29  e3_changes(g.db)
3cd0: 20 29 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64   ){.#if !defined
3ce0: 28 5f 57 49 4e 33 32 29 0a 20 20 20 20 63 68 61  (_WIN32).    cha
3cf0: 72 20 2a 7a 53 79 73 3b 0a 20 20 20 20 69 6e 74  r *zSys;.    int
3d00: 20 72 63 3b 0a 20 20 20 20 7a 53 79 73 20 3d 20   rc;.    zSys = 
3d10: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
3d20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3d30: 20 20 22 25 73 20 5c 22 25 73 5c 22 20 2d 2d 63    "%s \"%s\" --c
3d40: 6c 69 65 6e 74 20 25 64 20 2d 2d 74 72 61 63 65  lient %d --trace
3d50: 20 25 64 20 25 73 25 73 26 22 2c 0a 20 20 20 20   %d %s%s&",.    
3d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 67 2e 61               g.a
3d70: 72 67 76 30 2c 20 67 2e 7a 44 62 46 69 6c 65 2c  rgv0, g.zDbFile,
3d80: 20 69 43 6c 69 65 6e 74 2c 20 67 2e 69 54 72 61   iClient, g.iTra
3d90: 63 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ce,.            
3da0: 20 20 20 20 20 67 2e 62 53 71 6c 54 72 61 63 65       g.bSqlTrace
3db0: 20 3f 20 22 2d 2d 73 71 6c 74 72 61 63 65 20 22   ? "--sqltrace "
3dc0: 20 3a 20 22 22 2c 0a 20 20 20 20 20 20 20 20 20   : "",.         
3dd0: 20 20 20 20 20 20 20 20 67 2e 62 53 79 6e 63 20          g.bSync 
3de0: 3f 20 22 2d 2d 73 79 6e 63 20 22 20 3a 20 22 22  ? "--sync " : ""
3df0: 0a 20 20 20 20 29 3b 0a 20 20 20 20 72 63 20 3d  .    );.    rc =
3e00: 20 73 79 73 74 65 6d 28 7a 53 79 73 29 3b 0a 20   system(zSys);. 
3e10: 20 20 20 69 66 28 20 72 63 20 29 20 65 72 72 6f     if( rc ) erro
3e20: 72 4d 65 73 73 61 67 65 28 22 73 79 73 74 65 6d  rMessage("system
3e30: 28 29 20 66 61 69 6c 73 20 77 69 74 68 20 65 72  () fails with er
3e40: 72 6f 72 20 63 6f 64 65 20 25 64 22 2c 20 72 63  ror code %d", rc
3e50: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
3e60: 72 65 65 28 7a 53 79 73 29 3b 0a 23 65 6e 64 69  ree(zSys);.#endi
3e70: 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  f.#if defined(_W
3e80: 49 4e 33 32 29 0a 20 20 20 20 63 68 61 72 20 2a  IN32).    char *
3e90: 61 72 67 76 5b 31 30 5d 3b 0a 20 20 20 20 63 68  argv[10];.    ch
3ea0: 61 72 20 7a 43 6c 69 65 6e 74 5b 32 30 5d 3b 0a  ar zClient[20];.
3eb0: 20 20 20 20 63 68 61 72 20 7a 54 72 61 63 65 5b      char zTrace[
3ec0: 32 30 5d 3b 0a 20 20 20 20 61 72 67 76 5b 30 5d  20];.    argv[0]
3ed0: 20 3d 20 67 2e 61 72 67 76 30 3b 0a 20 20 20 20   = g.argv0;.    
3ee0: 61 72 67 76 5b 31 5d 20 3d 20 67 2e 7a 44 62 46  argv[1] = g.zDbF
3ef0: 69 6c 65 3b 0a 20 20 20 20 61 72 67 76 5b 32 5d  ile;.    argv[2]
3f00: 20 3d 20 22 2d 2d 63 6c 69 65 6e 74 22 3b 0a 20   = "--client";. 
3f10: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
3f20: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 6c 69 65  ntf(sizeof(zClie
3f30: 6e 74 29 2c 7a 43 6c 69 65 6e 74 2c 22 25 64 22  nt),zClient,"%d"
3f40: 2c 69 43 6c 69 65 6e 74 29 3b 0a 20 20 20 20 61  ,iClient);.    a
3f50: 72 67 76 5b 33 5d 20 3d 20 7a 43 6c 69 65 6e 74  rgv[3] = zClient
3f60: 3b 0a 20 20 20 20 61 72 67 76 5b 34 5d 20 3d 20  ;.    argv[4] = 
3f70: 22 2d 2d 74 72 61 63 65 22 3b 0a 20 20 20 20 73  "--trace";.    s
3f80: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
3f90: 73 69 7a 65 6f 66 28 7a 54 72 61 63 65 29 2c 7a  sizeof(zTrace),z
3fa0: 54 72 61 63 65 2c 22 25 64 22 2c 67 2e 69 54 72  Trace,"%d",g.iTr
3fb0: 61 63 65 29 3b 0a 20 20 20 20 61 72 67 76 5b 35  ace);.    argv[5
3fc0: 5d 20 3d 20 7a 54 72 61 63 65 3b 0a 20 20 20 20  ] = zTrace;.    
3fd0: 69 66 28 20 67 2e 62 53 71 6c 54 72 61 63 65 20  if( g.bSqlTrace 
3fe0: 29 7b 0a 20 20 20 20 20 20 61 72 67 76 5b 36 5d  ){.      argv[6]
3ff0: 20 3d 20 22 2d 2d 73 71 6c 74 72 61 63 65 22 3b   = "--sqltrace";
4000: 0a 20 20 20 20 20 20 61 72 67 76 5b 37 5d 20 3d  .      argv[7] =
4010: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
4020: 20 20 20 20 20 61 72 67 76 5b 36 5d 20 3d 20 30       argv[6] = 0
4030: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 5f 73 70 61  ;.    }.    _spa
4040: 77 6e 76 28 5f 50 5f 4e 4f 57 41 49 54 2c 20 67  wnv(_P_NOWAIT, g
4050: 2e 61 72 67 76 30 2c 20 28 63 6f 6e 73 74 20 63  .argv0, (const c
4060: 68 61 72 2a 63 6f 6e 73 74 2a 29 61 72 67 76 29  har*const*)argv)
4070: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a 0a  ;.#endif.  }.}..
4080: 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 65  /*.** Read the e
4090: 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
40a0: 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d   a file into mem
40b0: 6f 72 79 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ory.*/.static ch
40c0: 61 72 20 2a 72 65 61 64 46 69 6c 65 28 63 6f 6e  ar *readFile(con
40d0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
40e0: 6d 65 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 20  me){.  FILE *in 
40f0: 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d  = fopen(zFilenam
4100: 65 2c 20 22 72 62 22 29 3b 0a 20 20 6c 6f 6e 67  e, "rb");.  long
4110: 20 73 7a 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a   sz;.  char *z;.
4120: 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20    if( in==0 ){. 
4130: 20 20 20 66 61 74 61 6c 45 72 72 6f 72 28 22 63     fatalError("c
4140: 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c  annot open \"%s\
4150: 22 20 66 6f 72 20 72 65 61 64 69 6e 67 22 2c 20  " for reading", 
4160: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zFilename);.  }.
4170: 20 20 66 73 65 65 6b 28 69 6e 2c 20 30 2c 20 53    fseek(in, 0, S
4180: 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 73 7a 20 3d  EEK_END);.  sz =
4190: 20 66 74 65 6c 6c 28 69 6e 29 3b 0a 20 20 72 65   ftell(in);.  re
41a0: 77 69 6e 64 28 69 6e 29 3b 0a 20 20 7a 20 3d 20  wind(in);.  z = 
41b0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
41c0: 73 7a 2b 31 20 29 3b 0a 20 20 73 7a 20 3d 20 28  sz+1 );.  sz = (
41d0: 6c 6f 6e 67 29 66 72 65 61 64 28 7a 2c 20 31 2c  long)fread(z, 1,
41e0: 20 73 7a 2c 20 69 6e 29 3b 0a 20 20 7a 5b 73 7a   sz, in);.  z[sz
41f0: 5d 20 3d 20 30 3b 0a 20 20 66 63 6c 6f 73 65 28  ] = 0;.  fclose(
4200: 69 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b  in);.  return z;
4210: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
4220: 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
4230: 68 65 20 6e 65 78 74 20 74 6f 6b 65 6e 2e 0a 2a  he next token..*
4240: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 6f 6b  /.static int tok
4250: 65 6e 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63  enLength(const c
4260: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 6e 4c  har *z, int *pnL
4270: 69 6e 65 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20  ine){.  int n = 
4280: 30 3b 0a 20 20 69 66 28 20 69 73 73 70 61 63 65  0;.  if( isspace
4290: 28 7a 5b 30 5d 29 20 7c 7c 20 28 7a 5b 30 5d 3d  (z[0]) || (z[0]=
42a0: 3d 27 2f 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2a  ='/' && z[1]=='*
42b0: 27 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 6e  ') ){.    int in
42c0: 43 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 63  C = 0;.    int c
42d0: 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d  ;.    if( z[0]==
42e0: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 6e 43  '/' ){.      inC
42f0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 20 3d 20   = 1;.      n = 
4300: 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  2;.    }.    whi
4310: 6c 65 28 20 28 63 20 3d 20 7a 5b 6e 2b 2b 5d 29  le( (c = z[n++])
4320: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
4330: 20 63 3d 3d 27 5c 6e 27 20 29 20 28 2a 70 6e 4c   c=='\n' ) (*pnL
4340: 69 6e 65 29 2b 2b 3b 0a 20 20 20 20 20 20 69 66  ine)++;.      if
4350: 28 20 69 73 73 70 61 63 65 28 63 29 20 29 20 63  ( isspace(c) ) c
4360: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
4370: 66 28 20 69 6e 43 20 26 26 20 63 3d 3d 27 2a 27  f( inC && c=='*'
4380: 20 26 26 20 7a 5b 6e 5d 3d 3d 27 2f 27 20 29 7b   && z[n]=='/' ){
4390: 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20  .        n++;.  
43a0: 20 20 20 20 20 20 69 6e 43 20 3d 20 30 3b 0a 20        inC = 0;. 
43b0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21       }else if( !
43c0: 69 6e 43 20 26 26 20 63 3d 3d 27 2f 27 20 26 26  inC && c=='/' &&
43d0: 20 7a 5b 6e 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20   z[n]=='*' ){.  
43e0: 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20        n++;.     
43f0: 20 20 20 69 6e 43 20 3d 20 31 3b 0a 20 20 20 20     inC = 1;.    
4400: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 6e 43    }else if( !inC
4410: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
4420: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
4430: 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 65 6c 73  .    n--;.  }els
4440: 65 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20  e if( z[0]=='-' 
4450: 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 7b 0a  && z[1]=='-' ){.
4460: 20 20 20 20 66 6f 72 28 6e 3d 32 3b 20 7a 5b 6e      for(n=2; z[n
4470: 5d 20 26 26 20 7a 5b 6e 5d 21 3d 27 5c 6e 27 3b  ] && z[n]!='\n';
4480: 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 69 66 28 20   n++){}.    if( 
4490: 7a 5b 6e 5d 20 29 7b 20 28 2a 70 6e 4c 69 6e 65  z[n] ){ (*pnLine
44a0: 29 2b 2b 3b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 65  )++; n++; }.  }e
44b0: 6c 73 65 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 22  lse if( z[0]=='"
44c0: 27 20 7c 7c 20 7a 5b 30 5d 3d 3d 27 5c 27 27 20  ' || z[0]=='\'' 
44d0: 29 7b 0a 20 20 20 20 69 6e 74 20 64 65 6c 69 6d  ){.    int delim
44e0: 20 3d 20 7a 5b 30 5d 3b 0a 20 20 20 20 66 6f 72   = z[0];.    for
44f0: 28 6e 3d 31 3b 20 7a 5b 6e 5d 3b 20 6e 2b 2b 29  (n=1; z[n]; n++)
4500: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 6e 5d  {.      if( z[n]
4510: 3d 3d 27 5c 6e 27 20 29 20 28 2a 70 6e 4c 69 6e  =='\n' ) (*pnLin
4520: 65 29 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  e)++;.      if( 
4530: 7a 5b 6e 5d 3d 3d 64 65 6c 69 6d 20 29 7b 0a 20  z[n]==delim ){. 
4540: 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20         n++;.    
4550: 20 20 20 20 69 66 28 20 7a 5b 6e 2b 31 5d 21 3d      if( z[n+1]!=
4560: 64 65 6c 69 6d 20 29 20 62 72 65 61 6b 3b 0a 20  delim ) break;. 
4570: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
4580: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 63 3b  else{.    int c;
4590: 0a 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20 28 63  .    for(n=1; (c
45a0: 20 3d 20 7a 5b 6e 5d 29 21 3d 30 20 26 26 20 21   = z[n])!=0 && !
45b0: 69 73 73 70 61 63 65 28 63 29 20 26 26 20 63 21  isspace(c) && c!
45c0: 3d 27 22 27 20 26 26 20 63 21 3d 27 5c 27 27 20  ='"' && c!='\'' 
45d0: 26 26 20 63 21 3d 27 3b 27 3b 20 6e 2b 2b 29 7b  && c!=';'; n++){
45e0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
45f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  ;.}../*.** Copy 
4600: 61 20 73 69 6e 67 6c 65 20 74 6f 6b 65 6e 20 69  a single token i
4610: 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66  nto a string buf
4620: 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  fer..*/.static i
4630: 6e 74 20 65 78 74 72 61 63 74 54 6f 6b 65 6e 28  nt extractToken(
4640: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c  const char *zIn,
4650: 20 69 6e 74 20 6e 49 6e 2c 20 63 68 61 72 20 2a   int nIn, char *
4660: 7a 4f 75 74 2c 20 69 6e 74 20 6e 4f 75 74 29 7b  zOut, int nOut){
4670: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
4680: 6e 49 6e 3c 3d 30 20 29 7b 0a 20 20 20 20 7a 4f  nIn<=0 ){.    zO
4690: 75 74 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 72  ut[0] = 0;.    r
46a0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66  eturn 0;.  }.  f
46b0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 6e 20 26 26  or(i=0; i<nIn &&
46c0: 20 69 3c 6e 4f 75 74 2d 31 20 26 26 20 21 69 73   i<nOut-1 && !is
46d0: 73 70 61 63 65 28 7a 49 6e 5b 69 5d 29 3b 20 69  space(zIn[i]); i
46e0: 2b 2b 29 7b 20 7a 4f 75 74 5b 69 5d 20 3d 20 7a  ++){ zOut[i] = z
46f0: 49 6e 5b 69 5d 3b 20 7d 0a 20 20 7a 4f 75 74 5b  In[i]; }.  zOut[
4700: 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  i] = 0;.  return
4710: 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   i;.}../*.** Fin
4720: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
4730: 63 68 61 72 61 63 74 65 72 73 20 75 70 20 74 6f  characters up to
4740: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
4750: 65 20 6e 65 78 74 20 22 2d 2d 65 6e 64 22 20 74  e next "--end" t
4760: 6f 6b 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oken..*/.static 
4770: 69 6e 74 20 66 69 6e 64 45 6e 64 28 63 6f 6e 73  int findEnd(cons
4780: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a  t char *z, int *
4790: 70 6e 4c 69 6e 65 29 7b 0a 20 20 69 6e 74 20 6e  pnLine){.  int n
47a0: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 7a   = 0;.  while( z
47b0: 5b 6e 5d 20 26 26 20 28 73 74 72 6e 63 6d 70 28  [n] && (strncmp(
47c0: 7a 2b 6e 2c 22 2d 2d 65 6e 64 22 2c 35 29 20 7c  z+n,"--end",5) |
47d0: 7c 20 21 69 73 73 70 61 63 65 28 7a 5b 6e 2b 35  | !isspace(z[n+5
47e0: 5d 29 29 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20  ])) ){.    n += 
47f0: 74 6f 6b 65 6e 4c 65 6e 67 74 68 28 7a 2b 6e 2c  tokenLength(z+n,
4800: 20 70 6e 4c 69 6e 65 29 3b 0a 20 20 7d 0a 20 20   pnLine);.  }.  
4810: 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
4820: 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 75 6d 62  ** Find the numb
4830: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
4840: 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74   up to the first
4850: 20 63 68 61 72 61 63 74 65 72 20 70 61 73 74 20   character past 
4860: 74 68 65 0a 2a 2a 20 6f 66 20 74 68 65 20 6e 65  the.** of the ne
4870: 78 74 20 22 2d 2d 65 6e 64 69 66 22 20 20 6f 72  xt "--endif"  or
4880: 20 22 2d 2d 65 6c 73 65 22 20 74 6f 6b 65 6e 2e   "--else" token.
4890: 20 4e 65 73 74 65 64 20 2d 2d 69 66 20 63 6f 6d   Nested --if com
48a0: 6d 61 6e 64 73 20 61 72 65 0a 2a 2a 20 61 6c 73  mands are.** als
48b0: 6f 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74  o skipped..*/.st
48c0: 61 74 69 63 20 69 6e 74 20 66 69 6e 64 45 6e 64  atic int findEnd
48d0: 69 66 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  if(const char *z
48e0: 2c 20 69 6e 74 20 73 74 6f 70 41 74 45 6c 73 65  , int stopAtElse
48f0: 2c 20 69 6e 74 20 2a 70 6e 4c 69 6e 65 29 7b 0a  , int *pnLine){.
4900: 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 77    int n = 0;.  w
4910: 68 69 6c 65 28 20 7a 5b 6e 5d 20 29 7b 0a 20 20  hile( z[n] ){.  
4920: 20 20 69 6e 74 20 6c 65 6e 20 3d 20 74 6f 6b 65    int len = toke
4930: 6e 4c 65 6e 67 74 68 28 7a 2b 6e 2c 20 70 6e 4c  nLength(z+n, pnL
4940: 69 6e 65 29 3b 0a 20 20 20 20 69 66 28 20 28 73  ine);.    if( (s
4950: 74 72 6e 63 6d 70 28 7a 2b 6e 2c 22 2d 2d 65 6e  trncmp(z+n,"--en
4960: 64 69 66 22 2c 37 29 3d 3d 30 20 26 26 20 69 73  dif",7)==0 && is
4970: 73 70 61 63 65 28 7a 5b 6e 2b 37 5d 29 29 0a 20  space(z[n+7])). 
4980: 20 20 20 20 7c 7c 20 28 73 74 6f 70 41 74 45 6c      || (stopAtEl
4990: 73 65 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 2b  se && strncmp(z+
49a0: 6e 2c 22 2d 2d 65 6c 73 65 22 2c 36 29 3d 3d 30  n,"--else",6)==0
49b0: 20 26 26 20 69 73 73 70 61 63 65 28 7a 5b 6e 2b   && isspace(z[n+
49c0: 36 5d 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  6])).    ){.    
49d0: 20 20 72 65 74 75 72 6e 20 6e 2b 6c 65 6e 3b 0a    return n+len;.
49e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
49f0: 72 6e 63 6d 70 28 7a 2b 6e 2c 22 2d 2d 69 66 22  rncmp(z+n,"--if"
4a00: 2c 34 29 3d 3d 30 20 26 26 20 69 73 73 70 61 63  ,4)==0 && isspac
4a10: 65 28 7a 5b 6e 2b 34 5d 29 20 29 7b 0a 20 20 20  e(z[n+4]) ){.   
4a20: 20 20 20 69 6e 74 20 73 6b 69 70 20 3d 20 66 69     int skip = fi
4a30: 6e 64 45 6e 64 69 66 28 7a 2b 6e 2b 6c 65 6e 2c  ndEndif(z+n+len,
4a40: 20 30 2c 20 70 6e 4c 69 6e 65 29 3b 0a 20 20 20   0, pnLine);.   
4a50: 20 20 20 6e 20 2b 3d 20 73 6b 69 70 20 2b 20 6c     n += skip + l
4a60: 65 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  en;.    }else{. 
4a70: 20 20 20 20 20 6e 20 2b 3d 20 6c 65 6e 3b 0a 20       n += len;. 
4a80: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
4a90: 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  n n;.}../*.** Wa
4aa0: 69 74 20 66 6f 72 20 61 20 63 6c 69 65 6e 74 20  it for a client 
4ab0: 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 70 6c  process to compl
4ac0: 65 74 65 20 61 6c 6c 20 69 74 73 20 74 61 73 6b  ete all its task
4ad0: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
4ae0: 20 77 61 69 74 46 6f 72 43 6c 69 65 6e 74 28 69   waitForClient(i
4af0: 6e 74 20 69 43 6c 69 65 6e 74 2c 20 69 6e 74 20  nt iClient, int 
4b00: 69 54 69 6d 65 6f 75 74 2c 20 63 68 61 72 20 2a  iTimeout, char *
4b10: 7a 45 72 72 50 72 65 66 69 78 29 7b 0a 20 20 73  zErrPrefix){.  s
4b20: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
4b30: 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  mt;.  int rc;.  
4b40: 69 66 28 20 69 43 6c 69 65 6e 74 3e 30 20 29 7b  if( iClient>0 ){
4b50: 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 70 72 65  .    pStmt = pre
4b60: 70 61 72 65 53 71 6c 28 0a 20 20 20 20 20 20 20  pareSql(.       
4b70: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
4b80: 31 20 46 52 4f 4d 20 74 61 73 6b 22 0a 20 20 20  1 FROM task".   
4b90: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48              " WH
4ba0: 45 52 45 20 63 6c 69 65 6e 74 3d 25 64 22 0a 20  ERE client=%d". 
4bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
4bc0: 20 20 41 4e 44 20 63 6c 69 65 6e 74 20 49 4e 20    AND client IN 
4bd0: 28 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20  (SELECT id FROM 
4be0: 63 6c 69 65 6e 74 29 22 0a 20 20 20 20 20 20 20  client)".       
4bf0: 20 20 20 20 20 20 20 20 22 20 20 41 4e 44 20 65          "  AND e
4c00: 6e 64 74 69 6d 65 20 49 53 20 4e 55 4c 4c 22 2c  ndtime IS NULL",
4c10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4c20: 69 43 6c 69 65 6e 74 29 3b 0a 20 20 7d 65 6c 73  iClient);.  }els
4c30: 65 7b 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 70  e{.    pStmt = p
4c40: 72 65 70 61 72 65 53 71 6c 28 0a 20 20 20 20 20  repareSql(.     
4c50: 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
4c60: 54 20 31 20 46 52 4f 4d 20 74 61 73 6b 22 0a 20  T 1 FROM task". 
4c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
4c80: 57 48 45 52 45 20 63 6c 69 65 6e 74 20 49 4e 20  WHERE client IN 
4c90: 28 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20  (SELECT id FROM 
4ca0: 63 6c 69 65 6e 74 29 22 0a 20 20 20 20 20 20 20  client)".       
4cb0: 20 20 20 20 20 20 20 20 22 20 20 20 41 4e 44 20          "   AND 
4cc0: 65 6e 64 74 69 6d 65 20 49 53 20 4e 55 4c 4c 22  endtime IS NULL"
4cd0: 29 3b 0a 20 20 7d 0a 20 20 67 2e 69 54 69 6d 65  );.  }.  g.iTime
4ce0: 6f 75 74 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  out = 0;.  while
4cf0: 28 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33  ( ((rc = sqlite3
4d00: 5f 73 74 65 70 28 70 53 74 6d 74 29 29 3d 3d 53  _step(pStmt))==S
4d10: 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 72 63  QLITE_BUSY || rc
4d20: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 29 0a 20 20  ==SQLITE_ROW).  
4d30: 20 20 26 26 20 69 54 69 6d 65 6f 75 74 3e 30 0a    && iTimeout>0.
4d40: 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33    ){.    sqlite3
4d50: 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
4d60: 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70     sqlite3_sleep
4d70: 28 35 30 29 3b 0a 20 20 20 20 69 54 69 6d 65 6f  (50);.    iTimeo
4d80: 75 74 20 2d 3d 20 35 30 3b 0a 20 20 7d 0a 20 20  ut -= 50;.  }.  
4d90: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
4da0: 28 70 53 74 6d 74 29 3b 0a 20 20 67 2e 69 54 69  (pStmt);.  g.iTi
4db0: 6d 65 6f 75 74 20 3d 20 44 45 46 41 55 4c 54 5f  meout = DEFAULT_
4dc0: 54 49 4d 45 4f 55 54 3b 0a 20 20 69 66 28 20 72  TIMEOUT;.  if( r
4dd0: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
4de0: 7b 0a 20 20 20 20 69 66 28 20 7a 45 72 72 50 72  {.    if( zErrPr
4df0: 65 66 69 78 3d 3d 30 20 29 20 7a 45 72 72 50 72  efix==0 ) zErrPr
4e00: 65 66 69 78 20 3d 20 22 22 3b 0a 20 20 20 20 69  efix = "";.    i
4e10: 66 28 20 69 43 6c 69 65 6e 74 3e 30 20 29 7b 0a  f( iClient>0 ){.
4e20: 20 20 20 20 20 20 65 72 72 6f 72 4d 65 73 73 61        errorMessa
4e30: 67 65 28 22 25 73 74 69 6d 65 6f 75 74 20 77 61  ge("%stimeout wa
4e40: 69 74 69 6e 67 20 66 6f 72 20 63 6c 69 65 6e 74  iting for client
4e50: 20 25 64 22 2c 20 7a 45 72 72 50 72 65 66 69 78   %d", zErrPrefix
4e60: 2c 20 69 43 6c 69 65 6e 74 29 3b 0a 20 20 20 20  , iClient);.    
4e70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 72 72  }else{.      err
4e80: 6f 72 4d 65 73 73 61 67 65 28 22 25 73 74 69 6d  orMessage("%stim
4e90: 65 6f 75 74 20 77 61 69 74 69 6e 67 20 66 6f 72  eout waiting for
4ea0: 20 61 6c 6c 20 63 6c 69 65 6e 74 73 22 2c 20 7a   all clients", z
4eb0: 45 72 72 50 72 65 66 69 78 29 3b 0a 20 20 20 20  ErrPrefix);.    
4ec0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 4d 61 78 69  }.  }.}../* Maxi
4ed0: 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  mum number of ar
4ee0: 67 75 6d 65 6e 74 73 20 74 6f 20 61 20 2d 2d 63  guments to a --c
4ef0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 23 64 65 66 69 6e  ommand */.#defin
4f00: 65 20 4d 58 5f 41 52 47 20 32 0a 0a 2f 2a 0a 2a  e MX_ARG 2../*.*
4f10: 2a 20 52 75 6e 20 61 20 73 63 72 69 70 74 2e 0a  * Run a script..
4f20: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
4f30: 75 6e 53 63 72 69 70 74 28 0a 20 20 69 6e 74 20  unScript(.  int 
4f40: 69 43 6c 69 65 6e 74 2c 20 20 20 20 20 20 20 2f  iClient,       /
4f50: 2a 20 54 68 65 20 63 6c 69 65 6e 74 20 6e 75 6d  * The client num
4f60: 62 65 72 2c 20 6f 72 20 30 20 66 6f 72 20 74 68  ber, or 0 for th
4f70: 65 20 6d 61 73 74 65 72 20 2a 2f 0a 20 20 69 6e  e master */.  in
4f80: 74 20 74 61 73 6b 49 64 2c 20 20 20 20 20 20 20  t taskId,       
4f90: 20 2f 2a 20 54 68 65 20 74 61 73 6b 20 49 44 20   /* The task ID 
4fa0: 66 6f 72 20 63 6c 69 65 6e 74 73 2e 20 20 30 20  for clients.  0 
4fb0: 66 6f 72 20 6d 61 73 74 65 72 20 2a 2f 0a 20 20  for master */.  
4fc0: 63 68 61 72 20 2a 7a 53 63 72 69 70 74 2c 20 20  char *zScript,  
4fd0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 74 68     /* Text of th
4fe0: 65 20 73 63 72 69 70 74 20 2a 2f 0a 20 20 63 68  e script */.  ch
4ff0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 20 20 20  ar *zFilename   
5000: 20 2f 2a 20 46 69 6c 65 20 66 72 6f 6d 20 77 68   /* File from wh
5010: 69 63 68 20 73 63 72 69 70 74 20 77 61 73 20 72  ich script was r
5020: 65 61 64 2e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ead. */.){.  int
5030: 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 69   lineno = 1;.  i
5040: 6e 74 20 70 72 65 76 4c 69 6e 65 20 3d 20 31 3b  nt prevLine = 1;
5050: 0a 20 20 69 6e 74 20 69 69 20 3d 20 30 3b 0a 20  .  int ii = 0;. 
5060: 20 69 6e 74 20 69 42 65 67 69 6e 20 3d 20 30 3b   int iBegin = 0;
5070: 0a 20 20 69 6e 74 20 6e 2c 20 63 2c 20 6a 3b 0a  .  int n, c, j;.
5080: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74    int len;.  int
5090: 20 6e 41 72 67 3b 0a 20 20 53 74 72 69 6e 67 20   nArg;.  String 
50a0: 73 52 65 73 75 6c 74 3b 0a 20 20 63 68 61 72 20  sResult;.  char 
50b0: 7a 43 6d 64 5b 33 30 5d 3b 0a 20 20 63 68 61 72  zCmd[30];.  char
50c0: 20 7a 45 72 72 6f 72 5b 31 30 30 30 5d 3b 0a 20   zError[1000];. 
50d0: 20 63 68 61 72 20 61 7a 41 72 67 5b 4d 58 5f 41   char azArg[MX_A
50e0: 52 47 5d 5b 31 30 30 5d 3b 0a 0a 20 20 6d 65 6d  RG][100];..  mem
50f0: 73 65 74 28 26 73 52 65 73 75 6c 74 2c 20 30 2c  set(&sResult, 0,
5100: 20 73 69 7a 65 6f 66 28 73 52 65 73 75 6c 74 29   sizeof(sResult)
5110: 29 3b 0a 20 20 73 74 72 69 6e 67 52 65 73 65 74  );.  stringReset
5120: 28 26 73 52 65 73 75 6c 74 29 3b 0a 20 20 77 68  (&sResult);.  wh
5130: 69 6c 65 28 20 28 63 20 3d 20 7a 53 63 72 69 70  ile( (c = zScrip
5140: 74 5b 69 69 5d 29 21 3d 30 20 29 7b 0a 20 20 20  t[ii])!=0 ){.   
5150: 20 70 72 65 76 4c 69 6e 65 20 3d 20 6c 69 6e 65   prevLine = line
5160: 6e 6f 3b 0a 20 20 20 20 6c 65 6e 20 3d 20 74 6f  no;.    len = to
5170: 6b 65 6e 4c 65 6e 67 74 68 28 7a 53 63 72 69 70  kenLength(zScrip
5180: 74 2b 69 69 2c 20 26 6c 69 6e 65 6e 6f 29 3b 0a  t+ii, &lineno);.
5190: 20 20 20 20 69 66 28 20 69 73 73 70 61 63 65 28      if( isspace(
51a0: 63 29 20 7c 7c 20 28 63 3d 3d 27 2f 27 20 26 26  c) || (c=='/' &&
51b0: 20 7a 53 63 72 69 70 74 5b 69 69 2b 31 5d 3d 3d   zScript[ii+1]==
51c0: 27 2a 27 29 20 29 7b 0a 20 20 20 20 20 20 69 69  '*') ){.      ii
51d0: 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 63   += len;.      c
51e0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
51f0: 20 20 20 69 66 28 20 63 21 3d 27 2d 27 20 7c 7c     if( c!='-' ||
5200: 20 7a 53 63 72 69 70 74 5b 69 69 2b 31 5d 21 3d   zScript[ii+1]!=
5210: 27 2d 27 20 7c 7c 20 21 69 73 61 6c 70 68 61 28  '-' || !isalpha(
5220: 7a 53 63 72 69 70 74 5b 69 69 2b 32 5d 29 20 29  zScript[ii+2]) )
5230: 7b 0a 20 20 20 20 20 20 69 69 20 2b 3d 20 6c 65  {.      ii += le
5240: 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  n;.      continu
5250: 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  e;.    }..    /*
5260: 20 52 75 6e 20 61 6e 79 20 70 72 69 6f 72 20 53   Run any prior S
5270: 51 4c 20 62 65 66 6f 72 65 20 70 72 6f 63 65 73  QL before proces
5280: 73 69 6e 67 20 74 68 65 20 6e 65 77 20 2d 2d 63  sing the new --c
5290: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66  ommand */.    if
52a0: 28 20 69 69 3e 69 42 65 67 69 6e 20 29 7b 0a 20  ( ii>iBegin ){. 
52b0: 20 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20       char *zSql 
52c0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
52d0: 66 28 22 25 2e 2a 73 22 2c 20 69 69 2d 69 42 65  f("%.*s", ii-iBe
52e0: 67 69 6e 2c 20 7a 53 63 72 69 70 74 2b 69 42 65  gin, zScript+iBe
52f0: 67 69 6e 29 3b 0a 20 20 20 20 20 20 65 76 61 6c  gin);.      eval
5300: 53 71 6c 28 26 73 52 65 73 75 6c 74 2c 20 7a 53  Sql(&sResult, zS
5310: 71 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ql);.      sqlit
5320: 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
5330: 20 20 20 20 20 69 42 65 67 69 6e 20 3d 20 69 69       iBegin = ii
5340: 20 2b 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 0a 20   + len;.    }.. 
5350: 20 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20     /* Parse the 
5360: 2d 2d 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20  --command */.   
5370: 20 69 66 28 20 67 2e 69 54 72 61 63 65 3e 3d 32   if( g.iTrace>=2
5380: 20 29 20 6c 6f 67 4d 65 73 73 61 67 65 28 22 25   ) logMessage("%
5390: 2e 2a 73 22 2c 20 6c 65 6e 2c 20 7a 53 63 72 69  .*s", len, zScri
53a0: 70 74 2b 69 69 29 3b 0a 20 20 20 20 6e 20 3d 20  pt+ii);.    n = 
53b0: 65 78 74 72 61 63 74 54 6f 6b 65 6e 28 7a 53 63  extractToken(zSc
53c0: 72 69 70 74 2b 69 69 2b 32 2c 20 6c 65 6e 2d 32  ript+ii+2, len-2
53d0: 2c 20 7a 43 6d 64 2c 20 73 69 7a 65 6f 66 28 7a  , zCmd, sizeof(z
53e0: 43 6d 64 29 29 3b 0a 20 20 20 20 66 6f 72 28 6e  Cmd));.    for(n
53f0: 41 72 67 3d 30 3b 20 6e 3c 6c 65 6e 2d 32 20 26  Arg=0; n<len-2 &
5400: 26 20 6e 41 72 67 3c 4d 58 5f 41 52 47 3b 20 6e  & nArg<MX_ARG; n
5410: 41 72 67 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68  Arg++){.      wh
5420: 69 6c 65 28 20 6e 3c 6c 65 6e 2d 32 20 26 26 20  ile( n<len-2 && 
5430: 69 73 73 70 61 63 65 28 7a 53 63 72 69 70 74 5b  isspace(zScript[
5440: 69 69 2b 32 2b 6e 5d 29 20 29 7b 20 6e 2b 2b 3b  ii+2+n]) ){ n++;
5450: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 3d   }.      if( n>=
5460: 6c 65 6e 2d 32 20 29 20 62 72 65 61 6b 3b 0a 20  len-2 ) break;. 
5470: 20 20 20 20 20 6e 20 2b 3d 20 65 78 74 72 61 63       n += extrac
5480: 74 54 6f 6b 65 6e 28 7a 53 63 72 69 70 74 2b 69  tToken(zScript+i
5490: 69 2b 32 2b 6e 2c 20 6c 65 6e 2d 32 2d 6e 2c 0a  i+2+n, len-2-n,.
54a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54b0: 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b 6e 41          azArg[nA
54c0: 72 67 5d 2c 20 73 69 7a 65 6f 66 28 61 7a 41 72  rg], sizeof(azAr
54d0: 67 5b 6e 41 72 67 5d 29 29 3b 0a 20 20 20 20 7d  g[nArg]));.    }
54e0: 0a 20 20 20 20 66 6f 72 28 6a 3d 6e 41 72 67 3b  .    for(j=nArg;
54f0: 20 6a 3c 4d 58 5f 41 52 47 3b 20 6a 2b 2b 29 20   j<MX_ARG; j++) 
5500: 61 7a 41 72 67 5b 6a 2b 2b 5d 5b 30 5d 20 3d 20  azArg[j++][0] = 
5510: 30 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  0;..    /*.    *
5520: 2a 20 20 2d 2d 73 6c 65 65 70 20 4e 0a 20 20 20  *  --sleep N.   
5530: 20 2a 2a 0a 20 20 20 20 2a 2a 20 50 61 75 73 65   **.    ** Pause
5540: 20 66 6f 72 20 4e 20 6d 69 6c 6c 69 73 65 63 6f   for N milliseco
5550: 6e 64 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  nds.    */.    i
5560: 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20  f( strcmp(zCmd, 
5570: 22 73 6c 65 65 70 22 29 3d 3d 30 20 29 7b 0a 20  "sleep")==0 ){. 
5580: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65       sqlite3_sle
5590: 65 70 28 61 74 6f 69 28 61 7a 41 72 67 5b 30 5d  ep(atoi(azArg[0]
55a0: 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 0a 0a  ));.    }else ..
55b0: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20      /*.    **   
55c0: 2d 2d 65 78 69 74 20 4e 0a 20 20 20 20 2a 2a 0a  --exit N.    **.
55d0: 20 20 20 20 2a 2a 20 45 78 69 74 20 74 68 69 73      ** Exit this
55e0: 20 70 72 6f 63 65 73 73 2e 20 20 49 66 20 4e 3e   process.  If N>
55f0: 30 20 74 68 65 6e 20 65 78 69 74 20 77 69 74 68  0 then exit with
5600: 6f 75 74 20 73 68 75 74 74 69 6e 67 20 64 6f 77  out shutting dow
5610: 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 69 74 65 2e  n.    ** SQLite.
5620: 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64    (In other word
5630: 73 2c 20 73 69 6d 75 6c 61 74 65 20 61 20 63 72  s, simulate a cr
5640: 61 73 68 2e 29 0a 20 20 20 20 2a 2f 0a 20 20 20  ash.).    */.   
5650: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64   if( strcmp(zCmd
5660: 2c 20 22 65 78 69 74 22 29 3d 3d 30 20 29 7b 0a  , "exit")==0 ){.
5670: 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 61        int rc = a
5680: 74 6f 69 28 61 7a 41 72 67 5b 30 5d 29 3b 0a 20  toi(azArg[0]);. 
5690: 20 20 20 20 20 66 69 6e 69 73 68 53 63 72 69 70       finishScrip
56a0: 74 28 69 43 6c 69 65 6e 74 2c 20 74 61 73 6b 49  t(iClient, taskI
56b0: 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  d, 1);.      if(
56c0: 20 72 63 3d 3d 30 20 29 20 73 71 6c 69 74 65 33   rc==0 ) sqlite3
56d0: 5f 63 6c 6f 73 65 28 67 2e 64 62 29 3b 0a 20 20  _close(g.db);.  
56e0: 20 20 20 20 65 78 69 74 28 72 63 29 3b 0a 20 20      exit(rc);.  
56f0: 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a    }else..    /*.
5700: 20 20 20 20 2a 2a 20 20 2d 2d 72 65 73 65 74 0a      **  --reset.
5710: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65      **.    ** Re
5720: 73 65 74 20 61 63 63 75 6d 75 6c 61 74 65 64 20  set accumulated 
5730: 72 65 73 75 6c 74 73 20 62 61 63 6b 20 74 6f 20  results back to 
5740: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 0a  an empty string.
5750: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
5760: 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 72 65 73  trcmp(zCmd, "res
5770: 65 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  et")==0 ){.     
5780: 20 73 74 72 69 6e 67 52 65 73 65 74 28 26 73 52   stringReset(&sR
5790: 65 73 75 6c 74 29 3b 0a 20 20 20 20 7d 65 6c 73  esult);.    }els
57a0: 65 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  e..    /*.    **
57b0: 20 20 2d 2d 6d 61 74 63 68 20 41 4e 53 57 45 52    --match ANSWER
57c0: 2e 2e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ....    **.    *
57d0: 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
57e0: 66 20 6f 75 74 70 75 74 20 6d 61 74 63 68 65 73  f output matches
57f0: 20 41 4e 53 57 45 52 2e 20 20 52 65 70 6f 72 74   ANSWER.  Report
5800: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 6e 6f 74   an error if not
5810: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
5820: 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 6d   strcmp(zCmd, "m
5830: 61 74 63 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20  atch")==0 ){.   
5840: 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20 20 20 20     int jj;.     
5850: 20 63 68 61 72 20 2a 7a 41 6e 73 20 3d 20 7a 53   char *zAns = zS
5860: 63 72 69 70 74 2b 69 69 3b 0a 20 20 20 20 20 20  cript+ii;.      
5870: 66 6f 72 28 6a 6a 3d 37 3b 20 6a 6a 3c 6c 65 6e  for(jj=7; jj<len
5880: 2d 31 20 26 26 20 69 73 73 70 61 63 65 28 7a 41  -1 && isspace(zA
5890: 6e 73 5b 6a 6a 5d 29 3b 20 6a 6a 2b 2b 29 7b 7d  ns[jj]); jj++){}
58a0: 0a 20 20 20 20 20 20 7a 41 6e 73 20 2b 3d 20 6a  .      zAns += j
58b0: 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  j;.      if( str
58c0: 6e 63 6d 70 28 73 52 65 73 75 6c 74 2e 7a 2c 20  ncmp(sResult.z, 
58d0: 7a 41 6e 73 2c 20 6c 65 6e 2d 6a 6a 2d 31 29 20  zAns, len-jj-1) 
58e0: 29 7b 0a 20 20 20 20 20 20 20 20 65 72 72 6f 72  ){.        error
58f0: 4d 65 73 73 61 67 65 28 22 6c 69 6e 65 20 25 64  Message("line %d
5900: 20 6f 66 20 25 73 3a 5c 6e 45 78 70 65 63 74 65   of %s:\nExpecte
5910: 64 20 5b 25 2e 2a 73 5d 5c 6e 20 20 20 20 20 47  d [%.*s]\n     G
5920: 6f 74 20 5b 25 73 5d 22 2c 0a 20 20 20 20 20 20  ot [%s]",.      
5930: 20 20 20 20 70 72 65 76 4c 69 6e 65 2c 20 7a 46      prevLine, zF
5940: 69 6c 65 6e 61 6d 65 2c 20 6c 65 6e 2d 6a 6a 2d  ilename, len-jj-
5950: 31 2c 20 7a 41 6e 73 2c 20 73 52 65 73 75 6c 74  1, zAns, sResult
5960: 2e 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  .z);.      }.   
5970: 20 20 20 67 2e 6e 54 65 73 74 2b 2b 3b 0a 20 20     g.nTest++;.  
5980: 20 20 20 20 73 74 72 69 6e 67 52 65 73 65 74 28      stringReset(
5990: 26 73 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 7d  &sResult);.    }
59a0: 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  else..    /*.   
59b0: 20 2a 2a 20 20 2d 2d 6f 75 74 70 75 74 0a 20 20   **  --output.  
59c0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 75 74 70    **.    ** Outp
59d0: 75 74 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66  ut the result of
59e0: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 53 51   the previous SQ
59f0: 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  L..    */.    if
5a00: 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22  ( strcmp(zCmd, "
5a10: 6f 75 74 70 75 74 22 29 3d 3d 30 20 29 7b 0a 20  output")==0 ){. 
5a20: 20 20 20 20 20 6c 6f 67 4d 65 73 73 61 67 65 28       logMessage(
5a30: 22 25 73 22 2c 20 73 52 65 73 75 6c 74 2e 7a 29  "%s", sResult.z)
5a40: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20  ;.    }else..   
5a50: 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 2d 2d 73 6f   /*.    **  --so
5a60: 75 72 63 65 20 46 49 4c 45 4e 41 4d 45 0a 20 20  urce FILENAME.  
5a70: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 75 6e 20    **.    ** Run 
5a80: 61 20 73 75 62 73 63 72 69 70 74 20 66 72 6f 6d  a subscript from
5a90: 20 61 20 73 65 70 61 72 61 74 65 20 66 69 6c 65   a separate file
5aa0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
5ab0: 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 73   strcmp(zCmd, "s
5ac0: 6f 75 72 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20  ource")==0 ){.  
5ad0: 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 46 69      char *zNewFi
5ae0: 6c 65 2c 20 2a 7a 4e 65 77 53 63 72 69 70 74 3b  le, *zNewScript;
5af0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f  .      char *zTo
5b00: 44 65 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a  Del = 0;.      z
5b10: 4e 65 77 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b  NewFile = azArg[
5b20: 30 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e  0];.      if( zN
5b30: 65 77 46 69 6c 65 5b 30 5d 21 3d 27 2f 27 20 29  ewFile[0]!='/' )
5b40: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b  {.        int k;
5b50: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 28  .        for(k=(
5b60: 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65  int)strlen(zFile
5b70: 6e 61 6d 65 29 2d 31 3b 20 6b 3e 3d 30 20 26 26  name)-1; k>=0 &&
5b80: 20 7a 46 69 6c 65 6e 61 6d 65 5b 6b 5d 21 3d 27   zFilename[k]!='
5b90: 2f 27 3b 20 6b 2d 2d 29 7b 7d 0a 20 20 20 20 20  /'; k--){}.     
5ba0: 20 20 20 69 66 28 20 6b 3e 30 20 29 7b 0a 20 20     if( k>0 ){.  
5bb0: 20 20 20 20 20 20 20 20 7a 4e 65 77 46 69 6c 65          zNewFile
5bc0: 20 3d 20 7a 54 6f 44 65 6c 20 3d 20 73 71 6c 69   = zToDel = sqli
5bd0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 2e 2a  te3_mprintf("%.*
5be0: 73 2f 25 73 22 2c 20 6b 2c 7a 46 69 6c 65 6e 61  s/%s", k,zFilena
5bf0: 6d 65 2c 7a 4e 65 77 46 69 6c 65 29 3b 0a 20 20  me,zNewFile);.  
5c00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
5c10: 20 20 20 20 20 20 7a 4e 65 77 53 63 72 69 70 74        zNewScript
5c20: 20 3d 20 72 65 61 64 46 69 6c 65 28 7a 4e 65 77   = readFile(zNew
5c30: 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28  File);.      if(
5c40: 20 67 2e 69 54 72 61 63 65 20 29 20 6c 6f 67 4d   g.iTrace ) logM
5c50: 65 73 73 61 67 65 28 22 62 65 67 69 6e 20 73 63  essage("begin sc
5c60: 72 69 70 74 20 5b 25 73 5d 5c 6e 22 2c 20 7a 4e  ript [%s]\n", zN
5c70: 65 77 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 72  ewFile);.      r
5c80: 75 6e 53 63 72 69 70 74 28 30 2c 20 30 2c 20 7a  unScript(0, 0, z
5c90: 4e 65 77 53 63 72 69 70 74 2c 20 7a 4e 65 77 46  NewScript, zNewF
5ca0: 69 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ile);.      sqli
5cb0: 74 65 33 5f 66 72 65 65 28 7a 4e 65 77 53 63 72  te3_free(zNewScr
5cc0: 69 70 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ipt);.      if( 
5cd0: 67 2e 69 54 72 61 63 65 20 29 20 6c 6f 67 4d 65  g.iTrace ) logMe
5ce0: 73 73 61 67 65 28 22 65 6e 64 20 73 63 72 69 70  ssage("end scrip
5cf0: 74 20 5b 25 73 5d 5c 6e 22 2c 20 7a 4e 65 77 46  t [%s]\n", zNewF
5d00: 69 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ile);.      sqli
5d10: 74 65 33 5f 66 72 65 65 28 7a 54 6f 44 65 6c 29  te3_free(zToDel)
5d20: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20  ;.    }else..   
5d30: 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 2d 2d 70 72   /*.    **  --pr
5d40: 69 6e 74 20 4d 45 53 53 41 47 45 2e 2e 2e 2e 0a  int MESSAGE.....
5d50: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 4f 75      **.    ** Ou
5d60: 74 70 75 74 20 74 68 65 20 72 65 6d 61 69 6e 64  tput the remaind
5d70: 65 72 20 6f 66 20 74 68 65 20 6c 69 6e 65 20 74  er of the line t
5d80: 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 0a 20  o the log file. 
5d90: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74     */.    if( st
5da0: 72 63 6d 70 28 7a 43 6d 64 2c 20 22 70 72 69 6e  rcmp(zCmd, "prin
5db0: 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
5dc0: 69 6e 74 20 6a 6a 3b 0a 20 20 20 20 20 20 66 6f  int jj;.      fo
5dd0: 72 28 6a 6a 3d 37 3b 20 6a 6a 3c 6c 65 6e 20 26  r(jj=7; jj<len &
5de0: 26 20 69 73 73 70 61 63 65 28 7a 53 63 72 69 70  & isspace(zScrip
5df0: 74 5b 69 69 2b 6a 6a 5d 29 3b 20 6a 6a 2b 2b 29  t[ii+jj]); jj++)
5e00: 7b 7d 0a 20 20 20 20 20 20 6c 6f 67 4d 65 73 73  {}.      logMess
5e10: 61 67 65 28 22 25 2e 2a 73 22 2c 20 6c 65 6e 2d  age("%.*s", len-
5e20: 6a 6a 2c 20 7a 53 63 72 69 70 74 2b 69 69 2b 6a  jj, zScript+ii+j
5e30: 6a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20  j);.    }else.. 
5e40: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 2d 2d     /*.    **  --
5e50: 69 66 20 45 58 50 52 0a 20 20 20 20 2a 2a 0a 20  if EXPR.    **. 
5e60: 20 20 20 2a 2a 20 53 6b 69 70 20 66 6f 72 77 61     ** Skip forwa
5e70: 72 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d  rd to the next m
5e80: 61 74 63 68 69 6e 67 20 2d 2d 65 6e 64 69 66 20  atching --endif 
5e90: 6f 72 20 2d 2d 65 6c 73 65 20 69 66 20 45 58 50  or --else if EXP
5ea0: 52 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20  R is false..    
5eb0: 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  */.    if( strcm
5ec0: 70 28 7a 43 6d 64 2c 20 22 69 66 22 29 3d 3d 30  p(zCmd, "if")==0
5ed0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 6a   ){.      int jj
5ee0: 2c 20 72 63 3b 0a 20 20 20 20 20 20 73 71 6c 69  , rc;.      sqli
5ef0: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
5f00: 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 34 3b  .      for(jj=4;
5f10: 20 6a 6a 3c 6c 65 6e 20 26 26 20 69 73 73 70 61   jj<len && isspa
5f20: 63 65 28 7a 53 63 72 69 70 74 5b 69 69 2b 6a 6a  ce(zScript[ii+jj
5f30: 5d 29 3b 20 6a 6a 2b 2b 29 7b 7d 0a 20 20 20 20  ]); jj++){}.    
5f40: 20 20 70 53 74 6d 74 20 3d 20 70 72 65 70 61 72    pStmt = prepar
5f50: 65 53 71 6c 28 22 53 45 4c 45 43 54 20 25 2e 2a  eSql("SELECT %.*
5f60: 73 22 2c 20 6c 65 6e 2d 6a 6a 2c 20 7a 53 63 72  s", len-jj, zScr
5f70: 69 70 74 2b 69 69 2b 6a 6a 29 3b 0a 20 20 20 20  ipt+ii+jj);.    
5f80: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
5f90: 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  tep(pStmt);.    
5fa0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5fb0: 5f 52 4f 57 20 7c 7c 20 73 71 6c 69 74 65 33 5f  _ROW || sqlite3_
5fc0: 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
5fd0: 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 0)==0 ){.     
5fe0: 20 20 20 69 69 20 2b 3d 20 66 69 6e 64 45 6e 64     ii += findEnd
5ff0: 69 66 28 7a 53 63 72 69 70 74 2b 69 69 2b 6c 65  if(zScript+ii+le
6000: 6e 2c 20 31 2c 20 26 6c 69 6e 65 6e 6f 29 3b 0a  n, 1, &lineno);.
6010: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
6020: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
6030: 53 74 6d 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Stmt);.    }else
6040: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
6050: 20 2d 2d 65 6c 73 65 0a 20 20 20 20 2a 2a 0a 20   --else.    **. 
6060: 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61     ** This comma
6070: 6e 64 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 65  nd can only be e
6080: 6e 63 6f 75 6e 74 65 72 65 64 20 69 66 20 63 75  ncountered if cu
6090: 72 72 65 6e 74 6c 79 20 69 6e 73 69 64 65 20 61  rrently inside a
60a0: 6e 20 2d 2d 69 66 20 74 68 61 74 0a 20 20 20 20  n --if that.    
60b0: 2a 2a 20 69 73 20 74 72 75 65 2e 20 20 53 6b 69  ** is true.  Ski
60c0: 70 20 66 6f 72 77 61 72 64 20 74 6f 20 74 68 65  p forward to the
60d0: 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20 2d   next matching -
60e0: 2d 65 6e 64 69 66 2e 0a 20 20 20 20 2a 2f 0a 20  -endif..    */. 
60f0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43     if( strcmp(zC
6100: 6d 64 2c 20 22 65 6c 73 65 22 29 3d 3d 30 20 29  md, "else")==0 )
6110: 7b 0a 20 20 20 20 20 20 69 69 20 2b 3d 20 66 69  {.      ii += fi
6120: 6e 64 45 6e 64 69 66 28 7a 53 63 72 69 70 74 2b  ndEndif(zScript+
6130: 69 69 2b 6c 65 6e 2c 20 30 2c 20 26 6c 69 6e 65  ii+len, 0, &line
6140: 6e 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 0a  no);.    }else..
6150: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 2d      /*.    **  -
6160: 2d 65 6e 64 69 66 0a 20 20 20 20 2a 2a 0a 20 20  -endif.    **.  
6170: 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e    ** This comman
6180: 64 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 65 6e  d can only be en
6190: 63 6f 75 6e 74 65 72 65 64 20 69 66 20 63 75 72  countered if cur
61a0: 72 65 6e 74 6c 79 20 69 6e 73 69 64 65 20 61 6e  rently inside an
61b0: 20 2d 2d 69 66 20 74 68 61 74 0a 20 20 20 20 2a   --if that.    *
61c0: 2a 20 69 73 20 74 72 75 65 20 6f 72 20 61 6e 20  * is true or an 
61d0: 2d 2d 65 6c 73 65 20 6f 66 20 61 20 66 61 6c 73  --else of a fals
61e0: 65 20 69 66 2e 20 20 54 68 69 73 20 69 73 20 61  e if.  This is a
61f0: 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a 20   no-op..    */. 
6200: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43     if( strcmp(zC
6210: 6d 64 2c 20 22 65 6e 64 69 66 22 29 3d 3d 30 20  md, "endif")==0 
6220: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f  ){.      /* no-o
6230: 70 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 0a 0a  p */.    }else..
6240: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 2d      /*.    **  -
6250: 2d 73 74 61 72 74 20 43 4c 49 45 4e 54 0a 20 20  -start CLIENT.  
6260: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 74 61 72    **.    ** Star
6270: 74 20 75 70 20 74 68 65 20 67 69 76 65 6e 20 63  t up the given c
6280: 6c 69 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  lient..    */.  
6290: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d    if( strcmp(zCm
62a0: 64 2c 20 22 73 74 61 72 74 22 29 3d 3d 30 20 26  d, "start")==0 &
62b0: 26 20 69 43 6c 69 65 6e 74 3d 3d 30 20 29 7b 0a  & iClient==0 ){.
62c0: 20 20 20 20 20 20 69 6e 74 20 69 4e 65 77 43 6c        int iNewCl
62d0: 69 65 6e 74 20 3d 20 61 74 6f 69 28 61 7a 41 72  ient = atoi(azAr
62e0: 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  g[0]);.      if(
62f0: 20 69 4e 65 77 43 6c 69 65 6e 74 3e 30 20 29 7b   iNewClient>0 ){
6300: 0a 20 20 20 20 20 20 20 20 73 74 61 72 74 43 6c  .        startCl
6310: 69 65 6e 74 28 69 4e 65 77 43 6c 69 65 6e 74 29  ient(iNewClient)
6320: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
6330: 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  lse..    /*.    
6340: 2a 2a 20 20 2d 2d 77 61 69 74 20 43 4c 49 45 4e  **  --wait CLIEN
6350: 54 20 54 49 4d 45 4f 55 54 0a 20 20 20 20 2a 2a  T TIMEOUT.    **
6360: 0a 20 20 20 20 2a 2a 20 57 61 69 74 20 75 6e 74  .    ** Wait unt
6370: 69 6c 20 61 6c 6c 20 74 61 73 6b 73 20 63 6f 6d  il all tasks com
6380: 70 6c 65 74 65 20 66 6f 72 20 74 68 65 20 67 69  plete for the gi
6390: 76 65 6e 20 63 6c 69 65 6e 74 2e 20 20 49 66 20  ven client.  If 
63a0: 43 4c 49 45 4e 54 20 69 73 0a 20 20 20 20 2a 2a  CLIENT is.    **
63b0: 20 22 61 6c 6c 22 20 74 68 65 6e 20 77 61 69 74   "all" then wait
63c0: 20 66 6f 72 20 61 6c 6c 20 63 6c 69 65 6e 74 73   for all clients
63d0: 20 74 6f 20 63 6f 6d 70 6c 65 74 65 2e 20 20 57   to complete.  W
63e0: 61 69 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 68  ait no longer th
63f0: 61 6e 0a 20 20 20 20 2a 2a 20 54 49 4d 45 4f 55  an.    ** TIMEOU
6400: 54 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 28  T milliseconds (
6410: 64 65 66 61 75 6c 74 20 31 30 2c 30 30 30 29 0a  default 10,000).
6420: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
6430: 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 77 61 69  trcmp(zCmd, "wai
6440: 74 22 29 3d 3d 30 20 26 26 20 69 43 6c 69 65 6e  t")==0 && iClien
6450: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  t==0 ){.      in
6460: 74 20 69 54 69 6d 65 6f 75 74 20 3d 20 6e 41 72  t iTimeout = nAr
6470: 67 3e 3d 32 20 3f 20 61 74 6f 69 28 61 7a 41 72  g>=2 ? atoi(azAr
6480: 67 5b 31 5d 29 20 3a 20 31 30 30 30 30 3b 0a 20  g[1]) : 10000;. 
6490: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
64a0: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 45 72  rintf(sizeof(zEr
64b0: 72 6f 72 29 2c 7a 45 72 72 6f 72 2c 22 6c 69 6e  ror),zError,"lin
64c0: 65 20 25 64 20 6f 66 20 25 73 5c 6e 22 2c 0a 20  e %d of %s\n",. 
64d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64e0: 20 20 20 20 20 20 70 72 65 76 4c 69 6e 65 2c 20        prevLine, 
64f0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
6500: 20 20 77 61 69 74 46 6f 72 43 6c 69 65 6e 74 28    waitForClient(
6510: 61 74 6f 69 28 61 7a 41 72 67 5b 30 5d 29 2c 20  atoi(azArg[0]), 
6520: 69 54 69 6d 65 6f 75 74 2c 20 7a 45 72 72 6f 72  iTimeout, zError
6530: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20  );.    }else..  
6540: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 2d 2d 74    /*.    **  --t
6550: 61 73 6b 20 43 4c 49 45 4e 54 0a 20 20 20 20 2a  ask CLIENT.    *
6560: 2a 20 20 20 20 20 3c 74 61 73 6b 2d 63 6f 6e 74  *     <task-cont
6570: 65 6e 74 2d 68 65 72 65 3e 0a 20 20 20 20 2a 2a  ent-here>.    **
6580: 20 20 2d 2d 65 6e 64 0a 20 20 20 20 2a 2a 0a 20    --end.    **. 
6590: 20 20 20 2a 2a 20 41 73 73 69 67 6e 20 77 6f 72     ** Assign wor
65a0: 6b 20 74 6f 20 61 20 63 6c 69 65 6e 74 2e 20 20  k to a client.  
65b0: 53 74 61 72 74 20 74 68 65 20 63 6c 69 65 6e 74  Start the client
65c0: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 72 75   if it is not ru
65d0: 6e 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6c 72  nning.    ** alr
65e0: 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eady..    */.   
65f0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64   if( strcmp(zCmd
6600: 2c 20 22 74 61 73 6b 22 29 3d 3d 30 20 26 26 20  , "task")==0 && 
6610: 69 43 6c 69 65 6e 74 3d 3d 30 20 29 7b 0a 20 20  iClient==0 ){.  
6620: 20 20 20 20 69 6e 74 20 69 54 61 72 67 65 74 20      int iTarget 
6630: 3d 20 61 74 6f 69 28 61 7a 41 72 67 5b 30 5d 29  = atoi(azArg[0])
6640: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 45 6e 64  ;.      int iEnd
6650: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54  ;.      char *zT
6660: 61 73 6b 3b 0a 20 20 20 20 20 20 69 45 6e 64 20  ask;.      iEnd 
6670: 3d 20 66 69 6e 64 45 6e 64 28 7a 53 63 72 69 70  = findEnd(zScrip
6680: 74 2b 69 69 2b 6c 65 6e 2c 20 26 6c 69 6e 65 6e  t+ii+len, &linen
6690: 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54  o);.      if( iT
66a0: 61 72 67 65 74 3c 30 20 29 7b 0a 20 20 20 20 20  arget<0 ){.     
66b0: 20 20 20 65 72 72 6f 72 4d 65 73 73 61 67 65 28     errorMessage(
66c0: 22 6c 69 6e 65 20 25 64 20 6f 66 20 25 73 3a 20  "line %d of %s: 
66d0: 62 61 64 20 63 6c 69 65 6e 74 20 6e 75 6d 62 65  bad client numbe
66e0: 72 3a 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20  r: %d",.        
66f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65               pre
6700: 76 4c 69 6e 65 2c 20 7a 46 69 6c 65 6e 61 6d 65  vLine, zFilename
6710: 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20  , iTarget);.    
6720: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6730: 20 7a 54 61 73 6b 20 3d 20 73 71 6c 69 74 65 33   zTask = sqlite3
6740: 5f 6d 70 72 69 6e 74 66 28 22 25 2e 2a 73 22 2c  _mprintf("%.*s",
6750: 20 69 45 6e 64 2c 20 7a 53 63 72 69 70 74 2b 69   iEnd, zScript+i
6760: 69 2b 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20  i+len);.        
6770: 73 74 61 72 74 43 6c 69 65 6e 74 28 69 54 61 72  startClient(iTar
6780: 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72 75  get);.        ru
6790: 6e 53 71 6c 28 22 49 4e 53 45 52 54 20 49 4e 54  nSql("INSERT INT
67a0: 4f 20 74 61 73 6b 28 63 6c 69 65 6e 74 2c 73 63  O task(client,sc
67b0: 72 69 70 74 29 22 0a 20 20 20 20 20 20 20 20 20  ript)".         
67c0: 20 20 20 20 20 20 22 20 56 41 4c 55 45 53 28 25        " VALUES(%
67d0: 64 2c 27 25 71 27 29 22 2c 20 69 54 61 72 67 65  d,'%q')", iTarge
67e0: 74 2c 20 7a 54 61 73 6b 29 3b 0a 20 20 20 20 20  t, zTask);.     
67f0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
6800: 7a 54 61 73 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  zTask);.      }.
6810: 20 20 20 20 20 20 69 45 6e 64 20 2b 3d 20 74 6f        iEnd += to
6820: 6b 65 6e 4c 65 6e 67 74 68 28 7a 53 63 72 69 70  kenLength(zScrip
6830: 74 2b 69 69 2b 6c 65 6e 2b 69 45 6e 64 2c 20 26  t+ii+len+iEnd, &
6840: 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 6c  lineno);.      l
6850: 65 6e 20 2b 3d 20 69 45 6e 64 3b 0a 20 20 20 20  en += iEnd;.    
6860: 20 20 69 42 65 67 69 6e 20 3d 20 69 69 2b 6c 65    iBegin = ii+le
6870: 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20  n;.    }else..  
6880: 20 20 2f 2a 20 65 72 72 6f 72 20 2a 2f 7b 0a 20    /* error */{. 
6890: 20 20 20 20 20 65 72 72 6f 72 4d 65 73 73 61 67       errorMessag
68a0: 65 28 22 6c 69 6e 65 20 25 64 20 6f 66 20 25 73  e("line %d of %s
68b0: 3a 20 75 6e 6b 6e 6f 77 6e 20 63 6f 6d 6d 61 6e  : unknown comman
68c0: 64 20 2d 2d 25 73 22 2c 0a 20 20 20 20 20 20 20  d --%s",.       
68d0: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65 76              prev
68e0: 4c 69 6e 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  Line, zFilename,
68f0: 20 7a 43 6d 64 29 3b 0a 20 20 20 20 7d 0a 20 20   zCmd);.    }.  
6900: 20 20 69 69 20 2b 3d 20 6c 65 6e 3b 0a 20 20 7d    ii += len;.  }
6910: 0a 20 20 69 66 28 20 69 42 65 67 69 6e 3c 69 69  .  if( iBegin<ii
6920: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   ){.    char *zS
6930: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
6940: 69 6e 74 66 28 22 25 2e 2a 73 22 2c 20 69 69 2d  intf("%.*s", ii-
6950: 69 42 65 67 69 6e 2c 20 7a 53 63 72 69 70 74 2b  iBegin, zScript+
6960: 69 42 65 67 69 6e 29 3b 0a 20 20 20 20 72 75 6e  iBegin);.    run
6970: 53 71 6c 28 7a 53 71 6c 29 3b 0a 20 20 20 20 73  Sql(zSql);.    s
6980: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
6990: 29 3b 0a 20 20 7d 0a 20 20 73 74 72 69 6e 67 46  );.  }.  stringF
69a0: 72 65 65 28 26 73 52 65 73 75 6c 74 29 3b 0a 7d  ree(&sResult);.}
69b0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 66 6f 72  ../*.** Look for
69c0: 20 61 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20   a command-line 
69d0: 6f 70 74 69 6f 6e 2e 20 20 49 66 20 70 72 65 73  option.  If pres
69e0: 65 6e 74 2c 20 72 65 74 75 72 6e 20 61 20 70 6f  ent, return a po
69f0: 69 6e 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e  inter..** Return
6a00: 20 4e 55 4c 4c 20 69 66 20 6d 69 73 73 69 6e 67   NULL if missing
6a10: 2e 0a 2a 2a 0a 2a 2a 20 68 61 73 41 72 67 3d 3d  ..**.** hasArg==
6a20: 30 20 6d 65 61 6e 73 20 74 68 65 20 6f 70 74 69  0 means the opti
6a30: 6f 6e 20 69 73 20 61 20 66 6c 61 67 2e 20 20 49  on is a flag.  I
6a40: 74 20 69 73 20 65 69 74 68 65 72 20 70 72 65 73  t is either pres
6a50: 65 6e 74 20 6f 72 20 6e 6f 74 2e 0a 2a 2a 20 68  ent or not..** h
6a60: 61 73 41 72 67 3d 3d 31 20 6d 65 61 6e 73 20 74  asArg==1 means t
6a70: 68 65 20 6f 70 74 69 6f 6e 20 68 61 73 20 61 6e  he option has an
6a80: 20 61 72 67 75 6d 65 6e 74 2e 20 20 52 65 74 75   argument.  Retu
6a90: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
6aa0: 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  the.** argument.
6ab0: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
6ac0: 2a 66 69 6e 64 4f 70 74 69 6f 6e 28 0a 20 20 63  *findOption(.  c
6ad0: 68 61 72 20 2a 2a 61 7a 41 72 67 2c 0a 20 20 69  har **azArg,.  i
6ae0: 6e 74 20 2a 70 6e 41 72 67 2c 0a 20 20 63 6f 6e  nt *pnArg,.  con
6af0: 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 69 6f 6e  st char *zOption
6b00: 2c 0a 20 20 69 6e 74 20 68 61 73 41 72 67 0a 29  ,.  int hasArg.)
6b10: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
6b20: 63 68 61 72 20 2a 7a 52 65 74 75 72 6e 20 3d 20  char *zReturn = 
6b30: 30 3b 0a 20 20 69 6e 74 20 6e 41 72 67 20 3d 20  0;.  int nArg = 
6b40: 2a 70 6e 41 72 67 3b 0a 0a 20 20 61 73 73 65 72  *pnArg;..  asser
6b50: 74 28 20 68 61 73 41 72 67 3d 3d 30 20 7c 7c 20  t( hasArg==0 || 
6b60: 68 61 73 41 72 67 3d 3d 31 20 29 3b 0a 20 20 66  hasArg==1 );.  f
6b70: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
6b80: 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  i++){.    const 
6b90: 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28  char *z;.    if(
6ba0: 20 69 2b 68 61 73 41 72 67 20 3e 3d 20 6e 41 72   i+hasArg >= nAr
6bb0: 67 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7a  g ) break;.    z
6bc0: 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20   = azArg[i];.   
6bd0: 20 69 66 28 20 7a 5b 30 5d 21 3d 27 2d 27 20 29   if( z[0]!='-' )
6be0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a   continue;.    z
6bf0: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d  ++;.    if( z[0]
6c00: 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 69  =='-' ){.      i
6c10: 66 28 20 7a 5b 31 5d 3d 3d 30 20 29 20 62 72 65  f( z[1]==0 ) bre
6c20: 61 6b 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20  ak;.      z++;. 
6c30: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72     }.    if( str
6c40: 63 6d 70 28 7a 2c 7a 4f 70 74 69 6f 6e 29 3d 3d  cmp(z,zOption)==
6c50: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68  0 ){.      if( h
6c60: 61 73 41 72 67 20 26 26 20 69 3d 3d 6e 41 72 67  asArg && i==nArg
6c70: 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 66 61  -1 ){.        fa
6c80: 74 61 6c 45 72 72 6f 72 28 22 63 6f 6d 6d 61 6e  talError("comman
6c90: 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 5c 22  d-line option \"
6ca0: 2d 2d 25 73 5c 22 20 72 65 71 75 69 72 65 73 20  --%s\" requires 
6cb0: 61 6e 20 61 72 67 75 6d 65 6e 74 22 2c 20 7a 29  an argument", z)
6cc0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6cd0: 69 66 28 20 68 61 73 41 72 67 20 29 7b 0a 20 20  if( hasArg ){.  
6ce0: 20 20 20 20 20 20 7a 52 65 74 75 72 6e 20 3d 20        zReturn = 
6cf0: 61 7a 41 72 67 5b 69 2b 31 5d 3b 0a 20 20 20 20  azArg[i+1];.    
6d00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6d10: 20 7a 52 65 74 75 72 6e 20 3d 20 61 7a 41 72 67   zReturn = azArg
6d20: 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [i];.      }.   
6d30: 20 20 20 6a 20 3d 20 69 2b 31 2b 28 68 61 73 41     j = i+1+(hasA
6d40: 72 67 21 3d 30 29 3b 0a 20 20 20 20 20 20 77 68  rg!=0);.      wh
6d50: 69 6c 65 28 20 6a 3c 6e 41 72 67 20 29 20 61 7a  ile( j<nArg ) az
6d60: 41 72 67 5b 69 2b 2b 5d 20 3d 20 61 7a 41 72 67  Arg[i++] = azArg
6d70: 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 2a 70 6e  [j++];.      *pn
6d80: 41 72 67 20 3d 20 69 3b 0a 20 20 20 20 20 20 72  Arg = i;.      r
6d90: 65 74 75 72 6e 20 7a 52 65 74 75 72 6e 3b 0a 20  eturn zReturn;. 
6da0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
6db0: 6e 20 7a 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a  n zReturn;.}../*
6dc0: 20 50 72 69 6e 74 20 61 20 75 73 61 67 65 20 6d   Print a usage m
6dd0: 65 73 73 61 67 65 20 66 6f 72 20 74 68 65 20 70  essage for the p
6de0: 72 6f 67 72 61 6d 20 61 6e 64 20 65 78 69 74 20  rogram and exit 
6df0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
6e00: 73 61 67 65 28 63 6f 6e 73 74 20 63 68 61 72 20  sage(const char 
6e10: 2a 61 72 67 76 30 29 7b 0a 20 20 69 6e 74 20 69  *argv0){.  int i
6e20: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
6e30: 7a 54 61 69 6c 20 3d 20 61 72 67 76 30 3b 0a 20  zTail = argv0;. 
6e40: 20 66 6f 72 28 69 3d 30 3b 20 61 72 67 76 30 5b   for(i=0; argv0[
6e50: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  i]; i++){.    if
6e60: 28 20 61 72 67 76 30 5b 69 5d 3d 3d 27 2f 27 20  ( argv0[i]=='/' 
6e70: 29 20 7a 54 61 69 6c 20 3d 20 61 72 67 76 30 2b  ) zTail = argv0+
6e80: 69 2b 31 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e  i+1;.  }.  fprin
6e90: 74 66 28 73 74 64 65 72 72 2c 22 55 73 61 67 65  tf(stderr,"Usage
6ea0: 3a 20 25 73 20 44 41 54 41 42 41 53 45 20 3f 4f  : %s DATABASE ?O
6eb0: 50 54 49 4f 4e 53 3f 20 3f 53 43 52 49 50 54 3f  PTIONS? ?SCRIPT?
6ec0: 5c 6e 22 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 65  \n", zTail);.  e
6ed0: 78 69 74 28 31 29 3b 0a 7d 0a 0a 2f 2a 20 52 65  xit(1);.}../* Re
6ee0: 70 6f 72 74 20 6f 6e 20 75 6e 72 65 63 6f 67 6e  port on unrecogn
6ef0: 69 7a 65 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  ized arguments *
6f00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
6f10: 72 65 63 6f 67 6e 69 7a 65 64 41 72 67 75 6d 65  recognizedArgume
6f20: 6e 74 73 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  nts(.  const cha
6f30: 72 20 2a 61 72 67 76 30 2c 0a 20 20 69 6e 74 20  r *argv0,.  int 
6f40: 6e 41 72 67 2c 0a 20 20 63 68 61 72 20 2a 2a 61  nArg,.  char **a
6f50: 7a 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  zArg.){.  int i;
6f60: 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72  .  fprintf(stder
6f70: 72 2c 22 25 73 3a 20 75 6e 72 65 63 6f 67 6e 69  r,"%s: unrecogni
6f80: 7a 65 64 20 61 72 67 75 6d 65 6e 74 73 3a 22 2c  zed arguments:",
6f90: 20 61 72 67 76 30 29 3b 0a 20 20 66 6f 72 28 69   argv0);.  for(i
6fa0: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
6fb0: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
6fc0: 64 65 72 72 2c 22 20 25 73 22 2c 20 61 7a 41 72  derr," %s", azAr
6fd0: 67 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 70 72  g[i]);.  }.  fpr
6fe0: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 5c 6e 22  intf(stderr,"\n"
6ff0: 29 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a  );.  exit(1);.}.
7000: 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72  .int main(int ar
7010: 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29  gc, char **argv)
7020: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
7030: 7a 43 6c 69 65 6e 74 3b 0a 20 20 69 6e 74 20 69  zClient;.  int i
7040: 43 6c 69 65 6e 74 3b 0a 20 20 69 6e 74 20 6e 2c  Client;.  int n,
7050: 20 69 3b 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c   i;.  int openFl
7060: 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ags = SQLITE_OPE
7070: 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 69  N_READWRITE;.  i
7080: 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a  nt rc;.  char *z
7090: 53 63 72 69 70 74 3b 0a 20 20 69 6e 74 20 74 61  Script;.  int ta
70a0: 73 6b 49 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68  skId;.  const ch
70b0: 61 72 20 2a 7a 54 72 61 63 65 3b 0a 20 20 63 6f  ar *zTrace;.  co
70c0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 4f 70 74 69  nst char *zCOpti
70d0: 6f 6e 3b 0a 0a 20 20 67 2e 61 72 67 76 30 20 3d  on;..  g.argv0 =
70e0: 20 61 72 67 76 5b 30 5d 3b 0a 20 20 67 2e 69 54   argv[0];.  g.iT
70f0: 72 61 63 65 20 3d 20 31 3b 0a 20 20 69 66 28 20  race = 1;.  if( 
7100: 61 72 67 63 3c 32 20 29 20 75 73 61 67 65 28 61  argc<2 ) usage(a
7110: 72 67 76 5b 30 5d 29 3b 0a 20 20 67 2e 7a 44 62  rgv[0]);.  g.zDb
7120: 46 69 6c 65 20 3d 20 61 72 67 76 5b 31 5d 3b 0a  File = argv[1];.
7130: 20 20 69 66 28 20 73 74 72 67 6c 6f 62 28 22 2a    if( strglob("*
7140: 2e 74 65 73 74 22 2c 20 67 2e 7a 44 62 46 69 6c  .test", g.zDbFil
7150: 65 29 20 29 20 75 73 61 67 65 28 61 72 67 76 5b  e) ) usage(argv[
7160: 30 5d 29 3b 0a 20 20 69 66 28 20 73 74 72 63 6d  0]);.  if( strcm
7170: 70 28 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65  p(sqlite3_source
7180: 69 64 28 29 2c 20 53 51 4c 49 54 45 5f 53 4f 55  id(), SQLITE_SOU
7190: 52 43 45 5f 49 44 29 21 3d 30 20 29 7b 0a 20 20  RCE_ID)!=0 ){.  
71a0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
71b0: 2c 20 22 53 51 4c 69 74 65 20 6c 69 62 72 61 72  , "SQLite librar
71c0: 79 20 61 6e 64 20 68 65 61 64 65 72 20 6d 69 73  y and header mis
71d0: 6d 61 74 63 68 5c 6e 22 0a 20 20 20 20 20 20 20  match\n".       
71e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4c 69               "Li
71f0: 62 72 61 72 79 3a 20 25 73 5c 6e 22 0a 20 20 20  brary: %s\n".   
7200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7210: 20 22 48 65 61 64 65 72 3a 20 20 25 73 5c 6e 22   "Header:  %s\n"
7220: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
7230: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6f        sqlite3_so
7240: 75 72 63 65 69 64 28 29 2c 20 53 51 4c 49 54 45  urceid(), SQLITE
7250: 5f 53 4f 55 52 43 45 5f 49 44 29 3b 0a 20 20 20  _SOURCE_ID);.   
7260: 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20   exit(1);.  }.  
7270: 6e 20 3d 20 61 72 67 63 2d 32 3b 0a 20 20 73 71  n = argc-2;.  sq
7280: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
7290: 69 7a 65 6f 66 28 67 2e 7a 4e 61 6d 65 29 2c 20  izeof(g.zName), 
72a0: 67 2e 7a 4e 61 6d 65 2c 20 22 6d 70 74 65 73 74  g.zName, "mptest
72b0: 22 29 3b 0a 20 20 67 2e 7a 56 66 73 20 3d 20 66  ");.  g.zVfs = f
72c0: 69 6e 64 4f 70 74 69 6f 6e 28 61 72 67 76 2b 32  indOption(argv+2
72d0: 2c 20 26 6e 2c 20 22 76 66 73 22 2c 20 31 29 3b  , &n, "vfs", 1);
72e0: 0a 20 20 7a 43 6c 69 65 6e 74 20 3d 20 66 69 6e  .  zClient = fin
72f0: 64 4f 70 74 69 6f 6e 28 61 72 67 76 2b 32 2c 20  dOption(argv+2, 
7300: 26 6e 2c 20 22 63 6c 69 65 6e 74 22 2c 20 31 29  &n, "client", 1)
7310: 3b 0a 20 20 67 2e 7a 45 72 72 4c 6f 67 20 3d 20  ;.  g.zErrLog = 
7320: 66 69 6e 64 4f 70 74 69 6f 6e 28 61 72 67 76 2b  findOption(argv+
7330: 32 2c 20 26 6e 2c 20 22 65 72 72 6c 6f 67 22 2c  2, &n, "errlog",
7340: 20 31 29 3b 0a 20 20 67 2e 7a 4c 6f 67 20 3d 20   1);.  g.zLog = 
7350: 66 69 6e 64 4f 70 74 69 6f 6e 28 61 72 67 76 2b  findOption(argv+
7360: 32 2c 20 26 6e 2c 20 22 6c 6f 67 22 2c 20 31 29  2, &n, "log", 1)
7370: 3b 0a 20 20 7a 54 72 61 63 65 20 3d 20 66 69 6e  ;.  zTrace = fin
7380: 64 4f 70 74 69 6f 6e 28 61 72 67 76 2b 32 2c 20  dOption(argv+2, 
7390: 26 6e 2c 20 22 74 72 61 63 65 22 2c 20 31 29 3b  &n, "trace", 1);
73a0: 0a 20 20 69 66 28 20 7a 54 72 61 63 65 20 29 20  .  if( zTrace ) 
73b0: 67 2e 69 54 72 61 63 65 20 3d 20 61 74 6f 69 28  g.iTrace = atoi(
73c0: 7a 54 72 61 63 65 29 3b 0a 20 20 69 66 28 20 66  zTrace);.  if( f
73d0: 69 6e 64 4f 70 74 69 6f 6e 28 61 72 67 76 2b 32  indOption(argv+2
73e0: 2c 20 26 6e 2c 20 22 71 75 69 65 74 22 2c 20 30  , &n, "quiet", 0
73f0: 29 21 3d 30 20 29 20 67 2e 69 54 72 61 63 65 20  )!=0 ) g.iTrace 
7400: 3d 20 30 3b 0a 20 20 67 2e 62 53 71 6c 54 72 61  = 0;.  g.bSqlTra
7410: 63 65 20 3d 20 66 69 6e 64 4f 70 74 69 6f 6e 28  ce = findOption(
7420: 61 72 67 76 2b 32 2c 20 26 6e 2c 20 22 73 71 6c  argv+2, &n, "sql
7430: 74 72 61 63 65 22 2c 20 30 29 21 3d 30 3b 0a 20  trace", 0)!=0;. 
7440: 20 67 2e 62 53 79 6e 63 20 3d 20 66 69 6e 64 4f   g.bSync = findO
7450: 70 74 69 6f 6e 28 61 72 67 76 2b 32 2c 20 26 6e  ption(argv+2, &n
7460: 2c 20 22 73 79 6e 63 22 2c 20 30 29 21 3d 30 3b  , "sync", 0)!=0;
7470: 0a 20 20 69 66 28 20 67 2e 7a 45 72 72 4c 6f 67  .  if( g.zErrLog
7480: 20 29 7b 0a 20 20 20 20 67 2e 70 45 72 72 4c 6f   ){.    g.pErrLo
7490: 67 20 3d 20 66 6f 70 65 6e 28 67 2e 7a 45 72 72  g = fopen(g.zErr
74a0: 4c 6f 67 2c 20 22 61 22 29 3b 0a 20 20 7d 65 6c  Log, "a");.  }el
74b0: 73 65 7b 0a 20 20 20 20 67 2e 70 45 72 72 4c 6f  se{.    g.pErrLo
74c0: 67 20 3d 20 73 74 64 65 72 72 3b 0a 20 20 7d 0a  g = stderr;.  }.
74d0: 20 20 69 66 28 20 67 2e 7a 4c 6f 67 20 29 7b 0a    if( g.zLog ){.
74e0: 20 20 20 20 67 2e 70 4c 6f 67 20 3d 20 66 6f 70      g.pLog = fop
74f0: 65 6e 28 67 2e 7a 4c 6f 67 2c 20 22 61 22 29 3b  en(g.zLog, "a");
7500: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 67 2e  .  }else{.    g.
7510: 70 4c 6f 67 20 3d 20 73 74 64 6f 75 74 3b 0a 20  pLog = stdout;. 
7520: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e   }.  sqlite3_con
7530: 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49  fig(SQLITE_CONFI
7540: 47 5f 4c 4f 47 2c 20 73 71 6c 45 72 72 6f 72 43  G_LOG, sqlErrorC
7550: 61 6c 6c 62 61 63 6b 2c 20 30 29 3b 0a 20 20 69  allback, 0);.  i
7560: 66 28 20 7a 43 6c 69 65 6e 74 20 29 7b 0a 20 20  f( zClient ){.  
7570: 20 20 69 43 6c 69 65 6e 74 20 3d 20 61 74 6f 69    iClient = atoi
7580: 28 7a 43 6c 69 65 6e 74 29 3b 0a 20 20 20 20 69  (zClient);.    i
7590: 66 28 20 69 43 6c 69 65 6e 74 3c 31 20 29 20 66  f( iClient<1 ) f
75a0: 61 74 61 6c 45 72 72 6f 72 28 22 69 6c 6c 65 67  atalError("illeg
75b0: 61 6c 20 63 6c 69 65 6e 74 20 6e 75 6d 62 65 72  al client number
75c0: 3a 20 25 64 5c 6e 22 2c 20 69 43 6c 69 65 6e 74  : %d\n", iClient
75d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  );.    sqlite3_s
75e0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 67  nprintf(sizeof(g
75f0: 2e 7a 4e 61 6d 65 29 2c 20 67 2e 7a 4e 61 6d 65  .zName), g.zName
7600: 2c 20 22 63 6c 69 65 6e 74 25 30 32 64 22 2c 20  , "client%02d", 
7610: 69 43 6c 69 65 6e 74 29 3b 0a 20 20 7d 65 6c 73  iClient);.  }els
7620: 65 7b 0a 20 20 20 20 69 66 28 20 67 2e 69 54 72  e{.    if( g.iTr
7630: 61 63 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 70  ace>0 ){.      p
7640: 72 69 6e 74 66 28 22 57 69 74 68 20 53 51 4c 69  rintf("With SQLi
7650: 74 65 20 22 20 53 51 4c 49 54 45 5f 56 45 52 53  te " SQLITE_VERS
7660: 49 4f 4e 20 22 20 22 20 53 51 4c 49 54 45 5f 53  ION " " SQLITE_S
7670: 4f 55 52 43 45 5f 49 44 20 22 5c 6e 22 20 29 3b  OURCE_ID "\n" );
7680: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
7690: 28 7a 43 4f 70 74 69 6f 6e 20 3d 20 73 71 6c 69  (zCOption = sqli
76a0: 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 6f  te3_compileoptio
76b0: 6e 5f 67 65 74 28 69 29 29 21 3d 30 3b 20 69 2b  n_get(i))!=0; i+
76c0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e  +){.        prin
76d0: 74 66 28 22 2d 44 53 51 4c 49 54 45 5f 25 73 5c  tf("-DSQLITE_%s\
76e0: 6e 22 2c 20 7a 43 4f 70 74 69 6f 6e 29 3b 0a 20  n", zCOption);. 
76f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 66 6c       }.      ffl
7700: 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20  ush(stdout);.   
7710: 20 7d 0a 20 20 20 20 69 43 6c 69 65 6e 74 20 3d   }.    iClient =
7720: 20 20 30 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 28    0;.    unlink(
7730: 67 2e 7a 44 62 46 69 6c 65 29 3b 0a 20 20 20 20  g.zDbFile);.    
7740: 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 53 51 4c  openFlags |= SQL
7750: 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b  ITE_OPEN_CREATE;
7760: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
7770: 74 65 33 5f 6f 70 65 6e 5f 76 32 28 67 2e 7a 44  te3_open_v2(g.zD
7780: 62 46 69 6c 65 2c 20 26 67 2e 64 62 2c 20 6f 70  bFile, &g.db, op
7790: 65 6e 46 6c 61 67 73 2c 20 67 2e 7a 56 66 73 29  enFlags, g.zVfs)
77a0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 66 61 74  ;.  if( rc ) fat
77b0: 61 6c 45 72 72 6f 72 28 22 63 61 6e 6e 6f 74 20  alError("cannot 
77c0: 6f 70 65 6e 20 5b 25 73 5d 22 2c 20 67 2e 7a 44  open [%s]", g.zD
77d0: 62 46 69 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65  bFile);.  sqlite
77e0: 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 67  3_busy_handler(g
77f0: 2e 64 62 2c 20 62 75 73 79 48 61 6e 64 6c 65 72  .db, busyHandler
7800: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
7810: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
7820: 67 2e 64 62 2c 20 22 76 66 73 6e 61 6d 65 22 2c  g.db, "vfsname",
7830: 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   0, SQLITE_UTF8,
7840: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
7850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76 66                vf
7860: 73 4e 61 6d 65 46 75 6e 63 2c 20 30 2c 20 30 29  sNameFunc, 0, 0)
7870: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61  ;.  sqlite3_crea
7880: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 67 2e 64 62  te_function(g.db
7890: 2c 20 22 65 76 61 6c 22 2c 20 31 2c 20 53 51 4c  , "eval", 1, SQL
78a0: 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20  ITE_UTF8, 0,.   
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
78c0: 20 20 20 20 20 20 20 65 76 61 6c 46 75 6e 63 2c         evalFunc,
78d0: 20 30 2c 20 30 29 3b 0a 20 20 67 2e 69 54 69 6d   0, 0);.  g.iTim
78e0: 65 6f 75 74 20 3d 20 44 45 46 41 55 4c 54 5f 54  eout = DEFAULT_T
78f0: 49 4d 45 4f 55 54 3b 0a 20 20 69 66 28 20 67 2e  IMEOUT;.  if( g.
7900: 62 53 71 6c 54 72 61 63 65 20 29 20 73 71 6c 69  bSqlTrace ) sqli
7910: 74 65 33 5f 74 72 61 63 65 28 67 2e 64 62 2c 20  te3_trace(g.db, 
7920: 73 71 6c 54 72 61 63 65 43 61 6c 6c 62 61 63 6b  sqlTraceCallback
7930: 2c 20 30 29 3b 0a 20 20 69 66 28 20 21 67 2e 62  , 0);.  if( !g.b
7940: 53 79 6e 63 20 29 20 74 72 79 53 71 6c 28 22 50  Sync ) trySql("P
7950: 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75  RAGMA synchronou
7960: 73 3d 4f 46 46 22 29 3b 0a 20 20 69 66 28 20 69  s=OFF");.  if( i
7970: 43 6c 69 65 6e 74 3e 30 20 29 7b 0a 20 20 20 20  Client>0 ){.    
7980: 69 66 28 20 6e 3e 30 20 29 20 75 6e 72 65 63 6f  if( n>0 ) unreco
7990: 67 6e 69 7a 65 64 41 72 67 75 6d 65 6e 74 73 28  gnizedArguments(
79a0: 61 72 67 76 5b 30 5d 2c 20 6e 2c 20 61 72 67 76  argv[0], n, argv
79b0: 2b 32 29 3b 0a 20 20 20 20 69 66 28 20 67 2e 69  +2);.    if( g.i
79c0: 54 72 61 63 65 20 29 20 6c 6f 67 4d 65 73 73 61  Trace ) logMessa
79d0: 67 65 28 22 73 74 61 72 74 2d 63 6c 69 65 6e 74  ge("start-client
79e0: 22 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 31 29  ");.    while(1)
79f0: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 54 61  {.      char zTa
7a00: 73 6b 4e 61 6d 65 5b 35 30 5d 3b 0a 20 20 20 20  skName[50];.    
7a10: 20 20 72 63 20 3d 20 73 74 61 72 74 53 63 72 69    rc = startScri
7a20: 70 74 28 69 43 6c 69 65 6e 74 2c 20 26 7a 53 63  pt(iClient, &zSc
7a30: 72 69 70 74 2c 20 26 74 61 73 6b 49 64 29 3b 0a  ript, &taskId);.
7a40: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
7a50: 4c 49 54 45 5f 44 4f 4e 45 20 29 20 62 72 65 61  LITE_DONE ) brea
7a60: 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 67 2e 69  k;.      if( g.i
7a70: 54 72 61 63 65 20 29 20 6c 6f 67 4d 65 73 73 61  Trace ) logMessa
7a80: 67 65 28 22 62 65 67 69 6e 20 74 61 73 6b 20 25  ge("begin task %
7a90: 64 22 2c 20 74 61 73 6b 49 64 29 3b 0a 20 20 20  d", taskId);.   
7aa0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
7ab0: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 61 73 6b  ntf(sizeof(zTask
7ac0: 4e 61 6d 65 29 2c 20 7a 54 61 73 6b 4e 61 6d 65  Name), zTaskName
7ad0: 2c 20 22 63 6c 69 65 6e 74 25 30 32 64 2d 74 61  , "client%02d-ta
7ae0: 73 6b 2d 25 64 22 2c 0a 20 20 20 20 20 20 20 20  sk-%d",.        
7af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
7b00: 43 6c 69 65 6e 74 2c 20 74 61 73 6b 49 64 29 3b  Client, taskId);
7b10: 0a 20 20 20 20 20 20 72 75 6e 53 63 72 69 70 74  .      runScript
7b20: 28 69 43 6c 69 65 6e 74 2c 20 74 61 73 6b 49 64  (iClient, taskId
7b30: 2c 20 7a 53 63 72 69 70 74 2c 20 7a 54 61 73 6b  , zScript, zTask
7b40: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Name);.      if(
7b50: 20 67 2e 69 54 72 61 63 65 20 29 20 6c 6f 67 4d   g.iTrace ) logM
7b60: 65 73 73 61 67 65 28 22 65 6e 64 20 74 61 73 6b  essage("end task
7b70: 20 25 64 22 2c 20 74 61 73 6b 49 64 29 3b 0a 20   %d", taskId);. 
7b80: 20 20 20 20 20 66 69 6e 69 73 68 53 63 72 69 70       finishScrip
7b90: 74 28 69 43 6c 69 65 6e 74 2c 20 74 61 73 6b 49  t(iClient, taskI
7ba0: 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  d, 0);.      sql
7bb0: 69 74 65 33 5f 73 6c 65 65 70 28 31 30 29 3b 0a  ite3_sleep(10);.
7bc0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 67 2e      }.    if( g.
7bd0: 69 54 72 61 63 65 20 29 20 6c 6f 67 4d 65 73 73  iTrace ) logMess
7be0: 61 67 65 28 22 65 6e 64 2d 63 6c 69 65 6e 74 22  age("end-client"
7bf0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
7c00: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
7c10: 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 54 69  tmt;.    int iTi
7c20: 6d 65 6f 75 74 3b 0a 20 20 20 20 69 66 28 20 6e  meout;.    if( n
7c30: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 61 74  ==0 ){.      fat
7c40: 61 6c 45 72 72 6f 72 28 22 6d 69 73 73 69 6e 67  alError("missing
7c50: 20 73 63 72 69 70 74 20 66 69 6c 65 6e 61 6d 65   script filename
7c60: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ");.    }.    if
7c70: 28 20 6e 3e 31 20 29 20 75 6e 72 65 63 6f 67 6e  ( n>1 ) unrecogn
7c80: 69 7a 65 64 41 72 67 75 6d 65 6e 74 73 28 61 72  izedArguments(ar
7c90: 67 76 5b 30 5d 2c 20 6e 2c 20 61 72 67 76 2b 32  gv[0], n, argv+2
7ca0: 29 3b 0a 20 20 20 20 72 75 6e 53 71 6c 28 0a 20  );.    runSql(. 
7cb0: 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42       "CREATE TAB
7cc0: 4c 45 20 74 61 73 6b 28 5c 6e 22 0a 20 20 20 20  LE task(\n".    
7cd0: 20 20 22 20 20 69 64 20 49 4e 54 45 47 45 52 20    "  id INTEGER 
7ce0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 5c 6e 22 0a  PRIMARY KEY,\n".
7cf0: 20 20 20 20 20 20 22 20 20 63 6c 69 65 6e 74 20        "  client 
7d00: 49 4e 54 45 47 45 52 2c 5c 6e 22 0a 20 20 20 20  INTEGER,\n".    
7d10: 20 20 22 20 20 73 74 61 72 74 74 69 6d 65 20 44    "  starttime D
7d20: 41 54 45 2c 5c 6e 22 0a 20 20 20 20 20 20 22 20  ATE,\n".      " 
7d30: 20 65 6e 64 74 69 6d 65 20 44 41 54 45 2c 5c 6e   endtime DATE,\n
7d40: 22 0a 20 20 20 20 20 20 22 20 20 73 63 72 69 70  ".      "  scrip
7d50: 74 20 54 45 58 54 5c 6e 22 0a 20 20 20 20 20 20  t TEXT\n".      
7d60: 22 29 3b 22 0a 20 20 20 20 20 20 22 43 52 45 41  ");".      "CREA
7d70: 54 45 20 49 4e 44 45 58 20 74 61 73 6b 5f 69 31  TE INDEX task_i1
7d80: 20 4f 4e 20 74 61 73 6b 28 63 6c 69 65 6e 74 2c   ON task(client,
7d90: 20 73 74 61 72 74 74 69 6d 65 29 3b 5c 6e 22 0a   starttime);\n".
7da0: 20 20 20 20 20 20 22 43 52 45 41 54 45 20 49 4e        "CREATE IN
7db0: 44 45 58 20 74 61 73 6b 5f 69 32 20 4f 4e 20 74  DEX task_i2 ON t
7dc0: 61 73 6b 28 63 6c 69 65 6e 74 2c 20 65 6e 64 74  ask(client, endt
7dd0: 69 6d 65 29 3b 5c 6e 22 0a 20 20 20 20 20 20 22  ime);\n".      "
7de0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 6f 75  CREATE TABLE cou
7df0: 6e 74 65 72 73 28 6e 45 72 72 6f 72 2c 6e 54 65  nters(nError,nTe
7e00: 73 74 29 3b 5c 6e 22 0a 20 20 20 20 20 20 22 49  st);\n".      "I
7e10: 4e 53 45 52 54 20 49 4e 54 4f 20 63 6f 75 6e 74  NSERT INTO count
7e20: 65 72 73 20 56 41 4c 55 45 53 28 30 2c 30 29 3b  ers VALUES(0,0);
7e30: 5c 6e 22 0a 20 20 20 20 20 20 22 43 52 45 41 54  \n".      "CREAT
7e40: 45 20 54 41 42 4c 45 20 63 6c 69 65 6e 74 28 69  E TABLE client(i
7e50: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  d INTEGER PRIMAR
7e60: 59 20 4b 45 59 2c 20 77 61 6e 74 48 61 6c 74 29  Y KEY, wantHalt)
7e70: 3b 5c 6e 22 0a 20 20 20 20 29 3b 0a 20 20 20 20  ;\n".    );.    
7e80: 7a 53 63 72 69 70 74 20 3d 20 72 65 61 64 46 69  zScript = readFi
7e90: 6c 65 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20  le(argv[2]);.   
7ea0: 20 69 66 28 20 67 2e 69 54 72 61 63 65 20 29 20   if( g.iTrace ) 
7eb0: 6c 6f 67 4d 65 73 73 61 67 65 28 22 62 65 67 69  logMessage("begi
7ec0: 6e 20 73 63 72 69 70 74 20 5b 25 73 5d 5c 6e 22  n script [%s]\n"
7ed0: 2c 20 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20  , argv[2]);.    
7ee0: 72 75 6e 53 63 72 69 70 74 28 30 2c 20 30 2c 20  runScript(0, 0, 
7ef0: 7a 53 63 72 69 70 74 2c 20 61 72 67 76 5b 32 5d  zScript, argv[2]
7f00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
7f10: 72 65 65 28 7a 53 63 72 69 70 74 29 3b 0a 20 20  ree(zScript);.  
7f20: 20 20 69 66 28 20 67 2e 69 54 72 61 63 65 20 29    if( g.iTrace )
7f30: 20 6c 6f 67 4d 65 73 73 61 67 65 28 22 65 6e 64   logMessage("end
7f40: 20 73 63 72 69 70 74 20 5b 25 73 5d 5c 6e 22 2c   script [%s]\n",
7f50: 20 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 77   argv[2]);.    w
7f60: 61 69 74 46 6f 72 43 6c 69 65 6e 74 28 30 2c 20  aitForClient(0, 
7f70: 32 30 30 30 2c 20 22 64 75 72 69 6e 67 20 73 68  2000, "during sh
7f80: 75 74 64 6f 77 6e 2e 2e 2e 5c 6e 22 29 3b 0a 20  utdown...\n");. 
7f90: 20 20 20 74 72 79 53 71 6c 28 22 55 50 44 41 54     trySql("UPDAT
7fa0: 45 20 63 6c 69 65 6e 74 20 53 45 54 20 77 61 6e  E client SET wan
7fb0: 74 48 61 6c 74 3d 31 22 29 3b 0a 20 20 20 20 73  tHalt=1");.    s
7fc0: 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 31 30 29  qlite3_sleep(10)
7fd0: 3b 0a 20 20 20 20 67 2e 69 54 69 6d 65 6f 75 74  ;.    g.iTimeout
7fe0: 20 3d 20 30 3b 0a 20 20 20 20 69 54 69 6d 65 6f   = 0;.    iTimeo
7ff0: 75 74 20 3d 20 31 30 30 30 3b 0a 20 20 20 20 77  ut = 1000;.    w
8000: 68 69 6c 65 28 20 28 28 72 63 20 3d 20 74 72 79  hile( ((rc = try
8010: 53 71 6c 28 22 53 45 4c 45 43 54 20 31 20 46 52  Sql("SELECT 1 FR
8020: 4f 4d 20 63 6c 69 65 6e 74 22 29 29 3d 3d 53 51  OM client"))==SQ
8030: 4c 49 54 45 5f 42 55 53 59 0a 20 20 20 20 20 20  LITE_BUSY.      
8040: 20 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f    || rc==SQLITE_
8050: 52 4f 57 29 20 26 26 20 69 54 69 6d 65 6f 75 74  ROW) && iTimeout
8060: 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  >0 ){.      sqli
8070: 74 65 33 5f 73 6c 65 65 70 28 31 30 29 3b 0a 20  te3_sleep(10);. 
8080: 20 20 20 20 20 69 54 69 6d 65 6f 75 74 20 2d 3d       iTimeout -=
8090: 20 31 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   10;.    }.    s
80a0: 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 31 30 30  qlite3_sleep(100
80b0: 29 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 70  );.    pStmt = p
80c0: 72 65 70 61 72 65 53 71 6c 28 22 53 45 4c 45 43  repareSql("SELEC
80d0: 54 20 6e 45 72 72 6f 72 2c 20 6e 54 65 73 74 20  T nError, nTest 
80e0: 46 52 4f 4d 20 63 6f 75 6e 74 65 72 73 22 29 3b  FROM counters");
80f0: 0a 20 20 20 20 69 54 69 6d 65 6f 75 74 20 3d 20  .    iTimeout = 
8100: 31 30 30 30 3b 0a 20 20 20 20 77 68 69 6c 65 28  1000;.    while(
8110: 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73   (rc = sqlite3_s
8120: 74 65 70 28 70 53 74 6d 74 29 29 3d 3d 53 51 4c  tep(pStmt))==SQL
8130: 49 54 45 5f 42 55 53 59 20 26 26 20 69 54 69 6d  ITE_BUSY && iTim
8140: 65 6f 75 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  eout>0 ){.      
8150: 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 31 30  sqlite3_sleep(10
8160: 29 3b 0a 20 20 20 20 20 20 69 54 69 6d 65 6f 75  );.      iTimeou
8170: 74 20 2d 3d 20 31 30 3b 0a 20 20 20 20 7d 0a 20  t -= 10;.    }. 
8180: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
8190: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 67  E_ROW ){.      g
81a0: 2e 6e 45 72 72 6f 72 20 2b 3d 20 73 71 6c 69 74  .nError += sqlit
81b0: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
81c0: 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 67  tmt, 0);.      g
81d0: 2e 6e 54 65 73 74 20 2b 3d 20 73 71 6c 69 74 65  .nTest += sqlite
81e0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
81f0: 6d 74 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20  mt, 1);.    }.  
8200: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
8210: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20  ze(pStmt);.  }. 
8220: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 67   sqlite3_close(g
8230: 2e 64 62 29 3b 20 20 0a 20 20 6d 61 79 62 65 43  .db);  .  maybeC
8240: 6c 6f 73 65 28 67 2e 70 4c 6f 67 29 3b 0a 20 20  lose(g.pLog);.  
8250: 6d 61 79 62 65 43 6c 6f 73 65 28 67 2e 70 45 72  maybeClose(g.pEr
8260: 72 4c 6f 67 29 3b 0a 20 20 69 66 28 20 69 43 6c  rLog);.  if( iCl
8270: 69 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ient==0 ){.    p
8280: 72 69 6e 74 66 28 22 53 75 6d 6d 61 72 79 3a 20  rintf("Summary: 
8290: 25 64 20 65 72 72 6f 72 73 20 69 6e 20 25 64 20  %d errors in %d 
82a0: 74 65 73 74 73 5c 6e 22 2c 20 67 2e 6e 45 72 72  tests\n", g.nErr
82b0: 6f 72 2c 20 67 2e 6e 54 65 73 74 29 3b 0a 20 20  or, g.nTest);.  
82c0: 7d 0a 20 20 72 65 74 75 72 6e 20 67 2e 6e 45 72  }.  return g.nEr
82d0: 72 6f 72 3e 30 3b 0a 7d 0a                       ror>0;.}.