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 32 2c right 2006-2012,
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 72 65 71 75 69 72 65 2d 65 78 74 65 6e ..(require-exten
0290: 73 69 6f 6e 20 28 73 72 66 69 20 31 38 29 20 65 sion (srfi 18) e
02a0: 78 74 72 61 73 20 74 63 70 20 72 70 63 29 0a 28 xtras tcp rpc).(
02b0: 69 6d 70 6f 72 74 20 28 70 72 65 66 69 78 20 72 import (prefix r
02c0: 70 63 20 72 70 63 3a 29 29 0a 0a 28 75 73 65 20 pc rpc:))..(use
02d0: 73 71 6c 69 74 65 33 20 73 72 66 69 2d 31 20 70 sqlite3 srfi-1 p
02e0: 6f 73 69 78 20 72 65 67 65 78 20 72 65 67 65 78 osix regex regex
02f0: 2d 63 61 73 65 20 73 72 66 69 2d 36 39 20 63 73 -case srfi-69 cs
0300: 76 2d 78 6d 6c 29 0a 28 69 6d 70 6f 72 74 20 28 v-xml).(import (
0310: 70 72 65 66 69 78 20 73 71 6c 69 74 65 33 20 73 prefix sqlite3 s
0320: 71 6c 69 74 65 33 3a 29 29 0a 0a 28 64 65 63 6c qlite3:))..(decl
0330: 61 72 65 20 28 75 6e 69 74 20 64 62 29 29 0a 28 are (unit db)).(
0340: 64 65 63 6c 61 72 65 20 28 75 73 65 73 20 63 6f declare (uses co
0350: 6d 6d 6f 6e 29 29 0a 28 64 65 63 6c 61 72 65 20 mmon)).(declare
0360: 28 75 73 65 73 20 6b 65 79 73 29 29 0a 28 64 65 (uses keys)).(de
0370: 63 6c 61 72 65 20 28 75 73 65 73 20 6f 64 73 29 clare (uses ods)
0380: 29 0a 0a 28 69 6e 63 6c 75 64 65 20 22 63 6f 6d )..(include "com
0390: 6d 6f 6e 5f 72 65 63 6f 72 64 73 2e 73 63 6d 22 mon_records.scm"
03a0: 29 0a 28 69 6e 63 6c 75 64 65 20 22 64 62 5f 72 ).(include "db_r
03b0: 65 63 6f 72 64 73 2e 73 63 6d 22 29 0a 28 69 6e ecords.scm").(in
03c0: 63 6c 75 64 65 20 22 6b 65 79 5f 72 65 63 6f 72 clude "key_recor
03d0: 64 73 2e 73 63 6d 22 29 0a 28 69 6e 63 6c 75 64 ds.scm").(includ
03e0: 65 20 22 72 75 6e 5f 72 65 63 6f 72 64 73 2e 73 e "run_records.s
03f0: 63 6d 22 29 0a 0a 3b 3b 20 74 69 6d 65 73 74 61 cm")..;; timesta
0400: 6d 70 20 74 79 70 65 20 28 76 61 6c 31 20 76 61 mp type (val1 va
0410: 6c 32 20 2e 2e 2e 29 0a 3b 3b 20 74 79 70 65 3a l2 ...).;; type:
0420: 20 6d 65 74 61 2d 69 6e 66 6f 2c 20 73 74 65 70 meta-info, step
0430: 0a 28 64 65 66 69 6e 65 20 2a 69 6e 63 6f 6d 69 .(define *incomi
0440: 6e 67 2d 64 61 74 61 2a 20 20 20 20 20 20 27 28 ng-data* '(
0450: 29 29 0a 28 64 65 66 69 6e 65 20 2a 69 6e 63 6f )).(define *inco
0460: 6d 69 6e 67 2d 6c 61 73 74 2d 74 69 6d 65 2a 20 ming-last-time*
0470: 28 63 75 72 72 65 6e 74 2d 73 65 63 6f 6e 64 73 (current-seconds
0480: 29 29 0a 28 64 65 66 69 6e 65 20 2a 69 6e 63 6f )).(define *inco
0490: 6d 69 6e 67 2d 6d 75 74 65 78 2a 20 20 20 20 20 ming-mutex*
04a0: 28 6d 61 6b 65 2d 6d 75 74 65 78 29 29 0a 28 64 (make-mutex)).(d
04b0: 65 66 69 6e 65 20 2a 63 61 63 68 65 2d 6f 6e 2a efine *cache-on*
04c0: 20 23 66 29 0a 0a 28 64 65 66 69 6e 65 20 28 6f #f)..(define (o
04d0: 70 65 6e 2d 64 62 29 20 3b 3b 20 20 28 63 6f 6e pen-db) ;; (con
04e0: 63 20 2a 74 6f 70 70 61 74 68 2a 20 22 2f 6d 65 c *toppath* "/me
04f0: 67 61 74 65 73 74 2e 64 62 22 29 20 28 63 61 72 gatest.db") (car
0500: 20 2a 63 6f 6e 66 69 67 69 6e 66 6f 2a 29 29 29 *configinfo*)))
0510: 0a 20 20 28 6c 65 74 2a 20 28 28 64 62 70 61 74 . (let* ((dbpat
0520: 68 20 20 20 20 28 63 6f 6e 63 20 2a 74 6f 70 70 h (conc *topp
0530: 61 74 68 2a 20 22 2f 6d 65 67 61 74 65 73 74 2e ath* "/megatest.
0540: 64 62 22 29 29 20 3b 3b 20 66 6e 61 6d 65 29 0a db")) ;; fname).
0550: 09 20 28 64 62 65 78 69 73 74 73 20 20 28 66 69 . (dbexists (fi
0560: 6c 65 2d 65 78 69 73 74 73 3f 20 64 62 70 61 74 le-exists? dbpat
0570: 68 29 29 0a 09 20 28 64 62 20 20 20 20 20 20 20 h)).. (db
0580: 20 28 73 71 6c 69 74 65 33 3a 6f 70 65 6e 2d 64 (sqlite3:open-d
0590: 61 74 61 62 61 73 65 20 64 62 70 61 74 68 29 29 atabase dbpath))
05a0: 20 3b 3b 20 28 6e 65 76 65 72 2d 67 69 76 65 2d ;; (never-give-
05b0: 75 70 2d 6f 70 65 6e 2d 64 62 20 64 62 70 61 74 up-open-db dbpat
05c0: 68 29 29 0a 09 20 28 68 61 6e 64 6c 65 72 20 20 h)).. (handler
05d0: 20 28 6d 61 6b 65 2d 62 75 73 79 2d 74 69 6d 65 (make-busy-time
05e0: 6f 75 74 20 28 69 66 20 28 61 72 67 73 3a 67 65 out (if (args:ge
05f0: 74 2d 61 72 67 20 22 2d 6f 76 65 72 72 69 64 65 t-arg "-override
0600: 2d 74 69 6d 65 6f 75 74 22 29 0a 09 09 09 09 09 -timeout")......
0610: 20 20 20 28 73 74 72 69 6e 67 2d 3e 6e 75 6d 62 (string->numb
0620: 65 72 20 28 61 72 67 73 3a 67 65 74 2d 61 72 67 er (args:get-arg
0630: 20 22 2d 6f 76 65 72 72 69 64 65 2d 74 69 6d 65 "-override-time
0640: 6f 75 74 22 29 29 0a 09 09 09 09 09 20 20 20 33 out"))...... 3
0650: 36 30 30 30 29 29 29 29 20 3b 3b 20 31 33 36 30 6000)))) ;; 1360
0660: 30 30 29 29 29 0a 20 20 20 20 28 73 71 6c 69 74 00))). (sqlit
0670: 65 33 3a 73 65 74 2d 62 75 73 79 2d 68 61 6e 64 e3:set-busy-hand
0680: 6c 65 72 21 20 64 62 20 68 61 6e 64 6c 65 72 29 ler! db handler)
0690: 0a 20 20 20 20 28 69 66 20 28 6e 6f 74 20 64 62 . (if (not db
06a0: 65 78 69 73 74 73 29 0a 09 28 64 62 3a 69 6e 69 exists)..(db:ini
06b0: 74 69 61 6c 69 7a 65 20 64 62 29 29 0a 20 20 20 tialize db)).
06c0: 20 64 62 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 db))..(define (
06d0: 64 62 3a 69 6e 69 74 69 61 6c 69 7a 65 20 64 62 db:initialize db
06e0: 29 0a 20 20 28 6c 65 74 2a 20 28 28 63 6f 6e 66 ). (let* ((conf
06f0: 69 67 64 61 74 20 28 63 61 72 20 2a 63 6f 6e 66 igdat (car *conf
0700: 69 67 69 6e 66 6f 2a 29 29 20 20 3b 3b 20 74 75 iginfo*)) ;; tu
0710: 74 20 74 75 74 2c 20 67 6c 6f 62 61 6c 20 77 61 t tut, global wa
0720: 72 6e 69 6e 67 2e 2e 2e 0a 09 20 28 6b 65 79 73 rning..... (keys
0730: 20 20 20 20 20 28 63 6f 6e 66 69 67 2d 67 65 74 (config-get
0740: 2d 66 69 65 6c 64 73 20 63 6f 6e 66 69 67 64 61 -fields configda
0750: 74 29 29 0a 09 20 28 68 61 76 65 6b 65 79 73 20 t)).. (havekeys
0760: 28 3e 20 28 6c 65 6e 67 74 68 20 6b 65 79 73 29 (> (length keys)
0770: 20 30 29 29 0a 09 20 28 6b 65 79 73 74 72 20 20 0)).. (keystr
0780: 20 28 6b 65 79 73 2d 3e 6b 65 79 73 74 72 20 6b (keys->keystr k
0790: 65 79 73 29 29 0a 09 20 28 66 69 65 6c 64 73 74 eys)).. (fieldst
07a0: 72 20 28 6b 65 79 73 2d 3e 6b 65 79 2f 66 69 65 r (keys->key/fie
07b0: 6c 64 20 6b 65 79 73 29 29 29 0a 20 20 20 20 28 ld keys))). (
07c0: 66 6f 72 2d 65 61 63 68 20 28 6c 61 6d 62 64 61 for-each (lambda
07d0: 20 28 6b 65 79 29 0a 09 09 28 6c 65 74 20 28 28 (key)...(let ((
07e0: 6b 65 79 6e 20 28 76 65 63 74 6f 72 2d 72 65 66 keyn (vector-ref
07f0: 20 6b 65 79 20 30 29 29 29 0a 09 09 20 20 28 69 key 0)))... (i
0800: 66 20 28 6d 65 6d 62 65 72 20 28 73 74 72 69 6e f (member (strin
0810: 67 2d 64 6f 77 6e 63 61 73 65 20 6b 65 79 6e 29 g-downcase keyn)
0820: 0a 09 09 09 20 20 20 20 20 20 28 6c 69 73 74 20 .... (list
0830: 22 72 75 6e 6e 61 6d 65 22 20 22 73 74 61 74 65 "runname" "state
0840: 22 20 22 73 74 61 74 75 73 22 20 22 6f 77 6e 65 " "status" "owne
0850: 72 22 20 22 65 76 65 6e 74 5f 74 69 6d 65 22 20 r" "event_time"
0860: 22 63 6f 6d 6d 65 6e 74 22 20 22 66 61 69 6c 5f "comment" "fail_
0870: 63 6f 75 6e 74 22 0a 09 09 09 09 20 20 20 20 22 count"..... "
0880: 70 61 73 73 5f 63 6f 75 6e 74 22 29 29 0a 09 09 pass_count"))...
0890: 20 20 20 20 20 20 28 62 65 67 69 6e 0a 09 09 09 (begin....
08a0: 28 70 72 69 6e 74 20 22 45 52 52 4f 52 3a 20 79 (print "ERROR: y
08b0: 6f 75 72 20 6b 65 79 20 63 61 6e 6e 6f 74 20 62 our key cannot b
08c0: 65 20 6e 61 6d 65 64 20 22 20 6b 65 79 6e 20 22 e named " keyn "
08d0: 20 61 73 20 74 68 69 73 20 63 6f 6e 66 6c 69 63 as this conflic
08e0: 74 73 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 ts with the same
08f0: 20 6e 61 6d 65 64 20 66 69 65 6c 64 20 69 6e 20 named field in
0900: 74 68 65 20 72 75 6e 73 20 74 61 62 6c 65 22 29 the runs table")
0910: 0a 09 09 09 28 73 79 73 74 65 6d 20 28 63 6f 6e ....(system (con
0920: 63 20 22 72 6d 20 2d 66 20 22 20 64 62 70 61 74 c "rm -f " dbpat
0930: 68 29 29 0a 09 09 09 28 65 78 69 74 20 31 29 29 h))....(exit 1))
0940: 29 29 29 0a 09 20 20 20 20 20 20 6b 65 79 73 29 ))).. keys)
0950: 0a 20 20 20 20 3b 3b 20 28 73 71 6c 69 74 65 33 . ;; (sqlite3
0960: 3a 65 78 65 63 75 74 65 20 64 62 20 22 50 52 41 :execute db "PRA
0970: 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 GMA synchronous
0980: 3d 20 4f 46 46 3b 22 29 0a 20 20 20 20 28 73 71 = OFF;"). (sq
0990: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 lite3:execute db
09a0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 "CREATE TABLE I
09b0: 46 20 4e 4f 54 20 45 58 49 53 54 53 20 6b 65 79 F NOT EXISTS key
09c0: 73 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 s (id INTEGER PR
09d0: 49 4d 41 52 59 20 4b 45 59 2c 20 66 69 65 6c 64 IMARY KEY, field
09e0: 6e 61 6d 65 20 54 45 58 54 2c 20 66 69 65 6c 64 name TEXT, field
09f0: 74 79 70 65 20 54 45 58 54 2c 20 43 4f 4e 53 54 type TEXT, CONST
0a00: 52 41 49 4e 54 20 6b 65 79 63 6f 6e 73 74 72 61 RAINT keyconstra
0a10: 69 6e 74 20 55 4e 49 51 55 45 20 28 66 69 65 6c int UNIQUE (fiel
0a20: 64 6e 61 6d 65 29 29 3b 22 29 0a 20 20 20 20 28 dname));"). (
0a30: 66 6f 72 2d 65 61 63 68 20 28 6c 61 6d 62 64 61 for-each (lambda
0a40: 20 28 6b 65 79 29 0a 09 09 28 73 71 6c 69 74 65 (key)...(sqlite
0a50: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 49 4e 3:execute db "IN
0a60: 53 45 52 54 20 49 4e 54 4f 20 6b 65 79 73 20 28 SERT INTO keys (
0a70: 66 69 65 6c 64 6e 61 6d 65 2c 66 69 65 6c 64 74 fieldname,fieldt
0a80: 79 70 65 29 20 56 41 4c 55 45 53 20 28 3f 2c 3f ype) VALUES (?,?
0a90: 29 3b 22 20 28 6b 65 79 3a 67 65 74 2d 66 69 65 );" (key:get-fie
0aa0: 6c 64 6e 61 6d 65 20 6b 65 79 29 28 6b 65 79 3a ldname key)(key:
0ab0: 67 65 74 2d 66 69 65 6c 64 74 79 70 65 20 6b 65 get-fieldtype ke
0ac0: 79 29 29 29 0a 09 20 20 20 20 20 20 6b 65 79 73 y))).. keys
0ad0: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 ). (sqlite3:e
0ae0: 78 65 63 75 74 65 20 64 62 20 28 63 6f 6e 63 20 xecute db (conc
0af0: 0a 09 09 09 20 22 43 52 45 41 54 45 20 54 41 42 .... "CREATE TAB
0b00: 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 LE IF NOT EXISTS
0b10: 20 72 75 6e 73 20 28 69 64 20 49 4e 54 45 47 45 runs (id INTEGE
0b20: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 22 R PRIMARY KEY, "
0b30: 20 0a 09 09 09 20 66 69 65 6c 64 73 74 72 20 28 .... fieldstr (
0b40: 69 66 20 68 61 76 65 6b 65 79 73 20 22 2c 22 20 if havekeys ","
0b50: 22 22 29 0a 09 09 09 20 22 72 75 6e 6e 61 6d 65 "").... "runname
0b60: 20 54 45 58 54 2c 22 0a 09 09 09 20 22 73 74 61 TEXT,".... "sta
0b70: 74 65 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 te TEXT DEFAULT
0b80: 27 27 2c 22 0a 09 09 09 20 22 73 74 61 74 75 73 '',".... "status
0b90: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 TEXT DEFAULT ''
0ba0: 2c 22 0a 09 09 09 20 22 6f 77 6e 65 72 20 54 45 ,".... "owner TE
0bb0: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 22 0a XT DEFAULT '',".
0bc0: 09 09 09 20 22 65 76 65 6e 74 5f 74 69 6d 65 20 ... "event_time
0bd0: 54 49 4d 45 53 54 41 4d 50 2c 22 0a 09 09 09 20 TIMESTAMP,"....
0be0: 22 63 6f 6d 6d 65 6e 74 20 54 45 58 54 20 44 45 "comment TEXT DE
0bf0: 46 41 55 4c 54 20 27 27 2c 22 0a 09 09 09 20 22 FAULT '',".... "
0c00: 66 61 69 6c 5f 63 6f 75 6e 74 20 49 4e 54 45 47 fail_count INTEG
0c10: 45 52 20 44 45 46 41 55 4c 54 20 30 2c 22 0a 09 ER DEFAULT 0,"..
0c20: 09 09 20 22 70 61 73 73 5f 63 6f 75 6e 74 20 49 .. "pass_count I
0c30: 4e 54 45 47 45 52 20 44 45 46 41 55 4c 54 20 30 NTEGER DEFAULT 0
0c40: 2c 22 0a 09 09 09 20 22 43 4f 4e 53 54 52 41 49 ,".... "CONSTRAI
0c50: 4e 54 20 72 75 6e 73 63 6f 6e 73 74 72 61 69 6e NT runsconstrain
0c60: 74 20 55 4e 49 51 55 45 20 28 72 75 6e 6e 61 6d t UNIQUE (runnam
0c70: 65 22 20 28 69 66 20 68 61 76 65 6b 65 79 73 20 e" (if havekeys
0c80: 22 2c 22 20 22 22 29 20 6b 65 79 73 74 72 20 22 "," "") keystr "
0c90: 29 29 3b 22 29 29 0a 20 20 20 20 28 73 71 6c 69 ));")). (sqli
0ca0: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 28 te3:execute db (
0cb0: 63 6f 6e 63 20 22 43 52 45 41 54 45 20 49 4e 44 conc "CREATE IND
0cc0: 45 58 20 72 75 6e 73 5f 69 6e 64 65 78 20 4f 4e EX runs_index ON
0cd0: 20 72 75 6e 73 20 28 72 75 6e 6e 61 6d 65 22 20 runs (runname"
0ce0: 28 69 66 20 68 61 76 65 6b 65 79 73 20 22 2c 22 (if havekeys ","
0cf0: 20 22 22 29 20 6b 65 79 73 74 72 20 22 29 3b 22 "") keystr ");"
0d00: 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a )). (sqlite3:
0d10: 65 78 65 63 75 74 65 20 64 62 20 0a 09 09 20 20 execute db ...
0d20: 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 "CREATE TABLE
0d30: 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 74 IF NOT EXISTS t
0d40: 65 73 74 73 20 0a 20 20 20 20 20 20 20 20 20 20 ests .
0d50: 20 20 20 20 20 20 20 20 20 20 28 69 64 20 49 4e (id IN
0d60: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE
0d70: 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 Y,.
0d80: 20 20 20 20 20 20 20 20 72 75 6e 5f 69 64 20 20 run_id
0d90: 20 20 20 49 4e 54 45 47 45 52 2c 0a 20 20 20 20 INTEGER,.
0da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0db0: 20 74 65 73 74 6e 61 6d 65 20 20 20 54 45 58 54 testname TEXT
0dc0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
0dd0: 20 20 20 20 20 20 20 68 6f 73 74 20 20 20 20 20 host
0de0: 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 TEXT DEFAULT '
0df0: 6e 2f 61 27 2c 0a 20 20 20 20 20 20 20 20 20 20 n/a',.
0e00: 20 20 20 20 20 20 20 20 20 20 20 63 70 75 6c 6f cpulo
0e10: 61 64 20 20 20 20 52 45 41 4c 20 44 45 46 41 55 ad REAL DEFAU
0e20: 4c 54 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 LT -1,.
0e30: 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 6b disk
0e40: 66 72 65 65 20 20 20 49 4e 54 45 47 45 52 20 44 free INTEGER D
0e50: 45 46 41 55 4c 54 20 2d 31 2c 0a 20 20 20 20 20 EFAULT -1,.
0e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0e70: 75 6e 61 6d 65 20 20 20 20 20 20 54 45 58 54 20 uname TEXT
0e80: 44 45 46 41 55 4c 54 20 27 6e 2f 61 27 2c 20 0a DEFAULT 'n/a', .
0e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0ea0: 20 20 20 20 20 72 75 6e 64 69 72 20 20 20 20 20 rundir
0eb0: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 6e 2f TEXT DEFAULT 'n/
0ec0: 61 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 a',.
0ed0: 20 20 20 20 20 20 20 20 20 73 68 6f 72 74 64 69 shortdi
0ee0: 72 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 r TEXT DEFAULT
0ef0: 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 '',.
0f00: 20 20 20 20 20 20 20 20 20 20 69 74 65 6d 5f 70 item_p
0f10: 61 74 68 20 20 54 45 58 54 20 44 45 46 41 55 4c ath TEXT DEFAUL
0f20: 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 T '',.
0f30: 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65 state
0f40: 20 20 20 20 20 20 54 45 58 54 20 44 45 46 41 55 TEXT DEFAU
0f50: 4c 54 20 27 4e 4f 54 5f 53 54 41 52 54 45 44 27 LT 'NOT_STARTED'
0f60: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
0f70: 20 20 20 20 20 20 20 73 74 61 74 75 73 20 20 20 status
0f80: 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 TEXT DEFAULT '
0f90: 46 41 49 4c 27 2c 0a 20 20 20 20 20 20 20 20 20 FAIL',.
0fa0: 20 20 20 20 20 20 20 20 20 20 20 20 61 74 74 65 atte
0fb0: 6d 70 74 6e 75 6d 20 49 4e 54 45 47 45 52 20 44 mptnum INTEGER D
0fc0: 45 46 41 55 4c 54 20 30 2c 0a 20 20 20 20 20 20 EFAULT 0,.
0fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 f
0fe0: 69 6e 61 6c 5f 6c 6f 67 66 20 54 45 58 54 20 44 inal_logf TEXT D
0ff0: 45 46 41 55 4c 54 20 27 6c 6f 67 73 2f 66 69 6e EFAULT 'logs/fin
1000: 61 6c 2e 6c 6f 67 27 2c 0a 20 20 20 20 20 20 20 al.log',.
1010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f lo
1020: 67 64 61 74 20 20 20 20 20 42 4c 4f 42 2c 20 0a gdat BLOB, .
1030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1040: 20 20 20 20 20 72 75 6e 5f 64 75 72 61 74 69 6f run_duratio
1050: 6e 20 49 4e 54 45 47 45 52 20 44 45 46 41 55 4c n INTEGER DEFAUL
1060: 54 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 T 0,.
1070: 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 65 6e commen
1080: 74 20 20 20 20 54 45 58 54 20 44 45 46 41 55 4c t TEXT DEFAUL
1090: 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 T '',.
10a0: 20 20 20 20 20 20 20 20 20 20 20 65 76 65 6e 74 event
10b0: 5f 74 69 6d 65 20 54 49 4d 45 53 54 41 4d 50 2c _time TIMESTAMP,
10c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
10d0: 20 20 20 20 20 20 66 61 69 6c 5f 63 6f 75 6e 74 fail_count
10e0: 20 49 4e 54 45 47 45 52 20 44 45 46 41 55 4c 54 INTEGER DEFAULT
10f0: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 0,.
1100: 20 20 20 20 20 20 20 20 20 70 61 73 73 5f 63 6f pass_co
1110: 75 6e 74 20 49 4e 54 45 47 45 52 20 44 45 46 41 unt INTEGER DEFA
1120: 55 4c 54 20 30 2c 0a 20 20 20 20 20 20 20 20 20 ULT 0,.
1130: 20 20 20 20 20 20 20 20 20 20 20 20 61 72 63 68 arch
1140: 69 76 65 64 20 20 20 49 4e 54 45 47 45 52 20 44 ived INTEGER D
1150: 45 46 41 55 4c 54 20 30 2c 20 2d 2d 20 30 3d 6e EFAULT 0, -- 0=n
1160: 6f 2c 20 31 3d 69 6e 20 70 72 6f 67 72 65 73 73 o, 1=in progress
1170: 2c 20 32 3d 79 65 73 0a 20 20 20 20 20 20 20 20 , 2=yes.
1180: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e CON
1190: 53 54 52 41 49 4e 54 20 74 65 73 74 73 63 6f 6e STRAINT testscon
11a0: 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28 straint UNIQUE (
11b0: 72 75 6e 5f 69 64 2c 20 74 65 73 74 6e 61 6d 65 run_id, testname
11c0: 2c 20 69 74 65 6d 5f 70 61 74 68 29 0a 20 20 20 , item_path).
11d0: 20 20 20 20 20 20 20 29 3b 22 29 0a 20 20 20 20 );").
11e0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 (sqlite3:execute
11f0: 20 64 62 20 22 43 52 45 41 54 45 20 49 4e 44 45 db "CREATE INDE
1200: 58 20 74 65 73 74 73 5f 69 6e 64 65 78 20 4f 4e X tests_index ON
1210: 20 74 65 73 74 73 20 28 72 75 6e 5f 69 64 2c 20 tests (run_id,
1220: 74 65 73 74 6e 61 6d 65 2c 20 69 74 65 6d 5f 70 testname, item_p
1230: 61 74 68 29 3b 22 29 0a 20 20 20 20 28 73 71 6c ath);"). (sql
1240: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 ite3:execute db
1250: 22 43 52 45 41 54 45 20 56 49 45 57 20 72 75 6e "CREATE VIEW run
1260: 73 5f 74 65 73 74 73 20 41 53 20 53 45 4c 45 43 s_tests AS SELEC
1270: 54 20 2a 20 46 52 4f 4d 20 72 75 6e 73 20 49 4e T * FROM runs IN
1280: 4e 45 52 20 4a 4f 49 4e 20 74 65 73 74 73 20 4f NER JOIN tests O
1290: 4e 20 72 75 6e 73 2e 69 64 3d 74 65 73 74 73 2e N runs.id=tests.
12a0: 72 75 6e 5f 69 64 3b 22 29 0a 20 20 20 20 28 73 run_id;"). (s
12b0: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 qlite3:execute d
12c0: 62 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 b "CREATE TABLE
12d0: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 74 65 IF NOT EXISTS te
12e0: 73 74 5f 73 74 65 70 73 20 0a 20 20 20 20 20 20 st_steps .
12f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1300: 20 20 20 20 20 20 20 20 28 69 64 20 49 4e 54 45 (id INTE
1310: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c GER PRIMARY KEY,
1320: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
1330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1340: 74 65 73 74 5f 69 64 20 49 4e 54 45 47 45 52 2c test_id INTEGER,
1350: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
1360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1370: 20 73 74 65 70 6e 61 6d 65 20 54 45 58 54 2c 20 stepname TEXT,
1380: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
1390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13a0: 73 74 61 74 65 20 54 45 58 54 20 44 45 46 41 55 state TEXT DEFAU
13b0: 4c 54 20 27 4e 4f 54 5f 53 54 41 52 54 45 44 27 LT 'NOT_STARTED'
13c0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 , .
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13e0: 20 20 73 74 61 74 75 73 20 54 45 58 54 20 44 45 status TEXT DE
13f0: 46 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20 20 20 FAULT 'n/a',.
1400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1410: 20 20 20 20 20 20 20 20 20 20 20 20 65 76 65 6e even
1420: 74 5f 74 69 6d 65 20 54 49 4d 45 53 54 41 4d 50 t_time TIMESTAMP
1430: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
1440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1450: 20 63 6f 6d 6d 65 6e 74 20 54 45 58 54 20 44 45 comment TEXT DE
1460: 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 FAULT '',.
1470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1480: 20 20 20 20 20 20 20 20 20 6c 6f 67 66 69 6c 65 logfile
1490: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 TEXT DEFAULT ''
14a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
14b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
14c0: 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 65 73 74 CONSTRAINT test
14d0: 5f 73 74 65 70 73 5f 63 6f 6e 73 74 72 61 69 6e _steps_constrain
14e0: 74 20 55 4e 49 51 55 45 20 28 74 65 73 74 5f 69 t UNIQUE (test_i
14f0: 64 2c 73 74 65 70 6e 61 6d 65 2c 73 74 61 74 65 d,stepname,state
1500: 29 29 3b 22 29 0a 20 20 20 20 28 73 71 6c 69 74 ));"). (sqlit
1510: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 43 e3:execute db "C
1520: 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e REATE TABLE IF N
1530: 4f 54 20 45 58 49 53 54 53 20 65 78 74 72 61 64 OT EXISTS extrad
1540: 61 74 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 at (id INTEGER P
1550: 52 49 4d 41 52 59 20 4b 45 59 2c 20 72 75 6e 5f RIMARY KEY, run_
1560: 69 64 20 49 4e 54 45 47 45 52 2c 20 6b 65 79 20 id INTEGER, key
1570: 54 45 58 54 2c 20 76 61 6c 20 54 45 58 54 29 3b TEXT, val TEXT);
1580: 22 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a "). (sqlite3:
1590: 65 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 execute db "CREA
15a0: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 TE TABLE IF NOT
15b0: 45 58 49 53 54 53 20 6d 65 74 61 64 61 74 20 28 EXISTS metadat (
15c0: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 id INTEGER PRIMA
15d0: 52 59 20 4b 45 59 2c 20 76 61 72 20 54 45 58 54 RY KEY, var TEXT
15e0: 2c 20 76 61 6c 20 54 45 58 54 2c 0a 20 20 20 20 , val TEXT,.
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 4f CO
1610: 4e 53 54 52 41 49 4e 54 20 6d 65 74 61 64 61 74 NSTRAINT metadat
1620: 5f 63 6f 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 _constraint UNIQ
1630: 55 45 20 28 76 61 72 29 29 3b 22 29 0a 20 20 20 UE (var));").
1640: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 (sqlite3:execut
1650: 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41 42 e db "CREATE TAB
1660: 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 LE IF NOT EXISTS
1670: 20 61 63 63 65 73 73 5f 6c 6f 67 20 28 69 64 20 access_log (id
1680: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 INTEGER PRIMARY
1690: 4b 45 59 2c 20 75 73 65 72 20 54 45 58 54 2c 20 KEY, user TEXT,
16a0: 61 63 63 65 73 73 65 64 20 54 49 4d 45 53 54 41 accessed TIMESTA
16b0: 4d 50 2c 20 61 72 67 73 20 54 45 58 54 29 3b 22 MP, args TEXT);"
16c0: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 ). (sqlite3:e
16d0: 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 54 xecute db "CREAT
16e0: 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 E TABLE IF NOT E
16f0: 58 49 53 54 53 20 74 65 73 74 5f 6d 65 74 61 20 XISTS test_meta
1700: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM
1710: 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 20 20 ARY KEY,.
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 te
1740: 73 74 6e 61 6d 65 20 20 20 20 54 45 58 54 20 44 stname TEXT D
1750: 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 EFAULT '',.
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1780: 61 75 74 68 6f 72 20 20 20 20 20 20 54 45 58 54 author TEXT
1790: 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 DEFAULT '',.
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17c0: 20 20 6f 77 6e 65 72 20 20 20 20 20 20 20 54 45 owner TE
17d0: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 XT DEFAULT '',.
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
17f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1800: 20 20 20 20 64 65 73 63 72 69 70 74 69 6f 6e 20 description
1810: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c TEXT DEFAULT '',
1820: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1840: 20 20 20 20 20 20 72 65 76 69 65 77 65 64 20 20 reviewed
1850: 20 20 54 49 4d 45 53 54 41 4d 50 2c 0a 20 20 20 TIMESTAMP,.
1860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1880: 20 20 69 74 65 72 61 74 65 64 20 20 20 20 54 45 iterated TE
1890: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 XT DEFAULT '',.
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
18c0: 20 20 20 20 61 76 67 5f 72 75 6e 74 69 6d 65 20 avg_runtime
18d0: 52 45 41 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 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 61 76 67 5f 64 avg_d
1900: 69 73 6b 20 20 20 20 52 45 41 4c 2c 0a 20 20 20 isk REAL,.
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 20 20 20 20 20
1930: 20 20 74 61 67 73 20 20 20 20 20 20 20 20 54 45 tags TE
1940: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 XT DEFAULT '',.
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1970: 20 20 20 20 6a 6f 62 67 72 6f 75 70 20 20 20 20 jobgroup
1980: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 64 65 TEXT DEFAULT 'de
1990: 66 61 75 6c 74 27 2c 0a 20 20 20 20 20 20 20 20 fault',.
19a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
19b0: 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52 41 49 CONSTRAI
19c0: 4e 54 20 74 65 73 74 5f 6d 65 74 61 5f 63 6f 6e NT test_meta_con
19d0: 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28 straint UNIQUE (
19e0: 74 65 73 74 6e 61 6d 65 29 29 3b 22 29 0a 20 20 testname));").
19f0: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 (sqlite3:execu
1a00: 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41 te db "CREATE TA
1a10: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 BLE IF NOT EXIST
1a20: 53 20 74 65 73 74 5f 64 61 74 61 20 28 69 64 20 S test_data (id
1a30: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 INTEGER PRIMARY
1a40: 4b 45 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 KEY,.
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a60: 20 20 20 20 20 74 65 73 74 5f 69 64 20 49 4e 54 test_id INT
1a70: 45 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 EGER,.
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a90: 20 20 20 20 20 20 63 61 74 65 67 6f 72 79 20 54 category T
1aa0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a EXT DEFAULT '',.
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ad0: 76 61 72 69 61 62 6c 65 20 54 45 58 54 2c 0a 09 variable TEXT,..
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1af0: 20 20 20 20 20 20 20 20 76 61 6c 75 65 20 52 45 value RE
1b00: 41 4c 2c 0a 09 20 20 20 20 20 20 20 20 20 20 20 AL,..
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70 exp
1b20: 65 63 74 65 64 20 52 45 41 4c 2c 0a 09 20 20 20 ected REAL,..
1b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1b40: 20 20 20 20 20 74 6f 6c 20 52 45 41 4c 2c 0a 20 tol REAL,.
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 u
1b70: 6e 69 74 73 20 54 45 58 54 2c 0a 20 20 20 20 20 nits TEXT,.
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1b90: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 65 comme
1ba0: 6e 74 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 nt TEXT DEFAULT
1bb0: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 '',.
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1bd0: 20 20 20 20 73 74 61 74 75 73 20 54 45 58 54 20 status TEXT
1be0: 44 45 46 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20 DEFAULT 'n/a',.
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 t
1c10: 79 70 65 20 54 45 58 54 20 44 45 46 41 55 4c 54 ype TEXT DEFAULT
1c20: 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 '',.
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1c40: 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 65 CONSTRAINT te
1c50: 73 74 5f 64 61 74 61 5f 63 6f 6e 73 74 72 61 69 st_data_constrai
1c60: 6e 74 20 55 4e 49 51 55 45 20 28 74 65 73 74 5f nt UNIQUE (test_
1c70: 69 64 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 69 id,category,vari
1c80: 61 62 6c 65 29 29 3b 22 29 0a 20 20 20 20 3b 3b able));"). ;;
1c90: 20 4d 75 73 74 20 64 6f 20 74 68 69 73 20 2a 61 Must do this *a
1ca0: 66 74 65 72 2a 20 72 75 6e 6e 69 6e 67 20 70 61 fter* running pa
1cb0: 74 63 68 20 64 62 20 21 21 20 4e 6f 20 6d 6f 72 tch db !! No mor
1cc0: 65 2e 20 0a 20 20 20 20 28 64 62 3a 73 65 74 2d e. . (db:set-
1cd0: 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 53 54 var db "MEGATEST
1ce0: 5f 56 45 52 53 49 4f 4e 22 20 6d 65 67 61 74 65 _VERSION" megate
1cf0: 73 74 2d 76 65 72 73 69 6f 6e 29 0a 20 20 20 20 st-version).
1d00: 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ))..;;==========
1d10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1d20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1d30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1d40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 ============.;;
1d50: 54 4f 44 4f 3a 0a 3b 3b 20 20 20 70 75 74 20 64 TODO:.;; put d
1d60: 65 6c 74 61 73 20 69 6e 74 6f 20 61 6e 20 61 73 eltas into an as
1d70: 73 6f 63 20 6c 69 73 74 20 77 69 74 68 20 76 65 soc list with ve
1d80: 72 73 69 6f 6e 20 6e 75 6d 62 65 72 73 0a 3b 3b rsion numbers.;;
1d90: 20 20 20 61 70 70 6c 79 20 61 6c 6c 20 66 72 6f apply all fro
1da0: 6d 20 6c 61 73 74 20 74 6f 20 63 75 72 72 65 6e m last to curren
1db0: 74 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d t.;;============
1dc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1dd0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1de0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1df0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 28 64 65 66 69 ==========.(defi
1e00: 6e 65 20 28 70 61 74 63 68 2d 64 62 20 64 62 29 ne (patch-db db)
1e10: 0a 20 20 28 68 61 6e 64 6c 65 2d 65 78 63 65 70 . (handle-excep
1e20: 74 69 6f 6e 73 0a 20 20 20 65 78 6e 0a 20 20 20 tions. exn.
1e30: 28 62 65 67 69 6e 0a 20 20 20 20 20 28 70 72 69 (begin. (pri
1e40: 6e 74 20 22 45 78 63 65 70 74 69 6f 6e 3a 20 22 nt "Exception: "
1e50: 20 65 78 6e 29 0a 20 20 20 20 20 28 70 72 69 6e exn). (prin
1e60: 74 20 22 45 52 52 4f 52 3a 20 50 6f 73 73 69 62 t "ERROR: Possib
1e70: 6c 65 20 6f 75 74 20 6f 66 20 64 61 74 65 20 73 le out of date s
1e80: 63 68 65 6d 61 2c 20 61 74 74 65 6d 70 74 69 6e chema, attemptin
1e90: 67 20 74 6f 20 61 64 64 20 74 61 62 6c 65 20 6d g to add table m
1ea0: 65 74 61 64 61 74 61 2e 2e 2e 22 29 0a 20 20 20 etadata...").
1eb0: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 (sqlite3:execu
1ec0: 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41 te db "CREATE TA
1ed0: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 BLE IF NOT EXIST
1ee0: 53 20 6d 65 74 61 64 61 74 20 28 69 64 20 49 4e S metadat (id IN
1ef0: 54 45 47 45 52 2c 20 76 61 72 20 54 45 58 54 2c TEGER, var TEXT,
1f00: 20 76 61 6c 20 54 45 58 54 2c 0a 20 20 20 20 20 val TEXT,.
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1f20: 20 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e 53 CONS
1f30: 54 52 41 49 4e 54 20 6d 65 74 61 64 61 74 5f 63 TRAINT metadat_c
1f40: 6f 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45 onstraint UNIQUE
1f50: 20 28 76 61 72 29 29 3b 22 29 0a 20 20 20 20 20 (var));").
1f60: 28 69 66 20 28 6e 6f 74 20 28 64 62 3a 67 65 74 (if (not (db:get
1f70: 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 53 -var db "MEGATES
1f80: 54 5f 56 45 52 53 49 4f 4e 22 29 29 0a 09 20 28 T_VERSION")).. (
1f90: 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d db:set-var db "M
1fa0: 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 EGATEST_VERSION"
1fb0: 20 31 2e 31 37 29 29 29 0a 20 20 20 28 6c 65 74 1.17))). (let
1fc0: 20 28 28 6d 76 65 72 20 28 64 62 3a 67 65 74 2d ((mver (db:get-
1fd0: 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 53 54 var db "MEGATEST
1fe0: 5f 56 45 52 53 49 4f 4e 22 29 29 0a 09 20 28 74 _VERSION")).. (t
1ff0: 65 73 74 2d 6d 65 74 61 2d 64 65 66 20 22 43 52 est-meta-def "CR
2000: 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f EATE TABLE IF NO
2010: 54 20 45 58 49 53 54 53 20 74 65 73 74 5f 6d 65 T EXISTS test_me
2020: 74 61 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 ta (id INTEGER P
2030: 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 RIMARY KEY,.
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2060: 20 74 65 73 74 6e 61 6d 65 20 20 20 20 54 45 58 testname TEX
2070: 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 T DEFAULT '',.
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20a0: 20 20 20 61 75 74 68 6f 72 20 20 20 20 20 20 54 author T
20b0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a EXT DEFAULT '',.
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
20e0: 20 20 20 20 20 6f 77 6e 65 72 20 20 20 20 20 20 owner
20f0: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 TEXT DEFAULT ''
2100: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2120: 20 20 20 20 20 20 20 64 65 73 63 72 69 70 74 69 descripti
2130: 6f 6e 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 on TEXT DEFAULT
2140: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 '',.
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2160: 20 20 20 20 20 20 20 20 20 72 65 76 69 65 77 65 reviewe
2170: 64 20 20 20 20 54 49 4d 45 53 54 41 4d 50 2c 0a d TIMESTAMP,.
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
21a0: 20 20 20 20 20 69 74 65 72 61 74 65 64 20 20 20 iterated
21b0: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 TEXT DEFAULT ''
21c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
21e0: 20 20 20 20 20 20 20 61 76 67 5f 72 75 6e 74 69 avg_runti
21f0: 6d 65 20 52 45 41 4c 2c 0a 20 20 20 20 20 20 20 me REAL,.
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 76 av
2220: 67 5f 64 69 73 6b 20 20 20 20 52 45 41 4c 2c 0a g_disk REAL,.
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2250: 20 20 20 20 20 74 61 67 73 20 20 20 20 20 20 20 tags
2260: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 TEXT DEFAULT ''
2270: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
2280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2290: 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 65 73 CONSTRAINT tes
22a0: 74 5f 6d 65 74 61 5f 63 6f 6e 73 74 72 61 69 6e t_meta_constrain
22b0: 74 20 55 4e 49 51 55 45 20 28 74 65 73 74 6e 61 t UNIQUE (testna
22c0: 6d 65 29 29 3b 22 29 29 0a 20 20 20 20 20 28 70 me));")). (p
22d0: 72 69 6e 74 20 22 43 75 72 72 65 6e 74 20 73 63 rint "Current sc
22e0: 68 65 6d 61 20 76 65 72 73 69 6f 6e 3a 20 22 20 hema version: "
22f0: 6d 76 65 72 20 22 20 63 75 72 72 65 6e 74 20 6d mver " current m
2300: 65 67 61 74 65 73 74 20 76 65 72 73 69 6f 6e 3a egatest version:
2310: 20 22 20 6d 65 67 61 74 65 73 74 2d 76 65 72 73 " megatest-vers
2320: 69 6f 6e 29 0a 20 20 20 20 20 28 63 6f 6e 64 0a ion). (cond.
2330: 20 20 20 20 20 20 28 28 6e 6f 74 20 6d 76 65 72 ((not mver
2340: 29 0a 20 20 20 20 20 20 20 28 70 72 69 6e 74 20 ). (print
2350: 22 41 64 64 69 6e 67 20 6d 65 67 61 74 65 73 74 "Adding megatest
2360: 2d 76 65 72 73 69 6f 6e 20 74 6f 20 6d 65 74 61 -version to meta
2370: 64 61 74 61 22 29 20 3b 3b 20 4e 65 65 64 20 74 data") ;; Need t
2380: 6f 20 72 65 63 72 65 61 74 65 20 74 68 65 20 74 o recreate the t
2390: 61 62 6c 65 0a 20 20 20 20 20 20 20 28 73 71 6c able. (sql
23a0: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 ite3:execute db
23b0: 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 "DROP TABLE IF E
23c0: 58 49 53 54 53 20 6d 65 74 61 64 61 74 3b 22 29 XISTS metadat;")
23d0: 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 . (sqlite3
23e0: 3a 65 78 65 63 75 74 65 20 64 62 20 22 43 52 45 :execute db "CRE
23f0: 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 ATE TABLE IF NOT
2400: 20 45 58 49 53 54 53 20 6d 65 74 61 64 61 74 20 EXISTS metadat
2410: 28 69 64 20 49 4e 54 45 47 45 52 2c 20 76 61 72 (id INTEGER, var
2420: 20 54 45 58 54 2c 20 76 61 6c 20 54 45 58 54 2c TEXT, val TEXT,
2430: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
2440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2450: 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 6d 65 CONSTRAINT me
2460: 74 61 64 61 74 5f 63 6f 6e 73 74 72 61 69 6e 74 tadat_constraint
2470: 20 55 4e 49 51 55 45 20 28 76 61 72 29 29 3b 22 UNIQUE (var));"
2480: 29 0a 20 20 20 20 20 20 20 28 64 62 3a 73 65 74 ). (db:set
2490: 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 53 -var db "MEGATES
24a0: 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e 31 37 29 T_VERSION" 1.17)
24b0: 0a 20 20 20 20 20 20 20 28 70 61 74 63 68 2d 64 . (patch-d
24c0: 62 29 29 0a 20 20 20 20 20 20 28 28 3c 20 6d 76 b)). ((< mv
24d0: 65 72 20 31 2e 32 31 29 0a 20 20 20 20 20 20 20 er 1.21).
24e0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 (sqlite3:execute
24f0: 20 64 62 20 22 44 52 4f 50 20 54 41 42 4c 45 20 db "DROP TABLE
2500: 49 46 20 45 58 49 53 54 53 20 6d 65 74 61 64 61 IF EXISTS metada
2510: 74 3b 22 29 0a 20 20 20 20 20 20 20 28 73 71 6c t;"). (sql
2520: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 ite3:execute db
2530: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 "CREATE TABLE IF
2540: 20 4e 4f 54 20 45 58 49 53 54 53 20 6d 65 74 61 NOT EXISTS meta
2550: 64 61 74 20 28 69 64 20 49 4e 54 45 47 45 52 2c dat (id INTEGER,
2560: 20 76 61 72 20 54 45 58 54 2c 20 76 61 6c 20 54 var TEXT, val T
2570: 45 58 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 EXT,.
2580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2590: 20 20 20 20 20 20 20 43 4f 4e 53 54 52 41 49 4e CONSTRAIN
25a0: 54 20 6d 65 74 61 64 61 74 5f 63 6f 6e 73 74 72 T metadat_constr
25b0: 61 69 6e 74 20 55 4e 49 51 55 45 20 28 76 61 72 aint UNIQUE (var
25c0: 29 29 3b 22 29 0a 20 20 20 20 20 20 20 28 64 62 ));"). (db
25d0: 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47 :set-var db "MEG
25e0: 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 31 ATEST_VERSION" 1
25f0: 2e 32 31 29 20 3b 3b 20 73 65 74 20 62 65 66 6f .21) ;; set befo
2600: 72 65 2c 20 6a 75 73 74 20 69 6e 20 63 61 73 65 re, just in case
2610: 20 74 68 65 20 63 68 61 6e 67 65 73 20 61 72 65 the changes are
2620: 20 61 6c 72 65 61 64 79 20 61 70 70 6c 69 65 64 already applied
2630: 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 . (sqlite3
2640: 3a 65 78 65 63 75 74 65 20 64 62 20 74 65 73 74 :execute db test
2650: 2d 6d 65 74 61 2d 64 65 66 29 0a 09 09 09 09 09 -meta-def)......
2660: 3b 28 66 6f 72 2d 65 61 63 68 20 0a 09 09 09 09 ;(for-each .....
2670: 09 3b 20 28 6c 61 6d 62 64 61 20 28 73 74 6d 74 .; (lambda (stmt
2680: 29 0a 09 09 09 09 09 3b 20 20 20 28 73 71 6c 69 )......; (sqli
2690: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 73 te3:execute db s
26a0: 74 6d 74 29 29 0a 09 09 09 09 09 3b 20 28 6c 69 tmt))......; (li
26b0: 73 74 20 0a 09 09 09 09 09 3b 20 20 22 41 4c 54 st ......; "ALT
26c0: 45 52 20 54 41 42 4c 45 20 74 65 73 74 73 20 41 ER TABLE tests A
26d0: 44 44 20 43 4f 4c 55 4d 4e 20 66 69 72 73 74 5f DD COLUMN first_
26e0: 65 72 72 20 54 45 58 54 3b 22 0a 09 09 09 09 09 err TEXT;"......
26f0: 3b 20 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 ; "ALTER TABLE
2700: 74 65 73 74 73 20 41 44 44 20 43 4f 4c 55 4d 4e tests ADD COLUMN
2710: 20 66 69 72 73 74 5f 77 61 72 6e 20 54 45 58 54 first_warn TEXT
2720: 3b 22 0a 09 09 09 09 09 3b 20 20 29 29 0a 20 20 ;"......; )).
2730: 20 20 20 20 20 28 70 61 74 63 68 2d 64 62 29 29 (patch-db))
2740: 0a 20 20 20 20 20 20 28 28 3c 20 6d 76 65 72 20 . ((< mver
2750: 31 2e 32 34 29 0a 20 20 20 20 20 20 20 28 64 62 1.24). (db
2760: 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47 :set-var db "MEG
2770: 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 31 ATEST_VERSION" 1
2780: 2e 32 34 29 0a 20 20 20 20 20 20 20 28 73 71 6c .24). (sql
2790: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 ite3:execute db
27a0: 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 "DROP TABLE IF E
27b0: 58 49 53 54 53 20 74 65 73 74 5f 64 61 74 61 3b XISTS test_data;
27c0: 22 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 "). (sqlit
27d0: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 44 e3:execute db "D
27e0: 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 ROP TABLE IF EXI
27f0: 53 54 53 20 74 65 73 74 5f 6d 65 74 61 3b 22 29 STS test_meta;")
2800: 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 . (sqlite3
2810: 3a 65 78 65 63 75 74 65 20 64 62 20 74 65 73 74 :execute db test
2820: 2d 6d 65 74 61 2d 64 65 66 29 0a 20 20 20 20 20 -meta-def).
2830: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 (sqlite3:execu
2840: 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41 te db "CREATE TA
2850: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 BLE IF NOT EXIST
2860: 53 20 74 65 73 74 5f 64 61 74 61 20 28 69 64 20 S test_data (id
2870: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 INTEGER PRIMARY
2880: 4b 45 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 KEY,.
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
28a0: 20 20 20 20 20 74 65 73 74 5f 69 64 20 49 4e 54 test_id INT
28b0: 45 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 EGER,.
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
28d0: 20 20 20 20 20 20 63 61 74 65 67 6f 72 79 20 54 category T
28e0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a EXT DEFAULT '',.
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2910: 76 61 72 69 61 62 6c 65 20 54 45 58 54 2c 0a 09 variable TEXT,..
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2930: 20 20 20 20 20 20 20 20 76 61 6c 75 65 20 52 45 value RE
2940: 41 4c 2c 0a 09 20 20 20 20 20 20 20 20 20 20 20 AL,..
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70 exp
2960: 65 63 74 65 64 20 52 45 41 4c 2c 0a 09 20 20 20 ected REAL,..
2970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2980: 20 20 20 20 20 74 6f 6c 20 52 45 41 4c 2c 0a 20 tol REAL,.
2990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 u
29b0: 6e 69 74 73 20 54 45 58 54 2c 0a 20 20 20 20 20 nits TEXT,.
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
29d0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 65 comme
29e0: 6e 74 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 nt TEXT DEFAULT
29f0: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 '',.
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2a10: 20 20 20 20 73 74 61 74 75 73 20 54 45 58 54 20 status TEXT
2a20: 44 45 46 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20 DEFAULT 'n/a',.
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e CON
2a50: 53 54 52 41 49 4e 54 20 74 65 73 74 5f 64 61 74 STRAINT test_dat
2a60: 61 20 55 4e 49 51 55 45 20 28 74 65 73 74 5f 69 a UNIQUE (test_i
2a70: 64 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 69 61 d,category,varia
2a80: 62 6c 65 29 29 3b 22 29 0a 20 20 20 20 20 20 20 ble));").
2a90: 28 70 72 69 6e 74 20 22 57 41 52 4e 49 4e 47 3a (print "WARNING:
2aa0: 20 54 61 62 6c 65 20 74 65 73 74 5f 64 61 74 61 Table test_data
2ab0: 20 61 6e 64 20 74 65 73 74 5f 6d 65 74 61 20 77 and test_meta w
2ac0: 65 72 65 20 72 65 63 72 65 61 74 65 64 2e 20 50 ere recreated. P
2ad0: 6c 65 61 73 65 20 64 6f 20 6d 65 67 61 74 65 73 lease do megates
2ae0: 74 20 2d 75 70 64 61 74 65 2d 6d 65 74 61 22 29 t -update-meta")
2af0: 0a 20 20 20 20 20 20 20 28 70 61 74 63 68 2d 64 . (patch-d
2b00: 62 29 29 0a 20 20 20 20 20 20 28 28 3c 20 6d 76 b)). ((< mv
2b10: 65 72 20 31 2e 32 37 29 0a 20 20 20 20 20 20 20 er 1.27).
2b20: 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22 (db:set-var db "
2b30: 4d 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e MEGATEST_VERSION
2b40: 22 20 31 2e 32 37 29 0a 20 20 20 20 20 20 20 28 " 1.27). (
2b50: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 sqlite3:execute
2b60: 64 62 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 db "ALTER TABLE
2b70: 74 65 73 74 5f 64 61 74 61 20 41 44 44 20 43 4f test_data ADD CO
2b80: 4c 55 4d 4e 20 74 79 70 65 20 54 45 58 54 20 44 LUMN type TEXT D
2b90: 45 46 41 55 4c 54 20 27 27 3b 22 29 0a 20 20 20 EFAULT '';").
2ba0: 20 20 20 20 28 70 61 74 63 68 2d 64 62 29 29 0a (patch-db)).
2bb0: 20 20 20 20 20 20 28 28 3c 20 6d 76 65 72 20 31 ((< mver 1
2bc0: 2e 32 39 29 0a 20 20 20 20 20 20 20 28 64 62 3a .29). (db:
2bd0: 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41 set-var db "MEGA
2be0: 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e TEST_VERSION" 1.
2bf0: 32 39 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69 29). (sqli
2c00: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 te3:execute db "
2c10: 41 4c 54 45 52 20 54 41 42 4c 45 20 74 65 73 74 ALTER TABLE test
2c20: 5f 73 74 65 70 73 20 41 44 44 20 43 4f 4c 55 4d _steps ADD COLUM
2c30: 4e 20 6c 6f 67 66 69 6c 65 20 54 45 58 54 20 44 N logfile TEXT D
2c40: 45 46 41 55 4c 54 20 27 27 3b 22 29 0a 20 20 20 EFAULT '';").
2c50: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 (sqlite3:exe
2c60: 63 75 74 65 20 64 62 20 22 41 4c 54 45 52 20 54 cute db "ALTER T
2c70: 41 42 4c 45 20 74 65 73 74 73 20 41 44 44 20 43 ABLE tests ADD C
2c80: 4f 4c 55 4d 4e 20 73 68 6f 72 74 64 69 72 20 54 OLUMN shortdir T
2c90: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 3b 22 EXT DEFAULT '';"
2ca0: 29 29 0a 20 20 20 20 20 20 28 28 3c 20 6d 76 65 )). ((< mve
2cb0: 72 20 31 2e 33 36 29 0a 20 20 20 20 20 20 20 28 r 1.36). (
2cc0: 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d db:set-var db "M
2cd0: 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 EGATEST_VERSION"
2ce0: 20 31 2e 33 36 29 0a 20 20 20 20 20 20 20 28 73 1.36). (s
2cf0: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 qlite3:execute d
2d00: 62 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 74 b "ALTER TABLE t
2d10: 65 73 74 5f 6d 65 74 61 20 41 44 44 20 43 4f 4c est_meta ADD COL
2d20: 55 4d 4e 20 6a 6f 62 67 72 6f 75 70 20 54 45 58 UMN jobgroup TEX
2d30: 54 20 44 45 46 41 55 4c 54 20 27 64 65 66 61 75 T DEFAULT 'defau
2d40: 6c 74 27 3b 22 29 29 0a 20 20 20 20 20 20 28 28 lt';")). ((
2d50: 3c 20 6d 76 65 72 20 31 2e 33 37 29 0a 20 20 20 < mver 1.37).
2d60: 20 20 20 20 28 64 62 3a 73 65 74 2d 76 61 72 20 (db:set-var
2d70: 64 62 20 22 4d 45 47 41 54 45 53 54 5f 56 45 52 db "MEGATEST_VER
2d80: 53 49 4f 4e 22 20 31 2e 33 37 29 0a 20 20 20 20 SION" 1.37).
2d90: 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 (sqlite3:exec
2da0: 75 74 65 20 64 62 20 22 41 4c 54 45 52 20 54 41 ute db "ALTER TA
2db0: 42 4c 45 20 74 65 73 74 73 20 41 44 44 20 43 4f BLE tests ADD CO
2dc0: 4c 55 4d 4e 20 61 72 63 68 69 76 65 64 20 49 4e LUMN archived IN
2dd0: 54 45 47 45 52 20 44 45 46 41 55 4c 54 20 30 3b TEGER DEFAULT 0;
2de0: 22 29 29 20 0a 20 20 20 20 20 20 28 28 3c 20 6d ")) . ((< m
2df0: 76 65 72 20 6d 65 67 61 74 65 73 74 2d 76 65 72 ver megatest-ver
2e00: 73 69 6f 6e 29 0a 20 20 20 20 20 20 20 28 64 62 sion). (db
2e10: 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47 :set-var db "MEG
2e20: 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 6d ATEST_VERSION" m
2e30: 65 67 61 74 65 73 74 2d 76 65 72 73 69 6f 6e 29 egatest-version)
2e40: 29 29 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d )))))..;;=======
2e50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2e60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2e70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2e80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a ===============.
2e90: 3b 3b 20 6d 65 74 61 20 67 65 74 20 61 6e 64 20 ;; meta get and
2ea0: 73 65 74 20 76 61 72 73 0a 3b 3b 3d 3d 3d 3d 3d set vars.;;=====
2eb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2ec0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2ed0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2ee0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2ef0: 3d 0a 0a 3b 3b 20 72 65 74 75 72 6e 73 20 6e 75 =..;; returns nu
2f00: 6d 62 65 72 20 69 66 20 73 74 72 69 6e 67 2d 3e mber if string->
2f10: 6e 75 6d 62 65 72 20 69 73 20 73 75 63 63 65 73 number is succes
2f20: 73 66 75 6c 2c 20 73 74 72 69 6e 67 20 6f 74 68 sful, string oth
2f30: 65 72 77 69 73 65 0a 28 64 65 66 69 6e 65 20 28 erwise.(define (
2f40: 64 62 3a 67 65 74 2d 76 61 72 20 64 62 20 76 61 db:get-var db va
2f50: 72 29 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20 r). (let ((res
2f60: 23 66 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65 #f)). (sqlite
2f70: 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 3:for-each-row.
2f80: 20 20 20 20 28 6c 61 6d 62 64 61 20 28 76 61 6c (lambda (val
2f90: 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72 ). (set! r
2fa0: 65 73 20 76 61 6c 29 29 0a 20 20 20 20 20 64 62 es val)). db
2fb0: 20 22 53 45 4c 45 43 54 20 76 61 6c 20 46 52 4f "SELECT val FRO
2fc0: 4d 20 6d 65 74 61 64 61 74 20 57 48 45 52 45 20 M metadat WHERE
2fd0: 76 61 72 3d 3f 3b 22 20 76 61 72 29 0a 20 20 20 var=?;" var).
2fe0: 20 28 69 66 20 28 73 74 72 69 6e 67 3f 20 72 65 (if (string? re
2ff0: 73 29 0a 09 28 6c 65 74 20 28 28 76 61 6c 6e 75 s)..(let ((valnu
3000: 6d 20 28 73 74 72 69 6e 67 2d 3e 6e 75 6d 62 65 m (string->numbe
3010: 72 20 72 65 73 29 29 29 0a 09 20 20 28 69 66 20 r res))).. (if
3020: 76 61 6c 6e 75 6d 20 76 61 6c 6e 75 6d 20 72 65 valnum valnum re
3030: 73 29 29 0a 09 72 65 73 29 29 29 0a 0a 28 64 65 s))..res)))..(de
3040: 66 69 6e 65 20 28 64 62 3a 73 65 74 2d 76 61 72 fine (db:set-var
3050: 20 64 62 20 76 61 72 20 76 61 6c 29 0a 20 20 28 db var val). (
3060: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 sqlite3:execute
3070: 64 62 20 22 49 4e 53 45 52 54 20 4f 52 20 52 45 db "INSERT OR RE
3080: 50 4c 41 43 45 20 49 4e 54 4f 20 6d 65 74 61 64 PLACE INTO metad
3090: 61 74 20 28 76 61 72 2c 76 61 6c 29 20 56 41 4c at (var,val) VAL
30a0: 55 45 53 20 28 3f 2c 3f 29 3b 22 20 76 61 72 20 UES (?,?);" var
30b0: 76 61 6c 29 29 0a 0a 3b 3b 20 75 73 65 20 61 20 val))..;; use a
30c0: 67 6c 6f 62 61 6c 20 66 6f 72 20 73 6f 6d 65 20 global for some
30d0: 70 72 69 6d 69 74 69 76 65 20 63 61 63 68 69 6e primitive cachin
30e0: 67 2c 20 69 74 20 69 73 20 6a 75 73 74 20 73 69 g, it is just si
30f0: 6c 6c 79 20 74 6f 20 72 65 2d 72 65 61 64 20 74 lly to re-read t
3100: 68 65 20 64 62 20 0a 3b 3b 20 6f 76 65 72 20 61 he db .;; over a
3110: 6e 64 20 6f 76 65 72 20 61 67 61 69 6e 20 66 6f nd over again fo
3120: 72 20 74 68 65 20 6b 65 79 73 20 73 69 6e 63 65 r the keys since
3130: 20 74 68 65 79 20 6e 65 76 65 72 20 63 68 61 6e they never chan
3140: 67 65 0a 0a 28 64 65 66 69 6e 65 20 2a 64 62 2d ge..(define *db-
3150: 6b 65 79 73 2a 20 23 66 29 0a 0a 28 64 65 66 69 keys* #f)..(defi
3160: 6e 65 20 28 64 62 3a 67 65 74 2d 6b 65 79 73 20 ne (db:get-keys
3170: 64 62 29 0a 20 20 28 69 66 20 2a 64 62 2d 6b 65 db). (if *db-ke
3180: 79 73 2a 20 2a 64 62 2d 6b 65 79 73 2a 20 0a 20 ys* *db-keys* .
3190: 20 20 20 20 20 28 6c 65 74 20 28 28 72 65 73 20 (let ((res
31a0: 27 28 29 29 29 0a 09 28 73 71 6c 69 74 65 33 3a '()))..(sqlite3:
31b0: 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 09 20 for-each-row ..
31c0: 28 6c 61 6d 62 64 61 20 28 6b 65 79 20 6b 65 79 (lambda (key key
31d0: 74 79 70 65 29 0a 09 20 20 20 28 73 65 74 21 20 type).. (set!
31e0: 72 65 73 20 28 63 6f 6e 73 20 28 76 65 63 74 6f res (cons (vecto
31f0: 72 20 6b 65 79 20 6b 65 79 74 79 70 65 29 20 72 r key keytype) r
3200: 65 73 29 29 29 0a 09 20 64 62 0a 09 20 22 53 45 es))).. db.. "SE
3210: 4c 45 43 54 20 66 69 65 6c 64 6e 61 6d 65 2c 66 LECT fieldname,f
3220: 69 65 6c 64 74 79 70 65 20 46 52 4f 4d 20 6b 65 ieldtype FROM ke
3230: 79 73 20 4f 52 44 45 52 20 42 59 20 69 64 20 44 ys ORDER BY id D
3240: 45 53 43 3b 22 29 0a 09 28 73 65 74 21 20 2a 64 ESC;")..(set! *d
3250: 62 2d 6b 65 79 73 2a 20 72 65 73 29 0a 09 72 65 b-keys* res)..re
3260: 73 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 s)))..(define (d
3270: 62 3a 67 65 74 2d 76 61 6c 75 65 2d 62 79 2d 68 b:get-value-by-h
3280: 65 61 64 65 72 20 72 6f 77 20 68 65 61 64 65 72 eader row header
3290: 20 66 69 65 6c 64 29 0a 20 20 3b 3b 20 28 64 65 field). ;; (de
32a0: 62 75 67 3a 70 72 69 6e 74 20 32 20 22 64 62 3a bug:print 2 "db:
32b0: 67 65 74 2d 76 61 6c 75 65 2d 62 79 2d 68 65 61 get-value-by-hea
32c0: 64 65 72 20 72 6f 77 3a 20 22 20 72 6f 77 20 22 der row: " row "
32d0: 20 68 65 61 64 65 72 3a 20 22 20 68 65 61 64 65 header: " heade
32e0: 72 20 22 20 66 69 65 6c 64 3a 20 22 20 66 69 65 r " field: " fie
32f0: 6c 64 29 0a 20 20 28 69 66 20 28 6e 75 6c 6c 3f ld). (if (null?
3300: 20 68 65 61 64 65 72 29 20 23 66 0a 20 20 20 20 header) #f.
3310: 20 20 28 6c 65 74 20 6c 6f 6f 70 20 28 28 68 65 (let loop ((he
3320: 64 20 28 63 61 72 20 68 65 61 64 65 72 29 29 0a d (car header)).
3330: 09 09 20 28 74 61 6c 20 28 63 64 72 20 68 65 61 .. (tal (cdr hea
3340: 64 65 72 29 29 0a 09 09 20 28 6e 20 20 20 30 29 der))... (n 0)
3350: 29 0a 09 28 69 66 20 28 65 71 75 61 6c 3f 20 68 )..(if (equal? h
3360: 65 64 20 66 69 65 6c 64 29 0a 09 20 20 20 20 28 ed field).. (
3370: 76 65 63 74 6f 72 2d 72 65 66 20 72 6f 77 20 6e vector-ref row n
3380: 29 0a 09 20 20 20 20 28 69 66 20 28 6e 75 6c 6c ).. (if (null
3390: 3f 20 74 61 6c 29 20 23 66 20 28 6c 6f 6f 70 20 ? tal) #f (loop
33a0: 28 63 61 72 20 74 61 6c 29 28 63 64 72 20 74 61 (car tal)(cdr ta
33b0: 6c 29 28 2b 20 6e 20 31 29 29 29 29 29 29 29 0a l)(+ n 1))))))).
33c0: 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d .;;=============
33d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
33e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
33f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3400: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 20 52 20 =========.;; R
3410: 55 20 4e 20 53 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d U N S.;;========
3420: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3430: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3440: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3450: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a ==============..
3460: 28 64 65 66 69 6e 65 20 28 72 75 6e 73 3a 67 65 (define (runs:ge
3470: 74 2d 73 74 64 2d 72 75 6e 2d 66 69 65 6c 64 73 t-std-run-fields
3480: 20 6b 65 79 73 20 72 65 6d 66 69 65 6c 64 73 29 keys remfields)
3490: 0a 20 20 28 6c 65 74 2a 20 28 28 68 65 61 64 65 . (let* ((heade
34a0: 72 20 20 20 20 28 61 70 70 65 6e 64 20 28 6d 61 r (append (ma
34b0: 70 20 6b 65 79 3a 67 65 74 2d 66 69 65 6c 64 6e p key:get-fieldn
34c0: 61 6d 65 20 6b 65 79 73 29 0a 09 09 09 20 20 20 ame keys)....
34d0: 20 72 65 6d 66 69 65 6c 64 73 29 29 0a 09 20 28 remfields)).. (
34e0: 6b 65 79 73 74 72 20 20 20 20 28 63 6f 6e 63 20 keystr (conc
34f0: 28 6b 65 79 73 2d 3e 6b 65 79 73 74 72 20 6b 65 (keys->keystr ke
3500: 79 73 29 20 22 2c 22 0a 09 09 09 20 20 28 73 74 ys) ",".... (st
3510: 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 ring-intersperse
3520: 20 72 65 6d 66 69 65 6c 64 73 20 22 2c 22 29 29 remfields ","))
3530: 29 29 0a 20 20 20 20 28 6c 69 73 74 20 6b 65 79 )). (list key
3540: 73 74 72 20 68 65 61 64 65 72 29 29 29 0a 0a 3b str header)))..;
3550: 3b 20 6d 61 6b 65 20 61 20 71 75 65 72 79 20 28 ; make a query (
3560: 66 69 65 6c 64 6e 61 6d 65 20 6c 69 6b 65 20 27 fieldname like '
3570: 70 61 74 74 31 27 20 4f 52 20 66 69 65 6c 64 6e patt1' OR fieldn
3580: 61 6d 65 20 0a 28 64 65 66 69 6e 65 20 28 64 62 ame .(define (db
3590: 3a 70 61 74 74 2d 3e 6c 69 6b 65 20 66 69 65 6c :patt->like fiel
35a0: 64 6e 61 6d 65 20 70 61 74 74 73 74 72 20 23 21 dname pattstr #!
35b0: 6b 65 79 20 28 63 6f 6d 70 61 72 61 74 6f 72 20 key (comparator
35c0: 22 20 4f 52 20 22 29 29 0a 20 20 28 6c 65 74 20 " OR ")). (let
35d0: 28 28 70 61 74 74 73 20 28 69 66 20 28 73 74 72 ((patts (if (str
35e0: 69 6e 67 3f 20 70 61 74 74 73 74 72 29 0a 09 09 ing? pattstr)...
35f0: 20 20 20 28 73 74 72 69 6e 67 2d 73 70 6c 69 74 (string-split
3600: 20 70 61 74 74 73 74 72 20 22 2c 22 29 0a 09 09 pattstr ",")...
3610: 20 20 20 27 28 22 25 22 29 29 29 29 0a 20 20 20 '("%")))).
3620: 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 (string-intersp
3630: 65 72 73 65 20 28 6d 61 70 20 28 6c 61 6d 62 64 erse (map (lambd
3640: 61 20 28 70 61 74 74 29 0a 09 09 09 20 20 20 20 a (patt)....
3650: 20 20 20 28 63 6f 6e 63 20 66 69 65 6c 64 6e 61 (conc fieldna
3660: 6d 65 20 22 20 4c 49 4b 45 20 27 22 20 70 61 74 me " LIKE '" pat
3670: 74 20 22 27 22 29 29 0a 09 09 09 20 20 20 20 20 t "'"))....
3680: 28 69 66 20 28 6e 75 6c 6c 3f 20 70 61 74 74 73 (if (null? patts
3690: 29 0a 09 09 09 09 20 27 28 22 22 29 0a 09 09 09 )..... '("")....
36a0: 09 20 70 61 74 74 73 29 29 0a 09 09 09 63 6f 6d . patts))....com
36b0: 70 61 72 61 74 6f 72 29 29 29 0a 0a 3b 3b 20 72 parator)))..;; r
36c0: 65 70 6c 61 63 65 20 68 65 61 64 65 72 20 61 6e eplace header an
36d0: 64 20 6b 65 79 73 74 72 20 77 69 74 68 20 61 20 d keystr with a
36e0: 63 61 6c 6c 20 74 6f 20 72 75 6e 73 3a 67 65 74 call to runs:get
36f0: 2d 73 74 64 2d 72 75 6e 2d 66 69 65 6c 64 73 0a -std-run-fields.
3700: 3b 3b 0a 3b 3b 20 6b 65 79 70 61 74 74 73 3a 20 ;;.;; keypatts:
3710: 28 20 28 4b 45 59 31 20 22 61 62 63 25 64 65 66 ( (KEY1 "abc%def
3720: 22 29 28 4b 45 59 32 20 22 25 22 29 20 29 0a 3b ")(KEY2 "%") ).;
3730: 3b 20 72 75 6e 70 61 74 74 73 3a 20 70 61 74 74 ; runpatts: patt
3740: 31 2c 70 61 74 74 32 20 2e 2e 2e 0a 3b 3b 0a 28 1,patt2 ....;;.(
3750: 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 72 define (db:get-r
3760: 75 6e 73 20 64 62 20 72 75 6e 70 61 74 74 20 63 uns db runpatt c
3770: 6f 75 6e 74 20 6f 66 66 73 65 74 20 6b 65 79 70 ount offset keyp
3780: 61 74 74 73 29 0a 20 20 28 6c 65 74 2a 20 28 28 atts). (let* ((
3790: 72 65 73 20 20 20 20 20 20 20 27 28 29 29 0a 09 res '())..
37a0: 20 28 6b 65 79 73 20 20 20 20 20 20 20 28 64 62 (keys (db
37b0: 3a 67 65 74 2d 6b 65 79 73 20 64 62 29 29 0a 09 :get-keys db))..
37c0: 20 28 72 75 6e 70 61 74 74 73 74 72 20 28 64 62 (runpattstr (db
37d0: 3a 70 61 74 74 2d 3e 6c 69 6b 65 20 22 72 75 6e :patt->like "run
37e0: 6e 61 6d 65 22 20 72 75 6e 70 61 74 74 29 29 0a name" runpatt)).
37f0: 09 20 28 72 65 6d 66 69 65 6c 64 73 20 20 28 6c . (remfields (l
3800: 69 73 74 20 22 69 64 22 20 22 72 75 6e 6e 61 6d ist "id" "runnam
3810: 65 22 20 22 73 74 61 74 65 22 20 22 73 74 61 74 e" "state" "stat
3820: 75 73 22 20 22 6f 77 6e 65 72 22 20 22 65 76 65 us" "owner" "eve
3830: 6e 74 5f 74 69 6d 65 22 29 29 0a 09 20 28 68 65 nt_time")).. (he
3840: 61 64 65 72 20 20 20 20 20 28 61 70 70 65 6e 64 ader (append
3850: 20 28 6d 61 70 20 6b 65 79 3a 67 65 74 2d 66 69 (map key:get-fi
3860: 65 6c 64 6e 61 6d 65 20 6b 65 79 73 29 0a 09 09 eldname keys)...
3870: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6d rem
3880: 66 69 65 6c 64 73 29 29 0a 09 20 28 6b 65 79 73 fields)).. (keys
3890: 74 72 20 20 20 20 20 28 63 6f 6e 63 20 28 6b 65 tr (conc (ke
38a0: 79 73 2d 3e 6b 65 79 73 74 72 20 6b 65 79 73 29 ys->keystr keys)
38b0: 20 22 2c 22 0a 09 09 20 20 20 20 20 20 20 20 20 ","...
38c0: 20 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 (string-inters
38d0: 70 65 72 73 65 20 72 65 6d 66 69 65 6c 64 73 20 perse remfields
38e0: 22 2c 22 29 29 29 0a 09 20 28 71 72 79 73 74 72 ","))).. (qrystr
38f0: 20 20 20 20 20 28 63 6f 6e 63 20 22 53 45 4c 45 (conc "SELE
3900: 43 54 20 22 20 6b 65 79 73 74 72 20 22 20 46 52 CT " keystr " FR
3910: 4f 4d 20 72 75 6e 73 20 57 48 45 52 45 20 28 22 OM runs WHERE ("
3920: 20 72 75 6e 70 61 74 74 73 74 72 20 22 29 20 22 runpattstr ") "
3930: 20 3b 3b 20 72 75 6e 6e 61 6d 65 20 4c 49 4b 45 ;; runname LIKE
3940: 20 3f 20 22 0a 09 09 20 20 20 20 20 20 20 20 20 ? "...
3950: 20 20 3b 3b 20 47 65 6e 65 72 61 74 65 3a 20 22 ;; Generate: "
3960: 20 41 4e 44 20 78 20 4c 49 4b 45 20 27 6b 65 79 AND x LIKE 'key
3970: 70 61 74 74 27 20 2e 2e 2e 22 0a 09 09 20 20 20 patt' ..."...
3980: 20 20 20 20 20 20 20 20 28 69 66 20 28 6e 75 6c (if (nul
3990: 6c 3f 20 6b 65 79 70 61 74 74 73 29 20 22 22 0a l? keypatts) "".
39a0: 09 09 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ..
39b0: 20 28 63 6f 6e 63 20 22 20 41 4e 44 20 22 0a 09 (conc " AND "..
39c0: 09 20 20 20 20 20 20 20 20 20 09 20 20 20 20 28 . . (
39d0: 73 74 72 69 6e 67 2d 6a 6f 69 6e 20 0a 09 09 20 string-join ...
39e0: 20 20 20 20 20 20 20 20 09 20 20 20 20 20 28 6d . (m
39f0: 61 70 20 28 6c 61 6d 62 64 61 20 28 6b 65 79 70 ap (lambda (keyp
3a00: 61 74 74 29 0a 09 09 20 20 20 20 20 20 20 20 20 att)...
3a10: 09 09 20 20 20 20 28 6c 65 74 20 28 28 6b 65 79 .. (let ((key
3a20: 20 20 28 63 61 72 20 6b 65 79 70 61 74 74 29 29 (car keypatt))
3a30: 0a 09 09 20 20 20 20 20 20 20 20 20 09 09 09 20 ... ...
3a40: 20 28 70 61 74 74 20 28 63 61 64 72 20 6b 65 79 (patt (cadr key
3a50: 70 61 74 74 29 29 29 0a 09 09 20 20 20 20 20 20 patt)))...
3a60: 20 20 20 09 09 20 20 20 20 20 20 28 64 62 3a 70 .. (db:p
3a70: 61 74 74 2d 3e 6c 69 6b 65 20 6b 65 79 20 70 61 att->like key pa
3a80: 74 74 29 29 29 0a 09 09 20 20 20 20 20 20 20 20 tt)))...
3a90: 20 09 09 20 20 6b 65 79 70 61 74 74 73 29 0a 09 .. keypatts)..
3aa0: 09 20 20 20 20 20 20 20 20 20 09 20 20 20 20 20 . .
3ab0: 22 20 41 4e 44 20 22 29 29 29 0a 09 09 20 20 20 " AND ")))...
3ac0: 20 20 20 20 20 20 20 20 22 20 4f 52 44 45 52 20 " ORDER
3ad0: 42 59 20 65 76 65 6e 74 5f 74 69 6d 65 20 44 45 BY event_time DE
3ae0: 53 43 20 22 0a 09 09 20 20 20 20 20 20 20 20 20 SC "...
3af0: 20 20 28 69 66 20 28 6e 75 6d 62 65 72 3f 20 63 (if (number? c
3b00: 6f 75 6e 74 29 0a 09 09 20 20 20 20 20 20 20 20 ount)...
3b10: 20 20 20 20 20 20 20 28 63 6f 6e 63 20 22 20 4c (conc " L
3b20: 49 4d 49 54 20 22 20 63 6f 75 6e 74 29 0a 09 09 IMIT " count)...
3b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 "
3b40: 22 29 0a 09 09 20 20 20 20 20 20 20 20 20 20 20 ")...
3b50: 28 69 66 20 28 6e 75 6d 62 65 72 3f 20 6f 66 66 (if (number? off
3b60: 73 65 74 29 0a 09 09 20 20 20 20 20 20 20 20 20 set)...
3b70: 20 20 20 20 20 20 28 63 6f 6e 63 20 22 20 4f 46 (conc " OF
3b80: 46 53 45 54 20 22 20 6f 66 66 73 65 74 29 0a 09 FSET " offset)..
3b90: 09 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
3ba0: 22 22 29 29 29 29 0a 20 20 20 20 28 64 65 62 75 "")))). (debu
3bb0: 67 3a 70 72 69 6e 74 20 38 20 22 49 4e 46 4f 3a g:print 8 "INFO:
3bc0: 20 64 62 3a 67 65 74 2d 72 75 6e 73 20 71 72 79 db:get-runs qry
3bd0: 73 74 72 3a 20 22 20 71 72 79 73 74 72 20 22 5c str: " qrystr "\
3be0: 6e 6b 65 79 70 61 74 74 73 3a 20 22 20 6b 65 79 nkeypatts: " key
3bf0: 70 61 74 74 73 20 22 5c 6e 20 20 6f 66 66 73 65 patts "\n offse
3c00: 74 3a 20 22 20 6f 66 66 73 65 74 20 22 20 6c 69 t: " offset " li
3c10: 6d 69 74 3a 20 22 20 63 6f 75 6e 74 29 0a 20 20 mit: " count).
3c20: 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 (sqlite3:for-e
3c30: 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 ach-row. (la
3c40: 6d 62 64 61 20 28 61 20 2e 20 78 29 0a 20 20 20 mbda (a . x).
3c50: 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28 63 (set! res (c
3c60: 6f 6e 73 20 28 61 70 70 6c 79 20 76 65 63 74 6f ons (apply vecto
3c70: 72 20 61 20 78 29 20 72 65 73 29 29 29 0a 20 20 r a x) res))).
3c80: 20 20 20 64 62 0a 20 20 20 20 20 71 72 79 73 74 db. qryst
3c90: 72 0a 20 20 20 20 20 29 0a 20 20 20 20 28 76 65 r. ). (ve
3ca0: 63 74 6f 72 20 68 65 61 64 65 72 20 72 65 73 29 ctor header res)
3cb0: 29 29 0a 0a 3b 3b 20 6a 75 73 74 20 67 65 74 20 ))..;; just get
3cc0: 63 6f 75 6e 74 20 6f 66 20 72 75 6e 73 0a 28 64 count of runs.(d
3cd0: 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 6e 75 efine (db:get-nu
3ce0: 6d 2d 72 75 6e 73 20 64 62 20 72 75 6e 70 61 74 m-runs db runpat
3cf0: 74 29 0a 20 20 28 6c 65 74 20 28 28 6e 75 6d 72 t). (let ((numr
3d00: 75 6e 73 20 30 29 29 0a 20 20 20 20 28 73 71 6c uns 0)). (sql
3d10: 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f ite3:for-each-ro
3d20: 77 20 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 w . (lambda
3d30: 28 63 6f 75 6e 74 29 0a 20 20 20 20 20 20 20 28 (count). (
3d40: 73 65 74 21 20 6e 75 6d 72 75 6e 73 20 63 6f 75 set! numruns cou
3d50: 6e 74 29 29 0a 20 20 20 20 20 64 62 0a 20 20 20 nt)). db.
3d60: 20 20 22 53 45 4c 45 43 54 20 43 4f 55 4e 54 28 "SELECT COUNT(
3d70: 69 64 29 20 46 52 4f 4d 20 72 75 6e 73 20 57 48 id) FROM runs WH
3d80: 45 52 45 20 72 75 6e 6e 61 6d 65 20 4c 49 4b 45 ERE runname LIKE
3d90: 20 3f 3b 22 20 72 75 6e 70 61 74 74 29 0a 20 20 ?;" runpatt).
3da0: 20 20 6e 75 6d 72 75 6e 73 29 29 0a 0a 3b 3b 20 numruns))..;;
3db0: 75 73 65 20 28 67 65 74 2d 76 61 6c 75 65 2d 62 use (get-value-b
3dc0: 79 2d 68 65 61 64 65 72 20 28 64 62 3a 67 65 74 y-header (db:get
3dd0: 2d 68 65 61 64 65 72 20 72 75 6e 69 6e 66 6f 29 -header runinfo)
3de0: 28 64 62 3a 67 65 74 2d 72 6f 77 20 72 75 6e 69 (db:get-row runi
3df0: 6e 66 6f 29 29 0a 28 64 65 66 69 6e 65 20 28 64 nfo)).(define (d
3e00: 62 3a 67 65 74 2d 72 75 6e 2d 69 6e 66 6f 20 64 b:get-run-info d
3e10: 62 20 72 75 6e 2d 69 64 29 0a 20 20 28 69 66 20 b run-id). (if
3e20: 28 68 61 73 68 2d 74 61 62 6c 65 2d 72 65 66 2f (hash-table-ref/
3e30: 64 65 66 61 75 6c 74 20 2a 72 75 6e 2d 69 6e 66 default *run-inf
3e40: 6f 2d 63 61 63 68 65 2a 20 72 75 6e 2d 69 64 20 o-cache* run-id
3e50: 23 66 29 0a 20 20 20 20 20 20 28 68 61 73 68 2d #f). (hash-
3e60: 74 61 62 6c 65 2d 72 65 66 20 2a 72 75 6e 2d 69 table-ref *run-i
3e70: 6e 66 6f 2d 63 61 63 68 65 2a 20 72 75 6e 2d 69 nfo-cache* run-i
3e80: 64 29 0a 20 20 20 20 20 20 28 6c 65 74 2a 20 28 d). (let* (
3e90: 28 72 65 73 20 20 20 20 20 20 23 66 29 0a 09 20 (res #f)..
3ea0: 20 20 20 20 28 6b 65 79 73 20 20 20 20 20 20 28 (keys (
3eb0: 64 62 3a 67 65 74 2d 6b 65 79 73 20 64 62 29 29 db:get-keys db))
3ec0: 0a 09 20 20 20 20 20 28 72 65 6d 66 69 65 6c 64 .. (remfield
3ed0: 73 20 28 6c 69 73 74 20 22 69 64 22 20 22 72 75 s (list "id" "ru
3ee0: 6e 6e 61 6d 65 22 20 22 73 74 61 74 65 22 20 22 nname" "state" "
3ef0: 73 74 61 74 75 73 22 20 22 6f 77 6e 65 72 22 20 status" "owner"
3f00: 22 65 76 65 6e 74 5f 74 69 6d 65 22 29 29 0a 09 "event_time"))..
3f10: 20 20 20 20 20 28 68 65 61 64 65 72 20 20 20 20 (header
3f20: 28 61 70 70 65 6e 64 20 28 6d 61 70 20 6b 65 79 (append (map key
3f30: 3a 67 65 74 2d 66 69 65 6c 64 6e 61 6d 65 20 6b :get-fieldname k
3f40: 65 79 73 29 0a 09 09 09 09 72 65 6d 66 69 65 6c eys).....remfiel
3f50: 64 73 29 29 0a 09 20 20 20 20 20 28 6b 65 79 73 ds)).. (keys
3f60: 74 72 20 20 20 20 28 63 6f 6e 63 20 28 6b 65 79 tr (conc (key
3f70: 73 2d 3e 6b 65 79 73 74 72 20 6b 65 79 73 29 20 s->keystr keys)
3f80: 22 2c 22 0a 09 09 09 20 20 20 20 20 20 28 73 74 ",".... (st
3f90: 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 ring-intersperse
3fa0: 20 72 65 6d 66 69 65 6c 64 73 20 22 2c 22 29 29 remfields ","))
3fb0: 29 29 0a 09 3b 3b 20 28 64 65 62 75 67 3a 70 72 ))..;; (debug:pr
3fc0: 69 6e 74 20 30 20 22 64 62 3a 67 65 74 2d 72 75 int 0 "db:get-ru
3fd0: 6e 2d 69 6e 66 6f 20 72 75 6e 2d 69 64 3a 20 22 n-info run-id: "
3fe0: 20 72 75 6e 2d 69 64 20 22 20 68 65 61 64 65 72 run-id " header
3ff0: 3a 20 22 20 68 65 61 64 65 72 20 22 20 6b 65 79 : " header " key
4000: 73 74 72 3a 20 22 20 6b 65 79 73 74 72 29 0a 09 str: " keystr)..
4010: 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 (sqlite3:for-eac
4020: 68 2d 72 6f 77 0a 09 20 28 6c 61 6d 62 64 61 20 h-row.. (lambda
4030: 28 61 20 2e 20 78 29 0a 09 20 20 20 28 73 65 74 (a . x).. (set
4040: 21 20 72 65 73 20 28 61 70 70 6c 79 20 76 65 63 ! res (apply vec
4050: 74 6f 72 20 61 20 78 29 29 29 0a 09 20 64 62 0a tor a x))).. db.
4060: 09 20 28 63 6f 6e 63 20 22 53 45 4c 45 43 54 20 . (conc "SELECT
4070: 22 20 6b 65 79 73 74 72 20 22 20 46 52 4f 4d 20 " keystr " FROM
4080: 72 75 6e 73 20 57 48 45 52 45 20 69 64 3d 3f 3b runs WHERE id=?;
4090: 22 29 0a 09 20 72 75 6e 2d 69 64 29 0a 09 28 6c ").. run-id)..(l
40a0: 65 74 20 28 28 66 69 6e 61 6c 72 65 73 20 28 76 et ((finalres (v
40b0: 65 63 74 6f 72 20 68 65 61 64 65 72 20 72 65 73 ector header res
40c0: 29 29 29 0a 09 20 20 28 68 61 73 68 2d 74 61 62 ))).. (hash-tab
40d0: 6c 65 2d 73 65 74 21 20 2a 72 75 6e 2d 69 6e 66 le-set! *run-inf
40e0: 6f 2d 63 61 63 68 65 2a 20 72 75 6e 2d 69 64 20 o-cache* run-id
40f0: 66 69 6e 61 6c 72 65 73 29 0a 09 20 20 66 69 6e finalres).. fin
4100: 61 6c 72 65 73 29 29 29 29 0a 20 20 0a 28 64 65 alres)))). .(de
4110: 66 69 6e 65 20 28 64 62 3a 73 65 74 2d 63 6f 6d fine (db:set-com
4120: 6d 65 6e 74 2d 66 6f 72 2d 72 75 6e 20 64 62 20 ment-for-run db
4130: 72 75 6e 2d 69 64 20 63 6f 6d 6d 65 6e 74 29 0a run-id comment).
4140: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 (sqlite3:execu
4150: 74 65 20 64 62 20 22 55 50 44 41 54 45 20 72 75 te db "UPDATE ru
4160: 6e 73 20 53 45 54 20 63 6f 6d 6d 65 6e 74 3d 3f ns SET comment=?
4170: 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 63 6f WHERE id=?;" co
4180: 6d 6d 65 6e 74 20 72 75 6e 2d 69 64 29 29 0a 0a mment run-id))..
4190: 3b 3b 20 64 6f 65 73 20 6e 6f 74 20 28 6f 62 76 ;; does not (obv
41a0: 69 6f 75 73 6c 79 21 29 20 72 65 6d 6f 76 65 64 iously!) removed
41b0: 20 64 65 70 65 6e 64 65 6e 74 20 64 61 74 61 2e dependent data.
41c0: 20 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 64 65 .(define (db:de
41d0: 6c 65 74 65 2d 72 75 6e 20 64 62 20 72 75 6e 2d lete-run db run-
41e0: 69 64 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 id). (sqlite3:e
41f0: 78 65 63 75 74 65 20 64 62 20 22 44 45 4c 45 54 xecute db "DELET
4200: 45 20 46 52 4f 4d 20 72 75 6e 73 20 57 48 45 52 E FROM runs WHER
4210: 45 20 69 64 3d 3f 3b 22 20 72 75 6e 2d 69 64 29 E id=?;" run-id)
4220: 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 75 )..(define (db:u
4230: 70 64 61 74 65 2d 72 75 6e 2d 65 76 65 6e 74 5f pdate-run-event_
4240: 74 69 6d 65 20 64 62 20 72 75 6e 2d 69 64 29 0a time db run-id).
4250: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 (sqlite3:execu
4260: 74 65 20 64 62 20 22 55 50 44 41 54 45 20 72 75 te db "UPDATE ru
4270: 6e 73 20 53 45 54 20 65 76 65 6e 74 5f 74 69 6d ns SET event_tim
4280: 65 3d 73 74 72 66 74 69 6d 65 28 27 25 73 27 2c e=strftime('%s',
4290: 27 6e 6f 77 27 29 20 57 48 45 52 45 20 69 64 3d 'now') WHERE id=
42a0: 3f 3b 22 20 72 75 6e 2d 69 64 29 29 20 0a 0a 28 ?;" run-id)) ..(
42b0: 64 65 66 69 6e 65 20 28 64 62 3a 6c 6f 63 6b 2f define (db:lock/
42c0: 75 6e 6c 6f 63 6b 2d 72 75 6e 20 64 62 20 72 75 unlock-run db ru
42d0: 6e 2d 69 64 20 6c 6f 63 6b 20 75 6e 6c 6f 63 6b n-id lock unlock
42e0: 20 75 73 65 72 29 0a 20 20 28 6c 65 74 20 28 28 user). (let ((
42f0: 6e 65 77 6c 6f 63 6b 76 61 6c 20 28 69 66 20 6c newlockval (if l
4300: 6f 63 6b 20 22 6c 6f 63 6b 65 64 22 0a 09 09 09 ock "locked"....
4310: 28 69 66 20 75 6e 6c 6f 63 6b 0a 09 09 09 20 20 (if unlock....
4320: 20 20 22 75 6e 6c 6f 63 6b 65 64 22 0a 09 09 09 "unlocked"....
4330: 20 20 20 20 22 6c 6f 63 6b 65 64 22 29 29 29 29 "locked"))))
4340: 20 3b 3b 20 73 65 6d 69 2d 66 61 69 6c 73 61 66 ;; semi-failsaf
4350: 65 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 e. (sqlite3:e
4360: 78 65 63 75 74 65 20 64 62 20 22 55 50 44 41 54 xecute db "UPDAT
4370: 45 20 72 75 6e 73 20 53 45 54 20 73 74 61 74 65 E runs SET state
4380: 3d 3f 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 =? WHERE id=?;"
4390: 6e 65 77 6c 6f 63 6b 76 61 6c 20 72 75 6e 2d 69 newlockval run-i
43a0: 64 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a d). (sqlite3:
43b0: 65 78 65 63 75 74 65 20 64 62 20 22 49 4e 53 45 execute db "INSE
43c0: 52 54 20 49 4e 54 4f 20 61 63 63 65 73 73 5f 6c RT INTO access_l
43d0: 6f 67 20 28 75 73 65 72 2c 61 63 63 65 73 73 65 og (user,accesse
43e0: 64 2c 61 72 67 73 29 20 56 41 4c 55 45 53 28 3f d,args) VALUES(?
43f0: 2c 73 74 72 66 74 69 6d 65 28 27 25 73 27 2c 27 ,strftime('%s','
4400: 6e 6f 77 27 29 2c 3f 29 3b 22 0a 09 09 20 20 20 now'),?);"...
4410: 20 20 75 73 65 72 20 28 63 6f 6e 63 20 6e 65 77 user (conc new
4420: 6c 6f 63 6b 76 61 6c 20 22 20 22 20 72 75 6e 2d lockval " " run-
4430: 69 64 29 29 0a 20 20 20 20 28 64 65 62 75 67 3a id)). (debug:
4440: 70 72 69 6e 74 20 31 20 22 49 4e 46 4f 3a 20 22 print 1 "INFO: "
4450: 20 6e 65 77 6c 6f 63 6b 76 61 6c 20 22 20 72 75 newlockval " ru
4460: 6e 20 6e 75 6d 62 65 72 20 22 20 72 75 6e 2d 69 n number " run-i
4470: 64 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d d)))..;;========
4480: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
4490: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
44a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
44b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b ==============.;
44c0: 3b 20 4b 20 45 20 59 20 53 0a 3b 3b 3d 3d 3d 3d ; K E Y S.;;====
44d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
44e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
44f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
4500: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
4510: 3d 3d 0a 0a 3b 3b 20 67 65 74 20 6b 65 79 20 76 ==..;; get key v
4520: 61 6c 20 70 61 69 72 73 20 66 6f 72 20 61 20 67 al pairs for a g
4530: 69 76 65 6e 20 72 75 6e 2d 69 64 0a 3b 3b 20 28 iven run-id.;; (
4540: 20 28 46 49 45 4c 44 4e 41 4d 45 31 20 6b 65 79 (FIELDNAME1 key
4550: 76 61 6c 31 29 20 28 46 49 45 4c 44 4e 41 4d 45 val1) (FIELDNAME
4560: 32 20 6b 65 79 76 61 6c 32 29 20 2e 2e 2e 20 29 2 keyval2) ... )
4570: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 .(define (db:get
4580: 2d 6b 65 79 2d 76 61 6c 2d 70 61 69 72 73 20 64 -key-val-pairs d
4590: 62 20 72 75 6e 2d 69 64 29 0a 20 20 28 6c 65 74 b run-id). (let
45a0: 2a 20 28 28 6b 65 79 73 20 28 67 65 74 2d 6b 65 * ((keys (get-ke
45b0: 79 73 20 64 62 29 29 0a 09 20 28 72 65 73 20 20 ys db)).. (res
45c0: 27 28 29 29 29 0a 20 20 20 20 28 64 65 62 75 67 '())). (debug
45d0: 3a 70 72 69 6e 74 20 36 20 22 6b 65 79 73 3a 20 :print 6 "keys:
45e0: 22 20 6b 65 79 73 20 22 20 72 75 6e 2d 69 64 3a " keys " run-id:
45f0: 20 22 20 72 75 6e 2d 69 64 29 0a 20 20 20 20 28 " run-id). (
4600: 66 6f 72 2d 65 61 63 68 20 0a 20 20 20 20 20 28 for-each . (
4610: 6c 61 6d 62 64 61 20 28 6b 65 79 29 0a 20 20 20 lambda (key).
4620: 20 20 20 20 28 6c 65 74 20 28 28 71 72 79 20 28 (let ((qry (
4630: 63 6f 6e 63 20 22 53 45 4c 45 43 54 20 22 20 28 conc "SELECT " (
4640: 6b 65 79 3a 67 65 74 2d 66 69 65 6c 64 6e 61 6d key:get-fieldnam
4650: 65 20 6b 65 79 29 20 22 20 46 52 4f 4d 20 72 75 e key) " FROM ru
4660: 6e 73 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 29 ns WHERE id=?;")
4670: 29 29 0a 09 20 3b 3b 20 28 64 65 62 75 67 3a 70 )).. ;; (debug:p
4680: 72 69 6e 74 20 30 20 22 71 72 79 3a 20 22 20 71 rint 0 "qry: " q
4690: 72 79 29 0a 09 20 28 73 71 6c 69 74 65 33 3a 66 ry).. (sqlite3:f
46a0: 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 09 20 20 or-each-row ..
46b0: 28 6c 61 6d 62 64 61 20 28 6b 65 79 2d 76 61 6c (lambda (key-val
46c0: 29 0a 09 20 20 20 20 28 73 65 74 21 20 72 65 73 ).. (set! res
46d0: 20 28 63 6f 6e 73 20 28 6c 69 73 74 20 28 6b 65 (cons (list (ke
46e0: 79 3a 67 65 74 2d 66 69 65 6c 64 6e 61 6d 65 20 y:get-fieldname
46f0: 6b 65 79 29 20 6b 65 79 2d 76 61 6c 29 20 72 65 key) key-val) re
4700: 73 29 29 29 0a 09 20 20 64 62 20 71 72 79 20 72 s))).. db qry r
4710: 75 6e 2d 69 64 29 29 29 0a 20 20 20 20 20 6b 65 un-id))). ke
4720: 79 73 29 0a 20 20 20 20 28 72 65 76 65 72 73 65 ys). (reverse
4730: 20 72 65 73 29 29 29 0a 0a 3b 3b 20 67 65 74 20 res)))..;; get
4740: 6b 65 79 20 76 61 6c 73 20 66 6f 72 20 61 20 67 key vals for a g
4750: 69 76 65 6e 20 72 75 6e 2d 69 64 0a 28 64 65 66 iven run-id.(def
4760: 69 6e 65 20 28 64 62 3a 67 65 74 2d 6b 65 79 2d ine (db:get-key-
4770: 76 61 6c 73 20 64 62 20 72 75 6e 2d 69 64 29 0a vals db run-id).
4780: 20 20 28 6c 65 74 2a 20 28 28 6b 65 79 73 20 28 (let* ((keys (
4790: 67 65 74 2d 6b 65 79 73 20 64 62 29 29 0a 09 20 get-keys db))..
47a0: 28 72 65 73 20 20 27 28 29 29 29 0a 20 20 20 20 (res '())).
47b0: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 36 20 22 (debug:print 6 "
47c0: 6b 65 79 73 3a 20 22 20 6b 65 79 73 20 22 20 72 keys: " keys " r
47d0: 75 6e 2d 69 64 3a 20 22 20 72 75 6e 2d 69 64 29 un-id: " run-id)
47e0: 0a 20 20 20 20 28 66 6f 72 2d 65 61 63 68 20 0a . (for-each .
47f0: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 6b 65 (lambda (ke
4800: 79 29 0a 20 20 20 20 20 20 20 28 6c 65 74 20 28 y). (let (
4810: 28 71 72 79 20 28 63 6f 6e 63 20 22 53 45 4c 45 (qry (conc "SELE
4820: 43 54 20 22 20 28 6b 65 79 3a 67 65 74 2d 66 69 CT " (key:get-fi
4830: 65 6c 64 6e 61 6d 65 20 6b 65 79 29 20 22 20 46 eldname key) " F
4840: 52 4f 4d 20 72 75 6e 73 20 57 48 45 52 45 20 69 ROM runs WHERE i
4850: 64 3d 3f 3b 22 29 29 29 0a 09 20 3b 3b 20 28 64 d=?;"))).. ;; (d
4860: 65 62 75 67 3a 70 72 69 6e 74 20 30 20 22 71 72 ebug:print 0 "qr
4870: 79 3a 20 22 20 71 72 79 29 0a 09 20 28 73 71 6c y: " qry).. (sql
4880: 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f ite3:for-each-ro
4890: 77 20 0a 09 20 20 28 6c 61 6d 62 64 61 20 28 6b w .. (lambda (k
48a0: 65 79 2d 76 61 6c 29 0a 09 20 20 20 20 28 73 65 ey-val).. (se
48b0: 74 21 20 72 65 73 20 28 63 6f 6e 73 20 6b 65 79 t! res (cons key
48c0: 2d 76 61 6c 20 72 65 73 29 29 29 0a 09 20 20 64 -val res))).. d
48d0: 62 20 71 72 79 20 72 75 6e 2d 69 64 29 29 29 0a b qry run-id))).
48e0: 20 20 20 20 20 6b 65 79 73 29 0a 20 20 20 20 28 keys). (
48f0: 72 65 76 65 72 73 65 20 72 65 73 29 29 29 0a 0a reverse res)))..
4900: 3b 3b 20 54 68 65 20 74 61 72 67 65 74 20 69 73 ;; The target is
4910: 20 6b 65 79 76 61 6c 31 2f 6b 65 79 76 61 6c 32 keyval1/keyval2
4920: 2e 2e 2e 2c 20 63 61 63 68 65 64 20 69 6e 20 2a ..., cached in *
4930: 74 61 72 67 65 74 2a 20 61 73 20 69 74 20 69 73 target* as it is
4940: 20 75 73 65 64 20 6f 66 74 65 6e 0a 28 64 65 66 used often.(def
4950: 69 6e 65 20 28 64 62 3a 67 65 74 2d 74 61 72 67 ine (db:get-targ
4960: 65 74 20 64 62 20 72 75 6e 2d 69 64 29 0a 20 20 et db run-id).
4970: 28 69 66 20 2a 74 61 72 67 65 74 2a 0a 20 20 20 (if *target*.
4980: 20 20 20 2a 74 61 72 67 65 74 2a 0a 20 20 20 20 *target*.
4990: 20 20 28 6c 65 74 2a 20 28 28 6b 65 79 76 61 6c (let* ((keyval
49a0: 73 20 28 72 64 62 3a 67 65 74 2d 6b 65 79 2d 76 s (rdb:get-key-v
49b0: 61 6c 73 20 64 62 20 72 75 6e 2d 69 64 29 29 0a als db run-id)).
49c0: 09 20 20 20 20 20 28 74 68 65 6b 65 79 20 20 28 . (thekey (
49d0: 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 string-intersper
49e0: 73 65 20 28 6d 61 70 20 28 6c 61 6d 62 64 61 20 se (map (lambda
49f0: 28 78 29 28 69 66 20 78 20 78 20 22 2d 6e 61 2d (x)(if x x "-na-
4a00: 22 29 29 20 6b 65 79 76 61 6c 73 29 20 22 2f 22 ")) keyvals) "/"
4a10: 29 29 29 0a 09 28 73 65 74 21 20 2a 74 61 72 67 )))..(set! *targ
4a20: 65 74 2a 20 74 68 65 6b 65 79 29 0a 09 74 68 65 et* thekey)..the
4a30: 6b 65 79 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d key)))..;;======
4a40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
4a50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
4a60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
4a70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
4a80: 0a 3b 3b 20 20 54 20 45 20 53 20 54 20 53 0a 3b .;; T E S T S.;
4a90: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ;===============
4aa0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
4ab0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
4ac0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
4ad0: 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 73 74 61 74 =======..;; stat
4ae0: 65 73 20 61 6e 64 20 73 74 61 74 75 73 65 73 20 es and statuses
4af0: 61 72 65 20 6c 69 73 74 73 2c 20 74 75 72 6e 20 are lists, turn
4b00: 74 68 65 6d 20 69 6e 74 6f 20 28 22 50 41 53 53 them into ("PASS
4b10: 22 2c 22 46 41 49 4c 22 2e 2e 2e 29 20 61 6e 64 ","FAIL"...) and
4b20: 20 75 73 65 20 4e 4f 54 20 49 4e 0a 3b 3b 20 69 use NOT IN.;; i
4b30: 2e 65 2e 20 74 68 65 73 65 20 6c 69 73 74 73 20 .e. these lists
4b40: 64 65 66 69 6e 65 20 77 68 61 74 20 74 6f 20 4e define what to N
4b50: 4f 54 20 73 68 6f 77 2e 0a 3b 3b 20 73 74 61 74 OT show..;; stat
4b60: 65 73 20 61 6e 64 20 73 74 61 74 75 73 65 73 20 es and statuses
4b70: 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20 are required to
4b80: 62 65 20 6c 69 73 74 73 2c 20 65 6d 70 74 79 20 be lists, empty
4b90: 69 73 20 6f 6b 0a 3b 3b 20 6e 6f 74 2d 69 6e 20 is ok.;; not-in
4ba0: 23 74 20 3d 20 61 62 6f 76 65 20 62 65 68 61 76 #t = above behav
4bb0: 69 6f 75 72 2c 20 23 66 20 3d 20 6d 75 73 74 20 iour, #f = must
4bc0: 6d 61 74 63 68 0a 28 64 65 66 69 6e 65 20 28 64 match.(define (d
4bd0: 62 3a 67 65 74 2d 74 65 73 74 73 2d 66 6f 72 2d b:get-tests-for-
4be0: 72 75 6e 20 64 62 20 72 75 6e 2d 69 64 20 74 65 run db run-id te
4bf0: 73 74 70 61 74 74 20 69 74 65 6d 70 61 74 74 20 stpatt itempatt
4c00: 73 74 61 74 65 73 20 73 74 61 74 75 73 65 73 20 states statuses
4c10: 0a 09 09 09 20 20 20 20 20 20 23 21 6b 65 79 20 .... #!key
4c20: 28 6e 6f 74 2d 69 6e 20 23 74 29 0a 09 09 09 20 (not-in #t)....
4c30: 20 20 20 20 20 28 73 6f 72 74 2d 62 79 20 23 66 (sort-by #f
4c40: 29 20 3b 3b 20 27 72 75 6e 64 69 72 20 27 65 76 ) ;; 'rundir 'ev
4c50: 65 6e 74 5f 74 69 6d 65 0a 09 09 09 20 20 20 20 ent_time....
4c60: 20 20 29 0a 20 20 28 6c 65 74 2a 20 28 28 72 65 ). (let* ((re
4c70: 73 20 27 28 29 29 0a 09 20 3b 3b 20 69 66 20 73 s '()).. ;; if s
4c80: 74 61 74 65 73 20 6f 72 20 73 74 61 74 75 73 65 tates or statuse
4c90: 73 20 61 72 65 20 6e 75 6c 6c 20 74 68 65 6e 20 s are null then
4ca0: 61 73 73 75 6d 65 20 6d 61 74 63 68 20 61 6c 6c assume match all
4cb0: 20 77 68 65 6e 20 6e 6f 74 2d 69 6e 20 69 73 20 when not-in is
4cc0: 66 61 6c 73 65 0a 09 20 28 73 74 61 74 65 73 2d false.. (states-
4cd0: 73 74 72 20 20 20 20 28 63 6f 6e 63 20 22 20 73 str (conc " s
4ce0: 74 61 74 65 20 69 6e 20 28 27 22 20 28 73 74 72 tate in ('" (str
4cf0: 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 ing-intersperse
4d00: 73 74 61 74 65 73 20 20 20 22 27 2c 27 22 29 20 states "','")
4d10: 22 27 29 22 29 29 0a 09 20 28 73 74 61 74 75 73 "')")).. (status
4d20: 65 73 2d 73 74 72 20 20 28 63 6f 6e 63 20 22 20 es-str (conc "
4d30: 73 74 61 74 75 73 20 69 6e 20 28 27 22 20 28 73 status in ('" (s
4d40: 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 tring-interspers
4d50: 65 20 73 74 61 74 75 73 65 73 20 22 27 2c 27 22 e statuses "','"
4d60: 29 20 22 27 29 22 29 29 0a 09 20 28 73 74 61 74 ) "')")).. (stat
4d70: 65 2d 73 74 61 74 75 73 2d 71 72 79 20 28 69 66 e-status-qry (if
4d80: 20 28 6f 72 20 28 6e 6f 74 20 28 6e 75 6c 6c 3f (or (not (null?
4d90: 20 73 74 61 74 65 73 29 29 0a 09 09 09 09 20 20 states)).....
4da0: 20 28 6e 6f 74 20 28 6e 75 6c 6c 3f 20 73 74 61 (not (null? sta
4db0: 74 65 73 29 29 29 0a 09 09 09 20 20 20 20 20 20 tes)))....
4dc0: 20 28 63 6f 6e 63 20 22 20 41 4e 44 20 22 20 28 (conc " AND " (
4dd0: 69 66 20 6e 6f 74 2d 69 6e 20 22 4e 4f 54 22 20 if not-in "NOT"
4de0: 22 22 29 20 22 20 28 22 20 73 74 61 74 65 73 2d "") " (" states-
4df0: 73 74 72 20 22 20 41 4e 44 20 22 20 73 74 61 74 str " AND " stat
4e00: 75 73 65 73 2d 73 74 72 20 22 29 20 22 29 0a 09 uses-str ") ")..
4e10: 09 09 20 20 20 20 20 20 20 22 22 29 29 0a 09 20 .. ""))..
4e20: 28 71 72 79 20 20 20 20 20 20 28 63 6f 6e 63 20 (qry (conc
4e30: 22 53 45 4c 45 43 54 20 69 64 2c 72 75 6e 5f 69 "SELECT id,run_i
4e40: 64 2c 74 65 73 74 6e 61 6d 65 2c 73 74 61 74 65 d,testname,state
4e50: 2c 73 74 61 74 75 73 2c 65 76 65 6e 74 5f 74 69 ,status,event_ti
4e60: 6d 65 2c 68 6f 73 74 2c 63 70 75 6c 6f 61 64 2c me,host,cpuload,
4e70: 64 69 73 6b 66 72 65 65 2c 75 6e 61 6d 65 2c 72 diskfree,uname,r
4e80: 75 6e 64 69 72 2c 69 74 65 6d 5f 70 61 74 68 2c undir,item_path,
4e90: 72 75 6e 5f 64 75 72 61 74 69 6f 6e 2c 66 69 6e run_duration,fin
4ea0: 61 6c 5f 6c 6f 67 66 2c 63 6f 6d 6d 65 6e 74 20 al_logf,comment
4eb0: 22 0a 09 09 09 20 22 20 46 52 4f 4d 20 74 65 73 ".... " FROM tes
4ec0: 74 73 20 57 48 45 52 45 20 72 75 6e 5f 69 64 3d ts WHERE run_id=
4ed0: 3f 20 41 4e 44 20 22 0a 09 09 09 20 3b 3b 20 74 ? AND ".... ;; t
4ee0: 65 73 74 6e 61 6d 65 20 6c 69 6b 65 20 3f 20 41 estname like ? A
4ef0: 4e 44 20 69 74 65 6d 5f 70 61 74 68 20 4c 49 4b ND item_path LIK
4f00: 45 20 3f 20 22 20 0a 09 09 09 20 28 64 62 3a 70 E ? " .... (db:p
4f10: 61 74 74 2d 3e 6c 69 6b 65 20 22 74 65 73 74 6e att->like "testn
4f20: 61 6d 65 22 20 74 65 73 74 70 61 74 74 29 20 22 ame" testpatt) "
4f30: 20 41 4e 44 20 22 0a 09 09 09 20 28 64 62 3a 70 AND ".... (db:p
4f40: 61 74 74 2d 3e 6c 69 6b 65 20 22 69 74 65 6d 5f att->like "item_
4f50: 70 61 74 68 22 20 69 74 65 6d 70 61 74 74 29 0a path" itempatt).
4f60: 09 09 09 20 73 74 61 74 65 2d 73 74 61 74 75 73 ... state-status
4f70: 2d 71 72 79 0a 09 09 09 20 28 63 61 73 65 20 73 -qry.... (case s
4f80: 6f 72 74 2d 62 79 0a 09 09 09 20 20 20 28 28 72 ort-by.... ((r
4f90: 75 6e 64 69 72 29 20 20 20 20 20 22 20 4f 52 44 undir) " ORD
4fa0: 45 52 20 42 59 20 6c 65 6e 67 74 68 28 72 75 6e ER BY length(run
4fb0: 64 69 72 29 20 44 45 53 43 3b 22 29 0a 09 09 09 dir) DESC;")....
4fc0: 20 20 20 28 28 65 76 65 6e 74 5f 74 69 6d 65 29 ((event_time)
4fd0: 20 22 20 4f 52 44 45 52 20 42 59 20 65 76 65 6e " ORDER BY even
4fe0: 74 5f 74 69 6d 65 20 41 53 43 3b 22 29 0a 09 09 t_time ASC;")...
4ff0: 09 20 20 20 28 65 6c 73 65 20 20 20 20 20 20 20 . (else
5000: 20 20 22 3b 22 29 29 0a 09 09 09 20 29 29 29 0a ";")).... ))).
5010: 20 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 (debug:print
5020: 20 38 20 22 49 4e 46 4f 3a 20 64 62 3a 67 65 74 8 "INFO: db:get
5030: 2d 74 65 73 74 73 2d 66 6f 72 2d 72 75 6e 20 71 -tests-for-run q
5040: 72 79 3d 22 20 71 72 79 29 0a 20 20 20 20 28 73 ry=" qry). (s
5050: 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d qlite3:for-each-
5060: 72 6f 77 20 0a 20 20 20 20 20 28 6c 61 6d 62 64 row . (lambd
5070: 61 20 28 61 20 2e 20 62 29 20 3b 3b 20 69 64 20 a (a . b) ;; id
5080: 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 run-id testname
5090: 73 74 61 74 65 20 73 74 61 74 75 73 20 65 76 65 state status eve
50a0: 6e 74 2d 74 69 6d 65 20 68 6f 73 74 20 63 70 75 nt-time host cpu
50b0: 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20 75 6e load diskfree un
50c0: 61 6d 65 20 72 75 6e 64 69 72 20 69 74 65 6d 2d ame rundir item-
50d0: 70 61 74 68 20 72 75 6e 2d 64 75 72 61 74 69 6f path run-duratio
50e0: 6e 20 66 69 6e 61 6c 2d 6c 6f 67 66 20 63 6f 6d n final-logf com
50f0: 6d 65 6e 74 29 0a 20 20 20 20 20 20 20 28 73 65 ment). (se
5100: 74 21 20 72 65 73 20 28 63 6f 6e 73 20 28 61 70 t! res (cons (ap
5110: 70 6c 79 20 76 65 63 74 6f 72 20 61 20 62 29 20 ply vector a b)
5120: 72 65 73 29 29 29 20 3b 3b 20 69 64 20 72 75 6e res))) ;; id run
5130: 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 73 74 61 -id testname sta
5140: 74 65 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d te status event-
5150: 74 69 6d 65 20 68 6f 73 74 20 63 70 75 6c 6f 61 time host cpuloa
5160: 64 20 64 69 73 6b 66 72 65 65 20 75 6e 61 6d 65 d diskfree uname
5170: 20 72 75 6e 64 69 72 20 69 74 65 6d 2d 70 61 74 rundir item-pat
5180: 68 20 72 75 6e 2d 64 75 72 61 74 69 6f 6e 20 66 h run-duration f
5190: 69 6e 61 6c 2d 6c 6f 67 66 20 63 6f 6d 6d 65 6e inal-logf commen
51a0: 74 29 20 72 65 73 29 29 29 0a 20 20 20 20 20 64 t) res))). d
51b0: 62 20 0a 20 20 20 20 20 71 72 79 0a 20 20 20 20 b . qry.
51c0: 20 72 75 6e 2d 69 64 0a 20 20 20 20 20 3b 3b 20 run-id. ;;
51d0: 28 69 66 20 74 65 73 74 70 61 74 74 20 74 65 73 (if testpatt tes
51e0: 74 70 61 74 74 20 22 25 22 29 0a 20 20 20 20 20 tpatt "%").
51f0: 3b 3b 20 28 69 66 20 69 74 65 6d 70 61 74 74 20 ;; (if itempatt
5200: 69 74 65 6d 70 61 74 74 20 22 25 22 29 29 0a 20 itempatt "%")).
5210: 20 20 20 20 29 0a 20 20 20 20 72 65 73 29 29 0a ). res)).
5220: 0a 3b 3b 20 74 68 69 73 20 6f 6e 65 20 69 73 20 .;; this one is
5230: 61 20 62 69 74 20 62 72 6f 6b 65 6e 20 42 55 47 a bit broken BUG
5240: 20 46 49 58 4d 45 0a 28 64 65 66 69 6e 65 20 28 FIXME.(define (
5250: 64 62 3a 64 65 6c 65 74 65 2d 74 65 73 74 2d 73 db:delete-test-s
5260: 74 65 70 2d 72 65 63 6f 72 64 73 20 64 62 20 72 tep-records db r
5270: 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 un-id test-name
5280: 69 74 65 6d 64 61 74 29 0a 20 20 3b 3b 20 42 72 itemdat). ;; Br
5290: 65 61 6b 69 6e 67 20 69 74 20 69 6e 74 6f 20 74 eaking it into t
52a0: 77 6f 20 71 75 65 72 69 65 73 20 66 6f 72 20 62 wo queries for b
52b0: 65 74 74 65 72 20 66 69 6c 65 20 61 63 63 65 73 etter file acces
52c0: 73 20 69 6e 74 65 72 6c 65 61 76 69 6e 67 0a 20 s interleaving.
52d0: 20 28 6c 65 74 20 28 28 69 64 73 20 27 28 29 29 (let ((ids '())
52e0: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 ). (sqlite3:f
52f0: 6f 72 2d 65 61 63 68 2d 72 6f 77 20 28 6c 61 6d or-each-row (lam
5300: 62 64 61 20 28 69 64 29 0a 09 09 09 20 20 20 20 bda (id)....
5310: 28 73 65 74 21 20 69 64 73 20 28 63 6f 6e 73 20 (set! ids (cons
5320: 69 64 20 69 64 73 29 29 29 0a 09 09 09 20 20 64 id ids))).... d
5330: 62 0a 09 09 09 20 20 22 53 45 4c 45 43 54 20 69 b.... "SELECT i
5340: 64 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 d FROM tests WHE
5350: 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 RE run_id=? AND
5360: 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 testname=? AND i
5370: 74 65 6d 5f 70 61 74 68 3d 3f 3b 22 0a 09 09 09 tem_path=?;"....
5380: 20 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 run-id test-na
5390: 6d 65 20 28 69 74 65 6d 2d 6c 69 73 74 2d 3e 70 me (item-list->p
53a0: 61 74 68 20 69 74 65 6d 64 61 74 29 29 0a 20 20 ath itemdat)).
53b0: 20 20 28 66 6f 72 2d 65 61 63 68 20 28 6c 61 6d (for-each (lam
53c0: 62 64 61 20 28 69 64 29 0a 09 09 28 73 71 6c 69 bda (id)...(sqli
53d0: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 te3:execute db "
53e0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 65 73 74 DELETE FROM test
53f0: 5f 73 74 65 70 73 20 57 48 45 52 45 20 74 65 73 _steps WHERE tes
5400: 74 5f 69 64 3d 3f 3b 22 20 69 64 29 0a 09 09 28 t_id=?;" id)...(
5410: 74 68 72 65 61 64 2d 73 6c 65 65 70 21 20 30 2e thread-sleep! 0.
5420: 31 29 20 3b 3b 20 67 69 76 65 20 6f 74 68 65 72 1) ;; give other
5430: 73 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 s access to the
5440: 64 62 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 db.
5450: 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 (sqlite3:exec
5460: 75 74 65 20 64 62 20 22 44 45 4c 45 54 45 20 46 ute db "DELETE F
5470: 52 4f 4d 20 74 65 73 74 5f 64 61 74 61 20 57 48 ROM test_data WH
5480: 45 52 45 20 74 65 73 74 5f 69 64 3d 3f 3b 22 20 ERE test_id=?;"
5490: 69 64 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 id).
54a0: 20 20 20 20 28 74 68 72 65 61 64 2d 73 6c 65 65 (thread-slee
54b0: 70 21 20 30 2e 31 29 29 20 3b 3b 20 67 69 76 65 p! 0.1)) ;; give
54c0: 20 6f 74 68 65 72 73 20 61 63 63 65 73 73 20 74 others access t
54d0: 6f 20 74 68 65 20 64 62 0a 09 20 20 20 20 20 20 o the db..
54e0: 69 64 73 29 29 29 0a 3b 3b 22 44 45 4c 45 54 45 ids))).;;"DELETE
54f0: 20 46 52 4f 4d 20 74 65 73 74 5f 73 74 65 70 73 FROM test_steps
5500: 20 57 48 45 52 45 20 74 65 73 74 5f 69 64 20 69 WHERE test_id i
5510: 6e 20 28 53 45 4c 45 43 54 20 69 64 20 46 52 4f n (SELECT id FRO
5520: 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 72 75 M tests WHERE ru
5530: 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e n_id=? AND testn
5540: 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 ame=? AND item_p
5550: 61 74 68 3d 3f 29 3b 22 20 0a 09 09 20 20 20 0a ath=?);" ... .
5560: 3b 3b 20 0a 28 64 65 66 69 6e 65 20 28 64 62 3a ;; .(define (db:
5570: 64 65 6c 65 74 65 2d 74 65 73 74 2d 72 65 63 6f delete-test-reco
5580: 72 64 73 20 64 62 20 74 65 73 74 2d 69 64 29 0a rds db test-id).
5590: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 (sqlite3:execu
55a0: 74 65 20 64 62 20 22 44 45 4c 45 54 45 20 46 52 te db "DELETE FR
55b0: 4f 4d 20 74 65 73 74 5f 73 74 65 70 73 20 57 48 OM test_steps WH
55c0: 45 52 45 20 74 65 73 74 5f 69 64 3d 3f 3b 22 20 ERE test_id=?;"
55d0: 74 65 73 74 2d 69 64 29 0a 20 20 28 73 71 6c 69 test-id). (sqli
55e0: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 te3:execute db "
55f0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 65 73 74 DELETE FROM test
5600: 5f 64 61 74 61 20 20 57 48 45 52 45 20 74 65 73 _data WHERE tes
5610: 74 5f 69 64 3d 3f 3b 22 20 74 65 73 74 2d 69 64 t_id=?;" test-id
5620: 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 ). (sqlite3:exe
5630: 63 75 74 65 20 64 62 20 22 44 45 4c 45 54 45 20 cute db "DELETE
5640: 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 FROM tests WHERE
5650: 20 69 64 3d 3f 3b 22 20 74 65 73 74 2d 69 64 29 id=?;" test-id)
5660: 29 0a 0a 3b 3b 20 73 65 74 20 74 65 73 74 73 20 )..;; set tests
5670: 77 69 74 68 20 73 74 61 74 65 20 63 75 72 72 73 with state currs
5680: 74 61 74 65 20 61 6e 64 20 73 74 61 74 75 73 20 tate and status
5690: 63 75 72 72 73 74 61 74 75 73 20 74 6f 20 6e 65 currstatus to ne
56a0: 77 73 74 61 74 65 20 61 6e 64 20 6e 65 77 73 74 wstate and newst
56b0: 61 74 75 73 0a 3b 3b 20 75 73 65 20 63 75 72 72 atus.;; use curr
56c0: 73 74 61 74 65 20 3d 20 23 66 20 61 6e 64 20 6f state = #f and o
56d0: 72 20 63 75 72 72 73 74 61 74 75 73 20 3d 20 23 r currstatus = #
56e0: 66 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 61 6e f to apply to an
56f0: 79 20 73 74 61 74 65 20 6f 72 20 73 74 61 74 75 y state or statu
5700: 73 20 72 65 73 70 65 63 74 69 76 65 6c 79 0a 3b s respectively.;
5710: 3b 20 57 41 52 4e 49 4e 47 3a 20 53 51 4c 20 69 ; WARNING: SQL i
5720: 6e 6a 65 63 74 69 6f 6e 20 72 69 73 6b 0a 28 64 njection risk.(d
5730: 65 66 69 6e 65 20 28 64 62 3a 73 65 74 2d 74 65 efine (db:set-te
5740: 73 74 73 2d 73 74 61 74 65 2d 73 74 61 74 75 73 sts-state-status
5750: 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 6e db run-id testn
5760: 61 6d 65 73 20 63 75 72 72 73 74 61 74 65 20 63 ames currstate c
5770: 75 72 72 73 74 61 74 75 73 20 6e 65 77 73 74 61 urrstatus newsta
5780: 74 65 20 6e 65 77 73 74 61 74 75 73 29 0a 20 20 te newstatus).
5790: 28 66 6f 72 2d 65 61 63 68 20 28 6c 61 6d 62 64 (for-each (lambd
57a0: 61 20 28 74 65 73 74 6e 61 6d 65 29 0a 09 20 20 a (testname)..
57b0: 20 20 20 20 28 6c 65 74 20 28 28 71 72 79 20 28 (let ((qry (
57c0: 63 6f 6e 63 20 22 55 50 44 41 54 45 20 74 65 73 conc "UPDATE tes
57d0: 74 73 20 53 45 54 20 73 74 61 74 65 3d 3f 2c 73 ts SET state=?,s
57e0: 74 61 74 75 73 3d 3f 20 57 48 45 52 45 20 22 0a tatus=? WHERE ".
57f0: 09 09 09 20 20 20 20 20 20 20 28 69 66 20 63 75 ... (if cu
5800: 72 72 73 74 61 74 65 20 20 28 63 6f 6e 63 20 22 rrstate (conc "
5810: 73 74 61 74 65 3d 27 22 20 63 75 72 72 73 74 61 state='" currsta
5820: 74 65 20 22 27 20 41 4e 44 20 22 29 20 22 22 29 te "' AND ") "")
5830: 0a 09 09 09 20 20 20 20 20 20 20 28 69 66 20 63 .... (if c
5840: 75 72 72 73 74 61 74 75 73 20 28 63 6f 6e 63 20 urrstatus (conc
5850: 22 73 74 61 74 75 73 3d 27 22 20 63 75 72 72 73 "status='" currs
5860: 74 61 74 75 73 20 22 27 20 41 4e 44 20 22 29 20 tatus "' AND ")
5870: 22 22 29 0a 09 09 09 20 20 20 20 20 20 20 22 20 "").... "
5880: 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 run_id=? AND tes
5890: 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 4e 4f 54 20 tname=? AND NOT
58a0: 28 69 74 65 6d 5f 70 61 74 68 3d 27 27 20 41 4e (item_path='' AN
58b0: 44 20 74 65 73 74 6e 61 6d 65 20 69 6e 20 28 53 D testname in (S
58c0: 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 74 ELECT DISTINCT t
58d0: 65 73 74 6e 61 6d 65 20 46 52 4f 4d 20 74 65 73 estname FROM tes
58e0: 74 73 20 57 48 45 52 45 20 74 65 73 74 6e 61 6d ts WHERE testnam
58f0: 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 e=? AND item_pat
5900: 68 20 21 3d 20 27 27 29 29 3b 22 29 29 29 0a 09 h != ''));")))..
5910: 09 3b 3b 28 64 65 62 75 67 3a 70 72 69 6e 74 20 .;;(debug:print
5920: 30 20 22 51 52 59 3a 20 22 20 71 72 79 29 0a 09 0 "QRY: " qry)..
5930: 09 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 .(sqlite3:execut
5940: 65 20 64 62 20 71 72 79 20 72 75 6e 2d 69 64 20 e db qry run-id
5950: 6e 65 77 73 74 61 74 65 20 6e 65 77 73 74 61 74 newstate newstat
5960: 75 73 20 74 65 73 74 6e 61 6d 65 20 74 65 73 74 us testname test
5970: 6e 61 6d 65 29 29 29 0a 09 20 20 20 20 74 65 73 name))).. tes
5980: 74 6e 61 6d 65 73 29 29 0a 0a 28 64 65 66 69 6e tnames))..(defin
5990: 65 20 28 64 62 3a 64 65 6c 65 74 65 2d 74 65 73 e (db:delete-tes
59a0: 74 73 2d 69 6e 2d 73 74 61 74 65 20 64 62 20 72 ts-in-state db r
59b0: 75 6e 2d 69 64 20 73 74 61 74 65 29 0a 20 20 28 un-id state). (
59c0: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 sqlite3:execute
59d0: 64 62 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 db "DELETE FROM
59e0: 74 65 73 74 73 20 57 48 45 52 45 20 73 74 61 74 tests WHERE stat
59f0: 65 3d 3f 20 41 4e 44 20 72 75 6e 5f 69 64 3d 3f e=? AND run_id=?
5a00: 3b 22 20 73 74 61 74 65 20 72 75 6e 2d 69 64 29 ;" state run-id)
5a10: 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 74 )..(define (db:t
5a20: 65 73 74 2d 73 65 74 2d 73 74 61 74 65 2d 73 74 est-set-state-st
5a30: 61 74 75 73 2d 62 79 2d 69 64 20 64 62 20 74 65 atus-by-id db te
5a40: 73 74 2d 69 64 20 6e 65 77 73 74 61 74 65 20 6e st-id newstate n
5a50: 65 77 73 74 61 74 75 73 20 6e 65 77 63 6f 6d 6d ewstatus newcomm
5a60: 65 6e 74 29 0a 20 20 28 69 66 20 6e 65 77 73 74 ent). (if newst
5a70: 61 74 65 20 20 20 28 73 71 6c 69 74 65 33 3a 65 ate (sqlite3:e
5a80: 78 65 63 75 74 65 20 64 62 20 22 55 50 44 41 54 xecute db "UPDAT
5a90: 45 20 74 65 73 74 73 20 53 45 54 20 73 74 61 74 E tests SET stat
5aa0: 65 3d 3f 20 20 20 57 48 45 52 45 20 69 64 3d 3f e=? WHERE id=?
5ab0: 3b 22 20 6e 65 77 73 74 61 74 65 20 20 20 74 65 ;" newstate te
5ac0: 73 74 2d 69 64 29 29 0a 20 20 28 69 66 20 6e 65 st-id)). (if ne
5ad0: 77 73 74 61 74 75 73 20 20 28 73 71 6c 69 74 65 wstatus (sqlite
5ae0: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 55 50 3:execute db "UP
5af0: 44 41 54 45 20 74 65 73 74 73 20 53 45 54 20 73 DATE tests SET s
5b00: 74 61 74 75 73 3d 3f 20 20 57 48 45 52 45 20 69 tatus=? WHERE i
5b10: 64 3d 3f 3b 22 20 6e 65 77 73 74 61 74 75 73 20 d=?;" newstatus
5b20: 20 74 65 73 74 2d 69 64 29 29 0a 20 20 28 69 66 test-id)). (if
5b30: 20 6e 65 77 63 6f 6d 6d 65 6e 74 20 28 73 71 6c newcomment (sql
5b40: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 ite3:execute db
5b50: 22 55 50 44 41 54 45 20 74 65 73 74 73 20 53 45 "UPDATE tests SE
5b60: 54 20 63 6f 6d 6d 65 6e 74 3d 3f 20 57 48 45 52 T comment=? WHER
5b70: 45 20 69 64 3d 3f 3b 22 20 6e 65 77 63 6f 6d 6d E id=?;" newcomm
5b80: 65 6e 74 20 74 65 73 74 2d 69 64 29 29 29 0a 0a ent test-id)))..
5b90: 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74 (define (db:test
5ba0: 2d 73 65 74 2d 73 74 61 74 65 2d 73 74 61 74 75 -set-state-statu
5bb0: 73 2d 62 79 2d 72 75 6e 2d 69 64 2d 74 65 73 74 s-by-run-id-test
5bc0: 6e 61 6d 65 20 64 62 20 72 75 6e 2d 69 64 20 74 name db run-id t
5bd0: 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61 est-name item-pa
5be0: 74 68 20 73 74 61 74 75 73 20 73 74 61 74 65 29 th status state)
5bf0: 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 . (sqlite3:exec
5c00: 75 74 65 20 64 62 20 22 55 50 44 41 54 45 20 74 ute db "UPDATE t
5c10: 65 73 74 73 20 53 45 54 20 73 74 61 74 65 3d 3f ests SET state=?
5c20: 2c 73 74 61 74 75 73 3d 3f 2c 65 76 65 6e 74 5f ,status=?,event_
5c30: 74 69 6d 65 3d 73 74 72 66 74 69 6d 65 28 27 25 time=strftime('%
5c40: 73 27 2c 27 6e 6f 77 27 29 20 57 48 45 52 45 20 s','now') WHERE
5c50: 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 run_id=? AND tes
5c60: 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d tname=? AND item
5c70: 5f 70 61 74 68 3d 3f 3b 22 20 0a 09 09 20 20 20 _path=?;" ...
5c80: 73 74 61 74 65 20 73 74 61 74 75 73 20 72 75 6e state status run
5c90: 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 -id test-name it
5ca0: 65 6d 2d 70 61 74 68 29 29 0a 0a 28 64 65 66 69 em-path))..(defi
5cb0: 6e 65 20 28 64 62 3a 67 65 74 2d 63 6f 75 6e 74 ne (db:get-count
5cc0: 2d 74 65 73 74 73 2d 72 75 6e 6e 69 6e 67 20 64 -tests-running d
5cd0: 62 29 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20 b). (let ((res
5ce0: 30 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 0)). (sqlite3
5cf0: 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 :for-each-row.
5d00: 20 20 20 28 6c 61 6d 62 64 61 20 28 63 6f 75 6e (lambda (coun
5d10: 74 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 t). (set!
5d20: 72 65 73 20 63 6f 75 6e 74 29 29 0a 20 20 20 20 res count)).
5d30: 20 64 62 0a 20 20 20 20 20 22 53 45 4c 45 43 54 db. "SELECT
5d40: 20 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 count(id) FROM
5d50: 74 65 73 74 73 20 57 48 45 52 45 20 73 74 61 74 tests WHERE stat
5d60: 65 20 3d 20 27 52 55 4e 4e 49 4e 47 27 20 4f 52 e = 'RUNNING' OR
5d70: 20 73 74 61 74 65 20 3d 20 27 4c 41 55 4e 43 48 state = 'LAUNCH
5d80: 45 44 27 20 4f 52 20 73 74 61 74 65 20 3d 20 27 ED' OR state = '
5d90: 52 45 4d 4f 54 45 48 4f 53 54 53 54 41 52 54 27 REMOTEHOSTSTART'
5da0: 3b 22 29 0a 20 20 20 20 72 65 73 29 29 0a 0a 28 ;"). res))..(
5db0: 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 63 define (db:get-c
5dc0: 6f 75 6e 74 2d 74 65 73 74 73 2d 72 75 6e 6e 69 ount-tests-runni
5dd0: 6e 67 2d 69 6e 2d 6a 6f 62 67 72 6f 75 70 20 64 ng-in-jobgroup d
5de0: 62 20 6a 6f 62 67 72 6f 75 70 29 0a 20 20 28 69 b jobgroup). (i
5df0: 66 20 28 6e 6f 74 20 6a 6f 62 67 72 6f 75 70 29 f (not jobgroup)
5e00: 0a 20 20 20 20 20 20 30 20 3b 3b 20 0a 20 20 20 . 0 ;; .
5e10: 20 20 20 28 6c 65 74 20 28 28 72 65 73 20 30 29 (let ((res 0)
5e20: 29 0a 09 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d )..(sqlite3:for-
5e30: 65 61 63 68 2d 72 6f 77 0a 09 20 28 6c 61 6d 62 each-row.. (lamb
5e40: 64 61 20 28 63 6f 75 6e 74 29 0a 09 20 20 20 28 da (count).. (
5e50: 73 65 74 21 20 72 65 73 20 63 6f 75 6e 74 29 29 set! res count))
5e60: 0a 09 20 64 62 0a 09 20 22 53 45 4c 45 43 54 20 .. db.. "SELECT
5e70: 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 74 count(id) FROM t
5e80: 65 73 74 73 20 57 48 45 52 45 20 73 74 61 74 65 ests WHERE state
5e90: 20 3d 20 27 52 55 4e 4e 49 4e 47 27 20 4f 52 20 = 'RUNNING' OR
5ea0: 73 74 61 74 65 20 3d 20 27 4c 41 55 4e 43 48 45 state = 'LAUNCHE
5eb0: 44 27 20 4f 52 20 73 74 61 74 65 20 3d 20 27 52 D' OR state = 'R
5ec0: 45 4d 4f 54 45 48 4f 53 54 53 54 41 52 54 27 0a EMOTEHOSTSTART'.
5ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 AND
5ee0: 20 74 65 73 74 6e 61 6d 65 20 69 6e 20 28 53 45 testname in (SE
5ef0: 4c 45 43 54 20 74 65 73 74 6e 61 6d 65 20 46 52 LECT testname FR
5f00: 4f 4d 20 74 65 73 74 5f 6d 65 74 61 20 57 48 45 OM test_meta WHE
5f10: 52 45 20 6a 6f 62 67 72 6f 75 70 3d 3f 3b 22 0a RE jobgroup=?;".
5f20: 09 20 6a 6f 62 67 72 6f 75 70 29 0a 09 72 65 73 . jobgroup)..res
5f30: 29 29 29 0a 0a 3b 3b 20 64 6f 6e 65 20 77 69 74 )))..;; done wit
5f40: 68 20 72 75 6e 20 77 68 65 6e 3a 0a 3b 3b 20 20 h run when:.;;
5f50: 20 30 20 74 65 73 74 73 20 69 6e 20 4c 41 55 4e 0 tests in LAUN
5f60: 43 48 45 44 2c 20 4e 4f 54 5f 53 54 41 52 54 45 CHED, NOT_STARTE
5f70: 44 2c 20 52 45 4d 4f 54 45 48 4f 53 54 53 54 41 D, REMOTEHOSTSTA
5f80: 52 54 2c 20 52 55 4e 4e 49 4e 47 0a 28 64 65 66 RT, RUNNING.(def
5f90: 69 6e 65 20 28 64 62 3a 65 73 74 69 6d 61 74 65 ine (db:estimate
5fa0: 64 2d 74 65 73 74 73 2d 72 65 6d 61 69 6e 69 6e d-tests-remainin
5fb0: 67 20 64 62 20 72 75 6e 2d 69 64 29 0a 20 20 28 g db run-id). (
5fc0: 6c 65 74 20 28 28 72 65 73 20 30 29 29 0a 20 20 let ((res 0)).
5fd0: 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 (sqlite3:for-e
5fe0: 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 ach-row. (la
5ff0: 6d 62 64 61 20 28 63 6f 75 6e 74 29 0a 20 20 20 mbda (count).
6000: 20 20 20 20 28 73 65 74 21 20 72 65 73 20 63 6f (set! res co
6010: 75 6e 74 29 29 0a 20 20 20 20 20 64 62 20 3b 3b unt)). db ;;
6020: 20 4e 42 2f 2f 20 4b 49 4c 4c 52 45 51 20 6d 65 NB// KILLREQ me
6030: 61 6e 73 20 74 68 65 20 6a 6f 62 73 20 69 73 20 ans the jobs is
6040: 73 74 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 72 still probably r
6050: 75 6e 6e 69 6e 67 0a 20 20 20 20 20 22 53 45 4c unning. "SEL
6060: 45 43 54 20 63 6f 75 6e 74 28 69 64 29 20 46 52 ECT count(id) FR
6070: 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 73 OM tests WHERE s
6080: 74 61 74 65 20 69 6e 20 28 27 4c 41 55 4e 43 48 tate in ('LAUNCH
6090: 45 44 27 2c 27 4e 4f 54 5f 53 54 41 52 54 45 44 ED','NOT_STARTED
60a0: 27 2c 27 52 45 4d 4f 54 45 48 4f 53 54 53 54 41 ','REMOTEHOSTSTA
60b0: 52 54 27 2c 27 52 55 4e 4e 49 4e 47 27 2c 27 4b RT','RUNNING','K
60c0: 49 4c 4c 52 45 51 27 29 20 41 4e 44 20 72 75 6e ILLREQ') AND run
60d0: 5f 69 64 3d 3f 3b 22 20 72 75 6e 2d 69 64 29 0a _id=?;" run-id).
60e0: 20 20 20 20 72 65 73 29 29 0a 0a 3b 3b 20 4e 42 res))..;; NB
60f0: 2f 2f 20 53 79 6e 63 20 74 68 69 73 20 77 69 74 // Sync this wit
6100: 68 20 72 75 6e 73 3a 67 65 74 2d 74 65 73 74 2d h runs:get-test-
6110: 69 6e 66 6f 0a 28 64 65 66 69 6e 65 20 28 64 62 info.(define (db
6120: 3a 67 65 74 2d 74 65 73 74 2d 69 6e 66 6f 20 64 :get-test-info d
6130: 62 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d b run-id testnam
6140: 65 20 69 74 65 6d 2d 70 61 74 68 29 0a 20 20 28 e item-path). (
6150: 6c 65 74 20 28 28 72 65 73 20 23 66 29 29 0a 20 let ((res #f)).
6160: 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d (sqlite3:for-
6170: 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c each-row. (l
6180: 61 6d 62 64 61 20 28 69 64 20 72 75 6e 2d 69 64 ambda (id run-id
6190: 20 74 65 73 74 6e 61 6d 65 20 73 74 61 74 65 20 testname state
61a0: 73 74 61 74 75 73 20 65 76 65 6e 74 2d 74 69 6d status event-tim
61b0: 65 20 68 6f 73 74 20 63 70 75 6c 6f 61 64 20 64 e host cpuload d
61c0: 69 73 6b 66 72 65 65 20 75 6e 61 6d 65 20 72 75 iskfree uname ru
61d0: 6e 64 69 72 20 69 74 65 6d 2d 70 61 74 68 20 72 ndir item-path r
61e0: 75 6e 5f 64 75 72 61 74 69 6f 6e 20 66 69 6e 61 un_duration fina
61f0: 6c 5f 6c 6f 67 66 20 63 6f 6d 6d 65 6e 74 20 29 l_logf comment )
6200: 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72 65 . (set! re
6210: 73 20 28 76 65 63 74 6f 72 20 69 64 20 72 75 6e s (vector id run
6220: 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 73 74 61 -id testname sta
6230: 74 65 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d te status event-
6240: 74 69 6d 65 20 68 6f 73 74 20 63 70 75 6c 6f 61 time host cpuloa
6250: 64 20 64 69 73 6b 66 72 65 65 20 75 6e 61 6d 65 d diskfree uname
6260: 20 72 75 6e 64 69 72 20 69 74 65 6d 2d 70 61 74 rundir item-pat
6270: 68 20 72 75 6e 5f 64 75 72 61 74 69 6f 6e 20 66 h run_duration f
6280: 69 6e 61 6c 5f 6c 6f 67 66 20 63 6f 6d 6d 65 6e inal_logf commen
6290: 74 20 29 29 29 0a 20 20 20 20 20 64 62 20 0a 20 t ))). db .
62a0: 20 20 20 20 22 53 45 4c 45 43 54 20 69 64 2c 72 "SELECT id,r
62b0: 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d 65 2c 73 un_id,testname,s
62c0: 74 61 74 65 2c 73 74 61 74 75 73 2c 65 76 65 6e tate,status,even
62d0: 74 5f 74 69 6d 65 2c 68 6f 73 74 2c 63 70 75 6c t_time,host,cpul
62e0: 6f 61 64 2c 64 69 73 6b 66 72 65 65 2c 75 6e 61 oad,diskfree,una
62f0: 6d 65 2c 72 75 6e 64 69 72 2c 69 74 65 6d 5f 70 me,rundir,item_p
6300: 61 74 68 2c 72 75 6e 5f 64 75 72 61 74 69 6f 6e ath,run_duration
6310: 2c 66 69 6e 61 6c 5f 6c 6f 67 66 2c 63 6f 6d 6d ,final_logf,comm
6320: 65 6e 74 20 46 52 4f 4d 20 74 65 73 74 73 20 57 ent FROM tests W
6330: 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e HERE run_id=? AN
6340: 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 D testname=? AND
6350: 20 69 74 65 6d 5f 70 61 74 68 3d 3f 3b 22 0a 20 item_path=?;".
6360: 20 20 20 20 72 75 6e 2d 69 64 20 74 65 73 74 6e run-id testn
6370: 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 0a 20 ame item-path).
6380: 20 20 20 72 65 73 29 29 0a 0a 3b 3b 20 47 65 74 res))..;; Get
6390: 20 74 65 73 74 20 64 61 74 61 20 75 73 69 6e 67 test data using
63a0: 20 74 65 73 74 5f 69 64 0a 28 64 65 66 69 6e 65 test_id.(define
63b0: 20 28 64 62 3a 67 65 74 2d 74 65 73 74 2d 64 61 (db:get-test-da
63c0: 74 61 2d 62 79 2d 69 64 20 64 62 20 74 65 73 74 ta-by-id db test
63d0: 2d 69 64 29 0a 20 20 28 6c 65 74 20 28 28 72 65 -id). (let ((re
63e0: 73 20 23 66 29 29 0a 20 20 20 20 28 73 71 6c 69 s #f)). (sqli
63f0: 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 te3:for-each-row
6400: 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 69 . (lambda (i
6410: 64 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d d run-id testnam
6420: 65 20 73 74 61 74 65 20 73 74 61 74 75 73 20 65 e state status e
6430: 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73 74 20 63 vent-time host c
6440: 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20 puload diskfree
6450: 75 6e 61 6d 65 20 72 75 6e 64 69 72 20 69 74 65 uname rundir ite
6460: 6d 2d 70 61 74 68 20 72 75 6e 5f 64 75 72 61 74 m-path run_durat
6470: 69 6f 6e 20 66 69 6e 61 6c 5f 6c 6f 67 66 20 63 ion final_logf c
6480: 6f 6d 6d 65 6e 74 29 0a 20 20 20 20 20 20 20 28 omment). (
6490: 73 65 74 21 20 72 65 73 20 28 76 65 63 74 6f 72 set! res (vector
64a0: 20 69 64 20 72 75 6e 2d 69 64 20 74 65 73 74 6e id run-id testn
64b0: 61 6d 65 20 73 74 61 74 65 20 73 74 61 74 75 73 ame state status
64c0: 20 65 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73 74 event-time host
64d0: 20 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 cpuload diskfre
64e0: 65 20 75 6e 61 6d 65 20 72 75 6e 64 69 72 20 69 e uname rundir i
64f0: 74 65 6d 2d 70 61 74 68 20 72 75 6e 5f 64 75 72 tem-path run_dur
6500: 61 74 69 6f 6e 20 66 69 6e 61 6c 5f 6c 6f 67 66 ation final_logf
6510: 20 63 6f 6d 6d 65 6e 74 29 29 29 0a 20 20 20 20 comment))).
6520: 20 64 62 20 0a 20 20 20 20 20 22 53 45 4c 45 43 db . "SELEC
6530: 54 20 69 64 2c 72 75 6e 5f 69 64 2c 74 65 73 74 T id,run_id,test
6540: 6e 61 6d 65 2c 73 74 61 74 65 2c 73 74 61 74 75 name,state,statu
6550: 73 2c 65 76 65 6e 74 5f 74 69 6d 65 2c 68 6f 73 s,event_time,hos
6560: 74 2c 63 70 75 6c 6f 61 64 2c 64 69 73 6b 66 72 t,cpuload,diskfr
6570: 65 65 2c 75 6e 61 6d 65 2c 72 75 6e 64 69 72 2c ee,uname,rundir,
6580: 69 74 65 6d 5f 70 61 74 68 2c 72 75 6e 5f 64 75 item_path,run_du
6590: 72 61 74 69 6f 6e 2c 66 69 6e 61 6c 5f 6c 6f 67 ration,final_log
65a0: 66 2c 63 6f 6d 6d 65 6e 74 20 46 52 4f 4d 20 74 f,comment FROM t
65b0: 65 73 74 73 20 57 48 45 52 45 20 69 64 3d 3f 3b ests WHERE id=?;
65c0: 22 0a 20 20 20 20 20 74 65 73 74 2d 69 64 29 0a ". test-id).
65d0: 20 20 20 20 72 65 73 29 29 0a 0a 0a 28 64 65 66 res))...(def
65e0: 69 6e 65 20 28 64 62 3a 74 65 73 74 2d 73 65 74 ine (db:test-set
65f0: 2d 63 6f 6d 6d 65 6e 74 20 64 62 20 74 65 73 74 -comment db test
6600: 2d 69 64 20 63 6f 6d 6d 65 6e 74 29 0a 20 20 28 -id comment). (
6610: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 sqlite3:execute
6620: 0a 20 20 20 64 62 20 0a 20 20 20 22 55 50 44 41 . db . "UPDA
6630: 54 45 20 74 65 73 74 73 20 53 45 54 20 63 6f 6d TE tests SET com
6640: 6d 65 6e 74 3d 3f 20 57 48 45 52 45 20 69 64 3d ment=? WHERE id=
6650: 3f 3b 22 0a 20 20 20 63 6f 6d 6d 65 6e 74 20 74 ?;". comment t
6660: 65 73 74 2d 69 64 29 29 0a 0a 3b 3b 0a 28 64 65 est-id))..;;.(de
6670: 66 69 6e 65 20 28 64 62 3a 74 65 73 74 2d 73 65 fine (db:test-se
6680: 74 2d 72 75 6e 64 69 72 21 20 64 62 20 72 75 6e t-rundir! db run
6690: 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 -id test-name it
66a0: 65 6d 2d 70 61 74 68 20 72 75 6e 64 69 72 29 0a em-path rundir).
66b0: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 (sqlite3:execu
66c0: 74 65 20 0a 20 20 20 64 62 20 0a 20 20 20 22 55 te . db . "U
66d0: 50 44 41 54 45 20 74 65 73 74 73 20 53 45 54 20 PDATE tests SET
66e0: 72 75 6e 64 69 72 3d 3f 20 57 48 45 52 45 20 72 rundir=? WHERE r
66f0: 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 un_id=? AND test
6700: 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f name=? AND item_
6710: 70 61 74 68 3d 3f 3b 22 0a 20 20 20 72 75 6e 64 path=?;". rund
6720: 69 72 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e ir run-id test-n
6730: 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 29 0a ame item-path)).
6740: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73 .(define (db:tes
6750: 74 2d 73 65 74 2d 6c 6f 67 21 20 64 62 20 74 65 t-set-log! db te
6760: 73 74 2d 69 64 20 6c 6f 67 66 29 0a 20 20 28 69 st-id logf). (i
6770: 66 20 28 73 74 72 69 6e 67 3f 20 6c 6f 67 66 29 f (string? logf)
6780: 0a 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a . (sqlite3:
6790: 65 78 65 63 75 74 65 20 64 62 20 22 55 50 44 41 execute db "UPDA
67a0: 54 45 20 74 65 73 74 73 20 53 45 54 20 66 69 6e TE tests SET fin
67b0: 61 6c 5f 6c 6f 67 66 3d 3f 20 57 48 45 52 45 20 al_logf=? WHERE
67c0: 69 64 3d 3f 3b 22 0a 09 09 20 20 20 6c 6f 67 66 id=?;"... logf
67d0: 20 74 65 73 74 2d 69 64 29 0a 20 20 20 20 20 20 test-id).
67e0: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 30 20 22 (debug:print 0 "
67f0: 45 52 52 4f 52 3a 20 64 62 3a 74 65 73 74 2d 73 ERROR: db:test-s
6800: 65 74 2d 6c 6f 67 21 20 63 61 6c 6c 65 64 20 77 et-log! called w
6810: 69 74 68 20 6e 6f 6e 2d 73 74 72 69 6e 67 20 6c ith non-string l
6820: 6f 67 20 66 69 6c 65 20 6e 61 6d 65 20 22 20 6c og file name " l
6830: 6f 67 66 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d ogf)))..;;======
6840: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
6850: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
6860: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
6870: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
6880: 0a 3b 3b 20 4d 69 73 63 2e 20 74 65 73 74 20 72 .;; Misc. test r
6890: 65 6c 61 74 65 64 20 71 75 65 72 69 65 73 0a 3b elated queries.;
68a0: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ;===============
68b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
68c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
68d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
68e0: 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65 66 69 6e 65 =======..(define
68f0: 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 70 61 (db:test-get-pa
6900: 74 68 73 2d 6d 61 74 63 68 69 6e 67 20 64 62 20 ths-matching db
6910: 6b 65 79 6e 61 6d 65 73 20 74 61 72 67 65 74 29 keynames target)
6920: 0a 20 20 28 6c 65 74 2a 20 28 28 72 65 73 20 27 . (let* ((res '
6930: 28 29 29 0a 09 20 28 69 74 65 6d 70 61 74 74 20 ()).. (itempatt
6940: 20 20 28 69 66 20 28 61 72 67 73 3a 67 65 74 2d (if (args:get-
6950: 61 72 67 20 22 2d 69 74 65 6d 70 61 74 74 22 29 arg "-itempatt")
6960: 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22 2d (args:get-arg "-
6970: 69 74 65 6d 70 61 74 74 22 29 20 22 25 22 29 29 itempatt") "%"))
6980: 0a 09 20 28 74 65 73 74 70 61 74 74 20 20 20 28 .. (testpatt (
6990: 69 66 20 28 61 72 67 73 3a 67 65 74 2d 61 72 67 if (args:get-arg
69a0: 20 22 2d 74 65 73 74 70 61 74 74 22 29 28 61 72 "-testpatt")(ar
69b0: 67 73 3a 67 65 74 2d 61 72 67 20 22 2d 74 65 73 gs:get-arg "-tes
69c0: 74 70 61 74 74 22 29 20 22 25 22 29 29 0a 09 20 tpatt") "%"))..
69d0: 28 73 74 61 74 65 70 61 74 74 20 20 28 69 66 20 (statepatt (if
69e0: 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22 3a (args:get-arg ":
69f0: 73 74 61 74 65 22 29 20 20 20 28 61 72 67 73 3a state") (args:
6a00: 67 65 74 2d 61 72 67 20 22 3a 73 74 61 74 65 22 get-arg ":state"
6a10: 29 20 20 20 20 22 25 22 29 29 0a 09 20 28 73 74 ) "%")).. (st
6a20: 61 74 75 73 70 61 74 74 20 28 69 66 20 28 61 72 atuspatt (if (ar
6a30: 67 73 3a 67 65 74 2d 61 72 67 20 22 3a 73 74 61 gs:get-arg ":sta
6a40: 74 75 73 22 29 20 20 28 61 72 67 73 3a 67 65 74 tus") (args:get
6a50: 2d 61 72 67 20 22 3a 73 74 61 74 75 73 22 29 20 -arg ":status")
6a60: 20 20 22 25 22 29 29 0a 09 20 28 72 75 6e 6e 61 "%")).. (runna
6a70: 6d 65 20 20 20 20 28 69 66 20 28 61 72 67 73 3a me (if (args:
6a80: 67 65 74 2d 61 72 67 20 22 3a 72 75 6e 6e 61 6d get-arg ":runnam
6a90: 65 22 29 20 28 61 72 67 73 3a 67 65 74 2d 61 72 e") (args:get-ar
6aa0: 67 20 22 3a 72 75 6e 6e 61 6d 65 22 29 20 20 22 g ":runname") "
6ab0: 25 22 29 29 0a 09 20 28 6b 65 79 73 74 72 20 28 %")).. (keystr (
6ac0: 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 string-intersper
6ad0: 73 65 20 0a 09 09 20 20 28 6d 61 70 20 28 6c 61 se ... (map (la
6ae0: 6d 62 64 61 20 28 6b 65 79 20 76 61 6c 29 0a 09 mbda (key val)..
6af0: 09 09 20 28 63 6f 6e 63 20 22 72 2e 22 20 6b 65 .. (conc "r." ke
6b00: 79 20 22 20 6c 69 6b 65 20 27 22 20 76 61 6c 20 y " like '" val
6b10: 22 27 22 29 29 0a 09 09 20 20 20 20 20 20 20 6b "'"))... k
6b20: 65 79 6e 61 6d 65 73 20 0a 09 09 20 20 20 20 20 eynames ...
6b30: 20 20 28 73 74 72 69 6e 67 2d 73 70 6c 69 74 20 (string-split
6b40: 74 61 72 67 65 74 20 22 2f 22 29 29 0a 09 09 20 target "/"))...
6b50: 20 22 20 41 4e 44 20 22 29 29 0a 09 20 28 71 72 " AND ")).. (qr
6b60: 79 73 74 72 20 28 63 6f 6e 63 20 22 53 45 4c 45 ystr (conc "SELE
6b70: 43 54 20 74 2e 72 75 6e 64 69 72 20 46 52 4f 4d CT t.rundir FROM
6b80: 20 74 65 73 74 73 20 41 53 20 74 20 49 4e 4e 45 tests AS t INNE
6b90: 52 20 4a 4f 49 4e 20 72 75 6e 73 20 41 53 20 72 R JOIN runs AS r
6ba0: 20 4f 4e 20 74 2e 72 75 6e 5f 69 64 3d 72 2e 69 ON t.run_id=r.i
6bb0: 64 20 57 48 45 52 45 20 22 0a 09 09 20 20 20 20 d WHERE "...
6bc0: 20 20 20 6b 65 79 73 74 72 20 22 20 41 4e 44 20 keystr " AND
6bd0: 72 2e 72 75 6e 6e 61 6d 65 20 4c 49 4b 45 20 27 r.runname LIKE '
6be0: 22 20 72 75 6e 6e 61 6d 65 20 22 27 20 41 4e 44 " runname "' AND
6bf0: 20 69 74 65 6d 5f 70 61 74 68 20 4c 49 4b 45 20 item_path LIKE
6c00: 27 22 20 69 74 65 6d 70 61 74 74 20 22 27 20 41 '" itempatt "' A
6c10: 4e 44 20 74 65 73 74 6e 61 6d 65 20 4c 49 4b 45 ND testname LIKE
6c20: 20 27 22 0a 09 09 20 20 20 20 20 20 20 74 65 73 '"... tes
6c30: 74 70 61 74 74 20 22 27 20 41 4e 44 20 74 2e 73 tpatt "' AND t.s
6c40: 74 61 74 65 20 4c 49 4b 45 20 27 22 20 73 74 61 tate LIKE '" sta
6c50: 74 65 70 61 74 74 20 22 27 20 41 4e 44 20 74 2e tepatt "' AND t.
6c60: 73 74 61 74 75 73 20 4c 49 4b 45 20 27 22 20 73 status LIKE '" s
6c70: 74 61 74 75 73 70 61 74 74 20 0a 09 09 20 20 20 tatuspatt ...
6c80: 20 20 20 20 22 27 4f 52 44 45 52 20 42 59 20 74 "'ORDER BY t
6c90: 2e 65 76 65 6e 74 5f 74 69 6d 65 20 41 53 43 3b .event_time ASC;
6ca0: 22 29 29 29 0a 20 20 20 20 28 64 65 62 75 67 3a "))). (debug:
6cb0: 70 72 69 6e 74 20 33 20 22 71 72 79 73 74 72 3a print 3 "qrystr:
6cc0: 20 22 20 71 72 79 73 74 72 29 0a 20 20 20 20 28 " qrystr). (
6cd0: 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 sqlite3:for-each
6ce0: 2d 72 6f 77 20 0a 20 20 20 20 20 28 6c 61 6d 62 -row . (lamb
6cf0: 64 61 20 28 70 29 0a 20 20 20 20 20 20 20 28 73 da (p). (s
6d00: 65 74 21 20 72 65 73 20 28 63 6f 6e 73 20 70 20 et! res (cons p
6d10: 72 65 73 29 29 29 0a 20 20 20 20 20 64 62 20 0a res))). db .
6d20: 20 20 20 20 20 71 72 79 73 74 72 29 0a 20 20 20 qrystr).
6d30: 20 72 65 73 29 29 0a 0a 28 64 65 66 69 6e 65 20 res))..(define
6d40: 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 74 65 73 (db:test-get-tes
6d50: 74 2d 72 65 63 6f 72 64 73 2d 6d 61 74 63 68 69 t-records-matchi
6d60: 6e 67 20 64 62 20 6b 65 79 6e 61 6d 65 73 20 74 ng db keynames t
6d70: 61 72 67 65 74 29 0a 20 20 28 6c 65 74 2a 20 28 arget). (let* (
6d80: 28 72 65 73 20 27 28 29 29 0a 09 20 28 69 74 65 (res '()).. (ite
6d90: 6d 70 61 74 74 20 20 20 28 69 66 20 28 61 72 67 mpatt (if (arg
6da0: 73 3a 67 65 74 2d 61 72 67 20 22 2d 69 74 65 6d s:get-arg "-item
6db0: 70 61 74 74 22 29 28 61 72 67 73 3a 67 65 74 2d patt")(args:get-
6dc0: 61 72 67 20 22 2d 69 74 65 6d 70 61 74 74 22 29 arg "-itempatt")
6dd0: 20 22 25 22 29 29 0a 09 20 28 74 65 73 74 70 61 "%")).. (testpa
6de0: 74 74 20 20 20 28 69 66 20 28 61 72 67 73 3a 67 tt (if (args:g
6df0: 65 74 2d 61 72 67 20 22 2d 74 65 73 74 70 61 74 et-arg "-testpat
6e00: 74 22 29 28 61 72 67 73 3a 67 65 74 2d 61 72 67 t")(args:get-arg
6e10: 20 22 2d 74 65 73 74 70 61 74 74 22 29 20 22 25 "-testpatt") "%
6e20: 22 29 29 0a 09 20 28 73 74 61 74 65 70 61 74 74 ")).. (statepatt
6e30: 20 20 28 69 66 20 28 61 72 67 73 3a 67 65 74 2d (if (args:get-
6e40: 61 72 67 20 22 3a 73 74 61 74 65 22 29 20 20 20 arg ":state")
6e50: 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22 3a (args:get-arg ":
6e60: 73 74 61 74 65 22 29 20 20 20 20 22 25 22 29 29 state") "%"))
6e70: 0a 09 20 28 73 74 61 74 75 73 70 61 74 74 20 28 .. (statuspatt (
6e80: 69 66 20 28 61 72 67 73 3a 67 65 74 2d 61 72 67 if (args:get-arg
6e90: 20 22 3a 73 74 61 74 75 73 22 29 20 20 28 61 72 ":status") (ar
6ea0: 67 73 3a 67 65 74 2d 61 72 67 20 22 3a 73 74 61 gs:get-arg ":sta
6eb0: 74 75 73 22 29 20 20 20 22 25 22 29 29 0a 09 20 tus") "%"))..
6ec0: 28 72 75 6e 6e 61 6d 65 20 20 20 20 28 69 66 20 (runname (if
6ed0: 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22 3a (args:get-arg ":
6ee0: 72 75 6e 6e 61 6d 65 22 29 20 28 61 72 67 73 3a runname") (args:
6ef0: 67 65 74 2d 61 72 67 20 22 3a 72 75 6e 6e 61 6d get-arg ":runnam
6f00: 65 22 29 20 20 22 25 22 29 29 0a 09 20 28 6b 65 e") "%")).. (ke
6f10: 79 73 74 72 20 28 73 74 72 69 6e 67 2d 69 6e 74 ystr (string-int
6f20: 65 72 73 70 65 72 73 65 20 0a 09 09 20 20 28 6d ersperse ... (m
6f30: 61 70 20 28 6c 61 6d 62 64 61 20 28 6b 65 79 20 ap (lambda (key
6f40: 76 61 6c 29 0a 09 09 09 20 28 63 6f 6e 63 20 22 val).... (conc "
6f50: 72 2e 22 20 6b 65 79 20 22 20 6c 69 6b 65 20 27 r." key " like '
6f60: 22 20 76 61 6c 20 22 27 22 29 29 0a 09 09 20 20 " val "'"))...
6f70: 20 20 20 20 20 6b 65 79 6e 61 6d 65 73 20 0a 09 keynames ..
6f80: 09 20 20 20 20 20 20 20 28 73 74 72 69 6e 67 2d . (string-
6f90: 73 70 6c 69 74 20 74 61 72 67 65 74 20 22 2f 22 split target "/"
6fa0: 29 29 0a 09 09 20 20 22 20 41 4e 44 20 22 29 29 ))... " AND "))
6fb0: 0a 09 20 28 71 72 79 73 74 72 20 28 63 6f 6e 63 .. (qrystr (conc
6fc0: 20 22 53 45 4c 45 43 54 20 0a 20 20 20 20 20 20 "SELECT .
6fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6fe0: 20 20 20 20 20 20 74 2e 69 64 0a 20 20 20 20 20 t.id.
6ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7000: 20 20 20 20 20 20 20 74 2e 72 75 6e 5f 69 64 20 t.run_id
7010: 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 .
7020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7030: 20 74 2e 74 65 73 74 6e 61 6d 65 20 20 20 0a 20 t.testname .
7040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7050: 20 20 20 20 20 20 20 20 20 20 20 74 2e 68 6f 73 t.hos
7060: 74 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 t .
7070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7080: 20 20 20 20 20 74 2e 63 70 75 6c 6f 61 64 20 20 t.cpuload
7090: 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 .
70a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 t
70b0: 2e 64 69 73 6b 66 72 65 65 20 20 20 0a 20 20 20 .diskfree .
70c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
70d0: 20 20 20 20 20 20 20 20 20 74 2e 75 6e 61 6d 65 t.uname
70e0: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 .
70f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7100: 20 20 20 74 2e 72 75 6e 64 69 72 20 20 20 20 20 t.rundir
7110: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 2e 73 t.s
7130: 68 6f 72 74 64 69 72 20 20 20 0a 20 20 20 20 20 hortdir .
7140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7150: 20 20 20 20 20 20 20 74 2e 69 74 65 6d 5f 70 61 t.item_pa
7160: 74 68 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 th .
7170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7180: 20 74 2e 73 74 61 74 65 20 20 20 20 20 20 0a 20 t.state .
7190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
71a0: 20 20 20 20 20 20 20 20 20 20 20 74 2e 73 74 61 t.sta
71b0: 74 75 73 20 20 20 20 20 0a 20 20 20 20 20 20 20 tus .
71c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
71d0: 20 20 20 20 20 74 2e 61 74 74 65 6d 70 74 6e 75 t.attemptnu
71e0: 6d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 m .
71f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 t
7200: 2e 66 69 6e 61 6c 5f 6c 6f 67 66 20 0a 20 20 20 .final_logf .
7210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7220: 20 20 20 20 20 20 20 20 20 74 2e 6c 6f 67 64 61 t.logda
7230: 74 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 t .
7240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7250: 20 20 20 74 2e 72 75 6e 5f 64 75 72 61 74 69 6f t.run_duratio
7260: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
7270: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 2e 63 t.c
7280: 6f 6d 6d 65 6e 74 20 20 20 20 0a 20 20 20 20 20 omment .
7290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
72a0: 20 20 20 20 20 20 20 74 2e 65 76 65 6e 74 5f 74 t.event_t
72b0: 69 6d 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 ime .
72c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
72d0: 20 74 2e 66 61 69 6c 5f 63 6f 75 6e 74 20 0a 20 t.fail_count .
72e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
72f0: 20 20 20 20 20 20 20 20 20 20 20 74 2e 70 61 73 t.pas
7300: 73 5f 63 6f 75 6e 74 20 0a 20 20 20 20 20 20 20 s_count .
7310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
7320: 20 20 20 20 20 74 2e 61 72 63 68 69 76 65 64 20 t.archived
7330: 20 20 0a 0a 0a 0a 20 46 52 4f 4d 20 74 65 73 74 .... FROM test
7340: 73 20 41 53 20 74 20 49 4e 4e 45 52 20 4a 4f 49 s AS t INNER JOI
7350: 4e 20 72 75 6e 73 20 41 53 20 72 20 4f 4e 20 74 N runs AS r ON t
7360: 2e 72 75 6e 5f 69 64 3d 72 2e 69 64 20 57 48 45 .run_id=r.id WHE
7370: 52 45 20 22 0a 09 09 20 20 20 20 20 20 20 6b 65 RE "... ke
7380: 79 73 74 72 20 22 20 41 4e 44 20 72 2e 72 75 6e ystr " AND r.run
7390: 6e 61 6d 65 20 4c 49 4b 45 20 27 22 20 72 75 6e name LIKE '" run
73a0: 6e 61 6d 65 20 22 27 20 41 4e 44 20 69 74 65 6d name "' AND item
73b0: 5f 70 61 74 68 20 4c 49 4b 45 20 27 22 20 69 74 _path LIKE '" it
73c0: 65 6d 70 61 74 74 20 22 27 20 41 4e 44 20 74 65 empatt "' AND te
73d0: 73 74 6e 61 6d 65 20 4c 49 4b 45 20 27 22 0a 09 stname LIKE '"..
73e0: 09 20 20 20 20 20 20 20 74 65 73 74 70 61 74 74 . testpatt
73f0: 20 22 27 20 41 4e 44 20 74 2e 73 74 61 74 65 20 "' AND t.state
7400: 4c 49 4b 45 20 27 22 20 73 74 61 74 65 70 61 74 LIKE '" statepat
7410: 74 20 22 27 20 41 4e 44 20 74 2e 73 74 61 74 75 t "' AND t.statu
7420: 73 20 4c 49 4b 45 20 27 22 20 73 74 61 74 75 73 s LIKE '" status
7430: 70 61 74 74 20 0a 09 09 20 20 20 20 20 20 20 22 patt ... "
7440: 27 4f 52 44 45 52 20 42 59 20 74 2e 65 76 65 6e 'ORDER BY t.even
7450: 74 5f 74 69 6d 65 20 41 53 43 3b 22 29 29 29 0a t_time ASC;"))).
7460: 20 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 (debug:print
7470: 20 33 20 22 71 72 79 73 74 72 3a 20 22 20 71 72 3 "qrystr: " qr
7480: 79 73 74 72 29 0a 20 20 20 20 28 73 71 6c 69 74 ystr). (sqlit
7490: 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 e3:for-each-row
74a0: 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 70 . (lambda (p
74b0: 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72 ). (set! r
74c0: 65 73 20 28 63 6f 6e 73 20 70 20 72 65 73 29 29 es (cons p res))
74d0: 29 0a 20 20 20 20 20 64 62 20 0a 20 20 20 20 20 ). db .
74e0: 71 72 79 73 74 72 29 0a 20 20 20 20 72 65 73 29 qrystr). res)
74f0: 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d )..;;===========
7500: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7510: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7520: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7530: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 51 ===========.;; Q
7540: 55 45 55 45 20 55 50 20 4d 45 54 41 2c 20 54 45 UEUE UP META, TE
7550: 53 54 20 53 54 41 54 55 53 20 41 4e 44 20 53 54 ST STATUS AND ST
7560: 45 50 53 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d EPS.;;==========
7570: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7580: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7590: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
75a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 ============..(d
75b0: 65 66 69 6e 65 20 28 64 62 3a 75 70 64 61 74 65 efine (db:update
75c0: 72 20 64 62 29 0a 20 20 28 6c 65 74 20 6c 6f 6f r db). (let loo
75d0: 70 20 28 28 73 74 61 72 74 2d 74 69 6d 65 20 28 p ((start-time (
75e0: 63 75 72 72 65 6e 74 2d 74 69 6d 65 29 29 29 0a current-time))).
75f0: 20 20 20 20 28 74 68 72 65 61 64 2d 73 6c 65 65 (thread-slee
7600: 70 21 20 30 2e 35 29 20 3b 3b 20 6d 6f 76 65 20 p! 0.5) ;; move
7610: 73 61 76 65 20 74 69 6d 65 20 61 72 6f 75 6e 64 save time around
7620: 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 72 65 67 to minimize reg
7630: 75 6c 61 72 20 63 6f 6c 6c 69 73 69 6f 6e 73 3f ular collisions?
7640: 0a 20 20 20 20 28 64 62 3a 77 72 69 74 65 2d 63 . (db:write-c
7650: 61 63 68 65 64 2d 64 61 74 61 20 64 62 29 0a 20 ached-data db).
7660: 20 20 20 28 6c 6f 6f 70 20 73 74 61 72 74 2d 74 (loop start-t
7670: 69 6d 65 29 29 29 0a 20 20 20 20 0a 28 64 65 66 ime))). .(def
7680: 69 6e 65 20 28 64 62 3a 74 65 73 74 2d 75 70 64 ine (db:test-upd
7690: 61 74 65 2d 6d 65 74 61 2d 69 6e 66 6f 20 64 62 ate-meta-info db
76a0: 20 74 65 73 74 2d 69 64 20 6d 69 6e 75 74 65 73 test-id minutes
76b0: 20 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 cpuload diskfre
76c0: 65 20 74 6d 70 66 72 65 65 29 0a 20 20 28 6d 75 e tmpfree). (mu
76d0: 74 65 78 2d 6c 6f 63 6b 21 20 2a 69 6e 63 6f 6d tex-lock! *incom
76e0: 69 6e 67 2d 6d 75 74 65 78 2a 29 0a 20 20 28 73 ing-mutex*). (s
76f0: 65 74 21 20 2a 69 6e 63 6f 6d 69 6e 67 2d 64 61 et! *incoming-da
7700: 74 61 2a 20 28 63 6f 6e 73 20 28 76 65 63 74 6f ta* (cons (vecto
7710: 72 20 27 6d 65 74 61 2d 69 6e 66 6f 0a 09 09 09 r 'meta-info....
7720: 09 20 20 20 20 20 20 28 63 75 72 72 65 6e 74 2d . (current-
7730: 73 65 63 6f 6e 64 73 29 0a 09 09 09 09 20 20 20 seconds).....
7740: 20 20 20 28 6c 69 73 74 20 63 70 75 6c 6f 61 64 (list cpuload
7750: 0a 09 09 09 09 09 20 20 20 20 64 69 73 6b 66 72 ...... diskfr
7760: 65 65 0a 09 09 09 09 09 20 20 20 20 6d 69 6e 75 ee...... minu
7770: 74 65 73 0a 09 09 09 09 09 20 20 20 20 74 65 73 tes...... tes
7780: 74 2d 69 64 29 29 20 3b 3b 20 72 75 6e 2d 69 64 t-id)) ;; run-id
7790: 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d test-name item-
77a0: 70 61 74 68 20 6d 69 6e 75 74 65 73 20 63 70 75 path minutes cpu
77b0: 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20 74 6d load diskfree tm
77c0: 70 66 72 65 65 29 20 0a 09 09 09 20 20 20 20 20 pfree) ....
77d0: 20 2a 69 6e 63 6f 6d 69 6e 67 2d 64 61 74 61 2a *incoming-data*
77e0: 29 29 0a 20 20 28 6d 75 74 65 78 2d 75 6e 6c 6f )). (mutex-unlo
77f0: 63 6b 21 20 2a 69 6e 63 6f 6d 69 6e 67 2d 6d 75 ck! *incoming-mu
7800: 74 65 78 2a 29 0a 20 20 28 69 66 20 2a 63 61 63 tex*). (if *cac
7810: 68 65 2d 6f 6e 2a 0a 20 20 20 20 20 20 28 64 65 he-on*. (de
7820: 62 75 67 3a 70 72 69 6e 74 20 36 20 22 49 4e 46 bug:print 6 "INF
7830: 4f 3a 20 2a 63 61 63 68 65 2d 6f 6e 2a 20 69 73 O: *cache-on* is
7840: 20 22 20 2a 63 61 63 68 65 2d 6f 6e 2a 20 22 2c " *cache-on* ",
7850: 20 73 6b 69 70 70 69 6e 67 20 63 61 63 68 65 20 skipping cache
7860: 77 72 69 74 65 20 61 73 20 70 61 72 74 20 6f 66 write as part of
7870: 20 74 65 73 74 2d 75 70 64 61 74 65 2d 6d 65 74 test-update-met
7880: 61 2d 69 6e 66 6f 22 29 0a 20 20 20 20 20 20 28 a-info"). (
7890: 64 62 3a 77 72 69 74 65 2d 63 61 63 68 65 64 2d db:write-cached-
78a0: 64 61 74 61 20 64 62 29 29 29 0a 0a 28 64 65 66 data db)))..(def
78b0: 69 6e 65 20 28 64 62 3a 77 72 69 74 65 2d 63 61 ine (db:write-ca
78c0: 63 68 65 64 2d 64 61 74 61 20 64 62 29 0a 20 20 ched-data db).
78d0: 28 6c 65 74 20 28 28 6d 65 74 61 2d 73 74 6d 74 (let ((meta-stmt
78e0: 20 28 73 71 6c 69 74 65 33 3a 70 72 65 70 61 72 (sqlite3:prepar
78f0: 65 20 64 62 20 22 55 50 44 41 54 45 20 74 65 73 e db "UPDATE tes
7900: 74 73 20 53 45 54 20 63 70 75 6c 6f 61 64 3d 3f ts SET cpuload=?
7910: 2c 64 69 73 6b 66 72 65 65 3d 3f 2c 72 75 6e 5f ,diskfree=?,run_
7920: 64 75 72 61 74 69 6f 6e 3d 3f 2c 73 74 61 74 65 duration=?,state
7930: 3d 27 52 55 4e 4e 49 4e 47 27 20 57 48 45 52 45 ='RUNNING' WHERE
7940: 20 69 64 3d 3f 20 41 4e 44 20 73 74 61 74 65 20 id=? AND state
7950: 4e 4f 54 20 49 4e 20 28 27 43 4f 4d 50 4c 45 54 NOT IN ('COMPLET
7960: 45 44 27 2c 27 4b 49 4c 4c 52 45 51 27 2c 27 4b ED','KILLREQ','K
7970: 49 4c 4c 45 44 27 29 3b 22 29 29 0a 09 28 73 74 ILLED');"))..(st
7980: 65 70 2d 73 74 6d 74 20 28 73 71 6c 69 74 65 33 ep-stmt (sqlite3
7990: 3a 70 72 65 70 61 72 65 20 64 62 20 22 49 4e 53 :prepare db "INS
79a0: 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 69 ERT OR REPLACE i
79b0: 6e 74 6f 20 74 65 73 74 5f 73 74 65 70 73 20 28 nto test_steps (
79c0: 74 65 73 74 5f 69 64 2c 73 74 65 70 6e 61 6d 65 test_id,stepname
79d0: 2c 73 74 61 74 65 2c 73 74 61 74 75 73 2c 65 76 ,state,status,ev
79e0: 65 6e 74 5f 74 69 6d 65 2c 63 6f 6d 6d 65 6e 74 ent_time,comment
79f0: 2c 6c 6f 67 66 69 6c 65 29 20 56 41 4c 55 45 53 ,logfile) VALUES
7a00: 28 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 29 3b (?,?,?,?,?,?,?);
7a10: 22 29 29 20 3b 3b 20 73 74 72 66 74 69 6d 65 28 ")) ;; strftime(
7a20: 27 25 73 27 2c 27 6e 6f 77 27 29 23 66 29 0a 09 '%s','now')#f)..
7a30: 28 64 61 74 61 20 28 73 6f 72 74 20 2a 69 6e 63 (data (sort *inc
7a40: 6f 6d 69 6e 67 2d 64 61 74 61 2a 20 28 6c 61 6d oming-data* (lam
7a50: 62 64 61 20 28 61 20 62 29 28 3c 20 28 76 65 63 bda (a b)(< (vec
7a60: 74 6f 72 2d 72 65 66 20 61 20 31 29 28 76 65 63 tor-ref a 1)(vec
7a70: 74 6f 72 2d 72 65 66 20 62 20 31 29 29 29 29 29 tor-ref b 1)))))
7a80: 29 0a 20 20 20 20 28 69 66 20 28 3e 20 28 6c 65 ). (if (> (le
7a90: 6e 67 74 68 20 64 61 74 61 29 20 30 29 0a 09 28 ngth data) 0)..(
7aa0: 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22 57 debug:print 4 "W
7ab0: 72 69 74 69 6e 67 20 63 61 63 68 65 64 20 64 61 riting cached da
7ac0: 74 61 20 22 20 64 61 74 61 29 29 0a 20 20 20 20 ta " data)).
7ad0: 28 6d 75 74 65 78 2d 6c 6f 63 6b 21 20 2a 69 6e (mutex-lock! *in
7ae0: 63 6f 6d 69 6e 67 2d 6d 75 74 65 78 2a 29 0a 20 coming-mutex*).
7af0: 20 20 20 28 73 71 6c 69 74 65 33 3a 77 69 74 68 (sqlite3:with
7b00: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 -transaction .
7b10: 20 20 20 64 62 0a 20 20 20 20 20 28 6c 61 6d 62 db. (lamb
7b20: 64 61 20 28 29 0a 20 20 20 20 20 20 20 28 66 6f da (). (fo
7b30: 72 2d 65 61 63 68 20 28 6c 61 6d 62 64 61 20 28 r-each (lambda (
7b40: 65 6e 74 72 79 29 0a 09 09 20 20 20 28 63 61 73 entry)... (cas
7b50: 65 20 28 76 65 63 74 6f 72 2d 72 65 66 20 65 6e e (vector-ref en
7b60: 74 72 79 20 30 29 0a 09 09 20 20 20 20 20 28 28 try 0)... ((
7b70: 6d 65 74 61 2d 69 6e 66 6f 29 0a 09 09 20 20 20 meta-info)...
7b80: 20 20 20 28 61 70 70 6c 79 20 73 71 6c 69 74 65 (apply sqlite
7b90: 33 3a 65 78 65 63 75 74 65 20 6d 65 74 61 2d 73 3:execute meta-s
7ba0: 74 6d 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 tmt (vector-ref
7bb0: 65 6e 74 72 79 20 32 29 29 29 0a 09 09 20 20 20 entry 2)))...
7bc0: 20 20 28 28 73 74 65 70 2d 73 74 61 74 75 73 29 ((step-status)
7bd0: 0a 09 09 20 20 20 20 20 20 28 61 70 70 6c 79 20 ... (apply
7be0: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 sqlite3:execute
7bf0: 73 74 65 70 2d 73 74 6d 74 20 28 76 65 63 74 6f step-stmt (vecto
7c00: 72 2d 72 65 66 20 65 6e 74 72 79 20 32 29 29 29 r-ref entry 2)))
7c10: 0a 09 09 20 20 20 20 20 28 65 6c 73 65 0a 09 09 ... (else...
7c20: 20 20 20 20 20 20 28 64 65 62 75 67 3a 70 72 69 (debug:pri
7c30: 6e 74 20 30 20 22 45 52 52 4f 52 3a 20 51 75 65 nt 0 "ERROR: Que
7c40: 75 65 64 20 65 6e 74 72 79 20 6e 6f 74 20 72 65 ued entry not re
7c50: 63 6f 67 6e 69 73 65 64 20 22 20 65 6e 74 72 79 cognised " entry
7c60: 29 29 29 29 0a 09 09 20 64 61 74 61 29 29 29 0a ))))... data))).
7c70: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 69 6e (sqlite3:fin
7c80: 61 6c 69 7a 65 21 20 6d 65 74 61 2d 73 74 6d 74 alize! meta-stmt
7c90: 29 20 3b 3b 20 73 71 6c 69 74 65 20 69 73 20 74 ) ;; sqlite is t
7ca0: 68 65 20 62 6f 74 74 6c 65 6e 65 63 6b 2c 20 63 he bottleneck, c
7cb0: 6c 65 61 72 20 74 68 65 20 73 74 61 74 65 6d 65 lear the stateme
7cc0: 6e 74 73 20 61 73 61 70 3f 0a 20 20 20 20 28 73 nts asap?. (s
7cd0: 71 6c 69 74 65 33 3a 66 69 6e 61 6c 69 7a 65 21 qlite3:finalize!
7ce0: 20 73 74 65 70 2d 73 74 6d 74 29 0a 20 20 20 20 step-stmt).
7cf0: 28 73 65 74 21 20 2a 69 6e 63 6f 6d 69 6e 67 2d (set! *incoming-
7d00: 64 61 74 61 2a 20 27 28 29 29 0a 20 20 20 20 28 data* '()). (
7d10: 6d 75 74 65 78 2d 75 6e 6c 6f 63 6b 21 20 2a 69 mutex-unlock! *i
7d20: 6e 63 6f 6d 69 6e 67 2d 6d 75 74 65 78 2a 29 29 ncoming-mutex*))
7d30: 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 72 )..(define (db:r
7d40: 6f 6c 6c 2d 75 70 2d 70 61 73 73 2d 66 61 69 6c oll-up-pass-fail
7d50: 2d 63 6f 75 6e 74 73 20 64 62 20 72 75 6e 2d 69 -counts db run-i
7d60: 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d d test-name item
7d70: 2d 70 61 74 68 20 73 74 61 74 75 73 29 0a 20 20 -path status).
7d80: 28 69 66 20 28 61 6e 64 20 28 6e 6f 74 20 28 65 (if (and (not (e
7d90: 71 75 61 6c 3f 20 69 74 65 6d 2d 70 61 74 68 20 qual? item-path
7da0: 22 22 29 29 0a 09 20 20 20 28 6f 72 20 28 65 71 "")).. (or (eq
7db0: 75 61 6c 3f 20 73 74 61 74 75 73 20 22 50 41 53 ual? status "PAS
7dc0: 53 22 29 0a 09 20 20 20 20 20 20 20 28 65 71 75 S").. (equ
7dd0: 61 6c 3f 20 73 74 61 74 75 73 20 22 57 41 52 4e al? status "WARN
7de0: 22 29 0a 09 20 20 20 20 20 20 20 28 65 71 75 61 ").. (equa
7df0: 6c 3f 20 73 74 61 74 75 73 20 22 46 41 49 4c 22 l? status "FAIL"
7e00: 29 0a 09 20 20 20 20 20 20 20 28 65 71 75 61 6c ).. (equal
7e10: 3f 20 73 74 61 74 75 73 20 22 57 41 49 56 45 44 ? status "WAIVED
7e20: 22 29 0a 09 20 20 20 20 20 20 20 28 65 71 75 61 ").. (equa
7e30: 6c 3f 20 73 74 61 74 75 73 20 22 52 55 4e 4e 49 l? status "RUNNI
7e40: 4e 47 22 29 29 29 0a 20 20 20 20 20 20 28 62 65 NG"))). (be
7e50: 67 69 6e 0a 09 28 73 71 6c 69 74 65 33 3a 65 78 gin..(sqlite3:ex
7e60: 65 63 75 74 65 20 0a 09 20 64 62 0a 09 20 22 55 ecute .. db.. "U
7e70: 50 44 41 54 45 20 74 65 73 74 73 20 0a 20 20 20 PDATE tests .
7e80: 20 20 20 20 20 20 20 20 20 20 53 45 54 20 66 61 SET fa
7e90: 69 6c 5f 63 6f 75 6e 74 3d 28 53 45 4c 45 43 54 il_count=(SELECT
7ea0: 20 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 count(id) FROM
7eb0: 74 65 73 74 73 20 57 48 45 52 45 20 72 75 6e 5f tests WHERE run_
7ec0: 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d id=? AND testnam
7ed0: 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 e=? AND item_pat
7ee0: 68 20 21 3d 20 27 27 20 41 4e 44 20 73 74 61 74 h != '' AND stat
7ef0: 75 73 3d 27 46 41 49 4c 27 29 2c 0a 20 20 20 20 us='FAIL'),.
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 73 pas
7f10: 73 5f 63 6f 75 6e 74 3d 28 53 45 4c 45 43 54 20 s_count=(SELECT
7f20: 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 74 count(id) FROM t
7f30: 65 73 74 73 20 57 48 45 52 45 20 72 75 6e 5f 69 ests WHERE run_i
7f40: 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 d=? AND testname
7f50: 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 =? AND item_path
7f60: 20 21 3d 20 27 27 20 41 4e 44 20 28 73 74 61 74 != '' AND (stat
7f70: 75 73 3d 27 50 41 53 53 27 20 4f 52 20 73 74 61 us='PASS' OR sta
7f80: 74 75 73 3d 27 57 41 52 4e 27 20 4f 52 20 73 74 tus='WARN' OR st
7f90: 61 74 75 73 3d 27 57 41 49 56 45 44 27 29 29 0a atus='WAIVED')).
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 WHE
7fb0: 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 RE run_id=? AND
7fc0: 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 testname=? AND i
7fd0: 74 65 6d 5f 70 61 74 68 3d 27 27 3b 22 0a 09 20 tem_path='';"..
7fe0: 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 run-id test-name
7ff0: 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d run-id test-nam
8000: 65 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 e run-id test-na
8010: 6d 65 29 0a 20 20 20 20 20 20 20 20 28 74 68 72 me). (thr
8020: 65 61 64 2d 73 6c 65 65 70 21 20 30 2e 31 29 20 ead-sleep! 0.1)
8030: 3b 3b 20 67 69 76 65 20 6f 74 68 65 72 20 70 72 ;; give other pr
8040: 6f 63 65 73 73 65 73 20 61 20 63 68 61 6e 63 65 ocesses a chance
8050: 20 68 65 72 65 0a 09 28 69 66 20 28 65 71 75 61 here..(if (equa
8060: 6c 3f 20 73 74 61 74 75 73 20 22 52 55 4e 4e 49 l? status "RUNNI
8070: 4e 47 22 29 20 3b 3b 20 72 75 6e 6e 69 6e 67 20 NG") ;; running
8080: 74 61 6b 65 73 20 70 72 69 6f 72 69 74 79 20 6f takes priority o
8090: 76 65 72 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 ver all other st
80a0: 61 74 65 73 2c 20 66 6f 72 63 65 20 74 68 65 20 ates, force the
80b0: 74 65 73 74 20 73 74 61 74 65 20 74 6f 20 52 55 test state to RU
80c0: 4e 4e 49 4e 47 0a 09 20 20 20 20 28 73 71 6c 69 NNING.. (sqli
80d0: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 te3:execute db "
80e0: 55 50 44 41 54 45 20 74 65 73 74 73 20 53 45 54 UPDATE tests SET
80f0: 20 73 74 61 74 65 3d 3f 20 57 48 45 52 45 20 72 state=? WHERE r
8100: 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 un_id=? AND test
8110: 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f name=? AND item_
8120: 70 61 74 68 3d 27 27 3b 22 20 22 52 55 4e 4e 49 path='';" "RUNNI
8130: 4e 47 22 20 72 75 6e 2d 69 64 20 74 65 73 74 2d NG" run-id test-
8140: 6e 61 6d 65 29 0a 09 20 20 20 20 28 73 71 6c 69 name).. (sqli
8150: 74 65 33 3a 65 78 65 63 75 74 65 0a 09 20 20 20 te3:execute..
8160: 20 20 64 62 0a 09 20 20 20 20 20 22 55 50 44 41 db.. "UPDA
8170: 54 45 20 74 65 73 74 73 0a 20 20 20 20 20 20 20 TE tests.
8180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8190: 53 45 54 20 73 74 61 74 65 3d 43 41 53 45 20 57 SET state=CASE W
81a0: 48 45 4e 20 28 53 45 4c 45 43 54 20 63 6f 75 6e HEN (SELECT coun
81b0: 74 28 69 64 29 20 46 52 4f 4d 20 74 65 73 74 73 t(id) FROM tests
81c0: 20 57 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 WHERE run_id=?
81d0: 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 AND testname=? A
81e0: 4e 44 20 69 74 65 6d 5f 70 61 74 68 20 21 3d 20 ND item_path !=
81f0: 27 27 20 41 4e 44 20 73 74 61 74 65 20 69 6e 20 '' AND state in
8200: 28 27 52 55 4e 4e 49 4e 47 27 2c 27 4e 4f 54 5f ('RUNNING','NOT_
8210: 53 54 41 52 54 45 44 27 29 29 20 3e 20 30 20 54 STARTED')) > 0 T
8220: 48 45 4e 20 0a 20 20 20 20 20 20 20 20 20 20 20 HEN .
8230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 27 '
8240: 52 55 4e 4e 49 4e 47 27 0a 20 20 20 20 20 20 20 RUNNING'.
8250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8260: 45 4c 53 45 20 27 43 4f 4d 50 4c 45 54 45 44 27 ELSE 'COMPLETED'
8270: 20 45 4e 44 2c 0a 20 20 20 20 20 20 20 20 20 20 END,.
8280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8290: 73 74 61 74 75 73 3d 43 41 53 45 20 57 48 45 4e status=CASE WHEN
82a0: 20 66 61 69 6c 5f 63 6f 75 6e 74 20 3e 20 30 20 fail_count > 0
82b0: 54 48 45 4e 20 27 46 41 49 4c 27 20 57 48 45 4e THEN 'FAIL' WHEN
82c0: 20 70 61 73 73 5f 63 6f 75 6e 74 20 3e 20 30 20 pass_count > 0
82d0: 41 4e 44 20 66 61 69 6c 5f 63 6f 75 6e 74 3d 30 AND fail_count=0
82e0: 20 54 48 45 4e 20 27 50 41 53 53 27 20 45 4c 53 THEN 'PASS' ELS
82f0: 45 20 27 55 4e 4b 4e 4f 57 4e 27 20 45 4e 44 0a E 'UNKNOWN' END.
8300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
8310: 20 20 20 20 20 20 20 57 48 45 52 45 20 72 75 6e WHERE run
8320: 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 _id=? AND testna
8330: 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 me=? AND item_pa
8340: 74 68 3d 27 27 3b 22 0a 09 20 20 20 20 20 72 75 th='';".. ru
8350: 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 72 n-id test-name r
8360: 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 29 un-id test-name)
8370: 29 0a 09 23 66 29 0a 20 20 20 20 20 20 23 66 29 )..#f). #f)
8380: 29 0a 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d )...;;==========
8390: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
83a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
83b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
83c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 ============.;;
83d0: 54 65 73 74 73 20 6d 65 74 61 20 64 61 74 61 0a Tests meta data.
83e0: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ;;==============
83f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8400: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8410: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8420: 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 72 65 61 ========..;; rea
8430: 64 20 74 68 65 20 72 65 63 6f 72 64 20 67 69 76 d the record giv
8440: 65 6e 20 61 20 74 65 73 74 6e 61 6d 65 0a 28 64 en a testname.(d
8450: 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74 6d 65 efine (db:testme
8460: 74 61 2d 67 65 74 2d 72 65 63 6f 72 64 20 64 62 ta-get-record db
8470: 20 74 65 73 74 6e 61 6d 65 29 0a 20 20 28 6c 65 testname). (le
8480: 74 20 28 28 72 65 73 20 23 66 29 29 0a 20 20 20 t ((res #f)).
8490: 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 (sqlite3:for-ea
84a0: 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d ch-row. (lam
84b0: 62 64 61 20 28 69 64 20 74 65 73 74 6e 61 6d 65 bda (id testname
84c0: 20 61 75 74 68 6f 72 20 6f 77 6e 65 72 20 64 65 author owner de
84d0: 73 63 72 69 70 74 69 6f 6e 20 72 65 76 69 65 77 scription review
84e0: 65 64 20 69 74 65 72 61 74 65 64 20 61 76 67 5f ed iterated avg_
84f0: 72 75 6e 74 69 6d 65 20 61 76 67 5f 64 69 73 6b runtime avg_disk
8500: 20 74 61 67 73 29 0a 20 20 20 20 20 20 20 28 73 tags). (s
8510: 65 74 21 20 72 65 73 20 28 76 65 63 74 6f 72 20 et! res (vector
8520: 69 64 20 74 65 73 74 6e 61 6d 65 20 61 75 74 68 id testname auth
8530: 6f 72 20 6f 77 6e 65 72 20 64 65 73 63 72 69 70 or owner descrip
8540: 74 69 6f 6e 20 72 65 76 69 65 77 65 64 20 69 74 tion reviewed it
8550: 65 72 61 74 65 64 20 61 76 67 5f 72 75 6e 74 69 erated avg_runti
8560: 6d 65 20 61 76 67 5f 64 69 73 6b 20 74 61 67 73 me avg_disk tags
8570: 29 29 29 0a 20 20 20 20 20 64 62 20 22 53 45 4c ))). db "SEL
8580: 45 43 54 20 69 64 2c 74 65 73 74 6e 61 6d 65 2c ECT id,testname,
8590: 61 75 74 68 6f 72 2c 6f 77 6e 65 72 2c 64 65 73 author,owner,des
85a0: 63 72 69 70 74 69 6f 6e 2c 72 65 76 69 65 77 65 cription,reviewe
85b0: 64 2c 69 74 65 72 61 74 65 64 2c 61 76 67 5f 72 d,iterated,avg_r
85c0: 75 6e 74 69 6d 65 2c 61 76 67 5f 64 69 73 6b 2c untime,avg_disk,
85d0: 74 61 67 73 20 46 52 4f 4d 20 74 65 73 74 5f 6d tags FROM test_m
85e0: 65 74 61 20 57 48 45 52 45 20 74 65 73 74 6e 61 eta WHERE testna
85f0: 6d 65 3d 3f 3b 22 0a 20 20 20 20 20 74 65 73 74 me=?;". test
8600: 6e 61 6d 65 29 0a 20 20 20 20 72 65 73 29 29 0a name). res)).
8610: 0a 3b 3b 20 63 72 65 61 74 65 20 61 20 6e 65 77 .;; create a new
8620: 20 72 65 63 6f 72 64 20 66 6f 72 20 61 20 67 69 record for a gi
8630: 76 65 6e 20 74 65 73 74 6e 61 6d 65 0a 28 64 65 ven testname.(de
8640: 66 69 6e 65 20 28 64 62 3a 74 65 73 74 6d 65 74 fine (db:testmet
8650: 61 2d 61 64 64 2d 72 65 63 6f 72 64 20 64 62 20 a-add-record db
8660: 74 65 73 74 6e 61 6d 65 29 0a 20 20 28 73 71 6c testname). (sql
8670: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 ite3:execute db
8680: 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 "INSERT OR IGNOR
8690: 45 20 49 4e 54 4f 20 74 65 73 74 5f 6d 65 74 61 E INTO test_meta
86a0: 20 28 74 65 73 74 6e 61 6d 65 2c 61 75 74 68 6f (testname,autho
86b0: 72 2c 6f 77 6e 65 72 2c 64 65 73 63 72 69 70 74 r,owner,descript
86c0: 69 6f 6e 2c 72 65 76 69 65 77 65 64 2c 69 74 65 ion,reviewed,ite
86d0: 72 61 74 65 64 2c 61 76 67 5f 72 75 6e 74 69 6d rated,avg_runtim
86e0: 65 2c 61 76 67 5f 64 69 73 6b 2c 74 61 67 73 29 e,avg_disk,tags)
86f0: 20 56 41 4c 55 45 53 20 28 3f 2c 27 27 2c 27 27 VALUES (?,'',''
8700: 2c 27 27 2c 27 27 2c 27 27 2c 27 27 2c 27 27 2c ,'','','','','',
8710: 27 27 29 3b 22 20 74 65 73 74 6e 61 6d 65 29 29 '');" testname))
8720: 0a 0a 3b 3b 20 75 70 64 61 74 65 20 6f 6e 65 20 ..;; update one
8730: 6f 66 20 74 68 65 20 74 65 73 74 6d 65 74 61 20 of the testmeta
8740: 66 69 65 6c 64 73 0a 28 64 65 66 69 6e 65 20 28 fields.(define (
8750: 64 62 3a 74 65 73 74 6d 65 74 61 2d 75 70 64 61 db:testmeta-upda
8760: 74 65 2d 66 69 65 6c 64 20 64 62 20 74 65 73 74 te-field db test
8770: 6e 61 6d 65 20 66 69 65 6c 64 20 76 61 6c 75 65 name field value
8780: 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 ). (sqlite3:exe
8790: 63 75 74 65 20 64 62 20 28 63 6f 6e 63 20 22 55 cute db (conc "U
87a0: 50 44 41 54 45 20 74 65 73 74 5f 6d 65 74 61 20 PDATE test_meta
87b0: 53 45 54 20 22 20 66 69 65 6c 64 20 22 3d 3f 20 SET " field "=?
87c0: 57 48 45 52 45 20 74 65 73 74 6e 61 6d 65 3d 3f WHERE testname=?
87d0: 3b 22 29 20 76 61 6c 75 65 20 74 65 73 74 6e 61 ;") value testna
87e0: 6d 65 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d me))..;;========
87f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8800: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8810: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8820: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b ==============.;
8830: 3b 20 54 20 45 20 53 20 54 20 20 20 44 20 41 20 ; T E S T D A
8840: 54 20 41 20 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d T A .;;=========
8850: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8860: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8870: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
8880: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 =============..(
8890: 64 65 66 69 6e 65 20 28 64 62 3a 63 73 76 2d 3e define (db:csv->
88a0: 74 65 73 74 2d 64 61 74 61 20 64 62 20 74 65 73 test-data db tes
88b0: 74 2d 69 64 20 63 73 76 64 61 74 61 29 0a 20 20 t-id csvdata).
88c0: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22 (debug:print 4 "
88d0: 74 65 73 74 2d 69 64 20 22 20 74 65 73 74 2d 69 test-id " test-i
88e0: 64 20 22 2c 20 63 73 76 64 61 74 61 3a 20 22 20 d ", csvdata: "
88f0: 63 73 76 64 61 74 61 29 0a 20 20 28 6c 65 74 20 csvdata). (let
8900: 28 28 63 73 76 6c 69 73 74 20 28 63 73 76 2d 3e ((csvlist (csv->
8910: 6c 69 73 74 20 28 6d 61 6b 65 2d 63 73 76 2d 72 list (make-csv-r
8920: 65 61 64 65 72 0a 09 09 09 20 20 20 20 20 28 6f eader.... (o
8930: 70 65 6e 2d 69 6e 70 75 74 2d 73 74 72 69 6e 67 pen-input-string
8940: 20 63 73 76 64 61 74 61 29 0a 09 09 09 20 20 20 csvdata)....
8950: 20 20 27 28 28 73 74 72 69 70 2d 6c 65 61 64 69 '((strip-leadi
8960: 6e 67 2d 77 68 69 74 65 73 70 61 63 65 3f 20 23 ng-whitespace? #
8970: 74 29 0a 09 09 09 20 20 20 20 20 20 20 28 73 74 t).... (st
8980: 72 69 70 2d 74 72 61 69 6c 69 6e 67 2d 77 68 69 rip-trailing-whi
8990: 74 65 73 70 61 63 65 3f 20 23 74 29 29 20 29 29 tespace? #t)) ))
89a0: 29 29 20 3b 3b 20 28 63 73 76 2d 3e 6c 69 73 74 )) ;; (csv->list
89b0: 20 63 73 76 64 61 74 61 29 29 29 0a 20 20 20 20 csvdata))).
89c0: 28 66 6f 72 2d 65 61 63 68 20 0a 20 20 20 20 20 (for-each .
89d0: 28 6c 61 6d 62 64 61 20 28 63 73 76 72 6f 77 29 (lambda (csvrow)
89e0: 0a 20 20 20 20 20 20 20 28 6c 65 74 2a 20 28 28 . (let* ((
89f0: 70 61 64 64 65 64 2d 72 6f 77 20 20 28 74 61 6b padded-row (tak
8a00: 65 20 28 61 70 70 65 6e 64 20 63 73 76 72 6f 77 e (append csvrow
8a10: 20 28 6c 69 73 74 20 23 66 20 23 66 20 23 66 20 (list #f #f #f
8a20: 23 66 20 23 66 20 23 66 20 23 66 20 23 66 20 23 #f #f #f #f #f #
8a30: 66 29 29 20 39 29 29 0a 09 20 20 20 20 20 20 28 f)) 9)).. (
8a40: 63 61 74 65 67 6f 72 79 20 20 20 20 28 6c 69 73 category (lis
8a50: 74 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77 t-ref padded-row
8a60: 20 30 29 29 0a 09 20 20 20 20 20 20 28 76 61 72 0)).. (var
8a70: 69 61 62 6c 65 20 20 20 20 28 6c 69 73 74 2d 72 iable (list-r
8a80: 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20 31 29 ef padded-row 1)
8a90: 29 0a 09 20 20 20 20 20 20 28 76 61 6c 75 65 20 ).. (value
8aa0: 20 20 20 20 20 20 28 61 6e 79 2d 3e 6e 75 6d 62 (any->numb
8ab0: 65 72 2d 69 66 2d 70 6f 73 73 69 62 6c 65 20 28 er-if-possible (
8ac0: 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d list-ref padded-
8ad0: 72 6f 77 20 32 29 29 29 0a 09 20 20 20 20 20 20 row 2)))..
8ae0: 28 65 78 70 65 63 74 65 64 20 20 20 20 28 61 6e (expected (an
8af0: 79 2d 3e 6e 75 6d 62 65 72 2d 69 66 2d 70 6f 73 y->number-if-pos
8b00: 73 69 62 6c 65 20 28 6c 69 73 74 2d 72 65 66 20 sible (list-ref
8b10: 70 61 64 64 65 64 2d 72 6f 77 20 33 29 29 29 0a padded-row 3))).
8b20: 09 20 20 20 20 20 20 28 74 6f 6c 20 20 20 20 20 . (tol
8b30: 20 20 20 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 (any->number
8b40: 2d 69 66 2d 70 6f 73 73 69 62 6c 65 20 28 6c 69 -if-possible (li
8b50: 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f st-ref padded-ro
8b60: 77 20 34 29 29 29 20 3b 3b 20 3e 2c 20 3c 2c 20 w 4))) ;; >, <,
8b70: 3e 3d 2c 20 3c 3d 2c 20 6f 72 20 61 20 6e 75 6d >=, <=, or a num
8b80: 62 65 72 0a 09 20 20 20 20 20 20 28 75 6e 69 74 ber.. (unit
8b90: 73 20 20 20 20 20 20 20 28 6c 69 73 74 2d 72 65 s (list-re
8ba0: 66 20 70 61 64 64 65 64 2d 72 6f 77 20 35 29 29 f padded-row 5))
8bb0: 0a 09 20 20 20 20 20 20 28 63 6f 6d 6d 65 6e 74 .. (comment
8bc0: 20 20 20 20 20 28 6c 69 73 74 2d 72 65 66 20 70 (list-ref p
8bd0: 61 64 64 65 64 2d 72 6f 77 20 36 29 29 0a 09 20 added-row 6))..
8be0: 20 20 20 20 20 28 73 74 61 74 75 73 20 20 20 20 (status
8bf0: 20 20 28 6c 65 74 20 28 28 73 20 28 6c 69 73 74 (let ((s (list
8c00: 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20 -ref padded-row
8c10: 37 29 29 29 0a 09 09 09 20 20 20 20 20 28 69 66 7))).... (if
8c20: 20 28 61 6e 64 20 28 73 74 72 69 6e 67 3f 20 73 (and (string? s
8c30: 29 28 6f 72 20 28 73 74 72 69 6e 67 2d 6d 61 74 )(or (string-mat
8c40: 63 68 20 28 72 65 67 65 78 70 20 22 5e 5c 5c 73 ch (regexp "^\\s
8c50: 2a 24 22 29 20 73 29 0a 09 09 09 09 09 09 20 20 *$") s).......
8c60: 20 20 20 28 73 74 72 69 6e 67 2d 6d 61 74 63 68 (string-match
8c70: 20 28 72 65 67 65 78 70 20 22 5e 6e 2f 61 24 22 (regexp "^n/a$"
8c80: 29 20 73 29 29 29 0a 09 09 09 09 20 23 66 0a 09 ) s)))..... #f..
8c90: 09 09 09 20 73 29 29 29 20 3b 3b 20 69 66 20 73 ... s))) ;; if s
8ca0: 70 65 63 69 66 69 65 64 20 6f 6e 20 74 68 65 20 pecified on the
8cb0: 69 6e 70 75 74 20 74 68 65 6e 20 75 73 65 2c 20 input then use,
8cc0: 65 6c 73 65 20 63 61 6c 63 75 6c 61 74 65 0a 09 else calculate..
8cd0: 20 20 20 20 20 20 28 74 79 70 65 20 20 20 20 20 (type
8ce0: 20 20 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64 (list-ref pad
8cf0: 64 65 64 2d 72 6f 77 20 38 29 29 29 0a 09 20 3b ded-row 8))).. ;
8d00: 3b 20 6c 6f 6f 6b 20 75 70 20 65 78 70 65 63 74 ; look up expect
8d10: 65 64 2c 74 6f 6c 2c 75 6e 69 74 73 20 66 72 6f ed,tol,units fro
8d20: 6d 20 70 72 65 76 69 6f 75 73 20 62 65 73 74 20 m previous best
8d30: 66 69 74 20 74 65 73 74 20 69 66 20 74 68 65 79 fit test if they
8d40: 20 61 72 65 20 61 6c 6c 20 65 69 74 68 65 72 20 are all either
8d50: 23 66 20 6f 72 20 27 27 0a 09 20 28 64 65 62 75 #f or ''.. (debu
8d60: 67 3a 70 72 69 6e 74 20 34 20 22 42 45 46 4f 52 g:print 4 "BEFOR
8d70: 45 3a 20 63 61 74 65 67 6f 72 79 3a 20 22 20 63 E: category: " c
8d80: 61 74 65 67 6f 72 79 20 22 20 76 61 72 69 61 62 ategory " variab
8d90: 6c 65 3a 20 22 20 76 61 72 69 61 62 6c 65 20 22 le: " variable "
8da0: 20 76 61 6c 75 65 3a 20 22 20 76 61 6c 75 65 20 value: " value
8db0: 0a 09 09 20 20 20 20 20 20 22 2c 20 65 78 70 65 ... ", expe
8dc0: 63 74 65 64 3a 20 22 20 65 78 70 65 63 74 65 64 cted: " expected
8dd0: 20 22 20 74 6f 6c 3a 20 22 20 74 6f 6c 20 22 20 " tol: " tol "
8de0: 75 6e 69 74 73 3a 20 22 20 75 6e 69 74 73 20 22 units: " units "
8df0: 20 73 74 61 74 75 73 3a 20 22 20 73 74 61 74 75 status: " statu
8e00: 73 20 22 20 63 6f 6d 6d 65 6e 74 3a 20 22 20 63 s " comment: " c
8e10: 6f 6d 6d 65 6e 74 20 22 20 74 79 70 65 3a 20 22 omment " type: "
8e20: 20 74 79 70 65 29 0a 0a 09 20 28 69 66 20 28 61 type)... (if (a
8e30: 6e 64 20 28 6f 72 20 28 6e 6f 74 20 65 78 70 65 nd (or (not expe
8e40: 63 74 65 64 29 28 65 71 75 61 6c 3f 20 65 78 70 cted)(equal? exp
8e50: 65 63 74 65 64 20 22 22 29 29 0a 09 09 20 20 28 ected ""))... (
8e60: 6f 72 20 28 6e 6f 74 20 74 6f 6c 29 20 20 20 20 or (not tol)
8e70: 20 28 65 71 75 61 6c 3f 20 65 78 70 65 63 74 65 (equal? expecte
8e80: 64 20 22 22 29 29 0a 09 09 20 20 28 6f 72 20 28 d ""))... (or (
8e90: 6e 6f 74 20 75 6e 69 74 73 29 20 20 20 28 65 71 not units) (eq
8ea0: 75 61 6c 3f 20 65 78 70 65 63 74 65 64 20 22 22 ual? expected ""
8eb0: 29 29 29 0a 09 20 20 20 20 20 28 6c 65 74 2d 76 ))).. (let-v
8ec0: 61 6c 75 65 73 20 28 28 28 6e 65 77 2d 65 78 70 alues (((new-exp
8ed0: 65 63 74 65 64 20 6e 65 77 2d 74 6f 6c 20 6e 65 ected new-tol ne
8ee0: 77 2d 75 6e 69 74 73 29 28 64 62 3a 67 65 74 2d w-units)(db:get-
8ef0: 70 72 65 76 2d 74 6f 6c 2d 66 6f 72 2d 74 65 73 prev-tol-for-tes
8f00: 74 20 64 62 20 74 65 73 74 2d 69 64 20 63 61 74 t db test-id cat
8f10: 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65 29 29 egory variable))
8f20: 29 0a 09 09 09 20 28 73 65 74 21 20 65 78 70 65 ).... (set! expe
8f30: 63 74 65 64 20 6e 65 77 2d 65 78 70 65 63 74 65 cted new-expecte
8f40: 64 29 0a 09 09 09 20 28 73 65 74 21 20 74 6f 6c d).... (set! tol
8f50: 20 20 20 20 20 20 6e 65 77 2d 74 6f 6c 29 0a 09 new-tol)..
8f60: 09 09 20 28 73 65 74 21 20 75 6e 69 74 73 20 20 .. (set! units
8f70: 20 20 6e 65 77 2d 75 6e 69 74 73 29 29 29 0a 0a new-units)))..
8f80: 09 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 . (debug:print 4
8f90: 20 22 41 46 54 45 52 3a 20 20 63 61 74 65 67 6f "AFTER: catego
8fa0: 72 79 3a 20 22 20 63 61 74 65 67 6f 72 79 20 22 ry: " category "
8fb0: 20 76 61 72 69 61 62 6c 65 3a 20 22 20 76 61 72 variable: " var
8fc0: 69 61 62 6c 65 20 22 20 76 61 6c 75 65 3a 20 22 iable " value: "
8fd0: 20 76 61 6c 75 65 20 0a 09 09 20 20 20 20 20 20 value ...
8fe0: 22 2c 20 65 78 70 65 63 74 65 64 3a 20 22 20 65 ", expected: " e
8ff0: 78 70 65 63 74 65 64 20 22 20 74 6f 6c 3a 20 22 xpected " tol: "
9000: 20 74 6f 6c 20 22 20 75 6e 69 74 73 3a 20 22 20 tol " units: "
9010: 75 6e 69 74 73 20 22 20 73 74 61 74 75 73 3a 20 units " status:
9020: 22 20 73 74 61 74 75 73 20 22 20 63 6f 6d 6d 65 " status " comme
9030: 6e 74 3a 20 22 20 63 6f 6d 6d 65 6e 74 29 0a 09 nt: " comment)..
9040: 20 3b 3b 20 63 61 6c 63 75 6c 61 74 65 20 73 74 ;; calculate st
9050: 61 74 75 73 20 69 66 20 4e 4f 54 20 73 70 65 63 atus if NOT spec
9060: 69 66 69 65 64 0a 09 20 28 69 66 20 28 61 6e 64 ified.. (if (and
9070: 20 28 6e 6f 74 20 73 74 61 74 75 73 29 28 6e 75 (not status)(nu
9080: 6d 62 65 72 3f 20 65 78 70 65 63 74 65 64 29 28 mber? expected)(
9090: 6e 75 6d 62 65 72 3f 20 76 61 6c 75 65 29 29 20 number? value))
90a0: 3b 3b 20 6e 65 65 64 20 65 78 70 65 63 74 65 64 ;; need expected
90b0: 20 61 6e 64 20 76 61 6c 75 65 20 74 6f 20 62 65 and value to be
90c0: 20 6e 75 6d 62 65 72 73 0a 09 20 20 20 20 20 28 numbers.. (
90d0: 69 66 20 28 6e 75 6d 62 65 72 3f 20 74 6f 6c 29 if (number? tol)
90e0: 20 3b 3b 20 69 66 20 74 6f 6c 20 69 73 20 61 20 ;; if tol is a
90f0: 6e 75 6d 62 65 72 20 74 68 65 6e 20 77 65 20 64 number then we d
9100: 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 63 o the standard c
9110: 6f 6d 70 61 72 69 73 6f 6e 0a 09 09 20 28 6c 65 omparison... (le
9120: 74 2a 20 28 28 6d 61 78 2d 76 61 6c 20 28 2b 20 t* ((max-val (+
9130: 65 78 70 65 63 74 65 64 20 74 6f 6c 29 29 0a 09 expected tol))..
9140: 09 09 28 6d 69 6e 2d 76 61 6c 20 28 2d 20 65 78 ..(min-val (- ex
9150: 70 65 63 74 65 64 20 74 6f 6c 29 29 0a 09 09 09 pected tol))....
9160: 28 72 65 73 75 6c 74 20 20 28 61 6e 64 20 28 3e (result (and (>
9170: 3d 20 20 76 61 6c 75 65 20 6d 69 6e 2d 76 61 6c = value min-val
9180: 29 28 3c 3d 20 76 61 6c 75 65 20 6d 61 78 2d 76 )(<= value max-v
9190: 61 6c 29 29 29 29 0a 09 09 20 20 20 28 64 65 62 al))))... (deb
91a0: 75 67 3a 70 72 69 6e 74 20 34 20 22 6d 61 78 2d ug:print 4 "max-
91b0: 76 61 6c 3a 20 22 20 6d 61 78 2d 76 61 6c 20 22 val: " max-val "
91c0: 20 6d 69 6e 2d 76 61 6c 3a 20 22 20 6d 69 6e 2d min-val: " min-
91d0: 76 61 6c 20 22 20 72 65 73 75 6c 74 3a 20 22 20 val " result: "
91e0: 72 65 73 75 6c 74 29 0a 09 09 20 20 20 28 73 65 result)... (se
91f0: 74 21 20 73 74 61 74 75 73 20 28 69 66 20 72 65 t! status (if re
9200: 73 75 6c 74 20 22 70 61 73 73 22 20 22 66 61 69 sult "pass" "fai
9210: 6c 22 29 29 29 0a 09 09 20 28 73 65 74 21 20 73 l")))... (set! s
9220: 74 61 74 75 73 20 3b 3b 20 4e 42 2f 2f 20 6e 65 tatus ;; NB// ne
9230: 65 64 20 74 6f 20 61 73 73 65 73 73 20 65 61 63 ed to assess eac
9240: 68 20 6f 6e 65 20 28 69 2e 65 2e 20 6e 6f 74 20 h one (i.e. not
9250: 72 65 74 75 72 6e 20 6f 70 65 72 61 74 6f 72 20 return operator
9260: 73 69 6e 63 65 20 6e 65 65 64 20 74 6f 20 61 63 since need to ac
9270: 74 20 69 66 20 6e 6f 74 20 76 61 6c 69 64 20 6f t if not valid o
9280: 70 2e 0a 09 09 20 20 20 20 20 20 20 28 63 61 73 p.... (cas
9290: 65 20 28 73 74 72 69 6e 67 2d 3e 73 79 6d 62 6f e (string->symbo
92a0: 6c 20 74 6f 6c 29 20 3b 3b 20 74 6f 6c 20 73 68 l tol) ;; tol sh
92b0: 6f 75 6c 64 20 62 65 20 3e 2c 20 3c 2c 20 3e 3d ould be >, <, >=
92c0: 2c 20 3c 3d 0a 09 09 09 20 28 28 3e 29 20 20 28 , <=.... ((>) (
92d0: 69 66 20 28 3e 20 20 76 61 6c 75 65 20 65 78 70 if (> value exp
92e0: 65 63 74 65 64 29 20 22 70 61 73 73 22 20 22 66 ected) "pass" "f
92f0: 61 69 6c 22 29 29 0a 09 09 09 20 28 28 3c 29 20 ail")).... ((<)
9300: 20 28 69 66 20 28 3c 20 20 76 61 6c 75 65 20 65 (if (< value e
9310: 78 70 65 63 74 65 64 29 20 22 70 61 73 73 22 20 xpected) "pass"
9320: 22 66 61 69 6c 22 29 29 0a 09 09 09 20 28 28 3e "fail")).... ((>
9330: 3d 29 20 28 69 66 20 28 3e 3d 20 76 61 6c 75 65 =) (if (>= value
9340: 20 65 78 70 65 63 74 65 64 29 20 22 70 61 73 73 expected) "pass
9350: 22 20 22 66 61 69 6c 22 29 29 0a 09 09 09 20 28 " "fail")).... (
9360: 28 3c 3d 29 20 28 69 66 20 28 3c 3d 20 76 61 6c (<=) (if (<= val
9370: 75 65 20 65 78 70 65 63 74 65 64 29 20 22 70 61 ue expected) "pa
9380: 73 73 22 20 22 66 61 69 6c 22 29 29 0a 09 09 09 ss" "fail"))....
9390: 20 28 65 6c 73 65 20 28 63 6f 6e 63 20 22 45 52 (else (conc "ER
93a0: 52 4f 52 3a 20 62 61 64 20 74 6f 6c 20 63 6f 6d ROR: bad tol com
93b0: 70 61 72 61 74 6f 72 20 22 20 74 6f 6c 29 29 29 parator " tol)))
93c0: 29 29 29 0a 09 20 28 64 65 62 75 67 3a 70 72 69 ))).. (debug:pri
93d0: 6e 74 20 34 20 22 41 46 54 45 52 32 3a 20 63 61 nt 4 "AFTER2: ca
93e0: 74 65 67 6f 72 79 3a 20 22 20 63 61 74 65 67 6f tegory: " catego
93f0: 72 79 20 22 20 76 61 72 69 61 62 6c 65 3a 20 22 ry " variable: "
9400: 20 76 61 72 69 61 62 6c 65 20 22 20 76 61 6c 75 variable " valu
9410: 65 3a 20 22 20 76 61 6c 75 65 20 0a 09 09 20 20 e: " value ...
9420: 20 20 20 20 22 2c 20 65 78 70 65 63 74 65 64 3a ", expected:
9430: 20 22 20 65 78 70 65 63 74 65 64 20 22 20 74 6f " expected " to
9440: 6c 3a 20 22 20 74 6f 6c 20 22 20 75 6e 69 74 73 l: " tol " units
9450: 3a 20 22 20 75 6e 69 74 73 20 22 20 73 74 61 74 : " units " stat
9460: 75 73 3a 20 22 20 73 74 61 74 75 73 20 22 20 63 us: " status " c
9470: 6f 6d 6d 65 6e 74 3a 20 22 20 63 6f 6d 6d 65 6e omment: " commen
9480: 74 29 0a 09 20 28 73 71 6c 69 74 65 33 3a 65 78 t).. (sqlite3:ex
9490: 65 63 75 74 65 20 64 62 20 22 49 4e 53 45 52 54 ecute db "INSERT
94a0: 20 4f 52 20 52 45 50 4c 41 43 45 20 49 4e 54 4f OR REPLACE INTO
94b0: 20 74 65 73 74 5f 64 61 74 61 20 28 74 65 73 74 test_data (test
94c0: 5f 69 64 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 _id,category,var
94d0: 69 61 62 6c 65 2c 76 61 6c 75 65 2c 65 78 70 65 iable,value,expe
94e0: 63 74 65 64 2c 74 6f 6c 2c 75 6e 69 74 73 2c 63 cted,tol,units,c
94f0: 6f 6d 6d 65 6e 74 2c 73 74 61 74 75 73 2c 74 79 omment,status,ty
9500: 70 65 29 20 56 41 4c 55 45 53 20 28 3f 2c 3f 2c pe) VALUES (?,?,
9510: 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 29 ?,?,?,?,?,?,?,?)
9520: 3b 22 0a 09 09 09 20 20 74 65 73 74 2d 69 64 20 ;".... test-id
9530: 63 61 74 65 67 6f 72 79 20 76 61 72 69 61 62 6c category variabl
9540: 65 20 76 61 6c 75 65 20 65 78 70 65 63 74 65 64 e value expected
9550: 20 74 6f 6c 20 75 6e 69 74 73 20 28 69 66 20 63 tol units (if c
9560: 6f 6d 6d 65 6e 74 20 63 6f 6d 6d 65 6e 74 20 22 omment comment "
9570: 22 29 20 73 74 61 74 75 73 20 74 79 70 65 29 29 ") status type))
9580: 29 0a 20 20 20 20 20 63 73 76 6c 69 73 74 29 29 ). csvlist))
9590: 29 0a 0a 3b 3b 20 67 65 74 20 61 20 6c 69 73 74 )..;; get a list
95a0: 20 6f 66 20 74 65 73 74 5f 64 61 74 61 20 72 65 of test_data re
95b0: 63 6f 72 64 73 20 6d 61 74 63 68 69 6e 67 20 63 cords matching c
95c0: 61 74 65 67 6f 72 79 70 61 74 74 0a 28 64 65 66 ategorypatt.(def
95d0: 69 6e 65 20 28 64 62 3a 72 65 61 64 2d 74 65 73 ine (db:read-tes
95e0: 74 2d 64 61 74 61 20 64 62 20 74 65 73 74 2d 69 t-data db test-i
95f0: 64 20 63 61 74 65 67 6f 72 79 70 61 74 74 29 0a d categorypatt).
9600: 20 20 28 6c 65 74 20 28 28 72 65 73 20 27 28 29 (let ((res '()
9610: 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a )). (sqlite3:
9620: 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20 for-each-row .
9630: 20 20 20 28 6c 61 6d 62 64 61 20 28 69 64 20 74 (lambda (id t
9640: 65 73 74 5f 69 64 20 63 61 74 65 67 6f 72 79 20 est_id category
9650: 76 61 72 69 61 62 6c 65 20 76 61 6c 75 65 20 65 variable value e
9660: 78 70 65 63 74 65 64 20 74 6f 6c 20 75 6e 69 74 xpected tol unit
9670: 73 20 63 6f 6d 6d 65 6e 74 20 73 74 61 74 75 73 s comment status
9680: 20 74 79 70 65 29 0a 20 20 20 20 20 20 20 28 73 type). (s
9690: 65 74 21 20 72 65 73 20 28 63 6f 6e 73 20 28 76 et! res (cons (v
96a0: 65 63 74 6f 72 20 69 64 20 74 65 73 74 5f 69 64 ector id test_id
96b0: 20 63 61 74 65 67 6f 72 79 20 76 61 72 69 61 62 category variab
96c0: 6c 65 20 76 61 6c 75 65 20 65 78 70 65 63 74 65 le value expecte
96d0: 64 20 74 6f 6c 20 75 6e 69 74 73 20 63 6f 6d 6d d tol units comm
96e0: 65 6e 74 20 73 74 61 74 75 73 20 74 79 70 65 29 ent status type)
96f0: 20 72 65 73 29 29 29 0a 20 20 20 20 20 64 62 0a res))). db.
9700: 20 20 20 20 20 22 53 45 4c 45 43 54 20 69 64 2c "SELECT id,
9710: 74 65 73 74 5f 69 64 2c 63 61 74 65 67 6f 72 79 test_id,category
9720: 2c 76 61 72 69 61 62 6c 65 2c 76 61 6c 75 65 2c ,variable,value,
9730: 65 78 70 65 63 74 65 64 2c 74 6f 6c 2c 75 6e 69 expected,tol,uni
9740: 74 73 2c 63 6f 6d 6d 65 6e 74 2c 73 74 61 74 75 ts,comment,statu
9750: 73 2c 74 79 70 65 20 46 52 4f 4d 20 74 65 73 74 s,type FROM test
9760: 5f 64 61 74 61 20 57 48 45 52 45 20 74 65 73 74 _data WHERE test
9770: 5f 69 64 3d 3f 20 41 4e 44 20 63 61 74 65 67 6f _id=? AND catego
9780: 72 79 20 4c 49 4b 45 20 3f 20 4f 52 44 45 52 20 ry LIKE ? ORDER
9790: 42 59 20 63 61 74 65 67 6f 72 79 2c 76 61 72 69 BY category,vari
97a0: 61 62 6c 65 3b 22 20 74 65 73 74 2d 69 64 20 63 able;" test-id c
97b0: 61 74 65 67 6f 72 79 70 61 74 74 29 0a 20 20 20 ategorypatt).
97c0: 20 28 72 65 76 65 72 73 65 20 72 65 73 29 29 29 (reverse res)))
97d0: 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 6c 6f ..(define (db:lo
97e0: 61 64 2d 74 65 73 74 2d 64 61 74 61 20 64 62 20 ad-test-data db
97f0: 74 65 73 74 2d 69 64 29 0a 20 20 28 6c 65 74 20 test-id). (let
9800: 6c 6f 6f 70 20 28 28 6c 69 6e 20 28 72 65 61 64 loop ((lin (read
9810: 2d 6c 69 6e 65 29 29 29 0a 20 20 20 20 28 69 66 -line))). (if
9820: 20 28 6e 6f 74 20 28 65 6f 66 2d 6f 62 6a 65 63 (not (eof-objec
9830: 74 3f 20 6c 69 6e 29 29 0a 09 28 62 65 67 69 6e t? lin))..(begin
9840: 0a 09 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 .. (debug:print
9850: 20 34 20 6c 69 6e 29 0a 09 20 20 28 72 64 62 3a 4 lin).. (rdb:
9860: 63 73 76 2d 3e 74 65 73 74 2d 64 61 74 61 20 64 csv->test-data d
9870: 62 20 74 65 73 74 2d 69 64 20 6c 69 6e 29 0a 09 b test-id lin)..
9880: 20 20 28 6c 6f 6f 70 20 28 72 65 61 64 2d 6c 69 (loop (read-li
9890: 6e 65 29 29 29 29 29 0a 20 20 3b 3b 20 72 6f 6c ne))))). ;; rol
98a0: 6c 20 75 70 20 74 68 65 20 63 75 72 72 65 6e 74 l up the current
98b0: 20 72 65 73 75 6c 74 73 2e 0a 20 20 3b 3b 20 46 results.. ;; F
98c0: 49 58 4d 45 3a 20 41 64 64 20 74 68 65 20 73 74 IXME: Add the st
98d0: 61 74 75 73 20 74 6f 20 0a 20 20 28 72 64 62 3a atus to . (rdb:
98e0: 74 65 73 74 2d 64 61 74 61 2d 72 6f 6c 6c 75 70 test-data-rollup
98f0: 20 64 62 20 74 65 73 74 2d 69 64 20 23 66 29 29 db test-id #f))
9900: 0a 0a 3b 3b 20 57 41 52 4e 49 4e 47 3a 20 44 6f ..;; WARNING: Do
9910: 20 4e 4f 54 20 63 61 6c 6c 20 74 68 69 73 20 66 NOT call this f
9920: 6f 72 20 74 68 65 20 70 61 72 65 6e 74 20 74 65 or the parent te
9930: 73 74 20 6f 6e 20 61 6e 20 69 74 65 72 61 74 65 st on an iterate
9940: 64 20 74 65 73 74 0a 3b 3b 20 52 6f 6c 6c 20 75 d test.;; Roll u
9950: 70 20 74 65 73 74 5f 64 61 74 61 20 70 61 73 73 p test_data pass
9960: 2f 66 61 69 6c 20 72 65 73 75 6c 74 73 0a 3b 3b /fail results.;;
9970: 20 6c 6f 6f 6b 20 61 74 20 74 68 65 20 74 65 73 look at the tes
9980: 74 5f 64 61 74 61 20 73 74 61 74 75 73 20 66 69 t_data status fi
9990: 65 6c 64 2c 20 0a 3b 3b 20 20 20 20 69 66 20 61 eld, .;; if a
99a0: 6c 6c 20 61 72 65 20 70 61 73 73 20 28 61 6e 79 ll are pass (any
99b0: 20 63 61 73 65 29 20 61 6e 64 20 74 68 65 20 74 case) and the t
99c0: 65 73 74 20 73 74 61 74 75 73 20 69 73 20 50 41 est status is PA
99d0: 53 53 20 6f 72 20 4e 55 4c 4c 20 6f 72 20 27 27 SS or NULL or ''
99e0: 20 74 68 65 6e 20 73 65 74 20 74 65 73 74 20 73 then set test s
99f0: 74 61 74 75 73 20 74 6f 20 50 41 53 53 2e 0a 3b tatus to PASS..;
9a00: 3b 20 20 20 20 69 66 20 6f 6e 65 20 6f 72 20 6d ; if one or m
9a10: 6f 72 65 20 61 72 65 20 66 61 69 6c 20 28 61 6e ore are fail (an
9a20: 79 20 63 61 73 65 29 20 74 68 65 6e 20 73 65 74 y case) then set
9a30: 20 74 65 73 74 20 73 74 61 74 75 73 20 74 6f 20 test status to
9a40: 50 41 53 53 2c 20 6e 6f 6e 20 22 70 61 73 73 22 PASS, non "pass"
9a50: 20 6f 72 20 22 66 61 69 6c 22 20 61 72 65 20 69 or "fail" are i
9a60: 67 6e 6f 72 65 64 0a 28 64 65 66 69 6e 65 20 28 gnored.(define (
9a70: 64 62 3a 74 65 73 74 2d 64 61 74 61 2d 72 6f 6c db:test-data-rol
9a80: 6c 75 70 20 64 62 20 74 65 73 74 2d 69 64 20 73 lup db test-id s
9a90: 74 61 74 75 73 29 0a 20 20 28 73 71 6c 69 74 65 tatus). (sqlite
9aa0: 33 3a 65 78 65 63 75 74 65 20 0a 20 20 20 64 62 3:execute . db
9ab0: 20 0a 20 20 20 22 55 50 44 41 54 45 20 74 65 73 . "UPDATE tes
9ac0: 74 73 20 0a 20 20 20 20 20 20 53 45 54 20 66 61 ts . SET fa
9ad0: 69 6c 5f 63 6f 75 6e 74 3d 28 53 45 4c 45 43 54 il_count=(SELECT
9ae0: 20 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 count(id) FROM
9af0: 74 65 73 74 5f 64 61 74 61 20 57 48 45 52 45 20 test_data WHERE
9b00: 74 65 73 74 5f 69 64 3d 3f 20 41 4e 44 20 73 74 test_id=? AND st
9b10: 61 74 75 73 20 6c 69 6b 65 20 27 66 61 69 6c 27 atus like 'fail'
9b20: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 70 61 73 ),. pas
9b30: 73 5f 63 6f 75 6e 74 3d 28 53 45 4c 45 43 54 20 s_count=(SELECT
9b40: 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 74 count(id) FROM t
9b50: 65 73 74 5f 64 61 74 61 20 57 48 45 52 45 20 74 est_data WHERE t
9b60: 65 73 74 5f 69 64 3d 3f 20 41 4e 44 20 73 74 61 est_id=? AND sta
9b70: 74 75 73 20 6c 69 6b 65 20 27 70 61 73 73 27 29 tus like 'pass')
9b80: 0a 20 20 20 20 20 20 57 48 45 52 45 20 69 64 3d . WHERE id=
9b90: 3f 3b 22 0a 20 20 20 74 65 73 74 2d 69 64 20 74 ?;". test-id t
9ba0: 65 73 74 2d 69 64 20 74 65 73 74 2d 69 64 29 0a est-id test-id).
9bb0: 20 20 3b 3b 20 69 66 20 74 68 65 20 74 65 73 74 ;; if the test
9bc0: 20 69 73 20 6e 6f 74 20 46 41 49 4c 20 74 68 65 is not FAIL the
9bd0: 6e 20 73 65 74 20 73 74 61 74 75 73 20 62 61 73 n set status bas
9be0: 65 64 20 6f 6e 20 74 68 65 20 66 61 69 6c 20 61 ed on the fail a
9bf0: 6e 64 20 70 61 73 73 20 63 6f 75 6e 74 73 2e 0a nd pass counts..
9c00: 20 20 28 74 68 72 65 61 64 2d 73 6c 65 65 70 21 (thread-sleep!
9c10: 20 31 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 1). (sqlite3:e
9c20: 78 65 63 75 74 65 0a 20 20 20 64 62 20 20 20 3b xecute. db ;
9c30: 3b 3b 20 4e 4f 54 45 3a 20 53 68 6f 75 6c 64 20 ;; NOTE: Should
9c40: 74 68 69 73 20 62 65 20 57 41 52 4e 2c 46 41 49 this be WARN,FAI
9c50: 4c 3f 20 41 20 57 41 52 4e 20 69 73 20 6e 6f 74 L? A WARN is not
9c60: 20 61 20 46 41 49 4c 3f 3f 3f 3f 3f 20 42 55 47 a FAIL????? BUG
9c70: 20 46 49 58 4d 45 0a 20 20 20 22 55 50 44 41 54 FIXME. "UPDAT
9c80: 45 20 74 65 73 74 73 0a 20 20 20 20 20 20 53 45 E tests. SE
9c90: 54 20 73 74 61 74 75 73 3d 43 41 53 45 20 57 48 T status=CASE WH
9ca0: 45 4e 20 28 53 45 4c 45 43 54 20 66 61 69 6c 5f EN (SELECT fail_
9cb0: 63 6f 75 6e 74 20 46 52 4f 4d 20 74 65 73 74 73 count FROM tests
9cc0: 20 57 48 45 52 45 20 69 64 3d 3f 29 20 3e 20 30 WHERE id=?) > 0
9cd0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
9ce0: 20 20 20 20 20 20 20 20 20 20 20 54 48 45 4e 20 THEN
9cf0: 27 46 41 49 4c 27 0a 20 20 20 20 20 20 20 20 20 'FAIL'.
9d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 WHE
9d10: 4e 20 28 53 45 4c 45 43 54 20 70 61 73 73 5f 63 N (SELECT pass_c
9d20: 6f 75 6e 74 20 46 52 4f 4d 20 74 65 73 74 73 20 ount FROM tests
9d30: 57 48 45 52 45 20 69 64 3d 3f 29 20 3e 20 30 20 WHERE id=?) > 0
9d40: 41 4e 44 20 0a 20 20 20 20 20 20 20 20 20 20 20 AND .
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9d60: 28 53 45 4c 45 43 54 20 73 74 61 74 75 73 20 46 (SELECT status F
9d70: 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 ROM tests WHERE
9d80: 69 64 3d 3f 29 20 4e 4f 54 20 49 4e 20 28 27 57 id=?) NOT IN ('W
9d90: 41 52 4e 27 2c 27 46 41 49 4c 27 29 0a 20 20 20 ARN','FAIL').
9da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
9db0: 20 20 20 20 20 20 54 48 45 4e 20 27 50 41 53 53 THEN 'PASS
9dc0: 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 '.
9dd0: 20 20 20 20 20 20 20 20 45 4c 53 45 20 73 74 61 ELSE sta
9de0: 74 75 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 tus.
9df0: 20 20 20 20 20 20 45 4e 44 20 57 48 45 52 45 20 END WHERE
9e00: 69 64 3d 3f 3b 22 0a 20 20 20 74 65 73 74 2d 69 id=?;". test-i
9e10: 64 20 74 65 73 74 2d 69 64 20 74 65 73 74 2d 69 d test-id test-i
9e20: 64 20 74 65 73 74 2d 69 64 29 29 0a 0a 28 64 65 d test-id))..(de
9e30: 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 70 72 65 fine (db:get-pre
9e40: 76 2d 74 6f 6c 2d 66 6f 72 2d 74 65 73 74 20 64 v-tol-for-test d
9e50: 62 20 74 65 73 74 2d 69 64 20 63 61 74 65 67 6f b test-id catego
9e60: 72 79 20 76 61 72 69 61 62 6c 65 29 0a 20 20 3b ry variable). ;
9e70: 3b 20 46 69 6e 69 73 68 20 6d 65 3f 0a 20 20 28 ; Finish me?. (
9e80: 76 61 6c 75 65 73 20 23 66 20 23 66 20 23 66 29 values #f #f #f)
9e90: 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d )..;;===========
9ea0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
9eb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
9ec0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
9ed0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 53 ===========.;; S
9ee0: 20 54 20 45 20 50 20 53 20 0a 3b 3b 3d 3d 3d 3d T E P S .;;====
9ef0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
9f00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
9f10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
9f20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
9f30: 3d 3d 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a ==..(define (db:
9f40: 73 74 65 70 2d 67 65 74 2d 74 69 6d 65 2d 61 73 step-get-time-as
9f50: 2d 73 74 72 69 6e 67 20 76 65 63 29 0a 20 20 28 -string vec). (
9f60: 73 65 63 6f 6e 64 73 2d 3e 74 69 6d 65 2d 73 74 seconds->time-st
9f70: 72 69 6e 67 20 28 64 62 3a 73 74 65 70 2d 67 65 ring (db:step-ge
9f80: 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 76 65 63 t-event_time vec
9f90: 29 29 29 0a 0a 3b 3b 20 64 62 2d 67 65 74 2d 74 )))..;; db-get-t
9fa0: 65 73 74 2d 73 74 65 70 73 2d 66 6f 72 2d 72 75 est-steps-for-ru
9fb0: 6e 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 n.(define (db:ge
9fc0: 74 2d 73 74 65 70 73 2d 66 6f 72 2d 74 65 73 74 t-steps-for-test
9fd0: 20 64 62 20 74 65 73 74 2d 69 64 29 0a 20 20 28 db test-id). (
9fe0: 6c 65 74 20 28 28 72 65 73 20 27 28 29 29 29 0a let ((res '())).
9ff0: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 (sqlite3:for
a000: 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20 20 20 20 -each-row .
a010: 28 6c 61 6d 62 64 61 20 28 69 64 20 74 65 73 74 (lambda (id test
a020: 2d 69 64 20 73 74 65 70 6e 61 6d 65 20 73 74 61 -id stepname sta
a030: 74 65 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d te status event-
a040: 74 69 6d 65 20 6c 6f 67 66 69 6c 65 29 0a 20 20 time logfile).
a050: 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28 (set! res (
a060: 63 6f 6e 73 20 28 76 65 63 74 6f 72 20 69 64 20 cons (vector id
a070: 74 65 73 74 2d 69 64 20 73 74 65 70 6e 61 6d 65 test-id stepname
a080: 20 73 74 61 74 65 20 73 74 61 74 75 73 20 65 76 state status ev
a090: 65 6e 74 2d 74 69 6d 65 20 28 69 66 20 28 73 74 ent-time (if (st
a0a0: 72 69 6e 67 3f 20 6c 6f 67 66 69 6c 65 29 20 6c ring? logfile) l
a0b0: 6f 67 66 69 6c 65 20 22 22 29 29 20 72 65 73 29 ogfile "")) res)
a0c0: 29 29 0a 20 20 20 20 20 64 62 0a 20 20 20 20 20 )). db.
a0d0: 22 53 45 4c 45 43 54 20 69 64 2c 74 65 73 74 5f "SELECT id,test_
a0e0: 69 64 2c 73 74 65 70 6e 61 6d 65 2c 73 74 61 74 id,stepname,stat
a0f0: 65 2c 73 74 61 74 75 73 2c 65 76 65 6e 74 5f 74 e,status,event_t
a100: 69 6d 65 2c 6c 6f 67 66 69 6c 65 20 46 52 4f 4d ime,logfile FROM
a110: 20 74 65 73 74 5f 73 74 65 70 73 20 57 48 45 52 test_steps WHER
a120: 45 20 74 65 73 74 5f 69 64 3d 3f 20 4f 52 44 45 E test_id=? ORDE
a130: 52 20 42 59 20 69 64 20 41 53 43 3b 22 20 3b 3b R BY id ASC;" ;;
a140: 20 65 76 65 6e 74 5f 74 69 6d 65 20 44 45 53 43 event_time DESC
a150: 2c 69 64 20 41 53 43 3b 0a 20 20 20 20 20 74 65 ,id ASC;. te
a160: 73 74 2d 69 64 29 0a 20 20 20 20 28 72 65 76 65 st-id). (reve
a170: 72 73 65 20 72 65 73 29 29 29 0a 0a 3b 3b 20 67 rse res)))..;; g
a180: 65 74 20 61 20 70 72 65 74 74 79 20 74 61 62 6c et a pretty tabl
a190: 65 20 74 6f 20 73 75 6d 6d 61 72 69 7a 65 20 73 e to summarize s
a1a0: 74 65 70 73 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 teps.;;.(define
a1b0: 28 64 62 3a 67 65 74 2d 73 74 65 70 73 2d 74 61 (db:get-steps-ta
a1c0: 62 6c 65 20 64 62 20 74 65 73 74 2d 69 64 29 0a ble db test-id).
a1d0: 20 20 28 6c 65 74 20 28 28 73 74 65 70 73 20 20 (let ((steps
a1e0: 20 28 64 62 3a 67 65 74 2d 73 74 65 70 73 2d 66 (db:get-steps-f
a1f0: 6f 72 2d 74 65 73 74 20 64 62 20 74 65 73 74 2d or-test db test-
a200: 69 64 29 29 29 0a 20 20 20 20 3b 3b 20 6f 72 67 id))). ;; org
a210: 61 6e 69 73 65 20 74 68 65 20 73 74 65 70 73 20 anise the steps
a220: 66 6f 72 20 62 65 74 74 65 72 20 72 65 61 64 61 for better reada
a230: 62 69 6c 69 74 79 0a 20 20 20 20 28 6c 65 74 20 bility. (let
a240: 28 28 72 65 73 20 28 6d 61 6b 65 2d 68 61 73 68 ((res (make-hash
a250: 2d 74 61 62 6c 65 29 29 29 0a 20 20 20 20 20 20 -table))).
a260: 28 66 6f 72 2d 65 61 63 68 20 0a 20 20 20 20 20 (for-each .
a270: 20 20 28 6c 61 6d 62 64 61 20 28 73 74 65 70 29 (lambda (step)
a280: 0a 09 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 .. (debug:print
a290: 36 20 22 73 74 65 70 3d 22 20 73 74 65 70 29 0a 6 "step=" step).
a2a0: 09 20 28 6c 65 74 20 28 28 72 65 63 6f 72 64 20 . (let ((record
a2b0: 28 68 61 73 68 2d 74 61 62 6c 65 2d 72 65 66 2f (hash-table-ref/
a2c0: 64 65 66 61 75 6c 74 20 0a 09 09 09 72 65 73 20 default ....res
a2d0: 0a 09 09 09 28 64 62 3a 73 74 65 70 2d 67 65 74 ....(db:step-get
a2e0: 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70 29 20 -stepname step)
a2f0: 0a 09 09 09 3b 3b 20 20 20 20 20 20 20 20 73 74 ....;; st
a300: 65 70 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 epname
a310: 20 20 20 20 20 20 73 74 61 72 74 20 65 6e 64 20 start end
a320: 73 74 61 74 75 73 20 20 20 20 0a 09 09 09 28 76 status ....(v
a330: 65 63 74 6f 72 20 28 64 62 3a 73 74 65 70 2d 67 ector (db:step-g
a340: 65 74 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70 et-stepname step
a350: 29 20 22 22 20 20 20 22 22 20 22 22 20 20 20 20 ) "" "" ""
a360: 20 22 22 20 22 22 29 29 29 29 0a 09 20 20 20 28 "" "")))).. (
a370: 64 65 62 75 67 3a 70 72 69 6e 74 20 36 20 22 72 debug:print 6 "r
a380: 65 63 6f 72 64 28 62 65 66 6f 72 65 29 20 3d 20 ecord(before) =
a390: 22 20 72 65 63 6f 72 64 20 0a 09 09 09 22 5c 6e " record ...."\n
a3a0: 69 64 3a 20 20 20 20 20 20 20 22 20 28 64 62 3a id: " (db:
a3b0: 73 74 65 70 2d 67 65 74 2d 69 64 20 73 74 65 70 step-get-id step
a3c0: 29 0a 09 09 09 22 5c 6e 73 74 65 70 6e 61 6d 65 )...."\nstepname
a3d0: 3a 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 : " (db:step-get
a3e0: 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70 29 0a -stepname step).
a3f0: 09 09 09 22 5c 6e 73 74 61 74 65 3a 20 20 20 20 ..."\nstate:
a400: 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 " (db:step-get-s
a410: 74 61 74 65 20 73 74 65 70 29 0a 09 09 09 22 5c tate step)...."\
a420: 6e 73 74 61 74 75 73 3a 20 20 20 22 20 28 64 62 nstatus: " (db
a430: 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 74 75 73 :step-get-status
a440: 20 73 74 65 70 29 0a 09 09 09 22 5c 6e 74 69 6d step)...."\ntim
a450: 65 3a 20 20 20 20 20 22 20 28 64 62 3a 73 74 65 e: " (db:ste
a460: 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 p-get-event_time
a470: 20 73 74 65 70 29 29 0a 09 20 20 20 28 63 61 73 step)).. (cas
a480: 65 20 28 73 74 72 69 6e 67 2d 3e 73 79 6d 62 6f e (string->symbo
a490: 6c 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 l (db:step-get-s
a4a0: 74 61 74 65 20 73 74 65 70 29 29 0a 09 20 20 20 tate step))..
a4b0: 20 20 28 28 73 74 61 72 74 29 28 76 65 63 74 6f ((start)(vecto
a4c0: 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 31 20 r-set! record 1
a4d0: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 (db:step-get-eve
a4e0: 6e 74 5f 74 69 6d 65 20 73 74 65 70 29 29 0a 09 nt_time step))..
a4f0: 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 (vector-se
a500: 74 21 20 72 65 63 6f 72 64 20 33 20 28 69 66 20 t! record 3 (if
a510: 28 65 71 75 61 6c 3f 20 28 76 65 63 74 6f 72 2d (equal? (vector-
a520: 72 65 66 20 72 65 63 6f 72 64 20 33 29 20 22 22 ref record 3) ""
a530: 29 0a 09 09 09 09 09 28 64 62 3a 73 74 65 70 2d )......(db:step-
a540: 67 65 74 2d 73 74 61 74 75 73 20 73 74 65 70 29 get-status step)
a550: 29 29 0a 09 20 20 20 20 20 20 28 69 66 20 28 3e )).. (if (>
a560: 20 28 73 74 72 69 6e 67 2d 6c 65 6e 67 74 68 20 (string-length
a570: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 6c 6f 67 (db:step-get-log
a580: 66 69 6c 65 20 73 74 65 70 29 29 0a 09 09 20 20 file step))...
a590: 20 20 20 30 29 0a 09 09 20 20 28 76 65 63 74 6f 0)... (vecto
a5a0: 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 35 20 r-set! record 5
a5b0: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 6c 6f 67 (db:step-get-log
a5c0: 66 69 6c 65 20 73 74 65 70 29 29 29 29 0a 09 20 file step))))..
a5d0: 20 20 20 20 28 28 65 6e 64 29 20 20 0a 09 20 20 ((end) ..
a5e0: 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 (vector-set!
a5f0: 20 72 65 63 6f 72 64 20 32 20 28 61 6e 79 2d 3e record 2 (any->
a600: 6e 75 6d 62 65 72 20 28 64 62 3a 73 74 65 70 2d number (db:step-
a610: 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73 get-event_time s
a620: 74 65 70 29 29 29 0a 09 20 20 20 20 20 20 28 76 tep))).. (v
a630: 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 ector-set! recor
a640: 64 20 33 20 28 64 62 3a 73 74 65 70 2d 67 65 74 d 3 (db:step-get
a650: 2d 73 74 61 74 75 73 20 73 74 65 70 29 29 0a 09 -status step))..
a660: 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 (vector-se
a670: 74 21 20 72 65 63 6f 72 64 20 34 20 28 6c 65 74 t! record 4 (let
a680: 20 28 28 73 74 61 72 74 74 20 28 61 6e 79 2d 3e ((startt (any->
a690: 6e 75 6d 62 65 72 20 28 76 65 63 74 6f 72 2d 72 number (vector-r
a6a0: 65 66 20 72 65 63 6f 72 64 20 31 29 29 29 0a 09 ef record 1)))..
a6b0: 09 09 09 09 20 20 28 65 6e 64 74 20 20 20 28 61 .... (endt (a
a6c0: 6e 79 2d 3e 6e 75 6d 62 65 72 20 28 76 65 63 74 ny->number (vect
a6d0: 6f 72 2d 72 65 66 20 72 65 63 6f 72 64 20 32 29 or-ref record 2)
a6e0: 29 29 29 0a 09 09 09 09 20 20 20 20 20 20 28 64 )))..... (d
a6f0: 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22 72 65 ebug:print 4 "re
a700: 63 6f 72 64 5b 31 5d 3d 22 20 28 76 65 63 74 6f cord[1]=" (vecto
a710: 72 2d 72 65 66 20 72 65 63 6f 72 64 20 31 29 20 r-ref record 1)
a720: 0a 09 09 09 09 09 09 20 20 20 22 2c 20 73 74 61 ....... ", sta
a730: 72 74 74 3d 22 20 73 74 61 72 74 74 20 22 2c 20 rtt=" startt ",
a740: 65 6e 64 74 3d 22 20 65 6e 64 74 0a 09 09 09 09 endt=" endt.....
a750: 09 09 20 20 20 22 2c 20 67 65 74 2d 73 74 61 74 .. ", get-stat
a760: 75 73 3a 20 22 20 28 64 62 3a 73 74 65 70 2d 67 us: " (db:step-g
a770: 65 74 2d 73 74 61 74 75 73 20 73 74 65 70 29 29 et-status step))
a780: 0a 09 09 09 09 20 20 20 20 20 20 28 69 66 20 28 ..... (if (
a790: 61 6e 64 20 28 6e 75 6d 62 65 72 3f 20 73 74 61 and (number? sta
a7a0: 72 74 74 29 28 6e 75 6d 62 65 72 3f 20 65 6e 64 rtt)(number? end
a7b0: 74 29 29 0a 09 09 09 09 09 20 20 28 73 65 63 6f t))...... (seco
a7c0: 6e 64 73 2d 3e 68 72 2d 6d 69 6e 2d 73 65 63 20 nds->hr-min-sec
a7d0: 28 2d 20 65 6e 64 74 20 73 74 61 72 74 74 29 29 (- endt startt))
a7e0: 20 22 2d 31 22 29 29 29 0a 09 20 20 20 20 20 20 "-1")))..
a7f0: 28 69 66 20 28 3e 20 28 73 74 72 69 6e 67 2d 6c (if (> (string-l
a800: 65 6e 67 74 68 20 28 64 62 3a 73 74 65 70 2d 67 ength (db:step-g
a810: 65 74 2d 6c 6f 67 66 69 6c 65 20 73 74 65 70 29 et-logfile step)
a820: 29 0a 09 09 20 20 20 20 20 30 29 0a 09 09 20 20 )... 0)...
a830: 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63 (vector-set! rec
a840: 6f 72 64 20 35 20 28 64 62 3a 73 74 65 70 2d 67 ord 5 (db:step-g
a850: 65 74 2d 6c 6f 67 66 69 6c 65 20 73 74 65 70 29 et-logfile step)
a860: 29 29 29 0a 09 20 20 20 20 20 28 65 6c 73 65 0a ))).. (else.
a870: 09 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73 . (vector-s
a880: 65 74 21 20 72 65 63 6f 72 64 20 32 20 28 64 62 et! record 2 (db
a890: 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 74 65 20 :step-get-state
a8a0: 73 74 65 70 29 29 0a 09 20 20 20 20 20 20 28 76 step)).. (v
a8b0: 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 ector-set! recor
a8c0: 64 20 33 20 28 64 62 3a 73 74 65 70 2d 67 65 74 d 3 (db:step-get
a8d0: 2d 73 74 61 74 75 73 20 73 74 65 70 29 29 0a 09 -status step))..
a8e0: 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 (vector-se
a8f0: 74 21 20 72 65 63 6f 72 64 20 34 20 28 64 62 3a t! record 4 (db:
a900: 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 step-get-event_t
a910: 69 6d 65 20 73 74 65 70 29 29 29 29 0a 09 20 20 ime step))))..
a920: 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 73 65 74 (hash-table-set
a930: 21 20 72 65 73 20 28 64 62 3a 73 74 65 70 2d 67 ! res (db:step-g
a940: 65 74 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70 et-stepname step
a950: 29 20 72 65 63 6f 72 64 29 0a 09 20 20 20 28 64 ) record).. (d
a960: 65 62 75 67 3a 70 72 69 6e 74 20 36 20 22 72 65 ebug:print 6 "re
a970: 63 6f 72 64 28 61 66 74 65 72 29 20 20 3d 20 22 cord(after) = "
a980: 20 72 65 63 6f 72 64 20 0a 09 09 09 22 5c 6e 69 record ...."\ni
a990: 64 3a 20 20 20 20 20 20 20 22 20 28 64 62 3a 73 d: " (db:s
a9a0: 74 65 70 2d 67 65 74 2d 69 64 20 73 74 65 70 29 tep-get-id step)
a9b0: 0a 09 09 09 22 5c 6e 73 74 65 70 6e 61 6d 65 3a ...."\nstepname:
a9c0: 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d " (db:step-get-
a9d0: 73 74 65 70 6e 61 6d 65 20 73 74 65 70 29 0a 09 stepname step)..
a9e0: 09 09 22 5c 6e 73 74 61 74 65 3a 20 20 20 20 22 .."\nstate: "
a9f0: 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 (db:step-get-st
aa00: 61 74 65 20 73 74 65 70 29 0a 09 09 09 22 5c 6e ate step)...."\n
aa10: 73 74 61 74 75 73 3a 20 20 20 22 20 28 64 62 3a status: " (db:
aa20: 73 74 65 70 2d 67 65 74 2d 73 74 61 74 75 73 20 step-get-status
aa30: 73 74 65 70 29 0a 09 09 09 22 5c 6e 74 69 6d 65 step)...."\ntime
aa40: 3a 20 20 20 20 20 22 20 28 64 62 3a 73 74 65 70 : " (db:step
aa50: 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 -get-event_time
aa60: 73 74 65 70 29 29 29 29 0a 20 20 20 20 20 20 20 step)))).
aa70: 3b 3b 20 28 65 6c 73 65 20 20 20 28 76 65 63 74 ;; (else (vect
aa80: 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 31 or-set! record 1
aa90: 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 (db:step-get-ev
aaa0: 65 6e 74 5f 74 69 6d 65 20 73 74 65 70 29 29 29 ent_time step)))
aab0: 0a 20 20 20 20 20 20 20 28 73 6f 72 74 20 73 74 . (sort st
aac0: 65 70 73 20 28 6c 61 6d 62 64 61 20 28 61 20 62 eps (lambda (a b
aad0: 29 28 3c 20 28 64 62 3a 73 74 65 70 2d 67 65 74 )(< (db:step-get
aae0: 2d 65 76 65 6e 74 5f 74 69 6d 65 20 61 29 28 64 -event_time a)(d
aaf0: 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 b:step-get-event
ab00: 5f 74 69 6d 65 20 62 29 29 29 29 29 0a 20 20 20 _time b))))).
ab10: 20 20 20 72 65 73 29 29 29 0a 0a 3b 3b 20 74 68 res)))..;; th
ab20: 65 20 6e 65 77 20 70 72 65 72 65 71 73 20 63 61 e new prereqs ca
ab30: 6c 63 75 6c 61 74 69 6f 6e 2c 20 6c 6f 6f 6b 73 lculation, looks
ab40: 20 61 6c 73 6f 20 61 74 20 69 74 65 6d 70 61 74 also at itempat
ab50: 68 20 69 66 20 73 70 65 63 69 66 69 65 64 0a 3b h if specified.;
ab60: 3b 20 61 6c 6c 20 70 72 65 72 65 71 73 20 6d 75 ; all prereqs mu
ab70: 73 74 20 62 65 20 6d 65 74 3a 0a 3b 3b 20 20 20 st be met:.;;
ab80: 20 69 66 20 70 72 65 72 65 71 20 74 65 73 74 20 if prereq test
ab90: 77 69 74 68 20 69 74 65 6d 70 61 74 68 3d 27 27 with itempath=''
aba0: 20 69 73 20 43 4f 4d 50 4c 45 54 45 44 20 61 6e is COMPLETED an
abb0: 64 20 50 41 53 53 2c 20 57 41 52 4e 2c 20 43 48 d PASS, WARN, CH
abc0: 45 43 4b 2c 20 6f 72 20 57 41 49 56 45 44 20 74 ECK, or WAIVED t
abd0: 68 65 6e 20 70 72 65 72 65 71 20 69 73 20 6d 65 hen prereq is me
abe0: 74 0a 3b 3b 20 20 20 20 69 66 20 70 72 65 72 65 t.;; if prere
abf0: 71 20 74 65 73 74 20 77 69 74 68 20 69 74 65 6d q test with item
ac00: 70 61 74 68 3d 72 65 66 2d 69 74 65 6d 2d 70 61 path=ref-item-pa
ac10: 74 68 20 61 6e 64 20 43 4f 4d 50 4c 45 54 45 44 th and COMPLETED
ac20: 20 77 69 74 68 20 50 41 53 53 2c 20 57 41 52 4e with PASS, WARN
ac30: 2c 20 43 48 45 43 4b 2c 20 6f 72 20 57 41 49 56 , CHECK, or WAIV
ac40: 45 44 20 74 68 65 6e 20 70 72 65 72 65 71 20 69 ED then prereq i
ac50: 73 20 6d 65 74 0a 3b 3b 0a 3b 3b 20 4e 6f 74 65 s met.;;.;; Note
ac60: 3a 20 64 6f 20 6e 6f 74 20 63 6f 6e 76 65 72 74 : do not convert
ac70: 20 74 6f 20 72 65 6d 6f 74 65 20 61 73 20 69 74 to remote as it
ac80: 20 63 61 6c 6c 73 20 72 65 6d 6f 74 65 20 75 6e calls remote un
ac90: 64 65 72 20 74 68 65 20 68 6f 6f 64 0a 3b 3b 0a der the hood.;;.
aca0: 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d (define (db:get-
acb0: 70 72 65 72 65 71 73 2d 6e 6f 74 2d 6d 65 74 20 prereqs-not-met
acc0: 64 62 20 72 75 6e 2d 69 64 20 77 61 69 74 6f 6e db run-id waiton
acd0: 73 20 72 65 66 2d 69 74 65 6d 2d 70 61 74 68 29 s ref-item-path)
ace0: 0a 20 20 28 69 66 20 28 6f 72 20 28 6e 6f 74 20 . (if (or (not
acf0: 77 61 69 74 6f 6e 73 29 0a 09 20 20 28 6e 75 6c waitons).. (nul
ad00: 6c 3f 20 77 61 69 74 6f 6e 73 29 29 0a 20 20 20 l? waitons)).
ad10: 20 20 20 27 28 29 0a 20 20 20 20 20 20 28 6c 65 '(). (le
ad20: 74 2a 20 28 28 75 6e 6d 65 74 2d 70 72 65 2d 72 t* ((unmet-pre-r
ad30: 65 71 73 20 27 28 29 29 0a 09 20 20 20 20 20 28 eqs '()).. (
ad40: 72 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 27 result '
ad50: 28 29 29 29 0a 09 28 66 6f 72 2d 65 61 63 68 20 ()))..(for-each
ad60: 0a 09 20 28 6c 61 6d 62 64 61 20 28 77 61 69 74 .. (lambda (wait
ad70: 6f 6e 74 65 73 74 2d 6e 61 6d 65 29 0a 09 20 20 ontest-name)..
ad80: 20 3b 3b 20 62 79 20 67 65 74 74 69 6e 67 20 74 ;; by getting t
ad90: 68 65 20 74 65 73 74 73 20 77 69 74 68 20 6d 61 he tests with ma
ada0: 74 63 68 69 6e 67 20 6e 61 6d 65 20 77 65 20 61 tching name we a
adb0: 72 65 20 6c 6f 6f 6b 69 6e 67 20 6f 6e 6c 79 20 re looking only
adc0: 61 74 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 at the matching
add0: 74 65 73 74 20 0a 09 20 20 20 3b 3b 20 61 6e 64 test .. ;; and
ade0: 20 72 65 6c 61 74 65 64 20 73 75 62 20 69 74 65 related sub ite
adf0: 6d 73 0a 09 20 20 20 28 6c 65 74 20 28 28 74 65 ms.. (let ((te
ae00: 73 74 73 20 20 20 20 20 20 20 20 20 20 20 20 20 sts
ae10: 28 72 64 62 3a 67 65 74 2d 74 65 73 74 73 2d 66 (rdb:get-tests-f
ae20: 6f 72 2d 72 75 6e 20 64 62 20 72 75 6e 2d 69 64 or-run db run-id
ae30: 20 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 waitontest-name
ae40: 20 23 66 20 27 28 29 20 27 28 29 29 29 0a 09 09 #f '() '()))...
ae50: 20 28 65 76 65 72 2d 73 65 65 6e 20 20 20 20 20 (ever-seen
ae60: 20 20 20 20 23 66 29 0a 09 09 20 28 70 61 72 65 #f)... (pare
ae70: 6e 74 2d 77 61 69 74 6f 6e 2d 6d 65 74 20 23 66 nt-waiton-met #f
ae80: 29 0a 09 09 20 28 69 74 65 6d 2d 77 61 69 74 6f )... (item-waito
ae90: 6e 2d 6d 65 74 20 20 20 23 66 29 29 0a 09 20 20 n-met #f))..
aea0: 20 20 20 28 66 6f 72 2d 65 61 63 68 20 0a 09 20 (for-each ..
aeb0: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 74 65 (lambda (te
aec0: 73 74 29 0a 09 09 3b 3b 20 28 69 66 20 28 65 71 st)...;; (if (eq
aed0: 75 61 6c 3f 20 77 61 69 74 6f 6e 74 65 73 74 2d ual? waitontest-
aee0: 6e 61 6d 65 20 28 64 62 3a 74 65 73 74 2d 67 65 name (db:test-ge
aef0: 74 2d 74 65 73 74 6e 61 6d 65 20 74 65 73 74 29 t-testname test)
af00: 29 20 3b 3b 20 62 79 20 64 65 66 69 6e 74 69 6f ) ;; by defintio
af10: 6e 20 74 68 69 73 20 68 61 64 20 62 65 74 74 65 n this had bette
af20: 72 20 62 65 20 74 72 75 65 20 2e 2e 2e 0a 09 09 r be true ......
af30: 28 6c 65 74 2a 20 28 28 73 74 61 74 65 20 20 20 (let* ((state
af40: 20 20 20 20 20 20 20 20 20 20 28 64 62 3a 74 65 (db:te
af50: 73 74 2d 67 65 74 2d 73 74 61 74 65 20 74 65 73 st-get-state tes
af60: 74 29 29 0a 09 09 20 20 20 20 20 20 20 28 73 74 t))... (st
af70: 61 74 75 73 20 20 20 20 20 20 20 20 20 20 20 20 atus
af80: 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 73 74 61 (db:test-get-sta
af90: 74 75 73 20 74 65 73 74 29 29 0a 09 09 20 20 20 tus test))...
afa0: 20 20 20 20 28 69 74 65 6d 2d 70 61 74 68 20 20 (item-path
afb0: 20 20 20 20 20 20 20 28 64 62 3a 74 65 73 74 2d (db:test-
afc0: 67 65 74 2d 69 74 65 6d 2d 70 61 74 68 20 74 65 get-item-path te
afd0: 73 74 29 29 0a 09 09 20 20 20 20 20 20 20 28 69 st))... (i
afe0: 73 2d 63 6f 6d 70 6c 65 74 65 64 20 20 20 20 20 s-completed
aff0: 20 28 65 71 75 61 6c 3f 20 73 74 61 74 65 20 22 (equal? state "
b000: 43 4f 4d 50 4c 45 54 45 44 22 29 29 0a 09 09 20 COMPLETED"))...
b010: 20 20 20 20 20 20 28 69 73 2d 6f 6b 20 20 20 20 (is-ok
b020: 20 20 20 20 20 20 20 20 20 28 6d 65 6d 62 65 72 (member
b030: 20 73 74 61 74 75 73 20 27 28 22 50 41 53 53 22 status '("PASS"
b040: 20 22 57 41 52 4e 22 20 22 43 48 45 43 4b 22 20 "WARN" "CHECK"
b050: 22 57 41 49 56 45 44 22 29 29 29 0a 09 09 20 20 "WAIVED")))...
b060: 20 20 20 20 20 28 73 61 6d 65 2d 69 74 65 6d 70 (same-itemp
b070: 61 74 68 20 20 20 20 20 28 65 71 75 61 6c 3f 20 ath (equal?
b080: 72 65 66 2d 69 74 65 6d 2d 70 61 74 68 20 69 74 ref-item-path it
b090: 65 6d 2d 70 61 74 68 29 29 29 0a 09 09 20 20 28 em-path)))... (
b0a0: 73 65 74 21 20 65 76 65 72 2d 73 65 65 6e 20 23 set! ever-seen #
b0b0: 74 29 0a 09 09 20 20 28 63 6f 6e 64 0a 09 09 20 t)... (cond...
b0c0: 20 20 3b 3b 20 63 61 73 65 20 31 2c 20 6e 6f 6e ;; case 1, non
b0d0: 2d 69 74 65 6d 20 28 70 61 72 65 6e 74 20 74 65 -item (parent te
b0e0: 73 74 29 20 69 73 20 0a 09 09 20 20 20 28 28 61 st) is ... ((a
b0f0: 6e 64 20 28 65 71 75 61 6c 3f 20 69 74 65 6d 2d nd (equal? item-
b100: 70 61 74 68 20 22 22 29 20 3b 3b 20 74 68 69 73 path "") ;; this
b110: 20 69 73 20 74 68 65 20 70 61 72 65 6e 74 20 74 is the parent t
b120: 65 73 74 0a 09 09 09 20 69 73 2d 63 6f 6d 70 6c est.... is-compl
b130: 65 74 65 64 0a 09 09 09 20 69 73 2d 6f 6b 29 0a eted.... is-ok).
b140: 09 09 20 20 20 20 28 73 65 74 21 20 70 61 72 65 .. (set! pare
b150: 6e 74 2d 77 61 69 74 6f 6e 2d 6d 65 74 20 23 74 nt-waiton-met #t
b160: 29 29 0a 09 09 20 20 20 28 28 61 6e 64 20 73 61 ))... ((and sa
b170: 6d 65 2d 69 74 65 6d 70 61 74 68 0a 09 09 09 20 me-itempath....
b180: 69 73 2d 63 6f 6d 70 6c 65 74 65 64 0a 09 09 09 is-completed....
b190: 20 69 73 2d 6f 6b 29 0a 09 09 20 20 20 20 28 73 is-ok)... (s
b1a0: 65 74 21 20 69 74 65 6d 2d 77 61 69 74 6f 6e 2d et! item-waiton-
b1b0: 6d 65 74 20 23 74 29 29 29 29 29 0a 09 20 20 20 met #t)))))..
b1c0: 20 20 20 74 65 73 74 73 29 0a 09 20 20 20 20 20 tests)..
b1d0: 28 69 66 20 28 6e 6f 74 20 28 6f 72 20 70 61 72 (if (not (or par
b1e0: 65 6e 74 2d 77 61 69 74 6f 6e 2d 6d 65 74 20 69 ent-waiton-met i
b1f0: 74 65 6d 2d 77 61 69 74 6f 6e 2d 6d 65 74 29 29 tem-waiton-met))
b200: 0a 09 09 20 28 73 65 74 21 20 72 65 73 75 6c 74 ... (set! result
b210: 20 28 63 6f 6e 73 20 77 61 69 74 6f 6e 74 65 73 (cons waitontes
b220: 74 2d 6e 61 6d 65 20 72 65 73 75 6c 74 29 29 29 t-name result)))
b230: 0a 09 20 20 20 20 20 3b 3b 20 69 66 20 74 68 65 .. ;; if the
b240: 20 74 65 73 74 20 69 73 20 6e 6f 74 20 66 6f 75 test is not fou
b250: 6e 64 20 74 68 65 6e 20 63 6c 65 61 72 6c 79 20 nd then clearly
b260: 74 68 65 20 77 61 69 74 6f 6e 20 69 73 20 6e 6f the waiton is no
b270: 74 20 6d 65 74 2e 2e 2e 0a 09 20 20 20 20 20 28 t met..... (
b280: 69 66 20 28 6e 6f 74 20 65 76 65 72 2d 73 65 65 if (not ever-see
b290: 6e 29 28 73 65 74 21 20 72 65 73 75 6c 74 20 28 n)(set! result (
b2a0: 63 6f 6e 73 20 77 61 69 74 6f 6e 74 65 73 74 2d cons waitontest-
b2b0: 6e 61 6d 65 20 72 65 73 75 6c 74 29 29 29 29 29 name result)))))
b2c0: 0a 09 77 61 69 74 6f 6e 73 29 0a 20 20 20 20 20 ..waitons).
b2d0: 20 28 64 65 6c 65 74 65 2d 64 75 70 6c 69 63 61 (delete-duplica
b2e0: 74 65 73 20 72 65 73 75 6c 74 29 29 29 29 0a 0a tes result))))..
b2f0: 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74 (define (db:test
b300: 73 74 65 70 2d 73 65 74 2d 73 74 61 74 75 73 21 step-set-status!
b310: 20 64 62 20 74 65 73 74 2d 69 64 20 74 65 73 74 db test-id test
b320: 73 74 65 70 2d 6e 61 6d 65 20 73 74 61 74 65 2d step-name state-
b330: 69 6e 20 73 74 61 74 75 73 2d 69 6e 20 69 74 65 in status-in ite
b340: 6d 2d 70 61 74 68 20 63 6f 6d 6d 65 6e 74 20 6c m-path comment l
b350: 6f 67 66 69 6c 65 29 0a 20 20 28 64 65 62 75 67 ogfile). (debug
b360: 3a 70 72 69 6e 74 20 34 20 22 74 65 73 74 2d 69 :print 4 "test-i
b370: 64 3a 20 22 20 74 65 73 74 2d 69 64 20 22 20 74 d: " test-id " t
b380: 65 73 74 73 74 65 70 2d 6e 61 6d 65 3a 20 22 20 eststep-name: "
b390: 74 65 73 74 73 74 65 70 2d 6e 61 6d 65 29 0a 20 teststep-name).
b3a0: 20 28 6c 65 74 2a 20 28 28 73 74 61 74 65 20 20 (let* ((state
b3b0: 20 20 20 28 63 68 65 63 6b 2d 76 61 6c 69 64 2d (check-valid-
b3c0: 69 74 65 6d 73 20 22 73 74 61 74 65 22 20 73 74 items "state" st
b3d0: 61 74 65 2d 69 6e 29 29 0a 09 20 28 73 74 61 74 ate-in)).. (stat
b3e0: 75 73 20 20 20 20 28 63 68 65 63 6b 2d 76 61 6c us (check-val
b3f0: 69 64 2d 69 74 65 6d 73 20 22 73 74 61 74 75 73 id-items "status
b400: 22 20 73 74 61 74 75 73 2d 69 6e 29 29 29 0a 20 " status-in))).
b410: 20 20 20 28 69 66 20 28 6f 72 20 28 6e 6f 74 20 (if (or (not
b420: 73 74 61 74 65 29 28 6e 6f 74 20 73 74 61 74 75 state)(not statu
b430: 73 29 29 0a 09 28 64 65 62 75 67 3a 70 72 69 6e s))..(debug:prin
b440: 74 20 30 20 22 57 41 52 4e 49 4e 47 3a 20 49 6e t 0 "WARNING: In
b450: 76 61 6c 69 64 20 22 20 28 69 66 20 73 74 61 74 valid " (if stat
b460: 75 73 20 22 73 74 61 74 75 73 22 20 22 73 74 61 us "status" "sta
b470: 74 65 22 29 0a 09 09 20 20 20 20 20 22 20 76 61 te")... " va
b480: 6c 75 65 20 5c 22 22 20 28 69 66 20 73 74 61 74 lue \"" (if stat
b490: 75 73 20 73 74 61 74 65 2d 69 6e 20 73 74 61 74 us state-in stat
b4a0: 75 73 2d 69 6e 29 20 22 5c 22 2c 20 75 70 64 61 us-in) "\", upda
b4b0: 74 65 20 79 6f 75 72 20 76 61 6c 69 64 76 61 6c te your validval
b4c0: 75 65 73 20 73 65 63 74 69 6f 6e 20 69 6e 20 6d ues section in m
b4d0: 65 67 61 74 65 73 74 2e 63 6f 6e 66 69 67 22 29 egatest.config")
b4e0: 29 0a 20 20 20 20 28 6d 75 74 65 78 2d 6c 6f 63 ). (mutex-loc
b4f0: 6b 21 20 2a 69 6e 63 6f 6d 69 6e 67 2d 6d 75 74 k! *incoming-mut
b500: 65 78 2a 29 0a 20 20 20 20 28 73 65 74 21 20 2a ex*). (set! *
b510: 69 6e 63 6f 6d 69 6e 67 2d 64 61 74 61 2a 20 28 incoming-data* (
b520: 63 6f 6e 73 20 28 76 65 63 74 6f 72 20 27 73 74 cons (vector 'st
b530: 65 70 2d 73 74 61 74 75 73 0a 09 09 09 09 09 28 ep-status......(
b540: 63 75 72 72 65 6e 74 2d 73 65 63 6f 6e 64 73 29 current-seconds)
b550: 0a 09 09 09 09 09 3b 3b 20 46 49 58 4d 45 20 2d ......;; FIXME -
b560: 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 this should not
b570: 20 75 70 64 61 74 65 20 74 68 65 20 6c 6f 67 66 update the logf
b580: 69 6c 65 20 75 6e 6c 65 73 73 20 69 74 20 69 73 ile unless it is
b590: 20 73 70 65 63 69 66 69 65 64 2e 0a 09 09 09 09 specified......
b5a0: 09 28 6c 69 73 74 20 74 65 73 74 2d 69 64 20 74 .(list test-id t
b5b0: 65 73 74 73 74 65 70 2d 6e 61 6d 65 20 73 74 61 eststep-name sta
b5c0: 74 65 2d 69 6e 20 73 74 61 74 75 73 2d 69 6e 20 te-in status-in
b5d0: 28 63 75 72 72 65 6e 74 2d 73 65 63 6f 6e 64 73 (current-seconds
b5e0: 29 20 28 69 66 20 63 6f 6d 6d 65 6e 74 20 63 6f ) (if comment co
b5f0: 6d 6d 65 6e 74 20 22 22 29 20 28 69 66 20 6c 6f mment "") (if lo
b600: 67 66 69 6c 65 20 6c 6f 67 66 69 6c 65 20 22 22 gfile logfile ""
b610: 29 29 29 0a 09 09 09 09 2a 69 6e 63 6f 6d 69 6e ))).....*incomin
b620: 67 2d 64 61 74 61 2a 29 29 0a 20 20 20 20 28 6d g-data*)). (m
b630: 75 74 65 78 2d 75 6e 6c 6f 63 6b 21 20 2a 69 6e utex-unlock! *in
b640: 63 6f 6d 69 6e 67 2d 6d 75 74 65 78 2a 29 0a 20 coming-mutex*).
b650: 20 20 20 28 69 66 20 28 6e 6f 74 20 2a 63 61 63 (if (not *cac
b660: 68 65 2d 6f 6e 2a 29 28 64 62 3a 77 72 69 74 65 he-on*)(db:write
b670: 2d 63 61 63 68 65 64 2d 64 61 74 61 20 64 62 29 -cached-data db)
b680: 29 0a 20 20 20 20 23 74 29 29 0a 0a 3b 3b 3d 3d ). #t))..;;==
b690: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
b6a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
b6b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
b6c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
b6d0: 3d 3d 3d 3d 0a 3b 3b 20 45 78 74 72 61 63 74 20 ====.;; Extract
b6e0: 6f 64 73 20 66 69 6c 65 20 66 72 6f 6d 20 74 68 ods file from th
b6f0: 65 20 64 62 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d e db.;;=========
b700: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
b710: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
b720: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
b730: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b =============..;
b740: 3b 20 72 75 6e 73 70 61 74 74 20 69 73 20 61 20 ; runspatt is a
b750: 63 6f 6d 6d 61 20 64 65 6c 69 6d 69 74 65 64 20 comma delimited
b760: 6c 69 73 74 20 6f 66 20 72 75 6e 20 70 61 74 74 list of run patt
b770: 65 72 6e 73 0a 3b 3b 20 6b 65 79 70 61 74 74 2d erns.;; keypatt-
b780: 61 6c 69 73 74 20 6d 75 73 74 20 63 6f 6e 74 61 alist must conta
b790: 69 6e 20 2a 61 6c 6c 2a 20 6b 65 79 73 20 77 69 in *all* keys wi
b7a0: 74 68 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64 th an associated
b7b0: 20 70 61 74 74 65 72 6e 3a 20 27 28 20 28 22 4b pattern: '( ("K
b7c0: 45 59 31 22 20 22 25 22 29 20 2e 2e 20 29 0a 28 EY1" "%") .. ).(
b7d0: 64 65 66 69 6e 65 20 28 64 62 3a 65 78 74 72 61 define (db:extra
b7e0: 63 74 2d 6f 64 73 2d 66 69 6c 65 20 64 62 20 6f ct-ods-file db o
b7f0: 75 74 70 75 74 66 69 6c 65 20 6b 65 79 70 61 74 utputfile keypat
b800: 74 2d 61 6c 69 73 74 20 72 75 6e 73 70 61 74 74 t-alist runspatt
b810: 20 70 61 74 68 6d 6f 64 29 0a 20 20 28 6c 65 74 pathmod). (let
b820: 2a 20 28 28 6b 65 79 73 73 74 72 20 20 28 73 74 * ((keysstr (st
b830: 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 ring-intersperse
b840: 20 28 6d 61 70 20 63 61 72 20 6b 65 79 70 61 74 (map car keypat
b850: 74 2d 61 6c 69 73 74 29 20 22 2c 22 29 29 0a 09 t-alist) ","))..
b860: 20 28 6b 65 79 71 72 79 20 20 20 28 73 74 72 69 (keyqry (stri
b870: 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 28 ng-intersperse (
b880: 6d 61 70 20 28 6c 61 6d 62 64 61 20 28 70 29 28 map (lambda (p)(
b890: 63 6f 6e 63 20 28 63 61 72 20 70 29 20 22 20 4c conc (car p) " L
b8a0: 49 4b 45 20 3f 20 22 29 29 20 6b 65 79 70 61 74 IKE ? ")) keypat
b8b0: 74 2d 61 6c 69 73 74 29 20 22 20 41 4e 44 20 22 t-alist) " AND "
b8c0: 29 29 0a 09 20 28 6e 75 6d 6b 65 79 73 20 20 28 )).. (numkeys (
b8d0: 6c 65 6e 67 74 68 20 6b 65 79 70 61 74 74 2d 61 length keypatt-a
b8e0: 6c 69 73 74 29 29 0a 09 20 28 74 65 73 74 2d 69 list)).. (test-i
b8f0: 64 73 20 27 28 29 29 0a 09 20 28 77 69 6e 64 6f ds '()).. (windo
b900: 77 73 20 20 28 61 6e 64 20 70 61 74 68 6d 6f 64 ws (and pathmod
b910: 20 28 73 75 62 73 74 72 69 6e 67 2d 69 6e 64 65 (substring-inde
b920: 78 20 22 5c 5c 22 20 70 61 74 68 6d 6f 64 29 29 x "\\" pathmod))
b930: 29 0a 09 20 28 74 65 6d 70 64 69 72 20 20 28 63 ).. (tempdir (c
b940: 6f 6e 63 20 22 2f 74 6d 70 2f 22 20 28 63 75 72 onc "/tmp/" (cur
b950: 72 65 6e 74 2d 75 73 65 72 2d 6e 61 6d 65 29 20 rent-user-name)
b960: 22 2f 22 20 72 75 6e 73 70 61 74 74 20 22 5f 22 "/" runspatt "_"
b970: 20 28 72 61 6e 64 6f 6d 20 31 30 30 30 30 29 20 (random 10000)
b980: 22 5f 22 20 28 63 75 72 72 65 6e 74 2d 70 72 6f "_" (current-pro
b990: 63 65 73 73 2d 69 64 29 29 29 0a 09 20 28 72 75 cess-id))).. (ru
b9a0: 6e 73 68 65 61 64 65 72 20 28 61 70 70 65 6e 64 nsheader (append
b9b0: 20 28 6c 69 73 74 20 22 52 75 6e 20 49 64 22 20 (list "Run Id"
b9c0: 22 52 75 6e 6e 61 6d 65 22 29 20 3b 20 30 20 31 "Runname") ; 0 1
b9d0: 0a 09 09 09 20 20 20 20 20 28 6d 61 70 20 63 61 .... (map ca
b9e0: 72 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 29 r keypatt-alist)
b9f0: 20 20 20 3b 20 2b 20 4e 20 3d 20 6c 65 6e 67 74 ; + N = lengt
ba00: 68 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 0a h keypatt-alist.
ba10: 09 09 09 20 20 20 20 20 28 6c 69 73 74 20 22 54 ... (list "T
ba20: 65 73 74 6e 61 6d 65 22 20 20 20 20 20 20 20 20 estname"
ba30: 20 20 3b 20 32 0a 09 09 09 09 20 20 20 22 49 74 ; 2..... "It
ba40: 65 6d 20 50 61 74 68 22 20 20 20 20 20 20 20 20 em Path"
ba50: 20 3b 20 33 20 0a 09 09 09 09 20 20 20 22 44 65 ; 3 ..... "De
ba60: 73 63 72 69 70 74 69 6f 6e 22 20 20 20 20 20 20 scription"
ba70: 20 3b 20 34 20 0a 09 09 09 09 20 20 20 22 53 74 ; 4 ..... "St
ba80: 61 74 65 22 20 20 20 20 20 20 20 20 20 20 20 20 ate"
ba90: 20 3b 20 35 20 0a 09 09 09 09 20 20 20 22 53 74 ; 5 ..... "St
baa0: 61 74 75 73 22 20 20 20 20 20 20 20 20 20 20 20 atus"
bab0: 20 3b 20 36 20 20 0a 09 09 09 09 20 20 20 22 46 ; 6 ..... "F
bac0: 69 6e 61 6c 20 4c 6f 67 22 20 20 20 20 20 20 20 inal Log"
bad0: 20 20 3b 20 37 20 0a 09 09 09 09 20 20 20 22 52 ; 7 ..... "R
bae0: 75 6e 20 44 75 72 61 74 69 6f 6e 22 20 20 20 20 un Duration"
baf0: 20 20 3b 20 38 20 0a 09 09 09 09 20 20 20 22 57 ; 8 ..... "W
bb00: 68 65 6e 20 52 75 6e 22 20 20 20 20 20 20 20 20 hen Run"
bb10: 20 20 3b 20 39 20 0a 09 09 09 09 20 20 20 22 54 ; 9 ..... "T
bb20: 61 67 73 22 20 20 20 20 20 20 20 20 20 20 20 20 ags"
bb30: 20 20 3b 20 31 30 0a 09 09 09 09 20 20 20 22 52 ; 10..... "R
bb40: 75 6e 20 4f 77 6e 65 72 22 20 20 20 20 20 20 20 un Owner"
bb50: 20 20 3b 20 31 31 0a 09 09 09 09 20 20 20 22 43 ; 11..... "C
bb60: 6f 6d 6d 65 6e 74 22 20 20 20 20 20 20 20 20 20 omment"
bb70: 20 20 3b 20 31 32 0a 09 09 09 09 20 20 20 22 41 ; 12..... "A
bb80: 75 74 68 6f 72 22 20 20 20 20 20 20 20 20 20 20 uthor"
bb90: 20 20 3b 20 31 33 0a 09 09 09 09 20 20 20 22 54 ; 13..... "T
bba0: 65 73 74 20 4f 77 6e 65 72 22 20 20 20 20 20 20 est Owner"
bbb0: 20 20 3b 20 31 34 0a 09 09 09 09 20 20 20 22 52 ; 14..... "R
bbc0: 65 76 69 65 77 65 64 22 20 20 20 20 20 20 20 20 eviewed"
bbd0: 20 20 3b 20 31 35 0a 09 09 09 09 20 20 20 22 44 ; 15..... "D
bbe0: 69 73 6b 66 72 65 65 22 20 20 20 20 20 20 20 20 iskfree"
bbf0: 20 20 3b 20 31 36 0a 09 09 09 09 20 20 20 22 55 ; 16..... "U
bc00: 6e 61 6d 65 22 20 20 20 20 20 20 20 20 20 20 20 name"
bc10: 20 20 3b 20 31 37 0a 09 09 09 09 20 20 20 22 52 ; 17..... "R
bc20: 75 6e 64 69 72 22 20 20 20 20 20 20 20 20 20 20 undir"
bc30: 20 20 3b 20 31 38 0a 09 09 09 09 20 20 20 22 48 ; 18..... "H
bc40: 6f 73 74 22 20 20 20 20 20 20 20 20 20 20 20 20 ost"
bc50: 20 20 3b 20 31 39 0a 09 09 09 09 20 20 20 22 43 ; 19..... "C
bc60: 70 75 20 4c 6f 61 64 22 20 20 20 20 20 20 20 20 pu Load"
bc70: 20 20 3b 20 32 30 0a 09 09 09 09 20 20 20 29 29 ; 20..... ))
bc80: 29 0a 09 20 28 72 65 73 75 6c 74 73 20 28 6c 69 ).. (results (li
bc90: 73 74 20 72 75 6e 73 68 65 61 64 65 72 29 29 09 st runsheader)).
bca0: 09 09 20 0a 09 20 28 74 65 73 74 64 61 74 61 2d .. .. (testdata-
bcb0: 68 65 61 64 65 72 20 28 6c 69 73 74 20 22 52 75 header (list "Ru
bcc0: 6e 20 49 64 22 20 22 54 65 73 74 6e 61 6d 65 22 n Id" "Testname"
bcd0: 20 22 49 74 65 6d 20 50 61 74 68 22 20 22 43 61 "Item Path" "Ca
bce0: 74 65 67 6f 72 79 22 20 22 56 61 72 69 61 62 6c tegory" "Variabl
bcf0: 65 22 20 22 56 61 6c 75 65 22 20 22 45 78 70 65 e" "Value" "Expe
bd00: 63 74 65 64 22 20 22 54 6f 6c 22 20 22 55 6e 69 cted" "Tol" "Uni
bd10: 74 73 22 20 22 53 74 61 74 75 73 22 20 22 43 6f ts" "Status" "Co
bd20: 6d 6d 65 6e 74 22 29 29 0a 09 20 28 6d 61 69 6e mment")).. (main
bd30: 71 72 79 20 28 63 6f 6e 63 20 22 53 45 4c 45 43 qry (conc "SELEC
bd40: 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 T.
bd50: 74 2e 74 65 73 74 6e 61 6d 65 2c 72 2e 69 64 2c t.testname,r.id,
bd60: 72 75 6e 6e 61 6d 65 2c 22 20 6b 65 79 73 73 74 runname," keysst
bd70: 72 20 22 2c 74 2e 74 65 73 74 6e 61 6d 65 2c 0a r ",t.testname,.
bd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 2e t.
bd90: 69 74 65 6d 5f 70 61 74 68 2c 74 6d 2e 64 65 73 item_path,tm.des
bda0: 63 72 69 70 74 69 6f 6e 2c 74 2e 73 74 61 74 65 cription,t.state
bdb0: 2c 74 2e 73 74 61 74 75 73 2c 0a 20 20 20 20 20 ,t.status,.
bdc0: 20 20 20 20 20 20 20 20 20 66 69 6e 61 6c 5f 6c final_l
bdd0: 6f 67 66 2c 72 75 6e 5f 64 75 72 61 74 69 6f 6e ogf,run_duration
bde0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 , .
bdf0: 20 73 74 72 66 74 69 6d 65 28 27 25 6d 2f 25 64 strftime('%m/%d
be00: 2f 25 59 20 25 48 3a 25 4d 3a 25 53 27 2c 64 61 /%Y %H:%M:%S',da
be10: 74 65 74 69 6d 65 28 74 2e 65 76 65 6e 74 5f 74 tetime(t.event_t
be20: 69 6d 65 2c 27 75 6e 69 78 65 70 6f 63 68 27 29 ime,'unixepoch')
be30: 2c 27 6c 6f 63 61 6c 74 69 6d 65 27 29 2c 0a 20 ,'localtime'),.
be40: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6d 2e tm.
be50: 74 61 67 73 2c 72 2e 6f 77 6e 65 72 2c 74 2e 63 tags,r.owner,t.c
be60: 6f 6d 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 omment,.
be70: 20 20 20 20 20 20 61 75 74 68 6f 72 2c 0a 20 20 author,.
be80: 20 20 20 20 20 20 20 20 20 20 20 20 74 6d 2e 6f tm.o
be90: 77 6e 65 72 2c 72 65 76 69 65 77 65 64 2c 0a 20 wner,reviewed,.
bea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 dis
beb0: 6b 66 72 65 65 2c 75 6e 61 6d 65 2c 72 75 6e 64 kfree,uname,rund
bec0: 69 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 ir,.
bed0: 20 20 68 6f 73 74 2c 63 70 75 6c 6f 61 64 0a 20 host,cpuload.
bee0: 20 20 20 20 20 20 20 20 20 20 20 46 52 4f 4d 20 FROM
bef0: 74 65 73 74 73 20 41 53 20 74 20 4a 4f 49 4e 20 tests AS t JOIN
bf00: 72 75 6e 73 20 41 53 20 72 20 4f 4e 20 74 2e 72 runs AS r ON t.r
bf10: 75 6e 5f 69 64 3d 72 2e 69 64 20 4a 4f 49 4e 20 un_id=r.id JOIN
bf20: 74 65 73 74 5f 6d 65 74 61 20 41 53 20 74 6d 20 test_meta AS tm
bf30: 4f 4e 20 74 6d 2e 74 65 73 74 6e 61 6d 65 3d 74 ON tm.testname=t
bf40: 2e 74 65 73 74 6e 61 6d 65 0a 20 20 20 20 20 20 .testname.
bf50: 20 20 20 20 20 20 57 48 45 52 45 20 72 75 6e 6e WHERE runn
bf60: 61 6d 65 20 4c 49 4b 45 20 3f 20 41 4e 44 20 22 ame LIKE ? AND "
bf70: 20 6b 65 79 71 72 79 20 22 3b 22 29 29 29 0a 20 keyqry ";"))).
bf80: 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 (debug:print
bf90: 32 20 22 55 73 69 6e 67 20 22 20 74 65 6d 70 64 2 "Using " tempd
bfa0: 69 72 20 22 20 66 6f 72 20 63 6f 6e 73 74 72 75 ir " for constru
bfb0: 63 74 69 6e 67 20 74 68 65 20 6f 64 73 20 66 69 cting the ods fi
bfc0: 6c 65 2e 20 6b 65 79 71 72 79 3a 20 22 20 6b 65 le. keyqry: " ke
bfd0: 79 71 72 79 20 22 20 6b 65 79 73 74 72 3a 20 22 yqry " keystr: "
bfe0: 20 6b 65 79 73 73 74 72 20 22 20 77 69 74 68 20 keysstr " with
bff0: 6b 65 79 73 3a 20 22 20 28 6d 61 70 20 63 61 64 keys: " (map cad
c000: 72 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 29 r keypatt-alist)
c010: 0a 09 09 20 22 5c 6e 20 20 20 20 20 20 6d 61 69 ... "\n mai
c020: 6e 71 72 79 3a 20 22 20 6d 61 69 6e 71 72 79 29 nqry: " mainqry)
c030: 0a 20 20 20 20 3b 3b 20 22 45 78 70 65 63 74 65 . ;; "Expecte
c040: 64 20 56 61 6c 75 65 22 0a 20 20 20 20 3b 3b 20 d Value". ;;
c050: 22 56 61 6c 75 65 20 46 6f 75 6e 64 22 0a 20 20 "Value Found".
c060: 20 20 3b 3b 20 22 54 6f 6c 65 72 61 6e 63 65 22 ;; "Tolerance"
c070: 0a 20 20 20 20 28 61 70 70 6c 79 20 73 71 6c 69 . (apply sqli
c080: 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 te3:for-each-row
c090: 0a 09 20 20 20 28 6c 61 6d 62 64 61 20 28 74 65 .. (lambda (te
c0a0: 73 74 2d 69 64 20 2e 20 62 29 0a 09 20 20 20 20 st-id . b)..
c0b0: 20 28 73 65 74 21 20 74 65 73 74 2d 69 64 73 20 (set! test-ids
c0c0: 28 63 6f 6e 73 20 74 65 73 74 2d 69 64 20 74 65 (cons test-id te
c0d0: 73 74 2d 69 64 73 29 29 20 20 20 3b 3b 20 74 65 st-ids)) ;; te
c0e0: 73 74 2d 69 64 20 69 73 20 6e 6f 77 20 74 65 73 st-id is now tes
c0f0: 74 6e 61 6d 65 0a 09 20 20 20 20 20 28 73 65 74 tname.. (set
c100: 21 20 72 65 73 75 6c 74 73 20 28 61 70 70 65 6e ! results (appen
c110: 64 20 72 65 73 75 6c 74 73 20 3b 3b 20 6e 6f 74 d results ;; not
c120: 65 2c 20 64 72 6f 70 20 74 68 65 20 74 65 73 74 e, drop the test
c130: 2d 69 64 0a 09 09 09 09 20 20 20 28 6c 69 73 74 -id..... (list
c140: 0a 09 09 09 09 20 20 20 20 28 69 66 20 70 61 74 ..... (if pat
c150: 68 6d 6f 64 0a 09 09 09 09 09 28 6c 65 74 2a 20 hmod......(let*
c160: 28 28 76 62 20 20 20 20 20 20 20 20 28 61 70 70 ((vb (app
c170: 6c 79 20 76 65 63 74 6f 72 20 62 29 29 0a 09 09 ly vector b))...
c180: 09 09 09 20 20 20 20 20 20 20 28 6b 65 79 76 61 ... (keyva
c190: 6c 73 20 20 20 28 6c 65 74 20 6c 6f 6f 70 20 28 ls (let loop (
c1a0: 28 69 20 20 20 20 30 29 0a 09 09 09 09 09 09 09 (i 0)........
c1b0: 09 20 20 20 20 20 28 72 65 73 20 27 28 29 29 29 . (res '()))
c1c0: 0a 09 09 09 09 09 09 09 20 20 20 20 28 69 66 20 ........ (if
c1d0: 28 3e 3d 20 69 20 6e 75 6d 6b 65 79 73 29 0a 09 (>= i numkeys)..
c1e0: 09 09 09 09 09 09 09 72 65 73 0a 09 09 09 09 09 .......res......
c1f0: 09 09 09 28 6c 6f 6f 70 20 28 2b 20 69 20 31 29 ...(loop (+ i 1)
c200: 0a 09 09 09 09 09 09 09 09 20 20 20 20 20 20 28 ......... (
c210: 61 70 70 65 6e 64 20 72 65 73 20 28 6c 69 73 74 append res (list
c220: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62 20 (vector-ref vb
c230: 28 2b 20 69 20 32 29 29 29 29 29 29 29 29 0a 09 (+ i 2))))))))..
c240: 09 09 09 09 20 20 20 20 20 20 20 28 72 75 6e 6e .... (runn
c250: 61 6d 65 20 20 20 28 76 65 63 74 6f 72 2d 72 65 ame (vector-re
c260: 66 20 76 62 20 31 29 29 0a 09 09 09 09 09 20 20 f vb 1))......
c270: 20 20 20 20 20 28 74 65 73 74 6e 61 6d 65 20 20 (testname
c280: 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62 20 28 (vector-ref vb (
c290: 2b 20 20 32 20 6e 75 6d 6b 65 79 73 29 29 29 0a + 2 numkeys))).
c2a0: 09 09 09 09 09 20 20 20 20 20 20 20 28 69 74 65 ..... (ite
c2b0: 6d 2d 70 61 74 68 20 28 76 65 63 74 6f 72 2d 72 m-path (vector-r
c2c0: 65 66 20 76 62 20 28 2b 20 20 33 20 6e 75 6d 6b ef vb (+ 3 numk
c2d0: 65 79 73 29 29 29 0a 09 09 09 09 09 20 20 20 20 eys)))......
c2e0: 20 20 20 28 66 69 6e 61 6c 2d 6c 6f 67 20 28 76 (final-log (v
c2f0: 65 63 74 6f 72 2d 72 65 66 20 76 62 20 28 2b 20 ector-ref vb (+
c300: 20 37 20 6e 75 6d 6b 65 79 73 29 29 29 0a 09 09 7 numkeys)))...
c310: 09 09 09 20 20 20 20 20 20 20 28 72 75 6e 2d 64 ... (run-d
c320: 69 72 20 20 20 28 76 65 63 74 6f 72 2d 72 65 66 ir (vector-ref
c330: 20 76 62 20 28 2b 20 31 38 20 6e 75 6d 6b 65 79 vb (+ 18 numkey
c340: 73 29 29 29 0a 09 09 09 09 09 20 20 20 20 20 20 s)))......
c350: 20 28 6c 6f 67 2d 66 70 61 74 68 20 28 63 6f 6e (log-fpath (con
c360: 63 20 72 75 6e 2d 64 69 72 20 22 2f 22 20 20 66 c run-dir "/" f
c370: 69 6e 61 6c 2d 6c 6f 67 29 29 29 20 3b 3b 20 28 inal-log))) ;; (
c380: 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 string-intersper
c390: 73 65 20 6b 65 79 76 61 6c 73 20 22 2f 22 29 20 se keyvals "/")
c3a0: 22 2f 22 20 74 65 73 74 6e 61 6d 65 20 22 2f 22 "/" testname "/"
c3b0: 20 69 74 65 6d 2d 70 61 74 68 20 22 2f 22 0a 09 item-path "/"..
c3c0: 09 09 09 09 20 20 28 64 65 62 75 67 3a 70 72 69 .... (debug:pri
c3d0: 6e 74 20 34 20 22 6c 6f 67 3a 20 22 20 6c 6f 67 nt 4 "log: " log
c3e0: 2d 66 70 61 74 68 20 22 20 65 78 69 73 74 73 3a -fpath " exists:
c3f0: 20 22 20 28 66 69 6c 65 2d 65 78 69 73 74 73 3f " (file-exists?
c400: 20 6c 6f 67 2d 66 70 61 74 68 29 29 0a 09 09 09 log-fpath))....
c410: 09 09 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 .. (vector-set!
c420: 20 76 62 20 28 2b 20 37 20 6e 75 6d 6b 65 79 73 vb (+ 7 numkeys
c430: 29 20 28 69 66 20 28 66 69 6c 65 2d 65 78 69 73 ) (if (file-exis
c440: 74 73 3f 20 6c 6f 67 2d 66 70 61 74 68 29 0a 09 ts? log-fpath)..
c450: 09 09 09 09 09 09 09 09 20 20 20 20 28 6c 65 74 ........ (let
c460: 20 28 28 6e 65 77 70 61 74 68 20 28 63 6f 6e 63 ((newpath (conc
c470: 20 70 61 74 68 6d 6f 64 20 22 2f 22 0a 09 09 09 pathmod "/"....
c480: 09 09 09 09 09 09 09 09 09 20 28 73 74 72 69 6e ......... (strin
c490: 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 6b 65 g-intersperse ke
c4a0: 79 76 61 6c 73 20 22 2f 22 29 0a 09 09 09 09 09 yvals "/")......
c4b0: 09 09 09 09 09 09 09 20 22 2f 22 20 72 75 6e 6e ....... "/" runn
c4c0: 61 6d 65 20 22 2f 22 20 74 65 73 74 6e 61 6d 65 ame "/" testname
c4d0: 20 22 2f 22 0a 09 09 09 09 09 09 09 09 09 09 09 "/"............
c4e0: 09 20 28 69 66 20 28 73 74 72 69 6e 67 3d 3f 20 . (if (string=?
c4f0: 69 74 65 6d 2d 70 61 74 68 20 22 22 29 20 22 22 item-path "") ""
c500: 20 28 63 6f 6e 63 20 22 2f 22 20 69 74 65 6d 2d (conc "/" item-
c510: 70 61 74 68 29 29 0a 09 09 09 09 09 09 09 09 09 path))..........
c520: 09 09 09 20 66 69 6e 61 6c 2d 6c 6f 67 29 29 29 ... final-log)))
c530: 0a 09 09 09 09 09 09 09 09 09 20 20 20 20 20 20 ..........
c540: 3b 3b 20 66 6f 72 20 6e 6f 77 20 74 68 72 6f 77 ;; for now throw
c550: 20 61 77 61 79 20 6e 65 77 70 61 74 68 20 61 6e away newpath an
c560: 64 20 75 73 65 20 74 68 65 20 6c 6f 67 2d 66 70 d use the log-fp
c570: 61 74 68 20 63 6f 6e 63 27 64 20 77 69 74 68 20 ath conc'd with
c580: 70 61 74 68 6d 6f 64 0a 09 09 09 09 09 09 09 09 pathmod.........
c590: 09 20 20 20 20 20 20 28 73 65 74 21 20 6e 65 77 . (set! new
c5a0: 70 61 74 68 20 28 63 6f 6e 63 20 70 61 74 68 6d path (conc pathm
c5b0: 6f 64 20 6c 6f 67 2d 66 70 61 74 68 29 29 0a 09 od log-fpath))..
c5c0: 09 09 09 09 09 09 09 09 20 20 20 20 20 20 28 69 ........ (i
c5d0: 66 20 77 69 6e 64 6f 77 73 20 28 73 74 72 69 6e f windows (strin
c5e0: 67 2d 74 72 61 6e 73 6c 61 74 65 20 6e 65 77 70 g-translate newp
c5f0: 61 74 68 20 22 2f 22 20 22 5c 5c 22 29 20 6e 65 ath "/" "\\") ne
c600: 77 70 61 74 68 29 29 0a 09 09 09 09 09 09 09 09 wpath)).........
c610: 09 20 20 20 20 28 69 66 20 28 3e 20 2a 76 65 72 . (if (> *ver
c620: 62 6f 73 69 74 79 2a 20 31 29 0a 09 09 09 09 09 bosity* 1)......
c630: 09 09 09 09 09 28 63 6f 6e 63 20 66 69 6e 61 6c .....(conc final
c640: 2d 6c 6f 67 20 22 20 6e 6f 74 2d 66 6f 75 6e 64 -log " not-found
c650: 22 29 0a 09 09 09 09 09 09 09 09 09 09 22 22 29 ")..........."")
c660: 29 29 0a 09 09 09 09 09 20 20 28 76 65 63 74 6f ))...... (vecto
c670: 72 2d 3e 6c 69 73 74 20 76 62 29 29 0a 09 09 09 r->list vb))....
c680: 09 09 62 29 29 29 29 29 0a 09 20 20 20 64 62 0a ..b))))).. db.
c690: 09 20 20 20 6d 61 69 6e 71 72 79 0a 09 20 20 20 . mainqry..
c6a0: 72 75 6e 73 70 61 74 74 20 28 6d 61 70 20 63 61 runspatt (map ca
c6b0: 64 72 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 dr keypatt-alist
c6c0: 29 29 0a 20 20 20 20 28 64 65 62 75 67 3a 70 72 )). (debug:pr
c6d0: 69 6e 74 20 32 20 22 46 6f 75 6e 64 20 22 20 28 int 2 "Found " (
c6e0: 6c 65 6e 67 74 68 20 74 65 73 74 2d 69 64 73 29 length test-ids)
c6f0: 20 22 20 72 65 63 6f 72 64 73 22 29 0a 20 20 20 " records").
c700: 20 28 73 65 74 21 20 72 65 73 75 6c 74 73 20 28 (set! results (
c710: 6c 69 73 74 20 28 63 6f 6e 73 20 22 52 75 6e 73 list (cons "Runs
c720: 22 20 72 65 73 75 6c 74 73 29 29 29 0a 20 20 20 " results))).
c730: 20 3b 3b 20 6e 6f 77 2c 20 66 6f 72 20 65 61 63 ;; now, for eac
c740: 68 20 74 65 73 74 2c 20 63 6f 6c 6c 65 63 74 20 h test, collect
c750: 74 68 65 20 74 65 73 74 5f 64 61 74 61 20 69 6e the test_data in
c760: 66 6f 20 61 6e 64 20 61 64 64 20 61 20 6e 65 77 fo and add a new
c770: 20 73 68 65 65 74 0a 20 20 20 20 28 66 6f 72 2d sheet. (for-
c780: 65 61 63 68 0a 20 20 20 20 20 28 6c 61 6d 62 64 each. (lambd
c790: 61 20 28 74 65 73 74 2d 69 64 29 0a 20 20 20 20 a (test-id).
c7a0: 20 20 20 28 6c 65 74 20 28 28 74 65 73 74 2d 64 (let ((test-d
c7b0: 61 74 61 20 28 6c 69 73 74 20 74 65 73 74 64 61 ata (list testda
c7c0: 74 61 2d 68 65 61 64 65 72 29 29 0a 09 20 20 20 ta-header))..
c7d0: 20 20 28 63 75 72 72 2d 74 65 73 74 2d 6e 61 6d (curr-test-nam
c7e0: 65 20 23 66 29 29 0a 09 20 28 73 71 6c 69 74 65 e #f)).. (sqlite
c7f0: 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 09 3:for-each-row..
c800: 20 20 28 6c 61 6d 62 64 61 20 28 72 75 6e 2d 69 (lambda (run-i
c810: 64 20 74 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d d testname item-
c820: 70 61 74 68 20 63 61 74 65 67 6f 72 79 20 76 61 path category va
c830: 72 69 61 62 6c 65 20 76 61 6c 75 65 20 65 78 70 riable value exp
c840: 65 63 74 65 64 20 74 6f 6c 20 75 6e 69 74 73 20 ected tol units
c850: 73 74 61 74 75 73 20 63 6f 6d 6d 65 6e 74 29 0a status comment).
c860: 09 20 20 20 20 28 73 65 74 21 20 63 75 72 72 2d . (set! curr-
c870: 74 65 73 74 2d 6e 61 6d 65 20 74 65 73 74 6e 61 test-name testna
c880: 6d 65 29 0a 09 20 20 20 20 28 73 65 74 21 20 74 me).. (set! t
c890: 65 73 74 2d 64 61 74 61 20 28 61 70 70 65 6e 64 est-data (append
c8a0: 20 74 65 73 74 2d 64 61 74 61 20 28 6c 69 73 74 test-data (list
c8b0: 20 28 6c 69 73 74 20 72 75 6e 2d 69 64 20 74 65 (list run-id te
c8c0: 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 stname item-path
c8d0: 20 63 61 74 65 67 6f 72 79 20 76 61 72 69 61 62 category variab
c8e0: 6c 65 20 76 61 6c 75 65 20 65 78 70 65 63 74 65 le value expecte
c8f0: 64 20 74 6f 6c 20 75 6e 69 74 73 20 73 74 61 74 d tol units stat
c900: 75 73 20 63 6f 6d 6d 65 6e 74 29 29 29 29 29 0a us comment))))).
c910: 09 20 20 64 62 20 0a 09 20 20 3b 3b 20 22 53 45 . db .. ;; "SE
c920: 4c 45 43 54 20 72 75 6e 5f 69 64 2c 74 65 73 74 LECT run_id,test
c930: 6e 61 6d 65 2c 69 74 65 6d 5f 70 61 74 68 2c 63 name,item_path,c
c940: 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62 6c 65 ategory,variable
c950: 2c 74 64 2e 76 61 6c 75 65 20 41 53 20 76 61 6c ,td.value AS val
c960: 75 65 2c 65 78 70 65 63 74 65 64 2c 74 6f 6c 2c ue,expected,tol,
c970: 75 6e 69 74 73 2c 74 64 2e 73 74 61 74 75 73 20 units,td.status
c980: 41 53 20 73 74 61 74 75 73 2c 74 64 2e 63 6f 6d AS status,td.com
c990: 6d 65 6e 74 20 41 53 20 63 6f 6d 6d 65 6e 74 20 ment AS comment
c9a0: 46 52 4f 4d 20 74 65 73 74 5f 64 61 74 61 20 41 FROM test_data A
c9b0: 53 20 74 64 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 S td INNER JOIN
c9c0: 74 65 73 74 73 20 4f 4e 20 74 65 73 74 73 2e 69 tests ON tests.i
c9d0: 64 3d 74 64 2e 74 65 73 74 5f 69 64 20 57 48 45 d=td.test_id WHE
c9e0: 52 45 20 74 65 73 74 5f 69 64 3d 3f 3b 22 0a 09 RE test_id=?;"..
c9f0: 20 20 22 53 45 4c 45 43 54 20 72 75 6e 5f 69 64 "SELECT run_id
ca00: 2c 74 65 73 74 6e 61 6d 65 2c 69 74 65 6d 5f 70 ,testname,item_p
ca10: 61 74 68 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 ath,category,var
ca20: 69 61 62 6c 65 2c 74 64 2e 76 61 6c 75 65 20 41 iable,td.value A
ca30: 53 20 76 61 6c 75 65 2c 74 64 2e 65 78 70 65 63 S value,td.expec
ca40: 74 65 64 2c 74 64 2e 74 6f 6c 2c 74 64 2e 75 6e ted,td.tol,td.un
ca50: 69 74 73 2c 74 64 2e 73 74 61 74 75 73 20 41 53 its,td.status AS
ca60: 20 73 74 61 74 75 73 2c 74 64 2e 63 6f 6d 6d 65 status,td.comme
ca70: 6e 74 20 41 53 20 63 6f 6d 6d 65 6e 74 20 46 52 nt AS comment FR
ca80: 4f 4d 20 74 65 73 74 5f 64 61 74 61 20 41 53 20 OM test_data AS
ca90: 74 64 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 74 65 td INNER JOIN te
caa0: 73 74 73 20 4f 4e 20 74 65 73 74 73 2e 69 64 3d sts ON tests.id=
cab0: 74 64 2e 74 65 73 74 5f 69 64 20 57 48 45 52 45 td.test_id WHERE
cac0: 20 74 65 73 74 6e 61 6d 65 3d 3f 3b 22 0a 09 20 testname=?;"..
cad0: 20 74 65 73 74 2d 69 64 29 0a 09 20 28 69 66 20 test-id).. (if
cae0: 63 75 72 72 2d 74 65 73 74 2d 6e 61 6d 65 0a 09 curr-test-name..
caf0: 20 20 20 20 20 28 73 65 74 21 20 72 65 73 75 6c (set! resul
cb00: 74 73 20 28 61 70 70 65 6e 64 20 72 65 73 75 6c ts (append resul
cb10: 74 73 20 28 6c 69 73 74 20 28 63 6f 6e 73 20 63 ts (list (cons c
cb20: 75 72 72 2d 74 65 73 74 2d 6e 61 6d 65 20 74 65 urr-test-name te
cb30: 73 74 2d 64 61 74 61 29 29 29 29 29 0a 09 20 29 st-data))))).. )
cb40: 29 0a 20 20 20 20 20 28 73 6f 72 74 20 28 64 65 ). (sort (de
cb50: 6c 65 74 65 2d 64 75 70 6c 69 63 61 74 65 73 20 lete-duplicates
cb60: 74 65 73 74 2d 69 64 73 29 20 73 74 72 69 6e 67 test-ids) string
cb70: 3c 3d 29 29 0a 20 20 20 20 28 73 79 73 74 65 6d <=)). (system
cb80: 20 28 63 6f 6e 63 20 22 6d 6b 64 69 72 20 2d 70 (conc "mkdir -p
cb90: 20 22 20 74 65 6d 70 64 69 72 29 29 0a 20 20 20 " tempdir)).
cba0: 20 3b 3b 20 28 70 70 20 72 65 73 75 6c 74 73 29 ;; (pp results)
cbb0: 0a 20 20 20 20 28 6f 64 73 3a 6c 69 73 74 2d 3e . (ods:list->
cbc0: 6f 64 73 20 0a 20 20 20 20 20 74 65 6d 70 64 69 ods . tempdi
cbd0: 72 0a 20 20 20 20 20 28 69 66 20 28 73 74 72 69 r. (if (stri
cbe0: 6e 67 2d 6d 61 74 63 68 20 28 72 65 67 65 78 70 ng-match (regexp
cbf0: 20 22 5e 5b 2f 7e 5d 2b 2e 2a 22 29 20 6f 75 74 "^[/~]+.*") out
cc00: 70 75 74 66 69 6c 65 29 20 3b 3b 20 66 75 6c 6c putfile) ;; full
cc10: 20 70 61 74 68 3f 0a 09 20 6f 75 74 70 75 74 66 path?.. outputf
cc20: 69 6c 65 0a 09 20 28 62 65 67 69 6e 0a 09 20 20 ile.. (begin..
cc30: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 30 20 (debug:print 0
cc40: 22 57 41 52 4e 49 4e 47 3a 20 70 61 74 68 20 67 "WARNING: path g
cc50: 69 76 65 6e 2c 20 22 20 6f 75 74 70 75 74 66 69 iven, " outputfi
cc60: 6c 65 20 22 20 69 73 20 72 65 6c 61 74 69 76 65 le " is relative
cc70: 2c 20 70 72 65 66 69 78 69 6e 67 20 77 69 74 68 , prefixing with
cc80: 20 63 75 72 72 65 6e 74 20 64 69 72 65 63 74 6f current directo
cc90: 72 79 22 29 0a 09 20 20 20 28 63 6f 6e 63 20 28 ry").. (conc (
cca0: 63 75 72 72 65 6e 74 2d 64 69 72 65 63 74 6f 72 current-director
ccb0: 79 29 20 22 2f 22 20 6f 75 74 70 75 74 66 69 6c y) "/" outputfil
ccc0: 65 29 29 29 0a 20 20 20 20 20 72 65 73 75 6c 74 e))). result
ccd0: 73 29 0a 20 20 20 20 3b 3b 20 62 72 75 74 61 6c s). ;; brutal
cce0: 20 63 6c 65 61 6e 20 75 70 0a 20 20 20 20 28 73 clean up. (s
ccf0: 79 73 74 65 6d 20 22 72 6d 20 2d 72 66 20 74 65 ystem "rm -rf te
cd00: 6d 70 64 69 72 22 29 29 29 0a 0a 3b 3b 20 28 64 mpdir")))..;; (d
cd10: 62 3a 65 78 74 72 61 63 74 2d 6f 64 73 2d 66 69 b:extract-ods-fi
cd20: 6c 65 20 64 62 20 22 6f 75 74 70 75 74 66 69 6c le db "outputfil
cd30: 65 2e 6f 64 73 22 20 27 28 28 22 73 79 73 6e 61 e.ods" '(("sysna
cd40: 6d 65 22 20 22 25 22 29 28 22 66 73 6e 61 6d 65 me" "%")("fsname
cd50: 22 20 22 25 22 29 28 22 64 61 74 61 70 61 74 68 " "%")("datapath
cd60: 22 20 22 25 22 29 29 20 22 25 22 29 0a 0a 0a 3b " "%")) "%")...;
cd70: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ;===============
cd80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
cd90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
cda0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
cdb0: 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 52 45 4d 4f 54 =======.;; REMOT
cdc0: 45 20 44 42 20 41 43 43 45 53 53 20 56 49 41 20 E DB ACCESS VIA
cdd0: 52 50 43 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d RPC.;;==========
cde0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
cdf0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
ce00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
ce10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 ============..(d
ce20: 65 66 69 6e 65 20 28 72 64 62 3a 73 65 74 2d 74 efine (rdb:set-t
ce30: 65 73 74 73 2d 73 74 61 74 65 2d 73 74 61 74 75 ests-state-statu
ce40: 73 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 s db run-id test
ce50: 6e 61 6d 65 73 20 63 75 72 72 73 74 61 74 65 20 names currstate
ce60: 63 75 72 72 73 74 61 74 75 73 20 6e 65 77 73 74 currstatus newst
ce70: 61 74 65 20 6e 65 77 73 74 61 74 75 73 29 0a 20 ate newstatus).
ce80: 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a (if *runremote*
ce90: 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28 68 6f . (let ((ho
cea0: 73 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a st (vector-ref *
ceb0: 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 runremote* 0))..
cec0: 20 20 20 20 28 70 6f 72 74 20 28 76 65 63 74 6f (port (vecto
ced0: 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 r-ref *runremote
cee0: 2a 20 31 29 29 29 0a 09 28 28 72 70 63 3a 70 72 * 1)))..((rpc:pr
cef0: 6f 63 65 64 75 72 65 20 27 72 64 62 3a 73 65 74 ocedure 'rdb:set
cf00: 2d 74 65 73 74 73 2d 73 74 61 74 65 2d 73 74 61 -tests-state-sta
cf10: 74 75 73 20 68 6f 73 74 20 70 6f 72 74 29 0a 09 tus host port)..
cf20: 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 run-id testname
cf30: 73 20 63 75 72 72 73 74 61 74 65 20 63 75 72 72 s currstate curr
cf40: 73 74 61 74 75 73 20 6e 65 77 73 74 61 74 65 20 status newstate
cf50: 6e 65 77 73 74 61 74 75 73 29 29 0a 20 20 20 20 newstatus)).
cf60: 20 20 28 64 62 3a 73 65 74 2d 74 65 73 74 73 2d (db:set-tests-
cf70: 73 74 61 74 65 2d 73 74 61 74 75 73 20 64 62 20 state-status db
cf80: 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 73 run-id testnames
cf90: 20 63 75 72 72 73 74 61 74 65 20 63 75 72 72 73 currstate currs
cfa0: 74 61 74 75 73 20 6e 65 77 73 74 61 74 65 20 6e tatus newstate n
cfb0: 65 77 73 74 61 74 75 73 29 29 29 0a 0a 28 64 65 ewstatus)))..(de
cfc0: 66 69 6e 65 20 28 72 64 62 3a 74 65 73 74 73 74 fine (rdb:testst
cfd0: 65 70 2d 73 65 74 2d 73 74 61 74 75 73 21 20 64 ep-set-status! d
cfe0: 62 20 74 65 73 74 2d 69 64 20 74 65 73 74 73 74 b test-id testst
cff0: 65 70 2d 6e 61 6d 65 20 73 74 61 74 65 2d 69 6e ep-name state-in
d000: 20 73 74 61 74 75 73 2d 69 6e 20 69 74 65 6d 64 status-in itemd
d010: 61 74 20 63 6f 6d 6d 65 6e 74 20 6c 6f 67 66 69 at comment logfi
d020: 6c 65 29 0a 20 20 28 6c 65 74 20 28 28 69 74 65 le). (let ((ite
d030: 6d 2d 70 61 74 68 20 28 69 74 65 6d 2d 6c 69 73 m-path (item-lis
d040: 74 2d 3e 70 61 74 68 20 69 74 65 6d 64 61 74 29 t->path itemdat)
d050: 29 29 0a 20 20 20 20 28 69 66 20 2a 72 75 6e 72 )). (if *runr
d060: 65 6d 6f 74 65 2a 0a 09 28 6c 65 74 20 28 28 68 emote*..(let ((h
d070: 6f 73 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 ost (vector-ref
d080: 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a *runremote* 0)).
d090: 09 20 20 20 20 20 20 28 70 6f 72 74 20 28 76 65 . (port (ve
d0a0: 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d ctor-ref *runrem
d0b0: 6f 74 65 2a 20 31 29 29 29 0a 09 20 20 28 28 72 ote* 1))).. ((r
d0c0: 70 63 3a 70 72 6f 63 65 64 75 72 65 20 27 72 64 pc:procedure 'rd
d0d0: 62 3a 74 65 73 74 73 74 65 70 2d 73 65 74 2d 73 b:teststep-set-s
d0e0: 74 61 74 75 73 21 20 68 6f 73 74 20 70 6f 72 74 tatus! host port
d0f0: 29 0a 09 20 20 20 74 65 73 74 2d 69 64 20 74 65 ).. test-id te
d100: 73 74 73 74 65 70 2d 6e 61 6d 65 20 73 74 61 74 ststep-name stat
d110: 65 2d 69 6e 20 73 74 61 74 75 73 2d 69 6e 20 69 e-in status-in i
d120: 74 65 6d 2d 70 61 74 68 20 63 6f 6d 6d 65 6e 74 tem-path comment
d130: 20 6c 6f 67 66 69 6c 65 29 29 0a 09 28 64 62 3a logfile))..(db:
d140: 74 65 73 74 73 74 65 70 2d 73 65 74 2d 73 74 61 teststep-set-sta
d150: 74 75 73 21 20 64 62 20 74 65 73 74 2d 69 64 20 tus! db test-id
d160: 74 65 73 74 73 74 65 70 2d 6e 61 6d 65 20 73 74 teststep-name st
d170: 61 74 65 2d 69 6e 20 73 74 61 74 75 73 2d 69 6e ate-in status-in
d180: 20 69 74 65 6d 2d 70 61 74 68 20 63 6f 6d 6d 65 item-path comme
d190: 6e 74 20 6c 6f 67 66 69 6c 65 29 29 29 29 0a 0a nt logfile))))..
d1a0: 28 64 65 66 69 6e 65 20 28 72 64 62 3a 74 65 73 (define (rdb:tes
d1b0: 74 2d 75 70 64 61 74 65 2d 6d 65 74 61 2d 69 6e t-update-meta-in
d1c0: 66 6f 20 64 62 20 74 65 73 74 2d 69 64 20 6d 69 fo db test-id mi
d1d0: 6e 75 74 65 73 20 63 70 75 6c 6f 61 64 20 64 69 nutes cpuload di
d1e0: 73 6b 66 72 65 65 20 74 6d 70 66 72 65 65 29 0a skfree tmpfree).
d1f0: 20 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65 (if *runremote
d200: 2a 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28 68 *. (let ((h
d210: 6f 73 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 ost (vector-ref
d220: 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a *runremote* 0)).
d230: 09 20 20 20 20 28 70 6f 72 74 20 28 76 65 63 74 . (port (vect
d240: 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 or-ref *runremot
d250: 65 2a 20 31 29 29 29 0a 09 28 28 72 70 63 3a 70 e* 1)))..((rpc:p
d260: 72 6f 63 65 64 75 72 65 20 27 72 64 62 3a 74 65 rocedure 'rdb:te
d270: 73 74 2d 75 70 64 61 74 65 2d 6d 65 74 61 2d 69 st-update-meta-i
d280: 6e 66 6f 20 68 6f 73 74 20 70 6f 72 74 29 0a 09 nfo host port)..
d290: 20 74 65 73 74 2d 69 64 20 6d 69 6e 75 74 65 73 test-id minutes
d2a0: 20 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 cpuload diskfre
d2b0: 65 20 74 6d 70 66 72 65 65 29 29 0a 20 20 20 20 e tmpfree)).
d2c0: 20 20 28 64 62 3a 74 65 73 74 2d 75 70 64 61 74 (db:test-updat
d2d0: 65 2d 6d 65 74 61 2d 69 6e 66 6f 20 64 62 20 74 e-meta-info db t
d2e0: 65 73 74 2d 69 64 20 6d 69 6e 75 74 65 73 20 63 est-id minutes c
d2f0: 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20 puload diskfree
d300: 74 6d 70 66 72 65 65 29 29 29 0a 0a 28 64 65 66 tmpfree)))..(def
d310: 69 6e 65 20 28 72 64 62 3a 74 65 73 74 2d 73 65 ine (rdb:test-se
d320: 74 2d 73 74 61 74 65 2d 73 74 61 74 75 73 2d 62 t-state-status-b
d330: 79 2d 72 75 6e 2d 69 64 2d 74 65 73 74 6e 61 6d y-run-id-testnam
d340: 65 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 e db run-id test
d350: 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 -name item-path
d360: 73 74 61 74 75 73 20 73 74 61 74 65 29 0a 20 20 status state).
d370: 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a (if *runremote*.
d380: 20 20 20 20 20 20 28 6c 65 74 20 28 28 68 6f 73 (let ((hos
d390: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 t (vector-ref *r
d3a0: 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20 unremote* 0))..
d3b0: 20 20 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72 (port (vector
d3c0: 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a -ref *runremote*
d3d0: 20 31 29 29 29 0a 09 28 28 72 70 63 3a 70 72 6f 1)))..((rpc:pro
d3e0: 63 65 64 75 72 65 20 27 72 64 62 3a 74 65 73 74 cedure 'rdb:test
d3f0: 2d 73 65 74 2d 73 74 61 74 65 2d 73 74 61 74 75 -set-state-statu
d400: 73 2d 62 79 2d 72 75 6e 2d 69 64 2d 74 65 73 74 s-by-run-id-test
d410: 6e 61 6d 65 20 68 6f 73 74 20 70 6f 72 74 29 0a name host port).
d420: 09 20 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e . run-id test-n
d430: 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 73 74 ame item-path st
d440: 61 74 75 73 20 73 74 61 74 65 29 29 0a 20 20 20 atus state)).
d450: 20 20 20 28 64 62 3a 74 65 73 74 2d 73 65 74 2d (db:test-set-
d460: 73 74 61 74 65 2d 73 74 61 74 75 73 2d 62 79 2d state-status-by-
d470: 72 75 6e 2d 69 64 2d 74 65 73 74 6e 61 6d 65 20 run-id-testname
d480: 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e db run-id test-n
d490: 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 73 74 ame item-path st
d4a0: 61 74 75 73 20 73 74 61 74 65 29 29 29 0a 0a 28 atus state)))..(
d4b0: 64 65 66 69 6e 65 20 28 72 64 62 3a 63 73 76 2d define (rdb:csv-
d4c0: 3e 74 65 73 74 2d 64 61 74 61 20 64 62 20 74 65 >test-data db te
d4d0: 73 74 2d 69 64 20 63 73 76 64 61 74 61 29 0a 20 st-id csvdata).
d4e0: 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a (if *runremote*
d4f0: 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28 68 6f . (let ((ho
d500: 73 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a st (vector-ref *
d510: 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 runremote* 0))..
d520: 20 20 20 20 28 70 6f 72 74 20 28 76 65 63 74 6f (port (vecto
d530: 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 r-ref *runremote
d540: 2a 20 31 29 29 29 0a 09 28 28 72 70 63 3a 70 72 * 1)))..((rpc:pr
d550: 6f 63 65 64 75 72 65 20 27 72 64 62 3a 63 73 76 ocedure 'rdb:csv
d560: 2d 3e 74 65 73 74 2d 64 61 74 61 20 68 6f 73 74 ->test-data host
d570: 20 70 6f 72 74 29 0a 09 20 74 65 73 74 2d 69 64 port).. test-id
d580: 20 63 73 76 64 61 74 61 29 29 0a 20 20 20 20 20 csvdata)).
d590: 20 28 64 62 3a 63 73 76 2d 3e 74 65 73 74 2d 64 (db:csv->test-d
d5a0: 61 74 61 20 64 62 20 74 65 73 74 2d 69 64 20 63 ata db test-id c
d5b0: 73 76 64 61 74 61 29 29 29 0a 0a 28 64 65 66 69 svdata)))..(defi
d5c0: 6e 65 20 28 72 64 62 3a 72 6f 6c 6c 2d 75 70 2d ne (rdb:roll-up-
d5d0: 70 61 73 73 2d 66 61 69 6c 2d 63 6f 75 6e 74 73 pass-fail-counts
d5e0: 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d db run-id test-
d5f0: 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 73 name item-path s
d600: 74 61 74 75 73 29 0a 20 20 28 69 66 20 2a 72 75 tatus). (if *ru
d610: 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28 nremote*. (
d620: 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65 63 74 let ((host (vect
d630: 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 or-ref *runremot
d640: 65 2a 20 30 29 29 0a 09 20 20 20 20 28 70 6f 72 e* 0)).. (por
d650: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 t (vector-ref *r
d660: 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09 unremote* 1)))..
d670: 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20 ((rpc:procedure
d680: 27 72 64 62 3a 72 6f 6c 6c 2d 75 70 2d 70 61 73 'rdb:roll-up-pas
d690: 73 2d 66 61 69 6c 2d 63 6f 75 6e 74 73 20 68 6f s-fail-counts ho
d6a0: 73 74 20 70 6f 72 74 29 0a 09 20 72 75 6e 2d 69 st port).. run-i
d6b0: 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d d test-name item
d6c0: 2d 70 61 74 68 20 73 74 61 74 75 73 29 29 0a 20 -path status)).
d6d0: 20 20 20 20 20 28 64 62 3a 72 6f 6c 6c 2d 75 70 (db:roll-up
d6e0: 2d 70 61 73 73 2d 66 61 69 6c 2d 63 6f 75 6e 74 -pass-fail-count
d6f0: 73 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 s db run-id test
d700: 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 -name item-path
d710: 73 74 61 74 75 73 29 29 29 0a 0a 28 64 65 66 69 status)))..(defi
d720: 6e 65 20 28 72 64 62 3a 74 65 73 74 2d 73 65 74 ne (rdb:test-set
d730: 2d 63 6f 6d 6d 65 6e 74 20 64 62 20 74 65 73 74 -comment db test
d740: 2d 69 64 20 63 6f 6d 6d 65 6e 74 29 0a 20 20 28 -id comment). (
d750: 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 if *runremote*.
d760: 20 20 20 20 20 28 6c 65 74 20 28 28 68 6f 73 74 (let ((host
d770: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 (vector-ref *ru
d780: 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20 nremote* 0))..
d790: 20 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72 2d (port (vector-
d7a0: 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 ref *runremote*
d7b0: 31 29 29 29 0a 09 28 28 72 70 63 3a 70 72 6f 63 1)))..((rpc:proc
d7c0: 65 64 75 72 65 20 27 72 64 62 3a 74 65 73 74 2d edure 'rdb:test-
d7d0: 73 65 74 2d 63 6f 6d 6d 65 6e 74 20 68 6f 73 74 set-comment host
d7e0: 20 70 6f 72 74 29 0a 09 20 74 65 73 74 2d 69 64 port).. test-id
d7f0: 20 63 6f 6d 6d 65 6e 74 29 29 0a 20 20 20 20 20 comment)).
d800: 20 28 64 62 3a 74 65 73 74 2d 73 65 74 2d 63 6f (db:test-set-co
d810: 6d 6d 65 6e 74 20 64 62 20 74 65 73 74 2d 69 64 mment db test-id
d820: 20 63 6f 6d 6d 65 6e 74 29 29 29 0a 0a 28 64 65 comment)))..(de
d830: 66 69 6e 65 20 28 72 64 62 3a 74 65 73 74 2d 73 fine (rdb:test-s
d840: 65 74 2d 6c 6f 67 21 20 64 62 20 74 65 73 74 2d et-log! db test-
d850: 69 64 20 6c 6f 67 66 29 0a 20 20 28 69 66 20 2a id logf). (if *
d860: 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20 runremote*.
d870: 20 28 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65 (let ((host (ve
d880: 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d ctor-ref *runrem
d890: 6f 74 65 2a 20 30 29 29 0a 09 20 20 20 20 28 70 ote* 0)).. (p
d8a0: 6f 72 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 ort (vector-ref
d8b0: 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 *runremote* 1)))
d8c0: 0a 09 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72 ..((rpc:procedur
d8d0: 65 20 27 72 64 62 3a 74 65 73 74 2d 73 65 74 2d e 'rdb:test-set-
d8e0: 6c 6f 67 21 20 68 6f 73 74 20 70 6f 72 74 29 20 log! host port)
d8f0: 74 65 73 74 2d 69 64 20 6c 6f 67 66 29 29 0a 20 test-id logf)).
d900: 20 20 20 20 20 28 64 62 3a 74 65 73 74 2d 73 65 (db:test-se
d910: 74 2d 6c 6f 67 21 20 64 62 20 74 65 73 74 2d 69 t-log! db test-i
d920: 64 20 6c 6f 67 66 29 29 29 0a 0a 28 64 65 66 69 d logf)))..(defi
d930: 6e 65 20 28 72 64 62 3a 67 65 74 2d 72 75 6e 73 ne (rdb:get-runs
d940: 20 64 62 20 72 75 6e 6e 61 6d 65 70 61 74 74 20 db runnamepatt
d950: 6e 75 6d 72 75 6e 73 20 73 74 61 72 74 72 75 6e numruns startrun
d960: 6f 66 66 73 65 74 20 6b 65 79 70 61 74 74 73 29 offset keypatts)
d970: 0a 20 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74 . (if *runremot
d980: 65 2a 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28 e*. (let ((
d990: 68 6f 73 74 20 28 76 65 63 74 6f 72 2d 72 65 66 host (vector-ref
d9a0: 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 *runremote* 0))
d9b0: 0a 09 20 20 20 20 28 70 6f 72 74 20 28 76 65 63 .. (port (vec
d9c0: 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f tor-ref *runremo
d9d0: 74 65 2a 20 31 29 29 29 0a 09 28 28 72 70 63 3a te* 1)))..((rpc:
d9e0: 70 72 6f 63 65 64 75 72 65 20 27 72 64 62 3a 67 procedure 'rdb:g
d9f0: 65 74 2d 72 75 6e 73 20 68 6f 73 74 20 70 6f 72 et-runs host por
da00: 74 29 0a 09 20 72 75 6e 6e 61 6d 65 70 61 74 74 t).. runnamepatt
da10: 20 6e 75 6d 72 75 6e 73 20 73 74 61 72 74 72 75 numruns startru
da20: 6e 6f 66 66 73 65 74 20 6b 65 79 70 61 74 74 73 noffset keypatts
da30: 29 29 0a 20 20 20 20 20 20 28 64 62 3a 67 65 74 )). (db:get
da40: 2d 72 75 6e 73 20 64 62 20 72 75 6e 6e 61 6d 65 -runs db runname
da50: 70 61 74 74 20 6e 75 6d 72 75 6e 73 20 73 74 61 patt numruns sta
da60: 72 74 72 75 6e 6f 66 66 73 65 74 20 6b 65 79 70 rtrunoffset keyp
da70: 61 74 74 73 29 29 29 0a 0a 28 64 65 66 69 6e 65 atts)))..(define
da80: 20 28 72 64 62 3a 67 65 74 2d 74 65 73 74 73 2d (rdb:get-tests-
da90: 66 6f 72 2d 72 75 6e 20 64 62 20 72 75 6e 2d 69 for-run db run-i
daa0: 64 20 74 65 73 74 70 61 74 74 20 69 74 65 6d 70 d testpatt itemp
dab0: 61 74 74 20 73 74 61 74 65 73 20 73 74 61 74 75 att states statu
dac0: 73 65 73 20 23 21 6b 65 79 20 28 6e 6f 74 2d 69 ses #!key (not-i
dad0: 6e 20 23 74 29 29 0a 20 20 28 69 66 20 2a 72 75 n #t)). (if *ru
dae0: 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28 nremote*. (
daf0: 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65 63 74 let ((host (vect
db00: 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 or-ref *runremot
db10: 65 2a 20 30 29 29 0a 09 20 20 20 20 28 70 6f 72 e* 0)).. (por
db20: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 t (vector-ref *r
db30: 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09 unremote* 1)))..
db40: 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20 ((rpc:procedure
db50: 27 72 64 62 3a 67 65 74 2d 74 65 73 74 73 2d 66 'rdb:get-tests-f
db60: 6f 72 2d 72 75 6e 20 68 6f 73 74 20 70 6f 72 74 or-run host port
db70: 29 0a 09 20 20 72 75 6e 2d 69 64 20 74 65 73 74 ).. run-id test
db80: 70 61 74 74 20 69 74 65 6d 70 61 74 74 20 73 74 patt itempatt st
db90: 61 74 65 73 20 73 74 61 74 75 73 65 73 20 6e 6f ates statuses no
dba0: 74 2d 69 6e 3a 20 6e 6f 74 2d 69 6e 29 29 0a 20 t-in: not-in)).
dbb0: 20 20 20 20 20 28 64 62 3a 67 65 74 2d 74 65 73 (db:get-tes
dbc0: 74 73 2d 66 6f 72 2d 72 75 6e 20 64 62 20 72 75 ts-for-run db ru
dbd0: 6e 2d 69 64 20 74 65 73 74 70 61 74 74 20 69 74 n-id testpatt it
dbe0: 65 6d 70 61 74 74 20 73 74 61 74 65 73 20 73 74 empatt states st
dbf0: 61 74 75 73 65 73 20 6e 6f 74 2d 69 6e 3a 20 6e atuses not-in: n
dc00: 6f 74 2d 69 6e 29 29 29 0a 0a 28 64 65 66 69 6e ot-in)))..(defin
dc10: 65 20 28 72 64 62 3a 67 65 74 2d 74 65 73 74 2d e (rdb:get-test-
dc20: 64 61 74 61 2d 62 79 2d 69 64 20 64 62 20 74 65 data-by-id db te
dc30: 73 74 2d 69 64 29 0a 20 20 28 69 66 20 2a 72 75 st-id). (if *ru
dc40: 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28 nremote*. (
dc50: 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65 63 74 let ((host (vect
dc60: 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 or-ref *runremot
dc70: 65 2a 20 30 29 29 0a 09 20 20 20 20 28 70 6f 72 e* 0)).. (por
dc80: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 t (vector-ref *r
dc90: 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09 unremote* 1)))..
dca0: 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20 ((rpc:procedure
dcb0: 27 72 70 63 3a 67 65 74 2d 74 65 73 74 2d 64 61 'rpc:get-test-da
dcc0: 74 61 2d 62 79 2d 69 64 20 68 6f 73 74 20 70 6f ta-by-id host po
dcd0: 72 74 29 0a 09 20 74 65 73 74 2d 69 64 29 29 0a rt).. test-id)).
dce0: 20 20 20 20 20 20 28 64 62 3a 67 65 74 2d 74 65 (db:get-te
dcf0: 73 74 2d 64 61 74 61 2d 62 79 2d 69 64 20 64 62 st-data-by-id db
dd00: 20 74 65 73 74 2d 69 64 29 29 29 0a 20 20 20 20 test-id))).
dd10: 20 20 0a 28 64 65 66 69 6e 65 20 28 72 64 62 3a .(define (rdb:
dd20: 67 65 74 2d 6b 65 79 73 20 64 62 29 0a 20 20 28 get-keys db). (
dd30: 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 if *runremote*.
dd40: 20 20 20 20 20 28 6c 65 74 20 28 28 68 6f 73 74 (let ((host
dd50: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 (vector-ref *ru
dd60: 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20 nremote* 0))..
dd70: 20 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72 2d (port (vector-
dd80: 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 ref *runremote*
dd90: 31 29 29 29 0a 09 28 69 66 20 2a 64 62 2d 6b 65 1)))..(if *db-ke
dda0: 79 73 2a 20 2a 64 62 2d 6b 65 79 73 2a 20 0a 09 ys* *db-keys* ..
ddb0: 20 20 20 20 28 6c 65 74 20 28 28 6b 65 79 73 20 (let ((keys
ddc0: 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20 ((rpc:procedure
ddd0: 27 72 64 62 3a 67 65 74 2d 6b 65 79 73 20 68 6f 'rdb:get-keys ho
dde0: 73 74 20 70 6f 72 74 29 29 29 29 0a 09 20 20 20 st port))))..
ddf0: 20 20 20 28 73 65 74 21 20 2a 64 62 2d 6b 65 79 (set! *db-key
de00: 73 2a 20 6b 65 79 73 29 0a 09 20 20 20 20 20 20 s* keys)..
de10: 6b 65 79 73 29 29 29 0a 20 20 20 20 20 20 28 64 keys))). (d
de20: 62 3a 67 65 74 2d 6b 65 79 73 20 64 62 29 29 29 b:get-keys db)))
de30: 0a 09 20 0a 28 64 65 66 69 6e 65 20 28 72 64 62 .. .(define (rdb
de40: 3a 67 65 74 2d 6e 75 6d 2d 72 75 6e 73 20 64 62 :get-num-runs db
de50: 20 72 75 6e 70 61 74 74 29 0a 20 20 28 69 66 20 runpatt). (if
de60: 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 *runremote*.
de70: 20 20 28 6c 65 74 20 28 28 68 6f 73 74 20 28 76 (let ((host (v
de80: 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 ector-ref *runre
de90: 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20 20 20 28 mote* 0)).. (
dea0: 70 6f 72 74 20 28 76 65 63 74 6f 72 2d 72 65 66 port (vector-ref
deb0: 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 *runremote* 1))
dec0: 29 0a 09 28 28 72 70 63 3a 70 72 6f 63 65 64 75 )..((rpc:procedu
ded0: 72 65 20 27 72 64 62 3a 67 65 74 2d 6e 75 6d 2d re 'rdb:get-num-
dee0: 72 75 6e 73 20 68 6f 73 74 20 70 6f 72 74 29 20 runs host port)
def0: 72 75 6e 70 61 74 74 29 29 0a 20 20 20 20 20 20 runpatt)).
df00: 28 64 62 3a 67 65 74 2d 6e 75 6d 2d 72 75 6e 73 (db:get-num-runs
df10: 20 64 62 20 72 75 6e 70 61 74 74 29 29 29 0a 0a db runpatt)))..
df20: 28 64 65 66 69 6e 65 20 28 72 64 62 3a 74 65 73 (define (rdb:tes
df30: 74 2d 73 65 74 2d 73 74 61 74 65 2d 73 74 61 74 t-set-state-stat
df40: 75 73 2d 62 79 2d 69 64 20 64 62 20 74 65 73 74 us-by-id db test
df50: 2d 69 64 20 6e 65 77 73 74 61 74 65 20 6e 65 77 -id newstate new
df60: 73 74 61 74 75 73 20 6e 65 77 63 6f 6d 6d 65 6e status newcommen
df70: 74 29 0a 20 20 20 20 28 69 66 20 2a 72 75 6e 72 t). (if *runr
df80: 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c 65 emote*. (le
df90: 74 20 28 28 68 6f 73 74 20 28 76 65 63 74 6f 72 t ((host (vector
dfa0: 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a -ref *runremote*
dfb0: 20 30 29 29 0a 09 20 20 20 20 28 70 6f 72 74 20 0)).. (port
dfc0: 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e (vector-ref *run
dfd0: 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28 28 remote* 1)))..((
dfe0: 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20 27 72 rpc:procedure 'r
dff0: 64 62 3a 74 65 73 74 2d 73 65 74 2d 73 74 61 74 db:test-set-stat
e000: 65 2d 73 74 61 74 75 73 2d 62 79 2d 69 64 20 68 e-status-by-id h
e010: 6f 73 74 20 70 6f 72 74 29 0a 09 20 74 65 73 74 ost port).. test
e020: 2d 69 64 20 6e 65 77 73 74 61 74 65 20 6e 65 77 -id newstate new
e030: 73 74 61 74 75 73 20 6e 65 77 63 6f 6d 6d 65 6e status newcommen
e040: 74 29 29 0a 20 20 20 20 20 20 28 64 62 3a 74 65 t)). (db:te
e050: 73 74 2d 73 65 74 2d 73 74 61 74 65 2d 73 74 61 st-set-state-sta
e060: 74 75 73 2d 62 79 2d 69 64 20 64 62 20 74 65 73 tus-by-id db tes
e070: 74 2d 69 64 20 6e 65 77 73 74 61 74 65 20 6e 65 t-id newstate ne
e080: 77 73 74 61 74 75 73 20 6e 65 77 63 6f 6d 6d 65 wstatus newcomme
e090: 6e 74 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 nt)))..(define (
e0a0: 72 64 62 3a 67 65 74 2d 6b 65 79 2d 76 61 6c 2d rdb:get-key-val-
e0b0: 70 61 69 72 73 20 64 62 20 72 75 6e 2d 69 64 29 pairs db run-id)
e0c0: 0a 20 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74 . (if *runremot
e0d0: 65 2a 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28 e*. (let ((
e0e0: 68 6f 73 74 20 28 76 65 63 74 6f 72 2d 72 65 66 host (vector-ref
e0f0: 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 *runremote* 0))
e100: 0a 09 20 20 20 20 28 70 6f 72 74 20 28 76 65 63 .. (port (vec
e110: 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f tor-ref *runremo
e120: 74 65 2a 20 31 29 29 29 0a 09 28 28 72 70 63 3a te* 1)))..((rpc:
e130: 70 72 6f 63 65 64 75 72 65 20 27 72 64 62 3a 67 procedure 'rdb:g
e140: 65 74 2d 6b 65 79 2d 76 61 6c 2d 70 61 69 72 73 et-key-val-pairs
e150: 20 68 6f 73 74 20 70 6f 72 74 29 20 72 75 6e 2d host port) run-
e160: 69 64 29 29 0a 20 20 20 20 20 20 28 64 62 3a 67 id)). (db:g
e170: 65 74 2d 6b 65 79 2d 76 61 6c 2d 70 61 69 72 73 et-key-val-pairs
e180: 20 64 62 20 72 75 6e 2d 69 64 29 29 29 0a 09 20 db run-id)))..
e190: 0a 28 64 65 66 69 6e 65 20 28 72 64 62 3a 67 65 .(define (rdb:ge
e1a0: 74 2d 6b 65 79 2d 76 61 6c 73 20 64 62 20 72 75 t-key-vals db ru
e1b0: 6e 2d 69 64 29 0a 20 20 20 20 28 69 66 20 2a 72 n-id). (if *r
e1c0: 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 unremote*.
e1d0: 28 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65 63 (let ((host (vec
e1e0: 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f tor-ref *runremo
e1f0: 74 65 2a 20 30 29 29 0a 09 20 20 20 20 28 70 6f te* 0)).. (po
e200: 72 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a rt (vector-ref *
e210: 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a runremote* 1))).
e220: 09 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65 .((rpc:procedure
e230: 20 27 72 64 62 3a 67 65 74 2d 6b 65 79 2d 76 61 'rdb:get-key-va
e240: 6c 73 20 68 6f 73 74 20 70 6f 72 74 29 20 72 75 ls host port) ru
e250: 6e 2d 69 64 29 29 0a 20 20 20 20 20 20 28 64 62 n-id)). (db
e260: 3a 67 65 74 2d 6b 65 79 2d 76 61 6c 73 20 64 62 :get-key-vals db
e270: 20 72 75 6e 2d 69 64 29 29 29 0a 0a 28 64 65 66 run-id)))..(def
e280: 69 6e 65 20 28 72 64 62 3a 74 65 73 74 6d 65 74 ine (rdb:testmet
e290: 61 2d 67 65 74 2d 72 65 63 6f 72 64 20 64 62 20 a-get-record db
e2a0: 74 65 73 74 6e 61 6d 65 29 0a 20 20 20 28 69 66 testname). (if
e2b0: 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 *runremote*.
e2c0: 20 20 20 28 6c 65 74 20 28 28 68 6f 73 74 20 28 (let ((host (
e2d0: 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 vector-ref *runr
e2e0: 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20 20 20 emote* 0))..
e2f0: 28 70 6f 72 74 20 28 76 65 63 74 6f 72 2d 72 65 (port (vector-re
e300: 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29 f *runremote* 1)
e310: 29 29 0a 09 28 28 72 70 63 3a 70 72 6f 63 65 64 ))..((rpc:proced
e320: 75 72 65 20 27 72 64 62 3a 74 65 73 74 6d 65 74 ure 'rdb:testmet
e330: 61 2d 67 65 74 2d 72 65 63 6f 72 64 20 68 6f 73 a-get-record hos
e340: 74 20 70 6f 72 74 29 20 74 65 73 74 6e 61 6d 65 t port) testname
e350: 29 29 0a 20 20 20 20 20 20 28 64 62 3a 74 65 73 )). (db:tes
e360: 74 6d 65 74 61 2d 67 65 74 2d 72 65 63 6f 72 64 tmeta-get-record
e370: 20 64 62 20 74 65 73 74 6e 61 6d 65 29 29 29 0a db testname))).
e380: 0a 28 64 65 66 69 6e 65 20 28 72 64 62 3a 67 65 .(define (rdb:ge
e390: 74 2d 74 65 73 74 2d 64 61 74 61 2d 62 79 2d 69 t-test-data-by-i
e3a0: 64 20 64 62 20 74 65 73 74 2d 69 64 29 0a 20 20 d db test-id).
e3b0: 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a (if *runremote*.
e3c0: 20 20 20 20 20 20 28 6c 65 74 20 28 28 68 6f 73 (let ((hos
e3d0: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 t (vector-ref *r
e3e0: 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20 unremote* 0))..
e3f0: 20 20 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72 (port (vector
e400: 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a -ref *runremote*
e410: 20 31 29 29 29 0a 09 28 28 72 70 63 3a 70 72 6f 1)))..((rpc:pro
e420: 63 65 64 75 72 65 20 27 72 64 62 3a 67 65 74 2d cedure 'rdb:get-
e430: 74 65 73 74 2d 64 61 74 61 2d 62 79 2d 69 64 20 test-data-by-id
e440: 68 6f 73 74 20 70 6f 72 74 29 20 74 65 73 74 2d host port) test-
e450: 69 64 29 29 0a 20 20 20 20 20 20 28 64 62 3a 67 id)). (db:g
e460: 65 74 2d 74 65 73 74 2d 64 61 74 61 2d 62 79 2d et-test-data-by-
e470: 69 64 20 64 62 20 74 65 73 74 2d 69 64 29 29 29 id db test-id)))
e480: 0a 0a 28 64 65 66 69 6e 65 20 28 72 64 62 3a 67 ..(define (rdb:g
e490: 65 74 2d 72 75 6e 2d 69 6e 66 6f 20 64 62 20 72 et-run-info db r
e4a0: 75 6e 2d 69 64 29 0a 20 20 28 69 66 20 2a 72 75 un-id). (if *ru
e4b0: 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28 nremote*. (
e4c0: 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65 63 74 let ((host (vect
e4d0: 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 or-ref *runremot
e4e0: 65 2a 20 30 29 29 0a 09 20 20 20 20 28 70 6f 72 e* 0)).. (por
e4f0: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 t (vector-ref *r
e500: 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09 unremote* 1)))..
e510: 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20 ((rpc:procedure
e520: 27 72 64 62 3a 67 65 74 2d 72 75 6e 2d 69 6e 66 'rdb:get-run-inf
e530: 6f 20 68 6f 73 74 20 70 6f 72 74 29 20 72 75 6e o host port) run
e540: 2d 69 64 29 29 0a 20 20 20 20 20 20 28 64 62 3a -id)). (db:
e550: 67 65 74 2d 72 75 6e 2d 69 6e 66 6f 20 64 62 20 get-run-info db
e560: 72 75 6e 2d 69 64 29 29 29 0a 0a 28 64 65 66 69 run-id)))..(defi
e570: 6e 65 20 28 72 64 62 3a 67 65 74 2d 73 74 65 70 ne (rdb:get-step
e580: 73 2d 66 6f 72 2d 74 65 73 74 20 64 62 20 74 65 s-for-test db te
e590: 73 74 2d 69 64 29 0a 20 20 28 69 66 20 2a 72 75 st-id). (if *ru
e5a0: 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28 nremote*. (
e5b0: 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65 63 74 let ((host (vect
e5c0: 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 or-ref *runremot
e5d0: 65 2a 20 30 29 29 0a 09 20 20 20 20 28 70 6f 72 e* 0)).. (por
e5e0: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 t (vector-ref *r
e5f0: 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09 unremote* 1)))..
e600: 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20 ((rpc:procedure
e610: 27 72 64 62 3a 67 65 74 2d 73 74 65 70 73 2d 66 'rdb:get-steps-f
e620: 6f 72 2d 74 65 73 74 20 68 6f 73 74 20 70 6f 72 or-test host por
e630: 74 29 20 74 65 73 74 2d 69 64 29 29 0a 20 20 20 t) test-id)).
e640: 20 20 20 28 64 62 3a 67 65 74 2d 73 74 65 70 73 (db:get-steps
e650: 2d 66 6f 72 2d 74 65 73 74 20 64 62 20 74 65 73 -for-test db tes
e660: 74 2d 69 64 29 29 29 0a 0a 28 64 65 66 69 6e 65 t-id)))..(define
e670: 20 28 72 64 62 3a 67 65 74 2d 73 74 65 70 73 2d (rdb:get-steps-
e680: 74 61 62 6c 65 20 64 62 20 74 65 73 74 2d 69 64 table db test-id
e690: 29 0a 20 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f ). (if *runremo
e6a0: 74 65 2a 0a 20 20 20 20 20 20 28 6c 65 74 20 28 te*. (let (
e6b0: 28 68 6f 73 74 20 28 76 65 63 74 6f 72 2d 72 65 (host (vector-re
e6c0: 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29 f *runremote* 0)
e6d0: 29 0a 09 20 20 20 20 28 70 6f 72 74 20 28 76 65 ).. (port (ve
e6e0: 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d ctor-ref *runrem
e6f0: 6f 74 65 2a 20 31 29 29 29 0a 09 28 28 72 70 63 ote* 1)))..((rpc
e700: 3a 70 72 6f 63 65 64 75 72 65 20 27 72 64 62 3a :procedure 'rdb:
e710: 67 65 74 2d 73 74 65 70 73 2d 74 61 62 6c 65 20 get-steps-table
e720: 68 6f 73 74 20 70 6f 72 74 29 20 74 65 73 74 2d host port) test-
e730: 69 64 29 29 0a 20 20 20 20 20 20 28 64 62 3a 67 id)). (db:g
e740: 65 74 2d 73 74 65 70 73 2d 74 61 62 6c 65 20 64 et-steps-table d
e750: 62 20 74 65 73 74 2d 69 64 29 29 29 0a 0a 28 64 b test-id)))..(d
e760: 65 66 69 6e 65 20 28 72 64 62 3a 72 65 61 64 2d efine (rdb:read-
e770: 74 65 73 74 2d 64 61 74 61 20 64 62 20 74 65 73 test-data db tes
e780: 74 2d 69 64 20 63 61 74 65 67 6f 72 79 70 61 74 t-id categorypat
e790: 74 29 0a 20 20 28 69 66 20 2a 72 75 6e 72 65 6d t). (if *runrem
e7a0: 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c 65 74 20 ote*. (let
e7b0: 28 28 68 6f 73 74 20 28 76 65 63 74 6f 72 2d 72 ((host (vector-r
e7c0: 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30 ef *runremote* 0
e7d0: 29 29 0a 09 20 20 20 20 28 70 6f 72 74 20 28 76 )).. (port (v
e7e0: 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 ector-ref *runre
e7f0: 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28 28 72 70 mote* 1)))..((rp
e800: 63 3a 70 72 6f 63 65 64 75 72 65 20 27 72 64 62 c:procedure 'rdb
e810: 3a 72 65 61 64 2d 74 65 73 74 2d 64 61 74 61 20 :read-test-data
e820: 68 6f 73 74 20 70 6f 72 74 29 20 74 65 73 74 2d host port) test-
e830: 69 64 20 63 61 74 65 67 6f 72 79 70 61 74 74 29 id categorypatt)
e840: 29 0a 20 20 20 20 20 20 28 64 62 3a 72 65 61 64 ). (db:read
e850: 2d 74 65 73 74 2d 64 61 74 61 20 64 62 20 74 65 -test-data db te
e860: 73 74 2d 69 64 20 63 61 74 65 67 6f 72 79 70 61 st-id categorypa
e870: 74 74 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 tt)))..(define (
e880: 72 64 62 3a 67 65 74 2d 74 65 73 74 2d 69 6e 66 rdb:get-test-inf
e890: 6f 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 o db run-id test
e8a0: 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 0a name item-path).
e8b0: 20 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65 (if *runremote
e8c0: 2a 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28 68 *. (let ((h
e8d0: 6f 73 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 ost (vector-ref
e8e0: 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a *runremote* 0)).
e8f0: 09 20 20 20 20 28 70 6f 72 74 20 28 76 65 63 74 . (port (vect
e900: 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 or-ref *runremot
e910: 65 2a 20 31 29 29 29 0a 09 28 28 72 70 63 3a 70 e* 1)))..((rpc:p
e920: 72 6f 63 65 64 75 72 65 20 27 72 64 62 3a 67 65 rocedure 'rdb:ge
e930: 74 2d 74 65 73 74 2d 69 6e 66 6f 20 68 6f 73 74 t-test-info host
e940: 20 70 6f 72 74 29 20 72 75 6e 2d 69 64 20 74 65 port) run-id te
e950: 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 stname item-path
e960: 29 29 0a 20 20 20 20 20 20 28 64 62 3a 67 65 74 )). (db:get
e970: 2d 74 65 73 74 2d 69 6e 66 6f 20 64 62 20 72 75 -test-info db ru
e980: 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 69 74 n-id testname it
e990: 65 6d 2d 70 61 74 68 29 29 29 0a 0a 28 64 65 66 em-path)))..(def
e9a0: 69 6e 65 20 28 72 64 62 3a 64 65 6c 65 74 65 2d ine (rdb:delete-
e9b0: 74 65 73 74 2d 72 65 63 6f 72 64 73 20 64 62 20 test-records db
e9c0: 74 65 73 74 2d 69 64 29 0a 20 20 28 69 66 20 2a test-id). (if *
e9d0: 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20 runremote*.
e9e0: 20 28 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65 (let ((host (ve
e9f0: 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d ctor-ref *runrem
ea00: 6f 74 65 2a 20 30 29 29 0a 09 20 20 20 20 28 70 ote* 0)).. (p
ea10: 6f 72 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 ort (vector-ref
ea20: 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 *runremote* 1)))
ea30: 0a 09 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72 ..((rpc:procedur
ea40: 65 20 27 72 64 62 3a 64 65 6c 65 74 65 2d 74 65 e 'rdb:delete-te
ea50: 73 74 2d 72 65 63 6f 72 64 73 20 68 6f 73 74 20 st-records host
ea60: 70 6f 72 74 29 20 74 65 73 74 2d 69 64 29 29 0a port) test-id)).
ea70: 20 20 20 20 20 20 28 64 62 3a 64 65 6c 65 74 65 (db:delete
ea80: 2d 74 65 73 74 2d 72 65 63 6f 72 64 73 20 64 62 -test-records db
ea90: 20 74 65 73 74 2d 69 64 29 29 29 0a 0a 28 64 65 test-id)))..(de
eaa0: 66 69 6e 65 20 28 72 64 62 3a 74 65 73 74 2d 64 fine (rdb:test-d
eab0: 61 74 61 2d 72 6f 6c 6c 75 70 20 64 62 20 74 65 ata-rollup db te
eac0: 73 74 2d 69 64 20 73 74 61 74 75 73 29 0a 20 20 st-id status).
ead0: 20 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65 (if *runremote
eae0: 2a 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28 68 *. (let ((h
eaf0: 6f 73 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 ost (vector-ref
eb00: 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a *runremote* 0)).
eb10: 09 20 20 20 20 28 70 6f 72 74 20 28 76 65 63 74 . (port (vect
eb20: 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 or-ref *runremot
eb30: 65 2a 20 31 29 29 29 0a 09 28 28 72 70 63 3a 70 e* 1)))..((rpc:p
eb40: 72 6f 63 65 64 75 72 65 20 27 72 64 62 3a 74 65 rocedure 'rdb:te
eb50: 73 74 2d 64 61 74 61 2d 72 6f 6c 6c 75 70 20 68 st-data-rollup h
eb60: 6f 73 74 20 70 6f 72 74 29 20 74 65 73 74 2d 69 ost port) test-i
eb70: 64 20 73 74 61 74 75 73 29 29 0a 20 20 20 20 20 d status)).
eb80: 20 28 64 62 3a 74 65 73 74 2d 64 61 74 61 2d 72 (db:test-data-r
eb90: 6f 6c 6c 75 70 20 64 62 20 74 65 73 74 2d 69 64 ollup db test-id
eba0: 20 73 74 61 74 75 73 29 29 29 0a 0a 28 64 65 66 status)))..(def
ebb0: 69 6e 65 20 28 72 64 62 3a 74 65 73 74 2d 67 65 ine (rdb:test-ge
ebc0: 74 2d 70 61 74 68 73 2d 6d 61 74 63 68 69 6e 67 t-paths-matching
ebd0: 20 64 62 20 6b 65 79 6e 61 6d 65 73 20 74 61 72 db keynames tar
ebe0: 67 65 74 29 0a 20 20 20 28 69 66 20 2a 72 75 6e get). (if *run
ebf0: 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 20 28 remote*. (
ec00: 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65 63 74 let ((host (vect
ec10: 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 or-ref *runremot
ec20: 65 2a 20 30 29 29 0a 09 20 20 20 20 20 28 70 6f e* 0)).. (po
ec30: 72 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a rt (vector-ref *
ec40: 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a runremote* 1))).
ec50: 09 20 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72 . ((rpc:procedur
ec60: 65 20 27 72 64 62 3a 74 65 73 74 2d 67 65 74 2d e 'rdb:test-get-
ec70: 70 61 74 68 73 2d 6d 61 74 63 68 69 6e 67 20 68 paths-matching h
ec80: 6f 73 74 20 70 6f 72 74 29 20 6b 65 79 6e 61 6d ost port) keynam
ec90: 65 73 20 74 61 72 67 65 74 29 29 0a 20 20 20 20 es target)).
eca0: 20 20 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d (db:test-get-
ecb0: 70 61 74 68 73 2d 6d 61 74 63 68 69 6e 67 20 64 paths-matching d
ecc0: 62 20 6b 65 79 6e 61 6d 65 73 20 74 61 72 67 65 b keynames targe
ecd0: 74 29 29 29 0a 0a 20 0a t))).. .