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 20 44 logfile TEXT D
1280: 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 EFAULT '',.
1290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12a0: 20 20 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52 CONSTR
12b0: 41 49 4e 54 20 74 65 73 74 5f 73 74 65 70 73 5f AINT test_steps_
12c0: 63 6f 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 55 constraint UNIQU
12d0: 45 20 28 74 65 73 74 5f 69 64 2c 73 74 65 70 6e E (test_id,stepn
12e0: 61 6d 65 2c 73 74 61 74 65 29 29 3b 22 29 0a 09 ame,state));")..
12f0: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 (sqlite3:execu
1300: 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41 te db "CREATE TA
1310: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 BLE IF NOT EXIST
1320: 53 20 65 78 74 72 61 64 61 74 20 28 69 64 20 49 S extradat (id I
1330: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b NTEGER PRIMARY K
1340: 45 59 2c 20 72 75 6e 5f 69 64 20 49 4e 54 45 47 EY, run_id INTEG
1350: 45 52 2c 20 6b 65 79 20 54 45 58 54 2c 20 76 61 ER, key TEXT, va
1360: 6c 20 54 45 58 54 29 3b 22 29 0a 09 20 20 28 73 l TEXT);").. (s
1370: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 qlite3:execute d
1380: 62 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 b "CREATE TABLE
1390: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 6d 65 IF NOT EXISTS me
13a0: 74 61 64 61 74 20 28 69 64 20 49 4e 54 45 47 45 tadat (id INTEGE
13b0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 R PRIMARY KEY, v
13c0: 61 72 20 54 45 58 54 2c 20 76 61 6c 20 54 45 58 ar TEXT, val TEX
13d0: 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 T,.
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13f0: 20 20 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 CONSTRAINT
1400: 6d 65 74 61 64 61 74 5f 63 6f 6e 73 74 72 61 69 metadat_constrai
1410: 6e 74 20 55 4e 49 51 55 45 20 28 76 61 72 29 29 nt UNIQUE (var))
1420: 3b 22 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a ;").. (sqlite3:
1430: 65 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 execute db "CREA
1440: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 TE TABLE IF NOT
1450: 45 58 49 53 54 53 20 61 63 63 65 73 73 5f 6c 6f EXISTS access_lo
1460: 67 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 g (id INTEGER PR
1470: 49 4d 41 52 59 20 4b 45 59 2c 20 75 73 65 72 20 IMARY KEY, user
1480: 54 45 58 54 2c 20 61 63 63 65 73 73 65 64 20 54 TEXT, accessed T
1490: 49 4d 45 53 54 41 4d 50 2c 20 61 72 67 73 20 54 IMESTAMP, args T
14a0: 45 58 54 29 3b 22 29 0a 09 20 20 28 73 71 6c 69 EXT);").. (sqli
14b0: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 te3:execute db "
14c0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 CREATE TABLE IF
14d0: 4e 4f 54 20 45 58 49 53 54 53 20 74 65 73 74 5f NOT EXISTS test_
14e0: 6d 65 74 61 20 28 69 64 20 49 4e 54 45 47 45 52 meta (id INTEGER
14f0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 PRIMARY KEY,.
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 20 20 20 20 20 20 20 20
1520: 20 20 20 74 65 73 74 6e 61 6d 65 20 20 20 20 54 testname T
1530: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a EXT DEFAULT '',.
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 20 20 20 20 20 20
1560: 20 20 20 20 20 61 75 74 68 6f 72 20 20 20 20 20 author
1570: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 TEXT DEFAULT ''
1580: 2c 0a 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 20 20 20 20
15a0: 20 20 20 20 20 20 20 6f 77 6e 65 72 20 20 20 20 owner
15b0: 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 TEXT DEFAULT
15c0: 27 27 2c 0a 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 20 20
15e0: 20 20 20 20 20 20 20 20 20 64 65 73 63 72 69 70 descrip
15f0: 74 69 6f 6e 20 54 45 58 54 20 44 45 46 41 55 4c tion TEXT DEFAUL
1600: 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 T '',.
1610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1620: 20 20 20 20 20 20 20 20 20 20 20 72 65 76 69 65 revie
1630: 77 65 64 20 20 20 20 54 49 4d 45 53 54 41 4d 50 wed TIMESTAMP
1640: 2c 0a 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 20 20 20 20
1660: 20 20 20 20 20 20 20 69 74 65 72 61 74 65 64 20 iterated
1670: 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 TEXT DEFAULT
1680: 27 27 2c 0a 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 20 20
16a0: 20 20 20 20 20 20 20 20 20 61 76 67 5f 72 75 6e avg_run
16b0: 74 69 6d 65 20 52 45 41 4c 2c 0a 20 20 20 20 20 time REAL,.
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16e0: 61 76 67 5f 64 69 73 6b 20 20 20 20 52 45 41 4c avg_disk REAL
16f0: 2c 0a 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 20 20 20 20
1710: 20 20 20 20 20 20 20 74 61 67 73 20 20 20 20 20 tags
1720: 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 TEXT DEFAULT
1730: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 '',.
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1750: 20 20 20 20 20 20 20 20 20 6a 6f 62 67 72 6f 75 jobgrou
1760: 70 20 20 20 20 54 45 58 54 20 44 45 46 41 55 4c p TEXT DEFAUL
1770: 54 20 27 64 65 66 61 75 6c 74 27 2c 0a 20 20 20 T 'default',.
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e CON
17a0: 53 54 52 41 49 4e 54 20 74 65 73 74 5f 6d 65 74 STRAINT test_met
17b0: 61 5f 63 6f 6e 73 74 72 61 69 6e 74 20 55 4e 49 a_constraint UNI
17c0: 51 55 45 20 28 74 65 73 74 6e 61 6d 65 29 29 3b QUE (testname));
17d0: 22 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65 ").. (sqlite3:e
17e0: 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 54 xecute db "CREAT
17f0: 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 E TABLE IF NOT E
1800: 58 49 53 54 53 20 74 65 73 74 5f 64 61 74 61 20 XISTS test_data
1810: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM
1820: 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 20 20 ARY KEY,.
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1840: 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 69 64 test_id
1850: 20 49 4e 54 45 47 45 52 2c 0a 20 20 20 20 20 20 INTEGER,.
1860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1870: 20 20 20 20 20 20 20 20 20 20 63 61 74 65 67 6f catego
1880: 72 79 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 ry TEXT DEFAULT
1890: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 '',.
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
18b0: 20 20 20 20 76 61 72 69 61 62 6c 65 20 54 45 58 variable TEX
18c0: 54 2c 0a 09 20 20 20 20 20 20 20 20 20 20 20 20 T,..
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 76 61 6c 75 valu
18e0: 65 20 52 45 41 4c 2c 0a 09 20 20 20 20 20 20 20 e REAL,..
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1900: 20 65 78 70 65 63 74 65 64 20 52 45 41 4c 2c 0a expected REAL,.
1910: 09 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 74 6f 6c 20 52 45 41 tol REA
1930: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 L,.
1940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1950: 20 20 20 75 6e 69 74 73 20 54 45 58 54 2c 0a 20 units TEXT,.
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 c
1980: 6f 6d 6d 65 6e 74 20 54 45 58 54 20 44 45 46 41 omment TEXT DEFA
1990: 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 ULT '',.
19a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
19b0: 20 20 20 20 20 20 20 20 73 74 61 74 75 73 20 54 status T
19c0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 6e 2f 61 EXT DEFAULT 'n/a
19d0: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ',.
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
19f0: 20 20 20 74 79 70 65 20 54 45 58 54 20 44 45 46 type TEXT DEF
1a00: 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 AULT '',.
1a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a20: 20 20 20 20 20 20 20 43 4f 4e 53 54 52 41 49 4e CONSTRAIN
1a30: 54 20 74 65 73 74 5f 64 61 74 61 5f 63 6f 6e 73 T test_data_cons
1a40: 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28 74 traint UNIQUE (t
1a50: 65 73 74 5f 69 64 2c 63 61 74 65 67 6f 72 79 2c est_id,category,
1a60: 76 61 72 69 61 62 6c 65 29 29 3b 22 29 0a 09 20 variable));")..
1a70: 20 3b 3b 20 4d 75 73 74 20 64 6f 20 74 68 69 73 ;; Must do this
1a80: 20 2a 61 66 74 65 72 2a 20 72 75 6e 6e 69 6e 67 *after* running
1a90: 20 70 61 74 63 68 20 64 62 20 21 21 20 4e 6f 20 patch db !! No
1aa0: 6d 6f 72 65 2e 20 0a 09 20 20 28 64 62 3a 73 65 more. .. (db:se
1ab0: 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 t-var db "MEGATE
1ac0: 53 54 5f 56 45 52 53 49 4f 4e 22 20 6d 65 67 61 ST_VERSION" mega
1ad0: 74 65 73 74 2d 76 65 72 73 69 6f 6e 29 0a 09 20 test-version)..
1ae0: 20 29 29 0a 20 20 20 20 64 62 29 29 0a 0a 3b 3b )). db))..;;
1af0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1b00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1b10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1b20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1b30: 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 54 4f 44 4f 3a 0a ======.;; TODO:.
1b40: 3b 3b 20 20 20 70 75 74 20 64 65 6c 74 61 73 20 ;; put deltas
1b50: 69 6e 74 6f 20 61 6e 20 61 73 73 6f 63 20 6c 69 into an assoc li
1b60: 73 74 20 77 69 74 68 20 76 65 72 73 69 6f 6e 20 st with version
1b70: 6e 75 6d 62 65 72 73 0a 3b 3b 20 20 20 61 70 70 numbers.;; app
1b80: 6c 79 20 61 6c 6c 20 66 72 6f 6d 20 6c 61 73 74 ly all from last
1b90: 20 74 6f 20 63 75 72 72 65 6e 74 0a 3b 3b 3d 3d to current.;;==
1ba0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1bb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1bc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1bd0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1be0: 3d 3d 3d 3d 0a 28 64 65 66 69 6e 65 20 28 70 61 ====.(define (pa
1bf0: 74 63 68 2d 64 62 20 64 62 29 0a 20 20 28 68 61 tch-db db). (ha
1c00: 6e 64 6c 65 2d 65 78 63 65 70 74 69 6f 6e 73 0a ndle-exceptions.
1c10: 20 20 20 65 78 6e 0a 20 20 20 28 62 65 67 69 6e exn. (begin
1c20: 0a 20 20 20 20 20 28 70 72 69 6e 74 20 22 45 78 . (print "Ex
1c30: 63 65 70 74 69 6f 6e 3a 20 22 20 65 78 6e 29 0a ception: " exn).
1c40: 20 20 20 20 20 28 70 72 69 6e 74 20 22 45 52 52 (print "ERR
1c50: 4f 52 3a 20 50 6f 73 73 69 62 6c 65 20 6f 75 74 OR: Possible out
1c60: 20 6f 66 20 64 61 74 65 20 73 63 68 65 6d 61 2c of date schema,
1c70: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 attempting to a
1c80: 64 64 20 74 61 62 6c 65 20 6d 65 74 61 64 61 74 dd table metadat
1c90: 61 2e 2e 2e 22 29 0a 20 20 20 20 20 28 73 71 6c a..."). (sql
1ca0: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 ite3:execute db
1cb0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 "CREATE TABLE IF
1cc0: 20 4e 4f 54 20 45 58 49 53 54 53 20 6d 65 74 61 NOT EXISTS meta
1cd0: 64 61 74 20 28 69 64 20 49 4e 54 45 47 45 52 2c dat (id INTEGER,
1ce0: 20 76 61 72 20 54 45 58 54 2c 20 76 61 6c 20 54 var TEXT, val T
1cf0: 45 58 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 EXT,.
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1d10: 20 20 20 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 CONSTRAINT
1d20: 20 6d 65 74 61 64 61 74 5f 63 6f 6e 73 74 72 61 metadat_constra
1d30: 69 6e 74 20 55 4e 49 51 55 45 20 28 76 61 72 29 int UNIQUE (var)
1d40: 29 3b 22 29 0a 20 20 20 20 20 28 69 66 20 28 6e );"). (if (n
1d50: 6f 74 20 28 64 62 3a 67 65 74 2d 76 61 72 20 64 ot (db:get-var d
1d60: 62 20 22 4d 45 47 41 54 45 53 54 5f 56 45 52 53 b "MEGATEST_VERS
1d70: 49 4f 4e 22 29 29 0a 09 20 28 64 62 3a 73 65 74 ION")).. (db:set
1d80: 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 53 -var db "MEGATES
1d90: 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e 31 37 29 T_VERSION" 1.17)
1da0: 29 29 0a 20 20 20 28 6c 65 74 20 28 28 6d 76 65 )). (let ((mve
1db0: 72 20 28 64 62 3a 67 65 74 2d 76 61 72 20 64 62 r (db:get-var db
1dc0: 20 22 4d 45 47 41 54 45 53 54 5f 56 45 52 53 49 "MEGATEST_VERSI
1dd0: 4f 4e 22 29 29 0a 09 20 28 74 65 73 74 2d 6d 65 ON")).. (test-me
1de0: 74 61 2d 64 65 66 20 22 43 52 45 41 54 45 20 54 ta-def "CREATE T
1df0: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 ABLE IF NOT EXIS
1e00: 54 53 20 74 65 73 74 5f 6d 65 74 61 20 28 69 64 TS test_meta (id
1e10: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY
1e20: 20 4b 45 59 2c 0a 20 20 20 20 20 20 20 20 20 20 KEY,.
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e40: 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 6e testn
1e50: 61 6d 65 20 20 20 20 54 45 58 54 20 44 45 46 41 ame TEXT DEFA
1e60: 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 ULT '',.
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 75 74 aut
1e90: 68 6f 72 20 20 20 20 20 20 54 45 58 54 20 44 45 hor TEXT DE
1ea0: 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 FAULT '',.
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f o
1ed0: 77 6e 65 72 20 20 20 20 20 20 20 54 45 58 54 20 wner TEXT
1ee0: 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 DEFAULT '',.
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1f10: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 54 45 58 description TEX
1f20: 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 T DEFAULT '',.
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1f50: 20 20 20 72 65 76 69 65 77 65 64 20 20 20 20 54 reviewed T
1f60: 49 4d 45 53 54 41 4d 50 2c 0a 20 20 20 20 20 20 IMESTAMP,.
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 i
1f90: 74 65 72 61 74 65 64 20 20 20 20 54 45 58 54 20 terated TEXT
1fa0: 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 DEFAULT '',.
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1fd0: 20 61 76 67 5f 72 75 6e 74 69 6d 65 20 52 45 41 avg_runtime REA
1fe0: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 L,.
1ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2000: 20 20 20 20 20 20 20 20 61 76 67 5f 64 69 73 6b avg_disk
2010: 20 20 20 20 52 45 41 4c 2c 0a 20 20 20 20 20 20 REAL,.
2020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 t
2040: 61 67 73 20 20 20 20 20 20 20 20 54 45 58 54 20 ags TEXT
2050: 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 DEFAULT '',.
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2070: 20 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e 53 CONS
2080: 54 52 41 49 4e 54 20 74 65 73 74 5f 6d 65 74 61 TRAINT test_meta
2090: 5f 63 6f 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 _constraint UNIQ
20a0: 55 45 20 28 74 65 73 74 6e 61 6d 65 29 29 3b 22 UE (testname));"
20b0: 29 29 0a 20 20 20 20 20 28 70 72 69 6e 74 20 22 )). (print "
20c0: 43 75 72 72 65 6e 74 20 73 63 68 65 6d 61 20 76 Current schema v
20d0: 65 72 73 69 6f 6e 3a 20 22 20 6d 76 65 72 20 22 ersion: " mver "
20e0: 20 63 75 72 72 65 6e 74 20 6d 65 67 61 74 65 73 current megates
20f0: 74 20 76 65 72 73 69 6f 6e 3a 20 22 20 6d 65 67 t version: " meg
2100: 61 74 65 73 74 2d 76 65 72 73 69 6f 6e 29 0a 20 atest-version).
2110: 20 20 20 20 28 63 6f 6e 64 0a 20 20 20 20 20 20 (cond.
2120: 28 28 6e 6f 74 20 6d 76 65 72 29 0a 20 20 20 20 ((not mver).
2130: 20 20 20 28 70 72 69 6e 74 20 22 41 64 64 69 6e (print "Addin
2140: 67 20 6d 65 67 61 74 65 73 74 2d 76 65 72 73 69 g megatest-versi
2150: 6f 6e 20 74 6f 20 6d 65 74 61 64 61 74 61 22 29 on to metadata")
2160: 20 3b 3b 20 4e 65 65 64 20 74 6f 20 72 65 63 72 ;; Need to recr
2170: 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 0a 20 eate the table.
2180: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 (sqlite3:e
2190: 78 65 63 75 74 65 20 64 62 20 22 44 52 4f 50 20 xecute db "DROP
21a0: 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 TABLE IF EXISTS
21b0: 6d 65 74 61 64 61 74 3b 22 29 0a 20 20 20 20 20 metadat;").
21c0: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 (sqlite3:execu
21d0: 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41 te db "CREATE TA
21e0: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 BLE IF NOT EXIST
21f0: 53 20 6d 65 74 61 64 61 74 20 28 69 64 20 49 4e S metadat (id IN
2200: 54 45 47 45 52 2c 20 76 61 72 20 54 45 58 54 2c TEGER, var TEXT,
2210: 20 76 61 6c 20 54 45 58 54 2c 0a 20 20 20 20 20 val TEXT,.
2220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e CON
2240: 53 54 52 41 49 4e 54 20 6d 65 74 61 64 61 74 5f STRAINT metadat_
2250: 63 6f 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 55 constraint UNIQU
2260: 45 20 28 76 61 72 29 29 3b 22 29 0a 20 20 20 20 E (var));").
2270: 20 20 20 28 64 62 3a 73 65 74 2d 76 61 72 20 64 (db:set-var d
2280: 62 20 22 4d 45 47 41 54 45 53 54 5f 56 45 52 53 b "MEGATEST_VERS
2290: 49 4f 4e 22 20 31 2e 31 37 29 0a 20 20 20 20 20 ION" 1.17).
22a0: 20 20 28 70 61 74 63 68 2d 64 62 29 29 0a 20 20 (patch-db)).
22b0: 20 20 20 20 28 28 3c 20 6d 76 65 72 20 31 2e 32 ((< mver 1.2
22c0: 31 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 1). (sqlit
22d0: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 44 e3:execute db "D
22e0: 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 ROP TABLE IF EXI
22f0: 53 54 53 20 6d 65 74 61 64 61 74 3b 22 29 0a 20 STS metadat;").
2300: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 (sqlite3:e
2310: 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 54 xecute db "CREAT
2320: 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 E TABLE IF NOT E
2330: 58 49 53 54 53 20 6d 65 74 61 64 61 74 20 28 69 XISTS metadat (i
2340: 64 20 49 4e 54 45 47 45 52 2c 20 76 61 72 20 54 d INTEGER, var T
2350: 45 58 54 2c 20 76 61 6c 20 54 45 58 54 2c 0a 20 EXT, val TEXT,.
2360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2380: 20 43 4f 4e 53 54 52 41 49 4e 54 20 6d 65 74 61 CONSTRAINT meta
2390: 64 61 74 5f 63 6f 6e 73 74 72 61 69 6e 74 20 55 dat_constraint U
23a0: 4e 49 51 55 45 20 28 76 61 72 29 29 3b 22 29 0a NIQUE (var));").
23b0: 20 20 20 20 20 20 20 28 64 62 3a 73 65 74 2d 76 (db:set-v
23c0: 61 72 20 64 62 20 22 4d 45 47 41 54 45 53 54 5f ar db "MEGATEST_
23d0: 56 45 52 53 49 4f 4e 22 20 31 2e 32 31 29 20 3b VERSION" 1.21) ;
23e0: 3b 20 73 65 74 20 62 65 66 6f 72 65 2c 20 6a 75 ; set before, ju
23f0: 73 74 20 69 6e 20 63 61 73 65 20 74 68 65 20 63 st in case the c
2400: 68 61 6e 67 65 73 20 61 72 65 20 61 6c 72 65 61 hanges are alrea
2410: 64 79 20 61 70 70 6c 69 65 64 0a 20 20 20 20 20 dy applied.
2420: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 (sqlite3:execu
2430: 74 65 20 64 62 20 74 65 73 74 2d 6d 65 74 61 2d te db test-meta-
2440: 64 65 66 29 0a 20 20 20 20 20 20 20 3b 28 66 6f def). ;(fo
2450: 72 2d 65 61 63 68 20 0a 20 20 20 20 20 20 20 3b r-each . ;
2460: 20 28 6c 61 6d 62 64 61 20 28 73 74 6d 74 29 0a (lambda (stmt).
2470: 20 20 20 20 20 20 20 3b 20 20 20 28 73 71 6c 69 ; (sqli
2480: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 73 te3:execute db s
2490: 74 6d 74 29 29 0a 20 20 20 20 20 20 20 3b 20 28 tmt)). ; (
24a0: 6c 69 73 74 20 0a 20 20 20 20 20 20 20 3b 20 20 list . ;
24b0: 22 41 4c 54 45 52 20 54 41 42 4c 45 20 74 65 73 "ALTER TABLE tes
24c0: 74 73 20 41 44 44 20 43 4f 4c 55 4d 4e 20 66 69 ts ADD COLUMN fi
24d0: 72 73 74 5f 65 72 72 20 54 45 58 54 3b 22 0a 20 rst_err TEXT;".
24e0: 20 20 20 20 20 20 3b 20 20 22 41 4c 54 45 52 20 ; "ALTER
24f0: 54 41 42 4c 45 20 74 65 73 74 73 20 41 44 44 20 TABLE tests ADD
2500: 43 4f 4c 55 4d 4e 20 66 69 72 73 74 5f 77 61 72 COLUMN first_war
2510: 6e 20 54 45 58 54 3b 22 0a 20 20 20 20 20 20 20 n TEXT;".
2520: 3b 20 20 29 29 0a 20 20 20 20 20 20 20 28 70 61 ; )). (pa
2530: 74 63 68 2d 64 62 29 29 0a 20 20 20 20 20 20 28 tch-db)). (
2540: 28 3c 20 6d 76 65 72 20 31 2e 32 34 29 0a 20 20 (< mver 1.24).
2550: 20 20 20 20 20 28 64 62 3a 73 65 74 2d 76 61 72 (db:set-var
2560: 20 64 62 20 22 4d 45 47 41 54 45 53 54 5f 56 45 db "MEGATEST_VE
2570: 52 53 49 4f 4e 22 20 31 2e 32 34 29 0a 20 20 20 RSION" 1.24).
2580: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 (sqlite3:exe
2590: 63 75 74 65 20 64 62 20 22 44 52 4f 50 20 54 41 cute db "DROP TA
25a0: 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 74 65 BLE IF EXISTS te
25b0: 73 74 5f 64 61 74 61 3b 22 29 0a 20 20 20 20 20 st_data;").
25c0: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 (sqlite3:execu
25d0: 74 65 20 64 62 20 22 44 52 4f 50 20 54 41 42 4c te db "DROP TABL
25e0: 45 20 49 46 20 45 58 49 53 54 53 20 74 65 73 74 E IF EXISTS test
25f0: 5f 6d 65 74 61 3b 22 29 0a 20 20 20 20 20 20 20 _meta;").
2600: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 (sqlite3:execute
2610: 20 64 62 20 74 65 73 74 2d 6d 65 74 61 2d 64 65 db test-meta-de
2620: 66 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 f). (sqlit
2630: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 43 e3:execute db "C
2640: 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e REATE TABLE IF N
2650: 4f 54 20 45 58 49 53 54 53 20 74 65 73 74 5f 64 OT EXISTS test_d
2660: 61 74 61 20 28 69 64 20 49 4e 54 45 47 45 52 20 ata (id INTEGER
2670: 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 PRIMARY KEY,.
2680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 tes
26a0: 74 5f 69 64 20 49 4e 54 45 47 45 52 2c 0a 20 20 t_id INTEGER,.
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 ca
26d0: 74 65 67 6f 72 79 20 54 45 58 54 20 44 45 46 41 tegory TEXT DEFA
26e0: 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 ULT '',.
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2700: 20 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65 variable
2710: 20 54 45 58 54 2c 0a 09 20 20 20 20 20 20 20 20 TEXT,..
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2730: 76 61 6c 75 65 20 52 45 41 4c 2c 0a 09 20 20 20 value REAL,..
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2750: 20 20 20 20 20 65 78 70 65 63 74 65 64 20 52 45 expected RE
2760: 41 4c 2c 0a 09 20 20 20 20 20 20 20 20 20 20 20 AL,..
2770: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6f 6c tol
2780: 20 52 45 41 4c 2c 0a 20 20 20 20 20 20 20 20 20 REAL,.
2790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
27a0: 20 20 20 20 20 20 20 75 6e 69 74 73 20 54 45 58 units TEX
27b0: 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 T,.
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
27d0: 20 20 20 63 6f 6d 6d 65 6e 74 20 54 45 58 54 20 comment TEXT
27e0: 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 DEFAULT '',.
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2800: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 stat
2810: 75 73 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 us TEXT DEFAULT
2820: 27 6e 2f 61 27 2c 0a 20 20 20 20 20 20 20 20 20 'n/a',.
2830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2840: 20 20 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 CONSTRAINT
2850: 74 65 73 74 5f 64 61 74 61 20 55 4e 49 51 55 45 test_data UNIQUE
2860: 20 28 74 65 73 74 5f 69 64 2c 63 61 74 65 67 6f (test_id,catego
2870: 72 79 2c 76 61 72 69 61 62 6c 65 29 29 3b 22 29 ry,variable));")
2880: 0a 20 20 20 20 20 20 20 28 70 72 69 6e 74 20 22 . (print "
2890: 57 41 52 4e 49 4e 47 3a 20 54 61 62 6c 65 20 74 WARNING: Table t
28a0: 65 73 74 5f 64 61 74 61 20 61 6e 64 20 74 65 73 est_data and tes
28b0: 74 5f 6d 65 74 61 20 77 68 65 72 65 20 72 65 63 t_meta where rec
28c0: 72 65 61 74 65 64 2e 20 50 6c 65 61 73 65 20 64 reated. Please d
28d0: 6f 20 6d 65 67 61 74 65 73 74 20 2d 75 70 64 61 o megatest -upda
28e0: 74 65 2d 6d 65 74 61 22 29 0a 20 20 20 20 20 20 te-meta").
28f0: 20 28 70 61 74 63 68 2d 64 62 29 29 0a 20 20 20 (patch-db)).
2900: 20 20 20 28 28 3c 20 6d 76 65 72 20 31 2e 32 37 ((< mver 1.27
2910: 29 0a 20 20 20 20 20 20 20 28 64 62 3a 73 65 74 ). (db:set
2920: 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 53 -var db "MEGATES
2930: 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e 32 37 29 T_VERSION" 1.27)
2940: 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 . (sqlite3
2950: 3a 65 78 65 63 75 74 65 20 64 62 20 22 41 4c 54 :execute db "ALT
2960: 45 52 20 54 41 42 4c 45 20 74 65 73 74 5f 64 61 ER TABLE test_da
2970: 74 61 20 41 44 44 20 43 4f 4c 55 4d 4e 20 74 79 ta ADD COLUMN ty
2980: 70 65 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 pe TEXT DEFAULT
2990: 27 27 3b 22 29 0a 20 20 20 20 20 20 20 28 70 61 '';"). (pa
29a0: 74 63 68 2d 64 62 29 29 0a 20 20 20 20 20 20 28 tch-db)). (
29b0: 28 3c 20 6d 76 65 72 20 31 2e 32 39 29 0a 20 20 (< mver 1.29).
29c0: 20 20 20 20 20 28 64 62 3a 73 65 74 2d 76 61 72 (db:set-var
29d0: 20 64 62 20 22 4d 45 47 41 54 45 53 54 5f 56 45 db "MEGATEST_VE
29e0: 52 53 49 4f 4e 22 20 31 2e 32 39 29 0a 20 20 20 RSION" 1.29).
29f0: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 (sqlite3:exe
2a00: 63 75 74 65 20 64 62 20 22 41 4c 54 45 52 20 54 cute db "ALTER T
2a10: 41 42 4c 45 20 74 65 73 74 5f 73 74 65 70 73 20 ABLE test_steps
2a20: 41 44 44 20 43 4f 4c 55 4d 4e 20 6c 6f 67 66 69 ADD COLUMN logfi
2a30: 6c 65 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 le TEXT DEFAULT
2a40: 27 27 3b 22 29 0a 20 20 20 20 20 20 20 28 73 71 '';"). (sq
2a50: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 lite3:execute db
2a60: 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 74 65 "ALTER TABLE te
2a70: 73 74 73 20 41 44 44 20 43 4f 4c 55 4d 4e 20 73 sts ADD COLUMN s
2a80: 68 6f 72 74 64 69 72 20 54 45 58 54 20 44 45 46 hortdir TEXT DEF
2a90: 41 55 4c 54 20 27 27 3b 22 29 29 0a 20 20 20 20 AULT '';")).
2aa0: 20 20 28 28 3c 20 6d 76 65 72 20 31 2e 33 36 29 ((< mver 1.36)
2ab0: 0a 20 20 20 20 20 20 20 28 64 62 3a 73 65 74 2d . (db:set-
2ac0: 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 53 54 var db "MEGATEST
2ad0: 5f 56 45 52 53 49 4f 4e 22 20 31 2e 33 36 29 0a _VERSION" 1.36).
2ae0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a (sqlite3:
2af0: 65 78 65 63 75 74 65 20 64 62 20 22 41 4c 54 45 execute db "ALTE
2b00: 52 20 54 41 42 4c 45 52 20 74 65 73 74 5f 6d 65 R TABLER test_me
2b10: 74 61 20 41 44 44 20 43 4f 4c 55 4d 4e 20 6a 6f ta ADD COLUMN jo
2b20: 62 67 72 6f 75 70 20 54 45 58 54 20 44 45 46 41 bgroup TEXT DEFA
2b30: 55 4c 54 20 27 64 65 66 61 75 6c 74 27 3b 22 29 ULT 'default';")
2b40: 29 0a 20 20 20 20 20 20 28 28 3c 20 6d 76 65 72 ). ((< mver
2b50: 20 6d 65 67 61 74 65 73 74 2d 76 65 72 73 69 6f megatest-versio
2b60: 6e 29 0a 20 20 20 20 20 20 20 28 64 62 3a 73 65 n). (db:se
2b70: 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 t-var db "MEGATE
2b80: 53 54 5f 56 45 52 53 49 4f 4e 22 20 6d 65 67 61 ST_VERSION" mega
2b90: 74 65 73 74 2d 76 65 72 73 69 6f 6e 29 29 29 29 test-version))))
2ba0: 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ))..;;==========
2bb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2bc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2bd0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2be0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 ============.;;
2bf0: 6d 65 74 61 20 67 65 74 20 61 6e 64 20 73 65 74 meta get and set
2c00: 20 76 61 72 73 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d vars.;;========
2c10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2c20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2c30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2c40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a ==============..
2c50: 3b 3b 20 72 65 74 75 72 6e 73 20 6e 75 6d 62 65 ;; returns numbe
2c60: 72 20 69 66 20 73 74 72 69 6e 67 2d 3e 6e 75 6d r if string->num
2c70: 62 65 72 20 69 73 20 73 75 63 63 65 73 73 66 75 ber is successfu
2c80: 6c 2c 20 73 74 72 69 6e 67 20 6f 74 68 65 72 77 l, string otherw
2c90: 69 73 65 0a 28 64 65 66 69 6e 65 20 28 64 62 3a ise.(define (db:
2ca0: 67 65 74 2d 76 61 72 20 64 62 20 76 61 72 29 0a get-var db var).
2cb0: 20 20 28 6c 65 74 20 28 28 72 65 73 20 23 66 29 (let ((res #f)
2cc0: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 ). (sqlite3:f
2cd0: 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 or-each-row.
2ce0: 20 28 6c 61 6d 62 64 61 20 28 76 61 6c 29 0a 20 (lambda (val).
2cf0: 20 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20 (set! res
2d00: 76 61 6c 29 29 0a 20 20 20 20 20 64 62 20 22 53 val)). db "S
2d10: 45 4c 45 43 54 20 76 61 6c 20 46 52 4f 4d 20 6d ELECT val FROM m
2d20: 65 74 61 64 61 74 20 57 48 45 52 45 20 76 61 72 etadat WHERE var
2d30: 3d 3f 3b 22 20 76 61 72 29 0a 20 20 20 20 28 69 =?;" var). (i
2d40: 66 20 28 73 74 72 69 6e 67 3f 20 72 65 73 29 0a f (string? res).
2d50: 09 28 6c 65 74 20 28 28 76 61 6c 6e 75 6d 20 28 .(let ((valnum (
2d60: 73 74 72 69 6e 67 2d 3e 6e 75 6d 62 65 72 20 72 string->number r
2d70: 65 73 29 29 29 0a 09 20 20 28 69 66 20 76 61 6c es))).. (if val
2d80: 6e 75 6d 20 76 61 6c 6e 75 6d 20 72 65 73 29 29 num valnum res))
2d90: 0a 09 72 65 73 29 29 29 0a 0a 28 64 65 66 69 6e ..res)))..(defin
2da0: 65 20 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62 e (db:set-var db
2db0: 20 76 61 72 20 76 61 6c 29 0a 20 20 28 73 71 6c var val). (sql
2dc0: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 ite3:execute db
2dd0: 22 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41 "INSERT OR REPLA
2de0: 43 45 20 49 4e 54 4f 20 6d 65 74 61 64 61 74 20 CE INTO metadat
2df0: 28 76 61 72 2c 76 61 6c 29 20 56 41 4c 55 45 53 (var,val) VALUES
2e00: 20 28 3f 2c 3f 29 3b 22 20 76 61 72 20 76 61 6c (?,?);" var val
2e10: 29 29 0a 0a 3b 3b 20 75 73 65 20 61 20 67 6c 6f ))..;; use a glo
2e20: 62 61 6c 20 66 6f 72 20 73 6f 6d 65 20 70 72 69 bal for some pri
2e30: 6d 69 74 69 76 65 20 63 61 63 68 69 6e 67 2c 20 mitive caching,
2e40: 69 74 20 69 73 20 6a 75 73 74 20 73 69 6c 6c 79 it is just silly
2e50: 20 74 6f 20 72 65 2d 72 65 61 64 20 74 68 65 20 to re-read the
2e60: 64 62 20 0a 3b 3b 20 6f 76 65 72 20 61 6e 64 20 db .;; over and
2e70: 6f 76 65 72 20 61 67 61 69 6e 20 66 6f 72 20 74 over again for t
2e80: 68 65 20 6b 65 79 73 20 73 69 6e 63 65 20 74 68 he keys since th
2e90: 65 79 20 6e 65 76 65 72 20 63 68 61 6e 67 65 0a ey never change.
2ea0: 0a 28 64 65 66 69 6e 65 20 2a 64 62 2d 6b 65 79 .(define *db-key
2eb0: 73 2a 20 23 66 29 0a 0a 28 64 65 66 69 6e 65 20 s* #f)..(define
2ec0: 28 64 62 2d 67 65 74 2d 6b 65 79 73 20 64 62 29 (db-get-keys db)
2ed0: 0a 20 20 28 69 66 20 2a 64 62 2d 6b 65 79 73 2a . (if *db-keys*
2ee0: 20 2a 64 62 2d 6b 65 79 73 2a 20 0a 20 20 20 20 *db-keys* .
2ef0: 20 20 28 6c 65 74 20 28 28 72 65 73 20 27 28 29 (let ((res '()
2f00: 29 29 0a 09 28 73 71 6c 69 74 65 33 3a 66 6f 72 ))..(sqlite3:for
2f10: 2d 65 61 63 68 2d 72 6f 77 20 0a 09 20 28 6c 61 -each-row .. (la
2f20: 6d 62 64 61 20 28 6b 65 79 20 6b 65 79 74 79 70 mbda (key keytyp
2f30: 65 29 0a 09 20 20 20 28 73 65 74 21 20 72 65 73 e).. (set! res
2f40: 20 28 63 6f 6e 73 20 28 76 65 63 74 6f 72 20 6b (cons (vector k
2f50: 65 79 20 6b 65 79 74 79 70 65 29 20 72 65 73 29 ey keytype) res)
2f60: 29 29 0a 09 20 64 62 0a 09 20 22 53 45 4c 45 43 )).. db.. "SELEC
2f70: 54 20 66 69 65 6c 64 6e 61 6d 65 2c 66 69 65 6c T fieldname,fiel
2f80: 64 74 79 70 65 20 46 52 4f 4d 20 6b 65 79 73 20 dtype FROM keys
2f90: 4f 52 44 45 52 20 42 59 20 69 64 20 44 45 53 43 ORDER BY id DESC
2fa0: 3b 22 29 0a 09 28 73 65 74 21 20 2a 64 62 2d 6b ;")..(set! *db-k
2fb0: 65 79 73 2a 20 72 65 73 29 0a 09 72 65 73 29 29 eys* res)..res))
2fc0: 29 0a 0a 28 64 65 66 69 6e 65 20 64 62 3a 67 65 )..(define db:ge
2fd0: 74 2d 6b 65 79 73 20 64 62 2d 67 65 74 2d 6b 65 t-keys db-get-ke
2fe0: 79 73 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 ys)..(define (db
2ff0: 3a 67 65 74 2d 76 61 6c 75 65 2d 62 79 2d 68 65 :get-value-by-he
3000: 61 64 65 72 20 72 6f 77 20 68 65 61 64 65 72 20 ader row header
3010: 66 69 65 6c 64 29 0a 20 20 3b 3b 20 28 64 65 62 field). ;; (deb
3020: 75 67 3a 70 72 69 6e 74 20 32 20 22 64 62 3a 67 ug:print 2 "db:g
3030: 65 74 2d 76 61 6c 75 65 2d 62 79 2d 68 65 61 64 et-value-by-head
3040: 65 72 20 72 6f 77 3a 20 22 20 72 6f 77 20 22 20 er row: " row "
3050: 68 65 61 64 65 72 3a 20 22 20 68 65 61 64 65 72 header: " header
3060: 20 22 20 66 69 65 6c 64 3a 20 22 20 66 69 65 6c " field: " fiel
3070: 64 29 0a 20 20 28 69 66 20 28 6e 75 6c 6c 3f 20 d). (if (null?
3080: 68 65 61 64 65 72 29 20 23 66 0a 20 20 20 20 20 header) #f.
3090: 20 28 6c 65 74 20 6c 6f 6f 70 20 28 28 68 65 64 (let loop ((hed
30a0: 20 28 63 61 72 20 68 65 61 64 65 72 29 29 0a 09 (car header))..
30b0: 09 20 28 74 61 6c 20 28 63 64 72 20 68 65 61 64 . (tal (cdr head
30c0: 65 72 29 29 0a 09 09 20 28 6e 20 20 20 30 29 29 er))... (n 0))
30d0: 0a 09 28 69 66 20 28 65 71 75 61 6c 3f 20 68 65 ..(if (equal? he
30e0: 64 20 66 69 65 6c 64 29 0a 09 20 20 20 20 28 76 d field).. (v
30f0: 65 63 74 6f 72 2d 72 65 66 20 72 6f 77 20 6e 29 ector-ref row n)
3100: 0a 09 20 20 20 20 28 69 66 20 28 6e 75 6c 6c 3f .. (if (null?
3110: 20 74 61 6c 29 20 23 66 20 28 6c 6f 6f 70 20 28 tal) #f (loop (
3120: 63 61 72 20 74 61 6c 29 28 63 64 72 20 74 61 6c car tal)(cdr tal
3130: 29 28 2b 20 6e 20 31 29 29 29 29 29 29 29 0a 09 )(+ n 1)))))))..
3140: 20 20 20 20 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d .;;=========
3150: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3160: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3170: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3180: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b =============.;;
3190: 20 20 52 20 55 20 4e 20 53 0a 3b 3b 3d 3d 3d 3d R U N S.;;====
31a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
31b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
31c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
31d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
31e0: 3d 3d 0a 0a 28 64 65 66 69 6e 65 20 28 72 75 6e ==..(define (run
31f0: 73 3a 67 65 74 2d 73 74 64 2d 72 75 6e 2d 66 69 s:get-std-run-fi
3200: 65 6c 64 73 20 6b 65 79 73 20 72 65 6d 66 69 65 elds keys remfie
3210: 6c 64 73 29 0a 20 20 28 6c 65 74 2a 20 28 28 68 lds). (let* ((h
3220: 65 61 64 65 72 20 20 20 20 28 61 70 70 65 6e 64 eader (append
3230: 20 28 6d 61 70 20 6b 65 79 3a 67 65 74 2d 66 69 (map key:get-fi
3240: 65 6c 64 6e 61 6d 65 20 6b 65 79 73 29 0a 09 09 eldname keys)...
3250: 09 20 20 20 20 72 65 6d 66 69 65 6c 64 73 29 29 . remfields))
3260: 0a 09 20 28 6b 65 79 73 74 72 20 20 20 20 28 63 .. (keystr (c
3270: 6f 6e 63 20 28 6b 65 79 73 2d 3e 6b 65 79 73 74 onc (keys->keyst
3280: 72 20 6b 65 79 73 29 20 22 2c 22 0a 09 09 09 20 r keys) ","....
3290: 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 (string-intersp
32a0: 65 72 73 65 20 72 65 6d 66 69 65 6c 64 73 20 22 erse remfields "
32b0: 2c 22 29 29 29 29 0a 20 20 20 20 28 6c 69 73 74 ,")))). (list
32c0: 20 6b 65 79 73 74 72 20 68 65 61 64 65 72 29 29 keystr header))
32d0: 29 0a 0a 3b 3b 20 57 41 53 20 64 62 2d 67 65 74 )..;; WAS db-get
32e0: 2d 72 75 6e 73 20 46 49 58 4d 45 20 49 4e 20 52 -runs FIXME IN R
32f0: 45 4d 41 49 4e 49 4e 47 20 43 4f 44 45 0a 3b 3b EMAINING CODE.;;
3300: 0a 3b 3b 20 4d 45 52 47 45 20 54 48 49 53 20 57 .;; MERGE THIS W
3310: 49 54 48 20 64 62 3a 67 65 74 2d 72 75 6e 73 2c ITH db:get-runs,
3320: 20 61 63 63 69 64 65 6e 74 6c 79 20 77 72 6f 74 accidently wrot
3330: 65 20 69 74 20 74 77 69 63 65 0a 3b 3b 0a 3b 3b e it twice.;;.;;
3340: 20 72 65 70 6c 61 63 65 20 68 65 61 64 65 72 20 replace header
3350: 61 6e 64 20 6b 65 79 73 74 72 20 77 69 74 68 20 and keystr with
3360: 61 20 63 61 6c 6c 20 74 6f 20 72 75 6e 73 3a 67 a call to runs:g
3370: 65 74 2d 73 74 64 2d 72 75 6e 2d 66 69 65 6c 64 et-std-run-field
3380: 73 0a 3b 3b 0a 3b 3b 20 6b 65 79 70 61 74 74 73 s.;;.;; keypatts
3390: 3a 20 28 20 28 4b 45 59 31 20 22 61 62 63 25 64 : ( (KEY1 "abc%d
33a0: 65 66 22 29 28 4b 45 59 32 20 22 25 22 29 20 29 ef")(KEY2 "%") )
33b0: 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 28 64 62 3a .;;.(define (db:
33c0: 67 65 74 2d 72 75 6e 73 20 64 62 20 72 75 6e 70 get-runs db runp
33d0: 61 74 74 20 63 6f 75 6e 74 20 6f 66 66 73 65 74 att count offset
33e0: 20 6b 65 79 70 61 74 74 73 29 0a 20 20 28 6c 65 keypatts). (le
33f0: 74 2a 20 28 28 72 65 73 20 20 20 20 20 20 27 28 t* ((res '(
3400: 29 29 0a 09 20 28 6b 65 79 73 20 20 20 20 20 20 )).. (keys
3410: 28 64 62 2d 67 65 74 2d 6b 65 79 73 20 64 62 29 (db-get-keys db)
3420: 29 0a 09 20 28 72 65 6d 66 69 65 6c 64 73 20 28 ).. (remfields (
3430: 6c 69 73 74 20 22 69 64 22 20 22 72 75 6e 6e 61 list "id" "runna
3440: 6d 65 22 20 22 73 74 61 74 65 22 20 22 73 74 61 me" "state" "sta
3450: 74 75 73 22 20 22 6f 77 6e 65 72 22 20 22 65 76 tus" "owner" "ev
3460: 65 6e 74 5f 74 69 6d 65 22 29 29 0a 09 20 28 68 ent_time")).. (h
3470: 65 61 64 65 72 20 20 20 20 28 61 70 70 65 6e 64 eader (append
3480: 20 28 6d 61 70 20 6b 65 79 3a 67 65 74 2d 66 69 (map key:get-fi
3490: 65 6c 64 6e 61 6d 65 20 6b 65 79 73 29 0a 09 09 eldname keys)...
34a0: 09 20 20 20 20 72 65 6d 66 69 65 6c 64 73 29 29 . remfields))
34b0: 0a 09 20 28 6b 65 79 73 74 72 20 20 20 20 28 63 .. (keystr (c
34c0: 6f 6e 63 20 28 6b 65 79 73 2d 3e 6b 65 79 73 74 onc (keys->keyst
34d0: 72 20 6b 65 79 73 29 20 22 2c 22 0a 09 09 09 20 r keys) ","....
34e0: 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 (string-intersp
34f0: 65 72 73 65 20 72 65 6d 66 69 65 6c 64 73 20 22 erse remfields "
3500: 2c 22 29 29 29 0a 09 20 28 71 72 79 73 74 72 20 ,"))).. (qrystr
3510: 20 20 20 28 63 6f 6e 63 20 22 53 45 4c 45 43 54 (conc "SELECT
3520: 20 22 20 6b 65 79 73 74 72 20 22 20 46 52 4f 4d " keystr " FROM
3530: 20 72 75 6e 73 20 57 48 45 52 45 20 72 75 6e 6e runs WHERE runn
3540: 61 6d 65 20 4c 49 4b 45 20 3f 20 22 0a 09 09 09 ame LIKE ? "....
3550: 20 20 3b 3b 20 47 65 6e 65 72 61 74 65 3a 20 22 ;; Generate: "
3560: 20 41 4e 44 20 78 20 4c 49 4b 45 20 27 6b 65 79 AND x LIKE 'key
3570: 70 61 74 74 27 20 2e 2e 2e 22 0a 09 09 09 20 20 patt' ..."....
3580: 28 69 66 20 28 6e 75 6c 6c 3f 20 6b 65 79 70 61 (if (null? keypa
3590: 74 74 73 29 20 22 22 0a 09 09 09 20 20 20 20 20 tts) ""....
35a0: 20 28 63 6f 6e 63 20 22 20 41 4e 44 20 22 0a 09 (conc " AND "..
35b0: 09 09 09 20 20 20 20 28 73 74 72 69 6e 67 2d 6a ... (string-j
35c0: 6f 69 6e 20 0a 09 09 09 09 20 20 20 20 20 28 6d oin ..... (m
35d0: 61 70 20 28 6c 61 6d 62 64 61 20 28 6b 65 79 70 ap (lambda (keyp
35e0: 61 74 74 29 0a 09 09 09 09 09 20 20 20 20 28 6c att)...... (l
35f0: 65 74 20 28 28 6b 65 79 20 20 28 63 61 72 20 6b et ((key (car k
3600: 65 79 70 61 74 74 29 29 0a 09 09 09 09 09 09 20 eypatt)).......
3610: 20 28 70 61 74 74 20 28 63 61 64 72 20 6b 65 79 (patt (cadr key
3620: 70 61 74 74 29 29 29 0a 09 09 09 09 09 20 20 20 patt)))......
3630: 20 20 20 28 63 6f 6e 63 20 6b 65 79 20 22 20 4c (conc key " L
3640: 49 4b 45 20 27 22 20 70 61 74 74 20 22 27 22 29 IKE '" patt "'")
3650: 29 29 0a 09 09 09 09 09 20 20 6b 65 79 70 61 74 ))...... keypat
3660: 74 73 29 0a 09 09 09 09 20 20 20 20 20 22 20 41 ts)..... " A
3670: 4e 44 20 22 29 29 29 0a 09 09 09 20 20 22 20 4f ND "))).... " O
3680: 52 44 45 52 20 42 59 20 65 76 65 6e 74 5f 74 69 RDER BY event_ti
3690: 6d 65 20 44 45 53 43 20 22 0a 09 09 09 20 20 28 me DESC ".... (
36a0: 69 66 20 28 6e 75 6d 62 65 72 3f 20 63 6f 75 6e if (number? coun
36b0: 74 29 0a 09 09 09 20 20 20 20 20 20 28 63 6f 6e t).... (con
36c0: 63 20 22 20 4c 49 4d 49 54 20 22 20 63 6f 75 6e c " LIMIT " coun
36d0: 74 29 0a 09 09 09 20 20 20 20 20 20 22 22 29 0a t).... "").
36e0: 09 09 09 20 20 28 69 66 20 28 6e 75 6d 62 65 72 ... (if (number
36f0: 3f 20 6f 66 66 73 65 74 29 0a 09 09 09 20 20 20 ? offset)....
3700: 20 20 20 28 63 6f 6e 63 20 22 20 4f 46 46 53 45 (conc " OFFSE
3710: 54 20 22 20 6f 66 66 73 65 74 29 0a 09 09 09 20 T " offset)....
3720: 20 20 20 20 20 22 22 29 29 29 29 0a 20 20 20 20 "")))).
3730: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22 (debug:print 4 "
3740: 64 62 3a 67 65 74 2d 72 75 6e 73 20 71 72 79 73 db:get-runs qrys
3750: 74 72 3a 20 22 20 71 72 79 73 74 72 20 22 5c 6e tr: " qrystr "\n
3760: 6b 65 79 70 61 74 74 73 3a 20 22 20 6b 65 79 70 keypatts: " keyp
3770: 61 74 74 73 20 22 5c 6e 20 20 6f 66 66 73 65 74 atts "\n offset
3780: 3a 20 22 20 6f 66 66 73 65 74 20 22 20 6c 69 6d : " offset " lim
3790: 69 74 3a 20 22 20 63 6f 75 6e 74 29 0a 20 20 20 it: " count).
37a0: 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 (sqlite3:for-ea
37b0: 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d ch-row. (lam
37c0: 62 64 61 20 28 61 20 2e 20 78 29 0a 20 20 20 20 bda (a . x).
37d0: 20 20 20 28 73 65 74 21 20 72 65 73 20 28 63 6f (set! res (co
37e0: 6e 73 20 28 61 70 70 6c 79 20 76 65 63 74 6f 72 ns (apply vector
37f0: 20 61 20 78 29 20 72 65 73 29 29 29 0a 20 20 20 a x) res))).
3800: 20 20 64 62 0a 20 20 20 20 20 71 72 79 73 74 72 db. qrystr
3810: 0a 20 20 20 20 20 72 75 6e 70 61 74 74 29 0a 20 . runpatt).
3820: 20 20 20 28 76 65 63 74 6f 72 20 68 65 61 64 65 (vector heade
3830: 72 20 72 65 73 29 29 29 0a 0a 3b 3b 20 6a 75 73 r res)))..;; jus
3840: 74 20 67 65 74 20 63 6f 75 6e 74 20 6f 66 20 72 t get count of r
3850: 75 6e 73 0a 28 64 65 66 69 6e 65 20 28 64 62 3a uns.(define (db:
3860: 67 65 74 2d 6e 75 6d 2d 72 75 6e 73 20 64 62 20 get-num-runs db
3870: 72 75 6e 70 61 74 74 29 0a 20 20 28 6c 65 74 20 runpatt). (let
3880: 28 28 6e 75 6d 72 75 6e 73 20 30 29 29 0a 20 20 ((numruns 0)).
3890: 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 (sqlite3:for-e
38a0: 61 63 68 2d 72 6f 77 20 0a 20 20 20 20 20 28 6c ach-row . (l
38b0: 61 6d 62 64 61 20 28 63 6f 75 6e 74 29 0a 20 20 ambda (count).
38c0: 20 20 20 20 20 28 73 65 74 21 20 6e 75 6d 72 75 (set! numru
38d0: 6e 73 20 63 6f 75 6e 74 29 29 0a 20 20 20 20 20 ns count)).
38e0: 64 62 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20 db. "SELECT
38f0: 43 4f 55 4e 54 28 69 64 29 20 46 52 4f 4d 20 72 COUNT(id) FROM r
3900: 75 6e 73 20 57 48 45 52 45 20 72 75 6e 6e 61 6d uns WHERE runnam
3910: 65 20 4c 49 4b 45 20 3f 3b 22 20 72 75 6e 70 61 e LIKE ?;" runpa
3920: 74 74 29 0a 20 20 20 20 6e 75 6d 72 75 6e 73 29 tt). numruns)
3930: 29 0a 0a 0a 3b 3b 20 75 73 65 20 28 67 65 74 2d )...;; use (get-
3940: 76 61 6c 75 65 2d 62 79 2d 68 65 61 64 65 72 20 value-by-header
3950: 28 64 62 3a 67 65 74 2d 68 65 61 64 65 72 20 72 (db:get-header r
3960: 75 6e 69 6e 66 6f 29 28 64 62 3a 67 65 74 2d 72 uninfo)(db:get-r
3970: 6f 77 20 72 75 6e 69 6e 66 6f 29 29 0a 28 64 65 ow runinfo)).(de
3980: 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 72 75 6e fine (db:get-run
3990: 2d 69 6e 66 6f 20 64 62 20 72 75 6e 2d 69 64 29 -info db run-id)
39a0: 0a 20 20 28 6c 65 74 2a 20 28 28 72 65 73 20 20 . (let* ((res
39b0: 20 20 20 20 23 66 29 0a 09 20 28 6b 65 79 73 20 #f).. (keys
39c0: 20 20 20 20 20 28 64 62 2d 67 65 74 2d 6b 65 79 (db-get-key
39d0: 73 20 64 62 29 29 0a 09 20 28 72 65 6d 66 69 65 s db)).. (remfie
39e0: 6c 64 73 20 28 6c 69 73 74 20 22 69 64 22 20 22 lds (list "id" "
39f0: 72 75 6e 6e 61 6d 65 22 20 22 73 74 61 74 65 22 runname" "state"
3a00: 20 22 73 74 61 74 75 73 22 20 22 6f 77 6e 65 72 "status" "owner
3a10: 22 20 22 65 76 65 6e 74 5f 74 69 6d 65 22 29 29 " "event_time"))
3a20: 0a 09 20 28 68 65 61 64 65 72 20 20 20 20 28 61 .. (header (a
3a30: 70 70 65 6e 64 20 28 6d 61 70 20 6b 65 79 3a 67 ppend (map key:g
3a40: 65 74 2d 66 69 65 6c 64 6e 61 6d 65 20 6b 65 79 et-fieldname key
3a50: 73 29 0a 09 09 09 20 20 20 20 72 65 6d 66 69 65 s).... remfie
3a60: 6c 64 73 29 29 0a 09 20 28 6b 65 79 73 74 72 20 lds)).. (keystr
3a70: 20 20 20 28 63 6f 6e 63 20 28 6b 65 79 73 2d 3e (conc (keys->
3a80: 6b 65 79 73 74 72 20 6b 65 79 73 29 20 22 2c 22 keystr keys) ","
3a90: 0a 09 09 09 20 20 28 73 74 72 69 6e 67 2d 69 6e .... (string-in
3aa0: 74 65 72 73 70 65 72 73 65 20 72 65 6d 66 69 65 tersperse remfie
3ab0: 6c 64 73 20 22 2c 22 29 29 29 29 0a 20 20 20 20 lds ",")))).
3ac0: 3b 3b 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 ;; (debug:print
3ad0: 30 20 22 64 62 3a 67 65 74 2d 72 75 6e 2d 69 6e 0 "db:get-run-in
3ae0: 66 6f 20 72 75 6e 2d 69 64 3a 20 22 20 72 75 6e fo run-id: " run
3af0: 2d 69 64 20 22 20 68 65 61 64 65 72 3a 20 22 20 -id " header: "
3b00: 68 65 61 64 65 72 20 22 20 6b 65 79 73 74 72 3a header " keystr:
3b10: 20 22 20 6b 65 79 73 74 72 29 0a 20 20 20 20 28 " keystr). (
3b20: 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 sqlite3:for-each
3b30: 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 64 -row. (lambd
3b40: 61 20 28 61 20 2e 20 78 29 0a 20 20 20 20 20 20 a (a . x).
3b50: 20 28 73 65 74 21 20 72 65 73 20 28 61 70 70 6c (set! res (appl
3b60: 79 20 76 65 63 74 6f 72 20 61 20 78 29 29 29 0a y vector a x))).
3b70: 20 20 20 20 20 64 62 0a 20 20 20 20 20 28 63 6f db. (co
3b80: 6e 63 20 22 53 45 4c 45 43 54 20 22 20 6b 65 79 nc "SELECT " key
3b90: 73 74 72 20 22 20 46 52 4f 4d 20 72 75 6e 73 20 str " FROM runs
3ba0: 57 48 45 52 45 20 69 64 3d 3f 3b 22 29 0a 20 20 WHERE id=?;").
3bb0: 20 20 20 72 75 6e 2d 69 64 29 0a 20 20 20 20 28 run-id). (
3bc0: 76 65 63 74 6f 72 20 68 65 61 64 65 72 20 72 65 vector header re
3bd0: 73 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 s)))..(define (d
3be0: 62 3a 73 65 74 2d 63 6f 6d 6d 65 6e 74 2d 66 6f b:set-comment-fo
3bf0: 72 2d 72 75 6e 20 64 62 20 72 75 6e 2d 69 64 20 r-run db run-id
3c00: 63 6f 6d 6d 65 6e 74 29 0a 20 20 28 73 71 6c 69 comment). (sqli
3c10: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 te3:execute db "
3c20: 55 50 44 41 54 45 20 72 75 6e 73 20 53 45 54 20 UPDATE runs SET
3c30: 63 6f 6d 6d 65 6e 74 3d 3f 20 57 48 45 52 45 20 comment=? WHERE
3c40: 69 64 3d 3f 3b 22 20 63 6f 6d 6d 65 6e 74 20 72 id=?;" comment r
3c50: 75 6e 2d 69 64 29 29 0a 0a 3b 3b 20 64 6f 65 73 un-id))..;; does
3c60: 20 6e 6f 74 20 28 6f 62 76 69 6f 75 73 6c 79 21 not (obviously!
3c70: 29 20 72 65 6d 6f 76 65 64 20 64 65 70 65 6e 64 ) removed depend
3c80: 65 6e 74 20 64 61 74 61 2e 20 0a 28 64 65 66 69 ent data. .(defi
3c90: 6e 65 20 28 64 62 3a 64 65 6c 65 74 65 2d 72 75 ne (db:delete-ru
3ca0: 6e 20 64 62 20 72 75 6e 2d 69 64 29 0a 20 20 28 n db run-id). (
3cb0: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 sqlite3:execute
3cc0: 64 62 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 db "DELETE FROM
3cd0: 72 75 6e 73 20 57 48 45 52 45 20 69 64 3d 3f 3b runs WHERE id=?;
3ce0: 22 20 72 75 6e 2d 69 64 29 29 0a 0a 28 64 65 66 " run-id))..(def
3cf0: 69 6e 65 20 28 64 62 3a 75 70 64 61 74 65 2d 72 ine (db:update-r
3d00: 75 6e 2d 65 76 65 6e 74 5f 74 69 6d 65 20 64 62 un-event_time db
3d10: 20 72 75 6e 2d 69 64 29 0a 20 20 28 73 71 6c 69 run-id). (sqli
3d20: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 te3:execute db "
3d30: 55 50 44 41 54 45 20 72 75 6e 73 20 53 45 54 20 UPDATE runs SET
3d40: 65 76 65 6e 74 5f 74 69 6d 65 3d 73 74 72 66 74 event_time=strft
3d50: 69 6d 65 28 27 25 73 27 2c 27 6e 6f 77 27 29 20 ime('%s','now')
3d60: 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 72 75 6e WHERE id=?;" run
3d70: 2d 69 64 29 29 20 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d -id)) ..;;======
3d80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3d90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3da0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3db0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3dc0: 0a 3b 3b 20 20 54 20 45 20 53 20 54 20 53 0a 3b .;; T E S T S.;
3dd0: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ;===============
3de0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3df0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3e00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3e10: 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 73 74 61 74 =======..;; stat
3e20: 65 73 20 61 6e 64 20 73 74 61 74 75 73 65 73 20 es and statuses
3e30: 61 72 65 20 6c 69 73 74 73 2c 20 74 75 72 6e 20 are lists, turn
3e40: 74 68 65 6d 20 69 6e 74 6f 20 28 22 50 41 53 53 them into ("PASS
3e50: 22 2c 22 46 41 49 4c 22 2e 2e 2e 29 20 61 6e 64 ","FAIL"...) and
3e60: 20 75 73 65 20 4e 4f 54 20 49 4e 0a 3b 3b 20 69 use NOT IN.;; i
3e70: 2e 65 2e 20 74 68 65 73 65 20 6c 69 73 74 73 20 .e. these lists
3e80: 64 65 66 69 6e 65 20 77 68 61 74 20 74 6f 20 4e define what to N
3e90: 4f 54 20 73 68 6f 77 2e 0a 3b 3b 20 73 74 61 74 OT show..;; stat
3ea0: 65 73 20 61 6e 64 20 73 74 61 74 75 73 65 73 20 es and statuses
3eb0: 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 are required to
3ec0: 62 65 20 6c 69 73 74 73 2c 20 65 6d 70 74 79 20 be lists, empty
3ed0: 69 73 20 6f 6b 0a 28 64 65 66 69 6e 65 20 28 64 is ok.(define (d
3ee0: 62 2d 67 65 74 2d 74 65 73 74 73 2d 66 6f 72 2d b-get-tests-for-
3ef0: 72 75 6e 20 64 62 20 72 75 6e 2d 69 64 20 74 65 run db run-id te
3f00: 73 74 70 61 74 74 20 69 74 65 6d 70 61 74 74 20 stpatt itempatt
3f10: 73 74 61 74 65 73 20 73 74 61 74 75 73 65 73 29 states statuses)
3f20: 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20 27 28 . (let ((res '(
3f30: 29 29 0a 09 28 73 74 61 74 65 73 2d 73 74 72 20 ))..(states-str
3f40: 20 20 20 28 63 6f 6e 63 20 22 28 27 22 20 28 73 (conc "('" (s
3f50: 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 tring-interspers
3f60: 65 20 73 74 61 74 65 73 20 20 20 22 27 2c 27 22 e states "','"
3f70: 29 20 22 27 29 22 29 29 0a 09 28 73 74 61 74 75 ) "')"))..(statu
3f80: 73 65 73 2d 73 74 72 20 20 28 63 6f 6e 63 20 22 ses-str (conc "
3f90: 28 27 22 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 ('" (string-inte
3fa0: 72 73 70 65 72 73 65 20 73 74 61 74 75 73 65 73 rsperse statuses
3fb0: 20 22 27 2c 27 22 29 20 22 27 29 22 29 29 0a 09 "','") "')"))..
3fc0: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 ). (sqlite3:f
3fd0: 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20 20 or-each-row .
3fe0: 20 20 28 6c 61 6d 62 64 61 20 28 69 64 20 72 75 (lambda (id ru
3ff0: 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 73 74 n-id testname st
4000: 61 74 65 20 73 74 61 74 75 73 20 65 76 65 6e 74 ate status event
4010: 2d 74 69 6d 65 20 68 6f 73 74 20 63 70 75 6c 6f -time host cpulo
4020: 61 64 20 64 69 73 6b 66 72 65 65 20 75 6e 61 6d ad diskfree unam
4030: 65 20 72 75 6e 64 69 72 20 69 74 65 6d 2d 70 61 e rundir item-pa
4040: 74 68 20 72 75 6e 2d 64 75 72 61 74 69 6f 6e 20 th run-duration
4050: 66 69 6e 61 6c 2d 6c 6f 67 66 20 63 6f 6d 6d 65 final-logf comme
4060: 6e 74 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 nt). (set!
4070: 20 72 65 73 20 28 63 6f 6e 73 20 28 76 65 63 74 res (cons (vect
4080: 6f 72 20 69 64 20 72 75 6e 2d 69 64 20 74 65 73 or id run-id tes
4090: 74 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61 74 tname state stat
40a0: 75 73 20 65 76 65 6e 74 2d 74 69 6d 65 20 68 6f us event-time ho
40b0: 73 74 20 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 st cpuload diskf
40c0: 72 65 65 20 75 6e 61 6d 65 20 72 75 6e 64 69 72 ree uname rundir
40d0: 20 69 74 65 6d 2d 70 61 74 68 20 72 75 6e 2d 64 item-path run-d
40e0: 75 72 61 74 69 6f 6e 20 66 69 6e 61 6c 2d 6c 6f uration final-lo
40f0: 67 66 20 63 6f 6d 6d 65 6e 74 29 20 72 65 73 29 gf comment) res)
4100: 29 29 0a 20 20 20 20 20 64 62 20 0a 20 20 20 20 )). db .
4110: 20 28 63 6f 6e 63 20 22 53 45 4c 45 43 54 20 69 (conc "SELECT i
4120: 64 2c 72 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d d,run_id,testnam
4130: 65 2c 73 74 61 74 65 2c 73 74 61 74 75 73 2c 65 e,state,status,e
4140: 76 65 6e 74 5f 74 69 6d 65 2c 68 6f 73 74 2c 63 vent_time,host,c
4150: 70 75 6c 6f 61 64 2c 64 69 73 6b 66 72 65 65 2c puload,diskfree,
4160: 75 6e 61 6d 65 2c 72 75 6e 64 69 72 2c 69 74 65 uname,rundir,ite
4170: 6d 5f 70 61 74 68 2c 72 75 6e 5f 64 75 72 61 74 m_path,run_durat
4180: 69 6f 6e 2c 66 69 6e 61 6c 5f 6c 6f 67 66 2c 63 ion,final_logf,c
4190: 6f 6d 6d 65 6e 74 20 22 0a 09 20 20 20 22 20 46 omment ".. " F
41a0: 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 ROM tests WHERE
41b0: 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 run_id=? AND tes
41c0: 74 6e 61 6d 65 20 6c 69 6b 65 20 3f 20 41 4e 44 tname like ? AND
41d0: 20 69 74 65 6d 5f 70 61 74 68 20 4c 49 4b 45 20 item_path LIKE
41e0: 3f 20 22 20 0a 09 20 20 20 22 20 41 4e 44 20 4e ? " .. " AND N
41f0: 4f 54 20 28 73 74 61 74 65 20 69 6e 20 22 20 73 OT (state in " s
4200: 74 61 74 65 73 2d 73 74 72 20 22 20 41 4e 44 20 tates-str " AND
4210: 73 74 61 74 75 73 20 49 4e 20 22 20 73 74 61 74 status IN " stat
4220: 75 73 65 73 2d 73 74 72 20 22 29 20 22 0a 09 20 uses-str ") "..
4230: 20 20 3b 3b 20 22 20 4f 52 44 45 52 20 42 59 20 ;; " ORDER BY
4240: 69 64 20 44 45 53 43 3b 22 0a 09 20 20 20 22 20 id DESC;".. "
4250: 4f 52 44 45 52 20 42 59 20 65 76 65 6e 74 5f 74 ORDER BY event_t
4260: 69 6d 65 20 41 53 43 3b 22 20 3b 3b 20 50 4f 54 ime ASC;" ;; POT
4270: 45 4e 54 49 41 4c 20 49 53 53 55 45 21 20 43 48 ENTIAL ISSUE! CH
4280: 45 43 4b 20 4d 45 21 20 44 6f 65 73 20 61 6e 79 ECK ME! Does any
4290: 74 69 6e 67 20 64 65 70 65 6e 64 20 6f 6e 20 74 ting depend on t
42a0: 68 69 73 20 62 65 69 6e 67 20 73 6f 72 74 65 64 his being sorted
42b0: 20 62 79 20 69 64 3f 0a 09 20 20 20 29 0a 20 20 by id?.. ).
42c0: 20 20 20 72 75 6e 2d 69 64 0a 20 20 20 20 20 28 run-id. (
42d0: 69 66 20 74 65 73 74 70 61 74 74 20 74 65 73 74 if testpatt test
42e0: 70 61 74 74 20 22 25 22 29 0a 20 20 20 20 20 28 patt "%"). (
42f0: 69 66 20 69 74 65 6d 70 61 74 74 20 69 74 65 6d if itempatt item
4300: 70 61 74 74 20 22 25 22 29 29 0a 20 20 20 20 72 patt "%")). r
4310: 65 73 29 29 0a 0a 3b 3b 20 74 68 69 73 20 6f 6e es))..;; this on
4320: 65 20 69 73 20 61 20 62 69 74 20 62 72 6f 6b 65 e is a bit broke
4330: 6e 20 42 55 47 20 46 49 58 4d 45 0a 28 64 65 66 n BUG FIXME.(def
4340: 69 6e 65 20 28 64 62 3a 64 65 6c 65 74 65 2d 74 ine (db:delete-t
4350: 65 73 74 2d 73 74 65 70 2d 72 65 63 6f 72 64 73 est-step-records
4360: 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d db run-id test-
4370: 6e 61 6d 65 20 69 74 65 6d 64 61 74 29 0a 20 20 name itemdat).
4380: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 (sqlite3:execute
4390: 20 64 62 20 22 44 45 4c 45 54 45 20 46 52 4f 4d db "DELETE FROM
43a0: 20 74 65 73 74 5f 73 74 65 70 73 20 57 48 45 52 test_steps WHER
43b0: 45 20 74 65 73 74 5f 69 64 20 69 6e 20 28 53 45 E test_id in (SE
43c0: 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 74 65 73 LECT id FROM tes
43d0: 74 73 20 57 48 45 52 45 20 72 75 6e 5f 69 64 3d ts WHERE run_id=
43e0: 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f ? AND testname=?
43f0: 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 3d 3f AND item_path=?
4400: 29 3b 22 20 0a 09 09 20 20 20 72 75 6e 2d 69 64 );" ... run-id
4410: 20 74 65 73 74 2d 6e 61 6d 65 20 28 69 74 65 6d test-name (item
4420: 2d 6c 69 73 74 2d 3e 70 61 74 68 20 69 74 65 6d -list->path item
4430: 64 61 74 29 29 29 0a 3b 3b 20 0a 28 64 65 66 69 dat))).;; .(defi
4440: 6e 65 20 28 64 62 3a 64 65 6c 65 74 65 2d 74 65 ne (db:delete-te
4450: 73 74 2d 72 65 63 6f 72 64 73 20 64 62 20 74 65 st-records db te
4460: 73 74 2d 69 64 29 0a 20 20 28 73 71 6c 69 74 65 st-id). (sqlite
4470: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 44 45 3:execute db "DE
4480: 4c 45 54 45 20 46 52 4f 4d 20 74 65 73 74 5f 73 LETE FROM test_s
4490: 74 65 70 73 20 57 48 45 52 45 20 74 65 73 74 5f teps WHERE test_
44a0: 69 64 3d 3f 3b 22 20 74 65 73 74 2d 69 64 29 0a id=?;" test-id).
44b0: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 (sqlite3:execu
44c0: 74 65 20 64 62 20 22 44 45 4c 45 54 45 20 46 52 te db "DELETE FR
44d0: 4f 4d 20 74 65 73 74 5f 64 61 74 61 20 20 57 48 OM test_data WH
44e0: 45 52 45 20 74 65 73 74 5f 69 64 3d 3f 3b 22 20 ERE test_id=?;"
44f0: 74 65 73 74 2d 69 64 29 0a 20 20 28 73 71 6c 69 test-id). (sqli
4500: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 te3:execute db "
4510: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 65 73 74 DELETE FROM test
4520: 73 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 74 s WHERE id=?;" t
4530: 65 73 74 2d 69 64 29 29 0a 0a 3b 3b 20 73 65 74 est-id))..;; set
4540: 20 74 65 73 74 73 20 77 69 74 68 20 73 74 61 74 tests with stat
4550: 65 20 63 75 72 72 73 74 61 74 65 20 61 6e 64 20 e currstate and
4560: 73 74 61 74 75 73 20 63 75 72 72 73 74 61 74 75 status currstatu
4570: 73 20 74 6f 20 6e 65 77 73 74 61 74 65 20 61 6e s to newstate an
4580: 64 20 6e 65 77 73 74 61 74 75 73 0a 3b 3b 20 75 d newstatus.;; u
4590: 73 65 20 63 75 72 72 73 74 61 74 65 20 3d 20 23 se currstate = #
45a0: 66 20 61 6e 64 20 6f 72 20 63 75 72 72 73 74 61 f and or currsta
45b0: 74 75 73 20 3d 20 23 66 20 74 6f 20 61 70 70 6c tus = #f to appl
45c0: 79 20 74 6f 20 61 6e 79 20 73 74 61 74 65 20 6f y to any state o
45d0: 72 20 73 74 61 74 75 73 20 72 65 73 70 65 63 74 r status respect
45e0: 69 76 65 6c 79 0a 3b 3b 20 57 41 52 4e 49 4e 47 ively.;; WARNING
45f0: 3a 20 53 51 4c 20 69 6e 6a 65 63 74 69 6f 6e 20 : SQL injection
4600: 72 69 73 6b 0a 28 64 65 66 69 6e 65 20 28 64 62 risk.(define (db
4610: 3a 73 65 74 2d 74 65 73 74 73 2d 73 74 61 74 65 :set-tests-state
4620: 2d 73 74 61 74 75 73 20 64 62 20 72 75 6e 2d 69 -status db run-i
4630: 64 20 74 65 73 74 6e 61 6d 65 73 20 63 75 72 72 d testnames curr
4640: 73 74 61 74 65 20 63 75 72 72 73 74 61 74 75 73 state currstatus
4650: 20 6e 65 77 73 74 61 74 65 20 6e 65 77 73 74 61 newstate newsta
4660: 74 75 73 29 0a 20 20 28 66 6f 72 2d 65 61 63 68 tus). (for-each
4670: 20 28 6c 61 6d 62 64 61 20 28 74 65 73 74 6e 61 (lambda (testna
4680: 6d 65 29 0a 09 20 20 20 20 20 20 28 6c 65 74 20 me).. (let
4690: 28 28 71 72 79 20 28 63 6f 6e 63 20 22 55 50 44 ((qry (conc "UPD
46a0: 41 54 45 20 74 65 73 74 73 20 53 45 54 20 73 74 ATE tests SET st
46b0: 61 74 65 3d 3f 2c 73 74 61 74 75 73 3d 3f 20 57 ate=?,status=? W
46c0: 48 45 52 45 20 22 0a 09 09 09 09 09 28 69 66 20 HERE "......(if
46d0: 63 75 72 72 73 74 61 74 65 20 20 28 63 6f 6e 63 currstate (conc
46e0: 20 22 73 74 61 74 65 3d 27 22 20 63 75 72 72 73 "state='" currs
46f0: 74 61 74 65 20 22 27 20 41 4e 44 20 22 29 20 22 tate "' AND ") "
4700: 22 29 0a 09 09 09 09 09 28 69 66 20 63 75 72 72 ")......(if curr
4710: 73 74 61 74 75 73 20 28 63 6f 6e 63 20 22 73 74 status (conc "st
4720: 61 74 75 73 3d 27 22 20 63 75 72 72 73 74 61 74 atus='" currstat
4730: 75 73 20 22 27 20 41 4e 44 20 22 29 20 22 22 29 us "' AND ") "")
4740: 0a 09 09 09 09 09 22 20 72 75 6e 5f 69 64 3d 3f ......" run_id=?
4750: 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20 AND testname=?
4760: 41 4e 44 20 4e 4f 54 20 28 69 74 65 6d 5f 70 61 AND NOT (item_pa
4770: 74 68 3d 27 27 20 41 4e 44 20 74 65 73 74 6e 61 th='' AND testna
4780: 6d 65 20 69 6e 20 28 53 45 4c 45 43 54 20 44 49 me in (SELECT DI
4790: 53 54 49 4e 43 54 20 74 65 73 74 6e 61 6d 65 20 STINCT testname
47a0: 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 FROM tests WHERE
47b0: 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 testname=? AND
47c0: 69 74 65 6d 5f 70 61 74 68 20 21 3d 20 27 27 29 item_path != '')
47d0: 29 3b 22 29 29 29 0a 09 09 3b 3b 28 64 65 62 75 );")))...;;(debu
47e0: 67 3a 70 72 69 6e 74 20 30 20 22 51 52 59 3a 20 g:print 0 "QRY:
47f0: 22 20 71 72 79 29 0a 09 09 28 73 71 6c 69 74 65 " qry)...(sqlite
4800: 33 3a 65 78 65 63 75 74 65 20 64 62 20 71 72 79 3:execute db qry
4810: 20 72 75 6e 2d 69 64 20 6e 65 77 73 74 61 74 65 run-id newstate
4820: 20 6e 65 77 73 74 61 74 75 73 20 74 65 73 74 6e newstatus testn
4830: 61 6d 65 20 74 65 73 74 6e 61 6d 65 29 29 29 0a ame testname))).
4840: 09 20 20 20 20 74 65 73 74 6e 61 6d 65 73 29 29 . testnames))
4850: 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 64 65 ..(define (db:de
4860: 6c 65 74 65 2d 74 65 73 74 73 2d 69 6e 2d 73 74 lete-tests-in-st
4870: 61 74 65 20 64 62 20 72 75 6e 2d 69 64 20 73 74 ate db run-id st
4880: 61 74 65 29 0a 20 20 28 73 71 6c 69 74 65 33 3a ate). (sqlite3:
4890: 65 78 65 63 75 74 65 20 64 62 20 22 44 45 4c 45 execute db "DELE
48a0: 54 45 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 TE FROM tests WH
48b0: 45 52 45 20 73 74 61 74 65 3d 3f 20 41 4e 44 20 ERE state=? AND
48c0: 72 75 6e 5f 69 64 3d 3f 3b 22 20 73 74 61 74 65 run_id=?;" state
48d0: 20 72 75 6e 2d 69 64 29 29 0a 0a 28 64 65 66 69 run-id))..(defi
48e0: 6e 65 20 28 64 62 3a 74 65 73 74 2d 73 65 74 2d ne (db:test-set-
48f0: 73 74 61 74 65 2d 73 74 61 74 75 73 2d 62 79 2d state-status-by-
4900: 69 64 20 64 62 20 74 65 73 74 2d 69 64 20 6e 65 id db test-id ne
4910: 77 73 74 61 74 65 20 6e 65 77 73 74 61 74 75 73 wstate newstatus
4920: 20 6e 65 77 63 6f 6d 6d 65 6e 74 29 0a 20 20 28 newcomment). (
4930: 69 66 20 6e 65 77 73 74 61 74 65 20 20 20 28 73 if newstate (s
4940: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 qlite3:execute d
4950: 62 20 22 55 50 44 41 54 45 20 74 65 73 74 73 20 b "UPDATE tests
4960: 53 45 54 20 73 74 61 74 65 3d 3f 20 20 20 57 48 SET state=? WH
4970: 45 52 45 20 69 64 3d 3f 3b 22 20 6e 65 77 73 74 ERE id=?;" newst
4980: 61 74 65 20 20 20 74 65 73 74 2d 69 64 29 29 0a ate test-id)).
4990: 20 20 28 69 66 20 6e 65 77 73 74 61 74 75 73 20 (if newstatus
49a0: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 (sqlite3:execut
49b0: 65 20 64 62 20 22 55 50 44 41 54 45 20 74 65 73 e db "UPDATE tes
49c0: 74 73 20 53 45 54 20 73 74 61 74 75 73 3d 3f 20 ts SET status=?
49d0: 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 6e 65 WHERE id=?;" ne
49e0: 77 73 74 61 74 75 73 20 20 74 65 73 74 2d 69 64 wstatus test-id
49f0: 29 29 0a 20 20 28 69 66 20 6e 65 77 63 6f 6d 6d )). (if newcomm
4a00: 65 6e 74 20 28 73 71 6c 69 74 65 33 3a 65 78 65 ent (sqlite3:exe
4a10: 63 75 74 65 20 64 62 20 22 55 50 44 41 54 45 20 cute db "UPDATE
4a20: 74 65 73 74 73 20 53 45 54 20 63 6f 6d 6d 65 6e tests SET commen
4a30: 74 3d 3f 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 t=? WHERE id=?;"
4a40: 20 6e 65 77 63 6f 6d 6d 65 6e 74 20 74 65 73 74 newcomment test
4a50: 2d 69 64 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 -id)))..(define
4a60: 28 64 62 3a 67 65 74 2d 63 6f 75 6e 74 2d 74 65 (db:get-count-te
4a70: 73 74 73 2d 72 75 6e 6e 69 6e 67 20 64 62 29 0a sts-running db).
4a80: 20 20 28 6c 65 74 20 28 28 72 65 73 20 30 29 29 (let ((res 0))
4a90: 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f . (sqlite3:fo
4aa0: 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 r-each-row.
4ab0: 28 6c 61 6d 62 64 61 20 28 63 6f 75 6e 74 29 0a (lambda (count).
4ac0: 20 20 20 20 20 20 20 28 73 65 74 21 20 72 65 73 (set! res
4ad0: 20 63 6f 75 6e 74 29 29 0a 20 20 20 20 20 64 62 count)). db
4ae0: 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f . "SELECT co
4af0: 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 74 65 73 unt(id) FROM tes
4b00: 74 73 20 57 48 45 52 45 20 73 74 61 74 65 20 3d ts WHERE state =
4b10: 20 27 52 55 4e 4e 49 4e 47 27 20 4f 52 20 73 74 'RUNNING' OR st
4b20: 61 74 65 20 3d 20 27 4c 41 55 4e 43 48 45 44 27 ate = 'LAUNCHED'
4b30: 20 4f 52 20 73 74 61 74 65 20 3d 20 27 52 45 4d OR state = 'REM
4b40: 4f 54 45 48 4f 53 54 53 54 41 52 54 27 3b 22 29 OTEHOSTSTART';")
4b50: 0a 20 20 20 20 72 65 73 29 29 0a 0a 28 64 65 66 . res))..(def
4b60: 69 6e 65 20 28 64 62 3a 67 65 74 2d 63 6f 75 6e ine (db:get-coun
4b70: 74 2d 74 65 73 74 73 2d 72 75 6e 6e 69 6e 67 2d t-tests-running-
4b80: 69 6e 2d 6a 6f 62 67 72 6f 75 70 20 64 62 20 6a in-jobgroup db j
4b90: 6f 62 67 72 6f 75 70 29 0a 20 20 28 69 66 20 28 obgroup). (if (
4ba0: 6e 6f 74 20 6a 6f 62 67 72 6f 75 70 29 0a 20 20 not jobgroup).
4bb0: 20 20 20 20 30 20 3b 3b 20 0a 20 20 20 20 20 20 0 ;; .
4bc0: 28 6c 65 74 20 28 28 72 65 73 20 30 29 29 0a 09 (let ((res 0))..
4bd0: 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 (sqlite3:for-eac
4be0: 68 2d 72 6f 77 0a 09 20 28 6c 61 6d 62 64 61 20 h-row.. (lambda
4bf0: 28 63 6f 75 6e 74 29 0a 09 20 20 20 28 73 65 74 (count).. (set
4c00: 21 20 72 65 73 20 63 6f 75 6e 74 29 29 0a 09 20 ! res count))..
4c10: 64 62 0a 09 20 22 53 45 4c 45 43 54 20 63 6f 75 db.. "SELECT cou
4c20: 6e 74 28 69 64 29 20 46 52 4f 4d 20 74 65 73 74 nt(id) FROM test
4c30: 73 20 57 48 45 52 45 20 73 74 61 74 65 20 3d 20 s WHERE state =
4c40: 27 52 55 4e 4e 49 4e 47 27 20 4f 52 20 73 74 61 'RUNNING' OR sta
4c50: 74 65 20 3d 20 27 4c 41 55 4e 43 48 45 44 27 20 te = 'LAUNCHED'
4c60: 4f 52 20 73 74 61 74 65 20 3d 20 27 52 45 4d 4f OR state = 'REMO
4c70: 54 45 48 4f 53 54 53 54 41 52 54 27 0a 20 20 20 TEHOSTSTART'.
4c80: 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 74 65 AND te
4c90: 73 74 6e 61 6d 65 20 69 6e 20 28 53 45 4c 45 43 stname in (SELEC
4ca0: 54 20 74 65 73 74 6e 61 6d 65 20 46 52 4f 4d 20 T testname FROM
4cb0: 74 65 73 74 5f 6d 65 74 61 20 57 48 45 52 45 20 test_meta WHERE
4cc0: 6a 6f 62 67 72 6f 75 70 3d 3f 3b 22 0a 09 20 6a jobgroup=?;".. j
4cd0: 6f 62 67 72 6f 75 70 29 0a 09 72 65 73 29 29 29 obgroup)..res)))
4ce0: 0a 0a 3b 3b 20 64 6f 6e 65 20 77 69 74 68 20 72 ..;; done with r
4cf0: 75 6e 20 77 68 65 6e 3a 0a 3b 3b 20 20 20 30 20 un when:.;; 0
4d00: 74 65 73 74 73 20 69 6e 20 4c 41 55 4e 43 48 45 tests in LAUNCHE
4d10: 44 2c 20 4e 4f 54 5f 53 54 41 52 54 45 44 2c 20 D, NOT_STARTED,
4d20: 52 45 4d 4f 54 45 48 4f 53 54 53 54 41 52 54 2c REMOTEHOSTSTART,
4d30: 20 52 55 4e 4e 49 4e 47 0a 28 64 65 66 69 6e 65 RUNNING.(define
4d40: 20 28 64 62 3a 65 73 74 69 6d 61 74 65 64 2d 74 (db:estimated-t
4d50: 65 73 74 73 2d 72 65 6d 61 69 6e 69 6e 67 20 64 ests-remaining d
4d60: 62 20 72 75 6e 2d 69 64 29 0a 20 20 28 6c 65 74 b run-id). (let
4d70: 20 28 28 72 65 73 20 30 29 29 0a 20 20 20 20 28 ((res 0)). (
4d80: 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 sqlite3:for-each
4d90: 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 64 -row. (lambd
4da0: 61 20 28 63 6f 75 6e 74 29 0a 20 20 20 20 20 20 a (count).
4db0: 20 28 73 65 74 21 20 72 65 73 20 63 6f 75 6e 74 (set! res count
4dc0: 29 29 0a 20 20 20 20 20 64 62 20 3b 3b 20 4e 42 )). db ;; NB
4dd0: 2f 2f 20 4b 49 4c 4c 52 45 51 20 6d 65 61 6e 73 // KILLREQ means
4de0: 20 74 68 65 20 6a 6f 62 73 20 69 73 20 73 74 69 the jobs is sti
4df0: 6c 6c 20 70 72 6f 62 61 62 6c 79 20 72 75 6e 6e ll probably runn
4e00: 69 6e 67 0a 20 20 20 20 20 22 53 45 4c 45 43 54 ing. "SELECT
4e10: 20 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 count(id) FROM
4e20: 74 65 73 74 73 20 57 48 45 52 45 20 73 74 61 74 tests WHERE stat
4e30: 65 20 69 6e 20 28 27 4c 41 55 4e 43 48 45 44 27 e in ('LAUNCHED'
4e40: 2c 27 4e 4f 54 5f 53 54 41 52 54 45 44 27 2c 27 ,'NOT_STARTED','
4e50: 52 45 4d 4f 54 45 48 4f 53 54 53 54 41 52 54 27 REMOTEHOSTSTART'
4e60: 2c 27 52 55 4e 4e 49 4e 47 27 2c 27 4b 49 4c 4c ,'RUNNING','KILL
4e70: 52 45 51 27 29 20 41 4e 44 20 72 75 6e 5f 69 64 REQ') AND run_id
4e80: 3d 3f 3b 22 20 72 75 6e 2d 69 64 29 0a 20 20 20 =?;" run-id).
4e90: 20 72 65 73 29 29 0a 0a 3b 3b 20 4e 42 2f 2f 20 res))..;; NB//
4ea0: 53 79 6e 63 20 74 68 69 73 20 77 69 74 68 20 72 Sync this with r
4eb0: 75 6e 73 3a 67 65 74 2d 74 65 73 74 2d 69 6e 66 uns:get-test-inf
4ec0: 6f 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 o.(define (db:ge
4ed0: 74 2d 74 65 73 74 2d 69 6e 66 6f 20 64 62 20 72 t-test-info db r
4ee0: 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 69 un-id testname i
4ef0: 74 65 6d 2d 70 61 74 68 29 0a 20 20 28 6c 65 74 tem-path). (let
4f00: 20 28 28 72 65 73 20 23 66 29 29 0a 20 20 20 20 ((res #f)).
4f10: 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 (sqlite3:for-eac
4f20: 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 h-row. (lamb
4f30: 64 61 20 28 69 64 20 72 75 6e 2d 69 64 20 74 65 da (id run-id te
4f40: 73 74 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61 stname state sta
4f50: 74 75 73 20 65 76 65 6e 74 2d 74 69 6d 65 20 68 tus event-time h
4f60: 6f 73 74 20 63 70 75 6c 6f 61 64 20 64 69 73 6b ost cpuload disk
4f70: 66 72 65 65 20 75 6e 61 6d 65 20 72 75 6e 64 69 free uname rundi
4f80: 72 20 69 74 65 6d 2d 70 61 74 68 20 72 75 6e 5f r item-path run_
4f90: 64 75 72 61 74 69 6f 6e 20 66 69 6e 61 6c 5f 6c duration final_l
4fa0: 6f 67 66 20 63 6f 6d 6d 65 6e 74 20 29 0a 20 20 ogf comment ).
4fb0: 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28 (set! res (
4fc0: 76 65 63 74 6f 72 20 69 64 20 72 75 6e 2d 69 64 vector id run-id
4fd0: 20 74 65 73 74 6e 61 6d 65 20 73 74 61 74 65 20 testname state
4fe0: 73 74 61 74 75 73 20 65 76 65 6e 74 2d 74 69 6d status event-tim
4ff0: 65 20 68 6f 73 74 20 63 70 75 6c 6f 61 64 20 64 e host cpuload d
5000: 69 73 6b 66 72 65 65 20 75 6e 61 6d 65 20 72 75 iskfree uname ru
5010: 6e 64 69 72 20 69 74 65 6d 2d 70 61 74 68 20 72 ndir item-path r
5020: 75 6e 5f 64 75 72 61 74 69 6f 6e 20 66 69 6e 61 un_duration fina
5030: 6c 5f 6c 6f 67 66 20 63 6f 6d 6d 65 6e 74 20 29 l_logf comment )
5040: 29 29 0a 20 20 20 20 20 64 62 20 0a 20 20 20 20 )). db .
5050: 20 22 53 45 4c 45 43 54 20 69 64 2c 72 75 6e 5f "SELECT id,run_
5060: 69 64 2c 74 65 73 74 6e 61 6d 65 2c 73 74 61 74 id,testname,stat
5070: 65 2c 73 74 61 74 75 73 2c 65 76 65 6e 74 5f 74 e,status,event_t
5080: 69 6d 65 2c 68 6f 73 74 2c 63 70 75 6c 6f 61 64 ime,host,cpuload
5090: 2c 64 69 73 6b 66 72 65 65 2c 75 6e 61 6d 65 2c ,diskfree,uname,
50a0: 72 75 6e 64 69 72 2c 69 74 65 6d 5f 70 61 74 68 rundir,item_path
50b0: 2c 72 75 6e 5f 64 75 72 61 74 69 6f 6e 2c 66 69 ,run_duration,fi
50c0: 6e 61 6c 5f 6c 6f 67 66 2c 63 6f 6d 6d 65 6e 74 nal_logf,comment
50d0: 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 FROM tests WHER
50e0: 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 E run_id=? AND t
50f0: 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 estname=? AND it
5100: 65 6d 5f 70 61 74 68 3d 3f 3b 22 0a 20 20 20 20 em_path=?;".
5110: 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 run-id testname
5120: 20 69 74 65 6d 2d 70 61 74 68 29 0a 20 20 20 20 item-path).
5130: 72 65 73 29 29 0a 0a 3b 3b 20 47 65 74 20 74 65 res))..;; Get te
5140: 73 74 20 64 61 74 61 20 75 73 69 6e 67 20 74 65 st data using te
5150: 73 74 5f 69 64 0a 28 64 65 66 69 6e 65 20 28 64 st_id.(define (d
5160: 62 3a 67 65 74 2d 74 65 73 74 2d 64 61 74 61 2d b:get-test-data-
5170: 62 79 2d 69 64 20 64 62 20 74 65 73 74 2d 69 64 by-id db test-id
5180: 29 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20 23 ). (let ((res #
5190: 66 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 f)). (sqlite3
51a0: 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 :for-each-row.
51b0: 20 20 20 28 6c 61 6d 62 64 61 20 28 69 64 20 72 (lambda (id r
51c0: 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 73 un-id testname s
51d0: 74 61 74 65 20 73 74 61 74 75 73 20 65 76 65 6e tate status even
51e0: 74 2d 74 69 6d 65 20 68 6f 73 74 20 63 70 75 6c t-time host cpul
51f0: 6f 61 64 20 64 69 73 6b 66 72 65 65 20 75 6e 61 oad diskfree una
5200: 6d 65 20 72 75 6e 64 69 72 20 69 74 65 6d 2d 70 me rundir item-p
5210: 61 74 68 20 72 75 6e 5f 64 75 72 61 74 69 6f 6e ath run_duration
5220: 20 66 69 6e 61 6c 5f 6c 6f 67 66 20 63 6f 6d 6d final_logf comm
5230: 65 6e 74 29 0a 20 20 20 20 20 20 20 28 73 65 74 ent). (set
5240: 21 20 72 65 73 20 28 76 65 63 74 6f 72 20 69 64 ! res (vector id
5250: 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 run-id testname
5260: 20 73 74 61 74 65 20 73 74 61 74 75 73 20 65 76 state status ev
5270: 65 6e 74 2d 74 69 6d 65 20 68 6f 73 74 20 63 70 ent-time host cp
5280: 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20 75 uload diskfree u
5290: 6e 61 6d 65 20 72 75 6e 64 69 72 20 69 74 65 6d name rundir item
52a0: 2d 70 61 74 68 20 72 75 6e 5f 64 75 72 61 74 69 -path run_durati
52b0: 6f 6e 20 66 69 6e 61 6c 5f 6c 6f 67 66 20 63 6f on final_logf co
52c0: 6d 6d 65 6e 74 29 29 29 0a 20 20 20 20 20 64 62 mment))). db
52d0: 20 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20 69 . "SELECT i
52e0: 64 2c 72 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d d,run_id,testnam
52f0: 65 2c 73 74 61 74 65 2c 73 74 61 74 75 73 2c 65 e,state,status,e
5300: 76 65 6e 74 5f 74 69 6d 65 2c 68 6f 73 74 2c 63 vent_time,host,c
5310: 70 75 6c 6f 61 64 2c 64 69 73 6b 66 72 65 65 2c puload,diskfree,
5320: 75 6e 61 6d 65 2c 72 75 6e 64 69 72 2c 69 74 65 uname,rundir,ite
5330: 6d 5f 70 61 74 68 2c 72 75 6e 5f 64 75 72 61 74 m_path,run_durat
5340: 69 6f 6e 2c 66 69 6e 61 6c 5f 6c 6f 67 66 2c 63 ion,final_logf,c
5350: 6f 6d 6d 65 6e 74 20 46 52 4f 4d 20 74 65 73 74 omment FROM test
5360: 73 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 0a 20 s WHERE id=?;".
5370: 20 20 20 20 74 65 73 74 2d 69 64 29 0a 20 20 20 test-id).
5380: 20 72 65 73 29 29 0a 0a 0a 28 64 65 66 69 6e 65 res))...(define
5390: 20 28 64 62 3a 74 65 73 74 2d 73 65 74 2d 63 6f (db:test-set-co
53a0: 6d 6d 65 6e 74 20 64 62 20 72 75 6e 2d 69 64 20 mment db run-id
53b0: 74 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61 testname item-pa
53c0: 74 68 20 63 6f 6d 6d 65 6e 74 29 0a 20 20 28 73 th comment). (s
53d0: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 0a qlite3:execute .
53e0: 20 20 20 64 62 20 0a 20 20 20 22 55 50 44 41 54 db . "UPDAT
53f0: 45 20 74 65 73 74 73 20 53 45 54 20 63 6f 6d 6d E tests SET comm
5400: 65 6e 74 3d 3f 20 57 48 45 52 45 20 72 75 6e 5f ent=? WHERE run_
5410: 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d id=? AND testnam
5420: 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 e=? AND item_pat
5430: 68 3d 3f 3b 22 0a 20 20 20 20 20 63 6f 6d 6d 65 h=?;". comme
5440: 6e 74 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 nt run-id testna
5450: 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 29 0a 0a me item-path))..
5460: 3b 3b 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 74 ;;.(define (db:t
5470: 65 73 74 2d 73 65 74 2d 72 75 6e 64 69 72 21 20 est-set-rundir!
5480: 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 db run-id testna
5490: 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 72 75 6e me item-path run
54a0: 64 69 72 29 0a 20 20 28 73 71 6c 69 74 65 33 3a dir). (sqlite3:
54b0: 65 78 65 63 75 74 65 20 0a 20 20 20 64 62 20 0a execute . db .
54c0: 20 20 20 22 55 50 44 41 54 45 20 74 65 73 74 73 "UPDATE tests
54d0: 20 53 45 54 20 72 75 6e 64 69 72 3d 3f 20 57 48 SET rundir=? WH
54e0: 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 ERE run_id=? AND
54f0: 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 testname=? AND
5500: 69 74 65 6d 5f 70 61 74 68 3d 3f 3b 22 0a 20 20 item_path=?;".
5510: 20 20 20 72 75 6e 64 69 72 20 72 75 6e 2d 69 64 rundir run-id
5520: 20 74 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 testname item-p
5530: 61 74 68 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d ath))..;;=======
5540: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5550: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5560: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5570: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a ===============.
5580: 3b 3b 20 54 65 73 74 73 20 6d 65 74 61 20 64 61 ;; Tests meta da
5590: 74 61 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ta.;;===========
55a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
55b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
55c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
55d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 ===========..;;
55e0: 72 65 61 64 20 74 68 65 20 72 65 63 6f 72 64 20 read the record
55f0: 67 69 76 65 6e 20 61 20 74 65 73 74 6e 61 6d 65 given a testname
5600: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73 .(define (db:tes
5610: 74 6d 65 74 61 2d 67 65 74 2d 72 65 63 6f 72 64 tmeta-get-record
5620: 20 64 62 20 74 65 73 74 6e 61 6d 65 29 0a 20 20 db testname).
5630: 28 6c 65 74 20 28 28 72 65 73 20 23 66 29 29 0a (let ((res #f)).
5640: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 (sqlite3:for
5650: 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 -each-row. (
5660: 6c 61 6d 62 64 61 20 28 69 64 20 74 65 73 74 6e lambda (id testn
5670: 61 6d 65 20 61 75 74 68 6f 72 20 6f 77 6e 65 72 ame author owner
5680: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 72 65 76 description rev
5690: 69 65 77 65 64 20 69 74 65 72 61 74 65 64 20 61 iewed iterated a
56a0: 76 67 5f 72 75 6e 74 69 6d 65 20 61 76 67 5f 64 vg_runtime avg_d
56b0: 69 73 6b 20 74 61 67 73 29 0a 20 20 20 20 20 20 isk tags).
56c0: 20 28 73 65 74 21 20 72 65 73 20 28 76 65 63 74 (set! res (vect
56d0: 6f 72 20 69 64 20 74 65 73 74 6e 61 6d 65 20 61 or id testname a
56e0: 75 74 68 6f 72 20 6f 77 6e 65 72 20 64 65 73 63 uthor owner desc
56f0: 72 69 70 74 69 6f 6e 20 72 65 76 69 65 77 65 64 ription reviewed
5700: 20 69 74 65 72 61 74 65 64 20 61 76 67 5f 72 75 iterated avg_ru
5710: 6e 74 69 6d 65 20 61 76 67 5f 64 69 73 6b 20 74 ntime avg_disk t
5720: 61 67 73 29 29 29 0a 20 20 20 20 20 64 62 20 22 ags))). db "
5730: 53 45 4c 45 43 54 20 69 64 2c 74 65 73 74 6e 61 SELECT id,testna
5740: 6d 65 2c 61 75 74 68 6f 72 2c 6f 77 6e 65 72 2c me,author,owner,
5750: 64 65 73 63 72 69 70 74 69 6f 6e 2c 72 65 76 69 description,revi
5760: 65 77 65 64 2c 69 74 65 72 61 74 65 64 2c 61 76 ewed,iterated,av
5770: 67 5f 72 75 6e 74 69 6d 65 2c 61 76 67 5f 64 69 g_runtime,avg_di
5780: 73 6b 2c 74 61 67 73 20 46 52 4f 4d 20 74 65 73 sk,tags FROM tes
5790: 74 5f 6d 65 74 61 20 57 48 45 52 45 20 74 65 73 t_meta WHERE tes
57a0: 74 6e 61 6d 65 3d 3f 3b 22 0a 20 20 20 20 20 74 tname=?;". t
57b0: 65 73 74 6e 61 6d 65 29 0a 20 20 20 20 72 65 73 estname). res
57c0: 29 29 0a 0a 3b 3b 20 63 72 65 61 74 65 20 61 20 ))..;; create a
57d0: 6e 65 77 20 72 65 63 6f 72 64 20 66 6f 72 20 61 new record for a
57e0: 20 67 69 76 65 6e 20 74 65 73 74 6e 61 6d 65 0a given testname.
57f0: 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74 (define (db:test
5800: 6d 65 74 61 2d 61 64 64 2d 72 65 63 6f 72 64 20 meta-add-record
5810: 64 62 20 74 65 73 74 6e 61 6d 65 29 0a 20 20 28 db testname). (
5820: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 sqlite3:execute
5830: 64 62 20 22 49 4e 53 45 52 54 20 4f 52 20 49 47 db "INSERT OR IG
5840: 4e 4f 52 45 20 49 4e 54 4f 20 74 65 73 74 5f 6d NORE INTO test_m
5850: 65 74 61 20 28 74 65 73 74 6e 61 6d 65 2c 61 75 eta (testname,au
5860: 74 68 6f 72 2c 6f 77 6e 65 72 2c 64 65 73 63 72 thor,owner,descr
5870: 69 70 74 69 6f 6e 2c 72 65 76 69 65 77 65 64 2c iption,reviewed,
5880: 69 74 65 72 61 74 65 64 2c 61 76 67 5f 72 75 6e iterated,avg_run
5890: 74 69 6d 65 2c 61 76 67 5f 64 69 73 6b 2c 74 61 time,avg_disk,ta
58a0: 67 73 29 20 56 41 4c 55 45 53 20 28 3f 2c 27 27 gs) VALUES (?,''
58b0: 2c 27 27 2c 27 27 2c 27 27 2c 27 27 2c 27 27 2c ,'','','','','',
58c0: 27 27 2c 27 27 29 3b 22 20 74 65 73 74 6e 61 6d '','');" testnam
58d0: 65 29 29 0a 0a 3b 3b 20 75 70 64 61 74 65 20 6f e))..;; update o
58e0: 6e 65 20 6f 66 20 74 68 65 20 74 65 73 74 6d 65 ne of the testme
58f0: 74 61 20 66 69 65 6c 64 73 0a 28 64 65 66 69 6e ta fields.(defin
5900: 65 20 28 64 62 3a 74 65 73 74 6d 65 74 61 2d 75 e (db:testmeta-u
5910: 70 64 61 74 65 2d 66 69 65 6c 64 20 64 62 20 74 pdate-field db t
5920: 65 73 74 6e 61 6d 65 20 66 69 65 6c 64 20 76 61 estname field va
5930: 6c 75 65 29 0a 20 20 28 73 71 6c 69 74 65 33 3a lue). (sqlite3:
5940: 65 78 65 63 75 74 65 20 64 62 20 28 63 6f 6e 63 execute db (conc
5950: 20 22 55 50 44 41 54 45 20 74 65 73 74 5f 6d 65 "UPDATE test_me
5960: 74 61 20 53 45 54 20 22 20 66 69 65 6c 64 20 22 ta SET " field "
5970: 3d 3f 20 57 48 45 52 45 20 74 65 73 74 6e 61 6d =? WHERE testnam
5980: 65 3d 3f 3b 22 29 20 76 61 6c 75 65 20 74 65 73 e=?;") value tes
5990: 74 6e 61 6d 65 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d tname))..;;=====
59a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
59b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
59c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
59d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
59e0: 3d 0a 3b 3b 20 54 20 45 20 53 20 54 20 20 20 44 =.;; T E S T D
59f0: 20 41 20 54 20 41 20 0a 3b 3b 3d 3d 3d 3d 3d 3d A T A .;;======
5a00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5a10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5a20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5a30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5a40: 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 63 73 ..(define (db:cs
5a50: 76 2d 3e 74 65 73 74 2d 64 61 74 61 20 64 62 20 v->test-data db
5a60: 74 65 73 74 2d 69 64 20 63 73 76 64 61 74 61 29 test-id csvdata)
5a70: 0a 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 . (debug:print
5a80: 34 20 22 74 65 73 74 2d 69 64 20 22 20 74 65 73 4 "test-id " tes
5a90: 74 2d 69 64 20 22 2c 20 63 73 76 64 61 74 61 3a t-id ", csvdata:
5aa0: 20 22 20 63 73 76 64 61 74 61 29 0a 20 20 28 6c " csvdata). (l
5ab0: 65 74 20 28 28 63 73 76 6c 69 73 74 20 28 63 73 et ((csvlist (cs
5ac0: 76 2d 3e 6c 69 73 74 20 28 6d 61 6b 65 2d 63 73 v->list (make-cs
5ad0: 76 2d 72 65 61 64 65 72 0a 09 09 09 20 20 20 20 v-reader....
5ae0: 20 28 6f 70 65 6e 2d 69 6e 70 75 74 2d 73 74 72 (open-input-str
5af0: 69 6e 67 20 63 73 76 64 61 74 61 29 0a 09 09 09 ing csvdata)....
5b00: 20 20 20 20 20 27 28 28 73 74 72 69 70 2d 6c 65 '((strip-le
5b10: 61 64 69 6e 67 2d 77 68 69 74 65 73 70 61 63 65 ading-whitespace
5b20: 3f 20 23 74 29 0a 09 09 09 20 20 20 20 20 20 20 ? #t)....
5b30: 28 73 74 72 69 70 2d 74 72 61 69 6c 69 6e 67 2d (strip-trailing-
5b40: 77 68 69 74 65 73 70 61 63 65 3f 20 23 74 29 29 whitespace? #t))
5b50: 20 29 29 29 29 20 3b 3b 20 28 63 73 76 2d 3e 6c )))) ;; (csv->l
5b60: 69 73 74 20 63 73 76 64 61 74 61 29 29 29 0a 20 ist csvdata))).
5b70: 20 20 20 28 66 6f 72 2d 65 61 63 68 20 0a 20 20 (for-each .
5b80: 20 20 20 28 6c 61 6d 62 64 61 20 28 63 73 76 72 (lambda (csvr
5b90: 6f 77 29 0a 20 20 20 20 20 20 20 28 6c 65 74 2a ow). (let*
5ba0: 20 28 28 70 61 64 64 65 64 2d 72 6f 77 20 20 28 ((padded-row (
5bb0: 74 61 6b 65 20 28 61 70 70 65 6e 64 20 63 73 76 take (append csv
5bc0: 72 6f 77 20 28 6c 69 73 74 20 23 66 20 23 66 20 row (list #f #f
5bd0: 23 66 20 23 66 20 23 66 20 23 66 20 23 66 20 23 #f #f #f #f #f #
5be0: 66 29 29 20 38 29 29 0a 09 20 20 20 20 20 20 28 f)) 8)).. (
5bf0: 63 61 74 65 67 6f 72 79 20 20 20 20 28 6c 69 73 category (lis
5c00: 74 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77 t-ref padded-row
5c10: 20 30 29 29 0a 09 20 20 20 20 20 20 28 76 61 72 0)).. (var
5c20: 69 61 62 6c 65 20 20 20 20 28 6c 69 73 74 2d 72 iable (list-r
5c30: 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20 31 29 ef padded-row 1)
5c40: 29 0a 09 20 20 20 20 20 20 28 76 61 6c 75 65 20 ).. (value
5c50: 20 20 20 20 20 20 28 61 6e 79 2d 3e 6e 75 6d 62 (any->numb
5c60: 65 72 2d 69 66 2d 70 6f 73 73 69 62 6c 65 20 28 er-if-possible (
5c70: 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d list-ref padded-
5c80: 72 6f 77 20 32 29 29 29 0a 09 20 20 20 20 20 20 row 2)))..
5c90: 28 65 78 70 65 63 74 65 64 20 20 20 20 28 61 6e (expected (an
5ca0: 79 2d 3e 6e 75 6d 62 65 72 2d 69 66 2d 70 6f 73 y->number-if-pos
5cb0: 73 69 62 6c 65 20 28 6c 69 73 74 2d 72 65 66 20 sible (list-ref
5cc0: 70 61 64 64 65 64 2d 72 6f 77 20 33 29 29 29 0a padded-row 3))).
5cd0: 09 20 20 20 20 20 20 28 74 6f 6c 20 20 20 20 20 . (tol
5ce0: 20 20 20 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 (any->number
5cf0: 2d 69 66 2d 70 6f 73 73 69 62 6c 65 20 28 6c 69 -if-possible (li
5d00: 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f st-ref padded-ro
5d10: 77 20 34 29 29 29 20 3b 3b 20 3e 2c 20 3c 2c 20 w 4))) ;; >, <,
5d20: 3e 3d 2c 20 3c 3d 2c 20 6f 72 20 61 20 6e 75 6d >=, <=, or a num
5d30: 62 65 72 0a 09 20 20 20 20 20 20 28 75 6e 69 74 ber.. (unit
5d40: 73 20 20 20 20 20 20 20 28 6c 69 73 74 2d 72 65 s (list-re
5d50: 66 20 70 61 64 64 65 64 2d 72 6f 77 20 35 29 29 f padded-row 5))
5d60: 0a 09 20 20 20 20 20 20 28 63 6f 6d 6d 65 6e 74 .. (comment
5d70: 20 20 20 20 20 28 6c 69 73 74 2d 72 65 66 20 70 (list-ref p
5d80: 61 64 64 65 64 2d 72 6f 77 20 36 29 29 0a 09 20 added-row 6))..
5d90: 20 20 20 20 20 28 73 74 61 74 75 73 20 20 20 20 (status
5da0: 20 20 28 6c 65 74 20 28 28 73 20 28 6c 69 73 74 (let ((s (list
5db0: 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20 -ref padded-row
5dc0: 37 29 29 29 0a 09 09 09 20 20 20 20 20 28 69 66 7))).... (if
5dd0: 20 28 61 6e 64 20 28 73 74 72 69 6e 67 3f 20 73 (and (string? s
5de0: 29 28 6f 72 20 28 73 74 72 69 6e 67 2d 6d 61 74 )(or (string-mat
5df0: 63 68 20 28 72 65 67 65 78 70 20 22 5e 5c 5c 73 ch (regexp "^\\s
5e00: 2a 24 22 29 20 73 29 0a 09 09 09 09 09 09 20 20 *$") s).......
5e10: 20 20 20 28 73 74 72 69 6e 67 2d 6d 61 74 63 68 (string-match
5e20: 20 28 72 65 67 65 78 70 20 22 5e 6e 2f 61 24 22 (regexp "^n/a$"
5e30: 29 20 73 29 29 29 0a 09 09 09 09 20 23 66 0a 09 ) s)))..... #f..
5e40: 09 09 09 20 73 29 29 29 29 20 3b 3b 20 69 66 20 ... s)))) ;; if
5e50: 73 70 65 63 69 66 69 65 64 20 6f 6e 20 74 68 65 specified on the
5e60: 20 69 6e 70 75 74 20 74 68 65 6e 20 75 73 65 2c input then use,
5e70: 20 65 6c 73 65 20 63 61 6c 63 75 6c 61 74 65 0a else calculate.
5e80: 09 20 3b 3b 20 6c 6f 6f 6b 20 75 70 20 65 78 70 . ;; look up exp
5e90: 65 63 74 65 64 2c 74 6f 6c 2c 75 6e 69 74 73 20 ected,tol,units
5ea0: 66 72 6f 6d 20 70 72 65 76 69 6f 75 73 20 62 65 from previous be
5eb0: 73 74 20 66 69 74 20 74 65 73 74 20 69 66 20 74 st fit test if t
5ec0: 68 65 79 20 61 72 65 20 61 6c 6c 20 65 69 74 68 hey are all eith
5ed0: 65 72 20 23 66 20 6f 72 20 27 27 0a 09 20 28 64 er #f or ''.. (d
5ee0: 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22 42 45 ebug:print 4 "BE
5ef0: 46 4f 52 45 3a 20 63 61 74 65 67 6f 72 79 3a 20 FORE: category:
5f00: 22 20 63 61 74 65 67 6f 72 79 20 22 20 76 61 72 " category " var
5f10: 69 61 62 6c 65 3a 20 22 20 76 61 72 69 61 62 6c iable: " variabl
5f20: 65 20 22 20 76 61 6c 75 65 3a 20 22 20 76 61 6c e " value: " val
5f30: 75 65 20 0a 09 09 20 20 20 20 20 20 22 2c 20 65 ue ... ", e
5f40: 78 70 65 63 74 65 64 3a 20 22 20 65 78 70 65 63 xpected: " expec
5f50: 74 65 64 20 22 20 74 6f 6c 3a 20 22 20 74 6f 6c ted " tol: " tol
5f60: 20 22 20 75 6e 69 74 73 3a 20 22 20 75 6e 69 74 " units: " unit
5f70: 73 20 22 20 73 74 61 74 75 73 3a 20 22 20 73 74 s " status: " st
5f80: 61 74 75 73 20 22 20 63 6f 6d 6d 65 6e 74 3a 20 atus " comment:
5f90: 22 20 63 6f 6d 6d 65 6e 74 29 0a 0a 09 20 28 69 " comment)... (i
5fa0: 66 20 28 61 6e 64 20 28 6f 72 20 28 6e 6f 74 20 f (and (or (not
5fb0: 65 78 70 65 63 74 65 64 29 28 65 71 75 61 6c 3f expected)(equal?
5fc0: 20 65 78 70 65 63 74 65 64 20 22 22 29 29 0a 09 expected ""))..
5fd0: 09 20 20 28 6f 72 20 28 6e 6f 74 20 74 6f 6c 29 . (or (not tol)
5fe0: 20 20 20 20 20 28 65 71 75 61 6c 3f 20 65 78 70 (equal? exp
5ff0: 65 63 74 65 64 20 22 22 29 29 0a 09 09 20 20 28 ected ""))... (
6000: 6f 72 20 28 6e 6f 74 20 75 6e 69 74 73 29 20 20 or (not units)
6010: 20 28 65 71 75 61 6c 3f 20 65 78 70 65 63 74 65 (equal? expecte
6020: 64 20 22 22 29 29 29 0a 09 20 20 20 20 20 28 6c d ""))).. (l
6030: 65 74 2d 76 61 6c 75 65 73 20 28 28 28 6e 65 77 et-values (((new
6040: 2d 65 78 70 65 63 74 65 64 20 6e 65 77 2d 74 6f -expected new-to
6050: 6c 20 6e 65 77 2d 75 6e 69 74 73 29 28 64 62 3a l new-units)(db:
6060: 67 65 74 2d 70 72 65 76 2d 74 6f 6c 2d 66 6f 72 get-prev-tol-for
6070: 2d 74 65 73 74 20 64 62 20 74 65 73 74 2d 69 64 -test db test-id
6080: 20 63 61 74 65 67 6f 72 79 20 76 61 72 69 61 62 category variab
6090: 6c 65 29 29 29 0a 09 20 20 20 20 20 20 20 28 73 le))).. (s
60a0: 65 74 21 20 65 78 70 65 63 74 65 64 20 6e 65 77 et! expected new
60b0: 2d 65 78 70 65 63 74 65 64 29 0a 09 20 20 20 20 -expected)..
60c0: 20 20 20 28 73 65 74 21 20 74 6f 6c 20 20 20 20 (set! tol
60d0: 20 20 6e 65 77 2d 74 6f 6c 29 0a 09 20 20 20 20 new-tol)..
60e0: 20 20 20 28 73 65 74 21 20 75 6e 69 74 73 20 20 (set! units
60f0: 20 20 6e 65 77 2d 75 6e 69 74 73 29 29 29 0a 0a new-units)))..
6100: 09 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 . (debug:print 4
6110: 20 22 41 46 54 45 52 3a 20 20 63 61 74 65 67 6f "AFTER: catego
6120: 72 79 3a 20 22 20 63 61 74 65 67 6f 72 79 20 22 ry: " category "
6130: 20 76 61 72 69 61 62 6c 65 3a 20 22 20 76 61 72 variable: " var
6140: 69 61 62 6c 65 20 22 20 76 61 6c 75 65 3a 20 22 iable " value: "
6150: 20 76 61 6c 75 65 20 0a 09 09 20 20 20 20 20 20 value ...
6160: 22 2c 20 65 78 70 65 63 74 65 64 3a 20 22 20 65 ", expected: " e
6170: 78 70 65 63 74 65 64 20 22 20 74 6f 6c 3a 20 22 xpected " tol: "
6180: 20 74 6f 6c 20 22 20 75 6e 69 74 73 3a 20 22 20 tol " units: "
6190: 75 6e 69 74 73 20 22 20 73 74 61 74 75 73 3a 20 units " status:
61a0: 22 20 73 74 61 74 75 73 20 22 20 63 6f 6d 6d 65 " status " comme
61b0: 6e 74 3a 20 22 20 63 6f 6d 6d 65 6e 74 29 0a 09 nt: " comment)..
61c0: 20 3b 3b 20 63 61 6c 63 75 6c 61 74 65 20 73 74 ;; calculate st
61d0: 61 74 75 73 20 69 66 20 4e 4f 54 20 73 70 65 63 atus if NOT spec
61e0: 69 66 69 65 64 0a 09 20 28 69 66 20 28 61 6e 64 ified.. (if (and
61f0: 20 28 6e 6f 74 20 73 74 61 74 75 73 29 28 6e 75 (not status)(nu
6200: 6d 62 65 72 3f 20 65 78 70 65 63 74 65 64 29 28 mber? expected)(
6210: 6e 75 6d 62 65 72 3f 20 76 61 6c 75 65 29 29 20 number? value))
6220: 3b 3b 20 6e 65 65 64 20 65 78 70 65 63 74 65 64 ;; need expected
6230: 20 61 6e 64 20 76 61 6c 75 65 20 74 6f 20 62 65 and value to be
6240: 20 6e 75 6d 62 65 72 73 0a 09 20 20 20 20 20 28 numbers.. (
6250: 69 66 20 28 6e 75 6d 62 65 72 3f 20 74 6f 6c 29 if (number? tol)
6260: 20 3b 3b 20 69 66 20 74 6f 6c 20 69 73 20 61 20 ;; if tol is a
6270: 6e 75 6d 62 65 72 20 74 68 65 6e 20 77 65 20 64 number then we d
6280: 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 63 o the standard c
6290: 6f 6d 70 61 72 69 73 6f 6e 0a 09 09 20 28 6c 65 omparison... (le
62a0: 74 2a 20 28 28 6d 61 78 2d 76 61 6c 20 28 2b 20 t* ((max-val (+
62b0: 65 78 70 65 63 74 65 64 20 74 6f 6c 29 29 0a 09 expected tol))..
62c0: 09 09 28 6d 69 6e 2d 76 61 6c 20 28 2d 20 65 78 ..(min-val (- ex
62d0: 70 65 63 74 65 64 20 74 6f 6c 29 29 0a 09 09 09 pected tol))....
62e0: 28 72 65 73 75 6c 74 20 20 28 61 6e 64 20 28 3e (result (and (>
62f0: 3d 20 20 76 61 6c 75 65 20 6d 69 6e 2d 76 61 6c = value min-val
6300: 29 28 3c 3d 20 76 61 6c 75 65 20 6d 61 78 2d 76 )(<= value max-v
6310: 61 6c 29 29 29 29 0a 09 09 20 20 20 28 64 65 62 al))))... (deb
6320: 75 67 3a 70 72 69 6e 74 20 34 20 22 6d 61 78 2d ug:print 4 "max-
6330: 76 61 6c 3a 20 22 20 6d 61 78 2d 76 61 6c 20 22 val: " max-val "
6340: 20 6d 69 6e 2d 76 61 6c 3a 20 22 20 6d 69 6e 2d min-val: " min-
6350: 76 61 6c 20 22 20 72 65 73 75 6c 74 3a 20 22 20 val " result: "
6360: 72 65 73 75 6c 74 29 0a 09 09 20 20 20 28 73 65 result)... (se
6370: 74 21 20 73 74 61 74 75 73 20 28 69 66 20 72 65 t! status (if re
6380: 73 75 6c 74 20 22 70 61 73 73 22 20 22 66 61 69 sult "pass" "fai
6390: 6c 22 29 29 29 0a 09 09 20 28 73 65 74 21 20 73 l")))... (set! s
63a0: 74 61 74 75 73 20 3b 3b 20 4e 42 2f 2f 20 6e 65 tatus ;; NB// ne
63b0: 65 64 20 74 6f 20 61 73 73 65 73 73 20 65 61 63 ed to assess eac
63c0: 68 20 6f 6e 65 20 28 69 2e 65 2e 20 6e 6f 74 20 h one (i.e. not
63d0: 72 65 74 75 72 6e 20 6f 70 65 72 61 74 6f 72 20 return operator
63e0: 73 69 6e 63 65 20 6e 65 65 64 20 74 6f 20 61 63 since need to ac
63f0: 74 20 69 66 20 6e 6f 74 20 76 61 6c 69 64 20 6f t if not valid o
6400: 70 2e 0a 09 09 20 20 20 20 20 20 20 28 63 61 73 p.... (cas
6410: 65 20 28 73 74 72 69 6e 67 2d 3e 73 79 6d 62 6f e (string->symbo
6420: 6c 20 74 6f 6c 29 20 3b 3b 20 74 6f 6c 20 73 68 l tol) ;; tol sh
6430: 6f 75 6c 64 20 62 65 20 3e 2c 20 3c 2c 20 3e 3d ould be >, <, >=
6440: 2c 20 3c 3d 0a 09 09 09 20 28 28 3e 29 20 20 28 , <=.... ((>) (
6450: 69 66 20 28 3e 20 20 76 61 6c 75 65 20 65 78 70 if (> value exp
6460: 65 63 74 65 64 29 20 22 70 61 73 73 22 20 22 66 ected) "pass" "f
6470: 61 69 6c 22 29 29 0a 09 09 09 20 28 28 3c 29 20 ail")).... ((<)
6480: 20 28 69 66 20 28 3c 20 20 76 61 6c 75 65 20 65 (if (< value e
6490: 78 70 65 63 74 65 64 29 20 22 70 61 73 73 22 20 xpected) "pass"
64a0: 22 66 61 69 6c 22 29 29 0a 09 09 09 20 28 28 3e "fail")).... ((>
64b0: 3d 29 20 28 69 66 20 28 3e 3d 20 76 61 6c 75 65 =) (if (>= value
64c0: 20 65 78 70 65 63 74 65 64 29 20 22 70 61 73 73 expected) "pass
64d0: 22 20 22 66 61 69 6c 22 29 29 0a 09 09 09 20 28 " "fail")).... (
64e0: 28 3c 3d 29 20 28 69 66 20 28 3c 3d 20 76 61 6c (<=) (if (<= val
64f0: 75 65 20 65 78 70 65 63 74 65 64 29 20 22 70 61 ue expected) "pa
6500: 73 73 22 20 22 66 61 69 6c 22 29 29 0a 09 09 09 ss" "fail"))....
6510: 20 28 65 6c 73 65 20 28 63 6f 6e 63 20 22 45 52 (else (conc "ER
6520: 52 4f 52 3a 20 62 61 64 20 74 6f 6c 20 63 6f 6d ROR: bad tol com
6530: 70 61 72 61 74 6f 72 20 22 20 74 6f 6c 29 29 29 parator " tol)))
6540: 29 29 29 0a 09 20 28 64 65 62 75 67 3a 70 72 69 ))).. (debug:pri
6550: 6e 74 20 34 20 22 41 46 54 45 52 32 3a 20 63 61 nt 4 "AFTER2: ca
6560: 74 65 67 6f 72 79 3a 20 22 20 63 61 74 65 67 6f tegory: " catego
6570: 72 79 20 22 20 76 61 72 69 61 62 6c 65 3a 20 22 ry " variable: "
6580: 20 76 61 72 69 61 62 6c 65 20 22 20 76 61 6c 75 variable " valu
6590: 65 3a 20 22 20 76 61 6c 75 65 20 0a 09 09 20 20 e: " value ...
65a0: 20 20 20 20 22 2c 20 65 78 70 65 63 74 65 64 3a ", expected:
65b0: 20 22 20 65 78 70 65 63 74 65 64 20 22 20 74 6f " expected " to
65c0: 6c 3a 20 22 20 74 6f 6c 20 22 20 75 6e 69 74 73 l: " tol " units
65d0: 3a 20 22 20 75 6e 69 74 73 20 22 20 73 74 61 74 : " units " stat
65e0: 75 73 3a 20 22 20 73 74 61 74 75 73 20 22 20 63 us: " status " c
65f0: 6f 6d 6d 65 6e 74 3a 20 22 20 63 6f 6d 6d 65 6e omment: " commen
6600: 74 29 0a 09 20 28 73 71 6c 69 74 65 33 3a 65 78 t).. (sqlite3:ex
6610: 65 63 75 74 65 20 64 62 20 22 49 4e 53 45 52 54 ecute db "INSERT
6620: 20 4f 52 20 52 45 50 4c 41 43 45 20 49 4e 54 4f OR REPLACE INTO
6630: 20 74 65 73 74 5f 64 61 74 61 20 28 74 65 73 74 test_data (test
6640: 5f 69 64 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 _id,category,var
6650: 69 61 62 6c 65 2c 76 61 6c 75 65 2c 65 78 70 65 iable,value,expe
6660: 63 74 65 64 2c 74 6f 6c 2c 75 6e 69 74 73 2c 63 cted,tol,units,c
6670: 6f 6d 6d 65 6e 74 2c 73 74 61 74 75 73 29 20 56 omment,status) V
6680: 41 4c 55 45 53 20 28 3f 2c 3f 2c 3f 2c 3f 2c 3f ALUES (?,?,?,?,?
6690: 2c 3f 2c 3f 2c 3f 2c 3f 29 3b 22 0a 09 20 20 20 ,?,?,?,?);"..
66a0: 20 20 20 74 65 73 74 2d 69 64 20 63 61 74 65 67 test-id categ
66b0: 6f 72 79 20 76 61 72 69 61 62 6c 65 20 76 61 6c ory variable val
66c0: 75 65 20 65 78 70 65 63 74 65 64 20 74 6f 6c 20 ue expected tol
66d0: 75 6e 69 74 73 20 28 69 66 20 63 6f 6d 6d 65 6e units (if commen
66e0: 74 20 63 6f 6d 6d 65 6e 74 20 22 22 29 20 73 74 t comment "") st
66f0: 61 74 75 73 29 29 29 0a 20 20 20 20 20 63 73 76 atus))). csv
6700: 6c 69 73 74 29 29 29 0a 0a 3b 3b 20 67 65 74 20 list)))..;; get
6710: 61 20 6c 69 73 74 20 6f 66 20 74 65 73 74 5f 64 a list of test_d
6720: 61 74 61 20 72 65 63 6f 72 64 73 20 6d 61 74 63 ata records matc
6730: 68 69 6e 67 20 63 61 74 65 67 6f 72 79 70 61 74 hing categorypat
6740: 74 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 72 65 t.(define (db:re
6750: 61 64 2d 74 65 73 74 2d 64 61 74 61 20 64 62 20 ad-test-data db
6760: 74 65 73 74 2d 69 64 20 63 61 74 65 67 6f 72 79 test-id category
6770: 70 61 74 74 29 0a 20 20 28 6c 65 74 20 28 28 72 patt). (let ((r
6780: 65 73 20 27 28 29 29 29 0a 20 20 20 20 28 73 71 es '())). (sq
6790: 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 lite3:for-each-r
67a0: 6f 77 20 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 ow . (lambda
67b0: 20 28 69 64 20 74 65 73 74 5f 69 64 20 63 61 74 (id test_id cat
67c0: 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65 20 76 egory variable v
67d0: 61 6c 75 65 20 65 78 70 65 63 74 65 64 20 74 6f alue expected to
67e0: 6c 20 75 6e 69 74 73 20 63 6f 6d 6d 65 6e 74 20 l units comment
67f0: 73 74 61 74 75 73 29 0a 20 20 20 20 20 20 20 28 status). (
6800: 73 65 74 21 20 72 65 73 20 28 63 6f 6e 73 20 28 set! res (cons (
6810: 76 65 63 74 6f 72 20 69 64 20 74 65 73 74 5f 69 vector id test_i
6820: 64 20 63 61 74 65 67 6f 72 79 20 76 61 72 69 61 d category varia
6830: 62 6c 65 20 76 61 6c 75 65 20 65 78 70 65 63 74 ble value expect
6840: 65 64 20 74 6f 6c 20 75 6e 69 74 73 20 63 6f 6d ed tol units com
6850: 6d 65 6e 74 20 73 74 61 74 75 73 29 20 72 65 73 ment status) res
6860: 29 29 29 0a 20 20 20 20 20 64 62 0a 20 20 20 20 ))). db.
6870: 20 22 53 45 4c 45 43 54 20 69 64 2c 74 65 73 74 "SELECT id,test
6880: 5f 69 64 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 _id,category,var
6890: 69 61 62 6c 65 2c 76 61 6c 75 65 2c 65 78 70 65 iable,value,expe
68a0: 63 74 65 64 2c 74 6f 6c 2c 75 6e 69 74 73 2c 63 cted,tol,units,c
68b0: 6f 6d 6d 65 6e 74 2c 73 74 61 74 75 73 20 46 52 omment,status FR
68c0: 4f 4d 20 74 65 73 74 5f 64 61 74 61 20 57 48 45 OM test_data WHE
68d0: 52 45 20 74 65 73 74 5f 69 64 3d 3f 20 41 4e 44 RE test_id=? AND
68e0: 20 63 61 74 65 67 6f 72 79 20 4c 49 4b 45 20 3f category LIKE ?
68f0: 20 4f 52 44 45 52 20 42 59 20 63 61 74 65 67 6f ORDER BY catego
6900: 72 79 2c 76 61 72 69 61 62 6c 65 3b 22 20 74 65 ry,variable;" te
6910: 73 74 2d 69 64 20 63 61 74 65 67 6f 72 79 70 61 st-id categorypa
6920: 74 74 29 0a 20 20 20 20 28 72 65 76 65 72 73 65 tt). (reverse
6930: 20 72 65 73 29 29 29 0a 0a 28 64 65 66 69 6e 65 res)))..(define
6940: 20 28 64 62 3a 6c 6f 61 64 2d 74 65 73 74 2d 64 (db:load-test-d
6950: 61 74 61 20 64 62 20 72 75 6e 2d 69 64 20 74 65 ata db run-id te
6960: 73 74 2d 6e 61 6d 65 20 69 74 65 6d 64 61 74 29 st-name itemdat)
6970: 0a 20 20 28 6c 65 74 2a 20 28 28 69 74 65 6d 2d . (let* ((item-
6980: 70 61 74 68 20 28 69 74 65 6d 2d 6c 69 73 74 2d path (item-list-
6990: 3e 70 61 74 68 20 69 74 65 6d 64 61 74 29 29 0a >path itemdat)).
69a0: 09 20 28 74 65 73 74 64 61 74 20 28 64 62 3a 67 . (testdat (db:g
69b0: 65 74 2d 74 65 73 74 2d 69 6e 66 6f 20 64 62 20 et-test-info db
69c0: 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 run-id test-name
69d0: 20 69 74 65 6d 2d 70 61 74 68 29 29 0a 09 20 28 item-path)).. (
69e0: 74 65 73 74 2d 69 64 20 28 69 66 20 74 65 73 74 test-id (if test
69f0: 64 61 74 20 28 64 62 3a 74 65 73 74 2d 67 65 74 dat (db:test-get
6a00: 2d 69 64 20 74 65 73 74 64 61 74 29 20 23 66 29 -id testdat) #f)
6a10: 29 29 0a 20 20 20 20 3b 3b 20 28 64 65 62 75 67 )). ;; (debug
6a20: 3a 70 72 69 6e 74 20 31 20 22 45 6e 74 65 72 20 :print 1 "Enter
6a30: 72 65 63 6f 72 64 73 20 74 6f 20 69 6e 73 65 72 records to inser
6a40: 74 20 69 6e 20 74 68 65 20 74 65 73 74 5f 64 61 t in the test_da
6a50: 74 61 20 74 61 62 6c 65 2c 20 73 65 76 65 6e 20 ta table, seven
6a60: 66 69 65 6c 64 73 2c 20 63 6f 6d 6d 61 20 73 65 fields, comma se
6a70: 70 61 72 61 74 65 64 20 70 65 72 20 6c 69 6e 65 parated per line
6a80: 22 29 0a 20 20 20 20 28 64 65 62 75 67 3a 70 72 "). (debug:pr
6a90: 69 6e 74 20 34 20 22 69 74 65 6d 64 61 74 3a 20 int 4 "itemdat:
6aa0: 22 20 69 74 65 6d 64 61 74 20 22 2c 20 74 65 73 " itemdat ", tes
6ab0: 74 2d 6e 61 6d 65 3a 20 22 20 74 65 73 74 2d 6e t-name: " test-n
6ac0: 61 6d 65 20 22 2c 20 74 65 73 74 2d 69 64 3a 20 ame ", test-id:
6ad0: 22 20 74 65 73 74 2d 69 64 29 0a 20 20 20 20 28 " test-id). (
6ae0: 69 66 20 74 65 73 74 2d 69 64 0a 09 28 6c 65 74 if test-id..(let
6af0: 20 6c 6f 6f 70 20 28 28 6c 69 6e 20 28 72 65 61 loop ((lin (rea
6b00: 64 2d 6c 69 6e 65 29 29 29 0a 09 20 20 28 69 66 d-line))).. (if
6b10: 20 28 6e 6f 74 20 28 65 6f 66 2d 6f 62 6a 65 63 (not (eof-objec
6b20: 74 3f 20 6c 69 6e 29 29 0a 09 20 20 20 20 20 20 t? lin))..
6b30: 28 62 65 67 69 6e 0a 09 09 28 64 65 62 75 67 3a (begin...(debug:
6b40: 70 72 69 6e 74 20 34 20 6c 69 6e 29 0a 09 09 28 print 4 lin)...(
6b50: 64 62 3a 63 73 76 2d 3e 74 65 73 74 2d 64 61 74 db:csv->test-dat
6b60: 61 20 64 62 20 74 65 73 74 2d 69 64 20 6c 69 6e a db test-id lin
6b70: 29 0a 09 09 28 6c 6f 6f 70 20 28 72 65 61 64 2d )...(loop (read-
6b80: 6c 69 6e 65 29 29 29 29 29 29 0a 20 20 20 20 3b line)))))). ;
6b90: 3b 20 72 6f 6c 6c 20 75 70 20 74 68 65 20 63 75 ; roll up the cu
6ba0: 72 72 65 6e 74 20 72 65 73 75 6c 74 73 2e 0a 20 rrent results..
6bb0: 20 20 20 28 64 62 3a 74 65 73 74 2d 64 61 74 61 (db:test-data
6bc0: 2d 72 6f 6c 6c 75 70 20 64 62 20 74 65 73 74 2d -rollup db test-
6bd0: 69 64 29 29 29 0a 20 20 0a 3b 3b 20 57 41 52 4e id))). .;; WARN
6be0: 49 4e 47 3a 20 44 6f 20 4e 4f 54 20 63 61 6c 6c ING: Do NOT call
6bf0: 20 74 68 69 73 20 66 6f 72 20 74 68 65 20 70 61 this for the pa
6c00: 72 65 6e 74 20 74 65 73 74 20 6f 6e 20 61 6e 20 rent test on an
6c10: 69 74 65 72 61 74 65 64 20 74 65 73 74 0a 3b 3b iterated test.;;
6c20: 20 52 6f 6c 6c 20 75 70 20 74 65 73 74 5f 64 61 Roll up test_da
6c30: 74 61 20 70 61 73 73 2f 66 61 69 6c 20 72 65 73 ta pass/fail res
6c40: 75 6c 74 73 0a 3b 3b 20 6c 6f 6f 6b 20 61 74 20 ults.;; look at
6c50: 74 68 65 20 74 65 73 74 5f 64 61 74 61 20 73 74 the test_data st
6c60: 61 74 75 73 20 66 69 65 6c 64 2c 20 0a 3b 3b 20 atus field, .;;
6c70: 20 20 20 69 66 20 61 6c 6c 20 61 72 65 20 70 61 if all are pa
6c80: 73 73 20 28 61 6e 79 20 63 61 73 65 29 20 61 6e ss (any case) an
6c90: 64 20 74 68 65 20 74 65 73 74 20 73 74 61 74 75 d the test statu
6ca0: 73 20 69 73 20 50 41 53 53 20 6f 72 20 4e 55 4c s is PASS or NUL
6cb0: 4c 20 6f 72 20 27 27 20 74 68 65 6e 20 73 65 74 L or '' then set
6cc0: 20 74 65 73 74 20 73 74 61 74 75 73 20 74 6f 20 test status to
6cd0: 50 41 53 53 2e 0a 3b 3b 20 20 20 20 69 66 20 6f PASS..;; if o
6ce0: 6e 65 20 6f 72 20 6d 6f 72 65 20 61 72 65 20 66 ne or more are f
6cf0: 61 69 6c 20 28 61 6e 79 20 63 61 73 65 29 20 74 ail (any case) t
6d00: 68 65 6e 20 73 65 74 20 74 65 73 74 20 73 74 61 hen set test sta
6d10: 74 75 73 20 74 6f 20 50 41 53 53 2c 20 6e 6f 6e tus to PASS, non
6d20: 20 22 70 61 73 73 22 20 6f 72 20 22 66 61 69 6c "pass" or "fail
6d30: 22 20 61 72 65 20 69 67 6e 6f 72 65 64 0a 28 64 " are ignored.(d
6d40: 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74 2d 64 efine (db:test-d
6d50: 61 74 61 2d 72 6f 6c 6c 75 70 20 64 62 20 74 65 ata-rollup db te
6d60: 73 74 2d 69 64 29 0a 20 20 28 73 71 6c 69 74 65 st-id). (sqlite
6d70: 33 3a 65 78 65 63 75 74 65 20 0a 20 20 20 64 62 3:execute . db
6d80: 20 0a 20 20 20 22 55 50 44 41 54 45 20 74 65 73 . "UPDATE tes
6d90: 74 73 20 0a 20 20 20 20 20 20 53 45 54 20 66 61 ts . SET fa
6da0: 69 6c 5f 63 6f 75 6e 74 3d 28 53 45 4c 45 43 54 il_count=(SELECT
6db0: 20 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 count(id) FROM
6dc0: 74 65 73 74 5f 64 61 74 61 20 57 48 45 52 45 20 test_data WHERE
6dd0: 74 65 73 74 5f 69 64 3d 3f 20 41 4e 44 20 73 74 test_id=? AND st
6de0: 61 74 75 73 20 6c 69 6b 65 20 27 66 61 69 6c 27 atus like 'fail'
6df0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 70 61 73 ),. pas
6e00: 73 5f 63 6f 75 6e 74 3d 28 53 45 4c 45 43 54 20 s_count=(SELECT
6e10: 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 74 count(id) FROM t
6e20: 65 73 74 5f 64 61 74 61 20 57 48 45 52 45 20 74 est_data WHERE t
6e30: 65 73 74 5f 69 64 3d 3f 20 41 4e 44 20 73 74 61 est_id=? AND sta
6e40: 74 75 73 20 6c 69 6b 65 20 27 70 61 73 73 27 29 tus like 'pass')
6e50: 0a 20 20 20 20 20 20 57 48 45 52 45 20 69 64 3d . WHERE id=
6e60: 3f 3b 22 0a 20 20 20 74 65 73 74 2d 69 64 20 74 ?;". test-id t
6e70: 65 73 74 2d 69 64 20 74 65 73 74 2d 69 64 29 0a est-id test-id).
6e80: 20 20 3b 3b 20 69 66 20 74 68 65 20 74 65 73 74 ;; if the test
6e90: 20 69 73 20 6e 6f 74 20 46 41 49 4c 20 74 68 65 is not FAIL the
6ea0: 6e 20 73 65 74 20 73 74 61 74 75 73 20 62 61 73 n set status bas
6eb0: 65 64 20 6f 6e 20 74 68 65 20 66 61 69 6c 20 61 ed on the fail a
6ec0: 6e 64 20 70 61 73 73 20 63 6f 75 6e 74 73 2e 0a nd pass counts..
6ed0: 20 20 28 74 68 72 65 61 64 2d 73 6c 65 65 70 21 (thread-sleep!
6ee0: 20 31 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 1). (sqlite3:e
6ef0: 78 65 63 75 74 65 0a 20 20 20 64 62 0a 20 20 20 xecute. db.
6f00: 22 55 50 44 41 54 45 20 74 65 73 74 73 0a 20 20 "UPDATE tests.
6f10: 20 20 20 20 53 45 54 20 73 74 61 74 75 73 3d 43 SET status=C
6f20: 41 53 45 20 57 48 45 4e 20 28 53 45 4c 45 43 54 ASE WHEN (SELECT
6f30: 20 66 61 69 6c 5f 63 6f 75 6e 74 20 46 52 4f 4d fail_count FROM
6f40: 20 74 65 73 74 73 20 57 48 45 52 45 20 69 64 3d tests WHERE id=
6f50: 3f 29 20 3e 20 30 20 0a 20 20 20 20 20 20 20 20 ?) > 0 .
6f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6f70: 20 54 48 45 4e 20 27 46 41 49 4c 27 0a 20 20 20 THEN 'FAIL'.
6f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6f90: 20 20 20 57 48 45 4e 20 28 53 45 4c 45 43 54 20 WHEN (SELECT
6fa0: 70 61 73 73 5f 63 6f 75 6e 74 20 46 52 4f 4d 20 pass_count FROM
6fb0: 74 65 73 74 73 20 57 48 45 52 45 20 69 64 3d 3f tests WHERE id=?
6fc0: 29 20 3e 20 30 0a 20 20 20 20 20 20 20 20 20 20 ) > 0.
6fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 T
6fe0: 48 45 4e 20 27 50 41 53 53 27 0a 20 20 20 20 20 HEN 'PASS'.
6ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7000: 20 45 4c 53 45 20 73 74 61 74 75 73 0a 20 20 20 ELSE status.
7010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 E
7020: 4e 44 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 0a ND WHERE id=?;".
7030: 20 20 20 74 65 73 74 2d 69 64 20 74 65 73 74 2d test-id test-
7040: 69 64 20 74 65 73 74 2d 69 64 29 29 0a 0a 28 64 id test-id))..(d
7050: 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 70 72 efine (db:get-pr
7060: 65 76 2d 74 6f 6c 2d 66 6f 72 2d 74 65 73 74 20 ev-tol-for-test
7070: 64 62 20 74 65 73 74 2d 69 64 20 63 61 74 65 67 db test-id categ
7080: 6f 72 79 20 76 61 72 69 61 62 6c 65 29 0a 20 20 ory variable).
7090: 3b 3b 20 46 69 6e 69 73 68 20 6d 65 3f 0a 20 20 ;; Finish me?.
70a0: 28 76 61 6c 75 65 73 20 23 66 20 23 66 20 23 66 (values #f #f #f
70b0: 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ))..;;==========
70c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
70d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
70e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
70f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 ============.;;
7100: 53 20 54 20 45 20 50 20 53 20 0a 3b 3b 3d 3d 3d S T E P S .;;===
7110: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7120: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7130: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7140: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7150: 3d 3d 3d 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 ===..(define (db
7160: 3a 73 74 65 70 2d 67 65 74 2d 74 69 6d 65 2d 61 :step-get-time-a
7170: 73 2d 73 74 72 69 6e 67 20 76 65 63 29 0a 20 20 s-string vec).
7180: 20 20 28 73 65 63 6f 6e 64 73 2d 3e 74 69 6d 65 (seconds->time
7190: 2d 73 74 72 69 6e 67 20 28 64 62 3a 73 74 65 70 -string (db:step
71a0: 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 -get-event_time
71b0: 76 65 63 29 29 29 0a 0a 3b 3b 20 64 62 2d 67 65 vec)))..;; db-ge
71c0: 74 2d 74 65 73 74 2d 73 74 65 70 73 2d 66 6f 72 t-test-steps-for
71d0: 2d 72 75 6e 0a 28 64 65 66 69 6e 65 20 28 64 62 -run.(define (db
71e0: 3a 67 65 74 2d 73 74 65 70 73 2d 66 6f 72 2d 74 :get-steps-for-t
71f0: 65 73 74 20 64 62 20 74 65 73 74 2d 69 64 29 0a est db test-id).
7200: 20 20 28 6c 65 74 20 28 28 72 65 73 20 27 28 29 (let ((res '()
7210: 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a )). (sqlite3:
7220: 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20 for-each-row .
7230: 20 20 20 28 6c 61 6d 62 64 61 20 28 69 64 20 74 (lambda (id t
7240: 65 73 74 2d 69 64 20 73 74 65 70 6e 61 6d 65 20 est-id stepname
7250: 73 74 61 74 65 20 73 74 61 74 75 73 20 65 76 65 state status eve
7260: 6e 74 2d 74 69 6d 65 20 6c 6f 67 66 69 6c 65 29 nt-time logfile)
7270: 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72 65 . (set! re
7280: 73 20 28 63 6f 6e 73 20 28 76 65 63 74 6f 72 20 s (cons (vector
7290: 69 64 20 74 65 73 74 2d 69 64 20 73 74 65 70 6e id test-id stepn
72a0: 61 6d 65 20 73 74 61 74 65 20 73 74 61 74 75 73 ame state status
72b0: 20 65 76 65 6e 74 2d 74 69 6d 65 20 28 69 66 20 event-time (if
72c0: 28 73 74 72 69 6e 67 3f 20 6c 6f 67 66 69 6c 65 (string? logfile
72d0: 29 20 6c 6f 67 66 69 6c 65 20 22 22 29 29 20 72 ) logfile "")) r
72e0: 65 73 29 29 29 0a 20 20 20 20 20 64 62 0a 20 20 es))). db.
72f0: 20 20 20 22 53 45 4c 45 43 54 20 69 64 2c 74 65 "SELECT id,te
7300: 73 74 5f 69 64 2c 73 74 65 70 6e 61 6d 65 2c 73 st_id,stepname,s
7310: 74 61 74 65 2c 73 74 61 74 75 73 2c 65 76 65 6e tate,status,even
7320: 74 5f 74 69 6d 65 2c 6c 6f 67 66 69 6c 65 20 46 t_time,logfile F
7330: 52 4f 4d 20 74 65 73 74 5f 73 74 65 70 73 20 57 ROM test_steps W
7340: 48 45 52 45 20 74 65 73 74 5f 69 64 3d 3f 20 4f HERE test_id=? O
7350: 52 44 45 52 20 42 59 20 69 64 20 41 53 43 3b 22 RDER BY id ASC;"
7360: 20 3b 3b 20 65 76 65 6e 74 5f 74 69 6d 65 20 44 ;; event_time D
7370: 45 53 43 2c 69 64 20 41 53 43 3b 0a 20 20 20 20 ESC,id ASC;.
7380: 20 74 65 73 74 2d 69 64 29 0a 20 20 20 20 28 72 test-id). (r
7390: 65 76 65 72 73 65 20 72 65 73 29 29 29 0a 0a 3b everse res)))..;
73a0: 3b 20 67 65 74 20 61 20 70 72 65 74 74 79 20 74 ; get a pretty t
73b0: 61 62 6c 65 20 74 6f 20 73 75 6d 6d 61 72 69 7a able to summariz
73c0: 65 20 73 74 65 70 73 0a 3b 3b 0a 28 64 65 66 69 e steps.;;.(defi
73d0: 6e 65 20 28 64 62 3a 67 65 74 2d 73 74 65 70 73 ne (db:get-steps
73e0: 2d 74 61 62 6c 65 20 64 62 20 74 65 73 74 2d 69 -table db test-i
73f0: 64 29 0a 20 20 28 6c 65 74 20 28 28 73 74 65 70 d). (let ((step
7400: 73 20 20 20 28 64 62 3a 67 65 74 2d 73 74 65 70 s (db:get-step
7410: 73 2d 66 6f 72 2d 74 65 73 74 20 64 62 20 74 65 s-for-test db te
7420: 73 74 2d 69 64 29 29 29 0a 20 20 20 20 3b 3b 20 st-id))). ;;
7430: 6f 72 67 61 6e 69 73 65 20 74 68 65 20 73 74 65 organise the ste
7440: 70 73 20 66 6f 72 20 62 65 74 74 65 72 20 72 65 ps for better re
7450: 61 64 61 62 69 6c 69 74 79 0a 20 20 20 20 28 6c adability. (l
7460: 65 74 20 28 28 72 65 73 20 28 6d 61 6b 65 2d 68 et ((res (make-h
7470: 61 73 68 2d 74 61 62 6c 65 29 29 29 0a 20 20 20 ash-table))).
7480: 20 20 20 28 66 6f 72 2d 65 61 63 68 20 0a 20 20 (for-each .
7490: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 73 74 (lambda (st
74a0: 65 70 29 0a 09 20 28 64 65 62 75 67 3a 70 72 69 ep).. (debug:pri
74b0: 6e 74 20 36 20 22 73 74 65 70 3d 22 20 73 74 65 nt 6 "step=" ste
74c0: 70 29 0a 09 20 28 6c 65 74 20 28 28 72 65 63 6f p).. (let ((reco
74d0: 72 64 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 72 rd (hash-table-r
74e0: 65 66 2f 64 65 66 61 75 6c 74 20 0a 09 09 09 72 ef/default ....r
74f0: 65 73 20 0a 09 09 09 28 64 62 3a 73 74 65 70 2d es ....(db:step-
7500: 67 65 74 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 get-stepname ste
7510: 70 29 20 0a 09 09 09 3b 3b 20 20 20 20 20 20 20 p) ....;;
7520: 20 73 74 65 70 6e 61 6d 65 20 20 20 20 20 20 20 stepname
7530: 20 20 20 20 20 20 20 20 20 73 74 61 72 74 20 65 start e
7540: 6e 64 20 73 74 61 74 75 73 20 20 20 20 0a 09 09 nd status ...
7550: 09 28 76 65 63 74 6f 72 20 28 64 62 3a 73 74 65 .(vector (db:ste
7560: 70 2d 67 65 74 2d 73 74 65 70 6e 61 6d 65 20 73 p-get-stepname s
7570: 74 65 70 29 20 22 22 20 20 20 22 22 20 22 22 20 tep) "" "" ""
7580: 20 20 20 20 22 22 20 22 22 29 29 29 29 0a 09 20 "" ""))))..
7590: 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 36 (debug:print 6
75a0: 20 22 72 65 63 6f 72 64 28 62 65 66 6f 72 65 29 "record(before)
75b0: 20 3d 20 22 20 72 65 63 6f 72 64 20 0a 09 09 09 = " record ....
75c0: 22 5c 6e 69 64 3a 20 20 20 20 20 20 20 22 20 28 "\nid: " (
75d0: 64 62 3a 73 74 65 70 2d 67 65 74 2d 69 64 20 73 db:step-get-id s
75e0: 74 65 70 29 0a 09 09 09 22 5c 6e 73 74 65 70 6e tep)...."\nstepn
75f0: 61 6d 65 3a 20 22 20 28 64 62 3a 73 74 65 70 2d ame: " (db:step-
7600: 67 65 74 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 get-stepname ste
7610: 70 29 0a 09 09 09 22 5c 6e 73 74 61 74 65 3a 20 p)...."\nstate:
7620: 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65 " (db:step-ge
7630: 74 2d 73 74 61 74 65 20 73 74 65 70 29 0a 09 09 t-state step)...
7640: 09 22 5c 6e 73 74 61 74 75 73 3a 20 20 20 22 20 ."\nstatus: "
7650: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 (db:step-get-sta
7660: 74 75 73 20 73 74 65 70 29 0a 09 09 09 22 5c 6e tus step)...."\n
7670: 74 69 6d 65 3a 20 20 20 20 20 22 20 28 64 62 3a time: " (db:
7680: 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 step-get-event_t
7690: 69 6d 65 20 73 74 65 70 29 29 0a 09 20 20 20 28 ime step)).. (
76a0: 63 61 73 65 20 28 73 74 72 69 6e 67 2d 3e 73 79 case (string->sy
76b0: 6d 62 6f 6c 20 28 64 62 3a 73 74 65 70 2d 67 65 mbol (db:step-ge
76c0: 74 2d 73 74 61 74 65 20 73 74 65 70 29 29 0a 09 t-state step))..
76d0: 20 20 20 20 20 28 28 73 74 61 72 74 29 28 76 65 ((start)(ve
76e0: 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64 ctor-set! record
76f0: 20 31 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 1 (db:step-get-
7700: 65 76 65 6e 74 5f 74 69 6d 65 20 73 74 65 70 29 event_time step)
7710: 29 0a 09 20 20 20 20 20 20 28 76 65 63 74 6f 72 ).. (vector
7720: 2d 73 65 74 21 20 72 65 63 6f 72 64 20 33 20 28 -set! record 3 (
7730: 69 66 20 28 65 71 75 61 6c 3f 20 28 76 65 63 74 if (equal? (vect
7740: 6f 72 2d 72 65 66 20 72 65 63 6f 72 64 20 33 29 or-ref record 3)
7750: 20 22 22 29 0a 09 09 09 09 09 28 64 62 3a 73 74 "")......(db:st
7760: 65 70 2d 67 65 74 2d 73 74 61 74 75 73 20 73 74 ep-get-status st
7770: 65 70 29 29 29 0a 09 20 20 20 20 20 20 28 69 66 ep))).. (if
7780: 20 28 3e 20 28 73 74 72 69 6e 67 2d 6c 65 6e 67 (> (string-leng
7790: 74 68 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d th (db:step-get-
77a0: 6c 6f 67 66 69 6c 65 20 73 74 65 70 29 29 0a 09 logfile step))..
77b0: 09 20 20 20 20 20 30 29 0a 09 09 20 20 28 76 65 . 0)... (ve
77c0: 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64 ctor-set! record
77d0: 20 35 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 5 (db:step-get-
77e0: 6c 6f 67 66 69 6c 65 20 73 74 65 70 29 29 29 29 logfile step))))
77f0: 0a 09 20 20 20 20 20 28 28 65 6e 64 29 20 20 0a .. ((end) .
7800: 09 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73 . (vector-s
7810: 65 74 21 20 72 65 63 6f 72 64 20 32 20 28 61 6e et! record 2 (an
7820: 79 2d 3e 6e 75 6d 62 65 72 20 28 64 62 3a 73 74 y->number (db:st
7830: 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d ep-get-event_tim
7840: 65 20 73 74 65 70 29 29 29 0a 09 20 20 20 20 20 e step)))..
7850: 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72 65 (vector-set! re
7860: 63 6f 72 64 20 33 20 28 64 62 3a 73 74 65 70 2d cord 3 (db:step-
7870: 67 65 74 2d 73 74 61 74 75 73 20 73 74 65 70 29 get-status step)
7880: 29 0a 09 20 20 20 20 20 20 28 76 65 63 74 6f 72 ).. (vector
7890: 2d 73 65 74 21 20 72 65 63 6f 72 64 20 34 20 28 -set! record 4 (
78a0: 6c 65 74 20 28 28 73 74 61 72 74 74 20 28 61 6e let ((startt (an
78b0: 79 2d 3e 6e 75 6d 62 65 72 20 28 76 65 63 74 6f y->number (vecto
78c0: 72 2d 72 65 66 20 72 65 63 6f 72 64 20 31 29 29 r-ref record 1))
78d0: 29 0a 09 09 09 09 09 20 20 28 65 6e 64 74 20 20 )...... (endt
78e0: 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 20 28 76 (any->number (v
78f0: 65 63 74 6f 72 2d 72 65 66 20 72 65 63 6f 72 64 ector-ref record
7900: 20 32 29 29 29 29 0a 09 09 09 09 20 20 20 20 20 2)))).....
7910: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20 (debug:print 4
7920: 22 72 65 63 6f 72 64 5b 31 5d 3d 22 20 28 76 65 "record[1]=" (ve
7930: 63 74 6f 72 2d 72 65 66 20 72 65 63 6f 72 64 20 ctor-ref record
7940: 31 29 20 0a 09 09 09 09 09 09 20 20 20 22 2c 20 1) ....... ",
7950: 73 74 61 72 74 74 3d 22 20 73 74 61 72 74 74 20 startt=" startt
7960: 22 2c 20 65 6e 64 74 3d 22 20 65 6e 64 74 0a 09 ", endt=" endt..
7970: 09 09 09 09 09 20 20 20 22 2c 20 67 65 74 2d 73 ..... ", get-s
7980: 74 61 74 75 73 3a 20 22 20 28 64 62 3a 73 74 65 tatus: " (db:ste
7990: 70 2d 67 65 74 2d 73 74 61 74 75 73 20 73 74 65 p-get-status ste
79a0: 70 29 29 0a 09 09 09 09 20 20 20 20 20 20 28 69 p))..... (i
79b0: 66 20 28 61 6e 64 20 28 6e 75 6d 62 65 72 3f 20 f (and (number?
79c0: 73 74 61 72 74 74 29 28 6e 75 6d 62 65 72 3f 20 startt)(number?
79d0: 65 6e 64 74 29 29 0a 09 09 09 09 09 20 20 28 73 endt))...... (s
79e0: 65 63 6f 6e 64 73 2d 3e 68 72 2d 6d 69 6e 2d 73 econds->hr-min-s
79f0: 65 63 20 28 2d 20 65 6e 64 74 20 73 74 61 72 74 ec (- endt start
7a00: 74 29 29 20 22 2d 31 22 29 29 29 0a 09 20 20 20 t)) "-1")))..
7a10: 20 20 20 28 69 66 20 28 3e 20 28 73 74 72 69 6e (if (> (strin
7a20: 67 2d 6c 65 6e 67 74 68 20 28 64 62 3a 73 74 65 g-length (db:ste
7a30: 70 2d 67 65 74 2d 6c 6f 67 66 69 6c 65 20 73 74 p-get-logfile st
7a40: 65 70 29 29 0a 09 09 20 20 20 20 20 30 29 0a 09 ep))... 0)..
7a50: 09 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 . (vector-set!
7a60: 72 65 63 6f 72 64 20 35 20 28 64 62 3a 73 74 65 record 5 (db:ste
7a70: 70 2d 67 65 74 2d 6c 6f 67 66 69 6c 65 20 73 74 p-get-logfile st
7a80: 65 70 29 29 29 29 0a 09 20 20 20 20 20 28 65 6c ep)))).. (el
7a90: 73 65 0a 09 20 20 20 20 20 20 20 20 28 76 65 63 se.. (vec
7aa0: 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 tor-set! record
7ab0: 32 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 2 (db:step-get-s
7ac0: 74 61 74 65 20 73 74 65 70 29 29 0a 09 20 20 20 tate step))..
7ad0: 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 (vector-set
7ae0: 21 20 72 65 63 6f 72 64 20 33 20 28 64 62 3a 73 ! record 3 (db:s
7af0: 74 65 70 2d 67 65 74 2d 73 74 61 74 75 73 20 73 tep-get-status s
7b00: 74 65 70 29 29 0a 09 20 20 20 20 20 20 20 20 28 tep)).. (
7b10: 76 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f vector-set! reco
7b20: 72 64 20 34 20 28 64 62 3a 73 74 65 70 2d 67 65 rd 4 (db:step-ge
7b30: 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73 74 65 t-event_time ste
7b40: 70 29 29 29 29 0a 09 20 20 20 28 68 61 73 68 2d p)))).. (hash-
7b50: 74 61 62 6c 65 2d 73 65 74 21 20 72 65 73 20 28 table-set! res (
7b60: 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 65 70 db:step-get-step
7b70: 6e 61 6d 65 20 73 74 65 70 29 20 72 65 63 6f 72 name step) recor
7b80: 64 29 0a 09 20 20 20 28 64 65 62 75 67 3a 70 72 d).. (debug:pr
7b90: 69 6e 74 20 36 20 22 72 65 63 6f 72 64 28 61 66 int 6 "record(af
7ba0: 74 65 72 29 20 20 3d 20 22 20 72 65 63 6f 72 64 ter) = " record
7bb0: 20 0a 09 09 09 22 5c 6e 69 64 3a 20 20 20 20 20 ...."\nid:
7bc0: 20 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 " (db:step-get
7bd0: 2d 69 64 20 73 74 65 70 29 0a 09 09 09 22 5c 6e -id step)...."\n
7be0: 73 74 65 70 6e 61 6d 65 3a 20 22 20 28 64 62 3a stepname: " (db:
7bf0: 73 74 65 70 2d 67 65 74 2d 73 74 65 70 6e 61 6d step-get-stepnam
7c00: 65 20 73 74 65 70 29 0a 09 09 09 22 5c 6e 73 74 e step)...."\nst
7c10: 61 74 65 3a 20 20 20 20 22 20 28 64 62 3a 73 74 ate: " (db:st
7c20: 65 70 2d 67 65 74 2d 73 74 61 74 65 20 73 74 65 ep-get-state ste
7c30: 70 29 0a 09 09 09 22 5c 6e 73 74 61 74 75 73 3a p)...."\nstatus:
7c40: 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65 " (db:step-ge
7c50: 74 2d 73 74 61 74 75 73 20 73 74 65 70 29 0a 09 t-status step)..
7c60: 09 09 22 5c 6e 74 69 6d 65 3a 20 20 20 20 20 22 .."\ntime: "
7c70: 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 (db:step-get-ev
7c80: 65 6e 74 5f 74 69 6d 65 20 73 74 65 70 29 29 29 ent_time step)))
7c90: 29 0a 20 20 20 20 20 20 20 3b 3b 20 28 65 6c 73 ). ;; (els
7ca0: 65 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 e (vector-set!
7cb0: 20 72 65 63 6f 72 64 20 31 20 28 64 62 3a 73 74 record 1 (db:st
7cc0: 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d ep-get-event_tim
7cd0: 65 20 73 74 65 70 29 29 29 0a 20 20 20 20 20 20 e step))).
7ce0: 20 28 73 6f 72 74 20 73 74 65 70 73 20 28 6c 61 (sort steps (la
7cf0: 6d 62 64 61 20 28 61 20 62 29 28 3c 20 28 64 62 mbda (a b)(< (db
7d00: 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f :step-get-event_
7d10: 74 69 6d 65 20 61 29 28 64 62 3a 73 74 65 70 2d time a)(db:step-
7d20: 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 62 get-event_time b
7d30: 29 29 29 29 29 0a 20 20 20 20 20 20 72 65 73 29 ))))). res)
7d40: 29 29 0a 0a 3b 3b 20 55 53 45 3a 20 28 6c 73 65 ))..;; USE: (lse
7d50: 74 2d 64 69 66 66 65 72 65 6e 63 65 20 73 74 72 t-difference str
7d60: 69 6e 67 3d 3f 20 27 28 22 61 22 20 22 62 22 20 ing=? '("a" "b"
7d70: 22 63 22 29 20 27 28 22 64 22 20 22 63 22 20 22 "c") '("d" "c" "
7d80: 65 22 20 22 61 22 29 29 0a 3b 3b 0a 3b 3b 20 52 e" "a")).;;.;; R
7d90: 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 eturn a list of
7da0: 70 72 65 72 65 71 73 20 74 68 61 74 20 77 65 72 prereqs that wer
7db0: 65 20 4e 4f 54 20 6d 65 74 0a 3b 3b 20 20 54 65 e NOT met.;; Te
7dc0: 73 74 73 20 28 61 6e 64 20 61 6c 6c 20 69 74 65 sts (and all ite
7dd0: 6d 73 29 20 69 6e 20 77 61 69 74 6f 6e 20 6c 69 ms) in waiton li
7de0: 73 74 20 6d 75 73 74 20 62 65 20 22 43 4f 4d 50 st must be "COMP
7df0: 4c 45 54 45 44 22 20 61 6e 64 20 22 50 41 53 53 LETED" and "PASS
7e00: 22 0a 28 64 65 66 69 6e 65 20 28 64 62 2d 67 65 ".(define (db-ge
7e10: 74 2d 70 72 65 72 65 71 73 2d 6e 6f 74 2d 6d 65 t-prereqs-not-me
7e20: 74 20 64 62 20 72 75 6e 2d 69 64 20 77 61 69 74 t db run-id wait
7e30: 6f 6e 29 0a 20 20 28 69 66 20 28 6e 75 6c 6c 3f on). (if (null?
7e40: 20 77 61 69 74 6f 6e 29 0a 20 20 20 20 20 20 27 waiton). '
7e50: 28 29 0a 20 20 20 20 20 20 28 6c 65 74 2a 20 28 (). (let* (
7e60: 28 75 6e 6d 65 74 2d 70 72 65 2d 72 65 71 73 20 (unmet-pre-reqs
7e70: 27 28 29 29 0a 09 20 20 20 20 20 28 74 65 73 74 '()).. (test
7e80: 73 20 20 20 20 20 20 20 20 20 20 20 28 64 62 2d s (db-
7e90: 67 65 74 2d 74 65 73 74 73 2d 66 6f 72 2d 72 75 get-tests-for-ru
7ea0: 6e 20 64 62 20 72 75 6e 2d 69 64 20 23 66 20 23 n db run-id #f #
7eb0: 66 20 27 28 29 20 27 28 29 29 29 0a 09 20 20 20 f '() '()))..
7ec0: 20 20 28 72 65 73 75 6c 74 20 20 20 20 20 20 20 (result
7ed0: 20 20 27 28 29 29 29 0a 09 28 66 6f 72 2d 65 61 '()))..(for-ea
7ee0: 63 68 20 28 6c 61 6d 62 64 61 20 28 77 61 69 74 ch (lambda (wait
7ef0: 6f 6e 74 65 73 74 2d 6e 61 6d 65 29 0a 09 09 20 ontest-name)...
7f00: 20 20 20 28 6c 65 74 20 28 28 65 76 65 72 2d 73 (let ((ever-s
7f10: 65 65 6e 20 23 66 29 29 0a 09 09 20 20 20 20 20 een #f))...
7f20: 20 28 66 6f 72 2d 65 61 63 68 20 28 6c 61 6d 62 (for-each (lamb
7f30: 64 61 20 28 74 65 73 74 29 0a 09 09 09 09 20 20 da (test).....
7f40: 28 69 66 20 28 65 71 75 61 6c 3f 20 77 61 69 74 (if (equal? wait
7f50: 6f 6e 74 65 73 74 2d 6e 61 6d 65 20 28 64 62 3a ontest-name (db:
7f60: 74 65 73 74 2d 67 65 74 2d 74 65 73 74 6e 61 6d test-get-testnam
7f70: 65 20 74 65 73 74 29 29 0a 09 09 09 09 20 20 20 e test)).....
7f80: 20 20 20 28 62 65 67 69 6e 0a 09 09 09 09 09 28 (begin......(
7f90: 73 65 74 21 20 65 76 65 72 2d 73 65 65 6e 20 23 set! ever-seen #
7fa0: 74 29 0a 09 09 09 09 09 28 69 66 20 28 6e 6f 74 t)......(if (not
7fb0: 20 28 61 6e 64 20 28 65 71 75 61 6c 3f 20 28 64 (and (equal? (d
7fc0: 62 3a 74 65 73 74 2d 67 65 74 2d 73 74 61 74 65 b:test-get-state
7fd0: 20 74 65 73 74 29 20 22 43 4f 4d 50 4c 45 54 45 test) "COMPLETE
7fe0: 44 22 29 0a 09 09 09 09 09 09 20 20 20 20 20 20 D").......
7ff0: 28 6d 65 6d 62 65 72 20 28 64 62 3a 74 65 73 74 (member (db:test
8000: 2d 67 65 74 2d 73 74 61 74 75 73 20 74 65 73 74 -get-status test
8010: 29 20 27 28 22 50 41 53 53 22 20 22 57 41 52 4e ) '("PASS" "WARN
8020: 22 20 22 43 48 45 43 4b 22 29 29 29 29 0a 09 09 " "CHECK"))))...
8030: 09 09 09 20 20 20 20 28 73 65 74 21 20 72 65 73 ... (set! res
8040: 75 6c 74 20 28 63 6f 6e 73 20 77 61 69 74 6f 6e ult (cons waiton
8050: 74 65 73 74 2d 6e 61 6d 65 20 72 65 73 75 6c 74 test-name result
8060: 29 29 29 29 29 29 0a 09 09 09 09 74 65 73 74 73 )))))).....tests
8070: 29 0a 09 09 20 20 20 20 20 20 28 69 66 20 28 6e )... (if (n
8080: 6f 74 20 65 76 65 72 2d 73 65 65 6e 29 28 73 65 ot ever-seen)(se
8090: 74 21 20 72 65 73 75 6c 74 20 28 63 6f 6e 73 20 t! result (cons
80a0: 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 20 waitontest-name
80b0: 72 65 73 75 6c 74 29 29 29 29 29 0a 09 09 20 20 result)))))...
80c0: 77 61 69 74 6f 6e 29 0a 09 28 64 65 6c 65 74 65 waiton)..(delete
80d0: 2d 64 75 70 6c 69 63 61 74 65 73 20 72 65 73 75 -duplicates resu
80e0: 6c 74 29 29 29 29 0a 0a 3b 3b 20 74 68 65 20 6e lt))))..;; the n
80f0: 65 77 20 70 72 65 72 65 71 73 20 63 61 6c 63 75 ew prereqs calcu
8100: 6c 61 74 69 6f 6e 2c 20 6c 6f 6f 6b 73 20 61 6c lation, looks al
8110: 73 6f 20 61 74 20 69 74 65 6d 70 61 74 68 20 69 so at itempath i
8120: 66 20 73 70 65 63 69 66 69 65 64 0a 3b 3b 20 61 f specified.;; a
8130: 6c 6c 20 70 72 65 72 65 71 73 20 6d 75 73 74 20 ll prereqs must
8140: 62 65 20 6d 65 74 3a 0a 3b 3b 20 20 20 20 69 66 be met:.;; if
8150: 20 70 72 65 72 65 71 20 74 65 73 74 20 77 69 74 prereq test wit
8160: 68 20 69 74 65 6d 70 61 74 68 3d 27 27 20 69 73 h itempath='' is
8170: 20 43 4f 4d 50 4c 45 54 45 44 20 61 6e 64 20 50 COMPLETED and P
8180: 41 53 53 2c 20 57 41 52 4e 2c 20 43 48 45 43 4b ASS, WARN, CHECK
8190: 2c 20 6f 72 20 57 41 49 56 45 44 20 74 68 65 6e , or WAIVED then
81a0: 20 70 72 65 72 65 71 20 69 73 20 6d 65 74 0a 3b prereq is met.;
81b0: 3b 20 20 20 20 69 66 20 70 72 65 72 65 71 20 74 ; if prereq t
81c0: 65 73 74 20 77 69 74 68 20 69 74 65 6d 70 61 74 est with itempat
81d0: 68 3d 72 65 66 2d 69 74 65 6d 2d 70 61 74 68 20 h=ref-item-path
81e0: 61 6e 64 20 43 4f 4d 50 4c 45 54 45 44 20 77 69 and COMPLETED wi
81f0: 74 68 20 50 41 53 53 2c 20 57 41 52 4e 2c 20 43 th PASS, WARN, C
8200: 48 45 43 4b 2c 20 6f 72 20 57 41 49 56 45 44 20 HECK, or WAIVED
8210: 74 68 65 6e 20 70 72 65 72 65 71 20 69 73 20 6d then prereq is m
8220: 65 74 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67 et.(define (db:g
8230: 65 74 2d 70 72 65 72 65 71 73 2d 6e 6f 74 2d 6d et-prereqs-not-m
8240: 65 74 20 64 62 20 72 75 6e 2d 69 64 20 77 61 69 et db run-id wai
8250: 74 6f 6e 20 72 65 66 2d 69 74 65 6d 2d 70 61 74 ton ref-item-pat
8260: 68 29 0a 20 20 28 69 66 20 28 6e 75 6c 6c 3f 20 h). (if (null?
8270: 77 61 69 74 6f 6e 29 0a 20 20 20 20 20 20 27 28 waiton). '(
8280: 29 0a 20 20 20 20 20 20 28 6c 65 74 2a 20 28 28 ). (let* ((
8290: 75 6e 6d 65 74 2d 70 72 65 2d 72 65 71 73 20 27 unmet-pre-reqs '
82a0: 28 29 29 0a 09 20 20 20 20 20 28 74 65 73 74 73 ()).. (tests
82b0: 20 20 20 20 20 20 20 20 20 20 20 28 64 62 2d 67 (db-g
82c0: 65 74 2d 74 65 73 74 73 2d 66 6f 72 2d 72 75 6e et-tests-for-run
82d0: 20 64 62 20 72 75 6e 2d 69 64 20 23 66 20 23 66 db run-id #f #f
82e0: 20 27 28 29 20 27 28 29 29 29 0a 09 20 20 20 20 '() '()))..
82f0: 20 28 72 65 73 75 6c 74 20 20 20 20 20 20 20 20 (result
8300: 20 27 28 29 29 29 0a 09 28 66 6f 72 2d 65 61 63 '()))..(for-eac
8310: 68 20 28 6c 61 6d 62 64 61 20 28 77 61 69 74 6f h (lambda (waito
8320: 6e 74 65 73 74 2d 6e 61 6d 65 29 0a 09 09 20 20 ntest-name)...
8330: 20 20 28 6c 65 74 20 28 28 65 76 65 72 2d 73 65 (let ((ever-se
8340: 65 6e 20 23 66 29 29 0a 09 09 20 20 20 20 20 20 en #f))...
8350: 28 66 6f 72 2d 65 61 63 68 20 28 6c 61 6d 62 64 (for-each (lambd
8360: 61 20 28 74 65 73 74 29 0a 09 09 09 09 20 20 28 a (test)..... (
8370: 69 66 20 28 65 71 75 61 6c 3f 20 77 61 69 74 6f if (equal? waito
8380: 6e 74 65 73 74 2d 6e 61 6d 65 20 28 64 62 3a 74 ntest-name (db:t
8390: 65 73 74 2d 67 65 74 2d 74 65 73 74 6e 61 6d 65 est-get-testname
83a0: 20 74 65 73 74 29 29 0a 09 09 09 09 20 20 20 20 test)).....
83b0: 20 20 28 6c 65 74 2a 20 28 28 73 74 61 74 65 20 (let* ((state
83c0: 20 20 20 20 20 20 20 20 28 64 62 3a 74 65 73 74 (db:test
83d0: 2d 67 65 74 2d 73 74 61 74 65 20 74 65 73 74 29 -get-state test)
83e0: 29 0a 09 09 09 09 09 20 20 20 20 20 28 73 74 61 )...... (sta
83f0: 74 75 73 20 20 20 20 20 20 20 20 28 64 62 3a 74 tus (db:t
8400: 65 73 74 2d 67 65 74 2d 73 74 61 74 75 73 20 74 est-get-status t
8410: 65 73 74 29 29 0a 09 09 09 09 09 20 20 20 20 20 est))......
8420: 28 69 74 65 6d 2d 70 61 74 68 20 20 20 20 20 28 (item-path (
8430: 64 62 3a 74 65 73 74 2d 67 65 74 2d 69 74 65 6d db:test-get-item
8440: 2d 70 61 74 68 20 74 65 73 74 29 29 0a 09 09 09 -path test))....
8450: 09 09 20 20 20 20 20 28 69 73 2d 63 6f 6d 70 6c .. (is-compl
8460: 65 74 65 64 20 20 28 65 71 75 61 6c 3f 20 73 74 eted (equal? st
8470: 61 74 65 20 22 43 4f 4d 50 4c 45 54 45 44 22 29 ate "COMPLETED")
8480: 29 0a 09 09 09 09 09 20 20 20 20 20 28 69 73 2d )...... (is-
8490: 6f 6b 20 20 20 20 20 20 20 20 20 28 6d 65 6d 62 ok (memb
84a0: 65 72 20 73 74 61 74 75 73 20 27 28 22 50 41 53 er status '("PAS
84b0: 53 22 20 22 57 41 52 4e 22 20 22 43 48 45 43 4b S" "WARN" "CHECK
84c0: 22 20 22 57 41 49 56 45 44 22 29 29 29 0a 09 09 " "WAIVED")))...
84d0: 09 09 09 20 20 20 20 20 28 73 61 6d 65 2d 69 74 ... (same-it
84e0: 65 6d 70 61 74 68 20 28 65 71 75 61 6c 3f 20 72 empath (equal? r
84f0: 65 66 2d 69 74 65 6d 2d 70 61 74 68 20 69 74 65 ef-item-path ite
8500: 6d 2d 70 61 74 68 29 29 29 0a 09 09 09 09 09 28 m-path)))......(
8510: 73 65 74 21 20 65 76 65 72 2d 73 65 65 6e 20 23 set! ever-seen #
8520: 74 29 0a 09 09 09 09 09 28 69 66 20 28 6f 72 20 t)......(if (or
8530: 28 0a 09 09 09 09 09 20 20 20 20 28 73 65 74 21 (...... (set!
8540: 20 72 65 73 75 6c 74 20 28 63 6f 6e 73 20 77 61 result (cons wa
8550: 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 20 72 65 itontest-name re
8560: 73 75 6c 74 29 29 29 29 29 29 0a 09 09 09 09 74 sult)))))).....t
8570: 65 73 74 73 29 0a 09 09 20 20 20 20 20 20 28 69 ests)... (i
8580: 66 20 28 6e 6f 74 20 65 76 65 72 2d 73 65 65 6e f (not ever-seen
8590: 29 28 73 65 74 21 20 72 65 73 75 6c 74 20 28 63 )(set! result (c
85a0: 6f 6e 73 20 77 61 69 74 6f 6e 74 65 73 74 2d 6e ons waitontest-n
85b0: 61 6d 65 20 72 65 73 75 6c 74 29 29 29 29 29 0a ame result))))).
85c0: 09 09 20 20 77 61 69 74 6f 6e 29 0a 09 28 64 65 .. waiton)..(de
85d0: 6c 65 74 65 2d 64 75 70 6c 69 63 61 74 65 73 20 lete-duplicates
85e0: 72 65 73 75 6c 74 29 29 29 29 0a 0a 3b 3b 3d 3d result))))..;;==
85f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8600: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8610: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8620: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8630: 3d 3d 3d 3d 0a 3b 3b 20 45 78 74 72 61 63 74 20 ====.;; Extract
8640: 6f 64 73 20 66 69 6c 65 20 66 72 6f 6d 20 74 68 ods file from th
8650: 65 20 64 62 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d e db.;;=========
8660: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8670: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8680: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8690: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b =============..;
86a0: 3b 20 72 75 6e 73 70 61 74 74 20 69 73 20 61 20 ; runspatt is a
86b0: 63 6f 6d 6d 61 20 64 65 6c 69 6d 69 74 65 64 20 comma delimited
86c0: 6c 69 73 74 20 6f 66 20 72 75 6e 20 70 61 74 74 list of run patt
86d0: 65 72 6e 73 0a 3b 3b 20 6b 65 79 70 61 74 74 2d erns.;; keypatt-
86e0: 61 6c 69 73 74 20 6d 75 73 74 20 63 6f 6e 74 61 alist must conta
86f0: 69 6e 20 2a 61 6c 6c 2a 20 6b 65 79 73 20 77 69 in *all* keys wi
8700: 74 68 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64 th an associated
8710: 20 70 61 74 74 65 72 6e 3a 20 27 28 20 28 22 4b pattern: '( ("K
8720: 45 59 31 22 20 22 25 22 29 20 2e 2e 20 29 0a 28 EY1" "%") .. ).(
8730: 64 65 66 69 6e 65 20 28 64 62 3a 65 78 74 72 61 define (db:extra
8740: 63 74 2d 6f 64 73 2d 66 69 6c 65 20 64 62 20 6f ct-ods-file db o
8750: 75 74 70 75 74 66 69 6c 65 20 6b 65 79 70 61 74 utputfile keypat
8760: 74 2d 61 6c 69 73 74 20 72 75 6e 73 70 61 74 74 t-alist runspatt
8770: 20 70 61 74 68 6d 6f 64 29 0a 20 20 28 6c 65 74 pathmod). (let
8780: 2a 20 28 28 6b 65 79 73 73 74 72 20 20 28 73 74 * ((keysstr (st
8790: 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 ring-intersperse
87a0: 20 28 6d 61 70 20 63 61 72 20 6b 65 79 70 61 74 (map car keypat
87b0: 74 2d 61 6c 69 73 74 29 20 22 2c 22 29 29 0a 09 t-alist) ","))..
87c0: 20 28 6b 65 79 71 72 79 20 20 20 28 73 74 72 69 (keyqry (stri
87d0: 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 28 ng-intersperse (
87e0: 6d 61 70 20 28 6c 61 6d 62 64 61 20 28 70 29 28 map (lambda (p)(
87f0: 63 6f 6e 63 20 28 63 61 72 20 70 29 20 22 20 4c conc (car p) " L
8800: 49 4b 45 20 3f 20 22 29 29 20 6b 65 79 70 61 74 IKE ? ")) keypat
8810: 74 2d 61 6c 69 73 74 29 20 22 20 41 4e 44 20 22 t-alist) " AND "
8820: 29 29 0a 09 20 28 6e 75 6d 6b 65 79 73 20 20 28 )).. (numkeys (
8830: 6c 65 6e 67 74 68 20 6b 65 79 70 61 74 74 2d 61 length keypatt-a
8840: 6c 69 73 74 29 29 0a 09 20 28 74 65 73 74 2d 69 list)).. (test-i
8850: 64 73 20 27 28 29 29 0a 09 20 28 77 69 6e 64 6f ds '()).. (windo
8860: 77 73 20 20 28 61 6e 64 20 70 61 74 68 6d 6f 64 ws (and pathmod
8870: 20 28 73 75 62 73 74 72 69 6e 67 2d 69 6e 64 65 (substring-inde
8880: 78 20 22 5c 5c 22 20 70 61 74 68 6d 6f 64 29 29 x "\\" pathmod))
8890: 29 0a 09 20 28 74 65 6d 70 64 69 72 20 20 28 63 ).. (tempdir (c
88a0: 6f 6e 63 20 22 2f 74 6d 70 2f 22 20 28 63 75 72 onc "/tmp/" (cur
88b0: 72 65 6e 74 2d 75 73 65 72 2d 6e 61 6d 65 29 20 rent-user-name)
88c0: 22 2f 22 20 72 75 6e 73 70 61 74 74 20 22 5f 22 "/" runspatt "_"
88d0: 20 28 72 61 6e 64 6f 6d 20 31 30 30 30 30 29 20 (random 10000)
88e0: 22 5f 22 20 28 63 75 72 72 65 6e 74 2d 70 72 6f "_" (current-pro
88f0: 63 65 73 73 2d 69 64 29 29 29 0a 09 20 28 72 75 cess-id))).. (ru
8900: 6e 73 68 65 61 64 65 72 20 28 61 70 70 65 6e 64 nsheader (append
8910: 20 28 6c 69 73 74 20 22 52 75 6e 20 49 64 22 20 (list "Run Id"
8920: 22 52 75 6e 6e 61 6d 65 22 29 20 3b 20 30 20 31 "Runname") ; 0 1
8930: 0a 09 09 09 20 20 20 20 20 28 6d 61 70 20 63 61 .... (map ca
8940: 72 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 29 r keypatt-alist)
8950: 20 20 20 3b 20 2b 20 4e 20 3d 20 6c 65 6e 67 74 ; + N = lengt
8960: 68 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 0a h keypatt-alist.
8970: 09 09 09 20 20 20 20 20 28 6c 69 73 74 20 22 54 ... (list "T
8980: 65 73 74 6e 61 6d 65 22 20 20 20 20 20 20 20 20 estname"
8990: 20 20 3b 20 32 0a 09 09 09 09 20 20 20 22 49 74 ; 2..... "It
89a0: 65 6d 20 50 61 74 68 22 20 20 20 20 20 20 20 20 em Path"
89b0: 20 3b 20 33 20 0a 09 09 09 09 20 20 20 22 44 65 ; 3 ..... "De
89c0: 73 63 72 69 70 74 69 6f 6e 22 20 20 20 20 20 20 scription"
89d0: 20 3b 20 34 20 0a 09 09 09 09 20 20 20 22 53 74 ; 4 ..... "St
89e0: 61 74 65 22 20 20 20 20 20 20 20 20 20 20 20 20 ate"
89f0: 20 3b 20 35 20 0a 09 09 09 09 20 20 20 22 53 74 ; 5 ..... "St
8a00: 61 74 75 73 22 20 20 20 20 20 20 20 20 20 20 20 atus"
8a10: 20 3b 20 36 20 20 0a 09 09 09 09 20 20 20 22 46 ; 6 ..... "F
8a20: 69 6e 61 6c 20 4c 6f 67 22 20 20 20 20 20 20 20 inal Log"
8a30: 20 20 3b 20 37 20 0a 09 09 09 09 20 20 20 22 52 ; 7 ..... "R
8a40: 75 6e 20 44 75 72 61 74 69 6f 6e 22 20 20 20 20 un Duration"
8a50: 20 20 3b 20 38 20 0a 09 09 09 09 20 20 20 22 57 ; 8 ..... "W
8a60: 68 65 6e 20 52 75 6e 22 20 20 20 20 20 20 20 20 hen Run"
8a70: 20 20 3b 20 39 20 0a 09 09 09 09 20 20 20 22 54 ; 9 ..... "T
8a80: 61 67 73 22 20 20 20 20 20 20 20 20 20 20 20 20 ags"
8a90: 20 20 3b 20 31 30 0a 09 09 09 09 20 20 20 22 52 ; 10..... "R
8aa0: 75 6e 20 4f 77 6e 65 72 22 20 20 20 20 20 20 20 un Owner"
8ab0: 20 20 3b 20 31 31 0a 09 09 09 09 20 20 20 22 43 ; 11..... "C
8ac0: 6f 6d 6d 65 6e 74 22 20 20 20 20 20 20 20 20 20 omment"
8ad0: 20 20 3b 20 31 32 0a 09 09 09 09 20 20 20 22 41 ; 12..... "A
8ae0: 75 74 68 6f 72 22 20 20 20 20 20 20 20 20 20 20 uthor"
8af0: 20 20 3b 20 31 33 0a 09 09 09 09 20 20 20 22 54 ; 13..... "T
8b00: 65 73 74 20 4f 77 6e 65 72 22 20 20 20 20 20 20 est Owner"
8b10: 20 20 3b 20 31 34 0a 09 09 09 09 20 20 20 22 52 ; 14..... "R
8b20: 65 76 69 65 77 65 64 22 20 20 20 20 20 20 20 20 eviewed"
8b30: 20 20 3b 20 31 35 0a 09 09 09 09 20 20 20 22 44 ; 15..... "D
8b40: 69 73 6b 66 72 65 65 22 20 20 20 20 20 20 20 20 iskfree"
8b50: 20 20 3b 20 31 36 0a 09 09 09 09 20 20 20 22 55 ; 16..... "U
8b60: 6e 61 6d 65 22 20 20 20 20 20 20 20 20 20 20 20 name"
8b70: 20 20 3b 20 31 37 0a 09 09 09 09 20 20 20 22 52 ; 17..... "R
8b80: 75 6e 64 69 72 22 20 20 20 20 20 20 20 20 20 20 undir"
8b90: 20 20 3b 20 31 38 0a 09 09 09 09 20 20 20 22 48 ; 18..... "H
8ba0: 6f 73 74 22 20 20 20 20 20 20 20 20 20 20 20 20 ost"
8bb0: 20 20 3b 20 31 39 0a 09 09 09 09 20 20 20 22 43 ; 19..... "C
8bc0: 70 75 20 4c 6f 61 64 22 20 20 20 20 20 20 20 20 pu Load"
8bd0: 20 20 3b 20 32 30 0a 09 09 09 09 20 20 20 29 29 ; 20..... ))
8be0: 29 0a 09 20 28 72 65 73 75 6c 74 73 20 28 6c 69 ).. (results (li
8bf0: 73 74 20 72 75 6e 73 68 65 61 64 65 72 29 29 09 st runsheader)).
8c00: 09 09 20 0a 09 20 28 74 65 73 74 64 61 74 61 2d .. .. (testdata-
8c10: 68 65 61 64 65 72 20 28 6c 69 73 74 20 22 52 75 header (list "Ru
8c20: 6e 20 49 64 22 20 22 54 65 73 74 6e 61 6d 65 22 n Id" "Testname"
8c30: 20 22 49 74 65 6d 20 50 61 74 68 22 20 22 43 61 "Item Path" "Ca
8c40: 74 65 67 6f 72 79 22 20 22 56 61 72 69 61 62 6c tegory" "Variabl
8c50: 65 22 20 22 56 61 6c 75 65 22 20 22 45 78 70 65 e" "Value" "Expe
8c60: 63 74 65 64 22 20 22 54 6f 6c 22 20 22 55 6e 69 cted" "Tol" "Uni
8c70: 74 73 22 20 22 53 74 61 74 75 73 22 20 22 43 6f ts" "Status" "Co
8c80: 6d 6d 65 6e 74 22 29 29 29 0a 20 20 20 20 28 64 mment"))). (d
8c90: 65 62 75 67 3a 70 72 69 6e 74 20 32 20 22 55 73 ebug:print 2 "Us
8ca0: 69 6e 67 20 22 20 74 65 6d 70 64 69 72 20 22 20 ing " tempdir "
8cb0: 66 6f 72 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 for constructing
8cc0: 20 74 68 65 20 6f 64 73 20 66 69 6c 65 2e 20 6b the ods file. k
8cd0: 65 79 71 72 79 3a 20 22 20 6b 65 79 71 72 79 20 eyqry: " keyqry
8ce0: 22 20 6b 65 79 73 74 72 3a 20 22 20 6b 65 79 73 " keystr: " keys
8cf0: 73 74 72 20 22 20 77 69 74 68 20 6b 65 79 73 3a str " with keys:
8d00: 20 22 20 28 6d 61 70 20 63 61 64 72 20 6b 65 79 " (map cadr key
8d10: 70 61 74 74 2d 61 6c 69 73 74 29 29 0a 20 20 20 patt-alist)).
8d20: 20 3b 3b 20 22 45 78 70 65 63 74 65 64 20 56 61 ;; "Expected Va
8d30: 6c 75 65 22 0a 20 20 20 20 3b 3b 20 22 56 61 6c lue". ;; "Val
8d40: 75 65 20 46 6f 75 6e 64 22 0a 20 20 20 20 3b 3b ue Found". ;;
8d50: 20 22 54 6f 6c 65 72 61 6e 63 65 22 0a 20 20 20 "Tolerance".
8d60: 20 28 61 70 70 6c 79 20 73 71 6c 69 74 65 33 3a (apply sqlite3:
8d70: 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 for-each-row.
8d80: 20 20 28 6c 61 6d 62 64 61 20 28 74 65 73 74 2d (lambda (test-
8d90: 69 64 20 2e 20 62 29 0a 20 20 20 20 20 20 20 28 id . b). (
8da0: 73 65 74 21 20 74 65 73 74 2d 69 64 73 20 28 63 set! test-ids (c
8db0: 6f 6e 73 20 74 65 73 74 2d 69 64 20 74 65 73 74 ons test-id test
8dc0: 2d 69 64 73 29 29 20 20 20 3b 3b 20 74 65 73 74 -ids)) ;; test
8dd0: 2d 69 64 20 69 73 20 6e 6f 77 20 74 65 73 74 6e -id is now testn
8de0: 61 6d 65 0a 20 20 20 20 20 20 20 28 73 65 74 21 ame. (set!
8df0: 20 72 65 73 75 6c 74 73 20 28 61 70 70 65 6e 64 results (append
8e00: 20 72 65 73 75 6c 74 73 20 3b 3b 20 6e 6f 74 65 results ;; note
8e10: 2c 20 64 72 6f 70 20 74 68 65 20 74 65 73 74 2d , drop the test-
8e20: 69 64 0a 09 09 09 20 20 20 20 20 28 6c 69 73 74 id.... (list
8e30: 0a 09 09 09 20 20 20 20 20 20 28 69 66 20 70 61 .... (if pa
8e40: 74 68 6d 6f 64 0a 09 09 09 09 20 20 28 6c 65 74 thmod..... (let
8e50: 2a 20 28 28 76 62 20 20 20 20 20 20 20 20 28 61 * ((vb (a
8e60: 70 70 6c 79 20 76 65 63 74 6f 72 20 62 29 29 0a pply vector b)).
8e70: 09 09 09 09 09 20 28 6b 65 79 76 61 6c 73 20 20 ..... (keyvals
8e80: 20 28 6c 65 74 20 6c 6f 6f 70 20 28 28 69 20 20 (let loop ((i
8e90: 20 20 30 29 0a 09 09 09 09 09 09 09 20 20 20 20 0)........
8ea0: 20 20 20 28 72 65 73 20 27 28 29 29 29 0a 09 09 (res '()))...
8eb0: 09 09 09 09 20 20 20 20 20 20 28 69 66 20 28 3e .... (if (>
8ec0: 3d 20 69 20 6e 75 6d 6b 65 79 73 29 0a 09 09 09 = i numkeys)....
8ed0: 09 09 09 09 20 20 72 65 73 0a 09 09 09 09 09 09 .... res.......
8ee0: 09 20 20 28 6c 6f 6f 70 20 28 2b 20 69 20 31 29 . (loop (+ i 1)
8ef0: 0a 09 09 09 09 09 09 09 09 28 61 70 70 65 6e 64 .........(append
8f00: 20 72 65 73 20 28 6c 69 73 74 20 28 76 65 63 74 res (list (vect
8f10: 6f 72 2d 72 65 66 20 76 62 20 28 2b 20 69 20 32 or-ref vb (+ i 2
8f20: 29 29 29 29 29 29 29 29 0a 09 09 09 09 09 20 28 ))))))))...... (
8f30: 72 75 6e 6e 61 6d 65 20 20 20 28 76 65 63 74 6f runname (vecto
8f40: 72 2d 72 65 66 20 76 62 20 31 29 29 0a 09 09 09 r-ref vb 1))....
8f50: 09 09 20 28 74 65 73 74 6e 61 6d 65 20 20 28 76 .. (testname (v
8f60: 65 63 74 6f 72 2d 72 65 66 20 76 62 20 28 2b 20 ector-ref vb (+
8f70: 20 32 20 6e 75 6d 6b 65 79 73 29 29 29 0a 09 09 2 numkeys)))...
8f80: 09 09 09 20 28 69 74 65 6d 2d 70 61 74 68 20 28 ... (item-path (
8f90: 76 65 63 74 6f 72 2d 72 65 66 20 76 62 20 28 2b vector-ref vb (+
8fa0: 20 20 33 20 6e 75 6d 6b 65 79 73 29 29 29 0a 09 3 numkeys)))..
8fb0: 09 09 09 09 20 28 66 69 6e 61 6c 2d 6c 6f 67 20 .... (final-log
8fc0: 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62 20 28 (vector-ref vb (
8fd0: 2b 20 20 37 20 6e 75 6d 6b 65 79 73 29 29 29 0a + 7 numkeys))).
8fe0: 09 09 09 09 09 20 28 72 75 6e 2d 64 69 72 20 20 ..... (run-dir
8ff0: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62 20 (vector-ref vb
9000: 28 2b 20 31 38 20 6e 75 6d 6b 65 79 73 29 29 29 (+ 18 numkeys)))
9010: 0a 09 09 09 09 09 20 28 6c 6f 67 2d 66 70 61 74 ...... (log-fpat
9020: 68 20 28 63 6f 6e 63 20 72 75 6e 2d 64 69 72 20 h (conc run-dir
9030: 22 2f 22 20 20 66 69 6e 61 6c 2d 6c 6f 67 29 29 "/" final-log))
9040: 29 20 3b 3b 20 28 73 74 72 69 6e 67 2d 69 6e 74 ) ;; (string-int
9050: 65 72 73 70 65 72 73 65 20 6b 65 79 76 61 6c 73 ersperse keyvals
9060: 20 22 2f 22 29 20 22 2f 22 20 74 65 73 74 6e 61 "/") "/" testna
9070: 6d 65 20 22 2f 22 20 69 74 65 6d 2d 70 61 74 68 me "/" item-path
9080: 20 22 2f 22 0a 09 09 09 09 20 20 20 20 28 64 65 "/"..... (de
9090: 62 75 67 3a 70 72 69 6e 74 20 34 20 22 6c 6f 67 bug:print 4 "log
90a0: 3a 20 22 20 6c 6f 67 2d 66 70 61 74 68 20 22 20 : " log-fpath "
90b0: 65 78 69 73 74 73 3a 20 22 20 28 66 69 6c 65 2d exists: " (file-
90c0: 65 78 69 73 74 73 3f 20 6c 6f 67 2d 66 70 61 74 exists? log-fpat
90d0: 68 29 29 0a 09 09 09 09 20 20 20 20 28 76 65 63 h))..... (vec
90e0: 74 6f 72 2d 73 65 74 21 20 76 62 20 28 2b 20 37 tor-set! vb (+ 7
90f0: 20 6e 75 6d 6b 65 79 73 29 20 28 69 66 20 28 66 numkeys) (if (f
9100: 69 6c 65 2d 65 78 69 73 74 73 3f 20 6c 6f 67 2d ile-exists? log-
9110: 66 70 61 74 68 29 0a 09 09 09 09 09 09 09 09 20 fpath).........
9120: 20 20 20 20 20 28 6c 65 74 20 28 28 6e 65 77 70 (let ((newp
9130: 61 74 68 20 28 63 6f 6e 63 20 70 61 74 68 6d 6f ath (conc pathmo
9140: 64 20 22 2f 22 0a 09 09 09 09 09 09 09 09 09 09 d "/"...........
9150: 09 20 20 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 . (string-inte
9160: 72 73 70 65 72 73 65 20 6b 65 79 76 61 6c 73 20 rsperse keyvals
9170: 22 2f 22 29 0a 09 09 09 09 09 09 09 09 09 09 09 "/")............
9180: 20 20 20 22 2f 22 20 72 75 6e 6e 61 6d 65 20 22 "/" runname "
9190: 2f 22 20 74 65 73 74 6e 61 6d 65 20 22 2f 22 0a /" testname "/".
91a0: 09 09 09 09 09 09 09 09 09 09 09 20 20 20 28 69 ........... (i
91b0: 66 20 28 73 74 72 69 6e 67 3d 3f 20 69 74 65 6d f (string=? item
91c0: 2d 70 61 74 68 20 22 22 29 20 22 22 20 28 63 6f -path "") "" (co
91d0: 6e 63 20 22 2f 22 20 69 74 65 6d 2d 70 61 74 68 nc "/" item-path
91e0: 29 29 0a 09 09 09 09 09 09 09 09 09 09 09 20 20 ))............
91f0: 20 66 69 6e 61 6c 2d 6c 6f 67 29 29 29 0a 09 09 final-log)))...
9200: 09 09 09 09 09 09 09 3b 3b 20 66 6f 72 20 6e 6f .......;; for no
9210: 77 20 74 68 72 6f 77 20 61 77 61 79 20 6e 65 77 w throw away new
9220: 70 61 74 68 20 61 6e 64 20 75 73 65 20 74 68 65 path and use the
9230: 20 6c 6f 67 2d 66 70 61 74 68 20 63 6f 6e 63 27 log-fpath conc'
9240: 64 20 77 69 74 68 20 70 61 74 68 6d 6f 64 0a 09 d with pathmod..
9250: 09 09 09 09 09 09 09 09 28 73 65 74 21 20 6e 65 ........(set! ne
9260: 77 70 61 74 68 20 28 63 6f 6e 63 20 70 61 74 68 wpath (conc path
9270: 6d 6f 64 20 6c 6f 67 2d 66 70 61 74 68 29 29 0a mod log-fpath)).
9280: 09 09 09 09 09 09 09 09 09 28 69 66 20 77 69 6e .........(if win
9290: 64 6f 77 73 20 28 73 74 72 69 6e 67 2d 74 72 61 dows (string-tra
92a0: 6e 73 6c 61 74 65 20 6e 65 77 70 61 74 68 20 22 nslate newpath "
92b0: 2f 22 20 22 5c 5c 22 29 20 6e 65 77 70 61 74 68 /" "\\") newpath
92c0: 29 29 0a 09 09 09 09 09 09 09 09 20 20 20 20 20 )).........
92d0: 20 28 69 66 20 28 3e 20 2a 76 65 72 62 6f 73 69 (if (> *verbosi
92e0: 74 79 2a 20 31 29 0a 09 09 09 09 09 09 09 09 09 ty* 1)..........
92f0: 20 20 28 63 6f 6e 63 20 66 69 6e 61 6c 2d 6c 6f (conc final-lo
9300: 67 20 22 20 6e 6f 74 2d 66 6f 75 6e 64 22 29 0a g " not-found").
9310: 09 09 09 09 09 09 09 09 09 20 20 22 22 29 29 29 ......... "")))
9320: 0a 09 09 09 09 20 20 20 20 28 76 65 63 74 6f 72 ..... (vector
9330: 2d 3e 6c 69 73 74 20 76 62 29 29 0a 09 09 09 09 ->list vb)).....
9340: 20 20 62 29 29 29 29 29 0a 20 20 20 20 20 64 62 b))))). db
9350: 0a 20 20 20 20 20 28 63 6f 6e 63 20 22 53 45 4c . (conc "SEL
9360: 45 43 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 ECT.
9370: 20 20 74 2e 74 65 73 74 6e 61 6d 65 2c 72 2e 69 t.testname,r.i
9380: 64 2c 72 75 6e 6e 61 6d 65 2c 22 20 6b 65 79 73 d,runname," keys
9390: 73 74 72 20 22 2c 74 2e 74 65 73 74 6e 61 6d 65 str ",t.testname
93a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
93b0: 74 2e 69 74 65 6d 5f 70 61 74 68 2c 74 6d 2e 64 t.item_path,tm.d
93c0: 65 73 63 72 69 70 74 69 6f 6e 2c 74 2e 73 74 61 escription,t.sta
93d0: 74 65 2c 74 2e 73 74 61 74 75 73 2c 0a 20 20 20 te,t.status,.
93e0: 20 20 20 20 20 20 20 20 20 20 20 66 69 6e 61 6c final
93f0: 5f 6c 6f 67 66 2c 72 75 6e 5f 64 75 72 61 74 69 _logf,run_durati
9400: 6f 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 on, .
9410: 20 20 20 73 74 72 66 74 69 6d 65 28 27 25 6d 2f strftime('%m/
9420: 25 64 2f 25 59 20 25 48 3a 25 4d 3a 25 53 27 2c %d/%Y %H:%M:%S',
9430: 64 61 74 65 74 69 6d 65 28 74 2e 65 76 65 6e 74 datetime(t.event
9440: 5f 74 69 6d 65 2c 27 75 6e 69 78 65 70 6f 63 68 _time,'unixepoch
9450: 27 29 2c 27 6c 6f 63 61 6c 74 69 6d 65 27 29 2c '),'localtime'),
9460: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 . t
9470: 6d 2e 74 61 67 73 2c 72 2e 6f 77 6e 65 72 2c 74 m.tags,r.owner,t
9480: 2e 63 6f 6d 6d 65 6e 74 2c 0a 20 20 20 20 20 20 .comment,.
9490: 20 20 20 20 20 20 20 20 61 75 74 68 6f 72 2c 0a author,.
94a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6d tm
94b0: 2e 6f 77 6e 65 72 2c 72 65 76 69 65 77 65 64 2c .owner,reviewed,
94c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 . d
94d0: 69 73 6b 66 72 65 65 2c 75 6e 61 6d 65 2c 72 75 iskfree,uname,ru
94e0: 6e 64 69 72 2c 0a 20 20 20 20 20 20 20 20 20 20 ndir,.
94f0: 20 20 20 20 68 6f 73 74 2c 63 70 75 6c 6f 61 64 host,cpuload
9500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 46 52 4f . FRO
9510: 4d 20 74 65 73 74 73 20 41 53 20 74 20 49 4e 4e M tests AS t INN
9520: 45 52 20 4a 4f 49 4e 20 72 75 6e 73 20 41 53 20 ER JOIN runs AS
9530: 72 20 4f 4e 20 74 2e 72 75 6e 5f 69 64 3d 72 2e r ON t.run_id=r.
9540: 69 64 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 74 65 id INNER JOIN te
9550: 73 74 5f 6d 65 74 61 20 41 53 20 74 6d 20 4f 4e st_meta AS tm ON
9560: 20 74 6d 2e 74 65 73 74 6e 61 6d 65 3d 74 2e 74 tm.testname=t.t
9570: 65 73 74 6e 61 6d 65 0a 20 20 20 20 20 20 20 20 estname.
9580: 20 20 20 20 57 48 45 52 45 20 72 75 6e 6e 61 6d WHERE runnam
9590: 65 20 4c 49 4b 45 20 3f 20 41 4e 44 20 22 20 6b e LIKE ? AND " k
95a0: 65 79 71 72 79 20 22 3b 22 29 0a 20 20 20 20 20 eyqry ";").
95b0: 72 75 6e 73 70 61 74 74 20 28 6d 61 70 20 63 61 runspatt (map ca
95c0: 64 72 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 dr keypatt-alist
95d0: 29 29 0a 20 20 20 20 28 73 65 74 21 20 72 65 73 )). (set! res
95e0: 75 6c 74 73 20 28 6c 69 73 74 20 28 63 6f 6e 73 ults (list (cons
95f0: 20 22 52 75 6e 73 22 20 72 65 73 75 6c 74 73 29 "Runs" results)
9600: 29 29 0a 20 20 20 20 3b 3b 20 6e 6f 77 2c 20 66 )). ;; now, f
9610: 6f 72 20 65 61 63 68 20 74 65 73 74 2c 20 63 6f or each test, co
9620: 6c 6c 65 63 74 20 74 68 65 20 74 65 73 74 5f 64 llect the test_d
9630: 61 74 61 20 69 6e 66 6f 20 61 6e 64 20 61 64 64 ata info and add
9640: 20 61 20 6e 65 77 20 73 68 65 65 74 0a 20 20 20 a new sheet.
9650: 20 28 66 6f 72 2d 65 61 63 68 0a 20 20 20 20 20 (for-each.
9660: 28 6c 61 6d 62 64 61 20 28 74 65 73 74 2d 69 64 (lambda (test-id
9670: 29 0a 20 20 20 20 20 20 20 28 6c 65 74 20 28 28 ). (let ((
9680: 74 65 73 74 2d 64 61 74 61 20 28 6c 69 73 74 20 test-data (list
9690: 74 65 73 74 64 61 74 61 2d 68 65 61 64 65 72 29 testdata-header)
96a0: 29 0a 09 20 20 20 20 20 28 63 75 72 72 2d 74 65 ).. (curr-te
96b0: 73 74 2d 6e 61 6d 65 20 23 66 29 29 0a 09 20 28 st-name #f)).. (
96c0: 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 sqlite3:for-each
96d0: 2d 72 6f 77 0a 09 20 20 28 6c 61 6d 62 64 61 20 -row.. (lambda
96e0: 28 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 (run-id testname
96f0: 20 69 74 65 6d 2d 70 61 74 68 20 63 61 74 65 67 item-path categ
9700: 6f 72 79 20 76 61 72 69 61 62 6c 65 20 76 61 6c ory variable val
9710: 75 65 20 65 78 70 65 63 74 65 64 20 74 6f 6c 20 ue expected tol
9720: 75 6e 69 74 73 20 73 74 61 74 75 73 20 63 6f 6d units status com
9730: 6d 65 6e 74 29 0a 09 20 20 20 20 28 73 65 74 21 ment).. (set!
9740: 20 63 75 72 72 2d 74 65 73 74 2d 6e 61 6d 65 20 curr-test-name
9750: 74 65 73 74 6e 61 6d 65 29 0a 09 20 20 20 20 28 testname).. (
9760: 73 65 74 21 20 74 65 73 74 2d 64 61 74 61 20 28 set! test-data (
9770: 61 70 70 65 6e 64 20 74 65 73 74 2d 64 61 74 61 append test-data
9780: 20 28 6c 69 73 74 20 28 6c 69 73 74 20 72 75 6e (list (list run
9790: 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 69 74 65 -id testname ite
97a0: 6d 2d 70 61 74 68 20 63 61 74 65 67 6f 72 79 20 m-path category
97b0: 76 61 72 69 61 62 6c 65 20 76 61 6c 75 65 20 65 variable value e
97c0: 78 70 65 63 74 65 64 20 74 6f 6c 20 75 6e 69 74 xpected tol unit
97d0: 73 20 73 74 61 74 75 73 20 63 6f 6d 6d 65 6e 74 s status comment
97e0: 29 29 29 29 29 0a 09 20 20 64 62 20 0a 09 20 20 ))))).. db ..
97f0: 3b 3b 20 22 53 45 4c 45 43 54 20 72 75 6e 5f 69 ;; "SELECT run_i
9800: 64 2c 74 65 73 74 6e 61 6d 65 2c 69 74 65 6d 5f d,testname,item_
9810: 70 61 74 68 2c 63 61 74 65 67 6f 72 79 2c 76 61 path,category,va
9820: 72 69 61 62 6c 65 2c 74 64 2e 76 61 6c 75 65 20 riable,td.value
9830: 41 53 20 76 61 6c 75 65 2c 65 78 70 65 63 74 65 AS value,expecte
9840: 64 2c 74 6f 6c 2c 75 6e 69 74 73 2c 74 64 2e 73 d,tol,units,td.s
9850: 74 61 74 75 73 20 41 53 20 73 74 61 74 75 73 2c tatus AS status,
9860: 74 64 2e 63 6f 6d 6d 65 6e 74 20 41 53 20 63 6f td.comment AS co
9870: 6d 6d 65 6e 74 20 46 52 4f 4d 20 74 65 73 74 5f mment FROM test_
9880: 64 61 74 61 20 41 53 20 74 64 20 49 4e 4e 45 52 data AS td INNER
9890: 20 4a 4f 49 4e 20 74 65 73 74 73 20 4f 4e 20 74 JOIN tests ON t
98a0: 65 73 74 73 2e 69 64 3d 74 64 2e 74 65 73 74 5f ests.id=td.test_
98b0: 69 64 20 57 48 45 52 45 20 74 65 73 74 5f 69 64 id WHERE test_id
98c0: 3d 3f 3b 22 0a 09 20 20 22 53 45 4c 45 43 54 20 =?;".. "SELECT
98d0: 72 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d 65 2c run_id,testname,
98e0: 69 74 65 6d 5f 70 61 74 68 2c 63 61 74 65 67 6f item_path,catego
98f0: 72 79 2c 76 61 72 69 61 62 6c 65 2c 74 64 2e 76 ry,variable,td.v
9900: 61 6c 75 65 20 41 53 20 76 61 6c 75 65 2c 74 64 alue AS value,td
9910: 2e 65 78 70 65 63 74 65 64 2c 74 64 2e 74 6f 6c .expected,td.tol
9920: 2c 74 64 2e 75 6e 69 74 73 2c 74 64 2e 73 74 61 ,td.units,td.sta
9930: 74 75 73 20 41 53 20 73 74 61 74 75 73 2c 74 64 tus AS status,td
9940: 2e 63 6f 6d 6d 65 6e 74 20 41 53 20 63 6f 6d 6d .comment AS comm
9950: 65 6e 74 20 46 52 4f 4d 20 74 65 73 74 5f 64 61 ent FROM test_da
9960: 74 61 20 41 53 20 74 64 20 49 4e 4e 45 52 20 4a ta AS td INNER J
9970: 4f 49 4e 20 74 65 73 74 73 20 4f 4e 20 74 65 73 OIN tests ON tes
9980: 74 73 2e 69 64 3d 74 64 2e 74 65 73 74 5f 69 64 ts.id=td.test_id
9990: 20 57 48 45 52 45 20 74 65 73 74 6e 61 6d 65 3d WHERE testname=
99a0: 3f 3b 22 0a 09 20 20 74 65 73 74 2d 69 64 29 0a ?;".. test-id).
99b0: 09 20 28 69 66 20 63 75 72 72 2d 74 65 73 74 2d . (if curr-test-
99c0: 6e 61 6d 65 0a 09 20 20 20 20 20 28 73 65 74 21 name.. (set!
99d0: 20 72 65 73 75 6c 74 73 20 28 61 70 70 65 6e 64 results (append
99e0: 20 72 65 73 75 6c 74 73 20 28 6c 69 73 74 20 28 results (list (
99f0: 63 6f 6e 73 20 63 75 72 72 2d 74 65 73 74 2d 6e cons curr-test-n
9a00: 61 6d 65 20 74 65 73 74 2d 64 61 74 61 29 29 29 ame test-data)))
9a10: 29 29 0a 09 20 29 29 0a 20 20 20 20 20 28 73 6f )).. )). (so
9a20: 72 74 20 28 64 65 6c 65 74 65 2d 64 75 70 6c 69 rt (delete-dupli
9a30: 63 61 74 65 73 20 74 65 73 74 2d 69 64 73 29 20 cates test-ids)
9a40: 73 74 72 69 6e 67 3c 3d 29 29 0a 20 20 20 20 28 string<=)). (
9a50: 73 79 73 74 65 6d 20 28 63 6f 6e 63 20 22 6d 6b system (conc "mk
9a60: 64 69 72 20 2d 70 20 22 20 74 65 6d 70 64 69 72 dir -p " tempdir
9a70: 29 29 0a 20 20 20 20 3b 3b 20 28 70 70 20 72 65 )). ;; (pp re
9a80: 73 75 6c 74 73 29 0a 20 20 20 20 28 6f 64 73 3a sults). (ods:
9a90: 6c 69 73 74 2d 3e 6f 64 73 20 0a 20 20 20 20 20 list->ods .
9aa0: 74 65 6d 70 64 69 72 0a 20 20 20 20 20 28 69 66 tempdir. (if
9ab0: 20 28 73 74 72 69 6e 67 2d 6d 61 74 63 68 20 28 (string-match (
9ac0: 72 65 67 65 78 70 20 22 5e 5b 2f 7e 5d 2b 2e 2a regexp "^[/~]+.*
9ad0: 22 29 20 6f 75 74 70 75 74 66 69 6c 65 29 20 3b ") outputfile) ;
9ae0: 3b 20 66 75 6c 6c 20 70 61 74 68 3f 0a 09 20 6f ; full path?.. o
9af0: 75 74 70 75 74 66 69 6c 65 0a 09 20 28 62 65 67 utputfile.. (beg
9b00: 69 6e 0a 09 20 20 20 28 64 65 62 75 67 3a 70 72 in.. (debug:pr
9b10: 69 6e 74 20 30 20 22 57 41 52 4e 49 4e 47 3a 20 int 0 "WARNING:
9b20: 70 61 74 68 20 67 69 76 65 6e 2c 20 22 20 6f 75 path given, " ou
9b30: 74 70 75 74 66 69 6c 65 20 22 20 69 73 20 72 65 tputfile " is re
9b40: 6c 61 74 69 76 65 2c 20 70 72 65 66 69 78 69 6e lative, prefixin
9b50: 67 20 77 69 74 68 20 63 75 72 72 65 6e 74 20 64 g with current d
9b60: 69 72 65 63 74 6f 72 79 22 29 0a 09 20 20 20 28 irectory").. (
9b70: 63 6f 6e 63 20 28 63 75 72 72 65 6e 74 2d 64 69 conc (current-di
9b80: 72 65 63 74 6f 72 79 29 20 22 2f 22 20 6f 75 74 rectory) "/" out
9b90: 70 75 74 66 69 6c 65 29 29 29 0a 20 20 20 20 20 putfile))).
9ba0: 72 65 73 75 6c 74 73 29 29 29 0a 0a 3b 3b 20 28 results)))..;; (
9bb0: 64 62 3a 65 78 74 72 61 63 74 2d 6f 64 73 2d 66 db:extract-ods-f
9bc0: 69 6c 65 20 64 62 20 22 6f 75 74 70 75 74 66 69 ile db "outputfi
9bd0: 6c 65 2e 6f 64 73 22 20 27 28 28 22 73 79 73 6e le.ods" '(("sysn
9be0: 61 6d 65 22 20 22 25 22 29 28 22 66 73 6e 61 6d ame" "%")("fsnam
9bf0: 65 22 20 22 25 22 29 28 22 64 61 74 61 70 61 74 e" "%")("datapat
9c00: 68 22 20 22 25 22 29 29 20 22 25 22 29 0a h" "%")) "%").