0000: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ;;==============
0010: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0030: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0040: 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 43 6f 70 79 ========.;; Copy
0050: 72 69 67 68 74 20 32 30 30 36 2d 32 30 31 31 2c right 2006-2011,
0060: 20 4d 61 74 74 68 65 77 20 57 65 6c 6c 61 6e 64 Matthew Welland
0070: 2e 0a 3b 3b 20 0a 3b 3b 20 20 54 68 69 73 20 70 ..;; .;; This p
0080: 72 6f 67 72 61 6d 20 69 73 20 6d 61 64 65 20 61 rogram is made a
0090: 76 61 69 6c 61 62 6c 65 20 75 6e 64 65 72 20 74 vailable under t
00a0: 68 65 20 47 4e 55 20 47 50 4c 20 76 65 72 73 69 he GNU GPL versi
00b0: 6f 6e 20 32 2e 30 20 6f 72 0a 3b 3b 20 20 67 72 on 2.0 or.;; gr
00c0: 65 61 74 65 72 2e 20 53 65 65 20 74 68 65 20 61 eater. See the a
00d0: 63 63 6f 6d 70 61 6e 79 69 6e 67 20 66 69 6c 65 ccompanying file
00e0: 20 43 4f 50 59 49 4e 47 20 66 6f 72 20 64 65 74 COPYING for det
00f0: 61 69 6c 73 2e 0a 3b 3b 20 0a 3b 3b 20 20 54 68 ails..;; .;; Th
0100: 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 is program is di
0110: 73 74 72 69 62 75 74 65 64 20 57 49 54 48 4f 55 stributed WITHOU
0120: 54 20 41 4e 59 20 57 41 52 52 41 4e 54 59 3b 20 T ANY WARRANTY;
0130: 77 69 74 68 6f 75 74 20 65 76 65 6e 20 74 68 65 without even the
0140: 0a 3b 3b 20 20 69 6d 70 6c 69 65 64 20 77 61 72 .;; implied war
0150: 72 61 6e 74 79 20 6f 66 20 4d 45 52 43 48 41 4e ranty of MERCHAN
0160: 54 41 42 49 4c 49 54 59 20 6f 72 20 46 49 54 4e TABILITY or FITN
0170: 45 53 53 20 46 4f 52 20 41 20 50 41 52 54 49 43 ESS FOR A PARTIC
0180: 55 4c 41 52 0a 3b 3b 20 20 50 55 52 50 4f 53 45 ULAR.;; PURPOSE
0190: 2e 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ..;;============
01a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
01b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
01c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
01d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 3d 3d ==========..;;==
01e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
01f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0200: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0210: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0220: 3d 3d 3d 3d 0a 3b 3b 20 44 61 74 61 62 61 73 65 ====.;; Database
0230: 20 61 63 63 65 73 73 0a 3b 3b 3d 3d 3d 3d 3d 3d access.;;======
0240: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0250: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0260: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0270: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0280: 0a 0a 28 75 73 65 20 73 71 6c 69 74 65 33 20 73 ..(use sqlite3 s
0290: 72 66 69 2d 31 20 70 6f 73 69 78 20 72 65 67 65 rfi-1 posix rege
02a0: 78 20 72 65 67 65 78 2d 63 61 73 65 20 73 72 66 x regex-case srf
02b0: 69 2d 36 39 20 63 73 76 2d 78 6d 6c 29 0a 28 69 i-69 csv-xml).(i
02c0: 6d 70 6f 72 74 20 28 70 72 65 66 69 78 20 73 71 mport (prefix sq
02d0: 6c 69 74 65 33 20 73 71 6c 69 74 65 33 3a 29 29 lite3 sqlite3:))
02e0: 0a 0a 28 64 65 63 6c 61 72 65 20 28 75 6e 69 74 ..(declare (unit
02f0: 20 64 62 29 29 0a 28 64 65 63 6c 61 72 65 20 28 db)).(declare (
0300: 75 73 65 73 20 63 6f 6d 6d 6f 6e 29 29 0a 28 64 uses common)).(d
0310: 65 63 6c 61 72 65 20 28 75 73 65 73 20 6b 65 79 eclare (uses key
0320: 73 29 29 0a 28 64 65 63 6c 61 72 65 20 28 75 73 s)).(declare (us
0330: 65 73 20 6f 64 73 29 29 0a 0a 28 69 6e 63 6c 75 es ods))..(inclu
0340: 64 65 20 22 63 6f 6d 6d 6f 6e 5f 72 65 63 6f 72 de "common_recor
0350: 64 73 2e 73 63 6d 22 29 0a 28 69 6e 63 6c 75 64 ds.scm").(includ
0360: 65 20 22 64 62 5f 72 65 63 6f 72 64 73 2e 73 63 e "db_records.sc
0370: 6d 22 29 0a 28 69 6e 63 6c 75 64 65 20 22 6b 65 m").(include "ke
0380: 79 5f 72 65 63 6f 72 64 73 2e 73 63 6d 22 29 0a y_records.scm").
0390: 0a 28 64 65 66 69 6e 65 20 28 6f 70 65 6e 2d 64 .(define (open-d
03a0: 62 29 20 3b 3b 20 20 28 63 6f 6e 63 20 2a 74 6f b) ;; (conc *to
03b0: 70 70 61 74 68 2a 20 22 2f 6d 65 67 61 74 65 73 ppath* "/megates
03c0: 74 2e 64 62 22 29 20 28 63 61 72 20 2a 63 6f 6e t.db") (car *con
03d0: 66 69 67 69 6e 66 6f 2a 29 29 29 0a 20 20 28 6c figinfo*))). (l
03e0: 65 74 2a 20 28 28 64 62 70 61 74 68 20 20 20 20 et* ((dbpath
03f0: 28 63 6f 6e 63 20 2a 74 6f 70 70 61 74 68 2a 20 (conc *toppath*
0400: 22 2f 6d 65 67 61 74 65 73 74 2e 64 62 22 29 29 "/megatest.db"))
0410: 20 3b 3b 20 66 6e 61 6d 65 29 0a 09 20 28 63 6f ;; fname).. (co
0420: 6e 66 69 67 64 61 74 20 28 63 61 72 20 2a 63 6f nfigdat (car *co
0430: 6e 66 69 67 69 6e 66 6f 2a 29 29 0a 09 20 28 64 nfiginfo*)).. (d
0440: 62 65 78 69 73 74 73 20 20 28 66 69 6c 65 2d 65 bexists (file-e
0450: 78 69 73 74 73 3f 20 64 62 70 61 74 68 29 29 0a xists? dbpath)).
0460: 09 20 28 64 62 20 20 20 20 20 20 20 20 28 73 71 . (db (sq
0470: 6c 69 74 65 33 3a 6f 70 65 6e 2d 64 61 74 61 62 lite3:open-datab
0480: 61 73 65 20 64 62 70 61 74 68 29 29 20 3b 3b 20 ase dbpath)) ;;
0490: 28 6e 65 76 65 72 2d 67 69 76 65 2d 75 70 2d 6f (never-give-up-o
04a0: 70 65 6e 2d 64 62 20 64 62 70 61 74 68 29 29 0a pen-db dbpath)).
04b0: 09 20 28 68 61 6e 64 6c 65 72 20 20 20 28 6d 61 . (handler (ma
04c0: 6b 65 2d 62 75 73 79 2d 74 69 6d 65 6f 75 74 20 ke-busy-timeout
04d0: 33 36 30 30 30 29 29 29 0a 20 20 20 20 28 73 71 36000))). (sq
04e0: 6c 69 74 65 33 3a 73 65 74 2d 62 75 73 79 2d 68 lite3:set-busy-h
04f0: 61 6e 64 6c 65 72 21 20 64 62 20 68 61 6e 64 6c andler! db handl
0500: 65 72 29 0a 20 20 20 20 28 69 66 20 28 6e 6f 74 er). (if (not
0510: 20 64 62 65 78 69 73 74 73 29 0a 09 28 6c 65 74 dbexists)..(let
0520: 2a 20 28 28 6b 65 79 73 20 20 20 20 20 28 63 6f * ((keys (co
0530: 6e 66 69 67 2d 67 65 74 2d 66 69 65 6c 64 73 20 nfig-get-fields
0540: 63 6f 6e 66 69 67 64 61 74 29 29 0a 09 20 20 20 configdat))..
0550: 20 20 20 20 28 68 61 76 65 6b 65 79 73 20 28 3e (havekeys (>
0560: 20 28 6c 65 6e 67 74 68 20 6b 65 79 73 29 20 30 (length keys) 0
0570: 29 29 0a 09 20 20 20 20 20 20 20 28 6b 65 79 73 )).. (keys
0580: 74 72 20 20 20 28 6b 65 79 73 2d 3e 6b 65 79 73 tr (keys->keys
0590: 74 72 20 6b 65 79 73 29 29 0a 09 20 20 20 20 20 tr keys))..
05a0: 20 20 28 66 69 65 6c 64 73 74 72 20 28 6b 65 79 (fieldstr (key
05b0: 73 2d 3e 6b 65 79 2f 66 69 65 6c 64 20 6b 65 79 s->key/field key
05c0: 73 29 29 29 0a 09 20 20 28 66 6f 72 2d 65 61 63 s))).. (for-eac
05d0: 68 20 28 6c 61 6d 62 64 61 20 28 6b 65 79 29 0a h (lambda (key).
05e0: 09 09 20 20 20 20 20 20 28 6c 65 74 20 28 28 6b .. (let ((k
05f0: 65 79 6e 20 28 76 65 63 74 6f 72 2d 72 65 66 20 eyn (vector-ref
0600: 6b 65 79 20 30 29 29 29 0a 09 09 09 28 69 66 20 key 0)))....(if
0610: 28 6d 65 6d 62 65 72 20 28 73 74 72 69 6e 67 2d (member (string-
0620: 64 6f 77 6e 63 61 73 65 20 6b 65 79 6e 29 0a 09 downcase keyn)..
0630: 09 09 09 20 20 20 20 20 28 6c 69 73 74 20 22 72 ... (list "r
0640: 75 6e 6e 61 6d 65 22 20 22 73 74 61 74 65 22 20 unname" "state"
0650: 22 73 74 61 74 75 73 22 20 22 6f 77 6e 65 72 22 "status" "owner"
0660: 20 22 65 76 65 6e 74 5f 74 69 6d 65 22 20 22 63 "event_time" "c
0670: 6f 6d 6d 65 6e 74 22 20 22 66 61 69 6c 5f 63 6f omment" "fail_co
0680: 75 6e 74 22 0a 09 09 09 09 09 20 20 20 22 70 61 unt"...... "pa
0690: 73 73 5f 63 6f 75 6e 74 22 29 29 0a 09 09 09 20 ss_count"))....
06a0: 20 20 20 28 62 65 67 69 6e 0a 09 09 09 20 20 20 (begin....
06b0: 20 20 20 28 70 72 69 6e 74 20 22 45 52 52 4f 52 (print "ERROR
06c0: 3a 20 79 6f 75 72 20 6b 65 79 20 63 61 6e 6e 6f : your key canno
06d0: 74 20 62 65 20 6e 61 6d 65 64 20 22 20 6b 65 79 t be named " key
06e0: 6e 20 22 20 61 73 20 74 68 69 73 20 63 6f 6e 66 n " as this conf
06f0: 6c 69 63 74 73 20 77 69 74 68 20 74 68 65 20 73 licts with the s
0700: 61 6d 65 20 6e 61 6d 65 64 20 66 69 65 6c 64 20 ame named field
0710: 69 6e 20 74 68 65 20 72 75 6e 73 20 74 61 62 6c in the runs tabl
0720: 65 22 29 0a 09 09 09 20 20 20 20 20 20 28 73 79 e").... (sy
0730: 73 74 65 6d 20 28 63 6f 6e 63 20 22 72 6d 20 2d stem (conc "rm -
0740: 66 20 22 20 64 62 70 61 74 68 29 29 0a 09 09 09 f " dbpath))....
0750: 20 20 20 20 20 20 28 65 78 69 74 20 31 29 29 29 (exit 1)))
0760: 29 29 0a 09 09 20 20 20 20 6b 65 79 73 29 0a 09 ))... keys)..
0770: 20 20 3b 3b 20 28 73 71 6c 69 74 65 33 3a 65 78 ;; (sqlite3:ex
0780: 65 63 75 74 65 20 64 62 20 22 50 52 41 47 4d 41 ecute db "PRAGMA
0790: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4f synchronous = O
07a0: 46 46 3b 22 29 0a 09 20 20 28 73 71 6c 69 74 65 FF;").. (sqlite
07b0: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 43 52 3:execute db "CR
07c0: 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f EATE TABLE IF NO
07d0: 54 20 45 58 49 53 54 53 20 6b 65 79 73 20 28 69 T EXISTS keys (i
07e0: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR
07f0: 59 20 4b 45 59 2c 20 66 69 65 6c 64 6e 61 6d 65 Y KEY, fieldname
0800: 20 54 45 58 54 2c 20 66 69 65 6c 64 74 79 70 65 TEXT, fieldtype
0810: 20 54 45 58 54 2c 20 43 4f 4e 53 54 52 41 49 4e TEXT, CONSTRAIN
0820: 54 20 6b 65 79 63 6f 6e 73 74 72 61 69 6e 74 20 T keyconstraint
0830: 55 4e 49 51 55 45 20 28 66 69 65 6c 64 6e 61 6d UNIQUE (fieldnam
0840: 65 29 29 3b 22 29 0a 09 20 20 28 66 6f 72 2d 65 e));").. (for-e
0850: 61 63 68 20 28 6c 61 6d 62 64 61 20 28 6b 65 79 ach (lambda (key
0860: 29 0a 09 09 20 20 20 20 20 20 28 73 71 6c 69 74 )... (sqlit
0870: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 49 e3:execute db "I
0880: 4e 53 45 52 54 20 49 4e 54 4f 20 6b 65 79 73 20 NSERT INTO keys
0890: 28 66 69 65 6c 64 6e 61 6d 65 2c 66 69 65 6c 64 (fieldname,field
08a0: 74 79 70 65 29 20 56 41 4c 55 45 53 20 28 3f 2c type) VALUES (?,
08b0: 3f 29 3b 22 20 28 6b 65 79 3a 67 65 74 2d 66 69 ?);" (key:get-fi
08c0: 65 6c 64 6e 61 6d 65 20 6b 65 79 29 28 6b 65 79 eldname key)(key
08d0: 3a 67 65 74 2d 66 69 65 6c 64 74 79 70 65 20 6b :get-fieldtype k
08e0: 65 79 29 29 29 0a 09 09 20 20 20 20 6b 65 79 73 ey)))... keys
08f0: 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65 78 ).. (sqlite3:ex
0900: 65 63 75 74 65 20 64 62 20 28 63 6f 6e 63 20 0a ecute db (conc .
0910: 09 09 09 20 20 20 20 22 43 52 45 41 54 45 20 54 ... "CREATE T
0920: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 ABLE IF NOT EXIS
0930: 54 53 20 72 75 6e 73 20 28 69 64 20 49 4e 54 45 TS runs (id INTE
0940: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c GER PRIMARY KEY,
0950: 20 22 20 0a 09 09 09 20 20 20 20 66 69 65 6c 64 " .... field
0960: 73 74 72 20 28 69 66 20 68 61 76 65 6b 65 79 73 str (if havekeys
0970: 20 22 2c 22 20 22 22 29 0a 09 09 09 20 20 20 20 "," "")....
0980: 22 72 75 6e 6e 61 6d 65 20 54 45 58 54 2c 22 0a "runname TEXT,".
0990: 09 09 09 20 20 20 20 22 73 74 61 74 65 20 54 45 ... "state TE
09a0: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 22 0a XT DEFAULT '',".
09b0: 09 09 09 20 20 20 20 22 73 74 61 74 75 73 20 54 ... "status T
09c0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 22 EXT DEFAULT '',"
09d0: 0a 09 09 09 20 20 20 20 22 6f 77 6e 65 72 20 54 .... "owner T
09e0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 22 EXT DEFAULT '',"
09f0: 0a 09 09 09 20 20 20 20 22 65 76 65 6e 74 5f 74 .... "event_t
0a00: 69 6d 65 20 54 49 4d 45 53 54 41 4d 50 2c 22 0a ime TIMESTAMP,".
0a10: 09 09 09 20 20 20 20 22 63 6f 6d 6d 65 6e 74 20 ... "comment
0a20: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c TEXT DEFAULT '',
0a30: 22 0a 09 09 09 20 20 20 20 22 66 61 69 6c 5f 63 ".... "fail_c
0a40: 6f 75 6e 74 20 49 4e 54 45 47 45 52 20 44 45 46 ount INTEGER DEF
0a50: 41 55 4c 54 20 30 2c 22 0a 09 09 09 20 20 20 20 AULT 0,"....
0a60: 22 70 61 73 73 5f 63 6f 75 6e 74 20 49 4e 54 45 "pass_count INTE
0a70: 47 45 52 20 44 45 46 41 55 4c 54 20 30 2c 22 0a GER DEFAULT 0,".
0a80: 09 09 09 20 20 20 20 22 43 4f 4e 53 54 52 41 49 ... "CONSTRAI
0a90: 4e 54 20 72 75 6e 73 63 6f 6e 73 74 72 61 69 6e NT runsconstrain
0aa0: 74 20 55 4e 49 51 55 45 20 28 72 75 6e 6e 61 6d t UNIQUE (runnam
0ab0: 65 22 20 28 69 66 20 68 61 76 65 6b 65 79 73 20 e" (if havekeys
0ac0: 22 2c 22 20 22 22 29 20 6b 65 79 73 74 72 20 22 "," "") keystr "
0ad0: 29 29 3b 22 29 29 0a 09 20 20 28 73 71 6c 69 74 ));")).. (sqlit
0ae0: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 28 63 e3:execute db (c
0af0: 6f 6e 63 20 22 43 52 45 41 54 45 20 49 4e 44 45 onc "CREATE INDE
0b00: 58 20 72 75 6e 73 5f 69 6e 64 65 78 20 4f 4e 20 X runs_index ON
0b10: 72 75 6e 73 20 28 72 75 6e 6e 61 6d 65 22 20 28 runs (runname" (
0b20: 69 66 20 68 61 76 65 6b 65 79 73 20 22 2c 22 20 if havekeys ","
0b30: 22 22 29 20 6b 65 79 73 74 72 20 22 29 3b 22 29 "") keystr ");")
0b40: 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65 78 ).. (sqlite3:ex
0b50: 65 63 75 74 65 20 64 62 20 0a 20 20 20 20 20 20 ecute db .
0b60: 20 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 "CREA
0b70: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 TE TABLE IF NOT
0b80: 45 58 49 53 54 53 20 74 65 73 74 73 20 0a 20 20 EXISTS tests .
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0ba0: 20 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 (id INTEGER PR
0bb0: 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 IMARY KEY,.
0bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0bd0: 72 75 6e 5f 69 64 20 20 20 20 20 49 4e 54 45 47 run_id INTEG
0be0: 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 ER,.
0bf0: 20 20 20 20 20 20 20 20 20 74 65 73 74 6e 61 6d testnam
0c00: 65 20 20 20 54 45 58 54 2c 0a 20 20 20 20 20 20 e TEXT,.
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68 h
0c20: 6f 73 74 20 20 20 20 20 20 20 54 45 58 54 20 44 ost TEXT D
0c30: 45 46 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20 20 EFAULT 'n/a',.
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0c50: 20 20 20 63 70 75 6c 6f 61 64 20 20 20 20 52 45 cpuload RE
0c60: 41 4c 20 44 45 46 41 55 4c 54 20 2d 31 2c 0a 20 AL DEFAULT -1,.
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0c80: 20 20 20 20 64 69 73 6b 66 72 65 65 20 20 20 49 diskfree I
0c90: 4e 54 45 47 45 52 20 44 45 46 41 55 4c 54 20 2d NTEGER DEFAULT -
0ca0: 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 1,.
0cb0: 20 20 20 20 20 20 20 20 75 6e 61 6d 65 20 20 20 uname
0cc0: 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 TEXT DEFAULT
0cd0: 27 6e 2f 61 27 2c 20 0a 20 20 20 20 20 20 20 20 'n/a', .
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 75 6e run
0cf0: 64 69 72 20 20 20 20 20 54 45 58 54 20 44 45 46 dir TEXT DEF
0d00: 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20 20 20 20 AULT 'n/a',.
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0d20: 20 73 68 6f 72 74 64 69 72 20 20 20 54 45 58 54 shortdir TEXT
0d30: 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 DEFAULT '',.
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0d50: 20 20 69 74 65 6d 5f 70 61 74 68 20 20 54 45 58 item_path TEX
0d60: 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 T DEFAULT '',.
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0d80: 20 20 20 73 74 61 74 65 20 20 20 20 20 20 54 45 state TE
0d90: 58 54 20 44 45 46 41 55 4c 54 20 27 4e 4f 54 5f XT DEFAULT 'NOT_
0da0: 53 54 41 52 54 45 44 27 2c 0a 20 20 20 20 20 20 STARTED',.
0db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 s
0dc0: 74 61 74 75 73 20 20 20 20 20 54 45 58 54 20 44 tatus TEXT D
0dd0: 45 46 41 55 4c 54 20 27 46 41 49 4c 27 2c 0a 20 EFAULT 'FAIL',.
0de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0df0: 20 20 20 20 61 74 74 65 6d 70 74 6e 75 6d 20 49 attemptnum I
0e00: 4e 54 45 47 45 52 20 44 45 46 41 55 4c 54 20 30 NTEGER DEFAULT 0
0e10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
0e20: 20 20 20 20 20 20 20 66 69 6e 61 6c 5f 6c 6f 67 final_log
0e30: 66 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 f TEXT DEFAULT '
0e40: 6c 6f 67 73 2f 66 69 6e 61 6c 2e 6c 6f 67 27 2c logs/final.log',
0e50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
0e60: 20 20 20 20 20 20 6c 6f 67 64 61 74 20 20 20 20 logdat
0e70: 20 42 4c 4f 42 2c 20 0a 20 20 20 20 20 20 20 20 BLOB, .
0e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 75 6e run
0e90: 5f 64 75 72 61 74 69 6f 6e 20 49 4e 54 45 47 45 _duration INTEGE
0ea0: 52 20 44 45 46 41 55 4c 54 20 30 2c 0a 20 20 20 R DEFAULT 0,.
0eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0ec0: 20 20 63 6f 6d 6d 65 6e 74 20 20 20 20 54 45 58 comment TEX
0ed0: 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 T DEFAULT '',.
0ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0ef0: 20 20 20 65 76 65 6e 74 5f 74 69 6d 65 20 54 49 event_time TI
0f00: 4d 45 53 54 41 4d 50 2c 0a 20 20 20 20 20 20 20 MESTAMP,.
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 61 fa
0f20: 69 6c 5f 63 6f 75 6e 74 20 49 4e 54 45 47 45 52 il_count INTEGER
0f30: 20 44 45 46 41 55 4c 54 20 30 2c 0a 20 20 20 20 DEFAULT 0,.
0f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0f50: 20 70 61 73 73 5f 63 6f 75 6e 74 20 49 4e 54 45 pass_count INTE
0f60: 47 45 52 20 44 45 46 41 55 4c 54 20 30 2c 0a 20 GER DEFAULT 0,.
0f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0f80: 20 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 CONSTRAINT t
0f90: 65 73 74 73 63 6f 6e 73 74 72 61 69 6e 74 20 55 estsconstraint U
0fa0: 4e 49 51 55 45 20 28 72 75 6e 5f 69 64 2c 20 74 NIQUE (run_id, t
0fb0: 65 73 74 6e 61 6d 65 2c 20 69 74 65 6d 5f 70 61 estname, item_pa
0fc0: 74 68 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b th). );
0fd0: 22 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65 ").. (sqlite3:e
0fe0: 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 54 xecute db "CREAT
0ff0: 45 20 49 4e 44 45 58 20 74 65 73 74 73 5f 69 6e E INDEX tests_in
1000: 64 65 78 20 4f 4e 20 74 65 73 74 73 20 28 72 75 dex ON tests (ru
1010: 6e 5f 69 64 2c 20 74 65 73 74 6e 61 6d 65 29 3b n_id, testname);
1020: 22 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65 ").. (sqlite3:e
1030: 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 54 xecute db "CREAT
1040: 45 20 56 49 45 57 20 72 75 6e 73 5f 74 65 73 74 E VIEW runs_test
1050: 73 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 s AS SELECT * FR
1060: 4f 4d 20 72 75 6e 73 20 49 4e 4e 45 52 20 4a 4f OM runs INNER JO
1070: 49 4e 20 74 65 73 74 73 20 4f 4e 20 72 75 6e 73 IN tests ON runs
1080: 2e 69 64 3d 74 65 73 74 73 2e 72 75 6e 5f 69 64 .id=tests.run_id
1090: 3b 22 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a ;").. (sqlite3:
10a0: 65 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 execute db "CREA
10b0: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 TE TABLE IF NOT
10c0: 45 58 49 53 54 53 20 74 65 73 74 5f 73 74 65 70 EXISTS test_step
10d0: 73 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 s .
10e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
10f0: 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 (id INTEGER PRI
1100: 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 20 MARY KEY,.
1110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1120: 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 69 64 test_id
1130: 20 49 4e 54 45 47 45 52 2c 20 0a 20 20 20 20 20 INTEGER, .
1140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1150: 20 20 20 20 20 20 20 20 20 20 73 74 65 70 6e 61 stepna
1160: 6d 65 20 54 45 58 54 2c 20 0a 20 20 20 20 20 20 me TEXT, .
1170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1180: 20 20 20 20 20 20 20 20 20 73 74 61 74 65 20 54 state T
1190: 45 58 54 20 44 45 46 41 55 4c 54 20 27 4e 4f 54 EXT DEFAULT 'NOT
11a0: 5f 53 54 41 52 54 45 44 27 2c 20 0a 20 20 20 20 _STARTED', .
11b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11c0: 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 75 statu
11d0: 73 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 s TEXT DEFAULT '
11e0: 6e 2f 61 27 2c 0a 20 20 20 20 20 20 20 20 20 20 n/a',.
11f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1200: 20 20 20 20 20 65 76 65 6e 74 5f 74 69 6d 65 20 event_time
1210: 54 49 4d 45 53 54 41 4d 50 2c 0a 20 20 20 20 20 TIMESTAMP,.
1220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1230: 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 65 6e commen
1240: 74 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 t TEXT DEFAULT '
1250: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ',.
1260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1270: 20 20 6c 6f 67 66 69 6c 65 20 54 45 58 54 2c 0a logfile TEXT,.
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 C
12a0: 4f 4e 53 54 52 41 49 4e 54 20 74 65 73 74 5f 73 ONSTRAINT test_s
12b0: 74 65 70 73 5f 63 6f 6e 73 74 72 61 69 6e 74 20 teps_constraint
12c0: 55 4e 49 51 55 45 20 28 74 65 73 74 5f 69 64 2c UNIQUE (test_id,
12d0: 73 74 65 70 6e 61 6d 65 2c 73 74 61 74 65 29 29 stepname,state))
12e0: 3b 22 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a ;").. (sqlite3:
12f0: 65 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 execute db "CREA
1300: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 TE TABLE IF NOT
1310: 45 58 49 53 54 53 20 65 78 74 72 61 64 61 74 20 EXISTS extradat
1320: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM
1330: 41 52 59 20 4b 45 59 2c 20 72 75 6e 5f 69 64 20 ARY KEY, run_id
1340: 49 4e 54 45 47 45 52 2c 20 6b 65 79 20 54 45 58 INTEGER, key TEX
1350: 54 2c 20 76 61 6c 20 54 45 58 54 29 3b 22 29 0a T, val TEXT);").
1360: 09 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 . (sqlite3:exec
1370: 75 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54 ute db "CREATE T
1380: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 ABLE IF NOT EXIS
1390: 54 53 20 6d 65 74 61 64 61 74 20 28 69 64 20 49 TS metadat (id I
13a0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b NTEGER PRIMARY K
13b0: 45 59 2c 20 76 61 72 20 54 45 58 54 2c 20 76 61 EY, var TEXT, va
13c0: 6c 20 54 45 58 54 2c 0a 20 20 20 20 20 20 20 20 l TEXT,.
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13e0: 20 20 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52 CONSTR
13f0: 41 49 4e 54 20 6d 65 74 61 64 61 74 5f 63 6f 6e AINT metadat_con
1400: 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28 straint UNIQUE (
1410: 76 61 72 29 29 3b 22 29 0a 09 20 20 28 73 71 6c var));").. (sql
1420: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 ite3:execute db
1430: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 "CREATE TABLE IF
1440: 20 4e 4f 54 20 45 58 49 53 54 53 20 61 63 63 65 NOT EXISTS acce
1450: 73 73 5f 6c 6f 67 20 28 69 64 20 49 4e 54 45 47 ss_log (id INTEG
1460: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY,
1470: 75 73 65 72 20 54 45 58 54 2c 20 61 63 63 65 73 user TEXT, acces
1480: 73 65 64 20 54 49 4d 45 53 54 41 4d 50 2c 20 61 sed TIMESTAMP, a
1490: 72 67 73 20 54 45 58 54 29 3b 22 29 0a 09 20 20 rgs TEXT);")..
14a0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 (sqlite3:execute
14b0: 20 64 62 20 22 43 52 45 41 54 45 20 54 41 42 4c db "CREATE TABL
14c0: 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 E IF NOT EXISTS
14d0: 74 65 73 74 5f 6d 65 74 61 20 28 69 64 20 49 4e test_meta (id IN
14e0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE
14f0: 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 Y,.
1500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1510: 20 20 20 20 20 20 20 20 74 65 73 74 6e 61 6d 65 testname
1520: 20 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 TEXT DEFAULT
1530: 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 '',.
1540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1550: 20 20 20 20 20 20 20 20 20 20 61 75 74 68 6f 72 author
1560: 20 20 20 20 20 20 54 45 58 54 20 44 45 46 41 55 TEXT DEFAU
1570: 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 LT '',.
1580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1590: 20 20 20 20 20 20 20 20 20 20 20 20 6f 77 6e 65 owne
15a0: 72 20 20 20 20 20 20 20 54 45 58 54 20 44 45 46 r TEXT DEF
15b0: 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 AULT '',.
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65 de
15e0: 73 63 72 69 70 74 69 6f 6e 20 54 45 58 54 20 44 scription TEXT D
15f0: 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 EFAULT '',.
1600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1620: 72 65 76 69 65 77 65 64 20 20 20 20 54 49 4d 45 reviewed TIME
1630: 53 54 41 4d 50 2c 0a 20 20 20 20 20 20 20 20 20 STAMP,.
1640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1650: 20 20 20 20 20 20 20 20 20 20 20 20 69 74 65 72 iter
1660: 61 74 65 64 20 20 20 20 54 45 58 54 20 44 45 46 ated TEXT DEF
1670: 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 AULT '',.
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 76 av
16a0: 67 5f 72 75 6e 74 69 6d 65 20 52 45 41 4c 2c 0a g_runtime REAL,.
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16d0: 20 20 20 20 20 61 76 67 5f 64 69 73 6b 20 20 20 avg_disk
16e0: 20 52 45 41 4c 2c 0a 20 20 20 20 20 20 20 20 20 REAL,.
16f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1700: 20 20 20 20 20 20 20 20 20 20 20 20 74 61 67 73 tags
1710: 20 20 20 20 20 20 20 20 54 45 58 54 20 44 45 46 TEXT DEF
1720: 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 AULT '',.
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1740: 20 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52 41 CONSTRA
1750: 49 4e 54 20 74 65 73 74 5f 6d 65 74 61 5f 63 6f INT test_meta_co
1760: 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20 nstraint UNIQUE
1770: 28 74 65 73 74 6e 61 6d 65 29 29 3b 22 29 0a 09 (testname));")..
1780: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 (sqlite3:execu
1790: 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41 te db "CREATE TA
17a0: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 BLE IF NOT EXIST
17b0: 53 20 74 65 73 74 5f 64 61 74 61 20 28 69 64 20 S test_data (id
17c0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 INTEGER PRIMARY
17d0: 4b 45 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 KEY,.
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17f0: 20 20 20 20 20 74 65 73 74 5f 69 64 20 49 4e 54 test_id INT
1800: 45 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 EGER,.
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1820: 20 20 20 20 20 20 63 61 74 65 67 6f 72 79 20 54 category T
1830: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a EXT DEFAULT '',.
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1860: 76 61 72 69 61 62 6c 65 20 54 45 58 54 2c 0a 09 variable TEXT,..
1870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1880: 20 20 20 20 20 20 20 20 76 61 6c 75 65 20 52 45 value RE
1890: 41 4c 2c 0a 09 20 20 20 20 20 20 20 20 20 20 20 AL,..
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70 exp
18b0: 65 63 74 65 64 20 52 45 41 4c 2c 0a 09 20 20 20 ected REAL,..
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
18d0: 20 20 20 20 20 74 6f 6c 20 52 45 41 4c 2c 0a 20 tol REAL,.
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 u
1900: 6e 69 74 73 20 54 45 58 54 2c 0a 20 20 20 20 20 nits TEXT,.
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1920: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 65 comme
1930: 6e 74 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 nt TEXT DEFAULT
1940: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 '',.
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1960: 20 20 20 20 73 74 61 74 75 73 20 54 45 58 54 20 status TEXT
1970: 44 45 46 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20 DEFAULT 'n/a',.
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 t
19a0: 79 70 65 20 54 45 58 54 20 44 45 46 41 55 4c 54 ype TEXT DEFAULT
19b0: 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 '',.
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
19d0: 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 65 CONSTRAINT te
19e0: 73 74 5f 64 61 74 61 5f 63 6f 6e 73 74 72 61 69 st_data_constrai
19f0: 6e 74 20 55 4e 49 51 55 45 20 28 74 65 73 74 5f nt UNIQUE (test_
1a00: 69 64 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 69 id,category,vari
1a10: 61 62 6c 65 29 29 3b 22 29 0a 09 20 20 28 73 71 able));").. (sq
1a20: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 lite3:execute db
1a30: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 "CREATE TABLE I
1a40: 46 20 4e 4f 54 20 45 58 49 53 54 53 20 74 61 73 F NOT EXISTS tas
1a50: 6b 73 5f 71 75 65 75 65 20 28 69 64 20 49 4e 54 ks_queue (id INT
1a60: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY
1a70: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a90: 20 20 61 63 74 69 6f 6e 20 54 45 58 54 20 44 45 action TEXT DE
1aa0: 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 FAULT '',.
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ac0: 20 20 20 20 20 20 20 20 20 20 6f 77 6e 65 72 20 owner
1ad0: 54 45 58 54 2c 0a 20 20 20 20 20 20 20 20 20 20 TEXT,.
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1af0: 20 20 20 20 20 20 73 74 61 74 65 20 54 45 58 54 state TEXT
1b00: 20 44 45 46 41 55 4c 54 20 27 6e 65 77 27 2c 0a DEFAULT 'new',.
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1b30: 74 61 72 67 65 74 20 54 45 58 54 20 44 45 46 41 target TEXT DEFA
1b40: 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 ULT '',.
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1b60: 20 20 20 20 20 20 20 20 6e 61 6d 65 20 54 45 58 name TEX
1b70: 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 T DEFAULT '',.
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 te
1ba0: 73 74 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 st TEXT DEFAULT
1bb0: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 '',.
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1bd0: 20 20 20 20 69 74 65 6d 20 54 45 58 54 20 44 45 item TEXT DE
1be0: 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 FAULT '',.
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1c00: 20 20 20 20 20 20 20 20 20 20 63 72 65 61 74 69 creati
1c10: 6f 6e 5f 74 69 6d 65 20 54 49 4d 45 53 54 41 4d on_time TIMESTAM
1c20: 50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 P,.
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1c40: 20 20 20 65 78 65 63 75 74 69 6f 6e 5f 74 69 6d execution_tim
1c50: 65 20 54 49 4d 45 53 54 41 4d 50 29 3b 22 29 0a e TIMESTAMP);").
1c60: 09 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 . (sqlite3:exec
1c70: 75 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54 ute db "CREATE T
1c80: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 ABLE IF NOT EXIS
1c90: 54 53 20 6d 6f 6e 69 74 6f 72 73 20 28 69 64 20 TS monitors (id
1ca0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 INTEGER PRIMARY
1cb0: 4b 45 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 KEY,.
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1cd0: 20 20 20 20 20 70 69 64 20 49 4e 54 45 47 45 52 pid INTEGER
1ce0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1d00: 20 20 73 74 61 72 74 5f 74 69 6d 65 20 54 49 4d start_time TIM
1d10: 45 53 54 41 4d 50 2c 0a 20 20 20 20 20 20 20 20 ESTAMP,.
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1d30: 20 20 20 20 20 20 20 20 6c 61 73 74 5f 75 70 64 last_upd
1d40: 61 74 65 20 54 49 4d 45 53 54 41 4d 50 2c 0a 20 ate TIMESTAMP,.
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68 h
1d70: 6f 73 74 6e 61 6d 65 20 54 45 58 54 2c 0a 20 20 ostname TEXT,.
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 73 us
1da0: 65 72 6e 61 6d 65 20 54 45 58 54 2c 0a 20 20 20 ername TEXT,.
1db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e 53 CONS
1dd0: 54 52 41 49 4e 54 20 6d 6f 6e 69 74 6f 72 73 5f TRAINT monitors_
1de0: 63 6f 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 55 constraint UNIQU
1df0: 45 20 28 70 69 64 2c 68 6f 73 74 6e 61 6d 65 29 E (pid,hostname)
1e00: 29 3b 22 29 0a 09 20 20 3b 3b 20 4d 75 73 74 20 );").. ;; Must
1e10: 64 6f 20 74 68 69 73 20 2a 61 66 74 65 72 2a 20 do this *after*
1e20: 72 75 6e 6e 69 6e 67 20 70 61 74 63 68 20 64 62 running patch db
1e30: 20 21 21 20 4e 6f 20 6d 6f 72 65 2e 20 0a 09 20 !! No more. ..
1e40: 20 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 (db:set-var db
1e50: 22 4d 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f "MEGATEST_VERSIO
1e60: 4e 22 20 6d 65 67 61 74 65 73 74 2d 76 65 72 73 N" megatest-vers
1e70: 69 6f 6e 29 0a 09 20 20 29 29 0a 20 20 20 20 64 ion).. )). d
1e80: 62 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d b))..;;=========
1e90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1ea0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1eb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1ec0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b =============.;;
1ed0: 20 54 4f 44 4f 3a 0a 3b 3b 20 20 20 70 75 74 20 TODO:.;; put
1ee0: 64 65 6c 74 61 73 20 69 6e 74 6f 20 61 6e 20 61 deltas into an a
1ef0: 73 73 6f 63 20 6c 69 73 74 20 77 69 74 68 20 76 ssoc list with v
1f00: 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 73 0a 3b ersion numbers.;
1f10: 3b 20 20 20 61 70 70 6c 79 20 61 6c 6c 20 66 72 ; apply all fr
1f20: 6f 6d 20 6c 61 73 74 20 74 6f 20 63 75 72 72 65 om last to curre
1f30: 6e 74 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d nt.;;===========
1f40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1f50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1f60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1f70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 28 64 65 66 ===========.(def
1f80: 69 6e 65 20 28 70 61 74 63 68 2d 64 62 20 64 62 ine (patch-db db
1f90: 29 0a 20 20 28 68 61 6e 64 6c 65 2d 65 78 63 65 ). (handle-exce
1fa0: 70 74 69 6f 6e 73 0a 20 20 20 65 78 6e 0a 20 20 ptions. exn.
1fb0: 20 28 62 65 67 69 6e 0a 20 20 20 20 20 28 70 72 (begin. (pr
1fc0: 69 6e 74 20 22 45 78 63 65 70 74 69 6f 6e 3a 20 int "Exception:
1fd0: 22 20 65 78 6e 29 0a 20 20 20 20 20 28 70 72 69 " exn). (pri
1fe0: 6e 74 20 22 45 52 52 4f 52 3a 20 50 6f 73 73 69 nt "ERROR: Possi
1ff0: 62 6c 65 20 6f 75 74 20 6f 66 20 64 61 74 65 20 ble out of date
2000: 73 63 68 65 6d 61 2c 20 61 74 74 65 6d 70 74 69 schema, attempti
2010: 6e 67 20 74 6f 20 61 64 64 20 74 61 62 6c 65 20 ng to add table
2020: 6d 65 74 61 64 61 74 61 2e 2e 2e 22 29 0a 20 20 metadata...").
2030: 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 (sqlite3:exec
2040: 75 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54 ute db "CREATE T
2050: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 ABLE IF NOT EXIS
2060: 54 53 20 6d 65 74 61 64 61 74 20 28 69 64 20 49 TS metadat (id I
2070: 4e 54 45 47 45 52 2c 20 76 61 72 20 54 45 58 54 NTEGER, var TEXT
2080: 2c 20 76 61 6c 20 54 45 58 54 2c 0a 20 20 20 20 , val TEXT,.
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e CON
20b0: 53 54 52 41 49 4e 54 20 6d 65 74 61 64 61 74 5f STRAINT metadat_
20c0: 63 6f 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 55 constraint UNIQU
20d0: 45 20 28 76 61 72 29 29 3b 22 29 0a 20 20 20 20 E (var));").
20e0: 20 28 69 66 20 28 6e 6f 74 20 28 64 62 3a 67 65 (if (not (db:ge
20f0: 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 t-var db "MEGATE
2100: 53 54 5f 56 45 52 53 49 4f 4e 22 29 29 0a 09 20 ST_VERSION"))..
2110: 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22 (db:set-var db "
2120: 4d 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e MEGATEST_VERSION
2130: 22 20 31 2e 31 37 29 29 29 0a 20 20 20 28 6c 65 " 1.17))). (le
2140: 74 20 28 28 6d 76 65 72 20 28 64 62 3a 67 65 74 t ((mver (db:get
2150: 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 53 -var db "MEGATES
2160: 54 5f 56 45 52 53 49 4f 4e 22 29 29 0a 09 20 28 T_VERSION")).. (
2170: 74 65 73 74 2d 6d 65 74 61 2d 64 65 66 20 22 43 test-meta-def "C
2180: 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e REATE TABLE IF N
2190: 4f 54 20 45 58 49 53 54 53 20 74 65 73 74 5f 6d OT EXISTS test_m
21a0: 65 74 61 20 28 69 64 20 49 4e 54 45 47 45 52 20 eta (id INTEGER
21b0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 PRIMARY KEY,.
21c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
21e0: 20 20 74 65 73 74 6e 61 6d 65 20 20 20 20 54 45 testname TE
21f0: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 XT DEFAULT '',.
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2220: 20 20 20 20 61 75 74 68 6f 72 20 20 20 20 20 20 author
2230: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c TEXT DEFAULT '',
2240: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2260: 20 20 20 20 20 20 6f 77 6e 65 72 20 20 20 20 20 owner
2270: 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 TEXT DEFAULT '
2280: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ',.
2290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
22a0: 20 20 20 20 20 20 20 20 64 65 73 63 72 69 70 74 descript
22b0: 69 6f 6e 20 54 45 58 54 20 44 45 46 41 55 4c 54 ion TEXT DEFAULT
22c0: 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 '',.
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
22e0: 20 20 20 20 20 20 20 20 20 20 72 65 76 69 65 77 review
22f0: 65 64 20 20 20 20 54 49 4d 45 53 54 41 4d 50 2c ed TIMESTAMP,
2300: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
2310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2320: 20 20 20 20 20 20 69 74 65 72 61 74 65 64 20 20 iterated
2330: 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 TEXT DEFAULT '
2340: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ',.
2350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2360: 20 20 20 20 20 20 20 20 61 76 67 5f 72 75 6e 74 avg_runt
2370: 69 6d 65 20 52 45 41 4c 2c 0a 20 20 20 20 20 20 ime REAL,.
2380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 a
23a0: 76 67 5f 64 69 73 6b 20 20 20 20 52 45 41 4c 2c vg_disk REAL,
23b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
23c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
23d0: 20 20 20 20 20 20 74 61 67 73 20 20 20 20 20 20 tags
23e0: 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 TEXT DEFAULT '
23f0: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ',.
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2410: 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 65 CONSTRAINT te
2420: 73 74 5f 6d 65 74 61 5f 63 6f 6e 73 74 72 61 69 st_meta_constrai
2430: 6e 74 20 55 4e 49 51 55 45 20 28 74 65 73 74 6e nt UNIQUE (testn
2440: 61 6d 65 29 29 3b 22 29 29 0a 20 20 20 20 20 28 ame));")). (
2450: 70 72 69 6e 74 20 22 43 75 72 72 65 6e 74 20 73 print "Current s
2460: 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 3a 20 22 chema version: "
2470: 20 6d 76 65 72 20 22 20 63 75 72 72 65 6e 74 20 mver " current
2480: 6d 65 67 61 74 65 73 74 20 76 65 72 73 69 6f 6e megatest version
2490: 3a 20 22 20 6d 65 67 61 74 65 73 74 2d 76 65 72 : " megatest-ver
24a0: 73 69 6f 6e 29 0a 20 20 20 20 20 28 63 6f 6e 64 sion). (cond
24b0: 0a 20 20 20 20 20 20 28 28 6e 6f 74 20 6d 76 65 . ((not mve
24c0: 72 29 0a 20 20 20 20 20 20 20 28 70 72 69 6e 74 r). (print
24d0: 20 22 41 64 64 69 6e 67 20 6d 65 67 61 74 65 73 "Adding megates
24e0: 74 2d 76 65 72 73 69 6f 6e 20 74 6f 20 6d 65 74 t-version to met
24f0: 61 64 61 74 61 22 29 20 3b 3b 20 4e 65 65 64 20 adata") ;; Need
2500: 74 6f 20 72 65 63 72 65 61 74 65 20 74 68 65 20 to recreate the
2510: 74 61 62 6c 65 0a 20 20 20 20 20 20 20 28 73 71 table. (sq
2520: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 lite3:execute db
2530: 20 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 "DROP TABLE IF
2540: 45 58 49 53 54 53 20 6d 65 74 61 64 61 74 3b 22 EXISTS metadat;"
2550: 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 ). (sqlite
2560: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 43 52 3:execute db "CR
2570: 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f EATE TABLE IF NO
2580: 54 20 45 58 49 53 54 53 20 6d 65 74 61 64 61 74 T EXISTS metadat
2590: 20 28 69 64 20 49 4e 54 45 47 45 52 2c 20 76 61 (id INTEGER, va
25a0: 72 20 54 45 58 54 2c 20 76 61 6c 20 54 45 58 54 r TEXT, val TEXT
25b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
25d0: 20 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 6d CONSTRAINT m
25e0: 65 74 61 64 61 74 5f 63 6f 6e 73 74 72 61 69 6e etadat_constrain
25f0: 74 20 55 4e 49 51 55 45 20 28 76 61 72 29 29 3b t UNIQUE (var));
2600: 22 29 0a 20 20 20 20 20 20 20 28 64 62 3a 73 65 "). (db:se
2610: 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 t-var db "MEGATE
2620: 53 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e 31 37 ST_VERSION" 1.17
2630: 29 0a 20 20 20 20 20 20 20 28 70 61 74 63 68 2d ). (patch-
2640: 64 62 29 29 0a 20 20 20 20 20 20 28 28 3c 20 6d db)). ((< m
2650: 76 65 72 20 31 2e 32 31 29 0a 20 20 20 20 20 20 ver 1.21).
2660: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 (sqlite3:execut
2670: 65 20 64 62 20 22 44 52 4f 50 20 54 41 42 4c 45 e db "DROP TABLE
2680: 20 49 46 20 45 58 49 53 54 53 20 6d 65 74 61 64 IF EXISTS metad
2690: 61 74 3b 22 29 0a 20 20 20 20 20 20 20 28 73 71 at;"). (sq
26a0: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 lite3:execute db
26b0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 "CREATE TABLE I
26c0: 46 20 4e 4f 54 20 45 58 49 53 54 53 20 6d 65 74 F NOT EXISTS met
26d0: 61 64 61 74 20 28 69 64 20 49 4e 54 45 47 45 52 adat (id INTEGER
26e0: 2c 20 76 61 72 20 54 45 58 54 2c 20 76 61 6c 20 , var TEXT, val
26f0: 54 45 58 54 2c 0a 20 20 20 20 20 20 20 20 20 20 TEXT,.
2700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2710: 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52 41 49 CONSTRAI
2720: 4e 54 20 6d 65 74 61 64 61 74 5f 63 6f 6e 73 74 NT metadat_const
2730: 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28 76 61 raint UNIQUE (va
2740: 72 29 29 3b 22 29 0a 20 20 20 20 20 20 20 28 64 r));"). (d
2750: 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 b:set-var db "ME
2760: 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 GATEST_VERSION"
2770: 31 2e 32 31 29 20 3b 3b 20 73 65 74 20 62 65 66 1.21) ;; set bef
2780: 6f 72 65 2c 20 6a 75 73 74 20 69 6e 20 63 61 73 ore, just in cas
2790: 65 20 74 68 65 20 63 68 61 6e 67 65 73 20 61 72 e the changes ar
27a0: 65 20 61 6c 72 65 61 64 79 20 61 70 70 6c 69 65 e already applie
27b0: 64 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 d. (sqlite
27c0: 33 3a 65 78 65 63 75 74 65 20 64 62 20 74 65 73 3:execute db tes
27d0: 74 2d 6d 65 74 61 2d 64 65 66 29 0a 20 20 20 20 t-meta-def).
27e0: 20 20 20 3b 28 66 6f 72 2d 65 61 63 68 20 0a 20 ;(for-each .
27f0: 20 20 20 20 20 20 3b 20 28 6c 61 6d 62 64 61 20 ; (lambda
2800: 28 73 74 6d 74 29 0a 20 20 20 20 20 20 20 3b 20 (stmt). ;
2810: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 (sqlite3:execu
2820: 74 65 20 64 62 20 73 74 6d 74 29 29 0a 20 20 20 te db stmt)).
2830: 20 20 20 20 3b 20 28 6c 69 73 74 20 0a 20 20 20 ; (list .
2840: 20 20 20 20 3b 20 20 22 41 4c 54 45 52 20 54 41 ; "ALTER TA
2850: 42 4c 45 20 74 65 73 74 73 20 41 44 44 20 43 4f BLE tests ADD CO
2860: 4c 55 4d 4e 20 66 69 72 73 74 5f 65 72 72 20 54 LUMN first_err T
2870: 45 58 54 3b 22 0a 20 20 20 20 20 20 20 3b 20 20 EXT;". ;
2880: 22 41 4c 54 45 52 20 54 41 42 4c 45 20 74 65 73 "ALTER TABLE tes
2890: 74 73 20 41 44 44 20 43 4f 4c 55 4d 4e 20 66 69 ts ADD COLUMN fi
28a0: 72 73 74 5f 77 61 72 6e 20 54 45 58 54 3b 22 0a rst_warn TEXT;".
28b0: 20 20 20 20 20 20 20 3b 20 20 29 29 0a 20 20 20 ; )).
28c0: 20 20 20 20 28 70 61 74 63 68 2d 64 62 29 29 0a (patch-db)).
28d0: 20 20 20 20 20 20 28 28 3c 20 6d 76 65 72 20 31 ((< mver 1
28e0: 2e 32 34 29 0a 20 20 20 20 20 20 20 28 64 62 3a .24). (db:
28f0: 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41 set-var db "MEGA
2900: 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e TEST_VERSION" 1.
2910: 32 34 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69 24). (sqli
2920: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 te3:execute db "
2930: 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 DROP TABLE IF EX
2940: 49 53 54 53 20 74 65 73 74 5f 64 61 74 61 3b 22 ISTS test_data;"
2950: 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 ). (sqlite
2960: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 44 52 3:execute db "DR
2970: 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 OP TABLE IF EXIS
2980: 54 53 20 74 65 73 74 5f 6d 65 74 61 3b 22 29 0a TS test_meta;").
2990: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a (sqlite3:
29a0: 65 78 65 63 75 74 65 20 64 62 20 74 65 73 74 2d execute db test-
29b0: 6d 65 74 61 2d 64 65 66 29 0a 20 20 20 20 20 20 meta-def).
29c0: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 (sqlite3:execut
29d0: 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41 42 e db "CREATE TAB
29e0: 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 LE IF NOT EXISTS
29f0: 20 74 65 73 74 5f 64 61 74 61 20 28 69 64 20 49 test_data (id I
2a00: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b NTEGER PRIMARY K
2a10: 45 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 EY,.
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2a30: 20 20 20 20 74 65 73 74 5f 69 64 20 49 4e 54 45 test_id INTE
2a40: 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 GER,.
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2a60: 20 20 20 20 20 63 61 74 65 67 6f 72 79 20 54 45 category TE
2a70: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 XT DEFAULT '',.
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76 v
2aa0: 61 72 69 61 62 6c 65 20 54 45 58 54 2c 0a 09 20 ariable TEXT,..
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2ac0: 20 20 20 20 20 20 20 76 61 6c 75 65 20 52 45 41 value REA
2ad0: 4c 2c 0a 09 20 20 20 20 20 20 20 20 20 20 20 20 L,..
2ae0: 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70 65 expe
2af0: 63 74 65 64 20 52 45 41 4c 2c 0a 09 20 20 20 20 cted REAL,..
2b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2b10: 20 20 20 20 74 6f 6c 20 52 45 41 4c 2c 0a 20 20 tol REAL,.
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 6e un
2b40: 69 74 73 20 54 45 58 54 2c 0a 20 20 20 20 20 20 its TEXT,.
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2b60: 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 65 6e commen
2b70: 74 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 t TEXT DEFAULT '
2b80: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ',.
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2ba0: 20 20 20 73 74 61 74 75 73 20 54 45 58 54 20 44 status TEXT D
2bb0: 45 46 41 55 4c 54 20 27 6e 2f 61 27 2c 66 6f 73 EFAULT 'n/a',fos
2bc0: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 s.
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2be0: 43 4f 4e 53 54 52 41 49 4e 54 20 74 65 73 74 5f CONSTRAINT test_
2bf0: 64 61 74 61 20 55 4e 49 51 55 45 20 28 74 65 73 data UNIQUE (tes
2c00: 74 5f 69 64 2c 63 61 74 65 67 6f 72 79 2c 76 61 t_id,category,va
2c10: 72 69 61 62 6c 65 29 29 3b 22 29 0a 20 20 20 20 riable));").
2c20: 20 20 20 28 70 61 74 63 68 2d 64 62 29 29 0a 20 (patch-db)).
2c30: 20 20 20 20 20 28 28 3c 20 6d 76 65 72 20 31 2e ((< mver 1.
2c40: 32 37 29 0a 20 20 20 20 20 20 20 28 64 62 3a 73 27). (db:s
2c50: 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 et-var db "MEGAT
2c60: 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e 32 EST_VERSION" 1.2
2c70: 37 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 7). (sqlit
2c80: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 41 e3:execute db "A
2c90: 4c 54 45 52 20 54 41 42 4c 45 20 74 65 73 74 5f LTER TABLE test_
2ca0: 64 61 74 61 20 41 44 44 20 43 4f 4c 55 4d 4e 20 data ADD COLUMN
2cb0: 74 79 70 65 20 54 45 58 54 20 44 45 46 41 55 4c type TEXT DEFAUL
2cc0: 54 20 27 27 3b 22 29 0a 20 20 20 20 20 20 20 28 T '';"). (
2cd0: 70 61 74 63 68 2d 64 62 29 29 0a 20 20 20 20 20 patch-db)).
2ce0: 20 28 28 3c 20 6d 76 65 72 20 31 2e 32 39 29 0a ((< mver 1.29).
2cf0: 20 20 20 20 20 20 20 28 64 62 3a 73 65 74 2d 76 (db:set-v
2d00: 61 72 20 64 62 20 22 4d 45 47 41 54 45 53 54 5f ar db "MEGATEST_
2d10: 56 45 52 53 49 4f 4e 22 20 31 2e 32 39 29 0a 20 VERSION" 1.29).
2d20: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 (sqlite3:e
2d30: 78 65 63 75 74 65 20 64 62 20 22 41 4c 54 45 52 xecute db "ALTER
2d40: 20 54 41 42 4c 45 20 74 65 73 74 5f 73 74 65 70 TABLE test_step
2d50: 73 20 41 44 44 20 43 4f 4c 55 4d 4e 20 6c 6f 67 s ADD COLUMN log
2d60: 66 69 6c 65 20 54 45 58 54 3b 22 29 0a 20 20 20 file TEXT;").
2d70: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 (sqlite3:exe
2d80: 63 75 74 65 20 64 62 20 22 41 4c 54 45 52 20 54 cute db "ALTER T
2d90: 41 42 4c 45 20 74 65 73 74 73 20 41 44 44 20 43 ABLE tests ADD C
2da0: 4f 4c 55 4d 4e 20 73 68 6f 72 74 64 69 72 20 54 OLUMN shortdir T
2db0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 3b 22 EXT DEFAULT '';"
2dc0: 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 ). (sqlite
2dd0: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 43 52 3:execute db "CR
2de0: 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f EATE TABLE IF NO
2df0: 54 20 45 58 49 53 54 53 20 74 61 73 6b 73 5f 71 T EXISTS tasks_q
2e00: 75 65 75 65 20 28 69 64 20 49 4e 54 45 47 45 52 ueue (id INTEGER
2e10: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 PRIMARY KEY,.
2e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 63 ac
2e40: 74 69 6f 6e 20 54 45 58 54 20 44 45 46 41 55 4c tion TEXT DEFAUL
2e50: 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 T '',.
2e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2e70: 20 20 20 20 20 20 6f 77 6e 65 72 20 54 45 58 54 owner TEXT
2e80: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
2e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2ea0: 20 20 73 74 61 74 65 20 54 45 58 54 20 44 45 46 state TEXT DEF
2eb0: 41 55 4c 54 20 27 6e 65 77 27 2c 0a 20 20 20 20 AULT 'new',.
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 74 61 72 67 targ
2ee0: 65 74 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 et TEXT DEFAULT
2ef0: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 '',.
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2f10: 20 20 20 20 6e 61 6d 65 20 54 45 58 54 20 44 45 name TEXT DE
2f20: 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 FAULT '',.
2f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2f40: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 20 54 test T
2f50: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a EXT DEFAULT '',.
2f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2f80: 69 74 65 6d 20 54 45 58 54 20 44 45 46 41 55 4c item TEXT DEFAUL
2f90: 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 T '',.
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2fb0: 20 20 20 20 20 20 63 72 65 61 74 69 6f 6e 5f 74 creation_t
2fc0: 69 6d 65 20 54 49 4d 45 53 54 41 4d 50 2c 0a 20 ime TIMESTAMP,.
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 e
2ff0: 78 65 63 75 74 69 6f 6e 5f 74 69 6d 65 20 54 49 xecution_time TI
3000: 4d 45 53 54 41 4d 50 29 3b 22 29 0a 20 20 20 20 MESTAMP);").
3010: 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 (sqlite3:exec
3020: 75 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54 ute db "CREATE T
3030: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 ABLE IF NOT EXIS
3040: 54 53 20 6d 6f 6e 69 74 6f 72 73 20 28 69 64 20 TS monitors (id
3050: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 INTEGER PRIMARY
3060: 4b 45 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 KEY,.
3070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3080: 20 20 20 20 20 70 69 64 20 49 4e 54 45 47 45 52 pid INTEGER
3090: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
30b0: 20 20 73 74 61 72 74 5f 74 69 6d 65 20 54 49 4d start_time TIM
30c0: 45 53 54 41 4d 50 2c 0a 20 20 20 20 20 20 20 20 ESTAMP,.
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
30e0: 20 20 20 20 20 20 20 20 6c 61 73 74 5f 75 70 64 last_upd
30f0: 61 74 65 20 54 49 4d 45 53 54 41 4d 50 2c 0a 20 ate TIMESTAMP,.
3100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68 h
3120: 6f 73 74 6e 61 6d 65 20 54 45 58 54 2c 0a 20 20 ostname TEXT,.
3130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 73 us
3150: 65 72 6e 61 6d 65 20 54 45 58 54 2c 0a 20 20 20 ername TEXT,.
3160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3170: 20 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e 53 CONS
3180: 54 52 41 49 4e 54 20 6d 6f 6e 69 74 6f 72 73 5f TRAINT monitors_
3190: 63 6f 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 55 constraint UNIQU
31a0: 45 20 28 70 69 64 2c 68 6f 73 74 6e 61 6d 65 29 E (pid,hostname)
31b0: 29 3b 22 29 0a 20 20 20 20 20 20 20 28 70 61 74 );"). (pat
31c0: 63 68 2d 64 62 29 29 0a 20 20 20 20 20 20 28 28 ch-db)). ((
31d0: 3c 20 6d 76 65 72 20 6d 65 67 61 74 65 73 74 2d < mver megatest-
31e0: 76 65 72 73 69 6f 6e 29 0a 20 20 20 20 20 20 20 version).
31f0: 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22 (db:set-var db "
3200: 4d 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e MEGATEST_VERSION
3210: 22 20 6d 65 67 61 74 65 73 74 2d 76 65 72 73 69 " megatest-versi
3220: 6f 6e 29 29 29 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d on))))))..;;====
3230: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3240: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3250: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3260: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3270: 3d 3d 0a 3b 3b 20 6d 65 74 61 20 67 65 74 20 61 ==.;; meta get a
3280: 6e 64 20 73 65 74 20 76 61 72 73 0a 3b 3b 3d 3d nd set vars.;;==
3290: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
32a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
32b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
32c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
32d0: 3d 3d 3d 3d 0a 0a 3b 3b 20 72 65 74 75 72 6e 73 ====..;; returns
32e0: 20 6e 75 6d 62 65 72 20 69 66 20 73 74 72 69 6e number if strin
32f0: 67 2d 3e 6e 75 6d 62 65 72 20 69 73 20 73 75 63 g->number is suc
3300: 63 65 73 73 66 75 6c 2c 20 73 74 72 69 6e 67 20 cessful, string
3310: 6f 74 68 65 72 77 69 73 65 0a 28 64 65 66 69 6e otherwise.(defin
3320: 65 20 28 64 62 3a 67 65 74 2d 76 61 72 20 64 62 e (db:get-var db
3330: 20 76 61 72 29 0a 20 20 28 6c 65 74 20 28 28 72 var). (let ((r
3340: 65 73 20 23 66 29 29 0a 20 20 20 20 28 73 71 6c es #f)). (sql
3350: 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f ite3:for-each-ro
3360: 77 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 w. (lambda (
3370: 76 61 6c 29 0a 20 20 20 20 20 20 20 28 73 65 74 val). (set
3380: 21 20 72 65 73 20 76 61 6c 29 29 0a 20 20 20 20 ! res val)).
3390: 20 64 62 20 22 53 45 4c 45 43 54 20 76 61 6c 20 db "SELECT val
33a0: 46 52 4f 4d 20 6d 65 74 61 64 61 74 20 57 48 45 FROM metadat WHE
33b0: 52 45 20 76 61 72 3d 3f 3b 22 20 76 61 72 29 0a RE var=?;" var).
33c0: 20 20 20 20 28 69 66 20 28 73 74 72 69 6e 67 3f (if (string?
33d0: 20 72 65 73 29 0a 09 28 6c 65 74 20 28 28 76 61 res)..(let ((va
33e0: 6c 6e 75 6d 20 28 73 74 72 69 6e 67 2d 3e 6e 75 lnum (string->nu
33f0: 6d 62 65 72 20 72 65 73 29 29 29 0a 09 20 20 28 mber res))).. (
3400: 69 66 20 76 61 6c 6e 75 6d 20 76 61 6c 6e 75 6d if valnum valnum
3410: 20 72 65 73 29 29 0a 09 72 65 73 29 29 29 0a 0a res))..res)))..
3420: 28 64 65 66 69 6e 65 20 28 64 62 3a 73 65 74 2d (define (db:set-
3430: 76 61 72 20 64 62 20 76 61 72 20 76 61 6c 29 0a var db var val).
3440: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 (sqlite3:execu
3450: 74 65 20 64 62 20 22 49 4e 53 45 52 54 20 4f 52 te db "INSERT OR
3460: 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 6d 65 REPLACE INTO me
3470: 74 61 64 61 74 20 28 76 61 72 2c 76 61 6c 29 20 tadat (var,val)
3480: 56 41 4c 55 45 53 20 28 3f 2c 3f 29 3b 22 20 76 VALUES (?,?);" v
3490: 61 72 20 76 61 6c 29 29 0a 0a 3b 3b 20 75 73 65 ar val))..;; use
34a0: 20 61 20 67 6c 6f 62 61 6c 20 66 6f 72 20 73 6f a global for so
34b0: 6d 65 20 70 72 69 6d 69 74 69 76 65 20 63 61 63 me primitive cac
34c0: 68 69 6e 67 2c 20 69 74 20 69 73 20 6a 75 73 74 hing, it is just
34d0: 20 73 69 6c 6c 79 20 74 6f 20 72 65 2d 72 65 61 silly to re-rea
34e0: 64 20 74 68 65 20 64 62 20 0a 3b 3b 20 6f 76 65 d the db .;; ove
34f0: 72 20 61 6e 64 20 6f 76 65 72 20 61 67 61 69 6e r and over again
3500: 20 66 6f 72 20 74 68 65 20 6b 65 79 73 20 73 69 for the keys si
3510: 6e 63 65 20 74 68 65 79 20 6e 65 76 65 72 20 63 nce they never c
3520: 68 61 6e 67 65 0a 0a 28 64 65 66 69 6e 65 20 2a hange..(define *
3530: 64 62 2d 6b 65 79 73 2a 20 23 66 29 0a 0a 28 64 db-keys* #f)..(d
3540: 65 66 69 6e 65 20 28 64 62 2d 67 65 74 2d 6b 65 efine (db-get-ke
3550: 79 73 20 64 62 29 0a 20 20 28 69 66 20 2a 64 62 ys db). (if *db
3560: 2d 6b 65 79 73 2a 20 2a 64 62 2d 6b 65 79 73 2a -keys* *db-keys*
3570: 20 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28 72 . (let ((r
3580: 65 73 20 27 28 29 29 29 0a 09 28 73 71 6c 69 74 es '()))..(sqlit
3590: 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 e3:for-each-row
35a0: 0a 09 20 28 6c 61 6d 62 64 61 20 28 6b 65 79 20 .. (lambda (key
35b0: 6b 65 79 74 79 70 65 29 0a 09 20 20 20 28 73 65 keytype).. (se
35c0: 74 21 20 72 65 73 20 28 63 6f 6e 73 20 28 76 65 t! res (cons (ve
35d0: 63 74 6f 72 20 6b 65 79 20 6b 65 79 74 79 70 65 ctor key keytype
35e0: 29 20 72 65 73 29 29 29 0a 09 20 64 62 0a 09 20 ) res))).. db..
35f0: 22 53 45 4c 45 43 54 20 66 69 65 6c 64 6e 61 6d "SELECT fieldnam
3600: 65 2c 66 69 65 6c 64 74 79 70 65 20 46 52 4f 4d e,fieldtype FROM
3610: 20 6b 65 79 73 20 4f 52 44 45 52 20 42 59 20 69 keys ORDER BY i
3620: 64 20 44 45 53 43 3b 22 29 0a 09 28 73 65 74 21 d DESC;")..(set!
3630: 20 2a 64 62 2d 6b 65 79 73 2a 20 72 65 73 29 0a *db-keys* res).
3640: 09 72 65 73 29 29 29 0a 0a 28 64 65 66 69 6e 65 .res)))..(define
3650: 20 64 62 3a 67 65 74 2d 6b 65 79 73 20 64 62 2d db:get-keys db-
3660: 67 65 74 2d 6b 65 79 73 29 0a 0a 28 64 65 66 69 get-keys)..(defi
3670: 6e 65 20 28 64 62 3a 67 65 74 2d 76 61 6c 75 65 ne (db:get-value
3680: 2d 62 79 2d 68 65 61 64 65 72 20 72 6f 77 20 68 -by-header row h
3690: 65 61 64 65 72 20 66 69 65 6c 64 29 0a 20 20 28 eader field). (
36a0: 64 65 62 75 67 3a 70 72 69 6e 74 20 30 20 22 64 debug:print 0 "d
36b0: 62 3a 67 65 74 2d 76 61 6c 75 65 2d 62 79 2d 68 b:get-value-by-h
36c0: 65 61 64 65 72 20 72 6f 77 3a 20 22 20 72 6f 77 eader row: " row
36d0: 20 22 20 68 65 61 64 65 72 3a 20 22 20 68 65 61 " header: " hea
36e0: 64 65 72 20 22 20 66 69 65 6c 64 3a 20 22 20 66 der " field: " f
36f0: 69 65 6c 64 29 0a 20 20 28 69 66 20 28 6e 75 6c ield). (if (nul
3700: 6c 3f 20 68 65 61 64 65 72 29 20 23 66 0a 20 20 l? header) #f.
3710: 20 20 20 20 28 6c 65 74 20 6c 6f 6f 70 20 28 28 (let loop ((
3720: 68 65 64 20 28 63 61 72 20 68 65 61 64 65 72 29 hed (car header)
3730: 29 0a 09 09 20 28 74 61 6c 20 28 63 64 72 20 68 )... (tal (cdr h
3740: 65 61 64 65 72 29 29 0a 09 09 20 28 6e 20 20 20 eader))... (n
3750: 30 29 29 0a 09 28 69 66 20 28 65 71 75 61 6c 3f 0))..(if (equal?
3760: 20 68 65 64 20 66 69 65 6c 64 29 0a 09 20 20 20 hed field)..
3770: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 72 6f 77 (vector-ref row
3780: 20 6e 29 0a 09 20 20 20 20 28 69 66 20 28 6e 75 n).. (if (nu
3790: 6c 6c 3f 20 74 61 6c 29 20 23 66 20 28 6c 6f 6f ll? tal) #f (loo
37a0: 70 20 28 63 61 72 20 74 61 6c 29 28 63 64 72 20 p (car tal)(cdr
37b0: 74 61 6c 29 28 2b 20 6e 20 31 29 29 29 29 29 29 tal)(+ n 1))))))
37c0: 29 0a 09 20 20 20 20 0a 3b 3b 3d 3d 3d 3d 3d 3d ).. .;;======
37d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
37e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
37f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3800: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3810: 0a 3b 3b 20 20 52 20 55 20 4e 20 53 0a 3b 3b 3d .;; R U N S.;;=
3820: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3830: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3840: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3850: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3860: 3d 3d 3d 3d 3d 0a 0a 28 64 65 66 69 6e 65 20 28 =====..(define (
3870: 72 75 6e 73 3a 67 65 74 2d 73 74 64 2d 72 75 6e runs:get-std-run
3880: 2d 66 69 65 6c 64 73 20 6b 65 79 73 20 72 65 6d -fields keys rem
3890: 66 69 65 6c 64 73 29 0a 20 20 28 6c 65 74 2a 20 fields). (let*
38a0: 28 28 68 65 61 64 65 72 20 20 20 20 28 61 70 70 ((header (app
38b0: 65 6e 64 20 28 6d 61 70 20 6b 65 79 3a 67 65 74 end (map key:get
38c0: 2d 66 69 65 6c 64 6e 61 6d 65 20 6b 65 79 73 29 -fieldname keys)
38d0: 0a 09 09 09 20 20 20 20 72 65 6d 66 69 65 6c 64 .... remfield
38e0: 73 29 29 0a 09 20 28 6b 65 79 73 74 72 20 20 20 s)).. (keystr
38f0: 20 28 63 6f 6e 63 20 28 6b 65 79 73 2d 3e 6b 65 (conc (keys->ke
3900: 79 73 74 72 20 6b 65 79 73 29 20 22 2c 22 0a 09 ystr keys) ","..
3910: 09 09 20 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 .. (string-inte
3920: 72 73 70 65 72 73 65 20 72 65 6d 66 69 65 6c 64 rsperse remfield
3930: 73 20 22 2c 22 29 29 29 29 0a 20 20 20 20 28 6c s ",")))). (l
3940: 69 73 74 20 6b 65 79 73 74 72 20 68 65 61 64 65 ist keystr heade
3950: 72 29 29 29 0a 0a 3b 3b 20 57 41 53 20 64 62 2d r)))..;; WAS db-
3960: 67 65 74 2d 72 75 6e 73 20 46 49 58 4d 45 20 49 get-runs FIXME I
3970: 4e 20 52 45 4d 41 49 4e 49 4e 47 20 43 4f 44 45 N REMAINING CODE
3980: 0a 3b 3b 0a 3b 3b 20 4d 45 52 47 45 20 54 48 49 .;;.;; MERGE THI
3990: 53 20 57 49 54 48 20 64 62 3a 67 65 74 2d 72 75 S WITH db:get-ru
39a0: 6e 73 2c 20 61 63 63 69 64 65 6e 74 6c 79 20 77 ns, accidently w
39b0: 72 6f 74 65 20 69 74 20 74 77 69 63 65 0a 3b 3b rote it twice.;;
39c0: 0a 3b 3b 20 72 65 70 6c 61 63 65 20 68 65 61 64 .;; replace head
39d0: 65 72 20 61 6e 64 20 6b 65 79 73 74 72 20 77 69 er and keystr wi
39e0: 74 68 20 61 20 63 61 6c 6c 20 74 6f 20 72 75 6e th a call to run
39f0: 73 3a 67 65 74 2d 73 74 64 2d 72 75 6e 2d 66 69 s:get-std-run-fi
3a00: 65 6c 64 73 0a 3b 3b 0a 3b 3b 20 6b 65 79 70 61 elds.;;.;; keypa
3a10: 74 74 73 3a 20 28 20 28 4b 45 59 31 20 22 61 62 tts: ( (KEY1 "ab
3a20: 63 25 64 65 66 22 29 28 4b 45 59 32 20 22 25 22 c%def")(KEY2 "%"
3a30: 29 20 29 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 28 ) ).;;.(define (
3a40: 64 62 3a 67 65 74 2d 72 75 6e 73 20 64 62 20 72 db:get-runs db r
3a50: 75 6e 70 61 74 74 20 63 6f 75 6e 74 20 6f 66 66 unpatt count off
3a60: 73 65 74 20 6b 65 79 70 61 74 74 73 29 0a 20 20 set keypatts).
3a70: 28 6c 65 74 2a 20 28 28 72 65 73 20 20 20 20 20 (let* ((res
3a80: 20 27 28 29 29 0a 09 20 28 6b 65 79 73 20 20 20 '()).. (keys
3a90: 20 20 20 28 64 62 2d 67 65 74 2d 6b 65 79 73 20 (db-get-keys
3aa0: 64 62 29 29 0a 09 20 28 72 65 6d 66 69 65 6c 64 db)).. (remfield
3ab0: 73 20 28 6c 69 73 74 20 22 69 64 22 20 22 72 75 s (list "id" "ru
3ac0: 6e 6e 61 6d 65 22 20 22 73 74 61 74 65 22 20 22 nname" "state" "
3ad0: 73 74 61 74 75 73 22 20 22 6f 77 6e 65 72 22 20 status" "owner"
3ae0: 22 65 76 65 6e 74 5f 74 69 6d 65 22 29 29 0a 09 "event_time"))..
3af0: 20 28 68 65 61 64 65 72 20 20 20 20 28 61 70 70 (header (app
3b00: 65 6e 64 20 28 6d 61 70 20 6b 65 79 3a 67 65 74 end (map key:get
3b10: 2d 66 69 65 6c 64 6e 61 6d 65 20 6b 65 79 73 29 -fieldname keys)
3b20: 0a 09 09 09 20 20 20 20 72 65 6d 66 69 65 6c 64 .... remfield
3b30: 73 29 29 0a 09 20 28 6b 65 79 73 74 72 20 20 20 s)).. (keystr
3b40: 20 28 63 6f 6e 63 20 28 6b 65 79 73 2d 3e 6b 65 (conc (keys->ke
3b50: 79 73 74 72 20 6b 65 79 73 29 20 22 2c 22 0a 09 ystr keys) ","..
3b60: 09 09 20 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 .. (string-inte
3b70: 72 73 70 65 72 73 65 20 72 65 6d 66 69 65 6c 64 rsperse remfield
3b80: 73 20 22 2c 22 29 29 29 0a 09 20 28 71 72 79 73 s ","))).. (qrys
3b90: 74 72 20 20 20 20 28 63 6f 6e 63 20 22 53 45 4c tr (conc "SEL
3ba0: 45 43 54 20 22 20 6b 65 79 73 74 72 20 22 20 46 ECT " keystr " F
3bb0: 52 4f 4d 20 72 75 6e 73 20 57 48 45 52 45 20 72 ROM runs WHERE r
3bc0: 75 6e 6e 61 6d 65 20 4c 49 4b 45 20 3f 20 22 0a unname LIKE ? ".
3bd0: 09 09 09 20 20 3b 3b 20 47 65 6e 65 72 61 74 65 ... ;; Generate
3be0: 3a 20 22 20 41 4e 44 20 78 20 4c 49 4b 45 20 27 : " AND x LIKE '
3bf0: 6b 65 79 70 61 74 74 27 20 2e 2e 2e 22 0a 09 09 keypatt' ..."...
3c00: 09 20 20 28 69 66 20 28 6e 75 6c 6c 3f 20 6b 65 . (if (null? ke
3c10: 79 70 61 74 74 73 29 20 22 22 0a 09 09 09 20 20 ypatts) ""....
3c20: 20 20 20 20 28 63 6f 6e 63 20 22 20 41 4e 44 20 (conc " AND
3c30: 22 0a 09 09 09 09 20 20 20 20 28 73 74 72 69 6e "..... (strin
3c40: 67 2d 6a 6f 69 6e 20 0a 09 09 09 09 20 20 20 20 g-join .....
3c50: 20 28 6d 61 70 20 28 6c 61 6d 62 64 61 20 28 6b (map (lambda (k
3c60: 65 79 70 61 74 74 29 0a 09 09 09 09 09 20 20 20 eypatt)......
3c70: 20 28 6c 65 74 20 28 28 6b 65 79 20 20 28 63 61 (let ((key (ca
3c80: 72 20 6b 65 79 70 61 74 74 29 29 0a 09 09 09 09 r keypatt)).....
3c90: 09 09 20 20 28 70 61 74 74 20 28 63 61 64 72 20 .. (patt (cadr
3ca0: 6b 65 79 70 61 74 74 29 29 29 0a 09 09 09 09 09 keypatt)))......
3cb0: 20 20 20 20 20 20 28 63 6f 6e 63 20 6b 65 79 20 (conc key
3cc0: 22 20 4c 49 4b 45 20 27 22 20 70 61 74 74 20 22 " LIKE '" patt "
3cd0: 27 22 29 29 29 0a 09 09 09 09 09 20 20 6b 65 79 '")))...... key
3ce0: 70 61 74 74 73 29 0a 09 09 09 09 20 20 20 20 20 patts).....
3cf0: 22 20 41 4e 44 20 22 29 29 29 0a 09 09 09 20 20 " AND ")))....
3d00: 22 20 4f 52 44 45 52 20 42 59 20 65 76 65 6e 74 " ORDER BY event
3d10: 5f 74 69 6d 65 20 44 45 53 43 20 22 0a 09 09 09 _time DESC "....
3d20: 20 20 28 69 66 20 28 6e 75 6d 62 65 72 3f 20 63 (if (number? c
3d30: 6f 75 6e 74 29 0a 09 09 09 20 20 20 20 20 20 28 ount).... (
3d40: 63 6f 6e 63 20 22 20 4c 49 4d 49 54 20 22 20 63 conc " LIMIT " c
3d50: 6f 75 6e 74 29 0a 09 09 09 20 20 20 20 20 20 22 ount).... "
3d60: 22 29 0a 09 09 09 20 20 28 69 66 20 28 6e 75 6d ").... (if (num
3d70: 62 65 72 3f 20 6f 66 66 73 65 74 29 0a 09 09 09 ber? offset)....
3d80: 20 20 20 20 20 20 28 63 6f 6e 63 20 22 20 4f 46 (conc " OF
3d90: 46 53 45 54 20 22 20 6f 66 66 73 65 74 29 0a 09 FSET " offset)..
3da0: 09 09 20 20 20 20 20 20 22 22 29 29 29 29 0a 20 .. "")))).
3db0: 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 (debug:print
3dc0: 34 20 22 64 62 3a 67 65 74 2d 72 75 6e 73 20 71 4 "db:get-runs q
3dd0: 72 79 73 74 72 3a 20 22 20 71 72 79 73 74 72 20 rystr: " qrystr
3de0: 22 5c 6e 6b 65 79 70 61 74 74 73 3a 20 22 20 6b "\nkeypatts: " k
3df0: 65 79 70 61 74 74 73 20 22 5c 6e 20 20 6f 66 66 eypatts "\n off
3e00: 73 65 74 3a 20 22 20 6f 66 66 73 65 74 20 22 20 set: " offset "
3e10: 6c 69 6d 69 74 3a 20 22 20 63 6f 75 6e 74 29 0a limit: " count).
3e20: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 (sqlite3:for
3e30: 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 -each-row. (
3e40: 6c 61 6d 62 64 61 20 28 61 20 2e 20 78 29 0a 20 lambda (a . x).
3e50: 20 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20 (set! res
3e60: 28 63 6f 6e 73 20 28 61 70 70 6c 79 20 76 65 63 (cons (apply vec
3e70: 74 6f 72 20 61 20 78 29 20 72 65 73 29 29 29 0a tor a x) res))).
3e80: 20 20 20 20 20 64 62 0a 20 20 20 20 20 71 72 79 db. qry
3e90: 73 74 72 0a 20 20 20 20 20 72 75 6e 70 61 74 74 str. runpatt
3ea0: 29 0a 20 20 20 20 28 76 65 63 74 6f 72 20 68 65 ). (vector he
3eb0: 61 64 65 72 20 72 65 73 29 29 29 0a 0a 3b 3b 20 ader res)))..;;
3ec0: 6a 75 73 74 20 67 65 74 20 63 6f 75 6e 74 20 6f just get count o
3ed0: 66 20 72 75 6e 73 0a 28 64 65 66 69 6e 65 20 28 f runs.(define (
3ee0: 64 62 3a 67 65 74 2d 6e 75 6d 2d 72 75 6e 73 20 db:get-num-runs
3ef0: 64 62 20 72 75 6e 70 61 74 74 29 0a 20 20 28 6c db runpatt). (l
3f00: 65 74 20 28 28 6e 75 6d 72 75 6e 73 20 30 29 29 et ((numruns 0))
3f10: 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f . (sqlite3:fo
3f20: 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20 20 20 r-each-row .
3f30: 20 28 6c 61 6d 62 64 61 20 28 63 6f 75 6e 74 29 (lambda (count)
3f40: 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 6e 75 . (set! nu
3f50: 6d 72 75 6e 73 20 63 6f 75 6e 74 29 29 0a 20 20 mruns count)).
3f60: 20 20 20 64 62 0a 20 20 20 20 20 22 53 45 4c 45 db. "SELE
3f70: 43 54 20 43 4f 55 4e 54 28 69 64 29 20 46 52 4f CT COUNT(id) FRO
3f80: 4d 20 72 75 6e 73 20 57 48 45 52 45 20 72 75 6e M runs WHERE run
3f90: 6e 61 6d 65 20 4c 49 4b 45 20 3f 3b 22 20 72 75 name LIKE ?;" ru
3fa0: 6e 70 61 74 74 29 0a 20 20 20 20 6e 75 6d 72 75 npatt). numru
3fb0: 6e 73 29 29 0a 0a 0a 3b 3b 20 75 73 65 20 28 67 ns))...;; use (g
3fc0: 65 74 2d 76 61 6c 75 65 2d 62 79 2d 68 65 61 64 et-value-by-head
3fd0: 65 72 20 28 64 62 3a 67 65 74 2d 68 65 61 64 65 er (db:get-heade
3fe0: 72 20 72 75 6e 69 6e 66 6f 29 28 64 62 3a 67 65 r runinfo)(db:ge
3ff0: 74 2d 72 6f 77 20 72 75 6e 69 6e 66 6f 29 29 0a t-row runinfo)).
4000: 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d (define (db:get-
4010: 72 75 6e 2d 69 6e 66 6f 20 64 62 20 72 75 6e 2d run-info db run-
4020: 69 64 29 0a 20 20 28 6c 65 74 2a 20 28 28 72 65 id). (let* ((re
4030: 73 20 20 20 20 20 20 23 66 29 0a 09 20 28 6b 65 s #f).. (ke
4040: 79 73 20 20 20 20 20 20 28 64 62 2d 67 65 74 2d ys (db-get-
4050: 6b 65 79 73 20 64 62 29 29 0a 09 20 28 72 65 6d keys db)).. (rem
4060: 66 69 65 6c 64 73 20 28 6c 69 73 74 20 22 69 64 fields (list "id
4070: 22 20 22 72 75 6e 6e 61 6d 65 22 20 22 73 74 61 " "runname" "sta
4080: 74 65 22 20 22 73 74 61 74 75 73 22 20 22 6f 77 te" "status" "ow
4090: 6e 65 72 22 20 22 65 76 65 6e 74 5f 74 69 6d 65 ner" "event_time
40a0: 22 29 29 0a 09 20 28 68 65 61 64 65 72 20 20 20 ")).. (header
40b0: 20 28 61 70 70 65 6e 64 20 28 6d 61 70 20 6b 65 (append (map ke
40c0: 79 3a 67 65 74 2d 66 69 65 6c 64 6e 61 6d 65 20 y:get-fieldname
40d0: 6b 65 79 73 29 0a 09 09 09 20 20 20 20 72 65 6d keys).... rem
40e0: 66 69 65 6c 64 73 29 29 0a 09 20 28 6b 65 79 73 fields)).. (keys
40f0: 74 72 20 20 20 20 28 63 6f 6e 63 20 28 6b 65 79 tr (conc (key
4100: 73 2d 3e 6b 65 79 73 74 72 20 6b 65 79 73 29 20 s->keystr keys)
4110: 22 2c 22 0a 09 09 09 20 20 28 73 74 72 69 6e 67 ",".... (string
4120: 2d 69 6e 74 65 72 73 70 65 72 73 65 20 72 65 6d -intersperse rem
4130: 66 69 65 6c 64 73 20 22 2c 22 29 29 29 29 0a 20 fields ",")))).
4140: 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 (debug:print
4150: 30 20 22 64 62 3a 67 65 74 2d 72 75 6e 2d 69 6e 0 "db:get-run-in
4160: 66 6f 20 72 75 6e 2d 69 64 3a 20 22 20 72 75 6e fo run-id: " run
4170: 2d 69 64 20 22 20 68 65 61 64 65 72 3a 20 22 20 -id " header: "
4180: 68 65 61 64 65 72 20 22 20 6b 65 79 73 74 72 3a header " keystr:
4190: 20 22 20 6b 65 79 73 74 72 29 0a 20 20 20 20 28 " keystr). (
41a0: 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 sqlite3:for-each
41b0: 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 64 -row. (lambd
41c0: 61 20 28 61 20 2e 20 78 29 0a 20 20 20 20 20 20 a (a . x).
41d0: 20 28 73 65 74 21 20 72 65 73 20 28 61 70 70 6c (set! res (appl
41e0: 79 20 76 65 63 74 6f 72 20 61 20 78 29 29 29 0a y vector a x))).
41f0: 20 20 20 20 20 64 62 0a 20 20 20 20 20 28 63 6f db. (co
4200: 6e 63 20 22 53 45 4c 45 43 54 20 22 20 6b 65 79 nc "SELECT " key
4210: 73 74 72 20 22 20 46 52 4f 4d 20 72 75 6e 73 20 str " FROM runs
4220: 57 48 45 52 45 20 69 64 3d 3f 3b 22 29 0a 20 20 WHERE id=?;").
4230: 20 20 20 72 75 6e 2d 69 64 29 0a 20 20 20 20 28 run-id). (
4240: 76 65 63 74 6f 72 20 68 65 61 64 65 72 20 72 65 vector header re
4250: 73 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 s)))..(define (d
4260: 62 3a 73 65 74 2d 63 6f 6d 6d 65 6e 74 2d 66 6f b:set-comment-fo
4270: 72 2d 72 75 6e 20 64 62 20 72 75 6e 2d 69 64 20 r-run db run-id
4280: 63 6f 6d 6d 65 6e 74 29 0a 20 20 28 73 71 6c 69 comment). (sqli
4290: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 te3:execute db "
42a0: 55 50 44 41 54 45 20 72 75 6e 73 20 53 45 54 20 UPDATE runs SET
42b0: 63 6f 6d 6d 65 6e 74 3d 3f 20 57 48 45 52 45 20 comment=? WHERE
42c0: 69 64 3d 3f 3b 22 20 63 6f 6d 6d 65 6e 74 20 72 id=?;" comment r
42d0: 75 6e 2d 69 64 29 29 0a 0a 3b 3b 20 64 6f 65 73 un-id))..;; does
42e0: 20 6e 6f 74 20 28 6f 62 76 69 6f 75 73 6c 79 21 not (obviously!
42f0: 29 20 72 65 6d 6f 76 65 64 20 64 65 70 65 6e 64 ) removed depend
4300: 65 6e 74 20 64 61 74 61 2e 20 0a 28 64 65 66 69 ent data. .(defi
4310: 6e 65 20 28 64 62 3a 64 65 6c 65 74 65 2d 72 75 ne (db:delete-ru
4320: 6e 20 64 62 20 72 75 6e 2d 69 64 29 0a 20 20 28 n db run-id). (
4330: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 sqlite3:execute
4340: 64 62 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 db "DELETE FROM
4350: 72 75 6e 73 20 57 48 45 52 45 20 69 64 3d 3f 3b runs WHERE id=?;
4360: 22 20 72 75 6e 2d 69 64 29 29 0a 0a 28 64 65 66 " run-id))..(def
4370: 69 6e 65 20 28 64 62 3a 75 70 64 61 74 65 2d 72 ine (db:update-r
4380: 75 6e 2d 65 76 65 6e 74 5f 74 69 6d 65 20 64 62 un-event_time db
4390: 20 72 75 6e 2d 69 64 29 0a 20 20 28 73 71 6c 69 run-id). (sqli
43a0: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 te3:execute db "
43b0: 55 50 44 41 54 45 20 72 75 6e 73 20 53 45 54 20 UPDATE runs SET
43c0: 65 76 65 6e 74 5f 74 69 6d 65 3d 73 74 72 66 74 event_time=strft
43d0: 69 6d 65 28 27 25 73 27 2c 27 6e 6f 77 27 29 20 ime('%s','now')
43e0: 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 72 75 6e WHERE id=?;" run
43f0: 2d 69 64 29 29 20 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d -id)) ..;;======
4400: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
4410: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
4420: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
4430: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
4440: 0a 3b 3b 20 20 54 20 45 20 53 20 54 20 53 0a 3b .;; T E S T S.;
4450: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ;===============
4460: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
4470: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
4480: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
4490: 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 73 74 61 74 =======..;; stat
44a0: 65 73 20 61 6e 64 20 73 74 61 74 75 73 65 73 20 es and statuses
44b0: 61 72 65 20 6c 69 73 74 73 2c 20 74 75 72 6e 20 are lists, turn
44c0: 74 68 65 6d 20 69 6e 74 6f 20 28 22 50 41 53 53 them into ("PASS
44d0: 22 2c 22 46 41 49 4c 22 2e 2e 2e 29 20 61 6e 64 ","FAIL"...) and
44e0: 20 75 73 65 20 4e 4f 54 20 49 4e 0a 3b 3b 20 69 use NOT IN.;; i
44f0: 2e 65 2e 20 74 68 65 73 65 20 6c 69 73 74 73 20 .e. these lists
4500: 64 65 66 69 6e 65 20 77 68 61 74 20 74 6f 20 4e define what to N
4510: 4f 54 20 73 68 6f 77 2e 0a 3b 3b 20 73 74 61 74 OT show..;; stat
4520: 65 73 20 61 6e 64 20 73 74 61 74 75 73 65 73 20 es and statuses
4530: 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 are required to
4540: 62 65 20 6c 69 73 74 73 2c 20 65 6d 70 74 79 20 be lists, empty
4550: 69 73 20 6f 6b 0a 28 64 65 66 69 6e 65 20 28 64 is ok.(define (d
4560: 62 2d 67 65 74 2d 74 65 73 74 73 2d 66 6f 72 2d b-get-tests-for-
4570: 72 75 6e 20 64 62 20 72 75 6e 2d 69 64 20 74 65 run db run-id te
4580: 73 74 70 61 74 74 20 69 74 65 6d 70 61 74 74 20 stpatt itempatt
4590: 73 74 61 74 65 73 20 73 74 61 74 75 73 65 73 29 states statuses)
45a0: 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20 27 28 . (let ((res '(
45b0: 29 29 0a 09 28 73 74 61 74 65 73 2d 73 74 72 20 ))..(states-str
45c0: 20 20 20 28 63 6f 6e 63 20 22 28 27 22 20 28 73 (conc "('" (s
45d0: 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 tring-interspers
45e0: 65 20 73 74 61 74 65 73 20 20 20 22 27 2c 27 22 e states "','"
45f0: 29 20 22 27 29 22 29 29 0a 09 28 73 74 61 74 75 ) "')"))..(statu
4600: 73 65 73 2d 73 74 72 20 20 28 63 6f 6e 63 20 22 ses-str (conc "
4610: 28 27 22 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 ('" (string-inte
4620: 72 73 70 65 72 73 65 20 73 74 61 74 75 73 65 73 rsperse statuses
4630: 20 22 27 2c 27 22 29 20 22 27 29 22 29 29 0a 09 "','") "')"))..
4640: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 ). (sqlite3:f
4650: 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20 20 or-each-row .
4660: 20 20 28 6c 61 6d 62 64 61 20 28 69 64 20 72 75 (lambda (id ru
4670: 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 73 74 n-id testname st
4680: 61 74 65 20 73 74 61 74 75 73 20 65 76 65 6e 74 ate status event
4690: 2d 74 69 6d 65 20 68 6f 73 74 20 63 70 75 6c 6f -time host cpulo
46a0: 61 64 20 64 69 73 6b 66 72 65 65 20 75 6e 61 6d ad diskfree unam
46b0: 65 20 72 75 6e 64 69 72 20 69 74 65 6d 2d 70 61 e rundir item-pa
46c0: 74 68 20 72 75 6e 2d 64 75 72 61 74 69 6f 6e 20 th run-duration
46d0: 66 69 6e 61 6c 2d 6c 6f 67 66 20 63 6f 6d 6d 65 final-logf comme
46e0: 6e 74 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 nt). (set!
46f0: 20 72 65 73 20 28 63 6f 6e 73 20 28 76 65 63 74 res (cons (vect
4700: 6f 72 20 69 64 20 72 75 6e 2d 69 64 20 74 65 73 or id run-id tes
4710: 74 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61 74 tname state stat
4720: 75 73 20 65 76 65 6e 74 2d 74 69 6d 65 20 68 6f us event-time ho
4730: 73 74 20 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 st cpuload diskf
4740: 72 65 65 20 75 6e 61 6d 65 20 72 75 6e 64 69 72 ree uname rundir
4750: 20 69 74 65 6d 2d 70 61 74 68 20 72 75 6e 2d 64 item-path run-d
4760: 75 72 61 74 69 6f 6e 20 66 69 6e 61 6c 2d 6c 6f uration final-lo
4770: 67 66 20 63 6f 6d 6d 65 6e 74 29 20 72 65 73 29 gf comment) res)
4780: 29 29 0a 20 20 20 20 20 64 62 20 0a 20 20 20 20 )). db .
4790: 20 28 63 6f 6e 63 20 22 53 45 4c 45 43 54 20 69 (conc "SELECT i
47a0: 64 2c 72 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d d,run_id,testnam
47b0: 65 2c 73 74 61 74 65 2c 73 74 61 74 75 73 2c 65 e,state,status,e
47c0: 76 65 6e 74 5f 74 69 6d 65 2c 68 6f 73 74 2c 63 vent_time,host,c
47d0: 70 75 6c 6f 61 64 2c 64 69 73 6b 66 72 65 65 2c puload,diskfree,
47e0: 75 6e 61 6d 65 2c 72 75 6e 64 69 72 2c 69 74 65 uname,rundir,ite
47f0: 6d 5f 70 61 74 68 2c 72 75 6e 5f 64 75 72 61 74 m_path,run_durat
4800: 69 6f 6e 2c 66 69 6e 61 6c 5f 6c 6f 67 66 2c 63 ion,final_logf,c
4810: 6f 6d 6d 65 6e 74 20 22 0a 09 20 20 20 22 20 46 omment ".. " F
4820: 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 ROM tests WHERE
4830: 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 run_id=? AND tes
4840: 74 6e 61 6d 65 20 6c 69 6b 65 20 3f 20 41 4e 44 tname like ? AND
4850: 20 69 74 65 6d 5f 70 61 74 68 20 4c 49 4b 45 20 item_path LIKE
4860: 3f 20 22 20 0a 09 20 20 20 22 20 41 4e 44 20 4e ? " .. " AND N
4870: 4f 54 20 28 73 74 61 74 65 20 69 6e 20 22 20 73 OT (state in " s
4880: 74 61 74 65 73 2d 73 74 72 20 22 20 41 4e 44 20 tates-str " AND
4890: 73 74 61 74 75 73 20 49 4e 20 22 20 73 74 61 74 status IN " stat
48a0: 75 73 65 73 2d 73 74 72 20 22 29 20 22 0a 09 20 uses-str ") "..
48b0: 20 20 22 20 4f 52 44 45 52 20 42 59 20 69 64 20 " ORDER BY id
48c0: 44 45 53 43 3b 22 29 0a 20 20 20 20 20 72 75 6e DESC;"). run
48d0: 2d 69 64 0a 20 20 20 20 20 28 69 66 20 74 65 73 -id. (if tes
48e0: 74 70 61 74 74 20 74 65 73 74 70 61 74 74 20 22 tpatt testpatt "
48f0: 25 22 29 0a 20 20 20 20 20 28 69 66 20 69 74 65 %"). (if ite
4900: 6d 70 61 74 74 20 69 74 65 6d 70 61 74 74 20 22 mpatt itempatt "
4910: 25 22 29 29 0a 20 20 20 20 72 65 73 29 29 0a 0a %")). res))..
4920: 3b 3b 20 74 68 69 73 20 6f 6e 65 20 69 73 20 61 ;; this one is a
4930: 20 62 69 74 20 62 72 6f 6b 65 6e 20 42 55 47 20 bit broken BUG
4940: 46 49 58 4d 45 0a 28 64 65 66 69 6e 65 20 28 64 FIXME.(define (d
4950: 62 3a 64 65 6c 65 74 65 2d 74 65 73 74 2d 73 74 b:delete-test-st
4960: 65 70 2d 72 65 63 6f 72 64 73 20 64 62 20 72 75 ep-records db ru
4970: 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 n-id test-name i
4980: 74 65 6d 64 61 74 29 0a 20 20 28 73 71 6c 69 74 temdat). (sqlit
4990: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 44 e3:execute db "D
49a0: 45 4c 45 54 45 20 46 52 4f 4d 20 74 65 73 74 5f ELETE FROM test_
49b0: 73 74 65 70 73 20 57 48 45 52 45 20 74 65 73 74 steps WHERE test
49c0: 5f 69 64 20 69 6e 20 28 53 45 4c 45 43 54 20 69 _id in (SELECT i
49d0: 64 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 d FROM tests WHE
49e0: 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 RE run_id=? AND
49f0: 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 testname=? AND i
4a00: 74 65 6d 5f 70 61 74 68 3d 3f 29 3b 22 20 0a 09 tem_path=?);" ..
4a10: 09 20 20 20 72 75 6e 2d 69 64 20 74 65 73 74 2d . run-id test-
4a20: 6e 61 6d 65 20 28 69 74 65 6d 2d 6c 69 73 74 2d name (item-list-
4a30: 3e 70 61 74 68 20 69 74 65 6d 64 61 74 29 29 29 >path itemdat)))
4a40: 0a 3b 3b 20 0a 28 64 65 66 69 6e 65 20 28 64 62 .;; .(define (db
4a50: 3a 64 65 6c 65 74 65 2d 74 65 73 74 2d 72 65 63 :delete-test-rec
4a60: 6f 72 64 73 20 64 62 20 74 65 73 74 2d 69 64 29 ords db test-id)
4a70: 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 . (sqlite3:exec
4a80: 75 74 65 20 64 62 20 22 44 45 4c 45 54 45 20 46 ute db "DELETE F
4a90: 52 4f 4d 20 74 65 73 74 5f 73 74 65 70 73 20 57 ROM test_steps W
4aa0: 48 45 52 45 20 74 65 73 74 5f 69 64 3d 3f 3b 22 HERE test_id=?;"
4ab0: 20 74 65 73 74 2d 69 64 29 0a 20 20 28 73 71 6c test-id). (sql
4ac0: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 ite3:execute db
4ad0: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 65 73 "DELETE FROM tes
4ae0: 74 5f 64 61 74 61 20 20 57 48 45 52 45 20 74 65 t_data WHERE te
4af0: 73 74 5f 69 64 3d 3f 3b 22 20 74 65 73 74 2d 69 st_id=?;" test-i
4b00: 64 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 d). (sqlite3:ex
4b10: 65 63 75 74 65 20 64 62 20 22 44 45 4c 45 54 45 ecute db "DELETE
4b20: 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 FROM tests WHER
4b30: 45 20 69 64 3d 3f 3b 22 20 74 65 73 74 2d 69 64 E id=?;" test-id
4b40: 29 29 0a 0a 3b 3b 20 73 65 74 20 74 65 73 74 73 ))..;; set tests
4b50: 20 77 69 74 68 20 73 74 61 74 65 20 63 75 72 72 with state curr
4b60: 73 74 61 74 65 20 61 6e 64 20 73 74 61 74 75 73 state and status
4b70: 20 63 75 72 72 73 74 61 74 75 73 20 74 6f 20 6e currstatus to n
4b80: 65 77 73 74 61 74 65 20 61 6e 64 20 6e 65 77 73 ewstate and news
4b90: 74 61 74 75 73 0a 3b 3b 20 75 73 65 20 63 75 72 tatus.;; use cur
4ba0: 72 73 74 61 74 65 20 3d 20 23 66 20 61 6e 64 20 rstate = #f and
4bb0: 6f 72 20 63 75 72 72 73 74 61 74 75 73 20 3d 20 or currstatus =
4bc0: 23 66 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 61 #f to apply to a
4bd0: 6e 79 20 73 74 61 74 65 20 6f 72 20 73 74 61 74 ny state or stat
4be0: 75 73 20 72 65 73 70 65 63 74 69 76 65 6c 79 0a us respectively.
4bf0: 3b 3b 20 57 41 52 4e 49 4e 47 3a 20 53 51 4c 20 ;; WARNING: SQL
4c00: 69 6e 6a 65 63 74 69 6f 6e 20 72 69 73 6b 0a 28 injection risk.(
4c10: 64 65 66 69 6e 65 20 28 64 62 3a 73 65 74 2d 74 define (db:set-t
4c20: 65 73 74 73 2d 73 74 61 74 65 2d 73 74 61 74 75 ests-state-statu
4c30: 73 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 s db run-id test
4c40: 6e 61 6d 65 73 20 63 75 72 72 73 74 61 74 65 20 names currstate
4c50: 63 75 72 72 73 74 61 74 75 73 20 6e 65 77 73 74 currstatus newst
4c60: 61 74 65 20 6e 65 77 73 74 61 74 75 73 29 0a 20 ate newstatus).
4c70: 20 28 66 6f 72 2d 65 61 63 68 20 28 6c 61 6d 62 (for-each (lamb
4c80: 64 61 20 28 74 65 73 74 6e 61 6d 65 29 0a 09 20 da (testname)..
4c90: 20 20 20 20 20 28 6c 65 74 20 28 28 71 72 79 20 (let ((qry
4ca0: 28 63 6f 6e 63 20 22 55 50 44 41 54 45 20 74 65 (conc "UPDATE te
4cb0: 73 74 73 20 53 45 54 20 73 74 61 74 65 3d 3f 2c sts SET state=?,
4cc0: 73 74 61 74 75 73 3d 3f 20 57 48 45 52 45 20 22 status=? WHERE "
4cd0: 0a 09 09 09 09 09 28 69 66 20 63 75 72 72 73 74 ......(if currst
4ce0: 61 74 65 20 20 28 63 6f 6e 63 20 22 73 74 61 74 ate (conc "stat
4cf0: 65 3d 27 22 20 63 75 72 72 73 74 61 74 65 20 22 e='" currstate "
4d00: 27 20 41 4e 44 20 22 29 20 22 22 29 0a 09 09 09 ' AND ") "")....
4d10: 09 09 28 69 66 20 63 75 72 72 73 74 61 74 75 73 ..(if currstatus
4d20: 20 28 63 6f 6e 63 20 22 73 74 61 74 75 73 3d 27 (conc "status='
4d30: 22 20 63 75 72 72 73 74 61 74 75 73 20 22 27 20 " currstatus "'
4d40: 41 4e 44 20 22 29 20 22 22 29 0a 09 09 09 09 09 AND ") "")......
4d50: 22 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 " run_id=? AND t
4d60: 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 4e 4f estname=? AND NO
4d70: 54 20 28 69 74 65 6d 5f 70 61 74 68 3d 27 27 20 T (item_path=''
4d80: 41 4e 44 20 74 65 73 74 6e 61 6d 65 20 69 6e 20 AND testname in
4d90: 28 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 (SELECT DISTINCT
4da0: 20 74 65 73 74 6e 61 6d 65 20 46 52 4f 4d 20 74 testname FROM t
4db0: 65 73 74 73 20 57 48 45 52 45 20 74 65 73 74 6e ests WHERE testn
4dc0: 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 ame=? AND item_p
4dd0: 61 74 68 20 21 3d 20 27 27 29 29 3b 22 29 29 29 ath != ''));")))
4de0: 0a 09 09 3b 3b 28 64 65 62 75 67 3a 70 72 69 6e ...;;(debug:prin
4df0: 74 20 30 20 22 51 52 59 3a 20 22 20 71 72 79 29 t 0 "QRY: " qry)
4e00: 0a 09 09 28 73 71 6c 69 74 65 33 3a 65 78 65 63 ...(sqlite3:exec
4e10: 75 74 65 20 64 62 20 71 72 79 20 72 75 6e 2d 69 ute db qry run-i
4e20: 64 20 6e 65 77 73 74 61 74 65 20 6e 65 77 73 74 d newstate newst
4e30: 61 74 75 73 20 74 65 73 74 6e 61 6d 65 20 74 65 atus testname te
4e40: 73 74 6e 61 6d 65 29 29 29 0a 09 20 20 20 20 74 stname))).. t
4e50: 65 73 74 6e 61 6d 65 73 29 29 0a 0a 28 64 65 66 estnames))..(def
4e60: 69 6e 65 20 28 64 62 3a 64 65 6c 65 74 65 2d 74 ine (db:delete-t
4e70: 65 73 74 73 2d 69 6e 2d 73 74 61 74 65 20 64 62 ests-in-state db
4e80: 20 72 75 6e 2d 69 64 20 73 74 61 74 65 29 0a 20 run-id state).
4e90: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 (sqlite3:execut
4ea0: 65 20 64 62 20 22 44 45 4c 45 54 45 20 46 52 4f e db "DELETE FRO
4eb0: 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 73 74 M tests WHERE st
4ec0: 61 74 65 3d 3f 20 41 4e 44 20 72 75 6e 5f 69 64 ate=? AND run_id
4ed0: 3d 3f 3b 22 20 73 74 61 74 65 20 72 75 6e 2d 69 =?;" state run-i
4ee0: 64 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 d))..(define (db
4ef0: 3a 74 65 73 74 2d 73 65 74 2d 73 74 61 74 65 2d :test-set-state-
4f00: 73 74 61 74 75 73 2d 62 79 2d 69 64 20 64 62 20 status-by-id db
4f10: 74 65 73 74 2d 69 64 20 6e 65 77 73 74 61 74 65 test-id newstate
4f20: 20 6e 65 77 73 74 61 74 75 73 20 6e 65 77 63 6f newstatus newco
4f30: 6d 6d 65 6e 74 29 0a 20 20 28 69 66 20 6e 65 77 mment). (if new
4f40: 73 74 61 74 65 20 20 20 28 73 71 6c 69 74 65 33 state (sqlite3
4f50: 3a 65 78 65 63 75 74 65 20 64 62 20 22 55 50 44 :execute db "UPD
4f60: 41 54 45 20 74 65 73 74 73 20 53 45 54 20 73 74 ATE tests SET st
4f70: 61 74 65 3d 3f 20 20 20 57 48 45 52 45 20 69 64 ate=? WHERE id
4f80: 3d 3f 3b 22 20 6e 65 77 73 74 61 74 65 20 20 20 =?;" newstate
4f90: 74 65 73 74 2d 69 64 29 29 0a 20 20 28 69 66 20 test-id)). (if
4fa0: 6e 65 77 73 74 61 74 75 73 20 20 28 73 71 6c 69 newstatus (sqli
4fb0: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 te3:execute db "
4fc0: 55 50 44 41 54 45 20 74 65 73 74 73 20 53 45 54 UPDATE tests SET
4fd0: 20 73 74 61 74 75 73 3d 3f 20 20 57 48 45 52 45 status=? WHERE
4fe0: 20 69 64 3d 3f 3b 22 20 6e 65 77 73 74 61 74 75 id=?;" newstatu
4ff0: 73 20 20 74 65 73 74 2d 69 64 29 29 0a 20 20 28 s test-id)). (
5000: 69 66 20 6e 65 77 63 6f 6d 6d 65 6e 74 20 28 73 if newcomment (s
5010: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 qlite3:execute d
5020: 62 20 22 55 50 44 41 54 45 20 74 65 73 74 73 20 b "UPDATE tests
5030: 53 45 54 20 63 6f 6d 6d 65 6e 74 3d 3f 20 57 48 SET comment=? WH
5040: 45 52 45 20 69 64 3d 3f 3b 22 20 6e 65 77 63 6f ERE id=?;" newco
5050: 6d 6d 65 6e 74 20 74 65 73 74 2d 69 64 29 29 29 mment test-id)))
5060: 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 ..(define (db:ge
5070: 74 2d 63 6f 75 6e 74 2d 74 65 73 74 73 2d 72 75 t-count-tests-ru
5080: 6e 6e 69 6e 67 20 64 62 29 0a 20 20 28 6c 65 74 nning db). (let
5090: 20 28 28 72 65 73 20 30 29 29 0a 20 20 20 20 28 ((res 0)). (
50a0: 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 sqlite3:for-each
50b0: 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 64 -row. (lambd
50c0: 61 20 28 63 6f 75 6e 74 29 0a 20 20 20 20 20 20 a (count).
50d0: 20 28 73 65 74 21 20 72 65 73 20 63 6f 75 6e 74 (set! res count
50e0: 29 29 0a 20 20 20 20 20 64 62 0a 20 20 20 20 20 )). db.
50f0: 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 69 64 "SELECT count(id
5100: 29 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 ) FROM tests WHE
5110: 52 45 20 73 74 61 74 65 20 3d 20 27 52 55 4e 4e RE state = 'RUNN
5120: 49 4e 47 27 20 4f 52 20 73 74 61 74 65 20 3d 20 ING' OR state =
5130: 27 4c 41 55 4e 43 48 45 44 27 20 4f 52 20 73 74 'LAUNCHED' OR st
5140: 61 74 65 20 3d 20 27 52 45 4d 4f 54 45 48 4f 53 ate = 'REMOTEHOS
5150: 54 53 54 41 52 54 27 3b 22 29 0a 20 20 20 20 72 TSTART';"). r
5160: 65 73 29 29 0a 0a 3b 3b 20 64 6f 6e 65 20 77 69 es))..;; done wi
5170: 74 68 20 72 75 6e 20 77 68 65 6e 3a 0a 3b 3b 20 th run when:.;;
5180: 20 20 30 20 74 65 73 74 73 20 69 6e 20 4c 41 55 0 tests in LAU
5190: 4e 43 48 45 44 2c 20 4e 4f 54 5f 53 54 41 52 54 NCHED, NOT_START
51a0: 45 44 2c 20 52 45 4d 4f 54 45 48 4f 53 54 53 54 ED, REMOTEHOSTST
51b0: 41 52 54 2c 20 52 55 4e 4e 49 4e 47 0a 28 64 65 ART, RUNNING.(de
51c0: 66 69 6e 65 20 28 64 62 3a 65 73 74 69 6d 61 74 fine (db:estimat
51d0: 65 64 2d 74 65 73 74 73 2d 72 65 6d 61 69 6e 69 ed-tests-remaini
51e0: 6e 67 20 64 62 20 72 75 6e 2d 69 64 29 0a 20 20 ng db run-id).
51f0: 28 6c 65 74 20 28 28 72 65 73 20 30 29 29 0a 20 (let ((res 0)).
5200: 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d (sqlite3:for-
5210: 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c each-row. (l
5220: 61 6d 62 64 61 20 28 63 6f 75 6e 74 29 0a 20 20 ambda (count).
5230: 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20 63 (set! res c
5240: 6f 75 6e 74 29 29 0a 20 20 20 20 20 64 62 20 3b ount)). db ;
5250: 3b 20 4e 42 2f 2f 20 4b 49 4c 4c 52 45 51 20 6d ; NB// KILLREQ m
5260: 65 61 6e 73 20 74 68 65 20 6a 6f 62 73 20 69 73 eans the jobs is
5270: 20 73 74 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 still probably
5280: 72 75 6e 6e 69 6e 67 0a 20 20 20 20 20 22 53 45 running. "SE
5290: 4c 45 43 54 20 63 6f 75 6e 74 28 69 64 29 20 46 LECT count(id) F
52a0: 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 ROM tests WHERE
52b0: 73 74 61 74 65 20 69 6e 20 28 27 4c 41 55 4e 43 state in ('LAUNC
52c0: 48 45 44 27 2c 27 4e 4f 54 5f 53 54 41 52 54 45 HED','NOT_STARTE
52d0: 44 27 2c 27 52 45 4d 4f 54 45 48 4f 53 54 53 54 D','REMOTEHOSTST
52e0: 41 52 54 27 2c 27 52 55 4e 4e 49 4e 47 27 2c 27 ART','RUNNING','
52f0: 4b 49 4c 4c 52 45 51 27 29 20 41 4e 44 20 72 75 KILLREQ') AND ru
5300: 6e 5f 69 64 3d 3f 3b 22 20 72 75 6e 2d 69 64 29 n_id=?;" run-id)
5310: 0a 20 20 20 20 72 65 73 29 29 0a 0a 3b 3b 20 4e . res))..;; N
5320: 42 2f 2f 20 53 79 6e 63 20 74 68 69 73 20 77 69 B// Sync this wi
5330: 74 68 20 72 75 6e 73 3a 67 65 74 2d 74 65 73 74 th runs:get-test
5340: 2d 69 6e 66 6f 0a 28 64 65 66 69 6e 65 20 28 64 -info.(define (d
5350: 62 3a 67 65 74 2d 74 65 73 74 2d 69 6e 66 6f 20 b:get-test-info
5360: 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 db run-id testna
5370: 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 0a 20 20 me item-path).
5380: 28 6c 65 74 20 28 28 72 65 73 20 23 66 29 29 0a (let ((res #f)).
5390: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 (sqlite3:for
53a0: 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 -each-row. (
53b0: 6c 61 6d 62 64 61 20 28 69 64 20 72 75 6e 2d 69 lambda (id run-i
53c0: 64 20 74 65 73 74 6e 61 6d 65 20 73 74 61 74 65 d testname state
53d0: 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d 74 69 status event-ti
53e0: 6d 65 20 68 6f 73 74 20 63 70 75 6c 6f 61 64 20 me host cpuload
53f0: 64 69 73 6b 66 72 65 65 20 75 6e 61 6d 65 20 72 diskfree uname r
5400: 75 6e 64 69 72 20 69 74 65 6d 2d 70 61 74 68 20 undir item-path
5410: 72 75 6e 5f 64 75 72 61 74 69 6f 6e 20 66 69 6e run_duration fin
5420: 61 6c 5f 6c 6f 67 66 20 63 6f 6d 6d 65 6e 74 20 al_logf comment
5430: 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72 ). (set! r
5440: 65 73 20 28 76 65 63 74 6f 72 20 69 64 20 72 75 es (vector id ru
5450: 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 73 74 n-id testname st
5460: 61 74 65 20 73 74 61 74 75 73 20 65 76 65 6e 74 ate status event
5470: 2d 74 69 6d 65 20 68 6f 73 74 20 63 70 75 6c 6f -time host cpulo
5480: 61 64 20 64 69 73 6b 66 72 65 65 20 75 6e 61 6d ad diskfree unam
5490: 65 20 72 75 6e 64 69 72 20 69 74 65 6d 2d 70 61 e rundir item-pa
54a0: 74 68 20 72 75 6e 5f 64 75 72 61 74 69 6f 6e 20 th run_duration
54b0: 66 69 6e 61 6c 5f 6c 6f 67 66 20 63 6f 6d 6d 65 final_logf comme
54c0: 6e 74 20 29 29 29 0a 20 20 20 20 20 64 62 20 0a nt ))). db .
54d0: 20 20 20 20 20 22 53 45 4c 45 43 54 20 69 64 2c "SELECT id,
54e0: 72 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d 65 2c run_id,testname,
54f0: 73 74 61 74 65 2c 73 74 61 74 75 73 2c 65 76 65 state,status,eve
5500: 6e 74 5f 74 69 6d 65 2c 68 6f 73 74 2c 63 70 75 nt_time,host,cpu
5510: 6c 6f 61 64 2c 64 69 73 6b 66 72 65 65 2c 75 6e load,diskfree,un
5520: 61 6d 65 2c 72 75 6e 64 69 72 2c 69 74 65 6d 5f ame,rundir,item_
5530: 70 61 74 68 2c 72 75 6e 5f 64 75 72 61 74 69 6f path,run_duratio
5540: 6e 2c 66 69 6e 61 6c 5f 6c 6f 67 66 2c 63 6f 6d n,final_logf,com
5550: 6d 65 6e 74 20 46 52 4f 4d 20 74 65 73 74 73 20 ment FROM tests
5560: 57 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 WHERE run_id=? A
5570: 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e ND testname=? AN
5580: 44 20 69 74 65 6d 5f 70 61 74 68 3d 3f 3b 22 0a D item_path=?;".
5590: 20 20 20 20 20 72 75 6e 2d 69 64 20 74 65 73 74 run-id test
55a0: 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 0a name item-path).
55b0: 20 20 20 20 72 65 73 29 29 0a 0a 3b 3b 20 47 65 res))..;; Ge
55c0: 74 20 74 65 73 74 20 64 61 74 61 20 75 73 69 6e t test data usin
55d0: 67 20 74 65 73 74 5f 69 64 0a 28 64 65 66 69 6e g test_id.(defin
55e0: 65 20 28 64 62 3a 67 65 74 2d 74 65 73 74 2d 64 e (db:get-test-d
55f0: 61 74 61 2d 62 79 2d 69 64 20 64 62 20 74 65 73 ata-by-id db tes
5600: 74 2d 69 64 29 0a 20 20 28 6c 65 74 20 28 28 72 t-id). (let ((r
5610: 65 73 20 23 66 29 29 0a 20 20 20 20 28 73 71 6c es #f)). (sql
5620: 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f ite3:for-each-ro
5630: 77 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 w. (lambda (
5640: 69 64 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 id run-id testna
5650: 6d 65 20 73 74 61 74 65 20 73 74 61 74 75 73 20 me state status
5660: 65 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73 74 20 event-time host
5670: 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 cpuload diskfree
5680: 20 75 6e 61 6d 65 20 72 75 6e 64 69 72 20 69 74 uname rundir it
5690: 65 6d 2d 70 61 74 68 20 72 75 6e 5f 64 75 72 61 em-path run_dura
56a0: 74 69 6f 6e 20 66 69 6e 61 6c 5f 6c 6f 67 66 20 tion final_logf
56b0: 63 6f 6d 6d 65 6e 74 29 0a 20 20 20 20 20 20 20 comment).
56c0: 28 73 65 74 21 20 72 65 73 20 28 76 65 63 74 6f (set! res (vecto
56d0: 72 20 69 64 20 72 75 6e 2d 69 64 20 74 65 73 74 r id run-id test
56e0: 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61 74 75 name state statu
56f0: 73 20 65 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73 s event-time hos
5700: 74 20 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 t cpuload diskfr
5710: 65 65 20 75 6e 61 6d 65 20 72 75 6e 64 69 72 20 ee uname rundir
5720: 69 74 65 6d 2d 70 61 74 68 20 72 75 6e 5f 64 75 item-path run_du
5730: 72 61 74 69 6f 6e 20 66 69 6e 61 6c 5f 6c 6f 67 ration final_log
5740: 66 20 63 6f 6d 6d 65 6e 74 29 29 29 0a 20 20 20 f comment))).
5750: 20 20 64 62 20 0a 20 20 20 20 20 22 53 45 4c 45 db . "SELE
5760: 43 54 20 69 64 2c 72 75 6e 5f 69 64 2c 74 65 73 CT id,run_id,tes
5770: 74 6e 61 6d 65 2c 73 74 61 74 65 2c 73 74 61 74 tname,state,stat
5780: 75 73 2c 65 76 65 6e 74 5f 74 69 6d 65 2c 68 6f us,event_time,ho
5790: 73 74 2c 63 70 75 6c 6f 61 64 2c 64 69 73 6b 66 st,cpuload,diskf
57a0: 72 65 65 2c 75 6e 61 6d 65 2c 72 75 6e 64 69 72 ree,uname,rundir
57b0: 2c 69 74 65 6d 5f 70 61 74 68 2c 72 75 6e 5f 64 ,item_path,run_d
57c0: 75 72 61 74 69 6f 6e 2c 66 69 6e 61 6c 5f 6c 6f uration,final_lo
57d0: 67 66 2c 63 6f 6d 6d 65 6e 74 20 46 52 4f 4d 20 gf,comment FROM
57e0: 74 65 73 74 73 20 57 48 45 52 45 20 69 64 3d 3f tests WHERE id=?
57f0: 3b 22 0a 20 20 20 20 20 74 65 73 74 2d 69 64 29 ;". test-id)
5800: 0a 20 20 20 20 72 65 73 29 29 0a 0a 0a 28 64 65 . res))...(de
5810: 66 69 6e 65 20 28 64 62 3a 74 65 73 74 2d 73 65 fine (db:test-se
5820: 74 2d 63 6f 6d 6d 65 6e 74 20 64 62 20 72 75 6e t-comment db run
5830: 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 69 74 65 -id testname ite
5840: 6d 2d 70 61 74 68 20 63 6f 6d 6d 65 6e 74 29 0a m-path comment).
5850: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 (sqlite3:execu
5860: 74 65 20 0a 20 20 20 64 62 20 0a 20 20 20 22 55 te . db . "U
5870: 50 44 41 54 45 20 74 65 73 74 73 20 53 45 54 20 PDATE tests SET
5880: 63 6f 6d 6d 65 6e 74 3d 3f 20 57 48 45 52 45 20 comment=? WHERE
5890: 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 run_id=? AND tes
58a0: 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d tname=? AND item
58b0: 5f 70 61 74 68 3d 3f 3b 22 0a 20 20 20 20 20 63 _path=?;". c
58c0: 6f 6d 6d 65 6e 74 20 72 75 6e 2d 69 64 20 74 65 omment run-id te
58d0: 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 stname item-path
58e0: 29 29 0a 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 28 ))..;;.(define (
58f0: 64 62 3a 74 65 73 74 2d 73 65 74 2d 72 75 6e 64 db:test-set-rund
5900: 69 72 21 20 64 62 20 72 75 6e 2d 69 64 20 74 65 ir! db run-id te
5910: 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 stname item-path
5920: 20 72 75 6e 64 69 72 29 0a 20 20 28 73 71 6c 69 rundir). (sqli
5930: 74 65 33 3a 65 78 65 63 75 74 65 20 0a 20 20 20 te3:execute .
5940: 64 62 20 0a 20 20 20 22 55 50 44 41 54 45 20 74 db . "UPDATE t
5950: 65 73 74 73 20 53 45 54 20 72 75 6e 64 69 72 3d ests SET rundir=
5960: 3f 20 57 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f ? WHERE run_id=?
5970: 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20 AND testname=?
5980: 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 3d 3f 3b AND item_path=?;
5990: 22 0a 20 20 20 20 20 72 75 6e 64 69 72 20 72 75 ". rundir ru
59a0: 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 69 74 n-id testname it
59b0: 65 6d 2d 70 61 74 68 29 29 0a 0a 3b 3b 3d 3d 3d em-path))..;;===
59c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
59d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
59e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
59f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5a00: 3d 3d 3d 0a 3b 3b 20 54 65 73 74 73 20 6d 65 74 ===.;; Tests met
5a10: 61 20 64 61 74 61 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d a data.;;=======
5a20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
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 0a ===============.
5a60: 0a 3b 3b 20 72 65 61 64 20 74 68 65 20 72 65 63 .;; read the rec
5a70: 6f 72 64 20 67 69 76 65 6e 20 61 20 74 65 73 74 ord given a test
5a80: 6e 61 6d 65 0a 28 64 65 66 69 6e 65 20 28 64 62 name.(define (db
5a90: 3a 74 65 73 74 6d 65 74 61 2d 67 65 74 2d 72 65 :testmeta-get-re
5aa0: 63 6f 72 64 20 64 62 20 74 65 73 74 6e 61 6d 65 cord db testname
5ab0: 29 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20 23 ). (let ((res #
5ac0: 66 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 f)). (sqlite3
5ad0: 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 :for-each-row.
5ae0: 20 20 20 28 6c 61 6d 62 64 61 20 28 69 64 20 74 (lambda (id t
5af0: 65 73 74 6e 61 6d 65 20 61 75 74 68 6f 72 20 6f estname author o
5b00: 77 6e 65 72 20 64 65 73 63 72 69 70 74 69 6f 6e wner description
5b10: 20 72 65 76 69 65 77 65 64 20 69 74 65 72 61 74 reviewed iterat
5b20: 65 64 20 61 76 67 5f 72 75 6e 74 69 6d 65 20 61 ed avg_runtime a
5b30: 76 67 5f 64 69 73 6b 20 74 61 67 73 29 0a 20 20 vg_disk tags).
5b40: 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28 (set! res (
5b50: 76 65 63 74 6f 72 20 69 64 20 74 65 73 74 6e 61 vector id testna
5b60: 6d 65 20 61 75 74 68 6f 72 20 6f 77 6e 65 72 20 me author owner
5b70: 64 65 73 63 72 69 70 74 69 6f 6e 20 72 65 76 69 description revi
5b80: 65 77 65 64 20 69 74 65 72 61 74 65 64 20 61 76 ewed iterated av
5b90: 67 5f 72 75 6e 74 69 6d 65 20 61 76 67 5f 64 69 g_runtime avg_di
5ba0: 73 6b 20 74 61 67 73 29 29 29 0a 20 20 20 20 20 sk tags))).
5bb0: 64 62 20 22 53 45 4c 45 43 54 20 69 64 2c 74 65 db "SELECT id,te
5bc0: 73 74 6e 61 6d 65 2c 61 75 74 68 6f 72 2c 6f 77 stname,author,ow
5bd0: 6e 65 72 2c 64 65 73 63 72 69 70 74 69 6f 6e 2c ner,description,
5be0: 72 65 76 69 65 77 65 64 2c 69 74 65 72 61 74 65 reviewed,iterate
5bf0: 64 2c 61 76 67 5f 72 75 6e 74 69 6d 65 2c 61 76 d,avg_runtime,av
5c00: 67 5f 64 69 73 6b 2c 74 61 67 73 20 46 52 4f 4d g_disk,tags FROM
5c10: 20 74 65 73 74 5f 6d 65 74 61 20 57 48 45 52 45 test_meta WHERE
5c20: 20 74 65 73 74 6e 61 6d 65 3d 3f 3b 22 0a 20 20 testname=?;".
5c30: 20 20 20 74 65 73 74 6e 61 6d 65 29 0a 20 20 20 testname).
5c40: 20 72 65 73 29 29 0a 0a 3b 3b 20 63 72 65 61 74 res))..;; creat
5c50: 65 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 66 e a new record f
5c60: 6f 72 20 61 20 67 69 76 65 6e 20 74 65 73 74 6e or a given testn
5c70: 61 6d 65 0a 28 64 65 66 69 6e 65 20 28 64 62 3a ame.(define (db:
5c80: 74 65 73 74 6d 65 74 61 2d 61 64 64 2d 72 65 63 testmeta-add-rec
5c90: 6f 72 64 20 64 62 20 74 65 73 74 6e 61 6d 65 29 ord db testname)
5ca0: 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 . (sqlite3:exec
5cb0: 75 74 65 20 64 62 20 22 49 4e 53 45 52 54 20 4f ute db "INSERT O
5cc0: 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 74 65 R IGNORE INTO te
5cd0: 73 74 5f 6d 65 74 61 20 28 74 65 73 74 6e 61 6d st_meta (testnam
5ce0: 65 2c 61 75 74 68 6f 72 2c 6f 77 6e 65 72 2c 64 e,author,owner,d
5cf0: 65 73 63 72 69 70 74 69 6f 6e 2c 72 65 76 69 65 escription,revie
5d00: 77 65 64 2c 69 74 65 72 61 74 65 64 2c 61 76 67 wed,iterated,avg
5d10: 5f 72 75 6e 74 69 6d 65 2c 61 76 67 5f 64 69 73 _runtime,avg_dis
5d20: 6b 2c 74 61 67 73 29 20 56 41 4c 55 45 53 20 28 k,tags) VALUES (
5d30: 3f 2c 27 27 2c 27 27 2c 27 27 2c 27 27 2c 27 27 ?,'','','','',''
5d40: 2c 27 27 2c 27 27 2c 27 27 29 3b 22 20 74 65 73 ,'','','');" tes
5d50: 74 6e 61 6d 65 29 29 0a 0a 3b 3b 20 75 70 64 61 tname))..;; upda
5d60: 74 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 65 te one of the te
5d70: 73 74 6d 65 74 61 20 66 69 65 6c 64 73 0a 28 64 stmeta fields.(d
5d80: 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74 6d 65 efine (db:testme
5d90: 74 61 2d 75 70 64 61 74 65 2d 66 69 65 6c 64 20 ta-update-field
5da0: 64 62 20 74 65 73 74 6e 61 6d 65 20 66 69 65 6c db testname fiel
5db0: 64 20 76 61 6c 75 65 29 0a 20 20 28 73 71 6c 69 d value). (sqli
5dc0: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 28 te3:execute db (
5dd0: 63 6f 6e 63 20 22 55 50 44 41 54 45 20 74 65 73 conc "UPDATE tes
5de0: 74 5f 6d 65 74 61 20 53 45 54 20 22 20 66 69 65 t_meta SET " fie
5df0: 6c 64 20 22 3d 3f 20 57 48 45 52 45 20 74 65 73 ld "=? WHERE tes
5e00: 74 6e 61 6d 65 3d 3f 3b 22 29 20 76 61 6c 75 65 tname=?;") value
5e10: 20 74 65 73 74 6e 61 6d 65 29 29 0a 0a 3b 3b 3d testname))..;;=
5e20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5e30: 3d 3d 3d 3d 3d 3d 3d 3d 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 0a 3b 3b 20 54 20 45 20 53 20 54 =====.;; T E S T
5e70: 20 20 20 44 20 41 20 54 20 41 20 0a 3b 3b 3d 3d D A T A .;;==
5e80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5e90: 3d 3d 3d 3d 3d 3d 3d 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 0a 0a 28 64 65 66 69 6e 65 20 28 64 ====..(define (d
5ed0: 62 3a 63 73 76 2d 3e 74 65 73 74 2d 64 61 74 61 b:csv->test-data
5ee0: 20 64 62 20 74 65 73 74 2d 69 64 20 63 73 76 64 db test-id csvd
5ef0: 61 74 61 29 0a 20 20 28 64 65 62 75 67 3a 70 72 ata). (debug:pr
5f00: 69 6e 74 20 34 20 22 74 65 73 74 2d 69 64 20 22 int 4 "test-id "
5f10: 20 74 65 73 74 2d 69 64 20 22 2c 20 63 73 76 64 test-id ", csvd
5f20: 61 74 61 3a 20 22 20 63 73 76 64 61 74 61 29 0a ata: " csvdata).
5f30: 20 20 28 6c 65 74 20 28 28 63 73 76 6c 69 73 74 (let ((csvlist
5f40: 20 28 63 73 76 2d 3e 6c 69 73 74 20 28 6d 61 6b (csv->list (mak
5f50: 65 2d 63 73 76 2d 72 65 61 64 65 72 0a 09 09 09 e-csv-reader....
5f60: 20 20 20 20 20 28 6f 70 65 6e 2d 69 6e 70 75 74 (open-input
5f70: 2d 73 74 72 69 6e 67 20 63 73 76 64 61 74 61 29 -string csvdata)
5f80: 0a 09 09 09 20 20 20 20 20 27 28 28 73 74 72 69 .... '((stri
5f90: 70 2d 6c 65 61 64 69 6e 67 2d 77 68 69 74 65 73 p-leading-whites
5fa0: 70 61 63 65 3f 20 23 74 29 0a 09 09 09 20 20 20 pace? #t)....
5fb0: 20 20 20 20 28 73 74 72 69 70 2d 74 72 61 69 6c (strip-trail
5fc0: 69 6e 67 2d 77 68 69 74 65 73 70 61 63 65 3f 20 ing-whitespace?
5fd0: 23 74 29 29 20 29 29 29 29 20 3b 3b 20 28 63 73 #t)) )))) ;; (cs
5fe0: 76 2d 3e 6c 69 73 74 20 63 73 76 64 61 74 61 29 v->list csvdata)
5ff0: 29 29 0a 20 20 20 20 28 66 6f 72 2d 65 61 63 68 )). (for-each
6000: 20 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 . (lambda (
6010: 63 73 76 72 6f 77 29 0a 20 20 20 20 20 20 20 28 csvrow). (
6020: 6c 65 74 2a 20 28 28 70 61 64 64 65 64 2d 72 6f let* ((padded-ro
6030: 77 20 20 28 74 61 6b 65 20 28 61 70 70 65 6e 64 w (take (append
6040: 20 63 73 76 72 6f 77 20 28 6c 69 73 74 20 23 66 csvrow (list #f
6050: 20 23 66 20 23 66 20 23 66 20 23 66 20 23 66 20 #f #f #f #f #f
6060: 23 66 20 23 66 29 29 20 38 29 29 0a 09 20 20 20 #f #f)) 8))..
6070: 20 20 20 28 63 61 74 65 67 6f 72 79 20 20 20 20 (category
6080: 28 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65 64 (list-ref padded
6090: 2d 72 6f 77 20 30 29 29 0a 09 20 20 20 20 20 20 -row 0))..
60a0: 28 76 61 72 69 61 62 6c 65 20 20 20 20 28 6c 69 (variable (li
60b0: 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f st-ref padded-ro
60c0: 77 20 31 29 29 0a 09 20 20 20 20 20 20 28 76 61 w 1)).. (va
60d0: 6c 75 65 20 20 20 20 20 20 20 28 61 6e 79 2d 3e lue (any->
60e0: 6e 75 6d 62 65 72 2d 69 66 2d 70 6f 73 73 69 62 number-if-possib
60f0: 6c 65 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64 le (list-ref pad
6100: 64 65 64 2d 72 6f 77 20 32 29 29 29 0a 09 20 20 ded-row 2)))..
6110: 20 20 20 20 28 65 78 70 65 63 74 65 64 20 20 20 (expected
6120: 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 2d 69 66 (any->number-if
6130: 2d 70 6f 73 73 69 62 6c 65 20 28 6c 69 73 74 2d -possible (list-
6140: 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20 33 ref padded-row 3
6150: 29 29 29 0a 09 20 20 20 20 20 20 28 74 6f 6c 20 ))).. (tol
6160: 20 20 20 20 20 20 20 20 28 61 6e 79 2d 3e 6e 75 (any->nu
6170: 6d 62 65 72 2d 69 66 2d 70 6f 73 73 69 62 6c 65 mber-if-possible
6180: 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65 (list-ref padde
6190: 64 2d 72 6f 77 20 34 29 29 29 20 3b 3b 20 3e 2c d-row 4))) ;; >,
61a0: 20 3c 2c 20 3e 3d 2c 20 3c 3d 2c 20 6f 72 20 61 <, >=, <=, or a
61b0: 20 6e 75 6d 62 65 72 0a 09 20 20 20 20 20 20 28 number.. (
61c0: 75 6e 69 74 73 20 20 20 20 20 20 20 28 6c 69 73 units (lis
61d0: 74 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77 t-ref padded-row
61e0: 20 35 29 29 0a 09 20 20 20 20 20 20 28 63 6f 6d 5)).. (com
61f0: 6d 65 6e 74 20 20 20 20 20 28 6c 69 73 74 2d 72 ment (list-r
6200: 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20 36 29 ef padded-row 6)
6210: 29 0a 09 20 20 20 20 20 20 28 73 74 61 74 75 73 ).. (status
6220: 20 20 20 20 20 20 28 6c 65 74 20 28 28 73 20 28 (let ((s (
6230: 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d list-ref padded-
6240: 72 6f 77 20 37 29 29 29 0a 09 09 09 20 20 20 20 row 7)))....
6250: 20 28 69 66 20 28 61 6e 64 20 28 73 74 72 69 6e (if (and (strin
6260: 67 3f 20 73 29 28 6f 72 20 28 73 74 72 69 6e 67 g? s)(or (string
6270: 2d 6d 61 74 63 68 20 28 72 65 67 65 78 70 20 22 -match (regexp "
6280: 5e 5c 5c 73 2a 24 22 29 20 73 29 0a 09 09 09 09 ^\\s*$") s).....
6290: 09 09 20 20 20 20 20 28 73 74 72 69 6e 67 2d 6d .. (string-m
62a0: 61 74 63 68 20 28 72 65 67 65 78 70 20 22 5e 6e atch (regexp "^n
62b0: 2f 61 24 22 29 20 73 29 29 29 0a 09 09 09 09 20 /a$") s))).....
62c0: 23 66 0a 09 09 09 09 20 73 29 29 29 29 20 3b 3b #f..... s)))) ;;
62d0: 20 69 66 20 73 70 65 63 69 66 69 65 64 20 6f 6e if specified on
62e0: 20 74 68 65 20 69 6e 70 75 74 20 74 68 65 6e 20 the input then
62f0: 75 73 65 2c 20 65 6c 73 65 20 63 61 6c 63 75 6c use, else calcul
6300: 61 74 65 0a 09 20 3b 3b 20 6c 6f 6f 6b 20 75 70 ate.. ;; look up
6310: 20 65 78 70 65 63 74 65 64 2c 74 6f 6c 2c 75 6e expected,tol,un
6320: 69 74 73 20 66 72 6f 6d 20 70 72 65 76 69 6f 75 its from previou
6330: 73 20 62 65 73 74 20 66 69 74 20 74 65 73 74 20 s best fit test
6340: 69 66 20 74 68 65 79 20 61 72 65 20 61 6c 6c 20 if they are all
6350: 65 69 74 68 65 72 20 23 66 20 6f 72 20 27 27 0a either #f or ''.
6360: 09 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 . (debug:print 4
6370: 20 22 42 45 46 4f 52 45 3a 20 63 61 74 65 67 6f "BEFORE: catego
6380: 72 79 3a 20 22 20 63 61 74 65 67 6f 72 79 20 22 ry: " category "
6390: 20 76 61 72 69 61 62 6c 65 3a 20 22 20 76 61 72 variable: " var
63a0: 69 61 62 6c 65 20 22 20 76 61 6c 75 65 3a 20 22 iable " value: "
63b0: 20 76 61 6c 75 65 20 0a 09 09 20 20 20 20 20 20 value ...
63c0: 22 2c 20 65 78 70 65 63 74 65 64 3a 20 22 20 65 ", expected: " e
63d0: 78 70 65 63 74 65 64 20 22 20 74 6f 6c 3a 20 22 xpected " tol: "
63e0: 20 74 6f 6c 20 22 20 75 6e 69 74 73 3a 20 22 20 tol " units: "
63f0: 75 6e 69 74 73 20 22 20 73 74 61 74 75 73 3a 20 units " status:
6400: 22 20 73 74 61 74 75 73 20 22 20 63 6f 6d 6d 65 " status " comme
6410: 6e 74 3a 20 22 20 63 6f 6d 6d 65 6e 74 29 0a 0a nt: " comment)..
6420: 09 20 28 69 66 20 28 61 6e 64 20 28 6f 72 20 28 . (if (and (or (
6430: 6e 6f 74 20 65 78 70 65 63 74 65 64 29 28 65 71 not expected)(eq
6440: 75 61 6c 3f 20 65 78 70 65 63 74 65 64 20 22 22 ual? expected ""
6450: 29 29 0a 09 09 20 20 28 6f 72 20 28 6e 6f 74 20 ))... (or (not
6460: 74 6f 6c 29 20 20 20 20 20 28 65 71 75 61 6c 3f tol) (equal?
6470: 20 65 78 70 65 63 74 65 64 20 22 22 29 29 0a 09 expected ""))..
6480: 09 20 20 28 6f 72 20 28 6e 6f 74 20 75 6e 69 74 . (or (not unit
6490: 73 29 20 20 20 28 65 71 75 61 6c 3f 20 65 78 70 s) (equal? exp
64a0: 65 63 74 65 64 20 22 22 29 29 29 0a 09 20 20 20 ected "")))..
64b0: 20 20 28 6c 65 74 2d 76 61 6c 75 65 73 20 28 28 (let-values ((
64c0: 28 6e 65 77 2d 65 78 70 65 63 74 65 64 20 6e 65 (new-expected ne
64d0: 77 2d 74 6f 6c 20 6e 65 77 2d 75 6e 69 74 73 29 w-tol new-units)
64e0: 28 64 62 3a 67 65 74 2d 70 72 65 76 2d 74 6f 6c (db:get-prev-tol
64f0: 2d 66 6f 72 2d 74 65 73 74 20 64 62 20 74 65 73 -for-test db tes
6500: 74 2d 69 64 20 63 61 74 65 67 6f 72 79 20 76 61 t-id category va
6510: 72 69 61 62 6c 65 29 29 29 0a 09 20 20 20 20 20 riable)))..
6520: 20 20 28 73 65 74 21 20 65 78 70 65 63 74 65 64 (set! expected
6530: 20 6e 65 77 2d 65 78 70 65 63 74 65 64 29 0a 09 new-expected)..
6540: 20 20 20 20 20 20 20 28 73 65 74 21 20 74 6f 6c (set! tol
6550: 20 20 20 20 20 20 6e 65 77 2d 74 6f 6c 29 0a 09 new-tol)..
6560: 20 20 20 20 20 20 20 28 73 65 74 21 20 75 6e 69 (set! uni
6570: 74 73 20 20 20 20 6e 65 77 2d 75 6e 69 74 73 29 ts new-units)
6580: 29 29 0a 0a 09 20 28 64 65 62 75 67 3a 70 72 69 ))... (debug:pri
6590: 6e 74 20 34 20 22 41 46 54 45 52 3a 20 20 63 61 nt 4 "AFTER: ca
65a0: 74 65 67 6f 72 79 3a 20 22 20 63 61 74 65 67 6f tegory: " catego
65b0: 72 79 20 22 20 76 61 72 69 61 62 6c 65 3a 20 22 ry " variable: "
65c0: 20 76 61 72 69 61 62 6c 65 20 22 20 76 61 6c 75 variable " valu
65d0: 65 3a 20 22 20 76 61 6c 75 65 20 0a 09 09 20 20 e: " value ...
65e0: 20 20 20 20 22 2c 20 65 78 70 65 63 74 65 64 3a ", expected:
65f0: 20 22 20 65 78 70 65 63 74 65 64 20 22 20 74 6f " expected " to
6600: 6c 3a 20 22 20 74 6f 6c 20 22 20 75 6e 69 74 73 l: " tol " units
6610: 3a 20 22 20 75 6e 69 74 73 20 22 20 73 74 61 74 : " units " stat
6620: 75 73 3a 20 22 20 73 74 61 74 75 73 20 22 20 63 us: " status " c
6630: 6f 6d 6d 65 6e 74 3a 20 22 20 63 6f 6d 6d 65 6e omment: " commen
6640: 74 29 0a 09 20 3b 3b 20 63 61 6c 63 75 6c 61 74 t).. ;; calculat
6650: 65 20 73 74 61 74 75 73 20 69 66 20 4e 4f 54 20 e status if NOT
6660: 73 70 65 63 69 66 69 65 64 0a 09 20 28 69 66 20 specified.. (if
6670: 28 61 6e 64 20 28 6e 6f 74 20 73 74 61 74 75 73 (and (not status
6680: 29 28 6e 75 6d 62 65 72 3f 20 65 78 70 65 63 74 )(number? expect
6690: 65 64 29 28 6e 75 6d 62 65 72 3f 20 76 61 6c 75 ed)(number? valu
66a0: 65 29 29 20 3b 3b 20 6e 65 65 64 20 65 78 70 65 e)) ;; need expe
66b0: 63 74 65 64 20 61 6e 64 20 76 61 6c 75 65 20 74 cted and value t
66c0: 6f 20 62 65 20 6e 75 6d 62 65 72 73 0a 09 20 20 o be numbers..
66d0: 20 20 20 28 69 66 20 28 6e 75 6d 62 65 72 3f 20 (if (number?
66e0: 74 6f 6c 29 20 3b 3b 20 69 66 20 74 6f 6c 20 69 tol) ;; if tol i
66f0: 73 20 61 20 6e 75 6d 62 65 72 20 74 68 65 6e 20 s a number then
6700: 77 65 20 64 6f 20 74 68 65 20 73 74 61 6e 64 61 we do the standa
6710: 72 64 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 09 09 rd comparison...
6720: 20 28 6c 65 74 2a 20 28 28 6d 61 78 2d 76 61 6c (let* ((max-val
6730: 20 28 2b 20 65 78 70 65 63 74 65 64 20 74 6f 6c (+ expected tol
6740: 29 29 0a 09 09 09 28 6d 69 6e 2d 76 61 6c 20 28 ))....(min-val (
6750: 2d 20 65 78 70 65 63 74 65 64 20 74 6f 6c 29 29 - expected tol))
6760: 0a 09 09 09 28 72 65 73 75 6c 74 20 20 28 61 6e ....(result (an
6770: 64 20 28 3e 3d 20 20 76 61 6c 75 65 20 6d 69 6e d (>= value min
6780: 2d 76 61 6c 29 28 3c 3d 20 76 61 6c 75 65 20 6d -val)(<= value m
6790: 61 78 2d 76 61 6c 29 29 29 29 0a 09 09 20 20 20 ax-val))))...
67a0: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22 (debug:print 4 "
67b0: 6d 61 78 2d 76 61 6c 3a 20 22 20 6d 61 78 2d 76 max-val: " max-v
67c0: 61 6c 20 22 20 6d 69 6e 2d 76 61 6c 3a 20 22 20 al " min-val: "
67d0: 6d 69 6e 2d 76 61 6c 20 22 20 72 65 73 75 6c 74 min-val " result
67e0: 3a 20 22 20 72 65 73 75 6c 74 29 0a 09 09 20 20 : " result)...
67f0: 20 28 73 65 74 21 20 73 74 61 74 75 73 20 28 69 (set! status (i
6800: 66 20 72 65 73 75 6c 74 20 22 70 61 73 73 22 20 f result "pass"
6810: 22 66 61 69 6c 22 29 29 29 0a 09 09 20 28 73 65 "fail")))... (se
6820: 74 21 20 73 74 61 74 75 73 20 3b 3b 20 4e 42 2f t! status ;; NB/
6830: 2f 20 6e 65 65 64 20 74 6f 20 61 73 73 65 73 73 / need to assess
6840: 20 65 61 63 68 20 6f 6e 65 20 28 69 2e 65 2e 20 each one (i.e.
6850: 6e 6f 74 20 72 65 74 75 72 6e 20 6f 70 65 72 61 not return opera
6860: 74 6f 72 20 73 69 6e 63 65 20 6e 65 65 64 20 74 tor since need t
6870: 6f 20 61 63 74 20 69 66 20 6e 6f 74 20 76 61 6c o act if not val
6880: 69 64 20 6f 70 2e 0a 09 09 20 20 20 20 20 20 20 id op....
6890: 28 63 61 73 65 20 28 73 74 72 69 6e 67 2d 3e 73 (case (string->s
68a0: 79 6d 62 6f 6c 20 74 6f 6c 29 20 3b 3b 20 74 6f ymbol tol) ;; to
68b0: 6c 20 73 68 6f 75 6c 64 20 62 65 20 3e 2c 20 3c l should be >, <
68c0: 2c 20 3e 3d 2c 20 3c 3d 0a 09 09 09 20 28 28 3e , >=, <=.... ((>
68d0: 29 20 20 28 69 66 20 28 3e 20 20 76 61 6c 75 65 ) (if (> value
68e0: 20 65 78 70 65 63 74 65 64 29 20 22 70 61 73 73 expected) "pass
68f0: 22 20 22 66 61 69 6c 22 29 29 0a 09 09 09 20 28 " "fail")).... (
6900: 28 3c 29 20 20 28 69 66 20 28 3c 20 20 76 61 6c (<) (if (< val
6910: 75 65 20 65 78 70 65 63 74 65 64 29 20 22 70 61 ue expected) "pa
6920: 73 73 22 20 22 66 61 69 6c 22 29 29 0a 09 09 09 ss" "fail"))....
6930: 20 28 28 3e 3d 29 20 28 69 66 20 28 3e 3d 20 76 ((>=) (if (>= v
6940: 61 6c 75 65 20 65 78 70 65 63 74 65 64 29 20 22 alue expected) "
6950: 70 61 73 73 22 20 22 66 61 69 6c 22 29 29 0a 09 pass" "fail"))..
6960: 09 09 20 28 28 3c 3d 29 20 28 69 66 20 28 3c 3d .. ((<=) (if (<=
6970: 20 76 61 6c 75 65 20 65 78 70 65 63 74 65 64 29 value expected)
6980: 20 22 70 61 73 73 22 20 22 66 61 69 6c 22 29 29 "pass" "fail"))
6990: 0a 09 09 09 20 28 65 6c 73 65 20 28 63 6f 6e 63 .... (else (conc
69a0: 20 22 45 52 52 4f 52 3a 20 62 61 64 20 74 6f 6c "ERROR: bad tol
69b0: 20 63 6f 6d 70 61 72 61 74 6f 72 20 22 20 74 6f comparator " to
69c0: 6c 29 29 29 29 29 29 0a 09 20 28 64 65 62 75 67 l)))))).. (debug
69d0: 3a 70 72 69 6e 74 20 34 20 22 41 46 54 45 52 32 :print 4 "AFTER2
69e0: 3a 20 63 61 74 65 67 6f 72 79 3a 20 22 20 63 61 : category: " ca
69f0: 74 65 67 6f 72 79 20 22 20 76 61 72 69 61 62 6c tegory " variabl
6a00: 65 3a 20 22 20 76 61 72 69 61 62 6c 65 20 22 20 e: " variable "
6a10: 76 61 6c 75 65 3a 20 22 20 76 61 6c 75 65 20 0a value: " value .
6a20: 09 09 20 20 20 20 20 20 22 2c 20 65 78 70 65 63 .. ", expec
6a30: 74 65 64 3a 20 22 20 65 78 70 65 63 74 65 64 20 ted: " expected
6a40: 22 20 74 6f 6c 3a 20 22 20 74 6f 6c 20 22 20 75 " tol: " tol " u
6a50: 6e 69 74 73 3a 20 22 20 75 6e 69 74 73 20 22 20 nits: " units "
6a60: 73 74 61 74 75 73 3a 20 22 20 73 74 61 74 75 73 status: " status
6a70: 20 22 20 63 6f 6d 6d 65 6e 74 3a 20 22 20 63 6f " comment: " co
6a80: 6d 6d 65 6e 74 29 0a 09 20 28 73 71 6c 69 74 65 mment).. (sqlite
6a90: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 49 4e 3:execute db "IN
6aa0: 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 SERT OR REPLACE
6ab0: 49 4e 54 4f 20 74 65 73 74 5f 64 61 74 61 20 28 INTO test_data (
6ac0: 74 65 73 74 5f 69 64 2c 63 61 74 65 67 6f 72 79 test_id,category
6ad0: 2c 76 61 72 69 61 62 6c 65 2c 76 61 6c 75 65 2c ,variable,value,
6ae0: 65 78 70 65 63 74 65 64 2c 74 6f 6c 2c 75 6e 69 expected,tol,uni
6af0: 74 73 2c 63 6f 6d 6d 65 6e 74 2c 73 74 61 74 75 ts,comment,statu
6b00: 73 29 20 56 41 4c 55 45 53 20 28 3f 2c 3f 2c 3f s) VALUES (?,?,?
6b10: 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 29 3b 22 0a ,?,?,?,?,?,?);".
6b20: 09 20 20 20 20 20 20 74 65 73 74 2d 69 64 20 63 . test-id c
6b30: 61 74 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65 ategory variable
6b40: 20 76 61 6c 75 65 20 65 78 70 65 63 74 65 64 20 value expected
6b50: 74 6f 6c 20 75 6e 69 74 73 20 28 69 66 20 63 6f tol units (if co
6b60: 6d 6d 65 6e 74 20 63 6f 6d 6d 65 6e 74 20 22 22 mment comment ""
6b70: 29 20 73 74 61 74 75 73 29 29 29 0a 20 20 20 20 ) status))).
6b80: 20 63 73 76 6c 69 73 74 29 29 29 0a 0a 3b 3b 20 csvlist)))..;;
6b90: 67 65 74 20 61 20 6c 69 73 74 20 6f 66 20 74 65 get a list of te
6ba0: 73 74 5f 64 61 74 61 20 72 65 63 6f 72 64 73 20 st_data records
6bb0: 6d 61 74 63 68 69 6e 67 20 63 61 74 65 67 6f 72 matching categor
6bc0: 79 70 61 74 74 0a 28 64 65 66 69 6e 65 20 28 64 ypatt.(define (d
6bd0: 62 3a 72 65 61 64 2d 74 65 73 74 2d 64 61 74 61 b:read-test-data
6be0: 20 64 62 20 74 65 73 74 2d 69 64 20 63 61 74 65 db test-id cate
6bf0: 67 6f 72 79 70 61 74 74 29 0a 20 20 28 6c 65 74 gorypatt). (let
6c00: 20 28 28 72 65 73 20 27 28 29 29 29 0a 20 20 20 ((res '())).
6c10: 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 (sqlite3:for-ea
6c20: 63 68 2d 72 6f 77 20 0a 20 20 20 20 20 28 6c 61 ch-row . (la
6c30: 6d 62 64 61 20 28 69 64 20 74 65 73 74 5f 69 64 mbda (id test_id
6c40: 20 63 61 74 65 67 6f 72 79 20 76 61 72 69 61 62 category variab
6c50: 6c 65 20 76 61 6c 75 65 20 65 78 70 65 63 74 65 le value expecte
6c60: 64 20 74 6f 6c 20 75 6e 69 74 73 20 63 6f 6d 6d d tol units comm
6c70: 65 6e 74 20 73 74 61 74 75 73 29 0a 20 20 20 20 ent status).
6c80: 20 20 20 28 73 65 74 21 20 72 65 73 20 28 63 6f (set! res (co
6c90: 6e 73 20 28 76 65 63 74 6f 72 20 69 64 20 74 65 ns (vector id te
6ca0: 73 74 5f 69 64 20 63 61 74 65 67 6f 72 79 20 76 st_id category v
6cb0: 61 72 69 61 62 6c 65 20 76 61 6c 75 65 20 65 78 ariable value ex
6cc0: 70 65 63 74 65 64 20 74 6f 6c 20 75 6e 69 74 73 pected tol units
6cd0: 20 63 6f 6d 6d 65 6e 74 20 73 74 61 74 75 73 29 comment status)
6ce0: 20 72 65 73 29 29 29 0a 20 20 20 20 20 64 62 0a res))). db.
6cf0: 20 20 20 20 20 22 53 45 4c 45 43 54 20 69 64 2c "SELECT id,
6d00: 74 65 73 74 5f 69 64 2c 63 61 74 65 67 6f 72 79 test_id,category
6d10: 2c 76 61 72 69 61 62 6c 65 2c 76 61 6c 75 65 2c ,variable,value,
6d20: 65 78 70 65 63 74 65 64 2c 74 6f 6c 2c 75 6e 69 expected,tol,uni
6d30: 74 73 2c 63 6f 6d 6d 65 6e 74 2c 73 74 61 74 75 ts,comment,statu
6d40: 73 20 46 52 4f 4d 20 74 65 73 74 5f 64 61 74 61 s FROM test_data
6d50: 20 57 48 45 52 45 20 74 65 73 74 5f 69 64 3d 3f WHERE test_id=?
6d60: 20 41 4e 44 20 63 61 74 65 67 6f 72 79 20 4c 49 AND category LI
6d70: 4b 45 20 3f 20 4f 52 44 45 52 20 42 59 20 63 61 KE ? ORDER BY ca
6d80: 74 65 67 6f 72 79 2c 76 61 72 69 61 62 6c 65 3b tegory,variable;
6d90: 22 20 74 65 73 74 2d 69 64 20 63 61 74 65 67 6f " test-id catego
6da0: 72 79 70 61 74 74 29 0a 20 20 20 20 28 72 65 76 rypatt). (rev
6db0: 65 72 73 65 20 72 65 73 29 29 29 0a 0a 28 64 65 erse res)))..(de
6dc0: 66 69 6e 65 20 28 64 62 3a 6c 6f 61 64 2d 74 65 fine (db:load-te
6dd0: 73 74 2d 64 61 74 61 20 64 62 20 72 75 6e 2d 69 st-data db run-i
6de0: 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d d test-name item
6df0: 64 61 74 29 0a 20 20 28 6c 65 74 2a 20 28 28 69 dat). (let* ((i
6e00: 74 65 6d 2d 70 61 74 68 20 28 69 74 65 6d 2d 6c tem-path (item-l
6e10: 69 73 74 2d 3e 70 61 74 68 20 69 74 65 6d 64 61 ist->path itemda
6e20: 74 29 29 0a 09 20 28 74 65 73 74 64 61 74 20 28 t)).. (testdat (
6e30: 64 62 3a 67 65 74 2d 74 65 73 74 2d 69 6e 66 6f db:get-test-info
6e40: 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d db run-id test-
6e50: 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 29 name item-path))
6e60: 0a 09 20 28 74 65 73 74 2d 69 64 20 28 69 66 20 .. (test-id (if
6e70: 74 65 73 74 64 61 74 20 28 64 62 3a 74 65 73 74 testdat (db:test
6e80: 2d 67 65 74 2d 69 64 20 74 65 73 74 64 61 74 29 -get-id testdat)
6e90: 20 23 66 29 29 29 0a 20 20 20 20 3b 3b 20 28 64 #f))). ;; (d
6ea0: 65 62 75 67 3a 70 72 69 6e 74 20 31 20 22 45 6e ebug:print 1 "En
6eb0: 74 65 72 20 72 65 63 6f 72 64 73 20 74 6f 20 69 ter records to i
6ec0: 6e 73 65 72 74 20 69 6e 20 74 68 65 20 74 65 73 nsert in the tes
6ed0: 74 5f 64 61 74 61 20 74 61 62 6c 65 2c 20 73 65 t_data table, se
6ee0: 76 65 6e 20 66 69 65 6c 64 73 2c 20 63 6f 6d 6d ven fields, comm
6ef0: 61 20 73 65 70 61 72 61 74 65 64 20 70 65 72 20 a separated per
6f00: 6c 69 6e 65 22 29 0a 20 20 20 20 28 64 65 62 75 line"). (debu
6f10: 67 3a 70 72 69 6e 74 20 34 20 22 69 74 65 6d 64 g:print 4 "itemd
6f20: 61 74 3a 20 22 20 69 74 65 6d 64 61 74 20 22 2c at: " itemdat ",
6f30: 20 74 65 73 74 2d 6e 61 6d 65 3a 20 22 20 74 65 test-name: " te
6f40: 73 74 2d 6e 61 6d 65 20 22 2c 20 74 65 73 74 2d st-name ", test-
6f50: 69 64 3a 20 22 20 74 65 73 74 2d 69 64 29 0a 20 id: " test-id).
6f60: 20 20 20 28 69 66 20 74 65 73 74 2d 69 64 0a 09 (if test-id..
6f70: 28 6c 65 74 20 6c 6f 6f 70 20 28 28 6c 69 6e 20 (let loop ((lin
6f80: 28 72 65 61 64 2d 6c 69 6e 65 29 29 29 0a 09 20 (read-line)))..
6f90: 20 28 69 66 20 28 6e 6f 74 20 28 65 6f 66 2d 6f (if (not (eof-o
6fa0: 62 6a 65 63 74 3f 20 6c 69 6e 29 29 0a 09 20 20 bject? lin))..
6fb0: 20 20 20 20 28 62 65 67 69 6e 0a 09 09 28 64 65 (begin...(de
6fc0: 62 75 67 3a 70 72 69 6e 74 20 34 20 6c 69 6e 29 bug:print 4 lin)
6fd0: 0a 09 09 28 64 62 3a 63 73 76 2d 3e 74 65 73 74 ...(db:csv->test
6fe0: 2d 64 61 74 61 20 64 62 20 74 65 73 74 2d 69 64 -data db test-id
6ff0: 20 6c 69 6e 29 0a 09 09 28 6c 6f 6f 70 20 28 72 lin)...(loop (r
7000: 65 61 64 2d 6c 69 6e 65 29 29 29 29 29 29 0a 20 ead-line)))))).
7010: 20 20 20 3b 3b 20 72 6f 6c 6c 20 75 70 20 74 68 ;; roll up th
7020: 65 20 63 75 72 72 65 6e 74 20 72 65 73 75 6c 74 e current result
7030: 73 2e 0a 20 20 20 20 28 64 62 3a 74 65 73 74 2d s.. (db:test-
7040: 64 61 74 61 2d 72 6f 6c 6c 75 70 20 64 62 20 74 data-rollup db t
7050: 65 73 74 2d 69 64 29 29 29 0a 20 20 0a 3b 3b 20 est-id))). .;;
7060: 57 41 52 4e 49 4e 47 3a 20 44 6f 20 4e 4f 54 20 WARNING: Do NOT
7070: 63 61 6c 6c 20 74 68 69 73 20 66 6f 72 20 74 68 call this for th
7080: 65 20 70 61 72 65 6e 74 20 74 65 73 74 20 6f 6e e parent test on
7090: 20 61 6e 20 69 74 65 72 61 74 65 64 20 74 65 73 an iterated tes
70a0: 74 0a 3b 3b 20 52 6f 6c 6c 20 75 70 20 74 65 73 t.;; Roll up tes
70b0: 74 5f 64 61 74 61 20 70 61 73 73 2f 66 61 69 6c t_data pass/fail
70c0: 20 72 65 73 75 6c 74 73 0a 3b 3b 20 6c 6f 6f 6b results.;; look
70d0: 20 61 74 20 74 68 65 20 74 65 73 74 5f 64 61 74 at the test_dat
70e0: 61 20 73 74 61 74 75 73 20 66 69 65 6c 64 2c 20 a status field,
70f0: 0a 3b 3b 20 20 20 20 69 66 20 61 6c 6c 20 61 72 .;; if all ar
7100: 65 20 70 61 73 73 20 28 61 6e 79 20 63 61 73 65 e pass (any case
7110: 29 20 61 6e 64 20 74 68 65 20 74 65 73 74 20 73 ) and the test s
7120: 74 61 74 75 73 20 69 73 20 50 41 53 53 20 6f 72 tatus is PASS or
7130: 20 4e 55 4c 4c 20 6f 72 20 27 27 20 74 68 65 6e NULL or '' then
7140: 20 73 65 74 20 74 65 73 74 20 73 74 61 74 75 73 set test status
7150: 20 74 6f 20 50 41 53 53 2e 0a 3b 3b 20 20 20 20 to PASS..;;
7160: 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 61 if one or more a
7170: 72 65 20 66 61 69 6c 20 28 61 6e 79 20 63 61 73 re fail (any cas
7180: 65 29 20 74 68 65 6e 20 73 65 74 20 74 65 73 74 e) then set test
7190: 20 73 74 61 74 75 73 20 74 6f 20 50 41 53 53 2c status to PASS,
71a0: 20 6e 6f 6e 20 22 70 61 73 73 22 20 6f 72 20 22 non "pass" or "
71b0: 66 61 69 6c 22 20 61 72 65 20 69 67 6e 6f 72 65 fail" are ignore
71c0: 64 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65 d.(define (db:te
71d0: 73 74 2d 64 61 74 61 2d 72 6f 6c 6c 75 70 20 64 st-data-rollup d
71e0: 62 20 74 65 73 74 2d 69 64 29 0a 20 20 28 73 71 b test-id). (sq
71f0: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 0a 20 lite3:execute .
7200: 20 20 64 62 20 0a 20 20 20 22 55 50 44 41 54 45 db . "UPDATE
7210: 20 74 65 73 74 73 20 0a 20 20 20 20 20 20 53 45 tests . SE
7220: 54 20 66 61 69 6c 5f 63 6f 75 6e 74 3d 28 53 45 T fail_count=(SE
7230: 4c 45 43 54 20 63 6f 75 6e 74 28 69 64 29 20 46 LECT count(id) F
7240: 52 4f 4d 20 74 65 73 74 5f 64 61 74 61 20 57 48 ROM test_data WH
7250: 45 52 45 20 74 65 73 74 5f 69 64 3d 3f 20 41 4e ERE test_id=? AN
7260: 44 20 73 74 61 74 75 73 20 6c 69 6b 65 20 27 66 D status like 'f
7270: 61 69 6c 27 29 2c 0a 20 20 20 20 20 20 20 20 20 ail'),.
7280: 20 70 61 73 73 5f 63 6f 75 6e 74 3d 28 53 45 4c pass_count=(SEL
7290: 45 43 54 20 63 6f 75 6e 74 28 69 64 29 20 46 52 ECT count(id) FR
72a0: 4f 4d 20 74 65 73 74 5f 64 61 74 61 20 57 48 45 OM test_data WHE
72b0: 52 45 20 74 65 73 74 5f 69 64 3d 3f 20 41 4e 44 RE test_id=? AND
72c0: 20 73 74 61 74 75 73 20 6c 69 6b 65 20 27 70 61 status like 'pa
72d0: 73 73 27 29 0a 20 20 20 20 20 20 57 48 45 52 45 ss'). WHERE
72e0: 20 69 64 3d 3f 3b 22 0a 20 20 20 74 65 73 74 2d id=?;". test-
72f0: 69 64 20 74 65 73 74 2d 69 64 20 74 65 73 74 2d id test-id test-
7300: 69 64 29 0a 20 20 3b 3b 20 69 66 20 74 68 65 20 id). ;; if the
7310: 74 65 73 74 20 69 73 20 6e 6f 74 20 46 41 49 4c test is not FAIL
7320: 20 74 68 65 6e 20 73 65 74 20 73 74 61 74 75 73 then set status
7330: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 66 61 based on the fa
7340: 69 6c 20 61 6e 64 20 70 61 73 73 20 63 6f 75 6e il and pass coun
7350: 74 73 2e 0a 20 20 28 73 6c 65 65 70 20 31 29 0a ts.. (sleep 1).
7360: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 (sqlite3:execu
7370: 74 65 0a 20 20 20 64 62 0a 20 20 20 22 55 50 44 te. db. "UPD
7380: 41 54 45 20 74 65 73 74 73 0a 20 20 20 20 20 20 ATE tests.
7390: 53 45 54 20 73 74 61 74 75 73 3d 43 41 53 45 20 SET status=CASE
73a0: 57 48 45 4e 20 28 53 45 4c 45 43 54 20 66 61 69 WHEN (SELECT fai
73b0: 6c 5f 63 6f 75 6e 74 20 46 52 4f 4d 20 74 65 73 l_count FROM tes
73c0: 74 73 20 57 48 45 52 45 20 69 64 3d 3f 29 20 3e ts WHERE id=?) >
73d0: 20 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 0 .
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 48 45 THE
73f0: 4e 20 27 46 41 49 4c 27 0a 20 20 20 20 20 20 20 N 'FAIL'.
7400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 W
7410: 48 45 4e 20 28 53 45 4c 45 43 54 20 70 61 73 73 HEN (SELECT pass
7420: 5f 63 6f 75 6e 74 20 46 52 4f 4d 20 74 65 73 74 _count FROM test
7430: 73 20 57 48 45 52 45 20 69 64 3d 3f 29 20 3e 20 s WHERE id=?) >
7440: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0.
7450: 20 20 20 20 20 20 20 20 20 20 20 54 48 45 4e 20 THEN
7460: 27 50 41 53 53 27 0a 20 20 20 20 20 20 20 20 20 'PASS'.
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 45 4c 53 ELS
7480: 45 20 73 74 61 74 75 73 0a 20 20 20 20 20 20 20 E status.
7490: 20 20 20 20 20 20 20 20 20 20 20 45 4e 44 20 57 END W
74a0: 48 45 52 45 20 69 64 3d 3f 3b 22 0a 20 20 20 74 HERE id=?;". t
74b0: 65 73 74 2d 69 64 20 74 65 73 74 2d 69 64 20 74 est-id test-id t
74c0: 65 73 74 2d 69 64 29 29 0a 0a 28 64 65 66 69 6e est-id))..(defin
74d0: 65 20 28 64 62 3a 67 65 74 2d 70 72 65 76 2d 74 e (db:get-prev-t
74e0: 6f 6c 2d 66 6f 72 2d 74 65 73 74 20 64 62 20 74 ol-for-test db t
74f0: 65 73 74 2d 69 64 20 63 61 74 65 67 6f 72 79 20 est-id category
7500: 76 61 72 69 61 62 6c 65 29 0a 20 20 3b 3b 20 46 variable). ;; F
7510: 69 6e 69 73 68 20 6d 65 3f 0a 20 20 28 76 61 6c inish me?. (val
7520: 75 65 73 20 23 66 20 23 66 20 23 66 29 29 0a 0a ues #f #f #f))..
7530: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ;;==============
7540: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7550: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7560: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7570: 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 53 20 54 20 ========.;; S T
7580: 45 20 50 20 53 20 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d E P S .;;=======
7590: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
75a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
75b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
75c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a ===============.
75d0: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 73 74 65 .(define (db:ste
75e0: 70 2d 67 65 74 2d 74 69 6d 65 2d 61 73 2d 73 74 p-get-time-as-st
75f0: 72 69 6e 67 20 76 65 63 29 0a 20 20 20 20 28 73 ring vec). (s
7600: 65 63 6f 6e 64 73 2d 3e 74 69 6d 65 2d 73 74 72 econds->time-str
7610: 69 6e 67 20 28 64 62 3a 73 74 65 70 2d 67 65 74 ing (db:step-get
7620: 2d 65 76 65 6e 74 5f 74 69 6d 65 20 76 65 63 29 -event_time vec)
7630: 29 29 0a 0a 3b 3b 20 64 62 2d 67 65 74 2d 74 65 ))..;; db-get-te
7640: 73 74 2d 73 74 65 70 73 2d 66 6f 72 2d 72 75 6e st-steps-for-run
7650: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 .(define (db:get
7660: 2d 73 74 65 70 73 2d 66 6f 72 2d 74 65 73 74 20 -steps-for-test
7670: 64 62 20 74 65 73 74 2d 69 64 29 0a 20 20 28 6c db test-id). (l
7680: 65 74 20 28 28 72 65 73 20 27 28 29 29 29 0a 20 et ((res '())).
7690: 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d (sqlite3:for-
76a0: 65 61 63 68 2d 72 6f 77 20 0a 20 20 20 20 20 28 each-row . (
76b0: 6c 61 6d 62 64 61 20 28 69 64 20 74 65 73 74 2d lambda (id test-
76c0: 69 64 20 73 74 65 70 6e 61 6d 65 20 73 74 61 74 id stepname stat
76d0: 65 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d 74 e status event-t
76e0: 69 6d 65 29 0a 20 20 20 20 20 20 20 28 73 65 74 ime). (set
76f0: 21 20 72 65 73 20 28 63 6f 6e 73 20 28 76 65 63 ! res (cons (vec
7700: 74 6f 72 20 69 64 20 74 65 73 74 2d 69 64 20 73 tor id test-id s
7710: 74 65 70 6e 61 6d 65 20 73 74 61 74 65 20 73 74 tepname state st
7720: 61 74 75 73 20 65 76 65 6e 74 2d 74 69 6d 65 29 atus event-time)
7730: 20 72 65 73 29 29 29 0a 20 20 20 20 20 64 62 0a res))). db.
7740: 20 20 20 20 20 22 53 45 4c 45 43 54 20 69 64 2c "SELECT id,
7750: 74 65 73 74 5f 69 64 2c 73 74 65 70 6e 61 6d 65 test_id,stepname
7760: 2c 73 74 61 74 65 2c 73 74 61 74 75 73 2c 65 76 ,state,status,ev
7770: 65 6e 74 5f 74 69 6d 65 20 46 52 4f 4d 20 74 65 ent_time FROM te
7780: 73 74 5f 73 74 65 70 73 20 57 48 45 52 45 20 74 st_steps WHERE t
7790: 65 73 74 5f 69 64 3d 3f 20 4f 52 44 45 52 20 42 est_id=? ORDER B
77a0: 59 20 69 64 20 41 53 43 3b 22 20 3b 3b 20 65 76 Y id ASC;" ;; ev
77b0: 65 6e 74 5f 74 69 6d 65 20 44 45 53 43 2c 69 64 ent_time DESC,id
77c0: 20 41 53 43 3b 0a 20 20 20 20 20 74 65 73 74 2d ASC;. test-
77d0: 69 64 29 0a 20 20 20 20 28 72 65 76 65 72 73 65 id). (reverse
77e0: 20 72 65 73 29 29 29 0a 0a 3b 3b 20 67 65 74 20 res)))..;; get
77f0: 61 20 70 72 65 74 74 79 20 74 61 62 6c 65 20 74 a pretty table t
7800: 6f 20 73 75 6d 6d 61 72 69 7a 65 20 73 74 65 70 o summarize step
7810: 73 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 28 64 62 s.;;.(define (db
7820: 3a 67 65 74 2d 73 74 65 70 73 2d 74 61 62 6c 65 :get-steps-table
7830: 20 64 62 20 74 65 73 74 2d 69 64 29 0a 20 20 28 db test-id). (
7840: 6c 65 74 20 28 28 73 74 65 70 73 20 20 20 28 64 let ((steps (d
7850: 62 3a 67 65 74 2d 73 74 65 70 73 2d 66 6f 72 2d b:get-steps-for-
7860: 74 65 73 74 20 64 62 20 74 65 73 74 2d 69 64 29 test db test-id)
7870: 29 29 0a 20 20 20 20 3b 3b 20 6f 72 67 61 6e 69 )). ;; organi
7880: 73 65 20 74 68 65 20 73 74 65 70 73 20 66 6f 72 se the steps for
7890: 20 62 65 74 74 65 72 20 72 65 61 64 61 62 69 6c better readabil
78a0: 69 74 79 0a 20 20 20 20 28 6c 65 74 20 28 28 72 ity. (let ((r
78b0: 65 73 20 28 6d 61 6b 65 2d 68 61 73 68 2d 74 61 es (make-hash-ta
78c0: 62 6c 65 29 29 29 0a 20 20 20 20 20 20 28 66 6f ble))). (fo
78d0: 72 2d 65 61 63 68 20 0a 20 20 20 20 20 20 20 28 r-each . (
78e0: 6c 61 6d 62 64 61 20 28 73 74 65 70 29 0a 09 20 lambda (step)..
78f0: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 36 20 22 (debug:print 6 "
7900: 73 74 65 70 3d 22 20 73 74 65 70 29 0a 09 20 28 step=" step).. (
7910: 6c 65 74 20 28 28 72 65 63 6f 72 64 20 28 68 61 let ((record (ha
7920: 73 68 2d 74 61 62 6c 65 2d 72 65 66 2f 64 65 66 sh-table-ref/def
7930: 61 75 6c 74 20 0a 09 09 09 72 65 73 20 0a 09 09 ault ....res ...
7940: 09 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 .(db:step-get-st
7950: 65 70 6e 61 6d 65 20 73 74 65 70 29 20 0a 09 09 epname step) ...
7960: 09 3b 3b 20 20 20 20 20 20 20 20 73 74 65 70 6e .;; stepn
7970: 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 ame
7980: 20 20 20 73 74 61 72 74 20 65 6e 64 20 73 74 61 start end sta
7990: 74 75 73 20 20 20 20 0a 09 09 09 28 76 65 63 74 tus ....(vect
79a0: 6f 72 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d or (db:step-get-
79b0: 73 74 65 70 6e 61 6d 65 20 73 74 65 70 29 20 22 stepname step) "
79c0: 22 20 20 20 22 22 20 22 22 20 20 20 20 20 22 22 " "" "" ""
79d0: 29 29 29 29 0a 09 20 20 20 28 64 65 62 75 67 3a )))).. (debug:
79e0: 70 72 69 6e 74 20 36 20 22 72 65 63 6f 72 64 28 print 6 "record(
79f0: 62 65 66 6f 72 65 29 20 3d 20 22 20 72 65 63 6f before) = " reco
7a00: 72 64 20 0a 09 09 09 22 5c 6e 69 64 3a 20 20 20 rd ...."\nid:
7a10: 20 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d 67 " (db:step-g
7a20: 65 74 2d 69 64 20 73 74 65 70 29 0a 09 09 09 22 et-id step)...."
7a30: 5c 6e 73 74 65 70 6e 61 6d 65 3a 20 22 20 28 64 \nstepname: " (d
7a40: 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 65 70 6e b:step-get-stepn
7a50: 61 6d 65 20 73 74 65 70 29 0a 09 09 09 22 5c 6e ame step)...."\n
7a60: 73 74 61 74 65 3a 20 20 20 20 22 20 28 64 62 3a state: " (db:
7a70: 73 74 65 70 2d 67 65 74 2d 73 74 61 74 65 20 73 step-get-state s
7a80: 74 65 70 29 0a 09 09 09 22 5c 6e 73 74 61 74 75 tep)...."\nstatu
7a90: 73 3a 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d s: " (db:step-
7aa0: 67 65 74 2d 73 74 61 74 75 73 20 73 74 65 70 29 get-status step)
7ab0: 0a 09 09 09 22 5c 6e 74 69 6d 65 3a 20 20 20 20 ...."\ntime:
7ac0: 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d " (db:step-get-
7ad0: 65 76 65 6e 74 5f 74 69 6d 65 20 73 74 65 70 29 event_time step)
7ae0: 29 0a 09 20 20 20 28 63 61 73 65 20 28 73 74 72 ).. (case (str
7af0: 69 6e 67 2d 3e 73 79 6d 62 6f 6c 20 28 64 62 3a ing->symbol (db:
7b00: 73 74 65 70 2d 67 65 74 2d 73 74 61 74 65 20 73 step-get-state s
7b10: 74 65 70 29 29 0a 09 20 20 20 20 20 28 28 73 74 tep)).. ((st
7b20: 61 72 74 29 28 76 65 63 74 6f 72 2d 73 65 74 21 art)(vector-set!
7b30: 20 72 65 63 6f 72 64 20 31 20 28 64 62 3a 73 74 record 1 (db:st
7b40: 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d ep-get-event_tim
7b50: 65 20 73 74 65 70 29 29 0a 09 20 20 20 20 20 20 e step))..
7b60: 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63 (vector-set! rec
7b70: 6f 72 64 20 33 20 28 69 66 20 28 65 71 75 61 6c ord 3 (if (equal
7b80: 3f 20 28 76 65 63 74 6f 72 2d 72 65 66 20 72 65 ? (vector-ref re
7b90: 63 6f 72 64 20 33 29 20 22 22 29 0a 09 09 09 09 cord 3) "").....
7ba0: 09 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 .(db:step-get-st
7bb0: 61 74 75 73 20 73 74 65 70 29 29 29 29 0a 09 20 atus step))))..
7bc0: 20 20 20 20 28 28 65 6e 64 29 20 20 0a 09 20 20 ((end) ..
7bd0: 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 (vector-set!
7be0: 20 72 65 63 6f 72 64 20 32 20 28 61 6e 79 2d 3e record 2 (any->
7bf0: 6e 75 6d 62 65 72 20 28 64 62 3a 73 74 65 70 2d number (db:step-
7c00: 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73 get-event_time s
7c10: 74 65 70 29 29 29 0a 09 20 20 20 20 20 20 28 76 tep))).. (v
7c20: 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 ector-set! recor
7c30: 64 20 33 20 28 64 62 3a 73 74 65 70 2d 67 65 74 d 3 (db:step-get
7c40: 2d 73 74 61 74 75 73 20 73 74 65 70 29 29 0a 09 -status step))..
7c50: 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 (vector-se
7c60: 74 21 20 72 65 63 6f 72 64 20 34 20 28 6c 65 74 t! record 4 (let
7c70: 20 28 28 73 74 61 72 74 74 20 28 61 6e 79 2d 3e ((startt (any->
7c80: 6e 75 6d 62 65 72 20 28 76 65 63 74 6f 72 2d 72 number (vector-r
7c90: 65 66 20 72 65 63 6f 72 64 20 31 29 29 29 0a 09 ef record 1)))..
7ca0: 09 09 09 09 20 20 28 65 6e 64 74 20 20 20 28 61 .... (endt (a
7cb0: 6e 79 2d 3e 6e 75 6d 62 65 72 20 28 76 65 63 74 ny->number (vect
7cc0: 6f 72 2d 72 65 66 20 72 65 63 6f 72 64 20 32 29 or-ref record 2)
7cd0: 29 29 29 0a 09 09 09 09 20 20 20 20 20 20 28 64 )))..... (d
7ce0: 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22 72 65 ebug:print 4 "re
7cf0: 63 6f 72 64 5b 31 5d 3d 22 20 28 76 65 63 74 6f cord[1]=" (vecto
7d00: 72 2d 72 65 66 20 72 65 63 6f 72 64 20 31 29 20 r-ref record 1)
7d10: 0a 09 09 09 09 09 09 20 20 20 22 2c 20 73 74 61 ....... ", sta
7d20: 72 74 74 3d 22 20 73 74 61 72 74 74 20 22 2c 20 rtt=" startt ",
7d30: 65 6e 64 74 3d 22 20 65 6e 64 74 0a 09 09 09 09 endt=" endt.....
7d40: 09 09 20 20 20 22 2c 20 67 65 74 2d 73 74 61 74 .. ", get-stat
7d50: 75 73 3a 20 22 20 28 64 62 3a 73 74 65 70 2d 67 us: " (db:step-g
7d60: 65 74 2d 73 74 61 74 75 73 20 73 74 65 70 29 29 et-status step))
7d70: 0a 09 09 09 09 20 20 20 20 20 20 28 69 66 20 28 ..... (if (
7d80: 61 6e 64 20 28 6e 75 6d 62 65 72 3f 20 73 74 61 and (number? sta
7d90: 72 74 74 29 28 6e 75 6d 62 65 72 3f 20 65 6e 64 rtt)(number? end
7da0: 74 29 29 0a 09 09 09 09 09 20 20 28 73 65 63 6f t))...... (seco
7db0: 6e 64 73 2d 3e 68 72 2d 6d 69 6e 2d 73 65 63 20 nds->hr-min-sec
7dc0: 28 2d 20 65 6e 64 74 20 73 74 61 72 74 74 29 29 (- endt startt))
7dd0: 20 22 2d 31 22 29 29 29 29 0a 09 20 20 20 20 20 "-1"))))..
7de0: 28 65 6c 73 65 0a 09 20 20 20 20 20 20 20 20 28 (else.. (
7df0: 76 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f vector-set! reco
7e00: 72 64 20 32 20 28 64 62 3a 73 74 65 70 2d 67 65 rd 2 (db:step-ge
7e10: 74 2d 73 74 61 74 65 20 73 74 65 70 29 29 0a 09 t-state step))..
7e20: 20 20 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d (vector-
7e30: 73 65 74 21 20 72 65 63 6f 72 64 20 33 20 28 64 set! record 3 (d
7e40: 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 74 75 b:step-get-statu
7e50: 73 20 73 74 65 70 29 29 0a 09 20 20 20 20 20 20 s step))..
7e60: 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72 (vector-set! r
7e70: 65 63 6f 72 64 20 34 20 28 64 62 3a 73 74 65 70 ecord 4 (db:step
7e80: 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 -get-event_time
7e90: 73 74 65 70 29 29 29 29 0a 09 20 20 20 28 68 61 step)))).. (ha
7ea0: 73 68 2d 74 61 62 6c 65 2d 73 65 74 21 20 72 65 sh-table-set! re
7eb0: 73 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 s (db:step-get-s
7ec0: 74 65 70 6e 61 6d 65 20 73 74 65 70 29 20 72 65 tepname step) re
7ed0: 63 6f 72 64 29 0a 09 20 20 20 28 64 65 62 75 67 cord).. (debug
7ee0: 3a 70 72 69 6e 74 20 36 20 22 72 65 63 6f 72 64 :print 6 "record
7ef0: 28 61 66 74 65 72 29 20 20 3d 20 22 20 72 65 63 (after) = " rec
7f00: 6f 72 64 20 0a 09 09 09 22 5c 6e 69 64 3a 20 20 ord ...."\nid:
7f10: 20 20 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d " (db:step-
7f20: 67 65 74 2d 69 64 20 73 74 65 70 29 0a 09 09 09 get-id step)....
7f30: 22 5c 6e 73 74 65 70 6e 61 6d 65 3a 20 22 20 28 "\nstepname: " (
7f40: 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 65 70 db:step-get-step
7f50: 6e 61 6d 65 20 73 74 65 70 29 0a 09 09 09 22 5c name step)...."\
7f60: 6e 73 74 61 74 65 3a 20 20 20 20 22 20 28 64 62 nstate: " (db
7f70: 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 74 65 20 :step-get-state
7f80: 73 74 65 70 29 0a 09 09 09 22 5c 6e 73 74 61 74 step)...."\nstat
7f90: 75 73 3a 20 20 20 22 20 28 64 62 3a 73 74 65 70 us: " (db:step
7fa0: 2d 67 65 74 2d 73 74 61 74 75 73 20 73 74 65 70 -get-status step
7fb0: 29 0a 09 09 09 22 5c 6e 74 69 6d 65 3a 20 20 20 )...."\ntime:
7fc0: 20 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 " (db:step-get
7fd0: 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73 74 65 70 -event_time step
7fe0: 29 29 29 29 0a 20 20 20 20 20 20 20 3b 3b 20 28 )))). ;; (
7ff0: 65 6c 73 65 20 20 20 28 76 65 63 74 6f 72 2d 73 else (vector-s
8000: 65 74 21 20 72 65 63 6f 72 64 20 31 20 28 64 62 et! record 1 (db
8010: 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f :step-get-event_
8020: 74 69 6d 65 20 73 74 65 70 29 29 29 0a 20 20 20 time step))).
8030: 20 20 20 20 28 73 6f 72 74 20 73 74 65 70 73 20 (sort steps
8040: 28 6c 61 6d 62 64 61 20 28 61 20 62 29 28 3c 20 (lambda (a b)(<
8050: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 (db:step-get-eve
8060: 6e 74 5f 74 69 6d 65 20 61 29 28 64 62 3a 73 74 nt_time a)(db:st
8070: 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d ep-get-event_tim
8080: 65 20 62 29 29 29 29 29 0a 20 20 20 20 20 20 72 e b))))). r
8090: 65 73 29 29 29 0a 0a 3b 3b 20 55 53 45 3a 20 28 es)))..;; USE: (
80a0: 6c 73 65 74 2d 64 69 66 66 65 72 65 6e 63 65 20 lset-difference
80b0: 73 74 72 69 6e 67 3d 3f 20 27 28 22 61 22 20 22 string=? '("a" "
80c0: 62 22 20 22 63 22 29 20 27 28 22 64 22 20 22 63 b" "c") '("d" "c
80d0: 22 20 22 65 22 20 22 61 22 29 29 0a 3b 3b 0a 3b " "e" "a")).;;.;
80e0: 3b 20 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20 ; Return a list
80f0: 6f 66 20 70 72 65 72 65 71 73 20 74 68 61 74 20 of prereqs that
8100: 77 65 72 65 20 4e 4f 54 20 6d 65 74 0a 3b 3b 20 were NOT met.;;
8110: 20 54 65 73 74 73 20 28 61 6e 64 20 61 6c 6c 20 Tests (and all
8120: 69 74 65 6d 73 29 20 69 6e 20 77 61 69 74 6f 6e items) in waiton
8130: 20 6c 69 73 74 20 6d 75 73 74 20 62 65 20 22 43 list must be "C
8140: 4f 4d 50 4c 45 54 45 44 22 20 61 6e 64 20 22 50 OMPLETED" and "P
8150: 41 53 53 22 0a 28 64 65 66 69 6e 65 20 28 64 62 ASS".(define (db
8160: 2d 67 65 74 2d 70 72 65 72 65 71 73 2d 6e 6f 74 -get-prereqs-not
8170: 2d 6d 65 74 20 64 62 20 72 75 6e 2d 69 64 20 77 -met db run-id w
8180: 61 69 74 6f 6e 29 0a 20 20 28 69 66 20 28 6e 75 aiton). (if (nu
8190: 6c 6c 3f 20 77 61 69 74 6f 6e 29 0a 20 20 20 20 ll? waiton).
81a0: 20 20 27 28 29 0a 20 20 20 20 20 20 28 6c 65 74 '(). (let
81b0: 2a 20 28 28 75 6e 6d 65 74 2d 70 72 65 2d 72 65 * ((unmet-pre-re
81c0: 71 73 20 27 28 29 29 0a 09 20 20 20 20 20 28 74 qs '()).. (t
81d0: 65 73 74 73 20 20 20 20 20 20 20 20 20 20 20 28 ests (
81e0: 64 62 2d 67 65 74 2d 74 65 73 74 73 2d 66 6f 72 db-get-tests-for
81f0: 2d 72 75 6e 20 64 62 20 72 75 6e 2d 69 64 20 23 -run db run-id #
8200: 66 20 23 66 20 27 28 29 20 27 28 29 29 29 0a 09 f #f '() '()))..
8210: 20 20 20 20 20 28 72 65 73 75 6c 74 20 20 20 20 (result
8220: 20 20 20 20 20 27 28 29 29 29 0a 09 28 66 6f 72 '()))..(for
8230: 2d 65 61 63 68 20 28 6c 61 6d 62 64 61 20 28 77 -each (lambda (w
8240: 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 29 0a aitontest-name).
8250: 09 09 20 20 20 20 28 6c 65 74 20 28 28 65 76 65 .. (let ((eve
8260: 72 2d 73 65 65 6e 20 23 66 29 29 0a 09 09 20 20 r-seen #f))...
8270: 20 20 20 20 28 66 6f 72 2d 65 61 63 68 20 28 6c (for-each (l
8280: 61 6d 62 64 61 20 28 74 65 73 74 29 0a 09 09 09 ambda (test)....
8290: 09 20 20 28 69 66 20 28 65 71 75 61 6c 3f 20 77 . (if (equal? w
82a0: 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 20 28 aitontest-name (
82b0: 64 62 3a 74 65 73 74 2d 67 65 74 2d 74 65 73 74 db:test-get-test
82c0: 6e 61 6d 65 20 74 65 73 74 29 29 0a 09 09 09 09 name test)).....
82d0: 20 20 20 20 20 20 28 62 65 67 69 6e 0a 09 09 09 (begin....
82e0: 09 09 28 73 65 74 21 20 65 76 65 72 2d 73 65 65 ..(set! ever-see
82f0: 6e 20 23 74 29 0a 09 09 09 09 09 28 69 66 20 28 n #t)......(if (
8300: 6e 6f 74 20 28 61 6e 64 20 28 65 71 75 61 6c 3f not (and (equal?
8310: 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 73 74 (db:test-get-st
8320: 61 74 65 20 74 65 73 74 29 20 22 43 4f 4d 50 4c ate test) "COMPL
8330: 45 54 45 44 22 29 0a 09 09 09 09 09 09 20 20 20 ETED").......
8340: 20 20 20 28 6d 65 6d 62 65 72 20 28 64 62 3a 74 (member (db:t
8350: 65 73 74 2d 67 65 74 2d 73 74 61 74 75 73 20 74 est-get-status t
8360: 65 73 74 29 20 27 28 22 50 41 53 53 22 20 22 57 est) '("PASS" "W
8370: 41 52 4e 22 20 22 43 48 45 43 4b 22 29 29 29 29 ARN" "CHECK"))))
8380: 0a 09 09 09 09 09 20 20 20 20 28 73 65 74 21 20 ...... (set!
8390: 72 65 73 75 6c 74 20 28 63 6f 6e 73 20 77 61 69 result (cons wai
83a0: 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 20 72 65 73 tontest-name res
83b0: 75 6c 74 29 29 29 29 29 29 0a 09 09 09 09 74 65 ult)))))).....te
83c0: 73 74 73 29 0a 09 09 20 20 20 20 20 20 28 69 66 sts)... (if
83d0: 20 28 6e 6f 74 20 65 76 65 72 2d 73 65 65 6e 29 (not ever-seen)
83e0: 28 73 65 74 21 20 72 65 73 75 6c 74 20 28 63 6f (set! result (co
83f0: 6e 73 20 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 ns waitontest-na
8400: 6d 65 20 72 65 73 75 6c 74 29 29 29 29 29 0a 09 me result)))))..
8410: 09 20 20 77 61 69 74 6f 6e 29 0a 09 28 64 65 6c . waiton)..(del
8420: 65 74 65 2d 64 75 70 6c 69 63 61 74 65 73 20 72 ete-duplicates r
8430: 65 73 75 6c 74 29 29 29 29 0a 0a 3b 3b 3d 3d 3d esult))))..;;===
8440: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8450: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8460: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8470: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8480: 3d 3d 3d 0a 3b 3b 20 45 78 74 72 61 63 74 20 6f ===.;; Extract o
8490: 64 73 20 66 69 6c 65 20 66 72 6f 6d 20 74 68 65 ds file from the
84a0: 20 64 62 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d db.;;==========
84b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
84c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
84d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
84e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b ============..;;
84f0: 20 72 75 6e 73 70 61 74 74 20 69 73 20 61 20 63 runspatt is a c
8500: 6f 6d 6d 61 20 64 65 6c 69 6d 69 74 65 64 20 6c omma delimited l
8510: 69 73 74 20 6f 66 20 72 75 6e 20 70 61 74 74 65 ist of run patte
8520: 72 6e 73 0a 3b 3b 20 6b 65 79 70 61 74 74 2d 61 rns.;; keypatt-a
8530: 6c 69 73 74 20 6d 75 73 74 20 63 6f 6e 74 61 69 list must contai
8540: 6e 20 2a 61 6c 6c 2a 20 6b 65 79 73 20 77 69 74 n *all* keys wit
8550: 68 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20 h an associated
8560: 70 61 74 74 65 72 6e 3a 20 27 28 20 28 22 4b 45 pattern: '( ("KE
8570: 59 31 22 20 22 25 22 29 20 2e 2e 20 29 0a 28 64 Y1" "%") .. ).(d
8580: 65 66 69 6e 65 20 28 64 62 3a 65 78 74 72 61 63 efine (db:extrac
8590: 74 2d 6f 64 73 2d 66 69 6c 65 20 64 62 20 6f 75 t-ods-file db ou
85a0: 74 70 75 74 66 69 6c 65 20 6b 65 79 70 61 74 74 tputfile keypatt
85b0: 2d 61 6c 69 73 74 20 72 75 6e 73 70 61 74 74 20 -alist runspatt
85c0: 70 61 74 68 6d 6f 64 29 0a 20 20 28 6c 65 74 2a pathmod). (let*
85d0: 20 28 28 6b 65 79 73 73 74 72 20 20 28 73 74 72 ((keysstr (str
85e0: 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 ing-intersperse
85f0: 28 6d 61 70 20 63 61 72 20 6b 65 79 70 61 74 74 (map car keypatt
8600: 2d 61 6c 69 73 74 29 20 22 2c 22 29 29 0a 09 20 -alist) ","))..
8610: 28 6b 65 79 71 72 79 20 20 20 28 73 74 72 69 6e (keyqry (strin
8620: 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 28 6d g-intersperse (m
8630: 61 70 20 28 6c 61 6d 62 64 61 20 28 70 29 28 63 ap (lambda (p)(c
8640: 6f 6e 63 20 28 63 61 72 20 70 29 20 22 20 4c 49 onc (car p) " LI
8650: 4b 45 20 3f 20 22 29 29 20 6b 65 79 70 61 74 74 KE ? ")) keypatt
8660: 2d 61 6c 69 73 74 29 20 22 20 41 4e 44 20 22 29 -alist) " AND ")
8670: 29 0a 09 20 28 6e 75 6d 6b 65 79 73 20 20 28 6c ).. (numkeys (l
8680: 65 6e 67 74 68 20 6b 65 79 70 61 74 74 2d 61 6c ength keypatt-al
8690: 69 73 74 29 29 0a 09 20 28 74 65 73 74 2d 69 64 ist)).. (test-id
86a0: 73 20 27 28 29 29 0a 09 20 28 77 69 6e 64 6f 77 s '()).. (window
86b0: 73 20 20 28 61 6e 64 20 70 61 74 68 6d 6f 64 20 s (and pathmod
86c0: 28 73 75 62 73 74 72 69 6e 67 2d 69 6e 64 65 78 (substring-index
86d0: 20 22 5c 5c 22 20 70 61 74 68 6d 6f 64 29 29 29 "\\" pathmod)))
86e0: 0a 09 20 28 74 65 6d 70 64 69 72 20 20 28 63 6f .. (tempdir (co
86f0: 6e 63 20 22 2f 74 6d 70 2f 22 20 28 63 75 72 72 nc "/tmp/" (curr
8700: 65 6e 74 2d 75 73 65 72 2d 6e 61 6d 65 29 20 22 ent-user-name) "
8710: 2f 22 20 72 75 6e 73 70 61 74 74 20 22 5f 22 20 /" runspatt "_"
8720: 28 72 61 6e 64 6f 6d 20 31 30 30 30 30 29 20 22 (random 10000) "
8730: 5f 22 20 28 63 75 72 72 65 6e 74 2d 70 72 6f 63 _" (current-proc
8740: 65 73 73 2d 69 64 29 29 29 0a 09 20 28 72 75 6e ess-id))).. (run
8750: 73 68 65 61 64 65 72 20 28 61 70 70 65 6e 64 20 sheader (append
8760: 28 6c 69 73 74 20 22 52 75 6e 20 49 64 22 20 22 (list "Run Id" "
8770: 52 75 6e 6e 61 6d 65 22 29 20 3b 20 30 20 31 0a Runname") ; 0 1.
8780: 09 09 09 20 20 20 20 20 28 6d 61 70 20 63 61 72 ... (map car
8790: 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 29 20 keypatt-alist)
87a0: 20 20 3b 20 2b 20 4e 20 3d 20 6c 65 6e 67 74 68 ; + N = length
87b0: 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 0a 09 keypatt-alist..
87c0: 09 09 20 20 20 20 20 28 6c 69 73 74 20 22 54 65 .. (list "Te
87d0: 73 74 6e 61 6d 65 22 20 20 20 20 20 20 20 20 20 stname"
87e0: 20 3b 20 32 0a 09 09 09 09 20 20 20 22 49 74 65 ; 2..... "Ite
87f0: 6d 20 50 61 74 68 22 20 20 20 20 20 20 20 20 20 m Path"
8800: 3b 20 33 20 0a 09 09 09 09 20 20 20 22 44 65 73 ; 3 ..... "Des
8810: 63 72 69 70 74 69 6f 6e 22 20 20 20 20 20 20 20 cription"
8820: 3b 20 34 20 0a 09 09 09 09 20 20 20 22 53 74 61 ; 4 ..... "Sta
8830: 74 65 22 20 20 20 20 20 20 20 20 20 20 20 20 20 te"
8840: 3b 20 35 20 0a 09 09 09 09 20 20 20 22 53 74 61 ; 5 ..... "Sta
8850: 74 75 73 22 20 20 20 20 20 20 20 20 20 20 20 20 tus"
8860: 3b 20 36 20 20 0a 09 09 09 09 20 20 20 22 46 69 ; 6 ..... "Fi
8870: 6e 61 6c 20 4c 6f 67 22 20 20 20 20 20 20 20 20 nal Log"
8880: 20 3b 20 37 20 0a 09 09 09 09 20 20 20 22 52 75 ; 7 ..... "Ru
8890: 6e 20 44 75 72 61 74 69 6f 6e 22 20 20 20 20 20 n Duration"
88a0: 20 3b 20 38 20 0a 09 09 09 09 20 20 20 22 57 68 ; 8 ..... "Wh
88b0: 65 6e 20 52 75 6e 22 20 20 20 20 20 20 20 20 20 en Run"
88c0: 20 3b 20 39 20 0a 09 09 09 09 20 20 20 22 54 61 ; 9 ..... "Ta
88d0: 67 73 22 20 20 20 20 20 20 20 20 20 20 20 20 20 gs"
88e0: 20 3b 20 31 30 0a 09 09 09 09 20 20 20 22 52 75 ; 10..... "Ru
88f0: 6e 20 4f 77 6e 65 72 22 20 20 20 20 20 20 20 20 n Owner"
8900: 20 3b 20 31 31 0a 09 09 09 09 20 20 20 22 43 6f ; 11..... "Co
8910: 6d 6d 65 6e 74 22 20 20 20 20 20 20 20 20 20 20 mment"
8920: 20 3b 20 31 32 0a 09 09 09 09 20 20 20 22 41 75 ; 12..... "Au
8930: 74 68 6f 72 22 20 20 20 20 20 20 20 20 20 20 20 thor"
8940: 20 3b 20 31 33 0a 09 09 09 09 20 20 20 22 54 65 ; 13..... "Te
8950: 73 74 20 4f 77 6e 65 72 22 20 20 20 20 20 20 20 st Owner"
8960: 20 3b 20 31 34 0a 09 09 09 09 20 20 20 22 52 65 ; 14..... "Re
8970: 76 69 65 77 65 64 22 20 20 20 20 20 20 20 20 20 viewed"
8980: 20 3b 20 31 35 0a 09 09 09 09 20 20 20 22 44 69 ; 15..... "Di
8990: 73 6b 66 72 65 65 22 20 20 20 20 20 20 20 20 20 skfree"
89a0: 20 3b 20 31 36 0a 09 09 09 09 20 20 20 22 55 6e ; 16..... "Un
89b0: 61 6d 65 22 20 20 20 20 20 20 20 20 20 20 20 20 ame"
89c0: 20 3b 20 31 37 0a 09 09 09 09 20 20 20 22 52 75 ; 17..... "Ru
89d0: 6e 64 69 72 22 20 20 20 20 20 20 20 20 20 20 20 ndir"
89e0: 20 3b 20 31 38 0a 09 09 09 09 20 20 20 22 48 6f ; 18..... "Ho
89f0: 73 74 22 20 20 20 20 20 20 20 20 20 20 20 20 20 st"
8a00: 20 3b 20 31 39 0a 09 09 09 09 20 20 20 22 43 70 ; 19..... "Cp
8a10: 75 20 4c 6f 61 64 22 20 20 20 20 20 20 20 20 20 u Load"
8a20: 20 3b 20 32 30 0a 09 09 09 09 20 20 20 29 29 29 ; 20..... )))
8a30: 0a 09 20 28 72 65 73 75 6c 74 73 20 28 6c 69 73 .. (results (lis
8a40: 74 20 72 75 6e 73 68 65 61 64 65 72 29 29 09 09 t runsheader))..
8a50: 09 20 0a 09 20 28 74 65 73 74 64 61 74 61 2d 68 . .. (testdata-h
8a60: 65 61 64 65 72 20 28 6c 69 73 74 20 22 52 75 6e eader (list "Run
8a70: 20 49 64 22 20 22 54 65 73 74 6e 61 6d 65 22 20 Id" "Testname"
8a80: 22 49 74 65 6d 20 50 61 74 68 22 20 22 43 61 74 "Item Path" "Cat
8a90: 65 67 6f 72 79 22 20 22 56 61 72 69 61 62 6c 65 egory" "Variable
8aa0: 22 20 22 56 61 6c 75 65 22 20 22 45 78 70 65 63 " "Value" "Expec
8ab0: 74 65 64 22 20 22 54 6f 6c 22 20 22 55 6e 69 74 ted" "Tol" "Unit
8ac0: 73 22 20 22 53 74 61 74 75 73 22 20 22 43 6f 6d s" "Status" "Com
8ad0: 6d 65 6e 74 22 29 29 29 0a 20 20 20 20 28 64 65 ment"))). (de
8ae0: 62 75 67 3a 70 72 69 6e 74 20 32 20 22 55 73 69 bug:print 2 "Usi
8af0: 6e 67 20 22 20 74 65 6d 70 64 69 72 20 22 20 66 ng " tempdir " f
8b00: 6f 72 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 or constructing
8b10: 74 68 65 20 6f 64 73 20 66 69 6c 65 2e 20 6b 65 the ods file. ke
8b20: 79 71 72 79 3a 20 22 20 6b 65 79 71 72 79 20 22 yqry: " keyqry "
8b30: 20 6b 65 79 73 74 72 3a 20 22 20 6b 65 79 73 73 keystr: " keyss
8b40: 74 72 20 22 20 77 69 74 68 20 6b 65 79 73 3a 20 tr " with keys:
8b50: 22 20 28 6d 61 70 20 63 61 64 72 20 6b 65 79 70 " (map cadr keyp
8b60: 61 74 74 2d 61 6c 69 73 74 29 29 0a 20 20 20 20 att-alist)).
8b70: 3b 3b 20 22 45 78 70 65 63 74 65 64 20 56 61 6c ;; "Expected Val
8b80: 75 65 22 0a 20 20 20 20 3b 3b 20 22 56 61 6c 75 ue". ;; "Valu
8b90: 65 20 46 6f 75 6e 64 22 0a 20 20 20 20 3b 3b 20 e Found". ;;
8ba0: 22 54 6f 6c 65 72 61 6e 63 65 22 0a 20 20 20 20 "Tolerance".
8bb0: 28 61 70 70 6c 79 20 73 71 6c 69 74 65 33 3a 66 (apply sqlite3:f
8bc0: 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 or-each-row.
8bd0: 20 28 6c 61 6d 62 64 61 20 28 74 65 73 74 2d 69 (lambda (test-i
8be0: 64 20 2e 20 62 29 0a 20 20 20 20 20 20 20 28 73 d . b). (s
8bf0: 65 74 21 20 74 65 73 74 2d 69 64 73 20 28 63 6f et! test-ids (co
8c00: 6e 73 20 74 65 73 74 2d 69 64 20 74 65 73 74 2d ns test-id test-
8c10: 69 64 73 29 29 20 20 20 3b 3b 20 74 65 73 74 2d ids)) ;; test-
8c20: 69 64 20 69 73 20 6e 6f 77 20 74 65 73 74 6e 61 id is now testna
8c30: 6d 65 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 me. (set!
8c40: 72 65 73 75 6c 74 73 20 28 61 70 70 65 6e 64 20 results (append
8c50: 72 65 73 75 6c 74 73 20 3b 3b 20 6e 6f 74 65 2c results ;; note,
8c60: 20 64 72 6f 70 20 74 68 65 20 74 65 73 74 2d 69 drop the test-i
8c70: 64 0a 09 09 09 20 20 20 20 20 28 6c 69 73 74 0a d.... (list.
8c80: 09 09 09 20 20 20 20 20 20 28 69 66 20 70 61 74 ... (if pat
8c90: 68 6d 6f 64 0a 09 09 09 09 20 20 28 6c 65 74 2a hmod..... (let*
8ca0: 20 28 28 76 62 20 20 20 20 20 20 20 20 28 61 70 ((vb (ap
8cb0: 70 6c 79 20 76 65 63 74 6f 72 20 62 29 29 0a 09 ply vector b))..
8cc0: 09 09 09 09 20 28 6b 65 79 76 61 6c 73 20 20 20 .... (keyvals
8cd0: 28 6c 65 74 20 6c 6f 6f 70 20 28 28 69 20 20 20 (let loop ((i
8ce0: 20 30 29 0a 09 09 09 09 09 09 09 20 20 20 20 20 0)........
8cf0: 20 20 28 72 65 73 20 27 28 29 29 29 0a 09 09 09 (res '()))....
8d00: 09 09 09 20 20 20 20 20 20 28 69 66 20 28 3e 3d ... (if (>=
8d10: 20 69 20 6e 75 6d 6b 65 79 73 29 0a 09 09 09 09 i numkeys).....
8d20: 09 09 09 20 20 72 65 73 0a 09 09 09 09 09 09 09 ... res........
8d30: 20 20 28 6c 6f 6f 70 20 28 2b 20 69 20 31 29 0a (loop (+ i 1).
8d40: 09 09 09 09 09 09 09 09 28 61 70 70 65 6e 64 20 ........(append
8d50: 72 65 73 20 28 6c 69 73 74 20 28 76 65 63 74 6f res (list (vecto
8d60: 72 2d 72 65 66 20 76 62 20 28 2b 20 69 20 32 29 r-ref vb (+ i 2)
8d70: 29 29 29 29 29 29 29 0a 09 09 09 09 09 20 28 72 )))))))...... (r
8d80: 75 6e 6e 61 6d 65 20 20 20 28 76 65 63 74 6f 72 unname (vector
8d90: 2d 72 65 66 20 76 62 20 31 29 29 0a 09 09 09 09 -ref vb 1)).....
8da0: 09 20 28 74 65 73 74 6e 61 6d 65 20 20 28 76 65 . (testname (ve
8db0: 63 74 6f 72 2d 72 65 66 20 76 62 20 28 2b 20 20 ctor-ref vb (+
8dc0: 32 20 6e 75 6d 6b 65 79 73 29 29 29 0a 09 09 09 2 numkeys)))....
8dd0: 09 09 20 28 69 74 65 6d 2d 70 61 74 68 20 28 76 .. (item-path (v
8de0: 65 63 74 6f 72 2d 72 65 66 20 76 62 20 28 2b 20 ector-ref vb (+
8df0: 20 33 20 6e 75 6d 6b 65 79 73 29 29 29 0a 09 09 3 numkeys)))...
8e00: 09 09 09 20 28 66 69 6e 61 6c 2d 6c 6f 67 20 28 ... (final-log (
8e10: 76 65 63 74 6f 72 2d 72 65 66 20 76 62 20 28 2b vector-ref vb (+
8e20: 20 20 37 20 6e 75 6d 6b 65 79 73 29 29 29 0a 09 7 numkeys)))..
8e30: 09 09 09 09 20 28 72 75 6e 2d 64 69 72 20 20 20 .... (run-dir
8e40: 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62 20 28 (vector-ref vb (
8e50: 2b 20 31 38 20 6e 75 6d 6b 65 79 73 29 29 29 0a + 18 numkeys))).
8e60: 09 09 09 09 09 20 28 6c 6f 67 2d 66 70 61 74 68 ..... (log-fpath
8e70: 20 28 63 6f 6e 63 20 72 75 6e 2d 64 69 72 20 22 (conc run-dir "
8e80: 2f 22 20 20 66 69 6e 61 6c 2d 6c 6f 67 29 29 29 /" final-log)))
8e90: 20 3b 3b 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 ;; (string-inte
8ea0: 72 73 70 65 72 73 65 20 6b 65 79 76 61 6c 73 20 rsperse keyvals
8eb0: 22 2f 22 29 20 22 2f 22 20 74 65 73 74 6e 61 6d "/") "/" testnam
8ec0: 65 20 22 2f 22 20 69 74 65 6d 2d 70 61 74 68 20 e "/" item-path
8ed0: 22 2f 22 0a 09 09 09 09 20 20 20 20 28 64 65 62 "/"..... (deb
8ee0: 75 67 3a 70 72 69 6e 74 20 34 20 22 6c 6f 67 3a ug:print 4 "log:
8ef0: 20 22 20 6c 6f 67 2d 66 70 61 74 68 20 22 20 65 " log-fpath " e
8f00: 78 69 73 74 73 3a 20 22 20 28 66 69 6c 65 2d 65 xists: " (file-e
8f10: 78 69 73 74 73 3f 20 6c 6f 67 2d 66 70 61 74 68 xists? log-fpath
8f20: 29 29 0a 09 09 09 09 20 20 20 20 28 76 65 63 74 ))..... (vect
8f30: 6f 72 2d 73 65 74 21 20 76 62 20 28 2b 20 37 20 or-set! vb (+ 7
8f40: 6e 75 6d 6b 65 79 73 29 20 28 69 66 20 28 66 69 numkeys) (if (fi
8f50: 6c 65 2d 65 78 69 73 74 73 3f 20 6c 6f 67 2d 66 le-exists? log-f
8f60: 70 61 74 68 29 0a 09 09 09 09 09 09 09 09 20 20 path).........
8f70: 20 20 20 20 28 6c 65 74 20 28 28 6e 65 77 70 61 (let ((newpa
8f80: 74 68 20 28 63 6f 6e 63 20 70 61 74 68 6d 6f 64 th (conc pathmod
8f90: 20 22 2f 22 0a 09 09 09 09 09 09 09 09 09 09 09 "/"............
8fa0: 20 20 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 (string-inter
8fb0: 73 70 65 72 73 65 20 6b 65 79 76 61 6c 73 20 22 sperse keyvals "
8fc0: 2f 22 29 0a 09 09 09 09 09 09 09 09 09 09 09 20 /")............
8fd0: 20 20 22 2f 22 20 72 75 6e 6e 61 6d 65 20 22 2f "/" runname "/
8fe0: 22 20 74 65 73 74 6e 61 6d 65 20 22 2f 22 0a 09 " testname "/"..
8ff0: 09 09 09 09 09 09 09 09 09 09 20 20 20 28 69 66 .......... (if
9000: 20 28 73 74 72 69 6e 67 3d 3f 20 69 74 65 6d 2d (string=? item-
9010: 70 61 74 68 20 22 22 29 20 22 22 20 28 63 6f 6e path "") "" (con
9020: 63 20 22 2f 22 20 69 74 65 6d 2d 70 61 74 68 29 c "/" item-path)
9030: 29 0a 09 09 09 09 09 09 09 09 09 09 09 20 20 20 )............
9040: 66 69 6e 61 6c 2d 6c 6f 67 29 29 29 0a 09 09 09 final-log)))....
9050: 09 09 09 09 09 09 3b 3b 20 66 6f 72 20 6e 6f 77 ......;; for now
9060: 20 74 68 72 6f 77 20 61 77 61 79 20 6e 65 77 70 throw away newp
9070: 61 74 68 20 61 6e 64 20 75 73 65 20 74 68 65 20 ath and use the
9080: 6c 6f 67 2d 66 70 61 74 68 20 63 6f 6e 63 27 64 log-fpath conc'd
9090: 20 77 69 74 68 20 70 61 74 68 6d 6f 64 0a 09 09 with pathmod...
90a0: 09 09 09 09 09 09 09 28 73 65 74 21 20 6e 65 77 .......(set! new
90b0: 70 61 74 68 20 28 63 6f 6e 63 20 70 61 74 68 6d path (conc pathm
90c0: 6f 64 20 6c 6f 67 2d 66 70 61 74 68 29 29 0a 09 od log-fpath))..
90d0: 09 09 09 09 09 09 09 09 28 69 66 20 77 69 6e 64 ........(if wind
90e0: 6f 77 73 20 28 73 74 72 69 6e 67 2d 74 72 61 6e ows (string-tran
90f0: 73 6c 61 74 65 20 6e 65 77 70 61 74 68 20 22 2f slate newpath "/
9100: 22 20 22 5c 5c 22 29 20 6e 65 77 70 61 74 68 29 " "\\") newpath)
9110: 29 0a 09 09 09 09 09 09 09 09 20 20 20 20 20 20 ).........
9120: 28 69 66 20 28 3e 20 2a 76 65 72 62 6f 73 69 74 (if (> *verbosit
9130: 79 2a 20 31 29 0a 09 09 09 09 09 09 09 09 09 20 y* 1)..........
9140: 20 28 63 6f 6e 63 20 66 69 6e 61 6c 2d 6c 6f 67 (conc final-log
9150: 20 22 20 6e 6f 74 2d 66 6f 75 6e 64 22 29 0a 09 " not-found")..
9160: 09 09 09 09 09 09 09 09 20 20 22 22 29 29 29 0a ........ ""))).
9170: 09 09 09 09 20 20 20 20 28 76 65 63 74 6f 72 2d .... (vector-
9180: 3e 6c 69 73 74 20 76 62 29 29 0a 09 09 09 09 20 >list vb)).....
9190: 20 62 29 29 29 29 29 0a 20 20 20 20 20 64 62 0a b))))). db.
91a0: 20 20 20 20 20 28 63 6f 6e 63 20 22 53 45 4c 45 (conc "SELE
91b0: 43 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 CT.
91c0: 20 74 2e 74 65 73 74 6e 61 6d 65 2c 72 2e 69 64 t.testname,r.id
91d0: 2c 72 75 6e 6e 61 6d 65 2c 22 20 6b 65 79 73 73 ,runname," keyss
91e0: 74 72 20 22 2c 74 2e 74 65 73 74 6e 61 6d 65 2c tr ",t.testname,
91f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 . t
9200: 2e 69 74 65 6d 5f 70 61 74 68 2c 74 6d 2e 64 65 .item_path,tm.de
9210: 73 63 72 69 70 74 69 6f 6e 2c 74 2e 73 74 61 74 scription,t.stat
9220: 65 2c 74 2e 73 74 61 74 75 73 2c 0a 20 20 20 20 e,t.status,.
9230: 20 20 20 20 20 20 20 20 20 20 66 69 6e 61 6c 5f final_
9240: 6c 6f 67 66 2c 72 75 6e 5f 64 75 72 61 74 69 6f logf,run_duratio
9250: 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 n, .
9260: 20 20 73 74 72 66 74 69 6d 65 28 27 25 6d 2f 25 strftime('%m/%
9270: 64 2f 25 59 20 25 48 3a 25 4d 3a 25 53 27 2c 64 d/%Y %H:%M:%S',d
9280: 61 74 65 74 69 6d 65 28 74 2e 65 76 65 6e 74 5f atetime(t.event_
9290: 74 69 6d 65 2c 27 75 6e 69 78 65 70 6f 63 68 27 time,'unixepoch'
92a0: 29 2c 27 6c 6f 63 61 6c 74 69 6d 65 27 29 2c 0a ),'localtime'),.
92b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6d tm
92c0: 2e 74 61 67 73 2c 72 2e 6f 77 6e 65 72 2c 74 2e .tags,r.owner,t.
92d0: 63 6f 6d 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20 comment,.
92e0: 20 20 20 20 20 20 20 61 75 74 68 6f 72 2c 0a 20 author,.
92f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6d 2e tm.
9300: 6f 77 6e 65 72 2c 72 65 76 69 65 77 65 64 2c 0a owner,reviewed,.
9310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 di
9320: 73 6b 66 72 65 65 2c 75 6e 61 6d 65 2c 72 75 6e skfree,uname,run
9330: 64 69 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 dir,.
9340: 20 20 20 68 6f 73 74 2c 63 70 75 6c 6f 61 64 0a host,cpuload.
9350: 20 20 20 20 20 20 20 20 20 20 20 20 46 52 4f 4d FROM
9360: 20 74 65 73 74 73 20 41 53 20 74 20 49 4e 4e 45 tests AS t INNE
9370: 52 20 4a 4f 49 4e 20 72 75 6e 73 20 41 53 20 72 R JOIN runs AS r
9380: 20 4f 4e 20 74 2e 72 75 6e 5f 69 64 3d 72 2e 69 ON t.run_id=r.i
9390: 64 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 74 65 73 d INNER JOIN tes
93a0: 74 5f 6d 65 74 61 20 41 53 20 74 6d 20 4f 4e 20 t_meta AS tm ON
93b0: 74 6d 2e 74 65 73 74 6e 61 6d 65 3d 74 2e 74 65 tm.testname=t.te
93c0: 73 74 6e 61 6d 65 0a 20 20 20 20 20 20 20 20 20 stname.
93d0: 20 20 20 57 48 45 52 45 20 72 75 6e 6e 61 6d 65 WHERE runname
93e0: 20 4c 49 4b 45 20 3f 20 41 4e 44 20 22 20 6b 65 LIKE ? AND " ke
93f0: 79 71 72 79 20 22 3b 22 29 0a 20 20 20 20 20 72 yqry ";"). r
9400: 75 6e 73 70 61 74 74 20 28 6d 61 70 20 63 61 64 unspatt (map cad
9410: 72 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 29 r keypatt-alist)
9420: 29 0a 20 20 20 20 28 73 65 74 21 20 72 65 73 75 ). (set! resu
9430: 6c 74 73 20 28 6c 69 73 74 20 28 63 6f 6e 73 20 lts (list (cons
9440: 22 52 75 6e 73 22 20 72 65 73 75 6c 74 73 29 29 "Runs" results))
9450: 29 0a 20 20 20 20 3b 3b 20 6e 6f 77 2c 20 66 6f ). ;; now, fo
9460: 72 20 65 61 63 68 20 74 65 73 74 2c 20 63 6f 6c r each test, col
9470: 6c 65 63 74 20 74 68 65 20 74 65 73 74 5f 64 61 lect the test_da
9480: 74 61 20 69 6e 66 6f 20 61 6e 64 20 61 64 64 20 ta info and add
9490: 61 20 6e 65 77 20 73 68 65 65 74 0a 20 20 20 20 a new sheet.
94a0: 28 66 6f 72 2d 65 61 63 68 0a 20 20 20 20 20 28 (for-each. (
94b0: 6c 61 6d 62 64 61 20 28 74 65 73 74 2d 69 64 29 lambda (test-id)
94c0: 0a 20 20 20 20 20 20 20 28 6c 65 74 20 28 28 74 . (let ((t
94d0: 65 73 74 2d 64 61 74 61 20 28 6c 69 73 74 20 74 est-data (list t
94e0: 65 73 74 64 61 74 61 2d 68 65 61 64 65 72 29 29 estdata-header))
94f0: 0a 09 20 20 20 20 20 28 63 75 72 72 2d 74 65 73 .. (curr-tes
9500: 74 2d 6e 61 6d 65 20 23 66 29 29 0a 09 20 28 73 t-name #f)).. (s
9510: 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d qlite3:for-each-
9520: 72 6f 77 0a 09 20 20 28 6c 61 6d 62 64 61 20 28 row.. (lambda (
9530: 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 run-id testname
9540: 69 74 65 6d 2d 70 61 74 68 20 63 61 74 65 67 6f item-path catego
9550: 72 79 20 76 61 72 69 61 62 6c 65 20 76 61 6c 75 ry variable valu
9560: 65 20 65 78 70 65 63 74 65 64 20 74 6f 6c 20 75 e expected tol u
9570: 6e 69 74 73 20 73 74 61 74 75 73 20 63 6f 6d 6d nits status comm
9580: 65 6e 74 29 0a 09 20 20 20 20 28 73 65 74 21 20 ent).. (set!
9590: 63 75 72 72 2d 74 65 73 74 2d 6e 61 6d 65 20 74 curr-test-name t
95a0: 65 73 74 6e 61 6d 65 29 0a 09 20 20 20 20 28 73 estname).. (s
95b0: 65 74 21 20 74 65 73 74 2d 64 61 74 61 20 28 61 et! test-data (a
95c0: 70 70 65 6e 64 20 74 65 73 74 2d 64 61 74 61 20 ppend test-data
95d0: 28 6c 69 73 74 20 28 6c 69 73 74 20 72 75 6e 2d (list (list run-
95e0: 69 64 20 74 65 73 74 6e 61 6d 65 20 69 74 65 6d id testname item
95f0: 2d 70 61 74 68 20 63 61 74 65 67 6f 72 79 20 76 -path category v
9600: 61 72 69 61 62 6c 65 20 76 61 6c 75 65 20 65 78 ariable value ex
9610: 70 65 63 74 65 64 20 74 6f 6c 20 75 6e 69 74 73 pected tol units
9620: 20 73 74 61 74 75 73 20 63 6f 6d 6d 65 6e 74 29 status comment)
9630: 29 29 29 29 0a 09 20 20 64 62 20 0a 09 20 20 3b )))).. db .. ;
9640: 3b 20 22 53 45 4c 45 43 54 20 72 75 6e 5f 69 64 ; "SELECT run_id
9650: 2c 74 65 73 74 6e 61 6d 65 2c 69 74 65 6d 5f 70 ,testname,item_p
9660: 61 74 68 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 ath,category,var
9670: 69 61 62 6c 65 2c 74 64 2e 76 61 6c 75 65 20 41 iable,td.value A
9680: 53 20 76 61 6c 75 65 2c 65 78 70 65 63 74 65 64 S value,expected
9690: 2c 74 6f 6c 2c 75 6e 69 74 73 2c 74 64 2e 73 74 ,tol,units,td.st
96a0: 61 74 75 73 20 41 53 20 73 74 61 74 75 73 2c 74 atus AS status,t
96b0: 64 2e 63 6f 6d 6d 65 6e 74 20 41 53 20 63 6f 6d d.comment AS com
96c0: 6d 65 6e 74 20 46 52 4f 4d 20 74 65 73 74 5f 64 ment FROM test_d
96d0: 61 74 61 20 41 53 20 74 64 20 49 4e 4e 45 52 20 ata AS td INNER
96e0: 4a 4f 49 4e 20 74 65 73 74 73 20 4f 4e 20 74 65 JOIN tests ON te
96f0: 73 74 73 2e 69 64 3d 74 64 2e 74 65 73 74 5f 69 sts.id=td.test_i
9700: 64 20 57 48 45 52 45 20 74 65 73 74 5f 69 64 3d d WHERE test_id=
9710: 3f 3b 22 0a 09 20 20 22 53 45 4c 45 43 54 20 72 ?;".. "SELECT r
9720: 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d 65 2c 69 un_id,testname,i
9730: 74 65 6d 5f 70 61 74 68 2c 63 61 74 65 67 6f 72 tem_path,categor
9740: 79 2c 76 61 72 69 61 62 6c 65 2c 74 64 2e 76 61 y,variable,td.va
9750: 6c 75 65 20 41 53 20 76 61 6c 75 65 2c 74 64 2e lue AS value,td.
9760: 65 78 70 65 63 74 65 64 2c 74 64 2e 74 6f 6c 2c expected,td.tol,
9770: 74 64 2e 75 6e 69 74 73 2c 74 64 2e 73 74 61 74 td.units,td.stat
9780: 75 73 20 41 53 20 73 74 61 74 75 73 2c 74 64 2e us AS status,td.
9790: 63 6f 6d 6d 65 6e 74 20 41 53 20 63 6f 6d 6d 65 comment AS comme
97a0: 6e 74 20 46 52 4f 4d 20 74 65 73 74 5f 64 61 74 nt FROM test_dat
97b0: 61 20 41 53 20 74 64 20 49 4e 4e 45 52 20 4a 4f a AS td INNER JO
97c0: 49 4e 20 74 65 73 74 73 20 4f 4e 20 74 65 73 74 IN tests ON test
97d0: 73 2e 69 64 3d 74 64 2e 74 65 73 74 5f 69 64 20 s.id=td.test_id
97e0: 57 48 45 52 45 20 74 65 73 74 6e 61 6d 65 3d 3f WHERE testname=?
97f0: 3b 22 0a 09 20 20 74 65 73 74 2d 69 64 29 0a 09 ;".. test-id)..
9800: 20 28 69 66 20 63 75 72 72 2d 74 65 73 74 2d 6e (if curr-test-n
9810: 61 6d 65 0a 09 20 20 20 20 20 28 73 65 74 21 20 ame.. (set!
9820: 72 65 73 75 6c 74 73 20 28 61 70 70 65 6e 64 20 results (append
9830: 72 65 73 75 6c 74 73 20 28 6c 69 73 74 20 28 63 results (list (c
9840: 6f 6e 73 20 63 75 72 72 2d 74 65 73 74 2d 6e 61 ons curr-test-na
9850: 6d 65 20 74 65 73 74 2d 64 61 74 61 29 29 29 29 me test-data))))
9860: 29 0a 09 20 29 29 0a 20 20 20 20 20 28 73 6f 72 ).. )). (sor
9870: 74 20 28 64 65 6c 65 74 65 2d 64 75 70 6c 69 63 t (delete-duplic
9880: 61 74 65 73 20 74 65 73 74 2d 69 64 73 29 20 73 ates test-ids) s
9890: 74 72 69 6e 67 3c 3d 29 29 0a 20 20 20 20 28 73 tring<=)). (s
98a0: 79 73 74 65 6d 20 28 63 6f 6e 63 20 22 6d 6b 64 ystem (conc "mkd
98b0: 69 72 20 2d 70 20 22 20 74 65 6d 70 64 69 72 29 ir -p " tempdir)
98c0: 29 0a 20 20 20 20 3b 3b 20 28 70 70 20 72 65 73 ). ;; (pp res
98d0: 75 6c 74 73 29 0a 20 20 20 20 28 6f 64 73 3a 6c ults). (ods:l
98e0: 69 73 74 2d 3e 6f 64 73 20 0a 20 20 20 20 20 74 ist->ods . t
98f0: 65 6d 70 64 69 72 0a 20 20 20 20 20 28 69 66 20 empdir. (if
9900: 28 73 74 72 69 6e 67 2d 6d 61 74 63 68 20 28 72 (string-match (r
9910: 65 67 65 78 70 20 22 5e 5b 2f 7e 5d 2b 2e 2a 22 egexp "^[/~]+.*"
9920: 29 20 6f 75 74 70 75 74 66 69 6c 65 29 20 3b 3b ) outputfile) ;;
9930: 20 66 75 6c 6c 20 70 61 74 68 3f 0a 09 20 6f 75 full path?.. ou
9940: 74 70 75 74 66 69 6c 65 0a 09 20 28 62 65 67 69 tputfile.. (begi
9950: 6e 0a 09 20 20 20 28 64 65 62 75 67 3a 70 72 69 n.. (debug:pri
9960: 6e 74 20 30 20 22 57 41 52 4e 49 4e 47 3a 20 70 nt 0 "WARNING: p
9970: 61 74 68 20 67 69 76 65 6e 2c 20 22 20 6f 75 74 ath given, " out
9980: 70 75 74 66 69 6c 65 20 22 20 69 73 20 72 65 6c putfile " is rel
9990: 61 74 69 76 65 2c 20 70 72 65 66 69 78 69 6e 67 ative, prefixing
99a0: 20 77 69 74 68 20 63 75 72 72 65 6e 74 20 64 69 with current di
99b0: 72 65 63 74 6f 72 79 22 29 0a 09 20 20 20 28 63 rectory").. (c
99c0: 6f 6e 63 20 28 63 75 72 72 65 6e 74 2d 64 69 72 onc (current-dir
99d0: 65 63 74 6f 72 79 29 20 22 2f 22 20 6f 75 74 70 ectory) "/" outp
99e0: 75 74 66 69 6c 65 29 29 29 0a 20 20 20 20 20 72 utfile))). r
99f0: 65 73 75 6c 74 73 29 29 29 0a 0a 3b 3b 20 28 64 esults)))..;; (d
9a00: 62 3a 65 78 74 72 61 63 74 2d 6f 64 73 2d 66 69 b:extract-ods-fi
9a10: 6c 65 20 64 62 20 22 6f 75 74 70 75 74 66 69 6c le db "outputfil
9a20: 65 2e 6f 64 73 22 20 27 28 28 22 73 79 73 6e 61 e.ods" '(("sysna
9a30: 6d 65 22 20 22 25 22 29 28 22 66 73 6e 61 6d 65 me" "%")("fsname
9a40: 22 20 22 25 22 29 28 22 64 61 74 61 70 61 74 68 " "%")("datapath
9a50: 22 20 22 25 22 29 29 20 22 25 22 29 0a " "%")) "%").