/ Hex Artifact Content
Login

Artifact 36c511bf0b562ccadede7cd31208dc1ec75b7ce2:


0000: 2f 2a 0a 2a 2a 20 32 30 31 33 2d 30 34 2d 30 35  /*.** 2013-04-05
0010: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68 6f  .**.** The autho
0020: 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70 79  r disclaims copy
0030: 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73 6f  right to this so
0040: 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20 70  urce code.  In p
0050: 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65 67  lace of.** a leg
0060: 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65 20  al notice, here 
0070: 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a 2a  is a blessing:.*
0080: 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75 20  *.**    May you 
0090: 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74 20  do good and not 
00a0: 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  evil..**    May 
00b0: 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76 65  you find forgive
00c0: 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65 6c  ness for yoursel
00d0: 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f 74  f and forgive ot
00e0: 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79 20  hers..**    May 
00f0: 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c 79  you share freely
0100: 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20 6d  , never taking m
0110: 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69 76  ore than you giv
0120: 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..**.**********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
0170: 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ** .** This is a
0180: 20 70 72 6f 67 72 61 6d 20 75 73 65 64 20 66 6f   program used fo
0190: 72 20 74 65 73 74 69 6e 67 20 53 51 4c 69 74 65  r testing SQLite
01a0: 2c 20 61 6e 64 20 73 70 65 63 69 66 69 63 61 6c  , and specifical
01b0: 6c 79 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a  ly for testing.*
01c0: 2a 20 74 68 65 20 61 62 69 6c 69 74 79 20 6f 66  * the ability of
01d0: 20 69 6e 64 65 70 65 6e 64 65 6e 74 20 70 72 6f   independent pro
01e0: 63 65 73 73 65 73 20 74 6f 20 61 63 63 65 73 73  cesses to access
01f0: 20 74 68 65 20 73 61 6d 65 20 53 51 4c 69 74 65   the same SQLite
0200: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
0210: 63 75 72 72 65 6e 74 6c 79 2e 0a 2a 2a 0a 2a 2a  currently..**.**
0220: 20 43 6f 6d 70 69 6c 65 20 74 68 69 73 20 70 72   Compile this pr
0230: 6f 67 72 61 6d 20 61 73 20 66 6f 6c 6c 6f 77 73  ogram as follows
0240: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 67 63 63 20 2d  :.**.**    gcc -
0250: 67 20 2d 63 20 2d 57 61 6c 6c 20 73 71 6c 69 74  g -c -Wall sqlit
0260: 65 33 2e 63 20 24 28 4f 50 54 53 29 0a 2a 2a 20  e3.c $(OPTS).** 
0270: 20 20 20 67 63 63 20 2d 67 20 2d 6f 20 6d 70 74     gcc -g -o mpt
0280: 65 73 74 20 6d 70 74 65 73 74 2e 63 20 73 71 6c  est mptest.c sql
0290: 69 74 65 33 2e 6f 20 24 28 4c 49 42 53 29 0a 2a  ite3.o $(LIBS).*
02a0: 2a 0a 2a 2a 20 52 65 63 6f 6d 6d 65 6e 64 65 64  *.** Recommended
02b0: 20 6f 70 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20   options:.**.** 
02c0: 20 20 20 2d 44 48 41 56 45 5f 55 53 4c 45 45 50     -DHAVE_USLEEP
02d0: 0a 2a 2a 20 20 20 20 2d 44 53 51 4c 49 54 45 5f  .**    -DSQLITE_
02e0: 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 20 20 20 2d 44  NO_SYNC.**    -D
02f0: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
0300: 45 3d 30 0a 2a 2a 20 20 20 20 2d 44 53 51 4c 49  E=0.**    -DSQLI
0310: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
0320: 45 4e 53 49 4f 4e 0a 2a 2a 0a 2a 2a 20 52 75 6e  ENSION.**.** Run
0330: 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a   like this:.**.*
0340: 2a 20 20 20 20 20 2e 2f 6d 70 74 65 73 74 20 24  *     ./mptest $
0350: 64 61 74 61 62 61 73 65 20 24 73 63 72 69 70 74  database $script
0360: 0a 2a 2a 0a 2a 2a 20 77 68 65 72 65 20 24 64 61  .**.** where $da
0370: 74 61 62 61 73 65 20 69 73 20 74 68 65 20 64 61  tabase is the da
0380: 74 61 62 61 73 65 20 74 6f 20 75 73 65 20 66 6f  tabase to use fo
0390: 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20 24 73  r testing and $s
03a0: 63 72 69 70 74 20 69 73 20 61 0a 2a 2a 20 74 65  cript is a.** te
03b0: 73 74 20 73 63 72 69 70 74 2e 0a 2a 2f 0a 23 69  st script..*/.#i
03c0: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e  nclude "sqlite3.
03d0: 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64  h".#include <std
03e0: 69 6f 2e 68 3e 0a 23 69 66 20 64 65 66 69 6e 65  io.h>.#if define
03f0: 64 28 5f 57 49 4e 33 32 29 0a 23 20 64 65 66 69  d(_WIN32).# defi
0400: 6e 65 20 57 49 4e 33 32 5f 4c 45 41 4e 5f 41 4e  ne WIN32_LEAN_AN
0410: 44 5f 4d 45 41 4e 0a 23 20 69 6e 63 6c 75 64 65  D_MEAN.# include
0420: 20 3c 77 69 6e 64 6f 77 73 2e 68 3e 0a 23 65 6c   <windows.h>.#el
0430: 73 65 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 6e  se.# include <un
0440: 69 73 74 64 2e 68 3e 0a 23 65 6e 64 69 66 0a 23  istd.h>.#endif.#
0450: 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e  include <stdlib.
0460: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72  h>.#include <str
0470: 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ing.h>.#include 
0480: 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c  <assert.h>.#incl
0490: 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 0a 2f  ude <ctype.h>../
04a0: 2a 20 54 68 65 20 73 75 66 66 69 78 20 74 6f 20  * The suffix to 
04b0: 61 70 70 65 6e 64 20 74 6f 20 74 68 65 20 63 68  append to the ch
04c0: 69 6c 64 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  ild command line
04d0: 73 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 23 69 66  s, if any */.#if
04e0: 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29   defined(_WIN32)
04f0: 0a 23 20 64 65 66 69 6e 65 20 47 45 54 50 49 44  .# define GETPID
0500: 20 28 69 6e 74 29 47 65 74 43 75 72 72 65 6e 74   (int)GetCurrent
0510: 50 72 6f 63 65 73 73 49 64 0a 23 65 6c 73 65 0a  ProcessId.#else.
0520: 23 20 64 65 66 69 6e 65 20 47 45 54 50 49 44 20  # define GETPID 
0530: 67 65 74 70 69 64 0a 23 65 6e 64 69 66 0a 0a 2f  getpid.#endif../
0540: 2a 20 4d 61 72 6b 20 61 20 70 61 72 61 6d 65 74  * Mark a paramet
0550: 65 72 20 61 73 20 75 6e 75 73 65 64 20 74 6f 20  er as unused to 
0560: 73 75 70 70 72 65 73 73 20 63 6f 6d 70 69 6c 65  suppress compile
0570: 72 20 77 61 72 6e 69 6e 67 73 20 2a 2f 0a 23 64  r warnings */.#d
0580: 65 66 69 6e 65 20 55 4e 55 53 45 44 5f 50 41 52  efine UNUSED_PAR
0590: 41 4d 45 54 45 52 28 78 29 20 20 28 76 6f 69 64  AMETER(x)  (void
05a0: 29 78 0a 0a 2f 2a 20 47 6c 6f 62 61 6c 20 64 61  )x../* Global da
05b0: 74 61 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  ta.*/.static str
05c0: 75 63 74 20 47 6c 6f 62 61 6c 20 7b 0a 20 20 63  uct Global {.  c
05d0: 68 61 72 20 2a 61 72 67 76 30 3b 20 20 20 20 20  har *argv0;     
05e0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
05f0: 20 74 68 65 20 65 78 65 63 75 74 61 62 6c 65 20   the executable 
0600: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
0610: 2a 7a 56 66 73 3b 20 20 20 20 20 20 2f 2a 20 4e  *zVfs;      /* N
0620: 61 6d 65 20 6f 66 20 56 46 53 20 74 6f 20 75 73  ame of VFS to us
0630: 65 2e 20 4f 66 74 65 6e 20 4e 55 4c 4c 20 6d 65  e. Often NULL me
0640: 61 6e 69 6e 67 20 22 64 65 66 61 75 6c 74 22 20  aning "default" 
0650: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62 46 69  */.  char *zDbFi
0660: 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  le;         /* N
0670: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
0680: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
0690: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
06a0: 2f 2a 20 4f 70 65 6e 20 63 6f 6e 6e 65 63 74 69  /* Open connecti
06b0: 6f 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20 2a  on to database *
06c0: 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4c 6f  /.  char *zErrLo
06d0: 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  g;         /* Fi
06e0: 6c 65 6e 61 6d 65 20 66 6f 72 20 65 72 72 6f 72  lename for error
06f0: 20 6c 6f 67 20 2a 2f 0a 20 20 46 49 4c 45 20 2a   log */.  FILE *
0700: 70 45 72 72 4c 6f 67 3b 20 20 20 20 20 20 20 20  pErrLog;        
0710: 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69   /* Where to wri
0720: 74 65 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 63  te errors */.  c
0730: 68 61 72 20 2a 7a 4c 6f 67 3b 20 20 20 20 20 20  har *zLog;      
0740: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
0750: 20 6f 75 74 70 75 74 20 6c 6f 67 20 66 69 6c 65   output log file
0760: 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 70 4c 6f 67   */.  FILE *pLog
0770: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
0780: 57 68 65 72 65 20 74 6f 20 77 72 69 74 65 20 6c  Where to write l
0790: 6f 67 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20  og messages */. 
07a0: 20 63 68 61 72 20 7a 4e 61 6d 65 5b 33 32 5d 3b   char zName[32];
07b0: 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6d 62 6f          /* Symbo
07c0: 6c 69 63 20 6e 61 6d 65 20 6f 66 20 74 68 69 73  lic name of this
07d0: 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 69 6e   process */.  in
07e0: 74 20 74 61 73 6b 49 64 3b 20 20 20 20 20 20 20  t taskId;       
07f0: 20 20 20 20 20 2f 2a 20 54 61 73 6b 20 49 44 2e       /* Task ID.
0800: 20 20 30 20 6d 65 61 6e 73 20 73 75 70 65 72 76    0 means superv
0810: 69 73 6f 72 2e 20 2a 2f 0a 20 20 69 6e 74 20 69  isor. */.  int i
0820: 54 72 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Trace;          
0830: 20 20 2f 2a 20 54 72 61 63 69 6e 67 20 6c 65 76    /* Tracing lev
0840: 65 6c 20 2a 2f 0a 20 20 69 6e 74 20 62 53 71 6c  el */.  int bSql
0850: 54 72 61 63 65 3b 20 20 20 20 20 20 20 20 20 2f  Trace;         /
0860: 2a 20 54 72 75 65 20 74 6f 20 74 72 61 63 65 20  * True to trace 
0870: 53 51 4c 20 63 6f 6d 6d 61 6e 64 73 20 2a 2f 0a  SQL commands */.
0880: 20 20 69 6e 74 20 6e 45 72 72 6f 72 3b 20 20 20    int nError;   
0890: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
08a0: 65 72 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a  er of errors */.
08b0: 20 20 69 6e 74 20 6e 54 65 73 74 3b 20 20 20 20    int nTest;    
08c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
08d0: 65 72 20 6f 66 20 2d 2d 6d 61 74 63 68 20 6f 70  er of --match op
08e0: 65 72 61 74 6f 72 73 20 2a 2f 0a 20 20 69 6e 74  erators */.  int
08f0: 20 69 54 69 6d 65 6f 75 74 3b 20 20 20 20 20 20   iTimeout;      
0900: 20 20 20 20 2f 2a 20 4d 69 6c 6c 69 73 65 63 6f      /* Milliseco
0910: 6e 64 73 20 75 6e 74 69 6c 20 61 20 62 75 73 79  nds until a busy
0920: 20 74 69 6d 65 6f 75 74 20 2a 2f 0a 20 20 69 6e   timeout */.  in
0930: 74 20 62 53 79 6e 63 3b 20 20 20 20 20 20 20 20  t bSync;        
0940: 20 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66 73 79       /* Call fsy
0950: 6e 63 28 29 20 2a 2f 0a 7d 20 67 3b 0a 0a 2f 2a  nc() */.} g;../*
0960: 20 44 65 66 61 75 6c 74 20 74 69 6d 65 6f 75 74   Default timeout
0970: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 44 45 46 41   */.#define DEFA
0980: 55 4c 54 5f 54 49 4d 45 4f 55 54 20 31 30 30 30  ULT_TIMEOUT 1000
0990: 30 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  0../*.** Print a
09a0: 20 6d 65 73 73 61 67 65 20 61 64 64 69 6e 67 20   message adding 
09b0: 7a 50 72 65 66 69 78 5b 5d 20 74 6f 20 74 68 65  zPrefix[] to the
09c0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76   beginning of ev
09d0: 65 72 79 20 6c 69 6e 65 2e 0a 2a 2f 0a 73 74 61  ery line..*/.sta
09e0: 74 69 63 20 76 6f 69 64 20 70 72 69 6e 74 57 69  tic void printWi
09f0: 74 68 50 72 65 66 69 78 28 46 49 4c 45 20 2a 70  thPrefix(FILE *p
0a00: 4f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Out, const char 
0a10: 2a 7a 50 72 65 66 69 78 2c 20 63 6f 6e 73 74 20  *zPrefix, const 
0a20: 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 77  char *zMsg){.  w
0a30: 68 69 6c 65 28 20 7a 4d 73 67 20 26 26 20 7a 4d  hile( zMsg && zM
0a40: 73 67 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74  sg[0] ){.    int
0a50: 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   i;.    for(i=0;
0a60: 20 7a 4d 73 67 5b 69 5d 20 26 26 20 7a 4d 73 67   zMsg[i] && zMsg
0a70: 5b 69 5d 21 3d 27 5c 6e 27 20 26 26 20 7a 4d 73  [i]!='\n' && zMs
0a80: 67 5b 69 5d 21 3d 27 5c 72 27 3b 20 69 2b 2b 29  g[i]!='\r'; i++)
0a90: 7b 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28 70  {}.    fprintf(p
0aa0: 4f 75 74 2c 20 22 25 73 25 2e 2a 73 5c 6e 22 2c  Out, "%s%.*s\n",
0ab0: 20 7a 50 72 65 66 69 78 2c 20 69 2c 20 7a 4d 73   zPrefix, i, zMs
0ac0: 67 29 3b 0a 20 20 20 20 7a 4d 73 67 20 2b 3d 20  g);.    zMsg += 
0ad0: 69 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 4d  i;.    while( zM
0ae0: 73 67 5b 30 5d 3d 3d 27 5c 6e 27 20 7c 7c 20 7a  sg[0]=='\n' || z
0af0: 4d 73 67 5b 30 5d 3d 3d 27 5c 72 27 20 29 20 7a  Msg[0]=='\r' ) z
0b00: 4d 73 67 2b 2b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Msg++;.  }.}../*
0b10: 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74 77 6f 20  .** Compare two 
0b20: 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 74 72 69  pointers to stri
0b30: 6e 67 73 2c 20 77 68 65 72 65 20 74 68 65 20 70  ngs, where the p
0b40: 6f 69 6e 74 65 72 73 20 6d 69 67 68 74 20 62 65  ointers might be
0b50: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
0b60: 20 69 6e 74 20 73 61 66 65 5f 73 74 72 63 6d 70   int safe_strcmp
0b70: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 2c 20  (const char *a, 
0b80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 62 29 7b 0a  const char *b){.
0b90: 20 20 69 66 28 20 61 3d 3d 62 20 29 20 72 65 74    if( a==b ) ret
0ba0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 61 3d 3d  urn 0;.  if( a==
0bb0: 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  0 ) return -1;. 
0bc0: 20 69 66 28 20 62 3d 3d 30 20 29 20 72 65 74 75   if( b==0 ) retu
0bd0: 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 73  rn 1;.  return s
0be0: 74 72 63 6d 70 28 61 2c 62 29 3b 0a 7d 0a 0a 2f  trcmp(a,b);.}../
0bf0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
0c00: 20 69 66 20 73 74 72 69 6e 67 20 7a 5b 5d 20 6d   if string z[] m
0c10: 61 74 63 68 65 73 20 67 6c 6f 62 20 70 61 74 74  atches glob patt
0c20: 65 72 6e 20 7a 47 6c 6f 62 5b 5d 2e 0a 2a 2a 20  ern zGlob[]..** 
0c30: 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  Return FALSE if 
0c40: 74 68 65 20 70 61 74 74 65 72 6e 20 64 6f 65 73  the pattern does
0c50: 20 6e 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 0a 2a   not match..**.*
0c60: 2a 20 47 6c 6f 62 62 69 6e 67 20 72 75 6c 65 73  * Globbing rules
0c70: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 2a 27  :.**.**      '*'
0c80: 20 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 61         Matches a
0c90: 6e 79 20 73 65 71 75 65 6e 63 65 20 6f 66 20 7a  ny sequence of z
0ca0: 65 72 6f 20 6f 72 20 6d 6f 72 65 20 63 68 61 72  ero or more char
0cb0: 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  acters..**.**   
0cc0: 20 20 20 27 3f 27 20 20 20 20 20 20 20 4d 61 74     '?'       Mat
0cd0: 63 68 65 73 20 65 78 61 63 74 6c 79 20 6f 6e 65  ches exactly one
0ce0: 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2a 0a 2a   character..**.*
0cf0: 2a 20 20 20 20 20 5b 2e 2e 2e 5d 20 20 20 20 20  *     [...]     
0d00: 20 4d 61 74 63 68 65 73 20 6f 6e 65 20 63 68 61   Matches one cha
0d10: 72 61 63 74 65 72 20 66 72 6f 6d 20 74 68 65 20  racter from the 
0d20: 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74 20 6f 66  enclosed list of
0d30: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0d40: 20 20 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a     characters..*
0d50: 2a 0a 2a 2a 20 20 20 20 20 5b 5e 2e 2e 2e 5d 20  *.**     [^...] 
0d60: 20 20 20 20 4d 61 74 63 68 65 73 20 6f 6e 65 20      Matches one 
0d70: 63 68 61 72 61 63 74 65 72 20 6e 6f 74 20 69 6e  character not in
0d80: 20 74 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69   the enclosed li
0d90: 73 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27  st..**.**      '
0da0: 23 27 20 20 20 20 20 20 20 4d 61 74 63 68 65 73  #'       Matches
0db0: 20 61 6e 79 20 73 65 71 75 65 6e 63 65 20 6f 66   any sequence of
0dc0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 64 69 67   one or more dig
0dd0: 69 74 73 20 77 69 74 68 20 61 6e 0a 2a 2a 20 20  its with an.**  
0de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 70                op
0df0: 74 69 6f 6e 61 6c 20 2b 20 6f 72 20 2d 20 73 69  tional + or - si
0e00: 67 6e 20 69 6e 20 66 72 6f 6e 74 0a 2a 2f 0a 69  gn in front.*/.i
0e10: 6e 74 20 73 74 72 67 6c 6f 62 28 63 6f 6e 73 74  nt strglob(const
0e20: 20 63 68 61 72 20 2a 7a 47 6c 6f 62 2c 20 63 6f   char *zGlob, co
0e30: 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  nst char *z){.  
0e40: 69 6e 74 20 63 2c 20 63 32 3b 0a 20 20 69 6e 74  int c, c2;.  int
0e50: 20 69 6e 76 65 72 74 3b 0a 20 20 69 6e 74 20 73   invert;.  int s
0e60: 65 65 6e 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28  een;..  while( (
0e70: 63 20 3d 20 28 2a 28 7a 47 6c 6f 62 2b 2b 29 29  c = (*(zGlob++))
0e80: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )!=0 ){.    if( 
0e90: 63 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20 20  c=='*' ){.      
0ea0: 77 68 69 6c 65 28 20 28 63 3d 28 2a 28 7a 47 6c  while( (c=(*(zGl
0eb0: 6f 62 2b 2b 29 29 29 20 3d 3d 20 27 2a 27 20 7c  ob++))) == '*' |
0ec0: 7c 20 63 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20  | c=='?' ){.    
0ed0: 20 20 20 20 69 66 28 20 63 3d 3d 27 3f 27 20 26      if( c=='?' &
0ee0: 26 20 28 2a 28 7a 2b 2b 29 29 3d 3d 30 20 29 20  & (*(z++))==0 ) 
0ef0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
0f00: 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30  }.      if( c==0
0f10: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
0f20: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rn 1;.      }els
0f30: 65 20 69 66 28 20 63 3d 3d 27 5b 27 20 29 7b 0a  e if( c=='[' ){.
0f40: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 2a          while( *
0f50: 7a 20 26 26 20 73 74 72 67 6c 6f 62 28 7a 47 6c  z && strglob(zGl
0f60: 6f 62 2d 31 2c 7a 29 20 29 7b 0a 20 20 20 20 20  ob-1,z) ){.     
0f70: 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20       z++;.      
0f80: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75    }.        retu
0f90: 72 6e 20 28 2a 7a 29 21 3d 30 3b 0a 20 20 20 20  rn (*z)!=0;.    
0fa0: 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28    }.      while(
0fb0: 20 28 63 32 20 3d 20 28 2a 28 7a 2b 2b 29 29 29   (c2 = (*(z++)))
0fc0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 77  !=0 ){.        w
0fd0: 68 69 6c 65 28 20 63 32 21 3d 63 20 29 7b 0a 20  hile( c2!=c ){. 
0fe0: 20 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28           c2 = *(
0ff0: 7a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  z++);.          
1000: 69 66 28 20 63 32 3d 3d 30 20 29 20 72 65 74 75  if( c2==0 ) retu
1010: 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 0;.        }.
1020: 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 67          if( strg
1030: 6c 6f 62 28 7a 47 6c 6f 62 2c 7a 29 20 29 20 72  lob(zGlob,z) ) r
1040: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
1050: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
1060: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
1070: 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 69  =='?' ){.      i
1080: 66 28 20 28 2a 28 7a 2b 2b 29 29 3d 3d 30 20 29  f( (*(z++))==0 )
1090: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
10a0: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b 27 20  else if( c=='[' 
10b0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 72 69  ){.      int pri
10c0: 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  or_c = 0;.      
10d0: 73 65 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  seen = 0;.      
10e0: 69 6e 76 65 72 74 20 3d 20 30 3b 0a 20 20 20 20  invert = 0;.    
10f0: 20 20 63 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20    c = *(z++);.  
1100: 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72      if( c==0 ) r
1110: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 63  eturn 0;.      c
1120: 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a  2 = *(zGlob++);.
1130: 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27 5e        if( c2=='^
1140: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 76  ' ){.        inv
1150: 65 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ert = 1;.       
1160: 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29   c2 = *(zGlob++)
1170: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1180: 69 66 28 20 63 32 3d 3d 27 5d 27 20 29 7b 0a 20  if( c2==']' ){. 
1190: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5d         if( c==']
11a0: 27 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20  ' ) seen = 1;.  
11b0: 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c        c2 = *(zGl
11c0: 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ob++);.      }. 
11d0: 20 20 20 20 20 77 68 69 6c 65 28 20 63 32 20 26       while( c2 &
11e0: 26 20 63 32 21 3d 27 5d 27 20 29 7b 0a 20 20 20  & c2!=']' ){.   
11f0: 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27 2d 27       if( c2=='-'
1200: 20 26 26 20 7a 47 6c 6f 62 5b 30 5d 21 3d 27 5d   && zGlob[0]!=']
1210: 27 20 26 26 20 7a 47 6c 6f 62 5b 30 5d 21 3d 30  ' && zGlob[0]!=0
1220: 20 26 26 20 70 72 69 6f 72 5f 63 3e 30 20 29 7b   && prior_c>0 ){
1230: 0a 20 20 20 20 20 20 20 20 20 20 63 32 20 3d 20  .          c2 = 
1240: 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20  *(zGlob++);.    
1250: 20 20 20 20 20 20 69 66 28 20 63 3e 3d 70 72 69        if( c>=pri
1260: 6f 72 5f 63 20 26 26 20 63 3c 3d 63 32 20 29 20  or_c && c<=c2 ) 
1270: 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  seen = 1;.      
1280: 20 20 20 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b      prior_c = 0;
1290: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
12a0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d            if( c=
12b0: 3d 63 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =c2 ){.         
12c0: 20 20 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20     seen = 1;.   
12d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12e0: 20 20 20 70 72 69 6f 72 5f 63 20 3d 20 63 32 3b     prior_c = c2;
12f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1300: 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b     c2 = *(zGlob+
1310: 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  +);.      }.    
1320: 20 20 69 66 28 20 63 32 3d 3d 30 20 7c 7c 20 28    if( c2==0 || (
1330: 73 65 65 6e 20 5e 20 69 6e 76 65 72 74 29 3d 3d  seen ^ invert)==
1340: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1350: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
1360: 23 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  #' ){.      if( 
1370: 28 7a 5b 30 5d 3d 3d 27 2d 27 20 7c 7c 20 7a 5b  (z[0]=='-' || z[
1380: 30 5d 3d 3d 27 2b 27 29 20 26 26 20 69 73 64 69  0]=='+') && isdi
1390: 67 69 74 28 7a 5b 31 5d 29 20 29 20 7a 2b 2b 3b  git(z[1]) ) z++;
13a0: 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 64 69  .      if( !isdi
13b0: 67 69 74 28 7a 5b 30 5d 29 20 29 20 72 65 74 75  git(z[0]) ) retu
13c0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b  rn 0;.      z++;
13d0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 73  .      while( is
13e0: 64 69 67 69 74 28 7a 5b 30 5d 29 20 29 7b 20 7a  digit(z[0]) ){ z
13f0: 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b  ++; }.    }else{
1400: 0a 20 20 20 20 20 20 69 66 28 20 63 21 3d 28 2a  .      if( c!=(*
1410: 28 7a 2b 2b 29 29 20 29 20 72 65 74 75 72 6e 20  (z++)) ) return 
1420: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
1430: 65 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a  eturn *z==0;.}..
1440: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 6f 75 74 70  /*.** Close outp
1450: 75 74 20 73 74 72 65 61 6d 20 70 4f 75 74 20 69  ut stream pOut i
1460: 66 20 69 74 20 69 73 20 6e 6f 74 20 73 74 64 6f  f it is not stdo
1470: 75 74 20 6f 72 20 73 74 64 65 72 72 0a 2a 2f 0a  ut or stderr.*/.
1480: 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 79 62  static void mayb
1490: 65 43 6c 6f 73 65 28 46 49 4c 45 20 2a 70 4f 75  eClose(FILE *pOu
14a0: 74 29 7b 0a 20 20 69 66 28 20 70 4f 75 74 21 3d  t){.  if( pOut!=
14b0: 73 74 64 6f 75 74 20 26 26 20 70 4f 75 74 21 3d  stdout && pOut!=
14c0: 73 74 64 65 72 72 20 29 20 66 63 6c 6f 73 65 28  stderr ) fclose(
14d0: 70 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pOut);.}../*.** 
14e0: 50 72 69 6e 74 20 61 6e 20 65 72 72 6f 72 20 6d  Print an error m
14f0: 65 73 73 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63  essage.*/.static
1500: 20 76 6f 69 64 20 65 72 72 6f 72 4d 65 73 73 61   void errorMessa
1510: 67 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ge(const char *z
1520: 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20  Format, ...){.  
1530: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68  va_list ap;.  ch
1540: 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 63 68 61 72  ar *zMsg;.  char
1550: 20 7a 50 72 65 66 69 78 5b 33 30 5d 3b 0a 20 20   zPrefix[30];.  
1560: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
1570: 72 6d 61 74 29 3b 0a 20 20 7a 4d 73 67 20 3d 20  rmat);.  zMsg = 
1580: 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66  sqlite3_vmprintf
1590: 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20  (zFormat, ap);. 
15a0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 73   va_end(ap);.  s
15b0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
15c0: 73 69 7a 65 6f 66 28 7a 50 72 65 66 69 78 29 2c  sizeof(zPrefix),
15d0: 20 7a 50 72 65 66 69 78 2c 20 22 25 73 3a 45 52   zPrefix, "%s:ER
15e0: 52 4f 52 3a 20 22 2c 20 67 2e 7a 4e 61 6d 65 29  ROR: ", g.zName)
15f0: 3b 0a 20 20 69 66 28 20 67 2e 70 4c 6f 67 20 29  ;.  if( g.pLog )
1600: 7b 0a 20 20 20 20 70 72 69 6e 74 57 69 74 68 50  {.    printWithP
1610: 72 65 66 69 78 28 67 2e 70 4c 6f 67 2c 20 7a 50  refix(g.pLog, zP
1620: 72 65 66 69 78 2c 20 7a 4d 73 67 29 3b 0a 20 20  refix, zMsg);.  
1630: 20 20 66 66 6c 75 73 68 28 67 2e 70 4c 6f 67 29    fflush(g.pLog)
1640: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 2e 70 45  ;.  }.  if( g.pE
1650: 72 72 4c 6f 67 20 26 26 20 73 61 66 65 5f 73 74  rrLog && safe_st
1660: 72 63 6d 70 28 67 2e 7a 45 72 72 4c 6f 67 2c 67  rcmp(g.zErrLog,g
1670: 2e 7a 4c 6f 67 29 20 29 7b 0a 20 20 20 20 70 72  .zLog) ){.    pr
1680: 69 6e 74 57 69 74 68 50 72 65 66 69 78 28 67 2e  intWithPrefix(g.
1690: 70 45 72 72 4c 6f 67 2c 20 7a 50 72 65 66 69 78  pErrLog, zPrefix
16a0: 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 66 66 6c  , zMsg);.    ffl
16b0: 75 73 68 28 67 2e 70 45 72 72 4c 6f 67 29 3b 0a  ush(g.pErrLog);.
16c0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
16d0: 65 65 28 7a 4d 73 67 29 3b 0a 20 20 67 2e 6e 45  ee(zMsg);.  g.nE
16e0: 72 72 6f 72 2b 2b 3b 0a 7d 0a 0a 2f 2a 20 46 6f  rror++;.}../* Fo
16f0: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
1700: 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n */.static int 
1710: 74 72 79 53 71 6c 28 63 6f 6e 73 74 20 63 68 61  trySql(const cha
1720: 72 2a 2c 20 2e 2e 2e 29 3b 0a 0a 2f 2a 0a 2a 2a  r*, ...);../*.**
1730: 20 50 72 69 6e 74 20 61 6e 20 65 72 72 6f 72 20   Print an error 
1740: 6d 65 73 73 61 67 65 20 61 6e 64 20 74 68 65 6e  message and then
1750: 20 71 75 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   quit..*/.static
1760: 20 76 6f 69 64 20 66 61 74 61 6c 45 72 72 6f 72   void fatalError
1770: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f  (const char *zFo
1780: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  rmat, ...){.  va
1790: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72  _list ap;.  char
17a0: 20 2a 7a 4d 73 67 3b 0a 20 20 63 68 61 72 20 7a   *zMsg;.  char z
17b0: 50 72 65 66 69 78 5b 33 30 5d 3b 0a 20 20 76 61  Prefix[30];.  va
17c0: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
17d0: 61 74 29 3b 0a 20 20 7a 4d 73 67 20 3d 20 73 71  at);.  zMsg = sq
17e0: 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a  lite3_vmprintf(z
17f0: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
1800: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 73 71 6c  a_end(ap);.  sql
1810: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
1820: 7a 65 6f 66 28 7a 50 72 65 66 69 78 29 2c 20 7a  zeof(zPrefix), z
1830: 50 72 65 66 69 78 2c 20 22 25 73 3a 46 41 54 41  Prefix, "%s:FATA
1840: 4c 3a 20 22 2c 20 67 2e 7a 4e 61 6d 65 29 3b 0a  L: ", g.zName);.
1850: 20 20 69 66 28 20 67 2e 70 4c 6f 67 20 29 7b 0a    if( g.pLog ){.
1860: 20 20 20 20 70 72 69 6e 74 57 69 74 68 50 72 65      printWithPre
1870: 66 69 78 28 67 2e 70 4c 6f 67 2c 20 7a 50 72 65  fix(g.pLog, zPre
1880: 66 69 78 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20  fix, zMsg);.    
1890: 66 66 6c 75 73 68 28 67 2e 70 4c 6f 67 29 3b 0a  fflush(g.pLog);.
18a0: 20 20 20 20 6d 61 79 62 65 43 6c 6f 73 65 28 67      maybeClose(g
18b0: 2e 70 4c 6f 67 29 3b 0a 20 20 7d 0a 20 20 69 66  .pLog);.  }.  if
18c0: 28 20 67 2e 70 45 72 72 4c 6f 67 20 26 26 20 73  ( g.pErrLog && s
18d0: 61 66 65 5f 73 74 72 63 6d 70 28 67 2e 7a 45 72  afe_strcmp(g.zEr
18e0: 72 4c 6f 67 2c 67 2e 7a 4c 6f 67 29 20 29 7b 0a  rLog,g.zLog) ){.
18f0: 20 20 20 20 70 72 69 6e 74 57 69 74 68 50 72 65      printWithPre
1900: 66 69 78 28 67 2e 70 45 72 72 4c 6f 67 2c 20 7a  fix(g.pErrLog, z
1910: 50 72 65 66 69 78 2c 20 7a 4d 73 67 29 3b 0a 20  Prefix, zMsg);. 
1920: 20 20 20 66 66 6c 75 73 68 28 67 2e 70 45 72 72     fflush(g.pErr
1930: 4c 6f 67 29 3b 0a 20 20 20 20 6d 61 79 62 65 43  Log);.    maybeC
1940: 6c 6f 73 65 28 67 2e 70 45 72 72 4c 6f 67 29 3b  lose(g.pErrLog);
1950: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
1960: 72 65 65 28 7a 4d 73 67 29 3b 0a 20 20 69 66 28  ree(zMsg);.  if(
1970: 20 67 2e 64 62 20 29 7b 0a 20 20 20 20 69 6e 74   g.db ){.    int
1980: 20 6e 54 72 79 20 3d 20 30 3b 0a 20 20 20 20 67   nTry = 0;.    g
1990: 2e 69 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 20  .iTimeout = 0;. 
19a0: 20 20 20 77 68 69 6c 65 28 20 74 72 79 53 71 6c     while( trySql
19b0: 28 22 55 50 44 41 54 45 20 63 6c 69 65 6e 74 20  ("UPDATE client 
19c0: 53 45 54 20 77 61 6e 74 48 61 6c 74 3d 31 3b 22  SET wantHalt=1;"
19d0: 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 0a 20  )==SQLITE_BUSY. 
19e0: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 6e 54            && (nT
19f0: 72 79 2b 2b 29 3c 31 30 30 20 29 7b 0a 20 20 20  ry++)<100 ){.   
1a00: 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70     sqlite3_sleep
1a10: 28 31 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (10);.    }.  }.
1a20: 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
1a30: 67 2e 64 62 29 3b 0a 20 20 65 78 69 74 28 31 29  g.db);.  exit(1)
1a40: 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50 72  ;  .}.../*.** Pr
1a50: 69 6e 74 20 61 20 6c 6f 67 20 6d 65 73 73 61 67  int a log messag
1a60: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  e.*/.static void
1a70: 20 6c 6f 67 4d 65 73 73 61 67 65 28 63 6f 6e 73   logMessage(cons
1a80: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
1a90: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
1aa0: 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 73   ap;.  char *zMs
1ab0: 67 3b 0a 20 20 63 68 61 72 20 7a 50 72 65 66 69  g;.  char zPrefi
1ac0: 78 5b 33 30 5d 3b 0a 20 20 76 61 5f 73 74 61 72  x[30];.  va_star
1ad0: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
1ae0: 20 20 7a 4d 73 67 20 3d 20 73 71 6c 69 74 65 33    zMsg = sqlite3
1af0: 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61  _vmprintf(zForma
1b00: 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  t, ap);.  va_end
1b10: 28 61 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  (ap);.  sqlite3_
1b20: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
1b30: 7a 50 72 65 66 69 78 29 2c 20 7a 50 72 65 66 69  zPrefix), zPrefi
1b40: 78 2c 20 22 25 73 3a 20 22 2c 20 67 2e 7a 4e 61  x, "%s: ", g.zNa
1b50: 6d 65 29 3b 0a 20 20 69 66 28 20 67 2e 70 4c 6f  me);.  if( g.pLo
1b60: 67 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 57 69  g ){.    printWi
1b70: 74 68 50 72 65 66 69 78 28 67 2e 70 4c 6f 67 2c  thPrefix(g.pLog,
1b80: 20 7a 50 72 65 66 69 78 2c 20 7a 4d 73 67 29 3b   zPrefix, zMsg);
1b90: 0a 20 20 20 20 66 66 6c 75 73 68 28 67 2e 70 4c  .    fflush(g.pL
1ba0: 6f 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  og);.  }.  sqlit
1bb0: 65 33 5f 66 72 65 65 28 7a 4d 73 67 29 3b 0a 7d  e3_free(zMsg);.}
1bc0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1bd0: 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 61 20 73  he length of a s
1be0: 74 72 69 6e 67 20 6f 6d 69 74 74 69 6e 67 20 74  tring omitting t
1bf0: 72 61 69 6c 69 6e 67 20 77 68 69 74 65 73 70 61  railing whitespa
1c00: 63 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ce.*/.static int
1c10: 20 63 6c 69 70 4c 65 6e 67 74 68 28 63 6f 6e 73   clipLength(cons
1c20: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t char *z){.  in
1c30: 74 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  t n = (int)strle
1c40: 6e 28 7a 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e  n(z);.  while( n
1c50: 3e 30 20 26 26 20 69 73 73 70 61 63 65 28 7a 5b  >0 && isspace(z[
1c60: 6e 2d 31 5d 29 20 29 7b 20 6e 2d 2d 3b 20 7d 0a  n-1]) ){ n--; }.
1c70: 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
1c80: 2a 0a 2a 2a 20 41 75 78 69 6c 69 61 72 79 20 53  *.** Auxiliary S
1c90: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 72  QL function to r
1ca0: 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
1cb0: 66 20 74 68 65 20 56 46 53 0a 2a 2f 0a 73 74 61  f the VFS.*/.sta
1cc0: 74 69 63 20 76 6f 69 64 20 76 66 73 4e 61 6d 65  tic void vfsName
1cd0: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
1ce0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
1cf0: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
1d00: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
1d10: 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65  argv.){.  sqlite
1d20: 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  3 *db = sqlite3_
1d30: 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
1d40: 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 63 68  e(context);.  ch
1d50: 61 72 20 2a 7a 56 66 73 20 3d 20 30 3b 0a 20 20  ar *zVfs = 0;.  
1d60: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1d70: 28 61 72 67 63 29 3b 0a 20 20 55 4e 55 53 45 44  (argc);.  UNUSED
1d80: 5f 50 41 52 41 4d 45 54 45 52 28 61 72 67 76 29  _PARAMETER(argv)
1d90: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ;.  sqlite3_file
1da0: 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6d 61  _control(db, "ma
1db0: 69 6e 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  in", SQLITE_FCNT
1dc0: 4c 5f 56 46 53 4e 41 4d 45 2c 20 26 7a 56 66 73  L_VFSNAME, &zVfs
1dd0: 29 3b 0a 20 20 69 66 28 20 7a 56 66 73 20 29 7b  );.  if( zVfs ){
1de0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
1df0: 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74  ult_text(context
1e00: 2c 20 7a 56 66 73 2c 20 2d 31 2c 20 73 71 6c 69  , zVfs, -1, sqli
1e10: 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 7d  te3_free);.  }.}
1e20: 0a 0a 2f 2a 0a 2a 2a 20 42 75 73 79 20 68 61 6e  ../*.** Busy han
1e30: 64 6c 65 72 20 77 69 74 68 20 61 20 67 2e 69 54  dler with a g.iT
1e40: 69 6d 65 6f 75 74 2d 6d 69 6c 6c 69 73 65 63 6f  imeout-milliseco
1e50: 6e 64 20 74 69 6d 65 6f 75 74 0a 2a 2f 0a 73 74  nd timeout.*/.st
1e60: 61 74 69 63 20 69 6e 74 20 62 75 73 79 48 61 6e  atic int busyHan
1e70: 64 6c 65 72 28 76 6f 69 64 20 2a 70 43 44 2c 20  dler(void *pCD, 
1e80: 69 6e 74 20 63 6f 75 6e 74 29 7b 0a 20 20 55 4e  int count){.  UN
1e90: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
1ea0: 43 44 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74  CD);.  if( count
1eb0: 2a 31 30 3e 67 2e 69 54 69 6d 65 6f 75 74 20 29  *10>g.iTimeout )
1ec0: 7b 0a 20 20 20 20 69 66 28 20 67 2e 69 54 69 6d  {.    if( g.iTim
1ed0: 65 6f 75 74 3e 30 20 29 20 65 72 72 6f 72 4d 65  eout>0 ) errorMe
1ee0: 73 73 61 67 65 28 22 74 69 6d 65 6f 75 74 20 61  ssage("timeout a
1ef0: 66 74 65 72 20 25 64 6d 73 22 2c 20 67 2e 69 54  fter %dms", g.iT
1f00: 69 6d 65 6f 75 74 29 3b 0a 20 20 20 20 72 65 74  imeout);.    ret
1f10: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  urn 0;.  }.  sql
1f20: 69 74 65 33 5f 73 6c 65 65 70 28 31 30 29 3b 0a  ite3_sleep(10);.
1f30: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
1f40: 2a 0a 2a 2a 20 53 51 4c 20 54 72 61 63 65 20 63  *.** SQL Trace c
1f50: 61 6c 6c 62 61 63 6b 0a 2a 2f 0a 73 74 61 74 69  allback.*/.stati
1f60: 63 20 76 6f 69 64 20 73 71 6c 54 72 61 63 65 43  c void sqlTraceC
1f70: 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 4e 6f  allback(void *No
1f80: 74 55 73 65 64 31 2c 20 63 6f 6e 73 74 20 63 68  tUsed1, const ch
1f90: 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 55 4e 55  ar *zSql){.  UNU
1fa0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
1fb0: 74 55 73 65 64 31 29 3b 0a 20 20 6c 6f 67 4d 65  tUsed1);.  logMe
1fc0: 73 73 61 67 65 28 22 5b 25 2e 2a 73 5d 22 2c 20  ssage("[%.*s]", 
1fd0: 63 6c 69 70 4c 65 6e 67 74 68 28 7a 53 71 6c 29  clipLength(zSql)
1fe0: 2c 20 7a 53 71 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , zSql);.}../*.*
1ff0: 2a 20 53 51 4c 20 65 72 72 6f 72 20 6c 6f 67 20  * SQL error log 
2000: 63 61 6c 6c 62 61 63 6b 0a 2a 2f 0a 73 74 61 74  callback.*/.stat
2010: 69 63 20 76 6f 69 64 20 73 71 6c 45 72 72 6f 72  ic void sqlError
2020: 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  Callback(void *p
2030: 41 72 67 2c 20 69 6e 74 20 69 45 72 72 43 6f 64  Arg, int iErrCod
2040: 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  e, const char *z
2050: 4d 73 67 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  Msg){.  UNUSED_P
2060: 41 52 41 4d 45 54 45 52 28 70 41 72 67 29 3b 0a  ARAMETER(pArg);.
2070: 20 20 69 66 28 20 28 69 45 72 72 43 6f 64 65 26    if( (iErrCode&
2080: 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 53 43  0xff)==SQLITE_SC
2090: 48 45 4d 41 20 26 26 20 67 2e 69 54 72 61 63 65  HEMA && g.iTrace
20a0: 3c 33 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  <3 ) return;.  i
20b0: 66 28 20 67 2e 69 54 69 6d 65 6f 75 74 3d 3d 30  f( g.iTimeout==0
20c0: 20 26 26 20 28 69 45 72 72 43 6f 64 65 26 30 78   && (iErrCode&0x
20d0: 66 66 29 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  ff)==SQLITE_BUSY
20e0: 20 26 26 20 67 2e 69 54 72 61 63 65 3c 33 20 29   && g.iTrace<3 )
20f0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 28   return;.  if( (
2100: 69 45 72 72 43 6f 64 65 26 30 78 66 66 29 3d 3d  iErrCode&0xff)==
2110: 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 20 29 7b  SQLITE_NOTICE ){
2120: 0a 20 20 20 20 6c 6f 67 4d 65 73 73 61 67 65 28  .    logMessage(
2130: 22 28 69 6e 66 6f 29 20 25 73 22 2c 20 7a 4d 73  "(info) %s", zMs
2140: 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  g);.  }else{.   
2150: 20 65 72 72 6f 72 4d 65 73 73 61 67 65 28 22 28   errorMessage("(
2160: 65 72 72 63 6f 64 65 3d 25 64 29 20 25 73 22 2c  errcode=%d) %s",
2170: 20 69 45 72 72 43 6f 64 65 2c 20 7a 4d 73 67 29   iErrCode, zMsg)
2180: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  ;.  }.}../*.** P
2190: 72 65 70 61 72 65 20 61 6e 20 53 51 4c 20 73 74  repare an SQL st
21a0: 61 74 65 6d 65 6e 74 2e 20 20 49 73 73 75 65 20  atement.  Issue 
21b0: 61 20 66 61 74 61 6c 20 65 72 72 6f 72 20 69 66  a fatal error if
21c0: 20 75 6e 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74   unable..*/.stat
21d0: 69 63 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  ic sqlite3_stmt 
21e0: 2a 70 72 65 70 61 72 65 53 71 6c 28 63 6f 6e 73  *prepareSql(cons
21f0: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
2200: 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74   ...){.  va_list
2210: 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71   ap;.  char *zSq
2220: 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  l;.  int rc;.  s
2230: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
2240: 6d 74 20 3d 20 30 3b 0a 20 20 76 61 5f 73 74 61  mt = 0;.  va_sta
2250: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
2260: 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
2270: 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d  3_vmprintf(zForm
2280: 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  at, ap);.  va_en
2290: 64 28 61 70 29 3b 0a 20 20 72 63 20 3d 20 73 71  d(ap);.  rc = sq
22a0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
22b0: 28 67 2e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  (g.db, zSql, -1,
22c0: 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69   &pStmt, 0);.  i
22d0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
22e0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
22f0: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
2300: 0a 20 20 20 20 66 61 74 61 6c 45 72 72 6f 72 28  .    fatalError(
2310: 22 25 73 5c 6e 25 73 5c 6e 22 2c 20 73 71 6c 69  "%s\n%s\n", sqli
2320: 74 65 33 5f 65 72 72 6d 73 67 28 67 2e 64 62 29  te3_errmsg(g.db)
2330: 2c 20 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20 20 73  , zSql);.  }.  s
2340: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
2350: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 53 74 6d  );.  return pStm
2360: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20  t;.}../*.** Run 
2370: 61 72 62 69 74 72 61 72 79 20 53 51 4c 2e 20 20  arbitrary SQL.  
2380: 49 73 73 75 65 20 61 20 66 61 74 61 6c 20 65 72  Issue a fatal er
2390: 72 6f 72 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a  ror on failure..
23a0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
23b0: 75 6e 53 71 6c 28 63 6f 6e 73 74 20 63 68 61 72  unSql(const char
23c0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
23d0: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
23e0: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69   char *zSql;.  i
23f0: 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 61 72  nt rc;.  va_star
2400: 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
2410: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
2420: 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61  _vmprintf(zForma
2430: 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  t, ap);.  va_end
2440: 28 61 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  (ap);.  rc = sql
2450: 69 74 65 33 5f 65 78 65 63 28 67 2e 64 62 2c 20  ite3_exec(g.db, 
2460: 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  zSql, 0, 0, 0);.
2470: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2480: 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 61 74 61 6c  _OK ){.    fatal
2490: 45 72 72 6f 72 28 22 25 73 5c 6e 25 73 5c 6e 22  Error("%s\n%s\n"
24a0: 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
24b0: 28 67 2e 64 62 29 2c 20 7a 53 71 6c 29 3b 0a 20  (g.db), zSql);. 
24c0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
24d0: 65 28 7a 53 71 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  e(zSql);.}../*.*
24e0: 2a 20 54 72 79 20 74 6f 20 72 75 6e 20 61 72 62  * Try to run arb
24f0: 69 74 72 61 72 79 20 53 51 4c 2e 20 20 52 65 74  itrary SQL.  Ret
2500: 75 72 6e 20 73 75 63 63 65 73 73 20 63 6f 64 65  urn success code
2510: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2520: 74 72 79 53 71 6c 28 63 6f 6e 73 74 20 63 68 61  trySql(const cha
2530: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29  r *zFormat, ...)
2540: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
2550: 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
2560: 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 61  int rc;.  va_sta
2570: 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b  rt(ap, zFormat);
2580: 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
2590: 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d  3_vmprintf(zForm
25a0: 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  at, ap);.  va_en
25b0: 64 28 61 70 29 3b 0a 20 20 72 63 20 3d 20 73 71  d(ap);.  rc = sq
25c0: 6c 69 74 65 33 5f 65 78 65 63 28 67 2e 64 62 2c  lite3_exec(g.db,
25d0: 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b   zSql, 0, 0, 0);
25e0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
25f0: 7a 53 71 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  zSql);.  return 
2600: 72 63 3b 0a 7d 0a 0a 2f 2a 20 53 74 72 75 63 74  rc;.}../* Struct
2610: 75 72 65 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20  ure for holding 
2620: 61 6e 20 61 72 62 69 74 72 61 72 79 20 6c 65 6e  an arbitrary len
2630: 67 74 68 20 73 74 72 69 6e 67 0a 2a 2f 0a 74 79  gth string.*/.ty
2640: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 74 72  pedef struct Str
2650: 69 6e 67 20 53 74 72 69 6e 67 3b 0a 73 74 72 75  ing String;.stru
2660: 63 74 20 53 74 72 69 6e 67 20 7b 0a 20 20 63 68  ct String {.  ch
2670: 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 2f  ar *z;         /
2680: 2a 20 74 68 65 20 73 74 72 69 6e 67 20 2a 2f 0a  * the string */.
2690: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
26a0: 20 20 20 2f 2a 20 53 6c 6f 74 73 20 6f 66 20 7a     /* Slots of z
26b0: 5b 5d 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74  [] used */.  int
26c0: 20 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 2f 2a   nAlloc;      /*
26d0: 20 53 6c 6f 74 73 20 6f 66 20 7a 5b 5d 20 61 6c   Slots of z[] al
26e0: 6c 6f 63 61 74 65 64 20 2a 2f 0a 7d 3b 0a 0a 2f  located */.};../
26f0: 2a 20 46 72 65 65 20 61 20 73 74 72 69 6e 67 20  * Free a string 
2700: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
2710: 74 72 69 6e 67 46 72 65 65 28 53 74 72 69 6e 67  tringFree(String
2720: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 7a   *p){.  if( p->z
2730: 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
2740: 70 2d 3e 7a 29 3b 0a 20 20 6d 65 6d 73 65 74 28  p->z);.  memset(
2750: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29  p, 0, sizeof(*p)
2760: 29 3b 0a 7d 0a 0a 2f 2a 20 41 70 70 65 6e 64 20  );.}../* Append 
2770: 6e 20 62 79 74 65 73 20 6f 66 20 74 65 78 74 20  n bytes of text 
2780: 74 6f 20 61 20 73 74 72 69 6e 67 2e 20 20 49 66  to a string.  If
2790: 20 6e 3c 30 20 61 70 70 65 6e 64 20 74 68 65 20   n<0 append the 
27a0: 65 6e 74 69 72 65 20 73 74 72 69 6e 67 2e 20 2a  entire string. *
27b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 74  /.static void st
27c0: 72 69 6e 67 41 70 70 65 6e 64 28 53 74 72 69 6e  ringAppend(Strin
27d0: 67 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  g *p, const char
27e0: 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69   *z, int n){.  i
27f0: 66 28 20 6e 3c 30 20 29 20 6e 20 3d 20 28 69 6e  f( n<0 ) n = (in
2800: 74 29 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 69  t)strlen(z);.  i
2810: 66 28 20 70 2d 3e 6e 2b 6e 3e 3d 70 2d 3e 6e 41  f( p->n+n>=p->nA
2820: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e 74 20  lloc ){.    int 
2830: 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 6c 6c  nAlloc = p->nAll
2840: 6f 63 2a 32 20 2b 20 6e 20 2b 20 31 30 30 3b 0a  oc*2 + n + 100;.
2850: 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71      char *z = sq
2860: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 2d  lite3_realloc(p-
2870: 3e 7a 2c 20 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20  >z, nAlloc);.   
2880: 20 69 66 28 20 7a 3d 3d 30 20 29 20 66 61 74 61   if( z==0 ) fata
2890: 6c 45 72 72 6f 72 28 22 6f 75 74 20 6f 66 20 6d  lError("out of m
28a0: 65 6d 6f 72 79 22 29 3b 0a 20 20 20 20 70 2d 3e  emory");.    p->
28b0: 7a 20 3d 20 7a 3b 0a 20 20 20 20 70 2d 3e 6e 41  z = z;.    p->nA
28c0: 6c 6c 6f 63 20 3d 20 6e 41 6c 6c 6f 63 3b 0a 20  lloc = nAlloc;. 
28d0: 20 7d 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a   }.  memcpy(p->z
28e0: 2b 70 2d 3e 6e 2c 20 7a 2c 20 6e 29 3b 0a 20 20  +p->n, z, n);.  
28f0: 70 2d 3e 6e 20 2b 3d 20 6e 3b 0a 20 20 70 2d 3e  p->n += n;.  p->
2900: 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b 0a 7d 0a 0a  z[p->n] = 0;.}..
2910: 2f 2a 20 52 65 73 65 74 20 61 20 73 74 72 69 6e  /* Reset a strin
2920: 67 20 74 6f 20 61 6e 20 65 6d 70 74 79 20 73 74  g to an empty st
2930: 72 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 76  ring */.static v
2940: 6f 69 64 20 73 74 72 69 6e 67 52 65 73 65 74 28  oid stringReset(
2950: 53 74 72 69 6e 67 20 2a 70 29 7b 0a 20 20 69 66  String *p){.  if
2960: 28 20 70 2d 3e 7a 3d 3d 30 20 29 20 73 74 72 69  ( p->z==0 ) stri
2970: 6e 67 41 70 70 65 6e 64 28 70 2c 20 22 20 22 2c  ngAppend(p, " ",
2980: 20 31 29 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b   1);.  p->n = 0;
2990: 0a 20 20 70 2d 3e 7a 5b 30 5d 20 3d 20 30 3b 0a  .  p->z[0] = 0;.
29a0: 7d 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 61 20 6e  }../* Append a n
29b0: 65 77 20 74 6f 6b 65 6e 20 6f 6e 74 6f 20 74 68  ew token onto th
29c0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 74 72  e end of the str
29d0: 69 6e 67 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ing */.static vo
29e0: 69 64 20 73 74 72 69 6e 67 41 70 70 65 6e 64 54  id stringAppendT
29f0: 65 72 6d 28 53 74 72 69 6e 67 20 2a 70 2c 20 63  erm(String *p, c
2a00: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
2a10: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 2d   int i;.  if( p-
2a20: 3e 6e 20 29 20 73 74 72 69 6e 67 41 70 70 65 6e  >n ) stringAppen
2a30: 64 28 70 2c 20 22 20 22 2c 20 31 29 3b 0a 20 20  d(p, " ", 1);.  
2a40: 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  if( z==0 ){.    
2a50: 73 74 72 69 6e 67 41 70 70 65 6e 64 28 70 2c 20  stringAppend(p, 
2a60: 22 6e 69 6c 22 2c 20 33 29 3b 0a 20 20 20 20 72  "nil", 3);.    r
2a70: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 6f 72  eturn;.  }.  for
2a80: 28 69 3d 30 3b 20 7a 5b 69 5d 20 26 26 20 21 69  (i=0; z[i] && !i
2a90: 73 73 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b  sspace(z[i]); i+
2aa0: 2b 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20 26  +){}.  if( i>0 &
2ab0: 26 20 7a 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20  & z[i]==0 ){.   
2ac0: 20 73 74 72 69 6e 67 41 70 70 65 6e 64 28 70 2c   stringAppend(p,
2ad0: 20 7a 2c 20 69 29 3b 0a 20 20 20 20 72 65 74 75   z, i);.    retu
2ae0: 72 6e 3b 0a 20 20 7d 0a 20 20 73 74 72 69 6e 67  rn;.  }.  string
2af0: 41 70 70 65 6e 64 28 70 2c 20 22 27 22 2c 20 31  Append(p, "'", 1
2b00: 29 3b 0a 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d  );.  while( z[0]
2b10: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
2b20: 20 7a 5b 69 5d 20 26 26 20 7a 5b 69 5d 21 3d 27   z[i] && z[i]!='
2b30: 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  \''; i++){}.    
2b40: 69 66 28 20 7a 5b 69 5d 20 29 7b 0a 20 20 20 20  if( z[i] ){.    
2b50: 20 20 73 74 72 69 6e 67 41 70 70 65 6e 64 28 70    stringAppend(p
2b60: 2c 20 7a 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20  , z, i+1);.     
2b70: 20 73 74 72 69 6e 67 41 70 70 65 6e 64 28 70 2c   stringAppend(p,
2b80: 20 22 27 22 2c 20 31 29 3b 0a 20 20 20 20 20 20   "'", 1);.      
2b90: 7a 20 2b 3d 20 69 2b 31 3b 0a 20 20 20 20 7d 65  z += i+1;.    }e
2ba0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 74 72 69 6e  lse{.      strin
2bb0: 67 41 70 70 65 6e 64 28 70 2c 20 7a 2c 20 69 29  gAppend(p, z, i)
2bc0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2bd0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 74 72 69 6e     }.  }.  strin
2be0: 67 41 70 70 65 6e 64 28 70 2c 20 22 27 22 2c 20  gAppend(p, "'", 
2bf0: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  1);.}../*.** Cal
2c00: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 66  lback function f
2c10: 6f 72 20 65 76 61 6c 53 71 6c 28 29 0a 2a 2f 0a  or evalSql().*/.
2c20: 73 74 61 74 69 63 20 69 6e 74 20 65 76 61 6c 43  static int evalC
2c30: 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 43  allback(void *pC
2c40: 44 61 74 61 2c 20 69 6e 74 20 61 72 67 63 2c 20  Data, int argc, 
2c50: 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 63 68 61  char **argv, cha
2c60: 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20 53 74  r **azCol){.  St
2c70: 72 69 6e 67 20 2a 70 20 3d 20 28 53 74 72 69 6e  ring *p = (Strin
2c80: 67 2a 29 70 43 44 61 74 61 3b 0a 20 20 69 6e 74  g*)pCData;.  int
2c90: 20 69 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52   i;.  UNUSED_PAR
2ca0: 41 4d 45 54 45 52 28 61 7a 43 6f 6c 29 3b 0a 20  AMETER(azCol);. 
2cb0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
2cc0: 3b 20 69 2b 2b 29 20 73 74 72 69 6e 67 41 70 70  ; i++) stringApp
2cd0: 65 6e 64 54 65 72 6d 28 70 2c 20 61 72 67 76 5b  endTerm(p, argv[
2ce0: 69 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  i]);.  return 0;
2cf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 72  .}../*.** Run ar
2d00: 62 69 74 72 61 72 79 20 53 51 4c 20 61 6e 64 20  bitrary SQL and 
2d10: 72 65 63 6f 72 64 20 74 68 65 20 72 65 73 75 6c  record the resul
2d20: 74 73 20 69 6e 20 61 6e 20 6f 75 74 70 75 74 20  ts in an output 
2d30: 73 74 72 69 6e 67 0a 2a 2a 20 67 69 76 65 6e 20  string.** given 
2d40: 62 79 20 74 68 65 20 66 69 72 73 74 20 70 61 72  by the first par
2d50: 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69  ameter..*/.stati
2d60: 63 20 69 6e 74 20 65 76 61 6c 53 71 6c 28 53 74  c int evalSql(St
2d70: 72 69 6e 67 20 2a 70 2c 20 63 6f 6e 73 74 20 63  ring *p, const c
2d80: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
2d90: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
2da0: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
2db0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
2dc0: 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
2dd0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
2de0: 6f 72 6d 61 74 29 3b 0a 20 20 7a 53 71 6c 20 3d  ormat);.  zSql =
2df0: 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74   sqlite3_vmprint
2e00: 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  f(zFormat, ap);.
2e10: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
2e20: 61 73 73 65 72 74 28 20 67 2e 69 54 69 6d 65 6f  assert( g.iTimeo
2e30: 75 74 3e 30 20 29 3b 0a 20 20 72 63 20 3d 20 73  ut>0 );.  rc = s
2e40: 71 6c 69 74 65 33 5f 65 78 65 63 28 67 2e 64 62  qlite3_exec(g.db
2e50: 2c 20 7a 53 71 6c 2c 20 65 76 61 6c 43 61 6c 6c  , zSql, evalCall
2e60: 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 4d 73  back, p, &zErrMs
2e70: 67 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  g);.  sqlite3_fr
2e80: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20  ee(zSql);.  if( 
2e90: 72 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a  rc ){.    char z
2ea0: 45 72 72 5b 33 30 5d 3b 0a 20 20 20 20 73 71 6c  Err[30];.    sql
2eb0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
2ec0: 7a 65 6f 66 28 7a 45 72 72 29 2c 20 7a 45 72 72  zeof(zErr), zErr
2ed0: 2c 20 22 65 72 72 6f 72 28 25 64 29 22 2c 20 72  , "error(%d)", r
2ee0: 63 29 3b 0a 20 20 20 20 73 74 72 69 6e 67 41 70  c);.    stringAp
2ef0: 70 65 6e 64 54 65 72 6d 28 70 2c 20 7a 45 72 72  pendTerm(p, zErr
2f00: 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d  );.    if( zErrM
2f10: 73 67 20 29 7b 0a 20 20 20 20 20 20 73 74 72 69  sg ){.      stri
2f20: 6e 67 41 70 70 65 6e 64 54 65 72 6d 28 70 2c 20  ngAppendTerm(p, 
2f30: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
2f40: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
2f50: 72 4d 73 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  rMsg);.    }.  }
2f60: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2f70: 0a 2f 2a 0a 2a 2a 20 41 75 78 69 6c 69 61 72 79  ./*.** Auxiliary
2f80: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 6f   SQL function to
2f90: 20 72 65 63 75 72 73 69 76 65 6c 79 20 65 76 61   recursively eva
2fa0: 6c 75 61 74 65 20 53 51 4c 2e 0a 2a 2f 0a 73 74  luate SQL..*/.st
2fb0: 61 74 69 63 20 76 6f 69 64 20 65 76 61 6c 46 75  atic void evalFu
2fc0: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  nc(.  sqlite3_co
2fd0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
2fe0: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
2ff0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
3000: 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  gv.){.  sqlite3 
3010: 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  *db = sqlite3_co
3020: 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28  ntext_db_handle(
3030: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 63 6f 6e 73  context);.  cons
3040: 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 28  t char *zSql = (
3050: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
3060: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
3070: 72 67 76 5b 30 5d 29 3b 0a 20 20 53 74 72 69 6e  rgv[0]);.  Strin
3080: 67 20 72 65 73 3b 0a 20 20 63 68 61 72 20 2a 7a  g res;.  char *z
3090: 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 69 6e  ErrMsg = 0;.  in
30a0: 74 20 72 63 3b 0a 20 20 55 4e 55 53 45 44 5f 50  t rc;.  UNUSED_P
30b0: 41 52 41 4d 45 54 45 52 28 61 72 67 63 29 3b 0a  ARAMETER(argc);.
30c0: 20 20 6d 65 6d 73 65 74 28 26 72 65 73 2c 20 30    memset(&res, 0
30d0: 2c 20 73 69 7a 65 6f 66 28 72 65 73 29 29 3b 0a  , sizeof(res));.
30e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
30f0: 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 65 76  xec(db, zSql, ev
3100: 61 6c 43 61 6c 6c 62 61 63 6b 2c 20 26 72 65 73  alCallback, &res
3110: 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69  , &zErrMsg);.  i
3120: 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  f( zErrMsg ){.  
3130: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
3140: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
3150: 7a 45 72 72 4d 73 67 2c 20 2d 31 29 3b 0a 20 20  zErrMsg, -1);.  
3160: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
3170: 45 72 72 4d 73 67 29 3b 0a 20 20 7d 65 6c 73 65  ErrMsg);.  }else
3180: 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73   if( rc ){.    s
3190: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
31a0: 72 6f 72 5f 63 6f 64 65 28 63 6f 6e 74 65 78 74  ror_code(context
31b0: 2c 20 72 63 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  , rc);.  }else{.
31c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
31d0: 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  lt_text(context,
31e0: 20 72 65 73 2e 7a 2c 20 2d 31 2c 20 53 51 4c 49   res.z, -1, SQLI
31f0: 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
3200: 20 7d 0a 20 20 73 74 72 69 6e 67 46 72 65 65 28   }.  stringFree(
3210: 26 72 65 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  &res);.}../*.** 
3220: 4c 6f 6f 6b 20 75 70 20 74 68 65 20 6e 65 78 74  Look up the next
3230: 20 74 61 73 6b 20 66 6f 72 20 63 6c 69 65 6e 74   task for client
3240: 20 69 43 6c 69 65 6e 74 20 69 6e 20 74 68 65 20   iClient in the 
3250: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 52 65 74  database..** Ret
3260: 75 72 6e 20 74 68 65 20 74 61 73 6b 20 73 63 72  urn the task scr
3270: 69 70 74 20 61 6e 64 20 74 68 65 20 74 61 73 6b  ipt and the task
3280: 20 6e 75 6d 62 65 72 20 61 6e 64 20 6d 61 72 6b   number and mark
3290: 20 74 68 61 74 0a 2a 2a 20 74 61 73 6b 20 61 73   that.** task as
32a0: 20 62 65 69 6e 67 20 75 6e 64 65 72 20 77 61 79   being under way
32b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
32c0: 73 74 61 72 74 53 63 72 69 70 74 28 0a 20 20 69  startScript(.  i
32d0: 6e 74 20 69 43 6c 69 65 6e 74 2c 20 20 20 20 20  nt iClient,     
32e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
32f0: 63 6c 69 65 6e 74 20 6e 75 6d 62 65 72 20 2a 2f  client number */
3300: 0a 20 20 63 68 61 72 20 2a 2a 70 7a 53 63 72 69  .  char **pzScri
3310: 70 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pt,          /* 
3320: 57 72 69 74 65 20 74 61 73 6b 20 73 63 72 69 70  Write task scrip
3330: 74 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20  t here */.  int 
3340: 2a 70 54 61 73 6b 49 64 2c 20 20 20 20 20 20 20  *pTaskId,       
3350: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
3360: 61 73 6b 20 6e 75 6d 62 65 72 20 68 65 72 65 20  ask number here 
3370: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 54 61  */.  char **pzTa
3380: 73 6b 4e 61 6d 65 20 20 20 20 20 20 20 20 20 2f  skName         /
3390: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
33a0: 73 6b 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  sk */.){.  sqlit
33b0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
33c0: 20 30 3b 0a 20 20 69 6e 74 20 74 61 73 6b 49 64   0;.  int taskId
33d0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
33e0: 74 20 74 6f 74 61 6c 54 69 6d 65 20 3d 20 30 3b  t totalTime = 0;
33f0: 0a 0a 20 20 2a 70 7a 53 63 72 69 70 74 20 3d 20  ..  *pzScript = 
3400: 30 3b 0a 20 20 67 2e 69 54 69 6d 65 6f 75 74 20  0;.  g.iTimeout 
3410: 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b  = 0;.  while(1){
3420: 0a 20 20 20 20 72 63 20 3d 20 74 72 79 53 71 6c  .    rc = trySql
3430: 28 22 42 45 47 49 4e 20 49 4d 4d 45 44 49 41 54  ("BEGIN IMMEDIAT
3440: 45 22 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  E");.    if( rc=
3450: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
3460: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6c        sqlite3_sl
3470: 65 65 70 28 31 30 29 3b 0a 20 20 20 20 20 20 74  eep(10);.      t
3480: 6f 74 61 6c 54 69 6d 65 20 2b 3d 20 31 30 3b 0a  otalTime += 10;.
3490: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
34a0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
34b0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
34c0: 20 20 20 20 20 66 61 74 61 6c 45 72 72 6f 72 28       fatalError(
34d0: 22 69 6e 20 73 74 61 72 74 53 63 72 69 70 74 3a  "in startScript:
34e0: 20 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72   %s", sqlite3_er
34f0: 72 6d 73 67 28 67 2e 64 62 29 29 3b 0a 20 20 20  rmsg(g.db));.   
3500: 20 7d 0a 20 20 20 20 69 66 28 20 67 2e 6e 45 72   }.    if( g.nEr
3510: 72 6f 72 20 7c 7c 20 67 2e 6e 54 65 73 74 20 29  ror || g.nTest )
3520: 7b 0a 20 20 20 20 20 20 72 75 6e 53 71 6c 28 22  {.      runSql("
3530: 55 50 44 41 54 45 20 63 6f 75 6e 74 65 72 73 20  UPDATE counters 
3540: 53 45 54 20 6e 45 72 72 6f 72 3d 6e 45 72 72 6f  SET nError=nErro
3550: 72 2b 25 64 2c 20 6e 54 65 73 74 3d 6e 54 65 73  r+%d, nTest=nTes
3560: 74 2b 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  t+%d",.         
3570: 20 20 20 20 67 2e 6e 45 72 72 6f 72 2c 20 67 2e      g.nError, g.
3580: 6e 54 65 73 74 29 3b 0a 20 20 20 20 20 20 67 2e  nTest);.      g.
3590: 6e 45 72 72 6f 72 20 3d 20 30 3b 0a 20 20 20 20  nError = 0;.    
35a0: 20 20 67 2e 6e 54 65 73 74 20 3d 20 30 3b 0a 20    g.nTest = 0;. 
35b0: 20 20 20 7d 0a 20 20 20 20 70 53 74 6d 74 20 3d     }.    pStmt =
35c0: 20 70 72 65 70 61 72 65 53 71 6c 28 22 53 45 4c   prepareSql("SEL
35d0: 45 43 54 20 31 20 46 52 4f 4d 20 63 6c 69 65 6e  ECT 1 FROM clien
35e0: 74 20 57 48 45 52 45 20 69 64 3d 25 64 20 41 4e  t WHERE id=%d AN
35f0: 44 20 77 61 6e 74 48 61 6c 74 22 2c 69 43 6c 69  D wantHalt",iCli
3600: 65 6e 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ent);.    rc = s
3610: 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
3620: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
3630: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
3640: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
3650: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
3660: 20 72 75 6e 53 71 6c 28 22 44 45 4c 45 54 45 20   runSql("DELETE 
3670: 46 52 4f 4d 20 63 6c 69 65 6e 74 20 57 48 45 52  FROM client WHER
3680: 45 20 69 64 3d 25 64 22 2c 20 69 43 6c 69 65 6e  E id=%d", iClien
3690: 74 29 3b 0a 20 20 20 20 20 20 67 2e 69 54 69 6d  t);.      g.iTim
36a0: 65 6f 75 74 20 3d 20 44 45 46 41 55 4c 54 5f 54  eout = DEFAULT_T
36b0: 49 4d 45 4f 55 54 3b 0a 20 20 20 20 20 20 72 75  IMEOUT;.      ru
36c0: 6e 53 71 6c 28 22 43 4f 4d 4d 49 54 20 54 52 41  nSql("COMMIT TRA
36d0: 4e 53 41 43 54 49 4f 4e 3b 22 29 3b 0a 20 20 20  NSACTION;");.   
36e0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
36f0: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 20  _DONE;.    }.   
3700: 20 70 53 74 6d 74 20 3d 20 70 72 65 70 61 72 65   pStmt = prepare
3710: 53 71 6c 28 0a 20 20 20 20 20 20 20 20 20 20 20  Sql(.           
3720: 20 20 20 22 53 45 4c 45 43 54 20 73 63 72 69 70     "SELECT scrip
3730: 74 2c 20 69 64 2c 20 6e 61 6d 65 20 46 52 4f 4d  t, id, name FROM
3740: 20 74 61 73 6b 22 0a 20 20 20 20 20 20 20 20 20   task".         
3750: 20 20 20 20 20 22 20 57 48 45 52 45 20 63 6c 69       " WHERE cli
3760: 65 6e 74 3d 25 64 20 41 4e 44 20 73 74 61 72 74  ent=%d AND start
3770: 74 69 6d 65 20 49 53 20 4e 55 4c 4c 22 0a 20 20  time IS NULL".  
3780: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 4f 52              " OR
3790: 44 45 52 20 42 59 20 69 64 20 4c 49 4d 49 54 20  DER BY id LIMIT 
37a0: 31 22 2c 20 69 43 6c 69 65 6e 74 29 3b 0a 20 20  1", iClient);.  
37b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
37c0: 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  tep(pStmt);.    
37d0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52  if( rc==SQLITE_R
37e0: 4f 57 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OW ){.      int 
37f0: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  n = sqlite3_colu
3800: 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20  mn_bytes(pStmt, 
3810: 30 29 3b 0a 20 20 20 20 20 20 2a 70 7a 53 63 72  0);.      *pzScr
3820: 69 70 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ipt = sqlite3_ma
3830: 6c 6c 6f 63 28 6e 2b 31 29 3b 0a 20 20 20 20 20  lloc(n+1);.     
3840: 20 73 74 72 63 70 79 28 2a 70 7a 53 63 72 69 70   strcpy(*pzScrip
3850: 74 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  t, (const char*)
3860: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
3870: 65 78 74 28 70 53 74 6d 74 2c 20 30 29 29 3b 0a  ext(pStmt, 0));.
3880: 20 20 20 20 20 20 2a 70 54 61 73 6b 49 64 20 3d        *pTaskId =
3890: 20 74 61 73 6b 49 64 20 3d 20 73 71 6c 69 74 65   taskId = sqlite
38a0: 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
38b0: 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 2a 70  mt, 1);.      *p
38c0: 7a 54 61 73 6b 4e 61 6d 65 20 3d 20 73 71 6c 69  zTaskName = sqli
38d0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
38e0: 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
38f0: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 32 29 29  _text(pStmt, 2))
3900: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
3910: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
3920: 0a 20 20 20 20 20 20 72 75 6e 53 71 6c 28 22 55  .      runSql("U
3930: 50 44 41 54 45 20 74 61 73 6b 22 0a 20 20 20 20  PDATE task".    
3940: 20 20 20 20 20 20 20 20 20 22 20 20 20 53 45 54           "   SET
3950: 20 73 74 61 72 74 74 69 6d 65 3d 73 74 72 66 74   starttime=strft
3960: 69 6d 65 28 27 25 25 59 2d 25 25 6d 2d 25 25 64  ime('%%Y-%%m-%%d
3970: 20 25 25 48 3a 25 25 4d 3a 25 25 66 27 2c 27 6e   %%H:%%M:%%f','n
3980: 6f 77 27 29 22 0a 20 20 20 20 20 20 20 20 20 20  ow')".          
3990: 20 20 20 22 20 57 48 45 52 45 20 69 64 3d 25 64     " WHERE id=%d
39a0: 3b 22 2c 20 74 61 73 6b 49 64 29 3b 0a 20 20 20  ;", taskId);.   
39b0: 20 20 20 67 2e 69 54 69 6d 65 6f 75 74 20 3d 20     g.iTimeout = 
39c0: 44 45 46 41 55 4c 54 5f 54 49 4d 45 4f 55 54 3b  DEFAULT_TIMEOUT;
39d0: 0a 20 20 20 20 20 20 72 75 6e 53 71 6c 28 22 43  .      runSql("C
39e0: 4f 4d 4d 49 54 20 54 52 41 4e 53 41 43 54 49 4f  OMMIT TRANSACTIO
39f0: 4e 3b 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  N;");.      retu
3a00: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
3a10: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
3a20: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
3a30: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
3a40: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
3a50: 20 20 69 66 28 20 74 6f 74 61 6c 54 69 6d 65 3e    if( totalTime>
3a60: 33 30 30 30 30 20 29 7b 0a 20 20 20 20 20 20 20  30000 ){.       
3a70: 20 65 72 72 6f 72 4d 65 73 73 61 67 65 28 22 57   errorMessage("W
3a80: 61 69 74 65 64 20 6f 76 65 72 20 33 30 20 73 65  aited over 30 se
3a90: 63 6f 6e 64 73 20 77 69 74 68 20 6e 6f 20 77 6f  conds with no wo
3aa0: 72 6b 2e 20 20 47 69 76 69 6e 67 20 75 70 2e 22  rk.  Giving up."
3ab0: 29 3b 0a 20 20 20 20 20 20 20 20 72 75 6e 53 71  );.        runSq
3ac0: 6c 28 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 63  l("DELETE FROM c
3ad0: 6c 69 65 6e 74 20 57 48 45 52 45 20 69 64 3d 25  lient WHERE id=%
3ae0: 64 3b 20 43 4f 4d 4d 49 54 3b 22 2c 20 69 43 6c  d; COMMIT;", iCl
3af0: 69 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 73  ient);.        s
3b00: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 67 2e 64  qlite3_close(g.d
3b10: 62 29 3b 0a 20 20 20 20 20 20 20 20 65 78 69 74  b);.        exit
3b20: 28 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  (1);.      }.   
3b30: 20 20 20 77 68 69 6c 65 28 20 74 72 79 53 71 6c     while( trySql
3b40: 28 22 43 4f 4d 4d 49 54 22 29 3d 3d 53 51 4c 49  ("COMMIT")==SQLI
3b50: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
3b60: 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70     sqlite3_sleep
3b70: 28 31 30 29 3b 0a 20 20 20 20 20 20 20 20 74 6f  (10);.        to
3b80: 74 61 6c 54 69 6d 65 20 2b 3d 20 31 30 3b 0a 20  talTime += 10;. 
3b90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
3ba0: 69 74 65 33 5f 73 6c 65 65 70 28 31 30 30 29 3b  ite3_sleep(100);
3bb0: 0a 20 20 20 20 20 20 74 6f 74 61 6c 54 69 6d 65  .      totalTime
3bc0: 20 2b 3d 20 31 30 30 3b 0a 20 20 20 20 20 20 63   += 100;.      c
3bd0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
3be0: 20 20 20 66 61 74 61 6c 45 72 72 6f 72 28 22 25     fatalError("%
3bf0: 73 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  s", sqlite3_errm
3c00: 73 67 28 67 2e 64 62 29 29 3b 0a 20 20 7d 0a 20  sg(g.db));.  }. 
3c10: 20 67 2e 69 54 69 6d 65 6f 75 74 20 3d 20 44 45   g.iTimeout = DE
3c20: 46 41 55 4c 54 5f 54 49 4d 45 4f 55 54 3b 0a 7d  FAULT_TIMEOUT;.}
3c30: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73  ../*.** Mark a s
3c40: 63 72 69 70 74 20 61 73 20 68 61 76 69 6e 67 20  cript as having 
3c50: 66 69 6e 69 73 68 65 64 2e 20 20 20 52 65 6d 6f  finished.   Remo
3c60: 76 65 20 74 68 65 20 43 4c 49 45 4e 54 20 74 61  ve the CLIENT ta
3c70: 62 6c 65 20 65 6e 74 72 79 0a 2a 2a 20 69 66 20  ble entry.** if 
3c80: 62 53 68 75 74 64 6f 77 6e 20 69 73 20 74 72 75  bShutdown is tru
3c90: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
3ca0: 20 66 69 6e 69 73 68 53 63 72 69 70 74 28 69 6e   finishScript(in
3cb0: 74 20 69 43 6c 69 65 6e 74 2c 20 69 6e 74 20 74  t iClient, int t
3cc0: 61 73 6b 49 64 2c 20 69 6e 74 20 62 53 68 75 74  askId, int bShut
3cd0: 64 6f 77 6e 29 7b 0a 20 20 72 75 6e 53 71 6c 28  down){.  runSql(
3ce0: 22 55 50 44 41 54 45 20 74 61 73 6b 22 0a 20 20  "UPDATE task".  
3cf0: 20 20 20 20 20 20 20 22 20 20 20 53 45 54 20 65         "   SET e
3d00: 6e 64 74 69 6d 65 3d 73 74 72 66 74 69 6d 65 28  ndtime=strftime(
3d10: 27 25 25 59 2d 25 25 6d 2d 25 25 64 20 25 25 48  '%%Y-%%m-%%d %%H
3d20: 3a 25 25 4d 3a 25 25 66 27 2c 27 6e 6f 77 27 29  :%%M:%%f','now')
3d30: 22 0a 20 20 20 20 20 20 20 20 20 22 20 57 48 45  ".         " WHE
3d40: 52 45 20 69 64 3d 25 64 3b 22 2c 20 74 61 73 6b  RE id=%d;", task
3d50: 49 64 29 3b 0a 20 20 69 66 28 20 62 53 68 75 74  Id);.  if( bShut
3d60: 64 6f 77 6e 20 29 7b 0a 20 20 20 20 72 75 6e 53  down ){.    runS
3d70: 71 6c 28 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  ql("DELETE FROM 
3d80: 63 6c 69 65 6e 74 20 57 48 45 52 45 20 69 64 3d  client WHERE id=
3d90: 25 64 22 2c 20 69 43 6c 69 65 6e 74 29 3b 0a 20  %d", iClient);. 
3da0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
3db0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
3dc0: 53 74 61 72 74 20 75 70 20 61 20 63 6c 69 65 6e  Start up a clien
3dd0: 74 20 70 72 6f 63 65 73 73 20 66 6f 72 20 69 43  t process for iC
3de0: 6c 69 65 6e 74 2c 20 69 66 20 69 74 20 69 73 20  lient, if it is 
3df0: 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 72  not already.** r
3e00: 75 6e 6e 69 6e 67 2e 20 20 49 66 20 74 68 65 20  unning.  If the 
3e10: 63 6c 69 65 6e 74 20 69 73 20 61 6c 72 65 61 64  client is alread
3e20: 79 20 72 75 6e 6e 69 6e 67 2c 20 74 68 65 6e 20  y running, then 
3e30: 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  this routine.** 
3e40: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
3e50: 74 61 74 69 63 20 76 6f 69 64 20 73 74 61 72 74  tatic void start
3e60: 43 6c 69 65 6e 74 28 69 6e 74 20 69 43 6c 69 65  Client(int iClie
3e70: 6e 74 29 7b 0a 20 20 72 75 6e 53 71 6c 28 22 49  nt){.  runSql("I
3e80: 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20  NSERT OR IGNORE 
3e90: 49 4e 54 4f 20 63 6c 69 65 6e 74 20 56 41 4c 55  INTO client VALU
3ea0: 45 53 28 25 64 2c 30 29 22 2c 20 69 43 6c 69 65  ES(%d,0)", iClie
3eb0: 6e 74 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  nt);.  if( sqlit
3ec0: 65 33 5f 63 68 61 6e 67 65 73 28 67 2e 64 62 29  e3_changes(g.db)
3ed0: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   ){.    char *zS
3ee0: 79 73 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  ys;.    int rc;.
3ef0: 20 20 20 20 7a 53 79 73 20 3d 20 73 71 6c 69 74      zSys = sqlit
3f00: 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20 5c  e3_mprintf("%s \
3f10: 22 25 73 5c 22 20 2d 2d 63 6c 69 65 6e 74 20 25  "%s\" --client %
3f20: 64 20 2d 2d 74 72 61 63 65 20 25 64 22 2c 0a 20  d --trace %d",. 
3f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f40: 67 2e 61 72 67 76 30 2c 20 67 2e 7a 44 62 46 69  g.argv0, g.zDbFi
3f50: 6c 65 2c 20 69 43 6c 69 65 6e 74 2c 20 67 2e 69  le, iClient, g.i
3f60: 54 72 61 63 65 29 3b 0a 20 20 20 20 69 66 28 20  Trace);.    if( 
3f70: 67 2e 62 53 71 6c 54 72 61 63 65 20 29 7b 0a 20  g.bSqlTrace ){. 
3f80: 20 20 20 20 20 7a 53 79 73 20 3d 20 73 71 6c 69       zSys = sqli
3f90: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 20  te3_mprintf("%z 
3fa0: 2d 2d 73 71 6c 74 72 61 63 65 22 2c 20 7a 53 79  --sqltrace", zSy
3fb0: 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  s);.    }.    if
3fc0: 28 20 67 2e 62 53 79 6e 63 20 29 7b 0a 20 20 20  ( g.bSync ){.   
3fd0: 20 20 20 7a 53 79 73 20 3d 20 73 71 6c 69 74 65     zSys = sqlite
3fe0: 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 20 2d 2d  3_mprintf("%z --
3ff0: 73 79 6e 63 22 2c 20 7a 53 79 73 29 3b 0a 20 20  sync", zSys);.  
4000: 20 20 7d 0a 20 20 20 20 69 66 28 20 67 2e 7a 56    }.    if( g.zV
4010: 66 73 20 29 7b 0a 20 20 20 20 20 20 7a 53 79 73  fs ){.      zSys
4020: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
4030: 74 66 28 22 25 7a 20 2d 2d 76 66 73 20 5c 22 25  tf("%z --vfs \"%
4040: 73 5c 22 22 2c 20 7a 53 79 73 2c 20 67 2e 7a 56  s\"", zSys, g.zV
4050: 66 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  fs);.    }.    i
4060: 66 28 20 67 2e 69 54 72 61 63 65 3e 3d 32 20 29  f( g.iTrace>=2 )
4070: 20 6c 6f 67 4d 65 73 73 61 67 65 28 22 73 79 73   logMessage("sys
4080: 74 65 6d 28 27 25 71 27 29 22 2c 20 7a 53 79 73  tem('%q')", zSys
4090: 29 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  );.#if !defined(
40a0: 5f 57 49 4e 33 32 29 0a 20 20 20 20 7a 53 79 73  _WIN32).    zSys
40b0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
40c0: 74 66 28 22 25 7a 20 26 22 2c 20 7a 53 79 73 29  tf("%z &", zSys)
40d0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 79 73 74 65  ;.    rc = syste
40e0: 6d 28 7a 53 79 73 29 3b 0a 20 20 20 20 69 66 28  m(zSys);.    if(
40f0: 20 72 63 20 29 20 65 72 72 6f 72 4d 65 73 73 61   rc ) errorMessa
4100: 67 65 28 22 73 79 73 74 65 6d 28 29 20 66 61 69  ge("system() fai
4110: 6c 73 20 77 69 74 68 20 65 72 72 6f 72 20 63 6f  ls with error co
4120: 64 65 20 25 64 22 2c 20 72 63 29 3b 0a 23 65 6c  de %d", rc);.#el
4130: 73 65 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 53  se.    {.      S
4140: 54 41 52 54 55 50 49 4e 46 4f 41 20 73 74 61 72  TARTUPINFOA star
4150: 74 75 70 49 6e 66 6f 3b 0a 20 20 20 20 20 20 50  tupInfo;.      P
4160: 52 4f 43 45 53 53 5f 49 4e 46 4f 52 4d 41 54 49  ROCESS_INFORMATI
4170: 4f 4e 20 70 72 6f 63 65 73 73 49 6e 66 6f 3b 0a  ON processInfo;.
4180: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73 74        memset(&st
4190: 61 72 74 75 70 49 6e 66 6f 2c 20 30 2c 20 73 69  artupInfo, 0, si
41a0: 7a 65 6f 66 28 73 74 61 72 74 75 70 49 6e 66 6f  zeof(startupInfo
41b0: 29 29 3b 0a 20 20 20 20 20 20 73 74 61 72 74 75  ));.      startu
41c0: 70 49 6e 66 6f 2e 63 62 20 3d 20 73 69 7a 65 6f  pInfo.cb = sizeo
41d0: 66 28 73 74 61 72 74 75 70 49 6e 66 6f 29 3b 0a  f(startupInfo);.
41e0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 70 72        memset(&pr
41f0: 6f 63 65 73 73 49 6e 66 6f 2c 20 30 2c 20 73 69  ocessInfo, 0, si
4200: 7a 65 6f 66 28 70 72 6f 63 65 73 73 49 6e 66 6f  zeof(processInfo
4210: 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 43  ));.      rc = C
4220: 72 65 61 74 65 50 72 6f 63 65 73 73 41 28 4e 55  reateProcessA(NU
4230: 4c 4c 2c 20 7a 53 79 73 2c 20 4e 55 4c 4c 2c 20  LL, zSys, NULL, 
4240: 4e 55 4c 4c 2c 20 46 41 4c 53 45 2c 20 30 2c 20  NULL, FALSE, 0, 
4250: 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 0a 20 20 20 20  NULL, NULL,.    
4260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4270: 20 20 20 20 26 73 74 61 72 74 75 70 49 6e 66 6f      &startupInfo
4280: 2c 20 26 70 72 6f 63 65 73 73 49 6e 66 6f 29 3b  , &processInfo);
4290: 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
42a0: 0a 20 20 20 20 20 20 20 20 43 6c 6f 73 65 48 61  .        CloseHa
42b0: 6e 64 6c 65 28 70 72 6f 63 65 73 73 49 6e 66 6f  ndle(processInfo
42c0: 2e 68 54 68 72 65 61 64 29 3b 0a 20 20 20 20 20  .hThread);.     
42d0: 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70     CloseHandle(p
42e0: 72 6f 63 65 73 73 49 6e 66 6f 2e 68 50 72 6f 63  rocessInfo.hProc
42f0: 65 73 73 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ess);.      }els
4300: 65 7b 0a 20 20 20 20 20 20 20 20 65 72 72 6f 72  e{.        error
4310: 4d 65 73 73 61 67 65 28 22 43 72 65 61 74 65 50  Message("CreateP
4320: 72 6f 63 65 73 73 41 28 29 20 66 61 69 6c 73 20  rocessA() fails 
4330: 77 69 74 68 20 65 72 72 6f 72 20 63 6f 64 65 20  with error code 
4340: 25 6c 75 22 2c 0a 20 20 20 20 20 20 20 20 20 20  %lu",.          
4350: 20 20 20 20 20 20 20 20 20 20 20 47 65 74 4c 61             GetLa
4360: 73 74 45 72 72 6f 72 28 29 29 3b 0a 20 20 20 20  stError());.    
4370: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
4380: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
4390: 65 28 7a 53 79 73 29 3b 0a 20 20 7d 0a 7d 0a 0a  e(zSys);.  }.}..
43a0: 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 65  /*.** Read the e
43b0: 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66  ntire content of
43c0: 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d   a file into mem
43d0: 6f 72 79 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ory.*/.static ch
43e0: 61 72 20 2a 72 65 61 64 46 69 6c 65 28 63 6f 6e  ar *readFile(con
43f0: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
4400: 6d 65 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 20  me){.  FILE *in 
4410: 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d  = fopen(zFilenam
4420: 65 2c 20 22 72 62 22 29 3b 0a 20 20 6c 6f 6e 67  e, "rb");.  long
4430: 20 73 7a 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a   sz;.  char *z;.
4440: 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20    if( in==0 ){. 
4450: 20 20 20 66 61 74 61 6c 45 72 72 6f 72 28 22 63     fatalError("c
4460: 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c  annot open \"%s\
4470: 22 20 66 6f 72 20 72 65 61 64 69 6e 67 22 2c 20  " for reading", 
4480: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 7d 0a  zFilename);.  }.
4490: 20 20 66 73 65 65 6b 28 69 6e 2c 20 30 2c 20 53    fseek(in, 0, S
44a0: 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 73 7a 20 3d  EEK_END);.  sz =
44b0: 20 66 74 65 6c 6c 28 69 6e 29 3b 0a 20 20 72 65   ftell(in);.  re
44c0: 77 69 6e 64 28 69 6e 29 3b 0a 20 20 7a 20 3d 20  wind(in);.  z = 
44d0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
44e0: 73 7a 2b 31 20 29 3b 0a 20 20 73 7a 20 3d 20 28  sz+1 );.  sz = (
44f0: 6c 6f 6e 67 29 66 72 65 61 64 28 7a 2c 20 31 2c  long)fread(z, 1,
4500: 20 73 7a 2c 20 69 6e 29 3b 0a 20 20 7a 5b 73 7a   sz, in);.  z[sz
4510: 5d 20 3d 20 30 3b 0a 20 20 66 63 6c 6f 73 65 28  ] = 0;.  fclose(
4520: 69 6e 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b  in);.  return z;
4530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
4540: 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74   the length of t
4550: 68 65 20 6e 65 78 74 20 74 6f 6b 65 6e 2e 0a 2a  he next token..*
4560: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 6f 6b  /.static int tok
4570: 65 6e 4c 65 6e 67 74 68 28 63 6f 6e 73 74 20 63  enLength(const c
4580: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 6e 4c  har *z, int *pnL
4590: 69 6e 65 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20  ine){.  int n = 
45a0: 30 3b 0a 20 20 69 66 28 20 69 73 73 70 61 63 65  0;.  if( isspace
45b0: 28 7a 5b 30 5d 29 20 7c 7c 20 28 7a 5b 30 5d 3d  (z[0]) || (z[0]=
45c0: 3d 27 2f 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2a  ='/' && z[1]=='*
45d0: 27 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 6e  ') ){.    int in
45e0: 43 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 63  C = 0;.    int c
45f0: 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d  ;.    if( z[0]==
4600: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 6e 43  '/' ){.      inC
4610: 20 3d 20 31 3b 0a 20 20 20 20 20 20 6e 20 3d 20   = 1;.      n = 
4620: 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  2;.    }.    whi
4630: 6c 65 28 20 28 63 20 3d 20 7a 5b 6e 2b 2b 5d 29  le( (c = z[n++])
4640: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  !=0 ){.      if(
4650: 20 63 3d 3d 27 5c 6e 27 20 29 20 28 2a 70 6e 4c   c=='\n' ) (*pnL
4660: 69 6e 65 29 2b 2b 3b 0a 20 20 20 20 20 20 69 66  ine)++;.      if
4670: 28 20 69 73 73 70 61 63 65 28 63 29 20 29 20 63  ( isspace(c) ) c
4680: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
4690: 66 28 20 69 6e 43 20 26 26 20 63 3d 3d 27 2a 27  f( inC && c=='*'
46a0: 20 26 26 20 7a 5b 6e 5d 3d 3d 27 2f 27 20 29 7b   && z[n]=='/' ){
46b0: 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20  .        n++;.  
46c0: 20 20 20 20 20 20 69 6e 43 20 3d 20 30 3b 0a 20        inC = 0;. 
46d0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21       }else if( !
46e0: 69 6e 43 20 26 26 20 63 3d 3d 27 2f 27 20 26 26  inC && c=='/' &&
46f0: 20 7a 5b 6e 5d 3d 3d 27 2a 27 20 29 7b 0a 20 20   z[n]=='*' ){.  
4700: 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20        n++;.     
4710: 20 20 20 69 6e 43 20 3d 20 31 3b 0a 20 20 20 20     inC = 1;.    
4720: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69 6e 43    }else if( !inC
4730: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
4740: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
4750: 0a 20 20 20 20 6e 2d 2d 3b 0a 20 20 7d 65 6c 73  .    n--;.  }els
4760: 65 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20  e if( z[0]=='-' 
4770: 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 7b 0a  && z[1]=='-' ){.
4780: 20 20 20 20 66 6f 72 28 6e 3d 32 3b 20 7a 5b 6e      for(n=2; z[n
4790: 5d 20 26 26 20 7a 5b 6e 5d 21 3d 27 5c 6e 27 3b  ] && z[n]!='\n';
47a0: 20 6e 2b 2b 29 7b 7d 0a 20 20 20 20 69 66 28 20   n++){}.    if( 
47b0: 7a 5b 6e 5d 20 29 7b 20 28 2a 70 6e 4c 69 6e 65  z[n] ){ (*pnLine
47c0: 29 2b 2b 3b 20 6e 2b 2b 3b 20 7d 0a 20 20 7d 65  )++; n++; }.  }e
47d0: 6c 73 65 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 22  lse if( z[0]=='"
47e0: 27 20 7c 7c 20 7a 5b 30 5d 3d 3d 27 5c 27 27 20  ' || z[0]=='\'' 
47f0: 29 7b 0a 20 20 20 20 69 6e 74 20 64 65 6c 69 6d  ){.    int delim
4800: 20 3d 20 7a 5b 30 5d 3b 0a 20 20 20 20 66 6f 72   = z[0];.    for
4810: 28 6e 3d 31 3b 20 7a 5b 6e 5d 3b 20 6e 2b 2b 29  (n=1; z[n]; n++)
4820: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 6e 5d  {.      if( z[n]
4830: 3d 3d 27 5c 6e 27 20 29 20 28 2a 70 6e 4c 69 6e  =='\n' ) (*pnLin
4840: 65 29 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  e)++;.      if( 
4850: 7a 5b 6e 5d 3d 3d 64 65 6c 69 6d 20 29 7b 0a 20  z[n]==delim ){. 
4860: 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20         n++;.    
4870: 20 20 20 20 69 66 28 20 7a 5b 6e 2b 31 5d 21 3d      if( z[n+1]!=
4880: 64 65 6c 69 6d 20 29 20 62 72 65 61 6b 3b 0a 20  delim ) break;. 
4890: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
48a0: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 63 3b  else{.    int c;
48b0: 0a 20 20 20 20 66 6f 72 28 6e 3d 31 3b 20 28 63  .    for(n=1; (c
48c0: 20 3d 20 7a 5b 6e 5d 29 21 3d 30 20 26 26 20 21   = z[n])!=0 && !
48d0: 69 73 73 70 61 63 65 28 63 29 20 26 26 20 63 21  isspace(c) && c!
48e0: 3d 27 22 27 20 26 26 20 63 21 3d 27 5c 27 27 20  ='"' && c!='\'' 
48f0: 26 26 20 63 21 3d 27 3b 27 3b 20 6e 2b 2b 29 7b  && c!=';'; n++){
4900: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
4910: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20  ;.}../*.** Copy 
4920: 61 20 73 69 6e 67 6c 65 20 74 6f 6b 65 6e 20 69  a single token i
4930: 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66  nto a string buf
4940: 66 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  fer..*/.static i
4950: 6e 74 20 65 78 74 72 61 63 74 54 6f 6b 65 6e 28  nt extractToken(
4960: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 2c  const char *zIn,
4970: 20 69 6e 74 20 6e 49 6e 2c 20 63 68 61 72 20 2a   int nIn, char *
4980: 7a 4f 75 74 2c 20 69 6e 74 20 6e 4f 75 74 29 7b  zOut, int nOut){
4990: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
49a0: 6e 49 6e 3c 3d 30 20 29 7b 0a 20 20 20 20 7a 4f  nIn<=0 ){.    zO
49b0: 75 74 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 72  ut[0] = 0;.    r
49c0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66  eturn 0;.  }.  f
49d0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 49 6e 20 26 26  or(i=0; i<nIn &&
49e0: 20 69 3c 6e 4f 75 74 2d 31 20 26 26 20 21 69 73   i<nOut-1 && !is
49f0: 73 70 61 63 65 28 7a 49 6e 5b 69 5d 29 3b 20 69  space(zIn[i]); i
4a00: 2b 2b 29 7b 20 7a 4f 75 74 5b 69 5d 20 3d 20 7a  ++){ zOut[i] = z
4a10: 49 6e 5b 69 5d 3b 20 7d 0a 20 20 7a 4f 75 74 5b  In[i]; }.  zOut[
4a20: 69 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  i] = 0;.  return
4a30: 20 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   i;.}../*.** Fin
4a40: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
4a50: 63 68 61 72 61 63 74 65 72 73 20 75 70 20 74 6f  characters up to
4a60: 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
4a70: 65 20 6e 65 78 74 20 22 2d 2d 65 6e 64 22 20 74  e next "--end" t
4a80: 6f 6b 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oken..*/.static 
4a90: 69 6e 74 20 66 69 6e 64 45 6e 64 28 63 6f 6e 73  int findEnd(cons
4aa0: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a  t char *z, int *
4ab0: 70 6e 4c 69 6e 65 29 7b 0a 20 20 69 6e 74 20 6e  pnLine){.  int n
4ac0: 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 7a   = 0;.  while( z
4ad0: 5b 6e 5d 20 26 26 20 28 73 74 72 6e 63 6d 70 28  [n] && (strncmp(
4ae0: 7a 2b 6e 2c 22 2d 2d 65 6e 64 22 2c 35 29 20 7c  z+n,"--end",5) |
4af0: 7c 20 21 69 73 73 70 61 63 65 28 7a 5b 6e 2b 35  | !isspace(z[n+5
4b00: 5d 29 29 20 29 7b 0a 20 20 20 20 6e 20 2b 3d 20  ])) ){.    n += 
4b10: 74 6f 6b 65 6e 4c 65 6e 67 74 68 28 7a 2b 6e 2c  tokenLength(z+n,
4b20: 20 70 6e 4c 69 6e 65 29 3b 0a 20 20 7d 0a 20 20   pnLine);.  }.  
4b30: 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
4b40: 2a 2a 20 46 69 6e 64 20 74 68 65 20 6e 75 6d 62  ** Find the numb
4b50: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
4b60: 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74   up to the first
4b70: 20 63 68 61 72 61 63 74 65 72 20 70 61 73 74 20   character past 
4b80: 74 68 65 0a 2a 2a 20 6f 66 20 74 68 65 20 6e 65  the.** of the ne
4b90: 78 74 20 22 2d 2d 65 6e 64 69 66 22 20 20 6f 72  xt "--endif"  or
4ba0: 20 22 2d 2d 65 6c 73 65 22 20 74 6f 6b 65 6e 2e   "--else" token.
4bb0: 20 4e 65 73 74 65 64 20 2d 2d 69 66 20 63 6f 6d   Nested --if com
4bc0: 6d 61 6e 64 73 20 61 72 65 0a 2a 2a 20 61 6c 73  mands are.** als
4bd0: 6f 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74  o skipped..*/.st
4be0: 61 74 69 63 20 69 6e 74 20 66 69 6e 64 45 6e 64  atic int findEnd
4bf0: 69 66 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  if(const char *z
4c00: 2c 20 69 6e 74 20 73 74 6f 70 41 74 45 6c 73 65  , int stopAtElse
4c10: 2c 20 69 6e 74 20 2a 70 6e 4c 69 6e 65 29 7b 0a  , int *pnLine){.
4c20: 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 77    int n = 0;.  w
4c30: 68 69 6c 65 28 20 7a 5b 6e 5d 20 29 7b 0a 20 20  hile( z[n] ){.  
4c40: 20 20 69 6e 74 20 6c 65 6e 20 3d 20 74 6f 6b 65    int len = toke
4c50: 6e 4c 65 6e 67 74 68 28 7a 2b 6e 2c 20 70 6e 4c  nLength(z+n, pnL
4c60: 69 6e 65 29 3b 0a 20 20 20 20 69 66 28 20 28 73  ine);.    if( (s
4c70: 74 72 6e 63 6d 70 28 7a 2b 6e 2c 22 2d 2d 65 6e  trncmp(z+n,"--en
4c80: 64 69 66 22 2c 37 29 3d 3d 30 20 26 26 20 69 73  dif",7)==0 && is
4c90: 73 70 61 63 65 28 7a 5b 6e 2b 37 5d 29 29 0a 20  space(z[n+7])). 
4ca0: 20 20 20 20 7c 7c 20 28 73 74 6f 70 41 74 45 6c      || (stopAtEl
4cb0: 73 65 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 2b  se && strncmp(z+
4cc0: 6e 2c 22 2d 2d 65 6c 73 65 22 2c 36 29 3d 3d 30  n,"--else",6)==0
4cd0: 20 26 26 20 69 73 73 70 61 63 65 28 7a 5b 6e 2b   && isspace(z[n+
4ce0: 36 5d 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  6])).    ){.    
4cf0: 20 20 72 65 74 75 72 6e 20 6e 2b 6c 65 6e 3b 0a    return n+len;.
4d00: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
4d10: 72 6e 63 6d 70 28 7a 2b 6e 2c 22 2d 2d 69 66 22  rncmp(z+n,"--if"
4d20: 2c 34 29 3d 3d 30 20 26 26 20 69 73 73 70 61 63  ,4)==0 && isspac
4d30: 65 28 7a 5b 6e 2b 34 5d 29 20 29 7b 0a 20 20 20  e(z[n+4]) ){.   
4d40: 20 20 20 69 6e 74 20 73 6b 69 70 20 3d 20 66 69     int skip = fi
4d50: 6e 64 45 6e 64 69 66 28 7a 2b 6e 2b 6c 65 6e 2c  ndEndif(z+n+len,
4d60: 20 30 2c 20 70 6e 4c 69 6e 65 29 3b 0a 20 20 20   0, pnLine);.   
4d70: 20 20 20 6e 20 2b 3d 20 73 6b 69 70 20 2b 20 6c     n += skip + l
4d80: 65 6e 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  en;.    }else{. 
4d90: 20 20 20 20 20 6e 20 2b 3d 20 6c 65 6e 3b 0a 20       n += len;. 
4da0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
4db0: 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  n n;.}../*.** Wa
4dc0: 69 74 20 66 6f 72 20 61 20 63 6c 69 65 6e 74 20  it for a client 
4dd0: 70 72 6f 63 65 73 73 20 74 6f 20 63 6f 6d 70 6c  process to compl
4de0: 65 74 65 20 61 6c 6c 20 69 74 73 20 74 61 73 6b  ete all its task
4df0: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  s.*/.static void
4e00: 20 77 61 69 74 46 6f 72 43 6c 69 65 6e 74 28 69   waitForClient(i
4e10: 6e 74 20 69 43 6c 69 65 6e 74 2c 20 69 6e 74 20  nt iClient, int 
4e20: 69 54 69 6d 65 6f 75 74 2c 20 63 68 61 72 20 2a  iTimeout, char *
4e30: 7a 45 72 72 50 72 65 66 69 78 29 7b 0a 20 20 73  zErrPrefix){.  s
4e40: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
4e50: 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  mt;.  int rc;.  
4e60: 69 66 28 20 69 43 6c 69 65 6e 74 3e 30 20 29 7b  if( iClient>0 ){
4e70: 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 70 72 65  .    pStmt = pre
4e80: 70 61 72 65 53 71 6c 28 0a 20 20 20 20 20 20 20  pareSql(.       
4e90: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
4ea0: 31 20 46 52 4f 4d 20 74 61 73 6b 22 0a 20 20 20  1 FROM task".   
4eb0: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48              " WH
4ec0: 45 52 45 20 63 6c 69 65 6e 74 3d 25 64 22 0a 20  ERE client=%d". 
4ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
4ee0: 20 20 41 4e 44 20 63 6c 69 65 6e 74 20 49 4e 20    AND client IN 
4ef0: 28 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20  (SELECT id FROM 
4f00: 63 6c 69 65 6e 74 29 22 0a 20 20 20 20 20 20 20  client)".       
4f10: 20 20 20 20 20 20 20 20 22 20 20 41 4e 44 20 65          "  AND e
4f20: 6e 64 74 69 6d 65 20 49 53 20 4e 55 4c 4c 22 2c  ndtime IS NULL",
4f30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4f40: 69 43 6c 69 65 6e 74 29 3b 0a 20 20 7d 65 6c 73  iClient);.  }els
4f50: 65 7b 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 70  e{.    pStmt = p
4f60: 72 65 70 61 72 65 53 71 6c 28 0a 20 20 20 20 20  repareSql(.     
4f70: 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
4f80: 54 20 31 20 46 52 4f 4d 20 74 61 73 6b 22 0a 20  T 1 FROM task". 
4f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
4fa0: 57 48 45 52 45 20 63 6c 69 65 6e 74 20 49 4e 20  WHERE client IN 
4fb0: 28 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20  (SELECT id FROM 
4fc0: 63 6c 69 65 6e 74 29 22 0a 20 20 20 20 20 20 20  client)".       
4fd0: 20 20 20 20 20 20 20 20 22 20 20 20 41 4e 44 20          "   AND 
4fe0: 65 6e 64 74 69 6d 65 20 49 53 20 4e 55 4c 4c 22  endtime IS NULL"
4ff0: 29 3b 0a 20 20 7d 0a 20 20 67 2e 69 54 69 6d 65  );.  }.  g.iTime
5000: 6f 75 74 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65  out = 0;.  while
5010: 28 20 28 28 72 63 20 3d 20 73 71 6c 69 74 65 33  ( ((rc = sqlite3
5020: 5f 73 74 65 70 28 70 53 74 6d 74 29 29 3d 3d 53  _step(pStmt))==S
5030: 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 72 63  QLITE_BUSY || rc
5040: 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 29 0a 20 20  ==SQLITE_ROW).  
5050: 20 20 26 26 20 69 54 69 6d 65 6f 75 74 3e 30 0a    && iTimeout>0.
5060: 20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33    ){.    sqlite3
5070: 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
5080: 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70     sqlite3_sleep
5090: 28 35 30 29 3b 0a 20 20 20 20 69 54 69 6d 65 6f  (50);.    iTimeo
50a0: 75 74 20 2d 3d 20 35 30 3b 0a 20 20 7d 0a 20 20  ut -= 50;.  }.  
50b0: 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
50c0: 28 70 53 74 6d 74 29 3b 0a 20 20 67 2e 69 54 69  (pStmt);.  g.iTi
50d0: 6d 65 6f 75 74 20 3d 20 44 45 46 41 55 4c 54 5f  meout = DEFAULT_
50e0: 54 49 4d 45 4f 55 54 3b 0a 20 20 69 66 28 20 72  TIMEOUT;.  if( r
50f0: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
5100: 7b 0a 20 20 20 20 69 66 28 20 7a 45 72 72 50 72  {.    if( zErrPr
5110: 65 66 69 78 3d 3d 30 20 29 20 7a 45 72 72 50 72  efix==0 ) zErrPr
5120: 65 66 69 78 20 3d 20 22 22 3b 0a 20 20 20 20 69  efix = "";.    i
5130: 66 28 20 69 43 6c 69 65 6e 74 3e 30 20 29 7b 0a  f( iClient>0 ){.
5140: 20 20 20 20 20 20 65 72 72 6f 72 4d 65 73 73 61        errorMessa
5150: 67 65 28 22 25 73 74 69 6d 65 6f 75 74 20 77 61  ge("%stimeout wa
5160: 69 74 69 6e 67 20 66 6f 72 20 63 6c 69 65 6e 74  iting for client
5170: 20 25 64 22 2c 20 7a 45 72 72 50 72 65 66 69 78   %d", zErrPrefix
5180: 2c 20 69 43 6c 69 65 6e 74 29 3b 0a 20 20 20 20  , iClient);.    
5190: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 72 72  }else{.      err
51a0: 6f 72 4d 65 73 73 61 67 65 28 22 25 73 74 69 6d  orMessage("%stim
51b0: 65 6f 75 74 20 77 61 69 74 69 6e 67 20 66 6f 72  eout waiting for
51c0: 20 61 6c 6c 20 63 6c 69 65 6e 74 73 22 2c 20 7a   all clients", z
51d0: 45 72 72 50 72 65 66 69 78 29 3b 0a 20 20 20 20  ErrPrefix);.    
51e0: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 74 75  }.  }.}../* Retu
51f0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
5200: 74 68 65 20 74 61 69 6c 20 6f 66 20 61 20 66 69  the tail of a fi
5210: 6c 65 6e 61 6d 65 0a 2a 2f 0a 73 74 61 74 69 63  lename.*/.static
5220: 20 63 68 61 72 20 2a 66 69 6c 65 6e 61 6d 65 54   char *filenameT
5230: 61 69 6c 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20  ail(char *z){.  
5240: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 66 6f 72 28  int i, j;.  for(
5250: 69 3d 6a 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  i=j=0; z[i]; i++
5260: 29 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20  ) if( z[i]=='/' 
5270: 29 20 6a 20 3d 20 69 2b 31 3b 0a 20 20 72 65 74  ) j = i+1;.  ret
5280: 75 72 6e 20 7a 2b 6a 3b 0a 7d 0a 0a 2f 2a 20 4d  urn z+j;.}../* M
5290: 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66  aximum number of
52a0: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 61 20   arguments to a 
52b0: 2d 2d 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 23 64 65  --command */.#de
52c0: 66 69 6e 65 20 4d 58 5f 41 52 47 20 32 0a 0a 2f  fine MX_ARG 2../
52d0: 2a 0a 2a 2a 20 52 75 6e 20 61 20 73 63 72 69 70  *.** Run a scrip
52e0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
52f0: 64 20 72 75 6e 53 63 72 69 70 74 28 0a 20 20 69  d runScript(.  i
5300: 6e 74 20 69 43 6c 69 65 6e 74 2c 20 20 20 20 20  nt iClient,     
5310: 20 20 2f 2a 20 54 68 65 20 63 6c 69 65 6e 74 20    /* The client 
5320: 6e 75 6d 62 65 72 2c 20 6f 72 20 30 20 66 6f 72  number, or 0 for
5330: 20 74 68 65 20 6d 61 73 74 65 72 20 2a 2f 0a 20   the master */. 
5340: 20 69 6e 74 20 74 61 73 6b 49 64 2c 20 20 20 20   int taskId,    
5350: 20 20 20 20 2f 2a 20 54 68 65 20 74 61 73 6b 20      /* The task 
5360: 49 44 20 66 6f 72 20 63 6c 69 65 6e 74 73 2e 20  ID for clients. 
5370: 20 30 20 66 6f 72 20 6d 61 73 74 65 72 20 2a 2f   0 for master */
5380: 0a 20 20 63 68 61 72 20 2a 7a 53 63 72 69 70 74  .  char *zScript
5390: 2c 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66  ,     /* Text of
53a0: 20 74 68 65 20 73 63 72 69 70 74 20 2a 2f 0a 20   the script */. 
53b0: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
53c0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 66 72 6f 6d      /* File from
53d0: 20 77 68 69 63 68 20 73 63 72 69 70 74 20 77 61   which script wa
53e0: 73 20 72 65 61 64 2e 20 2a 2f 0a 29 7b 0a 20 20  s read. */.){.  
53f0: 69 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 31 3b 0a  int lineno = 1;.
5400: 20 20 69 6e 74 20 70 72 65 76 4c 69 6e 65 20 3d    int prevLine =
5410: 20 31 3b 0a 20 20 69 6e 74 20 69 69 20 3d 20 30   1;.  int ii = 0
5420: 3b 0a 20 20 69 6e 74 20 69 42 65 67 69 6e 20 3d  ;.  int iBegin =
5430: 20 30 3b 0a 20 20 69 6e 74 20 6e 2c 20 63 2c 20   0;.  int n, c, 
5440: 6a 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  j;.  int len;.  
5450: 69 6e 74 20 6e 41 72 67 3b 0a 20 20 53 74 72 69  int nArg;.  Stri
5460: 6e 67 20 73 52 65 73 75 6c 74 3b 0a 20 20 63 68  ng sResult;.  ch
5470: 61 72 20 7a 43 6d 64 5b 33 30 5d 3b 0a 20 20 63  ar zCmd[30];.  c
5480: 68 61 72 20 7a 45 72 72 6f 72 5b 31 30 30 30 5d  har zError[1000]
5490: 3b 0a 20 20 63 68 61 72 20 61 7a 41 72 67 5b 4d  ;.  char azArg[M
54a0: 58 5f 41 52 47 5d 5b 31 30 30 5d 3b 0a 0a 20 20  X_ARG][100];..  
54b0: 6d 65 6d 73 65 74 28 26 73 52 65 73 75 6c 74 2c  memset(&sResult,
54c0: 20 30 2c 20 73 69 7a 65 6f 66 28 73 52 65 73 75   0, sizeof(sResu
54d0: 6c 74 29 29 3b 0a 20 20 73 74 72 69 6e 67 52 65  lt));.  stringRe
54e0: 73 65 74 28 26 73 52 65 73 75 6c 74 29 3b 0a 20  set(&sResult);. 
54f0: 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 53 63   while( (c = zSc
5500: 72 69 70 74 5b 69 69 5d 29 21 3d 30 20 29 7b 0a  ript[ii])!=0 ){.
5510: 20 20 20 20 70 72 65 76 4c 69 6e 65 20 3d 20 6c      prevLine = l
5520: 69 6e 65 6e 6f 3b 0a 20 20 20 20 6c 65 6e 20 3d  ineno;.    len =
5530: 20 74 6f 6b 65 6e 4c 65 6e 67 74 68 28 7a 53 63   tokenLength(zSc
5540: 72 69 70 74 2b 69 69 2c 20 26 6c 69 6e 65 6e 6f  ript+ii, &lineno
5550: 29 3b 0a 20 20 20 20 69 66 28 20 69 73 73 70 61  );.    if( isspa
5560: 63 65 28 63 29 20 7c 7c 20 28 63 3d 3d 27 2f 27  ce(c) || (c=='/'
5570: 20 26 26 20 7a 53 63 72 69 70 74 5b 69 69 2b 31   && zScript[ii+1
5580: 5d 3d 3d 27 2a 27 29 20 29 7b 0a 20 20 20 20 20  ]=='*') ){.     
5590: 20 69 69 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20   ii += len;.    
55a0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
55b0: 7d 0a 20 20 20 20 69 66 28 20 63 21 3d 27 2d 27  }.    if( c!='-'
55c0: 20 7c 7c 20 7a 53 63 72 69 70 74 5b 69 69 2b 31   || zScript[ii+1
55d0: 5d 21 3d 27 2d 27 20 7c 7c 20 21 69 73 61 6c 70  ]!='-' || !isalp
55e0: 68 61 28 7a 53 63 72 69 70 74 5b 69 69 2b 32 5d  ha(zScript[ii+2]
55f0: 29 20 29 7b 0a 20 20 20 20 20 20 69 69 20 2b 3d  ) ){.      ii +=
5600: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 74   len;.      cont
5610: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  inue;.    }..   
5620: 20 2f 2a 20 52 75 6e 20 61 6e 79 20 70 72 69 6f   /* Run any prio
5630: 72 20 53 51 4c 20 62 65 66 6f 72 65 20 70 72 6f  r SQL before pro
5640: 63 65 73 73 69 6e 67 20 74 68 65 20 6e 65 77 20  cessing the new 
5650: 2d 2d 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20  --command */.   
5660: 20 69 66 28 20 69 69 3e 69 42 65 67 69 6e 20 29   if( ii>iBegin )
5670: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53  {.      char *zS
5680: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
5690: 69 6e 74 66 28 22 25 2e 2a 73 22 2c 20 69 69 2d  intf("%.*s", ii-
56a0: 69 42 65 67 69 6e 2c 20 7a 53 63 72 69 70 74 2b  iBegin, zScript+
56b0: 69 42 65 67 69 6e 29 3b 0a 20 20 20 20 20 20 65  iBegin);.      e
56c0: 76 61 6c 53 71 6c 28 26 73 52 65 73 75 6c 74 2c  valSql(&sResult,
56d0: 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71   zSql);.      sq
56e0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
56f0: 3b 0a 20 20 20 20 20 20 69 42 65 67 69 6e 20 3d  ;.      iBegin =
5700: 20 69 69 20 2b 20 6c 65 6e 3b 0a 20 20 20 20 7d   ii + len;.    }
5710: 0a 0a 20 20 20 20 2f 2a 20 50 61 72 73 65 20 74  ..    /* Parse t
5720: 68 65 20 2d 2d 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  he --command */.
5730: 20 20 20 20 69 66 28 20 67 2e 69 54 72 61 63 65      if( g.iTrace
5740: 3e 3d 32 20 29 20 6c 6f 67 4d 65 73 73 61 67 65  >=2 ) logMessage
5750: 28 22 25 2e 2a 73 22 2c 20 6c 65 6e 2c 20 7a 53  ("%.*s", len, zS
5760: 63 72 69 70 74 2b 69 69 29 3b 0a 20 20 20 20 6e  cript+ii);.    n
5770: 20 3d 20 65 78 74 72 61 63 74 54 6f 6b 65 6e 28   = extractToken(
5780: 7a 53 63 72 69 70 74 2b 69 69 2b 32 2c 20 6c 65  zScript+ii+2, le
5790: 6e 2d 32 2c 20 7a 43 6d 64 2c 20 73 69 7a 65 6f  n-2, zCmd, sizeo
57a0: 66 28 7a 43 6d 64 29 29 3b 0a 20 20 20 20 66 6f  f(zCmd));.    fo
57b0: 72 28 6e 41 72 67 3d 30 3b 20 6e 3c 6c 65 6e 2d  r(nArg=0; n<len-
57c0: 32 20 26 26 20 6e 41 72 67 3c 4d 58 5f 41 52 47  2 && nArg<MX_ARG
57d0: 3b 20 6e 41 72 67 2b 2b 29 7b 0a 20 20 20 20 20  ; nArg++){.     
57e0: 20 77 68 69 6c 65 28 20 6e 3c 6c 65 6e 2d 32 20   while( n<len-2 
57f0: 26 26 20 69 73 73 70 61 63 65 28 7a 53 63 72 69  && isspace(zScri
5800: 70 74 5b 69 69 2b 32 2b 6e 5d 29 20 29 7b 20 6e  pt[ii+2+n]) ){ n
5810: 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20  ++; }.      if( 
5820: 6e 3e 3d 6c 65 6e 2d 32 20 29 20 62 72 65 61 6b  n>=len-2 ) break
5830: 3b 0a 20 20 20 20 20 20 6e 20 2b 3d 20 65 78 74  ;.      n += ext
5840: 72 61 63 74 54 6f 6b 65 6e 28 7a 53 63 72 69 70  ractToken(zScrip
5850: 74 2b 69 69 2b 32 2b 6e 2c 20 6c 65 6e 2d 32 2d  t+ii+2+n, len-2-
5860: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
5870: 20 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67             azArg
5880: 5b 6e 41 72 67 5d 2c 20 73 69 7a 65 6f 66 28 61  [nArg], sizeof(a
5890: 7a 41 72 67 5b 6e 41 72 67 5d 29 29 3b 0a 20 20  zArg[nArg]));.  
58a0: 20 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 6e 41    }.    for(j=nA
58b0: 72 67 3b 20 6a 3c 4d 58 5f 41 52 47 3b 20 6a 2b  rg; j<MX_ARG; j+
58c0: 2b 29 20 61 7a 41 72 67 5b 6a 2b 2b 5d 5b 30 5d  +) azArg[j++][0]
58d0: 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20   = 0;..    /*.  
58e0: 20 20 2a 2a 20 20 2d 2d 73 6c 65 65 70 20 4e 0a    **  --sleep N.
58f0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 50 61      **.    ** Pa
5900: 75 73 65 20 66 6f 72 20 4e 20 6d 69 6c 6c 69 73  use for N millis
5910: 65 63 6f 6e 64 73 0a 20 20 20 20 2a 2f 0a 20 20  econds.    */.  
5920: 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d    if( strcmp(zCm
5930: 64 2c 20 22 73 6c 65 65 70 22 29 3d 3d 30 20 29  d, "sleep")==0 )
5940: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
5950: 73 6c 65 65 70 28 61 74 6f 69 28 61 7a 41 72 67  sleep(atoi(azArg
5960: 5b 30 5d 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  [0]));.    }else
5970: 20 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a   ..    /*.    **
5980: 20 20 20 2d 2d 65 78 69 74 20 4e 0a 20 20 20 20     --exit N.    
5990: 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 69 74 20 74  **.    ** Exit t
59a0: 68 69 73 20 70 72 6f 63 65 73 73 2e 20 20 49 66  his process.  If
59b0: 20 4e 3e 30 20 74 68 65 6e 20 65 78 69 74 20 77   N>0 then exit w
59c0: 69 74 68 6f 75 74 20 73 68 75 74 74 69 6e 67 20  ithout shutting 
59d0: 64 6f 77 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 69  down.    ** SQLi
59e0: 74 65 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77  te.  (In other w
59f0: 6f 72 64 73 2c 20 73 69 6d 75 6c 61 74 65 20 61  ords, simulate a
5a00: 20 63 72 61 73 68 2e 29 0a 20 20 20 20 2a 2f 0a   crash.).    */.
5a10: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
5a20: 43 6d 64 2c 20 22 65 78 69 74 22 29 3d 3d 30 20  Cmd, "exit")==0 
5a30: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20  ){.      int rc 
5a40: 3d 20 61 74 6f 69 28 61 7a 41 72 67 5b 30 5d 29  = atoi(azArg[0])
5a50: 3b 0a 20 20 20 20 20 20 66 69 6e 69 73 68 53 63  ;.      finishSc
5a60: 72 69 70 74 28 69 43 6c 69 65 6e 74 2c 20 74 61  ript(iClient, ta
5a70: 73 6b 49 64 2c 20 31 29 3b 0a 20 20 20 20 20 20  skId, 1);.      
5a80: 69 66 28 20 72 63 3d 3d 30 20 29 20 73 71 6c 69  if( rc==0 ) sqli
5a90: 74 65 33 5f 63 6c 6f 73 65 28 67 2e 64 62 29 3b  te3_close(g.db);
5aa0: 0a 20 20 20 20 20 20 65 78 69 74 28 72 63 29 3b  .      exit(rc);
5ab0: 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20  .    }else..    
5ac0: 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 2d 2d 74 65  /*.    **   --te
5ad0: 73 74 63 61 73 65 20 4e 41 4d 45 0a 20 20 20 20  stcase NAME.    
5ae0: 2a 2a 0a 20 20 20 20 2a 2a 20 45 78 69 74 20 74  **.    ** Exit t
5af0: 68 69 73 20 70 72 6f 63 65 73 73 2e 20 20 49 66  his process.  If
5b00: 20 4e 3e 30 20 74 68 65 6e 20 65 78 69 74 20 77   N>0 then exit w
5b10: 69 74 68 6f 75 74 20 73 68 75 74 74 69 6e 67 20  ithout shutting 
5b20: 64 6f 77 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 69  down.    ** SQLi
5b30: 74 65 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77  te.  (In other w
5b40: 6f 72 64 73 2c 20 73 69 6d 75 6c 61 74 65 20 61  ords, simulate a
5b50: 20 63 72 61 73 68 2e 29 0a 20 20 20 20 2a 2f 0a   crash.).    */.
5b60: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
5b70: 43 6d 64 2c 20 22 74 65 73 74 63 61 73 65 22 29  Cmd, "testcase")
5b80: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
5b90: 20 67 2e 69 54 72 61 63 65 3d 3d 31 20 29 20 6c   g.iTrace==1 ) l
5ba0: 6f 67 4d 65 73 73 61 67 65 28 22 25 2e 2a 73 22  ogMessage("%.*s"
5bb0: 2c 20 6c 65 6e 20 2d 20 31 2c 20 7a 53 63 72 69  , len - 1, zScri
5bc0: 70 74 2b 69 69 29 3b 0a 20 20 20 20 20 20 73 74  pt+ii);.      st
5bd0: 72 69 6e 67 52 65 73 65 74 28 26 73 52 65 73 75  ringReset(&sResu
5be0: 6c 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 0a  lt);.    }else..
5bf0: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20      /*.    **   
5c00: 2d 2d 66 69 6e 69 73 68 0a 20 20 20 20 2a 2a 0a  --finish.    **.
5c10: 20 20 20 20 2a 2a 20 4d 61 72 6b 20 74 68 65 20      ** Mark the 
5c20: 63 75 72 72 65 6e 74 20 74 61 73 6b 20 61 73 20  current task as 
5c30: 68 61 76 69 6e 67 20 66 69 6e 69 73 68 65 64 2c  having finished,
5c40: 20 65 76 65 6e 20 69 66 20 69 74 20 69 73 20 6e   even if it is n
5c50: 6f 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  ot..    ** This 
5c60: 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 63  can be used in c
5c70: 6f 6e 6a 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  onjunction with 
5c80: 2d 2d 65 78 69 74 20 74 6f 20 73 69 6d 75 6c 61  --exit to simula
5c90: 74 65 20 61 20 63 72 61 73 68 2e 0a 20 20 20 20  te a crash..    
5ca0: 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  */.    if( strcm
5cb0: 70 28 7a 43 6d 64 2c 20 22 66 69 6e 69 73 68 22  p(zCmd, "finish"
5cc0: 29 3d 3d 30 20 26 26 20 69 43 6c 69 65 6e 74 3e  )==0 && iClient>
5cd0: 30 20 29 7b 0a 20 20 20 20 20 20 66 69 6e 69 73  0 ){.      finis
5ce0: 68 53 63 72 69 70 74 28 69 43 6c 69 65 6e 74 2c  hScript(iClient,
5cf0: 20 74 61 73 6b 49 64 2c 20 31 29 3b 0a 20 20 20   taskId, 1);.   
5d00: 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a 20   }else..    /*. 
5d10: 20 20 20 2a 2a 20 20 2d 2d 72 65 73 65 74 0a 20     **  --reset. 
5d20: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 73     **.    ** Res
5d30: 65 74 20 61 63 63 75 6d 75 6c 61 74 65 64 20 72  et accumulated r
5d40: 65 73 75 6c 74 73 20 62 61 63 6b 20 74 6f 20 61  esults back to a
5d50: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 0a 20  n empty string. 
5d60: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74     */.    if( st
5d70: 72 63 6d 70 28 7a 43 6d 64 2c 20 22 72 65 73 65  rcmp(zCmd, "rese
5d80: 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
5d90: 73 74 72 69 6e 67 52 65 73 65 74 28 26 73 52 65  stringReset(&sRe
5da0: 73 75 6c 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65  sult);.    }else
5db0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
5dc0: 20 2d 2d 6d 61 74 63 68 20 41 4e 53 57 45 52 2e   --match ANSWER.
5dd0: 2e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ...    **.    **
5de0: 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
5df0: 20 6f 75 74 70 75 74 20 6d 61 74 63 68 65 73 20   output matches 
5e00: 41 4e 53 57 45 52 2e 20 20 52 65 70 6f 72 74 20  ANSWER.  Report 
5e10: 61 6e 20 65 72 72 6f 72 20 69 66 20 6e 6f 74 2e  an error if not.
5e20: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
5e30: 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 6d 61  strcmp(zCmd, "ma
5e40: 74 63 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tch")==0 ){.    
5e50: 20 20 69 6e 74 20 6a 6a 3b 0a 20 20 20 20 20 20    int jj;.      
5e60: 63 68 61 72 20 2a 7a 41 6e 73 20 3d 20 7a 53 63  char *zAns = zSc
5e70: 72 69 70 74 2b 69 69 3b 0a 20 20 20 20 20 20 66  ript+ii;.      f
5e80: 6f 72 28 6a 6a 3d 37 3b 20 6a 6a 3c 6c 65 6e 2d  or(jj=7; jj<len-
5e90: 31 20 26 26 20 69 73 73 70 61 63 65 28 7a 41 6e  1 && isspace(zAn
5ea0: 73 5b 6a 6a 5d 29 3b 20 6a 6a 2b 2b 29 7b 7d 0a  s[jj]); jj++){}.
5eb0: 20 20 20 20 20 20 7a 41 6e 73 20 2b 3d 20 6a 6a        zAns += jj
5ec0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e  ;.      if( strn
5ed0: 63 6d 70 28 73 52 65 73 75 6c 74 2e 7a 2c 20 7a  cmp(sResult.z, z
5ee0: 41 6e 73 2c 20 6c 65 6e 2d 6a 6a 2d 31 29 20 29  Ans, len-jj-1) )
5ef0: 7b 0a 20 20 20 20 20 20 20 20 65 72 72 6f 72 4d  {.        errorM
5f00: 65 73 73 61 67 65 28 22 6c 69 6e 65 20 25 64 20  essage("line %d 
5f10: 6f 66 20 25 73 3a 5c 6e 45 78 70 65 63 74 65 64  of %s:\nExpected
5f20: 20 5b 25 2e 2a 73 5d 5c 6e 20 20 20 20 20 47 6f   [%.*s]\n     Go
5f30: 74 20 5b 25 73 5d 22 2c 0a 20 20 20 20 20 20 20  t [%s]",.       
5f40: 20 20 20 70 72 65 76 4c 69 6e 65 2c 20 7a 46 69     prevLine, zFi
5f50: 6c 65 6e 61 6d 65 2c 20 6c 65 6e 2d 6a 6a 2d 31  lename, len-jj-1
5f60: 2c 20 7a 41 6e 73 2c 20 73 52 65 73 75 6c 74 2e  , zAns, sResult.
5f70: 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  z);.      }.    
5f80: 20 20 67 2e 6e 54 65 73 74 2b 2b 3b 0a 20 20 20    g.nTest++;.   
5f90: 20 20 20 73 74 72 69 6e 67 52 65 73 65 74 28 26     stringReset(&
5fa0: 73 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 7d 65  sResult);.    }e
5fb0: 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  lse..    /*.    
5fc0: 2a 2a 20 20 2d 2d 67 6c 6f 62 20 41 4e 53 57 45  **  --glob ANSWE
5fd0: 52 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 2d 2d 6e  R....    **  --n
5fe0: 6f 74 67 6c 6f 62 20 41 4e 53 57 45 52 2e 2e 2e  otglob ANSWER...
5ff0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
6000: 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
6010: 6f 75 74 70 75 74 20 64 6f 65 73 20 6f 72 20 64  output does or d
6020: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68  oes not match th
6030: 65 20 67 6c 6f 62 20 70 61 74 74 65 72 6e 0a 20  e glob pattern. 
6040: 20 20 20 2a 2a 20 41 4e 53 57 45 52 2e 0a 20 20     ** ANSWER..  
6050: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72    */.    if( str
6060: 63 6d 70 28 7a 43 6d 64 2c 20 22 67 6c 6f 62 22  cmp(zCmd, "glob"
6070: 29 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28 7a  )==0 || strcmp(z
6080: 43 6d 64 2c 20 22 6e 6f 74 67 6c 6f 62 22 29 3d  Cmd, "notglob")=
6090: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
60a0: 6a 6a 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  jj;.      char *
60b0: 7a 41 6e 73 20 3d 20 7a 53 63 72 69 70 74 2b 69  zAns = zScript+i
60c0: 69 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  i;.      char *z
60d0: 43 6f 70 79 3b 0a 20 20 20 20 20 20 69 6e 74 20  Copy;.      int 
60e0: 69 73 47 6c 6f 62 20 3d 20 28 7a 43 6d 64 5b 30  isGlob = (zCmd[0
60f0: 5d 3d 3d 27 67 27 29 3b 0a 20 20 20 20 20 20 66  ]=='g');.      f
6100: 6f 72 28 6a 6a 3d 39 2d 33 2a 69 73 47 6c 6f 62  or(jj=9-3*isGlob
6110: 3b 20 6a 6a 3c 6c 65 6e 2d 31 20 26 26 20 69 73  ; jj<len-1 && is
6120: 73 70 61 63 65 28 7a 41 6e 73 5b 6a 6a 5d 29 3b  space(zAns[jj]);
6130: 20 6a 6a 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 7a   jj++){}.      z
6140: 41 6e 73 20 2b 3d 20 6a 6a 3b 0a 20 20 20 20 20  Ans += jj;.     
6150: 20 7a 43 6f 70 79 20 3d 20 73 71 6c 69 74 65 33   zCopy = sqlite3
6160: 5f 6d 70 72 69 6e 74 66 28 22 25 2e 2a 73 22 2c  _mprintf("%.*s",
6170: 20 6c 65 6e 2d 6a 6a 2d 31 2c 20 7a 41 6e 73 29   len-jj-1, zAns)
6180: 3b 0a 20 20 20 20 20 20 69 66 28 20 28 73 71 6c  ;.      if( (sql
6190: 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 7a 43 6f  ite3_strglob(zCo
61a0: 70 79 2c 20 73 52 65 73 75 6c 74 2e 7a 29 3d 3d  py, sResult.z)==
61b0: 30 29 5e 69 73 47 6c 6f 62 20 29 7b 0a 20 20 20  0)^isGlob ){.   
61c0: 20 20 20 20 20 65 72 72 6f 72 4d 65 73 73 61 67       errorMessag
61d0: 65 28 22 6c 69 6e 65 20 25 64 20 6f 66 20 25 73  e("line %d of %s
61e0: 3a 5c 6e 45 78 70 65 63 74 65 64 20 5b 25 73 5d  :\nExpected [%s]
61f0: 5c 6e 20 20 20 20 20 47 6f 74 20 5b 25 73 5d 22  \n     Got [%s]"
6200: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 72 65 76  ,.          prev
6210: 4c 69 6e 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  Line, zFilename,
6220: 20 7a 43 6f 70 79 2c 20 73 52 65 73 75 6c 74 2e   zCopy, sResult.
6230: 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  z);.      }.    
6240: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
6250: 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 67 2e 6e  Copy);.      g.n
6260: 54 65 73 74 2b 2b 3b 0a 20 20 20 20 20 20 73 74  Test++;.      st
6270: 72 69 6e 67 52 65 73 65 74 28 26 73 52 65 73 75  ringReset(&sResu
6280: 6c 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 0a  lt);.    }else..
6290: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 2d      /*.    **  -
62a0: 2d 6f 75 74 70 75 74 0a 20 20 20 20 2a 2a 0a 20  -output.    **. 
62b0: 20 20 20 2a 2a 20 4f 75 74 70 75 74 20 74 68 65     ** Output the
62c0: 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 70   result of the p
62d0: 72 65 76 69 6f 75 73 20 53 51 4c 2e 0a 20 20 20  revious SQL..   
62e0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63   */.    if( strc
62f0: 6d 70 28 7a 43 6d 64 2c 20 22 6f 75 74 70 75 74  mp(zCmd, "output
6300: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c  ")==0 ){.      l
6310: 6f 67 4d 65 73 73 61 67 65 28 22 25 73 22 2c 20  ogMessage("%s", 
6320: 73 52 65 73 75 6c 74 2e 7a 29 3b 0a 20 20 20 20  sResult.z);.    
6330: 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a 20 20  }else..    /*.  
6340: 20 20 2a 2a 20 20 2d 2d 73 6f 75 72 63 65 20 46    **  --source F
6350: 49 4c 45 4e 41 4d 45 0a 20 20 20 20 2a 2a 0a 20  ILENAME.    **. 
6360: 20 20 20 2a 2a 20 52 75 6e 20 61 20 73 75 62 73     ** Run a subs
6370: 63 72 69 70 74 20 66 72 6f 6d 20 61 20 73 65 70  cript from a sep
6380: 61 72 61 74 65 20 66 69 6c 65 2e 0a 20 20 20 20  arate file..    
6390: 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  */.    if( strcm
63a0: 70 28 7a 43 6d 64 2c 20 22 73 6f 75 72 63 65 22  p(zCmd, "source"
63b0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68  )==0 ){.      ch
63c0: 61 72 20 2a 7a 4e 65 77 46 69 6c 65 2c 20 2a 7a  ar *zNewFile, *z
63d0: 4e 65 77 53 63 72 69 70 74 3b 0a 20 20 20 20 20  NewScript;.     
63e0: 20 63 68 61 72 20 2a 7a 54 6f 44 65 6c 20 3d 20   char *zToDel = 
63f0: 30 3b 0a 20 20 20 20 20 20 7a 4e 65 77 46 69 6c  0;.      zNewFil
6400: 65 20 3d 20 61 7a 41 72 67 5b 30 5d 3b 0a 20 20  e = azArg[0];.  
6410: 20 20 20 20 69 66 28 20 7a 4e 65 77 46 69 6c 65      if( zNewFile
6420: 5b 30 5d 21 3d 27 2f 27 20 29 7b 0a 20 20 20 20  [0]!='/' ){.    
6430: 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 20      int k;.     
6440: 20 20 20 66 6f 72 28 6b 3d 28 69 6e 74 29 73 74     for(k=(int)st
6450: 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 2d  rlen(zFilename)-
6460: 31 3b 20 6b 3e 3d 30 20 26 26 20 7a 46 69 6c 65  1; k>=0 && zFile
6470: 6e 61 6d 65 5b 6b 5d 21 3d 27 2f 27 3b 20 6b 2d  name[k]!='/'; k-
6480: 2d 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28  -){}.        if(
6490: 20 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   k>0 ){.        
64a0: 20 20 7a 4e 65 77 46 69 6c 65 20 3d 20 7a 54 6f    zNewFile = zTo
64b0: 44 65 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Del = sqlite3_mp
64c0: 72 69 6e 74 66 28 22 25 2e 2a 73 2f 25 73 22 2c  rintf("%.*s/%s",
64d0: 20 6b 2c 7a 46 69 6c 65 6e 61 6d 65 2c 7a 4e 65   k,zFilename,zNe
64e0: 77 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  wFile);.        
64f0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
6500: 7a 4e 65 77 53 63 72 69 70 74 20 3d 20 72 65 61  zNewScript = rea
6510: 64 46 69 6c 65 28 7a 4e 65 77 46 69 6c 65 29 3b  dFile(zNewFile);
6520: 0a 20 20 20 20 20 20 69 66 28 20 67 2e 69 54 72  .      if( g.iTr
6530: 61 63 65 20 29 20 6c 6f 67 4d 65 73 73 61 67 65  ace ) logMessage
6540: 28 22 62 65 67 69 6e 20 73 63 72 69 70 74 20 5b  ("begin script [
6550: 25 73 5d 5c 6e 22 2c 20 7a 4e 65 77 46 69 6c 65  %s]\n", zNewFile
6560: 29 3b 0a 20 20 20 20 20 20 72 75 6e 53 63 72 69  );.      runScri
6570: 70 74 28 30 2c 20 30 2c 20 7a 4e 65 77 53 63 72  pt(0, 0, zNewScr
6580: 69 70 74 2c 20 7a 4e 65 77 46 69 6c 65 29 3b 0a  ipt, zNewFile);.
6590: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
65a0: 65 65 28 7a 4e 65 77 53 63 72 69 70 74 29 3b 0a  ee(zNewScript);.
65b0: 20 20 20 20 20 20 69 66 28 20 67 2e 69 54 72 61        if( g.iTra
65c0: 63 65 20 29 20 6c 6f 67 4d 65 73 73 61 67 65 28  ce ) logMessage(
65d0: 22 65 6e 64 20 73 63 72 69 70 74 20 5b 25 73 5d  "end script [%s]
65e0: 5c 6e 22 2c 20 7a 4e 65 77 46 69 6c 65 29 3b 0a  \n", zNewFile);.
65f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
6600: 65 65 28 7a 54 6f 44 65 6c 29 3b 0a 20 20 20 20  ee(zToDel);.    
6610: 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a 20 20  }else..    /*.  
6620: 20 20 2a 2a 20 20 2d 2d 70 72 69 6e 74 20 4d 45    **  --print ME
6630: 53 53 41 47 45 2e 2e 2e 2e 0a 20 20 20 20 2a 2a  SSAGE.....    **
6640: 0a 20 20 20 20 2a 2a 20 4f 75 74 70 75 74 20 74  .    ** Output t
6650: 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
6660: 74 68 65 20 6c 69 6e 65 20 74 6f 20 74 68 65 20  the line to the 
6670: 6c 6f 67 20 66 69 6c 65 0a 20 20 20 20 2a 2f 0a  log file.    */.
6680: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
6690: 43 6d 64 2c 20 22 70 72 69 6e 74 22 29 3d 3d 30  Cmd, "print")==0
66a0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 6a   ){.      int jj
66b0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 37  ;.      for(jj=7
66c0: 3b 20 6a 6a 3c 6c 65 6e 20 26 26 20 69 73 73 70  ; jj<len && issp
66d0: 61 63 65 28 7a 53 63 72 69 70 74 5b 69 69 2b 6a  ace(zScript[ii+j
66e0: 6a 5d 29 3b 20 6a 6a 2b 2b 29 7b 7d 0a 20 20 20  j]); jj++){}.   
66f0: 20 20 20 6c 6f 67 4d 65 73 73 61 67 65 28 22 25     logMessage("%
6700: 2e 2a 73 22 2c 20 6c 65 6e 2d 6a 6a 2c 20 7a 53  .*s", len-jj, zS
6710: 63 72 69 70 74 2b 69 69 2b 6a 6a 29 3b 0a 20 20  cript+ii+jj);.  
6720: 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a    }else..    /*.
6730: 20 20 20 20 2a 2a 20 20 2d 2d 69 66 20 45 58 50      **  --if EXP
6740: 52 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  R.    **.    ** 
6750: 53 6b 69 70 20 66 6f 72 77 61 72 64 20 74 6f 20  Skip forward to 
6760: 74 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e  the next matchin
6770: 67 20 2d 2d 65 6e 64 69 66 20 6f 72 20 2d 2d 65  g --endif or --e
6780: 6c 73 65 20 69 66 20 45 58 50 52 20 69 73 20 66  lse if EXPR is f
6790: 61 6c 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  alse..    */.   
67a0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64   if( strcmp(zCmd
67b0: 2c 20 22 69 66 22 29 3d 3d 30 20 29 7b 0a 20 20  , "if")==0 ){.  
67c0: 20 20 20 20 69 6e 74 20 6a 6a 2c 20 72 63 3b 0a      int jj, rc;.
67d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
67e0: 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 20  mt *pStmt;.     
67f0: 20 66 6f 72 28 6a 6a 3d 34 3b 20 6a 6a 3c 6c 65   for(jj=4; jj<le
6800: 6e 20 26 26 20 69 73 73 70 61 63 65 28 7a 53 63  n && isspace(zSc
6810: 72 69 70 74 5b 69 69 2b 6a 6a 5d 29 3b 20 6a 6a  ript[ii+jj]); jj
6820: 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 70 53 74 6d  ++){}.      pStm
6830: 74 20 3d 20 70 72 65 70 61 72 65 53 71 6c 28 22  t = prepareSql("
6840: 53 45 4c 45 43 54 20 25 2e 2a 73 22 2c 20 6c 65  SELECT %.*s", le
6850: 6e 2d 6a 6a 2c 20 7a 53 63 72 69 70 74 2b 69 69  n-jj, zScript+ii
6860: 2b 6a 6a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  +jj);.      rc =
6870: 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
6880: 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  tmt);.      if( 
6890: 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 7c  rc!=SQLITE_ROW |
68a0: 7c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  | sqlite3_column
68b0: 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3d 3d  _int(pStmt, 0)==
68c0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 69 20  0 ){.        ii 
68d0: 2b 3d 20 66 69 6e 64 45 6e 64 69 66 28 7a 53 63  += findEndif(zSc
68e0: 72 69 70 74 2b 69 69 2b 6c 65 6e 2c 20 31 2c 20  ript+ii+len, 1, 
68f0: 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20  &lineno);.      
6900: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
6910: 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
6920: 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20  .    }else..    
6930: 2f 2a 0a 20 20 20 20 2a 2a 20 20 2d 2d 65 6c 73  /*.    **  --els
6940: 65 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  e.    **.    ** 
6950: 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63 61 6e  This command can
6960: 20 6f 6e 6c 79 20 62 65 20 65 6e 63 6f 75 6e 74   only be encount
6970: 65 72 65 64 20 69 66 20 63 75 72 72 65 6e 74 6c  ered if currentl
6980: 79 20 69 6e 73 69 64 65 20 61 6e 20 2d 2d 69 66  y inside an --if
6990: 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20   that.    ** is 
69a0: 74 72 75 65 2e 20 20 53 6b 69 70 20 66 6f 72 77  true.  Skip forw
69b0: 61 72 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ard to the next 
69c0: 6d 61 74 63 68 69 6e 67 20 2d 2d 65 6e 64 69 66  matching --endif
69d0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
69e0: 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 65   strcmp(zCmd, "e
69f0: 6c 73 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lse")==0 ){.    
6a00: 20 20 69 69 20 2b 3d 20 66 69 6e 64 45 6e 64 69    ii += findEndi
6a10: 66 28 7a 53 63 72 69 70 74 2b 69 69 2b 6c 65 6e  f(zScript+ii+len
6a20: 2c 20 30 2c 20 26 6c 69 6e 65 6e 6f 29 3b 0a 20  , 0, &lineno);. 
6a30: 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a     }else..    /*
6a40: 0a 20 20 20 20 2a 2a 20 20 2d 2d 65 6e 64 69 66  .    **  --endif
6a50: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
6a60: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63 61 6e 20  his command can 
6a70: 6f 6e 6c 79 20 62 65 20 65 6e 63 6f 75 6e 74 65  only be encounte
6a80: 72 65 64 20 69 66 20 63 75 72 72 65 6e 74 6c 79  red if currently
6a90: 20 69 6e 73 69 64 65 20 61 6e 20 2d 2d 69 66 20   inside an --if 
6aa0: 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74  that.    ** is t
6ab0: 72 75 65 20 6f 72 20 61 6e 20 2d 2d 65 6c 73 65  rue or an --else
6ac0: 20 6f 66 20 61 20 66 61 6c 73 65 20 69 66 2e 20   of a false if. 
6ad0: 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
6ae0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
6af0: 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 65   strcmp(zCmd, "e
6b00: 6e 64 69 66 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ndif")==0 ){.   
6b10: 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20     /* no-op */. 
6b20: 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a     }else..    /*
6b30: 0a 20 20 20 20 2a 2a 20 20 2d 2d 73 74 61 72 74  .    **  --start
6b40: 20 43 4c 49 45 4e 54 0a 20 20 20 20 2a 2a 0a 20   CLIENT.    **. 
6b50: 20 20 20 2a 2a 20 53 74 61 72 74 20 75 70 20 74     ** Start up t
6b60: 68 65 20 67 69 76 65 6e 20 63 6c 69 65 6e 74 2e  he given client.
6b70: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
6b80: 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 73 74  strcmp(zCmd, "st
6b90: 61 72 74 22 29 3d 3d 30 20 26 26 20 69 43 6c 69  art")==0 && iCli
6ba0: 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ent==0 ){.      
6bb0: 69 6e 74 20 69 4e 65 77 43 6c 69 65 6e 74 20 3d  int iNewClient =
6bc0: 20 61 74 6f 69 28 61 7a 41 72 67 5b 30 5d 29 3b   atoi(azArg[0]);
6bd0: 0a 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 43  .      if( iNewC
6be0: 6c 69 65 6e 74 3e 30 20 29 7b 0a 20 20 20 20 20  lient>0 ){.     
6bf0: 20 20 20 73 74 61 72 74 43 6c 69 65 6e 74 28 69     startClient(i
6c00: 4e 65 77 43 6c 69 65 6e 74 29 3b 0a 20 20 20 20  NewClient);.    
6c10: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20    }.    }else.. 
6c20: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 2d 2d     /*.    **  --
6c30: 77 61 69 74 20 43 4c 49 45 4e 54 20 54 49 4d 45  wait CLIENT TIME
6c40: 4f 55 54 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  OUT.    **.    *
6c50: 2a 20 57 61 69 74 20 75 6e 74 69 6c 20 61 6c 6c  * Wait until all
6c60: 20 74 61 73 6b 73 20 63 6f 6d 70 6c 65 74 65 20   tasks complete 
6c70: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63 6c  for the given cl
6c80: 69 65 6e 74 2e 20 20 49 66 20 43 4c 49 45 4e 54  ient.  If CLIENT
6c90: 20 69 73 0a 20 20 20 20 2a 2a 20 22 61 6c 6c 22   is.    ** "all"
6ca0: 20 74 68 65 6e 20 77 61 69 74 20 66 6f 72 20 61   then wait for a
6cb0: 6c 6c 20 63 6c 69 65 6e 74 73 20 74 6f 20 63 6f  ll clients to co
6cc0: 6d 70 6c 65 74 65 2e 20 20 57 61 69 74 20 6e 6f  mplete.  Wait no
6cd0: 20 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 20 20 20   longer than.   
6ce0: 20 2a 2a 20 54 49 4d 45 4f 55 54 20 6d 69 6c 6c   ** TIMEOUT mill
6cf0: 69 73 65 63 6f 6e 64 73 20 28 64 65 66 61 75 6c  iseconds (defaul
6d00: 74 20 31 30 2c 30 30 30 29 0a 20 20 20 20 2a 2f  t 10,000).    */
6d10: 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
6d20: 7a 43 6d 64 2c 20 22 77 61 69 74 22 29 3d 3d 30  zCmd, "wait")==0
6d30: 20 26 26 20 69 43 6c 69 65 6e 74 3d 3d 30 20 29   && iClient==0 )
6d40: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 54 69 6d  {.      int iTim
6d50: 65 6f 75 74 20 3d 20 6e 41 72 67 3e 3d 32 20 3f  eout = nArg>=2 ?
6d60: 20 61 74 6f 69 28 61 7a 41 72 67 5b 31 5d 29 20   atoi(azArg[1]) 
6d70: 3a 20 31 30 30 30 30 3b 0a 20 20 20 20 20 20 73  : 10000;.      s
6d80: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
6d90: 73 69 7a 65 6f 66 28 7a 45 72 72 6f 72 29 2c 7a  sizeof(zError),z
6da0: 45 72 72 6f 72 2c 22 6c 69 6e 65 20 25 64 20 6f  Error,"line %d o
6db0: 66 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  f %s\n",.       
6dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6dd0: 70 72 65 76 4c 69 6e 65 2c 20 7a 46 69 6c 65 6e  prevLine, zFilen
6de0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 77 61 69 74  ame);.      wait
6df0: 46 6f 72 43 6c 69 65 6e 74 28 61 74 6f 69 28 61  ForClient(atoi(a
6e00: 7a 41 72 67 5b 30 5d 29 2c 20 69 54 69 6d 65 6f  zArg[0]), iTimeo
6e10: 75 74 2c 20 7a 45 72 72 6f 72 29 3b 0a 20 20 20  ut, zError);.   
6e20: 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a 20   }else..    /*. 
6e30: 20 20 20 2a 2a 20 20 2d 2d 74 61 73 6b 20 43 4c     **  --task CL
6e40: 49 45 4e 54 0a 20 20 20 20 2a 2a 20 20 20 20 20  IENT.    **     
6e50: 3c 74 61 73 6b 2d 63 6f 6e 74 65 6e 74 2d 68 65  <task-content-he
6e60: 72 65 3e 0a 20 20 20 20 2a 2a 20 20 2d 2d 65 6e  re>.    **  --en
6e70: 64 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  d.    **.    ** 
6e80: 41 73 73 69 67 6e 20 77 6f 72 6b 20 74 6f 20 61  Assign work to a
6e90: 20 63 6c 69 65 6e 74 2e 20 20 53 74 61 72 74 20   client.  Start 
6ea0: 74 68 65 20 63 6c 69 65 6e 74 20 69 66 20 69 74  the client if it
6eb0: 20 69 73 20 6e 6f 74 20 72 75 6e 6e 69 6e 67 0a   is not running.
6ec0: 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a      ** already..
6ed0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
6ee0: 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 74 61 73  trcmp(zCmd, "tas
6ef0: 6b 22 29 3d 3d 30 20 26 26 20 69 43 6c 69 65 6e  k")==0 && iClien
6f00: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  t==0 ){.      in
6f10: 74 20 69 54 61 72 67 65 74 20 3d 20 61 74 6f 69  t iTarget = atoi
6f20: 28 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20  (azArg[0]);.    
6f30: 20 20 69 6e 74 20 69 45 6e 64 3b 0a 20 20 20 20    int iEnd;.    
6f40: 20 20 63 68 61 72 20 2a 7a 54 61 73 6b 3b 0a 20    char *zTask;. 
6f50: 20 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d       char *zTNam
6f60: 65 3b 0a 20 20 20 20 20 20 69 45 6e 64 20 3d 20  e;.      iEnd = 
6f70: 66 69 6e 64 45 6e 64 28 7a 53 63 72 69 70 74 2b  findEnd(zScript+
6f80: 69 69 2b 6c 65 6e 2c 20 26 6c 69 6e 65 6e 6f 29  ii+len, &lineno)
6f90: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 54 61 72  ;.      if( iTar
6fa0: 67 65 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  get<0 ){.       
6fb0: 20 65 72 72 6f 72 4d 65 73 73 61 67 65 28 22 6c   errorMessage("l
6fc0: 69 6e 65 20 25 64 20 6f 66 20 25 73 3a 20 62 61  ine %d of %s: ba
6fd0: 64 20 63 6c 69 65 6e 74 20 6e 75 6d 62 65 72 3a  d client number:
6fe0: 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %d",.          
6ff0: 20 20 20 20 20 20 20 20 20 20 20 70 72 65 76 4c             prevL
7000: 69 6e 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  ine, zFilename, 
7010: 69 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20  iTarget);.      
7020: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
7030: 54 61 73 6b 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Task = sqlite3_m
7040: 70 72 69 6e 74 66 28 22 25 2e 2a 73 22 2c 20 69  printf("%.*s", i
7050: 45 6e 64 2c 20 7a 53 63 72 69 70 74 2b 69 69 2b  End, zScript+ii+
7060: 6c 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66  len);.        if
7070: 28 20 6e 41 72 67 3e 31 20 29 7b 0a 20 20 20 20  ( nArg>1 ){.    
7080: 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 73        zTName = s
7090: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
70a0: 25 73 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  %s", azArg[1]);.
70b0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
70c0: 20 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20           zTName 
70d0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
70e0: 66 28 22 25 73 3a 25 64 22 2c 20 66 69 6c 65 6e  f("%s:%d", filen
70f0: 61 6d 65 54 61 69 6c 28 7a 46 69 6c 65 6e 61 6d  ameTail(zFilenam
7100: 65 29 2c 20 70 72 65 76 4c 69 6e 65 29 3b 0a 20  e), prevLine);. 
7110: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7120: 20 73 74 61 72 74 43 6c 69 65 6e 74 28 69 54 61   startClient(iTa
7130: 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72  rget);.        r
7140: 75 6e 53 71 6c 28 22 49 4e 53 45 52 54 20 49 4e  unSql("INSERT IN
7150: 54 4f 20 74 61 73 6b 28 63 6c 69 65 6e 74 2c 73  TO task(client,s
7160: 63 72 69 70 74 2c 6e 61 6d 65 29 22 0a 20 20 20  cript,name)".   
7170: 20 20 20 20 20 20 20 20 20 20 20 20 22 20 56 41              " VA
7180: 4c 55 45 53 28 25 64 2c 27 25 71 27 2c 25 51 29  LUES(%d,'%q',%Q)
7190: 22 2c 20 69 54 61 72 67 65 74 2c 20 7a 54 61 73  ", iTarget, zTas
71a0: 6b 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20  k, zTName);.    
71b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
71c0: 28 7a 54 61 73 6b 29 3b 0a 20 20 20 20 20 20 20  (zTask);.       
71d0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
71e0: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Name);.      }. 
71f0: 20 20 20 20 20 69 45 6e 64 20 2b 3d 20 74 6f 6b       iEnd += tok
7200: 65 6e 4c 65 6e 67 74 68 28 7a 53 63 72 69 70 74  enLength(zScript
7210: 2b 69 69 2b 6c 65 6e 2b 69 45 6e 64 2c 20 26 6c  +ii+len+iEnd, &l
7220: 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 6c 65  ineno);.      le
7230: 6e 20 2b 3d 20 69 45 6e 64 3b 0a 20 20 20 20 20  n += iEnd;.     
7240: 20 69 42 65 67 69 6e 20 3d 20 69 69 2b 6c 65 6e   iBegin = ii+len
7250: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20  ;.    }else..   
7260: 20 2f 2a 20 65 72 72 6f 72 20 2a 2f 7b 0a 20 20   /* error */{.  
7270: 20 20 20 20 65 72 72 6f 72 4d 65 73 73 61 67 65      errorMessage
7280: 28 22 6c 69 6e 65 20 25 64 20 6f 66 20 25 73 3a  ("line %d of %s:
7290: 20 75 6e 6b 6e 6f 77 6e 20 63 6f 6d 6d 61 6e 64   unknown command
72a0: 20 2d 2d 25 73 22 2c 0a 20 20 20 20 20 20 20 20   --%s",.        
72b0: 20 20 20 20 20 20 20 20 20 20 20 70 72 65 76 4c             prevL
72c0: 69 6e 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  ine, zFilename, 
72d0: 7a 43 6d 64 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zCmd);.    }.   
72e0: 20 69 69 20 2b 3d 20 6c 65 6e 3b 0a 20 20 7d 0a   ii += len;.  }.
72f0: 20 20 69 66 28 20 69 42 65 67 69 6e 3c 69 69 20    if( iBegin<ii 
7300: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  ){.    char *zSq
7310: 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
7320: 6e 74 66 28 22 25 2e 2a 73 22 2c 20 69 69 2d 69  ntf("%.*s", ii-i
7330: 42 65 67 69 6e 2c 20 7a 53 63 72 69 70 74 2b 69  Begin, zScript+i
7340: 42 65 67 69 6e 29 3b 0a 20 20 20 20 72 75 6e 53  Begin);.    runS
7350: 71 6c 28 7a 53 71 6c 29 3b 0a 20 20 20 20 73 71  ql(zSql);.    sq
7360: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
7370: 3b 0a 20 20 7d 0a 20 20 73 74 72 69 6e 67 46 72  ;.  }.  stringFr
7380: 65 65 28 26 73 52 65 73 75 6c 74 29 3b 0a 7d 0a  ee(&sResult);.}.
7390: 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 66 6f 72 20  ./*.** Look for 
73a0: 61 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f  a command-line o
73b0: 70 74 69 6f 6e 2e 20 20 49 66 20 70 72 65 73 65  ption.  If prese
73c0: 6e 74 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69  nt, return a poi
73d0: 6e 74 65 72 2e 0a 2a 2a 20 52 65 74 75 72 6e 20  nter..** Return 
73e0: 4e 55 4c 4c 20 69 66 20 6d 69 73 73 69 6e 67 2e  NULL if missing.
73f0: 0a 2a 2a 0a 2a 2a 20 68 61 73 41 72 67 3d 3d 30  .**.** hasArg==0
7400: 20 6d 65 61 6e 73 20 74 68 65 20 6f 70 74 69 6f   means the optio
7410: 6e 20 69 73 20 61 20 66 6c 61 67 2e 20 20 49 74  n is a flag.  It
7420: 20 69 73 20 65 69 74 68 65 72 20 70 72 65 73 65   is either prese
7430: 6e 74 20 6f 72 20 6e 6f 74 2e 0a 2a 2a 20 68 61  nt or not..** ha
7440: 73 41 72 67 3d 3d 31 20 6d 65 61 6e 73 20 74 68  sArg==1 means th
7450: 65 20 6f 70 74 69 6f 6e 20 68 61 73 20 61 6e 20  e option has an 
7460: 61 72 67 75 6d 65 6e 74 2e 20 20 52 65 74 75 72  argument.  Retur
7470: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
7480: 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  he.** argument..
7490: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
74a0: 66 69 6e 64 4f 70 74 69 6f 6e 28 0a 20 20 63 68  findOption(.  ch
74b0: 61 72 20 2a 2a 61 7a 41 72 67 2c 0a 20 20 69 6e  ar **azArg,.  in
74c0: 74 20 2a 70 6e 41 72 67 2c 0a 20 20 63 6f 6e 73  t *pnArg,.  cons
74d0: 74 20 63 68 61 72 20 2a 7a 4f 70 74 69 6f 6e 2c  t char *zOption,
74e0: 0a 20 20 69 6e 74 20 68 61 73 41 72 67 0a 29 7b  .  int hasArg.){
74f0: 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63  .  int i, j;.  c
7500: 68 61 72 20 2a 7a 52 65 74 75 72 6e 20 3d 20 30  har *zReturn = 0
7510: 3b 0a 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 2a  ;.  int nArg = *
7520: 70 6e 41 72 67 3b 0a 0a 20 20 61 73 73 65 72 74  pnArg;..  assert
7530: 28 20 68 61 73 41 72 67 3d 3d 30 20 7c 7c 20 68  ( hasArg==0 || h
7540: 61 73 41 72 67 3d 3d 31 20 29 3b 0a 20 20 66 6f  asArg==1 );.  fo
7550: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
7560: 2b 2b 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ++){.    const c
7570: 68 61 72 20 2a 7a 3b 0a 20 20 20 20 69 66 28 20  har *z;.    if( 
7580: 69 2b 68 61 73 41 72 67 20 3e 3d 20 6e 41 72 67  i+hasArg >= nArg
7590: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7a 20   ) break;.    z 
75a0: 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20  = azArg[i];.    
75b0: 69 66 28 20 7a 5b 30 5d 21 3d 27 2d 27 20 29 20  if( z[0]!='-' ) 
75c0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7a 2b  continue;.    z+
75d0: 2b 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d  +;.    if( z[0]=
75e0: 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 69 66  ='-' ){.      if
75f0: 28 20 7a 5b 31 5d 3d 3d 30 20 29 20 62 72 65 61  ( z[1]==0 ) brea
7600: 6b 3b 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20  k;.      z++;.  
7610: 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63    }.    if( strc
7620: 6d 70 28 7a 2c 7a 4f 70 74 69 6f 6e 29 3d 3d 30  mp(z,zOption)==0
7630: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68 61   ){.      if( ha
7640: 73 41 72 67 20 26 26 20 69 3d 3d 6e 41 72 67 2d  sArg && i==nArg-
7650: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 66 61 74  1 ){.        fat
7660: 61 6c 45 72 72 6f 72 28 22 63 6f 6d 6d 61 6e 64  alError("command
7670: 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 5c 22 2d  -line option \"-
7680: 2d 25 73 5c 22 20 72 65 71 75 69 72 65 73 20 61  -%s\" requires a
7690: 6e 20 61 72 67 75 6d 65 6e 74 22 2c 20 7a 29 3b  n argument", z);
76a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
76b0: 66 28 20 68 61 73 41 72 67 20 29 7b 0a 20 20 20  f( hasArg ){.   
76c0: 20 20 20 20 20 7a 52 65 74 75 72 6e 20 3d 20 61       zReturn = a
76d0: 7a 41 72 67 5b 69 2b 31 5d 3b 0a 20 20 20 20 20  zArg[i+1];.     
76e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
76f0: 7a 52 65 74 75 72 6e 20 3d 20 61 7a 41 72 67 5b  zReturn = azArg[
7700: 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i];.      }.    
7710: 20 20 6a 20 3d 20 69 2b 31 2b 28 68 61 73 41 72    j = i+1+(hasAr
7720: 67 21 3d 30 29 3b 0a 20 20 20 20 20 20 77 68 69  g!=0);.      whi
7730: 6c 65 28 20 6a 3c 6e 41 72 67 20 29 20 61 7a 41  le( j<nArg ) azA
7740: 72 67 5b 69 2b 2b 5d 20 3d 20 61 7a 41 72 67 5b  rg[i++] = azArg[
7750: 6a 2b 2b 5d 3b 0a 20 20 20 20 20 20 2a 70 6e 41  j++];.      *pnA
7760: 72 67 20 3d 20 69 3b 0a 20 20 20 20 20 20 72 65  rg = i;.      re
7770: 74 75 72 6e 20 7a 52 65 74 75 72 6e 3b 0a 20 20  turn zReturn;.  
7780: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
7790: 20 7a 52 65 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20   zReturn;.}../* 
77a0: 50 72 69 6e 74 20 61 20 75 73 61 67 65 20 6d 65  Print a usage me
77b0: 73 73 61 67 65 20 66 6f 72 20 74 68 65 20 70 72  ssage for the pr
77c0: 6f 67 72 61 6d 20 61 6e 64 20 65 78 69 74 20 2a  ogram and exit *
77d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 73  /.static void us
77e0: 61 67 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  age(const char *
77f0: 61 72 67 76 30 29 7b 0a 20 20 69 6e 74 20 69 3b  argv0){.  int i;
7800: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7810: 54 61 69 6c 20 3d 20 61 72 67 76 30 3b 0a 20 20  Tail = argv0;.  
7820: 66 6f 72 28 69 3d 30 3b 20 61 72 67 76 30 5b 69  for(i=0; argv0[i
7830: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ]; i++){.    if(
7840: 20 61 72 67 76 30 5b 69 5d 3d 3d 27 2f 27 20 29   argv0[i]=='/' )
7850: 20 7a 54 61 69 6c 20 3d 20 61 72 67 76 30 2b 69   zTail = argv0+i
7860: 2b 31 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74  +1;.  }.  fprint
7870: 66 28 73 74 64 65 72 72 2c 22 55 73 61 67 65 3a  f(stderr,"Usage:
7880: 20 25 73 20 44 41 54 41 42 41 53 45 20 3f 4f 50   %s DATABASE ?OP
7890: 54 49 4f 4e 53 3f 20 3f 53 43 52 49 50 54 3f 5c  TIONS? ?SCRIPT?\
78a0: 6e 22 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 65 78  n", zTail);.  ex
78b0: 69 74 28 31 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 70  it(1);.}../* Rep
78c0: 6f 72 74 20 6f 6e 20 75 6e 72 65 63 6f 67 6e 69  ort on unrecogni
78d0: 7a 65 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  zed arguments */
78e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 72  .static void unr
78f0: 65 63 6f 67 6e 69 7a 65 64 41 72 67 75 6d 65 6e  ecognizedArgumen
7900: 74 73 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ts(.  const char
7910: 20 2a 61 72 67 76 30 2c 0a 20 20 69 6e 74 20 6e   *argv0,.  int n
7920: 41 72 67 2c 0a 20 20 63 68 61 72 20 2a 2a 61 7a  Arg,.  char **az
7930: 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Arg.){.  int i;.
7940: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
7950: 2c 22 25 73 3a 20 75 6e 72 65 63 6f 67 6e 69 7a  ,"%s: unrecogniz
7960: 65 64 20 61 72 67 75 6d 65 6e 74 73 3a 22 2c 20  ed arguments:", 
7970: 61 72 67 76 30 29 3b 0a 20 20 66 6f 72 28 69 3d  argv0);.  for(i=
7980: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
7990: 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
79a0: 65 72 72 2c 22 20 25 73 22 2c 20 61 7a 41 72 67  err," %s", azArg
79b0: 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 70 72 69  [i]);.  }.  fpri
79c0: 6e 74 66 28 73 74 64 65 72 72 2c 22 5c 6e 22 29  ntf(stderr,"\n")
79d0: 3b 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a 0a  ;.  exit(1);.}..
79e0: 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67  int main(int arg
79f0: 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b  c, char **argv){
7a00: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7a10: 43 6c 69 65 6e 74 3b 0a 20 20 69 6e 74 20 69 43  Client;.  int iC
7a20: 6c 69 65 6e 74 3b 0a 20 20 69 6e 74 20 6e 2c 20  lient;.  int n, 
7a30: 69 3b 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61  i;.  int openFla
7a40: 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs = SQLITE_OPEN
7a50: 5f 52 45 41 44 57 52 49 54 45 3b 0a 20 20 69 6e  _READWRITE;.  in
7a60: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 53  t rc;.  char *zS
7a70: 63 72 69 70 74 3b 0a 20 20 69 6e 74 20 74 61 73  cript;.  int tas
7a80: 6b 49 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  kId;.  const cha
7a90: 72 20 2a 7a 54 72 61 63 65 3b 0a 20 20 63 6f 6e  r *zTrace;.  con
7aa0: 73 74 20 63 68 61 72 20 2a 7a 43 4f 70 74 69 6f  st char *zCOptio
7ab0: 6e 3b 0a 0a 20 20 67 2e 61 72 67 76 30 20 3d 20  n;..  g.argv0 = 
7ac0: 61 72 67 76 5b 30 5d 3b 0a 20 20 67 2e 69 54 72  argv[0];.  g.iTr
7ad0: 61 63 65 20 3d 20 31 3b 0a 20 20 69 66 28 20 61  ace = 1;.  if( a
7ae0: 72 67 63 3c 32 20 29 20 75 73 61 67 65 28 61 72  rgc<2 ) usage(ar
7af0: 67 76 5b 30 5d 29 3b 0a 20 20 67 2e 7a 44 62 46  gv[0]);.  g.zDbF
7b00: 69 6c 65 20 3d 20 61 72 67 76 5b 31 5d 3b 0a 20  ile = argv[1];. 
7b10: 20 69 66 28 20 73 74 72 67 6c 6f 62 28 22 2a 2e   if( strglob("*.
7b20: 74 65 73 74 22 2c 20 67 2e 7a 44 62 46 69 6c 65  test", g.zDbFile
7b30: 29 20 29 20 75 73 61 67 65 28 61 72 67 76 5b 30  ) ) usage(argv[0
7b40: 5d 29 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70  ]);.  if( strcmp
7b50: 28 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69  (sqlite3_sourcei
7b60: 64 28 29 2c 20 53 51 4c 49 54 45 5f 53 4f 55 52  d(), SQLITE_SOUR
7b70: 43 45 5f 49 44 29 21 3d 30 20 29 7b 0a 20 20 20  CE_ID)!=0 ){.   
7b80: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
7b90: 20 22 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79   "SQLite library
7ba0: 20 61 6e 64 20 68 65 61 64 65 72 20 6d 69 73 6d   and header mism
7bb0: 61 74 63 68 5c 6e 22 0a 20 20 20 20 20 20 20 20  atch\n".        
7bc0: 20 20 20 20 20 20 20 20 20 20 20 20 22 4c 69 62              "Lib
7bd0: 72 61 72 79 3a 20 25 73 5c 6e 22 0a 20 20 20 20  rary: %s\n".    
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bf0: 22 48 65 61 64 65 72 3a 20 20 25 73 5c 6e 22 2c  "Header:  %s\n",
7c00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7c10: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6f 75       sqlite3_sou
7c20: 72 63 65 69 64 28 29 2c 20 53 51 4c 49 54 45 5f  rceid(), SQLITE_
7c30: 53 4f 55 52 43 45 5f 49 44 29 3b 0a 20 20 20 20  SOURCE_ID);.    
7c40: 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 6e  exit(1);.  }.  n
7c50: 20 3d 20 61 72 67 63 2d 32 3b 0a 20 20 73 71 6c   = argc-2;.  sql
7c60: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
7c70: 7a 65 6f 66 28 67 2e 7a 4e 61 6d 65 29 2c 20 67  zeof(g.zName), g
7c80: 2e 7a 4e 61 6d 65 2c 20 22 25 30 35 64 2e 6d 70  .zName, "%05d.mp
7c90: 74 65 73 74 22 2c 20 47 45 54 50 49 44 28 29 29  test", GETPID())
7ca0: 3b 0a 20 20 67 2e 7a 56 66 73 20 3d 20 66 69 6e  ;.  g.zVfs = fin
7cb0: 64 4f 70 74 69 6f 6e 28 61 72 67 76 2b 32 2c 20  dOption(argv+2, 
7cc0: 26 6e 2c 20 22 76 66 73 22 2c 20 31 29 3b 0a 20  &n, "vfs", 1);. 
7cd0: 20 7a 43 6c 69 65 6e 74 20 3d 20 66 69 6e 64 4f   zClient = findO
7ce0: 70 74 69 6f 6e 28 61 72 67 76 2b 32 2c 20 26 6e  ption(argv+2, &n
7cf0: 2c 20 22 63 6c 69 65 6e 74 22 2c 20 31 29 3b 0a  , "client", 1);.
7d00: 20 20 67 2e 7a 45 72 72 4c 6f 67 20 3d 20 66 69    g.zErrLog = fi
7d10: 6e 64 4f 70 74 69 6f 6e 28 61 72 67 76 2b 32 2c  ndOption(argv+2,
7d20: 20 26 6e 2c 20 22 65 72 72 6c 6f 67 22 2c 20 31   &n, "errlog", 1
7d30: 29 3b 0a 20 20 67 2e 7a 4c 6f 67 20 3d 20 66 69  );.  g.zLog = fi
7d40: 6e 64 4f 70 74 69 6f 6e 28 61 72 67 76 2b 32 2c  ndOption(argv+2,
7d50: 20 26 6e 2c 20 22 6c 6f 67 22 2c 20 31 29 3b 0a   &n, "log", 1);.
7d60: 20 20 7a 54 72 61 63 65 20 3d 20 66 69 6e 64 4f    zTrace = findO
7d70: 70 74 69 6f 6e 28 61 72 67 76 2b 32 2c 20 26 6e  ption(argv+2, &n
7d80: 2c 20 22 74 72 61 63 65 22 2c 20 31 29 3b 0a 20  , "trace", 1);. 
7d90: 20 69 66 28 20 7a 54 72 61 63 65 20 29 20 67 2e   if( zTrace ) g.
7da0: 69 54 72 61 63 65 20 3d 20 61 74 6f 69 28 7a 54  iTrace = atoi(zT
7db0: 72 61 63 65 29 3b 0a 20 20 69 66 28 20 66 69 6e  race);.  if( fin
7dc0: 64 4f 70 74 69 6f 6e 28 61 72 67 76 2b 32 2c 20  dOption(argv+2, 
7dd0: 26 6e 2c 20 22 71 75 69 65 74 22 2c 20 30 29 21  &n, "quiet", 0)!
7de0: 3d 30 20 29 20 67 2e 69 54 72 61 63 65 20 3d 20  =0 ) g.iTrace = 
7df0: 30 3b 0a 20 20 67 2e 62 53 71 6c 54 72 61 63 65  0;.  g.bSqlTrace
7e00: 20 3d 20 66 69 6e 64 4f 70 74 69 6f 6e 28 61 72   = findOption(ar
7e10: 67 76 2b 32 2c 20 26 6e 2c 20 22 73 71 6c 74 72  gv+2, &n, "sqltr
7e20: 61 63 65 22 2c 20 30 29 21 3d 30 3b 0a 20 20 67  ace", 0)!=0;.  g
7e30: 2e 62 53 79 6e 63 20 3d 20 66 69 6e 64 4f 70 74  .bSync = findOpt
7e40: 69 6f 6e 28 61 72 67 76 2b 32 2c 20 26 6e 2c 20  ion(argv+2, &n, 
7e50: 22 73 79 6e 63 22 2c 20 30 29 21 3d 30 3b 0a 20  "sync", 0)!=0;. 
7e60: 20 69 66 28 20 67 2e 7a 45 72 72 4c 6f 67 20 29   if( g.zErrLog )
7e70: 7b 0a 20 20 20 20 67 2e 70 45 72 72 4c 6f 67 20  {.    g.pErrLog 
7e80: 3d 20 66 6f 70 65 6e 28 67 2e 7a 45 72 72 4c 6f  = fopen(g.zErrLo
7e90: 67 2c 20 22 61 22 29 3b 0a 20 20 7d 65 6c 73 65  g, "a");.  }else
7ea0: 7b 0a 20 20 20 20 67 2e 70 45 72 72 4c 6f 67 20  {.    g.pErrLog 
7eb0: 3d 20 73 74 64 65 72 72 3b 0a 20 20 7d 0a 20 20  = stderr;.  }.  
7ec0: 69 66 28 20 67 2e 7a 4c 6f 67 20 29 7b 0a 20 20  if( g.zLog ){.  
7ed0: 20 20 67 2e 70 4c 6f 67 20 3d 20 66 6f 70 65 6e    g.pLog = fopen
7ee0: 28 67 2e 7a 4c 6f 67 2c 20 22 61 22 29 3b 0a 20  (g.zLog, "a");. 
7ef0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 67 2e 70 4c   }else{.    g.pL
7f00: 6f 67 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7d  og = stdout;.  }
7f10: 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  .  .  sqlite3_co
7f20: 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46  nfig(SQLITE_CONF
7f30: 49 47 5f 4c 4f 47 2c 20 73 71 6c 45 72 72 6f 72  IG_LOG, sqlError
7f40: 43 61 6c 6c 62 61 63 6b 2c 20 30 29 3b 0a 20 20  Callback, 0);.  
7f50: 69 66 28 20 7a 43 6c 69 65 6e 74 20 29 7b 0a 20  if( zClient ){. 
7f60: 20 20 20 69 43 6c 69 65 6e 74 20 3d 20 61 74 6f     iClient = ato
7f70: 69 28 7a 43 6c 69 65 6e 74 29 3b 0a 20 20 20 20  i(zClient);.    
7f80: 69 66 28 20 69 43 6c 69 65 6e 74 3c 31 20 29 20  if( iClient<1 ) 
7f90: 66 61 74 61 6c 45 72 72 6f 72 28 22 69 6c 6c 65  fatalError("ille
7fa0: 67 61 6c 20 63 6c 69 65 6e 74 20 6e 75 6d 62 65  gal client numbe
7fb0: 72 3a 20 25 64 5c 6e 22 2c 20 69 43 6c 69 65 6e  r: %d\n", iClien
7fc0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
7fd0: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
7fe0: 67 2e 7a 4e 61 6d 65 29 2c 20 67 2e 7a 4e 61 6d  g.zName), g.zNam
7ff0: 65 2c 20 22 25 30 35 64 2e 63 6c 69 65 6e 74 25  e, "%05d.client%
8000: 30 32 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20  02d",.          
8010: 20 20 20 20 20 20 20 20 20 20 20 47 45 54 50 49             GETPI
8020: 44 28 29 2c 20 69 43 6c 69 65 6e 74 29 3b 0a 20  D(), iClient);. 
8030: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
8040: 67 2e 69 54 72 61 63 65 3e 30 20 29 7b 0a 20 20  g.iTrace>0 ){.  
8050: 20 20 20 20 70 72 69 6e 74 66 28 22 57 69 74 68      printf("With
8060: 20 53 51 4c 69 74 65 20 22 20 53 51 4c 49 54 45   SQLite " SQLITE
8070: 5f 56 45 52 53 49 4f 4e 20 22 20 22 20 53 51 4c  _VERSION " " SQL
8080: 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 20 22 5c  ITE_SOURCE_ID "\
8090: 6e 22 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  n" );.      for(
80a0: 69 3d 30 3b 20 28 7a 43 4f 70 74 69 6f 6e 20 3d  i=0; (zCOption =
80b0: 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 69 6c 65   sqlite3_compile
80c0: 6f 70 74 69 6f 6e 5f 67 65 74 28 69 29 29 21 3d  option_get(i))!=
80d0: 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  0; i++){.       
80e0: 20 70 72 69 6e 74 66 28 22 2d 44 53 51 4c 49 54   printf("-DSQLIT
80f0: 45 5f 25 73 5c 6e 22 2c 20 7a 43 4f 70 74 69 6f  E_%s\n", zCOptio
8100: 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n);.      }.    
8110: 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29    fflush(stdout)
8120: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 43 6c 69  ;.    }.    iCli
8130: 65 6e 74 20 3d 20 20 30 3b 0a 20 20 20 20 75 6e  ent =  0;.    un
8140: 6c 69 6e 6b 28 67 2e 7a 44 62 46 69 6c 65 29 3b  link(g.zDbFile);
8150: 0a 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c  .    openFlags |
8160: 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  = SQLITE_OPEN_CR
8170: 45 41 54 45 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  EATE;.  }.  rc =
8180: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
8190: 28 67 2e 7a 44 62 46 69 6c 65 2c 20 26 67 2e 64  (g.zDbFile, &g.d
81a0: 62 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 67 2e  b, openFlags, g.
81b0: 7a 56 66 73 29 3b 0a 20 20 69 66 28 20 72 63 20  zVfs);.  if( rc 
81c0: 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 63 61  ) fatalError("ca
81d0: 6e 6e 6f 74 20 6f 70 65 6e 20 5b 25 73 5d 22 2c  nnot open [%s]",
81e0: 20 67 2e 7a 44 62 46 69 6c 65 29 3b 0a 20 20 73   g.zDbFile);.  s
81f0: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f  qlite3_enable_lo
8200: 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 67 2e 64  ad_extension(g.d
8210: 62 2c 20 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  b, 1);.  sqlite3
8220: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 67 2e  _busy_handler(g.
8230: 64 62 2c 20 62 75 73 79 48 61 6e 64 6c 65 72 2c  db, busyHandler,
8240: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63   0);.  sqlite3_c
8250: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 67  reate_function(g
8260: 2e 64 62 2c 20 22 76 66 73 6e 61 6d 65 22 2c 20  .db, "vfsname", 
8270: 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  0, SQLITE_UTF8, 
8280: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
8290: 20 20 20 20 20 20 20 20 20 20 20 20 20 76 66 73               vfs
82a0: 4e 61 6d 65 46 75 6e 63 2c 20 30 2c 20 30 29 3b  NameFunc, 0, 0);
82b0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  .  sqlite3_creat
82c0: 65 5f 66 75 6e 63 74 69 6f 6e 28 67 2e 64 62 2c  e_function(g.db,
82d0: 20 22 65 76 61 6c 22 2c 20 31 2c 20 53 51 4c 49   "eval", 1, SQLI
82e0: 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20  TE_UTF8, 0,.    
82f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8300: 20 20 20 20 20 20 65 76 61 6c 46 75 6e 63 2c 20        evalFunc, 
8310: 30 2c 20 30 29 3b 0a 20 20 67 2e 69 54 69 6d 65  0, 0);.  g.iTime
8320: 6f 75 74 20 3d 20 44 45 46 41 55 4c 54 5f 54 49  out = DEFAULT_TI
8330: 4d 45 4f 55 54 3b 0a 20 20 69 66 28 20 67 2e 62  MEOUT;.  if( g.b
8340: 53 71 6c 54 72 61 63 65 20 29 20 73 71 6c 69 74  SqlTrace ) sqlit
8350: 65 33 5f 74 72 61 63 65 28 67 2e 64 62 2c 20 73  e3_trace(g.db, s
8360: 71 6c 54 72 61 63 65 43 61 6c 6c 62 61 63 6b 2c  qlTraceCallback,
8370: 20 30 29 3b 0a 20 20 69 66 28 20 21 67 2e 62 53   0);.  if( !g.bS
8380: 79 6e 63 20 29 20 74 72 79 53 71 6c 28 22 50 52  ync ) trySql("PR
8390: 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73  AGMA synchronous
83a0: 3d 4f 46 46 22 29 3b 0a 20 20 69 66 28 20 69 43  =OFF");.  if( iC
83b0: 6c 69 65 6e 74 3e 30 20 29 7b 0a 20 20 20 20 69  lient>0 ){.    i
83c0: 66 28 20 6e 3e 30 20 29 20 75 6e 72 65 63 6f 67  f( n>0 ) unrecog
83d0: 6e 69 7a 65 64 41 72 67 75 6d 65 6e 74 73 28 61  nizedArguments(a
83e0: 72 67 76 5b 30 5d 2c 20 6e 2c 20 61 72 67 76 2b  rgv[0], n, argv+
83f0: 32 29 3b 0a 20 20 20 20 69 66 28 20 67 2e 69 54  2);.    if( g.iT
8400: 72 61 63 65 20 29 20 6c 6f 67 4d 65 73 73 61 67  race ) logMessag
8410: 65 28 22 73 74 61 72 74 2d 63 6c 69 65 6e 74 22  e("start-client"
8420: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 31 29 7b  );.    while(1){
8430: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61  .      char *zTa
8440: 73 6b 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20  skName = 0;.    
8450: 20 20 72 63 20 3d 20 73 74 61 72 74 53 63 72 69    rc = startScri
8460: 70 74 28 69 43 6c 69 65 6e 74 2c 20 26 7a 53 63  pt(iClient, &zSc
8470: 72 69 70 74 2c 20 26 74 61 73 6b 49 64 2c 20 26  ript, &taskId, &
8480: 7a 54 61 73 6b 4e 61 6d 65 29 3b 0a 20 20 20 20  zTaskName);.    
8490: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
84a0: 5f 44 4f 4e 45 20 29 20 62 72 65 61 6b 3b 0a 20  _DONE ) break;. 
84b0: 20 20 20 20 20 69 66 28 20 67 2e 69 54 72 61 63       if( g.iTrac
84c0: 65 20 29 20 6c 6f 67 4d 65 73 73 61 67 65 28 22  e ) logMessage("
84d0: 62 65 67 69 6e 20 25 73 20 28 25 64 29 22 2c 20  begin %s (%d)", 
84e0: 7a 54 61 73 6b 4e 61 6d 65 2c 20 74 61 73 6b 49  zTaskName, taskI
84f0: 64 29 3b 0a 20 20 20 20 20 20 72 75 6e 53 63 72  d);.      runScr
8500: 69 70 74 28 69 43 6c 69 65 6e 74 2c 20 74 61 73  ipt(iClient, tas
8510: 6b 49 64 2c 20 7a 53 63 72 69 70 74 2c 20 7a 54  kId, zScript, zT
8520: 61 73 6b 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  askName);.      
8530: 69 66 28 20 67 2e 69 54 72 61 63 65 20 29 20 6c  if( g.iTrace ) l
8540: 6f 67 4d 65 73 73 61 67 65 28 22 65 6e 64 20 25  ogMessage("end %
8550: 73 20 28 25 64 29 22 2c 20 7a 54 61 73 6b 4e 61  s (%d)", zTaskNa
8560: 6d 65 2c 20 74 61 73 6b 49 64 29 3b 0a 20 20 20  me, taskId);.   
8570: 20 20 20 66 69 6e 69 73 68 53 63 72 69 70 74 28     finishScript(
8580: 69 43 6c 69 65 6e 74 2c 20 74 61 73 6b 49 64 2c  iClient, taskId,
8590: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
85a0: 65 33 5f 66 72 65 65 28 7a 54 61 73 6b 4e 61 6d  e3_free(zTaskNam
85b0: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
85c0: 33 5f 73 6c 65 65 70 28 31 30 29 3b 0a 20 20 20  3_sleep(10);.   
85d0: 20 7d 0a 20 20 20 20 69 66 28 20 67 2e 69 54 72   }.    if( g.iTr
85e0: 61 63 65 20 29 20 6c 6f 67 4d 65 73 73 61 67 65  ace ) logMessage
85f0: 28 22 65 6e 64 2d 63 6c 69 65 6e 74 22 29 3b 0a  ("end-client");.
8600: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
8610: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
8620: 3b 0a 20 20 20 20 69 6e 74 20 69 54 69 6d 65 6f  ;.    int iTimeo
8630: 75 74 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 30  ut;.    if( n==0
8640: 20 29 7b 0a 20 20 20 20 20 20 66 61 74 61 6c 45   ){.      fatalE
8650: 72 72 6f 72 28 22 6d 69 73 73 69 6e 67 20 73 63  rror("missing sc
8660: 72 69 70 74 20 66 69 6c 65 6e 61 6d 65 22 29 3b  ript filename");
8670: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
8680: 3e 31 20 29 20 75 6e 72 65 63 6f 67 6e 69 7a 65  >1 ) unrecognize
8690: 64 41 72 67 75 6d 65 6e 74 73 28 61 72 67 76 5b  dArguments(argv[
86a0: 30 5d 2c 20 6e 2c 20 61 72 67 76 2b 32 29 3b 0a  0], n, argv+2);.
86b0: 20 20 20 20 72 75 6e 53 71 6c 28 0a 20 20 20 20      runSql(.    
86c0: 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
86d0: 74 61 73 6b 28 5c 6e 22 0a 20 20 20 20 20 20 22  task(\n".      "
86e0: 20 20 69 64 20 49 4e 54 45 47 45 52 20 50 52 49    id INTEGER PRI
86f0: 4d 41 52 59 20 4b 45 59 2c 5c 6e 22 0a 20 20 20  MARY KEY,\n".   
8700: 20 20 20 22 20 20 6e 61 6d 65 20 54 45 58 54 2c     "  name TEXT,
8710: 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 63 6c 69  \n".      "  cli
8720: 65 6e 74 20 49 4e 54 45 47 45 52 2c 5c 6e 22 0a  ent INTEGER,\n".
8730: 20 20 20 20 20 20 22 20 20 73 74 61 72 74 74 69        "  startti
8740: 6d 65 20 44 41 54 45 2c 5c 6e 22 0a 20 20 20 20  me DATE,\n".    
8750: 20 20 22 20 20 65 6e 64 74 69 6d 65 20 44 41 54    "  endtime DAT
8760: 45 2c 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 73  E,\n".      "  s
8770: 63 72 69 70 74 20 54 45 58 54 5c 6e 22 0a 20 20  cript TEXT\n".  
8780: 20 20 20 20 22 29 3b 22 0a 20 20 20 20 20 20 22      ");".      "
8790: 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 61 73  CREATE INDEX tas
87a0: 6b 5f 69 31 20 4f 4e 20 74 61 73 6b 28 63 6c 69  k_i1 ON task(cli
87b0: 65 6e 74 2c 20 73 74 61 72 74 74 69 6d 65 29 3b  ent, starttime);
87c0: 5c 6e 22 0a 20 20 20 20 20 20 22 43 52 45 41 54  \n".      "CREAT
87d0: 45 20 49 4e 44 45 58 20 74 61 73 6b 5f 69 32 20  E INDEX task_i2 
87e0: 4f 4e 20 74 61 73 6b 28 63 6c 69 65 6e 74 2c 20  ON task(client, 
87f0: 65 6e 64 74 69 6d 65 29 3b 5c 6e 22 0a 20 20 20  endtime);\n".   
8800: 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
8810: 20 63 6f 75 6e 74 65 72 73 28 6e 45 72 72 6f 72   counters(nError
8820: 2c 6e 54 65 73 74 29 3b 5c 6e 22 0a 20 20 20 20  ,nTest);\n".    
8830: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 63    "INSERT INTO c
8840: 6f 75 6e 74 65 72 73 20 56 41 4c 55 45 53 28 30  ounters VALUES(0
8850: 2c 30 29 3b 5c 6e 22 0a 20 20 20 20 20 20 22 43  ,0);\n".      "C
8860: 52 45 41 54 45 20 54 41 42 4c 45 20 63 6c 69 65  REATE TABLE clie
8870: 6e 74 28 69 64 20 49 4e 54 45 47 45 52 20 50 52  nt(id INTEGER PR
8880: 49 4d 41 52 59 20 4b 45 59 2c 20 77 61 6e 74 48  IMARY KEY, wantH
8890: 61 6c 74 29 3b 5c 6e 22 0a 20 20 20 20 29 3b 0a  alt);\n".    );.
88a0: 20 20 20 20 7a 53 63 72 69 70 74 20 3d 20 72 65      zScript = re
88b0: 61 64 46 69 6c 65 28 61 72 67 76 5b 32 5d 29 3b  adFile(argv[2]);
88c0: 0a 20 20 20 20 69 66 28 20 67 2e 69 54 72 61 63  .    if( g.iTrac
88d0: 65 20 29 20 6c 6f 67 4d 65 73 73 61 67 65 28 22  e ) logMessage("
88e0: 62 65 67 69 6e 20 73 63 72 69 70 74 20 5b 25 73  begin script [%s
88f0: 5d 5c 6e 22 2c 20 61 72 67 76 5b 32 5d 29 3b 0a  ]\n", argv[2]);.
8900: 20 20 20 20 72 75 6e 53 63 72 69 70 74 28 30 2c      runScript(0,
8910: 20 30 2c 20 7a 53 63 72 69 70 74 2c 20 61 72 67   0, zScript, arg
8920: 76 5b 32 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74  v[2]);.    sqlit
8930: 65 33 5f 66 72 65 65 28 7a 53 63 72 69 70 74 29  e3_free(zScript)
8940: 3b 0a 20 20 20 20 69 66 28 20 67 2e 69 54 72 61  ;.    if( g.iTra
8950: 63 65 20 29 20 6c 6f 67 4d 65 73 73 61 67 65 28  ce ) logMessage(
8960: 22 65 6e 64 20 73 63 72 69 70 74 20 5b 25 73 5d  "end script [%s]
8970: 5c 6e 22 2c 20 61 72 67 76 5b 32 5d 29 3b 0a 20  \n", argv[2]);. 
8980: 20 20 20 77 61 69 74 46 6f 72 43 6c 69 65 6e 74     waitForClient
8990: 28 30 2c 20 32 30 30 30 2c 20 22 64 75 72 69 6e  (0, 2000, "durin
89a0: 67 20 73 68 75 74 64 6f 77 6e 2e 2e 2e 5c 6e 22  g shutdown...\n"
89b0: 29 3b 0a 20 20 20 20 74 72 79 53 71 6c 28 22 55  );.    trySql("U
89c0: 50 44 41 54 45 20 63 6c 69 65 6e 74 20 53 45 54  PDATE client SET
89d0: 20 77 61 6e 74 48 61 6c 74 3d 31 22 29 3b 0a 20   wantHalt=1");. 
89e0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70     sqlite3_sleep
89f0: 28 31 30 29 3b 0a 20 20 20 20 67 2e 69 54 69 6d  (10);.    g.iTim
8a00: 65 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 69 54  eout = 0;.    iT
8a10: 69 6d 65 6f 75 74 20 3d 20 31 30 30 30 3b 0a 20  imeout = 1000;. 
8a20: 20 20 20 77 68 69 6c 65 28 20 28 28 72 63 20 3d     while( ((rc =
8a30: 20 74 72 79 53 71 6c 28 22 53 45 4c 45 43 54 20   trySql("SELECT 
8a40: 31 20 46 52 4f 4d 20 63 6c 69 65 6e 74 22 29 29  1 FROM client"))
8a50: 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 0a 20 20  ==SQLITE_BUSY.  
8a60: 20 20 20 20 20 20 7c 7c 20 72 63 3d 3d 53 51 4c        || rc==SQL
8a70: 49 54 45 5f 52 4f 57 29 20 26 26 20 69 54 69 6d  ITE_ROW) && iTim
8a80: 65 6f 75 74 3e 30 20 29 7b 0a 20 20 20 20 20 20  eout>0 ){.      
8a90: 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 31 30  sqlite3_sleep(10
8aa0: 29 3b 0a 20 20 20 20 20 20 69 54 69 6d 65 6f 75  );.      iTimeou
8ab0: 74 20 2d 3d 20 31 30 3b 0a 20 20 20 20 7d 0a 20  t -= 10;.    }. 
8ac0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70     sqlite3_sleep
8ad0: 28 31 30 30 29 3b 0a 20 20 20 20 70 53 74 6d 74  (100);.    pStmt
8ae0: 20 3d 20 70 72 65 70 61 72 65 53 71 6c 28 22 53   = prepareSql("S
8af0: 45 4c 45 43 54 20 6e 45 72 72 6f 72 2c 20 6e 54  ELECT nError, nT
8b00: 65 73 74 20 46 52 4f 4d 20 63 6f 75 6e 74 65 72  est FROM counter
8b10: 73 22 29 3b 0a 20 20 20 20 69 54 69 6d 65 6f 75  s");.    iTimeou
8b20: 74 20 3d 20 31 30 30 30 3b 0a 20 20 20 20 77 68  t = 1000;.    wh
8b30: 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74  ile( (rc = sqlit
8b40: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 29 3d  e3_step(pStmt))=
8b50: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
8b60: 69 54 69 6d 65 6f 75 74 3e 30 20 29 7b 0a 20 20  iTimeout>0 ){.  
8b70: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65      sqlite3_slee
8b80: 70 28 31 30 29 3b 0a 20 20 20 20 20 20 69 54 69  p(10);.      iTi
8b90: 6d 65 6f 75 74 20 2d 3d 20 31 30 3b 0a 20 20 20  meout -= 10;.   
8ba0: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
8bb0: 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
8bc0: 20 20 20 67 2e 6e 45 72 72 6f 72 20 2b 3d 20 73     g.nError += s
8bd0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
8be0: 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  t(pStmt, 0);.   
8bf0: 20 20 20 67 2e 6e 54 65 73 74 20 2b 3d 20 73 71     g.nTest += sq
8c00: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
8c10: 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20  (pStmt, 1);.    
8c20: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  }.    sqlite3_fi
8c30: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
8c40: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f   }.  sqlite3_clo
8c50: 73 65 28 67 2e 64 62 29 3b 20 20 0a 20 20 6d 61  se(g.db);  .  ma
8c60: 79 62 65 43 6c 6f 73 65 28 67 2e 70 4c 6f 67 29  ybeClose(g.pLog)
8c70: 3b 0a 20 20 6d 61 79 62 65 43 6c 6f 73 65 28 67  ;.  maybeClose(g
8c80: 2e 70 45 72 72 4c 6f 67 29 3b 0a 20 20 69 66 28  .pErrLog);.  if(
8c90: 20 69 43 6c 69 65 6e 74 3d 3d 30 20 29 7b 0a 20   iClient==0 ){. 
8ca0: 20 20 20 70 72 69 6e 74 66 28 22 53 75 6d 6d 61     printf("Summa
8cb0: 72 79 3a 20 25 64 20 65 72 72 6f 72 73 20 69 6e  ry: %d errors in
8cc0: 20 25 64 20 74 65 73 74 73 5c 6e 22 2c 20 67 2e   %d tests\n", g.
8cd0: 6e 45 72 72 6f 72 2c 20 67 2e 6e 54 65 73 74 29  nError, g.nTest)
8ce0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 67  ;.  }.  return g
8cf0: 2e 6e 45 72 72 6f 72 3e 30 3b 0a 7d 0a           .nError>0;.}.