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 66 6f 73 EFAULT 'n/a',fos
27e0: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 s.
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2800: 43 4f 4e 53 54 52 41 49 4e 54 20 74 65 73 74 5f CONSTRAINT test_
2810: 64 61 74 61 20 55 4e 49 51 55 45 20 28 74 65 73 data UNIQUE (tes
2820: 74 5f 69 64 2c 63 61 74 65 67 6f 72 79 2c 76 61 t_id,category,va
2830: 72 69 61 62 6c 65 29 29 3b 22 29 0a 20 20 20 20 riable));").
2840: 20 20 20 28 70 61 74 63 68 2d 64 62 29 29 0a 20 (patch-db)).
2850: 20 20 20 20 20 28 28 3c 20 6d 76 65 72 20 31 2e ((< mver 1.
2860: 32 37 29 0a 20 20 20 20 20 20 20 28 64 62 3a 73 27). (db:s
2870: 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 et-var db "MEGAT
2880: 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e 32 EST_VERSION" 1.2
2890: 37 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 7). (sqlit
28a0: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 41 e3:execute db "A
28b0: 4c 54 45 52 20 54 41 42 4c 45 20 74 65 73 74 5f LTER TABLE test_
28c0: 64 61 74 61 20 41 44 44 20 43 4f 4c 55 4d 4e 20 data ADD COLUMN
28d0: 74 79 70 65 20 54 45 58 54 20 44 45 46 41 55 4c type TEXT DEFAUL
28e0: 54 20 27 27 3b 22 29 0a 20 20 20 20 20 20 20 28 T '';"). (
28f0: 70 61 74 63 68 2d 64 62 29 29 0a 20 20 20 20 20 patch-db)).
2900: 20 28 28 3c 20 6d 76 65 72 20 31 2e 32 39 29 0a ((< mver 1.29).
2910: 20 20 20 20 20 20 20 28 64 62 3a 73 65 74 2d 76 (db:set-v
2920: 61 72 20 64 62 20 22 4d 45 47 41 54 45 53 54 5f ar db "MEGATEST_
2930: 56 45 52 53 49 4f 4e 22 20 31 2e 32 39 29 0a 20 VERSION" 1.29).
2940: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 (sqlite3:e
2950: 78 65 63 75 74 65 20 64 62 20 22 41 4c 54 45 52 xecute db "ALTER
2960: 20 54 41 42 4c 45 20 74 65 73 74 5f 73 74 65 70 TABLE test_step
2970: 73 20 41 44 44 20 43 4f 4c 55 4d 4e 20 6c 6f 67 s ADD COLUMN log
2980: 66 69 6c 65 20 54 45 58 54 20 44 45 46 41 55 4c file TEXT DEFAUL
2990: 54 20 27 27 3b 22 29 0a 20 20 20 20 20 20 20 28 T '';"). (
29a0: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 sqlite3:execute
29b0: 64 62 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 db "ALTER TABLE
29c0: 74 65 73 74 73 20 41 44 44 20 43 4f 4c 55 4d 4e tests ADD COLUMN
29d0: 20 73 68 6f 72 74 64 69 72 20 54 45 58 54 20 44 shortdir TEXT D
29e0: 45 46 41 55 4c 54 20 27 27 3b 22 29 29 0a 20 20 EFAULT '';")).
29f0: 20 20 20 20 28 28 3c 20 6d 76 65 72 20 6d 65 67 ((< mver meg
2a00: 61 74 65 73 74 2d 76 65 72 73 69 6f 6e 29 0a 20 atest-version).
2a10: 20 20 20 20 20 20 28 64 62 3a 73 65 74 2d 76 61 (db:set-va
2a20: 72 20 64 62 20 22 4d 45 47 41 54 45 53 54 5f 56 r db "MEGATEST_V
2a30: 45 52 53 49 4f 4e 22 20 6d 65 67 61 74 65 73 74 ERSION" megatest
2a40: 2d 76 65 72 73 69 6f 6e 29 29 29 29 29 29 0a 0a -version))))))..
2a50: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ;;==============
2a60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2a70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2a80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2a90: 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 6d 65 74 61 ========.;; meta
2aa0: 20 67 65 74 20 61 6e 64 20 73 65 74 20 76 61 72 get and set var
2ab0: 73 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d s.;;============
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 0a 0a 3b 3b 20 72 ==========..;; r
2b00: 65 74 75 72 6e 73 20 6e 75 6d 62 65 72 20 69 66 eturns number if
2b10: 20 73 74 72 69 6e 67 2d 3e 6e 75 6d 62 65 72 20 string->number
2b20: 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 is successful, s
2b30: 74 72 69 6e 67 20 6f 74 68 65 72 77 69 73 65 0a tring otherwise.
2b40: 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d (define (db:get-
2b50: 76 61 72 20 64 62 20 76 61 72 29 0a 20 20 28 6c var db var). (l
2b60: 65 74 20 28 28 72 65 73 20 23 66 29 29 0a 20 20 et ((res #f)).
2b70: 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 (sqlite3:for-e
2b80: 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 ach-row. (la
2b90: 6d 62 64 61 20 28 76 61 6c 29 0a 20 20 20 20 20 mbda (val).
2ba0: 20 20 28 73 65 74 21 20 72 65 73 20 76 61 6c 29 (set! res val)
2bb0: 29 0a 20 20 20 20 20 64 62 20 22 53 45 4c 45 43 ). db "SELEC
2bc0: 54 20 76 61 6c 20 46 52 4f 4d 20 6d 65 74 61 64 T val FROM metad
2bd0: 61 74 20 57 48 45 52 45 20 76 61 72 3d 3f 3b 22 at WHERE var=?;"
2be0: 20 76 61 72 29 0a 20 20 20 20 28 69 66 20 28 73 var). (if (s
2bf0: 74 72 69 6e 67 3f 20 72 65 73 29 0a 09 28 6c 65 tring? res)..(le
2c00: 74 20 28 28 76 61 6c 6e 75 6d 20 28 73 74 72 69 t ((valnum (stri
2c10: 6e 67 2d 3e 6e 75 6d 62 65 72 20 72 65 73 29 29 ng->number res))
2c20: 29 0a 09 20 20 28 69 66 20 76 61 6c 6e 75 6d 20 ).. (if valnum
2c30: 76 61 6c 6e 75 6d 20 72 65 73 29 29 0a 09 72 65 valnum res))..re
2c40: 73 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 s)))..(define (d
2c50: 62 3a 73 65 74 2d 76 61 72 20 64 62 20 76 61 72 b:set-var db var
2c60: 20 76 61 6c 29 0a 20 20 28 73 71 6c 69 74 65 33 val). (sqlite3
2c70: 3a 65 78 65 63 75 74 65 20 64 62 20 22 49 4e 53 :execute db "INS
2c80: 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 49 ERT OR REPLACE I
2c90: 4e 54 4f 20 6d 65 74 61 64 61 74 20 28 76 61 72 NTO metadat (var
2ca0: 2c 76 61 6c 29 20 56 41 4c 55 45 53 20 28 3f 2c ,val) VALUES (?,
2cb0: 3f 29 3b 22 20 76 61 72 20 76 61 6c 29 29 0a 0a ?);" var val))..
2cc0: 3b 3b 20 75 73 65 20 61 20 67 6c 6f 62 61 6c 20 ;; use a global
2cd0: 66 6f 72 20 73 6f 6d 65 20 70 72 69 6d 69 74 69 for some primiti
2ce0: 76 65 20 63 61 63 68 69 6e 67 2c 20 69 74 20 69 ve caching, it i
2cf0: 73 20 6a 75 73 74 20 73 69 6c 6c 79 20 74 6f 20 s just silly to
2d00: 72 65 2d 72 65 61 64 20 74 68 65 20 64 62 20 0a re-read the db .
2d10: 3b 3b 20 6f 76 65 72 20 61 6e 64 20 6f 76 65 72 ;; over and over
2d20: 20 61 67 61 69 6e 20 66 6f 72 20 74 68 65 20 6b again for the k
2d30: 65 79 73 20 73 69 6e 63 65 20 74 68 65 79 20 6e eys since they n
2d40: 65 76 65 72 20 63 68 61 6e 67 65 0a 0a 28 64 65 ever change..(de
2d50: 66 69 6e 65 20 2a 64 62 2d 6b 65 79 73 2a 20 23 fine *db-keys* #
2d60: 66 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 2d f)..(define (db-
2d70: 67 65 74 2d 6b 65 79 73 20 64 62 29 0a 20 20 28 get-keys db). (
2d80: 69 66 20 2a 64 62 2d 6b 65 79 73 2a 20 2a 64 62 if *db-keys* *db
2d90: 2d 6b 65 79 73 2a 20 0a 20 20 20 20 20 20 28 6c -keys* . (l
2da0: 65 74 20 28 28 72 65 73 20 27 28 29 29 29 0a 09 et ((res '()))..
2db0: 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 (sqlite3:for-eac
2dc0: 68 2d 72 6f 77 20 0a 09 20 28 6c 61 6d 62 64 61 h-row .. (lambda
2dd0: 20 28 6b 65 79 20 6b 65 79 74 79 70 65 29 0a 09 (key keytype)..
2de0: 20 20 20 28 73 65 74 21 20 72 65 73 20 28 63 6f (set! res (co
2df0: 6e 73 20 28 76 65 63 74 6f 72 20 6b 65 79 20 6b ns (vector key k
2e00: 65 79 74 79 70 65 29 20 72 65 73 29 29 29 0a 09 eytype) res)))..
2e10: 20 64 62 0a 09 20 22 53 45 4c 45 43 54 20 66 69 db.. "SELECT fi
2e20: 65 6c 64 6e 61 6d 65 2c 66 69 65 6c 64 74 79 70 eldname,fieldtyp
2e30: 65 20 46 52 4f 4d 20 6b 65 79 73 20 4f 52 44 45 e FROM keys ORDE
2e40: 52 20 42 59 20 69 64 20 44 45 53 43 3b 22 29 0a R BY id DESC;").
2e50: 09 28 73 65 74 21 20 2a 64 62 2d 6b 65 79 73 2a .(set! *db-keys*
2e60: 20 72 65 73 29 0a 09 72 65 73 29 29 29 0a 0a 28 res)..res)))..(
2e70: 64 65 66 69 6e 65 20 64 62 3a 67 65 74 2d 6b 65 define db:get-ke
2e80: 79 73 20 64 62 2d 67 65 74 2d 6b 65 79 73 29 0a ys db-get-keys).
2e90: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 .(define (db:get
2ea0: 2d 76 61 6c 75 65 2d 62 79 2d 68 65 61 64 65 72 -value-by-header
2eb0: 20 72 6f 77 20 68 65 61 64 65 72 20 66 69 65 6c row header fiel
2ec0: 64 29 0a 20 20 3b 3b 20 28 64 65 62 75 67 3a 70 d). ;; (debug:p
2ed0: 72 69 6e 74 20 32 20 22 64 62 3a 67 65 74 2d 76 rint 2 "db:get-v
2ee0: 61 6c 75 65 2d 62 79 2d 68 65 61 64 65 72 20 72 alue-by-header r
2ef0: 6f 77 3a 20 22 20 72 6f 77 20 22 20 68 65 61 64 ow: " row " head
2f00: 65 72 3a 20 22 20 68 65 61 64 65 72 20 22 20 66 er: " header " f
2f10: 69 65 6c 64 3a 20 22 20 66 69 65 6c 64 29 0a 20 ield: " field).
2f20: 20 28 69 66 20 28 6e 75 6c 6c 3f 20 68 65 61 64 (if (null? head
2f30: 65 72 29 20 23 66 0a 20 20 20 20 20 20 28 6c 65 er) #f. (le
2f40: 74 20 6c 6f 6f 70 20 28 28 68 65 64 20 28 63 61 t loop ((hed (ca
2f50: 72 20 68 65 61 64 65 72 29 29 0a 09 09 20 28 74 r header))... (t
2f60: 61 6c 20 28 63 64 72 20 68 65 61 64 65 72 29 29 al (cdr header))
2f70: 0a 09 09 20 28 6e 20 20 20 30 29 29 0a 09 28 69 ... (n 0))..(i
2f80: 66 20 28 65 71 75 61 6c 3f 20 68 65 64 20 66 69 f (equal? hed fi
2f90: 65 6c 64 29 0a 09 20 20 20 20 28 76 65 63 74 6f eld).. (vecto
2fa0: 72 2d 72 65 66 20 72 6f 77 20 6e 29 0a 09 20 20 r-ref row n)..
2fb0: 20 20 28 69 66 20 28 6e 75 6c 6c 3f 20 74 61 6c (if (null? tal
2fc0: 29 20 23 66 20 28 6c 6f 6f 70 20 28 63 61 72 20 ) #f (loop (car
2fd0: 74 61 6c 29 28 63 64 72 20 74 61 6c 29 28 2b 20 tal)(cdr tal)(+
2fe0: 6e 20 31 29 29 29 29 29 29 29 0a 09 20 20 20 20 n 1)))))))..
2ff0: 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d .;;=============
3000: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3010: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3030: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 20 52 20 =========.;; R
3040: 55 20 4e 20 53 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d U N S.;;========
3050: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3060: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3070: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3080: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a ==============..
3090: 28 64 65 66 69 6e 65 20 28 72 75 6e 73 3a 67 65 (define (runs:ge
30a0: 74 2d 73 74 64 2d 72 75 6e 2d 66 69 65 6c 64 73 t-std-run-fields
30b0: 20 6b 65 79 73 20 72 65 6d 66 69 65 6c 64 73 29 keys remfields)
30c0: 0a 20 20 28 6c 65 74 2a 20 28 28 68 65 61 64 65 . (let* ((heade
30d0: 72 20 20 20 20 28 61 70 70 65 6e 64 20 28 6d 61 r (append (ma
30e0: 70 20 6b 65 79 3a 67 65 74 2d 66 69 65 6c 64 6e p key:get-fieldn
30f0: 61 6d 65 20 6b 65 79 73 29 0a 09 09 09 20 20 20 ame keys)....
3100: 20 72 65 6d 66 69 65 6c 64 73 29 29 0a 09 20 28 remfields)).. (
3110: 6b 65 79 73 74 72 20 20 20 20 28 63 6f 6e 63 20 keystr (conc
3120: 28 6b 65 79 73 2d 3e 6b 65 79 73 74 72 20 6b 65 (keys->keystr ke
3130: 79 73 29 20 22 2c 22 0a 09 09 09 20 20 28 73 74 ys) ",".... (st
3140: 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 ring-intersperse
3150: 20 72 65 6d 66 69 65 6c 64 73 20 22 2c 22 29 29 remfields ","))
3160: 29 29 0a 20 20 20 20 28 6c 69 73 74 20 6b 65 79 )). (list key
3170: 73 74 72 20 68 65 61 64 65 72 29 29 29 0a 0a 3b str header)))..;
3180: 3b 20 57 41 53 20 64 62 2d 67 65 74 2d 72 75 6e ; WAS db-get-run
3190: 73 20 46 49 58 4d 45 20 49 4e 20 52 45 4d 41 49 s FIXME IN REMAI
31a0: 4e 49 4e 47 20 43 4f 44 45 0a 3b 3b 0a 3b 3b 20 NING CODE.;;.;;
31b0: 4d 45 52 47 45 20 54 48 49 53 20 57 49 54 48 20 MERGE THIS WITH
31c0: 64 62 3a 67 65 74 2d 72 75 6e 73 2c 20 61 63 63 db:get-runs, acc
31d0: 69 64 65 6e 74 6c 79 20 77 72 6f 74 65 20 69 74 idently wrote it
31e0: 20 74 77 69 63 65 0a 3b 3b 0a 3b 3b 20 72 65 70 twice.;;.;; rep
31f0: 6c 61 63 65 20 68 65 61 64 65 72 20 61 6e 64 20 lace header and
3200: 6b 65 79 73 74 72 20 77 69 74 68 20 61 20 63 61 keystr with a ca
3210: 6c 6c 20 74 6f 20 72 75 6e 73 3a 67 65 74 2d 73 ll to runs:get-s
3220: 74 64 2d 72 75 6e 2d 66 69 65 6c 64 73 0a 3b 3b td-run-fields.;;
3230: 0a 3b 3b 20 6b 65 79 70 61 74 74 73 3a 20 28 20 .;; keypatts: (
3240: 28 4b 45 59 31 20 22 61 62 63 25 64 65 66 22 29 (KEY1 "abc%def")
3250: 28 4b 45 59 32 20 22 25 22 29 20 29 0a 3b 3b 0a (KEY2 "%") ).;;.
3260: 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d (define (db:get-
3270: 72 75 6e 73 20 64 62 20 72 75 6e 70 61 74 74 20 runs db runpatt
3280: 63 6f 75 6e 74 20 6f 66 66 73 65 74 20 6b 65 79 count offset key
3290: 70 61 74 74 73 29 0a 20 20 28 6c 65 74 2a 20 28 patts). (let* (
32a0: 28 72 65 73 20 20 20 20 20 20 27 28 29 29 0a 09 (res '())..
32b0: 20 28 6b 65 79 73 20 20 20 20 20 20 28 64 62 2d (keys (db-
32c0: 67 65 74 2d 6b 65 79 73 20 64 62 29 29 0a 09 20 get-keys db))..
32d0: 28 72 65 6d 66 69 65 6c 64 73 20 28 6c 69 73 74 (remfields (list
32e0: 20 22 69 64 22 20 22 72 75 6e 6e 61 6d 65 22 20 "id" "runname"
32f0: 22 73 74 61 74 65 22 20 22 73 74 61 74 75 73 22 "state" "status"
3300: 20 22 6f 77 6e 65 72 22 20 22 65 76 65 6e 74 5f "owner" "event_
3310: 74 69 6d 65 22 29 29 0a 09 20 28 68 65 61 64 65 time")).. (heade
3320: 72 20 20 20 20 28 61 70 70 65 6e 64 20 28 6d 61 r (append (ma
3330: 70 20 6b 65 79 3a 67 65 74 2d 66 69 65 6c 64 6e p key:get-fieldn
3340: 61 6d 65 20 6b 65 79 73 29 0a 09 09 09 20 20 20 ame keys)....
3350: 20 72 65 6d 66 69 65 6c 64 73 29 29 0a 09 20 28 remfields)).. (
3360: 6b 65 79 73 74 72 20 20 20 20 28 63 6f 6e 63 20 keystr (conc
3370: 28 6b 65 79 73 2d 3e 6b 65 79 73 74 72 20 6b 65 (keys->keystr ke
3380: 79 73 29 20 22 2c 22 0a 09 09 09 20 20 28 73 74 ys) ",".... (st
3390: 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 ring-intersperse
33a0: 20 72 65 6d 66 69 65 6c 64 73 20 22 2c 22 29 29 remfields ","))
33b0: 29 0a 09 20 28 71 72 79 73 74 72 20 20 20 20 28 ).. (qrystr (
33c0: 63 6f 6e 63 20 22 53 45 4c 45 43 54 20 22 20 6b conc "SELECT " k
33d0: 65 79 73 74 72 20 22 20 46 52 4f 4d 20 72 75 6e eystr " FROM run
33e0: 73 20 57 48 45 52 45 20 72 75 6e 6e 61 6d 65 20 s WHERE runname
33f0: 4c 49 4b 45 20 3f 20 22 0a 09 09 09 20 20 3b 3b LIKE ? ".... ;;
3400: 20 47 65 6e 65 72 61 74 65 3a 20 22 20 41 4e 44 Generate: " AND
3410: 20 78 20 4c 49 4b 45 20 27 6b 65 79 70 61 74 74 x LIKE 'keypatt
3420: 27 20 2e 2e 2e 22 0a 09 09 09 20 20 28 69 66 20 ' ...".... (if
3430: 28 6e 75 6c 6c 3f 20 6b 65 79 70 61 74 74 73 29 (null? keypatts)
3440: 20 22 22 0a 09 09 09 20 20 20 20 20 20 28 63 6f "".... (co
3450: 6e 63 20 22 20 41 4e 44 20 22 0a 09 09 09 09 20 nc " AND ".....
3460: 20 20 20 28 73 74 72 69 6e 67 2d 6a 6f 69 6e 20 (string-join
3470: 0a 09 09 09 09 20 20 20 20 20 28 6d 61 70 20 28 ..... (map (
3480: 6c 61 6d 62 64 61 20 28 6b 65 79 70 61 74 74 29 lambda (keypatt)
3490: 0a 09 09 09 09 09 20 20 20 20 28 6c 65 74 20 28 ...... (let (
34a0: 28 6b 65 79 20 20 28 63 61 72 20 6b 65 79 70 61 (key (car keypa
34b0: 74 74 29 29 0a 09 09 09 09 09 09 20 20 28 70 61 tt))....... (pa
34c0: 74 74 20 28 63 61 64 72 20 6b 65 79 70 61 74 74 tt (cadr keypatt
34d0: 29 29 29 0a 09 09 09 09 09 20 20 20 20 20 20 28 )))...... (
34e0: 63 6f 6e 63 20 6b 65 79 20 22 20 4c 49 4b 45 20 conc key " LIKE
34f0: 27 22 20 70 61 74 74 20 22 27 22 29 29 29 0a 09 '" patt "'")))..
3500: 09 09 09 09 20 20 6b 65 79 70 61 74 74 73 29 0a .... keypatts).
3510: 09 09 09 09 20 20 20 20 20 22 20 41 4e 44 20 22 .... " AND "
3520: 29 29 29 0a 09 09 09 20 20 22 20 4f 52 44 45 52 ))).... " ORDER
3530: 20 42 59 20 65 76 65 6e 74 5f 74 69 6d 65 20 44 BY event_time D
3540: 45 53 43 20 22 0a 09 09 09 20 20 28 69 66 20 28 ESC ".... (if (
3550: 6e 75 6d 62 65 72 3f 20 63 6f 75 6e 74 29 0a 09 number? count)..
3560: 09 09 20 20 20 20 20 20 28 63 6f 6e 63 20 22 20 .. (conc "
3570: 4c 49 4d 49 54 20 22 20 63 6f 75 6e 74 29 0a 09 LIMIT " count)..
3580: 09 09 20 20 20 20 20 20 22 22 29 0a 09 09 09 20 .. "")....
3590: 20 28 69 66 20 28 6e 75 6d 62 65 72 3f 20 6f 66 (if (number? of
35a0: 66 73 65 74 29 0a 09 09 09 20 20 20 20 20 20 28 fset).... (
35b0: 63 6f 6e 63 20 22 20 4f 46 46 53 45 54 20 22 20 conc " OFFSET "
35c0: 6f 66 66 73 65 74 29 0a 09 09 09 20 20 20 20 20 offset)....
35d0: 20 22 22 29 29 29 29 0a 20 20 20 20 28 64 65 62 "")))). (deb
35e0: 75 67 3a 70 72 69 6e 74 20 34 20 22 64 62 3a 67 ug:print 4 "db:g
35f0: 65 74 2d 72 75 6e 73 20 71 72 79 73 74 72 3a 20 et-runs qrystr:
3600: 22 20 71 72 79 73 74 72 20 22 5c 6e 6b 65 79 70 " qrystr "\nkeyp
3610: 61 74 74 73 3a 20 22 20 6b 65 79 70 61 74 74 73 atts: " keypatts
3620: 20 22 5c 6e 20 20 6f 66 66 73 65 74 3a 20 22 20 "\n offset: "
3630: 6f 66 66 73 65 74 20 22 20 6c 69 6d 69 74 3a 20 offset " limit:
3640: 22 20 63 6f 75 6e 74 29 0a 20 20 20 20 28 73 71 " count). (sq
3650: 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 lite3:for-each-r
3660: 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 ow. (lambda
3670: 28 61 20 2e 20 78 29 0a 20 20 20 20 20 20 20 28 (a . x). (
3680: 73 65 74 21 20 72 65 73 20 28 63 6f 6e 73 20 28 set! res (cons (
3690: 61 70 70 6c 79 20 76 65 63 74 6f 72 20 61 20 78 apply vector a x
36a0: 29 20 72 65 73 29 29 29 0a 20 20 20 20 20 64 62 ) res))). db
36b0: 0a 20 20 20 20 20 71 72 79 73 74 72 0a 20 20 20 . qrystr.
36c0: 20 20 72 75 6e 70 61 74 74 29 0a 20 20 20 20 28 runpatt). (
36d0: 76 65 63 74 6f 72 20 68 65 61 64 65 72 20 72 65 vector header re
36e0: 73 29 29 29 0a 0a 3b 3b 20 6a 75 73 74 20 67 65 s)))..;; just ge
36f0: 74 20 63 6f 75 6e 74 20 6f 66 20 72 75 6e 73 0a t count of runs.
3700: 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d (define (db:get-
3710: 6e 75 6d 2d 72 75 6e 73 20 64 62 20 72 75 6e 70 num-runs db runp
3720: 61 74 74 29 0a 20 20 28 6c 65 74 20 28 28 6e 75 att). (let ((nu
3730: 6d 72 75 6e 73 20 30 29 29 0a 20 20 20 20 28 73 mruns 0)). (s
3740: 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d qlite3:for-each-
3750: 72 6f 77 20 0a 20 20 20 20 20 28 6c 61 6d 62 64 row . (lambd
3760: 61 20 28 63 6f 75 6e 74 29 0a 20 20 20 20 20 20 a (count).
3770: 20 28 73 65 74 21 20 6e 75 6d 72 75 6e 73 20 63 (set! numruns c
3780: 6f 75 6e 74 29 29 0a 20 20 20 20 20 64 62 0a 20 ount)). db.
3790: 20 20 20 20 22 53 45 4c 45 43 54 20 43 4f 55 4e "SELECT COUN
37a0: 54 28 69 64 29 20 46 52 4f 4d 20 72 75 6e 73 20 T(id) FROM runs
37b0: 57 48 45 52 45 20 72 75 6e 6e 61 6d 65 20 4c 49 WHERE runname LI
37c0: 4b 45 20 3f 3b 22 20 72 75 6e 70 61 74 74 29 0a KE ?;" runpatt).
37d0: 20 20 20 20 6e 75 6d 72 75 6e 73 29 29 0a 0a 0a numruns))...
37e0: 3b 3b 20 75 73 65 20 28 67 65 74 2d 76 61 6c 75 ;; use (get-valu
37f0: 65 2d 62 79 2d 68 65 61 64 65 72 20 28 64 62 3a e-by-header (db:
3800: 67 65 74 2d 68 65 61 64 65 72 20 72 75 6e 69 6e get-header runin
3810: 66 6f 29 28 64 62 3a 67 65 74 2d 72 6f 77 20 72 fo)(db:get-row r
3820: 75 6e 69 6e 66 6f 29 29 0a 28 64 65 66 69 6e 65 uninfo)).(define
3830: 20 28 64 62 3a 67 65 74 2d 72 75 6e 2d 69 6e 66 (db:get-run-inf
3840: 6f 20 64 62 20 72 75 6e 2d 69 64 29 0a 20 20 28 o db run-id). (
3850: 6c 65 74 2a 20 28 28 72 65 73 20 20 20 20 20 20 let* ((res
3860: 23 66 29 0a 09 20 28 6b 65 79 73 20 20 20 20 20 #f).. (keys
3870: 20 28 64 62 2d 67 65 74 2d 6b 65 79 73 20 64 62 (db-get-keys db
3880: 29 29 0a 09 20 28 72 65 6d 66 69 65 6c 64 73 20 )).. (remfields
3890: 28 6c 69 73 74 20 22 69 64 22 20 22 72 75 6e 6e (list "id" "runn
38a0: 61 6d 65 22 20 22 73 74 61 74 65 22 20 22 73 74 ame" "state" "st
38b0: 61 74 75 73 22 20 22 6f 77 6e 65 72 22 20 22 65 atus" "owner" "e
38c0: 76 65 6e 74 5f 74 69 6d 65 22 29 29 0a 09 20 28 vent_time")).. (
38d0: 68 65 61 64 65 72 20 20 20 20 28 61 70 70 65 6e header (appen
38e0: 64 20 28 6d 61 70 20 6b 65 79 3a 67 65 74 2d 66 d (map key:get-f
38f0: 69 65 6c 64 6e 61 6d 65 20 6b 65 79 73 29 0a 09 ieldname keys)..
3900: 09 09 20 20 20 20 72 65 6d 66 69 65 6c 64 73 29 .. remfields)
3910: 29 0a 09 20 28 6b 65 79 73 74 72 20 20 20 20 28 ).. (keystr (
3920: 63 6f 6e 63 20 28 6b 65 79 73 2d 3e 6b 65 79 73 conc (keys->keys
3930: 74 72 20 6b 65 79 73 29 20 22 2c 22 0a 09 09 09 tr keys) ","....
3940: 20 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 (string-inters
3950: 70 65 72 73 65 20 72 65 6d 66 69 65 6c 64 73 20 perse remfields
3960: 22 2c 22 29 29 29 29 0a 20 20 20 20 3b 3b 20 28 ",")))). ;; (
3970: 64 65 62 75 67 3a 70 72 69 6e 74 20 30 20 22 64 debug:print 0 "d
3980: 62 3a 67 65 74 2d 72 75 6e 2d 69 6e 66 6f 20 72 b:get-run-info r
3990: 75 6e 2d 69 64 3a 20 22 20 72 75 6e 2d 69 64 20 un-id: " run-id
39a0: 22 20 68 65 61 64 65 72 3a 20 22 20 68 65 61 64 " header: " head
39b0: 65 72 20 22 20 6b 65 79 73 74 72 3a 20 22 20 6b er " keystr: " k
39c0: 65 79 73 74 72 29 0a 20 20 20 20 28 73 71 6c 69 eystr). (sqli
39d0: 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 te3:for-each-row
39e0: 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 61 . (lambda (a
39f0: 20 2e 20 78 29 0a 20 20 20 20 20 20 20 28 73 65 . x). (se
3a00: 74 21 20 72 65 73 20 28 61 70 70 6c 79 20 76 65 t! res (apply ve
3a10: 63 74 6f 72 20 61 20 78 29 29 29 0a 20 20 20 20 ctor a x))).
3a20: 20 64 62 0a 20 20 20 20 20 28 63 6f 6e 63 20 22 db. (conc "
3a30: 53 45 4c 45 43 54 20 22 20 6b 65 79 73 74 72 20 SELECT " keystr
3a40: 22 20 46 52 4f 4d 20 72 75 6e 73 20 57 48 45 52 " FROM runs WHER
3a50: 45 20 69 64 3d 3f 3b 22 29 0a 20 20 20 20 20 72 E id=?;"). r
3a60: 75 6e 2d 69 64 29 0a 20 20 20 20 28 76 65 63 74 un-id). (vect
3a70: 6f 72 20 68 65 61 64 65 72 20 72 65 73 29 29 29 or header res)))
3a80: 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 73 65 ..(define (db:se
3a90: 74 2d 63 6f 6d 6d 65 6e 74 2d 66 6f 72 2d 72 75 t-comment-for-ru
3aa0: 6e 20 64 62 20 72 75 6e 2d 69 64 20 63 6f 6d 6d n db run-id comm
3ab0: 65 6e 74 29 0a 20 20 28 73 71 6c 69 74 65 33 3a ent). (sqlite3:
3ac0: 65 78 65 63 75 74 65 20 64 62 20 22 55 50 44 41 execute db "UPDA
3ad0: 54 45 20 72 75 6e 73 20 53 45 54 20 63 6f 6d 6d TE runs SET comm
3ae0: 65 6e 74 3d 3f 20 57 48 45 52 45 20 69 64 3d 3f ent=? WHERE id=?
3af0: 3b 22 20 63 6f 6d 6d 65 6e 74 20 72 75 6e 2d 69 ;" comment run-i
3b00: 64 29 29 0a 0a 3b 3b 20 64 6f 65 73 20 6e 6f 74 d))..;; does not
3b10: 20 28 6f 62 76 69 6f 75 73 6c 79 21 29 20 72 65 (obviously!) re
3b20: 6d 6f 76 65 64 20 64 65 70 65 6e 64 65 6e 74 20 moved dependent
3b30: 64 61 74 61 2e 20 0a 28 64 65 66 69 6e 65 20 28 data. .(define (
3b40: 64 62 3a 64 65 6c 65 74 65 2d 72 75 6e 20 64 62 db:delete-run db
3b50: 20 72 75 6e 2d 69 64 29 0a 20 20 28 73 71 6c 69 run-id). (sqli
3b60: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 te3:execute db "
3b70: 44 45 4c 45 54 45 20 46 52 4f 4d 20 72 75 6e 73 DELETE FROM runs
3b80: 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 72 75 WHERE id=?;" ru
3b90: 6e 2d 69 64 29 29 0a 0a 28 64 65 66 69 6e 65 20 n-id))..(define
3ba0: 28 64 62 3a 75 70 64 61 74 65 2d 72 75 6e 2d 65 (db:update-run-e
3bb0: 76 65 6e 74 5f 74 69 6d 65 20 64 62 20 72 75 6e vent_time db run
3bc0: 2d 69 64 29 0a 20 20 28 73 71 6c 69 74 65 33 3a -id). (sqlite3:
3bd0: 65 78 65 63 75 74 65 20 64 62 20 22 55 50 44 41 execute db "UPDA
3be0: 54 45 20 72 75 6e 73 20 53 45 54 20 65 76 65 6e TE runs SET even
3bf0: 74 5f 74 69 6d 65 3d 73 74 72 66 74 69 6d 65 28 t_time=strftime(
3c00: 27 25 73 27 2c 27 6e 6f 77 27 29 20 57 48 45 52 '%s','now') WHER
3c10: 45 20 69 64 3d 3f 3b 22 20 72 75 6e 2d 69 64 29 E id=?;" run-id)
3c20: 29 20 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ) ..;;==========
3c30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3c40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3c50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3c60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 ============.;;
3c70: 20 54 20 45 20 53 20 54 20 53 0a 3b 3b 3d 3d 3d T E S T S.;;===
3c80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3c90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3ca0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3cb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
3cc0: 3d 3d 3d 0a 0a 3b 3b 20 73 74 61 74 65 73 20 61 ===..;; states a
3cd0: 6e 64 20 73 74 61 74 75 73 65 73 20 61 72 65 20 nd statuses are
3ce0: 6c 69 73 74 73 2c 20 74 75 72 6e 20 74 68 65 6d lists, turn them
3cf0: 20 69 6e 74 6f 20 28 22 50 41 53 53 22 2c 22 46 into ("PASS","F
3d00: 41 49 4c 22 2e 2e 2e 29 20 61 6e 64 20 75 73 65 AIL"...) and use
3d10: 20 4e 4f 54 20 49 4e 0a 3b 3b 20 69 2e 65 2e 20 NOT IN.;; i.e.
3d20: 74 68 65 73 65 20 6c 69 73 74 73 20 64 65 66 69 these lists defi
3d30: 6e 65 20 77 68 61 74 20 74 6f 20 4e 4f 54 20 73 ne what to NOT s
3d40: 68 6f 77 2e 0a 3b 3b 20 73 74 61 74 65 73 20 61 how..;; states a
3d50: 6e 64 20 73 74 61 74 75 73 65 73 20 61 72 65 20 nd statuses are
3d60: 72 65 71 75 69 72 65 64 20 74 6f 20 62 65 20 6c required to be l
3d70: 69 73 74 73 2c 20 65 6d 70 74 79 20 69 73 20 6f ists, empty is o
3d80: 6b 0a 28 64 65 66 69 6e 65 20 28 64 62 2d 67 65 k.(define (db-ge
3d90: 74 2d 74 65 73 74 73 2d 66 6f 72 2d 72 75 6e 20 t-tests-for-run
3da0: 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 70 61 db run-id testpa
3db0: 74 74 20 69 74 65 6d 70 61 74 74 20 73 74 61 74 tt itempatt stat
3dc0: 65 73 20 73 74 61 74 75 73 65 73 29 0a 20 20 28 es statuses). (
3dd0: 6c 65 74 20 28 28 72 65 73 20 27 28 29 29 0a 09 let ((res '())..
3de0: 28 73 74 61 74 65 73 2d 73 74 72 20 20 20 20 28 (states-str (
3df0: 63 6f 6e 63 20 22 28 27 22 20 28 73 74 72 69 6e conc "('" (strin
3e00: 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 73 74 g-intersperse st
3e10: 61 74 65 73 20 20 20 22 27 2c 27 22 29 20 22 27 ates "','") "'
3e20: 29 22 29 29 0a 09 28 73 74 61 74 75 73 65 73 2d )"))..(statuses-
3e30: 73 74 72 20 20 28 63 6f 6e 63 20 22 28 27 22 20 str (conc "('"
3e40: 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 (string-interspe
3e50: 72 73 65 20 73 74 61 74 75 73 65 73 20 22 27 2c rse statuses "',
3e60: 27 22 29 20 22 27 29 22 29 29 0a 09 29 0a 20 20 '") "')"))..).
3e70: 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 (sqlite3:for-e
3e80: 61 63 68 2d 72 6f 77 20 0a 20 20 20 20 20 28 6c ach-row . (l
3e90: 61 6d 62 64 61 20 28 69 64 20 72 75 6e 2d 69 64 ambda (id run-id
3ea0: 20 74 65 73 74 6e 61 6d 65 20 73 74 61 74 65 20 testname state
3eb0: 73 74 61 74 75 73 20 65 76 65 6e 74 2d 74 69 6d status event-tim
3ec0: 65 20 68 6f 73 74 20 63 70 75 6c 6f 61 64 20 64 e host cpuload d
3ed0: 69 73 6b 66 72 65 65 20 75 6e 61 6d 65 20 72 75 iskfree uname ru
3ee0: 6e 64 69 72 20 69 74 65 6d 2d 70 61 74 68 20 72 ndir item-path r
3ef0: 75 6e 2d 64 75 72 61 74 69 6f 6e 20 66 69 6e 61 un-duration fina
3f00: 6c 2d 6c 6f 67 66 20 63 6f 6d 6d 65 6e 74 29 0a l-logf comment).
3f10: 20 20 20 20 20 20 20 28 73 65 74 21 20 72 65 73 (set! res
3f20: 20 28 63 6f 6e 73 20 28 76 65 63 74 6f 72 20 69 (cons (vector i
3f30: 64 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d d run-id testnam
3f40: 65 20 73 74 61 74 65 20 73 74 61 74 75 73 20 65 e state status e
3f50: 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73 74 20 63 vent-time host c
3f60: 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20 puload diskfree
3f70: 75 6e 61 6d 65 20 72 75 6e 64 69 72 20 69 74 65 uname rundir ite
3f80: 6d 2d 70 61 74 68 20 72 75 6e 2d 64 75 72 61 74 m-path run-durat
3f90: 69 6f 6e 20 66 69 6e 61 6c 2d 6c 6f 67 66 20 63 ion final-logf c
3fa0: 6f 6d 6d 65 6e 74 29 20 72 65 73 29 29 29 0a 20 omment) res))).
3fb0: 20 20 20 20 64 62 20 0a 20 20 20 20 20 28 63 6f db . (co
3fc0: 6e 63 20 22 53 45 4c 45 43 54 20 69 64 2c 72 75 nc "SELECT id,ru
3fd0: 6e 5f 69 64 2c 74 65 73 74 6e 61 6d 65 2c 73 74 n_id,testname,st
3fe0: 61 74 65 2c 73 74 61 74 75 73 2c 65 76 65 6e 74 ate,status,event
3ff0: 5f 74 69 6d 65 2c 68 6f 73 74 2c 63 70 75 6c 6f _time,host,cpulo
4000: 61 64 2c 64 69 73 6b 66 72 65 65 2c 75 6e 61 6d ad,diskfree,unam
4010: 65 2c 72 75 6e 64 69 72 2c 69 74 65 6d 5f 70 61 e,rundir,item_pa
4020: 74 68 2c 72 75 6e 5f 64 75 72 61 74 69 6f 6e 2c th,run_duration,
4030: 66 69 6e 61 6c 5f 6c 6f 67 66 2c 63 6f 6d 6d 65 final_logf,comme
4040: 6e 74 20 22 0a 09 20 20 20 22 20 46 52 4f 4d 20 nt ".. " FROM
4050: 74 65 73 74 73 20 57 48 45 52 45 20 72 75 6e 5f tests WHERE run_
4060: 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d id=? AND testnam
4070: 65 20 6c 69 6b 65 20 3f 20 41 4e 44 20 69 74 65 e like ? AND ite
4080: 6d 5f 70 61 74 68 20 4c 49 4b 45 20 3f 20 22 20 m_path LIKE ? "
4090: 0a 09 20 20 20 22 20 41 4e 44 20 4e 4f 54 20 28 .. " AND NOT (
40a0: 73 74 61 74 65 20 69 6e 20 22 20 73 74 61 74 65 state in " state
40b0: 73 2d 73 74 72 20 22 20 41 4e 44 20 73 74 61 74 s-str " AND stat
40c0: 75 73 20 49 4e 20 22 20 73 74 61 74 75 73 65 73 us IN " statuses
40d0: 2d 73 74 72 20 22 29 20 22 0a 09 20 20 20 3b 3b -str ") ".. ;;
40e0: 20 22 20 4f 52 44 45 52 20 42 59 20 69 64 20 44 " ORDER BY id D
40f0: 45 53 43 3b 22 0a 09 20 20 20 22 20 4f 52 44 45 ESC;".. " ORDE
4100: 52 20 42 59 20 65 76 65 6e 74 5f 74 69 6d 65 20 R BY event_time
4110: 41 53 43 3b 22 20 3b 3b 20 50 4f 54 45 4e 54 49 ASC;" ;; POTENTI
4120: 41 4c 20 49 53 53 55 45 21 20 43 48 45 43 4b 20 AL ISSUE! CHECK
4130: 4d 45 21 20 44 6f 65 73 20 61 6e 79 74 69 6e 67 ME! Does anyting
4140: 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 69 73 20 depend on this
4150: 62 65 69 6e 67 20 73 6f 72 74 65 64 20 62 79 20 being sorted by
4160: 69 64 3f 0a 09 20 20 20 29 0a 20 20 20 20 20 72 id?.. ). r
4170: 75 6e 2d 69 64 0a 20 20 20 20 20 28 69 66 20 74 un-id. (if t
4180: 65 73 74 70 61 74 74 20 74 65 73 74 70 61 74 74 estpatt testpatt
4190: 20 22 25 22 29 0a 20 20 20 20 20 28 69 66 20 69 "%"). (if i
41a0: 74 65 6d 70 61 74 74 20 69 74 65 6d 70 61 74 74 tempatt itempatt
41b0: 20 22 25 22 29 29 0a 20 20 20 20 72 65 73 29 29 "%")). res))
41c0: 0a 0a 3b 3b 20 74 68 69 73 20 6f 6e 65 20 69 73 ..;; this one is
41d0: 20 61 20 62 69 74 20 62 72 6f 6b 65 6e 20 42 55 a bit broken BU
41e0: 47 20 46 49 58 4d 45 0a 28 64 65 66 69 6e 65 20 G FIXME.(define
41f0: 28 64 62 3a 64 65 6c 65 74 65 2d 74 65 73 74 2d (db:delete-test-
4200: 73 74 65 70 2d 72 65 63 6f 72 64 73 20 64 62 20 step-records db
4210: 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 run-id test-name
4220: 20 69 74 65 6d 64 61 74 29 0a 20 20 28 73 71 6c itemdat). (sql
4230: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 ite3:execute db
4240: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 65 73 "DELETE FROM tes
4250: 74 5f 73 74 65 70 73 20 57 48 45 52 45 20 74 65 t_steps WHERE te
4260: 73 74 5f 69 64 20 69 6e 20 28 53 45 4c 45 43 54 st_id in (SELECT
4270: 20 69 64 20 46 52 4f 4d 20 74 65 73 74 73 20 57 id FROM tests W
4280: 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e HERE run_id=? AN
4290: 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 D testname=? AND
42a0: 20 69 74 65 6d 5f 70 61 74 68 3d 3f 29 3b 22 20 item_path=?);"
42b0: 0a 09 09 20 20 20 72 75 6e 2d 69 64 20 74 65 73 ... run-id tes
42c0: 74 2d 6e 61 6d 65 20 28 69 74 65 6d 2d 6c 69 73 t-name (item-lis
42d0: 74 2d 3e 70 61 74 68 20 69 74 65 6d 64 61 74 29 t->path itemdat)
42e0: 29 29 0a 3b 3b 20 0a 28 64 65 66 69 6e 65 20 28 )).;; .(define (
42f0: 64 62 3a 64 65 6c 65 74 65 2d 74 65 73 74 2d 72 db:delete-test-r
4300: 65 63 6f 72 64 73 20 64 62 20 74 65 73 74 2d 69 ecords db test-i
4310: 64 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 d). (sqlite3:ex
4320: 65 63 75 74 65 20 64 62 20 22 44 45 4c 45 54 45 ecute db "DELETE
4330: 20 46 52 4f 4d 20 74 65 73 74 5f 73 74 65 70 73 FROM test_steps
4340: 20 57 48 45 52 45 20 74 65 73 74 5f 69 64 3d 3f WHERE test_id=?
4350: 3b 22 20 74 65 73 74 2d 69 64 29 0a 20 20 28 73 ;" test-id). (s
4360: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 qlite3:execute d
4370: 62 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 b "DELETE FROM t
4380: 65 73 74 5f 64 61 74 61 20 20 57 48 45 52 45 20 est_data WHERE
4390: 74 65 73 74 5f 69 64 3d 3f 3b 22 20 74 65 73 74 test_id=?;" test
43a0: 2d 69 64 29 0a 20 20 28 73 71 6c 69 74 65 33 3a -id). (sqlite3:
43b0: 65 78 65 63 75 74 65 20 64 62 20 22 44 45 4c 45 execute db "DELE
43c0: 54 45 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 TE FROM tests WH
43d0: 45 52 45 20 69 64 3d 3f 3b 22 20 74 65 73 74 2d ERE id=?;" test-
43e0: 69 64 29 29 0a 0a 3b 3b 20 73 65 74 20 74 65 73 id))..;; set tes
43f0: 74 73 20 77 69 74 68 20 73 74 61 74 65 20 63 75 ts with state cu
4400: 72 72 73 74 61 74 65 20 61 6e 64 20 73 74 61 74 rrstate and stat
4410: 75 73 20 63 75 72 72 73 74 61 74 75 73 20 74 6f us currstatus to
4420: 20 6e 65 77 73 74 61 74 65 20 61 6e 64 20 6e 65 newstate and ne
4430: 77 73 74 61 74 75 73 0a 3b 3b 20 75 73 65 20 63 wstatus.;; use c
4440: 75 72 72 73 74 61 74 65 20 3d 20 23 66 20 61 6e urrstate = #f an
4450: 64 20 6f 72 20 63 75 72 72 73 74 61 74 75 73 20 d or currstatus
4460: 3d 20 23 66 20 74 6f 20 61 70 70 6c 79 20 74 6f = #f to apply to
4470: 20 61 6e 79 20 73 74 61 74 65 20 6f 72 20 73 74 any state or st
4480: 61 74 75 73 20 72 65 73 70 65 63 74 69 76 65 6c atus respectivel
4490: 79 0a 3b 3b 20 57 41 52 4e 49 4e 47 3a 20 53 51 y.;; WARNING: SQ
44a0: 4c 20 69 6e 6a 65 63 74 69 6f 6e 20 72 69 73 6b L injection risk
44b0: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 73 65 74 .(define (db:set
44c0: 2d 74 65 73 74 73 2d 73 74 61 74 65 2d 73 74 61 -tests-state-sta
44d0: 74 75 73 20 64 62 20 72 75 6e 2d 69 64 20 74 65 tus db run-id te
44e0: 73 74 6e 61 6d 65 73 20 63 75 72 72 73 74 61 74 stnames currstat
44f0: 65 20 63 75 72 72 73 74 61 74 75 73 20 6e 65 77 e currstatus new
4500: 73 74 61 74 65 20 6e 65 77 73 74 61 74 75 73 29 state newstatus)
4510: 0a 20 20 28 66 6f 72 2d 65 61 63 68 20 28 6c 61 . (for-each (la
4520: 6d 62 64 61 20 28 74 65 73 74 6e 61 6d 65 29 0a mbda (testname).
4530: 09 20 20 20 20 20 20 28 6c 65 74 20 28 28 71 72 . (let ((qr
4540: 79 20 28 63 6f 6e 63 20 22 55 50 44 41 54 45 20 y (conc "UPDATE
4550: 74 65 73 74 73 20 53 45 54 20 73 74 61 74 65 3d tests SET state=
4560: 3f 2c 73 74 61 74 75 73 3d 3f 20 57 48 45 52 45 ?,status=? WHERE
4570: 20 22 0a 09 09 09 09 09 28 69 66 20 63 75 72 72 "......(if curr
4580: 73 74 61 74 65 20 20 28 63 6f 6e 63 20 22 73 74 state (conc "st
4590: 61 74 65 3d 27 22 20 63 75 72 72 73 74 61 74 65 ate='" currstate
45a0: 20 22 27 20 41 4e 44 20 22 29 20 22 22 29 0a 09 "' AND ") "")..
45b0: 09 09 09 09 28 69 66 20 63 75 72 72 73 74 61 74 ....(if currstat
45c0: 75 73 20 28 63 6f 6e 63 20 22 73 74 61 74 75 73 us (conc "status
45d0: 3d 27 22 20 63 75 72 72 73 74 61 74 75 73 20 22 ='" currstatus "
45e0: 27 20 41 4e 44 20 22 29 20 22 22 29 0a 09 09 09 ' AND ") "")....
45f0: 09 09 22 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 .." run_id=? AND
4600: 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 testname=? AND
4610: 4e 4f 54 20 28 69 74 65 6d 5f 70 61 74 68 3d 27 NOT (item_path='
4620: 27 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 20 69 ' AND testname i
4630: 6e 20 28 53 45 4c 45 43 54 20 44 49 53 54 49 4e n (SELECT DISTIN
4640: 43 54 20 74 65 73 74 6e 61 6d 65 20 46 52 4f 4d CT testname FROM
4650: 20 74 65 73 74 73 20 57 48 45 52 45 20 74 65 73 tests WHERE tes
4660: 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d tname=? AND item
4670: 5f 70 61 74 68 20 21 3d 20 27 27 29 29 3b 22 29 _path != ''));")
4680: 29 29 0a 09 09 3b 3b 28 64 65 62 75 67 3a 70 72 ))...;;(debug:pr
4690: 69 6e 74 20 30 20 22 51 52 59 3a 20 22 20 71 72 int 0 "QRY: " qr
46a0: 79 29 0a 09 09 28 73 71 6c 69 74 65 33 3a 65 78 y)...(sqlite3:ex
46b0: 65 63 75 74 65 20 64 62 20 71 72 79 20 72 75 6e ecute db qry run
46c0: 2d 69 64 20 6e 65 77 73 74 61 74 65 20 6e 65 77 -id newstate new
46d0: 73 74 61 74 75 73 20 74 65 73 74 6e 61 6d 65 20 status testname
46e0: 74 65 73 74 6e 61 6d 65 29 29 29 0a 09 20 20 20 testname)))..
46f0: 20 74 65 73 74 6e 61 6d 65 73 29 29 0a 0a 28 64 testnames))..(d
4700: 65 66 69 6e 65 20 28 64 62 3a 64 65 6c 65 74 65 efine (db:delete
4710: 2d 74 65 73 74 73 2d 69 6e 2d 73 74 61 74 65 20 -tests-in-state
4720: 64 62 20 72 75 6e 2d 69 64 20 73 74 61 74 65 29 db run-id state)
4730: 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 . (sqlite3:exec
4740: 75 74 65 20 64 62 20 22 44 45 4c 45 54 45 20 46 ute db "DELETE F
4750: 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 ROM tests WHERE
4760: 73 74 61 74 65 3d 3f 20 41 4e 44 20 72 75 6e 5f state=? AND run_
4770: 69 64 3d 3f 3b 22 20 73 74 61 74 65 20 72 75 6e id=?;" state run
4780: 2d 69 64 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 -id))..(define (
4790: 64 62 3a 74 65 73 74 2d 73 65 74 2d 73 74 61 74 db:test-set-stat
47a0: 65 2d 73 74 61 74 75 73 2d 62 79 2d 69 64 20 64 e-status-by-id d
47b0: 62 20 74 65 73 74 2d 69 64 20 6e 65 77 73 74 61 b test-id newsta
47c0: 74 65 20 6e 65 77 73 74 61 74 75 73 20 6e 65 77 te newstatus new
47d0: 63 6f 6d 6d 65 6e 74 29 0a 20 20 28 69 66 20 6e comment). (if n
47e0: 65 77 73 74 61 74 65 20 20 20 28 73 71 6c 69 74 ewstate (sqlit
47f0: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 55 e3:execute db "U
4800: 50 44 41 54 45 20 74 65 73 74 73 20 53 45 54 20 PDATE tests SET
4810: 73 74 61 74 65 3d 3f 20 20 20 57 48 45 52 45 20 state=? WHERE
4820: 69 64 3d 3f 3b 22 20 6e 65 77 73 74 61 74 65 20 id=?;" newstate
4830: 20 20 74 65 73 74 2d 69 64 29 29 0a 20 20 28 69 test-id)). (i
4840: 66 20 6e 65 77 73 74 61 74 75 73 20 20 28 73 71 f newstatus (sq
4850: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 lite3:execute db
4860: 20 22 55 50 44 41 54 45 20 74 65 73 74 73 20 53 "UPDATE tests S
4870: 45 54 20 73 74 61 74 75 73 3d 3f 20 20 57 48 45 ET status=? WHE
4880: 52 45 20 69 64 3d 3f 3b 22 20 6e 65 77 73 74 61 RE id=?;" newsta
4890: 74 75 73 20 20 74 65 73 74 2d 69 64 29 29 0a 20 tus test-id)).
48a0: 20 28 69 66 20 6e 65 77 63 6f 6d 6d 65 6e 74 20 (if newcomment
48b0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 (sqlite3:execute
48c0: 20 64 62 20 22 55 50 44 41 54 45 20 74 65 73 74 db "UPDATE test
48d0: 73 20 53 45 54 20 63 6f 6d 6d 65 6e 74 3d 3f 20 s SET comment=?
48e0: 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 6e 65 77 WHERE id=?;" new
48f0: 63 6f 6d 6d 65 6e 74 20 74 65 73 74 2d 69 64 29 comment test-id)
4900: 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a ))..(define (db:
4910: 67 65 74 2d 63 6f 75 6e 74 2d 74 65 73 74 73 2d get-count-tests-
4920: 72 75 6e 6e 69 6e 67 20 64 62 29 0a 20 20 28 6c running db). (l
4930: 65 74 20 28 28 72 65 73 20 30 29 29 0a 20 20 20 et ((res 0)).
4940: 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 (sqlite3:for-ea
4950: 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d ch-row. (lam
4960: 62 64 61 20 28 63 6f 75 6e 74 29 0a 20 20 20 20 bda (count).
4970: 20 20 20 28 73 65 74 21 20 72 65 73 20 63 6f 75 (set! res cou
4980: 6e 74 29 29 0a 20 20 20 20 20 64 62 0a 20 20 20 nt)). db.
4990: 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 "SELECT count(
49a0: 69 64 29 20 46 52 4f 4d 20 74 65 73 74 73 20 57 id) FROM tests W
49b0: 48 45 52 45 20 73 74 61 74 65 20 3d 20 27 52 55 HERE state = 'RU
49c0: 4e 4e 49 4e 47 27 20 4f 52 20 73 74 61 74 65 20 NNING' OR state
49d0: 3d 20 27 4c 41 55 4e 43 48 45 44 27 20 4f 52 20 = 'LAUNCHED' OR
49e0: 73 74 61 74 65 20 3d 20 27 52 45 4d 4f 54 45 48 state = 'REMOTEH
49f0: 4f 53 54 53 54 41 52 54 27 3b 22 29 0a 20 20 20 OSTSTART';").
4a00: 20 72 65 73 29 29 0a 0a 3b 3b 20 64 6f 6e 65 20 res))..;; done
4a10: 77 69 74 68 20 72 75 6e 20 77 68 65 6e 3a 0a 3b with run when:.;
4a20: 3b 20 20 20 30 20 74 65 73 74 73 20 69 6e 20 4c ; 0 tests in L
4a30: 41 55 4e 43 48 45 44 2c 20 4e 4f 54 5f 53 54 41 AUNCHED, NOT_STA
4a40: 52 54 45 44 2c 20 52 45 4d 4f 54 45 48 4f 53 54 RTED, REMOTEHOST
4a50: 53 54 41 52 54 2c 20 52 55 4e 4e 49 4e 47 0a 28 START, RUNNING.(
4a60: 64 65 66 69 6e 65 20 28 64 62 3a 65 73 74 69 6d define (db:estim
4a70: 61 74 65 64 2d 74 65 73 74 73 2d 72 65 6d 61 69 ated-tests-remai
4a80: 6e 69 6e 67 20 64 62 20 72 75 6e 2d 69 64 29 0a ning db run-id).
4a90: 20 20 28 6c 65 74 20 28 28 72 65 73 20 30 29 29 (let ((res 0))
4aa0: 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f . (sqlite3:fo
4ab0: 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 r-each-row.
4ac0: 28 6c 61 6d 62 64 61 20 28 63 6f 75 6e 74 29 0a (lambda (count).
4ad0: 20 20 20 20 20 20 20 28 73 65 74 21 20 72 65 73 (set! res
4ae0: 20 63 6f 75 6e 74 29 29 0a 20 20 20 20 20 64 62 count)). db
4af0: 20 3b 3b 20 4e 42 2f 2f 20 4b 49 4c 4c 52 45 51 ;; NB// KILLREQ
4b00: 20 6d 65 61 6e 73 20 74 68 65 20 6a 6f 62 73 20 means the jobs
4b10: 69 73 20 73 74 69 6c 6c 20 70 72 6f 62 61 62 6c is still probabl
4b20: 79 20 72 75 6e 6e 69 6e 67 0a 20 20 20 20 20 22 y running. "
4b30: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 69 64 29 SELECT count(id)
4b40: 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 FROM tests WHER
4b50: 45 20 73 74 61 74 65 20 69 6e 20 28 27 4c 41 55 E state in ('LAU
4b60: 4e 43 48 45 44 27 2c 27 4e 4f 54 5f 53 54 41 52 NCHED','NOT_STAR
4b70: 54 45 44 27 2c 27 52 45 4d 4f 54 45 48 4f 53 54 TED','REMOTEHOST
4b80: 53 54 41 52 54 27 2c 27 52 55 4e 4e 49 4e 47 27 START','RUNNING'
4b90: 2c 27 4b 49 4c 4c 52 45 51 27 29 20 41 4e 44 20 ,'KILLREQ') AND
4ba0: 72 75 6e 5f 69 64 3d 3f 3b 22 20 72 75 6e 2d 69 run_id=?;" run-i
4bb0: 64 29 0a 20 20 20 20 72 65 73 29 29 0a 0a 3b 3b d). res))..;;
4bc0: 20 4e 42 2f 2f 20 53 79 6e 63 20 74 68 69 73 20 NB// Sync this
4bd0: 77 69 74 68 20 72 75 6e 73 3a 67 65 74 2d 74 65 with runs:get-te
4be0: 73 74 2d 69 6e 66 6f 0a 28 64 65 66 69 6e 65 20 st-info.(define
4bf0: 28 64 62 3a 67 65 74 2d 74 65 73 74 2d 69 6e 66 (db:get-test-inf
4c00: 6f 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 o db run-id test
4c10: 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 0a name item-path).
4c20: 20 20 28 6c 65 74 20 28 28 72 65 73 20 23 66 29 (let ((res #f)
4c30: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 ). (sqlite3:f
4c40: 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 or-each-row.
4c50: 20 28 6c 61 6d 62 64 61 20 28 69 64 20 72 75 6e (lambda (id run
4c60: 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 73 74 61 -id testname sta
4c70: 74 65 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d te status event-
4c80: 74 69 6d 65 20 68 6f 73 74 20 63 70 75 6c 6f 61 time host cpuloa
4c90: 64 20 64 69 73 6b 66 72 65 65 20 75 6e 61 6d 65 d diskfree uname
4ca0: 20 72 75 6e 64 69 72 20 69 74 65 6d 2d 70 61 74 rundir item-pat
4cb0: 68 20 72 75 6e 5f 64 75 72 61 74 69 6f 6e 20 66 h run_duration f
4cc0: 69 6e 61 6c 5f 6c 6f 67 66 20 63 6f 6d 6d 65 6e inal_logf commen
4cd0: 74 20 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 t ). (set!
4ce0: 20 72 65 73 20 28 76 65 63 74 6f 72 20 69 64 20 res (vector id
4cf0: 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 run-id testname
4d00: 73 74 61 74 65 20 73 74 61 74 75 73 20 65 76 65 state status eve
4d10: 6e 74 2d 74 69 6d 65 20 68 6f 73 74 20 63 70 75 nt-time host cpu
4d20: 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20 75 6e load diskfree un
4d30: 61 6d 65 20 72 75 6e 64 69 72 20 69 74 65 6d 2d ame rundir item-
4d40: 70 61 74 68 20 72 75 6e 5f 64 75 72 61 74 69 6f path run_duratio
4d50: 6e 20 66 69 6e 61 6c 5f 6c 6f 67 66 20 63 6f 6d n final_logf com
4d60: 6d 65 6e 74 20 29 29 29 0a 20 20 20 20 20 64 62 ment ))). db
4d70: 20 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20 69 . "SELECT i
4d80: 64 2c 72 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d d,run_id,testnam
4d90: 65 2c 73 74 61 74 65 2c 73 74 61 74 75 73 2c 65 e,state,status,e
4da0: 76 65 6e 74 5f 74 69 6d 65 2c 68 6f 73 74 2c 63 vent_time,host,c
4db0: 70 75 6c 6f 61 64 2c 64 69 73 6b 66 72 65 65 2c puload,diskfree,
4dc0: 75 6e 61 6d 65 2c 72 75 6e 64 69 72 2c 69 74 65 uname,rundir,ite
4dd0: 6d 5f 70 61 74 68 2c 72 75 6e 5f 64 75 72 61 74 m_path,run_durat
4de0: 69 6f 6e 2c 66 69 6e 61 6c 5f 6c 6f 67 66 2c 63 ion,final_logf,c
4df0: 6f 6d 6d 65 6e 74 20 46 52 4f 4d 20 74 65 73 74 omment FROM test
4e00: 73 20 57 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f s WHERE run_id=?
4e10: 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20 AND testname=?
4e20: 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 3d 3f 3b AND item_path=?;
4e30: 22 0a 20 20 20 20 20 72 75 6e 2d 69 64 20 74 65 ". run-id te
4e40: 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 stname item-path
4e50: 29 0a 20 20 20 20 72 65 73 29 29 0a 0a 3b 3b 20 ). res))..;;
4e60: 47 65 74 20 74 65 73 74 20 64 61 74 61 20 75 73 Get test data us
4e70: 69 6e 67 20 74 65 73 74 5f 69 64 0a 28 64 65 66 ing test_id.(def
4e80: 69 6e 65 20 28 64 62 3a 67 65 74 2d 74 65 73 74 ine (db:get-test
4e90: 2d 64 61 74 61 2d 62 79 2d 69 64 20 64 62 20 74 -data-by-id db t
4ea0: 65 73 74 2d 69 64 29 0a 20 20 28 6c 65 74 20 28 est-id). (let (
4eb0: 28 72 65 73 20 23 66 29 29 0a 20 20 20 20 28 73 (res #f)). (s
4ec0: 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d qlite3:for-each-
4ed0: 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 row. (lambda
4ee0: 20 28 69 64 20 72 75 6e 2d 69 64 20 74 65 73 74 (id run-id test
4ef0: 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61 74 75 name state statu
4f00: 73 20 65 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73 s event-time hos
4f10: 74 20 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 t cpuload diskfr
4f20: 65 65 20 75 6e 61 6d 65 20 72 75 6e 64 69 72 20 ee uname rundir
4f30: 69 74 65 6d 2d 70 61 74 68 20 72 75 6e 5f 64 75 item-path run_du
4f40: 72 61 74 69 6f 6e 20 66 69 6e 61 6c 5f 6c 6f 67 ration final_log
4f50: 66 20 63 6f 6d 6d 65 6e 74 29 0a 20 20 20 20 20 f comment).
4f60: 20 20 28 73 65 74 21 20 72 65 73 20 28 76 65 63 (set! res (vec
4f70: 74 6f 72 20 69 64 20 72 75 6e 2d 69 64 20 74 65 tor id run-id te
4f80: 73 74 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61 stname state sta
4f90: 74 75 73 20 65 76 65 6e 74 2d 74 69 6d 65 20 68 tus event-time h
4fa0: 6f 73 74 20 63 70 75 6c 6f 61 64 20 64 69 73 6b ost cpuload disk
4fb0: 66 72 65 65 20 75 6e 61 6d 65 20 72 75 6e 64 69 free uname rundi
4fc0: 72 20 69 74 65 6d 2d 70 61 74 68 20 72 75 6e 5f r item-path run_
4fd0: 64 75 72 61 74 69 6f 6e 20 66 69 6e 61 6c 5f 6c duration final_l
4fe0: 6f 67 66 20 63 6f 6d 6d 65 6e 74 29 29 29 0a 20 ogf comment))).
4ff0: 20 20 20 20 64 62 20 0a 20 20 20 20 20 22 53 45 db . "SE
5000: 4c 45 43 54 20 69 64 2c 72 75 6e 5f 69 64 2c 74 LECT id,run_id,t
5010: 65 73 74 6e 61 6d 65 2c 73 74 61 74 65 2c 73 74 estname,state,st
5020: 61 74 75 73 2c 65 76 65 6e 74 5f 74 69 6d 65 2c atus,event_time,
5030: 68 6f 73 74 2c 63 70 75 6c 6f 61 64 2c 64 69 73 host,cpuload,dis
5040: 6b 66 72 65 65 2c 75 6e 61 6d 65 2c 72 75 6e 64 kfree,uname,rund
5050: 69 72 2c 69 74 65 6d 5f 70 61 74 68 2c 72 75 6e ir,item_path,run
5060: 5f 64 75 72 61 74 69 6f 6e 2c 66 69 6e 61 6c 5f _duration,final_
5070: 6c 6f 67 66 2c 63 6f 6d 6d 65 6e 74 20 46 52 4f logf,comment FRO
5080: 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 69 64 M tests WHERE id
5090: 3d 3f 3b 22 0a 20 20 20 20 20 74 65 73 74 2d 69 =?;". test-i
50a0: 64 29 0a 20 20 20 20 72 65 73 29 29 0a 0a 0a 28 d). res))...(
50b0: 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74 2d define (db:test-
50c0: 73 65 74 2d 63 6f 6d 6d 65 6e 74 20 64 62 20 72 set-comment db r
50d0: 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 69 un-id testname i
50e0: 74 65 6d 2d 70 61 74 68 20 63 6f 6d 6d 65 6e 74 tem-path comment
50f0: 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 ). (sqlite3:exe
5100: 63 75 74 65 20 0a 20 20 20 64 62 20 0a 20 20 20 cute . db .
5110: 22 55 50 44 41 54 45 20 74 65 73 74 73 20 53 45 "UPDATE tests SE
5120: 54 20 63 6f 6d 6d 65 6e 74 3d 3f 20 57 48 45 52 T comment=? WHER
5130: 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 E run_id=? AND t
5140: 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 estname=? AND it
5150: 65 6d 5f 70 61 74 68 3d 3f 3b 22 0a 20 20 20 20 em_path=?;".
5160: 20 63 6f 6d 6d 65 6e 74 20 72 75 6e 2d 69 64 20 comment run-id
5170: 74 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61 testname item-pa
5180: 74 68 29 29 0a 0a 3b 3b 0a 28 64 65 66 69 6e 65 th))..;;.(define
5190: 20 28 64 62 3a 74 65 73 74 2d 73 65 74 2d 72 75 (db:test-set-ru
51a0: 6e 64 69 72 21 20 64 62 20 72 75 6e 2d 69 64 20 ndir! db run-id
51b0: 74 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61 testname item-pa
51c0: 74 68 20 72 75 6e 64 69 72 29 0a 20 20 28 73 71 th rundir). (sq
51d0: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 0a 20 lite3:execute .
51e0: 20 20 64 62 20 0a 20 20 20 22 55 50 44 41 54 45 db . "UPDATE
51f0: 20 74 65 73 74 73 20 53 45 54 20 72 75 6e 64 69 tests SET rundi
5200: 72 3d 3f 20 57 48 45 52 45 20 72 75 6e 5f 69 64 r=? WHERE run_id
5210: 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d =? AND testname=
5220: 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 3d ? AND item_path=
5230: 3f 3b 22 0a 20 20 20 20 20 72 75 6e 64 69 72 20 ?;". rundir
5240: 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 run-id testname
5250: 69 74 65 6d 2d 70 61 74 68 29 29 0a 0a 3b 3b 3d item-path))..;;=
5260: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5270: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5280: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5290: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
52a0: 3d 3d 3d 3d 3d 0a 3b 3b 20 54 65 73 74 73 20 6d =====.;; Tests m
52b0: 65 74 61 20 64 61 74 61 0a 3b 3b 3d 3d 3d 3d 3d eta data.;;=====
52c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
52d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
52e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
52f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5300: 3d 0a 0a 3b 3b 20 72 65 61 64 20 74 68 65 20 72 =..;; read the r
5310: 65 63 6f 72 64 20 67 69 76 65 6e 20 61 20 74 65 ecord given a te
5320: 73 74 6e 61 6d 65 0a 28 64 65 66 69 6e 65 20 28 stname.(define (
5330: 64 62 3a 74 65 73 74 6d 65 74 61 2d 67 65 74 2d db:testmeta-get-
5340: 72 65 63 6f 72 64 20 64 62 20 74 65 73 74 6e 61 record db testna
5350: 6d 65 29 0a 20 20 28 6c 65 74 20 28 28 72 65 73 me). (let ((res
5360: 20 23 66 29 29 0a 20 20 20 20 28 73 71 6c 69 74 #f)). (sqlit
5370: 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a e3:for-each-row.
5380: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 69 64 (lambda (id
5390: 20 74 65 73 74 6e 61 6d 65 20 61 75 74 68 6f 72 testname author
53a0: 20 6f 77 6e 65 72 20 64 65 73 63 72 69 70 74 69 owner descripti
53b0: 6f 6e 20 72 65 76 69 65 77 65 64 20 69 74 65 72 on reviewed iter
53c0: 61 74 65 64 20 61 76 67 5f 72 75 6e 74 69 6d 65 ated avg_runtime
53d0: 20 61 76 67 5f 64 69 73 6b 20 74 61 67 73 29 0a avg_disk tags).
53e0: 20 20 20 20 20 20 20 28 73 65 74 21 20 72 65 73 (set! res
53f0: 20 28 76 65 63 74 6f 72 20 69 64 20 74 65 73 74 (vector id test
5400: 6e 61 6d 65 20 61 75 74 68 6f 72 20 6f 77 6e 65 name author owne
5410: 72 20 64 65 73 63 72 69 70 74 69 6f 6e 20 72 65 r description re
5420: 76 69 65 77 65 64 20 69 74 65 72 61 74 65 64 20 viewed iterated
5430: 61 76 67 5f 72 75 6e 74 69 6d 65 20 61 76 67 5f avg_runtime avg_
5440: 64 69 73 6b 20 74 61 67 73 29 29 29 0a 20 20 20 disk tags))).
5450: 20 20 64 62 20 22 53 45 4c 45 43 54 20 69 64 2c db "SELECT id,
5460: 74 65 73 74 6e 61 6d 65 2c 61 75 74 68 6f 72 2c testname,author,
5470: 6f 77 6e 65 72 2c 64 65 73 63 72 69 70 74 69 6f owner,descriptio
5480: 6e 2c 72 65 76 69 65 77 65 64 2c 69 74 65 72 61 n,reviewed,itera
5490: 74 65 64 2c 61 76 67 5f 72 75 6e 74 69 6d 65 2c ted,avg_runtime,
54a0: 61 76 67 5f 64 69 73 6b 2c 74 61 67 73 20 46 52 avg_disk,tags FR
54b0: 4f 4d 20 74 65 73 74 5f 6d 65 74 61 20 57 48 45 OM test_meta WHE
54c0: 52 45 20 74 65 73 74 6e 61 6d 65 3d 3f 3b 22 0a RE testname=?;".
54d0: 20 20 20 20 20 74 65 73 74 6e 61 6d 65 29 0a 20 testname).
54e0: 20 20 20 72 65 73 29 29 0a 0a 3b 3b 20 63 72 65 res))..;; cre
54f0: 61 74 65 20 61 20 6e 65 77 20 72 65 63 6f 72 64 ate a new record
5500: 20 66 6f 72 20 61 20 67 69 76 65 6e 20 74 65 73 for a given tes
5510: 74 6e 61 6d 65 0a 28 64 65 66 69 6e 65 20 28 64 tname.(define (d
5520: 62 3a 74 65 73 74 6d 65 74 61 2d 61 64 64 2d 72 b:testmeta-add-r
5530: 65 63 6f 72 64 20 64 62 20 74 65 73 74 6e 61 6d ecord db testnam
5540: 65 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 e). (sqlite3:ex
5550: 65 63 75 74 65 20 64 62 20 22 49 4e 53 45 52 54 ecute db "INSERT
5560: 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 OR IGNORE INTO
5570: 74 65 73 74 5f 6d 65 74 61 20 28 74 65 73 74 6e test_meta (testn
5580: 61 6d 65 2c 61 75 74 68 6f 72 2c 6f 77 6e 65 72 ame,author,owner
5590: 2c 64 65 73 63 72 69 70 74 69 6f 6e 2c 72 65 76 ,description,rev
55a0: 69 65 77 65 64 2c 69 74 65 72 61 74 65 64 2c 61 iewed,iterated,a
55b0: 76 67 5f 72 75 6e 74 69 6d 65 2c 61 76 67 5f 64 vg_runtime,avg_d
55c0: 69 73 6b 2c 74 61 67 73 29 20 56 41 4c 55 45 53 isk,tags) VALUES
55d0: 20 28 3f 2c 27 27 2c 27 27 2c 27 27 2c 27 27 2c (?,'','','','',
55e0: 27 27 2c 27 27 2c 27 27 2c 27 27 29 3b 22 20 74 '','','','');" t
55f0: 65 73 74 6e 61 6d 65 29 29 0a 0a 3b 3b 20 75 70 estname))..;; up
5600: 64 61 74 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 date one of the
5610: 74 65 73 74 6d 65 74 61 20 66 69 65 6c 64 73 0a testmeta fields.
5620: 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74 (define (db:test
5630: 6d 65 74 61 2d 75 70 64 61 74 65 2d 66 69 65 6c meta-update-fiel
5640: 64 20 64 62 20 74 65 73 74 6e 61 6d 65 20 66 69 d db testname fi
5650: 65 6c 64 20 76 61 6c 75 65 29 0a 20 20 28 73 71 eld value). (sq
5660: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 lite3:execute db
5670: 20 28 63 6f 6e 63 20 22 55 50 44 41 54 45 20 74 (conc "UPDATE t
5680: 65 73 74 5f 6d 65 74 61 20 53 45 54 20 22 20 66 est_meta SET " f
5690: 69 65 6c 64 20 22 3d 3f 20 57 48 45 52 45 20 74 ield "=? WHERE t
56a0: 65 73 74 6e 61 6d 65 3d 3f 3b 22 29 20 76 61 6c estname=?;") val
56b0: 75 65 20 74 65 73 74 6e 61 6d 65 29 29 0a 0a 3b ue testname))..;
56c0: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ;===============
56d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
56e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
56f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5700: 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 54 20 45 20 53 =======.;; T E S
5710: 20 54 20 20 20 44 20 41 20 54 20 41 20 0a 3b 3b T D A T A .;;
5720: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5730: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5740: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5750: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
5760: 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65 66 69 6e 65 20 ======..(define
5770: 28 64 62 3a 63 73 76 2d 3e 74 65 73 74 2d 64 61 (db:csv->test-da
5780: 74 61 20 64 62 20 74 65 73 74 2d 69 64 20 63 73 ta db test-id cs
5790: 76 64 61 74 61 29 0a 20 20 28 64 65 62 75 67 3a vdata). (debug:
57a0: 70 72 69 6e 74 20 34 20 22 74 65 73 74 2d 69 64 print 4 "test-id
57b0: 20 22 20 74 65 73 74 2d 69 64 20 22 2c 20 63 73 " test-id ", cs
57c0: 76 64 61 74 61 3a 20 22 20 63 73 76 64 61 74 61 vdata: " csvdata
57d0: 29 0a 20 20 28 6c 65 74 20 28 28 63 73 76 6c 69 ). (let ((csvli
57e0: 73 74 20 28 63 73 76 2d 3e 6c 69 73 74 20 28 6d st (csv->list (m
57f0: 61 6b 65 2d 63 73 76 2d 72 65 61 64 65 72 0a 09 ake-csv-reader..
5800: 09 09 20 20 20 20 20 28 6f 70 65 6e 2d 69 6e 70 .. (open-inp
5810: 75 74 2d 73 74 72 69 6e 67 20 63 73 76 64 61 74 ut-string csvdat
5820: 61 29 0a 09 09 09 20 20 20 20 20 27 28 28 73 74 a).... '((st
5830: 72 69 70 2d 6c 65 61 64 69 6e 67 2d 77 68 69 74 rip-leading-whit
5840: 65 73 70 61 63 65 3f 20 23 74 29 0a 09 09 09 20 espace? #t)....
5850: 20 20 20 20 20 20 28 73 74 72 69 70 2d 74 72 61 (strip-tra
5860: 69 6c 69 6e 67 2d 77 68 69 74 65 73 70 61 63 65 iling-whitespace
5870: 3f 20 23 74 29 29 20 29 29 29 29 20 3b 3b 20 28 ? #t)) )))) ;; (
5880: 63 73 76 2d 3e 6c 69 73 74 20 63 73 76 64 61 74 csv->list csvdat
5890: 61 29 29 29 0a 20 20 20 20 28 66 6f 72 2d 65 61 a))). (for-ea
58a0: 63 68 20 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 ch . (lambda
58b0: 20 28 63 73 76 72 6f 77 29 0a 20 20 20 20 20 20 (csvrow).
58c0: 20 28 6c 65 74 2a 20 28 28 70 61 64 64 65 64 2d (let* ((padded-
58d0: 72 6f 77 20 20 28 74 61 6b 65 20 28 61 70 70 65 row (take (appe
58e0: 6e 64 20 63 73 76 72 6f 77 20 28 6c 69 73 74 20 nd csvrow (list
58f0: 23 66 20 23 66 20 23 66 20 23 66 20 23 66 20 23 #f #f #f #f #f #
5900: 66 20 23 66 20 23 66 29 29 20 38 29 29 0a 09 20 f #f #f)) 8))..
5910: 20 20 20 20 20 28 63 61 74 65 67 6f 72 79 20 20 (category
5920: 20 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64 64 (list-ref padd
5930: 65 64 2d 72 6f 77 20 30 29 29 0a 09 20 20 20 20 ed-row 0))..
5940: 20 20 28 76 61 72 69 61 62 6c 65 20 20 20 20 28 (variable (
5950: 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d list-ref padded-
5960: 72 6f 77 20 31 29 29 0a 09 20 20 20 20 20 20 28 row 1)).. (
5970: 76 61 6c 75 65 20 20 20 20 20 20 20 28 61 6e 79 value (any
5980: 2d 3e 6e 75 6d 62 65 72 2d 69 66 2d 70 6f 73 73 ->number-if-poss
5990: 69 62 6c 65 20 28 6c 69 73 74 2d 72 65 66 20 70 ible (list-ref p
59a0: 61 64 64 65 64 2d 72 6f 77 20 32 29 29 29 0a 09 added-row 2)))..
59b0: 20 20 20 20 20 20 28 65 78 70 65 63 74 65 64 20 (expected
59c0: 20 20 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 2d (any->number-
59d0: 69 66 2d 70 6f 73 73 69 62 6c 65 20 28 6c 69 73 if-possible (lis
59e0: 74 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77 t-ref padded-row
59f0: 20 33 29 29 29 0a 09 20 20 20 20 20 20 28 74 6f 3))).. (to
5a00: 6c 20 20 20 20 20 20 20 20 20 28 61 6e 79 2d 3e l (any->
5a10: 6e 75 6d 62 65 72 2d 69 66 2d 70 6f 73 73 69 62 number-if-possib
5a20: 6c 65 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64 le (list-ref pad
5a30: 64 65 64 2d 72 6f 77 20 34 29 29 29 20 3b 3b 20 ded-row 4))) ;;
5a40: 3e 2c 20 3c 2c 20 3e 3d 2c 20 3c 3d 2c 20 6f 72 >, <, >=, <=, or
5a50: 20 61 20 6e 75 6d 62 65 72 0a 09 20 20 20 20 20 a number..
5a60: 20 28 75 6e 69 74 73 20 20 20 20 20 20 20 28 6c (units (l
5a70: 69 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d 72 ist-ref padded-r
5a80: 6f 77 20 35 29 29 0a 09 20 20 20 20 20 20 28 63 ow 5)).. (c
5a90: 6f 6d 6d 65 6e 74 20 20 20 20 20 28 6c 69 73 74 omment (list
5aa0: 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20 -ref padded-row
5ab0: 36 29 29 0a 09 20 20 20 20 20 20 28 73 74 61 74 6)).. (stat
5ac0: 75 73 20 20 20 20 20 20 28 6c 65 74 20 28 28 73 us (let ((s
5ad0: 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65 (list-ref padde
5ae0: 64 2d 72 6f 77 20 37 29 29 29 0a 09 09 09 20 20 d-row 7)))....
5af0: 20 20 20 28 69 66 20 28 61 6e 64 20 28 73 74 72 (if (and (str
5b00: 69 6e 67 3f 20 73 29 28 6f 72 20 28 73 74 72 69 ing? s)(or (stri
5b10: 6e 67 2d 6d 61 74 63 68 20 28 72 65 67 65 78 70 ng-match (regexp
5b20: 20 22 5e 5c 5c 73 2a 24 22 29 20 73 29 0a 09 09 "^\\s*$") s)...
5b30: 09 09 09 09 20 20 20 20 20 28 73 74 72 69 6e 67 .... (string
5b40: 2d 6d 61 74 63 68 20 28 72 65 67 65 78 70 20 22 -match (regexp "
5b50: 5e 6e 2f 61 24 22 29 20 73 29 29 29 0a 09 09 09 ^n/a$") s)))....
5b60: 09 20 23 66 0a 09 09 09 09 20 73 29 29 29 29 20 . #f..... s))))
5b70: 3b 3b 20 69 66 20 73 70 65 63 69 66 69 65 64 20 ;; if specified
5b80: 6f 6e 20 74 68 65 20 69 6e 70 75 74 20 74 68 65 on the input the
5b90: 6e 20 75 73 65 2c 20 65 6c 73 65 20 63 61 6c 63 n use, else calc
5ba0: 75 6c 61 74 65 0a 09 20 3b 3b 20 6c 6f 6f 6b 20 ulate.. ;; look
5bb0: 75 70 20 65 78 70 65 63 74 65 64 2c 74 6f 6c 2c up expected,tol,
5bc0: 75 6e 69 74 73 20 66 72 6f 6d 20 70 72 65 76 69 units from previ
5bd0: 6f 75 73 20 62 65 73 74 20 66 69 74 20 74 65 73 ous best fit tes
5be0: 74 20 69 66 20 74 68 65 79 20 61 72 65 20 61 6c t if they are al
5bf0: 6c 20 65 69 74 68 65 72 20 23 66 20 6f 72 20 27 l either #f or '
5c00: 27 0a 09 20 28 64 65 62 75 67 3a 70 72 69 6e 74 '.. (debug:print
5c10: 20 34 20 22 42 45 46 4f 52 45 3a 20 63 61 74 65 4 "BEFORE: cate
5c20: 67 6f 72 79 3a 20 22 20 63 61 74 65 67 6f 72 79 gory: " category
5c30: 20 22 20 76 61 72 69 61 62 6c 65 3a 20 22 20 76 " variable: " v
5c40: 61 72 69 61 62 6c 65 20 22 20 76 61 6c 75 65 3a ariable " value:
5c50: 20 22 20 76 61 6c 75 65 20 0a 09 09 20 20 20 20 " value ...
5c60: 20 20 22 2c 20 65 78 70 65 63 74 65 64 3a 20 22 ", expected: "
5c70: 20 65 78 70 65 63 74 65 64 20 22 20 74 6f 6c 3a expected " tol:
5c80: 20 22 20 74 6f 6c 20 22 20 75 6e 69 74 73 3a 20 " tol " units:
5c90: 22 20 75 6e 69 74 73 20 22 20 73 74 61 74 75 73 " units " status
5ca0: 3a 20 22 20 73 74 61 74 75 73 20 22 20 63 6f 6d : " status " com
5cb0: 6d 65 6e 74 3a 20 22 20 63 6f 6d 6d 65 6e 74 29 ment: " comment)
5cc0: 0a 0a 09 20 28 69 66 20 28 61 6e 64 20 28 6f 72 ... (if (and (or
5cd0: 20 28 6e 6f 74 20 65 78 70 65 63 74 65 64 29 28 (not expected)(
5ce0: 65 71 75 61 6c 3f 20 65 78 70 65 63 74 65 64 20 equal? expected
5cf0: 22 22 29 29 0a 09 09 20 20 28 6f 72 20 28 6e 6f ""))... (or (no
5d00: 74 20 74 6f 6c 29 20 20 20 20 20 28 65 71 75 61 t tol) (equa
5d10: 6c 3f 20 65 78 70 65 63 74 65 64 20 22 22 29 29 l? expected ""))
5d20: 0a 09 09 20 20 28 6f 72 20 28 6e 6f 74 20 75 6e ... (or (not un
5d30: 69 74 73 29 20 20 20 28 65 71 75 61 6c 3f 20 65 its) (equal? e
5d40: 78 70 65 63 74 65 64 20 22 22 29 29 29 0a 09 20 xpected "")))..
5d50: 20 20 20 20 28 6c 65 74 2d 76 61 6c 75 65 73 20 (let-values
5d60: 28 28 28 6e 65 77 2d 65 78 70 65 63 74 65 64 20 (((new-expected
5d70: 6e 65 77 2d 74 6f 6c 20 6e 65 77 2d 75 6e 69 74 new-tol new-unit
5d80: 73 29 28 64 62 3a 67 65 74 2d 70 72 65 76 2d 74 s)(db:get-prev-t
5d90: 6f 6c 2d 66 6f 72 2d 74 65 73 74 20 64 62 20 74 ol-for-test db t
5da0: 65 73 74 2d 69 64 20 63 61 74 65 67 6f 72 79 20 est-id category
5db0: 76 61 72 69 61 62 6c 65 29 29 29 0a 09 20 20 20 variable)))..
5dc0: 20 20 20 20 28 73 65 74 21 20 65 78 70 65 63 74 (set! expect
5dd0: 65 64 20 6e 65 77 2d 65 78 70 65 63 74 65 64 29 ed new-expected)
5de0: 0a 09 20 20 20 20 20 20 20 28 73 65 74 21 20 74 .. (set! t
5df0: 6f 6c 20 20 20 20 20 20 6e 65 77 2d 74 6f 6c 29 ol new-tol)
5e00: 0a 09 20 20 20 20 20 20 20 28 73 65 74 21 20 75 .. (set! u
5e10: 6e 69 74 73 20 20 20 20 6e 65 77 2d 75 6e 69 74 nits new-unit
5e20: 73 29 29 29 0a 0a 09 20 28 64 65 62 75 67 3a 70 s)))... (debug:p
5e30: 72 69 6e 74 20 34 20 22 41 46 54 45 52 3a 20 20 rint 4 "AFTER:
5e40: 63 61 74 65 67 6f 72 79 3a 20 22 20 63 61 74 65 category: " cate
5e50: 67 6f 72 79 20 22 20 76 61 72 69 61 62 6c 65 3a gory " variable:
5e60: 20 22 20 76 61 72 69 61 62 6c 65 20 22 20 76 61 " variable " va
5e70: 6c 75 65 3a 20 22 20 76 61 6c 75 65 20 0a 09 09 lue: " value ...
5e80: 20 20 20 20 20 20 22 2c 20 65 78 70 65 63 74 65 ", expecte
5e90: 64 3a 20 22 20 65 78 70 65 63 74 65 64 20 22 20 d: " expected "
5ea0: 74 6f 6c 3a 20 22 20 74 6f 6c 20 22 20 75 6e 69 tol: " tol " uni
5eb0: 74 73 3a 20 22 20 75 6e 69 74 73 20 22 20 73 74 ts: " units " st
5ec0: 61 74 75 73 3a 20 22 20 73 74 61 74 75 73 20 22 atus: " status "
5ed0: 20 63 6f 6d 6d 65 6e 74 3a 20 22 20 63 6f 6d 6d comment: " comm
5ee0: 65 6e 74 29 0a 09 20 3b 3b 20 63 61 6c 63 75 6c ent).. ;; calcul
5ef0: 61 74 65 20 73 74 61 74 75 73 20 69 66 20 4e 4f ate status if NO
5f00: 54 20 73 70 65 63 69 66 69 65 64 0a 09 20 28 69 T specified.. (i
5f10: 66 20 28 61 6e 64 20 28 6e 6f 74 20 73 74 61 74 f (and (not stat
5f20: 75 73 29 28 6e 75 6d 62 65 72 3f 20 65 78 70 65 us)(number? expe
5f30: 63 74 65 64 29 28 6e 75 6d 62 65 72 3f 20 76 61 cted)(number? va
5f40: 6c 75 65 29 29 20 3b 3b 20 6e 65 65 64 20 65 78 lue)) ;; need ex
5f50: 70 65 63 74 65 64 20 61 6e 64 20 76 61 6c 75 65 pected and value
5f60: 20 74 6f 20 62 65 20 6e 75 6d 62 65 72 73 0a 09 to be numbers..
5f70: 20 20 20 20 20 28 69 66 20 28 6e 75 6d 62 65 72 (if (number
5f80: 3f 20 74 6f 6c 29 20 3b 3b 20 69 66 20 74 6f 6c ? tol) ;; if tol
5f90: 20 69 73 20 61 20 6e 75 6d 62 65 72 20 74 68 65 is a number the
5fa0: 6e 20 77 65 20 64 6f 20 74 68 65 20 73 74 61 6e n we do the stan
5fb0: 64 61 72 64 20 63 6f 6d 70 61 72 69 73 6f 6e 0a dard comparison.
5fc0: 09 09 20 28 6c 65 74 2a 20 28 28 6d 61 78 2d 76 .. (let* ((max-v
5fd0: 61 6c 20 28 2b 20 65 78 70 65 63 74 65 64 20 74 al (+ expected t
5fe0: 6f 6c 29 29 0a 09 09 09 28 6d 69 6e 2d 76 61 6c ol))....(min-val
5ff0: 20 28 2d 20 65 78 70 65 63 74 65 64 20 74 6f 6c (- expected tol
6000: 29 29 0a 09 09 09 28 72 65 73 75 6c 74 20 20 28 ))....(result (
6010: 61 6e 64 20 28 3e 3d 20 20 76 61 6c 75 65 20 6d and (>= value m
6020: 69 6e 2d 76 61 6c 29 28 3c 3d 20 76 61 6c 75 65 in-val)(<= value
6030: 20 6d 61 78 2d 76 61 6c 29 29 29 29 0a 09 09 20 max-val))))...
6040: 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 (debug:print 4
6050: 20 22 6d 61 78 2d 76 61 6c 3a 20 22 20 6d 61 78 "max-val: " max
6060: 2d 76 61 6c 20 22 20 6d 69 6e 2d 76 61 6c 3a 20 -val " min-val:
6070: 22 20 6d 69 6e 2d 76 61 6c 20 22 20 72 65 73 75 " min-val " resu
6080: 6c 74 3a 20 22 20 72 65 73 75 6c 74 29 0a 09 09 lt: " result)...
6090: 20 20 20 28 73 65 74 21 20 73 74 61 74 75 73 20 (set! status
60a0: 28 69 66 20 72 65 73 75 6c 74 20 22 70 61 73 73 (if result "pass
60b0: 22 20 22 66 61 69 6c 22 29 29 29 0a 09 09 20 28 " "fail")))... (
60c0: 73 65 74 21 20 73 74 61 74 75 73 20 3b 3b 20 4e set! status ;; N
60d0: 42 2f 2f 20 6e 65 65 64 20 74 6f 20 61 73 73 65 B// need to asse
60e0: 73 73 20 65 61 63 68 20 6f 6e 65 20 28 69 2e 65 ss each one (i.e
60f0: 2e 20 6e 6f 74 20 72 65 74 75 72 6e 20 6f 70 65 . not return ope
6100: 72 61 74 6f 72 20 73 69 6e 63 65 20 6e 65 65 64 rator since need
6110: 20 74 6f 20 61 63 74 20 69 66 20 6e 6f 74 20 76 to act if not v
6120: 61 6c 69 64 20 6f 70 2e 0a 09 09 20 20 20 20 20 alid op....
6130: 20 20 28 63 61 73 65 20 28 73 74 72 69 6e 67 2d (case (string-
6140: 3e 73 79 6d 62 6f 6c 20 74 6f 6c 29 20 3b 3b 20 >symbol tol) ;;
6150: 74 6f 6c 20 73 68 6f 75 6c 64 20 62 65 20 3e 2c tol should be >,
6160: 20 3c 2c 20 3e 3d 2c 20 3c 3d 0a 09 09 09 20 28 <, >=, <=.... (
6170: 28 3e 29 20 20 28 69 66 20 28 3e 20 20 76 61 6c (>) (if (> val
6180: 75 65 20 65 78 70 65 63 74 65 64 29 20 22 70 61 ue expected) "pa
6190: 73 73 22 20 22 66 61 69 6c 22 29 29 0a 09 09 09 ss" "fail"))....
61a0: 20 28 28 3c 29 20 20 28 69 66 20 28 3c 20 20 76 ((<) (if (< v
61b0: 61 6c 75 65 20 65 78 70 65 63 74 65 64 29 20 22 alue expected) "
61c0: 70 61 73 73 22 20 22 66 61 69 6c 22 29 29 0a 09 pass" "fail"))..
61d0: 09 09 20 28 28 3e 3d 29 20 28 69 66 20 28 3e 3d .. ((>=) (if (>=
61e0: 20 76 61 6c 75 65 20 65 78 70 65 63 74 65 64 29 value expected)
61f0: 20 22 70 61 73 73 22 20 22 66 61 69 6c 22 29 29 "pass" "fail"))
6200: 0a 09 09 09 20 28 28 3c 3d 29 20 28 69 66 20 28 .... ((<=) (if (
6210: 3c 3d 20 76 61 6c 75 65 20 65 78 70 65 63 74 65 <= value expecte
6220: 64 29 20 22 70 61 73 73 22 20 22 66 61 69 6c 22 d) "pass" "fail"
6230: 29 29 0a 09 09 09 20 28 65 6c 73 65 20 28 63 6f )).... (else (co
6240: 6e 63 20 22 45 52 52 4f 52 3a 20 62 61 64 20 74 nc "ERROR: bad t
6250: 6f 6c 20 63 6f 6d 70 61 72 61 74 6f 72 20 22 20 ol comparator "
6260: 74 6f 6c 29 29 29 29 29 29 0a 09 20 28 64 65 62 tol)))))).. (deb
6270: 75 67 3a 70 72 69 6e 74 20 34 20 22 41 46 54 45 ug:print 4 "AFTE
6280: 52 32 3a 20 63 61 74 65 67 6f 72 79 3a 20 22 20 R2: category: "
6290: 63 61 74 65 67 6f 72 79 20 22 20 76 61 72 69 61 category " varia
62a0: 62 6c 65 3a 20 22 20 76 61 72 69 61 62 6c 65 20 ble: " variable
62b0: 22 20 76 61 6c 75 65 3a 20 22 20 76 61 6c 75 65 " value: " value
62c0: 20 0a 09 09 20 20 20 20 20 20 22 2c 20 65 78 70 ... ", exp
62d0: 65 63 74 65 64 3a 20 22 20 65 78 70 65 63 74 65 ected: " expecte
62e0: 64 20 22 20 74 6f 6c 3a 20 22 20 74 6f 6c 20 22 d " tol: " tol "
62f0: 20 75 6e 69 74 73 3a 20 22 20 75 6e 69 74 73 20 units: " units
6300: 22 20 73 74 61 74 75 73 3a 20 22 20 73 74 61 74 " status: " stat
6310: 75 73 20 22 20 63 6f 6d 6d 65 6e 74 3a 20 22 20 us " comment: "
6320: 63 6f 6d 6d 65 6e 74 29 0a 09 20 28 73 71 6c 69 comment).. (sqli
6330: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 te3:execute db "
6340: 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43 INSERT OR REPLAC
6350: 45 20 49 4e 54 4f 20 74 65 73 74 5f 64 61 74 61 E INTO test_data
6360: 20 28 74 65 73 74 5f 69 64 2c 63 61 74 65 67 6f (test_id,catego
6370: 72 79 2c 76 61 72 69 61 62 6c 65 2c 76 61 6c 75 ry,variable,valu
6380: 65 2c 65 78 70 65 63 74 65 64 2c 74 6f 6c 2c 75 e,expected,tol,u
6390: 6e 69 74 73 2c 63 6f 6d 6d 65 6e 74 2c 73 74 61 nits,comment,sta
63a0: 74 75 73 29 20 56 41 4c 55 45 53 20 28 3f 2c 3f tus) VALUES (?,?
63b0: 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 29 3b ,?,?,?,?,?,?,?);
63c0: 22 0a 09 20 20 20 20 20 20 74 65 73 74 2d 69 64 ".. test-id
63d0: 20 63 61 74 65 67 6f 72 79 20 76 61 72 69 61 62 category variab
63e0: 6c 65 20 76 61 6c 75 65 20 65 78 70 65 63 74 65 le value expecte
63f0: 64 20 74 6f 6c 20 75 6e 69 74 73 20 28 69 66 20 d tol units (if
6400: 63 6f 6d 6d 65 6e 74 20 63 6f 6d 6d 65 6e 74 20 comment comment
6410: 22 22 29 20 73 74 61 74 75 73 29 29 29 0a 20 20 "") status))).
6420: 20 20 20 63 73 76 6c 69 73 74 29 29 29 0a 0a 3b csvlist)))..;
6430: 3b 20 67 65 74 20 61 20 6c 69 73 74 20 6f 66 20 ; get a list of
6440: 74 65 73 74 5f 64 61 74 61 20 72 65 63 6f 72 64 test_data record
6450: 73 20 6d 61 74 63 68 69 6e 67 20 63 61 74 65 67 s matching categ
6460: 6f 72 79 70 61 74 74 0a 28 64 65 66 69 6e 65 20 orypatt.(define
6470: 28 64 62 3a 72 65 61 64 2d 74 65 73 74 2d 64 61 (db:read-test-da
6480: 74 61 20 64 62 20 74 65 73 74 2d 69 64 20 63 61 ta db test-id ca
6490: 74 65 67 6f 72 79 70 61 74 74 29 0a 20 20 28 6c tegorypatt). (l
64a0: 65 74 20 28 28 72 65 73 20 27 28 29 29 29 0a 20 et ((res '())).
64b0: 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d (sqlite3:for-
64c0: 65 61 63 68 2d 72 6f 77 20 0a 20 20 20 20 20 28 each-row . (
64d0: 6c 61 6d 62 64 61 20 28 69 64 20 74 65 73 74 5f lambda (id test_
64e0: 69 64 20 63 61 74 65 67 6f 72 79 20 76 61 72 69 id category vari
64f0: 61 62 6c 65 20 76 61 6c 75 65 20 65 78 70 65 63 able value expec
6500: 74 65 64 20 74 6f 6c 20 75 6e 69 74 73 20 63 6f ted tol units co
6510: 6d 6d 65 6e 74 20 73 74 61 74 75 73 29 0a 20 20 mment status).
6520: 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28 (set! res (
6530: 63 6f 6e 73 20 28 76 65 63 74 6f 72 20 69 64 20 cons (vector 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 20 72 65 73 29 29 29 0a 20 20 20 20 20 64 s) res))). d
6590: 62 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20 69 b. "SELECT i
65a0: 64 2c 74 65 73 74 5f 69 64 2c 63 61 74 65 67 6f d,test_id,catego
65b0: 72 79 2c 76 61 72 69 61 62 6c 65 2c 76 61 6c 75 ry,variable,valu
65c0: 65 2c 65 78 70 65 63 74 65 64 2c 74 6f 6c 2c 75 e,expected,tol,u
65d0: 6e 69 74 73 2c 63 6f 6d 6d 65 6e 74 2c 73 74 61 nits,comment,sta
65e0: 74 75 73 20 46 52 4f 4d 20 74 65 73 74 5f 64 61 tus FROM test_da
65f0: 74 61 20 57 48 45 52 45 20 74 65 73 74 5f 69 64 ta WHERE test_id
6600: 3d 3f 20 41 4e 44 20 63 61 74 65 67 6f 72 79 20 =? AND category
6610: 4c 49 4b 45 20 3f 20 4f 52 44 45 52 20 42 59 20 LIKE ? ORDER BY
6620: 63 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62 6c category,variabl
6630: 65 3b 22 20 74 65 73 74 2d 69 64 20 63 61 74 65 e;" test-id cate
6640: 67 6f 72 79 70 61 74 74 29 0a 20 20 20 20 28 72 gorypatt). (r
6650: 65 76 65 72 73 65 20 72 65 73 29 29 29 0a 0a 28 everse res)))..(
6660: 64 65 66 69 6e 65 20 28 64 62 3a 6c 6f 61 64 2d define (db:load-
6670: 74 65 73 74 2d 64 61 74 61 20 64 62 20 72 75 6e test-data db run
6680: 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 -id test-name it
6690: 65 6d 64 61 74 29 0a 20 20 28 6c 65 74 2a 20 28 emdat). (let* (
66a0: 28 69 74 65 6d 2d 70 61 74 68 20 28 69 74 65 6d (item-path (item
66b0: 2d 6c 69 73 74 2d 3e 70 61 74 68 20 69 74 65 6d -list->path item
66c0: 64 61 74 29 29 0a 09 20 28 74 65 73 74 64 61 74 dat)).. (testdat
66d0: 20 28 64 62 3a 67 65 74 2d 74 65 73 74 2d 69 6e (db:get-test-in
66e0: 66 6f 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 fo db run-id tes
66f0: 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 t-name item-path
6700: 29 29 0a 09 20 28 74 65 73 74 2d 69 64 20 28 69 )).. (test-id (i
6710: 66 20 74 65 73 74 64 61 74 20 28 64 62 3a 74 65 f testdat (db:te
6720: 73 74 2d 67 65 74 2d 69 64 20 74 65 73 74 64 61 st-get-id testda
6730: 74 29 20 23 66 29 29 29 0a 20 20 20 20 3b 3b 20 t) #f))). ;;
6740: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 31 20 22 (debug:print 1 "
6750: 45 6e 74 65 72 20 72 65 63 6f 72 64 73 20 74 6f Enter records to
6760: 20 69 6e 73 65 72 74 20 69 6e 20 74 68 65 20 74 insert in the t
6770: 65 73 74 5f 64 61 74 61 20 74 61 62 6c 65 2c 20 est_data table,
6780: 73 65 76 65 6e 20 66 69 65 6c 64 73 2c 20 63 6f seven fields, co
6790: 6d 6d 61 20 73 65 70 61 72 61 74 65 64 20 70 65 mma separated pe
67a0: 72 20 6c 69 6e 65 22 29 0a 20 20 20 20 28 64 65 r line"). (de
67b0: 62 75 67 3a 70 72 69 6e 74 20 34 20 22 69 74 65 bug:print 4 "ite
67c0: 6d 64 61 74 3a 20 22 20 69 74 65 6d 64 61 74 20 mdat: " itemdat
67d0: 22 2c 20 74 65 73 74 2d 6e 61 6d 65 3a 20 22 20 ", test-name: "
67e0: 74 65 73 74 2d 6e 61 6d 65 20 22 2c 20 74 65 73 test-name ", tes
67f0: 74 2d 69 64 3a 20 22 20 74 65 73 74 2d 69 64 29 t-id: " test-id)
6800: 0a 20 20 20 20 28 69 66 20 74 65 73 74 2d 69 64 . (if test-id
6810: 0a 09 28 6c 65 74 20 6c 6f 6f 70 20 28 28 6c 69 ..(let loop ((li
6820: 6e 20 28 72 65 61 64 2d 6c 69 6e 65 29 29 29 0a n (read-line))).
6830: 09 20 20 28 69 66 20 28 6e 6f 74 20 28 65 6f 66 . (if (not (eof
6840: 2d 6f 62 6a 65 63 74 3f 20 6c 69 6e 29 29 0a 09 -object? lin))..
6850: 20 20 20 20 20 20 28 62 65 67 69 6e 0a 09 09 28 (begin...(
6860: 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20 6c 69 debug:print 4 li
6870: 6e 29 0a 09 09 28 64 62 3a 63 73 76 2d 3e 74 65 n)...(db:csv->te
6880: 73 74 2d 64 61 74 61 20 64 62 20 74 65 73 74 2d st-data db test-
6890: 69 64 20 6c 69 6e 29 0a 09 09 28 6c 6f 6f 70 20 id lin)...(loop
68a0: 28 72 65 61 64 2d 6c 69 6e 65 29 29 29 29 29 29 (read-line))))))
68b0: 0a 20 20 20 20 3b 3b 20 72 6f 6c 6c 20 75 70 20 . ;; roll up
68c0: 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 73 75 the current resu
68d0: 6c 74 73 2e 0a 20 20 20 20 28 64 62 3a 74 65 73 lts.. (db:tes
68e0: 74 2d 64 61 74 61 2d 72 6f 6c 6c 75 70 20 64 62 t-data-rollup db
68f0: 20 74 65 73 74 2d 69 64 29 29 29 0a 20 20 0a 3b test-id))). .;
6900: 3b 20 57 41 52 4e 49 4e 47 3a 20 44 6f 20 4e 4f ; WARNING: Do NO
6910: 54 20 63 61 6c 6c 20 74 68 69 73 20 66 6f 72 20 T call this for
6920: 74 68 65 20 70 61 72 65 6e 74 20 74 65 73 74 20 the parent test
6930: 6f 6e 20 61 6e 20 69 74 65 72 61 74 65 64 20 74 on an iterated t
6940: 65 73 74 0a 3b 3b 20 52 6f 6c 6c 20 75 70 20 74 est.;; Roll up t
6950: 65 73 74 5f 64 61 74 61 20 70 61 73 73 2f 66 61 est_data pass/fa
6960: 69 6c 20 72 65 73 75 6c 74 73 0a 3b 3b 20 6c 6f il results.;; lo
6970: 6f 6b 20 61 74 20 74 68 65 20 74 65 73 74 5f 64 ok at the test_d
6980: 61 74 61 20 73 74 61 74 75 73 20 66 69 65 6c 64 ata status field
6990: 2c 20 0a 3b 3b 20 20 20 20 69 66 20 61 6c 6c 20 , .;; if all
69a0: 61 72 65 20 70 61 73 73 20 28 61 6e 79 20 63 61 are pass (any ca
69b0: 73 65 29 20 61 6e 64 20 74 68 65 20 74 65 73 74 se) and the test
69c0: 20 73 74 61 74 75 73 20 69 73 20 50 41 53 53 20 status is PASS
69d0: 6f 72 20 4e 55 4c 4c 20 6f 72 20 27 27 20 74 68 or NULL or '' th
69e0: 65 6e 20 73 65 74 20 74 65 73 74 20 73 74 61 74 en set test stat
69f0: 75 73 20 74 6f 20 50 41 53 53 2e 0a 3b 3b 20 20 us to PASS..;;
6a00: 20 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 if one or more
6a10: 20 61 72 65 20 66 61 69 6c 20 28 61 6e 79 20 63 are fail (any c
6a20: 61 73 65 29 20 74 68 65 6e 20 73 65 74 20 74 65 ase) then set te
6a30: 73 74 20 73 74 61 74 75 73 20 74 6f 20 50 41 53 st status to PAS
6a40: 53 2c 20 6e 6f 6e 20 22 70 61 73 73 22 20 6f 72 S, non "pass" or
6a50: 20 22 66 61 69 6c 22 20 61 72 65 20 69 67 6e 6f "fail" are igno
6a60: 72 65 64 0a 28 64 65 66 69 6e 65 20 28 64 62 3a red.(define (db:
6a70: 74 65 73 74 2d 64 61 74 61 2d 72 6f 6c 6c 75 70 test-data-rollup
6a80: 20 64 62 20 74 65 73 74 2d 69 64 29 0a 20 20 28 db test-id). (
6a90: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 sqlite3:execute
6aa0: 0a 20 20 20 64 62 20 0a 20 20 20 22 55 50 44 41 . db . "UPDA
6ab0: 54 45 20 74 65 73 74 73 20 0a 20 20 20 20 20 20 TE tests .
6ac0: 53 45 54 20 66 61 69 6c 5f 63 6f 75 6e 74 3d 28 SET fail_count=(
6ad0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 69 64 29 SELECT count(id)
6ae0: 20 46 52 4f 4d 20 74 65 73 74 5f 64 61 74 61 20 FROM test_data
6af0: 57 48 45 52 45 20 74 65 73 74 5f 69 64 3d 3f 20 WHERE test_id=?
6b00: 41 4e 44 20 73 74 61 74 75 73 20 6c 69 6b 65 20 AND status like
6b10: 27 66 61 69 6c 27 29 2c 0a 20 20 20 20 20 20 20 'fail'),.
6b20: 20 20 20 70 61 73 73 5f 63 6f 75 6e 74 3d 28 53 pass_count=(S
6b30: 45 4c 45 43 54 20 63 6f 75 6e 74 28 69 64 29 20 ELECT count(id)
6b40: 46 52 4f 4d 20 74 65 73 74 5f 64 61 74 61 20 57 FROM test_data W
6b50: 48 45 52 45 20 74 65 73 74 5f 69 64 3d 3f 20 41 HERE test_id=? A
6b60: 4e 44 20 73 74 61 74 75 73 20 6c 69 6b 65 20 27 ND status like '
6b70: 70 61 73 73 27 29 0a 20 20 20 20 20 20 57 48 45 pass'). WHE
6b80: 52 45 20 69 64 3d 3f 3b 22 0a 20 20 20 74 65 73 RE id=?;". tes
6b90: 74 2d 69 64 20 74 65 73 74 2d 69 64 20 74 65 73 t-id test-id tes
6ba0: 74 2d 69 64 29 0a 20 20 3b 3b 20 69 66 20 74 68 t-id). ;; if th
6bb0: 65 20 74 65 73 74 20 69 73 20 6e 6f 74 20 46 41 e test is not FA
6bc0: 49 4c 20 74 68 65 6e 20 73 65 74 20 73 74 61 74 IL then set stat
6bd0: 75 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 us based on the
6be0: 66 61 69 6c 20 61 6e 64 20 70 61 73 73 20 63 6f fail and pass co
6bf0: 75 6e 74 73 2e 0a 20 20 28 74 68 72 65 61 64 2d unts.. (thread-
6c00: 73 6c 65 65 70 21 20 31 29 0a 20 20 28 73 71 6c sleep! 1). (sql
6c10: 69 74 65 33 3a 65 78 65 63 75 74 65 0a 20 20 20 ite3:execute.
6c20: 64 62 0a 20 20 20 22 55 50 44 41 54 45 20 74 65 db. "UPDATE te
6c30: 73 74 73 0a 20 20 20 20 20 20 53 45 54 20 73 74 sts. SET st
6c40: 61 74 75 73 3d 43 41 53 45 20 57 48 45 4e 20 28 atus=CASE WHEN (
6c50: 53 45 4c 45 43 54 20 66 61 69 6c 5f 63 6f 75 6e SELECT fail_coun
6c60: 74 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 t FROM tests WHE
6c70: 52 45 20 69 64 3d 3f 29 20 3e 20 30 20 0a 20 20 RE id=?) > 0 .
6c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6c90: 20 20 20 20 20 20 20 54 48 45 4e 20 27 46 41 49 THEN 'FAI
6ca0: 4c 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 L'.
6cb0: 20 20 20 20 20 20 20 20 20 57 48 45 4e 20 28 53 WHEN (S
6cc0: 45 4c 45 43 54 20 70 61 73 73 5f 63 6f 75 6e 74 ELECT pass_count
6cd0: 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 FROM tests WHER
6ce0: 45 20 69 64 3d 3f 29 20 3e 20 30 0a 20 20 20 20 E id=?) > 0.
6cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
6d00: 20 20 20 20 20 54 48 45 4e 20 27 50 41 53 53 27 THEN 'PASS'
6d10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 .
6d20: 20 20 20 20 20 20 20 45 4c 53 45 20 73 74 61 74 ELSE stat
6d30: 75 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 us.
6d40: 20 20 20 20 20 45 4e 44 20 57 48 45 52 45 20 69 END WHERE i
6d50: 64 3d 3f 3b 22 0a 20 20 20 74 65 73 74 2d 69 64 d=?;". test-id
6d60: 20 74 65 73 74 2d 69 64 20 74 65 73 74 2d 69 64 test-id test-id
6d70: 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a ))..(define (db:
6d80: 67 65 74 2d 70 72 65 76 2d 74 6f 6c 2d 66 6f 72 get-prev-tol-for
6d90: 2d 74 65 73 74 20 64 62 20 74 65 73 74 2d 69 64 -test db test-id
6da0: 20 63 61 74 65 67 6f 72 79 20 76 61 72 69 61 62 category variab
6db0: 6c 65 29 0a 20 20 3b 3b 20 46 69 6e 69 73 68 20 le). ;; Finish
6dc0: 6d 65 3f 0a 20 20 28 76 61 6c 75 65 73 20 23 66 me?. (values #f
6dd0: 20 23 66 20 23 66 29 29 0a 0a 3b 3b 3d 3d 3d 3d #f #f))..;;====
6de0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
6df0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
6e00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
6e10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
6e20: 3d 3d 0a 3b 3b 20 53 20 54 20 45 20 50 20 53 20 ==.;; S T E P S
6e30: 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d .;;=============
6e40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
6e50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
6e60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
6e70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65 66 69 =========..(defi
6e80: 6e 65 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d ne (db:step-get-
6e90: 74 69 6d 65 2d 61 73 2d 73 74 72 69 6e 67 20 76 time-as-string v
6ea0: 65 63 29 0a 20 20 20 20 28 73 65 63 6f 6e 64 73 ec). (seconds
6eb0: 2d 3e 74 69 6d 65 2d 73 74 72 69 6e 67 20 28 64 ->time-string (d
6ec0: 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 b:step-get-event
6ed0: 5f 74 69 6d 65 20 76 65 63 29 29 29 0a 0a 3b 3b _time vec)))..;;
6ee0: 20 64 62 2d 67 65 74 2d 74 65 73 74 2d 73 74 65 db-get-test-ste
6ef0: 70 73 2d 66 6f 72 2d 72 75 6e 0a 28 64 65 66 69 ps-for-run.(defi
6f00: 6e 65 20 28 64 62 3a 67 65 74 2d 73 74 65 70 73 ne (db:get-steps
6f10: 2d 66 6f 72 2d 74 65 73 74 20 64 62 20 74 65 73 -for-test db tes
6f20: 74 2d 69 64 29 0a 20 20 28 6c 65 74 20 28 28 72 t-id). (let ((r
6f30: 65 73 20 27 28 29 29 29 0a 20 20 20 20 28 73 71 es '())). (sq
6f40: 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 lite3:for-each-r
6f50: 6f 77 20 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 ow . (lambda
6f60: 20 28 69 64 20 74 65 73 74 2d 69 64 20 73 74 65 (id test-id ste
6f70: 70 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61 74 pname state stat
6f80: 75 73 20 65 76 65 6e 74 2d 74 69 6d 65 20 6c 6f us event-time lo
6f90: 67 66 69 6c 65 29 0a 20 20 20 20 20 20 20 28 73 gfile). (s
6fa0: 65 74 21 20 72 65 73 20 28 63 6f 6e 73 20 28 76 et! res (cons (v
6fb0: 65 63 74 6f 72 20 69 64 20 74 65 73 74 2d 69 64 ector id test-id
6fc0: 20 73 74 65 70 6e 61 6d 65 20 73 74 61 74 65 20 stepname state
6fd0: 73 74 61 74 75 73 20 65 76 65 6e 74 2d 74 69 6d status event-tim
6fe0: 65 20 28 69 66 20 28 73 74 72 69 6e 67 3f 20 6c e (if (string? l
6ff0: 6f 67 66 69 6c 65 29 20 6c 6f 67 66 69 6c 65 20 ogfile) logfile
7000: 22 22 29 29 20 72 65 73 29 29 29 0a 20 20 20 20 "")) res))).
7010: 20 64 62 0a 20 20 20 20 20 22 53 45 4c 45 43 54 db. "SELECT
7020: 20 69 64 2c 74 65 73 74 5f 69 64 2c 73 74 65 70 id,test_id,step
7030: 6e 61 6d 65 2c 73 74 61 74 65 2c 73 74 61 74 75 name,state,statu
7040: 73 2c 65 76 65 6e 74 5f 74 69 6d 65 2c 6c 6f 67 s,event_time,log
7050: 66 69 6c 65 20 46 52 4f 4d 20 74 65 73 74 5f 73 file FROM test_s
7060: 74 65 70 73 20 57 48 45 52 45 20 74 65 73 74 5f teps WHERE test_
7070: 69 64 3d 3f 20 4f 52 44 45 52 20 42 59 20 69 64 id=? ORDER BY id
7080: 20 41 53 43 3b 22 20 3b 3b 20 65 76 65 6e 74 5f ASC;" ;; event_
7090: 74 69 6d 65 20 44 45 53 43 2c 69 64 20 41 53 43 time DESC,id ASC
70a0: 3b 0a 20 20 20 20 20 74 65 73 74 2d 69 64 29 0a ;. test-id).
70b0: 20 20 20 20 28 72 65 76 65 72 73 65 20 72 65 73 (reverse res
70c0: 29 29 29 0a 0a 3b 3b 20 67 65 74 20 61 20 70 72 )))..;; get a pr
70d0: 65 74 74 79 20 74 61 62 6c 65 20 74 6f 20 73 75 etty table to su
70e0: 6d 6d 61 72 69 7a 65 20 73 74 65 70 73 0a 3b 3b mmarize steps.;;
70f0: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 .(define (db:get
7100: 2d 73 74 65 70 73 2d 74 61 62 6c 65 20 64 62 20 -steps-table db
7110: 74 65 73 74 2d 69 64 29 0a 20 20 28 6c 65 74 20 test-id). (let
7120: 28 28 73 74 65 70 73 20 20 20 28 64 62 3a 67 65 ((steps (db:ge
7130: 74 2d 73 74 65 70 73 2d 66 6f 72 2d 74 65 73 74 t-steps-for-test
7140: 20 64 62 20 74 65 73 74 2d 69 64 29 29 29 0a 20 db test-id))).
7150: 20 20 20 3b 3b 20 6f 72 67 61 6e 69 73 65 20 74 ;; organise t
7160: 68 65 20 73 74 65 70 73 20 66 6f 72 20 62 65 74 he steps for bet
7170: 74 65 72 20 72 65 61 64 61 62 69 6c 69 74 79 0a ter readability.
7180: 20 20 20 20 28 6c 65 74 20 28 28 72 65 73 20 28 (let ((res (
7190: 6d 61 6b 65 2d 68 61 73 68 2d 74 61 62 6c 65 29 make-hash-table)
71a0: 29 29 0a 20 20 20 20 20 20 28 66 6f 72 2d 65 61 )). (for-ea
71b0: 63 68 20 0a 20 20 20 20 20 20 20 28 6c 61 6d 62 ch . (lamb
71c0: 64 61 20 28 73 74 65 70 29 0a 09 20 28 64 65 62 da (step).. (deb
71d0: 75 67 3a 70 72 69 6e 74 20 36 20 22 73 74 65 70 ug:print 6 "step
71e0: 3d 22 20 73 74 65 70 29 0a 09 20 28 6c 65 74 20 =" step).. (let
71f0: 28 28 72 65 63 6f 72 64 20 28 68 61 73 68 2d 74 ((record (hash-t
7200: 61 62 6c 65 2d 72 65 66 2f 64 65 66 61 75 6c 74 able-ref/default
7210: 20 0a 09 09 09 72 65 73 20 0a 09 09 09 28 64 62 ....res ....(db
7220: 3a 73 74 65 70 2d 67 65 74 2d 73 74 65 70 6e 61 :step-get-stepna
7230: 6d 65 20 73 74 65 70 29 20 0a 09 09 09 3b 3b 20 me step) ....;;
7240: 20 20 20 20 20 20 20 73 74 65 70 6e 61 6d 65 20 stepname
7250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 s
7260: 74 61 72 74 20 65 6e 64 20 73 74 61 74 75 73 20 tart end status
7270: 20 20 20 0a 09 09 09 28 76 65 63 74 6f 72 20 28 ....(vector (
7280: 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 65 70 db:step-get-step
7290: 6e 61 6d 65 20 73 74 65 70 29 20 22 22 20 20 20 name step) ""
72a0: 22 22 20 22 22 20 20 20 20 20 22 22 20 22 22 29 "" "" "" "")
72b0: 29 29 29 0a 09 20 20 20 28 64 65 62 75 67 3a 70 ))).. (debug:p
72c0: 72 69 6e 74 20 36 20 22 72 65 63 6f 72 64 28 62 rint 6 "record(b
72d0: 65 66 6f 72 65 29 20 3d 20 22 20 72 65 63 6f 72 efore) = " recor
72e0: 64 20 0a 09 09 09 22 5c 6e 69 64 3a 20 20 20 20 d ...."\nid:
72f0: 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65 " (db:step-ge
7300: 74 2d 69 64 20 73 74 65 70 29 0a 09 09 09 22 5c t-id step)...."\
7310: 6e 73 74 65 70 6e 61 6d 65 3a 20 22 20 28 64 62 nstepname: " (db
7320: 3a 73 74 65 70 2d 67 65 74 2d 73 74 65 70 6e 61 :step-get-stepna
7330: 6d 65 20 73 74 65 70 29 0a 09 09 09 22 5c 6e 73 me step)...."\ns
7340: 74 61 74 65 3a 20 20 20 20 22 20 28 64 62 3a 73 tate: " (db:s
7350: 74 65 70 2d 67 65 74 2d 73 74 61 74 65 20 73 74 tep-get-state st
7360: 65 70 29 0a 09 09 09 22 5c 6e 73 74 61 74 75 73 ep)...."\nstatus
7370: 3a 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d 67 : " (db:step-g
7380: 65 74 2d 73 74 61 74 75 73 20 73 74 65 70 29 0a et-status step).
7390: 09 09 09 22 5c 6e 74 69 6d 65 3a 20 20 20 20 20 ..."\ntime:
73a0: 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 " (db:step-get-e
73b0: 76 65 6e 74 5f 74 69 6d 65 20 73 74 65 70 29 29 vent_time step))
73c0: 0a 09 20 20 20 28 63 61 73 65 20 28 73 74 72 69 .. (case (stri
73d0: 6e 67 2d 3e 73 79 6d 62 6f 6c 20 28 64 62 3a 73 ng->symbol (db:s
73e0: 74 65 70 2d 67 65 74 2d 73 74 61 74 65 20 73 74 tep-get-state st
73f0: 65 70 29 29 0a 09 20 20 20 20 20 28 28 73 74 61 ep)).. ((sta
7400: 72 74 29 28 76 65 63 74 6f 72 2d 73 65 74 21 20 rt)(vector-set!
7410: 72 65 63 6f 72 64 20 31 20 28 64 62 3a 73 74 65 record 1 (db:ste
7420: 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 p-get-event_time
7430: 20 73 74 65 70 29 29 0a 09 20 20 20 20 20 20 28 step)).. (
7440: 76 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f vector-set! reco
7450: 72 64 20 33 20 28 69 66 20 28 65 71 75 61 6c 3f rd 3 (if (equal?
7460: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 72 65 63 (vector-ref rec
7470: 6f 72 64 20 33 29 20 22 22 29 0a 09 09 09 09 09 ord 3) "")......
7480: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 (db:step-get-sta
7490: 74 75 73 20 73 74 65 70 29 29 29 0a 09 20 20 20 tus step)))..
74a0: 20 20 20 28 69 66 20 28 3e 20 28 73 74 72 69 6e (if (> (strin
74b0: 67 2d 6c 65 6e 67 74 68 20 28 64 62 3a 73 74 65 g-length (db:ste
74c0: 70 2d 67 65 74 2d 6c 6f 67 66 69 6c 65 20 73 74 p-get-logfile st
74d0: 65 70 29 29 0a 09 09 20 20 20 20 20 30 29 0a 09 ep))... 0)..
74e0: 09 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 . (vector-set!
74f0: 72 65 63 6f 72 64 20 35 20 28 64 62 3a 73 74 65 record 5 (db:ste
7500: 70 2d 67 65 74 2d 6c 6f 67 66 69 6c 65 20 73 74 p-get-logfile st
7510: 65 70 29 29 29 29 0a 09 20 20 20 20 20 28 28 65 ep)))).. ((e
7520: 6e 64 29 20 20 0a 09 20 20 20 20 20 20 28 76 65 nd) .. (ve
7530: 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64 ctor-set! record
7540: 20 32 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 20 2 (any->number
7550: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 (db:step-get-eve
7560: 6e 74 5f 74 69 6d 65 20 73 74 65 70 29 29 29 0a nt_time step))).
7570: 09 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73 . (vector-s
7580: 65 74 21 20 72 65 63 6f 72 64 20 33 20 28 64 62 et! record 3 (db
7590: 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 74 75 73 :step-get-status
75a0: 20 73 74 65 70 29 29 0a 09 20 20 20 20 20 20 28 step)).. (
75b0: 76 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f vector-set! reco
75c0: 72 64 20 34 20 28 6c 65 74 20 28 28 73 74 61 72 rd 4 (let ((star
75d0: 74 74 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 20 tt (any->number
75e0: 28 76 65 63 74 6f 72 2d 72 65 66 20 72 65 63 6f (vector-ref reco
75f0: 72 64 20 31 29 29 29 0a 09 09 09 09 09 20 20 28 rd 1)))...... (
7600: 65 6e 64 74 20 20 20 28 61 6e 79 2d 3e 6e 75 6d endt (any->num
7610: 62 65 72 20 28 76 65 63 74 6f 72 2d 72 65 66 20 ber (vector-ref
7620: 72 65 63 6f 72 64 20 32 29 29 29 29 0a 09 09 09 record 2))))....
7630: 09 20 20 20 20 20 20 28 64 65 62 75 67 3a 70 72 . (debug:pr
7640: 69 6e 74 20 34 20 22 72 65 63 6f 72 64 5b 31 5d int 4 "record[1]
7650: 3d 22 20 28 76 65 63 74 6f 72 2d 72 65 66 20 72 =" (vector-ref r
7660: 65 63 6f 72 64 20 31 29 20 0a 09 09 09 09 09 09 ecord 1) .......
7670: 20 20 20 22 2c 20 73 74 61 72 74 74 3d 22 20 73 ", startt=" s
7680: 74 61 72 74 74 20 22 2c 20 65 6e 64 74 3d 22 20 tartt ", endt="
7690: 65 6e 64 74 0a 09 09 09 09 09 09 20 20 20 22 2c endt....... ",
76a0: 20 67 65 74 2d 73 74 61 74 75 73 3a 20 22 20 28 get-status: " (
76b0: 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 74 db:step-get-stat
76c0: 75 73 20 73 74 65 70 29 29 0a 09 09 09 09 20 20 us step)).....
76d0: 20 20 20 20 28 69 66 20 28 61 6e 64 20 28 6e 75 (if (and (nu
76e0: 6d 62 65 72 3f 20 73 74 61 72 74 74 29 28 6e 75 mber? startt)(nu
76f0: 6d 62 65 72 3f 20 65 6e 64 74 29 29 0a 09 09 09 mber? endt))....
7700: 09 09 20 20 28 73 65 63 6f 6e 64 73 2d 3e 68 72 .. (seconds->hr
7710: 2d 6d 69 6e 2d 73 65 63 20 28 2d 20 65 6e 64 74 -min-sec (- endt
7720: 20 73 74 61 72 74 74 29 29 20 22 2d 31 22 29 29 startt)) "-1"))
7730: 29 0a 09 20 20 20 20 20 20 28 69 66 20 28 3e 20 ).. (if (>
7740: 28 73 74 72 69 6e 67 2d 6c 65 6e 67 74 68 20 28 (string-length (
7750: 64 62 3a 73 74 65 70 2d 67 65 74 2d 6c 6f 67 66 db:step-get-logf
7760: 69 6c 65 20 73 74 65 70 29 29 0a 09 09 20 20 20 ile step))...
7770: 20 20 30 29 0a 09 09 20 20 28 76 65 63 74 6f 72 0)... (vector
7780: 2d 73 65 74 21 20 72 65 63 6f 72 64 20 35 20 28 -set! record 5 (
7790: 64 62 3a 73 74 65 70 2d 67 65 74 2d 6c 6f 67 66 db:step-get-logf
77a0: 69 6c 65 20 73 74 65 70 29 29 29 29 0a 09 20 20 ile step))))..
77b0: 20 20 20 28 65 6c 73 65 0a 09 20 20 20 20 20 20 (else..
77c0: 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72 (vector-set! r
77d0: 65 63 6f 72 64 20 32 20 28 64 62 3a 73 74 65 70 ecord 2 (db:step
77e0: 2d 67 65 74 2d 73 74 61 74 65 20 73 74 65 70 29 -get-state step)
77f0: 29 0a 09 20 20 20 20 20 20 20 20 28 76 65 63 74 ).. (vect
7800: 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 33 or-set! record 3
7810: 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 (db:step-get-st
7820: 61 74 75 73 20 73 74 65 70 29 29 0a 09 20 20 20 atus step))..
7830: 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 (vector-set
7840: 21 20 72 65 63 6f 72 64 20 34 20 28 64 62 3a 73 ! record 4 (db:s
7850: 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 tep-get-event_ti
7860: 6d 65 20 73 74 65 70 29 29 29 29 0a 09 20 20 20 me step))))..
7870: 28 68 61 73 68 2d 74 61 62 6c 65 2d 73 65 74 21 (hash-table-set!
7880: 20 72 65 73 20 28 64 62 3a 73 74 65 70 2d 67 65 res (db:step-ge
7890: 74 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70 29 t-stepname step)
78a0: 20 72 65 63 6f 72 64 29 0a 09 20 20 20 28 64 65 record).. (de
78b0: 62 75 67 3a 70 72 69 6e 74 20 36 20 22 72 65 63 bug:print 6 "rec
78c0: 6f 72 64 28 61 66 74 65 72 29 20 20 3d 20 22 20 ord(after) = "
78d0: 72 65 63 6f 72 64 20 0a 09 09 09 22 5c 6e 69 64 record ...."\nid
78e0: 3a 20 20 20 20 20 20 20 22 20 28 64 62 3a 73 74 : " (db:st
78f0: 65 70 2d 67 65 74 2d 69 64 20 73 74 65 70 29 0a ep-get-id step).
7900: 09 09 09 22 5c 6e 73 74 65 70 6e 61 6d 65 3a 20 ..."\nstepname:
7910: 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 " (db:step-get-s
7920: 74 65 70 6e 61 6d 65 20 73 74 65 70 29 0a 09 09 tepname step)...
7930: 09 22 5c 6e 73 74 61 74 65 3a 20 20 20 20 22 20 ."\nstate: "
7940: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 (db:step-get-sta
7950: 74 65 20 73 74 65 70 29 0a 09 09 09 22 5c 6e 73 te step)...."\ns
7960: 74 61 74 75 73 3a 20 20 20 22 20 28 64 62 3a 73 tatus: " (db:s
7970: 74 65 70 2d 67 65 74 2d 73 74 61 74 75 73 20 73 tep-get-status s
7980: 74 65 70 29 0a 09 09 09 22 5c 6e 74 69 6d 65 3a tep)...."\ntime:
7990: 20 20 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d " (db:step-
79a0: 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73 get-event_time s
79b0: 74 65 70 29 29 29 29 0a 20 20 20 20 20 20 20 3b tep)))). ;
79c0: 3b 20 28 65 6c 73 65 20 20 20 28 76 65 63 74 6f ; (else (vecto
79d0: 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 31 20 r-set! record 1
79e0: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 (db:step-get-eve
79f0: 6e 74 5f 74 69 6d 65 20 73 74 65 70 29 29 29 0a nt_time step))).
7a00: 20 20 20 20 20 20 20 28 73 6f 72 74 20 73 74 65 (sort ste
7a10: 70 73 20 28 6c 61 6d 62 64 61 20 28 61 20 62 29 ps (lambda (a b)
7a20: 28 3c 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d (< (db:step-get-
7a30: 65 76 65 6e 74 5f 74 69 6d 65 20 61 29 28 64 62 event_time a)(db
7a40: 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f :step-get-event_
7a50: 74 69 6d 65 20 62 29 29 29 29 29 0a 20 20 20 20 time b))))).
7a60: 20 20 72 65 73 29 29 29 0a 0a 3b 3b 20 55 53 45 res)))..;; USE
7a70: 3a 20 28 6c 73 65 74 2d 64 69 66 66 65 72 65 6e : (lset-differen
7a80: 63 65 20 73 74 72 69 6e 67 3d 3f 20 27 28 22 61 ce string=? '("a
7a90: 22 20 22 62 22 20 22 63 22 29 20 27 28 22 64 22 " "b" "c") '("d"
7aa0: 20 22 63 22 20 22 65 22 20 22 61 22 29 29 0a 3b "c" "e" "a")).;
7ab0: 3b 0a 3b 3b 20 52 65 74 75 72 6e 20 61 20 6c 69 ;.;; Return a li
7ac0: 73 74 20 6f 66 20 70 72 65 72 65 71 73 20 74 68 st of prereqs th
7ad0: 61 74 20 77 65 72 65 20 4e 4f 54 20 6d 65 74 0a at were NOT met.
7ae0: 3b 3b 20 20 54 65 73 74 73 20 28 61 6e 64 20 61 ;; Tests (and a
7af0: 6c 6c 20 69 74 65 6d 73 29 20 69 6e 20 77 61 69 ll items) in wai
7b00: 74 6f 6e 20 6c 69 73 74 20 6d 75 73 74 20 62 65 ton list must be
7b10: 20 22 43 4f 4d 50 4c 45 54 45 44 22 20 61 6e 64 "COMPLETED" and
7b20: 20 22 50 41 53 53 22 0a 28 64 65 66 69 6e 65 20 "PASS".(define
7b30: 28 64 62 2d 67 65 74 2d 70 72 65 72 65 71 73 2d (db-get-prereqs-
7b40: 6e 6f 74 2d 6d 65 74 20 64 62 20 72 75 6e 2d 69 not-met db run-i
7b50: 64 20 77 61 69 74 6f 6e 29 0a 20 20 28 69 66 20 d waiton). (if
7b60: 28 6e 75 6c 6c 3f 20 77 61 69 74 6f 6e 29 0a 20 (null? waiton).
7b70: 20 20 20 20 20 27 28 29 0a 20 20 20 20 20 20 28 '(). (
7b80: 6c 65 74 2a 20 28 28 75 6e 6d 65 74 2d 70 72 65 let* ((unmet-pre
7b90: 2d 72 65 71 73 20 27 28 29 29 0a 09 20 20 20 20 -reqs '())..
7ba0: 20 28 74 65 73 74 73 20 20 20 20 20 20 20 20 20 (tests
7bb0: 20 20 28 64 62 2d 67 65 74 2d 74 65 73 74 73 2d (db-get-tests-
7bc0: 66 6f 72 2d 72 75 6e 20 64 62 20 72 75 6e 2d 69 for-run db run-i
7bd0: 64 20 23 66 20 23 66 20 27 28 29 20 27 28 29 29 d #f #f '() '())
7be0: 29 0a 09 20 20 20 20 20 28 72 65 73 75 6c 74 20 ).. (result
7bf0: 20 20 20 20 20 20 20 20 27 28 29 29 29 0a 09 28 '()))..(
7c00: 66 6f 72 2d 65 61 63 68 20 28 6c 61 6d 62 64 61 for-each (lambda
7c10: 20 28 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d (waitontest-nam
7c20: 65 29 0a 09 09 20 20 20 20 28 6c 65 74 20 28 28 e)... (let ((
7c30: 65 76 65 72 2d 73 65 65 6e 20 23 66 29 29 0a 09 ever-seen #f))..
7c40: 09 20 20 20 20 20 20 28 66 6f 72 2d 65 61 63 68 . (for-each
7c50: 20 28 6c 61 6d 62 64 61 20 28 74 65 73 74 29 0a (lambda (test).
7c60: 09 09 09 09 20 20 28 69 66 20 28 65 71 75 61 6c .... (if (equal
7c70: 3f 20 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d ? waitontest-nam
7c80: 65 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 74 e (db:test-get-t
7c90: 65 73 74 6e 61 6d 65 20 74 65 73 74 29 29 0a 09 estname test))..
7ca0: 09 09 09 20 20 20 20 20 20 28 62 65 67 69 6e 0a ... (begin.
7cb0: 09 09 09 09 09 28 73 65 74 21 20 65 76 65 72 2d .....(set! ever-
7cc0: 73 65 65 6e 20 23 74 29 0a 09 09 09 09 09 28 69 seen #t)......(i
7cd0: 66 20 28 6e 6f 74 20 28 61 6e 64 20 28 65 71 75 f (not (and (equ
7ce0: 61 6c 3f 20 28 64 62 3a 74 65 73 74 2d 67 65 74 al? (db:test-get
7cf0: 2d 73 74 61 74 65 20 74 65 73 74 29 20 22 43 4f -state test) "CO
7d00: 4d 50 4c 45 54 45 44 22 29 0a 09 09 09 09 09 09 MPLETED").......
7d10: 20 20 20 20 20 20 28 6d 65 6d 62 65 72 20 28 64 (member (d
7d20: 62 3a 74 65 73 74 2d 67 65 74 2d 73 74 61 74 75 b:test-get-statu
7d30: 73 20 74 65 73 74 29 20 27 28 22 50 41 53 53 22 s test) '("PASS"
7d40: 20 22 57 41 52 4e 22 20 22 43 48 45 43 4b 22 29 "WARN" "CHECK")
7d50: 29 29 29 0a 09 09 09 09 09 20 20 20 20 28 73 65 )))...... (se
7d60: 74 21 20 72 65 73 75 6c 74 20 28 63 6f 6e 73 20 t! result (cons
7d70: 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 20 waitontest-name
7d80: 72 65 73 75 6c 74 29 29 29 29 29 29 0a 09 09 09 result))))))....
7d90: 09 74 65 73 74 73 29 0a 09 09 20 20 20 20 20 20 .tests)...
7da0: 28 69 66 20 28 6e 6f 74 20 65 76 65 72 2d 73 65 (if (not ever-se
7db0: 65 6e 29 28 73 65 74 21 20 72 65 73 75 6c 74 20 en)(set! result
7dc0: 28 63 6f 6e 73 20 77 61 69 74 6f 6e 74 65 73 74 (cons waitontest
7dd0: 2d 6e 61 6d 65 20 72 65 73 75 6c 74 29 29 29 29 -name result))))
7de0: 29 0a 09 09 20 20 77 61 69 74 6f 6e 29 0a 09 28 )... waiton)..(
7df0: 64 65 6c 65 74 65 2d 64 75 70 6c 69 63 61 74 65 delete-duplicate
7e00: 73 20 72 65 73 75 6c 74 29 29 29 29 0a 0a 3b 3b s result))))..;;
7e10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7e20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7e30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7e40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
7e50: 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 45 78 74 72 61 63 ======.;; Extrac
7e60: 74 20 6f 64 73 20 66 69 6c 65 20 66 72 6f 6d 20 t ods file from
7e70: 74 68 65 20 64 62 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d the db.;;=======
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 3d 3d 3d 3d 0a ===============.
7ec0: 0a 3b 3b 20 72 75 6e 73 70 61 74 74 20 69 73 20 .;; runspatt is
7ed0: 61 20 63 6f 6d 6d 61 20 64 65 6c 69 6d 69 74 65 a comma delimite
7ee0: 64 20 6c 69 73 74 20 6f 66 20 72 75 6e 20 70 61 d list of run pa
7ef0: 74 74 65 72 6e 73 0a 3b 3b 20 6b 65 79 70 61 74 tterns.;; keypat
7f00: 74 2d 61 6c 69 73 74 20 6d 75 73 74 20 63 6f 6e t-alist must con
7f10: 74 61 69 6e 20 2a 61 6c 6c 2a 20 6b 65 79 73 20 tain *all* keys
7f20: 77 69 74 68 20 61 6e 20 61 73 73 6f 63 69 61 74 with an associat
7f30: 65 64 20 70 61 74 74 65 72 6e 3a 20 27 28 20 28 ed pattern: '( (
7f40: 22 4b 45 59 31 22 20 22 25 22 29 20 2e 2e 20 29 "KEY1" "%") .. )
7f50: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 65 78 74 .(define (db:ext
7f60: 72 61 63 74 2d 6f 64 73 2d 66 69 6c 65 20 64 62 ract-ods-file db
7f70: 20 6f 75 74 70 75 74 66 69 6c 65 20 6b 65 79 70 outputfile keyp
7f80: 61 74 74 2d 61 6c 69 73 74 20 72 75 6e 73 70 61 att-alist runspa
7f90: 74 74 20 70 61 74 68 6d 6f 64 29 0a 20 20 28 6c tt pathmod). (l
7fa0: 65 74 2a 20 28 28 6b 65 79 73 73 74 72 20 20 28 et* ((keysstr (
7fb0: 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 string-intersper
7fc0: 73 65 20 28 6d 61 70 20 63 61 72 20 6b 65 79 70 se (map car keyp
7fd0: 61 74 74 2d 61 6c 69 73 74 29 20 22 2c 22 29 29 att-alist) ","))
7fe0: 0a 09 20 28 6b 65 79 71 72 79 20 20 20 28 73 74 .. (keyqry (st
7ff0: 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 ring-intersperse
8000: 20 28 6d 61 70 20 28 6c 61 6d 62 64 61 20 28 70 (map (lambda (p
8010: 29 28 63 6f 6e 63 20 28 63 61 72 20 70 29 20 22 )(conc (car p) "
8020: 20 4c 49 4b 45 20 3f 20 22 29 29 20 6b 65 79 70 LIKE ? ")) keyp
8030: 61 74 74 2d 61 6c 69 73 74 29 20 22 20 41 4e 44 att-alist) " AND
8040: 20 22 29 29 0a 09 20 28 6e 75 6d 6b 65 79 73 20 ")).. (numkeys
8050: 20 28 6c 65 6e 67 74 68 20 6b 65 79 70 61 74 74 (length keypatt
8060: 2d 61 6c 69 73 74 29 29 0a 09 20 28 74 65 73 74 -alist)).. (test
8070: 2d 69 64 73 20 27 28 29 29 0a 09 20 28 77 69 6e -ids '()).. (win
8080: 64 6f 77 73 20 20 28 61 6e 64 20 70 61 74 68 6d dows (and pathm
8090: 6f 64 20 28 73 75 62 73 74 72 69 6e 67 2d 69 6e od (substring-in
80a0: 64 65 78 20 22 5c 5c 22 20 70 61 74 68 6d 6f 64 dex "\\" pathmod
80b0: 29 29 29 0a 09 20 28 74 65 6d 70 64 69 72 20 20 ))).. (tempdir
80c0: 28 63 6f 6e 63 20 22 2f 74 6d 70 2f 22 20 28 63 (conc "/tmp/" (c
80d0: 75 72 72 65 6e 74 2d 75 73 65 72 2d 6e 61 6d 65 urrent-user-name
80e0: 29 20 22 2f 22 20 72 75 6e 73 70 61 74 74 20 22 ) "/" runspatt "
80f0: 5f 22 20 28 72 61 6e 64 6f 6d 20 31 30 30 30 30 _" (random 10000
8100: 29 20 22 5f 22 20 28 63 75 72 72 65 6e 74 2d 70 ) "_" (current-p
8110: 72 6f 63 65 73 73 2d 69 64 29 29 29 0a 09 20 28 rocess-id))).. (
8120: 72 75 6e 73 68 65 61 64 65 72 20 28 61 70 70 65 runsheader (appe
8130: 6e 64 20 28 6c 69 73 74 20 22 52 75 6e 20 49 64 nd (list "Run Id
8140: 22 20 22 52 75 6e 6e 61 6d 65 22 29 20 3b 20 30 " "Runname") ; 0
8150: 20 31 0a 09 09 09 20 20 20 20 20 28 6d 61 70 20 1.... (map
8160: 63 61 72 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 car keypatt-alis
8170: 74 29 20 20 20 3b 20 2b 20 4e 20 3d 20 6c 65 6e t) ; + N = len
8180: 67 74 68 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 gth keypatt-alis
8190: 74 0a 09 09 09 20 20 20 20 20 28 6c 69 73 74 20 t.... (list
81a0: 22 54 65 73 74 6e 61 6d 65 22 20 20 20 20 20 20 "Testname"
81b0: 20 20 20 20 3b 20 32 0a 09 09 09 09 20 20 20 22 ; 2..... "
81c0: 49 74 65 6d 20 50 61 74 68 22 20 20 20 20 20 20 Item Path"
81d0: 20 20 20 3b 20 33 20 0a 09 09 09 09 20 20 20 22 ; 3 ..... "
81e0: 44 65 73 63 72 69 70 74 69 6f 6e 22 20 20 20 20 Description"
81f0: 20 20 20 3b 20 34 20 0a 09 09 09 09 20 20 20 22 ; 4 ..... "
8200: 53 74 61 74 65 22 20 20 20 20 20 20 20 20 20 20 State"
8210: 20 20 20 3b 20 35 20 0a 09 09 09 09 20 20 20 22 ; 5 ..... "
8220: 53 74 61 74 75 73 22 20 20 20 20 20 20 20 20 20 Status"
8230: 20 20 20 3b 20 36 20 20 0a 09 09 09 09 20 20 20 ; 6 .....
8240: 22 46 69 6e 61 6c 20 4c 6f 67 22 20 20 20 20 20 "Final Log"
8250: 20 20 20 20 3b 20 37 20 0a 09 09 09 09 20 20 20 ; 7 .....
8260: 22 52 75 6e 20 44 75 72 61 74 69 6f 6e 22 20 20 "Run Duration"
8270: 20 20 20 20 3b 20 38 20 0a 09 09 09 09 20 20 20 ; 8 .....
8280: 22 57 68 65 6e 20 52 75 6e 22 20 20 20 20 20 20 "When Run"
8290: 20 20 20 20 3b 20 39 20 0a 09 09 09 09 20 20 20 ; 9 .....
82a0: 22 54 61 67 73 22 20 20 20 20 20 20 20 20 20 20 "Tags"
82b0: 20 20 20 20 3b 20 31 30 0a 09 09 09 09 20 20 20 ; 10.....
82c0: 22 52 75 6e 20 4f 77 6e 65 72 22 20 20 20 20 20 "Run Owner"
82d0: 20 20 20 20 3b 20 31 31 0a 09 09 09 09 20 20 20 ; 11.....
82e0: 22 43 6f 6d 6d 65 6e 74 22 20 20 20 20 20 20 20 "Comment"
82f0: 20 20 20 20 3b 20 31 32 0a 09 09 09 09 20 20 20 ; 12.....
8300: 22 41 75 74 68 6f 72 22 20 20 20 20 20 20 20 20 "Author"
8310: 20 20 20 20 3b 20 31 33 0a 09 09 09 09 20 20 20 ; 13.....
8320: 22 54 65 73 74 20 4f 77 6e 65 72 22 20 20 20 20 "Test Owner"
8330: 20 20 20 20 3b 20 31 34 0a 09 09 09 09 20 20 20 ; 14.....
8340: 22 52 65 76 69 65 77 65 64 22 20 20 20 20 20 20 "Reviewed"
8350: 20 20 20 20 3b 20 31 35 0a 09 09 09 09 20 20 20 ; 15.....
8360: 22 44 69 73 6b 66 72 65 65 22 20 20 20 20 20 20 "Diskfree"
8370: 20 20 20 20 3b 20 31 36 0a 09 09 09 09 20 20 20 ; 16.....
8380: 22 55 6e 61 6d 65 22 20 20 20 20 20 20 20 20 20 "Uname"
8390: 20 20 20 20 3b 20 31 37 0a 09 09 09 09 20 20 20 ; 17.....
83a0: 22 52 75 6e 64 69 72 22 20 20 20 20 20 20 20 20 "Rundir"
83b0: 20 20 20 20 3b 20 31 38 0a 09 09 09 09 20 20 20 ; 18.....
83c0: 22 48 6f 73 74 22 20 20 20 20 20 20 20 20 20 20 "Host"
83d0: 20 20 20 20 3b 20 31 39 0a 09 09 09 09 20 20 20 ; 19.....
83e0: 22 43 70 75 20 4c 6f 61 64 22 20 20 20 20 20 20 "Cpu Load"
83f0: 20 20 20 20 3b 20 32 30 0a 09 09 09 09 20 20 20 ; 20.....
8400: 29 29 29 0a 09 20 28 72 65 73 75 6c 74 73 20 28 ))).. (results (
8410: 6c 69 73 74 20 72 75 6e 73 68 65 61 64 65 72 29 list runsheader)
8420: 29 09 09 09 20 0a 09 20 28 74 65 73 74 64 61 74 )... .. (testdat
8430: 61 2d 68 65 61 64 65 72 20 28 6c 69 73 74 20 22 a-header (list "
8440: 52 75 6e 20 49 64 22 20 22 54 65 73 74 6e 61 6d Run Id" "Testnam
8450: 65 22 20 22 49 74 65 6d 20 50 61 74 68 22 20 22 e" "Item Path" "
8460: 43 61 74 65 67 6f 72 79 22 20 22 56 61 72 69 61 Category" "Varia
8470: 62 6c 65 22 20 22 56 61 6c 75 65 22 20 22 45 78 ble" "Value" "Ex
8480: 70 65 63 74 65 64 22 20 22 54 6f 6c 22 20 22 55 pected" "Tol" "U
8490: 6e 69 74 73 22 20 22 53 74 61 74 75 73 22 20 22 nits" "Status" "
84a0: 43 6f 6d 6d 65 6e 74 22 29 29 29 0a 20 20 20 20 Comment"))).
84b0: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 32 20 22 (debug:print 2 "
84c0: 55 73 69 6e 67 20 22 20 74 65 6d 70 64 69 72 20 Using " tempdir
84d0: 22 20 66 6f 72 20 63 6f 6e 73 74 72 75 63 74 69 " for constructi
84e0: 6e 67 20 74 68 65 20 6f 64 73 20 66 69 6c 65 2e ng the ods file.
84f0: 20 6b 65 79 71 72 79 3a 20 22 20 6b 65 79 71 72 keyqry: " keyqr
8500: 79 20 22 20 6b 65 79 73 74 72 3a 20 22 20 6b 65 y " keystr: " ke
8510: 79 73 73 74 72 20 22 20 77 69 74 68 20 6b 65 79 ysstr " with key
8520: 73 3a 20 22 20 28 6d 61 70 20 63 61 64 72 20 6b s: " (map cadr k
8530: 65 79 70 61 74 74 2d 61 6c 69 73 74 29 29 0a 20 eypatt-alist)).
8540: 20 20 20 3b 3b 20 22 45 78 70 65 63 74 65 64 20 ;; "Expected
8550: 56 61 6c 75 65 22 0a 20 20 20 20 3b 3b 20 22 56 Value". ;; "V
8560: 61 6c 75 65 20 46 6f 75 6e 64 22 0a 20 20 20 20 alue Found".
8570: 3b 3b 20 22 54 6f 6c 65 72 61 6e 63 65 22 0a 20 ;; "Tolerance".
8580: 20 20 20 28 61 70 70 6c 79 20 73 71 6c 69 74 65 (apply sqlite
8590: 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 3:for-each-row.
85a0: 20 20 20 20 28 6c 61 6d 62 64 61 20 28 74 65 73 (lambda (tes
85b0: 74 2d 69 64 20 2e 20 62 29 0a 20 20 20 20 20 20 t-id . b).
85c0: 20 28 73 65 74 21 20 74 65 73 74 2d 69 64 73 20 (set! test-ids
85d0: 28 63 6f 6e 73 20 74 65 73 74 2d 69 64 20 74 65 (cons test-id te
85e0: 73 74 2d 69 64 73 29 29 20 20 20 3b 3b 20 74 65 st-ids)) ;; te
85f0: 73 74 2d 69 64 20 69 73 20 6e 6f 77 20 74 65 73 st-id is now tes
8600: 74 6e 61 6d 65 0a 20 20 20 20 20 20 20 28 73 65 tname. (se
8610: 74 21 20 72 65 73 75 6c 74 73 20 28 61 70 70 65 t! results (appe
8620: 6e 64 20 72 65 73 75 6c 74 73 20 3b 3b 20 6e 6f nd results ;; no
8630: 74 65 2c 20 64 72 6f 70 20 74 68 65 20 74 65 73 te, drop the tes
8640: 74 2d 69 64 0a 09 09 09 20 20 20 20 20 28 6c 69 t-id.... (li
8650: 73 74 0a 09 09 09 20 20 20 20 20 20 28 69 66 20 st.... (if
8660: 70 61 74 68 6d 6f 64 0a 09 09 09 09 20 20 28 6c pathmod..... (l
8670: 65 74 2a 20 28 28 76 62 20 20 20 20 20 20 20 20 et* ((vb
8680: 28 61 70 70 6c 79 20 76 65 63 74 6f 72 20 62 29 (apply vector b)
8690: 29 0a 09 09 09 09 09 20 28 6b 65 79 76 61 6c 73 )...... (keyvals
86a0: 20 20 20 28 6c 65 74 20 6c 6f 6f 70 20 28 28 69 (let loop ((i
86b0: 20 20 20 20 30 29 0a 09 09 09 09 09 09 09 20 20 0)........
86c0: 20 20 20 20 20 28 72 65 73 20 27 28 29 29 29 0a (res '())).
86d0: 09 09 09 09 09 09 20 20 20 20 20 20 28 69 66 20 ...... (if
86e0: 28 3e 3d 20 69 20 6e 75 6d 6b 65 79 73 29 0a 09 (>= i numkeys)..
86f0: 09 09 09 09 09 09 20 20 72 65 73 0a 09 09 09 09 ...... res.....
8700: 09 09 09 20 20 28 6c 6f 6f 70 20 28 2b 20 69 20 ... (loop (+ i
8710: 31 29 0a 09 09 09 09 09 09 09 09 28 61 70 70 65 1).........(appe
8720: 6e 64 20 72 65 73 20 28 6c 69 73 74 20 28 76 65 nd res (list (ve
8730: 63 74 6f 72 2d 72 65 66 20 76 62 20 28 2b 20 69 ctor-ref vb (+ i
8740: 20 32 29 29 29 29 29 29 29 29 0a 09 09 09 09 09 2))))))))......
8750: 20 28 72 75 6e 6e 61 6d 65 20 20 20 28 76 65 63 (runname (vec
8760: 74 6f 72 2d 72 65 66 20 76 62 20 31 29 29 0a 09 tor-ref vb 1))..
8770: 09 09 09 09 20 28 74 65 73 74 6e 61 6d 65 20 20 .... (testname
8780: 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62 20 28 (vector-ref vb (
8790: 2b 20 20 32 20 6e 75 6d 6b 65 79 73 29 29 29 0a + 2 numkeys))).
87a0: 09 09 09 09 09 20 28 69 74 65 6d 2d 70 61 74 68 ..... (item-path
87b0: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62 20 (vector-ref vb
87c0: 28 2b 20 20 33 20 6e 75 6d 6b 65 79 73 29 29 29 (+ 3 numkeys)))
87d0: 0a 09 09 09 09 09 20 28 66 69 6e 61 6c 2d 6c 6f ...... (final-lo
87e0: 67 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62 g (vector-ref vb
87f0: 20 28 2b 20 20 37 20 6e 75 6d 6b 65 79 73 29 29 (+ 7 numkeys))
8800: 29 0a 09 09 09 09 09 20 28 72 75 6e 2d 64 69 72 )...... (run-dir
8810: 20 20 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76 (vector-ref v
8820: 62 20 28 2b 20 31 38 20 6e 75 6d 6b 65 79 73 29 b (+ 18 numkeys)
8830: 29 29 0a 09 09 09 09 09 20 28 6c 6f 67 2d 66 70 ))...... (log-fp
8840: 61 74 68 20 28 63 6f 6e 63 20 72 75 6e 2d 64 69 ath (conc run-di
8850: 72 20 22 2f 22 20 20 66 69 6e 61 6c 2d 6c 6f 67 r "/" final-log
8860: 29 29 29 20 3b 3b 20 28 73 74 72 69 6e 67 2d 69 ))) ;; (string-i
8870: 6e 74 65 72 73 70 65 72 73 65 20 6b 65 79 76 61 ntersperse keyva
8880: 6c 73 20 22 2f 22 29 20 22 2f 22 20 74 65 73 74 ls "/") "/" test
8890: 6e 61 6d 65 20 22 2f 22 20 69 74 65 6d 2d 70 61 name "/" item-pa
88a0: 74 68 20 22 2f 22 0a 09 09 09 09 20 20 20 20 28 th "/"..... (
88b0: 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22 6c debug:print 4 "l
88c0: 6f 67 3a 20 22 20 6c 6f 67 2d 66 70 61 74 68 20 og: " log-fpath
88d0: 22 20 65 78 69 73 74 73 3a 20 22 20 28 66 69 6c " exists: " (fil
88e0: 65 2d 65 78 69 73 74 73 3f 20 6c 6f 67 2d 66 70 e-exists? log-fp
88f0: 61 74 68 29 29 0a 09 09 09 09 20 20 20 20 28 76 ath))..... (v
8900: 65 63 74 6f 72 2d 73 65 74 21 20 76 62 20 28 2b ector-set! vb (+
8910: 20 37 20 6e 75 6d 6b 65 79 73 29 20 28 69 66 20 7 numkeys) (if
8920: 28 66 69 6c 65 2d 65 78 69 73 74 73 3f 20 6c 6f (file-exists? lo
8930: 67 2d 66 70 61 74 68 29 0a 09 09 09 09 09 09 09 g-fpath)........
8940: 09 20 20 20 20 20 20 28 6c 65 74 20 28 28 6e 65 . (let ((ne
8950: 77 70 61 74 68 20 28 63 6f 6e 63 20 70 61 74 68 wpath (conc path
8960: 6d 6f 64 20 22 2f 22 0a 09 09 09 09 09 09 09 09 mod "/".........
8970: 09 09 09 20 20 20 28 73 74 72 69 6e 67 2d 69 6e ... (string-in
8980: 74 65 72 73 70 65 72 73 65 20 6b 65 79 76 61 6c tersperse keyval
8990: 73 20 22 2f 22 29 0a 09 09 09 09 09 09 09 09 09 s "/")..........
89a0: 09 09 20 20 20 22 2f 22 20 72 75 6e 6e 61 6d 65 .. "/" runname
89b0: 20 22 2f 22 20 74 65 73 74 6e 61 6d 65 20 22 2f "/" testname "/
89c0: 22 0a 09 09 09 09 09 09 09 09 09 09 09 20 20 20 "............
89d0: 28 69 66 20 28 73 74 72 69 6e 67 3d 3f 20 69 74 (if (string=? it
89e0: 65 6d 2d 70 61 74 68 20 22 22 29 20 22 22 20 28 em-path "") "" (
89f0: 63 6f 6e 63 20 22 2f 22 20 69 74 65 6d 2d 70 61 conc "/" item-pa
8a00: 74 68 29 29 0a 09 09 09 09 09 09 09 09 09 09 09 th))............
8a10: 20 20 20 66 69 6e 61 6c 2d 6c 6f 67 29 29 29 0a final-log))).
8a20: 09 09 09 09 09 09 09 09 09 3b 3b 20 66 6f 72 20 .........;; for
8a30: 6e 6f 77 20 74 68 72 6f 77 20 61 77 61 79 20 6e now throw away n
8a40: 65 77 70 61 74 68 20 61 6e 64 20 75 73 65 20 74 ewpath and use t
8a50: 68 65 20 6c 6f 67 2d 66 70 61 74 68 20 63 6f 6e he log-fpath con
8a60: 63 27 64 20 77 69 74 68 20 70 61 74 68 6d 6f 64 c'd with pathmod
8a70: 0a 09 09 09 09 09 09 09 09 09 28 73 65 74 21 20 ..........(set!
8a80: 6e 65 77 70 61 74 68 20 28 63 6f 6e 63 20 70 61 newpath (conc pa
8a90: 74 68 6d 6f 64 20 6c 6f 67 2d 66 70 61 74 68 29 thmod log-fpath)
8aa0: 29 0a 09 09 09 09 09 09 09 09 09 28 69 66 20 77 )..........(if w
8ab0: 69 6e 64 6f 77 73 20 28 73 74 72 69 6e 67 2d 74 indows (string-t
8ac0: 72 61 6e 73 6c 61 74 65 20 6e 65 77 70 61 74 68 ranslate newpath
8ad0: 20 22 2f 22 20 22 5c 5c 22 29 20 6e 65 77 70 61 "/" "\\") newpa
8ae0: 74 68 29 29 0a 09 09 09 09 09 09 09 09 20 20 20 th)).........
8af0: 20 20 20 28 69 66 20 28 3e 20 2a 76 65 72 62 6f (if (> *verbo
8b00: 73 69 74 79 2a 20 31 29 0a 09 09 09 09 09 09 09 sity* 1)........
8b10: 09 09 20 20 28 63 6f 6e 63 20 66 69 6e 61 6c 2d .. (conc final-
8b20: 6c 6f 67 20 22 20 6e 6f 74 2d 66 6f 75 6e 64 22 log " not-found"
8b30: 29 0a 09 09 09 09 09 09 09 09 09 20 20 22 22 29 ).......... "")
8b40: 29 29 0a 09 09 09 09 20 20 20 20 28 76 65 63 74 ))..... (vect
8b50: 6f 72 2d 3e 6c 69 73 74 20 76 62 29 29 0a 09 09 or->list vb))...
8b60: 09 09 20 20 62 29 29 29 29 29 0a 20 20 20 20 20 .. b))))).
8b70: 64 62 0a 20 20 20 20 20 28 63 6f 6e 63 20 22 53 db. (conc "S
8b80: 45 4c 45 43 54 0a 20 20 20 20 20 20 20 20 20 20 ELECT.
8b90: 20 20 20 20 74 2e 74 65 73 74 6e 61 6d 65 2c 72 t.testname,r
8ba0: 2e 69 64 2c 72 75 6e 6e 61 6d 65 2c 22 20 6b 65 .id,runname," ke
8bb0: 79 73 73 74 72 20 22 2c 74 2e 74 65 73 74 6e 61 ysstr ",t.testna
8bc0: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 me,.
8bd0: 20 20 74 2e 69 74 65 6d 5f 70 61 74 68 2c 74 6d t.item_path,tm
8be0: 2e 64 65 73 63 72 69 70 74 69 6f 6e 2c 74 2e 73 .description,t.s
8bf0: 74 61 74 65 2c 74 2e 73 74 61 74 75 73 2c 0a 20 tate,t.status,.
8c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6e fin
8c10: 61 6c 5f 6c 6f 67 66 2c 72 75 6e 5f 64 75 72 61 al_logf,run_dura
8c20: 74 69 6f 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 tion, .
8c30: 20 20 20 20 20 73 74 72 66 74 69 6d 65 28 27 25 strftime('%
8c40: 6d 2f 25 64 2f 25 59 20 25 48 3a 25 4d 3a 25 53 m/%d/%Y %H:%M:%S
8c50: 27 2c 64 61 74 65 74 69 6d 65 28 74 2e 65 76 65 ',datetime(t.eve
8c60: 6e 74 5f 74 69 6d 65 2c 27 75 6e 69 78 65 70 6f nt_time,'unixepo
8c70: 63 68 27 29 2c 27 6c 6f 63 61 6c 74 69 6d 65 27 ch'),'localtime'
8c80: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 ),.
8c90: 20 74 6d 2e 74 61 67 73 2c 72 2e 6f 77 6e 65 72 tm.tags,r.owner
8ca0: 2c 74 2e 63 6f 6d 6d 65 6e 74 2c 0a 20 20 20 20 ,t.comment,.
8cb0: 20 20 20 20 20 20 20 20 20 20 61 75 74 68 6f 72 author
8cc0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,.
8cd0: 74 6d 2e 6f 77 6e 65 72 2c 72 65 76 69 65 77 65 tm.owner,reviewe
8ce0: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 d,.
8cf0: 20 64 69 73 6b 66 72 65 65 2c 75 6e 61 6d 65 2c diskfree,uname,
8d00: 72 75 6e 64 69 72 2c 0a 20 20 20 20 20 20 20 20 rundir,.
8d10: 20 20 20 20 20 20 68 6f 73 74 2c 63 70 75 6c 6f host,cpulo
8d20: 61 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 46 ad. F
8d30: 52 4f 4d 20 74 65 73 74 73 20 41 53 20 74 20 49 ROM tests AS t I
8d40: 4e 4e 45 52 20 4a 4f 49 4e 20 72 75 6e 73 20 41 NNER JOIN runs A
8d50: 53 20 72 20 4f 4e 20 74 2e 72 75 6e 5f 69 64 3d S r ON t.run_id=
8d60: 72 2e 69 64 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 r.id INNER JOIN
8d70: 74 65 73 74 5f 6d 65 74 61 20 41 53 20 74 6d 20 test_meta AS tm
8d80: 4f 4e 20 74 6d 2e 74 65 73 74 6e 61 6d 65 3d 74 ON tm.testname=t
8d90: 2e 74 65 73 74 6e 61 6d 65 0a 20 20 20 20 20 20 .testname.
8da0: 20 20 20 20 20 20 57 48 45 52 45 20 72 75 6e 6e WHERE runn
8db0: 61 6d 65 20 4c 49 4b 45 20 3f 20 41 4e 44 20 22 ame LIKE ? AND "
8dc0: 20 6b 65 79 71 72 79 20 22 3b 22 29 0a 20 20 20 keyqry ";").
8dd0: 20 20 72 75 6e 73 70 61 74 74 20 28 6d 61 70 20 runspatt (map
8de0: 63 61 64 72 20 6b 65 79 70 61 74 74 2d 61 6c 69 cadr keypatt-ali
8df0: 73 74 29 29 0a 20 20 20 20 28 73 65 74 21 20 72 st)). (set! r
8e00: 65 73 75 6c 74 73 20 28 6c 69 73 74 20 28 63 6f esults (list (co
8e10: 6e 73 20 22 52 75 6e 73 22 20 72 65 73 75 6c 74 ns "Runs" result
8e20: 73 29 29 29 0a 20 20 20 20 3b 3b 20 6e 6f 77 2c s))). ;; now,
8e30: 20 66 6f 72 20 65 61 63 68 20 74 65 73 74 2c 20 for each test,
8e40: 63 6f 6c 6c 65 63 74 20 74 68 65 20 74 65 73 74 collect the test
8e50: 5f 64 61 74 61 20 69 6e 66 6f 20 61 6e 64 20 61 _data info and a
8e60: 64 64 20 61 20 6e 65 77 20 73 68 65 65 74 0a 20 dd a new sheet.
8e70: 20 20 20 28 66 6f 72 2d 65 61 63 68 0a 20 20 20 (for-each.
8e80: 20 20 28 6c 61 6d 62 64 61 20 28 74 65 73 74 2d (lambda (test-
8e90: 69 64 29 0a 20 20 20 20 20 20 20 28 6c 65 74 20 id). (let
8ea0: 28 28 74 65 73 74 2d 64 61 74 61 20 28 6c 69 73 ((test-data (lis
8eb0: 74 20 74 65 73 74 64 61 74 61 2d 68 65 61 64 65 t testdata-heade
8ec0: 72 29 29 0a 09 20 20 20 20 20 28 63 75 72 72 2d r)).. (curr-
8ed0: 74 65 73 74 2d 6e 61 6d 65 20 23 66 29 29 0a 09 test-name #f))..
8ee0: 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 (sqlite3:for-ea
8ef0: 63 68 2d 72 6f 77 0a 09 20 20 28 6c 61 6d 62 64 ch-row.. (lambd
8f00: 61 20 28 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 a (run-id testna
8f10: 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 63 61 74 me item-path cat
8f20: 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65 20 76 egory variable v
8f30: 61 6c 75 65 20 65 78 70 65 63 74 65 64 20 74 6f alue expected to
8f40: 6c 20 75 6e 69 74 73 20 73 74 61 74 75 73 20 63 l units status c
8f50: 6f 6d 6d 65 6e 74 29 0a 09 20 20 20 20 28 73 65 omment).. (se
8f60: 74 21 20 63 75 72 72 2d 74 65 73 74 2d 6e 61 6d t! curr-test-nam
8f70: 65 20 74 65 73 74 6e 61 6d 65 29 0a 09 20 20 20 e testname)..
8f80: 20 28 73 65 74 21 20 74 65 73 74 2d 64 61 74 61 (set! test-data
8f90: 20 28 61 70 70 65 6e 64 20 74 65 73 74 2d 64 61 (append test-da
8fa0: 74 61 20 28 6c 69 73 74 20 28 6c 69 73 74 20 72 ta (list (list r
8fb0: 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 69 un-id testname i
8fc0: 74 65 6d 2d 70 61 74 68 20 63 61 74 65 67 6f 72 tem-path categor
8fd0: 79 20 76 61 72 69 61 62 6c 65 20 76 61 6c 75 65 y variable value
8fe0: 20 65 78 70 65 63 74 65 64 20 74 6f 6c 20 75 6e expected tol un
8ff0: 69 74 73 20 73 74 61 74 75 73 20 63 6f 6d 6d 65 its status comme
9000: 6e 74 29 29 29 29 29 0a 09 20 20 64 62 20 0a 09 nt))))).. db ..
9010: 20 20 3b 3b 20 22 53 45 4c 45 43 54 20 72 75 6e ;; "SELECT run
9020: 5f 69 64 2c 74 65 73 74 6e 61 6d 65 2c 69 74 65 _id,testname,ite
9030: 6d 5f 70 61 74 68 2c 63 61 74 65 67 6f 72 79 2c m_path,category,
9040: 76 61 72 69 61 62 6c 65 2c 74 64 2e 76 61 6c 75 variable,td.valu
9050: 65 20 41 53 20 76 61 6c 75 65 2c 65 78 70 65 63 e AS value,expec
9060: 74 65 64 2c 74 6f 6c 2c 75 6e 69 74 73 2c 74 64 ted,tol,units,td
9070: 2e 73 74 61 74 75 73 20 41 53 20 73 74 61 74 75 .status AS statu
9080: 73 2c 74 64 2e 63 6f 6d 6d 65 6e 74 20 41 53 20 s,td.comment AS
9090: 63 6f 6d 6d 65 6e 74 20 46 52 4f 4d 20 74 65 73 comment FROM tes
90a0: 74 5f 64 61 74 61 20 41 53 20 74 64 20 49 4e 4e t_data AS td INN
90b0: 45 52 20 4a 4f 49 4e 20 74 65 73 74 73 20 4f 4e ER JOIN tests ON
90c0: 20 74 65 73 74 73 2e 69 64 3d 74 64 2e 74 65 73 tests.id=td.tes
90d0: 74 5f 69 64 20 57 48 45 52 45 20 74 65 73 74 5f t_id WHERE test_
90e0: 69 64 3d 3f 3b 22 0a 09 20 20 22 53 45 4c 45 43 id=?;".. "SELEC
90f0: 54 20 72 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d T run_id,testnam
9100: 65 2c 69 74 65 6d 5f 70 61 74 68 2c 63 61 74 65 e,item_path,cate
9110: 67 6f 72 79 2c 76 61 72 69 61 62 6c 65 2c 74 64 gory,variable,td
9120: 2e 76 61 6c 75 65 20 41 53 20 76 61 6c 75 65 2c .value AS value,
9130: 74 64 2e 65 78 70 65 63 74 65 64 2c 74 64 2e 74 td.expected,td.t
9140: 6f 6c 2c 74 64 2e 75 6e 69 74 73 2c 74 64 2e 73 ol,td.units,td.s
9150: 74 61 74 75 73 20 41 53 20 73 74 61 74 75 73 2c tatus AS status,
9160: 74 64 2e 63 6f 6d 6d 65 6e 74 20 41 53 20 63 6f td.comment AS co
9170: 6d 6d 65 6e 74 20 46 52 4f 4d 20 74 65 73 74 5f mment FROM test_
9180: 64 61 74 61 20 41 53 20 74 64 20 49 4e 4e 45 52 data AS td INNER
9190: 20 4a 4f 49 4e 20 74 65 73 74 73 20 4f 4e 20 74 JOIN tests ON t
91a0: 65 73 74 73 2e 69 64 3d 74 64 2e 74 65 73 74 5f ests.id=td.test_
91b0: 69 64 20 57 48 45 52 45 20 74 65 73 74 6e 61 6d id WHERE testnam
91c0: 65 3d 3f 3b 22 0a 09 20 20 74 65 73 74 2d 69 64 e=?;".. test-id
91d0: 29 0a 09 20 28 69 66 20 63 75 72 72 2d 74 65 73 ).. (if curr-tes
91e0: 74 2d 6e 61 6d 65 0a 09 20 20 20 20 20 28 73 65 t-name.. (se
91f0: 74 21 20 72 65 73 75 6c 74 73 20 28 61 70 70 65 t! results (appe
9200: 6e 64 20 72 65 73 75 6c 74 73 20 28 6c 69 73 74 nd results (list
9210: 20 28 63 6f 6e 73 20 63 75 72 72 2d 74 65 73 74 (cons curr-test
9220: 2d 6e 61 6d 65 20 74 65 73 74 2d 64 61 74 61 29 -name test-data)
9230: 29 29 29 29 0a 09 20 29 29 0a 20 20 20 20 20 28 )))).. )). (
9240: 73 6f 72 74 20 28 64 65 6c 65 74 65 2d 64 75 70 sort (delete-dup
9250: 6c 69 63 61 74 65 73 20 74 65 73 74 2d 69 64 73 licates test-ids
9260: 29 20 73 74 72 69 6e 67 3c 3d 29 29 0a 20 20 20 ) string<=)).
9270: 20 28 73 79 73 74 65 6d 20 28 63 6f 6e 63 20 22 (system (conc "
9280: 6d 6b 64 69 72 20 2d 70 20 22 20 74 65 6d 70 64 mkdir -p " tempd
9290: 69 72 29 29 0a 20 20 20 20 3b 3b 20 28 70 70 20 ir)). ;; (pp
92a0: 72 65 73 75 6c 74 73 29 0a 20 20 20 20 28 6f 64 results). (od
92b0: 73 3a 6c 69 73 74 2d 3e 6f 64 73 20 0a 20 20 20 s:list->ods .
92c0: 20 20 74 65 6d 70 64 69 72 0a 20 20 20 20 20 28 tempdir. (
92d0: 69 66 20 28 73 74 72 69 6e 67 2d 6d 61 74 63 68 if (string-match
92e0: 20 28 72 65 67 65 78 70 20 22 5e 5b 2f 7e 5d 2b (regexp "^[/~]+
92f0: 2e 2a 22 29 20 6f 75 74 70 75 74 66 69 6c 65 29 .*") outputfile)
9300: 20 3b 3b 20 66 75 6c 6c 20 70 61 74 68 3f 0a 09 ;; full path?..
9310: 20 6f 75 74 70 75 74 66 69 6c 65 0a 09 20 28 62 outputfile.. (b
9320: 65 67 69 6e 0a 09 20 20 20 28 64 65 62 75 67 3a egin.. (debug:
9330: 70 72 69 6e 74 20 30 20 22 57 41 52 4e 49 4e 47 print 0 "WARNING
9340: 3a 20 70 61 74 68 20 67 69 76 65 6e 2c 20 22 20 : path given, "
9350: 6f 75 74 70 75 74 66 69 6c 65 20 22 20 69 73 20 outputfile " is
9360: 72 65 6c 61 74 69 76 65 2c 20 70 72 65 66 69 78 relative, prefix
9370: 69 6e 67 20 77 69 74 68 20 63 75 72 72 65 6e 74 ing with current
9380: 20 64 69 72 65 63 74 6f 72 79 22 29 0a 09 20 20 directory")..
9390: 20 28 63 6f 6e 63 20 28 63 75 72 72 65 6e 74 2d (conc (current-
93a0: 64 69 72 65 63 74 6f 72 79 29 20 22 2f 22 20 6f directory) "/" o
93b0: 75 74 70 75 74 66 69 6c 65 29 29 29 0a 20 20 20 utputfile))).
93c0: 20 20 72 65 73 75 6c 74 73 29 29 29 0a 0a 3b 3b results)))..;;
93d0: 20 28 64 62 3a 65 78 74 72 61 63 74 2d 6f 64 73 (db:extract-ods
93e0: 2d 66 69 6c 65 20 64 62 20 22 6f 75 74 70 75 74 -file db "output
93f0: 66 69 6c 65 2e 6f 64 73 22 20 27 28 28 22 73 79 file.ods" '(("sy
9400: 73 6e 61 6d 65 22 20 22 25 22 29 28 22 66 73 6e sname" "%")("fsn
9410: 61 6d 65 22 20 22 25 22 29 28 22 64 61 74 61 70 ame" "%")("datap
9420: 61 74 68 22 20 22 25 22 29 29 20 22 25 22 29 0a ath" "%")) "%").