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 28 6c 69 73 74 20 22 72 75 ... (list "ru
0640: 6e 6e 61 6d 65 22 20 22 73 74 61 74 65 22 20 22 nname" "state" "
0650: 73 74 61 74 75 73 22 20 22 6f 77 6e 65 72 22 20 status" "owner"
0660: 22 65 76 65 6e 74 5f 74 69 6d 65 22 20 22 63 6f "event_time" "co
0670: 6d 6d 65 6e 74 22 20 22 66 61 69 6c 5f 63 6f 75 mment" "fail_cou
0680: 6e 74 22 0a 09 09 09 09 09 20 20 22 70 61 73 73 nt"...... "pass
0690: 5f 63 6f 75 6e 74 22 29 29 0a 09 09 09 20 20 20 _count"))....
06a0: 20 28 62 65 67 69 6e 0a 09 09 09 20 20 20 20 20 (begin....
06b0: 20 28 70 72 69 6e 74 20 22 45 52 52 4f 52 3a 20 (print "ERROR:
06c0: 79 6f 75 72 20 6b 65 79 20 63 61 6e 6e 6f 74 20 your key cannot
06d0: 62 65 20 6e 61 6d 65 64 20 22 20 6b 65 79 6e 20 be named " keyn
06e0: 22 20 61 73 20 74 68 69 73 20 63 6f 6e 66 6c 69 " as this confli
06f0: 63 74 73 20 77 69 74 68 20 74 68 65 20 73 61 6d cts with the sam
0700: 65 20 6e 61 6d 65 64 20 66 69 65 6c 64 20 69 6e e named field in
0710: 20 74 68 65 20 72 75 6e 73 20 74 61 62 6c 65 22 the runs table"
0720: 29 0a 09 09 09 20 20 20 20 20 20 28 73 79 73 74 ).... (syst
0730: 65 6d 20 28 63 6f 6e 63 20 22 72 6d 20 2d 66 20 em (conc "rm -f
0740: 22 20 64 62 70 61 74 68 29 29 0a 09 09 09 20 20 " dbpath))....
0750: 20 20 20 20 28 65 78 69 74 20 31 29 29 29 29 29 (exit 1)))))
0760: 0a 09 09 20 20 20 20 6b 65 79 73 29 0a 09 20 20 ... keys)..
0770: 3b 3b 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 ;; (sqlite3:exec
0780: 75 74 65 20 64 62 20 22 50 52 41 47 4d 41 20 73 ute db "PRAGMA s
0790: 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4f 46 46 ynchronous = OFF
07a0: 3b 22 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a ;").. (sqlite3:
07b0: 65 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 execute db "CREA
07c0: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 TE TABLE IF NOT
07d0: 45 58 49 53 54 53 20 6b 65 79 73 20 28 69 64 20 EXISTS keys (id
07e0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 INTEGER PRIMARY
07f0: 4b 45 59 2c 20 66 69 65 6c 64 6e 61 6d 65 20 54 KEY, fieldname T
0800: 45 58 54 2c 20 66 69 65 6c 64 74 79 70 65 20 54 EXT, fieldtype T
0810: 45 58 54 2c 20 43 4f 4e 53 54 52 41 49 4e 54 20 EXT, CONSTRAINT
0820: 6b 65 79 63 6f 6e 73 74 72 61 69 6e 74 20 55 4e keyconstraint UN
0830: 49 51 55 45 20 28 66 69 65 6c 64 6e 61 6d 65 29 IQUE (fieldname)
0840: 29 3b 22 29 0a 09 20 20 28 66 6f 72 2d 65 61 63 );").. (for-eac
0850: 68 20 28 6c 61 6d 62 64 61 20 28 6b 65 79 29 0a h (lambda (key).
0860: 09 09 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 .. (sqlite3
0870: 3a 65 78 65 63 75 74 65 20 64 62 20 22 49 4e 53 :execute db "INS
0880: 45 52 54 20 49 4e 54 4f 20 6b 65 79 73 20 28 66 ERT INTO keys (f
0890: 69 65 6c 64 6e 61 6d 65 2c 66 69 65 6c 64 74 79 ieldname,fieldty
08a0: 70 65 29 20 56 41 4c 55 45 53 20 28 3f 2c 3f 29 pe) VALUES (?,?)
08b0: 3b 22 20 28 6b 65 79 3a 67 65 74 2d 66 69 65 6c ;" (key:get-fiel
08c0: 64 6e 61 6d 65 20 6b 65 79 29 28 6b 65 79 3a 67 dname key)(key:g
08d0: 65 74 2d 66 69 65 6c 64 74 79 70 65 20 6b 65 79 et-fieldtype key
08e0: 29 29 29 0a 09 09 20 20 20 20 6b 65 79 73 29 0a )))... keys).
08f0: 09 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 . (sqlite3:exec
0900: 75 74 65 20 64 62 20 28 63 6f 6e 63 20 0a 09 09 ute db (conc ...
0910: 09 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 . "CREATE
0920: 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 TABLE IF NOT EXI
0930: 53 54 53 20 72 75 6e 73 20 28 69 64 20 49 4e 54 STS runs (id INT
0940: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY
0950: 2c 20 22 20 0a 09 09 09 20 20 20 20 20 20 20 66 , " .... f
0960: 69 65 6c 64 73 74 72 20 28 69 66 20 68 61 76 65 ieldstr (if have
0970: 6b 65 79 73 20 22 2c 22 20 22 22 29 0a 09 09 09 keys "," "")....
0980: 20 20 20 20 20 20 20 22 72 75 6e 6e 61 6d 65 20 "runname
0990: 54 45 58 54 2c 22 0a 09 09 09 20 20 20 20 20 20 TEXT,"....
09a0: 20 22 73 74 61 74 65 20 54 45 58 54 20 44 45 46 "state TEXT DEF
09b0: 41 55 4c 54 20 27 27 2c 22 0a 09 09 09 20 20 20 AULT '',"....
09c0: 20 20 20 20 22 73 74 61 74 75 73 20 54 45 58 54 "status TEXT
09d0: 20 44 45 46 41 55 4c 54 20 27 27 2c 22 0a 09 09 DEFAULT '',"...
09e0: 09 20 20 20 20 20 20 20 22 6f 77 6e 65 72 20 54 . "owner T
09f0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 22 EXT DEFAULT '',"
0a00: 0a 09 09 09 20 20 20 20 20 20 20 22 65 76 65 6e .... "even
0a10: 74 5f 74 69 6d 65 20 54 49 4d 45 53 54 41 4d 50 t_time TIMESTAMP
0a20: 2c 22 0a 09 09 09 20 20 20 20 20 20 20 22 63 6f ,".... "co
0a30: 6d 6d 65 6e 74 20 54 45 58 54 20 44 45 46 41 55 mment TEXT DEFAU
0a40: 4c 54 20 27 27 2c 22 0a 09 09 09 20 20 20 20 20 LT '',"....
0a50: 20 20 22 66 61 69 6c 5f 63 6f 75 6e 74 20 49 4e "fail_count IN
0a60: 54 45 47 45 52 20 44 45 46 41 55 4c 54 20 30 2c TEGER DEFAULT 0,
0a70: 22 0a 09 09 09 20 20 20 20 20 20 20 22 70 61 73 ".... "pas
0a80: 73 5f 63 6f 75 6e 74 20 49 4e 54 45 47 45 52 20 s_count INTEGER
0a90: 44 45 46 41 55 4c 54 20 30 2c 22 0a 09 09 09 20 DEFAULT 0,"....
0aa0: 20 20 20 20 20 20 22 43 4f 4e 53 54 52 41 49 4e "CONSTRAIN
0ab0: 54 20 72 75 6e 73 63 6f 6e 73 74 72 61 69 6e 74 T runsconstraint
0ac0: 20 55 4e 49 51 55 45 20 28 72 75 6e 6e 61 6d 65 UNIQUE (runname
0ad0: 22 20 28 69 66 20 68 61 76 65 6b 65 79 73 20 22 " (if havekeys "
0ae0: 2c 22 20 22 22 29 20 6b 65 79 73 74 72 20 22 29 ," "") keystr ")
0af0: 29 3b 22 29 29 0a 09 20 20 28 73 71 6c 69 74 65 );")).. (sqlite
0b00: 33 3a 65 78 65 63 75 74 65 20 64 62 20 28 63 6f 3:execute db (co
0b10: 6e 63 20 22 43 52 45 41 54 45 20 49 4e 44 45 58 nc "CREATE INDEX
0b20: 20 72 75 6e 73 5f 69 6e 64 65 78 20 4f 4e 20 72 runs_index ON r
0b30: 75 6e 73 20 28 72 75 6e 6e 61 6d 65 22 20 28 69 uns (runname" (i
0b40: 66 20 68 61 76 65 6b 65 79 73 20 22 2c 22 20 22 f havekeys "," "
0b50: 22 29 20 6b 65 79 73 74 72 20 22 29 3b 22 29 29 ") keystr ");"))
0b60: 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 .. (sqlite3:exe
0b70: 63 75 74 65 20 64 62 20 0a 09 09 09 20 20 20 22 cute db .... "
0b80: 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 CREATE TABLE IF
0b90: 4e 4f 54 20 45 58 49 53 54 53 20 74 65 73 74 73 NOT EXISTS tests
0ba0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
0bb0: 20 20 20 20 20 20 28 69 64 20 49 4e 54 45 47 45 (id INTEGE
0bc0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 R PRIMARY KEY,.
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0be0: 20 20 20 20 72 75 6e 5f 69 64 20 20 20 20 20 49 run_id I
0bf0: 4e 54 45 47 45 52 2c 0a 20 20 20 20 20 20 20 20 NTEGER,.
0c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 tes
0c10: 74 6e 61 6d 65 20 20 20 54 45 58 54 2c 0a 20 20 tname TEXT,.
0c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0c30: 20 20 20 68 6f 73 74 20 20 20 20 20 20 20 54 45 host TE
0c40: 58 54 20 44 45 46 41 55 4c 54 20 27 6e 2f 61 27 XT DEFAULT 'n/a'
0c50: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
0c60: 20 20 20 20 20 20 20 63 70 75 6c 6f 61 64 20 20 cpuload
0c70: 20 20 52 45 41 4c 20 44 45 46 41 55 4c 54 20 2d REAL DEFAULT -
0c80: 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 1,.
0c90: 20 20 20 20 20 20 20 20 64 69 73 6b 66 72 65 65 diskfree
0ca0: 20 20 20 49 4e 54 45 47 45 52 20 44 45 46 41 55 INTEGER DEFAU
0cb0: 4c 54 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 LT -1,.
0cc0: 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 61 6d unam
0cd0: 65 20 20 20 20 20 20 54 45 58 54 20 44 45 46 41 e TEXT DEFA
0ce0: 55 4c 54 20 27 6e 2f 61 27 2c 20 0a 20 20 20 20 ULT 'n/a', .
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0d00: 20 72 75 6e 64 69 72 20 20 20 20 20 54 45 58 54 rundir TEXT
0d10: 20 44 45 46 41 55 4c 54 20 27 6e 2f 61 27 2c 0a DEFAULT 'n/a',.
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0d30: 20 20 20 20 20 73 68 6f 72 74 64 69 72 20 20 20 shortdir
0d40: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c TEXT DEFAULT '',
0d50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
0d60: 20 20 20 20 20 20 69 74 65 6d 5f 70 61 74 68 20 item_path
0d70: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 TEXT DEFAULT ''
0d80: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
0d90: 20 20 20 20 20 20 20 73 74 61 74 65 20 20 20 20 state
0da0: 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 TEXT DEFAULT '
0db0: 4e 4f 54 5f 53 54 41 52 54 45 44 27 2c 0a 20 20 NOT_STARTED',.
0dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0dd0: 20 20 20 73 74 61 74 75 73 20 20 20 20 20 54 45 status TE
0de0: 58 54 20 44 45 46 41 55 4c 54 20 27 46 41 49 4c XT DEFAULT 'FAIL
0df0: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ',.
0e00: 20 20 20 20 20 20 20 20 61 74 74 65 6d 70 74 6e attemptn
0e10: 75 6d 20 49 4e 54 45 47 45 52 20 44 45 46 41 55 um INTEGER DEFAU
0e20: 4c 54 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 LT 0,.
0e30: 20 20 20 20 20 20 20 20 20 20 20 66 69 6e 61 6c final
0e40: 5f 6c 6f 67 66 20 54 45 58 54 20 44 45 46 41 55 _logf TEXT DEFAU
0e50: 4c 54 20 27 6c 6f 67 73 2f 66 69 6e 61 6c 2e 6c LT 'logs/final.l
0e60: 6f 67 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 og',.
0e70: 20 20 20 20 20 20 20 20 20 20 6c 6f 67 64 61 74 logdat
0e80: 20 20 20 20 20 42 4c 4f 42 2c 20 0a 20 20 20 20 BLOB, .
0e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0ea0: 20 72 75 6e 5f 64 75 72 61 74 69 6f 6e 20 49 4e run_duration IN
0eb0: 54 45 47 45 52 20 44 45 46 41 55 4c 54 20 30 2c TEGER DEFAULT 0,
0ec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
0ed0: 20 20 20 20 20 20 63 6f 6d 6d 65 6e 74 20 20 20 comment
0ee0: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 TEXT DEFAULT ''
0ef0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
0f00: 20 20 20 20 20 20 20 65 76 65 6e 74 5f 74 69 6d event_tim
0f10: 65 20 54 49 4d 45 53 54 41 4d 50 2c 0a 20 20 20 e TIMESTAMP,.
0f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0f30: 20 20 66 61 69 6c 5f 63 6f 75 6e 74 20 49 4e 54 fail_count INT
0f40: 45 47 45 52 20 44 45 46 41 55 4c 54 20 30 2c 0a EGER DEFAULT 0,.
0f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0f60: 20 20 20 20 20 70 61 73 73 5f 63 6f 75 6e 74 20 pass_count
0f70: 49 4e 54 45 47 45 52 20 44 45 46 41 55 4c 54 20 INTEGER DEFAULT
0f80: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 0,.
0f90: 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52 41 49 CONSTRAI
0fa0: 4e 54 20 74 65 73 74 73 63 6f 6e 73 74 72 61 69 NT testsconstrai
0fb0: 6e 74 20 55 4e 49 51 55 45 20 28 72 75 6e 5f 69 nt UNIQUE (run_i
0fc0: 64 2c 20 74 65 73 74 6e 61 6d 65 2c 20 69 74 65 d, testname, ite
0fd0: 6d 5f 70 61 74 68 29 0a 20 20 20 20 20 20 20 20 m_path).
0fe0: 20 20 29 3b 22 29 0a 09 20 20 28 73 71 6c 69 74 );").. (sqlit
0ff0: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 43 e3:execute db "C
1000: 52 45 41 54 45 20 49 4e 44 45 58 20 74 65 73 74 REATE INDEX test
1010: 73 5f 69 6e 64 65 78 20 4f 4e 20 74 65 73 74 73 s_index ON tests
1020: 20 28 72 75 6e 5f 69 64 2c 20 74 65 73 74 6e 61 (run_id, testna
1030: 6d 65 29 3b 22 29 0a 09 20 20 28 73 71 6c 69 74 me);").. (sqlit
1040: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 43 e3:execute db "C
1050: 52 45 41 54 45 20 56 49 45 57 20 72 75 6e 73 5f REATE VIEW runs_
1060: 74 65 73 74 73 20 41 53 20 53 45 4c 45 43 54 20 tests AS SELECT
1070: 2a 20 46 52 4f 4d 20 72 75 6e 73 20 49 4e 4e 45 * FROM runs INNE
1080: 52 20 4a 4f 49 4e 20 74 65 73 74 73 20 4f 4e 20 R JOIN tests ON
1090: 72 75 6e 73 2e 69 64 3d 74 65 73 74 73 2e 72 75 runs.id=tests.ru
10a0: 6e 5f 69 64 3b 22 29 0a 09 20 20 28 73 71 6c 69 n_id;").. (sqli
10b0: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 te3:execute db "
10c0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 CREATE TABLE IF
10d0: 4e 4f 54 20 45 58 49 53 54 53 20 74 65 73 74 5f NOT EXISTS test_
10e0: 73 74 65 70 73 20 0a 20 20 20 20 20 20 20 20 20 steps .
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1100: 20 20 20 20 20 28 69 64 20 49 4e 54 45 47 45 52 (id INTEGER
1110: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 PRIMARY KEY,.
1120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1130: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 tes
1140: 74 5f 69 64 20 49 4e 54 45 47 45 52 2c 20 0a 20 t_id INTEGER, .
1150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 st
1170: 65 70 6e 61 6d 65 20 54 45 58 54 2c 20 0a 20 20 epname TEXT, .
1180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1190: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61 sta
11a0: 74 65 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 te TEXT DEFAULT
11b0: 27 4e 4f 54 5f 53 54 41 52 54 45 44 27 2c 20 0a 'NOT_STARTED', .
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 s
11e0: 74 61 74 75 73 20 54 45 58 54 20 44 45 46 41 55 tatus TEXT DEFAU
11f0: 4c 54 20 27 6e 2f 61 27 2c 0a 20 20 20 20 20 20 LT 'n/a',.
1200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1210: 20 20 20 20 20 20 20 20 20 65 76 65 6e 74 5f 74 event_t
1220: 69 6d 65 20 54 49 4d 45 53 54 41 4d 50 2c 0a 20 ime TIMESTAMP,.
1230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f co
1250: 6d 6d 65 6e 74 20 54 45 58 54 20 44 45 46 41 55 mment TEXT DEFAU
1260: 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 LT '',.
1270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1280: 20 20 20 20 20 20 6c 6f 67 66 69 6c 65 20 54 45 logfile TE
1290: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 XT DEFAULT '',.
12a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 4f CO
12c0: 4e 53 54 52 41 49 4e 54 20 74 65 73 74 5f 73 74 NSTRAINT test_st
12d0: 65 70 73 5f 63 6f 6e 73 74 72 61 69 6e 74 20 55 eps_constraint U
12e0: 4e 49 51 55 45 20 28 74 65 73 74 5f 69 64 2c 73 NIQUE (test_id,s
12f0: 74 65 70 6e 61 6d 65 2c 73 74 61 74 65 29 29 3b tepname,state));
1300: 22 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65 ").. (sqlite3:e
1310: 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 54 xecute db "CREAT
1320: 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 E TABLE IF NOT E
1330: 58 49 53 54 53 20 65 78 74 72 61 64 61 74 20 28 XISTS extradat (
1340: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 id INTEGER PRIMA
1350: 52 59 20 4b 45 59 2c 20 72 75 6e 5f 69 64 20 49 RY KEY, run_id I
1360: 4e 54 45 47 45 52 2c 20 6b 65 79 20 54 45 58 54 NTEGER, key TEXT
1370: 2c 20 76 61 6c 20 54 45 58 54 29 3b 22 29 0a 09 , val TEXT);")..
1380: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 (sqlite3:execu
1390: 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41 te db "CREATE TA
13a0: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 BLE IF NOT EXIST
13b0: 53 20 6d 65 74 61 64 61 74 20 28 69 64 20 49 4e S metadat (id IN
13c0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE
13d0: 59 2c 20 76 61 72 20 54 45 58 54 2c 20 76 61 6c Y, var TEXT, val
13e0: 20 54 45 58 54 2c 0a 20 20 20 20 20 20 20 20 20 TEXT,.
13f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1400: 20 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52 41 CONSTRA
1410: 49 4e 54 20 6d 65 74 61 64 61 74 5f 63 6f 6e 73 INT metadat_cons
1420: 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28 76 traint UNIQUE (v
1430: 61 72 29 29 3b 22 29 0a 09 20 20 28 73 71 6c 69 ar));").. (sqli
1440: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 te3:execute db "
1450: 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 CREATE TABLE IF
1460: 4e 4f 54 20 45 58 49 53 54 53 20 61 63 63 65 73 NOT EXISTS acces
1470: 73 5f 6c 6f 67 20 28 69 64 20 49 4e 54 45 47 45 s_log (id INTEGE
1480: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 75 R PRIMARY KEY, u
1490: 73 65 72 20 54 45 58 54 2c 20 61 63 63 65 73 73 ser TEXT, access
14a0: 65 64 20 54 49 4d 45 53 54 41 4d 50 2c 20 61 72 ed TIMESTAMP, ar
14b0: 67 73 20 54 45 58 54 29 3b 22 29 0a 09 20 20 28 gs TEXT);").. (
14c0: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 sqlite3:execute
14d0: 64 62 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 db "CREATE TABLE
14e0: 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 74 IF NOT EXISTS t
14f0: 65 73 74 5f 6d 65 74 61 20 28 69 64 20 49 4e 54 est_meta (id INT
1500: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY
1510: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
1520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1530: 20 20 20 20 20 20 20 74 65 73 74 6e 61 6d 65 20 testname
1540: 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 TEXT DEFAULT
1550: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 '',.
1560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1570: 20 20 20 20 20 20 20 20 20 61 75 74 68 6f 72 20 author
1580: 20 20 20 20 20 54 45 58 54 20 44 45 46 41 55 4c TEXT DEFAUL
1590: 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 T '',.
15a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15b0: 20 20 20 20 20 20 20 20 20 20 20 6f 77 6e 65 72 owner
15c0: 20 20 20 20 20 20 20 54 45 58 54 20 44 45 46 41 TEXT DEFA
15d0: 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 ULT '',.
15e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65 73 des
1600: 63 72 69 70 74 69 6f 6e 20 54 45 58 54 20 44 45 cription TEXT DE
1610: 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 FAULT '',.
1620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 r
1640: 65 76 69 65 77 65 64 20 20 20 20 54 49 4d 45 53 eviewed TIMES
1650: 54 41 4d 50 2c 0a 20 20 20 20 20 20 20 20 20 20 TAMP,.
1660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1670: 20 20 20 20 20 20 20 20 20 20 20 69 74 65 72 61 itera
1680: 74 65 64 20 20 20 20 54 45 58 54 20 44 45 46 41 ted TEXT DEFA
1690: 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 ULT '',.
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 76 67 avg
16c0: 5f 72 75 6e 74 69 6d 65 20 52 45 41 4c 2c 0a 20 _runtime REAL,.
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16f0: 20 20 20 20 61 76 67 5f 64 69 73 6b 20 20 20 20 avg_disk
1700: 52 45 41 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 REAL,.
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1720: 20 20 20 20 20 20 20 20 20 20 20 74 61 67 73 20 tags
1730: 20 20 20 20 20 20 20 54 45 58 54 20 44 45 46 41 TEXT DEFA
1740: 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 ULT '',.
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f 62 job
1770: 67 72 6f 75 70 20 20 20 20 54 45 58 54 20 44 45 group TEXT DE
1780: 46 41 55 4c 54 20 27 64 65 66 61 75 6c 74 27 2c FAULT 'default',
1790: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17b0: 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 65 73 74 CONSTRAINT test
17c0: 5f 6d 65 74 61 5f 63 6f 6e 73 74 72 61 69 6e 74 _meta_constraint
17d0: 20 55 4e 49 51 55 45 20 28 74 65 73 74 6e 61 6d UNIQUE (testnam
17e0: 65 29 29 3b 22 29 0a 09 20 20 28 73 71 6c 69 74 e));").. (sqlit
17f0: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 43 e3:execute db "C
1800: 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e REATE TABLE IF N
1810: 4f 54 20 45 58 49 53 54 53 20 74 65 73 74 5f 64 OT EXISTS test_d
1820: 61 74 61 20 28 69 64 20 49 4e 54 45 47 45 52 20 ata (id INTEGER
1830: 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 PRIMARY KEY,.
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 74 65 73 tes
1860: 74 5f 69 64 20 49 4e 54 45 47 45 52 2c 0a 20 20 t_id INTEGER,.
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 20 20 20 20 20 20 63 61 ca
1890: 74 65 67 6f 72 79 20 54 45 58 54 20 44 45 46 41 tegory TEXT DEFA
18a0: 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 ULT '',.
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
18c0: 20 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65 variable
18d0: 20 54 45 58 54 2c 0a 09 20 20 20 20 20 20 20 20 TEXT,..
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
18f0: 76 61 6c 75 65 20 52 45 41 4c 2c 0a 09 20 20 20 value REAL,..
1900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1910: 20 20 20 20 20 65 78 70 65 63 74 65 64 20 52 45 expected RE
1920: 41 4c 2c 0a 09 20 20 20 20 20 20 20 20 20 20 20 AL,..
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6f 6c tol
1940: 20 52 45 41 4c 2c 0a 20 20 20 20 20 20 20 20 20 REAL,.
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1960: 20 20 20 20 20 20 20 75 6e 69 74 73 20 54 45 58 units TEX
1970: 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 T,.
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1990: 20 20 20 63 6f 6d 6d 65 6e 74 20 54 45 58 54 20 comment TEXT
19a0: 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 DEFAULT '',.
19b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 stat
19d0: 75 73 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 us TEXT DEFAULT
19e0: 27 6e 2f 61 27 2c 0a 20 20 20 20 20 20 20 20 20 'n/a',.
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a00: 20 20 20 20 20 20 20 74 79 70 65 20 54 45 58 54 type TEXT
1a10: 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 DEFAULT '',.
1a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a30: 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e 53 54 CONST
1a40: 52 41 49 4e 54 20 74 65 73 74 5f 64 61 74 61 5f RAINT test_data_
1a50: 63 6f 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 55 constraint UNIQU
1a60: 45 20 28 74 65 73 74 5f 69 64 2c 63 61 74 65 67 E (test_id,categ
1a70: 6f 72 79 2c 76 61 72 69 61 62 6c 65 29 29 3b 22 ory,variable));"
1a80: 29 0a 09 20 20 3b 3b 20 4d 75 73 74 20 64 6f 20 ).. ;; Must do
1a90: 74 68 69 73 20 2a 61 66 74 65 72 2a 20 72 75 6e this *after* run
1aa0: 6e 69 6e 67 20 70 61 74 63 68 20 64 62 20 21 21 ning patch db !!
1ab0: 20 4e 6f 20 6d 6f 72 65 2e 20 0a 09 20 20 28 64 No more. .. (d
1ac0: 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 b:set-var db "ME
1ad0: 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 GATEST_VERSION"
1ae0: 6d 65 67 61 74 65 73 74 2d 76 65 72 73 69 6f 6e megatest-version
1af0: 29 0a 09 20 20 29 29 0a 20 20 20 20 64 62 29 29 ).. )). db))
1b00: 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ..;;============
1b10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1b20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1b30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1b40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 54 4f ==========.;; TO
1b50: 44 4f 3a 0a 3b 3b 20 20 20 70 75 74 20 64 65 6c DO:.;; put del
1b60: 74 61 73 20 69 6e 74 6f 20 61 6e 20 61 73 73 6f tas into an asso
1b70: 63 20 6c 69 73 74 20 77 69 74 68 20 76 65 72 73 c list with vers
1b80: 69 6f 6e 20 6e 75 6d 62 65 72 73 0a 3b 3b 20 20 ion numbers.;;
1b90: 20 61 70 70 6c 79 20 61 6c 6c 20 66 72 6f 6d 20 apply all from
1ba0: 6c 61 73 74 20 74 6f 20 63 75 72 72 65 6e 74 0a last to current.
1bb0: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ;;==============
1bc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1bd0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1be0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1bf0: 3d 3d 3d 3d 3d 3d 3d 3d 0a 28 64 65 66 69 6e 65 ========.(define
1c00: 20 28 70 61 74 63 68 2d 64 62 20 64 62 29 0a 20 (patch-db db).
1c10: 20 28 68 61 6e 64 6c 65 2d 65 78 63 65 70 74 69 (handle-excepti
1c20: 6f 6e 73 0a 20 20 20 65 78 6e 0a 20 20 20 28 62 ons. exn. (b
1c30: 65 67 69 6e 0a 20 20 20 20 20 28 70 72 69 6e 74 egin. (print
1c40: 20 22 45 78 63 65 70 74 69 6f 6e 3a 20 22 20 65 "Exception: " e
1c50: 78 6e 29 0a 20 20 20 20 20 28 70 72 69 6e 74 20 xn). (print
1c60: 22 45 52 52 4f 52 3a 20 50 6f 73 73 69 62 6c 65 "ERROR: Possible
1c70: 20 6f 75 74 20 6f 66 20 64 61 74 65 20 73 63 68 out of date sch
1c80: 65 6d 61 2c 20 61 74 74 65 6d 70 74 69 6e 67 20 ema, attempting
1c90: 74 6f 20 61 64 64 20 74 61 62 6c 65 20 6d 65 74 to add table met
1ca0: 61 64 61 74 61 2e 2e 2e 22 29 0a 20 20 20 20 20 adata...").
1cb0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 (sqlite3:execute
1cc0: 20 64 62 20 22 43 52 45 41 54 45 20 54 41 42 4c db "CREATE TABL
1cd0: 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 E IF NOT EXISTS
1ce0: 6d 65 74 61 64 61 74 20 28 69 64 20 49 4e 54 45 metadat (id INTE
1cf0: 47 45 52 2c 20 76 61 72 20 54 45 58 54 2c 20 76 GER, var TEXT, v
1d00: 61 6c 20 54 45 58 54 2c 0a 20 20 20 20 20 20 20 al TEXT,.
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1d20: 20 20 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52 CONSTR
1d30: 41 49 4e 54 20 6d 65 74 61 64 61 74 5f 63 6f 6e AINT metadat_con
1d40: 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28 straint UNIQUE (
1d50: 76 61 72 29 29 3b 22 29 0a 20 20 20 20 20 28 69 var));"). (i
1d60: 66 20 28 6e 6f 74 20 28 64 62 3a 67 65 74 2d 76 f (not (db:get-v
1d70: 61 72 20 64 62 20 22 4d 45 47 41 54 45 53 54 5f ar db "MEGATEST_
1d80: 56 45 52 53 49 4f 4e 22 29 29 0a 09 20 28 64 62 VERSION")).. (db
1d90: 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47 :set-var db "MEG
1da0: 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 31 ATEST_VERSION" 1
1db0: 2e 31 37 29 29 29 0a 20 20 20 28 6c 65 74 20 28 .17))). (let (
1dc0: 28 6d 76 65 72 20 28 64 62 3a 67 65 74 2d 76 61 (mver (db:get-va
1dd0: 72 20 64 62 20 22 4d 45 47 41 54 45 53 54 5f 56 r db "MEGATEST_V
1de0: 45 52 53 49 4f 4e 22 29 29 0a 09 20 28 74 65 73 ERSION")).. (tes
1df0: 74 2d 6d 65 74 61 2d 64 65 66 20 22 43 52 45 41 t-meta-def "CREA
1e00: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 TE TABLE IF NOT
1e10: 45 58 49 53 54 53 20 74 65 73 74 5f 6d 65 74 61 EXISTS test_meta
1e20: 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 (id INTEGER PRI
1e30: 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 20 MARY KEY,.
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 t
1e60: 65 73 74 6e 61 6d 65 20 20 20 20 54 45 58 54 20 estname TEXT
1e70: 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 DEFAULT '',.
1e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ea0: 20 61 75 74 68 6f 72 20 20 20 20 20 20 54 45 58 author TEX
1eb0: 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 T DEFAULT '',.
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ee0: 20 20 20 6f 77 6e 65 72 20 20 20 20 20 20 20 54 owner T
1ef0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a EXT DEFAULT '',.
1f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1f20: 20 20 20 20 20 64 65 73 63 72 69 70 74 69 6f 6e description
1f30: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 TEXT DEFAULT ''
1f40: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1f60: 20 20 20 20 20 20 20 72 65 76 69 65 77 65 64 20 reviewed
1f70: 20 20 20 54 49 4d 45 53 54 41 4d 50 2c 0a 20 20 TIMESTAMP,.
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1fa0: 20 20 20 69 74 65 72 61 74 65 64 20 20 20 20 54 iterated T
1fb0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a EXT DEFAULT '',.
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1fe0: 20 20 20 20 20 61 76 67 5f 72 75 6e 74 69 6d 65 avg_runtime
1ff0: 20 52 45 41 4c 2c 0a 20 20 20 20 20 20 20 20 20 REAL,.
2000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2010: 20 20 20 20 20 20 20 20 20 20 20 20 61 76 67 5f avg_
2020: 64 69 73 6b 20 20 20 20 52 45 41 4c 2c 0a 20 20 disk REAL,.
2030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2050: 20 20 20 74 61 67 73 20 20 20 20 20 20 20 20 54 tags T
2060: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a EXT DEFAULT '',.
2070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2090: 43 4f 4e 53 54 52 41 49 4e 54 20 74 65 73 74 5f CONSTRAINT test_
20a0: 6d 65 74 61 5f 63 6f 6e 73 74 72 61 69 6e 74 20 meta_constraint
20b0: 55 4e 49 51 55 45 20 28 74 65 73 74 6e 61 6d 65 UNIQUE (testname
20c0: 29 29 3b 22 29 29 0a 20 20 20 20 20 28 70 72 69 ));")). (pri
20d0: 6e 74 20 22 43 75 72 72 65 6e 74 20 73 63 68 65 nt "Current sche
20e0: 6d 61 20 76 65 72 73 69 6f 6e 3a 20 22 20 6d 76 ma version: " mv
20f0: 65 72 20 22 20 63 75 72 72 65 6e 74 20 6d 65 67 er " current meg
2100: 61 74 65 73 74 20 76 65 72 73 69 6f 6e 3a 20 22 atest version: "
2110: 20 6d 65 67 61 74 65 73 74 2d 76 65 72 73 69 6f megatest-versio
2120: 6e 29 0a 20 20 20 20 20 28 63 6f 6e 64 0a 20 20 n). (cond.
2130: 20 20 20 20 28 28 6e 6f 74 20 6d 76 65 72 29 0a ((not mver).
2140: 20 20 20 20 20 20 20 28 70 72 69 6e 74 20 22 41 (print "A
2150: 64 64 69 6e 67 20 6d 65 67 61 74 65 73 74 2d 76 dding megatest-v
2160: 65 72 73 69 6f 6e 20 74 6f 20 6d 65 74 61 64 61 ersion to metada
2170: 74 61 22 29 20 3b 3b 20 4e 65 65 64 20 74 6f 20 ta") ;; Need to
2180: 72 65 63 72 65 61 74 65 20 74 68 65 20 74 61 62 recreate the tab
2190: 6c 65 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 le. (sqlit
21a0: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 44 e3:execute db "D
21b0: 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 ROP TABLE IF EXI
21c0: 53 54 53 20 6d 65 74 61 64 61 74 3b 22 29 0a 20 STS metadat;").
21d0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 (sqlite3:e
21e0: 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 54 xecute db "CREAT
21f0: 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 E TABLE IF NOT E
2200: 58 49 53 54 53 20 6d 65 74 61 64 61 74 20 28 69 XISTS metadat (i
2210: 64 20 49 4e 54 45 47 45 52 2c 20 76 61 72 20 54 d INTEGER, var T
2220: 45 58 54 2c 20 76 61 6c 20 54 45 58 54 2c 0a 20 EXT, val TEXT,.
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2250: 20 43 4f 4e 53 54 52 41 49 4e 54 20 6d 65 74 61 CONSTRAINT meta
2260: 64 61 74 5f 63 6f 6e 73 74 72 61 69 6e 74 20 55 dat_constraint U
2270: 4e 49 51 55 45 20 28 76 61 72 29 29 3b 22 29 0a NIQUE (var));").
2280: 20 20 20 20 20 20 20 28 64 62 3a 73 65 74 2d 76 (db:set-v
2290: 61 72 20 64 62 20 22 4d 45 47 41 54 45 53 54 5f ar db "MEGATEST_
22a0: 56 45 52 53 49 4f 4e 22 20 31 2e 31 37 29 0a 20 VERSION" 1.17).
22b0: 20 20 20 20 20 20 28 70 61 74 63 68 2d 64 62 29 (patch-db)
22c0: 29 0a 20 20 20 20 20 20 28 28 3c 20 6d 76 65 72 ). ((< mver
22d0: 20 31 2e 32 31 29 0a 20 20 20 20 20 20 20 28 73 1.21). (s
22e0: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 qlite3:execute d
22f0: 62 20 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46 b "DROP TABLE IF
2300: 20 45 58 49 53 54 53 20 6d 65 74 61 64 61 74 3b EXISTS metadat;
2310: 22 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 "). (sqlit
2320: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 43 e3:execute db "C
2330: 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e REATE TABLE IF N
2340: 4f 54 20 45 58 49 53 54 53 20 6d 65 74 61 64 61 OT EXISTS metada
2350: 74 20 28 69 64 20 49 4e 54 45 47 45 52 2c 20 76 t (id INTEGER, v
2360: 61 72 20 54 45 58 54 2c 20 76 61 6c 20 54 45 58 ar TEXT, val TEX
2370: 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 T,.
2380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2390: 20 20 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 CONSTRAINT
23a0: 6d 65 74 61 64 61 74 5f 63 6f 6e 73 74 72 61 69 metadat_constrai
23b0: 6e 74 20 55 4e 49 51 55 45 20 28 76 61 72 29 29 nt UNIQUE (var))
23c0: 3b 22 29 0a 20 20 20 20 20 20 20 28 64 62 3a 73 ;"). (db:s
23d0: 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 et-var db "MEGAT
23e0: 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e 32 EST_VERSION" 1.2
23f0: 31 29 20 3b 3b 20 73 65 74 20 62 65 66 6f 72 65 1) ;; set before
2400: 2c 20 6a 75 73 74 20 69 6e 20 63 61 73 65 20 74 , just in case t
2410: 68 65 20 63 68 61 6e 67 65 73 20 61 72 65 20 61 he changes are a
2420: 6c 72 65 61 64 79 20 61 70 70 6c 69 65 64 0a 20 lready applied.
2430: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 (sqlite3:e
2440: 78 65 63 75 74 65 20 64 62 20 74 65 73 74 2d 6d xecute db test-m
2450: 65 74 61 2d 64 65 66 29 0a 09 09 09 09 09 3b 28 eta-def)......;(
2460: 66 6f 72 2d 65 61 63 68 20 0a 09 09 09 09 09 3b for-each ......;
2470: 20 28 6c 61 6d 62 64 61 20 28 73 74 6d 74 29 0a (lambda (stmt).
2480: 09 09 09 09 09 3b 20 20 20 28 73 71 6c 69 74 65 .....; (sqlite
2490: 33 3a 65 78 65 63 75 74 65 20 64 62 20 73 74 6d 3:execute db stm
24a0: 74 29 29 0a 09 09 09 09 09 3b 20 28 6c 69 73 74 t))......; (list
24b0: 20 0a 09 09 09 09 09 3b 20 20 22 41 4c 54 45 52 ......; "ALTER
24c0: 20 54 41 42 4c 45 20 74 65 73 74 73 20 41 44 44 TABLE tests ADD
24d0: 20 43 4f 4c 55 4d 4e 20 66 69 72 73 74 5f 65 72 COLUMN first_er
24e0: 72 20 54 45 58 54 3b 22 0a 09 09 09 09 09 3b 20 r TEXT;"......;
24f0: 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 74 65 "ALTER TABLE te
2500: 73 74 73 20 41 44 44 20 43 4f 4c 55 4d 4e 20 66 sts ADD COLUMN f
2510: 69 72 73 74 5f 77 61 72 6e 20 54 45 58 54 3b 22 irst_warn TEXT;"
2520: 0a 09 09 09 09 09 3b 20 20 29 29 0a 20 20 20 20 ......; )).
2530: 20 20 20 28 70 61 74 63 68 2d 64 62 29 29 0a 20 (patch-db)).
2540: 20 20 20 20 20 28 28 3c 20 6d 76 65 72 20 31 2e ((< mver 1.
2550: 32 34 29 0a 20 20 20 20 20 20 20 28 64 62 3a 73 24). (db:s
2560: 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 et-var db "MEGAT
2570: 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e 32 EST_VERSION" 1.2
2580: 34 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 4). (sqlit
2590: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 44 e3:execute db "D
25a0: 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 ROP TABLE IF EXI
25b0: 53 54 53 20 74 65 73 74 5f 64 61 74 61 3b 22 29 STS test_data;")
25c0: 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 . (sqlite3
25d0: 3a 65 78 65 63 75 74 65 20 64 62 20 22 44 52 4f :execute db "DRO
25e0: 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 P TABLE IF EXIST
25f0: 53 20 74 65 73 74 5f 6d 65 74 61 3b 22 29 0a 20 S test_meta;").
2600: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 (sqlite3:e
2610: 78 65 63 75 74 65 20 64 62 20 74 65 73 74 2d 6d xecute db test-m
2620: 65 74 61 2d 64 65 66 29 0a 20 20 20 20 20 20 20 eta-def).
2630: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 (sqlite3:execute
2640: 20 64 62 20 22 43 52 45 41 54 45 20 54 41 42 4c db "CREATE TABL
2650: 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 E IF NOT EXISTS
2660: 74 65 73 74 5f 64 61 74 61 20 28 69 64 20 49 4e test_data (id IN
2670: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE
2680: 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 Y,.
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
26a0: 20 20 20 74 65 73 74 5f 69 64 20 49 4e 54 45 47 test_id INTEG
26b0: 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 ER,.
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
26d0: 20 20 20 20 63 61 74 65 67 6f 72 79 20 54 45 58 category TEX
26e0: 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 T DEFAULT '',.
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76 61 va
2710: 72 69 61 62 6c 65 20 54 45 58 54 2c 0a 09 20 20 riable TEXT,..
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2730: 20 20 20 20 20 20 76 61 6c 75 65 20 52 45 41 4c value REAL
2740: 2c 0a 09 20 20 20 20 20 20 20 20 20 20 20 20 20 ,..
2750: 20 20 20 20 20 20 20 20 20 20 20 65 78 70 65 63 expec
2760: 74 65 64 20 52 45 41 4c 2c 0a 09 20 20 20 20 20 ted REAL,..
2770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2780: 20 20 20 74 6f 6c 20 52 45 41 4c 2c 0a 20 20 20 tol REAL,.
2790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
27a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 69 uni
27b0: 74 73 20 54 45 58 54 2c 0a 20 20 20 20 20 20 20 ts TEXT,.
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
27d0: 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 65 6e 74 comment
27e0: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 TEXT DEFAULT ''
27f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2810: 20 20 73 74 61 74 75 73 20 54 45 58 54 20 44 45 status TEXT DE
2820: 46 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20 20 20 FAULT 'n/a',.
2830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2840: 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e 53 54 CONST
2850: 52 41 49 4e 54 20 74 65 73 74 5f 64 61 74 61 20 RAINT test_data
2860: 55 4e 49 51 55 45 20 28 74 65 73 74 5f 69 64 2c UNIQUE (test_id,
2870: 63 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62 6c category,variabl
2880: 65 29 29 3b 22 29 0a 20 20 20 20 20 20 20 28 70 e));"). (p
2890: 72 69 6e 74 20 22 57 41 52 4e 49 4e 47 3a 20 54 rint "WARNING: T
28a0: 61 62 6c 65 20 74 65 73 74 5f 64 61 74 61 20 61 able test_data a
28b0: 6e 64 20 74 65 73 74 5f 6d 65 74 61 20 77 68 65 nd test_meta whe
28c0: 72 65 20 72 65 63 72 65 61 74 65 64 2e 20 50 6c re recreated. Pl
28d0: 65 61 73 65 20 64 6f 20 6d 65 67 61 74 65 73 74 ease do megatest
28e0: 20 2d 75 70 64 61 74 65 2d 6d 65 74 61 22 29 0a -update-meta").
28f0: 20 20 20 20 20 20 20 28 70 61 74 63 68 2d 64 62 (patch-db
2900: 29 29 0a 20 20 20 20 20 20 28 28 3c 20 6d 76 65 )). ((< mve
2910: 72 20 31 2e 32 37 29 0a 20 20 20 20 20 20 20 28 r 1.27). (
2920: 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d db:set-var db "M
2930: 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 EGATEST_VERSION"
2940: 20 31 2e 32 37 29 0a 20 20 20 20 20 20 20 28 73 1.27). (s
2950: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 qlite3:execute d
2960: 62 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 74 b "ALTER TABLE t
2970: 65 73 74 5f 64 61 74 61 20 41 44 44 20 43 4f 4c est_data ADD COL
2980: 55 4d 4e 20 74 79 70 65 20 54 45 58 54 20 44 45 UMN type TEXT DE
2990: 46 41 55 4c 54 20 27 27 3b 22 29 0a 20 20 20 20 FAULT '';").
29a0: 20 20 20 28 70 61 74 63 68 2d 64 62 29 29 0a 20 (patch-db)).
29b0: 20 20 20 20 20 28 28 3c 20 6d 76 65 72 20 31 2e ((< mver 1.
29c0: 32 39 29 0a 20 20 20 20 20 20 20 28 64 62 3a 73 29). (db:s
29d0: 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 et-var db "MEGAT
29e0: 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e 32 EST_VERSION" 1.2
29f0: 39 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 9). (sqlit
2a00: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 41 e3:execute db "A
2a10: 4c 54 45 52 20 54 41 42 4c 45 20 74 65 73 74 5f LTER TABLE test_
2a20: 73 74 65 70 73 20 41 44 44 20 43 4f 4c 55 4d 4e steps ADD COLUMN
2a30: 20 6c 6f 67 66 69 6c 65 20 54 45 58 54 20 44 45 logfile TEXT DE
2a40: 46 41 55 4c 54 20 27 27 3b 22 29 0a 20 20 20 20 FAULT '';").
2a50: 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 (sqlite3:exec
2a60: 75 74 65 20 64 62 20 22 41 4c 54 45 52 20 54 41 ute db "ALTER TA
2a70: 42 4c 45 20 74 65 73 74 73 20 41 44 44 20 43 4f BLE tests ADD CO
2a80: 4c 55 4d 4e 20 73 68 6f 72 74 64 69 72 20 54 45 LUMN shortdir TE
2a90: 58 54 20 44 45 46 41 55 4c 54 20 27 27 3b 22 29 XT DEFAULT '';")
2aa0: 29 0a 20 20 20 20 20 20 28 28 3c 20 6d 76 65 72 ). ((< mver
2ab0: 20 31 2e 33 36 29 0a 20 20 20 20 20 20 20 28 64 1.36). (d
2ac0: 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 b:set-var db "ME
2ad0: 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 GATEST_VERSION"
2ae0: 31 2e 33 36 29 0a 20 20 20 20 20 20 20 28 73 71 1.36). (sq
2af0: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 lite3:execute db
2b00: 20 22 41 4c 54 45 52 20 54 41 42 4c 45 52 20 74 "ALTER TABLER t
2b10: 65 73 74 5f 6d 65 74 61 20 41 44 44 20 43 4f 4c est_meta ADD COL
2b20: 55 4d 4e 20 6a 6f 62 67 72 6f 75 70 20 54 45 58 UMN jobgroup TEX
2b30: 54 20 44 45 46 41 55 4c 54 20 27 64 65 66 61 75 T DEFAULT 'defau
2b40: 6c 74 27 3b 22 29 29 0a 20 20 20 20 20 20 28 28 lt';")). ((
2b50: 3c 20 6d 76 65 72 20 6d 65 67 61 74 65 73 74 2d < mver megatest-
2b60: 76 65 72 73 69 6f 6e 29 0a 20 20 20 20 20 20 20 version).
2b70: 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22 (db:set-var db "
2b80: 4d 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e MEGATEST_VERSION
2b90: 22 20 6d 65 67 61 74 65 73 74 2d 76 65 72 73 69 " megatest-versi
2ba0: 6f 6e 29 29 29 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d on))))))..;;====
2bb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2bc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2bd0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2be0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2bf0: 3d 3d 0a 3b 3b 20 6d 65 74 61 20 67 65 74 20 61 ==.;; meta get a
2c00: 6e 64 20 73 65 74 20 76 61 72 73 0a 3b 3b 3d 3d nd set vars.;;==
2c10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2c20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2c30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2c40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2c50: 3d 3d 3d 3d 0a 0a 3b 3b 20 72 65 74 75 72 6e 73 ====..;; returns
2c60: 20 6e 75 6d 62 65 72 20 69 66 20 73 74 72 69 6e number if strin
2c70: 67 2d 3e 6e 75 6d 62 65 72 20 69 73 20 73 75 63 g->number is suc
2c80: 63 65 73 73 66 75 6c 2c 20 73 74 72 69 6e 67 20 cessful, string
2c90: 6f 74 68 65 72 77 69 73 65 0a 28 64 65 66 69 6e otherwise.(defin
2ca0: 65 20 28 64 62 3a 67 65 74 2d 76 61 72 20 64 62 e (db:get-var db
2cb0: 20 76 61 72 29 0a 20 20 28 6c 65 74 20 28 28 72 var). (let ((r
2cc0: 65 73 20 23 66 29 29 0a 20 20 20 20 28 73 71 6c es #f)). (sql
2cd0: 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f ite3:for-each-ro
2ce0: 77 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 w. (lambda (
2cf0: 76 61 6c 29 0a 20 20 20 20 20 20 20 28 73 65 74 val). (set
2d00: 21 20 72 65 73 20 76 61 6c 29 29 0a 20 20 20 20 ! res val)).
2d10: 20 64 62 20 22 53 45 4c 45 43 54 20 76 61 6c 20 db "SELECT val
2d20: 46 52 4f 4d 20 6d 65 74 61 64 61 74 20 57 48 45 FROM metadat WHE
2d30: 52 45 20 76 61 72 3d 3f 3b 22 20 76 61 72 29 0a RE var=?;" var).
2d40: 20 20 20 20 28 69 66 20 28 73 74 72 69 6e 67 3f (if (string?
2d50: 20 72 65 73 29 0a 09 28 6c 65 74 20 28 28 76 61 res)..(let ((va
2d60: 6c 6e 75 6d 20 28 73 74 72 69 6e 67 2d 3e 6e 75 lnum (string->nu
2d70: 6d 62 65 72 20 72 65 73 29 29 29 0a 09 20 20 28 mber res))).. (
2d80: 69 66 20 76 61 6c 6e 75 6d 20 76 61 6c 6e 75 6d if valnum valnum
2d90: 20 72 65 73 29 29 0a 09 72 65 73 29 29 29 0a 0a res))..res)))..
2da0: 28 64 65 66 69 6e 65 20 28 64 62 3a 73 65 74 2d (define (db:set-
2db0: 76 61 72 20 64 62 20 76 61 72 20 76 61 6c 29 0a var db var val).
2dc0: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 (sqlite3:execu
2dd0: 74 65 20 64 62 20 22 49 4e 53 45 52 54 20 4f 52 te db "INSERT OR
2de0: 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 6d 65 REPLACE INTO me
2df0: 74 61 64 61 74 20 28 76 61 72 2c 76 61 6c 29 20 tadat (var,val)
2e00: 56 41 4c 55 45 53 20 28 3f 2c 3f 29 3b 22 20 76 VALUES (?,?);" v
2e10: 61 72 20 76 61 6c 29 29 0a 0a 3b 3b 20 75 73 65 ar val))..;; use
2e20: 20 61 20 67 6c 6f 62 61 6c 20 66 6f 72 20 73 6f a global for so
2e30: 6d 65 20 70 72 69 6d 69 74 69 76 65 20 63 61 63 me primitive cac
2e40: 68 69 6e 67 2c 20 69 74 20 69 73 20 6a 75 73 74 hing, it is just
2e50: 20 73 69 6c 6c 79 20 74 6f 20 72 65 2d 72 65 61 silly to re-rea
2e60: 64 20 74 68 65 20 64 62 20 0a 3b 3b 20 6f 76 65 d the db .;; ove
2e70: 72 20 61 6e 64 20 6f 76 65 72 20 61 67 61 69 6e r and over again
2e80: 20 66 6f 72 20 74 68 65 20 6b 65 79 73 20 73 69 for the keys si
2e90: 6e 63 65 20 74 68 65 79 20 6e 65 76 65 72 20 63 nce they never c
2ea0: 68 61 6e 67 65 0a 0a 28 64 65 66 69 6e 65 20 2a hange..(define *
2eb0: 64 62 2d 6b 65 79 73 2a 20 23 66 29 0a 0a 28 64 db-keys* #f)..(d
2ec0: 65 66 69 6e 65 20 28 64 62 2d 67 65 74 2d 6b 65 efine (db-get-ke
2ed0: 79 73 20 64 62 29 0a 20 20 28 69 66 20 2a 64 62 ys db). (if *db
2ee0: 2d 6b 65 79 73 2a 20 2a 64 62 2d 6b 65 79 73 2a -keys* *db-keys*
2ef0: 20 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28 72 . (let ((r
2f00: 65 73 20 27 28 29 29 29 0a 09 28 73 71 6c 69 74 es '()))..(sqlit
2f10: 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 e3:for-each-row
2f20: 0a 09 20 28 6c 61 6d 62 64 61 20 28 6b 65 79 20 .. (lambda (key
2f30: 6b 65 79 74 79 70 65 29 0a 09 20 20 20 28 73 65 keytype).. (se
2f40: 74 21 20 72 65 73 20 28 63 6f 6e 73 20 28 76 65 t! res (cons (ve
2f50: 63 74 6f 72 20 6b 65 79 20 6b 65 79 74 79 70 65 ctor key keytype
2f60: 29 20 72 65 73 29 29 29 0a 09 20 64 62 0a 09 20 ) res))).. db..
2f70: 22 53 45 4c 45 43 54 20 66 69 65 6c 64 6e 61 6d "SELECT fieldnam
2f80: 65 2c 66 69 65 6c 64 74 79 70 65 20 46 52 4f 4d e,fieldtype FROM
2f90: 20 6b 65 79 73 20 4f 52 44 45 52 20 42 59 20 69 keys ORDER BY i
2fa0: 64 20 44 45 53 43 3b 22 29 0a 09 28 73 65 74 21 d DESC;")..(set!
2fb0: 20 2a 64 62 2d 6b 65 79 73 2a 20 72 65 73 29 0a *db-keys* res).
2fc0: 09 72 65 73 29 29 29 0a 0a 28 64 65 66 69 6e 65 .res)))..(define
2fd0: 20 64 62 3a 67 65 74 2d 6b 65 79 73 20 64 62 2d db:get-keys db-
2fe0: 67 65 74 2d 6b 65 79 73 29 0a 0a 28 64 65 66 69 get-keys)..(defi
2ff0: 6e 65 20 28 64 62 3a 67 65 74 2d 76 61 6c 75 65 ne (db:get-value
3000: 2d 62 79 2d 68 65 61 64 65 72 20 72 6f 77 20 68 -by-header row h
3010: 65 61 64 65 72 20 66 69 65 6c 64 29 0a 20 20 3b eader field). ;
3020: 3b 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 32 ; (debug:print 2
3030: 20 22 64 62 3a 67 65 74 2d 76 61 6c 75 65 2d 62 "db:get-value-b
3040: 79 2d 68 65 61 64 65 72 20 72 6f 77 3a 20 22 20 y-header row: "
3050: 72 6f 77 20 22 20 68 65 61 64 65 72 3a 20 22 20 row " header: "
3060: 68 65 61 64 65 72 20 22 20 66 69 65 6c 64 3a 20 header " field:
3070: 22 20 66 69 65 6c 64 29 0a 20 20 28 69 66 20 28 " field). (if (
3080: 6e 75 6c 6c 3f 20 68 65 61 64 65 72 29 20 23 66 null? header) #f
3090: 0a 20 20 20 20 20 20 28 6c 65 74 20 6c 6f 6f 70 . (let loop
30a0: 20 28 28 68 65 64 20 28 63 61 72 20 68 65 61 64 ((hed (car head
30b0: 65 72 29 29 0a 09 09 20 28 74 61 6c 20 28 63 64 er))... (tal (cd
30c0: 72 20 68 65 61 64 65 72 29 29 0a 09 09 20 28 6e r header))... (n
30d0: 20 20 20 30 29 29 0a 09 28 69 66 20 28 65 71 75 0))..(if (equ
30e0: 61 6c 3f 20 68 65 64 20 66 69 65 6c 64 29 0a 09 al? hed field)..
30f0: 20 20 20 20 28 76 65 63 74 6f 72 2d 72 65 66 20 (vector-ref
3100: 72 6f 77 20 6e 29 0a 09 20 20 20 20 28 69 66 20 row n).. (if
3110: 28 6e 75 6c 6c 3f 20 74 61 6c 29 20 23 66 20 28 (null? tal) #f (
3120: 6c 6f 6f 70 20 28 63 61 72 20 74 61 6c 29 28 63 loop (car tal)(c
3130: 64 72 20 74 61 6c 29 28 2b 20 6e 20 31 29 29 29 dr tal)(+ n 1)))
3140: 29 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d ))))..;;========
3150: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3160: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3170: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3180: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b ==============.;
3190: 3b 20 20 52 20 55 20 4e 20 53 0a 3b 3b 3d 3d 3d ; R U N S.;;===
31a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
31b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
31c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
31d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
31e0: 3d 3d 3d 0a 0a 28 64 65 66 69 6e 65 20 28 72 75 ===..(define (ru
31f0: 6e 73 3a 67 65 74 2d 73 74 64 2d 72 75 6e 2d 66 ns:get-std-run-f
3200: 69 65 6c 64 73 20 6b 65 79 73 20 72 65 6d 66 69 ields keys remfi
3210: 65 6c 64 73 29 0a 20 20 28 6c 65 74 2a 20 28 28 elds). (let* ((
3220: 68 65 61 64 65 72 20 20 20 20 28 61 70 70 65 6e header (appen
3230: 64 20 28 6d 61 70 20 6b 65 79 3a 67 65 74 2d 66 d (map key:get-f
3240: 69 65 6c 64 6e 61 6d 65 20 6b 65 79 73 29 0a 09 ieldname keys)..
3250: 09 09 20 20 20 20 72 65 6d 66 69 65 6c 64 73 29 .. remfields)
3260: 29 0a 09 20 28 6b 65 79 73 74 72 20 20 20 20 28 ).. (keystr (
3270: 63 6f 6e 63 20 28 6b 65 79 73 2d 3e 6b 65 79 73 conc (keys->keys
3280: 74 72 20 6b 65 79 73 29 20 22 2c 22 0a 09 09 09 tr keys) ","....
3290: 20 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 (string-inters
32a0: 70 65 72 73 65 20 72 65 6d 66 69 65 6c 64 73 20 perse remfields
32b0: 22 2c 22 29 29 29 29 0a 20 20 20 20 28 6c 69 73 ",")))). (lis
32c0: 74 20 6b 65 79 73 74 72 20 68 65 61 64 65 72 29 t keystr header)
32d0: 29 29 0a 0a 3b 3b 20 57 41 53 20 64 62 2d 67 65 ))..;; WAS db-ge
32e0: 74 2d 72 75 6e 73 20 46 49 58 4d 45 20 49 4e 20 t-runs FIXME IN
32f0: 52 45 4d 41 49 4e 49 4e 47 20 43 4f 44 45 0a 3b REMAINING CODE.;
3300: 3b 0a 3b 3b 20 4d 45 52 47 45 20 54 48 49 53 20 ;.;; MERGE THIS
3310: 57 49 54 48 20 64 62 3a 67 65 74 2d 72 75 6e 73 WITH db:get-runs
3320: 2c 20 61 63 63 69 64 65 6e 74 6c 79 20 77 72 6f , accidently wro
3330: 74 65 20 69 74 20 74 77 69 63 65 0a 3b 3b 0a 3b te it twice.;;.;
3340: 3b 20 72 65 70 6c 61 63 65 20 68 65 61 64 65 72 ; replace header
3350: 20 61 6e 64 20 6b 65 79 73 74 72 20 77 69 74 68 and keystr with
3360: 20 61 20 63 61 6c 6c 20 74 6f 20 72 75 6e 73 3a a call to runs:
3370: 67 65 74 2d 73 74 64 2d 72 75 6e 2d 66 69 65 6c get-std-run-fiel
3380: 64 73 0a 3b 3b 0a 3b 3b 20 6b 65 79 70 61 74 74 ds.;;.;; keypatt
3390: 73 3a 20 28 20 28 4b 45 59 31 20 22 61 62 63 25 s: ( (KEY1 "abc%
33a0: 64 65 66 22 29 28 4b 45 59 32 20 22 25 22 29 20 def")(KEY2 "%")
33b0: 29 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 28 64 62 ).;;.(define (db
33c0: 3a 67 65 74 2d 72 75 6e 73 20 64 62 20 72 75 6e :get-runs db run
33d0: 70 61 74 74 20 63 6f 75 6e 74 20 6f 66 66 73 65 patt count offse
33e0: 74 20 6b 65 79 70 61 74 74 73 29 0a 20 20 28 6c t keypatts). (l
33f0: 65 74 2a 20 28 28 72 65 73 20 20 20 20 20 20 27 et* ((res '
3400: 28 29 29 0a 09 20 28 6b 65 79 73 20 20 20 20 20 ()).. (keys
3410: 20 28 64 62 2d 67 65 74 2d 6b 65 79 73 20 64 62 (db-get-keys db
3420: 29 29 0a 09 20 28 72 65 6d 66 69 65 6c 64 73 20 )).. (remfields
3430: 28 6c 69 73 74 20 22 69 64 22 20 22 72 75 6e 6e (list "id" "runn
3440: 61 6d 65 22 20 22 73 74 61 74 65 22 20 22 73 74 ame" "state" "st
3450: 61 74 75 73 22 20 22 6f 77 6e 65 72 22 20 22 65 atus" "owner" "e
3460: 76 65 6e 74 5f 74 69 6d 65 22 29 29 0a 09 20 28 vent_time")).. (
3470: 68 65 61 64 65 72 20 20 20 20 28 61 70 70 65 6e header (appen
3480: 64 20 28 6d 61 70 20 6b 65 79 3a 67 65 74 2d 66 d (map key:get-f
3490: 69 65 6c 64 6e 61 6d 65 20 6b 65 79 73 29 0a 09 ieldname keys)..
34a0: 09 09 20 20 20 20 72 65 6d 66 69 65 6c 64 73 29 .. remfields)
34b0: 29 0a 09 20 28 6b 65 79 73 74 72 20 20 20 20 28 ).. (keystr (
34c0: 63 6f 6e 63 20 28 6b 65 79 73 2d 3e 6b 65 79 73 conc (keys->keys
34d0: 74 72 20 6b 65 79 73 29 20 22 2c 22 0a 09 09 09 tr keys) ","....
34e0: 20 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 (string-inters
34f0: 70 65 72 73 65 20 72 65 6d 66 69 65 6c 64 73 20 perse remfields
3500: 22 2c 22 29 29 29 0a 09 20 28 71 72 79 73 74 72 ","))).. (qrystr
3510: 20 20 20 20 28 63 6f 6e 63 20 22 53 45 4c 45 43 (conc "SELEC
3520: 54 20 22 20 6b 65 79 73 74 72 20 22 20 46 52 4f T " keystr " FRO
3530: 4d 20 72 75 6e 73 20 57 48 45 52 45 20 72 75 6e M runs WHERE run
3540: 6e 61 6d 65 20 4c 49 4b 45 20 3f 20 22 0a 09 09 name LIKE ? "...
3550: 09 20 20 3b 3b 20 47 65 6e 65 72 61 74 65 3a 20 . ;; Generate:
3560: 22 20 41 4e 44 20 78 20 4c 49 4b 45 20 27 6b 65 " AND x LIKE 'ke
3570: 79 70 61 74 74 27 20 2e 2e 2e 22 0a 09 09 09 20 ypatt' ..."....
3580: 20 28 69 66 20 28 6e 75 6c 6c 3f 20 6b 65 79 70 (if (null? keyp
3590: 61 74 74 73 29 20 22 22 0a 09 09 09 20 20 20 20 atts) ""....
35a0: 20 20 28 63 6f 6e 63 20 22 20 41 4e 44 20 22 0a (conc " AND ".
35b0: 09 09 09 09 20 20 20 20 28 73 74 72 69 6e 67 2d .... (string-
35c0: 6a 6f 69 6e 20 0a 09 09 09 09 20 20 20 20 20 28 join ..... (
35d0: 6d 61 70 20 28 6c 61 6d 62 64 61 20 28 6b 65 79 map (lambda (key
35e0: 70 61 74 74 29 0a 09 09 09 09 09 20 20 20 20 28 patt)...... (
35f0: 6c 65 74 20 28 28 6b 65 79 20 20 28 63 61 72 20 let ((key (car
3600: 6b 65 79 70 61 74 74 29 29 0a 09 09 09 09 09 09 keypatt)).......
3610: 20 20 28 70 61 74 74 20 28 63 61 64 72 20 6b 65 (patt (cadr ke
3620: 79 70 61 74 74 29 29 29 0a 09 09 09 09 09 20 20 ypatt)))......
3630: 20 20 20 20 28 63 6f 6e 63 20 6b 65 79 20 22 20 (conc key "
3640: 4c 49 4b 45 20 27 22 20 70 61 74 74 20 22 27 22 LIKE '" patt "'"
3650: 29 29 29 0a 09 09 09 09 09 20 20 6b 65 79 70 61 )))...... keypa
3660: 74 74 73 29 0a 09 09 09 09 20 20 20 20 20 22 20 tts)..... "
3670: 41 4e 44 20 22 29 29 29 0a 09 09 09 20 20 22 20 AND "))).... "
3680: 4f 52 44 45 52 20 42 59 20 65 76 65 6e 74 5f 74 ORDER BY event_t
3690: 69 6d 65 20 44 45 53 43 20 22 0a 09 09 09 20 20 ime DESC "....
36a0: 28 69 66 20 28 6e 75 6d 62 65 72 3f 20 63 6f 75 (if (number? cou
36b0: 6e 74 29 0a 09 09 09 20 20 20 20 20 20 28 63 6f nt).... (co
36c0: 6e 63 20 22 20 4c 49 4d 49 54 20 22 20 63 6f 75 nc " LIMIT " cou
36d0: 6e 74 29 0a 09 09 09 20 20 20 20 20 20 22 22 29 nt).... "")
36e0: 0a 09 09 09 20 20 28 69 66 20 28 6e 75 6d 62 65 .... (if (numbe
36f0: 72 3f 20 6f 66 66 73 65 74 29 0a 09 09 09 20 20 r? offset)....
3700: 20 20 20 20 28 63 6f 6e 63 20 22 20 4f 46 46 53 (conc " OFFS
3710: 45 54 20 22 20 6f 66 66 73 65 74 29 0a 09 09 09 ET " offset)....
3720: 20 20 20 20 20 20 22 22 29 29 29 29 0a 20 20 20 "")))).
3730: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20 (debug:print 4
3740: 22 64 62 3a 67 65 74 2d 72 75 6e 73 20 71 72 79 "db:get-runs qry
3750: 73 74 72 3a 20 22 20 71 72 79 73 74 72 20 22 5c str: " qrystr "\
3760: 6e 6b 65 79 70 61 74 74 73 3a 20 22 20 6b 65 79 nkeypatts: " key
3770: 70 61 74 74 73 20 22 5c 6e 20 20 6f 66 66 73 65 patts "\n offse
3780: 74 3a 20 22 20 6f 66 66 73 65 74 20 22 20 6c 69 t: " offset " li
3790: 6d 69 74 3a 20 22 20 63 6f 75 6e 74 29 0a 20 20 mit: " count).
37a0: 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 (sqlite3:for-e
37b0: 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 ach-row. (la
37c0: 6d 62 64 61 20 28 61 20 2e 20 78 29 0a 20 20 20 mbda (a . x).
37d0: 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28 63 (set! res (c
37e0: 6f 6e 73 20 28 61 70 70 6c 79 20 76 65 63 74 6f ons (apply vecto
37f0: 72 20 61 20 78 29 20 72 65 73 29 29 29 0a 20 20 r a x) res))).
3800: 20 20 20 64 62 0a 20 20 20 20 20 71 72 79 73 74 db. qryst
3810: 72 0a 20 20 20 20 20 72 75 6e 70 61 74 74 29 0a r. runpatt).
3820: 20 20 20 20 28 76 65 63 74 6f 72 20 68 65 61 64 (vector head
3830: 65 72 20 72 65 73 29 29 29 0a 0a 3b 3b 20 6a 75 er res)))..;; ju
3840: 73 74 20 67 65 74 20 63 6f 75 6e 74 20 6f 66 20 st get count of
3850: 72 75 6e 73 0a 28 64 65 66 69 6e 65 20 28 64 62 runs.(define (db
3860: 3a 67 65 74 2d 6e 75 6d 2d 72 75 6e 73 20 64 62 :get-num-runs db
3870: 20 72 75 6e 70 61 74 74 29 0a 20 20 28 6c 65 74 runpatt). (let
3880: 20 28 28 6e 75 6d 72 75 6e 73 20 30 29 29 0a 20 ((numruns 0)).
3890: 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d (sqlite3:for-
38a0: 65 61 63 68 2d 72 6f 77 20 0a 20 20 20 20 20 28 each-row . (
38b0: 6c 61 6d 62 64 61 20 28 63 6f 75 6e 74 29 0a 20 lambda (count).
38c0: 20 20 20 20 20 20 28 73 65 74 21 20 6e 75 6d 72 (set! numr
38d0: 75 6e 73 20 63 6f 75 6e 74 29 29 0a 20 20 20 20 uns count)).
38e0: 20 64 62 0a 20 20 20 20 20 22 53 45 4c 45 43 54 db. "SELECT
38f0: 20 43 4f 55 4e 54 28 69 64 29 20 46 52 4f 4d 20 COUNT(id) FROM
3900: 72 75 6e 73 20 57 48 45 52 45 20 72 75 6e 6e 61 runs WHERE runna
3910: 6d 65 20 4c 49 4b 45 20 3f 3b 22 20 72 75 6e 70 me LIKE ?;" runp
3920: 61 74 74 29 0a 20 20 20 20 6e 75 6d 72 75 6e 73 att). numruns
3930: 29 29 0a 0a 0a 3b 3b 20 75 73 65 20 28 67 65 74 ))...;; use (get
3940: 2d 76 61 6c 75 65 2d 62 79 2d 68 65 61 64 65 72 -value-by-header
3950: 20 28 64 62 3a 67 65 74 2d 68 65 61 64 65 72 20 (db:get-header
3960: 72 75 6e 69 6e 66 6f 29 28 64 62 3a 67 65 74 2d runinfo)(db:get-
3970: 72 6f 77 20 72 75 6e 69 6e 66 6f 29 29 0a 28 64 row runinfo)).(d
3980: 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 72 75 efine (db:get-ru
3990: 6e 2d 69 6e 66 6f 20 64 62 20 72 75 6e 2d 69 64 n-info db run-id
39a0: 29 0a 20 20 28 6c 65 74 2a 20 28 28 72 65 73 20 ). (let* ((res
39b0: 20 20 20 20 20 23 66 29 0a 09 20 28 6b 65 79 73 #f).. (keys
39c0: 20 20 20 20 20 20 28 64 62 2d 67 65 74 2d 6b 65 (db-get-ke
39d0: 79 73 20 64 62 29 29 0a 09 20 28 72 65 6d 66 69 ys db)).. (remfi
39e0: 65 6c 64 73 20 28 6c 69 73 74 20 22 69 64 22 20 elds (list "id"
39f0: 22 72 75 6e 6e 61 6d 65 22 20 22 73 74 61 74 65 "runname" "state
3a00: 22 20 22 73 74 61 74 75 73 22 20 22 6f 77 6e 65 " "status" "owne
3a10: 72 22 20 22 65 76 65 6e 74 5f 74 69 6d 65 22 29 r" "event_time")
3a20: 29 0a 09 20 28 68 65 61 64 65 72 20 20 20 20 28 ).. (header (
3a30: 61 70 70 65 6e 64 20 28 6d 61 70 20 6b 65 79 3a append (map key:
3a40: 67 65 74 2d 66 69 65 6c 64 6e 61 6d 65 20 6b 65 get-fieldname ke
3a50: 79 73 29 0a 09 09 09 20 20 20 20 72 65 6d 66 69 ys).... remfi
3a60: 65 6c 64 73 29 29 0a 09 20 28 6b 65 79 73 74 72 elds)).. (keystr
3a70: 20 20 20 20 28 63 6f 6e 63 20 28 6b 65 79 73 2d (conc (keys-
3a80: 3e 6b 65 79 73 74 72 20 6b 65 79 73 29 20 22 2c >keystr keys) ",
3a90: 22 0a 09 09 09 20 20 28 73 74 72 69 6e 67 2d 69 ".... (string-i
3aa0: 6e 74 65 72 73 70 65 72 73 65 20 72 65 6d 66 69 ntersperse remfi
3ab0: 65 6c 64 73 20 22 2c 22 29 29 29 29 0a 20 20 20 elds ",")))).
3ac0: 20 3b 3b 20 28 64 65 62 75 67 3a 70 72 69 6e 74 ;; (debug:print
3ad0: 20 30 20 22 64 62 3a 67 65 74 2d 72 75 6e 2d 69 0 "db:get-run-i
3ae0: 6e 66 6f 20 72 75 6e 2d 69 64 3a 20 22 20 72 75 nfo run-id: " ru
3af0: 6e 2d 69 64 20 22 20 68 65 61 64 65 72 3a 20 22 n-id " header: "
3b00: 20 68 65 61 64 65 72 20 22 20 6b 65 79 73 74 72 header " keystr
3b10: 3a 20 22 20 6b 65 79 73 74 72 29 0a 20 20 20 20 : " keystr).
3b20: 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 (sqlite3:for-eac
3b30: 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 h-row. (lamb
3b40: 64 61 20 28 61 20 2e 20 78 29 0a 20 20 20 20 20 da (a . x).
3b50: 20 20 28 73 65 74 21 20 72 65 73 20 28 61 70 70 (set! res (app
3b60: 6c 79 20 76 65 63 74 6f 72 20 61 20 78 29 29 29 ly vector a x)))
3b70: 0a 20 20 20 20 20 64 62 0a 20 20 20 20 20 28 63 . db. (c
3b80: 6f 6e 63 20 22 53 45 4c 45 43 54 20 22 20 6b 65 onc "SELECT " ke
3b90: 79 73 74 72 20 22 20 46 52 4f 4d 20 72 75 6e 73 ystr " FROM runs
3ba0: 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 29 0a 20 WHERE id=?;").
3bb0: 20 20 20 20 72 75 6e 2d 69 64 29 0a 20 20 20 20 run-id).
3bc0: 28 76 65 63 74 6f 72 20 68 65 61 64 65 72 20 72 (vector header r
3bd0: 65 73 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 es)))..(define (
3be0: 64 62 3a 73 65 74 2d 63 6f 6d 6d 65 6e 74 2d 66 db:set-comment-f
3bf0: 6f 72 2d 72 75 6e 20 64 62 20 72 75 6e 2d 69 64 or-run db run-id
3c00: 20 63 6f 6d 6d 65 6e 74 29 0a 20 20 28 73 71 6c comment). (sql
3c10: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 ite3:execute db
3c20: 22 55 50 44 41 54 45 20 72 75 6e 73 20 53 45 54 "UPDATE runs SET
3c30: 20 63 6f 6d 6d 65 6e 74 3d 3f 20 57 48 45 52 45 comment=? WHERE
3c40: 20 69 64 3d 3f 3b 22 20 63 6f 6d 6d 65 6e 74 20 id=?;" comment
3c50: 72 75 6e 2d 69 64 29 29 0a 0a 3b 3b 20 64 6f 65 run-id))..;; doe
3c60: 73 20 6e 6f 74 20 28 6f 62 76 69 6f 75 73 6c 79 s not (obviously
3c70: 21 29 20 72 65 6d 6f 76 65 64 20 64 65 70 65 6e !) removed depen
3c80: 64 65 6e 74 20 64 61 74 61 2e 20 0a 28 64 65 66 dent data. .(def
3c90: 69 6e 65 20 28 64 62 3a 64 65 6c 65 74 65 2d 72 ine (db:delete-r
3ca0: 75 6e 20 64 62 20 72 75 6e 2d 69 64 29 0a 20 20 un db run-id).
3cb0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 (sqlite3:execute
3cc0: 20 64 62 20 22 44 45 4c 45 54 45 20 46 52 4f 4d db "DELETE FROM
3cd0: 20 72 75 6e 73 20 57 48 45 52 45 20 69 64 3d 3f runs WHERE id=?
3ce0: 3b 22 20 72 75 6e 2d 69 64 29 29 0a 0a 28 64 65 ;" run-id))..(de
3cf0: 66 69 6e 65 20 28 64 62 3a 75 70 64 61 74 65 2d fine (db:update-
3d00: 72 75 6e 2d 65 76 65 6e 74 5f 74 69 6d 65 20 64 run-event_time d
3d10: 62 20 72 75 6e 2d 69 64 29 0a 20 20 28 73 71 6c b run-id). (sql
3d20: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 ite3:execute db
3d30: 22 55 50 44 41 54 45 20 72 75 6e 73 20 53 45 54 "UPDATE runs SET
3d40: 20 65 76 65 6e 74 5f 74 69 6d 65 3d 73 74 72 66 event_time=strf
3d50: 74 69 6d 65 28 27 25 73 27 2c 27 6e 6f 77 27 29 time('%s','now')
3d60: 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 72 75 WHERE id=?;" ru
3d70: 6e 2d 69 64 29 29 20 0a 0a 3b 3b 3d 3d 3d 3d 3d n-id)) ..;;=====
3d80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3d90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3da0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3db0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3dc0: 3d 0a 3b 3b 20 20 54 20 45 20 53 20 54 20 53 0a =.;; T E S T S.
3dd0: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ;;==============
3de0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3df0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3e00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3e10: 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 73 74 61 ========..;; sta
3e20: 74 65 73 20 61 6e 64 20 73 74 61 74 75 73 65 73 tes and statuses
3e30: 20 61 72 65 20 6c 69 73 74 73 2c 20 74 75 72 6e are lists, turn
3e40: 20 74 68 65 6d 20 69 6e 74 6f 20 28 22 50 41 53 them into ("PAS
3e50: 53 22 2c 22 46 41 49 4c 22 2e 2e 2e 29 20 61 6e S","FAIL"...) an
3e60: 64 20 75 73 65 20 4e 4f 54 20 49 4e 0a 3b 3b 20 d use NOT IN.;;
3e70: 69 2e 65 2e 20 74 68 65 73 65 20 6c 69 73 74 73 i.e. these lists
3e80: 20 64 65 66 69 6e 65 20 77 68 61 74 20 74 6f 20 define what to
3e90: 4e 4f 54 20 73 68 6f 77 2e 0a 3b 3b 20 73 74 61 NOT show..;; sta
3ea0: 74 65 73 20 61 6e 64 20 73 74 61 74 75 73 65 73 tes and statuses
3eb0: 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f are required to
3ec0: 20 62 65 20 6c 69 73 74 73 2c 20 65 6d 70 74 79 be lists, empty
3ed0: 20 69 73 20 6f 6b 0a 28 64 65 66 69 6e 65 20 28 is ok.(define (
3ee0: 64 62 2d 67 65 74 2d 74 65 73 74 73 2d 66 6f 72 db-get-tests-for
3ef0: 2d 72 75 6e 20 64 62 20 72 75 6e 2d 69 64 20 74 -run db run-id t
3f00: 65 73 74 70 61 74 74 20 69 74 65 6d 70 61 74 74 estpatt itempatt
3f10: 20 73 74 61 74 65 73 20 73 74 61 74 75 73 65 73 states statuses
3f20: 29 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20 27 ). (let ((res '
3f30: 28 29 29 0a 09 28 73 74 61 74 65 73 2d 73 74 72 ())..(states-str
3f40: 20 20 20 20 28 63 6f 6e 63 20 22 28 27 22 20 28 (conc "('" (
3f50: 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 string-intersper
3f60: 73 65 20 73 74 61 74 65 73 20 20 20 22 27 2c 27 se states "','
3f70: 22 29 20 22 27 29 22 29 29 0a 09 28 73 74 61 74 ") "')"))..(stat
3f80: 75 73 65 73 2d 73 74 72 20 20 28 63 6f 6e 63 20 uses-str (conc
3f90: 22 28 27 22 20 28 73 74 72 69 6e 67 2d 69 6e 74 "('" (string-int
3fa0: 65 72 73 70 65 72 73 65 20 73 74 61 74 75 73 65 ersperse statuse
3fb0: 73 20 22 27 2c 27 22 29 20 22 27 29 22 29 29 0a s "','") "')")).
3fc0: 09 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a .). (sqlite3:
3fd0: 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20 for-each-row .
3fe0: 20 20 20 28 6c 61 6d 62 64 61 20 28 61 20 2e 20 (lambda (a .
3ff0: 62 29 20 3b 3b 20 69 64 20 72 75 6e 2d 69 64 20 b) ;; id run-id
4000: 74 65 73 74 6e 61 6d 65 20 73 74 61 74 65 20 73 testname state s
4010: 74 61 74 75 73 20 65 76 65 6e 74 2d 74 69 6d 65 tatus event-time
4020: 20 68 6f 73 74 20 63 70 75 6c 6f 61 64 20 64 69 host cpuload di
4030: 73 6b 66 72 65 65 20 75 6e 61 6d 65 20 72 75 6e skfree uname run
4040: 64 69 72 20 69 74 65 6d 2d 70 61 74 68 20 72 75 dir item-path ru
4050: 6e 2d 64 75 72 61 74 69 6f 6e 20 66 69 6e 61 6c n-duration final
4060: 2d 6c 6f 67 66 20 63 6f 6d 6d 65 6e 74 29 0a 20 -logf comment).
4070: 20 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20 (set! res
4080: 28 63 6f 6e 73 20 28 61 70 70 6c 79 20 76 65 63 (cons (apply vec
4090: 74 6f 72 20 61 20 62 29 20 72 65 73 29 29 29 20 tor a b) res)))
40a0: 3b 3b 20 69 64 20 72 75 6e 2d 69 64 20 74 65 73 ;; id run-id tes
40b0: 74 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61 74 tname state stat
40c0: 75 73 20 65 76 65 6e 74 2d 74 69 6d 65 20 68 6f us event-time ho
40d0: 73 74 20 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 st cpuload diskf
40e0: 72 65 65 20 75 6e 61 6d 65 20 72 75 6e 64 69 72 ree uname rundir
40f0: 20 69 74 65 6d 2d 70 61 74 68 20 72 75 6e 2d 64 item-path run-d
4100: 75 72 61 74 69 6f 6e 20 66 69 6e 61 6c 2d 6c 6f uration final-lo
4110: 67 66 20 63 6f 6d 6d 65 6e 74 29 20 72 65 73 29 gf comment) res)
4120: 29 29 0a 20 20 20 20 20 64 62 20 0a 20 20 20 20 )). db .
4130: 20 28 63 6f 6e 63 20 22 53 45 4c 45 43 54 20 69 (conc "SELECT i
4140: 64 2c 72 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d d,run_id,testnam
4150: 65 2c 73 74 61 74 65 2c 73 74 61 74 75 73 2c 65 e,state,status,e
4160: 76 65 6e 74 5f 74 69 6d 65 2c 68 6f 73 74 2c 63 vent_time,host,c
4170: 70 75 6c 6f 61 64 2c 64 69 73 6b 66 72 65 65 2c puload,diskfree,
4180: 75 6e 61 6d 65 2c 72 75 6e 64 69 72 2c 69 74 65 uname,rundir,ite
4190: 6d 5f 70 61 74 68 2c 72 75 6e 5f 64 75 72 61 74 m_path,run_durat
41a0: 69 6f 6e 2c 66 69 6e 61 6c 5f 6c 6f 67 66 2c 63 ion,final_logf,c
41b0: 6f 6d 6d 65 6e 74 20 22 0a 09 20 20 20 22 20 46 omment ".. " F
41c0: 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 ROM tests WHERE
41d0: 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 run_id=? AND tes
41e0: 74 6e 61 6d 65 20 6c 69 6b 65 20 3f 20 41 4e 44 tname like ? AND
41f0: 20 69 74 65 6d 5f 70 61 74 68 20 4c 49 4b 45 20 item_path LIKE
4200: 3f 20 22 20 0a 09 20 20 20 22 20 41 4e 44 20 4e ? " .. " AND N
4210: 4f 54 20 28 73 74 61 74 65 20 69 6e 20 22 20 73 OT (state in " s
4220: 74 61 74 65 73 2d 73 74 72 20 22 20 41 4e 44 20 tates-str " AND
4230: 73 74 61 74 75 73 20 49 4e 20 22 20 73 74 61 74 status IN " stat
4240: 75 73 65 73 2d 73 74 72 20 22 29 20 22 0a 09 20 uses-str ") "..
4250: 20 20 3b 3b 20 22 20 4f 52 44 45 52 20 42 59 20 ;; " ORDER BY
4260: 69 64 20 44 45 53 43 3b 22 0a 09 20 20 20 22 20 id DESC;".. "
4270: 4f 52 44 45 52 20 42 59 20 65 76 65 6e 74 5f 74 ORDER BY event_t
4280: 69 6d 65 20 41 53 43 3b 22 20 3b 3b 20 50 4f 54 ime ASC;" ;; POT
4290: 45 4e 54 49 41 4c 20 49 53 53 55 45 21 20 43 48 ENTIAL ISSUE! CH
42a0: 45 43 4b 20 4d 45 21 20 44 6f 65 73 20 61 6e 79 ECK ME! Does any
42b0: 74 69 6e 67 20 64 65 70 65 6e 64 20 6f 6e 20 74 ting depend on t
42c0: 68 69 73 20 62 65 69 6e 67 20 73 6f 72 74 65 64 his being sorted
42d0: 20 62 79 20 69 64 3f 0a 09 20 20 20 29 0a 20 20 by id?.. ).
42e0: 20 20 20 72 75 6e 2d 69 64 0a 20 20 20 20 20 28 run-id. (
42f0: 69 66 20 74 65 73 74 70 61 74 74 20 74 65 73 74 if testpatt test
4300: 70 61 74 74 20 22 25 22 29 0a 20 20 20 20 20 28 patt "%"). (
4310: 69 66 20 69 74 65 6d 70 61 74 74 20 69 74 65 6d if itempatt item
4320: 70 61 74 74 20 22 25 22 29 29 0a 20 20 20 20 72 patt "%")). r
4330: 65 73 29 29 0a 0a 3b 3b 20 74 68 69 73 20 6f 6e es))..;; this on
4340: 65 20 69 73 20 61 20 62 69 74 20 62 72 6f 6b 65 e is a bit broke
4350: 6e 20 42 55 47 20 46 49 58 4d 45 0a 28 64 65 66 n BUG FIXME.(def
4360: 69 6e 65 20 28 64 62 3a 64 65 6c 65 74 65 2d 74 ine (db:delete-t
4370: 65 73 74 2d 73 74 65 70 2d 72 65 63 6f 72 64 73 est-step-records
4380: 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d db run-id test-
4390: 6e 61 6d 65 20 69 74 65 6d 64 61 74 29 0a 20 20 name itemdat).
43a0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 (sqlite3:execute
43b0: 20 64 62 20 22 44 45 4c 45 54 45 20 46 52 4f 4d db "DELETE FROM
43c0: 20 74 65 73 74 5f 73 74 65 70 73 20 57 48 45 52 test_steps WHER
43d0: 45 20 74 65 73 74 5f 69 64 20 69 6e 20 28 53 45 E test_id in (SE
43e0: 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 74 65 73 LECT id FROM tes
43f0: 74 73 20 57 48 45 52 45 20 72 75 6e 5f 69 64 3d ts WHERE run_id=
4400: 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f ? AND testname=?
4410: 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 3d 3f AND item_path=?
4420: 29 3b 22 20 0a 09 09 20 20 20 72 75 6e 2d 69 64 );" ... run-id
4430: 20 74 65 73 74 2d 6e 61 6d 65 20 28 69 74 65 6d test-name (item
4440: 2d 6c 69 73 74 2d 3e 70 61 74 68 20 69 74 65 6d -list->path item
4450: 64 61 74 29 29 29 0a 3b 3b 20 0a 28 64 65 66 69 dat))).;; .(defi
4460: 6e 65 20 28 64 62 3a 64 65 6c 65 74 65 2d 74 65 ne (db:delete-te
4470: 73 74 2d 72 65 63 6f 72 64 73 20 64 62 20 74 65 st-records db te
4480: 73 74 2d 69 64 29 0a 20 20 28 73 71 6c 69 74 65 st-id). (sqlite
4490: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 44 45 3:execute db "DE
44a0: 4c 45 54 45 20 46 52 4f 4d 20 74 65 73 74 5f 73 LETE FROM test_s
44b0: 74 65 70 73 20 57 48 45 52 45 20 74 65 73 74 5f teps WHERE test_
44c0: 69 64 3d 3f 3b 22 20 74 65 73 74 2d 69 64 29 0a id=?;" test-id).
44d0: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 (sqlite3:execu
44e0: 74 65 20 64 62 20 22 44 45 4c 45 54 45 20 46 52 te db "DELETE FR
44f0: 4f 4d 20 74 65 73 74 5f 64 61 74 61 20 20 57 48 OM test_data WH
4500: 45 52 45 20 74 65 73 74 5f 69 64 3d 3f 3b 22 20 ERE test_id=?;"
4510: 74 65 73 74 2d 69 64 29 0a 20 20 28 73 71 6c 69 test-id). (sqli
4520: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 te3:execute db "
4530: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 65 73 74 DELETE FROM test
4540: 73 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 74 s WHERE id=?;" t
4550: 65 73 74 2d 69 64 29 29 0a 0a 3b 3b 20 73 65 74 est-id))..;; set
4560: 20 74 65 73 74 73 20 77 69 74 68 20 73 74 61 74 tests with stat
4570: 65 20 63 75 72 72 73 74 61 74 65 20 61 6e 64 20 e currstate and
4580: 73 74 61 74 75 73 20 63 75 72 72 73 74 61 74 75 status currstatu
4590: 73 20 74 6f 20 6e 65 77 73 74 61 74 65 20 61 6e s to newstate an
45a0: 64 20 6e 65 77 73 74 61 74 75 73 0a 3b 3b 20 75 d newstatus.;; u
45b0: 73 65 20 63 75 72 72 73 74 61 74 65 20 3d 20 23 se currstate = #
45c0: 66 20 61 6e 64 20 6f 72 20 63 75 72 72 73 74 61 f and or currsta
45d0: 74 75 73 20 3d 20 23 66 20 74 6f 20 61 70 70 6c tus = #f to appl
45e0: 79 20 74 6f 20 61 6e 79 20 73 74 61 74 65 20 6f y to any state o
45f0: 72 20 73 74 61 74 75 73 20 72 65 73 70 65 63 74 r status respect
4600: 69 76 65 6c 79 0a 3b 3b 20 57 41 52 4e 49 4e 47 ively.;; WARNING
4610: 3a 20 53 51 4c 20 69 6e 6a 65 63 74 69 6f 6e 20 : SQL injection
4620: 72 69 73 6b 0a 28 64 65 66 69 6e 65 20 28 64 62 risk.(define (db
4630: 3a 73 65 74 2d 74 65 73 74 73 2d 73 74 61 74 65 :set-tests-state
4640: 2d 73 74 61 74 75 73 20 64 62 20 72 75 6e 2d 69 -status db run-i
4650: 64 20 74 65 73 74 6e 61 6d 65 73 20 63 75 72 72 d testnames curr
4660: 73 74 61 74 65 20 63 75 72 72 73 74 61 74 75 73 state currstatus
4670: 20 6e 65 77 73 74 61 74 65 20 6e 65 77 73 74 61 newstate newsta
4680: 74 75 73 29 0a 20 20 28 66 6f 72 2d 65 61 63 68 tus). (for-each
4690: 20 28 6c 61 6d 62 64 61 20 28 74 65 73 74 6e 61 (lambda (testna
46a0: 6d 65 29 0a 09 20 20 20 20 20 20 28 6c 65 74 20 me).. (let
46b0: 28 28 71 72 79 20 28 63 6f 6e 63 20 22 55 50 44 ((qry (conc "UPD
46c0: 41 54 45 20 74 65 73 74 73 20 53 45 54 20 73 74 ATE tests SET st
46d0: 61 74 65 3d 3f 2c 73 74 61 74 75 73 3d 3f 20 57 ate=?,status=? W
46e0: 48 45 52 45 20 22 0a 09 09 09 20 20 20 20 20 20 HERE "....
46f0: 20 28 69 66 20 63 75 72 72 73 74 61 74 65 20 20 (if currstate
4700: 28 63 6f 6e 63 20 22 73 74 61 74 65 3d 27 22 20 (conc "state='"
4710: 63 75 72 72 73 74 61 74 65 20 22 27 20 41 4e 44 currstate "' AND
4720: 20 22 29 20 22 22 29 0a 09 09 09 20 20 20 20 20 ") "")....
4730: 20 20 28 69 66 20 63 75 72 72 73 74 61 74 75 73 (if currstatus
4740: 20 28 63 6f 6e 63 20 22 73 74 61 74 75 73 3d 27 (conc "status='
4750: 22 20 63 75 72 72 73 74 61 74 75 73 20 22 27 20 " currstatus "'
4760: 41 4e 44 20 22 29 20 22 22 29 0a 09 09 09 20 20 AND ") "")....
4770: 20 20 20 20 20 22 20 72 75 6e 5f 69 64 3d 3f 20 " run_id=?
4780: 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 AND testname=? A
4790: 4e 44 20 4e 4f 54 20 28 69 74 65 6d 5f 70 61 74 ND NOT (item_pat
47a0: 68 3d 27 27 20 41 4e 44 20 74 65 73 74 6e 61 6d h='' AND testnam
47b0: 65 20 69 6e 20 28 53 45 4c 45 43 54 20 44 49 53 e in (SELECT DIS
47c0: 54 49 4e 43 54 20 74 65 73 74 6e 61 6d 65 20 46 TINCT testname F
47d0: 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 ROM tests WHERE
47e0: 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 testname=? AND i
47f0: 74 65 6d 5f 70 61 74 68 20 21 3d 20 27 27 29 29 tem_path != ''))
4800: 3b 22 29 29 29 0a 09 09 3b 3b 28 64 65 62 75 67 ;")))...;;(debug
4810: 3a 70 72 69 6e 74 20 30 20 22 51 52 59 3a 20 22 :print 0 "QRY: "
4820: 20 71 72 79 29 0a 09 09 28 73 71 6c 69 74 65 33 qry)...(sqlite3
4830: 3a 65 78 65 63 75 74 65 20 64 62 20 71 72 79 20 :execute db qry
4840: 72 75 6e 2d 69 64 20 6e 65 77 73 74 61 74 65 20 run-id newstate
4850: 6e 65 77 73 74 61 74 75 73 20 74 65 73 74 6e 61 newstatus testna
4860: 6d 65 20 74 65 73 74 6e 61 6d 65 29 29 29 0a 09 me testname)))..
4870: 20 20 20 20 74 65 73 74 6e 61 6d 65 73 29 29 0a testnames)).
4880: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 64 65 6c .(define (db:del
4890: 65 74 65 2d 74 65 73 74 73 2d 69 6e 2d 73 74 61 ete-tests-in-sta
48a0: 74 65 20 64 62 20 72 75 6e 2d 69 64 20 73 74 61 te db run-id sta
48b0: 74 65 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 te). (sqlite3:e
48c0: 78 65 63 75 74 65 20 64 62 20 22 44 45 4c 45 54 xecute db "DELET
48d0: 45 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 E FROM tests WHE
48e0: 52 45 20 73 74 61 74 65 3d 3f 20 41 4e 44 20 72 RE state=? AND r
48f0: 75 6e 5f 69 64 3d 3f 3b 22 20 73 74 61 74 65 20 un_id=?;" state
4900: 72 75 6e 2d 69 64 29 29 0a 0a 28 64 65 66 69 6e run-id))..(defin
4910: 65 20 28 64 62 3a 74 65 73 74 2d 73 65 74 2d 73 e (db:test-set-s
4920: 74 61 74 65 2d 73 74 61 74 75 73 2d 62 79 2d 69 tate-status-by-i
4930: 64 20 64 62 20 74 65 73 74 2d 69 64 20 6e 65 77 d db test-id new
4940: 73 74 61 74 65 20 6e 65 77 73 74 61 74 75 73 20 state newstatus
4950: 6e 65 77 63 6f 6d 6d 65 6e 74 29 0a 20 20 28 69 newcomment). (i
4960: 66 20 6e 65 77 73 74 61 74 65 20 20 20 28 73 71 f newstate (sq
4970: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 lite3:execute db
4980: 20 22 55 50 44 41 54 45 20 74 65 73 74 73 20 53 "UPDATE tests S
4990: 45 54 20 73 74 61 74 65 3d 3f 20 20 20 57 48 45 ET state=? WHE
49a0: 52 45 20 69 64 3d 3f 3b 22 20 6e 65 77 73 74 61 RE id=?;" newsta
49b0: 74 65 20 20 20 74 65 73 74 2d 69 64 29 29 0a 20 te test-id)).
49c0: 20 28 69 66 20 6e 65 77 73 74 61 74 75 73 20 20 (if newstatus
49d0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 (sqlite3:execute
49e0: 20 64 62 20 22 55 50 44 41 54 45 20 74 65 73 74 db "UPDATE test
49f0: 73 20 53 45 54 20 73 74 61 74 75 73 3d 3f 20 20 s SET status=?
4a00: 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 6e 65 77 WHERE id=?;" new
4a10: 73 74 61 74 75 73 20 20 74 65 73 74 2d 69 64 29 status test-id)
4a20: 29 0a 20 20 28 69 66 20 6e 65 77 63 6f 6d 6d 65 ). (if newcomme
4a30: 6e 74 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 nt (sqlite3:exec
4a40: 75 74 65 20 64 62 20 22 55 50 44 41 54 45 20 74 ute db "UPDATE t
4a50: 65 73 74 73 20 53 45 54 20 63 6f 6d 6d 65 6e 74 ests SET comment
4a60: 3d 3f 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 =? WHERE id=?;"
4a70: 6e 65 77 63 6f 6d 6d 65 6e 74 20 74 65 73 74 2d newcomment test-
4a80: 69 64 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 id)))..(define (
4a90: 64 62 3a 67 65 74 2d 63 6f 75 6e 74 2d 74 65 73 db:get-count-tes
4aa0: 74 73 2d 72 75 6e 6e 69 6e 67 20 64 62 29 0a 20 ts-running db).
4ab0: 20 28 6c 65 74 20 28 28 72 65 73 20 30 29 29 0a (let ((res 0)).
4ac0: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 (sqlite3:for
4ad0: 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 -each-row. (
4ae0: 6c 61 6d 62 64 61 20 28 63 6f 75 6e 74 29 0a 20 lambda (count).
4af0: 20 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20 (set! res
4b00: 63 6f 75 6e 74 29 29 0a 20 20 20 20 20 64 62 0a count)). db.
4b10: 20 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 "SELECT cou
4b20: 6e 74 28 69 64 29 20 46 52 4f 4d 20 74 65 73 74 nt(id) FROM test
4b30: 73 20 57 48 45 52 45 20 73 74 61 74 65 20 3d 20 s WHERE state =
4b40: 27 52 55 4e 4e 49 4e 47 27 20 4f 52 20 73 74 61 'RUNNING' OR sta
4b50: 74 65 20 3d 20 27 4c 41 55 4e 43 48 45 44 27 20 te = 'LAUNCHED'
4b60: 4f 52 20 73 74 61 74 65 20 3d 20 27 52 45 4d 4f OR state = 'REMO
4b70: 54 45 48 4f 53 54 53 54 41 52 54 27 3b 22 29 0a TEHOSTSTART';").
4b80: 20 20 20 20 72 65 73 29 29 0a 0a 28 64 65 66 69 res))..(defi
4b90: 6e 65 20 28 64 62 3a 67 65 74 2d 63 6f 75 6e 74 ne (db:get-count
4ba0: 2d 74 65 73 74 73 2d 72 75 6e 6e 69 6e 67 2d 69 -tests-running-i
4bb0: 6e 2d 6a 6f 62 67 72 6f 75 70 20 64 62 20 6a 6f n-jobgroup db jo
4bc0: 62 67 72 6f 75 70 29 0a 20 20 28 69 66 20 28 6e bgroup). (if (n
4bd0: 6f 74 20 6a 6f 62 67 72 6f 75 70 29 0a 20 20 20 ot jobgroup).
4be0: 20 20 20 30 20 3b 3b 20 0a 20 20 20 20 20 20 28 0 ;; . (
4bf0: 6c 65 74 20 28 28 72 65 73 20 30 29 29 0a 09 28 let ((res 0))..(
4c00: 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 sqlite3:for-each
4c10: 2d 72 6f 77 0a 09 20 28 6c 61 6d 62 64 61 20 28 -row.. (lambda (
4c20: 63 6f 75 6e 74 29 0a 09 20 20 20 28 73 65 74 21 count).. (set!
4c30: 20 72 65 73 20 63 6f 75 6e 74 29 29 0a 09 20 64 res count)).. d
4c40: 62 0a 09 20 22 53 45 4c 45 43 54 20 63 6f 75 6e b.. "SELECT coun
4c50: 74 28 69 64 29 20 46 52 4f 4d 20 74 65 73 74 73 t(id) FROM tests
4c60: 20 57 48 45 52 45 20 73 74 61 74 65 20 3d 20 27 WHERE state = '
4c70: 52 55 4e 4e 49 4e 47 27 20 4f 52 20 73 74 61 74 RUNNING' OR stat
4c80: 65 20 3d 20 27 4c 41 55 4e 43 48 45 44 27 20 4f e = 'LAUNCHED' O
4c90: 52 20 73 74 61 74 65 20 3d 20 27 52 45 4d 4f 54 R state = 'REMOT
4ca0: 45 48 4f 53 54 53 54 41 52 54 27 0a 20 20 20 20 EHOSTSTART'.
4cb0: 20 20 20 20 20 20 20 20 20 41 4e 44 20 74 65 73 AND tes
4cc0: 74 6e 61 6d 65 20 69 6e 20 28 53 45 4c 45 43 54 tname in (SELECT
4cd0: 20 74 65 73 74 6e 61 6d 65 20 46 52 4f 4d 20 74 testname FROM t
4ce0: 65 73 74 5f 6d 65 74 61 20 57 48 45 52 45 20 6a est_meta WHERE j
4cf0: 6f 62 67 72 6f 75 70 3d 3f 3b 22 0a 09 20 6a 6f obgroup=?;".. jo
4d00: 62 67 72 6f 75 70 29 0a 09 72 65 73 29 29 29 0a bgroup)..res))).
4d10: 0a 3b 3b 20 64 6f 6e 65 20 77 69 74 68 20 72 75 .;; done with ru
4d20: 6e 20 77 68 65 6e 3a 0a 3b 3b 20 20 20 30 20 74 n when:.;; 0 t
4d30: 65 73 74 73 20 69 6e 20 4c 41 55 4e 43 48 45 44 ests in LAUNCHED
4d40: 2c 20 4e 4f 54 5f 53 54 41 52 54 45 44 2c 20 52 , NOT_STARTED, R
4d50: 45 4d 4f 54 45 48 4f 53 54 53 54 41 52 54 2c 20 EMOTEHOSTSTART,
4d60: 52 55 4e 4e 49 4e 47 0a 28 64 65 66 69 6e 65 20 RUNNING.(define
4d70: 28 64 62 3a 65 73 74 69 6d 61 74 65 64 2d 74 65 (db:estimated-te
4d80: 73 74 73 2d 72 65 6d 61 69 6e 69 6e 67 20 64 62 sts-remaining db
4d90: 20 72 75 6e 2d 69 64 29 0a 20 20 28 6c 65 74 20 run-id). (let
4da0: 28 28 72 65 73 20 30 29 29 0a 20 20 20 20 28 73 ((res 0)). (s
4db0: 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d qlite3:for-each-
4dc0: 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 row. (lambda
4dd0: 20 28 63 6f 75 6e 74 29 0a 20 20 20 20 20 20 20 (count).
4de0: 28 73 65 74 21 20 72 65 73 20 63 6f 75 6e 74 29 (set! res count)
4df0: 29 0a 20 20 20 20 20 64 62 20 3b 3b 20 4e 42 2f ). db ;; NB/
4e00: 2f 20 4b 49 4c 4c 52 45 51 20 6d 65 61 6e 73 20 / KILLREQ means
4e10: 74 68 65 20 6a 6f 62 73 20 69 73 20 73 74 69 6c the jobs is stil
4e20: 6c 20 70 72 6f 62 61 62 6c 79 20 72 75 6e 6e 69 l probably runni
4e30: 6e 67 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20 ng. "SELECT
4e40: 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 74 count(id) FROM t
4e50: 65 73 74 73 20 57 48 45 52 45 20 73 74 61 74 65 ests WHERE state
4e60: 20 69 6e 20 28 27 4c 41 55 4e 43 48 45 44 27 2c in ('LAUNCHED',
4e70: 27 4e 4f 54 5f 53 54 41 52 54 45 44 27 2c 27 52 'NOT_STARTED','R
4e80: 45 4d 4f 54 45 48 4f 53 54 53 54 41 52 54 27 2c EMOTEHOSTSTART',
4e90: 27 52 55 4e 4e 49 4e 47 27 2c 27 4b 49 4c 4c 52 'RUNNING','KILLR
4ea0: 45 51 27 29 20 41 4e 44 20 72 75 6e 5f 69 64 3d EQ') AND run_id=
4eb0: 3f 3b 22 20 72 75 6e 2d 69 64 29 0a 20 20 20 20 ?;" run-id).
4ec0: 72 65 73 29 29 0a 0a 3b 3b 20 4e 42 2f 2f 20 53 res))..;; NB// S
4ed0: 79 6e 63 20 74 68 69 73 20 77 69 74 68 20 72 75 ync this with ru
4ee0: 6e 73 3a 67 65 74 2d 74 65 73 74 2d 69 6e 66 6f ns:get-test-info
4ef0: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 .(define (db:get
4f00: 2d 74 65 73 74 2d 69 6e 66 6f 20 64 62 20 72 75 -test-info db ru
4f10: 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 69 74 n-id testname it
4f20: 65 6d 2d 70 61 74 68 29 0a 20 20 28 6c 65 74 20 em-path). (let
4f30: 28 28 72 65 73 20 23 66 29 29 0a 20 20 20 20 28 ((res #f)). (
4f40: 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 sqlite3:for-each
4f50: 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 64 -row. (lambd
4f60: 61 20 28 69 64 20 72 75 6e 2d 69 64 20 74 65 73 a (id run-id tes
4f70: 74 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61 74 tname state stat
4f80: 75 73 20 65 76 65 6e 74 2d 74 69 6d 65 20 68 6f us event-time ho
4f90: 73 74 20 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 st cpuload diskf
4fa0: 72 65 65 20 75 6e 61 6d 65 20 72 75 6e 64 69 72 ree uname rundir
4fb0: 20 69 74 65 6d 2d 70 61 74 68 20 72 75 6e 5f 64 item-path run_d
4fc0: 75 72 61 74 69 6f 6e 20 66 69 6e 61 6c 5f 6c 6f uration final_lo
4fd0: 67 66 20 63 6f 6d 6d 65 6e 74 20 29 0a 20 20 20 gf comment ).
4fe0: 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28 76 (set! res (v
4ff0: 65 63 74 6f 72 20 69 64 20 72 75 6e 2d 69 64 20 ector id run-id
5000: 74 65 73 74 6e 61 6d 65 20 73 74 61 74 65 20 73 testname state s
5010: 74 61 74 75 73 20 65 76 65 6e 74 2d 74 69 6d 65 tatus event-time
5020: 20 68 6f 73 74 20 63 70 75 6c 6f 61 64 20 64 69 host cpuload di
5030: 73 6b 66 72 65 65 20 75 6e 61 6d 65 20 72 75 6e skfree uname run
5040: 64 69 72 20 69 74 65 6d 2d 70 61 74 68 20 72 75 dir item-path ru
5050: 6e 5f 64 75 72 61 74 69 6f 6e 20 66 69 6e 61 6c n_duration final
5060: 5f 6c 6f 67 66 20 63 6f 6d 6d 65 6e 74 20 29 29 _logf comment ))
5070: 29 0a 20 20 20 20 20 64 62 20 0a 20 20 20 20 20 ). db .
5080: 22 53 45 4c 45 43 54 20 69 64 2c 72 75 6e 5f 69 "SELECT id,run_i
5090: 64 2c 74 65 73 74 6e 61 6d 65 2c 73 74 61 74 65 d,testname,state
50a0: 2c 73 74 61 74 75 73 2c 65 76 65 6e 74 5f 74 69 ,status,event_ti
50b0: 6d 65 2c 68 6f 73 74 2c 63 70 75 6c 6f 61 64 2c me,host,cpuload,
50c0: 64 69 73 6b 66 72 65 65 2c 75 6e 61 6d 65 2c 72 diskfree,uname,r
50d0: 75 6e 64 69 72 2c 69 74 65 6d 5f 70 61 74 68 2c undir,item_path,
50e0: 72 75 6e 5f 64 75 72 61 74 69 6f 6e 2c 66 69 6e run_duration,fin
50f0: 61 6c 5f 6c 6f 67 66 2c 63 6f 6d 6d 65 6e 74 20 al_logf,comment
5100: 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 FROM tests WHERE
5110: 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 run_id=? AND te
5120: 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 stname=? AND ite
5130: 6d 5f 70 61 74 68 3d 3f 3b 22 0a 20 20 20 20 20 m_path=?;".
5140: 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 run-id testname
5150: 69 74 65 6d 2d 70 61 74 68 29 0a 20 20 20 20 72 item-path). r
5160: 65 73 29 29 0a 0a 3b 3b 20 47 65 74 20 74 65 73 es))..;; Get tes
5170: 74 20 64 61 74 61 20 75 73 69 6e 67 20 74 65 73 t data using tes
5180: 74 5f 69 64 0a 28 64 65 66 69 6e 65 20 28 64 62 t_id.(define (db
5190: 3a 67 65 74 2d 74 65 73 74 2d 64 61 74 61 2d 62 :get-test-data-b
51a0: 79 2d 69 64 20 64 62 20 74 65 73 74 2d 69 64 29 y-id db test-id)
51b0: 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20 23 66 . (let ((res #f
51c0: 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a )). (sqlite3:
51d0: 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 for-each-row.
51e0: 20 20 28 6c 61 6d 62 64 61 20 28 69 64 20 72 75 (lambda (id ru
51f0: 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 73 74 n-id testname st
5200: 61 74 65 20 73 74 61 74 75 73 20 65 76 65 6e 74 ate status event
5210: 2d 74 69 6d 65 20 68 6f 73 74 20 63 70 75 6c 6f -time host cpulo
5220: 61 64 20 64 69 73 6b 66 72 65 65 20 75 6e 61 6d ad diskfree unam
5230: 65 20 72 75 6e 64 69 72 20 69 74 65 6d 2d 70 61 e rundir item-pa
5240: 74 68 20 72 75 6e 5f 64 75 72 61 74 69 6f 6e 20 th run_duration
5250: 66 69 6e 61 6c 5f 6c 6f 67 66 20 63 6f 6d 6d 65 final_logf comme
5260: 6e 74 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 nt). (set!
5270: 20 72 65 73 20 28 76 65 63 74 6f 72 20 69 64 20 res (vector id
5280: 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 run-id testname
5290: 73 74 61 74 65 20 73 74 61 74 75 73 20 65 76 65 state status eve
52a0: 6e 74 2d 74 69 6d 65 20 68 6f 73 74 20 63 70 75 nt-time host cpu
52b0: 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20 75 6e load diskfree un
52c0: 61 6d 65 20 72 75 6e 64 69 72 20 69 74 65 6d 2d ame rundir item-
52d0: 70 61 74 68 20 72 75 6e 5f 64 75 72 61 74 69 6f path run_duratio
52e0: 6e 20 66 69 6e 61 6c 5f 6c 6f 67 66 20 63 6f 6d n final_logf com
52f0: 6d 65 6e 74 29 29 29 0a 20 20 20 20 20 64 62 20 ment))). db
5300: 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20 69 64 . "SELECT id
5310: 2c 72 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d 65 ,run_id,testname
5320: 2c 73 74 61 74 65 2c 73 74 61 74 75 73 2c 65 76 ,state,status,ev
5330: 65 6e 74 5f 74 69 6d 65 2c 68 6f 73 74 2c 63 70 ent_time,host,cp
5340: 75 6c 6f 61 64 2c 64 69 73 6b 66 72 65 65 2c 75 uload,diskfree,u
5350: 6e 61 6d 65 2c 72 75 6e 64 69 72 2c 69 74 65 6d name,rundir,item
5360: 5f 70 61 74 68 2c 72 75 6e 5f 64 75 72 61 74 69 _path,run_durati
5370: 6f 6e 2c 66 69 6e 61 6c 5f 6c 6f 67 66 2c 63 6f on,final_logf,co
5380: 6d 6d 65 6e 74 20 46 52 4f 4d 20 74 65 73 74 73 mment FROM tests
5390: 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 0a 20 20 WHERE id=?;".
53a0: 20 20 20 74 65 73 74 2d 69 64 29 0a 20 20 20 20 test-id).
53b0: 72 65 73 29 29 0a 0a 0a 28 64 65 66 69 6e 65 20 res))...(define
53c0: 28 64 62 3a 74 65 73 74 2d 73 65 74 2d 63 6f 6d (db:test-set-com
53d0: 6d 65 6e 74 20 64 62 20 72 75 6e 2d 69 64 20 74 ment db run-id t
53e0: 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 estname item-pat
53f0: 68 20 63 6f 6d 6d 65 6e 74 29 0a 20 20 28 73 71 h comment). (sq
5400: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 0a 20 lite3:execute .
5410: 20 20 64 62 20 0a 20 20 20 22 55 50 44 41 54 45 db . "UPDATE
5420: 20 74 65 73 74 73 20 53 45 54 20 63 6f 6d 6d 65 tests SET comme
5430: 6e 74 3d 3f 20 57 48 45 52 45 20 72 75 6e 5f 69 nt=? WHERE run_i
5440: 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 d=? AND testname
5450: 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 =? AND item_path
5460: 3d 3f 3b 22 0a 20 20 20 63 6f 6d 6d 65 6e 74 20 =?;". comment
5470: 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 run-id testname
5480: 69 74 65 6d 2d 70 61 74 68 29 29 0a 0a 3b 3b 0a item-path))..;;.
5490: 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74 (define (db:test
54a0: 2d 73 65 74 2d 72 75 6e 64 69 72 21 20 64 62 20 -set-rundir! db
54b0: 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 run-id testname
54c0: 69 74 65 6d 2d 70 61 74 68 20 72 75 6e 64 69 72 item-path rundir
54d0: 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 ). (sqlite3:exe
54e0: 63 75 74 65 20 0a 20 20 20 64 62 20 0a 20 20 20 cute . db .
54f0: 22 55 50 44 41 54 45 20 74 65 73 74 73 20 53 45 "UPDATE tests SE
5500: 54 20 72 75 6e 64 69 72 3d 3f 20 57 48 45 52 45 T rundir=? WHERE
5510: 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 run_id=? AND te
5520: 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 stname=? AND ite
5530: 6d 5f 70 61 74 68 3d 3f 3b 22 0a 20 20 20 72 75 m_path=?;". ru
5540: 6e 64 69 72 20 72 75 6e 2d 69 64 20 74 65 73 74 ndir run-id test
5550: 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 29 name item-path))
5560: 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ..;;============
5570: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5580: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5590: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
55a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 54 65 ==========.;; Te
55b0: 73 74 73 20 6d 65 74 61 20 64 61 74 61 0a 3b 3b sts meta data.;;
55c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
55d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
55e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
55f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5600: 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 72 65 61 64 20 ======..;; read
5610: 74 68 65 20 72 65 63 6f 72 64 20 67 69 76 65 6e the record given
5620: 20 61 20 74 65 73 74 6e 61 6d 65 0a 28 64 65 66 a testname.(def
5630: 69 6e 65 20 28 64 62 3a 74 65 73 74 6d 65 74 61 ine (db:testmeta
5640: 2d 67 65 74 2d 72 65 63 6f 72 64 20 64 62 20 74 -get-record db t
5650: 65 73 74 6e 61 6d 65 29 0a 20 20 28 6c 65 74 20 estname). (let
5660: 28 28 72 65 73 20 23 66 29 29 0a 20 20 20 20 28 ((res #f)). (
5670: 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 sqlite3:for-each
5680: 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 64 -row. (lambd
5690: 61 20 28 69 64 20 74 65 73 74 6e 61 6d 65 20 61 a (id testname a
56a0: 75 74 68 6f 72 20 6f 77 6e 65 72 20 64 65 73 63 uthor owner desc
56b0: 72 69 70 74 69 6f 6e 20 72 65 76 69 65 77 65 64 ription reviewed
56c0: 20 69 74 65 72 61 74 65 64 20 61 76 67 5f 72 75 iterated avg_ru
56d0: 6e 74 69 6d 65 20 61 76 67 5f 64 69 73 6b 20 74 ntime avg_disk t
56e0: 61 67 73 29 0a 20 20 20 20 20 20 20 28 73 65 74 ags). (set
56f0: 21 20 72 65 73 20 28 76 65 63 74 6f 72 20 69 64 ! res (vector id
5700: 20 74 65 73 74 6e 61 6d 65 20 61 75 74 68 6f 72 testname author
5710: 20 6f 77 6e 65 72 20 64 65 73 63 72 69 70 74 69 owner descripti
5720: 6f 6e 20 72 65 76 69 65 77 65 64 20 69 74 65 72 on reviewed iter
5730: 61 74 65 64 20 61 76 67 5f 72 75 6e 74 69 6d 65 ated avg_runtime
5740: 20 61 76 67 5f 64 69 73 6b 20 74 61 67 73 29 29 avg_disk tags))
5750: 29 0a 20 20 20 20 20 64 62 20 22 53 45 4c 45 43 ). db "SELEC
5760: 54 20 69 64 2c 74 65 73 74 6e 61 6d 65 2c 61 75 T id,testname,au
5770: 74 68 6f 72 2c 6f 77 6e 65 72 2c 64 65 73 63 72 thor,owner,descr
5780: 69 70 74 69 6f 6e 2c 72 65 76 69 65 77 65 64 2c iption,reviewed,
5790: 69 74 65 72 61 74 65 64 2c 61 76 67 5f 72 75 6e iterated,avg_run
57a0: 74 69 6d 65 2c 61 76 67 5f 64 69 73 6b 2c 74 61 time,avg_disk,ta
57b0: 67 73 20 46 52 4f 4d 20 74 65 73 74 5f 6d 65 74 gs FROM test_met
57c0: 61 20 57 48 45 52 45 20 74 65 73 74 6e 61 6d 65 a WHERE testname
57d0: 3d 3f 3b 22 0a 20 20 20 20 20 74 65 73 74 6e 61 =?;". testna
57e0: 6d 65 29 0a 20 20 20 20 72 65 73 29 29 0a 0a 3b me). res))..;
57f0: 3b 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 72 ; create a new r
5800: 65 63 6f 72 64 20 66 6f 72 20 61 20 67 69 76 65 ecord for a give
5810: 6e 20 74 65 73 74 6e 61 6d 65 0a 28 64 65 66 69 n testname.(defi
5820: 6e 65 20 28 64 62 3a 74 65 73 74 6d 65 74 61 2d ne (db:testmeta-
5830: 61 64 64 2d 72 65 63 6f 72 64 20 64 62 20 74 65 add-record db te
5840: 73 74 6e 61 6d 65 29 0a 20 20 28 73 71 6c 69 74 stname). (sqlit
5850: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 49 e3:execute db "I
5860: 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 NSERT OR IGNORE
5870: 49 4e 54 4f 20 74 65 73 74 5f 6d 65 74 61 20 28 INTO test_meta (
5880: 74 65 73 74 6e 61 6d 65 2c 61 75 74 68 6f 72 2c testname,author,
5890: 6f 77 6e 65 72 2c 64 65 73 63 72 69 70 74 69 6f owner,descriptio
58a0: 6e 2c 72 65 76 69 65 77 65 64 2c 69 74 65 72 61 n,reviewed,itera
58b0: 74 65 64 2c 61 76 67 5f 72 75 6e 74 69 6d 65 2c ted,avg_runtime,
58c0: 61 76 67 5f 64 69 73 6b 2c 74 61 67 73 29 20 56 avg_disk,tags) V
58d0: 41 4c 55 45 53 20 28 3f 2c 27 27 2c 27 27 2c 27 ALUES (?,'','','
58e0: 27 2c 27 27 2c 27 27 2c 27 27 2c 27 27 2c 27 27 ','','','','',''
58f0: 29 3b 22 20 74 65 73 74 6e 61 6d 65 29 29 0a 0a );" testname))..
5900: 3b 3b 20 75 70 64 61 74 65 20 6f 6e 65 20 6f 66 ;; update one of
5910: 20 74 68 65 20 74 65 73 74 6d 65 74 61 20 66 69 the testmeta fi
5920: 65 6c 64 73 0a 28 64 65 66 69 6e 65 20 28 64 62 elds.(define (db
5930: 3a 74 65 73 74 6d 65 74 61 2d 75 70 64 61 74 65 :testmeta-update
5940: 2d 66 69 65 6c 64 20 64 62 20 74 65 73 74 6e 61 -field db testna
5950: 6d 65 20 66 69 65 6c 64 20 76 61 6c 75 65 29 0a me field value).
5960: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 (sqlite3:execu
5970: 74 65 20 64 62 20 28 63 6f 6e 63 20 22 55 50 44 te db (conc "UPD
5980: 41 54 45 20 74 65 73 74 5f 6d 65 74 61 20 53 45 ATE test_meta SE
5990: 54 20 22 20 66 69 65 6c 64 20 22 3d 3f 20 57 48 T " field "=? WH
59a0: 45 52 45 20 74 65 73 74 6e 61 6d 65 3d 3f 3b 22 ERE testname=?;"
59b0: 29 20 76 61 6c 75 65 20 74 65 73 74 6e 61 6d 65 ) value testname
59c0: 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ))..;;==========
59d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
59e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
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 0a 3b 3b 20 ============.;;
5a10: 54 20 45 20 53 20 54 20 20 20 44 20 41 20 54 20 T E S T D A T
5a20: 41 20 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d A .;;===========
5a30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5a40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5a50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5a60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65 ===========..(de
5a70: 66 69 6e 65 20 28 64 62 3a 63 73 76 2d 3e 74 65 fine (db:csv->te
5a80: 73 74 2d 64 61 74 61 20 64 62 20 74 65 73 74 2d st-data db test-
5a90: 69 64 20 63 73 76 64 61 74 61 29 0a 20 20 28 64 id csvdata). (d
5aa0: 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22 74 65 ebug:print 4 "te
5ab0: 73 74 2d 69 64 20 22 20 74 65 73 74 2d 69 64 20 st-id " test-id
5ac0: 22 2c 20 63 73 76 64 61 74 61 3a 20 22 20 63 73 ", csvdata: " cs
5ad0: 76 64 61 74 61 29 0a 20 20 28 6c 65 74 20 28 28 vdata). (let ((
5ae0: 63 73 76 6c 69 73 74 20 28 63 73 76 2d 3e 6c 69 csvlist (csv->li
5af0: 73 74 20 28 6d 61 6b 65 2d 63 73 76 2d 72 65 61 st (make-csv-rea
5b00: 64 65 72 0a 09 09 09 20 20 20 20 20 28 6f 70 65 der.... (ope
5b10: 6e 2d 69 6e 70 75 74 2d 73 74 72 69 6e 67 20 63 n-input-string c
5b20: 73 76 64 61 74 61 29 0a 09 09 09 20 20 20 20 20 svdata)....
5b30: 27 28 28 73 74 72 69 70 2d 6c 65 61 64 69 6e 67 '((strip-leading
5b40: 2d 77 68 69 74 65 73 70 61 63 65 3f 20 23 74 29 -whitespace? #t)
5b50: 0a 09 09 09 20 20 20 20 20 20 20 28 73 74 72 69 .... (stri
5b60: 70 2d 74 72 61 69 6c 69 6e 67 2d 77 68 69 74 65 p-trailing-white
5b70: 73 70 61 63 65 3f 20 23 74 29 29 20 29 29 29 29 space? #t)) ))))
5b80: 20 3b 3b 20 28 63 73 76 2d 3e 6c 69 73 74 20 63 ;; (csv->list c
5b90: 73 76 64 61 74 61 29 29 29 0a 20 20 20 20 28 66 svdata))). (f
5ba0: 6f 72 2d 65 61 63 68 20 0a 20 20 20 20 20 28 6c or-each . (l
5bb0: 61 6d 62 64 61 20 28 63 73 76 72 6f 77 29 0a 20 ambda (csvrow).
5bc0: 20 20 20 20 20 20 28 6c 65 74 2a 20 28 28 70 61 (let* ((pa
5bd0: 64 64 65 64 2d 72 6f 77 20 20 28 74 61 6b 65 20 dded-row (take
5be0: 28 61 70 70 65 6e 64 20 63 73 76 72 6f 77 20 28 (append csvrow (
5bf0: 6c 69 73 74 20 23 66 20 23 66 20 23 66 20 23 66 list #f #f #f #f
5c00: 20 23 66 20 23 66 20 23 66 20 23 66 20 23 66 29 #f #f #f #f #f)
5c10: 29 20 39 29 29 0a 09 20 20 20 20 20 20 28 63 61 ) 9)).. (ca
5c20: 74 65 67 6f 72 79 20 20 20 20 28 6c 69 73 74 2d tegory (list-
5c30: 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20 30 ref padded-row 0
5c40: 29 29 0a 09 20 20 20 20 20 20 28 76 61 72 69 61 )).. (varia
5c50: 62 6c 65 20 20 20 20 28 6c 69 73 74 2d 72 65 66 ble (list-ref
5c60: 20 70 61 64 64 65 64 2d 72 6f 77 20 31 29 29 0a padded-row 1)).
5c70: 09 20 20 20 20 20 20 28 76 61 6c 75 65 20 20 20 . (value
5c80: 20 20 20 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 (any->number
5c90: 2d 69 66 2d 70 6f 73 73 69 62 6c 65 20 28 6c 69 -if-possible (li
5ca0: 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f st-ref padded-ro
5cb0: 77 20 32 29 29 29 0a 09 20 20 20 20 20 20 28 65 w 2))).. (e
5cc0: 78 70 65 63 74 65 64 20 20 20 20 28 61 6e 79 2d xpected (any-
5cd0: 3e 6e 75 6d 62 65 72 2d 69 66 2d 70 6f 73 73 69 >number-if-possi
5ce0: 62 6c 65 20 28 6c 69 73 74 2d 72 65 66 20 70 61 ble (list-ref pa
5cf0: 64 64 65 64 2d 72 6f 77 20 33 29 29 29 0a 09 20 dded-row 3)))..
5d00: 20 20 20 20 20 28 74 6f 6c 20 20 20 20 20 20 20 (tol
5d10: 20 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 2d 69 (any->number-i
5d20: 66 2d 70 6f 73 73 69 62 6c 65 20 28 6c 69 73 74 f-possible (list
5d30: 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20 -ref padded-row
5d40: 34 29 29 29 20 3b 3b 20 3e 2c 20 3c 2c 20 3e 3d 4))) ;; >, <, >=
5d50: 2c 20 3c 3d 2c 20 6f 72 20 61 20 6e 75 6d 62 65 , <=, or a numbe
5d60: 72 0a 09 20 20 20 20 20 20 28 75 6e 69 74 73 20 r.. (units
5d70: 20 20 20 20 20 20 28 6c 69 73 74 2d 72 65 66 20 (list-ref
5d80: 70 61 64 64 65 64 2d 72 6f 77 20 35 29 29 0a 09 padded-row 5))..
5d90: 20 20 20 20 20 20 28 63 6f 6d 6d 65 6e 74 20 20 (comment
5da0: 20 20 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64 (list-ref pad
5db0: 64 65 64 2d 72 6f 77 20 36 29 29 0a 09 20 20 20 ded-row 6))..
5dc0: 20 20 20 28 73 74 61 74 75 73 20 20 20 20 20 20 (status
5dd0: 28 6c 65 74 20 28 28 73 20 28 6c 69 73 74 2d 72 (let ((s (list-r
5de0: 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20 37 29 ef padded-row 7)
5df0: 29 29 0a 09 09 09 20 20 20 20 20 28 69 66 20 28 )).... (if (
5e00: 61 6e 64 20 28 73 74 72 69 6e 67 3f 20 73 29 28 and (string? s)(
5e10: 6f 72 20 28 73 74 72 69 6e 67 2d 6d 61 74 63 68 or (string-match
5e20: 20 28 72 65 67 65 78 70 20 22 5e 5c 5c 73 2a 24 (regexp "^\\s*$
5e30: 22 29 20 73 29 0a 09 09 09 09 09 09 20 20 20 20 ") s).......
5e40: 20 28 73 74 72 69 6e 67 2d 6d 61 74 63 68 20 28 (string-match (
5e50: 72 65 67 65 78 70 20 22 5e 6e 2f 61 24 22 29 20 regexp "^n/a$")
5e60: 73 29 29 29 0a 09 09 09 09 20 23 66 0a 09 09 09 s)))..... #f....
5e70: 09 20 73 29 29 29 20 3b 3b 20 69 66 20 73 70 65 . s))) ;; if spe
5e80: 63 69 66 69 65 64 20 6f 6e 20 74 68 65 20 69 6e cified on the in
5e90: 70 75 74 20 74 68 65 6e 20 75 73 65 2c 20 65 6c put then use, el
5ea0: 73 65 20 63 61 6c 63 75 6c 61 74 65 0a 09 20 20 se calculate..
5eb0: 20 20 20 20 28 74 79 70 65 20 20 20 20 20 20 20 (type
5ec0: 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65 (list-ref padde
5ed0: 64 2d 72 6f 77 20 38 29 29 29 0a 09 20 3b 3b 20 d-row 8))).. ;;
5ee0: 6c 6f 6f 6b 20 75 70 20 65 78 70 65 63 74 65 64 look up expected
5ef0: 2c 74 6f 6c 2c 75 6e 69 74 73 20 66 72 6f 6d 20 ,tol,units from
5f00: 70 72 65 76 69 6f 75 73 20 62 65 73 74 20 66 69 previous best fi
5f10: 74 20 74 65 73 74 20 69 66 20 74 68 65 79 20 61 t test if they a
5f20: 72 65 20 61 6c 6c 20 65 69 74 68 65 72 20 23 66 re all either #f
5f30: 20 6f 72 20 27 27 0a 09 20 28 64 65 62 75 67 3a or ''.. (debug:
5f40: 70 72 69 6e 74 20 34 20 22 42 45 46 4f 52 45 3a print 4 "BEFORE:
5f50: 20 63 61 74 65 67 6f 72 79 3a 20 22 20 63 61 74 category: " cat
5f60: 65 67 6f 72 79 20 22 20 76 61 72 69 61 62 6c 65 egory " variable
5f70: 3a 20 22 20 76 61 72 69 61 62 6c 65 20 22 20 76 : " variable " v
5f80: 61 6c 75 65 3a 20 22 20 76 61 6c 75 65 20 0a 09 alue: " value ..
5f90: 09 20 20 20 20 20 20 22 2c 20 65 78 70 65 63 74 . ", expect
5fa0: 65 64 3a 20 22 20 65 78 70 65 63 74 65 64 20 22 ed: " expected "
5fb0: 20 74 6f 6c 3a 20 22 20 74 6f 6c 20 22 20 75 6e tol: " tol " un
5fc0: 69 74 73 3a 20 22 20 75 6e 69 74 73 20 22 20 73 its: " units " s
5fd0: 74 61 74 75 73 3a 20 22 20 73 74 61 74 75 73 20 tatus: " status
5fe0: 22 20 63 6f 6d 6d 65 6e 74 3a 20 22 20 63 6f 6d " comment: " com
5ff0: 6d 65 6e 74 20 22 20 74 79 70 65 3a 20 22 20 74 ment " type: " t
6000: 79 70 65 29 0a 0a 09 20 28 69 66 20 28 61 6e 64 ype)... (if (and
6010: 20 28 6f 72 20 28 6e 6f 74 20 65 78 70 65 63 74 (or (not expect
6020: 65 64 29 28 65 71 75 61 6c 3f 20 65 78 70 65 63 ed)(equal? expec
6030: 74 65 64 20 22 22 29 29 0a 09 09 20 20 28 6f 72 ted ""))... (or
6040: 20 28 6e 6f 74 20 74 6f 6c 29 20 20 20 20 20 28 (not tol) (
6050: 65 71 75 61 6c 3f 20 65 78 70 65 63 74 65 64 20 equal? expected
6060: 22 22 29 29 0a 09 09 20 20 28 6f 72 20 28 6e 6f ""))... (or (no
6070: 74 20 75 6e 69 74 73 29 20 20 20 28 65 71 75 61 t units) (equa
6080: 6c 3f 20 65 78 70 65 63 74 65 64 20 22 22 29 29 l? expected ""))
6090: 29 0a 09 20 20 20 20 20 28 6c 65 74 2d 76 61 6c ).. (let-val
60a0: 75 65 73 20 28 28 28 6e 65 77 2d 65 78 70 65 63 ues (((new-expec
60b0: 74 65 64 20 6e 65 77 2d 74 6f 6c 20 6e 65 77 2d ted new-tol new-
60c0: 75 6e 69 74 73 29 28 64 62 3a 67 65 74 2d 70 72 units)(db:get-pr
60d0: 65 76 2d 74 6f 6c 2d 66 6f 72 2d 74 65 73 74 20 ev-tol-for-test
60e0: 64 62 20 74 65 73 74 2d 69 64 20 63 61 74 65 67 db test-id categ
60f0: 6f 72 79 20 76 61 72 69 61 62 6c 65 29 29 29 0a ory variable))).
6100: 09 09 09 20 28 73 65 74 21 20 65 78 70 65 63 74 ... (set! expect
6110: 65 64 20 6e 65 77 2d 65 78 70 65 63 74 65 64 29 ed new-expected)
6120: 0a 09 09 09 20 28 73 65 74 21 20 74 6f 6c 20 20 .... (set! tol
6130: 20 20 20 20 6e 65 77 2d 74 6f 6c 29 0a 09 09 09 new-tol)....
6140: 20 28 73 65 74 21 20 75 6e 69 74 73 20 20 20 20 (set! units
6150: 6e 65 77 2d 75 6e 69 74 73 29 29 29 0a 0a 09 20 new-units)))...
6160: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22 (debug:print 4 "
6170: 41 46 54 45 52 3a 20 20 63 61 74 65 67 6f 72 79 AFTER: category
6180: 3a 20 22 20 63 61 74 65 67 6f 72 79 20 22 20 76 : " category " v
6190: 61 72 69 61 62 6c 65 3a 20 22 20 76 61 72 69 61 ariable: " varia
61a0: 62 6c 65 20 22 20 76 61 6c 75 65 3a 20 22 20 76 ble " value: " v
61b0: 61 6c 75 65 20 0a 09 09 20 20 20 20 20 20 22 2c alue ... ",
61c0: 20 65 78 70 65 63 74 65 64 3a 20 22 20 65 78 70 expected: " exp
61d0: 65 63 74 65 64 20 22 20 74 6f 6c 3a 20 22 20 74 ected " tol: " t
61e0: 6f 6c 20 22 20 75 6e 69 74 73 3a 20 22 20 75 6e ol " units: " un
61f0: 69 74 73 20 22 20 73 74 61 74 75 73 3a 20 22 20 its " status: "
6200: 73 74 61 74 75 73 20 22 20 63 6f 6d 6d 65 6e 74 status " comment
6210: 3a 20 22 20 63 6f 6d 6d 65 6e 74 29 0a 09 20 3b : " comment).. ;
6220: 3b 20 63 61 6c 63 75 6c 61 74 65 20 73 74 61 74 ; calculate stat
6230: 75 73 20 69 66 20 4e 4f 54 20 73 70 65 63 69 66 us if NOT specif
6240: 69 65 64 0a 09 20 28 69 66 20 28 61 6e 64 20 28 ied.. (if (and (
6250: 6e 6f 74 20 73 74 61 74 75 73 29 28 6e 75 6d 62 not status)(numb
6260: 65 72 3f 20 65 78 70 65 63 74 65 64 29 28 6e 75 er? expected)(nu
6270: 6d 62 65 72 3f 20 76 61 6c 75 65 29 29 20 3b 3b mber? value)) ;;
6280: 20 6e 65 65 64 20 65 78 70 65 63 74 65 64 20 61 need expected a
6290: 6e 64 20 76 61 6c 75 65 20 74 6f 20 62 65 20 6e nd value to be n
62a0: 75 6d 62 65 72 73 0a 09 20 20 20 20 20 28 69 66 umbers.. (if
62b0: 20 28 6e 75 6d 62 65 72 3f 20 74 6f 6c 29 20 3b (number? tol) ;
62c0: 3b 20 69 66 20 74 6f 6c 20 69 73 20 61 20 6e 75 ; if tol is a nu
62d0: 6d 62 65 72 20 74 68 65 6e 20 77 65 20 64 6f 20 mber then we do
62e0: 74 68 65 20 73 74 61 6e 64 61 72 64 20 63 6f 6d the standard com
62f0: 70 61 72 69 73 6f 6e 0a 09 09 20 28 6c 65 74 2a parison... (let*
6300: 20 28 28 6d 61 78 2d 76 61 6c 20 28 2b 20 65 78 ((max-val (+ ex
6310: 70 65 63 74 65 64 20 74 6f 6c 29 29 0a 09 09 09 pected tol))....
6320: 28 6d 69 6e 2d 76 61 6c 20 28 2d 20 65 78 70 65 (min-val (- expe
6330: 63 74 65 64 20 74 6f 6c 29 29 0a 09 09 09 28 72 cted tol))....(r
6340: 65 73 75 6c 74 20 20 28 61 6e 64 20 28 3e 3d 20 esult (and (>=
6350: 20 76 61 6c 75 65 20 6d 69 6e 2d 76 61 6c 29 28 value min-val)(
6360: 3c 3d 20 76 61 6c 75 65 20 6d 61 78 2d 76 61 6c <= value max-val
6370: 29 29 29 29 0a 09 09 20 20 20 28 64 65 62 75 67 ))))... (debug
6380: 3a 70 72 69 6e 74 20 34 20 22 6d 61 78 2d 76 61 :print 4 "max-va
6390: 6c 3a 20 22 20 6d 61 78 2d 76 61 6c 20 22 20 6d l: " max-val " m
63a0: 69 6e 2d 76 61 6c 3a 20 22 20 6d 69 6e 2d 76 61 in-val: " min-va
63b0: 6c 20 22 20 72 65 73 75 6c 74 3a 20 22 20 72 65 l " result: " re
63c0: 73 75 6c 74 29 0a 09 09 20 20 20 28 73 65 74 21 sult)... (set!
63d0: 20 73 74 61 74 75 73 20 28 69 66 20 72 65 73 75 status (if resu
63e0: 6c 74 20 22 70 61 73 73 22 20 22 66 61 69 6c 22 lt "pass" "fail"
63f0: 29 29 29 0a 09 09 20 28 73 65 74 21 20 73 74 61 )))... (set! sta
6400: 74 75 73 20 3b 3b 20 4e 42 2f 2f 20 6e 65 65 64 tus ;; NB// need
6410: 20 74 6f 20 61 73 73 65 73 73 20 65 61 63 68 20 to assess each
6420: 6f 6e 65 20 28 69 2e 65 2e 20 6e 6f 74 20 72 65 one (i.e. not re
6430: 74 75 72 6e 20 6f 70 65 72 61 74 6f 72 20 73 69 turn operator si
6440: 6e 63 65 20 6e 65 65 64 20 74 6f 20 61 63 74 20 nce need to act
6450: 69 66 20 6e 6f 74 20 76 61 6c 69 64 20 6f 70 2e if not valid op.
6460: 0a 09 09 20 20 20 20 20 20 20 28 63 61 73 65 20 ... (case
6470: 28 73 74 72 69 6e 67 2d 3e 73 79 6d 62 6f 6c 20 (string->symbol
6480: 74 6f 6c 29 20 3b 3b 20 74 6f 6c 20 73 68 6f 75 tol) ;; tol shou
6490: 6c 64 20 62 65 20 3e 2c 20 3c 2c 20 3e 3d 2c 20 ld be >, <, >=,
64a0: 3c 3d 0a 09 09 09 20 28 28 3e 29 20 20 28 69 66 <=.... ((>) (if
64b0: 20 28 3e 20 20 76 61 6c 75 65 20 65 78 70 65 63 (> value expec
64c0: 74 65 64 29 20 22 70 61 73 73 22 20 22 66 61 69 ted) "pass" "fai
64d0: 6c 22 29 29 0a 09 09 09 20 28 28 3c 29 20 20 28 l")).... ((<) (
64e0: 69 66 20 28 3c 20 20 76 61 6c 75 65 20 65 78 70 if (< value exp
64f0: 65 63 74 65 64 29 20 22 70 61 73 73 22 20 22 66 ected) "pass" "f
6500: 61 69 6c 22 29 29 0a 09 09 09 20 28 28 3e 3d 29 ail")).... ((>=)
6510: 20 28 69 66 20 28 3e 3d 20 76 61 6c 75 65 20 65 (if (>= value e
6520: 78 70 65 63 74 65 64 29 20 22 70 61 73 73 22 20 xpected) "pass"
6530: 22 66 61 69 6c 22 29 29 0a 09 09 09 20 28 28 3c "fail")).... ((<
6540: 3d 29 20 28 69 66 20 28 3c 3d 20 76 61 6c 75 65 =) (if (<= value
6550: 20 65 78 70 65 63 74 65 64 29 20 22 70 61 73 73 expected) "pass
6560: 22 20 22 66 61 69 6c 22 29 29 0a 09 09 09 20 28 " "fail")).... (
6570: 65 6c 73 65 20 28 63 6f 6e 63 20 22 45 52 52 4f else (conc "ERRO
6580: 52 3a 20 62 61 64 20 74 6f 6c 20 63 6f 6d 70 61 R: bad tol compa
6590: 72 61 74 6f 72 20 22 20 74 6f 6c 29 29 29 29 29 rator " tol)))))
65a0: 29 0a 09 20 28 64 65 62 75 67 3a 70 72 69 6e 74 ).. (debug:print
65b0: 20 34 20 22 41 46 54 45 52 32 3a 20 63 61 74 65 4 "AFTER2: cate
65c0: 67 6f 72 79 3a 20 22 20 63 61 74 65 67 6f 72 79 gory: " category
65d0: 20 22 20 76 61 72 69 61 62 6c 65 3a 20 22 20 76 " variable: " v
65e0: 61 72 69 61 62 6c 65 20 22 20 76 61 6c 75 65 3a ariable " value:
65f0: 20 22 20 76 61 6c 75 65 20 0a 09 09 20 20 20 20 " value ...
6600: 20 20 22 2c 20 65 78 70 65 63 74 65 64 3a 20 22 ", expected: "
6610: 20 65 78 70 65 63 74 65 64 20 22 20 74 6f 6c 3a expected " tol:
6620: 20 22 20 74 6f 6c 20 22 20 75 6e 69 74 73 3a 20 " tol " units:
6630: 22 20 75 6e 69 74 73 20 22 20 73 74 61 74 75 73 " units " status
6640: 3a 20 22 20 73 74 61 74 75 73 20 22 20 63 6f 6d : " status " com
6650: 6d 65 6e 74 3a 20 22 20 63 6f 6d 6d 65 6e 74 29 ment: " comment)
6660: 0a 09 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 .. (sqlite3:exec
6670: 75 74 65 20 64 62 20 22 49 4e 53 45 52 54 20 4f ute db "INSERT O
6680: 52 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 R REPLACE INTO t
6690: 65 73 74 5f 64 61 74 61 20 28 74 65 73 74 5f 69 est_data (test_i
66a0: 64 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 69 61 d,category,varia
66b0: 62 6c 65 2c 76 61 6c 75 65 2c 65 78 70 65 63 74 ble,value,expect
66c0: 65 64 2c 74 6f 6c 2c 75 6e 69 74 73 2c 63 6f 6d ed,tol,units,com
66d0: 6d 65 6e 74 2c 73 74 61 74 75 73 2c 74 79 70 65 ment,status,type
66e0: 29 20 56 41 4c 55 45 53 20 28 3f 2c 3f 2c 3f 2c ) VALUES (?,?,?,
66f0: 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 29 3b 22 ?,?,?,?,?,?,?);"
6700: 0a 09 09 09 20 20 74 65 73 74 2d 69 64 20 63 61 .... test-id ca
6710: 74 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65 20 tegory variable
6720: 76 61 6c 75 65 20 65 78 70 65 63 74 65 64 20 74 value expected t
6730: 6f 6c 20 75 6e 69 74 73 20 28 69 66 20 63 6f 6d ol units (if com
6740: 6d 65 6e 74 20 63 6f 6d 6d 65 6e 74 20 22 22 29 ment comment "")
6750: 20 73 74 61 74 75 73 20 74 79 70 65 29 29 29 0a status type))).
6760: 20 20 20 20 20 63 73 76 6c 69 73 74 29 29 29 0a csvlist))).
6770: 0a 3b 3b 20 67 65 74 20 61 20 6c 69 73 74 20 6f .;; get a list o
6780: 66 20 74 65 73 74 5f 64 61 74 61 20 72 65 63 6f f test_data reco
6790: 72 64 73 20 6d 61 74 63 68 69 6e 67 20 63 61 74 rds matching cat
67a0: 65 67 6f 72 79 70 61 74 74 0a 28 64 65 66 69 6e egorypatt.(defin
67b0: 65 20 28 64 62 3a 72 65 61 64 2d 74 65 73 74 2d e (db:read-test-
67c0: 64 61 74 61 20 64 62 20 74 65 73 74 2d 69 64 20 data db test-id
67d0: 63 61 74 65 67 6f 72 79 70 61 74 74 29 0a 20 20 categorypatt).
67e0: 28 6c 65 74 20 28 28 72 65 73 20 27 28 29 29 29 (let ((res '()))
67f0: 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f . (sqlite3:fo
6800: 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20 20 20 r-each-row .
6810: 20 28 6c 61 6d 62 64 61 20 28 69 64 20 74 65 73 (lambda (id tes
6820: 74 5f 69 64 20 63 61 74 65 67 6f 72 79 20 76 61 t_id category va
6830: 72 69 61 62 6c 65 20 76 61 6c 75 65 20 65 78 70 riable value exp
6840: 65 63 74 65 64 20 74 6f 6c 20 75 6e 69 74 73 20 ected tol units
6850: 63 6f 6d 6d 65 6e 74 20 73 74 61 74 75 73 20 74 comment status t
6860: 79 70 65 29 0a 20 20 20 20 20 20 20 28 73 65 74 ype). (set
6870: 21 20 72 65 73 20 28 63 6f 6e 73 20 28 76 65 63 ! res (cons (vec
6880: 74 6f 72 20 69 64 20 74 65 73 74 5f 69 64 20 63 tor id test_id c
6890: 61 74 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65 ategory variable
68a0: 20 76 61 6c 75 65 20 65 78 70 65 63 74 65 64 20 value expected
68b0: 74 6f 6c 20 75 6e 69 74 73 20 63 6f 6d 6d 65 6e tol units commen
68c0: 74 20 73 74 61 74 75 73 20 74 79 70 65 29 20 72 t status type) r
68d0: 65 73 29 29 29 0a 20 20 20 20 20 64 62 0a 20 20 es))). db.
68e0: 20 20 20 22 53 45 4c 45 43 54 20 69 64 2c 74 65 "SELECT id,te
68f0: 73 74 5f 69 64 2c 63 61 74 65 67 6f 72 79 2c 76 st_id,category,v
6900: 61 72 69 61 62 6c 65 2c 76 61 6c 75 65 2c 65 78 ariable,value,ex
6910: 70 65 63 74 65 64 2c 74 6f 6c 2c 75 6e 69 74 73 pected,tol,units
6920: 2c 63 6f 6d 6d 65 6e 74 2c 73 74 61 74 75 73 2c ,comment,status,
6930: 74 79 70 65 20 46 52 4f 4d 20 74 65 73 74 5f 64 type FROM test_d
6940: 61 74 61 20 57 48 45 52 45 20 74 65 73 74 5f 69 ata WHERE test_i
6950: 64 3d 3f 20 41 4e 44 20 63 61 74 65 67 6f 72 79 d=? AND category
6960: 20 4c 49 4b 45 20 3f 20 4f 52 44 45 52 20 42 59 LIKE ? ORDER BY
6970: 20 63 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62 category,variab
6980: 6c 65 3b 22 20 74 65 73 74 2d 69 64 20 63 61 74 le;" test-id cat
6990: 65 67 6f 72 79 70 61 74 74 29 0a 20 20 20 20 28 egorypatt). (
69a0: 72 65 76 65 72 73 65 20 72 65 73 29 29 29 0a 0a reverse res)))..
69b0: 28 64 65 66 69 6e 65 20 28 64 62 3a 6c 6f 61 64 (define (db:load
69c0: 2d 74 65 73 74 2d 64 61 74 61 20 64 62 20 72 75 -test-data db ru
69d0: 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 n-id test-name i
69e0: 74 65 6d 64 61 74 29 0a 20 20 28 6c 65 74 2a 20 temdat). (let*
69f0: 28 28 69 74 65 6d 2d 70 61 74 68 20 28 69 74 65 ((item-path (ite
6a00: 6d 2d 6c 69 73 74 2d 3e 70 61 74 68 20 69 74 65 m-list->path ite
6a10: 6d 64 61 74 29 29 0a 09 20 28 74 65 73 74 64 61 mdat)).. (testda
6a20: 74 20 28 64 62 3a 67 65 74 2d 74 65 73 74 2d 69 t (db:get-test-i
6a30: 6e 66 6f 20 64 62 20 72 75 6e 2d 69 64 20 74 65 nfo db run-id te
6a40: 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 st-name item-pat
6a50: 68 29 29 0a 09 20 28 74 65 73 74 2d 69 64 20 28 h)).. (test-id (
6a60: 69 66 20 74 65 73 74 64 61 74 20 28 64 62 3a 74 if testdat (db:t
6a70: 65 73 74 2d 67 65 74 2d 69 64 20 74 65 73 74 64 est-get-id testd
6a80: 61 74 29 20 23 66 29 29 29 0a 20 20 20 20 3b 3b at) #f))). ;;
6a90: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 31 20 (debug:print 1
6aa0: 22 45 6e 74 65 72 20 72 65 63 6f 72 64 73 20 74 "Enter records t
6ab0: 6f 20 69 6e 73 65 72 74 20 69 6e 20 74 68 65 20 o insert in the
6ac0: 74 65 73 74 5f 64 61 74 61 20 74 61 62 6c 65 2c test_data table,
6ad0: 20 73 65 76 65 6e 20 66 69 65 6c 64 73 2c 20 63 seven fields, c
6ae0: 6f 6d 6d 61 20 73 65 70 61 72 61 74 65 64 20 70 omma separated p
6af0: 65 72 20 6c 69 6e 65 22 29 0a 20 20 20 20 28 64 er line"). (d
6b00: 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22 69 74 ebug:print 4 "it
6b10: 65 6d 64 61 74 3a 20 22 20 69 74 65 6d 64 61 74 emdat: " itemdat
6b20: 20 22 2c 20 74 65 73 74 2d 6e 61 6d 65 3a 20 22 ", test-name: "
6b30: 20 74 65 73 74 2d 6e 61 6d 65 20 22 2c 20 74 65 test-name ", te
6b40: 73 74 2d 69 64 3a 20 22 20 74 65 73 74 2d 69 64 st-id: " test-id
6b50: 29 0a 20 20 20 20 28 69 66 20 74 65 73 74 2d 69 ). (if test-i
6b60: 64 0a 09 28 6c 65 74 20 6c 6f 6f 70 20 28 28 6c d..(let loop ((l
6b70: 69 6e 20 28 72 65 61 64 2d 6c 69 6e 65 29 29 29 in (read-line)))
6b80: 0a 09 20 20 28 69 66 20 28 6e 6f 74 20 28 65 6f .. (if (not (eo
6b90: 66 2d 6f 62 6a 65 63 74 3f 20 6c 69 6e 29 29 0a f-object? lin)).
6ba0: 09 20 20 20 20 20 20 28 62 65 67 69 6e 0a 09 09 . (begin...
6bb0: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20 6c (debug:print 4 l
6bc0: 69 6e 29 0a 09 09 28 64 62 3a 63 73 76 2d 3e 74 in)...(db:csv->t
6bd0: 65 73 74 2d 64 61 74 61 20 64 62 20 74 65 73 74 est-data db test
6be0: 2d 69 64 20 6c 69 6e 29 0a 09 09 28 6c 6f 6f 70 -id lin)...(loop
6bf0: 20 28 72 65 61 64 2d 6c 69 6e 65 29 29 29 29 29 (read-line)))))
6c00: 29 0a 20 20 20 20 3b 3b 20 72 6f 6c 6c 20 75 70 ). ;; roll up
6c10: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 73 the current res
6c20: 75 6c 74 73 2e 0a 20 20 20 20 3b 3b 20 46 49 58 ults.. ;; FIX
6c30: 4d 45 3a 20 41 64 64 20 74 68 65 20 73 74 61 74 ME: Add the stat
6c40: 75 73 20 74 6f 20 0a 20 20 20 20 28 64 62 3a 74 us to . (db:t
6c50: 65 73 74 2d 64 61 74 61 2d 72 6f 6c 6c 75 70 20 est-data-rollup
6c60: 64 62 20 74 65 73 74 2d 69 64 20 23 66 29 29 29 db test-id #f)))
6c70: 0a 0a 3b 3b 20 57 41 52 4e 49 4e 47 3a 20 44 6f ..;; WARNING: Do
6c80: 20 4e 4f 54 20 63 61 6c 6c 20 74 68 69 73 20 66 NOT call this f
6c90: 6f 72 20 74 68 65 20 70 61 72 65 6e 74 20 74 65 or the parent te
6ca0: 73 74 20 6f 6e 20 61 6e 20 69 74 65 72 61 74 65 st on an iterate
6cb0: 64 20 74 65 73 74 0a 3b 3b 20 52 6f 6c 6c 20 75 d test.;; Roll u
6cc0: 70 20 74 65 73 74 5f 64 61 74 61 20 70 61 73 73 p test_data pass
6cd0: 2f 66 61 69 6c 20 72 65 73 75 6c 74 73 0a 3b 3b /fail results.;;
6ce0: 20 6c 6f 6f 6b 20 61 74 20 74 68 65 20 74 65 73 look at the tes
6cf0: 74 5f 64 61 74 61 20 73 74 61 74 75 73 20 66 69 t_data status fi
6d00: 65 6c 64 2c 20 0a 3b 3b 20 20 20 20 69 66 20 61 eld, .;; if a
6d10: 6c 6c 20 61 72 65 20 70 61 73 73 20 28 61 6e 79 ll are pass (any
6d20: 20 63 61 73 65 29 20 61 6e 64 20 74 68 65 20 74 case) and the t
6d30: 65 73 74 20 73 74 61 74 75 73 20 69 73 20 50 41 est status is PA
6d40: 53 53 20 6f 72 20 4e 55 4c 4c 20 6f 72 20 27 27 SS or NULL or ''
6d50: 20 74 68 65 6e 20 73 65 74 20 74 65 73 74 20 73 then set test s
6d60: 74 61 74 75 73 20 74 6f 20 50 41 53 53 2e 0a 3b tatus to PASS..;
6d70: 3b 20 20 20 20 69 66 20 6f 6e 65 20 6f 72 20 6d ; if one or m
6d80: 6f 72 65 20 61 72 65 20 66 61 69 6c 20 28 61 6e ore are fail (an
6d90: 79 20 63 61 73 65 29 20 74 68 65 6e 20 73 65 74 y case) then set
6da0: 20 74 65 73 74 20 73 74 61 74 75 73 20 74 6f 20 test status to
6db0: 50 41 53 53 2c 20 6e 6f 6e 20 22 70 61 73 73 22 PASS, non "pass"
6dc0: 20 6f 72 20 22 66 61 69 6c 22 20 61 72 65 20 69 or "fail" are i
6dd0: 67 6e 6f 72 65 64 0a 28 64 65 66 69 6e 65 20 28 gnored.(define (
6de0: 64 62 3a 74 65 73 74 2d 64 61 74 61 2d 72 6f 6c db:test-data-rol
6df0: 6c 75 70 20 64 62 20 74 65 73 74 2d 69 64 20 73 lup db test-id s
6e00: 74 61 74 75 73 29 0a 20 20 28 73 71 6c 69 74 65 tatus). (sqlite
6e10: 33 3a 65 78 65 63 75 74 65 20 0a 20 20 20 64 62 3:execute . db
6e20: 20 0a 20 20 20 22 55 50 44 41 54 45 20 74 65 73 . "UPDATE tes
6e30: 74 73 20 0a 20 20 20 20 20 20 53 45 54 20 66 61 ts . SET fa
6e40: 69 6c 5f 63 6f 75 6e 74 3d 28 53 45 4c 45 43 54 il_count=(SELECT
6e50: 20 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 count(id) FROM
6e60: 74 65 73 74 5f 64 61 74 61 20 57 48 45 52 45 20 test_data WHERE
6e70: 74 65 73 74 5f 69 64 3d 3f 20 41 4e 44 20 73 74 test_id=? AND st
6e80: 61 74 75 73 20 6c 69 6b 65 20 27 66 61 69 6c 27 atus like 'fail'
6e90: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 70 61 73 ),. pas
6ea0: 73 5f 63 6f 75 6e 74 3d 28 53 45 4c 45 43 54 20 s_count=(SELECT
6eb0: 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 74 count(id) FROM t
6ec0: 65 73 74 5f 64 61 74 61 20 57 48 45 52 45 20 74 est_data WHERE t
6ed0: 65 73 74 5f 69 64 3d 3f 20 41 4e 44 20 73 74 61 est_id=? AND sta
6ee0: 74 75 73 20 6c 69 6b 65 20 27 70 61 73 73 27 29 tus like 'pass')
6ef0: 0a 20 20 20 20 20 20 57 48 45 52 45 20 69 64 3d . WHERE id=
6f00: 3f 3b 22 0a 20 20 20 74 65 73 74 2d 69 64 20 74 ?;". test-id t
6f10: 65 73 74 2d 69 64 20 74 65 73 74 2d 69 64 29 0a est-id test-id).
6f20: 20 20 3b 3b 20 69 66 20 74 68 65 20 74 65 73 74 ;; if the test
6f30: 20 69 73 20 6e 6f 74 20 46 41 49 4c 20 74 68 65 is not FAIL the
6f40: 6e 20 73 65 74 20 73 74 61 74 75 73 20 62 61 73 n set status bas
6f50: 65 64 20 6f 6e 20 74 68 65 20 66 61 69 6c 20 61 ed on the fail a
6f60: 6e 64 20 70 61 73 73 20 63 6f 75 6e 74 73 2e 0a nd pass counts..
6f70: 20 20 28 74 68 72 65 61 64 2d 73 6c 65 65 70 21 (thread-sleep!
6f80: 20 31 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 1). (sqlite3:e
6f90: 78 65 63 75 74 65 0a 20 20 20 64 62 20 20 20 3b xecute. db ;
6fa0: 3b 3b 20 4e 4f 54 45 3a 20 53 68 6f 75 6c 64 20 ;; NOTE: Should
6fb0: 74 68 69 73 20 62 65 20 57 41 52 4e 2c 46 41 49 this be WARN,FAI
6fc0: 4c 3f 20 41 20 57 41 52 4e 20 69 73 20 6e 6f 74 L? A WARN is not
6fd0: 20 61 20 46 41 49 4c 3f 3f 3f 3f 3f 20 42 55 47 a FAIL????? BUG
6fe0: 20 46 49 58 4d 45 0a 20 20 20 22 55 50 44 41 54 FIXME. "UPDAT
6ff0: 45 20 74 65 73 74 73 0a 20 20 20 20 20 20 53 45 E tests. SE
7000: 54 20 73 74 61 74 75 73 3d 43 41 53 45 20 57 48 T status=CASE WH
7010: 45 4e 20 28 53 45 4c 45 43 54 20 66 61 69 6c 5f EN (SELECT fail_
7020: 63 6f 75 6e 74 20 46 52 4f 4d 20 74 65 73 74 73 count FROM tests
7030: 20 57 48 45 52 45 20 69 64 3d 3f 29 20 3e 20 30 WHERE id=?) > 0
7040: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
7050: 20 20 20 20 20 20 20 20 20 20 20 54 48 45 4e 20 THEN
7060: 27 46 41 49 4c 27 0a 20 20 20 20 20 20 20 20 20 'FAIL'.
7070: 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 WHE
7080: 4e 20 28 53 45 4c 45 43 54 20 70 61 73 73 5f 63 N (SELECT pass_c
7090: 6f 75 6e 74 20 46 52 4f 4d 20 74 65 73 74 73 20 ount FROM tests
70a0: 57 48 45 52 45 20 69 64 3d 3f 29 20 3e 20 30 20 WHERE id=?) > 0
70b0: 41 4e 44 20 0a 20 20 20 20 20 20 20 20 20 20 20 AND .
70c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
70d0: 28 53 45 4c 45 43 54 20 73 74 61 74 75 73 20 46 (SELECT status F
70e0: 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 ROM tests WHERE
70f0: 69 64 3d 3f 29 20 4e 4f 54 20 49 4e 20 28 27 57 id=?) NOT IN ('W
7100: 41 52 4e 27 2c 27 46 41 49 4c 27 29 0a 20 20 20 ARN','FAIL').
7110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7120: 20 20 20 20 20 20 54 48 45 4e 20 27 50 41 53 53 THEN 'PASS
7130: 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 '.
7140: 20 20 20 20 20 20 20 20 45 4c 53 45 20 73 74 61 ELSE sta
7150: 74 75 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 tus.
7160: 20 20 20 20 20 20 45 4e 44 20 57 48 45 52 45 20 END WHERE
7170: 69 64 3d 3f 3b 22 0a 20 20 20 74 65 73 74 2d 69 id=?;". test-i
7180: 64 20 74 65 73 74 2d 69 64 20 74 65 73 74 2d 69 d test-id test-i
7190: 64 20 74 65 73 74 2d 69 64 29 29 0a 0a 28 64 65 d test-id))..(de
71a0: 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 70 72 65 fine (db:get-pre
71b0: 76 2d 74 6f 6c 2d 66 6f 72 2d 74 65 73 74 20 64 v-tol-for-test d
71c0: 62 20 74 65 73 74 2d 69 64 20 63 61 74 65 67 6f b test-id catego
71d0: 72 79 20 76 61 72 69 61 62 6c 65 29 0a 20 20 3b ry variable). ;
71e0: 3b 20 46 69 6e 69 73 68 20 6d 65 3f 0a 20 20 28 ; Finish me?. (
71f0: 76 61 6c 75 65 73 20 23 66 20 23 66 20 23 66 29 values #f #f #f)
7200: 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d )..;;===========
7210: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7220: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7230: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7240: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 53 ===========.;; S
7250: 20 54 20 45 20 50 20 53 20 0a 3b 3b 3d 3d 3d 3d T E P S .;;====
7260: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7270: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7280: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7290: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
72a0: 3d 3d 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a ==..(define (db:
72b0: 73 74 65 70 2d 67 65 74 2d 74 69 6d 65 2d 61 73 step-get-time-as
72c0: 2d 73 74 72 69 6e 67 20 76 65 63 29 0a 20 20 28 -string vec). (
72d0: 73 65 63 6f 6e 64 73 2d 3e 74 69 6d 65 2d 73 74 seconds->time-st
72e0: 72 69 6e 67 20 28 64 62 3a 73 74 65 70 2d 67 65 ring (db:step-ge
72f0: 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 76 65 63 t-event_time vec
7300: 29 29 29 0a 0a 3b 3b 20 64 62 2d 67 65 74 2d 74 )))..;; db-get-t
7310: 65 73 74 2d 73 74 65 70 73 2d 66 6f 72 2d 72 75 est-steps-for-ru
7320: 6e 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 n.(define (db:ge
7330: 74 2d 73 74 65 70 73 2d 66 6f 72 2d 74 65 73 74 t-steps-for-test
7340: 20 64 62 20 74 65 73 74 2d 69 64 29 0a 20 20 28 db test-id). (
7350: 6c 65 74 20 28 28 72 65 73 20 27 28 29 29 29 0a let ((res '())).
7360: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 (sqlite3:for
7370: 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20 20 20 20 -each-row .
7380: 28 6c 61 6d 62 64 61 20 28 69 64 20 74 65 73 74 (lambda (id test
7390: 2d 69 64 20 73 74 65 70 6e 61 6d 65 20 73 74 61 -id stepname sta
73a0: 74 65 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d te status event-
73b0: 74 69 6d 65 20 6c 6f 67 66 69 6c 65 29 0a 20 20 time logfile).
73c0: 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28 (set! res (
73d0: 63 6f 6e 73 20 28 76 65 63 74 6f 72 20 69 64 20 cons (vector id
73e0: 74 65 73 74 2d 69 64 20 73 74 65 70 6e 61 6d 65 test-id stepname
73f0: 20 73 74 61 74 65 20 73 74 61 74 75 73 20 65 76 state status ev
7400: 65 6e 74 2d 74 69 6d 65 20 28 69 66 20 28 73 74 ent-time (if (st
7410: 72 69 6e 67 3f 20 6c 6f 67 66 69 6c 65 29 20 6c ring? logfile) l
7420: 6f 67 66 69 6c 65 20 22 22 29 29 20 72 65 73 29 ogfile "")) res)
7430: 29 29 0a 20 20 20 20 20 64 62 0a 20 20 20 20 20 )). db.
7440: 22 53 45 4c 45 43 54 20 69 64 2c 74 65 73 74 5f "SELECT id,test_
7450: 69 64 2c 73 74 65 70 6e 61 6d 65 2c 73 74 61 74 id,stepname,stat
7460: 65 2c 73 74 61 74 75 73 2c 65 76 65 6e 74 5f 74 e,status,event_t
7470: 69 6d 65 2c 6c 6f 67 66 69 6c 65 20 46 52 4f 4d ime,logfile FROM
7480: 20 74 65 73 74 5f 73 74 65 70 73 20 57 48 45 52 test_steps WHER
7490: 45 20 74 65 73 74 5f 69 64 3d 3f 20 4f 52 44 45 E test_id=? ORDE
74a0: 52 20 42 59 20 69 64 20 41 53 43 3b 22 20 3b 3b R BY id ASC;" ;;
74b0: 20 65 76 65 6e 74 5f 74 69 6d 65 20 44 45 53 43 event_time DESC
74c0: 2c 69 64 20 41 53 43 3b 0a 20 20 20 20 20 74 65 ,id ASC;. te
74d0: 73 74 2d 69 64 29 0a 20 20 20 20 28 72 65 76 65 st-id). (reve
74e0: 72 73 65 20 72 65 73 29 29 29 0a 0a 3b 3b 20 67 rse res)))..;; g
74f0: 65 74 20 61 20 70 72 65 74 74 79 20 74 61 62 6c et a pretty tabl
7500: 65 20 74 6f 20 73 75 6d 6d 61 72 69 7a 65 20 73 e to summarize s
7510: 74 65 70 73 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 teps.;;.(define
7520: 28 64 62 3a 67 65 74 2d 73 74 65 70 73 2d 74 61 (db:get-steps-ta
7530: 62 6c 65 20 64 62 20 74 65 73 74 2d 69 64 29 0a ble db test-id).
7540: 20 20 28 6c 65 74 20 28 28 73 74 65 70 73 20 20 (let ((steps
7550: 20 28 64 62 3a 67 65 74 2d 73 74 65 70 73 2d 66 (db:get-steps-f
7560: 6f 72 2d 74 65 73 74 20 64 62 20 74 65 73 74 2d or-test db test-
7570: 69 64 29 29 29 0a 20 20 20 20 3b 3b 20 6f 72 67 id))). ;; org
7580: 61 6e 69 73 65 20 74 68 65 20 73 74 65 70 73 20 anise the steps
7590: 66 6f 72 20 62 65 74 74 65 72 20 72 65 61 64 61 for better reada
75a0: 62 69 6c 69 74 79 0a 20 20 20 20 28 6c 65 74 20 bility. (let
75b0: 28 28 72 65 73 20 28 6d 61 6b 65 2d 68 61 73 68 ((res (make-hash
75c0: 2d 74 61 62 6c 65 29 29 29 0a 20 20 20 20 20 20 -table))).
75d0: 28 66 6f 72 2d 65 61 63 68 20 0a 20 20 20 20 20 (for-each .
75e0: 20 20 28 6c 61 6d 62 64 61 20 28 73 74 65 70 29 (lambda (step)
75f0: 0a 09 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 .. (debug:print
7600: 36 20 22 73 74 65 70 3d 22 20 73 74 65 70 29 0a 6 "step=" step).
7610: 09 20 28 6c 65 74 20 28 28 72 65 63 6f 72 64 20 . (let ((record
7620: 28 68 61 73 68 2d 74 61 62 6c 65 2d 72 65 66 2f (hash-table-ref/
7630: 64 65 66 61 75 6c 74 20 0a 09 09 09 72 65 73 20 default ....res
7640: 0a 09 09 09 28 64 62 3a 73 74 65 70 2d 67 65 74 ....(db:step-get
7650: 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70 29 20 -stepname step)
7660: 0a 09 09 09 3b 3b 20 20 20 20 20 20 20 20 73 74 ....;; st
7670: 65 70 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 epname
7680: 20 20 20 20 20 20 73 74 61 72 74 20 65 6e 64 20 start end
7690: 73 74 61 74 75 73 20 20 20 20 0a 09 09 09 28 76 status ....(v
76a0: 65 63 74 6f 72 20 28 64 62 3a 73 74 65 70 2d 67 ector (db:step-g
76b0: 65 74 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70 et-stepname step
76c0: 29 20 22 22 20 20 20 22 22 20 22 22 20 20 20 20 ) "" "" ""
76d0: 20 22 22 20 22 22 29 29 29 29 0a 09 20 20 20 28 "" "")))).. (
76e0: 64 65 62 75 67 3a 70 72 69 6e 74 20 36 20 22 72 debug:print 6 "r
76f0: 65 63 6f 72 64 28 62 65 66 6f 72 65 29 20 3d 20 ecord(before) =
7700: 22 20 72 65 63 6f 72 64 20 0a 09 09 09 22 5c 6e " record ...."\n
7710: 69 64 3a 20 20 20 20 20 20 20 22 20 28 64 62 3a id: " (db:
7720: 73 74 65 70 2d 67 65 74 2d 69 64 20 73 74 65 70 step-get-id step
7730: 29 0a 09 09 09 22 5c 6e 73 74 65 70 6e 61 6d 65 )...."\nstepname
7740: 3a 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 : " (db:step-get
7750: 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70 29 0a -stepname step).
7760: 09 09 09 22 5c 6e 73 74 61 74 65 3a 20 20 20 20 ..."\nstate:
7770: 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 " (db:step-get-s
7780: 74 61 74 65 20 73 74 65 70 29 0a 09 09 09 22 5c tate step)...."\
7790: 6e 73 74 61 74 75 73 3a 20 20 20 22 20 28 64 62 nstatus: " (db
77a0: 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 74 75 73 :step-get-status
77b0: 20 73 74 65 70 29 0a 09 09 09 22 5c 6e 74 69 6d step)...."\ntim
77c0: 65 3a 20 20 20 20 20 22 20 28 64 62 3a 73 74 65 e: " (db:ste
77d0: 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 p-get-event_time
77e0: 20 73 74 65 70 29 29 0a 09 20 20 20 28 63 61 73 step)).. (cas
77f0: 65 20 28 73 74 72 69 6e 67 2d 3e 73 79 6d 62 6f e (string->symbo
7800: 6c 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 l (db:step-get-s
7810: 74 61 74 65 20 73 74 65 70 29 29 0a 09 20 20 20 tate step))..
7820: 20 20 28 28 73 74 61 72 74 29 28 76 65 63 74 6f ((start)(vecto
7830: 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 31 20 r-set! record 1
7840: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 (db:step-get-eve
7850: 6e 74 5f 74 69 6d 65 20 73 74 65 70 29 29 0a 09 nt_time step))..
7860: 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 (vector-se
7870: 74 21 20 72 65 63 6f 72 64 20 33 20 28 69 66 20 t! record 3 (if
7880: 28 65 71 75 61 6c 3f 20 28 76 65 63 74 6f 72 2d (equal? (vector-
7890: 72 65 66 20 72 65 63 6f 72 64 20 33 29 20 22 22 ref record 3) ""
78a0: 29 0a 09 09 09 09 09 28 64 62 3a 73 74 65 70 2d )......(db:step-
78b0: 67 65 74 2d 73 74 61 74 75 73 20 73 74 65 70 29 get-status step)
78c0: 29 29 0a 09 20 20 20 20 20 20 28 69 66 20 28 3e )).. (if (>
78d0: 20 28 73 74 72 69 6e 67 2d 6c 65 6e 67 74 68 20 (string-length
78e0: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 6c 6f 67 (db:step-get-log
78f0: 66 69 6c 65 20 73 74 65 70 29 29 0a 09 09 20 20 file step))...
7900: 20 20 20 30 29 0a 09 09 20 20 28 76 65 63 74 6f 0)... (vecto
7910: 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 35 20 r-set! record 5
7920: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 6c 6f 67 (db:step-get-log
7930: 66 69 6c 65 20 73 74 65 70 29 29 29 29 0a 09 20 file step))))..
7940: 20 20 20 20 28 28 65 6e 64 29 20 20 0a 09 20 20 ((end) ..
7950: 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 (vector-set!
7960: 20 72 65 63 6f 72 64 20 32 20 28 61 6e 79 2d 3e record 2 (any->
7970: 6e 75 6d 62 65 72 20 28 64 62 3a 73 74 65 70 2d number (db:step-
7980: 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73 get-event_time s
7990: 74 65 70 29 29 29 0a 09 20 20 20 20 20 20 28 76 tep))).. (v
79a0: 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 ector-set! recor
79b0: 64 20 33 20 28 64 62 3a 73 74 65 70 2d 67 65 74 d 3 (db:step-get
79c0: 2d 73 74 61 74 75 73 20 73 74 65 70 29 29 0a 09 -status step))..
79d0: 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 (vector-se
79e0: 74 21 20 72 65 63 6f 72 64 20 34 20 28 6c 65 74 t! record 4 (let
79f0: 20 28 28 73 74 61 72 74 74 20 28 61 6e 79 2d 3e ((startt (any->
7a00: 6e 75 6d 62 65 72 20 28 76 65 63 74 6f 72 2d 72 number (vector-r
7a10: 65 66 20 72 65 63 6f 72 64 20 31 29 29 29 0a 09 ef record 1)))..
7a20: 09 09 09 09 20 20 28 65 6e 64 74 20 20 20 28 61 .... (endt (a
7a30: 6e 79 2d 3e 6e 75 6d 62 65 72 20 28 76 65 63 74 ny->number (vect
7a40: 6f 72 2d 72 65 66 20 72 65 63 6f 72 64 20 32 29 or-ref record 2)
7a50: 29 29 29 0a 09 09 09 09 20 20 20 20 20 20 28 64 )))..... (d
7a60: 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22 72 65 ebug:print 4 "re
7a70: 63 6f 72 64 5b 31 5d 3d 22 20 28 76 65 63 74 6f cord[1]=" (vecto
7a80: 72 2d 72 65 66 20 72 65 63 6f 72 64 20 31 29 20 r-ref record 1)
7a90: 0a 09 09 09 09 09 09 20 20 20 22 2c 20 73 74 61 ....... ", sta
7aa0: 72 74 74 3d 22 20 73 74 61 72 74 74 20 22 2c 20 rtt=" startt ",
7ab0: 65 6e 64 74 3d 22 20 65 6e 64 74 0a 09 09 09 09 endt=" endt.....
7ac0: 09 09 20 20 20 22 2c 20 67 65 74 2d 73 74 61 74 .. ", get-stat
7ad0: 75 73 3a 20 22 20 28 64 62 3a 73 74 65 70 2d 67 us: " (db:step-g
7ae0: 65 74 2d 73 74 61 74 75 73 20 73 74 65 70 29 29 et-status step))
7af0: 0a 09 09 09 09 20 20 20 20 20 20 28 69 66 20 28 ..... (if (
7b00: 61 6e 64 20 28 6e 75 6d 62 65 72 3f 20 73 74 61 and (number? sta
7b10: 72 74 74 29 28 6e 75 6d 62 65 72 3f 20 65 6e 64 rtt)(number? end
7b20: 74 29 29 0a 09 09 09 09 09 20 20 28 73 65 63 6f t))...... (seco
7b30: 6e 64 73 2d 3e 68 72 2d 6d 69 6e 2d 73 65 63 20 nds->hr-min-sec
7b40: 28 2d 20 65 6e 64 74 20 73 74 61 72 74 74 29 29 (- endt startt))
7b50: 20 22 2d 31 22 29 29 29 0a 09 20 20 20 20 20 20 "-1")))..
7b60: 28 69 66 20 28 3e 20 28 73 74 72 69 6e 67 2d 6c (if (> (string-l
7b70: 65 6e 67 74 68 20 28 64 62 3a 73 74 65 70 2d 67 ength (db:step-g
7b80: 65 74 2d 6c 6f 67 66 69 6c 65 20 73 74 65 70 29 et-logfile step)
7b90: 29 0a 09 09 20 20 20 20 20 30 29 0a 09 09 20 20 )... 0)...
7ba0: 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63 (vector-set! rec
7bb0: 6f 72 64 20 35 20 28 64 62 3a 73 74 65 70 2d 67 ord 5 (db:step-g
7bc0: 65 74 2d 6c 6f 67 66 69 6c 65 20 73 74 65 70 29 et-logfile step)
7bd0: 29 29 29 0a 09 20 20 20 20 20 28 65 6c 73 65 0a ))).. (else.
7be0: 09 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73 . (vector-s
7bf0: 65 74 21 20 72 65 63 6f 72 64 20 32 20 28 64 62 et! record 2 (db
7c00: 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 74 65 20 :step-get-state
7c10: 73 74 65 70 29 29 0a 09 20 20 20 20 20 20 28 76 step)).. (v
7c20: 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 ector-set! recor
7c30: 64 20 33 20 28 64 62 3a 73 74 65 70 2d 67 65 74 d 3 (db:step-get
7c40: 2d 73 74 61 74 75 73 20 73 74 65 70 29 29 0a 09 -status step))..
7c50: 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 (vector-se
7c60: 74 21 20 72 65 63 6f 72 64 20 34 20 28 64 62 3a t! record 4 (db:
7c70: 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 step-get-event_t
7c80: 69 6d 65 20 73 74 65 70 29 29 29 29 0a 09 20 20 ime step))))..
7c90: 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 73 65 74 (hash-table-set
7ca0: 21 20 72 65 73 20 28 64 62 3a 73 74 65 70 2d 67 ! res (db:step-g
7cb0: 65 74 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70 et-stepname step
7cc0: 29 20 72 65 63 6f 72 64 29 0a 09 20 20 20 28 64 ) record).. (d
7cd0: 65 62 75 67 3a 70 72 69 6e 74 20 36 20 22 72 65 ebug:print 6 "re
7ce0: 63 6f 72 64 28 61 66 74 65 72 29 20 20 3d 20 22 cord(after) = "
7cf0: 20 72 65 63 6f 72 64 20 0a 09 09 09 22 5c 6e 69 record ...."\ni
7d00: 64 3a 20 20 20 20 20 20 20 22 20 28 64 62 3a 73 d: " (db:s
7d10: 74 65 70 2d 67 65 74 2d 69 64 20 73 74 65 70 29 tep-get-id step)
7d20: 0a 09 09 09 22 5c 6e 73 74 65 70 6e 61 6d 65 3a ...."\nstepname:
7d30: 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d " (db:step-get-
7d40: 73 74 65 70 6e 61 6d 65 20 73 74 65 70 29 0a 09 stepname step)..
7d50: 09 09 22 5c 6e 73 74 61 74 65 3a 20 20 20 20 22 .."\nstate: "
7d60: 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 (db:step-get-st
7d70: 61 74 65 20 73 74 65 70 29 0a 09 09 09 22 5c 6e ate step)...."\n
7d80: 73 74 61 74 75 73 3a 20 20 20 22 20 28 64 62 3a status: " (db:
7d90: 73 74 65 70 2d 67 65 74 2d 73 74 61 74 75 73 20 step-get-status
7da0: 73 74 65 70 29 0a 09 09 09 22 5c 6e 74 69 6d 65 step)...."\ntime
7db0: 3a 20 20 20 20 20 22 20 28 64 62 3a 73 74 65 70 : " (db:step
7dc0: 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 -get-event_time
7dd0: 73 74 65 70 29 29 29 29 0a 20 20 20 20 20 20 20 step)))).
7de0: 3b 3b 20 28 65 6c 73 65 20 20 20 28 76 65 63 74 ;; (else (vect
7df0: 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 31 or-set! record 1
7e00: 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 (db:step-get-ev
7e10: 65 6e 74 5f 74 69 6d 65 20 73 74 65 70 29 29 29 ent_time step)))
7e20: 0a 20 20 20 20 20 20 20 28 73 6f 72 74 20 73 74 . (sort st
7e30: 65 70 73 20 28 6c 61 6d 62 64 61 20 28 61 20 62 eps (lambda (a b
7e40: 29 28 3c 20 28 64 62 3a 73 74 65 70 2d 67 65 74 )(< (db:step-get
7e50: 2d 65 76 65 6e 74 5f 74 69 6d 65 20 61 29 28 64 -event_time a)(d
7e60: 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 b:step-get-event
7e70: 5f 74 69 6d 65 20 62 29 29 29 29 29 0a 20 20 20 _time b))))).
7e80: 20 20 20 72 65 73 29 29 29 0a 0a 3b 3b 20 55 53 res)))..;; US
7e90: 45 3a 20 28 6c 73 65 74 2d 64 69 66 66 65 72 65 E: (lset-differe
7ea0: 6e 63 65 20 73 74 72 69 6e 67 3d 3f 20 27 28 22 nce string=? '("
7eb0: 61 22 20 22 62 22 20 22 63 22 29 20 27 28 22 64 a" "b" "c") '("d
7ec0: 22 20 22 63 22 20 22 65 22 20 22 61 22 29 29 0a " "c" "e" "a")).
7ed0: 3b 3b 0a 3b 3b 20 52 65 74 75 72 6e 20 61 20 6c ;;.;; Return a l
7ee0: 69 73 74 20 6f 66 20 70 72 65 72 65 71 73 20 74 ist of prereqs t
7ef0: 68 61 74 20 77 65 72 65 20 4e 4f 54 20 6d 65 74 hat were NOT met
7f00: 0a 3b 3b 20 20 54 65 73 74 73 20 28 61 6e 64 20 .;; Tests (and
7f10: 61 6c 6c 20 69 74 65 6d 73 29 20 69 6e 20 77 61 all items) in wa
7f20: 69 74 6f 6e 20 6c 69 73 74 20 6d 75 73 74 20 62 iton list must b
7f30: 65 20 22 43 4f 4d 50 4c 45 54 45 44 22 20 61 6e e "COMPLETED" an
7f40: 64 20 22 50 41 53 53 22 0a 28 64 65 66 69 6e 65 d "PASS".(define
7f50: 20 28 64 62 2d 67 65 74 2d 70 72 65 72 65 71 73 (db-get-prereqs
7f60: 2d 6e 6f 74 2d 6d 65 74 20 64 62 20 72 75 6e 2d -not-met db run-
7f70: 69 64 20 77 61 69 74 6f 6e 29 0a 20 20 28 69 66 id waiton). (if
7f80: 20 28 6e 75 6c 6c 3f 20 77 61 69 74 6f 6e 29 0a (null? waiton).
7f90: 20 20 20 20 20 20 27 28 29 0a 20 20 20 20 20 20 '().
7fa0: 28 6c 65 74 2a 20 28 28 75 6e 6d 65 74 2d 70 72 (let* ((unmet-pr
7fb0: 65 2d 72 65 71 73 20 27 28 29 29 0a 09 20 20 20 e-reqs '())..
7fc0: 20 20 28 74 65 73 74 73 20 20 20 20 20 20 20 20 (tests
7fd0: 20 20 20 28 64 62 2d 67 65 74 2d 74 65 73 74 73 (db-get-tests
7fe0: 2d 66 6f 72 2d 72 75 6e 20 64 62 20 72 75 6e 2d -for-run db run-
7ff0: 69 64 20 23 66 20 23 66 20 27 28 29 20 27 28 29 id #f #f '() '()
8000: 29 29 0a 09 20 20 20 20 20 28 72 65 73 75 6c 74 )).. (result
8010: 20 20 20 20 20 20 20 20 20 27 28 29 29 29 0a 09 '()))..
8020: 28 66 6f 72 2d 65 61 63 68 20 28 6c 61 6d 62 64 (for-each (lambd
8030: 61 20 28 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 a (waitontest-na
8040: 6d 65 29 0a 09 09 20 20 20 20 28 6c 65 74 20 28 me)... (let (
8050: 28 65 76 65 72 2d 73 65 65 6e 20 23 66 29 29 0a (ever-seen #f)).
8060: 09 09 20 20 20 20 20 20 28 66 6f 72 2d 65 61 63 .. (for-eac
8070: 68 20 28 6c 61 6d 62 64 61 20 28 74 65 73 74 29 h (lambda (test)
8080: 0a 09 09 09 09 20 20 28 69 66 20 28 65 71 75 61 ..... (if (equa
8090: 6c 3f 20 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 l? waitontest-na
80a0: 6d 65 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d me (db:test-get-
80b0: 74 65 73 74 6e 61 6d 65 20 74 65 73 74 29 29 0a testname test)).
80c0: 09 09 09 09 20 20 20 20 20 20 28 62 65 67 69 6e .... (begin
80d0: 0a 09 09 09 09 09 28 73 65 74 21 20 65 76 65 72 ......(set! ever
80e0: 2d 73 65 65 6e 20 23 74 29 0a 09 09 09 09 09 28 -seen #t)......(
80f0: 69 66 20 28 6e 6f 74 20 28 61 6e 64 20 28 65 71 if (not (and (eq
8100: 75 61 6c 3f 20 28 64 62 3a 74 65 73 74 2d 67 65 ual? (db:test-ge
8110: 74 2d 73 74 61 74 65 20 74 65 73 74 29 20 22 43 t-state test) "C
8120: 4f 4d 50 4c 45 54 45 44 22 29 0a 09 09 09 09 09 OMPLETED")......
8130: 09 20 20 20 20 20 20 28 6d 65 6d 62 65 72 20 28 . (member (
8140: 64 62 3a 74 65 73 74 2d 67 65 74 2d 73 74 61 74 db:test-get-stat
8150: 75 73 20 74 65 73 74 29 20 27 28 22 50 41 53 53 us test) '("PASS
8160: 22 20 22 57 41 52 4e 22 20 22 43 48 45 43 4b 22 " "WARN" "CHECK"
8170: 29 29 29 29 0a 09 09 09 09 09 20 20 20 20 28 73 ))))...... (s
8180: 65 74 21 20 72 65 73 75 6c 74 20 28 63 6f 6e 73 et! result (cons
8190: 20 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 waitontest-name
81a0: 20 72 65 73 75 6c 74 29 29 29 29 29 29 0a 09 09 result))))))...
81b0: 09 09 74 65 73 74 73 29 0a 09 09 20 20 20 20 20 ..tests)...
81c0: 20 28 69 66 20 28 6e 6f 74 20 65 76 65 72 2d 73 (if (not ever-s
81d0: 65 65 6e 29 28 73 65 74 21 20 72 65 73 75 6c 74 een)(set! result
81e0: 20 28 63 6f 6e 73 20 77 61 69 74 6f 6e 74 65 73 (cons waitontes
81f0: 74 2d 6e 61 6d 65 20 72 65 73 75 6c 74 29 29 29 t-name result)))
8200: 29 29 0a 09 09 20 20 77 61 69 74 6f 6e 29 0a 09 ))... waiton)..
8210: 28 64 65 6c 65 74 65 2d 64 75 70 6c 69 63 61 74 (delete-duplicat
8220: 65 73 20 72 65 73 75 6c 74 29 29 29 29 0a 0a 3b es result))))..;
8230: 3b 20 74 68 65 20 6e 65 77 20 70 72 65 72 65 71 ; the new prereq
8240: 73 20 63 61 6c 63 75 6c 61 74 69 6f 6e 2c 20 6c s calculation, l
8250: 6f 6f 6b 73 20 61 6c 73 6f 20 61 74 20 69 74 65 ooks also at ite
8260: 6d 70 61 74 68 20 69 66 20 73 70 65 63 69 66 69 mpath if specifi
8270: 65 64 0a 3b 3b 20 61 6c 6c 20 70 72 65 72 65 71 ed.;; all prereq
8280: 73 20 6d 75 73 74 20 62 65 20 6d 65 74 3a 0a 3b s must be met:.;
8290: 3b 20 20 20 20 69 66 20 70 72 65 72 65 71 20 74 ; if prereq t
82a0: 65 73 74 20 77 69 74 68 20 69 74 65 6d 70 61 74 est with itempat
82b0: 68 3d 27 27 20 69 73 20 43 4f 4d 50 4c 45 54 45 h='' is COMPLETE
82c0: 44 20 61 6e 64 20 50 41 53 53 2c 20 57 41 52 4e D and PASS, WARN
82d0: 2c 20 43 48 45 43 4b 2c 20 6f 72 20 57 41 49 56 , CHECK, or WAIV
82e0: 45 44 20 74 68 65 6e 20 70 72 65 72 65 71 20 69 ED then prereq i
82f0: 73 20 6d 65 74 0a 3b 3b 20 20 20 20 69 66 20 70 s met.;; if p
8300: 72 65 72 65 71 20 74 65 73 74 20 77 69 74 68 20 rereq test with
8310: 69 74 65 6d 70 61 74 68 3d 72 65 66 2d 69 74 65 itempath=ref-ite
8320: 6d 2d 70 61 74 68 20 61 6e 64 20 43 4f 4d 50 4c m-path and COMPL
8330: 45 54 45 44 20 77 69 74 68 20 50 41 53 53 2c 20 ETED with PASS,
8340: 57 41 52 4e 2c 20 43 48 45 43 4b 2c 20 6f 72 20 WARN, CHECK, or
8350: 57 41 49 56 45 44 20 74 68 65 6e 20 70 72 65 72 WAIVED then prer
8360: 65 71 20 69 73 20 6d 65 74 0a 28 64 65 66 69 6e eq is met.(defin
8370: 65 20 28 64 62 3a 67 65 74 2d 70 72 65 72 65 71 e (db:get-prereq
8380: 73 2d 6e 6f 74 2d 6d 65 74 20 64 62 20 72 75 6e s-not-met db run
8390: 2d 69 64 20 77 61 69 74 6f 6e 73 20 72 65 66 2d -id waitons ref-
83a0: 69 74 65 6d 2d 70 61 74 68 29 0a 20 20 28 69 66 item-path). (if
83b0: 20 28 6f 72 20 28 6e 6f 74 20 77 61 69 74 6f 6e (or (not waiton
83c0: 73 29 0a 09 20 20 28 6e 75 6c 6c 3f 20 77 61 69 s).. (null? wai
83d0: 74 6f 6e 73 29 29 0a 20 20 20 20 20 20 27 28 29 tons)). '()
83e0: 0a 20 20 20 20 20 20 28 6c 65 74 2a 20 28 28 75 . (let* ((u
83f0: 6e 6d 65 74 2d 70 72 65 2d 72 65 71 73 20 27 28 nmet-pre-reqs '(
8400: 29 29 0a 09 20 20 20 20 20 28 72 65 73 75 6c 74 )).. (result
8410: 20 20 20 20 20 20 20 20 20 27 28 29 29 29 0a 09 '()))..
8420: 28 66 6f 72 2d 65 61 63 68 20 0a 09 20 28 6c 61 (for-each .. (la
8430: 6d 62 64 61 20 28 77 61 69 74 6f 6e 74 65 73 74 mbda (waitontest
8440: 2d 6e 61 6d 65 29 0a 09 20 20 20 3b 3b 20 62 79 -name).. ;; by
8450: 20 67 65 74 74 69 6e 67 20 74 68 65 20 74 65 73 getting the tes
8460: 74 73 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67 ts with matching
8470: 20 6e 61 6d 65 20 77 65 20 61 72 65 20 6c 6f 6f name we are loo
8480: 6b 69 6e 67 20 6f 6e 6c 79 20 61 74 20 74 68 65 king only at the
8490: 20 6d 61 74 63 68 69 6e 67 20 74 65 73 74 20 0a matching test .
84a0: 09 20 20 20 3b 3b 20 61 6e 64 20 72 65 6c 61 74 . ;; and relat
84b0: 65 64 20 73 75 62 20 69 74 65 6d 73 0a 09 20 20 ed sub items..
84c0: 20 28 6c 65 74 20 28 28 74 65 73 74 73 20 20 20 (let ((tests
84d0: 20 20 20 20 20 20 20 20 20 20 28 64 62 2d 67 65 (db-ge
84e0: 74 2d 74 65 73 74 73 2d 66 6f 72 2d 72 75 6e 20 t-tests-for-run
84f0: 64 62 20 72 75 6e 2d 69 64 20 77 61 69 74 6f 6e db run-id waiton
8500: 74 65 73 74 2d 6e 61 6d 65 20 23 66 20 27 28 29 test-name #f '()
8510: 20 27 28 29 29 29 0a 09 09 20 28 65 76 65 72 2d '()))... (ever-
8520: 73 65 65 6e 20 20 20 20 20 20 20 20 20 23 66 29 seen #f)
8530: 0a 09 09 20 28 70 61 72 65 6e 74 2d 77 61 69 74 ... (parent-wait
8540: 6f 6e 2d 6d 65 74 20 23 66 29 0a 09 09 20 28 69 on-met #f)... (i
8550: 74 65 6d 2d 77 61 69 74 6f 6e 2d 6d 65 74 20 20 tem-waiton-met
8560: 20 23 66 29 29 0a 09 20 20 20 20 20 28 66 6f 72 #f)).. (for
8570: 2d 65 61 63 68 20 0a 09 20 20 20 20 20 20 28 6c -each .. (l
8580: 61 6d 62 64 61 20 28 74 65 73 74 29 0a 09 09 3b ambda (test)...;
8590: 3b 20 28 69 66 20 28 65 71 75 61 6c 3f 20 77 61 ; (if (equal? wa
85a0: 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 20 28 64 itontest-name (d
85b0: 62 3a 74 65 73 74 2d 67 65 74 2d 74 65 73 74 6e b:test-get-testn
85c0: 61 6d 65 20 74 65 73 74 29 29 20 3b 3b 20 62 79 ame test)) ;; by
85d0: 20 64 65 66 69 6e 74 69 6f 6e 20 74 68 69 73 20 defintion this
85e0: 68 61 64 20 62 65 74 74 65 72 20 62 65 20 74 72 had better be tr
85f0: 75 65 20 2e 2e 2e 0a 09 09 28 6c 65 74 2a 20 28 ue ......(let* (
8600: 28 73 74 61 74 65 20 20 20 20 20 20 20 20 20 20 (state
8610: 20 20 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d (db:test-get-
8620: 73 74 61 74 65 20 74 65 73 74 29 29 0a 09 09 20 state test))...
8630: 20 20 20 20 20 20 28 73 74 61 74 75 73 20 20 20 (status
8640: 20 20 20 20 20 20 20 20 20 28 64 62 3a 74 65 73 (db:tes
8650: 74 2d 67 65 74 2d 73 74 61 74 75 73 20 74 65 73 t-get-status tes
8660: 74 29 29 0a 09 09 20 20 20 20 20 20 20 28 69 74 t))... (it
8670: 65 6d 2d 70 61 74 68 20 20 20 20 20 20 20 20 20 em-path
8680: 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 69 74 65 (db:test-get-ite
8690: 6d 2d 70 61 74 68 20 74 65 73 74 29 29 0a 09 09 m-path test))...
86a0: 20 20 20 20 20 20 20 28 69 73 2d 63 6f 6d 70 6c (is-compl
86b0: 65 74 65 64 20 20 20 20 20 20 28 65 71 75 61 6c eted (equal
86c0: 3f 20 73 74 61 74 65 20 22 43 4f 4d 50 4c 45 54 ? state "COMPLET
86d0: 45 44 22 29 29 0a 09 09 20 20 20 20 20 20 20 28 ED"))... (
86e0: 69 73 2d 6f 6b 20 20 20 20 20 20 20 20 20 20 20 is-ok
86f0: 20 20 28 6d 65 6d 62 65 72 20 73 74 61 74 75 73 (member status
8700: 20 27 28 22 50 41 53 53 22 20 22 57 41 52 4e 22 '("PASS" "WARN"
8710: 20 22 43 48 45 43 4b 22 20 22 57 41 49 56 45 44 "CHECK" "WAIVED
8720: 22 29 29 29 0a 09 09 20 20 20 20 20 20 20 28 73 ")))... (s
8730: 61 6d 65 2d 69 74 65 6d 70 61 74 68 20 20 20 20 ame-itempath
8740: 20 28 65 71 75 61 6c 3f 20 72 65 66 2d 69 74 65 (equal? ref-ite
8750: 6d 2d 70 61 74 68 20 69 74 65 6d 2d 70 61 74 68 m-path item-path
8760: 29 29 29 0a 09 09 20 20 28 73 65 74 21 20 65 76 )))... (set! ev
8770: 65 72 2d 73 65 65 6e 20 23 74 29 0a 09 09 20 20 er-seen #t)...
8780: 28 63 6f 6e 64 0a 09 09 20 20 20 3b 3b 20 63 61 (cond... ;; ca
8790: 73 65 20 31 2c 20 6e 6f 6e 2d 69 74 65 6d 20 28 se 1, non-item (
87a0: 70 61 72 65 6e 74 20 74 65 73 74 29 20 69 73 20 parent test) is
87b0: 0a 09 09 20 20 20 28 28 61 6e 64 20 28 65 71 75 ... ((and (equ
87c0: 61 6c 3f 20 69 74 65 6d 2d 70 61 74 68 20 22 22 al? item-path ""
87d0: 29 20 3b 3b 20 74 68 69 73 20 69 73 20 74 68 65 ) ;; this is the
87e0: 20 70 61 72 65 6e 74 20 74 65 73 74 0a 09 09 09 parent test....
87f0: 20 69 73 2d 63 6f 6d 70 6c 65 74 65 64 0a 09 09 is-completed...
8800: 09 20 69 73 2d 6f 6b 29 0a 09 09 20 20 20 20 28 . is-ok)... (
8810: 73 65 74 21 20 70 61 72 65 6e 74 2d 77 61 69 74 set! parent-wait
8820: 6f 6e 2d 6d 65 74 20 23 74 29 29 0a 09 09 20 20 on-met #t))...
8830: 20 28 28 61 6e 64 20 73 61 6d 65 2d 69 74 65 6d ((and same-item
8840: 70 61 74 68 0a 09 09 09 20 69 73 2d 63 6f 6d 70 path.... is-comp
8850: 6c 65 74 65 64 0a 09 09 09 20 69 73 2d 6f 6b 29 leted.... is-ok)
8860: 0a 09 09 20 20 20 20 28 73 65 74 21 20 69 74 65 ... (set! ite
8870: 6d 2d 77 61 69 74 6f 6e 2d 6d 65 74 20 23 74 29 m-waiton-met #t)
8880: 29 29 29 29 0a 09 20 20 20 20 20 20 74 65 73 74 )))).. test
8890: 73 29 0a 09 20 20 20 20 20 28 69 66 20 28 6e 6f s).. (if (no
88a0: 74 20 28 6f 72 20 70 61 72 65 6e 74 2d 77 61 69 t (or parent-wai
88b0: 74 6f 6e 2d 6d 65 74 20 69 74 65 6d 2d 77 61 69 ton-met item-wai
88c0: 74 6f 6e 2d 6d 65 74 29 29 0a 09 09 20 28 73 65 ton-met))... (se
88d0: 74 21 20 72 65 73 75 6c 74 20 28 63 6f 6e 73 20 t! result (cons
88e0: 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 20 waitontest-name
88f0: 72 65 73 75 6c 74 29 29 29 0a 09 20 20 20 20 20 result)))..
8900: 3b 3b 20 69 66 20 74 68 65 20 74 65 73 74 20 69 ;; if the test i
8910: 73 20 6e 6f 74 20 66 6f 75 6e 64 20 74 68 65 6e s not found then
8920: 20 63 6c 65 61 72 6c 79 20 74 68 65 20 77 61 69 clearly the wai
8930: 74 6f 6e 20 69 73 20 6e 6f 74 20 6d 65 74 2e 2e ton is not met..
8940: 2e 0a 09 20 20 20 20 20 28 69 66 20 28 6e 6f 74 ... (if (not
8950: 20 65 76 65 72 2d 73 65 65 6e 29 28 73 65 74 21 ever-seen)(set!
8960: 20 72 65 73 75 6c 74 20 28 63 6f 6e 73 20 77 61 result (cons wa
8970: 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 20 72 65 itontest-name re
8980: 73 75 6c 74 29 29 29 29 29 0a 09 77 61 69 74 6f sult)))))..waito
8990: 6e 73 29 0a 20 20 20 20 20 20 28 64 65 6c 65 74 ns). (delet
89a0: 65 2d 64 75 70 6c 69 63 61 74 65 73 20 72 65 73 e-duplicates res
89b0: 75 6c 74 29 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d ult))))..;;=====
89c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
89d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
89e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
89f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8a00: 3d 0a 3b 3b 20 45 78 74 72 61 63 74 20 6f 64 73 =.;; Extract ods
8a10: 20 66 69 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 file from the d
8a20: 62 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d b.;;============
8a30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8a40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8a50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8a60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 72 ==========..;; r
8a70: 75 6e 73 70 61 74 74 20 69 73 20 61 20 63 6f 6d unspatt is a com
8a80: 6d 61 20 64 65 6c 69 6d 69 74 65 64 20 6c 69 73 ma delimited lis
8a90: 74 20 6f 66 20 72 75 6e 20 70 61 74 74 65 72 6e t of run pattern
8aa0: 73 0a 3b 3b 20 6b 65 79 70 61 74 74 2d 61 6c 69 s.;; keypatt-ali
8ab0: 73 74 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 st must contain
8ac0: 2a 61 6c 6c 2a 20 6b 65 79 73 20 77 69 74 68 20 *all* keys with
8ad0: 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20 70 61 an associated pa
8ae0: 74 74 65 72 6e 3a 20 27 28 20 28 22 4b 45 59 31 ttern: '( ("KEY1
8af0: 22 20 22 25 22 29 20 2e 2e 20 29 0a 28 64 65 66 " "%") .. ).(def
8b00: 69 6e 65 20 28 64 62 3a 65 78 74 72 61 63 74 2d ine (db:extract-
8b10: 6f 64 73 2d 66 69 6c 65 20 64 62 20 6f 75 74 70 ods-file db outp
8b20: 75 74 66 69 6c 65 20 6b 65 79 70 61 74 74 2d 61 utfile keypatt-a
8b30: 6c 69 73 74 20 72 75 6e 73 70 61 74 74 20 70 61 list runspatt pa
8b40: 74 68 6d 6f 64 29 0a 20 20 28 6c 65 74 2a 20 28 thmod). (let* (
8b50: 28 6b 65 79 73 73 74 72 20 20 28 73 74 72 69 6e (keysstr (strin
8b60: 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 28 6d g-intersperse (m
8b70: 61 70 20 63 61 72 20 6b 65 79 70 61 74 74 2d 61 ap car keypatt-a
8b80: 6c 69 73 74 29 20 22 2c 22 29 29 0a 09 20 28 6b list) ",")).. (k
8b90: 65 79 71 72 79 20 20 20 28 73 74 72 69 6e 67 2d eyqry (string-
8ba0: 69 6e 74 65 72 73 70 65 72 73 65 20 28 6d 61 70 intersperse (map
8bb0: 20 28 6c 61 6d 62 64 61 20 28 70 29 28 63 6f 6e (lambda (p)(con
8bc0: 63 20 28 63 61 72 20 70 29 20 22 20 4c 49 4b 45 c (car p) " LIKE
8bd0: 20 3f 20 22 29 29 20 6b 65 79 70 61 74 74 2d 61 ? ")) keypatt-a
8be0: 6c 69 73 74 29 20 22 20 41 4e 44 20 22 29 29 0a list) " AND ")).
8bf0: 09 20 28 6e 75 6d 6b 65 79 73 20 20 28 6c 65 6e . (numkeys (len
8c00: 67 74 68 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 gth keypatt-alis
8c10: 74 29 29 0a 09 20 28 74 65 73 74 2d 69 64 73 20 t)).. (test-ids
8c20: 27 28 29 29 0a 09 20 28 77 69 6e 64 6f 77 73 20 '()).. (windows
8c30: 20 28 61 6e 64 20 70 61 74 68 6d 6f 64 20 28 73 (and pathmod (s
8c40: 75 62 73 74 72 69 6e 67 2d 69 6e 64 65 78 20 22 ubstring-index "
8c50: 5c 5c 22 20 70 61 74 68 6d 6f 64 29 29 29 0a 09 \\" pathmod)))..
8c60: 20 28 74 65 6d 70 64 69 72 20 20 28 63 6f 6e 63 (tempdir (conc
8c70: 20 22 2f 74 6d 70 2f 22 20 28 63 75 72 72 65 6e "/tmp/" (curren
8c80: 74 2d 75 73 65 72 2d 6e 61 6d 65 29 20 22 2f 22 t-user-name) "/"
8c90: 20 72 75 6e 73 70 61 74 74 20 22 5f 22 20 28 72 runspatt "_" (r
8ca0: 61 6e 64 6f 6d 20 31 30 30 30 30 29 20 22 5f 22 andom 10000) "_"
8cb0: 20 28 63 75 72 72 65 6e 74 2d 70 72 6f 63 65 73 (current-proces
8cc0: 73 2d 69 64 29 29 29 0a 09 20 28 72 75 6e 73 68 s-id))).. (runsh
8cd0: 65 61 64 65 72 20 28 61 70 70 65 6e 64 20 28 6c eader (append (l
8ce0: 69 73 74 20 22 52 75 6e 20 49 64 22 20 22 52 75 ist "Run Id" "Ru
8cf0: 6e 6e 61 6d 65 22 29 20 3b 20 30 20 31 0a 09 09 nname") ; 0 1...
8d00: 09 20 20 20 20 20 28 6d 61 70 20 63 61 72 20 6b . (map car k
8d10: 65 79 70 61 74 74 2d 61 6c 69 73 74 29 20 20 20 eypatt-alist)
8d20: 3b 20 2b 20 4e 20 3d 20 6c 65 6e 67 74 68 20 6b ; + N = length k
8d30: 65 79 70 61 74 74 2d 61 6c 69 73 74 0a 09 09 09 eypatt-alist....
8d40: 20 20 20 20 20 28 6c 69 73 74 20 22 54 65 73 74 (list "Test
8d50: 6e 61 6d 65 22 20 20 20 20 20 20 20 20 20 20 3b name" ;
8d60: 20 32 0a 09 09 09 09 20 20 20 22 49 74 65 6d 20 2..... "Item
8d70: 50 61 74 68 22 20 20 20 20 20 20 20 20 20 3b 20 Path" ;
8d80: 33 20 0a 09 09 09 09 20 20 20 22 44 65 73 63 72 3 ..... "Descr
8d90: 69 70 74 69 6f 6e 22 20 20 20 20 20 20 20 3b 20 iption" ;
8da0: 34 20 0a 09 09 09 09 20 20 20 22 53 74 61 74 65 4 ..... "State
8db0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 " ;
8dc0: 35 20 0a 09 09 09 09 20 20 20 22 53 74 61 74 75 5 ..... "Statu
8dd0: 73 22 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 s" ;
8de0: 36 20 20 0a 09 09 09 09 20 20 20 22 46 69 6e 61 6 ..... "Fina
8df0: 6c 20 4c 6f 67 22 20 20 20 20 20 20 20 20 20 3b l Log" ;
8e00: 20 37 20 0a 09 09 09 09 20 20 20 22 52 75 6e 20 7 ..... "Run
8e10: 44 75 72 61 74 69 6f 6e 22 20 20 20 20 20 20 3b Duration" ;
8e20: 20 38 20 0a 09 09 09 09 20 20 20 22 57 68 65 6e 8 ..... "When
8e30: 20 52 75 6e 22 20 20 20 20 20 20 20 20 20 20 3b Run" ;
8e40: 20 39 20 0a 09 09 09 09 20 20 20 22 54 61 67 73 9 ..... "Tags
8e50: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3b " ;
8e60: 20 31 30 0a 09 09 09 09 20 20 20 22 52 75 6e 20 10..... "Run
8e70: 4f 77 6e 65 72 22 20 20 20 20 20 20 20 20 20 3b Owner" ;
8e80: 20 31 31 0a 09 09 09 09 20 20 20 22 43 6f 6d 6d 11..... "Comm
8e90: 65 6e 74 22 20 20 20 20 20 20 20 20 20 20 20 3b ent" ;
8ea0: 20 31 32 0a 09 09 09 09 20 20 20 22 41 75 74 68 12..... "Auth
8eb0: 6f 72 22 20 20 20 20 20 20 20 20 20 20 20 20 3b or" ;
8ec0: 20 31 33 0a 09 09 09 09 20 20 20 22 54 65 73 74 13..... "Test
8ed0: 20 4f 77 6e 65 72 22 20 20 20 20 20 20 20 20 3b Owner" ;
8ee0: 20 31 34 0a 09 09 09 09 20 20 20 22 52 65 76 69 14..... "Revi
8ef0: 65 77 65 64 22 20 20 20 20 20 20 20 20 20 20 3b ewed" ;
8f00: 20 31 35 0a 09 09 09 09 20 20 20 22 44 69 73 6b 15..... "Disk
8f10: 66 72 65 65 22 20 20 20 20 20 20 20 20 20 20 3b free" ;
8f20: 20 31 36 0a 09 09 09 09 20 20 20 22 55 6e 61 6d 16..... "Unam
8f30: 65 22 20 20 20 20 20 20 20 20 20 20 20 20 20 3b e" ;
8f40: 20 31 37 0a 09 09 09 09 20 20 20 22 52 75 6e 64 17..... "Rund
8f50: 69 72 22 20 20 20 20 20 20 20 20 20 20 20 20 3b ir" ;
8f60: 20 31 38 0a 09 09 09 09 20 20 20 22 48 6f 73 74 18..... "Host
8f70: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3b " ;
8f80: 20 31 39 0a 09 09 09 09 20 20 20 22 43 70 75 20 19..... "Cpu
8f90: 4c 6f 61 64 22 20 20 20 20 20 20 20 20 20 20 3b Load" ;
8fa0: 20 32 30 0a 09 09 09 09 20 20 20 29 29 29 0a 09 20..... )))..
8fb0: 20 28 72 65 73 75 6c 74 73 20 28 6c 69 73 74 20 (results (list
8fc0: 72 75 6e 73 68 65 61 64 65 72 29 29 09 09 09 20 runsheader))...
8fd0: 0a 09 20 28 74 65 73 74 64 61 74 61 2d 68 65 61 .. (testdata-hea
8fe0: 64 65 72 20 28 6c 69 73 74 20 22 52 75 6e 20 49 der (list "Run I
8ff0: 64 22 20 22 54 65 73 74 6e 61 6d 65 22 20 22 49 d" "Testname" "I
9000: 74 65 6d 20 50 61 74 68 22 20 22 43 61 74 65 67 tem Path" "Categ
9010: 6f 72 79 22 20 22 56 61 72 69 61 62 6c 65 22 20 ory" "Variable"
9020: 22 56 61 6c 75 65 22 20 22 45 78 70 65 63 74 65 "Value" "Expecte
9030: 64 22 20 22 54 6f 6c 22 20 22 55 6e 69 74 73 22 d" "Tol" "Units"
9040: 20 22 53 74 61 74 75 73 22 20 22 43 6f 6d 6d 65 "Status" "Comme
9050: 6e 74 22 29 29 0a 09 20 28 6d 61 69 6e 71 72 79 nt")).. (mainqry
9060: 20 28 63 6f 6e 63 20 22 53 45 4c 45 43 54 0a 20 (conc "SELECT.
9070: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 2e 74 t.t
9080: 65 73 74 6e 61 6d 65 2c 72 2e 69 64 2c 72 75 6e estname,r.id,run
9090: 6e 61 6d 65 2c 22 20 6b 65 79 73 73 74 72 20 22 name," keysstr "
90a0: 2c 74 2e 74 65 73 74 6e 61 6d 65 2c 0a 20 20 20 ,t.testname,.
90b0: 20 20 20 20 20 20 20 20 20 20 20 74 2e 69 74 65 t.ite
90c0: 6d 5f 70 61 74 68 2c 74 6d 2e 64 65 73 63 72 69 m_path,tm.descri
90d0: 70 74 69 6f 6e 2c 74 2e 73 74 61 74 65 2c 74 2e ption,t.state,t.
90e0: 73 74 61 74 75 73 2c 0a 20 20 20 20 20 20 20 20 status,.
90f0: 20 20 20 20 20 20 66 69 6e 61 6c 5f 6c 6f 67 66 final_logf
9100: 2c 72 75 6e 5f 64 75 72 61 74 69 6f 6e 2c 20 0a ,run_duration, .
9110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 st
9120: 72 66 74 69 6d 65 28 27 25 6d 2f 25 64 2f 25 59 rftime('%m/%d/%Y
9130: 20 25 48 3a 25 4d 3a 25 53 27 2c 64 61 74 65 74 %H:%M:%S',datet
9140: 69 6d 65 28 74 2e 65 76 65 6e 74 5f 74 69 6d 65 ime(t.event_time
9150: 2c 27 75 6e 69 78 65 70 6f 63 68 27 29 2c 27 6c ,'unixepoch'),'l
9160: 6f 63 61 6c 74 69 6d 65 27 29 2c 0a 20 20 20 20 ocaltime'),.
9170: 20 20 20 20 20 20 20 20 20 20 74 6d 2e 74 61 67 tm.tag
9180: 73 2c 72 2e 6f 77 6e 65 72 2c 74 2e 63 6f 6d 6d s,r.owner,t.comm
9190: 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 ent,.
91a0: 20 20 20 61 75 74 68 6f 72 2c 0a 20 20 20 20 20 author,.
91b0: 20 20 20 20 20 20 20 20 20 74 6d 2e 6f 77 6e 65 tm.owne
91c0: 72 2c 72 65 76 69 65 77 65 64 2c 0a 20 20 20 20 r,reviewed,.
91d0: 20 20 20 20 20 20 20 20 20 20 64 69 73 6b 66 72 diskfr
91e0: 65 65 2c 75 6e 61 6d 65 2c 72 75 6e 64 69 72 2c ee,uname,rundir,
91f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68 . h
9200: 6f 73 74 2c 63 70 75 6c 6f 61 64 0a 20 20 20 20 ost,cpuload.
9210: 20 20 20 20 20 20 20 20 46 52 4f 4d 20 74 65 73 FROM tes
9220: 74 73 20 41 53 20 74 20 4a 4f 49 4e 20 72 75 6e ts AS t JOIN run
9230: 73 20 41 53 20 72 20 4f 4e 20 74 2e 72 75 6e 5f s AS r ON t.run_
9240: 69 64 3d 72 2e 69 64 20 4a 4f 49 4e 20 74 65 73 id=r.id JOIN tes
9250: 74 5f 6d 65 74 61 20 41 53 20 74 6d 20 4f 4e 20 t_meta AS tm ON
9260: 74 6d 2e 74 65 73 74 6e 61 6d 65 3d 74 2e 74 65 tm.testname=t.te
9270: 73 74 6e 61 6d 65 0a 20 20 20 20 20 20 20 20 20 stname.
9280: 20 20 20 57 48 45 52 45 20 72 75 6e 6e 61 6d 65 WHERE runname
9290: 20 4c 49 4b 45 20 3f 20 41 4e 44 20 22 20 6b 65 LIKE ? AND " ke
92a0: 79 71 72 79 20 22 3b 22 29 29 29 0a 20 20 20 20 yqry ";"))).
92b0: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 32 20 22 (debug:print 2 "
92c0: 55 73 69 6e 67 20 22 20 74 65 6d 70 64 69 72 20 Using " tempdir
92d0: 22 20 66 6f 72 20 63 6f 6e 73 74 72 75 63 74 69 " for constructi
92e0: 6e 67 20 74 68 65 20 6f 64 73 20 66 69 6c 65 2e ng the ods file.
92f0: 20 6b 65 79 71 72 79 3a 20 22 20 6b 65 79 71 72 keyqry: " keyqr
9300: 79 20 22 20 6b 65 79 73 74 72 3a 20 22 20 6b 65 y " keystr: " ke
9310: 79 73 73 74 72 20 22 20 77 69 74 68 20 6b 65 79 ysstr " with key
9320: 73 3a 20 22 20 28 6d 61 70 20 63 61 64 72 20 6b s: " (map cadr k
9330: 65 79 70 61 74 74 2d 61 6c 69 73 74 29 0a 09 09 eypatt-alist)...
9340: 20 22 5c 6e 20 20 20 20 20 20 6d 61 69 6e 71 72 "\n mainqr
9350: 79 3a 20 22 20 6d 61 69 6e 71 72 79 29 0a 20 20 y: " mainqry).
9360: 20 20 3b 3b 20 22 45 78 70 65 63 74 65 64 20 56 ;; "Expected V
9370: 61 6c 75 65 22 0a 20 20 20 20 3b 3b 20 22 56 61 alue". ;; "Va
9380: 6c 75 65 20 46 6f 75 6e 64 22 0a 20 20 20 20 3b lue Found". ;
9390: 3b 20 22 54 6f 6c 65 72 61 6e 63 65 22 0a 20 20 ; "Tolerance".
93a0: 20 20 28 61 70 70 6c 79 20 73 71 6c 69 74 65 33 (apply sqlite3
93b0: 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 09 20 :for-each-row..
93c0: 20 20 28 6c 61 6d 62 64 61 20 28 74 65 73 74 2d (lambda (test-
93d0: 69 64 20 2e 20 62 29 0a 09 20 20 20 20 20 28 73 id . b).. (s
93e0: 65 74 21 20 74 65 73 74 2d 69 64 73 20 28 63 6f et! test-ids (co
93f0: 6e 73 20 74 65 73 74 2d 69 64 20 74 65 73 74 2d ns test-id test-
9400: 69 64 73 29 29 20 20 20 3b 3b 20 74 65 73 74 2d ids)) ;; test-
9410: 69 64 20 69 73 20 6e 6f 77 20 74 65 73 74 6e 61 id is now testna
9420: 6d 65 0a 09 20 20 20 20 20 28 73 65 74 21 20 72 me.. (set! r
9430: 65 73 75 6c 74 73 20 28 61 70 70 65 6e 64 20 72 esults (append r
9440: 65 73 75 6c 74 73 20 3b 3b 20 6e 6f 74 65 2c 20 esults ;; note,
9450: 64 72 6f 70 20 74 68 65 20 74 65 73 74 2d 69 64 drop the test-id
9460: 0a 09 09 09 09 20 20 20 28 6c 69 73 74 0a 09 09 ..... (list...
9470: 09 09 20 20 20 20 28 69 66 20 70 61 74 68 6d 6f .. (if pathmo
9480: 64 0a 09 09 09 09 09 28 6c 65 74 2a 20 28 28 76 d......(let* ((v
9490: 62 20 20 20 20 20 20 20 20 28 61 70 70 6c 79 20 b (apply
94a0: 76 65 63 74 6f 72 20 62 29 29 0a 09 09 09 09 09 vector b))......
94b0: 20 20 20 20 20 20 20 28 6b 65 79 76 61 6c 73 20 (keyvals
94c0: 20 20 28 6c 65 74 20 6c 6f 6f 70 20 28 28 69 20 (let loop ((i
94d0: 20 20 20 30 29 0a 09 09 09 09 09 09 09 09 20 20 0).........
94e0: 20 20 20 28 72 65 73 20 27 28 29 29 29 0a 09 09 (res '()))...
94f0: 09 09 09 09 09 20 20 20 20 28 69 66 20 28 3e 3d ..... (if (>=
9500: 20 69 20 6e 75 6d 6b 65 79 73 29 0a 09 09 09 09 i numkeys).....
9510: 09 09 09 09 72 65 73 0a 09 09 09 09 09 09 09 09 ....res.........
9520: 28 6c 6f 6f 70 20 28 2b 20 69 20 31 29 0a 09 09 (loop (+ i 1)...
9530: 09 09 09 09 09 09 20 20 20 20 20 20 28 61 70 70 ...... (app
9540: 65 6e 64 20 72 65 73 20 28 6c 69 73 74 20 28 76 end res (list (v
9550: 65 63 74 6f 72 2d 72 65 66 20 76 62 20 28 2b 20 ector-ref vb (+
9560: 69 20 32 29 29 29 29 29 29 29 29 0a 09 09 09 09 i 2)))))))).....
9570: 09 20 20 20 20 20 20 20 28 72 75 6e 6e 61 6d 65 . (runname
9580: 20 20 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76 (vector-ref v
9590: 62 20 31 29 29 0a 09 09 09 09 09 20 20 20 20 20 b 1))......
95a0: 20 20 28 74 65 73 74 6e 61 6d 65 20 20 28 76 65 (testname (ve
95b0: 63 74 6f 72 2d 72 65 66 20 76 62 20 28 2b 20 20 ctor-ref vb (+
95c0: 32 20 6e 75 6d 6b 65 79 73 29 29 29 0a 09 09 09 2 numkeys)))....
95d0: 09 09 20 20 20 20 20 20 20 28 69 74 65 6d 2d 70 .. (item-p
95e0: 61 74 68 20 28 76 65 63 74 6f 72 2d 72 65 66 20 ath (vector-ref
95f0: 76 62 20 28 2b 20 20 33 20 6e 75 6d 6b 65 79 73 vb (+ 3 numkeys
9600: 29 29 29 0a 09 09 09 09 09 20 20 20 20 20 20 20 )))......
9610: 28 66 69 6e 61 6c 2d 6c 6f 67 20 28 76 65 63 74 (final-log (vect
9620: 6f 72 2d 72 65 66 20 76 62 20 28 2b 20 20 37 20 or-ref vb (+ 7
9630: 6e 75 6d 6b 65 79 73 29 29 29 0a 09 09 09 09 09 numkeys)))......
9640: 20 20 20 20 20 20 20 28 72 75 6e 2d 64 69 72 20 (run-dir
9650: 20 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62 (vector-ref vb
9660: 20 28 2b 20 31 38 20 6e 75 6d 6b 65 79 73 29 29 (+ 18 numkeys))
9670: 29 0a 09 09 09 09 09 20 20 20 20 20 20 20 28 6c )...... (l
9680: 6f 67 2d 66 70 61 74 68 20 28 63 6f 6e 63 20 72 og-fpath (conc r
9690: 75 6e 2d 64 69 72 20 22 2f 22 20 20 66 69 6e 61 un-dir "/" fina
96a0: 6c 2d 6c 6f 67 29 29 29 20 3b 3b 20 28 73 74 72 l-log))) ;; (str
96b0: 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 ing-intersperse
96c0: 6b 65 79 76 61 6c 73 20 22 2f 22 29 20 22 2f 22 keyvals "/") "/"
96d0: 20 74 65 73 74 6e 61 6d 65 20 22 2f 22 20 69 74 testname "/" it
96e0: 65 6d 2d 70 61 74 68 20 22 2f 22 0a 09 09 09 09 em-path "/".....
96f0: 09 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 . (debug:print
9700: 34 20 22 6c 6f 67 3a 20 22 20 6c 6f 67 2d 66 70 4 "log: " log-fp
9710: 61 74 68 20 22 20 65 78 69 73 74 73 3a 20 22 20 ath " exists: "
9720: 28 66 69 6c 65 2d 65 78 69 73 74 73 3f 20 6c 6f (file-exists? lo
9730: 67 2d 66 70 61 74 68 29 29 0a 09 09 09 09 09 20 g-fpath))......
9740: 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 76 62 (vector-set! vb
9750: 20 28 2b 20 37 20 6e 75 6d 6b 65 79 73 29 20 28 (+ 7 numkeys) (
9760: 69 66 20 28 66 69 6c 65 2d 65 78 69 73 74 73 3f if (file-exists?
9770: 20 6c 6f 67 2d 66 70 61 74 68 29 0a 09 09 09 09 log-fpath).....
9780: 09 09 09 09 09 20 20 20 20 28 6c 65 74 20 28 28 ..... (let ((
9790: 6e 65 77 70 61 74 68 20 28 63 6f 6e 63 20 70 61 newpath (conc pa
97a0: 74 68 6d 6f 64 20 22 2f 22 0a 09 09 09 09 09 09 thmod "/".......
97b0: 09 09 09 09 09 09 20 28 73 74 72 69 6e 67 2d 69 ...... (string-i
97c0: 6e 74 65 72 73 70 65 72 73 65 20 6b 65 79 76 61 ntersperse keyva
97d0: 6c 73 20 22 2f 22 29 0a 09 09 09 09 09 09 09 09 ls "/").........
97e0: 09 09 09 09 20 22 2f 22 20 72 75 6e 6e 61 6d 65 .... "/" runname
97f0: 20 22 2f 22 20 74 65 73 74 6e 61 6d 65 20 22 2f "/" testname "/
9800: 22 0a 09 09 09 09 09 09 09 09 09 09 09 09 20 28 "............. (
9810: 69 66 20 28 73 74 72 69 6e 67 3d 3f 20 69 74 65 if (string=? ite
9820: 6d 2d 70 61 74 68 20 22 22 29 20 22 22 20 28 63 m-path "") "" (c
9830: 6f 6e 63 20 22 2f 22 20 69 74 65 6d 2d 70 61 74 onc "/" item-pat
9840: 68 29 29 0a 09 09 09 09 09 09 09 09 09 09 09 09 h)).............
9850: 20 66 69 6e 61 6c 2d 6c 6f 67 29 29 29 0a 09 09 final-log)))...
9860: 09 09 09 09 09 09 09 20 20 20 20 20 20 3b 3b 20 ....... ;;
9870: 66 6f 72 20 6e 6f 77 20 74 68 72 6f 77 20 61 77 for now throw aw
9880: 61 79 20 6e 65 77 70 61 74 68 20 61 6e 64 20 75 ay newpath and u
9890: 73 65 20 74 68 65 20 6c 6f 67 2d 66 70 61 74 68 se the log-fpath
98a0: 20 63 6f 6e 63 27 64 20 77 69 74 68 20 70 61 74 conc'd with pat
98b0: 68 6d 6f 64 0a 09 09 09 09 09 09 09 09 09 20 20 hmod..........
98c0: 20 20 20 20 28 73 65 74 21 20 6e 65 77 70 61 74 (set! newpat
98d0: 68 20 28 63 6f 6e 63 20 70 61 74 68 6d 6f 64 20 h (conc pathmod
98e0: 6c 6f 67 2d 66 70 61 74 68 29 29 0a 09 09 09 09 log-fpath)).....
98f0: 09 09 09 09 09 20 20 20 20 20 20 28 69 66 20 77 ..... (if w
9900: 69 6e 64 6f 77 73 20 28 73 74 72 69 6e 67 2d 74 indows (string-t
9910: 72 61 6e 73 6c 61 74 65 20 6e 65 77 70 61 74 68 ranslate newpath
9920: 20 22 2f 22 20 22 5c 5c 22 29 20 6e 65 77 70 61 "/" "\\") newpa
9930: 74 68 29 29 0a 09 09 09 09 09 09 09 09 09 20 20 th))..........
9940: 20 20 28 69 66 20 28 3e 20 2a 76 65 72 62 6f 73 (if (> *verbos
9950: 69 74 79 2a 20 31 29 0a 09 09 09 09 09 09 09 09 ity* 1).........
9960: 09 09 28 63 6f 6e 63 20 66 69 6e 61 6c 2d 6c 6f ..(conc final-lo
9970: 67 20 22 20 6e 6f 74 2d 66 6f 75 6e 64 22 29 0a g " not-found").
9980: 09 09 09 09 09 09 09 09 09 09 22 22 29 29 29 0a ..........""))).
9990: 09 09 09 09 09 20 20 28 76 65 63 74 6f 72 2d 3e ..... (vector->
99a0: 6c 69 73 74 20 76 62 29 29 0a 09 09 09 09 09 62 list vb))......b
99b0: 29 29 29 29 29 0a 09 20 20 20 64 62 0a 09 20 20 ))))).. db..
99c0: 20 6d 61 69 6e 71 72 79 0a 09 20 20 20 72 75 6e mainqry.. run
99d0: 73 70 61 74 74 20 28 6d 61 70 20 63 61 64 72 20 spatt (map cadr
99e0: 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 29 29 0a keypatt-alist)).
99f0: 20 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 (debug:print
9a00: 20 32 20 22 46 6f 75 6e 64 20 22 20 28 6c 65 6e 2 "Found " (len
9a10: 67 74 68 20 74 65 73 74 2d 69 64 73 29 20 22 20 gth test-ids) "
9a20: 72 65 63 6f 72 64 73 22 29 0a 20 20 20 20 28 73 records"). (s
9a30: 65 74 21 20 72 65 73 75 6c 74 73 20 28 6c 69 73 et! results (lis
9a40: 74 20 28 63 6f 6e 73 20 22 52 75 6e 73 22 20 72 t (cons "Runs" r
9a50: 65 73 75 6c 74 73 29 29 29 0a 20 20 20 20 3b 3b esults))). ;;
9a60: 20 6e 6f 77 2c 20 66 6f 72 20 65 61 63 68 20 74 now, for each t
9a70: 65 73 74 2c 20 63 6f 6c 6c 65 63 74 20 74 68 65 est, collect the
9a80: 20 74 65 73 74 5f 64 61 74 61 20 69 6e 66 6f 20 test_data info
9a90: 61 6e 64 20 61 64 64 20 61 20 6e 65 77 20 73 68 and add a new sh
9aa0: 65 65 74 0a 20 20 20 20 28 66 6f 72 2d 65 61 63 eet. (for-eac
9ab0: 68 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 h. (lambda (
9ac0: 74 65 73 74 2d 69 64 29 0a 20 20 20 20 20 20 20 test-id).
9ad0: 28 6c 65 74 20 28 28 74 65 73 74 2d 64 61 74 61 (let ((test-data
9ae0: 20 28 6c 69 73 74 20 74 65 73 74 64 61 74 61 2d (list testdata-
9af0: 68 65 61 64 65 72 29 29 0a 09 20 20 20 20 20 28 header)).. (
9b00: 63 75 72 72 2d 74 65 73 74 2d 6e 61 6d 65 20 23 curr-test-name #
9b10: 66 29 29 0a 09 20 28 73 71 6c 69 74 65 33 3a 66 f)).. (sqlite3:f
9b20: 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 09 20 20 28 or-each-row.. (
9b30: 6c 61 6d 62 64 61 20 28 72 75 6e 2d 69 64 20 74 lambda (run-id t
9b40: 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 estname item-pat
9b50: 68 20 63 61 74 65 67 6f 72 79 20 76 61 72 69 61 h category varia
9b60: 62 6c 65 20 76 61 6c 75 65 20 65 78 70 65 63 74 ble value expect
9b70: 65 64 20 74 6f 6c 20 75 6e 69 74 73 20 73 74 61 ed tol units sta
9b80: 74 75 73 20 63 6f 6d 6d 65 6e 74 29 0a 09 20 20 tus comment)..
9b90: 20 20 28 73 65 74 21 20 63 75 72 72 2d 74 65 73 (set! curr-tes
9ba0: 74 2d 6e 61 6d 65 20 74 65 73 74 6e 61 6d 65 29 t-name testname)
9bb0: 0a 09 20 20 20 20 28 73 65 74 21 20 74 65 73 74 .. (set! test
9bc0: 2d 64 61 74 61 20 28 61 70 70 65 6e 64 20 74 65 -data (append te
9bd0: 73 74 2d 64 61 74 61 20 28 6c 69 73 74 20 28 6c st-data (list (l
9be0: 69 73 74 20 72 75 6e 2d 69 64 20 74 65 73 74 6e ist run-id testn
9bf0: 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 63 61 ame item-path ca
9c00: 74 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65 20 tegory variable
9c10: 76 61 6c 75 65 20 65 78 70 65 63 74 65 64 20 74 value expected t
9c20: 6f 6c 20 75 6e 69 74 73 20 73 74 61 74 75 73 20 ol units status
9c30: 63 6f 6d 6d 65 6e 74 29 29 29 29 29 0a 09 20 20 comment)))))..
9c40: 64 62 20 0a 09 20 20 3b 3b 20 22 53 45 4c 45 43 db .. ;; "SELEC
9c50: 54 20 72 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d T run_id,testnam
9c60: 65 2c 69 74 65 6d 5f 70 61 74 68 2c 63 61 74 65 e,item_path,cate
9c70: 67 6f 72 79 2c 76 61 72 69 61 62 6c 65 2c 74 64 gory,variable,td
9c80: 2e 76 61 6c 75 65 20 41 53 20 76 61 6c 75 65 2c .value AS value,
9c90: 65 78 70 65 63 74 65 64 2c 74 6f 6c 2c 75 6e 69 expected,tol,uni
9ca0: 74 73 2c 74 64 2e 73 74 61 74 75 73 20 41 53 20 ts,td.status AS
9cb0: 73 74 61 74 75 73 2c 74 64 2e 63 6f 6d 6d 65 6e status,td.commen
9cc0: 74 20 41 53 20 63 6f 6d 6d 65 6e 74 20 46 52 4f t AS comment FRO
9cd0: 4d 20 74 65 73 74 5f 64 61 74 61 20 41 53 20 74 M test_data AS t
9ce0: 64 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 74 65 73 d INNER JOIN tes
9cf0: 74 73 20 4f 4e 20 74 65 73 74 73 2e 69 64 3d 74 ts ON tests.id=t
9d00: 64 2e 74 65 73 74 5f 69 64 20 57 48 45 52 45 20 d.test_id WHERE
9d10: 74 65 73 74 5f 69 64 3d 3f 3b 22 0a 09 20 20 22 test_id=?;".. "
9d20: 53 45 4c 45 43 54 20 72 75 6e 5f 69 64 2c 74 65 SELECT run_id,te
9d30: 73 74 6e 61 6d 65 2c 69 74 65 6d 5f 70 61 74 68 stname,item_path
9d40: 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62 ,category,variab
9d50: 6c 65 2c 74 64 2e 76 61 6c 75 65 20 41 53 20 76 le,td.value AS v
9d60: 61 6c 75 65 2c 74 64 2e 65 78 70 65 63 74 65 64 alue,td.expected
9d70: 2c 74 64 2e 74 6f 6c 2c 74 64 2e 75 6e 69 74 73 ,td.tol,td.units
9d80: 2c 74 64 2e 73 74 61 74 75 73 20 41 53 20 73 74 ,td.status AS st
9d90: 61 74 75 73 2c 74 64 2e 63 6f 6d 6d 65 6e 74 20 atus,td.comment
9da0: 41 53 20 63 6f 6d 6d 65 6e 74 20 46 52 4f 4d 20 AS comment FROM
9db0: 74 65 73 74 5f 64 61 74 61 20 41 53 20 74 64 20 test_data AS td
9dc0: 49 4e 4e 45 52 20 4a 4f 49 4e 20 74 65 73 74 73 INNER JOIN tests
9dd0: 20 4f 4e 20 74 65 73 74 73 2e 69 64 3d 74 64 2e ON tests.id=td.
9de0: 74 65 73 74 5f 69 64 20 57 48 45 52 45 20 74 65 test_id WHERE te
9df0: 73 74 6e 61 6d 65 3d 3f 3b 22 0a 09 20 20 74 65 stname=?;".. te
9e00: 73 74 2d 69 64 29 0a 09 20 28 69 66 20 63 75 72 st-id).. (if cur
9e10: 72 2d 74 65 73 74 2d 6e 61 6d 65 0a 09 20 20 20 r-test-name..
9e20: 20 20 28 73 65 74 21 20 72 65 73 75 6c 74 73 20 (set! results
9e30: 28 61 70 70 65 6e 64 20 72 65 73 75 6c 74 73 20 (append results
9e40: 28 6c 69 73 74 20 28 63 6f 6e 73 20 63 75 72 72 (list (cons curr
9e50: 2d 74 65 73 74 2d 6e 61 6d 65 20 74 65 73 74 2d -test-name test-
9e60: 64 61 74 61 29 29 29 29 29 0a 09 20 29 29 0a 20 data))))).. )).
9e70: 20 20 20 20 28 73 6f 72 74 20 28 64 65 6c 65 74 (sort (delet
9e80: 65 2d 64 75 70 6c 69 63 61 74 65 73 20 74 65 73 e-duplicates tes
9e90: 74 2d 69 64 73 29 20 73 74 72 69 6e 67 3c 3d 29 t-ids) string<=)
9ea0: 29 0a 20 20 20 20 28 73 79 73 74 65 6d 20 28 63 ). (system (c
9eb0: 6f 6e 63 20 22 6d 6b 64 69 72 20 2d 70 20 22 20 onc "mkdir -p "
9ec0: 74 65 6d 70 64 69 72 29 29 0a 20 20 20 20 3b 3b tempdir)). ;;
9ed0: 20 28 70 70 20 72 65 73 75 6c 74 73 29 0a 20 20 (pp results).
9ee0: 20 20 28 6f 64 73 3a 6c 69 73 74 2d 3e 6f 64 73 (ods:list->ods
9ef0: 20 0a 20 20 20 20 20 74 65 6d 70 64 69 72 0a 20 . tempdir.
9f00: 20 20 20 20 28 69 66 20 28 73 74 72 69 6e 67 2d (if (string-
9f10: 6d 61 74 63 68 20 28 72 65 67 65 78 70 20 22 5e match (regexp "^
9f20: 5b 2f 7e 5d 2b 2e 2a 22 29 20 6f 75 74 70 75 74 [/~]+.*") output
9f30: 66 69 6c 65 29 20 3b 3b 20 66 75 6c 6c 20 70 61 file) ;; full pa
9f40: 74 68 3f 0a 09 20 6f 75 74 70 75 74 66 69 6c 65 th?.. outputfile
9f50: 0a 09 20 28 62 65 67 69 6e 0a 09 20 20 20 28 64 .. (begin.. (d
9f60: 65 62 75 67 3a 70 72 69 6e 74 20 30 20 22 57 41 ebug:print 0 "WA
9f70: 52 4e 49 4e 47 3a 20 70 61 74 68 20 67 69 76 65 RNING: path give
9f80: 6e 2c 20 22 20 6f 75 74 70 75 74 66 69 6c 65 20 n, " outputfile
9f90: 22 20 69 73 20 72 65 6c 61 74 69 76 65 2c 20 70 " is relative, p
9fa0: 72 65 66 69 78 69 6e 67 20 77 69 74 68 20 63 75 refixing with cu
9fb0: 72 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 22 rrent directory"
9fc0: 29 0a 09 20 20 20 28 63 6f 6e 63 20 28 63 75 72 ).. (conc (cur
9fd0: 72 65 6e 74 2d 64 69 72 65 63 74 6f 72 79 29 20 rent-directory)
9fe0: 22 2f 22 20 6f 75 74 70 75 74 66 69 6c 65 29 29 "/" outputfile))
9ff0: 29 0a 20 20 20 20 20 72 65 73 75 6c 74 73 29 0a ). results).
a000: 20 20 20 20 3b 3b 20 62 72 75 74 61 6c 20 63 6c ;; brutal cl
a010: 65 61 6e 20 75 70 0a 20 20 20 20 28 73 79 73 74 ean up. (syst
a020: 65 6d 20 22 72 6d 20 2d 72 66 20 74 65 6d 70 64 em "rm -rf tempd
a030: 69 72 22 29 29 29 0a 0a 3b 3b 20 28 64 62 3a 65 ir")))..;; (db:e
a040: 78 74 72 61 63 74 2d 6f 64 73 2d 66 69 6c 65 20 xtract-ods-file
a050: 64 62 20 22 6f 75 74 70 75 74 66 69 6c 65 2e 6f db "outputfile.o
a060: 64 73 22 20 27 28 28 22 73 79 73 6e 61 6d 65 22 ds" '(("sysname"
a070: 20 22 25 22 29 28 22 66 73 6e 61 6d 65 22 20 22 "%")("fsname" "
a080: 25 22 29 28 22 64 61 74 61 70 61 74 68 22 20 22 %")("datapath" "
a090: 25 22 29 29 20 22 25 22 29 0a %")) "%").