0000: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ;;==============
0010: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0030: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0040: 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 43 6f 70 79 ========.;; Copy
0050: 72 69 67 68 74 20 32 30 30 36 2d 32 30 31 31 2c right 2006-2011,
0060: 20 4d 61 74 74 68 65 77 20 57 65 6c 6c 61 6e 64 Matthew Welland
0070: 2e 0a 3b 3b 20 0a 3b 3b 20 20 54 68 69 73 20 70 ..;; .;; This p
0080: 72 6f 67 72 61 6d 20 69 73 20 6d 61 64 65 20 61 rogram is made a
0090: 76 61 69 6c 61 62 6c 65 20 75 6e 64 65 72 20 74 vailable under t
00a0: 68 65 20 47 4e 55 20 47 50 4c 20 76 65 72 73 69 he GNU GPL versi
00b0: 6f 6e 20 32 2e 30 20 6f 72 0a 3b 3b 20 20 67 72 on 2.0 or.;; gr
00c0: 65 61 74 65 72 2e 20 53 65 65 20 74 68 65 20 61 eater. See the a
00d0: 63 63 6f 6d 70 61 6e 79 69 6e 67 20 66 69 6c 65 ccompanying file
00e0: 20 43 4f 50 59 49 4e 47 20 66 6f 72 20 64 65 74 COPYING for det
00f0: 61 69 6c 73 2e 0a 3b 3b 20 0a 3b 3b 20 20 54 68 ails..;; .;; Th
0100: 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 is program is di
0110: 73 74 72 69 62 75 74 65 64 20 57 49 54 48 4f 55 stributed WITHOU
0120: 54 20 41 4e 59 20 57 41 52 52 41 4e 54 59 3b 20 T ANY WARRANTY;
0130: 77 69 74 68 6f 75 74 20 65 76 65 6e 20 74 68 65 without even the
0140: 0a 3b 3b 20 20 69 6d 70 6c 69 65 64 20 77 61 72 .;; implied war
0150: 72 61 6e 74 79 20 6f 66 20 4d 45 52 43 48 41 4e ranty of MERCHAN
0160: 54 41 42 49 4c 49 54 59 20 6f 72 20 46 49 54 4e TABILITY or FITN
0170: 45 53 53 20 46 4f 52 20 41 20 50 41 52 54 49 43 ESS FOR A PARTIC
0180: 55 4c 41 52 0a 3b 3b 20 20 50 55 52 50 4f 53 45 ULAR.;; PURPOSE
0190: 2e 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ..;;============
01a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
01b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
01c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
01d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 3d 3d ==========..;;==
01e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
01f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0200: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0210: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0220: 3d 3d 3d 3d 0a 3b 3b 20 44 61 74 61 62 61 73 65 ====.;; Database
0230: 20 61 63 63 65 73 73 0a 3b 3b 3d 3d 3d 3d 3d 3d access.;;======
0240: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0250: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0260: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0270: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
0280: 0a 0a 28 75 73 65 20 73 71 6c 69 74 65 33 20 73 ..(use sqlite3 s
0290: 72 66 69 2d 31 20 70 6f 73 69 78 20 72 65 67 65 rfi-1 posix rege
02a0: 78 20 72 65 67 65 78 2d 63 61 73 65 20 73 72 66 x regex-case srf
02b0: 69 2d 36 39 20 63 73 76 2d 78 6d 6c 29 0a 28 69 i-69 csv-xml).(i
02c0: 6d 70 6f 72 74 20 28 70 72 65 66 69 78 20 73 71 mport (prefix sq
02d0: 6c 69 74 65 33 20 73 71 6c 69 74 65 33 3a 29 29 lite3 sqlite3:))
02e0: 0a 0a 28 64 65 63 6c 61 72 65 20 28 75 6e 69 74 ..(declare (unit
02f0: 20 64 62 29 29 0a 28 64 65 63 6c 61 72 65 20 28 db)).(declare (
0300: 75 73 65 73 20 63 6f 6d 6d 6f 6e 29 29 0a 28 64 uses common)).(d
0310: 65 63 6c 61 72 65 20 28 75 73 65 73 20 6b 65 79 eclare (uses key
0320: 73 29 29 0a 28 64 65 63 6c 61 72 65 20 28 75 73 s)).(declare (us
0330: 65 73 20 6f 64 73 29 29 0a 0a 28 69 6e 63 6c 75 es ods))..(inclu
0340: 64 65 20 22 63 6f 6d 6d 6f 6e 5f 72 65 63 6f 72 de "common_recor
0350: 64 73 2e 73 63 6d 22 29 0a 28 69 6e 63 6c 75 64 ds.scm").(includ
0360: 65 20 22 64 62 5f 72 65 63 6f 72 64 73 2e 73 63 e "db_records.sc
0370: 6d 22 29 0a 28 69 6e 63 6c 75 64 65 20 22 6b 65 m").(include "ke
0380: 79 5f 72 65 63 6f 72 64 73 2e 73 63 6d 22 29 0a y_records.scm").
0390: 0a 28 64 65 66 69 6e 65 20 28 6f 70 65 6e 2d 64 .(define (open-d
03a0: 62 29 20 3b 3b 20 20 28 63 6f 6e 63 20 2a 74 6f b) ;; (conc *to
03b0: 70 70 61 74 68 2a 20 22 2f 6d 65 67 61 74 65 73 ppath* "/megates
03c0: 74 2e 64 62 22 29 20 28 63 61 72 20 2a 63 6f 6e t.db") (car *con
03d0: 66 69 67 69 6e 66 6f 2a 29 29 29 0a 20 20 28 6c figinfo*))). (l
03e0: 65 74 2a 20 28 28 64 62 70 61 74 68 20 20 20 20 et* ((dbpath
03f0: 28 63 6f 6e 63 20 2a 74 6f 70 70 61 74 68 2a 20 (conc *toppath*
0400: 22 2f 6d 65 67 61 74 65 73 74 2e 64 62 22 29 29 "/megatest.db"))
0410: 20 3b 3b 20 66 6e 61 6d 65 29 0a 09 20 28 63 6f ;; fname).. (co
0420: 6e 66 69 67 64 61 74 20 28 63 61 72 20 2a 63 6f nfigdat (car *co
0430: 6e 66 69 67 69 6e 66 6f 2a 29 29 0a 09 20 28 64 nfiginfo*)).. (d
0440: 62 65 78 69 73 74 73 20 20 28 66 69 6c 65 2d 65 bexists (file-e
0450: 78 69 73 74 73 3f 20 64 62 70 61 74 68 29 29 0a xists? dbpath)).
0460: 09 20 28 64 62 20 20 20 20 20 20 20 20 28 73 71 . (db (sq
0470: 6c 69 74 65 33 3a 6f 70 65 6e 2d 64 61 74 61 62 lite3:open-datab
0480: 61 73 65 20 64 62 70 61 74 68 29 29 20 3b 3b 20 ase dbpath)) ;;
0490: 28 6e 65 76 65 72 2d 67 69 76 65 2d 75 70 2d 6f (never-give-up-o
04a0: 70 65 6e 2d 64 62 20 64 62 70 61 74 68 29 29 0a pen-db dbpath)).
04b0: 09 20 28 68 61 6e 64 6c 65 72 20 20 20 28 6d 61 . (handler (ma
04c0: 6b 65 2d 62 75 73 79 2d 74 69 6d 65 6f 75 74 20 ke-busy-timeout
04d0: 33 36 30 30 30 29 29 29 0a 20 20 20 20 28 73 71 36000))). (sq
04e0: 6c 69 74 65 33 3a 73 65 74 2d 62 75 73 79 2d 68 lite3:set-busy-h
04f0: 61 6e 64 6c 65 72 21 20 64 62 20 68 61 6e 64 6c andler! db handl
0500: 65 72 29 0a 20 20 20 20 28 69 66 20 28 6e 6f 74 er). (if (not
0510: 20 64 62 65 78 69 73 74 73 29 0a 09 28 6c 65 74 dbexists)..(let
0520: 2a 20 28 28 6b 65 79 73 20 20 20 20 20 28 63 6f * ((keys (co
0530: 6e 66 69 67 2d 67 65 74 2d 66 69 65 6c 64 73 20 nfig-get-fields
0540: 63 6f 6e 66 69 67 64 61 74 29 29 0a 09 20 20 20 configdat))..
0550: 20 20 20 20 28 68 61 76 65 6b 65 79 73 20 28 3e (havekeys (>
0560: 20 28 6c 65 6e 67 74 68 20 6b 65 79 73 29 20 30 (length keys) 0
0570: 29 29 0a 09 20 20 20 20 20 20 20 28 6b 65 79 73 )).. (keys
0580: 74 72 20 20 20 28 6b 65 79 73 2d 3e 6b 65 79 73 tr (keys->keys
0590: 74 72 20 6b 65 79 73 29 29 0a 09 20 20 20 20 20 tr keys))..
05a0: 20 20 28 66 69 65 6c 64 73 74 72 20 28 6b 65 79 (fieldstr (key
05b0: 73 2d 3e 6b 65 79 2f 66 69 65 6c 64 20 6b 65 79 s->key/field key
05c0: 73 29 29 29 0a 09 20 20 28 66 6f 72 2d 65 61 63 s))).. (for-eac
05d0: 68 20 28 6c 61 6d 62 64 61 20 28 6b 65 79 29 0a h (lambda (key).
05e0: 09 09 20 20 20 20 20 20 28 6c 65 74 20 28 28 6b .. (let ((k
05f0: 65 79 6e 20 28 76 65 63 74 6f 72 2d 72 65 66 20 eyn (vector-ref
0600: 6b 65 79 20 30 29 29 29 0a 09 09 09 28 69 66 20 key 0)))....(if
0610: 28 6d 65 6d 62 65 72 20 28 73 74 72 69 6e 67 2d (member (string-
0620: 64 6f 77 6e 63 61 73 65 20 6b 65 79 6e 29 0a 09 downcase keyn)..
0630: 09 09 09 20 20 20 20 20 28 6c 69 73 74 20 22 72 ... (list "r
0640: 75 6e 6e 61 6d 65 22 20 22 73 74 61 74 65 22 20 unname" "state"
0650: 22 73 74 61 74 75 73 22 20 22 6f 77 6e 65 72 22 "status" "owner"
0660: 20 22 65 76 65 6e 74 5f 74 69 6d 65 22 20 22 63 "event_time" "c
0670: 6f 6d 6d 65 6e 74 22 20 22 66 61 69 6c 5f 63 6f omment" "fail_co
0680: 75 6e 74 22 0a 09 09 09 09 09 20 20 20 22 70 61 unt"...... "pa
0690: 73 73 5f 63 6f 75 6e 74 22 29 29 0a 09 09 09 20 ss_count"))....
06a0: 20 20 20 28 62 65 67 69 6e 0a 09 09 09 20 20 20 (begin....
06b0: 20 20 20 28 70 72 69 6e 74 20 22 45 52 52 4f 52 (print "ERROR
06c0: 3a 20 79 6f 75 72 20 6b 65 79 20 63 61 6e 6e 6f : your key canno
06d0: 74 20 62 65 20 6e 61 6d 65 64 20 22 20 6b 65 79 t be named " key
06e0: 6e 20 22 20 61 73 20 74 68 69 73 20 63 6f 6e 66 n " as this conf
06f0: 6c 69 63 74 73 20 77 69 74 68 20 74 68 65 20 73 licts with the s
0700: 61 6d 65 20 6e 61 6d 65 64 20 66 69 65 6c 64 20 ame named field
0710: 69 6e 20 74 68 65 20 72 75 6e 73 20 74 61 62 6c in the runs tabl
0720: 65 22 29 0a 09 09 09 20 20 20 20 20 20 28 73 79 e").... (sy
0730: 73 74 65 6d 20 28 63 6f 6e 63 20 22 72 6d 20 2d stem (conc "rm -
0740: 66 20 22 20 64 62 70 61 74 68 29 29 0a 09 09 09 f " dbpath))....
0750: 20 20 20 20 20 20 28 65 78 69 74 20 31 29 29 29 (exit 1)))
0760: 29 29 0a 09 09 20 20 20 20 6b 65 79 73 29 0a 09 ))... keys)..
0770: 20 20 3b 3b 20 28 73 71 6c 69 74 65 33 3a 65 78 ;; (sqlite3:ex
0780: 65 63 75 74 65 20 64 62 20 22 50 52 41 47 4d 41 ecute db "PRAGMA
0790: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4f synchronous = O
07a0: 46 46 3b 22 29 0a 09 20 20 28 73 71 6c 69 74 65 FF;").. (sqlite
07b0: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 43 52 3:execute db "CR
07c0: 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f EATE TABLE IF NO
07d0: 54 20 45 58 49 53 54 53 20 6b 65 79 73 20 28 69 T EXISTS keys (i
07e0: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR
07f0: 59 20 4b 45 59 2c 20 66 69 65 6c 64 6e 61 6d 65 Y KEY, fieldname
0800: 20 54 45 58 54 2c 20 66 69 65 6c 64 74 79 70 65 TEXT, fieldtype
0810: 20 54 45 58 54 2c 20 43 4f 4e 53 54 52 41 49 4e TEXT, CONSTRAIN
0820: 54 20 6b 65 79 63 6f 6e 73 74 72 61 69 6e 74 20 T keyconstraint
0830: 55 4e 49 51 55 45 20 28 66 69 65 6c 64 6e 61 6d UNIQUE (fieldnam
0840: 65 29 29 3b 22 29 0a 09 20 20 28 66 6f 72 2d 65 e));").. (for-e
0850: 61 63 68 20 28 6c 61 6d 62 64 61 20 28 6b 65 79 ach (lambda (key
0860: 29 0a 09 09 20 20 20 20 20 20 28 73 71 6c 69 74 )... (sqlit
0870: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 49 e3:execute db "I
0880: 4e 53 45 52 54 20 49 4e 54 4f 20 6b 65 79 73 20 NSERT INTO keys
0890: 28 66 69 65 6c 64 6e 61 6d 65 2c 66 69 65 6c 64 (fieldname,field
08a0: 74 79 70 65 29 20 56 41 4c 55 45 53 20 28 3f 2c type) VALUES (?,
08b0: 3f 29 3b 22 20 28 6b 65 79 3a 67 65 74 2d 66 69 ?);" (key:get-fi
08c0: 65 6c 64 6e 61 6d 65 20 6b 65 79 29 28 6b 65 79 eldname key)(key
08d0: 3a 67 65 74 2d 66 69 65 6c 64 74 79 70 65 20 6b :get-fieldtype k
08e0: 65 79 29 29 29 0a 09 09 20 20 20 20 6b 65 79 73 ey)))... keys
08f0: 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65 78 ).. (sqlite3:ex
0900: 65 63 75 74 65 20 64 62 20 28 63 6f 6e 63 20 0a ecute db (conc .
0910: 09 09 09 20 20 20 20 22 43 52 45 41 54 45 20 54 ... "CREATE T
0920: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 ABLE IF NOT EXIS
0930: 54 53 20 72 75 6e 73 20 28 69 64 20 49 4e 54 45 TS runs (id INTE
0940: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c GER PRIMARY KEY,
0950: 20 22 20 0a 09 09 09 20 20 20 20 66 69 65 6c 64 " .... field
0960: 73 74 72 20 28 69 66 20 68 61 76 65 6b 65 79 73 str (if havekeys
0970: 20 22 2c 22 20 22 22 29 0a 09 09 09 20 20 20 20 "," "")....
0980: 22 72 75 6e 6e 61 6d 65 20 54 45 58 54 2c 22 0a "runname TEXT,".
0990: 09 09 09 20 20 20 20 22 73 74 61 74 65 20 54 45 ... "state TE
09a0: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 22 0a XT DEFAULT '',".
09b0: 09 09 09 20 20 20 20 22 73 74 61 74 75 73 20 54 ... "status T
09c0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 22 EXT DEFAULT '',"
09d0: 0a 09 09 09 20 20 20 20 22 6f 77 6e 65 72 20 54 .... "owner T
09e0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 22 EXT DEFAULT '',"
09f0: 0a 09 09 09 20 20 20 20 22 65 76 65 6e 74 5f 74 .... "event_t
0a00: 69 6d 65 20 54 49 4d 45 53 54 41 4d 50 2c 22 0a ime TIMESTAMP,".
0a10: 09 09 09 20 20 20 20 22 63 6f 6d 6d 65 6e 74 20 ... "comment
0a20: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c TEXT DEFAULT '',
0a30: 22 0a 09 09 09 20 20 20 20 22 66 61 69 6c 5f 63 ".... "fail_c
0a40: 6f 75 6e 74 20 49 4e 54 45 47 45 52 20 44 45 46 ount INTEGER DEF
0a50: 41 55 4c 54 20 30 2c 22 0a 09 09 09 20 20 20 20 AULT 0,"....
0a60: 22 70 61 73 73 5f 63 6f 75 6e 74 20 49 4e 54 45 "pass_count INTE
0a70: 47 45 52 20 44 45 46 41 55 4c 54 20 30 2c 22 0a GER DEFAULT 0,".
0a80: 09 09 09 20 20 20 20 22 43 4f 4e 53 54 52 41 49 ... "CONSTRAI
0a90: 4e 54 20 72 75 6e 73 63 6f 6e 73 74 72 61 69 6e NT runsconstrain
0aa0: 74 20 55 4e 49 51 55 45 20 28 72 75 6e 6e 61 6d t UNIQUE (runnam
0ab0: 65 22 20 28 69 66 20 68 61 76 65 6b 65 79 73 20 e" (if havekeys
0ac0: 22 2c 22 20 22 22 29 20 6b 65 79 73 74 72 20 22 "," "") keystr "
0ad0: 29 29 3b 22 29 29 0a 09 20 20 28 73 71 6c 69 74 ));")).. (sqlit
0ae0: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 28 63 e3:execute db (c
0af0: 6f 6e 63 20 22 43 52 45 41 54 45 20 49 4e 44 45 onc "CREATE INDE
0b00: 58 20 72 75 6e 73 5f 69 6e 64 65 78 20 4f 4e 20 X runs_index ON
0b10: 72 75 6e 73 20 28 72 75 6e 6e 61 6d 65 22 20 28 runs (runname" (
0b20: 69 66 20 68 61 76 65 6b 65 79 73 20 22 2c 22 20 if havekeys ","
0b30: 22 22 29 20 6b 65 79 73 74 72 20 22 29 3b 22 29 "") keystr ");")
0b40: 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65 78 ).. (sqlite3:ex
0b50: 65 63 75 74 65 20 64 62 20 0a 20 20 20 20 20 20 ecute db .
0b60: 20 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 "CREA
0b70: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 TE TABLE IF NOT
0b80: 45 58 49 53 54 53 20 74 65 73 74 73 20 0a 20 20 EXISTS tests .
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0ba0: 20 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 (id INTEGER PR
0bb0: 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 IMARY KEY,.
0bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0bd0: 72 75 6e 5f 69 64 20 20 20 20 20 49 4e 54 45 47 run_id INTEG
0be0: 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 ER,.
0bf0: 20 20 20 20 20 20 20 20 20 74 65 73 74 6e 61 6d testnam
0c00: 65 20 20 20 54 45 58 54 2c 0a 20 20 20 20 20 20 e TEXT,.
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68 h
0c20: 6f 73 74 20 20 20 20 20 20 20 54 45 58 54 20 44 ost TEXT D
0c30: 45 46 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20 20 EFAULT 'n/a',.
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0c50: 20 20 20 63 70 75 6c 6f 61 64 20 20 20 20 52 45 cpuload RE
0c60: 41 4c 20 44 45 46 41 55 4c 54 20 2d 31 2c 0a 20 AL DEFAULT -1,.
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0c80: 20 20 20 20 64 69 73 6b 66 72 65 65 20 20 20 49 diskfree I
0c90: 4e 54 45 47 45 52 20 44 45 46 41 55 4c 54 20 2d NTEGER DEFAULT -
0ca0: 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 1,.
0cb0: 20 20 20 20 20 20 20 20 75 6e 61 6d 65 20 20 20 uname
0cc0: 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 TEXT DEFAULT
0cd0: 27 6e 2f 61 27 2c 20 0a 20 20 20 20 20 20 20 20 'n/a', .
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 75 6e run
0cf0: 64 69 72 20 20 20 20 20 54 45 58 54 20 44 45 46 dir TEXT DEF
0d00: 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20 20 20 20 AULT 'n/a',.
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0d20: 20 73 68 6f 72 74 64 69 72 20 20 20 54 45 58 54 shortdir TEXT
0d30: 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 DEFAULT '',.
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0d50: 20 20 69 74 65 6d 5f 70 61 74 68 20 20 54 45 58 item_path TEX
0d60: 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 T DEFAULT '',.
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0d80: 20 20 20 73 74 61 74 65 20 20 20 20 20 20 54 45 state TE
0d90: 58 54 20 44 45 46 41 55 4c 54 20 27 4e 4f 54 5f XT DEFAULT 'NOT_
0da0: 53 54 41 52 54 45 44 27 2c 0a 20 20 20 20 20 20 STARTED',.
0db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 s
0dc0: 74 61 74 75 73 20 20 20 20 20 54 45 58 54 20 44 tatus TEXT D
0dd0: 45 46 41 55 4c 54 20 27 46 41 49 4c 27 2c 0a 20 EFAULT 'FAIL',.
0de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0df0: 20 20 20 20 61 74 74 65 6d 70 74 6e 75 6d 20 49 attemptnum I
0e00: 4e 54 45 47 45 52 20 44 45 46 41 55 4c 54 20 30 NTEGER DEFAULT 0
0e10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
0e20: 20 20 20 20 20 20 20 66 69 6e 61 6c 5f 6c 6f 67 final_log
0e30: 66 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 f TEXT DEFAULT '
0e40: 6c 6f 67 73 2f 66 69 6e 61 6c 2e 6c 6f 67 27 2c logs/final.log',
0e50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
0e60: 20 20 20 20 20 20 6c 6f 67 64 61 74 20 20 20 20 logdat
0e70: 20 42 4c 4f 42 2c 20 0a 20 20 20 20 20 20 20 20 BLOB, .
0e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 75 6e run
0e90: 5f 64 75 72 61 74 69 6f 6e 20 49 4e 54 45 47 45 _duration INTEGE
0ea0: 52 20 44 45 46 41 55 4c 54 20 30 2c 0a 20 20 20 R DEFAULT 0,.
0eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0ec0: 20 20 63 6f 6d 6d 65 6e 74 20 20 20 20 54 45 58 comment TEX
0ed0: 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 T DEFAULT '',.
0ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0ef0: 20 20 20 65 76 65 6e 74 5f 74 69 6d 65 20 54 49 event_time TI
0f00: 4d 45 53 54 41 4d 50 2c 0a 20 20 20 20 20 20 20 MESTAMP,.
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 61 fa
0f20: 69 6c 5f 63 6f 75 6e 74 20 49 4e 54 45 47 45 52 il_count INTEGER
0f30: 20 44 45 46 41 55 4c 54 20 30 2c 0a 20 20 20 20 DEFAULT 0,.
0f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0f50: 20 70 61 73 73 5f 63 6f 75 6e 74 20 49 4e 54 45 pass_count INTE
0f60: 47 45 52 20 44 45 46 41 55 4c 54 20 30 2c 0a 20 GER DEFAULT 0,.
0f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0f80: 20 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 CONSTRAINT t
0f90: 65 73 74 73 63 6f 6e 73 74 72 61 69 6e 74 20 55 estsconstraint U
0fa0: 4e 49 51 55 45 20 28 72 75 6e 5f 69 64 2c 20 74 NIQUE (run_id, t
0fb0: 65 73 74 6e 61 6d 65 2c 20 69 74 65 6d 5f 70 61 estname, item_pa
0fc0: 74 68 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b th). );
0fd0: 22 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65 ").. (sqlite3:e
0fe0: 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 54 xecute db "CREAT
0ff0: 45 20 49 4e 44 45 58 20 74 65 73 74 73 5f 69 6e E INDEX tests_in
1000: 64 65 78 20 4f 4e 20 74 65 73 74 73 20 28 72 75 dex ON tests (ru
1010: 6e 5f 69 64 2c 20 74 65 73 74 6e 61 6d 65 29 3b n_id, testname);
1020: 22 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65 ").. (sqlite3:e
1030: 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 54 xecute db "CREAT
1040: 45 20 56 49 45 57 20 72 75 6e 73 5f 74 65 73 74 E VIEW runs_test
1050: 73 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52 s AS SELECT * FR
1060: 4f 4d 20 72 75 6e 73 20 49 4e 4e 45 52 20 4a 4f OM runs INNER JO
1070: 49 4e 20 74 65 73 74 73 20 4f 4e 20 72 75 6e 73 IN tests ON runs
1080: 2e 69 64 3d 74 65 73 74 73 2e 72 75 6e 5f 69 64 .id=tests.run_id
1090: 3b 22 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a ;").. (sqlite3:
10a0: 65 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 execute db "CREA
10b0: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 TE TABLE IF NOT
10c0: 45 58 49 53 54 53 20 74 65 73 74 5f 73 74 65 70 EXISTS test_step
10d0: 73 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 s .
10e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
10f0: 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 (id INTEGER PRI
1100: 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 20 MARY KEY,.
1110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1120: 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 69 64 test_id
1130: 20 49 4e 54 45 47 45 52 2c 20 0a 20 20 20 20 20 INTEGER, .
1140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1150: 20 20 20 20 20 20 20 20 20 20 73 74 65 70 6e 61 stepna
1160: 6d 65 20 54 45 58 54 2c 20 0a 20 20 20 20 20 20 me TEXT, .
1170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1180: 20 20 20 20 20 20 20 20 20 73 74 61 74 65 20 54 state T
1190: 45 58 54 20 44 45 46 41 55 4c 54 20 27 4e 4f 54 EXT DEFAULT 'NOT
11a0: 5f 53 54 41 52 54 45 44 27 2c 20 0a 20 20 20 20 _STARTED', .
11b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
11c0: 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 75 statu
11d0: 73 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 s TEXT DEFAULT '
11e0: 6e 2f 61 27 2c 0a 20 20 20 20 20 20 20 20 20 20 n/a',.
11f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1200: 20 20 20 20 20 65 76 65 6e 74 5f 74 69 6d 65 20 event_time
1210: 54 49 4d 45 53 54 41 4d 50 2c 0a 20 20 20 20 20 TIMESTAMP,.
1220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1230: 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 65 6e commen
1240: 74 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 t TEXT DEFAULT '
1250: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ',.
1260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1270: 20 20 6c 6f 67 66 69 6c 65 20 54 45 58 54 20 44 logfile TEXT D
1280: 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 EFAULT '',.
1290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
12a0: 20 20 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52 CONSTR
12b0: 41 49 4e 54 20 74 65 73 74 5f 73 74 65 70 73 5f AINT test_steps_
12c0: 63 6f 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 55 constraint UNIQU
12d0: 45 20 28 74 65 73 74 5f 69 64 2c 73 74 65 70 6e E (test_id,stepn
12e0: 61 6d 65 2c 73 74 61 74 65 29 29 3b 22 29 0a 09 ame,state));")..
12f0: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 (sqlite3:execu
1300: 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41 te db "CREATE TA
1310: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 BLE IF NOT EXIST
1320: 53 20 65 78 74 72 61 64 61 74 20 28 69 64 20 49 S extradat (id I
1330: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b NTEGER PRIMARY K
1340: 45 59 2c 20 72 75 6e 5f 69 64 20 49 4e 54 45 47 EY, run_id INTEG
1350: 45 52 2c 20 6b 65 79 20 54 45 58 54 2c 20 76 61 ER, key TEXT, va
1360: 6c 20 54 45 58 54 29 3b 22 29 0a 09 20 20 28 73 l TEXT);").. (s
1370: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 qlite3:execute d
1380: 62 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 b "CREATE TABLE
1390: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 6d 65 IF NOT EXISTS me
13a0: 74 61 64 61 74 20 28 69 64 20 49 4e 54 45 47 45 tadat (id INTEGE
13b0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 R PRIMARY KEY, v
13c0: 61 72 20 54 45 58 54 2c 20 76 61 6c 20 54 45 58 ar TEXT, val TEX
13d0: 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 T,.
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
13f0: 20 20 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 CONSTRAINT
1400: 6d 65 74 61 64 61 74 5f 63 6f 6e 73 74 72 61 69 metadat_constrai
1410: 6e 74 20 55 4e 49 51 55 45 20 28 76 61 72 29 29 nt UNIQUE (var))
1420: 3b 22 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a ;").. (sqlite3:
1430: 65 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 execute db "CREA
1440: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 TE TABLE IF NOT
1450: 45 58 49 53 54 53 20 61 63 63 65 73 73 5f 6c 6f EXISTS access_lo
1460: 67 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 g (id INTEGER PR
1470: 49 4d 41 52 59 20 4b 45 59 2c 20 75 73 65 72 20 IMARY KEY, user
1480: 54 45 58 54 2c 20 61 63 63 65 73 73 65 64 20 54 TEXT, accessed T
1490: 49 4d 45 53 54 41 4d 50 2c 20 61 72 67 73 20 54 IMESTAMP, args T
14a0: 45 58 54 29 3b 22 29 0a 09 20 20 28 73 71 6c 69 EXT);").. (sqli
14b0: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 te3:execute db "
14c0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 CREATE TABLE IF
14d0: 4e 4f 54 20 45 58 49 53 54 53 20 74 65 73 74 5f NOT EXISTS test_
14e0: 6d 65 74 61 20 28 69 64 20 49 4e 54 45 47 45 52 meta (id INTEGER
14f0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 PRIMARY KEY,.
1500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1520: 20 20 20 74 65 73 74 6e 61 6d 65 20 20 20 20 54 testname T
1530: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a EXT DEFAULT '',.
1540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1560: 20 20 20 20 20 61 75 74 68 6f 72 20 20 20 20 20 author
1570: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 TEXT DEFAULT ''
1580: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15a0: 20 20 20 20 20 20 20 6f 77 6e 65 72 20 20 20 20 owner
15b0: 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 TEXT DEFAULT
15c0: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 '',.
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
15e0: 20 20 20 20 20 20 20 20 20 64 65 73 63 72 69 70 descrip
15f0: 74 69 6f 6e 20 54 45 58 54 20 44 45 46 41 55 4c tion TEXT DEFAUL
1600: 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 T '',.
1610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1620: 20 20 20 20 20 20 20 20 20 20 20 72 65 76 69 65 revie
1630: 77 65 64 20 20 20 20 54 49 4d 45 53 54 41 4d 50 wed TIMESTAMP
1640: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1660: 20 20 20 20 20 20 20 69 74 65 72 61 74 65 64 20 iterated
1670: 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 TEXT DEFAULT
1680: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 '',.
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16a0: 20 20 20 20 20 20 20 20 20 61 76 67 5f 72 75 6e avg_run
16b0: 74 69 6d 65 20 52 45 41 4c 2c 0a 20 20 20 20 20 time REAL,.
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
16e0: 61 76 67 5f 64 69 73 6b 20 20 20 20 52 45 41 4c avg_disk REAL
16f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1710: 20 20 20 20 20 20 20 74 61 67 73 20 20 20 20 20 tags
1720: 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 TEXT DEFAULT
1730: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 '',.
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1750: 20 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 CONSTRAINT t
1760: 65 73 74 5f 6d 65 74 61 5f 63 6f 6e 73 74 72 61 est_meta_constra
1770: 69 6e 74 20 55 4e 49 51 55 45 20 28 74 65 73 74 int UNIQUE (test
1780: 6e 61 6d 65 29 29 3b 22 29 0a 09 20 20 28 73 71 name));").. (sq
1790: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 lite3:execute db
17a0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 "CREATE TABLE I
17b0: 46 20 4e 4f 54 20 45 58 49 53 54 53 20 74 65 73 F NOT EXISTS tes
17c0: 74 5f 64 61 74 61 20 28 69 64 20 49 4e 54 45 47 t_data (id INTEG
17d0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a ER PRIMARY KEY,.
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: 74 65 73 74 5f 69 64 20 49 4e 54 45 47 45 52 2c test_id INTEGER,
1810: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1830: 20 63 61 74 65 67 6f 72 79 20 54 45 58 54 20 44 category TEXT D
1840: 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 EFAULT '',.
1850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1860: 20 20 20 20 20 20 20 20 20 20 20 76 61 72 69 61 varia
1870: 62 6c 65 20 54 45 58 54 2c 0a 09 20 20 20 20 20 ble TEXT,..
1880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1890: 20 20 20 76 61 6c 75 65 20 52 45 41 4c 2c 0a 09 value REAL,..
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 65 78 70 65 63 74 65 64 expected
18c0: 20 52 45 41 4c 2c 0a 09 20 20 20 20 20 20 20 20 REAL,..
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
18e0: 74 6f 6c 20 52 45 41 4c 2c 0a 20 20 20 20 20 20 tol REAL,.
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1900: 20 20 20 20 20 20 20 20 20 20 75 6e 69 74 73 20 units
1910: 54 45 58 54 2c 0a 20 20 20 20 20 20 20 20 20 20 TEXT,.
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1930: 20 20 20 20 20 20 63 6f 6d 6d 65 6e 74 20 54 45 comment 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 73 s
1970: 74 61 74 75 73 20 54 45 58 54 20 44 45 46 41 55 tatus TEXT DEFAU
1980: 4c 54 20 27 6e 2f 61 27 2c 0a 20 20 20 20 20 20 LT 'n/a',.
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
19a0: 20 20 20 20 20 20 20 20 20 20 74 79 70 65 20 54 type T
19b0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a EXT DEFAULT '',.
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
19d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 4f CO
19e0: 4e 53 54 52 41 49 4e 54 20 74 65 73 74 5f 64 61 NSTRAINT test_da
19f0: 74 61 5f 63 6f 6e 73 74 72 61 69 6e 74 20 55 4e ta_constraint UN
1a00: 49 51 55 45 20 28 74 65 73 74 5f 69 64 2c 63 61 IQUE (test_id,ca
1a10: 74 65 67 6f 72 79 2c 76 61 72 69 61 62 6c 65 29 tegory,variable)
1a20: 29 3b 22 29 0a 09 20 20 3b 3b 20 4d 75 73 74 20 );").. ;; Must
1a30: 64 6f 20 74 68 69 73 20 2a 61 66 74 65 72 2a 20 do this *after*
1a40: 72 75 6e 6e 69 6e 67 20 70 61 74 63 68 20 64 62 running patch db
1a50: 20 21 21 20 4e 6f 20 6d 6f 72 65 2e 20 0a 09 20 !! No more. ..
1a60: 20 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 (db:set-var db
1a70: 22 4d 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f "MEGATEST_VERSIO
1a80: 4e 22 20 6d 65 67 61 74 65 73 74 2d 76 65 72 73 N" megatest-vers
1a90: 69 6f 6e 29 0a 09 20 20 29 29 0a 20 20 20 20 64 ion).. )). d
1aa0: 62 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d b))..;;=========
1ab0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1ac0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1ad0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1ae0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b =============.;;
1af0: 20 54 4f 44 4f 3a 0a 3b 3b 20 20 20 70 75 74 20 TODO:.;; put
1b00: 64 65 6c 74 61 73 20 69 6e 74 6f 20 61 6e 20 61 deltas into an a
1b10: 73 73 6f 63 20 6c 69 73 74 20 77 69 74 68 20 76 ssoc list with v
1b20: 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 73 0a 3b ersion numbers.;
1b30: 3b 20 20 20 61 70 70 6c 79 20 61 6c 6c 20 66 72 ; apply all fr
1b40: 6f 6d 20 6c 61 73 74 20 74 6f 20 63 75 72 72 65 om last to curre
1b50: 6e 74 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d nt.;;===========
1b60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1b70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1b80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1b90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 28 64 65 66 ===========.(def
1ba0: 69 6e 65 20 28 70 61 74 63 68 2d 64 62 20 64 62 ine (patch-db db
1bb0: 29 0a 20 20 28 68 61 6e 64 6c 65 2d 65 78 63 65 ). (handle-exce
1bc0: 70 74 69 6f 6e 73 0a 20 20 20 65 78 6e 0a 20 20 ptions. exn.
1bd0: 20 28 62 65 67 69 6e 0a 20 20 20 20 20 28 70 72 (begin. (pr
1be0: 69 6e 74 20 22 45 78 63 65 70 74 69 6f 6e 3a 20 int "Exception:
1bf0: 22 20 65 78 6e 29 0a 20 20 20 20 20 28 70 72 69 " exn). (pri
1c00: 6e 74 20 22 45 52 52 4f 52 3a 20 50 6f 73 73 69 nt "ERROR: Possi
1c10: 62 6c 65 20 6f 75 74 20 6f 66 20 64 61 74 65 20 ble out of date
1c20: 73 63 68 65 6d 61 2c 20 61 74 74 65 6d 70 74 69 schema, attempti
1c30: 6e 67 20 74 6f 20 61 64 64 20 74 61 62 6c 65 20 ng to add table
1c40: 6d 65 74 61 64 61 74 61 2e 2e 2e 22 29 0a 20 20 metadata...").
1c50: 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 (sqlite3:exec
1c60: 75 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54 ute db "CREATE T
1c70: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 ABLE IF NOT EXIS
1c80: 54 53 20 6d 65 74 61 64 61 74 20 28 69 64 20 49 TS metadat (id I
1c90: 4e 54 45 47 45 52 2c 20 76 61 72 20 54 45 58 54 NTEGER, var TEXT
1ca0: 2c 20 76 61 6c 20 54 45 58 54 2c 0a 20 20 20 20 , val TEXT,.
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e CON
1cd0: 53 54 52 41 49 4e 54 20 6d 65 74 61 64 61 74 5f STRAINT metadat_
1ce0: 63 6f 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 55 constraint UNIQU
1cf0: 45 20 28 76 61 72 29 29 3b 22 29 0a 20 20 20 20 E (var));").
1d00: 20 28 69 66 20 28 6e 6f 74 20 28 64 62 3a 67 65 (if (not (db:ge
1d10: 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 t-var db "MEGATE
1d20: 53 54 5f 56 45 52 53 49 4f 4e 22 29 29 0a 09 20 ST_VERSION"))..
1d30: 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22 (db:set-var db "
1d40: 4d 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e MEGATEST_VERSION
1d50: 22 20 31 2e 31 37 29 29 29 0a 20 20 20 28 6c 65 " 1.17))). (le
1d60: 74 20 28 28 6d 76 65 72 20 28 64 62 3a 67 65 74 t ((mver (db:get
1d70: 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 53 -var db "MEGATES
1d80: 54 5f 56 45 52 53 49 4f 4e 22 29 29 0a 09 20 28 T_VERSION")).. (
1d90: 74 65 73 74 2d 6d 65 74 61 2d 64 65 66 20 22 43 test-meta-def "C
1da0: 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e REATE TABLE IF N
1db0: 4f 54 20 45 58 49 53 54 53 20 74 65 73 74 5f 6d OT EXISTS test_m
1dc0: 65 74 61 20 28 69 64 20 49 4e 54 45 47 45 52 20 eta (id INTEGER
1dd0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 PRIMARY KEY,.
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e00: 20 20 74 65 73 74 6e 61 6d 65 20 20 20 20 54 45 testname TE
1e10: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 XT DEFAULT '',.
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e40: 20 20 20 20 61 75 74 68 6f 72 20 20 20 20 20 20 author
1e50: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c TEXT DEFAULT '',
1e60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1e80: 20 20 20 20 20 20 6f 77 6e 65 72 20 20 20 20 20 owner
1e90: 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 TEXT DEFAULT '
1ea0: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ',.
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ec0: 20 20 20 20 20 20 20 20 64 65 73 63 72 69 70 74 descript
1ed0: 69 6f 6e 20 54 45 58 54 20 44 45 46 41 55 4c 54 ion TEXT DEFAULT
1ee0: 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 '',.
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1f00: 20 20 20 20 20 20 20 20 20 20 72 65 76 69 65 77 review
1f10: 65 64 20 20 20 20 54 49 4d 45 53 54 41 4d 50 2c ed TIMESTAMP,
1f20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1f40: 20 20 20 20 20 20 69 74 65 72 61 74 65 64 20 20 iterated
1f50: 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 TEXT DEFAULT '
1f60: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ',.
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1f80: 20 20 20 20 20 20 20 20 61 76 67 5f 72 75 6e 74 avg_runt
1f90: 69 6d 65 20 52 45 41 4c 2c 0a 20 20 20 20 20 20 ime REAL,.
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 a
1fc0: 76 67 5f 64 69 73 6b 20 20 20 20 52 45 41 4c 2c vg_disk REAL,
1fd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1ff0: 20 20 20 20 20 20 74 61 67 73 20 20 20 20 20 20 tags
2000: 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 TEXT DEFAULT '
2010: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ',.
2020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2030: 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 65 CONSTRAINT te
2040: 73 74 5f 6d 65 74 61 5f 63 6f 6e 73 74 72 61 69 st_meta_constrai
2050: 6e 74 20 55 4e 49 51 55 45 20 28 74 65 73 74 6e nt UNIQUE (testn
2060: 61 6d 65 29 29 3b 22 29 29 0a 20 20 20 20 20 28 ame));")). (
2070: 70 72 69 6e 74 20 22 43 75 72 72 65 6e 74 20 73 print "Current s
2080: 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 3a 20 22 chema version: "
2090: 20 6d 76 65 72 20 22 20 63 75 72 72 65 6e 74 20 mver " current
20a0: 6d 65 67 61 74 65 73 74 20 76 65 72 73 69 6f 6e megatest version
20b0: 3a 20 22 20 6d 65 67 61 74 65 73 74 2d 76 65 72 : " megatest-ver
20c0: 73 69 6f 6e 29 0a 20 20 20 20 20 28 63 6f 6e 64 sion). (cond
20d0: 0a 20 20 20 20 20 20 28 28 6e 6f 74 20 6d 76 65 . ((not mve
20e0: 72 29 0a 20 20 20 20 20 20 20 28 70 72 69 6e 74 r). (print
20f0: 20 22 41 64 64 69 6e 67 20 6d 65 67 61 74 65 73 "Adding megates
2100: 74 2d 76 65 72 73 69 6f 6e 20 74 6f 20 6d 65 74 t-version to met
2110: 61 64 61 74 61 22 29 20 3b 3b 20 4e 65 65 64 20 adata") ;; Need
2120: 74 6f 20 72 65 63 72 65 61 74 65 20 74 68 65 20 to recreate the
2130: 74 61 62 6c 65 0a 20 20 20 20 20 20 20 28 73 71 table. (sq
2140: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 lite3:execute db
2150: 20 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 "DROP TABLE IF
2160: 45 58 49 53 54 53 20 6d 65 74 61 64 61 74 3b 22 EXISTS metadat;"
2170: 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 ). (sqlite
2180: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 43 52 3:execute db "CR
2190: 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f EATE TABLE IF NO
21a0: 54 20 45 58 49 53 54 53 20 6d 65 74 61 64 61 74 T EXISTS metadat
21b0: 20 28 69 64 20 49 4e 54 45 47 45 52 2c 20 76 61 (id INTEGER, va
21c0: 72 20 54 45 58 54 2c 20 76 61 6c 20 54 45 58 54 r TEXT, val TEXT
21d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
21f0: 20 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 6d CONSTRAINT m
2200: 65 74 61 64 61 74 5f 63 6f 6e 73 74 72 61 69 6e etadat_constrain
2210: 74 20 55 4e 49 51 55 45 20 28 76 61 72 29 29 3b t UNIQUE (var));
2220: 22 29 0a 20 20 20 20 20 20 20 28 64 62 3a 73 65 "). (db:se
2230: 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 t-var db "MEGATE
2240: 53 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e 31 37 ST_VERSION" 1.17
2250: 29 0a 20 20 20 20 20 20 20 28 70 61 74 63 68 2d ). (patch-
2260: 64 62 29 29 0a 20 20 20 20 20 20 28 28 3c 20 6d db)). ((< m
2270: 76 65 72 20 31 2e 32 31 29 0a 20 20 20 20 20 20 ver 1.21).
2280: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 (sqlite3:execut
2290: 65 20 64 62 20 22 44 52 4f 50 20 54 41 42 4c 45 e db "DROP TABLE
22a0: 20 49 46 20 45 58 49 53 54 53 20 6d 65 74 61 64 IF EXISTS metad
22b0: 61 74 3b 22 29 0a 20 20 20 20 20 20 20 28 73 71 at;"). (sq
22c0: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 lite3:execute db
22d0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 "CREATE TABLE I
22e0: 46 20 4e 4f 54 20 45 58 49 53 54 53 20 6d 65 74 F NOT EXISTS met
22f0: 61 64 61 74 20 28 69 64 20 49 4e 54 45 47 45 52 adat (id INTEGER
2300: 2c 20 76 61 72 20 54 45 58 54 2c 20 76 61 6c 20 , var TEXT, val
2310: 54 45 58 54 2c 0a 20 20 20 20 20 20 20 20 20 20 TEXT,.
2320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2330: 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52 41 49 CONSTRAI
2340: 4e 54 20 6d 65 74 61 64 61 74 5f 63 6f 6e 73 74 NT metadat_const
2350: 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28 76 61 raint UNIQUE (va
2360: 72 29 29 3b 22 29 0a 20 20 20 20 20 20 20 28 64 r));"). (d
2370: 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 b:set-var db "ME
2380: 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 GATEST_VERSION"
2390: 31 2e 32 31 29 20 3b 3b 20 73 65 74 20 62 65 66 1.21) ;; set bef
23a0: 6f 72 65 2c 20 6a 75 73 74 20 69 6e 20 63 61 73 ore, just in cas
23b0: 65 20 74 68 65 20 63 68 61 6e 67 65 73 20 61 72 e the changes ar
23c0: 65 20 61 6c 72 65 61 64 79 20 61 70 70 6c 69 65 e already applie
23d0: 64 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 d. (sqlite
23e0: 33 3a 65 78 65 63 75 74 65 20 64 62 20 74 65 73 3:execute db tes
23f0: 74 2d 6d 65 74 61 2d 64 65 66 29 0a 20 20 20 20 t-meta-def).
2400: 20 20 20 3b 28 66 6f 72 2d 65 61 63 68 20 0a 20 ;(for-each .
2410: 20 20 20 20 20 20 3b 20 28 6c 61 6d 62 64 61 20 ; (lambda
2420: 28 73 74 6d 74 29 0a 20 20 20 20 20 20 20 3b 20 (stmt). ;
2430: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 (sqlite3:execu
2440: 74 65 20 64 62 20 73 74 6d 74 29 29 0a 20 20 20 te db stmt)).
2450: 20 20 20 20 3b 20 28 6c 69 73 74 20 0a 20 20 20 ; (list .
2460: 20 20 20 20 3b 20 20 22 41 4c 54 45 52 20 54 41 ; "ALTER TA
2470: 42 4c 45 20 74 65 73 74 73 20 41 44 44 20 43 4f BLE tests ADD CO
2480: 4c 55 4d 4e 20 66 69 72 73 74 5f 65 72 72 20 54 LUMN first_err T
2490: 45 58 54 3b 22 0a 20 20 20 20 20 20 20 3b 20 20 EXT;". ;
24a0: 22 41 4c 54 45 52 20 54 41 42 4c 45 20 74 65 73 "ALTER TABLE tes
24b0: 74 73 20 41 44 44 20 43 4f 4c 55 4d 4e 20 66 69 ts ADD COLUMN fi
24c0: 72 73 74 5f 77 61 72 6e 20 54 45 58 54 3b 22 0a rst_warn TEXT;".
24d0: 20 20 20 20 20 20 20 3b 20 20 29 29 0a 20 20 20 ; )).
24e0: 20 20 20 20 28 70 61 74 63 68 2d 64 62 29 29 0a (patch-db)).
24f0: 20 20 20 20 20 20 28 28 3c 20 6d 76 65 72 20 31 ((< mver 1
2500: 2e 32 34 29 0a 20 20 20 20 20 20 20 28 64 62 3a .24). (db:
2510: 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41 set-var db "MEGA
2520: 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e TEST_VERSION" 1.
2530: 32 34 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69 24). (sqli
2540: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 te3:execute db "
2550: 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 DROP TABLE IF EX
2560: 49 53 54 53 20 74 65 73 74 5f 64 61 74 61 3b 22 ISTS test_data;"
2570: 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 ). (sqlite
2580: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 44 52 3:execute db "DR
2590: 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 OP TABLE IF EXIS
25a0: 54 53 20 74 65 73 74 5f 6d 65 74 61 3b 22 29 0a TS test_meta;").
25b0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a (sqlite3:
25c0: 65 78 65 63 75 74 65 20 64 62 20 74 65 73 74 2d execute db test-
25d0: 6d 65 74 61 2d 64 65 66 29 0a 20 20 20 20 20 20 meta-def).
25e0: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 (sqlite3:execut
25f0: 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41 42 e db "CREATE TAB
2600: 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 LE IF NOT EXISTS
2610: 20 74 65 73 74 5f 64 61 74 61 20 28 69 64 20 49 test_data (id I
2620: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b NTEGER PRIMARY K
2630: 45 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 EY,.
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2650: 20 20 20 20 74 65 73 74 5f 69 64 20 49 4e 54 45 test_id INTE
2660: 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 GER,.
2670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2680: 20 20 20 20 20 63 61 74 65 67 6f 72 79 20 54 45 category TE
2690: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 XT DEFAULT '',.
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76 v
26c0: 61 72 69 61 62 6c 65 20 54 45 58 54 2c 0a 09 20 ariable TEXT,..
26d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
26e0: 20 20 20 20 20 20 20 76 61 6c 75 65 20 52 45 41 value REA
26f0: 4c 2c 0a 09 20 20 20 20 20 20 20 20 20 20 20 20 L,..
2700: 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70 65 expe
2710: 63 74 65 64 20 52 45 41 4c 2c 0a 09 20 20 20 20 cted REAL,..
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2730: 20 20 20 20 74 6f 6c 20 52 45 41 4c 2c 0a 20 20 tol REAL,.
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 6e un
2760: 69 74 73 20 54 45 58 54 2c 0a 20 20 20 20 20 20 its TEXT,.
2770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2780: 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 65 6e commen
2790: 74 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 t TEXT DEFAULT '
27a0: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ',.
27b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
27c0: 20 20 20 73 74 61 74 75 73 20 54 45 58 54 20 44 status TEXT D
27d0: 45 46 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20 20 EFAULT 'n/a',.
27e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e 53 CONS
2800: 54 52 41 49 4e 54 20 74 65 73 74 5f 64 61 74 61 TRAINT test_data
2810: 20 55 4e 49 51 55 45 20 28 74 65 73 74 5f 69 64 UNIQUE (test_id
2820: 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62 ,category,variab
2830: 6c 65 29 29 3b 22 29 0a 20 20 20 20 20 20 20 28 le));"). (
2840: 70 72 69 6e 74 20 22 57 41 52 4e 49 4e 47 3a 20 print "WARNING:
2850: 54 61 62 6c 65 20 74 65 73 74 5f 64 61 74 61 20 Table test_data
2860: 61 6e 64 20 74 65 73 74 5f 6d 65 74 61 20 77 68 and test_meta wh
2870: 65 72 65 20 72 65 63 72 65 61 74 65 64 2e 20 50 ere recreated. P
2880: 6c 65 61 73 65 20 64 6f 20 6d 65 67 61 74 65 73 lease do megates
2890: 74 20 2d 75 70 64 61 74 65 2d 6d 65 74 61 22 29 t -update-meta")
28a0: 0a 20 20 20 20 20 20 20 28 70 61 74 63 68 2d 64 . (patch-d
28b0: 62 29 29 0a 20 20 20 20 20 20 28 28 3c 20 6d 76 b)). ((< mv
28c0: 65 72 20 31 2e 32 37 29 0a 20 20 20 20 20 20 20 er 1.27).
28d0: 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22 (db:set-var db "
28e0: 4d 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e MEGATEST_VERSION
28f0: 22 20 31 2e 32 37 29 0a 20 20 20 20 20 20 20 28 " 1.27). (
2900: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 sqlite3:execute
2910: 64 62 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 db "ALTER TABLE
2920: 74 65 73 74 5f 64 61 74 61 20 41 44 44 20 43 4f test_data ADD CO
2930: 4c 55 4d 4e 20 74 79 70 65 20 54 45 58 54 20 44 LUMN type TEXT D
2940: 45 46 41 55 4c 54 20 27 27 3b 22 29 0a 20 20 20 EFAULT '';").
2950: 20 20 20 20 28 70 61 74 63 68 2d 64 62 29 29 0a (patch-db)).
2960: 20 20 20 20 20 20 28 28 3c 20 6d 76 65 72 20 31 ((< mver 1
2970: 2e 32 39 29 0a 20 20 20 20 20 20 20 28 64 62 3a .29). (db:
2980: 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41 set-var db "MEGA
2990: 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e TEST_VERSION" 1.
29a0: 32 39 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69 29). (sqli
29b0: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 te3:execute db "
29c0: 41 4c 54 45 52 20 54 41 42 4c 45 20 74 65 73 74 ALTER TABLE test
29d0: 5f 73 74 65 70 73 20 41 44 44 20 43 4f 4c 55 4d _steps ADD COLUM
29e0: 4e 20 6c 6f 67 66 69 6c 65 20 54 45 58 54 20 44 N logfile TEXT D
29f0: 45 46 41 55 4c 54 20 27 27 3b 22 29 0a 20 20 20 EFAULT '';").
2a00: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 (sqlite3:exe
2a10: 63 75 74 65 20 64 62 20 22 41 4c 54 45 52 20 54 cute db "ALTER T
2a20: 41 42 4c 45 20 74 65 73 74 73 20 41 44 44 20 43 ABLE tests ADD C
2a30: 4f 4c 55 4d 4e 20 73 68 6f 72 74 64 69 72 20 54 OLUMN shortdir T
2a40: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 3b 22 EXT DEFAULT '';"
2a50: 29 29 0a 20 20 20 20 20 20 28 28 3c 20 6d 76 65 )). ((< mve
2a60: 72 20 6d 65 67 61 74 65 73 74 2d 76 65 72 73 69 r megatest-versi
2a70: 6f 6e 29 0a 20 20 20 20 20 20 20 28 64 62 3a 73 on). (db:s
2a80: 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 et-var db "MEGAT
2a90: 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 6d 65 67 EST_VERSION" meg
2aa0: 61 74 65 73 74 2d 76 65 72 73 69 6f 6e 29 29 29 atest-version)))
2ab0: 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d )))..;;=========
2ac0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2ad0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2ae0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2af0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b =============.;;
2b00: 20 6d 65 74 61 20 67 65 74 20 61 6e 64 20 73 65 meta get and se
2b10: 74 20 76 61 72 73 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d t vars.;;=======
2b20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2b30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2b40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2b50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a ===============.
2b60: 0a 3b 3b 20 72 65 74 75 72 6e 73 20 6e 75 6d 62 .;; returns numb
2b70: 65 72 20 69 66 20 73 74 72 69 6e 67 2d 3e 6e 75 er if string->nu
2b80: 6d 62 65 72 20 69 73 20 73 75 63 63 65 73 73 66 mber is successf
2b90: 75 6c 2c 20 73 74 72 69 6e 67 20 6f 74 68 65 72 ul, string other
2ba0: 77 69 73 65 0a 28 64 65 66 69 6e 65 20 28 64 62 wise.(define (db
2bb0: 3a 67 65 74 2d 76 61 72 20 64 62 20 76 61 72 29 :get-var db var)
2bc0: 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20 23 66 . (let ((res #f
2bd0: 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a )). (sqlite3:
2be0: 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 for-each-row.
2bf0: 20 20 28 6c 61 6d 62 64 61 20 28 76 61 6c 29 0a (lambda (val).
2c00: 20 20 20 20 20 20 20 28 73 65 74 21 20 72 65 73 (set! res
2c10: 20 76 61 6c 29 29 0a 20 20 20 20 20 64 62 20 22 val)). db "
2c20: 53 45 4c 45 43 54 20 76 61 6c 20 46 52 4f 4d 20 SELECT val FROM
2c30: 6d 65 74 61 64 61 74 20 57 48 45 52 45 20 76 61 metadat WHERE va
2c40: 72 3d 3f 3b 22 20 76 61 72 29 0a 20 20 20 20 28 r=?;" var). (
2c50: 69 66 20 28 73 74 72 69 6e 67 3f 20 72 65 73 29 if (string? res)
2c60: 0a 09 28 6c 65 74 20 28 28 76 61 6c 6e 75 6d 20 ..(let ((valnum
2c70: 28 73 74 72 69 6e 67 2d 3e 6e 75 6d 62 65 72 20 (string->number
2c80: 72 65 73 29 29 29 0a 09 20 20 28 69 66 20 76 61 res))).. (if va
2c90: 6c 6e 75 6d 20 76 61 6c 6e 75 6d 20 72 65 73 29 lnum valnum res)
2ca0: 29 0a 09 72 65 73 29 29 29 0a 0a 28 64 65 66 69 )..res)))..(defi
2cb0: 6e 65 20 28 64 62 3a 73 65 74 2d 76 61 72 20 64 ne (db:set-var d
2cc0: 62 20 76 61 72 20 76 61 6c 29 0a 20 20 28 73 71 b var val). (sq
2cd0: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 lite3:execute db
2ce0: 20 22 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c "INSERT OR REPL
2cf0: 41 43 45 20 49 4e 54 4f 20 6d 65 74 61 64 61 74 ACE INTO metadat
2d00: 20 28 76 61 72 2c 76 61 6c 29 20 56 41 4c 55 45 (var,val) VALUE
2d10: 53 20 28 3f 2c 3f 29 3b 22 20 76 61 72 20 76 61 S (?,?);" var va
2d20: 6c 29 29 0a 0a 3b 3b 20 75 73 65 20 61 20 67 6c l))..;; use a gl
2d30: 6f 62 61 6c 20 66 6f 72 20 73 6f 6d 65 20 70 72 obal for some pr
2d40: 69 6d 69 74 69 76 65 20 63 61 63 68 69 6e 67 2c imitive caching,
2d50: 20 69 74 20 69 73 20 6a 75 73 74 20 73 69 6c 6c it is just sill
2d60: 79 20 74 6f 20 72 65 2d 72 65 61 64 20 74 68 65 y to re-read the
2d70: 20 64 62 20 0a 3b 3b 20 6f 76 65 72 20 61 6e 64 db .;; over and
2d80: 20 6f 76 65 72 20 61 67 61 69 6e 20 66 6f 72 20 over again for
2d90: 74 68 65 20 6b 65 79 73 20 73 69 6e 63 65 20 74 the keys since t
2da0: 68 65 79 20 6e 65 76 65 72 20 63 68 61 6e 67 65 hey never change
2db0: 0a 0a 28 64 65 66 69 6e 65 20 2a 64 62 2d 6b 65 ..(define *db-ke
2dc0: 79 73 2a 20 23 66 29 0a 0a 28 64 65 66 69 6e 65 ys* #f)..(define
2dd0: 20 28 64 62 2d 67 65 74 2d 6b 65 79 73 20 64 62 (db-get-keys db
2de0: 29 0a 20 20 28 69 66 20 2a 64 62 2d 6b 65 79 73 ). (if *db-keys
2df0: 2a 20 2a 64 62 2d 6b 65 79 73 2a 20 0a 20 20 20 * *db-keys* .
2e00: 20 20 20 28 6c 65 74 20 28 28 72 65 73 20 27 28 (let ((res '(
2e10: 29 29 29 0a 09 28 73 71 6c 69 74 65 33 3a 66 6f )))..(sqlite3:fo
2e20: 72 2d 65 61 63 68 2d 72 6f 77 20 0a 09 20 28 6c r-each-row .. (l
2e30: 61 6d 62 64 61 20 28 6b 65 79 20 6b 65 79 74 79 ambda (key keyty
2e40: 70 65 29 0a 09 20 20 20 28 73 65 74 21 20 72 65 pe).. (set! re
2e50: 73 20 28 63 6f 6e 73 20 28 76 65 63 74 6f 72 20 s (cons (vector
2e60: 6b 65 79 20 6b 65 79 74 79 70 65 29 20 72 65 73 key keytype) res
2e70: 29 29 29 0a 09 20 64 62 0a 09 20 22 53 45 4c 45 ))).. db.. "SELE
2e80: 43 54 20 66 69 65 6c 64 6e 61 6d 65 2c 66 69 65 CT fieldname,fie
2e90: 6c 64 74 79 70 65 20 46 52 4f 4d 20 6b 65 79 73 ldtype FROM keys
2ea0: 20 4f 52 44 45 52 20 42 59 20 69 64 20 44 45 53 ORDER BY id DES
2eb0: 43 3b 22 29 0a 09 28 73 65 74 21 20 2a 64 62 2d C;")..(set! *db-
2ec0: 6b 65 79 73 2a 20 72 65 73 29 0a 09 72 65 73 29 keys* res)..res)
2ed0: 29 29 0a 0a 28 64 65 66 69 6e 65 20 64 62 3a 67 ))..(define db:g
2ee0: 65 74 2d 6b 65 79 73 20 64 62 2d 67 65 74 2d 6b et-keys db-get-k
2ef0: 65 79 73 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 eys)..(define (d
2f00: 62 3a 67 65 74 2d 76 61 6c 75 65 2d 62 79 2d 68 b:get-value-by-h
2f10: 65 61 64 65 72 20 72 6f 77 20 68 65 61 64 65 72 eader row header
2f20: 20 66 69 65 6c 64 29 0a 20 20 3b 3b 20 28 64 65 field). ;; (de
2f30: 62 75 67 3a 70 72 69 6e 74 20 32 20 22 64 62 3a bug:print 2 "db:
2f40: 67 65 74 2d 76 61 6c 75 65 2d 62 79 2d 68 65 61 get-value-by-hea
2f50: 64 65 72 20 72 6f 77 3a 20 22 20 72 6f 77 20 22 der row: " row "
2f60: 20 68 65 61 64 65 72 3a 20 22 20 68 65 61 64 65 header: " heade
2f70: 72 20 22 20 66 69 65 6c 64 3a 20 22 20 66 69 65 r " field: " fie
2f80: 6c 64 29 0a 20 20 28 69 66 20 28 6e 75 6c 6c 3f ld). (if (null?
2f90: 20 68 65 61 64 65 72 29 20 23 66 0a 20 20 20 20 header) #f.
2fa0: 20 20 28 6c 65 74 20 6c 6f 6f 70 20 28 28 68 65 (let loop ((he
2fb0: 64 20 28 63 61 72 20 68 65 61 64 65 72 29 29 0a d (car header)).
2fc0: 09 09 20 28 74 61 6c 20 28 63 64 72 20 68 65 61 .. (tal (cdr hea
2fd0: 64 65 72 29 29 0a 09 09 20 28 6e 20 20 20 30 29 der))... (n 0)
2fe0: 29 0a 09 28 69 66 20 28 65 71 75 61 6c 3f 20 68 )..(if (equal? h
2ff0: 65 64 20 66 69 65 6c 64 29 0a 09 20 20 20 20 28 ed field).. (
3000: 76 65 63 74 6f 72 2d 72 65 66 20 72 6f 77 20 6e vector-ref row n
3010: 29 0a 09 20 20 20 20 28 69 66 20 28 6e 75 6c 6c ).. (if (null
3020: 3f 20 74 61 6c 29 20 23 66 20 28 6c 6f 6f 70 20 ? tal) #f (loop
3030: 28 63 61 72 20 74 61 6c 29 28 63 64 72 20 74 61 (car tal)(cdr ta
3040: 6c 29 28 2b 20 6e 20 31 29 29 29 29 29 29 29 0a l)(+ n 1))))))).
3050: 09 20 20 20 20 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d . .;;========
3060: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3070: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3080: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3090: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b ==============.;
30a0: 3b 20 20 52 20 55 20 4e 20 53 0a 3b 3b 3d 3d 3d ; R U N S.;;===
30b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
30c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
30d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
30e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
30f0: 3d 3d 3d 0a 0a 28 64 65 66 69 6e 65 20 28 72 75 ===..(define (ru
3100: 6e 73 3a 67 65 74 2d 73 74 64 2d 72 75 6e 2d 66 ns:get-std-run-f
3110: 69 65 6c 64 73 20 6b 65 79 73 20 72 65 6d 66 69 ields keys remfi
3120: 65 6c 64 73 29 0a 20 20 28 6c 65 74 2a 20 28 28 elds). (let* ((
3130: 68 65 61 64 65 72 20 20 20 20 28 61 70 70 65 6e header (appen
3140: 64 20 28 6d 61 70 20 6b 65 79 3a 67 65 74 2d 66 d (map key:get-f
3150: 69 65 6c 64 6e 61 6d 65 20 6b 65 79 73 29 0a 09 ieldname keys)..
3160: 09 09 20 20 20 20 72 65 6d 66 69 65 6c 64 73 29 .. remfields)
3170: 29 0a 09 20 28 6b 65 79 73 74 72 20 20 20 20 28 ).. (keystr (
3180: 63 6f 6e 63 20 28 6b 65 79 73 2d 3e 6b 65 79 73 conc (keys->keys
3190: 74 72 20 6b 65 79 73 29 20 22 2c 22 0a 09 09 09 tr keys) ","....
31a0: 20 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 (string-inters
31b0: 70 65 72 73 65 20 72 65 6d 66 69 65 6c 64 73 20 perse remfields
31c0: 22 2c 22 29 29 29 29 0a 20 20 20 20 28 6c 69 73 ",")))). (lis
31d0: 74 20 6b 65 79 73 74 72 20 68 65 61 64 65 72 29 t keystr header)
31e0: 29 29 0a 0a 3b 3b 20 57 41 53 20 64 62 2d 67 65 ))..;; WAS db-ge
31f0: 74 2d 72 75 6e 73 20 46 49 58 4d 45 20 49 4e 20 t-runs FIXME IN
3200: 52 45 4d 41 49 4e 49 4e 47 20 43 4f 44 45 0a 3b REMAINING CODE.;
3210: 3b 0a 3b 3b 20 4d 45 52 47 45 20 54 48 49 53 20 ;.;; MERGE THIS
3220: 57 49 54 48 20 64 62 3a 67 65 74 2d 72 75 6e 73 WITH db:get-runs
3230: 2c 20 61 63 63 69 64 65 6e 74 6c 79 20 77 72 6f , accidently wro
3240: 74 65 20 69 74 20 74 77 69 63 65 0a 3b 3b 0a 3b te it twice.;;.;
3250: 3b 20 72 65 70 6c 61 63 65 20 68 65 61 64 65 72 ; replace header
3260: 20 61 6e 64 20 6b 65 79 73 74 72 20 77 69 74 68 and keystr with
3270: 20 61 20 63 61 6c 6c 20 74 6f 20 72 75 6e 73 3a a call to runs:
3280: 67 65 74 2d 73 74 64 2d 72 75 6e 2d 66 69 65 6c get-std-run-fiel
3290: 64 73 0a 3b 3b 0a 3b 3b 20 6b 65 79 70 61 74 74 ds.;;.;; keypatt
32a0: 73 3a 20 28 20 28 4b 45 59 31 20 22 61 62 63 25 s: ( (KEY1 "abc%
32b0: 64 65 66 22 29 28 4b 45 59 32 20 22 25 22 29 20 def")(KEY2 "%")
32c0: 29 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 28 64 62 ).;;.(define (db
32d0: 3a 67 65 74 2d 72 75 6e 73 20 64 62 20 72 75 6e :get-runs db run
32e0: 70 61 74 74 20 63 6f 75 6e 74 20 6f 66 66 73 65 patt count offse
32f0: 74 20 6b 65 79 70 61 74 74 73 29 0a 20 20 28 6c t keypatts). (l
3300: 65 74 2a 20 28 28 72 65 73 20 20 20 20 20 20 27 et* ((res '
3310: 28 29 29 0a 09 20 28 6b 65 79 73 20 20 20 20 20 ()).. (keys
3320: 20 28 64 62 2d 67 65 74 2d 6b 65 79 73 20 64 62 (db-get-keys db
3330: 29 29 0a 09 20 28 72 65 6d 66 69 65 6c 64 73 20 )).. (remfields
3340: 28 6c 69 73 74 20 22 69 64 22 20 22 72 75 6e 6e (list "id" "runn
3350: 61 6d 65 22 20 22 73 74 61 74 65 22 20 22 73 74 ame" "state" "st
3360: 61 74 75 73 22 20 22 6f 77 6e 65 72 22 20 22 65 atus" "owner" "e
3370: 76 65 6e 74 5f 74 69 6d 65 22 29 29 0a 09 20 28 vent_time")).. (
3380: 68 65 61 64 65 72 20 20 20 20 28 61 70 70 65 6e header (appen
3390: 64 20 28 6d 61 70 20 6b 65 79 3a 67 65 74 2d 66 d (map key:get-f
33a0: 69 65 6c 64 6e 61 6d 65 20 6b 65 79 73 29 0a 09 ieldname keys)..
33b0: 09 09 20 20 20 20 72 65 6d 66 69 65 6c 64 73 29 .. remfields)
33c0: 29 0a 09 20 28 6b 65 79 73 74 72 20 20 20 20 28 ).. (keystr (
33d0: 63 6f 6e 63 20 28 6b 65 79 73 2d 3e 6b 65 79 73 conc (keys->keys
33e0: 74 72 20 6b 65 79 73 29 20 22 2c 22 0a 09 09 09 tr keys) ","....
33f0: 20 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 (string-inters
3400: 70 65 72 73 65 20 72 65 6d 66 69 65 6c 64 73 20 perse remfields
3410: 22 2c 22 29 29 29 0a 09 20 28 71 72 79 73 74 72 ","))).. (qrystr
3420: 20 20 20 20 28 63 6f 6e 63 20 22 53 45 4c 45 43 (conc "SELEC
3430: 54 20 22 20 6b 65 79 73 74 72 20 22 20 46 52 4f T " keystr " FRO
3440: 4d 20 72 75 6e 73 20 57 48 45 52 45 20 72 75 6e M runs WHERE run
3450: 6e 61 6d 65 20 4c 49 4b 45 20 3f 20 22 0a 09 09 name LIKE ? "...
3460: 09 20 20 3b 3b 20 47 65 6e 65 72 61 74 65 3a 20 . ;; Generate:
3470: 22 20 41 4e 44 20 78 20 4c 49 4b 45 20 27 6b 65 " AND x LIKE 'ke
3480: 79 70 61 74 74 27 20 2e 2e 2e 22 0a 09 09 09 20 ypatt' ..."....
3490: 20 28 69 66 20 28 6e 75 6c 6c 3f 20 6b 65 79 70 (if (null? keyp
34a0: 61 74 74 73 29 20 22 22 0a 09 09 09 20 20 20 20 atts) ""....
34b0: 20 20 28 63 6f 6e 63 20 22 20 41 4e 44 20 22 0a (conc " AND ".
34c0: 09 09 09 09 20 20 20 20 28 73 74 72 69 6e 67 2d .... (string-
34d0: 6a 6f 69 6e 20 0a 09 09 09 09 20 20 20 20 20 28 join ..... (
34e0: 6d 61 70 20 28 6c 61 6d 62 64 61 20 28 6b 65 79 map (lambda (key
34f0: 70 61 74 74 29 0a 09 09 09 09 09 20 20 20 20 28 patt)...... (
3500: 6c 65 74 20 28 28 6b 65 79 20 20 28 63 61 72 20 let ((key (car
3510: 6b 65 79 70 61 74 74 29 29 0a 09 09 09 09 09 09 keypatt)).......
3520: 20 20 28 70 61 74 74 20 28 63 61 64 72 20 6b 65 (patt (cadr ke
3530: 79 70 61 74 74 29 29 29 0a 09 09 09 09 09 20 20 ypatt)))......
3540: 20 20 20 20 28 63 6f 6e 63 20 6b 65 79 20 22 20 (conc key "
3550: 4c 49 4b 45 20 27 22 20 70 61 74 74 20 22 27 22 LIKE '" patt "'"
3560: 29 29 29 0a 09 09 09 09 09 20 20 6b 65 79 70 61 )))...... keypa
3570: 74 74 73 29 0a 09 09 09 09 20 20 20 20 20 22 20 tts)..... "
3580: 41 4e 44 20 22 29 29 29 0a 09 09 09 20 20 22 20 AND "))).... "
3590: 4f 52 44 45 52 20 42 59 20 65 76 65 6e 74 5f 74 ORDER BY event_t
35a0: 69 6d 65 20 44 45 53 43 20 22 0a 09 09 09 20 20 ime DESC "....
35b0: 28 69 66 20 28 6e 75 6d 62 65 72 3f 20 63 6f 75 (if (number? cou
35c0: 6e 74 29 0a 09 09 09 20 20 20 20 20 20 28 63 6f nt).... (co
35d0: 6e 63 20 22 20 4c 49 4d 49 54 20 22 20 63 6f 75 nc " LIMIT " cou
35e0: 6e 74 29 0a 09 09 09 20 20 20 20 20 20 22 22 29 nt).... "")
35f0: 0a 09 09 09 20 20 28 69 66 20 28 6e 75 6d 62 65 .... (if (numbe
3600: 72 3f 20 6f 66 66 73 65 74 29 0a 09 09 09 20 20 r? offset)....
3610: 20 20 20 20 28 63 6f 6e 63 20 22 20 4f 46 46 53 (conc " OFFS
3620: 45 54 20 22 20 6f 66 66 73 65 74 29 0a 09 09 09 ET " offset)....
3630: 20 20 20 20 20 20 22 22 29 29 29 29 0a 20 20 20 "")))).
3640: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20 (debug:print 4
3650: 22 64 62 3a 67 65 74 2d 72 75 6e 73 20 71 72 79 "db:get-runs qry
3660: 73 74 72 3a 20 22 20 71 72 79 73 74 72 20 22 5c str: " qrystr "\
3670: 6e 6b 65 79 70 61 74 74 73 3a 20 22 20 6b 65 79 nkeypatts: " key
3680: 70 61 74 74 73 20 22 5c 6e 20 20 6f 66 66 73 65 patts "\n offse
3690: 74 3a 20 22 20 6f 66 66 73 65 74 20 22 20 6c 69 t: " offset " li
36a0: 6d 69 74 3a 20 22 20 63 6f 75 6e 74 29 0a 20 20 mit: " count).
36b0: 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 (sqlite3:for-e
36c0: 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 ach-row. (la
36d0: 6d 62 64 61 20 28 61 20 2e 20 78 29 0a 20 20 20 mbda (a . x).
36e0: 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28 63 (set! res (c
36f0: 6f 6e 73 20 28 61 70 70 6c 79 20 76 65 63 74 6f ons (apply vecto
3700: 72 20 61 20 78 29 20 72 65 73 29 29 29 0a 20 20 r a x) res))).
3710: 20 20 20 64 62 0a 20 20 20 20 20 71 72 79 73 74 db. qryst
3720: 72 0a 20 20 20 20 20 72 75 6e 70 61 74 74 29 0a r. runpatt).
3730: 20 20 20 20 28 76 65 63 74 6f 72 20 68 65 61 64 (vector head
3740: 65 72 20 72 65 73 29 29 29 0a 0a 3b 3b 20 6a 75 er res)))..;; ju
3750: 73 74 20 67 65 74 20 63 6f 75 6e 74 20 6f 66 20 st get count of
3760: 72 75 6e 73 0a 28 64 65 66 69 6e 65 20 28 64 62 runs.(define (db
3770: 3a 67 65 74 2d 6e 75 6d 2d 72 75 6e 73 20 64 62 :get-num-runs db
3780: 20 72 75 6e 70 61 74 74 29 0a 20 20 28 6c 65 74 runpatt). (let
3790: 20 28 28 6e 75 6d 72 75 6e 73 20 30 29 29 0a 20 ((numruns 0)).
37a0: 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d (sqlite3:for-
37b0: 65 61 63 68 2d 72 6f 77 20 0a 20 20 20 20 20 28 each-row . (
37c0: 6c 61 6d 62 64 61 20 28 63 6f 75 6e 74 29 0a 20 lambda (count).
37d0: 20 20 20 20 20 20 28 73 65 74 21 20 6e 75 6d 72 (set! numr
37e0: 75 6e 73 20 63 6f 75 6e 74 29 29 0a 20 20 20 20 uns count)).
37f0: 20 64 62 0a 20 20 20 20 20 22 53 45 4c 45 43 54 db. "SELECT
3800: 20 43 4f 55 4e 54 28 69 64 29 20 46 52 4f 4d 20 COUNT(id) FROM
3810: 72 75 6e 73 20 57 48 45 52 45 20 72 75 6e 6e 61 runs WHERE runna
3820: 6d 65 20 4c 49 4b 45 20 3f 3b 22 20 72 75 6e 70 me LIKE ?;" runp
3830: 61 74 74 29 0a 20 20 20 20 6e 75 6d 72 75 6e 73 att). numruns
3840: 29 29 0a 0a 0a 3b 3b 20 75 73 65 20 28 67 65 74 ))...;; use (get
3850: 2d 76 61 6c 75 65 2d 62 79 2d 68 65 61 64 65 72 -value-by-header
3860: 20 28 64 62 3a 67 65 74 2d 68 65 61 64 65 72 20 (db:get-header
3870: 72 75 6e 69 6e 66 6f 29 28 64 62 3a 67 65 74 2d runinfo)(db:get-
3880: 72 6f 77 20 72 75 6e 69 6e 66 6f 29 29 0a 28 64 row runinfo)).(d
3890: 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 72 75 efine (db:get-ru
38a0: 6e 2d 69 6e 66 6f 20 64 62 20 72 75 6e 2d 69 64 n-info db run-id
38b0: 29 0a 20 20 28 6c 65 74 2a 20 28 28 72 65 73 20 ). (let* ((res
38c0: 20 20 20 20 20 23 66 29 0a 09 20 28 6b 65 79 73 #f).. (keys
38d0: 20 20 20 20 20 20 28 64 62 2d 67 65 74 2d 6b 65 (db-get-ke
38e0: 79 73 20 64 62 29 29 0a 09 20 28 72 65 6d 66 69 ys db)).. (remfi
38f0: 65 6c 64 73 20 28 6c 69 73 74 20 22 69 64 22 20 elds (list "id"
3900: 22 72 75 6e 6e 61 6d 65 22 20 22 73 74 61 74 65 "runname" "state
3910: 22 20 22 73 74 61 74 75 73 22 20 22 6f 77 6e 65 " "status" "owne
3920: 72 22 20 22 65 76 65 6e 74 5f 74 69 6d 65 22 29 r" "event_time")
3930: 29 0a 09 20 28 68 65 61 64 65 72 20 20 20 20 28 ).. (header (
3940: 61 70 70 65 6e 64 20 28 6d 61 70 20 6b 65 79 3a append (map key:
3950: 67 65 74 2d 66 69 65 6c 64 6e 61 6d 65 20 6b 65 get-fieldname ke
3960: 79 73 29 0a 09 09 09 20 20 20 20 72 65 6d 66 69 ys).... remfi
3970: 65 6c 64 73 29 29 0a 09 20 28 6b 65 79 73 74 72 elds)).. (keystr
3980: 20 20 20 20 28 63 6f 6e 63 20 28 6b 65 79 73 2d (conc (keys-
3990: 3e 6b 65 79 73 74 72 20 6b 65 79 73 29 20 22 2c >keystr keys) ",
39a0: 22 0a 09 09 09 20 20 28 73 74 72 69 6e 67 2d 69 ".... (string-i
39b0: 6e 74 65 72 73 70 65 72 73 65 20 72 65 6d 66 69 ntersperse remfi
39c0: 65 6c 64 73 20 22 2c 22 29 29 29 29 0a 20 20 20 elds ",")))).
39d0: 20 3b 3b 20 28 64 65 62 75 67 3a 70 72 69 6e 74 ;; (debug:print
39e0: 20 30 20 22 64 62 3a 67 65 74 2d 72 75 6e 2d 69 0 "db:get-run-i
39f0: 6e 66 6f 20 72 75 6e 2d 69 64 3a 20 22 20 72 75 nfo run-id: " ru
3a00: 6e 2d 69 64 20 22 20 68 65 61 64 65 72 3a 20 22 n-id " header: "
3a10: 20 68 65 61 64 65 72 20 22 20 6b 65 79 73 74 72 header " keystr
3a20: 3a 20 22 20 6b 65 79 73 74 72 29 0a 20 20 20 20 : " keystr).
3a30: 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 (sqlite3:for-eac
3a40: 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 h-row. (lamb
3a50: 64 61 20 28 61 20 2e 20 78 29 0a 20 20 20 20 20 da (a . x).
3a60: 20 20 28 73 65 74 21 20 72 65 73 20 28 61 70 70 (set! res (app
3a70: 6c 79 20 76 65 63 74 6f 72 20 61 20 78 29 29 29 ly vector a x)))
3a80: 0a 20 20 20 20 20 64 62 0a 20 20 20 20 20 28 63 . db. (c
3a90: 6f 6e 63 20 22 53 45 4c 45 43 54 20 22 20 6b 65 onc "SELECT " ke
3aa0: 79 73 74 72 20 22 20 46 52 4f 4d 20 72 75 6e 73 ystr " FROM runs
3ab0: 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 29 0a 20 WHERE id=?;").
3ac0: 20 20 20 20 72 75 6e 2d 69 64 29 0a 20 20 20 20 run-id).
3ad0: 28 76 65 63 74 6f 72 20 68 65 61 64 65 72 20 72 (vector header r
3ae0: 65 73 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 es)))..(define (
3af0: 64 62 3a 73 65 74 2d 63 6f 6d 6d 65 6e 74 2d 66 db:set-comment-f
3b00: 6f 72 2d 72 75 6e 20 64 62 20 72 75 6e 2d 69 64 or-run db run-id
3b10: 20 63 6f 6d 6d 65 6e 74 29 0a 20 20 28 73 71 6c comment). (sql
3b20: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 ite3:execute db
3b30: 22 55 50 44 41 54 45 20 72 75 6e 73 20 53 45 54 "UPDATE runs SET
3b40: 20 63 6f 6d 6d 65 6e 74 3d 3f 20 57 48 45 52 45 comment=? WHERE
3b50: 20 69 64 3d 3f 3b 22 20 63 6f 6d 6d 65 6e 74 20 id=?;" comment
3b60: 72 75 6e 2d 69 64 29 29 0a 0a 3b 3b 20 64 6f 65 run-id))..;; doe
3b70: 73 20 6e 6f 74 20 28 6f 62 76 69 6f 75 73 6c 79 s not (obviously
3b80: 21 29 20 72 65 6d 6f 76 65 64 20 64 65 70 65 6e !) removed depen
3b90: 64 65 6e 74 20 64 61 74 61 2e 20 0a 28 64 65 66 dent data. .(def
3ba0: 69 6e 65 20 28 64 62 3a 64 65 6c 65 74 65 2d 72 ine (db:delete-r
3bb0: 75 6e 20 64 62 20 72 75 6e 2d 69 64 29 0a 20 20 un db run-id).
3bc0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 (sqlite3:execute
3bd0: 20 64 62 20 22 44 45 4c 45 54 45 20 46 52 4f 4d db "DELETE FROM
3be0: 20 72 75 6e 73 20 57 48 45 52 45 20 69 64 3d 3f runs WHERE id=?
3bf0: 3b 22 20 72 75 6e 2d 69 64 29 29 0a 0a 28 64 65 ;" run-id))..(de
3c00: 66 69 6e 65 20 28 64 62 3a 75 70 64 61 74 65 2d fine (db:update-
3c10: 72 75 6e 2d 65 76 65 6e 74 5f 74 69 6d 65 20 64 run-event_time d
3c20: 62 20 72 75 6e 2d 69 64 29 0a 20 20 28 73 71 6c b run-id). (sql
3c30: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 ite3:execute db
3c40: 22 55 50 44 41 54 45 20 72 75 6e 73 20 53 45 54 "UPDATE runs SET
3c50: 20 65 76 65 6e 74 5f 74 69 6d 65 3d 73 74 72 66 event_time=strf
3c60: 74 69 6d 65 28 27 25 73 27 2c 27 6e 6f 77 27 29 time('%s','now')
3c70: 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 72 75 WHERE id=?;" ru
3c80: 6e 2d 69 64 29 29 20 0a 0a 3b 3b 3d 3d 3d 3d 3d n-id)) ..;;=====
3c90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3ca0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3cb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3cc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3cd0: 3d 0a 3b 3b 20 20 54 20 45 20 53 20 54 20 53 0a =.;; T E S T S.
3ce0: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ;;==============
3cf0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3d00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3d10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3d20: 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 73 74 61 ========..;; sta
3d30: 74 65 73 20 61 6e 64 20 73 74 61 74 75 73 65 73 tes and statuses
3d40: 20 61 72 65 20 6c 69 73 74 73 2c 20 74 75 72 6e are lists, turn
3d50: 20 74 68 65 6d 20 69 6e 74 6f 20 28 22 50 41 53 them into ("PAS
3d60: 53 22 2c 22 46 41 49 4c 22 2e 2e 2e 29 20 61 6e S","FAIL"...) an
3d70: 64 20 75 73 65 20 4e 4f 54 20 49 4e 0a 3b 3b 20 d use NOT IN.;;
3d80: 69 2e 65 2e 20 74 68 65 73 65 20 6c 69 73 74 73 i.e. these lists
3d90: 20 64 65 66 69 6e 65 20 77 68 61 74 20 74 6f 20 define what to
3da0: 4e 4f 54 20 73 68 6f 77 2e 0a 3b 3b 20 73 74 61 NOT show..;; sta
3db0: 74 65 73 20 61 6e 64 20 73 74 61 74 75 73 65 73 tes and statuses
3dc0: 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f are required to
3dd0: 20 62 65 20 6c 69 73 74 73 2c 20 65 6d 70 74 79 be lists, empty
3de0: 20 69 73 20 6f 6b 0a 28 64 65 66 69 6e 65 20 28 is ok.(define (
3df0: 64 62 2d 67 65 74 2d 74 65 73 74 73 2d 66 6f 72 db-get-tests-for
3e00: 2d 72 75 6e 20 64 62 20 72 75 6e 2d 69 64 20 74 -run db run-id t
3e10: 65 73 74 70 61 74 74 20 69 74 65 6d 70 61 74 74 estpatt itempatt
3e20: 20 73 74 61 74 65 73 20 73 74 61 74 75 73 65 73 states statuses
3e30: 29 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20 27 ). (let ((res '
3e40: 28 29 29 0a 09 28 73 74 61 74 65 73 2d 73 74 72 ())..(states-str
3e50: 20 20 20 20 28 63 6f 6e 63 20 22 28 27 22 20 28 (conc "('" (
3e60: 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 string-intersper
3e70: 73 65 20 73 74 61 74 65 73 20 20 20 22 27 2c 27 se states "','
3e80: 22 29 20 22 27 29 22 29 29 0a 09 28 73 74 61 74 ") "')"))..(stat
3e90: 75 73 65 73 2d 73 74 72 20 20 28 63 6f 6e 63 20 uses-str (conc
3ea0: 22 28 27 22 20 28 73 74 72 69 6e 67 2d 69 6e 74 "('" (string-int
3eb0: 65 72 73 70 65 72 73 65 20 73 74 61 74 75 73 65 ersperse statuse
3ec0: 73 20 22 27 2c 27 22 29 20 22 27 29 22 29 29 0a s "','") "')")).
3ed0: 09 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a .). (sqlite3:
3ee0: 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20 for-each-row .
3ef0: 20 20 20 28 6c 61 6d 62 64 61 20 28 69 64 20 72 (lambda (id r
3f00: 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 73 un-id testname s
3f10: 74 61 74 65 20 73 74 61 74 75 73 20 65 76 65 6e tate status even
3f20: 74 2d 74 69 6d 65 20 68 6f 73 74 20 63 70 75 6c t-time host cpul
3f30: 6f 61 64 20 64 69 73 6b 66 72 65 65 20 75 6e 61 oad diskfree una
3f40: 6d 65 20 72 75 6e 64 69 72 20 69 74 65 6d 2d 70 me rundir item-p
3f50: 61 74 68 20 72 75 6e 2d 64 75 72 61 74 69 6f 6e ath run-duration
3f60: 20 66 69 6e 61 6c 2d 6c 6f 67 66 20 63 6f 6d 6d final-logf comm
3f70: 65 6e 74 29 0a 20 20 20 20 20 20 20 28 73 65 74 ent). (set
3f80: 21 20 72 65 73 20 28 63 6f 6e 73 20 28 76 65 63 ! res (cons (vec
3f90: 74 6f 72 20 69 64 20 72 75 6e 2d 69 64 20 74 65 tor id run-id te
3fa0: 73 74 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61 stname state sta
3fb0: 74 75 73 20 65 76 65 6e 74 2d 74 69 6d 65 20 68 tus event-time h
3fc0: 6f 73 74 20 63 70 75 6c 6f 61 64 20 64 69 73 6b ost cpuload disk
3fd0: 66 72 65 65 20 75 6e 61 6d 65 20 72 75 6e 64 69 free uname rundi
3fe0: 72 20 69 74 65 6d 2d 70 61 74 68 20 72 75 6e 2d r item-path run-
3ff0: 64 75 72 61 74 69 6f 6e 20 66 69 6e 61 6c 2d 6c duration final-l
4000: 6f 67 66 20 63 6f 6d 6d 65 6e 74 29 20 72 65 73 ogf comment) res
4010: 29 29 29 0a 20 20 20 20 20 64 62 20 0a 20 20 20 ))). db .
4020: 20 20 28 63 6f 6e 63 20 22 53 45 4c 45 43 54 20 (conc "SELECT
4030: 69 64 2c 72 75 6e 5f 69 64 2c 74 65 73 74 6e 61 id,run_id,testna
4040: 6d 65 2c 73 74 61 74 65 2c 73 74 61 74 75 73 2c me,state,status,
4050: 65 76 65 6e 74 5f 74 69 6d 65 2c 68 6f 73 74 2c event_time,host,
4060: 63 70 75 6c 6f 61 64 2c 64 69 73 6b 66 72 65 65 cpuload,diskfree
4070: 2c 75 6e 61 6d 65 2c 72 75 6e 64 69 72 2c 69 74 ,uname,rundir,it
4080: 65 6d 5f 70 61 74 68 2c 72 75 6e 5f 64 75 72 61 em_path,run_dura
4090: 74 69 6f 6e 2c 66 69 6e 61 6c 5f 6c 6f 67 66 2c tion,final_logf,
40a0: 63 6f 6d 6d 65 6e 74 20 22 0a 09 20 20 20 22 20 comment ".. "
40b0: 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 FROM tests WHERE
40c0: 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 run_id=? AND te
40d0: 73 74 6e 61 6d 65 20 6c 69 6b 65 20 3f 20 41 4e stname like ? AN
40e0: 44 20 69 74 65 6d 5f 70 61 74 68 20 4c 49 4b 45 D item_path LIKE
40f0: 20 3f 20 22 20 0a 09 20 20 20 22 20 41 4e 44 20 ? " .. " AND
4100: 4e 4f 54 20 28 73 74 61 74 65 20 69 6e 20 22 20 NOT (state in "
4110: 73 74 61 74 65 73 2d 73 74 72 20 22 20 41 4e 44 states-str " AND
4120: 20 73 74 61 74 75 73 20 49 4e 20 22 20 73 74 61 status IN " sta
4130: 74 75 73 65 73 2d 73 74 72 20 22 29 20 22 0a 09 tuses-str ") "..
4140: 20 20 20 3b 3b 20 22 20 4f 52 44 45 52 20 42 59 ;; " ORDER BY
4150: 20 69 64 20 44 45 53 43 3b 22 0a 09 20 20 20 22 id DESC;".. "
4160: 20 4f 52 44 45 52 20 42 59 20 65 76 65 6e 74 5f ORDER BY event_
4170: 74 69 6d 65 20 41 53 43 3b 22 20 3b 3b 20 50 4f time ASC;" ;; PO
4180: 54 45 4e 54 49 41 4c 20 49 53 53 55 45 21 20 43 TENTIAL ISSUE! C
4190: 48 45 43 4b 20 4d 45 21 20 44 6f 65 73 20 61 6e HECK ME! Does an
41a0: 79 74 69 6e 67 20 64 65 70 65 6e 64 20 6f 6e 20 yting depend on
41b0: 74 68 69 73 20 62 65 69 6e 67 20 73 6f 72 74 65 this being sorte
41c0: 64 20 62 79 20 69 64 3f 0a 09 20 20 20 29 0a 20 d by id?.. ).
41d0: 20 20 20 20 72 75 6e 2d 69 64 0a 20 20 20 20 20 run-id.
41e0: 28 69 66 20 74 65 73 74 70 61 74 74 20 74 65 73 (if testpatt tes
41f0: 74 70 61 74 74 20 22 25 22 29 0a 20 20 20 20 20 tpatt "%").
4200: 28 69 66 20 69 74 65 6d 70 61 74 74 20 69 74 65 (if itempatt ite
4210: 6d 70 61 74 74 20 22 25 22 29 29 0a 20 20 20 20 mpatt "%")).
4220: 72 65 73 29 29 0a 0a 3b 3b 20 74 68 69 73 20 6f res))..;; this o
4230: 6e 65 20 69 73 20 61 20 62 69 74 20 62 72 6f 6b ne is a bit brok
4240: 65 6e 20 42 55 47 20 46 49 58 4d 45 0a 28 64 65 en BUG FIXME.(de
4250: 66 69 6e 65 20 28 64 62 3a 64 65 6c 65 74 65 2d fine (db:delete-
4260: 74 65 73 74 2d 73 74 65 70 2d 72 65 63 6f 72 64 test-step-record
4270: 73 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 s db run-id test
4280: 2d 6e 61 6d 65 20 69 74 65 6d 64 61 74 29 0a 20 -name itemdat).
4290: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 (sqlite3:execut
42a0: 65 20 64 62 20 22 44 45 4c 45 54 45 20 46 52 4f e db "DELETE FRO
42b0: 4d 20 74 65 73 74 5f 73 74 65 70 73 20 57 48 45 M test_steps WHE
42c0: 52 45 20 74 65 73 74 5f 69 64 20 69 6e 20 28 53 RE test_id in (S
42d0: 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 74 65 ELECT id FROM te
42e0: 73 74 73 20 57 48 45 52 45 20 72 75 6e 5f 69 64 sts WHERE run_id
42f0: 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d =? AND testname=
4300: 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 3d ? AND item_path=
4310: 3f 29 3b 22 20 0a 09 09 20 20 20 72 75 6e 2d 69 ?);" ... run-i
4320: 64 20 74 65 73 74 2d 6e 61 6d 65 20 28 69 74 65 d test-name (ite
4330: 6d 2d 6c 69 73 74 2d 3e 70 61 74 68 20 69 74 65 m-list->path ite
4340: 6d 64 61 74 29 29 29 0a 3b 3b 20 0a 28 64 65 66 mdat))).;; .(def
4350: 69 6e 65 20 28 64 62 3a 64 65 6c 65 74 65 2d 74 ine (db:delete-t
4360: 65 73 74 2d 72 65 63 6f 72 64 73 20 64 62 20 74 est-records db t
4370: 65 73 74 2d 69 64 29 0a 20 20 28 73 71 6c 69 74 est-id). (sqlit
4380: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 44 e3:execute db "D
4390: 45 4c 45 54 45 20 46 52 4f 4d 20 74 65 73 74 5f ELETE FROM test_
43a0: 73 74 65 70 73 20 57 48 45 52 45 20 74 65 73 74 steps WHERE test
43b0: 5f 69 64 3d 3f 3b 22 20 74 65 73 74 2d 69 64 29 _id=?;" test-id)
43c0: 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 . (sqlite3:exec
43d0: 75 74 65 20 64 62 20 22 44 45 4c 45 54 45 20 46 ute db "DELETE F
43e0: 52 4f 4d 20 74 65 73 74 5f 64 61 74 61 20 20 57 ROM test_data W
43f0: 48 45 52 45 20 74 65 73 74 5f 69 64 3d 3f 3b 22 HERE test_id=?;"
4400: 20 74 65 73 74 2d 69 64 29 0a 20 20 28 73 71 6c test-id). (sql
4410: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 ite3:execute db
4420: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 65 73 "DELETE FROM tes
4430: 74 73 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 ts WHERE id=?;"
4440: 74 65 73 74 2d 69 64 29 29 0a 0a 3b 3b 20 73 65 test-id))..;; se
4450: 74 20 74 65 73 74 73 20 77 69 74 68 20 73 74 61 t tests with sta
4460: 74 65 20 63 75 72 72 73 74 61 74 65 20 61 6e 64 te currstate and
4470: 20 73 74 61 74 75 73 20 63 75 72 72 73 74 61 74 status currstat
4480: 75 73 20 74 6f 20 6e 65 77 73 74 61 74 65 20 61 us to newstate a
4490: 6e 64 20 6e 65 77 73 74 61 74 75 73 0a 3b 3b 20 nd newstatus.;;
44a0: 75 73 65 20 63 75 72 72 73 74 61 74 65 20 3d 20 use currstate =
44b0: 23 66 20 61 6e 64 20 6f 72 20 63 75 72 72 73 74 #f and or currst
44c0: 61 74 75 73 20 3d 20 23 66 20 74 6f 20 61 70 70 atus = #f to app
44d0: 6c 79 20 74 6f 20 61 6e 79 20 73 74 61 74 65 20 ly to any state
44e0: 6f 72 20 73 74 61 74 75 73 20 72 65 73 70 65 63 or status respec
44f0: 74 69 76 65 6c 79 0a 3b 3b 20 57 41 52 4e 49 4e tively.;; WARNIN
4500: 47 3a 20 53 51 4c 20 69 6e 6a 65 63 74 69 6f 6e G: SQL injection
4510: 20 72 69 73 6b 0a 28 64 65 66 69 6e 65 20 28 64 risk.(define (d
4520: 62 3a 73 65 74 2d 74 65 73 74 73 2d 73 74 61 74 b:set-tests-stat
4530: 65 2d 73 74 61 74 75 73 20 64 62 20 72 75 6e 2d e-status db run-
4540: 69 64 20 74 65 73 74 6e 61 6d 65 73 20 63 75 72 id testnames cur
4550: 72 73 74 61 74 65 20 63 75 72 72 73 74 61 74 75 rstate currstatu
4560: 73 20 6e 65 77 73 74 61 74 65 20 6e 65 77 73 74 s newstate newst
4570: 61 74 75 73 29 0a 20 20 28 66 6f 72 2d 65 61 63 atus). (for-eac
4580: 68 20 28 6c 61 6d 62 64 61 20 28 74 65 73 74 6e h (lambda (testn
4590: 61 6d 65 29 0a 09 20 20 20 20 20 20 28 6c 65 74 ame).. (let
45a0: 20 28 28 71 72 79 20 28 63 6f 6e 63 20 22 55 50 ((qry (conc "UP
45b0: 44 41 54 45 20 74 65 73 74 73 20 53 45 54 20 73 DATE tests SET s
45c0: 74 61 74 65 3d 3f 2c 73 74 61 74 75 73 3d 3f 20 tate=?,status=?
45d0: 57 48 45 52 45 20 22 0a 09 09 09 09 09 28 69 66 WHERE "......(if
45e0: 20 63 75 72 72 73 74 61 74 65 20 20 28 63 6f 6e currstate (con
45f0: 63 20 22 73 74 61 74 65 3d 27 22 20 63 75 72 72 c "state='" curr
4600: 73 74 61 74 65 20 22 27 20 41 4e 44 20 22 29 20 state "' AND ")
4610: 22 22 29 0a 09 09 09 09 09 28 69 66 20 63 75 72 "")......(if cur
4620: 72 73 74 61 74 75 73 20 28 63 6f 6e 63 20 22 73 rstatus (conc "s
4630: 74 61 74 75 73 3d 27 22 20 63 75 72 72 73 74 61 tatus='" currsta
4640: 74 75 73 20 22 27 20 41 4e 44 20 22 29 20 22 22 tus "' AND ") ""
4650: 29 0a 09 09 09 09 09 22 20 72 75 6e 5f 69 64 3d )......" run_id=
4660: 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f ? AND testname=?
4670: 20 41 4e 44 20 4e 4f 54 20 28 69 74 65 6d 5f 70 AND NOT (item_p
4680: 61 74 68 3d 27 27 20 41 4e 44 20 74 65 73 74 6e ath='' AND testn
4690: 61 6d 65 20 69 6e 20 28 53 45 4c 45 43 54 20 44 ame in (SELECT D
46a0: 49 53 54 49 4e 43 54 20 74 65 73 74 6e 61 6d 65 ISTINCT testname
46b0: 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 FROM tests WHER
46c0: 45 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 E testname=? AND
46d0: 20 69 74 65 6d 5f 70 61 74 68 20 21 3d 20 27 27 item_path != ''
46e0: 29 29 3b 22 29 29 29 0a 09 09 3b 3b 28 64 65 62 ));")))...;;(deb
46f0: 75 67 3a 70 72 69 6e 74 20 30 20 22 51 52 59 3a ug:print 0 "QRY:
4700: 20 22 20 71 72 79 29 0a 09 09 28 73 71 6c 69 74 " qry)...(sqlit
4710: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 71 72 e3:execute db qr
4720: 79 20 72 75 6e 2d 69 64 20 6e 65 77 73 74 61 74 y run-id newstat
4730: 65 20 6e 65 77 73 74 61 74 75 73 20 74 65 73 74 e newstatus test
4740: 6e 61 6d 65 20 74 65 73 74 6e 61 6d 65 29 29 29 name testname)))
4750: 0a 09 20 20 20 20 74 65 73 74 6e 61 6d 65 73 29 .. testnames)
4760: 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 64 )..(define (db:d
4770: 65 6c 65 74 65 2d 74 65 73 74 73 2d 69 6e 2d 73 elete-tests-in-s
4780: 74 61 74 65 20 64 62 20 72 75 6e 2d 69 64 20 73 tate db run-id s
4790: 74 61 74 65 29 0a 20 20 28 73 71 6c 69 74 65 33 tate). (sqlite3
47a0: 3a 65 78 65 63 75 74 65 20 64 62 20 22 44 45 4c :execute db "DEL
47b0: 45 54 45 20 46 52 4f 4d 20 74 65 73 74 73 20 57 ETE FROM tests W
47c0: 48 45 52 45 20 73 74 61 74 65 3d 3f 20 41 4e 44 HERE state=? AND
47d0: 20 72 75 6e 5f 69 64 3d 3f 3b 22 20 73 74 61 74 run_id=?;" stat
47e0: 65 20 72 75 6e 2d 69 64 29 29 0a 0a 28 64 65 66 e run-id))..(def
47f0: 69 6e 65 20 28 64 62 3a 74 65 73 74 2d 73 65 74 ine (db:test-set
4800: 2d 73 74 61 74 65 2d 73 74 61 74 75 73 2d 62 79 -state-status-by
4810: 2d 69 64 20 64 62 20 74 65 73 74 2d 69 64 20 6e -id db test-id n
4820: 65 77 73 74 61 74 65 20 6e 65 77 73 74 61 74 75 ewstate newstatu
4830: 73 20 6e 65 77 63 6f 6d 6d 65 6e 74 29 0a 20 20 s newcomment).
4840: 28 69 66 20 6e 65 77 73 74 61 74 65 20 20 20 28 (if newstate (
4850: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 sqlite3:execute
4860: 64 62 20 22 55 50 44 41 54 45 20 74 65 73 74 73 db "UPDATE tests
4870: 20 53 45 54 20 73 74 61 74 65 3d 3f 20 20 20 57 SET state=? W
4880: 48 45 52 45 20 69 64 3d 3f 3b 22 20 6e 65 77 73 HERE id=?;" news
4890: 74 61 74 65 20 20 20 74 65 73 74 2d 69 64 29 29 tate test-id))
48a0: 0a 20 20 28 69 66 20 6e 65 77 73 74 61 74 75 73 . (if newstatus
48b0: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 (sqlite3:execu
48c0: 74 65 20 64 62 20 22 55 50 44 41 54 45 20 74 65 te db "UPDATE te
48d0: 73 74 73 20 53 45 54 20 73 74 61 74 75 73 3d 3f sts SET status=?
48e0: 20 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 6e WHERE id=?;" n
48f0: 65 77 73 74 61 74 75 73 20 20 74 65 73 74 2d 69 ewstatus test-i
4900: 64 29 29 0a 20 20 28 69 66 20 6e 65 77 63 6f 6d d)). (if newcom
4910: 6d 65 6e 74 20 28 73 71 6c 69 74 65 33 3a 65 78 ment (sqlite3:ex
4920: 65 63 75 74 65 20 64 62 20 22 55 50 44 41 54 45 ecute db "UPDATE
4930: 20 74 65 73 74 73 20 53 45 54 20 63 6f 6d 6d 65 tests SET comme
4940: 6e 74 3d 3f 20 57 48 45 52 45 20 69 64 3d 3f 3b nt=? WHERE id=?;
4950: 22 20 6e 65 77 63 6f 6d 6d 65 6e 74 20 74 65 73 " newcomment tes
4960: 74 2d 69 64 29 29 29 0a 0a 28 64 65 66 69 6e 65 t-id)))..(define
4970: 20 28 64 62 3a 67 65 74 2d 63 6f 75 6e 74 2d 74 (db:get-count-t
4980: 65 73 74 73 2d 72 75 6e 6e 69 6e 67 20 64 62 29 ests-running db)
4990: 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20 30 29 . (let ((res 0)
49a0: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 ). (sqlite3:f
49b0: 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 or-each-row.
49c0: 20 28 6c 61 6d 62 64 61 20 28 63 6f 75 6e 74 29 (lambda (count)
49d0: 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72 65 . (set! re
49e0: 73 20 63 6f 75 6e 74 29 29 0a 20 20 20 20 20 64 s count)). d
49f0: 62 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20 63 b. "SELECT c
4a00: 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 74 65 ount(id) FROM te
4a10: 73 74 73 20 57 48 45 52 45 20 73 74 61 74 65 20 sts WHERE state
4a20: 3d 20 27 52 55 4e 4e 49 4e 47 27 20 4f 52 20 73 = 'RUNNING' OR s
4a30: 74 61 74 65 20 3d 20 27 4c 41 55 4e 43 48 45 44 tate = 'LAUNCHED
4a40: 27 20 4f 52 20 73 74 61 74 65 20 3d 20 27 52 45 ' OR state = 'RE
4a50: 4d 4f 54 45 48 4f 53 54 53 54 41 52 54 27 3b 22 MOTEHOSTSTART';"
4a60: 29 0a 20 20 20 20 72 65 73 29 29 0a 0a 3b 3b 20 ). res))..;;
4a70: 64 6f 6e 65 20 77 69 74 68 20 72 75 6e 20 77 68 done with run wh
4a80: 65 6e 3a 0a 3b 3b 20 20 20 30 20 74 65 73 74 73 en:.;; 0 tests
4a90: 20 69 6e 20 4c 41 55 4e 43 48 45 44 2c 20 4e 4f in LAUNCHED, NO
4aa0: 54 5f 53 54 41 52 54 45 44 2c 20 52 45 4d 4f 54 T_STARTED, REMOT
4ab0: 45 48 4f 53 54 53 54 41 52 54 2c 20 52 55 4e 4e EHOSTSTART, RUNN
4ac0: 49 4e 47 0a 28 64 65 66 69 6e 65 20 28 64 62 3a ING.(define (db:
4ad0: 65 73 74 69 6d 61 74 65 64 2d 74 65 73 74 73 2d estimated-tests-
4ae0: 72 65 6d 61 69 6e 69 6e 67 20 64 62 20 72 75 6e remaining db run
4af0: 2d 69 64 29 0a 20 20 28 6c 65 74 20 28 28 72 65 -id). (let ((re
4b00: 73 20 30 29 29 0a 20 20 20 20 28 73 71 6c 69 74 s 0)). (sqlit
4b10: 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a e3:for-each-row.
4b20: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 63 6f (lambda (co
4b30: 75 6e 74 29 0a 20 20 20 20 20 20 20 28 73 65 74 unt). (set
4b40: 21 20 72 65 73 20 63 6f 75 6e 74 29 29 0a 20 20 ! res count)).
4b50: 20 20 20 64 62 20 3b 3b 20 4e 42 2f 2f 20 4b 49 db ;; NB// KI
4b60: 4c 4c 52 45 51 20 6d 65 61 6e 73 20 74 68 65 20 LLREQ means the
4b70: 6a 6f 62 73 20 69 73 20 73 74 69 6c 6c 20 70 72 jobs is still pr
4b80: 6f 62 61 62 6c 79 20 72 75 6e 6e 69 6e 67 0a 20 obably running.
4b90: 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e "SELECT coun
4ba0: 74 28 69 64 29 20 46 52 4f 4d 20 74 65 73 74 73 t(id) FROM tests
4bb0: 20 57 48 45 52 45 20 73 74 61 74 65 20 69 6e 20 WHERE state in
4bc0: 28 27 4c 41 55 4e 43 48 45 44 27 2c 27 4e 4f 54 ('LAUNCHED','NOT
4bd0: 5f 53 54 41 52 54 45 44 27 2c 27 52 45 4d 4f 54 _STARTED','REMOT
4be0: 45 48 4f 53 54 53 54 41 52 54 27 2c 27 52 55 4e EHOSTSTART','RUN
4bf0: 4e 49 4e 47 27 2c 27 4b 49 4c 4c 52 45 51 27 29 NING','KILLREQ')
4c00: 20 41 4e 44 20 72 75 6e 5f 69 64 3d 3f 3b 22 20 AND run_id=?;"
4c10: 72 75 6e 2d 69 64 29 0a 20 20 20 20 72 65 73 29 run-id). res)
4c20: 29 0a 0a 3b 3b 20 4e 42 2f 2f 20 53 79 6e 63 20 )..;; NB// Sync
4c30: 74 68 69 73 20 77 69 74 68 20 72 75 6e 73 3a 67 this with runs:g
4c40: 65 74 2d 74 65 73 74 2d 69 6e 66 6f 0a 28 64 65 et-test-info.(de
4c50: 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 74 65 73 fine (db:get-tes
4c60: 74 2d 69 6e 66 6f 20 64 62 20 72 75 6e 2d 69 64 t-info db run-id
4c70: 20 74 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 testname item-p
4c80: 61 74 68 29 0a 20 20 28 6c 65 74 20 28 28 72 65 ath). (let ((re
4c90: 73 20 23 66 29 29 0a 20 20 20 20 28 73 71 6c 69 s #f)). (sqli
4ca0: 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 te3:for-each-row
4cb0: 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 69 . (lambda (i
4cc0: 64 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d d run-id testnam
4cd0: 65 20 73 74 61 74 65 20 73 74 61 74 75 73 20 65 e state status e
4ce0: 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73 74 20 63 vent-time host c
4cf0: 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20 puload diskfree
4d00: 75 6e 61 6d 65 20 72 75 6e 64 69 72 20 69 74 65 uname rundir ite
4d10: 6d 2d 70 61 74 68 20 72 75 6e 5f 64 75 72 61 74 m-path run_durat
4d20: 69 6f 6e 20 66 69 6e 61 6c 5f 6c 6f 67 66 20 63 ion final_logf c
4d30: 6f 6d 6d 65 6e 74 20 29 0a 20 20 20 20 20 20 20 omment ).
4d40: 28 73 65 74 21 20 72 65 73 20 28 76 65 63 74 6f (set! res (vecto
4d50: 72 20 69 64 20 72 75 6e 2d 69 64 20 74 65 73 74 r id run-id test
4d60: 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61 74 75 name state statu
4d70: 73 20 65 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73 s event-time hos
4d80: 74 20 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 t cpuload diskfr
4d90: 65 65 20 75 6e 61 6d 65 20 72 75 6e 64 69 72 20 ee uname rundir
4da0: 69 74 65 6d 2d 70 61 74 68 20 72 75 6e 5f 64 75 item-path run_du
4db0: 72 61 74 69 6f 6e 20 66 69 6e 61 6c 5f 6c 6f 67 ration final_log
4dc0: 66 20 63 6f 6d 6d 65 6e 74 20 29 29 29 0a 20 20 f comment ))).
4dd0: 20 20 20 64 62 20 0a 20 20 20 20 20 22 53 45 4c db . "SEL
4de0: 45 43 54 20 69 64 2c 72 75 6e 5f 69 64 2c 74 65 ECT id,run_id,te
4df0: 73 74 6e 61 6d 65 2c 73 74 61 74 65 2c 73 74 61 stname,state,sta
4e00: 74 75 73 2c 65 76 65 6e 74 5f 74 69 6d 65 2c 68 tus,event_time,h
4e10: 6f 73 74 2c 63 70 75 6c 6f 61 64 2c 64 69 73 6b ost,cpuload,disk
4e20: 66 72 65 65 2c 75 6e 61 6d 65 2c 72 75 6e 64 69 free,uname,rundi
4e30: 72 2c 69 74 65 6d 5f 70 61 74 68 2c 72 75 6e 5f r,item_path,run_
4e40: 64 75 72 61 74 69 6f 6e 2c 66 69 6e 61 6c 5f 6c duration,final_l
4e50: 6f 67 66 2c 63 6f 6d 6d 65 6e 74 20 46 52 4f 4d ogf,comment FROM
4e60: 20 74 65 73 74 73 20 57 48 45 52 45 20 72 75 6e tests WHERE run
4e70: 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 _id=? AND testna
4e80: 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 me=? AND item_pa
4e90: 74 68 3d 3f 3b 22 0a 20 20 20 20 20 72 75 6e 2d th=?;". run-
4ea0: 69 64 20 74 65 73 74 6e 61 6d 65 20 69 74 65 6d id testname item
4eb0: 2d 70 61 74 68 29 0a 20 20 20 20 72 65 73 29 29 -path). res))
4ec0: 0a 0a 3b 3b 20 47 65 74 20 74 65 73 74 20 64 61 ..;; Get test da
4ed0: 74 61 20 75 73 69 6e 67 20 74 65 73 74 5f 69 64 ta using test_id
4ee0: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 .(define (db:get
4ef0: 2d 74 65 73 74 2d 64 61 74 61 2d 62 79 2d 69 64 -test-data-by-id
4f00: 20 64 62 20 74 65 73 74 2d 69 64 29 0a 20 20 28 db test-id). (
4f10: 6c 65 74 20 28 28 72 65 73 20 23 66 29 29 0a 20 let ((res #f)).
4f20: 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d (sqlite3:for-
4f30: 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c each-row. (l
4f40: 61 6d 62 64 61 20 28 69 64 20 72 75 6e 2d 69 64 ambda (id run-id
4f50: 20 74 65 73 74 6e 61 6d 65 20 73 74 61 74 65 20 testname state
4f60: 73 74 61 74 75 73 20 65 76 65 6e 74 2d 74 69 6d status event-tim
4f70: 65 20 68 6f 73 74 20 63 70 75 6c 6f 61 64 20 64 e host cpuload d
4f80: 69 73 6b 66 72 65 65 20 75 6e 61 6d 65 20 72 75 iskfree uname ru
4f90: 6e 64 69 72 20 69 74 65 6d 2d 70 61 74 68 20 72 ndir item-path r
4fa0: 75 6e 5f 64 75 72 61 74 69 6f 6e 20 66 69 6e 61 un_duration fina
4fb0: 6c 5f 6c 6f 67 66 20 63 6f 6d 6d 65 6e 74 29 0a l_logf comment).
4fc0: 20 20 20 20 20 20 20 28 73 65 74 21 20 72 65 73 (set! res
4fd0: 20 28 76 65 63 74 6f 72 20 69 64 20 72 75 6e 2d (vector id run-
4fe0: 69 64 20 74 65 73 74 6e 61 6d 65 20 73 74 61 74 id testname stat
4ff0: 65 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d 74 e status event-t
5000: 69 6d 65 20 68 6f 73 74 20 63 70 75 6c 6f 61 64 ime host cpuload
5010: 20 64 69 73 6b 66 72 65 65 20 75 6e 61 6d 65 20 diskfree uname
5020: 72 75 6e 64 69 72 20 69 74 65 6d 2d 70 61 74 68 rundir item-path
5030: 20 72 75 6e 5f 64 75 72 61 74 69 6f 6e 20 66 69 run_duration fi
5040: 6e 61 6c 5f 6c 6f 67 66 20 63 6f 6d 6d 65 6e 74 nal_logf comment
5050: 29 29 29 0a 20 20 20 20 20 64 62 20 0a 20 20 20 ))). db .
5060: 20 20 22 53 45 4c 45 43 54 20 69 64 2c 72 75 6e "SELECT id,run
5070: 5f 69 64 2c 74 65 73 74 6e 61 6d 65 2c 73 74 61 _id,testname,sta
5080: 74 65 2c 73 74 61 74 75 73 2c 65 76 65 6e 74 5f te,status,event_
5090: 74 69 6d 65 2c 68 6f 73 74 2c 63 70 75 6c 6f 61 time,host,cpuloa
50a0: 64 2c 64 69 73 6b 66 72 65 65 2c 75 6e 61 6d 65 d,diskfree,uname
50b0: 2c 72 75 6e 64 69 72 2c 69 74 65 6d 5f 70 61 74 ,rundir,item_pat
50c0: 68 2c 72 75 6e 5f 64 75 72 61 74 69 6f 6e 2c 66 h,run_duration,f
50d0: 69 6e 61 6c 5f 6c 6f 67 66 2c 63 6f 6d 6d 65 6e inal_logf,commen
50e0: 74 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 t FROM tests WHE
50f0: 52 45 20 69 64 3d 3f 3b 22 0a 20 20 20 20 20 74 RE id=?;". t
5100: 65 73 74 2d 69 64 29 0a 20 20 20 20 72 65 73 29 est-id). res)
5110: 29 0a 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a )...(define (db:
5120: 74 65 73 74 2d 73 65 74 2d 63 6f 6d 6d 65 6e 74 test-set-comment
5130: 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 6e db run-id testn
5140: 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 63 6f ame item-path co
5150: 6d 6d 65 6e 74 29 0a 20 20 28 73 71 6c 69 74 65 mment). (sqlite
5160: 33 3a 65 78 65 63 75 74 65 20 0a 20 20 20 64 62 3:execute . db
5170: 20 0a 20 20 20 22 55 50 44 41 54 45 20 74 65 73 . "UPDATE tes
5180: 74 73 20 53 45 54 20 63 6f 6d 6d 65 6e 74 3d 3f ts SET comment=?
5190: 20 57 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 WHERE run_id=?
51a0: 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 AND testname=? A
51b0: 4e 44 20 69 74 65 6d 5f 70 61 74 68 3d 3f 3b 22 ND item_path=?;"
51c0: 0a 20 20 20 20 20 63 6f 6d 6d 65 6e 74 20 72 75 . comment ru
51d0: 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 69 74 n-id testname it
51e0: 65 6d 2d 70 61 74 68 29 29 0a 0a 3b 3b 0a 28 64 em-path))..;;.(d
51f0: 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74 2d 73 efine (db:test-s
5200: 65 74 2d 72 75 6e 64 69 72 21 20 64 62 20 72 75 et-rundir! db ru
5210: 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 69 74 n-id testname it
5220: 65 6d 2d 70 61 74 68 20 72 75 6e 64 69 72 29 0a em-path rundir).
5230: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 (sqlite3:execu
5240: 74 65 20 0a 20 20 20 64 62 20 0a 20 20 20 22 55 te . db . "U
5250: 50 44 41 54 45 20 74 65 73 74 73 20 53 45 54 20 PDATE tests SET
5260: 72 75 6e 64 69 72 3d 3f 20 57 48 45 52 45 20 72 rundir=? WHERE r
5270: 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 un_id=? AND test
5280: 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f name=? AND item_
5290: 70 61 74 68 3d 3f 3b 22 0a 20 20 20 20 20 72 75 path=?;". ru
52a0: 6e 64 69 72 20 72 75 6e 2d 69 64 20 74 65 73 74 ndir run-id test
52b0: 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 29 name item-path))
52c0: 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ..;;============
52d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
52e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
52f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5300: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 54 65 ==========.;; Te
5310: 73 74 73 20 6d 65 74 61 20 64 61 74 61 0a 3b 3b sts meta data.;;
5320: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5330: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5340: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5350: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5360: 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 72 65 61 64 20 ======..;; read
5370: 74 68 65 20 72 65 63 6f 72 64 20 67 69 76 65 6e the record given
5380: 20 61 20 74 65 73 74 6e 61 6d 65 0a 28 64 65 66 a testname.(def
5390: 69 6e 65 20 28 64 62 3a 74 65 73 74 6d 65 74 61 ine (db:testmeta
53a0: 2d 67 65 74 2d 72 65 63 6f 72 64 20 64 62 20 74 -get-record db t
53b0: 65 73 74 6e 61 6d 65 29 0a 20 20 28 6c 65 74 20 estname). (let
53c0: 28 28 72 65 73 20 23 66 29 29 0a 20 20 20 20 28 ((res #f)). (
53d0: 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 sqlite3:for-each
53e0: 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 64 -row. (lambd
53f0: 61 20 28 69 64 20 74 65 73 74 6e 61 6d 65 20 61 a (id testname a
5400: 75 74 68 6f 72 20 6f 77 6e 65 72 20 64 65 73 63 uthor owner desc
5410: 72 69 70 74 69 6f 6e 20 72 65 76 69 65 77 65 64 ription reviewed
5420: 20 69 74 65 72 61 74 65 64 20 61 76 67 5f 72 75 iterated avg_ru
5430: 6e 74 69 6d 65 20 61 76 67 5f 64 69 73 6b 20 74 ntime avg_disk t
5440: 61 67 73 29 0a 20 20 20 20 20 20 20 28 73 65 74 ags). (set
5450: 21 20 72 65 73 20 28 76 65 63 74 6f 72 20 69 64 ! res (vector id
5460: 20 74 65 73 74 6e 61 6d 65 20 61 75 74 68 6f 72 testname author
5470: 20 6f 77 6e 65 72 20 64 65 73 63 72 69 70 74 69 owner descripti
5480: 6f 6e 20 72 65 76 69 65 77 65 64 20 69 74 65 72 on reviewed iter
5490: 61 74 65 64 20 61 76 67 5f 72 75 6e 74 69 6d 65 ated avg_runtime
54a0: 20 61 76 67 5f 64 69 73 6b 20 74 61 67 73 29 29 avg_disk tags))
54b0: 29 0a 20 20 20 20 20 64 62 20 22 53 45 4c 45 43 ). db "SELEC
54c0: 54 20 69 64 2c 74 65 73 74 6e 61 6d 65 2c 61 75 T id,testname,au
54d0: 74 68 6f 72 2c 6f 77 6e 65 72 2c 64 65 73 63 72 thor,owner,descr
54e0: 69 70 74 69 6f 6e 2c 72 65 76 69 65 77 65 64 2c iption,reviewed,
54f0: 69 74 65 72 61 74 65 64 2c 61 76 67 5f 72 75 6e iterated,avg_run
5500: 74 69 6d 65 2c 61 76 67 5f 64 69 73 6b 2c 74 61 time,avg_disk,ta
5510: 67 73 20 46 52 4f 4d 20 74 65 73 74 5f 6d 65 74 gs FROM test_met
5520: 61 20 57 48 45 52 45 20 74 65 73 74 6e 61 6d 65 a WHERE testname
5530: 3d 3f 3b 22 0a 20 20 20 20 20 74 65 73 74 6e 61 =?;". testna
5540: 6d 65 29 0a 20 20 20 20 72 65 73 29 29 0a 0a 3b me). res))..;
5550: 3b 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 72 ; create a new r
5560: 65 63 6f 72 64 20 66 6f 72 20 61 20 67 69 76 65 ecord for a give
5570: 6e 20 74 65 73 74 6e 61 6d 65 0a 28 64 65 66 69 n testname.(defi
5580: 6e 65 20 28 64 62 3a 74 65 73 74 6d 65 74 61 2d ne (db:testmeta-
5590: 61 64 64 2d 72 65 63 6f 72 64 20 64 62 20 74 65 add-record db te
55a0: 73 74 6e 61 6d 65 29 0a 20 20 28 73 71 6c 69 74 stname). (sqlit
55b0: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 49 e3:execute db "I
55c0: 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 NSERT OR IGNORE
55d0: 49 4e 54 4f 20 74 65 73 74 5f 6d 65 74 61 20 28 INTO test_meta (
55e0: 74 65 73 74 6e 61 6d 65 2c 61 75 74 68 6f 72 2c testname,author,
55f0: 6f 77 6e 65 72 2c 64 65 73 63 72 69 70 74 69 6f owner,descriptio
5600: 6e 2c 72 65 76 69 65 77 65 64 2c 69 74 65 72 61 n,reviewed,itera
5610: 74 65 64 2c 61 76 67 5f 72 75 6e 74 69 6d 65 2c ted,avg_runtime,
5620: 61 76 67 5f 64 69 73 6b 2c 74 61 67 73 29 20 56 avg_disk,tags) V
5630: 41 4c 55 45 53 20 28 3f 2c 27 27 2c 27 27 2c 27 ALUES (?,'','','
5640: 27 2c 27 27 2c 27 27 2c 27 27 2c 27 27 2c 27 27 ','','','','',''
5650: 29 3b 22 20 74 65 73 74 6e 61 6d 65 29 29 0a 0a );" testname))..
5660: 3b 3b 20 75 70 64 61 74 65 20 6f 6e 65 20 6f 66 ;; update one of
5670: 20 74 68 65 20 74 65 73 74 6d 65 74 61 20 66 69 the testmeta fi
5680: 65 6c 64 73 0a 28 64 65 66 69 6e 65 20 28 64 62 elds.(define (db
5690: 3a 74 65 73 74 6d 65 74 61 2d 75 70 64 61 74 65 :testmeta-update
56a0: 2d 66 69 65 6c 64 20 64 62 20 74 65 73 74 6e 61 -field db testna
56b0: 6d 65 20 66 69 65 6c 64 20 76 61 6c 75 65 29 0a me field value).
56c0: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 (sqlite3:execu
56d0: 74 65 20 64 62 20 28 63 6f 6e 63 20 22 55 50 44 te db (conc "UPD
56e0: 41 54 45 20 74 65 73 74 5f 6d 65 74 61 20 53 45 ATE test_meta SE
56f0: 54 20 22 20 66 69 65 6c 64 20 22 3d 3f 20 57 48 T " field "=? WH
5700: 45 52 45 20 74 65 73 74 6e 61 6d 65 3d 3f 3b 22 ERE testname=?;"
5710: 29 20 76 61 6c 75 65 20 74 65 73 74 6e 61 6d 65 ) value testname
5720: 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ))..;;==========
5730: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5740: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5750: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5760: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 ============.;;
5770: 54 20 45 20 53 20 54 20 20 20 44 20 41 20 54 20 T E S T D A T
5780: 41 20 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d A .;;===========
5790: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
57a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
57b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
57c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65 ===========..(de
57d0: 66 69 6e 65 20 28 64 62 3a 63 73 76 2d 3e 74 65 fine (db:csv->te
57e0: 73 74 2d 64 61 74 61 20 64 62 20 74 65 73 74 2d st-data db test-
57f0: 69 64 20 63 73 76 64 61 74 61 29 0a 20 20 28 64 id csvdata). (d
5800: 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22 74 65 ebug:print 4 "te
5810: 73 74 2d 69 64 20 22 20 74 65 73 74 2d 69 64 20 st-id " test-id
5820: 22 2c 20 63 73 76 64 61 74 61 3a 20 22 20 63 73 ", csvdata: " cs
5830: 76 64 61 74 61 29 0a 20 20 28 6c 65 74 20 28 28 vdata). (let ((
5840: 63 73 76 6c 69 73 74 20 28 63 73 76 2d 3e 6c 69 csvlist (csv->li
5850: 73 74 20 28 6d 61 6b 65 2d 63 73 76 2d 72 65 61 st (make-csv-rea
5860: 64 65 72 0a 09 09 09 20 20 20 20 20 28 6f 70 65 der.... (ope
5870: 6e 2d 69 6e 70 75 74 2d 73 74 72 69 6e 67 20 63 n-input-string c
5880: 73 76 64 61 74 61 29 0a 09 09 09 20 20 20 20 20 svdata)....
5890: 27 28 28 73 74 72 69 70 2d 6c 65 61 64 69 6e 67 '((strip-leading
58a0: 2d 77 68 69 74 65 73 70 61 63 65 3f 20 23 74 29 -whitespace? #t)
58b0: 0a 09 09 09 20 20 20 20 20 20 20 28 73 74 72 69 .... (stri
58c0: 70 2d 74 72 61 69 6c 69 6e 67 2d 77 68 69 74 65 p-trailing-white
58d0: 73 70 61 63 65 3f 20 23 74 29 29 20 29 29 29 29 space? #t)) ))))
58e0: 20 3b 3b 20 28 63 73 76 2d 3e 6c 69 73 74 20 63 ;; (csv->list c
58f0: 73 76 64 61 74 61 29 29 29 0a 20 20 20 20 28 66 svdata))). (f
5900: 6f 72 2d 65 61 63 68 20 0a 20 20 20 20 20 28 6c or-each . (l
5910: 61 6d 62 64 61 20 28 63 73 76 72 6f 77 29 0a 20 ambda (csvrow).
5920: 20 20 20 20 20 20 28 6c 65 74 2a 20 28 28 70 61 (let* ((pa
5930: 64 64 65 64 2d 72 6f 77 20 20 28 74 61 6b 65 20 dded-row (take
5940: 28 61 70 70 65 6e 64 20 63 73 76 72 6f 77 20 28 (append csvrow (
5950: 6c 69 73 74 20 23 66 20 23 66 20 23 66 20 23 66 list #f #f #f #f
5960: 20 23 66 20 23 66 20 23 66 20 23 66 29 29 20 38 #f #f #f #f)) 8
5970: 29 29 0a 09 20 20 20 20 20 20 28 63 61 74 65 67 )).. (categ
5980: 6f 72 79 20 20 20 20 28 6c 69 73 74 2d 72 65 66 ory (list-ref
5990: 20 70 61 64 64 65 64 2d 72 6f 77 20 30 29 29 0a padded-row 0)).
59a0: 09 20 20 20 20 20 20 28 76 61 72 69 61 62 6c 65 . (variable
59b0: 20 20 20 20 28 6c 69 73 74 2d 72 65 66 20 70 61 (list-ref pa
59c0: 64 64 65 64 2d 72 6f 77 20 31 29 29 0a 09 20 20 dded-row 1))..
59d0: 20 20 20 20 28 76 61 6c 75 65 20 20 20 20 20 20 (value
59e0: 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 2d 69 66 (any->number-if
59f0: 2d 70 6f 73 73 69 62 6c 65 20 28 6c 69 73 74 2d -possible (list-
5a00: 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20 32 ref padded-row 2
5a10: 29 29 29 0a 09 20 20 20 20 20 20 28 65 78 70 65 ))).. (expe
5a20: 63 74 65 64 20 20 20 20 28 61 6e 79 2d 3e 6e 75 cted (any->nu
5a30: 6d 62 65 72 2d 69 66 2d 70 6f 73 73 69 62 6c 65 mber-if-possible
5a40: 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65 (list-ref padde
5a50: 64 2d 72 6f 77 20 33 29 29 29 0a 09 20 20 20 20 d-row 3)))..
5a60: 20 20 28 74 6f 6c 20 20 20 20 20 20 20 20 20 28 (tol (
5a70: 61 6e 79 2d 3e 6e 75 6d 62 65 72 2d 69 66 2d 70 any->number-if-p
5a80: 6f 73 73 69 62 6c 65 20 28 6c 69 73 74 2d 72 65 ossible (list-re
5a90: 66 20 70 61 64 64 65 64 2d 72 6f 77 20 34 29 29 f padded-row 4))
5aa0: 29 20 3b 3b 20 3e 2c 20 3c 2c 20 3e 3d 2c 20 3c ) ;; >, <, >=, <
5ab0: 3d 2c 20 6f 72 20 61 20 6e 75 6d 62 65 72 0a 09 =, or a number..
5ac0: 20 20 20 20 20 20 28 75 6e 69 74 73 20 20 20 20 (units
5ad0: 20 20 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64 (list-ref pad
5ae0: 64 65 64 2d 72 6f 77 20 35 29 29 0a 09 20 20 20 ded-row 5))..
5af0: 20 20 20 28 63 6f 6d 6d 65 6e 74 20 20 20 20 20 (comment
5b00: 28 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65 64 (list-ref padded
5b10: 2d 72 6f 77 20 36 29 29 0a 09 20 20 20 20 20 20 -row 6))..
5b20: 28 73 74 61 74 75 73 20 20 20 20 20 20 28 6c 65 (status (le
5b30: 74 20 28 28 73 20 28 6c 69 73 74 2d 72 65 66 20 t ((s (list-ref
5b40: 70 61 64 64 65 64 2d 72 6f 77 20 37 29 29 29 0a padded-row 7))).
5b50: 09 09 09 20 20 20 20 20 28 69 66 20 28 61 6e 64 ... (if (and
5b60: 20 28 73 74 72 69 6e 67 3f 20 73 29 28 6f 72 20 (string? s)(or
5b70: 28 73 74 72 69 6e 67 2d 6d 61 74 63 68 20 28 72 (string-match (r
5b80: 65 67 65 78 70 20 22 5e 5c 5c 73 2a 24 22 29 20 egexp "^\\s*$")
5b90: 73 29 0a 09 09 09 09 09 09 20 20 20 20 20 28 73 s)....... (s
5ba0: 74 72 69 6e 67 2d 6d 61 74 63 68 20 28 72 65 67 tring-match (reg
5bb0: 65 78 70 20 22 5e 6e 2f 61 24 22 29 20 73 29 29 exp "^n/a$") s))
5bc0: 29 0a 09 09 09 09 20 23 66 0a 09 09 09 09 20 73 )..... #f..... s
5bd0: 29 29 29 29 20 3b 3b 20 69 66 20 73 70 65 63 69 )))) ;; if speci
5be0: 66 69 65 64 20 6f 6e 20 74 68 65 20 69 6e 70 75 fied on the inpu
5bf0: 74 20 74 68 65 6e 20 75 73 65 2c 20 65 6c 73 65 t then use, else
5c00: 20 63 61 6c 63 75 6c 61 74 65 0a 09 20 3b 3b 20 calculate.. ;;
5c10: 6c 6f 6f 6b 20 75 70 20 65 78 70 65 63 74 65 64 look up expected
5c20: 2c 74 6f 6c 2c 75 6e 69 74 73 20 66 72 6f 6d 20 ,tol,units from
5c30: 70 72 65 76 69 6f 75 73 20 62 65 73 74 20 66 69 previous best fi
5c40: 74 20 74 65 73 74 20 69 66 20 74 68 65 79 20 61 t test if they a
5c50: 72 65 20 61 6c 6c 20 65 69 74 68 65 72 20 23 66 re all either #f
5c60: 20 6f 72 20 27 27 0a 09 20 28 64 65 62 75 67 3a or ''.. (debug:
5c70: 70 72 69 6e 74 20 34 20 22 42 45 46 4f 52 45 3a print 4 "BEFORE:
5c80: 20 63 61 74 65 67 6f 72 79 3a 20 22 20 63 61 74 category: " cat
5c90: 65 67 6f 72 79 20 22 20 76 61 72 69 61 62 6c 65 egory " variable
5ca0: 3a 20 22 20 76 61 72 69 61 62 6c 65 20 22 20 76 : " variable " v
5cb0: 61 6c 75 65 3a 20 22 20 76 61 6c 75 65 20 0a 09 alue: " value ..
5cc0: 09 20 20 20 20 20 20 22 2c 20 65 78 70 65 63 74 . ", expect
5cd0: 65 64 3a 20 22 20 65 78 70 65 63 74 65 64 20 22 ed: " expected "
5ce0: 20 74 6f 6c 3a 20 22 20 74 6f 6c 20 22 20 75 6e tol: " tol " un
5cf0: 69 74 73 3a 20 22 20 75 6e 69 74 73 20 22 20 73 its: " units " s
5d00: 74 61 74 75 73 3a 20 22 20 73 74 61 74 75 73 20 tatus: " status
5d10: 22 20 63 6f 6d 6d 65 6e 74 3a 20 22 20 63 6f 6d " comment: " com
5d20: 6d 65 6e 74 29 0a 0a 09 20 28 69 66 20 28 61 6e ment)... (if (an
5d30: 64 20 28 6f 72 20 28 6e 6f 74 20 65 78 70 65 63 d (or (not expec
5d40: 74 65 64 29 28 65 71 75 61 6c 3f 20 65 78 70 65 ted)(equal? expe
5d50: 63 74 65 64 20 22 22 29 29 0a 09 09 20 20 28 6f cted ""))... (o
5d60: 72 20 28 6e 6f 74 20 74 6f 6c 29 20 20 20 20 20 r (not tol)
5d70: 28 65 71 75 61 6c 3f 20 65 78 70 65 63 74 65 64 (equal? expected
5d80: 20 22 22 29 29 0a 09 09 20 20 28 6f 72 20 28 6e ""))... (or (n
5d90: 6f 74 20 75 6e 69 74 73 29 20 20 20 28 65 71 75 ot units) (equ
5da0: 61 6c 3f 20 65 78 70 65 63 74 65 64 20 22 22 29 al? expected "")
5db0: 29 29 0a 09 20 20 20 20 20 28 6c 65 74 2d 76 61 )).. (let-va
5dc0: 6c 75 65 73 20 28 28 28 6e 65 77 2d 65 78 70 65 lues (((new-expe
5dd0: 63 74 65 64 20 6e 65 77 2d 74 6f 6c 20 6e 65 77 cted new-tol new
5de0: 2d 75 6e 69 74 73 29 28 64 62 3a 67 65 74 2d 70 -units)(db:get-p
5df0: 72 65 76 2d 74 6f 6c 2d 66 6f 72 2d 74 65 73 74 rev-tol-for-test
5e00: 20 64 62 20 74 65 73 74 2d 69 64 20 63 61 74 65 db test-id cate
5e10: 67 6f 72 79 20 76 61 72 69 61 62 6c 65 29 29 29 gory variable)))
5e20: 0a 09 20 20 20 20 20 20 20 28 73 65 74 21 20 65 .. (set! e
5e30: 78 70 65 63 74 65 64 20 6e 65 77 2d 65 78 70 65 xpected new-expe
5e40: 63 74 65 64 29 0a 09 20 20 20 20 20 20 20 28 73 cted).. (s
5e50: 65 74 21 20 74 6f 6c 20 20 20 20 20 20 6e 65 77 et! tol new
5e60: 2d 74 6f 6c 29 0a 09 20 20 20 20 20 20 20 28 73 -tol).. (s
5e70: 65 74 21 20 75 6e 69 74 73 20 20 20 20 6e 65 77 et! units new
5e80: 2d 75 6e 69 74 73 29 29 29 0a 0a 09 20 28 64 65 -units)))... (de
5e90: 62 75 67 3a 70 72 69 6e 74 20 34 20 22 41 46 54 bug:print 4 "AFT
5ea0: 45 52 3a 20 20 63 61 74 65 67 6f 72 79 3a 20 22 ER: category: "
5eb0: 20 63 61 74 65 67 6f 72 79 20 22 20 76 61 72 69 category " vari
5ec0: 61 62 6c 65 3a 20 22 20 76 61 72 69 61 62 6c 65 able: " variable
5ed0: 20 22 20 76 61 6c 75 65 3a 20 22 20 76 61 6c 75 " value: " valu
5ee0: 65 20 0a 09 09 20 20 20 20 20 20 22 2c 20 65 78 e ... ", ex
5ef0: 70 65 63 74 65 64 3a 20 22 20 65 78 70 65 63 74 pected: " expect
5f00: 65 64 20 22 20 74 6f 6c 3a 20 22 20 74 6f 6c 20 ed " tol: " tol
5f10: 22 20 75 6e 69 74 73 3a 20 22 20 75 6e 69 74 73 " units: " units
5f20: 20 22 20 73 74 61 74 75 73 3a 20 22 20 73 74 61 " status: " sta
5f30: 74 75 73 20 22 20 63 6f 6d 6d 65 6e 74 3a 20 22 tus " comment: "
5f40: 20 63 6f 6d 6d 65 6e 74 29 0a 09 20 3b 3b 20 63 comment).. ;; c
5f50: 61 6c 63 75 6c 61 74 65 20 73 74 61 74 75 73 20 alculate status
5f60: 69 66 20 4e 4f 54 20 73 70 65 63 69 66 69 65 64 if NOT specified
5f70: 0a 09 20 28 69 66 20 28 61 6e 64 20 28 6e 6f 74 .. (if (and (not
5f80: 20 73 74 61 74 75 73 29 28 6e 75 6d 62 65 72 3f status)(number?
5f90: 20 65 78 70 65 63 74 65 64 29 28 6e 75 6d 62 65 expected)(numbe
5fa0: 72 3f 20 76 61 6c 75 65 29 29 20 3b 3b 20 6e 65 r? value)) ;; ne
5fb0: 65 64 20 65 78 70 65 63 74 65 64 20 61 6e 64 20 ed expected and
5fc0: 76 61 6c 75 65 20 74 6f 20 62 65 20 6e 75 6d 62 value to be numb
5fd0: 65 72 73 0a 09 20 20 20 20 20 28 69 66 20 28 6e ers.. (if (n
5fe0: 75 6d 62 65 72 3f 20 74 6f 6c 29 20 3b 3b 20 69 umber? tol) ;; i
5ff0: 66 20 74 6f 6c 20 69 73 20 61 20 6e 75 6d 62 65 f tol is a numbe
6000: 72 20 74 68 65 6e 20 77 65 20 64 6f 20 74 68 65 r then we do the
6010: 20 73 74 61 6e 64 61 72 64 20 63 6f 6d 70 61 72 standard compar
6020: 69 73 6f 6e 0a 09 09 20 28 6c 65 74 2a 20 28 28 ison... (let* ((
6030: 6d 61 78 2d 76 61 6c 20 28 2b 20 65 78 70 65 63 max-val (+ expec
6040: 74 65 64 20 74 6f 6c 29 29 0a 09 09 09 28 6d 69 ted tol))....(mi
6050: 6e 2d 76 61 6c 20 28 2d 20 65 78 70 65 63 74 65 n-val (- expecte
6060: 64 20 74 6f 6c 29 29 0a 09 09 09 28 72 65 73 75 d tol))....(resu
6070: 6c 74 20 20 28 61 6e 64 20 28 3e 3d 20 20 76 61 lt (and (>= va
6080: 6c 75 65 20 6d 69 6e 2d 76 61 6c 29 28 3c 3d 20 lue min-val)(<=
6090: 76 61 6c 75 65 20 6d 61 78 2d 76 61 6c 29 29 29 value max-val)))
60a0: 29 0a 09 09 20 20 20 28 64 65 62 75 67 3a 70 72 )... (debug:pr
60b0: 69 6e 74 20 34 20 22 6d 61 78 2d 76 61 6c 3a 20 int 4 "max-val:
60c0: 22 20 6d 61 78 2d 76 61 6c 20 22 20 6d 69 6e 2d " max-val " min-
60d0: 76 61 6c 3a 20 22 20 6d 69 6e 2d 76 61 6c 20 22 val: " min-val "
60e0: 20 72 65 73 75 6c 74 3a 20 22 20 72 65 73 75 6c result: " resul
60f0: 74 29 0a 09 09 20 20 20 28 73 65 74 21 20 73 74 t)... (set! st
6100: 61 74 75 73 20 28 69 66 20 72 65 73 75 6c 74 20 atus (if result
6110: 22 70 61 73 73 22 20 22 66 61 69 6c 22 29 29 29 "pass" "fail")))
6120: 0a 09 09 20 28 73 65 74 21 20 73 74 61 74 75 73 ... (set! status
6130: 20 3b 3b 20 4e 42 2f 2f 20 6e 65 65 64 20 74 6f ;; NB// need to
6140: 20 61 73 73 65 73 73 20 65 61 63 68 20 6f 6e 65 assess each one
6150: 20 28 69 2e 65 2e 20 6e 6f 74 20 72 65 74 75 72 (i.e. not retur
6160: 6e 20 6f 70 65 72 61 74 6f 72 20 73 69 6e 63 65 n operator since
6170: 20 6e 65 65 64 20 74 6f 20 61 63 74 20 69 66 20 need to act if
6180: 6e 6f 74 20 76 61 6c 69 64 20 6f 70 2e 0a 09 09 not valid op....
6190: 20 20 20 20 20 20 20 28 63 61 73 65 20 28 73 74 (case (st
61a0: 72 69 6e 67 2d 3e 73 79 6d 62 6f 6c 20 74 6f 6c ring->symbol tol
61b0: 29 20 3b 3b 20 74 6f 6c 20 73 68 6f 75 6c 64 20 ) ;; tol should
61c0: 62 65 20 3e 2c 20 3c 2c 20 3e 3d 2c 20 3c 3d 0a be >, <, >=, <=.
61d0: 09 09 09 20 28 28 3e 29 20 20 28 69 66 20 28 3e ... ((>) (if (>
61e0: 20 20 76 61 6c 75 65 20 65 78 70 65 63 74 65 64 value expected
61f0: 29 20 22 70 61 73 73 22 20 22 66 61 69 6c 22 29 ) "pass" "fail")
6200: 29 0a 09 09 09 20 28 28 3c 29 20 20 28 69 66 20 ).... ((<) (if
6210: 28 3c 20 20 76 61 6c 75 65 20 65 78 70 65 63 74 (< value expect
6220: 65 64 29 20 22 70 61 73 73 22 20 22 66 61 69 6c ed) "pass" "fail
6230: 22 29 29 0a 09 09 09 20 28 28 3e 3d 29 20 28 69 ")).... ((>=) (i
6240: 66 20 28 3e 3d 20 76 61 6c 75 65 20 65 78 70 65 f (>= value expe
6250: 63 74 65 64 29 20 22 70 61 73 73 22 20 22 66 61 cted) "pass" "fa
6260: 69 6c 22 29 29 0a 09 09 09 20 28 28 3c 3d 29 20 il")).... ((<=)
6270: 28 69 66 20 28 3c 3d 20 76 61 6c 75 65 20 65 78 (if (<= value ex
6280: 70 65 63 74 65 64 29 20 22 70 61 73 73 22 20 22 pected) "pass" "
6290: 66 61 69 6c 22 29 29 0a 09 09 09 20 28 65 6c 73 fail")).... (els
62a0: 65 20 28 63 6f 6e 63 20 22 45 52 52 4f 52 3a 20 e (conc "ERROR:
62b0: 62 61 64 20 74 6f 6c 20 63 6f 6d 70 61 72 61 74 bad tol comparat
62c0: 6f 72 20 22 20 74 6f 6c 29 29 29 29 29 29 0a 09 or " tol))))))..
62d0: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20 (debug:print 4
62e0: 22 41 46 54 45 52 32 3a 20 63 61 74 65 67 6f 72 "AFTER2: categor
62f0: 79 3a 20 22 20 63 61 74 65 67 6f 72 79 20 22 20 y: " category "
6300: 76 61 72 69 61 62 6c 65 3a 20 22 20 76 61 72 69 variable: " vari
6310: 61 62 6c 65 20 22 20 76 61 6c 75 65 3a 20 22 20 able " value: "
6320: 76 61 6c 75 65 20 0a 09 09 20 20 20 20 20 20 22 value ... "
6330: 2c 20 65 78 70 65 63 74 65 64 3a 20 22 20 65 78 , expected: " ex
6340: 70 65 63 74 65 64 20 22 20 74 6f 6c 3a 20 22 20 pected " tol: "
6350: 74 6f 6c 20 22 20 75 6e 69 74 73 3a 20 22 20 75 tol " units: " u
6360: 6e 69 74 73 20 22 20 73 74 61 74 75 73 3a 20 22 nits " status: "
6370: 20 73 74 61 74 75 73 20 22 20 63 6f 6d 6d 65 6e status " commen
6380: 74 3a 20 22 20 63 6f 6d 6d 65 6e 74 29 0a 09 20 t: " comment)..
6390: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 (sqlite3:execute
63a0: 20 64 62 20 22 49 4e 53 45 52 54 20 4f 52 20 52 db "INSERT OR R
63b0: 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 65 73 74 EPLACE INTO test
63c0: 5f 64 61 74 61 20 28 74 65 73 74 5f 69 64 2c 63 _data (test_id,c
63d0: 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62 6c 65 ategory,variable
63e0: 2c 76 61 6c 75 65 2c 65 78 70 65 63 74 65 64 2c ,value,expected,
63f0: 74 6f 6c 2c 75 6e 69 74 73 2c 63 6f 6d 6d 65 6e tol,units,commen
6400: 74 2c 73 74 61 74 75 73 29 20 56 41 4c 55 45 53 t,status) VALUES
6410: 20 28 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c (?,?,?,?,?,?,?,
6420: 3f 2c 3f 29 3b 22 0a 09 20 20 20 20 20 20 74 65 ?,?);".. te
6430: 73 74 2d 69 64 20 63 61 74 65 67 6f 72 79 20 76 st-id category v
6440: 61 72 69 61 62 6c 65 20 76 61 6c 75 65 20 65 78 ariable value ex
6450: 70 65 63 74 65 64 20 74 6f 6c 20 75 6e 69 74 73 pected tol units
6460: 20 28 69 66 20 63 6f 6d 6d 65 6e 74 20 63 6f 6d (if comment com
6470: 6d 65 6e 74 20 22 22 29 20 73 74 61 74 75 73 29 ment "") status)
6480: 29 29 0a 20 20 20 20 20 63 73 76 6c 69 73 74 29 )). csvlist)
6490: 29 29 0a 0a 3b 3b 20 67 65 74 20 61 20 6c 69 73 ))..;; get a lis
64a0: 74 20 6f 66 20 74 65 73 74 5f 64 61 74 61 20 72 t of test_data r
64b0: 65 63 6f 72 64 73 20 6d 61 74 63 68 69 6e 67 20 ecords matching
64c0: 63 61 74 65 67 6f 72 79 70 61 74 74 0a 28 64 65 categorypatt.(de
64d0: 66 69 6e 65 20 28 64 62 3a 72 65 61 64 2d 74 65 fine (db:read-te
64e0: 73 74 2d 64 61 74 61 20 64 62 20 74 65 73 74 2d st-data db test-
64f0: 69 64 20 63 61 74 65 67 6f 72 79 70 61 74 74 29 id categorypatt)
6500: 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20 27 28 . (let ((res '(
6510: 29 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 ))). (sqlite3
6520: 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20 :for-each-row .
6530: 20 20 20 20 28 6c 61 6d 62 64 61 20 28 69 64 20 (lambda (id
6540: 74 65 73 74 5f 69 64 20 63 61 74 65 67 6f 72 79 test_id category
6550: 20 76 61 72 69 61 62 6c 65 20 76 61 6c 75 65 20 variable value
6560: 65 78 70 65 63 74 65 64 20 74 6f 6c 20 75 6e 69 expected tol uni
6570: 74 73 20 63 6f 6d 6d 65 6e 74 20 73 74 61 74 75 ts comment statu
6580: 73 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 s). (set!
6590: 72 65 73 20 28 63 6f 6e 73 20 28 76 65 63 74 6f res (cons (vecto
65a0: 72 20 69 64 20 74 65 73 74 5f 69 64 20 63 61 74 r id test_id cat
65b0: 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65 20 76 egory variable v
65c0: 61 6c 75 65 20 65 78 70 65 63 74 65 64 20 74 6f alue expected to
65d0: 6c 20 75 6e 69 74 73 20 63 6f 6d 6d 65 6e 74 20 l units comment
65e0: 73 74 61 74 75 73 29 20 72 65 73 29 29 29 0a 20 status) res))).
65f0: 20 20 20 20 64 62 0a 20 20 20 20 20 22 53 45 4c db. "SEL
6600: 45 43 54 20 69 64 2c 74 65 73 74 5f 69 64 2c 63 ECT id,test_id,c
6610: 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62 6c 65 ategory,variable
6620: 2c 76 61 6c 75 65 2c 65 78 70 65 63 74 65 64 2c ,value,expected,
6630: 74 6f 6c 2c 75 6e 69 74 73 2c 63 6f 6d 6d 65 6e tol,units,commen
6640: 74 2c 73 74 61 74 75 73 20 46 52 4f 4d 20 74 65 t,status FROM te
6650: 73 74 5f 64 61 74 61 20 57 48 45 52 45 20 74 65 st_data WHERE te
6660: 73 74 5f 69 64 3d 3f 20 41 4e 44 20 63 61 74 65 st_id=? AND cate
6670: 67 6f 72 79 20 4c 49 4b 45 20 3f 20 4f 52 44 45 gory LIKE ? ORDE
6680: 52 20 42 59 20 63 61 74 65 67 6f 72 79 2c 76 61 R BY category,va
6690: 72 69 61 62 6c 65 3b 22 20 74 65 73 74 2d 69 64 riable;" test-id
66a0: 20 63 61 74 65 67 6f 72 79 70 61 74 74 29 0a 20 categorypatt).
66b0: 20 20 20 28 72 65 76 65 72 73 65 20 72 65 73 29 (reverse res)
66c0: 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a ))..(define (db:
66d0: 6c 6f 61 64 2d 74 65 73 74 2d 64 61 74 61 20 64 load-test-data d
66e0: 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 b run-id test-na
66f0: 6d 65 20 69 74 65 6d 64 61 74 29 0a 20 20 28 6c me itemdat). (l
6700: 65 74 2a 20 28 28 69 74 65 6d 2d 70 61 74 68 20 et* ((item-path
6710: 28 69 74 65 6d 2d 6c 69 73 74 2d 3e 70 61 74 68 (item-list->path
6720: 20 69 74 65 6d 64 61 74 29 29 0a 09 20 28 74 65 itemdat)).. (te
6730: 73 74 64 61 74 20 28 64 62 3a 67 65 74 2d 74 65 stdat (db:get-te
6740: 73 74 2d 69 6e 66 6f 20 64 62 20 72 75 6e 2d 69 st-info db run-i
6750: 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d d test-name item
6760: 2d 70 61 74 68 29 29 0a 09 20 28 74 65 73 74 2d -path)).. (test-
6770: 69 64 20 28 69 66 20 74 65 73 74 64 61 74 20 28 id (if testdat (
6780: 64 62 3a 74 65 73 74 2d 67 65 74 2d 69 64 20 74 db:test-get-id t
6790: 65 73 74 64 61 74 29 20 23 66 29 29 29 0a 20 20 estdat) #f))).
67a0: 20 20 3b 3b 20 28 64 65 62 75 67 3a 70 72 69 6e ;; (debug:prin
67b0: 74 20 31 20 22 45 6e 74 65 72 20 72 65 63 6f 72 t 1 "Enter recor
67c0: 64 73 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 20 ds to insert in
67d0: 74 68 65 20 74 65 73 74 5f 64 61 74 61 20 74 61 the test_data ta
67e0: 62 6c 65 2c 20 73 65 76 65 6e 20 66 69 65 6c 64 ble, seven field
67f0: 73 2c 20 63 6f 6d 6d 61 20 73 65 70 61 72 61 74 s, comma separat
6800: 65 64 20 70 65 72 20 6c 69 6e 65 22 29 0a 20 20 ed per line").
6810: 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 (debug:print 4
6820: 20 22 69 74 65 6d 64 61 74 3a 20 22 20 69 74 65 "itemdat: " ite
6830: 6d 64 61 74 20 22 2c 20 74 65 73 74 2d 6e 61 6d mdat ", test-nam
6840: 65 3a 20 22 20 74 65 73 74 2d 6e 61 6d 65 20 22 e: " test-name "
6850: 2c 20 74 65 73 74 2d 69 64 3a 20 22 20 74 65 73 , test-id: " tes
6860: 74 2d 69 64 29 0a 20 20 20 20 28 69 66 20 74 65 t-id). (if te
6870: 73 74 2d 69 64 0a 09 28 6c 65 74 20 6c 6f 6f 70 st-id..(let loop
6880: 20 28 28 6c 69 6e 20 28 72 65 61 64 2d 6c 69 6e ((lin (read-lin
6890: 65 29 29 29 0a 09 20 20 28 69 66 20 28 6e 6f 74 e))).. (if (not
68a0: 20 28 65 6f 66 2d 6f 62 6a 65 63 74 3f 20 6c 69 (eof-object? li
68b0: 6e 29 29 0a 09 20 20 20 20 20 20 28 62 65 67 69 n)).. (begi
68c0: 6e 0a 09 09 28 64 65 62 75 67 3a 70 72 69 6e 74 n...(debug:print
68d0: 20 34 20 6c 69 6e 29 0a 09 09 28 64 62 3a 63 73 4 lin)...(db:cs
68e0: 76 2d 3e 74 65 73 74 2d 64 61 74 61 20 64 62 20 v->test-data db
68f0: 74 65 73 74 2d 69 64 20 6c 69 6e 29 0a 09 09 28 test-id lin)...(
6900: 6c 6f 6f 70 20 28 72 65 61 64 2d 6c 69 6e 65 29 loop (read-line)
6910: 29 29 29 29 29 0a 20 20 20 20 3b 3b 20 72 6f 6c ))))). ;; rol
6920: 6c 20 75 70 20 74 68 65 20 63 75 72 72 65 6e 74 l up the current
6930: 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 28 64 results.. (d
6940: 62 3a 74 65 73 74 2d 64 61 74 61 2d 72 6f 6c 6c b:test-data-roll
6950: 75 70 20 64 62 20 74 65 73 74 2d 69 64 29 29 29 up db test-id)))
6960: 0a 20 20 0a 3b 3b 20 57 41 52 4e 49 4e 47 3a 20 . .;; WARNING:
6970: 44 6f 20 4e 4f 54 20 63 61 6c 6c 20 74 68 69 73 Do NOT call this
6980: 20 66 6f 72 20 74 68 65 20 70 61 72 65 6e 74 20 for the parent
6990: 74 65 73 74 20 6f 6e 20 61 6e 20 69 74 65 72 61 test on an itera
69a0: 74 65 64 20 74 65 73 74 0a 3b 3b 20 52 6f 6c 6c ted test.;; Roll
69b0: 20 75 70 20 74 65 73 74 5f 64 61 74 61 20 70 61 up test_data pa
69c0: 73 73 2f 66 61 69 6c 20 72 65 73 75 6c 74 73 0a ss/fail results.
69d0: 3b 3b 20 6c 6f 6f 6b 20 61 74 20 74 68 65 20 74 ;; look at the t
69e0: 65 73 74 5f 64 61 74 61 20 73 74 61 74 75 73 20 est_data status
69f0: 66 69 65 6c 64 2c 20 0a 3b 3b 20 20 20 20 69 66 field, .;; if
6a00: 20 61 6c 6c 20 61 72 65 20 70 61 73 73 20 28 61 all are pass (a
6a10: 6e 79 20 63 61 73 65 29 20 61 6e 64 20 74 68 65 ny case) and the
6a20: 20 74 65 73 74 20 73 74 61 74 75 73 20 69 73 20 test status is
6a30: 50 41 53 53 20 6f 72 20 4e 55 4c 4c 20 6f 72 20 PASS or NULL or
6a40: 27 27 20 74 68 65 6e 20 73 65 74 20 74 65 73 74 '' then set test
6a50: 20 73 74 61 74 75 73 20 74 6f 20 50 41 53 53 2e status to PASS.
6a60: 0a 3b 3b 20 20 20 20 69 66 20 6f 6e 65 20 6f 72 .;; if one or
6a70: 20 6d 6f 72 65 20 61 72 65 20 66 61 69 6c 20 28 more are fail (
6a80: 61 6e 79 20 63 61 73 65 29 20 74 68 65 6e 20 73 any case) then s
6a90: 65 74 20 74 65 73 74 20 73 74 61 74 75 73 20 74 et test status t
6aa0: 6f 20 50 41 53 53 2c 20 6e 6f 6e 20 22 70 61 73 o PASS, non "pas
6ab0: 73 22 20 6f 72 20 22 66 61 69 6c 22 20 61 72 65 s" or "fail" are
6ac0: 20 69 67 6e 6f 72 65 64 0a 28 64 65 66 69 6e 65 ignored.(define
6ad0: 20 28 64 62 3a 74 65 73 74 2d 64 61 74 61 2d 72 (db:test-data-r
6ae0: 6f 6c 6c 75 70 20 64 62 20 74 65 73 74 2d 69 64 ollup db test-id
6af0: 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 ). (sqlite3:exe
6b00: 63 75 74 65 20 0a 20 20 20 64 62 20 0a 20 20 20 cute . db .
6b10: 22 55 50 44 41 54 45 20 74 65 73 74 73 20 0a 20 "UPDATE tests .
6b20: 20 20 20 20 20 53 45 54 20 66 61 69 6c 5f 63 6f SET fail_co
6b30: 75 6e 74 3d 28 53 45 4c 45 43 54 20 63 6f 75 6e unt=(SELECT coun
6b40: 74 28 69 64 29 20 46 52 4f 4d 20 74 65 73 74 5f t(id) FROM test_
6b50: 64 61 74 61 20 57 48 45 52 45 20 74 65 73 74 5f data WHERE test_
6b60: 69 64 3d 3f 20 41 4e 44 20 73 74 61 74 75 73 20 id=? AND status
6b70: 6c 69 6b 65 20 27 66 61 69 6c 27 29 2c 0a 20 20 like 'fail'),.
6b80: 20 20 20 20 20 20 20 20 70 61 73 73 5f 63 6f 75 pass_cou
6b90: 6e 74 3d 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 nt=(SELECT count
6ba0: 28 69 64 29 20 46 52 4f 4d 20 74 65 73 74 5f 64 (id) FROM test_d
6bb0: 61 74 61 20 57 48 45 52 45 20 74 65 73 74 5f 69 ata WHERE test_i
6bc0: 64 3d 3f 20 41 4e 44 20 73 74 61 74 75 73 20 6c d=? AND status l
6bd0: 69 6b 65 20 27 70 61 73 73 27 29 0a 20 20 20 20 ike 'pass').
6be0: 20 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 0a 20 WHERE id=?;".
6bf0: 20 20 74 65 73 74 2d 69 64 20 74 65 73 74 2d 69 test-id test-i
6c00: 64 20 74 65 73 74 2d 69 64 29 0a 20 20 3b 3b 20 d test-id). ;;
6c10: 69 66 20 74 68 65 20 74 65 73 74 20 69 73 20 6e if the test is n
6c20: 6f 74 20 46 41 49 4c 20 74 68 65 6e 20 73 65 74 ot FAIL then set
6c30: 20 73 74 61 74 75 73 20 62 61 73 65 64 20 6f 6e status based on
6c40: 20 74 68 65 20 66 61 69 6c 20 61 6e 64 20 70 61 the fail and pa
6c50: 73 73 20 63 6f 75 6e 74 73 2e 0a 20 20 28 74 68 ss counts.. (th
6c60: 72 65 61 64 2d 73 6c 65 65 70 21 20 31 29 0a 20 read-sleep! 1).
6c70: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 (sqlite3:execut
6c80: 65 0a 20 20 20 64 62 0a 20 20 20 22 55 50 44 41 e. db. "UPDA
6c90: 54 45 20 74 65 73 74 73 0a 20 20 20 20 20 20 53 TE tests. S
6ca0: 45 54 20 73 74 61 74 75 73 3d 43 41 53 45 20 57 ET status=CASE W
6cb0: 48 45 4e 20 28 53 45 4c 45 43 54 20 66 61 69 6c HEN (SELECT fail
6cc0: 5f 63 6f 75 6e 74 20 46 52 4f 4d 20 74 65 73 74 _count FROM test
6cd0: 73 20 57 48 45 52 45 20 69 64 3d 3f 29 20 3e 20 s WHERE id=?) >
6ce0: 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 0 .
6cf0: 20 20 20 20 20 20 20 20 20 20 20 20 54 48 45 4e THEN
6d00: 20 27 46 41 49 4c 27 0a 20 20 20 20 20 20 20 20 'FAIL'.
6d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 WH
6d20: 45 4e 20 28 53 45 4c 45 43 54 20 70 61 73 73 5f EN (SELECT pass_
6d30: 63 6f 75 6e 74 20 46 52 4f 4d 20 74 65 73 74 73 count FROM tests
6d40: 20 57 48 45 52 45 20 69 64 3d 3f 29 20 3e 20 30 WHERE id=?) > 0
6d50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
6d60: 20 20 20 20 20 20 20 20 20 20 54 48 45 4e 20 27 THEN '
6d70: 50 41 53 53 27 0a 20 20 20 20 20 20 20 20 20 20 PASS'.
6d80: 20 20 20 20 20 20 20 20 20 20 20 20 45 4c 53 45 ELSE
6d90: 20 73 74 61 74 75 73 0a 20 20 20 20 20 20 20 20 status.
6da0: 20 20 20 20 20 20 20 20 20 20 45 4e 44 20 57 48 END WH
6db0: 45 52 45 20 69 64 3d 3f 3b 22 0a 20 20 20 74 65 ERE id=?;". te
6dc0: 73 74 2d 69 64 20 74 65 73 74 2d 69 64 20 74 65 st-id test-id te
6dd0: 73 74 2d 69 64 29 29 0a 0a 28 64 65 66 69 6e 65 st-id))..(define
6de0: 20 28 64 62 3a 67 65 74 2d 70 72 65 76 2d 74 6f (db:get-prev-to
6df0: 6c 2d 66 6f 72 2d 74 65 73 74 20 64 62 20 74 65 l-for-test db te
6e00: 73 74 2d 69 64 20 63 61 74 65 67 6f 72 79 20 76 st-id category v
6e10: 61 72 69 61 62 6c 65 29 0a 20 20 3b 3b 20 46 69 ariable). ;; Fi
6e20: 6e 69 73 68 20 6d 65 3f 0a 20 20 28 76 61 6c 75 nish me?. (valu
6e30: 65 73 20 23 66 20 23 66 20 23 66 29 29 0a 0a 3b es #f #f #f))..;
6e40: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ;===============
6e50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
6e60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
6e70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
6e80: 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 53 20 54 20 45 =======.;; S T E
6e90: 20 50 20 53 20 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d P S .;;========
6ea0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
6eb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
6ec0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
6ed0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a ==============..
6ee0: 28 64 65 66 69 6e 65 20 28 64 62 3a 73 74 65 70 (define (db:step
6ef0: 2d 67 65 74 2d 74 69 6d 65 2d 61 73 2d 73 74 72 -get-time-as-str
6f00: 69 6e 67 20 76 65 63 29 0a 20 20 20 20 28 73 65 ing vec). (se
6f10: 63 6f 6e 64 73 2d 3e 74 69 6d 65 2d 73 74 72 69 conds->time-stri
6f20: 6e 67 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d ng (db:step-get-
6f30: 65 76 65 6e 74 5f 74 69 6d 65 20 76 65 63 29 29 event_time vec))
6f40: 29 0a 0a 3b 3b 20 64 62 2d 67 65 74 2d 74 65 73 )..;; db-get-tes
6f50: 74 2d 73 74 65 70 73 2d 66 6f 72 2d 72 75 6e 0a t-steps-for-run.
6f60: 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d (define (db:get-
6f70: 73 74 65 70 73 2d 66 6f 72 2d 74 65 73 74 20 64 steps-for-test d
6f80: 62 20 74 65 73 74 2d 69 64 29 0a 20 20 28 6c 65 b test-id). (le
6f90: 74 20 28 28 72 65 73 20 27 28 29 29 29 0a 20 20 t ((res '())).
6fa0: 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 (sqlite3:for-e
6fb0: 61 63 68 2d 72 6f 77 20 0a 20 20 20 20 20 28 6c ach-row . (l
6fc0: 61 6d 62 64 61 20 28 69 64 20 74 65 73 74 2d 69 ambda (id test-i
6fd0: 64 20 73 74 65 70 6e 61 6d 65 20 73 74 61 74 65 d stepname state
6fe0: 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d 74 69 status event-ti
6ff0: 6d 65 20 6c 6f 67 66 69 6c 65 29 0a 20 20 20 20 me logfile).
7000: 20 20 20 28 73 65 74 21 20 72 65 73 20 28 63 6f (set! res (co
7010: 6e 73 20 28 76 65 63 74 6f 72 20 69 64 20 74 65 ns (vector id te
7020: 73 74 2d 69 64 20 73 74 65 70 6e 61 6d 65 20 73 st-id stepname s
7030: 74 61 74 65 20 73 74 61 74 75 73 20 65 76 65 6e tate status even
7040: 74 2d 74 69 6d 65 20 28 69 66 20 28 73 74 72 69 t-time (if (stri
7050: 6e 67 3f 20 6c 6f 67 66 69 6c 65 29 20 6c 6f 67 ng? logfile) log
7060: 66 69 6c 65 20 22 22 29 29 20 72 65 73 29 29 29 file "")) res)))
7070: 0a 20 20 20 20 20 64 62 0a 20 20 20 20 20 22 53 . db. "S
7080: 45 4c 45 43 54 20 69 64 2c 74 65 73 74 5f 69 64 ELECT id,test_id
7090: 2c 73 74 65 70 6e 61 6d 65 2c 73 74 61 74 65 2c ,stepname,state,
70a0: 73 74 61 74 75 73 2c 65 76 65 6e 74 5f 74 69 6d status,event_tim
70b0: 65 2c 6c 6f 67 66 69 6c 65 20 46 52 4f 4d 20 74 e,logfile FROM t
70c0: 65 73 74 5f 73 74 65 70 73 20 57 48 45 52 45 20 est_steps WHERE
70d0: 74 65 73 74 5f 69 64 3d 3f 20 4f 52 44 45 52 20 test_id=? ORDER
70e0: 42 59 20 69 64 20 41 53 43 3b 22 20 3b 3b 20 65 BY id ASC;" ;; e
70f0: 76 65 6e 74 5f 74 69 6d 65 20 44 45 53 43 2c 69 vent_time DESC,i
7100: 64 20 41 53 43 3b 0a 20 20 20 20 20 74 65 73 74 d ASC;. test
7110: 2d 69 64 29 0a 20 20 20 20 28 72 65 76 65 72 73 -id). (revers
7120: 65 20 72 65 73 29 29 29 0a 0a 3b 3b 20 67 65 74 e res)))..;; get
7130: 20 61 20 70 72 65 74 74 79 20 74 61 62 6c 65 20 a pretty table
7140: 74 6f 20 73 75 6d 6d 61 72 69 7a 65 20 73 74 65 to summarize ste
7150: 70 73 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 28 64 ps.;;.(define (d
7160: 62 3a 67 65 74 2d 73 74 65 70 73 2d 74 61 62 6c b:get-steps-tabl
7170: 65 20 64 62 20 74 65 73 74 2d 69 64 29 0a 20 20 e db test-id).
7180: 28 6c 65 74 20 28 28 73 74 65 70 73 20 20 20 28 (let ((steps (
7190: 64 62 3a 67 65 74 2d 73 74 65 70 73 2d 66 6f 72 db:get-steps-for
71a0: 2d 74 65 73 74 20 64 62 20 74 65 73 74 2d 69 64 -test db test-id
71b0: 29 29 29 0a 20 20 20 20 3b 3b 20 6f 72 67 61 6e ))). ;; organ
71c0: 69 73 65 20 74 68 65 20 73 74 65 70 73 20 66 6f ise the steps fo
71d0: 72 20 62 65 74 74 65 72 20 72 65 61 64 61 62 69 r better readabi
71e0: 6c 69 74 79 0a 20 20 20 20 28 6c 65 74 20 28 28 lity. (let ((
71f0: 72 65 73 20 28 6d 61 6b 65 2d 68 61 73 68 2d 74 res (make-hash-t
7200: 61 62 6c 65 29 29 29 0a 20 20 20 20 20 20 28 66 able))). (f
7210: 6f 72 2d 65 61 63 68 20 0a 20 20 20 20 20 20 20 or-each .
7220: 28 6c 61 6d 62 64 61 20 28 73 74 65 70 29 0a 09 (lambda (step)..
7230: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 36 20 (debug:print 6
7240: 22 73 74 65 70 3d 22 20 73 74 65 70 29 0a 09 20 "step=" step)..
7250: 28 6c 65 74 20 28 28 72 65 63 6f 72 64 20 28 68 (let ((record (h
7260: 61 73 68 2d 74 61 62 6c 65 2d 72 65 66 2f 64 65 ash-table-ref/de
7270: 66 61 75 6c 74 20 0a 09 09 09 72 65 73 20 0a 09 fault ....res ..
7280: 09 09 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 ..(db:step-get-s
7290: 74 65 70 6e 61 6d 65 20 73 74 65 70 29 20 0a 09 tepname step) ..
72a0: 09 09 3b 3b 20 20 20 20 20 20 20 20 73 74 65 70 ..;; step
72b0: 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 name
72c0: 20 20 20 20 73 74 61 72 74 20 65 6e 64 20 73 74 start end st
72d0: 61 74 75 73 20 20 20 20 0a 09 09 09 28 76 65 63 atus ....(vec
72e0: 74 6f 72 20 28 64 62 3a 73 74 65 70 2d 67 65 74 tor (db:step-get
72f0: 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70 29 20 -stepname step)
7300: 22 22 20 20 20 22 22 20 22 22 20 20 20 20 20 22 "" "" "" "
7310: 22 20 22 22 29 29 29 29 0a 09 20 20 20 28 64 65 " "")))).. (de
7320: 62 75 67 3a 70 72 69 6e 74 20 36 20 22 72 65 63 bug:print 6 "rec
7330: 6f 72 64 28 62 65 66 6f 72 65 29 20 3d 20 22 20 ord(before) = "
7340: 72 65 63 6f 72 64 20 0a 09 09 09 22 5c 6e 69 64 record ...."\nid
7350: 3a 20 20 20 20 20 20 20 22 20 28 64 62 3a 73 74 : " (db:st
7360: 65 70 2d 67 65 74 2d 69 64 20 73 74 65 70 29 0a ep-get-id step).
7370: 09 09 09 22 5c 6e 73 74 65 70 6e 61 6d 65 3a 20 ..."\nstepname:
7380: 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 " (db:step-get-s
7390: 74 65 70 6e 61 6d 65 20 73 74 65 70 29 0a 09 09 tepname step)...
73a0: 09 22 5c 6e 73 74 61 74 65 3a 20 20 20 20 22 20 ."\nstate: "
73b0: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 (db:step-get-sta
73c0: 74 65 20 73 74 65 70 29 0a 09 09 09 22 5c 6e 73 te step)...."\ns
73d0: 74 61 74 75 73 3a 20 20 20 22 20 28 64 62 3a 73 tatus: " (db:s
73e0: 74 65 70 2d 67 65 74 2d 73 74 61 74 75 73 20 73 tep-get-status s
73f0: 74 65 70 29 0a 09 09 09 22 5c 6e 74 69 6d 65 3a tep)...."\ntime:
7400: 20 20 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d " (db:step-
7410: 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73 get-event_time s
7420: 74 65 70 29 29 0a 09 20 20 20 28 63 61 73 65 20 tep)).. (case
7430: 28 73 74 72 69 6e 67 2d 3e 73 79 6d 62 6f 6c 20 (string->symbol
7440: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 (db:step-get-sta
7450: 74 65 20 73 74 65 70 29 29 0a 09 20 20 20 20 20 te step))..
7460: 28 28 73 74 61 72 74 29 28 76 65 63 74 6f 72 2d ((start)(vector-
7470: 73 65 74 21 20 72 65 63 6f 72 64 20 31 20 28 64 set! record 1 (d
7480: 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 b:step-get-event
7490: 5f 74 69 6d 65 20 73 74 65 70 29 29 0a 09 20 20 _time step))..
74a0: 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 (vector-set!
74b0: 20 72 65 63 6f 72 64 20 33 20 28 69 66 20 28 65 record 3 (if (e
74c0: 71 75 61 6c 3f 20 28 76 65 63 74 6f 72 2d 72 65 qual? (vector-re
74d0: 66 20 72 65 63 6f 72 64 20 33 29 20 22 22 29 0a f record 3) "").
74e0: 09 09 09 09 09 28 64 62 3a 73 74 65 70 2d 67 65 .....(db:step-ge
74f0: 74 2d 73 74 61 74 75 73 20 73 74 65 70 29 29 29 t-status step)))
7500: 0a 09 20 20 20 20 20 20 28 69 66 20 28 3e 20 28 .. (if (> (
7510: 73 74 72 69 6e 67 2d 6c 65 6e 67 74 68 20 28 64 string-length (d
7520: 62 3a 73 74 65 70 2d 67 65 74 2d 6c 6f 67 66 69 b:step-get-logfi
7530: 6c 65 20 73 74 65 70 29 29 0a 09 09 20 20 20 20 le step))...
7540: 20 30 29 0a 09 09 20 20 28 76 65 63 74 6f 72 2d 0)... (vector-
7550: 73 65 74 21 20 72 65 63 6f 72 64 20 35 20 28 64 set! record 5 (d
7560: 62 3a 73 74 65 70 2d 67 65 74 2d 6c 6f 67 66 69 b:step-get-logfi
7570: 6c 65 20 73 74 65 70 29 29 29 29 0a 09 20 20 20 le step))))..
7580: 20 20 28 28 65 6e 64 29 20 20 0a 09 20 20 20 20 ((end) ..
7590: 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72 (vector-set! r
75a0: 65 63 6f 72 64 20 32 20 28 61 6e 79 2d 3e 6e 75 ecord 2 (any->nu
75b0: 6d 62 65 72 20 28 64 62 3a 73 74 65 70 2d 67 65 mber (db:step-ge
75c0: 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73 74 65 t-event_time ste
75d0: 70 29 29 29 0a 09 20 20 20 20 20 20 28 76 65 63 p))).. (vec
75e0: 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 tor-set! record
75f0: 33 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 3 (db:step-get-s
7600: 74 61 74 75 73 20 73 74 65 70 29 29 0a 09 20 20 tatus step))..
7610: 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 (vector-set!
7620: 20 72 65 63 6f 72 64 20 34 20 28 6c 65 74 20 28 record 4 (let (
7630: 28 73 74 61 72 74 74 20 28 61 6e 79 2d 3e 6e 75 (startt (any->nu
7640: 6d 62 65 72 20 28 76 65 63 74 6f 72 2d 72 65 66 mber (vector-ref
7650: 20 72 65 63 6f 72 64 20 31 29 29 29 0a 09 09 09 record 1)))....
7660: 09 09 20 20 28 65 6e 64 74 20 20 20 28 61 6e 79 .. (endt (any
7670: 2d 3e 6e 75 6d 62 65 72 20 28 76 65 63 74 6f 72 ->number (vector
7680: 2d 72 65 66 20 72 65 63 6f 72 64 20 32 29 29 29 -ref record 2)))
7690: 29 0a 09 09 09 09 20 20 20 20 20 20 28 64 65 62 )..... (deb
76a0: 75 67 3a 70 72 69 6e 74 20 34 20 22 72 65 63 6f ug:print 4 "reco
76b0: 72 64 5b 31 5d 3d 22 20 28 76 65 63 74 6f 72 2d rd[1]=" (vector-
76c0: 72 65 66 20 72 65 63 6f 72 64 20 31 29 20 0a 09 ref record 1) ..
76d0: 09 09 09 09 09 20 20 20 22 2c 20 73 74 61 72 74 ..... ", start
76e0: 74 3d 22 20 73 74 61 72 74 74 20 22 2c 20 65 6e t=" startt ", en
76f0: 64 74 3d 22 20 65 6e 64 74 0a 09 09 09 09 09 09 dt=" endt.......
7700: 20 20 20 22 2c 20 67 65 74 2d 73 74 61 74 75 73 ", get-status
7710: 3a 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 : " (db:step-get
7720: 2d 73 74 61 74 75 73 20 73 74 65 70 29 29 0a 09 -status step))..
7730: 09 09 09 20 20 20 20 20 20 28 69 66 20 28 61 6e ... (if (an
7740: 64 20 28 6e 75 6d 62 65 72 3f 20 73 74 61 72 74 d (number? start
7750: 74 29 28 6e 75 6d 62 65 72 3f 20 65 6e 64 74 29 t)(number? endt)
7760: 29 0a 09 09 09 09 09 20 20 28 73 65 63 6f 6e 64 )...... (second
7770: 73 2d 3e 68 72 2d 6d 69 6e 2d 73 65 63 20 28 2d s->hr-min-sec (-
7780: 20 65 6e 64 74 20 73 74 61 72 74 74 29 29 20 22 endt startt)) "
7790: 2d 31 22 29 29 29 0a 09 20 20 20 20 20 20 28 69 -1"))).. (i
77a0: 66 20 28 3e 20 28 73 74 72 69 6e 67 2d 6c 65 6e f (> (string-len
77b0: 67 74 68 20 28 64 62 3a 73 74 65 70 2d 67 65 74 gth (db:step-get
77c0: 2d 6c 6f 67 66 69 6c 65 20 73 74 65 70 29 29 0a -logfile step)).
77d0: 09 09 20 20 20 20 20 30 29 0a 09 09 20 20 28 76 .. 0)... (v
77e0: 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 ector-set! recor
77f0: 64 20 35 20 28 64 62 3a 73 74 65 70 2d 67 65 74 d 5 (db:step-get
7800: 2d 6c 6f 67 66 69 6c 65 20 73 74 65 70 29 29 29 -logfile step)))
7810: 29 0a 09 20 20 20 20 20 28 65 6c 73 65 0a 09 20 ).. (else..
7820: 20 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73 (vector-s
7830: 65 74 21 20 72 65 63 6f 72 64 20 32 20 28 64 62 et! record 2 (db
7840: 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 74 65 20 :step-get-state
7850: 73 74 65 70 29 29 0a 09 20 20 20 20 20 20 20 20 step))..
7860: 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63 (vector-set! rec
7870: 6f 72 64 20 33 20 28 64 62 3a 73 74 65 70 2d 67 ord 3 (db:step-g
7880: 65 74 2d 73 74 61 74 75 73 20 73 74 65 70 29 29 et-status step))
7890: 0a 09 20 20 20 20 20 20 20 20 28 76 65 63 74 6f .. (vecto
78a0: 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 34 20 r-set! record 4
78b0: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 (db:step-get-eve
78c0: 6e 74 5f 74 69 6d 65 20 73 74 65 70 29 29 29 29 nt_time step))))
78d0: 0a 09 20 20 20 28 68 61 73 68 2d 74 61 62 6c 65 .. (hash-table
78e0: 2d 73 65 74 21 20 72 65 73 20 28 64 62 3a 73 74 -set! res (db:st
78f0: 65 70 2d 67 65 74 2d 73 74 65 70 6e 61 6d 65 20 ep-get-stepname
7900: 73 74 65 70 29 20 72 65 63 6f 72 64 29 0a 09 20 step) record)..
7910: 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 36 (debug:print 6
7920: 20 22 72 65 63 6f 72 64 28 61 66 74 65 72 29 20 "record(after)
7930: 20 3d 20 22 20 72 65 63 6f 72 64 20 0a 09 09 09 = " record ....
7940: 22 5c 6e 69 64 3a 20 20 20 20 20 20 20 22 20 28 "\nid: " (
7950: 64 62 3a 73 74 65 70 2d 67 65 74 2d 69 64 20 73 db:step-get-id s
7960: 74 65 70 29 0a 09 09 09 22 5c 6e 73 74 65 70 6e tep)...."\nstepn
7970: 61 6d 65 3a 20 22 20 28 64 62 3a 73 74 65 70 2d ame: " (db:step-
7980: 67 65 74 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 get-stepname ste
7990: 70 29 0a 09 09 09 22 5c 6e 73 74 61 74 65 3a 20 p)...."\nstate:
79a0: 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65 " (db:step-ge
79b0: 74 2d 73 74 61 74 65 20 73 74 65 70 29 0a 09 09 t-state step)...
79c0: 09 22 5c 6e 73 74 61 74 75 73 3a 20 20 20 22 20 ."\nstatus: "
79d0: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 (db:step-get-sta
79e0: 74 75 73 20 73 74 65 70 29 0a 09 09 09 22 5c 6e tus step)...."\n
79f0: 74 69 6d 65 3a 20 20 20 20 20 22 20 28 64 62 3a time: " (db:
7a00: 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 step-get-event_t
7a10: 69 6d 65 20 73 74 65 70 29 29 29 29 0a 20 20 20 ime step)))).
7a20: 20 20 20 20 3b 3b 20 28 65 6c 73 65 20 20 20 28 ;; (else (
7a30: 76 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f vector-set! reco
7a40: 72 64 20 31 20 28 64 62 3a 73 74 65 70 2d 67 65 rd 1 (db:step-ge
7a50: 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73 74 65 t-event_time ste
7a60: 70 29 29 29 0a 20 20 20 20 20 20 20 28 73 6f 72 p))). (sor
7a70: 74 20 73 74 65 70 73 20 28 6c 61 6d 62 64 61 20 t steps (lambda
7a80: 28 61 20 62 29 28 3c 20 28 64 62 3a 73 74 65 70 (a b)(< (db:step
7a90: 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 -get-event_time
7aa0: 61 29 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 a)(db:step-get-e
7ab0: 76 65 6e 74 5f 74 69 6d 65 20 62 29 29 29 29 29 vent_time b)))))
7ac0: 0a 20 20 20 20 20 20 72 65 73 29 29 29 0a 0a 3b . res)))..;
7ad0: 3b 20 55 53 45 3a 20 28 6c 73 65 74 2d 64 69 66 ; USE: (lset-dif
7ae0: 66 65 72 65 6e 63 65 20 73 74 72 69 6e 67 3d 3f ference string=?
7af0: 20 27 28 22 61 22 20 22 62 22 20 22 63 22 29 20 '("a" "b" "c")
7b00: 27 28 22 64 22 20 22 63 22 20 22 65 22 20 22 61 '("d" "c" "e" "a
7b10: 22 29 29 0a 3b 3b 0a 3b 3b 20 52 65 74 75 72 6e ")).;;.;; Return
7b20: 20 61 20 6c 69 73 74 20 6f 66 20 70 72 65 72 65 a list of prere
7b30: 71 73 20 74 68 61 74 20 77 65 72 65 20 4e 4f 54 qs that were NOT
7b40: 20 6d 65 74 0a 3b 3b 20 20 54 65 73 74 73 20 28 met.;; Tests (
7b50: 61 6e 64 20 61 6c 6c 20 69 74 65 6d 73 29 20 69 and all items) i
7b60: 6e 20 77 61 69 74 6f 6e 20 6c 69 73 74 20 6d 75 n waiton list mu
7b70: 73 74 20 62 65 20 22 43 4f 4d 50 4c 45 54 45 44 st be "COMPLETED
7b80: 22 20 61 6e 64 20 22 50 41 53 53 22 0a 28 64 65 " and "PASS".(de
7b90: 66 69 6e 65 20 28 64 62 2d 67 65 74 2d 70 72 65 fine (db-get-pre
7ba0: 72 65 71 73 2d 6e 6f 74 2d 6d 65 74 20 64 62 20 reqs-not-met db
7bb0: 72 75 6e 2d 69 64 20 77 61 69 74 6f 6e 29 0a 20 run-id waiton).
7bc0: 20 28 69 66 20 28 6e 75 6c 6c 3f 20 77 61 69 74 (if (null? wait
7bd0: 6f 6e 29 0a 20 20 20 20 20 20 27 28 29 0a 20 20 on). '().
7be0: 20 20 20 20 28 6c 65 74 2a 20 28 28 75 6e 6d 65 (let* ((unme
7bf0: 74 2d 70 72 65 2d 72 65 71 73 20 27 28 29 29 0a t-pre-reqs '()).
7c00: 09 20 20 20 20 20 28 74 65 73 74 73 20 20 20 20 . (tests
7c10: 20 20 20 20 20 20 20 28 64 62 2d 67 65 74 2d 74 (db-get-t
7c20: 65 73 74 73 2d 66 6f 72 2d 72 75 6e 20 64 62 20 ests-for-run db
7c30: 72 75 6e 2d 69 64 20 23 66 20 23 66 20 27 28 29 run-id #f #f '()
7c40: 20 27 28 29 29 29 0a 09 20 20 20 20 20 28 72 65 '())).. (re
7c50: 73 75 6c 74 20 20 20 20 20 20 20 20 20 27 28 29 sult '()
7c60: 29 29 0a 09 28 66 6f 72 2d 65 61 63 68 20 28 6c ))..(for-each (l
7c70: 61 6d 62 64 61 20 28 77 61 69 74 6f 6e 74 65 73 ambda (waitontes
7c80: 74 2d 6e 61 6d 65 29 0a 09 09 20 20 20 20 28 6c t-name)... (l
7c90: 65 74 20 28 28 65 76 65 72 2d 73 65 65 6e 20 23 et ((ever-seen #
7ca0: 66 29 29 0a 09 09 20 20 20 20 20 20 28 66 6f 72 f))... (for
7cb0: 2d 65 61 63 68 20 28 6c 61 6d 62 64 61 20 28 74 -each (lambda (t
7cc0: 65 73 74 29 0a 09 09 09 09 20 20 28 69 66 20 28 est)..... (if (
7cd0: 65 71 75 61 6c 3f 20 77 61 69 74 6f 6e 74 65 73 equal? waitontes
7ce0: 74 2d 6e 61 6d 65 20 28 64 62 3a 74 65 73 74 2d t-name (db:test-
7cf0: 67 65 74 2d 74 65 73 74 6e 61 6d 65 20 74 65 73 get-testname tes
7d00: 74 29 29 0a 09 09 09 09 20 20 20 20 20 20 28 62 t))..... (b
7d10: 65 67 69 6e 0a 09 09 09 09 09 28 73 65 74 21 20 egin......(set!
7d20: 65 76 65 72 2d 73 65 65 6e 20 23 74 29 0a 09 09 ever-seen #t)...
7d30: 09 09 09 28 69 66 20 28 6e 6f 74 20 28 61 6e 64 ...(if (not (and
7d40: 20 28 65 71 75 61 6c 3f 20 28 64 62 3a 74 65 73 (equal? (db:tes
7d50: 74 2d 67 65 74 2d 73 74 61 74 65 20 74 65 73 74 t-get-state test
7d60: 29 20 22 43 4f 4d 50 4c 45 54 45 44 22 29 0a 09 ) "COMPLETED")..
7d70: 09 09 09 09 09 20 20 20 20 20 20 28 6d 65 6d 62 ..... (memb
7d80: 65 72 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d er (db:test-get-
7d90: 73 74 61 74 75 73 20 74 65 73 74 29 20 27 28 22 status test) '("
7da0: 50 41 53 53 22 20 22 57 41 52 4e 22 20 22 43 48 PASS" "WARN" "CH
7db0: 45 43 4b 22 29 29 29 29 0a 09 09 09 09 09 20 20 ECK"))))......
7dc0: 20 20 28 73 65 74 21 20 72 65 73 75 6c 74 20 28 (set! result (
7dd0: 63 6f 6e 73 20 77 61 69 74 6f 6e 74 65 73 74 2d cons waitontest-
7de0: 6e 61 6d 65 20 72 65 73 75 6c 74 29 29 29 29 29 name result)))))
7df0: 29 0a 09 09 09 09 74 65 73 74 73 29 0a 09 09 20 ).....tests)...
7e00: 20 20 20 20 20 28 69 66 20 28 6e 6f 74 20 65 76 (if (not ev
7e10: 65 72 2d 73 65 65 6e 29 28 73 65 74 21 20 72 65 er-seen)(set! re
7e20: 73 75 6c 74 20 28 63 6f 6e 73 20 77 61 69 74 6f sult (cons waito
7e30: 6e 74 65 73 74 2d 6e 61 6d 65 20 72 65 73 75 6c ntest-name resul
7e40: 74 29 29 29 29 29 0a 09 09 20 20 77 61 69 74 6f t)))))... waito
7e50: 6e 29 0a 09 28 64 65 6c 65 74 65 2d 64 75 70 6c n)..(delete-dupl
7e60: 69 63 61 74 65 73 20 72 65 73 75 6c 74 29 29 29 icates result)))
7e70: 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d )..;;===========
7e80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7e90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7ea0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7eb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 45 ===========.;; E
7ec0: 78 74 72 61 63 74 20 6f 64 73 20 66 69 6c 65 20 xtract ods file
7ed0: 66 72 6f 6d 20 74 68 65 20 64 62 0a 3b 3b 3d 3d from the db.;;==
7ee0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7ef0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7f00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7f10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7f20: 3d 3d 3d 3d 0a 0a 3b 3b 20 72 75 6e 73 70 61 74 ====..;; runspat
7f30: 74 20 69 73 20 61 20 63 6f 6d 6d 61 20 64 65 6c t is a comma del
7f40: 69 6d 69 74 65 64 20 6c 69 73 74 20 6f 66 20 72 imited list of r
7f50: 75 6e 20 70 61 74 74 65 72 6e 73 0a 3b 3b 20 6b un patterns.;; k
7f60: 65 79 70 61 74 74 2d 61 6c 69 73 74 20 6d 75 73 eypatt-alist mus
7f70: 74 20 63 6f 6e 74 61 69 6e 20 2a 61 6c 6c 2a 20 t contain *all*
7f80: 6b 65 79 73 20 77 69 74 68 20 61 6e 20 61 73 73 keys with an ass
7f90: 6f 63 69 61 74 65 64 20 70 61 74 74 65 72 6e 3a ociated pattern:
7fa0: 20 27 28 20 28 22 4b 45 59 31 22 20 22 25 22 29 '( ("KEY1" "%")
7fb0: 20 2e 2e 20 29 0a 28 64 65 66 69 6e 65 20 28 64 .. ).(define (d
7fc0: 62 3a 65 78 74 72 61 63 74 2d 6f 64 73 2d 66 69 b:extract-ods-fi
7fd0: 6c 65 20 64 62 20 6f 75 74 70 75 74 66 69 6c 65 le db outputfile
7fe0: 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 20 72 keypatt-alist r
7ff0: 75 6e 73 70 61 74 74 20 70 61 74 68 6d 6f 64 29 unspatt pathmod)
8000: 0a 20 20 28 6c 65 74 2a 20 28 28 6b 65 79 73 73 . (let* ((keyss
8010: 74 72 20 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 tr (string-inte
8020: 72 73 70 65 72 73 65 20 28 6d 61 70 20 63 61 72 rsperse (map car
8030: 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 29 20 keypatt-alist)
8040: 22 2c 22 29 29 0a 09 20 28 6b 65 79 71 72 79 20 ",")).. (keyqry
8050: 20 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 (string-inters
8060: 70 65 72 73 65 20 28 6d 61 70 20 28 6c 61 6d 62 perse (map (lamb
8070: 64 61 20 28 70 29 28 63 6f 6e 63 20 28 63 61 72 da (p)(conc (car
8080: 20 70 29 20 22 20 4c 49 4b 45 20 3f 20 22 29 29 p) " LIKE ? "))
8090: 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 29 20 keypatt-alist)
80a0: 22 20 41 4e 44 20 22 29 29 0a 09 20 28 6e 75 6d " AND ")).. (num
80b0: 6b 65 79 73 20 20 28 6c 65 6e 67 74 68 20 6b 65 keys (length ke
80c0: 79 70 61 74 74 2d 61 6c 69 73 74 29 29 0a 09 20 ypatt-alist))..
80d0: 28 74 65 73 74 2d 69 64 73 20 27 28 29 29 0a 09 (test-ids '())..
80e0: 20 28 77 69 6e 64 6f 77 73 20 20 28 61 6e 64 20 (windows (and
80f0: 70 61 74 68 6d 6f 64 20 28 73 75 62 73 74 72 69 pathmod (substri
8100: 6e 67 2d 69 6e 64 65 78 20 22 5c 5c 22 20 70 61 ng-index "\\" pa
8110: 74 68 6d 6f 64 29 29 29 0a 09 20 28 74 65 6d 70 thmod))).. (temp
8120: 64 69 72 20 20 28 63 6f 6e 63 20 22 2f 74 6d 70 dir (conc "/tmp
8130: 2f 22 20 28 63 75 72 72 65 6e 74 2d 75 73 65 72 /" (current-user
8140: 2d 6e 61 6d 65 29 20 22 2f 22 20 72 75 6e 73 70 -name) "/" runsp
8150: 61 74 74 20 22 5f 22 20 28 72 61 6e 64 6f 6d 20 att "_" (random
8160: 31 30 30 30 30 29 20 22 5f 22 20 28 63 75 72 72 10000) "_" (curr
8170: 65 6e 74 2d 70 72 6f 63 65 73 73 2d 69 64 29 29 ent-process-id))
8180: 29 0a 09 20 28 72 75 6e 73 68 65 61 64 65 72 20 ).. (runsheader
8190: 28 61 70 70 65 6e 64 20 28 6c 69 73 74 20 22 52 (append (list "R
81a0: 75 6e 20 49 64 22 20 22 52 75 6e 6e 61 6d 65 22 un Id" "Runname"
81b0: 29 20 3b 20 30 20 31 0a 09 09 09 20 20 20 20 20 ) ; 0 1....
81c0: 28 6d 61 70 20 63 61 72 20 6b 65 79 70 61 74 74 (map car keypatt
81d0: 2d 61 6c 69 73 74 29 20 20 20 3b 20 2b 20 4e 20 -alist) ; + N
81e0: 3d 20 6c 65 6e 67 74 68 20 6b 65 79 70 61 74 74 = length keypatt
81f0: 2d 61 6c 69 73 74 0a 09 09 09 20 20 20 20 20 28 -alist.... (
8200: 6c 69 73 74 20 22 54 65 73 74 6e 61 6d 65 22 20 list "Testname"
8210: 20 20 20 20 20 20 20 20 20 3b 20 32 0a 09 09 09 ; 2....
8220: 09 20 20 20 22 49 74 65 6d 20 50 61 74 68 22 20 . "Item Path"
8230: 20 20 20 20 20 20 20 20 3b 20 33 20 0a 09 09 09 ; 3 ....
8240: 09 20 20 20 22 44 65 73 63 72 69 70 74 69 6f 6e . "Description
8250: 22 20 20 20 20 20 20 20 3b 20 34 20 0a 09 09 09 " ; 4 ....
8260: 09 20 20 20 22 53 74 61 74 65 22 20 20 20 20 20 . "State"
8270: 20 20 20 20 20 20 20 20 3b 20 35 20 0a 09 09 09 ; 5 ....
8280: 09 20 20 20 22 53 74 61 74 75 73 22 20 20 20 20 . "Status"
8290: 20 20 20 20 20 20 20 20 3b 20 36 20 20 0a 09 09 ; 6 ...
82a0: 09 09 20 20 20 22 46 69 6e 61 6c 20 4c 6f 67 22 .. "Final Log"
82b0: 20 20 20 20 20 20 20 20 20 3b 20 37 20 0a 09 09 ; 7 ...
82c0: 09 09 20 20 20 22 52 75 6e 20 44 75 72 61 74 69 .. "Run Durati
82d0: 6f 6e 22 20 20 20 20 20 20 3b 20 38 20 0a 09 09 on" ; 8 ...
82e0: 09 09 20 20 20 22 57 68 65 6e 20 52 75 6e 22 20 .. "When Run"
82f0: 20 20 20 20 20 20 20 20 20 3b 20 39 20 0a 09 09 ; 9 ...
8300: 09 09 20 20 20 22 54 61 67 73 22 20 20 20 20 20 .. "Tags"
8310: 20 20 20 20 20 20 20 20 20 3b 20 31 30 0a 09 09 ; 10...
8320: 09 09 20 20 20 22 52 75 6e 20 4f 77 6e 65 72 22 .. "Run Owner"
8330: 20 20 20 20 20 20 20 20 20 3b 20 31 31 0a 09 09 ; 11...
8340: 09 09 20 20 20 22 43 6f 6d 6d 65 6e 74 22 20 20 .. "Comment"
8350: 20 20 20 20 20 20 20 20 20 3b 20 31 32 0a 09 09 ; 12...
8360: 09 09 20 20 20 22 41 75 74 68 6f 72 22 20 20 20 .. "Author"
8370: 20 20 20 20 20 20 20 20 20 3b 20 31 33 0a 09 09 ; 13...
8380: 09 09 20 20 20 22 54 65 73 74 20 4f 77 6e 65 72 .. "Test Owner
8390: 22 20 20 20 20 20 20 20 20 3b 20 31 34 0a 09 09 " ; 14...
83a0: 09 09 20 20 20 22 52 65 76 69 65 77 65 64 22 20 .. "Reviewed"
83b0: 20 20 20 20 20 20 20 20 20 3b 20 31 35 0a 09 09 ; 15...
83c0: 09 09 20 20 20 22 44 69 73 6b 66 72 65 65 22 20 .. "Diskfree"
83d0: 20 20 20 20 20 20 20 20 20 3b 20 31 36 0a 09 09 ; 16...
83e0: 09 09 20 20 20 22 55 6e 61 6d 65 22 20 20 20 20 .. "Uname"
83f0: 20 20 20 20 20 20 20 20 20 3b 20 31 37 0a 09 09 ; 17...
8400: 09 09 20 20 20 22 52 75 6e 64 69 72 22 20 20 20 .. "Rundir"
8410: 20 20 20 20 20 20 20 20 20 3b 20 31 38 0a 09 09 ; 18...
8420: 09 09 20 20 20 22 48 6f 73 74 22 20 20 20 20 20 .. "Host"
8430: 20 20 20 20 20 20 20 20 20 3b 20 31 39 0a 09 09 ; 19...
8440: 09 09 20 20 20 22 43 70 75 20 4c 6f 61 64 22 20 .. "Cpu Load"
8450: 20 20 20 20 20 20 20 20 20 3b 20 32 30 0a 09 09 ; 20...
8460: 09 09 20 20 20 29 29 29 0a 09 20 28 72 65 73 75 .. ))).. (resu
8470: 6c 74 73 20 28 6c 69 73 74 20 72 75 6e 73 68 65 lts (list runshe
8480: 61 64 65 72 29 29 09 09 09 20 0a 09 20 28 74 65 ader))... .. (te
8490: 73 74 64 61 74 61 2d 68 65 61 64 65 72 20 28 6c stdata-header (l
84a0: 69 73 74 20 22 52 75 6e 20 49 64 22 20 22 54 65 ist "Run Id" "Te
84b0: 73 74 6e 61 6d 65 22 20 22 49 74 65 6d 20 50 61 stname" "Item Pa
84c0: 74 68 22 20 22 43 61 74 65 67 6f 72 79 22 20 22 th" "Category" "
84d0: 56 61 72 69 61 62 6c 65 22 20 22 56 61 6c 75 65 Variable" "Value
84e0: 22 20 22 45 78 70 65 63 74 65 64 22 20 22 54 6f " "Expected" "To
84f0: 6c 22 20 22 55 6e 69 74 73 22 20 22 53 74 61 74 l" "Units" "Stat
8500: 75 73 22 20 22 43 6f 6d 6d 65 6e 74 22 29 29 29 us" "Comment")))
8510: 0a 20 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e . (debug:prin
8520: 74 20 32 20 22 55 73 69 6e 67 20 22 20 74 65 6d t 2 "Using " tem
8530: 70 64 69 72 20 22 20 66 6f 72 20 63 6f 6e 73 74 pdir " for const
8540: 72 75 63 74 69 6e 67 20 74 68 65 20 6f 64 73 20 ructing the ods
8550: 66 69 6c 65 2e 20 6b 65 79 71 72 79 3a 20 22 20 file. keyqry: "
8560: 6b 65 79 71 72 79 20 22 20 6b 65 79 73 74 72 3a keyqry " keystr:
8570: 20 22 20 6b 65 79 73 73 74 72 20 22 20 77 69 74 " keysstr " wit
8580: 68 20 6b 65 79 73 3a 20 22 20 28 6d 61 70 20 63 h keys: " (map c
8590: 61 64 72 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 adr keypatt-alis
85a0: 74 29 29 0a 20 20 20 20 3b 3b 20 22 45 78 70 65 t)). ;; "Expe
85b0: 63 74 65 64 20 56 61 6c 75 65 22 0a 20 20 20 20 cted Value".
85c0: 3b 3b 20 22 56 61 6c 75 65 20 46 6f 75 6e 64 22 ;; "Value Found"
85d0: 0a 20 20 20 20 3b 3b 20 22 54 6f 6c 65 72 61 6e . ;; "Toleran
85e0: 63 65 22 0a 20 20 20 20 28 61 70 70 6c 79 20 73 ce". (apply s
85f0: 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d qlite3:for-each-
8600: 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 row. (lambda
8610: 20 28 74 65 73 74 2d 69 64 20 2e 20 62 29 0a 20 (test-id . b).
8620: 20 20 20 20 20 20 28 73 65 74 21 20 74 65 73 74 (set! test
8630: 2d 69 64 73 20 28 63 6f 6e 73 20 74 65 73 74 2d -ids (cons test-
8640: 69 64 20 74 65 73 74 2d 69 64 73 29 29 20 20 20 id test-ids))
8650: 3b 3b 20 74 65 73 74 2d 69 64 20 69 73 20 6e 6f ;; test-id is no
8660: 77 20 74 65 73 74 6e 61 6d 65 0a 20 20 20 20 20 w testname.
8670: 20 20 28 73 65 74 21 20 72 65 73 75 6c 74 73 20 (set! results
8680: 28 61 70 70 65 6e 64 20 72 65 73 75 6c 74 73 20 (append results
8690: 3b 3b 20 6e 6f 74 65 2c 20 64 72 6f 70 20 74 68 ;; note, drop th
86a0: 65 20 74 65 73 74 2d 69 64 0a 09 09 09 20 20 20 e test-id....
86b0: 20 20 28 6c 69 73 74 0a 09 09 09 20 20 20 20 20 (list....
86c0: 20 28 69 66 20 70 61 74 68 6d 6f 64 0a 09 09 09 (if pathmod....
86d0: 09 20 20 28 6c 65 74 2a 20 28 28 76 62 20 20 20 . (let* ((vb
86e0: 20 20 20 20 20 28 61 70 70 6c 79 20 76 65 63 74 (apply vect
86f0: 6f 72 20 62 29 29 0a 09 09 09 09 09 20 28 6b 65 or b))...... (ke
8700: 79 76 61 6c 73 20 20 20 28 6c 65 74 20 6c 6f 6f yvals (let loo
8710: 70 20 28 28 69 20 20 20 20 30 29 0a 09 09 09 09 p ((i 0).....
8720: 09 09 09 20 20 20 20 20 20 20 28 72 65 73 20 27 ... (res '
8730: 28 29 29 29 0a 09 09 09 09 09 09 20 20 20 20 20 ())).......
8740: 20 28 69 66 20 28 3e 3d 20 69 20 6e 75 6d 6b 65 (if (>= i numke
8750: 79 73 29 0a 09 09 09 09 09 09 09 20 20 72 65 73 ys)........ res
8760: 0a 09 09 09 09 09 09 09 20 20 28 6c 6f 6f 70 20 ........ (loop
8770: 28 2b 20 69 20 31 29 0a 09 09 09 09 09 09 09 09 (+ i 1).........
8780: 28 61 70 70 65 6e 64 20 72 65 73 20 28 6c 69 73 (append res (lis
8790: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62 t (vector-ref vb
87a0: 20 28 2b 20 69 20 32 29 29 29 29 29 29 29 29 0a (+ i 2)))))))).
87b0: 09 09 09 09 09 20 28 72 75 6e 6e 61 6d 65 20 20 ..... (runname
87c0: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62 20 (vector-ref vb
87d0: 31 29 29 0a 09 09 09 09 09 20 28 74 65 73 74 6e 1))...... (testn
87e0: 61 6d 65 20 20 28 76 65 63 74 6f 72 2d 72 65 66 ame (vector-ref
87f0: 20 76 62 20 28 2b 20 20 32 20 6e 75 6d 6b 65 79 vb (+ 2 numkey
8800: 73 29 29 29 0a 09 09 09 09 09 20 28 69 74 65 6d s)))...... (item
8810: 2d 70 61 74 68 20 28 76 65 63 74 6f 72 2d 72 65 -path (vector-re
8820: 66 20 76 62 20 28 2b 20 20 33 20 6e 75 6d 6b 65 f vb (+ 3 numke
8830: 79 73 29 29 29 0a 09 09 09 09 09 20 28 66 69 6e ys)))...... (fin
8840: 61 6c 2d 6c 6f 67 20 28 76 65 63 74 6f 72 2d 72 al-log (vector-r
8850: 65 66 20 76 62 20 28 2b 20 20 37 20 6e 75 6d 6b ef vb (+ 7 numk
8860: 65 79 73 29 29 29 0a 09 09 09 09 09 20 28 72 75 eys)))...... (ru
8870: 6e 2d 64 69 72 20 20 20 28 76 65 63 74 6f 72 2d n-dir (vector-
8880: 72 65 66 20 76 62 20 28 2b 20 31 38 20 6e 75 6d ref vb (+ 18 num
8890: 6b 65 79 73 29 29 29 0a 09 09 09 09 09 20 28 6c keys)))...... (l
88a0: 6f 67 2d 66 70 61 74 68 20 28 63 6f 6e 63 20 72 og-fpath (conc r
88b0: 75 6e 2d 64 69 72 20 22 2f 22 20 20 66 69 6e 61 un-dir "/" fina
88c0: 6c 2d 6c 6f 67 29 29 29 20 3b 3b 20 28 73 74 72 l-log))) ;; (str
88d0: 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 ing-intersperse
88e0: 6b 65 79 76 61 6c 73 20 22 2f 22 29 20 22 2f 22 keyvals "/") "/"
88f0: 20 74 65 73 74 6e 61 6d 65 20 22 2f 22 20 69 74 testname "/" it
8900: 65 6d 2d 70 61 74 68 20 22 2f 22 0a 09 09 09 09 em-path "/".....
8910: 20 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 (debug:print
8920: 20 34 20 22 6c 6f 67 3a 20 22 20 6c 6f 67 2d 66 4 "log: " log-f
8930: 70 61 74 68 20 22 20 65 78 69 73 74 73 3a 20 22 path " exists: "
8940: 20 28 66 69 6c 65 2d 65 78 69 73 74 73 3f 20 6c (file-exists? l
8950: 6f 67 2d 66 70 61 74 68 29 29 0a 09 09 09 09 20 og-fpath)).....
8960: 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 (vector-set!
8970: 76 62 20 28 2b 20 37 20 6e 75 6d 6b 65 79 73 29 vb (+ 7 numkeys)
8980: 20 28 69 66 20 28 66 69 6c 65 2d 65 78 69 73 74 (if (file-exist
8990: 73 3f 20 6c 6f 67 2d 66 70 61 74 68 29 0a 09 09 s? log-fpath)...
89a0: 09 09 09 09 09 09 20 20 20 20 20 20 28 6c 65 74 ...... (let
89b0: 20 28 28 6e 65 77 70 61 74 68 20 28 63 6f 6e 63 ((newpath (conc
89c0: 20 70 61 74 68 6d 6f 64 20 22 2f 22 0a 09 09 09 pathmod "/"....
89d0: 09 09 09 09 09 09 09 09 20 20 20 28 73 74 72 69 ........ (stri
89e0: 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 6b ng-intersperse k
89f0: 65 79 76 61 6c 73 20 22 2f 22 29 0a 09 09 09 09 eyvals "/").....
8a00: 09 09 09 09 09 09 09 20 20 20 22 2f 22 20 72 75 ....... "/" ru
8a10: 6e 6e 61 6d 65 20 22 2f 22 20 74 65 73 74 6e 61 nname "/" testna
8a20: 6d 65 20 22 2f 22 0a 09 09 09 09 09 09 09 09 09 me "/"..........
8a30: 09 09 20 20 20 28 69 66 20 28 73 74 72 69 6e 67 .. (if (string
8a40: 3d 3f 20 69 74 65 6d 2d 70 61 74 68 20 22 22 29 =? item-path "")
8a50: 20 22 22 20 28 63 6f 6e 63 20 22 2f 22 20 69 74 "" (conc "/" it
8a60: 65 6d 2d 70 61 74 68 29 29 0a 09 09 09 09 09 09 em-path)).......
8a70: 09 09 09 09 09 20 20 20 66 69 6e 61 6c 2d 6c 6f ..... final-lo
8a80: 67 29 29 29 0a 09 09 09 09 09 09 09 09 09 3b 3b g)))..........;;
8a90: 20 66 6f 72 20 6e 6f 77 20 74 68 72 6f 77 20 61 for now throw a
8aa0: 77 61 79 20 6e 65 77 70 61 74 68 20 61 6e 64 20 way newpath and
8ab0: 75 73 65 20 74 68 65 20 6c 6f 67 2d 66 70 61 74 use the log-fpat
8ac0: 68 20 63 6f 6e 63 27 64 20 77 69 74 68 20 70 61 h conc'd with pa
8ad0: 74 68 6d 6f 64 0a 09 09 09 09 09 09 09 09 09 28 thmod..........(
8ae0: 73 65 74 21 20 6e 65 77 70 61 74 68 20 28 63 6f set! newpath (co
8af0: 6e 63 20 70 61 74 68 6d 6f 64 20 6c 6f 67 2d 66 nc pathmod log-f
8b00: 70 61 74 68 29 29 0a 09 09 09 09 09 09 09 09 09 path))..........
8b10: 28 69 66 20 77 69 6e 64 6f 77 73 20 28 73 74 72 (if windows (str
8b20: 69 6e 67 2d 74 72 61 6e 73 6c 61 74 65 20 6e 65 ing-translate ne
8b30: 77 70 61 74 68 20 22 2f 22 20 22 5c 5c 22 29 20 wpath "/" "\\")
8b40: 6e 65 77 70 61 74 68 29 29 0a 09 09 09 09 09 09 newpath)).......
8b50: 09 09 20 20 20 20 20 20 28 69 66 20 28 3e 20 2a .. (if (> *
8b60: 76 65 72 62 6f 73 69 74 79 2a 20 31 29 0a 09 09 verbosity* 1)...
8b70: 09 09 09 09 09 09 09 20 20 28 63 6f 6e 63 20 66 ....... (conc f
8b80: 69 6e 61 6c 2d 6c 6f 67 20 22 20 6e 6f 74 2d 66 inal-log " not-f
8b90: 6f 75 6e 64 22 29 0a 09 09 09 09 09 09 09 09 09 ound")..........
8ba0: 20 20 22 22 29 29 29 0a 09 09 09 09 20 20 20 20 ""))).....
8bb0: 28 76 65 63 74 6f 72 2d 3e 6c 69 73 74 20 76 62 (vector->list vb
8bc0: 29 29 0a 09 09 09 09 20 20 62 29 29 29 29 29 0a ))..... b))))).
8bd0: 20 20 20 20 20 64 62 0a 20 20 20 20 20 28 63 6f db. (co
8be0: 6e 63 20 22 53 45 4c 45 43 54 0a 20 20 20 20 20 nc "SELECT.
8bf0: 20 20 20 20 20 20 20 20 20 74 2e 74 65 73 74 6e t.testn
8c00: 61 6d 65 2c 72 2e 69 64 2c 72 75 6e 6e 61 6d 65 ame,r.id,runname
8c10: 2c 22 20 6b 65 79 73 73 74 72 20 22 2c 74 2e 74 ," keysstr ",t.t
8c20: 65 73 74 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 estname,.
8c30: 20 20 20 20 20 20 20 74 2e 69 74 65 6d 5f 70 61 t.item_pa
8c40: 74 68 2c 74 6d 2e 64 65 73 63 72 69 70 74 69 6f th,tm.descriptio
8c50: 6e 2c 74 2e 73 74 61 74 65 2c 74 2e 73 74 61 74 n,t.state,t.stat
8c60: 75 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 us,.
8c70: 20 20 66 69 6e 61 6c 5f 6c 6f 67 66 2c 72 75 6e final_logf,run
8c80: 5f 64 75 72 61 74 69 6f 6e 2c 20 0a 20 20 20 20 _duration, .
8c90: 20 20 20 20 20 20 20 20 20 20 73 74 72 66 74 69 strfti
8ca0: 6d 65 28 27 25 6d 2f 25 64 2f 25 59 20 25 48 3a me('%m/%d/%Y %H:
8cb0: 25 4d 3a 25 53 27 2c 64 61 74 65 74 69 6d 65 28 %M:%S',datetime(
8cc0: 74 2e 65 76 65 6e 74 5f 74 69 6d 65 2c 27 75 6e t.event_time,'un
8cd0: 69 78 65 70 6f 63 68 27 29 2c 27 6c 6f 63 61 6c ixepoch'),'local
8ce0: 74 69 6d 65 27 29 2c 0a 20 20 20 20 20 20 20 20 time'),.
8cf0: 20 20 20 20 20 20 74 6d 2e 74 61 67 73 2c 72 2e tm.tags,r.
8d00: 6f 77 6e 65 72 2c 74 2e 63 6f 6d 6d 65 6e 74 2c owner,t.comment,
8d10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 . a
8d20: 75 74 68 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 uthor,.
8d30: 20 20 20 20 20 74 6d 2e 6f 77 6e 65 72 2c 72 65 tm.owner,re
8d40: 76 69 65 77 65 64 2c 0a 20 20 20 20 20 20 20 20 viewed,.
8d50: 20 20 20 20 20 20 64 69 73 6b 66 72 65 65 2c 75 diskfree,u
8d60: 6e 61 6d 65 2c 72 75 6e 64 69 72 2c 0a 20 20 20 name,rundir,.
8d70: 20 20 20 20 20 20 20 20 20 20 20 68 6f 73 74 2c host,
8d80: 63 70 75 6c 6f 61 64 0a 20 20 20 20 20 20 20 20 cpuload.
8d90: 20 20 20 20 46 52 4f 4d 20 74 65 73 74 73 20 41 FROM tests A
8da0: 53 20 74 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 72 S t INNER JOIN r
8db0: 75 6e 73 20 41 53 20 72 20 4f 4e 20 74 2e 72 75 uns AS r ON t.ru
8dc0: 6e 5f 69 64 3d 72 2e 69 64 20 49 4e 4e 45 52 20 n_id=r.id INNER
8dd0: 4a 4f 49 4e 20 74 65 73 74 5f 6d 65 74 61 20 41 JOIN test_meta A
8de0: 53 20 74 6d 20 4f 4e 20 74 6d 2e 74 65 73 74 6e S tm ON tm.testn
8df0: 61 6d 65 3d 74 2e 74 65 73 74 6e 61 6d 65 0a 20 ame=t.testname.
8e00: 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 WHERE
8e10: 20 72 75 6e 6e 61 6d 65 20 4c 49 4b 45 20 3f 20 runname LIKE ?
8e20: 41 4e 44 20 22 20 6b 65 79 71 72 79 20 22 3b 22 AND " keyqry ";"
8e30: 29 0a 20 20 20 20 20 72 75 6e 73 70 61 74 74 20 ). runspatt
8e40: 28 6d 61 70 20 63 61 64 72 20 6b 65 79 70 61 74 (map cadr keypat
8e50: 74 2d 61 6c 69 73 74 29 29 0a 20 20 20 20 28 73 t-alist)). (s
8e60: 65 74 21 20 72 65 73 75 6c 74 73 20 28 6c 69 73 et! results (lis
8e70: 74 20 28 63 6f 6e 73 20 22 52 75 6e 73 22 20 72 t (cons "Runs" r
8e80: 65 73 75 6c 74 73 29 29 29 0a 20 20 20 20 3b 3b esults))). ;;
8e90: 20 6e 6f 77 2c 20 66 6f 72 20 65 61 63 68 20 74 now, for each t
8ea0: 65 73 74 2c 20 63 6f 6c 6c 65 63 74 20 74 68 65 est, collect the
8eb0: 20 74 65 73 74 5f 64 61 74 61 20 69 6e 66 6f 20 test_data info
8ec0: 61 6e 64 20 61 64 64 20 61 20 6e 65 77 20 73 68 and add a new sh
8ed0: 65 65 74 0a 20 20 20 20 28 66 6f 72 2d 65 61 63 eet. (for-eac
8ee0: 68 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 h. (lambda (
8ef0: 74 65 73 74 2d 69 64 29 0a 20 20 20 20 20 20 20 test-id).
8f00: 28 6c 65 74 20 28 28 74 65 73 74 2d 64 61 74 61 (let ((test-data
8f10: 20 28 6c 69 73 74 20 74 65 73 74 64 61 74 61 2d (list testdata-
8f20: 68 65 61 64 65 72 29 29 0a 09 20 20 20 20 20 28 header)).. (
8f30: 63 75 72 72 2d 74 65 73 74 2d 6e 61 6d 65 20 23 curr-test-name #
8f40: 66 29 29 0a 09 20 28 73 71 6c 69 74 65 33 3a 66 f)).. (sqlite3:f
8f50: 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 09 20 20 28 or-each-row.. (
8f60: 6c 61 6d 62 64 61 20 28 72 75 6e 2d 69 64 20 74 lambda (run-id t
8f70: 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 estname item-pat
8f80: 68 20 63 61 74 65 67 6f 72 79 20 76 61 72 69 61 h category varia
8f90: 62 6c 65 20 76 61 6c 75 65 20 65 78 70 65 63 74 ble value expect
8fa0: 65 64 20 74 6f 6c 20 75 6e 69 74 73 20 73 74 61 ed tol units sta
8fb0: 74 75 73 20 63 6f 6d 6d 65 6e 74 29 0a 09 20 20 tus comment)..
8fc0: 20 20 28 73 65 74 21 20 63 75 72 72 2d 74 65 73 (set! curr-tes
8fd0: 74 2d 6e 61 6d 65 20 74 65 73 74 6e 61 6d 65 29 t-name testname)
8fe0: 0a 09 20 20 20 20 28 73 65 74 21 20 74 65 73 74 .. (set! test
8ff0: 2d 64 61 74 61 20 28 61 70 70 65 6e 64 20 74 65 -data (append te
9000: 73 74 2d 64 61 74 61 20 28 6c 69 73 74 20 28 6c st-data (list (l
9010: 69 73 74 20 72 75 6e 2d 69 64 20 74 65 73 74 6e ist run-id testn
9020: 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 63 61 ame item-path ca
9030: 74 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65 20 tegory variable
9040: 76 61 6c 75 65 20 65 78 70 65 63 74 65 64 20 74 value expected t
9050: 6f 6c 20 75 6e 69 74 73 20 73 74 61 74 75 73 20 ol units status
9060: 63 6f 6d 6d 65 6e 74 29 29 29 29 29 0a 09 20 20 comment)))))..
9070: 64 62 20 0a 09 20 20 3b 3b 20 22 53 45 4c 45 43 db .. ;; "SELEC
9080: 54 20 72 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d T run_id,testnam
9090: 65 2c 69 74 65 6d 5f 70 61 74 68 2c 63 61 74 65 e,item_path,cate
90a0: 67 6f 72 79 2c 76 61 72 69 61 62 6c 65 2c 74 64 gory,variable,td
90b0: 2e 76 61 6c 75 65 20 41 53 20 76 61 6c 75 65 2c .value AS value,
90c0: 65 78 70 65 63 74 65 64 2c 74 6f 6c 2c 75 6e 69 expected,tol,uni
90d0: 74 73 2c 74 64 2e 73 74 61 74 75 73 20 41 53 20 ts,td.status AS
90e0: 73 74 61 74 75 73 2c 74 64 2e 63 6f 6d 6d 65 6e status,td.commen
90f0: 74 20 41 53 20 63 6f 6d 6d 65 6e 74 20 46 52 4f t AS comment FRO
9100: 4d 20 74 65 73 74 5f 64 61 74 61 20 41 53 20 74 M test_data AS t
9110: 64 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 74 65 73 d INNER JOIN tes
9120: 74 73 20 4f 4e 20 74 65 73 74 73 2e 69 64 3d 74 ts ON tests.id=t
9130: 64 2e 74 65 73 74 5f 69 64 20 57 48 45 52 45 20 d.test_id WHERE
9140: 74 65 73 74 5f 69 64 3d 3f 3b 22 0a 09 20 20 22 test_id=?;".. "
9150: 53 45 4c 45 43 54 20 72 75 6e 5f 69 64 2c 74 65 SELECT run_id,te
9160: 73 74 6e 61 6d 65 2c 69 74 65 6d 5f 70 61 74 68 stname,item_path
9170: 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62 ,category,variab
9180: 6c 65 2c 74 64 2e 76 61 6c 75 65 20 41 53 20 76 le,td.value AS v
9190: 61 6c 75 65 2c 74 64 2e 65 78 70 65 63 74 65 64 alue,td.expected
91a0: 2c 74 64 2e 74 6f 6c 2c 74 64 2e 75 6e 69 74 73 ,td.tol,td.units
91b0: 2c 74 64 2e 73 74 61 74 75 73 20 41 53 20 73 74 ,td.status AS st
91c0: 61 74 75 73 2c 74 64 2e 63 6f 6d 6d 65 6e 74 20 atus,td.comment
91d0: 41 53 20 63 6f 6d 6d 65 6e 74 20 46 52 4f 4d 20 AS comment FROM
91e0: 74 65 73 74 5f 64 61 74 61 20 41 53 20 74 64 20 test_data AS td
91f0: 49 4e 4e 45 52 20 4a 4f 49 4e 20 74 65 73 74 73 INNER JOIN tests
9200: 20 4f 4e 20 74 65 73 74 73 2e 69 64 3d 74 64 2e ON tests.id=td.
9210: 74 65 73 74 5f 69 64 20 57 48 45 52 45 20 74 65 test_id WHERE te
9220: 73 74 6e 61 6d 65 3d 3f 3b 22 0a 09 20 20 74 65 stname=?;".. te
9230: 73 74 2d 69 64 29 0a 09 20 28 69 66 20 63 75 72 st-id).. (if cur
9240: 72 2d 74 65 73 74 2d 6e 61 6d 65 0a 09 20 20 20 r-test-name..
9250: 20 20 28 73 65 74 21 20 72 65 73 75 6c 74 73 20 (set! results
9260: 28 61 70 70 65 6e 64 20 72 65 73 75 6c 74 73 20 (append results
9270: 28 6c 69 73 74 20 28 63 6f 6e 73 20 63 75 72 72 (list (cons curr
9280: 2d 74 65 73 74 2d 6e 61 6d 65 20 74 65 73 74 2d -test-name test-
9290: 64 61 74 61 29 29 29 29 29 0a 09 20 29 29 0a 20 data))))).. )).
92a0: 20 20 20 20 28 73 6f 72 74 20 28 64 65 6c 65 74 (sort (delet
92b0: 65 2d 64 75 70 6c 69 63 61 74 65 73 20 74 65 73 e-duplicates tes
92c0: 74 2d 69 64 73 29 20 73 74 72 69 6e 67 3c 3d 29 t-ids) string<=)
92d0: 29 0a 20 20 20 20 28 73 79 73 74 65 6d 20 28 63 ). (system (c
92e0: 6f 6e 63 20 22 6d 6b 64 69 72 20 2d 70 20 22 20 onc "mkdir -p "
92f0: 74 65 6d 70 64 69 72 29 29 0a 20 20 20 20 3b 3b tempdir)). ;;
9300: 20 28 70 70 20 72 65 73 75 6c 74 73 29 0a 20 20 (pp results).
9310: 20 20 28 6f 64 73 3a 6c 69 73 74 2d 3e 6f 64 73 (ods:list->ods
9320: 20 0a 20 20 20 20 20 74 65 6d 70 64 69 72 0a 20 . tempdir.
9330: 20 20 20 20 28 69 66 20 28 73 74 72 69 6e 67 2d (if (string-
9340: 6d 61 74 63 68 20 28 72 65 67 65 78 70 20 22 5e match (regexp "^
9350: 5b 2f 7e 5d 2b 2e 2a 22 29 20 6f 75 74 70 75 74 [/~]+.*") output
9360: 66 69 6c 65 29 20 3b 3b 20 66 75 6c 6c 20 70 61 file) ;; full pa
9370: 74 68 3f 0a 09 20 6f 75 74 70 75 74 66 69 6c 65 th?.. outputfile
9380: 0a 09 20 28 62 65 67 69 6e 0a 09 20 20 20 28 64 .. (begin.. (d
9390: 65 62 75 67 3a 70 72 69 6e 74 20 30 20 22 57 41 ebug:print 0 "WA
93a0: 52 4e 49 4e 47 3a 20 70 61 74 68 20 67 69 76 65 RNING: path give
93b0: 6e 2c 20 22 20 6f 75 74 70 75 74 66 69 6c 65 20 n, " outputfile
93c0: 22 20 69 73 20 72 65 6c 61 74 69 76 65 2c 20 70 " is relative, p
93d0: 72 65 66 69 78 69 6e 67 20 77 69 74 68 20 63 75 refixing with cu
93e0: 72 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 22 rrent directory"
93f0: 29 0a 09 20 20 20 28 63 6f 6e 63 20 28 63 75 72 ).. (conc (cur
9400: 72 65 6e 74 2d 64 69 72 65 63 74 6f 72 79 29 20 rent-directory)
9410: 22 2f 22 20 6f 75 74 70 75 74 66 69 6c 65 29 29 "/" outputfile))
9420: 29 0a 20 20 20 20 20 72 65 73 75 6c 74 73 29 29 ). results))
9430: 29 0a 0a 3b 3b 20 28 64 62 3a 65 78 74 72 61 63 )..;; (db:extrac
9440: 74 2d 6f 64 73 2d 66 69 6c 65 20 64 62 20 22 6f t-ods-file db "o
9450: 75 74 70 75 74 66 69 6c 65 2e 6f 64 73 22 20 27 utputfile.ods" '
9460: 28 28 22 73 79 73 6e 61 6d 65 22 20 22 25 22 29 (("sysname" "%")
9470: 28 22 66 73 6e 61 6d 65 22 20 22 25 22 29 28 22 ("fsname" "%")("
9480: 64 61 74 61 70 61 74 68 22 20 22 25 22 29 29 20 datapath" "%"))
9490: 22 25 22 29 0a "%").