Megatest

Hex Artifact Content
Login

Artifact c39ab57eb703aaa5391f89fa3e4b773c2248312f:


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