/ Hex Artifact Content
Login

Artifact 0d3f2eb8e373cb692ab362a6dddedd53e0978502:


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 64 65 66 69  d(_WIN32).# defi
0400: 6e 65 20 57 49 4e 33 32 5f 4c 45 41 4e 5f 41 4e  ne WIN32_LEAN_AN
0410: 44 5f 4d 45 41 4e 0a 23 20 69 6e 63 6c 75 64 65  D_MEAN.# include
0420: 20 3c 77 69 6e 64 6f 77 73 2e 68 3e 0a 23 65 6c   <windows.h>.#el
0430: 73 65 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 6e  se.# include <un
0440: 69 73 74 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  istd.h>.#endif.#
0450: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e  include <stdlib.
0460: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72  h>.#include <str
0470: 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ing.h>.#include 
0480: 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c  <assert.h>.#incl
0490: 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 0a 23  ude <ctype.h>..#
04a0: 64 65 66 69 6e 65 20 49 53 53 50 41 43 45 28 58  define ISSPACE(X
04b0: 29 20 69 73 73 70 61 63 65 28 28 75 6e 73 69 67  ) isspace((unsig
04c0: 6e 65 64 20 63 68 61 72 29 28 58 29 29 0a 23 64  ned char)(X)).#d
04d0: 65 66 69 6e 65 20 49 53 44 49 47 49 54 28 58 29  efine ISDIGIT(X)
04e0: 20 69 73 64 69 67 69 74 28 28 75 6e 73 69 67 6e   isdigit((unsign
04f0: 65 64 20 63 68 61 72 29 28 58 29 29 0a 0a 2f 2a  ed char)(X))../*
0500: 20 54 68 65 20 73 75 66 66 69 78 20 74 6f 20 61   The suffix to a
0510: 70 70 65 6e 64 20 74 6f 20 74 68 65 20 63 68 69  ppend to the chi
0520: 6c 64 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 73  ld command lines
0530: 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 23 69 66 20  , if any */.#if 
0540: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a  defined(_WIN32).
0550: 23 20 64 65 66 69 6e 65 20 47 45 54 50 49 44 20  # define GETPID 
0560: 28 69 6e 74 29 47 65 74 43 75 72 72 65 6e 74 50  (int)GetCurrentP
0570: 72 6f 63 65 73 73 49 64 0a 23 65 6c 73 65 0a 23  rocessId.#else.#
0580: 20 64 65 66 69 6e 65 20 47 45 54 50 49 44 20 67   define GETPID g
0590: 65 74 70 69 64 0a 23 65 6e 64 69 66 0a 0a 2f 2a  etpid.#endif../*
05a0: 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20 73   The directory s
05b0: 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74  eparator charact
05c0: 65 72 28 73 29 20 2a 2f 0a 23 69 66 20 64 65 66  er(s) */.#if def
05d0: 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 23 20 64  ined(_WIN32).# d
05e0: 65 66 69 6e 65 20 69 73 44 69 72 53 65 70 28 63  efine isDirSep(c
05f0: 29 20 28 28 28 63 29 20 3d 3d 20 27 2f 27 29 20  ) (((c) == '/') 
0600: 7c 7c 20 28 28 63 29 20 3d 3d 20 27 5c 5c 27 29  || ((c) == '\\')
0610: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
0620: 20 69 73 44 69 72 53 65 70 28 63 29 20 28 28 63   isDirSep(c) ((c
0630: 29 20 3d 3d 20 27 2f 27 29 0a 23 65 6e 64 69 66  ) == '/').#endif
0640: 0a 0a 2f 2a 20 4d 61 72 6b 20 61 20 70 61 72 61  ../* Mark a para
0650: 6d 65 74 65 72 20 61 73 20 75 6e 75 73 65 64 20  meter as unused 
0660: 74 6f 20 73 75 70 70 72 65 73 73 20 63 6f 6d 70  to suppress comp
0670: 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 20 2a 2f  iler warnings */
0680: 0a 23 64 65 66 69 6e 65 20 55 4e 55 53 45 44 5f  .#define UNUSED_
0690: 50 41 52 41 4d 45 54 45 52 28 78 29 20 20 28 76  PARAMETER(x)  (v
06a0: 6f 69 64 29 78 0a 0a 2f 2a 20 47 6c 6f 62 61 6c  oid)x../* Global
06b0: 20 64 61 74 61 0a 2a 2f 0a 73 74 61 74 69 63 20   data.*/.static 
06c0: 73 74 72 75 63 74 20 47 6c 6f 62 61 6c 20 7b 0a  struct Global {.
06d0: 20 20 63 68 61 72 20 2a 61 72 67 76 30 3b 20 20    char *argv0;  
06e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
06f0: 20 6f 66 20 74 68 65 20 65 78 65 63 75 74 61 62   of the executab
0700: 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  le */.  const ch
0710: 61 72 20 2a 7a 56 66 73 3b 20 20 20 20 20 20 2f  ar *zVfs;      /
0720: 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53 20 74 6f  * Name of VFS to
0730: 20 75 73 65 2e 20 4f 66 74 65 6e 20 4e 55 4c 4c   use. Often NULL
0740: 20 6d 65 61 6e 69 6e 67 20 22 64 65 66 61 75 6c   meaning "defaul
0750: 74 22 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44  t" */.  char *zD
0760: 62 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 2f  bFile;         /
0770: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
0780: 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69  tabase */.  sqli
0790: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
07a0: 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 6e 65     /* Open conne
07b0: 63 74 69 6f 6e 20 74 6f 20 64 61 74 61 62 61 73  ction to databas
07c0: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72  e */.  char *zEr
07d0: 72 4c 6f 67 3b 20 20 20 20 20 20 20 20 20 2f 2a  rLog;         /*
07e0: 20 46 69 6c 65 6e 61 6d 65 20 66 6f 72 20 65 72   Filename for er
07f0: 72 6f 72 20 6c 6f 67 20 2a 2f 0a 20 20 46 49 4c  ror log */.  FIL
0800: 45 20 2a 70 45 72 72 4c 6f 67 3b 20 20 20 20 20  E *pErrLog;     
0810: 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
0820: 77 72 69 74 65 20 65 72 72 6f 72 73 20 2a 2f 0a  write errors */.
0830: 20 20 63 68 61 72 20 2a 7a 4c 6f 67 3b 20 20 20    char *zLog;   
0840: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
0850: 20 6f 66 20 6f 75 74 70 75 74 20 6c 6f 67 20 66   of output log f
0860: 69 6c 65 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 70  ile */.  FILE *p
0870: 4c 6f 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Log;            
0880: 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69 74  /* Where to writ
0890: 65 20 6c 6f 67 20 6d 65 73 73 61 67 65 73 20 2a  e log messages *
08a0: 2f 0a 20 20 63 68 61 72 20 7a 4e 61 6d 65 5b 33  /.  char zName[3
08b0: 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 79  2];        /* Sy
08c0: 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 6f 66 20 74  mbolic name of t
08d0: 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20  his process */. 
08e0: 20 69 6e 74 20 74 61 73 6b 49 64 3b 20 20 20 20   int taskId;    
08f0: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 73 6b 20          /* Task 
0900: 49 44 2e 20 20 30 20 6d 65 61 6e 73 20 73 75 70  ID.  0 means sup
0910: 65 72 76 69 73 6f 72 2e 20 2a 2f 0a 20 20 69 6e  ervisor. */.  in
0920: 74 20 69 54 72 61 63 65 3b 20 20 20 20 20 20 20  t iTrace;       
0930: 20 20 20 20 20 2f 2a 20 54 72 61 63 69 6e 67 20       /* Tracing 
0940: 6c 65 76 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 62  level */.  int b
0950: 53 71 6c 54 72 61 63 65 3b 20 20 20 20 20 20 20  SqlTrace;       
0960: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 74 72 61    /* True to tra
0970: 63 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 73 20  ce SQL commands 
0980: 2a 2f 0a 20 20 69 6e 74 20 62 49 67 6e 6f 72 65  */.  int bIgnore
0990: 53 71 6c 45 72 72 6f 72 73 3b 20 20 2f 2a 20 49  SqlErrors;  /* I
09a0: 67 6e 6f 72 65 20 65 72 72 6f 72 73 20 69 6e 20  gnore errors in 
09b0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 2a  SQL statements *
09c0: 2f 0a 20 20 69 6e 74 20 6e 45 72 72 6f 72 3b 20  /.  int nError; 
09d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
09e0: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 2a  mber of errors *
09f0: 2f 0a 20 20 69 6e 74 20 6e 54 65 73 74 3b 20 20  /.  int nTest;  
0a00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
0a10: 6d 62 65 72 20 6f 66 20 2d 2d 6d 61 74 63 68 20  mber of --match 
0a20: 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69  operators */.  i
0a30: 6e 74 20 69 54 69 6d 65 6f 75 74 3b 20 20 20 20  nt iTimeout;    
0a40: 20 20 20 20 20 20 2f 2a 20 4d 69 6c 6c 69 73 65        /* Millise
0a50: 63 6f 6e 64 73 20 75 6e 74 69 6c 20 61 20 62 75  conds until a bu
0a60: 73 79 20 74 69 6d 65 6f 75 74 20 2a 2f 0a 20 20  sy timeout */.  
0a70: 69 6e 74 20 62 53 79 6e 63 3b 20 20 20 20 20 20  int bSync;      
0a80: 20 20 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66         /* Call f
0a90: 73 79 6e 63 28 29 20 2a 2f 0a 7d 20 67 3b 0a 0a  sync() */.} g;..
0aa0: 2f 2a 20 44 65 66 61 75 6c 74 20 74 69 6d 65 6f  /* Default timeo
0ab0: 75 74 20 2a 2f 0a 23 64 65 66 69 6e 65 20 44 45  ut */.#define DE
0ac0: 46 41 55 4c 54 5f 54 49 4d 45 4f 55 54 20 31 30  FAULT_TIMEOUT 10
0ad0: 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  000../*.** Print
0ae0: 20 61 20 6d 65 73 73 61 67 65 20 61 64 64 69 6e   a message addin
0af0: 67 20 7a 50 72 65 66 69 78 5b 5d 20 74 6f 20 74  g zPrefix[] to t
0b00: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
0b10: 65 76 65 72 79 20 6c 69 6e 65 2e 0a 2a 2f 0a 73  every line..*/.s
0b20: 74 61 74 69 63 20 76 6f 69 64 20 70 72 69 6e 74  tatic void print
0b30: 57 69 74 68 50 72 65 66 69 78 28 46 49 4c 45 20  WithPrefix(FILE 
0b40: 2a 70 4f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61  *pOut, const cha
0b50: 72 20 2a 7a 50 72 65 66 69 78 2c 20 63 6f 6e 73  r *zPrefix, cons
0b60: 74 20 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a 20  t char *zMsg){. 
0b70: 20 77 68 69 6c 65 28 20 7a 4d 73 67 20 26 26 20   while( zMsg && 
0b80: 7a 4d 73 67 5b 30 5d 20 29 7b 0a 20 20 20 20 69  zMsg[0] ){.    i
0b90: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
0ba0: 30 3b 20 7a 4d 73 67 5b 69 5d 20 26 26 20 7a 4d  0; zMsg[i] && zM
0bb0: 73 67 5b 69 5d 21 3d 27 5c 6e 27 20 26 26 20 7a  sg[i]!='\n' && z
0bc0: 4d 73 67 5b 69 5d 21 3d 27 5c 72 27 3b 20 69 2b  Msg[i]!='\r'; i+
0bd0: 2b 29 7b 7d 0a 20 20 20 20 66 70 72 69 6e 74 66  +){}.    fprintf
0be0: 28 70 4f 75 74 2c 20 22 25 73 25 2e 2a 73 5c 6e  (pOut, "%s%.*s\n
0bf0: 22 2c 20 7a 50 72 65 66 69 78 2c 20 69 2c 20 7a  ", zPrefix, i, z
0c00: 4d 73 67 29 3b 0a 20 20 20 20 7a 4d 73 67 20 2b  Msg);.    zMsg +
0c10: 3d 20 69 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = i;.    while( 
0c20: 7a 4d 73 67 5b 30 5d 3d 3d 27 5c 6e 27 20 7c 7c  zMsg[0]=='\n' ||
0c30: 20 7a 4d 73 67 5b 30 5d 3d 3d 27 5c 72 27 20 29   zMsg[0]=='\r' )
0c40: 20 7a 4d 73 67 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a   zMsg++;.  }.}..
0c50: 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77  /*.** Compare tw
0c60: 6f 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 74  o pointers to st
0c70: 72 69 6e 67 73 2c 20 77 68 65 72 65 20 74 68 65  rings, where the
0c80: 20 70 6f 69 6e 74 65 72 73 20 6d 69 67 68 74 20   pointers might 
0c90: 62 65 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  be NULL..*/.stat
0ca0: 69 63 20 69 6e 74 20 73 61 66 65 5f 73 74 72 63  ic int safe_strc
0cb0: 6d 70 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  mp(const char *a
0cc0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 62 29  , const char *b)
0cd0: 7b 0a 20 20 69 66 28 20 61 3d 3d 62 20 29 20 72  {.  if( a==b ) r
0ce0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 61  eturn 0;.  if( a
0cf0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  ==0 ) return -1;
0d00: 0a 20 20 69 66 28 20 62 3d 3d 30 20 29 20 72 65  .  if( b==0 ) re
0d10: 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
0d20: 20 73 74 72 63 6d 70 28 61 2c 62 29 3b 0a 7d 0a   strcmp(a,b);.}.
0d30: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
0d40: 55 45 20 69 66 20 73 74 72 69 6e 67 20 7a 5b 5d  UE if string z[]
0d50: 20 6d 61 74 63 68 65 73 20 67 6c 6f 62 20 70 61   matches glob pa
0d60: 74 74 65 72 6e 20 7a 47 6c 6f 62 5b 5d 2e 0a 2a  ttern zGlob[]..*
0d70: 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69  * Return FALSE i
0d80: 66 20 74 68 65 20 70 61 74 74 65 72 6e 20 64 6f  f the pattern do
0d90: 65 73 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a  es not match..**
0da0: 0a 2a 2a 20 47 6c 6f 62 62 69 6e 67 20 72 75 6c  .** Globbing rul
0db0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27  es:.**.**      '
0dc0: 2a 27 20 20 20 20 20 20 20 4d 61 74 63 68 65 73  *'       Matches
0dd0: 20 61 6e 79 20 73 65 71 75 65 6e 63 65 20 6f 66   any sequence of
0de0: 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 63 68   zero or more ch
0df0: 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20  aracters..**.** 
0e00: 20 20 20 20 20 27 3f 27 20 20 20 20 20 20 20 4d       '?'       M
0e10: 61 74 63 68 65 73 20 65 78 61 63 74 6c 79 20 6f  atches exactly o
0e20: 6e 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2a  ne character..**
0e30: 0a 2a 2a 20 20 20 20 20 5b 2e 2e 2e 5d 20 20 20  .**     [...]   
0e40: 20 20 20 4d 61 74 63 68 65 73 20 6f 6e 65 20 63     Matches one c
0e50: 68 61 72 61 63 74 65 72 20 66 72 6f 6d 20 74 68  haracter from th
0e60: 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74 20  e enclosed list 
0e70: 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  of.**           
0e80: 20 20 20 20 20 63 68 61 72 61 63 74 65 72 73 2e       characters.
0e90: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 5e 2e 2e 2e  .**.**     [^...
0ea0: 5d 20 20 20 20 20 4d 61 74 63 68 65 73 20 6f 6e  ]     Matches on
0eb0: 65 20 63 68 61 72 61 63 74 65 72 20 6e 6f 74 20  e character not 
0ec0: 69 6e 20 74 68 65 20 65 6e 63 6c 6f 73 65 64 20  in the enclosed 
0ed0: 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  list..**.**     
0ee0: 20 27 23 27 20 20 20 20 20 20 20 4d 61 74 63 68   '#'       Match
0ef0: 65 73 20 61 6e 79 20 73 65 71 75 65 6e 63 65 20  es any sequence 
0f00: 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 64  of one or more d
0f10: 69 67 69 74 73 20 77 69 74 68 20 61 6e 0a 2a 2a  igits with an.**
0f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f30: 6f 70 74 69 6f 6e 61 6c 20 2b 20 6f 72 20 2d 20  optional + or - 
0f40: 73 69 67 6e 20 69 6e 20 66 72 6f 6e 74 0a 2a 2f  sign in front.*/
0f50: 0a 69 6e 74 20 73 74 72 67 6c 6f 62 28 63 6f 6e  .int strglob(con
0f60: 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62 2c 20  st char *zGlob, 
0f70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
0f80: 20 20 69 6e 74 20 63 2c 20 63 32 3b 0a 20 20 69    int c, c2;.  i
0f90: 6e 74 20 69 6e 76 65 72 74 3b 0a 20 20 69 6e 74  nt invert;.  int
0fa0: 20 73 65 65 6e 3b 0a 0a 20 20 77 68 69 6c 65 28   seen;..  while(
0fb0: 20 28 63 20 3d 20 28 2a 28 7a 47 6c 6f 62 2b 2b   (c = (*(zGlob++
0fc0: 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  )))!=0 ){.    if
0fd0: 28 20 63 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20  ( c=='*' ){.    
0fe0: 20 20 77 68 69 6c 65 28 20 28 63 3d 28 2a 28 7a    while( (c=(*(z
0ff0: 47 6c 6f 62 2b 2b 29 29 29 20 3d 3d 20 27 2a 27  Glob++))) == '*'
1000: 20 7c 7c 20 63 3d 3d 27 3f 27 20 29 7b 0a 20 20   || c=='?' ){.  
1010: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 3f 27        if( c=='?'
1020: 20 26 26 20 28 2a 28 7a 2b 2b 29 29 3d 3d 30 20   && (*(z++))==0 
1030: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
1040: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
1050: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
1060: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65  turn 1;.      }e
1070: 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b 27 20 29  lse if( c=='[' )
1080: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
1090: 20 2a 7a 20 26 26 20 73 74 72 67 6c 6f 62 28 7a   *z && strglob(z
10a0: 47 6c 6f 62 2d 31 2c 7a 29 20 29 7b 0a 20 20 20  Glob-1,z) ){.   
10b0: 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20         z++;.    
10c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
10d0: 74 75 72 6e 20 28 2a 7a 29 21 3d 30 3b 0a 20 20  turn (*z)!=0;.  
10e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c      }.      whil
10f0: 65 28 20 28 63 32 20 3d 20 28 2a 28 7a 2b 2b 29  e( (c2 = (*(z++)
1100: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
1110: 20 77 68 69 6c 65 28 20 63 32 21 3d 63 20 29 7b   while( c2!=c ){
1120: 0a 20 20 20 20 20 20 20 20 20 20 63 32 20 3d 20  .          c2 = 
1130: 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20  *(z++);.        
1140: 20 20 69 66 28 20 63 32 3d 3d 30 20 29 20 72 65    if( c2==0 ) re
1150: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
1160: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74  }.        if( st
1170: 72 67 6c 6f 62 28 7a 47 6c 6f 62 2c 7a 29 20 29  rglob(zGlob,z) )
1180: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
1190: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
11a0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
11b0: 20 63 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20   c=='?' ){.     
11c0: 20 69 66 28 20 28 2a 28 7a 2b 2b 29 29 3d 3d 30   if( (*(z++))==0
11d0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
11e0: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b   }else if( c=='[
11f0: 27 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70  ' ){.      int p
1200: 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20  rior_c = 0;.    
1210: 20 20 73 65 65 6e 20 3d 20 30 3b 0a 20 20 20 20    seen = 0;.    
1220: 20 20 69 6e 76 65 72 74 20 3d 20 30 3b 0a 20 20    invert = 0;.  
1230: 20 20 20 20 63 20 3d 20 2a 28 7a 2b 2b 29 3b 0a      c = *(z++);.
1240: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
1250: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
1260: 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29   c2 = *(zGlob++)
1270: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d  ;.      if( c2==
1280: 27 5e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  '^' ){.        i
1290: 6e 76 65 72 74 20 3d 20 31 3b 0a 20 20 20 20 20  nvert = 1;.     
12a0: 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b     c2 = *(zGlob+
12b0: 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  +);.      }.    
12c0: 20 20 69 66 28 20 63 32 3d 3d 27 5d 27 20 29 7b    if( c2==']' ){
12d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
12e0: 27 5d 27 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a  ']' ) seen = 1;.
12f0: 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a          c2 = *(z
1300: 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d  Glob++);.      }
1310: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 63 32  .      while( c2
1320: 20 26 26 20 63 32 21 3d 27 5d 27 20 29 7b 0a 20   && c2!=']' ){. 
1330: 20 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27         if( c2=='
1340: 2d 27 20 26 26 20 7a 47 6c 6f 62 5b 30 5d 21 3d  -' && zGlob[0]!=
1350: 27 5d 27 20 26 26 20 7a 47 6c 6f 62 5b 30 5d 21  ']' && zGlob[0]!
1360: 3d 30 20 26 26 20 70 72 69 6f 72 5f 63 3e 30 20  =0 && prior_c>0 
1370: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 32 20  ){.          c2 
1380: 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20  = *(zGlob++);.  
1390: 20 20 20 20 20 20 20 20 69 66 28 20 63 3e 3d 70          if( c>=p
13a0: 72 69 6f 72 5f 63 20 26 26 20 63 3c 3d 63 32 20  rior_c && c<=c2 
13b0: 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20  ) seen = 1;.    
13c0: 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d 20        prior_c = 
13d0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
13e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
13f0: 63 3d 3d 63 32 20 29 7b 0a 20 20 20 20 20 20 20  c==c2 ){.       
1400: 20 20 20 20 20 73 65 65 6e 20 3d 20 31 3b 0a 20       seen = 1;. 
1410: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1420: 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d 20 63       prior_c = c
1430: 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  2;.        }.   
1440: 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f       c2 = *(zGlo
1450: 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  b++);.      }.  
1460: 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20 7c 7c      if( c2==0 ||
1470: 20 28 73 65 65 6e 20 5e 20 69 6e 76 65 72 74 29   (seen ^ invert)
1480: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1490: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
14a0: 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20 69 66  ='#' ){.      if
14b0: 28 20 28 7a 5b 30 5d 3d 3d 27 2d 27 20 7c 7c 20  ( (z[0]=='-' || 
14c0: 7a 5b 30 5d 3d 3d 27 2b 27 29 20 26 26 20 49 53  z[0]=='+') && IS
14d0: 44 49 47 49 54 28 7a 5b 31 5d 29 20 29 20 7a 2b  DIGIT(z[1]) ) z+
14e0: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 21 49 53  +;.      if( !IS
14f0: 44 49 47 49 54 28 7a 5b 30 5d 29 20 29 20 72 65  DIGIT(z[0]) ) re
1500: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7a 2b  turn 0;.      z+
1510: 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  +;.      while( 
1520: 49 53 44 49 47 49 54 28 7a 5b 30 5d 29 20 29 7b  ISDIGIT(z[0]) ){
1530: 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65 6c 73   z++; }.    }els
1540: 65 7b 0a 20 20 20 20 20 20 69 66 28 20 63 21 3d  e{.      if( c!=
1550: 28 2a 28 7a 2b 2b 29 29 20 29 20 72 65 74 75 72  (*(z++)) ) retur
1560: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 0;.    }.  }. 
1570: 20 72 65 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d   return *z==0;.}
1580: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 6f 75  ../*.** Close ou
1590: 74 70 75 74 20 73 74 72 65 61 6d 20 70 4f 75 74  tput stream pOut
15a0: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 73 74   if it is not st
15b0: 64 6f 75 74 20 6f 72 20 73 74 64 65 72 72 0a 2a  dout or stderr.*
15c0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61  /.static void ma
15d0: 79 62 65 43 6c 6f 73 65 28 46 49 4c 45 20 2a 70  ybeClose(FILE *p
15e0: 4f 75 74 29 7b 0a 20 20 69 66 28 20 70 4f 75 74  Out){.  if( pOut
15f0: 21 3d 73 74 64 6f 75 74 20 26 26 20 70 4f 75 74  !=stdout && pOut
1600: 21 3d 73 74 64 65 72 72 20 29 20 66 63 6c 6f 73  !=stderr ) fclos
1610: 65 28 70 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e(pOut);.}../*.*
1620: 2a 20 50 72 69 6e 74 20 61 6e 20 65 72 72 6f 72  * Print an error
1630: 20 6d 65 73 73 61 67 65 0a 2a 2f 0a 73 74 61 74   message.*/.stat
1640: 69 63 20 76 6f 69 64 20 65 72 72 6f 72 4d 65 73  ic void errorMes
1650: 73 61 67 65 28 63 6f 6e 73 74 20 63 68 61 72 20  sage(const char 
1660: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
1670: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
1680: 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 63 68  char *zMsg;.  ch
1690: 61 72 20 7a 50 72 65 66 69 78 5b 33 30 5d 3b 0a  ar zPrefix[30];.
16a0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
16b0: 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 4d 73 67 20  Format);.  zMsg 
16c0: 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e  = sqlite3_vmprin
16d0: 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  tf(zFormat, ap);
16e0: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
16f0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1700: 66 28 73 69 7a 65 6f 66 28 7a 50 72 65 66 69 78  f(sizeof(zPrefix
1710: 29 2c 20 7a 50 72 65 66 69 78 2c 20 22 25 73 3a  ), zPrefix, "%s:
1720: 45 52 52 4f 52 3a 20 22 2c 20 67 2e 7a 4e 61 6d  ERROR: ", g.zNam
1730: 65 29 3b 0a 20 20 69 66 28 20 67 2e 70 4c 6f 67  e);.  if( g.pLog
1740: 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 57 69 74   ){.    printWit
1750: 68 50 72 65 66 69 78 28 67 2e 70 4c 6f 67 2c 20  hPrefix(g.pLog, 
1760: 7a 50 72 65 66 69 78 2c 20 7a 4d 73 67 29 3b 0a  zPrefix, zMsg);.
1770: 20 20 20 20 66 66 6c 75 73 68 28 67 2e 70 4c 6f      fflush(g.pLo
1780: 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 2e  g);.  }.  if( g.
1790: 70 45 72 72 4c 6f 67 20 26 26 20 73 61 66 65 5f  pErrLog && safe_
17a0: 73 74 72 63 6d 70 28 67 2e 7a 45 72 72 4c 6f 67  strcmp(g.zErrLog
17b0: 2c 67 2e 7a 4c 6f 67 29 20 29 7b 0a 20 20 20 20  ,g.zLog) ){.    
17c0: 70 72 69 6e 74 57 69 74 68 50 72 65 66 69 78 28  printWithPrefix(
17d0: 67 2e 70 45 72 72 4c 6f 67 2c 20 7a 50 72 65 66  g.pErrLog, zPref
17e0: 69 78 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 66  ix, zMsg);.    f
17f0: 66 6c 75 73 68 28 67 2e 70 45 72 72 4c 6f 67 29  flush(g.pErrLog)
1800: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1810: 66 72 65 65 28 7a 4d 73 67 29 3b 0a 20 20 67 2e  free(zMsg);.  g.
1820: 6e 45 72 72 6f 72 2b 2b 3b 0a 7d 0a 0a 2f 2a 20  nError++;.}../* 
1830: 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
1840: 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ion */.static in
1850: 74 20 74 72 79 53 71 6c 28 63 6f 6e 73 74 20 63  t trySql(const c
1860: 68 61 72 2a 2c 20 2e 2e 2e 29 3b 0a 0a 2f 2a 0a  har*, ...);../*.
1870: 2a 2a 20 50 72 69 6e 74 20 61 6e 20 65 72 72 6f  ** Print an erro
1880: 72 20 6d 65 73 73 61 67 65 20 61 6e 64 20 74 68  r message and th
1890: 65 6e 20 71 75 69 74 2e 0a 2a 2f 0a 73 74 61 74  en quit..*/.stat
18a0: 69 63 20 76 6f 69 64 20 66 61 74 61 6c 45 72 72  ic void fatalErr
18b0: 6f 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  or(const char *z
18c0: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
18d0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68  va_list ap;.  ch
18e0: 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 63 68 61 72  ar *zMsg;.  char
18f0: 20 7a 50 72 65 66 69 78 5b 33 30 5d 3b 0a 20 20   zPrefix[30];.  
1900: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
1910: 72 6d 61 74 29 3b 0a 20 20 7a 4d 73 67 20 3d 20  rmat);.  zMsg = 
1920: 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66  sqlite3_vmprintf
1930: 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20  (zFormat, ap);. 
1940: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 73   va_end(ap);.  s
1950: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1960: 73 69 7a 65 6f 66 28 7a 50 72 65 66 69 78 29 2c  sizeof(zPrefix),
1970: 20 7a 50 72 65 66 69 78 2c 20 22 25 73 3a 46 41   zPrefix, "%s:FA
1980: 54 41 4c 3a 20 22 2c 20 67 2e 7a 4e 61 6d 65 29  TAL: ", g.zName)
1990: 3b 0a 20 20 69 66 28 20 67 2e 70 4c 6f 67 20 29  ;.  if( g.pLog )
19a0: 7b 0a 20 20 20 20 70 72 69 6e 74 57 69 74 68 50  {.    printWithP
19b0: 72 65 66 69 78 28 67 2e 70 4c 6f 67 2c 20 7a 50  refix(g.pLog, zP
19c0: 72 65 66 69 78 2c 20 7a 4d 73 67 29 3b 0a 20 20  refix, zMsg);.  
19d0: 20 20 66 66 6c 75 73 68 28 67 2e 70 4c 6f 67 29    fflush(g.pLog)
19e0: 3b 0a 20 20 20 20 6d 61 79 62 65 43 6c 6f 73 65  ;.    maybeClose
19f0: 28 67 2e 70 4c 6f 67 29 3b 0a 20 20 7d 0a 20 20  (g.pLog);.  }.  
1a00: 69 66 28 20 67 2e 70 45 72 72 4c 6f 67 20 26 26  if( g.pErrLog &&
1a10: 20 73 61 66 65 5f 73 74 72 63 6d 70 28 67 2e 7a   safe_strcmp(g.z
1a20: 45 72 72 4c 6f 67 2c 67 2e 7a 4c 6f 67 29 20 29  ErrLog,g.zLog) )
1a30: 7b 0a 20 20 20 20 70 72 69 6e 74 57 69 74 68 50  {.    printWithP
1a40: 72 65 66 69 78 28 67 2e 70 45 72 72 4c 6f 67 2c  refix(g.pErrLog,
1a50: 20 7a 50 72 65 66 69 78 2c 20 7a 4d 73 67 29 3b   zPrefix, zMsg);
1a60: 0a 20 20 20 20 66 66 6c 75 73 68 28 67 2e 70 45  .    fflush(g.pE
1a70: 72 72 4c 6f 67 29 3b 0a 20 20 20 20 6d 61 79 62  rrLog);.    mayb
1a80: 65 43 6c 6f 73 65 28 67 2e 70 45 72 72 4c 6f 67  eClose(g.pErrLog
1a90: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1aa0: 5f 66 72 65 65 28 7a 4d 73 67 29 3b 0a 20 20 69  _free(zMsg);.  i
1ab0: 66 28 20 67 2e 64 62 20 29 7b 0a 20 20 20 20 69  f( g.db ){.    i
1ac0: 6e 74 20 6e 54 72 79 20 3d 20 30 3b 0a 20 20 20  nt nTry = 0;.   
1ad0: 20 67 2e 69 54 69 6d 65 6f 75 74 20 3d 20 30 3b   g.iTimeout = 0;
1ae0: 0a 20 20 20 20 77 68 69 6c 65 28 20 74 72 79 53  .    while( tryS
1af0: 71 6c 28 22 55 50 44 41 54 45 20 63 6c 69 65 6e  ql("UPDATE clien
1b00: 74 20 53 45 54 20 77 61 6e 74 48 61 6c 74 3d 31  t SET wantHalt=1
1b10: 3b 22 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  ;")==SQLITE_BUSY
1b20: 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28  .           && (
1b30: 6e 54 72 79 2b 2b 29 3c 31 30 30 20 29 7b 0a 20  nTry++)<100 ){. 
1b40: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65       sqlite3_sle
1b50: 65 70 28 31 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ep(10);.    }.  
1b60: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  }.  sqlite3_clos
1b70: 65 28 67 2e 64 62 29 3b 0a 20 20 65 78 69 74 28  e(g.db);.  exit(
1b80: 31 29 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  1);  .}.../*.** 
1b90: 50 72 69 6e 74 20 61 20 6c 6f 67 20 6d 65 73 73  Print a log mess
1ba0: 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  age.*/.static vo
1bb0: 69 64 20 6c 6f 67 4d 65 73 73 61 67 65 28 63 6f  id logMessage(co
1bc0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
1bd0: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
1be0: 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a  st ap;.  char *z
1bf0: 4d 73 67 3b 0a 20 20 63 68 61 72 20 7a 50 72 65  Msg;.  char zPre
1c00: 66 69 78 5b 33 30 5d 3b 0a 20 20 76 61 5f 73 74  fix[30];.  va_st
1c10: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
1c20: 3b 0a 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74  ;.  zMsg = sqlit
1c30: 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72  e3_vmprintf(zFor
1c40: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
1c50: 6e 64 28 61 70 29 3b 0a 20 20 73 71 6c 69 74 65  nd(ap);.  sqlite
1c60: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
1c70: 66 28 7a 50 72 65 66 69 78 29 2c 20 7a 50 72 65  f(zPrefix), zPre
1c80: 66 69 78 2c 20 22 25 73 3a 20 22 2c 20 67 2e 7a  fix, "%s: ", g.z
1c90: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 67 2e 70  Name);.  if( g.p
1ca0: 4c 6f 67 20 29 7b 0a 20 20 20 20 70 72 69 6e 74  Log ){.    print
1cb0: 57 69 74 68 50 72 65 66 69 78 28 67 2e 70 4c 6f  WithPrefix(g.pLo
1cc0: 67 2c 20 7a 50 72 65 66 69 78 2c 20 7a 4d 73 67  g, zPrefix, zMsg
1cd0: 29 3b 0a 20 20 20 20 66 66 6c 75 73 68 28 67 2e  );.    fflush(g.
1ce0: 70 4c 6f 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  pLog);.  }.  sql
1cf0: 69 74 65 33 5f 66 72 65 65 28 7a 4d 73 67 29 3b  ite3_free(zMsg);
1d00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1d10: 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 61   the length of a
1d20: 20 73 74 72 69 6e 67 20 6f 6d 69 74 74 69 6e 67   string omitting
1d30: 20 74 72 61 69 6c 69 6e 67 20 77 68 69 74 65 73   trailing whites
1d40: 70 61 63 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  pace.*/.static i
1d50: 6e 74 20 63 6c 69 70 4c 65 6e 67 74 68 28 63 6f  nt clipLength(co
1d60: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
1d70: 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 73 74 72  int n = (int)str
1d80: 6c 65 6e 28 7a 29 3b 0a 20 20 77 68 69 6c 65 28  len(z);.  while(
1d90: 20 6e 3e 30 20 26 26 20 49 53 53 50 41 43 45 28   n>0 && ISSPACE(
1da0: 7a 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20  z[n-1]) ){ n--; 
1db0: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
1dc0: 0a 2f 2a 0a 2a 2a 20 41 75 78 69 6c 69 61 72 79  ./*.** Auxiliary
1dd0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 6f   SQL function to
1de0: 20 72 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   return the name
1df0: 20 6f 66 20 74 68 65 20 56 46 53 0a 2a 2f 0a 73   of the VFS.*/.s
1e00: 74 61 74 69 63 20 76 6f 69 64 20 76 66 73 4e 61  tatic void vfsNa
1e10: 6d 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  meFunc(.  sqlite
1e20: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
1e30: 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  xt,.  int argc,.
1e40: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
1e50: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69  **argv.){.  sqli
1e60: 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65  te3 *db = sqlite
1e70: 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e  3_context_db_han
1e80: 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  dle(context);.  
1e90: 63 68 61 72 20 2a 7a 56 66 73 20 3d 20 30 3b 0a  char *zVfs = 0;.
1ea0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1eb0: 45 52 28 61 72 67 63 29 3b 0a 20 20 55 4e 55 53  ER(argc);.  UNUS
1ec0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67  ED_PARAMETER(arg
1ed0: 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  v);.  sqlite3_fi
1ee0: 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22  le_control(db, "
1ef0: 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f 46 43  main", SQLITE_FC
1f00: 4e 54 4c 5f 56 46 53 4e 41 4d 45 2c 20 26 7a 56  NTL_VFSNAME, &zV
1f10: 66 73 29 3b 0a 20 20 69 66 28 20 7a 56 66 73 20  fs);.  if( zVfs 
1f20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
1f30: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
1f40: 78 74 2c 20 7a 56 66 73 2c 20 2d 31 2c 20 73 71  xt, zVfs, -1, sq
1f50: 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d  lite3_free);.  }
1f60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 73 79 20 68  .}../*.** Busy h
1f70: 61 6e 64 6c 65 72 20 77 69 74 68 20 61 20 67 2e  andler with a g.
1f80: 69 54 69 6d 65 6f 75 74 2d 6d 69 6c 6c 69 73 65  iTimeout-millise
1f90: 63 6f 6e 64 20 74 69 6d 65 6f 75 74 0a 2a 2f 0a  cond timeout.*/.
1fa0: 73 74 61 74 69 63 20 69 6e 74 20 62 75 73 79 48  static int busyH
1fb0: 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 43 44  andler(void *pCD
1fc0: 2c 20 69 6e 74 20 63 6f 75 6e 74 29 7b 0a 20 20  , int count){.  
1fd0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1fe0: 28 70 43 44 29 3b 0a 20 20 69 66 28 20 63 6f 75  (pCD);.  if( cou
1ff0: 6e 74 2a 31 30 3e 67 2e 69 54 69 6d 65 6f 75 74  nt*10>g.iTimeout
2000: 20 29 7b 0a 20 20 20 20 69 66 28 20 67 2e 69 54   ){.    if( g.iT
2010: 69 6d 65 6f 75 74 3e 30 20 29 20 65 72 72 6f 72  imeout>0 ) error
2020: 4d 65 73 73 61 67 65 28 22 74 69 6d 65 6f 75 74  Message("timeout
2030: 20 61 66 74 65 72 20 25 64 6d 73 22 2c 20 67 2e   after %dms", g.
2040: 69 54 69 6d 65 6f 75 74 29 3b 0a 20 20 20 20 72  iTimeout);.    r
2050: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73  eturn 0;.  }.  s
2060: 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 31 30 29  qlite3_sleep(10)
2070: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
2080: 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 54 72 61 63 65  ./*.** SQL Trace
2090: 20 63 61 6c 6c 62 61 63 6b 0a 2a 2f 0a 73 74 61   callback.*/.sta
20a0: 74 69 63 20 76 6f 69 64 20 73 71 6c 54 72 61 63  tic void sqlTrac
20b0: 65 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a  eCallback(void *
20c0: 4e 6f 74 55 73 65 64 31 2c 20 63 6f 6e 73 74 20  NotUsed1, const 
20d0: 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 55  char *zSql){.  U
20e0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
20f0: 4e 6f 74 55 73 65 64 31 29 3b 0a 20 20 6c 6f 67  NotUsed1);.  log
2100: 4d 65 73 73 61 67 65 28 22 5b 25 2e 2a 73 5d 22  Message("[%.*s]"
2110: 2c 20 63 6c 69 70 4c 65 6e 67 74 68 28 7a 53 71  , clipLength(zSq
2120: 6c 29 2c 20 7a 53 71 6c 29 3b 0a 7d 0a 0a 2f 2a  l), zSql);.}../*
2130: 0a 2a 2a 20 53 51 4c 20 65 72 72 6f 72 20 6c 6f  .** SQL error lo
2140: 67 20 63 61 6c 6c 62 61 63 6b 0a 2a 2f 0a 73 74  g callback.*/.st
2150: 61 74 69 63 20 76 6f 69 64 20 73 71 6c 45 72 72  atic void sqlErr
2160: 6f 72 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20  orCallback(void 
2170: 2a 70 41 72 67 2c 20 69 6e 74 20 69 45 72 72 43  *pArg, int iErrC
2180: 6f 64 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ode, const char 
2190: 2a 7a 4d 73 67 29 7b 0a 20 20 55 4e 55 53 45 44  *zMsg){.  UNUSED
21a0: 5f 50 41 52 41 4d 45 54 45 52 28 70 41 72 67 29  _PARAMETER(pArg)
21b0: 3b 0a 20 20 69 66 28 20 69 45 72 72 43 6f 64 65  ;.  if( iErrCode
21c0: 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 26  ==SQLITE_ERROR &
21d0: 26 20 67 2e 62 49 67 6e 6f 72 65 53 71 6c 45 72  & g.bIgnoreSqlEr
21e0: 72 6f 72 73 20 29 20 72 65 74 75 72 6e 3b 0a 20  rors ) return;. 
21f0: 20 69 66 28 20 28 69 45 72 72 43 6f 64 65 26 30   if( (iErrCode&0
2200: 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 53 43 48  xff)==SQLITE_SCH
2210: 45 4d 41 20 26 26 20 67 2e 69 54 72 61 63 65 3c  EMA && g.iTrace<
2220: 33 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  3 ) return;.  if
2230: 28 20 67 2e 69 54 69 6d 65 6f 75 74 3d 3d 30 20  ( g.iTimeout==0 
2240: 26 26 20 28 69 45 72 72 43 6f 64 65 26 30 78 66  && (iErrCode&0xf
2250: 66 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  f)==SQLITE_BUSY 
2260: 26 26 20 67 2e 69 54 72 61 63 65 3c 33 20 29 20  && g.iTrace<3 ) 
2270: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28 69  return;.  if( (i
2280: 45 72 72 43 6f 64 65 26 30 78 66 66 29 3d 3d 53  ErrCode&0xff)==S
2290: 51 4c 49 54 45 5f 4e 4f 54 49 43 45 20 29 7b 0a  QLITE_NOTICE ){.
22a0: 20 20 20 20 6c 6f 67 4d 65 73 73 61 67 65 28 22      logMessage("
22b0: 28 69 6e 66 6f 29 20 25 73 22 2c 20 7a 4d 73 67  (info) %s", zMsg
22c0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
22d0: 65 72 72 6f 72 4d 65 73 73 61 67 65 28 22 28 65  errorMessage("(e
22e0: 72 72 63 6f 64 65 3d 25 64 29 20 25 73 22 2c 20  rrcode=%d) %s", 
22f0: 69 45 72 72 43 6f 64 65 2c 20 7a 4d 73 67 29 3b  iErrCode, zMsg);
2300: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  .  }.}../*.** Pr
2310: 65 70 61 72 65 20 61 6e 20 53 51 4c 20 73 74 61  epare an SQL sta
2320: 74 65 6d 65 6e 74 2e 20 20 49 73 73 75 65 20 61  tement.  Issue a
2330: 20 66 61 74 61 6c 20 65 72 72 6f 72 20 69 66 20   fatal error if 
2340: 75 6e 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  unable..*/.stati
2350: 63 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a  c sqlite3_stmt *
2360: 70 72 65 70 61 72 65 53 71 6c 28 63 6f 6e 73 74  prepareSql(const
2370: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
2380: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
2390: 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c  ap;.  char *zSql
23a0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  ;.  int rc;.  sq
23b0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
23c0: 74 20 3d 20 30 3b 0a 20 20 76 61 5f 73 74 61 72  t = 0;.  va_star
23d0: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
23e0: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
23f0: 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61  _vmprintf(zForma
2400: 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  t, ap);.  va_end
2410: 28 61 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  (ap);.  rc = sql
2420: 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
2430: 67 2e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  g.db, zSql, -1, 
2440: 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66  &pStmt, 0);.  if
2450: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2460: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
2470: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
2480: 20 20 20 20 66 61 74 61 6c 45 72 72 6f 72 28 22      fatalError("
2490: 25 73 5c 6e 25 73 5c 6e 22 2c 20 73 71 6c 69 74  %s\n%s\n", sqlit
24a0: 65 33 5f 65 72 72 6d 73 67 28 67 2e 64 62 29 2c  e3_errmsg(g.db),
24b0: 20 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20 20 73 71   zSql);.  }.  sq
24c0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
24d0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 53 74 6d 74  ;.  return pStmt
24e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61  ;.}../*.** Run a
24f0: 72 62 69 74 72 61 72 79 20 53 51 4c 2e 20 20 49  rbitrary SQL.  I
2500: 73 73 75 65 20 61 20 66 61 74 61 6c 20 65 72 72  ssue a fatal err
2510: 6f 72 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  or on failure..*
2520: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 75  /.static void ru
2530: 6e 53 71 6c 28 63 6f 6e 73 74 20 63 68 61 72 20  nSql(const char 
2540: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
2550: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
2560: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e  char *zSql;.  in
2570: 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 61 72 74  t rc;.  va_start
2580: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20  (ap, zFormat);. 
2590: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
25a0: 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74  vmprintf(zFormat
25b0: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
25c0: 61 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ap);.  rc = sqli
25d0: 74 65 33 5f 65 78 65 63 28 67 2e 64 62 2c 20 7a  te3_exec(g.db, z
25e0: 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  Sql, 0, 0, 0);. 
25f0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2600: 4f 4b 20 29 7b 0a 20 20 20 20 66 61 74 61 6c 45  OK ){.    fatalE
2610: 72 72 6f 72 28 22 25 73 5c 6e 25 73 5c 6e 22 2c  rror("%s\n%s\n",
2620: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
2630: 67 2e 64 62 29 2c 20 7a 53 71 6c 29 3b 0a 20 20  g.db), zSql);.  
2640: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
2650: 28 7a 53 71 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (zSql);.}../*.**
2660: 20 54 72 79 20 74 6f 20 72 75 6e 20 61 72 62 69   Try to run arbi
2670: 74 72 61 72 79 20 53 51 4c 2e 20 20 52 65 74 75  trary SQL.  Retu
2680: 72 6e 20 73 75 63 63 65 73 73 20 63 6f 64 65 2e  rn success code.
2690: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
26a0: 72 79 53 71 6c 28 63 6f 6e 73 74 20 63 68 61 72  rySql(const char
26b0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
26c0: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
26d0: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69   char *zSql;.  i
26e0: 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 61 72  nt rc;.  va_star
26f0: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
2700: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
2710: 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61  _vmprintf(zForma
2720: 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  t, ap);.  va_end
2730: 28 61 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  (ap);.  rc = sql
2740: 69 74 65 33 5f 65 78 65 63 28 67 2e 64 62 2c 20  ite3_exec(g.db, 
2750: 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  zSql, 0, 0, 0);.
2760: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2770: 53 71 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Sql);.  return r
2780: 63 3b 0a 7d 0a 0a 2f 2a 20 53 74 72 75 63 74 75  c;.}../* Structu
2790: 72 65 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 61  re for holding a
27a0: 6e 20 61 72 62 69 74 72 61 72 79 20 6c 65 6e 67  n arbitrary leng
27b0: 74 68 20 73 74 72 69 6e 67 0a 2a 2f 0a 74 79 70  th string.*/.typ
27c0: 65 64 65 66 20 73 74 72 75 63 74 20 53 74 72 69  edef struct Stri
27d0: 6e 67 20 53 74 72 69 6e 67 3b 0a 73 74 72 75 63  ng String;.struc
27e0: 74 20 53 74 72 69 6e 67 20 7b 0a 20 20 63 68 61  t String {.  cha
27f0: 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 2f 2a  r *z;         /*
2800: 20 74 68 65 20 73 74 72 69 6e 67 20 2a 2f 0a 20   the string */. 
2810: 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20   int n;         
2820: 20 20 2f 2a 20 53 6c 6f 74 73 20 6f 66 20 7a 5b    /* Slots of z[
2830: 5d 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ] used */.  int 
2840: 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 2f 2a 20  nAlloc;      /* 
2850: 53 6c 6f 74 73 20 6f 66 20 7a 5b 5d 20 61 6c 6c  Slots of z[] all
2860: 6f 63 61 74 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a  ocated */.};../*
2870: 20 46 72 65 65 20 61 20 73 74 72 69 6e 67 20 2a   Free a string *
2880: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 74  /.static void st
2890: 72 69 6e 67 46 72 65 65 28 53 74 72 69 6e 67 20  ringFree(String 
28a0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 7a 20  *p){.  if( p->z 
28b0: 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70  ) sqlite3_free(p
28c0: 2d 3e 7a 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  ->z);.  memset(p
28d0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  , 0, sizeof(*p))
28e0: 3b 0a 7d 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 6e  ;.}../* Append n
28f0: 20 62 79 74 65 73 20 6f 66 20 74 65 78 74 20 74   bytes of text t
2900: 6f 20 61 20 73 74 72 69 6e 67 2e 20 20 49 66 20  o a string.  If 
2910: 6e 3c 30 20 61 70 70 65 6e 64 20 74 68 65 20 65  n<0 append the e
2920: 6e 74 69 72 65 20 73 74 72 69 6e 67 2e 20 2a 2f  ntire string. */
2930: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 74 72  .static void str
2940: 69 6e 67 41 70 70 65 6e 64 28 53 74 72 69 6e 67  ingAppend(String
2950: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
2960: 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 66  *z, int n){.  if
2970: 28 20 6e 3c 30 20 29 20 6e 20 3d 20 28 69 6e 74  ( n<0 ) n = (int
2980: 29 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 69 66  )strlen(z);.  if
2990: 28 20 70 2d 3e 6e 2b 6e 3e 3d 70 2d 3e 6e 41 6c  ( p->n+n>=p->nAl
29a0: 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  loc ){.    int n
29b0: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 6c 6c 6f  Alloc = p->nAllo
29c0: 63 2a 32 20 2b 20 6e 20 2b 20 31 30 30 3b 0a 20  c*2 + n + 100;. 
29d0: 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 20 3d 20     char *zNew = 
29e0: 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28  sqlite3_realloc(
29f0: 70 2d 3e 7a 2c 20 6e 41 6c 6c 6f 63 29 3b 0a 20  p->z, nAlloc);. 
2a00: 20 20 20 69 66 28 20 7a 4e 65 77 3d 3d 30 20 29     if( zNew==0 )
2a10: 20 66 61 74 61 6c 45 72 72 6f 72 28 22 6f 75 74   fatalError("out
2a20: 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a 20 20   of memory");.  
2a30: 20 20 70 2d 3e 7a 20 3d 20 7a 4e 65 77 3b 0a 20    p->z = zNew;. 
2a40: 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e     p->nAlloc = n
2a50: 41 6c 6c 6f 63 3b 0a 20 20 7d 0a 20 20 6d 65 6d  Alloc;.  }.  mem
2a60: 63 70 79 28 70 2d 3e 7a 2b 70 2d 3e 6e 2c 20 7a  cpy(p->z+p->n, z
2a70: 2c 20 6e 29 3b 0a 20 20 70 2d 3e 6e 20 2b 3d 20  , n);.  p->n += 
2a80: 6e 3b 0a 20 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20  n;.  p->z[p->n] 
2a90: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 73 65 74  = 0;.}../* Reset
2aa0: 20 61 20 73 74 72 69 6e 67 20 74 6f 20 61 6e 20   a string to an 
2ab0: 65 6d 70 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a  empty string */.
2ac0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 74 72 69  static void stri
2ad0: 6e 67 52 65 73 65 74 28 53 74 72 69 6e 67 20 2a  ngReset(String *
2ae0: 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 7a 3d 3d  p){.  if( p->z==
2af0: 30 20 29 20 73 74 72 69 6e 67 41 70 70 65 6e 64  0 ) stringAppend
2b00: 28 70 2c 20 22 20 22 2c 20 31 29 3b 0a 20 20 70  (p, " ", 1);.  p
2b10: 2d 3e 6e 20 3d 20 30 3b 0a 20 20 70 2d 3e 7a 5b  ->n = 0;.  p->z[
2b20: 30 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 41 70  0] = 0;.}../* Ap
2b30: 70 65 6e 64 20 61 20 6e 65 77 20 74 6f 6b 65 6e  pend a new token
2b40: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
2b50: 20 74 68 65 20 73 74 72 69 6e 67 20 2a 2f 0a 73   the string */.s
2b60: 74 61 74 69 63 20 76 6f 69 64 20 73 74 72 69 6e  tatic void strin
2b70: 67 41 70 70 65 6e 64 54 65 72 6d 28 53 74 72 69  gAppendTerm(Stri
2b80: 6e 67 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  ng *p, const cha
2b90: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  r *z){.  int i;.
2ba0: 20 20 69 66 28 20 70 2d 3e 6e 20 29 20 73 74 72    if( p->n ) str
2bb0: 69 6e 67 41 70 70 65 6e 64 28 70 2c 20 22 20 22  ingAppend(p, " "
2bc0: 2c 20 31 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  , 1);.  if( z==0
2bd0: 20 29 7b 0a 20 20 20 20 73 74 72 69 6e 67 41 70   ){.    stringAp
2be0: 70 65 6e 64 28 70 2c 20 22 6e 69 6c 22 2c 20 33  pend(p, "nil", 3
2bf0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
2c00: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b   }.  for(i=0; z[
2c10: 69 5d 20 26 26 20 21 49 53 53 50 41 43 45 28 7a  i] && !ISSPACE(z
2c20: 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69  [i]); i++){}.  i
2c30: 66 28 20 69 3e 30 20 26 26 20 7a 5b 69 5d 3d 3d  f( i>0 && z[i]==
2c40: 30 20 29 7b 0a 20 20 20 20 73 74 72 69 6e 67 41  0 ){.    stringA
2c50: 70 70 65 6e 64 28 70 2c 20 7a 2c 20 69 29 3b 0a  ppend(p, z, i);.
2c60: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
2c70: 20 20 73 74 72 69 6e 67 41 70 70 65 6e 64 28 70    stringAppend(p
2c80: 2c 20 22 27 22 2c 20 31 29 3b 0a 20 20 77 68 69  , "'", 1);.  whi
2c90: 6c 65 28 20 7a 5b 30 5d 20 29 7b 0a 20 20 20 20  le( z[0] ){.    
2ca0: 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 20 26 26  for(i=0; z[i] &&
2cb0: 20 7a 5b 69 5d 21 3d 27 5c 27 27 3b 20 69 2b 2b   z[i]!='\''; i++
2cc0: 29 7b 7d 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d  ){}.    if( z[i]
2cd0: 20 29 7b 0a 20 20 20 20 20 20 73 74 72 69 6e 67   ){.      string
2ce0: 41 70 70 65 6e 64 28 70 2c 20 7a 2c 20 69 2b 31  Append(p, z, i+1
2cf0: 29 3b 0a 20 20 20 20 20 20 73 74 72 69 6e 67 41  );.      stringA
2d00: 70 70 65 6e 64 28 70 2c 20 22 27 22 2c 20 31 29  ppend(p, "'", 1)
2d10: 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 69 2b 31  ;.      z += i+1
2d20: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2d30: 20 20 20 73 74 72 69 6e 67 41 70 70 65 6e 64 28     stringAppend(
2d40: 70 2c 20 7a 2c 20 69 29 3b 0a 20 20 20 20 20 20  p, z, i);.      
2d50: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
2d60: 0a 20 20 73 74 72 69 6e 67 41 70 70 65 6e 64 28  .  stringAppend(
2d70: 70 2c 20 22 27 22 2c 20 31 29 3b 0a 7d 0a 0a 2f  p, "'", 1);.}../
2d80: 2a 0a 2a 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75  *.** Callback fu
2d90: 6e 63 74 69 6f 6e 20 66 6f 72 20 65 76 61 6c 53  nction for evalS
2da0: 71 6c 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ql().*/.static i
2db0: 6e 74 20 65 76 61 6c 43 61 6c 6c 62 61 63 6b 28  nt evalCallback(
2dc0: 76 6f 69 64 20 2a 70 43 44 61 74 61 2c 20 69 6e  void *pCData, in
2dd0: 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61  t argc, char **a
2de0: 72 67 76 2c 20 63 68 61 72 20 2a 2a 61 7a 43 6f  rgv, char **azCo
2df0: 6c 29 7b 0a 20 20 53 74 72 69 6e 67 20 2a 70 20  l){.  String *p 
2e00: 3d 20 28 53 74 72 69 6e 67 2a 29 70 43 44 61 74  = (String*)pCDat
2e10: 61 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 55 4e  a;.  int i;.  UN
2e20: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
2e30: 7a 43 6f 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30  zCol);.  for(i=0
2e40: 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 20 73  ; i<argc; i++) s
2e50: 74 72 69 6e 67 41 70 70 65 6e 64 54 65 72 6d 28  tringAppendTerm(
2e60: 70 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 72  p, argv[i]);.  r
2e70: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
2e80: 2a 20 52 75 6e 20 61 72 62 69 74 72 61 72 79 20  * Run arbitrary 
2e90: 53 51 4c 20 61 6e 64 20 72 65 63 6f 72 64 20 74  SQL and record t
2ea0: 68 65 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e  he results in an
2eb0: 20 6f 75 74 70 75 74 20 73 74 72 69 6e 67 0a 2a   output string.*
2ec0: 2a 20 67 69 76 65 6e 20 62 79 20 74 68 65 20 66  * given by the f
2ed0: 69 72 73 74 20 70 61 72 61 6d 65 74 65 72 2e 0a  irst parameter..
2ee0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 76  */.static int ev
2ef0: 61 6c 53 71 6c 28 53 74 72 69 6e 67 20 2a 70 2c  alSql(String *p,
2f00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
2f10: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
2f20: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72  _list ap;.  char
2f30: 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 72 63   *zSql;.  int rc
2f40: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
2f50: 67 20 3d 20 30 3b 0a 20 20 76 61 5f 73 74 61 72  g = 0;.  va_star
2f60: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
2f70: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
2f80: 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61  _vmprintf(zForma
2f90: 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  t, ap);.  va_end
2fa0: 28 61 70 29 3b 0a 20 20 61 73 73 65 72 74 28 20  (ap);.  assert( 
2fb0: 67 2e 69 54 69 6d 65 6f 75 74 3e 30 20 29 3b 0a  g.iTimeout>0 );.
2fc0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
2fd0: 78 65 63 28 67 2e 64 62 2c 20 7a 53 71 6c 2c 20  xec(g.db, zSql, 
2fe0: 65 76 61 6c 43 61 6c 6c 62 61 63 6b 2c 20 70 2c  evalCallback, p,
2ff0: 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71   &zErrMsg);.  sq
3000: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
3010: 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
3020: 20 20 63 68 61 72 20 7a 45 72 72 5b 33 30 5d 3b    char zErr[30];
3030: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
3040: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 45 72  rintf(sizeof(zEr
3050: 72 29 2c 20 7a 45 72 72 2c 20 22 65 72 72 6f 72  r), zErr, "error
3060: 28 25 64 29 22 2c 20 72 63 29 3b 0a 20 20 20 20  (%d)", rc);.    
3070: 73 74 72 69 6e 67 41 70 70 65 6e 64 54 65 72 6d  stringAppendTerm
3080: 28 70 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 69  (p, zErr);.    i
3090: 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  f( zErrMsg ){.  
30a0: 20 20 20 20 73 74 72 69 6e 67 41 70 70 65 6e 64      stringAppend
30b0: 54 65 72 6d 28 70 2c 20 7a 45 72 72 4d 73 67 29  Term(p, zErrMsg)
30c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
30d0: 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20  free(zErrMsg);. 
30e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
30f0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
3100: 75 78 69 6c 69 61 72 79 20 53 51 4c 20 66 75 6e  uxiliary SQL fun
3110: 63 74 69 6f 6e 20 74 6f 20 72 65 63 75 72 73 69  ction to recursi
3120: 76 65 6c 79 20 65 76 61 6c 75 61 74 65 20 53 51  vely evaluate SQ
3130: 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  L..*/.static voi
3140: 64 20 65 76 61 6c 46 75 6e 63 28 0a 20 20 73 71  d evalFunc(.  sq
3150: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
3160: 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72  ontext,.  int ar
3170: 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  gc,.  sqlite3_va
3180: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
3190: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71  sqlite3 *db = sq
31a0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62  lite3_context_db
31b0: 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29  _handle(context)
31c0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
31d0: 7a 53 71 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68  zSql = (const ch
31e0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
31f0: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
3200: 0a 20 20 53 74 72 69 6e 67 20 72 65 73 3b 0a 20  .  String res;. 
3210: 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
3220: 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
3230: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
3240: 28 61 72 67 63 29 3b 0a 20 20 6d 65 6d 73 65 74  (argc);.  memset
3250: 28 26 72 65 73 2c 20 30 2c 20 73 69 7a 65 6f 66  (&res, 0, sizeof
3260: 28 72 65 73 29 29 3b 0a 20 20 72 63 20 3d 20 73  (res));.  rc = s
3270: 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
3280: 7a 53 71 6c 2c 20 65 76 61 6c 43 61 6c 6c 62 61  zSql, evalCallba
3290: 63 6b 2c 20 26 72 65 73 2c 20 26 7a 45 72 72 4d  ck, &res, &zErrM
32a0: 73 67 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 4d  sg);.  if( zErrM
32b0: 73 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  sg ){.    sqlite
32c0: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
32d0: 6f 6e 74 65 78 74 2c 20 7a 45 72 72 4d 73 67 2c  ontext, zErrMsg,
32e0: 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65   -1);.    sqlite
32f0: 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b  3_free(zErrMsg);
3300: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 20  .  }else if( rc 
3310: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
3320: 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 6f 64 65  esult_error_code
3330: 28 63 6f 6e 74 65 78 74 2c 20 72 63 29 3b 0a 20  (context, rc);. 
3340: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
3350: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
3360: 63 6f 6e 74 65 78 74 2c 20 72 65 73 2e 7a 2c 20  context, res.z, 
3370: 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
3380: 49 45 4e 54 29 3b 0a 20 20 7d 0a 20 20 73 74 72  IENT);.  }.  str
3390: 69 6e 67 46 72 65 65 28 26 72 65 73 29 3b 0a 7d  ingFree(&res);.}
33a0: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 75 70 20  ../*.** Look up 
33b0: 74 68 65 20 6e 65 78 74 20 74 61 73 6b 20 66 6f  the next task fo
33c0: 72 20 63 6c 69 65 6e 74 20 69 43 6c 69 65 6e 74  r client iClient
33d0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
33e0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ..** Return the 
33f0: 74 61 73 6b 20 73 63 72 69 70 74 20 61 6e 64 20  task script and 
3400: 74 68 65 20 74 61 73 6b 20 6e 75 6d 62 65 72 20  the task number 
3410: 61 6e 64 20 6d 61 72 6b 20 74 68 61 74 0a 2a 2a  and mark that.**
3420: 20 74 61 73 6b 20 61 73 20 62 65 69 6e 67 20 75   task as being u
3430: 6e 64 65 72 20 77 61 79 2e 0a 2a 2f 0a 73 74 61  nder way..*/.sta
3440: 74 69 63 20 69 6e 74 20 73 74 61 72 74 53 63 72  tic int startScr
3450: 69 70 74 28 0a 20 20 69 6e 74 20 69 43 6c 69 65  ipt(.  int iClie
3460: 6e 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  nt,             
3470: 20 2f 2a 20 54 68 65 20 63 6c 69 65 6e 74 20 6e   /* The client n
3480: 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20  umber */.  char 
3490: 2a 2a 70 7a 53 63 72 69 70 74 2c 20 20 20 20 20  **pzScript,     
34a0: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 61       /* Write ta
34b0: 73 6b 20 73 63 72 69 70 74 20 68 65 72 65 20 2a  sk script here *
34c0: 2f 0a 20 20 69 6e 74 20 2a 70 54 61 73 6b 49 64  /.  int *pTaskId
34d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
34e0: 20 57 72 69 74 65 20 74 61 73 6b 20 6e 75 6d 62   Write task numb
34f0: 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 63 68 61  er here */.  cha
3500: 72 20 2a 2a 70 7a 54 61 73 6b 4e 61 6d 65 20 20  r **pzTaskName  
3510: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
3520: 66 20 74 68 65 20 74 61 73 6b 20 2a 2f 0a 29 7b  f the task */.){
3530: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
3540: 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 6e  *pStmt = 0;.  in
3550: 74 20 74 61 73 6b 49 64 3b 0a 20 20 69 6e 74 20  t taskId;.  int 
3560: 72 63 3b 0a 20 20 69 6e 74 20 74 6f 74 61 6c 54  rc;.  int totalT
3570: 69 6d 65 20 3d 20 30 3b 0a 0a 20 20 2a 70 7a 53  ime = 0;..  *pzS
3580: 63 72 69 70 74 20 3d 20 30 3b 0a 20 20 67 2e 69  cript = 0;.  g.i
3590: 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 20 20 77  Timeout = 0;.  w
35a0: 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 72 63 20  hile(1){.    rc 
35b0: 3d 20 74 72 79 53 71 6c 28 22 42 45 47 49 4e 20  = trySql("BEGIN 
35c0: 49 4d 4d 45 44 49 41 54 45 22 29 3b 0a 20 20 20  IMMEDIATE");.   
35d0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
35e0: 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 73 71  BUSY ){.      sq
35f0: 6c 69 74 65 33 5f 73 6c 65 65 70 28 31 30 29 3b  lite3_sleep(10);
3600: 0a 20 20 20 20 20 20 74 6f 74 61 6c 54 69 6d 65  .      totalTime
3610: 20 2b 3d 20 31 30 3b 0a 20 20 20 20 20 20 63 6f   += 10;.      co
3620: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
3630: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
3640: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 61 74  _OK ){.      fat
3650: 61 6c 45 72 72 6f 72 28 22 69 6e 20 73 74 61 72  alError("in star
3660: 74 53 63 72 69 70 74 3a 20 25 73 22 2c 20 73 71  tScript: %s", sq
3670: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 67 2e 64  lite3_errmsg(g.d
3680: 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  b));.    }.    i
3690: 66 28 20 67 2e 6e 45 72 72 6f 72 20 7c 7c 20 67  f( g.nError || g
36a0: 2e 6e 54 65 73 74 20 29 7b 0a 20 20 20 20 20 20  .nTest ){.      
36b0: 72 75 6e 53 71 6c 28 22 55 50 44 41 54 45 20 63  runSql("UPDATE c
36c0: 6f 75 6e 74 65 72 73 20 53 45 54 20 6e 45 72 72  ounters SET nErr
36d0: 6f 72 3d 6e 45 72 72 6f 72 2b 25 64 2c 20 6e 54  or=nError+%d, nT
36e0: 65 73 74 3d 6e 54 65 73 74 2b 25 64 22 2c 0a 20  est=nTest+%d",. 
36f0: 20 20 20 20 20 20 20 20 20 20 20 20 67 2e 6e 45              g.nE
3700: 72 72 6f 72 2c 20 67 2e 6e 54 65 73 74 29 3b 0a  rror, g.nTest);.
3710: 20 20 20 20 20 20 67 2e 6e 45 72 72 6f 72 20 3d        g.nError =
3720: 20 30 3b 0a 20 20 20 20 20 20 67 2e 6e 54 65 73   0;.      g.nTes
3730: 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 0;.    }.   
3740: 20 70 53 74 6d 74 20 3d 20 70 72 65 70 61 72 65   pStmt = prepare
3750: 53 71 6c 28 22 53 45 4c 45 43 54 20 31 20 46 52  Sql("SELECT 1 FR
3760: 4f 4d 20 63 6c 69 65 6e 74 20 57 48 45 52 45 20  OM client WHERE 
3770: 69 64 3d 25 64 20 41 4e 44 20 77 61 6e 74 48 61  id=%d AND wantHa
3780: 6c 74 22 2c 69 43 6c 69 65 6e 74 29 3b 0a 20 20  lt",iClient);.  
3790: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
37a0: 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  tep(pStmt);.    
37b0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
37c0: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28  (pStmt);.    if(
37d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20   rc==SQLITE_ROW 
37e0: 29 7b 0a 20 20 20 20 20 20 72 75 6e 53 71 6c 28  ){.      runSql(
37f0: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 6c 69  "DELETE FROM cli
3800: 65 6e 74 20 57 48 45 52 45 20 69 64 3d 25 64 22  ent WHERE id=%d"
3810: 2c 20 69 43 6c 69 65 6e 74 29 3b 0a 20 20 20 20  , iClient);.    
3820: 20 20 67 2e 69 54 69 6d 65 6f 75 74 20 3d 20 44    g.iTimeout = D
3830: 45 46 41 55 4c 54 5f 54 49 4d 45 4f 55 54 3b 0a  EFAULT_TIMEOUT;.
3840: 20 20 20 20 20 20 72 75 6e 53 71 6c 28 22 43 4f        runSql("CO
3850: 4d 4d 49 54 20 54 52 41 4e 53 41 43 54 49 4f 4e  MMIT TRANSACTION
3860: 3b 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ;");.      retur
3870: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
3880: 20 20 20 7d 0a 20 20 20 20 70 53 74 6d 74 20 3d     }.    pStmt =
3890: 20 70 72 65 70 61 72 65 53 71 6c 28 0a 20 20 20   prepareSql(.   
38a0: 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45             "SELE
38b0: 43 54 20 73 63 72 69 70 74 2c 20 69 64 2c 20 6e  CT script, id, n
38c0: 61 6d 65 20 46 52 4f 4d 20 74 61 73 6b 22 0a 20  ame FROM task". 
38d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57               " W
38e0: 48 45 52 45 20 63 6c 69 65 6e 74 3d 25 64 20 41  HERE client=%d A
38f0: 4e 44 20 73 74 61 72 74 74 69 6d 65 20 49 53 20  ND starttime IS 
3900: 4e 55 4c 4c 22 0a 20 20 20 20 20 20 20 20 20 20  NULL".          
3910: 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 69      " ORDER BY i
3920: 64 20 4c 49 4d 49 54 20 31 22 2c 20 69 43 6c 69  d LIMIT 1", iCli
3930: 65 6e 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ent);.    rc = s
3940: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
3950: 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  t);.    if( rc==
3960: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
3970: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69      int n = sqli
3980: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
3990: 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
39a0: 20 20 2a 70 7a 53 63 72 69 70 74 20 3d 20 73 71    *pzScript = sq
39b0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 2b 31  lite3_malloc(n+1
39c0: 29 3b 0a 20 20 20 20 20 20 73 74 72 63 70 79 28  );.      strcpy(
39d0: 2a 70 7a 53 63 72 69 70 74 2c 20 28 63 6f 6e 73  *pzScript, (cons
39e0: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
39f0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
3a00: 74 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 2a 70  t, 0));.      *p
3a10: 54 61 73 6b 49 64 20 3d 20 74 61 73 6b 49 64 20  TaskId = taskId 
3a20: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
3a30: 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a  _int(pStmt, 1);.
3a40: 20 20 20 20 20 20 2a 70 7a 54 61 73 6b 4e 61 6d        *pzTaskNam
3a50: 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
3a60: 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65  ntf("%s", sqlite
3a70: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
3a80: 74 6d 74 2c 20 32 29 29 3b 0a 20 20 20 20 20 20  tmt, 2));.      
3a90: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
3aa0: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72  (pStmt);.      r
3ab0: 75 6e 53 71 6c 28 22 55 50 44 41 54 45 20 74 61  unSql("UPDATE ta
3ac0: 73 6b 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  sk".            
3ad0: 20 22 20 20 20 53 45 54 20 73 74 61 72 74 74 69   "   SET startti
3ae0: 6d 65 3d 73 74 72 66 74 69 6d 65 28 27 25 25 59  me=strftime('%%Y
3af0: 2d 25 25 6d 2d 25 25 64 20 25 25 48 3a 25 25 4d  -%%m-%%d %%H:%%M
3b00: 3a 25 25 66 27 2c 27 6e 6f 77 27 29 22 0a 20 20  :%%f','now')".  
3b10: 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45             " WHE
3b20: 52 45 20 69 64 3d 25 64 3b 22 2c 20 74 61 73 6b  RE id=%d;", task
3b30: 49 64 29 3b 0a 20 20 20 20 20 20 67 2e 69 54 69  Id);.      g.iTi
3b40: 6d 65 6f 75 74 20 3d 20 44 45 46 41 55 4c 54 5f  meout = DEFAULT_
3b50: 54 49 4d 45 4f 55 54 3b 0a 20 20 20 20 20 20 72  TIMEOUT;.      r
3b60: 75 6e 53 71 6c 28 22 43 4f 4d 4d 49 54 20 54 52  unSql("COMMIT TR
3b70: 41 4e 53 41 43 54 49 4f 4e 3b 22 29 3b 0a 20 20  ANSACTION;");.  
3b80: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
3b90: 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
3ba0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
3bb0: 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28  (pStmt);.    if(
3bc0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
3bd0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 74 6f   ){.      if( to
3be0: 74 61 6c 54 69 6d 65 3e 33 30 30 30 30 20 29 7b  talTime>30000 ){
3bf0: 0a 20 20 20 20 20 20 20 20 65 72 72 6f 72 4d 65  .        errorMe
3c00: 73 73 61 67 65 28 22 57 61 69 74 65 64 20 6f 76  ssage("Waited ov
3c10: 65 72 20 33 30 20 73 65 63 6f 6e 64 73 20 77 69  er 30 seconds wi
3c20: 74 68 20 6e 6f 20 77 6f 72 6b 2e 20 20 47 69 76  th no work.  Giv
3c30: 69 6e 67 20 75 70 2e 22 29 3b 0a 20 20 20 20 20  ing up.");.     
3c40: 20 20 20 72 75 6e 53 71 6c 28 22 44 45 4c 45 54     runSql("DELET
3c50: 45 20 46 52 4f 4d 20 63 6c 69 65 6e 74 20 57 48  E FROM client WH
3c60: 45 52 45 20 69 64 3d 25 64 3b 20 43 4f 4d 4d 49  ERE id=%d; COMMI
3c70: 54 3b 22 2c 20 69 43 6c 69 65 6e 74 29 3b 0a 20  T;", iClient);. 
3c80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
3c90: 6c 6f 73 65 28 67 2e 64 62 29 3b 0a 20 20 20 20  lose(g.db);.    
3ca0: 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20      exit(1);.   
3cb0: 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65     }.      while
3cc0: 28 20 74 72 79 53 71 6c 28 22 43 4f 4d 4d 49 54  ( trySql("COMMIT
3cd0: 22 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  ")==SQLITE_BUSY 
3ce0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
3cf0: 65 33 5f 73 6c 65 65 70 28 31 30 29 3b 0a 20 20  e3_sleep(10);.  
3d00: 20 20 20 20 20 20 74 6f 74 61 6c 54 69 6d 65 20        totalTime 
3d10: 2b 3d 20 31 30 3b 0a 20 20 20 20 20 20 7d 0a 20  += 10;.      }. 
3d20: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65       sqlite3_sle
3d30: 65 70 28 31 30 30 29 3b 0a 20 20 20 20 20 20 74  ep(100);.      t
3d40: 6f 74 61 6c 54 69 6d 65 20 2b 3d 20 31 30 30 3b  otalTime += 100;
3d50: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
3d60: 0a 20 20 20 20 7d 0a 20 20 20 20 66 61 74 61 6c  .    }.    fatal
3d70: 45 72 72 6f 72 28 22 25 73 22 2c 20 73 71 6c 69  Error("%s", sqli
3d80: 74 65 33 5f 65 72 72 6d 73 67 28 67 2e 64 62 29  te3_errmsg(g.db)
3d90: 29 3b 0a 20 20 7d 0a 20 20 67 2e 69 54 69 6d 65  );.  }.  g.iTime
3da0: 6f 75 74 20 3d 20 44 45 46 41 55 4c 54 5f 54 49  out = DEFAULT_TI
3db0: 4d 45 4f 55 54 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  MEOUT;.}../*.** 
3dc0: 4d 61 72 6b 20 61 20 73 63 72 69 70 74 20 61 73  Mark a script as
3dd0: 20 68 61 76 69 6e 67 20 66 69 6e 69 73 68 65 64   having finished
3de0: 2e 20 20 20 52 65 6d 6f 76 65 20 74 68 65 20 43  .   Remove the C
3df0: 4c 49 45 4e 54 20 74 61 62 6c 65 20 65 6e 74 72  LIENT table entr
3e00: 79 0a 2a 2a 20 69 66 20 62 53 68 75 74 64 6f 77  y.** if bShutdow
3e10: 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74  n is true..*/.st
3e20: 61 74 69 63 20 69 6e 74 20 66 69 6e 69 73 68 53  atic int finishS
3e30: 63 72 69 70 74 28 69 6e 74 20 69 43 6c 69 65 6e  cript(int iClien
3e40: 74 2c 20 69 6e 74 20 74 61 73 6b 49 64 2c 20 69  t, int taskId, i
3e50: 6e 74 20 62 53 68 75 74 64 6f 77 6e 29 7b 0a 20  nt bShutdown){. 
3e60: 20 72 75 6e 53 71 6c 28 22 55 50 44 41 54 45 20   runSql("UPDATE 
3e70: 74 61 73 6b 22 0a 20 20 20 20 20 20 20 20 20 22  task".         "
3e80: 20 20 20 53 45 54 20 65 6e 64 74 69 6d 65 3d 73     SET endtime=s
3e90: 74 72 66 74 69 6d 65 28 27 25 25 59 2d 25 25 6d  trftime('%%Y-%%m
3ea0: 2d 25 25 64 20 25 25 48 3a 25 25 4d 3a 25 25 66  -%%d %%H:%%M:%%f
3eb0: 27 2c 27 6e 6f 77 27 29 22 0a 20 20 20 20 20 20  ','now')".      
3ec0: 20 20 20 22 20 57 48 45 52 45 20 69 64 3d 25 64     " WHERE id=%d
3ed0: 3b 22 2c 20 74 61 73 6b 49 64 29 3b 0a 20 20 69  ;", taskId);.  i
3ee0: 66 28 20 62 53 68 75 74 64 6f 77 6e 20 29 7b 0a  f( bShutdown ){.
3ef0: 20 20 20 20 72 75 6e 53 71 6c 28 22 44 45 4c 45      runSql("DELE
3f00: 54 45 20 46 52 4f 4d 20 63 6c 69 65 6e 74 20 57  TE FROM client W
3f10: 48 45 52 45 20 69 64 3d 25 64 22 2c 20 69 43 6c  HERE id=%d", iCl
3f20: 69 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ient);.  }.  ret
3f30: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
3f40: 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 75 70  ../*.** Start up
3f50: 20 61 20 63 6c 69 65 6e 74 20 70 72 6f 63 65 73   a client proces
3f60: 73 20 66 6f 72 20 69 43 6c 69 65 6e 74 2c 20 69  s for iClient, i
3f70: 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
3f80: 61 64 79 0a 2a 2a 20 72 75 6e 6e 69 6e 67 2e 20  ady.** running. 
3f90: 20 49 66 20 74 68 65 20 63 6c 69 65 6e 74 20 69   If the client i
3fa0: 73 20 61 6c 72 65 61 64 79 20 72 75 6e 6e 69 6e  s already runnin
3fb0: 67 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  g, then this rou
3fc0: 74 69 6e 65 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  tine.** is a no-
3fd0: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  op..*/.static vo
3fe0: 69 64 20 73 74 61 72 74 43 6c 69 65 6e 74 28 69  id startClient(i
3ff0: 6e 74 20 69 43 6c 69 65 6e 74 29 7b 0a 20 20 72  nt iClient){.  r
4000: 75 6e 53 71 6c 28 22 49 4e 53 45 52 54 20 4f 52  unSql("INSERT OR
4010: 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 63 6c 69   IGNORE INTO cli
4020: 65 6e 74 20 56 41 4c 55 45 53 28 25 64 2c 30 29  ent VALUES(%d,0)
4030: 22 2c 20 69 43 6c 69 65 6e 74 29 3b 0a 20 20 69  ", iClient);.  i
4040: 66 28 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  f( sqlite3_chang
4050: 65 73 28 67 2e 64 62 29 20 29 7b 0a 20 20 20 20  es(g.db) ){.    
4060: 63 68 61 72 20 2a 7a 53 79 73 3b 0a 20 20 20 20  char *zSys;.    
4070: 69 6e 74 20 72 63 3b 0a 20 20 20 20 7a 53 79 73  int rc;.    zSys
4080: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
4090: 74 66 28 22 25 73 20 5c 22 25 73 5c 22 20 2d 2d  tf("%s \"%s\" --
40a0: 63 6c 69 65 6e 74 20 25 64 20 2d 2d 74 72 61 63  client %d --trac
40b0: 65 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  e %d",.         
40c0: 20 20 20 20 20 20 20 20 67 2e 61 72 67 76 30 2c          g.argv0,
40d0: 20 67 2e 7a 44 62 46 69 6c 65 2c 20 69 43 6c 69   g.zDbFile, iCli
40e0: 65 6e 74 2c 20 67 2e 69 54 72 61 63 65 29 3b 0a  ent, g.iTrace);.
40f0: 20 20 20 20 69 66 28 20 67 2e 62 53 71 6c 54 72      if( g.bSqlTr
4100: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 7a 53 79  ace ){.      zSy
4110: 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  s = sqlite3_mpri
4120: 6e 74 66 28 22 25 7a 20 2d 2d 73 71 6c 74 72 61  ntf("%z --sqltra
4130: 63 65 22 2c 20 7a 53 79 73 29 3b 0a 20 20 20 20  ce", zSys);.    
4140: 7d 0a 20 20 20 20 69 66 28 20 67 2e 62 53 79 6e  }.    if( g.bSyn
4150: 63 20 29 7b 0a 20 20 20 20 20 20 7a 53 79 73 20  c ){.      zSys 
4160: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
4170: 66 28 22 25 7a 20 2d 2d 73 79 6e 63 22 2c 20 7a  f("%z --sync", z
4180: 53 79 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sys);.    }.    
4190: 69 66 28 20 67 2e 7a 56 66 73 20 29 7b 0a 20 20  if( g.zVfs ){.  
41a0: 20 20 20 20 7a 53 79 73 20 3d 20 73 71 6c 69 74      zSys = sqlit
41b0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 20 2d  e3_mprintf("%z -
41c0: 2d 76 66 73 20 5c 22 25 73 5c 22 22 2c 20 7a 53  -vfs \"%s\"", zS
41d0: 79 73 2c 20 67 2e 7a 56 66 73 29 3b 0a 20 20 20  ys, g.zVfs);.   
41e0: 20 7d 0a 20 20 20 20 69 66 28 20 67 2e 69 54 72   }.    if( g.iTr
41f0: 61 63 65 3e 3d 32 20 29 20 6c 6f 67 4d 65 73 73  ace>=2 ) logMess
4200: 61 67 65 28 22 73 79 73 74 65 6d 28 27 25 71 27  age("system('%q'
4210: 29 22 2c 20 7a 53 79 73 29 3b 0a 23 69 66 20 21  )", zSys);.#if !
4220: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a  defined(_WIN32).
4230: 20 20 20 20 7a 53 79 73 20 3d 20 73 71 6c 69 74      zSys = sqlit
4240: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 20 26  e3_mprintf("%z &
4250: 22 2c 20 7a 53 79 73 29 3b 0a 20 20 20 20 72 63  ", zSys);.    rc
4260: 20 3d 20 73 79 73 74 65 6d 28 7a 53 79 73 29 3b   = system(zSys);
4270: 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 65 72  .    if( rc ) er
4280: 72 6f 72 4d 65 73 73 61 67 65 28 22 73 79 73 74  rorMessage("syst
4290: 65 6d 28 29 20 66 61 69 6c 73 20 77 69 74 68 20  em() fails with 
42a0: 65 72 72 6f 72 20 63 6f 64 65 20 25 64 22 2c 20  error code %d", 
42b0: 72 63 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 7b  rc);.#else.    {
42c0: 0a 20 20 20 20 20 20 53 54 41 52 54 55 50 49 4e  .      STARTUPIN
42d0: 46 4f 41 20 73 74 61 72 74 75 70 49 6e 66 6f 3b  FOA startupInfo;
42e0: 0a 20 20 20 20 20 20 50 52 4f 43 45 53 53 5f 49  .      PROCESS_I
42f0: 4e 46 4f 52 4d 41 54 49 4f 4e 20 70 72 6f 63 65  NFORMATION proce
4300: 73 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 6d 65  ssInfo;.      me
4310: 6d 73 65 74 28 26 73 74 61 72 74 75 70 49 6e 66  mset(&startupInf
4320: 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 74 61  o, 0, sizeof(sta
4330: 72 74 75 70 49 6e 66 6f 29 29 3b 0a 20 20 20 20  rtupInfo));.    
4340: 20 20 73 74 61 72 74 75 70 49 6e 66 6f 2e 63 62    startupInfo.cb
4350: 20 3d 20 73 69 7a 65 6f 66 28 73 74 61 72 74 75   = sizeof(startu
4360: 70 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 6d 65  pInfo);.      me
4370: 6d 73 65 74 28 26 70 72 6f 63 65 73 73 49 6e 66  mset(&processInf
4380: 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 72 6f  o, 0, sizeof(pro
4390: 63 65 73 73 49 6e 66 6f 29 29 3b 0a 20 20 20 20  cessInfo));.    
43a0: 20 20 72 63 20 3d 20 43 72 65 61 74 65 50 72 6f    rc = CreatePro
43b0: 63 65 73 73 41 28 4e 55 4c 4c 2c 20 7a 53 79 73  cessA(NULL, zSys
43c0: 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 46 41  , NULL, NULL, FA
43d0: 4c 53 45 2c 20 30 2c 20 4e 55 4c 4c 2c 20 4e 55  LSE, 0, NULL, NU
43e0: 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL,.            
43f0: 20 20 20 20 20 20 20 20 20 20 20 20 26 73 74 61              &sta
4400: 72 74 75 70 49 6e 66 6f 2c 20 26 70 72 6f 63 65  rtupInfo, &proce
4410: 73 73 49 6e 66 6f 29 3b 0a 20 20 20 20 20 20 69  ssInfo);.      i
4420: 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
4430: 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 72 6f   CloseHandle(pro
4440: 63 65 73 73 49 6e 66 6f 2e 68 54 68 72 65 61 64  cessInfo.hThread
4450: 29 3b 0a 20 20 20 20 20 20 20 20 43 6c 6f 73 65  );.        Close
4460: 48 61 6e 64 6c 65 28 70 72 6f 63 65 73 73 49 6e  Handle(processIn
4470: 66 6f 2e 68 50 72 6f 63 65 73 73 29 3b 0a 20 20  fo.hProcess);.  
4480: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4490: 20 20 20 65 72 72 6f 72 4d 65 73 73 61 67 65 28     errorMessage(
44a0: 22 43 72 65 61 74 65 50 72 6f 63 65 73 73 41 28  "CreateProcessA(
44b0: 29 20 66 61 69 6c 73 20 77 69 74 68 20 65 72 72  ) fails with err
44c0: 6f 72 20 63 6f 64 65 20 25 6c 75 22 2c 0a 20 20  or code %lu",.  
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
44e0: 20 20 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28     GetLastError(
44f0: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
4500: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  }.#endif.    sql
4510: 69 74 65 33 5f 66 72 65 65 28 7a 53 79 73 29 3b  ite3_free(zSys);
4520: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
4530: 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  ad the entire co
4540: 6e 74 65 6e 74 20 6f 66 20 61 20 66 69 6c 65 20  ntent of a file 
4550: 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2f 0a 73  into memory.*/.s
4560: 74 61 74 69 63 20 63 68 61 72 20 2a 72 65 61 64  tatic char *read
4570: 46 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20  File(const char 
4580: 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 46  *zFilename){.  F
4590: 49 4c 45 20 2a 69 6e 20 3d 20 66 6f 70 65 6e 28  ILE *in = fopen(
45a0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 72 62 22 29  zFilename, "rb")
45b0: 3b 0a 20 20 6c 6f 6e 67 20 73 7a 3b 0a 20 20 63  ;.  long sz;.  c
45c0: 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 69 6e  har *z;.  if( in
45d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 61 74 61 6c  ==0 ){.    fatal
45e0: 45 72 72 6f 72 28 22 63 61 6e 6e 6f 74 20 6f 70  Error("cannot op
45f0: 65 6e 20 5c 22 25 73 5c 22 20 66 6f 72 20 72 65  en \"%s\" for re
4600: 61 64 69 6e 67 22 2c 20 7a 46 69 6c 65 6e 61 6d  ading", zFilenam
4610: 65 29 3b 0a 20 20 7d 0a 20 20 66 73 65 65 6b 28  e);.  }.  fseek(
4620: 69 6e 2c 20 30 2c 20 53 45 45 4b 5f 45 4e 44 29  in, 0, SEEK_END)
4630: 3b 0a 20 20 73 7a 20 3d 20 66 74 65 6c 6c 28 69  ;.  sz = ftell(i
4640: 6e 29 3b 0a 20 20 72 65 77 69 6e 64 28 69 6e 29  n);.  rewind(in)
4650: 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  z = sqlite3_
4660: 6d 61 6c 6c 6f 63 28 20 73 7a 2b 31 20 29 3b 0a  malloc( sz+1 );.
4670: 20 20 73 7a 20 3d 20 28 6c 6f 6e 67 29 66 72 65    sz = (long)fre
4680: 61 64 28 7a 2c 20 31 2c 20 73 7a 2c 20 69 6e 29  ad(z, 1, sz, in)
4690: 3b 0a 20 20 7a 5b 73 7a 5d 20 3d 20 30 3b 0a 20  ;.  z[sz] = 0;. 
46a0: 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 72   fclose(in);.  r
46b0: 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn z;.}../*.*
46c0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e  * Return the len
46d0: 67 74 68 20 6f 66 20 74 68 65 20 6e 65 78 74 20  gth of the next 
46e0: 74 6f 6b 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  token..*/.static
46f0: 20 69 6e 74 20 74 6f 6b 65 6e 4c 65 6e 67 74 68   int tokenLength
4700: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
4710: 69 6e 74 20 2a 70 6e 4c 69 6e 65 29 7b 0a 20 20  int *pnLine){.  
4720: 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 69 66 28  int n = 0;.  if(
4730: 20 49 53 53 50 41 43 45 28 7a 5b 30 5d 29 20 7c   ISSPACE(z[0]) |
4740: 7c 20 28 7a 5b 30 5d 3d 3d 27 2f 27 20 26 26 20  | (z[0]=='/' && 
4750: 7a 5b 31 5d 3d 3d 27 2a 27 29 20 29 7b 0a 20 20  z[1]=='*') ){.  
4760: 20 20 69 6e 74 20 69 6e 43 20 3d 20 30 3b 0a 20    int inC = 0;. 
4770: 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 69 66     int c;.    if
4780: 28 20 7a 5b 30 5d 3d 3d 27 2f 27 20 29 7b 0a 20  ( z[0]=='/' ){. 
4790: 20 20 20 20 20 69 6e 43 20 3d 20 31 3b 0a 20 20       inC = 1;.  
47a0: 20 20 20 20 6e 20 3d 20 32 3b 0a 20 20 20 20 7d      n = 2;.    }
47b0: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d  .    while( (c =
47c0: 20 7a 5b 6e 2b 2b 5d 29 21 3d 30 20 29 7b 0a 20   z[n++])!=0 ){. 
47d0: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27       if( c=='\n'
47e0: 20 29 20 28 2a 70 6e 4c 69 6e 65 29 2b 2b 3b 0a   ) (*pnLine)++;.
47f0: 20 20 20 20 20 20 69 66 28 20 49 53 53 50 41 43        if( ISSPAC
4800: 45 28 63 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  E(c) ) continue;
4810: 0a 20 20 20 20 20 20 69 66 28 20 69 6e 43 20 26  .      if( inC &
4820: 26 20 63 3d 3d 27 2a 27 20 26 26 20 7a 5b 6e 5d  & c=='*' && z[n]
4830: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='/' ){.       
4840: 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 6e   n++;.        in
4850: 43 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  C = 0;.      }el
4860: 73 65 20 69 66 28 20 21 69 6e 43 20 26 26 20 63  se if( !inC && c
4870: 3d 3d 27 2f 27 20 26 26 20 7a 5b 6e 5d 3d 3d 27  =='/' && z[n]=='
4880: 2a 27 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 2b  *' ){.        n+
4890: 2b 3b 0a 20 20 20 20 20 20 20 20 69 6e 43 20 3d  +;.        inC =
48a0: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
48b0: 69 66 28 20 21 69 6e 43 20 29 7b 0a 20 20 20 20  if( !inC ){.    
48c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
48d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e 2d 2d   }.    }.    n--
48e0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b  ;.  }else if( z[
48f0: 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 5b 31 5d 3d  0]=='-' && z[1]=
4900: 3d 27 2d 27 20 29 7b 0a 20 20 20 20 66 6f 72 28  ='-' ){.    for(
4910: 6e 3d 32 3b 20 7a 5b 6e 5d 20 26 26 20 7a 5b 6e  n=2; z[n] && z[n
4920: 5d 21 3d 27 5c 6e 27 3b 20 6e 2b 2b 29 7b 7d 0a  ]!='\n'; n++){}.
4930: 20 20 20 20 69 66 28 20 7a 5b 6e 5d 20 29 7b 20      if( z[n] ){ 
4940: 28 2a 70 6e 4c 69 6e 65 29 2b 2b 3b 20 6e 2b 2b  (*pnLine)++; n++
4950: 3b 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ; }.  }else if( 
4960: 7a 5b 30 5d 3d 3d 27 22 27 20 7c 7c 20 7a 5b 30  z[0]=='"' || z[0
4970: 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 69  ]=='\'' ){.    i
4980: 6e 74 20 64 65 6c 69 6d 20 3d 20 7a 5b 30 5d 3b  nt delim = z[0];
4990: 0a 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20 7a 5b  .    for(n=1; z[
49a0: 6e 5d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 20 20 20  n]; n++){.      
49b0: 69 66 28 20 7a 5b 6e 5d 3d 3d 27 5c 6e 27 20 29  if( z[n]=='\n' )
49c0: 20 28 2a 70 6e 4c 69 6e 65 29 2b 2b 3b 0a 20 20   (*pnLine)++;.  
49d0: 20 20 20 20 69 66 28 20 7a 5b 6e 5d 3d 3d 64 65      if( z[n]==de
49e0: 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  lim ){.        n
49f0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ++;.        if( 
4a00: 7a 5b 6e 2b 31 5d 21 3d 64 65 6c 69 6d 20 29 20  z[n+1]!=delim ) 
4a10: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
4a20: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
4a30: 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 66 6f 72    int c;.    for
4a40: 28 6e 3d 31 3b 20 28 63 20 3d 20 7a 5b 6e 5d 29  (n=1; (c = z[n])
4a50: 21 3d 30 20 26 26 20 21 49 53 53 50 41 43 45 28  !=0 && !ISSPACE(
4a60: 63 29 20 26 26 20 63 21 3d 27 22 27 20 26 26 20  c) && c!='"' && 
4a70: 63 21 3d 27 5c 27 27 20 26 26 20 63 21 3d 27 3b  c!='\'' && c!=';
4a80: 27 3b 20 6e 2b 2b 29 7b 7d 0a 20 20 7d 0a 20 20  '; n++){}.  }.  
4a90: 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
4aa0: 2a 2a 20 43 6f 70 79 20 61 20 73 69 6e 67 6c 65  ** Copy a single
4ab0: 20 74 6f 6b 65 6e 20 69 6e 74 6f 20 61 20 73 74   token into a st
4ac0: 72 69 6e 67 20 62 75 66 66 65 72 2e 0a 2a 2f 0a  ring buffer..*/.
4ad0: 73 74 61 74 69 63 20 69 6e 74 20 65 78 74 72 61  static int extra
4ae0: 63 74 54 6f 6b 65 6e 28 63 6f 6e 73 74 20 63 68  ctToken(const ch
4af0: 61 72 20 2a 7a 49 6e 2c 20 69 6e 74 20 6e 49 6e  ar *zIn, int nIn
4b00: 2c 20 63 68 61 72 20 2a 7a 4f 75 74 2c 20 69 6e  , char *zOut, in
4b10: 74 20 6e 4f 75 74 29 7b 0a 20 20 69 6e 74 20 69  t nOut){.  int i
4b20: 3b 0a 20 20 69 66 28 20 6e 49 6e 3c 3d 30 20 29  ;.  if( nIn<=0 )
4b30: 7b 0a 20 20 20 20 7a 4f 75 74 5b 30 5d 20 3d 20  {.    zOut[0] = 
4b40: 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  0;.    return 0;
4b50: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
4b60: 69 3c 6e 49 6e 20 26 26 20 69 3c 6e 4f 75 74 2d  i<nIn && i<nOut-
4b70: 31 20 26 26 20 21 49 53 53 50 41 43 45 28 7a 49  1 && !ISSPACE(zI
4b80: 6e 5b 69 5d 29 3b 20 69 2b 2b 29 7b 20 7a 4f 75  n[i]); i++){ zOu
4b90: 74 5b 69 5d 20 3d 20 7a 49 6e 5b 69 5d 3b 20 7d  t[i] = zIn[i]; }
4ba0: 0a 20 20 7a 4f 75 74 5b 69 5d 20 3d 20 30 3b 0a  .  zOut[i] = 0;.
4bb0: 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0a 0a 2f    return i;.}../
4bc0: 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 75  *.** Find the nu
4bd0: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
4be0: 72 73 20 75 70 20 74 6f 20 74 68 65 20 73 74 61  rs up to the sta
4bf0: 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 22  rt of the next "
4c00: 2d 2d 65 6e 64 22 20 74 6f 6b 65 6e 2e 0a 2a 2f  --end" token..*/
4c10: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64  .static int find
4c20: 45 6e 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  End(const char *
4c30: 7a 2c 20 69 6e 74 20 2a 70 6e 4c 69 6e 65 29 7b  z, int *pnLine){
4c40: 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20  .  int n = 0;.  
4c50: 77 68 69 6c 65 28 20 7a 5b 6e 5d 20 26 26 20 28  while( z[n] && (
4c60: 73 74 72 6e 63 6d 70 28 7a 2b 6e 2c 22 2d 2d 65  strncmp(z+n,"--e
4c70: 6e 64 22 2c 35 29 20 7c 7c 20 21 49 53 53 50 41  nd",5) || !ISSPA
4c80: 43 45 28 7a 5b 6e 2b 35 5d 29 29 20 29 7b 0a 20  CE(z[n+5])) ){. 
4c90: 20 20 20 6e 20 2b 3d 20 74 6f 6b 65 6e 4c 65 6e     n += tokenLen
4ca0: 67 74 68 28 7a 2b 6e 2c 20 70 6e 4c 69 6e 65 29  gth(z+n, pnLine)
4cb0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  ;.  }.  return n
4cc0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
4cd0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
4ce0: 61 72 61 63 74 65 72 73 20 75 70 20 74 6f 20 74  aracters up to t
4cf0: 68 65 20 66 69 72 73 74 20 63 68 61 72 61 63 74  he first charact
4d00: 65 72 20 70 61 73 74 20 74 68 65 0a 2a 2a 20 6f  er past the.** o
4d10: 66 20 74 68 65 20 6e 65 78 74 20 22 2d 2d 65 6e  f the next "--en
4d20: 64 69 66 22 20 20 6f 72 20 22 2d 2d 65 6c 73 65  dif"  or "--else
4d30: 22 20 74 6f 6b 65 6e 2e 20 4e 65 73 74 65 64 20  " token. Nested 
4d40: 2d 2d 69 66 20 63 6f 6d 6d 61 6e 64 73 20 61 72  --if commands ar
4d50: 65 0a 2a 2a 20 61 6c 73 6f 20 73 6b 69 70 70 65  e.** also skippe
4d60: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
4d70: 20 66 69 6e 64 45 6e 64 69 66 28 63 6f 6e 73 74   findEndif(const
4d80: 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 73 74   char *z, int st
4d90: 6f 70 41 74 45 6c 73 65 2c 20 69 6e 74 20 2a 70  opAtElse, int *p
4da0: 6e 4c 69 6e 65 29 7b 0a 20 20 69 6e 74 20 6e 20  nLine){.  int n 
4db0: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 7a 5b  = 0;.  while( z[
4dc0: 6e 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 65  n] ){.    int le
4dd0: 6e 20 3d 20 74 6f 6b 65 6e 4c 65 6e 67 74 68 28  n = tokenLength(
4de0: 7a 2b 6e 2c 20 70 6e 4c 69 6e 65 29 3b 0a 20 20  z+n, pnLine);.  
4df0: 20 20 69 66 28 20 28 73 74 72 6e 63 6d 70 28 7a    if( (strncmp(z
4e00: 2b 6e 2c 22 2d 2d 65 6e 64 69 66 22 2c 37 29 3d  +n,"--endif",7)=
4e10: 3d 30 20 26 26 20 49 53 53 50 41 43 45 28 7a 5b  =0 && ISSPACE(z[
4e20: 6e 2b 37 5d 29 29 0a 20 20 20 20 20 7c 7c 20 28  n+7])).     || (
4e30: 73 74 6f 70 41 74 45 6c 73 65 20 26 26 20 73 74  stopAtElse && st
4e40: 72 6e 63 6d 70 28 7a 2b 6e 2c 22 2d 2d 65 6c 73  rncmp(z+n,"--els
4e50: 65 22 2c 36 29 3d 3d 30 20 26 26 20 49 53 53 50  e",6)==0 && ISSP
4e60: 41 43 45 28 7a 5b 6e 2b 36 5d 29 29 0a 20 20 20  ACE(z[n+6])).   
4e70: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
4e80: 20 6e 2b 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20   n+len;.    }.  
4e90: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 2b    if( strncmp(z+
4ea0: 6e 2c 22 2d 2d 69 66 22 2c 34 29 3d 3d 30 20 26  n,"--if",4)==0 &
4eb0: 26 20 49 53 53 50 41 43 45 28 7a 5b 6e 2b 34 5d  & ISSPACE(z[n+4]
4ec0: 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73  ) ){.      int s
4ed0: 6b 69 70 20 3d 20 66 69 6e 64 45 6e 64 69 66 28  kip = findEndif(
4ee0: 7a 2b 6e 2b 6c 65 6e 2c 20 30 2c 20 70 6e 4c 69  z+n+len, 0, pnLi
4ef0: 6e 65 29 3b 0a 20 20 20 20 20 20 6e 20 2b 3d 20  ne);.      n += 
4f00: 73 6b 69 70 20 2b 20 6c 65 6e 3b 0a 20 20 20 20  skip + len;.    
4f10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 2b  }else{.      n +
4f20: 3d 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  = len;.    }.  }
4f30: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
4f40: 2f 2a 0a 2a 2a 20 57 61 69 74 20 66 6f 72 20 61  /*.** Wait for a
4f50: 20 63 6c 69 65 6e 74 20 70 72 6f 63 65 73 73 20   client process 
4f60: 74 6f 20 63 6f 6d 70 6c 65 74 65 20 61 6c 6c 20  to complete all 
4f70: 69 74 73 20 74 61 73 6b 73 0a 2a 2f 0a 73 74 61  its tasks.*/.sta
4f80: 74 69 63 20 76 6f 69 64 20 77 61 69 74 46 6f 72  tic void waitFor
4f90: 43 6c 69 65 6e 74 28 69 6e 74 20 69 43 6c 69 65  Client(int iClie
4fa0: 6e 74 2c 20 69 6e 74 20 69 54 69 6d 65 6f 75 74  nt, int iTimeout
4fb0: 2c 20 63 68 61 72 20 2a 7a 45 72 72 50 72 65 66  , char *zErrPref
4fc0: 69 78 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ix){.  sqlite3_s
4fd0: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
4fe0: 74 20 72 63 3b 0a 20 20 69 66 28 20 69 43 6c 69  t rc;.  if( iCli
4ff0: 65 6e 74 3e 30 20 29 7b 0a 20 20 20 20 70 53 74  ent>0 ){.    pSt
5000: 6d 74 20 3d 20 70 72 65 70 61 72 65 53 71 6c 28  mt = prepareSql(
5010: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5020: 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 74  "SELECT 1 FROM t
5030: 61 73 6b 22 0a 20 20 20 20 20 20 20 20 20 20 20  ask".           
5040: 20 20 20 20 22 20 57 48 45 52 45 20 63 6c 69 65      " WHERE clie
5050: 6e 74 3d 25 64 22 0a 20 20 20 20 20 20 20 20 20  nt=%d".         
5060: 20 20 20 20 20 20 22 20 20 20 41 4e 44 20 63 6c        "   AND cl
5070: 69 65 6e 74 20 49 4e 20 28 53 45 4c 45 43 54 20  ient IN (SELECT 
5080: 69 64 20 46 52 4f 4d 20 63 6c 69 65 6e 74 29 22  id FROM client)"
5090: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
50a0: 22 20 20 41 4e 44 20 65 6e 64 74 69 6d 65 20 49  "  AND endtime I
50b0: 53 20 4e 55 4c 4c 22 2c 0a 20 20 20 20 20 20 20  S NULL",.       
50c0: 20 20 20 20 20 20 20 20 69 43 6c 69 65 6e 74 29          iClient)
50d0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
50e0: 53 74 6d 74 20 3d 20 70 72 65 70 61 72 65 53 71  Stmt = prepareSq
50f0: 6c 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l(.             
5100: 20 20 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d    "SELECT 1 FROM
5110: 20 74 61 73 6b 22 0a 20 20 20 20 20 20 20 20 20   task".         
5120: 20 20 20 20 20 20 22 20 57 48 45 52 45 20 63 6c        " WHERE cl
5130: 69 65 6e 74 20 49 4e 20 28 53 45 4c 45 43 54 20  ient IN (SELECT 
5140: 69 64 20 46 52 4f 4d 20 63 6c 69 65 6e 74 29 22  id FROM client)"
5150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5160: 22 20 20 20 41 4e 44 20 65 6e 64 74 69 6d 65 20  "   AND endtime 
5170: 49 53 20 4e 55 4c 4c 22 29 3b 0a 20 20 7d 0a 20  IS NULL");.  }. 
5180: 20 67 2e 69 54 69 6d 65 6f 75 74 20 3d 20 30 3b   g.iTimeout = 0;
5190: 0a 20 20 77 68 69 6c 65 28 20 28 28 72 63 20 3d  .  while( ((rc =
51a0: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
51b0: 74 6d 74 29 29 3d 3d 53 51 4c 49 54 45 5f 42 55  tmt))==SQLITE_BU
51c0: 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  SY || rc==SQLITE
51d0: 5f 52 4f 57 29 0a 20 20 20 20 26 26 20 69 54 69  _ROW).    && iTi
51e0: 6d 65 6f 75 74 3e 30 0a 20 20 29 7b 0a 20 20 20  meout>0.  ){.   
51f0: 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
5200: 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Stmt);.    sqlit
5210: 65 33 5f 73 6c 65 65 70 28 35 30 29 3b 0a 20 20  e3_sleep(50);.  
5220: 20 20 69 54 69 6d 65 6f 75 74 20 2d 3d 20 35 30    iTimeout -= 50
5230: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
5240: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
5250: 0a 20 20 67 2e 69 54 69 6d 65 6f 75 74 20 3d 20  .  g.iTimeout = 
5260: 44 45 46 41 55 4c 54 5f 54 49 4d 45 4f 55 54 3b  DEFAULT_TIMEOUT;
5270: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
5280: 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 69 66  E_DONE ){.    if
5290: 28 20 7a 45 72 72 50 72 65 66 69 78 3d 3d 30 20  ( zErrPrefix==0 
52a0: 29 20 7a 45 72 72 50 72 65 66 69 78 20 3d 20 22  ) zErrPrefix = "
52b0: 22 3b 0a 20 20 20 20 69 66 28 20 69 43 6c 69 65  ";.    if( iClie
52c0: 6e 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 65 72  nt>0 ){.      er
52d0: 72 6f 72 4d 65 73 73 61 67 65 28 22 25 73 74 69  rorMessage("%sti
52e0: 6d 65 6f 75 74 20 77 61 69 74 69 6e 67 20 66 6f  meout waiting fo
52f0: 72 20 63 6c 69 65 6e 74 20 25 64 22 2c 20 7a 45  r client %d", zE
5300: 72 72 50 72 65 66 69 78 2c 20 69 43 6c 69 65 6e  rrPrefix, iClien
5310: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  t);.    }else{. 
5320: 20 20 20 20 20 65 72 72 6f 72 4d 65 73 73 61 67       errorMessag
5330: 65 28 22 25 73 74 69 6d 65 6f 75 74 20 77 61 69  e("%stimeout wai
5340: 74 69 6e 67 20 66 6f 72 20 61 6c 6c 20 63 6c 69  ting for all cli
5350: 65 6e 74 73 22 2c 20 7a 45 72 72 50 72 65 66 69  ents", zErrPrefi
5360: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  x);.    }.  }.}.
5370: 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  ./* Return a poi
5380: 6e 74 65 72 20 74 6f 20 74 68 65 20 74 61 69 6c  nter to the tail
5390: 20 6f 66 20 61 20 66 69 6c 65 6e 61 6d 65 0a 2a   of a filename.*
53a0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 66  /.static char *f
53b0: 69 6c 65 6e 61 6d 65 54 61 69 6c 28 63 68 61 72  ilenameTail(char
53c0: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a   *z){.  int i, j
53d0: 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a  ;.  for(i=j=0; z
53e0: 5b 69 5d 3b 20 69 2b 2b 29 20 69 66 28 20 69 73  [i]; i++) if( is
53f0: 44 69 72 53 65 70 28 7a 5b 69 5d 29 20 29 20 6a  DirSep(z[i]) ) j
5400: 20 3d 20 69 2b 31 3b 0a 20 20 72 65 74 75 72 6e   = i+1;.  return
5410: 20 7a 2b 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49   z+j;.}../*.** I
5420: 6e 74 65 72 70 72 65 74 20 7a 41 72 67 20 61 73  nterpret zArg as
5430: 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
5440: 2e 20 20 52 65 74 75 72 6e 20 65 69 74 68 65 72  .  Return either
5450: 20 30 20 6f 72 20 31 2e 0a 2a 2f 0a 73 74 61 74   0 or 1..*/.stat
5460: 69 63 20 69 6e 74 20 62 6f 6f 6c 65 61 6e 56 61  ic int booleanVa
5470: 6c 75 65 28 63 68 61 72 20 2a 7a 41 72 67 29 7b  lue(char *zArg){
5480: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
5490: 7a 41 72 67 3d 3d 30 20 29 20 72 65 74 75 72 6e  zArg==0 ) return
54a0: 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a   0;.  for(i=0; z
54b0: 41 72 67 5b 69 5d 3e 3d 27 30 27 20 26 26 20 7a  Arg[i]>='0' && z
54c0: 41 72 67 5b 69 5d 3c 3d 27 39 27 3b 20 69 2b 2b  Arg[i]<='9'; i++
54d0: 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20 26 26  ){}.  if( i>0 &&
54e0: 20 7a 41 72 67 5b 69 5d 3d 3d 30 20 29 20 72 65   zArg[i]==0 ) re
54f0: 74 75 72 6e 20 61 74 6f 69 28 7a 41 72 67 29 3b  turn atoi(zArg);
5500: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
5510: 74 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 6f 6e  tricmp(zArg, "on
5520: 22 29 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  ")==0 || sqlite3
5530: 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 22 79  _stricmp(zArg,"y
5540: 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  es")==0 ){.    r
5550: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
5560: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
5570: 6d 70 28 7a 41 72 67 2c 20 22 6f 66 66 22 29 3d  mp(zArg, "off")=
5580: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74  =0 || sqlite3_st
5590: 72 69 63 6d 70 28 7a 41 72 67 2c 22 6e 6f 22 29  ricmp(zArg,"no")
55a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
55b0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 65 72 72 6f 72  n 0;.  }.  error
55c0: 4d 65 73 73 61 67 65 28 22 75 6e 6b 6e 6f 77 6e  Message("unknown
55d0: 20 62 6f 6f 6c 65 61 6e 3a 20 5b 25 73 5d 22 2c   boolean: [%s]",
55e0: 20 7a 41 72 67 29 3b 0a 20 20 72 65 74 75 72 6e   zArg);.  return
55f0: 20 30 3b 0a 7d 0a 0a 0a 2f 2a 20 54 68 69 73 20   0;.}.../* This 
5600: 72 6f 75 74 69 6e 65 20 65 78 69 73 74 73 20 61  routine exists a
5610: 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70  s a convenient p
5620: 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 64 65  lace to set a de
5630: 62 75 67 67 65 72 0a 2a 2a 20 62 72 65 61 6b 70  bugger.** breakp
5640: 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oint..*/.static 
5650: 76 6f 69 64 20 74 65 73 74 5f 62 72 65 61 6b 70  void test_breakp
5660: 6f 69 6e 74 28 76 6f 69 64 29 7b 20 73 74 61 74  oint(void){ stat
5670: 69 63 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20  ic volatile int 
5680: 63 6e 74 20 3d 20 30 3b 20 63 6e 74 2b 2b 3b 20  cnt = 0; cnt++; 
5690: 7d 0a 0a 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75  }../* Maximum nu
56a0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
56b0: 73 20 74 6f 20 61 20 2d 2d 63 6f 6d 6d 61 6e 64  s to a --command
56c0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 41   */.#define MX_A
56d0: 52 47 20 32 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20  RG 2../*.** Run 
56e0: 61 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61  a script..*/.sta
56f0: 74 69 63 20 76 6f 69 64 20 72 75 6e 53 63 72 69  tic void runScri
5700: 70 74 28 0a 20 20 69 6e 74 20 69 43 6c 69 65 6e  pt(.  int iClien
5710: 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  t,       /* The 
5720: 63 6c 69 65 6e 74 20 6e 75 6d 62 65 72 2c 20 6f  client number, o
5730: 72 20 30 20 66 6f 72 20 74 68 65 20 6d 61 73 74  r 0 for the mast
5740: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 61 73 6b  er */.  int task
5750: 49 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  Id,        /* Th
5760: 65 20 74 61 73 6b 20 49 44 20 66 6f 72 20 63 6c  e task ID for cl
5770: 69 65 6e 74 73 2e 20 20 30 20 66 6f 72 20 6d 61  ients.  0 for ma
5780: 73 74 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ster */.  char *
5790: 7a 53 63 72 69 70 74 2c 20 20 20 20 20 2f 2a 20  zScript,     /* 
57a0: 54 65 78 74 20 6f 66 20 74 68 65 20 73 63 72 69  Text of the scri
57b0: 70 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46  pt */.  char *zF
57c0: 69 6c 65 6e 61 6d 65 20 20 20 20 2f 2a 20 46 69  ilename    /* Fi
57d0: 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 20 73 63  le from which sc
57e0: 72 69 70 74 20 77 61 73 20 72 65 61 64 2e 20 2a  ript was read. *
57f0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e  /.){.  int linen
5800: 6f 20 3d 20 31 3b 0a 20 20 69 6e 74 20 70 72 65  o = 1;.  int pre
5810: 76 4c 69 6e 65 20 3d 20 31 3b 0a 20 20 69 6e 74  vLine = 1;.  int
5820: 20 69 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69   ii = 0;.  int i
5830: 42 65 67 69 6e 20 3d 20 30 3b 0a 20 20 69 6e 74  Begin = 0;.  int
5840: 20 6e 2c 20 63 2c 20 6a 3b 0a 20 20 69 6e 74 20   n, c, j;.  int 
5850: 6c 65 6e 3b 0a 20 20 69 6e 74 20 6e 41 72 67 3b  len;.  int nArg;
5860: 0a 20 20 53 74 72 69 6e 67 20 73 52 65 73 75 6c  .  String sResul
5870: 74 3b 0a 20 20 63 68 61 72 20 7a 43 6d 64 5b 33  t;.  char zCmd[3
5880: 30 5d 3b 0a 20 20 63 68 61 72 20 7a 45 72 72 6f  0];.  char zErro
5890: 72 5b 31 30 30 30 5d 3b 0a 20 20 63 68 61 72 20  r[1000];.  char 
58a0: 61 7a 41 72 67 5b 4d 58 5f 41 52 47 5d 5b 31 30  azArg[MX_ARG][10
58b0: 30 5d 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 73  0];..  memset(&s
58c0: 52 65 73 75 6c 74 2c 20 30 2c 20 73 69 7a 65 6f  Result, 0, sizeo
58d0: 66 28 73 52 65 73 75 6c 74 29 29 3b 0a 20 20 73  f(sResult));.  s
58e0: 74 72 69 6e 67 52 65 73 65 74 28 26 73 52 65 73  tringReset(&sRes
58f0: 75 6c 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 28  ult);.  while( (
5900: 63 20 3d 20 7a 53 63 72 69 70 74 5b 69 69 5d 29  c = zScript[ii])
5910: 21 3d 30 20 29 7b 0a 20 20 20 20 70 72 65 76 4c  !=0 ){.    prevL
5920: 69 6e 65 20 3d 20 6c 69 6e 65 6e 6f 3b 0a 20 20  ine = lineno;.  
5930: 20 20 6c 65 6e 20 3d 20 74 6f 6b 65 6e 4c 65 6e    len = tokenLen
5940: 67 74 68 28 7a 53 63 72 69 70 74 2b 69 69 2c 20  gth(zScript+ii, 
5950: 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 69 66  &lineno);.    if
5960: 28 20 49 53 53 50 41 43 45 28 63 29 20 7c 7c 20  ( ISSPACE(c) || 
5970: 28 63 3d 3d 27 2f 27 20 26 26 20 7a 53 63 72 69  (c=='/' && zScri
5980: 70 74 5b 69 69 2b 31 5d 3d 3d 27 2a 27 29 20 29  pt[ii+1]=='*') )
5990: 7b 0a 20 20 20 20 20 20 69 69 20 2b 3d 20 6c 65  {.      ii += le
59a0: 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  n;.      continu
59b0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
59c0: 20 63 21 3d 27 2d 27 20 7c 7c 20 7a 53 63 72 69   c!='-' || zScri
59d0: 70 74 5b 69 69 2b 31 5d 21 3d 27 2d 27 20 7c 7c  pt[ii+1]!='-' ||
59e0: 20 21 69 73 61 6c 70 68 61 28 7a 53 63 72 69 70   !isalpha(zScrip
59f0: 74 5b 69 69 2b 32 5d 29 20 29 7b 0a 20 20 20 20  t[ii+2]) ){.    
5a00: 20 20 69 69 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20    ii += len;.   
5a10: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
5a20: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 75 6e 20 61   }..    /* Run a
5a30: 6e 79 20 70 72 69 6f 72 20 53 51 4c 20 62 65 66  ny prior SQL bef
5a40: 6f 72 65 20 70 72 6f 63 65 73 73 69 6e 67 20 74  ore processing t
5a50: 68 65 20 6e 65 77 20 2d 2d 63 6f 6d 6d 61 6e 64  he new --command
5a60: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 69 3e 69   */.    if( ii>i
5a70: 42 65 67 69 6e 20 29 7b 0a 20 20 20 20 20 20 63  Begin ){.      c
5a80: 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69  har *zSql = sqli
5a90: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 2e 2a  te3_mprintf("%.*
5aa0: 73 22 2c 20 69 69 2d 69 42 65 67 69 6e 2c 20 7a  s", ii-iBegin, z
5ab0: 53 63 72 69 70 74 2b 69 42 65 67 69 6e 29 3b 0a  Script+iBegin);.
5ac0: 20 20 20 20 20 20 65 76 61 6c 53 71 6c 28 26 73        evalSql(&s
5ad0: 52 65 73 75 6c 74 2c 20 7a 53 71 6c 29 3b 0a 20  Result, zSql);. 
5ae0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
5af0: 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 69  e(zSql);.      i
5b00: 42 65 67 69 6e 20 3d 20 69 69 20 2b 20 6c 65 6e  Begin = ii + len
5b10: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
5b20: 50 61 72 73 65 20 74 68 65 20 2d 2d 63 6f 6d 6d  Parse the --comm
5b30: 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 67  and */.    if( g
5b40: 2e 69 54 72 61 63 65 3e 3d 32 20 29 20 6c 6f 67  .iTrace>=2 ) log
5b50: 4d 65 73 73 61 67 65 28 22 25 2e 2a 73 22 2c 20  Message("%.*s", 
5b60: 6c 65 6e 2c 20 7a 53 63 72 69 70 74 2b 69 69 29  len, zScript+ii)
5b70: 3b 0a 20 20 20 20 6e 20 3d 20 65 78 74 72 61 63  ;.    n = extrac
5b80: 74 54 6f 6b 65 6e 28 7a 53 63 72 69 70 74 2b 69  tToken(zScript+i
5b90: 69 2b 32 2c 20 6c 65 6e 2d 32 2c 20 7a 43 6d 64  i+2, len-2, zCmd
5ba0: 2c 20 73 69 7a 65 6f 66 28 7a 43 6d 64 29 29 3b  , sizeof(zCmd));
5bb0: 0a 20 20 20 20 66 6f 72 28 6e 41 72 67 3d 30 3b  .    for(nArg=0;
5bc0: 20 6e 3c 6c 65 6e 2d 32 20 26 26 20 6e 41 72 67   n<len-2 && nArg
5bd0: 3c 4d 58 5f 41 52 47 3b 20 6e 41 72 67 2b 2b 29  <MX_ARG; nArg++)
5be0: 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 6e  {.      while( n
5bf0: 3c 6c 65 6e 2d 32 20 26 26 20 49 53 53 50 41 43  <len-2 && ISSPAC
5c00: 45 28 7a 53 63 72 69 70 74 5b 69 69 2b 32 2b 6e  E(zScript[ii+2+n
5c10: 5d 29 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 20  ]) ){ n++; }.   
5c20: 20 20 20 69 66 28 20 6e 3e 3d 6c 65 6e 2d 32 20     if( n>=len-2 
5c30: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 6e  ) break;.      n
5c40: 20 2b 3d 20 65 78 74 72 61 63 74 54 6f 6b 65 6e   += extractToken
5c50: 28 7a 53 63 72 69 70 74 2b 69 69 2b 32 2b 6e 2c  (zScript+ii+2+n,
5c60: 20 6c 65 6e 2d 32 2d 6e 2c 0a 20 20 20 20 20 20   len-2-n,.      
5c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5c80: 20 20 61 7a 41 72 67 5b 6e 41 72 67 5d 2c 20 73    azArg[nArg], s
5c90: 69 7a 65 6f 66 28 61 7a 41 72 67 5b 6e 41 72 67  izeof(azArg[nArg
5ca0: 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ]));.    }.    f
5cb0: 6f 72 28 6a 3d 6e 41 72 67 3b 20 6a 3c 4d 58 5f  or(j=nArg; j<MX_
5cc0: 41 52 47 3b 20 6a 2b 2b 29 20 61 7a 41 72 67 5b  ARG; j++) azArg[
5cd0: 6a 2b 2b 5d 5b 30 5d 20 3d 20 30 3b 0a 0a 20 20  j++][0] = 0;..  
5ce0: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 2d 2d 73    /*.    **  --s
5cf0: 6c 65 65 70 20 4e 0a 20 20 20 20 2a 2a 0a 20 20  leep N.    **.  
5d00: 20 20 2a 2a 20 50 61 75 73 65 20 66 6f 72 20 4e    ** Pause for N
5d10: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 0a 20 20   milliseconds.  
5d20: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72    */.    if( str
5d30: 63 6d 70 28 7a 43 6d 64 2c 20 22 73 6c 65 65 70  cmp(zCmd, "sleep
5d40: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ")==0 ){.      s
5d50: 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 61 74 6f  qlite3_sleep(ato
5d60: 69 28 61 7a 41 72 67 5b 30 5d 29 29 3b 0a 20 20  i(azArg[0]));.  
5d70: 20 20 7d 65 6c 73 65 20 0a 0a 20 20 20 20 2f 2a    }else ..    /*
5d80: 0a 20 20 20 20 2a 2a 20 20 20 2d 2d 65 78 69 74  .    **   --exit
5d90: 20 4e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a   N.    **.    **
5da0: 20 45 78 69 74 20 74 68 69 73 20 70 72 6f 63 65   Exit this proce
5db0: 73 73 2e 20 20 49 66 20 4e 3e 30 20 74 68 65 6e  ss.  If N>0 then
5dc0: 20 65 78 69 74 20 77 69 74 68 6f 75 74 20 73 68   exit without sh
5dd0: 75 74 74 69 6e 67 20 64 6f 77 6e 0a 20 20 20 20  utting down.    
5de0: 2a 2a 20 53 51 4c 69 74 65 2e 20 20 28 49 6e 20  ** SQLite.  (In 
5df0: 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 69 6d  other words, sim
5e00: 75 6c 61 74 65 20 61 20 63 72 61 73 68 2e 29 0a  ulate a crash.).
5e10: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
5e20: 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 65 78 69  trcmp(zCmd, "exi
5e30: 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
5e40: 69 6e 74 20 72 63 20 3d 20 61 74 6f 69 28 61 7a  int rc = atoi(az
5e50: 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 66  Arg[0]);.      f
5e60: 69 6e 69 73 68 53 63 72 69 70 74 28 69 43 6c 69  inishScript(iCli
5e70: 65 6e 74 2c 20 74 61 73 6b 49 64 2c 20 31 29 3b  ent, taskId, 1);
5e80: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30  .      if( rc==0
5e90: 20 29 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65   ) sqlite3_close
5ea0: 28 67 2e 64 62 29 3b 0a 20 20 20 20 20 20 65 78  (g.db);.      ex
5eb0: 69 74 28 72 63 29 3b 0a 20 20 20 20 7d 65 6c 73  it(rc);.    }els
5ec0: 65 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  e..    /*.    **
5ed0: 20 20 20 2d 2d 74 65 73 74 63 61 73 65 20 4e 41     --testcase NA
5ee0: 4d 45 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ME.    **.    **
5ef0: 20 42 65 67 69 6e 20 61 20 6e 65 77 20 74 65 73   Begin a new tes
5f00: 74 20 63 61 73 65 2e 20 20 41 6e 6e 6f 75 6e 63  t case.  Announc
5f10: 65 20 69 6e 20 74 68 65 20 6c 6f 67 20 74 68 61  e in the log tha
5f20: 74 20 74 68 65 20 74 65 73 74 20 63 61 73 65 0a  t the test case.
5f30: 20 20 20 20 2a 2a 20 68 61 73 20 62 65 67 75 6e      ** has begun
5f40: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
5f50: 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 74   strcmp(zCmd, "t
5f60: 65 73 74 63 61 73 65 22 29 3d 3d 30 20 29 7b 0a  estcase")==0 ){.
5f70: 20 20 20 20 20 20 69 66 28 20 67 2e 69 54 72 61        if( g.iTra
5f80: 63 65 3d 3d 31 20 29 20 6c 6f 67 4d 65 73 73 61  ce==1 ) logMessa
5f90: 67 65 28 22 25 2e 2a 73 22 2c 20 6c 65 6e 20 2d  ge("%.*s", len -
5fa0: 20 31 2c 20 7a 53 63 72 69 70 74 2b 69 69 29 3b   1, zScript+ii);
5fb0: 0a 20 20 20 20 20 20 73 74 72 69 6e 67 52 65 73  .      stringRes
5fc0: 65 74 28 26 73 52 65 73 75 6c 74 29 3b 0a 20 20  et(&sResult);.  
5fd0: 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a    }else..    /*.
5fe0: 20 20 20 20 2a 2a 20 20 20 2d 2d 66 69 6e 69 73      **   --finis
5ff0: 68 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  h.    **.    ** 
6000: 4d 61 72 6b 20 74 68 65 20 63 75 72 72 65 6e 74  Mark the current
6010: 20 74 61 73 6b 20 61 73 20 68 61 76 69 6e 67 20   task as having 
6020: 66 69 6e 69 73 68 65 64 2c 20 65 76 65 6e 20 69  finished, even i
6030: 66 20 69 74 20 69 73 20 6e 6f 74 2e 0a 20 20 20  f it is not..   
6040: 20 2a 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20   ** This can be 
6050: 75 73 65 64 20 69 6e 20 63 6f 6e 6a 75 6e 63 74  used in conjunct
6060: 69 6f 6e 20 77 69 74 68 20 2d 2d 65 78 69 74 20  ion with --exit 
6070: 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 20 63 72  to simulate a cr
6080: 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ash..    */.    
6090: 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c  if( strcmp(zCmd,
60a0: 20 22 66 69 6e 69 73 68 22 29 3d 3d 30 20 26 26   "finish")==0 &&
60b0: 20 69 43 6c 69 65 6e 74 3e 30 20 29 7b 0a 20 20   iClient>0 ){.  
60c0: 20 20 20 20 66 69 6e 69 73 68 53 63 72 69 70 74      finishScript
60d0: 28 69 43 6c 69 65 6e 74 2c 20 74 61 73 6b 49 64  (iClient, taskId
60e0: 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  , 1);.    }else.
60f0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
6100: 2d 2d 72 65 73 65 74 0a 20 20 20 20 2a 2a 0a 20  --reset.    **. 
6110: 20 20 20 2a 2a 20 52 65 73 65 74 20 61 63 63 75     ** Reset accu
6120: 6d 75 6c 61 74 65 64 20 72 65 73 75 6c 74 73 20  mulated results 
6130: 62 61 63 6b 20 74 6f 20 61 6e 20 65 6d 70 74 79  back to an empty
6140: 20 73 74 72 69 6e 67 0a 20 20 20 20 2a 2f 0a 20   string.    */. 
6150: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43     if( strcmp(zC
6160: 6d 64 2c 20 22 72 65 73 65 74 22 29 3d 3d 30 20  md, "reset")==0 
6170: 29 7b 0a 20 20 20 20 20 20 73 74 72 69 6e 67 52  ){.      stringR
6180: 65 73 65 74 28 26 73 52 65 73 75 6c 74 29 3b 0a  eset(&sResult);.
6190: 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f      }else..    /
61a0: 2a 0a 20 20 20 20 2a 2a 20 20 2d 2d 6d 61 74 63  *.    **  --matc
61b0: 68 20 41 4e 53 57 45 52 2e 2e 2e 0a 20 20 20 20  h ANSWER....    
61c0: 2a 2a 0a 20 20 20 20 2a 2a 20 43 68 65 63 6b 20  **.    ** Check 
61d0: 74 6f 20 73 65 65 20 69 66 20 6f 75 74 70 75 74  to see if output
61e0: 20 6d 61 74 63 68 65 73 20 41 4e 53 57 45 52 2e   matches ANSWER.
61f0: 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f    Report an erro
6200: 72 20 69 66 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f  r if not..    */
6210: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
6220: 7a 43 6d 64 2c 20 22 6d 61 74 63 68 22 29 3d 3d  zCmd, "match")==
6230: 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a  0 ){.      int j
6240: 6a 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  j;.      char *z
6250: 41 6e 73 20 3d 20 7a 53 63 72 69 70 74 2b 69 69  Ans = zScript+ii
6260: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 37  ;.      for(jj=7
6270: 3b 20 6a 6a 3c 6c 65 6e 2d 31 20 26 26 20 49 53  ; jj<len-1 && IS
6280: 53 50 41 43 45 28 7a 41 6e 73 5b 6a 6a 5d 29 3b  SPACE(zAns[jj]);
6290: 20 6a 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 7a   jj++){}.      z
62a0: 41 6e 73 20 2b 3d 20 6a 6a 3b 0a 20 20 20 20 20  Ans += jj;.     
62b0: 20 69 66 28 20 6c 65 6e 2d 6a 6a 2d 31 21 3d 73   if( len-jj-1!=s
62c0: 52 65 73 75 6c 74 2e 6e 20 7c 7c 20 73 74 72 6e  Result.n || strn
62d0: 63 6d 70 28 73 52 65 73 75 6c 74 2e 7a 2c 20 7a  cmp(sResult.z, z
62e0: 41 6e 73 2c 20 6c 65 6e 2d 6a 6a 2d 31 29 20 29  Ans, len-jj-1) )
62f0: 7b 0a 20 20 20 20 20 20 20 20 65 72 72 6f 72 4d  {.        errorM
6300: 65 73 73 61 67 65 28 22 6c 69 6e 65 20 25 64 20  essage("line %d 
6310: 6f 66 20 25 73 3a 5c 6e 45 78 70 65 63 74 65 64  of %s:\nExpected
6320: 20 5b 25 2e 2a 73 5d 5c 6e 20 20 20 20 20 47 6f   [%.*s]\n     Go
6330: 74 20 5b 25 73 5d 22 2c 0a 20 20 20 20 20 20 20  t [%s]",.       
6340: 20 20 20 70 72 65 76 4c 69 6e 65 2c 20 7a 46 69     prevLine, zFi
6350: 6c 65 6e 61 6d 65 2c 20 6c 65 6e 2d 6a 6a 2d 31  lename, len-jj-1
6360: 2c 20 7a 41 6e 73 2c 20 73 52 65 73 75 6c 74 2e  , zAns, sResult.
6370: 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  z);.      }.    
6380: 20 20 67 2e 6e 54 65 73 74 2b 2b 3b 0a 20 20 20    g.nTest++;.   
6390: 20 20 20 73 74 72 69 6e 67 52 65 73 65 74 28 26     stringReset(&
63a0: 73 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 7d 65  sResult);.    }e
63b0: 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  lse..    /*.    
63c0: 2a 2a 20 20 2d 2d 67 6c 6f 62 20 41 4e 53 57 45  **  --glob ANSWE
63d0: 52 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 2d 2d 6e  R....    **  --n
63e0: 6f 74 67 6c 6f 62 20 41 4e 53 57 45 52 2e 2e 2e  otglob ANSWER...
63f0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
6400: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
6410: 6f 75 74 70 75 74 20 64 6f 65 73 20 6f 72 20 64  output does or d
6420: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
6430: 65 20 67 6c 6f 62 20 70 61 74 74 65 72 6e 0a 20  e glob pattern. 
6440: 20 20 20 2a 2a 20 41 4e 53 57 45 52 2e 0a 20 20     ** ANSWER..  
6450: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72    */.    if( str
6460: 63 6d 70 28 7a 43 6d 64 2c 20 22 67 6c 6f 62 22  cmp(zCmd, "glob"
6470: 29 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28 7a  )==0 || strcmp(z
6480: 43 6d 64 2c 20 22 6e 6f 74 67 6c 6f 62 22 29 3d  Cmd, "notglob")=
6490: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
64a0: 6a 6a 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  jj;.      char *
64b0: 7a 41 6e 73 20 3d 20 7a 53 63 72 69 70 74 2b 69  zAns = zScript+i
64c0: 69 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  i;.      char *z
64d0: 43 6f 70 79 3b 0a 20 20 20 20 20 20 69 6e 74 20  Copy;.      int 
64e0: 69 73 47 6c 6f 62 20 3d 20 28 7a 43 6d 64 5b 30  isGlob = (zCmd[0
64f0: 5d 3d 3d 27 67 27 29 3b 0a 20 20 20 20 20 20 66  ]=='g');.      f
6500: 6f 72 28 6a 6a 3d 39 2d 33 2a 69 73 47 6c 6f 62  or(jj=9-3*isGlob
6510: 3b 20 6a 6a 3c 6c 65 6e 2d 31 20 26 26 20 49 53  ; jj<len-1 && IS
6520: 53 50 41 43 45 28 7a 41 6e 73 5b 6a 6a 5d 29 3b  SPACE(zAns[jj]);
6530: 20 6a 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 7a   jj++){}.      z
6540: 41 6e 73 20 2b 3d 20 6a 6a 3b 0a 20 20 20 20 20  Ans += jj;.     
6550: 20 7a 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33   zCopy = sqlite3
6560: 5f 6d 70 72 69 6e 74 66 28 22 25 2e 2a 73 22 2c  _mprintf("%.*s",
6570: 20 6c 65 6e 2d 6a 6a 2d 31 2c 20 7a 41 6e 73 29   len-jj-1, zAns)
6580: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 73 71 6c  ;.      if( (sql
6590: 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 7a 43 6f  ite3_strglob(zCo
65a0: 70 79 2c 20 73 52 65 73 75 6c 74 2e 7a 29 3d 3d  py, sResult.z)==
65b0: 30 29 5e 69 73 47 6c 6f 62 20 29 7b 0a 20 20 20  0)^isGlob ){.   
65c0: 20 20 20 20 20 65 72 72 6f 72 4d 65 73 73 61 67       errorMessag
65d0: 65 28 22 6c 69 6e 65 20 25 64 20 6f 66 20 25 73  e("line %d of %s
65e0: 3a 5c 6e 45 78 70 65 63 74 65 64 20 5b 25 73 5d  :\nExpected [%s]
65f0: 5c 6e 20 20 20 20 20 47 6f 74 20 5b 25 73 5d 22  \n     Got [%s]"
6600: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 72 65 76  ,.          prev
6610: 4c 69 6e 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  Line, zFilename,
6620: 20 7a 43 6f 70 79 2c 20 73 52 65 73 75 6c 74 2e   zCopy, sResult.
6630: 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  z);.      }.    
6640: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
6650: 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 67 2e 6e  Copy);.      g.n
6660: 54 65 73 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74  Test++;.      st
6670: 72 69 6e 67 52 65 73 65 74 28 26 73 52 65 73 75  ringReset(&sResu
6680: 6c 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 0a  lt);.    }else..
6690: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 2d      /*.    **  -
66a0: 2d 6f 75 74 70 75 74 0a 20 20 20 20 2a 2a 0a 20  -output.    **. 
66b0: 20 20 20 2a 2a 20 4f 75 74 70 75 74 20 74 68 65     ** Output the
66c0: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 70   result of the p
66d0: 72 65 76 69 6f 75 73 20 53 51 4c 2e 0a 20 20 20  revious SQL..   
66e0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63   */.    if( strc
66f0: 6d 70 28 7a 43 6d 64 2c 20 22 6f 75 74 70 75 74  mp(zCmd, "output
6700: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c  ")==0 ){.      l
6710: 6f 67 4d 65 73 73 61 67 65 28 22 25 73 22 2c 20  ogMessage("%s", 
6720: 73 52 65 73 75 6c 74 2e 7a 29 3b 0a 20 20 20 20  sResult.z);.    
6730: 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a 20 20  }else..    /*.  
6740: 20 20 2a 2a 20 20 2d 2d 73 6f 75 72 63 65 20 46    **  --source F
6750: 49 4c 45 4e 41 4d 45 0a 20 20 20 20 2a 2a 0a 20  ILENAME.    **. 
6760: 20 20 20 2a 2a 20 52 75 6e 20 61 20 73 75 62 73     ** Run a subs
6770: 63 72 69 70 74 20 66 72 6f 6d 20 61 20 73 65 70  cript from a sep
6780: 61 72 61 74 65 20 66 69 6c 65 2e 0a 20 20 20 20  arate file..    
6790: 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  */.    if( strcm
67a0: 70 28 7a 43 6d 64 2c 20 22 73 6f 75 72 63 65 22  p(zCmd, "source"
67b0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68  )==0 ){.      ch
67c0: 61 72 20 2a 7a 4e 65 77 46 69 6c 65 2c 20 2a 7a  ar *zNewFile, *z
67d0: 4e 65 77 53 63 72 69 70 74 3b 0a 20 20 20 20 20  NewScript;.     
67e0: 20 63 68 61 72 20 2a 7a 54 6f 44 65 6c 20 3d 20   char *zToDel = 
67f0: 30 3b 0a 20 20 20 20 20 20 7a 4e 65 77 46 69 6c  0;.      zNewFil
6800: 65 20 3d 20 61 7a 41 72 67 5b 30 5d 3b 0a 20 20  e = azArg[0];.  
6810: 20 20 20 20 69 66 28 20 21 69 73 44 69 72 53 65      if( !isDirSe
6820: 70 28 7a 4e 65 77 46 69 6c 65 5b 30 5d 29 20 29  p(zNewFile[0]) )
6830: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6b 3b  {.        int k;
6840: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 28  .        for(k=(
6850: 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65  int)strlen(zFile
6860: 6e 61 6d 65 29 2d 31 3b 20 6b 3e 3d 30 20 26 26  name)-1; k>=0 &&
6870: 20 21 69 73 44 69 72 53 65 70 28 7a 46 69 6c 65   !isDirSep(zFile
6880: 6e 61 6d 65 5b 6b 5d 29 3b 20 6b 2d 2d 29 7b 7d  name[k]); k--){}
6890: 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3e 30  .        if( k>0
68a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4e   ){.          zN
68b0: 65 77 46 69 6c 65 20 3d 20 7a 54 6f 44 65 6c 20  ewFile = zToDel 
68c0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
68d0: 66 28 22 25 2e 2a 73 2f 25 73 22 2c 20 6b 2c 7a  f("%.*s/%s", k,z
68e0: 46 69 6c 65 6e 61 6d 65 2c 7a 4e 65 77 46 69 6c  Filename,zNewFil
68f0: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
6900: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4e 65 77      }.      zNew
6910: 53 63 72 69 70 74 20 3d 20 72 65 61 64 46 69 6c  Script = readFil
6920: 65 28 7a 4e 65 77 46 69 6c 65 29 3b 0a 20 20 20  e(zNewFile);.   
6930: 20 20 20 69 66 28 20 67 2e 69 54 72 61 63 65 20     if( g.iTrace 
6940: 29 20 6c 6f 67 4d 65 73 73 61 67 65 28 22 62 65  ) logMessage("be
6950: 67 69 6e 20 73 63 72 69 70 74 20 5b 25 73 5d 5c  gin script [%s]\
6960: 6e 22 2c 20 7a 4e 65 77 46 69 6c 65 29 3b 0a 20  n", zNewFile);. 
6970: 20 20 20 20 20 72 75 6e 53 63 72 69 70 74 28 30       runScript(0
6980: 2c 20 30 2c 20 7a 4e 65 77 53 63 72 69 70 74 2c  , 0, zNewScript,
6990: 20 7a 4e 65 77 46 69 6c 65 29 3b 0a 20 20 20 20   zNewFile);.    
69a0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
69b0: 4e 65 77 53 63 72 69 70 74 29 3b 0a 20 20 20 20  NewScript);.    
69c0: 20 20 69 66 28 20 67 2e 69 54 72 61 63 65 20 29    if( g.iTrace )
69d0: 20 6c 6f 67 4d 65 73 73 61 67 65 28 22 65 6e 64   logMessage("end
69e0: 20 73 63 72 69 70 74 20 5b 25 73 5d 5c 6e 22 2c   script [%s]\n",
69f0: 20 7a 4e 65 77 46 69 6c 65 29 3b 0a 20 20 20 20   zNewFile);.    
6a00: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
6a10: 54 6f 44 65 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  ToDel);.    }els
6a20: 65 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  e..    /*.    **
6a30: 20 20 2d 2d 70 72 69 6e 74 20 4d 45 53 53 41 47    --print MESSAG
6a40: 45 2e 2e 2e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  E.....    **.   
6a50: 20 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20 72   ** Output the r
6a60: 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20  emainder of the 
6a70: 6c 69 6e 65 20 74 6f 20 74 68 65 20 6c 6f 67 20  line to the log 
6a80: 66 69 6c 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20  file.    */.    
6a90: 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c  if( strcmp(zCmd,
6aa0: 20 22 70 72 69 6e 74 22 29 3d 3d 30 20 29 7b 0a   "print")==0 ){.
6ab0: 20 20 20 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20        int jj;.  
6ac0: 20 20 20 20 66 6f 72 28 6a 6a 3d 37 3b 20 6a 6a      for(jj=7; jj
6ad0: 3c 6c 65 6e 20 26 26 20 49 53 53 50 41 43 45 28  <len && ISSPACE(
6ae0: 7a 53 63 72 69 70 74 5b 69 69 2b 6a 6a 5d 29 3b  zScript[ii+jj]);
6af0: 20 6a 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 6c   jj++){}.      l
6b00: 6f 67 4d 65 73 73 61 67 65 28 22 25 2e 2a 73 22  ogMessage("%.*s"
6b10: 2c 20 6c 65 6e 2d 6a 6a 2c 20 7a 53 63 72 69 70  , len-jj, zScrip
6b20: 74 2b 69 69 2b 6a 6a 29 3b 0a 20 20 20 20 7d 65  t+ii+jj);.    }e
6b30: 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  lse..    /*.    
6b40: 2a 2a 20 20 2d 2d 69 66 20 45 58 50 52 0a 20 20  **  --if EXPR.  
6b50: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 6b 69 70    **.    ** Skip
6b60: 20 66 6f 72 77 61 72 64 20 74 6f 20 74 68 65 20   forward to the 
6b70: 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 20 2d 2d  next matching --
6b80: 65 6e 64 69 66 20 6f 72 20 2d 2d 65 6c 73 65 20  endif or --else 
6b90: 69 66 20 45 58 50 52 20 69 73 20 66 61 6c 73 65  if EXPR is false
6ba0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
6bb0: 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 69   strcmp(zCmd, "i
6bc0: 66 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  f")==0 ){.      
6bd0: 69 6e 74 20 6a 6a 2c 20 72 63 3b 0a 20 20 20 20  int jj, rc;.    
6be0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
6bf0: 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 66 6f 72  pStmt;.      for
6c00: 28 6a 6a 3d 34 3b 20 6a 6a 3c 6c 65 6e 20 26 26  (jj=4; jj<len &&
6c10: 20 49 53 53 50 41 43 45 28 7a 53 63 72 69 70 74   ISSPACE(zScript
6c20: 5b 69 69 2b 6a 6a 5d 29 3b 20 6a 6a 2b 2b 29 7b  [ii+jj]); jj++){
6c30: 7d 0a 20 20 20 20 20 20 70 53 74 6d 74 20 3d 20  }.      pStmt = 
6c40: 70 72 65 70 61 72 65 53 71 6c 28 22 53 45 4c 45  prepareSql("SELE
6c50: 43 54 20 25 2e 2a 73 22 2c 20 6c 65 6e 2d 6a 6a  CT %.*s", len-jj
6c60: 2c 20 7a 53 63 72 69 70 74 2b 69 69 2b 6a 6a 29  , zScript+ii+jj)
6c70: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
6c80: 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
6c90: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
6ca0: 53 51 4c 49 54 45 5f 52 4f 57 20 7c 7c 20 73 71  SQLITE_ROW || sq
6cb0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
6cc0: 28 70 53 74 6d 74 2c 20 30 29 3d 3d 30 20 29 7b  (pStmt, 0)==0 ){
6cd0: 0a 20 20 20 20 20 20 20 20 69 69 20 2b 3d 20 66  .        ii += f
6ce0: 69 6e 64 45 6e 64 69 66 28 7a 53 63 72 69 70 74  indEndif(zScript
6cf0: 2b 69 69 2b 6c 65 6e 2c 20 31 2c 20 26 6c 69 6e  +ii+len, 1, &lin
6d00: 65 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  eno);.      }.  
6d10: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
6d20: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
6d30: 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a 20   }else..    /*. 
6d40: 20 20 20 2a 2a 20 20 2d 2d 65 6c 73 65 0a 20 20     **  --else.  
6d50: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
6d60: 20 63 6f 6d 6d 61 6e 64 20 63 61 6e 20 6f 6e 6c   command can onl
6d70: 79 20 62 65 20 65 6e 63 6f 75 6e 74 65 72 65 64  y be encountered
6d80: 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20 69 6e   if currently in
6d90: 73 69 64 65 20 61 6e 20 2d 2d 69 66 20 74 68 61  side an --if tha
6da0: 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65  t.    ** is true
6db0: 2e 20 20 53 6b 69 70 20 66 6f 72 77 61 72 64 20  .  Skip forward 
6dc0: 74 6f 20 74 68 65 20 6e 65 78 74 20 6d 61 74 63  to the next matc
6dd0: 68 69 6e 67 20 2d 2d 65 6e 64 69 66 2e 0a 20 20  hing --endif..  
6de0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72    */.    if( str
6df0: 63 6d 70 28 7a 43 6d 64 2c 20 22 65 6c 73 65 22  cmp(zCmd, "else"
6e00: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 69  )==0 ){.      ii
6e10: 20 2b 3d 20 66 69 6e 64 45 6e 64 69 66 28 7a 53   += findEndif(zS
6e20: 63 72 69 70 74 2b 69 69 2b 6c 65 6e 2c 20 30 2c  cript+ii+len, 0,
6e30: 20 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 7d   &lineno);.    }
6e40: 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  else..    /*.   
6e50: 20 2a 2a 20 20 2d 2d 65 6e 64 69 66 0a 20 20 20   **  --endif.   
6e60: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
6e70: 63 6f 6d 6d 61 6e 64 20 63 61 6e 20 6f 6e 6c 79  command can only
6e80: 20 62 65 20 65 6e 63 6f 75 6e 74 65 72 65 64 20   be encountered 
6e90: 69 66 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 73  if currently ins
6ea0: 69 64 65 20 61 6e 20 2d 2d 69 66 20 74 68 61 74  ide an --if that
6eb0: 0a 20 20 20 20 2a 2a 20 69 73 20 74 72 75 65 20  .    ** is true 
6ec0: 6f 72 20 61 6e 20 2d 2d 65 6c 73 65 20 6f 66 20  or an --else of 
6ed0: 61 20 66 61 6c 73 65 20 69 66 2e 20 20 54 68 69  a false if.  Thi
6ee0: 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  s is a no-op..  
6ef0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72    */.    if( str
6f00: 63 6d 70 28 7a 43 6d 64 2c 20 22 65 6e 64 69 66  cmp(zCmd, "endif
6f10: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  ")==0 ){.      /
6f20: 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20 7d  * no-op */.    }
6f30: 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  else..    /*.   
6f40: 20 2a 2a 20 20 2d 2d 73 74 61 72 74 20 43 4c 49   **  --start CLI
6f50: 45 4e 54 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ENT.    **.    *
6f60: 2a 20 53 74 61 72 74 20 75 70 20 74 68 65 20 67  * Start up the g
6f70: 69 76 65 6e 20 63 6c 69 65 6e 74 2e 0a 20 20 20  iven client..   
6f80: 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63   */.    if( strc
6f90: 6d 70 28 7a 43 6d 64 2c 20 22 73 74 61 72 74 22  mp(zCmd, "start"
6fa0: 29 3d 3d 30 20 26 26 20 69 43 6c 69 65 6e 74 3d  )==0 && iClient=
6fb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
6fc0: 69 4e 65 77 43 6c 69 65 6e 74 20 3d 20 61 74 6f  iNewClient = ato
6fd0: 69 28 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20  i(azArg[0]);.   
6fe0: 20 20 20 69 66 28 20 69 4e 65 77 43 6c 69 65 6e     if( iNewClien
6ff0: 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  t>0 ){.        s
7000: 74 61 72 74 43 6c 69 65 6e 74 28 69 4e 65 77 43  tartClient(iNewC
7010: 6c 69 65 6e 74 29 3b 0a 20 20 20 20 20 20 7d 0a  lient);.      }.
7020: 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f      }else..    /
7030: 2a 0a 20 20 20 20 2a 2a 20 20 2d 2d 77 61 69 74  *.    **  --wait
7040: 20 43 4c 49 45 4e 54 20 54 49 4d 45 4f 55 54 0a   CLIENT TIMEOUT.
7050: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 61      **.    ** Wa
7060: 69 74 20 75 6e 74 69 6c 20 61 6c 6c 20 74 61 73  it until all tas
7070: 6b 73 20 63 6f 6d 70 6c 65 74 65 20 66 6f 72 20  ks complete for 
7080: 74 68 65 20 67 69 76 65 6e 20 63 6c 69 65 6e 74  the given client
7090: 2e 20 20 49 66 20 43 4c 49 45 4e 54 20 69 73 0a  .  If CLIENT is.
70a0: 20 20 20 20 2a 2a 20 22 61 6c 6c 22 20 74 68 65      ** "all" the
70b0: 6e 20 77 61 69 74 20 66 6f 72 20 61 6c 6c 20 63  n wait for all c
70c0: 6c 69 65 6e 74 73 20 74 6f 20 63 6f 6d 70 6c 65  lients to comple
70d0: 74 65 2e 20 20 57 61 69 74 20 6e 6f 20 6c 6f 6e  te.  Wait no lon
70e0: 67 65 72 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20  ger than.    ** 
70f0: 54 49 4d 45 4f 55 54 20 6d 69 6c 6c 69 73 65 63  TIMEOUT millisec
7100: 6f 6e 64 73 20 28 64 65 66 61 75 6c 74 20 31 30  onds (default 10
7110: 2c 30 30 30 29 0a 20 20 20 20 2a 2f 0a 20 20 20  ,000).    */.   
7120: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64   if( strcmp(zCmd
7130: 2c 20 22 77 61 69 74 22 29 3d 3d 30 20 26 26 20  , "wait")==0 && 
7140: 69 43 6c 69 65 6e 74 3d 3d 30 20 29 7b 0a 20 20  iClient==0 ){.  
7150: 20 20 20 20 69 6e 74 20 69 54 69 6d 65 6f 75 74      int iTimeout
7160: 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61 74 6f   = nArg>=2 ? ato
7170: 69 28 61 7a 41 72 67 5b 31 5d 29 20 3a 20 31 30  i(azArg[1]) : 10
7180: 30 30 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  000;.      sqlit
7190: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
71a0: 6f 66 28 7a 45 72 72 6f 72 29 2c 7a 45 72 72 6f  of(zError),zErro
71b0: 72 2c 22 6c 69 6e 65 20 25 64 20 6f 66 20 25 73  r,"line %d of %s
71c0: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
71d0: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65 76              prev
71e0: 4c 69 6e 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  Line, zFilename)
71f0: 3b 0a 20 20 20 20 20 20 77 61 69 74 46 6f 72 43  ;.      waitForC
7200: 6c 69 65 6e 74 28 61 74 6f 69 28 61 7a 41 72 67  lient(atoi(azArg
7210: 5b 30 5d 29 2c 20 69 54 69 6d 65 6f 75 74 2c 20  [0]), iTimeout, 
7220: 7a 45 72 72 6f 72 29 3b 0a 20 20 20 20 7d 65 6c  zError);.    }el
7230: 73 65 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  se..    /*.    *
7240: 2a 20 20 2d 2d 74 61 73 6b 20 43 4c 49 45 4e 54  *  --task CLIENT
7250: 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c 74 61 73  .    **     <tas
7260: 6b 2d 63 6f 6e 74 65 6e 74 2d 68 65 72 65 3e 0a  k-content-here>.
7270: 20 20 20 20 2a 2a 20 20 2d 2d 65 6e 64 0a 20 20      **  --end.  
7280: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 73 73 69    **.    ** Assi
7290: 67 6e 20 77 6f 72 6b 20 74 6f 20 61 20 63 6c 69  gn work to a cli
72a0: 65 6e 74 2e 20 20 53 74 61 72 74 20 74 68 65 20  ent.  Start the 
72b0: 63 6c 69 65 6e 74 20 69 66 20 69 74 20 69 73 20  client if it is 
72c0: 6e 6f 74 20 72 75 6e 6e 69 6e 67 0a 20 20 20 20  not running.    
72d0: 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  ** already..    
72e0: 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  */.    if( strcm
72f0: 70 28 7a 43 6d 64 2c 20 22 74 61 73 6b 22 29 3d  p(zCmd, "task")=
7300: 3d 30 20 26 26 20 69 43 6c 69 65 6e 74 3d 3d 30  =0 && iClient==0
7310: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54   ){.      int iT
7320: 61 72 67 65 74 20 3d 20 61 74 6f 69 28 61 7a 41  arget = atoi(azA
7330: 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 69 6e  rg[0]);.      in
7340: 74 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 63 68  t iEnd;.      ch
7350: 61 72 20 2a 7a 54 61 73 6b 3b 0a 20 20 20 20 20  ar *zTask;.     
7360: 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 3b 0a 20   char *zTName;. 
7370: 20 20 20 20 20 69 45 6e 64 20 3d 20 66 69 6e 64       iEnd = find
7380: 45 6e 64 28 7a 53 63 72 69 70 74 2b 69 69 2b 6c  End(zScript+ii+l
7390: 65 6e 2c 20 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20  en, &lineno);.  
73a0: 20 20 20 20 69 66 28 20 69 54 61 72 67 65 74 3c      if( iTarget<
73b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72 72  0 ){.        err
73c0: 6f 72 4d 65 73 73 61 67 65 28 22 6c 69 6e 65 20  orMessage("line 
73d0: 25 64 20 6f 66 20 25 73 3a 20 62 61 64 20 63 6c  %d of %s: bad cl
73e0: 69 65 6e 74 20 6e 75 6d 62 65 72 3a 20 25 64 22  ient number: %d"
73f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
7400: 20 20 20 20 20 20 20 70 72 65 76 4c 69 6e 65 2c         prevLine,
7410: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 54 61 72   zFilename, iTar
7420: 67 65 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  get);.      }els
7430: 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 61 73 6b  e{.        zTask
7440: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
7450: 74 66 28 22 25 2e 2a 73 22 2c 20 69 45 6e 64 2c  tf("%.*s", iEnd,
7460: 20 7a 53 63 72 69 70 74 2b 69 69 2b 6c 65 6e 29   zScript+ii+len)
7470: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 41  ;.        if( nA
7480: 72 67 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  rg>1 ){.        
7490: 20 20 7a 54 4e 61 6d 65 20 3d 20 73 71 6c 69 74    zTName = sqlit
74a0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
74b0: 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
74c0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
74d0: 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 73 71       zTName = sq
74e0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
74f0: 73 3a 25 64 22 2c 20 66 69 6c 65 6e 61 6d 65 54  s:%d", filenameT
7500: 61 69 6c 28 7a 46 69 6c 65 6e 61 6d 65 29 2c 20  ail(zFilename), 
7510: 70 72 65 76 4c 69 6e 65 29 3b 0a 20 20 20 20 20  prevLine);.     
7520: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 74 61     }.        sta
7530: 72 74 43 6c 69 65 6e 74 28 69 54 61 72 67 65 74  rtClient(iTarget
7540: 29 3b 0a 20 20 20 20 20 20 20 20 72 75 6e 53 71  );.        runSq
7550: 6c 28 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  l("INSERT INTO t
7560: 61 73 6b 28 63 6c 69 65 6e 74 2c 73 63 72 69 70  ask(client,scrip
7570: 74 2c 6e 61 6d 65 29 22 0a 20 20 20 20 20 20 20  t,name)".       
7580: 20 20 20 20 20 20 20 20 22 20 56 41 4c 55 45 53          " VALUES
7590: 28 25 64 2c 27 25 71 27 2c 25 51 29 22 2c 20 69  (%d,'%q',%Q)", i
75a0: 54 61 72 67 65 74 2c 20 7a 54 61 73 6b 2c 20 7a  Target, zTask, z
75b0: 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  TName);.        
75c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 61  sqlite3_free(zTa
75d0: 73 6b 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  sk);.        sql
75e0: 69 74 65 33 5f 66 72 65 65 28 7a 54 4e 61 6d 65  ite3_free(zTName
75f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7600: 20 69 45 6e 64 20 2b 3d 20 74 6f 6b 65 6e 4c 65   iEnd += tokenLe
7610: 6e 67 74 68 28 7a 53 63 72 69 70 74 2b 69 69 2b  ngth(zScript+ii+
7620: 6c 65 6e 2b 69 45 6e 64 2c 20 26 6c 69 6e 65 6e  len+iEnd, &linen
7630: 6f 29 3b 0a 20 20 20 20 20 20 6c 65 6e 20 2b 3d  o);.      len +=
7640: 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 69 42 65   iEnd;.      iBe
7650: 67 69 6e 20 3d 20 69 69 2b 6c 65 6e 3b 0a 20 20  gin = ii+len;.  
7660: 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a    }else..    /*.
7670: 20 20 20 20 2a 2a 20 20 2d 2d 62 72 65 61 6b 70      **  --breakp
7680: 6f 69 6e 74 0a 20 20 20 20 2a 2a 0a 20 20 20 20  oint.    **.    
7690: 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ** This command 
76a0: 63 61 6c 6c 73 20 22 74 65 73 74 5f 62 72 65 61  calls "test_brea
76b0: 6b 70 6f 69 6e 74 28 29 22 20 77 68 69 63 68 20  kpoint()" which 
76c0: 69 73 20 61 20 72 6f 75 74 69 6e 65 20 70 72 6f  is a routine pro
76d0: 76 69 64 65 64 0a 20 20 20 20 2a 2a 20 61 73 20  vided.    ** as 
76e0: 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61  a convenient pla
76f0: 63 65 20 74 6f 20 73 65 74 20 61 20 64 65 62 75  ce to set a debu
7700: 67 67 65 72 20 62 72 65 61 6b 70 6f 69 6e 74 2e  gger breakpoint.
7710: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
7720: 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 62 72  strcmp(zCmd, "br
7730: 65 61 6b 70 6f 69 6e 74 22 29 3d 3d 30 20 29 7b  eakpoint")==0 ){
7740: 0a 20 20 20 20 20 20 74 65 73 74 5f 62 72 65 61  .      test_brea
7750: 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 20 20 7d 65  kpoint();.    }e
7760: 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  lse..    /*.    
7770: 2a 2a 20 20 2d 2d 73 68 6f 77 2d 73 71 6c 2d 65  **  --show-sql-e
7780: 72 72 6f 72 73 20 42 4f 4f 4c 45 41 4e 0a 20 20  rrors BOOLEAN.  
7790: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 75 72 6e    **.    ** Turn
77a0: 20 64 69 73 70 6c 61 79 20 6f 66 20 53 51 4c 20   display of SQL 
77b0: 65 72 72 6f 72 73 20 6f 6e 20 61 6e 64 20 6f 66  errors on and of
77c0: 66 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  f..    */.    if
77d0: 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22  ( strcmp(zCmd, "
77e0: 73 68 6f 77 2d 73 71 6c 2d 65 72 72 6f 72 73 22  show-sql-errors"
77f0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 2e  )==0 ){.      g.
7800: 62 49 67 6e 6f 72 65 53 71 6c 45 72 72 6f 72 73  bIgnoreSqlErrors
7810: 20 3d 20 6e 41 72 67 3e 3d 31 20 3f 20 21 62 6f   = nArg>=1 ? !bo
7820: 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67  oleanValue(azArg
7830: 5b 30 5d 29 20 3a 20 31 3b 0a 20 20 20 20 7d 65  [0]) : 1;.    }e
7840: 6c 73 65 0a 0a 0a 20 20 20 20 2f 2a 20 65 72 72  lse...    /* err
7850: 6f 72 20 2a 2f 7b 0a 20 20 20 20 20 20 65 72 72  or */{.      err
7860: 6f 72 4d 65 73 73 61 67 65 28 22 6c 69 6e 65 20  orMessage("line 
7870: 25 64 20 6f 66 20 25 73 3a 20 75 6e 6b 6e 6f 77  %d of %s: unknow
7880: 6e 20 63 6f 6d 6d 61 6e 64 20 2d 2d 25 73 22 2c  n command --%s",
7890: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
78a0: 20 20 20 20 70 72 65 76 4c 69 6e 65 2c 20 7a 46      prevLine, zF
78b0: 69 6c 65 6e 61 6d 65 2c 20 7a 43 6d 64 29 3b 0a  ilename, zCmd);.
78c0: 20 20 20 20 7d 0a 20 20 20 20 69 69 20 2b 3d 20      }.    ii += 
78d0: 6c 65 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69  len;.  }.  if( i
78e0: 42 65 67 69 6e 3c 69 69 20 29 7b 0a 20 20 20 20  Begin<ii ){.    
78f0: 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c  char *zSql = sql
7900: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 2e  ite3_mprintf("%.
7910: 2a 73 22 2c 20 69 69 2d 69 42 65 67 69 6e 2c 20  *s", ii-iBegin, 
7920: 7a 53 63 72 69 70 74 2b 69 42 65 67 69 6e 29 3b  zScript+iBegin);
7930: 0a 20 20 20 20 72 75 6e 53 71 6c 28 7a 53 71 6c  .    runSql(zSql
7940: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
7950: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20  ree(zSql);.  }. 
7960: 20 73 74 72 69 6e 67 46 72 65 65 28 26 73 52 65   stringFree(&sRe
7970: 73 75 6c 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  sult);.}../*.** 
7980: 4c 6f 6f 6b 20 66 6f 72 20 61 20 63 6f 6d 6d 61  Look for a comma
7990: 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 2e 20  nd-line option. 
79a0: 20 49 66 20 70 72 65 73 65 6e 74 2c 20 72 65 74   If present, ret
79b0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a  urn a pointer..*
79c0: 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66  * Return NULL if
79d0: 20 6d 69 73 73 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   missing..**.** 
79e0: 68 61 73 41 72 67 3d 3d 30 20 6d 65 61 6e 73 20  hasArg==0 means 
79f0: 74 68 65 20 6f 70 74 69 6f 6e 20 69 73 20 61 20  the option is a 
7a00: 66 6c 61 67 2e 20 20 49 74 20 69 73 20 65 69 74  flag.  It is eit
7a10: 68 65 72 20 70 72 65 73 65 6e 74 20 6f 72 20 6e  her present or n
7a20: 6f 74 2e 0a 2a 2a 20 68 61 73 41 72 67 3d 3d 31  ot..** hasArg==1
7a30: 20 6d 65 61 6e 73 20 74 68 65 20 6f 70 74 69 6f   means the optio
7a40: 6e 20 68 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  n has an argumen
7a50: 74 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  t.  Return a poi
7a60: 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a 2a 20 61  nter to the.** a
7a70: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
7a80: 69 63 20 63 68 61 72 20 2a 66 69 6e 64 4f 70 74  ic char *findOpt
7a90: 69 6f 6e 28 0a 20 20 63 68 61 72 20 2a 2a 61 7a  ion(.  char **az
7aa0: 41 72 67 2c 0a 20 20 69 6e 74 20 2a 70 6e 41 72  Arg,.  int *pnAr
7ab0: 67 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  g,.  const char 
7ac0: 2a 7a 4f 70 74 69 6f 6e 2c 0a 20 20 69 6e 74 20  *zOption,.  int 
7ad0: 68 61 73 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20  hasArg.){.  int 
7ae0: 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 2a 7a 52  i, j;.  char *zR
7af0: 65 74 75 72 6e 20 3d 20 30 3b 0a 20 20 69 6e 74  eturn = 0;.  int
7b00: 20 6e 41 72 67 20 3d 20 2a 70 6e 41 72 67 3b 0a   nArg = *pnArg;.
7b10: 0a 20 20 61 73 73 65 72 74 28 20 68 61 73 41 72  .  assert( hasAr
7b20: 67 3d 3d 30 20 7c 7c 20 68 61 73 41 72 67 3d 3d  g==0 || hasArg==
7b30: 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  1 );.  for(i=0; 
7b40: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
7b50: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
7b60: 0a 20 20 20 20 69 66 28 20 69 2b 68 61 73 41 72  .    if( i+hasAr
7b70: 67 20 3e 3d 20 6e 41 72 67 20 29 20 62 72 65 61  g >= nArg ) brea
7b80: 6b 3b 0a 20 20 20 20 7a 20 3d 20 61 7a 41 72 67  k;.    z = azArg
7b90: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30  [i];.    if( z[0
7ba0: 5d 21 3d 27 2d 27 20 29 20 63 6f 6e 74 69 6e 75  ]!='-' ) continu
7bb0: 65 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20  e;.    z++;.    
7bc0: 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b  if( z[0]=='-' ){
7bd0: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 31 5d 3d  .      if( z[1]=
7be0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
7bf0: 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20    z++;.    }.   
7c00: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 7a 4f   if( strcmp(z,zO
7c10: 70 74 69 6f 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  ption)==0 ){.   
7c20: 20 20 20 69 66 28 20 68 61 73 41 72 67 20 26 26     if( hasArg &&
7c30: 20 69 3d 3d 6e 41 72 67 2d 31 20 29 7b 0a 20 20   i==nArg-1 ){.  
7c40: 20 20 20 20 20 20 66 61 74 61 6c 45 72 72 6f 72        fatalError
7c50: 28 22 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f  ("command-line o
7c60: 70 74 69 6f 6e 20 5c 22 2d 2d 25 73 5c 22 20 72  ption \"--%s\" r
7c70: 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d  equires an argum
7c80: 65 6e 74 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20  ent", z);.      
7c90: 7d 0a 20 20 20 20 20 20 69 66 28 20 68 61 73 41  }.      if( hasA
7ca0: 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 52  rg ){.        zR
7cb0: 65 74 75 72 6e 20 3d 20 61 7a 41 72 67 5b 69 2b  eturn = azArg[i+
7cc0: 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  1];.      }else{
7cd0: 0a 20 20 20 20 20 20 20 20 7a 52 65 74 75 72 6e  .        zReturn
7ce0: 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20   = azArg[i];.   
7cf0: 20 20 20 7d 0a 20 20 20 20 20 20 6a 20 3d 20 69     }.      j = i
7d00: 2b 31 2b 28 68 61 73 41 72 67 21 3d 30 29 3b 0a  +1+(hasArg!=0);.
7d10: 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3c 6e        while( j<n
7d20: 41 72 67 20 29 20 61 7a 41 72 67 5b 69 2b 2b 5d  Arg ) azArg[i++]
7d30: 20 3d 20 61 7a 41 72 67 5b 6a 2b 2b 5d 3b 0a 20   = azArg[j++];. 
7d40: 20 20 20 20 20 2a 70 6e 41 72 67 20 3d 20 69 3b       *pnArg = i;
7d50: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 7a 52  .      return zR
7d60: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
7d70: 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 74 75 72  .  return zRetur
7d80: 6e 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e 74 20 61  n;.}../* Print a
7d90: 20 75 73 61 67 65 20 6d 65 73 73 61 67 65 20 66   usage message f
7da0: 6f 72 20 74 68 65 20 70 72 6f 67 72 61 6d 20 61  or the program a
7db0: 6e 64 20 65 78 69 74 20 2a 2f 0a 73 74 61 74 69  nd exit */.stati
7dc0: 63 20 76 6f 69 64 20 75 73 61 67 65 28 63 6f 6e  c void usage(con
7dd0: 73 74 20 63 68 61 72 20 2a 61 72 67 76 30 29 7b  st char *argv0){
7de0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
7df0: 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 20 3d 20  t char *zTail = 
7e00: 61 72 67 76 30 3b 0a 20 20 66 6f 72 28 69 3d 30  argv0;.  for(i=0
7e10: 3b 20 61 72 67 76 30 5b 69 5d 3b 20 69 2b 2b 29  ; argv0[i]; i++)
7e20: 7b 0a 20 20 20 20 69 66 28 20 69 73 44 69 72 53  {.    if( isDirS
7e30: 65 70 28 61 72 67 76 30 5b 69 5d 29 20 29 20 7a  ep(argv0[i]) ) z
7e40: 54 61 69 6c 20 3d 20 61 72 67 76 30 2b 69 2b 31  Tail = argv0+i+1
7e50: 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28  ;.  }.  fprintf(
7e60: 73 74 64 65 72 72 2c 22 55 73 61 67 65 3a 20 25  stderr,"Usage: %
7e70: 73 20 44 41 54 41 42 41 53 45 20 3f 4f 50 54 49  s DATABASE ?OPTI
7e80: 4f 4e 53 3f 20 3f 53 43 52 49 50 54 3f 5c 6e 22  ONS? ?SCRIPT?\n"
7e90: 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 65 78 69 74  , zTail);.  exit
7ea0: 28 31 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 70 6f 72  (1);.}../* Repor
7eb0: 74 20 6f 6e 20 75 6e 72 65 63 6f 67 6e 69 7a 65  t on unrecognize
7ec0: 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 73  d arguments */.s
7ed0: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 72 65 63  tatic void unrec
7ee0: 6f 67 6e 69 7a 65 64 41 72 67 75 6d 65 6e 74 73  ognizedArguments
7ef0: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
7f00: 61 72 67 76 30 2c 0a 20 20 69 6e 74 20 6e 41 72  argv0,.  int nAr
7f10: 67 2c 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72  g,.  char **azAr
7f20: 67 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  g.){.  int i;.  
7f30: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  fprintf(stderr,"
7f40: 25 73 3a 20 75 6e 72 65 63 6f 67 6e 69 7a 65 64  %s: unrecognized
7f50: 20 61 72 67 75 6d 65 6e 74 73 3a 22 2c 20 61 72   arguments:", ar
7f60: 67 76 30 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  gv0);.  for(i=0;
7f70: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
7f80: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
7f90: 72 2c 22 20 25 73 22 2c 20 61 7a 41 72 67 5b 69  r," %s", azArg[i
7fa0: 5d 29 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74  ]);.  }.  fprint
7fb0: 66 28 73 74 64 65 72 72 2c 22 5c 6e 22 29 3b 0a  f(stderr,"\n");.
7fc0: 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 69 6e    exit(1);.}..in
7fd0: 74 20 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 6d  t SQLITE_CDECL m
7fe0: 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20 63 68  ain(int argc, ch
7ff0: 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f  ar **argv){.  co
8000: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6c 69 65 6e  nst char *zClien
8010: 74 3b 0a 20 20 69 6e 74 20 69 43 6c 69 65 6e 74  t;.  int iClient
8020: 3b 0a 20 20 69 6e 74 20 6e 2c 20 69 3b 0a 20 20  ;.  int n, i;.  
8030: 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20  int openFlags = 
8040: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
8050: 57 52 49 54 45 3b 0a 20 20 69 6e 74 20 72 63 3b  WRITE;.  int rc;
8060: 0a 20 20 63 68 61 72 20 2a 7a 53 63 72 69 70 74  .  char *zScript
8070: 3b 0a 20 20 69 6e 74 20 74 61 73 6b 49 64 3b 0a  ;.  int taskId;.
8080: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
8090: 72 61 63 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68  race;.  const ch
80a0: 61 72 20 2a 7a 43 4f 70 74 69 6f 6e 3b 0a 20 20  ar *zCOption;.  
80b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4a 4d 6f  const char *zJMo
80c0: 64 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  de;.  const char
80d0: 20 2a 7a 4e 52 65 70 3b 0a 20 20 69 6e 74 20 6e   *zNRep;.  int n
80e0: 52 65 70 20 3d 20 31 2c 20 69 52 65 70 3b 0a 0a  Rep = 1, iRep;..
80f0: 20 20 67 2e 61 72 67 76 30 20 3d 20 61 72 67 76    g.argv0 = argv
8100: 5b 30 5d 3b 0a 20 20 67 2e 69 54 72 61 63 65 20  [0];.  g.iTrace 
8110: 3d 20 31 3b 0a 20 20 69 66 28 20 61 72 67 63 3c  = 1;.  if( argc<
8120: 32 20 29 20 75 73 61 67 65 28 61 72 67 76 5b 30  2 ) usage(argv[0
8130: 5d 29 3b 0a 20 20 67 2e 7a 44 62 46 69 6c 65 20  ]);.  g.zDbFile 
8140: 3d 20 61 72 67 76 5b 31 5d 3b 0a 20 20 69 66 28  = argv[1];.  if(
8150: 20 73 74 72 67 6c 6f 62 28 22 2a 2e 74 65 73 74   strglob("*.test
8160: 22 2c 20 67 2e 7a 44 62 46 69 6c 65 29 20 29 20  ", g.zDbFile) ) 
8170: 75 73 61 67 65 28 61 72 67 76 5b 30 5d 29 3b 0a  usage(argv[0]);.
8180: 20 20 69 66 28 20 73 74 72 63 6d 70 28 73 71 6c    if( strcmp(sql
8190: 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 2c  ite3_sourceid(),
81a0: 20 53 51 4c 49 54 45 5f 53 4f 55 52 43 45 5f 49   SQLITE_SOURCE_I
81b0: 44 29 21 3d 30 20 29 7b 0a 20 20 20 20 66 70 72  D)!=0 ){.    fpr
81c0: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 51  intf(stderr, "SQ
81d0: 4c 69 74 65 20 6c 69 62 72 61 72 79 20 61 6e 64  Lite library and
81e0: 20 68 65 61 64 65 72 20 6d 69 73 6d 61 74 63 68   header mismatch
81f0: 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  \n".            
8200: 20 20 20 20 20 20 20 20 22 4c 69 62 72 61 72 79          "Library
8210: 3a 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 20 20  : %s\n".        
8220: 20 20 20 20 20 20 20 20 20 20 20 20 22 48 65 61              "Hea
8230: 64 65 72 3a 20 20 25 73 5c 6e 22 2c 0a 20 20 20  der:  %s\n",.   
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8250: 20 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69   sqlite3_sourcei
8260: 64 28 29 2c 20 53 51 4c 49 54 45 5f 53 4f 55 52  d(), SQLITE_SOUR
8270: 43 45 5f 49 44 29 3b 0a 20 20 20 20 65 78 69 74  CE_ID);.    exit
8280: 28 31 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 61  (1);.  }.  n = a
8290: 72 67 63 2d 32 3b 0a 20 20 73 71 6c 69 74 65 33  rgc-2;.  sqlite3
82a0: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
82b0: 28 67 2e 7a 4e 61 6d 65 29 2c 20 67 2e 7a 4e 61  (g.zName), g.zNa
82c0: 6d 65 2c 20 22 25 30 35 64 2e 6d 70 74 65 73 74  me, "%05d.mptest
82d0: 22 2c 20 47 45 54 50 49 44 28 29 29 3b 0a 20 20  ", GETPID());.  
82e0: 7a 4a 4d 6f 64 65 20 3d 20 66 69 6e 64 4f 70 74  zJMode = findOpt
82f0: 69 6f 6e 28 61 72 67 76 2b 32 2c 20 26 6e 2c 20  ion(argv+2, &n, 
8300: 22 6a 6f 75 72 6e 61 6c 6d 6f 64 65 22 2c 20 31  "journalmode", 1
8310: 29 3b 0a 20 20 7a 4e 52 65 70 20 3d 20 66 69 6e  );.  zNRep = fin
8320: 64 4f 70 74 69 6f 6e 28 61 72 67 76 2b 32 2c 20  dOption(argv+2, 
8330: 26 6e 2c 20 22 72 65 70 65 61 74 22 2c 20 31 29  &n, "repeat", 1)
8340: 3b 0a 20 20 69 66 28 20 7a 4e 52 65 70 20 29 20  ;.  if( zNRep ) 
8350: 6e 52 65 70 20 3d 20 61 74 6f 69 28 7a 4e 52 65  nRep = atoi(zNRe
8360: 70 29 3b 0a 20 20 69 66 28 20 6e 52 65 70 3c 31  p);.  if( nRep<1
8370: 20 29 20 6e 52 65 70 20 3d 20 31 3b 0a 20 20 67   ) nRep = 1;.  g
8380: 2e 7a 56 66 73 20 3d 20 66 69 6e 64 4f 70 74 69  .zVfs = findOpti
8390: 6f 6e 28 61 72 67 76 2b 32 2c 20 26 6e 2c 20 22  on(argv+2, &n, "
83a0: 76 66 73 22 2c 20 31 29 3b 0a 20 20 7a 43 6c 69  vfs", 1);.  zCli
83b0: 65 6e 74 20 3d 20 66 69 6e 64 4f 70 74 69 6f 6e  ent = findOption
83c0: 28 61 72 67 76 2b 32 2c 20 26 6e 2c 20 22 63 6c  (argv+2, &n, "cl
83d0: 69 65 6e 74 22 2c 20 31 29 3b 0a 20 20 67 2e 7a  ient", 1);.  g.z
83e0: 45 72 72 4c 6f 67 20 3d 20 66 69 6e 64 4f 70 74  ErrLog = findOpt
83f0: 69 6f 6e 28 61 72 67 76 2b 32 2c 20 26 6e 2c 20  ion(argv+2, &n, 
8400: 22 65 72 72 6c 6f 67 22 2c 20 31 29 3b 0a 20 20  "errlog", 1);.  
8410: 67 2e 7a 4c 6f 67 20 3d 20 66 69 6e 64 4f 70 74  g.zLog = findOpt
8420: 69 6f 6e 28 61 72 67 76 2b 32 2c 20 26 6e 2c 20  ion(argv+2, &n, 
8430: 22 6c 6f 67 22 2c 20 31 29 3b 0a 20 20 7a 54 72  "log", 1);.  zTr
8440: 61 63 65 20 3d 20 66 69 6e 64 4f 70 74 69 6f 6e  ace = findOption
8450: 28 61 72 67 76 2b 32 2c 20 26 6e 2c 20 22 74 72  (argv+2, &n, "tr
8460: 61 63 65 22 2c 20 31 29 3b 0a 20 20 69 66 28 20  ace", 1);.  if( 
8470: 7a 54 72 61 63 65 20 29 20 67 2e 69 54 72 61 63  zTrace ) g.iTrac
8480: 65 20 3d 20 61 74 6f 69 28 7a 54 72 61 63 65 29  e = atoi(zTrace)
8490: 3b 0a 20 20 69 66 28 20 66 69 6e 64 4f 70 74 69  ;.  if( findOpti
84a0: 6f 6e 28 61 72 67 76 2b 32 2c 20 26 6e 2c 20 22  on(argv+2, &n, "
84b0: 71 75 69 65 74 22 2c 20 30 29 21 3d 30 20 29 20  quiet", 0)!=0 ) 
84c0: 67 2e 69 54 72 61 63 65 20 3d 20 30 3b 0a 20 20  g.iTrace = 0;.  
84d0: 67 2e 62 53 71 6c 54 72 61 63 65 20 3d 20 66 69  g.bSqlTrace = fi
84e0: 6e 64 4f 70 74 69 6f 6e 28 61 72 67 76 2b 32 2c  ndOption(argv+2,
84f0: 20 26 6e 2c 20 22 73 71 6c 74 72 61 63 65 22 2c   &n, "sqltrace",
8500: 20 30 29 21 3d 30 3b 0a 20 20 67 2e 62 53 79 6e   0)!=0;.  g.bSyn
8510: 63 20 3d 20 66 69 6e 64 4f 70 74 69 6f 6e 28 61  c = findOption(a
8520: 72 67 76 2b 32 2c 20 26 6e 2c 20 22 73 79 6e 63  rgv+2, &n, "sync
8530: 22 2c 20 30 29 21 3d 30 3b 0a 20 20 69 66 28 20  ", 0)!=0;.  if( 
8540: 67 2e 7a 45 72 72 4c 6f 67 20 29 7b 0a 20 20 20  g.zErrLog ){.   
8550: 20 67 2e 70 45 72 72 4c 6f 67 20 3d 20 66 6f 70   g.pErrLog = fop
8560: 65 6e 28 67 2e 7a 45 72 72 4c 6f 67 2c 20 22 61  en(g.zErrLog, "a
8570: 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ");.  }else{.   
8580: 20 67 2e 70 45 72 72 4c 6f 67 20 3d 20 73 74 64   g.pErrLog = std
8590: 65 72 72 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  err;.  }.  if( g
85a0: 2e 7a 4c 6f 67 20 29 7b 0a 20 20 20 20 67 2e 70  .zLog ){.    g.p
85b0: 4c 6f 67 20 3d 20 66 6f 70 65 6e 28 67 2e 7a 4c  Log = fopen(g.zL
85c0: 6f 67 2c 20 22 61 22 29 3b 0a 20 20 7d 65 6c 73  og, "a");.  }els
85d0: 65 7b 0a 20 20 20 20 67 2e 70 4c 6f 67 20 3d 20  e{.    g.pLog = 
85e0: 73 74 64 6f 75 74 3b 0a 20 20 7d 0a 20 20 0a 20  stdout;.  }.  . 
85f0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
8600: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f  SQLITE_CONFIG_LO
8610: 47 2c 20 73 71 6c 45 72 72 6f 72 43 61 6c 6c 62  G, sqlErrorCallb
8620: 61 63 6b 2c 20 30 29 3b 0a 20 20 69 66 28 20 7a  ack, 0);.  if( z
8630: 43 6c 69 65 6e 74 20 29 7b 0a 20 20 20 20 69 43  Client ){.    iC
8640: 6c 69 65 6e 74 20 3d 20 61 74 6f 69 28 7a 43 6c  lient = atoi(zCl
8650: 69 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 69  ient);.    if( i
8660: 43 6c 69 65 6e 74 3c 31 20 29 20 66 61 74 61 6c  Client<1 ) fatal
8670: 45 72 72 6f 72 28 22 69 6c 6c 65 67 61 6c 20 63  Error("illegal c
8680: 6c 69 65 6e 74 20 6e 75 6d 62 65 72 3a 20 25 64  lient number: %d
8690: 5c 6e 22 2c 20 69 43 6c 69 65 6e 74 29 3b 0a 20  \n", iClient);. 
86a0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
86b0: 6e 74 66 28 73 69 7a 65 6f 66 28 67 2e 7a 4e 61  ntf(sizeof(g.zNa
86c0: 6d 65 29 2c 20 67 2e 7a 4e 61 6d 65 2c 20 22 25  me), g.zName, "%
86d0: 30 35 64 2e 63 6c 69 65 6e 74 25 30 32 64 22 2c  05d.client%02d",
86e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
86f0: 20 20 20 20 20 20 47 45 54 50 49 44 28 29 2c 20        GETPID(), 
8700: 69 43 6c 69 65 6e 74 29 3b 0a 20 20 7d 65 6c 73  iClient);.  }els
8710: 65 7b 0a 20 20 20 20 69 66 28 20 67 2e 69 54 72  e{.    if( g.iTr
8720: 61 63 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 70  ace>0 ){.      p
8730: 72 69 6e 74 66 28 22 42 45 47 49 4e 3a 20 25 73  rintf("BEGIN: %s
8740: 22 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  ", argv[0]);.   
8750: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72     for(i=1; i<ar
8760: 67 63 3b 20 69 2b 2b 29 20 70 72 69 6e 74 66 28  gc; i++) printf(
8770: 22 20 25 73 22 2c 20 61 72 67 76 5b 69 5d 29 3b  " %s", argv[i]);
8780: 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 5c  .      printf("\
8790: 6e 22 29 3b 0a 20 20 20 20 20 20 70 72 69 6e 74  n");.      print
87a0: 66 28 22 57 69 74 68 20 53 51 4c 69 74 65 20 22  f("With SQLite "
87b0: 20 53 51 4c 49 54 45 5f 56 45 52 53 49 4f 4e 20   SQLITE_VERSION 
87c0: 22 20 22 20 53 51 4c 49 54 45 5f 53 4f 55 52 43  " " SQLITE_SOURC
87d0: 45 5f 49 44 20 22 5c 6e 22 20 29 3b 0a 20 20 20  E_ID "\n" );.   
87e0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 7a 43 4f     for(i=0; (zCO
87f0: 70 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33 5f  ption = sqlite3_
8800: 63 6f 6d 70 69 6c 65 6f 70 74 69 6f 6e 5f 67 65  compileoption_ge
8810: 74 28 69 29 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a  t(i))!=0; i++){.
8820: 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
8830: 2d 44 53 51 4c 49 54 45 5f 25 73 5c 6e 22 2c 20  -DSQLITE_%s\n", 
8840: 7a 43 4f 70 74 69 6f 6e 29 3b 0a 20 20 20 20 20  zCOption);.     
8850: 20 7d 0a 20 20 20 20 20 20 66 66 6c 75 73 68 28   }.      fflush(
8860: 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 20  stdout);.    }. 
8870: 20 20 20 69 43 6c 69 65 6e 74 20 3d 20 20 30 3b     iClient =  0;
8880: 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 67 2e 7a 44  .    unlink(g.zD
8890: 62 46 69 6c 65 29 3b 0a 20 20 20 20 6f 70 65 6e  bFile);.    open
88a0: 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  Flags |= SQLITE_
88b0: 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 7d  OPEN_CREATE;.  }
88c0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
88d0: 6f 70 65 6e 5f 76 32 28 67 2e 7a 44 62 46 69 6c  open_v2(g.zDbFil
88e0: 65 2c 20 26 67 2e 64 62 2c 20 6f 70 65 6e 46 6c  e, &g.db, openFl
88f0: 61 67 73 2c 20 67 2e 7a 56 66 73 29 3b 0a 20 20  ags, g.zVfs);.  
8900: 69 66 28 20 72 63 20 29 20 66 61 74 61 6c 45 72  if( rc ) fatalEr
8910: 72 6f 72 28 22 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror("cannot open
8920: 20 5b 25 73 5d 22 2c 20 67 2e 7a 44 62 46 69 6c   [%s]", g.zDbFil
8930: 65 29 3b 0a 20 20 69 66 28 20 7a 4a 4d 6f 64 65  e);.  if( zJMode
8940: 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28   ){.#if defined(
8950: 5f 57 49 4e 33 32 29 0a 20 20 20 20 69 66 28 20  _WIN32).    if( 
8960: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
8970: 7a 4a 4d 6f 64 65 2c 22 70 65 72 73 69 73 74 22  zJMode,"persist"
8980: 29 3d 3d 30 0a 20 20 20 20 20 7c 7c 20 73 71 6c  )==0.     || sql
8990: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 4a 4d  ite3_stricmp(zJM
89a0: 6f 64 65 2c 22 74 72 75 6e 63 61 74 65 22 29 3d  ode,"truncate")=
89b0: 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
89c0: 70 72 69 6e 74 66 28 22 43 68 61 6e 67 69 6e 67  printf("Changing
89d0: 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 74 6f   journal mode to
89e0: 20 44 45 4c 45 54 45 20 66 72 6f 6d 20 25 73 22   DELETE from %s"
89f0: 2c 20 7a 4a 4d 6f 64 65 29 3b 0a 20 20 20 20 20  , zJMode);.     
8a00: 20 7a 4a 4d 6f 64 65 20 3d 20 22 44 45 4c 45 54   zJMode = "DELET
8a10: 45 22 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  E";.    }.#endif
8a20: 0a 20 20 20 20 72 75 6e 53 71 6c 28 22 50 52 41  .    runSql("PRA
8a30: 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  GMA journal_mode
8a40: 3d 25 51 3b 22 2c 20 7a 4a 4d 6f 64 65 29 3b 0a  =%Q;", zJMode);.
8a50: 20 20 7d 0a 20 20 69 66 28 20 21 67 2e 62 53 79    }.  if( !g.bSy
8a60: 6e 63 20 29 20 74 72 79 53 71 6c 28 22 50 52 41  nc ) trySql("PRA
8a70: 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  GMA synchronous=
8a80: 4f 46 46 22 29 3b 0a 20 20 73 71 6c 69 74 65 33  OFF");.  sqlite3
8a90: 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74  _enable_load_ext
8aa0: 65 6e 73 69 6f 6e 28 67 2e 64 62 2c 20 31 29 3b  ension(g.db, 1);
8ab0: 0a 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f  .  sqlite3_busy_
8ac0: 68 61 6e 64 6c 65 72 28 67 2e 64 62 2c 20 62 75  handler(g.db, bu
8ad0: 73 79 48 61 6e 64 6c 65 72 2c 20 30 29 3b 0a 20  syHandler, 0);. 
8ae0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
8af0: 66 75 6e 63 74 69 6f 6e 28 67 2e 64 62 2c 20 22  function(g.db, "
8b00: 76 66 73 6e 61 6d 65 22 2c 20 30 2c 20 53 51 4c  vfsname", 0, SQL
8b10: 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20  ITE_UTF8, 0,.   
8b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8b30: 20 20 20 20 20 20 20 76 66 73 4e 61 6d 65 46 75         vfsNameFu
8b40: 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c  nc, 0, 0);.  sql
8b50: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
8b60: 74 69 6f 6e 28 67 2e 64 62 2c 20 22 65 76 61 6c  tion(g.db, "eval
8b70: 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
8b80: 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  8, 0,.          
8b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8ba0: 65 76 61 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b  evalFunc, 0, 0);
8bb0: 0a 20 20 67 2e 69 54 69 6d 65 6f 75 74 20 3d 20  .  g.iTimeout = 
8bc0: 44 45 46 41 55 4c 54 5f 54 49 4d 45 4f 55 54 3b  DEFAULT_TIMEOUT;
8bd0: 0a 20 20 69 66 28 20 67 2e 62 53 71 6c 54 72 61  .  if( g.bSqlTra
8be0: 63 65 20 29 20 73 71 6c 69 74 65 33 5f 74 72 61  ce ) sqlite3_tra
8bf0: 63 65 28 67 2e 64 62 2c 20 73 71 6c 54 72 61 63  ce(g.db, sqlTrac
8c00: 65 43 61 6c 6c 62 61 63 6b 2c 20 30 29 3b 0a 20  eCallback, 0);. 
8c10: 20 69 66 28 20 69 43 6c 69 65 6e 74 3e 30 20 29   if( iClient>0 )
8c20: 7b 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 29 20  {.    if( n>0 ) 
8c30: 75 6e 72 65 63 6f 67 6e 69 7a 65 64 41 72 67 75  unrecognizedArgu
8c40: 6d 65 6e 74 73 28 61 72 67 76 5b 30 5d 2c 20 6e  ments(argv[0], n
8c50: 2c 20 61 72 67 76 2b 32 29 3b 0a 20 20 20 20 69  , argv+2);.    i
8c60: 66 28 20 67 2e 69 54 72 61 63 65 20 29 20 6c 6f  f( g.iTrace ) lo
8c70: 67 4d 65 73 73 61 67 65 28 22 73 74 61 72 74 2d  gMessage("start-
8c80: 63 6c 69 65 6e 74 22 29 3b 0a 20 20 20 20 77 68  client");.    wh
8c90: 69 6c 65 28 31 29 7b 0a 20 20 20 20 20 20 63 68  ile(1){.      ch
8ca0: 61 72 20 2a 7a 54 61 73 6b 4e 61 6d 65 20 3d 20  ar *zTaskName = 
8cb0: 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 74  0;.      rc = st
8cc0: 61 72 74 53 63 72 69 70 74 28 69 43 6c 69 65 6e  artScript(iClien
8cd0: 74 2c 20 26 7a 53 63 72 69 70 74 2c 20 26 74 61  t, &zScript, &ta
8ce0: 73 6b 49 64 2c 20 26 7a 54 61 73 6b 4e 61 6d 65  skId, &zTaskName
8cf0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
8d00: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 62  =SQLITE_DONE ) b
8d10: 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
8d20: 67 2e 69 54 72 61 63 65 20 29 20 6c 6f 67 4d 65  g.iTrace ) logMe
8d30: 73 73 61 67 65 28 22 62 65 67 69 6e 20 25 73 20  ssage("begin %s 
8d40: 28 25 64 29 22 2c 20 7a 54 61 73 6b 4e 61 6d 65  (%d)", zTaskName
8d50: 2c 20 74 61 73 6b 49 64 29 3b 0a 20 20 20 20 20  , taskId);.     
8d60: 20 72 75 6e 53 63 72 69 70 74 28 69 43 6c 69 65   runScript(iClie
8d70: 6e 74 2c 20 74 61 73 6b 49 64 2c 20 7a 53 63 72  nt, taskId, zScr
8d80: 69 70 74 2c 20 7a 54 61 73 6b 4e 61 6d 65 29 3b  ipt, zTaskName);
8d90: 0a 20 20 20 20 20 20 69 66 28 20 67 2e 69 54 72  .      if( g.iTr
8da0: 61 63 65 20 29 20 6c 6f 67 4d 65 73 73 61 67 65  ace ) logMessage
8db0: 28 22 65 6e 64 20 25 73 20 28 25 64 29 22 2c 20  ("end %s (%d)", 
8dc0: 7a 54 61 73 6b 4e 61 6d 65 2c 20 74 61 73 6b 49  zTaskName, taskI
8dd0: 64 29 3b 0a 20 20 20 20 20 20 66 69 6e 69 73 68  d);.      finish
8de0: 53 63 72 69 70 74 28 69 43 6c 69 65 6e 74 2c 20  Script(iClient, 
8df0: 74 61 73 6b 49 64 2c 20 30 29 3b 0a 20 20 20 20  taskId, 0);.    
8e00: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
8e10: 54 61 73 6b 4e 61 6d 65 29 3b 0a 20 20 20 20 20  TaskName);.     
8e20: 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 31   sqlite3_sleep(1
8e30: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
8e40: 28 20 67 2e 69 54 72 61 63 65 20 29 20 6c 6f 67  ( g.iTrace ) log
8e50: 4d 65 73 73 61 67 65 28 22 65 6e 64 2d 63 6c 69  Message("end-cli
8e60: 65 6e 74 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ent");.  }else{.
8e70: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
8e80: 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74   *pStmt;.    int
8e90: 20 69 54 69 6d 65 6f 75 74 3b 0a 20 20 20 20 69   iTimeout;.    i
8ea0: 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( n==0 ){.     
8eb0: 20 66 61 74 61 6c 45 72 72 6f 72 28 22 6d 69 73   fatalError("mis
8ec0: 73 69 6e 67 20 73 63 72 69 70 74 20 66 69 6c 65  sing script file
8ed0: 6e 61 6d 65 22 29 3b 0a 20 20 20 20 7d 0a 20 20  name");.    }.  
8ee0: 20 20 69 66 28 20 6e 3e 31 20 29 20 75 6e 72 65    if( n>1 ) unre
8ef0: 63 6f 67 6e 69 7a 65 64 41 72 67 75 6d 65 6e 74  cognizedArgument
8f00: 73 28 61 72 67 76 5b 30 5d 2c 20 6e 2c 20 61 72  s(argv[0], n, ar
8f10: 67 76 2b 32 29 3b 0a 20 20 20 20 72 75 6e 53 71  gv+2);.    runSq
8f20: 6c 28 0a 20 20 20 20 20 20 22 44 52 4f 50 20 54  l(.      "DROP T
8f30: 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 74  ABLE IF EXISTS t
8f40: 61 73 6b 3b 5c 6e 22 0a 20 20 20 20 20 20 22 44  ask;\n".      "D
8f50: 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49  ROP TABLE IF EXI
8f60: 53 54 53 20 63 6f 75 6e 74 65 72 73 3b 5c 6e 22  STS counters;\n"
8f70: 0a 20 20 20 20 20 20 22 44 52 4f 50 20 54 41 42  .      "DROP TAB
8f80: 4c 45 20 49 46 20 45 58 49 53 54 53 20 63 6c 69  LE IF EXISTS cli
8f90: 65 6e 74 3b 5c 6e 22 0a 20 20 20 20 20 20 22 43  ent;\n".      "C
8fa0: 52 45 41 54 45 20 54 41 42 4c 45 20 74 61 73 6b  REATE TABLE task
8fb0: 28 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 69 64  (\n".      "  id
8fc0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
8fd0: 20 4b 45 59 2c 5c 6e 22 0a 20 20 20 20 20 20 22   KEY,\n".      "
8fe0: 20 20 6e 61 6d 65 20 54 45 58 54 2c 5c 6e 22 0a    name TEXT,\n".
8ff0: 20 20 20 20 20 20 22 20 20 63 6c 69 65 6e 74 20        "  client 
9000: 49 4e 54 45 47 45 52 2c 5c 6e 22 0a 20 20 20 20  INTEGER,\n".    
9010: 20 20 22 20 20 73 74 61 72 74 74 69 6d 65 20 44    "  starttime D
9020: 41 54 45 2c 5c 6e 22 0a 20 20 20 20 20 20 22 20  ATE,\n".      " 
9030: 20 65 6e 64 74 69 6d 65 20 44 41 54 45 2c 5c 6e   endtime DATE,\n
9040: 22 0a 20 20 20 20 20 20 22 20 20 73 63 72 69 70  ".      "  scrip
9050: 74 20 54 45 58 54 5c 6e 22 0a 20 20 20 20 20 20  t TEXT\n".      
9060: 22 29 3b 22 0a 20 20 20 20 20 20 22 43 52 45 41  ");".      "CREA
9070: 54 45 20 49 4e 44 45 58 20 74 61 73 6b 5f 69 31  TE INDEX task_i1
9080: 20 4f 4e 20 74 61 73 6b 28 63 6c 69 65 6e 74 2c   ON task(client,
9090: 20 73 74 61 72 74 74 69 6d 65 29 3b 5c 6e 22 0a   starttime);\n".
90a0: 20 20 20 20 20 20 22 43 52 45 41 54 45 20 49 4e        "CREATE IN
90b0: 44 45 58 20 74 61 73 6b 5f 69 32 20 4f 4e 20 74  DEX task_i2 ON t
90c0: 61 73 6b 28 63 6c 69 65 6e 74 2c 20 65 6e 64 74  ask(client, endt
90d0: 69 6d 65 29 3b 5c 6e 22 0a 20 20 20 20 20 20 22  ime);\n".      "
90e0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 63 6f 75  CREATE TABLE cou
90f0: 6e 74 65 72 73 28 6e 45 72 72 6f 72 2c 6e 54 65  nters(nError,nTe
9100: 73 74 29 3b 5c 6e 22 0a 20 20 20 20 20 20 22 49  st);\n".      "I
9110: 4e 53 45 52 54 20 49 4e 54 4f 20 63 6f 75 6e 74  NSERT INTO count
9120: 65 72 73 20 56 41 4c 55 45 53 28 30 2c 30 29 3b  ers VALUES(0,0);
9130: 5c 6e 22 0a 20 20 20 20 20 20 22 43 52 45 41 54  \n".      "CREAT
9140: 45 20 54 41 42 4c 45 20 63 6c 69 65 6e 74 28 69  E TABLE client(i
9150: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  d INTEGER PRIMAR
9160: 59 20 4b 45 59 2c 20 77 61 6e 74 48 61 6c 74 29  Y KEY, wantHalt)
9170: 3b 5c 6e 22 0a 20 20 20 20 29 3b 0a 20 20 20 20  ;\n".    );.    
9180: 7a 53 63 72 69 70 74 20 3d 20 72 65 61 64 46 69  zScript = readFi
9190: 6c 65 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20  le(argv[2]);.   
91a0: 20 66 6f 72 28 69 52 65 70 3d 31 3b 20 69 52 65   for(iRep=1; iRe
91b0: 70 3c 3d 6e 52 65 70 3b 20 69 52 65 70 2b 2b 29  p<=nRep; iRep++)
91c0: 7b 0a 20 20 20 20 20 20 69 66 28 20 67 2e 69 54  {.      if( g.iT
91d0: 72 61 63 65 20 29 20 6c 6f 67 4d 65 73 73 61 67  race ) logMessag
91e0: 65 28 22 62 65 67 69 6e 20 73 63 72 69 70 74 20  e("begin script 
91f0: 5b 25 73 5d 20 63 79 63 6c 65 20 25 64 5c 6e 22  [%s] cycle %d\n"
9200: 2c 20 61 72 67 76 5b 32 5d 2c 20 69 52 65 70 29  , argv[2], iRep)
9210: 3b 0a 20 20 20 20 20 20 72 75 6e 53 63 72 69 70  ;.      runScrip
9220: 74 28 30 2c 20 30 2c 20 7a 53 63 72 69 70 74 2c  t(0, 0, zScript,
9230: 20 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 20   argv[2]);.     
9240: 20 69 66 28 20 67 2e 69 54 72 61 63 65 20 29 20   if( g.iTrace ) 
9250: 6c 6f 67 4d 65 73 73 61 67 65 28 22 65 6e 64 20  logMessage("end 
9260: 73 63 72 69 70 74 20 5b 25 73 5d 20 63 79 63 6c  script [%s] cycl
9270: 65 20 25 64 5c 6e 22 2c 20 61 72 67 76 5b 32 5d  e %d\n", argv[2]
9280: 2c 20 69 52 65 70 29 3b 0a 20 20 20 20 7d 0a 20  , iRep);.    }. 
9290: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
92a0: 7a 53 63 72 69 70 74 29 3b 0a 20 20 20 20 77 61  zScript);.    wa
92b0: 69 74 46 6f 72 43 6c 69 65 6e 74 28 30 2c 20 32  itForClient(0, 2
92c0: 30 30 30 2c 20 22 64 75 72 69 6e 67 20 73 68 75  000, "during shu
92d0: 74 64 6f 77 6e 2e 2e 2e 5c 6e 22 29 3b 0a 20 20  tdown...\n");.  
92e0: 20 20 74 72 79 53 71 6c 28 22 55 50 44 41 54 45    trySql("UPDATE
92f0: 20 63 6c 69 65 6e 74 20 53 45 54 20 77 61 6e 74   client SET want
9300: 48 61 6c 74 3d 31 22 29 3b 0a 20 20 20 20 73 71  Halt=1");.    sq
9310: 6c 69 74 65 33 5f 73 6c 65 65 70 28 31 30 29 3b  lite3_sleep(10);
9320: 0a 20 20 20 20 67 2e 69 54 69 6d 65 6f 75 74 20  .    g.iTimeout 
9330: 3d 20 30 3b 0a 20 20 20 20 69 54 69 6d 65 6f 75  = 0;.    iTimeou
9340: 74 20 3d 20 31 30 30 30 3b 0a 20 20 20 20 77 68  t = 1000;.    wh
9350: 69 6c 65 28 20 28 28 72 63 20 3d 20 74 72 79 53  ile( ((rc = tryS
9360: 71 6c 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f  ql("SELECT 1 FRO
9370: 4d 20 63 6c 69 65 6e 74 22 29 29 3d 3d 53 51 4c  M client"))==SQL
9380: 49 54 45 5f 42 55 53 59 0a 20 20 20 20 20 20 20  ITE_BUSY.       
9390: 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52   || rc==SQLITE_R
93a0: 4f 57 29 20 26 26 20 69 54 69 6d 65 6f 75 74 3e  OW) && iTimeout>
93b0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
93c0: 65 33 5f 73 6c 65 65 70 28 31 30 29 3b 0a 20 20  e3_sleep(10);.  
93d0: 20 20 20 20 69 54 69 6d 65 6f 75 74 20 2d 3d 20      iTimeout -= 
93e0: 31 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  10;.    }.    sq
93f0: 6c 69 74 65 33 5f 73 6c 65 65 70 28 31 30 30 29  lite3_sleep(100)
9400: 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 70 72  ;.    pStmt = pr
9410: 65 70 61 72 65 53 71 6c 28 22 53 45 4c 45 43 54  epareSql("SELECT
9420: 20 6e 45 72 72 6f 72 2c 20 6e 54 65 73 74 20 46   nError, nTest F
9430: 52 4f 4d 20 63 6f 75 6e 74 65 72 73 22 29 3b 0a  ROM counters");.
9440: 20 20 20 20 69 54 69 6d 65 6f 75 74 20 3d 20 31      iTimeout = 1
9450: 30 30 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  000;.    while( 
9460: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  (rc = sqlite3_st
9470: 65 70 28 70 53 74 6d 74 29 29 3d 3d 53 51 4c 49  ep(pStmt))==SQLI
9480: 54 45 5f 42 55 53 59 20 26 26 20 69 54 69 6d 65  TE_BUSY && iTime
9490: 6f 75 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  out>0 ){.      s
94a0: 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 31 30 29  qlite3_sleep(10)
94b0: 3b 0a 20 20 20 20 20 20 69 54 69 6d 65 6f 75 74  ;.      iTimeout
94c0: 20 2d 3d 20 31 30 3b 0a 20 20 20 20 7d 0a 20 20   -= 10;.    }.  
94d0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
94e0: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 67 2e  _ROW ){.      g.
94f0: 6e 45 72 72 6f 72 20 2b 3d 20 73 71 6c 69 74 65  nError += sqlite
9500: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
9510: 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 67 2e  mt, 0);.      g.
9520: 6e 54 65 73 74 20 2b 3d 20 73 71 6c 69 74 65 33  nTest += sqlite3
9530: 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
9540: 74 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  t, 1);.    }.   
9550: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
9560: 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20  e(pStmt);.  }.  
9570: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 67 2e  sqlite3_close(g.
9580: 64 62 29 3b 0a 20 20 6d 61 79 62 65 43 6c 6f 73  db);.  maybeClos
9590: 65 28 67 2e 70 4c 6f 67 29 3b 0a 20 20 6d 61 79  e(g.pLog);.  may
95a0: 62 65 43 6c 6f 73 65 28 67 2e 70 45 72 72 4c 6f  beClose(g.pErrLo
95b0: 67 29 3b 0a 20 20 69 66 28 20 69 43 6c 69 65 6e  g);.  if( iClien
95c0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 72 69 6e  t==0 ){.    prin
95d0: 74 66 28 22 53 75 6d 6d 61 72 79 3a 20 25 64 20  tf("Summary: %d 
95e0: 65 72 72 6f 72 73 20 6f 75 74 20 6f 66 20 25 64  errors out of %d
95f0: 20 74 65 73 74 73 5c 6e 22 2c 20 67 2e 6e 45 72   tests\n", g.nEr
9600: 72 6f 72 2c 20 67 2e 6e 54 65 73 74 29 3b 0a 20  ror, g.nTest);. 
9610: 20 20 20 70 72 69 6e 74 66 28 22 45 4e 44 3a 20     printf("END: 
9620: 25 73 22 2c 20 61 72 67 76 5b 30 5d 29 3b 0a 20  %s", argv[0]);. 
9630: 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 61 72     for(i=1; i<ar
9640: 67 63 3b 20 69 2b 2b 29 20 70 72 69 6e 74 66 28  gc; i++) printf(
9650: 22 20 25 73 22 2c 20 61 72 67 76 5b 69 5d 29 3b  " %s", argv[i]);
9660: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 5c 6e 22  .    printf("\n"
9670: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
9680: 67 2e 6e 45 72 72 6f 72 3e 30 3b 0a 7d 0a        g.nError>0;.}.