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 20 4d 69 73 63 2e 20 74 65 73 74 20 ..;; Misc. test
5570: 72 65 6c 61 74 65 64 20 71 75 65 72 69 65 73 0a related queries.
5580: 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74 (define (db:test
5590: 2d 67 65 74 2d 70 61 74 68 73 2d 6d 61 74 63 68 -get-paths-match
55a0: 69 6e 67 20 64 62 20 6b 65 79 6e 61 6d 65 73 20 ing db keynames
55b0: 74 61 72 67 65 74 29 0a 20 20 28 6c 65 74 2a 20 target). (let*
55c0: 28 28 72 65 73 20 27 28 29 29 0a 09 20 28 69 74 ((res '()).. (it
55d0: 65 6d 70 61 74 74 20 20 20 28 69 66 20 28 61 72 empatt (if (ar
55e0: 67 73 3a 67 65 74 2d 61 72 67 20 22 2d 69 74 65 gs:get-arg "-ite
55f0: 6d 70 61 74 74 22 29 28 61 72 67 73 3a 67 65 74 mpatt")(args:get
5600: 2d 61 72 67 20 22 2d 69 74 65 6d 70 61 74 74 22 -arg "-itempatt"
5610: 29 20 22 25 22 29 29 0a 09 20 28 74 65 73 74 70 ) "%")).. (testp
5620: 61 74 74 20 20 20 28 69 66 20 28 61 72 67 73 3a att (if (args:
5630: 67 65 74 2d 61 72 67 20 22 2d 74 65 73 74 70 61 get-arg "-testpa
5640: 74 74 22 29 28 61 72 67 73 3a 67 65 74 2d 61 72 tt")(args:get-ar
5650: 67 20 22 2d 74 65 73 74 70 61 74 74 22 29 20 22 g "-testpatt") "
5660: 25 22 29 29 0a 09 20 28 73 74 61 74 65 70 61 74 %")).. (statepat
5670: 74 20 20 28 69 66 20 28 61 72 67 73 3a 67 65 74 t (if (args:get
5680: 2d 61 72 67 20 22 3a 73 74 61 74 65 22 29 20 20 -arg ":state")
5690: 20 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22 (args:get-arg "
56a0: 3a 73 74 61 74 65 22 29 20 20 20 20 22 25 22 29 :state") "%")
56b0: 29 0a 09 20 28 73 74 61 74 75 73 70 61 74 74 20 ).. (statuspatt
56c0: 28 69 66 20 28 61 72 67 73 3a 67 65 74 2d 61 72 (if (args:get-ar
56d0: 67 20 22 3a 73 74 61 74 75 73 22 29 20 20 28 61 g ":status") (a
56e0: 72 67 73 3a 67 65 74 2d 61 72 67 20 22 3a 73 74 rgs:get-arg ":st
56f0: 61 74 75 73 22 29 20 20 20 22 25 22 29 29 0a 09 atus") "%"))..
5700: 20 28 72 75 6e 6e 61 6d 65 20 20 20 20 28 69 66 (runname (if
5710: 20 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22 (args:get-arg "
5720: 3a 72 75 6e 6e 61 6d 65 22 29 20 28 61 72 67 73 :runname") (args
5730: 3a 67 65 74 2d 61 72 67 20 22 3a 72 75 6e 6e 61 :get-arg ":runna
5740: 6d 65 22 29 20 20 22 25 22 29 29 0a 09 20 28 6b me") "%")).. (k
5750: 65 79 73 74 72 20 28 73 74 72 69 6e 67 2d 69 6e eystr (string-in
5760: 74 65 72 73 70 65 72 73 65 20 0a 09 09 20 20 28 tersperse ... (
5770: 6d 61 70 20 28 6c 61 6d 62 64 61 20 28 6b 65 79 map (lambda (key
5780: 20 76 61 6c 29 0a 09 09 09 20 28 63 6f 6e 63 20 val).... (conc
5790: 22 72 2e 22 20 6b 65 79 20 22 20 6c 69 6b 65 20 "r." key " like
57a0: 27 22 20 76 61 6c 20 22 27 22 29 29 0a 09 09 20 '" val "'"))...
57b0: 20 20 20 20 20 20 6b 65 79 6e 61 6d 65 73 20 0a keynames .
57c0: 09 09 20 20 20 20 20 20 20 28 73 74 72 69 6e 67 .. (string
57d0: 2d 73 70 6c 69 74 20 74 61 72 67 65 74 20 22 2f -split target "/
57e0: 22 29 29 0a 09 09 20 20 22 20 41 4e 44 20 22 29 "))... " AND ")
57f0: 29 0a 09 20 28 71 72 79 73 74 72 20 28 63 6f 6e ).. (qrystr (con
5800: 63 20 22 53 45 4c 45 43 54 20 74 2e 72 75 6e 64 c "SELECT t.rund
5810: 69 72 20 46 52 4f 4d 20 74 65 73 74 73 20 41 53 ir FROM tests AS
5820: 20 74 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 72 75 t INNER JOIN ru
5830: 6e 73 20 41 53 20 72 20 4f 4e 20 74 2e 72 75 6e ns AS r ON t.run
5840: 5f 69 64 3d 72 2e 69 64 20 57 48 45 52 45 20 22 _id=r.id WHERE "
5850: 0a 09 09 20 20 20 20 20 20 20 6b 65 79 73 74 72 ... keystr
5860: 20 22 20 41 4e 44 20 72 2e 72 75 6e 6e 61 6d 65 " AND r.runname
5870: 20 4c 49 4b 45 20 27 22 20 72 75 6e 6e 61 6d 65 LIKE '" runname
5880: 20 22 27 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 "' AND item_pat
5890: 68 20 4c 49 4b 45 20 27 22 20 69 74 65 6d 70 61 h LIKE '" itempa
58a0: 74 74 20 22 27 20 41 4e 44 20 74 65 73 74 6e 61 tt "' AND testna
58b0: 6d 65 20 4c 49 4b 45 20 27 22 0a 09 09 20 20 20 me LIKE '"...
58c0: 20 20 20 20 74 65 73 74 70 61 74 74 20 22 27 20 testpatt "'
58d0: 41 4e 44 20 74 2e 73 74 61 74 65 20 4c 49 4b 45 AND t.state LIKE
58e0: 20 27 22 20 73 74 61 74 65 70 61 74 74 20 22 27 '" statepatt "'
58f0: 20 41 4e 44 20 74 2e 73 74 61 74 75 73 20 4c 49 AND t.status LI
5900: 4b 45 20 27 22 20 73 74 61 74 75 73 70 61 74 74 KE '" statuspatt
5910: 20 0a 09 09 20 20 20 20 20 20 20 22 27 4f 52 44 ... "'ORD
5920: 45 52 20 42 59 20 74 2e 65 76 65 6e 74 5f 74 69 ER BY t.event_ti
5930: 6d 65 20 41 53 43 3b 22 29 29 29 0a 20 20 20 20 me ASC;"))).
5940: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 33 20 22 (debug:print 3 "
5950: 71 72 79 73 74 72 3a 20 22 20 71 72 79 73 74 72 qrystr: " qrystr
5960: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 ). (sqlite3:f
5970: 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20 20 or-each-row .
5980: 20 20 28 6c 61 6d 62 64 61 20 28 70 29 0a 20 20 (lambda (p).
5990: 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28 (set! res (
59a0: 63 6f 6e 73 20 70 20 72 65 73 29 29 29 0a 20 20 cons p res))).
59b0: 20 20 20 64 62 20 0a 20 20 20 20 20 71 72 79 73 db . qrys
59c0: 74 72 29 0a 20 20 20 20 72 65 73 29 29 0a 0a 0a tr). res))...
59d0: 3b 3b 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 3d 3d 3d 3d ================
5a10: 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 54 65 73 74 ========.;; Test
5a20: 73 20 6d 65 74 61 20 64 61 74 61 0a 3b 3b 3d 3d s meta data.;;==
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 3d 3d 3d 3d 3d ================
5a70: 3d 3d 3d 3d 0a 0a 3b 3b 20 72 65 61 64 20 74 68 ====..;; read th
5a80: 65 20 72 65 63 6f 72 64 20 67 69 76 65 6e 20 61 e record given a
5a90: 20 74 65 73 74 6e 61 6d 65 0a 28 64 65 66 69 6e testname.(defin
5aa0: 65 20 28 64 62 3a 74 65 73 74 6d 65 74 61 2d 67 e (db:testmeta-g
5ab0: 65 74 2d 72 65 63 6f 72 64 20 64 62 20 74 65 73 et-record db tes
5ac0: 74 6e 61 6d 65 29 0a 20 20 28 6c 65 74 20 28 28 tname). (let ((
5ad0: 72 65 73 20 23 66 29 29 0a 20 20 20 20 28 73 71 res #f)). (sq
5ae0: 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 lite3:for-each-r
5af0: 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 ow. (lambda
5b00: 28 69 64 20 74 65 73 74 6e 61 6d 65 20 61 75 74 (id testname aut
5b10: 68 6f 72 20 6f 77 6e 65 72 20 64 65 73 63 72 69 hor owner descri
5b20: 70 74 69 6f 6e 20 72 65 76 69 65 77 65 64 20 69 ption reviewed i
5b30: 74 65 72 61 74 65 64 20 61 76 67 5f 72 75 6e 74 terated avg_runt
5b40: 69 6d 65 20 61 76 67 5f 64 69 73 6b 20 74 61 67 ime avg_disk tag
5b50: 73 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 s). (set!
5b60: 72 65 73 20 28 76 65 63 74 6f 72 20 69 64 20 74 res (vector id t
5b70: 65 73 74 6e 61 6d 65 20 61 75 74 68 6f 72 20 6f estname author o
5b80: 77 6e 65 72 20 64 65 73 63 72 69 70 74 69 6f 6e wner description
5b90: 20 72 65 76 69 65 77 65 64 20 69 74 65 72 61 74 reviewed iterat
5ba0: 65 64 20 61 76 67 5f 72 75 6e 74 69 6d 65 20 61 ed avg_runtime a
5bb0: 76 67 5f 64 69 73 6b 20 74 61 67 73 29 29 29 0a vg_disk tags))).
5bc0: 20 20 20 20 20 64 62 20 22 53 45 4c 45 43 54 20 db "SELECT
5bd0: 69 64 2c 74 65 73 74 6e 61 6d 65 2c 61 75 74 68 id,testname,auth
5be0: 6f 72 2c 6f 77 6e 65 72 2c 64 65 73 63 72 69 70 or,owner,descrip
5bf0: 74 69 6f 6e 2c 72 65 76 69 65 77 65 64 2c 69 74 tion,reviewed,it
5c00: 65 72 61 74 65 64 2c 61 76 67 5f 72 75 6e 74 69 erated,avg_runti
5c10: 6d 65 2c 61 76 67 5f 64 69 73 6b 2c 74 61 67 73 me,avg_disk,tags
5c20: 20 46 52 4f 4d 20 74 65 73 74 5f 6d 65 74 61 20 FROM test_meta
5c30: 57 48 45 52 45 20 74 65 73 74 6e 61 6d 65 3d 3f WHERE testname=?
5c40: 3b 22 0a 20 20 20 20 20 74 65 73 74 6e 61 6d 65 ;". testname
5c50: 29 0a 20 20 20 20 72 65 73 29 29 0a 0a 3b 3b 20 ). res))..;;
5c60: 63 72 65 61 74 65 20 61 20 6e 65 77 20 72 65 63 create a new rec
5c70: 6f 72 64 20 66 6f 72 20 61 20 67 69 76 65 6e 20 ord for a given
5c80: 74 65 73 74 6e 61 6d 65 0a 28 64 65 66 69 6e 65 testname.(define
5c90: 20 28 64 62 3a 74 65 73 74 6d 65 74 61 2d 61 64 (db:testmeta-ad
5ca0: 64 2d 72 65 63 6f 72 64 20 64 62 20 74 65 73 74 d-record db test
5cb0: 6e 61 6d 65 29 0a 20 20 28 73 71 6c 69 74 65 33 name). (sqlite3
5cc0: 3a 65 78 65 63 75 74 65 20 64 62 20 22 49 4e 53 :execute db "INS
5cd0: 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e ERT OR IGNORE IN
5ce0: 54 4f 20 74 65 73 74 5f 6d 65 74 61 20 28 74 65 TO test_meta (te
5cf0: 73 74 6e 61 6d 65 2c 61 75 74 68 6f 72 2c 6f 77 stname,author,ow
5d00: 6e 65 72 2c 64 65 73 63 72 69 70 74 69 6f 6e 2c ner,description,
5d10: 72 65 76 69 65 77 65 64 2c 69 74 65 72 61 74 65 reviewed,iterate
5d20: 64 2c 61 76 67 5f 72 75 6e 74 69 6d 65 2c 61 76 d,avg_runtime,av
5d30: 67 5f 64 69 73 6b 2c 74 61 67 73 29 20 56 41 4c g_disk,tags) VAL
5d40: 55 45 53 20 28 3f 2c 27 27 2c 27 27 2c 27 27 2c UES (?,'','','',
5d50: 27 27 2c 27 27 2c 27 27 2c 27 27 2c 27 27 29 3b '','','','','');
5d60: 22 20 74 65 73 74 6e 61 6d 65 29 29 0a 0a 3b 3b " testname))..;;
5d70: 20 75 70 64 61 74 65 20 6f 6e 65 20 6f 66 20 74 update one of t
5d80: 68 65 20 74 65 73 74 6d 65 74 61 20 66 69 65 6c he testmeta fiel
5d90: 64 73 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 74 ds.(define (db:t
5da0: 65 73 74 6d 65 74 61 2d 75 70 64 61 74 65 2d 66 estmeta-update-f
5db0: 69 65 6c 64 20 64 62 20 74 65 73 74 6e 61 6d 65 ield db testname
5dc0: 20 66 69 65 6c 64 20 76 61 6c 75 65 29 0a 20 20 field value).
5dd0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 (sqlite3:execute
5de0: 20 64 62 20 28 63 6f 6e 63 20 22 55 50 44 41 54 db (conc "UPDAT
5df0: 45 20 74 65 73 74 5f 6d 65 74 61 20 53 45 54 20 E test_meta SET
5e00: 22 20 66 69 65 6c 64 20 22 3d 3f 20 57 48 45 52 " field "=? WHER
5e10: 45 20 74 65 73 74 6e 61 6d 65 3d 3f 3b 22 29 20 E testname=?;")
5e20: 76 61 6c 75 65 20 74 65 73 74 6e 61 6d 65 29 29 value testname))
5e30: 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ..;;============
5e40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5e50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5e60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5e70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 54 20 ==========.;; T
5e80: 45 20 53 20 54 20 20 20 44 20 41 20 54 20 41 20 E S T D A T A
5e90: 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d .;;=============
5ea0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5eb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5ec0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5ed0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65 66 69 =========..(defi
5ee0: 6e 65 20 28 64 62 3a 63 73 76 2d 3e 74 65 73 74 ne (db:csv->test
5ef0: 2d 64 61 74 61 20 64 62 20 74 65 73 74 2d 69 64 -data db test-id
5f00: 20 63 73 76 64 61 74 61 29 0a 20 20 28 64 65 62 csvdata). (deb
5f10: 75 67 3a 70 72 69 6e 74 20 34 20 22 74 65 73 74 ug:print 4 "test
5f20: 2d 69 64 20 22 20 74 65 73 74 2d 69 64 20 22 2c -id " test-id ",
5f30: 20 63 73 76 64 61 74 61 3a 20 22 20 63 73 76 64 csvdata: " csvd
5f40: 61 74 61 29 0a 20 20 28 6c 65 74 20 28 28 63 73 ata). (let ((cs
5f50: 76 6c 69 73 74 20 28 63 73 76 2d 3e 6c 69 73 74 vlist (csv->list
5f60: 20 28 6d 61 6b 65 2d 63 73 76 2d 72 65 61 64 65 (make-csv-reade
5f70: 72 0a 09 09 09 20 20 20 20 20 28 6f 70 65 6e 2d r.... (open-
5f80: 69 6e 70 75 74 2d 73 74 72 69 6e 67 20 63 73 76 input-string csv
5f90: 64 61 74 61 29 0a 09 09 09 20 20 20 20 20 27 28 data).... '(
5fa0: 28 73 74 72 69 70 2d 6c 65 61 64 69 6e 67 2d 77 (strip-leading-w
5fb0: 68 69 74 65 73 70 61 63 65 3f 20 23 74 29 0a 09 hitespace? #t)..
5fc0: 09 09 20 20 20 20 20 20 20 28 73 74 72 69 70 2d .. (strip-
5fd0: 74 72 61 69 6c 69 6e 67 2d 77 68 69 74 65 73 70 trailing-whitesp
5fe0: 61 63 65 3f 20 23 74 29 29 20 29 29 29 29 20 3b ace? #t)) )))) ;
5ff0: 3b 20 28 63 73 76 2d 3e 6c 69 73 74 20 63 73 76 ; (csv->list csv
6000: 64 61 74 61 29 29 29 0a 20 20 20 20 28 66 6f 72 data))). (for
6010: 2d 65 61 63 68 20 0a 20 20 20 20 20 28 6c 61 6d -each . (lam
6020: 62 64 61 20 28 63 73 76 72 6f 77 29 0a 20 20 20 bda (csvrow).
6030: 20 20 20 20 28 6c 65 74 2a 20 28 28 70 61 64 64 (let* ((padd
6040: 65 64 2d 72 6f 77 20 20 28 74 61 6b 65 20 28 61 ed-row (take (a
6050: 70 70 65 6e 64 20 63 73 76 72 6f 77 20 28 6c 69 ppend csvrow (li
6060: 73 74 20 23 66 20 23 66 20 23 66 20 23 66 20 23 st #f #f #f #f #
6070: 66 20 23 66 20 23 66 20 23 66 20 23 66 29 29 20 f #f #f #f #f))
6080: 39 29 29 0a 09 20 20 20 20 20 20 28 63 61 74 65 9)).. (cate
6090: 67 6f 72 79 20 20 20 20 28 6c 69 73 74 2d 72 65 gory (list-re
60a0: 66 20 70 61 64 64 65 64 2d 72 6f 77 20 30 29 29 f padded-row 0))
60b0: 0a 09 20 20 20 20 20 20 28 76 61 72 69 61 62 6c .. (variabl
60c0: 65 20 20 20 20 28 6c 69 73 74 2d 72 65 66 20 70 e (list-ref p
60d0: 61 64 64 65 64 2d 72 6f 77 20 31 29 29 0a 09 20 added-row 1))..
60e0: 20 20 20 20 20 28 76 61 6c 75 65 20 20 20 20 20 (value
60f0: 20 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 2d 69 (any->number-i
6100: 66 2d 70 6f 73 73 69 62 6c 65 20 28 6c 69 73 74 f-possible (list
6110: 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20 -ref padded-row
6120: 32 29 29 29 0a 09 20 20 20 20 20 20 28 65 78 70 2))).. (exp
6130: 65 63 74 65 64 20 20 20 20 28 61 6e 79 2d 3e 6e ected (any->n
6140: 75 6d 62 65 72 2d 69 66 2d 70 6f 73 73 69 62 6c umber-if-possibl
6150: 65 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64 64 e (list-ref padd
6160: 65 64 2d 72 6f 77 20 33 29 29 29 0a 09 20 20 20 ed-row 3)))..
6170: 20 20 20 28 74 6f 6c 20 20 20 20 20 20 20 20 20 (tol
6180: 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 2d 69 66 2d (any->number-if-
6190: 70 6f 73 73 69 62 6c 65 20 28 6c 69 73 74 2d 72 possible (list-r
61a0: 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20 34 29 ef padded-row 4)
61b0: 29 29 20 3b 3b 20 3e 2c 20 3c 2c 20 3e 3d 2c 20 )) ;; >, <, >=,
61c0: 3c 3d 2c 20 6f 72 20 61 20 6e 75 6d 62 65 72 0a <=, or a number.
61d0: 09 20 20 20 20 20 20 28 75 6e 69 74 73 20 20 20 . (units
61e0: 20 20 20 20 28 6c 69 73 74 2d 72 65 66 20 70 61 (list-ref pa
61f0: 64 64 65 64 2d 72 6f 77 20 35 29 29 0a 09 20 20 dded-row 5))..
6200: 20 20 20 20 28 63 6f 6d 6d 65 6e 74 20 20 20 20 (comment
6210: 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65 (list-ref padde
6220: 64 2d 72 6f 77 20 36 29 29 0a 09 20 20 20 20 20 d-row 6))..
6230: 20 28 73 74 61 74 75 73 20 20 20 20 20 20 28 6c (status (l
6240: 65 74 20 28 28 73 20 28 6c 69 73 74 2d 72 65 66 et ((s (list-ref
6250: 20 70 61 64 64 65 64 2d 72 6f 77 20 37 29 29 29 padded-row 7)))
6260: 0a 09 09 09 20 20 20 20 20 28 69 66 20 28 61 6e .... (if (an
6270: 64 20 28 73 74 72 69 6e 67 3f 20 73 29 28 6f 72 d (string? s)(or
6280: 20 28 73 74 72 69 6e 67 2d 6d 61 74 63 68 20 28 (string-match (
6290: 72 65 67 65 78 70 20 22 5e 5c 5c 73 2a 24 22 29 regexp "^\\s*$")
62a0: 20 73 29 0a 09 09 09 09 09 09 20 20 20 20 20 28 s)....... (
62b0: 73 74 72 69 6e 67 2d 6d 61 74 63 68 20 28 72 65 string-match (re
62c0: 67 65 78 70 20 22 5e 6e 2f 61 24 22 29 20 73 29 gexp "^n/a$") s)
62d0: 29 29 0a 09 09 09 09 20 23 66 0a 09 09 09 09 20 ))..... #f.....
62e0: 73 29 29 29 20 3b 3b 20 69 66 20 73 70 65 63 69 s))) ;; if speci
62f0: 66 69 65 64 20 6f 6e 20 74 68 65 20 69 6e 70 75 fied on the inpu
6300: 74 20 74 68 65 6e 20 75 73 65 2c 20 65 6c 73 65 t then use, else
6310: 20 63 61 6c 63 75 6c 61 74 65 0a 09 20 20 20 20 calculate..
6320: 20 20 28 74 79 70 65 20 20 20 20 20 20 20 20 28 (type (
6330: 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d list-ref padded-
6340: 72 6f 77 20 38 29 29 29 0a 09 20 3b 3b 20 6c 6f row 8))).. ;; lo
6350: 6f 6b 20 75 70 20 65 78 70 65 63 74 65 64 2c 74 ok up expected,t
6360: 6f 6c 2c 75 6e 69 74 73 20 66 72 6f 6d 20 70 72 ol,units from pr
6370: 65 76 69 6f 75 73 20 62 65 73 74 20 66 69 74 20 evious best fit
6380: 74 65 73 74 20 69 66 20 74 68 65 79 20 61 72 65 test if they are
6390: 20 61 6c 6c 20 65 69 74 68 65 72 20 23 66 20 6f all either #f o
63a0: 72 20 27 27 0a 09 20 28 64 65 62 75 67 3a 70 72 r ''.. (debug:pr
63b0: 69 6e 74 20 34 20 22 42 45 46 4f 52 45 3a 20 63 int 4 "BEFORE: c
63c0: 61 74 65 67 6f 72 79 3a 20 22 20 63 61 74 65 67 ategory: " categ
63d0: 6f 72 79 20 22 20 76 61 72 69 61 62 6c 65 3a 20 ory " variable:
63e0: 22 20 76 61 72 69 61 62 6c 65 20 22 20 76 61 6c " variable " val
63f0: 75 65 3a 20 22 20 76 61 6c 75 65 20 0a 09 09 20 ue: " value ...
6400: 20 20 20 20 20 22 2c 20 65 78 70 65 63 74 65 64 ", expected
6410: 3a 20 22 20 65 78 70 65 63 74 65 64 20 22 20 74 : " expected " t
6420: 6f 6c 3a 20 22 20 74 6f 6c 20 22 20 75 6e 69 74 ol: " tol " unit
6430: 73 3a 20 22 20 75 6e 69 74 73 20 22 20 73 74 61 s: " units " sta
6440: 74 75 73 3a 20 22 20 73 74 61 74 75 73 20 22 20 tus: " status "
6450: 63 6f 6d 6d 65 6e 74 3a 20 22 20 63 6f 6d 6d 65 comment: " comme
6460: 6e 74 20 22 20 74 79 70 65 3a 20 22 20 74 79 70 nt " type: " typ
6470: 65 29 0a 0a 09 20 28 69 66 20 28 61 6e 64 20 28 e)... (if (and (
6480: 6f 72 20 28 6e 6f 74 20 65 78 70 65 63 74 65 64 or (not expected
6490: 29 28 65 71 75 61 6c 3f 20 65 78 70 65 63 74 65 )(equal? expecte
64a0: 64 20 22 22 29 29 0a 09 09 20 20 28 6f 72 20 28 d ""))... (or (
64b0: 6e 6f 74 20 74 6f 6c 29 20 20 20 20 20 28 65 71 not tol) (eq
64c0: 75 61 6c 3f 20 65 78 70 65 63 74 65 64 20 22 22 ual? expected ""
64d0: 29 29 0a 09 09 20 20 28 6f 72 20 28 6e 6f 74 20 ))... (or (not
64e0: 75 6e 69 74 73 29 20 20 20 28 65 71 75 61 6c 3f units) (equal?
64f0: 20 65 78 70 65 63 74 65 64 20 22 22 29 29 29 0a expected ""))).
6500: 09 20 20 20 20 20 28 6c 65 74 2d 76 61 6c 75 65 . (let-value
6510: 73 20 28 28 28 6e 65 77 2d 65 78 70 65 63 74 65 s (((new-expecte
6520: 64 20 6e 65 77 2d 74 6f 6c 20 6e 65 77 2d 75 6e d new-tol new-un
6530: 69 74 73 29 28 64 62 3a 67 65 74 2d 70 72 65 76 its)(db:get-prev
6540: 2d 74 6f 6c 2d 66 6f 72 2d 74 65 73 74 20 64 62 -tol-for-test db
6550: 20 74 65 73 74 2d 69 64 20 63 61 74 65 67 6f 72 test-id categor
6560: 79 20 76 61 72 69 61 62 6c 65 29 29 29 0a 09 09 y variable)))...
6570: 09 20 28 73 65 74 21 20 65 78 70 65 63 74 65 64 . (set! expected
6580: 20 6e 65 77 2d 65 78 70 65 63 74 65 64 29 0a 09 new-expected)..
6590: 09 09 20 28 73 65 74 21 20 74 6f 6c 20 20 20 20 .. (set! tol
65a0: 20 20 6e 65 77 2d 74 6f 6c 29 0a 09 09 09 20 28 new-tol).... (
65b0: 73 65 74 21 20 75 6e 69 74 73 20 20 20 20 6e 65 set! units ne
65c0: 77 2d 75 6e 69 74 73 29 29 29 0a 0a 09 20 28 64 w-units)))... (d
65d0: 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22 41 46 ebug:print 4 "AF
65e0: 54 45 52 3a 20 20 63 61 74 65 67 6f 72 79 3a 20 TER: category:
65f0: 22 20 63 61 74 65 67 6f 72 79 20 22 20 76 61 72 " category " var
6600: 69 61 62 6c 65 3a 20 22 20 76 61 72 69 61 62 6c iable: " variabl
6610: 65 20 22 20 76 61 6c 75 65 3a 20 22 20 76 61 6c e " value: " val
6620: 75 65 20 0a 09 09 20 20 20 20 20 20 22 2c 20 65 ue ... ", e
6630: 78 70 65 63 74 65 64 3a 20 22 20 65 78 70 65 63 xpected: " expec
6640: 74 65 64 20 22 20 74 6f 6c 3a 20 22 20 74 6f 6c ted " tol: " tol
6650: 20 22 20 75 6e 69 74 73 3a 20 22 20 75 6e 69 74 " units: " unit
6660: 73 20 22 20 73 74 61 74 75 73 3a 20 22 20 73 74 s " status: " st
6670: 61 74 75 73 20 22 20 63 6f 6d 6d 65 6e 74 3a 20 atus " comment:
6680: 22 20 63 6f 6d 6d 65 6e 74 29 0a 09 20 3b 3b 20 " comment).. ;;
6690: 63 61 6c 63 75 6c 61 74 65 20 73 74 61 74 75 73 calculate status
66a0: 20 69 66 20 4e 4f 54 20 73 70 65 63 69 66 69 65 if NOT specifie
66b0: 64 0a 09 20 28 69 66 20 28 61 6e 64 20 28 6e 6f d.. (if (and (no
66c0: 74 20 73 74 61 74 75 73 29 28 6e 75 6d 62 65 72 t status)(number
66d0: 3f 20 65 78 70 65 63 74 65 64 29 28 6e 75 6d 62 ? expected)(numb
66e0: 65 72 3f 20 76 61 6c 75 65 29 29 20 3b 3b 20 6e er? value)) ;; n
66f0: 65 65 64 20 65 78 70 65 63 74 65 64 20 61 6e 64 eed expected and
6700: 20 76 61 6c 75 65 20 74 6f 20 62 65 20 6e 75 6d value to be num
6710: 62 65 72 73 0a 09 20 20 20 20 20 28 69 66 20 28 bers.. (if (
6720: 6e 75 6d 62 65 72 3f 20 74 6f 6c 29 20 3b 3b 20 number? tol) ;;
6730: 69 66 20 74 6f 6c 20 69 73 20 61 20 6e 75 6d 62 if tol is a numb
6740: 65 72 20 74 68 65 6e 20 77 65 20 64 6f 20 74 68 er then we do th
6750: 65 20 73 74 61 6e 64 61 72 64 20 63 6f 6d 70 61 e standard compa
6760: 72 69 73 6f 6e 0a 09 09 20 28 6c 65 74 2a 20 28 rison... (let* (
6770: 28 6d 61 78 2d 76 61 6c 20 28 2b 20 65 78 70 65 (max-val (+ expe
6780: 63 74 65 64 20 74 6f 6c 29 29 0a 09 09 09 28 6d cted tol))....(m
6790: 69 6e 2d 76 61 6c 20 28 2d 20 65 78 70 65 63 74 in-val (- expect
67a0: 65 64 20 74 6f 6c 29 29 0a 09 09 09 28 72 65 73 ed tol))....(res
67b0: 75 6c 74 20 20 28 61 6e 64 20 28 3e 3d 20 20 76 ult (and (>= v
67c0: 61 6c 75 65 20 6d 69 6e 2d 76 61 6c 29 28 3c 3d alue min-val)(<=
67d0: 20 76 61 6c 75 65 20 6d 61 78 2d 76 61 6c 29 29 value max-val))
67e0: 29 29 0a 09 09 20 20 20 28 64 65 62 75 67 3a 70 ))... (debug:p
67f0: 72 69 6e 74 20 34 20 22 6d 61 78 2d 76 61 6c 3a rint 4 "max-val:
6800: 20 22 20 6d 61 78 2d 76 61 6c 20 22 20 6d 69 6e " max-val " min
6810: 2d 76 61 6c 3a 20 22 20 6d 69 6e 2d 76 61 6c 20 -val: " min-val
6820: 22 20 72 65 73 75 6c 74 3a 20 22 20 72 65 73 75 " result: " resu
6830: 6c 74 29 0a 09 09 20 20 20 28 73 65 74 21 20 73 lt)... (set! s
6840: 74 61 74 75 73 20 28 69 66 20 72 65 73 75 6c 74 tatus (if result
6850: 20 22 70 61 73 73 22 20 22 66 61 69 6c 22 29 29 "pass" "fail"))
6860: 29 0a 09 09 20 28 73 65 74 21 20 73 74 61 74 75 )... (set! statu
6870: 73 20 3b 3b 20 4e 42 2f 2f 20 6e 65 65 64 20 74 s ;; NB// need t
6880: 6f 20 61 73 73 65 73 73 20 65 61 63 68 20 6f 6e o assess each on
6890: 65 20 28 69 2e 65 2e 20 6e 6f 74 20 72 65 74 75 e (i.e. not retu
68a0: 72 6e 20 6f 70 65 72 61 74 6f 72 20 73 69 6e 63 rn operator sinc
68b0: 65 20 6e 65 65 64 20 74 6f 20 61 63 74 20 69 66 e need to act if
68c0: 20 6e 6f 74 20 76 61 6c 69 64 20 6f 70 2e 0a 09 not valid op...
68d0: 09 20 20 20 20 20 20 20 28 63 61 73 65 20 28 73 . (case (s
68e0: 74 72 69 6e 67 2d 3e 73 79 6d 62 6f 6c 20 74 6f tring->symbol to
68f0: 6c 29 20 3b 3b 20 74 6f 6c 20 73 68 6f 75 6c 64 l) ;; tol should
6900: 20 62 65 20 3e 2c 20 3c 2c 20 3e 3d 2c 20 3c 3d be >, <, >=, <=
6910: 0a 09 09 09 20 28 28 3e 29 20 20 28 69 66 20 28 .... ((>) (if (
6920: 3e 20 20 76 61 6c 75 65 20 65 78 70 65 63 74 65 > value expecte
6930: 64 29 20 22 70 61 73 73 22 20 22 66 61 69 6c 22 d) "pass" "fail"
6940: 29 29 0a 09 09 09 20 28 28 3c 29 20 20 28 69 66 )).... ((<) (if
6950: 20 28 3c 20 20 76 61 6c 75 65 20 65 78 70 65 63 (< value expec
6960: 74 65 64 29 20 22 70 61 73 73 22 20 22 66 61 69 ted) "pass" "fai
6970: 6c 22 29 29 0a 09 09 09 20 28 28 3e 3d 29 20 28 l")).... ((>=) (
6980: 69 66 20 28 3e 3d 20 76 61 6c 75 65 20 65 78 70 if (>= value exp
6990: 65 63 74 65 64 29 20 22 70 61 73 73 22 20 22 66 ected) "pass" "f
69a0: 61 69 6c 22 29 29 0a 09 09 09 20 28 28 3c 3d 29 ail")).... ((<=)
69b0: 20 28 69 66 20 28 3c 3d 20 76 61 6c 75 65 20 65 (if (<= value e
69c0: 78 70 65 63 74 65 64 29 20 22 70 61 73 73 22 20 xpected) "pass"
69d0: 22 66 61 69 6c 22 29 29 0a 09 09 09 20 28 65 6c "fail")).... (el
69e0: 73 65 20 28 63 6f 6e 63 20 22 45 52 52 4f 52 3a se (conc "ERROR:
69f0: 20 62 61 64 20 74 6f 6c 20 63 6f 6d 70 61 72 61 bad tol compara
6a00: 74 6f 72 20 22 20 74 6f 6c 29 29 29 29 29 29 0a tor " tol)))))).
6a10: 09 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 . (debug:print 4
6a20: 20 22 41 46 54 45 52 32 3a 20 63 61 74 65 67 6f "AFTER2: catego
6a30: 72 79 3a 20 22 20 63 61 74 65 67 6f 72 79 20 22 ry: " category "
6a40: 20 76 61 72 69 61 62 6c 65 3a 20 22 20 76 61 72 variable: " var
6a50: 69 61 62 6c 65 20 22 20 76 61 6c 75 65 3a 20 22 iable " value: "
6a60: 20 76 61 6c 75 65 20 0a 09 09 20 20 20 20 20 20 value ...
6a70: 22 2c 20 65 78 70 65 63 74 65 64 3a 20 22 20 65 ", expected: " e
6a80: 78 70 65 63 74 65 64 20 22 20 74 6f 6c 3a 20 22 xpected " tol: "
6a90: 20 74 6f 6c 20 22 20 75 6e 69 74 73 3a 20 22 20 tol " units: "
6aa0: 75 6e 69 74 73 20 22 20 73 74 61 74 75 73 3a 20 units " status:
6ab0: 22 20 73 74 61 74 75 73 20 22 20 63 6f 6d 6d 65 " status " comme
6ac0: 6e 74 3a 20 22 20 63 6f 6d 6d 65 6e 74 29 0a 09 nt: " comment)..
6ad0: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 (sqlite3:execut
6ae0: 65 20 64 62 20 22 49 4e 53 45 52 54 20 4f 52 20 e db "INSERT OR
6af0: 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 65 73 REPLACE INTO tes
6b00: 74 5f 64 61 74 61 20 28 74 65 73 74 5f 69 64 2c t_data (test_id,
6b10: 63 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62 6c category,variabl
6b20: 65 2c 76 61 6c 75 65 2c 65 78 70 65 63 74 65 64 e,value,expected
6b30: 2c 74 6f 6c 2c 75 6e 69 74 73 2c 63 6f 6d 6d 65 ,tol,units,comme
6b40: 6e 74 2c 73 74 61 74 75 73 2c 74 79 70 65 29 20 nt,status,type)
6b50: 56 41 4c 55 45 53 20 28 3f 2c 3f 2c 3f 2c 3f 2c VALUES (?,?,?,?,
6b60: 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 29 3b 22 0a 09 ?,?,?,?,?,?);"..
6b70: 09 09 20 20 74 65 73 74 2d 69 64 20 63 61 74 65 .. test-id cate
6b80: 67 6f 72 79 20 76 61 72 69 61 62 6c 65 20 76 61 gory variable va
6b90: 6c 75 65 20 65 78 70 65 63 74 65 64 20 74 6f 6c lue expected tol
6ba0: 20 75 6e 69 74 73 20 28 69 66 20 63 6f 6d 6d 65 units (if comme
6bb0: 6e 74 20 63 6f 6d 6d 65 6e 74 20 22 22 29 20 73 nt comment "") s
6bc0: 74 61 74 75 73 20 74 79 70 65 29 29 29 0a 20 20 tatus type))).
6bd0: 20 20 20 63 73 76 6c 69 73 74 29 29 29 0a 0a 3b csvlist)))..;
6be0: 3b 20 67 65 74 20 61 20 6c 69 73 74 20 6f 66 20 ; get a list of
6bf0: 74 65 73 74 5f 64 61 74 61 20 72 65 63 6f 72 64 test_data record
6c00: 73 20 6d 61 74 63 68 69 6e 67 20 63 61 74 65 67 s matching categ
6c10: 6f 72 79 70 61 74 74 0a 28 64 65 66 69 6e 65 20 orypatt.(define
6c20: 28 64 62 3a 72 65 61 64 2d 74 65 73 74 2d 64 61 (db:read-test-da
6c30: 74 61 20 64 62 20 74 65 73 74 2d 69 64 20 63 61 ta db test-id ca
6c40: 74 65 67 6f 72 79 70 61 74 74 29 0a 20 20 28 6c tegorypatt). (l
6c50: 65 74 20 28 28 72 65 73 20 27 28 29 29 29 0a 20 et ((res '())).
6c60: 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d (sqlite3:for-
6c70: 65 61 63 68 2d 72 6f 77 20 0a 20 20 20 20 20 28 each-row . (
6c80: 6c 61 6d 62 64 61 20 28 69 64 20 74 65 73 74 5f lambda (id test_
6c90: 69 64 20 63 61 74 65 67 6f 72 79 20 76 61 72 69 id category vari
6ca0: 61 62 6c 65 20 76 61 6c 75 65 20 65 78 70 65 63 able value expec
6cb0: 74 65 64 20 74 6f 6c 20 75 6e 69 74 73 20 63 6f ted tol units co
6cc0: 6d 6d 65 6e 74 20 73 74 61 74 75 73 20 74 79 70 mment status typ
6cd0: 65 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 e). (set!
6ce0: 72 65 73 20 28 63 6f 6e 73 20 28 76 65 63 74 6f res (cons (vecto
6cf0: 72 20 69 64 20 74 65 73 74 5f 69 64 20 63 61 74 r id test_id cat
6d00: 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65 20 76 egory variable v
6d10: 61 6c 75 65 20 65 78 70 65 63 74 65 64 20 74 6f alue expected to
6d20: 6c 20 75 6e 69 74 73 20 63 6f 6d 6d 65 6e 74 20 l units comment
6d30: 73 74 61 74 75 73 20 74 79 70 65 29 20 72 65 73 status type) res
6d40: 29 29 29 0a 20 20 20 20 20 64 62 0a 20 20 20 20 ))). db.
6d50: 20 22 53 45 4c 45 43 54 20 69 64 2c 74 65 73 74 "SELECT id,test
6d60: 5f 69 64 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 _id,category,var
6d70: 69 61 62 6c 65 2c 76 61 6c 75 65 2c 65 78 70 65 iable,value,expe
6d80: 63 74 65 64 2c 74 6f 6c 2c 75 6e 69 74 73 2c 63 cted,tol,units,c
6d90: 6f 6d 6d 65 6e 74 2c 73 74 61 74 75 73 2c 74 79 omment,status,ty
6da0: 70 65 20 46 52 4f 4d 20 74 65 73 74 5f 64 61 74 pe FROM test_dat
6db0: 61 20 57 48 45 52 45 20 74 65 73 74 5f 69 64 3d a WHERE test_id=
6dc0: 3f 20 41 4e 44 20 63 61 74 65 67 6f 72 79 20 4c ? AND category L
6dd0: 49 4b 45 20 3f 20 4f 52 44 45 52 20 42 59 20 63 IKE ? ORDER BY c
6de0: 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62 6c 65 ategory,variable
6df0: 3b 22 20 74 65 73 74 2d 69 64 20 63 61 74 65 67 ;" test-id categ
6e00: 6f 72 79 70 61 74 74 29 0a 20 20 20 20 28 72 65 orypatt). (re
6e10: 76 65 72 73 65 20 72 65 73 29 29 29 0a 0a 28 64 verse res)))..(d
6e20: 65 66 69 6e 65 20 28 64 62 3a 6c 6f 61 64 2d 74 efine (db:load-t
6e30: 65 73 74 2d 64 61 74 61 20 64 62 20 72 75 6e 2d est-data db run-
6e40: 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 id test-name ite
6e50: 6d 64 61 74 29 0a 20 20 28 6c 65 74 2a 20 28 28 mdat). (let* ((
6e60: 69 74 65 6d 2d 70 61 74 68 20 28 69 74 65 6d 2d item-path (item-
6e70: 6c 69 73 74 2d 3e 70 61 74 68 20 69 74 65 6d 64 list->path itemd
6e80: 61 74 29 29 0a 09 20 28 74 65 73 74 64 61 74 20 at)).. (testdat
6e90: 28 64 62 3a 67 65 74 2d 74 65 73 74 2d 69 6e 66 (db:get-test-inf
6ea0: 6f 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 o db run-id test
6eb0: 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 -name item-path)
6ec0: 29 0a 09 20 28 74 65 73 74 2d 69 64 20 28 69 66 ).. (test-id (if
6ed0: 20 74 65 73 74 64 61 74 20 28 64 62 3a 74 65 73 testdat (db:tes
6ee0: 74 2d 67 65 74 2d 69 64 20 74 65 73 74 64 61 74 t-get-id testdat
6ef0: 29 20 23 66 29 29 29 0a 20 20 20 20 3b 3b 20 28 ) #f))). ;; (
6f00: 64 65 62 75 67 3a 70 72 69 6e 74 20 31 20 22 45 debug:print 1 "E
6f10: 6e 74 65 72 20 72 65 63 6f 72 64 73 20 74 6f 20 nter records to
6f20: 69 6e 73 65 72 74 20 69 6e 20 74 68 65 20 74 65 insert in the te
6f30: 73 74 5f 64 61 74 61 20 74 61 62 6c 65 2c 20 73 st_data table, s
6f40: 65 76 65 6e 20 66 69 65 6c 64 73 2c 20 63 6f 6d even fields, com
6f50: 6d 61 20 73 65 70 61 72 61 74 65 64 20 70 65 72 ma separated per
6f60: 20 6c 69 6e 65 22 29 0a 20 20 20 20 28 64 65 62 line"). (deb
6f70: 75 67 3a 70 72 69 6e 74 20 34 20 22 69 74 65 6d ug:print 4 "item
6f80: 64 61 74 3a 20 22 20 69 74 65 6d 64 61 74 20 22 dat: " itemdat "
6f90: 2c 20 74 65 73 74 2d 6e 61 6d 65 3a 20 22 20 74 , test-name: " t
6fa0: 65 73 74 2d 6e 61 6d 65 20 22 2c 20 74 65 73 74 est-name ", test
6fb0: 2d 69 64 3a 20 22 20 74 65 73 74 2d 69 64 29 0a -id: " test-id).
6fc0: 20 20 20 20 28 69 66 20 74 65 73 74 2d 69 64 0a (if test-id.
6fd0: 09 28 6c 65 74 20 6c 6f 6f 70 20 28 28 6c 69 6e .(let loop ((lin
6fe0: 20 28 72 65 61 64 2d 6c 69 6e 65 29 29 29 0a 09 (read-line)))..
6ff0: 20 20 28 69 66 20 28 6e 6f 74 20 28 65 6f 66 2d (if (not (eof-
7000: 6f 62 6a 65 63 74 3f 20 6c 69 6e 29 29 0a 09 20 object? lin))..
7010: 20 20 20 20 20 28 62 65 67 69 6e 0a 09 09 28 64 (begin...(d
7020: 65 62 75 67 3a 70 72 69 6e 74 20 34 20 6c 69 6e ebug:print 4 lin
7030: 29 0a 09 09 28 64 62 3a 63 73 76 2d 3e 74 65 73 )...(db:csv->tes
7040: 74 2d 64 61 74 61 20 64 62 20 74 65 73 74 2d 69 t-data db test-i
7050: 64 20 6c 69 6e 29 0a 09 09 28 6c 6f 6f 70 20 28 d lin)...(loop (
7060: 72 65 61 64 2d 6c 69 6e 65 29 29 29 29 29 29 0a read-line)))))).
7070: 20 20 20 20 3b 3b 20 72 6f 6c 6c 20 75 70 20 74 ;; roll up t
7080: 68 65 20 63 75 72 72 65 6e 74 20 72 65 73 75 6c he current resul
7090: 74 73 2e 0a 20 20 20 20 3b 3b 20 46 49 58 4d 45 ts.. ;; FIXME
70a0: 3a 20 41 64 64 20 74 68 65 20 73 74 61 74 75 73 : Add the status
70b0: 20 74 6f 20 0a 20 20 20 20 28 64 62 3a 74 65 73 to . (db:tes
70c0: 74 2d 64 61 74 61 2d 72 6f 6c 6c 75 70 20 64 62 t-data-rollup db
70d0: 20 74 65 73 74 2d 69 64 20 23 66 29 29 29 0a 0a test-id #f)))..
70e0: 3b 3b 20 57 41 52 4e 49 4e 47 3a 20 44 6f 20 4e ;; WARNING: Do N
70f0: 4f 54 20 63 61 6c 6c 20 74 68 69 73 20 66 6f 72 OT call this for
7100: 20 74 68 65 20 70 61 72 65 6e 74 20 74 65 73 74 the parent test
7110: 20 6f 6e 20 61 6e 20 69 74 65 72 61 74 65 64 20 on an iterated
7120: 74 65 73 74 0a 3b 3b 20 52 6f 6c 6c 20 75 70 20 test.;; Roll up
7130: 74 65 73 74 5f 64 61 74 61 20 70 61 73 73 2f 66 test_data pass/f
7140: 61 69 6c 20 72 65 73 75 6c 74 73 0a 3b 3b 20 6c ail results.;; l
7150: 6f 6f 6b 20 61 74 20 74 68 65 20 74 65 73 74 5f ook at the test_
7160: 64 61 74 61 20 73 74 61 74 75 73 20 66 69 65 6c data status fiel
7170: 64 2c 20 0a 3b 3b 20 20 20 20 69 66 20 61 6c 6c d, .;; if all
7180: 20 61 72 65 20 70 61 73 73 20 28 61 6e 79 20 63 are pass (any c
7190: 61 73 65 29 20 61 6e 64 20 74 68 65 20 74 65 73 ase) and the tes
71a0: 74 20 73 74 61 74 75 73 20 69 73 20 50 41 53 53 t status is PASS
71b0: 20 6f 72 20 4e 55 4c 4c 20 6f 72 20 27 27 20 74 or NULL or '' t
71c0: 68 65 6e 20 73 65 74 20 74 65 73 74 20 73 74 61 hen set test sta
71d0: 74 75 73 20 74 6f 20 50 41 53 53 2e 0a 3b 3b 20 tus to PASS..;;
71e0: 20 20 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 if one or mor
71f0: 65 20 61 72 65 20 66 61 69 6c 20 28 61 6e 79 20 e are fail (any
7200: 63 61 73 65 29 20 74 68 65 6e 20 73 65 74 20 74 case) then set t
7210: 65 73 74 20 73 74 61 74 75 73 20 74 6f 20 50 41 est status to PA
7220: 53 53 2c 20 6e 6f 6e 20 22 70 61 73 73 22 20 6f SS, non "pass" o
7230: 72 20 22 66 61 69 6c 22 20 61 72 65 20 69 67 6e r "fail" are ign
7240: 6f 72 65 64 0a 28 64 65 66 69 6e 65 20 28 64 62 ored.(define (db
7250: 3a 74 65 73 74 2d 64 61 74 61 2d 72 6f 6c 6c 75 :test-data-rollu
7260: 70 20 64 62 20 74 65 73 74 2d 69 64 20 73 74 61 p db test-id sta
7270: 74 75 73 29 0a 20 20 28 73 71 6c 69 74 65 33 3a tus). (sqlite3:
7280: 65 78 65 63 75 74 65 20 0a 20 20 20 64 62 20 0a execute . db .
7290: 20 20 20 22 55 50 44 41 54 45 20 74 65 73 74 73 "UPDATE tests
72a0: 20 0a 20 20 20 20 20 20 53 45 54 20 66 61 69 6c . SET fail
72b0: 5f 63 6f 75 6e 74 3d 28 53 45 4c 45 43 54 20 63 _count=(SELECT c
72c0: 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 74 65 ount(id) FROM te
72d0: 73 74 5f 64 61 74 61 20 57 48 45 52 45 20 74 65 st_data WHERE te
72e0: 73 74 5f 69 64 3d 3f 20 41 4e 44 20 73 74 61 74 st_id=? AND stat
72f0: 75 73 20 6c 69 6b 65 20 27 66 61 69 6c 27 29 2c us like 'fail'),
7300: 0a 20 20 20 20 20 20 20 20 20 20 70 61 73 73 5f . pass_
7310: 63 6f 75 6e 74 3d 28 53 45 4c 45 43 54 20 63 6f count=(SELECT co
7320: 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 74 65 73 unt(id) FROM tes
7330: 74 5f 64 61 74 61 20 57 48 45 52 45 20 74 65 73 t_data WHERE tes
7340: 74 5f 69 64 3d 3f 20 41 4e 44 20 73 74 61 74 75 t_id=? AND statu
7350: 73 20 6c 69 6b 65 20 27 70 61 73 73 27 29 0a 20 s like 'pass').
7360: 20 20 20 20 20 57 48 45 52 45 20 69 64 3d 3f 3b WHERE id=?;
7370: 22 0a 20 20 20 74 65 73 74 2d 69 64 20 74 65 73 ". test-id tes
7380: 74 2d 69 64 20 74 65 73 74 2d 69 64 29 0a 20 20 t-id test-id).
7390: 3b 3b 20 69 66 20 74 68 65 20 74 65 73 74 20 69 ;; if the test i
73a0: 73 20 6e 6f 74 20 46 41 49 4c 20 74 68 65 6e 20 s not FAIL then
73b0: 73 65 74 20 73 74 61 74 75 73 20 62 61 73 65 64 set status based
73c0: 20 6f 6e 20 74 68 65 20 66 61 69 6c 20 61 6e 64 on the fail and
73d0: 20 70 61 73 73 20 63 6f 75 6e 74 73 2e 0a 20 20 pass counts..
73e0: 28 74 68 72 65 61 64 2d 73 6c 65 65 70 21 20 31 (thread-sleep! 1
73f0: 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 ). (sqlite3:exe
7400: 63 75 74 65 0a 20 20 20 64 62 20 20 20 3b 3b 3b cute. db ;;;
7410: 20 4e 4f 54 45 3a 20 53 68 6f 75 6c 64 20 74 68 NOTE: Should th
7420: 69 73 20 62 65 20 57 41 52 4e 2c 46 41 49 4c 3f is be WARN,FAIL?
7430: 20 41 20 57 41 52 4e 20 69 73 20 6e 6f 74 20 61 A WARN is not a
7440: 20 46 41 49 4c 3f 3f 3f 3f 3f 20 42 55 47 20 46 FAIL????? BUG F
7450: 49 58 4d 45 0a 20 20 20 22 55 50 44 41 54 45 20 IXME. "UPDATE
7460: 74 65 73 74 73 0a 20 20 20 20 20 20 53 45 54 20 tests. SET
7470: 73 74 61 74 75 73 3d 43 41 53 45 20 57 48 45 4e status=CASE WHEN
7480: 20 28 53 45 4c 45 43 54 20 66 61 69 6c 5f 63 6f (SELECT fail_co
7490: 75 6e 74 20 46 52 4f 4d 20 74 65 73 74 73 20 57 unt FROM tests W
74a0: 48 45 52 45 20 69 64 3d 3f 29 20 3e 20 30 20 0a HERE id=?) > 0 .
74b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
74c0: 20 20 20 20 20 20 20 20 20 54 48 45 4e 20 27 46 THEN 'F
74d0: 41 49 4c 27 0a 20 20 20 20 20 20 20 20 20 20 20 AIL'.
74e0: 20 20 20 20 20 20 20 20 20 20 20 57 48 45 4e 20 WHEN
74f0: 28 53 45 4c 45 43 54 20 70 61 73 73 5f 63 6f 75 (SELECT pass_cou
7500: 6e 74 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 nt FROM tests WH
7510: 45 52 45 20 69 64 3d 3f 29 20 3e 20 30 20 41 4e ERE id=?) > 0 AN
7520: 44 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 D .
7530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 (S
7540: 45 4c 45 43 54 20 73 74 61 74 75 73 20 46 52 4f ELECT status FRO
7550: 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 69 64 M tests WHERE id
7560: 3d 3f 29 20 4e 4f 54 20 49 4e 20 28 27 57 41 52 =?) NOT IN ('WAR
7570: 4e 27 2c 27 46 41 49 4c 27 29 0a 20 20 20 20 20 N','FAIL').
7580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7590: 20 20 20 20 54 48 45 4e 20 27 50 41 53 53 27 0a THEN 'PASS'.
75a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
75b0: 20 20 20 20 20 20 45 4c 53 45 20 73 74 61 74 75 ELSE statu
75c0: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 s.
75d0: 20 20 20 20 45 4e 44 20 57 48 45 52 45 20 69 64 END WHERE id
75e0: 3d 3f 3b 22 0a 20 20 20 74 65 73 74 2d 69 64 20 =?;". test-id
75f0: 74 65 73 74 2d 69 64 20 74 65 73 74 2d 69 64 20 test-id test-id
7600: 74 65 73 74 2d 69 64 29 29 0a 0a 28 64 65 66 69 test-id))..(defi
7610: 6e 65 20 28 64 62 3a 67 65 74 2d 70 72 65 76 2d ne (db:get-prev-
7620: 74 6f 6c 2d 66 6f 72 2d 74 65 73 74 20 64 62 20 tol-for-test db
7630: 74 65 73 74 2d 69 64 20 63 61 74 65 67 6f 72 79 test-id category
7640: 20 76 61 72 69 61 62 6c 65 29 0a 20 20 3b 3b 20 variable). ;;
7650: 46 69 6e 69 73 68 20 6d 65 3f 0a 20 20 28 76 61 Finish me?. (va
7660: 6c 75 65 73 20 23 66 20 23 66 20 23 66 29 29 0a lues #f #f #f)).
7670: 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d .;;=============
7680: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7690: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
76a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
76b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 53 20 54 =========.;; S T
76c0: 20 45 20 50 20 53 20 0a 3b 3b 3d 3d 3d 3d 3d 3d E P S .;;======
76d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
76e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
76f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7700: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7710: 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 73 74 ..(define (db:st
7720: 65 70 2d 67 65 74 2d 74 69 6d 65 2d 61 73 2d 73 ep-get-time-as-s
7730: 74 72 69 6e 67 20 76 65 63 29 0a 20 20 28 73 65 tring vec). (se
7740: 63 6f 6e 64 73 2d 3e 74 69 6d 65 2d 73 74 72 69 conds->time-stri
7750: 6e 67 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d ng (db:step-get-
7760: 65 76 65 6e 74 5f 74 69 6d 65 20 76 65 63 29 29 event_time vec))
7770: 29 0a 0a 3b 3b 20 64 62 2d 67 65 74 2d 74 65 73 )..;; db-get-tes
7780: 74 2d 73 74 65 70 73 2d 66 6f 72 2d 72 75 6e 0a t-steps-for-run.
7790: 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d (define (db:get-
77a0: 73 74 65 70 73 2d 66 6f 72 2d 74 65 73 74 20 64 steps-for-test d
77b0: 62 20 74 65 73 74 2d 69 64 29 0a 20 20 28 6c 65 b test-id). (le
77c0: 74 20 28 28 72 65 73 20 27 28 29 29 29 0a 20 20 t ((res '())).
77d0: 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 (sqlite3:for-e
77e0: 61 63 68 2d 72 6f 77 20 0a 20 20 20 20 20 28 6c ach-row . (l
77f0: 61 6d 62 64 61 20 28 69 64 20 74 65 73 74 2d 69 ambda (id test-i
7800: 64 20 73 74 65 70 6e 61 6d 65 20 73 74 61 74 65 d stepname state
7810: 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d 74 69 status event-ti
7820: 6d 65 20 6c 6f 67 66 69 6c 65 29 0a 20 20 20 20 me logfile).
7830: 20 20 20 28 73 65 74 21 20 72 65 73 20 28 63 6f (set! res (co
7840: 6e 73 20 28 76 65 63 74 6f 72 20 69 64 20 74 65 ns (vector id te
7850: 73 74 2d 69 64 20 73 74 65 70 6e 61 6d 65 20 73 st-id stepname s
7860: 74 61 74 65 20 73 74 61 74 75 73 20 65 76 65 6e tate status even
7870: 74 2d 74 69 6d 65 20 28 69 66 20 28 73 74 72 69 t-time (if (stri
7880: 6e 67 3f 20 6c 6f 67 66 69 6c 65 29 20 6c 6f 67 ng? logfile) log
7890: 66 69 6c 65 20 22 22 29 29 20 72 65 73 29 29 29 file "")) res)))
78a0: 0a 20 20 20 20 20 64 62 0a 20 20 20 20 20 22 53 . db. "S
78b0: 45 4c 45 43 54 20 69 64 2c 74 65 73 74 5f 69 64 ELECT id,test_id
78c0: 2c 73 74 65 70 6e 61 6d 65 2c 73 74 61 74 65 2c ,stepname,state,
78d0: 73 74 61 74 75 73 2c 65 76 65 6e 74 5f 74 69 6d status,event_tim
78e0: 65 2c 6c 6f 67 66 69 6c 65 20 46 52 4f 4d 20 74 e,logfile FROM t
78f0: 65 73 74 5f 73 74 65 70 73 20 57 48 45 52 45 20 est_steps WHERE
7900: 74 65 73 74 5f 69 64 3d 3f 20 4f 52 44 45 52 20 test_id=? ORDER
7910: 42 59 20 69 64 20 41 53 43 3b 22 20 3b 3b 20 65 BY id ASC;" ;; e
7920: 76 65 6e 74 5f 74 69 6d 65 20 44 45 53 43 2c 69 vent_time DESC,i
7930: 64 20 41 53 43 3b 0a 20 20 20 20 20 74 65 73 74 d ASC;. test
7940: 2d 69 64 29 0a 20 20 20 20 28 72 65 76 65 72 73 -id). (revers
7950: 65 20 72 65 73 29 29 29 0a 0a 3b 3b 20 67 65 74 e res)))..;; get
7960: 20 61 20 70 72 65 74 74 79 20 74 61 62 6c 65 20 a pretty table
7970: 74 6f 20 73 75 6d 6d 61 72 69 7a 65 20 73 74 65 to summarize ste
7980: 70 73 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 28 64 ps.;;.(define (d
7990: 62 3a 67 65 74 2d 73 74 65 70 73 2d 74 61 62 6c b:get-steps-tabl
79a0: 65 20 64 62 20 74 65 73 74 2d 69 64 29 0a 20 20 e db test-id).
79b0: 28 6c 65 74 20 28 28 73 74 65 70 73 20 20 20 28 (let ((steps (
79c0: 64 62 3a 67 65 74 2d 73 74 65 70 73 2d 66 6f 72 db:get-steps-for
79d0: 2d 74 65 73 74 20 64 62 20 74 65 73 74 2d 69 64 -test db test-id
79e0: 29 29 29 0a 20 20 20 20 3b 3b 20 6f 72 67 61 6e ))). ;; organ
79f0: 69 73 65 20 74 68 65 20 73 74 65 70 73 20 66 6f ise the steps fo
7a00: 72 20 62 65 74 74 65 72 20 72 65 61 64 61 62 69 r better readabi
7a10: 6c 69 74 79 0a 20 20 20 20 28 6c 65 74 20 28 28 lity. (let ((
7a20: 72 65 73 20 28 6d 61 6b 65 2d 68 61 73 68 2d 74 res (make-hash-t
7a30: 61 62 6c 65 29 29 29 0a 20 20 20 20 20 20 28 66 able))). (f
7a40: 6f 72 2d 65 61 63 68 20 0a 20 20 20 20 20 20 20 or-each .
7a50: 28 6c 61 6d 62 64 61 20 28 73 74 65 70 29 0a 09 (lambda (step)..
7a60: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 36 20 (debug:print 6
7a70: 22 73 74 65 70 3d 22 20 73 74 65 70 29 0a 09 20 "step=" step)..
7a80: 28 6c 65 74 20 28 28 72 65 63 6f 72 64 20 28 68 (let ((record (h
7a90: 61 73 68 2d 74 61 62 6c 65 2d 72 65 66 2f 64 65 ash-table-ref/de
7aa0: 66 61 75 6c 74 20 0a 09 09 09 72 65 73 20 0a 09 fault ....res ..
7ab0: 09 09 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 ..(db:step-get-s
7ac0: 74 65 70 6e 61 6d 65 20 73 74 65 70 29 20 0a 09 tepname step) ..
7ad0: 09 09 3b 3b 20 20 20 20 20 20 20 20 73 74 65 70 ..;; step
7ae0: 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 name
7af0: 20 20 20 20 73 74 61 72 74 20 65 6e 64 20 73 74 start end st
7b00: 61 74 75 73 20 20 20 20 0a 09 09 09 28 76 65 63 atus ....(vec
7b10: 74 6f 72 20 28 64 62 3a 73 74 65 70 2d 67 65 74 tor (db:step-get
7b20: 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70 29 20 -stepname step)
7b30: 22 22 20 20 20 22 22 20 22 22 20 20 20 20 20 22 "" "" "" "
7b40: 22 20 22 22 29 29 29 29 0a 09 20 20 20 28 64 65 " "")))).. (de
7b50: 62 75 67 3a 70 72 69 6e 74 20 36 20 22 72 65 63 bug:print 6 "rec
7b60: 6f 72 64 28 62 65 66 6f 72 65 29 20 3d 20 22 20 ord(before) = "
7b70: 72 65 63 6f 72 64 20 0a 09 09 09 22 5c 6e 69 64 record ...."\nid
7b80: 3a 20 20 20 20 20 20 20 22 20 28 64 62 3a 73 74 : " (db:st
7b90: 65 70 2d 67 65 74 2d 69 64 20 73 74 65 70 29 0a ep-get-id step).
7ba0: 09 09 09 22 5c 6e 73 74 65 70 6e 61 6d 65 3a 20 ..."\nstepname:
7bb0: 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 " (db:step-get-s
7bc0: 74 65 70 6e 61 6d 65 20 73 74 65 70 29 0a 09 09 tepname step)...
7bd0: 09 22 5c 6e 73 74 61 74 65 3a 20 20 20 20 22 20 ."\nstate: "
7be0: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 (db:step-get-sta
7bf0: 74 65 20 73 74 65 70 29 0a 09 09 09 22 5c 6e 73 te step)...."\ns
7c00: 74 61 74 75 73 3a 20 20 20 22 20 28 64 62 3a 73 tatus: " (db:s
7c10: 74 65 70 2d 67 65 74 2d 73 74 61 74 75 73 20 73 tep-get-status s
7c20: 74 65 70 29 0a 09 09 09 22 5c 6e 74 69 6d 65 3a tep)...."\ntime:
7c30: 20 20 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d " (db:step-
7c40: 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73 get-event_time s
7c50: 74 65 70 29 29 0a 09 20 20 20 28 63 61 73 65 20 tep)).. (case
7c60: 28 73 74 72 69 6e 67 2d 3e 73 79 6d 62 6f 6c 20 (string->symbol
7c70: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 (db:step-get-sta
7c80: 74 65 20 73 74 65 70 29 29 0a 09 20 20 20 20 20 te step))..
7c90: 28 28 73 74 61 72 74 29 28 76 65 63 74 6f 72 2d ((start)(vector-
7ca0: 73 65 74 21 20 72 65 63 6f 72 64 20 31 20 28 64 set! record 1 (d
7cb0: 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 b:step-get-event
7cc0: 5f 74 69 6d 65 20 73 74 65 70 29 29 0a 09 20 20 _time step))..
7cd0: 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 (vector-set!
7ce0: 20 72 65 63 6f 72 64 20 33 20 28 69 66 20 28 65 record 3 (if (e
7cf0: 71 75 61 6c 3f 20 28 76 65 63 74 6f 72 2d 72 65 qual? (vector-re
7d00: 66 20 72 65 63 6f 72 64 20 33 29 20 22 22 29 0a f record 3) "").
7d10: 09 09 09 09 09 28 64 62 3a 73 74 65 70 2d 67 65 .....(db:step-ge
7d20: 74 2d 73 74 61 74 75 73 20 73 74 65 70 29 29 29 t-status step)))
7d30: 0a 09 20 20 20 20 20 20 28 69 66 20 28 3e 20 28 .. (if (> (
7d40: 73 74 72 69 6e 67 2d 6c 65 6e 67 74 68 20 28 64 string-length (d
7d50: 62 3a 73 74 65 70 2d 67 65 74 2d 6c 6f 67 66 69 b:step-get-logfi
7d60: 6c 65 20 73 74 65 70 29 29 0a 09 09 20 20 20 20 le step))...
7d70: 20 30 29 0a 09 09 20 20 28 76 65 63 74 6f 72 2d 0)... (vector-
7d80: 73 65 74 21 20 72 65 63 6f 72 64 20 35 20 28 64 set! record 5 (d
7d90: 62 3a 73 74 65 70 2d 67 65 74 2d 6c 6f 67 66 69 b:step-get-logfi
7da0: 6c 65 20 73 74 65 70 29 29 29 29 0a 09 20 20 20 le step))))..
7db0: 20 20 28 28 65 6e 64 29 20 20 0a 09 20 20 20 20 ((end) ..
7dc0: 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72 (vector-set! r
7dd0: 65 63 6f 72 64 20 32 20 28 61 6e 79 2d 3e 6e 75 ecord 2 (any->nu
7de0: 6d 62 65 72 20 28 64 62 3a 73 74 65 70 2d 67 65 mber (db:step-ge
7df0: 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73 74 65 t-event_time ste
7e00: 70 29 29 29 0a 09 20 20 20 20 20 20 28 76 65 63 p))).. (vec
7e10: 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 tor-set! record
7e20: 33 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 3 (db:step-get-s
7e30: 74 61 74 75 73 20 73 74 65 70 29 29 0a 09 20 20 tatus step))..
7e40: 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 (vector-set!
7e50: 20 72 65 63 6f 72 64 20 34 20 28 6c 65 74 20 28 record 4 (let (
7e60: 28 73 74 61 72 74 74 20 28 61 6e 79 2d 3e 6e 75 (startt (any->nu
7e70: 6d 62 65 72 20 28 76 65 63 74 6f 72 2d 72 65 66 mber (vector-ref
7e80: 20 72 65 63 6f 72 64 20 31 29 29 29 0a 09 09 09 record 1)))....
7e90: 09 09 20 20 28 65 6e 64 74 20 20 20 28 61 6e 79 .. (endt (any
7ea0: 2d 3e 6e 75 6d 62 65 72 20 28 76 65 63 74 6f 72 ->number (vector
7eb0: 2d 72 65 66 20 72 65 63 6f 72 64 20 32 29 29 29 -ref record 2)))
7ec0: 29 0a 09 09 09 09 20 20 20 20 20 20 28 64 65 62 )..... (deb
7ed0: 75 67 3a 70 72 69 6e 74 20 34 20 22 72 65 63 6f ug:print 4 "reco
7ee0: 72 64 5b 31 5d 3d 22 20 28 76 65 63 74 6f 72 2d rd[1]=" (vector-
7ef0: 72 65 66 20 72 65 63 6f 72 64 20 31 29 20 0a 09 ref record 1) ..
7f00: 09 09 09 09 09 20 20 20 22 2c 20 73 74 61 72 74 ..... ", start
7f10: 74 3d 22 20 73 74 61 72 74 74 20 22 2c 20 65 6e t=" startt ", en
7f20: 64 74 3d 22 20 65 6e 64 74 0a 09 09 09 09 09 09 dt=" endt.......
7f30: 20 20 20 22 2c 20 67 65 74 2d 73 74 61 74 75 73 ", get-status
7f40: 3a 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 : " (db:step-get
7f50: 2d 73 74 61 74 75 73 20 73 74 65 70 29 29 0a 09 -status step))..
7f60: 09 09 09 20 20 20 20 20 20 28 69 66 20 28 61 6e ... (if (an
7f70: 64 20 28 6e 75 6d 62 65 72 3f 20 73 74 61 72 74 d (number? start
7f80: 74 29 28 6e 75 6d 62 65 72 3f 20 65 6e 64 74 29 t)(number? endt)
7f90: 29 0a 09 09 09 09 09 20 20 28 73 65 63 6f 6e 64 )...... (second
7fa0: 73 2d 3e 68 72 2d 6d 69 6e 2d 73 65 63 20 28 2d s->hr-min-sec (-
7fb0: 20 65 6e 64 74 20 73 74 61 72 74 74 29 29 20 22 endt startt)) "
7fc0: 2d 31 22 29 29 29 0a 09 20 20 20 20 20 20 28 69 -1"))).. (i
7fd0: 66 20 28 3e 20 28 73 74 72 69 6e 67 2d 6c 65 6e f (> (string-len
7fe0: 67 74 68 20 28 64 62 3a 73 74 65 70 2d 67 65 74 gth (db:step-get
7ff0: 2d 6c 6f 67 66 69 6c 65 20 73 74 65 70 29 29 0a -logfile step)).
8000: 09 09 20 20 20 20 20 30 29 0a 09 09 20 20 28 76 .. 0)... (v
8010: 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 ector-set! recor
8020: 64 20 35 20 28 64 62 3a 73 74 65 70 2d 67 65 74 d 5 (db:step-get
8030: 2d 6c 6f 67 66 69 6c 65 20 73 74 65 70 29 29 29 -logfile step)))
8040: 29 0a 09 20 20 20 20 20 28 65 6c 73 65 0a 09 20 ).. (else..
8050: 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 (vector-set
8060: 21 20 72 65 63 6f 72 64 20 32 20 28 64 62 3a 73 ! record 2 (db:s
8070: 74 65 70 2d 67 65 74 2d 73 74 61 74 65 20 73 74 tep-get-state st
8080: 65 70 29 29 0a 09 20 20 20 20 20 20 28 76 65 63 ep)).. (vec
8090: 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 tor-set! record
80a0: 33 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 3 (db:step-get-s
80b0: 74 61 74 75 73 20 73 74 65 70 29 29 0a 09 20 20 tatus step))..
80c0: 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 (vector-set!
80d0: 20 72 65 63 6f 72 64 20 34 20 28 64 62 3a 73 74 record 4 (db:st
80e0: 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d ep-get-event_tim
80f0: 65 20 73 74 65 70 29 29 29 29 0a 09 20 20 20 28 e step)))).. (
8100: 68 61 73 68 2d 74 61 62 6c 65 2d 73 65 74 21 20 hash-table-set!
8110: 72 65 73 20 28 64 62 3a 73 74 65 70 2d 67 65 74 res (db:step-get
8120: 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70 29 20 -stepname step)
8130: 72 65 63 6f 72 64 29 0a 09 20 20 20 28 64 65 62 record).. (deb
8140: 75 67 3a 70 72 69 6e 74 20 36 20 22 72 65 63 6f ug:print 6 "reco
8150: 72 64 28 61 66 74 65 72 29 20 20 3d 20 22 20 72 rd(after) = " r
8160: 65 63 6f 72 64 20 0a 09 09 09 22 5c 6e 69 64 3a ecord ...."\nid:
8170: 20 20 20 20 20 20 20 22 20 28 64 62 3a 73 74 65 " (db:ste
8180: 70 2d 67 65 74 2d 69 64 20 73 74 65 70 29 0a 09 p-get-id step)..
8190: 09 09 22 5c 6e 73 74 65 70 6e 61 6d 65 3a 20 22 .."\nstepname: "
81a0: 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 (db:step-get-st
81b0: 65 70 6e 61 6d 65 20 73 74 65 70 29 0a 09 09 09 epname step)....
81c0: 22 5c 6e 73 74 61 74 65 3a 20 20 20 20 22 20 28 "\nstate: " (
81d0: 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 74 db:step-get-stat
81e0: 65 20 73 74 65 70 29 0a 09 09 09 22 5c 6e 73 74 e step)...."\nst
81f0: 61 74 75 73 3a 20 20 20 22 20 28 64 62 3a 73 74 atus: " (db:st
8200: 65 70 2d 67 65 74 2d 73 74 61 74 75 73 20 73 74 ep-get-status st
8210: 65 70 29 0a 09 09 09 22 5c 6e 74 69 6d 65 3a 20 ep)...."\ntime:
8220: 20 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d 67 " (db:step-g
8230: 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73 74 et-event_time st
8240: 65 70 29 29 29 29 0a 20 20 20 20 20 20 20 3b 3b ep)))). ;;
8250: 20 28 65 6c 73 65 20 20 20 28 76 65 63 74 6f 72 (else (vector
8260: 2d 73 65 74 21 20 72 65 63 6f 72 64 20 31 20 28 -set! record 1 (
8270: 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 6e db:step-get-even
8280: 74 5f 74 69 6d 65 20 73 74 65 70 29 29 29 0a 20 t_time step))).
8290: 20 20 20 20 20 20 28 73 6f 72 74 20 73 74 65 70 (sort step
82a0: 73 20 28 6c 61 6d 62 64 61 20 28 61 20 62 29 28 s (lambda (a b)(
82b0: 3c 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 < (db:step-get-e
82c0: 76 65 6e 74 5f 74 69 6d 65 20 61 29 28 64 62 3a vent_time a)(db:
82d0: 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 step-get-event_t
82e0: 69 6d 65 20 62 29 29 29 29 29 0a 20 20 20 20 20 ime b))))).
82f0: 20 72 65 73 29 29 29 0a 0a 3b 3b 20 55 53 45 3a res)))..;; USE:
8300: 20 28 6c 73 65 74 2d 64 69 66 66 65 72 65 6e 63 (lset-differenc
8310: 65 20 73 74 72 69 6e 67 3d 3f 20 27 28 22 61 22 e string=? '("a"
8320: 20 22 62 22 20 22 63 22 29 20 27 28 22 64 22 20 "b" "c") '("d"
8330: 22 63 22 20 22 65 22 20 22 61 22 29 29 0a 3b 3b "c" "e" "a")).;;
8340: 0a 3b 3b 20 52 65 74 75 72 6e 20 61 20 6c 69 73 .;; Return a lis
8350: 74 20 6f 66 20 70 72 65 72 65 71 73 20 74 68 61 t of prereqs tha
8360: 74 20 77 65 72 65 20 4e 4f 54 20 6d 65 74 0a 3b t were NOT met.;
8370: 3b 20 20 54 65 73 74 73 20 28 61 6e 64 20 61 6c ; Tests (and al
8380: 6c 20 69 74 65 6d 73 29 20 69 6e 20 77 61 69 74 l items) in wait
8390: 6f 6e 20 6c 69 73 74 20 6d 75 73 74 20 62 65 20 on list must be
83a0: 22 43 4f 4d 50 4c 45 54 45 44 22 20 61 6e 64 20 "COMPLETED" and
83b0: 22 50 41 53 53 22 0a 28 64 65 66 69 6e 65 20 28 "PASS".(define (
83c0: 64 62 2d 67 65 74 2d 70 72 65 72 65 71 73 2d 6e db-get-prereqs-n
83d0: 6f 74 2d 6d 65 74 20 64 62 20 72 75 6e 2d 69 64 ot-met db run-id
83e0: 20 77 61 69 74 6f 6e 29 0a 20 20 28 69 66 20 28 waiton). (if (
83f0: 6e 75 6c 6c 3f 20 77 61 69 74 6f 6e 29 0a 20 20 null? waiton).
8400: 20 20 20 20 27 28 29 0a 20 20 20 20 20 20 28 6c '(). (l
8410: 65 74 2a 20 28 28 75 6e 6d 65 74 2d 70 72 65 2d et* ((unmet-pre-
8420: 72 65 71 73 20 27 28 29 29 0a 09 20 20 20 20 20 reqs '())..
8430: 28 74 65 73 74 73 20 20 20 20 20 20 20 20 20 20 (tests
8440: 20 28 64 62 2d 67 65 74 2d 74 65 73 74 73 2d 66 (db-get-tests-f
8450: 6f 72 2d 72 75 6e 20 64 62 20 72 75 6e 2d 69 64 or-run db run-id
8460: 20 23 66 20 23 66 20 27 28 29 20 27 28 29 29 29 #f #f '() '()))
8470: 0a 09 20 20 20 20 20 28 72 65 73 75 6c 74 20 20 .. (result
8480: 20 20 20 20 20 20 20 27 28 29 29 29 0a 09 28 66 '()))..(f
8490: 6f 72 2d 65 61 63 68 20 28 6c 61 6d 62 64 61 20 or-each (lambda
84a0: 28 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 (waitontest-name
84b0: 29 0a 09 09 20 20 20 20 28 6c 65 74 20 28 28 65 )... (let ((e
84c0: 76 65 72 2d 73 65 65 6e 20 23 66 29 29 0a 09 09 ver-seen #f))...
84d0: 20 20 20 20 20 20 28 66 6f 72 2d 65 61 63 68 20 (for-each
84e0: 28 6c 61 6d 62 64 61 20 28 74 65 73 74 29 0a 09 (lambda (test)..
84f0: 09 09 09 20 20 28 69 66 20 28 65 71 75 61 6c 3f ... (if (equal?
8500: 20 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 waitontest-name
8510: 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 74 65 (db:test-get-te
8520: 73 74 6e 61 6d 65 20 74 65 73 74 29 29 0a 09 09 stname test))...
8530: 09 09 20 20 20 20 20 20 28 62 65 67 69 6e 0a 09 .. (begin..
8540: 09 09 09 09 28 73 65 74 21 20 65 76 65 72 2d 73 ....(set! ever-s
8550: 65 65 6e 20 23 74 29 0a 09 09 09 09 09 28 69 66 een #t)......(if
8560: 20 28 6e 6f 74 20 28 61 6e 64 20 28 65 71 75 61 (not (and (equa
8570: 6c 3f 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d l? (db:test-get-
8580: 73 74 61 74 65 20 74 65 73 74 29 20 22 43 4f 4d state test) "COM
8590: 50 4c 45 54 45 44 22 29 0a 09 09 09 09 09 09 20 PLETED").......
85a0: 20 20 20 20 20 28 6d 65 6d 62 65 72 20 28 64 62 (member (db
85b0: 3a 74 65 73 74 2d 67 65 74 2d 73 74 61 74 75 73 :test-get-status
85c0: 20 74 65 73 74 29 20 27 28 22 50 41 53 53 22 20 test) '("PASS"
85d0: 22 57 41 52 4e 22 20 22 43 48 45 43 4b 22 29 29 "WARN" "CHECK"))
85e0: 29 29 0a 09 09 09 09 09 20 20 20 20 28 73 65 74 ))...... (set
85f0: 21 20 72 65 73 75 6c 74 20 28 63 6f 6e 73 20 77 ! result (cons w
8600: 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 20 72 aitontest-name r
8610: 65 73 75 6c 74 29 29 29 29 29 29 0a 09 09 09 09 esult)))))).....
8620: 74 65 73 74 73 29 0a 09 09 20 20 20 20 20 20 28 tests)... (
8630: 69 66 20 28 6e 6f 74 20 65 76 65 72 2d 73 65 65 if (not ever-see
8640: 6e 29 28 73 65 74 21 20 72 65 73 75 6c 74 20 28 n)(set! result (
8650: 63 6f 6e 73 20 77 61 69 74 6f 6e 74 65 73 74 2d cons waitontest-
8660: 6e 61 6d 65 20 72 65 73 75 6c 74 29 29 29 29 29 name result)))))
8670: 0a 09 09 20 20 77 61 69 74 6f 6e 29 0a 09 28 64 ... waiton)..(d
8680: 65 6c 65 74 65 2d 64 75 70 6c 69 63 61 74 65 73 elete-duplicates
8690: 20 72 65 73 75 6c 74 29 29 29 29 0a 0a 3b 3b 20 result))))..;;
86a0: 74 68 65 20 6e 65 77 20 70 72 65 72 65 71 73 20 the new prereqs
86b0: 63 61 6c 63 75 6c 61 74 69 6f 6e 2c 20 6c 6f 6f calculation, loo
86c0: 6b 73 20 61 6c 73 6f 20 61 74 20 69 74 65 6d 70 ks also at itemp
86d0: 61 74 68 20 69 66 20 73 70 65 63 69 66 69 65 64 ath if specified
86e0: 0a 3b 3b 20 61 6c 6c 20 70 72 65 72 65 71 73 20 .;; all prereqs
86f0: 6d 75 73 74 20 62 65 20 6d 65 74 3a 0a 3b 3b 20 must be met:.;;
8700: 20 20 20 69 66 20 70 72 65 72 65 71 20 74 65 73 if prereq tes
8710: 74 20 77 69 74 68 20 69 74 65 6d 70 61 74 68 3d t with itempath=
8720: 27 27 20 69 73 20 43 4f 4d 50 4c 45 54 45 44 20 '' is COMPLETED
8730: 61 6e 64 20 50 41 53 53 2c 20 57 41 52 4e 2c 20 and PASS, WARN,
8740: 43 48 45 43 4b 2c 20 6f 72 20 57 41 49 56 45 44 CHECK, or WAIVED
8750: 20 74 68 65 6e 20 70 72 65 72 65 71 20 69 73 20 then prereq is
8760: 6d 65 74 0a 3b 3b 20 20 20 20 69 66 20 70 72 65 met.;; if pre
8770: 72 65 71 20 74 65 73 74 20 77 69 74 68 20 69 74 req test with it
8780: 65 6d 70 61 74 68 3d 72 65 66 2d 69 74 65 6d 2d empath=ref-item-
8790: 70 61 74 68 20 61 6e 64 20 43 4f 4d 50 4c 45 54 path and COMPLET
87a0: 45 44 20 77 69 74 68 20 50 41 53 53 2c 20 57 41 ED with PASS, WA
87b0: 52 4e 2c 20 43 48 45 43 4b 2c 20 6f 72 20 57 41 RN, CHECK, or WA
87c0: 49 56 45 44 20 74 68 65 6e 20 70 72 65 72 65 71 IVED then prereq
87d0: 20 69 73 20 6d 65 74 0a 28 64 65 66 69 6e 65 20 is met.(define
87e0: 28 64 62 3a 67 65 74 2d 70 72 65 72 65 71 73 2d (db:get-prereqs-
87f0: 6e 6f 74 2d 6d 65 74 20 64 62 20 72 75 6e 2d 69 not-met db run-i
8800: 64 20 77 61 69 74 6f 6e 73 20 72 65 66 2d 69 74 d waitons ref-it
8810: 65 6d 2d 70 61 74 68 29 0a 20 20 28 69 66 20 28 em-path). (if (
8820: 6f 72 20 28 6e 6f 74 20 77 61 69 74 6f 6e 73 29 or (not waitons)
8830: 0a 09 20 20 28 6e 75 6c 6c 3f 20 77 61 69 74 6f .. (null? waito
8840: 6e 73 29 29 0a 20 20 20 20 20 20 27 28 29 0a 20 ns)). '().
8850: 20 20 20 20 20 28 6c 65 74 2a 20 28 28 75 6e 6d (let* ((unm
8860: 65 74 2d 70 72 65 2d 72 65 71 73 20 27 28 29 29 et-pre-reqs '())
8870: 0a 09 20 20 20 20 20 28 72 65 73 75 6c 74 20 20 .. (result
8880: 20 20 20 20 20 20 20 27 28 29 29 29 0a 09 28 66 '()))..(f
8890: 6f 72 2d 65 61 63 68 20 0a 09 20 28 6c 61 6d 62 or-each .. (lamb
88a0: 64 61 20 28 77 61 69 74 6f 6e 74 65 73 74 2d 6e da (waitontest-n
88b0: 61 6d 65 29 0a 09 20 20 20 3b 3b 20 62 79 20 67 ame).. ;; by g
88c0: 65 74 74 69 6e 67 20 74 68 65 20 74 65 73 74 73 etting the tests
88d0: 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20 6e with matching n
88e0: 61 6d 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 ame we are looki
88f0: 6e 67 20 6f 6e 6c 79 20 61 74 20 74 68 65 20 6d ng only at the m
8900: 61 74 63 68 69 6e 67 20 74 65 73 74 20 0a 09 20 atching test ..
8910: 20 20 3b 3b 20 61 6e 64 20 72 65 6c 61 74 65 64 ;; and related
8920: 20 73 75 62 20 69 74 65 6d 73 0a 09 20 20 20 28 sub items.. (
8930: 6c 65 74 20 28 28 74 65 73 74 73 20 20 20 20 20 let ((tests
8940: 20 20 20 20 20 20 20 20 28 64 62 2d 67 65 74 2d (db-get-
8950: 74 65 73 74 73 2d 66 6f 72 2d 72 75 6e 20 64 62 tests-for-run db
8960: 20 72 75 6e 2d 69 64 20 77 61 69 74 6f 6e 74 65 run-id waitonte
8970: 73 74 2d 6e 61 6d 65 20 23 66 20 27 28 29 20 27 st-name #f '() '
8980: 28 29 29 29 0a 09 09 20 28 65 76 65 72 2d 73 65 ()))... (ever-se
8990: 65 6e 20 20 20 20 20 20 20 20 20 23 66 29 0a 09 en #f)..
89a0: 09 20 28 70 61 72 65 6e 74 2d 77 61 69 74 6f 6e . (parent-waiton
89b0: 2d 6d 65 74 20 23 66 29 0a 09 09 20 28 69 74 65 -met #f)... (ite
89c0: 6d 2d 77 61 69 74 6f 6e 2d 6d 65 74 20 20 20 23 m-waiton-met #
89d0: 66 29 29 0a 09 20 20 20 20 20 28 66 6f 72 2d 65 f)).. (for-e
89e0: 61 63 68 20 0a 09 20 20 20 20 20 20 28 6c 61 6d ach .. (lam
89f0: 62 64 61 20 28 74 65 73 74 29 0a 09 09 3b 3b 20 bda (test)...;;
8a00: 28 69 66 20 28 65 71 75 61 6c 3f 20 77 61 69 74 (if (equal? wait
8a10: 6f 6e 74 65 73 74 2d 6e 61 6d 65 20 28 64 62 3a ontest-name (db:
8a20: 74 65 73 74 2d 67 65 74 2d 74 65 73 74 6e 61 6d test-get-testnam
8a30: 65 20 74 65 73 74 29 29 20 3b 3b 20 62 79 20 64 e test)) ;; by d
8a40: 65 66 69 6e 74 69 6f 6e 20 74 68 69 73 20 68 61 efintion this ha
8a50: 64 20 62 65 74 74 65 72 20 62 65 20 74 72 75 65 d better be true
8a60: 20 2e 2e 2e 0a 09 09 28 6c 65 74 2a 20 28 28 73 ......(let* ((s
8a70: 74 61 74 65 20 20 20 20 20 20 20 20 20 20 20 20 tate
8a80: 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 73 74 (db:test-get-st
8a90: 61 74 65 20 74 65 73 74 29 29 0a 09 09 20 20 20 ate test))...
8aa0: 20 20 20 20 28 73 74 61 74 75 73 20 20 20 20 20 (status
8ab0: 20 20 20 20 20 20 20 28 64 62 3a 74 65 73 74 2d (db:test-
8ac0: 67 65 74 2d 73 74 61 74 75 73 20 74 65 73 74 29 get-status test)
8ad0: 29 0a 09 09 20 20 20 20 20 20 20 28 69 74 65 6d )... (item
8ae0: 2d 70 61 74 68 20 20 20 20 20 20 20 20 20 28 64 -path (d
8af0: 62 3a 74 65 73 74 2d 67 65 74 2d 69 74 65 6d 2d b:test-get-item-
8b00: 70 61 74 68 20 74 65 73 74 29 29 0a 09 09 20 20 path test))...
8b10: 20 20 20 20 20 28 69 73 2d 63 6f 6d 70 6c 65 74 (is-complet
8b20: 65 64 20 20 20 20 20 20 28 65 71 75 61 6c 3f 20 ed (equal?
8b30: 73 74 61 74 65 20 22 43 4f 4d 50 4c 45 54 45 44 state "COMPLETED
8b40: 22 29 29 0a 09 09 20 20 20 20 20 20 20 28 69 73 "))... (is
8b50: 2d 6f 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 -ok
8b60: 28 6d 65 6d 62 65 72 20 73 74 61 74 75 73 20 27 (member status '
8b70: 28 22 50 41 53 53 22 20 22 57 41 52 4e 22 20 22 ("PASS" "WARN" "
8b80: 43 48 45 43 4b 22 20 22 57 41 49 56 45 44 22 29 CHECK" "WAIVED")
8b90: 29 29 0a 09 09 20 20 20 20 20 20 20 28 73 61 6d ))... (sam
8ba0: 65 2d 69 74 65 6d 70 61 74 68 20 20 20 20 20 28 e-itempath (
8bb0: 65 71 75 61 6c 3f 20 72 65 66 2d 69 74 65 6d 2d equal? ref-item-
8bc0: 70 61 74 68 20 69 74 65 6d 2d 70 61 74 68 29 29 path item-path))
8bd0: 29 0a 09 09 20 20 28 73 65 74 21 20 65 76 65 72 )... (set! ever
8be0: 2d 73 65 65 6e 20 23 74 29 0a 09 09 20 20 28 63 -seen #t)... (c
8bf0: 6f 6e 64 0a 09 09 20 20 20 3b 3b 20 63 61 73 65 ond... ;; case
8c00: 20 31 2c 20 6e 6f 6e 2d 69 74 65 6d 20 28 70 61 1, non-item (pa
8c10: 72 65 6e 74 20 74 65 73 74 29 20 69 73 20 0a 09 rent test) is ..
8c20: 09 20 20 20 28 28 61 6e 64 20 28 65 71 75 61 6c . ((and (equal
8c30: 3f 20 69 74 65 6d 2d 70 61 74 68 20 22 22 29 20 ? item-path "")
8c40: 3b 3b 20 74 68 69 73 20 69 73 20 74 68 65 20 70 ;; this is the p
8c50: 61 72 65 6e 74 20 74 65 73 74 0a 09 09 09 20 69 arent test.... i
8c60: 73 2d 63 6f 6d 70 6c 65 74 65 64 0a 09 09 09 20 s-completed....
8c70: 69 73 2d 6f 6b 29 0a 09 09 20 20 20 20 28 73 65 is-ok)... (se
8c80: 74 21 20 70 61 72 65 6e 74 2d 77 61 69 74 6f 6e t! parent-waiton
8c90: 2d 6d 65 74 20 23 74 29 29 0a 09 09 20 20 20 28 -met #t))... (
8ca0: 28 61 6e 64 20 73 61 6d 65 2d 69 74 65 6d 70 61 (and same-itempa
8cb0: 74 68 0a 09 09 09 20 69 73 2d 63 6f 6d 70 6c 65 th.... is-comple
8cc0: 74 65 64 0a 09 09 09 20 69 73 2d 6f 6b 29 0a 09 ted.... is-ok)..
8cd0: 09 20 20 20 20 28 73 65 74 21 20 69 74 65 6d 2d . (set! item-
8ce0: 77 61 69 74 6f 6e 2d 6d 65 74 20 23 74 29 29 29 waiton-met #t)))
8cf0: 29 29 0a 09 20 20 20 20 20 20 74 65 73 74 73 29 )).. tests)
8d00: 0a 09 20 20 20 20 20 28 69 66 20 28 6e 6f 74 20 .. (if (not
8d10: 28 6f 72 20 70 61 72 65 6e 74 2d 77 61 69 74 6f (or parent-waito
8d20: 6e 2d 6d 65 74 20 69 74 65 6d 2d 77 61 69 74 6f n-met item-waito
8d30: 6e 2d 6d 65 74 29 29 0a 09 09 20 28 73 65 74 21 n-met))... (set!
8d40: 20 72 65 73 75 6c 74 20 28 63 6f 6e 73 20 77 61 result (cons wa
8d50: 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 20 72 65 itontest-name re
8d60: 73 75 6c 74 29 29 29 0a 09 20 20 20 20 20 3b 3b sult))).. ;;
8d70: 20 69 66 20 74 68 65 20 74 65 73 74 20 69 73 20 if the test is
8d80: 6e 6f 74 20 66 6f 75 6e 64 20 74 68 65 6e 20 63 not found then c
8d90: 6c 65 61 72 6c 79 20 74 68 65 20 77 61 69 74 6f learly the waito
8da0: 6e 20 69 73 20 6e 6f 74 20 6d 65 74 2e 2e 2e 0a n is not met....
8db0: 09 20 20 20 20 20 28 69 66 20 28 6e 6f 74 20 65 . (if (not e
8dc0: 76 65 72 2d 73 65 65 6e 29 28 73 65 74 21 20 72 ver-seen)(set! r
8dd0: 65 73 75 6c 74 20 28 63 6f 6e 73 20 77 61 69 74 esult (cons wait
8de0: 6f 6e 74 65 73 74 2d 6e 61 6d 65 20 72 65 73 75 ontest-name resu
8df0: 6c 74 29 29 29 29 29 0a 09 77 61 69 74 6f 6e 73 lt)))))..waitons
8e00: 29 0a 20 20 20 20 20 20 28 64 65 6c 65 74 65 2d ). (delete-
8e10: 64 75 70 6c 69 63 61 74 65 73 20 72 65 73 75 6c duplicates resul
8e20: 74 29 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d t))))..;;=======
8e30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8e40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8e50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8e60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a ===============.
8e70: 3b 3b 20 45 78 74 72 61 63 74 20 6f 64 73 20 66 ;; Extract ods f
8e80: 69 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62 0a ile from the db.
8e90: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ;;==============
8ea0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8eb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8ec0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8ed0: 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 72 75 6e ========..;; run
8ee0: 73 70 61 74 74 20 69 73 20 61 20 63 6f 6d 6d 61 spatt is a comma
8ef0: 20 64 65 6c 69 6d 69 74 65 64 20 6c 69 73 74 20 delimited list
8f00: 6f 66 20 72 75 6e 20 70 61 74 74 65 72 6e 73 0a of run patterns.
8f10: 3b 3b 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 ;; keypatt-alist
8f20: 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 2a 61 must contain *a
8f30: 6c 6c 2a 20 6b 65 79 73 20 77 69 74 68 20 61 6e ll* keys with an
8f40: 20 61 73 73 6f 63 69 61 74 65 64 20 70 61 74 74 associated patt
8f50: 65 72 6e 3a 20 27 28 20 28 22 4b 45 59 31 22 20 ern: '( ("KEY1"
8f60: 22 25 22 29 20 2e 2e 20 29 0a 28 64 65 66 69 6e "%") .. ).(defin
8f70: 65 20 28 64 62 3a 65 78 74 72 61 63 74 2d 6f 64 e (db:extract-od
8f80: 73 2d 66 69 6c 65 20 64 62 20 6f 75 74 70 75 74 s-file db output
8f90: 66 69 6c 65 20 6b 65 79 70 61 74 74 2d 61 6c 69 file keypatt-ali
8fa0: 73 74 20 72 75 6e 73 70 61 74 74 20 70 61 74 68 st runspatt path
8fb0: 6d 6f 64 29 0a 20 20 28 6c 65 74 2a 20 28 28 6b mod). (let* ((k
8fc0: 65 79 73 73 74 72 20 20 28 73 74 72 69 6e 67 2d eysstr (string-
8fd0: 69 6e 74 65 72 73 70 65 72 73 65 20 28 6d 61 70 intersperse (map
8fe0: 20 63 61 72 20 6b 65 79 70 61 74 74 2d 61 6c 69 car keypatt-ali
8ff0: 73 74 29 20 22 2c 22 29 29 0a 09 20 28 6b 65 79 st) ",")).. (key
9000: 71 72 79 20 20 20 28 73 74 72 69 6e 67 2d 69 6e qry (string-in
9010: 74 65 72 73 70 65 72 73 65 20 28 6d 61 70 20 28 tersperse (map (
9020: 6c 61 6d 62 64 61 20 28 70 29 28 63 6f 6e 63 20 lambda (p)(conc
9030: 28 63 61 72 20 70 29 20 22 20 4c 49 4b 45 20 3f (car p) " LIKE ?
9040: 20 22 29 29 20 6b 65 79 70 61 74 74 2d 61 6c 69 ")) keypatt-ali
9050: 73 74 29 20 22 20 41 4e 44 20 22 29 29 0a 09 20 st) " AND "))..
9060: 28 6e 75 6d 6b 65 79 73 20 20 28 6c 65 6e 67 74 (numkeys (lengt
9070: 68 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 29 h keypatt-alist)
9080: 29 0a 09 20 28 74 65 73 74 2d 69 64 73 20 27 28 ).. (test-ids '(
9090: 29 29 0a 09 20 28 77 69 6e 64 6f 77 73 20 20 28 )).. (windows (
90a0: 61 6e 64 20 70 61 74 68 6d 6f 64 20 28 73 75 62 and pathmod (sub
90b0: 73 74 72 69 6e 67 2d 69 6e 64 65 78 20 22 5c 5c string-index "\\
90c0: 22 20 70 61 74 68 6d 6f 64 29 29 29 0a 09 20 28 " pathmod))).. (
90d0: 74 65 6d 70 64 69 72 20 20 28 63 6f 6e 63 20 22 tempdir (conc "
90e0: 2f 74 6d 70 2f 22 20 28 63 75 72 72 65 6e 74 2d /tmp/" (current-
90f0: 75 73 65 72 2d 6e 61 6d 65 29 20 22 2f 22 20 72 user-name) "/" r
9100: 75 6e 73 70 61 74 74 20 22 5f 22 20 28 72 61 6e unspatt "_" (ran
9110: 64 6f 6d 20 31 30 30 30 30 29 20 22 5f 22 20 28 dom 10000) "_" (
9120: 63 75 72 72 65 6e 74 2d 70 72 6f 63 65 73 73 2d current-process-
9130: 69 64 29 29 29 0a 09 20 28 72 75 6e 73 68 65 61 id))).. (runshea
9140: 64 65 72 20 28 61 70 70 65 6e 64 20 28 6c 69 73 der (append (lis
9150: 74 20 22 52 75 6e 20 49 64 22 20 22 52 75 6e 6e t "Run Id" "Runn
9160: 61 6d 65 22 29 20 3b 20 30 20 31 0a 09 09 09 20 ame") ; 0 1....
9170: 20 20 20 20 28 6d 61 70 20 63 61 72 20 6b 65 79 (map car key
9180: 70 61 74 74 2d 61 6c 69 73 74 29 20 20 20 3b 20 patt-alist) ;
9190: 2b 20 4e 20 3d 20 6c 65 6e 67 74 68 20 6b 65 79 + N = length key
91a0: 70 61 74 74 2d 61 6c 69 73 74 0a 09 09 09 20 20 patt-alist....
91b0: 20 20 20 28 6c 69 73 74 20 22 54 65 73 74 6e 61 (list "Testna
91c0: 6d 65 22 20 20 20 20 20 20 20 20 20 20 3b 20 32 me" ; 2
91d0: 0a 09 09 09 09 20 20 20 22 49 74 65 6d 20 50 61 ..... "Item Pa
91e0: 74 68 22 20 20 20 20 20 20 20 20 20 3b 20 33 20 th" ; 3
91f0: 0a 09 09 09 09 20 20 20 22 44 65 73 63 72 69 70 ..... "Descrip
9200: 74 69 6f 6e 22 20 20 20 20 20 20 20 3b 20 34 20 tion" ; 4
9210: 0a 09 09 09 09 20 20 20 22 53 74 61 74 65 22 20 ..... "State"
9220: 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 35 20 ; 5
9230: 0a 09 09 09 09 20 20 20 22 53 74 61 74 75 73 22 ..... "Status"
9240: 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 36 20 ; 6
9250: 20 0a 09 09 09 09 20 20 20 22 46 69 6e 61 6c 20 ..... "Final
9260: 4c 6f 67 22 20 20 20 20 20 20 20 20 20 3b 20 37 Log" ; 7
9270: 20 0a 09 09 09 09 20 20 20 22 52 75 6e 20 44 75 ..... "Run Du
9280: 72 61 74 69 6f 6e 22 20 20 20 20 20 20 3b 20 38 ration" ; 8
9290: 20 0a 09 09 09 09 20 20 20 22 57 68 65 6e 20 52 ..... "When R
92a0: 75 6e 22 20 20 20 20 20 20 20 20 20 20 3b 20 39 un" ; 9
92b0: 20 0a 09 09 09 09 20 20 20 22 54 61 67 73 22 20 ..... "Tags"
92c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 31 ; 1
92d0: 30 0a 09 09 09 09 20 20 20 22 52 75 6e 20 4f 77 0..... "Run Ow
92e0: 6e 65 72 22 20 20 20 20 20 20 20 20 20 3b 20 31 ner" ; 1
92f0: 31 0a 09 09 09 09 20 20 20 22 43 6f 6d 6d 65 6e 1..... "Commen
9300: 74 22 20 20 20 20 20 20 20 20 20 20 20 3b 20 31 t" ; 1
9310: 32 0a 09 09 09 09 20 20 20 22 41 75 74 68 6f 72 2..... "Author
9320: 22 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 31 " ; 1
9330: 33 0a 09 09 09 09 20 20 20 22 54 65 73 74 20 4f 3..... "Test O
9340: 77 6e 65 72 22 20 20 20 20 20 20 20 20 3b 20 31 wner" ; 1
9350: 34 0a 09 09 09 09 20 20 20 22 52 65 76 69 65 77 4..... "Review
9360: 65 64 22 20 20 20 20 20 20 20 20 20 20 3b 20 31 ed" ; 1
9370: 35 0a 09 09 09 09 20 20 20 22 44 69 73 6b 66 72 5..... "Diskfr
9380: 65 65 22 20 20 20 20 20 20 20 20 20 20 3b 20 31 ee" ; 1
9390: 36 0a 09 09 09 09 20 20 20 22 55 6e 61 6d 65 22 6..... "Uname"
93a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 31 ; 1
93b0: 37 0a 09 09 09 09 20 20 20 22 52 75 6e 64 69 72 7..... "Rundir
93c0: 22 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 31 " ; 1
93d0: 38 0a 09 09 09 09 20 20 20 22 48 6f 73 74 22 20 8..... "Host"
93e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 31 ; 1
93f0: 39 0a 09 09 09 09 20 20 20 22 43 70 75 20 4c 6f 9..... "Cpu Lo
9400: 61 64 22 20 20 20 20 20 20 20 20 20 20 3b 20 32 ad" ; 2
9410: 30 0a 09 09 09 09 20 20 20 29 29 29 0a 09 20 28 0..... ))).. (
9420: 72 65 73 75 6c 74 73 20 28 6c 69 73 74 20 72 75 results (list ru
9430: 6e 73 68 65 61 64 65 72 29 29 09 09 09 20 0a 09 nsheader))... ..
9440: 20 28 74 65 73 74 64 61 74 61 2d 68 65 61 64 65 (testdata-heade
9450: 72 20 28 6c 69 73 74 20 22 52 75 6e 20 49 64 22 r (list "Run Id"
9460: 20 22 54 65 73 74 6e 61 6d 65 22 20 22 49 74 65 "Testname" "Ite
9470: 6d 20 50 61 74 68 22 20 22 43 61 74 65 67 6f 72 m Path" "Categor
9480: 79 22 20 22 56 61 72 69 61 62 6c 65 22 20 22 56 y" "Variable" "V
9490: 61 6c 75 65 22 20 22 45 78 70 65 63 74 65 64 22 alue" "Expected"
94a0: 20 22 54 6f 6c 22 20 22 55 6e 69 74 73 22 20 22 "Tol" "Units" "
94b0: 53 74 61 74 75 73 22 20 22 43 6f 6d 6d 65 6e 74 Status" "Comment
94c0: 22 29 29 0a 09 20 28 6d 61 69 6e 71 72 79 20 28 ")).. (mainqry (
94d0: 63 6f 6e 63 20 22 53 45 4c 45 43 54 0a 20 20 20 conc "SELECT.
94e0: 20 20 20 20 20 20 20 20 20 20 20 74 2e 74 65 73 t.tes
94f0: 74 6e 61 6d 65 2c 72 2e 69 64 2c 72 75 6e 6e 61 tname,r.id,runna
9500: 6d 65 2c 22 20 6b 65 79 73 73 74 72 20 22 2c 74 me," keysstr ",t
9510: 2e 74 65 73 74 6e 61 6d 65 2c 0a 20 20 20 20 20 .testname,.
9520: 20 20 20 20 20 20 20 20 20 74 2e 69 74 65 6d 5f t.item_
9530: 70 61 74 68 2c 74 6d 2e 64 65 73 63 72 69 70 74 path,tm.descript
9540: 69 6f 6e 2c 74 2e 73 74 61 74 65 2c 74 2e 73 74 ion,t.state,t.st
9550: 61 74 75 73 2c 0a 20 20 20 20 20 20 20 20 20 20 atus,.
9560: 20 20 20 20 66 69 6e 61 6c 5f 6c 6f 67 66 2c 72 final_logf,r
9570: 75 6e 5f 64 75 72 61 74 69 6f 6e 2c 20 0a 20 20 un_duration, .
9580: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 66 strf
9590: 74 69 6d 65 28 27 25 6d 2f 25 64 2f 25 59 20 25 time('%m/%d/%Y %
95a0: 48 3a 25 4d 3a 25 53 27 2c 64 61 74 65 74 69 6d H:%M:%S',datetim
95b0: 65 28 74 2e 65 76 65 6e 74 5f 74 69 6d 65 2c 27 e(t.event_time,'
95c0: 75 6e 69 78 65 70 6f 63 68 27 29 2c 27 6c 6f 63 unixepoch'),'loc
95d0: 61 6c 74 69 6d 65 27 29 2c 0a 20 20 20 20 20 20 altime'),.
95e0: 20 20 20 20 20 20 20 20 74 6d 2e 74 61 67 73 2c tm.tags,
95f0: 72 2e 6f 77 6e 65 72 2c 74 2e 63 6f 6d 6d 65 6e r.owner,t.commen
9600: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 t,.
9610: 20 61 75 74 68 6f 72 2c 0a 20 20 20 20 20 20 20 author,.
9620: 20 20 20 20 20 20 20 74 6d 2e 6f 77 6e 65 72 2c tm.owner,
9630: 72 65 76 69 65 77 65 64 2c 0a 20 20 20 20 20 20 reviewed,.
9640: 20 20 20 20 20 20 20 20 64 69 73 6b 66 72 65 65 diskfree
9650: 2c 75 6e 61 6d 65 2c 72 75 6e 64 69 72 2c 0a 20 ,uname,rundir,.
9660: 20 20 20 20 20 20 20 20 20 20 20 20 20 68 6f 73 hos
9670: 74 2c 63 70 75 6c 6f 61 64 0a 20 20 20 20 20 20 t,cpuload.
9680: 20 20 20 20 20 20 46 52 4f 4d 20 74 65 73 74 73 FROM tests
9690: 20 41 53 20 74 20 4a 4f 49 4e 20 72 75 6e 73 20 AS t JOIN runs
96a0: 41 53 20 72 20 4f 4e 20 74 2e 72 75 6e 5f 69 64 AS r ON t.run_id
96b0: 3d 72 2e 69 64 20 4a 4f 49 4e 20 74 65 73 74 5f =r.id JOIN test_
96c0: 6d 65 74 61 20 41 53 20 74 6d 20 4f 4e 20 74 6d meta AS tm ON tm
96d0: 2e 74 65 73 74 6e 61 6d 65 3d 74 2e 74 65 73 74 .testname=t.test
96e0: 6e 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 20 name.
96f0: 20 57 48 45 52 45 20 72 75 6e 6e 61 6d 65 20 4c WHERE runname L
9700: 49 4b 45 20 3f 20 41 4e 44 20 22 20 6b 65 79 71 IKE ? AND " keyq
9710: 72 79 20 22 3b 22 29 29 29 0a 20 20 20 20 28 64 ry ";"))). (d
9720: 65 62 75 67 3a 70 72 69 6e 74 20 32 20 22 55 73 ebug:print 2 "Us
9730: 69 6e 67 20 22 20 74 65 6d 70 64 69 72 20 22 20 ing " tempdir "
9740: 66 6f 72 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 for constructing
9750: 20 74 68 65 20 6f 64 73 20 66 69 6c 65 2e 20 6b the ods file. k
9760: 65 79 71 72 79 3a 20 22 20 6b 65 79 71 72 79 20 eyqry: " keyqry
9770: 22 20 6b 65 79 73 74 72 3a 20 22 20 6b 65 79 73 " keystr: " keys
9780: 73 74 72 20 22 20 77 69 74 68 20 6b 65 79 73 3a str " with keys:
9790: 20 22 20 28 6d 61 70 20 63 61 64 72 20 6b 65 79 " (map cadr key
97a0: 70 61 74 74 2d 61 6c 69 73 74 29 0a 09 09 20 22 patt-alist)... "
97b0: 5c 6e 20 20 20 20 20 20 6d 61 69 6e 71 72 79 3a \n mainqry:
97c0: 20 22 20 6d 61 69 6e 71 72 79 29 0a 20 20 20 20 " mainqry).
97d0: 3b 3b 20 22 45 78 70 65 63 74 65 64 20 56 61 6c ;; "Expected Val
97e0: 75 65 22 0a 20 20 20 20 3b 3b 20 22 56 61 6c 75 ue". ;; "Valu
97f0: 65 20 46 6f 75 6e 64 22 0a 20 20 20 20 3b 3b 20 e Found". ;;
9800: 22 54 6f 6c 65 72 61 6e 63 65 22 0a 20 20 20 20 "Tolerance".
9810: 28 61 70 70 6c 79 20 73 71 6c 69 74 65 33 3a 66 (apply sqlite3:f
9820: 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 09 20 20 20 or-each-row..
9830: 28 6c 61 6d 62 64 61 20 28 74 65 73 74 2d 69 64 (lambda (test-id
9840: 20 2e 20 62 29 0a 09 20 20 20 20 20 28 73 65 74 . b).. (set
9850: 21 20 74 65 73 74 2d 69 64 73 20 28 63 6f 6e 73 ! test-ids (cons
9860: 20 74 65 73 74 2d 69 64 20 74 65 73 74 2d 69 64 test-id test-id
9870: 73 29 29 20 20 20 3b 3b 20 74 65 73 74 2d 69 64 s)) ;; test-id
9880: 20 69 73 20 6e 6f 77 20 74 65 73 74 6e 61 6d 65 is now testname
9890: 0a 09 20 20 20 20 20 28 73 65 74 21 20 72 65 73 .. (set! res
98a0: 75 6c 74 73 20 28 61 70 70 65 6e 64 20 72 65 73 ults (append res
98b0: 75 6c 74 73 20 3b 3b 20 6e 6f 74 65 2c 20 64 72 ults ;; note, dr
98c0: 6f 70 20 74 68 65 20 74 65 73 74 2d 69 64 0a 09 op the test-id..
98d0: 09 09 09 20 20 20 28 6c 69 73 74 0a 09 09 09 09 ... (list.....
98e0: 20 20 20 20 28 69 66 20 70 61 74 68 6d 6f 64 0a (if pathmod.
98f0: 09 09 09 09 09 28 6c 65 74 2a 20 28 28 76 62 20 .....(let* ((vb
9900: 20 20 20 20 20 20 20 28 61 70 70 6c 79 20 76 65 (apply ve
9910: 63 74 6f 72 20 62 29 29 0a 09 09 09 09 09 20 20 ctor b))......
9920: 20 20 20 20 20 28 6b 65 79 76 61 6c 73 20 20 20 (keyvals
9930: 28 6c 65 74 20 6c 6f 6f 70 20 28 28 69 20 20 20 (let loop ((i
9940: 20 30 29 0a 09 09 09 09 09 09 09 09 20 20 20 20 0).........
9950: 20 28 72 65 73 20 27 28 29 29 29 0a 09 09 09 09 (res '())).....
9960: 09 09 09 20 20 20 20 28 69 66 20 28 3e 3d 20 69 ... (if (>= i
9970: 20 6e 75 6d 6b 65 79 73 29 0a 09 09 09 09 09 09 numkeys).......
9980: 09 09 72 65 73 0a 09 09 09 09 09 09 09 09 28 6c ..res.........(l
9990: 6f 6f 70 20 28 2b 20 69 20 31 29 0a 09 09 09 09 oop (+ i 1).....
99a0: 09 09 09 09 20 20 20 20 20 20 28 61 70 70 65 6e .... (appen
99b0: 64 20 72 65 73 20 28 6c 69 73 74 20 28 76 65 63 d res (list (vec
99c0: 74 6f 72 2d 72 65 66 20 76 62 20 28 2b 20 69 20 tor-ref vb (+ i
99d0: 32 29 29 29 29 29 29 29 29 0a 09 09 09 09 09 20 2))))))))......
99e0: 20 20 20 20 20 20 28 72 75 6e 6e 61 6d 65 20 20 (runname
99f0: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62 20 (vector-ref vb
9a00: 31 29 29 0a 09 09 09 09 09 20 20 20 20 20 20 20 1))......
9a10: 28 74 65 73 74 6e 61 6d 65 20 20 28 76 65 63 74 (testname (vect
9a20: 6f 72 2d 72 65 66 20 76 62 20 28 2b 20 20 32 20 or-ref vb (+ 2
9a30: 6e 75 6d 6b 65 79 73 29 29 29 0a 09 09 09 09 09 numkeys)))......
9a40: 20 20 20 20 20 20 20 28 69 74 65 6d 2d 70 61 74 (item-pat
9a50: 68 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62 h (vector-ref vb
9a60: 20 28 2b 20 20 33 20 6e 75 6d 6b 65 79 73 29 29 (+ 3 numkeys))
9a70: 29 0a 09 09 09 09 09 20 20 20 20 20 20 20 28 66 )...... (f
9a80: 69 6e 61 6c 2d 6c 6f 67 20 28 76 65 63 74 6f 72 inal-log (vector
9a90: 2d 72 65 66 20 76 62 20 28 2b 20 20 37 20 6e 75 -ref vb (+ 7 nu
9aa0: 6d 6b 65 79 73 29 29 29 0a 09 09 09 09 09 20 20 mkeys)))......
9ab0: 20 20 20 20 20 28 72 75 6e 2d 64 69 72 20 20 20 (run-dir
9ac0: 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62 20 28 (vector-ref vb (
9ad0: 2b 20 31 38 20 6e 75 6d 6b 65 79 73 29 29 29 0a + 18 numkeys))).
9ae0: 09 09 09 09 09 20 20 20 20 20 20 20 28 6c 6f 67 ..... (log
9af0: 2d 66 70 61 74 68 20 28 63 6f 6e 63 20 72 75 6e -fpath (conc run
9b00: 2d 64 69 72 20 22 2f 22 20 20 66 69 6e 61 6c 2d -dir "/" final-
9b10: 6c 6f 67 29 29 29 20 3b 3b 20 28 73 74 72 69 6e log))) ;; (strin
9b20: 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 6b 65 g-intersperse ke
9b30: 79 76 61 6c 73 20 22 2f 22 29 20 22 2f 22 20 74 yvals "/") "/" t
9b40: 65 73 74 6e 61 6d 65 20 22 2f 22 20 69 74 65 6d estname "/" item
9b50: 2d 70 61 74 68 20 22 2f 22 0a 09 09 09 09 09 20 -path "/"......
9b60: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20 (debug:print 4
9b70: 22 6c 6f 67 3a 20 22 20 6c 6f 67 2d 66 70 61 74 "log: " log-fpat
9b80: 68 20 22 20 65 78 69 73 74 73 3a 20 22 20 28 66 h " exists: " (f
9b90: 69 6c 65 2d 65 78 69 73 74 73 3f 20 6c 6f 67 2d ile-exists? log-
9ba0: 66 70 61 74 68 29 29 0a 09 09 09 09 09 20 20 28 fpath))...... (
9bb0: 76 65 63 74 6f 72 2d 73 65 74 21 20 76 62 20 28 vector-set! vb (
9bc0: 2b 20 37 20 6e 75 6d 6b 65 79 73 29 20 28 69 66 + 7 numkeys) (if
9bd0: 20 28 66 69 6c 65 2d 65 78 69 73 74 73 3f 20 6c (file-exists? l
9be0: 6f 67 2d 66 70 61 74 68 29 0a 09 09 09 09 09 09 og-fpath).......
9bf0: 09 09 09 20 20 20 20 28 6c 65 74 20 28 28 6e 65 ... (let ((ne
9c00: 77 70 61 74 68 20 28 63 6f 6e 63 20 70 61 74 68 wpath (conc path
9c10: 6d 6f 64 20 22 2f 22 0a 09 09 09 09 09 09 09 09 mod "/".........
9c20: 09 09 09 09 20 28 73 74 72 69 6e 67 2d 69 6e 74 .... (string-int
9c30: 65 72 73 70 65 72 73 65 20 6b 65 79 76 61 6c 73 ersperse keyvals
9c40: 20 22 2f 22 29 0a 09 09 09 09 09 09 09 09 09 09 "/")...........
9c50: 09 09 20 22 2f 22 20 72 75 6e 6e 61 6d 65 20 22 .. "/" runname "
9c60: 2f 22 20 74 65 73 74 6e 61 6d 65 20 22 2f 22 0a /" testname "/".
9c70: 09 09 09 09 09 09 09 09 09 09 09 09 20 28 69 66 ............ (if
9c80: 20 28 73 74 72 69 6e 67 3d 3f 20 69 74 65 6d 2d (string=? item-
9c90: 70 61 74 68 20 22 22 29 20 22 22 20 28 63 6f 6e path "") "" (con
9ca0: 63 20 22 2f 22 20 69 74 65 6d 2d 70 61 74 68 29 c "/" item-path)
9cb0: 29 0a 09 09 09 09 09 09 09 09 09 09 09 09 20 66 )............. f
9cc0: 69 6e 61 6c 2d 6c 6f 67 29 29 29 0a 09 09 09 09 inal-log))).....
9cd0: 09 09 09 09 09 20 20 20 20 20 20 3b 3b 20 66 6f ..... ;; fo
9ce0: 72 20 6e 6f 77 20 74 68 72 6f 77 20 61 77 61 79 r now throw away
9cf0: 20 6e 65 77 70 61 74 68 20 61 6e 64 20 75 73 65 newpath and use
9d00: 20 74 68 65 20 6c 6f 67 2d 66 70 61 74 68 20 63 the log-fpath c
9d10: 6f 6e 63 27 64 20 77 69 74 68 20 70 61 74 68 6d onc'd with pathm
9d20: 6f 64 0a 09 09 09 09 09 09 09 09 09 20 20 20 20 od..........
9d30: 20 20 28 73 65 74 21 20 6e 65 77 70 61 74 68 20 (set! newpath
9d40: 28 63 6f 6e 63 20 70 61 74 68 6d 6f 64 20 6c 6f (conc pathmod lo
9d50: 67 2d 66 70 61 74 68 29 29 0a 09 09 09 09 09 09 g-fpath)).......
9d60: 09 09 09 20 20 20 20 20 20 28 69 66 20 77 69 6e ... (if win
9d70: 64 6f 77 73 20 28 73 74 72 69 6e 67 2d 74 72 61 dows (string-tra
9d80: 6e 73 6c 61 74 65 20 6e 65 77 70 61 74 68 20 22 nslate newpath "
9d90: 2f 22 20 22 5c 5c 22 29 20 6e 65 77 70 61 74 68 /" "\\") newpath
9da0: 29 29 0a 09 09 09 09 09 09 09 09 09 20 20 20 20 ))..........
9db0: 28 69 66 20 28 3e 20 2a 76 65 72 62 6f 73 69 74 (if (> *verbosit
9dc0: 79 2a 20 31 29 0a 09 09 09 09 09 09 09 09 09 09 y* 1)...........
9dd0: 28 63 6f 6e 63 20 66 69 6e 61 6c 2d 6c 6f 67 20 (conc final-log
9de0: 22 20 6e 6f 74 2d 66 6f 75 6e 64 22 29 0a 09 09 " not-found")...
9df0: 09 09 09 09 09 09 09 09 22 22 29 29 29 0a 09 09 ........"")))...
9e00: 09 09 09 20 20 28 76 65 63 74 6f 72 2d 3e 6c 69 ... (vector->li
9e10: 73 74 20 76 62 29 29 0a 09 09 09 09 09 62 29 29 st vb))......b))
9e20: 29 29 29 0a 09 20 20 20 64 62 0a 09 20 20 20 6d ))).. db.. m
9e30: 61 69 6e 71 72 79 0a 09 20 20 20 72 75 6e 73 70 ainqry.. runsp
9e40: 61 74 74 20 28 6d 61 70 20 63 61 64 72 20 6b 65 att (map cadr ke
9e50: 79 70 61 74 74 2d 61 6c 69 73 74 29 29 0a 20 20 ypatt-alist)).
9e60: 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 32 (debug:print 2
9e70: 20 22 46 6f 75 6e 64 20 22 20 28 6c 65 6e 67 74 "Found " (lengt
9e80: 68 20 74 65 73 74 2d 69 64 73 29 20 22 20 72 65 h test-ids) " re
9e90: 63 6f 72 64 73 22 29 0a 20 20 20 20 28 73 65 74 cords"). (set
9ea0: 21 20 72 65 73 75 6c 74 73 20 28 6c 69 73 74 20 ! results (list
9eb0: 28 63 6f 6e 73 20 22 52 75 6e 73 22 20 72 65 73 (cons "Runs" res
9ec0: 75 6c 74 73 29 29 29 0a 20 20 20 20 3b 3b 20 6e ults))). ;; n
9ed0: 6f 77 2c 20 66 6f 72 20 65 61 63 68 20 74 65 73 ow, for each tes
9ee0: 74 2c 20 63 6f 6c 6c 65 63 74 20 74 68 65 20 74 t, collect the t
9ef0: 65 73 74 5f 64 61 74 61 20 69 6e 66 6f 20 61 6e est_data info an
9f00: 64 20 61 64 64 20 61 20 6e 65 77 20 73 68 65 65 d add a new shee
9f10: 74 0a 20 20 20 20 28 66 6f 72 2d 65 61 63 68 0a t. (for-each.
9f20: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 74 65 (lambda (te
9f30: 73 74 2d 69 64 29 0a 20 20 20 20 20 20 20 28 6c st-id). (l
9f40: 65 74 20 28 28 74 65 73 74 2d 64 61 74 61 20 28 et ((test-data (
9f50: 6c 69 73 74 20 74 65 73 74 64 61 74 61 2d 68 65 list testdata-he
9f60: 61 64 65 72 29 29 0a 09 20 20 20 20 20 28 63 75 ader)).. (cu
9f70: 72 72 2d 74 65 73 74 2d 6e 61 6d 65 20 23 66 29 rr-test-name #f)
9f80: 29 0a 09 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 ).. (sqlite3:for
9f90: 2d 65 61 63 68 2d 72 6f 77 0a 09 20 20 28 6c 61 -each-row.. (la
9fa0: 6d 62 64 61 20 28 72 75 6e 2d 69 64 20 74 65 73 mbda (run-id tes
9fb0: 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 tname item-path
9fc0: 63 61 74 65 67 6f 72 79 20 76 61 72 69 61 62 6c category variabl
9fd0: 65 20 76 61 6c 75 65 20 65 78 70 65 63 74 65 64 e value expected
9fe0: 20 74 6f 6c 20 75 6e 69 74 73 20 73 74 61 74 75 tol units statu
9ff0: 73 20 63 6f 6d 6d 65 6e 74 29 0a 09 20 20 20 20 s comment)..
a000: 28 73 65 74 21 20 63 75 72 72 2d 74 65 73 74 2d (set! curr-test-
a010: 6e 61 6d 65 20 74 65 73 74 6e 61 6d 65 29 0a 09 name testname)..
a020: 20 20 20 20 28 73 65 74 21 20 74 65 73 74 2d 64 (set! test-d
a030: 61 74 61 20 28 61 70 70 65 6e 64 20 74 65 73 74 ata (append test
a040: 2d 64 61 74 61 20 28 6c 69 73 74 20 28 6c 69 73 -data (list (lis
a050: 74 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d t run-id testnam
a060: 65 20 69 74 65 6d 2d 70 61 74 68 20 63 61 74 65 e item-path cate
a070: 67 6f 72 79 20 76 61 72 69 61 62 6c 65 20 76 61 gory variable va
a080: 6c 75 65 20 65 78 70 65 63 74 65 64 20 74 6f 6c lue expected tol
a090: 20 75 6e 69 74 73 20 73 74 61 74 75 73 20 63 6f units status co
a0a0: 6d 6d 65 6e 74 29 29 29 29 29 0a 09 20 20 64 62 mment))))).. db
a0b0: 20 0a 09 20 20 3b 3b 20 22 53 45 4c 45 43 54 20 .. ;; "SELECT
a0c0: 72 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d 65 2c run_id,testname,
a0d0: 69 74 65 6d 5f 70 61 74 68 2c 63 61 74 65 67 6f item_path,catego
a0e0: 72 79 2c 76 61 72 69 61 62 6c 65 2c 74 64 2e 76 ry,variable,td.v
a0f0: 61 6c 75 65 20 41 53 20 76 61 6c 75 65 2c 65 78 alue AS value,ex
a100: 70 65 63 74 65 64 2c 74 6f 6c 2c 75 6e 69 74 73 pected,tol,units
a110: 2c 74 64 2e 73 74 61 74 75 73 20 41 53 20 73 74 ,td.status AS st
a120: 61 74 75 73 2c 74 64 2e 63 6f 6d 6d 65 6e 74 20 atus,td.comment
a130: 41 53 20 63 6f 6d 6d 65 6e 74 20 46 52 4f 4d 20 AS comment FROM
a140: 74 65 73 74 5f 64 61 74 61 20 41 53 20 74 64 20 test_data AS td
a150: 49 4e 4e 45 52 20 4a 4f 49 4e 20 74 65 73 74 73 INNER JOIN tests
a160: 20 4f 4e 20 74 65 73 74 73 2e 69 64 3d 74 64 2e ON tests.id=td.
a170: 74 65 73 74 5f 69 64 20 57 48 45 52 45 20 74 65 test_id WHERE te
a180: 73 74 5f 69 64 3d 3f 3b 22 0a 09 20 20 22 53 45 st_id=?;".. "SE
a190: 4c 45 43 54 20 72 75 6e 5f 69 64 2c 74 65 73 74 LECT run_id,test
a1a0: 6e 61 6d 65 2c 69 74 65 6d 5f 70 61 74 68 2c 63 name,item_path,c
a1b0: 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62 6c 65 ategory,variable
a1c0: 2c 74 64 2e 76 61 6c 75 65 20 41 53 20 76 61 6c ,td.value AS val
a1d0: 75 65 2c 74 64 2e 65 78 70 65 63 74 65 64 2c 74 ue,td.expected,t
a1e0: 64 2e 74 6f 6c 2c 74 64 2e 75 6e 69 74 73 2c 74 d.tol,td.units,t
a1f0: 64 2e 73 74 61 74 75 73 20 41 53 20 73 74 61 74 d.status AS stat
a200: 75 73 2c 74 64 2e 63 6f 6d 6d 65 6e 74 20 41 53 us,td.comment AS
a210: 20 63 6f 6d 6d 65 6e 74 20 46 52 4f 4d 20 74 65 comment FROM te
a220: 73 74 5f 64 61 74 61 20 41 53 20 74 64 20 49 4e st_data AS td IN
a230: 4e 45 52 20 4a 4f 49 4e 20 74 65 73 74 73 20 4f NER JOIN tests O
a240: 4e 20 74 65 73 74 73 2e 69 64 3d 74 64 2e 74 65 N tests.id=td.te
a250: 73 74 5f 69 64 20 57 48 45 52 45 20 74 65 73 74 st_id WHERE test
a260: 6e 61 6d 65 3d 3f 3b 22 0a 09 20 20 74 65 73 74 name=?;".. test
a270: 2d 69 64 29 0a 09 20 28 69 66 20 63 75 72 72 2d -id).. (if curr-
a280: 74 65 73 74 2d 6e 61 6d 65 0a 09 20 20 20 20 20 test-name..
a290: 28 73 65 74 21 20 72 65 73 75 6c 74 73 20 28 61 (set! results (a
a2a0: 70 70 65 6e 64 20 72 65 73 75 6c 74 73 20 28 6c ppend results (l
a2b0: 69 73 74 20 28 63 6f 6e 73 20 63 75 72 72 2d 74 ist (cons curr-t
a2c0: 65 73 74 2d 6e 61 6d 65 20 74 65 73 74 2d 64 61 est-name test-da
a2d0: 74 61 29 29 29 29 29 0a 09 20 29 29 0a 20 20 20 ta))))).. )).
a2e0: 20 20 28 73 6f 72 74 20 28 64 65 6c 65 74 65 2d (sort (delete-
a2f0: 64 75 70 6c 69 63 61 74 65 73 20 74 65 73 74 2d duplicates test-
a300: 69 64 73 29 20 73 74 72 69 6e 67 3c 3d 29 29 0a ids) string<=)).
a310: 20 20 20 20 28 73 79 73 74 65 6d 20 28 63 6f 6e (system (con
a320: 63 20 22 6d 6b 64 69 72 20 2d 70 20 22 20 74 65 c "mkdir -p " te
a330: 6d 70 64 69 72 29 29 0a 20 20 20 20 3b 3b 20 28 mpdir)). ;; (
a340: 70 70 20 72 65 73 75 6c 74 73 29 0a 20 20 20 20 pp results).
a350: 28 6f 64 73 3a 6c 69 73 74 2d 3e 6f 64 73 20 0a (ods:list->ods .
a360: 20 20 20 20 20 74 65 6d 70 64 69 72 0a 20 20 20 tempdir.
a370: 20 20 28 69 66 20 28 73 74 72 69 6e 67 2d 6d 61 (if (string-ma
a380: 74 63 68 20 28 72 65 67 65 78 70 20 22 5e 5b 2f tch (regexp "^[/
a390: 7e 5d 2b 2e 2a 22 29 20 6f 75 74 70 75 74 66 69 ~]+.*") outputfi
a3a0: 6c 65 29 20 3b 3b 20 66 75 6c 6c 20 70 61 74 68 le) ;; full path
a3b0: 3f 0a 09 20 6f 75 74 70 75 74 66 69 6c 65 0a 09 ?.. outputfile..
a3c0: 20 28 62 65 67 69 6e 0a 09 20 20 20 28 64 65 62 (begin.. (deb
a3d0: 75 67 3a 70 72 69 6e 74 20 30 20 22 57 41 52 4e ug:print 0 "WARN
a3e0: 49 4e 47 3a 20 70 61 74 68 20 67 69 76 65 6e 2c ING: path given,
a3f0: 20 22 20 6f 75 74 70 75 74 66 69 6c 65 20 22 20 " outputfile "
a400: 69 73 20 72 65 6c 61 74 69 76 65 2c 20 70 72 65 is relative, pre
a410: 66 69 78 69 6e 67 20 77 69 74 68 20 63 75 72 72 fixing with curr
a420: 65 6e 74 20 64 69 72 65 63 74 6f 72 79 22 29 0a ent directory").
a430: 09 20 20 20 28 63 6f 6e 63 20 28 63 75 72 72 65 . (conc (curre
a440: 6e 74 2d 64 69 72 65 63 74 6f 72 79 29 20 22 2f nt-directory) "/
a450: 22 20 6f 75 74 70 75 74 66 69 6c 65 29 29 29 0a " outputfile))).
a460: 20 20 20 20 20 72 65 73 75 6c 74 73 29 0a 20 20 results).
a470: 20 20 3b 3b 20 62 72 75 74 61 6c 20 63 6c 65 61 ;; brutal clea
a480: 6e 20 75 70 0a 20 20 20 20 28 73 79 73 74 65 6d n up. (system
a490: 20 22 72 6d 20 2d 72 66 20 74 65 6d 70 64 69 72 "rm -rf tempdir
a4a0: 22 29 29 29 0a 0a 3b 3b 20 28 64 62 3a 65 78 74 ")))..;; (db:ext
a4b0: 72 61 63 74 2d 6f 64 73 2d 66 69 6c 65 20 64 62 ract-ods-file db
a4c0: 20 22 6f 75 74 70 75 74 66 69 6c 65 2e 6f 64 73 "outputfile.ods
a4d0: 22 20 27 28 28 22 73 79 73 6e 61 6d 65 22 20 22 " '(("sysname" "
a4e0: 25 22 29 28 22 66 73 6e 61 6d 65 22 20 22 25 22 %")("fsname" "%"
a4f0: 29 28 22 64 61 74 61 70 61 74 68 22 20 22 25 22 )("datapath" "%"
a500: 29 29 20 22 25 22 29 0a )) "%").