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 65 72 72 6e 6f 2e 68 include <errno.h
0460: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c >.#include <stdl
0470: 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c ib.h>.#include <
0480: 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 string.h>.#inclu
0490: 64 65 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 de <assert.h>.#i
04a0: 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e nclude <ctype.h>
04b0: 0a 0a 23 64 65 66 69 6e 65 20 49 53 53 50 41 43 ..#define ISSPAC
04c0: 45 28 58 29 20 69 73 73 70 61 63 65 28 28 75 6e E(X) isspace((un
04d0: 73 69 67 6e 65 64 20 63 68 61 72 29 28 58 29 29 signed char)(X))
04e0: 0a 23 64 65 66 69 6e 65 20 49 53 44 49 47 49 54 .#define ISDIGIT
04f0: 28 58 29 20 69 73 64 69 67 69 74 28 28 75 6e 73 (X) isdigit((uns
0500: 69 67 6e 65 64 20 63 68 61 72 29 28 58 29 29 0a igned char)(X)).
0510: 0a 2f 2a 20 54 68 65 20 73 75 66 66 69 78 20 74 ./* The suffix t
0520: 6f 20 61 70 70 65 6e 64 20 74 6f 20 74 68 65 20 o append to the
0530: 63 68 69 6c 64 20 63 6f 6d 6d 61 6e 64 20 6c 69 child command li
0540: 6e 65 73 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 23 nes, if any */.#
0550: 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 if defined(_WIN3
0560: 32 29 0a 23 20 64 65 66 69 6e 65 20 47 45 54 50 2).# define GETP
0570: 49 44 20 28 69 6e 74 29 47 65 74 43 75 72 72 65 ID (int)GetCurre
0580: 6e 74 50 72 6f 63 65 73 73 49 64 0a 23 65 6c 73 ntProcessId.#els
0590: 65 0a 23 20 64 65 66 69 6e 65 20 47 45 54 50 49 e.# define GETPI
05a0: 44 20 67 65 74 70 69 64 0a 23 65 6e 64 69 66 0a D getpid.#endif.
05b0: 0a 2f 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72 ./* The director
05c0: 79 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 y separator char
05d0: 61 63 74 65 72 28 73 29 20 2a 2f 0a 23 69 66 20 acter(s) */.#if
05e0: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a defined(_WIN32).
05f0: 23 20 64 65 66 69 6e 65 20 69 73 44 69 72 53 65 # define isDirSe
0600: 70 28 63 29 20 28 28 28 63 29 20 3d 3d 20 27 2f p(c) (((c) == '/
0610: 27 29 20 7c 7c 20 28 28 63 29 20 3d 3d 20 27 5c ') || ((c) == '\
0620: 5c 27 29 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 \')).#else.# def
0630: 69 6e 65 20 69 73 44 69 72 53 65 70 28 63 29 20 ine isDirSep(c)
0640: 28 28 63 29 20 3d 3d 20 27 2f 27 29 0a 23 65 6e ((c) == '/').#en
0650: 64 69 66 0a 0a 2f 2a 20 4d 61 72 6b 20 61 20 70 dif../* Mark a p
0660: 61 72 61 6d 65 74 65 72 20 61 73 20 75 6e 75 73 arameter as unus
0670: 65 64 20 74 6f 20 73 75 70 70 72 65 73 73 20 63 ed to suppress c
0680: 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73 ompiler warnings
0690: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 55 53 */.#define UNUS
06a0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 78 29 20 ED_PARAMETER(x)
06b0: 20 28 76 6f 69 64 29 78 0a 0a 2f 2a 20 47 6c 6f (void)x../* Glo
06c0: 62 61 6c 20 64 61 74 61 0a 2a 2f 0a 73 74 61 74 bal data.*/.stat
06d0: 69 63 20 73 74 72 75 63 74 20 47 6c 6f 62 61 6c ic struct Global
06e0: 20 7b 0a 20 20 63 68 61 72 20 2a 61 72 67 76 30 {. char *argv0
06f0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e ; /* N
0700: 61 6d 65 20 6f 66 20 74 68 65 20 65 78 65 63 75 ame of the execu
0710: 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 table */. const
0720: 20 63 68 61 72 20 2a 7a 56 66 73 3b 20 20 20 20 char *zVfs;
0730: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53 /* Name of VFS
0740: 20 74 6f 20 75 73 65 2e 20 4f 66 74 65 6e 20 4e to use. Often N
0750: 55 4c 4c 20 6d 65 61 6e 69 6e 67 20 22 64 65 66 ULL meaning "def
0760: 61 75 6c 74 22 20 2a 2f 0a 20 20 63 68 61 72 20 ault" */. char
0770: 2a 7a 44 62 46 69 6c 65 3b 20 20 20 20 20 20 20 *zDbFile;
0780: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 /* Name of the
0790: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 database */. s
07a0: 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 qlite3 *db;
07b0: 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f /* Open co
07c0: 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 64 61 74 61 nnection to data
07d0: 62 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a base */. char *
07e0: 7a 45 72 72 4c 6f 67 3b 20 20 20 20 20 20 20 20 zErrLog;
07f0: 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 66 6f 72 /* Filename for
0800: 20 65 72 72 6f 72 20 6c 6f 67 20 2a 2f 0a 20 20 error log */.
0810: 46 49 4c 45 20 2a 70 45 72 72 4c 6f 67 3b 20 20 FILE *pErrLog;
0820: 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20 /* Where
0830: 74 6f 20 77 72 69 74 65 20 65 72 72 6f 72 73 20 to write errors
0840: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 67 3b */. char *zLog;
0850: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e /* N
0860: 61 6d 65 20 6f 66 20 6f 75 74 70 75 74 20 6c 6f ame of output lo
0870: 67 20 66 69 6c 65 20 2a 2f 0a 20 20 46 49 4c 45 g file */. FILE
0880: 20 2a 70 4c 6f 67 3b 20 20 20 20 20 20 20 20 20 *pLog;
0890: 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 /* Where to w
08a0: 72 69 74 65 20 6c 6f 67 20 6d 65 73 73 61 67 65 rite log message
08b0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 7a 4e 61 6d s */. char zNam
08c0: 65 5b 33 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a e[32]; /*
08d0: 20 53 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 6f Symbolic name o
08e0: 66 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a f this process *
08f0: 2f 0a 20 20 69 6e 74 20 74 61 73 6b 49 64 3b 20 /. int taskId;
0900: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 /* Ta
0910: 73 6b 20 49 44 2e 20 20 30 20 6d 65 61 6e 73 20 sk ID. 0 means
0920: 73 75 70 65 72 76 69 73 6f 72 2e 20 2a 2f 0a 20 supervisor. */.
0930: 20 69 6e 74 20 69 54 72 61 63 65 3b 20 20 20 20 int iTrace;
0940: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61 63 69 /* Traci
0950: 6e 67 20 6c 65 76 65 6c 20 2a 2f 0a 20 20 69 6e ng level */. in
0960: 74 20 62 53 71 6c 54 72 61 63 65 3b 20 20 20 20 t bSqlTrace;
0970: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 /* True to
0980: 74 72 61 63 65 20 53 51 4c 20 63 6f 6d 6d 61 6e trace SQL comman
0990: 64 73 20 2a 2f 0a 20 20 69 6e 74 20 62 49 67 6e ds */. int bIgn
09a0: 6f 72 65 53 71 6c 45 72 72 6f 72 73 3b 20 20 2f oreSqlErrors; /
09b0: 2a 20 49 67 6e 6f 72 65 20 65 72 72 6f 72 73 20 * Ignore errors
09c0: 69 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 in SQL statement
09d0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 72 72 6f s */. int nErro
09e0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a r; /*
09f0: 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 Number of error
0a00: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 54 65 73 74 s */. int nTest
0a10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a ; /*
0a20: 20 4e 75 6d 62 65 72 20 6f 66 20 2d 2d 6d 61 74 Number of --mat
0a30: 63 68 20 6f 70 65 72 61 74 6f 72 73 20 2a 2f 0a ch operators */.
0a40: 20 20 69 6e 74 20 69 54 69 6d 65 6f 75 74 3b 20 int iTimeout;
0a50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6c 6c /* Mill
0a60: 69 73 65 63 6f 6e 64 73 20 75 6e 74 69 6c 20 61 iseconds until a
0a70: 20 62 75 73 79 20 74 69 6d 65 6f 75 74 20 2a 2f busy timeout */
0a80: 0a 20 20 69 6e 74 20 62 53 79 6e 63 3b 20 20 20 . int bSync;
0a90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6c /* Cal
0aa0: 6c 20 66 73 79 6e 63 28 29 20 2a 2f 0a 7d 20 67 l fsync() */.} g
0ab0: 3b 0a 0a 2f 2a 20 44 65 66 61 75 6c 74 20 74 69 ;../* Default ti
0ac0: 6d 65 6f 75 74 20 2a 2f 0a 23 64 65 66 69 6e 65 meout */.#define
0ad0: 20 44 45 46 41 55 4c 54 5f 54 49 4d 45 4f 55 54 DEFAULT_TIMEOUT
0ae0: 20 31 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 50 72 10000../*.** Pr
0af0: 69 6e 74 20 61 20 6d 65 73 73 61 67 65 20 61 64 int a message ad
0b00: 64 69 6e 67 20 7a 50 72 65 66 69 78 5b 5d 20 74 ding zPrefix[] t
0b10: 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 o the beginning
0b20: 6f 66 20 65 76 65 72 79 20 6c 69 6e 65 2e 0a 2a of every line..*
0b30: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 /.static void pr
0b40: 69 6e 74 57 69 74 68 50 72 65 66 69 78 28 46 49 intWithPrefix(FI
0b50: 4c 45 20 2a 70 4f 75 74 2c 20 63 6f 6e 73 74 20 LE *pOut, const
0b60: 63 68 61 72 20 2a 7a 50 72 65 66 69 78 2c 20 63 char *zPrefix, c
0b70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 29 onst char *zMsg)
0b80: 7b 0a 20 20 77 68 69 6c 65 28 20 7a 4d 73 67 20 {. while( zMsg
0b90: 26 26 20 7a 4d 73 67 5b 30 5d 20 29 7b 0a 20 20 && zMsg[0] ){.
0ba0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 int i;. for
0bb0: 28 69 3d 30 3b 20 7a 4d 73 67 5b 69 5d 20 26 26 (i=0; zMsg[i] &&
0bc0: 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 6e 27 20 26 zMsg[i]!='\n' &
0bd0: 26 20 7a 4d 73 67 5b 69 5d 21 3d 27 5c 72 27 3b & zMsg[i]!='\r';
0be0: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 66 70 72 69 i++){}. fpri
0bf0: 6e 74 66 28 70 4f 75 74 2c 20 22 25 73 25 2e 2a ntf(pOut, "%s%.*
0c00: 73 5c 6e 22 2c 20 7a 50 72 65 66 69 78 2c 20 69 s\n", zPrefix, i
0c10: 2c 20 7a 4d 73 67 29 3b 0a 20 20 20 20 7a 4d 73 , zMsg);. zMs
0c20: 67 20 2b 3d 20 69 3b 0a 20 20 20 20 77 68 69 6c g += i;. whil
0c30: 65 28 20 7a 4d 73 67 5b 30 5d 3d 3d 27 5c 6e 27 e( zMsg[0]=='\n'
0c40: 20 7c 7c 20 7a 4d 73 67 5b 30 5d 3d 3d 27 5c 72 || zMsg[0]=='\r
0c50: 27 20 29 20 7a 4d 73 67 2b 2b 3b 0a 20 20 7d 0a ' ) zMsg++;. }.
0c60: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 }../*.** Compare
0c70: 20 74 77 6f 20 70 6f 69 6e 74 65 72 73 20 74 6f two pointers to
0c80: 20 73 74 72 69 6e 67 73 2c 20 77 68 65 72 65 20 strings, where
0c90: 74 68 65 20 70 6f 69 6e 74 65 72 73 20 6d 69 67 the pointers mig
0ca0: 68 74 20 62 65 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 ht be NULL..*/.s
0cb0: 74 61 74 69 63 20 69 6e 74 20 73 61 66 65 5f 73 tatic int safe_s
0cc0: 74 72 63 6d 70 28 63 6f 6e 73 74 20 63 68 61 72 trcmp(const char
0cd0: 20 2a 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 *a, const char
0ce0: 2a 62 29 7b 0a 20 20 69 66 28 20 61 3d 3d 62 20 *b){. if( a==b
0cf0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 ) return 0;. if
0d00: 28 20 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 ( a==0 ) return
0d10: 2d 31 3b 0a 20 20 69 66 28 20 62 3d 3d 30 20 29 -1;. if( b==0 )
0d20: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 return 1;. ret
0d30: 75 72 6e 20 73 74 72 63 6d 70 28 61 2c 62 29 3b urn strcmp(a,b);
0d40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e .}../*.** Return
0d50: 20 54 52 55 45 20 69 66 20 73 74 72 69 6e 67 20 TRUE if string
0d60: 7a 5b 5d 20 6d 61 74 63 68 65 73 20 67 6c 6f 62 z[] matches glob
0d70: 20 70 61 74 74 65 72 6e 20 7a 47 6c 6f 62 5b 5d pattern zGlob[]
0d80: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 ..** Return FALS
0d90: 45 20 69 66 20 74 68 65 20 70 61 74 74 65 72 6e E if the pattern
0da0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 2e does not match.
0db0: 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62 62 69 6e 67 20 .**.** Globbing
0dc0: 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 rules:.**.**
0dd0: 20 20 27 2a 27 20 20 20 20 20 20 20 4d 61 74 63 '*' Matc
0de0: 68 65 73 20 61 6e 79 20 73 65 71 75 65 6e 63 65 hes any sequence
0df0: 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 of zero or more
0e00: 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a characters..**.
0e10: 2a 2a 20 20 20 20 20 20 27 3f 27 20 20 20 20 20 ** '?'
0e20: 20 20 4d 61 74 63 68 65 73 20 65 78 61 63 74 6c Matches exactl
0e30: 79 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 2e y one character.
0e40: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 2e 2e 2e 5d .**.** [...]
0e50: 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 6f 6e Matches on
0e60: 65 20 63 68 61 72 61 63 74 65 72 20 66 72 6f 6d e character from
0e70: 20 74 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69 the enclosed li
0e80: 73 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 st of.**
0e90: 20 20 20 20 20 20 20 20 63 68 61 72 61 63 74 65 characte
0ea0: 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 5e rs..**.** [^
0eb0: 2e 2e 2e 5d 20 20 20 20 20 4d 61 74 63 68 65 73 ...] Matches
0ec0: 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 20 6e one character n
0ed0: 6f 74 20 69 6e 20 74 68 65 20 65 6e 63 6c 6f 73 ot in the enclos
0ee0: 65 64 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 20 ed list..**.**
0ef0: 20 20 20 20 27 23 27 20 20 20 20 20 20 20 4d 61 '#' Ma
0f00: 74 63 68 65 73 20 61 6e 79 20 73 65 71 75 65 6e tches any sequen
0f10: 63 65 20 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 ce of one or mor
0f20: 65 20 64 69 67 69 74 73 20 77 69 74 68 20 61 6e e digits with an
0f30: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 .**
0f40: 20 20 20 6f 70 74 69 6f 6e 61 6c 20 2b 20 6f 72 optional + or
0f50: 20 2d 20 73 69 67 6e 20 69 6e 20 66 72 6f 6e 74 - sign in front
0f60: 0a 2a 2f 0a 69 6e 74 20 73 74 72 67 6c 6f 62 28 .*/.int strglob(
0f70: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f const char *zGlo
0f80: 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a b, const char *z
0f90: 29 7b 0a 20 20 69 6e 74 20 63 2c 20 63 32 3b 0a ){. int c, c2;.
0fa0: 20 20 69 6e 74 20 69 6e 76 65 72 74 3b 0a 20 20 int invert;.
0fb0: 69 6e 74 20 73 65 65 6e 3b 0a 0a 20 20 77 68 69 int seen;.. whi
0fc0: 6c 65 28 20 28 63 20 3d 20 28 2a 28 7a 47 6c 6f le( (c = (*(zGlo
0fd0: 62 2b 2b 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 b++)))!=0 ){.
0fe0: 20 69 66 28 20 63 3d 3d 27 2a 27 20 29 7b 0a 20 if( c=='*' ){.
0ff0: 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 28 while( (c=(
1000: 2a 28 7a 47 6c 6f 62 2b 2b 29 29 29 20 3d 3d 20 *(zGlob++))) ==
1010: 27 2a 27 20 7c 7c 20 63 3d 3d 27 3f 27 20 29 7b '*' || c=='?' ){
1020: 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d . if( c==
1030: 27 3f 27 20 26 26 20 28 2a 28 7a 2b 2b 29 29 3d '?' && (*(z++))=
1040: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 =0 ) return 0;.
1050: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 }. if(
1060: 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 c==0 ){.
1070: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 return 1;.
1080: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b }else if( c=='[
1090: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 ' ){. whi
10a0: 6c 65 28 20 2a 7a 20 26 26 20 73 74 72 67 6c 6f le( *z && strglo
10b0: 62 28 7a 47 6c 6f 62 2d 31 2c 7a 29 20 29 7b 0a b(zGlob-1,z) ){.
10c0: 20 20 20 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 z++;.
10d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
10e0: 20 72 65 74 75 72 6e 20 28 2a 7a 29 21 3d 30 3b return (*z)!=0;
10f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 . }. w
1100: 68 69 6c 65 28 20 28 63 32 20 3d 20 28 2a 28 7a hile( (c2 = (*(z
1110: 2b 2b 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 ++)))!=0 ){.
1120: 20 20 20 20 77 68 69 6c 65 28 20 63 32 21 3d 63 while( c2!=c
1130: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 32 ){. c2
1140: 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 20 = *(z++);.
1150: 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20 29 if( c2==0 )
1160: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 return 0;.
1170: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 }. if(
1180: 20 73 74 72 67 6c 6f 62 28 7a 47 6c 6f 62 2c 7a strglob(zGlob,z
1190: 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 ) ) return 1;.
11a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 }. retu
11b0: 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 rn 0;. }else
11c0: 69 66 28 20 63 3d 3d 27 3f 27 20 29 7b 0a 20 20 if( c=='?' ){.
11d0: 20 20 20 20 69 66 28 20 28 2a 28 7a 2b 2b 29 29 if( (*(z++))
11e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a ==0 ) return 0;.
11f0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d }else if( c=
1200: 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 69 6e ='[' ){. in
1210: 74 20 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 t prior_c = 0;.
1220: 20 20 20 20 20 73 65 65 6e 20 3d 20 30 3b 0a 20 seen = 0;.
1230: 20 20 20 20 20 69 6e 76 65 72 74 20 3d 20 30 3b invert = 0;
1240: 0a 20 20 20 20 20 20 63 20 3d 20 2a 28 7a 2b 2b . c = *(z++
1250: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d );. if( c==
1260: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 0 ) return 0;.
1270: 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 c2 = *(zGlob
1280: 2b 2b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 ++);. if( c
1290: 32 3d 3d 27 5e 27 20 29 7b 0a 20 20 20 20 20 20 2=='^' ){.
12a0: 20 20 69 6e 76 65 72 74 20 3d 20 31 3b 0a 20 20 invert = 1;.
12b0: 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c c2 = *(zGl
12c0: 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 ob++);. }.
12d0: 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27 5d 27 if( c2==']'
12e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 ){. if(
12f0: 63 3d 3d 27 5d 27 20 29 20 73 65 65 6e 20 3d 20 c==']' ) seen =
1300: 31 3b 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 1;. c2 =
1310: 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 *(zGlob++);.
1320: 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 }. while(
1330: 20 63 32 20 26 26 20 63 32 21 3d 27 5d 27 20 29 c2 && c2!=']' )
1340: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 32 {. if( c2
1350: 3d 3d 27 2d 27 20 26 26 20 7a 47 6c 6f 62 5b 30 =='-' && zGlob[0
1360: 5d 21 3d 27 5d 27 20 26 26 20 7a 47 6c 6f 62 5b ]!=']' && zGlob[
1370: 30 5d 21 3d 30 20 26 26 20 70 72 69 6f 72 5f 63 0]!=0 && prior_c
1380: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 >0 ){.
1390: 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b c2 = *(zGlob++);
13a0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 . if( c
13b0: 3e 3d 70 72 69 6f 72 5f 63 20 26 26 20 63 3c 3d >=prior_c && c<=
13c0: 63 32 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 c2 ) seen = 1;.
13d0: 20 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63 prior_c
13e0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 = 0;. }e
13f0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 lse{. i
1400: 66 28 20 63 3d 3d 63 32 20 29 7b 0a 20 20 20 20 f( c==c2 ){.
1410: 20 20 20 20 20 20 20 20 73 65 65 6e 20 3d 20 31 seen = 1
1420: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 ;. }.
1430: 20 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20 prior_c
1440: 3d 20 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a = c2;. }.
1450: 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a c2 = *(z
1460: 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d Glob++);. }
1470: 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30 . if( c2==0
1480: 20 7c 7c 20 28 73 65 65 6e 20 5e 20 69 6e 76 65 || (seen ^ inve
1490: 72 74 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 rt)==0 ) return
14a0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 0;. }else if(
14b0: 20 63 3d 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 c=='#' ){.
14c0: 20 69 66 28 20 28 7a 5b 30 5d 3d 3d 27 2d 27 20 if( (z[0]=='-'
14d0: 7c 7c 20 7a 5b 30 5d 3d 3d 27 2b 27 29 20 26 26 || z[0]=='+') &&
14e0: 20 49 53 44 49 47 49 54 28 7a 5b 31 5d 29 20 29 ISDIGIT(z[1]) )
14f0: 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 z++;. if(
1500: 21 49 53 44 49 47 49 54 28 7a 5b 30 5d 29 20 29 !ISDIGIT(z[0]) )
1510: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 return 0;.
1520: 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c z++;. whil
1530: 65 28 20 49 53 44 49 47 49 54 28 7a 5b 30 5d 29 e( ISDIGIT(z[0])
1540: 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 7d ){ z++; }. }
1550: 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 else{. if(
1560: 63 21 3d 28 2a 28 7a 2b 2b 29 29 20 29 20 72 65 c!=(*(z++)) ) re
1570: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 turn 0;. }.
1580: 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a 3d 3d 30 }. return *z==0
1590: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 ;.}../*.** Close
15a0: 20 6f 75 74 70 75 74 20 73 74 72 65 61 6d 20 70 output stream p
15b0: 4f 75 74 20 69 66 20 69 74 20 69 73 20 6e 6f 74 Out if it is not
15c0: 20 73 74 64 6f 75 74 20 6f 72 20 73 74 64 65 72 stdout or stder
15d0: 72 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 r.*/.static void
15e0: 20 6d 61 79 62 65 43 6c 6f 73 65 28 46 49 4c 45 maybeClose(FILE
15f0: 20 2a 70 4f 75 74 29 7b 0a 20 20 69 66 28 20 70 *pOut){. if( p
1600: 4f 75 74 21 3d 73 74 64 6f 75 74 20 26 26 20 70 Out!=stdout && p
1610: 4f 75 74 21 3d 73 74 64 65 72 72 20 29 20 66 63 Out!=stderr ) fc
1620: 6c 6f 73 65 28 70 4f 75 74 29 3b 0a 7d 0a 0a 2f lose(pOut);.}../
1630: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 65 72 *.** Print an er
1640: 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2f 0a 73 ror message.*/.s
1650: 74 61 74 69 63 20 76 6f 69 64 20 65 72 72 6f 72 tatic void error
1660: 4d 65 73 73 61 67 65 28 63 6f 6e 73 74 20 63 68 Message(const ch
1670: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e ar *zFormat, ...
1680: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b ){. va_list ap;
1690: 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 . char *zMsg;.
16a0: 20 63 68 61 72 20 7a 50 72 65 66 69 78 5b 33 30 char zPrefix[30
16b0: 5d 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 ];. va_start(ap
16c0: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 4d , zFormat);. zM
16d0: 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 sg = sqlite3_vmp
16e0: 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 rintf(zFormat, a
16f0: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 p);. va_end(ap)
1700: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 ;. sqlite3_snpr
1710: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 50 72 65 intf(sizeof(zPre
1720: 66 69 78 29 2c 20 7a 50 72 65 66 69 78 2c 20 22 fix), zPrefix, "
1730: 25 73 3a 45 52 52 4f 52 3a 20 22 2c 20 67 2e 7a %s:ERROR: ", g.z
1740: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 67 2e 70 Name);. if( g.p
1750: 4c 6f 67 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 Log ){. print
1760: 57 69 74 68 50 72 65 66 69 78 28 67 2e 70 4c 6f WithPrefix(g.pLo
1770: 67 2c 20 7a 50 72 65 66 69 78 2c 20 7a 4d 73 67 g, zPrefix, zMsg
1780: 29 3b 0a 20 20 20 20 66 66 6c 75 73 68 28 67 2e );. fflush(g.
1790: 70 4c 6f 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 pLog);. }. if(
17a0: 20 67 2e 70 45 72 72 4c 6f 67 20 26 26 20 73 61 g.pErrLog && sa
17b0: 66 65 5f 73 74 72 63 6d 70 28 67 2e 7a 45 72 72 fe_strcmp(g.zErr
17c0: 4c 6f 67 2c 67 2e 7a 4c 6f 67 29 20 29 7b 0a 20 Log,g.zLog) ){.
17d0: 20 20 20 70 72 69 6e 74 57 69 74 68 50 72 65 66 printWithPref
17e0: 69 78 28 67 2e 70 45 72 72 4c 6f 67 2c 20 7a 50 ix(g.pErrLog, zP
17f0: 72 65 66 69 78 2c 20 7a 4d 73 67 29 3b 0a 20 20 refix, zMsg);.
1800: 20 20 66 66 6c 75 73 68 28 67 2e 70 45 72 72 4c fflush(g.pErrL
1810: 6f 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 og);. }. sqlit
1820: 65 33 5f 66 72 65 65 28 7a 4d 73 67 29 3b 0a 20 e3_free(zMsg);.
1830: 20 67 2e 6e 45 72 72 6f 72 2b 2b 3b 0a 7d 0a 0a g.nError++;.}..
1840: 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 /* Forward decla
1850: 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 ration */.static
1860: 20 69 6e 74 20 74 72 79 53 71 6c 28 63 6f 6e 73 int trySql(cons
1870: 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 3b 0a 0a t char*, ...);..
1880: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 65 /*.** Print an e
1890: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 61 6e 64 rror message and
18a0: 20 74 68 65 6e 20 71 75 69 74 2e 0a 2a 2f 0a 73 then quit..*/.s
18b0: 74 61 74 69 63 20 76 6f 69 64 20 66 61 74 61 6c tatic void fatal
18c0: 45 72 72 6f 72 28 63 6f 6e 73 74 20 63 68 61 72 Error(const char
18d0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b *zFormat, ...){
18e0: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 . va_list ap;.
18f0: 20 63 68 61 72 20 2a 7a 4d 73 67 3b 0a 20 20 63 char *zMsg;. c
1900: 68 61 72 20 7a 50 72 65 66 69 78 5b 33 30 5d 3b har zPrefix[30];
1910: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 . va_start(ap,
1920: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 4d 73 67 zFormat);. zMsg
1930: 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 = sqlite3_vmpri
1940: 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 ntf(zFormat, ap)
1950: 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a ;. va_end(ap);.
1960: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e sqlite3_snprin
1970: 74 66 28 73 69 7a 65 6f 66 28 7a 50 72 65 66 69 tf(sizeof(zPrefi
1980: 78 29 2c 20 7a 50 72 65 66 69 78 2c 20 22 25 73 x), zPrefix, "%s
1990: 3a 46 41 54 41 4c 3a 20 22 2c 20 67 2e 7a 4e 61 :FATAL: ", g.zNa
19a0: 6d 65 29 3b 0a 20 20 69 66 28 20 67 2e 70 4c 6f me);. if( g.pLo
19b0: 67 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 57 69 g ){. printWi
19c0: 74 68 50 72 65 66 69 78 28 67 2e 70 4c 6f 67 2c thPrefix(g.pLog,
19d0: 20 7a 50 72 65 66 69 78 2c 20 7a 4d 73 67 29 3b zPrefix, zMsg);
19e0: 0a 20 20 20 20 66 66 6c 75 73 68 28 67 2e 70 4c . fflush(g.pL
19f0: 6f 67 29 3b 0a 20 20 20 20 6d 61 79 62 65 43 6c og);. maybeCl
1a00: 6f 73 65 28 67 2e 70 4c 6f 67 29 3b 0a 20 20 7d ose(g.pLog);. }
1a10: 0a 20 20 69 66 28 20 67 2e 70 45 72 72 4c 6f 67 . if( g.pErrLog
1a20: 20 26 26 20 73 61 66 65 5f 73 74 72 63 6d 70 28 && safe_strcmp(
1a30: 67 2e 7a 45 72 72 4c 6f 67 2c 67 2e 7a 4c 6f 67 g.zErrLog,g.zLog
1a40: 29 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 57 69 ) ){. printWi
1a50: 74 68 50 72 65 66 69 78 28 67 2e 70 45 72 72 4c thPrefix(g.pErrL
1a60: 6f 67 2c 20 7a 50 72 65 66 69 78 2c 20 7a 4d 73 og, zPrefix, zMs
1a70: 67 29 3b 0a 20 20 20 20 66 66 6c 75 73 68 28 67 g);. fflush(g
1a80: 2e 70 45 72 72 4c 6f 67 29 3b 0a 20 20 20 20 6d .pErrLog);. m
1a90: 61 79 62 65 43 6c 6f 73 65 28 67 2e 70 45 72 72 aybeClose(g.pErr
1aa0: 4c 6f 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 Log);. }. sqli
1ab0: 74 65 33 5f 66 72 65 65 28 7a 4d 73 67 29 3b 0a te3_free(zMsg);.
1ac0: 20 20 69 66 28 20 67 2e 64 62 20 29 7b 0a 20 20 if( g.db ){.
1ad0: 20 20 69 6e 74 20 6e 54 72 79 20 3d 20 30 3b 0a int nTry = 0;.
1ae0: 20 20 20 20 67 2e 69 54 69 6d 65 6f 75 74 20 3d g.iTimeout =
1af0: 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 74 0;. while( t
1b00: 72 79 53 71 6c 28 22 55 50 44 41 54 45 20 63 6c rySql("UPDATE cl
1b10: 69 65 6e 74 20 53 45 54 20 77 61 6e 74 48 61 6c ient SET wantHal
1b20: 74 3d 31 3b 22 29 3d 3d 53 51 4c 49 54 45 5f 42 t=1;")==SQLITE_B
1b30: 55 53 59 0a 20 20 20 20 20 20 20 20 20 20 20 26 USY. &
1b40: 26 20 28 6e 54 72 79 2b 2b 29 3c 31 30 30 20 29 & (nTry++)<100 )
1b50: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f {. sqlite3_
1b60: 73 6c 65 65 70 28 31 30 29 3b 0a 20 20 20 20 7d sleep(10);. }
1b70: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 63 . }. sqlite3_c
1b80: 6c 6f 73 65 28 67 2e 64 62 29 3b 0a 20 20 65 78 lose(g.db);. ex
1b90: 69 74 28 31 29 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a it(1); .}.../*.
1ba0: 2a 2a 20 50 72 69 6e 74 20 61 20 6c 6f 67 20 6d ** Print a log m
1bb0: 65 73 73 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63 essage.*/.static
1bc0: 20 76 6f 69 64 20 6c 6f 67 4d 65 73 73 61 67 65 void logMessage
1bd0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f (const char *zFo
1be0: 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 rmat, ...){. va
1bf0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 _list ap;. char
1c00: 20 2a 7a 4d 73 67 3b 0a 20 20 63 68 61 72 20 7a *zMsg;. char z
1c10: 50 72 65 66 69 78 5b 33 30 5d 3b 0a 20 20 76 61 Prefix[30];. va
1c20: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d _start(ap, zForm
1c30: 61 74 29 3b 0a 20 20 7a 4d 73 67 20 3d 20 73 71 at);. zMsg = sq
1c40: 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a lite3_vmprintf(z
1c50: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 Format, ap);. v
1c60: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 73 71 6c a_end(ap);. sql
1c70: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 ite3_snprintf(si
1c80: 7a 65 6f 66 28 7a 50 72 65 66 69 78 29 2c 20 7a zeof(zPrefix), z
1c90: 50 72 65 66 69 78 2c 20 22 25 73 3a 20 22 2c 20 Prefix, "%s: ",
1ca0: 67 2e 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 g.zName);. if(
1cb0: 67 2e 70 4c 6f 67 20 29 7b 0a 20 20 20 20 70 72 g.pLog ){. pr
1cc0: 69 6e 74 57 69 74 68 50 72 65 66 69 78 28 67 2e intWithPrefix(g.
1cd0: 70 4c 6f 67 2c 20 7a 50 72 65 66 69 78 2c 20 7a pLog, zPrefix, z
1ce0: 4d 73 67 29 3b 0a 20 20 20 20 66 66 6c 75 73 68 Msg);. fflush
1cf0: 28 67 2e 70 4c 6f 67 29 3b 0a 20 20 7d 0a 20 20 (g.pLog);. }.
1d00: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4d 73 sqlite3_free(zMs
1d10: 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 g);.}../*.** Ret
1d20: 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f urn the length o
1d30: 66 20 61 20 73 74 72 69 6e 67 20 6f 6d 69 74 74 f a string omitt
1d40: 69 6e 67 20 74 72 61 69 6c 69 6e 67 20 77 68 69 ing trailing whi
1d50: 74 65 73 70 61 63 65 0a 2a 2f 0a 73 74 61 74 69 tespace.*/.stati
1d60: 63 20 69 6e 74 20 63 6c 69 70 4c 65 6e 67 74 68 c int clipLength
1d70: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b (const char *z){
1d80: 0a 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 . int n = (int)
1d90: 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 20 77 68 69 strlen(z);. whi
1da0: 6c 65 28 20 6e 3e 30 20 26 26 20 49 53 53 50 41 le( n>0 && ISSPA
1db0: 43 45 28 7a 5b 6e 2d 31 5d 29 20 29 7b 20 6e 2d CE(z[n-1]) ){ n-
1dc0: 2d 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b -; }. return n;
1dd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 75 78 69 6c 69 .}../*.** Auxili
1de0: 61 72 79 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e ary SQL function
1df0: 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65 20 6e to return the n
1e00: 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 0a 2a ame of the VFS.*
1e10: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76 66 /.static void vf
1e20: 73 4e 61 6d 65 46 75 6e 63 28 0a 20 20 73 71 6c sNameFunc(. sql
1e30: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f ite3_context *co
1e40: 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 ntext,. int arg
1e50: 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c c,. sqlite3_val
1e60: 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 ue **argv.){. s
1e70: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c qlite3 *db = sql
1e80: 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f ite3_context_db_
1e90: 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b handle(context);
1ea0: 0a 20 20 63 68 61 72 20 2a 7a 56 66 73 20 3d 20 . char *zVfs =
1eb0: 30 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 0;. UNUSED_PARA
1ec0: 4d 45 54 45 52 28 61 72 67 63 29 3b 0a 20 20 55 METER(argc);. U
1ed0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 NUSED_PARAMETER(
1ee0: 61 72 67 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 argv);. sqlite3
1ef0: 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 _file_control(db
1f00: 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45 , "main", SQLITE
1f10: 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 2c 20 _FCNTL_VFSNAME,
1f20: 26 7a 56 66 73 29 3b 0a 20 20 69 66 28 20 7a 56 &zVfs);. if( zV
1f30: 66 73 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 fs ){. sqlite
1f40: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 3_result_text(co
1f50: 6e 74 65 78 74 2c 20 7a 56 66 73 2c 20 2d 31 2c ntext, zVfs, -1,
1f60: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a sqlite3_free);.
1f70: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 75 73 }.}../*.** Bus
1f80: 79 20 68 61 6e 64 6c 65 72 20 77 69 74 68 20 61 y handler with a
1f90: 20 67 2e 69 54 69 6d 65 6f 75 74 2d 6d 69 6c 6c g.iTimeout-mill
1fa0: 69 73 65 63 6f 6e 64 20 74 69 6d 65 6f 75 74 0a isecond timeout.
1fb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 75 */.static int bu
1fc0: 73 79 48 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a syHandler(void *
1fd0: 70 43 44 2c 20 69 6e 74 20 63 6f 75 6e 74 29 7b pCD, int count){
1fe0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 . UNUSED_PARAME
1ff0: 54 45 52 28 70 43 44 29 3b 0a 20 20 69 66 28 20 TER(pCD);. if(
2000: 63 6f 75 6e 74 2a 31 30 3e 67 2e 69 54 69 6d 65 count*10>g.iTime
2010: 6f 75 74 20 29 7b 0a 20 20 20 20 69 66 28 20 67 out ){. if( g
2020: 2e 69 54 69 6d 65 6f 75 74 3e 30 20 29 20 65 72 .iTimeout>0 ) er
2030: 72 6f 72 4d 65 73 73 61 67 65 28 22 74 69 6d 65 rorMessage("time
2040: 6f 75 74 20 61 66 74 65 72 20 25 64 6d 73 22 2c out after %dms",
2050: 20 67 2e 69 54 69 6d 65 6f 75 74 29 3b 0a 20 20 g.iTimeout);.
2060: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a return 0;. }.
2070: 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 sqlite3_sleep(
2080: 31 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 10);. return 1;
2090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 54 72 .}../*.** SQL Tr
20a0: 61 63 65 20 63 61 6c 6c 62 61 63 6b 0a 2a 2f 0a ace callback.*/.
20b0: 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c 54 static void sqlT
20c0: 72 61 63 65 43 61 6c 6c 62 61 63 6b 28 76 6f 69 raceCallback(voi
20d0: 64 20 2a 4e 6f 74 55 73 65 64 31 2c 20 63 6f 6e d *NotUsed1, con
20e0: 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a st char *zSql){.
20f0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 UNUSED_PARAMET
2100: 45 52 28 4e 6f 74 55 73 65 64 31 29 3b 0a 20 20 ER(NotUsed1);.
2110: 6c 6f 67 4d 65 73 73 61 67 65 28 22 5b 25 2e 2a logMessage("[%.*
2120: 73 5d 22 2c 20 63 6c 69 70 4c 65 6e 67 74 68 28 s]", clipLength(
2130: 7a 53 71 6c 29 2c 20 7a 53 71 6c 29 3b 0a 7d 0a zSql), zSql);.}.
2140: 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 65 72 72 6f 72 ./*.** SQL error
2150: 20 6c 6f 67 20 63 61 6c 6c 62 61 63 6b 0a 2a 2f log callback.*/
2160: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71 6c .static void sql
2170: 45 72 72 6f 72 43 61 6c 6c 62 61 63 6b 28 76 6f ErrorCallback(vo
2180: 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 69 45 id *pArg, int iE
2190: 72 72 43 6f 64 65 2c 20 63 6f 6e 73 74 20 63 68 rrCode, const ch
21a0: 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 55 4e 55 ar *zMsg){. UNU
21b0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 41 SED_PARAMETER(pA
21c0: 72 67 29 3b 0a 20 20 69 66 28 20 69 45 72 72 43 rg);. if( iErrC
21d0: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f ode==SQLITE_ERRO
21e0: 52 20 26 26 20 67 2e 62 49 67 6e 6f 72 65 53 71 R && g.bIgnoreSq
21f0: 6c 45 72 72 6f 72 73 20 29 20 72 65 74 75 72 6e lErrors ) return
2200: 3b 0a 20 20 69 66 28 20 28 69 45 72 72 43 6f 64 ;. if( (iErrCod
2210: 65 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f e&0xff)==SQLITE_
2220: 53 43 48 45 4d 41 20 26 26 20 67 2e 69 54 72 61 SCHEMA && g.iTra
2230: 63 65 3c 33 20 29 20 72 65 74 75 72 6e 3b 0a 20 ce<3 ) return;.
2240: 20 69 66 28 20 67 2e 69 54 69 6d 65 6f 75 74 3d if( g.iTimeout=
2250: 3d 30 20 26 26 20 28 69 45 72 72 43 6f 64 65 26 =0 && (iErrCode&
2260: 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 42 55 0xff)==SQLITE_BU
2270: 53 59 20 26 26 20 67 2e 69 54 72 61 63 65 3c 33 SY && g.iTrace<3
2280: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 ) return;. if(
2290: 20 28 69 45 72 72 43 6f 64 65 26 30 78 66 66 29 (iErrCode&0xff)
22a0: 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 20 ==SQLITE_NOTICE
22b0: 29 7b 0a 20 20 20 20 6c 6f 67 4d 65 73 73 61 67 ){. logMessag
22c0: 65 28 22 28 69 6e 66 6f 29 20 25 73 22 2c 20 7a e("(info) %s", z
22d0: 4d 73 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 Msg);. }else{.
22e0: 20 20 20 65 72 72 6f 72 4d 65 73 73 61 67 65 28 errorMessage(
22f0: 22 28 65 72 72 63 6f 64 65 3d 25 64 29 20 25 73 "(errcode=%d) %s
2300: 22 2c 20 69 45 72 72 43 6f 64 65 2c 20 7a 4d 73 ", iErrCode, zMs
2310: 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a g);. }.}../*.**
2320: 20 50 72 65 70 61 72 65 20 61 6e 20 53 51 4c 20 Prepare an SQL
2330: 73 74 61 74 65 6d 65 6e 74 2e 20 20 49 73 73 75 statement. Issu
2340: 65 20 61 20 66 61 74 61 6c 20 65 72 72 6f 72 20 e a fatal error
2350: 69 66 20 75 6e 61 62 6c 65 2e 0a 2a 2f 0a 73 74 if unable..*/.st
2360: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 74 6d atic sqlite3_stm
2370: 74 20 2a 70 72 65 70 61 72 65 53 71 6c 28 63 6f t *prepareSql(co
2380: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 nst char *zForma
2390: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 t, ...){. va_li
23a0: 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a st ap;. char *z
23b0: 53 71 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 Sql;. int rc;.
23c0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 sqlite3_stmt *p
23d0: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 76 61 5f 73 Stmt = 0;. va_s
23e0: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 tart(ap, zFormat
23f0: 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 );. zSql = sqli
2400: 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f te3_vmprintf(zFo
2410: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f rmat, ap);. va_
2420: 65 6e 64 28 61 70 29 3b 0a 20 20 72 63 20 3d 20 end(ap);. rc =
2430: 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f sqlite3_prepare_
2440: 76 32 28 67 2e 64 62 2c 20 7a 53 71 6c 2c 20 2d v2(g.db, zSql, -
2450: 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 1, &pStmt, 0);.
2460: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f if( rc!=SQLITE_
2470: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 OK ){. sqlite
2480: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 3_finalize(pStmt
2490: 29 3b 0a 20 20 20 20 66 61 74 61 6c 45 72 72 6f );. fatalErro
24a0: 72 28 22 25 73 5c 6e 25 73 5c 6e 22 2c 20 73 71 r("%s\n%s\n", sq
24b0: 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 67 2e 64 lite3_errmsg(g.d
24c0: 62 29 2c 20 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20 b), zSql);. }.
24d0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 sqlite3_free(zS
24e0: 71 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 53 ql);. return pS
24f0: 74 6d 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 tmt;.}../*.** Ru
2500: 6e 20 61 72 62 69 74 72 61 72 79 20 53 51 4c 2e n arbitrary SQL.
2510: 20 20 49 73 73 75 65 20 61 20 66 61 74 61 6c 20 Issue a fatal
2520: 65 72 72 6f 72 20 6f 6e 20 66 61 69 6c 75 72 65 error on failure
2530: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 ..*/.static void
2540: 20 72 75 6e 53 71 6c 28 63 6f 6e 73 74 20 63 68 runSql(const ch
2550: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e ar *zFormat, ...
2560: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b ){. va_list ap;
2570: 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 . char *zSql;.
2580: 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 int rc;. va_st
2590: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 art(ap, zFormat)
25a0: 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 ;. zSql = sqlit
25b0: 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 e3_vmprintf(zFor
25c0: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 mat, ap);. va_e
25d0: 6e 64 28 61 70 29 3b 0a 20 20 72 63 20 3d 20 73 nd(ap);. rc = s
25e0: 71 6c 69 74 65 33 5f 65 78 65 63 28 67 2e 64 62 qlite3_exec(g.db
25f0: 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29 , zSql, 0, 0, 0)
2600: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 ;. if( rc!=SQLI
2610: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 66 61 74 TE_OK ){. fat
2620: 61 6c 45 72 72 6f 72 28 22 25 73 5c 6e 25 73 5c alError("%s\n%s\
2630: 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d n", sqlite3_errm
2640: 73 67 28 67 2e 64 62 29 2c 20 7a 53 71 6c 29 3b sg(g.db), zSql);
2650: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 . }. sqlite3_f
2660: 72 65 65 28 7a 53 71 6c 29 3b 0a 7d 0a 0a 2f 2a ree(zSql);.}../*
2670: 0a 2a 2a 20 54 72 79 20 74 6f 20 72 75 6e 20 61 .** Try to run a
2680: 72 62 69 74 72 61 72 79 20 53 51 4c 2e 20 20 52 rbitrary SQL. R
2690: 65 74 75 72 6e 20 73 75 63 63 65 73 73 20 63 6f eturn success co
26a0: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e de..*/.static in
26b0: 74 20 74 72 79 53 71 6c 28 63 6f 6e 73 74 20 63 t trySql(const c
26c0: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e har *zFormat, ..
26d0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 .){. va_list ap
26e0: 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a ;. char *zSql;.
26f0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 int rc;. va_s
2700: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 tart(ap, zFormat
2710: 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 );. zSql = sqli
2720: 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f te3_vmprintf(zFo
2730: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f rmat, ap);. va_
2740: 65 6e 64 28 61 70 29 3b 0a 20 20 72 63 20 3d 20 end(ap);. rc =
2750: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 67 2e 64 sqlite3_exec(g.d
2760: 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30 b, zSql, 0, 0, 0
2770: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 );. sqlite3_fre
2780: 65 28 7a 53 71 6c 29 3b 0a 20 20 72 65 74 75 72 e(zSql);. retur
2790: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 53 74 72 75 n rc;.}../* Stru
27a0: 63 74 75 72 65 20 66 6f 72 20 68 6f 6c 64 69 6e cture for holdin
27b0: 67 20 61 6e 20 61 72 62 69 74 72 61 72 79 20 6c g an arbitrary l
27c0: 65 6e 67 74 68 20 73 74 72 69 6e 67 0a 2a 2f 0a ength string.*/.
27d0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53 typedef struct S
27e0: 74 72 69 6e 67 20 53 74 72 69 6e 67 3b 0a 73 74 tring String;.st
27f0: 72 75 63 74 20 53 74 72 69 6e 67 20 7b 0a 20 20 ruct String {.
2800: 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 char *z;
2810: 20 2f 2a 20 74 68 65 20 73 74 72 69 6e 67 20 2a /* the string *
2820: 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 /. int n;
2830: 20 20 20 20 20 2f 2a 20 53 6c 6f 74 73 20 6f 66 /* Slots of
2840: 20 7a 5b 5d 20 75 73 65 64 20 2a 2f 0a 20 20 69 z[] used */. i
2850: 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 nt nAlloc;
2860: 2f 2a 20 53 6c 6f 74 73 20 6f 66 20 7a 5b 5d 20 /* Slots of z[]
2870: 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 7d 3b 0a allocated */.};.
2880: 0a 2f 2a 20 46 72 65 65 20 61 20 73 74 72 69 6e ./* Free a strin
2890: 67 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 g */.static void
28a0: 20 73 74 72 69 6e 67 46 72 65 65 28 53 74 72 69 stringFree(Stri
28b0: 6e 67 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d ng *p){. if( p-
28c0: 3e 7a 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 >z ) sqlite3_fre
28d0: 65 28 70 2d 3e 7a 29 3b 0a 20 20 6d 65 6d 73 65 e(p->z);. memse
28e0: 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a t(p, 0, sizeof(*
28f0: 70 29 29 3b 0a 7d 0a 0a 2f 2a 20 41 70 70 65 6e p));.}../* Appen
2900: 64 20 6e 20 62 79 74 65 73 20 6f 66 20 74 65 78 d n bytes of tex
2910: 74 20 74 6f 20 61 20 73 74 72 69 6e 67 2e 20 20 t to a string.
2920: 49 66 20 6e 3c 30 20 61 70 70 65 6e 64 20 74 68 If n<0 append th
2930: 65 20 65 6e 74 69 72 65 20 73 74 72 69 6e 67 2e e entire string.
2940: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 */.static void
2950: 73 74 72 69 6e 67 41 70 70 65 6e 64 28 53 74 72 stringAppend(Str
2960: 69 6e 67 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 ing *p, const ch
2970: 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 ar *z, int n){.
2980: 20 69 66 28 20 6e 3c 30 20 29 20 6e 20 3d 20 28 if( n<0 ) n = (
2990: 69 6e 74 29 73 74 72 6c 65 6e 28 7a 29 3b 0a 20 int)strlen(z);.
29a0: 20 69 66 28 20 70 2d 3e 6e 2b 6e 3e 3d 70 2d 3e if( p->n+n>=p->
29b0: 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 69 6e nAlloc ){. in
29c0: 74 20 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 t nAlloc = p->nA
29d0: 6c 6c 6f 63 2a 32 20 2b 20 6e 20 2b 20 31 30 30 lloc*2 + n + 100
29e0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 ;. char *zNew
29f0: 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c = sqlite3_reall
2a00: 6f 63 28 70 2d 3e 7a 2c 20 6e 41 6c 6c 6f 63 29 oc(p->z, nAlloc)
2a10: 3b 0a 20 20 20 20 69 66 28 20 7a 4e 65 77 3d 3d ;. if( zNew==
2a20: 30 20 29 20 66 61 74 61 6c 45 72 72 6f 72 28 22 0 ) fatalError("
2a30: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 29 3b out of memory");
2a40: 0a 20 20 20 20 70 2d 3e 7a 20 3d 20 7a 4e 65 77 . p->z = zNew
2a50: 3b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 ;. p->nAlloc
2a60: 3d 20 6e 41 6c 6c 6f 63 3b 0a 20 20 7d 0a 20 20 = nAlloc;. }.
2a70: 6d 65 6d 63 70 79 28 70 2d 3e 7a 2b 70 2d 3e 6e memcpy(p->z+p->n
2a80: 2c 20 7a 2c 20 6e 29 3b 0a 20 20 70 2d 3e 6e 20 , z, n);. p->n
2a90: 2b 3d 20 6e 3b 0a 20 20 70 2d 3e 7a 5b 70 2d 3e += n;. p->z[p->
2aa0: 6e 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 52 65 n] = 0;.}../* Re
2ab0: 73 65 74 20 61 20 73 74 72 69 6e 67 20 74 6f 20 set a string to
2ac0: 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 an empty string
2ad0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 */.static void s
2ae0: 74 72 69 6e 67 52 65 73 65 74 28 53 74 72 69 6e tringReset(Strin
2af0: 67 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e g *p){. if( p->
2b00: 7a 3d 3d 30 20 29 20 73 74 72 69 6e 67 41 70 70 z==0 ) stringApp
2b10: 65 6e 64 28 70 2c 20 22 20 22 2c 20 31 29 3b 0a end(p, " ", 1);.
2b20: 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 70 2d p->n = 0;. p-
2b30: 3e 7a 5b 30 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a >z[0] = 0;.}../*
2b40: 20 41 70 70 65 6e 64 20 61 20 6e 65 77 20 74 6f Append a new to
2b50: 6b 65 6e 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 ken onto the end
2b60: 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 20 2a of the string *
2b70: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 74 /.static void st
2b80: 72 69 6e 67 41 70 70 65 6e 64 54 65 72 6d 28 53 ringAppendTerm(S
2b90: 74 72 69 6e 67 20 2a 70 2c 20 63 6f 6e 73 74 20 tring *p, const
2ba0: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 char *z){. int
2bb0: 69 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 20 29 20 i;. if( p->n )
2bc0: 73 74 72 69 6e 67 41 70 70 65 6e 64 28 70 2c 20 stringAppend(p,
2bd0: 22 20 22 2c 20 31 29 3b 0a 20 20 69 66 28 20 7a " ", 1);. if( z
2be0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 69 6e ==0 ){. strin
2bf0: 67 41 70 70 65 6e 64 28 70 2c 20 22 6e 69 6c 22 gAppend(p, "nil"
2c00: 2c 20 33 29 3b 0a 20 20 20 20 72 65 74 75 72 6e , 3);. return
2c10: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b ;. }. for(i=0;
2c20: 20 7a 5b 69 5d 20 26 26 20 21 49 53 53 50 41 43 z[i] && !ISSPAC
2c30: 45 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a E(z[i]); i++){}.
2c40: 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a 5b 69 if( i>0 && z[i
2c50: 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 69 ]==0 ){. stri
2c60: 6e 67 41 70 70 65 6e 64 28 70 2c 20 7a 2c 20 69 ngAppend(p, z, i
2c70: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 );. return;.
2c80: 20 7d 0a 20 20 73 74 72 69 6e 67 41 70 70 65 6e }. stringAppen
2c90: 64 28 70 2c 20 22 27 22 2c 20 31 29 3b 0a 20 20 d(p, "'", 1);.
2ca0: 77 68 69 6c 65 28 20 7a 5b 30 5d 20 29 7b 0a 20 while( z[0] ){.
2cb0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d for(i=0; z[i]
2cc0: 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 27 27 3b 20 && z[i]!='\'';
2cd0: 69 2b 2b 29 7b 7d 0a 20 20 20 20 69 66 28 20 7a i++){}. if( z
2ce0: 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 73 74 72 [i] ){. str
2cf0: 69 6e 67 41 70 70 65 6e 64 28 70 2c 20 7a 2c 20 ingAppend(p, z,
2d00: 69 2b 31 29 3b 0a 20 20 20 20 20 20 73 74 72 69 i+1);. stri
2d10: 6e 67 41 70 70 65 6e 64 28 70 2c 20 22 27 22 2c ngAppend(p, "'",
2d20: 20 31 29 3b 0a 20 20 20 20 20 20 7a 20 2b 3d 20 1);. z +=
2d30: 69 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a i+1;. }else{.
2d40: 20 20 20 20 20 20 73 74 72 69 6e 67 41 70 70 65 stringAppe
2d50: 6e 64 28 70 2c 20 7a 2c 20 69 29 3b 0a 20 20 20 nd(p, z, i);.
2d60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a break;. }.
2d70: 20 20 7d 0a 20 20 73 74 72 69 6e 67 41 70 70 65 }. stringAppe
2d80: 6e 64 28 70 2c 20 22 27 22 2c 20 31 29 3b 0a 7d nd(p, "'", 1);.}
2d90: 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 62 61 63 6b ../*.** Callback
2da0: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 65 76 function for ev
2db0: 61 6c 53 71 6c 28 29 0a 2a 2f 0a 73 74 61 74 69 alSql().*/.stati
2dc0: 63 20 69 6e 74 20 65 76 61 6c 43 61 6c 6c 62 61 c int evalCallba
2dd0: 63 6b 28 76 6f 69 64 20 2a 70 43 44 61 74 61 2c ck(void *pCData,
2de0: 20 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 int argc, char
2df0: 2a 2a 61 72 67 76 2c 20 63 68 61 72 20 2a 2a 61 **argv, char **a
2e00: 7a 43 6f 6c 29 7b 0a 20 20 53 74 72 69 6e 67 20 zCol){. String
2e10: 2a 70 20 3d 20 28 53 74 72 69 6e 67 2a 29 70 43 *p = (String*)pC
2e20: 44 61 74 61 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 Data;. int i;.
2e30: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 UNUSED_PARAMETE
2e40: 52 28 61 7a 43 6f 6c 29 3b 0a 20 20 66 6f 72 28 R(azCol);. for(
2e50: 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b i=0; i<argc; i++
2e60: 29 20 73 74 72 69 6e 67 41 70 70 65 6e 64 54 65 ) stringAppendTe
2e70: 72 6d 28 70 2c 20 61 72 67 76 5b 69 5d 29 3b 0a rm(p, argv[i]);.
2e80: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f return 0;.}../
2e90: 2a 0a 2a 2a 20 52 75 6e 20 61 72 62 69 74 72 61 *.** Run arbitra
2ea0: 72 79 20 53 51 4c 20 61 6e 64 20 72 65 63 6f 72 ry SQL and recor
2eb0: 64 20 74 68 65 20 72 65 73 75 6c 74 73 20 69 6e d the results in
2ec0: 20 61 6e 20 6f 75 74 70 75 74 20 73 74 72 69 6e an output strin
2ed0: 67 0a 2a 2a 20 67 69 76 65 6e 20 62 79 20 74 68 g.** given by th
2ee0: 65 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 e first paramete
2ef0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 r..*/.static int
2f00: 20 65 76 61 6c 53 71 6c 28 53 74 72 69 6e 67 20 evalSql(String
2f10: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a *p, const char *
2f20: 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 zFormat, ...){.
2f30: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 va_list ap;. c
2f40: 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 har *zSql;. int
2f50: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 rc;. char *zEr
2f60: 72 4d 73 67 20 3d 20 30 3b 0a 20 20 76 61 5f 73 rMsg = 0;. va_s
2f70: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 tart(ap, zFormat
2f80: 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 );. zSql = sqli
2f90: 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f te3_vmprintf(zFo
2fa0: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f rmat, ap);. va_
2fb0: 65 6e 64 28 61 70 29 3b 0a 20 20 61 73 73 65 72 end(ap);. asser
2fc0: 74 28 20 67 2e 69 54 69 6d 65 6f 75 74 3e 30 20 t( g.iTimeout>0
2fd0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 );. rc = sqlite
2fe0: 33 5f 65 78 65 63 28 67 2e 64 62 2c 20 7a 53 71 3_exec(g.db, zSq
2ff0: 6c 2c 20 65 76 61 6c 43 61 6c 6c 62 61 63 6b 2c l, evalCallback,
3000: 20 70 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 p, &zErrMsg);.
3010: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 sqlite3_free(zS
3020: 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b ql);. if( rc ){
3030: 0a 20 20 20 20 63 68 61 72 20 7a 45 72 72 5b 33 . char zErr[3
3040: 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 0];. sqlite3_
3050: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 snprintf(sizeof(
3060: 7a 45 72 72 29 2c 20 7a 45 72 72 2c 20 22 65 72 zErr), zErr, "er
3070: 72 6f 72 28 25 64 29 22 2c 20 72 63 29 3b 0a 20 ror(%d)", rc);.
3080: 20 20 20 73 74 72 69 6e 67 41 70 70 65 6e 64 54 stringAppendT
3090: 65 72 6d 28 70 2c 20 7a 45 72 72 29 3b 0a 20 20 erm(p, zErr);.
30a0: 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b if( zErrMsg ){
30b0: 0a 20 20 20 20 20 20 73 74 72 69 6e 67 41 70 70 . stringApp
30c0: 65 6e 64 54 65 72 6d 28 70 2c 20 7a 45 72 72 4d endTerm(p, zErrM
30d0: 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 sg);. sqlit
30e0: 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 e3_free(zErrMsg)
30f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 ;. }. }. re
3100: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a turn rc;.}../*.*
3110: 2a 20 41 75 78 69 6c 69 61 72 79 20 53 51 4c 20 * Auxiliary SQL
3120: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 72 65 63 75 function to recu
3130: 72 73 69 76 65 6c 79 20 65 76 61 6c 75 61 74 65 rsively evaluate
3140: 20 53 51 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 SQL..*/.static
3150: 76 6f 69 64 20 65 76 61 6c 46 75 6e 63 28 0a 20 void evalFunc(.
3160: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 sqlite3_context
3170: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 *context,. int
3180: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 argc,. sqlite3
3190: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b _value **argv.){
31a0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d . sqlite3 *db =
31b0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 sqlite3_context
31c0: 5f 64 62 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 _db_handle(conte
31d0: 78 74 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 xt);. const cha
31e0: 72 20 2a 7a 53 71 6c 20 3d 20 28 63 6f 6e 73 74 r *zSql = (const
31f0: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 char*)sqlite3_v
3200: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 alue_text(argv[0
3210: 5d 29 3b 0a 20 20 53 74 72 69 6e 67 20 72 65 73 ]);. String res
3220: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 ;. char *zErrMs
3230: 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b g = 0;. int rc;
3240: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 . UNUSED_PARAME
3250: 54 45 52 28 61 72 67 63 29 3b 0a 20 20 6d 65 6d TER(argc);. mem
3260: 73 65 74 28 26 72 65 73 2c 20 30 2c 20 73 69 7a set(&res, 0, siz
3270: 65 6f 66 28 72 65 73 29 29 3b 0a 20 20 72 63 20 eof(res));. rc
3280: 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 = sqlite3_exec(d
3290: 62 2c 20 7a 53 71 6c 2c 20 65 76 61 6c 43 61 6c b, zSql, evalCal
32a0: 6c 62 61 63 6b 2c 20 26 72 65 73 2c 20 26 7a 45 lback, &res, &zE
32b0: 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 7a 45 rrMsg);. if( zE
32c0: 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 73 71 6c rrMsg ){. sql
32d0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f ite3_result_erro
32e0: 72 28 63 6f 6e 74 65 78 74 2c 20 7a 45 72 72 4d r(context, zErrM
32f0: 73 67 2c 20 2d 31 29 3b 0a 20 20 20 20 73 71 6c sg, -1);. sql
3300: 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 ite3_free(zErrMs
3310: 67 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 g);. }else if(
3320: 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 rc ){. sqlite
3330: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 63 3_result_error_c
3340: 6f 64 65 28 63 6f 6e 74 65 78 74 2c 20 72 63 29 ode(context, rc)
3350: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 ;. }else{. s
3360: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 qlite3_result_te
3370: 78 74 28 63 6f 6e 74 65 78 74 2c 20 72 65 73 2e xt(context, res.
3380: 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 z, -1, SQLITE_TR
3390: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 20 20 ANSIENT);. }.
33a0: 73 74 72 69 6e 67 46 72 65 65 28 26 72 65 73 29 stringFree(&res)
33b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 6f 6b 20 ;.}../*.** Look
33c0: 75 70 20 74 68 65 20 6e 65 78 74 20 74 61 73 6b up the next task
33d0: 20 66 6f 72 20 63 6c 69 65 6e 74 20 69 43 6c 69 for client iCli
33e0: 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62 ent in the datab
33f0: 61 73 65 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 ase..** Return t
3400: 68 65 20 74 61 73 6b 20 73 63 72 69 70 74 20 61 he task script a
3410: 6e 64 20 74 68 65 20 74 61 73 6b 20 6e 75 6d 62 nd the task numb
3420: 65 72 20 61 6e 64 20 6d 61 72 6b 20 74 68 61 74 er and mark that
3430: 0a 2a 2a 20 74 61 73 6b 20 61 73 20 62 65 69 6e .** task as bein
3440: 67 20 75 6e 64 65 72 20 77 61 79 2e 0a 2a 2f 0a g under way..*/.
3450: 73 74 61 74 69 63 20 69 6e 74 20 73 74 61 72 74 static int start
3460: 53 63 72 69 70 74 28 0a 20 20 69 6e 74 20 69 43 Script(. int iC
3470: 6c 69 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20 lient,
3480: 20 20 20 20 2f 2a 20 54 68 65 20 63 6c 69 65 6e /* The clien
3490: 74 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 63 68 t number */. ch
34a0: 61 72 20 2a 2a 70 7a 53 63 72 69 70 74 2c 20 20 ar **pzScript,
34b0: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 /* Write
34c0: 20 74 61 73 6b 20 73 63 72 69 70 74 20 68 65 72 task script her
34d0: 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 54 61 73 e */. int *pTas
34e0: 6b 49 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 kId,
34f0: 20 2f 2a 20 57 72 69 74 65 20 74 61 73 6b 20 6e /* Write task n
3500: 75 6d 62 65 72 20 68 65 72 65 20 2a 2f 0a 20 20 umber here */.
3510: 63 68 61 72 20 2a 2a 70 7a 54 61 73 6b 4e 61 6d char **pzTaskNam
3520: 65 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d e /* Nam
3530: 65 20 6f 66 20 74 68 65 20 74 61 73 6b 20 2a 2f e of the task */
3540: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 .){. sqlite3_st
3550: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 mt *pStmt = 0;.
3560: 20 69 6e 74 20 74 61 73 6b 49 64 3b 0a 20 20 69 int taskId;. i
3570: 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 74 6f 74 nt rc;. int tot
3580: 61 6c 54 69 6d 65 20 3d 20 30 3b 0a 0a 20 20 2a alTime = 0;.. *
3590: 70 7a 53 63 72 69 70 74 20 3d 20 30 3b 0a 20 20 pzScript = 0;.
35a0: 67 2e 69 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a g.iTimeout = 0;.
35b0: 20 20 77 68 69 6c 65 28 31 29 7b 0a 20 20 20 20 while(1){.
35c0: 72 63 20 3d 20 74 72 79 53 71 6c 28 22 42 45 47 rc = trySql("BEG
35d0: 49 4e 20 49 4d 4d 45 44 49 41 54 45 22 29 3b 0a IN IMMEDIATE");.
35e0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 if( rc==SQLI
35f0: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 TE_BUSY ){.
3600: 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 31 sqlite3_sleep(1
3610: 30 29 3b 0a 20 20 20 20 20 20 74 6f 74 61 6c 54 0);. totalT
3620: 69 6d 65 20 2b 3d 20 31 30 3b 0a 20 20 20 20 20 ime += 10;.
3630: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d continue;. }
3640: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c . if( rc!=SQL
3650: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 ITE_OK ){.
3660: 66 61 74 61 6c 45 72 72 6f 72 28 22 69 6e 20 73 fatalError("in s
3670: 74 61 72 74 53 63 72 69 70 74 3a 20 25 73 22 2c tartScript: %s",
3680: 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 sqlite3_errmsg(
3690: 67 2e 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20 g.db));. }.
36a0: 20 20 69 66 28 20 67 2e 6e 45 72 72 6f 72 20 7c if( g.nError |
36b0: 7c 20 67 2e 6e 54 65 73 74 20 29 7b 0a 20 20 20 | g.nTest ){.
36c0: 20 20 20 72 75 6e 53 71 6c 28 22 55 50 44 41 54 runSql("UPDAT
36d0: 45 20 63 6f 75 6e 74 65 72 73 20 53 45 54 20 6e E counters SET n
36e0: 45 72 72 6f 72 3d 6e 45 72 72 6f 72 2b 25 64 2c Error=nError+%d,
36f0: 20 6e 54 65 73 74 3d 6e 54 65 73 74 2b 25 64 22 nTest=nTest+%d"
3700: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 67 ,. g
3710: 2e 6e 45 72 72 6f 72 2c 20 67 2e 6e 54 65 73 74 .nError, g.nTest
3720: 29 3b 0a 20 20 20 20 20 20 67 2e 6e 45 72 72 6f );. g.nErro
3730: 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 2e 6e r = 0;. g.n
3740: 54 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a Test = 0;. }.
3750: 20 20 20 20 70 53 74 6d 74 20 3d 20 70 72 65 70 pStmt = prep
3760: 61 72 65 53 71 6c 28 22 53 45 4c 45 43 54 20 31 areSql("SELECT 1
3770: 20 46 52 4f 4d 20 63 6c 69 65 6e 74 20 57 48 45 FROM client WHE
3780: 52 45 20 69 64 3d 25 64 20 41 4e 44 20 77 61 6e RE id=%d AND wan
3790: 74 48 61 6c 74 22 2c 69 43 6c 69 65 6e 74 29 3b tHalt",iClient);
37a0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 . rc = sqlite
37b0: 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 3_step(pStmt);.
37c0: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c sqlite3_final
37d0: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 ize(pStmt);.
37e0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 if( rc==SQLITE_R
37f0: 4f 57 20 29 7b 0a 20 20 20 20 20 20 72 75 6e 53 OW ){. runS
3800: 71 6c 28 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 ql("DELETE FROM
3810: 63 6c 69 65 6e 74 20 57 48 45 52 45 20 69 64 3d client WHERE id=
3820: 25 64 22 2c 20 69 43 6c 69 65 6e 74 29 3b 0a 20 %d", iClient);.
3830: 20 20 20 20 20 67 2e 69 54 69 6d 65 6f 75 74 20 g.iTimeout
3840: 3d 20 44 45 46 41 55 4c 54 5f 54 49 4d 45 4f 55 = DEFAULT_TIMEOU
3850: 54 3b 0a 20 20 20 20 20 20 72 75 6e 53 71 6c 28 T;. runSql(
3860: 22 43 4f 4d 4d 49 54 20 54 52 41 4e 53 41 43 54 "COMMIT TRANSACT
3870: 49 4f 4e 3b 22 29 3b 0a 20 20 20 20 20 20 72 65 ION;");. re
3880: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 turn SQLITE_DONE
3890: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 74 6d ;. }. pStm
38a0: 74 20 3d 20 70 72 65 70 61 72 65 53 71 6c 28 0a t = prepareSql(.
38b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53 "S
38c0: 45 4c 45 43 54 20 73 63 72 69 70 74 2c 20 69 64 ELECT script, id
38d0: 2c 20 6e 61 6d 65 20 46 52 4f 4d 20 74 61 73 6b , name FROM task
38e0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ".
38f0: 22 20 57 48 45 52 45 20 63 6c 69 65 6e 74 3d 25 " WHERE client=%
3900: 64 20 41 4e 44 20 73 74 61 72 74 74 69 6d 65 20 d AND starttime
3910: 49 53 20 4e 55 4c 4c 22 0a 20 20 20 20 20 20 20 IS NULL".
3920: 20 20 20 20 20 20 20 22 20 4f 52 44 45 52 20 42 " ORDER B
3930: 59 20 69 64 20 4c 49 4d 49 54 20 31 22 2c 20 69 Y id LIMIT 1", i
3940: 43 6c 69 65 6e 74 29 3b 0a 20 20 20 20 72 63 20 Client);. rc
3950: 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 = sqlite3_step(p
3960: 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 72 Stmt);. if( r
3970: 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b c==SQLITE_ROW ){
3980: 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 . int n = s
3990: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 qlite3_column_by
39a0: 74 65 73 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 tes(pStmt, 0);.
39b0: 20 20 20 20 20 2a 70 7a 53 63 72 69 70 74 20 3d *pzScript =
39c0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 sqlite3_malloc(
39d0: 6e 2b 31 29 3b 0a 20 20 20 20 20 20 73 74 72 63 n+1);. strc
39e0: 70 79 28 2a 70 7a 53 63 72 69 70 74 2c 20 28 63 py(*pzScript, (c
39f0: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 onst char*)sqlit
3a00: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 e3_column_text(p
3a10: 53 74 6d 74 2c 20 30 29 29 3b 0a 20 20 20 20 20 Stmt, 0));.
3a20: 20 2a 70 54 61 73 6b 49 64 20 3d 20 74 61 73 6b *pTaskId = task
3a30: 49 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c Id = sqlite3_col
3a40: 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 umn_int(pStmt, 1
3a50: 29 3b 0a 20 20 20 20 20 20 2a 70 7a 54 61 73 6b );. *pzTask
3a60: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d Name = sqlite3_m
3a70: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 73 71 6c printf("%s", sql
3a80: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 ite3_column_text
3a90: 28 70 53 74 6d 74 2c 20 32 29 29 3b 0a 20 20 20 (pStmt, 2));.
3aa0: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c sqlite3_final
3ab0: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 ize(pStmt);.
3ac0: 20 20 72 75 6e 53 71 6c 28 22 55 50 44 41 54 45 runSql("UPDATE
3ad0: 20 74 61 73 6b 22 0a 20 20 20 20 20 20 20 20 20 task".
3ae0: 20 20 20 20 22 20 20 20 53 45 54 20 73 74 61 72 " SET star
3af0: 74 74 69 6d 65 3d 73 74 72 66 74 69 6d 65 28 27 ttime=strftime('
3b00: 25 25 59 2d 25 25 6d 2d 25 25 64 20 25 25 48 3a %%Y-%%m-%%d %%H:
3b10: 25 25 4d 3a 25 25 66 27 2c 27 6e 6f 77 27 29 22 %%M:%%f','now')"
3b20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 . "
3b30: 57 48 45 52 45 20 69 64 3d 25 64 3b 22 2c 20 74 WHERE id=%d;", t
3b40: 61 73 6b 49 64 29 3b 0a 20 20 20 20 20 20 67 2e askId);. g.
3b50: 69 54 69 6d 65 6f 75 74 20 3d 20 44 45 46 41 55 iTimeout = DEFAU
3b60: 4c 54 5f 54 49 4d 45 4f 55 54 3b 0a 20 20 20 20 LT_TIMEOUT;.
3b70: 20 20 72 75 6e 53 71 6c 28 22 43 4f 4d 4d 49 54 runSql("COMMIT
3b80: 20 54 52 41 4e 53 41 43 54 49 4f 4e 3b 22 29 3b TRANSACTION;");
3b90: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 . return SQ
3ba0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 LITE_OK;. }.
3bb0: 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c sqlite3_final
3bc0: 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 ize(pStmt);.
3bd0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 if( rc==SQLITE_D
3be0: 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28 ONE ){. if(
3bf0: 20 74 6f 74 61 6c 54 69 6d 65 3e 33 30 30 30 30 totalTime>30000
3c00: 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72 72 6f ){. erro
3c10: 72 4d 65 73 73 61 67 65 28 22 57 61 69 74 65 64 rMessage("Waited
3c20: 20 6f 76 65 72 20 33 30 20 73 65 63 6f 6e 64 73 over 30 seconds
3c30: 20 77 69 74 68 20 6e 6f 20 77 6f 72 6b 2e 20 20 with no work.
3c40: 47 69 76 69 6e 67 20 75 70 2e 22 29 3b 0a 20 20 Giving up.");.
3c50: 20 20 20 20 20 20 72 75 6e 53 71 6c 28 22 44 45 runSql("DE
3c60: 4c 45 54 45 20 46 52 4f 4d 20 63 6c 69 65 6e 74 LETE FROM client
3c70: 20 57 48 45 52 45 20 69 64 3d 25 64 3b 20 43 4f WHERE id=%d; CO
3c80: 4d 4d 49 54 3b 22 2c 20 69 43 6c 69 65 6e 74 29 MMIT;", iClient)
3c90: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 ;. sqlite
3ca0: 33 5f 63 6c 6f 73 65 28 67 2e 64 62 29 3b 0a 20 3_close(g.db);.
3cb0: 20 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a exit(1);.
3cc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 }. wh
3cd0: 69 6c 65 28 20 74 72 79 53 71 6c 28 22 43 4f 4d ile( trySql("COM
3ce0: 4d 49 54 22 29 3d 3d 53 51 4c 49 54 45 5f 42 55 MIT")==SQLITE_BU
3cf0: 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 SY ){. sq
3d00: 6c 69 74 65 33 5f 73 6c 65 65 70 28 31 30 29 3b lite3_sleep(10);
3d10: 0a 20 20 20 20 20 20 20 20 74 6f 74 61 6c 54 69 . totalTi
3d20: 6d 65 20 2b 3d 20 31 30 3b 0a 20 20 20 20 20 20 me += 10;.
3d30: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f }. sqlite3_
3d40: 73 6c 65 65 70 28 31 30 30 29 3b 0a 20 20 20 20 sleep(100);.
3d50: 20 20 74 6f 74 61 6c 54 69 6d 65 20 2b 3d 20 31 totalTime += 1
3d60: 30 30 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 00;. contin
3d70: 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 61 ue;. }. fa
3d80: 74 61 6c 45 72 72 6f 72 28 22 25 73 22 2c 20 73 talError("%s", s
3d90: 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 67 2e qlite3_errmsg(g.
3da0: 64 62 29 29 3b 0a 20 20 7d 0a 20 20 67 2e 69 54 db));. }. g.iT
3db0: 69 6d 65 6f 75 74 20 3d 20 44 45 46 41 55 4c 54 imeout = DEFAULT
3dc0: 5f 54 49 4d 45 4f 55 54 3b 0a 7d 0a 0a 2f 2a 0a _TIMEOUT;.}../*.
3dd0: 2a 2a 20 4d 61 72 6b 20 61 20 73 63 72 69 70 74 ** Mark a script
3de0: 20 61 73 20 68 61 76 69 6e 67 20 66 69 6e 69 73 as having finis
3df0: 68 65 64 2e 20 20 20 52 65 6d 6f 76 65 20 74 68 hed. Remove th
3e00: 65 20 43 4c 49 45 4e 54 20 74 61 62 6c 65 20 65 e CLIENT table e
3e10: 6e 74 72 79 0a 2a 2a 20 69 66 20 62 53 68 75 74 ntry.** if bShut
3e20: 64 6f 77 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2f down is true..*/
3e30: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 69 .static int fini
3e40: 73 68 53 63 72 69 70 74 28 69 6e 74 20 69 43 6c shScript(int iCl
3e50: 69 65 6e 74 2c 20 69 6e 74 20 74 61 73 6b 49 64 ient, int taskId
3e60: 2c 20 69 6e 74 20 62 53 68 75 74 64 6f 77 6e 29 , int bShutdown)
3e70: 7b 0a 20 20 72 75 6e 53 71 6c 28 22 55 50 44 41 {. runSql("UPDA
3e80: 54 45 20 74 61 73 6b 22 0a 20 20 20 20 20 20 20 TE task".
3e90: 20 20 22 20 20 20 53 45 54 20 65 6e 64 74 69 6d " SET endtim
3ea0: 65 3d 73 74 72 66 74 69 6d 65 28 27 25 25 59 2d e=strftime('%%Y-
3eb0: 25 25 6d 2d 25 25 64 20 25 25 48 3a 25 25 4d 3a %%m-%%d %%H:%%M:
3ec0: 25 25 66 27 2c 27 6e 6f 77 27 29 22 0a 20 20 20 %%f','now')".
3ed0: 20 20 20 20 20 20 22 20 57 48 45 52 45 20 69 64 " WHERE id
3ee0: 3d 25 64 3b 22 2c 20 74 61 73 6b 49 64 29 3b 0a =%d;", taskId);.
3ef0: 20 20 69 66 28 20 62 53 68 75 74 64 6f 77 6e 20 if( bShutdown
3f00: 29 7b 0a 20 20 20 20 72 75 6e 53 71 6c 28 22 44 ){. runSql("D
3f10: 45 4c 45 54 45 20 46 52 4f 4d 20 63 6c 69 65 6e ELETE FROM clien
3f20: 74 20 57 48 45 52 45 20 69 64 3d 25 64 22 2c 20 t WHERE id=%d",
3f30: 69 43 6c 69 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 iClient);. }.
3f40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b return SQLITE_OK
3f50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 ;.}../*.** Start
3f60: 20 75 70 20 61 20 63 6c 69 65 6e 74 20 70 72 6f up a client pro
3f70: 63 65 73 73 20 66 6f 72 20 69 43 6c 69 65 6e 74 cess for iClient
3f80: 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 , if it is not a
3f90: 6c 72 65 61 64 79 0a 2a 2a 20 72 75 6e 6e 69 6e lready.** runnin
3fa0: 67 2e 20 20 49 66 20 74 68 65 20 63 6c 69 65 6e g. If the clien
3fb0: 74 20 69 73 20 61 6c 72 65 61 64 79 20 72 75 6e t is already run
3fc0: 6e 69 6e 67 2c 20 74 68 65 6e 20 74 68 69 73 20 ning, then this
3fd0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 61 20 routine.** is a
3fe0: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 no-op..*/.static
3ff0: 20 76 6f 69 64 20 73 74 61 72 74 43 6c 69 65 6e void startClien
4000: 74 28 69 6e 74 20 69 43 6c 69 65 6e 74 29 7b 0a t(int iClient){.
4010: 20 20 72 75 6e 53 71 6c 28 22 49 4e 53 45 52 54 runSql("INSERT
4020: 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 OR IGNORE INTO
4030: 63 6c 69 65 6e 74 20 56 41 4c 55 45 53 28 25 64 client VALUES(%d
4040: 2c 30 29 22 2c 20 69 43 6c 69 65 6e 74 29 3b 0a ,0)", iClient);.
4050: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 68 if( sqlite3_ch
4060: 61 6e 67 65 73 28 67 2e 64 62 29 20 29 7b 0a 20 anges(g.db) ){.
4070: 20 20 20 63 68 61 72 20 2a 7a 53 79 73 3b 0a 20 char *zSys;.
4080: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 7a int rc;. z
4090: 53 79 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 Sys = sqlite3_mp
40a0: 72 69 6e 74 66 28 22 25 73 20 5c 22 25 73 5c 22 rintf("%s \"%s\"
40b0: 20 2d 2d 63 6c 69 65 6e 74 20 25 64 20 2d 2d 74 --client %d --t
40c0: 72 61 63 65 20 25 64 22 2c 0a 20 20 20 20 20 20 race %d",.
40d0: 20 20 20 20 20 20 20 20 20 20 20 67 2e 61 72 67 g.arg
40e0: 76 30 2c 20 67 2e 7a 44 62 46 69 6c 65 2c 20 69 v0, g.zDbFile, i
40f0: 43 6c 69 65 6e 74 2c 20 67 2e 69 54 72 61 63 65 Client, g.iTrace
4100: 29 3b 0a 20 20 20 20 69 66 28 20 67 2e 62 53 71 );. if( g.bSq
4110: 6c 54 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 lTrace ){.
4120: 7a 53 79 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d zSys = sqlite3_m
4130: 70 72 69 6e 74 66 28 22 25 7a 20 2d 2d 73 71 6c printf("%z --sql
4140: 74 72 61 63 65 22 2c 20 7a 53 79 73 29 3b 0a 20 trace", zSys);.
4150: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 67 2e 62 }. if( g.b
4160: 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 7a 53 Sync ){. zS
4170: 79 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 ys = sqlite3_mpr
4180: 69 6e 74 66 28 22 25 7a 20 2d 2d 73 79 6e 63 22 intf("%z --sync"
4190: 2c 20 7a 53 79 73 29 3b 0a 20 20 20 20 7d 0a 20 , zSys);. }.
41a0: 20 20 20 69 66 28 20 67 2e 7a 56 66 73 20 29 7b if( g.zVfs ){
41b0: 0a 20 20 20 20 20 20 7a 53 79 73 20 3d 20 73 71 . zSys = sq
41c0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 lite3_mprintf("%
41d0: 7a 20 2d 2d 76 66 73 20 5c 22 25 73 5c 22 22 2c z --vfs \"%s\"",
41e0: 20 7a 53 79 73 2c 20 67 2e 7a 56 66 73 29 3b 0a zSys, g.zVfs);.
41f0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 67 2e }. if( g.
4200: 69 54 72 61 63 65 3e 3d 32 20 29 20 6c 6f 67 4d iTrace>=2 ) logM
4210: 65 73 73 61 67 65 28 22 73 79 73 74 65 6d 28 27 essage("system('
4220: 25 71 27 29 22 2c 20 7a 53 79 73 29 3b 0a 23 69 %q')", zSys);.#i
4230: 66 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 f !defined(_WIN3
4240: 32 29 0a 20 20 20 20 7a 53 79 73 20 3d 20 73 71 2). zSys = sq
4250: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 lite3_mprintf("%
4260: 7a 20 26 22 2c 20 7a 53 79 73 29 3b 0a 20 20 20 z &", zSys);.
4270: 20 72 63 20 3d 20 73 79 73 74 65 6d 28 7a 53 79 rc = system(zSy
4280: 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 s);. if( rc )
4290: 20 65 72 72 6f 72 4d 65 73 73 61 67 65 28 22 73 errorMessage("s
42a0: 79 73 74 65 6d 28 29 20 66 61 69 6c 73 20 77 69 ystem() fails wi
42b0: 74 68 20 65 72 72 6f 72 20 63 6f 64 65 20 25 64 th error code %d
42c0: 22 2c 20 72 63 29 3b 0a 23 65 6c 73 65 0a 20 20 ", rc);.#else.
42d0: 20 20 7b 0a 20 20 20 20 20 20 53 54 41 52 54 55 {. STARTU
42e0: 50 49 4e 46 4f 41 20 73 74 61 72 74 75 70 49 6e PINFOA startupIn
42f0: 66 6f 3b 0a 20 20 20 20 20 20 50 52 4f 43 45 53 fo;. PROCES
4300: 53 5f 49 4e 46 4f 52 4d 41 54 49 4f 4e 20 70 72 S_INFORMATION pr
4310: 6f 63 65 73 73 49 6e 66 6f 3b 0a 20 20 20 20 20 ocessInfo;.
4320: 20 6d 65 6d 73 65 74 28 26 73 74 61 72 74 75 70 memset(&startup
4330: 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 Info, 0, sizeof(
4340: 73 74 61 72 74 75 70 49 6e 66 6f 29 29 3b 0a 20 startupInfo));.
4350: 20 20 20 20 20 73 74 61 72 74 75 70 49 6e 66 6f startupInfo
4360: 2e 63 62 20 3d 20 73 69 7a 65 6f 66 28 73 74 61 .cb = sizeof(sta
4370: 72 74 75 70 49 6e 66 6f 29 3b 0a 20 20 20 20 20 rtupInfo);.
4380: 20 6d 65 6d 73 65 74 28 26 70 72 6f 63 65 73 73 memset(&process
4390: 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 Info, 0, sizeof(
43a0: 70 72 6f 63 65 73 73 49 6e 66 6f 29 29 3b 0a 20 processInfo));.
43b0: 20 20 20 20 20 72 63 20 3d 20 43 72 65 61 74 65 rc = Create
43c0: 50 72 6f 63 65 73 73 41 28 4e 55 4c 4c 2c 20 7a ProcessA(NULL, z
43d0: 53 79 73 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c Sys, NULL, NULL,
43e0: 20 46 41 4c 53 45 2c 20 30 2c 20 4e 55 4c 4c 2c FALSE, 0, NULL,
43f0: 20 4e 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20 NULL,.
4400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 &
4410: 73 74 61 72 74 75 70 49 6e 66 6f 2c 20 26 70 72 startupInfo, &pr
4420: 6f 63 65 73 73 49 6e 66 6f 29 3b 0a 20 20 20 20 ocessInfo);.
4430: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 if( rc ){.
4440: 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 CloseHandle(
4450: 70 72 6f 63 65 73 73 49 6e 66 6f 2e 68 54 68 72 processInfo.hThr
4460: 65 61 64 29 3b 0a 20 20 20 20 20 20 20 20 43 6c ead);. Cl
4470: 6f 73 65 48 61 6e 64 6c 65 28 70 72 6f 63 65 73 oseHandle(proces
4480: 73 49 6e 66 6f 2e 68 50 72 6f 63 65 73 73 29 3b sInfo.hProcess);
4490: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 . }else{.
44a0: 20 20 20 20 20 20 65 72 72 6f 72 4d 65 73 73 61 errorMessa
44b0: 67 65 28 22 43 72 65 61 74 65 50 72 6f 63 65 73 ge("CreateProces
44c0: 73 41 28 29 20 66 61 69 6c 73 20 77 69 74 68 20 sA() fails with
44d0: 65 72 72 6f 72 20 63 6f 64 65 20 25 6c 75 22 2c error code %lu",
44e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
44f0: 20 20 20 20 20 20 47 65 74 4c 61 73 74 45 72 72 GetLastErr
4500: 6f 72 28 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 or());. }.
4510: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 }.#endif.
4520: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 79 sqlite3_free(zSy
4530: 73 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a s);. }.}../*.**
4540: 20 52 65 61 64 20 74 68 65 20 65 6e 74 69 72 65 Read the entire
4550: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 66 69 content of a fi
4560: 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a le into memory.*
4570: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 /.static char *r
4580: 65 61 64 46 69 6c 65 28 63 6f 6e 73 74 20 63 68 eadFile(const ch
4590: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b 0a ar *zFilename){.
45a0: 20 20 46 49 4c 45 20 2a 69 6e 20 3d 20 66 6f 70 FILE *in = fop
45b0: 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 72 en(zFilename, "r
45c0: 62 22 29 3b 0a 20 20 6c 6f 6e 67 20 73 7a 3b 0a b");. long sz;.
45d0: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 char *z;. if(
45e0: 20 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 66 61 in==0 ){. fa
45f0: 74 61 6c 45 72 72 6f 72 28 22 63 61 6e 6e 6f 74 talError("cannot
4600: 20 6f 70 65 6e 20 5c 22 25 73 5c 22 20 66 6f 72 open \"%s\" for
4610: 20 72 65 61 64 69 6e 67 22 2c 20 7a 46 69 6c 65 reading", zFile
4620: 6e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 66 73 65 name);. }. fse
4630: 65 6b 28 69 6e 2c 20 30 2c 20 53 45 45 4b 5f 45 ek(in, 0, SEEK_E
4640: 4e 44 29 3b 0a 20 20 73 7a 20 3d 20 66 74 65 6c ND);. sz = ftel
4650: 6c 28 69 6e 29 3b 0a 20 20 72 65 77 69 6e 64 28 l(in);. rewind(
4660: 69 6e 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 in);. z = sqlit
4670: 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 7a 2b 31 20 e3_malloc( sz+1
4680: 29 3b 0a 20 20 73 7a 20 3d 20 28 6c 6f 6e 67 29 );. sz = (long)
4690: 66 72 65 61 64 28 7a 2c 20 31 2c 20 73 7a 2c 20 fread(z, 1, sz,
46a0: 69 6e 29 3b 0a 20 20 7a 5b 73 7a 5d 20 3d 20 30 in);. z[sz] = 0
46b0: 3b 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a ;. fclose(in);.
46c0: 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 2f return z;.}../
46d0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 *.** Return the
46e0: 6c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 6e 65 length of the ne
46f0: 78 74 20 74 6f 6b 65 6e 2e 0a 2a 2f 0a 73 74 61 xt token..*/.sta
4700: 74 69 63 20 69 6e 74 20 74 6f 6b 65 6e 4c 65 6e tic int tokenLen
4710: 67 74 68 28 63 6f 6e 73 74 20 63 68 61 72 20 2a gth(const char *
4720: 7a 2c 20 69 6e 74 20 2a 70 6e 4c 69 6e 65 29 7b z, int *pnLine){
4730: 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 . int n = 0;.
4740: 69 66 28 20 49 53 53 50 41 43 45 28 7a 5b 30 5d if( ISSPACE(z[0]
4750: 29 20 7c 7c 20 28 7a 5b 30 5d 3d 3d 27 2f 27 20 ) || (z[0]=='/'
4760: 26 26 20 7a 5b 31 5d 3d 3d 27 2a 27 29 20 29 7b && z[1]=='*') ){
4770: 0a 20 20 20 20 69 6e 74 20 69 6e 43 20 3d 20 30 . int inC = 0
4780: 3b 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 ;. int c;.
4790: 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2f 27 20 29 if( z[0]=='/' )
47a0: 7b 0a 20 20 20 20 20 20 69 6e 43 20 3d 20 31 3b {. inC = 1;
47b0: 0a 20 20 20 20 20 20 6e 20 3d 20 32 3b 0a 20 20 . n = 2;.
47c0: 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 28 }. while( (
47d0: 63 20 3d 20 7a 5b 6e 2b 2b 5d 29 21 3d 30 20 29 c = z[n++])!=0 )
47e0: 7b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 {. if( c=='
47f0: 5c 6e 27 20 29 20 28 2a 70 6e 4c 69 6e 65 29 2b \n' ) (*pnLine)+
4800: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53 53 +;. if( ISS
4810: 50 41 43 45 28 63 29 20 29 20 63 6f 6e 74 69 6e PACE(c) ) contin
4820: 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e ue;. if( in
4830: 43 20 26 26 20 63 3d 3d 27 2a 27 20 26 26 20 7a C && c=='*' && z
4840: 5b 6e 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 [n]=='/' ){.
4850: 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 n++;.
4860: 20 69 6e 43 20 3d 20 30 3b 0a 20 20 20 20 20 20 inC = 0;.
4870: 7d 65 6c 73 65 20 69 66 28 20 21 69 6e 43 20 26 }else if( !inC &
4880: 26 20 63 3d 3d 27 2f 27 20 26 26 20 7a 5b 6e 5d & c=='/' && z[n]
4890: 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20 20 20 =='*' ){.
48a0: 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 6e n++;. in
48b0: 43 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c C = 1;. }el
48c0: 73 65 20 69 66 28 20 21 69 6e 43 20 29 7b 0a 20 se if( !inC ){.
48d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 break;.
48e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 }. }.
48f0: 6e 2d 2d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 n--;. }else if(
4900: 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 5b z[0]=='-' && z[
4910: 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 66 1]=='-' ){. f
4920: 6f 72 28 6e 3d 32 3b 20 7a 5b 6e 5d 20 26 26 20 or(n=2; z[n] &&
4930: 7a 5b 6e 5d 21 3d 27 5c 6e 27 3b 20 6e 2b 2b 29 z[n]!='\n'; n++)
4940: 7b 7d 0a 20 20 20 20 69 66 28 20 7a 5b 6e 5d 20 {}. if( z[n]
4950: 29 7b 20 28 2a 70 6e 4c 69 6e 65 29 2b 2b 3b 20 ){ (*pnLine)++;
4960: 6e 2b 2b 3b 20 7d 0a 20 20 7d 65 6c 73 65 20 69 n++; }. }else i
4970: 66 28 20 7a 5b 30 5d 3d 3d 27 22 27 20 7c 7c 20 f( z[0]=='"' ||
4980: 7a 5b 30 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 z[0]=='\'' ){.
4990: 20 20 69 6e 74 20 64 65 6c 69 6d 20 3d 20 7a 5b int delim = z[
49a0: 30 5d 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 31 3b 0];. for(n=1;
49b0: 20 7a 5b 6e 5d 3b 20 6e 2b 2b 29 7b 0a 20 20 20 z[n]; n++){.
49c0: 20 20 20 69 66 28 20 7a 5b 6e 5d 3d 3d 27 5c 6e if( z[n]=='\n
49d0: 27 20 29 20 28 2a 70 6e 4c 69 6e 65 29 2b 2b 3b ' ) (*pnLine)++;
49e0: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 6e 5d 3d . if( z[n]=
49f0: 3d 64 65 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20 =delim ){.
4a00: 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 n++;. i
4a10: 66 28 20 7a 5b 6e 2b 31 5d 21 3d 64 65 6c 69 6d f( z[n+1]!=delim
4a20: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 ) break;.
4a30: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b }. }. }else{
4a40: 0a 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 . int c;.
4a50: 66 6f 72 28 6e 3d 31 3b 20 28 63 20 3d 20 7a 5b for(n=1; (c = z[
4a60: 6e 5d 29 21 3d 30 20 26 26 20 21 49 53 53 50 41 n])!=0 && !ISSPA
4a70: 43 45 28 63 29 20 26 26 20 63 21 3d 27 22 27 20 CE(c) && c!='"'
4a80: 26 26 20 63 21 3d 27 5c 27 27 20 26 26 20 63 21 && c!='\'' && c!
4a90: 3d 27 3b 27 3b 20 6e 2b 2b 29 7b 7d 0a 20 20 7d =';'; n++){}. }
4aa0: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a . return n;.}..
4ab0: 2f 2a 0a 2a 2a 20 43 6f 70 79 20 61 20 73 69 6e /*.** Copy a sin
4ac0: 67 6c 65 20 74 6f 6b 65 6e 20 69 6e 74 6f 20 61 gle token into a
4ad0: 20 73 74 72 69 6e 67 20 62 75 66 66 65 72 2e 0a string buffer..
4ae0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 */.static int ex
4af0: 74 72 61 63 74 54 6f 6b 65 6e 28 63 6f 6e 73 74 tractToken(const
4b00: 20 63 68 61 72 20 2a 7a 49 6e 2c 20 69 6e 74 20 char *zIn, int
4b10: 6e 49 6e 2c 20 63 68 61 72 20 2a 7a 4f 75 74 2c nIn, char *zOut,
4b20: 20 69 6e 74 20 6e 4f 75 74 29 7b 0a 20 20 69 6e int nOut){. in
4b30: 74 20 69 3b 0a 20 20 69 66 28 20 6e 49 6e 3c 3d t i;. if( nIn<=
4b40: 30 20 29 7b 0a 20 20 20 20 7a 4f 75 74 5b 30 5d 0 ){. zOut[0]
4b50: 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e = 0;. return
4b60: 20 30 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 0;. }. for(i=
4b70: 30 3b 20 69 3c 6e 49 6e 20 26 26 20 69 3c 6e 4f 0; i<nIn && i<nO
4b80: 75 74 2d 31 20 26 26 20 21 49 53 53 50 41 43 45 ut-1 && !ISSPACE
4b90: 28 7a 49 6e 5b 69 5d 29 3b 20 69 2b 2b 29 7b 20 (zIn[i]); i++){
4ba0: 7a 4f 75 74 5b 69 5d 20 3d 20 7a 49 6e 5b 69 5d zOut[i] = zIn[i]
4bb0: 3b 20 7d 0a 20 20 7a 4f 75 74 5b 69 5d 20 3d 20 ; }. zOut[i] =
4bc0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 69 3b 0a 7d 0;. return i;.}
4bd0: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 74 68 65 ../*.** Find the
4be0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 number of chara
4bf0: 63 74 65 72 73 20 75 70 20 74 6f 20 74 68 65 20 cters up to the
4c00: 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 start of the nex
4c10: 74 20 22 2d 2d 65 6e 64 22 20 74 6f 6b 65 6e 2e t "--end" token.
4c20: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 .*/.static int f
4c30: 69 6e 64 45 6e 64 28 63 6f 6e 73 74 20 63 68 61 indEnd(const cha
4c40: 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 6e 4c 69 6e r *z, int *pnLin
4c50: 65 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b e){. int n = 0;
4c60: 0a 20 20 77 68 69 6c 65 28 20 7a 5b 6e 5d 20 26 . while( z[n] &
4c70: 26 20 28 73 74 72 6e 63 6d 70 28 7a 2b 6e 2c 22 & (strncmp(z+n,"
4c80: 2d 2d 65 6e 64 22 2c 35 29 20 7c 7c 20 21 49 53 --end",5) || !IS
4c90: 53 50 41 43 45 28 7a 5b 6e 2b 35 5d 29 29 20 29 SPACE(z[n+5])) )
4ca0: 7b 0a 20 20 20 20 6e 20 2b 3d 20 74 6f 6b 65 6e {. n += token
4cb0: 4c 65 6e 67 74 68 28 7a 2b 6e 2c 20 70 6e 4c 69 Length(z+n, pnLi
4cc0: 6e 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 ne);. }. retur
4cd0: 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 n n;.}../*.** Fi
4ce0: 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 nd the number of
4cf0: 20 63 68 61 72 61 63 74 65 72 73 20 75 70 20 74 characters up t
4d00: 6f 20 74 68 65 20 66 69 72 73 74 20 63 68 61 72 o the first char
4d10: 61 63 74 65 72 20 70 61 73 74 20 74 68 65 0a 2a acter past the.*
4d20: 2a 20 6f 66 20 74 68 65 20 6e 65 78 74 20 22 2d * of the next "-
4d30: 2d 65 6e 64 69 66 22 20 20 6f 72 20 22 2d 2d 65 -endif" or "--e
4d40: 6c 73 65 22 20 74 6f 6b 65 6e 2e 20 4e 65 73 74 lse" token. Nest
4d50: 65 64 20 2d 2d 69 66 20 63 6f 6d 6d 61 6e 64 73 ed --if commands
4d60: 20 61 72 65 0a 2a 2a 20 61 6c 73 6f 20 73 6b 69 are.** also ski
4d70: 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 pped..*/.static
4d80: 69 6e 74 20 66 69 6e 64 45 6e 64 69 66 28 63 6f int findEndif(co
4d90: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 nst char *z, int
4da0: 20 73 74 6f 70 41 74 45 6c 73 65 2c 20 69 6e 74 stopAtElse, int
4db0: 20 2a 70 6e 4c 69 6e 65 29 7b 0a 20 20 69 6e 74 *pnLine){. int
4dc0: 20 6e 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28 n = 0;. while(
4dd0: 20 7a 5b 6e 5d 20 29 7b 0a 20 20 20 20 69 6e 74 z[n] ){. int
4de0: 20 6c 65 6e 20 3d 20 74 6f 6b 65 6e 4c 65 6e 67 len = tokenLeng
4df0: 74 68 28 7a 2b 6e 2c 20 70 6e 4c 69 6e 65 29 3b th(z+n, pnLine);
4e00: 0a 20 20 20 20 69 66 28 20 28 73 74 72 6e 63 6d . if( (strncm
4e10: 70 28 7a 2b 6e 2c 22 2d 2d 65 6e 64 69 66 22 2c p(z+n,"--endif",
4e20: 37 29 3d 3d 30 20 26 26 20 49 53 53 50 41 43 45 7)==0 && ISSPACE
4e30: 28 7a 5b 6e 2b 37 5d 29 29 0a 20 20 20 20 20 7c (z[n+7])). |
4e40: 7c 20 28 73 74 6f 70 41 74 45 6c 73 65 20 26 26 | (stopAtElse &&
4e50: 20 73 74 72 6e 63 6d 70 28 7a 2b 6e 2c 22 2d 2d strncmp(z+n,"--
4e60: 65 6c 73 65 22 2c 36 29 3d 3d 30 20 26 26 20 49 else",6)==0 && I
4e70: 53 53 50 41 43 45 28 7a 5b 6e 2b 36 5d 29 29 0a SSPACE(z[n+6])).
4e80: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 ){. ret
4e90: 75 72 6e 20 6e 2b 6c 65 6e 3b 0a 20 20 20 20 7d urn n+len;. }
4ea0: 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 . if( strncmp
4eb0: 28 7a 2b 6e 2c 22 2d 2d 69 66 22 2c 34 29 3d 3d (z+n,"--if",4)==
4ec0: 30 20 26 26 20 49 53 53 50 41 43 45 28 7a 5b 6e 0 && ISSPACE(z[n
4ed0: 2b 34 5d 29 20 29 7b 0a 20 20 20 20 20 20 69 6e +4]) ){. in
4ee0: 74 20 73 6b 69 70 20 3d 20 66 69 6e 64 45 6e 64 t skip = findEnd
4ef0: 69 66 28 7a 2b 6e 2b 6c 65 6e 2c 20 30 2c 20 70 if(z+n+len, 0, p
4f00: 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 6e 20 nLine);. n
4f10: 2b 3d 20 73 6b 69 70 20 2b 20 6c 65 6e 3b 0a 20 += skip + len;.
4f20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
4f30: 6e 20 2b 3d 20 6c 65 6e 3b 0a 20 20 20 20 7d 0a n += len;. }.
4f40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a }. return n;.
4f50: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 69 74 20 66 6f }../*.** Wait fo
4f60: 72 20 61 20 63 6c 69 65 6e 74 20 70 72 6f 63 65 r a client proce
4f70: 73 73 20 74 6f 20 63 6f 6d 70 6c 65 74 65 20 61 ss to complete a
4f80: 6c 6c 20 69 74 73 20 74 61 73 6b 73 0a 2a 2f 0a ll its tasks.*/.
4f90: 73 74 61 74 69 63 20 76 6f 69 64 20 77 61 69 74 static void wait
4fa0: 46 6f 72 43 6c 69 65 6e 74 28 69 6e 74 20 69 43 ForClient(int iC
4fb0: 6c 69 65 6e 74 2c 20 69 6e 74 20 69 54 69 6d 65 lient, int iTime
4fc0: 6f 75 74 2c 20 63 68 61 72 20 2a 7a 45 72 72 50 out, char *zErrP
4fd0: 72 65 66 69 78 29 7b 0a 20 20 73 71 6c 69 74 65 refix){. sqlite
4fe0: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 3_stmt *pStmt;.
4ff0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 69 int rc;. if( i
5000: 43 6c 69 65 6e 74 3e 30 20 29 7b 0a 20 20 20 20 Client>0 ){.
5010: 70 53 74 6d 74 20 3d 20 70 72 65 70 61 72 65 53 pStmt = prepareS
5020: 71 6c 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 ql(.
5030: 20 20 20 22 53 45 4c 45 43 54 20 31 20 46 52 4f "SELECT 1 FRO
5040: 4d 20 74 61 73 6b 22 0a 20 20 20 20 20 20 20 20 M task".
5050: 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20 63 " WHERE c
5060: 6c 69 65 6e 74 3d 25 64 22 0a 20 20 20 20 20 20 lient=%d".
5070: 20 20 20 20 20 20 20 20 20 22 20 20 20 41 4e 44 " AND
5080: 20 63 6c 69 65 6e 74 20 49 4e 20 28 53 45 4c 45 client IN (SELE
5090: 43 54 20 69 64 20 46 52 4f 4d 20 63 6c 69 65 6e CT id FROM clien
50a0: 74 29 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 t)".
50b0: 20 20 20 22 20 20 41 4e 44 20 65 6e 64 74 69 6d " AND endtim
50c0: 65 20 49 53 20 4e 55 4c 4c 22 2c 0a 20 20 20 20 e IS NULL",.
50d0: 20 20 20 20 20 20 20 20 20 20 20 69 43 6c 69 65 iClie
50e0: 6e 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 nt);. }else{.
50f0: 20 20 70 53 74 6d 74 20 3d 20 70 72 65 70 61 72 pStmt = prepar
5100: 65 53 71 6c 28 0a 20 20 20 20 20 20 20 20 20 20 eSql(.
5110: 20 20 20 20 20 22 53 45 4c 45 43 54 20 31 20 46 "SELECT 1 F
5120: 52 4f 4d 20 74 61 73 6b 22 0a 20 20 20 20 20 20 ROM task".
5130: 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45 " WHERE
5140: 20 63 6c 69 65 6e 74 20 49 4e 20 28 53 45 4c 45 client IN (SELE
5150: 43 54 20 69 64 20 46 52 4f 4d 20 63 6c 69 65 6e CT id FROM clien
5160: 74 29 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 t)".
5170: 20 20 20 22 20 20 20 41 4e 44 20 65 6e 64 74 69 " AND endti
5180: 6d 65 20 49 53 20 4e 55 4c 4c 22 29 3b 0a 20 20 me IS NULL");.
5190: 7d 0a 20 20 67 2e 69 54 69 6d 65 6f 75 74 20 3d }. g.iTimeout =
51a0: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 28 28 72 0;. while( ((r
51b0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 c = sqlite3_step
51c0: 28 70 53 74 6d 74 29 29 3d 3d 53 51 4c 49 54 45 (pStmt))==SQLITE
51d0: 5f 42 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c _BUSY || rc==SQL
51e0: 49 54 45 5f 52 4f 57 29 0a 20 20 20 20 26 26 20 ITE_ROW). &&
51f0: 69 54 69 6d 65 6f 75 74 3e 30 0a 20 20 29 7b 0a iTimeout>0. ){.
5200: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 sqlite3_rese
5210: 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 t(pStmt);. sq
5220: 6c 69 74 65 33 5f 73 6c 65 65 70 28 35 30 29 3b lite3_sleep(50);
5230: 0a 20 20 20 20 69 54 69 6d 65 6f 75 74 20 2d 3d . iTimeout -=
5240: 20 35 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 50;. }. sqlit
5250: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d e3_finalize(pStm
5260: 74 29 3b 0a 20 20 67 2e 69 54 69 6d 65 6f 75 74 t);. g.iTimeout
5270: 20 3d 20 44 45 46 41 55 4c 54 5f 54 49 4d 45 4f = DEFAULT_TIMEO
5280: 55 54 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 UT;. if( rc!=SQ
5290: 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 LITE_DONE ){.
52a0: 20 69 66 28 20 7a 45 72 72 50 72 65 66 69 78 3d if( zErrPrefix=
52b0: 3d 30 20 29 20 7a 45 72 72 50 72 65 66 69 78 20 =0 ) zErrPrefix
52c0: 3d 20 22 22 3b 0a 20 20 20 20 69 66 28 20 69 43 = "";. if( iC
52d0: 6c 69 65 6e 74 3e 30 20 29 7b 0a 20 20 20 20 20 lient>0 ){.
52e0: 20 65 72 72 6f 72 4d 65 73 73 61 67 65 28 22 25 errorMessage("%
52f0: 73 74 69 6d 65 6f 75 74 20 77 61 69 74 69 6e 67 stimeout waiting
5300: 20 66 6f 72 20 63 6c 69 65 6e 74 20 25 64 22 2c for client %d",
5310: 20 7a 45 72 72 50 72 65 66 69 78 2c 20 69 43 6c zErrPrefix, iCl
5320: 69 65 6e 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 ient);. }else
5330: 7b 0a 20 20 20 20 20 20 65 72 72 6f 72 4d 65 73 {. errorMes
5340: 73 61 67 65 28 22 25 73 74 69 6d 65 6f 75 74 20 sage("%stimeout
5350: 77 61 69 74 69 6e 67 20 66 6f 72 20 61 6c 6c 20 waiting for all
5360: 63 6c 69 65 6e 74 73 22 2c 20 7a 45 72 72 50 72 clients", zErrPr
5370: 65 66 69 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d efix);. }. }
5380: 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 61 20 .}../* Return a
5390: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 pointer to the t
53a0: 61 69 6c 20 6f 66 20 61 20 66 69 6c 65 6e 61 6d ail of a filenam
53b0: 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 e.*/.static char
53c0: 20 2a 66 69 6c 65 6e 61 6d 65 54 61 69 6c 28 63 *filenameTail(c
53d0: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 har *z){. int i
53e0: 2c 20 6a 3b 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 , j;. for(i=j=0
53f0: 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 20 69 66 28 ; z[i]; i++) if(
5400: 20 69 73 44 69 72 53 65 70 28 7a 5b 69 5d 29 20 isDirSep(z[i])
5410: 29 20 6a 20 3d 20 69 2b 31 3b 0a 20 20 72 65 74 ) j = i+1;. ret
5420: 75 72 6e 20 7a 2b 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a urn z+j;.}../*.*
5430: 2a 20 49 6e 74 65 72 70 72 65 74 20 7a 41 72 67 * Interpret zArg
5440: 20 61 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 as a boolean va
5450: 6c 75 65 2e 20 20 52 65 74 75 72 6e 20 65 69 74 lue. Return eit
5460: 68 65 72 20 30 20 6f 72 20 31 2e 0a 2a 2f 0a 73 her 0 or 1..*/.s
5470: 74 61 74 69 63 20 69 6e 74 20 62 6f 6f 6c 65 61 tatic int boolea
5480: 6e 56 61 6c 75 65 28 63 68 61 72 20 2a 7a 41 72 nValue(char *zAr
5490: 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 g){. int i;. i
54a0: 66 28 20 7a 41 72 67 3d 3d 30 20 29 20 72 65 74 f( zArg==0 ) ret
54b0: 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 urn 0;. for(i=0
54c0: 3b 20 7a 41 72 67 5b 69 5d 3e 3d 27 30 27 20 26 ; zArg[i]>='0' &
54d0: 26 20 7a 41 72 67 5b 69 5d 3c 3d 27 39 27 3b 20 & zArg[i]<='9';
54e0: 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30 i++){}. if( i>0
54f0: 20 26 26 20 7a 41 72 67 5b 69 5d 3d 3d 30 20 29 && zArg[i]==0 )
5500: 20 72 65 74 75 72 6e 20 61 74 6f 69 28 7a 41 72 return atoi(zAr
5510: 67 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 g);. if( sqlite
5520: 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20 3_stricmp(zArg,
5530: 22 6f 6e 22 29 3d 3d 30 20 7c 7c 20 73 71 6c 69 "on")==0 || sqli
5540: 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 te3_stricmp(zArg
5550: 2c 22 79 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 ,"yes")==0 ){.
5560: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a return 1;. }.
5570: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 if( sqlite3_st
5580: 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 6f 66 66 ricmp(zArg, "off
5590: 22 29 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 ")==0 || sqlite3
55a0: 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 22 6e _stricmp(zArg,"n
55b0: 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 o")==0 ){. re
55c0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 65 72 turn 0;. }. er
55d0: 72 6f 72 4d 65 73 73 61 67 65 28 22 75 6e 6b 6e rorMessage("unkn
55e0: 6f 77 6e 20 62 6f 6f 6c 65 61 6e 3a 20 5b 25 73 own boolean: [%s
55f0: 5d 22 2c 20 7a 41 72 67 29 3b 0a 20 20 72 65 74 ]", zArg);. ret
5600: 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 20 54 68 urn 0;.}.../* Th
5610: 69 73 20 72 6f 75 74 69 6e 65 20 65 78 69 73 74 is routine exist
5620: 73 20 61 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e s as a convenien
5630: 74 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 t place to set a
5640: 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 62 72 65 debugger.** bre
5650: 61 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 akpoint..*/.stat
5660: 69 63 20 76 6f 69 64 20 74 65 73 74 5f 62 72 65 ic void test_bre
5670: 61 6b 70 6f 69 6e 74 28 76 6f 69 64 29 7b 20 73 akpoint(void){ s
5680: 74 61 74 69 63 20 76 6f 6c 61 74 69 6c 65 20 69 tatic volatile i
5690: 6e 74 20 63 6e 74 20 3d 20 30 3b 20 63 6e 74 2b nt cnt = 0; cnt+
56a0: 2b 3b 20 7d 0a 0a 2f 2a 20 4d 61 78 69 6d 75 6d +; }../* Maximum
56b0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d number of argum
56c0: 65 6e 74 73 20 74 6f 20 61 20 2d 2d 63 6f 6d 6d ents to a --comm
56d0: 61 6e 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d and */.#define M
56e0: 58 5f 41 52 47 20 32 0a 0a 2f 2a 0a 2a 2a 20 52 X_ARG 2../*.** R
56f0: 75 6e 20 61 20 73 63 72 69 70 74 2e 0a 2a 2f 0a un a script..*/.
5700: 73 74 61 74 69 63 20 76 6f 69 64 20 72 75 6e 53 static void runS
5710: 63 72 69 70 74 28 0a 20 20 69 6e 74 20 69 43 6c cript(. int iCl
5720: 69 65 6e 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 ient, /* T
5730: 68 65 20 63 6c 69 65 6e 74 20 6e 75 6d 62 65 72 he client number
5740: 2c 20 6f 72 20 30 20 66 6f 72 20 74 68 65 20 6d , or 0 for the m
5750: 61 73 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 aster */. int t
5760: 61 73 6b 49 64 2c 20 20 20 20 20 20 20 20 2f 2a askId, /*
5770: 20 54 68 65 20 74 61 73 6b 20 49 44 20 66 6f 72 The task ID for
5780: 20 63 6c 69 65 6e 74 73 2e 20 20 30 20 66 6f 72 clients. 0 for
5790: 20 6d 61 73 74 65 72 20 2a 2f 0a 20 20 63 68 61 master */. cha
57a0: 72 20 2a 7a 53 63 72 69 70 74 2c 20 20 20 20 20 r *zScript,
57b0: 2f 2a 20 54 65 78 74 20 6f 66 20 74 68 65 20 73 /* Text of the s
57c0: 63 72 69 70 74 20 2a 2f 0a 20 20 63 68 61 72 20 cript */. char
57d0: 2a 7a 46 69 6c 65 6e 61 6d 65 20 20 20 20 2f 2a *zFilename /*
57e0: 20 46 69 6c 65 20 66 72 6f 6d 20 77 68 69 63 68 File from which
57f0: 20 73 63 72 69 70 74 20 77 61 73 20 72 65 61 64 script was read
5800: 2e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6c 69 . */.){. int li
5810: 6e 65 6e 6f 20 3d 20 31 3b 0a 20 20 69 6e 74 20 neno = 1;. int
5820: 70 72 65 76 4c 69 6e 65 20 3d 20 31 3b 0a 20 20 prevLine = 1;.
5830: 69 6e 74 20 69 69 20 3d 20 30 3b 0a 20 20 69 6e int ii = 0;. in
5840: 74 20 69 42 65 67 69 6e 20 3d 20 30 3b 0a 20 20 t iBegin = 0;.
5850: 69 6e 74 20 6e 2c 20 63 2c 20 6a 3b 0a 20 20 69 int n, c, j;. i
5860: 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 6e 41 nt len;. int nA
5870: 72 67 3b 0a 20 20 53 74 72 69 6e 67 20 73 52 65 rg;. String sRe
5880: 73 75 6c 74 3b 0a 20 20 63 68 61 72 20 7a 43 6d sult;. char zCm
5890: 64 5b 33 30 5d 3b 0a 20 20 63 68 61 72 20 7a 45 d[30];. char zE
58a0: 72 72 6f 72 5b 31 30 30 30 5d 3b 0a 20 20 63 68 rror[1000];. ch
58b0: 61 72 20 61 7a 41 72 67 5b 4d 58 5f 41 52 47 5d ar azArg[MX_ARG]
58c0: 5b 31 30 30 5d 3b 0a 0a 20 20 6d 65 6d 73 65 74 [100];.. memset
58d0: 28 26 73 52 65 73 75 6c 74 2c 20 30 2c 20 73 69 (&sResult, 0, si
58e0: 7a 65 6f 66 28 73 52 65 73 75 6c 74 29 29 3b 0a zeof(sResult));.
58f0: 20 20 73 74 72 69 6e 67 52 65 73 65 74 28 26 73 stringReset(&s
5900: 52 65 73 75 6c 74 29 3b 0a 20 20 77 68 69 6c 65 Result);. while
5910: 28 20 28 63 20 3d 20 7a 53 63 72 69 70 74 5b 69 ( (c = zScript[i
5920: 69 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 72 i])!=0 ){. pr
5930: 65 76 4c 69 6e 65 20 3d 20 6c 69 6e 65 6e 6f 3b evLine = lineno;
5940: 0a 20 20 20 20 6c 65 6e 20 3d 20 74 6f 6b 65 6e . len = token
5950: 4c 65 6e 67 74 68 28 7a 53 63 72 69 70 74 2b 69 Length(zScript+i
5960: 69 2c 20 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 i, &lineno);.
5970: 20 69 66 28 20 49 53 53 50 41 43 45 28 63 29 20 if( ISSPACE(c)
5980: 7c 7c 20 28 63 3d 3d 27 2f 27 20 26 26 20 7a 53 || (c=='/' && zS
5990: 63 72 69 70 74 5b 69 69 2b 31 5d 3d 3d 27 2a 27 cript[ii+1]=='*'
59a0: 29 20 29 7b 0a 20 20 20 20 20 20 69 69 20 2b 3d ) ){. ii +=
59b0: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 74 len;. cont
59c0: 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 inue;. }.
59d0: 69 66 28 20 63 21 3d 27 2d 27 20 7c 7c 20 7a 53 if( c!='-' || zS
59e0: 63 72 69 70 74 5b 69 69 2b 31 5d 21 3d 27 2d 27 cript[ii+1]!='-'
59f0: 20 7c 7c 20 21 69 73 61 6c 70 68 61 28 7a 53 63 || !isalpha(zSc
5a00: 72 69 70 74 5b 69 69 2b 32 5d 29 20 29 7b 0a 20 ript[ii+2]) ){.
5a10: 20 20 20 20 20 69 69 20 2b 3d 20 6c 65 6e 3b 0a ii += len;.
5a20: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a continue;.
5a30: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 75 }.. /* Ru
5a40: 6e 20 61 6e 79 20 70 72 69 6f 72 20 53 51 4c 20 n any prior SQL
5a50: 62 65 66 6f 72 65 20 70 72 6f 63 65 73 73 69 6e before processin
5a60: 67 20 74 68 65 20 6e 65 77 20 2d 2d 63 6f 6d 6d g the new --comm
5a70: 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 and */. if( i
5a80: 69 3e 69 42 65 67 69 6e 20 29 7b 0a 20 20 20 20 i>iBegin ){.
5a90: 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 char *zSql = s
5aa0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 qlite3_mprintf("
5ab0: 25 2e 2a 73 22 2c 20 69 69 2d 69 42 65 67 69 6e %.*s", ii-iBegin
5ac0: 2c 20 7a 53 63 72 69 70 74 2b 69 42 65 67 69 6e , zScript+iBegin
5ad0: 29 3b 0a 20 20 20 20 20 20 65 76 61 6c 53 71 6c );. evalSql
5ae0: 28 26 73 52 65 73 75 6c 74 2c 20 7a 53 71 6c 29 (&sResult, zSql)
5af0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f ;. sqlite3_
5b00: 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 free(zSql);.
5b10: 20 20 69 42 65 67 69 6e 20 3d 20 69 69 20 2b 20 iBegin = ii +
5b20: 6c 65 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 len;. }..
5b30: 2f 2a 20 50 61 72 73 65 20 74 68 65 20 2d 2d 63 /* Parse the --c
5b40: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66 ommand */. if
5b50: 28 20 67 2e 69 54 72 61 63 65 3e 3d 32 20 29 20 ( g.iTrace>=2 )
5b60: 6c 6f 67 4d 65 73 73 61 67 65 28 22 25 2e 2a 73 logMessage("%.*s
5b70: 22 2c 20 6c 65 6e 2c 20 7a 53 63 72 69 70 74 2b ", len, zScript+
5b80: 69 69 29 3b 0a 20 20 20 20 6e 20 3d 20 65 78 74 ii);. n = ext
5b90: 72 61 63 74 54 6f 6b 65 6e 28 7a 53 63 72 69 70 ractToken(zScrip
5ba0: 74 2b 69 69 2b 32 2c 20 6c 65 6e 2d 32 2c 20 7a t+ii+2, len-2, z
5bb0: 43 6d 64 2c 20 73 69 7a 65 6f 66 28 7a 43 6d 64 Cmd, sizeof(zCmd
5bc0: 29 29 3b 0a 20 20 20 20 66 6f 72 28 6e 41 72 67 ));. for(nArg
5bd0: 3d 30 3b 20 6e 3c 6c 65 6e 2d 32 20 26 26 20 6e =0; n<len-2 && n
5be0: 41 72 67 3c 4d 58 5f 41 52 47 3b 20 6e 41 72 67 Arg<MX_ARG; nArg
5bf0: 2b 2b 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 ++){. while
5c00: 28 20 6e 3c 6c 65 6e 2d 32 20 26 26 20 49 53 53 ( n<len-2 && ISS
5c10: 50 41 43 45 28 7a 53 63 72 69 70 74 5b 69 69 2b PACE(zScript[ii+
5c20: 32 2b 6e 5d 29 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 2+n]) ){ n++; }.
5c30: 20 20 20 20 20 20 69 66 28 20 6e 3e 3d 6c 65 6e if( n>=len
5c40: 2d 32 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 -2 ) break;.
5c50: 20 20 6e 20 2b 3d 20 65 78 74 72 61 63 74 54 6f n += extractTo
5c60: 6b 65 6e 28 7a 53 63 72 69 70 74 2b 69 69 2b 32 ken(zScript+ii+2
5c70: 2b 6e 2c 20 6c 65 6e 2d 32 2d 6e 2c 0a 20 20 20 +n, len-2-n,.
5c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5c90: 20 20 20 20 20 61 7a 41 72 67 5b 6e 41 72 67 5d azArg[nArg]
5ca0: 2c 20 73 69 7a 65 6f 66 28 61 7a 41 72 67 5b 6e , sizeof(azArg[n
5cb0: 41 72 67 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 Arg]));. }.
5cc0: 20 20 66 6f 72 28 6a 3d 6e 41 72 67 3b 20 6a 3c for(j=nArg; j<
5cd0: 4d 58 5f 41 52 47 3b 20 6a 2b 2b 29 20 61 7a 41 MX_ARG; j++) azA
5ce0: 72 67 5b 6a 2b 2b 5d 5b 30 5d 20 3d 20 30 3b 0a rg[j++][0] = 0;.
5cf0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 . /*. **
5d00: 2d 2d 73 6c 65 65 70 20 4e 0a 20 20 20 20 2a 2a --sleep N. **
5d10: 0a 20 20 20 20 2a 2a 20 50 61 75 73 65 20 66 6f . ** Pause fo
5d20: 72 20 4e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 r N milliseconds
5d30: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 . */. if(
5d40: 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 73 6c strcmp(zCmd, "sl
5d50: 65 65 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 eep")==0 ){.
5d60: 20 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 sqlite3_sleep(
5d70: 61 74 6f 69 28 61 7a 41 72 67 5b 30 5d 29 29 3b atoi(azArg[0]));
5d80: 0a 20 20 20 20 7d 65 6c 73 65 20 0a 0a 20 20 20 . }else ..
5d90: 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 2d 2d 65 /*. ** --e
5da0: 78 69 74 20 4e 0a 20 20 20 20 2a 2a 0a 20 20 20 xit N. **.
5db0: 20 2a 2a 20 45 78 69 74 20 74 68 69 73 20 70 72 ** Exit this pr
5dc0: 6f 63 65 73 73 2e 20 20 49 66 20 4e 3e 30 20 74 ocess. If N>0 t
5dd0: 68 65 6e 20 65 78 69 74 20 77 69 74 68 6f 75 74 hen exit without
5de0: 20 73 68 75 74 74 69 6e 67 20 64 6f 77 6e 0a 20 shutting down.
5df0: 20 20 20 2a 2a 20 53 51 4c 69 74 65 2e 20 20 28 ** SQLite. (
5e00: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 In other words,
5e10: 73 69 6d 75 6c 61 74 65 20 61 20 63 72 61 73 68 simulate a crash
5e20: 2e 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 .). */. if
5e30: 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 ( strcmp(zCmd, "
5e40: 65 78 69 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 exit")==0 ){.
5e50: 20 20 20 69 6e 74 20 72 63 20 3d 20 61 74 6f 69 int rc = atoi
5e60: 28 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 (azArg[0]);.
5e70: 20 20 66 69 6e 69 73 68 53 63 72 69 70 74 28 69 finishScript(i
5e80: 43 6c 69 65 6e 74 2c 20 74 61 73 6b 49 64 2c 20 Client, taskId,
5e90: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 1);. if( rc
5ea0: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 5f 63 6c ==0 ) sqlite3_cl
5eb0: 6f 73 65 28 67 2e 64 62 29 3b 0a 20 20 20 20 20 ose(g.db);.
5ec0: 20 65 78 69 74 28 72 63 29 3b 0a 20 20 20 20 7d exit(rc);. }
5ed0: 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 else.. /*.
5ee0: 20 2a 2a 20 20 20 2d 2d 74 65 73 74 63 61 73 65 ** --testcase
5ef0: 20 4e 41 4d 45 0a 20 20 20 20 2a 2a 0a 20 20 20 NAME. **.
5f00: 20 2a 2a 20 42 65 67 69 6e 20 61 20 6e 65 77 20 ** Begin a new
5f10: 74 65 73 74 20 63 61 73 65 2e 20 20 41 6e 6e 6f test case. Anno
5f20: 75 6e 63 65 20 69 6e 20 74 68 65 20 6c 6f 67 20 unce in the log
5f30: 74 68 61 74 20 74 68 65 20 74 65 73 74 20 63 61 that the test ca
5f40: 73 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 62 65 se. ** has be
5f50: 67 75 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 gun.. */.
5f60: 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c if( strcmp(zCmd,
5f70: 20 22 74 65 73 74 63 61 73 65 22 29 3d 3d 30 20 "testcase")==0
5f80: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 67 2e 69 ){. if( g.i
5f90: 54 72 61 63 65 3d 3d 31 20 29 20 6c 6f 67 4d 65 Trace==1 ) logMe
5fa0: 73 73 61 67 65 28 22 25 2e 2a 73 22 2c 20 6c 65 ssage("%.*s", le
5fb0: 6e 20 2d 20 31 2c 20 7a 53 63 72 69 70 74 2b 69 n - 1, zScript+i
5fc0: 69 29 3b 0a 20 20 20 20 20 20 73 74 72 69 6e 67 i);. string
5fd0: 52 65 73 65 74 28 26 73 52 65 73 75 6c 74 29 3b Reset(&sResult);
5fe0: 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 . }else..
5ff0: 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 2d 2d 66 69 /*. ** --fi
6000: 6e 69 73 68 0a 20 20 20 20 2a 2a 0a 20 20 20 20 nish. **.
6010: 2a 2a 20 4d 61 72 6b 20 74 68 65 20 63 75 72 72 ** Mark the curr
6020: 65 6e 74 20 74 61 73 6b 20 61 73 20 68 61 76 69 ent task as havi
6030: 6e 67 20 66 69 6e 69 73 68 65 64 2c 20 65 76 65 ng finished, eve
6040: 6e 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 0a n if it is not..
6050: 20 20 20 20 2a 2a 20 54 68 69 73 20 63 61 6e 20 ** This can
6060: 62 65 20 75 73 65 64 20 69 6e 20 63 6f 6e 6a 75 be used in conju
6070: 6e 63 74 69 6f 6e 20 77 69 74 68 20 2d 2d 65 78 nction with --ex
6080: 69 74 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 it to simulate a
6090: 20 63 72 61 73 68 2e 0a 20 20 20 20 2a 2f 0a 20 crash.. */.
60a0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 if( strcmp(zC
60b0: 6d 64 2c 20 22 66 69 6e 69 73 68 22 29 3d 3d 30 md, "finish")==0
60c0: 20 26 26 20 69 43 6c 69 65 6e 74 3e 30 20 29 7b && iClient>0 ){
60d0: 0a 20 20 20 20 20 20 66 69 6e 69 73 68 53 63 72 . finishScr
60e0: 69 70 74 28 69 43 6c 69 65 6e 74 2c 20 74 61 73 ipt(iClient, tas
60f0: 6b 49 64 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c kId, 1);. }el
6100: 73 65 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a se.. /*. *
6110: 2a 20 20 2d 2d 72 65 73 65 74 0a 20 20 20 20 2a * --reset. *
6120: 2a 0a 20 20 20 20 2a 2a 20 52 65 73 65 74 20 61 *. ** Reset a
6130: 63 63 75 6d 75 6c 61 74 65 64 20 72 65 73 75 6c ccumulated resul
6140: 74 73 20 62 61 63 6b 20 74 6f 20 61 6e 20 65 6d ts back to an em
6150: 70 74 79 20 73 74 72 69 6e 67 0a 20 20 20 20 2a pty string. *
6160: 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 /. if( strcmp
6170: 28 7a 43 6d 64 2c 20 22 72 65 73 65 74 22 29 3d (zCmd, "reset")=
6180: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 69 =0 ){. stri
6190: 6e 67 52 65 73 65 74 28 26 73 52 65 73 75 6c 74 ngReset(&sResult
61a0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 );. }else..
61b0: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 2d 2d 6d /*. ** --m
61c0: 61 74 63 68 20 41 4e 53 57 45 52 2e 2e 2e 0a 20 atch ANSWER....
61d0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 68 65 **. ** Che
61e0: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 6f 75 74 ck to see if out
61f0: 70 75 74 20 6d 61 74 63 68 65 73 20 41 4e 53 57 put matches ANSW
6200: 45 52 2e 20 20 52 65 70 6f 72 74 20 61 6e 20 65 ER. Report an e
6210: 72 72 6f 72 20 69 66 20 6e 6f 74 2e 0a 20 20 20 rror if not..
6220: 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 */. if( strc
6230: 6d 70 28 7a 43 6d 64 2c 20 22 6d 61 74 63 68 22 mp(zCmd, "match"
6240: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e )==0 ){. in
6250: 74 20 6a 6a 3b 0a 20 20 20 20 20 20 63 68 61 72 t jj;. char
6260: 20 2a 7a 41 6e 73 20 3d 20 7a 53 63 72 69 70 74 *zAns = zScript
6270: 2b 69 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a +ii;. for(j
6280: 6a 3d 37 3b 20 6a 6a 3c 6c 65 6e 2d 31 20 26 26 j=7; jj<len-1 &&
6290: 20 49 53 53 50 41 43 45 28 7a 41 6e 73 5b 6a 6a ISSPACE(zAns[jj
62a0: 5d 29 3b 20 6a 6a 2b 2b 29 7b 7d 0a 20 20 20 20 ]); jj++){}.
62b0: 20 20 7a 41 6e 73 20 2b 3d 20 6a 6a 3b 0a 20 20 zAns += jj;.
62c0: 20 20 20 20 69 66 28 20 6c 65 6e 2d 6a 6a 2d 31 if( len-jj-1
62d0: 21 3d 73 52 65 73 75 6c 74 2e 6e 20 7c 7c 20 73 !=sResult.n || s
62e0: 74 72 6e 63 6d 70 28 73 52 65 73 75 6c 74 2e 7a trncmp(sResult.z
62f0: 2c 20 7a 41 6e 73 2c 20 6c 65 6e 2d 6a 6a 2d 31 , zAns, len-jj-1
6300: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 65 72 72 ) ){. err
6310: 6f 72 4d 65 73 73 61 67 65 28 22 6c 69 6e 65 20 orMessage("line
6320: 25 64 20 6f 66 20 25 73 3a 5c 6e 45 78 70 65 63 %d of %s:\nExpec
6330: 74 65 64 20 5b 25 2e 2a 73 5d 5c 6e 20 20 20 20 ted [%.*s]\n
6340: 20 47 6f 74 20 5b 25 73 5d 22 2c 0a 20 20 20 20 Got [%s]",.
6350: 20 20 20 20 20 20 70 72 65 76 4c 69 6e 65 2c 20 prevLine,
6360: 7a 46 69 6c 65 6e 61 6d 65 2c 20 6c 65 6e 2d 6a zFilename, len-j
6370: 6a 2d 31 2c 20 7a 41 6e 73 2c 20 73 52 65 73 75 j-1, zAns, sResu
6380: 6c 74 2e 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 lt.z);. }.
6390: 20 20 20 20 20 67 2e 6e 54 65 73 74 2b 2b 3b 0a g.nTest++;.
63a0: 20 20 20 20 20 20 73 74 72 69 6e 67 52 65 73 65 stringRese
63b0: 74 28 26 73 52 65 73 75 6c 74 29 3b 0a 20 20 20 t(&sResult);.
63c0: 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a 20 }else.. /*.
63d0: 20 20 20 2a 2a 20 20 2d 2d 67 6c 6f 62 20 41 4e ** --glob AN
63e0: 53 57 45 52 2e 2e 2e 0a 20 20 20 20 2a 2a 20 20 SWER.... **
63f0: 2d 2d 6e 6f 74 67 6c 6f 62 20 41 4e 53 57 45 52 --notglob ANSWER
6400: 2e 2e 2e 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 ..... **.
6410: 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 ** Check to see
6420: 69 66 20 6f 75 74 70 75 74 20 64 6f 65 73 20 6f if output does o
6430: 72 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 r does not match
6440: 20 74 68 65 20 67 6c 6f 62 20 70 61 74 74 65 72 the glob patter
6450: 6e 0a 20 20 20 20 2a 2a 20 41 4e 53 57 45 52 2e n. ** ANSWER.
6460: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 . */. if(
6470: 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 67 6c strcmp(zCmd, "gl
6480: 6f 62 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63 6d ob")==0 || strcm
6490: 70 28 7a 43 6d 64 2c 20 22 6e 6f 74 67 6c 6f 62 p(zCmd, "notglob
64a0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 ")==0 ){. i
64b0: 6e 74 20 6a 6a 3b 0a 20 20 20 20 20 20 63 68 61 nt jj;. cha
64c0: 72 20 2a 7a 41 6e 73 20 3d 20 7a 53 63 72 69 70 r *zAns = zScrip
64d0: 74 2b 69 69 3b 0a 20 20 20 20 20 20 63 68 61 72 t+ii;. char
64e0: 20 2a 7a 43 6f 70 79 3b 0a 20 20 20 20 20 20 69 *zCopy;. i
64f0: 6e 74 20 69 73 47 6c 6f 62 20 3d 20 28 7a 43 6d nt isGlob = (zCm
6500: 64 5b 30 5d 3d 3d 27 67 27 29 3b 0a 20 20 20 20 d[0]=='g');.
6510: 20 20 66 6f 72 28 6a 6a 3d 39 2d 33 2a 69 73 47 for(jj=9-3*isG
6520: 6c 6f 62 3b 20 6a 6a 3c 6c 65 6e 2d 31 20 26 26 lob; jj<len-1 &&
6530: 20 49 53 53 50 41 43 45 28 7a 41 6e 73 5b 6a 6a ISSPACE(zAns[jj
6540: 5d 29 3b 20 6a 6a 2b 2b 29 7b 7d 0a 20 20 20 20 ]); jj++){}.
6550: 20 20 7a 41 6e 73 20 2b 3d 20 6a 6a 3b 0a 20 20 zAns += jj;.
6560: 20 20 20 20 7a 43 6f 70 79 20 3d 20 73 71 6c 69 zCopy = sqli
6570: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 2e 2a te3_mprintf("%.*
6580: 73 22 2c 20 6c 65 6e 2d 6a 6a 2d 31 2c 20 7a 41 s", len-jj-1, zA
6590: 6e 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 ns);. if( (
65a0: 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 sqlite3_strglob(
65b0: 7a 43 6f 70 79 2c 20 73 52 65 73 75 6c 74 2e 7a zCopy, sResult.z
65c0: 29 3d 3d 30 29 5e 69 73 47 6c 6f 62 20 29 7b 0a )==0)^isGlob ){.
65d0: 20 20 20 20 20 20 20 20 65 72 72 6f 72 4d 65 73 errorMes
65e0: 73 61 67 65 28 22 6c 69 6e 65 20 25 64 20 6f 66 sage("line %d of
65f0: 20 25 73 3a 5c 6e 45 78 70 65 63 74 65 64 20 5b %s:\nExpected [
6600: 25 73 5d 5c 6e 20 20 20 20 20 47 6f 74 20 5b 25 %s]\n Got [%
6610: 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 s]",. p
6620: 72 65 76 4c 69 6e 65 2c 20 7a 46 69 6c 65 6e 61 revLine, zFilena
6630: 6d 65 2c 20 7a 43 6f 70 79 2c 20 73 52 65 73 75 me, zCopy, sResu
6640: 6c 74 2e 7a 29 3b 0a 20 20 20 20 20 20 7d 0a 20 lt.z);. }.
6650: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 sqlite3_fre
6660: 65 28 7a 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 e(zCopy);.
6670: 67 2e 6e 54 65 73 74 2b 2b 3b 0a 20 20 20 20 20 g.nTest++;.
6680: 20 73 74 72 69 6e 67 52 65 73 65 74 28 26 73 52 stringReset(&sR
6690: 65 73 75 6c 74 29 3b 0a 20 20 20 20 7d 65 6c 73 esult);. }els
66a0: 65 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a e.. /*. **
66b0: 20 20 2d 2d 6f 75 74 70 75 74 0a 20 20 20 20 2a --output. *
66c0: 2a 0a 20 20 20 20 2a 2a 20 4f 75 74 70 75 74 20 *. ** Output
66d0: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 the result of th
66e0: 65 20 70 72 65 76 69 6f 75 73 20 53 51 4c 2e 0a e previous SQL..
66f0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 */. if( s
6700: 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 6f 75 74 trcmp(zCmd, "out
6710: 70 75 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 put")==0 ){.
6720: 20 20 6c 6f 67 4d 65 73 73 61 67 65 28 22 25 73 logMessage("%s
6730: 22 2c 20 73 52 65 73 75 6c 74 2e 7a 29 3b 0a 20 ", sResult.z);.
6740: 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a }else.. /*
6750: 0a 20 20 20 20 2a 2a 20 20 2d 2d 73 6f 75 72 63 . ** --sourc
6760: 65 20 46 49 4c 45 4e 41 4d 45 0a 20 20 20 20 2a e FILENAME. *
6770: 2a 0a 20 20 20 20 2a 2a 20 52 75 6e 20 61 20 73 *. ** Run a s
6780: 75 62 73 63 72 69 70 74 20 66 72 6f 6d 20 61 20 ubscript from a
6790: 73 65 70 61 72 61 74 65 20 66 69 6c 65 2e 0a 20 separate file..
67a0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 */. if( st
67b0: 72 63 6d 70 28 7a 43 6d 64 2c 20 22 73 6f 75 72 rcmp(zCmd, "sour
67c0: 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 ce")==0 ){.
67d0: 20 63 68 61 72 20 2a 7a 4e 65 77 46 69 6c 65 2c char *zNewFile,
67e0: 20 2a 7a 4e 65 77 53 63 72 69 70 74 3b 0a 20 20 *zNewScript;.
67f0: 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 44 65 6c char *zToDel
6800: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7a 4e 65 77 = 0;. zNew
6810: 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 30 5d 3b File = azArg[0];
6820: 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 44 69 . if( !isDi
6830: 72 53 65 70 28 7a 4e 65 77 46 69 6c 65 5b 30 5d rSep(zNewFile[0]
6840: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 ) ){. int
6850: 20 6b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 k;. for(
6860: 6b 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 46 k=(int)strlen(zF
6870: 69 6c 65 6e 61 6d 65 29 2d 31 3b 20 6b 3e 3d 30 ilename)-1; k>=0
6880: 20 26 26 20 21 69 73 44 69 72 53 65 70 28 7a 46 && !isDirSep(zF
6890: 69 6c 65 6e 61 6d 65 5b 6b 5d 29 3b 20 6b 2d 2d ilename[k]); k--
68a0: 29 7b 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 ){}. if(
68b0: 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 k>0 ){.
68c0: 20 7a 4e 65 77 46 69 6c 65 20 3d 20 7a 54 6f 44 zNewFile = zToD
68d0: 65 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 el = sqlite3_mpr
68e0: 69 6e 74 66 28 22 25 2e 2a 73 2f 25 73 22 2c 20 intf("%.*s/%s",
68f0: 6b 2c 7a 46 69 6c 65 6e 61 6d 65 2c 7a 4e 65 77 k,zFilename,zNew
6900: 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d File);. }
6910: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a . }. z
6920: 4e 65 77 53 63 72 69 70 74 20 3d 20 72 65 61 64 NewScript = read
6930: 46 69 6c 65 28 7a 4e 65 77 46 69 6c 65 29 3b 0a File(zNewFile);.
6940: 20 20 20 20 20 20 69 66 28 20 67 2e 69 54 72 61 if( g.iTra
6950: 63 65 20 29 20 6c 6f 67 4d 65 73 73 61 67 65 28 ce ) logMessage(
6960: 22 62 65 67 69 6e 20 73 63 72 69 70 74 20 5b 25 "begin script [%
6970: 73 5d 5c 6e 22 2c 20 7a 4e 65 77 46 69 6c 65 29 s]\n", zNewFile)
6980: 3b 0a 20 20 20 20 20 20 72 75 6e 53 63 72 69 70 ;. runScrip
6990: 74 28 30 2c 20 30 2c 20 7a 4e 65 77 53 63 72 69 t(0, 0, zNewScri
69a0: 70 74 2c 20 7a 4e 65 77 46 69 6c 65 29 3b 0a 20 pt, zNewFile);.
69b0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 sqlite3_fre
69c0: 65 28 7a 4e 65 77 53 63 72 69 70 74 29 3b 0a 20 e(zNewScript);.
69d0: 20 20 20 20 20 69 66 28 20 67 2e 69 54 72 61 63 if( g.iTrac
69e0: 65 20 29 20 6c 6f 67 4d 65 73 73 61 67 65 28 22 e ) logMessage("
69f0: 65 6e 64 20 73 63 72 69 70 74 20 5b 25 73 5d 5c end script [%s]\
6a00: 6e 22 2c 20 7a 4e 65 77 46 69 6c 65 29 3b 0a 20 n", zNewFile);.
6a10: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 sqlite3_fre
6a20: 65 28 7a 54 6f 44 65 6c 29 3b 0a 20 20 20 20 7d e(zToDel);. }
6a30: 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 else.. /*.
6a40: 20 2a 2a 20 20 2d 2d 70 72 69 6e 74 20 4d 45 53 ** --print MES
6a50: 53 41 47 45 2e 2e 2e 2e 0a 20 20 20 20 2a 2a 0a SAGE..... **.
6a60: 20 20 20 20 2a 2a 20 4f 75 74 70 75 74 20 74 68 ** Output th
6a70: 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 e remainder of t
6a80: 68 65 20 6c 69 6e 65 20 74 6f 20 74 68 65 20 6c he line to the l
6a90: 6f 67 20 66 69 6c 65 0a 20 20 20 20 2a 2f 0a 20 og file. */.
6aa0: 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 if( strcmp(zC
6ab0: 6d 64 2c 20 22 70 72 69 6e 74 22 29 3d 3d 30 20 md, "print")==0
6ac0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6a 6a 3b ){. int jj;
6ad0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 37 3b . for(jj=7;
6ae0: 20 6a 6a 3c 6c 65 6e 20 26 26 20 49 53 53 50 41 jj<len && ISSPA
6af0: 43 45 28 7a 53 63 72 69 70 74 5b 69 69 2b 6a 6a CE(zScript[ii+jj
6b00: 5d 29 3b 20 6a 6a 2b 2b 29 7b 7d 0a 20 20 20 20 ]); jj++){}.
6b10: 20 20 6c 6f 67 4d 65 73 73 61 67 65 28 22 25 2e logMessage("%.
6b20: 2a 73 22 2c 20 6c 65 6e 2d 6a 6a 2c 20 7a 53 63 *s", len-jj, zSc
6b30: 72 69 70 74 2b 69 69 2b 6a 6a 29 3b 0a 20 20 20 ript+ii+jj);.
6b40: 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a 20 }else.. /*.
6b50: 20 20 20 2a 2a 20 20 2d 2d 69 66 20 45 58 50 52 ** --if EXPR
6b60: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 . **. ** S
6b70: 6b 69 70 20 66 6f 72 77 61 72 64 20 74 6f 20 74 kip forward to t
6b80: 68 65 20 6e 65 78 74 20 6d 61 74 63 68 69 6e 67 he next matching
6b90: 20 2d 2d 65 6e 64 69 66 20 6f 72 20 2d 2d 65 6c --endif or --el
6ba0: 73 65 20 69 66 20 45 58 50 52 20 69 73 20 66 61 se if EXPR is fa
6bb0: 6c 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 lse.. */.
6bc0: 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c if( strcmp(zCmd,
6bd0: 20 22 69 66 22 29 3d 3d 30 20 29 7b 0a 20 20 20 "if")==0 ){.
6be0: 20 20 20 69 6e 74 20 6a 6a 2c 20 72 63 3b 0a 20 int jj, rc;.
6bf0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d sqlite3_stm
6c00: 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 t *pStmt;.
6c10: 66 6f 72 28 6a 6a 3d 34 3b 20 6a 6a 3c 6c 65 6e for(jj=4; jj<len
6c20: 20 26 26 20 49 53 53 50 41 43 45 28 7a 53 63 72 && ISSPACE(zScr
6c30: 69 70 74 5b 69 69 2b 6a 6a 5d 29 3b 20 6a 6a 2b ipt[ii+jj]); jj+
6c40: 2b 29 7b 7d 0a 20 20 20 20 20 20 70 53 74 6d 74 +){}. pStmt
6c50: 20 3d 20 70 72 65 70 61 72 65 53 71 6c 28 22 53 = prepareSql("S
6c60: 45 4c 45 43 54 20 25 2e 2a 73 22 2c 20 6c 65 6e ELECT %.*s", len
6c70: 2d 6a 6a 2c 20 7a 53 63 72 69 70 74 2b 69 69 2b -jj, zScript+ii+
6c80: 6a 6a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 jj);. rc =
6c90: 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 sqlite3_step(pSt
6ca0: 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 mt);. if( r
6cb0: 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 7c 7c c!=SQLITE_ROW ||
6cc0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f sqlite3_column_
6cd0: 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3d 3d 30 int(pStmt, 0)==0
6ce0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 69 20 2b ){. ii +
6cf0: 3d 20 66 69 6e 64 45 6e 64 69 66 28 7a 53 63 72 = findEndif(zScr
6d00: 69 70 74 2b 69 69 2b 6c 65 6e 2c 20 31 2c 20 26 ipt+ii+len, 1, &
6d10: 6c 69 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 7d lineno);. }
6d20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 . sqlite3_f
6d30: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a inalize(pStmt);.
6d40: 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f }else.. /
6d50: 2a 0a 20 20 20 20 2a 2a 20 20 2d 2d 65 6c 73 65 *. ** --else
6d60: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 . **. ** T
6d70: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63 61 6e 20 his command can
6d80: 6f 6e 6c 79 20 62 65 20 65 6e 63 6f 75 6e 74 65 only be encounte
6d90: 72 65 64 20 69 66 20 63 75 72 72 65 6e 74 6c 79 red if currently
6da0: 20 69 6e 73 69 64 65 20 61 6e 20 2d 2d 69 66 20 inside an --if
6db0: 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 that. ** is t
6dc0: 72 75 65 2e 20 20 53 6b 69 70 20 66 6f 72 77 61 rue. Skip forwa
6dd0: 72 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6d rd to the next m
6de0: 61 74 63 68 69 6e 67 20 2d 2d 65 6e 64 69 66 2e atching --endif.
6df0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 . */. if(
6e00: 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 65 6c strcmp(zCmd, "el
6e10: 73 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 se")==0 ){.
6e20: 20 69 69 20 2b 3d 20 66 69 6e 64 45 6e 64 69 66 ii += findEndif
6e30: 28 7a 53 63 72 69 70 74 2b 69 69 2b 6c 65 6e 2c (zScript+ii+len,
6e40: 20 30 2c 20 26 6c 69 6e 65 6e 6f 29 3b 0a 20 20 0, &lineno);.
6e50: 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a }else.. /*.
6e60: 20 20 20 20 2a 2a 20 20 2d 2d 65 6e 64 69 66 0a ** --endif.
6e70: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 **. ** Th
6e80: 69 73 20 63 6f 6d 6d 61 6e 64 20 63 61 6e 20 6f is command can o
6e90: 6e 6c 79 20 62 65 20 65 6e 63 6f 75 6e 74 65 72 nly be encounter
6ea0: 65 64 20 69 66 20 63 75 72 72 65 6e 74 6c 79 20 ed if currently
6eb0: 69 6e 73 69 64 65 20 61 6e 20 2d 2d 69 66 20 74 inside an --if t
6ec0: 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 74 72 hat. ** is tr
6ed0: 75 65 20 6f 72 20 61 6e 20 2d 2d 65 6c 73 65 20 ue or an --else
6ee0: 6f 66 20 61 20 66 61 6c 73 65 20 69 66 2e 20 20 of a false if.
6ef0: 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e This is a no-op.
6f00: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 . */. if(
6f10: 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 65 6e strcmp(zCmd, "en
6f20: 64 69 66 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 dif")==0 ){.
6f30: 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 /* no-op */.
6f40: 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a }else.. /*.
6f50: 20 20 20 20 2a 2a 20 20 2d 2d 73 74 61 72 74 20 ** --start
6f60: 43 4c 49 45 4e 54 0a 20 20 20 20 2a 2a 0a 20 20 CLIENT. **.
6f70: 20 20 2a 2a 20 53 74 61 72 74 20 75 70 20 74 68 ** Start up th
6f80: 65 20 67 69 76 65 6e 20 63 6c 69 65 6e 74 2e 0a e given client..
6f90: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 */. if( s
6fa0: 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 73 74 61 trcmp(zCmd, "sta
6fb0: 72 74 22 29 3d 3d 30 20 26 26 20 69 43 6c 69 65 rt")==0 && iClie
6fc0: 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 nt==0 ){. i
6fd0: 6e 74 20 69 4e 65 77 43 6c 69 65 6e 74 20 3d 20 nt iNewClient =
6fe0: 61 74 6f 69 28 61 7a 41 72 67 5b 30 5d 29 3b 0a atoi(azArg[0]);.
6ff0: 20 20 20 20 20 20 69 66 28 20 69 4e 65 77 43 6c if( iNewCl
7000: 69 65 6e 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 ient>0 ){.
7010: 20 20 73 74 61 72 74 43 6c 69 65 6e 74 28 69 4e startClient(iN
7020: 65 77 43 6c 69 65 6e 74 29 3b 0a 20 20 20 20 20 ewClient);.
7030: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 }. }else..
7040: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 2d 2d 77 /*. ** --w
7050: 61 69 74 20 43 4c 49 45 4e 54 20 54 49 4d 45 4f ait CLIENT TIMEO
7060: 55 54 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a UT. **. **
7070: 20 57 61 69 74 20 75 6e 74 69 6c 20 61 6c 6c 20 Wait until all
7080: 74 61 73 6b 73 20 63 6f 6d 70 6c 65 74 65 20 66 tasks complete f
7090: 6f 72 20 74 68 65 20 67 69 76 65 6e 20 63 6c 69 or the given cli
70a0: 65 6e 74 2e 20 20 49 66 20 43 4c 49 45 4e 54 20 ent. If CLIENT
70b0: 69 73 0a 20 20 20 20 2a 2a 20 22 61 6c 6c 22 20 is. ** "all"
70c0: 74 68 65 6e 20 77 61 69 74 20 66 6f 72 20 61 6c then wait for al
70d0: 6c 20 63 6c 69 65 6e 74 73 20 74 6f 20 63 6f 6d l clients to com
70e0: 70 6c 65 74 65 2e 20 20 57 61 69 74 20 6e 6f 20 plete. Wait no
70f0: 6c 6f 6e 67 65 72 20 74 68 61 6e 0a 20 20 20 20 longer than.
7100: 2a 2a 20 54 49 4d 45 4f 55 54 20 6d 69 6c 6c 69 ** TIMEOUT milli
7110: 73 65 63 6f 6e 64 73 20 28 64 65 66 61 75 6c 74 seconds (default
7120: 20 31 30 2c 30 30 30 29 0a 20 20 20 20 2a 2f 0a 10,000). */.
7130: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a if( strcmp(z
7140: 43 6d 64 2c 20 22 77 61 69 74 22 29 3d 3d 30 20 Cmd, "wait")==0
7150: 26 26 20 69 43 6c 69 65 6e 74 3d 3d 30 20 29 7b && iClient==0 ){
7160: 0a 20 20 20 20 20 20 69 6e 74 20 69 54 69 6d 65 . int iTime
7170: 6f 75 74 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 out = nArg>=2 ?
7180: 61 74 6f 69 28 61 7a 41 72 67 5b 31 5d 29 20 3a atoi(azArg[1]) :
7190: 20 31 30 30 30 30 3b 0a 20 20 20 20 20 20 73 71 10000;. sq
71a0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 lite3_snprintf(s
71b0: 69 7a 65 6f 66 28 7a 45 72 72 6f 72 29 2c 7a 45 izeof(zError),zE
71c0: 72 72 6f 72 2c 22 6c 69 6e 65 20 25 64 20 6f 66 rror,"line %d of
71d0: 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 %s\n",.
71e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 p
71f0: 72 65 76 4c 69 6e 65 2c 20 7a 46 69 6c 65 6e 61 revLine, zFilena
7200: 6d 65 29 3b 0a 20 20 20 20 20 20 77 61 69 74 46 me);. waitF
7210: 6f 72 43 6c 69 65 6e 74 28 61 74 6f 69 28 61 7a orClient(atoi(az
7220: 41 72 67 5b 30 5d 29 2c 20 69 54 69 6d 65 6f 75 Arg[0]), iTimeou
7230: 74 2c 20 7a 45 72 72 6f 72 29 3b 0a 20 20 20 20 t, zError);.
7240: 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a 20 20 }else.. /*.
7250: 20 20 2a 2a 20 20 2d 2d 74 61 73 6b 20 43 4c 49 ** --task CLI
7260: 45 4e 54 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c ENT. ** <
7270: 74 61 73 6b 2d 63 6f 6e 74 65 6e 74 2d 68 65 72 task-content-her
7280: 65 3e 0a 20 20 20 20 2a 2a 20 20 2d 2d 65 6e 64 e>. ** --end
7290: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 . **. ** A
72a0: 73 73 69 67 6e 20 77 6f 72 6b 20 74 6f 20 61 20 ssign work to a
72b0: 63 6c 69 65 6e 74 2e 20 20 53 74 61 72 74 20 74 client. Start t
72c0: 68 65 20 63 6c 69 65 6e 74 20 69 66 20 69 74 20 he client if it
72d0: 69 73 20 6e 6f 74 20 72 75 6e 6e 69 6e 67 0a 20 is not running.
72e0: 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 ** already..
72f0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 */. if( st
7300: 72 63 6d 70 28 7a 43 6d 64 2c 20 22 74 61 73 6b rcmp(zCmd, "task
7310: 22 29 3d 3d 30 20 26 26 20 69 43 6c 69 65 6e 74 ")==0 && iClient
7320: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 ==0 ){. int
7330: 20 69 54 61 72 67 65 74 20 3d 20 61 74 6f 69 28 iTarget = atoi(
7340: 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 azArg[0]);.
7350: 20 69 6e 74 20 69 45 6e 64 3b 0a 20 20 20 20 20 int iEnd;.
7360: 20 63 68 61 72 20 2a 7a 54 61 73 6b 3b 0a 20 20 char *zTask;.
7370: 20 20 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 char *zTName
7380: 3b 0a 20 20 20 20 20 20 69 45 6e 64 20 3d 20 66 ;. iEnd = f
7390: 69 6e 64 45 6e 64 28 7a 53 63 72 69 70 74 2b 69 indEnd(zScript+i
73a0: 69 2b 6c 65 6e 2c 20 26 6c 69 6e 65 6e 6f 29 3b i+len, &lineno);
73b0: 0a 20 20 20 20 20 20 69 66 28 20 69 54 61 72 67 . if( iTarg
73c0: 65 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 et<0 ){.
73d0: 65 72 72 6f 72 4d 65 73 73 61 67 65 28 22 6c 69 errorMessage("li
73e0: 6e 65 20 25 64 20 6f 66 20 25 73 3a 20 62 61 64 ne %d of %s: bad
73f0: 20 63 6c 69 65 6e 74 20 6e 75 6d 62 65 72 3a 20 client number:
7400: 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 %d",.
7410: 20 20 20 20 20 20 20 20 20 20 70 72 65 76 4c 69 prevLi
7420: 6e 65 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 ne, zFilename, i
7430: 54 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d Target);. }
7440: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 54 else{. zT
7450: 61 73 6b 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 ask = sqlite3_mp
7460: 72 69 6e 74 66 28 22 25 2e 2a 73 22 2c 20 69 45 rintf("%.*s", iE
7470: 6e 64 2c 20 7a 53 63 72 69 70 74 2b 69 69 2b 6c nd, zScript+ii+l
7480: 65 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 en);. if(
7490: 20 6e 41 72 67 3e 31 20 29 7b 0a 20 20 20 20 20 nArg>1 ){.
74a0: 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d 20 73 71 zTName = sq
74b0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 lite3_mprintf("%
74c0: 73 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 s", azArg[1]);.
74d0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 }else{.
74e0: 20 20 20 20 20 20 20 20 7a 54 4e 61 6d 65 20 3d zTName =
74f0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 sqlite3_mprintf
7500: 28 22 25 73 3a 25 64 22 2c 20 66 69 6c 65 6e 61 ("%s:%d", filena
7510: 6d 65 54 61 69 6c 28 7a 46 69 6c 65 6e 61 6d 65 meTail(zFilename
7520: 29 2c 20 70 72 65 76 4c 69 6e 65 29 3b 0a 20 20 ), prevLine);.
7530: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 }.
7540: 73 74 61 72 74 43 6c 69 65 6e 74 28 69 54 61 72 startClient(iTar
7550: 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 72 75 get);. ru
7560: 6e 53 71 6c 28 22 49 4e 53 45 52 54 20 49 4e 54 nSql("INSERT INT
7570: 4f 20 74 61 73 6b 28 63 6c 69 65 6e 74 2c 73 63 O task(client,sc
7580: 72 69 70 74 2c 6e 61 6d 65 29 22 0a 20 20 20 20 ript,name)".
7590: 20 20 20 20 20 20 20 20 20 20 20 22 20 56 41 4c " VAL
75a0: 55 45 53 28 25 64 2c 27 25 71 27 2c 25 51 29 22 UES(%d,'%q',%Q)"
75b0: 2c 20 69 54 61 72 67 65 74 2c 20 7a 54 61 73 6b , iTarget, zTask
75c0: 2c 20 7a 54 4e 61 6d 65 29 3b 0a 20 20 20 20 20 , zTName);.
75d0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 sqlite3_free(
75e0: 7a 54 61 73 6b 29 3b 0a 20 20 20 20 20 20 20 20 zTask);.
75f0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 4e sqlite3_free(zTN
7600: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 ame);. }.
7610: 20 20 20 20 69 45 6e 64 20 2b 3d 20 74 6f 6b 65 iEnd += toke
7620: 6e 4c 65 6e 67 74 68 28 7a 53 63 72 69 70 74 2b nLength(zScript+
7630: 69 69 2b 6c 65 6e 2b 69 45 6e 64 2c 20 26 6c 69 ii+len+iEnd, &li
7640: 6e 65 6e 6f 29 3b 0a 20 20 20 20 20 20 6c 65 6e neno);. len
7650: 20 2b 3d 20 69 45 6e 64 3b 0a 20 20 20 20 20 20 += iEnd;.
7660: 69 42 65 67 69 6e 20 3d 20 69 69 2b 6c 65 6e 3b iBegin = ii+len;
7670: 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 . }else..
7680: 2f 2a 0a 20 20 20 20 2a 2a 20 20 2d 2d 62 72 65 /*. ** --bre
7690: 61 6b 70 6f 69 6e 74 0a 20 20 20 20 2a 2a 0a 20 akpoint. **.
76a0: 20 20 20 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 ** This comma
76b0: 6e 64 20 63 61 6c 6c 73 20 22 74 65 73 74 5f 62 nd calls "test_b
76c0: 72 65 61 6b 70 6f 69 6e 74 28 29 22 20 77 68 69 reakpoint()" whi
76d0: 63 68 20 69 73 20 61 20 72 6f 75 74 69 6e 65 20 ch is a routine
76e0: 70 72 6f 76 69 64 65 64 0a 20 20 20 20 2a 2a 20 provided. **
76f0: 61 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 as a convenient
7700: 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 64 place to set a d
7710: 65 62 75 67 67 65 72 20 62 72 65 61 6b 70 6f 69 ebugger breakpoi
7720: 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 nt.. */. i
7730: 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 f( strcmp(zCmd,
7740: 22 62 72 65 61 6b 70 6f 69 6e 74 22 29 3d 3d 30 "breakpoint")==0
7750: 20 29 7b 0a 20 20 20 20 20 20 74 65 73 74 5f 62 ){. test_b
7760: 72 65 61 6b 70 6f 69 6e 74 28 29 3b 0a 20 20 20 reakpoint();.
7770: 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 0a 20 }else.. /*.
7780: 20 20 20 2a 2a 20 20 2d 2d 73 68 6f 77 2d 73 71 ** --show-sq
7790: 6c 2d 65 72 72 6f 72 73 20 42 4f 4f 4c 45 41 4e l-errors BOOLEAN
77a0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 . **. ** T
77b0: 75 72 6e 20 64 69 73 70 6c 61 79 20 6f 66 20 53 urn display of S
77c0: 51 4c 20 65 72 72 6f 72 73 20 6f 6e 20 61 6e 64 QL errors on and
77d0: 20 6f 66 66 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 off.. */.
77e0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 if( strcmp(zCmd
77f0: 2c 20 22 73 68 6f 77 2d 73 71 6c 2d 65 72 72 6f , "show-sql-erro
7800: 72 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 rs")==0 ){.
7810: 20 67 2e 62 49 67 6e 6f 72 65 53 71 6c 45 72 72 g.bIgnoreSqlErr
7820: 6f 72 73 20 3d 20 6e 41 72 67 3e 3d 31 20 3f 20 ors = nArg>=1 ?
7830: 21 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a !booleanValue(az
7840: 41 72 67 5b 30 5d 29 20 3a 20 31 3b 0a 20 20 20 Arg[0]) : 1;.
7850: 20 7d 65 6c 73 65 0a 0a 0a 20 20 20 20 2f 2a 20 }else... /*
7860: 65 72 72 6f 72 20 2a 2f 7b 0a 20 20 20 20 20 20 error */{.
7870: 65 72 72 6f 72 4d 65 73 73 61 67 65 28 22 6c 69 errorMessage("li
7880: 6e 65 20 25 64 20 6f 66 20 25 73 3a 20 75 6e 6b ne %d of %s: unk
7890: 6e 6f 77 6e 20 63 6f 6d 6d 61 6e 64 20 2d 2d 25 nown command --%
78a0: 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 s",.
78b0: 20 20 20 20 20 20 20 70 72 65 76 4c 69 6e 65 2c prevLine,
78c0: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 43 6d 64 zFilename, zCmd
78d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 69 20 );. }. ii
78e0: 2b 3d 20 6c 65 6e 3b 0a 20 20 7d 0a 20 20 69 66 += len;. }. if
78f0: 28 20 69 42 65 67 69 6e 3c 69 69 20 29 7b 0a 20 ( iBegin<ii ){.
7900: 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 char *zSql =
7910: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 sqlite3_mprintf(
7920: 22 25 2e 2a 73 22 2c 20 69 69 2d 69 42 65 67 69 "%.*s", ii-iBegi
7930: 6e 2c 20 7a 53 63 72 69 70 74 2b 69 42 65 67 69 n, zScript+iBegi
7940: 6e 29 3b 0a 20 20 20 20 72 75 6e 53 71 6c 28 7a n);. runSql(z
7950: 53 71 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 Sql);. sqlite
7960: 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 3_free(zSql);.
7970: 7d 0a 20 20 73 74 72 69 6e 67 46 72 65 65 28 26 }. stringFree(&
7980: 73 52 65 73 75 6c 74 29 3b 0a 7d 0a 0a 2f 2a 0a sResult);.}../*.
7990: 2a 2a 20 4c 6f 6f 6b 20 66 6f 72 20 61 20 63 6f ** Look for a co
79a0: 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f mmand-line optio
79b0: 6e 2e 20 20 49 66 20 70 72 65 73 65 6e 74 2c 20 n. If present,
79c0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 return a pointer
79d0: 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 4e 55 4c 4c ..** Return NULL
79e0: 20 69 66 20 6d 69 73 73 69 6e 67 2e 0a 2a 2a 0a if missing..**.
79f0: 2a 2a 20 68 61 73 41 72 67 3d 3d 30 20 6d 65 61 ** hasArg==0 mea
7a00: 6e 73 20 74 68 65 20 6f 70 74 69 6f 6e 20 69 73 ns the option is
7a10: 20 61 20 66 6c 61 67 2e 20 20 49 74 20 69 73 20 a flag. It is
7a20: 65 69 74 68 65 72 20 70 72 65 73 65 6e 74 20 6f either present o
7a30: 72 20 6e 6f 74 2e 0a 2a 2a 20 68 61 73 41 72 67 r not..** hasArg
7a40: 3d 3d 31 20 6d 65 61 6e 73 20 74 68 65 20 6f 70 ==1 means the op
7a50: 74 69 6f 6e 20 68 61 73 20 61 6e 20 61 72 67 75 tion has an argu
7a60: 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 61 20 ment. Return a
7a70: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 0a 2a pointer to the.*
7a80: 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 * argument..*/.s
7a90: 74 61 74 69 63 20 63 68 61 72 20 2a 66 69 6e 64 tatic char *find
7aa0: 4f 70 74 69 6f 6e 28 0a 20 20 63 68 61 72 20 2a Option(. char *
7ab0: 2a 61 7a 41 72 67 2c 0a 20 20 69 6e 74 20 2a 70 *azArg,. int *p
7ac0: 6e 41 72 67 2c 0a 20 20 63 6f 6e 73 74 20 63 68 nArg,. const ch
7ad0: 61 72 20 2a 7a 4f 70 74 69 6f 6e 2c 0a 20 20 69 ar *zOption,. i
7ae0: 6e 74 20 68 61 73 41 72 67 0a 29 7b 0a 20 20 69 nt hasArg.){. i
7af0: 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 nt i, j;. char
7b00: 2a 7a 52 65 74 75 72 6e 20 3d 20 30 3b 0a 20 20 *zReturn = 0;.
7b10: 69 6e 74 20 6e 41 72 67 20 3d 20 2a 70 6e 41 72 int nArg = *pnAr
7b20: 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 68 61 g;.. assert( ha
7b30: 73 41 72 67 3d 3d 30 20 7c 7c 20 68 61 73 41 72 sArg==0 || hasAr
7b40: 67 3d 3d 31 20 29 3b 0a 20 20 66 6f 72 28 69 3d g==1 );. for(i=
7b50: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0; i<nArg; i++){
7b60: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
7b70: 2a 7a 3b 0a 20 20 20 20 69 66 28 20 69 2b 68 61 *z;. if( i+ha
7b80: 73 41 72 67 20 3e 3d 20 6e 41 72 67 20 29 20 62 sArg >= nArg ) b
7b90: 72 65 61 6b 3b 0a 20 20 20 20 7a 20 3d 20 61 7a reak;. z = az
7ba0: 41 72 67 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 Arg[i];. if(
7bb0: 7a 5b 30 5d 21 3d 27 2d 27 20 29 20 63 6f 6e 74 z[0]!='-' ) cont
7bc0: 69 6e 75 65 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 inue;. z++;.
7bd0: 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 if( z[0]=='-'
7be0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b ){. if( z[
7bf0: 31 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 1]==0 ) break;.
7c00: 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a z++;. }.
7c10: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a if( strcmp(z
7c20: 2c 7a 4f 70 74 69 6f 6e 29 3d 3d 30 20 29 7b 0a ,zOption)==0 ){.
7c30: 20 20 20 20 20 20 69 66 28 20 68 61 73 41 72 67 if( hasArg
7c40: 20 26 26 20 69 3d 3d 6e 41 72 67 2d 31 20 29 7b && i==nArg-1 ){
7c50: 0a 20 20 20 20 20 20 20 20 66 61 74 61 6c 45 72 . fatalEr
7c60: 72 6f 72 28 22 63 6f 6d 6d 61 6e 64 2d 6c 69 6e ror("command-lin
7c70: 65 20 6f 70 74 69 6f 6e 20 5c 22 2d 2d 25 73 5c e option \"--%s\
7c80: 22 20 72 65 71 75 69 72 65 73 20 61 6e 20 61 72 " requires an ar
7c90: 67 75 6d 65 6e 74 22 2c 20 7a 29 3b 0a 20 20 20 gument", z);.
7ca0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 68 }. if( h
7cb0: 61 73 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 asArg ){.
7cc0: 20 7a 52 65 74 75 72 6e 20 3d 20 61 7a 41 72 67 zReturn = azArg
7cd0: 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20 7d 65 6c [i+1];. }el
7ce0: 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 52 65 74 se{. zRet
7cf0: 75 72 6e 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a urn = azArg[i];.
7d00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 20 }. j
7d10: 3d 20 69 2b 31 2b 28 68 61 73 41 72 67 21 3d 30 = i+1+(hasArg!=0
7d20: 29 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 );. while(
7d30: 6a 3c 6e 41 72 67 20 29 20 61 7a 41 72 67 5b 69 j<nArg ) azArg[i
7d40: 2b 2b 5d 20 3d 20 61 7a 41 72 67 5b 6a 2b 2b 5d ++] = azArg[j++]
7d50: 3b 0a 20 20 20 20 20 20 2a 70 6e 41 72 67 20 3d ;. *pnArg =
7d60: 20 69 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e i;. return
7d70: 20 7a 52 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a zReturn;. }.
7d80: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 52 65 }. return zRe
7d90: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 20 50 72 69 6e turn;.}../* Prin
7da0: 74 20 61 20 75 73 61 67 65 20 6d 65 73 73 61 67 t a usage messag
7db0: 65 20 66 6f 72 20 74 68 65 20 70 72 6f 67 72 61 e for the progra
7dc0: 6d 20 61 6e 64 20 65 78 69 74 20 2a 2f 0a 73 74 m and exit */.st
7dd0: 61 74 69 63 20 76 6f 69 64 20 75 73 61 67 65 28 atic void usage(
7de0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 72 67 76 const char *argv
7df0: 30 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 0){. int i;. c
7e00: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c onst char *zTail
7e10: 20 3d 20 61 72 67 76 30 3b 0a 20 20 66 6f 72 28 = argv0;. for(
7e20: 69 3d 30 3b 20 61 72 67 76 30 5b 69 5d 3b 20 69 i=0; argv0[i]; i
7e30: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 73 44 ++){. if( isD
7e40: 69 72 53 65 70 28 61 72 67 76 30 5b 69 5d 29 20 irSep(argv0[i])
7e50: 29 20 7a 54 61 69 6c 20 3d 20 61 72 67 76 30 2b ) zTail = argv0+
7e60: 69 2b 31 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e i+1;. }. fprin
7e70: 74 66 28 73 74 64 65 72 72 2c 22 55 73 61 67 65 tf(stderr,"Usage
7e80: 3a 20 25 73 20 44 41 54 41 42 41 53 45 20 3f 4f : %s DATABASE ?O
7e90: 50 54 49 4f 4e 53 3f 20 3f 53 43 52 49 50 54 3f PTIONS? ?SCRIPT?
7ea0: 5c 6e 22 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 66 \n", zTail);. f
7eb0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 printf(stderr,.
7ec0: 20 20 20 22 4f 70 74 69 6f 6e 73 3a 5c 6e 22 0a "Options:\n".
7ed0: 20 20 20 20 22 20 20 20 2d 2d 65 72 72 6c 6f 67 " --errlog
7ee0: 20 46 49 4c 45 4e 41 4d 45 20 20 20 20 20 20 20 FILENAME
7ef0: 20 20 20 20 57 72 69 74 65 20 65 72 72 6f 72 73 Write errors
7f00: 20 74 6f 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 0a to FILENAME\n".
7f10: 20 20 20 20 22 20 20 20 2d 2d 6a 6f 75 72 6e 61 " --journa
7f20: 6c 6d 6f 64 65 20 4d 4f 44 45 20 20 20 20 20 20 lmode MODE
7f30: 20 20 20 20 55 73 65 20 4d 4f 44 45 20 61 73 20 Use MODE as
7f40: 74 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 the journal_mode
7f50: 5c 6e 22 0a 20 20 20 20 22 20 20 20 2d 2d 6c 6f \n". " --lo
7f60: 67 20 46 49 4c 45 4e 41 4d 45 20 20 20 20 20 20 g FILENAME
7f70: 20 20 20 20 20 20 20 20 4c 6f 67 20 6d 65 73 73 Log mess
7f80: 61 67 65 73 20 74 6f 20 46 49 4c 45 4e 41 4d 45 ages to FILENAME
7f90: 5c 6e 22 0a 20 20 20 20 22 20 20 20 2d 2d 71 75 \n". " --qu
7fa0: 69 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20 iet
7fb0: 20 20 20 20 20 20 20 20 53 75 70 70 72 65 73 73 Suppress
7fc0: 20 75 6e 6e 65 63 65 73 73 61 72 79 20 6f 75 74 unnecessary out
7fd0: 70 75 74 5c 6e 22 0a 20 20 20 20 22 20 20 20 2d put\n". " -
7fe0: 2d 76 66 73 20 4e 41 4d 45 20 20 20 20 20 20 20 -vfs NAME
7ff0: 20 20 20 20 20 20 20 20 20 20 20 55 73 65 20 4e Use N
8000: 41 4d 45 20 61 73 20 74 68 65 20 56 46 53 5c 6e AME as the VFS\n
8010: 22 0a 20 20 20 20 22 20 20 20 2d 2d 72 65 70 65 ". " --repe
8020: 61 74 20 4e 20 20 20 20 20 20 20 20 20 20 20 20 at N
8030: 20 20 20 20 20 20 52 65 70 65 61 74 20 74 68 65 Repeat the
8040: 20 74 65 73 74 20 4e 20 74 69 6d 65 73 5c 6e 22 test N times\n"
8050: 0a 20 20 20 20 22 20 20 20 2d 2d 73 71 6c 74 72 . " --sqltr
8060: 61 63 65 20 20 20 20 20 20 20 20 20 20 20 20 20 ace
8070: 20 20 20 20 20 45 6e 61 62 6c 65 20 53 51 4c 20 Enable SQL
8080: 74 72 61 63 69 6e 67 5c 6e 22 0a 20 20 20 20 22 tracing\n". "
8090: 20 20 20 2d 2d 73 79 6e 63 20 20 20 20 20 20 20 --sync
80a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 E
80b0: 6e 61 62 6c 65 20 73 79 6e 63 68 72 6f 6e 6f 75 nable synchronou
80c0: 73 20 64 69 73 6b 20 77 72 69 74 65 73 5c 6e 22 s disk writes\n"
80d0: 0a 20 20 20 20 22 20 20 20 2d 2d 74 69 6d 65 6f . " --timeo
80e0: 75 74 20 4d 49 4c 4c 49 53 45 43 20 20 20 20 20 ut MILLISEC
80f0: 20 20 20 20 20 42 75 73 79 20 74 69 6d 65 6f 75 Busy timeou
8100: 74 20 69 73 20 4d 49 4c 4c 49 53 45 43 5c 6e 22 t is MILLISEC\n"
8110: 0a 20 20 20 20 22 20 20 20 2d 2d 74 72 61 63 65 . " --trace
8120: 20 42 4f 4f 4c 45 41 4e 20 20 20 20 20 20 20 20 BOOLEAN
8130: 20 20 20 20 20 45 6e 61 62 6c 65 20 6f 72 20 64 Enable or d
8140: 69 73 61 62 6c 65 20 74 72 61 63 69 6e 67 5c 6e isable tracing\n
8150: 22 0a 20 20 29 3b 0a 20 20 65 78 69 74 28 31 29 ". );. exit(1)
8160: 3b 0a 7d 0a 0a 2f 2a 20 52 65 70 6f 72 74 20 6f ;.}../* Report o
8170: 6e 20 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 61 n unrecognized a
8180: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 73 74 61 74 rguments */.stat
8190: 69 63 20 76 6f 69 64 20 75 6e 72 65 63 6f 67 6e ic void unrecogn
81a0: 69 7a 65 64 41 72 67 75 6d 65 6e 74 73 28 0a 20 izedArguments(.
81b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 72 67 const char *arg
81c0: 76 30 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a v0,. int nArg,.
81d0: 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 0a 29 char **azArg.)
81e0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 70 72 {. int i;. fpr
81f0: 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73 3a intf(stderr,"%s:
8200: 20 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20 61 72 unrecognized ar
8210: 67 75 6d 65 6e 74 73 3a 22 2c 20 61 72 67 76 30 guments:", argv0
8220: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c );. for(i=0; i<
8230: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 nArg; i++){.
8240: 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 fprintf(stderr,"
8250: 20 25 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b %s", azArg[i]);
8260: 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74 66 28 73 . }. fprintf(s
8270: 74 64 65 72 72 2c 22 5c 6e 22 29 3b 0a 20 20 65 tderr,"\n");. e
8280: 78 69 74 28 31 29 3b 0a 7d 0a 0a 69 6e 74 20 53 xit(1);.}..int S
8290: 51 4c 49 54 45 5f 43 44 45 43 4c 20 6d 61 69 6e QLITE_CDECL main
82a0: 28 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 (int argc, char
82b0: 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74 **argv){. const
82c0: 20 63 68 61 72 20 2a 7a 43 6c 69 65 6e 74 3b 0a char *zClient;.
82d0: 20 20 69 6e 74 20 69 43 6c 69 65 6e 74 3b 0a 20 int iClient;.
82e0: 20 69 6e 74 20 6e 2c 20 69 3b 0a 20 20 69 6e 74 int n, i;. int
82f0: 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 53 51 4c openFlags = SQL
8300: 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 ITE_OPEN_READWRI
8310: 54 45 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 TE;. int rc;.
8320: 63 68 61 72 20 2a 7a 53 63 72 69 70 74 3b 0a 20 char *zScript;.
8330: 20 69 6e 74 20 74 61 73 6b 49 64 3b 0a 20 20 63 int taskId;. c
8340: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 72 61 63 onst char *zTrac
8350: 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 e;. const char
8360: 2a 7a 43 4f 70 74 69 6f 6e 3b 0a 20 20 63 6f 6e *zCOption;. con
8370: 73 74 20 63 68 61 72 20 2a 7a 4a 4d 6f 64 65 3b st char *zJMode;
8380: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a . const char *z
8390: 4e 52 65 70 3b 0a 20 20 69 6e 74 20 6e 52 65 70 NRep;. int nRep
83a0: 20 3d 20 31 2c 20 69 52 65 70 3b 0a 20 20 69 6e = 1, iRep;. in
83b0: 74 20 69 54 6d 6f 75 74 20 3d 20 30 3b 20 20 20 t iTmout = 0;
83c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 /* De
83d0: 66 61 75 6c 74 3a 20 6e 6f 20 74 69 6d 65 6f 75 fault: no timeou
83e0: 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 t */. const cha
83f0: 72 20 2a 7a 54 6d 6f 75 74 3b 0a 0a 20 20 67 2e r *zTmout;.. g.
8400: 61 72 67 76 30 20 3d 20 61 72 67 76 5b 30 5d 3b argv0 = argv[0];
8410: 0a 20 20 67 2e 69 54 72 61 63 65 20 3d 20 31 3b . g.iTrace = 1;
8420: 0a 20 20 69 66 28 20 61 72 67 63 3c 32 20 29 20 . if( argc<2 )
8430: 75 73 61 67 65 28 61 72 67 76 5b 30 5d 29 3b 0a usage(argv[0]);.
8440: 20 20 67 2e 7a 44 62 46 69 6c 65 20 3d 20 61 72 g.zDbFile = ar
8450: 67 76 5b 31 5d 3b 0a 20 20 69 66 28 20 73 74 72 gv[1];. if( str
8460: 67 6c 6f 62 28 22 2a 2e 74 65 73 74 22 2c 20 67 glob("*.test", g
8470: 2e 7a 44 62 46 69 6c 65 29 20 29 20 75 73 61 67 .zDbFile) ) usag
8480: 65 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 e(argv[0]);. if
8490: 28 20 73 74 72 63 6d 70 28 73 71 6c 69 74 65 33 ( strcmp(sqlite3
84a0: 5f 73 6f 75 72 63 65 69 64 28 29 2c 20 53 51 4c _sourceid(), SQL
84b0: 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 29 21 3d ITE_SOURCE_ID)!=
84c0: 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 0 ){. fprintf
84d0: 28 73 74 64 65 72 72 2c 20 22 53 51 4c 69 74 65 (stderr, "SQLite
84e0: 20 6c 69 62 72 61 72 79 20 61 6e 64 20 68 65 61 library and hea
84f0: 64 65 72 20 6d 69 73 6d 61 74 63 68 5c 6e 22 0a der mismatch\n".
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8510: 20 20 20 20 22 4c 69 62 72 61 72 79 3a 20 25 73 "Library: %s
8520: 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 \n".
8530: 20 20 20 20 20 20 20 20 22 48 65 61 64 65 72 3a "Header:
8540: 20 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 %s\n",.
8550: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c sql
8560: 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 2c ite3_sourceid(),
8570: 20 53 51 4c 49 54 45 5f 53 4f 55 52 43 45 5f 49 SQLITE_SOURCE_I
8580: 44 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b D);. exit(1);
8590: 0a 20 20 7d 0a 20 20 6e 20 3d 20 61 72 67 63 2d . }. n = argc-
85a0: 32 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 2;. sqlite3_snp
85b0: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 67 2e 7a rintf(sizeof(g.z
85c0: 4e 61 6d 65 29 2c 20 67 2e 7a 4e 61 6d 65 2c 20 Name), g.zName,
85d0: 22 25 30 35 64 2e 6d 70 74 65 73 74 22 2c 20 47 "%05d.mptest", G
85e0: 45 54 50 49 44 28 29 29 3b 0a 20 20 7a 4a 4d 6f ETPID());. zJMo
85f0: 64 65 20 3d 20 66 69 6e 64 4f 70 74 69 6f 6e 28 de = findOption(
8600: 61 72 67 76 2b 32 2c 20 26 6e 2c 20 22 6a 6f 75 argv+2, &n, "jou
8610: 72 6e 61 6c 6d 6f 64 65 22 2c 20 31 29 3b 0a 20 rnalmode", 1);.
8620: 20 7a 4e 52 65 70 20 3d 20 66 69 6e 64 4f 70 74 zNRep = findOpt
8630: 69 6f 6e 28 61 72 67 76 2b 32 2c 20 26 6e 2c 20 ion(argv+2, &n,
8640: 22 72 65 70 65 61 74 22 2c 20 31 29 3b 0a 20 20 "repeat", 1);.
8650: 69 66 28 20 7a 4e 52 65 70 20 29 20 6e 52 65 70 if( zNRep ) nRep
8660: 20 3d 20 61 74 6f 69 28 7a 4e 52 65 70 29 3b 0a = atoi(zNRep);.
8670: 20 20 69 66 28 20 6e 52 65 70 3c 31 20 29 20 6e if( nRep<1 ) n
8680: 52 65 70 20 3d 20 31 3b 0a 20 20 67 2e 7a 56 66 Rep = 1;. g.zVf
8690: 73 20 3d 20 66 69 6e 64 4f 70 74 69 6f 6e 28 61 s = findOption(a
86a0: 72 67 76 2b 32 2c 20 26 6e 2c 20 22 76 66 73 22 rgv+2, &n, "vfs"
86b0: 2c 20 31 29 3b 0a 20 20 7a 43 6c 69 65 6e 74 20 , 1);. zClient
86c0: 3d 20 66 69 6e 64 4f 70 74 69 6f 6e 28 61 72 67 = findOption(arg
86d0: 76 2b 32 2c 20 26 6e 2c 20 22 63 6c 69 65 6e 74 v+2, &n, "client
86e0: 22 2c 20 31 29 3b 0a 20 20 67 2e 7a 45 72 72 4c ", 1);. g.zErrL
86f0: 6f 67 20 3d 20 66 69 6e 64 4f 70 74 69 6f 6e 28 og = findOption(
8700: 61 72 67 76 2b 32 2c 20 26 6e 2c 20 22 65 72 72 argv+2, &n, "err
8710: 6c 6f 67 22 2c 20 31 29 3b 0a 20 20 67 2e 7a 4c log", 1);. g.zL
8720: 6f 67 20 3d 20 66 69 6e 64 4f 70 74 69 6f 6e 28 og = findOption(
8730: 61 72 67 76 2b 32 2c 20 26 6e 2c 20 22 6c 6f 67 argv+2, &n, "log
8740: 22 2c 20 31 29 3b 0a 20 20 7a 54 72 61 63 65 20 ", 1);. zTrace
8750: 3d 20 66 69 6e 64 4f 70 74 69 6f 6e 28 61 72 67 = findOption(arg
8760: 76 2b 32 2c 20 26 6e 2c 20 22 74 72 61 63 65 22 v+2, &n, "trace"
8770: 2c 20 31 29 3b 0a 20 20 69 66 28 20 7a 54 72 61 , 1);. if( zTra
8780: 63 65 20 29 20 67 2e 69 54 72 61 63 65 20 3d 20 ce ) g.iTrace =
8790: 61 74 6f 69 28 7a 54 72 61 63 65 29 3b 0a 20 20 atoi(zTrace);.
87a0: 69 66 28 20 66 69 6e 64 4f 70 74 69 6f 6e 28 61 if( findOption(a
87b0: 72 67 76 2b 32 2c 20 26 6e 2c 20 22 71 75 69 65 rgv+2, &n, "quie
87c0: 74 22 2c 20 30 29 21 3d 30 20 29 20 67 2e 69 54 t", 0)!=0 ) g.iT
87d0: 72 61 63 65 20 3d 20 30 3b 0a 20 20 7a 54 6d 6f race = 0;. zTmo
87e0: 75 74 20 3d 20 66 69 6e 64 4f 70 74 69 6f 6e 28 ut = findOption(
87f0: 61 72 67 76 2b 32 2c 20 26 6e 2c 20 22 74 69 6d argv+2, &n, "tim
8800: 65 6f 75 74 22 2c 20 31 29 3b 0a 20 20 69 66 28 eout", 1);. if(
8810: 20 7a 54 6d 6f 75 74 20 29 20 69 54 6d 6f 75 74 zTmout ) iTmout
8820: 20 3d 20 61 74 6f 69 28 7a 54 6d 6f 75 74 29 3b = atoi(zTmout);
8830: 0a 20 20 67 2e 62 53 71 6c 54 72 61 63 65 20 3d . g.bSqlTrace =
8840: 20 66 69 6e 64 4f 70 74 69 6f 6e 28 61 72 67 76 findOption(argv
8850: 2b 32 2c 20 26 6e 2c 20 22 73 71 6c 74 72 61 63 +2, &n, "sqltrac
8860: 65 22 2c 20 30 29 21 3d 30 3b 0a 20 20 67 2e 62 e", 0)!=0;. g.b
8870: 53 79 6e 63 20 3d 20 66 69 6e 64 4f 70 74 69 6f Sync = findOptio
8880: 6e 28 61 72 67 76 2b 32 2c 20 26 6e 2c 20 22 73 n(argv+2, &n, "s
8890: 79 6e 63 22 2c 20 30 29 21 3d 30 3b 0a 20 20 69 ync", 0)!=0;. i
88a0: 66 28 20 67 2e 7a 45 72 72 4c 6f 67 20 29 7b 0a f( g.zErrLog ){.
88b0: 20 20 20 20 67 2e 70 45 72 72 4c 6f 67 20 3d 20 g.pErrLog =
88c0: 66 6f 70 65 6e 28 67 2e 7a 45 72 72 4c 6f 67 2c fopen(g.zErrLog,
88d0: 20 22 61 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a "a");. }else{.
88e0: 20 20 20 20 67 2e 70 45 72 72 4c 6f 67 20 3d 20 g.pErrLog =
88f0: 73 74 64 65 72 72 3b 0a 20 20 7d 0a 20 20 69 66 stderr;. }. if
8900: 28 20 67 2e 7a 4c 6f 67 20 29 7b 0a 20 20 20 20 ( g.zLog ){.
8910: 67 2e 70 4c 6f 67 20 3d 20 66 6f 70 65 6e 28 67 g.pLog = fopen(g
8920: 2e 7a 4c 6f 67 2c 20 22 61 22 29 3b 0a 20 20 7d .zLog, "a");. }
8930: 65 6c 73 65 7b 0a 20 20 20 20 67 2e 70 4c 6f 67 else{. g.pLog
8940: 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7d 0a 20 = stdout;. }.
8950: 20 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 . sqlite3_conf
8960: 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 ig(SQLITE_CONFIG
8970: 5f 4c 4f 47 2c 20 73 71 6c 45 72 72 6f 72 43 61 _LOG, sqlErrorCa
8980: 6c 6c 62 61 63 6b 2c 20 30 29 3b 0a 20 20 69 66 llback, 0);. if
8990: 28 20 7a 43 6c 69 65 6e 74 20 29 7b 0a 20 20 20 ( zClient ){.
89a0: 20 69 43 6c 69 65 6e 74 20 3d 20 61 74 6f 69 28 iClient = atoi(
89b0: 7a 43 6c 69 65 6e 74 29 3b 0a 20 20 20 20 69 66 zClient);. if
89c0: 28 20 69 43 6c 69 65 6e 74 3c 31 20 29 20 66 61 ( iClient<1 ) fa
89d0: 74 61 6c 45 72 72 6f 72 28 22 69 6c 6c 65 67 61 talError("illega
89e0: 6c 20 63 6c 69 65 6e 74 20 6e 75 6d 62 65 72 3a l client number:
89f0: 20 25 64 5c 6e 22 2c 20 69 43 6c 69 65 6e 74 29 %d\n", iClient)
8a00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e ;. sqlite3_sn
8a10: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 67 2e printf(sizeof(g.
8a20: 7a 4e 61 6d 65 29 2c 20 67 2e 7a 4e 61 6d 65 2c zName), g.zName,
8a30: 20 22 25 30 35 64 2e 63 6c 69 65 6e 74 25 30 32 "%05d.client%02
8a40: 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 d",.
8a50: 20 20 20 20 20 20 20 20 20 47 45 54 50 49 44 28 GETPID(
8a60: 29 2c 20 69 43 6c 69 65 6e 74 29 3b 0a 20 20 7d ), iClient);. }
8a70: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e 54 else{. int nT
8a80: 72 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 ry = 0;. if(
8a90: 67 2e 69 54 72 61 63 65 3e 30 20 29 7b 0a 20 20 g.iTrace>0 ){.
8aa0: 20 20 20 20 70 72 69 6e 74 66 28 22 42 45 47 49 printf("BEGI
8ab0: 4e 3a 20 25 73 22 2c 20 61 72 67 76 5b 30 5d 29 N: %s", argv[0])
8ac0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b ;. for(i=1;
8ad0: 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 20 70 72 i<argc; i++) pr
8ae0: 69 6e 74 66 28 22 20 25 73 22 2c 20 61 72 67 76 intf(" %s", argv
8af0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70 72 69 6e [i]);. prin
8b00: 74 66 28 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 tf("\n");.
8b10: 70 72 69 6e 74 66 28 22 57 69 74 68 20 53 51 4c printf("With SQL
8b20: 69 74 65 20 22 20 53 51 4c 49 54 45 5f 56 45 52 ite " SQLITE_VER
8b30: 53 49 4f 4e 20 22 20 22 20 53 51 4c 49 54 45 5f SION " " SQLITE_
8b40: 53 4f 55 52 43 45 5f 49 44 20 22 5c 6e 22 20 29 SOURCE_ID "\n" )
8b50: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b ;. for(i=0;
8b60: 20 28 7a 43 4f 70 74 69 6f 6e 20 3d 20 73 71 6c (zCOption = sql
8b70: 69 74 65 33 5f 63 6f 6d 70 69 6c 65 6f 70 74 69 ite3_compileopti
8b80: 6f 6e 5f 67 65 74 28 69 29 29 21 3d 30 3b 20 69 on_get(i))!=0; i
8b90: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 72 69 ++){. pri
8ba0: 6e 74 66 28 22 2d 44 53 51 4c 49 54 45 5f 25 73 ntf("-DSQLITE_%s
8bb0: 5c 6e 22 2c 20 7a 43 4f 70 74 69 6f 6e 29 3b 0a \n", zCOption);.
8bc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 66 }. ff
8bd0: 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 lush(stdout);.
8be0: 20 20 7d 0a 20 20 20 20 69 43 6c 69 65 6e 74 20 }. iClient
8bf0: 3d 20 20 30 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 = 0;. do{.
8c00: 20 20 20 20 69 66 28 20 28 6e 54 72 79 25 35 29 if( (nTry%5)
8c10: 3d 3d 34 20 29 20 70 72 69 6e 74 66 28 22 2e 2e ==4 ) printf("..
8c20: 2e 20 25 73 74 72 79 69 6e 67 20 74 6f 20 75 6e . %strying to un
8c30: 6c 69 6e 6b 20 27 25 73 27 5c 6e 22 2c 0a 20 20 link '%s'\n",.
8c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 54 72 nTr
8c60: 79 3e 35 20 3f 20 22 73 74 69 6c 6c 20 22 20 3a y>5 ? "still " :
8c70: 20 22 22 2c 20 67 2e 7a 44 62 46 69 6c 65 29 3b "", g.zDbFile);
8c80: 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 6c 69 . rc = unli
8c90: 6e 6b 28 67 2e 7a 44 62 46 69 6c 65 29 3b 0a 20 nk(g.zDbFile);.
8ca0: 20 20 20 20 20 69 66 28 20 72 63 20 26 26 20 65 if( rc && e
8cb0: 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20 29 20 72 rrno==ENOENT ) r
8cc0: 63 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c c = 0;. }whil
8cd0: 65 28 20 72 63 21 3d 30 20 26 26 20 28 2b 2b 6e e( rc!=0 && (++n
8ce0: 54 72 79 29 3c 36 30 20 26 26 20 73 71 6c 69 74 Try)<60 && sqlit
8cf0: 65 33 5f 73 6c 65 65 70 28 31 30 30 30 29 3e 30 e3_sleep(1000)>0
8d00: 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d );. if( rc!=
8d10: 30 20 29 7b 0a 20 20 20 20 20 20 66 61 74 61 6c 0 ){. fatal
8d20: 45 72 72 6f 72 28 22 75 6e 61 62 6c 65 20 74 6f Error("unable to
8d30: 20 75 6e 6c 69 6e 6b 20 27 25 73 27 20 61 66 74 unlink '%s' aft
8d40: 65 72 20 25 64 20 61 74 74 65 6d 70 74 73 5c 6e er %d attempts\n
8d50: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ",.
8d60: 20 20 20 20 67 2e 7a 44 62 46 69 6c 65 2c 20 6e g.zDbFile, n
8d70: 54 72 79 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 Try);. }.
8d80: 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 53 51 4c openFlags |= SQL
8d90: 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b ITE_OPEN_CREATE;
8da0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 . }. rc = sqli
8db0: 74 65 33 5f 6f 70 65 6e 5f 76 32 28 67 2e 7a 44 te3_open_v2(g.zD
8dc0: 62 46 69 6c 65 2c 20 26 67 2e 64 62 2c 20 6f 70 bFile, &g.db, op
8dd0: 65 6e 46 6c 61 67 73 2c 20 67 2e 7a 56 66 73 29 enFlags, g.zVfs)
8de0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 66 61 74 ;. if( rc ) fat
8df0: 61 6c 45 72 72 6f 72 28 22 63 61 6e 6e 6f 74 20 alError("cannot
8e00: 6f 70 65 6e 20 5b 25 73 5d 22 2c 20 67 2e 7a 44 open [%s]", g.zD
8e10: 62 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 69 54 bFile);. if( iT
8e20: 6d 6f 75 74 3e 30 20 29 20 73 71 6c 69 74 65 33 mout>0 ) sqlite3
8e30: 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 67 2e _busy_timeout(g.
8e40: 64 62 2c 20 69 54 6d 6f 75 74 29 3b 0a 20 20 0a db, iTmout);. .
8e50: 20 20 69 66 28 20 7a 4a 4d 6f 64 65 20 29 7b 0a if( zJMode ){.
8e60: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e #if defined(_WIN
8e70: 33 32 29 0a 20 20 20 20 69 66 28 20 73 71 6c 69 32). if( sqli
8e80: 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 4a 4d 6f te3_stricmp(zJMo
8e90: 64 65 2c 22 70 65 72 73 69 73 74 22 29 3d 3d 30 de,"persist")==0
8ea0: 0a 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 . || sqlite3
8eb0: 5f 73 74 72 69 63 6d 70 28 7a 4a 4d 6f 64 65 2c _stricmp(zJMode,
8ec0: 22 74 72 75 6e 63 61 74 65 22 29 3d 3d 30 0a 20 "truncate")==0.
8ed0: 20 20 20 29 7b 0a 20 20 20 20 20 20 70 72 69 6e ){. prin
8ee0: 74 66 28 22 43 68 61 6e 67 69 6e 67 20 6a 6f 75 tf("Changing jou
8ef0: 72 6e 61 6c 20 6d 6f 64 65 20 74 6f 20 44 45 4c rnal mode to DEL
8f00: 45 54 45 20 66 72 6f 6d 20 25 73 22 2c 20 7a 4a ETE from %s", zJ
8f10: 4d 6f 64 65 29 3b 0a 20 20 20 20 20 20 7a 4a 4d Mode);. zJM
8f20: 6f 64 65 20 3d 20 22 44 45 4c 45 54 45 22 3b 0a ode = "DELETE";.
8f30: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 }.#endif.
8f40: 20 72 75 6e 53 71 6c 28 22 50 52 41 47 4d 41 20 runSql("PRAGMA
8f50: 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 25 51 3b journal_mode=%Q;
8f60: 22 2c 20 7a 4a 4d 6f 64 65 29 3b 0a 20 20 7d 0a ", zJMode);. }.
8f70: 20 20 69 66 28 20 21 67 2e 62 53 79 6e 63 20 29 if( !g.bSync )
8f80: 20 74 72 79 53 71 6c 28 22 50 52 41 47 4d 41 20 trySql("PRAGMA
8f90: 73 79 6e 63 68 72 6f 6e 6f 75 73 3d 4f 46 46 22 synchronous=OFF"
8fa0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 );. sqlite3_ena
8fb0: 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 ble_load_extensi
8fc0: 6f 6e 28 67 2e 64 62 2c 20 31 29 3b 0a 20 20 73 on(g.db, 1);. s
8fd0: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 qlite3_busy_hand
8fe0: 6c 65 72 28 67 2e 64 62 2c 20 62 75 73 79 48 61 ler(g.db, busyHa
8ff0: 6e 64 6c 65 72 2c 20 30 29 3b 0a 20 20 73 71 6c ndler, 0);. sql
9000: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 ite3_create_func
9010: 74 69 6f 6e 28 67 2e 64 62 2c 20 22 76 66 73 6e tion(g.db, "vfsn
9020: 61 6d 65 22 2c 20 30 2c 20 53 51 4c 49 54 45 5f ame", 0, SQLITE_
9030: 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 UTF8, 0,.
9040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9050: 20 20 20 76 66 73 4e 61 6d 65 46 75 6e 63 2c 20 vfsNameFunc,
9060: 30 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 0, 0);. sqlite3
9070: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e _create_function
9080: 28 67 2e 64 62 2c 20 22 65 76 61 6c 22 2c 20 31 (g.db, "eval", 1
9090: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 , SQLITE_UTF8, 0
90a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
90b0: 20 20 20 20 20 20 20 20 20 20 20 20 65 76 61 6c eval
90c0: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 67 Func, 0, 0);. g
90d0: 2e 69 54 69 6d 65 6f 75 74 20 3d 20 44 45 46 41 .iTimeout = DEFA
90e0: 55 4c 54 5f 54 49 4d 45 4f 55 54 3b 0a 20 20 69 ULT_TIMEOUT;. i
90f0: 66 28 20 67 2e 62 53 71 6c 54 72 61 63 65 20 29 f( g.bSqlTrace )
9100: 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 67 sqlite3_trace(g
9110: 2e 64 62 2c 20 73 71 6c 54 72 61 63 65 43 61 6c .db, sqlTraceCal
9120: 6c 62 61 63 6b 2c 20 30 29 3b 0a 20 20 69 66 28 lback, 0);. if(
9130: 20 69 43 6c 69 65 6e 74 3e 30 20 29 7b 0a 20 20 iClient>0 ){.
9140: 20 20 69 66 28 20 6e 3e 30 20 29 20 75 6e 72 65 if( n>0 ) unre
9150: 63 6f 67 6e 69 7a 65 64 41 72 67 75 6d 65 6e 74 cognizedArgument
9160: 73 28 61 72 67 76 5b 30 5d 2c 20 6e 2c 20 61 72 s(argv[0], n, ar
9170: 67 76 2b 32 29 3b 0a 20 20 20 20 69 66 28 20 67 gv+2);. if( g
9180: 2e 69 54 72 61 63 65 20 29 20 6c 6f 67 4d 65 73 .iTrace ) logMes
9190: 73 61 67 65 28 22 73 74 61 72 74 2d 63 6c 69 65 sage("start-clie
91a0: 6e 74 22 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 nt");. while(
91b0: 31 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 1){. char *
91c0: 7a 54 61 73 6b 4e 61 6d 65 20 3d 20 30 3b 0a 20 zTaskName = 0;.
91d0: 20 20 20 20 20 72 63 20 3d 20 73 74 61 72 74 53 rc = startS
91e0: 63 72 69 70 74 28 69 43 6c 69 65 6e 74 2c 20 26 cript(iClient, &
91f0: 7a 53 63 72 69 70 74 2c 20 26 74 61 73 6b 49 64 zScript, &taskId
9200: 2c 20 26 7a 54 61 73 6b 4e 61 6d 65 29 3b 0a 20 , &zTaskName);.
9210: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c if( rc==SQL
9220: 49 54 45 5f 44 4f 4e 45 20 29 20 62 72 65 61 6b ITE_DONE ) break
9230: 3b 0a 20 20 20 20 20 20 69 66 28 20 67 2e 69 54 ;. if( g.iT
9240: 72 61 63 65 20 29 20 6c 6f 67 4d 65 73 73 61 67 race ) logMessag
9250: 65 28 22 62 65 67 69 6e 20 25 73 20 28 25 64 29 e("begin %s (%d)
9260: 22 2c 20 7a 54 61 73 6b 4e 61 6d 65 2c 20 74 61 ", zTaskName, ta
9270: 73 6b 49 64 29 3b 0a 20 20 20 20 20 20 72 75 6e skId);. run
9280: 53 63 72 69 70 74 28 69 43 6c 69 65 6e 74 2c 20 Script(iClient,
9290: 74 61 73 6b 49 64 2c 20 7a 53 63 72 69 70 74 2c taskId, zScript,
92a0: 20 7a 54 61 73 6b 4e 61 6d 65 29 3b 0a 20 20 20 zTaskName);.
92b0: 20 20 20 69 66 28 20 67 2e 69 54 72 61 63 65 20 if( g.iTrace
92c0: 29 20 6c 6f 67 4d 65 73 73 61 67 65 28 22 65 6e ) logMessage("en
92d0: 64 20 25 73 20 28 25 64 29 22 2c 20 7a 54 61 73 d %s (%d)", zTas
92e0: 6b 4e 61 6d 65 2c 20 74 61 73 6b 49 64 29 3b 0a kName, taskId);.
92f0: 20 20 20 20 20 20 66 69 6e 69 73 68 53 63 72 69 finishScri
9300: 70 74 28 69 43 6c 69 65 6e 74 2c 20 74 61 73 6b pt(iClient, task
9310: 49 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 Id, 0);. sq
9320: 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 61 73 6b lite3_free(zTask
9330: 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c Name);. sql
9340: 69 74 65 33 5f 73 6c 65 65 70 28 31 30 29 3b 0a ite3_sleep(10);.
9350: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 67 2e }. if( g.
9360: 69 54 72 61 63 65 20 29 20 6c 6f 67 4d 65 73 73 iTrace ) logMess
9370: 61 67 65 28 22 65 6e 64 2d 63 6c 69 65 6e 74 22 age("end-client"
9380: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 );. }else{.
9390: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 sqlite3_stmt *pS
93a0: 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20 69 54 69 tmt;. int iTi
93b0: 6d 65 6f 75 74 3b 0a 20 20 20 20 69 66 28 20 6e meout;. if( n
93c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 61 74 ==0 ){. fat
93d0: 61 6c 45 72 72 6f 72 28 22 6d 69 73 73 69 6e 67 alError("missing
93e0: 20 73 63 72 69 70 74 20 66 69 6c 65 6e 61 6d 65 script filename
93f0: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 ");. }. if
9400: 28 20 6e 3e 31 20 29 20 75 6e 72 65 63 6f 67 6e ( n>1 ) unrecogn
9410: 69 7a 65 64 41 72 67 75 6d 65 6e 74 73 28 61 72 izedArguments(ar
9420: 67 76 5b 30 5d 2c 20 6e 2c 20 61 72 67 76 2b 32 gv[0], n, argv+2
9430: 29 3b 0a 20 20 20 20 72 75 6e 53 71 6c 28 0a 20 );. runSql(.
9440: 20 20 20 20 20 22 44 52 4f 50 20 54 41 42 4c 45 "DROP TABLE
9450: 20 49 46 20 45 58 49 53 54 53 20 74 61 73 6b 3b IF EXISTS task;
9460: 5c 6e 22 0a 20 20 20 20 20 20 22 44 52 4f 50 20 \n". "DROP
9470: 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 TABLE IF EXISTS
9480: 63 6f 75 6e 74 65 72 73 3b 5c 6e 22 0a 20 20 20 counters;\n".
9490: 20 20 20 22 44 52 4f 50 20 54 41 42 4c 45 20 49 "DROP TABLE I
94a0: 46 20 45 58 49 53 54 53 20 63 6c 69 65 6e 74 3b F EXISTS client;
94b0: 5c 6e 22 0a 20 20 20 20 20 20 22 43 52 45 41 54 \n". "CREAT
94c0: 45 20 54 41 42 4c 45 20 74 61 73 6b 28 5c 6e 22 E TABLE task(\n"
94d0: 0a 20 20 20 20 20 20 22 20 20 69 64 20 49 4e 54 . " id INT
94e0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY
94f0: 2c 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 6e 61 ,\n". " na
9500: 6d 65 20 54 45 58 54 2c 5c 6e 22 0a 20 20 20 20 me TEXT,\n".
9510: 20 20 22 20 20 63 6c 69 65 6e 74 20 49 4e 54 45 " client INTE
9520: 47 45 52 2c 5c 6e 22 0a 20 20 20 20 20 20 22 20 GER,\n". "
9530: 20 73 74 61 72 74 74 69 6d 65 20 44 41 54 45 2c starttime DATE,
9540: 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 65 6e 64 \n". " end
9550: 74 69 6d 65 20 44 41 54 45 2c 5c 6e 22 0a 20 20 time DATE,\n".
9560: 20 20 20 20 22 20 20 73 63 72 69 70 74 20 54 45 " script TE
9570: 58 54 5c 6e 22 0a 20 20 20 20 20 20 22 29 3b 22 XT\n". ");"
9580: 0a 20 20 20 20 20 20 22 43 52 45 41 54 45 20 49 . "CREATE I
9590: 4e 44 45 58 20 74 61 73 6b 5f 69 31 20 4f 4e 20 NDEX task_i1 ON
95a0: 74 61 73 6b 28 63 6c 69 65 6e 74 2c 20 73 74 61 task(client, sta
95b0: 72 74 74 69 6d 65 29 3b 5c 6e 22 0a 20 20 20 20 rttime);\n".
95c0: 20 20 22 43 52 45 41 54 45 20 49 4e 44 45 58 20 "CREATE INDEX
95d0: 74 61 73 6b 5f 69 32 20 4f 4e 20 74 61 73 6b 28 task_i2 ON task(
95e0: 63 6c 69 65 6e 74 2c 20 65 6e 64 74 69 6d 65 29 client, endtime)
95f0: 3b 5c 6e 22 0a 20 20 20 20 20 20 22 43 52 45 41 ;\n". "CREA
9600: 54 45 20 54 41 42 4c 45 20 63 6f 75 6e 74 65 72 TE TABLE counter
9610: 73 28 6e 45 72 72 6f 72 2c 6e 54 65 73 74 29 3b s(nError,nTest);
9620: 5c 6e 22 0a 20 20 20 20 20 20 22 49 4e 53 45 52 \n". "INSER
9630: 54 20 49 4e 54 4f 20 63 6f 75 6e 74 65 72 73 20 T INTO counters
9640: 56 41 4c 55 45 53 28 30 2c 30 29 3b 5c 6e 22 0a VALUES(0,0);\n".
9650: 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54 41 "CREATE TA
9660: 42 4c 45 20 63 6c 69 65 6e 74 28 69 64 20 49 4e BLE client(id IN
9670: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE
9680: 59 2c 20 77 61 6e 74 48 61 6c 74 29 3b 5c 6e 22 Y, wantHalt);\n"
9690: 0a 20 20 20 20 29 3b 0a 20 20 20 20 7a 53 63 72 . );. zScr
96a0: 69 70 74 20 3d 20 72 65 61 64 46 69 6c 65 28 61 ipt = readFile(a
96b0: 72 67 76 5b 32 5d 29 3b 0a 20 20 20 20 66 6f 72 rgv[2]);. for
96c0: 28 69 52 65 70 3d 31 3b 20 69 52 65 70 3c 3d 6e (iRep=1; iRep<=n
96d0: 52 65 70 3b 20 69 52 65 70 2b 2b 29 7b 0a 20 20 Rep; iRep++){.
96e0: 20 20 20 20 69 66 28 20 67 2e 69 54 72 61 63 65 if( g.iTrace
96f0: 20 29 20 6c 6f 67 4d 65 73 73 61 67 65 28 22 62 ) logMessage("b
9700: 65 67 69 6e 20 73 63 72 69 70 74 20 5b 25 73 5d egin script [%s]
9710: 20 63 79 63 6c 65 20 25 64 5c 6e 22 2c 20 61 72 cycle %d\n", ar
9720: 67 76 5b 32 5d 2c 20 69 52 65 70 29 3b 0a 20 20 gv[2], iRep);.
9730: 20 20 20 20 72 75 6e 53 63 72 69 70 74 28 30 2c runScript(0,
9740: 20 30 2c 20 7a 53 63 72 69 70 74 2c 20 61 72 67 0, zScript, arg
9750: 76 5b 32 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 v[2]);. if(
9760: 20 67 2e 69 54 72 61 63 65 20 29 20 6c 6f 67 4d g.iTrace ) logM
9770: 65 73 73 61 67 65 28 22 65 6e 64 20 73 63 72 69 essage("end scri
9780: 70 74 20 5b 25 73 5d 20 63 79 63 6c 65 20 25 64 pt [%s] cycle %d
9790: 5c 6e 22 2c 20 61 72 67 76 5b 32 5d 2c 20 69 52 \n", argv[2], iR
97a0: 65 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 ep);. }. s
97b0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 63 72 qlite3_free(zScr
97c0: 69 70 74 29 3b 0a 20 20 20 20 77 61 69 74 46 6f ipt);. waitFo
97d0: 72 43 6c 69 65 6e 74 28 30 2c 20 32 30 30 30 2c rClient(0, 2000,
97e0: 20 22 64 75 72 69 6e 67 20 73 68 75 74 64 6f 77 "during shutdow
97f0: 6e 2e 2e 2e 5c 6e 22 29 3b 0a 20 20 20 20 74 72 n...\n");. tr
9800: 79 53 71 6c 28 22 55 50 44 41 54 45 20 63 6c 69 ySql("UPDATE cli
9810: 65 6e 74 20 53 45 54 20 77 61 6e 74 48 61 6c 74 ent SET wantHalt
9820: 3d 31 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 =1");. sqlite
9830: 33 5f 73 6c 65 65 70 28 31 30 29 3b 0a 20 20 20 3_sleep(10);.
9840: 20 67 2e 69 54 69 6d 65 6f 75 74 20 3d 20 30 3b g.iTimeout = 0;
9850: 0a 20 20 20 20 69 54 69 6d 65 6f 75 74 20 3d 20 . iTimeout =
9860: 31 30 30 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 1000;. while(
9870: 20 28 28 72 63 20 3d 20 74 72 79 53 71 6c 28 22 ((rc = trySql("
9880: 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 63 6c SELECT 1 FROM cl
9890: 69 65 6e 74 22 29 29 3d 3d 53 51 4c 49 54 45 5f ient"))==SQLITE_
98a0: 42 55 53 59 0a 20 20 20 20 20 20 20 20 7c 7c 20 BUSY. ||
98b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 29 20 rc==SQLITE_ROW)
98c0: 26 26 20 69 54 69 6d 65 6f 75 74 3e 30 20 29 7b && iTimeout>0 ){
98d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 . sqlite3_s
98e0: 6c 65 65 70 28 31 30 29 3b 0a 20 20 20 20 20 20 leep(10);.
98f0: 69 54 69 6d 65 6f 75 74 20 2d 3d 20 31 30 3b 0a iTimeout -= 10;.
9900: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 }. sqlite
9910: 33 5f 73 6c 65 65 70 28 31 30 30 29 3b 0a 20 20 3_sleep(100);.
9920: 20 20 70 53 74 6d 74 20 3d 20 70 72 65 70 61 72 pStmt = prepar
9930: 65 53 71 6c 28 22 53 45 4c 45 43 54 20 6e 45 72 eSql("SELECT nEr
9940: 72 6f 72 2c 20 6e 54 65 73 74 20 46 52 4f 4d 20 ror, nTest FROM
9950: 63 6f 75 6e 74 65 72 73 22 29 3b 0a 20 20 20 20 counters");.
9960: 69 54 69 6d 65 6f 75 74 20 3d 20 31 30 30 30 3b iTimeout = 1000;
9970: 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72 63 20 . while( (rc
9980: 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 = sqlite3_step(p
9990: 53 74 6d 74 29 29 3d 3d 53 51 4c 49 54 45 5f 42 Stmt))==SQLITE_B
99a0: 55 53 59 20 26 26 20 69 54 69 6d 65 6f 75 74 3e USY && iTimeout>
99b0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 0 ){. sqlit
99c0: 65 33 5f 73 6c 65 65 70 28 31 30 29 3b 0a 20 20 e3_sleep(10);.
99d0: 20 20 20 20 69 54 69 6d 65 6f 75 74 20 2d 3d 20 iTimeout -=
99e0: 31 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 10;. }. if
99f0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 ( rc==SQLITE_ROW
9a00: 20 29 7b 0a 20 20 20 20 20 20 67 2e 6e 45 72 72 ){. g.nErr
9a10: 6f 72 20 2b 3d 20 73 71 6c 69 74 65 33 5f 63 6f or += sqlite3_co
9a20: 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 lumn_int(pStmt,
9a30: 30 29 3b 0a 20 20 20 20 20 20 67 2e 6e 54 65 73 0);. g.nTes
9a40: 74 20 2b 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c t += sqlite3_col
9a50: 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 umn_int(pStmt, 1
9a60: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c );. }. sql
9a70: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 ite3_finalize(pS
9a80: 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 tmt);. }. sqli
9a90: 74 65 33 5f 63 6c 6f 73 65 28 67 2e 64 62 29 3b te3_close(g.db);
9aa0: 0a 20 20 6d 61 79 62 65 43 6c 6f 73 65 28 67 2e . maybeClose(g.
9ab0: 70 4c 6f 67 29 3b 0a 20 20 6d 61 79 62 65 43 6c pLog);. maybeCl
9ac0: 6f 73 65 28 67 2e 70 45 72 72 4c 6f 67 29 3b 0a ose(g.pErrLog);.
9ad0: 20 20 69 66 28 20 69 43 6c 69 65 6e 74 3d 3d 30 if( iClient==0
9ae0: 20 29 7b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 ){. printf("
9af0: 53 75 6d 6d 61 72 79 3a 20 25 64 20 65 72 72 6f Summary: %d erro
9b00: 72 73 20 6f 75 74 20 6f 66 20 25 64 20 74 65 73 rs out of %d tes
9b10: 74 73 5c 6e 22 2c 20 67 2e 6e 45 72 72 6f 72 2c ts\n", g.nError,
9b20: 20 67 2e 6e 54 65 73 74 29 3b 0a 20 20 20 20 70 g.nTest);. p
9b30: 72 69 6e 74 66 28 22 45 4e 44 3a 20 25 73 22 2c rintf("END: %s",
9b40: 20 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 66 argv[0]);. f
9b50: 6f 72 28 69 3d 31 3b 20 69 3c 61 72 67 63 3b 20 or(i=1; i<argc;
9b60: 69 2b 2b 29 20 70 72 69 6e 74 66 28 22 20 25 73 i++) printf(" %s
9b70: 22 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 ", argv[i]);.
9b80: 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a 20 printf("\n");.
9b90: 20 7d 0a 20 20 72 65 74 75 72 6e 20 67 2e 6e 45 }. return g.nE
9ba0: 72 72 6f 72 3e 30 3b 0a 7d 0a rror>0;.}.