0000: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ;;==============
0010: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0030: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0040: 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 43 6f 70 79 ========.;; Copy
0050: 72 69 67 68 74 20 32 30 30 36 2d 32 30 31 31 2c right 2006-2011,
0060: 20 4d 61 74 74 68 65 77 20 57 65 6c 6c 61 6e 64 Matthew Welland
0070: 2e 0a 3b 3b 20 0a 3b 3b 20 20 54 68 69 73 20 70 ..;; .;; This p
0080: 72 6f 67 72 61 6d 20 69 73 20 6d 61 64 65 20 61 rogram is made a
0090: 76 61 69 6c 61 62 6c 65 20 75 6e 64 65 72 20 74 vailable under t
00a0: 68 65 20 47 4e 55 20 47 50 4c 20 76 65 72 73 69 he GNU GPL versi
00b0: 6f 6e 20 32 2e 30 20 6f 72 0a 3b 3b 20 20 67 72 on 2.0 or.;; gr
00c0: 65 61 74 65 72 2e 20 53 65 65 20 74 68 65 20 61 eater. See the a
00d0: 63 63 6f 6d 70 61 6e 79 69 6e 67 20 66 69 6c 65 ccompanying file
00e0: 20 43 4f 50 59 49 4e 47 20 66 6f 72 20 64 65 74 COPYING for det
00f0: 61 69 6c 73 2e 0a 3b 3b 20 0a 3b 3b 20 20 54 68 ails..;; .;; Th
0100: 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 is program is di
0110: 73 74 72 69 62 75 74 65 64 20 57 49 54 48 4f 55 stributed WITHOU
0120: 54 20 41 4e 59 20 57 41 52 52 41 4e 54 59 3b 20 T ANY WARRANTY;
0130: 77 69 74 68 6f 75 74 20 65 76 65 6e 20 74 68 65 without even the
0140: 0a 3b 3b 20 20 69 6d 70 6c 69 65 64 20 77 61 72 .;; implied war
0150: 72 61 6e 74 79 20 6f 66 20 4d 45 52 43 48 41 4e ranty of MERCHAN
0160: 54 41 42 49 4c 49 54 59 20 6f 72 20 46 49 54 4e TABILITY or FITN
0170: 45 53 53 20 46 4f 52 20 41 20 50 41 52 54 49 43 ESS FOR A PARTIC
0180: 55 4c 41 52 0a 3b 3b 20 20 50 55 52 50 4f 53 45 ULAR.;; PURPOSE
0190: 2e 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ..;;============
01a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
01b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
01c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
01d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 3d 3d ==========..;;==
01e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
01f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0200: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0210: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0220: 3d 3d 3d 3d 0a 3b 3b 20 44 61 74 61 62 61 73 65 ====.;; Database
0230: 20 61 63 63 65 73 73 0a 3b 3b 3d 3d 3d 3d 3d 3d access.;;======
0240: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0250: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0260: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0270: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0280: 0a 0a 28 75 73 65 20 73 71 6c 69 74 65 33 20 73 ..(use sqlite3 s
0290: 72 66 69 2d 31 20 70 6f 73 69 78 20 72 65 67 65 rfi-1 posix rege
02a0: 78 20 72 65 67 65 78 2d 63 61 73 65 20 73 72 66 x regex-case srf
02b0: 69 2d 36 39 20 63 73 76 2d 78 6d 6c 29 0a 28 69 i-69 csv-xml).(i
02c0: 6d 70 6f 72 74 20 28 70 72 65 66 69 78 20 73 71 mport (prefix sq
02d0: 6c 69 74 65 33 20 73 71 6c 69 74 65 33 3a 29 29 lite3 sqlite3:))
02e0: 0a 0a 28 64 65 63 6c 61 72 65 20 28 75 6e 69 74 ..(declare (unit
02f0: 20 64 62 29 29 0a 28 64 65 63 6c 61 72 65 20 28 db)).(declare (
0300: 75 73 65 73 20 63 6f 6d 6d 6f 6e 29 29 0a 28 64 uses common)).(d
0310: 65 63 6c 61 72 65 20 28 75 73 65 73 20 6b 65 79 eclare (uses key
0320: 73 29 29 0a 28 64 65 63 6c 61 72 65 20 28 75 73 s)).(declare (us
0330: 65 73 20 6f 64 73 29 29 0a 0a 28 69 6e 63 6c 75 es ods))..(inclu
0340: 64 65 20 22 63 6f 6d 6d 6f 6e 5f 72 65 63 6f 72 de "common_recor
0350: 64 73 2e 73 63 6d 22 29 0a 28 69 6e 63 6c 75 64 ds.scm").(includ
0360: 65 20 22 64 62 5f 72 65 63 6f 72 64 73 2e 73 63 e "db_records.sc
0370: 6d 22 29 0a 28 69 6e 63 6c 75 64 65 20 22 6b 65 m").(include "ke
0380: 79 5f 72 65 63 6f 72 64 73 2e 73 63 6d 22 29 0a y_records.scm").
0390: 0a 28 64 65 66 69 6e 65 20 28 6f 70 65 6e 2d 64 .(define (open-d
03a0: 62 29 20 3b 3b 20 20 28 63 6f 6e 63 20 2a 74 6f b) ;; (conc *to
03b0: 70 70 61 74 68 2a 20 22 2f 6d 65 67 61 74 65 73 ppath* "/megates
03c0: 74 2e 64 62 22 29 20 28 63 61 72 20 2a 63 6f 6e t.db") (car *con
03d0: 66 69 67 69 6e 66 6f 2a 29 29 29 0a 20 20 28 6c figinfo*))). (l
03e0: 65 74 2a 20 28 28 64 62 70 61 74 68 20 20 20 20 et* ((dbpath
03f0: 28 63 6f 6e 63 20 2a 74 6f 70 70 61 74 68 2a 20 (conc *toppath*
0400: 22 2f 6d 65 67 61 74 65 73 74 2e 64 62 22 29 29 "/megatest.db"))
0410: 20 3b 3b 20 66 6e 61 6d 65 29 0a 09 20 28 63 6f ;; fname).. (co
0420: 6e 66 69 67 64 61 74 20 28 63 61 72 20 2a 63 6f nfigdat (car *co
0430: 6e 66 69 67 69 6e 66 6f 2a 29 29 0a 09 20 28 64 nfiginfo*)).. (d
0440: 62 65 78 69 73 74 73 20 20 28 66 69 6c 65 2d 65 bexists (file-e
0450: 78 69 73 74 73 3f 20 64 62 70 61 74 68 29 29 0a xists? dbpath)).
0460: 09 20 28 64 62 20 20 20 20 20 20 20 20 28 73 71 . (db (sq
0470: 6c 69 74 65 33 3a 6f 70 65 6e 2d 64 61 74 61 62 lite3:open-datab
0480: 61 73 65 20 64 62 70 61 74 68 29 29 20 3b 3b 20 ase dbpath)) ;;
0490: 28 6e 65 76 65 72 2d 67 69 76 65 2d 75 70 2d 6f (never-give-up-o
04a0: 70 65 6e 2d 64 62 20 64 62 70 61 74 68 29 29 0a pen-db dbpath)).
04b0: 09 20 28 68 61 6e 64 6c 65 72 20 20 20 28 6d 61 . (handler (ma
04c0: 6b 65 2d 62 75 73 79 2d 74 69 6d 65 6f 75 74 20 ke-busy-timeout
04d0: 33 36 30 30 30 29 29 29 0a 20 20 20 20 28 73 71 36000))). (sq
04e0: 6c 69 74 65 33 3a 73 65 74 2d 62 75 73 79 2d 68 lite3:set-busy-h
04f0: 61 6e 64 6c 65 72 21 20 64 62 20 68 61 6e 64 6c andler! db handl
0500: 65 72 29 0a 20 20 20 20 28 69 66 20 28 6e 6f 74 er). (if (not
0510: 20 64 62 65 78 69 73 74 73 29 0a 09 28 6c 65 74 dbexists)..(let
0520: 2a 20 28 28 6b 65 79 73 20 20 20 20 20 28 63 6f * ((keys (co
0530: 6e 66 69 67 2d 67 65 74 2d 66 69 65 6c 64 73 20 nfig-get-fields
0540: 63 6f 6e 66 69 67 64 61 74 29 29 0a 09 20 20 20 configdat))..
0550: 20 20 20 20 28 68 61 76 65 6b 65 79 73 20 28 3e (havekeys (>
0560: 20 28 6c 65 6e 67 74 68 20 6b 65 79 73 29 20 30 (length keys) 0
0570: 29 29 0a 09 20 20 20 20 20 20 20 28 6b 65 79 73 )).. (keys
0580: 74 72 20 20 20 28 6b 65 79 73 2d 3e 6b 65 79 73 tr (keys->keys
0590: 74 72 20 6b 65 79 73 29 29 0a 09 20 20 20 20 20 tr keys))..
05a0: 20 20 28 66 69 65 6c 64 73 74 72 20 28 6b 65 79 (fieldstr (key
05b0: 73 2d 3e 6b 65 79 2f 66 69 65 6c 64 20 6b 65 79 s->key/field key
05c0: 73 29 29 29 0a 09 20 20 28 66 6f 72 2d 65 61 63 s))).. (for-eac
05d0: 68 20 28 6c 61 6d 62 64 61 20 28 6b 65 79 29 0a h (lambda (key).
05e0: 09 09 20 20 20 20 20 20 28 6c 65 74 20 28 28 6b .. (let ((k
05f0: 65 79 6e 20 28 76 65 63 74 6f 72 2d 72 65 66 20 eyn (vector-ref
0600: 6b 65 79 20 30 29 29 29 0a 09 09 09 28 69 66 20 key 0)))....(if
0610: 28 6d 65 6d 62 65 72 20 28 73 74 72 69 6e 67 2d (member (string-
0620: 64 6f 77 6e 63 61 73 65 20 6b 65 79 6e 29 0a 09 downcase keyn)..
0630: 09 09 09 20 20 20 20 20 28 6c 69 73 74 20 22 72 ... (list "r
0640: 75 6e 6e 61 6d 65 22 20 22 73 74 61 74 65 22 20 unname" "state"
0650: 22 73 74 61 74 75 73 22 20 22 6f 77 6e 65 72 22 "status" "owner"
0660: 20 22 65 76 65 6e 74 5f 74 69 6d 65 22 20 22 63 "event_time" "c
0670: 6f 6d 6d 65 6e 74 22 20 22 66 61 69 6c 5f 63 6f omment" "fail_co
0680: 75 6e 74 22 0a 09 09 09 09 09 20 20 20 22 70 61 unt"...... "pa
0690: 73 73 5f 63 6f 75 6e 74 22 29 29 0a 09 09 09 20 ss_count"))....
06a0: 20 20 20 28 62 65 67 69 6e 0a 09 09 09 20 20 20 (begin....
06b0: 20 20 20 28 70 72 69 6e 74 20 22 45 52 52 4f 52 (print "ERROR
06c0: 3a 20 79 6f 75 72 20 6b 65 79 20 63 61 6e 6e 6f : your key canno
06d0: 74 20 62 65 20 6e 61 6d 65 64 20 22 20 6b 65 79 t be named " key
06e0: 6e 20 22 20 61 73 20 74 68 69 73 20 63 6f 6e 66 n " as this conf
06f0: 6c 69 63 74 73 20 77 69 74 68 20 74 68 65 20 73 licts with the s
0700: 61 6d 65 20 6e 61 6d 65 64 20 66 69 65 6c 64 20 ame named field
0710: 69 6e 20 74 68 65 20 72 75 6e 73 20 74 61 62 6c in the runs tabl
0720: 65 22 29 0a 09 09 09 20 20 20 20 20 20 28 73 79 e").... (sy
0730: 73 74 65 6d 20 28 63 6f 6e 63 20 22 72 6d 20 2d stem (conc "rm -
0740: 66 20 22 20 64 62 70 61 74 68 29 29 0a 09 09 09 f " dbpath))....
0750: 20 20 20 20 20 20 28 65 78 69 74 20 31 29 29 29 (exit 1)))
0760: 29 29 0a 09 09 20 20 20 20 6b 65 79 73 29 0a 09 ))... keys)..
0770: 20 20 3b 3b 20 28 73 71 6c 69 74 65 33 3a 65 78 ;; (sqlite3:ex
0780: 65 63 75 74 65 20 64 62 20 22 50 52 41 47 4d 41 ecute db "PRAGMA
0790: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4f synchronous = O
07a0: 46 46 3b 22 29 0a 09 20 20 28 73 71 6c 69 74 65 FF;").. (sqlite
07b0: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 43 52 3:execute db "CR
07c0: 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f EATE TABLE IF NO
07d0: 54 20 45 58 49 53 54 53 20 6b 65 79 73 20 28 69 T EXISTS keys (i
07e0: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR
07f0: 59 20 4b 45 59 2c 20 66 69 65 6c 64 6e 61 6d 65 Y KEY, fieldname
0800: 20 54 45 58 54 2c 20 66 69 65 6c 64 74 79 70 65 TEXT, fieldtype
0810: 20 54 45 58 54 2c 20 43 4f 4e 53 54 52 41 49 4e TEXT, CONSTRAIN
0820: 54 20 6b 65 79 63 6f 6e 73 74 72 61 69 6e 74 20 T keyconstraint
0830: 55 4e 49 51 55 45 20 28 66 69 65 6c 64 6e 61 6d UNIQUE (fieldnam
0840: 65 29 29 3b 22 29 0a 09 20 20 28 66 6f 72 2d 65 e));").. (for-e
0850: 61 63 68 20 28 6c 61 6d 62 64 61 20 28 6b 65 79 ach (lambda (key
0860: 29 0a 09 09 20 20 20 20 20 20 28 73 71 6c 69 74 )... (sqlit
0870: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 49 e3:execute db "I
0880: 4e 53 45 52 54 20 49 4e 54 4f 20 6b 65 79 73 20 NSERT INTO keys
0890: 28 66 69 65 6c 64 6e 61 6d 65 2c 66 69 65 6c 64 (fieldname,field
08a0: 74 79 70 65 29 20 56 41 4c 55 45 53 20 28 3f 2c type) VALUES (?,
08b0: 3f 29 3b 22 20 28 6b 65 79 3a 67 65 74 2d 66 69 ?);" (key:get-fi
08c0: 65 6c 64 6e 61 6d 65 20 6b 65 79 29 28 6b 65 79 eldname key)(key
08d0: 3a 67 65 74 2d 66 69 65 6c 64 74 79 70 65 20 6b :get-fieldtype k
08e0: 65 79 29 29 29 0a 09 09 20 20 20 20 6b 65 79 73 ey)))... keys
08f0: 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65 78 ).. (sqlite3:ex
0900: 65 63 75 74 65 20 64 62 20 28 63 6f 6e 63 20 0a ecute db (conc .
0910: 09 09 09 20 20 20 20 22 43 52 45 41 54 45 20 54 ... "CREATE T
0920: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 ABLE IF NOT EXIS
0930: 54 53 20 72 75 6e 73 20 28 69 64 20 49 4e 54 45 TS runs (id INTE
0940: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c GER PRIMARY KEY,
0950: 20 22 20 0a 09 09 09 20 20 20 20 66 69 65 6c 64 " .... field
0960: 73 74 72 20 28 69 66 20 68 61 76 65 6b 65 79 73 str (if havekeys
0970: 20 22 2c 22 20 22 22 29 0a 09 09 09 20 20 20 20 "," "")....
0980: 22 72 75 6e 6e 61 6d 65 20 54 45 58 54 2c 22 0a "runname TEXT,".
0990: 09 09 09 20 20 20 20 22 73 74 61 74 65 20 54 45 ... "state TE
09a0: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 22 0a XT DEFAULT '',".
09b0: 09 09 09 20 20 20 20 22 73 74 61 74 75 73 20 54 ... "status T
09c0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 22 EXT DEFAULT '',"
09d0: 0a 09 09 09 20 20 20 20 22 6f 77 6e 65 72 20 54 .... "owner T
09e0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 22 EXT DEFAULT '',"
09f0: 0a 09 09 09 20 20 20 20 22 65 76 65 6e 74 5f 74 .... "event_t
0a00: 69 6d 65 20 54 49 4d 45 53 54 41 4d 50 2c 22 0a ime TIMESTAMP,".
0a10: 09 09 09 20 20 20 20 22 63 6f 6d 6d 65 6e 74 20 ... "comment
0a20: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c TEXT DEFAULT '',
0a30: 22 0a 09 09 09 20 20 20 20 22 66 61 69 6c 5f 63 ".... "fail_c
0a40: 6f 75 6e 74 20 49 4e 54 45 47 45 52 20 44 45 46 ount INTEGER DEF
0a50: 41 55 4c 54 20 30 2c 22 0a 09 09 09 20 20 20 20 AULT 0,"....
0a60: 22 70 61 73 73 5f 63 6f 75 6e 74 20 49 4e 54 45 "pass_count INTE
0a70: 47 45 52 20 44 45 46 41 55 4c 54 20 30 2c 22 0a GER DEFAULT 0,".
0a80: 09 09 09 20 20 20 20 22 43 4f 4e 53 54 52 41 49 ... "CONSTRAI
0a90: 4e 54 20 72 75 6e 73 63 6f 6e 73 74 72 61 69 6e NT runsconstrain
0aa0: 74 20 55 4e 49 51 55 45 20 28 72 75 6e 6e 61 6d t UNIQUE (runnam
0ab0: 65 22 20 28 69 66 20 68 61 76 65 6b 65 79 73 20 e" (if havekeys
0ac0: 22 2c 22 20 22 22 29 20 6b 65 79 73 74 72 20 22 "," "") keystr "
0ad0: 29 29 3b 22 29 29 0a 09 20 20 28 73 71 6c 69 74 ));")).. (sqlit
0ae0: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 28 63 e3:execute db (c
0af0: 6f 6e 63 20 22 43 52 45 41 54 45 20 49 4e 44 45 onc "CREATE INDE
0b00: 58 20 72 75 6e 73 5f 69 6e 64 65 78 20 4f 4e 20 X runs_index ON
0b10: 72 75 6e 73 20 28 72 75 6e 6e 61 6d 65 22 20 28 runs (runname" (
0b20: 69 66 20 68 61 76 65 6b 65 79 73 20 22 2c 22 20 if havekeys ","
0b30: 22 22 29 20 6b 65 79 73 74 72 20 22 29 3b 22 29 "") keystr ");")
0b40: 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65 78 ).. (sqlite3:ex
0b50: 65 63 75 74 65 20 64 62 20 0a 20 20 20 20 20 20 ecute db .
0b60: 20 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 "CREA
0b70: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 TE TABLE IF NOT
0b80: 45 58 49 53 54 53 20 74 65 73 74 73 20 0a 20 20 EXISTS tests .
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0ba0: 20 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 (id INTEGER PR
0bb0: 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 IMARY KEY,.
0bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0bd0: 72 75 6e 5f 69 64 20 20 20 20 20 49 4e 54 45 47 run_id INTEG
0be0: 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 ER,.
0bf0: 20 20 20 20 20 20 20 20 20 74 65 73 74 6e 61 6d testnam
0c00: 65 20 20 20 54 45 58 54 2c 0a 20 20 20 20 20 20 e TEXT,.
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68 h
0c20: 6f 73 74 20 20 20 20 20 20 20 54 45 58 54 20 44 ost TEXT D
0c30: 45 46 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20 20 EFAULT 'n/a',.
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0c50: 20 20 20 63 70 75 6c 6f 61 64 20 20 20 20 52 45 cpuload RE
0c60: 41 4c 20 44 45 46 41 55 4c 54 20 2d 31 2c 0a 20 AL DEFAULT -1,.
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0c80: 20 20 20 20 64 69 73 6b 66 72 65 65 20 20 20 49 diskfree I
0c90: 4e 54 45 47 45 52 20 44 45 46 41 55 4c 54 20 2d NTEGER DEFAULT -
0ca0: 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 1,.
0cb0: 20 20 20 20 20 20 20 20 75 6e 61 6d 65 20 20 20 uname
0cc0: 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 TEXT DEFAULT
0cd0: 27 6e 2f 61 27 2c 20 0a 20 20 20 20 20 20 20 20 'n/a', .
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 75 6e run
0cf0: 64 69 72 20 20 20 20 20 54 45 58 54 20 44 45 46 dir TEXT DEF
0d00: 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20 20 20 20 AULT 'n/a',.
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0d20: 20 73 68 6f 72 74 64 69 72 20 20 20 54 45 58 54 shortdir TEXT
0d30: 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 DEFAULT '',.
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0d50: 20 20 69 74 65 6d 5f 70 61 74 68 20 20 54 45 58 item_path TEX
0d60: 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 T DEFAULT '',.
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0d80: 20 20 20 73 74 61 74 65 20 20 20 20 20 20 54 45 state TE
0d90: 58 54 20 44 45 46 41 55 4c 54 20 27 4e 4f 54 5f XT DEFAULT 'NOT_
0da0: 53 54 41 52 54 45 44 27 2c 0a 20 20 20 20 20 20 STARTED',.
0db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 s
0dc0: 74 61 74 75 73 20 20 20 20 20 54 45 58 54 20 44 tatus TEXT D
0dd0: 45 46 41 55 4c 54 20 27 46 41 49 4c 27 2c 0a 20 EFAULT 'FAIL',.
0de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0df0: 20 20 20 20 61 74 74 65 6d 70 74 6e 75 6d 20 49 attemptnum I
0e00: 4e 54 45 47 45 52 20 44 45 46 41 55 4c 54 20 30 NTEGER DEFAULT 0
0e10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
0e20: 20 20 20 20 20 20 20 66 69 6e 61 6c 5f 6c 6f 67 final_log
0e30: 66 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 f TEXT DEFAULT '
0e40: 6c 6f 67 73 2f 66 69 6e 61 6c 2e 6c 6f 67 27 2c logs/final.log',
0e50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
0e60: 20 20 20 20 20 20 6c 6f 67 64 61 74 20 20 20 20 logdat
0e70: 20 42 4c 4f 42 2c 20 0a 20 20 20 20 20 20 20 20 BLOB, .
0e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 75 6e run
0e90: 5f 64 75 72 61 74 69 6f 6e 20 49 4e 54 45 47 45 _duration INTEGE
0ea0: 52 20 44 45 46 41 55 4c 54 20 30 2c 0a 20 20 20 R DEFAULT 0,.
0eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0ec0: 20 20 63 6f 6d 6d 65 6e 74 20 20 20 20 54 45 58 comment TEX
0ed0: 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 T DEFAULT '',.
0ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0ef0: 20 20 20 65 76 65 6e 74 5f 74 69 6d 65 20 54 49 event_time TI
0f00: 4d 45 53 54 41 4d 50 2c 0a 20 20 20 20 20 20 20 MESTAMP,.
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 61 fa
0f20: 69 6c 5f 63 6f 75 6e 74 20 49 4e 54 45 47 45 52 il_count INTEGER
0f30: 20 44 45 46 41 55 4c 54 20 30 2c 0a 20 20 20 20 DEFAULT 0,.
0f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0f50: 20 70 61 73 73 5f 63 6f 75 6e 74 20 49 4e 54 45 pass_count INTE
0f60: 47 45 52 20 44 45 46 41 55 4c 54 20 30 2c 0a 20 GER DEFAULT 0,.
0f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0f80: 20 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 CONSTRAINT t
0f90: 65 73 74 73 63 6f 6e 73 74 72 61 69 6e 74 20 55 estsconstraint U
0fa0: 4e 49 51 55 45 20 28 72 75 6e 5f 69 64 2c 20 74 NIQUE (run_id, t
0fb0: 65 73 74 6e 61 6d 65 2c 20 69 74 65 6d 5f 70 61 estname, item_pa
0fc0: 74 68 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b th). );
0fd0: 22 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65 ").. (sqlite3:e
0fe0: 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 54 xecute db "CREAT
0ff0: 45 20 49 4e 44 45 58 20 74 65 73 74 73 5f 69 6e E INDEX tests_in
1000: 64 65 78 20 4f 4e 20 74 65 73 74 73 20 28 72 75 dex ON tests (ru
1010: 6e 5f 69 64 2c 20 74 65 73 74 6e 61 6d 65 29 3b n_id, testname);
1020: 22 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65 ").. (sqlite3:e
1030: 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 54 xecute db "CREAT
1040: 45 20 56 49 45 57 20 72 75 6e 73 5f 74 65 73 74 E VIEW runs_test
1050: 73 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 s AS SELECT * FR
1060: 4f 4d 20 72 75 6e 73 20 49 4e 4e 45 52 20 4a 4f OM runs INNER JO
1070: 49 4e 20 74 65 73 74 73 20 4f 4e 20 72 75 6e 73 IN tests ON runs
1080: 2e 69 64 3d 74 65 73 74 73 2e 72 75 6e 5f 69 64 .id=tests.run_id
1090: 3b 22 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a ;").. (sqlite3:
10a0: 65 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 execute db "CREA
10b0: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 TE TABLE IF NOT
10c0: 45 58 49 53 54 53 20 74 65 73 74 5f 73 74 65 70 EXISTS test_step
10d0: 73 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 s .
10e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
10f0: 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 (id INTEGER PRI
1100: 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 20 MARY KEY,.
1110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1120: 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 69 64 test_id
1130: 20 49 4e 54 45 47 45 52 2c 20 0a 20 20 20 20 20 INTEGER, .
1140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1150: 20 20 20 20 20 20 20 20 20 20 73 74 65 70 6e 61 stepna
1160: 6d 65 20 54 45 58 54 2c 20 0a 20 20 20 20 20 20 me TEXT, .
1170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1180: 20 20 20 20 20 20 20 20 20 73 74 61 74 65 20 54 state T
1190: 45 58 54 20 44 45 46 41 55 4c 54 20 27 4e 4f 54 EXT DEFAULT 'NOT
11a0: 5f 53 54 41 52 54 45 44 27 2c 20 0a 20 20 20 20 _STARTED', .
11b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11c0: 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 75 statu
11d0: 73 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 s TEXT DEFAULT '
11e0: 6e 2f 61 27 2c 0a 20 20 20 20 20 20 20 20 20 20 n/a',.
11f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1200: 20 20 20 20 20 65 76 65 6e 74 5f 74 69 6d 65 20 event_time
1210: 54 49 4d 45 53 54 41 4d 50 2c 0a 20 20 20 20 20 TIMESTAMP,.
1220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1230: 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 65 6e commen
1240: 74 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 t TEXT DEFAULT '
1250: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ',.
1260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1270: 20 20 6c 6f 67 66 69 6c 65 20 54 45 58 54 2c 0a logfile TEXT,.
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 C
12a0: 4f 4e 53 54 52 41 49 4e 54 20 74 65 73 74 5f 73 ONSTRAINT test_s
12b0: 74 65 70 73 5f 63 6f 6e 73 74 72 61 69 6e 74 20 teps_constraint
12c0: 55 4e 49 51 55 45 20 28 74 65 73 74 5f 69 64 2c UNIQUE (test_id,
12d0: 73 74 65 70 6e 61 6d 65 2c 73 74 61 74 65 29 29 stepname,state))
12e0: 3b 22 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a ;").. (sqlite3:
12f0: 65 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 execute db "CREA
1300: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 TE TABLE IF NOT
1310: 45 58 49 53 54 53 20 65 78 74 72 61 64 61 74 20 EXISTS extradat
1320: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM
1330: 41 52 59 20 4b 45 59 2c 20 72 75 6e 5f 69 64 20 ARY KEY, run_id
1340: 49 4e 54 45 47 45 52 2c 20 6b 65 79 20 54 45 58 INTEGER, key TEX
1350: 54 2c 20 76 61 6c 20 54 45 58 54 29 3b 22 29 0a T, val TEXT);").
1360: 09 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 . (sqlite3:exec
1370: 75 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54 ute db "CREATE T
1380: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 ABLE IF NOT EXIS
1390: 54 53 20 6d 65 74 61 64 61 74 20 28 69 64 20 49 TS metadat (id I
13a0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b NTEGER PRIMARY K
13b0: 45 59 2c 20 76 61 72 20 54 45 58 54 2c 20 76 61 EY, var TEXT, va
13c0: 6c 20 54 45 58 54 2c 0a 20 20 20 20 20 20 20 20 l TEXT,.
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13e0: 20 20 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52 CONSTR
13f0: 41 49 4e 54 20 6d 65 74 61 64 61 74 5f 63 6f 6e AINT metadat_con
1400: 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28 straint UNIQUE (
1410: 76 61 72 29 29 3b 22 29 0a 09 20 20 28 73 71 6c var));").. (sql
1420: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 ite3:execute db
1430: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 "CREATE TABLE IF
1440: 20 4e 4f 54 20 45 58 49 53 54 53 20 61 63 63 65 NOT EXISTS acce
1450: 73 73 5f 6c 6f 67 20 28 69 64 20 49 4e 54 45 47 ss_log (id INTEG
1460: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY,
1470: 75 73 65 72 20 54 45 58 54 2c 20 61 63 63 65 73 user TEXT, acces
1480: 73 65 64 20 54 49 4d 45 53 54 41 4d 50 2c 20 61 sed TIMESTAMP, a
1490: 72 67 73 20 54 45 58 54 29 3b 22 29 0a 09 20 20 rgs TEXT);")..
14a0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 (sqlite3:execute
14b0: 20 64 62 20 22 43 52 45 41 54 45 20 54 41 42 4c db "CREATE TABL
14c0: 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 E IF NOT EXISTS
14d0: 74 65 73 74 5f 6d 65 74 61 20 28 69 64 20 49 4e test_meta (id IN
14e0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE
14f0: 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 Y,.
1500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1510: 20 20 20 20 20 20 20 20 74 65 73 74 6e 61 6d 65 testname
1520: 20 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 TEXT DEFAULT
1530: 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 '',.
1540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1550: 20 20 20 20 20 20 20 20 20 20 61 75 74 68 6f 72 author
1560: 20 20 20 20 20 20 54 45 58 54 20 44 45 46 41 55 TEXT DEFAU
1570: 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 LT '',.
1580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1590: 20 20 20 20 20 20 20 20 20 20 20 20 6f 77 6e 65 owne
15a0: 72 20 20 20 20 20 20 20 54 45 58 54 20 44 45 46 r TEXT DEF
15b0: 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 AULT '',.
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65 de
15e0: 73 63 72 69 70 74 69 6f 6e 20 54 45 58 54 20 44 scription TEXT D
15f0: 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 EFAULT '',.
1600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1620: 72 65 76 69 65 77 65 64 20 20 20 20 54 49 4d 45 reviewed TIME
1630: 53 54 41 4d 50 2c 0a 20 20 20 20 20 20 20 20 20 STAMP,.
1640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1650: 20 20 20 20 20 20 20 20 20 20 20 20 69 74 65 72 iter
1660: 61 74 65 64 20 20 20 20 54 45 58 54 20 44 45 46 ated TEXT DEF
1670: 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 AULT '',.
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 76 av
16a0: 67 5f 72 75 6e 74 69 6d 65 20 52 45 41 4c 2c 0a g_runtime REAL,.
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16d0: 20 20 20 20 20 61 76 67 5f 64 69 73 6b 20 20 20 avg_disk
16e0: 20 52 45 41 4c 2c 0a 20 20 20 20 20 20 20 20 20 REAL,.
16f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1700: 20 20 20 20 20 20 20 20 20 20 20 20 74 61 67 73 tags
1710: 20 20 20 20 20 20 20 20 54 45 58 54 20 44 45 46 TEXT DEF
1720: 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 AULT '',.
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1740: 20 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52 41 CONSTRA
1750: 49 4e 54 20 74 65 73 74 5f 6d 65 74 61 5f 63 6f INT test_meta_co
1760: 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20 nstraint UNIQUE
1770: 28 74 65 73 74 6e 61 6d 65 29 29 3b 22 29 0a 09 (testname));")..
1780: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 (sqlite3:execu
1790: 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41 te db "CREATE TA
17a0: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 BLE IF NOT EXIST
17b0: 53 20 74 65 73 74 5f 64 61 74 61 20 28 69 64 20 S test_data (id
17c0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 INTEGER PRIMARY
17d0: 4b 45 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 KEY,.
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17f0: 20 20 20 20 20 74 65 73 74 5f 69 64 20 49 4e 54 test_id INT
1800: 45 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 EGER,.
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1820: 20 20 20 20 20 20 63 61 74 65 67 6f 72 79 20 54 category T
1830: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a EXT DEFAULT '',.
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1860: 76 61 72 69 61 62 6c 65 20 54 45 58 54 2c 0a 09 variable TEXT,..
1870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1880: 20 20 20 20 20 20 20 20 76 61 6c 75 65 20 52 45 value RE
1890: 41 4c 2c 0a 09 20 20 20 20 20 20 20 20 20 20 20 AL,..
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70 exp
18b0: 65 63 74 65 64 20 52 45 41 4c 2c 0a 09 20 20 20 ected REAL,..
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
18d0: 20 20 20 20 20 74 6f 6c 20 52 45 41 4c 2c 0a 20 tol REAL,.
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 u
1900: 6e 69 74 73 20 54 45 58 54 2c 0a 20 20 20 20 20 nits TEXT,.
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1920: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 65 comme
1930: 6e 74 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 nt TEXT DEFAULT
1940: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 '',.
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1960: 20 20 20 20 73 74 61 74 75 73 20 54 45 58 54 20 status TEXT
1970: 44 45 46 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20 DEFAULT 'n/a',.
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 t
19a0: 79 70 65 20 54 45 58 54 20 44 45 46 41 55 4c 54 ype TEXT DEFAULT
19b0: 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 '',.
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
19d0: 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 65 CONSTRAINT te
19e0: 73 74 5f 64 61 74 61 5f 63 6f 6e 73 74 72 61 69 st_data_constrai
19f0: 6e 74 20 55 4e 49 51 55 45 20 28 74 65 73 74 5f nt UNIQUE (test_
1a00: 69 64 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 69 id,category,vari
1a10: 61 62 6c 65 29 29 3b 22 29 0a 09 20 20 28 73 71 able));").. (sq
1a20: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 lite3:execute db
1a30: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 "CREATE TABLE I
1a40: 46 20 4e 4f 54 20 45 58 49 53 54 53 20 74 61 73 F NOT EXISTS tas
1a50: 6b 5f 71 75 65 75 65 20 28 69 64 20 49 4e 54 45 k_queue (id INTE
1a60: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c GER PRIMARY KEY,
1a70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a90: 20 61 63 74 69 6f 6e 20 54 45 58 54 20 44 45 46 action TEXT DEF
1aa0: 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 AULT '',.
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ac0: 20 20 20 20 20 20 20 20 20 6f 77 6e 65 72 20 54 owner T
1ad0: 45 58 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 EXT,.
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1af0: 20 20 20 20 20 73 74 61 74 65 20 54 45 58 54 20 state TEXT
1b00: 44 45 46 41 55 4c 54 20 27 6e 65 77 27 2c 0a 20 DEFAULT 'new',.
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 t
1b30: 61 72 67 65 74 20 54 45 58 54 20 44 45 46 41 55 arget TEXT DEFAU
1b40: 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 LT '',.
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1b60: 20 20 20 20 20 20 20 6e 61 6d 65 20 54 45 58 54 name TEXT
1b70: 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 DEFAULT '',.
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 tes
1ba0: 74 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 t TEXT DEFAULT '
1bb0: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ',.
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1bd0: 20 20 20 69 74 65 6d 20 54 45 58 54 20 44 45 46 item TEXT DEF
1be0: 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 AULT '',.
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1c00: 20 20 20 20 20 20 20 20 20 63 72 65 61 74 69 6f creatio
1c10: 6e 5f 74 69 6d 65 20 54 49 4d 45 53 54 41 4d 50 n_time TIMESTAMP
1c20: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1c40: 20 20 65 78 65 63 75 74 69 6f 6e 5f 74 69 6d 65 execution_time
1c50: 20 54 49 4d 45 53 54 41 4d 50 3b 22 29 0a 09 20 TIMESTAMP;")..
1c60: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 (sqlite3:execut
1c70: 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41 42 e db "CREATE TAB
1c80: 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 LE IF NOT EXISTS
1c90: 20 6d 6f 6e 69 74 6f 72 73 20 28 69 64 20 49 4e monitors (id IN
1ca0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE
1cb0: 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 Y,.
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1cd0: 20 20 20 70 69 64 20 49 4e 54 45 47 45 52 2c 0a pid INTEGER,.
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1d00: 73 74 61 72 74 5f 74 69 6d 65 20 54 49 4d 45 53 start_time TIMES
1d10: 54 41 4d 50 2c 0a 20 20 20 20 20 20 20 20 20 20 TAMP,.
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1d30: 20 20 20 20 20 20 6c 61 73 74 5f 75 70 64 61 74 last_updat
1d40: 65 20 54 49 4d 45 53 54 41 4d 50 2c 0a 20 20 20 e TIMESTAMP,.
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 68 6f 73 hos
1d70: 74 6e 61 6d 65 20 54 45 58 54 2c 0a 20 20 20 20 tname TEXT,.
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1d90: 20 20 20 20 20 20 20 20 20 20 20 20 75 73 65 72 user
1da0: 6e 61 6d 65 20 54 45 58 54 2c 0a 20 20 20 20 20 name TEXT,.
1db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1dc0: 20 20 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52 CONSTR
1dd0: 41 49 4e 54 20 6d 6f 6e 69 74 6f 72 73 5f 63 6f AINT monitors_co
1de0: 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20 nstraint UNIQUE
1df0: 28 70 69 64 2c 68 6f 73 74 6e 61 6d 65 29 29 3b (pid,hostname));
1e00: 22 29 0a 09 20 20 3b 3b 20 4d 75 73 74 20 64 6f ").. ;; Must do
1e10: 20 74 68 69 73 20 2a 61 66 74 65 72 2a 20 72 75 this *after* ru
1e20: 6e 6e 69 6e 67 20 70 61 74 63 68 20 64 62 20 21 nning patch db !
1e30: 21 20 4e 6f 20 6d 6f 72 65 2e 20 0a 09 20 20 28 ! No more. .. (
1e40: 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d db:set-var db "M
1e50: 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 EGATEST_VERSION"
1e60: 20 6d 65 67 61 74 65 73 74 2d 76 65 72 73 69 6f megatest-versio
1e70: 6e 29 0a 09 20 20 29 29 0a 20 20 20 20 64 62 29 n).. )). db)
1e80: 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d )..;;===========
1e90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1ea0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1eb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1ec0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 54 ===========.;; T
1ed0: 4f 44 4f 3a 0a 3b 3b 20 20 20 70 75 74 20 64 65 ODO:.;; put de
1ee0: 6c 74 61 73 20 69 6e 74 6f 20 61 6e 20 61 73 73 ltas into an ass
1ef0: 6f 63 20 6c 69 73 74 20 77 69 74 68 20 76 65 72 oc list with ver
1f00: 73 69 6f 6e 20 6e 75 6d 62 65 72 73 0a 3b 3b 20 sion numbers.;;
1f10: 20 20 61 70 70 6c 79 20 61 6c 6c 20 66 72 6f 6d apply all from
1f20: 20 6c 61 73 74 20 74 6f 20 63 75 72 72 65 6e 74 last to current
1f30: 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d .;;=============
1f40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1f50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1f60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1f70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 28 64 65 66 69 6e =========.(defin
1f80: 65 20 28 70 61 74 63 68 2d 64 62 20 64 62 29 0a e (patch-db db).
1f90: 20 20 28 68 61 6e 64 6c 65 2d 65 78 63 65 70 74 (handle-except
1fa0: 69 6f 6e 73 0a 20 20 20 65 78 6e 0a 20 20 20 28 ions. exn. (
1fb0: 62 65 67 69 6e 0a 20 20 20 20 20 28 70 72 69 6e begin. (prin
1fc0: 74 20 22 45 78 63 65 70 74 69 6f 6e 3a 20 22 20 t "Exception: "
1fd0: 65 78 6e 29 0a 20 20 20 20 20 28 70 72 69 6e 74 exn). (print
1fe0: 20 22 45 52 52 4f 52 3a 20 50 6f 73 73 69 62 6c "ERROR: Possibl
1ff0: 65 20 6f 75 74 20 6f 66 20 64 61 74 65 20 73 63 e out of date sc
2000: 68 65 6d 61 2c 20 61 74 74 65 6d 70 74 69 6e 67 hema, attempting
2010: 20 74 6f 20 61 64 64 20 74 61 62 6c 65 20 6d 65 to add table me
2020: 74 61 64 61 74 61 2e 2e 2e 22 29 0a 20 20 20 20 tadata...").
2030: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 (sqlite3:execut
2040: 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41 42 e db "CREATE TAB
2050: 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 LE IF NOT EXISTS
2060: 20 6d 65 74 61 64 61 74 20 28 69 64 20 49 4e 54 metadat (id INT
2070: 45 47 45 52 2c 20 76 61 72 20 54 45 58 54 2c 20 EGER, var TEXT,
2080: 76 61 6c 20 54 45 58 54 2c 0a 20 20 20 20 20 20 val TEXT,.
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20a0: 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e 53 54 CONST
20b0: 52 41 49 4e 54 20 6d 65 74 61 64 61 74 5f 63 6f RAINT metadat_co
20c0: 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20 nstraint UNIQUE
20d0: 28 76 61 72 29 29 3b 22 29 0a 20 20 20 20 20 28 (var));"). (
20e0: 69 66 20 28 6e 6f 74 20 28 64 62 3a 67 65 74 2d if (not (db:get-
20f0: 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 53 54 var db "MEGATEST
2100: 5f 56 45 52 53 49 4f 4e 22 29 29 0a 09 20 28 64 _VERSION")).. (d
2110: 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 b:set-var db "ME
2120: 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 GATEST_VERSION"
2130: 31 2e 31 37 29 29 29 0a 20 20 20 28 6c 65 74 20 1.17))). (let
2140: 28 28 6d 76 65 72 20 28 64 62 3a 67 65 74 2d 76 ((mver (db:get-v
2150: 61 72 20 64 62 20 22 4d 45 47 41 54 45 53 54 5f ar db "MEGATEST_
2160: 56 45 52 53 49 4f 4e 22 29 29 0a 09 20 28 74 65 VERSION")).. (te
2170: 73 74 2d 6d 65 74 61 2d 64 65 66 20 22 43 52 45 st-meta-def "CRE
2180: 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 ATE TABLE IF NOT
2190: 20 45 58 49 53 54 53 20 74 65 73 74 5f 6d 65 74 EXISTS test_met
21a0: 61 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 a (id INTEGER PR
21b0: 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 IMARY KEY,.
21c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
21e0: 74 65 73 74 6e 61 6d 65 20 20 20 20 54 45 58 54 testname TEXT
21f0: 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 DEFAULT '',.
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2220: 20 20 61 75 74 68 6f 72 20 20 20 20 20 20 54 45 author TE
2230: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 XT DEFAULT '',.
2240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2260: 20 20 20 20 6f 77 6e 65 72 20 20 20 20 20 20 20 owner
2270: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c TEXT DEFAULT '',
2280: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
2290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
22a0: 20 20 20 20 20 20 64 65 73 63 72 69 70 74 69 6f descriptio
22b0: 6e 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 n TEXT DEFAULT '
22c0: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ',.
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
22e0: 20 20 20 20 20 20 20 20 72 65 76 69 65 77 65 64 reviewed
22f0: 20 20 20 20 54 49 4d 45 53 54 41 4d 50 2c 0a 20 TIMESTAMP,.
2300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2320: 20 20 20 20 69 74 65 72 61 74 65 64 20 20 20 20 iterated
2330: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c TEXT DEFAULT '',
2340: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
2350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2360: 20 20 20 20 20 20 61 76 67 5f 72 75 6e 74 69 6d avg_runtim
2370: 65 20 52 45 41 4c 2c 0a 20 20 20 20 20 20 20 20 e REAL,.
2380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 76 67 avg
23a0: 5f 64 69 73 6b 20 20 20 20 52 45 41 4c 2c 0a 20 _disk REAL,.
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23d0: 20 20 20 20 74 61 67 73 20 20 20 20 20 20 20 20 tags
23e0: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c TEXT DEFAULT '',
23f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2410: 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 65 73 74 CONSTRAINT test
2420: 5f 6d 65 74 61 5f 63 6f 6e 73 74 72 61 69 6e 74 _meta_constraint
2430: 20 55 4e 49 51 55 45 20 28 74 65 73 74 6e 61 6d UNIQUE (testnam
2440: 65 29 29 3b 22 29 29 0a 20 20 20 20 20 28 70 72 e));")). (pr
2450: 69 6e 74 20 22 43 75 72 72 65 6e 74 20 73 63 68 int "Current sch
2460: 65 6d 61 20 76 65 72 73 69 6f 6e 3a 20 22 20 6d ema version: " m
2470: 76 65 72 20 22 20 63 75 72 72 65 6e 74 20 6d 65 ver " current me
2480: 67 61 74 65 73 74 20 76 65 72 73 69 6f 6e 3a 20 gatest version:
2490: 22 20 6d 65 67 61 74 65 73 74 2d 76 65 72 73 69 " megatest-versi
24a0: 6f 6e 29 0a 20 20 20 20 20 28 63 6f 6e 64 0a 20 on). (cond.
24b0: 20 20 20 20 20 28 28 6e 6f 74 20 6d 76 65 72 29 ((not mver)
24c0: 0a 20 20 20 20 20 20 20 28 70 72 69 6e 74 20 22 . (print "
24d0: 41 64 64 69 6e 67 20 6d 65 67 61 74 65 73 74 2d Adding megatest-
24e0: 76 65 72 73 69 6f 6e 20 74 6f 20 6d 65 74 61 64 version to metad
24f0: 61 74 61 22 29 20 3b 3b 20 4e 65 65 64 20 74 6f ata") ;; Need to
2500: 20 72 65 63 72 65 61 74 65 20 74 68 65 20 74 61 recreate the ta
2510: 62 6c 65 0a 20 20 20 20 20 20 20 28 73 71 6c 69 ble. (sqli
2520: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 te3:execute db "
2530: 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 DROP TABLE IF EX
2540: 49 53 54 53 20 6d 65 74 61 64 61 74 3b 22 29 0a ISTS metadat;").
2550: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a (sqlite3:
2560: 65 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 execute db "CREA
2570: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 TE TABLE IF NOT
2580: 45 58 49 53 54 53 20 6d 65 74 61 64 61 74 20 28 EXISTS metadat (
2590: 69 64 20 49 4e 54 45 47 45 52 2c 20 76 61 72 20 id INTEGER, var
25a0: 54 45 58 54 2c 20 76 61 6c 20 54 45 58 54 2c 0a TEXT, val TEXT,.
25b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
25d0: 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 6d 65 74 CONSTRAINT met
25e0: 61 64 61 74 5f 63 6f 6e 73 74 72 61 69 6e 74 20 adat_constraint
25f0: 55 4e 49 51 55 45 20 28 76 61 72 29 29 3b 22 29 UNIQUE (var));")
2600: 0a 20 20 20 20 20 20 20 28 64 62 3a 73 65 74 2d . (db:set-
2610: 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 53 54 var db "MEGATEST
2620: 5f 56 45 52 53 49 4f 4e 22 20 31 2e 31 37 29 0a _VERSION" 1.17).
2630: 20 20 20 20 20 20 20 28 70 61 74 63 68 2d 64 62 (patch-db
2640: 29 29 0a 20 20 20 20 20 20 28 28 3c 20 6d 76 65 )). ((< mve
2650: 72 20 31 2e 32 31 29 0a 20 20 20 20 20 20 20 28 r 1.21). (
2660: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 sqlite3:execute
2670: 64 62 20 22 44 52 4f 50 20 54 41 42 4c 45 20 49 db "DROP TABLE I
2680: 46 20 45 58 49 53 54 53 20 6d 65 74 61 64 61 74 F EXISTS metadat
2690: 3b 22 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69 ;"). (sqli
26a0: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 te3:execute db "
26b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 CREATE TABLE IF
26c0: 4e 4f 54 20 45 58 49 53 54 53 20 6d 65 74 61 64 NOT EXISTS metad
26d0: 61 74 20 28 69 64 20 49 4e 54 45 47 45 52 2c 20 at (id INTEGER,
26e0: 76 61 72 20 54 45 58 54 2c 20 76 61 6c 20 54 45 var TEXT, val TE
26f0: 58 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 XT,.
2700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2710: 20 20 20 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 CONSTRAINT
2720: 20 6d 65 74 61 64 61 74 5f 63 6f 6e 73 74 72 61 metadat_constra
2730: 69 6e 74 20 55 4e 49 51 55 45 20 28 76 61 72 29 int UNIQUE (var)
2740: 29 3b 22 29 0a 20 20 20 20 20 20 20 28 64 62 3a );"). (db:
2750: 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41 set-var db "MEGA
2760: 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e TEST_VERSION" 1.
2770: 32 31 29 20 3b 3b 20 73 65 74 20 62 65 66 6f 72 21) ;; set befor
2780: 65 2c 20 6a 75 73 74 20 69 6e 20 63 61 73 65 20 e, just in case
2790: 74 68 65 20 63 68 61 6e 67 65 73 20 61 72 65 20 the changes are
27a0: 61 6c 72 65 61 64 79 20 61 70 70 6c 69 65 64 0a already applied.
27b0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a (sqlite3:
27c0: 65 78 65 63 75 74 65 20 64 62 20 74 65 73 74 2d execute db test-
27d0: 6d 65 74 61 2d 64 65 66 29 0a 20 20 20 20 20 20 meta-def).
27e0: 20 28 66 6f 72 2d 65 61 63 68 20 0a 09 28 6c 61 (for-each ..(la
27f0: 6d 62 64 61 20 28 73 74 6d 74 29 0a 09 20 20 28 mbda (stmt).. (
2800: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 sqlite3:execute
2810: 64 62 20 73 74 6d 74 29 29 0a 09 28 6c 69 73 74 db stmt))..(list
2820: 20 0a 09 20 22 41 4c 54 45 52 20 54 41 42 4c 45 .. "ALTER TABLE
2830: 20 74 65 73 74 73 20 41 44 44 20 43 4f 4c 55 4d tests ADD COLUM
2840: 4e 20 66 69 72 73 74 5f 65 72 72 20 54 45 58 54 N first_err TEXT
2850: 3b 22 0a 09 20 22 41 4c 54 45 52 20 54 41 42 4c ;".. "ALTER TABL
2860: 45 20 74 65 73 74 73 20 41 44 44 20 43 4f 4c 55 E tests ADD COLU
2870: 4d 4e 20 66 69 72 73 74 5f 77 61 72 6e 20 54 45 MN first_warn TE
2880: 58 54 3b 22 0a 09 20 29 29 0a 20 20 20 20 20 20 XT;".. )).
2890: 20 28 70 61 74 63 68 2d 64 62 29 29 0a 20 20 20 (patch-db)).
28a0: 20 20 20 28 28 3c 20 6d 76 65 72 20 31 2e 32 34 ((< mver 1.24
28b0: 29 0a 20 20 20 20 20 20 20 28 64 62 3a 73 65 74 ). (db:set
28c0: 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 53 -var db "MEGATES
28d0: 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e 32 34 29 T_VERSION" 1.24)
28e0: 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 . (sqlite3
28f0: 3a 65 78 65 63 75 74 65 20 64 62 20 22 44 52 4f :execute db "DRO
2900: 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 P TABLE IF EXIST
2910: 53 20 74 65 73 74 5f 64 61 74 61 3b 22 29 0a 20 S test_data;").
2920: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 (sqlite3:e
2930: 78 65 63 75 74 65 20 64 62 20 22 44 52 4f 50 20 xecute db "DROP
2940: 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 TABLE IF EXISTS
2950: 74 65 73 74 5f 6d 65 74 61 3b 22 29 0a 20 20 20 test_meta;").
2960: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 (sqlite3:exe
2970: 63 75 74 65 20 64 62 20 74 65 73 74 2d 6d 65 74 cute db test-met
2980: 61 2d 64 65 66 29 0a 20 20 20 20 20 20 20 28 73 a-def). (s
2990: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 qlite3:execute d
29a0: 62 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 b "CREATE TABLE
29b0: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 74 65 IF NOT EXISTS te
29c0: 73 74 5f 64 61 74 61 20 28 69 64 20 49 4e 54 45 st_data (id INTE
29d0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c GER PRIMARY KEY,
29e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2a00: 20 74 65 73 74 5f 69 64 20 49 4e 54 45 47 45 52 test_id INTEGER
2a10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2a30: 20 20 63 61 74 65 67 6f 72 79 20 54 45 58 54 20 category TEXT
2a40: 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 DEFAULT '',.
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2a60: 20 20 20 20 20 20 20 20 20 20 20 20 76 61 72 69 vari
2a70: 61 62 6c 65 20 54 45 58 54 2c 0a 09 20 20 20 20 able TEXT,..
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2a90: 20 20 20 20 76 61 6c 75 65 20 52 45 41 4c 2c 0a value REAL,.
2aa0: 09 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
2ab0: 20 20 20 20 20 20 20 20 20 65 78 70 65 63 74 65 expecte
2ac0: 64 20 52 45 41 4c 2c 0a 09 20 20 20 20 20 20 20 d REAL,..
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2ae0: 20 74 6f 6c 20 52 45 41 4c 2c 0a 20 20 20 20 20 tol REAL,.
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2b00: 20 20 20 20 20 20 20 20 20 20 20 75 6e 69 74 73 units
2b10: 20 54 45 58 54 2c 0a 20 20 20 20 20 20 20 20 20 TEXT,.
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2b30: 20 20 20 20 20 20 20 63 6f 6d 6d 65 6e 74 20 54 comment T
2b40: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a EXT DEFAULT '',.
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2b70: 73 74 61 74 75 73 20 54 45 58 54 20 44 45 46 41 status TEXT DEFA
2b80: 55 4c 54 20 27 6e 2f 61 27 2c 66 6f 73 73 0a 20 ULT 'n/a',foss.
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e CON
2bb0: 53 54 52 41 49 4e 54 20 74 65 73 74 5f 64 61 74 STRAINT test_dat
2bc0: 61 20 55 4e 49 51 55 45 20 28 74 65 73 74 5f 69 a UNIQUE (test_i
2bd0: 64 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 69 61 d,category,varia
2be0: 62 6c 65 29 29 3b 22 29 0a 20 20 20 20 20 20 20 ble));").
2bf0: 28 70 61 74 63 68 2d 64 62 29 29 0a 20 20 20 20 (patch-db)).
2c00: 20 20 28 28 3c 20 6d 76 65 72 20 31 2e 32 37 29 ((< mver 1.27)
2c10: 0a 20 20 20 20 20 20 20 28 64 62 3a 73 65 74 2d . (db:set-
2c20: 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 53 54 var db "MEGATEST
2c30: 5f 56 45 52 53 49 4f 4e 22 20 31 2e 32 37 29 0a _VERSION" 1.27).
2c40: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a (sqlite3:
2c50: 65 78 65 63 75 74 65 20 64 62 20 22 41 4c 54 45 execute db "ALTE
2c60: 52 20 54 41 42 4c 45 20 74 65 73 74 5f 64 61 74 R TABLE test_dat
2c70: 61 20 41 44 44 20 43 4f 4c 55 4d 4e 20 74 79 70 a ADD COLUMN typ
2c80: 65 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 e TEXT DEFAULT '
2c90: 27 3b 22 29 0a 20 20 20 20 20 20 20 28 70 61 74 ';"). (pat
2ca0: 63 68 2d 64 62 29 29 0a 20 20 20 20 20 20 28 28 ch-db)). ((
2cb0: 3c 20 6d 76 65 72 20 31 2e 32 39 29 0a 20 20 20 < mver 1.29).
2cc0: 20 20 20 20 28 64 62 3a 73 65 74 2d 76 61 72 20 (db:set-var
2cd0: 64 62 20 22 4d 45 47 41 54 45 53 54 5f 56 45 52 db "MEGATEST_VER
2ce0: 53 49 4f 4e 22 20 31 2e 32 39 29 0a 20 20 20 20 SION" 1.29).
2cf0: 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 (sqlite3:exec
2d00: 75 74 65 20 64 62 20 22 41 4c 54 45 52 20 54 41 ute db "ALTER TA
2d10: 42 4c 45 20 74 65 73 74 5f 73 74 65 70 73 20 41 BLE test_steps A
2d20: 44 44 20 43 4f 4c 55 4d 4e 20 6c 6f 67 66 69 6c DD COLUMN logfil
2d30: 65 20 54 45 58 54 3b 22 29 0a 20 20 20 20 20 20 e TEXT;").
2d40: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 (sqlite3:execut
2d50: 65 20 64 62 20 22 41 4c 54 45 52 20 54 41 42 4c e db "ALTER TABL
2d60: 45 20 74 65 73 74 73 20 41 44 44 20 43 4f 4c 55 E tests ADD COLU
2d70: 4d 4e 20 73 68 6f 72 74 64 69 72 20 54 45 58 54 MN shortdir TEXT
2d80: 20 44 45 46 41 55 4c 54 20 27 27 3b 22 29 0a 20 DEFAULT '';").
2d90: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 (sqlite3:e
2da0: 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 54 xecute db "CREAT
2db0: 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 E TABLE IF NOT E
2dc0: 58 49 53 54 53 20 74 61 73 6b 73 5f 71 75 65 75 XISTS tasks_queu
2dd0: 65 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 e (id INTEGER PR
2de0: 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 IMARY KEY,.
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2e00: 20 20 20 20 20 20 20 20 20 20 20 61 63 74 69 6f actio
2e10: 6e 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 n TEXT DEFAULT '
2e20: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ',.
2e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2e40: 20 20 20 6f 77 6e 65 72 20 54 45 58 54 2c 0a 20 owner TEXT,.
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 s
2e70: 74 61 74 65 20 54 45 58 54 20 44 45 46 41 55 4c tate TEXT DEFAUL
2e80: 54 20 27 6e 65 77 27 2c 0a 20 20 20 20 20 20 20 T 'new',.
2e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2ea0: 20 20 20 20 20 20 20 20 20 74 61 72 67 65 74 20 target
2eb0: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c TEXT DEFAULT '',
2ec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2ee0: 20 6e 61 6d 65 20 54 45 58 54 20 44 45 46 41 55 name TEXT DEFAU
2ef0: 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 LT '',.
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2f10: 20 20 20 20 20 20 20 74 65 73 74 20 54 45 58 54 test TEXT
2f20: 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 DEFAULT '',.
2f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74 65 ite
2f50: 6d 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 m TEXT DEFAULT '
2f60: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ',.
2f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2f80: 20 20 20 63 72 65 61 74 69 6f 6e 5f 74 69 6d 65 creation_time
2f90: 20 54 49 4d 45 53 54 41 4d 50 2c 0a 20 20 20 20 TIMESTAMP,.
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 65 78 65 63 exec
2fc0: 75 74 69 6f 6e 5f 74 69 6d 65 20 54 49 4d 45 53 ution_time TIMES
2fd0: 54 41 4d 50 29 3b 22 29 0a 20 20 20 20 20 20 20 TAMP);").
2fe0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 (sqlite3:execute
2ff0: 20 64 62 20 22 43 52 45 41 54 45 20 54 41 42 4c db "CREATE TABL
3000: 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 E IF NOT EXISTS
3010: 6d 6f 6e 69 74 6f 72 73 20 28 69 64 20 49 4e 54 monitors (id INT
3020: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY
3030: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3050: 20 20 70 69 64 20 49 4e 54 45 47 45 52 2c 0a 20 pid INTEGER,.
3060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 s
3080: 74 61 72 74 5f 74 69 6d 65 20 54 49 4d 45 53 54 tart_time TIMEST
3090: 41 4d 50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 AMP,.
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
30b0: 20 20 20 20 20 6c 61 73 74 5f 75 70 64 61 74 65 last_update
30c0: 20 54 49 4d 45 53 54 41 4d 50 2c 0a 20 20 20 20 TIMESTAMP,.
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
30e0: 20 20 20 20 20 20 20 20 20 20 20 20 68 6f 73 74 host
30f0: 6e 61 6d 65 20 54 45 58 54 2c 0a 20 20 20 20 20 name TEXT,.
3100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3110: 20 20 20 20 20 20 20 20 20 20 20 75 73 65 72 6e usern
3120: 61 6d 65 20 54 45 58 54 2c 0a 20 20 20 20 20 20 ame TEXT,.
3130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3140: 20 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52 41 CONSTRA
3150: 49 4e 54 20 6d 6f 6e 69 74 6f 72 73 5f 63 6f 6e INT monitors_con
3160: 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28 straint UNIQUE (
3170: 70 69 64 2c 68 6f 73 74 6e 61 6d 65 29 29 3b 22 pid,hostname));"
3180: 29 0a 20 20 20 20 20 20 20 28 70 61 74 63 68 2d ). (patch-
3190: 64 62 29 29 0a 20 20 20 20 20 20 28 28 3c 20 6d db)). ((< m
31a0: 76 65 72 20 6d 65 67 61 74 65 73 74 2d 76 65 72 ver megatest-ver
31b0: 73 69 6f 6e 29 0a 20 20 20 20 20 20 20 28 64 62 sion). (db
31c0: 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47 :set-var db "MEG
31d0: 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 6d ATEST_VERSION" m
31e0: 65 67 61 74 65 73 74 2d 76 65 72 73 69 6f 6e 29 egatest-version)
31f0: 29 29 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d )))))..;;=======
3200: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3210: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3220: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3230: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a ===============.
3240: 3b 3b 20 6d 65 74 61 20 67 65 74 20 61 6e 64 20 ;; meta get and
3250: 73 65 74 20 76 61 72 73 0a 3b 3b 3d 3d 3d 3d 3d set vars.;;=====
3260: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3270: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3280: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3290: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
32a0: 3d 0a 0a 3b 3b 20 72 65 74 75 72 6e 73 20 6e 75 =..;; returns nu
32b0: 6d 62 65 72 20 69 66 20 73 74 72 69 6e 67 2d 3e mber if string->
32c0: 6e 75 6d 62 65 72 20 69 73 20 73 75 63 63 65 73 number is succes
32d0: 73 66 75 6c 2c 20 73 74 72 69 6e 67 20 6f 74 68 sful, string oth
32e0: 65 72 77 69 73 65 0a 28 64 65 66 69 6e 65 20 28 erwise.(define (
32f0: 64 62 3a 67 65 74 2d 76 61 72 20 64 62 20 76 61 db:get-var db va
3300: 72 29 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20 r). (let ((res
3310: 23 66 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65 #f)). (sqlite
3320: 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 3:for-each-row.
3330: 20 20 20 20 28 6c 61 6d 62 64 61 20 28 76 61 6c (lambda (val
3340: 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72 ). (set! r
3350: 65 73 20 76 61 6c 29 29 0a 20 20 20 20 20 64 62 es val)). db
3360: 20 22 53 45 4c 45 43 54 20 76 61 6c 20 46 52 4f "SELECT val FRO
3370: 4d 20 6d 65 74 61 64 61 74 20 57 48 45 52 45 20 M metadat WHERE
3380: 76 61 72 3d 3f 3b 22 20 76 61 72 29 0a 20 20 20 var=?;" var).
3390: 20 28 69 66 20 28 73 74 72 69 6e 67 3f 20 72 65 (if (string? re
33a0: 73 29 0a 09 28 6c 65 74 20 28 28 76 61 6c 6e 75 s)..(let ((valnu
33b0: 6d 20 28 73 74 72 69 6e 67 2d 3e 6e 75 6d 62 65 m (string->numbe
33c0: 72 20 72 65 73 29 29 29 0a 09 20 20 28 69 66 20 r res))).. (if
33d0: 76 61 6c 6e 75 6d 20 76 61 6c 6e 75 6d 20 72 65 valnum valnum re
33e0: 73 29 29 0a 09 72 65 73 29 29 29 0a 0a 28 64 65 s))..res)))..(de
33f0: 66 69 6e 65 20 28 64 62 3a 73 65 74 2d 76 61 72 fine (db:set-var
3400: 20 64 62 20 76 61 72 20 76 61 6c 29 0a 20 20 28 db var val). (
3410: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 sqlite3:execute
3420: 64 62 20 22 49 4e 53 45 52 54 20 4f 52 20 52 45 db "INSERT OR RE
3430: 50 4c 41 43 45 20 49 4e 54 4f 20 6d 65 74 61 64 PLACE INTO metad
3440: 61 74 20 28 76 61 72 2c 76 61 6c 29 20 56 41 4c at (var,val) VAL
3450: 55 45 53 20 28 3f 2c 3f 29 3b 22 20 76 61 72 20 UES (?,?);" var
3460: 76 61 6c 29 29 0a 0a 3b 3b 20 75 73 65 20 61 20 val))..;; use a
3470: 67 6c 6f 62 61 6c 20 66 6f 72 20 73 6f 6d 65 20 global for some
3480: 70 72 69 6d 69 74 69 76 65 20 63 61 63 68 69 6e primitive cachin
3490: 67 2c 20 69 74 20 69 73 20 6a 75 73 74 20 73 69 g, it is just si
34a0: 6c 6c 79 20 74 6f 20 72 65 2d 72 65 61 64 20 74 lly to re-read t
34b0: 68 65 20 64 62 20 0a 3b 3b 20 6f 76 65 72 20 61 he db .;; over a
34c0: 6e 64 20 6f 76 65 72 20 61 67 61 69 6e 20 66 6f nd over again fo
34d0: 72 20 74 68 65 20 6b 65 79 73 20 73 69 6e 63 65 r the keys since
34e0: 20 74 68 65 79 20 6e 65 76 65 72 20 63 68 61 6e they never chan
34f0: 67 65 0a 0a 28 64 65 66 69 6e 65 20 2a 64 62 2d ge..(define *db-
3500: 6b 65 79 73 2a 20 23 66 29 0a 0a 28 64 65 66 69 keys* #f)..(defi
3510: 6e 65 20 28 64 62 2d 67 65 74 2d 6b 65 79 73 20 ne (db-get-keys
3520: 64 62 29 0a 20 20 28 69 66 20 2a 64 62 2d 6b 65 db). (if *db-ke
3530: 79 73 2a 20 2a 64 62 2d 6b 65 79 73 2a 20 0a 20 ys* *db-keys* .
3540: 20 20 20 20 20 28 6c 65 74 20 28 28 72 65 73 20 (let ((res
3550: 27 28 29 29 29 0a 09 28 73 71 6c 69 74 65 33 3a '()))..(sqlite3:
3560: 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 09 20 for-each-row ..
3570: 28 6c 61 6d 62 64 61 20 28 6b 65 79 20 6b 65 79 (lambda (key key
3580: 74 79 70 65 29 0a 09 20 20 20 28 73 65 74 21 20 type).. (set!
3590: 72 65 73 20 28 63 6f 6e 73 20 28 76 65 63 74 6f res (cons (vecto
35a0: 72 20 6b 65 79 20 6b 65 79 74 79 70 65 29 20 72 r key keytype) r
35b0: 65 73 29 29 29 0a 09 20 64 62 0a 09 20 22 53 45 es))).. db.. "SE
35c0: 4c 45 43 54 20 66 69 65 6c 64 6e 61 6d 65 2c 66 LECT fieldname,f
35d0: 69 65 6c 64 74 79 70 65 20 46 52 4f 4d 20 6b 65 ieldtype FROM ke
35e0: 79 73 20 4f 52 44 45 52 20 42 59 20 69 64 20 44 ys ORDER BY id D
35f0: 45 53 43 3b 22 29 0a 09 28 73 65 74 21 20 2a 64 ESC;")..(set! *d
3600: 62 2d 6b 65 79 73 2a 20 72 65 73 29 0a 09 72 65 b-keys* res)..re
3610: 73 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 64 62 s)))..(define db
3620: 3a 67 65 74 2d 6b 65 79 73 20 64 62 2d 67 65 74 :get-keys db-get
3630: 2d 6b 65 79 73 29 0a 0a 28 64 65 66 69 6e 65 20 -keys)..(define
3640: 28 64 62 3a 67 65 74 2d 76 61 6c 75 65 2d 62 79 (db:get-value-by
3650: 2d 68 65 61 64 65 72 20 72 6f 77 20 68 65 61 64 -header row head
3660: 65 72 20 66 69 65 6c 64 29 0a 20 20 28 69 66 20 er field). (if
3670: 28 6e 75 6c 6c 3f 20 68 65 61 64 65 72 29 20 23 (null? header) #
3680: 66 0a 20 20 20 20 20 20 28 6c 65 74 20 6c 6f 6f f. (let loo
3690: 70 20 28 28 68 65 64 20 28 63 61 72 20 68 65 61 p ((hed (car hea
36a0: 64 65 72 29 29 0a 09 09 20 28 74 61 6c 20 28 63 der))... (tal (c
36b0: 64 72 20 68 65 61 64 65 72 29 29 0a 09 09 20 28 dr header))... (
36c0: 6e 20 20 20 30 29 29 0a 09 28 69 66 20 28 65 71 n 0))..(if (eq
36d0: 75 61 6c 3f 20 68 65 64 20 66 69 65 6c 64 29 0a ual? hed field).
36e0: 09 20 20 20 20 28 76 65 63 74 6f 72 2d 72 65 66 . (vector-ref
36f0: 20 72 6f 77 20 6e 29 0a 09 20 20 20 20 28 69 66 row n).. (if
3700: 20 28 6e 75 6c 6c 3f 20 74 61 6c 29 20 23 66 20 (null? tal) #f
3710: 28 6c 6f 6f 70 20 28 63 61 72 20 74 61 6c 29 28 (loop (car tal)(
3720: 63 64 72 20 74 61 6c 29 28 2b 20 6e 20 31 29 29 cdr tal)(+ n 1))
3730: 29 29 29 29 29 0a 09 20 20 20 20 0a 3b 3b 3d 3d ))))).. .;;==
3740: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3750: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3760: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3770: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3780: 3d 3d 3d 3d 0a 3b 3b 20 20 52 20 55 20 4e 20 53 ====.;; R U N S
3790: 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d .;;=============
37a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
37b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
37c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
37d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65 66 69 =========..(defi
37e0: 6e 65 20 28 72 75 6e 73 3a 67 65 74 2d 73 74 64 ne (runs:get-std
37f0: 2d 72 75 6e 2d 66 69 65 6c 64 73 20 6b 65 79 73 -run-fields keys
3800: 20 72 65 6d 66 69 65 6c 64 73 29 0a 20 20 28 6c remfields). (l
3810: 65 74 2a 20 28 28 68 65 61 64 65 72 20 20 20 20 et* ((header
3820: 28 61 70 70 65 6e 64 20 28 6d 61 70 20 6b 65 79 (append (map key
3830: 3a 67 65 74 2d 66 69 65 6c 64 6e 61 6d 65 20 6b :get-fieldname k
3840: 65 79 73 29 0a 09 09 09 20 20 20 20 72 65 6d 66 eys).... remf
3850: 69 65 6c 64 73 29 29 0a 09 20 28 6b 65 79 73 74 ields)).. (keyst
3860: 72 20 20 20 20 28 63 6f 6e 63 20 28 6b 65 79 73 r (conc (keys
3870: 2d 3e 6b 65 79 73 74 72 20 6b 65 79 73 29 20 22 ->keystr keys) "
3880: 2c 22 0a 09 09 09 20 20 28 73 74 72 69 6e 67 2d ,".... (string-
3890: 69 6e 74 65 72 73 70 65 72 73 65 20 72 65 6d 66 intersperse remf
38a0: 69 65 6c 64 73 20 22 2c 22 29 29 29 29 0a 20 20 ields ",")))).
38b0: 20 20 28 6c 69 73 74 20 6b 65 79 73 74 72 20 68 (list keystr h
38c0: 65 61 64 65 72 29 29 29 0a 0a 3b 3b 20 57 41 53 eader)))..;; WAS
38d0: 20 64 62 2d 67 65 74 2d 72 75 6e 73 20 46 49 58 db-get-runs FIX
38e0: 4d 45 20 49 4e 20 52 45 4d 41 49 4e 49 4e 47 20 ME IN REMAINING
38f0: 43 4f 44 45 0a 3b 3b 0a 3b 3b 20 4d 45 52 47 45 CODE.;;.;; MERGE
3900: 20 54 48 49 53 20 57 49 54 48 20 64 62 3a 67 65 THIS WITH db:ge
3910: 74 2d 72 75 6e 73 2c 20 61 63 63 69 64 65 6e 74 t-runs, accident
3920: 6c 79 20 77 72 6f 74 65 20 69 74 20 74 77 69 63 ly wrote it twic
3930: 65 0a 3b 3b 0a 3b 3b 20 72 65 70 6c 61 63 65 20 e.;;.;; replace
3940: 68 65 61 64 65 72 20 61 6e 64 20 6b 65 79 73 74 header and keyst
3950: 72 20 77 69 74 68 20 61 20 63 61 6c 6c 20 74 6f r with a call to
3960: 20 72 75 6e 73 3a 67 65 74 2d 73 74 64 2d 72 75 runs:get-std-ru
3970: 6e 2d 66 69 65 6c 64 73 0a 3b 3b 0a 3b 3b 20 6b n-fields.;;.;; k
3980: 65 79 70 61 74 74 73 3a 20 28 20 28 4b 45 59 31 eypatts: ( (KEY1
3990: 20 22 61 62 63 25 64 65 66 22 29 28 4b 45 59 32 "abc%def")(KEY2
39a0: 20 22 25 22 29 20 29 0a 3b 3b 0a 28 64 65 66 69 "%") ).;;.(defi
39b0: 6e 65 20 28 64 62 3a 67 65 74 2d 72 75 6e 73 20 ne (db:get-runs
39c0: 64 62 20 72 75 6e 70 61 74 74 20 63 6f 75 6e 74 db runpatt count
39d0: 20 6f 66 66 73 65 74 20 6b 65 79 70 61 74 74 73 offset keypatts
39e0: 29 0a 20 20 28 6c 65 74 2a 20 28 28 72 65 73 20 ). (let* ((res
39f0: 20 20 20 20 20 27 28 29 29 0a 09 20 28 6b 65 79 '()).. (key
3a00: 73 20 20 20 20 20 20 28 64 62 2d 67 65 74 2d 6b s (db-get-k
3a10: 65 79 73 20 64 62 29 29 0a 09 20 28 72 65 6d 66 eys db)).. (remf
3a20: 69 65 6c 64 73 20 28 6c 69 73 74 20 22 69 64 22 ields (list "id"
3a30: 20 22 72 75 6e 6e 61 6d 65 22 20 22 73 74 61 74 "runname" "stat
3a40: 65 22 20 22 73 74 61 74 75 73 22 20 22 6f 77 6e e" "status" "own
3a50: 65 72 22 20 22 65 76 65 6e 74 5f 74 69 6d 65 22 er" "event_time"
3a60: 29 29 0a 09 20 28 68 65 61 64 65 72 20 20 20 20 )).. (header
3a70: 28 61 70 70 65 6e 64 20 28 6d 61 70 20 6b 65 79 (append (map key
3a80: 3a 67 65 74 2d 66 69 65 6c 64 6e 61 6d 65 20 6b :get-fieldname k
3a90: 65 79 73 29 0a 09 09 09 20 20 20 20 72 65 6d 66 eys).... remf
3aa0: 69 65 6c 64 73 29 29 0a 09 20 28 6b 65 79 73 74 ields)).. (keyst
3ab0: 72 20 20 20 20 28 63 6f 6e 63 20 28 6b 65 79 73 r (conc (keys
3ac0: 2d 3e 6b 65 79 73 74 72 20 6b 65 79 73 29 20 22 ->keystr keys) "
3ad0: 2c 22 0a 09 09 09 20 20 28 73 74 72 69 6e 67 2d ,".... (string-
3ae0: 69 6e 74 65 72 73 70 65 72 73 65 20 72 65 6d 66 intersperse remf
3af0: 69 65 6c 64 73 20 22 2c 22 29 29 29 0a 09 20 28 ields ","))).. (
3b00: 71 72 79 73 74 72 20 20 20 20 28 63 6f 6e 63 20 qrystr (conc
3b10: 22 53 45 4c 45 43 54 20 22 20 6b 65 79 73 74 72 "SELECT " keystr
3b20: 20 22 20 46 52 4f 4d 20 72 75 6e 73 20 57 48 45 " FROM runs WHE
3b30: 52 45 20 72 75 6e 6e 61 6d 65 20 4c 49 4b 45 20 RE runname LIKE
3b40: 3f 20 22 0a 09 09 09 20 20 3b 3b 20 47 65 6e 65 ? ".... ;; Gene
3b50: 72 61 74 65 3a 20 22 20 41 4e 44 20 78 20 4c 49 rate: " AND x LI
3b60: 4b 45 20 27 6b 65 79 70 61 74 74 27 20 2e 2e 2e KE 'keypatt' ...
3b70: 22 0a 09 09 09 20 20 28 69 66 20 28 6e 75 6c 6c ".... (if (null
3b80: 3f 20 6b 65 79 70 61 74 74 73 29 20 22 22 0a 09 ? keypatts) ""..
3b90: 09 09 20 20 20 20 20 20 28 63 6f 6e 63 20 22 20 .. (conc "
3ba0: 41 4e 44 20 22 0a 09 09 09 09 20 20 20 20 28 73 AND "..... (s
3bb0: 74 72 69 6e 67 2d 6a 6f 69 6e 20 0a 09 09 09 09 tring-join .....
3bc0: 20 20 20 20 20 28 6d 61 70 20 28 6c 61 6d 62 64 (map (lambd
3bd0: 61 20 28 6b 65 79 70 61 74 74 29 0a 09 09 09 09 a (keypatt).....
3be0: 09 20 20 20 20 28 6c 65 74 20 28 28 6b 65 79 20 . (let ((key
3bf0: 20 28 63 61 72 20 6b 65 79 70 61 74 74 29 29 0a (car keypatt)).
3c00: 09 09 09 09 09 09 20 20 28 70 61 74 74 20 28 63 ...... (patt (c
3c10: 61 64 72 20 6b 65 79 70 61 74 74 29 29 29 0a 09 adr keypatt)))..
3c20: 09 09 09 09 20 20 20 20 20 20 28 63 6f 6e 63 20 .... (conc
3c30: 6b 65 79 20 22 20 4c 49 4b 45 20 27 22 20 70 61 key " LIKE '" pa
3c40: 74 74 20 22 27 22 29 29 29 0a 09 09 09 09 09 20 tt "'")))......
3c50: 20 6b 65 79 70 61 74 74 73 29 0a 09 09 09 09 20 keypatts).....
3c60: 20 20 20 20 22 20 41 4e 44 20 22 29 29 29 0a 09 " AND ")))..
3c70: 09 09 20 20 22 20 4f 52 44 45 52 20 42 59 20 65 .. " ORDER BY e
3c80: 76 65 6e 74 5f 74 69 6d 65 20 44 45 53 43 20 22 vent_time DESC "
3c90: 0a 09 09 09 20 20 28 69 66 20 28 6e 75 6d 62 65 .... (if (numbe
3ca0: 72 3f 20 63 6f 75 6e 74 29 0a 09 09 09 20 20 20 r? count)....
3cb0: 20 20 20 28 63 6f 6e 63 20 22 20 4c 49 4d 49 54 (conc " LIMIT
3cc0: 20 22 20 63 6f 75 6e 74 29 0a 09 09 09 20 20 20 " count)....
3cd0: 20 20 20 22 22 29 0a 09 09 09 20 20 28 69 66 20 "").... (if
3ce0: 28 6e 75 6d 62 65 72 3f 20 6f 66 66 73 65 74 29 (number? offset)
3cf0: 0a 09 09 09 20 20 20 20 20 20 28 63 6f 6e 63 20 .... (conc
3d00: 22 20 4f 46 46 53 45 54 20 22 20 6f 66 66 73 65 " OFFSET " offse
3d10: 74 29 0a 09 09 09 20 20 20 20 20 20 22 22 29 29 t).... ""))
3d20: 29 29 0a 20 20 20 20 28 64 65 62 75 67 3a 70 72 )). (debug:pr
3d30: 69 6e 74 20 34 20 22 64 62 3a 67 65 74 2d 72 75 int 4 "db:get-ru
3d40: 6e 73 20 71 72 79 73 74 72 3a 20 22 20 71 72 79 ns qrystr: " qry
3d50: 73 74 72 20 22 5c 6e 6b 65 79 70 61 74 74 73 3a str "\nkeypatts:
3d60: 20 22 20 6b 65 79 70 61 74 74 73 20 22 5c 6e 20 " keypatts "\n
3d70: 20 6f 66 66 73 65 74 3a 20 22 20 6f 66 66 73 65 offset: " offse
3d80: 74 20 22 20 6c 69 6d 69 74 3a 20 22 20 63 6f 75 t " limit: " cou
3d90: 6e 74 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 nt). (sqlite3
3da0: 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 :for-each-row.
3db0: 20 20 20 28 6c 61 6d 62 64 61 20 28 61 20 2e 20 (lambda (a .
3dc0: 78 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 x). (set!
3dd0: 72 65 73 20 28 63 6f 6e 73 20 28 61 70 70 6c 79 res (cons (apply
3de0: 20 76 65 63 74 6f 72 20 61 20 78 29 20 72 65 73 vector a x) res
3df0: 29 29 29 0a 20 20 20 20 20 64 62 0a 20 20 20 20 ))). db.
3e00: 20 71 72 79 73 74 72 0a 20 20 20 20 20 72 75 6e qrystr. run
3e10: 70 61 74 74 29 0a 20 20 20 20 28 76 65 63 74 6f patt). (vecto
3e20: 72 20 68 65 61 64 65 72 20 72 65 73 29 29 29 0a r header res))).
3e30: 0a 3b 3b 20 6a 75 73 74 20 67 65 74 20 63 6f 75 .;; just get cou
3e40: 6e 74 20 6f 66 20 72 75 6e 73 0a 28 64 65 66 69 nt of runs.(defi
3e50: 6e 65 20 28 64 62 3a 67 65 74 2d 6e 75 6d 2d 72 ne (db:get-num-r
3e60: 75 6e 73 20 64 62 20 72 75 6e 70 61 74 74 29 0a uns db runpatt).
3e70: 20 20 28 6c 65 74 20 28 28 6e 75 6d 72 75 6e 73 (let ((numruns
3e80: 20 30 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65 0)). (sqlite
3e90: 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 3:for-each-row .
3ea0: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 63 6f (lambda (co
3eb0: 75 6e 74 29 0a 20 20 20 20 20 20 20 28 73 65 74 unt). (set
3ec0: 21 20 6e 75 6d 72 75 6e 73 20 63 6f 75 6e 74 29 ! numruns count)
3ed0: 29 0a 20 20 20 20 20 64 62 0a 20 20 20 20 20 22 ). db. "
3ee0: 53 45 4c 45 43 54 20 43 4f 55 4e 54 28 69 64 29 SELECT COUNT(id)
3ef0: 20 46 52 4f 4d 20 72 75 6e 73 20 57 48 45 52 45 FROM runs WHERE
3f00: 20 72 75 6e 6e 61 6d 65 20 4c 49 4b 45 20 3f 3b runname LIKE ?;
3f10: 22 20 72 75 6e 70 61 74 74 29 0a 20 20 20 20 6e " runpatt). n
3f20: 75 6d 72 75 6e 73 29 29 0a 0a 0a 3b 3b 20 75 73 umruns))...;; us
3f30: 65 20 28 67 65 74 2d 76 61 6c 75 65 2d 62 79 2d e (get-value-by-
3f40: 68 65 61 64 65 72 20 28 64 62 3a 67 65 74 2d 68 header (db:get-h
3f50: 65 61 64 65 72 20 72 75 6e 69 6e 66 6f 29 28 64 eader runinfo)(d
3f60: 62 3a 67 65 74 2d 72 6f 77 20 72 75 6e 69 6e 66 b:get-row runinf
3f70: 6f 29 29 0a 28 64 65 66 69 6e 65 20 28 64 62 3a o)).(define (db:
3f80: 67 65 74 2d 72 75 6e 2d 69 6e 66 6f 20 64 62 20 get-run-info db
3f90: 72 75 6e 2d 69 64 29 0a 20 20 28 6c 65 74 2a 20 run-id). (let*
3fa0: 28 28 72 65 73 20 20 20 20 20 20 23 66 29 0a 09 ((res #f)..
3fb0: 20 28 6b 65 79 73 20 20 20 20 20 20 28 64 62 2d (keys (db-
3fc0: 67 65 74 2d 6b 65 79 73 20 64 62 29 29 0a 09 20 get-keys db))..
3fd0: 28 72 65 6d 66 69 65 6c 64 73 20 28 6c 69 73 74 (remfields (list
3fe0: 20 22 69 64 22 20 22 72 75 6e 6e 61 6d 65 22 20 "id" "runname"
3ff0: 22 73 74 61 74 65 22 20 22 73 74 61 74 75 73 22 "state" "status"
4000: 20 22 6f 77 6e 65 72 22 20 22 65 76 65 6e 74 5f "owner" "event_
4010: 74 69 6d 65 22 29 29 0a 09 20 28 68 65 61 64 65 time")).. (heade
4020: 72 20 20 20 20 28 61 70 70 65 6e 64 20 28 6d 61 r (append (ma
4030: 70 20 6b 65 79 3a 67 65 74 2d 66 69 65 6c 64 6e p key:get-fieldn
4040: 61 6d 65 20 6b 65 79 73 29 0a 09 09 09 20 20 20 ame keys)....
4050: 20 72 65 6d 66 69 65 6c 64 73 29 29 0a 09 20 28 remfields)).. (
4060: 6b 65 79 73 74 72 20 20 20 20 28 63 6f 6e 63 20 keystr (conc
4070: 28 6b 65 79 73 2d 3e 6b 65 79 73 74 72 20 6b 65 (keys->keystr ke
4080: 79 73 29 20 22 2c 22 0a 09 09 09 20 20 28 73 74 ys) ",".... (st
4090: 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 ring-intersperse
40a0: 20 72 65 6d 66 69 65 6c 64 73 20 22 2c 22 29 29 remfields ","))
40b0: 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a )). (sqlite3:
40c0: 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 for-each-row.
40d0: 20 20 28 6c 61 6d 62 64 61 20 28 61 20 2e 20 78 (lambda (a . x
40e0: 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72 ). (set! r
40f0: 65 73 20 28 61 70 70 6c 79 20 76 65 63 74 6f 72 es (apply vector
4100: 20 61 20 78 29 29 29 0a 20 20 20 20 20 64 62 0a a x))). db.
4110: 20 20 20 20 20 28 63 6f 6e 63 20 22 53 45 4c 45 (conc "SELE
4120: 43 54 20 22 20 6b 65 79 73 74 72 20 22 20 46 52 CT " keystr " FR
4130: 4f 4d 20 72 75 6e 73 20 57 48 45 52 45 20 69 64 OM runs WHERE id
4140: 3d 3f 3b 22 29 0a 20 20 20 20 20 72 75 6e 2d 69 =?;"). run-i
4150: 64 29 0a 20 20 20 20 28 76 65 63 74 6f 72 20 68 d). (vector h
4160: 65 61 64 65 72 20 72 65 73 29 29 29 0a 0a 28 64 eader res)))..(d
4170: 65 66 69 6e 65 20 28 64 62 3a 73 65 74 2d 63 6f efine (db:set-co
4180: 6d 6d 65 6e 74 2d 66 6f 72 2d 72 75 6e 20 64 62 mment-for-run db
4190: 20 72 75 6e 2d 69 64 20 63 6f 6d 6d 65 6e 74 29 run-id comment)
41a0: 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 . (sqlite3:exec
41b0: 75 74 65 20 64 62 20 22 55 50 44 41 54 45 20 72 ute db "UPDATE r
41c0: 75 6e 73 20 53 45 54 20 63 6f 6d 6d 65 6e 74 3d uns SET comment=
41d0: 3f 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 63 ? WHERE id=?;" c
41e0: 6f 6d 6d 65 6e 74 20 72 75 6e 2d 69 64 29 29 0a omment run-id)).
41f0: 0a 3b 3b 20 64 6f 65 73 20 6e 6f 74 20 28 6f 62 .;; does not (ob
4200: 76 69 6f 75 73 6c 79 21 29 20 72 65 6d 6f 76 65 viously!) remove
4210: 64 20 64 65 70 65 6e 64 65 6e 74 20 64 61 74 61 d dependent data
4220: 2e 20 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 64 . .(define (db:d
4230: 65 6c 65 74 65 2d 72 75 6e 20 64 62 20 72 75 6e elete-run db run
4240: 2d 69 64 29 0a 20 20 28 73 71 6c 69 74 65 33 3a -id). (sqlite3:
4250: 65 78 65 63 75 74 65 20 64 62 20 22 44 45 4c 45 execute db "DELE
4260: 54 45 20 46 52 4f 4d 20 72 75 6e 73 20 57 48 45 TE FROM runs WHE
4270: 52 45 20 69 64 3d 3f 3b 22 20 72 75 6e 2d 69 64 RE id=?;" run-id
4280: 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a ))..(define (db:
4290: 75 70 64 61 74 65 2d 72 75 6e 2d 65 76 65 6e 74 update-run-event
42a0: 5f 74 69 6d 65 20 64 62 20 72 75 6e 2d 69 64 29 _time db run-id)
42b0: 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 . (sqlite3:exec
42c0: 75 74 65 20 64 62 20 22 55 50 44 41 54 45 20 72 ute db "UPDATE r
42d0: 75 6e 73 20 53 45 54 20 65 76 65 6e 74 5f 74 69 uns SET event_ti
42e0: 6d 65 3d 73 74 72 66 74 69 6d 65 28 27 25 73 27 me=strftime('%s'
42f0: 2c 27 6e 6f 77 27 29 20 57 48 45 52 45 20 69 64 ,'now') WHERE id
4300: 3d 3f 3b 22 20 72 75 6e 2d 69 64 29 29 20 0a 0a =?;" run-id)) ..
4310: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ;;==============
4320: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
4330: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
4340: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
4350: 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 20 54 20 45 ========.;; T E
4360: 20 53 20 54 20 53 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d S T S.;;=======
4370: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
4380: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
4390: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
43a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a ===============.
43b0: 0a 3b 3b 20 73 74 61 74 65 73 20 61 6e 64 20 73 .;; states and s
43c0: 74 61 74 75 73 65 73 20 61 72 65 20 6c 69 73 74 tatuses are list
43d0: 73 2c 20 74 75 72 6e 20 74 68 65 6d 20 69 6e 74 s, turn them int
43e0: 6f 20 28 22 50 41 53 53 22 2c 22 46 41 49 4c 22 o ("PASS","FAIL"
43f0: 2e 2e 2e 29 20 61 6e 64 20 75 73 65 20 4e 4f 54 ...) and use NOT
4400: 20 49 4e 0a 3b 3b 20 69 2e 65 2e 20 74 68 65 73 IN.;; i.e. thes
4410: 65 20 6c 69 73 74 73 20 64 65 66 69 6e 65 20 77 e lists define w
4420: 68 61 74 20 74 6f 20 4e 4f 54 20 73 68 6f 77 2e hat to NOT show.
4430: 0a 3b 3b 20 73 74 61 74 65 73 20 61 6e 64 20 73 .;; states and s
4440: 74 61 74 75 73 65 73 20 61 72 65 20 72 65 71 75 tatuses are requ
4450: 69 72 65 64 20 74 6f 20 62 65 20 6c 69 73 74 73 ired to be lists
4460: 2c 20 65 6d 70 74 79 20 69 73 20 6f 6b 0a 28 64 , empty is ok.(d
4470: 65 66 69 6e 65 20 28 64 62 2d 67 65 74 2d 74 65 efine (db-get-te
4480: 73 74 73 2d 66 6f 72 2d 72 75 6e 20 64 62 20 72 sts-for-run db r
4490: 75 6e 2d 69 64 20 74 65 73 74 70 61 74 74 20 69 un-id testpatt i
44a0: 74 65 6d 70 61 74 74 20 73 74 61 74 65 73 20 73 tempatt states s
44b0: 74 61 74 75 73 65 73 29 0a 20 20 28 6c 65 74 20 tatuses). (let
44c0: 28 28 72 65 73 20 27 28 29 29 0a 09 28 73 74 61 ((res '())..(sta
44d0: 74 65 73 2d 73 74 72 20 20 20 20 28 63 6f 6e 63 tes-str (conc
44e0: 20 22 28 27 22 20 28 73 74 72 69 6e 67 2d 69 6e "('" (string-in
44f0: 74 65 72 73 70 65 72 73 65 20 73 74 61 74 65 73 tersperse states
4500: 20 20 20 22 27 2c 27 22 29 20 22 27 29 22 29 29 "','") "')"))
4510: 0a 09 28 73 74 61 74 75 73 65 73 2d 73 74 72 20 ..(statuses-str
4520: 20 28 63 6f 6e 63 20 22 28 27 22 20 28 73 74 72 (conc "('" (str
4530: 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 ing-intersperse
4540: 73 74 61 74 75 73 65 73 20 22 27 2c 27 22 29 20 statuses "','")
4550: 22 27 29 22 29 29 0a 09 29 0a 20 20 20 20 28 73 "')"))..). (s
4560: 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d qlite3:for-each-
4570: 72 6f 77 20 0a 20 20 20 20 20 28 6c 61 6d 62 64 row . (lambd
4580: 61 20 28 69 64 20 72 75 6e 2d 69 64 20 74 65 73 a (id run-id tes
4590: 74 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61 74 tname state stat
45a0: 75 73 20 65 76 65 6e 74 2d 74 69 6d 65 20 68 6f us event-time ho
45b0: 73 74 20 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 st cpuload diskf
45c0: 72 65 65 20 75 6e 61 6d 65 20 72 75 6e 64 69 72 ree uname rundir
45d0: 20 69 74 65 6d 2d 70 61 74 68 20 72 75 6e 2d 64 item-path run-d
45e0: 75 72 61 74 69 6f 6e 20 66 69 6e 61 6c 2d 6c 6f uration final-lo
45f0: 67 66 20 63 6f 6d 6d 65 6e 74 20 66 69 72 73 74 gf comment first
4600: 2d 65 72 72 20 66 69 72 73 74 2d 77 61 72 6e 29 -err first-warn)
4610: 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72 65 . (set! re
4620: 73 20 28 63 6f 6e 73 20 28 76 65 63 74 6f 72 20 s (cons (vector
4630: 69 64 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 id run-id testna
4640: 6d 65 20 73 74 61 74 65 20 73 74 61 74 75 73 20 me state status
4650: 65 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73 74 20 event-time host
4660: 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 cpuload diskfree
4670: 20 75 6e 61 6d 65 20 72 75 6e 64 69 72 20 69 74 uname rundir it
4680: 65 6d 2d 70 61 74 68 20 72 75 6e 2d 64 75 72 61 em-path run-dura
4690: 74 69 6f 6e 20 66 69 6e 61 6c 2d 6c 6f 67 66 20 tion final-logf
46a0: 63 6f 6d 6d 65 6e 74 20 66 69 72 73 74 2d 65 72 comment first-er
46b0: 72 20 66 69 72 73 74 2d 77 61 72 6e 29 20 72 65 r first-warn) re
46c0: 73 29 29 29 0a 20 20 20 20 20 64 62 20 0a 20 20 s))). db .
46d0: 20 20 20 28 63 6f 6e 63 20 22 53 45 4c 45 43 54 (conc "SELECT
46e0: 20 69 64 2c 72 75 6e 5f 69 64 2c 74 65 73 74 6e id,run_id,testn
46f0: 61 6d 65 2c 73 74 61 74 65 2c 73 74 61 74 75 73 ame,state,status
4700: 2c 65 76 65 6e 74 5f 74 69 6d 65 2c 68 6f 73 74 ,event_time,host
4710: 2c 63 70 75 6c 6f 61 64 2c 64 69 73 6b 66 72 65 ,cpuload,diskfre
4720: 65 2c 75 6e 61 6d 65 2c 72 75 6e 64 69 72 2c 69 e,uname,rundir,i
4730: 74 65 6d 5f 70 61 74 68 2c 72 75 6e 5f 64 75 72 tem_path,run_dur
4740: 61 74 69 6f 6e 2c 66 69 6e 61 6c 5f 6c 6f 67 66 ation,final_logf
4750: 2c 63 6f 6d 6d 65 6e 74 2c 66 69 72 73 74 5f 65 ,comment,first_e
4760: 72 72 2c 66 69 72 73 74 5f 77 61 72 6e 20 22 0a rr,first_warn ".
4770: 09 20 20 20 22 20 46 52 4f 4d 20 74 65 73 74 73 . " FROM tests
4780: 20 57 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 WHERE run_id=?
4790: 41 4e 44 20 74 65 73 74 6e 61 6d 65 20 6c 69 6b AND testname lik
47a0: 65 20 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 e ? AND item_pat
47b0: 68 20 4c 49 4b 45 20 3f 20 22 20 0a 09 20 20 20 h LIKE ? " ..
47c0: 22 20 41 4e 44 20 4e 4f 54 20 28 73 74 61 74 65 " AND NOT (state
47d0: 20 69 6e 20 22 20 73 74 61 74 65 73 2d 73 74 72 in " states-str
47e0: 20 22 20 41 4e 44 20 73 74 61 74 75 73 20 49 4e " AND status IN
47f0: 20 22 20 73 74 61 74 75 73 65 73 2d 73 74 72 20 " statuses-str
4800: 22 29 20 22 0a 09 20 20 20 22 20 4f 52 44 45 52 ") ".. " ORDER
4810: 20 42 59 20 69 64 20 44 45 53 43 3b 22 29 0a 20 BY id DESC;").
4820: 20 20 20 20 72 75 6e 2d 69 64 0a 20 20 20 20 20 run-id.
4830: 28 69 66 20 74 65 73 74 70 61 74 74 20 74 65 73 (if testpatt tes
4840: 74 70 61 74 74 20 22 25 22 29 0a 20 20 20 20 20 tpatt "%").
4850: 28 69 66 20 69 74 65 6d 70 61 74 74 20 69 74 65 (if itempatt ite
4860: 6d 70 61 74 74 20 22 25 22 29 29 0a 20 20 20 20 mpatt "%")).
4870: 72 65 73 29 29 0a 0a 3b 3b 20 74 68 69 73 20 6f res))..;; this o
4880: 6e 65 20 69 73 20 61 20 62 69 74 20 62 72 6f 6b ne is a bit brok
4890: 65 6e 20 42 55 47 20 46 49 58 4d 45 0a 28 64 65 en BUG FIXME.(de
48a0: 66 69 6e 65 20 28 64 62 3a 64 65 6c 65 74 65 2d fine (db:delete-
48b0: 74 65 73 74 2d 73 74 65 70 2d 72 65 63 6f 72 64 test-step-record
48c0: 73 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 s db run-id test
48d0: 2d 6e 61 6d 65 20 69 74 65 6d 64 61 74 29 0a 20 -name itemdat).
48e0: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 (sqlite3:execut
48f0: 65 20 64 62 20 22 44 45 4c 45 54 45 20 46 52 4f e db "DELETE FRO
4900: 4d 20 74 65 73 74 5f 73 74 65 70 73 20 57 48 45 M test_steps WHE
4910: 52 45 20 74 65 73 74 5f 69 64 20 69 6e 20 28 53 RE test_id in (S
4920: 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 74 65 ELECT id FROM te
4930: 73 74 73 20 57 48 45 52 45 20 72 75 6e 5f 69 64 sts WHERE run_id
4940: 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d =? AND testname=
4950: 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 3d ? AND item_path=
4960: 3f 29 3b 22 20 0a 09 09 20 20 20 72 75 6e 2d 69 ?);" ... run-i
4970: 64 20 74 65 73 74 2d 6e 61 6d 65 20 28 69 74 65 d test-name (ite
4980: 6d 2d 6c 69 73 74 2d 3e 70 61 74 68 20 69 74 65 m-list->path ite
4990: 6d 64 61 74 29 29 29 0a 3b 3b 20 0a 28 64 65 66 mdat))).;; .(def
49a0: 69 6e 65 20 28 64 62 3a 64 65 6c 65 74 65 2d 74 ine (db:delete-t
49b0: 65 73 74 2d 72 65 63 6f 72 64 73 20 64 62 20 74 est-records db t
49c0: 65 73 74 2d 69 64 29 0a 20 20 28 73 71 6c 69 74 est-id). (sqlit
49d0: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 44 e3:execute db "D
49e0: 45 4c 45 54 45 20 46 52 4f 4d 20 74 65 73 74 5f ELETE FROM test_
49f0: 73 74 65 70 73 20 57 48 45 52 45 20 74 65 73 74 steps WHERE test
4a00: 5f 69 64 3d 3f 3b 22 20 74 65 73 74 2d 69 64 29 _id=?;" test-id)
4a10: 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 . (sqlite3:exec
4a20: 75 74 65 20 64 62 20 22 44 45 4c 45 54 45 20 46 ute db "DELETE F
4a30: 52 4f 4d 20 74 65 73 74 5f 64 61 74 61 20 20 57 ROM test_data W
4a40: 48 45 52 45 20 74 65 73 74 5f 69 64 3d 3f 3b 22 HERE test_id=?;"
4a50: 20 74 65 73 74 2d 69 64 29 0a 20 20 28 73 71 6c test-id). (sql
4a60: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 ite3:execute db
4a70: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 65 73 "DELETE FROM tes
4a80: 74 73 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 ts WHERE id=?;"
4a90: 74 65 73 74 2d 69 64 29 29 0a 0a 3b 3b 20 73 65 test-id))..;; se
4aa0: 74 20 74 65 73 74 73 20 77 69 74 68 20 73 74 61 t tests with sta
4ab0: 74 65 20 63 75 72 72 73 74 61 74 65 20 61 6e 64 te currstate and
4ac0: 20 73 74 61 74 75 73 20 63 75 72 72 73 74 61 74 status currstat
4ad0: 75 73 20 74 6f 20 6e 65 77 73 74 61 74 65 20 61 us to newstate a
4ae0: 6e 64 20 6e 65 77 73 74 61 74 75 73 0a 3b 3b 20 nd newstatus.;;
4af0: 75 73 65 20 63 75 72 72 73 74 61 74 65 20 3d 20 use currstate =
4b00: 23 66 20 61 6e 64 20 6f 72 20 63 75 72 72 73 74 #f and or currst
4b10: 61 74 75 73 20 3d 20 23 66 20 74 6f 20 61 70 70 atus = #f to app
4b20: 6c 79 20 74 6f 20 61 6e 79 20 73 74 61 74 65 20 ly to any state
4b30: 6f 72 20 73 74 61 74 75 73 20 72 65 73 70 65 63 or status respec
4b40: 74 69 76 65 6c 79 0a 3b 3b 20 57 41 52 4e 49 4e tively.;; WARNIN
4b50: 47 3a 20 53 51 4c 20 69 6e 6a 65 63 74 69 6f 6e G: SQL injection
4b60: 20 72 69 73 6b 0a 28 64 65 66 69 6e 65 20 28 64 risk.(define (d
4b70: 62 3a 73 65 74 2d 74 65 73 74 73 2d 73 74 61 74 b:set-tests-stat
4b80: 65 2d 73 74 61 74 75 73 20 64 62 20 72 75 6e 2d e-status db run-
4b90: 69 64 20 74 65 73 74 6e 61 6d 65 73 20 63 75 72 id testnames cur
4ba0: 72 73 74 61 74 65 20 63 75 72 72 73 74 61 74 75 rstate currstatu
4bb0: 73 20 6e 65 77 73 74 61 74 65 20 6e 65 77 73 74 s newstate newst
4bc0: 61 74 75 73 29 0a 20 20 28 66 6f 72 2d 65 61 63 atus). (for-eac
4bd0: 68 20 28 6c 61 6d 62 64 61 20 28 74 65 73 74 6e h (lambda (testn
4be0: 61 6d 65 29 0a 09 20 20 20 20 20 20 28 6c 65 74 ame).. (let
4bf0: 20 28 28 71 72 79 20 28 63 6f 6e 63 20 22 55 50 ((qry (conc "UP
4c00: 44 41 54 45 20 74 65 73 74 73 20 53 45 54 20 73 DATE tests SET s
4c10: 74 61 74 65 3d 3f 2c 73 74 61 74 75 73 3d 3f 20 tate=?,status=?
4c20: 57 48 45 52 45 20 22 0a 09 09 09 09 09 28 69 66 WHERE "......(if
4c30: 20 63 75 72 72 73 74 61 74 65 20 20 28 63 6f 6e currstate (con
4c40: 63 20 22 73 74 61 74 65 3d 27 22 20 63 75 72 72 c "state='" curr
4c50: 73 74 61 74 65 20 22 27 20 41 4e 44 20 22 29 20 state "' AND ")
4c60: 22 22 29 0a 09 09 09 09 09 28 69 66 20 63 75 72 "")......(if cur
4c70: 72 73 74 61 74 75 73 20 28 63 6f 6e 63 20 22 73 rstatus (conc "s
4c80: 74 61 74 75 73 3d 27 22 20 63 75 72 72 73 74 61 tatus='" currsta
4c90: 74 75 73 20 22 27 20 41 4e 44 20 22 29 20 22 22 tus "' AND ") ""
4ca0: 29 0a 09 09 09 09 09 22 20 72 75 6e 5f 69 64 3d )......" run_id=
4cb0: 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f ? AND testname=?
4cc0: 20 41 4e 44 20 4e 4f 54 20 28 69 74 65 6d 5f 70 AND NOT (item_p
4cd0: 61 74 68 3d 27 27 20 41 4e 44 20 74 65 73 74 6e ath='' AND testn
4ce0: 61 6d 65 20 69 6e 20 28 53 45 4c 45 43 54 20 44 ame in (SELECT D
4cf0: 49 53 54 49 4e 43 54 20 74 65 73 74 6e 61 6d 65 ISTINCT testname
4d00: 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 FROM tests WHER
4d10: 45 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 E testname=? AND
4d20: 20 69 74 65 6d 5f 70 61 74 68 20 21 3d 20 27 27 item_path != ''
4d30: 29 29 3b 22 29 29 29 0a 09 09 3b 3b 28 64 65 62 ));")))...;;(deb
4d40: 75 67 3a 70 72 69 6e 74 20 30 20 22 51 52 59 3a ug:print 0 "QRY:
4d50: 20 22 20 71 72 79 29 0a 09 09 28 73 71 6c 69 74 " qry)...(sqlit
4d60: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 71 72 e3:execute db qr
4d70: 79 20 72 75 6e 2d 69 64 20 6e 65 77 73 74 61 74 y run-id newstat
4d80: 65 20 6e 65 77 73 74 61 74 75 73 20 74 65 73 74 e newstatus test
4d90: 6e 61 6d 65 20 74 65 73 74 6e 61 6d 65 29 29 29 name testname)))
4da0: 0a 09 20 20 20 20 74 65 73 74 6e 61 6d 65 73 29 .. testnames)
4db0: 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 64 )..(define (db:d
4dc0: 65 6c 65 74 65 2d 74 65 73 74 73 2d 69 6e 2d 73 elete-tests-in-s
4dd0: 74 61 74 65 20 64 62 20 72 75 6e 2d 69 64 20 73 tate db run-id s
4de0: 74 61 74 65 29 0a 20 20 28 73 71 6c 69 74 65 33 tate). (sqlite3
4df0: 3a 65 78 65 63 75 74 65 20 64 62 20 22 44 45 4c :execute db "DEL
4e00: 45 54 45 20 46 52 4f 4d 20 74 65 73 74 73 20 57 ETE FROM tests W
4e10: 48 45 52 45 20 73 74 61 74 65 3d 3f 20 41 4e 44 HERE state=? AND
4e20: 20 72 75 6e 5f 69 64 3d 3f 3b 22 20 73 74 61 74 run_id=?;" stat
4e30: 65 20 72 75 6e 2d 69 64 29 29 0a 0a 28 64 65 66 e run-id))..(def
4e40: 69 6e 65 20 28 64 62 3a 74 65 73 74 2d 73 65 74 ine (db:test-set
4e50: 2d 73 74 61 74 65 2d 73 74 61 74 75 73 2d 62 79 -state-status-by
4e60: 2d 69 64 20 64 62 20 74 65 73 74 2d 69 64 20 6e -id db test-id n
4e70: 65 77 73 74 61 74 65 20 6e 65 77 73 74 61 74 75 ewstate newstatu
4e80: 73 20 6e 65 77 63 6f 6d 6d 65 6e 74 29 0a 20 20 s newcomment).
4e90: 28 69 66 20 6e 65 77 73 74 61 74 65 20 20 20 28 (if newstate (
4ea0: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 sqlite3:execute
4eb0: 64 62 20 22 55 50 44 41 54 45 20 74 65 73 74 73 db "UPDATE tests
4ec0: 20 53 45 54 20 73 74 61 74 65 3d 3f 20 20 20 57 SET state=? W
4ed0: 48 45 52 45 20 69 64 3d 3f 3b 22 20 6e 65 77 73 HERE id=?;" news
4ee0: 74 61 74 65 20 20 20 74 65 73 74 2d 69 64 29 29 tate test-id))
4ef0: 0a 20 20 28 69 66 20 6e 65 77 73 74 61 74 75 73 . (if newstatus
4f00: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 (sqlite3:execu
4f10: 74 65 20 64 62 20 22 55 50 44 41 54 45 20 74 65 te db "UPDATE te
4f20: 73 74 73 20 53 45 54 20 73 74 61 74 75 73 3d 3f sts SET status=?
4f30: 20 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 6e WHERE id=?;" n
4f40: 65 77 73 74 61 74 75 73 20 20 74 65 73 74 2d 69 ewstatus test-i
4f50: 64 29 29 0a 20 20 28 69 66 20 6e 65 77 63 6f 6d d)). (if newcom
4f60: 6d 65 6e 74 20 28 73 71 6c 69 74 65 33 3a 65 78 ment (sqlite3:ex
4f70: 65 63 75 74 65 20 64 62 20 22 55 50 44 41 54 45 ecute db "UPDATE
4f80: 20 74 65 73 74 73 20 53 45 54 20 63 6f 6d 6d 65 tests SET comme
4f90: 6e 74 3d 3f 20 57 48 45 52 45 20 69 64 3d 3f 3b nt=? WHERE id=?;
4fa0: 22 20 6e 65 77 63 6f 6d 6d 65 6e 74 20 74 65 73 " newcomment tes
4fb0: 74 2d 69 64 29 29 29 0a 0a 28 64 65 66 69 6e 65 t-id)))..(define
4fc0: 20 28 64 62 3a 67 65 74 2d 63 6f 75 6e 74 2d 74 (db:get-count-t
4fd0: 65 73 74 73 2d 72 75 6e 6e 69 6e 67 20 64 62 29 ests-running db)
4fe0: 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20 30 29 . (let ((res 0)
4ff0: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 ). (sqlite3:f
5000: 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 or-each-row.
5010: 20 28 6c 61 6d 62 64 61 20 28 63 6f 75 6e 74 29 (lambda (count)
5020: 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72 65 . (set! re
5030: 73 20 63 6f 75 6e 74 29 29 0a 20 20 20 20 20 64 s count)). d
5040: 62 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20 63 b. "SELECT c
5050: 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 74 65 ount(id) FROM te
5060: 73 74 73 20 57 48 45 52 45 20 73 74 61 74 65 20 sts WHERE state
5070: 3d 20 27 52 55 4e 4e 49 4e 47 27 20 4f 52 20 73 = 'RUNNING' OR s
5080: 74 61 74 65 20 3d 20 27 4c 41 55 4e 43 48 45 44 tate = 'LAUNCHED
5090: 27 20 4f 52 20 73 74 61 74 65 20 3d 20 27 52 45 ' OR state = 'RE
50a0: 4d 4f 54 45 48 4f 53 54 53 54 41 52 54 27 3b 22 MOTEHOSTSTART';"
50b0: 29 0a 20 20 20 20 72 65 73 29 29 0a 0a 3b 3b 20 ). res))..;;
50c0: 64 6f 6e 65 20 77 69 74 68 20 72 75 6e 20 77 68 done with run wh
50d0: 65 6e 3a 0a 3b 3b 20 20 20 30 20 74 65 73 74 73 en:.;; 0 tests
50e0: 20 69 6e 20 4c 41 55 4e 43 48 45 44 2c 20 4e 4f in LAUNCHED, NO
50f0: 54 5f 53 54 41 52 54 45 44 2c 20 52 45 4d 4f 54 T_STARTED, REMOT
5100: 45 48 4f 53 54 53 54 41 52 54 2c 20 52 55 4e 4e EHOSTSTART, RUNN
5110: 49 4e 47 0a 28 64 65 66 69 6e 65 20 28 64 62 3a ING.(define (db:
5120: 65 73 74 69 6d 61 74 65 64 2d 74 65 73 74 73 2d estimated-tests-
5130: 72 65 6d 61 69 6e 69 6e 67 20 64 62 20 72 75 6e remaining db run
5140: 2d 69 64 29 0a 20 20 28 6c 65 74 20 28 28 72 65 -id). (let ((re
5150: 73 20 30 29 29 0a 20 20 20 20 28 73 71 6c 69 74 s 0)). (sqlit
5160: 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a e3:for-each-row.
5170: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 63 6f (lambda (co
5180: 75 6e 74 29 0a 20 20 20 20 20 20 20 28 73 65 74 unt). (set
5190: 21 20 72 65 73 20 63 6f 75 6e 74 29 29 0a 20 20 ! res count)).
51a0: 20 20 20 64 62 20 3b 3b 20 4e 42 2f 2f 20 4b 49 db ;; NB// KI
51b0: 4c 4c 52 45 51 20 6d 65 61 6e 73 20 74 68 65 20 LLREQ means the
51c0: 6a 6f 62 73 20 69 73 20 73 74 69 6c 6c 20 70 72 jobs is still pr
51d0: 6f 62 61 62 6c 79 20 72 75 6e 6e 69 6e 67 0a 20 obably running.
51e0: 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e "SELECT coun
51f0: 74 28 69 64 29 20 46 52 4f 4d 20 74 65 73 74 73 t(id) FROM tests
5200: 20 57 48 45 52 45 20 73 74 61 74 65 20 69 6e 20 WHERE state in
5210: 28 27 4c 41 55 4e 43 48 45 44 27 2c 27 4e 4f 54 ('LAUNCHED','NOT
5220: 5f 53 54 41 52 54 45 44 27 2c 27 52 45 4d 4f 54 _STARTED','REMOT
5230: 45 48 4f 53 54 53 54 41 52 54 27 2c 27 52 55 4e EHOSTSTART','RUN
5240: 4e 49 4e 47 27 2c 27 4b 49 4c 4c 52 45 51 27 29 NING','KILLREQ')
5250: 20 41 4e 44 20 72 75 6e 5f 69 64 3d 3f 3b 22 20 AND run_id=?;"
5260: 72 75 6e 2d 69 64 29 0a 20 20 20 20 72 65 73 29 run-id). res)
5270: 29 0a 0a 3b 3b 20 4e 42 2f 2f 20 53 79 6e 63 20 )..;; NB// Sync
5280: 74 68 69 73 20 77 69 74 68 20 72 75 6e 73 3a 67 this with runs:g
5290: 65 74 2d 74 65 73 74 2d 69 6e 66 6f 0a 28 64 65 et-test-info.(de
52a0: 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 74 65 73 fine (db:get-tes
52b0: 74 2d 69 6e 66 6f 20 64 62 20 72 75 6e 2d 69 64 t-info db run-id
52c0: 20 74 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 testname item-p
52d0: 61 74 68 29 0a 20 20 28 6c 65 74 20 28 28 72 65 ath). (let ((re
52e0: 73 20 23 66 29 29 0a 20 20 20 20 28 73 71 6c 69 s #f)). (sqli
52f0: 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 te3:for-each-row
5300: 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 69 . (lambda (i
5310: 64 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d d run-id testnam
5320: 65 20 73 74 61 74 65 20 73 74 61 74 75 73 20 65 e state status e
5330: 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73 74 20 63 vent-time host c
5340: 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20 puload diskfree
5350: 75 6e 61 6d 65 20 72 75 6e 64 69 72 20 69 74 65 uname rundir ite
5360: 6d 2d 70 61 74 68 20 72 75 6e 5f 64 75 72 61 74 m-path run_durat
5370: 69 6f 6e 20 66 69 6e 61 6c 5f 6c 6f 67 66 20 63 ion final_logf c
5380: 6f 6d 6d 65 6e 74 20 66 69 72 73 74 2d 65 72 72 omment first-err
5390: 20 66 69 72 73 74 2d 77 61 72 6e 29 0a 20 20 20 first-warn).
53a0: 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28 76 (set! res (v
53b0: 65 63 74 6f 72 20 69 64 20 72 75 6e 2d 69 64 20 ector id run-id
53c0: 74 65 73 74 6e 61 6d 65 20 73 74 61 74 65 20 73 testname state s
53d0: 74 61 74 75 73 20 65 76 65 6e 74 2d 74 69 6d 65 tatus event-time
53e0: 20 68 6f 73 74 20 63 70 75 6c 6f 61 64 20 64 69 host cpuload di
53f0: 73 6b 66 72 65 65 20 75 6e 61 6d 65 20 72 75 6e skfree uname run
5400: 64 69 72 20 69 74 65 6d 2d 70 61 74 68 20 72 75 dir item-path ru
5410: 6e 5f 64 75 72 61 74 69 6f 6e 20 66 69 6e 61 6c n_duration final
5420: 5f 6c 6f 67 66 20 63 6f 6d 6d 65 6e 74 20 66 69 _logf comment fi
5430: 72 73 74 2d 65 72 72 20 66 69 72 73 74 2d 77 61 rst-err first-wa
5440: 72 6e 29 29 29 0a 20 20 20 20 20 64 62 20 0a 20 rn))). db .
5450: 20 20 20 20 22 53 45 4c 45 43 54 20 69 64 2c 72 "SELECT id,r
5460: 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d 65 2c 73 un_id,testname,s
5470: 74 61 74 65 2c 73 74 61 74 75 73 2c 65 76 65 6e tate,status,even
5480: 74 5f 74 69 6d 65 2c 68 6f 73 74 2c 63 70 75 6c t_time,host,cpul
5490: 6f 61 64 2c 64 69 73 6b 66 72 65 65 2c 75 6e 61 oad,diskfree,una
54a0: 6d 65 2c 72 75 6e 64 69 72 2c 69 74 65 6d 5f 70 me,rundir,item_p
54b0: 61 74 68 2c 72 75 6e 5f 64 75 72 61 74 69 6f 6e ath,run_duration
54c0: 2c 66 69 6e 61 6c 5f 6c 6f 67 66 2c 63 6f 6d 6d ,final_logf,comm
54d0: 65 6e 74 2c 66 69 72 73 74 5f 65 72 72 2c 66 69 ent,first_err,fi
54e0: 72 73 74 5f 77 61 72 6e 20 46 52 4f 4d 20 74 65 rst_warn FROM te
54f0: 73 74 73 20 57 48 45 52 45 20 72 75 6e 5f 69 64 sts WHERE run_id
5500: 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d =? AND testname=
5510: 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 3d ? AND item_path=
5520: 3f 3b 22 0a 20 20 20 20 20 72 75 6e 2d 69 64 20 ?;". run-id
5530: 74 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61 testname item-pa
5540: 74 68 29 0a 20 20 20 20 72 65 73 29 29 0a 0a 3b th). res))..;
5550: 3b 20 47 65 74 20 74 65 73 74 20 64 61 74 61 20 ; Get test data
5560: 75 73 69 6e 67 20 74 65 73 74 5f 69 64 0a 28 64 using test_id.(d
5570: 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 74 65 efine (db:get-te
5580: 73 74 2d 64 61 74 61 2d 62 79 2d 69 64 20 64 62 st-data-by-id db
5590: 20 74 65 73 74 2d 69 64 29 0a 20 20 28 6c 65 74 test-id). (let
55a0: 20 28 28 72 65 73 20 23 66 29 29 0a 20 20 20 20 ((res #f)).
55b0: 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 (sqlite3:for-eac
55c0: 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 h-row. (lamb
55d0: 64 61 20 28 69 64 20 72 75 6e 2d 69 64 20 74 65 da (id run-id te
55e0: 73 74 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61 stname state sta
55f0: 74 75 73 20 65 76 65 6e 74 2d 74 69 6d 65 20 68 tus event-time h
5600: 6f 73 74 20 63 70 75 6c 6f 61 64 20 64 69 73 6b ost cpuload disk
5610: 66 72 65 65 20 75 6e 61 6d 65 20 72 75 6e 64 69 free uname rundi
5620: 72 20 69 74 65 6d 2d 70 61 74 68 20 72 75 6e 5f r item-path run_
5630: 64 75 72 61 74 69 6f 6e 20 66 69 6e 61 6c 5f 6c duration final_l
5640: 6f 67 66 20 63 6f 6d 6d 65 6e 74 20 66 69 72 73 ogf comment firs
5650: 74 2d 65 72 72 20 66 69 72 73 74 2d 77 61 72 6e t-err first-warn
5660: 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72 ). (set! r
5670: 65 73 20 28 76 65 63 74 6f 72 20 69 64 20 72 75 es (vector id ru
5680: 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 73 74 n-id testname st
5690: 61 74 65 20 73 74 61 74 75 73 20 65 76 65 6e 74 ate status event
56a0: 2d 74 69 6d 65 20 68 6f 73 74 20 63 70 75 6c 6f -time host cpulo
56b0: 61 64 20 64 69 73 6b 66 72 65 65 20 75 6e 61 6d ad diskfree unam
56c0: 65 20 72 75 6e 64 69 72 20 69 74 65 6d 2d 70 61 e rundir item-pa
56d0: 74 68 20 72 75 6e 5f 64 75 72 61 74 69 6f 6e 20 th run_duration
56e0: 66 69 6e 61 6c 5f 6c 6f 67 66 20 63 6f 6d 6d 65 final_logf comme
56f0: 6e 74 20 66 69 72 73 74 2d 65 72 72 20 66 69 72 nt first-err fir
5700: 73 74 2d 77 61 72 6e 29 29 29 0a 20 20 20 20 20 st-warn))).
5710: 64 62 20 0a 20 20 20 20 20 22 53 45 4c 45 43 54 db . "SELECT
5720: 20 69 64 2c 72 75 6e 5f 69 64 2c 74 65 73 74 6e id,run_id,testn
5730: 61 6d 65 2c 73 74 61 74 65 2c 73 74 61 74 75 73 ame,state,status
5740: 2c 65 76 65 6e 74 5f 74 69 6d 65 2c 68 6f 73 74 ,event_time,host
5750: 2c 63 70 75 6c 6f 61 64 2c 64 69 73 6b 66 72 65 ,cpuload,diskfre
5760: 65 2c 75 6e 61 6d 65 2c 72 75 6e 64 69 72 2c 69 e,uname,rundir,i
5770: 74 65 6d 5f 70 61 74 68 2c 72 75 6e 5f 64 75 72 tem_path,run_dur
5780: 61 74 69 6f 6e 2c 66 69 6e 61 6c 5f 6c 6f 67 66 ation,final_logf
5790: 2c 63 6f 6d 6d 65 6e 74 2c 66 69 72 73 74 5f 65 ,comment,first_e
57a0: 72 72 2c 66 69 72 73 74 5f 77 61 72 6e 20 46 52 rr,first_warn FR
57b0: 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 69 OM tests WHERE i
57c0: 64 3d 3f 3b 22 0a 20 20 20 20 20 74 65 73 74 2d d=?;". test-
57d0: 69 64 29 0a 20 20 20 20 72 65 73 29 29 0a 0a 0a id). res))...
57e0: 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74 (define (db:test
57f0: 2d 73 65 74 2d 63 6f 6d 6d 65 6e 74 20 64 62 20 -set-comment db
5800: 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 run-id testname
5810: 69 74 65 6d 2d 70 61 74 68 20 63 6f 6d 6d 65 6e item-path commen
5820: 74 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 t). (sqlite3:ex
5830: 65 63 75 74 65 20 0a 20 20 20 64 62 20 0a 20 20 ecute . db .
5840: 20 22 55 50 44 41 54 45 20 74 65 73 74 73 20 53 "UPDATE tests S
5850: 45 54 20 63 6f 6d 6d 65 6e 74 3d 3f 20 57 48 45 ET comment=? WHE
5860: 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 RE run_id=? AND
5870: 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 testname=? AND i
5880: 74 65 6d 5f 70 61 74 68 3d 3f 3b 22 0a 20 20 20 tem_path=?;".
5890: 20 20 63 6f 6d 6d 65 6e 74 20 72 75 6e 2d 69 64 comment run-id
58a0: 20 74 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 testname item-p
58b0: 61 74 68 29 29 0a 0a 3b 3b 0a 28 64 65 66 69 6e ath))..;;.(defin
58c0: 65 20 28 64 62 3a 74 65 73 74 2d 73 65 74 2d 72 e (db:test-set-r
58d0: 75 6e 64 69 72 21 20 64 62 20 72 75 6e 2d 69 64 undir! db run-id
58e0: 20 74 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 testname item-p
58f0: 61 74 68 20 72 75 6e 64 69 72 29 0a 20 20 28 73 ath rundir). (s
5900: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 0a qlite3:execute .
5910: 20 20 20 64 62 20 0a 20 20 20 22 55 50 44 41 54 db . "UPDAT
5920: 45 20 74 65 73 74 73 20 53 45 54 20 72 75 6e 64 E tests SET rund
5930: 69 72 3d 3f 20 57 48 45 52 45 20 72 75 6e 5f 69 ir=? WHERE run_i
5940: 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 d=? AND testname
5950: 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 =? AND item_path
5960: 3d 3f 3b 22 0a 20 20 20 20 20 72 75 6e 64 69 72 =?;". rundir
5970: 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 run-id testname
5980: 20 69 74 65 6d 2d 70 61 74 68 29 29 0a 0a 3b 3b item-path))..;;
5990: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
59a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
59b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
59c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
59d0: 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 54 65 73 74 73 20 ======.;; Tests
59e0: 6d 65 74 61 20 64 61 74 61 0a 3b 3b 3d 3d 3d 3d meta data.;;====
59f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5a00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5a10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5a20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5a30: 3d 3d 0a 0a 3b 3b 20 72 65 61 64 20 74 68 65 20 ==..;; read the
5a40: 72 65 63 6f 72 64 20 67 69 76 65 6e 20 61 20 74 record given a t
5a50: 65 73 74 6e 61 6d 65 0a 28 64 65 66 69 6e 65 20 estname.(define
5a60: 28 64 62 3a 74 65 73 74 6d 65 74 61 2d 67 65 74 (db:testmeta-get
5a70: 2d 72 65 63 6f 72 64 20 64 62 20 74 65 73 74 6e -record db testn
5a80: 61 6d 65 29 0a 20 20 28 6c 65 74 20 28 28 72 65 ame). (let ((re
5a90: 73 20 23 66 29 29 0a 20 20 20 20 28 73 71 6c 69 s #f)). (sqli
5aa0: 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 te3:for-each-row
5ab0: 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 69 . (lambda (i
5ac0: 64 20 74 65 73 74 6e 61 6d 65 20 61 75 74 68 6f d testname autho
5ad0: 72 20 6f 77 6e 65 72 20 64 65 73 63 72 69 70 74 r owner descript
5ae0: 69 6f 6e 20 72 65 76 69 65 77 65 64 20 69 74 65 ion reviewed ite
5af0: 72 61 74 65 64 20 61 76 67 5f 72 75 6e 74 69 6d rated avg_runtim
5b00: 65 20 61 76 67 5f 64 69 73 6b 20 74 61 67 73 29 e avg_disk tags)
5b10: 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72 65 . (set! re
5b20: 73 20 28 76 65 63 74 6f 72 20 69 64 20 74 65 73 s (vector id tes
5b30: 74 6e 61 6d 65 20 61 75 74 68 6f 72 20 6f 77 6e tname author own
5b40: 65 72 20 64 65 73 63 72 69 70 74 69 6f 6e 20 72 er description r
5b50: 65 76 69 65 77 65 64 20 69 74 65 72 61 74 65 64 eviewed iterated
5b60: 20 61 76 67 5f 72 75 6e 74 69 6d 65 20 61 76 67 avg_runtime avg
5b70: 5f 64 69 73 6b 20 74 61 67 73 29 29 29 0a 20 20 _disk tags))).
5b80: 20 20 20 64 62 20 22 53 45 4c 45 43 54 20 69 64 db "SELECT id
5b90: 2c 74 65 73 74 6e 61 6d 65 2c 61 75 74 68 6f 72 ,testname,author
5ba0: 2c 6f 77 6e 65 72 2c 64 65 73 63 72 69 70 74 69 ,owner,descripti
5bb0: 6f 6e 2c 72 65 76 69 65 77 65 64 2c 69 74 65 72 on,reviewed,iter
5bc0: 61 74 65 64 2c 61 76 67 5f 72 75 6e 74 69 6d 65 ated,avg_runtime
5bd0: 2c 61 76 67 5f 64 69 73 6b 2c 74 61 67 73 20 46 ,avg_disk,tags F
5be0: 52 4f 4d 20 74 65 73 74 5f 6d 65 74 61 20 57 48 ROM test_meta WH
5bf0: 45 52 45 20 74 65 73 74 6e 61 6d 65 3d 3f 3b 22 ERE testname=?;"
5c00: 0a 20 20 20 20 20 74 65 73 74 6e 61 6d 65 29 0a . testname).
5c10: 20 20 20 20 72 65 73 29 29 0a 0a 3b 3b 20 63 72 res))..;; cr
5c20: 65 61 74 65 20 61 20 6e 65 77 20 72 65 63 6f 72 eate a new recor
5c30: 64 20 66 6f 72 20 61 20 67 69 76 65 6e 20 74 65 d for a given te
5c40: 73 74 6e 61 6d 65 0a 28 64 65 66 69 6e 65 20 28 stname.(define (
5c50: 64 62 3a 74 65 73 74 6d 65 74 61 2d 61 64 64 2d db:testmeta-add-
5c60: 72 65 63 6f 72 64 20 64 62 20 74 65 73 74 6e 61 record db testna
5c70: 6d 65 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 me). (sqlite3:e
5c80: 78 65 63 75 74 65 20 64 62 20 22 49 4e 53 45 52 xecute db "INSER
5c90: 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f T OR IGNORE INTO
5ca0: 20 74 65 73 74 5f 6d 65 74 61 20 28 74 65 73 74 test_meta (test
5cb0: 6e 61 6d 65 2c 61 75 74 68 6f 72 2c 6f 77 6e 65 name,author,owne
5cc0: 72 2c 64 65 73 63 72 69 70 74 69 6f 6e 2c 72 65 r,description,re
5cd0: 76 69 65 77 65 64 2c 69 74 65 72 61 74 65 64 2c viewed,iterated,
5ce0: 61 76 67 5f 72 75 6e 74 69 6d 65 2c 61 76 67 5f avg_runtime,avg_
5cf0: 64 69 73 6b 2c 74 61 67 73 29 20 56 41 4c 55 45 disk,tags) VALUE
5d00: 53 20 28 3f 2c 27 27 2c 27 27 2c 27 27 2c 27 27 S (?,'','','',''
5d10: 2c 27 27 2c 27 27 2c 27 27 2c 27 27 29 3b 22 20 ,'','','','');"
5d20: 74 65 73 74 6e 61 6d 65 29 29 0a 0a 3b 3b 20 75 testname))..;; u
5d30: 70 64 61 74 65 20 6f 6e 65 20 6f 66 20 74 68 65 pdate one of the
5d40: 20 74 65 73 74 6d 65 74 61 20 66 69 65 6c 64 73 testmeta fields
5d50: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73 .(define (db:tes
5d60: 74 6d 65 74 61 2d 75 70 64 61 74 65 2d 66 69 65 tmeta-update-fie
5d70: 6c 64 20 64 62 20 74 65 73 74 6e 61 6d 65 20 66 ld db testname f
5d80: 69 65 6c 64 20 76 61 6c 75 65 29 0a 20 20 28 73 ield value). (s
5d90: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 qlite3:execute d
5da0: 62 20 28 63 6f 6e 63 20 22 55 50 44 41 54 45 20 b (conc "UPDATE
5db0: 74 65 73 74 5f 6d 65 74 61 20 53 45 54 20 22 20 test_meta SET "
5dc0: 66 69 65 6c 64 20 22 3d 3f 20 57 48 45 52 45 20 field "=? WHERE
5dd0: 74 65 73 74 6e 61 6d 65 3d 3f 3b 22 29 20 76 61 testname=?;") va
5de0: 6c 75 65 20 74 65 73 74 6e 61 6d 65 29 29 0a 0a lue testname))..
5df0: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ;;==============
5e00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5e10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5e20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5e30: 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 54 20 45 20 ========.;; T E
5e40: 53 20 54 20 20 20 44 20 41 20 54 20 41 20 0a 3b S T D A T A .;
5e50: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ;===============
5e60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5e70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5e80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5e90: 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65 66 69 6e 65 =======..(define
5ea0: 20 28 64 62 3a 63 73 76 2d 3e 74 65 73 74 2d 64 (db:csv->test-d
5eb0: 61 74 61 20 64 62 20 74 65 73 74 2d 69 64 20 63 ata db test-id c
5ec0: 73 76 64 61 74 61 29 0a 20 20 28 64 65 62 75 67 svdata). (debug
5ed0: 3a 70 72 69 6e 74 20 34 20 22 74 65 73 74 2d 69 :print 4 "test-i
5ee0: 64 20 22 20 74 65 73 74 2d 69 64 20 22 2c 20 63 d " test-id ", c
5ef0: 73 76 64 61 74 61 3a 20 22 20 63 73 76 64 61 74 svdata: " csvdat
5f00: 61 29 0a 20 20 28 6c 65 74 20 28 28 63 73 76 6c a). (let ((csvl
5f10: 69 73 74 20 28 63 73 76 2d 3e 6c 69 73 74 20 28 ist (csv->list (
5f20: 6d 61 6b 65 2d 63 73 76 2d 72 65 61 64 65 72 0a make-csv-reader.
5f30: 09 09 09 20 20 20 20 20 28 6f 70 65 6e 2d 69 6e ... (open-in
5f40: 70 75 74 2d 73 74 72 69 6e 67 20 63 73 76 64 61 put-string csvda
5f50: 74 61 29 0a 09 09 09 20 20 20 20 20 27 28 28 73 ta).... '((s
5f60: 74 72 69 70 2d 6c 65 61 64 69 6e 67 2d 77 68 69 trip-leading-whi
5f70: 74 65 73 70 61 63 65 3f 20 23 74 29 0a 09 09 09 tespace? #t)....
5f80: 20 20 20 20 20 20 20 28 73 74 72 69 70 2d 74 72 (strip-tr
5f90: 61 69 6c 69 6e 67 2d 77 68 69 74 65 73 70 61 63 ailing-whitespac
5fa0: 65 3f 20 23 74 29 29 20 29 29 29 29 20 3b 3b 20 e? #t)) )))) ;;
5fb0: 28 63 73 76 2d 3e 6c 69 73 74 20 63 73 76 64 61 (csv->list csvda
5fc0: 74 61 29 29 29 0a 20 20 20 20 28 66 6f 72 2d 65 ta))). (for-e
5fd0: 61 63 68 20 0a 20 20 20 20 20 28 6c 61 6d 62 64 ach . (lambd
5fe0: 61 20 28 63 73 76 72 6f 77 29 0a 20 20 20 20 20 a (csvrow).
5ff0: 20 20 28 6c 65 74 2a 20 28 28 70 61 64 64 65 64 (let* ((padded
6000: 2d 72 6f 77 20 20 28 74 61 6b 65 20 28 61 70 70 -row (take (app
6010: 65 6e 64 20 63 73 76 72 6f 77 20 28 6c 69 73 74 end csvrow (list
6020: 20 23 66 20 23 66 20 23 66 20 23 66 20 23 66 20 #f #f #f #f #f
6030: 23 66 20 23 66 20 23 66 29 29 20 38 29 29 0a 09 #f #f #f)) 8))..
6040: 20 20 20 20 20 20 28 63 61 74 65 67 6f 72 79 20 (category
6050: 20 20 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64 (list-ref pad
6060: 64 65 64 2d 72 6f 77 20 30 29 29 0a 09 20 20 20 ded-row 0))..
6070: 20 20 20 28 76 61 72 69 61 62 6c 65 20 20 20 20 (variable
6080: 28 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65 64 (list-ref padded
6090: 2d 72 6f 77 20 31 29 29 0a 09 20 20 20 20 20 20 -row 1))..
60a0: 28 76 61 6c 75 65 20 20 20 20 20 20 20 28 61 6e (value (an
60b0: 79 2d 3e 6e 75 6d 62 65 72 2d 69 66 2d 70 6f 73 y->number-if-pos
60c0: 73 69 62 6c 65 20 28 6c 69 73 74 2d 72 65 66 20 sible (list-ref
60d0: 70 61 64 64 65 64 2d 72 6f 77 20 32 29 29 29 0a padded-row 2))).
60e0: 09 20 20 20 20 20 20 28 65 78 70 65 63 74 65 64 . (expected
60f0: 20 20 20 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 (any->number
6100: 2d 69 66 2d 70 6f 73 73 69 62 6c 65 20 28 6c 69 -if-possible (li
6110: 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f st-ref padded-ro
6120: 77 20 33 29 29 29 0a 09 20 20 20 20 20 20 28 74 w 3))).. (t
6130: 6f 6c 20 20 20 20 20 20 20 20 20 28 61 6e 79 2d ol (any-
6140: 3e 6e 75 6d 62 65 72 2d 69 66 2d 70 6f 73 73 69 >number-if-possi
6150: 62 6c 65 20 28 6c 69 73 74 2d 72 65 66 20 70 61 ble (list-ref pa
6160: 64 64 65 64 2d 72 6f 77 20 34 29 29 29 20 3b 3b dded-row 4))) ;;
6170: 20 3e 2c 20 3c 2c 20 3e 3d 2c 20 3c 3d 2c 20 6f >, <, >=, <=, o
6180: 72 20 61 20 6e 75 6d 62 65 72 0a 09 20 20 20 20 r a number..
6190: 20 20 28 75 6e 69 74 73 20 20 20 20 20 20 20 28 (units (
61a0: 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d list-ref padded-
61b0: 72 6f 77 20 35 29 29 0a 09 20 20 20 20 20 20 28 row 5)).. (
61c0: 63 6f 6d 6d 65 6e 74 20 20 20 20 20 28 6c 69 73 comment (lis
61d0: 74 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77 t-ref padded-row
61e0: 20 36 29 29 0a 09 20 20 20 20 20 20 28 73 74 61 6)).. (sta
61f0: 74 75 73 20 20 20 20 20 20 28 6c 65 74 20 28 28 tus (let ((
6200: 73 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64 64 s (list-ref padd
6210: 65 64 2d 72 6f 77 20 37 29 29 29 0a 09 09 09 20 ed-row 7)))....
6220: 20 20 20 20 28 69 66 20 28 61 6e 64 20 28 73 74 (if (and (st
6230: 72 69 6e 67 3f 20 73 29 28 6f 72 20 28 73 74 72 ring? s)(or (str
6240: 69 6e 67 2d 6d 61 74 63 68 20 28 72 65 67 65 78 ing-match (regex
6250: 70 20 22 5e 5c 5c 73 2a 24 22 29 20 73 29 0a 09 p "^\\s*$") s)..
6260: 09 09 09 09 09 20 20 20 20 20 28 73 74 72 69 6e ..... (strin
6270: 67 2d 6d 61 74 63 68 20 28 72 65 67 65 78 70 20 g-match (regexp
6280: 22 5e 6e 2f 61 24 22 29 20 73 29 29 29 0a 09 09 "^n/a$") s)))...
6290: 09 09 20 23 66 0a 09 09 09 09 20 73 29 29 29 29 .. #f..... s))))
62a0: 20 3b 3b 20 69 66 20 73 70 65 63 69 66 69 65 64 ;; if specified
62b0: 20 6f 6e 20 74 68 65 20 69 6e 70 75 74 20 74 68 on the input th
62c0: 65 6e 20 75 73 65 2c 20 65 6c 73 65 20 63 61 6c en use, else cal
62d0: 63 75 6c 61 74 65 0a 09 20 3b 3b 20 6c 6f 6f 6b culate.. ;; look
62e0: 20 75 70 20 65 78 70 65 63 74 65 64 2c 74 6f 6c up expected,tol
62f0: 2c 75 6e 69 74 73 20 66 72 6f 6d 20 70 72 65 76 ,units from prev
6300: 69 6f 75 73 20 62 65 73 74 20 66 69 74 20 74 65 ious best fit te
6310: 73 74 20 69 66 20 74 68 65 79 20 61 72 65 20 61 st if they are a
6320: 6c 6c 20 65 69 74 68 65 72 20 23 66 20 6f 72 20 ll either #f or
6330: 27 27 0a 09 20 28 64 65 62 75 67 3a 70 72 69 6e ''.. (debug:prin
6340: 74 20 34 20 22 42 45 46 4f 52 45 3a 20 63 61 74 t 4 "BEFORE: cat
6350: 65 67 6f 72 79 3a 20 22 20 63 61 74 65 67 6f 72 egory: " categor
6360: 79 20 22 20 76 61 72 69 61 62 6c 65 3a 20 22 20 y " variable: "
6370: 76 61 72 69 61 62 6c 65 20 22 20 76 61 6c 75 65 variable " value
6380: 3a 20 22 20 76 61 6c 75 65 20 0a 09 09 20 20 20 : " value ...
6390: 20 20 20 22 2c 20 65 78 70 65 63 74 65 64 3a 20 ", expected:
63a0: 22 20 65 78 70 65 63 74 65 64 20 22 20 74 6f 6c " expected " tol
63b0: 3a 20 22 20 74 6f 6c 20 22 20 75 6e 69 74 73 3a : " tol " units:
63c0: 20 22 20 75 6e 69 74 73 20 22 20 73 74 61 74 75 " units " statu
63d0: 73 3a 20 22 20 73 74 61 74 75 73 20 22 20 63 6f s: " status " co
63e0: 6d 6d 65 6e 74 3a 20 22 20 63 6f 6d 6d 65 6e 74 mment: " comment
63f0: 29 0a 0a 09 20 28 69 66 20 28 61 6e 64 20 28 6f )... (if (and (o
6400: 72 20 28 6e 6f 74 20 65 78 70 65 63 74 65 64 29 r (not expected)
6410: 28 65 71 75 61 6c 3f 20 65 78 70 65 63 74 65 64 (equal? expected
6420: 20 22 22 29 29 0a 09 09 20 20 28 6f 72 20 28 6e ""))... (or (n
6430: 6f 74 20 74 6f 6c 29 20 20 20 20 20 28 65 71 75 ot tol) (equ
6440: 61 6c 3f 20 65 78 70 65 63 74 65 64 20 22 22 29 al? expected "")
6450: 29 0a 09 09 20 20 28 6f 72 20 28 6e 6f 74 20 75 )... (or (not u
6460: 6e 69 74 73 29 20 20 20 28 65 71 75 61 6c 3f 20 nits) (equal?
6470: 65 78 70 65 63 74 65 64 20 22 22 29 29 29 0a 09 expected "")))..
6480: 20 20 20 20 20 28 6c 65 74 2d 76 61 6c 75 65 73 (let-values
6490: 20 28 28 28 6e 65 77 2d 65 78 70 65 63 74 65 64 (((new-expected
64a0: 20 6e 65 77 2d 74 6f 6c 20 6e 65 77 2d 75 6e 69 new-tol new-uni
64b0: 74 73 29 28 64 62 3a 67 65 74 2d 70 72 65 76 2d ts)(db:get-prev-
64c0: 74 6f 6c 2d 66 6f 72 2d 74 65 73 74 20 64 62 20 tol-for-test db
64d0: 74 65 73 74 2d 69 64 20 63 61 74 65 67 6f 72 79 test-id category
64e0: 20 76 61 72 69 61 62 6c 65 29 29 29 0a 09 20 20 variable)))..
64f0: 20 20 20 20 20 28 73 65 74 21 20 65 78 70 65 63 (set! expec
6500: 74 65 64 20 6e 65 77 2d 65 78 70 65 63 74 65 64 ted new-expected
6510: 29 0a 09 20 20 20 20 20 20 20 28 73 65 74 21 20 ).. (set!
6520: 74 6f 6c 20 20 20 20 20 20 6e 65 77 2d 74 6f 6c tol new-tol
6530: 29 0a 09 20 20 20 20 20 20 20 28 73 65 74 21 20 ).. (set!
6540: 75 6e 69 74 73 20 20 20 20 6e 65 77 2d 75 6e 69 units new-uni
6550: 74 73 29 29 29 0a 0a 09 20 28 64 65 62 75 67 3a ts)))... (debug:
6560: 70 72 69 6e 74 20 34 20 22 41 46 54 45 52 3a 20 print 4 "AFTER:
6570: 20 63 61 74 65 67 6f 72 79 3a 20 22 20 63 61 74 category: " cat
6580: 65 67 6f 72 79 20 22 20 76 61 72 69 61 62 6c 65 egory " variable
6590: 3a 20 22 20 76 61 72 69 61 62 6c 65 20 22 20 76 : " variable " v
65a0: 61 6c 75 65 3a 20 22 20 76 61 6c 75 65 20 0a 09 alue: " value ..
65b0: 09 20 20 20 20 20 20 22 2c 20 65 78 70 65 63 74 . ", expect
65c0: 65 64 3a 20 22 20 65 78 70 65 63 74 65 64 20 22 ed: " expected "
65d0: 20 74 6f 6c 3a 20 22 20 74 6f 6c 20 22 20 75 6e tol: " tol " un
65e0: 69 74 73 3a 20 22 20 75 6e 69 74 73 20 22 20 73 its: " units " s
65f0: 74 61 74 75 73 3a 20 22 20 73 74 61 74 75 73 20 tatus: " status
6600: 22 20 63 6f 6d 6d 65 6e 74 3a 20 22 20 63 6f 6d " comment: " com
6610: 6d 65 6e 74 29 0a 09 20 3b 3b 20 63 61 6c 63 75 ment).. ;; calcu
6620: 6c 61 74 65 20 73 74 61 74 75 73 20 69 66 20 4e late status if N
6630: 4f 54 20 73 70 65 63 69 66 69 65 64 0a 09 20 28 OT specified.. (
6640: 69 66 20 28 61 6e 64 20 28 6e 6f 74 20 73 74 61 if (and (not sta
6650: 74 75 73 29 28 6e 75 6d 62 65 72 3f 20 65 78 70 tus)(number? exp
6660: 65 63 74 65 64 29 28 6e 75 6d 62 65 72 3f 20 76 ected)(number? v
6670: 61 6c 75 65 29 29 20 3b 3b 20 6e 65 65 64 20 65 alue)) ;; need e
6680: 78 70 65 63 74 65 64 20 61 6e 64 20 76 61 6c 75 xpected and valu
6690: 65 20 74 6f 20 62 65 20 6e 75 6d 62 65 72 73 0a e to be numbers.
66a0: 09 20 20 20 20 20 28 69 66 20 28 6e 75 6d 62 65 . (if (numbe
66b0: 72 3f 20 74 6f 6c 29 20 3b 3b 20 69 66 20 74 6f r? tol) ;; if to
66c0: 6c 20 69 73 20 61 20 6e 75 6d 62 65 72 20 74 68 l is a number th
66d0: 65 6e 20 77 65 20 64 6f 20 74 68 65 20 73 74 61 en we do the sta
66e0: 6e 64 61 72 64 20 63 6f 6d 70 61 72 69 73 6f 6e ndard comparison
66f0: 0a 09 09 20 28 6c 65 74 2a 20 28 28 6d 61 78 2d ... (let* ((max-
6700: 76 61 6c 20 28 2b 20 65 78 70 65 63 74 65 64 20 val (+ expected
6710: 74 6f 6c 29 29 0a 09 09 09 28 6d 69 6e 2d 76 61 tol))....(min-va
6720: 6c 20 28 2d 20 65 78 70 65 63 74 65 64 20 74 6f l (- expected to
6730: 6c 29 29 0a 09 09 09 28 72 65 73 75 6c 74 20 20 l))....(result
6740: 28 61 6e 64 20 28 3e 3d 20 20 76 61 6c 75 65 20 (and (>= value
6750: 6d 69 6e 2d 76 61 6c 29 28 3c 3d 20 76 61 6c 75 min-val)(<= valu
6760: 65 20 6d 61 78 2d 76 61 6c 29 29 29 29 0a 09 09 e max-val))))...
6770: 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 (debug:print
6780: 34 20 22 6d 61 78 2d 76 61 6c 3a 20 22 20 6d 61 4 "max-val: " ma
6790: 78 2d 76 61 6c 20 22 20 6d 69 6e 2d 76 61 6c 3a x-val " min-val:
67a0: 20 22 20 6d 69 6e 2d 76 61 6c 20 22 20 72 65 73 " min-val " res
67b0: 75 6c 74 3a 20 22 20 72 65 73 75 6c 74 29 0a 09 ult: " result)..
67c0: 09 20 20 20 28 73 65 74 21 20 73 74 61 74 75 73 . (set! status
67d0: 20 28 69 66 20 72 65 73 75 6c 74 20 22 70 61 73 (if result "pas
67e0: 73 22 20 22 66 61 69 6c 22 29 29 29 0a 09 09 20 s" "fail")))...
67f0: 28 73 65 74 21 20 73 74 61 74 75 73 20 3b 3b 20 (set! status ;;
6800: 4e 42 2f 2f 20 6e 65 65 64 20 74 6f 20 61 73 73 NB// need to ass
6810: 65 73 73 20 65 61 63 68 20 6f 6e 65 20 28 69 2e ess each one (i.
6820: 65 2e 20 6e 6f 74 20 72 65 74 75 72 6e 20 6f 70 e. not return op
6830: 65 72 61 74 6f 72 20 73 69 6e 63 65 20 6e 65 65 erator since nee
6840: 64 20 74 6f 20 61 63 74 20 69 66 20 6e 6f 74 20 d to act if not
6850: 76 61 6c 69 64 20 6f 70 2e 0a 09 09 20 20 20 20 valid op....
6860: 20 20 20 28 63 61 73 65 20 28 73 74 72 69 6e 67 (case (string
6870: 2d 3e 73 79 6d 62 6f 6c 20 74 6f 6c 29 20 3b 3b ->symbol tol) ;;
6880: 20 74 6f 6c 20 73 68 6f 75 6c 64 20 62 65 20 3e tol should be >
6890: 2c 20 3c 2c 20 3e 3d 2c 20 3c 3d 0a 09 09 09 20 , <, >=, <=....
68a0: 28 28 3e 29 20 20 28 69 66 20 28 3e 20 20 76 61 ((>) (if (> va
68b0: 6c 75 65 20 65 78 70 65 63 74 65 64 29 20 22 70 lue expected) "p
68c0: 61 73 73 22 20 22 66 61 69 6c 22 29 29 0a 09 09 ass" "fail"))...
68d0: 09 20 28 28 3c 29 20 20 28 69 66 20 28 3c 20 20 . ((<) (if (<
68e0: 76 61 6c 75 65 20 65 78 70 65 63 74 65 64 29 20 value expected)
68f0: 22 70 61 73 73 22 20 22 66 61 69 6c 22 29 29 0a "pass" "fail")).
6900: 09 09 09 20 28 28 3e 3d 29 20 28 69 66 20 28 3e ... ((>=) (if (>
6910: 3d 20 76 61 6c 75 65 20 65 78 70 65 63 74 65 64 = value expected
6920: 29 20 22 70 61 73 73 22 20 22 66 61 69 6c 22 29 ) "pass" "fail")
6930: 29 0a 09 09 09 20 28 28 3c 3d 29 20 28 69 66 20 ).... ((<=) (if
6940: 28 3c 3d 20 76 61 6c 75 65 20 65 78 70 65 63 74 (<= value expect
6950: 65 64 29 20 22 70 61 73 73 22 20 22 66 61 69 6c ed) "pass" "fail
6960: 22 29 29 0a 09 09 09 20 28 65 6c 73 65 20 28 63 ")).... (else (c
6970: 6f 6e 63 20 22 45 52 52 4f 52 3a 20 62 61 64 20 onc "ERROR: bad
6980: 74 6f 6c 20 63 6f 6d 70 61 72 61 74 6f 72 20 22 tol comparator "
6990: 20 74 6f 6c 29 29 29 29 29 29 0a 09 20 28 64 65 tol)))))).. (de
69a0: 62 75 67 3a 70 72 69 6e 74 20 34 20 22 41 46 54 bug:print 4 "AFT
69b0: 45 52 32 3a 20 63 61 74 65 67 6f 72 79 3a 20 22 ER2: category: "
69c0: 20 63 61 74 65 67 6f 72 79 20 22 20 76 61 72 69 category " vari
69d0: 61 62 6c 65 3a 20 22 20 76 61 72 69 61 62 6c 65 able: " variable
69e0: 20 22 20 76 61 6c 75 65 3a 20 22 20 76 61 6c 75 " value: " valu
69f0: 65 20 0a 09 09 20 20 20 20 20 20 22 2c 20 65 78 e ... ", ex
6a00: 70 65 63 74 65 64 3a 20 22 20 65 78 70 65 63 74 pected: " expect
6a10: 65 64 20 22 20 74 6f 6c 3a 20 22 20 74 6f 6c 20 ed " tol: " tol
6a20: 22 20 75 6e 69 74 73 3a 20 22 20 75 6e 69 74 73 " units: " units
6a30: 20 22 20 73 74 61 74 75 73 3a 20 22 20 73 74 61 " status: " sta
6a40: 74 75 73 20 22 20 63 6f 6d 6d 65 6e 74 3a 20 22 tus " comment: "
6a50: 20 63 6f 6d 6d 65 6e 74 29 0a 09 20 28 73 71 6c comment).. (sql
6a60: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 ite3:execute db
6a70: 22 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41 "INSERT OR REPLA
6a80: 43 45 20 49 4e 54 4f 20 74 65 73 74 5f 64 61 74 CE INTO test_dat
6a90: 61 20 28 74 65 73 74 5f 69 64 2c 63 61 74 65 67 a (test_id,categ
6aa0: 6f 72 79 2c 76 61 72 69 61 62 6c 65 2c 76 61 6c ory,variable,val
6ab0: 75 65 2c 65 78 70 65 63 74 65 64 2c 74 6f 6c 2c ue,expected,tol,
6ac0: 75 6e 69 74 73 2c 63 6f 6d 6d 65 6e 74 2c 73 74 units,comment,st
6ad0: 61 74 75 73 29 20 56 41 4c 55 45 53 20 28 3f 2c atus) VALUES (?,
6ae0: 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 29 ?,?,?,?,?,?,?,?)
6af0: 3b 22 0a 09 20 20 20 20 20 20 74 65 73 74 2d 69 ;".. test-i
6b00: 64 20 63 61 74 65 67 6f 72 79 20 76 61 72 69 61 d category varia
6b10: 62 6c 65 20 76 61 6c 75 65 20 65 78 70 65 63 74 ble value expect
6b20: 65 64 20 74 6f 6c 20 75 6e 69 74 73 20 28 69 66 ed tol units (if
6b30: 20 63 6f 6d 6d 65 6e 74 20 63 6f 6d 6d 65 6e 74 comment comment
6b40: 20 22 22 29 20 73 74 61 74 75 73 29 29 29 0a 20 "") status))).
6b50: 20 20 20 20 63 73 76 6c 69 73 74 29 29 29 0a 0a csvlist)))..
6b60: 3b 3b 20 67 65 74 20 61 20 6c 69 73 74 20 6f 66 ;; get a list of
6b70: 20 74 65 73 74 5f 64 61 74 61 20 72 65 63 6f 72 test_data recor
6b80: 64 73 20 6d 61 74 63 68 69 6e 67 20 63 61 74 65 ds matching cate
6b90: 67 6f 72 79 70 61 74 74 0a 28 64 65 66 69 6e 65 gorypatt.(define
6ba0: 20 28 64 62 3a 72 65 61 64 2d 74 65 73 74 2d 64 (db:read-test-d
6bb0: 61 74 61 20 64 62 20 74 65 73 74 2d 69 64 20 63 ata db test-id c
6bc0: 61 74 65 67 6f 72 79 70 61 74 74 29 0a 20 20 28 ategorypatt). (
6bd0: 6c 65 74 20 28 28 72 65 73 20 27 28 29 29 29 0a let ((res '())).
6be0: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 (sqlite3:for
6bf0: 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20 20 20 20 -each-row .
6c00: 28 6c 61 6d 62 64 61 20 28 69 64 20 74 65 73 74 (lambda (id test
6c10: 5f 69 64 20 63 61 74 65 67 6f 72 79 20 76 61 72 _id category var
6c20: 69 61 62 6c 65 20 76 61 6c 75 65 20 65 78 70 65 iable value expe
6c30: 63 74 65 64 20 74 6f 6c 20 75 6e 69 74 73 20 63 cted tol units c
6c40: 6f 6d 6d 65 6e 74 20 73 74 61 74 75 73 29 0a 20 omment status).
6c50: 20 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20 (set! res
6c60: 28 63 6f 6e 73 20 28 76 65 63 74 6f 72 20 69 64 (cons (vector id
6c70: 20 74 65 73 74 5f 69 64 20 63 61 74 65 67 6f 72 test_id categor
6c80: 79 20 76 61 72 69 61 62 6c 65 20 76 61 6c 75 65 y variable value
6c90: 20 65 78 70 65 63 74 65 64 20 74 6f 6c 20 75 6e expected tol un
6ca0: 69 74 73 20 63 6f 6d 6d 65 6e 74 20 73 74 61 74 its comment stat
6cb0: 75 73 29 20 72 65 73 29 29 29 0a 20 20 20 20 20 us) res))).
6cc0: 64 62 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20 db. "SELECT
6cd0: 69 64 2c 74 65 73 74 5f 69 64 2c 63 61 74 65 67 id,test_id,categ
6ce0: 6f 72 79 2c 76 61 72 69 61 62 6c 65 2c 76 61 6c ory,variable,val
6cf0: 75 65 2c 65 78 70 65 63 74 65 64 2c 74 6f 6c 2c ue,expected,tol,
6d00: 75 6e 69 74 73 2c 63 6f 6d 6d 65 6e 74 2c 73 74 units,comment,st
6d10: 61 74 75 73 20 46 52 4f 4d 20 74 65 73 74 5f 64 atus FROM test_d
6d20: 61 74 61 20 57 48 45 52 45 20 74 65 73 74 5f 69 ata WHERE test_i
6d30: 64 3d 3f 20 41 4e 44 20 63 61 74 65 67 6f 72 79 d=? AND category
6d40: 20 4c 49 4b 45 20 3f 20 4f 52 44 45 52 20 42 59 LIKE ? ORDER BY
6d50: 20 63 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62 category,variab
6d60: 6c 65 3b 22 20 74 65 73 74 2d 69 64 20 63 61 74 le;" test-id cat
6d70: 65 67 6f 72 79 70 61 74 74 29 0a 20 20 20 20 28 egorypatt). (
6d80: 72 65 76 65 72 73 65 20 72 65 73 29 29 29 0a 0a reverse res)))..
6d90: 28 64 65 66 69 6e 65 20 28 64 62 3a 6c 6f 61 64 (define (db:load
6da0: 2d 74 65 73 74 2d 64 61 74 61 20 64 62 20 72 75 -test-data db ru
6db0: 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 n-id test-name i
6dc0: 74 65 6d 64 61 74 29 0a 20 20 28 6c 65 74 2a 20 temdat). (let*
6dd0: 28 28 69 74 65 6d 2d 70 61 74 68 20 28 69 74 65 ((item-path (ite
6de0: 6d 2d 6c 69 73 74 2d 3e 70 61 74 68 20 69 74 65 m-list->path ite
6df0: 6d 64 61 74 29 29 0a 09 20 28 74 65 73 74 64 61 mdat)).. (testda
6e00: 74 20 28 64 62 3a 67 65 74 2d 74 65 73 74 2d 69 t (db:get-test-i
6e10: 6e 66 6f 20 64 62 20 72 75 6e 2d 69 64 20 74 65 nfo db run-id te
6e20: 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 st-name item-pat
6e30: 68 29 29 0a 09 20 28 74 65 73 74 2d 69 64 20 28 h)).. (test-id (
6e40: 69 66 20 74 65 73 74 64 61 74 20 28 64 62 3a 74 if testdat (db:t
6e50: 65 73 74 2d 67 65 74 2d 69 64 20 74 65 73 74 64 est-get-id testd
6e60: 61 74 29 20 23 66 29 29 29 0a 20 20 20 20 3b 3b at) #f))). ;;
6e70: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 31 20 (debug:print 1
6e80: 22 45 6e 74 65 72 20 72 65 63 6f 72 64 73 20 74 "Enter records t
6e90: 6f 20 69 6e 73 65 72 74 20 69 6e 20 74 68 65 20 o insert in the
6ea0: 74 65 73 74 5f 64 61 74 61 20 74 61 62 6c 65 2c test_data table,
6eb0: 20 73 65 76 65 6e 20 66 69 65 6c 64 73 2c 20 63 seven fields, c
6ec0: 6f 6d 6d 61 20 73 65 70 61 72 61 74 65 64 20 70 omma separated p
6ed0: 65 72 20 6c 69 6e 65 22 29 0a 20 20 20 20 28 64 er line"). (d
6ee0: 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22 69 74 ebug:print 4 "it
6ef0: 65 6d 64 61 74 3a 20 22 20 69 74 65 6d 64 61 74 emdat: " itemdat
6f00: 20 22 2c 20 74 65 73 74 2d 6e 61 6d 65 3a 20 22 ", test-name: "
6f10: 20 74 65 73 74 2d 6e 61 6d 65 20 22 2c 20 74 65 test-name ", te
6f20: 73 74 2d 69 64 3a 20 22 20 74 65 73 74 2d 69 64 st-id: " test-id
6f30: 29 0a 20 20 20 20 28 69 66 20 74 65 73 74 2d 69 ). (if test-i
6f40: 64 0a 09 28 6c 65 74 20 6c 6f 6f 70 20 28 28 6c d..(let loop ((l
6f50: 69 6e 20 28 72 65 61 64 2d 6c 69 6e 65 29 29 29 in (read-line)))
6f60: 0a 09 20 20 28 69 66 20 28 6e 6f 74 20 28 65 6f .. (if (not (eo
6f70: 66 2d 6f 62 6a 65 63 74 3f 20 6c 69 6e 29 29 0a f-object? lin)).
6f80: 09 20 20 20 20 20 20 28 62 65 67 69 6e 0a 09 09 . (begin...
6f90: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20 6c (debug:print 4 l
6fa0: 69 6e 29 0a 09 09 28 64 62 3a 63 73 76 2d 3e 74 in)...(db:csv->t
6fb0: 65 73 74 2d 64 61 74 61 20 64 62 20 74 65 73 74 est-data db test
6fc0: 2d 69 64 20 6c 69 6e 29 0a 09 09 28 6c 6f 6f 70 -id lin)...(loop
6fd0: 20 28 72 65 61 64 2d 6c 69 6e 65 29 29 29 29 29 (read-line)))))
6fe0: 29 0a 20 20 20 20 3b 3b 20 72 6f 6c 6c 20 75 70 ). ;; roll up
6ff0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 73 the current res
7000: 75 6c 74 73 2e 0a 20 20 20 20 28 64 62 3a 74 65 ults.. (db:te
7010: 73 74 2d 64 61 74 61 2d 72 6f 6c 6c 75 70 20 64 st-data-rollup d
7020: 62 20 74 65 73 74 2d 69 64 29 29 29 0a 20 20 0a b test-id))). .
7030: 3b 3b 20 57 41 52 4e 49 4e 47 3a 20 44 6f 20 4e ;; WARNING: Do N
7040: 4f 54 20 63 61 6c 6c 20 74 68 69 73 20 66 6f 72 OT call this for
7050: 20 74 68 65 20 70 61 72 65 6e 74 20 74 65 73 74 the parent test
7060: 20 6f 6e 20 61 6e 20 69 74 65 72 61 74 65 64 20 on an iterated
7070: 74 65 73 74 0a 3b 3b 20 52 6f 6c 6c 20 75 70 20 test.;; Roll up
7080: 74 65 73 74 5f 64 61 74 61 20 70 61 73 73 2f 66 test_data pass/f
7090: 61 69 6c 20 72 65 73 75 6c 74 73 0a 3b 3b 20 6c ail results.;; l
70a0: 6f 6f 6b 20 61 74 20 74 68 65 20 74 65 73 74 5f ook at the test_
70b0: 64 61 74 61 20 73 74 61 74 75 73 20 66 69 65 6c data status fiel
70c0: 64 2c 20 0a 3b 3b 20 20 20 20 69 66 20 61 6c 6c d, .;; if all
70d0: 20 61 72 65 20 70 61 73 73 20 28 61 6e 79 20 63 are pass (any c
70e0: 61 73 65 29 20 61 6e 64 20 74 68 65 20 74 65 73 ase) and the tes
70f0: 74 20 73 74 61 74 75 73 20 69 73 20 50 41 53 53 t status is PASS
7100: 20 6f 72 20 4e 55 4c 4c 20 6f 72 20 27 27 20 74 or NULL or '' t
7110: 68 65 6e 20 73 65 74 20 74 65 73 74 20 73 74 61 hen set test sta
7120: 74 75 73 20 74 6f 20 50 41 53 53 2e 0a 3b 3b 20 tus to PASS..;;
7130: 20 20 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 if one or mor
7140: 65 20 61 72 65 20 66 61 69 6c 20 28 61 6e 79 20 e are fail (any
7150: 63 61 73 65 29 20 74 68 65 6e 20 73 65 74 20 74 case) then set t
7160: 65 73 74 20 73 74 61 74 75 73 20 74 6f 20 50 41 est status to PA
7170: 53 53 2c 20 6e 6f 6e 20 22 70 61 73 73 22 20 6f SS, non "pass" o
7180: 72 20 22 66 61 69 6c 22 20 61 72 65 20 69 67 6e r "fail" are ign
7190: 6f 72 65 64 0a 28 64 65 66 69 6e 65 20 28 64 62 ored.(define (db
71a0: 3a 74 65 73 74 2d 64 61 74 61 2d 72 6f 6c 6c 75 :test-data-rollu
71b0: 70 20 64 62 20 74 65 73 74 2d 69 64 29 0a 20 20 p db test-id).
71c0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 (sqlite3:execute
71d0: 20 0a 20 20 20 64 62 20 0a 20 20 20 22 55 50 44 . db . "UPD
71e0: 41 54 45 20 74 65 73 74 73 20 0a 20 20 20 20 20 ATE tests .
71f0: 20 53 45 54 20 66 61 69 6c 5f 63 6f 75 6e 74 3d SET fail_count=
7200: 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 69 64 (SELECT count(id
7210: 29 20 46 52 4f 4d 20 74 65 73 74 5f 64 61 74 61 ) FROM test_data
7220: 20 57 48 45 52 45 20 74 65 73 74 5f 69 64 3d 3f WHERE test_id=?
7230: 20 41 4e 44 20 73 74 61 74 75 73 20 6c 69 6b 65 AND status like
7240: 20 27 66 61 69 6c 27 29 2c 0a 20 20 20 20 20 20 'fail'),.
7250: 20 20 20 20 70 61 73 73 5f 63 6f 75 6e 74 3d 28 pass_count=(
7260: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 69 64 29 SELECT count(id)
7270: 20 46 52 4f 4d 20 74 65 73 74 5f 64 61 74 61 20 FROM test_data
7280: 57 48 45 52 45 20 74 65 73 74 5f 69 64 3d 3f 20 WHERE test_id=?
7290: 41 4e 44 20 73 74 61 74 75 73 20 6c 69 6b 65 20 AND status like
72a0: 27 70 61 73 73 27 29 0a 20 20 20 20 20 20 57 48 'pass'). WH
72b0: 45 52 45 20 69 64 3d 3f 3b 22 0a 20 20 20 74 65 ERE id=?;". te
72c0: 73 74 2d 69 64 20 74 65 73 74 2d 69 64 20 74 65 st-id test-id te
72d0: 73 74 2d 69 64 29 0a 20 20 3b 3b 20 69 66 20 74 st-id). ;; if t
72e0: 68 65 20 74 65 73 74 20 69 73 20 6e 6f 74 20 46 he test is not F
72f0: 41 49 4c 20 74 68 65 6e 20 73 65 74 20 73 74 61 AIL then set sta
7300: 74 75 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 tus based on the
7310: 20 66 61 69 6c 20 61 6e 64 20 70 61 73 73 20 63 fail and pass c
7320: 6f 75 6e 74 73 2e 0a 20 20 28 73 6c 65 65 70 20 ounts.. (sleep
7330: 31 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 1). (sqlite3:ex
7340: 65 63 75 74 65 0a 20 20 20 64 62 0a 20 20 20 22 ecute. db. "
7350: 55 50 44 41 54 45 20 74 65 73 74 73 0a 20 20 20 UPDATE tests.
7360: 20 20 20 53 45 54 20 73 74 61 74 75 73 3d 43 41 SET status=CA
7370: 53 45 20 57 48 45 4e 20 28 53 45 4c 45 43 54 20 SE WHEN (SELECT
7380: 66 61 69 6c 5f 63 6f 75 6e 74 20 46 52 4f 4d 20 fail_count FROM
7390: 74 65 73 74 73 20 57 48 45 52 45 20 69 64 3d 3f tests WHERE id=?
73a0: 29 20 3e 20 30 20 0a 20 20 20 20 20 20 20 20 20 ) > 0 .
73b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
73c0: 54 48 45 4e 20 27 46 41 49 4c 27 0a 20 20 20 20 THEN 'FAIL'.
73d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
73e0: 20 20 57 48 45 4e 20 28 53 45 4c 45 43 54 20 70 WHEN (SELECT p
73f0: 61 73 73 5f 63 6f 75 6e 74 20 46 52 4f 4d 20 74 ass_count FROM t
7400: 65 73 74 73 20 57 48 45 52 45 20 69 64 3d 3f 29 ests WHERE id=?)
7410: 20 3e 20 30 0a 20 20 20 20 20 20 20 20 20 20 20 > 0.
7420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 48 TH
7430: 45 4e 20 27 50 41 53 53 27 0a 20 20 20 20 20 20 EN 'PASS'.
7440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7450: 45 4c 53 45 20 73 74 61 74 75 73 0a 20 20 20 20 ELSE status.
7460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 4e EN
7470: 44 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 0a 20 D WHERE id=?;".
7480: 20 20 74 65 73 74 2d 69 64 20 74 65 73 74 2d 69 test-id test-i
7490: 64 20 74 65 73 74 2d 69 64 29 29 0a 0a 28 64 65 d test-id))..(de
74a0: 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 70 72 65 fine (db:get-pre
74b0: 76 2d 74 6f 6c 2d 66 6f 72 2d 74 65 73 74 20 64 v-tol-for-test d
74c0: 62 20 74 65 73 74 2d 69 64 20 63 61 74 65 67 6f b test-id catego
74d0: 72 79 20 76 61 72 69 61 62 6c 65 29 0a 20 20 3b ry variable). ;
74e0: 3b 20 46 69 6e 69 73 68 20 6d 65 3f 0a 20 20 28 ; Finish me?. (
74f0: 76 61 6c 75 65 73 20 23 66 20 23 66 20 23 66 29 values #f #f #f)
7500: 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d )..;;===========
7510: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7520: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7530: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7540: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 53 ===========.;; S
7550: 20 54 20 45 20 50 20 53 20 0a 3b 3b 3d 3d 3d 3d T E P S .;;====
7560: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7570: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7580: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7590: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
75a0: 3d 3d 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a ==..(define (db:
75b0: 73 74 65 70 2d 67 65 74 2d 74 69 6d 65 2d 61 73 step-get-time-as
75c0: 2d 73 74 72 69 6e 67 20 76 65 63 29 0a 20 20 20 -string vec).
75d0: 20 28 73 65 63 6f 6e 64 73 2d 3e 74 69 6d 65 2d (seconds->time-
75e0: 73 74 72 69 6e 67 20 28 64 62 3a 73 74 65 70 2d string (db:step-
75f0: 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 76 get-event_time v
7600: 65 63 29 29 29 0a 0a 3b 3b 20 64 62 2d 67 65 74 ec)))..;; db-get
7610: 2d 74 65 73 74 2d 73 74 65 70 73 2d 66 6f 72 2d -test-steps-for-
7620: 72 75 6e 0a 28 64 65 66 69 6e 65 20 28 64 62 3a run.(define (db:
7630: 67 65 74 2d 73 74 65 70 73 2d 66 6f 72 2d 74 65 get-steps-for-te
7640: 73 74 20 64 62 20 74 65 73 74 2d 69 64 29 0a 20 st db test-id).
7650: 20 28 6c 65 74 20 28 28 72 65 73 20 27 28 29 29 (let ((res '())
7660: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 ). (sqlite3:f
7670: 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20 20 or-each-row .
7680: 20 20 28 6c 61 6d 62 64 61 20 28 69 64 20 74 65 (lambda (id te
7690: 73 74 2d 69 64 20 73 74 65 70 6e 61 6d 65 20 73 st-id stepname s
76a0: 74 61 74 65 20 73 74 61 74 75 73 20 65 76 65 6e tate status even
76b0: 74 2d 74 69 6d 65 29 0a 20 20 20 20 20 20 20 28 t-time). (
76c0: 73 65 74 21 20 72 65 73 20 28 63 6f 6e 73 20 28 set! res (cons (
76d0: 76 65 63 74 6f 72 20 69 64 20 74 65 73 74 2d 69 vector id test-i
76e0: 64 20 73 74 65 70 6e 61 6d 65 20 73 74 61 74 65 d stepname state
76f0: 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d 74 69 status event-ti
7700: 6d 65 29 20 72 65 73 29 29 29 0a 20 20 20 20 20 me) res))).
7710: 64 62 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20 db. "SELECT
7720: 69 64 2c 74 65 73 74 5f 69 64 2c 73 74 65 70 6e id,test_id,stepn
7730: 61 6d 65 2c 73 74 61 74 65 2c 73 74 61 74 75 73 ame,state,status
7740: 2c 65 76 65 6e 74 5f 74 69 6d 65 20 46 52 4f 4d ,event_time FROM
7750: 20 74 65 73 74 5f 73 74 65 70 73 20 57 48 45 52 test_steps WHER
7760: 45 20 74 65 73 74 5f 69 64 3d 3f 20 4f 52 44 45 E test_id=? ORDE
7770: 52 20 42 59 20 69 64 20 41 53 43 3b 22 20 3b 3b R BY id ASC;" ;;
7780: 20 65 76 65 6e 74 5f 74 69 6d 65 20 44 45 53 43 event_time DESC
7790: 2c 69 64 20 41 53 43 3b 0a 20 20 20 20 20 74 65 ,id ASC;. te
77a0: 73 74 2d 69 64 29 0a 20 20 20 20 28 72 65 76 65 st-id). (reve
77b0: 72 73 65 20 72 65 73 29 29 29 0a 0a 3b 3b 20 67 rse res)))..;; g
77c0: 65 74 20 61 20 70 72 65 74 74 79 20 74 61 62 6c et a pretty tabl
77d0: 65 20 74 6f 20 73 75 6d 6d 61 72 69 7a 65 20 73 e to summarize s
77e0: 74 65 70 73 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 teps.;;.(define
77f0: 28 64 62 3a 67 65 74 2d 73 74 65 70 73 2d 74 61 (db:get-steps-ta
7800: 62 6c 65 20 64 62 20 74 65 73 74 2d 69 64 29 0a ble db test-id).
7810: 20 20 28 6c 65 74 20 28 28 73 74 65 70 73 20 20 (let ((steps
7820: 20 28 64 62 3a 67 65 74 2d 73 74 65 70 73 2d 66 (db:get-steps-f
7830: 6f 72 2d 74 65 73 74 20 64 62 20 74 65 73 74 2d or-test db test-
7840: 69 64 29 29 29 0a 20 20 20 20 3b 3b 20 6f 72 67 id))). ;; org
7850: 61 6e 69 73 65 20 74 68 65 20 73 74 65 70 73 20 anise the steps
7860: 66 6f 72 20 62 65 74 74 65 72 20 72 65 61 64 61 for better reada
7870: 62 69 6c 69 74 79 0a 20 20 20 20 28 6c 65 74 20 bility. (let
7880: 28 28 72 65 73 20 28 6d 61 6b 65 2d 68 61 73 68 ((res (make-hash
7890: 2d 74 61 62 6c 65 29 29 29 0a 20 20 20 20 20 20 -table))).
78a0: 28 66 6f 72 2d 65 61 63 68 20 0a 20 20 20 20 20 (for-each .
78b0: 20 20 28 6c 61 6d 62 64 61 20 28 73 74 65 70 29 (lambda (step)
78c0: 0a 09 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 .. (debug:print
78d0: 36 20 22 73 74 65 70 3d 22 20 73 74 65 70 29 0a 6 "step=" step).
78e0: 09 20 28 6c 65 74 20 28 28 72 65 63 6f 72 64 20 . (let ((record
78f0: 28 68 61 73 68 2d 74 61 62 6c 65 2d 72 65 66 2f (hash-table-ref/
7900: 64 65 66 61 75 6c 74 20 0a 09 09 09 72 65 73 20 default ....res
7910: 0a 09 09 09 28 64 62 3a 73 74 65 70 2d 67 65 74 ....(db:step-get
7920: 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70 29 20 -stepname step)
7930: 0a 09 09 09 3b 3b 20 20 20 20 20 20 20 20 73 74 ....;; st
7940: 65 70 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 epname
7950: 20 20 20 20 20 20 73 74 61 72 74 20 65 6e 64 20 start end
7960: 73 74 61 74 75 73 20 20 20 20 0a 09 09 09 28 76 status ....(v
7970: 65 63 74 6f 72 20 28 64 62 3a 73 74 65 70 2d 67 ector (db:step-g
7980: 65 74 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70 et-stepname step
7990: 29 20 22 22 20 20 20 22 22 20 22 22 20 20 20 20 ) "" "" ""
79a0: 20 22 22 29 29 29 29 0a 09 20 20 20 28 64 65 62 "")))).. (deb
79b0: 75 67 3a 70 72 69 6e 74 20 36 20 22 72 65 63 6f ug:print 6 "reco
79c0: 72 64 28 62 65 66 6f 72 65 29 20 3d 20 22 20 72 rd(before) = " r
79d0: 65 63 6f 72 64 20 0a 09 09 09 22 5c 6e 69 64 3a ecord ...."\nid:
79e0: 20 20 20 20 20 20 20 22 20 28 64 62 3a 73 74 65 " (db:ste
79f0: 70 2d 67 65 74 2d 69 64 20 73 74 65 70 29 0a 09 p-get-id step)..
7a00: 09 09 22 5c 6e 73 74 65 70 6e 61 6d 65 3a 20 22 .."\nstepname: "
7a10: 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 (db:step-get-st
7a20: 65 70 6e 61 6d 65 20 73 74 65 70 29 0a 09 09 09 epname step)....
7a30: 22 5c 6e 73 74 61 74 65 3a 20 20 20 20 22 20 28 "\nstate: " (
7a40: 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 74 db:step-get-stat
7a50: 65 20 73 74 65 70 29 0a 09 09 09 22 5c 6e 73 74 e step)...."\nst
7a60: 61 74 75 73 3a 20 20 20 22 20 28 64 62 3a 73 74 atus: " (db:st
7a70: 65 70 2d 67 65 74 2d 73 74 61 74 75 73 20 73 74 ep-get-status st
7a80: 65 70 29 0a 09 09 09 22 5c 6e 74 69 6d 65 3a 20 ep)...."\ntime:
7a90: 20 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d 67 " (db:step-g
7aa0: 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73 74 et-event_time st
7ab0: 65 70 29 29 0a 09 20 20 20 28 63 61 73 65 20 28 ep)).. (case (
7ac0: 73 74 72 69 6e 67 2d 3e 73 79 6d 62 6f 6c 20 28 string->symbol (
7ad0: 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 74 db:step-get-stat
7ae0: 65 20 73 74 65 70 29 29 0a 09 20 20 20 20 20 28 e step)).. (
7af0: 28 73 74 61 72 74 29 28 76 65 63 74 6f 72 2d 73 (start)(vector-s
7b00: 65 74 21 20 72 65 63 6f 72 64 20 31 20 28 64 62 et! record 1 (db
7b10: 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f :step-get-event_
7b20: 74 69 6d 65 20 73 74 65 70 29 29 0a 09 20 20 20 time step))..
7b30: 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 (vector-set!
7b40: 72 65 63 6f 72 64 20 33 20 28 69 66 20 28 65 71 record 3 (if (eq
7b50: 75 61 6c 3f 20 28 76 65 63 74 6f 72 2d 72 65 66 ual? (vector-ref
7b60: 20 72 65 63 6f 72 64 20 33 29 20 22 22 29 0a 09 record 3) "")..
7b70: 09 09 09 09 28 64 62 3a 73 74 65 70 2d 67 65 74 ....(db:step-get
7b80: 2d 73 74 61 74 75 73 20 73 74 65 70 29 29 29 29 -status step))))
7b90: 0a 09 20 20 20 20 20 28 28 65 6e 64 29 20 20 0a .. ((end) .
7ba0: 09 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73 . (vector-s
7bb0: 65 74 21 20 72 65 63 6f 72 64 20 32 20 28 61 6e et! record 2 (an
7bc0: 79 2d 3e 6e 75 6d 62 65 72 20 28 64 62 3a 73 74 y->number (db:st
7bd0: 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d ep-get-event_tim
7be0: 65 20 73 74 65 70 29 29 29 0a 09 20 20 20 20 20 e step)))..
7bf0: 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72 65 (vector-set! re
7c00: 63 6f 72 64 20 33 20 28 64 62 3a 73 74 65 70 2d cord 3 (db:step-
7c10: 67 65 74 2d 73 74 61 74 75 73 20 73 74 65 70 29 get-status step)
7c20: 29 0a 09 20 20 20 20 20 20 28 76 65 63 74 6f 72 ).. (vector
7c30: 2d 73 65 74 21 20 72 65 63 6f 72 64 20 34 20 28 -set! record 4 (
7c40: 6c 65 74 20 28 28 73 74 61 72 74 74 20 28 61 6e let ((startt (an
7c50: 79 2d 3e 6e 75 6d 62 65 72 20 28 76 65 63 74 6f y->number (vecto
7c60: 72 2d 72 65 66 20 72 65 63 6f 72 64 20 31 29 29 r-ref record 1))
7c70: 29 0a 09 09 09 09 09 20 20 28 65 6e 64 74 20 20 )...... (endt
7c80: 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 20 28 76 (any->number (v
7c90: 65 63 74 6f 72 2d 72 65 66 20 72 65 63 6f 72 64 ector-ref record
7ca0: 20 32 29 29 29 29 0a 09 09 09 09 20 20 20 20 20 2)))).....
7cb0: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20 (debug:print 4
7cc0: 22 72 65 63 6f 72 64 5b 31 5d 3d 22 20 28 76 65 "record[1]=" (ve
7cd0: 63 74 6f 72 2d 72 65 66 20 72 65 63 6f 72 64 20 ctor-ref record
7ce0: 31 29 20 0a 09 09 09 09 09 09 20 20 20 22 2c 20 1) ....... ",
7cf0: 73 74 61 72 74 74 3d 22 20 73 74 61 72 74 74 20 startt=" startt
7d00: 22 2c 20 65 6e 64 74 3d 22 20 65 6e 64 74 0a 09 ", endt=" endt..
7d10: 09 09 09 09 09 20 20 20 22 2c 20 67 65 74 2d 73 ..... ", get-s
7d20: 74 61 74 75 73 3a 20 22 20 28 64 62 3a 73 74 65 tatus: " (db:ste
7d30: 70 2d 67 65 74 2d 73 74 61 74 75 73 20 73 74 65 p-get-status ste
7d40: 70 29 29 0a 09 09 09 09 20 20 20 20 20 20 28 69 p))..... (i
7d50: 66 20 28 61 6e 64 20 28 6e 75 6d 62 65 72 3f 20 f (and (number?
7d60: 73 74 61 72 74 74 29 28 6e 75 6d 62 65 72 3f 20 startt)(number?
7d70: 65 6e 64 74 29 29 0a 09 09 09 09 09 20 20 28 73 endt))...... (s
7d80: 65 63 6f 6e 64 73 2d 3e 68 72 2d 6d 69 6e 2d 73 econds->hr-min-s
7d90: 65 63 20 28 2d 20 65 6e 64 74 20 73 74 61 72 74 ec (- endt start
7da0: 74 29 29 20 22 2d 31 22 29 29 29 29 0a 09 20 20 t)) "-1"))))..
7db0: 20 20 20 28 65 6c 73 65 0a 09 20 20 20 20 20 20 (else..
7dc0: 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72 (vector-set! r
7dd0: 65 63 6f 72 64 20 32 20 28 64 62 3a 73 74 65 70 ecord 2 (db:step
7de0: 2d 67 65 74 2d 73 74 61 74 65 20 73 74 65 70 29 -get-state step)
7df0: 29 0a 09 20 20 20 20 20 20 20 20 28 76 65 63 74 ).. (vect
7e00: 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 33 or-set! record 3
7e10: 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 (db:step-get-st
7e20: 61 74 75 73 20 73 74 65 70 29 29 0a 09 20 20 20 atus step))..
7e30: 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 (vector-set
7e40: 21 20 72 65 63 6f 72 64 20 34 20 28 64 62 3a 73 ! record 4 (db:s
7e50: 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 tep-get-event_ti
7e60: 6d 65 20 73 74 65 70 29 29 29 29 0a 09 20 20 20 me step))))..
7e70: 28 68 61 73 68 2d 74 61 62 6c 65 2d 73 65 74 21 (hash-table-set!
7e80: 20 72 65 73 20 28 64 62 3a 73 74 65 70 2d 67 65 res (db:step-ge
7e90: 74 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70 29 t-stepname step)
7ea0: 20 72 65 63 6f 72 64 29 0a 09 20 20 20 28 64 65 record).. (de
7eb0: 62 75 67 3a 70 72 69 6e 74 20 36 20 22 72 65 63 bug:print 6 "rec
7ec0: 6f 72 64 28 61 66 74 65 72 29 20 20 3d 20 22 20 ord(after) = "
7ed0: 72 65 63 6f 72 64 20 0a 09 09 09 22 5c 6e 69 64 record ...."\nid
7ee0: 3a 20 20 20 20 20 20 20 22 20 28 64 62 3a 73 74 : " (db:st
7ef0: 65 70 2d 67 65 74 2d 69 64 20 73 74 65 70 29 0a ep-get-id step).
7f00: 09 09 09 22 5c 6e 73 74 65 70 6e 61 6d 65 3a 20 ..."\nstepname:
7f10: 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 " (db:step-get-s
7f20: 74 65 70 6e 61 6d 65 20 73 74 65 70 29 0a 09 09 tepname step)...
7f30: 09 22 5c 6e 73 74 61 74 65 3a 20 20 20 20 22 20 ."\nstate: "
7f40: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 (db:step-get-sta
7f50: 74 65 20 73 74 65 70 29 0a 09 09 09 22 5c 6e 73 te step)...."\ns
7f60: 74 61 74 75 73 3a 20 20 20 22 20 28 64 62 3a 73 tatus: " (db:s
7f70: 74 65 70 2d 67 65 74 2d 73 74 61 74 75 73 20 73 tep-get-status s
7f80: 74 65 70 29 0a 09 09 09 22 5c 6e 74 69 6d 65 3a tep)...."\ntime:
7f90: 20 20 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d " (db:step-
7fa0: 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73 get-event_time s
7fb0: 74 65 70 29 29 29 29 0a 20 20 20 20 20 20 20 3b tep)))). ;
7fc0: 3b 20 28 65 6c 73 65 20 20 20 28 76 65 63 74 6f ; (else (vecto
7fd0: 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 31 20 r-set! record 1
7fe0: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 (db:step-get-eve
7ff0: 6e 74 5f 74 69 6d 65 20 73 74 65 70 29 29 29 0a nt_time step))).
8000: 20 20 20 20 20 20 20 28 73 6f 72 74 20 73 74 65 (sort ste
8010: 70 73 20 28 6c 61 6d 62 64 61 20 28 61 20 62 29 ps (lambda (a b)
8020: 28 3c 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d (< (db:step-get-
8030: 65 76 65 6e 74 5f 74 69 6d 65 20 61 29 28 64 62 event_time a)(db
8040: 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f :step-get-event_
8050: 74 69 6d 65 20 62 29 29 29 29 29 0a 20 20 20 20 time b))))).
8060: 20 20 72 65 73 29 29 29 0a 0a 3b 3b 20 55 53 45 res)))..;; USE
8070: 3a 20 28 6c 73 65 74 2d 64 69 66 66 65 72 65 6e : (lset-differen
8080: 63 65 20 73 74 72 69 6e 67 3d 3f 20 27 28 22 61 ce string=? '("a
8090: 22 20 22 62 22 20 22 63 22 29 20 27 28 22 64 22 " "b" "c") '("d"
80a0: 20 22 63 22 20 22 65 22 20 22 61 22 29 29 0a 3b "c" "e" "a")).;
80b0: 3b 0a 3b 3b 20 52 65 74 75 72 6e 20 61 20 6c 69 ;.;; Return a li
80c0: 73 74 20 6f 66 20 70 72 65 72 65 71 73 20 74 68 st of prereqs th
80d0: 61 74 20 77 65 72 65 20 4e 4f 54 20 6d 65 74 0a at were NOT met.
80e0: 3b 3b 20 20 54 65 73 74 73 20 28 61 6e 64 20 61 ;; Tests (and a
80f0: 6c 6c 20 69 74 65 6d 73 29 20 69 6e 20 77 61 69 ll items) in wai
8100: 74 6f 6e 20 6c 69 73 74 20 6d 75 73 74 20 62 65 ton list must be
8110: 20 22 43 4f 4d 50 4c 45 54 45 44 22 20 61 6e 64 "COMPLETED" and
8120: 20 22 50 41 53 53 22 0a 28 64 65 66 69 6e 65 20 "PASS".(define
8130: 28 64 62 2d 67 65 74 2d 70 72 65 72 65 71 73 2d (db-get-prereqs-
8140: 6e 6f 74 2d 6d 65 74 20 64 62 20 72 75 6e 2d 69 not-met db run-i
8150: 64 20 77 61 69 74 6f 6e 29 0a 20 20 28 69 66 20 d waiton). (if
8160: 28 6e 75 6c 6c 3f 20 77 61 69 74 6f 6e 29 0a 20 (null? waiton).
8170: 20 20 20 20 20 27 28 29 0a 20 20 20 20 20 20 28 '(). (
8180: 6c 65 74 2a 20 28 28 75 6e 6d 65 74 2d 70 72 65 let* ((unmet-pre
8190: 2d 72 65 71 73 20 27 28 29 29 0a 09 20 20 20 20 -reqs '())..
81a0: 20 28 74 65 73 74 73 20 20 20 20 20 20 20 20 20 (tests
81b0: 20 20 28 64 62 2d 67 65 74 2d 74 65 73 74 73 2d (db-get-tests-
81c0: 66 6f 72 2d 72 75 6e 20 64 62 20 72 75 6e 2d 69 for-run db run-i
81d0: 64 20 23 66 20 23 66 20 27 28 29 20 27 28 29 29 d #f #f '() '())
81e0: 29 0a 09 20 20 20 20 20 28 72 65 73 75 6c 74 20 ).. (result
81f0: 20 20 20 20 20 20 20 20 27 28 29 29 29 0a 09 28 '()))..(
8200: 66 6f 72 2d 65 61 63 68 20 28 6c 61 6d 62 64 61 for-each (lambda
8210: 20 28 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d (waitontest-nam
8220: 65 29 0a 09 09 20 20 20 20 28 6c 65 74 20 28 28 e)... (let ((
8230: 65 76 65 72 2d 73 65 65 6e 20 23 66 29 29 0a 09 ever-seen #f))..
8240: 09 20 20 20 20 20 20 28 66 6f 72 2d 65 61 63 68 . (for-each
8250: 20 28 6c 61 6d 62 64 61 20 28 74 65 73 74 29 0a (lambda (test).
8260: 09 09 09 09 20 20 28 69 66 20 28 65 71 75 61 6c .... (if (equal
8270: 3f 20 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d ? waitontest-nam
8280: 65 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 74 e (db:test-get-t
8290: 65 73 74 6e 61 6d 65 20 74 65 73 74 29 29 0a 09 estname test))..
82a0: 09 09 09 20 20 20 20 20 20 28 62 65 67 69 6e 0a ... (begin.
82b0: 09 09 09 09 09 28 73 65 74 21 20 65 76 65 72 2d .....(set! ever-
82c0: 73 65 65 6e 20 23 74 29 0a 09 09 09 09 09 28 69 seen #t)......(i
82d0: 66 20 28 6e 6f 74 20 28 61 6e 64 20 28 65 71 75 f (not (and (equ
82e0: 61 6c 3f 20 28 64 62 3a 74 65 73 74 2d 67 65 74 al? (db:test-get
82f0: 2d 73 74 61 74 65 20 74 65 73 74 29 20 22 43 4f -state test) "CO
8300: 4d 50 4c 45 54 45 44 22 29 0a 09 09 09 09 09 09 MPLETED").......
8310: 20 20 20 20 20 20 28 6d 65 6d 62 65 72 20 28 64 (member (d
8320: 62 3a 74 65 73 74 2d 67 65 74 2d 73 74 61 74 75 b:test-get-statu
8330: 73 20 74 65 73 74 29 20 27 28 22 50 41 53 53 22 s test) '("PASS"
8340: 20 22 57 41 52 4e 22 20 22 43 48 45 43 4b 22 29 "WARN" "CHECK")
8350: 29 29 29 0a 09 09 09 09 09 20 20 20 20 28 73 65 )))...... (se
8360: 74 21 20 72 65 73 75 6c 74 20 28 63 6f 6e 73 20 t! result (cons
8370: 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 20 waitontest-name
8380: 72 65 73 75 6c 74 29 29 29 29 29 29 0a 09 09 09 result))))))....
8390: 09 74 65 73 74 73 29 0a 09 09 20 20 20 20 20 20 .tests)...
83a0: 28 69 66 20 28 6e 6f 74 20 65 76 65 72 2d 73 65 (if (not ever-se
83b0: 65 6e 29 28 73 65 74 21 20 72 65 73 75 6c 74 20 en)(set! result
83c0: 28 63 6f 6e 73 20 77 61 69 74 6f 6e 74 65 73 74 (cons waitontest
83d0: 2d 6e 61 6d 65 20 72 65 73 75 6c 74 29 29 29 29 -name result))))
83e0: 29 0a 09 09 20 20 77 61 69 74 6f 6e 29 0a 09 28 )... waiton)..(
83f0: 64 65 6c 65 74 65 2d 64 75 70 6c 69 63 61 74 65 delete-duplicate
8400: 73 20 72 65 73 75 6c 74 29 29 29 29 0a 0a 3b 3b s result))))..;;
8410: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8420: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8430: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8440: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8450: 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 45 78 74 72 61 63 ======.;; Extrac
8460: 74 20 6f 64 73 20 66 69 6c 65 20 66 72 6f 6d 20 t ods file from
8470: 74 68 65 20 64 62 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d the db.;;=======
8480: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8490: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
84a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
84b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a ===============.
84c0: 0a 3b 3b 20 72 75 6e 73 70 61 74 74 20 69 73 20 .;; runspatt is
84d0: 61 20 63 6f 6d 6d 61 20 64 65 6c 69 6d 69 74 65 a comma delimite
84e0: 64 20 6c 69 73 74 20 6f 66 20 72 75 6e 20 70 61 d list of run pa
84f0: 74 74 65 72 6e 73 0a 3b 3b 20 6b 65 79 70 61 74 tterns.;; keypat
8500: 74 2d 61 6c 69 73 74 20 6d 75 73 74 20 63 6f 6e t-alist must con
8510: 74 61 69 6e 20 2a 61 6c 6c 2a 20 6b 65 79 73 20 tain *all* keys
8520: 77 69 74 68 20 61 6e 20 61 73 73 6f 63 69 61 74 with an associat
8530: 65 64 20 70 61 74 74 65 72 6e 3a 20 27 28 20 28 ed pattern: '( (
8540: 22 4b 45 59 31 22 20 22 25 22 29 20 2e 2e 20 29 "KEY1" "%") .. )
8550: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 65 78 74 .(define (db:ext
8560: 72 61 63 74 2d 6f 64 73 2d 66 69 6c 65 20 64 62 ract-ods-file db
8570: 20 6f 75 74 70 75 74 66 69 6c 65 20 6b 65 79 70 outputfile keyp
8580: 61 74 74 2d 61 6c 69 73 74 20 72 75 6e 73 70 61 att-alist runspa
8590: 74 74 20 70 61 74 68 6d 6f 64 29 0a 20 20 28 6c tt pathmod). (l
85a0: 65 74 2a 20 28 28 6b 65 79 73 73 74 72 20 20 28 et* ((keysstr (
85b0: 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 string-intersper
85c0: 73 65 20 28 6d 61 70 20 63 61 72 20 6b 65 79 70 se (map car keyp
85d0: 61 74 74 2d 61 6c 69 73 74 29 20 22 2c 22 29 29 att-alist) ","))
85e0: 0a 09 20 28 6b 65 79 71 72 79 20 20 20 28 73 74 .. (keyqry (st
85f0: 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 ring-intersperse
8600: 20 28 6d 61 70 20 28 6c 61 6d 62 64 61 20 28 70 (map (lambda (p
8610: 29 28 63 6f 6e 63 20 28 63 61 72 20 70 29 20 22 )(conc (car p) "
8620: 20 4c 49 4b 45 20 3f 20 22 29 29 20 6b 65 79 70 LIKE ? ")) keyp
8630: 61 74 74 2d 61 6c 69 73 74 29 20 22 20 41 4e 44 att-alist) " AND
8640: 20 22 29 29 0a 09 20 28 6e 75 6d 6b 65 79 73 20 ")).. (numkeys
8650: 20 28 6c 65 6e 67 74 68 20 6b 65 79 70 61 74 74 (length keypatt
8660: 2d 61 6c 69 73 74 29 29 0a 09 20 28 74 65 73 74 -alist)).. (test
8670: 2d 69 64 73 20 27 28 29 29 0a 09 20 28 77 69 6e -ids '()).. (win
8680: 64 6f 77 73 20 20 28 61 6e 64 20 70 61 74 68 6d dows (and pathm
8690: 6f 64 20 28 73 75 62 73 74 72 69 6e 67 2d 69 6e od (substring-in
86a0: 64 65 78 20 22 5c 5c 22 20 70 61 74 68 6d 6f 64 dex "\\" pathmod
86b0: 29 29 29 0a 09 20 28 74 65 6d 70 64 69 72 20 20 ))).. (tempdir
86c0: 28 63 6f 6e 63 20 22 2f 74 6d 70 2f 22 20 28 63 (conc "/tmp/" (c
86d0: 75 72 72 65 6e 74 2d 75 73 65 72 2d 6e 61 6d 65 urrent-user-name
86e0: 29 20 22 2f 22 20 72 75 6e 73 70 61 74 74 20 22 ) "/" runspatt "
86f0: 5f 22 20 28 72 61 6e 64 6f 6d 20 31 30 30 30 30 _" (random 10000
8700: 29 20 22 5f 22 20 28 63 75 72 72 65 6e 74 2d 70 ) "_" (current-p
8710: 72 6f 63 65 73 73 2d 69 64 29 29 29 0a 09 20 28 rocess-id))).. (
8720: 72 75 6e 73 68 65 61 64 65 72 20 28 61 70 70 65 runsheader (appe
8730: 6e 64 20 28 6c 69 73 74 20 22 52 75 6e 20 49 64 nd (list "Run Id
8740: 22 20 22 52 75 6e 6e 61 6d 65 22 29 20 3b 20 30 " "Runname") ; 0
8750: 20 31 0a 09 09 09 20 20 20 20 20 28 6d 61 70 20 1.... (map
8760: 63 61 72 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 car keypatt-alis
8770: 74 29 20 20 20 3b 20 2b 20 4e 20 3d 20 6c 65 6e t) ; + N = len
8780: 67 74 68 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 gth keypatt-alis
8790: 74 0a 09 09 09 20 20 20 20 20 28 6c 69 73 74 20 t.... (list
87a0: 22 54 65 73 74 6e 61 6d 65 22 20 20 20 20 20 20 "Testname"
87b0: 20 20 20 20 3b 20 32 0a 09 09 09 09 20 20 20 22 ; 2..... "
87c0: 49 74 65 6d 20 50 61 74 68 22 20 20 20 20 20 20 Item Path"
87d0: 20 20 20 3b 20 33 20 0a 09 09 09 09 20 20 20 22 ; 3 ..... "
87e0: 44 65 73 63 72 69 70 74 69 6f 6e 22 20 20 20 20 Description"
87f0: 20 20 20 3b 20 34 20 0a 09 09 09 09 20 20 20 22 ; 4 ..... "
8800: 53 74 61 74 65 22 20 20 20 20 20 20 20 20 20 20 State"
8810: 20 20 20 3b 20 35 20 0a 09 09 09 09 20 20 20 22 ; 5 ..... "
8820: 53 74 61 74 75 73 22 20 20 20 20 20 20 20 20 20 Status"
8830: 20 20 20 3b 20 36 20 20 0a 09 09 09 09 20 20 20 ; 6 .....
8840: 22 46 69 6e 61 6c 20 4c 6f 67 22 20 20 20 20 20 "Final Log"
8850: 20 20 20 20 3b 20 37 20 0a 09 09 09 09 20 20 20 ; 7 .....
8860: 22 52 75 6e 20 44 75 72 61 74 69 6f 6e 22 20 20 "Run Duration"
8870: 20 20 20 20 3b 20 38 20 0a 09 09 09 09 20 20 20 ; 8 .....
8880: 22 57 68 65 6e 20 52 75 6e 22 20 20 20 20 20 20 "When Run"
8890: 20 20 20 20 3b 20 39 20 0a 09 09 09 09 20 20 20 ; 9 .....
88a0: 22 54 61 67 73 22 20 20 20 20 20 20 20 20 20 20 "Tags"
88b0: 20 20 20 20 3b 20 31 30 0a 09 09 09 09 20 20 20 ; 10.....
88c0: 22 52 75 6e 20 4f 77 6e 65 72 22 20 20 20 20 20 "Run Owner"
88d0: 20 20 20 20 3b 20 31 31 0a 09 09 09 09 20 20 20 ; 11.....
88e0: 22 43 6f 6d 6d 65 6e 74 22 20 20 20 20 20 20 20 "Comment"
88f0: 20 20 20 20 3b 20 31 32 0a 09 09 09 09 20 20 20 ; 12.....
8900: 22 41 75 74 68 6f 72 22 20 20 20 20 20 20 20 20 "Author"
8910: 20 20 20 20 3b 20 31 33 0a 09 09 09 09 20 20 20 ; 13.....
8920: 22 54 65 73 74 20 4f 77 6e 65 72 22 20 20 20 20 "Test Owner"
8930: 20 20 20 20 3b 20 31 34 0a 09 09 09 09 20 20 20 ; 14.....
8940: 22 52 65 76 69 65 77 65 64 22 20 20 20 20 20 20 "Reviewed"
8950: 20 20 20 20 3b 20 31 35 0a 09 09 09 09 20 20 20 ; 15.....
8960: 22 44 69 73 6b 66 72 65 65 22 20 20 20 20 20 20 "Diskfree"
8970: 20 20 20 20 3b 20 31 36 0a 09 09 09 09 20 20 20 ; 16.....
8980: 22 55 6e 61 6d 65 22 20 20 20 20 20 20 20 20 20 "Uname"
8990: 20 20 20 20 3b 20 31 37 0a 09 09 09 09 20 20 20 ; 17.....
89a0: 22 52 75 6e 64 69 72 22 20 20 20 20 20 20 20 20 "Rundir"
89b0: 20 20 20 20 3b 20 31 38 0a 09 09 09 09 20 20 20 ; 18.....
89c0: 22 48 6f 73 74 22 20 20 20 20 20 20 20 20 20 20 "Host"
89d0: 20 20 20 20 3b 20 31 39 0a 09 09 09 09 20 20 20 ; 19.....
89e0: 22 43 70 75 20 4c 6f 61 64 22 20 20 20 20 20 20 "Cpu Load"
89f0: 20 20 20 20 3b 20 32 30 0a 20 20 20 20 20 20 20 ; 20.
8a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8a10: 20 20 20 20 20 20 20 20 20 20 20 20 22 57 61 72 "War
8a20: 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 n"
8a30: 3b 20 32 31 0a 20 20 20 20 20 20 20 20 20 20 20 ; 21.
8a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8a50: 20 20 20 20 20 20 20 20 22 45 72 72 6f 72 22 29 "Error")
8a60: 29 29 20 20 20 20 20 20 20 20 20 20 3b 20 32 32 )) ; 22
8a70: 0a 09 20 28 72 65 73 75 6c 74 73 20 28 6c 69 73 .. (results (lis
8a80: 74 20 72 75 6e 73 68 65 61 64 65 72 29 29 09 09 t runsheader))..
8a90: 09 20 0a 09 20 28 74 65 73 74 64 61 74 61 2d 68 . .. (testdata-h
8aa0: 65 61 64 65 72 20 28 6c 69 73 74 20 22 52 75 6e eader (list "Run
8ab0: 20 49 64 22 20 22 54 65 73 74 6e 61 6d 65 22 20 Id" "Testname"
8ac0: 22 49 74 65 6d 20 50 61 74 68 22 20 22 43 61 74 "Item Path" "Cat
8ad0: 65 67 6f 72 79 22 20 22 56 61 72 69 61 62 6c 65 egory" "Variable
8ae0: 22 20 22 56 61 6c 75 65 22 20 22 45 78 70 65 63 " "Value" "Expec
8af0: 74 65 64 22 20 22 54 6f 6c 22 20 22 55 6e 69 74 ted" "Tol" "Unit
8b00: 73 22 20 22 53 74 61 74 75 73 22 20 22 43 6f 6d s" "Status" "Com
8b10: 6d 65 6e 74 22 29 29 29 0a 20 20 20 20 28 64 65 ment"))). (de
8b20: 62 75 67 3a 70 72 69 6e 74 20 32 20 22 55 73 69 bug:print 2 "Usi
8b30: 6e 67 20 22 20 74 65 6d 70 64 69 72 20 22 20 66 ng " tempdir " f
8b40: 6f 72 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 or constructing
8b50: 74 68 65 20 6f 64 73 20 66 69 6c 65 2e 20 6b 65 the ods file. ke
8b60: 79 71 72 79 3a 20 22 20 6b 65 79 71 72 79 20 22 yqry: " keyqry "
8b70: 20 6b 65 79 73 74 72 3a 20 22 20 6b 65 79 73 73 keystr: " keyss
8b80: 74 72 20 22 20 77 69 74 68 20 6b 65 79 73 3a 20 tr " with keys:
8b90: 22 20 28 6d 61 70 20 63 61 64 72 20 6b 65 79 70 " (map cadr keyp
8ba0: 61 74 74 2d 61 6c 69 73 74 29 29 0a 20 20 20 20 att-alist)).
8bb0: 3b 3b 20 22 45 78 70 65 63 74 65 64 20 56 61 6c ;; "Expected Val
8bc0: 75 65 22 0a 20 20 20 20 3b 3b 20 22 56 61 6c 75 ue". ;; "Valu
8bd0: 65 20 46 6f 75 6e 64 22 0a 20 20 20 20 3b 3b 20 e Found". ;;
8be0: 22 54 6f 6c 65 72 61 6e 63 65 22 0a 20 20 20 20 "Tolerance".
8bf0: 28 61 70 70 6c 79 20 73 71 6c 69 74 65 33 3a 66 (apply sqlite3:f
8c00: 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 or-each-row.
8c10: 20 28 6c 61 6d 62 64 61 20 28 74 65 73 74 2d 69 (lambda (test-i
8c20: 64 20 2e 20 62 29 0a 20 20 20 20 20 20 20 28 73 d . b). (s
8c30: 65 74 21 20 74 65 73 74 2d 69 64 73 20 28 63 6f et! test-ids (co
8c40: 6e 73 20 74 65 73 74 2d 69 64 20 74 65 73 74 2d ns test-id test-
8c50: 69 64 73 29 29 20 20 20 3b 3b 20 74 65 73 74 2d ids)) ;; test-
8c60: 69 64 20 69 73 20 6e 6f 77 20 74 65 73 74 6e 61 id is now testna
8c70: 6d 65 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 me. (set!
8c80: 72 65 73 75 6c 74 73 20 28 61 70 70 65 6e 64 20 results (append
8c90: 72 65 73 75 6c 74 73 20 3b 3b 20 6e 6f 74 65 2c results ;; note,
8ca0: 20 64 72 6f 70 20 74 68 65 20 74 65 73 74 2d 69 drop the test-i
8cb0: 64 0a 09 09 09 20 20 20 20 20 28 6c 69 73 74 0a d.... (list.
8cc0: 09 09 09 20 20 20 20 20 20 28 69 66 20 70 61 74 ... (if pat
8cd0: 68 6d 6f 64 0a 09 09 09 09 20 20 28 6c 65 74 2a hmod..... (let*
8ce0: 20 28 28 76 62 20 20 20 20 20 20 20 20 28 61 70 ((vb (ap
8cf0: 70 6c 79 20 76 65 63 74 6f 72 20 62 29 29 0a 09 ply vector b))..
8d00: 09 09 09 09 20 28 6b 65 79 76 61 6c 73 20 20 20 .... (keyvals
8d10: 28 6c 65 74 20 6c 6f 6f 70 20 28 28 69 20 20 20 (let loop ((i
8d20: 20 30 29 0a 09 09 09 09 09 09 09 20 20 20 20 20 0)........
8d30: 20 20 28 72 65 73 20 27 28 29 29 29 0a 09 09 09 (res '()))....
8d40: 09 09 09 20 20 20 20 20 20 28 69 66 20 28 3e 3d ... (if (>=
8d50: 20 69 20 6e 75 6d 6b 65 79 73 29 0a 09 09 09 09 i numkeys).....
8d60: 09 09 09 20 20 72 65 73 0a 09 09 09 09 09 09 09 ... res........
8d70: 20 20 28 6c 6f 6f 70 20 28 2b 20 69 20 31 29 0a (loop (+ i 1).
8d80: 09 09 09 09 09 09 09 09 28 61 70 70 65 6e 64 20 ........(append
8d90: 72 65 73 20 28 6c 69 73 74 20 28 76 65 63 74 6f res (list (vecto
8da0: 72 2d 72 65 66 20 76 62 20 28 2b 20 69 20 32 29 r-ref vb (+ i 2)
8db0: 29 29 29 29 29 29 29 0a 09 09 09 09 09 20 28 72 )))))))...... (r
8dc0: 75 6e 6e 61 6d 65 20 20 20 28 76 65 63 74 6f 72 unname (vector
8dd0: 2d 72 65 66 20 76 62 20 31 29 29 0a 09 09 09 09 -ref vb 1)).....
8de0: 09 20 28 74 65 73 74 6e 61 6d 65 20 20 28 76 65 . (testname (ve
8df0: 63 74 6f 72 2d 72 65 66 20 76 62 20 28 2b 20 20 ctor-ref vb (+
8e00: 32 20 6e 75 6d 6b 65 79 73 29 29 29 0a 09 09 09 2 numkeys)))....
8e10: 09 09 20 28 69 74 65 6d 2d 70 61 74 68 20 28 76 .. (item-path (v
8e20: 65 63 74 6f 72 2d 72 65 66 20 76 62 20 28 2b 20 ector-ref vb (+
8e30: 20 33 20 6e 75 6d 6b 65 79 73 29 29 29 0a 09 09 3 numkeys)))...
8e40: 09 09 09 20 28 66 69 6e 61 6c 2d 6c 6f 67 20 28 ... (final-log (
8e50: 76 65 63 74 6f 72 2d 72 65 66 20 76 62 20 28 2b vector-ref vb (+
8e60: 20 20 37 20 6e 75 6d 6b 65 79 73 29 29 29 0a 09 7 numkeys)))..
8e70: 09 09 09 09 20 28 72 75 6e 2d 64 69 72 20 20 20 .... (run-dir
8e80: 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62 20 28 (vector-ref vb (
8e90: 2b 20 31 38 20 6e 75 6d 6b 65 79 73 29 29 29 0a + 18 numkeys))).
8ea0: 09 09 09 09 09 20 28 6c 6f 67 2d 66 70 61 74 68 ..... (log-fpath
8eb0: 20 28 63 6f 6e 63 20 72 75 6e 2d 64 69 72 20 22 (conc run-dir "
8ec0: 2f 22 20 20 66 69 6e 61 6c 2d 6c 6f 67 29 29 29 /" final-log)))
8ed0: 20 3b 3b 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 ;; (string-inte
8ee0: 72 73 70 65 72 73 65 20 6b 65 79 76 61 6c 73 20 rsperse keyvals
8ef0: 22 2f 22 29 20 22 2f 22 20 74 65 73 74 6e 61 6d "/") "/" testnam
8f00: 65 20 22 2f 22 20 69 74 65 6d 2d 70 61 74 68 20 e "/" item-path
8f10: 22 2f 22 0a 09 09 09 09 20 20 20 20 28 64 65 62 "/"..... (deb
8f20: 75 67 3a 70 72 69 6e 74 20 34 20 22 6c 6f 67 3a ug:print 4 "log:
8f30: 20 22 20 6c 6f 67 2d 66 70 61 74 68 20 22 20 65 " log-fpath " e
8f40: 78 69 73 74 73 3a 20 22 20 28 66 69 6c 65 2d 65 xists: " (file-e
8f50: 78 69 73 74 73 3f 20 6c 6f 67 2d 66 70 61 74 68 xists? log-fpath
8f60: 29 29 0a 09 09 09 09 20 20 20 20 28 76 65 63 74 ))..... (vect
8f70: 6f 72 2d 73 65 74 21 20 76 62 20 28 2b 20 37 20 or-set! vb (+ 7
8f80: 6e 75 6d 6b 65 79 73 29 20 28 69 66 20 28 66 69 numkeys) (if (fi
8f90: 6c 65 2d 65 78 69 73 74 73 3f 20 6c 6f 67 2d 66 le-exists? log-f
8fa0: 70 61 74 68 29 0a 09 09 09 09 09 09 09 09 20 20 path).........
8fb0: 20 20 20 20 28 6c 65 74 20 28 28 6e 65 77 70 61 (let ((newpa
8fc0: 74 68 20 28 63 6f 6e 63 20 70 61 74 68 6d 6f 64 th (conc pathmod
8fd0: 20 22 2f 22 0a 09 09 09 09 09 09 09 09 09 09 09 "/"............
8fe0: 20 20 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 (string-inter
8ff0: 73 70 65 72 73 65 20 6b 65 79 76 61 6c 73 20 22 sperse keyvals "
9000: 2f 22 29 0a 09 09 09 09 09 09 09 09 09 09 09 20 /")............
9010: 20 20 22 2f 22 20 72 75 6e 6e 61 6d 65 20 22 2f "/" runname "/
9020: 22 20 74 65 73 74 6e 61 6d 65 20 22 2f 22 0a 09 " testname "/"..
9030: 09 09 09 09 09 09 09 09 09 09 20 20 20 28 69 66 .......... (if
9040: 20 28 73 74 72 69 6e 67 3d 3f 20 69 74 65 6d 2d (string=? item-
9050: 70 61 74 68 20 22 22 29 20 22 22 20 28 63 6f 6e path "") "" (con
9060: 63 20 22 2f 22 20 69 74 65 6d 2d 70 61 74 68 29 c "/" item-path)
9070: 29 0a 09 09 09 09 09 09 09 09 09 09 09 20 20 20 )............
9080: 66 69 6e 61 6c 2d 6c 6f 67 29 29 29 0a 09 09 09 final-log)))....
9090: 09 09 09 09 09 09 3b 3b 20 66 6f 72 20 6e 6f 77 ......;; for now
90a0: 20 74 68 72 6f 77 20 61 77 61 79 20 6e 65 77 70 throw away newp
90b0: 61 74 68 20 61 6e 64 20 75 73 65 20 74 68 65 20 ath and use the
90c0: 6c 6f 67 2d 66 70 61 74 68 20 63 6f 6e 63 27 64 log-fpath conc'd
90d0: 20 77 69 74 68 20 70 61 74 68 6d 6f 64 0a 09 09 with pathmod...
90e0: 09 09 09 09 09 09 09 28 73 65 74 21 20 6e 65 77 .......(set! new
90f0: 70 61 74 68 20 28 63 6f 6e 63 20 70 61 74 68 6d path (conc pathm
9100: 6f 64 20 6c 6f 67 2d 66 70 61 74 68 29 29 0a 09 od log-fpath))..
9110: 09 09 09 09 09 09 09 09 28 69 66 20 77 69 6e 64 ........(if wind
9120: 6f 77 73 20 28 73 74 72 69 6e 67 2d 74 72 61 6e ows (string-tran
9130: 73 6c 61 74 65 20 6e 65 77 70 61 74 68 20 22 2f slate newpath "/
9140: 22 20 22 5c 5c 22 29 20 6e 65 77 70 61 74 68 29 " "\\") newpath)
9150: 29 0a 09 09 09 09 09 09 09 09 20 20 20 20 20 20 ).........
9160: 28 69 66 20 28 3e 20 2a 76 65 72 62 6f 73 69 74 (if (> *verbosit
9170: 79 2a 20 31 29 0a 09 09 09 09 09 09 09 09 09 20 y* 1)..........
9180: 20 28 63 6f 6e 63 20 66 69 6e 61 6c 2d 6c 6f 67 (conc final-log
9190: 20 22 20 6e 6f 74 2d 66 6f 75 6e 64 22 29 0a 09 " not-found")..
91a0: 09 09 09 09 09 09 09 09 20 20 22 22 29 29 29 0a ........ ""))).
91b0: 09 09 09 09 20 20 20 20 28 76 65 63 74 6f 72 2d .... (vector-
91c0: 3e 6c 69 73 74 20 76 62 29 29 0a 09 09 09 09 20 >list vb)).....
91d0: 20 62 29 29 29 29 29 0a 20 20 20 20 20 64 62 0a b))))). db.
91e0: 20 20 20 20 20 28 63 6f 6e 63 20 22 53 45 4c 45 (conc "SELE
91f0: 43 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 CT.
9200: 20 74 2e 74 65 73 74 6e 61 6d 65 2c 72 2e 69 64 t.testname,r.id
9210: 2c 72 75 6e 6e 61 6d 65 2c 22 20 6b 65 79 73 73 ,runname," keyss
9220: 74 72 20 22 2c 74 2e 74 65 73 74 6e 61 6d 65 2c tr ",t.testname,
9230: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 . t
9240: 2e 69 74 65 6d 5f 70 61 74 68 2c 74 6d 2e 64 65 .item_path,tm.de
9250: 73 63 72 69 70 74 69 6f 6e 2c 74 2e 73 74 61 74 scription,t.stat
9260: 65 2c 74 2e 73 74 61 74 75 73 2c 0a 20 20 20 20 e,t.status,.
9270: 20 20 20 20 20 20 20 20 20 20 66 69 6e 61 6c 5f final_
9280: 6c 6f 67 66 2c 72 75 6e 5f 64 75 72 61 74 69 6f logf,run_duratio
9290: 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 n, .
92a0: 20 20 73 74 72 66 74 69 6d 65 28 27 25 6d 2f 25 strftime('%m/%
92b0: 64 2f 25 59 20 25 48 3a 25 4d 3a 25 53 27 2c 64 d/%Y %H:%M:%S',d
92c0: 61 74 65 74 69 6d 65 28 74 2e 65 76 65 6e 74 5f atetime(t.event_
92d0: 74 69 6d 65 2c 27 75 6e 69 78 65 70 6f 63 68 27 time,'unixepoch'
92e0: 29 2c 27 6c 6f 63 61 6c 74 69 6d 65 27 29 2c 0a ),'localtime'),.
92f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6d tm
9300: 2e 74 61 67 73 2c 72 2e 6f 77 6e 65 72 2c 74 2e .tags,r.owner,t.
9310: 63 6f 6d 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20 comment,.
9320: 20 20 20 20 20 20 20 61 75 74 68 6f 72 2c 0a 20 author,.
9330: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6d 2e tm.
9340: 6f 77 6e 65 72 2c 72 65 76 69 65 77 65 64 2c 0a owner,reviewed,.
9350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 di
9360: 73 6b 66 72 65 65 2c 75 6e 61 6d 65 2c 72 75 6e skfree,uname,run
9370: 64 69 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 dir,.
9380: 20 20 20 68 6f 73 74 2c 63 70 75 6c 6f 61 64 2c host,cpuload,
9390: 66 69 72 73 74 5f 65 72 72 2c 66 69 72 73 74 5f first_err,first_
93a0: 77 61 72 6e 0a 20 20 20 20 20 20 20 20 20 20 20 warn.
93b0: 20 46 52 4f 4d 20 74 65 73 74 73 20 41 53 20 74 FROM tests AS t
93c0: 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 72 75 6e 73 INNER JOIN runs
93d0: 20 41 53 20 72 20 4f 4e 20 74 2e 72 75 6e 5f 69 AS r ON t.run_i
93e0: 64 3d 72 2e 69 64 20 49 4e 4e 45 52 20 4a 4f 49 d=r.id INNER JOI
93f0: 4e 20 74 65 73 74 5f 6d 65 74 61 20 41 53 20 74 N test_meta AS t
9400: 6d 20 4f 4e 20 74 6d 2e 74 65 73 74 6e 61 6d 65 m ON tm.testname
9410: 3d 74 2e 74 65 73 74 6e 61 6d 65 0a 20 20 20 20 =t.testname.
9420: 20 20 20 20 20 20 20 20 57 48 45 52 45 20 72 75 WHERE ru
9430: 6e 6e 61 6d 65 20 4c 49 4b 45 20 3f 20 41 4e 44 nname LIKE ? AND
9440: 20 22 20 6b 65 79 71 72 79 20 22 3b 22 29 0a 20 " keyqry ";").
9450: 20 20 20 20 72 75 6e 73 70 61 74 74 20 28 6d 61 runspatt (ma
9460: 70 20 63 61 64 72 20 6b 65 79 70 61 74 74 2d 61 p cadr keypatt-a
9470: 6c 69 73 74 29 29 0a 20 20 20 20 28 73 65 74 21 list)). (set!
9480: 20 72 65 73 75 6c 74 73 20 28 6c 69 73 74 20 28 results (list (
9490: 63 6f 6e 73 20 22 52 75 6e 73 22 20 72 65 73 75 cons "Runs" resu
94a0: 6c 74 73 29 29 29 0a 20 20 20 20 3b 3b 20 6e 6f lts))). ;; no
94b0: 77 2c 20 66 6f 72 20 65 61 63 68 20 74 65 73 74 w, for each test
94c0: 2c 20 63 6f 6c 6c 65 63 74 20 74 68 65 20 74 65 , collect the te
94d0: 73 74 5f 64 61 74 61 20 69 6e 66 6f 20 61 6e 64 st_data info and
94e0: 20 61 64 64 20 61 20 6e 65 77 20 73 68 65 65 74 add a new sheet
94f0: 0a 20 20 20 20 28 66 6f 72 2d 65 61 63 68 0a 20 . (for-each.
9500: 20 20 20 20 28 6c 61 6d 62 64 61 20 28 74 65 73 (lambda (tes
9510: 74 2d 69 64 29 0a 20 20 20 20 20 20 20 28 6c 65 t-id). (le
9520: 74 20 28 28 74 65 73 74 2d 64 61 74 61 20 28 6c t ((test-data (l
9530: 69 73 74 20 74 65 73 74 64 61 74 61 2d 68 65 61 ist testdata-hea
9540: 64 65 72 29 29 0a 09 20 20 20 20 20 28 63 75 72 der)).. (cur
9550: 72 2d 74 65 73 74 2d 6e 61 6d 65 20 23 66 29 29 r-test-name #f))
9560: 0a 09 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d .. (sqlite3:for-
9570: 65 61 63 68 2d 72 6f 77 0a 09 20 20 28 6c 61 6d each-row.. (lam
9580: 62 64 61 20 28 72 75 6e 2d 69 64 20 74 65 73 74 bda (run-id test
9590: 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 63 name item-path c
95a0: 61 74 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65 ategory variable
95b0: 20 76 61 6c 75 65 20 65 78 70 65 63 74 65 64 20 value expected
95c0: 74 6f 6c 20 75 6e 69 74 73 20 73 74 61 74 75 73 tol units status
95d0: 20 63 6f 6d 6d 65 6e 74 29 0a 09 20 20 20 20 28 comment).. (
95e0: 73 65 74 21 20 63 75 72 72 2d 74 65 73 74 2d 6e set! curr-test-n
95f0: 61 6d 65 20 74 65 73 74 6e 61 6d 65 29 0a 09 20 ame testname)..
9600: 20 20 20 28 73 65 74 21 20 74 65 73 74 2d 64 61 (set! test-da
9610: 74 61 20 28 61 70 70 65 6e 64 20 74 65 73 74 2d ta (append test-
9620: 64 61 74 61 20 28 6c 69 73 74 20 28 6c 69 73 74 data (list (list
9630: 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 run-id testname
9640: 20 69 74 65 6d 2d 70 61 74 68 20 63 61 74 65 67 item-path categ
9650: 6f 72 79 20 76 61 72 69 61 62 6c 65 20 76 61 6c ory variable val
9660: 75 65 20 65 78 70 65 63 74 65 64 20 74 6f 6c 20 ue expected tol
9670: 75 6e 69 74 73 20 73 74 61 74 75 73 20 63 6f 6d units status com
9680: 6d 65 6e 74 29 29 29 29 29 0a 09 20 20 64 62 20 ment))))).. db
9690: 0a 09 20 20 3b 3b 20 22 53 45 4c 45 43 54 20 72 .. ;; "SELECT r
96a0: 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d 65 2c 69 un_id,testname,i
96b0: 74 65 6d 5f 70 61 74 68 2c 63 61 74 65 67 6f 72 tem_path,categor
96c0: 79 2c 76 61 72 69 61 62 6c 65 2c 74 64 2e 76 61 y,variable,td.va
96d0: 6c 75 65 20 41 53 20 76 61 6c 75 65 2c 65 78 70 lue AS value,exp
96e0: 65 63 74 65 64 2c 74 6f 6c 2c 75 6e 69 74 73 2c ected,tol,units,
96f0: 74 64 2e 73 74 61 74 75 73 20 41 53 20 73 74 61 td.status AS sta
9700: 74 75 73 2c 74 64 2e 63 6f 6d 6d 65 6e 74 20 41 tus,td.comment A
9710: 53 20 63 6f 6d 6d 65 6e 74 20 46 52 4f 4d 20 74 S comment FROM t
9720: 65 73 74 5f 64 61 74 61 20 41 53 20 74 64 20 49 est_data AS td I
9730: 4e 4e 45 52 20 4a 4f 49 4e 20 74 65 73 74 73 20 NNER JOIN tests
9740: 4f 4e 20 74 65 73 74 73 2e 69 64 3d 74 64 2e 74 ON tests.id=td.t
9750: 65 73 74 5f 69 64 20 57 48 45 52 45 20 74 65 73 est_id WHERE tes
9760: 74 5f 69 64 3d 3f 3b 22 0a 09 20 20 22 53 45 4c t_id=?;".. "SEL
9770: 45 43 54 20 72 75 6e 5f 69 64 2c 74 65 73 74 6e ECT run_id,testn
9780: 61 6d 65 2c 69 74 65 6d 5f 70 61 74 68 2c 63 61 ame,item_path,ca
9790: 74 65 67 6f 72 79 2c 76 61 72 69 61 62 6c 65 2c tegory,variable,
97a0: 74 64 2e 76 61 6c 75 65 20 41 53 20 76 61 6c 75 td.value AS valu
97b0: 65 2c 74 64 2e 65 78 70 65 63 74 65 64 2c 74 64 e,td.expected,td
97c0: 2e 74 6f 6c 2c 74 64 2e 75 6e 69 74 73 2c 74 64 .tol,td.units,td
97d0: 2e 73 74 61 74 75 73 20 41 53 20 73 74 61 74 75 .status AS statu
97e0: 73 2c 74 64 2e 63 6f 6d 6d 65 6e 74 20 41 53 20 s,td.comment AS
97f0: 63 6f 6d 6d 65 6e 74 20 46 52 4f 4d 20 74 65 73 comment FROM tes
9800: 74 5f 64 61 74 61 20 41 53 20 74 64 20 49 4e 4e t_data AS td INN
9810: 45 52 20 4a 4f 49 4e 20 74 65 73 74 73 20 4f 4e ER JOIN tests ON
9820: 20 74 65 73 74 73 2e 69 64 3d 74 64 2e 74 65 73 tests.id=td.tes
9830: 74 5f 69 64 20 57 48 45 52 45 20 74 65 73 74 6e t_id WHERE testn
9840: 61 6d 65 3d 3f 3b 22 0a 09 20 20 74 65 73 74 2d ame=?;".. test-
9850: 69 64 29 0a 09 20 28 69 66 20 63 75 72 72 2d 74 id).. (if curr-t
9860: 65 73 74 2d 6e 61 6d 65 0a 09 20 20 20 20 20 28 est-name.. (
9870: 73 65 74 21 20 72 65 73 75 6c 74 73 20 28 61 70 set! results (ap
9880: 70 65 6e 64 20 72 65 73 75 6c 74 73 20 28 6c 69 pend results (li
9890: 73 74 20 28 63 6f 6e 73 20 63 75 72 72 2d 74 65 st (cons curr-te
98a0: 73 74 2d 6e 61 6d 65 20 74 65 73 74 2d 64 61 74 st-name test-dat
98b0: 61 29 29 29 29 29 0a 09 20 29 29 0a 20 20 20 20 a))))).. )).
98c0: 20 28 73 6f 72 74 20 28 64 65 6c 65 74 65 2d 64 (sort (delete-d
98d0: 75 70 6c 69 63 61 74 65 73 20 74 65 73 74 2d 69 uplicates test-i
98e0: 64 73 29 20 73 74 72 69 6e 67 3c 3d 29 29 0a 20 ds) string<=)).
98f0: 20 20 20 28 73 79 73 74 65 6d 20 28 63 6f 6e 63 (system (conc
9900: 20 22 6d 6b 64 69 72 20 2d 70 20 22 20 74 65 6d "mkdir -p " tem
9910: 70 64 69 72 29 29 0a 20 20 20 20 3b 3b 20 28 70 pdir)). ;; (p
9920: 70 20 72 65 73 75 6c 74 73 29 0a 20 20 20 20 28 p results). (
9930: 6f 64 73 3a 6c 69 73 74 2d 3e 6f 64 73 20 0a 20 ods:list->ods .
9940: 20 20 20 20 74 65 6d 70 64 69 72 0a 20 20 20 20 tempdir.
9950: 20 28 69 66 20 28 73 74 72 69 6e 67 2d 6d 61 74 (if (string-mat
9960: 63 68 20 28 72 65 67 65 78 70 20 22 5e 5b 2f 7e ch (regexp "^[/~
9970: 5d 2b 2e 2a 22 29 20 6f 75 74 70 75 74 66 69 6c ]+.*") outputfil
9980: 65 29 20 3b 3b 20 66 75 6c 6c 20 70 61 74 68 3f e) ;; full path?
9990: 0a 09 20 6f 75 74 70 75 74 66 69 6c 65 0a 09 20 .. outputfile..
99a0: 28 62 65 67 69 6e 0a 09 20 20 20 28 64 65 62 75 (begin.. (debu
99b0: 67 3a 70 72 69 6e 74 20 30 20 22 57 41 52 4e 49 g:print 0 "WARNI
99c0: 4e 47 3a 20 70 61 74 68 20 67 69 76 65 6e 2c 20 NG: path given,
99d0: 22 20 6f 75 74 70 75 74 66 69 6c 65 20 22 20 69 " outputfile " i
99e0: 73 20 72 65 6c 61 74 69 76 65 2c 20 70 72 65 66 s relative, pref
99f0: 69 78 69 6e 67 20 77 69 74 68 20 63 75 72 72 65 ixing with curre
9a00: 6e 74 20 64 69 72 65 63 74 6f 72 79 22 29 0a 09 nt directory")..
9a10: 20 20 20 28 63 6f 6e 63 20 28 63 75 72 72 65 6e (conc (curren
9a20: 74 2d 64 69 72 65 63 74 6f 72 79 29 20 22 2f 22 t-directory) "/"
9a30: 20 6f 75 74 70 75 74 66 69 6c 65 29 29 29 0a 20 outputfile))).
9a40: 20 20 20 20 72 65 73 75 6c 74 73 29 29 29 0a 0a results)))..
9a50: 3b 3b 20 28 64 62 3a 65 78 74 72 61 63 74 2d 6f ;; (db:extract-o
9a60: 64 73 2d 66 69 6c 65 20 64 62 20 22 6f 75 74 70 ds-file db "outp
9a70: 75 74 66 69 6c 65 2e 6f 64 73 22 20 27 28 28 22 utfile.ods" '(("
9a80: 73 79 73 6e 61 6d 65 22 20 22 25 22 29 28 22 66 sysname" "%")("f
9a90: 73 6e 61 6d 65 22 20 22 25 22 29 28 22 64 61 74 sname" "%")("dat
9aa0: 61 70 61 74 68 22 20 22 25 22 29 29 20 22 25 22 apath" "%")) "%"
9ab0: 29 0a ).