/ Hex Artifact Content
Login

Artifact 7dcc7afacc87be958c181f36a8494ef145ebd131:


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: 4d 41 58 5f 53 43 48 45 4d 41 5f 52 45 54 52 59  MAX_SCHEMA_RETRY
02f0: 3d 31 30 30 0a 2a 2a 20 20 20 20 2d 44 53 51 4c  =100.**    -DSQL
0300: 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 20  ITE_NO_SYNC.**  
0310: 20 20 2d 44 53 51 4c 49 54 45 5f 54 48 52 45 41    -DSQLITE_THREA
0320: 44 53 41 46 45 3d 30 0a 2a 2a 20 20 20 20 2d 44  DSAFE=0.**    -D
0330: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
0340: 5f 45 58 54 45 4e 53 49 4f 4e 0a 2a 2a 0a 2a 2a  _EXTENSION.**.**
0350: 20 52 75 6e 20 6c 69 6b 65 20 74 68 69 73 3a 0a   Run like this:.
0360: 2a 2a 0a 2a 2a 20 20 20 20 20 2e 2f 6d 70 74 65  **.**     ./mpte
0370: 73 74 20 24 64 61 74 61 62 61 73 65 20 24 73 63  st $database $sc
0380: 72 69 70 74 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65  ript.**.** where
0390: 20 24 64 61 74 61 62 61 73 65 20 69 73 20 74 68   $database is th
03a0: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 75 73  e database to us
03b0: 65 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  e for testing an
03c0: 64 20 24 73 63 72 69 70 74 20 69 73 20 61 0a 2a  d $script is a.*
03d0: 2a 20 74 65 73 74 20 73 63 72 69 70 74 2e 0a 2a  * test script..*
03e0: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
03f0: 74 65 33 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  te3.h".#include 
0400: 3c 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75  <stdio.h>.#inclu
0410: 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69  de <unistd.h>.#i
0420: 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68  nclude <stdlib.h
0430: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69  >.#include <stri
0440: 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ng.h>.#include <
0450: 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75  assert.h>.#inclu
0460: 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 0a 2f 2a  de <ctype.h>../*
0470: 20 47 6c 6f 62 61 6c 20 64 61 74 61 0a 2a 2f 0a   Global data.*/.
0480: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 47 6c  static struct Gl
0490: 6f 62 61 6c 20 7b 0a 20 20 63 68 61 72 20 2a 61  obal {.  char *a
04a0: 72 67 76 30 3b 20 20 20 20 20 20 20 20 20 20 20  rgv0;           
04b0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 65  /* Name of the e
04c0: 78 65 63 75 74 61 62 6c 65 20 2a 2f 0a 20 20 63  xecutable */.  c
04d0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 3b  onst char *zVfs;
04e0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
04f0: 20 56 46 53 20 74 6f 20 75 73 65 2e 20 4f 66 74   VFS to use. Oft
0500: 65 6e 20 4e 55 4c 4c 20 6d 65 61 6e 69 6e 67 20  en NULL meaning 
0510: 22 64 65 66 61 75 6c 74 22 20 2a 2f 0a 20 20 63  "default" */.  c
0520: 68 61 72 20 2a 7a 44 62 46 69 6c 65 3b 20 20 20  har *zDbFile;   
0530: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
0540: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
0550: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
0560: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65            /* Ope
0570: 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  n connection to 
0580: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68  database */.  ch
0590: 61 72 20 2a 7a 45 72 72 4c 6f 67 3b 20 20 20 20  ar *zErrLog;    
05a0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65       /* Filename
05b0: 20 66 6f 72 20 65 72 72 6f 72 20 6c 6f 67 20 2a   for error log *
05c0: 2f 0a 20 20 46 49 4c 45 20 2a 70 45 72 72 4c 6f  /.  FILE *pErrLo
05d0: 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  g;         /* Wh
05e0: 65 72 65 20 74 6f 20 77 72 69 74 65 20 65 72 72  ere to write err
05f0: 6f 72 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ors */.  char *z
0600: 4c 6f 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  Log;            
0610: 2f 2a 20 4e 61 6d 65 20 6f 66 20 6f 75 74 70 75  /* Name of outpu
0620: 74 20 6c 6f 67 20 66 69 6c 65 20 2a 2f 0a 20 20  t log file */.  
0630: 46 49 4c 45 20 2a 70 4c 6f 67 3b 20 20 20 20 20  FILE *pLog;     
0640: 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
0650: 74 6f 20 77 72 69 74 65 20 6c 6f 67 20 6d 65 73  to write log mes
0660: 73 61 67 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  sages */.  char 
0670: 7a 4e 61 6d 65 5b 31 32 5d 3b 20 20 20 20 20 20  zName[12];      
0680: 20 20 2f 2a 20 53 79 6d 62 6f 6c 69 63 20 6e 61    /* Symbolic na
0690: 6d 65 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65  me of this proce
06a0: 73 73 20 2a 2f 0a 20 20 69 6e 74 20 74 61 73 6b  ss */.  int task
06b0: 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  Id;            /
06c0: 2a 20 54 61 73 6b 20 49 44 2e 20 20 30 20 6d 65  * Task ID.  0 me
06d0: 61 6e 73 20 73 75 70 65 72 76 69 73 6f 72 2e 20  ans supervisor. 
06e0: 2a 2f 0a 20 20 69 6e 74 20 69 54 72 61 63 65 3b  */.  int iTrace;
06f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
0700: 72 61 63 69 6e 67 20 6c 65 76 65 6c 20 2a 2f 0a  racing level */.
0710: 20 20 69 6e 74 20 62 53 71 6c 54 72 61 63 65 3b    int bSqlTrace;
0720: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
0730: 20 74 6f 20 74 72 61 63 65 20 53 51 4c 20 63 6f   to trace SQL co
0740: 6d 6d 61 6e 64 73 20 2a 2f 0a 20 20 69 6e 74 20  mmands */.  int 
0750: 6e 45 72 72 6f 72 3b 20 20 20 20 20 20 20 20 20  nError;         
0760: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
0770: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
0780: 6e 54 65 73 74 3b 20 20 20 20 20 20 20 20 20 20  nTest;          
0790: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
07a0: 2d 2d 6d 61 74 63 68 20 6f 70 65 72 61 74 6f 72  --match operator
07b0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 54 69 6d 65  s */.  int iTime
07c0: 6f 75 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  out;          /*
07d0: 20 4d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 75 6e   Milliseconds un
07e0: 74 69 6c 20 61 20 62 75 73 79 20 74 69 6d 65 6f  til a busy timeo
07f0: 75 74 20 2a 2f 0a 7d 20 67 3b 0a 0a 2f 2a 20 44  ut */.} g;../* D
0800: 65 66 61 75 6c 74 20 74 69 6d 65 6f 75 74 20 2a  efault timeout *
0810: 2f 0a 23 64 65 66 69 6e 65 20 44 45 46 41 55 4c  /.#define DEFAUL
0820: 54 5f 54 49 4d 45 4f 55 54 20 31 30 30 30 30 0a  T_TIMEOUT 10000.
0830: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6d  ./*.** Print a m
0840: 65 73 73 61 67 65 20 61 64 64 69 6e 67 20 7a 50  essage adding zP
0850: 72 65 66 69 78 5b 5d 20 74 6f 20 74 68 65 20 62  refix[] to the b
0860: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72  eginning of ever
0870: 79 20 6c 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69  y line..*/.stati
0880: 63 20 76 6f 69 64 20 70 72 69 6e 74 57 69 74 68  c void printWith
0890: 50 72 65 66 69 78 28 46 49 4c 45 20 2a 70 4f 75  Prefix(FILE *pOu
08a0: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
08b0: 50 72 65 66 69 78 2c 20 63 6f 6e 73 74 20 63 68  Prefix, const ch
08c0: 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 77 68 69  ar *zMsg){.  whi
08d0: 6c 65 28 20 7a 4d 73 67 20 26 26 20 7a 4d 73 67  le( zMsg && zMsg
08e0: 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  [0] ){.    int i
08f0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a  ;.    for(i=0; z
0900: 4d 73 67 5b 69 5d 20 26 26 20 7a 4d 73 67 5b 69  Msg[i] && zMsg[i
0910: 5d 21 3d 27 5c 6e 27 20 26 26 20 7a 4d 73 67 5b  ]!='\n' && zMsg[
0920: 69 5d 21 3d 27 5c 72 27 3b 20 69 2b 2b 29 7b 7d  i]!='\r'; i++){}
0930: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70 4f 75  .    fprintf(pOu
0940: 74 2c 20 22 25 73 25 2e 2a 73 5c 6e 22 2c 20 7a  t, "%s%.*s\n", z
0950: 50 72 65 66 69 78 2c 20 69 2c 20 7a 4d 73 67 29  Prefix, i, zMsg)
0960: 3b 0a 20 20 20 20 7a 4d 73 67 20 2b 3d 20 69 3b  ;.    zMsg += i;
0970: 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4d 73 67  .    while( zMsg
0980: 5b 30 5d 3d 3d 27 5c 6e 27 20 7c 7c 20 7a 4d 73  [0]=='\n' || zMs
0990: 67 5b 30 5d 3d 3d 27 5c 72 27 20 29 20 7a 4d 73  g[0]=='\r' ) zMs
09a0: 67 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  g++;.  }.}../*.*
09b0: 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 70 6f  * Compare two po
09c0: 69 6e 74 65 72 73 20 74 6f 20 73 74 72 69 6e 67  inters to string
09d0: 73 2c 20 77 68 65 72 65 20 74 68 65 20 70 6f 69  s, where the poi
09e0: 6e 74 65 72 73 20 6d 69 67 68 74 20 62 65 20 4e  nters might be N
09f0: 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ULL..*/.static i
0a00: 6e 74 20 73 61 66 65 5f 73 74 72 63 6d 70 28 63  nt safe_strcmp(c
0a10: 6f 6e 73 74 20 63 68 61 72 20 2a 61 2c 20 63 6f  onst char *a, co
0a20: 6e 73 74 20 63 68 61 72 20 2a 62 29 7b 0a 20 20  nst char *b){.  
0a30: 69 66 28 20 61 3d 3d 62 20 29 20 72 65 74 75 72  if( a==b ) retur
0a40: 6e 20 30 3b 0a 20 20 69 66 28 20 61 3d 3d 30 20  n 0;.  if( a==0 
0a50: 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 69  ) return -1;.  i
0a60: 66 28 20 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( b==0 ) return
0a70: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 73 74 72   1;.  return str
0a80: 63 6d 70 28 61 2c 62 29 3b 0a 7d 0a 0a 2f 2a 0a  cmp(a,b);.}../*.
0a90: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
0aa0: 66 20 73 74 72 69 6e 67 20 7a 5b 5d 20 6d 61 74  f string z[] mat
0ab0: 63 68 65 73 20 67 6c 6f 62 20 70 61 74 74 65 72  ches glob patter
0ac0: 6e 20 7a 47 6c 6f 62 5b 5d 2e 0a 2a 2a 20 52 65  n zGlob[]..** Re
0ad0: 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68  turn FALSE if th
0ae0: 65 20 70 61 74 74 65 72 6e 20 64 6f 65 73 20 6e  e pattern does n
0af0: 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 0a 2a 2a 20  ot match..**.** 
0b00: 47 6c 6f 62 62 69 6e 67 20 72 75 6c 65 73 3a 0a  Globbing rules:.
0b10: 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 2a 27 20 20  **.**      '*'  
0b20: 20 20 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79       Matches any
0b30: 20 73 65 71 75 65 6e 63 65 20 6f 66 20 7a 65 72   sequence of zer
0b40: 6f 20 6f 72 20 6d 6f 72 65 20 63 68 61 72 61 63  o or more charac
0b50: 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ters..**.**     
0b60: 20 27 3f 27 20 20 20 20 20 20 20 4d 61 74 63 68   '?'       Match
0b70: 65 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63  es exactly one c
0b80: 68 61 72 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  haracter..**.** 
0b90: 20 20 20 20 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d      [...]      M
0ba0: 61 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61  atches one chara
0bb0: 63 74 65 72 20 66 72 6f 6d 20 74 68 65 20 65 6e  cter from the en
0bc0: 63 6c 6f 73 65 64 20 6c 69 73 74 20 6f 66 0a 2a  closed list of.*
0bd0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0be0: 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a   characters..**.
0bf0: 2a 2a 20 20 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20  **     [^...]   
0c00: 20 20 4d 61 74 63 68 65 73 20 6f 6e 65 20 63 68    Matches one ch
0c10: 61 72 61 63 74 65 72 20 6e 6f 74 20 69 6e 20 74  aracter not in t
0c20: 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74  he enclosed list
0c30: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 23 27  ..**.**      '#'
0c40: 20 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 61         Matches a
0c50: 6e 79 20 73 65 71 75 65 6e 63 65 20 6f 66 20 6f  ny sequence of o
0c60: 6e 65 20 6f 72 20 6d 6f 72 65 20 64 69 67 69 74  ne or more digit
0c70: 73 20 77 69 74 68 20 61 6e 0a 2a 2a 20 20 20 20  s with an.**    
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 74 69              opti
0c90: 6f 6e 61 6c 20 2b 20 6f 72 20 2d 20 73 69 67 6e  onal + or - sign
0ca0: 20 69 6e 20 66 72 6f 6e 74 0a 2a 2f 0a 69 6e 74   in front.*/.int
0cb0: 20 73 74 72 67 6c 6f 62 28 63 6f 6e 73 74 20 63   strglob(const c
0cc0: 68 61 72 20 2a 7a 47 6c 6f 62 2c 20 63 6f 6e 73  har *zGlob, cons
0cd0: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t char *z){.  in
0ce0: 74 20 63 2c 20 63 32 3b 0a 20 20 69 6e 74 20 69  t c, c2;.  int i
0cf0: 6e 76 65 72 74 3b 0a 20 20 69 6e 74 20 73 65 65  nvert;.  int see
0d00: 6e 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 63 20  n;..  while( (c 
0d10: 3d 20 28 2a 28 7a 47 6c 6f 62 2b 2b 29 29 29 21  = (*(zGlob++)))!
0d20: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 63 3d  =0 ){.    if( c=
0d30: 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20 20 77 68  ='*' ){.      wh
0d40: 69 6c 65 28 20 28 63 3d 28 2a 28 7a 47 6c 6f 62  ile( (c=(*(zGlob
0d50: 2b 2b 29 29 29 20 3d 3d 20 27 2a 27 20 7c 7c 20  ++))) == '*' || 
0d60: 63 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20 20  c=='?' ){.      
0d70: 20 20 69 66 28 20 63 3d 3d 27 3f 27 20 26 26 20    if( c=='?' && 
0d80: 28 2a 28 7a 2b 2b 29 29 3d 3d 30 20 29 20 72 65  (*(z++))==0 ) re
0d90: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
0da0: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
0db0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
0dc0: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
0dd0: 69 66 28 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20  if( c=='[' ){.  
0de0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20        while( *z 
0df0: 26 26 20 73 74 72 67 6c 6f 62 28 7a 47 6c 6f 62  && strglob(zGlob
0e00: 2d 31 2c 7a 29 20 29 7b 0a 20 20 20 20 20 20 20  -1,z) ){.       
0e10: 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20     z++;.        
0e20: 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  }.        return
0e30: 20 28 2a 7a 29 21 3d 30 3b 0a 20 20 20 20 20 20   (*z)!=0;.      
0e40: 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28  }.      while( (
0e50: 63 32 20 3d 20 28 2a 28 7a 2b 2b 29 29 29 21 3d  c2 = (*(z++)))!=
0e60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69  0 ){.        whi
0e70: 6c 65 28 20 63 32 21 3d 63 20 29 7b 0a 20 20 20  le( c2!=c ){.   
0e80: 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 2b         c2 = *(z+
0e90: 2b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +);.          if
0ea0: 28 20 63 32 3d 3d 30 20 29 20 72 65 74 75 72 6e  ( c2==0 ) return
0eb0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
0ec0: 20 20 20 20 20 20 69 66 28 20 73 74 72 67 6c 6f        if( strglo
0ed0: 62 28 7a 47 6c 6f 62 2c 7a 29 20 29 20 72 65 74  b(zGlob,z) ) ret
0ee0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
0ef0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
0f00: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
0f10: 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28  '?' ){.      if(
0f20: 20 28 2a 28 7a 2b 2b 29 29 3d 3d 30 20 29 20 72   (*(z++))==0 ) r
0f30: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c  eturn 0;.    }el
0f40: 73 65 20 69 66 28 20 63 3d 3d 27 5b 27 20 29 7b  se if( c=='[' ){
0f50: 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69 6f 72  .      int prior
0f60: 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 65  _c = 0;.      se
0f70: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  en = 0;.      in
0f80: 76 65 72 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  vert = 0;.      
0f90: 63 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20  c = *(z++);.    
0fa0: 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65 74    if( c==0 ) ret
0fb0: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 63 32 20  urn 0;.      c2 
0fc0: 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20  = *(zGlob++);.  
0fd0: 20 20 20 20 69 66 28 20 63 32 3d 3d 27 5e 27 20      if( c2=='^' 
0fe0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76 65 72  ){.        inver
0ff0: 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63  t = 1;.        c
1000: 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a  2 = *(zGlob++);.
1010: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1020: 28 20 63 32 3d 3d 27 5d 27 20 29 7b 0a 20 20 20  ( c2==']' ){.   
1030: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5d 27 20       if( c==']' 
1040: 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20  ) seen = 1;.    
1050: 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62      c2 = *(zGlob
1060: 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ++);.      }.   
1070: 20 20 20 77 68 69 6c 65 28 20 63 32 20 26 26 20     while( c2 && 
1080: 63 32 21 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20  c2!=']' ){.     
1090: 20 20 20 69 66 28 20 63 32 3d 3d 27 2d 27 20 26     if( c2=='-' &
10a0: 26 20 7a 47 6c 6f 62 5b 30 5d 21 3d 27 5d 27 20  & zGlob[0]!=']' 
10b0: 26 26 20 7a 47 6c 6f 62 5b 30 5d 21 3d 30 20 26  && zGlob[0]!=0 &
10c0: 26 20 70 72 69 6f 72 5f 63 3e 30 20 29 7b 0a 20  & prior_c>0 ){. 
10d0: 20 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28           c2 = *(
10e0: 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20  zGlob++);.      
10f0: 20 20 20 20 69 66 28 20 63 3e 3d 70 72 69 6f 72      if( c>=prior
1100: 5f 63 20 26 26 20 63 3c 3d 63 32 20 29 20 73 65  _c && c<=c2 ) se
1110: 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
1120: 20 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20    prior_c = 0;. 
1130: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1140: 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 63          if( c==c
1150: 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  2 ){.           
1160: 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20   seen = 1;.     
1170: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1180: 20 70 72 69 6f 72 5f 63 20 3d 20 63 32 3b 0a 20   prior_c = c2;. 
1190: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11a0: 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29   c2 = *(zGlob++)
11b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11c0: 69 66 28 20 63 32 3d 3d 30 20 7c 7c 20 28 73 65  if( c2==0 || (se
11d0: 65 6e 20 5e 20 69 6e 76 65 72 74 29 3d 3d 30 20  en ^ invert)==0 
11e0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
11f0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 23 27  }else if( c=='#'
1200: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 7a   ){.      if( (z
1210: 5b 30 5d 3d 3d 27 2d 27 20 7c 7c 20 7a 5b 30 5d  [0]=='-' || z[0]
1220: 3d 3d 27 2b 27 29 20 26 26 20 69 73 64 69 67 69  =='+') && isdigi
1230: 74 28 7a 5b 31 5d 29 20 29 20 7a 2b 2b 3b 0a 20  t(z[1]) ) z++;. 
1240: 20 20 20 20 20 69 66 28 20 21 69 73 64 69 67 69       if( !isdigi
1250: 74 28 7a 5b 30 5d 29 20 29 20 72 65 74 75 72 6e  t(z[0]) ) return
1260: 20 30 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20   0;.      z++;. 
1270: 20 20 20 20 20 77 68 69 6c 65 28 20 69 73 64 69       while( isdi
1280: 67 69 74 28 7a 5b 30 5d 29 20 29 7b 20 7a 2b 2b  git(z[0]) ){ z++
1290: 3b 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ; }.    }else{. 
12a0: 20 20 20 20 20 69 66 28 20 63 21 3d 28 2a 28 7a       if( c!=(*(z
12b0: 2b 2b 29 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ++)) ) return 0;
12c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
12d0: 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a 2f 2a  urn *z==0;.}../*
12e0: 0a 2a 2a 20 43 6c 6f 73 65 20 6f 75 74 70 75 74  .** Close output
12f0: 20 73 74 72 65 61 6d 20 70 4f 75 74 20 69 66 20   stream pOut if 
1300: 69 74 20 69 73 20 6e 6f 74 20 73 74 64 6f 75 74  it is not stdout
1310: 20 6f 72 20 73 74 64 65 72 72 0a 2a 2f 0a 73 74   or stderr.*/.st
1320: 61 74 69 63 20 76 6f 69 64 20 6d 61 79 62 65 43  atic void maybeC
1330: 6c 6f 73 65 28 46 49 4c 45 20 2a 70 4f 75 74 29  lose(FILE *pOut)
1340: 7b 0a 20 20 69 66 28 20 70 4f 75 74 21 3d 73 74  {.  if( pOut!=st
1350: 64 6f 75 74 20 26 26 20 70 4f 75 74 21 3d 73 74  dout && pOut!=st
1360: 64 65 72 72 20 29 20 66 63 6c 6f 73 65 28 70 4f  derr ) fclose(pO
1370: 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  ut);.}../*.** Pr
1380: 69 6e 74 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  int an error mes
1390: 73 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76  sage.*/.static v
13a0: 6f 69 64 20 65 72 72 6f 72 4d 65 73 73 61 67 65  oid errorMessage
13b0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f  (const char *zFo
13c0: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
13d0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72  _list ap;.  char
13e0: 20 2a 7a 4d 73 67 3b 0a 20 20 63 68 61 72 20 7a   *zMsg;.  char z
13f0: 50 72 65 66 69 78 5b 33 30 5d 3b 0a 20 20 76 61  Prefix[30];.  va
1400: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
1410: 61 74 29 3b 0a 20 20 7a 4d 73 67 20 3d 20 73 71  at);.  zMsg = sq
1420: 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a  lite3_vmprintf(z
1430: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
1440: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 73 71 6c  a_end(ap);.  sql
1450: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
1460: 7a 65 6f 66 28 7a 50 72 65 66 69 78 29 2c 20 7a  zeof(zPrefix), z
1470: 50 72 65 66 69 78 2c 20 22 25 73 3a 45 52 52 4f  Prefix, "%s:ERRO
1480: 52 3a 20 22 2c 20 67 2e 7a 4e 61 6d 65 29 3b 0a  R: ", g.zName);.
1490: 20 20 69 66 28 20 67 2e 70 4c 6f 67 20 29 7b 0a    if( g.pLog ){.
14a0: 20 20 20 20 70 72 69 6e 74 57 69 74 68 50 72 65      printWithPre
14b0: 66 69 78 28 67 2e 70 4c 6f 67 2c 20 7a 50 72 65  fix(g.pLog, zPre
14c0: 66 69 78 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  fix, zMsg);.    
14d0: 66 66 6c 75 73 68 28 67 2e 70 4c 6f 67 29 3b 0a  fflush(g.pLog);.
14e0: 20 20 7d 0a 20 20 69 66 28 20 67 2e 70 45 72 72    }.  if( g.pErr
14f0: 4c 6f 67 20 26 26 20 73 61 66 65 5f 73 74 72 63  Log && safe_strc
1500: 6d 70 28 67 2e 7a 45 72 72 4c 6f 67 2c 67 2e 7a  mp(g.zErrLog,g.z
1510: 4c 6f 67 29 20 29 7b 0a 20 20 20 20 70 72 69 6e  Log) ){.    prin
1520: 74 57 69 74 68 50 72 65 66 69 78 28 67 2e 70 45  tWithPrefix(g.pE
1530: 72 72 4c 6f 67 2c 20 7a 50 72 65 66 69 78 2c 20  rrLog, zPrefix, 
1540: 7a 4d 73 67 29 3b 0a 20 20 20 20 66 66 6c 75 73  zMsg);.    fflus
1550: 68 28 67 2e 70 45 72 72 4c 6f 67 29 3b 0a 20 20  h(g.pErrLog);.  
1560: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
1570: 28 7a 4d 73 67 29 3b 0a 20 20 67 2e 6e 45 72 72  (zMsg);.  g.nErr
1580: 6f 72 2b 2b 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  or++;.}../* Forw
1590: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
15a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 72  */.static int tr
15b0: 79 53 71 6c 28 63 6f 6e 73 74 20 63 68 61 72 2a  ySql(const char*
15c0: 2c 20 2e 2e 2e 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50  , ...);../*.** P
15d0: 72 69 6e 74 20 61 6e 20 65 72 72 6f 72 20 6d 65  rint an error me
15e0: 73 73 61 67 65 20 61 6e 64 20 74 68 65 6e 20 71  ssage and then q
15f0: 75 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  uit..*/.static v
1600: 6f 69 64 20 66 61 74 61 6c 45 72 72 6f 72 28 63  oid fatalError(c
1610: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
1620: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
1630: 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a  ist ap;.  char *
1640: 7a 4d 73 67 3b 0a 20 20 63 68 61 72 20 7a 50 72  zMsg;.  char zPr
1650: 65 66 69 78 5b 33 30 5d 3b 0a 20 20 76 61 5f 73  efix[30];.  va_s
1660: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
1670: 29 3b 0a 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69  );.  zMsg = sqli
1680: 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f  te3_vmprintf(zFo
1690: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
16a0: 65 6e 64 28 61 70 29 3b 0a 20 20 73 71 6c 69 74  end(ap);.  sqlit
16b0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
16c0: 6f 66 28 7a 50 72 65 66 69 78 29 2c 20 7a 50 72  of(zPrefix), zPr
16d0: 65 66 69 78 2c 20 22 25 73 3a 46 41 54 41 4c 3a  efix, "%s:FATAL:
16e0: 20 22 2c 20 67 2e 7a 4e 61 6d 65 29 3b 0a 20 20   ", g.zName);.  
16f0: 69 66 28 20 67 2e 70 4c 6f 67 20 29 7b 0a 20 20  if( g.pLog ){.  
1700: 20 20 70 72 69 6e 74 57 69 74 68 50 72 65 66 69    printWithPrefi
1710: 78 28 67 2e 70 4c 6f 67 2c 20 7a 50 72 65 66 69  x(g.pLog, zPrefi
1720: 78 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 66 66  x, zMsg);.    ff
1730: 6c 75 73 68 28 67 2e 70 4c 6f 67 29 3b 0a 20 20  lush(g.pLog);.  
1740: 20 20 6d 61 79 62 65 43 6c 6f 73 65 28 67 2e 70    maybeClose(g.p
1750: 4c 6f 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Log);.  }.  if( 
1760: 67 2e 70 45 72 72 4c 6f 67 20 26 26 20 73 61 66  g.pErrLog && saf
1770: 65 5f 73 74 72 63 6d 70 28 67 2e 7a 45 72 72 4c  e_strcmp(g.zErrL
1780: 6f 67 2c 67 2e 7a 4c 6f 67 29 20 29 7b 0a 20 20  og,g.zLog) ){.  
1790: 20 20 70 72 69 6e 74 57 69 74 68 50 72 65 66 69    printWithPrefi
17a0: 78 28 67 2e 70 45 72 72 4c 6f 67 2c 20 7a 50 72  x(g.pErrLog, zPr
17b0: 65 66 69 78 2c 20 7a 4d 73 67 29 3b 0a 20 20 20  efix, zMsg);.   
17c0: 20 66 66 6c 75 73 68 28 67 2e 70 45 72 72 4c 6f   fflush(g.pErrLo
17d0: 67 29 3b 0a 20 20 20 20 6d 61 79 62 65 43 6c 6f  g);.    maybeClo
17e0: 73 65 28 67 2e 70 45 72 72 4c 6f 67 29 3b 0a 20  se(g.pErrLog);. 
17f0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
1800: 65 28 7a 4d 73 67 29 3b 0a 20 20 69 66 28 20 67  e(zMsg);.  if( g
1810: 2e 64 62 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  .db ){.    int n
1820: 54 72 79 20 3d 20 30 3b 0a 20 20 20 20 67 2e 69  Try = 0;.    g.i
1830: 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 20 20 20  Timeout = 0;.   
1840: 20 77 68 69 6c 65 28 20 74 72 79 53 71 6c 28 22   while( trySql("
1850: 55 50 44 41 54 45 20 63 6c 69 65 6e 74 20 53 45  UPDATE client SE
1860: 54 20 77 61 6e 74 48 61 6c 74 3d 31 3b 22 29 3d  T wantHalt=1;")=
1870: 3d 53 51 4c 49 54 45 5f 42 55 53 59 0a 20 20 20  =SQLITE_BUSY.   
1880: 20 20 20 20 20 20 20 20 26 26 20 28 6e 54 72 79          && (nTry
1890: 2b 2b 29 3c 31 30 30 20 29 7b 0a 20 20 20 20 20  ++)<100 ){.     
18a0: 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 31   sqlite3_sleep(1
18b0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
18c0: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 67 2e  sqlite3_close(g.
18d0: 64 62 29 3b 0a 20 20 65 78 69 74 28 31 29 3b 20  db);.  exit(1); 
18e0: 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e   .}.../*.** Prin
18f0: 74 20 61 20 6c 6f 67 20 6d 65 73 73 61 67 65 0a  t a log message.
1900: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  */.static void l
1910: 6f 67 4d 65 73 73 61 67 65 28 63 6f 6e 73 74 20  ogMessage(const 
1920: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
1930: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
1940: 70 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b  p;.  char *zMsg;
1950: 0a 20 20 63 68 61 72 20 7a 50 72 65 66 69 78 5b  .  char zPrefix[
1960: 33 30 5d 3b 0a 20 20 76 61 5f 73 74 61 72 74 28  30];.  va_start(
1970: 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20  ap, zFormat);.  
1980: 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 76  zMsg = sqlite3_v
1990: 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c  mprintf(zFormat,
19a0: 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
19b0: 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  p);.  sqlite3_sn
19c0: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 50  printf(sizeof(zP
19d0: 72 65 66 69 78 29 2c 20 7a 50 72 65 66 69 78 2c  refix), zPrefix,
19e0: 20 22 25 73 3a 20 22 2c 20 67 2e 7a 4e 61 6d 65   "%s: ", g.zName
19f0: 29 3b 0a 20 20 69 66 28 20 67 2e 70 4c 6f 67 20  );.  if( g.pLog 
1a00: 29 7b 0a 20 20 20 20 70 72 69 6e 74 57 69 74 68  ){.    printWith
1a10: 50 72 65 66 69 78 28 67 2e 70 4c 6f 67 2c 20 7a  Prefix(g.pLog, z
1a20: 50 72 65 66 69 78 2c 20 7a 4d 73 67 29 3b 0a 20  Prefix, zMsg);. 
1a30: 20 20 20 66 66 6c 75 73 68 28 67 2e 70 4c 6f 67     fflush(g.pLog
1a40: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
1a50: 5f 66 72 65 65 28 7a 4d 73 67 29 3b 0a 7d 0a 0a  _free(zMsg);.}..
1a60: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1a70: 20 6c 65 6e 67 74 68 20 6f 66 20 61 20 73 74 72   length of a str
1a80: 69 6e 67 20 6f 6d 69 74 74 69 6e 67 20 74 72 61  ing omitting tra
1a90: 69 6c 69 6e 67 20 77 68 69 74 65 73 70 61 63 65  iling whitespace
1aa0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
1ab0: 6c 69 70 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20  lipLength(const 
1ac0: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
1ad0: 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
1ae0: 7a 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 30  z);.  while( n>0
1af0: 20 26 26 20 69 73 73 70 61 63 65 28 7a 5b 6e 2d   && isspace(z[n-
1b00: 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20  1]) ){ n--; }.  
1b10: 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
1b20: 2a 2a 20 42 75 73 79 20 68 61 6e 64 6c 65 72 20  ** Busy handler 
1b30: 77 69 74 68 20 61 20 67 2e 69 54 69 6d 65 6f 75  with a g.iTimeou
1b40: 74 2d 6d 69 6c 6c 69 73 65 63 6f 6e 64 20 74 69  t-millisecond ti
1b50: 6d 65 6f 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20  meout.*/.static 
1b60: 69 6e 74 20 62 75 73 79 48 61 6e 64 6c 65 72 28  int busyHandler(
1b70: 76 6f 69 64 20 2a 70 43 44 2c 20 69 6e 74 20 63  void *pCD, int c
1b80: 6f 75 6e 74 29 7b 0a 20 20 69 66 28 20 63 6f 75  ount){.  if( cou
1b90: 6e 74 2a 31 30 3e 67 2e 69 54 69 6d 65 6f 75 74  nt*10>g.iTimeout
1ba0: 20 29 7b 0a 20 20 20 20 69 66 28 20 67 2e 69 54   ){.    if( g.iT
1bb0: 69 6d 65 6f 75 74 3e 30 20 29 20 65 72 72 6f 72  imeout>0 ) error
1bc0: 4d 65 73 73 61 67 65 28 22 74 69 6d 65 6f 75 74  Message("timeout
1bd0: 20 61 66 74 65 72 20 25 64 6d 73 22 2c 20 67 2e   after %dms", g.
1be0: 69 54 69 6d 65 6f 75 74 29 3b 0a 20 20 20 20 72  iTimeout);.    r
1bf0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73  eturn 0;.  }.  s
1c00: 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 31 30 29  qlite3_sleep(10)
1c10: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
1c20: 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 54 72 61 63 65  ./*.** SQL Trace
1c30: 20 63 61 6c 6c 62 61 63 6b 0a 2a 2f 0a 73 74 61   callback.*/.sta
1c40: 74 69 63 20 76 6f 69 64 20 73 71 6c 54 72 61 63  tic void sqlTrac
1c50: 65 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a  eCallback(void *
1c60: 4e 6f 74 55 73 65 64 31 2c 20 63 6f 6e 73 74 20  NotUsed1, const 
1c70: 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 6c  char *zSql){.  l
1c80: 6f 67 4d 65 73 73 61 67 65 28 22 5b 25 2e 2a 73  ogMessage("[%.*s
1c90: 5d 22 2c 20 63 6c 69 70 4c 65 6e 67 74 68 28 7a  ]", clipLength(z
1ca0: 53 71 6c 29 2c 20 7a 53 71 6c 29 3b 0a 7d 0a 0a  Sql), zSql);.}..
1cb0: 2f 2a 0a 2a 2a 20 50 72 65 70 61 72 65 20 61 6e  /*.** Prepare an
1cc0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
1cd0: 20 49 73 73 75 65 20 61 20 66 61 74 61 6c 20 65   Issue a fatal e
1ce0: 72 72 6f 72 20 69 66 20 75 6e 61 62 6c 65 2e 0a  rror if unable..
1cf0: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
1d00: 33 5f 73 74 6d 74 20 2a 70 72 65 70 61 72 65 53  3_stmt *prepareS
1d10: 71 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ql(const char *z
1d20: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
1d30: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68  va_list ap;.  ch
1d40: 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20  ar *zSql;.  int 
1d50: 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  rc;.  sqlite3_st
1d60: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
1d70: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
1d80: 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d  ormat);.  zSql =
1d90: 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74   sqlite3_vmprint
1da0: 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  f(zFormat, ap);.
1db0: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
1dc0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
1dd0: 70 61 72 65 5f 76 32 28 67 2e 64 62 2c 20 7a 53  pare_v2(g.db, zS
1de0: 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
1df0: 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
1e00: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
1e10: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
1e20: 70 53 74 6d 74 29 3b 0a 20 20 20 20 66 61 74 61  pStmt);.    fata
1e30: 6c 45 72 72 6f 72 28 22 25 73 5c 6e 25 73 5c 6e  lError("%s\n%s\n
1e40: 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
1e50: 67 28 67 2e 64 62 29 2c 20 7a 53 71 6c 29 3b 0a  g(g.db), zSql);.
1e60: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
1e70: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 72 65 74 75  ee(zSql);.  retu
1e80: 72 6e 20 70 53 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pStmt;.}../*.
1e90: 2a 2a 20 52 75 6e 20 61 72 62 69 74 72 61 72 79  ** Run arbitrary
1ea0: 20 53 51 4c 2e 20 20 49 73 73 75 65 20 61 20 66   SQL.  Issue a f
1eb0: 61 74 61 6c 20 65 72 72 6f 72 20 6f 6e 20 66 61  atal error on fa
1ec0: 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
1ed0: 20 76 6f 69 64 20 72 75 6e 53 71 6c 28 63 6f 6e   void runSql(con
1ee0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
1ef0: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
1f00: 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53  t ap;.  char *zS
1f10: 71 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ql;.  int rc;.  
1f20: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
1f30: 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  rmat);.  zSql = 
1f40: 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66  sqlite3_vmprintf
1f50: 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20  (zFormat, ap);. 
1f60: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
1f70: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
1f80: 28 67 2e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20  (g.db, zSql, 0, 
1f90: 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  0, 0);.  if( rc!
1fa0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1fb0: 20 20 66 61 74 61 6c 45 72 72 6f 72 28 22 25 73    fatalError("%s
1fc0: 5c 6e 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33  \n%s\n", sqlite3
1fd0: 5f 65 72 72 6d 73 67 28 67 2e 64 62 29 2c 20 7a  _errmsg(g.db), z
1fe0: 53 71 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Sql);.  }.  sqli
1ff0: 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
2000: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
2010: 72 75 6e 20 61 72 62 69 74 72 61 72 79 20 53 51  run arbitrary SQ
2020: 4c 2e 20 20 52 65 74 75 72 6e 20 73 75 63 63 65  L.  Return succe
2030: 73 73 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  ss code..*/.stat
2040: 69 63 20 69 6e 74 20 74 72 79 53 71 6c 28 63 6f  ic int trySql(co
2050: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
2060: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
2070: 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a  st ap;.  char *z
2080: 53 71 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Sql;.  int rc;. 
2090: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
20a0: 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d  ormat);.  zSql =
20b0: 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74   sqlite3_vmprint
20c0: 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  f(zFormat, ap);.
20d0: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
20e0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
20f0: 63 28 67 2e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c  c(g.db, zSql, 0,
2100: 20 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   0, 0);.  sqlite
2110: 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
2120: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2130: 20 53 74 72 75 63 74 75 72 65 20 66 6f 72 20 68   Structure for h
2140: 6f 6c 64 69 6e 67 20 61 6e 20 61 72 62 69 74 72  olding an arbitr
2150: 61 72 79 20 6c 65 6e 67 74 68 20 73 74 72 69 6e  ary length strin
2160: 67 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  g.*/.typedef str
2170: 75 63 74 20 53 74 72 69 6e 67 20 53 74 72 69 6e  uct String Strin
2180: 67 3b 0a 73 74 72 75 63 74 20 53 74 72 69 6e 67  g;.struct String
2190: 20 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20   {.  char *z;   
21a0: 20 20 20 20 20 20 2f 2a 20 74 68 65 20 73 74 72        /* the str
21b0: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20  ing */.  int n; 
21c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 6c 6f            /* Slo
21d0: 74 73 20 6f 66 20 7a 5b 5d 20 75 73 65 64 20 2a  ts of z[] used *
21e0: 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20  /.  int nAlloc; 
21f0: 20 20 20 20 20 2f 2a 20 53 6c 6f 74 73 20 6f 66       /* Slots of
2200: 20 7a 5b 5d 20 61 6c 6c 6f 63 61 74 65 64 20 2a   z[] allocated *
2210: 2f 0a 7d 3b 0a 0a 2f 2a 20 46 72 65 65 20 61 20  /.};../* Free a 
2220: 73 74 72 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63  string */.static
2230: 20 76 6f 69 64 20 73 74 72 69 6e 67 46 72 65 65   void stringFree
2240: 28 53 74 72 69 6e 67 20 2a 70 29 7b 0a 20 20 69  (String *p){.  i
2250: 66 28 20 70 2d 3e 7a 20 29 20 73 71 6c 69 74 65  f( p->z ) sqlite
2260: 33 5f 66 72 65 65 28 70 2d 3e 7a 29 3b 0a 20 20  3_free(p->z);.  
2270: 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
2280: 65 6f 66 28 2a 70 29 29 3b 0a 7d 0a 0a 2f 2a 20  eof(*p));.}../* 
2290: 41 70 70 65 6e 64 20 6e 20 62 79 74 65 73 20 6f  Append n bytes o
22a0: 66 20 74 65 78 74 20 74 6f 20 61 20 73 74 72 69  f text to a stri
22b0: 6e 67 2e 20 20 49 66 20 6e 3c 30 20 61 70 70 65  ng.  If n<0 appe
22c0: 6e 64 20 74 68 65 20 65 6e 74 69 72 65 20 73 74  nd the entire st
22d0: 72 69 6e 67 2e 20 2a 2f 0a 73 74 61 74 69 63 20  ring. */.static 
22e0: 76 6f 69 64 20 73 74 72 69 6e 67 41 70 70 65 6e  void stringAppen
22f0: 64 28 53 74 72 69 6e 67 20 2a 70 2c 20 63 6f 6e  d(String *p, con
2300: 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
2310: 6e 29 7b 0a 20 20 69 66 28 20 6e 3c 30 20 29 20  n){.  if( n<0 ) 
2320: 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
2330: 7a 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 2b 6e  z);.  if( p->n+n
2340: 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20  >=p->nAlloc ){. 
2350: 20 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20     int nAlloc = 
2360: 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6e 20  p->nAlloc*2 + n 
2370: 2b 20 31 30 30 3b 0a 20 20 20 20 63 68 61 72 20  + 100;.    char 
2380: 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  *z = sqlite3_rea
2390: 6c 6c 6f 63 28 70 2d 3e 7a 2c 20 6e 41 6c 6c 6f  lloc(p->z, nAllo
23a0: 63 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30  c);.    if( z==0
23b0: 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 6f   ) fatalError("o
23c0: 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b 0a  ut of memory");.
23d0: 20 20 20 20 70 2d 3e 7a 20 3d 20 7a 3b 0a 20 20      p->z = z;.  
23e0: 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 41    p->nAlloc = nA
23f0: 6c 6c 6f 63 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63  lloc;.  }.  memc
2400: 70 79 28 70 2d 3e 7a 2b 70 2d 3e 6e 2c 20 7a 2c  py(p->z+p->n, z,
2410: 20 6e 29 3b 0a 20 20 70 2d 3e 6e 20 2b 3d 20 6e   n);.  p->n += n
2420: 3b 0a 20 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d  ;.  p->z[p->n] =
2430: 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 73 65 74 20   0;.}../* Reset 
2440: 61 20 73 74 72 69 6e 67 20 74 6f 20 61 6e 20 65  a string to an e
2450: 6d 70 74 79 20 73 74 72 69 6e 67 20 2a 2f 0a 73  mpty string */.s
2460: 74 61 74 69 63 20 76 6f 69 64 20 73 74 72 69 6e  tatic void strin
2470: 67 52 65 73 65 74 28 53 74 72 69 6e 67 20 2a 70  gReset(String *p
2480: 29 7b 0a 20 20 69 66 28 20 70 2d 3e 7a 3d 3d 30  ){.  if( p->z==0
2490: 20 29 20 73 74 72 69 6e 67 41 70 70 65 6e 64 28   ) stringAppend(
24a0: 70 2c 20 22 20 22 2c 20 31 29 3b 0a 20 20 70 2d  p, " ", 1);.  p-
24b0: 3e 6e 20 3d 20 30 3b 0a 20 20 70 2d 3e 7a 5b 30  >n = 0;.  p->z[0
24c0: 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 41 70 70  ] = 0;.}../* App
24d0: 65 6e 64 20 61 20 6e 65 77 20 74 6f 6b 65 6e 20  end a new token 
24e0: 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  onto the end of 
24f0: 74 68 65 20 73 74 72 69 6e 67 20 2a 2f 0a 73 74  the string */.st
2500: 61 74 69 63 20 76 6f 69 64 20 73 74 72 69 6e 67  atic void string
2510: 41 70 70 65 6e 64 54 65 72 6d 28 53 74 72 69 6e  AppendTerm(Strin
2520: 67 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  g *p, const char
2530: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20   *z){.  int i;. 
2540: 20 69 66 28 20 70 2d 3e 6e 20 29 20 73 74 72 69   if( p->n ) stri
2550: 6e 67 41 70 70 65 6e 64 28 70 2c 20 22 20 22 2c  ngAppend(p, " ",
2560: 20 31 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20   1);.  if( z==0 
2570: 29 7b 0a 20 20 20 20 73 74 72 69 6e 67 41 70 70  ){.    stringApp
2580: 65 6e 64 28 70 2c 20 22 6e 69 6c 22 2c 20 33 29  end(p, "nil", 3)
2590: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
25a0: 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69  }.  for(i=0; z[i
25b0: 5d 20 26 26 20 21 69 73 73 70 61 63 65 28 7a 5b  ] && !isspace(z[
25c0: 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66  i]); i++){}.  if
25d0: 28 20 69 3e 30 20 26 26 20 7a 5b 69 5d 3d 3d 30  ( i>0 && z[i]==0
25e0: 20 29 7b 0a 20 20 20 20 73 74 72 69 6e 67 41 70   ){.    stringAp
25f0: 70 65 6e 64 28 70 2c 20 7a 2c 20 69 29 3b 0a 20  pend(p, z, i);. 
2600: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
2610: 20 73 74 72 69 6e 67 41 70 70 65 6e 64 28 70 2c   stringAppend(p,
2620: 20 22 27 22 2c 20 31 29 3b 0a 20 20 77 68 69 6c   "'", 1);.  whil
2630: 65 28 20 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 66  e( z[0] ){.    f
2640: 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 20 26 26 20  or(i=0; z[i] && 
2650: 7a 5b 69 5d 21 3d 27 5c 27 27 3b 20 69 2b 2b 29  z[i]!='\''; i++)
2660: 7b 7d 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 20  {}.    if( z[i] 
2670: 29 7b 0a 20 20 20 20 20 20 73 74 72 69 6e 67 41  ){.      stringA
2680: 70 70 65 6e 64 28 70 2c 20 7a 2c 20 69 2b 31 29  ppend(p, z, i+1)
2690: 3b 0a 20 20 20 20 20 20 73 74 72 69 6e 67 41 70  ;.      stringAp
26a0: 70 65 6e 64 28 70 2c 20 22 27 22 2c 20 31 29 3b  pend(p, "'", 1);
26b0: 0a 20 20 20 20 20 20 7a 20 2b 3d 20 69 2b 31 3b  .      z += i+1;
26c0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
26d0: 20 20 73 74 72 69 6e 67 41 70 70 65 6e 64 28 70    stringAppend(p
26e0: 2c 20 7a 2c 20 69 29 3b 0a 20 20 20 20 20 20 62  , z, i);.      b
26f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
2700: 20 20 73 74 72 69 6e 67 41 70 70 65 6e 64 28 70    stringAppend(p
2710: 2c 20 22 27 22 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a  , "'", 1);.}../*
2720: 0a 2a 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e  .** Callback fun
2730: 63 74 69 6f 6e 20 66 6f 72 20 65 76 61 6c 53 71  ction for evalSq
2740: 6c 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  l().*/.static in
2750: 74 20 65 76 61 6c 43 61 6c 6c 62 61 63 6b 28 76  t evalCallback(v
2760: 6f 69 64 20 2a 70 43 44 61 74 61 2c 20 69 6e 74  oid *pCData, int
2770: 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72   argc, char **ar
2780: 67 76 2c 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c  gv, char **azCol
2790: 29 7b 0a 20 20 53 74 72 69 6e 67 20 2a 70 20 3d  ){.  String *p =
27a0: 20 28 53 74 72 69 6e 67 2a 29 70 43 44 61 74 61   (String*)pCData
27b0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
27c0: 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b  (i=0; i<argc; i+
27d0: 2b 29 20 73 74 72 69 6e 67 41 70 70 65 6e 64 54  +) stringAppendT
27e0: 65 72 6d 28 70 2c 20 61 72 67 76 5b 69 5d 29 3b  erm(p, argv[i]);
27f0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
2800: 2f 2a 0a 2a 2a 20 52 75 6e 20 61 72 62 69 74 72  /*.** Run arbitr
2810: 61 72 79 20 53 51 4c 20 61 6e 64 20 72 65 63 6f  ary SQL and reco
2820: 72 64 20 74 68 65 20 72 65 73 75 6c 74 73 20 69  rd the results i
2830: 6e 20 61 6e 20 6f 75 74 70 75 74 20 73 74 72 69  n an output stri
2840: 6e 67 0a 2a 2a 20 67 69 76 65 6e 20 62 79 20 74  ng.** given by t
2850: 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74  he first paramet
2860: 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  er..*/.static in
2870: 74 20 65 76 61 6c 53 71 6c 28 53 74 72 69 6e 67  t evalSql(String
2880: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
2890: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
28a0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
28b0: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e  char *zSql;.  in
28c0: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45  t rc;.  char *zE
28d0: 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 76 61 5f  rrMsg = 0;.  va_
28e0: 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61  start(ap, zForma
28f0: 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c  t);.  zSql = sql
2900: 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46  ite3_vmprintf(zF
2910: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61  ormat, ap);.  va
2920: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 61 73 73 65  _end(ap);.  asse
2930: 72 74 28 20 67 2e 69 54 69 6d 65 6f 75 74 3e 30  rt( g.iTimeout>0
2940: 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
2950: 65 33 5f 65 78 65 63 28 67 2e 64 62 2c 20 7a 53  e3_exec(g.db, zS
2960: 71 6c 2c 20 65 76 61 6c 43 61 6c 6c 62 61 63 6b  ql, evalCallback
2970: 2c 20 70 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  , p, &zErrMsg);.
2980: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2990: 53 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Sql);.  if( rc )
29a0: 7b 0a 20 20 20 20 63 68 61 72 20 7a 45 72 72 5b  {.    char zErr[
29b0: 33 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  30];.    sqlite3
29c0: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
29d0: 28 7a 45 72 72 29 2c 20 7a 45 72 72 2c 20 22 65  (zErr), zErr, "e
29e0: 72 72 6f 72 28 25 64 29 22 2c 20 72 63 29 3b 0a  rror(%d)", rc);.
29f0: 20 20 20 20 73 74 72 69 6e 67 41 70 70 65 6e 64      stringAppend
2a00: 54 65 72 6d 28 70 2c 20 7a 45 72 72 29 3b 0a 20  Term(p, zErr);. 
2a10: 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29     if( zErrMsg )
2a20: 7b 0a 20 20 20 20 20 20 73 74 72 69 6e 67 41 70  {.      stringAp
2a30: 70 65 6e 64 54 65 72 6d 28 70 2c 20 7a 45 72 72  pendTerm(p, zErr
2a40: 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Msg);.      sqli
2a50: 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67  te3_free(zErrMsg
2a60: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
2a70: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2a80: 2a 2a 20 4c 6f 6f 6b 20 75 70 20 74 68 65 20 6e  ** Look up the n
2a90: 65 78 74 20 74 61 73 6b 20 66 6f 72 20 63 6c 69  ext task for cli
2aa0: 65 6e 74 20 69 43 6c 69 65 6e 74 20 69 6e 20 74  ent iClient in t
2ab0: 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  he database..** 
2ac0: 52 65 74 75 72 6e 20 74 68 65 20 74 61 73 6b 20  Return the task 
2ad0: 73 63 72 69 70 74 20 61 6e 64 20 74 68 65 20 74  script and the t
2ae0: 61 73 6b 20 6e 75 6d 62 65 72 20 61 6e 64 20 6d  ask number and m
2af0: 61 72 6b 20 74 68 61 74 0a 2a 2a 20 74 61 73 6b  ark that.** task
2b00: 20 61 73 20 62 65 69 6e 67 20 75 6e 64 65 72 20   as being under 
2b10: 77 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  way..*/.static i
2b20: 6e 74 20 73 74 61 72 74 53 63 72 69 70 74 28 0a  nt startScript(.
2b30: 20 20 69 6e 74 20 69 43 6c 69 65 6e 74 2c 20 20    int iClient,  
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2b50: 68 65 20 63 6c 69 65 6e 74 20 6e 75 6d 62 65 72  he client number
2b60: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 53   */.  char **pzS
2b70: 63 72 69 70 74 2c 20 20 20 20 20 20 20 20 20 20  cript,          
2b80: 2f 2a 20 57 72 69 74 65 20 74 61 73 6b 20 73 63  /* Write task sc
2b90: 72 69 70 74 20 68 65 72 65 20 2a 2f 0a 20 20 69  ript here */.  i
2ba0: 6e 74 20 2a 70 54 61 73 6b 49 64 20 20 20 20 20  nt *pTaskId     
2bb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
2bc0: 65 20 74 61 73 6b 20 6e 75 6d 62 65 72 20 68 65  e task number he
2bd0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  re */.){.  sqlit
2be0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
2bf0: 20 30 3b 0a 20 20 69 6e 74 20 74 61 73 6b 49 64   0;.  int taskId
2c00: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
2c10: 74 20 74 6f 74 61 6c 54 69 6d 65 20 3d 20 30 3b  t totalTime = 0;
2c20: 0a 0a 20 20 2a 70 7a 53 63 72 69 70 74 20 3d 20  ..  *pzScript = 
2c30: 30 3b 0a 20 20 67 2e 69 54 69 6d 65 6f 75 74 20  0;.  g.iTimeout 
2c40: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b  = 0;.  while(1){
2c50: 0a 20 20 20 20 72 63 20 3d 20 74 72 79 53 71 6c  .    rc = trySql
2c60: 28 22 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54  ("BEGIN IMMEDIAT
2c70: 45 22 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  E");.    if( rc=
2c80: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
2c90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6c        sqlite3_sl
2ca0: 65 65 70 28 31 30 29 3b 0a 20 20 20 20 20 20 74  eep(10);.      t
2cb0: 6f 74 61 6c 54 69 6d 65 20 2b 3d 20 31 30 3b 0a  otalTime += 10;.
2cc0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
2cd0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
2ce0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2cf0: 20 20 20 20 20 66 61 74 61 6c 45 72 72 6f 72 28       fatalError(
2d00: 22 25 73 5c 6e 42 45 47 49 4e 20 49 4d 4d 45 44  "%s\nBEGIN IMMED
2d10: 49 41 54 45 22 2c 20 73 71 6c 69 74 65 33 5f 65  IATE", sqlite3_e
2d20: 72 72 6d 73 67 28 67 2e 64 62 29 29 3b 0a 20 20  rrmsg(g.db));.  
2d30: 20 20 7d 0a 20 20 20 20 69 66 28 20 67 2e 6e 45    }.    if( g.nE
2d40: 72 72 6f 72 20 7c 7c 20 67 2e 6e 54 65 73 74 20  rror || g.nTest 
2d50: 29 7b 0a 20 20 20 20 20 20 72 75 6e 53 71 6c 28  ){.      runSql(
2d60: 22 55 50 44 41 54 45 20 63 6f 75 6e 74 65 72 73  "UPDATE counters
2d70: 20 53 45 54 20 6e 45 72 72 6f 72 3d 6e 45 72 72   SET nError=nErr
2d80: 6f 72 2b 25 64 2c 20 6e 54 65 73 74 3d 6e 54 65  or+%d, nTest=nTe
2d90: 73 74 2b 25 64 22 2c 0a 20 20 20 20 20 20 20 20  st+%d",.        
2da0: 20 20 20 20 20 67 2e 6e 45 72 72 6f 72 2c 20 67       g.nError, g
2db0: 2e 6e 54 65 73 74 29 3b 0a 20 20 20 20 20 20 67  .nTest);.      g
2dc0: 2e 6e 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20  .nError = 0;.   
2dd0: 20 20 20 67 2e 6e 54 65 73 74 20 3d 20 30 3b 0a     g.nTest = 0;.
2de0: 20 20 20 20 7d 0a 20 20 20 20 70 53 74 6d 74 20      }.    pStmt 
2df0: 3d 20 70 72 65 70 61 72 65 53 71 6c 28 22 53 45  = prepareSql("SE
2e00: 4c 45 43 54 20 31 20 46 52 4f 4d 20 63 6c 69 65  LECT 1 FROM clie
2e10: 6e 74 20 57 48 45 52 45 20 69 64 3d 25 64 20 41  nt WHERE id=%d A
2e20: 4e 44 20 77 61 6e 74 48 61 6c 74 22 2c 69 43 6c  ND wantHalt",iCl
2e30: 69 65 6e 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  ient);.    rc = 
2e40: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
2e50: 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  mt);.    sqlite3
2e60: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
2e70: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2e80: 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
2e90: 20 20 72 75 6e 53 71 6c 28 22 44 45 4c 45 54 45    runSql("DELETE
2ea0: 20 46 52 4f 4d 20 63 6c 69 65 6e 74 20 57 48 45   FROM client WHE
2eb0: 52 45 20 69 64 3d 25 64 22 2c 20 69 43 6c 69 65  RE id=%d", iClie
2ec0: 6e 74 29 3b 0a 20 20 20 20 20 20 72 75 6e 53 71  nt);.      runSq
2ed0: 6c 28 22 43 4f 4d 4d 49 54 22 29 3b 0a 20 20 20  l("COMMIT");.   
2ee0: 20 20 20 67 2e 69 54 69 6d 65 6f 75 74 20 3d 20     g.iTimeout = 
2ef0: 44 45 46 41 55 4c 54 5f 54 49 4d 45 4f 55 54 3b  DEFAULT_TIMEOUT;
2f00: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2f10: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
2f20: 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 70 72 65  .    pStmt = pre
2f30: 70 61 72 65 53 71 6c 28 0a 20 20 20 20 20 20 20  pareSql(.       
2f40: 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 73         "SELECT s
2f50: 63 72 69 70 74 2c 20 69 64 20 46 52 4f 4d 20 74  cript, id FROM t
2f60: 61 73 6b 22 0a 20 20 20 20 20 20 20 20 20 20 20  ask".           
2f70: 20 20 20 22 20 57 48 45 52 45 20 63 6c 69 65 6e     " WHERE clien
2f80: 74 3d 25 64 20 41 4e 44 20 73 74 61 72 74 74 69  t=%d AND startti
2f90: 6d 65 20 49 53 20 4e 55 4c 4c 22 0a 20 20 20 20  me IS NULL".    
2fa0: 20 20 20 20 20 20 20 20 20 20 22 20 4f 52 44 45            " ORDE
2fb0: 52 20 42 59 20 69 64 20 4c 49 4d 49 54 20 31 22  R BY id LIMIT 1"
2fc0: 2c 20 69 43 6c 69 65 6e 74 29 3b 0a 20 20 20 20  , iClient);.    
2fd0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
2fe0: 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66  p(pStmt);.    if
2ff0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  ( rc==SQLITE_ROW
3000: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20   ){.      int n 
3010: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
3020: 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 30 29  _bytes(pStmt, 0)
3030: 3b 0a 20 20 20 20 20 20 2a 70 7a 53 63 72 69 70  ;.      *pzScrip
3040: 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  t = sqlite3_mall
3050: 6f 63 28 20 6e 2b 20 31 20 29 3b 0a 20 20 20 20  oc( n+ 1 );.    
3060: 20 20 73 74 72 63 70 79 28 2a 70 7a 53 63 72 69    strcpy(*pzScri
3070: 70 74 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  pt, (const char*
3080: 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
3090: 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 29 3b  text(pStmt, 0));
30a0: 0a 20 20 20 20 20 20 2a 70 54 61 73 6b 49 64 20  .      *pTaskId 
30b0: 3d 20 74 61 73 6b 49 64 20 3d 20 73 71 6c 69 74  = taskId = sqlit
30c0: 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
30d0: 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 73  tmt, 1);.      s
30e0: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
30f0: 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 75  pStmt);.      ru
3100: 6e 53 71 6c 28 22 55 50 44 41 54 45 20 74 61 73  nSql("UPDATE tas
3110: 6b 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k".             
3120: 22 20 20 20 53 45 54 20 73 74 61 72 74 74 69 6d  "   SET starttim
3130: 65 3d 73 74 72 66 74 69 6d 65 28 27 25 25 59 2d  e=strftime('%%Y-
3140: 25 25 6d 2d 25 25 64 20 25 25 48 3a 25 25 4d 3a  %%m-%%d %%H:%%M:
3150: 25 25 66 27 2c 27 6e 6f 77 27 29 22 0a 20 20 20  %%f','now')".   
3160: 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
3170: 45 20 69 64 3d 25 64 3b 22 2c 20 74 61 73 6b 49  E id=%d;", taskI
3180: 64 29 3b 0a 20 20 20 20 20 20 72 75 6e 53 71 6c  d);.      runSql
3190: 28 22 43 4f 4d 4d 49 54 3b 22 29 3b 0a 20 20 20  ("COMMIT;");.   
31a0: 20 20 20 67 2e 69 54 69 6d 65 6f 75 74 20 3d 20     g.iTimeout = 
31b0: 44 45 46 41 55 4c 54 5f 54 49 4d 45 4f 55 54 3b  DEFAULT_TIMEOUT;
31c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
31d0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
31e0: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
31f0: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
3200: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
3210: 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ONE ){.      if(
3220: 20 74 6f 74 61 6c 54 69 6d 65 3e 33 30 30 30 30   totalTime>30000
3230: 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72 72 6f   ){.        erro
3240: 72 4d 65 73 73 61 67 65 28 22 57 61 69 74 65 64  rMessage("Waited
3250: 20 6f 76 65 72 20 33 30 20 73 65 63 6f 6e 64 73   over 30 seconds
3260: 20 77 69 74 68 20 6e 6f 20 77 6f 72 6b 2e 20 20   with no work.  
3270: 47 69 76 69 6e 67 20 75 70 2e 22 29 3b 0a 20 20  Giving up.");.  
3280: 20 20 20 20 20 20 72 75 6e 53 71 6c 28 22 44 45        runSql("DE
3290: 4c 45 54 45 20 46 52 4f 4d 20 63 6c 69 65 6e 74  LETE FROM client
32a0: 20 57 48 45 52 45 20 69 64 3d 25 64 3b 20 43 4f   WHERE id=%d; CO
32b0: 4d 4d 49 54 3b 22 2c 20 69 43 6c 69 65 6e 74 29  MMIT;", iClient)
32c0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
32d0: 33 5f 63 6c 6f 73 65 28 67 2e 64 62 29 3b 0a 20  3_close(g.db);. 
32e0: 20 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a         exit(1);.
32f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 75        }.      ru
3300: 6e 53 71 6c 28 22 43 4f 4d 4d 49 54 3b 22 29 3b  nSql("COMMIT;");
3310: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
3320: 6c 65 65 70 28 31 30 30 29 3b 0a 20 20 20 20 20  leep(100);.     
3330: 20 74 6f 74 61 6c 54 69 6d 65 20 2b 3d 20 31 30   totalTime += 10
3340: 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  0;.      continu
3350: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 61 74  e;.    }.    fat
3360: 61 6c 45 72 72 6f 72 28 22 25 73 22 2c 20 73 71  alError("%s", sq
3370: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 67 2e 64  lite3_errmsg(g.d
3380: 62 29 29 3b 0a 20 20 7d 0a 20 20 67 2e 69 54 69  b));.  }.  g.iTi
3390: 6d 65 6f 75 74 20 3d 20 44 45 46 41 55 4c 54 5f  meout = DEFAULT_
33a0: 54 49 4d 45 4f 55 54 3b 0a 7d 0a 0a 2f 2a 0a 2a  TIMEOUT;.}../*.*
33b0: 2a 20 4d 61 72 6b 20 61 20 73 63 72 69 70 74 20  * Mark a script 
33c0: 61 73 20 68 61 76 69 6e 67 20 66 69 6e 69 73 68  as having finish
33d0: 65 64 2e 20 20 20 52 65 6d 6f 76 65 20 74 68 65  ed.   Remove the
33e0: 20 43 4c 49 45 4e 54 20 74 61 62 6c 65 20 65 6e   CLIENT table en
33f0: 74 72 79 0a 2a 2a 20 69 66 20 62 53 68 75 74 64  try.** if bShutd
3400: 6f 77 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a  own is true..*/.
3410: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 69 73  static int finis
3420: 68 53 63 72 69 70 74 28 69 6e 74 20 69 43 6c 69  hScript(int iCli
3430: 65 6e 74 2c 20 69 6e 74 20 74 61 73 6b 49 64 2c  ent, int taskId,
3440: 20 69 6e 74 20 62 53 68 75 74 64 6f 77 6e 29 7b   int bShutdown){
3450: 0a 20 20 72 75 6e 53 71 6c 28 22 55 50 44 41 54  .  runSql("UPDAT
3460: 45 20 74 61 73 6b 22 0a 20 20 20 20 20 20 20 20  E task".        
3470: 20 22 20 20 20 53 45 54 20 65 6e 64 74 69 6d 65   "   SET endtime
3480: 3d 73 74 72 66 74 69 6d 65 28 27 25 25 59 2d 25  =strftime('%%Y-%
3490: 25 6d 2d 25 25 64 20 25 25 48 3a 25 25 4d 3a 25  %m-%%d %%H:%%M:%
34a0: 25 66 27 2c 27 6e 6f 77 27 29 22 0a 20 20 20 20  %f','now')".    
34b0: 20 20 20 20 20 22 20 57 48 45 52 45 20 69 64 3d       " WHERE id=
34c0: 25 64 3b 22 2c 20 74 61 73 6b 49 64 29 3b 0a 20  %d;", taskId);. 
34d0: 20 69 66 28 20 62 53 68 75 74 64 6f 77 6e 20 29   if( bShutdown )
34e0: 7b 0a 20 20 20 20 72 75 6e 53 71 6c 28 22 44 45  {.    runSql("DE
34f0: 4c 45 54 45 20 46 52 4f 4d 20 63 6c 69 65 6e 74  LETE FROM client
3500: 20 57 48 45 52 45 20 69 64 3d 25 64 22 2c 20 69   WHERE id=%d", i
3510: 43 6c 69 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 72  Client);.  }.  r
3520: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
3530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20  .}../*.** Start 
3540: 75 70 20 61 20 63 6c 69 65 6e 74 20 70 72 6f 63  up a client proc
3550: 65 73 73 20 66 6f 72 20 69 43 6c 69 65 6e 74 2c  ess for iClient,
3560: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c   if it is not al
3570: 72 65 61 64 79 0a 2a 2a 20 72 75 6e 6e 69 6e 67  ready.** running
3580: 2e 20 20 49 66 20 74 68 65 20 63 6c 69 65 6e 74  .  If the client
3590: 20 69 73 20 61 6c 72 65 61 64 79 20 72 75 6e 6e   is already runn
35a0: 69 6e 67 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ing, then this r
35b0: 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 61 20 6e  outine.** is a n
35c0: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
35d0: 76 6f 69 64 20 73 74 61 72 74 43 6c 69 65 6e 74  void startClient
35e0: 28 69 6e 74 20 69 43 6c 69 65 6e 74 29 7b 0a 20  (int iClient){. 
35f0: 20 72 75 6e 53 71 6c 28 22 49 4e 53 45 52 54 20   runSql("INSERT 
3600: 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 63  OR IGNORE INTO c
3610: 6c 69 65 6e 74 20 56 41 4c 55 45 53 28 25 64 2c  lient VALUES(%d,
3620: 30 29 22 2c 20 69 43 6c 69 65 6e 74 29 3b 0a 20  0)", iClient);. 
3630: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 68 61   if( sqlite3_cha
3640: 6e 67 65 73 28 67 2e 64 62 29 20 29 7b 0a 23 69  nges(g.db) ){.#i
3650: 66 20 64 65 66 69 6e 65 64 28 5f 5f 75 6e 69 78  f defined(__unix
3660: 5f 5f 29 0a 20 20 20 20 63 68 61 72 20 2a 7a 53  __).    char *zS
3670: 79 73 3b 0a 20 20 20 20 7a 53 79 73 20 3d 20 73  ys;.    zSys = s
3680: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
3690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36a0: 20 22 25 73 20 5c 22 25 73 5c 22 20 2d 2d 63 6c   "%s \"%s\" --cl
36b0: 69 65 6e 74 20 25 64 20 2d 2d 74 72 61 63 65 20  ient %d --trace 
36c0: 25 64 20 25 73 26 22 2c 0a 20 20 20 20 20 20 20  %d %s&",.       
36d0: 20 20 20 20 20 20 20 20 20 20 67 2e 61 72 67 76            g.argv
36e0: 30 2c 20 67 2e 7a 44 62 46 69 6c 65 2c 20 69 43  0, g.zDbFile, iC
36f0: 6c 69 65 6e 74 2c 20 67 2e 69 54 72 61 63 65 2c  lient, g.iTrace,
3700: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3710: 20 20 67 2e 62 53 71 6c 54 72 61 63 65 20 3f 20    g.bSqlTrace ? 
3720: 22 2d 2d 73 71 6c 74 72 61 63 65 20 22 20 3a 20  "--sqltrace " : 
3730: 22 22 29 3b 0a 20 20 20 20 73 79 73 74 65 6d 28  "");.    system(
3740: 7a 53 79 73 29 3b 0a 20 20 20 20 73 71 6c 69 74  zSys);.    sqlit
3750: 65 33 5f 66 72 65 65 28 7a 53 79 73 29 3b 0a 23  e3_free(zSys);.#
3760: 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
3770: 64 28 5f 57 49 4e 33 32 29 0a 20 20 20 20 63 68  d(_WIN32).    ch
3780: 61 72 20 2a 61 72 67 76 5b 31 30 5d 3b 0a 20 20  ar *argv[10];.  
3790: 20 20 63 68 61 72 20 7a 43 6c 69 65 6e 74 5b 32    char zClient[2
37a0: 30 5d 3b 0a 20 20 20 20 63 68 61 72 20 7a 54 72  0];.    char zTr
37b0: 61 63 65 5b 32 30 5d 3b 0a 20 20 20 20 61 72 67  ace[20];.    arg
37c0: 76 5b 30 5d 20 3d 20 67 2e 61 72 67 76 30 3b 0a  v[0] = g.argv0;.
37d0: 20 20 20 20 61 72 67 76 5b 31 5d 20 3d 20 67 2e      argv[1] = g.
37e0: 7a 44 62 46 69 6c 65 3b 0a 20 20 20 20 61 72 67  zDbFile;.    arg
37f0: 76 5b 32 5d 20 3d 20 22 2d 2d 63 6c 69 65 6e 74  v[2] = "--client
3800: 22 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ";.    sqlite3_s
3810: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
3820: 43 6c 69 65 6e 74 29 2c 7a 43 6c 69 65 6e 74 2c  Client),zClient,
3830: 22 25 64 22 2c 69 43 6c 69 65 6e 74 29 3b 0a 20  "%d",iClient);. 
3840: 20 20 20 61 72 67 76 5b 33 5d 20 3d 20 7a 43 6c     argv[3] = zCl
3850: 69 65 6e 74 3b 0a 20 20 20 20 61 72 67 76 5b 34  ient;.    argv[4
3860: 5d 20 3d 20 22 2d 2d 74 72 61 63 65 22 3b 0a 20  ] = "--trace";. 
3870: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
3880: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 72 61 63  ntf(sizeof(zTrac
3890: 65 29 2c 7a 54 72 61 63 65 2c 22 25 64 22 2c 67  e),zTrace,"%d",g
38a0: 2e 69 54 72 61 63 65 29 3b 0a 20 20 20 20 61 72  .iTrace);.    ar
38b0: 67 76 5b 35 5d 20 3d 20 7a 54 72 61 63 65 3b 0a  gv[5] = zTrace;.
38c0: 20 20 20 20 69 66 28 20 67 2e 62 53 71 6c 54 72      if( g.bSqlTr
38d0: 61 63 65 20 29 7b 0a 20 20 20 20 20 20 61 72 67  ace ){.      arg
38e0: 76 5b 36 5d 20 3d 20 22 2d 2d 73 71 6c 74 72 61  v[6] = "--sqltra
38f0: 63 65 22 3b 0a 20 20 20 20 20 20 61 72 67 76 5b  ce";.      argv[
3900: 37 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  7] = 0;.    }els
3910: 65 7b 0a 20 20 20 20 20 20 61 72 67 76 5b 36 5d  e{.      argv[6]
3920: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
3930: 5f 73 70 61 77 6e 76 28 5f 50 5f 4e 4f 57 41 49  _spawnv(_P_NOWAI
3940: 54 2c 20 67 2e 61 72 67 76 30 2c 20 61 72 67 76  T, g.argv0, argv
3950: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 7d 0a  );.#endif.  }.}.
3960: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
3970: 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f  entire content o
3980: 66 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65  f a file into me
3990: 6d 6f 72 79 0a 2a 2f 0a 73 74 61 74 69 63 20 63  mory.*/.static c
39a0: 68 61 72 20 2a 72 65 61 64 46 69 6c 65 28 63 6f  har *readFile(co
39b0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
39c0: 61 6d 65 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e  ame){.  FILE *in
39d0: 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 6e 61   = fopen(zFilena
39e0: 6d 65 2c 20 22 72 62 22 29 3b 0a 20 20 6c 6f 6e  me, "rb");.  lon
39f0: 67 20 73 7a 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  g sz;.  char *z;
3a00: 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a  .  if( in==0 ){.
3a10: 20 20 20 20 66 61 74 61 6c 45 72 72 6f 72 28 22      fatalError("
3a20: 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73  cannot open \"%s
3a30: 5c 22 20 66 6f 72 20 72 65 61 64 69 6e 67 22 2c  \" for reading",
3a40: 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d   zFilename);.  }
3a50: 0a 20 20 66 73 65 65 6b 28 69 6e 2c 20 30 2c 20  .  fseek(in, 0, 
3a60: 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 73 7a 20  SEEK_END);.  sz 
3a70: 3d 20 66 74 65 6c 6c 28 69 6e 29 3b 0a 20 20 72  = ftell(in);.  r
3a80: 65 77 69 6e 64 28 69 6e 29 3b 0a 20 20 7a 20 3d  ewind(in);.  z =
3a90: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
3aa0: 20 73 7a 2b 31 20 29 3b 0a 20 20 73 7a 20 3d 20   sz+1 );.  sz = 
3ab0: 28 6c 6f 6e 67 29 66 72 65 61 64 28 7a 2c 20 31  (long)fread(z, 1
3ac0: 2c 20 73 7a 2c 20 69 6e 29 3b 0a 20 20 7a 5b 73  , sz, in);.  z[s
3ad0: 7a 5d 20 3d 20 30 3b 0a 20 20 66 63 6c 6f 73 65  z] = 0;.  fclose
3ae0: 28 69 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  (in);.  return z
3af0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
3b00: 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20  n the length of 
3b10: 74 68 65 20 6e 65 78 74 20 74 6f 6b 65 6e 2e 0a  the next token..
3b20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 6f  */.static int to
3b30: 6b 65 6e 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20  kenLength(const 
3b40: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 6e  char *z, int *pn
3b50: 4c 69 6e 65 29 7b 0a 20 20 69 6e 74 20 6e 20 3d  Line){.  int n =
3b60: 20 30 3b 0a 20 20 69 66 28 20 69 73 73 70 61 63   0;.  if( isspac
3b70: 65 28 7a 5b 30 5d 29 20 7c 7c 20 28 7a 5b 30 5d  e(z[0]) || (z[0]
3b80: 3d 3d 27 2f 27 20 26 26 20 7a 5b 31 5d 3d 3d 27  =='/' && z[1]=='
3b90: 2a 27 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  *') ){.    int i
3ba0: 6e 43 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  nC = 0;.    int 
3bb0: 63 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d  c;.    if( z[0]=
3bc0: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 6e  ='/' ){.      in
3bd0: 43 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 20 3d  C = 1;.      n =
3be0: 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68   2;.    }.    wh
3bf0: 69 6c 65 28 20 28 63 20 3d 20 7a 5b 6e 2b 2b 5d  ile( (c = z[n++]
3c00: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )!=0 ){.      if
3c10: 28 20 63 3d 3d 27 5c 6e 27 20 29 20 28 2a 70 6e  ( c=='\n' ) (*pn
3c20: 4c 69 6e 65 29 2b 2b 3b 0a 20 20 20 20 20 20 69  Line)++;.      i
3c30: 66 28 20 69 73 73 70 61 63 65 28 63 29 20 29 20  f( isspace(c) ) 
3c40: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
3c50: 69 66 28 20 69 6e 43 20 26 26 20 63 3d 3d 27 2a  if( inC && c=='*
3c60: 27 20 26 26 20 7a 5b 6e 5d 3d 3d 27 2f 27 20 29  ' && z[n]=='/' )
3c70: 7b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20  {.        n++;. 
3c80: 20 20 20 20 20 20 20 69 6e 43 20 3d 20 30 3b 0a         inC = 0;.
3c90: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
3ca0: 21 69 6e 43 20 26 26 20 63 3d 3d 27 2f 27 20 26  !inC && c=='/' &
3cb0: 26 20 7a 5b 6e 5d 3d 3d 27 2a 27 20 29 7b 0a 20  & z[n]=='*' ){. 
3cc0: 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20         n++;.    
3cd0: 20 20 20 20 69 6e 43 20 3d 20 31 3b 0a 20 20 20      inC = 1;.   
3ce0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 6e     }else if( !in
3cf0: 43 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  C ){.        bre
3d00: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
3d10: 7d 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 65 6c  }.    n--;.  }el
3d20: 73 65 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27  se if( z[0]=='-'
3d30: 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 7b   && z[1]=='-' ){
3d40: 0a 20 20 20 20 66 6f 72 28 6e 3d 32 3b 20 7a 5b  .    for(n=2; z[
3d50: 6e 5d 20 26 26 20 7a 5b 6e 5d 21 3d 27 5c 6e 27  n] && z[n]!='\n'
3d60: 3b 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 69 66 28  ; n++){}.    if(
3d70: 20 7a 5b 6e 5d 20 29 7b 20 28 2a 70 6e 4c 69 6e   z[n] ){ (*pnLin
3d80: 65 29 2b 2b 3b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d  e)++; n++; }.  }
3d90: 65 6c 73 65 20 69 66 28 20 7a 5b 30 5d 3d 3d 27  else if( z[0]=='
3da0: 22 27 20 7c 7c 20 7a 5b 30 5d 3d 3d 27 5c 27 27  "' || z[0]=='\''
3db0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 65 6c 69   ){.    int deli
3dc0: 6d 20 3d 20 7a 5b 30 5d 3b 0a 20 20 20 20 66 6f  m = z[0];.    fo
3dd0: 72 28 6e 3d 31 3b 20 7a 5b 6e 5d 3b 20 6e 2b 2b  r(n=1; z[n]; n++
3de0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 6e  ){.      if( z[n
3df0: 5d 3d 3d 27 5c 6e 27 20 29 20 28 2a 70 6e 4c 69  ]=='\n' ) (*pnLi
3e00: 6e 65 29 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ne)++;.      if(
3e10: 20 7a 5b 6e 5d 3d 3d 64 65 6c 69 6d 20 29 7b 0a   z[n]==delim ){.
3e20: 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20          n++;.   
3e30: 20 20 20 20 20 69 66 28 20 7a 5b 6e 2b 31 5d 21       if( z[n+1]!
3e40: 3d 64 65 6c 69 6d 20 29 20 62 72 65 61 6b 3b 0a  =delim ) break;.
3e50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3e60: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 63  }else{.    int c
3e70: 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20 28  ;.    for(n=1; (
3e80: 63 20 3d 20 7a 5b 6e 5d 29 21 3d 30 20 26 26 20  c = z[n])!=0 && 
3e90: 21 69 73 73 70 61 63 65 28 63 29 20 26 26 20 63  !isspace(c) && c
3ea0: 21 3d 27 22 27 20 26 26 20 63 21 3d 27 5c 27 27  !='"' && c!='\''
3eb0: 20 26 26 20 63 21 3d 27 3b 27 3b 20 6e 2b 2b 29   && c!=';'; n++)
3ec0: 7b 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  {}.  }.  return 
3ed0: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79  n;.}../*.** Copy
3ee0: 20 61 20 73 69 6e 67 6c 65 20 74 6f 6b 65 6e 20   a single token 
3ef0: 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75  into a string bu
3f00: 66 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ffer..*/.static 
3f10: 69 6e 74 20 65 78 74 72 61 63 74 54 6f 6b 65 6e  int extractToken
3f20: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e  (const char *zIn
3f30: 2c 20 69 6e 74 20 6e 49 6e 2c 20 63 68 61 72 20  , int nIn, char 
3f40: 2a 7a 4f 75 74 2c 20 69 6e 74 20 6e 4f 75 74 29  *zOut, int nOut)
3f50: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
3f60: 20 6e 49 6e 3c 3d 30 20 29 7b 0a 20 20 20 20 7a   nIn<=0 ){.    z
3f70: 4f 75 74 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  Out[0] = 0;.    
3f80: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
3f90: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 6e 20 26  for(i=0; i<nIn &
3fa0: 26 20 69 3c 6e 4f 75 74 2d 31 20 26 26 20 21 69  & i<nOut-1 && !i
3fb0: 73 73 70 61 63 65 28 7a 49 6e 5b 69 5d 29 3b 20  sspace(zIn[i]); 
3fc0: 69 2b 2b 29 7b 20 7a 4f 75 74 5b 69 5d 20 3d 20  i++){ zOut[i] = 
3fd0: 7a 49 6e 5b 69 5d 3b 20 7d 0a 20 20 7a 4f 75 74  zIn[i]; }.  zOut
3fe0: 5b 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  [i] = 0;.  retur
3ff0: 6e 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  n i;.}../*.** Fi
4000: 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nd the number of
4010: 20 63 68 61 72 61 63 74 65 72 73 20 75 70 20 74   characters up t
4020: 6f 20 74 68 65 20 6e 65 78 74 20 22 2d 2d 65 6e  o the next "--en
4030: 64 22 20 74 6f 6b 65 6e 2e 0a 2a 2f 0a 73 74 61  d" token..*/.sta
4040: 74 69 63 20 69 6e 74 20 66 69 6e 64 45 6e 64 28  tic int findEnd(
4050: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
4060: 6e 74 20 2a 70 6e 4c 69 6e 65 29 7b 0a 20 20 69  nt *pnLine){.  i
4070: 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 77 68 69 6c  nt n = 0;.  whil
4080: 65 28 20 7a 5b 6e 5d 20 26 26 20 28 73 74 72 6e  e( z[n] && (strn
4090: 63 6d 70 28 7a 2b 6e 2c 22 2d 2d 65 6e 64 22 2c  cmp(z+n,"--end",
40a0: 35 29 20 7c 7c 20 21 69 73 73 70 61 63 65 28 7a  5) || !isspace(z
40b0: 5b 6e 2b 35 5d 29 29 20 29 7b 0a 20 20 20 20 6e  [n+5])) ){.    n
40c0: 20 2b 3d 20 74 6f 6b 65 6e 4c 65 6e 67 74 68 28   += tokenLength(
40d0: 7a 2b 6e 2c 20 70 6e 4c 69 6e 65 29 3b 0a 20 20  z+n, pnLine);.  
40e0: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  }.  return n;.}.
40f0: 0a 2f 2a 0a 2a 2a 20 57 61 69 74 20 66 6f 72 20  ./*.** Wait for 
4100: 61 20 63 6c 69 65 6e 74 20 70 72 6f 63 65 73 73  a client process
4110: 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 61 6c 6c   to complete all
4120: 20 69 74 73 20 74 61 73 6b 73 0a 2a 2f 0a 73 74   its tasks.*/.st
4130: 61 74 69 63 20 76 6f 69 64 20 77 61 69 74 46 6f  atic void waitFo
4140: 72 43 6c 69 65 6e 74 28 69 6e 74 20 69 43 6c 69  rClient(int iCli
4150: 65 6e 74 2c 20 69 6e 74 20 69 54 69 6d 65 6f 75  ent, int iTimeou
4160: 74 2c 20 63 68 61 72 20 2a 7a 45 72 72 50 72 65  t, char *zErrPre
4170: 66 69 78 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  fix){.  sqlite3_
4180: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
4190: 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69 43 6c  nt rc;.  if( iCl
41a0: 69 65 6e 74 3e 30 20 29 7b 0a 20 20 20 20 70 53  ient>0 ){.    pS
41b0: 74 6d 74 20 3d 20 70 72 65 70 61 72 65 53 71 6c  tmt = prepareSql
41c0: 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  (.              
41d0: 20 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20   "SELECT 1 FROM 
41e0: 74 61 73 6b 22 0a 20 20 20 20 20 20 20 20 20 20  task".          
41f0: 20 20 20 20 20 22 20 57 48 45 52 45 20 63 6c 69       " WHERE cli
4200: 65 6e 74 3d 25 64 22 0a 20 20 20 20 20 20 20 20  ent=%d".        
4210: 20 20 20 20 20 20 20 22 20 20 20 41 4e 44 20 63         "   AND c
4220: 6c 69 65 6e 74 20 49 4e 20 28 53 45 4c 45 43 54  lient IN (SELECT
4230: 20 69 64 20 46 52 4f 4d 20 63 6c 69 65 6e 74 29   id FROM client)
4240: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
4250: 20 22 20 20 41 4e 44 20 65 6e 64 74 69 6d 65 20   "  AND endtime 
4260: 49 53 20 4e 55 4c 4c 22 2c 0a 20 20 20 20 20 20  IS NULL",.      
4270: 20 20 20 20 20 20 20 20 20 69 43 6c 69 65 6e 74           iClient
4280: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
4290: 70 53 74 6d 74 20 3d 20 70 72 65 70 61 72 65 53  pStmt = prepareS
42a0: 71 6c 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  ql(.            
42b0: 20 20 20 22 53 45 4c 45 43 54 20 31 20 46 52 4f     "SELECT 1 FRO
42c0: 4d 20 74 61 73 6b 22 0a 20 20 20 20 20 20 20 20  M task".        
42d0: 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20 63         " WHERE c
42e0: 6c 69 65 6e 74 20 49 4e 20 28 53 45 4c 45 43 54  lient IN (SELECT
42f0: 20 69 64 20 46 52 4f 4d 20 63 6c 69 65 6e 74 29   id FROM client)
4300: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
4310: 20 22 20 20 20 41 4e 44 20 65 6e 64 74 69 6d 65   "   AND endtime
4320: 20 49 53 20 4e 55 4c 4c 22 29 3b 0a 20 20 7d 0a   IS NULL");.  }.
4330: 20 20 67 2e 69 54 69 6d 65 6f 75 74 20 3d 20 30    g.iTimeout = 0
4340: 3b 0a 20 20 77 68 69 6c 65 28 20 28 28 72 63 20  ;.  while( ((rc 
4350: 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
4360: 53 74 6d 74 29 29 3d 3d 53 51 4c 49 54 45 5f 42  Stmt))==SQLITE_B
4370: 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54  USY || rc==SQLIT
4380: 45 5f 52 4f 57 29 0a 20 20 20 20 26 26 20 69 54  E_ROW).    && iT
4390: 69 6d 65 6f 75 74 3e 30 0a 20 20 29 7b 0a 20 20  imeout>0.  ){.  
43a0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28    sqlite3_reset(
43b0: 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69  pStmt);.    sqli
43c0: 74 65 33 5f 73 6c 65 65 70 28 35 30 29 3b 0a 20  te3_sleep(50);. 
43d0: 20 20 20 69 54 69 6d 65 6f 75 74 20 2d 3d 20 35     iTimeout -= 5
43e0: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
43f0: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
4400: 3b 0a 20 20 67 2e 69 54 69 6d 65 6f 75 74 20 3d  ;.  g.iTimeout =
4410: 20 44 45 46 41 55 4c 54 5f 54 49 4d 45 4f 55 54   DEFAULT_TIMEOUT
4420: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
4430: 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 69  TE_DONE ){.    i
4440: 66 28 20 7a 45 72 72 50 72 65 66 69 78 3d 3d 30  f( zErrPrefix==0
4450: 20 29 20 7a 45 72 72 50 72 65 66 69 78 20 3d 20   ) zErrPrefix = 
4460: 22 22 3b 0a 20 20 20 20 69 66 28 20 69 43 6c 69  "";.    if( iCli
4470: 65 6e 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 65  ent>0 ){.      e
4480: 72 72 6f 72 4d 65 73 73 61 67 65 28 22 25 73 74  rrorMessage("%st
4490: 69 6d 65 6f 75 74 20 77 61 69 74 69 6e 67 20 66  imeout waiting f
44a0: 6f 72 20 63 6c 69 65 6e 74 20 25 64 22 2c 20 7a  or client %d", z
44b0: 45 72 72 50 72 65 66 69 78 2c 20 69 43 6c 69 65  ErrPrefix, iClie
44c0: 6e 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  nt);.    }else{.
44d0: 20 20 20 20 20 20 65 72 72 6f 72 4d 65 73 73 61        errorMessa
44e0: 67 65 28 22 25 73 74 69 6d 65 6f 75 74 20 77 61  ge("%stimeout wa
44f0: 69 74 69 6e 67 20 66 6f 72 20 61 6c 6c 20 63 6c  iting for all cl
4500: 69 65 6e 74 73 22 2c 20 7a 45 72 72 50 72 65 66  ients", zErrPref
4510: 69 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ix);.    }.  }.}
4520: 0a 0a 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d  ../* Maximum num
4530: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
4540: 20 74 6f 20 61 20 2d 2d 63 6f 6d 6d 61 6e 64 20   to a --command 
4550: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 58 5f 41 52  */.#define MX_AR
4560: 47 20 35 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61  G 5../*.** Run a
4570: 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 73 74 61 74   script..*/.stat
4580: 69 63 20 76 6f 69 64 20 72 75 6e 53 63 72 69 70  ic void runScrip
4590: 74 28 0a 20 20 69 6e 74 20 69 43 6c 69 65 6e 74  t(.  int iClient
45a0: 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  ,       /* The c
45b0: 6c 69 65 6e 74 20 6e 75 6d 62 65 72 2c 20 6f 72  lient number, or
45c0: 20 30 20 66 6f 72 20 74 68 65 20 6d 61 73 74 65   0 for the maste
45d0: 72 20 2a 2f 0a 20 20 69 6e 74 20 74 61 73 6b 49  r */.  int taskI
45e0: 64 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  d,        /* The
45f0: 20 74 61 73 6b 20 49 44 20 66 6f 72 20 63 6c 69   task ID for cli
4600: 65 6e 74 73 2e 20 20 30 20 66 6f 72 20 6d 61 73  ents.  0 for mas
4610: 74 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ter */.  char *z
4620: 53 63 72 69 70 74 2c 20 20 20 20 20 2f 2a 20 54  Script,     /* T
4630: 65 78 74 20 6f 66 20 74 68 65 20 73 63 72 69 70  ext of the scrip
4640: 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69  t */.  char *zFi
4650: 6c 65 6e 61 6d 65 20 20 20 20 2f 2a 20 46 69 6c  lename    /* Fil
4660: 65 20 66 72 6f 6d 20 77 68 69 63 68 20 73 63 72  e from which scr
4670: 69 70 74 20 77 61 73 20 72 65 61 64 2e 20 2a 2f  ipt was read. */
4680: 0a 29 7b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f  .){.  int lineno
4690: 20 3d 20 31 3b 0a 20 20 69 6e 74 20 70 72 65 76   = 1;.  int prev
46a0: 4c 69 6e 65 20 3d 20 31 3b 0a 20 20 69 6e 74 20  Line = 1;.  int 
46b0: 69 69 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 42  ii = 0;.  int iB
46c0: 65 67 69 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20  egin = 0;.  int 
46d0: 6e 2c 20 63 2c 20 6a 3b 0a 20 20 69 6e 74 20 6c  n, c, j;.  int l
46e0: 65 6e 3b 0a 20 20 69 6e 74 20 6e 41 72 67 3b 0a  en;.  int nArg;.
46f0: 20 20 53 74 72 69 6e 67 20 73 52 65 73 75 6c 74    String sResult
4700: 3b 0a 20 20 63 68 61 72 20 7a 43 6d 64 5b 33 30  ;.  char zCmd[30
4710: 5d 3b 0a 20 20 63 68 61 72 20 7a 45 72 72 6f 72  ];.  char zError
4720: 5b 31 30 30 30 5d 3b 0a 20 20 63 68 61 72 20 61  [1000];.  char a
4730: 7a 41 72 67 5b 4d 58 5f 41 52 47 5d 5b 31 30 30  zArg[MX_ARG][100
4740: 5d 3b 0a 0a 20 20 6d 65 6d 73 65 74 28 26 73 52  ];..  memset(&sR
4750: 65 73 75 6c 74 2c 20 30 2c 20 73 69 7a 65 6f 66  esult, 0, sizeof
4760: 28 73 52 65 73 75 6c 74 29 29 3b 0a 20 20 73 74  (sResult));.  st
4770: 72 69 6e 67 52 65 73 65 74 28 26 73 52 65 73 75  ringReset(&sResu
4780: 6c 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 28 63  lt);.  while( (c
4790: 20 3d 20 7a 53 63 72 69 70 74 5b 69 69 5d 29 21   = zScript[ii])!
47a0: 3d 30 20 29 7b 0a 20 20 20 20 70 72 65 76 4c 69  =0 ){.    prevLi
47b0: 6e 65 20 3d 20 6c 69 6e 65 6e 6f 3b 0a 20 20 20  ne = lineno;.   
47c0: 20 6c 65 6e 20 3d 20 74 6f 6b 65 6e 4c 65 6e 67   len = tokenLeng
47d0: 74 68 28 7a 53 63 72 69 70 74 2b 69 69 2c 20 26  th(zScript+ii, &
47e0: 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 69 66 28  lineno);.    if(
47f0: 20 69 73 73 70 61 63 65 28 63 29 20 7c 7c 20 28   isspace(c) || (
4800: 63 3d 3d 27 2f 27 20 26 26 20 7a 53 63 72 69 70  c=='/' && zScrip
4810: 74 5b 69 69 2b 31 5d 3d 3d 27 2a 27 29 20 29 7b  t[ii+1]=='*') ){
4820: 0a 20 20 20 20 20 20 69 69 20 2b 3d 20 6c 65 6e  .      ii += len
4830: 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65  ;.      continue
4840: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
4850: 63 21 3d 27 2d 27 20 7c 7c 20 7a 53 63 72 69 70  c!='-' || zScrip
4860: 74 5b 69 69 2b 31 5d 21 3d 27 2d 27 20 7c 7c 20  t[ii+1]!='-' || 
4870: 21 69 73 61 6c 70 68 61 28 7a 53 63 72 69 70 74  !isalpha(zScript
4880: 5b 69 69 2b 32 5d 29 20 29 7b 0a 20 20 20 20 20  [ii+2]) ){.     
4890: 20 69 69 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20   ii += len;.    
48a0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
48b0: 7d 0a 0a 20 20 20 20 2f 2a 20 52 75 6e 20 61 6e  }..    /* Run an
48c0: 79 20 70 72 69 6f 72 20 53 51 4c 20 62 65 66 6f  y prior SQL befo
48d0: 72 65 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68  re processing th
48e0: 65 20 6e 65 77 20 2d 2d 63 6f 6d 6d 61 6e 64 20  e new --command 
48f0: 2a 2f 0a 20 20 20 20 69 66 28 20 69 69 3e 69 42  */.    if( ii>iB
4900: 65 67 69 6e 20 29 7b 0a 20 20 20 20 20 20 63 68  egin ){.      ch
4910: 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ar *zSql = sqlit
4920: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 2e 2a 73  e3_mprintf("%.*s
4930: 22 2c 20 69 69 2d 69 42 65 67 69 6e 2c 20 7a 53  ", ii-iBegin, zS
4940: 63 72 69 70 74 2b 69 42 65 67 69 6e 29 3b 0a 20  cript+iBegin);. 
4950: 20 20 20 20 20 65 76 61 6c 53 71 6c 28 26 73 52       evalSql(&sR
4960: 65 73 75 6c 74 2c 20 7a 53 71 6c 29 3b 0a 20 20  esult, zSql);.  
4970: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
4980: 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 69 42  (zSql);.      iB
4990: 65 67 69 6e 20 3d 20 69 69 20 2b 20 6c 65 6e 3b  egin = ii + len;
49a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50  .    }..    /* P
49b0: 61 72 73 65 20 74 68 65 20 2d 2d 63 6f 6d 6d 61  arse the --comma
49c0: 6e 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 2e  nd */.    if( g.
49d0: 69 54 72 61 63 65 3e 3d 32 20 29 20 6c 6f 67 4d  iTrace>=2 ) logM
49e0: 65 73 73 61 67 65 28 22 25 2e 2a 73 22 2c 20 6c  essage("%.*s", l
49f0: 65 6e 2c 20 7a 53 63 72 69 70 74 2b 69 69 29 3b  en, zScript+ii);
4a00: 0a 20 20 20 20 6e 20 3d 20 65 78 74 72 61 63 74  .    n = extract
4a10: 54 6f 6b 65 6e 28 7a 53 63 72 69 70 74 2b 69 69  Token(zScript+ii
4a20: 2b 32 2c 20 6c 65 6e 2d 32 2c 20 7a 43 6d 64 2c  +2, len-2, zCmd,
4a30: 20 73 69 7a 65 6f 66 28 7a 43 6d 64 29 29 3b 0a   sizeof(zCmd));.
4a40: 20 20 20 20 66 6f 72 28 6e 41 72 67 3d 30 3b 20      for(nArg=0; 
4a50: 6e 3c 6c 65 6e 2d 32 20 26 26 20 6e 41 72 67 3c  n<len-2 && nArg<
4a60: 4d 58 5f 41 52 47 3b 20 6e 41 72 67 2b 2b 29 7b  MX_ARG; nArg++){
4a70: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 6e 3c  .      while( n<
4a80: 6c 65 6e 2d 32 20 26 26 20 69 73 73 70 61 63 65  len-2 && isspace
4a90: 28 7a 53 63 72 69 70 74 5b 69 69 2b 32 2b 6e 5d  (zScript[ii+2+n]
4aa0: 29 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 20 20 20  ) ){ n++; }.    
4ab0: 20 20 69 66 28 20 6e 3e 3d 6c 65 6e 2d 32 20 29    if( n>=len-2 )
4ac0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 6e 20   break;.      n 
4ad0: 2b 3d 20 65 78 74 72 61 63 74 54 6f 6b 65 6e 28  += extractToken(
4ae0: 7a 53 63 72 69 70 74 2b 69 69 2b 32 2b 6e 2c 20  zScript+ii+2+n, 
4af0: 6c 65 6e 2d 32 2d 6e 2c 0a 20 20 20 20 20 20 20  len-2-n,.       
4b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b10: 20 61 7a 41 72 67 5b 6e 41 72 67 5d 2c 20 73 69   azArg[nArg], si
4b20: 7a 65 6f 66 28 61 7a 41 72 67 5b 6e 41 72 67 5d  zeof(azArg[nArg]
4b30: 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ));.    }.    fo
4b40: 72 28 6a 3d 6e 41 72 67 3b 20 6a 3c 4d 58 5f 41  r(j=nArg; j<MX_A
4b50: 52 47 3b 20 6a 2b 2b 29 20 61 7a 41 72 67 5b 6a  RG; j++) azArg[j
4b60: 2b 2b 5d 5b 30 5d 20 3d 20 30 3b 0a 0a 20 20 20  ++][0] = 0;..   
4b70: 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 2d 2d 73 6c   /*.    **  --sl
4b80: 65 65 70 20 4e 0a 20 20 20 20 2a 2a 0a 20 20 20  eep N.    **.   
4b90: 20 2a 2a 20 50 61 75 73 65 20 66 6f 72 20 4e 20   ** Pause for N 
4ba0: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 0a 20 20 20  milliseconds.   
4bb0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63   */.    if( strc
4bc0: 6d 70 28 7a 43 6d 64 2c 20 22 73 6c 65 65 70 22  mp(zCmd, "sleep"
4bd0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
4be0: 6c 69 74 65 33 5f 73 6c 65 65 70 28 61 74 6f 69  lite3_sleep(atoi
4bf0: 28 61 7a 41 72 67 5b 30 5d 29 29 3b 0a 20 20 20  (azArg[0]));.   
4c00: 20 7d 65 6c 73 65 20 0a 0a 20 20 20 20 2f 2a 0a   }else ..    /*.
4c10: 20 20 20 20 2a 2a 20 20 20 2d 2d 65 78 69 74 20      **   --exit 
4c20: 4e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  N.    **.    ** 
4c30: 45 78 69 74 20 74 68 69 73 20 70 72 6f 63 65 73  Exit this proces
4c40: 73 2e 20 20 49 66 20 4e 3e 30 20 74 68 65 6e 20  s.  If N>0 then 
4c50: 65 78 69 74 20 77 69 74 68 6f 75 74 20 73 68 75  exit without shu
4c60: 74 74 69 6e 67 20 64 6f 77 6e 0a 20 20 20 20 2a  tting down.    *
4c70: 2a 20 53 51 4c 69 74 65 2e 20 20 28 49 6e 20 6f  * SQLite.  (In o
4c80: 74 68 65 72 20 77 6f 72 64 73 2c 20 73 69 6d 75  ther words, simu
4c90: 6c 61 74 65 20 61 20 63 72 61 73 68 2e 29 0a 20  late a crash.). 
4ca0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74     */.    if( st
4cb0: 72 63 6d 70 28 7a 43 6d 64 2c 20 22 65 78 69 74  rcmp(zCmd, "exit
4cc0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
4cd0: 6e 74 20 72 63 20 3d 20 61 74 6f 69 28 61 7a 41  nt rc = atoi(azA
4ce0: 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 66 69  rg[0]);.      fi
4cf0: 6e 69 73 68 53 63 72 69 70 74 28 69 43 6c 69 65  nishScript(iClie
4d00: 6e 74 2c 20 74 61 73 6b 49 64 2c 20 31 29 3b 0a  nt, taskId, 1);.
4d10: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20        if( rc==0 
4d20: 29 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28  ) sqlite3_close(
4d30: 67 2e 64 62 29 3b 0a 20 20 20 20 20 20 65 78 69  g.db);.      exi
4d40: 74 28 72 63 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t(rc);.    }else
4d50: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
4d60: 20 2d 2d 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a   --result.    **
4d70: 0a 20 20 20 20 2a 2a 20 52 65 73 65 74 20 61 63  .    ** Reset ac
4d80: 63 75 6d 75 6c 61 74 65 64 20 72 65 73 75 6c 74  cumulated result
4d90: 73 20 62 61 63 6b 20 74 6f 20 61 6e 20 65 6d 70  s back to an emp
4da0: 74 79 20 73 74 72 69 6e 67 0a 20 20 20 20 2a 2f  ty string.    */
4db0: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
4dc0: 7a 43 6d 64 2c 20 22 72 65 73 65 74 22 29 3d 3d  zCmd, "reset")==
4dd0: 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 69 6e  0 ){.      strin
4de0: 67 52 65 73 65 74 28 26 73 52 65 73 75 6c 74 29  gReset(&sResult)
4df0: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20  ;.    }else..   
4e00: 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 2d 2d 6d 61   /*.    **  --ma
4e10: 74 63 68 20 41 4e 53 57 45 52 2e 2e 2e 0a 20 20  tch ANSWER....  
4e20: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 68 65 63    **.    ** Chec
4e30: 6b 20 74 6f 20 73 65 65 20 69 66 20 6f 75 74 70  k to see if outp
4e40: 75 74 20 6d 61 74 63 68 65 73 20 41 4e 53 57 45  ut matches ANSWE
4e50: 52 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 72  R.  Report an er
4e60: 72 6f 72 20 69 66 20 6e 6f 74 2e 0a 20 20 20 20  ror if not..    
4e70: 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  */.    if( strcm
4e80: 70 28 7a 43 6d 64 2c 20 22 6d 61 74 63 68 22 29  p(zCmd, "match")
4e90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
4ea0: 20 6a 6a 3b 0a 20 20 20 20 20 20 63 68 61 72 20   jj;.      char 
4eb0: 2a 7a 41 6e 73 20 3d 20 7a 53 63 72 69 70 74 2b  *zAns = zScript+
4ec0: 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a  ii;.      for(jj
4ed0: 3d 37 3b 20 6a 6a 3c 6c 65 6e 2d 31 20 26 26 20  =7; jj<len-1 && 
4ee0: 69 73 73 70 61 63 65 28 7a 41 6e 73 5b 6a 6a 5d  isspace(zAns[jj]
4ef0: 29 3b 20 6a 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20  ); jj++){}.     
4f00: 20 7a 41 6e 73 20 2b 3d 20 6a 6a 3b 0a 20 20 20   zAns += jj;.   
4f10: 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 73     if( strncmp(s
4f20: 52 65 73 75 6c 74 2e 7a 2c 20 7a 41 6e 73 2c 20  Result.z, zAns, 
4f30: 6c 65 6e 2d 6a 6a 2d 31 29 20 29 7b 0a 20 20 20  len-jj-1) ){.   
4f40: 20 20 20 20 20 65 72 72 6f 72 4d 65 73 73 61 67       errorMessag
4f50: 65 28 22 6c 69 6e 65 20 25 64 20 6f 66 20 25 73  e("line %d of %s
4f60: 3a 5c 6e 45 78 70 65 63 74 65 64 20 5b 25 2e 2a  :\nExpected [%.*
4f70: 73 5d 5c 6e 20 20 20 20 20 47 6f 74 20 5b 25 73  s]\n     Got [%s
4f80: 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 72  ]",.          pr
4f90: 65 76 4c 69 6e 65 2c 20 7a 46 69 6c 65 6e 61 6d  evLine, zFilenam
4fa0: 65 2c 20 6c 65 6e 2d 6a 6a 2d 31 2c 20 7a 41 6e  e, len-jj-1, zAn
4fb0: 73 2c 20 73 52 65 73 75 6c 74 2e 7a 29 3b 0a 20  s, sResult.z);. 
4fc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 2e 6e       }.      g.n
4fd0: 54 65 73 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74  Test++;.      st
4fe0: 72 69 6e 67 52 65 73 65 74 28 26 73 52 65 73 75  ringReset(&sResu
4ff0: 6c 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 0a  lt);.    }else..
5000: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 2d      /*.    **  -
5010: 2d 73 6f 75 72 63 65 20 46 49 4c 45 4e 41 4d 45  -source FILENAME
5020: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52  .    **.    ** R
5030: 75 6e 20 61 20 73 75 62 73 63 72 69 70 74 20 66  un a subscript f
5040: 72 6f 6d 20 61 20 73 65 70 61 72 61 74 65 20 66  rom a separate f
5050: 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
5060: 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c  if( strcmp(zCmd,
5070: 20 22 73 6f 75 72 63 65 22 29 3d 3d 30 20 29 7b   "source")==0 ){
5080: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65  .      char *zNe
5090: 77 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 30 5d  wFile = azArg[0]
50a0: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e  ;.      char *zN
50b0: 65 77 53 63 72 69 70 74 20 3d 20 72 65 61 64 46  ewScript = readF
50c0: 69 6c 65 28 7a 4e 65 77 46 69 6c 65 29 3b 0a 20  ile(zNewFile);. 
50d0: 20 20 20 20 20 69 66 28 20 67 2e 69 54 72 61 63       if( g.iTrac
50e0: 65 20 29 20 6c 6f 67 4d 65 73 73 61 67 65 28 22  e ) logMessage("
50f0: 62 65 67 69 6e 20 73 63 72 69 70 74 20 5b 25 73  begin script [%s
5100: 5d 5c 6e 22 2c 20 7a 4e 65 77 46 69 6c 65 29 3b  ]\n", zNewFile);
5110: 0a 20 20 20 20 20 20 72 75 6e 53 63 72 69 70 74  .      runScript
5120: 28 30 2c 20 30 2c 20 7a 4e 65 77 53 63 72 69 70  (0, 0, zNewScrip
5130: 74 2c 20 7a 4e 65 77 46 69 6c 65 29 3b 0a 20 20  t, zNewFile);.  
5140: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
5150: 28 7a 4e 65 77 53 63 72 69 70 74 29 3b 0a 20 20  (zNewScript);.  
5160: 20 20 20 20 69 66 28 20 67 2e 69 54 72 61 63 65      if( g.iTrace
5170: 20 29 20 6c 6f 67 4d 65 73 73 61 67 65 28 22 65   ) logMessage("e
5180: 6e 64 20 73 63 72 69 70 74 20 5b 25 73 5d 5c 6e  nd script [%s]\n
5190: 22 2c 20 7a 4e 65 77 46 69 6c 65 29 3b 0a 20 20  ", zNewFile);.  
51a0: 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a    }else..    /*.
51b0: 20 20 20 20 2a 2a 20 20 2d 2d 70 72 69 6e 74 20      **  --print 
51c0: 4d 45 53 53 41 47 45 2e 2e 2e 2e 0a 20 20 20 20  MESSAGE.....    
51d0: 2a 2a 0a 20 20 20 20 2a 2a 20 4f 75 74 70 75 74  **.    ** Output
51e0: 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   the remainder o
51f0: 66 20 74 68 65 20 6c 69 6e 65 20 74 6f 20 74 68  f the line to th
5200: 65 20 6c 6f 67 20 66 69 6c 65 0a 20 20 20 20 2a  e log file.    *
5210: 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  /.    if( strcmp
5220: 28 7a 43 6d 64 2c 20 22 70 72 69 6e 74 22 29 3d  (zCmd, "print")=
5230: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
5240: 6a 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a  jj;.      for(jj
5250: 3d 37 3b 20 6a 6a 3c 6c 65 6e 20 26 26 20 69 73  =7; jj<len && is
5260: 73 70 61 63 65 28 7a 53 63 72 69 70 74 5b 69 69  space(zScript[ii
5270: 2b 6a 6a 5d 29 3b 20 6a 6a 2b 2b 29 7b 7d 0a 20  +jj]); jj++){}. 
5280: 20 20 20 20 20 6c 6f 67 4d 65 73 73 61 67 65 28       logMessage(
5290: 22 25 2e 2a 73 22 2c 20 6c 65 6e 2d 6a 6a 2c 20  "%.*s", len-jj, 
52a0: 7a 53 63 72 69 70 74 2b 69 69 2b 6a 6a 29 3b 0a  zScript+ii+jj);.
52b0: 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f      }else..    /
52c0: 2a 0a 20 20 20 20 2a 2a 20 20 2d 2d 73 74 61 72  *.    **  --star
52d0: 74 20 43 4c 49 45 4e 54 0a 20 20 20 20 2a 2a 0a  t CLIENT.    **.
52e0: 20 20 20 20 2a 2a 20 53 74 61 72 74 20 75 70 20      ** Start up 
52f0: 74 68 65 20 67 69 76 65 6e 20 63 6c 69 65 6e 74  the given client
5300: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
5310: 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 73   strcmp(zCmd, "s
5320: 74 61 72 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  tart")==0 ){.   
5330: 20 20 20 69 6e 74 20 69 4e 65 77 43 6c 69 65 6e     int iNewClien
5340: 74 20 3d 20 61 74 6f 69 28 61 7a 41 72 67 5b 30  t = atoi(azArg[0
5350: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 4e  ]);.      if( iN
5360: 65 77 43 6c 69 65 6e 74 3e 30 20 29 7b 0a 20 20  ewClient>0 ){.  
5370: 20 20 20 20 20 20 73 74 61 72 74 43 6c 69 65 6e        startClien
5380: 74 28 69 4e 65 77 43 6c 69 65 6e 74 29 3b 0a 20  t(iNewClient);. 
5390: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
53a0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
53b0: 20 2d 2d 77 61 69 74 20 43 4c 49 45 4e 54 20 54   --wait CLIENT T
53c0: 49 4d 45 4f 55 54 0a 20 20 20 20 2a 2a 0a 20 20  IMEOUT.    **.  
53d0: 20 20 2a 2a 20 57 61 69 74 20 75 6e 74 69 6c 20    ** Wait until 
53e0: 61 6c 6c 20 74 61 73 6b 73 20 63 6f 6d 70 6c 65  all tasks comple
53f0: 74 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  te for the given
5400: 20 63 6c 69 65 6e 74 2e 20 20 49 66 20 43 4c 49   client.  If CLI
5410: 45 4e 54 20 69 73 0a 20 20 20 20 2a 2a 20 22 61  ENT is.    ** "a
5420: 6c 6c 22 20 74 68 65 6e 20 77 61 69 74 20 66 6f  ll" then wait fo
5430: 72 20 61 6c 6c 20 63 6c 69 65 6e 74 73 20 74 6f  r all clients to
5440: 20 63 6f 6d 70 6c 65 74 65 2e 20 20 57 61 69 74   complete.  Wait
5450: 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a   no longer than.
5460: 20 20 20 20 2a 2a 20 54 49 4d 45 4f 55 54 20 6d      ** TIMEOUT m
5470: 69 6c 6c 69 73 65 63 6f 6e 64 73 20 28 64 65 66  illiseconds (def
5480: 61 75 6c 74 20 31 30 2c 30 30 30 29 0a 20 20 20  ault 10,000).   
5490: 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63   */.    if( strc
54a0: 6d 70 28 7a 43 6d 64 2c 20 22 77 61 69 74 22 29  mp(zCmd, "wait")
54b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
54c0: 20 69 54 69 6d 65 6f 75 74 20 3d 20 6e 41 72 67   iTimeout = nArg
54d0: 3e 3d 32 20 3f 20 61 74 6f 69 28 61 7a 41 72 67  >=2 ? atoi(azArg
54e0: 5b 31 5d 29 20 3a 20 31 30 30 30 30 3b 0a 20 20  [1]) : 10000;.  
54f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
5500: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 45 72 72  intf(sizeof(zErr
5510: 6f 72 29 2c 7a 45 72 72 6f 72 2c 22 6c 69 6e 65  or),zError,"line
5520: 20 25 64 20 6f 66 20 25 73 5c 6e 22 2c 0a 20 20   %d of %s\n",.  
5530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5540: 20 20 20 20 20 70 72 65 76 4c 69 6e 65 2c 20 7a       prevLine, z
5550: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
5560: 20 77 61 69 74 46 6f 72 43 6c 69 65 6e 74 28 61   waitForClient(a
5570: 74 6f 69 28 61 7a 41 72 67 5b 30 5d 29 2c 20 69  toi(azArg[0]), i
5580: 54 69 6d 65 6f 75 74 2c 20 7a 45 72 72 6f 72 29  Timeout, zError)
5590: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20  ;.    }else..   
55a0: 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 2d 2d 74 61   /*.    **  --ta
55b0: 73 6b 20 43 4c 49 45 4e 54 0a 20 20 20 20 2a 2a  sk CLIENT.    **
55c0: 20 20 20 20 20 3c 74 61 73 6b 2d 63 6f 6e 74 65       <task-conte
55d0: 6e 74 2d 68 65 72 65 3e 0a 20 20 20 20 2a 2a 20  nt-here>.    ** 
55e0: 20 2d 2d 65 6e 64 0a 20 20 20 20 2a 2a 0a 20 20   --end.    **.  
55f0: 20 20 2a 2a 20 41 73 73 69 67 6e 20 77 6f 72 6b    ** Assign work
5600: 20 74 6f 20 61 20 63 6c 69 65 6e 74 2e 20 20 53   to a client.  S
5610: 74 61 72 74 20 74 68 65 20 63 6c 69 65 6e 74 20  tart the client 
5620: 69 66 20 69 74 20 69 73 20 6e 6f 74 20 72 75 6e  if it is not run
5630: 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 61 6c 72 65  ning.    ** alre
5640: 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
5650: 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c  if( strcmp(zCmd,
5660: 20 22 74 61 73 6b 22 29 3d 3d 30 20 29 7b 0a 20   "task")==0 ){. 
5670: 20 20 20 20 20 69 6e 74 20 69 54 61 72 67 65 74       int iTarget
5680: 20 3d 20 61 74 6f 69 28 61 7a 41 72 67 5b 30 5d   = atoi(azArg[0]
5690: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 45 6e  );.      int iEn
56a0: 64 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  d;.      char *z
56b0: 54 61 73 6b 3b 0a 20 20 20 20 20 20 69 45 6e 64  Task;.      iEnd
56c0: 20 3d 20 66 69 6e 64 45 6e 64 28 7a 53 63 72 69   = findEnd(zScri
56d0: 70 74 2b 69 69 2b 6c 65 6e 2c 20 26 6c 69 6e 65  pt+ii+len, &line
56e0: 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  no);.      if( i
56f0: 54 61 72 67 65 74 3c 30 20 29 7b 0a 20 20 20 20  Target<0 ){.    
5700: 20 20 20 20 65 72 72 6f 72 4d 65 73 73 61 67 65      errorMessage
5710: 28 22 6c 69 6e 65 20 25 64 20 6f 66 20 25 73 3a  ("line %d of %s:
5720: 20 62 61 64 20 63 6c 69 65 6e 74 20 6e 75 6d 62   bad client numb
5730: 65 72 3a 20 25 64 22 2c 0a 20 20 20 20 20 20 20  er: %d",.       
5740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
5750: 65 76 4c 69 6e 65 2c 20 7a 46 69 6c 65 6e 61 6d  evLine, zFilenam
5760: 65 2c 20 69 54 61 72 67 65 74 29 3b 0a 20 20 20  e, iTarget);.   
5770: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5780: 20 20 7a 54 61 73 6b 20 3d 20 73 71 6c 69 74 65    zTask = sqlite
5790: 33 5f 6d 70 72 69 6e 74 66 28 22 25 2e 2a 73 22  3_mprintf("%.*s"
57a0: 2c 20 69 45 6e 64 2c 20 7a 53 63 72 69 70 74 2b  , iEnd, zScript+
57b0: 69 69 2b 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20  ii+len);.       
57c0: 20 73 74 61 72 74 43 6c 69 65 6e 74 28 69 54 61   startClient(iTa
57d0: 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72  rget);.        r
57e0: 75 6e 53 71 6c 28 22 49 4e 53 45 52 54 20 49 4e  unSql("INSERT IN
57f0: 54 4f 20 74 61 73 6b 28 63 6c 69 65 6e 74 2c 73  TO task(client,s
5800: 63 72 69 70 74 29 22 0a 20 20 20 20 20 20 20 20  cript)".        
5810: 20 20 20 20 20 20 20 22 20 56 41 4c 55 45 53 28         " VALUES(
5820: 25 64 2c 27 25 71 27 29 22 2c 20 69 54 61 72 67  %d,'%q')", iTarg
5830: 65 74 2c 20 7a 54 61 73 6b 29 3b 0a 20 20 20 20  et, zTask);.    
5840: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
5850: 28 7a 54 61 73 6b 29 3b 0a 20 20 20 20 20 20 7d  (zTask);.      }
5860: 0a 20 20 20 20 20 20 69 45 6e 64 20 2b 3d 20 74  .      iEnd += t
5870: 6f 6b 65 6e 4c 65 6e 67 74 68 28 7a 53 63 72 69  okenLength(zScri
5880: 70 74 2b 69 69 2b 6c 65 6e 2b 69 45 6e 64 2c 20  pt+ii+len+iEnd, 
5890: 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20  &lineno);.      
58a0: 6c 65 6e 20 2b 3d 20 69 45 6e 64 3b 0a 20 20 20  len += iEnd;.   
58b0: 20 20 20 69 42 65 67 69 6e 20 3d 20 69 69 2b 6c     iBegin = ii+l
58c0: 65 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20  en;.    }else.. 
58d0: 20 20 20 2f 2a 20 65 72 72 6f 72 20 2a 2f 7b 0a     /* error */{.
58e0: 20 20 20 20 20 20 65 72 72 6f 72 4d 65 73 73 61        errorMessa
58f0: 67 65 28 22 6c 69 6e 65 20 25 64 20 6f 66 20 25  ge("line %d of %
5900: 73 3a 20 75 6e 6b 6e 6f 77 6e 20 63 6f 6d 6d 61  s: unknown comma
5910: 6e 64 20 2d 2d 25 73 22 2c 0a 20 20 20 20 20 20  nd --%s",.      
5920: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65               pre
5930: 76 4c 69 6e 65 2c 20 7a 46 69 6c 65 6e 61 6d 65  vLine, zFilename
5940: 2c 20 7a 43 6d 64 29 3b 0a 20 20 20 20 7d 0a 20  , zCmd);.    }. 
5950: 20 20 20 69 69 20 2b 3d 20 6c 65 6e 3b 0a 20 20     ii += len;.  
5960: 7d 0a 20 20 69 66 28 20 69 42 65 67 69 6e 3c 69  }.  if( iBegin<i
5970: 69 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  i ){.    char *z
5980: 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
5990: 72 69 6e 74 66 28 22 25 2e 2a 73 22 2c 20 69 69  rintf("%.*s", ii
59a0: 2d 69 42 65 67 69 6e 2c 20 7a 53 63 72 69 70 74  -iBegin, zScript
59b0: 2b 69 42 65 67 69 6e 29 3b 0a 20 20 20 20 72 75  +iBegin);.    ru
59c0: 6e 53 71 6c 28 7a 53 71 6c 29 3b 0a 20 20 20 20  nSql(zSql);.    
59d0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
59e0: 6c 29 3b 0a 20 20 7d 0a 20 20 73 74 72 69 6e 67  l);.  }.  string
59f0: 46 72 65 65 28 26 73 52 65 73 75 6c 74 29 3b 0a  Free(&sResult);.
5a00: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 66 6f  }../*.** Look fo
5a10: 72 20 61 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  r a command-line
5a20: 20 6f 70 74 69 6f 6e 2e 20 20 49 66 20 70 72 65   option.  If pre
5a30: 73 65 6e 74 2c 20 72 65 74 75 72 6e 20 61 20 70  sent, return a p
5a40: 6f 69 6e 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72  ointer..** Retur
5a50: 6e 20 4e 55 4c 4c 20 69 66 20 6d 69 73 73 69 6e  n NULL if missin
5a60: 67 2e 0a 2a 2a 0a 2a 2a 20 68 61 73 41 72 67 3d  g..**.** hasArg=
5a70: 3d 30 20 6d 65 61 6e 73 20 74 68 65 20 6f 70 74  =0 means the opt
5a80: 69 6f 6e 20 69 73 20 61 20 66 6c 61 67 2e 20 20  ion is a flag.  
5a90: 49 74 20 69 73 20 65 69 74 68 65 72 20 70 72 65  It is either pre
5aa0: 73 65 6e 74 20 6f 72 20 6e 6f 74 2e 0a 2a 2a 20  sent or not..** 
5ab0: 68 61 73 41 72 67 3d 3d 31 20 6d 65 61 6e 73 20  hasArg==1 means 
5ac0: 74 68 65 20 6f 70 74 69 6f 6e 20 68 61 73 20 61  the option has a
5ad0: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 20 52 65 74  n argument.  Ret
5ae0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
5af0: 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   the.** argument
5b00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
5b10: 20 2a 66 69 6e 64 4f 70 74 69 6f 6e 28 0a 20 20   *findOption(.  
5b20: 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 0a 20 20  char **azArg,.  
5b30: 69 6e 74 20 2a 70 6e 41 72 67 2c 0a 20 20 63 6f  int *pnArg,.  co
5b40: 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 69 6f  nst char *zOptio
5b50: 6e 2c 0a 20 20 69 6e 74 20 68 61 73 41 72 67 0a  n,.  int hasArg.
5b60: 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
5b70: 20 63 68 61 72 20 2a 7a 52 65 74 75 72 6e 20 3d   char *zReturn =
5b80: 20 30 3b 0a 20 20 69 6e 74 20 6e 41 72 67 20 3d   0;.  int nArg =
5b90: 20 2a 70 6e 41 72 67 3b 0a 0a 20 20 61 73 73 65   *pnArg;..  asse
5ba0: 72 74 28 20 68 61 73 41 72 67 3d 3d 30 20 7c 7c  rt( hasArg==0 ||
5bb0: 20 68 61 73 41 72 67 3d 3d 31 20 29 3b 0a 20 20   hasArg==1 );.  
5bc0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
5bd0: 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74   i++){.    const
5be0: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66   char *z;.    if
5bf0: 28 20 69 2b 68 61 73 41 72 67 20 3e 3d 20 6e 41  ( i+hasArg >= nA
5c00: 72 67 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  rg ) break;.    
5c10: 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20  z = azArg[i];.  
5c20: 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 2d 27 20    if( z[0]!='-' 
5c30: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
5c40: 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30  z++;.    if( z[0
5c50: 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20  ]=='-' ){.      
5c60: 69 66 28 20 7a 5b 31 5d 3d 3d 30 20 29 20 62 72  if( z[1]==0 ) br
5c70: 65 61 6b 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a  eak;.      z++;.
5c80: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
5c90: 72 63 6d 70 28 7a 2c 7a 4f 70 74 69 6f 6e 29 3d  rcmp(z,zOption)=
5ca0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
5cb0: 68 61 73 41 72 67 20 26 26 20 69 3d 3d 6e 41 72  hasArg && i==nAr
5cc0: 67 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 66  g-1 ){.        f
5cd0: 61 74 61 6c 45 72 72 6f 72 28 22 63 6f 6d 6d 61  atalError("comma
5ce0: 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 5c  nd-line option \
5cf0: 22 2d 2d 25 73 5c 22 20 72 65 71 75 69 72 65 73  "--%s\" requires
5d00: 20 61 6e 20 61 72 67 75 6d 65 6e 74 22 2c 20 7a   an argument", z
5d10: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
5d20: 20 69 66 28 20 68 61 73 41 72 67 20 29 7b 0a 20   if( hasArg ){. 
5d30: 20 20 20 20 20 20 20 7a 52 65 74 75 72 6e 20 3d         zReturn =
5d40: 20 61 7a 41 72 67 5b 69 2b 31 5d 3b 0a 20 20 20   azArg[i+1];.   
5d50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5d60: 20 20 7a 52 65 74 75 72 6e 20 3d 20 61 7a 41 72    zReturn = azAr
5d70: 67 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  g[i];.      }.  
5d80: 20 20 20 20 6a 20 3d 20 69 2b 31 2b 28 68 61 73      j = i+1+(has
5d90: 41 72 67 21 3d 30 29 3b 0a 20 20 20 20 20 20 77  Arg!=0);.      w
5da0: 68 69 6c 65 28 20 6a 3c 6e 41 72 67 20 29 20 61  hile( j<nArg ) a
5db0: 7a 41 72 67 5b 69 2b 2b 5d 20 3d 20 61 7a 41 72  zArg[i++] = azAr
5dc0: 67 5b 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 2a 70  g[j++];.      *p
5dd0: 6e 41 72 67 20 3d 20 69 3b 0a 20 20 20 20 20 20  nArg = i;.      
5de0: 72 65 74 75 72 6e 20 7a 52 65 74 75 72 6e 3b 0a  return zReturn;.
5df0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
5e00: 72 6e 20 7a 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f  rn zReturn;.}../
5e10: 2a 20 50 72 69 6e 74 20 61 20 75 73 61 67 65 20  * Print a usage 
5e20: 6d 65 73 73 61 67 65 20 66 6f 72 20 74 68 65 20  message for the 
5e30: 70 72 6f 67 72 61 6d 20 61 6e 64 20 65 78 69 74  program and exit
5e40: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
5e50: 75 73 61 67 65 28 63 6f 6e 73 74 20 63 68 61 72  usage(const char
5e60: 20 2a 61 72 67 76 30 29 7b 0a 20 20 69 6e 74 20   *argv0){.  int 
5e70: 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  i;.  const char 
5e80: 2a 7a 54 61 69 6c 20 3d 20 61 72 67 76 30 3b 0a  *zTail = argv0;.
5e90: 20 20 66 6f 72 28 69 3d 30 3b 20 61 72 67 76 30    for(i=0; argv0
5ea0: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  [i]; i++){.    i
5eb0: 66 28 20 61 72 67 76 30 5b 69 5d 3d 3d 27 2f 27  f( argv0[i]=='/'
5ec0: 20 29 20 7a 54 61 69 6c 20 3d 20 61 72 67 76 30   ) zTail = argv0
5ed0: 2b 69 2b 31 3b 0a 20 20 7d 0a 20 20 66 70 72 69  +i+1;.  }.  fpri
5ee0: 6e 74 66 28 73 74 64 65 72 72 2c 22 55 73 61 67  ntf(stderr,"Usag
5ef0: 65 3a 20 25 73 20 44 41 54 41 42 41 53 45 20 3f  e: %s DATABASE ?
5f00: 4f 50 54 49 4f 4e 53 3f 20 3f 53 43 52 49 50 54  OPTIONS? ?SCRIPT
5f10: 3f 5c 6e 22 2c 20 7a 54 61 69 6c 29 3b 0a 20 20  ?\n", zTail);.  
5f20: 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 2f 2a 20 52  exit(1);.}../* R
5f30: 65 70 6f 72 74 20 6f 6e 20 75 6e 72 65 63 6f 67  eport on unrecog
5f40: 6e 69 7a 65 64 20 61 72 67 75 6d 65 6e 74 73 20  nized arguments 
5f50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
5f60: 6e 72 65 63 6f 67 6e 69 7a 65 64 41 72 67 75 6d  nrecognizedArgum
5f70: 65 6e 74 73 28 0a 20 20 63 6f 6e 73 74 20 63 68  ents(.  const ch
5f80: 61 72 20 2a 61 72 67 76 30 2c 0a 20 20 69 6e 74  ar *argv0,.  int
5f90: 20 6e 41 72 67 2c 0a 20 20 63 68 61 72 20 2a 2a   nArg,.  char **
5fa0: 61 7a 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20 69  azArg.){.  int i
5fb0: 3b 0a 20 20 66 70 72 69 6e 74 66 28 73 74 64 65  ;.  fprintf(stde
5fc0: 72 72 2c 22 25 73 3a 20 75 6e 72 65 63 6f 67 6e  rr,"%s: unrecogn
5fd0: 69 7a 65 64 20 61 72 67 75 6d 65 6e 74 73 3a 22  ized arguments:"
5fe0: 2c 20 61 72 67 76 30 29 3b 0a 20 20 66 6f 72 28  , argv0);.  for(
5ff0: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
6000: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
6010: 74 64 65 72 72 2c 22 20 25 73 22 2c 20 61 7a 41  tderr," %s", azA
6020: 72 67 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 70  rg[i]);.  }.  fp
6030: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 5c 6e  rintf(stderr,"\n
6040: 22 29 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d  ");.  exit(1);.}
6050: 0a 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61  ..int main(int a
6060: 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76  rgc, char **argv
6070: 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
6080: 2a 7a 43 6c 69 65 6e 74 3b 0a 20 20 69 6e 74 20  *zClient;.  int 
6090: 69 43 6c 69 65 6e 74 3b 0a 20 20 69 6e 74 20 6e  iClient;.  int n
60a0: 3b 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67  ;.  int openFlag
60b0: 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s = SQLITE_OPEN_
60c0: 52 45 41 44 57 52 49 54 45 3b 0a 20 20 69 6e 74  READWRITE;.  int
60d0: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 53 63   rc;.  char *zSc
60e0: 72 69 70 74 3b 0a 20 20 69 6e 74 20 74 61 73 6b  ript;.  int task
60f0: 49 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  Id;.  const char
6100: 20 2a 7a 54 72 61 63 65 3b 0a 0a 20 20 67 2e 61   *zTrace;..  g.a
6110: 72 67 76 30 20 3d 20 61 72 67 76 5b 30 5d 3b 0a  rgv0 = argv[0];.
6120: 20 20 67 2e 69 54 72 61 63 65 20 3d 20 31 3b 0a    g.iTrace = 1;.
6130: 20 20 69 66 28 20 61 72 67 63 3c 32 20 29 20 75    if( argc<2 ) u
6140: 73 61 67 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20  sage(argv[0]);. 
6150: 20 67 2e 7a 44 62 46 69 6c 65 20 3d 20 61 72 67   g.zDbFile = arg
6160: 76 5b 31 5d 3b 0a 20 20 6e 20 3d 20 61 72 67 63  v[1];.  n = argc
6170: 2d 32 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  -2;.  sqlite3_sn
6180: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 67 2e  printf(sizeof(g.
6190: 7a 4e 61 6d 65 29 2c 20 67 2e 7a 4e 61 6d 65 2c  zName), g.zName,
61a0: 20 22 6d 70 74 65 73 74 22 29 3b 0a 20 20 67 2e   "mptest");.  g.
61b0: 7a 56 66 73 20 3d 20 66 69 6e 64 4f 70 74 69 6f  zVfs = findOptio
61c0: 6e 28 61 72 67 76 2b 32 2c 20 26 6e 2c 20 22 76  n(argv+2, &n, "v
61d0: 66 73 22 2c 20 31 29 3b 0a 20 20 7a 43 6c 69 65  fs", 1);.  zClie
61e0: 6e 74 20 3d 20 66 69 6e 64 4f 70 74 69 6f 6e 28  nt = findOption(
61f0: 61 72 67 76 2b 32 2c 20 26 6e 2c 20 22 63 6c 69  argv+2, &n, "cli
6200: 65 6e 74 22 2c 20 31 29 3b 0a 20 20 67 2e 7a 45  ent", 1);.  g.zE
6210: 72 72 4c 6f 67 20 3d 20 66 69 6e 64 4f 70 74 69  rrLog = findOpti
6220: 6f 6e 28 61 72 67 76 2b 32 2c 20 26 6e 2c 20 22  on(argv+2, &n, "
6230: 65 72 72 6c 6f 67 22 2c 20 31 29 3b 0a 20 20 67  errlog", 1);.  g
6240: 2e 7a 4c 6f 67 20 3d 20 66 69 6e 64 4f 70 74 69  .zLog = findOpti
6250: 6f 6e 28 61 72 67 76 2b 32 2c 20 26 6e 2c 20 22  on(argv+2, &n, "
6260: 6c 6f 67 22 2c 20 31 29 3b 0a 20 20 7a 54 72 61  log", 1);.  zTra
6270: 63 65 20 3d 20 66 69 6e 64 4f 70 74 69 6f 6e 28  ce = findOption(
6280: 61 72 67 76 2b 32 2c 20 26 6e 2c 20 22 74 72 61  argv+2, &n, "tra
6290: 63 65 22 2c 20 31 29 3b 0a 20 20 69 66 28 20 7a  ce", 1);.  if( z
62a0: 54 72 61 63 65 20 29 20 67 2e 69 54 72 61 63 65  Trace ) g.iTrace
62b0: 20 3d 20 61 74 6f 69 28 7a 54 72 61 63 65 29 3b   = atoi(zTrace);
62c0: 0a 20 20 69 66 28 20 66 69 6e 64 4f 70 74 69 6f  .  if( findOptio
62d0: 6e 28 61 72 67 76 2b 32 2c 20 26 6e 2c 20 22 71  n(argv+2, &n, "q
62e0: 75 69 65 74 22 2c 20 30 29 21 3d 30 20 29 20 67  uiet", 0)!=0 ) g
62f0: 2e 69 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 67  .iTrace = 0;.  g
6300: 2e 62 53 71 6c 54 72 61 63 65 20 3d 20 66 69 6e  .bSqlTrace = fin
6310: 64 4f 70 74 69 6f 6e 28 61 72 67 76 2b 32 2c 20  dOption(argv+2, 
6320: 26 6e 2c 20 22 73 71 6c 74 72 61 63 65 22 2c 20  &n, "sqltrace", 
6330: 30 29 21 3d 30 3b 0a 20 20 69 66 28 20 67 2e 7a  0)!=0;.  if( g.z
6340: 45 72 72 4c 6f 67 20 29 7b 0a 20 20 20 20 67 2e  ErrLog ){.    g.
6350: 70 45 72 72 4c 6f 67 20 3d 20 66 6f 70 65 6e 28  pErrLog = fopen(
6360: 67 2e 7a 45 72 72 4c 6f 67 2c 20 22 61 22 29 3b  g.zErrLog, "a");
6370: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 67 2e  .  }else{.    g.
6380: 70 45 72 72 4c 6f 67 20 3d 20 73 74 64 65 72 72  pErrLog = stderr
6390: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 2e 7a 4c  ;.  }.  if( g.zL
63a0: 6f 67 20 29 7b 0a 20 20 20 20 67 2e 70 4c 6f 67  og ){.    g.pLog
63b0: 20 3d 20 66 6f 70 65 6e 28 67 2e 7a 4c 6f 67 2c   = fopen(g.zLog,
63c0: 20 22 61 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   "a");.  }else{.
63d0: 20 20 20 20 67 2e 70 4c 6f 67 20 3d 20 73 74 64      g.pLog = std
63e0: 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  out;.  }.  if( z
63f0: 43 6c 69 65 6e 74 20 29 7b 0a 20 20 20 20 69 43  Client ){.    iC
6400: 6c 69 65 6e 74 20 3d 20 61 74 6f 69 28 7a 43 6c  lient = atoi(zCl
6410: 69 65 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 69  ient);.    if( i
6420: 43 6c 69 65 6e 74 3c 31 20 29 20 66 61 74 61 6c  Client<1 ) fatal
6430: 45 72 72 6f 72 28 22 69 6c 6c 65 67 61 6c 20 63  Error("illegal c
6440: 6c 69 65 6e 74 20 6e 75 6d 62 65 72 3a 20 25 64  lient number: %d
6450: 5c 6e 22 2c 20 69 43 6c 69 65 6e 74 29 3b 0a 20  \n", iClient);. 
6460: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
6470: 6e 74 66 28 73 69 7a 65 6f 66 28 67 2e 7a 4e 61  ntf(sizeof(g.zNa
6480: 6d 65 29 2c 20 67 2e 7a 4e 61 6d 65 2c 20 22 63  me), g.zName, "c
6490: 6c 69 65 6e 74 25 30 32 64 22 2c 20 69 43 6c 69  lient%02d", iCli
64a0: 65 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ent);.  }else{. 
64b0: 20 20 20 69 43 6c 69 65 6e 74 20 3d 20 20 30 3b     iClient =  0;
64c0: 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 67 2e 7a 44  .    unlink(g.zD
64d0: 62 46 69 6c 65 29 3b 0a 20 20 20 20 6f 70 65 6e  bFile);.    open
64e0: 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  Flags |= SQLITE_
64f0: 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 7d  OPEN_CREATE;.  }
6500: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
6510: 6f 70 65 6e 5f 76 32 28 67 2e 7a 44 62 46 69 6c  open_v2(g.zDbFil
6520: 65 2c 20 26 67 2e 64 62 2c 20 6f 70 65 6e 46 6c  e, &g.db, openFl
6530: 61 67 73 2c 20 67 2e 7a 56 66 73 29 3b 0a 20 20  ags, g.zVfs);.  
6540: 69 66 28 20 72 63 20 29 20 66 61 74 61 6c 45 72  if( rc ) fatalEr
6550: 72 6f 72 28 22 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror("cannot open
6560: 20 5b 25 73 5d 22 2c 20 67 2e 7a 44 62 46 69 6c   [%s]", g.zDbFil
6570: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 75  e);.  sqlite3_bu
6580: 73 79 5f 68 61 6e 64 6c 65 72 28 67 2e 64 62 2c  sy_handler(g.db,
6590: 20 62 75 73 79 48 61 6e 64 6c 65 72 2c 20 30 29   busyHandler, 0)
65a0: 3b 0a 20 20 67 2e 69 54 69 6d 65 6f 75 74 20 3d  ;.  g.iTimeout =
65b0: 20 44 45 46 41 55 4c 54 5f 54 49 4d 45 4f 55 54   DEFAULT_TIMEOUT
65c0: 3b 0a 20 20 69 66 28 20 67 2e 62 53 71 6c 54 72  ;.  if( g.bSqlTr
65d0: 61 63 65 20 29 20 73 71 6c 69 74 65 33 5f 74 72  ace ) sqlite3_tr
65e0: 61 63 65 28 67 2e 64 62 2c 20 73 71 6c 54 72 61  ace(g.db, sqlTra
65f0: 63 65 43 61 6c 6c 62 61 63 6b 2c 20 30 29 3b 0a  ceCallback, 0);.
6600: 20 20 69 66 28 20 69 43 6c 69 65 6e 74 3e 30 20    if( iClient>0 
6610: 29 7b 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 29  ){.    if( n>0 )
6620: 20 75 6e 72 65 63 6f 67 6e 69 7a 65 64 41 72 67   unrecognizedArg
6630: 75 6d 65 6e 74 73 28 61 72 67 76 5b 30 5d 2c 20  uments(argv[0], 
6640: 6e 2c 20 61 72 67 76 2b 32 29 3b 0a 20 20 20 20  n, argv+2);.    
6650: 69 66 28 20 67 2e 69 54 72 61 63 65 20 29 20 6c  if( g.iTrace ) l
6660: 6f 67 4d 65 73 73 61 67 65 28 22 73 74 61 72 74  ogMessage("start
6670: 2d 63 6c 69 65 6e 74 22 29 3b 0a 20 20 20 20 77  -client");.    w
6680: 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 20 20 63  hile(1){.      c
6690: 68 61 72 20 7a 54 61 73 6b 4e 61 6d 65 5b 35 30  har zTaskName[50
66a0: 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 74  ];.      rc = st
66b0: 61 72 74 53 63 72 69 70 74 28 69 43 6c 69 65 6e  artScript(iClien
66c0: 74 2c 20 26 7a 53 63 72 69 70 74 2c 20 26 74 61  t, &zScript, &ta
66d0: 73 6b 49 64 29 3b 0a 20 20 20 20 20 20 69 66 28  skId);.      if(
66e0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
66f0: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
6700: 69 66 28 20 67 2e 69 54 72 61 63 65 20 29 20 6c  if( g.iTrace ) l
6710: 6f 67 4d 65 73 73 61 67 65 28 22 62 65 67 69 6e  ogMessage("begin
6720: 20 74 61 73 6b 20 25 64 22 2c 20 74 61 73 6b 49   task %d", taskI
6730: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
6740: 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
6750: 66 28 7a 54 61 73 6b 4e 61 6d 65 29 2c 20 7a 54  f(zTaskName), zT
6760: 61 73 6b 4e 61 6d 65 2c 20 22 63 6c 69 65 6e 74  askName, "client
6770: 25 30 32 64 2d 74 61 73 6b 2d 25 64 22 2c 0a 20  %02d-task-%d",. 
6780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6790: 20 20 20 20 20 20 69 43 6c 69 65 6e 74 2c 20 74        iClient, t
67a0: 61 73 6b 49 64 29 3b 0a 20 20 20 20 20 20 72 75  askId);.      ru
67b0: 6e 53 63 72 69 70 74 28 69 43 6c 69 65 6e 74 2c  nScript(iClient,
67c0: 20 74 61 73 6b 49 64 2c 20 7a 53 63 72 69 70 74   taskId, zScript
67d0: 2c 20 7a 54 61 73 6b 4e 61 6d 65 29 3b 0a 20 20  , zTaskName);.  
67e0: 20 20 20 20 69 66 28 20 67 2e 69 54 72 61 63 65      if( g.iTrace
67f0: 20 29 20 6c 6f 67 4d 65 73 73 61 67 65 28 22 65   ) logMessage("e
6800: 6e 64 20 74 61 73 6b 20 25 64 22 2c 20 74 61 73  nd task %d", tas
6810: 6b 49 64 29 3b 0a 20 20 20 20 20 20 66 69 6e 69  kId);.      fini
6820: 73 68 53 63 72 69 70 74 28 69 43 6c 69 65 6e 74  shScript(iClient
6830: 2c 20 74 61 73 6b 49 64 2c 20 30 29 3b 0a 20 20  , taskId, 0);.  
6840: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65      sqlite3_slee
6850: 70 28 31 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  p(10);.    }.   
6860: 20 69 66 28 20 67 2e 69 54 72 61 63 65 20 29 20   if( g.iTrace ) 
6870: 6c 6f 67 4d 65 73 73 61 67 65 28 22 65 6e 64 2d  logMessage("end-
6880: 63 6c 69 65 6e 74 22 29 3b 0a 20 20 7d 65 6c 73  client");.  }els
6890: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  e{.    sqlite3_s
68a0: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20  tmt *pStmt;.    
68b0: 69 6e 74 20 69 54 69 6d 65 6f 75 74 3b 0a 20 20  int iTimeout;.  
68c0: 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
68d0: 20 20 20 20 66 61 74 61 6c 45 72 72 6f 72 28 22      fatalError("
68e0: 6d 69 73 73 69 6e 67 20 73 63 72 69 70 74 20 66  missing script f
68f0: 69 6c 65 6e 61 6d 65 22 29 3b 0a 20 20 20 20 7d  ilename");.    }
6900: 0a 20 20 20 20 69 66 28 20 6e 3e 31 20 29 20 75  .    if( n>1 ) u
6910: 6e 72 65 63 6f 67 6e 69 7a 65 64 41 72 67 75 6d  nrecognizedArgum
6920: 65 6e 74 73 28 61 72 67 76 5b 30 5d 2c 20 6e 2c  ents(argv[0], n,
6930: 20 61 72 67 76 2b 32 29 3b 0a 20 20 20 20 72 75   argv+2);.    ru
6940: 6e 53 71 6c 28 0a 20 20 20 20 20 20 22 43 52 45  nSql(.      "CRE
6950: 41 54 45 20 54 41 42 4c 45 20 74 61 73 6b 28 5c  ATE TABLE task(\
6960: 6e 22 0a 20 20 20 20 20 20 22 20 20 69 64 20 49  n".      "  id I
6970: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
6980: 45 59 2c 5c 6e 22 0a 20 20 20 20 20 20 22 20 20  EY,\n".      "  
6990: 63 6c 69 65 6e 74 20 49 4e 54 45 47 45 52 2c 5c  client INTEGER,\
69a0: 6e 22 0a 20 20 20 20 20 20 22 20 20 73 74 61 72  n".      "  star
69b0: 74 74 69 6d 65 20 44 41 54 45 2c 5c 6e 22 0a 20  ttime DATE,\n". 
69c0: 20 20 20 20 20 22 20 20 65 6e 64 74 69 6d 65 20       "  endtime 
69d0: 44 41 54 45 2c 5c 6e 22 0a 20 20 20 20 20 20 22  DATE,\n".      "
69e0: 20 20 73 63 72 69 70 74 20 54 45 58 54 5c 6e 22    script TEXT\n"
69f0: 0a 20 20 20 20 20 20 22 29 3b 22 0a 20 20 20 20  .      ");".    
6a00: 20 20 22 43 52 45 41 54 45 20 49 4e 44 45 58 20    "CREATE INDEX 
6a10: 74 61 73 6b 5f 69 31 20 4f 4e 20 74 61 73 6b 28  task_i1 ON task(
6a20: 63 6c 69 65 6e 74 2c 20 73 74 61 72 74 74 69 6d  client, starttim
6a30: 65 29 3b 5c 6e 22 0a 20 20 20 20 20 20 22 43 52  e);\n".      "CR
6a40: 45 41 54 45 20 49 4e 44 45 58 20 74 61 73 6b 5f  EATE INDEX task_
6a50: 69 32 20 4f 4e 20 74 61 73 6b 28 63 6c 69 65 6e  i2 ON task(clien
6a60: 74 2c 20 65 6e 64 74 69 6d 65 29 3b 5c 6e 22 0a  t, endtime);\n".
6a70: 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41        "CREATE TA
6a80: 42 4c 45 20 63 6f 75 6e 74 65 72 73 28 6e 45 72  BLE counters(nEr
6a90: 72 6f 72 2c 6e 54 65 73 74 29 3b 5c 6e 22 0a 20  ror,nTest);\n". 
6aa0: 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54       "INSERT INT
6ab0: 4f 20 63 6f 75 6e 74 65 72 73 20 56 41 4c 55 45  O counters VALUE
6ac0: 53 28 30 2c 30 29 3b 5c 6e 22 0a 20 20 20 20 20  S(0,0);\n".     
6ad0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 63   "CREATE TABLE c
6ae0: 6c 69 65 6e 74 28 69 64 20 49 4e 54 45 47 45 52  lient(id INTEGER
6af0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 77 61   PRIMARY KEY, wa
6b00: 6e 74 48 61 6c 74 29 3b 5c 6e 22 0a 20 20 20 20  ntHalt);\n".    
6b10: 29 3b 0a 20 20 20 20 7a 53 63 72 69 70 74 20 3d  );.    zScript =
6b20: 20 72 65 61 64 46 69 6c 65 28 61 72 67 76 5b 32   readFile(argv[2
6b30: 5d 29 3b 0a 20 20 20 20 69 66 28 20 67 2e 69 54  ]);.    if( g.iT
6b40: 72 61 63 65 20 29 20 6c 6f 67 4d 65 73 73 61 67  race ) logMessag
6b50: 65 28 22 62 65 67 69 6e 20 73 63 72 69 70 74 20  e("begin script 
6b60: 5b 25 73 5d 5c 6e 22 2c 20 61 72 67 76 5b 32 5d  [%s]\n", argv[2]
6b70: 29 3b 0a 20 20 20 20 72 75 6e 53 63 72 69 70 74  );.    runScript
6b80: 28 30 2c 20 30 2c 20 7a 53 63 72 69 70 74 2c 20  (0, 0, zScript, 
6b90: 61 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 73 71  argv[2]);.    sq
6ba0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 63 72 69  lite3_free(zScri
6bb0: 70 74 29 3b 0a 20 20 20 20 69 66 28 20 67 2e 69  pt);.    if( g.i
6bc0: 54 72 61 63 65 20 29 20 6c 6f 67 4d 65 73 73 61  Trace ) logMessa
6bd0: 67 65 28 22 65 6e 64 20 73 63 72 69 70 74 20 5b  ge("end script [
6be0: 25 73 5d 5c 6e 22 2c 20 61 72 67 76 5b 32 5d 29  %s]\n", argv[2])
6bf0: 3b 0a 20 20 20 20 77 61 69 74 46 6f 72 43 6c 69  ;.    waitForCli
6c00: 65 6e 74 28 30 2c 20 32 30 30 30 2c 20 22 64 75  ent(0, 2000, "du
6c10: 72 69 6e 67 20 73 68 75 74 64 6f 77 6e 2e 2e 2e  ring shutdown...
6c20: 5c 6e 22 29 3b 0a 20 20 20 20 74 72 79 53 71 6c  \n");.    trySql
6c30: 28 22 55 50 44 41 54 45 20 63 6c 69 65 6e 74 20  ("UPDATE client 
6c40: 53 45 54 20 77 61 6e 74 48 61 6c 74 3d 31 22 29  SET wantHalt=1")
6c50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6c  ;.    sqlite3_sl
6c60: 65 65 70 28 31 30 29 3b 0a 20 20 20 20 67 2e 69  eep(10);.    g.i
6c70: 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 20 20 20  Timeout = 0;.   
6c80: 20 69 54 69 6d 65 6f 75 74 20 3d 20 31 30 30 30   iTimeout = 1000
6c90: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 28 72  ;.    while( ((r
6ca0: 63 20 3d 20 74 72 79 53 71 6c 28 22 53 45 4c 45  c = trySql("SELE
6cb0: 43 54 20 31 20 46 52 4f 4d 20 63 6c 69 65 6e 74  CT 1 FROM client
6cc0: 22 29 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  "))==SQLITE_BUSY
6cd0: 0a 20 20 20 20 20 20 20 20 7c 7c 20 72 63 3d 3d  .        || rc==
6ce0: 53 51 4c 49 54 45 5f 52 4f 57 29 20 26 26 20 69  SQLITE_ROW) && i
6cf0: 54 69 6d 65 6f 75 74 3e 30 20 29 7b 0a 20 20 20  Timeout>0 ){.   
6d00: 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70     sqlite3_sleep
6d10: 28 31 30 29 3b 0a 20 20 20 20 20 20 69 54 69 6d  (10);.      iTim
6d20: 65 6f 75 74 20 2d 3d 20 31 30 3b 0a 20 20 20 20  eout -= 10;.    
6d30: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6c  }.    sqlite3_sl
6d40: 65 65 70 28 31 30 30 29 3b 0a 20 20 20 20 70 53  eep(100);.    pS
6d50: 74 6d 74 20 3d 20 70 72 65 70 61 72 65 53 71 6c  tmt = prepareSql
6d60: 28 22 53 45 4c 45 43 54 20 6e 45 72 72 6f 72 2c  ("SELECT nError,
6d70: 20 6e 54 65 73 74 20 46 52 4f 4d 20 63 6f 75 6e   nTest FROM coun
6d80: 74 65 72 73 22 29 3b 0a 20 20 20 20 69 54 69 6d  ters");.    iTim
6d90: 65 6f 75 74 20 3d 20 31 30 30 30 3b 0a 20 20 20  eout = 1000;.   
6da0: 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71   while( (rc = sq
6db0: 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
6dc0: 29 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  ))==SQLITE_BUSY 
6dd0: 26 26 20 69 54 69 6d 65 6f 75 74 3e 30 20 29 7b  && iTimeout>0 ){
6de0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
6df0: 6c 65 65 70 28 31 30 29 3b 0a 20 20 20 20 20 20  leep(10);.      
6e00: 69 54 69 6d 65 6f 75 74 20 2d 3d 20 31 30 3b 0a  iTimeout -= 10;.
6e10: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
6e20: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
6e30: 20 20 20 20 20 20 67 2e 6e 45 72 72 6f 72 20 2b        g.nError +
6e40: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
6e50: 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  _int(pStmt, 0);.
6e60: 20 20 20 20 20 20 67 2e 6e 54 65 73 74 20 2b 3d        g.nTest +=
6e70: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
6e80: 69 6e 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20  int(pStmt, 1);. 
6e90: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
6ea0: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
6eb0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
6ec0: 63 6c 6f 73 65 28 67 2e 64 62 29 3b 20 20 0a 20  close(g.db);  . 
6ed0: 20 6d 61 79 62 65 43 6c 6f 73 65 28 67 2e 70 4c   maybeClose(g.pL
6ee0: 6f 67 29 3b 0a 20 20 6d 61 79 62 65 43 6c 6f 73  og);.  maybeClos
6ef0: 65 28 67 2e 70 45 72 72 4c 6f 67 29 3b 0a 20 20  e(g.pErrLog);.  
6f00: 69 66 28 20 69 43 6c 69 65 6e 74 3d 3d 30 20 29  if( iClient==0 )
6f10: 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 53 75  {.    printf("Su
6f20: 6d 6d 61 72 79 3a 20 25 64 20 65 72 72 6f 72 73  mmary: %d errors
6f30: 20 69 6e 20 25 64 20 74 65 73 74 73 5c 6e 22 2c   in %d tests\n",
6f40: 20 67 2e 6e 45 72 72 6f 72 2c 20 67 2e 6e 54 65   g.nError, g.nTe
6f50: 73 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  st);.  }.  retur
6f60: 6e 20 67 2e 6e 45 72 72 6f 72 3e 30 3b 0a 7d 0a  n g.nError>0;.}.