0000: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ;;==============
0010: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0030: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0040: 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 43 6f 70 79 ========.;; Copy
0050: 72 69 67 68 74 20 32 30 30 36 2d 32 30 31 31 2c right 2006-2011,
0060: 20 4d 61 74 74 68 65 77 20 57 65 6c 6c 61 6e 64 Matthew Welland
0070: 2e 0a 3b 3b 20 0a 3b 3b 20 20 54 68 69 73 20 70 ..;; .;; This p
0080: 72 6f 67 72 61 6d 20 69 73 20 6d 61 64 65 20 61 rogram is made a
0090: 76 61 69 6c 61 62 6c 65 20 75 6e 64 65 72 20 74 vailable under t
00a0: 68 65 20 47 4e 55 20 47 50 4c 20 76 65 72 73 69 he GNU GPL versi
00b0: 6f 6e 20 32 2e 30 20 6f 72 0a 3b 3b 20 20 67 72 on 2.0 or.;; gr
00c0: 65 61 74 65 72 2e 20 53 65 65 20 74 68 65 20 61 eater. See the a
00d0: 63 63 6f 6d 70 61 6e 79 69 6e 67 20 66 69 6c 65 ccompanying file
00e0: 20 43 4f 50 59 49 4e 47 20 66 6f 72 20 64 65 74 COPYING for det
00f0: 61 69 6c 73 2e 0a 3b 3b 20 0a 3b 3b 20 20 54 68 ails..;; .;; Th
0100: 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 is program is di
0110: 73 74 72 69 62 75 74 65 64 20 57 49 54 48 4f 55 stributed WITHOU
0120: 54 20 41 4e 59 20 57 41 52 52 41 4e 54 59 3b 20 T ANY WARRANTY;
0130: 77 69 74 68 6f 75 74 20 65 76 65 6e 20 74 68 65 without even the
0140: 0a 3b 3b 20 20 69 6d 70 6c 69 65 64 20 77 61 72 .;; implied war
0150: 72 61 6e 74 79 20 6f 66 20 4d 45 52 43 48 41 4e ranty of MERCHAN
0160: 54 41 42 49 4c 49 54 59 20 6f 72 20 46 49 54 4e TABILITY or FITN
0170: 45 53 53 20 46 4f 52 20 41 20 50 41 52 54 49 43 ESS FOR A PARTIC
0180: 55 4c 41 52 0a 3b 3b 20 20 50 55 52 50 4f 53 45 ULAR.;; PURPOSE
0190: 2e 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ..;;============
01a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
01b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
01c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
01d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 3d 3d ==========..;;==
01e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
01f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0200: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0210: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0220: 3d 3d 3d 3d 0a 3b 3b 20 44 61 74 61 62 61 73 65 ====.;; Database
0230: 20 61 63 63 65 73 73 0a 3b 3b 3d 3d 3d 3d 3d 3d access.;;======
0240: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0250: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0260: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0270: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0280: 0a 0a 28 75 73 65 20 73 71 6c 69 74 65 33 20 73 ..(use sqlite3 s
0290: 72 66 69 2d 31 20 70 6f 73 69 78 20 72 65 67 65 rfi-1 posix rege
02a0: 78 20 72 65 67 65 78 2d 63 61 73 65 20 73 72 66 x regex-case srf
02b0: 69 2d 36 39 20 63 73 76 2d 78 6d 6c 29 0a 28 69 i-69 csv-xml).(i
02c0: 6d 70 6f 72 74 20 28 70 72 65 66 69 78 20 73 71 mport (prefix sq
02d0: 6c 69 74 65 33 20 73 71 6c 69 74 65 33 3a 29 29 lite3 sqlite3:))
02e0: 0a 0a 28 64 65 63 6c 61 72 65 20 28 75 6e 69 74 ..(declare (unit
02f0: 20 64 62 29 29 0a 28 64 65 63 6c 61 72 65 20 28 db)).(declare (
0300: 75 73 65 73 20 63 6f 6d 6d 6f 6e 29 29 0a 28 64 uses common)).(d
0310: 65 63 6c 61 72 65 20 28 75 73 65 73 20 6b 65 79 eclare (uses key
0320: 73 29 29 0a 28 64 65 63 6c 61 72 65 20 28 75 73 s)).(declare (us
0330: 65 73 20 6f 64 73 29 29 0a 0a 28 69 6e 63 6c 75 es ods))..(inclu
0340: 64 65 20 22 63 6f 6d 6d 6f 6e 5f 72 65 63 6f 72 de "common_recor
0350: 64 73 2e 73 63 6d 22 29 0a 28 69 6e 63 6c 75 64 ds.scm").(includ
0360: 65 20 22 64 62 5f 72 65 63 6f 72 64 73 2e 73 63 e "db_records.sc
0370: 6d 22 29 0a 28 69 6e 63 6c 75 64 65 20 22 6b 65 m").(include "ke
0380: 79 5f 72 65 63 6f 72 64 73 2e 73 63 6d 22 29 0a y_records.scm").
0390: 0a 28 64 65 66 69 6e 65 20 28 6f 70 65 6e 2d 64 .(define (open-d
03a0: 62 29 20 3b 3b 20 20 28 63 6f 6e 63 20 2a 74 6f b) ;; (conc *to
03b0: 70 70 61 74 68 2a 20 22 2f 6d 65 67 61 74 65 73 ppath* "/megates
03c0: 74 2e 64 62 22 29 20 28 63 61 72 20 2a 63 6f 6e t.db") (car *con
03d0: 66 69 67 69 6e 66 6f 2a 29 29 29 0a 20 20 28 6c figinfo*))). (l
03e0: 65 74 2a 20 28 28 64 62 70 61 74 68 20 20 20 20 et* ((dbpath
03f0: 28 63 6f 6e 63 20 2a 74 6f 70 70 61 74 68 2a 20 (conc *toppath*
0400: 22 2f 6d 65 67 61 74 65 73 74 2e 64 62 22 29 29 "/megatest.db"))
0410: 20 3b 3b 20 66 6e 61 6d 65 29 0a 09 20 28 63 6f ;; fname).. (co
0420: 6e 66 69 67 64 61 74 20 28 63 61 72 20 2a 63 6f nfigdat (car *co
0430: 6e 66 69 67 69 6e 66 6f 2a 29 29 0a 09 20 28 64 nfiginfo*)).. (d
0440: 62 65 78 69 73 74 73 20 20 28 66 69 6c 65 2d 65 bexists (file-e
0450: 78 69 73 74 73 3f 20 64 62 70 61 74 68 29 29 0a xists? dbpath)).
0460: 09 20 28 64 62 20 20 20 20 20 20 20 20 28 73 71 . (db (sq
0470: 6c 69 74 65 33 3a 6f 70 65 6e 2d 64 61 74 61 62 lite3:open-datab
0480: 61 73 65 20 64 62 70 61 74 68 29 29 20 3b 3b 20 ase dbpath)) ;;
0490: 28 6e 65 76 65 72 2d 67 69 76 65 2d 75 70 2d 6f (never-give-up-o
04a0: 70 65 6e 2d 64 62 20 64 62 70 61 74 68 29 29 0a pen-db dbpath)).
04b0: 09 20 28 68 61 6e 64 6c 65 72 20 20 20 28 6d 61 . (handler (ma
04c0: 6b 65 2d 62 75 73 79 2d 74 69 6d 65 6f 75 74 20 ke-busy-timeout
04d0: 33 36 30 30 30 29 29 29 0a 20 20 20 20 28 73 71 36000))). (sq
04e0: 6c 69 74 65 33 3a 73 65 74 2d 62 75 73 79 2d 68 lite3:set-busy-h
04f0: 61 6e 64 6c 65 72 21 20 64 62 20 68 61 6e 64 6c andler! db handl
0500: 65 72 29 0a 20 20 20 20 28 69 66 20 28 6e 6f 74 er). (if (not
0510: 20 64 62 65 78 69 73 74 73 29 0a 09 28 6c 65 74 dbexists)..(let
0520: 2a 20 28 28 6b 65 79 73 20 20 20 20 20 28 63 6f * ((keys (co
0530: 6e 66 69 67 2d 67 65 74 2d 66 69 65 6c 64 73 20 nfig-get-fields
0540: 63 6f 6e 66 69 67 64 61 74 29 29 0a 09 20 20 20 configdat))..
0550: 20 20 20 20 28 68 61 76 65 6b 65 79 73 20 28 3e (havekeys (>
0560: 20 28 6c 65 6e 67 74 68 20 6b 65 79 73 29 20 30 (length keys) 0
0570: 29 29 0a 09 20 20 20 20 20 20 20 28 6b 65 79 73 )).. (keys
0580: 74 72 20 20 20 28 6b 65 79 73 2d 3e 6b 65 79 73 tr (keys->keys
0590: 74 72 20 6b 65 79 73 29 29 0a 09 20 20 20 20 20 tr keys))..
05a0: 20 20 28 66 69 65 6c 64 73 74 72 20 28 6b 65 79 (fieldstr (key
05b0: 73 2d 3e 6b 65 79 2f 66 69 65 6c 64 20 6b 65 79 s->key/field key
05c0: 73 29 29 29 0a 09 20 20 28 66 6f 72 2d 65 61 63 s))).. (for-eac
05d0: 68 20 28 6c 61 6d 62 64 61 20 28 6b 65 79 29 0a h (lambda (key).
05e0: 09 09 20 20 20 20 20 20 28 6c 65 74 20 28 28 6b .. (let ((k
05f0: 65 79 6e 20 28 76 65 63 74 6f 72 2d 72 65 66 20 eyn (vector-ref
0600: 6b 65 79 20 30 29 29 29 0a 09 09 09 28 69 66 20 key 0)))....(if
0610: 28 6d 65 6d 62 65 72 20 28 73 74 72 69 6e 67 2d (member (string-
0620: 64 6f 77 6e 63 61 73 65 20 6b 65 79 6e 29 0a 09 downcase keyn)..
0630: 09 09 09 20 20 20 20 20 28 6c 69 73 74 20 22 72 ... (list "r
0640: 75 6e 6e 61 6d 65 22 20 22 73 74 61 74 65 22 20 unname" "state"
0650: 22 73 74 61 74 75 73 22 20 22 6f 77 6e 65 72 22 "status" "owner"
0660: 20 22 65 76 65 6e 74 5f 74 69 6d 65 22 20 22 63 "event_time" "c
0670: 6f 6d 6d 65 6e 74 22 20 22 66 61 69 6c 5f 63 6f omment" "fail_co
0680: 75 6e 74 22 0a 09 09 09 09 09 20 20 20 22 70 61 unt"...... "pa
0690: 73 73 5f 63 6f 75 6e 74 22 29 29 0a 09 09 09 20 ss_count"))....
06a0: 20 20 20 28 62 65 67 69 6e 0a 09 09 09 20 20 20 (begin....
06b0: 20 20 20 28 70 72 69 6e 74 20 22 45 52 52 4f 52 (print "ERROR
06c0: 3a 20 79 6f 75 72 20 6b 65 79 20 63 61 6e 6e 6f : your key canno
06d0: 74 20 62 65 20 6e 61 6d 65 64 20 22 20 6b 65 79 t be named " key
06e0: 6e 20 22 20 61 73 20 74 68 69 73 20 63 6f 6e 66 n " as this conf
06f0: 6c 69 63 74 73 20 77 69 74 68 20 74 68 65 20 73 licts with the s
0700: 61 6d 65 20 6e 61 6d 65 64 20 66 69 65 6c 64 20 ame named field
0710: 69 6e 20 74 68 65 20 72 75 6e 73 20 74 61 62 6c in the runs tabl
0720: 65 22 29 0a 09 09 09 20 20 20 20 20 20 28 73 79 e").... (sy
0730: 73 74 65 6d 20 28 63 6f 6e 63 20 22 72 6d 20 2d stem (conc "rm -
0740: 66 20 22 20 64 62 70 61 74 68 29 29 0a 09 09 09 f " dbpath))....
0750: 20 20 20 20 20 20 28 65 78 69 74 20 31 29 29 29 (exit 1)))
0760: 29 29 0a 09 09 20 20 20 20 6b 65 79 73 29 0a 09 ))... keys)..
0770: 20 20 3b 3b 20 28 73 71 6c 69 74 65 33 3a 65 78 ;; (sqlite3:ex
0780: 65 63 75 74 65 20 64 62 20 22 50 52 41 47 4d 41 ecute db "PRAGMA
0790: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4f synchronous = O
07a0: 46 46 3b 22 29 0a 09 20 20 28 73 71 6c 69 74 65 FF;").. (sqlite
07b0: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 43 52 3:execute db "CR
07c0: 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f EATE TABLE IF NO
07d0: 54 20 45 58 49 53 54 53 20 6b 65 79 73 20 28 69 T EXISTS keys (i
07e0: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR
07f0: 59 20 4b 45 59 2c 20 66 69 65 6c 64 6e 61 6d 65 Y KEY, fieldname
0800: 20 54 45 58 54 2c 20 66 69 65 6c 64 74 79 70 65 TEXT, fieldtype
0810: 20 54 45 58 54 2c 20 43 4f 4e 53 54 52 41 49 4e TEXT, CONSTRAIN
0820: 54 20 6b 65 79 63 6f 6e 73 74 72 61 69 6e 74 20 T keyconstraint
0830: 55 4e 49 51 55 45 20 28 66 69 65 6c 64 6e 61 6d UNIQUE (fieldnam
0840: 65 29 29 3b 22 29 0a 09 20 20 28 66 6f 72 2d 65 e));").. (for-e
0850: 61 63 68 20 28 6c 61 6d 62 64 61 20 28 6b 65 79 ach (lambda (key
0860: 29 0a 09 09 20 20 20 20 20 20 28 73 71 6c 69 74 )... (sqlit
0870: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 49 e3:execute db "I
0880: 4e 53 45 52 54 20 49 4e 54 4f 20 6b 65 79 73 20 NSERT INTO keys
0890: 28 66 69 65 6c 64 6e 61 6d 65 2c 66 69 65 6c 64 (fieldname,field
08a0: 74 79 70 65 29 20 56 41 4c 55 45 53 20 28 3f 2c type) VALUES (?,
08b0: 3f 29 3b 22 20 28 6b 65 79 3a 67 65 74 2d 66 69 ?);" (key:get-fi
08c0: 65 6c 64 6e 61 6d 65 20 6b 65 79 29 28 6b 65 79 eldname key)(key
08d0: 3a 67 65 74 2d 66 69 65 6c 64 74 79 70 65 20 6b :get-fieldtype k
08e0: 65 79 29 29 29 0a 09 09 20 20 20 20 6b 65 79 73 ey)))... keys
08f0: 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65 78 ).. (sqlite3:ex
0900: 65 63 75 74 65 20 64 62 20 28 63 6f 6e 63 20 0a ecute db (conc .
0910: 09 09 09 20 20 20 20 22 43 52 45 41 54 45 20 54 ... "CREATE T
0920: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 ABLE IF NOT EXIS
0930: 54 53 20 72 75 6e 73 20 28 69 64 20 49 4e 54 45 TS runs (id INTE
0940: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c GER PRIMARY KEY,
0950: 20 22 20 0a 09 09 09 20 20 20 20 66 69 65 6c 64 " .... field
0960: 73 74 72 20 28 69 66 20 68 61 76 65 6b 65 79 73 str (if havekeys
0970: 20 22 2c 22 20 22 22 29 0a 09 09 09 20 20 20 20 "," "")....
0980: 22 72 75 6e 6e 61 6d 65 20 54 45 58 54 2c 22 0a "runname TEXT,".
0990: 09 09 09 20 20 20 20 22 73 74 61 74 65 20 54 45 ... "state TE
09a0: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 22 0a XT DEFAULT '',".
09b0: 09 09 09 20 20 20 20 22 73 74 61 74 75 73 20 54 ... "status T
09c0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 22 EXT DEFAULT '',"
09d0: 0a 09 09 09 20 20 20 20 22 6f 77 6e 65 72 20 54 .... "owner T
09e0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 22 EXT DEFAULT '',"
09f0: 0a 09 09 09 20 20 20 20 22 65 76 65 6e 74 5f 74 .... "event_t
0a00: 69 6d 65 20 54 49 4d 45 53 54 41 4d 50 2c 22 0a ime TIMESTAMP,".
0a10: 09 09 09 20 20 20 20 22 63 6f 6d 6d 65 6e 74 20 ... "comment
0a20: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c TEXT DEFAULT '',
0a30: 22 0a 09 09 09 20 20 20 20 22 66 61 69 6c 5f 63 ".... "fail_c
0a40: 6f 75 6e 74 20 49 4e 54 45 47 45 52 20 44 45 46 ount INTEGER DEF
0a50: 41 55 4c 54 20 30 2c 22 0a 09 09 09 20 20 20 20 AULT 0,"....
0a60: 22 70 61 73 73 5f 63 6f 75 6e 74 20 49 4e 54 45 "pass_count INTE
0a70: 47 45 52 20 44 45 46 41 55 4c 54 20 30 2c 22 0a GER DEFAULT 0,".
0a80: 09 09 09 20 20 20 20 22 43 4f 4e 53 54 52 41 49 ... "CONSTRAI
0a90: 4e 54 20 72 75 6e 73 63 6f 6e 73 74 72 61 69 6e NT runsconstrain
0aa0: 74 20 55 4e 49 51 55 45 20 28 72 75 6e 6e 61 6d t UNIQUE (runnam
0ab0: 65 22 20 28 69 66 20 68 61 76 65 6b 65 79 73 20 e" (if havekeys
0ac0: 22 2c 22 20 22 22 29 20 6b 65 79 73 74 72 20 22 "," "") keystr "
0ad0: 29 29 3b 22 29 29 0a 09 20 20 28 73 71 6c 69 74 ));")).. (sqlit
0ae0: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 28 63 e3:execute db (c
0af0: 6f 6e 63 20 22 43 52 45 41 54 45 20 49 4e 44 45 onc "CREATE INDE
0b00: 58 20 72 75 6e 73 5f 69 6e 64 65 78 20 4f 4e 20 X runs_index ON
0b10: 72 75 6e 73 20 28 72 75 6e 6e 61 6d 65 22 20 28 runs (runname" (
0b20: 69 66 20 68 61 76 65 6b 65 79 73 20 22 2c 22 20 if havekeys ","
0b30: 22 22 29 20 6b 65 79 73 74 72 20 22 29 3b 22 29 "") keystr ");")
0b40: 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65 78 ).. (sqlite3:ex
0b50: 65 63 75 74 65 20 64 62 20 0a 20 20 20 20 20 20 ecute db .
0b60: 20 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 "CREA
0b70: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 TE TABLE IF NOT
0b80: 45 58 49 53 54 53 20 74 65 73 74 73 20 0a 20 20 EXISTS tests .
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0ba0: 20 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 (id INTEGER PR
0bb0: 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 IMARY KEY,.
0bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0bd0: 72 75 6e 5f 69 64 20 20 20 20 20 49 4e 54 45 47 run_id INTEG
0be0: 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 ER,.
0bf0: 20 20 20 20 20 20 20 20 20 74 65 73 74 6e 61 6d testnam
0c00: 65 20 20 20 54 45 58 54 2c 0a 20 20 20 20 20 20 e TEXT,.
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68 h
0c20: 6f 73 74 20 20 20 20 20 20 20 54 45 58 54 20 44 ost TEXT D
0c30: 45 46 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20 20 EFAULT 'n/a',.
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0c50: 20 20 20 63 70 75 6c 6f 61 64 20 20 20 20 52 45 cpuload RE
0c60: 41 4c 20 44 45 46 41 55 4c 54 20 2d 31 2c 0a 20 AL DEFAULT -1,.
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0c80: 20 20 20 20 64 69 73 6b 66 72 65 65 20 20 20 49 diskfree I
0c90: 4e 54 45 47 45 52 20 44 45 46 41 55 4c 54 20 2d NTEGER DEFAULT -
0ca0: 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 1,.
0cb0: 20 20 20 20 20 20 20 20 75 6e 61 6d 65 20 20 20 uname
0cc0: 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 TEXT DEFAULT
0cd0: 27 6e 2f 61 27 2c 20 0a 20 20 20 20 20 20 20 20 'n/a', .
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 75 6e run
0cf0: 64 69 72 20 20 20 20 20 54 45 58 54 20 44 45 46 dir TEXT DEF
0d00: 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20 20 20 20 AULT 'n/a',.
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0d20: 20 73 68 6f 72 74 64 69 72 20 20 20 54 45 58 54 shortdir TEXT
0d30: 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 DEFAULT '',.
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0d50: 20 20 69 74 65 6d 5f 70 61 74 68 20 20 54 45 58 item_path TEX
0d60: 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 T DEFAULT '',.
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0d80: 20 20 20 73 74 61 74 65 20 20 20 20 20 20 54 45 state TE
0d90: 58 54 20 44 45 46 41 55 4c 54 20 27 4e 4f 54 5f XT DEFAULT 'NOT_
0da0: 53 54 41 52 54 45 44 27 2c 0a 20 20 20 20 20 20 STARTED',.
0db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 s
0dc0: 74 61 74 75 73 20 20 20 20 20 54 45 58 54 20 44 tatus TEXT D
0dd0: 45 46 41 55 4c 54 20 27 46 41 49 4c 27 2c 0a 20 EFAULT 'FAIL',.
0de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0df0: 20 20 20 20 61 74 74 65 6d 70 74 6e 75 6d 20 49 attemptnum I
0e00: 4e 54 45 47 45 52 20 44 45 46 41 55 4c 54 20 30 NTEGER DEFAULT 0
0e10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
0e20: 20 20 20 20 20 20 20 66 69 6e 61 6c 5f 6c 6f 67 final_log
0e30: 66 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 f TEXT DEFAULT '
0e40: 6c 6f 67 73 2f 66 69 6e 61 6c 2e 6c 6f 67 27 2c logs/final.log',
0e50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
0e60: 20 20 20 20 20 20 6c 6f 67 64 61 74 20 20 20 20 logdat
0e70: 20 42 4c 4f 42 2c 20 0a 20 20 20 20 20 20 20 20 BLOB, .
0e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 75 6e run
0e90: 5f 64 75 72 61 74 69 6f 6e 20 49 4e 54 45 47 45 _duration INTEGE
0ea0: 52 20 44 45 46 41 55 4c 54 20 30 2c 0a 20 20 20 R DEFAULT 0,.
0eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0ec0: 20 20 63 6f 6d 6d 65 6e 74 20 20 20 20 54 45 58 comment TEX
0ed0: 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 T DEFAULT '',.
0ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0ef0: 20 20 20 65 76 65 6e 74 5f 74 69 6d 65 20 54 49 event_time TI
0f00: 4d 45 53 54 41 4d 50 2c 0a 20 20 20 20 20 20 20 MESTAMP,.
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 61 fa
0f20: 69 6c 5f 63 6f 75 6e 74 20 49 4e 54 45 47 45 52 il_count INTEGER
0f30: 20 44 45 46 41 55 4c 54 20 30 2c 0a 20 20 20 20 DEFAULT 0,.
0f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0f50: 20 70 61 73 73 5f 63 6f 75 6e 74 20 49 4e 54 45 pass_count INTE
0f60: 47 45 52 20 44 45 46 41 55 4c 54 20 30 2c 0a 20 GER DEFAULT 0,.
0f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0f80: 20 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 CONSTRAINT t
0f90: 65 73 74 73 63 6f 6e 73 74 72 61 69 6e 74 20 55 estsconstraint U
0fa0: 4e 49 51 55 45 20 28 72 75 6e 5f 69 64 2c 20 74 NIQUE (run_id, t
0fb0: 65 73 74 6e 61 6d 65 2c 20 69 74 65 6d 5f 70 61 estname, item_pa
0fc0: 74 68 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b th). );
0fd0: 22 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65 ").. (sqlite3:e
0fe0: 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 54 xecute db "CREAT
0ff0: 45 20 49 4e 44 45 58 20 74 65 73 74 73 5f 69 6e E INDEX tests_in
1000: 64 65 78 20 4f 4e 20 74 65 73 74 73 20 28 72 75 dex ON tests (ru
1010: 6e 5f 69 64 2c 20 74 65 73 74 6e 61 6d 65 29 3b n_id, testname);
1020: 22 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65 ").. (sqlite3:e
1030: 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 54 xecute db "CREAT
1040: 45 20 56 49 45 57 20 72 75 6e 73 5f 74 65 73 74 E VIEW runs_test
1050: 73 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 s AS SELECT * FR
1060: 4f 4d 20 72 75 6e 73 20 49 4e 4e 45 52 20 4a 4f OM runs INNER JO
1070: 49 4e 20 74 65 73 74 73 20 4f 4e 20 72 75 6e 73 IN tests ON runs
1080: 2e 69 64 3d 74 65 73 74 73 2e 72 75 6e 5f 69 64 .id=tests.run_id
1090: 3b 22 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a ;").. (sqlite3:
10a0: 65 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 execute db "CREA
10b0: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 TE TABLE IF NOT
10c0: 45 58 49 53 54 53 20 74 65 73 74 5f 73 74 65 70 EXISTS test_step
10d0: 73 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 s .
10e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
10f0: 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 (id INTEGER PRI
1100: 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 20 MARY KEY,.
1110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1120: 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 69 64 test_id
1130: 20 49 4e 54 45 47 45 52 2c 20 0a 20 20 20 20 20 INTEGER, .
1140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1150: 20 20 20 20 20 20 20 20 20 20 73 74 65 70 6e 61 stepna
1160: 6d 65 20 54 45 58 54 2c 20 0a 20 20 20 20 20 20 me TEXT, .
1170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1180: 20 20 20 20 20 20 20 20 20 73 74 61 74 65 20 54 state T
1190: 45 58 54 20 44 45 46 41 55 4c 54 20 27 4e 4f 54 EXT DEFAULT 'NOT
11a0: 5f 53 54 41 52 54 45 44 27 2c 20 0a 20 20 20 20 _STARTED', .
11b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11c0: 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 75 statu
11d0: 73 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 s TEXT DEFAULT '
11e0: 6e 2f 61 27 2c 0a 20 20 20 20 20 20 20 20 20 20 n/a',.
11f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1200: 20 20 20 20 20 65 76 65 6e 74 5f 74 69 6d 65 20 event_time
1210: 54 49 4d 45 53 54 41 4d 50 2c 0a 20 20 20 20 20 TIMESTAMP,.
1220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1230: 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 65 6e commen
1240: 74 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 t TEXT DEFAULT '
1250: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ',.
1260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1270: 20 20 6c 6f 67 66 69 6c 65 20 54 45 58 54 2c 0a logfile TEXT,.
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 C
12a0: 4f 4e 53 54 52 41 49 4e 54 20 74 65 73 74 5f 73 ONSTRAINT test_s
12b0: 74 65 70 73 5f 63 6f 6e 73 74 72 61 69 6e 74 20 teps_constraint
12c0: 55 4e 49 51 55 45 20 28 74 65 73 74 5f 69 64 2c UNIQUE (test_id,
12d0: 73 74 65 70 6e 61 6d 65 2c 73 74 61 74 65 29 29 stepname,state))
12e0: 3b 22 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a ;").. (sqlite3:
12f0: 65 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 execute db "CREA
1300: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 TE TABLE IF NOT
1310: 45 58 49 53 54 53 20 65 78 74 72 61 64 61 74 20 EXISTS extradat
1320: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM
1330: 41 52 59 20 4b 45 59 2c 20 72 75 6e 5f 69 64 20 ARY KEY, run_id
1340: 49 4e 54 45 47 45 52 2c 20 6b 65 79 20 54 45 58 INTEGER, key TEX
1350: 54 2c 20 76 61 6c 20 54 45 58 54 29 3b 22 29 0a T, val TEXT);").
1360: 09 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 . (sqlite3:exec
1370: 75 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54 ute db "CREATE T
1380: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 ABLE IF NOT EXIS
1390: 54 53 20 6d 65 74 61 64 61 74 20 28 69 64 20 49 TS metadat (id I
13a0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b NTEGER PRIMARY K
13b0: 45 59 2c 20 76 61 72 20 54 45 58 54 2c 20 76 61 EY, var TEXT, va
13c0: 6c 20 54 45 58 54 2c 0a 20 20 20 20 20 20 20 20 l TEXT,.
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13e0: 20 20 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52 CONSTR
13f0: 41 49 4e 54 20 6d 65 74 61 64 61 74 5f 63 6f 6e AINT metadat_con
1400: 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28 straint UNIQUE (
1410: 76 61 72 29 29 3b 22 29 0a 09 20 20 28 73 71 6c var));").. (sql
1420: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 ite3:execute db
1430: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 "CREATE TABLE IF
1440: 20 4e 4f 54 20 45 58 49 53 54 53 20 61 63 63 65 NOT EXISTS acce
1450: 73 73 5f 6c 6f 67 20 28 69 64 20 49 4e 54 45 47 ss_log (id INTEG
1460: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY,
1470: 75 73 65 72 20 54 45 58 54 2c 20 61 63 63 65 73 user TEXT, acces
1480: 73 65 64 20 54 49 4d 45 53 54 41 4d 50 2c 20 61 sed TIMESTAMP, a
1490: 72 67 73 20 54 45 58 54 29 3b 22 29 0a 09 20 20 rgs TEXT);")..
14a0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 (sqlite3:execute
14b0: 20 64 62 20 22 43 52 45 41 54 45 20 54 41 42 4c db "CREATE TABL
14c0: 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 E IF NOT EXISTS
14d0: 74 65 73 74 5f 6d 65 74 61 20 28 69 64 20 49 4e test_meta (id IN
14e0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE
14f0: 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 Y,.
1500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1510: 20 20 20 20 20 20 20 20 74 65 73 74 6e 61 6d 65 testname
1520: 20 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 TEXT DEFAULT
1530: 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 '',.
1540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1550: 20 20 20 20 20 20 20 20 20 20 61 75 74 68 6f 72 author
1560: 20 20 20 20 20 20 54 45 58 54 20 44 45 46 41 55 TEXT DEFAU
1570: 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 LT '',.
1580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1590: 20 20 20 20 20 20 20 20 20 20 20 20 6f 77 6e 65 owne
15a0: 72 20 20 20 20 20 20 20 54 45 58 54 20 44 45 46 r TEXT DEF
15b0: 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 AULT '',.
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65 de
15e0: 73 63 72 69 70 74 69 6f 6e 20 54 45 58 54 20 44 scription TEXT D
15f0: 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 EFAULT '',.
1600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1620: 72 65 76 69 65 77 65 64 20 20 20 20 54 49 4d 45 reviewed TIME
1630: 53 54 41 4d 50 2c 0a 20 20 20 20 20 20 20 20 20 STAMP,.
1640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1650: 20 20 20 20 20 20 20 20 20 20 20 20 69 74 65 72 iter
1660: 61 74 65 64 20 20 20 20 54 45 58 54 20 44 45 46 ated TEXT DEF
1670: 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 AULT '',.
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 76 av
16a0: 67 5f 72 75 6e 74 69 6d 65 20 52 45 41 4c 2c 0a g_runtime REAL,.
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16d0: 20 20 20 20 20 61 76 67 5f 64 69 73 6b 20 20 20 avg_disk
16e0: 20 52 45 41 4c 2c 0a 20 20 20 20 20 20 20 20 20 REAL,.
16f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1700: 20 20 20 20 20 20 20 20 20 20 20 20 74 61 67 73 tags
1710: 20 20 20 20 20 20 20 20 54 45 58 54 20 44 45 46 TEXT DEF
1720: 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 AULT '',.
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1740: 20 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52 41 CONSTRA
1750: 49 4e 54 20 74 65 73 74 5f 6d 65 74 61 5f 63 6f INT test_meta_co
1760: 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20 nstraint UNIQUE
1770: 28 74 65 73 74 6e 61 6d 65 29 29 3b 22 29 0a 09 (testname));")..
1780: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 (sqlite3:execu
1790: 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41 te db "CREATE TA
17a0: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 BLE IF NOT EXIST
17b0: 53 20 74 65 73 74 5f 64 61 74 61 20 28 69 64 20 S test_data (id
17c0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 INTEGER PRIMARY
17d0: 4b 45 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 KEY,.
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17f0: 20 20 20 20 20 74 65 73 74 5f 69 64 20 49 4e 54 test_id INT
1800: 45 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 EGER,.
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1820: 20 20 20 20 20 20 63 61 74 65 67 6f 72 79 20 54 category T
1830: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a EXT DEFAULT '',.
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1860: 76 61 72 69 61 62 6c 65 20 54 45 58 54 2c 0a 09 variable TEXT,..
1870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1880: 20 20 20 20 20 20 20 20 76 61 6c 75 65 20 52 45 value RE
1890: 41 4c 2c 0a 09 20 20 20 20 20 20 20 20 20 20 20 AL,..
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70 exp
18b0: 65 63 74 65 64 20 52 45 41 4c 2c 0a 09 20 20 20 ected REAL,..
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
18d0: 20 20 20 20 20 74 6f 6c 20 52 45 41 4c 2c 0a 20 tol REAL,.
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 u
1900: 6e 69 74 73 20 54 45 58 54 2c 0a 20 20 20 20 20 nits TEXT,.
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1920: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 65 comme
1930: 6e 74 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 nt TEXT DEFAULT
1940: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 '',.
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1960: 20 20 20 20 73 74 61 74 75 73 20 54 45 58 54 20 status TEXT
1970: 44 45 46 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20 DEFAULT 'n/a',.
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 t
19a0: 79 70 65 20 54 45 58 54 20 44 45 46 41 55 4c 54 ype TEXT DEFAULT
19b0: 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 '',.
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
19d0: 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 65 CONSTRAINT te
19e0: 73 74 5f 64 61 74 61 5f 63 6f 6e 73 74 72 61 69 st_data_constrai
19f0: 6e 74 20 55 4e 49 51 55 45 20 28 74 65 73 74 5f nt UNIQUE (test_
1a00: 69 64 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 69 id,category,vari
1a10: 61 62 6c 65 29 29 3b 22 29 0a 09 20 20 3b 3b 20 able));").. ;;
1a20: 4d 75 73 74 20 64 6f 20 74 68 69 73 20 2a 61 66 Must do this *af
1a30: 74 65 72 2a 20 72 75 6e 6e 69 6e 67 20 70 61 74 ter* running pat
1a40: 63 68 20 64 62 20 21 21 20 4e 6f 20 6d 6f 72 65 ch db !! No more
1a50: 2e 20 0a 09 20 20 28 64 62 3a 73 65 74 2d 76 61 . .. (db:set-va
1a60: 72 20 64 62 20 22 4d 45 47 41 54 45 53 54 5f 56 r db "MEGATEST_V
1a70: 45 52 53 49 4f 4e 22 20 6d 65 67 61 74 65 73 74 ERSION" megatest
1a80: 2d 76 65 72 73 69 6f 6e 29 0a 09 20 20 29 29 0a -version).. )).
1a90: 20 20 20 20 64 62 29 29 0a 0a 3b 3b 3d 3d 3d 3d db))..;;====
1aa0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1ab0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1ac0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1ad0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1ae0: 3d 3d 0a 3b 3b 20 54 4f 44 4f 3a 0a 3b 3b 20 20 ==.;; TODO:.;;
1af0: 20 70 75 74 20 64 65 6c 74 61 73 20 69 6e 74 6f put deltas into
1b00: 20 61 6e 20 61 73 73 6f 63 20 6c 69 73 74 20 77 an assoc list w
1b10: 69 74 68 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 ith version numb
1b20: 65 72 73 0a 3b 3b 20 20 20 61 70 70 6c 79 20 61 ers.;; apply a
1b30: 6c 6c 20 66 72 6f 6d 20 6c 61 73 74 20 74 6f 20 ll from last to
1b40: 63 75 72 72 65 6e 74 0a 3b 3b 3d 3d 3d 3d 3d 3d current.;;======
1b50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1b60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1b70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1b80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1b90: 0a 28 64 65 66 69 6e 65 20 28 70 61 74 63 68 2d .(define (patch-
1ba0: 64 62 20 64 62 29 0a 20 20 28 68 61 6e 64 6c 65 db db). (handle
1bb0: 2d 65 78 63 65 70 74 69 6f 6e 73 0a 20 20 20 65 -exceptions. e
1bc0: 78 6e 0a 20 20 20 28 62 65 67 69 6e 0a 20 20 20 xn. (begin.
1bd0: 20 20 28 70 72 69 6e 74 20 22 45 78 63 65 70 74 (print "Except
1be0: 69 6f 6e 3a 20 22 20 65 78 6e 29 0a 20 20 20 20 ion: " exn).
1bf0: 20 28 70 72 69 6e 74 20 22 45 52 52 4f 52 3a 20 (print "ERROR:
1c00: 50 6f 73 73 69 62 6c 65 20 6f 75 74 20 6f 66 20 Possible out of
1c10: 64 61 74 65 20 73 63 68 65 6d 61 2c 20 61 74 74 date schema, att
1c20: 65 6d 70 74 69 6e 67 20 74 6f 20 61 64 64 20 74 empting to add t
1c30: 61 62 6c 65 20 6d 65 74 61 64 61 74 61 2e 2e 2e able metadata...
1c40: 22 29 0a 20 20 20 20 20 28 73 71 6c 69 74 65 33 "). (sqlite3
1c50: 3a 65 78 65 63 75 74 65 20 64 62 20 22 43 52 45 :execute db "CRE
1c60: 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 ATE TABLE IF NOT
1c70: 20 45 58 49 53 54 53 20 6d 65 74 61 64 61 74 20 EXISTS metadat
1c80: 28 69 64 20 49 4e 54 45 47 45 52 2c 20 76 61 72 (id INTEGER, var
1c90: 20 54 45 58 54 2c 20 76 61 6c 20 54 45 58 54 2c TEXT, val TEXT,
1ca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1cc0: 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 6d 65 74 CONSTRAINT met
1cd0: 61 64 61 74 5f 63 6f 6e 73 74 72 61 69 6e 74 20 adat_constraint
1ce0: 55 4e 49 51 55 45 20 28 76 61 72 29 29 3b 22 29 UNIQUE (var));")
1cf0: 0a 20 20 20 20 20 28 69 66 20 28 6e 6f 74 20 28 . (if (not (
1d00: 64 62 3a 67 65 74 2d 76 61 72 20 64 62 20 22 4d db:get-var db "M
1d10: 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 EGATEST_VERSION"
1d20: 29 29 0a 09 20 28 64 62 3a 73 65 74 2d 76 61 72 )).. (db:set-var
1d30: 20 64 62 20 22 4d 45 47 41 54 45 53 54 5f 56 45 db "MEGATEST_VE
1d40: 52 53 49 4f 4e 22 20 31 2e 31 37 29 29 29 0a 20 RSION" 1.17))).
1d50: 20 20 28 6c 65 74 20 28 28 6d 76 65 72 20 28 64 (let ((mver (d
1d60: 62 3a 67 65 74 2d 76 61 72 20 64 62 20 22 4d 45 b:get-var db "ME
1d70: 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 29 GATEST_VERSION")
1d80: 29 0a 09 20 28 74 65 73 74 2d 6d 65 74 61 2d 64 ).. (test-meta-d
1d90: 65 66 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 ef "CREATE TABLE
1da0: 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 74 IF NOT EXISTS t
1db0: 65 73 74 5f 6d 65 74 61 20 28 69 64 20 49 4e 54 est_meta (id INT
1dc0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY
1dd0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1df0: 20 20 20 20 20 20 20 74 65 73 74 6e 61 6d 65 20 testname
1e00: 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 TEXT DEFAULT
1e10: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 '',.
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e30: 20 20 20 20 20 20 20 20 20 61 75 74 68 6f 72 20 author
1e40: 20 20 20 20 20 54 45 58 54 20 44 45 46 41 55 4c TEXT DEFAUL
1e50: 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 T '',.
1e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e70: 20 20 20 20 20 20 20 20 20 20 20 6f 77 6e 65 72 owner
1e80: 20 20 20 20 20 20 20 54 45 58 54 20 44 45 46 41 TEXT DEFA
1e90: 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 ULT '',.
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65 73 des
1ec0: 63 72 69 70 74 69 6f 6e 20 54 45 58 54 20 44 45 cription TEXT DE
1ed0: 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 FAULT '',.
1ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 r
1f00: 65 76 69 65 77 65 64 20 20 20 20 54 49 4d 45 53 eviewed TIMES
1f10: 54 41 4d 50 2c 0a 20 20 20 20 20 20 20 20 20 20 TAMP,.
1f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1f30: 20 20 20 20 20 20 20 20 20 20 20 69 74 65 72 61 itera
1f40: 74 65 64 20 20 20 20 54 45 58 54 20 44 45 46 41 ted TEXT DEFA
1f50: 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 ULT '',.
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 76 67 avg
1f80: 5f 72 75 6e 74 69 6d 65 20 52 45 41 4c 2c 0a 20 _runtime REAL,.
1f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1fb0: 20 20 20 20 61 76 67 5f 64 69 73 6b 20 20 20 20 avg_disk
1fc0: 52 45 41 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 REAL,.
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1fe0: 20 20 20 20 20 20 20 20 20 20 20 74 61 67 73 20 tags
1ff0: 20 20 20 20 20 20 20 54 45 58 54 20 44 45 46 41 TEXT DEFA
2000: 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 ULT '',.
2010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2020: 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52 41 49 CONSTRAI
2030: 4e 54 20 74 65 73 74 5f 6d 65 74 61 5f 63 6f 6e NT test_meta_con
2040: 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28 straint UNIQUE (
2050: 74 65 73 74 6e 61 6d 65 29 29 3b 22 29 29 0a 20 testname));")).
2060: 20 20 20 20 28 70 72 69 6e 74 20 22 43 75 72 72 (print "Curr
2070: 65 6e 74 20 73 63 68 65 6d 61 20 76 65 72 73 69 ent schema versi
2080: 6f 6e 3a 20 22 20 6d 76 65 72 20 22 20 63 75 72 on: " mver " cur
2090: 72 65 6e 74 20 6d 65 67 61 74 65 73 74 20 76 65 rent megatest ve
20a0: 72 73 69 6f 6e 3a 20 22 20 6d 65 67 61 74 65 73 rsion: " megates
20b0: 74 2d 76 65 72 73 69 6f 6e 29 0a 20 20 20 20 20 t-version).
20c0: 28 63 6f 6e 64 0a 20 20 20 20 20 20 28 28 6e 6f (cond. ((no
20d0: 74 20 6d 76 65 72 29 0a 20 20 20 20 20 20 20 28 t mver). (
20e0: 70 72 69 6e 74 20 22 41 64 64 69 6e 67 20 6d 65 print "Adding me
20f0: 67 61 74 65 73 74 2d 76 65 72 73 69 6f 6e 20 74 gatest-version t
2100: 6f 20 6d 65 74 61 64 61 74 61 22 29 20 3b 3b 20 o metadata") ;;
2110: 4e 65 65 64 20 74 6f 20 72 65 63 72 65 61 74 65 Need to recreate
2120: 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 20 the table.
2130: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 (sqlite3:execu
2140: 74 65 20 64 62 20 22 44 52 4f 50 20 54 41 42 4c te db "DROP TABL
2150: 45 20 49 46 20 45 58 49 53 54 53 20 6d 65 74 61 E IF EXISTS meta
2160: 64 61 74 3b 22 29 0a 20 20 20 20 20 20 20 28 73 dat;"). (s
2170: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 qlite3:execute d
2180: 62 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 b "CREATE TABLE
2190: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 6d 65 IF NOT EXISTS me
21a0: 74 61 64 61 74 20 28 69 64 20 49 4e 54 45 47 45 tadat (id INTEGE
21b0: 52 2c 20 76 61 72 20 54 45 58 54 2c 20 76 61 6c R, var TEXT, val
21c0: 20 54 45 58 54 2c 0a 20 20 20 20 20 20 20 20 20 TEXT,.
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
21e0: 20 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52 41 CONSTRA
21f0: 49 4e 54 20 6d 65 74 61 64 61 74 5f 63 6f 6e 73 INT metadat_cons
2200: 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28 76 traint UNIQUE (v
2210: 61 72 29 29 3b 22 29 0a 20 20 20 20 20 20 20 28 ar));"). (
2220: 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d db:set-var db "M
2230: 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 EGATEST_VERSION"
2240: 20 31 2e 31 37 29 0a 20 20 20 20 20 20 20 28 70 1.17). (p
2250: 61 74 63 68 2d 64 62 29 29 0a 20 20 20 20 20 20 atch-db)).
2260: 28 28 3c 20 6d 76 65 72 20 31 2e 32 31 29 0a 20 ((< mver 1.21).
2270: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 (sqlite3:e
2280: 78 65 63 75 74 65 20 64 62 20 22 44 52 4f 50 20 xecute db "DROP
2290: 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 TABLE IF EXISTS
22a0: 6d 65 74 61 64 61 74 3b 22 29 0a 20 20 20 20 20 metadat;").
22b0: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 (sqlite3:execu
22c0: 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41 te db "CREATE TA
22d0: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 BLE IF NOT EXIST
22e0: 53 20 6d 65 74 61 64 61 74 20 28 69 64 20 49 4e S metadat (id IN
22f0: 54 45 47 45 52 2c 20 76 61 72 20 54 45 58 54 2c TEGER, var TEXT,
2300: 20 76 61 6c 20 54 45 58 54 2c 0a 20 20 20 20 20 val TEXT,.
2310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2320: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e CON
2330: 53 54 52 41 49 4e 54 20 6d 65 74 61 64 61 74 5f STRAINT metadat_
2340: 63 6f 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 55 constraint UNIQU
2350: 45 20 28 76 61 72 29 29 3b 22 29 0a 20 20 20 20 E (var));").
2360: 20 20 20 28 64 62 3a 73 65 74 2d 76 61 72 20 64 (db:set-var d
2370: 62 20 22 4d 45 47 41 54 45 53 54 5f 56 45 52 53 b "MEGATEST_VERS
2380: 49 4f 4e 22 20 31 2e 32 31 29 20 3b 3b 20 73 65 ION" 1.21) ;; se
2390: 74 20 62 65 66 6f 72 65 2c 20 6a 75 73 74 20 69 t before, just i
23a0: 6e 20 63 61 73 65 20 74 68 65 20 63 68 61 6e 67 n case the chang
23b0: 65 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 61 es are already a
23c0: 70 70 6c 69 65 64 0a 20 20 20 20 20 20 20 28 73 pplied. (s
23d0: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 qlite3:execute d
23e0: 62 20 74 65 73 74 2d 6d 65 74 61 2d 64 65 66 29 b test-meta-def)
23f0: 0a 20 20 20 20 20 20 20 3b 28 66 6f 72 2d 65 61 . ;(for-ea
2400: 63 68 20 0a 20 20 20 20 20 20 20 3b 20 28 6c 61 ch . ; (la
2410: 6d 62 64 61 20 28 73 74 6d 74 29 0a 20 20 20 20 mbda (stmt).
2420: 20 20 20 3b 20 20 20 28 73 71 6c 69 74 65 33 3a ; (sqlite3:
2430: 65 78 65 63 75 74 65 20 64 62 20 73 74 6d 74 29 execute db stmt)
2440: 29 0a 20 20 20 20 20 20 20 3b 20 28 6c 69 73 74 ). ; (list
2450: 20 0a 20 20 20 20 20 20 20 3b 20 20 22 41 4c 54 . ; "ALT
2460: 45 52 20 54 41 42 4c 45 20 74 65 73 74 73 20 41 ER TABLE tests A
2470: 44 44 20 43 4f 4c 55 4d 4e 20 66 69 72 73 74 5f DD COLUMN first_
2480: 65 72 72 20 54 45 58 54 3b 22 0a 20 20 20 20 20 err TEXT;".
2490: 20 20 3b 20 20 22 41 4c 54 45 52 20 54 41 42 4c ; "ALTER TABL
24a0: 45 20 74 65 73 74 73 20 41 44 44 20 43 4f 4c 55 E tests ADD COLU
24b0: 4d 4e 20 66 69 72 73 74 5f 77 61 72 6e 20 54 45 MN first_warn TE
24c0: 58 54 3b 22 0a 20 20 20 20 20 20 20 3b 20 20 29 XT;". ; )
24d0: 29 0a 20 20 20 20 20 20 20 28 70 61 74 63 68 2d ). (patch-
24e0: 64 62 29 29 0a 20 20 20 20 20 20 28 28 3c 20 6d db)). ((< m
24f0: 76 65 72 20 31 2e 32 34 29 0a 20 20 20 20 20 20 ver 1.24).
2500: 20 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 (db:set-var db
2510: 22 4d 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f "MEGATEST_VERSIO
2520: 4e 22 20 31 2e 32 34 29 0a 20 20 20 20 20 20 20 N" 1.24).
2530: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 (sqlite3:execute
2540: 20 64 62 20 22 44 52 4f 50 20 54 41 42 4c 45 20 db "DROP TABLE
2550: 49 46 20 45 58 49 53 54 53 20 74 65 73 74 5f 64 IF EXISTS test_d
2560: 61 74 61 3b 22 29 0a 20 20 20 20 20 20 20 28 73 ata;"). (s
2570: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 qlite3:execute d
2580: 62 20 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46 b "DROP TABLE IF
2590: 20 45 58 49 53 54 53 20 74 65 73 74 5f 6d 65 74 EXISTS test_met
25a0: 61 3b 22 29 0a 20 20 20 20 20 20 20 28 73 71 6c a;"). (sql
25b0: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 ite3:execute db
25c0: 74 65 73 74 2d 6d 65 74 61 2d 64 65 66 29 0a 20 test-meta-def).
25d0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 (sqlite3:e
25e0: 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 54 xecute db "CREAT
25f0: 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 E TABLE IF NOT E
2600: 58 49 53 54 53 20 74 65 73 74 5f 64 61 74 61 20 XISTS test_data
2610: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM
2620: 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 20 20 ARY KEY,.
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2640: 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 69 64 test_id
2650: 20 49 4e 54 45 47 45 52 2c 0a 20 20 20 20 20 20 INTEGER,.
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2670: 20 20 20 20 20 20 20 20 20 20 63 61 74 65 67 6f catego
2680: 72 79 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 ry TEXT DEFAULT
2690: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 '',.
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
26b0: 20 20 20 20 76 61 72 69 61 62 6c 65 20 54 45 58 variable TEX
26c0: 54 2c 0a 09 20 20 20 20 20 20 20 20 20 20 20 20 T,..
26d0: 20 20 20 20 20 20 20 20 20 20 20 20 76 61 6c 75 valu
26e0: 65 20 52 45 41 4c 2c 0a 09 20 20 20 20 20 20 20 e REAL,..
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2700: 20 65 78 70 65 63 74 65 64 20 52 45 41 4c 2c 0a expected REAL,.
2710: 09 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
2720: 20 20 20 20 20 20 20 20 20 74 6f 6c 20 52 45 41 tol REA
2730: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 L,.
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2750: 20 20 20 75 6e 69 74 73 20 54 45 58 54 2c 0a 20 units TEXT,.
2760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 c
2780: 6f 6d 6d 65 6e 74 20 54 45 58 54 20 44 45 46 41 omment TEXT DEFA
2790: 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 ULT '',.
27a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
27b0: 20 20 20 20 20 20 20 20 73 74 61 74 75 73 20 54 status T
27c0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 6e 2f 61 EXT DEFAULT 'n/a
27d0: 27 2c 66 6f 73 73 0a 20 20 20 20 20 20 20 20 20 ',foss.
27e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
27f0: 20 20 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 CONSTRAINT
2800: 74 65 73 74 5f 64 61 74 61 20 55 4e 49 51 55 45 test_data UNIQUE
2810: 20 28 74 65 73 74 5f 69 64 2c 63 61 74 65 67 6f (test_id,catego
2820: 72 79 2c 76 61 72 69 61 62 6c 65 29 29 3b 22 29 ry,variable));")
2830: 0a 20 20 20 20 20 20 20 28 70 61 74 63 68 2d 64 . (patch-d
2840: 62 29 29 0a 20 20 20 20 20 20 28 28 3c 20 6d 76 b)). ((< mv
2850: 65 72 20 31 2e 32 37 29 0a 20 20 20 20 20 20 20 er 1.27).
2860: 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22 (db:set-var db "
2870: 4d 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e MEGATEST_VERSION
2880: 22 20 31 2e 32 37 29 0a 20 20 20 20 20 20 20 28 " 1.27). (
2890: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 sqlite3:execute
28a0: 64 62 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 db "ALTER TABLE
28b0: 74 65 73 74 5f 64 61 74 61 20 41 44 44 20 43 4f test_data ADD CO
28c0: 4c 55 4d 4e 20 74 79 70 65 20 54 45 58 54 20 44 LUMN type TEXT D
28d0: 45 46 41 55 4c 54 20 27 27 3b 22 29 0a 20 20 20 EFAULT '';").
28e0: 20 20 20 20 28 70 61 74 63 68 2d 64 62 29 29 0a (patch-db)).
28f0: 20 20 20 20 20 20 28 28 3c 20 6d 76 65 72 20 31 ((< mver 1
2900: 2e 32 39 29 0a 20 20 20 20 20 20 20 28 64 62 3a .29). (db:
2910: 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41 set-var db "MEGA
2920: 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e TEST_VERSION" 1.
2930: 32 39 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69 29). (sqli
2940: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 te3:execute db "
2950: 41 4c 54 45 52 20 54 41 42 4c 45 20 74 65 73 74 ALTER TABLE test
2960: 5f 73 74 65 70 73 20 41 44 44 20 43 4f 4c 55 4d _steps ADD COLUM
2970: 4e 20 6c 6f 67 66 69 6c 65 20 54 45 58 54 3b 22 N logfile TEXT;"
2980: 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 ). (sqlite
2990: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 41 4c 3:execute db "AL
29a0: 54 45 52 20 54 41 42 4c 45 20 74 65 73 74 73 20 TER TABLE tests
29b0: 41 44 44 20 43 4f 4c 55 4d 4e 20 73 68 6f 72 74 ADD COLUMN short
29c0: 64 69 72 20 54 45 58 54 20 44 45 46 41 55 4c 54 dir TEXT DEFAULT
29d0: 20 27 27 3b 22 29 29 0a 20 20 20 20 20 20 28 28 '';")). ((
29e0: 3c 20 6d 76 65 72 20 6d 65 67 61 74 65 73 74 2d < mver megatest-
29f0: 76 65 72 73 69 6f 6e 29 0a 20 20 20 20 20 20 20 version).
2a00: 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22 (db:set-var db "
2a10: 4d 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e MEGATEST_VERSION
2a20: 22 20 6d 65 67 61 74 65 73 74 2d 76 65 72 73 69 " megatest-versi
2a30: 6f 6e 29 29 29 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d on))))))..;;====
2a40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2a50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2a60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2a70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2a80: 3d 3d 0a 3b 3b 20 6d 65 74 61 20 67 65 74 20 61 ==.;; meta get a
2a90: 6e 64 20 73 65 74 20 76 61 72 73 0a 3b 3b 3d 3d nd set vars.;;==
2aa0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2ab0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2ac0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2ad0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2ae0: 3d 3d 3d 3d 0a 0a 3b 3b 20 72 65 74 75 72 6e 73 ====..;; returns
2af0: 20 6e 75 6d 62 65 72 20 69 66 20 73 74 72 69 6e number if strin
2b00: 67 2d 3e 6e 75 6d 62 65 72 20 69 73 20 73 75 63 g->number is suc
2b10: 63 65 73 73 66 75 6c 2c 20 73 74 72 69 6e 67 20 cessful, string
2b20: 6f 74 68 65 72 77 69 73 65 0a 28 64 65 66 69 6e otherwise.(defin
2b30: 65 20 28 64 62 3a 67 65 74 2d 76 61 72 20 64 62 e (db:get-var db
2b40: 20 76 61 72 29 0a 20 20 28 6c 65 74 20 28 28 72 var). (let ((r
2b50: 65 73 20 23 66 29 29 0a 20 20 20 20 28 73 71 6c es #f)). (sql
2b60: 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f ite3:for-each-ro
2b70: 77 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 w. (lambda (
2b80: 76 61 6c 29 0a 20 20 20 20 20 20 20 28 73 65 74 val). (set
2b90: 21 20 72 65 73 20 76 61 6c 29 29 0a 20 20 20 20 ! res val)).
2ba0: 20 64 62 20 22 53 45 4c 45 43 54 20 76 61 6c 20 db "SELECT val
2bb0: 46 52 4f 4d 20 6d 65 74 61 64 61 74 20 57 48 45 FROM metadat WHE
2bc0: 52 45 20 76 61 72 3d 3f 3b 22 20 76 61 72 29 0a RE var=?;" var).
2bd0: 20 20 20 20 28 69 66 20 28 73 74 72 69 6e 67 3f (if (string?
2be0: 20 72 65 73 29 0a 09 28 6c 65 74 20 28 28 76 61 res)..(let ((va
2bf0: 6c 6e 75 6d 20 28 73 74 72 69 6e 67 2d 3e 6e 75 lnum (string->nu
2c00: 6d 62 65 72 20 72 65 73 29 29 29 0a 09 20 20 28 mber res))).. (
2c10: 69 66 20 76 61 6c 6e 75 6d 20 76 61 6c 6e 75 6d if valnum valnum
2c20: 20 72 65 73 29 29 0a 09 72 65 73 29 29 29 0a 0a res))..res)))..
2c30: 28 64 65 66 69 6e 65 20 28 64 62 3a 73 65 74 2d (define (db:set-
2c40: 76 61 72 20 64 62 20 76 61 72 20 76 61 6c 29 0a var db var val).
2c50: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 (sqlite3:execu
2c60: 74 65 20 64 62 20 22 49 4e 53 45 52 54 20 4f 52 te db "INSERT OR
2c70: 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 6d 65 REPLACE INTO me
2c80: 74 61 64 61 74 20 28 76 61 72 2c 76 61 6c 29 20 tadat (var,val)
2c90: 56 41 4c 55 45 53 20 28 3f 2c 3f 29 3b 22 20 76 VALUES (?,?);" v
2ca0: 61 72 20 76 61 6c 29 29 0a 0a 3b 3b 20 75 73 65 ar val))..;; use
2cb0: 20 61 20 67 6c 6f 62 61 6c 20 66 6f 72 20 73 6f a global for so
2cc0: 6d 65 20 70 72 69 6d 69 74 69 76 65 20 63 61 63 me primitive cac
2cd0: 68 69 6e 67 2c 20 69 74 20 69 73 20 6a 75 73 74 hing, it is just
2ce0: 20 73 69 6c 6c 79 20 74 6f 20 72 65 2d 72 65 61 silly to re-rea
2cf0: 64 20 74 68 65 20 64 62 20 0a 3b 3b 20 6f 76 65 d the db .;; ove
2d00: 72 20 61 6e 64 20 6f 76 65 72 20 61 67 61 69 6e r and over again
2d10: 20 66 6f 72 20 74 68 65 20 6b 65 79 73 20 73 69 for the keys si
2d20: 6e 63 65 20 74 68 65 79 20 6e 65 76 65 72 20 63 nce they never c
2d30: 68 61 6e 67 65 0a 0a 28 64 65 66 69 6e 65 20 2a hange..(define *
2d40: 64 62 2d 6b 65 79 73 2a 20 23 66 29 0a 0a 28 64 db-keys* #f)..(d
2d50: 65 66 69 6e 65 20 28 64 62 2d 67 65 74 2d 6b 65 efine (db-get-ke
2d60: 79 73 20 64 62 29 0a 20 20 28 69 66 20 2a 64 62 ys db). (if *db
2d70: 2d 6b 65 79 73 2a 20 2a 64 62 2d 6b 65 79 73 2a -keys* *db-keys*
2d80: 20 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28 72 . (let ((r
2d90: 65 73 20 27 28 29 29 29 0a 09 28 73 71 6c 69 74 es '()))..(sqlit
2da0: 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 e3:for-each-row
2db0: 0a 09 20 28 6c 61 6d 62 64 61 20 28 6b 65 79 20 .. (lambda (key
2dc0: 6b 65 79 74 79 70 65 29 0a 09 20 20 20 28 73 65 keytype).. (se
2dd0: 74 21 20 72 65 73 20 28 63 6f 6e 73 20 28 76 65 t! res (cons (ve
2de0: 63 74 6f 72 20 6b 65 79 20 6b 65 79 74 79 70 65 ctor key keytype
2df0: 29 20 72 65 73 29 29 29 0a 09 20 64 62 0a 09 20 ) res))).. db..
2e00: 22 53 45 4c 45 43 54 20 66 69 65 6c 64 6e 61 6d "SELECT fieldnam
2e10: 65 2c 66 69 65 6c 64 74 79 70 65 20 46 52 4f 4d e,fieldtype FROM
2e20: 20 6b 65 79 73 20 4f 52 44 45 52 20 42 59 20 69 keys ORDER BY i
2e30: 64 20 44 45 53 43 3b 22 29 0a 09 28 73 65 74 21 d DESC;")..(set!
2e40: 20 2a 64 62 2d 6b 65 79 73 2a 20 72 65 73 29 0a *db-keys* res).
2e50: 09 72 65 73 29 29 29 0a 0a 28 64 65 66 69 6e 65 .res)))..(define
2e60: 20 64 62 3a 67 65 74 2d 6b 65 79 73 20 64 62 2d db:get-keys db-
2e70: 67 65 74 2d 6b 65 79 73 29 0a 0a 28 64 65 66 69 get-keys)..(defi
2e80: 6e 65 20 28 64 62 3a 67 65 74 2d 76 61 6c 75 65 ne (db:get-value
2e90: 2d 62 79 2d 68 65 61 64 65 72 20 72 6f 77 20 68 -by-header row h
2ea0: 65 61 64 65 72 20 66 69 65 6c 64 29 0a 20 20 3b eader field). ;
2eb0: 3b 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 32 ; (debug:print 2
2ec0: 20 22 64 62 3a 67 65 74 2d 76 61 6c 75 65 2d 62 "db:get-value-b
2ed0: 79 2d 68 65 61 64 65 72 20 72 6f 77 3a 20 22 20 y-header row: "
2ee0: 72 6f 77 20 22 20 68 65 61 64 65 72 3a 20 22 20 row " header: "
2ef0: 68 65 61 64 65 72 20 22 20 66 69 65 6c 64 3a 20 header " field:
2f00: 22 20 66 69 65 6c 64 29 0a 20 20 28 69 66 20 28 " field). (if (
2f10: 6e 75 6c 6c 3f 20 68 65 61 64 65 72 29 20 23 66 null? header) #f
2f20: 0a 20 20 20 20 20 20 28 6c 65 74 20 6c 6f 6f 70 . (let loop
2f30: 20 28 28 68 65 64 20 28 63 61 72 20 68 65 61 64 ((hed (car head
2f40: 65 72 29 29 0a 09 09 20 28 74 61 6c 20 28 63 64 er))... (tal (cd
2f50: 72 20 68 65 61 64 65 72 29 29 0a 09 09 20 28 6e r header))... (n
2f60: 20 20 20 30 29 29 0a 09 28 69 66 20 28 65 71 75 0))..(if (equ
2f70: 61 6c 3f 20 68 65 64 20 66 69 65 6c 64 29 0a 09 al? hed field)..
2f80: 20 20 20 20 28 76 65 63 74 6f 72 2d 72 65 66 20 (vector-ref
2f90: 72 6f 77 20 6e 29 0a 09 20 20 20 20 28 69 66 20 row n).. (if
2fa0: 28 6e 75 6c 6c 3f 20 74 61 6c 29 20 23 66 20 28 (null? tal) #f (
2fb0: 6c 6f 6f 70 20 28 63 61 72 20 74 61 6c 29 28 63 loop (car tal)(c
2fc0: 64 72 20 74 61 6c 29 28 2b 20 6e 20 31 29 29 29 dr tal)(+ n 1)))
2fd0: 29 29 29 29 0a 09 20 20 20 20 0a 3b 3b 3d 3d 3d )))).. .;;===
2fe0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2ff0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3000: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3010: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3020: 3d 3d 3d 0a 3b 3b 20 20 52 20 55 20 4e 20 53 0a ===.;; R U N S.
3030: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ;;==============
3040: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3050: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3060: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3070: 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65 66 69 6e ========..(defin
3080: 65 20 28 72 75 6e 73 3a 67 65 74 2d 73 74 64 2d e (runs:get-std-
3090: 72 75 6e 2d 66 69 65 6c 64 73 20 6b 65 79 73 20 run-fields keys
30a0: 72 65 6d 66 69 65 6c 64 73 29 0a 20 20 28 6c 65 remfields). (le
30b0: 74 2a 20 28 28 68 65 61 64 65 72 20 20 20 20 28 t* ((header (
30c0: 61 70 70 65 6e 64 20 28 6d 61 70 20 6b 65 79 3a append (map key:
30d0: 67 65 74 2d 66 69 65 6c 64 6e 61 6d 65 20 6b 65 get-fieldname ke
30e0: 79 73 29 0a 09 09 09 20 20 20 20 72 65 6d 66 69 ys).... remfi
30f0: 65 6c 64 73 29 29 0a 09 20 28 6b 65 79 73 74 72 elds)).. (keystr
3100: 20 20 20 20 28 63 6f 6e 63 20 28 6b 65 79 73 2d (conc (keys-
3110: 3e 6b 65 79 73 74 72 20 6b 65 79 73 29 20 22 2c >keystr keys) ",
3120: 22 0a 09 09 09 20 20 28 73 74 72 69 6e 67 2d 69 ".... (string-i
3130: 6e 74 65 72 73 70 65 72 73 65 20 72 65 6d 66 69 ntersperse remfi
3140: 65 6c 64 73 20 22 2c 22 29 29 29 29 0a 20 20 20 elds ",")))).
3150: 20 28 6c 69 73 74 20 6b 65 79 73 74 72 20 68 65 (list keystr he
3160: 61 64 65 72 29 29 29 0a 0a 3b 3b 20 57 41 53 20 ader)))..;; WAS
3170: 64 62 2d 67 65 74 2d 72 75 6e 73 20 46 49 58 4d db-get-runs FIXM
3180: 45 20 49 4e 20 52 45 4d 41 49 4e 49 4e 47 20 43 E IN REMAINING C
3190: 4f 44 45 0a 3b 3b 0a 3b 3b 20 4d 45 52 47 45 20 ODE.;;.;; MERGE
31a0: 54 48 49 53 20 57 49 54 48 20 64 62 3a 67 65 74 THIS WITH db:get
31b0: 2d 72 75 6e 73 2c 20 61 63 63 69 64 65 6e 74 6c -runs, accidentl
31c0: 79 20 77 72 6f 74 65 20 69 74 20 74 77 69 63 65 y wrote it twice
31d0: 0a 3b 3b 0a 3b 3b 20 72 65 70 6c 61 63 65 20 68 .;;.;; replace h
31e0: 65 61 64 65 72 20 61 6e 64 20 6b 65 79 73 74 72 eader and keystr
31f0: 20 77 69 74 68 20 61 20 63 61 6c 6c 20 74 6f 20 with a call to
3200: 72 75 6e 73 3a 67 65 74 2d 73 74 64 2d 72 75 6e runs:get-std-run
3210: 2d 66 69 65 6c 64 73 0a 3b 3b 0a 3b 3b 20 6b 65 -fields.;;.;; ke
3220: 79 70 61 74 74 73 3a 20 28 20 28 4b 45 59 31 20 ypatts: ( (KEY1
3230: 22 61 62 63 25 64 65 66 22 29 28 4b 45 59 32 20 "abc%def")(KEY2
3240: 22 25 22 29 20 29 0a 3b 3b 0a 28 64 65 66 69 6e "%") ).;;.(defin
3250: 65 20 28 64 62 3a 67 65 74 2d 72 75 6e 73 20 64 e (db:get-runs d
3260: 62 20 72 75 6e 70 61 74 74 20 63 6f 75 6e 74 20 b runpatt count
3270: 6f 66 66 73 65 74 20 6b 65 79 70 61 74 74 73 29 offset keypatts)
3280: 0a 20 20 28 6c 65 74 2a 20 28 28 72 65 73 20 20 . (let* ((res
3290: 20 20 20 20 27 28 29 29 0a 09 20 28 6b 65 79 73 '()).. (keys
32a0: 20 20 20 20 20 20 28 64 62 2d 67 65 74 2d 6b 65 (db-get-ke
32b0: 79 73 20 64 62 29 29 0a 09 20 28 72 65 6d 66 69 ys db)).. (remfi
32c0: 65 6c 64 73 20 28 6c 69 73 74 20 22 69 64 22 20 elds (list "id"
32d0: 22 72 75 6e 6e 61 6d 65 22 20 22 73 74 61 74 65 "runname" "state
32e0: 22 20 22 73 74 61 74 75 73 22 20 22 6f 77 6e 65 " "status" "owne
32f0: 72 22 20 22 65 76 65 6e 74 5f 74 69 6d 65 22 29 r" "event_time")
3300: 29 0a 09 20 28 68 65 61 64 65 72 20 20 20 20 28 ).. (header (
3310: 61 70 70 65 6e 64 20 28 6d 61 70 20 6b 65 79 3a append (map key:
3320: 67 65 74 2d 66 69 65 6c 64 6e 61 6d 65 20 6b 65 get-fieldname ke
3330: 79 73 29 0a 09 09 09 20 20 20 20 72 65 6d 66 69 ys).... remfi
3340: 65 6c 64 73 29 29 0a 09 20 28 6b 65 79 73 74 72 elds)).. (keystr
3350: 20 20 20 20 28 63 6f 6e 63 20 28 6b 65 79 73 2d (conc (keys-
3360: 3e 6b 65 79 73 74 72 20 6b 65 79 73 29 20 22 2c >keystr keys) ",
3370: 22 0a 09 09 09 20 20 28 73 74 72 69 6e 67 2d 69 ".... (string-i
3380: 6e 74 65 72 73 70 65 72 73 65 20 72 65 6d 66 69 ntersperse remfi
3390: 65 6c 64 73 20 22 2c 22 29 29 29 0a 09 20 28 71 elds ","))).. (q
33a0: 72 79 73 74 72 20 20 20 20 28 63 6f 6e 63 20 22 rystr (conc "
33b0: 53 45 4c 45 43 54 20 22 20 6b 65 79 73 74 72 20 SELECT " keystr
33c0: 22 20 46 52 4f 4d 20 72 75 6e 73 20 57 48 45 52 " FROM runs WHER
33d0: 45 20 72 75 6e 6e 61 6d 65 20 4c 49 4b 45 20 3f E runname LIKE ?
33e0: 20 22 0a 09 09 09 20 20 3b 3b 20 47 65 6e 65 72 ".... ;; Gener
33f0: 61 74 65 3a 20 22 20 41 4e 44 20 78 20 4c 49 4b ate: " AND x LIK
3400: 45 20 27 6b 65 79 70 61 74 74 27 20 2e 2e 2e 22 E 'keypatt' ..."
3410: 0a 09 09 09 20 20 28 69 66 20 28 6e 75 6c 6c 3f .... (if (null?
3420: 20 6b 65 79 70 61 74 74 73 29 20 22 22 0a 09 09 keypatts) ""...
3430: 09 20 20 20 20 20 20 28 63 6f 6e 63 20 22 20 41 . (conc " A
3440: 4e 44 20 22 0a 09 09 09 09 20 20 20 20 28 73 74 ND "..... (st
3450: 72 69 6e 67 2d 6a 6f 69 6e 20 0a 09 09 09 09 20 ring-join .....
3460: 20 20 20 20 28 6d 61 70 20 28 6c 61 6d 62 64 61 (map (lambda
3470: 20 28 6b 65 79 70 61 74 74 29 0a 09 09 09 09 09 (keypatt)......
3480: 20 20 20 20 28 6c 65 74 20 28 28 6b 65 79 20 20 (let ((key
3490: 28 63 61 72 20 6b 65 79 70 61 74 74 29 29 0a 09 (car keypatt))..
34a0: 09 09 09 09 09 20 20 28 70 61 74 74 20 28 63 61 ..... (patt (ca
34b0: 64 72 20 6b 65 79 70 61 74 74 29 29 29 0a 09 09 dr keypatt)))...
34c0: 09 09 09 20 20 20 20 20 20 28 63 6f 6e 63 20 6b ... (conc k
34d0: 65 79 20 22 20 4c 49 4b 45 20 27 22 20 70 61 74 ey " LIKE '" pat
34e0: 74 20 22 27 22 29 29 29 0a 09 09 09 09 09 20 20 t "'")))......
34f0: 6b 65 79 70 61 74 74 73 29 0a 09 09 09 09 20 20 keypatts).....
3500: 20 20 20 22 20 41 4e 44 20 22 29 29 29 0a 09 09 " AND ")))...
3510: 09 20 20 22 20 4f 52 44 45 52 20 42 59 20 65 76 . " ORDER BY ev
3520: 65 6e 74 5f 74 69 6d 65 20 44 45 53 43 20 22 0a ent_time DESC ".
3530: 09 09 09 20 20 28 69 66 20 28 6e 75 6d 62 65 72 ... (if (number
3540: 3f 20 63 6f 75 6e 74 29 0a 09 09 09 20 20 20 20 ? count)....
3550: 20 20 28 63 6f 6e 63 20 22 20 4c 49 4d 49 54 20 (conc " LIMIT
3560: 22 20 63 6f 75 6e 74 29 0a 09 09 09 20 20 20 20 " count)....
3570: 20 20 22 22 29 0a 09 09 09 20 20 28 69 66 20 28 "").... (if (
3580: 6e 75 6d 62 65 72 3f 20 6f 66 66 73 65 74 29 0a number? offset).
3590: 09 09 09 20 20 20 20 20 20 28 63 6f 6e 63 20 22 ... (conc "
35a0: 20 4f 46 46 53 45 54 20 22 20 6f 66 66 73 65 74 OFFSET " offset
35b0: 29 0a 09 09 09 20 20 20 20 20 20 22 22 29 29 29 ).... "")))
35c0: 29 0a 20 20 20 20 28 64 65 62 75 67 3a 70 72 69 ). (debug:pri
35d0: 6e 74 20 34 20 22 64 62 3a 67 65 74 2d 72 75 6e nt 4 "db:get-run
35e0: 73 20 71 72 79 73 74 72 3a 20 22 20 71 72 79 73 s qrystr: " qrys
35f0: 74 72 20 22 5c 6e 6b 65 79 70 61 74 74 73 3a 20 tr "\nkeypatts:
3600: 22 20 6b 65 79 70 61 74 74 73 20 22 5c 6e 20 20 " keypatts "\n
3610: 6f 66 66 73 65 74 3a 20 22 20 6f 66 66 73 65 74 offset: " offset
3620: 20 22 20 6c 69 6d 69 74 3a 20 22 20 63 6f 75 6e " limit: " coun
3630: 74 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a t). (sqlite3:
3640: 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 for-each-row.
3650: 20 20 28 6c 61 6d 62 64 61 20 28 61 20 2e 20 78 (lambda (a . x
3660: 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72 ). (set! r
3670: 65 73 20 28 63 6f 6e 73 20 28 61 70 70 6c 79 20 es (cons (apply
3680: 76 65 63 74 6f 72 20 61 20 78 29 20 72 65 73 29 vector a x) res)
3690: 29 29 0a 20 20 20 20 20 64 62 0a 20 20 20 20 20 )). db.
36a0: 71 72 79 73 74 72 0a 20 20 20 20 20 72 75 6e 70 qrystr. runp
36b0: 61 74 74 29 0a 20 20 20 20 28 76 65 63 74 6f 72 att). (vector
36c0: 20 68 65 61 64 65 72 20 72 65 73 29 29 29 0a 0a header res)))..
36d0: 3b 3b 20 6a 75 73 74 20 67 65 74 20 63 6f 75 6e ;; just get coun
36e0: 74 20 6f 66 20 72 75 6e 73 0a 28 64 65 66 69 6e t of runs.(defin
36f0: 65 20 28 64 62 3a 67 65 74 2d 6e 75 6d 2d 72 75 e (db:get-num-ru
3700: 6e 73 20 64 62 20 72 75 6e 70 61 74 74 29 0a 20 ns db runpatt).
3710: 20 28 6c 65 74 20 28 28 6e 75 6d 72 75 6e 73 20 (let ((numruns
3720: 30 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 0)). (sqlite3
3730: 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20 :for-each-row .
3740: 20 20 20 20 28 6c 61 6d 62 64 61 20 28 63 6f 75 (lambda (cou
3750: 6e 74 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 nt). (set!
3760: 20 6e 75 6d 72 75 6e 73 20 63 6f 75 6e 74 29 29 numruns count))
3770: 0a 20 20 20 20 20 64 62 0a 20 20 20 20 20 22 53 . db. "S
3780: 45 4c 45 43 54 20 43 4f 55 4e 54 28 69 64 29 20 ELECT COUNT(id)
3790: 46 52 4f 4d 20 72 75 6e 73 20 57 48 45 52 45 20 FROM runs WHERE
37a0: 72 75 6e 6e 61 6d 65 20 4c 49 4b 45 20 3f 3b 22 runname LIKE ?;"
37b0: 20 72 75 6e 70 61 74 74 29 0a 20 20 20 20 6e 75 runpatt). nu
37c0: 6d 72 75 6e 73 29 29 0a 0a 0a 3b 3b 20 75 73 65 mruns))...;; use
37d0: 20 28 67 65 74 2d 76 61 6c 75 65 2d 62 79 2d 68 (get-value-by-h
37e0: 65 61 64 65 72 20 28 64 62 3a 67 65 74 2d 68 65 eader (db:get-he
37f0: 61 64 65 72 20 72 75 6e 69 6e 66 6f 29 28 64 62 ader runinfo)(db
3800: 3a 67 65 74 2d 72 6f 77 20 72 75 6e 69 6e 66 6f :get-row runinfo
3810: 29 29 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67 )).(define (db:g
3820: 65 74 2d 72 75 6e 2d 69 6e 66 6f 20 64 62 20 72 et-run-info db r
3830: 75 6e 2d 69 64 29 0a 20 20 28 6c 65 74 2a 20 28 un-id). (let* (
3840: 28 72 65 73 20 20 20 20 20 20 23 66 29 0a 09 20 (res #f)..
3850: 28 6b 65 79 73 20 20 20 20 20 20 28 64 62 2d 67 (keys (db-g
3860: 65 74 2d 6b 65 79 73 20 64 62 29 29 0a 09 20 28 et-keys db)).. (
3870: 72 65 6d 66 69 65 6c 64 73 20 28 6c 69 73 74 20 remfields (list
3880: 22 69 64 22 20 22 72 75 6e 6e 61 6d 65 22 20 22 "id" "runname" "
3890: 73 74 61 74 65 22 20 22 73 74 61 74 75 73 22 20 state" "status"
38a0: 22 6f 77 6e 65 72 22 20 22 65 76 65 6e 74 5f 74 "owner" "event_t
38b0: 69 6d 65 22 29 29 0a 09 20 28 68 65 61 64 65 72 ime")).. (header
38c0: 20 20 20 20 28 61 70 70 65 6e 64 20 28 6d 61 70 (append (map
38d0: 20 6b 65 79 3a 67 65 74 2d 66 69 65 6c 64 6e 61 key:get-fieldna
38e0: 6d 65 20 6b 65 79 73 29 0a 09 09 09 20 20 20 20 me keys)....
38f0: 72 65 6d 66 69 65 6c 64 73 29 29 0a 09 20 28 6b remfields)).. (k
3900: 65 79 73 74 72 20 20 20 20 28 63 6f 6e 63 20 28 eystr (conc (
3910: 6b 65 79 73 2d 3e 6b 65 79 73 74 72 20 6b 65 79 keys->keystr key
3920: 73 29 20 22 2c 22 0a 09 09 09 20 20 28 73 74 72 s) ",".... (str
3930: 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 ing-intersperse
3940: 72 65 6d 66 69 65 6c 64 73 20 22 2c 22 29 29 29 remfields ",")))
3950: 29 0a 20 20 20 20 3b 3b 20 28 64 65 62 75 67 3a ). ;; (debug:
3960: 70 72 69 6e 74 20 30 20 22 64 62 3a 67 65 74 2d print 0 "db:get-
3970: 72 75 6e 2d 69 6e 66 6f 20 72 75 6e 2d 69 64 3a run-info run-id:
3980: 20 22 20 72 75 6e 2d 69 64 20 22 20 68 65 61 64 " run-id " head
3990: 65 72 3a 20 22 20 68 65 61 64 65 72 20 22 20 6b er: " header " k
39a0: 65 79 73 74 72 3a 20 22 20 6b 65 79 73 74 72 29 eystr: " keystr)
39b0: 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f . (sqlite3:fo
39c0: 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 r-each-row.
39d0: 28 6c 61 6d 62 64 61 20 28 61 20 2e 20 78 29 0a (lambda (a . x).
39e0: 20 20 20 20 20 20 20 28 73 65 74 21 20 72 65 73 (set! res
39f0: 20 28 61 70 70 6c 79 20 76 65 63 74 6f 72 20 61 (apply vector a
3a00: 20 78 29 29 29 0a 20 20 20 20 20 64 62 0a 20 20 x))). db.
3a10: 20 20 20 28 63 6f 6e 63 20 22 53 45 4c 45 43 54 (conc "SELECT
3a20: 20 22 20 6b 65 79 73 74 72 20 22 20 46 52 4f 4d " keystr " FROM
3a30: 20 72 75 6e 73 20 57 48 45 52 45 20 69 64 3d 3f runs WHERE id=?
3a40: 3b 22 29 0a 20 20 20 20 20 72 75 6e 2d 69 64 29 ;"). run-id)
3a50: 0a 20 20 20 20 28 76 65 63 74 6f 72 20 68 65 61 . (vector hea
3a60: 64 65 72 20 72 65 73 29 29 29 0a 0a 28 64 65 66 der res)))..(def
3a70: 69 6e 65 20 28 64 62 3a 73 65 74 2d 63 6f 6d 6d ine (db:set-comm
3a80: 65 6e 74 2d 66 6f 72 2d 72 75 6e 20 64 62 20 72 ent-for-run db r
3a90: 75 6e 2d 69 64 20 63 6f 6d 6d 65 6e 74 29 0a 20 un-id comment).
3aa0: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 (sqlite3:execut
3ab0: 65 20 64 62 20 22 55 50 44 41 54 45 20 72 75 6e e db "UPDATE run
3ac0: 73 20 53 45 54 20 63 6f 6d 6d 65 6e 74 3d 3f 20 s SET comment=?
3ad0: 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 63 6f 6d WHERE id=?;" com
3ae0: 6d 65 6e 74 20 72 75 6e 2d 69 64 29 29 0a 0a 3b ment run-id))..;
3af0: 3b 20 64 6f 65 73 20 6e 6f 74 20 28 6f 62 76 69 ; does not (obvi
3b00: 6f 75 73 6c 79 21 29 20 72 65 6d 6f 76 65 64 20 ously!) removed
3b10: 64 65 70 65 6e 64 65 6e 74 20 64 61 74 61 2e 20 dependent data.
3b20: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 64 65 6c .(define (db:del
3b30: 65 74 65 2d 72 75 6e 20 64 62 20 72 75 6e 2d 69 ete-run db run-i
3b40: 64 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 d). (sqlite3:ex
3b50: 65 63 75 74 65 20 64 62 20 22 44 45 4c 45 54 45 ecute db "DELETE
3b60: 20 46 52 4f 4d 20 72 75 6e 73 20 57 48 45 52 45 FROM runs WHERE
3b70: 20 69 64 3d 3f 3b 22 20 72 75 6e 2d 69 64 29 29 id=?;" run-id))
3b80: 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 75 70 ..(define (db:up
3b90: 64 61 74 65 2d 72 75 6e 2d 65 76 65 6e 74 5f 74 date-run-event_t
3ba0: 69 6d 65 20 64 62 20 72 75 6e 2d 69 64 29 0a 20 ime db run-id).
3bb0: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 (sqlite3:execut
3bc0: 65 20 64 62 20 22 55 50 44 41 54 45 20 72 75 6e e db "UPDATE run
3bd0: 73 20 53 45 54 20 65 76 65 6e 74 5f 74 69 6d 65 s SET event_time
3be0: 3d 73 74 72 66 74 69 6d 65 28 27 25 73 27 2c 27 =strftime('%s','
3bf0: 6e 6f 77 27 29 20 57 48 45 52 45 20 69 64 3d 3f now') WHERE id=?
3c00: 3b 22 20 72 75 6e 2d 69 64 29 29 20 0a 0a 3b 3b ;" run-id)) ..;;
3c10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3c20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3c30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3c40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3c50: 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 20 54 20 45 20 53 ======.;; T E S
3c60: 20 54 20 53 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d T S.;;=========
3c70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3c80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3c90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3ca0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b =============..;
3cb0: 3b 20 73 74 61 74 65 73 20 61 6e 64 20 73 74 61 ; states and sta
3cc0: 74 75 73 65 73 20 61 72 65 20 6c 69 73 74 73 2c tuses are lists,
3cd0: 20 74 75 72 6e 20 74 68 65 6d 20 69 6e 74 6f 20 turn them into
3ce0: 28 22 50 41 53 53 22 2c 22 46 41 49 4c 22 2e 2e ("PASS","FAIL"..
3cf0: 2e 29 20 61 6e 64 20 75 73 65 20 4e 4f 54 20 49 .) and use NOT I
3d00: 4e 0a 3b 3b 20 69 2e 65 2e 20 74 68 65 73 65 20 N.;; i.e. these
3d10: 6c 69 73 74 73 20 64 65 66 69 6e 65 20 77 68 61 lists define wha
3d20: 74 20 74 6f 20 4e 4f 54 20 73 68 6f 77 2e 0a 3b t to NOT show..;
3d30: 3b 20 73 74 61 74 65 73 20 61 6e 64 20 73 74 61 ; states and sta
3d40: 74 75 73 65 73 20 61 72 65 20 72 65 71 75 69 72 tuses are requir
3d50: 65 64 20 74 6f 20 62 65 20 6c 69 73 74 73 2c 20 ed to be lists,
3d60: 65 6d 70 74 79 20 69 73 20 6f 6b 0a 28 64 65 66 empty is ok.(def
3d70: 69 6e 65 20 28 64 62 2d 67 65 74 2d 74 65 73 74 ine (db-get-test
3d80: 73 2d 66 6f 72 2d 72 75 6e 20 64 62 20 72 75 6e s-for-run db run
3d90: 2d 69 64 20 74 65 73 74 70 61 74 74 20 69 74 65 -id testpatt ite
3da0: 6d 70 61 74 74 20 73 74 61 74 65 73 20 73 74 61 mpatt states sta
3db0: 74 75 73 65 73 29 0a 20 20 28 6c 65 74 20 28 28 tuses). (let ((
3dc0: 72 65 73 20 27 28 29 29 0a 09 28 73 74 61 74 65 res '())..(state
3dd0: 73 2d 73 74 72 20 20 20 20 28 63 6f 6e 63 20 22 s-str (conc "
3de0: 28 27 22 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 ('" (string-inte
3df0: 72 73 70 65 72 73 65 20 73 74 61 74 65 73 20 20 rsperse states
3e00: 20 22 27 2c 27 22 29 20 22 27 29 22 29 29 0a 09 "','") "')"))..
3e10: 28 73 74 61 74 75 73 65 73 2d 73 74 72 20 20 28 (statuses-str (
3e20: 63 6f 6e 63 20 22 28 27 22 20 28 73 74 72 69 6e conc "('" (strin
3e30: 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 73 74 g-intersperse st
3e40: 61 74 75 73 65 73 20 22 27 2c 27 22 29 20 22 27 atuses "','") "'
3e50: 29 22 29 29 0a 09 29 0a 20 20 20 20 28 73 71 6c )"))..). (sql
3e60: 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f ite3:for-each-ro
3e70: 77 20 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 w . (lambda
3e80: 28 69 64 20 72 75 6e 2d 69 64 20 74 65 73 74 6e (id run-id testn
3e90: 61 6d 65 20 73 74 61 74 65 20 73 74 61 74 75 73 ame state status
3ea0: 20 65 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73 74 event-time host
3eb0: 20 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 cpuload diskfre
3ec0: 65 20 75 6e 61 6d 65 20 72 75 6e 64 69 72 20 69 e uname rundir i
3ed0: 74 65 6d 2d 70 61 74 68 20 72 75 6e 2d 64 75 72 tem-path run-dur
3ee0: 61 74 69 6f 6e 20 66 69 6e 61 6c 2d 6c 6f 67 66 ation final-logf
3ef0: 20 63 6f 6d 6d 65 6e 74 29 0a 20 20 20 20 20 20 comment).
3f00: 20 28 73 65 74 21 20 72 65 73 20 28 63 6f 6e 73 (set! res (cons
3f10: 20 28 76 65 63 74 6f 72 20 69 64 20 72 75 6e 2d (vector id run-
3f20: 69 64 20 74 65 73 74 6e 61 6d 65 20 73 74 61 74 id testname stat
3f30: 65 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d 74 e status event-t
3f40: 69 6d 65 20 68 6f 73 74 20 63 70 75 6c 6f 61 64 ime host cpuload
3f50: 20 64 69 73 6b 66 72 65 65 20 75 6e 61 6d 65 20 diskfree uname
3f60: 72 75 6e 64 69 72 20 69 74 65 6d 2d 70 61 74 68 rundir item-path
3f70: 20 72 75 6e 2d 64 75 72 61 74 69 6f 6e 20 66 69 run-duration fi
3f80: 6e 61 6c 2d 6c 6f 67 66 20 63 6f 6d 6d 65 6e 74 nal-logf comment
3f90: 29 20 72 65 73 29 29 29 0a 20 20 20 20 20 64 62 ) res))). db
3fa0: 20 0a 20 20 20 20 20 28 63 6f 6e 63 20 22 53 45 . (conc "SE
3fb0: 4c 45 43 54 20 69 64 2c 72 75 6e 5f 69 64 2c 74 LECT id,run_id,t
3fc0: 65 73 74 6e 61 6d 65 2c 73 74 61 74 65 2c 73 74 estname,state,st
3fd0: 61 74 75 73 2c 65 76 65 6e 74 5f 74 69 6d 65 2c atus,event_time,
3fe0: 68 6f 73 74 2c 63 70 75 6c 6f 61 64 2c 64 69 73 host,cpuload,dis
3ff0: 6b 66 72 65 65 2c 75 6e 61 6d 65 2c 72 75 6e 64 kfree,uname,rund
4000: 69 72 2c 69 74 65 6d 5f 70 61 74 68 2c 72 75 6e ir,item_path,run
4010: 5f 64 75 72 61 74 69 6f 6e 2c 66 69 6e 61 6c 5f _duration,final_
4020: 6c 6f 67 66 2c 63 6f 6d 6d 65 6e 74 20 22 0a 09 logf,comment "..
4030: 20 20 20 22 20 46 52 4f 4d 20 74 65 73 74 73 20 " FROM tests
4040: 57 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 WHERE run_id=? A
4050: 4e 44 20 74 65 73 74 6e 61 6d 65 20 6c 69 6b 65 ND testname like
4060: 20 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 ? AND item_path
4070: 20 4c 49 4b 45 20 3f 20 22 20 0a 09 20 20 20 22 LIKE ? " .. "
4080: 20 41 4e 44 20 4e 4f 54 20 28 73 74 61 74 65 20 AND NOT (state
4090: 69 6e 20 22 20 73 74 61 74 65 73 2d 73 74 72 20 in " states-str
40a0: 22 20 41 4e 44 20 73 74 61 74 75 73 20 49 4e 20 " AND status IN
40b0: 22 20 73 74 61 74 75 73 65 73 2d 73 74 72 20 22 " statuses-str "
40c0: 29 20 22 0a 09 20 20 20 3b 3b 20 22 20 4f 52 44 ) ".. ;; " ORD
40d0: 45 52 20 42 59 20 69 64 20 44 45 53 43 3b 22 0a ER BY id DESC;".
40e0: 09 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 65 . " ORDER BY e
40f0: 76 65 6e 74 5f 74 69 6d 65 20 41 53 43 3b 22 20 vent_time ASC;"
4100: 3b 3b 20 50 4f 54 45 4e 54 49 41 4c 20 49 53 53 ;; POTENTIAL ISS
4110: 55 45 21 20 43 48 45 43 4b 20 4d 45 21 20 44 6f UE! CHECK ME! Do
4120: 65 73 20 61 6e 79 74 69 6e 67 20 64 65 70 65 6e es anyting depen
4130: 64 20 6f 6e 20 74 68 69 73 20 62 65 69 6e 67 20 d on this being
4140: 73 6f 72 74 65 64 20 62 79 20 69 64 3f 0a 09 20 sorted by id?..
4150: 20 20 29 0a 20 20 20 20 20 72 75 6e 2d 69 64 0a ). run-id.
4160: 20 20 20 20 20 28 69 66 20 74 65 73 74 70 61 74 (if testpat
4170: 74 20 74 65 73 74 70 61 74 74 20 22 25 22 29 0a t testpatt "%").
4180: 20 20 20 20 20 28 69 66 20 69 74 65 6d 70 61 74 (if itempat
4190: 74 20 69 74 65 6d 70 61 74 74 20 22 25 22 29 29 t itempatt "%"))
41a0: 0a 20 20 20 20 72 65 73 29 29 0a 0a 3b 3b 20 74 . res))..;; t
41b0: 68 69 73 20 6f 6e 65 20 69 73 20 61 20 62 69 74 his one is a bit
41c0: 20 62 72 6f 6b 65 6e 20 42 55 47 20 46 49 58 4d broken BUG FIXM
41d0: 45 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 64 65 E.(define (db:de
41e0: 6c 65 74 65 2d 74 65 73 74 2d 73 74 65 70 2d 72 lete-test-step-r
41f0: 65 63 6f 72 64 73 20 64 62 20 72 75 6e 2d 69 64 ecords db run-id
4200: 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 64 test-name itemd
4210: 61 74 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 at). (sqlite3:e
4220: 78 65 63 75 74 65 20 64 62 20 22 44 45 4c 45 54 xecute db "DELET
4230: 45 20 46 52 4f 4d 20 74 65 73 74 5f 73 74 65 70 E FROM test_step
4240: 73 20 57 48 45 52 45 20 74 65 73 74 5f 69 64 20 s WHERE test_id
4250: 69 6e 20 28 53 45 4c 45 43 54 20 69 64 20 46 52 in (SELECT id FR
4260: 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 72 OM tests WHERE r
4270: 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 un_id=? AND test
4280: 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f name=? AND item_
4290: 70 61 74 68 3d 3f 29 3b 22 20 0a 09 09 20 20 20 path=?);" ...
42a0: 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 run-id test-name
42b0: 20 28 69 74 65 6d 2d 6c 69 73 74 2d 3e 70 61 74 (item-list->pat
42c0: 68 20 69 74 65 6d 64 61 74 29 29 29 0a 3b 3b 20 h itemdat))).;;
42d0: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 64 65 6c .(define (db:del
42e0: 65 74 65 2d 74 65 73 74 2d 72 65 63 6f 72 64 73 ete-test-records
42f0: 20 64 62 20 74 65 73 74 2d 69 64 29 0a 20 20 28 db test-id). (
4300: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 sqlite3:execute
4310: 64 62 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 db "DELETE FROM
4320: 74 65 73 74 5f 73 74 65 70 73 20 57 48 45 52 45 test_steps WHERE
4330: 20 74 65 73 74 5f 69 64 3d 3f 3b 22 20 74 65 73 test_id=?;" tes
4340: 74 2d 69 64 29 0a 20 20 28 73 71 6c 69 74 65 33 t-id). (sqlite3
4350: 3a 65 78 65 63 75 74 65 20 64 62 20 22 44 45 4c :execute db "DEL
4360: 45 54 45 20 46 52 4f 4d 20 74 65 73 74 5f 64 61 ETE FROM test_da
4370: 74 61 20 20 57 48 45 52 45 20 74 65 73 74 5f 69 ta WHERE test_i
4380: 64 3d 3f 3b 22 20 74 65 73 74 2d 69 64 29 0a 20 d=?;" test-id).
4390: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 (sqlite3:execut
43a0: 65 20 64 62 20 22 44 45 4c 45 54 45 20 46 52 4f e db "DELETE FRO
43b0: 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 69 64 M tests WHERE id
43c0: 3d 3f 3b 22 20 74 65 73 74 2d 69 64 29 29 0a 0a =?;" test-id))..
43d0: 3b 3b 20 73 65 74 20 74 65 73 74 73 20 77 69 74 ;; set tests wit
43e0: 68 20 73 74 61 74 65 20 63 75 72 72 73 74 61 74 h state currstat
43f0: 65 20 61 6e 64 20 73 74 61 74 75 73 20 63 75 72 e and status cur
4400: 72 73 74 61 74 75 73 20 74 6f 20 6e 65 77 73 74 rstatus to newst
4410: 61 74 65 20 61 6e 64 20 6e 65 77 73 74 61 74 75 ate and newstatu
4420: 73 0a 3b 3b 20 75 73 65 20 63 75 72 72 73 74 61 s.;; use currsta
4430: 74 65 20 3d 20 23 66 20 61 6e 64 20 6f 72 20 63 te = #f and or c
4440: 75 72 72 73 74 61 74 75 73 20 3d 20 23 66 20 74 urrstatus = #f t
4450: 6f 20 61 70 70 6c 79 20 74 6f 20 61 6e 79 20 73 o apply to any s
4460: 74 61 74 65 20 6f 72 20 73 74 61 74 75 73 20 72 tate or status r
4470: 65 73 70 65 63 74 69 76 65 6c 79 0a 3b 3b 20 57 espectively.;; W
4480: 41 52 4e 49 4e 47 3a 20 53 51 4c 20 69 6e 6a 65 ARNING: SQL inje
4490: 63 74 69 6f 6e 20 72 69 73 6b 0a 28 64 65 66 69 ction risk.(defi
44a0: 6e 65 20 28 64 62 3a 73 65 74 2d 74 65 73 74 73 ne (db:set-tests
44b0: 2d 73 74 61 74 65 2d 73 74 61 74 75 73 20 64 62 -state-status db
44c0: 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 run-id testname
44d0: 73 20 63 75 72 72 73 74 61 74 65 20 63 75 72 72 s currstate curr
44e0: 73 74 61 74 75 73 20 6e 65 77 73 74 61 74 65 20 status newstate
44f0: 6e 65 77 73 74 61 74 75 73 29 0a 20 20 28 66 6f newstatus). (fo
4500: 72 2d 65 61 63 68 20 28 6c 61 6d 62 64 61 20 28 r-each (lambda (
4510: 74 65 73 74 6e 61 6d 65 29 0a 09 20 20 20 20 20 testname)..
4520: 20 28 6c 65 74 20 28 28 71 72 79 20 28 63 6f 6e (let ((qry (con
4530: 63 20 22 55 50 44 41 54 45 20 74 65 73 74 73 20 c "UPDATE tests
4540: 53 45 54 20 73 74 61 74 65 3d 3f 2c 73 74 61 74 SET state=?,stat
4550: 75 73 3d 3f 20 57 48 45 52 45 20 22 0a 09 09 09 us=? WHERE "....
4560: 09 09 28 69 66 20 63 75 72 72 73 74 61 74 65 20 ..(if currstate
4570: 20 28 63 6f 6e 63 20 22 73 74 61 74 65 3d 27 22 (conc "state='"
4580: 20 63 75 72 72 73 74 61 74 65 20 22 27 20 41 4e currstate "' AN
4590: 44 20 22 29 20 22 22 29 0a 09 09 09 09 09 28 69 D ") "")......(i
45a0: 66 20 63 75 72 72 73 74 61 74 75 73 20 28 63 6f f currstatus (co
45b0: 6e 63 20 22 73 74 61 74 75 73 3d 27 22 20 63 75 nc "status='" cu
45c0: 72 72 73 74 61 74 75 73 20 22 27 20 41 4e 44 20 rrstatus "' AND
45d0: 22 29 20 22 22 29 0a 09 09 09 09 09 22 20 72 75 ") "")......" ru
45e0: 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e n_id=? AND testn
45f0: 61 6d 65 3d 3f 20 41 4e 44 20 4e 4f 54 20 28 69 ame=? AND NOT (i
4600: 74 65 6d 5f 70 61 74 68 3d 27 27 20 41 4e 44 20 tem_path='' AND
4610: 74 65 73 74 6e 61 6d 65 20 69 6e 20 28 53 45 4c testname in (SEL
4620: 45 43 54 20 44 49 53 54 49 4e 43 54 20 74 65 73 ECT DISTINCT tes
4630: 74 6e 61 6d 65 20 46 52 4f 4d 20 74 65 73 74 73 tname FROM tests
4640: 20 57 48 45 52 45 20 74 65 73 74 6e 61 6d 65 3d WHERE testname=
4650: 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 20 ? AND item_path
4660: 21 3d 20 27 27 29 29 3b 22 29 29 29 0a 09 09 3b != ''));")))...;
4670: 3b 28 64 65 62 75 67 3a 70 72 69 6e 74 20 30 20 ;(debug:print 0
4680: 22 51 52 59 3a 20 22 20 71 72 79 29 0a 09 09 28 "QRY: " qry)...(
4690: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 sqlite3:execute
46a0: 64 62 20 71 72 79 20 72 75 6e 2d 69 64 20 6e 65 db qry run-id ne
46b0: 77 73 74 61 74 65 20 6e 65 77 73 74 61 74 75 73 wstate newstatus
46c0: 20 74 65 73 74 6e 61 6d 65 20 74 65 73 74 6e 61 testname testna
46d0: 6d 65 29 29 29 0a 09 20 20 20 20 74 65 73 74 6e me))).. testn
46e0: 61 6d 65 73 29 29 0a 0a 28 64 65 66 69 6e 65 20 ames))..(define
46f0: 28 64 62 3a 64 65 6c 65 74 65 2d 74 65 73 74 73 (db:delete-tests
4700: 2d 69 6e 2d 73 74 61 74 65 20 64 62 20 72 75 6e -in-state db run
4710: 2d 69 64 20 73 74 61 74 65 29 0a 20 20 28 73 71 -id state). (sq
4720: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 lite3:execute db
4730: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 65 "DELETE FROM te
4740: 73 74 73 20 57 48 45 52 45 20 73 74 61 74 65 3d sts WHERE state=
4750: 3f 20 41 4e 44 20 72 75 6e 5f 69 64 3d 3f 3b 22 ? AND run_id=?;"
4760: 20 73 74 61 74 65 20 72 75 6e 2d 69 64 29 29 0a state run-id)).
4770: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73 .(define (db:tes
4780: 74 2d 73 65 74 2d 73 74 61 74 65 2d 73 74 61 74 t-set-state-stat
4790: 75 73 2d 62 79 2d 69 64 20 64 62 20 74 65 73 74 us-by-id db test
47a0: 2d 69 64 20 6e 65 77 73 74 61 74 65 20 6e 65 77 -id newstate new
47b0: 73 74 61 74 75 73 20 6e 65 77 63 6f 6d 6d 65 6e status newcommen
47c0: 74 29 0a 20 20 28 69 66 20 6e 65 77 73 74 61 74 t). (if newstat
47d0: 65 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 e (sqlite3:exe
47e0: 63 75 74 65 20 64 62 20 22 55 50 44 41 54 45 20 cute db "UPDATE
47f0: 74 65 73 74 73 20 53 45 54 20 73 74 61 74 65 3d tests SET state=
4800: 3f 20 20 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 ? WHERE id=?;"
4810: 20 6e 65 77 73 74 61 74 65 20 20 20 74 65 73 74 newstate test
4820: 2d 69 64 29 29 0a 20 20 28 69 66 20 6e 65 77 73 -id)). (if news
4830: 74 61 74 75 73 20 20 28 73 71 6c 69 74 65 33 3a tatus (sqlite3:
4840: 65 78 65 63 75 74 65 20 64 62 20 22 55 50 44 41 execute db "UPDA
4850: 54 45 20 74 65 73 74 73 20 53 45 54 20 73 74 61 TE tests SET sta
4860: 74 75 73 3d 3f 20 20 57 48 45 52 45 20 69 64 3d tus=? WHERE id=
4870: 3f 3b 22 20 6e 65 77 73 74 61 74 75 73 20 20 74 ?;" newstatus t
4880: 65 73 74 2d 69 64 29 29 0a 20 20 28 69 66 20 6e est-id)). (if n
4890: 65 77 63 6f 6d 6d 65 6e 74 20 28 73 71 6c 69 74 ewcomment (sqlit
48a0: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 55 e3:execute db "U
48b0: 50 44 41 54 45 20 74 65 73 74 73 20 53 45 54 20 PDATE tests SET
48c0: 63 6f 6d 6d 65 6e 74 3d 3f 20 57 48 45 52 45 20 comment=? WHERE
48d0: 69 64 3d 3f 3b 22 20 6e 65 77 63 6f 6d 6d 65 6e id=?;" newcommen
48e0: 74 20 74 65 73 74 2d 69 64 29 29 29 0a 0a 28 64 t test-id)))..(d
48f0: 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 63 6f efine (db:get-co
4900: 75 6e 74 2d 74 65 73 74 73 2d 72 75 6e 6e 69 6e unt-tests-runnin
4910: 67 20 64 62 29 0a 20 20 28 6c 65 74 20 28 28 72 g db). (let ((r
4920: 65 73 20 30 29 29 0a 20 20 20 20 28 73 71 6c 69 es 0)). (sqli
4930: 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 te3:for-each-row
4940: 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 63 . (lambda (c
4950: 6f 75 6e 74 29 0a 20 20 20 20 20 20 20 28 73 65 ount). (se
4960: 74 21 20 72 65 73 20 63 6f 75 6e 74 29 29 0a 20 t! res count)).
4970: 20 20 20 20 64 62 0a 20 20 20 20 20 22 53 45 4c db. "SEL
4980: 45 43 54 20 63 6f 75 6e 74 28 69 64 29 20 46 52 ECT count(id) FR
4990: 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 73 OM tests WHERE s
49a0: 74 61 74 65 20 3d 20 27 52 55 4e 4e 49 4e 47 27 tate = 'RUNNING'
49b0: 20 4f 52 20 73 74 61 74 65 20 3d 20 27 4c 41 55 OR state = 'LAU
49c0: 4e 43 48 45 44 27 20 4f 52 20 73 74 61 74 65 20 NCHED' OR state
49d0: 3d 20 27 52 45 4d 4f 54 45 48 4f 53 54 53 54 41 = 'REMOTEHOSTSTA
49e0: 52 54 27 3b 22 29 0a 20 20 20 20 72 65 73 29 29 RT';"). res))
49f0: 0a 0a 3b 3b 20 64 6f 6e 65 20 77 69 74 68 20 72 ..;; done with r
4a00: 75 6e 20 77 68 65 6e 3a 0a 3b 3b 20 20 20 30 20 un when:.;; 0
4a10: 74 65 73 74 73 20 69 6e 20 4c 41 55 4e 43 48 45 tests in LAUNCHE
4a20: 44 2c 20 4e 4f 54 5f 53 54 41 52 54 45 44 2c 20 D, NOT_STARTED,
4a30: 52 45 4d 4f 54 45 48 4f 53 54 53 54 41 52 54 2c REMOTEHOSTSTART,
4a40: 20 52 55 4e 4e 49 4e 47 0a 28 64 65 66 69 6e 65 RUNNING.(define
4a50: 20 28 64 62 3a 65 73 74 69 6d 61 74 65 64 2d 74 (db:estimated-t
4a60: 65 73 74 73 2d 72 65 6d 61 69 6e 69 6e 67 20 64 ests-remaining d
4a70: 62 20 72 75 6e 2d 69 64 29 0a 20 20 28 6c 65 74 b run-id). (let
4a80: 20 28 28 72 65 73 20 30 29 29 0a 20 20 20 20 28 ((res 0)). (
4a90: 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 sqlite3:for-each
4aa0: 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 64 -row. (lambd
4ab0: 61 20 28 63 6f 75 6e 74 29 0a 20 20 20 20 20 20 a (count).
4ac0: 20 28 73 65 74 21 20 72 65 73 20 63 6f 75 6e 74 (set! res count
4ad0: 29 29 0a 20 20 20 20 20 64 62 20 3b 3b 20 4e 42 )). db ;; NB
4ae0: 2f 2f 20 4b 49 4c 4c 52 45 51 20 6d 65 61 6e 73 // KILLREQ means
4af0: 20 74 68 65 20 6a 6f 62 73 20 69 73 20 73 74 69 the jobs is sti
4b00: 6c 6c 20 70 72 6f 62 61 62 6c 79 20 72 75 6e 6e ll probably runn
4b10: 69 6e 67 0a 20 20 20 20 20 22 53 45 4c 45 43 54 ing. "SELECT
4b20: 20 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 count(id) FROM
4b30: 74 65 73 74 73 20 57 48 45 52 45 20 73 74 61 74 tests WHERE stat
4b40: 65 20 69 6e 20 28 27 4c 41 55 4e 43 48 45 44 27 e in ('LAUNCHED'
4b50: 2c 27 4e 4f 54 5f 53 54 41 52 54 45 44 27 2c 27 ,'NOT_STARTED','
4b60: 52 45 4d 4f 54 45 48 4f 53 54 53 54 41 52 54 27 REMOTEHOSTSTART'
4b70: 2c 27 52 55 4e 4e 49 4e 47 27 2c 27 4b 49 4c 4c ,'RUNNING','KILL
4b80: 52 45 51 27 29 20 41 4e 44 20 72 75 6e 5f 69 64 REQ') AND run_id
4b90: 3d 3f 3b 22 20 72 75 6e 2d 69 64 29 0a 20 20 20 =?;" run-id).
4ba0: 20 72 65 73 29 29 0a 0a 3b 3b 20 4e 42 2f 2f 20 res))..;; NB//
4bb0: 53 79 6e 63 20 74 68 69 73 20 77 69 74 68 20 72 Sync this with r
4bc0: 75 6e 73 3a 67 65 74 2d 74 65 73 74 2d 69 6e 66 uns:get-test-inf
4bd0: 6f 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 o.(define (db:ge
4be0: 74 2d 74 65 73 74 2d 69 6e 66 6f 20 64 62 20 72 t-test-info db r
4bf0: 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 69 un-id testname i
4c00: 74 65 6d 2d 70 61 74 68 29 0a 20 20 28 6c 65 74 tem-path). (let
4c10: 20 28 28 72 65 73 20 23 66 29 29 0a 20 20 20 20 ((res #f)).
4c20: 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 (sqlite3:for-eac
4c30: 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 h-row. (lamb
4c40: 64 61 20 28 69 64 20 72 75 6e 2d 69 64 20 74 65 da (id run-id te
4c50: 73 74 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61 stname state sta
4c60: 74 75 73 20 65 76 65 6e 74 2d 74 69 6d 65 20 68 tus event-time h
4c70: 6f 73 74 20 63 70 75 6c 6f 61 64 20 64 69 73 6b ost cpuload disk
4c80: 66 72 65 65 20 75 6e 61 6d 65 20 72 75 6e 64 69 free uname rundi
4c90: 72 20 69 74 65 6d 2d 70 61 74 68 20 72 75 6e 5f r item-path run_
4ca0: 64 75 72 61 74 69 6f 6e 20 66 69 6e 61 6c 5f 6c duration final_l
4cb0: 6f 67 66 20 63 6f 6d 6d 65 6e 74 20 29 0a 20 20 ogf comment ).
4cc0: 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28 (set! res (
4cd0: 76 65 63 74 6f 72 20 69 64 20 72 75 6e 2d 69 64 vector id run-id
4ce0: 20 74 65 73 74 6e 61 6d 65 20 73 74 61 74 65 20 testname state
4cf0: 73 74 61 74 75 73 20 65 76 65 6e 74 2d 74 69 6d status event-tim
4d00: 65 20 68 6f 73 74 20 63 70 75 6c 6f 61 64 20 64 e host cpuload d
4d10: 69 73 6b 66 72 65 65 20 75 6e 61 6d 65 20 72 75 iskfree uname ru
4d20: 6e 64 69 72 20 69 74 65 6d 2d 70 61 74 68 20 72 ndir item-path r
4d30: 75 6e 5f 64 75 72 61 74 69 6f 6e 20 66 69 6e 61 un_duration fina
4d40: 6c 5f 6c 6f 67 66 20 63 6f 6d 6d 65 6e 74 20 29 l_logf comment )
4d50: 29 29 0a 20 20 20 20 20 64 62 20 0a 20 20 20 20 )). db .
4d60: 20 22 53 45 4c 45 43 54 20 69 64 2c 72 75 6e 5f "SELECT id,run_
4d70: 69 64 2c 74 65 73 74 6e 61 6d 65 2c 73 74 61 74 id,testname,stat
4d80: 65 2c 73 74 61 74 75 73 2c 65 76 65 6e 74 5f 74 e,status,event_t
4d90: 69 6d 65 2c 68 6f 73 74 2c 63 70 75 6c 6f 61 64 ime,host,cpuload
4da0: 2c 64 69 73 6b 66 72 65 65 2c 75 6e 61 6d 65 2c ,diskfree,uname,
4db0: 72 75 6e 64 69 72 2c 69 74 65 6d 5f 70 61 74 68 rundir,item_path
4dc0: 2c 72 75 6e 5f 64 75 72 61 74 69 6f 6e 2c 66 69 ,run_duration,fi
4dd0: 6e 61 6c 5f 6c 6f 67 66 2c 63 6f 6d 6d 65 6e 74 nal_logf,comment
4de0: 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 FROM tests WHER
4df0: 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 E run_id=? AND t
4e00: 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 estname=? AND it
4e10: 65 6d 5f 70 61 74 68 3d 3f 3b 22 0a 20 20 20 20 em_path=?;".
4e20: 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 run-id testname
4e30: 20 69 74 65 6d 2d 70 61 74 68 29 0a 20 20 20 20 item-path).
4e40: 72 65 73 29 29 0a 0a 3b 3b 20 47 65 74 20 74 65 res))..;; Get te
4e50: 73 74 20 64 61 74 61 20 75 73 69 6e 67 20 74 65 st data using te
4e60: 73 74 5f 69 64 0a 28 64 65 66 69 6e 65 20 28 64 st_id.(define (d
4e70: 62 3a 67 65 74 2d 74 65 73 74 2d 64 61 74 61 2d b:get-test-data-
4e80: 62 79 2d 69 64 20 64 62 20 74 65 73 74 2d 69 64 by-id db test-id
4e90: 29 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20 23 ). (let ((res #
4ea0: 66 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 f)). (sqlite3
4eb0: 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 :for-each-row.
4ec0: 20 20 20 28 6c 61 6d 62 64 61 20 28 69 64 20 72 (lambda (id r
4ed0: 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 73 un-id testname s
4ee0: 74 61 74 65 20 73 74 61 74 75 73 20 65 76 65 6e tate status even
4ef0: 74 2d 74 69 6d 65 20 68 6f 73 74 20 63 70 75 6c t-time host cpul
4f00: 6f 61 64 20 64 69 73 6b 66 72 65 65 20 75 6e 61 oad diskfree una
4f10: 6d 65 20 72 75 6e 64 69 72 20 69 74 65 6d 2d 70 me rundir item-p
4f20: 61 74 68 20 72 75 6e 5f 64 75 72 61 74 69 6f 6e ath run_duration
4f30: 20 66 69 6e 61 6c 5f 6c 6f 67 66 20 63 6f 6d 6d final_logf comm
4f40: 65 6e 74 29 0a 20 20 20 20 20 20 20 28 73 65 74 ent). (set
4f50: 21 20 72 65 73 20 28 76 65 63 74 6f 72 20 69 64 ! res (vector id
4f60: 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 run-id testname
4f70: 20 73 74 61 74 65 20 73 74 61 74 75 73 20 65 76 state status ev
4f80: 65 6e 74 2d 74 69 6d 65 20 68 6f 73 74 20 63 70 ent-time host cp
4f90: 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20 75 uload diskfree u
4fa0: 6e 61 6d 65 20 72 75 6e 64 69 72 20 69 74 65 6d name rundir item
4fb0: 2d 70 61 74 68 20 72 75 6e 5f 64 75 72 61 74 69 -path run_durati
4fc0: 6f 6e 20 66 69 6e 61 6c 5f 6c 6f 67 66 20 63 6f on final_logf co
4fd0: 6d 6d 65 6e 74 29 29 29 0a 20 20 20 20 20 64 62 mment))). db
4fe0: 20 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20 69 . "SELECT i
4ff0: 64 2c 72 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d d,run_id,testnam
5000: 65 2c 73 74 61 74 65 2c 73 74 61 74 75 73 2c 65 e,state,status,e
5010: 76 65 6e 74 5f 74 69 6d 65 2c 68 6f 73 74 2c 63 vent_time,host,c
5020: 70 75 6c 6f 61 64 2c 64 69 73 6b 66 72 65 65 2c puload,diskfree,
5030: 75 6e 61 6d 65 2c 72 75 6e 64 69 72 2c 69 74 65 uname,rundir,ite
5040: 6d 5f 70 61 74 68 2c 72 75 6e 5f 64 75 72 61 74 m_path,run_durat
5050: 69 6f 6e 2c 66 69 6e 61 6c 5f 6c 6f 67 66 2c 63 ion,final_logf,c
5060: 6f 6d 6d 65 6e 74 20 46 52 4f 4d 20 74 65 73 74 omment FROM test
5070: 73 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 0a 20 s WHERE id=?;".
5080: 20 20 20 20 74 65 73 74 2d 69 64 29 0a 20 20 20 test-id).
5090: 20 72 65 73 29 29 0a 0a 0a 28 64 65 66 69 6e 65 res))...(define
50a0: 20 28 64 62 3a 74 65 73 74 2d 73 65 74 2d 63 6f (db:test-set-co
50b0: 6d 6d 65 6e 74 20 64 62 20 72 75 6e 2d 69 64 20 mment db run-id
50c0: 74 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61 testname item-pa
50d0: 74 68 20 63 6f 6d 6d 65 6e 74 29 0a 20 20 28 73 th comment). (s
50e0: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 0a qlite3:execute .
50f0: 20 20 20 64 62 20 0a 20 20 20 22 55 50 44 41 54 db . "UPDAT
5100: 45 20 74 65 73 74 73 20 53 45 54 20 63 6f 6d 6d E tests SET comm
5110: 65 6e 74 3d 3f 20 57 48 45 52 45 20 72 75 6e 5f ent=? WHERE run_
5120: 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d id=? AND testnam
5130: 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 e=? AND item_pat
5140: 68 3d 3f 3b 22 0a 20 20 20 20 20 63 6f 6d 6d 65 h=?;". comme
5150: 6e 74 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 nt run-id testna
5160: 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 29 0a 0a me item-path))..
5170: 3b 3b 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 74 ;;.(define (db:t
5180: 65 73 74 2d 73 65 74 2d 72 75 6e 64 69 72 21 20 est-set-rundir!
5190: 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 db run-id testna
51a0: 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 72 75 6e me item-path run
51b0: 64 69 72 29 0a 20 20 28 73 71 6c 69 74 65 33 3a dir). (sqlite3:
51c0: 65 78 65 63 75 74 65 20 0a 20 20 20 64 62 20 0a execute . db .
51d0: 20 20 20 22 55 50 44 41 54 45 20 74 65 73 74 73 "UPDATE tests
51e0: 20 53 45 54 20 72 75 6e 64 69 72 3d 3f 20 57 48 SET rundir=? WH
51f0: 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 ERE run_id=? AND
5200: 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 testname=? AND
5210: 69 74 65 6d 5f 70 61 74 68 3d 3f 3b 22 0a 20 20 item_path=?;".
5220: 20 20 20 72 75 6e 64 69 72 20 72 75 6e 2d 69 64 rundir run-id
5230: 20 74 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 testname item-p
5240: 61 74 68 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d ath))..;;=======
5250: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5260: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5270: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5280: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a ===============.
5290: 3b 3b 20 54 65 73 74 73 20 6d 65 74 61 20 64 61 ;; Tests meta da
52a0: 74 61 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ta.;;===========
52b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
52c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
52d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
52e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 ===========..;;
52f0: 72 65 61 64 20 74 68 65 20 72 65 63 6f 72 64 20 read the record
5300: 67 69 76 65 6e 20 61 20 74 65 73 74 6e 61 6d 65 given a testname
5310: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73 .(define (db:tes
5320: 74 6d 65 74 61 2d 67 65 74 2d 72 65 63 6f 72 64 tmeta-get-record
5330: 20 64 62 20 74 65 73 74 6e 61 6d 65 29 0a 20 20 db testname).
5340: 28 6c 65 74 20 28 28 72 65 73 20 23 66 29 29 0a (let ((res #f)).
5350: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 (sqlite3:for
5360: 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 -each-row. (
5370: 6c 61 6d 62 64 61 20 28 69 64 20 74 65 73 74 6e lambda (id testn
5380: 61 6d 65 20 61 75 74 68 6f 72 20 6f 77 6e 65 72 ame author owner
5390: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 72 65 76 description rev
53a0: 69 65 77 65 64 20 69 74 65 72 61 74 65 64 20 61 iewed iterated a
53b0: 76 67 5f 72 75 6e 74 69 6d 65 20 61 76 67 5f 64 vg_runtime avg_d
53c0: 69 73 6b 20 74 61 67 73 29 0a 20 20 20 20 20 20 isk tags).
53d0: 20 28 73 65 74 21 20 72 65 73 20 28 76 65 63 74 (set! res (vect
53e0: 6f 72 20 69 64 20 74 65 73 74 6e 61 6d 65 20 61 or id testname a
53f0: 75 74 68 6f 72 20 6f 77 6e 65 72 20 64 65 73 63 uthor owner desc
5400: 72 69 70 74 69 6f 6e 20 72 65 76 69 65 77 65 64 ription reviewed
5410: 20 69 74 65 72 61 74 65 64 20 61 76 67 5f 72 75 iterated avg_ru
5420: 6e 74 69 6d 65 20 61 76 67 5f 64 69 73 6b 20 74 ntime avg_disk t
5430: 61 67 73 29 29 29 0a 20 20 20 20 20 64 62 20 22 ags))). db "
5440: 53 45 4c 45 43 54 20 69 64 2c 74 65 73 74 6e 61 SELECT id,testna
5450: 6d 65 2c 61 75 74 68 6f 72 2c 6f 77 6e 65 72 2c me,author,owner,
5460: 64 65 73 63 72 69 70 74 69 6f 6e 2c 72 65 76 69 description,revi
5470: 65 77 65 64 2c 69 74 65 72 61 74 65 64 2c 61 76 ewed,iterated,av
5480: 67 5f 72 75 6e 74 69 6d 65 2c 61 76 67 5f 64 69 g_runtime,avg_di
5490: 73 6b 2c 74 61 67 73 20 46 52 4f 4d 20 74 65 73 sk,tags FROM tes
54a0: 74 5f 6d 65 74 61 20 57 48 45 52 45 20 74 65 73 t_meta WHERE tes
54b0: 74 6e 61 6d 65 3d 3f 3b 22 0a 20 20 20 20 20 74 tname=?;". t
54c0: 65 73 74 6e 61 6d 65 29 0a 20 20 20 20 72 65 73 estname). res
54d0: 29 29 0a 0a 3b 3b 20 63 72 65 61 74 65 20 61 20 ))..;; create a
54e0: 6e 65 77 20 72 65 63 6f 72 64 20 66 6f 72 20 61 new record for a
54f0: 20 67 69 76 65 6e 20 74 65 73 74 6e 61 6d 65 0a given testname.
5500: 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74 (define (db:test
5510: 6d 65 74 61 2d 61 64 64 2d 72 65 63 6f 72 64 20 meta-add-record
5520: 64 62 20 74 65 73 74 6e 61 6d 65 29 0a 20 20 28 db testname). (
5530: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 sqlite3:execute
5540: 64 62 20 22 49 4e 53 45 52 54 20 4f 52 20 49 47 db "INSERT OR IG
5550: 4e 4f 52 45 20 49 4e 54 4f 20 74 65 73 74 5f 6d NORE INTO test_m
5560: 65 74 61 20 28 74 65 73 74 6e 61 6d 65 2c 61 75 eta (testname,au
5570: 74 68 6f 72 2c 6f 77 6e 65 72 2c 64 65 73 63 72 thor,owner,descr
5580: 69 70 74 69 6f 6e 2c 72 65 76 69 65 77 65 64 2c iption,reviewed,
5590: 69 74 65 72 61 74 65 64 2c 61 76 67 5f 72 75 6e iterated,avg_run
55a0: 74 69 6d 65 2c 61 76 67 5f 64 69 73 6b 2c 74 61 time,avg_disk,ta
55b0: 67 73 29 20 56 41 4c 55 45 53 20 28 3f 2c 27 27 gs) VALUES (?,''
55c0: 2c 27 27 2c 27 27 2c 27 27 2c 27 27 2c 27 27 2c ,'','','','','',
55d0: 27 27 2c 27 27 29 3b 22 20 74 65 73 74 6e 61 6d '','');" testnam
55e0: 65 29 29 0a 0a 3b 3b 20 75 70 64 61 74 65 20 6f e))..;; update o
55f0: 6e 65 20 6f 66 20 74 68 65 20 74 65 73 74 6d 65 ne of the testme
5600: 74 61 20 66 69 65 6c 64 73 0a 28 64 65 66 69 6e ta fields.(defin
5610: 65 20 28 64 62 3a 74 65 73 74 6d 65 74 61 2d 75 e (db:testmeta-u
5620: 70 64 61 74 65 2d 66 69 65 6c 64 20 64 62 20 74 pdate-field db t
5630: 65 73 74 6e 61 6d 65 20 66 69 65 6c 64 20 76 61 estname field va
5640: 6c 75 65 29 0a 20 20 28 73 71 6c 69 74 65 33 3a lue). (sqlite3:
5650: 65 78 65 63 75 74 65 20 64 62 20 28 63 6f 6e 63 execute db (conc
5660: 20 22 55 50 44 41 54 45 20 74 65 73 74 5f 6d 65 "UPDATE test_me
5670: 74 61 20 53 45 54 20 22 20 66 69 65 6c 64 20 22 ta SET " field "
5680: 3d 3f 20 57 48 45 52 45 20 74 65 73 74 6e 61 6d =? WHERE testnam
5690: 65 3d 3f 3b 22 29 20 76 61 6c 75 65 20 74 65 73 e=?;") value tes
56a0: 74 6e 61 6d 65 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d tname))..;;=====
56b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
56c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
56d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
56e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
56f0: 3d 0a 3b 3b 20 54 20 45 20 53 20 54 20 20 20 44 =.;; T E S T D
5700: 20 41 20 54 20 41 20 0a 3b 3b 3d 3d 3d 3d 3d 3d A T A .;;======
5710: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5720: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5730: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5740: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5750: 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 63 73 ..(define (db:cs
5760: 76 2d 3e 74 65 73 74 2d 64 61 74 61 20 64 62 20 v->test-data db
5770: 74 65 73 74 2d 69 64 20 63 73 76 64 61 74 61 29 test-id csvdata)
5780: 0a 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 . (debug:print
5790: 34 20 22 74 65 73 74 2d 69 64 20 22 20 74 65 73 4 "test-id " tes
57a0: 74 2d 69 64 20 22 2c 20 63 73 76 64 61 74 61 3a t-id ", csvdata:
57b0: 20 22 20 63 73 76 64 61 74 61 29 0a 20 20 28 6c " csvdata). (l
57c0: 65 74 20 28 28 63 73 76 6c 69 73 74 20 28 63 73 et ((csvlist (cs
57d0: 76 2d 3e 6c 69 73 74 20 28 6d 61 6b 65 2d 63 73 v->list (make-cs
57e0: 76 2d 72 65 61 64 65 72 0a 09 09 09 20 20 20 20 v-reader....
57f0: 20 28 6f 70 65 6e 2d 69 6e 70 75 74 2d 73 74 72 (open-input-str
5800: 69 6e 67 20 63 73 76 64 61 74 61 29 0a 09 09 09 ing csvdata)....
5810: 20 20 20 20 20 27 28 28 73 74 72 69 70 2d 6c 65 '((strip-le
5820: 61 64 69 6e 67 2d 77 68 69 74 65 73 70 61 63 65 ading-whitespace
5830: 3f 20 23 74 29 0a 09 09 09 20 20 20 20 20 20 20 ? #t)....
5840: 28 73 74 72 69 70 2d 74 72 61 69 6c 69 6e 67 2d (strip-trailing-
5850: 77 68 69 74 65 73 70 61 63 65 3f 20 23 74 29 29 whitespace? #t))
5860: 20 29 29 29 29 20 3b 3b 20 28 63 73 76 2d 3e 6c )))) ;; (csv->l
5870: 69 73 74 20 63 73 76 64 61 74 61 29 29 29 0a 20 ist csvdata))).
5880: 20 20 20 28 66 6f 72 2d 65 61 63 68 20 0a 20 20 (for-each .
5890: 20 20 20 28 6c 61 6d 62 64 61 20 28 63 73 76 72 (lambda (csvr
58a0: 6f 77 29 0a 20 20 20 20 20 20 20 28 6c 65 74 2a ow). (let*
58b0: 20 28 28 70 61 64 64 65 64 2d 72 6f 77 20 20 28 ((padded-row (
58c0: 74 61 6b 65 20 28 61 70 70 65 6e 64 20 63 73 76 take (append csv
58d0: 72 6f 77 20 28 6c 69 73 74 20 23 66 20 23 66 20 row (list #f #f
58e0: 23 66 20 23 66 20 23 66 20 23 66 20 23 66 20 23 #f #f #f #f #f #
58f0: 66 29 29 20 38 29 29 0a 09 20 20 20 20 20 20 28 f)) 8)).. (
5900: 63 61 74 65 67 6f 72 79 20 20 20 20 28 6c 69 73 category (lis
5910: 74 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77 t-ref padded-row
5920: 20 30 29 29 0a 09 20 20 20 20 20 20 28 76 61 72 0)).. (var
5930: 69 61 62 6c 65 20 20 20 20 28 6c 69 73 74 2d 72 iable (list-r
5940: 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20 31 29 ef padded-row 1)
5950: 29 0a 09 20 20 20 20 20 20 28 76 61 6c 75 65 20 ).. (value
5960: 20 20 20 20 20 20 28 61 6e 79 2d 3e 6e 75 6d 62 (any->numb
5970: 65 72 2d 69 66 2d 70 6f 73 73 69 62 6c 65 20 28 er-if-possible (
5980: 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d list-ref padded-
5990: 72 6f 77 20 32 29 29 29 0a 09 20 20 20 20 20 20 row 2)))..
59a0: 28 65 78 70 65 63 74 65 64 20 20 20 20 28 61 6e (expected (an
59b0: 79 2d 3e 6e 75 6d 62 65 72 2d 69 66 2d 70 6f 73 y->number-if-pos
59c0: 73 69 62 6c 65 20 28 6c 69 73 74 2d 72 65 66 20 sible (list-ref
59d0: 70 61 64 64 65 64 2d 72 6f 77 20 33 29 29 29 0a padded-row 3))).
59e0: 09 20 20 20 20 20 20 28 74 6f 6c 20 20 20 20 20 . (tol
59f0: 20 20 20 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 (any->number
5a00: 2d 69 66 2d 70 6f 73 73 69 62 6c 65 20 28 6c 69 -if-possible (li
5a10: 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f st-ref padded-ro
5a20: 77 20 34 29 29 29 20 3b 3b 20 3e 2c 20 3c 2c 20 w 4))) ;; >, <,
5a30: 3e 3d 2c 20 3c 3d 2c 20 6f 72 20 61 20 6e 75 6d >=, <=, or a num
5a40: 62 65 72 0a 09 20 20 20 20 20 20 28 75 6e 69 74 ber.. (unit
5a50: 73 20 20 20 20 20 20 20 28 6c 69 73 74 2d 72 65 s (list-re
5a60: 66 20 70 61 64 64 65 64 2d 72 6f 77 20 35 29 29 f padded-row 5))
5a70: 0a 09 20 20 20 20 20 20 28 63 6f 6d 6d 65 6e 74 .. (comment
5a80: 20 20 20 20 20 28 6c 69 73 74 2d 72 65 66 20 70 (list-ref p
5a90: 61 64 64 65 64 2d 72 6f 77 20 36 29 29 0a 09 20 added-row 6))..
5aa0: 20 20 20 20 20 28 73 74 61 74 75 73 20 20 20 20 (status
5ab0: 20 20 28 6c 65 74 20 28 28 73 20 28 6c 69 73 74 (let ((s (list
5ac0: 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20 -ref padded-row
5ad0: 37 29 29 29 0a 09 09 09 20 20 20 20 20 28 69 66 7))).... (if
5ae0: 20 28 61 6e 64 20 28 73 74 72 69 6e 67 3f 20 73 (and (string? s
5af0: 29 28 6f 72 20 28 73 74 72 69 6e 67 2d 6d 61 74 )(or (string-mat
5b00: 63 68 20 28 72 65 67 65 78 70 20 22 5e 5c 5c 73 ch (regexp "^\\s
5b10: 2a 24 22 29 20 73 29 0a 09 09 09 09 09 09 20 20 *$") s).......
5b20: 20 20 20 28 73 74 72 69 6e 67 2d 6d 61 74 63 68 (string-match
5b30: 20 28 72 65 67 65 78 70 20 22 5e 6e 2f 61 24 22 (regexp "^n/a$"
5b40: 29 20 73 29 29 29 0a 09 09 09 09 20 23 66 0a 09 ) s)))..... #f..
5b50: 09 09 09 20 73 29 29 29 29 20 3b 3b 20 69 66 20 ... s)))) ;; if
5b60: 73 70 65 63 69 66 69 65 64 20 6f 6e 20 74 68 65 specified on the
5b70: 20 69 6e 70 75 74 20 74 68 65 6e 20 75 73 65 2c input then use,
5b80: 20 65 6c 73 65 20 63 61 6c 63 75 6c 61 74 65 0a else calculate.
5b90: 09 20 3b 3b 20 6c 6f 6f 6b 20 75 70 20 65 78 70 . ;; look up exp
5ba0: 65 63 74 65 64 2c 74 6f 6c 2c 75 6e 69 74 73 20 ected,tol,units
5bb0: 66 72 6f 6d 20 70 72 65 76 69 6f 75 73 20 62 65 from previous be
5bc0: 73 74 20 66 69 74 20 74 65 73 74 20 69 66 20 74 st fit test if t
5bd0: 68 65 79 20 61 72 65 20 61 6c 6c 20 65 69 74 68 hey are all eith
5be0: 65 72 20 23 66 20 6f 72 20 27 27 0a 09 20 28 64 er #f or ''.. (d
5bf0: 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22 42 45 ebug:print 4 "BE
5c00: 46 4f 52 45 3a 20 63 61 74 65 67 6f 72 79 3a 20 FORE: category:
5c10: 22 20 63 61 74 65 67 6f 72 79 20 22 20 76 61 72 " category " var
5c20: 69 61 62 6c 65 3a 20 22 20 76 61 72 69 61 62 6c iable: " variabl
5c30: 65 20 22 20 76 61 6c 75 65 3a 20 22 20 76 61 6c e " value: " val
5c40: 75 65 20 0a 09 09 20 20 20 20 20 20 22 2c 20 65 ue ... ", e
5c50: 78 70 65 63 74 65 64 3a 20 22 20 65 78 70 65 63 xpected: " expec
5c60: 74 65 64 20 22 20 74 6f 6c 3a 20 22 20 74 6f 6c ted " tol: " tol
5c70: 20 22 20 75 6e 69 74 73 3a 20 22 20 75 6e 69 74 " units: " unit
5c80: 73 20 22 20 73 74 61 74 75 73 3a 20 22 20 73 74 s " status: " st
5c90: 61 74 75 73 20 22 20 63 6f 6d 6d 65 6e 74 3a 20 atus " comment:
5ca0: 22 20 63 6f 6d 6d 65 6e 74 29 0a 0a 09 20 28 69 " comment)... (i
5cb0: 66 20 28 61 6e 64 20 28 6f 72 20 28 6e 6f 74 20 f (and (or (not
5cc0: 65 78 70 65 63 74 65 64 29 28 65 71 75 61 6c 3f expected)(equal?
5cd0: 20 65 78 70 65 63 74 65 64 20 22 22 29 29 0a 09 expected ""))..
5ce0: 09 20 20 28 6f 72 20 28 6e 6f 74 20 74 6f 6c 29 . (or (not tol)
5cf0: 20 20 20 20 20 28 65 71 75 61 6c 3f 20 65 78 70 (equal? exp
5d00: 65 63 74 65 64 20 22 22 29 29 0a 09 09 20 20 28 ected ""))... (
5d10: 6f 72 20 28 6e 6f 74 20 75 6e 69 74 73 29 20 20 or (not units)
5d20: 20 28 65 71 75 61 6c 3f 20 65 78 70 65 63 74 65 (equal? expecte
5d30: 64 20 22 22 29 29 29 0a 09 20 20 20 20 20 28 6c d ""))).. (l
5d40: 65 74 2d 76 61 6c 75 65 73 20 28 28 28 6e 65 77 et-values (((new
5d50: 2d 65 78 70 65 63 74 65 64 20 6e 65 77 2d 74 6f -expected new-to
5d60: 6c 20 6e 65 77 2d 75 6e 69 74 73 29 28 64 62 3a l new-units)(db:
5d70: 67 65 74 2d 70 72 65 76 2d 74 6f 6c 2d 66 6f 72 get-prev-tol-for
5d80: 2d 74 65 73 74 20 64 62 20 74 65 73 74 2d 69 64 -test db test-id
5d90: 20 63 61 74 65 67 6f 72 79 20 76 61 72 69 61 62 category variab
5da0: 6c 65 29 29 29 0a 09 20 20 20 20 20 20 20 28 73 le))).. (s
5db0: 65 74 21 20 65 78 70 65 63 74 65 64 20 6e 65 77 et! expected new
5dc0: 2d 65 78 70 65 63 74 65 64 29 0a 09 20 20 20 20 -expected)..
5dd0: 20 20 20 28 73 65 74 21 20 74 6f 6c 20 20 20 20 (set! tol
5de0: 20 20 6e 65 77 2d 74 6f 6c 29 0a 09 20 20 20 20 new-tol)..
5df0: 20 20 20 28 73 65 74 21 20 75 6e 69 74 73 20 20 (set! units
5e00: 20 20 6e 65 77 2d 75 6e 69 74 73 29 29 29 0a 0a new-units)))..
5e10: 09 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 . (debug:print 4
5e20: 20 22 41 46 54 45 52 3a 20 20 63 61 74 65 67 6f "AFTER: catego
5e30: 72 79 3a 20 22 20 63 61 74 65 67 6f 72 79 20 22 ry: " category "
5e40: 20 76 61 72 69 61 62 6c 65 3a 20 22 20 76 61 72 variable: " var
5e50: 69 61 62 6c 65 20 22 20 76 61 6c 75 65 3a 20 22 iable " value: "
5e60: 20 76 61 6c 75 65 20 0a 09 09 20 20 20 20 20 20 value ...
5e70: 22 2c 20 65 78 70 65 63 74 65 64 3a 20 22 20 65 ", expected: " e
5e80: 78 70 65 63 74 65 64 20 22 20 74 6f 6c 3a 20 22 xpected " tol: "
5e90: 20 74 6f 6c 20 22 20 75 6e 69 74 73 3a 20 22 20 tol " units: "
5ea0: 75 6e 69 74 73 20 22 20 73 74 61 74 75 73 3a 20 units " status:
5eb0: 22 20 73 74 61 74 75 73 20 22 20 63 6f 6d 6d 65 " status " comme
5ec0: 6e 74 3a 20 22 20 63 6f 6d 6d 65 6e 74 29 0a 09 nt: " comment)..
5ed0: 20 3b 3b 20 63 61 6c 63 75 6c 61 74 65 20 73 74 ;; calculate st
5ee0: 61 74 75 73 20 69 66 20 4e 4f 54 20 73 70 65 63 atus if NOT spec
5ef0: 69 66 69 65 64 0a 09 20 28 69 66 20 28 61 6e 64 ified.. (if (and
5f00: 20 28 6e 6f 74 20 73 74 61 74 75 73 29 28 6e 75 (not status)(nu
5f10: 6d 62 65 72 3f 20 65 78 70 65 63 74 65 64 29 28 mber? expected)(
5f20: 6e 75 6d 62 65 72 3f 20 76 61 6c 75 65 29 29 20 number? value))
5f30: 3b 3b 20 6e 65 65 64 20 65 78 70 65 63 74 65 64 ;; need expected
5f40: 20 61 6e 64 20 76 61 6c 75 65 20 74 6f 20 62 65 and value to be
5f50: 20 6e 75 6d 62 65 72 73 0a 09 20 20 20 20 20 28 numbers.. (
5f60: 69 66 20 28 6e 75 6d 62 65 72 3f 20 74 6f 6c 29 if (number? tol)
5f70: 20 3b 3b 20 69 66 20 74 6f 6c 20 69 73 20 61 20 ;; if tol is a
5f80: 6e 75 6d 62 65 72 20 74 68 65 6e 20 77 65 20 64 number then we d
5f90: 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 63 o the standard c
5fa0: 6f 6d 70 61 72 69 73 6f 6e 0a 09 09 20 28 6c 65 omparison... (le
5fb0: 74 2a 20 28 28 6d 61 78 2d 76 61 6c 20 28 2b 20 t* ((max-val (+
5fc0: 65 78 70 65 63 74 65 64 20 74 6f 6c 29 29 0a 09 expected tol))..
5fd0: 09 09 28 6d 69 6e 2d 76 61 6c 20 28 2d 20 65 78 ..(min-val (- ex
5fe0: 70 65 63 74 65 64 20 74 6f 6c 29 29 0a 09 09 09 pected tol))....
5ff0: 28 72 65 73 75 6c 74 20 20 28 61 6e 64 20 28 3e (result (and (>
6000: 3d 20 20 76 61 6c 75 65 20 6d 69 6e 2d 76 61 6c = value min-val
6010: 29 28 3c 3d 20 76 61 6c 75 65 20 6d 61 78 2d 76 )(<= value max-v
6020: 61 6c 29 29 29 29 0a 09 09 20 20 20 28 64 65 62 al))))... (deb
6030: 75 67 3a 70 72 69 6e 74 20 34 20 22 6d 61 78 2d ug:print 4 "max-
6040: 76 61 6c 3a 20 22 20 6d 61 78 2d 76 61 6c 20 22 val: " max-val "
6050: 20 6d 69 6e 2d 76 61 6c 3a 20 22 20 6d 69 6e 2d min-val: " min-
6060: 76 61 6c 20 22 20 72 65 73 75 6c 74 3a 20 22 20 val " result: "
6070: 72 65 73 75 6c 74 29 0a 09 09 20 20 20 28 73 65 result)... (se
6080: 74 21 20 73 74 61 74 75 73 20 28 69 66 20 72 65 t! status (if re
6090: 73 75 6c 74 20 22 70 61 73 73 22 20 22 66 61 69 sult "pass" "fai
60a0: 6c 22 29 29 29 0a 09 09 20 28 73 65 74 21 20 73 l")))... (set! s
60b0: 74 61 74 75 73 20 3b 3b 20 4e 42 2f 2f 20 6e 65 tatus ;; NB// ne
60c0: 65 64 20 74 6f 20 61 73 73 65 73 73 20 65 61 63 ed to assess eac
60d0: 68 20 6f 6e 65 20 28 69 2e 65 2e 20 6e 6f 74 20 h one (i.e. not
60e0: 72 65 74 75 72 6e 20 6f 70 65 72 61 74 6f 72 20 return operator
60f0: 73 69 6e 63 65 20 6e 65 65 64 20 74 6f 20 61 63 since need to ac
6100: 74 20 69 66 20 6e 6f 74 20 76 61 6c 69 64 20 6f t if not valid o
6110: 70 2e 0a 09 09 20 20 20 20 20 20 20 28 63 61 73 p.... (cas
6120: 65 20 28 73 74 72 69 6e 67 2d 3e 73 79 6d 62 6f e (string->symbo
6130: 6c 20 74 6f 6c 29 20 3b 3b 20 74 6f 6c 20 73 68 l tol) ;; tol sh
6140: 6f 75 6c 64 20 62 65 20 3e 2c 20 3c 2c 20 3e 3d ould be >, <, >=
6150: 2c 20 3c 3d 0a 09 09 09 20 28 28 3e 29 20 20 28 , <=.... ((>) (
6160: 69 66 20 28 3e 20 20 76 61 6c 75 65 20 65 78 70 if (> value exp
6170: 65 63 74 65 64 29 20 22 70 61 73 73 22 20 22 66 ected) "pass" "f
6180: 61 69 6c 22 29 29 0a 09 09 09 20 28 28 3c 29 20 ail")).... ((<)
6190: 20 28 69 66 20 28 3c 20 20 76 61 6c 75 65 20 65 (if (< value e
61a0: 78 70 65 63 74 65 64 29 20 22 70 61 73 73 22 20 xpected) "pass"
61b0: 22 66 61 69 6c 22 29 29 0a 09 09 09 20 28 28 3e "fail")).... ((>
61c0: 3d 29 20 28 69 66 20 28 3e 3d 20 76 61 6c 75 65 =) (if (>= value
61d0: 20 65 78 70 65 63 74 65 64 29 20 22 70 61 73 73 expected) "pass
61e0: 22 20 22 66 61 69 6c 22 29 29 0a 09 09 09 20 28 " "fail")).... (
61f0: 28 3c 3d 29 20 28 69 66 20 28 3c 3d 20 76 61 6c (<=) (if (<= val
6200: 75 65 20 65 78 70 65 63 74 65 64 29 20 22 70 61 ue expected) "pa
6210: 73 73 22 20 22 66 61 69 6c 22 29 29 0a 09 09 09 ss" "fail"))....
6220: 20 28 65 6c 73 65 20 28 63 6f 6e 63 20 22 45 52 (else (conc "ER
6230: 52 4f 52 3a 20 62 61 64 20 74 6f 6c 20 63 6f 6d ROR: bad tol com
6240: 70 61 72 61 74 6f 72 20 22 20 74 6f 6c 29 29 29 parator " tol)))
6250: 29 29 29 0a 09 20 28 64 65 62 75 67 3a 70 72 69 ))).. (debug:pri
6260: 6e 74 20 34 20 22 41 46 54 45 52 32 3a 20 63 61 nt 4 "AFTER2: ca
6270: 74 65 67 6f 72 79 3a 20 22 20 63 61 74 65 67 6f tegory: " catego
6280: 72 79 20 22 20 76 61 72 69 61 62 6c 65 3a 20 22 ry " variable: "
6290: 20 76 61 72 69 61 62 6c 65 20 22 20 76 61 6c 75 variable " valu
62a0: 65 3a 20 22 20 76 61 6c 75 65 20 0a 09 09 20 20 e: " value ...
62b0: 20 20 20 20 22 2c 20 65 78 70 65 63 74 65 64 3a ", expected:
62c0: 20 22 20 65 78 70 65 63 74 65 64 20 22 20 74 6f " expected " to
62d0: 6c 3a 20 22 20 74 6f 6c 20 22 20 75 6e 69 74 73 l: " tol " units
62e0: 3a 20 22 20 75 6e 69 74 73 20 22 20 73 74 61 74 : " units " stat
62f0: 75 73 3a 20 22 20 73 74 61 74 75 73 20 22 20 63 us: " status " c
6300: 6f 6d 6d 65 6e 74 3a 20 22 20 63 6f 6d 6d 65 6e omment: " commen
6310: 74 29 0a 09 20 28 73 71 6c 69 74 65 33 3a 65 78 t).. (sqlite3:ex
6320: 65 63 75 74 65 20 64 62 20 22 49 4e 53 45 52 54 ecute db "INSERT
6330: 20 4f 52 20 52 45 50 4c 41 43 45 20 49 4e 54 4f OR REPLACE INTO
6340: 20 74 65 73 74 5f 64 61 74 61 20 28 74 65 73 74 test_data (test
6350: 5f 69 64 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 _id,category,var
6360: 69 61 62 6c 65 2c 76 61 6c 75 65 2c 65 78 70 65 iable,value,expe
6370: 63 74 65 64 2c 74 6f 6c 2c 75 6e 69 74 73 2c 63 cted,tol,units,c
6380: 6f 6d 6d 65 6e 74 2c 73 74 61 74 75 73 29 20 56 omment,status) V
6390: 41 4c 55 45 53 20 28 3f 2c 3f 2c 3f 2c 3f 2c 3f ALUES (?,?,?,?,?
63a0: 2c 3f 2c 3f 2c 3f 2c 3f 29 3b 22 0a 09 20 20 20 ,?,?,?,?);"..
63b0: 20 20 20 74 65 73 74 2d 69 64 20 63 61 74 65 67 test-id categ
63c0: 6f 72 79 20 76 61 72 69 61 62 6c 65 20 76 61 6c ory variable val
63d0: 75 65 20 65 78 70 65 63 74 65 64 20 74 6f 6c 20 ue expected tol
63e0: 75 6e 69 74 73 20 28 69 66 20 63 6f 6d 6d 65 6e units (if commen
63f0: 74 20 63 6f 6d 6d 65 6e 74 20 22 22 29 20 73 74 t comment "") st
6400: 61 74 75 73 29 29 29 0a 20 20 20 20 20 63 73 76 atus))). csv
6410: 6c 69 73 74 29 29 29 0a 0a 3b 3b 20 67 65 74 20 list)))..;; get
6420: 61 20 6c 69 73 74 20 6f 66 20 74 65 73 74 5f 64 a list of test_d
6430: 61 74 61 20 72 65 63 6f 72 64 73 20 6d 61 74 63 ata records matc
6440: 68 69 6e 67 20 63 61 74 65 67 6f 72 79 70 61 74 hing categorypat
6450: 74 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 72 65 t.(define (db:re
6460: 61 64 2d 74 65 73 74 2d 64 61 74 61 20 64 62 20 ad-test-data db
6470: 74 65 73 74 2d 69 64 20 63 61 74 65 67 6f 72 79 test-id category
6480: 70 61 74 74 29 0a 20 20 28 6c 65 74 20 28 28 72 patt). (let ((r
6490: 65 73 20 27 28 29 29 29 0a 20 20 20 20 28 73 71 es '())). (sq
64a0: 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 lite3:for-each-r
64b0: 6f 77 20 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 ow . (lambda
64c0: 20 28 69 64 20 74 65 73 74 5f 69 64 20 63 61 74 (id test_id cat
64d0: 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65 20 76 egory variable v
64e0: 61 6c 75 65 20 65 78 70 65 63 74 65 64 20 74 6f alue expected to
64f0: 6c 20 75 6e 69 74 73 20 63 6f 6d 6d 65 6e 74 20 l units comment
6500: 73 74 61 74 75 73 29 0a 20 20 20 20 20 20 20 28 status). (
6510: 73 65 74 21 20 72 65 73 20 28 63 6f 6e 73 20 28 set! res (cons (
6520: 76 65 63 74 6f 72 20 69 64 20 74 65 73 74 5f 69 vector id test_i
6530: 64 20 63 61 74 65 67 6f 72 79 20 76 61 72 69 61 d category varia
6540: 62 6c 65 20 76 61 6c 75 65 20 65 78 70 65 63 74 ble value expect
6550: 65 64 20 74 6f 6c 20 75 6e 69 74 73 20 63 6f 6d ed tol units com
6560: 6d 65 6e 74 20 73 74 61 74 75 73 29 20 72 65 73 ment status) res
6570: 29 29 29 0a 20 20 20 20 20 64 62 0a 20 20 20 20 ))). db.
6580: 20 22 53 45 4c 45 43 54 20 69 64 2c 74 65 73 74 "SELECT id,test
6590: 5f 69 64 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 _id,category,var
65a0: 69 61 62 6c 65 2c 76 61 6c 75 65 2c 65 78 70 65 iable,value,expe
65b0: 63 74 65 64 2c 74 6f 6c 2c 75 6e 69 74 73 2c 63 cted,tol,units,c
65c0: 6f 6d 6d 65 6e 74 2c 73 74 61 74 75 73 20 46 52 omment,status FR
65d0: 4f 4d 20 74 65 73 74 5f 64 61 74 61 20 57 48 45 OM test_data WHE
65e0: 52 45 20 74 65 73 74 5f 69 64 3d 3f 20 41 4e 44 RE test_id=? AND
65f0: 20 63 61 74 65 67 6f 72 79 20 4c 49 4b 45 20 3f category LIKE ?
6600: 20 4f 52 44 45 52 20 42 59 20 63 61 74 65 67 6f ORDER BY catego
6610: 72 79 2c 76 61 72 69 61 62 6c 65 3b 22 20 74 65 ry,variable;" te
6620: 73 74 2d 69 64 20 63 61 74 65 67 6f 72 79 70 61 st-id categorypa
6630: 74 74 29 0a 20 20 20 20 28 72 65 76 65 72 73 65 tt). (reverse
6640: 20 72 65 73 29 29 29 0a 0a 28 64 65 66 69 6e 65 res)))..(define
6650: 20 28 64 62 3a 6c 6f 61 64 2d 74 65 73 74 2d 64 (db:load-test-d
6660: 61 74 61 20 64 62 20 72 75 6e 2d 69 64 20 74 65 ata db run-id te
6670: 73 74 2d 6e 61 6d 65 20 69 74 65 6d 64 61 74 29 st-name itemdat)
6680: 0a 20 20 28 6c 65 74 2a 20 28 28 69 74 65 6d 2d . (let* ((item-
6690: 70 61 74 68 20 28 69 74 65 6d 2d 6c 69 73 74 2d path (item-list-
66a0: 3e 70 61 74 68 20 69 74 65 6d 64 61 74 29 29 0a >path itemdat)).
66b0: 09 20 28 74 65 73 74 64 61 74 20 28 64 62 3a 67 . (testdat (db:g
66c0: 65 74 2d 74 65 73 74 2d 69 6e 66 6f 20 64 62 20 et-test-info db
66d0: 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 run-id test-name
66e0: 20 69 74 65 6d 2d 70 61 74 68 29 29 0a 09 20 28 item-path)).. (
66f0: 74 65 73 74 2d 69 64 20 28 69 66 20 74 65 73 74 test-id (if test
6700: 64 61 74 20 28 64 62 3a 74 65 73 74 2d 67 65 74 dat (db:test-get
6710: 2d 69 64 20 74 65 73 74 64 61 74 29 20 23 66 29 -id testdat) #f)
6720: 29 29 0a 20 20 20 20 3b 3b 20 28 64 65 62 75 67 )). ;; (debug
6730: 3a 70 72 69 6e 74 20 31 20 22 45 6e 74 65 72 20 :print 1 "Enter
6740: 72 65 63 6f 72 64 73 20 74 6f 20 69 6e 73 65 72 records to inser
6750: 74 20 69 6e 20 74 68 65 20 74 65 73 74 5f 64 61 t in the test_da
6760: 74 61 20 74 61 62 6c 65 2c 20 73 65 76 65 6e 20 ta table, seven
6770: 66 69 65 6c 64 73 2c 20 63 6f 6d 6d 61 20 73 65 fields, comma se
6780: 70 61 72 61 74 65 64 20 70 65 72 20 6c 69 6e 65 parated per line
6790: 22 29 0a 20 20 20 20 28 64 65 62 75 67 3a 70 72 "). (debug:pr
67a0: 69 6e 74 20 34 20 22 69 74 65 6d 64 61 74 3a 20 int 4 "itemdat:
67b0: 22 20 69 74 65 6d 64 61 74 20 22 2c 20 74 65 73 " itemdat ", tes
67c0: 74 2d 6e 61 6d 65 3a 20 22 20 74 65 73 74 2d 6e t-name: " test-n
67d0: 61 6d 65 20 22 2c 20 74 65 73 74 2d 69 64 3a 20 ame ", test-id:
67e0: 22 20 74 65 73 74 2d 69 64 29 0a 20 20 20 20 28 " test-id). (
67f0: 69 66 20 74 65 73 74 2d 69 64 0a 09 28 6c 65 74 if test-id..(let
6800: 20 6c 6f 6f 70 20 28 28 6c 69 6e 20 28 72 65 61 loop ((lin (rea
6810: 64 2d 6c 69 6e 65 29 29 29 0a 09 20 20 28 69 66 d-line))).. (if
6820: 20 28 6e 6f 74 20 28 65 6f 66 2d 6f 62 6a 65 63 (not (eof-objec
6830: 74 3f 20 6c 69 6e 29 29 0a 09 20 20 20 20 20 20 t? lin))..
6840: 28 62 65 67 69 6e 0a 09 09 28 64 65 62 75 67 3a (begin...(debug:
6850: 70 72 69 6e 74 20 34 20 6c 69 6e 29 0a 09 09 28 print 4 lin)...(
6860: 64 62 3a 63 73 76 2d 3e 74 65 73 74 2d 64 61 74 db:csv->test-dat
6870: 61 20 64 62 20 74 65 73 74 2d 69 64 20 6c 69 6e a db test-id lin
6880: 29 0a 09 09 28 6c 6f 6f 70 20 28 72 65 61 64 2d )...(loop (read-
6890: 6c 69 6e 65 29 29 29 29 29 29 0a 20 20 20 20 3b line)))))). ;
68a0: 3b 20 72 6f 6c 6c 20 75 70 20 74 68 65 20 63 75 ; roll up the cu
68b0: 72 72 65 6e 74 20 72 65 73 75 6c 74 73 2e 0a 20 rrent results..
68c0: 20 20 20 28 64 62 3a 74 65 73 74 2d 64 61 74 61 (db:test-data
68d0: 2d 72 6f 6c 6c 75 70 20 64 62 20 74 65 73 74 2d -rollup db test-
68e0: 69 64 29 29 29 0a 20 20 0a 3b 3b 20 57 41 52 4e id))). .;; WARN
68f0: 49 4e 47 3a 20 44 6f 20 4e 4f 54 20 63 61 6c 6c ING: Do NOT call
6900: 20 74 68 69 73 20 66 6f 72 20 74 68 65 20 70 61 this for the pa
6910: 72 65 6e 74 20 74 65 73 74 20 6f 6e 20 61 6e 20 rent test on an
6920: 69 74 65 72 61 74 65 64 20 74 65 73 74 0a 3b 3b iterated test.;;
6930: 20 52 6f 6c 6c 20 75 70 20 74 65 73 74 5f 64 61 Roll up test_da
6940: 74 61 20 70 61 73 73 2f 66 61 69 6c 20 72 65 73 ta pass/fail res
6950: 75 6c 74 73 0a 3b 3b 20 6c 6f 6f 6b 20 61 74 20 ults.;; look at
6960: 74 68 65 20 74 65 73 74 5f 64 61 74 61 20 73 74 the test_data st
6970: 61 74 75 73 20 66 69 65 6c 64 2c 20 0a 3b 3b 20 atus field, .;;
6980: 20 20 20 69 66 20 61 6c 6c 20 61 72 65 20 70 61 if all are pa
6990: 73 73 20 28 61 6e 79 20 63 61 73 65 29 20 61 6e ss (any case) an
69a0: 64 20 74 68 65 20 74 65 73 74 20 73 74 61 74 75 d the test statu
69b0: 73 20 69 73 20 50 41 53 53 20 6f 72 20 4e 55 4c s is PASS or NUL
69c0: 4c 20 6f 72 20 27 27 20 74 68 65 6e 20 73 65 74 L or '' then set
69d0: 20 74 65 73 74 20 73 74 61 74 75 73 20 74 6f 20 test status to
69e0: 50 41 53 53 2e 0a 3b 3b 20 20 20 20 69 66 20 6f PASS..;; if o
69f0: 6e 65 20 6f 72 20 6d 6f 72 65 20 61 72 65 20 66 ne or more are f
6a00: 61 69 6c 20 28 61 6e 79 20 63 61 73 65 29 20 74 ail (any case) t
6a10: 68 65 6e 20 73 65 74 20 74 65 73 74 20 73 74 61 hen set test sta
6a20: 74 75 73 20 74 6f 20 50 41 53 53 2c 20 6e 6f 6e tus to PASS, non
6a30: 20 22 70 61 73 73 22 20 6f 72 20 22 66 61 69 6c "pass" or "fail
6a40: 22 20 61 72 65 20 69 67 6e 6f 72 65 64 0a 28 64 " are ignored.(d
6a50: 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74 2d 64 efine (db:test-d
6a60: 61 74 61 2d 72 6f 6c 6c 75 70 20 64 62 20 74 65 ata-rollup db te
6a70: 73 74 2d 69 64 29 0a 20 20 28 73 71 6c 69 74 65 st-id). (sqlite
6a80: 33 3a 65 78 65 63 75 74 65 20 0a 20 20 20 64 62 3:execute . db
6a90: 20 0a 20 20 20 22 55 50 44 41 54 45 20 74 65 73 . "UPDATE tes
6aa0: 74 73 20 0a 20 20 20 20 20 20 53 45 54 20 66 61 ts . SET fa
6ab0: 69 6c 5f 63 6f 75 6e 74 3d 28 53 45 4c 45 43 54 il_count=(SELECT
6ac0: 20 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 count(id) FROM
6ad0: 74 65 73 74 5f 64 61 74 61 20 57 48 45 52 45 20 test_data WHERE
6ae0: 74 65 73 74 5f 69 64 3d 3f 20 41 4e 44 20 73 74 test_id=? AND st
6af0: 61 74 75 73 20 6c 69 6b 65 20 27 66 61 69 6c 27 atus like 'fail'
6b00: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 70 61 73 ),. pas
6b10: 73 5f 63 6f 75 6e 74 3d 28 53 45 4c 45 43 54 20 s_count=(SELECT
6b20: 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 74 count(id) FROM t
6b30: 65 73 74 5f 64 61 74 61 20 57 48 45 52 45 20 74 est_data WHERE t
6b40: 65 73 74 5f 69 64 3d 3f 20 41 4e 44 20 73 74 61 est_id=? AND sta
6b50: 74 75 73 20 6c 69 6b 65 20 27 70 61 73 73 27 29 tus like 'pass')
6b60: 0a 20 20 20 20 20 20 57 48 45 52 45 20 69 64 3d . WHERE id=
6b70: 3f 3b 22 0a 20 20 20 74 65 73 74 2d 69 64 20 74 ?;". test-id t
6b80: 65 73 74 2d 69 64 20 74 65 73 74 2d 69 64 29 0a est-id test-id).
6b90: 20 20 3b 3b 20 69 66 20 74 68 65 20 74 65 73 74 ;; if the test
6ba0: 20 69 73 20 6e 6f 74 20 46 41 49 4c 20 74 68 65 is not FAIL the
6bb0: 6e 20 73 65 74 20 73 74 61 74 75 73 20 62 61 73 n set status bas
6bc0: 65 64 20 6f 6e 20 74 68 65 20 66 61 69 6c 20 61 ed on the fail a
6bd0: 6e 64 20 70 61 73 73 20 63 6f 75 6e 74 73 2e 0a nd pass counts..
6be0: 20 20 28 74 68 72 65 61 64 2d 73 6c 65 65 70 21 (thread-sleep!
6bf0: 20 31 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 1). (sqlite3:e
6c00: 78 65 63 75 74 65 0a 20 20 20 64 62 0a 20 20 20 xecute. db.
6c10: 22 55 50 44 41 54 45 20 74 65 73 74 73 0a 20 20 "UPDATE tests.
6c20: 20 20 20 20 53 45 54 20 73 74 61 74 75 73 3d 43 SET status=C
6c30: 41 53 45 20 57 48 45 4e 20 28 53 45 4c 45 43 54 ASE WHEN (SELECT
6c40: 20 66 61 69 6c 5f 63 6f 75 6e 74 20 46 52 4f 4d fail_count FROM
6c50: 20 74 65 73 74 73 20 57 48 45 52 45 20 69 64 3d tests WHERE id=
6c60: 3f 29 20 3e 20 30 20 0a 20 20 20 20 20 20 20 20 ?) > 0 .
6c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6c80: 20 54 48 45 4e 20 27 46 41 49 4c 27 0a 20 20 20 THEN 'FAIL'.
6c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6ca0: 20 20 20 57 48 45 4e 20 28 53 45 4c 45 43 54 20 WHEN (SELECT
6cb0: 70 61 73 73 5f 63 6f 75 6e 74 20 46 52 4f 4d 20 pass_count FROM
6cc0: 74 65 73 74 73 20 57 48 45 52 45 20 69 64 3d 3f tests WHERE id=?
6cd0: 29 20 3e 20 30 0a 20 20 20 20 20 20 20 20 20 20 ) > 0.
6ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 T
6cf0: 48 45 4e 20 27 50 41 53 53 27 0a 20 20 20 20 20 HEN 'PASS'.
6d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6d10: 20 45 4c 53 45 20 73 74 61 74 75 73 0a 20 20 20 ELSE status.
6d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 E
6d30: 4e 44 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 0a ND WHERE id=?;".
6d40: 20 20 20 74 65 73 74 2d 69 64 20 74 65 73 74 2d test-id test-
6d50: 69 64 20 74 65 73 74 2d 69 64 29 29 0a 0a 28 64 id test-id))..(d
6d60: 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 70 72 efine (db:get-pr
6d70: 65 76 2d 74 6f 6c 2d 66 6f 72 2d 74 65 73 74 20 ev-tol-for-test
6d80: 64 62 20 74 65 73 74 2d 69 64 20 63 61 74 65 67 db test-id categ
6d90: 6f 72 79 20 76 61 72 69 61 62 6c 65 29 0a 20 20 ory variable).
6da0: 3b 3b 20 46 69 6e 69 73 68 20 6d 65 3f 0a 20 20 ;; Finish me?.
6db0: 28 76 61 6c 75 65 73 20 23 66 20 23 66 20 23 66 (values #f #f #f
6dc0: 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ))..;;==========
6dd0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
6de0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
6df0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
6e00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 ============.;;
6e10: 53 20 54 20 45 20 50 20 53 20 0a 3b 3b 3d 3d 3d S T E P S .;;===
6e20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
6e30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
6e40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
6e50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
6e60: 3d 3d 3d 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 ===..(define (db
6e70: 3a 73 74 65 70 2d 67 65 74 2d 74 69 6d 65 2d 61 :step-get-time-a
6e80: 73 2d 73 74 72 69 6e 67 20 76 65 63 29 0a 20 20 s-string vec).
6e90: 20 20 28 73 65 63 6f 6e 64 73 2d 3e 74 69 6d 65 (seconds->time
6ea0: 2d 73 74 72 69 6e 67 20 28 64 62 3a 73 74 65 70 -string (db:step
6eb0: 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 -get-event_time
6ec0: 76 65 63 29 29 29 0a 0a 3b 3b 20 64 62 2d 67 65 vec)))..;; db-ge
6ed0: 74 2d 74 65 73 74 2d 73 74 65 70 73 2d 66 6f 72 t-test-steps-for
6ee0: 2d 72 75 6e 0a 28 64 65 66 69 6e 65 20 28 64 62 -run.(define (db
6ef0: 3a 67 65 74 2d 73 74 65 70 73 2d 66 6f 72 2d 74 :get-steps-for-t
6f00: 65 73 74 20 64 62 20 74 65 73 74 2d 69 64 29 0a est db test-id).
6f10: 20 20 28 6c 65 74 20 28 28 72 65 73 20 27 28 29 (let ((res '()
6f20: 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a )). (sqlite3:
6f30: 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20 for-each-row .
6f40: 20 20 20 28 6c 61 6d 62 64 61 20 28 69 64 20 74 (lambda (id t
6f50: 65 73 74 2d 69 64 20 73 74 65 70 6e 61 6d 65 20 est-id stepname
6f60: 73 74 61 74 65 20 73 74 61 74 75 73 20 65 76 65 state status eve
6f70: 6e 74 2d 74 69 6d 65 29 0a 20 20 20 20 20 20 20 nt-time).
6f80: 28 73 65 74 21 20 72 65 73 20 28 63 6f 6e 73 20 (set! res (cons
6f90: 28 76 65 63 74 6f 72 20 69 64 20 74 65 73 74 2d (vector id test-
6fa0: 69 64 20 73 74 65 70 6e 61 6d 65 20 73 74 61 74 id stepname stat
6fb0: 65 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d 74 e status event-t
6fc0: 69 6d 65 29 20 72 65 73 29 29 29 0a 20 20 20 20 ime) res))).
6fd0: 20 64 62 0a 20 20 20 20 20 22 53 45 4c 45 43 54 db. "SELECT
6fe0: 20 69 64 2c 74 65 73 74 5f 69 64 2c 73 74 65 70 id,test_id,step
6ff0: 6e 61 6d 65 2c 73 74 61 74 65 2c 73 74 61 74 75 name,state,statu
7000: 73 2c 65 76 65 6e 74 5f 74 69 6d 65 20 46 52 4f s,event_time FRO
7010: 4d 20 74 65 73 74 5f 73 74 65 70 73 20 57 48 45 M test_steps WHE
7020: 52 45 20 74 65 73 74 5f 69 64 3d 3f 20 4f 52 44 RE test_id=? ORD
7030: 45 52 20 42 59 20 69 64 20 41 53 43 3b 22 20 3b ER BY id ASC;" ;
7040: 3b 20 65 76 65 6e 74 5f 74 69 6d 65 20 44 45 53 ; event_time DES
7050: 43 2c 69 64 20 41 53 43 3b 0a 20 20 20 20 20 74 C,id ASC;. t
7060: 65 73 74 2d 69 64 29 0a 20 20 20 20 28 72 65 76 est-id). (rev
7070: 65 72 73 65 20 72 65 73 29 29 29 0a 0a 3b 3b 20 erse res)))..;;
7080: 67 65 74 20 61 20 70 72 65 74 74 79 20 74 61 62 get a pretty tab
7090: 6c 65 20 74 6f 20 73 75 6d 6d 61 72 69 7a 65 20 le to summarize
70a0: 73 74 65 70 73 0a 3b 3b 0a 28 64 65 66 69 6e 65 steps.;;.(define
70b0: 20 28 64 62 3a 67 65 74 2d 73 74 65 70 73 2d 74 (db:get-steps-t
70c0: 61 62 6c 65 20 64 62 20 74 65 73 74 2d 69 64 29 able db test-id)
70d0: 0a 20 20 28 6c 65 74 20 28 28 73 74 65 70 73 20 . (let ((steps
70e0: 20 20 28 64 62 3a 67 65 74 2d 73 74 65 70 73 2d (db:get-steps-
70f0: 66 6f 72 2d 74 65 73 74 20 64 62 20 74 65 73 74 for-test db test
7100: 2d 69 64 29 29 29 0a 20 20 20 20 3b 3b 20 6f 72 -id))). ;; or
7110: 67 61 6e 69 73 65 20 74 68 65 20 73 74 65 70 73 ganise the steps
7120: 20 66 6f 72 20 62 65 74 74 65 72 20 72 65 61 64 for better read
7130: 61 62 69 6c 69 74 79 0a 20 20 20 20 28 6c 65 74 ability. (let
7140: 20 28 28 72 65 73 20 28 6d 61 6b 65 2d 68 61 73 ((res (make-has
7150: 68 2d 74 61 62 6c 65 29 29 29 0a 20 20 20 20 20 h-table))).
7160: 20 28 66 6f 72 2d 65 61 63 68 20 0a 20 20 20 20 (for-each .
7170: 20 20 20 28 6c 61 6d 62 64 61 20 28 73 74 65 70 (lambda (step
7180: 29 0a 09 20 28 64 65 62 75 67 3a 70 72 69 6e 74 ).. (debug:print
7190: 20 36 20 22 73 74 65 70 3d 22 20 73 74 65 70 29 6 "step=" step)
71a0: 0a 09 20 28 6c 65 74 20 28 28 72 65 63 6f 72 64 .. (let ((record
71b0: 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 72 65 66 (hash-table-ref
71c0: 2f 64 65 66 61 75 6c 74 20 0a 09 09 09 72 65 73 /default ....res
71d0: 20 0a 09 09 09 28 64 62 3a 73 74 65 70 2d 67 65 ....(db:step-ge
71e0: 74 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70 29 t-stepname step)
71f0: 20 0a 09 09 09 3b 3b 20 20 20 20 20 20 20 20 73 ....;; s
7200: 74 65 70 6e 61 6d 65 20 20 20 20 20 20 20 20 20 tepname
7210: 20 20 20 20 20 20 20 73 74 61 72 74 20 65 6e 64 start end
7220: 20 73 74 61 74 75 73 20 20 20 20 0a 09 09 09 28 status ....(
7230: 76 65 63 74 6f 72 20 28 64 62 3a 73 74 65 70 2d vector (db:step-
7240: 67 65 74 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 get-stepname ste
7250: 70 29 20 22 22 20 20 20 22 22 20 22 22 20 20 20 p) "" "" ""
7260: 20 20 22 22 29 29 29 29 0a 09 20 20 20 28 64 65 "")))).. (de
7270: 62 75 67 3a 70 72 69 6e 74 20 36 20 22 72 65 63 bug:print 6 "rec
7280: 6f 72 64 28 62 65 66 6f 72 65 29 20 3d 20 22 20 ord(before) = "
7290: 72 65 63 6f 72 64 20 0a 09 09 09 22 5c 6e 69 64 record ...."\nid
72a0: 3a 20 20 20 20 20 20 20 22 20 28 64 62 3a 73 74 : " (db:st
72b0: 65 70 2d 67 65 74 2d 69 64 20 73 74 65 70 29 0a ep-get-id step).
72c0: 09 09 09 22 5c 6e 73 74 65 70 6e 61 6d 65 3a 20 ..."\nstepname:
72d0: 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 " (db:step-get-s
72e0: 74 65 70 6e 61 6d 65 20 73 74 65 70 29 0a 09 09 tepname step)...
72f0: 09 22 5c 6e 73 74 61 74 65 3a 20 20 20 20 22 20 ."\nstate: "
7300: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 (db:step-get-sta
7310: 74 65 20 73 74 65 70 29 0a 09 09 09 22 5c 6e 73 te step)...."\ns
7320: 74 61 74 75 73 3a 20 20 20 22 20 28 64 62 3a 73 tatus: " (db:s
7330: 74 65 70 2d 67 65 74 2d 73 74 61 74 75 73 20 73 tep-get-status s
7340: 74 65 70 29 0a 09 09 09 22 5c 6e 74 69 6d 65 3a tep)...."\ntime:
7350: 20 20 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d " (db:step-
7360: 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73 get-event_time s
7370: 74 65 70 29 29 0a 09 20 20 20 28 63 61 73 65 20 tep)).. (case
7380: 28 73 74 72 69 6e 67 2d 3e 73 79 6d 62 6f 6c 20 (string->symbol
7390: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 (db:step-get-sta
73a0: 74 65 20 73 74 65 70 29 29 0a 09 20 20 20 20 20 te step))..
73b0: 28 28 73 74 61 72 74 29 28 76 65 63 74 6f 72 2d ((start)(vector-
73c0: 73 65 74 21 20 72 65 63 6f 72 64 20 31 20 28 64 set! record 1 (d
73d0: 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 b:step-get-event
73e0: 5f 74 69 6d 65 20 73 74 65 70 29 29 0a 09 20 20 _time step))..
73f0: 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 (vector-set!
7400: 20 72 65 63 6f 72 64 20 33 20 28 69 66 20 28 65 record 3 (if (e
7410: 71 75 61 6c 3f 20 28 76 65 63 74 6f 72 2d 72 65 qual? (vector-re
7420: 66 20 72 65 63 6f 72 64 20 33 29 20 22 22 29 0a f record 3) "").
7430: 09 09 09 09 09 28 64 62 3a 73 74 65 70 2d 67 65 .....(db:step-ge
7440: 74 2d 73 74 61 74 75 73 20 73 74 65 70 29 29 29 t-status step)))
7450: 29 0a 09 20 20 20 20 20 28 28 65 6e 64 29 20 20 ).. ((end)
7460: 0a 09 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d .. (vector-
7470: 73 65 74 21 20 72 65 63 6f 72 64 20 32 20 28 61 set! record 2 (a
7480: 6e 79 2d 3e 6e 75 6d 62 65 72 20 28 64 62 3a 73 ny->number (db:s
7490: 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 tep-get-event_ti
74a0: 6d 65 20 73 74 65 70 29 29 29 0a 09 20 20 20 20 me step)))..
74b0: 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72 (vector-set! r
74c0: 65 63 6f 72 64 20 33 20 28 64 62 3a 73 74 65 70 ecord 3 (db:step
74d0: 2d 67 65 74 2d 73 74 61 74 75 73 20 73 74 65 70 -get-status step
74e0: 29 29 0a 09 20 20 20 20 20 20 28 76 65 63 74 6f )).. (vecto
74f0: 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 34 20 r-set! record 4
7500: 28 6c 65 74 20 28 28 73 74 61 72 74 74 20 28 61 (let ((startt (a
7510: 6e 79 2d 3e 6e 75 6d 62 65 72 20 28 76 65 63 74 ny->number (vect
7520: 6f 72 2d 72 65 66 20 72 65 63 6f 72 64 20 31 29 or-ref record 1)
7530: 29 29 0a 09 09 09 09 09 20 20 28 65 6e 64 74 20 ))...... (endt
7540: 20 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 20 28 (any->number (
7550: 76 65 63 74 6f 72 2d 72 65 66 20 72 65 63 6f 72 vector-ref recor
7560: 64 20 32 29 29 29 29 0a 09 09 09 09 20 20 20 20 d 2)))).....
7570: 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 (debug:print 4
7580: 20 22 72 65 63 6f 72 64 5b 31 5d 3d 22 20 28 76 "record[1]=" (v
7590: 65 63 74 6f 72 2d 72 65 66 20 72 65 63 6f 72 64 ector-ref record
75a0: 20 31 29 20 0a 09 09 09 09 09 09 20 20 20 22 2c 1) ....... ",
75b0: 20 73 74 61 72 74 74 3d 22 20 73 74 61 72 74 74 startt=" startt
75c0: 20 22 2c 20 65 6e 64 74 3d 22 20 65 6e 64 74 0a ", endt=" endt.
75d0: 09 09 09 09 09 09 20 20 20 22 2c 20 67 65 74 2d ...... ", get-
75e0: 73 74 61 74 75 73 3a 20 22 20 28 64 62 3a 73 74 status: " (db:st
75f0: 65 70 2d 67 65 74 2d 73 74 61 74 75 73 20 73 74 ep-get-status st
7600: 65 70 29 29 0a 09 09 09 09 20 20 20 20 20 20 28 ep))..... (
7610: 69 66 20 28 61 6e 64 20 28 6e 75 6d 62 65 72 3f if (and (number?
7620: 20 73 74 61 72 74 74 29 28 6e 75 6d 62 65 72 3f startt)(number?
7630: 20 65 6e 64 74 29 29 0a 09 09 09 09 09 20 20 28 endt))...... (
7640: 73 65 63 6f 6e 64 73 2d 3e 68 72 2d 6d 69 6e 2d seconds->hr-min-
7650: 73 65 63 20 28 2d 20 65 6e 64 74 20 73 74 61 72 sec (- endt star
7660: 74 74 29 29 20 22 2d 31 22 29 29 29 29 0a 09 20 tt)) "-1"))))..
7670: 20 20 20 20 28 65 6c 73 65 0a 09 20 20 20 20 20 (else..
7680: 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 (vector-set!
7690: 72 65 63 6f 72 64 20 32 20 28 64 62 3a 73 74 65 record 2 (db:ste
76a0: 70 2d 67 65 74 2d 73 74 61 74 65 20 73 74 65 70 p-get-state step
76b0: 29 29 0a 09 20 20 20 20 20 20 20 20 28 76 65 63 )).. (vec
76c0: 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 tor-set! record
76d0: 33 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 3 (db:step-get-s
76e0: 74 61 74 75 73 20 73 74 65 70 29 29 0a 09 20 20 tatus step))..
76f0: 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 (vector-se
7700: 74 21 20 72 65 63 6f 72 64 20 34 20 28 64 62 3a t! record 4 (db:
7710: 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 step-get-event_t
7720: 69 6d 65 20 73 74 65 70 29 29 29 29 0a 09 20 20 ime step))))..
7730: 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 73 65 74 (hash-table-set
7740: 21 20 72 65 73 20 28 64 62 3a 73 74 65 70 2d 67 ! res (db:step-g
7750: 65 74 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70 et-stepname step
7760: 29 20 72 65 63 6f 72 64 29 0a 09 20 20 20 28 64 ) record).. (d
7770: 65 62 75 67 3a 70 72 69 6e 74 20 36 20 22 72 65 ebug:print 6 "re
7780: 63 6f 72 64 28 61 66 74 65 72 29 20 20 3d 20 22 cord(after) = "
7790: 20 72 65 63 6f 72 64 20 0a 09 09 09 22 5c 6e 69 record ...."\ni
77a0: 64 3a 20 20 20 20 20 20 20 22 20 28 64 62 3a 73 d: " (db:s
77b0: 74 65 70 2d 67 65 74 2d 69 64 20 73 74 65 70 29 tep-get-id step)
77c0: 0a 09 09 09 22 5c 6e 73 74 65 70 6e 61 6d 65 3a ...."\nstepname:
77d0: 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d " (db:step-get-
77e0: 73 74 65 70 6e 61 6d 65 20 73 74 65 70 29 0a 09 stepname step)..
77f0: 09 09 22 5c 6e 73 74 61 74 65 3a 20 20 20 20 22 .."\nstate: "
7800: 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 (db:step-get-st
7810: 61 74 65 20 73 74 65 70 29 0a 09 09 09 22 5c 6e ate step)...."\n
7820: 73 74 61 74 75 73 3a 20 20 20 22 20 28 64 62 3a status: " (db:
7830: 73 74 65 70 2d 67 65 74 2d 73 74 61 74 75 73 20 step-get-status
7840: 73 74 65 70 29 0a 09 09 09 22 5c 6e 74 69 6d 65 step)...."\ntime
7850: 3a 20 20 20 20 20 22 20 28 64 62 3a 73 74 65 70 : " (db:step
7860: 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 -get-event_time
7870: 73 74 65 70 29 29 29 29 0a 20 20 20 20 20 20 20 step)))).
7880: 3b 3b 20 28 65 6c 73 65 20 20 20 28 76 65 63 74 ;; (else (vect
7890: 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 31 or-set! record 1
78a0: 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 (db:step-get-ev
78b0: 65 6e 74 5f 74 69 6d 65 20 73 74 65 70 29 29 29 ent_time step)))
78c0: 0a 20 20 20 20 20 20 20 28 73 6f 72 74 20 73 74 . (sort st
78d0: 65 70 73 20 28 6c 61 6d 62 64 61 20 28 61 20 62 eps (lambda (a b
78e0: 29 28 3c 20 28 64 62 3a 73 74 65 70 2d 67 65 74 )(< (db:step-get
78f0: 2d 65 76 65 6e 74 5f 74 69 6d 65 20 61 29 28 64 -event_time a)(d
7900: 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 b:step-get-event
7910: 5f 74 69 6d 65 20 62 29 29 29 29 29 0a 20 20 20 _time b))))).
7920: 20 20 20 72 65 73 29 29 29 0a 0a 3b 3b 20 55 53 res)))..;; US
7930: 45 3a 20 28 6c 73 65 74 2d 64 69 66 66 65 72 65 E: (lset-differe
7940: 6e 63 65 20 73 74 72 69 6e 67 3d 3f 20 27 28 22 nce string=? '("
7950: 61 22 20 22 62 22 20 22 63 22 29 20 27 28 22 64 a" "b" "c") '("d
7960: 22 20 22 63 22 20 22 65 22 20 22 61 22 29 29 0a " "c" "e" "a")).
7970: 3b 3b 0a 3b 3b 20 52 65 74 75 72 6e 20 61 20 6c ;;.;; Return a l
7980: 69 73 74 20 6f 66 20 70 72 65 72 65 71 73 20 74 ist of prereqs t
7990: 68 61 74 20 77 65 72 65 20 4e 4f 54 20 6d 65 74 hat were NOT met
79a0: 0a 3b 3b 20 20 54 65 73 74 73 20 28 61 6e 64 20 .;; Tests (and
79b0: 61 6c 6c 20 69 74 65 6d 73 29 20 69 6e 20 77 61 all items) in wa
79c0: 69 74 6f 6e 20 6c 69 73 74 20 6d 75 73 74 20 62 iton list must b
79d0: 65 20 22 43 4f 4d 50 4c 45 54 45 44 22 20 61 6e e "COMPLETED" an
79e0: 64 20 22 50 41 53 53 22 0a 28 64 65 66 69 6e 65 d "PASS".(define
79f0: 20 28 64 62 2d 67 65 74 2d 70 72 65 72 65 71 73 (db-get-prereqs
7a00: 2d 6e 6f 74 2d 6d 65 74 20 64 62 20 72 75 6e 2d -not-met db run-
7a10: 69 64 20 77 61 69 74 6f 6e 29 0a 20 20 28 69 66 id waiton). (if
7a20: 20 28 6e 75 6c 6c 3f 20 77 61 69 74 6f 6e 29 0a (null? waiton).
7a30: 20 20 20 20 20 20 27 28 29 0a 20 20 20 20 20 20 '().
7a40: 28 6c 65 74 2a 20 28 28 75 6e 6d 65 74 2d 70 72 (let* ((unmet-pr
7a50: 65 2d 72 65 71 73 20 27 28 29 29 0a 09 20 20 20 e-reqs '())..
7a60: 20 20 28 74 65 73 74 73 20 20 20 20 20 20 20 20 (tests
7a70: 20 20 20 28 64 62 2d 67 65 74 2d 74 65 73 74 73 (db-get-tests
7a80: 2d 66 6f 72 2d 72 75 6e 20 64 62 20 72 75 6e 2d -for-run db run-
7a90: 69 64 20 23 66 20 23 66 20 27 28 29 20 27 28 29 id #f #f '() '()
7aa0: 29 29 0a 09 20 20 20 20 20 28 72 65 73 75 6c 74 )).. (result
7ab0: 20 20 20 20 20 20 20 20 20 27 28 29 29 29 0a 09 '()))..
7ac0: 28 66 6f 72 2d 65 61 63 68 20 28 6c 61 6d 62 64 (for-each (lambd
7ad0: 61 20 28 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 a (waitontest-na
7ae0: 6d 65 29 0a 09 09 20 20 20 20 28 6c 65 74 20 28 me)... (let (
7af0: 28 65 76 65 72 2d 73 65 65 6e 20 23 66 29 29 0a (ever-seen #f)).
7b00: 09 09 20 20 20 20 20 20 28 66 6f 72 2d 65 61 63 .. (for-eac
7b10: 68 20 28 6c 61 6d 62 64 61 20 28 74 65 73 74 29 h (lambda (test)
7b20: 0a 09 09 09 09 20 20 28 69 66 20 28 65 71 75 61 ..... (if (equa
7b30: 6c 3f 20 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 l? waitontest-na
7b40: 6d 65 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d me (db:test-get-
7b50: 74 65 73 74 6e 61 6d 65 20 74 65 73 74 29 29 0a testname test)).
7b60: 09 09 09 09 20 20 20 20 20 20 28 62 65 67 69 6e .... (begin
7b70: 0a 09 09 09 09 09 28 73 65 74 21 20 65 76 65 72 ......(set! ever
7b80: 2d 73 65 65 6e 20 23 74 29 0a 09 09 09 09 09 28 -seen #t)......(
7b90: 69 66 20 28 6e 6f 74 20 28 61 6e 64 20 28 65 71 if (not (and (eq
7ba0: 75 61 6c 3f 20 28 64 62 3a 74 65 73 74 2d 67 65 ual? (db:test-ge
7bb0: 74 2d 73 74 61 74 65 20 74 65 73 74 29 20 22 43 t-state test) "C
7bc0: 4f 4d 50 4c 45 54 45 44 22 29 0a 09 09 09 09 09 OMPLETED")......
7bd0: 09 20 20 20 20 20 20 28 6d 65 6d 62 65 72 20 28 . (member (
7be0: 64 62 3a 74 65 73 74 2d 67 65 74 2d 73 74 61 74 db:test-get-stat
7bf0: 75 73 20 74 65 73 74 29 20 27 28 22 50 41 53 53 us test) '("PASS
7c00: 22 20 22 57 41 52 4e 22 20 22 43 48 45 43 4b 22 " "WARN" "CHECK"
7c10: 29 29 29 29 0a 09 09 09 09 09 20 20 20 20 28 73 ))))...... (s
7c20: 65 74 21 20 72 65 73 75 6c 74 20 28 63 6f 6e 73 et! result (cons
7c30: 20 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 waitontest-name
7c40: 20 72 65 73 75 6c 74 29 29 29 29 29 29 0a 09 09 result))))))...
7c50: 09 09 74 65 73 74 73 29 0a 09 09 20 20 20 20 20 ..tests)...
7c60: 20 28 69 66 20 28 6e 6f 74 20 65 76 65 72 2d 73 (if (not ever-s
7c70: 65 65 6e 29 28 73 65 74 21 20 72 65 73 75 6c 74 een)(set! result
7c80: 20 28 63 6f 6e 73 20 77 61 69 74 6f 6e 74 65 73 (cons waitontes
7c90: 74 2d 6e 61 6d 65 20 72 65 73 75 6c 74 29 29 29 t-name result)))
7ca0: 29 29 0a 09 09 20 20 77 61 69 74 6f 6e 29 0a 09 ))... waiton)..
7cb0: 28 64 65 6c 65 74 65 2d 64 75 70 6c 69 63 61 74 (delete-duplicat
7cc0: 65 73 20 72 65 73 75 6c 74 29 29 29 29 0a 0a 3b es result))))..;
7cd0: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ;===============
7ce0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7cf0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7d00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7d10: 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 45 78 74 72 61 =======.;; Extra
7d20: 63 74 20 6f 64 73 20 66 69 6c 65 20 66 72 6f 6d ct ods file from
7d30: 20 74 68 65 20 64 62 0a 3b 3b 3d 3d 3d 3d 3d 3d the db.;;======
7d40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7d50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7d60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7d70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7d80: 0a 0a 3b 3b 20 72 75 6e 73 70 61 74 74 20 69 73 ..;; runspatt is
7d90: 20 61 20 63 6f 6d 6d 61 20 64 65 6c 69 6d 69 74 a comma delimit
7da0: 65 64 20 6c 69 73 74 20 6f 66 20 72 75 6e 20 70 ed list of run p
7db0: 61 74 74 65 72 6e 73 0a 3b 3b 20 6b 65 79 70 61 atterns.;; keypa
7dc0: 74 74 2d 61 6c 69 73 74 20 6d 75 73 74 20 63 6f tt-alist must co
7dd0: 6e 74 61 69 6e 20 2a 61 6c 6c 2a 20 6b 65 79 73 ntain *all* keys
7de0: 20 77 69 74 68 20 61 6e 20 61 73 73 6f 63 69 61 with an associa
7df0: 74 65 64 20 70 61 74 74 65 72 6e 3a 20 27 28 20 ted pattern: '(
7e00: 28 22 4b 45 59 31 22 20 22 25 22 29 20 2e 2e 20 ("KEY1" "%") ..
7e10: 29 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 65 78 ).(define (db:ex
7e20: 74 72 61 63 74 2d 6f 64 73 2d 66 69 6c 65 20 64 tract-ods-file d
7e30: 62 20 6f 75 74 70 75 74 66 69 6c 65 20 6b 65 79 b outputfile key
7e40: 70 61 74 74 2d 61 6c 69 73 74 20 72 75 6e 73 70 patt-alist runsp
7e50: 61 74 74 20 70 61 74 68 6d 6f 64 29 0a 20 20 28 att pathmod). (
7e60: 6c 65 74 2a 20 28 28 6b 65 79 73 73 74 72 20 20 let* ((keysstr
7e70: 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 (string-interspe
7e80: 72 73 65 20 28 6d 61 70 20 63 61 72 20 6b 65 79 rse (map car key
7e90: 70 61 74 74 2d 61 6c 69 73 74 29 20 22 2c 22 29 patt-alist) ",")
7ea0: 29 0a 09 20 28 6b 65 79 71 72 79 20 20 20 28 73 ).. (keyqry (s
7eb0: 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 tring-interspers
7ec0: 65 20 28 6d 61 70 20 28 6c 61 6d 62 64 61 20 28 e (map (lambda (
7ed0: 70 29 28 63 6f 6e 63 20 28 63 61 72 20 70 29 20 p)(conc (car p)
7ee0: 22 20 4c 49 4b 45 20 3f 20 22 29 29 20 6b 65 79 " LIKE ? ")) key
7ef0: 70 61 74 74 2d 61 6c 69 73 74 29 20 22 20 41 4e patt-alist) " AN
7f00: 44 20 22 29 29 0a 09 20 28 6e 75 6d 6b 65 79 73 D ")).. (numkeys
7f10: 20 20 28 6c 65 6e 67 74 68 20 6b 65 79 70 61 74 (length keypat
7f20: 74 2d 61 6c 69 73 74 29 29 0a 09 20 28 74 65 73 t-alist)).. (tes
7f30: 74 2d 69 64 73 20 27 28 29 29 0a 09 20 28 77 69 t-ids '()).. (wi
7f40: 6e 64 6f 77 73 20 20 28 61 6e 64 20 70 61 74 68 ndows (and path
7f50: 6d 6f 64 20 28 73 75 62 73 74 72 69 6e 67 2d 69 mod (substring-i
7f60: 6e 64 65 78 20 22 5c 5c 22 20 70 61 74 68 6d 6f ndex "\\" pathmo
7f70: 64 29 29 29 0a 09 20 28 74 65 6d 70 64 69 72 20 d))).. (tempdir
7f80: 20 28 63 6f 6e 63 20 22 2f 74 6d 70 2f 22 20 28 (conc "/tmp/" (
7f90: 63 75 72 72 65 6e 74 2d 75 73 65 72 2d 6e 61 6d current-user-nam
7fa0: 65 29 20 22 2f 22 20 72 75 6e 73 70 61 74 74 20 e) "/" runspatt
7fb0: 22 5f 22 20 28 72 61 6e 64 6f 6d 20 31 30 30 30 "_" (random 1000
7fc0: 30 29 20 22 5f 22 20 28 63 75 72 72 65 6e 74 2d 0) "_" (current-
7fd0: 70 72 6f 63 65 73 73 2d 69 64 29 29 29 0a 09 20 process-id)))..
7fe0: 28 72 75 6e 73 68 65 61 64 65 72 20 28 61 70 70 (runsheader (app
7ff0: 65 6e 64 20 28 6c 69 73 74 20 22 52 75 6e 20 49 end (list "Run I
8000: 64 22 20 22 52 75 6e 6e 61 6d 65 22 29 20 3b 20 d" "Runname") ;
8010: 30 20 31 0a 09 09 09 20 20 20 20 20 28 6d 61 70 0 1.... (map
8020: 20 63 61 72 20 6b 65 79 70 61 74 74 2d 61 6c 69 car keypatt-ali
8030: 73 74 29 20 20 20 3b 20 2b 20 4e 20 3d 20 6c 65 st) ; + N = le
8040: 6e 67 74 68 20 6b 65 79 70 61 74 74 2d 61 6c 69 ngth keypatt-ali
8050: 73 74 0a 09 09 09 20 20 20 20 20 28 6c 69 73 74 st.... (list
8060: 20 22 54 65 73 74 6e 61 6d 65 22 20 20 20 20 20 "Testname"
8070: 20 20 20 20 20 3b 20 32 0a 09 09 09 09 20 20 20 ; 2.....
8080: 22 49 74 65 6d 20 50 61 74 68 22 20 20 20 20 20 "Item Path"
8090: 20 20 20 20 3b 20 33 20 0a 09 09 09 09 20 20 20 ; 3 .....
80a0: 22 44 65 73 63 72 69 70 74 69 6f 6e 22 20 20 20 "Description"
80b0: 20 20 20 20 3b 20 34 20 0a 09 09 09 09 20 20 20 ; 4 .....
80c0: 22 53 74 61 74 65 22 20 20 20 20 20 20 20 20 20 "State"
80d0: 20 20 20 20 3b 20 35 20 0a 09 09 09 09 20 20 20 ; 5 .....
80e0: 22 53 74 61 74 75 73 22 20 20 20 20 20 20 20 20 "Status"
80f0: 20 20 20 20 3b 20 36 20 20 0a 09 09 09 09 20 20 ; 6 .....
8100: 20 22 46 69 6e 61 6c 20 4c 6f 67 22 20 20 20 20 "Final Log"
8110: 20 20 20 20 20 3b 20 37 20 0a 09 09 09 09 20 20 ; 7 .....
8120: 20 22 52 75 6e 20 44 75 72 61 74 69 6f 6e 22 20 "Run Duration"
8130: 20 20 20 20 20 3b 20 38 20 0a 09 09 09 09 20 20 ; 8 .....
8140: 20 22 57 68 65 6e 20 52 75 6e 22 20 20 20 20 20 "When Run"
8150: 20 20 20 20 20 3b 20 39 20 0a 09 09 09 09 20 20 ; 9 .....
8160: 20 22 54 61 67 73 22 20 20 20 20 20 20 20 20 20 "Tags"
8170: 20 20 20 20 20 3b 20 31 30 0a 09 09 09 09 20 20 ; 10.....
8180: 20 22 52 75 6e 20 4f 77 6e 65 72 22 20 20 20 20 "Run Owner"
8190: 20 20 20 20 20 3b 20 31 31 0a 09 09 09 09 20 20 ; 11.....
81a0: 20 22 43 6f 6d 6d 65 6e 74 22 20 20 20 20 20 20 "Comment"
81b0: 20 20 20 20 20 3b 20 31 32 0a 09 09 09 09 20 20 ; 12.....
81c0: 20 22 41 75 74 68 6f 72 22 20 20 20 20 20 20 20 "Author"
81d0: 20 20 20 20 20 3b 20 31 33 0a 09 09 09 09 20 20 ; 13.....
81e0: 20 22 54 65 73 74 20 4f 77 6e 65 72 22 20 20 20 "Test Owner"
81f0: 20 20 20 20 20 3b 20 31 34 0a 09 09 09 09 20 20 ; 14.....
8200: 20 22 52 65 76 69 65 77 65 64 22 20 20 20 20 20 "Reviewed"
8210: 20 20 20 20 20 3b 20 31 35 0a 09 09 09 09 20 20 ; 15.....
8220: 20 22 44 69 73 6b 66 72 65 65 22 20 20 20 20 20 "Diskfree"
8230: 20 20 20 20 20 3b 20 31 36 0a 09 09 09 09 20 20 ; 16.....
8240: 20 22 55 6e 61 6d 65 22 20 20 20 20 20 20 20 20 "Uname"
8250: 20 20 20 20 20 3b 20 31 37 0a 09 09 09 09 20 20 ; 17.....
8260: 20 22 52 75 6e 64 69 72 22 20 20 20 20 20 20 20 "Rundir"
8270: 20 20 20 20 20 3b 20 31 38 0a 09 09 09 09 20 20 ; 18.....
8280: 20 22 48 6f 73 74 22 20 20 20 20 20 20 20 20 20 "Host"
8290: 20 20 20 20 20 3b 20 31 39 0a 09 09 09 09 20 20 ; 19.....
82a0: 20 22 43 70 75 20 4c 6f 61 64 22 20 20 20 20 20 "Cpu Load"
82b0: 20 20 20 20 20 3b 20 32 30 0a 09 09 09 09 20 20 ; 20.....
82c0: 20 29 29 29 0a 09 20 28 72 65 73 75 6c 74 73 20 ))).. (results
82d0: 28 6c 69 73 74 20 72 75 6e 73 68 65 61 64 65 72 (list runsheader
82e0: 29 29 09 09 09 20 0a 09 20 28 74 65 73 74 64 61 ))... .. (testda
82f0: 74 61 2d 68 65 61 64 65 72 20 28 6c 69 73 74 20 ta-header (list
8300: 22 52 75 6e 20 49 64 22 20 22 54 65 73 74 6e 61 "Run Id" "Testna
8310: 6d 65 22 20 22 49 74 65 6d 20 50 61 74 68 22 20 me" "Item Path"
8320: 22 43 61 74 65 67 6f 72 79 22 20 22 56 61 72 69 "Category" "Vari
8330: 61 62 6c 65 22 20 22 56 61 6c 75 65 22 20 22 45 able" "Value" "E
8340: 78 70 65 63 74 65 64 22 20 22 54 6f 6c 22 20 22 xpected" "Tol" "
8350: 55 6e 69 74 73 22 20 22 53 74 61 74 75 73 22 20 Units" "Status"
8360: 22 43 6f 6d 6d 65 6e 74 22 29 29 29 0a 20 20 20 "Comment"))).
8370: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 32 20 (debug:print 2
8380: 22 55 73 69 6e 67 20 22 20 74 65 6d 70 64 69 72 "Using " tempdir
8390: 20 22 20 66 6f 72 20 63 6f 6e 73 74 72 75 63 74 " for construct
83a0: 69 6e 67 20 74 68 65 20 6f 64 73 20 66 69 6c 65 ing the ods file
83b0: 2e 20 6b 65 79 71 72 79 3a 20 22 20 6b 65 79 71 . keyqry: " keyq
83c0: 72 79 20 22 20 6b 65 79 73 74 72 3a 20 22 20 6b ry " keystr: " k
83d0: 65 79 73 73 74 72 20 22 20 77 69 74 68 20 6b 65 eysstr " with ke
83e0: 79 73 3a 20 22 20 28 6d 61 70 20 63 61 64 72 20 ys: " (map cadr
83f0: 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 29 29 0a keypatt-alist)).
8400: 20 20 20 20 3b 3b 20 22 45 78 70 65 63 74 65 64 ;; "Expected
8410: 20 56 61 6c 75 65 22 0a 20 20 20 20 3b 3b 20 22 Value". ;; "
8420: 56 61 6c 75 65 20 46 6f 75 6e 64 22 0a 20 20 20 Value Found".
8430: 20 3b 3b 20 22 54 6f 6c 65 72 61 6e 63 65 22 0a ;; "Tolerance".
8440: 20 20 20 20 28 61 70 70 6c 79 20 73 71 6c 69 74 (apply sqlit
8450: 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a e3:for-each-row.
8460: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 74 65 (lambda (te
8470: 73 74 2d 69 64 20 2e 20 62 29 0a 20 20 20 20 20 st-id . b).
8480: 20 20 28 73 65 74 21 20 74 65 73 74 2d 69 64 73 (set! test-ids
8490: 20 28 63 6f 6e 73 20 74 65 73 74 2d 69 64 20 74 (cons test-id t
84a0: 65 73 74 2d 69 64 73 29 29 20 20 20 3b 3b 20 74 est-ids)) ;; t
84b0: 65 73 74 2d 69 64 20 69 73 20 6e 6f 77 20 74 65 est-id is now te
84c0: 73 74 6e 61 6d 65 0a 20 20 20 20 20 20 20 28 73 stname. (s
84d0: 65 74 21 20 72 65 73 75 6c 74 73 20 28 61 70 70 et! results (app
84e0: 65 6e 64 20 72 65 73 75 6c 74 73 20 3b 3b 20 6e end results ;; n
84f0: 6f 74 65 2c 20 64 72 6f 70 20 74 68 65 20 74 65 ote, drop the te
8500: 73 74 2d 69 64 0a 09 09 09 20 20 20 20 20 28 6c st-id.... (l
8510: 69 73 74 0a 09 09 09 20 20 20 20 20 20 28 69 66 ist.... (if
8520: 20 70 61 74 68 6d 6f 64 0a 09 09 09 09 20 20 28 pathmod..... (
8530: 6c 65 74 2a 20 28 28 76 62 20 20 20 20 20 20 20 let* ((vb
8540: 20 28 61 70 70 6c 79 20 76 65 63 74 6f 72 20 62 (apply vector b
8550: 29 29 0a 09 09 09 09 09 20 28 6b 65 79 76 61 6c ))...... (keyval
8560: 73 20 20 20 28 6c 65 74 20 6c 6f 6f 70 20 28 28 s (let loop ((
8570: 69 20 20 20 20 30 29 0a 09 09 09 09 09 09 09 20 i 0)........
8580: 20 20 20 20 20 20 28 72 65 73 20 27 28 29 29 29 (res '()))
8590: 0a 09 09 09 09 09 09 20 20 20 20 20 20 28 69 66 ....... (if
85a0: 20 28 3e 3d 20 69 20 6e 75 6d 6b 65 79 73 29 0a (>= i numkeys).
85b0: 09 09 09 09 09 09 09 20 20 72 65 73 0a 09 09 09 ....... res....
85c0: 09 09 09 09 20 20 28 6c 6f 6f 70 20 28 2b 20 69 .... (loop (+ i
85d0: 20 31 29 0a 09 09 09 09 09 09 09 09 28 61 70 70 1).........(app
85e0: 65 6e 64 20 72 65 73 20 28 6c 69 73 74 20 28 76 end res (list (v
85f0: 65 63 74 6f 72 2d 72 65 66 20 76 62 20 28 2b 20 ector-ref vb (+
8600: 69 20 32 29 29 29 29 29 29 29 29 0a 09 09 09 09 i 2)))))))).....
8610: 09 20 28 72 75 6e 6e 61 6d 65 20 20 20 28 76 65 . (runname (ve
8620: 63 74 6f 72 2d 72 65 66 20 76 62 20 31 29 29 0a ctor-ref vb 1)).
8630: 09 09 09 09 09 20 28 74 65 73 74 6e 61 6d 65 20 ..... (testname
8640: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62 20 (vector-ref vb
8650: 28 2b 20 20 32 20 6e 75 6d 6b 65 79 73 29 29 29 (+ 2 numkeys)))
8660: 0a 09 09 09 09 09 20 28 69 74 65 6d 2d 70 61 74 ...... (item-pat
8670: 68 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62 h (vector-ref vb
8680: 20 28 2b 20 20 33 20 6e 75 6d 6b 65 79 73 29 29 (+ 3 numkeys))
8690: 29 0a 09 09 09 09 09 20 28 66 69 6e 61 6c 2d 6c )...... (final-l
86a0: 6f 67 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76 og (vector-ref v
86b0: 62 20 28 2b 20 20 37 20 6e 75 6d 6b 65 79 73 29 b (+ 7 numkeys)
86c0: 29 29 0a 09 09 09 09 09 20 28 72 75 6e 2d 64 69 ))...... (run-di
86d0: 72 20 20 20 28 76 65 63 74 6f 72 2d 72 65 66 20 r (vector-ref
86e0: 76 62 20 28 2b 20 31 38 20 6e 75 6d 6b 65 79 73 vb (+ 18 numkeys
86f0: 29 29 29 0a 09 09 09 09 09 20 28 6c 6f 67 2d 66 )))...... (log-f
8700: 70 61 74 68 20 28 63 6f 6e 63 20 72 75 6e 2d 64 path (conc run-d
8710: 69 72 20 22 2f 22 20 20 66 69 6e 61 6c 2d 6c 6f ir "/" final-lo
8720: 67 29 29 29 20 3b 3b 20 28 73 74 72 69 6e 67 2d g))) ;; (string-
8730: 69 6e 74 65 72 73 70 65 72 73 65 20 6b 65 79 76 intersperse keyv
8740: 61 6c 73 20 22 2f 22 29 20 22 2f 22 20 74 65 73 als "/") "/" tes
8750: 74 6e 61 6d 65 20 22 2f 22 20 69 74 65 6d 2d 70 tname "/" item-p
8760: 61 74 68 20 22 2f 22 0a 09 09 09 09 20 20 20 20 ath "/".....
8770: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22 (debug:print 4 "
8780: 6c 6f 67 3a 20 22 20 6c 6f 67 2d 66 70 61 74 68 log: " log-fpath
8790: 20 22 20 65 78 69 73 74 73 3a 20 22 20 28 66 69 " exists: " (fi
87a0: 6c 65 2d 65 78 69 73 74 73 3f 20 6c 6f 67 2d 66 le-exists? log-f
87b0: 70 61 74 68 29 29 0a 09 09 09 09 20 20 20 20 28 path))..... (
87c0: 76 65 63 74 6f 72 2d 73 65 74 21 20 76 62 20 28 vector-set! vb (
87d0: 2b 20 37 20 6e 75 6d 6b 65 79 73 29 20 28 69 66 + 7 numkeys) (if
87e0: 20 28 66 69 6c 65 2d 65 78 69 73 74 73 3f 20 6c (file-exists? l
87f0: 6f 67 2d 66 70 61 74 68 29 0a 09 09 09 09 09 09 og-fpath).......
8800: 09 09 20 20 20 20 20 20 28 6c 65 74 20 28 28 6e .. (let ((n
8810: 65 77 70 61 74 68 20 28 63 6f 6e 63 20 70 61 74 ewpath (conc pat
8820: 68 6d 6f 64 20 22 2f 22 0a 09 09 09 09 09 09 09 hmod "/"........
8830: 09 09 09 09 20 20 20 28 73 74 72 69 6e 67 2d 69 .... (string-i
8840: 6e 74 65 72 73 70 65 72 73 65 20 6b 65 79 76 61 ntersperse keyva
8850: 6c 73 20 22 2f 22 29 0a 09 09 09 09 09 09 09 09 ls "/").........
8860: 09 09 09 20 20 20 22 2f 22 20 72 75 6e 6e 61 6d ... "/" runnam
8870: 65 20 22 2f 22 20 74 65 73 74 6e 61 6d 65 20 22 e "/" testname "
8880: 2f 22 0a 09 09 09 09 09 09 09 09 09 09 09 20 20 /"............
8890: 20 28 69 66 20 28 73 74 72 69 6e 67 3d 3f 20 69 (if (string=? i
88a0: 74 65 6d 2d 70 61 74 68 20 22 22 29 20 22 22 20 tem-path "") ""
88b0: 28 63 6f 6e 63 20 22 2f 22 20 69 74 65 6d 2d 70 (conc "/" item-p
88c0: 61 74 68 29 29 0a 09 09 09 09 09 09 09 09 09 09 ath))...........
88d0: 09 20 20 20 66 69 6e 61 6c 2d 6c 6f 67 29 29 29 . final-log)))
88e0: 0a 09 09 09 09 09 09 09 09 09 3b 3b 20 66 6f 72 ..........;; for
88f0: 20 6e 6f 77 20 74 68 72 6f 77 20 61 77 61 79 20 now throw away
8900: 6e 65 77 70 61 74 68 20 61 6e 64 20 75 73 65 20 newpath and use
8910: 74 68 65 20 6c 6f 67 2d 66 70 61 74 68 20 63 6f the log-fpath co
8920: 6e 63 27 64 20 77 69 74 68 20 70 61 74 68 6d 6f nc'd with pathmo
8930: 64 0a 09 09 09 09 09 09 09 09 09 28 73 65 74 21 d..........(set!
8940: 20 6e 65 77 70 61 74 68 20 28 63 6f 6e 63 20 70 newpath (conc p
8950: 61 74 68 6d 6f 64 20 6c 6f 67 2d 66 70 61 74 68 athmod log-fpath
8960: 29 29 0a 09 09 09 09 09 09 09 09 09 28 69 66 20 ))..........(if
8970: 77 69 6e 64 6f 77 73 20 28 73 74 72 69 6e 67 2d windows (string-
8980: 74 72 61 6e 73 6c 61 74 65 20 6e 65 77 70 61 74 translate newpat
8990: 68 20 22 2f 22 20 22 5c 5c 22 29 20 6e 65 77 70 h "/" "\\") newp
89a0: 61 74 68 29 29 0a 09 09 09 09 09 09 09 09 20 20 ath)).........
89b0: 20 20 20 20 28 69 66 20 28 3e 20 2a 76 65 72 62 (if (> *verb
89c0: 6f 73 69 74 79 2a 20 31 29 0a 09 09 09 09 09 09 osity* 1).......
89d0: 09 09 09 20 20 28 63 6f 6e 63 20 66 69 6e 61 6c ... (conc final
89e0: 2d 6c 6f 67 20 22 20 6e 6f 74 2d 66 6f 75 6e 64 -log " not-found
89f0: 22 29 0a 09 09 09 09 09 09 09 09 09 20 20 22 22 ").......... ""
8a00: 29 29 29 0a 09 09 09 09 20 20 20 20 28 76 65 63 )))..... (vec
8a10: 74 6f 72 2d 3e 6c 69 73 74 20 76 62 29 29 0a 09 tor->list vb))..
8a20: 09 09 09 20 20 62 29 29 29 29 29 0a 20 20 20 20 ... b))))).
8a30: 20 64 62 0a 20 20 20 20 20 28 63 6f 6e 63 20 22 db. (conc "
8a40: 53 45 4c 45 43 54 0a 20 20 20 20 20 20 20 20 20 SELECT.
8a50: 20 20 20 20 20 74 2e 74 65 73 74 6e 61 6d 65 2c t.testname,
8a60: 72 2e 69 64 2c 72 75 6e 6e 61 6d 65 2c 22 20 6b r.id,runname," k
8a70: 65 79 73 73 74 72 20 22 2c 74 2e 74 65 73 74 6e eysstr ",t.testn
8a80: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 ame,.
8a90: 20 20 20 74 2e 69 74 65 6d 5f 70 61 74 68 2c 74 t.item_path,t
8aa0: 6d 2e 64 65 73 63 72 69 70 74 69 6f 6e 2c 74 2e m.description,t.
8ab0: 73 74 61 74 65 2c 74 2e 73 74 61 74 75 73 2c 0a state,t.status,.
8ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 fi
8ad0: 6e 61 6c 5f 6c 6f 67 66 2c 72 75 6e 5f 64 75 72 nal_logf,run_dur
8ae0: 61 74 69 6f 6e 2c 20 0a 20 20 20 20 20 20 20 20 ation, .
8af0: 20 20 20 20 20 20 73 74 72 66 74 69 6d 65 28 27 strftime('
8b00: 25 6d 2f 25 64 2f 25 59 20 25 48 3a 25 4d 3a 25 %m/%d/%Y %H:%M:%
8b10: 53 27 2c 64 61 74 65 74 69 6d 65 28 74 2e 65 76 S',datetime(t.ev
8b20: 65 6e 74 5f 74 69 6d 65 2c 27 75 6e 69 78 65 70 ent_time,'unixep
8b30: 6f 63 68 27 29 2c 27 6c 6f 63 61 6c 74 69 6d 65 och'),'localtime
8b40: 27 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 '),.
8b50: 20 20 74 6d 2e 74 61 67 73 2c 72 2e 6f 77 6e 65 tm.tags,r.owne
8b60: 72 2c 74 2e 63 6f 6d 6d 65 6e 74 2c 0a 20 20 20 r,t.comment,.
8b70: 20 20 20 20 20 20 20 20 20 20 20 61 75 74 68 6f autho
8b80: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 r,.
8b90: 20 74 6d 2e 6f 77 6e 65 72 2c 72 65 76 69 65 77 tm.owner,review
8ba0: 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 ed,.
8bb0: 20 20 64 69 73 6b 66 72 65 65 2c 75 6e 61 6d 65 diskfree,uname
8bc0: 2c 72 75 6e 64 69 72 2c 0a 20 20 20 20 20 20 20 ,rundir,.
8bd0: 20 20 20 20 20 20 20 68 6f 73 74 2c 63 70 75 6c host,cpul
8be0: 6f 61 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 oad.
8bf0: 46 52 4f 4d 20 74 65 73 74 73 20 41 53 20 74 20 FROM tests AS t
8c00: 49 4e 4e 45 52 20 4a 4f 49 4e 20 72 75 6e 73 20 INNER JOIN runs
8c10: 41 53 20 72 20 4f 4e 20 74 2e 72 75 6e 5f 69 64 AS r ON t.run_id
8c20: 3d 72 2e 69 64 20 49 4e 4e 45 52 20 4a 4f 49 4e =r.id INNER JOIN
8c30: 20 74 65 73 74 5f 6d 65 74 61 20 41 53 20 74 6d test_meta AS tm
8c40: 20 4f 4e 20 74 6d 2e 74 65 73 74 6e 61 6d 65 3d ON tm.testname=
8c50: 74 2e 74 65 73 74 6e 61 6d 65 0a 20 20 20 20 20 t.testname.
8c60: 20 20 20 20 20 20 20 57 48 45 52 45 20 72 75 6e WHERE run
8c70: 6e 61 6d 65 20 4c 49 4b 45 20 3f 20 41 4e 44 20 name LIKE ? AND
8c80: 22 20 6b 65 79 71 72 79 20 22 3b 22 29 0a 20 20 " keyqry ";").
8c90: 20 20 20 72 75 6e 73 70 61 74 74 20 28 6d 61 70 runspatt (map
8ca0: 20 63 61 64 72 20 6b 65 79 70 61 74 74 2d 61 6c cadr keypatt-al
8cb0: 69 73 74 29 29 0a 20 20 20 20 28 73 65 74 21 20 ist)). (set!
8cc0: 72 65 73 75 6c 74 73 20 28 6c 69 73 74 20 28 63 results (list (c
8cd0: 6f 6e 73 20 22 52 75 6e 73 22 20 72 65 73 75 6c ons "Runs" resul
8ce0: 74 73 29 29 29 0a 20 20 20 20 3b 3b 20 6e 6f 77 ts))). ;; now
8cf0: 2c 20 66 6f 72 20 65 61 63 68 20 74 65 73 74 2c , for each test,
8d00: 20 63 6f 6c 6c 65 63 74 20 74 68 65 20 74 65 73 collect the tes
8d10: 74 5f 64 61 74 61 20 69 6e 66 6f 20 61 6e 64 20 t_data info and
8d20: 61 64 64 20 61 20 6e 65 77 20 73 68 65 65 74 0a add a new sheet.
8d30: 20 20 20 20 28 66 6f 72 2d 65 61 63 68 0a 20 20 (for-each.
8d40: 20 20 20 28 6c 61 6d 62 64 61 20 28 74 65 73 74 (lambda (test
8d50: 2d 69 64 29 0a 20 20 20 20 20 20 20 28 6c 65 74 -id). (let
8d60: 20 28 28 74 65 73 74 2d 64 61 74 61 20 28 6c 69 ((test-data (li
8d70: 73 74 20 74 65 73 74 64 61 74 61 2d 68 65 61 64 st testdata-head
8d80: 65 72 29 29 0a 09 20 20 20 20 20 28 63 75 72 72 er)).. (curr
8d90: 2d 74 65 73 74 2d 6e 61 6d 65 20 23 66 29 29 0a -test-name #f)).
8da0: 09 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 . (sqlite3:for-e
8db0: 61 63 68 2d 72 6f 77 0a 09 20 20 28 6c 61 6d 62 ach-row.. (lamb
8dc0: 64 61 20 28 72 75 6e 2d 69 64 20 74 65 73 74 6e da (run-id testn
8dd0: 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 63 61 ame item-path ca
8de0: 74 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65 20 tegory variable
8df0: 76 61 6c 75 65 20 65 78 70 65 63 74 65 64 20 74 value expected t
8e00: 6f 6c 20 75 6e 69 74 73 20 73 74 61 74 75 73 20 ol units status
8e10: 63 6f 6d 6d 65 6e 74 29 0a 09 20 20 20 20 28 73 comment).. (s
8e20: 65 74 21 20 63 75 72 72 2d 74 65 73 74 2d 6e 61 et! curr-test-na
8e30: 6d 65 20 74 65 73 74 6e 61 6d 65 29 0a 09 20 20 me testname)..
8e40: 20 20 28 73 65 74 21 20 74 65 73 74 2d 64 61 74 (set! test-dat
8e50: 61 20 28 61 70 70 65 6e 64 20 74 65 73 74 2d 64 a (append test-d
8e60: 61 74 61 20 28 6c 69 73 74 20 28 6c 69 73 74 20 ata (list (list
8e70: 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 run-id testname
8e80: 69 74 65 6d 2d 70 61 74 68 20 63 61 74 65 67 6f item-path catego
8e90: 72 79 20 76 61 72 69 61 62 6c 65 20 76 61 6c 75 ry variable valu
8ea0: 65 20 65 78 70 65 63 74 65 64 20 74 6f 6c 20 75 e expected tol u
8eb0: 6e 69 74 73 20 73 74 61 74 75 73 20 63 6f 6d 6d nits status comm
8ec0: 65 6e 74 29 29 29 29 29 0a 09 20 20 64 62 20 0a ent))))).. db .
8ed0: 09 20 20 3b 3b 20 22 53 45 4c 45 43 54 20 72 75 . ;; "SELECT ru
8ee0: 6e 5f 69 64 2c 74 65 73 74 6e 61 6d 65 2c 69 74 n_id,testname,it
8ef0: 65 6d 5f 70 61 74 68 2c 63 61 74 65 67 6f 72 79 em_path,category
8f00: 2c 76 61 72 69 61 62 6c 65 2c 74 64 2e 76 61 6c ,variable,td.val
8f10: 75 65 20 41 53 20 76 61 6c 75 65 2c 65 78 70 65 ue AS value,expe
8f20: 63 74 65 64 2c 74 6f 6c 2c 75 6e 69 74 73 2c 74 cted,tol,units,t
8f30: 64 2e 73 74 61 74 75 73 20 41 53 20 73 74 61 74 d.status AS stat
8f40: 75 73 2c 74 64 2e 63 6f 6d 6d 65 6e 74 20 41 53 us,td.comment AS
8f50: 20 63 6f 6d 6d 65 6e 74 20 46 52 4f 4d 20 74 65 comment FROM te
8f60: 73 74 5f 64 61 74 61 20 41 53 20 74 64 20 49 4e st_data AS td IN
8f70: 4e 45 52 20 4a 4f 49 4e 20 74 65 73 74 73 20 4f NER JOIN tests O
8f80: 4e 20 74 65 73 74 73 2e 69 64 3d 74 64 2e 74 65 N tests.id=td.te
8f90: 73 74 5f 69 64 20 57 48 45 52 45 20 74 65 73 74 st_id WHERE test
8fa0: 5f 69 64 3d 3f 3b 22 0a 09 20 20 22 53 45 4c 45 _id=?;".. "SELE
8fb0: 43 54 20 72 75 6e 5f 69 64 2c 74 65 73 74 6e 61 CT run_id,testna
8fc0: 6d 65 2c 69 74 65 6d 5f 70 61 74 68 2c 63 61 74 me,item_path,cat
8fd0: 65 67 6f 72 79 2c 76 61 72 69 61 62 6c 65 2c 74 egory,variable,t
8fe0: 64 2e 76 61 6c 75 65 20 41 53 20 76 61 6c 75 65 d.value AS value
8ff0: 2c 74 64 2e 65 78 70 65 63 74 65 64 2c 74 64 2e ,td.expected,td.
9000: 74 6f 6c 2c 74 64 2e 75 6e 69 74 73 2c 74 64 2e tol,td.units,td.
9010: 73 74 61 74 75 73 20 41 53 20 73 74 61 74 75 73 status AS status
9020: 2c 74 64 2e 63 6f 6d 6d 65 6e 74 20 41 53 20 63 ,td.comment AS c
9030: 6f 6d 6d 65 6e 74 20 46 52 4f 4d 20 74 65 73 74 omment FROM test
9040: 5f 64 61 74 61 20 41 53 20 74 64 20 49 4e 4e 45 _data AS td INNE
9050: 52 20 4a 4f 49 4e 20 74 65 73 74 73 20 4f 4e 20 R JOIN tests ON
9060: 74 65 73 74 73 2e 69 64 3d 74 64 2e 74 65 73 74 tests.id=td.test
9070: 5f 69 64 20 57 48 45 52 45 20 74 65 73 74 6e 61 _id WHERE testna
9080: 6d 65 3d 3f 3b 22 0a 09 20 20 74 65 73 74 2d 69 me=?;".. test-i
9090: 64 29 0a 09 20 28 69 66 20 63 75 72 72 2d 74 65 d).. (if curr-te
90a0: 73 74 2d 6e 61 6d 65 0a 09 20 20 20 20 20 28 73 st-name.. (s
90b0: 65 74 21 20 72 65 73 75 6c 74 73 20 28 61 70 70 et! results (app
90c0: 65 6e 64 20 72 65 73 75 6c 74 73 20 28 6c 69 73 end results (lis
90d0: 74 20 28 63 6f 6e 73 20 63 75 72 72 2d 74 65 73 t (cons curr-tes
90e0: 74 2d 6e 61 6d 65 20 74 65 73 74 2d 64 61 74 61 t-name test-data
90f0: 29 29 29 29 29 0a 09 20 29 29 0a 20 20 20 20 20 ))))).. )).
9100: 28 73 6f 72 74 20 28 64 65 6c 65 74 65 2d 64 75 (sort (delete-du
9110: 70 6c 69 63 61 74 65 73 20 74 65 73 74 2d 69 64 plicates test-id
9120: 73 29 20 73 74 72 69 6e 67 3c 3d 29 29 0a 20 20 s) string<=)).
9130: 20 20 28 73 79 73 74 65 6d 20 28 63 6f 6e 63 20 (system (conc
9140: 22 6d 6b 64 69 72 20 2d 70 20 22 20 74 65 6d 70 "mkdir -p " temp
9150: 64 69 72 29 29 0a 20 20 20 20 3b 3b 20 28 70 70 dir)). ;; (pp
9160: 20 72 65 73 75 6c 74 73 29 0a 20 20 20 20 28 6f results). (o
9170: 64 73 3a 6c 69 73 74 2d 3e 6f 64 73 20 0a 20 20 ds:list->ods .
9180: 20 20 20 74 65 6d 70 64 69 72 0a 20 20 20 20 20 tempdir.
9190: 28 69 66 20 28 73 74 72 69 6e 67 2d 6d 61 74 63 (if (string-matc
91a0: 68 20 28 72 65 67 65 78 70 20 22 5e 5b 2f 7e 5d h (regexp "^[/~]
91b0: 2b 2e 2a 22 29 20 6f 75 74 70 75 74 66 69 6c 65 +.*") outputfile
91c0: 29 20 3b 3b 20 66 75 6c 6c 20 70 61 74 68 3f 0a ) ;; full path?.
91d0: 09 20 6f 75 74 70 75 74 66 69 6c 65 0a 09 20 28 . outputfile.. (
91e0: 62 65 67 69 6e 0a 09 20 20 20 28 64 65 62 75 67 begin.. (debug
91f0: 3a 70 72 69 6e 74 20 30 20 22 57 41 52 4e 49 4e :print 0 "WARNIN
9200: 47 3a 20 70 61 74 68 20 67 69 76 65 6e 2c 20 22 G: path given, "
9210: 20 6f 75 74 70 75 74 66 69 6c 65 20 22 20 69 73 outputfile " is
9220: 20 72 65 6c 61 74 69 76 65 2c 20 70 72 65 66 69 relative, prefi
9230: 78 69 6e 67 20 77 69 74 68 20 63 75 72 72 65 6e xing with curren
9240: 74 20 64 69 72 65 63 74 6f 72 79 22 29 0a 09 20 t directory")..
9250: 20 20 28 63 6f 6e 63 20 28 63 75 72 72 65 6e 74 (conc (current
9260: 2d 64 69 72 65 63 74 6f 72 79 29 20 22 2f 22 20 -directory) "/"
9270: 6f 75 74 70 75 74 66 69 6c 65 29 29 29 0a 20 20 outputfile))).
9280: 20 20 20 72 65 73 75 6c 74 73 29 29 29 0a 0a 3b results)))..;
9290: 3b 20 28 64 62 3a 65 78 74 72 61 63 74 2d 6f 64 ; (db:extract-od
92a0: 73 2d 66 69 6c 65 20 64 62 20 22 6f 75 74 70 75 s-file db "outpu
92b0: 74 66 69 6c 65 2e 6f 64 73 22 20 27 28 28 22 73 tfile.ods" '(("s
92c0: 79 73 6e 61 6d 65 22 20 22 25 22 29 28 22 66 73 ysname" "%")("fs
92d0: 6e 61 6d 65 22 20 22 25 22 29 28 22 64 61 74 61 name" "%")("data
92e0: 70 61 74 68 22 20 22 25 22 29 29 20 22 25 22 29 path" "%")) "%")
92f0: 0a .