Megatest

Hex Artifact Content
Login

Artifact 685f5a2010c794b43a9eea41dcd7675efad1ebf2:


0000: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
0010: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0030: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0040: 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 43 6f 70 79  ========.;; Copy
0050: 72 69 67 68 74 20 32 30 30 36 2d 32 30 31 32 2c  right 2006-2012,
0060: 20 4d 61 74 74 68 65 77 20 57 65 6c 6c 61 6e 64   Matthew Welland
0070: 2e 0a 3b 3b 20 0a 3b 3b 20 20 54 68 69 73 20 70  ..;; .;;  This p
0080: 72 6f 67 72 61 6d 20 69 73 20 6d 61 64 65 20 61  rogram is made a
0090: 76 61 69 6c 61 62 6c 65 20 75 6e 64 65 72 20 74  vailable under t
00a0: 68 65 20 47 4e 55 20 47 50 4c 20 76 65 72 73 69  he GNU GPL versi
00b0: 6f 6e 20 32 2e 30 20 6f 72 0a 3b 3b 20 20 67 72  on 2.0 or.;;  gr
00c0: 65 61 74 65 72 2e 20 53 65 65 20 74 68 65 20 61  eater. See the a
00d0: 63 63 6f 6d 70 61 6e 79 69 6e 67 20 66 69 6c 65  ccompanying file
00e0: 20 43 4f 50 59 49 4e 47 20 66 6f 72 20 64 65 74   COPYING for det
00f0: 61 69 6c 73 2e 0a 3b 3b 20 0a 3b 3b 20 20 54 68  ails..;; .;;  Th
0100: 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69  is program is di
0110: 73 74 72 69 62 75 74 65 64 20 57 49 54 48 4f 55  stributed WITHOU
0120: 54 20 41 4e 59 20 57 41 52 52 41 4e 54 59 3b 20  T ANY WARRANTY; 
0130: 77 69 74 68 6f 75 74 20 65 76 65 6e 20 74 68 65  without even the
0140: 0a 3b 3b 20 20 69 6d 70 6c 69 65 64 20 77 61 72  .;;  implied war
0150: 72 61 6e 74 79 20 6f 66 20 4d 45 52 43 48 41 4e  ranty of MERCHAN
0160: 54 41 42 49 4c 49 54 59 20 6f 72 20 46 49 54 4e  TABILITY or FITN
0170: 45 53 53 20 46 4f 52 20 41 20 50 41 52 54 49 43  ESS FOR A PARTIC
0180: 55 4c 41 52 0a 3b 3b 20 20 50 55 52 50 4f 53 45  ULAR.;;  PURPOSE
0190: 2e 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ..;;============
01a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 3d 3d  ==========..;;==
01e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0200: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0210: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0220: 3d 3d 3d 3d 0a 3b 3b 20 44 61 74 61 62 61 73 65  ====.;; Database
0230: 20 61 63 63 65 73 73 0a 3b 3b 3d 3d 3d 3d 3d 3d   access.;;======
0240: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0250: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0260: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0270: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0280: 0a 0a 28 72 65 71 75 69 72 65 2d 65 78 74 65 6e  ..(require-exten
0290: 73 69 6f 6e 20 28 73 72 66 69 20 31 38 29 20 65  sion (srfi 18) e
02a0: 78 74 72 61 73 20 74 63 70 20 72 70 63 29 0a 28  xtras tcp rpc).(
02b0: 69 6d 70 6f 72 74 20 28 70 72 65 66 69 78 20 72  import (prefix r
02c0: 70 63 20 72 70 63 3a 29 29 0a 0a 28 75 73 65 20  pc rpc:))..(use 
02d0: 73 71 6c 69 74 65 33 20 73 72 66 69 2d 31 20 70  sqlite3 srfi-1 p
02e0: 6f 73 69 78 20 72 65 67 65 78 20 72 65 67 65 78  osix regex regex
02f0: 2d 63 61 73 65 20 73 72 66 69 2d 36 39 20 63 73  -case srfi-69 cs
0300: 76 2d 78 6d 6c 29 0a 28 69 6d 70 6f 72 74 20 28  v-xml).(import (
0310: 70 72 65 66 69 78 20 73 71 6c 69 74 65 33 20 73  prefix sqlite3 s
0320: 71 6c 69 74 65 33 3a 29 29 0a 0a 28 64 65 63 6c  qlite3:))..(decl
0330: 61 72 65 20 28 75 6e 69 74 20 64 62 29 29 0a 28  are (unit db)).(
0340: 64 65 63 6c 61 72 65 20 28 75 73 65 73 20 63 6f  declare (uses co
0350: 6d 6d 6f 6e 29 29 0a 28 64 65 63 6c 61 72 65 20  mmon)).(declare 
0360: 28 75 73 65 73 20 6b 65 79 73 29 29 0a 28 64 65  (uses keys)).(de
0370: 63 6c 61 72 65 20 28 75 73 65 73 20 6f 64 73 29  clare (uses ods)
0380: 29 0a 0a 28 69 6e 63 6c 75 64 65 20 22 63 6f 6d  )..(include "com
0390: 6d 6f 6e 5f 72 65 63 6f 72 64 73 2e 73 63 6d 22  mon_records.scm"
03a0: 29 0a 28 69 6e 63 6c 75 64 65 20 22 64 62 5f 72  ).(include "db_r
03b0: 65 63 6f 72 64 73 2e 73 63 6d 22 29 0a 28 69 6e  ecords.scm").(in
03c0: 63 6c 75 64 65 20 22 6b 65 79 5f 72 65 63 6f 72  clude "key_recor
03d0: 64 73 2e 73 63 6d 22 29 0a 28 69 6e 63 6c 75 64  ds.scm").(includ
03e0: 65 20 22 72 75 6e 5f 72 65 63 6f 72 64 73 2e 73  e "run_records.s
03f0: 63 6d 22 29 0a 0a 3b 3b 20 74 69 6d 65 73 74 61  cm")..;; timesta
0400: 6d 70 20 74 79 70 65 20 28 76 61 6c 31 20 76 61  mp type (val1 va
0410: 6c 32 20 2e 2e 2e 29 0a 3b 3b 20 74 79 70 65 3a  l2 ...).;; type:
0420: 20 6d 65 74 61 2d 69 6e 66 6f 2c 20 73 74 65 70   meta-info, step
0430: 0a 28 64 65 66 69 6e 65 20 2a 69 6e 63 6f 6d 69  .(define *incomi
0440: 6e 67 2d 64 61 74 61 2a 20 20 20 20 20 20 27 28  ng-data*      '(
0450: 29 29 0a 28 64 65 66 69 6e 65 20 2a 69 6e 63 6f  )).(define *inco
0460: 6d 69 6e 67 2d 6c 61 73 74 2d 74 69 6d 65 2a 20  ming-last-time* 
0470: 28 63 75 72 72 65 6e 74 2d 73 65 63 6f 6e 64 73  (current-seconds
0480: 29 29 0a 28 64 65 66 69 6e 65 20 2a 69 6e 63 6f  )).(define *inco
0490: 6d 69 6e 67 2d 6d 75 74 65 78 2a 20 20 20 20 20  ming-mutex*     
04a0: 28 6d 61 6b 65 2d 6d 75 74 65 78 29 29 0a 28 64  (make-mutex)).(d
04b0: 65 66 69 6e 65 20 2a 63 61 63 68 65 2d 6f 6e 2a  efine *cache-on*
04c0: 20 23 66 29 0a 0a 28 64 65 66 69 6e 65 20 28 6f   #f)..(define (o
04d0: 70 65 6e 2d 64 62 29 20 3b 3b 20 20 28 63 6f 6e  pen-db) ;;  (con
04e0: 63 20 2a 74 6f 70 70 61 74 68 2a 20 22 2f 6d 65  c *toppath* "/me
04f0: 67 61 74 65 73 74 2e 64 62 22 29 20 28 63 61 72  gatest.db") (car
0500: 20 2a 63 6f 6e 66 69 67 69 6e 66 6f 2a 29 29 29   *configinfo*)))
0510: 0a 20 20 28 6c 65 74 2a 20 28 28 64 62 70 61 74  .  (let* ((dbpat
0520: 68 20 20 20 20 28 63 6f 6e 63 20 2a 74 6f 70 70  h    (conc *topp
0530: 61 74 68 2a 20 22 2f 6d 65 67 61 74 65 73 74 2e  ath* "/megatest.
0540: 64 62 22 29 29 20 3b 3b 20 66 6e 61 6d 65 29 0a  db")) ;; fname).
0550: 09 20 28 64 62 65 78 69 73 74 73 20 20 28 66 69  . (dbexists  (fi
0560: 6c 65 2d 65 78 69 73 74 73 3f 20 64 62 70 61 74  le-exists? dbpat
0570: 68 29 29 0a 09 20 28 64 62 20 20 20 20 20 20 20  h)).. (db       
0580: 20 28 73 71 6c 69 74 65 33 3a 6f 70 65 6e 2d 64   (sqlite3:open-d
0590: 61 74 61 62 61 73 65 20 64 62 70 61 74 68 29 29  atabase dbpath))
05a0: 20 3b 3b 20 28 6e 65 76 65 72 2d 67 69 76 65 2d   ;; (never-give-
05b0: 75 70 2d 6f 70 65 6e 2d 64 62 20 64 62 70 61 74  up-open-db dbpat
05c0: 68 29 29 0a 09 20 28 68 61 6e 64 6c 65 72 20 20  h)).. (handler  
05d0: 20 28 6d 61 6b 65 2d 62 75 73 79 2d 74 69 6d 65   (make-busy-time
05e0: 6f 75 74 20 28 69 66 20 28 61 72 67 73 3a 67 65  out (if (args:ge
05f0: 74 2d 61 72 67 20 22 2d 6f 76 65 72 72 69 64 65  t-arg "-override
0600: 2d 74 69 6d 65 6f 75 74 22 29 0a 09 09 09 09 09  -timeout")......
0610: 20 20 20 28 73 74 72 69 6e 67 2d 3e 6e 75 6d 62     (string->numb
0620: 65 72 20 28 61 72 67 73 3a 67 65 74 2d 61 72 67  er (args:get-arg
0630: 20 22 2d 6f 76 65 72 72 69 64 65 2d 74 69 6d 65   "-override-time
0640: 6f 75 74 22 29 29 0a 09 09 09 09 09 20 20 20 33  out"))......   3
0650: 36 30 30 30 29 29 29 29 20 3b 3b 20 31 33 36 30  6000)))) ;; 1360
0660: 30 30 29 29 29 0a 20 20 20 20 28 73 71 6c 69 74  00))).    (sqlit
0670: 65 33 3a 73 65 74 2d 62 75 73 79 2d 68 61 6e 64  e3:set-busy-hand
0680: 6c 65 72 21 20 64 62 20 68 61 6e 64 6c 65 72 29  ler! db handler)
0690: 0a 20 20 20 20 28 69 66 20 28 6e 6f 74 20 64 62  .    (if (not db
06a0: 65 78 69 73 74 73 29 0a 09 28 64 62 3a 69 6e 69  exists)..(db:ini
06b0: 74 69 61 6c 69 7a 65 20 64 62 29 29 0a 20 20 20  tialize db)).   
06c0: 20 64 62 29 29 0a 0a 28 64 65 66 69 6e 65 20 28   db))..(define (
06d0: 64 62 3a 69 6e 69 74 69 61 6c 69 7a 65 20 64 62  db:initialize db
06e0: 29 0a 20 20 28 6c 65 74 2a 20 28 28 63 6f 6e 66  ).  (let* ((conf
06f0: 69 67 64 61 74 20 28 63 61 72 20 2a 63 6f 6e 66  igdat (car *conf
0700: 69 67 69 6e 66 6f 2a 29 29 20 20 3b 3b 20 74 75  iginfo*))  ;; tu
0710: 74 20 74 75 74 2c 20 67 6c 6f 62 61 6c 20 77 61  t tut, global wa
0720: 72 6e 69 6e 67 2e 2e 2e 0a 09 20 28 6b 65 79 73  rning..... (keys
0730: 20 20 20 20 20 28 63 6f 6e 66 69 67 2d 67 65 74       (config-get
0740: 2d 66 69 65 6c 64 73 20 63 6f 6e 66 69 67 64 61  -fields configda
0750: 74 29 29 0a 09 20 28 68 61 76 65 6b 65 79 73 20  t)).. (havekeys 
0760: 28 3e 20 28 6c 65 6e 67 74 68 20 6b 65 79 73 29  (> (length keys)
0770: 20 30 29 29 0a 09 20 28 6b 65 79 73 74 72 20 20   0)).. (keystr  
0780: 20 28 6b 65 79 73 2d 3e 6b 65 79 73 74 72 20 6b   (keys->keystr k
0790: 65 79 73 29 29 0a 09 20 28 66 69 65 6c 64 73 74  eys)).. (fieldst
07a0: 72 20 28 6b 65 79 73 2d 3e 6b 65 79 2f 66 69 65  r (keys->key/fie
07b0: 6c 64 20 6b 65 79 73 29 29 29 0a 20 20 20 20 28  ld keys))).    (
07c0: 66 6f 72 2d 65 61 63 68 20 28 6c 61 6d 62 64 61  for-each (lambda
07d0: 20 28 6b 65 79 29 0a 09 09 28 6c 65 74 20 28 28   (key)...(let ((
07e0: 6b 65 79 6e 20 28 76 65 63 74 6f 72 2d 72 65 66  keyn (vector-ref
07f0: 20 6b 65 79 20 30 29 29 29 0a 09 09 20 20 28 69   key 0)))...  (i
0800: 66 20 28 6d 65 6d 62 65 72 20 28 73 74 72 69 6e  f (member (strin
0810: 67 2d 64 6f 77 6e 63 61 73 65 20 6b 65 79 6e 29  g-downcase keyn)
0820: 0a 09 09 09 20 20 20 20 20 20 28 6c 69 73 74 20  ....      (list 
0830: 22 72 75 6e 6e 61 6d 65 22 20 22 73 74 61 74 65  "runname" "state
0840: 22 20 22 73 74 61 74 75 73 22 20 22 6f 77 6e 65  " "status" "owne
0850: 72 22 20 22 65 76 65 6e 74 5f 74 69 6d 65 22 20  r" "event_time" 
0860: 22 63 6f 6d 6d 65 6e 74 22 20 22 66 61 69 6c 5f  "comment" "fail_
0870: 63 6f 75 6e 74 22 0a 09 09 09 09 20 20 20 20 22  count".....    "
0880: 70 61 73 73 5f 63 6f 75 6e 74 22 29 29 0a 09 09  pass_count"))...
0890: 20 20 20 20 20 20 28 62 65 67 69 6e 0a 09 09 09        (begin....
08a0: 28 70 72 69 6e 74 20 22 45 52 52 4f 52 3a 20 79  (print "ERROR: y
08b0: 6f 75 72 20 6b 65 79 20 63 61 6e 6e 6f 74 20 62  our key cannot b
08c0: 65 20 6e 61 6d 65 64 20 22 20 6b 65 79 6e 20 22  e named " keyn "
08d0: 20 61 73 20 74 68 69 73 20 63 6f 6e 66 6c 69 63   as this conflic
08e0: 74 73 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ts with the same
08f0: 20 6e 61 6d 65 64 20 66 69 65 6c 64 20 69 6e 20   named field in 
0900: 74 68 65 20 72 75 6e 73 20 74 61 62 6c 65 22 29  the runs table")
0910: 0a 09 09 09 28 73 79 73 74 65 6d 20 28 63 6f 6e  ....(system (con
0920: 63 20 22 72 6d 20 2d 66 20 22 20 64 62 70 61 74  c "rm -f " dbpat
0930: 68 29 29 0a 09 09 09 28 65 78 69 74 20 31 29 29  h))....(exit 1))
0940: 29 29 29 0a 09 20 20 20 20 20 20 6b 65 79 73 29  )))..      keys)
0950: 0a 20 20 20 20 3b 3b 20 28 73 71 6c 69 74 65 33  .    ;; (sqlite3
0960: 3a 65 78 65 63 75 74 65 20 64 62 20 22 50 52 41  :execute db "PRA
0970: 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  GMA synchronous 
0980: 3d 20 4f 46 46 3b 22 29 0a 20 20 20 20 28 73 71  = OFF;").    (sq
0990: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62  lite3:execute db
09a0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49   "CREATE TABLE I
09b0: 46 20 4e 4f 54 20 45 58 49 53 54 53 20 6b 65 79  F NOT EXISTS key
09c0: 73 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52  s (id INTEGER PR
09d0: 49 4d 41 52 59 20 4b 45 59 2c 20 66 69 65 6c 64  IMARY KEY, field
09e0: 6e 61 6d 65 20 54 45 58 54 2c 20 66 69 65 6c 64  name TEXT, field
09f0: 74 79 70 65 20 54 45 58 54 2c 20 43 4f 4e 53 54  type TEXT, CONST
0a00: 52 41 49 4e 54 20 6b 65 79 63 6f 6e 73 74 72 61  RAINT keyconstra
0a10: 69 6e 74 20 55 4e 49 51 55 45 20 28 66 69 65 6c  int UNIQUE (fiel
0a20: 64 6e 61 6d 65 29 29 3b 22 29 0a 20 20 20 20 28  dname));").    (
0a30: 66 6f 72 2d 65 61 63 68 20 28 6c 61 6d 62 64 61  for-each (lambda
0a40: 20 28 6b 65 79 29 0a 09 09 28 73 71 6c 69 74 65   (key)...(sqlite
0a50: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 49 4e  3:execute db "IN
0a60: 53 45 52 54 20 49 4e 54 4f 20 6b 65 79 73 20 28  SERT INTO keys (
0a70: 66 69 65 6c 64 6e 61 6d 65 2c 66 69 65 6c 64 74  fieldname,fieldt
0a80: 79 70 65 29 20 56 41 4c 55 45 53 20 28 3f 2c 3f  ype) VALUES (?,?
0a90: 29 3b 22 20 28 6b 65 79 3a 67 65 74 2d 66 69 65  );" (key:get-fie
0aa0: 6c 64 6e 61 6d 65 20 6b 65 79 29 28 6b 65 79 3a  ldname key)(key:
0ab0: 67 65 74 2d 66 69 65 6c 64 74 79 70 65 20 6b 65  get-fieldtype ke
0ac0: 79 29 29 29 0a 09 20 20 20 20 20 20 6b 65 79 73  y)))..      keys
0ad0: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65  ).    (sqlite3:e
0ae0: 78 65 63 75 74 65 20 64 62 20 28 63 6f 6e 63 20  xecute db (conc 
0af0: 0a 09 09 09 20 22 43 52 45 41 54 45 20 54 41 42  .... "CREATE TAB
0b00: 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53  LE IF NOT EXISTS
0b10: 20 72 75 6e 73 20 28 69 64 20 49 4e 54 45 47 45   runs (id INTEGE
0b20: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 22  R PRIMARY KEY, "
0b30: 20 0a 09 09 09 20 66 69 65 6c 64 73 74 72 20 28   .... fieldstr (
0b40: 69 66 20 68 61 76 65 6b 65 79 73 20 22 2c 22 20  if havekeys "," 
0b50: 22 22 29 0a 09 09 09 20 22 72 75 6e 6e 61 6d 65  "").... "runname
0b60: 20 54 45 58 54 2c 22 0a 09 09 09 20 22 73 74 61   TEXT,".... "sta
0b70: 74 65 20 54 45 58 54 20 44 45 46 41 55 4c 54 20  te TEXT DEFAULT 
0b80: 27 27 2c 22 0a 09 09 09 20 22 73 74 61 74 75 73  '',".... "status
0b90: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27   TEXT DEFAULT ''
0ba0: 2c 22 0a 09 09 09 20 22 6f 77 6e 65 72 20 54 45  ,".... "owner TE
0bb0: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 22 0a  XT DEFAULT '',".
0bc0: 09 09 09 20 22 65 76 65 6e 74 5f 74 69 6d 65 20  ... "event_time 
0bd0: 54 49 4d 45 53 54 41 4d 50 2c 22 0a 09 09 09 20  TIMESTAMP,".... 
0be0: 22 63 6f 6d 6d 65 6e 74 20 54 45 58 54 20 44 45  "comment TEXT DE
0bf0: 46 41 55 4c 54 20 27 27 2c 22 0a 09 09 09 20 22  FAULT '',".... "
0c00: 66 61 69 6c 5f 63 6f 75 6e 74 20 49 4e 54 45 47  fail_count INTEG
0c10: 45 52 20 44 45 46 41 55 4c 54 20 30 2c 22 0a 09  ER DEFAULT 0,"..
0c20: 09 09 20 22 70 61 73 73 5f 63 6f 75 6e 74 20 49  .. "pass_count I
0c30: 4e 54 45 47 45 52 20 44 45 46 41 55 4c 54 20 30  NTEGER DEFAULT 0
0c40: 2c 22 0a 09 09 09 20 22 43 4f 4e 53 54 52 41 49  ,".... "CONSTRAI
0c50: 4e 54 20 72 75 6e 73 63 6f 6e 73 74 72 61 69 6e  NT runsconstrain
0c60: 74 20 55 4e 49 51 55 45 20 28 72 75 6e 6e 61 6d  t UNIQUE (runnam
0c70: 65 22 20 28 69 66 20 68 61 76 65 6b 65 79 73 20  e" (if havekeys 
0c80: 22 2c 22 20 22 22 29 20 6b 65 79 73 74 72 20 22  "," "") keystr "
0c90: 29 29 3b 22 29 29 0a 20 20 20 20 28 73 71 6c 69  ));")).    (sqli
0ca0: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 28  te3:execute db (
0cb0: 63 6f 6e 63 20 22 43 52 45 41 54 45 20 49 4e 44  conc "CREATE IND
0cc0: 45 58 20 72 75 6e 73 5f 69 6e 64 65 78 20 4f 4e  EX runs_index ON
0cd0: 20 72 75 6e 73 20 28 72 75 6e 6e 61 6d 65 22 20   runs (runname" 
0ce0: 28 69 66 20 68 61 76 65 6b 65 79 73 20 22 2c 22  (if havekeys ","
0cf0: 20 22 22 29 20 6b 65 79 73 74 72 20 22 29 3b 22   "") keystr ");"
0d00: 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a  )).    (sqlite3:
0d10: 65 78 65 63 75 74 65 20 64 62 20 0a 09 09 20 20  execute db ...  
0d20: 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
0d30: 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 74   IF NOT EXISTS t
0d40: 65 73 74 73 20 0a 20 20 20 20 20 20 20 20 20 20  ests .          
0d50: 20 20 20 20 20 20 20 20 20 20 28 69 64 20 49 4e            (id IN
0d60: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
0d70: 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y,.             
0d80: 20 20 20 20 20 20 20 20 72 75 6e 5f 69 64 20 20          run_id  
0d90: 20 20 20 49 4e 54 45 47 45 52 2c 0a 20 20 20 20     INTEGER,.    
0da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0db0: 20 74 65 73 74 6e 61 6d 65 20 20 20 54 45 58 54   testname   TEXT
0dc0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
0dd0: 20 20 20 20 20 20 20 68 6f 73 74 20 20 20 20 20         host     
0de0: 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27    TEXT DEFAULT '
0df0: 6e 2f 61 27 2c 0a 20 20 20 20 20 20 20 20 20 20  n/a',.          
0e00: 20 20 20 20 20 20 20 20 20 20 20 63 70 75 6c 6f             cpulo
0e10: 61 64 20 20 20 20 52 45 41 4c 20 44 45 46 41 55  ad    REAL DEFAU
0e20: 4c 54 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20  LT -1,.         
0e30: 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 6b              disk
0e40: 66 72 65 65 20 20 20 49 4e 54 45 47 45 52 20 44  free   INTEGER D
0e50: 45 46 41 55 4c 54 20 2d 31 2c 0a 20 20 20 20 20  EFAULT -1,.     
0e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e70: 75 6e 61 6d 65 20 20 20 20 20 20 54 45 58 54 20  uname      TEXT 
0e80: 44 45 46 41 55 4c 54 20 27 6e 2f 61 27 2c 20 0a  DEFAULT 'n/a', .
0e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ea0: 20 20 20 20 20 72 75 6e 64 69 72 20 20 20 20 20       rundir     
0eb0: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 6e 2f  TEXT DEFAULT 'n/
0ec0: 61 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  a',.            
0ed0: 20 20 20 20 20 20 20 20 20 73 68 6f 72 74 64 69           shortdi
0ee0: 72 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54  r   TEXT DEFAULT
0ef0: 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20   '',.           
0f00: 20 20 20 20 20 20 20 20 20 20 69 74 65 6d 5f 70            item_p
0f10: 61 74 68 20 20 54 45 58 54 20 44 45 46 41 55 4c  ath  TEXT DEFAUL
0f20: 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20  T '',.          
0f30: 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65             state
0f40: 20 20 20 20 20 20 54 45 58 54 20 44 45 46 41 55        TEXT DEFAU
0f50: 4c 54 20 27 4e 4f 54 5f 53 54 41 52 54 45 44 27  LT 'NOT_STARTED'
0f60: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
0f70: 20 20 20 20 20 20 20 73 74 61 74 75 73 20 20 20         status   
0f80: 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27    TEXT DEFAULT '
0f90: 46 41 49 4c 27 2c 0a 20 20 20 20 20 20 20 20 20  FAIL',.         
0fa0: 20 20 20 20 20 20 20 20 20 20 20 20 61 74 74 65              atte
0fb0: 6d 70 74 6e 75 6d 20 49 4e 54 45 47 45 52 20 44  mptnum INTEGER D
0fc0: 45 46 41 55 4c 54 20 30 2c 0a 20 20 20 20 20 20  EFAULT 0,.      
0fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
0fe0: 69 6e 61 6c 5f 6c 6f 67 66 20 54 45 58 54 20 44  inal_logf TEXT D
0ff0: 45 46 41 55 4c 54 20 27 6c 6f 67 73 2f 66 69 6e  EFAULT 'logs/fin
1000: 61 6c 2e 6c 6f 67 27 2c 0a 20 20 20 20 20 20 20  al.log',.       
1010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f                lo
1020: 67 64 61 74 20 20 20 20 20 42 4c 4f 42 2c 20 0a  gdat     BLOB, .
1030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1040: 20 20 20 20 20 72 75 6e 5f 64 75 72 61 74 69 6f       run_duratio
1050: 6e 20 49 4e 54 45 47 45 52 20 44 45 46 41 55 4c  n INTEGER DEFAUL
1060: 54 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  T 0,.           
1070: 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 65 6e            commen
1080: 74 20 20 20 20 54 45 58 54 20 44 45 46 41 55 4c  t    TEXT DEFAUL
1090: 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20  T '',.          
10a0: 20 20 20 20 20 20 20 20 20 20 20 65 76 65 6e 74             event
10b0: 5f 74 69 6d 65 20 54 49 4d 45 53 54 41 4d 50 2c  _time TIMESTAMP,
10c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10d0: 20 20 20 20 20 20 66 61 69 6c 5f 63 6f 75 6e 74        fail_count
10e0: 20 49 4e 54 45 47 45 52 20 44 45 46 41 55 4c 54   INTEGER DEFAULT
10f0: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1100: 20 20 20 20 20 20 20 20 20 70 61 73 73 5f 63 6f           pass_co
1110: 75 6e 74 20 49 4e 54 45 47 45 52 20 44 45 46 41  unt INTEGER DEFA
1120: 55 4c 54 20 30 2c 0a 20 20 20 20 20 20 20 20 20  ULT 0,.         
1130: 20 20 20 20 20 20 20 20 20 20 20 20 61 72 63 68              arch
1140: 69 76 65 64 20 20 20 49 4e 54 45 47 45 52 20 44  ived   INTEGER D
1150: 45 46 41 55 4c 54 20 30 2c 20 2d 2d 20 30 3d 6e  EFAULT 0, -- 0=n
1160: 6f 2c 20 31 3d 69 6e 20 70 72 6f 67 72 65 73 73  o, 1=in progress
1170: 2c 20 32 3d 79 65 73 0a 20 20 20 20 20 20 20 20  , 2=yes.        
1180: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e               CON
1190: 53 54 52 41 49 4e 54 20 74 65 73 74 73 63 6f 6e  STRAINT testscon
11a0: 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28  straint UNIQUE (
11b0: 72 75 6e 5f 69 64 2c 20 74 65 73 74 6e 61 6d 65  run_id, testname
11c0: 2c 20 69 74 65 6d 5f 70 61 74 68 29 0a 20 20 20  , item_path).   
11d0: 20 20 20 20 20 20 20 29 3b 22 29 0a 20 20 20 20         );").    
11e0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
11f0: 20 64 62 20 22 43 52 45 41 54 45 20 49 4e 44 45   db "CREATE INDE
1200: 58 20 74 65 73 74 73 5f 69 6e 64 65 78 20 4f 4e  X tests_index ON
1210: 20 74 65 73 74 73 20 28 72 75 6e 5f 69 64 2c 20   tests (run_id, 
1220: 74 65 73 74 6e 61 6d 65 2c 20 69 74 65 6d 5f 70  testname, item_p
1230: 61 74 68 29 3b 22 29 0a 20 20 20 20 28 73 71 6c  ath);").    (sql
1240: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
1250: 22 43 52 45 41 54 45 20 56 49 45 57 20 72 75 6e  "CREATE VIEW run
1260: 73 5f 74 65 73 74 73 20 41 53 20 53 45 4c 45 43  s_tests AS SELEC
1270: 54 20 2a 20 46 52 4f 4d 20 72 75 6e 73 20 49 4e  T * FROM runs IN
1280: 4e 45 52 20 4a 4f 49 4e 20 74 65 73 74 73 20 4f  NER JOIN tests O
1290: 4e 20 72 75 6e 73 2e 69 64 3d 74 65 73 74 73 2e  N runs.id=tests.
12a0: 72 75 6e 5f 69 64 3b 22 29 0a 20 20 20 20 28 73  run_id;").    (s
12b0: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64  qlite3:execute d
12c0: 62 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  b "CREATE TABLE 
12d0: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 74 65  IF NOT EXISTS te
12e0: 73 74 5f 73 74 65 70 73 20 0a 20 20 20 20 20 20  st_steps .      
12f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1300: 20 20 20 20 20 20 20 20 28 69 64 20 49 4e 54 45          (id INTE
1310: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
1320: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1340: 74 65 73 74 5f 69 64 20 49 4e 54 45 47 45 52 2c  test_id INTEGER,
1350: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1370: 20 73 74 65 70 6e 61 6d 65 20 54 45 58 54 2c 20   stepname TEXT, 
1380: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a0: 73 74 61 74 65 20 54 45 58 54 20 44 45 46 41 55  state TEXT DEFAU
13b0: 4c 54 20 27 4e 4f 54 5f 53 54 41 52 54 45 44 27  LT 'NOT_STARTED'
13c0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 73 74 61 74 75 73 20 54 45 58 54 20 44 45    status TEXT DE
13f0: 46 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20 20 20  FAULT 'n/a',.   
1400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1410: 20 20 20 20 20 20 20 20 20 20 20 20 65 76 65 6e              even
1420: 74 5f 74 69 6d 65 20 54 49 4d 45 53 54 41 4d 50  t_time TIMESTAMP
1430: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1450: 20 63 6f 6d 6d 65 6e 74 20 54 45 58 54 20 44 45   comment TEXT DE
1460: 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20  FAULT '',.      
1470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1480: 20 20 20 20 20 20 20 20 20 6c 6f 67 66 69 6c 65           logfile
1490: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27   TEXT DEFAULT ''
14a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c0: 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 65 73 74   CONSTRAINT test
14d0: 5f 73 74 65 70 73 5f 63 6f 6e 73 74 72 61 69 6e  _steps_constrain
14e0: 74 20 55 4e 49 51 55 45 20 28 74 65 73 74 5f 69  t UNIQUE (test_i
14f0: 64 2c 73 74 65 70 6e 61 6d 65 2c 73 74 61 74 65  d,stepname,state
1500: 29 29 3b 22 29 0a 20 20 20 20 28 73 71 6c 69 74  ));").    (sqlit
1510: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 43  e3:execute db "C
1520: 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e  REATE TABLE IF N
1530: 4f 54 20 45 58 49 53 54 53 20 65 78 74 72 61 64  OT EXISTS extrad
1540: 61 74 20 28 69 64 20 49 4e 54 45 47 45 52 20 50  at (id INTEGER P
1550: 52 49 4d 41 52 59 20 4b 45 59 2c 20 72 75 6e 5f  RIMARY KEY, run_
1560: 69 64 20 49 4e 54 45 47 45 52 2c 20 6b 65 79 20  id INTEGER, key 
1570: 54 45 58 54 2c 20 76 61 6c 20 54 45 58 54 29 3b  TEXT, val TEXT);
1580: 22 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a  ").    (sqlite3:
1590: 65 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41  execute db "CREA
15a0: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  TE TABLE IF NOT 
15b0: 45 58 49 53 54 53 20 6d 65 74 61 64 61 74 20 28  EXISTS metadat (
15c0: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  id INTEGER PRIMA
15d0: 52 59 20 4b 45 59 2c 20 76 61 72 20 54 45 58 54  RY KEY, var TEXT
15e0: 2c 20 76 61 6c 20 54 45 58 54 2c 0a 20 20 20 20  , val TEXT,.    
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 4f                CO
1610: 4e 53 54 52 41 49 4e 54 20 6d 65 74 61 64 61 74  NSTRAINT metadat
1620: 5f 63 6f 6e 73 74 72 61 69 6e 74 20 55 4e 49 51  _constraint UNIQ
1630: 55 45 20 28 76 61 72 29 29 3b 22 29 0a 20 20 20  UE (var));").   
1640: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
1650: 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41 42  e db "CREATE TAB
1660: 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53  LE IF NOT EXISTS
1670: 20 61 63 63 65 73 73 5f 6c 6f 67 20 28 69 64 20   access_log (id 
1680: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
1690: 4b 45 59 2c 20 75 73 65 72 20 54 45 58 54 2c 20  KEY, user TEXT, 
16a0: 61 63 63 65 73 73 65 64 20 54 49 4d 45 53 54 41  accessed TIMESTA
16b0: 4d 50 2c 20 61 72 67 73 20 54 45 58 54 29 3b 22  MP, args TEXT);"
16c0: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65  ).    (sqlite3:e
16d0: 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 54  xecute db "CREAT
16e0: 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
16f0: 58 49 53 54 53 20 74 65 73 74 5f 6d 65 74 61 20  XISTS test_meta 
1700: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d  (id INTEGER PRIM
1710: 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 20 20  ARY KEY,.       
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
1740: 73 74 6e 61 6d 65 20 20 20 20 54 45 58 54 20 44  stname    TEXT D
1750: 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20  EFAULT '',.     
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1780: 61 75 74 68 6f 72 20 20 20 20 20 20 54 45 58 54  author      TEXT
1790: 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20   DEFAULT '',.   
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c0: 20 20 6f 77 6e 65 72 20 20 20 20 20 20 20 54 45    owner       TE
17d0: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20  XT DEFAULT '',. 
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1800: 20 20 20 20 64 65 73 63 72 69 70 74 69 6f 6e 20      description 
1810: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c  TEXT DEFAULT '',
1820: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1840: 20 20 20 20 20 20 72 65 76 69 65 77 65 64 20 20        reviewed  
1850: 20 20 54 49 4d 45 53 54 41 4d 50 2c 0a 20 20 20    TIMESTAMP,.   
1860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1880: 20 20 69 74 65 72 61 74 65 64 20 20 20 20 54 45    iterated    TE
1890: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20  XT DEFAULT '',. 
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c0: 20 20 20 20 61 76 67 5f 72 75 6e 74 69 6d 65 20      avg_runtime 
18d0: 52 45 41 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  REAL,.          
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f0: 20 20 20 20 20 20 20 20 20 20 20 61 76 67 5f 64             avg_d
1900: 69 73 6b 20 20 20 20 52 45 41 4c 2c 0a 20 20 20  isk    REAL,.   
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1930: 20 20 74 61 67 73 20 20 20 20 20 20 20 20 54 45    tags        TE
1940: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20  XT DEFAULT '',. 
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1970: 20 20 20 20 6a 6f 62 67 72 6f 75 70 20 20 20 20      jobgroup    
1980: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 64 65  TEXT DEFAULT 'de
1990: 66 61 75 6c 74 27 2c 0a 20 20 20 20 20 20 20 20  fault',.        
19a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b0: 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52 41 49          CONSTRAI
19c0: 4e 54 20 74 65 73 74 5f 6d 65 74 61 5f 63 6f 6e  NT test_meta_con
19d0: 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28  straint UNIQUE (
19e0: 74 65 73 74 6e 61 6d 65 29 29 3b 22 29 0a 20 20  testname));").  
19f0: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
1a00: 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41  te db "CREATE TA
1a10: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54  BLE IF NOT EXIST
1a20: 53 20 74 65 73 74 5f 64 61 74 61 20 28 69 64 20  S test_data (id 
1a30: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
1a40: 4b 45 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20  KEY,.           
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a60: 20 20 20 20 20 74 65 73 74 5f 69 64 20 49 4e 54       test_id INT
1a70: 45 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20  EGER,.          
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 20 20 20 20 20 20 63 61 74 65 67 6f 72 79 20 54        category T
1aa0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a  EXT DEFAULT '',.
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad0: 76 61 72 69 61 62 6c 65 20 54 45 58 54 2c 0a 09  variable TEXT,..
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af0: 20 20 20 20 20 20 20 20 76 61 6c 75 65 20 52 45          value RE
1b00: 41 4c 2c 0a 09 20 20 20 20 20 20 20 20 20 20 20  AL,..           
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70               exp
1b20: 65 63 74 65 64 20 52 45 41 4c 2c 0a 09 20 20 20  ected REAL,..   
1b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b40: 20 20 20 20 20 74 6f 6c 20 52 45 41 4c 2c 0a 20       tol REAL,. 
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75                 u
1b70: 6e 69 74 73 20 54 45 58 54 2c 0a 20 20 20 20 20  nits TEXT,.     
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 65             comme
1ba0: 6e 74 20 54 45 58 54 20 44 45 46 41 55 4c 54 20  nt TEXT DEFAULT 
1bb0: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '',.            
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd0: 20 20 20 20 73 74 61 74 75 73 20 54 45 58 54 20      status TEXT 
1be0: 44 45 46 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20  DEFAULT 'n/a',. 
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1c10: 79 70 65 20 54 45 58 54 20 44 45 46 41 55 4c 54  ype TEXT DEFAULT
1c20: 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20   '',.           
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 65     CONSTRAINT te
1c50: 73 74 5f 64 61 74 61 5f 63 6f 6e 73 74 72 61 69  st_data_constrai
1c60: 6e 74 20 55 4e 49 51 55 45 20 28 74 65 73 74 5f  nt UNIQUE (test_
1c70: 69 64 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 69  id,category,vari
1c80: 61 62 6c 65 29 29 3b 22 29 0a 20 20 20 20 3b 3b  able));").    ;;
1c90: 20 4d 75 73 74 20 64 6f 20 74 68 69 73 20 2a 61   Must do this *a
1ca0: 66 74 65 72 2a 20 72 75 6e 6e 69 6e 67 20 70 61  fter* running pa
1cb0: 74 63 68 20 64 62 20 21 21 20 4e 6f 20 6d 6f 72  tch db !! No mor
1cc0: 65 2e 20 0a 20 20 20 20 28 64 62 3a 73 65 74 2d  e. .    (db:set-
1cd0: 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 53 54  var db "MEGATEST
1ce0: 5f 56 45 52 53 49 4f 4e 22 20 6d 65 67 61 74 65  _VERSION" megate
1cf0: 73 74 2d 76 65 72 73 69 6f 6e 29 0a 20 20 20 20  st-version).    
1d00: 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ))..;;==========
1d10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1d20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1d30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1d40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20  ============.;; 
1d50: 54 4f 44 4f 3a 0a 3b 3b 20 20 20 70 75 74 20 64  TODO:.;;   put d
1d60: 65 6c 74 61 73 20 69 6e 74 6f 20 61 6e 20 61 73  eltas into an as
1d70: 73 6f 63 20 6c 69 73 74 20 77 69 74 68 20 76 65  soc list with ve
1d80: 72 73 69 6f 6e 20 6e 75 6d 62 65 72 73 0a 3b 3b  rsion numbers.;;
1d90: 20 20 20 61 70 70 6c 79 20 61 6c 6c 20 66 72 6f     apply all fro
1da0: 6d 20 6c 61 73 74 20 74 6f 20 63 75 72 72 65 6e  m last to curren
1db0: 74 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  t.;;============
1dc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1dd0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1de0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1df0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 28 64 65 66 69  ==========.(defi
1e00: 6e 65 20 28 70 61 74 63 68 2d 64 62 20 64 62 29  ne (patch-db db)
1e10: 0a 20 20 28 68 61 6e 64 6c 65 2d 65 78 63 65 70  .  (handle-excep
1e20: 74 69 6f 6e 73 0a 20 20 20 65 78 6e 0a 20 20 20  tions.   exn.   
1e30: 28 62 65 67 69 6e 0a 20 20 20 20 20 28 70 72 69  (begin.     (pri
1e40: 6e 74 20 22 45 78 63 65 70 74 69 6f 6e 3a 20 22  nt "Exception: "
1e50: 20 65 78 6e 29 0a 20 20 20 20 20 28 70 72 69 6e   exn).     (prin
1e60: 74 20 22 45 52 52 4f 52 3a 20 50 6f 73 73 69 62  t "ERROR: Possib
1e70: 6c 65 20 6f 75 74 20 6f 66 20 64 61 74 65 20 73  le out of date s
1e80: 63 68 65 6d 61 2c 20 61 74 74 65 6d 70 74 69 6e  chema, attemptin
1e90: 67 20 74 6f 20 61 64 64 20 74 61 62 6c 65 20 6d  g to add table m
1ea0: 65 74 61 64 61 74 61 2e 2e 2e 22 29 0a 20 20 20  etadata...").   
1eb0: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
1ec0: 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41  te db "CREATE TA
1ed0: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54  BLE IF NOT EXIST
1ee0: 53 20 6d 65 74 61 64 61 74 20 28 69 64 20 49 4e  S metadat (id IN
1ef0: 54 45 47 45 52 2c 20 76 61 72 20 54 45 58 54 2c  TEGER, var TEXT,
1f00: 20 76 61 6c 20 54 45 58 54 2c 0a 20 20 20 20 20   val TEXT,.     
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f20: 20 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e 53              CONS
1f30: 54 52 41 49 4e 54 20 6d 65 74 61 64 61 74 5f 63  TRAINT metadat_c
1f40: 6f 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45  onstraint UNIQUE
1f50: 20 28 76 61 72 29 29 3b 22 29 0a 20 20 20 20 20   (var));").     
1f60: 28 69 66 20 28 6e 6f 74 20 28 64 62 3a 67 65 74  (if (not (db:get
1f70: 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 53  -var db "MEGATES
1f80: 54 5f 56 45 52 53 49 4f 4e 22 29 29 0a 09 20 28  T_VERSION")).. (
1f90: 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d  db:set-var db "M
1fa0: 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22  EGATEST_VERSION"
1fb0: 20 31 2e 31 37 29 29 29 0a 20 20 20 28 6c 65 74   1.17))).   (let
1fc0: 20 28 28 6d 76 65 72 20 28 64 62 3a 67 65 74 2d   ((mver (db:get-
1fd0: 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 53 54  var db "MEGATEST
1fe0: 5f 56 45 52 53 49 4f 4e 22 29 29 0a 09 20 28 74  _VERSION")).. (t
1ff0: 65 73 74 2d 6d 65 74 61 2d 64 65 66 20 22 43 52  est-meta-def "CR
2000: 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f  EATE TABLE IF NO
2010: 54 20 45 58 49 53 54 53 20 74 65 73 74 5f 6d 65  T EXISTS test_me
2020: 74 61 20 28 69 64 20 49 4e 54 45 47 45 52 20 50  ta (id INTEGER P
2030: 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20  RIMARY KEY,.    
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2060: 20 74 65 73 74 6e 61 6d 65 20 20 20 20 54 45 58   testname    TEX
2070: 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20  T DEFAULT '',.  
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a0: 20 20 20 61 75 74 68 6f 72 20 20 20 20 20 20 54     author      T
20b0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a  EXT DEFAULT '',.
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e0: 20 20 20 20 20 6f 77 6e 65 72 20 20 20 20 20 20       owner      
20f0: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27   TEXT DEFAULT ''
2100: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2120: 20 20 20 20 20 20 20 64 65 73 63 72 69 70 74 69         descripti
2130: 6f 6e 20 54 45 58 54 20 44 45 46 41 55 4c 54 20  on TEXT DEFAULT 
2140: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '',.            
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 20 20 20 20 20 20 20 72 65 76 69 65 77 65           reviewe
2170: 64 20 20 20 20 54 49 4d 45 53 54 41 4d 50 2c 0a  d    TIMESTAMP,.
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 20 20 20 69 74 65 72 61 74 65 64 20 20 20       iterated   
21b0: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27   TEXT DEFAULT ''
21c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 20 20 20 20 20 20 20 61 76 67 5f 72 75 6e 74 69         avg_runti
21f0: 6d 65 20 52 45 41 4c 2c 0a 20 20 20 20 20 20 20  me REAL,.       
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 76                av
2220: 67 5f 64 69 73 6b 20 20 20 20 52 45 41 4c 2c 0a  g_disk    REAL,.
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2250: 20 20 20 20 20 74 61 67 73 20 20 20 20 20 20 20       tags       
2260: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27   TEXT DEFAULT ''
2270: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2290: 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 65 73    CONSTRAINT tes
22a0: 74 5f 6d 65 74 61 5f 63 6f 6e 73 74 72 61 69 6e  t_meta_constrain
22b0: 74 20 55 4e 49 51 55 45 20 28 74 65 73 74 6e 61  t UNIQUE (testna
22c0: 6d 65 29 29 3b 22 29 29 0a 20 20 20 20 20 28 70  me));")).     (p
22d0: 72 69 6e 74 20 22 43 75 72 72 65 6e 74 20 73 63  rint "Current sc
22e0: 68 65 6d 61 20 76 65 72 73 69 6f 6e 3a 20 22 20  hema version: " 
22f0: 6d 76 65 72 20 22 20 63 75 72 72 65 6e 74 20 6d  mver " current m
2300: 65 67 61 74 65 73 74 20 76 65 72 73 69 6f 6e 3a  egatest version:
2310: 20 22 20 6d 65 67 61 74 65 73 74 2d 76 65 72 73   " megatest-vers
2320: 69 6f 6e 29 0a 20 20 20 20 20 28 63 6f 6e 64 0a  ion).     (cond.
2330: 20 20 20 20 20 20 28 28 6e 6f 74 20 6d 76 65 72        ((not mver
2340: 29 0a 20 20 20 20 20 20 20 28 70 72 69 6e 74 20  ).       (print 
2350: 22 41 64 64 69 6e 67 20 6d 65 67 61 74 65 73 74  "Adding megatest
2360: 2d 76 65 72 73 69 6f 6e 20 74 6f 20 6d 65 74 61  -version to meta
2370: 64 61 74 61 22 29 20 3b 3b 20 4e 65 65 64 20 74  data") ;; Need t
2380: 6f 20 72 65 63 72 65 61 74 65 20 74 68 65 20 74  o recreate the t
2390: 61 62 6c 65 0a 20 20 20 20 20 20 20 28 73 71 6c  able.       (sql
23a0: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
23b0: 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45  "DROP TABLE IF E
23c0: 58 49 53 54 53 20 6d 65 74 61 64 61 74 3b 22 29  XISTS metadat;")
23d0: 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  .       (sqlite3
23e0: 3a 65 78 65 63 75 74 65 20 64 62 20 22 43 52 45  :execute db "CRE
23f0: 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54  ATE TABLE IF NOT
2400: 20 45 58 49 53 54 53 20 6d 65 74 61 64 61 74 20   EXISTS metadat 
2410: 28 69 64 20 49 4e 54 45 47 45 52 2c 20 76 61 72  (id INTEGER, var
2420: 20 54 45 58 54 2c 20 76 61 6c 20 54 45 58 54 2c   TEXT, val TEXT,
2430: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2450: 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 6d 65     CONSTRAINT me
2460: 74 61 64 61 74 5f 63 6f 6e 73 74 72 61 69 6e 74  tadat_constraint
2470: 20 55 4e 49 51 55 45 20 28 76 61 72 29 29 3b 22   UNIQUE (var));"
2480: 29 0a 20 20 20 20 20 20 20 28 64 62 3a 73 65 74  ).       (db:set
2490: 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 53  -var db "MEGATES
24a0: 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e 31 37 29  T_VERSION" 1.17)
24b0: 0a 20 20 20 20 20 20 20 28 70 61 74 63 68 2d 64  .       (patch-d
24c0: 62 29 29 0a 20 20 20 20 20 20 28 28 3c 20 6d 76  b)).      ((< mv
24d0: 65 72 20 31 2e 32 31 29 0a 20 20 20 20 20 20 20  er 1.21).       
24e0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
24f0: 20 64 62 20 22 44 52 4f 50 20 54 41 42 4c 45 20   db "DROP TABLE 
2500: 49 46 20 45 58 49 53 54 53 20 6d 65 74 61 64 61  IF EXISTS metada
2510: 74 3b 22 29 0a 20 20 20 20 20 20 20 28 73 71 6c  t;").       (sql
2520: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
2530: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46  "CREATE TABLE IF
2540: 20 4e 4f 54 20 45 58 49 53 54 53 20 6d 65 74 61   NOT EXISTS meta
2550: 64 61 74 20 28 69 64 20 49 4e 54 45 47 45 52 2c  dat (id INTEGER,
2560: 20 76 61 72 20 54 45 58 54 2c 20 76 61 6c 20 54   var TEXT, val T
2570: 45 58 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  EXT,.           
2580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2590: 20 20 20 20 20 20 20 43 4f 4e 53 54 52 41 49 4e         CONSTRAIN
25a0: 54 20 6d 65 74 61 64 61 74 5f 63 6f 6e 73 74 72  T metadat_constr
25b0: 61 69 6e 74 20 55 4e 49 51 55 45 20 28 76 61 72  aint UNIQUE (var
25c0: 29 29 3b 22 29 0a 20 20 20 20 20 20 20 28 64 62  ));").       (db
25d0: 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47  :set-var db "MEG
25e0: 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 31  ATEST_VERSION" 1
25f0: 2e 32 31 29 20 3b 3b 20 73 65 74 20 62 65 66 6f  .21) ;; set befo
2600: 72 65 2c 20 6a 75 73 74 20 69 6e 20 63 61 73 65  re, just in case
2610: 20 74 68 65 20 63 68 61 6e 67 65 73 20 61 72 65   the changes are
2620: 20 61 6c 72 65 61 64 79 20 61 70 70 6c 69 65 64   already applied
2630: 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  .       (sqlite3
2640: 3a 65 78 65 63 75 74 65 20 64 62 20 74 65 73 74  :execute db test
2650: 2d 6d 65 74 61 2d 64 65 66 29 0a 09 09 09 09 09  -meta-def)......
2660: 3b 28 66 6f 72 2d 65 61 63 68 20 0a 09 09 09 09  ;(for-each .....
2670: 09 3b 20 28 6c 61 6d 62 64 61 20 28 73 74 6d 74  .; (lambda (stmt
2680: 29 0a 09 09 09 09 09 3b 20 20 20 28 73 71 6c 69  )......;   (sqli
2690: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 73  te3:execute db s
26a0: 74 6d 74 29 29 0a 09 09 09 09 09 3b 20 28 6c 69  tmt))......; (li
26b0: 73 74 20 0a 09 09 09 09 09 3b 20 20 22 41 4c 54  st ......;  "ALT
26c0: 45 52 20 54 41 42 4c 45 20 74 65 73 74 73 20 41  ER TABLE tests A
26d0: 44 44 20 43 4f 4c 55 4d 4e 20 66 69 72 73 74 5f  DD COLUMN first_
26e0: 65 72 72 20 54 45 58 54 3b 22 0a 09 09 09 09 09  err TEXT;"......
26f0: 3b 20 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20  ;  "ALTER TABLE 
2700: 74 65 73 74 73 20 41 44 44 20 43 4f 4c 55 4d 4e  tests ADD COLUMN
2710: 20 66 69 72 73 74 5f 77 61 72 6e 20 54 45 58 54   first_warn TEXT
2720: 3b 22 0a 09 09 09 09 09 3b 20 20 29 29 0a 20 20  ;"......;  )).  
2730: 20 20 20 20 20 28 70 61 74 63 68 2d 64 62 29 29       (patch-db))
2740: 0a 20 20 20 20 20 20 28 28 3c 20 6d 76 65 72 20  .      ((< mver 
2750: 31 2e 32 34 29 0a 20 20 20 20 20 20 20 28 64 62  1.24).       (db
2760: 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47  :set-var db "MEG
2770: 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 31  ATEST_VERSION" 1
2780: 2e 32 34 29 0a 20 20 20 20 20 20 20 28 73 71 6c  .24).       (sql
2790: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
27a0: 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45  "DROP TABLE IF E
27b0: 58 49 53 54 53 20 74 65 73 74 5f 64 61 74 61 3b  XISTS test_data;
27c0: 22 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74  ").       (sqlit
27d0: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 44  e3:execute db "D
27e0: 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49  ROP TABLE IF EXI
27f0: 53 54 53 20 74 65 73 74 5f 6d 65 74 61 3b 22 29  STS test_meta;")
2800: 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  .       (sqlite3
2810: 3a 65 78 65 63 75 74 65 20 64 62 20 74 65 73 74  :execute db test
2820: 2d 6d 65 74 61 2d 64 65 66 29 0a 20 20 20 20 20  -meta-def).     
2830: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
2840: 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41  te db "CREATE TA
2850: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54  BLE IF NOT EXIST
2860: 53 20 74 65 73 74 5f 64 61 74 61 20 28 69 64 20  S test_data (id 
2870: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
2880: 4b 45 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20  KEY,.           
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a0: 20 20 20 20 20 74 65 73 74 5f 69 64 20 49 4e 54       test_id INT
28b0: 45 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20  EGER,.          
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d0: 20 20 20 20 20 20 63 61 74 65 67 6f 72 79 20 54        category T
28e0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a  EXT DEFAULT '',.
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2910: 76 61 72 69 61 62 6c 65 20 54 45 58 54 2c 0a 09  variable TEXT,..
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2930: 20 20 20 20 20 20 20 20 76 61 6c 75 65 20 52 45          value RE
2940: 41 4c 2c 0a 09 20 20 20 20 20 20 20 20 20 20 20  AL,..           
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70               exp
2960: 65 63 74 65 64 20 52 45 41 4c 2c 0a 09 20 20 20  ected REAL,..   
2970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2980: 20 20 20 20 20 74 6f 6c 20 52 45 41 4c 2c 0a 20       tol REAL,. 
2990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75                 u
29b0: 6e 69 74 73 20 54 45 58 54 2c 0a 20 20 20 20 20  nits TEXT,.     
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 65             comme
29e0: 6e 74 20 54 45 58 54 20 44 45 46 41 55 4c 54 20  nt TEXT DEFAULT 
29f0: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '',.            
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a10: 20 20 20 20 73 74 61 74 75 73 20 54 45 58 54 20      status TEXT 
2a20: 44 45 46 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20  DEFAULT 'n/a',. 
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e               CON
2a50: 53 54 52 41 49 4e 54 20 74 65 73 74 5f 64 61 74  STRAINT test_dat
2a60: 61 20 55 4e 49 51 55 45 20 28 74 65 73 74 5f 69  a UNIQUE (test_i
2a70: 64 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 69 61  d,category,varia
2a80: 62 6c 65 29 29 3b 22 29 0a 20 20 20 20 20 20 20  ble));").       
2a90: 28 70 72 69 6e 74 20 22 57 41 52 4e 49 4e 47 3a  (print "WARNING:
2aa0: 20 54 61 62 6c 65 20 74 65 73 74 5f 64 61 74 61   Table test_data
2ab0: 20 61 6e 64 20 74 65 73 74 5f 6d 65 74 61 20 77   and test_meta w
2ac0: 65 72 65 20 72 65 63 72 65 61 74 65 64 2e 20 50  ere recreated. P
2ad0: 6c 65 61 73 65 20 64 6f 20 6d 65 67 61 74 65 73  lease do megates
2ae0: 74 20 2d 75 70 64 61 74 65 2d 6d 65 74 61 22 29  t -update-meta")
2af0: 0a 20 20 20 20 20 20 20 28 70 61 74 63 68 2d 64  .       (patch-d
2b00: 62 29 29 0a 20 20 20 20 20 20 28 28 3c 20 6d 76  b)).      ((< mv
2b10: 65 72 20 31 2e 32 37 29 0a 20 20 20 20 20 20 20  er 1.27).       
2b20: 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22  (db:set-var db "
2b30: 4d 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e  MEGATEST_VERSION
2b40: 22 20 31 2e 32 37 29 0a 20 20 20 20 20 20 20 28  " 1.27).       (
2b50: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
2b60: 64 62 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20  db "ALTER TABLE 
2b70: 74 65 73 74 5f 64 61 74 61 20 41 44 44 20 43 4f  test_data ADD CO
2b80: 4c 55 4d 4e 20 74 79 70 65 20 54 45 58 54 20 44  LUMN type TEXT D
2b90: 45 46 41 55 4c 54 20 27 27 3b 22 29 0a 20 20 20  EFAULT '';").   
2ba0: 20 20 20 20 28 70 61 74 63 68 2d 64 62 29 29 0a      (patch-db)).
2bb0: 20 20 20 20 20 20 28 28 3c 20 6d 76 65 72 20 31        ((< mver 1
2bc0: 2e 32 39 29 0a 20 20 20 20 20 20 20 28 64 62 3a  .29).       (db:
2bd0: 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41  set-var db "MEGA
2be0: 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e  TEST_VERSION" 1.
2bf0: 32 39 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69  29).       (sqli
2c00: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22  te3:execute db "
2c10: 41 4c 54 45 52 20 54 41 42 4c 45 20 74 65 73 74  ALTER TABLE test
2c20: 5f 73 74 65 70 73 20 41 44 44 20 43 4f 4c 55 4d  _steps ADD COLUM
2c30: 4e 20 6c 6f 67 66 69 6c 65 20 54 45 58 54 20 44  N logfile TEXT D
2c40: 45 46 41 55 4c 54 20 27 27 3b 22 29 0a 20 20 20  EFAULT '';").   
2c50: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65      (sqlite3:exe
2c60: 63 75 74 65 20 64 62 20 22 41 4c 54 45 52 20 54  cute db "ALTER T
2c70: 41 42 4c 45 20 74 65 73 74 73 20 41 44 44 20 43  ABLE tests ADD C
2c80: 4f 4c 55 4d 4e 20 73 68 6f 72 74 64 69 72 20 54  OLUMN shortdir T
2c90: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 3b 22  EXT DEFAULT '';"
2ca0: 29 29 0a 20 20 20 20 20 20 28 28 3c 20 6d 76 65  )).      ((< mve
2cb0: 72 20 31 2e 33 36 29 0a 20 20 20 20 20 20 20 28  r 1.36).       (
2cc0: 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d  db:set-var db "M
2cd0: 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22  EGATEST_VERSION"
2ce0: 20 31 2e 33 36 29 0a 20 20 20 20 20 20 20 28 73   1.36).       (s
2cf0: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64  qlite3:execute d
2d00: 62 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 74  b "ALTER TABLE t
2d10: 65 73 74 5f 6d 65 74 61 20 41 44 44 20 43 4f 4c  est_meta ADD COL
2d20: 55 4d 4e 20 6a 6f 62 67 72 6f 75 70 20 54 45 58  UMN jobgroup TEX
2d30: 54 20 44 45 46 41 55 4c 54 20 27 64 65 66 61 75  T DEFAULT 'defau
2d40: 6c 74 27 3b 22 29 29 0a 20 20 20 20 20 20 28 28  lt';")).      ((
2d50: 3c 20 6d 76 65 72 20 31 2e 33 37 29 0a 20 20 20  < mver 1.37).   
2d60: 20 20 20 20 28 64 62 3a 73 65 74 2d 76 61 72 20      (db:set-var 
2d70: 64 62 20 22 4d 45 47 41 54 45 53 54 5f 56 45 52  db "MEGATEST_VER
2d80: 53 49 4f 4e 22 20 31 2e 33 37 29 0a 20 20 20 20  SION" 1.37).    
2d90: 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63     (sqlite3:exec
2da0: 75 74 65 20 64 62 20 22 41 4c 54 45 52 20 54 41  ute db "ALTER TA
2db0: 42 4c 45 20 74 65 73 74 73 20 41 44 44 20 43 4f  BLE tests ADD CO
2dc0: 4c 55 4d 4e 20 61 72 63 68 69 76 65 64 20 49 4e  LUMN archived IN
2dd0: 54 45 47 45 52 20 44 45 46 41 55 4c 54 20 30 3b  TEGER DEFAULT 0;
2de0: 22 29 29 20 0a 20 20 20 20 20 20 28 28 3c 20 6d  ")) .      ((< m
2df0: 76 65 72 20 6d 65 67 61 74 65 73 74 2d 76 65 72  ver megatest-ver
2e00: 73 69 6f 6e 29 0a 20 20 20 20 20 20 20 28 64 62  sion).       (db
2e10: 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47  :set-var db "MEG
2e20: 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 6d  ATEST_VERSION" m
2e30: 65 67 61 74 65 73 74 2d 76 65 72 73 69 6f 6e 29  egatest-version)
2e40: 29 29 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d  )))))..;;=======
2e50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2e60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2e70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2e80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a  ===============.
2e90: 3b 3b 20 6d 65 74 61 20 67 65 74 20 61 6e 64 20  ;; meta get and 
2ea0: 73 65 74 20 76 61 72 73 0a 3b 3b 3d 3d 3d 3d 3d  set vars.;;=====
2eb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2ec0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2ed0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2ee0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2ef0: 3d 0a 0a 3b 3b 20 72 65 74 75 72 6e 73 20 6e 75  =..;; returns nu
2f00: 6d 62 65 72 20 69 66 20 73 74 72 69 6e 67 2d 3e  mber if string->
2f10: 6e 75 6d 62 65 72 20 69 73 20 73 75 63 63 65 73  number is succes
2f20: 73 66 75 6c 2c 20 73 74 72 69 6e 67 20 6f 74 68  sful, string oth
2f30: 65 72 77 69 73 65 0a 28 64 65 66 69 6e 65 20 28  erwise.(define (
2f40: 64 62 3a 67 65 74 2d 76 61 72 20 64 62 20 76 61  db:get-var db va
2f50: 72 29 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20  r).  (let ((res 
2f60: 23 66 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65  #f)).    (sqlite
2f70: 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20  3:for-each-row. 
2f80: 20 20 20 20 28 6c 61 6d 62 64 61 20 28 76 61 6c      (lambda (val
2f90: 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72  ).       (set! r
2fa0: 65 73 20 76 61 6c 29 29 0a 20 20 20 20 20 64 62  es val)).     db
2fb0: 20 22 53 45 4c 45 43 54 20 76 61 6c 20 46 52 4f   "SELECT val FRO
2fc0: 4d 20 6d 65 74 61 64 61 74 20 57 48 45 52 45 20  M metadat WHERE 
2fd0: 76 61 72 3d 3f 3b 22 20 76 61 72 29 0a 20 20 20  var=?;" var).   
2fe0: 20 28 69 66 20 28 73 74 72 69 6e 67 3f 20 72 65   (if (string? re
2ff0: 73 29 0a 09 28 6c 65 74 20 28 28 76 61 6c 6e 75  s)..(let ((valnu
3000: 6d 20 28 73 74 72 69 6e 67 2d 3e 6e 75 6d 62 65  m (string->numbe
3010: 72 20 72 65 73 29 29 29 0a 09 20 20 28 69 66 20  r res)))..  (if 
3020: 76 61 6c 6e 75 6d 20 76 61 6c 6e 75 6d 20 72 65  valnum valnum re
3030: 73 29 29 0a 09 72 65 73 29 29 29 0a 0a 28 64 65  s))..res)))..(de
3040: 66 69 6e 65 20 28 64 62 3a 73 65 74 2d 76 61 72  fine (db:set-var
3050: 20 64 62 20 76 61 72 20 76 61 6c 29 0a 20 20 28   db var val).  (
3060: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
3070: 64 62 20 22 49 4e 53 45 52 54 20 4f 52 20 52 45  db "INSERT OR RE
3080: 50 4c 41 43 45 20 49 4e 54 4f 20 6d 65 74 61 64  PLACE INTO metad
3090: 61 74 20 28 76 61 72 2c 76 61 6c 29 20 56 41 4c  at (var,val) VAL
30a0: 55 45 53 20 28 3f 2c 3f 29 3b 22 20 76 61 72 20  UES (?,?);" var 
30b0: 76 61 6c 29 29 0a 0a 3b 3b 20 75 73 65 20 61 20  val))..;; use a 
30c0: 67 6c 6f 62 61 6c 20 66 6f 72 20 73 6f 6d 65 20  global for some 
30d0: 70 72 69 6d 69 74 69 76 65 20 63 61 63 68 69 6e  primitive cachin
30e0: 67 2c 20 69 74 20 69 73 20 6a 75 73 74 20 73 69  g, it is just si
30f0: 6c 6c 79 20 74 6f 20 72 65 2d 72 65 61 64 20 74  lly to re-read t
3100: 68 65 20 64 62 20 0a 3b 3b 20 6f 76 65 72 20 61  he db .;; over a
3110: 6e 64 20 6f 76 65 72 20 61 67 61 69 6e 20 66 6f  nd over again fo
3120: 72 20 74 68 65 20 6b 65 79 73 20 73 69 6e 63 65  r the keys since
3130: 20 74 68 65 79 20 6e 65 76 65 72 20 63 68 61 6e   they never chan
3140: 67 65 0a 0a 28 64 65 66 69 6e 65 20 2a 64 62 2d  ge..(define *db-
3150: 6b 65 79 73 2a 20 23 66 29 0a 0a 28 64 65 66 69  keys* #f)..(defi
3160: 6e 65 20 28 64 62 3a 67 65 74 2d 6b 65 79 73 20  ne (db:get-keys 
3170: 64 62 29 0a 20 20 28 69 66 20 2a 64 62 2d 6b 65  db).  (if *db-ke
3180: 79 73 2a 20 2a 64 62 2d 6b 65 79 73 2a 20 0a 20  ys* *db-keys* . 
3190: 20 20 20 20 20 28 6c 65 74 20 28 28 72 65 73 20       (let ((res 
31a0: 27 28 29 29 29 0a 09 28 73 71 6c 69 74 65 33 3a  '()))..(sqlite3:
31b0: 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 09 20  for-each-row .. 
31c0: 28 6c 61 6d 62 64 61 20 28 6b 65 79 20 6b 65 79  (lambda (key key
31d0: 74 79 70 65 29 0a 09 20 20 20 28 73 65 74 21 20  type)..   (set! 
31e0: 72 65 73 20 28 63 6f 6e 73 20 28 76 65 63 74 6f  res (cons (vecto
31f0: 72 20 6b 65 79 20 6b 65 79 74 79 70 65 29 20 72  r key keytype) r
3200: 65 73 29 29 29 0a 09 20 64 62 0a 09 20 22 53 45  es))).. db.. "SE
3210: 4c 45 43 54 20 66 69 65 6c 64 6e 61 6d 65 2c 66  LECT fieldname,f
3220: 69 65 6c 64 74 79 70 65 20 46 52 4f 4d 20 6b 65  ieldtype FROM ke
3230: 79 73 20 4f 52 44 45 52 20 42 59 20 69 64 20 44  ys ORDER BY id D
3240: 45 53 43 3b 22 29 0a 09 28 73 65 74 21 20 2a 64  ESC;")..(set! *d
3250: 62 2d 6b 65 79 73 2a 20 72 65 73 29 0a 09 72 65  b-keys* res)..re
3260: 73 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64  s)))..(define (d
3270: 62 3a 67 65 74 2d 76 61 6c 75 65 2d 62 79 2d 68  b:get-value-by-h
3280: 65 61 64 65 72 20 72 6f 77 20 68 65 61 64 65 72  eader row header
3290: 20 66 69 65 6c 64 29 0a 20 20 3b 3b 20 28 64 65   field).  ;; (de
32a0: 62 75 67 3a 70 72 69 6e 74 20 32 20 22 64 62 3a  bug:print 2 "db:
32b0: 67 65 74 2d 76 61 6c 75 65 2d 62 79 2d 68 65 61  get-value-by-hea
32c0: 64 65 72 20 72 6f 77 3a 20 22 20 72 6f 77 20 22  der row: " row "
32d0: 20 68 65 61 64 65 72 3a 20 22 20 68 65 61 64 65   header: " heade
32e0: 72 20 22 20 66 69 65 6c 64 3a 20 22 20 66 69 65  r " field: " fie
32f0: 6c 64 29 0a 20 20 28 69 66 20 28 6e 75 6c 6c 3f  ld).  (if (null?
3300: 20 68 65 61 64 65 72 29 20 23 66 0a 20 20 20 20   header) #f.    
3310: 20 20 28 6c 65 74 20 6c 6f 6f 70 20 28 28 68 65    (let loop ((he
3320: 64 20 28 63 61 72 20 68 65 61 64 65 72 29 29 0a  d (car header)).
3330: 09 09 20 28 74 61 6c 20 28 63 64 72 20 68 65 61  .. (tal (cdr hea
3340: 64 65 72 29 29 0a 09 09 20 28 6e 20 20 20 30 29  der))... (n   0)
3350: 29 0a 09 28 69 66 20 28 65 71 75 61 6c 3f 20 68  )..(if (equal? h
3360: 65 64 20 66 69 65 6c 64 29 0a 09 20 20 20 20 28  ed field)..    (
3370: 76 65 63 74 6f 72 2d 72 65 66 20 72 6f 77 20 6e  vector-ref row n
3380: 29 0a 09 20 20 20 20 28 69 66 20 28 6e 75 6c 6c  )..    (if (null
3390: 3f 20 74 61 6c 29 20 23 66 20 28 6c 6f 6f 70 20  ? tal) #f (loop 
33a0: 28 63 61 72 20 74 61 6c 29 28 63 64 72 20 74 61  (car tal)(cdr ta
33b0: 6c 29 28 2b 20 6e 20 31 29 29 29 29 29 29 29 0a  l)(+ n 1))))))).
33c0: 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  .;;=============
33d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
33e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
33f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3400: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 20 52 20  =========.;;  R 
3410: 55 20 4e 20 53 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d  U N S.;;========
3420: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3430: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3440: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3450: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a  ==============..
3460: 28 64 65 66 69 6e 65 20 28 72 75 6e 73 3a 67 65  (define (runs:ge
3470: 74 2d 73 74 64 2d 72 75 6e 2d 66 69 65 6c 64 73  t-std-run-fields
3480: 20 6b 65 79 73 20 72 65 6d 66 69 65 6c 64 73 29   keys remfields)
3490: 0a 20 20 28 6c 65 74 2a 20 28 28 68 65 61 64 65  .  (let* ((heade
34a0: 72 20 20 20 20 28 61 70 70 65 6e 64 20 28 6d 61  r    (append (ma
34b0: 70 20 6b 65 79 3a 67 65 74 2d 66 69 65 6c 64 6e  p key:get-fieldn
34c0: 61 6d 65 20 6b 65 79 73 29 0a 09 09 09 20 20 20  ame keys)....   
34d0: 20 72 65 6d 66 69 65 6c 64 73 29 29 0a 09 20 28   remfields)).. (
34e0: 6b 65 79 73 74 72 20 20 20 20 28 63 6f 6e 63 20  keystr    (conc 
34f0: 28 6b 65 79 73 2d 3e 6b 65 79 73 74 72 20 6b 65  (keys->keystr ke
3500: 79 73 29 20 22 2c 22 0a 09 09 09 20 20 28 73 74  ys) ","....  (st
3510: 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65  ring-intersperse
3520: 20 72 65 6d 66 69 65 6c 64 73 20 22 2c 22 29 29   remfields ","))
3530: 29 29 0a 20 20 20 20 28 6c 69 73 74 20 6b 65 79  )).    (list key
3540: 73 74 72 20 68 65 61 64 65 72 29 29 29 0a 0a 3b  str header)))..;
3550: 3b 20 6d 61 6b 65 20 61 20 71 75 65 72 79 20 28  ; make a query (
3560: 66 69 65 6c 64 6e 61 6d 65 20 6c 69 6b 65 20 27  fieldname like '
3570: 70 61 74 74 31 27 20 4f 52 20 66 69 65 6c 64 6e  patt1' OR fieldn
3580: 61 6d 65 20 0a 28 64 65 66 69 6e 65 20 28 64 62  ame .(define (db
3590: 3a 70 61 74 74 2d 3e 6c 69 6b 65 20 66 69 65 6c  :patt->like fiel
35a0: 64 6e 61 6d 65 20 70 61 74 74 73 74 72 20 23 21  dname pattstr #!
35b0: 6b 65 79 20 28 63 6f 6d 70 61 72 61 74 6f 72 20  key (comparator 
35c0: 22 20 4f 52 20 22 29 29 0a 20 20 28 6c 65 74 20  " OR ")).  (let 
35d0: 28 28 70 61 74 74 73 20 28 69 66 20 28 73 74 72  ((patts (if (str
35e0: 69 6e 67 3f 20 70 61 74 74 73 74 72 29 0a 09 09  ing? pattstr)...
35f0: 20 20 20 28 73 74 72 69 6e 67 2d 73 70 6c 69 74     (string-split
3600: 20 70 61 74 74 73 74 72 20 22 2c 22 29 0a 09 09   pattstr ",")...
3610: 20 20 20 27 28 22 25 22 29 29 29 29 0a 20 20 20     '("%")))).   
3620: 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70   (string-intersp
3630: 65 72 73 65 20 28 6d 61 70 20 28 6c 61 6d 62 64  erse (map (lambd
3640: 61 20 28 70 61 74 74 29 0a 09 09 09 20 20 20 20  a (patt)....    
3650: 20 20 20 28 63 6f 6e 63 20 66 69 65 6c 64 6e 61     (conc fieldna
3660: 6d 65 20 22 20 4c 49 4b 45 20 27 22 20 70 61 74  me " LIKE '" pat
3670: 74 20 22 27 22 29 29 0a 09 09 09 20 20 20 20 20  t "'"))....     
3680: 28 69 66 20 28 6e 75 6c 6c 3f 20 70 61 74 74 73  (if (null? patts
3690: 29 0a 09 09 09 09 20 27 28 22 22 29 0a 09 09 09  )..... '("")....
36a0: 09 20 70 61 74 74 73 29 29 0a 09 09 09 63 6f 6d  . patts))....com
36b0: 70 61 72 61 74 6f 72 29 29 29 0a 0a 3b 3b 20 72  parator)))..;; r
36c0: 65 70 6c 61 63 65 20 68 65 61 64 65 72 20 61 6e  eplace header an
36d0: 64 20 6b 65 79 73 74 72 20 77 69 74 68 20 61 20  d keystr with a 
36e0: 63 61 6c 6c 20 74 6f 20 72 75 6e 73 3a 67 65 74  call to runs:get
36f0: 2d 73 74 64 2d 72 75 6e 2d 66 69 65 6c 64 73 0a  -std-run-fields.
3700: 3b 3b 0a 3b 3b 20 6b 65 79 70 61 74 74 73 3a 20  ;;.;; keypatts: 
3710: 28 20 28 4b 45 59 31 20 22 61 62 63 25 64 65 66  ( (KEY1 "abc%def
3720: 22 29 28 4b 45 59 32 20 22 25 22 29 20 29 0a 3b  ")(KEY2 "%") ).;
3730: 3b 20 72 75 6e 70 61 74 74 73 3a 20 70 61 74 74  ; runpatts: patt
3740: 31 2c 70 61 74 74 32 20 2e 2e 2e 0a 3b 3b 0a 28  1,patt2 ....;;.(
3750: 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 72  define (db:get-r
3760: 75 6e 73 20 64 62 20 72 75 6e 70 61 74 74 20 63  uns db runpatt c
3770: 6f 75 6e 74 20 6f 66 66 73 65 74 20 6b 65 79 70  ount offset keyp
3780: 61 74 74 73 29 0a 20 20 28 6c 65 74 2a 20 28 28  atts).  (let* ((
3790: 72 65 73 20 20 20 20 20 20 20 27 28 29 29 0a 09  res       '())..
37a0: 20 28 6b 65 79 73 20 20 20 20 20 20 20 28 64 62   (keys       (db
37b0: 3a 67 65 74 2d 6b 65 79 73 20 64 62 29 29 0a 09  :get-keys db))..
37c0: 20 28 72 75 6e 70 61 74 74 73 74 72 20 28 64 62   (runpattstr (db
37d0: 3a 70 61 74 74 2d 3e 6c 69 6b 65 20 22 72 75 6e  :patt->like "run
37e0: 6e 61 6d 65 22 20 72 75 6e 70 61 74 74 29 29 0a  name" runpatt)).
37f0: 09 20 28 72 65 6d 66 69 65 6c 64 73 20 20 28 6c  . (remfields  (l
3800: 69 73 74 20 22 69 64 22 20 22 72 75 6e 6e 61 6d  ist "id" "runnam
3810: 65 22 20 22 73 74 61 74 65 22 20 22 73 74 61 74  e" "state" "stat
3820: 75 73 22 20 22 6f 77 6e 65 72 22 20 22 65 76 65  us" "owner" "eve
3830: 6e 74 5f 74 69 6d 65 22 29 29 0a 09 20 28 68 65  nt_time")).. (he
3840: 61 64 65 72 20 20 20 20 20 28 61 70 70 65 6e 64  ader     (append
3850: 20 28 6d 61 70 20 6b 65 79 3a 67 65 74 2d 66 69   (map key:get-fi
3860: 65 6c 64 6e 61 6d 65 20 6b 65 79 73 29 0a 09 09  eldname keys)...
3870: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6d               rem
3880: 66 69 65 6c 64 73 29 29 0a 09 20 28 6b 65 79 73  fields)).. (keys
3890: 74 72 20 20 20 20 20 28 63 6f 6e 63 20 28 6b 65  tr     (conc (ke
38a0: 79 73 2d 3e 6b 65 79 73 74 72 20 6b 65 79 73 29  ys->keystr keys)
38b0: 20 22 2c 22 0a 09 09 20 20 20 20 20 20 20 20 20   ","...         
38c0: 20 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73    (string-inters
38d0: 70 65 72 73 65 20 72 65 6d 66 69 65 6c 64 73 20  perse remfields 
38e0: 22 2c 22 29 29 29 0a 09 20 28 71 72 79 73 74 72  ","))).. (qrystr
38f0: 20 20 20 20 20 28 63 6f 6e 63 20 22 53 45 4c 45       (conc "SELE
3900: 43 54 20 22 20 6b 65 79 73 74 72 20 22 20 46 52  CT " keystr " FR
3910: 4f 4d 20 72 75 6e 73 20 57 48 45 52 45 20 28 22  OM runs WHERE ("
3920: 20 72 75 6e 70 61 74 74 73 74 72 20 22 29 20 22   runpattstr ") "
3930: 20 3b 3b 20 72 75 6e 6e 61 6d 65 20 4c 49 4b 45   ;; runname LIKE
3940: 20 3f 20 22 0a 09 09 20 20 20 20 20 20 20 20 20   ? "...         
3950: 20 20 3b 3b 20 47 65 6e 65 72 61 74 65 3a 20 22    ;; Generate: "
3960: 20 41 4e 44 20 78 20 4c 49 4b 45 20 27 6b 65 79   AND x LIKE 'key
3970: 70 61 74 74 27 20 2e 2e 2e 22 0a 09 09 20 20 20  patt' ..."...   
3980: 20 20 20 20 20 20 20 20 28 69 66 20 28 6e 75 6c          (if (nul
3990: 6c 3f 20 6b 65 79 70 61 74 74 73 29 20 22 22 0a  l? keypatts) "".
39a0: 09 09 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
39b0: 20 28 63 6f 6e 63 20 22 20 41 4e 44 20 22 0a 09   (conc " AND "..
39c0: 09 20 20 20 20 20 20 20 20 20 09 20 20 20 20 28  .         .    (
39d0: 73 74 72 69 6e 67 2d 6a 6f 69 6e 20 0a 09 09 20  string-join ... 
39e0: 20 20 20 20 20 20 20 20 09 20 20 20 20 20 28 6d          .     (m
39f0: 61 70 20 28 6c 61 6d 62 64 61 20 28 6b 65 79 70  ap (lambda (keyp
3a00: 61 74 74 29 0a 09 09 20 20 20 20 20 20 20 20 20  att)...         
3a10: 09 09 20 20 20 20 28 6c 65 74 20 28 28 6b 65 79  ..    (let ((key
3a20: 20 20 28 63 61 72 20 6b 65 79 70 61 74 74 29 29    (car keypatt))
3a30: 0a 09 09 20 20 20 20 20 20 20 20 20 09 09 09 20  ...         ... 
3a40: 20 28 70 61 74 74 20 28 63 61 64 72 20 6b 65 79   (patt (cadr key
3a50: 70 61 74 74 29 29 29 0a 09 09 20 20 20 20 20 20  patt)))...      
3a60: 20 20 20 09 09 20 20 20 20 20 20 28 64 62 3a 70     ..      (db:p
3a70: 61 74 74 2d 3e 6c 69 6b 65 20 6b 65 79 20 70 61  att->like key pa
3a80: 74 74 29 29 29 0a 09 09 20 20 20 20 20 20 20 20  tt)))...        
3a90: 20 09 09 20 20 6b 65 79 70 61 74 74 73 29 0a 09   ..  keypatts)..
3aa0: 09 20 20 20 20 20 20 20 20 20 09 20 20 20 20 20  .         .     
3ab0: 22 20 41 4e 44 20 22 29 29 29 0a 09 09 20 20 20  " AND ")))...   
3ac0: 20 20 20 20 20 20 20 20 22 20 4f 52 44 45 52 20          " ORDER 
3ad0: 42 59 20 65 76 65 6e 74 5f 74 69 6d 65 20 44 45  BY event_time DE
3ae0: 53 43 20 22 0a 09 09 20 20 20 20 20 20 20 20 20  SC "...         
3af0: 20 20 28 69 66 20 28 6e 75 6d 62 65 72 3f 20 63    (if (number? c
3b00: 6f 75 6e 74 29 0a 09 09 20 20 20 20 20 20 20 20  ount)...        
3b10: 20 20 20 20 20 20 20 28 63 6f 6e 63 20 22 20 4c         (conc " L
3b20: 49 4d 49 54 20 22 20 63 6f 75 6e 74 29 0a 09 09  IMIT " count)...
3b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
3b40: 22 29 0a 09 09 20 20 20 20 20 20 20 20 20 20 20  ")...           
3b50: 28 69 66 20 28 6e 75 6d 62 65 72 3f 20 6f 66 66  (if (number? off
3b60: 73 65 74 29 0a 09 09 20 20 20 20 20 20 20 20 20  set)...         
3b70: 20 20 20 20 20 20 28 63 6f 6e 63 20 22 20 4f 46        (conc " OF
3b80: 46 53 45 54 20 22 20 6f 66 66 73 65 74 29 0a 09  FSET " offset)..
3b90: 09 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3ba0: 22 22 29 29 29 29 0a 20 20 20 20 28 64 65 62 75  "")))).    (debu
3bb0: 67 3a 70 72 69 6e 74 20 38 20 22 49 4e 46 4f 3a  g:print 8 "INFO:
3bc0: 20 64 62 3a 67 65 74 2d 72 75 6e 73 20 71 72 79   db:get-runs qry
3bd0: 73 74 72 3a 20 22 20 71 72 79 73 74 72 20 22 5c  str: " qrystr "\
3be0: 6e 6b 65 79 70 61 74 74 73 3a 20 22 20 6b 65 79  nkeypatts: " key
3bf0: 70 61 74 74 73 20 22 5c 6e 20 20 6f 66 66 73 65  patts "\n  offse
3c00: 74 3a 20 22 20 6f 66 66 73 65 74 20 22 20 6c 69  t: " offset " li
3c10: 6d 69 74 3a 20 22 20 63 6f 75 6e 74 29 0a 20 20  mit: " count).  
3c20: 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65    (sqlite3:for-e
3c30: 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61  ach-row.     (la
3c40: 6d 62 64 61 20 28 61 20 2e 20 78 29 0a 20 20 20  mbda (a . x).   
3c50: 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28 63      (set! res (c
3c60: 6f 6e 73 20 28 61 70 70 6c 79 20 76 65 63 74 6f  ons (apply vecto
3c70: 72 20 61 20 78 29 20 72 65 73 29 29 29 0a 20 20  r a x) res))).  
3c80: 20 20 20 64 62 0a 20 20 20 20 20 71 72 79 73 74     db.     qryst
3c90: 72 0a 20 20 20 20 20 29 0a 20 20 20 20 28 76 65  r.     ).    (ve
3ca0: 63 74 6f 72 20 68 65 61 64 65 72 20 72 65 73 29  ctor header res)
3cb0: 29 29 0a 0a 3b 3b 20 6a 75 73 74 20 67 65 74 20  ))..;; just get 
3cc0: 63 6f 75 6e 74 20 6f 66 20 72 75 6e 73 0a 28 64  count of runs.(d
3cd0: 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 6e 75  efine (db:get-nu
3ce0: 6d 2d 72 75 6e 73 20 64 62 20 72 75 6e 70 61 74  m-runs db runpat
3cf0: 74 29 0a 20 20 28 6c 65 74 20 28 28 6e 75 6d 72  t).  (let ((numr
3d00: 75 6e 73 20 30 29 29 0a 20 20 20 20 28 73 71 6c  uns 0)).    (sql
3d10: 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f  ite3:for-each-ro
3d20: 77 20 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20  w .     (lambda 
3d30: 28 63 6f 75 6e 74 29 0a 20 20 20 20 20 20 20 28  (count).       (
3d40: 73 65 74 21 20 6e 75 6d 72 75 6e 73 20 63 6f 75  set! numruns cou
3d50: 6e 74 29 29 0a 20 20 20 20 20 64 62 0a 20 20 20  nt)).     db.   
3d60: 20 20 22 53 45 4c 45 43 54 20 43 4f 55 4e 54 28    "SELECT COUNT(
3d70: 69 64 29 20 46 52 4f 4d 20 72 75 6e 73 20 57 48  id) FROM runs WH
3d80: 45 52 45 20 72 75 6e 6e 61 6d 65 20 4c 49 4b 45  ERE runname LIKE
3d90: 20 3f 3b 22 20 72 75 6e 70 61 74 74 29 0a 20 20   ?;" runpatt).  
3da0: 20 20 6e 75 6d 72 75 6e 73 29 29 0a 0a 3b 3b 20    numruns))..;; 
3db0: 75 73 65 20 28 67 65 74 2d 76 61 6c 75 65 2d 62  use (get-value-b
3dc0: 79 2d 68 65 61 64 65 72 20 28 64 62 3a 67 65 74  y-header (db:get
3dd0: 2d 68 65 61 64 65 72 20 72 75 6e 69 6e 66 6f 29  -header runinfo)
3de0: 28 64 62 3a 67 65 74 2d 72 6f 77 20 72 75 6e 69  (db:get-row runi
3df0: 6e 66 6f 29 29 0a 28 64 65 66 69 6e 65 20 28 64  nfo)).(define (d
3e00: 62 3a 67 65 74 2d 72 75 6e 2d 69 6e 66 6f 20 64  b:get-run-info d
3e10: 62 20 72 75 6e 2d 69 64 29 0a 20 20 28 69 66 20  b run-id).  (if 
3e20: 28 68 61 73 68 2d 74 61 62 6c 65 2d 72 65 66 2f  (hash-table-ref/
3e30: 64 65 66 61 75 6c 74 20 2a 72 75 6e 2d 69 6e 66  default *run-inf
3e40: 6f 2d 63 61 63 68 65 2a 20 72 75 6e 2d 69 64 20  o-cache* run-id 
3e50: 23 66 29 0a 20 20 20 20 20 20 28 68 61 73 68 2d  #f).      (hash-
3e60: 74 61 62 6c 65 2d 72 65 66 20 2a 72 75 6e 2d 69  table-ref *run-i
3e70: 6e 66 6f 2d 63 61 63 68 65 2a 20 72 75 6e 2d 69  nfo-cache* run-i
3e80: 64 29 0a 20 20 20 20 20 20 28 6c 65 74 2a 20 28  d).      (let* (
3e90: 28 72 65 73 20 20 20 20 20 20 23 66 29 0a 09 20  (res      #f).. 
3ea0: 20 20 20 20 28 6b 65 79 73 20 20 20 20 20 20 28      (keys      (
3eb0: 64 62 3a 67 65 74 2d 6b 65 79 73 20 64 62 29 29  db:get-keys db))
3ec0: 0a 09 20 20 20 20 20 28 72 65 6d 66 69 65 6c 64  ..     (remfield
3ed0: 73 20 28 6c 69 73 74 20 22 69 64 22 20 22 72 75  s (list "id" "ru
3ee0: 6e 6e 61 6d 65 22 20 22 73 74 61 74 65 22 20 22  nname" "state" "
3ef0: 73 74 61 74 75 73 22 20 22 6f 77 6e 65 72 22 20  status" "owner" 
3f00: 22 65 76 65 6e 74 5f 74 69 6d 65 22 29 29 0a 09  "event_time"))..
3f10: 20 20 20 20 20 28 68 65 61 64 65 72 20 20 20 20       (header    
3f20: 28 61 70 70 65 6e 64 20 28 6d 61 70 20 6b 65 79  (append (map key
3f30: 3a 67 65 74 2d 66 69 65 6c 64 6e 61 6d 65 20 6b  :get-fieldname k
3f40: 65 79 73 29 0a 09 09 09 09 72 65 6d 66 69 65 6c  eys).....remfiel
3f50: 64 73 29 29 0a 09 20 20 20 20 20 28 6b 65 79 73  ds))..     (keys
3f60: 74 72 20 20 20 20 28 63 6f 6e 63 20 28 6b 65 79  tr    (conc (key
3f70: 73 2d 3e 6b 65 79 73 74 72 20 6b 65 79 73 29 20  s->keystr keys) 
3f80: 22 2c 22 0a 09 09 09 20 20 20 20 20 20 28 73 74  ","....      (st
3f90: 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65  ring-intersperse
3fa0: 20 72 65 6d 66 69 65 6c 64 73 20 22 2c 22 29 29   remfields ","))
3fb0: 29 29 0a 09 3b 3b 20 28 64 65 62 75 67 3a 70 72  ))..;; (debug:pr
3fc0: 69 6e 74 20 30 20 22 64 62 3a 67 65 74 2d 72 75  int 0 "db:get-ru
3fd0: 6e 2d 69 6e 66 6f 20 72 75 6e 2d 69 64 3a 20 22  n-info run-id: "
3fe0: 20 72 75 6e 2d 69 64 20 22 20 68 65 61 64 65 72   run-id " header
3ff0: 3a 20 22 20 68 65 61 64 65 72 20 22 20 6b 65 79  : " header " key
4000: 73 74 72 3a 20 22 20 6b 65 79 73 74 72 29 0a 09  str: " keystr)..
4010: 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63  (sqlite3:for-eac
4020: 68 2d 72 6f 77 0a 09 20 28 6c 61 6d 62 64 61 20  h-row.. (lambda 
4030: 28 61 20 2e 20 78 29 0a 09 20 20 20 28 73 65 74  (a . x)..   (set
4040: 21 20 72 65 73 20 28 61 70 70 6c 79 20 76 65 63  ! res (apply vec
4050: 74 6f 72 20 61 20 78 29 29 29 0a 09 20 64 62 0a  tor a x))).. db.
4060: 09 20 28 63 6f 6e 63 20 22 53 45 4c 45 43 54 20  . (conc "SELECT 
4070: 22 20 6b 65 79 73 74 72 20 22 20 46 52 4f 4d 20  " keystr " FROM 
4080: 72 75 6e 73 20 57 48 45 52 45 20 69 64 3d 3f 3b  runs WHERE id=?;
4090: 22 29 0a 09 20 72 75 6e 2d 69 64 29 0a 09 28 6c  ").. run-id)..(l
40a0: 65 74 20 28 28 66 69 6e 61 6c 72 65 73 20 28 76  et ((finalres (v
40b0: 65 63 74 6f 72 20 68 65 61 64 65 72 20 72 65 73  ector header res
40c0: 29 29 29 0a 09 20 20 28 68 61 73 68 2d 74 61 62  )))..  (hash-tab
40d0: 6c 65 2d 73 65 74 21 20 2a 72 75 6e 2d 69 6e 66  le-set! *run-inf
40e0: 6f 2d 63 61 63 68 65 2a 20 72 75 6e 2d 69 64 20  o-cache* run-id 
40f0: 66 69 6e 61 6c 72 65 73 29 0a 09 20 20 66 69 6e  finalres)..  fin
4100: 61 6c 72 65 73 29 29 29 29 0a 20 20 0a 28 64 65  alres)))).  .(de
4110: 66 69 6e 65 20 28 64 62 3a 73 65 74 2d 63 6f 6d  fine (db:set-com
4120: 6d 65 6e 74 2d 66 6f 72 2d 72 75 6e 20 64 62 20  ment-for-run db 
4130: 72 75 6e 2d 69 64 20 63 6f 6d 6d 65 6e 74 29 0a  run-id comment).
4140: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
4150: 74 65 20 64 62 20 22 55 50 44 41 54 45 20 72 75  te db "UPDATE ru
4160: 6e 73 20 53 45 54 20 63 6f 6d 6d 65 6e 74 3d 3f  ns SET comment=?
4170: 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 63 6f   WHERE id=?;" co
4180: 6d 6d 65 6e 74 20 72 75 6e 2d 69 64 29 29 0a 0a  mment run-id))..
4190: 3b 3b 20 64 6f 65 73 20 6e 6f 74 20 28 6f 62 76  ;; does not (obv
41a0: 69 6f 75 73 6c 79 21 29 20 72 65 6d 6f 76 65 64  iously!) removed
41b0: 20 64 65 70 65 6e 64 65 6e 74 20 64 61 74 61 2e   dependent data.
41c0: 20 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 64 65   .(define (db:de
41d0: 6c 65 74 65 2d 72 75 6e 20 64 62 20 72 75 6e 2d  lete-run db run-
41e0: 69 64 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65  id).  (sqlite3:e
41f0: 78 65 63 75 74 65 20 64 62 20 22 44 45 4c 45 54  xecute db "DELET
4200: 45 20 46 52 4f 4d 20 72 75 6e 73 20 57 48 45 52  E FROM runs WHER
4210: 45 20 69 64 3d 3f 3b 22 20 72 75 6e 2d 69 64 29  E id=?;" run-id)
4220: 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 75  )..(define (db:u
4230: 70 64 61 74 65 2d 72 75 6e 2d 65 76 65 6e 74 5f  pdate-run-event_
4240: 74 69 6d 65 20 64 62 20 72 75 6e 2d 69 64 29 0a  time db run-id).
4250: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
4260: 74 65 20 64 62 20 22 55 50 44 41 54 45 20 72 75  te db "UPDATE ru
4270: 6e 73 20 53 45 54 20 65 76 65 6e 74 5f 74 69 6d  ns SET event_tim
4280: 65 3d 73 74 72 66 74 69 6d 65 28 27 25 73 27 2c  e=strftime('%s',
4290: 27 6e 6f 77 27 29 20 57 48 45 52 45 20 69 64 3d  'now') WHERE id=
42a0: 3f 3b 22 20 72 75 6e 2d 69 64 29 29 20 0a 0a 28  ?;" run-id)) ..(
42b0: 64 65 66 69 6e 65 20 28 64 62 3a 6c 6f 63 6b 2f  define (db:lock/
42c0: 75 6e 6c 6f 63 6b 2d 72 75 6e 20 64 62 20 72 75  unlock-run db ru
42d0: 6e 2d 69 64 20 6c 6f 63 6b 20 75 6e 6c 6f 63 6b  n-id lock unlock
42e0: 20 75 73 65 72 29 0a 20 20 28 6c 65 74 20 28 28   user).  (let ((
42f0: 6e 65 77 6c 6f 63 6b 76 61 6c 20 28 69 66 20 6c  newlockval (if l
4300: 6f 63 6b 20 22 6c 6f 63 6b 65 64 22 0a 09 09 09  ock "locked"....
4310: 28 69 66 20 75 6e 6c 6f 63 6b 0a 09 09 09 20 20  (if unlock....  
4320: 20 20 22 75 6e 6c 6f 63 6b 65 64 22 0a 09 09 09    "unlocked"....
4330: 20 20 20 20 22 6c 6f 63 6b 65 64 22 29 29 29 29      "locked"))))
4340: 20 3b 3b 20 73 65 6d 69 2d 66 61 69 6c 73 61 66   ;; semi-failsaf
4350: 65 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65  e.    (sqlite3:e
4360: 78 65 63 75 74 65 20 64 62 20 22 55 50 44 41 54  xecute db "UPDAT
4370: 45 20 72 75 6e 73 20 53 45 54 20 73 74 61 74 65  E runs SET state
4380: 3d 3f 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20  =? WHERE id=?;" 
4390: 6e 65 77 6c 6f 63 6b 76 61 6c 20 72 75 6e 2d 69  newlockval run-i
43a0: 64 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a  d).    (sqlite3:
43b0: 65 78 65 63 75 74 65 20 64 62 20 22 49 4e 53 45  execute db "INSE
43c0: 52 54 20 49 4e 54 4f 20 61 63 63 65 73 73 5f 6c  RT INTO access_l
43d0: 6f 67 20 28 75 73 65 72 2c 61 63 63 65 73 73 65  og (user,accesse
43e0: 64 2c 61 72 67 73 29 20 56 41 4c 55 45 53 28 3f  d,args) VALUES(?
43f0: 2c 73 74 72 66 74 69 6d 65 28 27 25 73 27 2c 27  ,strftime('%s','
4400: 6e 6f 77 27 29 2c 3f 29 3b 22 0a 09 09 20 20 20  now'),?);"...   
4410: 20 20 75 73 65 72 20 28 63 6f 6e 63 20 6e 65 77    user (conc new
4420: 6c 6f 63 6b 76 61 6c 20 22 20 22 20 72 75 6e 2d  lockval " " run-
4430: 69 64 29 29 0a 20 20 20 20 28 64 65 62 75 67 3a  id)).    (debug:
4440: 70 72 69 6e 74 20 31 20 22 49 4e 46 4f 3a 20 22  print 1 "INFO: "
4450: 20 6e 65 77 6c 6f 63 6b 76 61 6c 20 22 20 72 75   newlockval " ru
4460: 6e 20 6e 75 6d 62 65 72 20 22 20 72 75 6e 2d 69  n number " run-i
4470: 64 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d  d)))..;;========
4480: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4490: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
44a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
44b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b  ==============.;
44c0: 3b 20 4b 20 45 20 59 20 53 0a 3b 3b 3d 3d 3d 3d  ; K E Y S.;;====
44d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
44e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
44f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4500: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4510: 3d 3d 0a 0a 3b 3b 20 67 65 74 20 6b 65 79 20 76  ==..;; get key v
4520: 61 6c 20 70 61 69 72 73 20 66 6f 72 20 61 20 67  al pairs for a g
4530: 69 76 65 6e 20 72 75 6e 2d 69 64 0a 3b 3b 20 28  iven run-id.;; (
4540: 20 28 46 49 45 4c 44 4e 41 4d 45 31 20 6b 65 79   (FIELDNAME1 key
4550: 76 61 6c 31 29 20 28 46 49 45 4c 44 4e 41 4d 45  val1) (FIELDNAME
4560: 32 20 6b 65 79 76 61 6c 32 29 20 2e 2e 2e 20 29  2 keyval2) ... )
4570: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74  .(define (db:get
4580: 2d 6b 65 79 2d 76 61 6c 2d 70 61 69 72 73 20 64  -key-val-pairs d
4590: 62 20 72 75 6e 2d 69 64 29 0a 20 20 28 6c 65 74  b run-id).  (let
45a0: 2a 20 28 28 6b 65 79 73 20 28 67 65 74 2d 6b 65  * ((keys (get-ke
45b0: 79 73 20 64 62 29 29 0a 09 20 28 72 65 73 20 20  ys db)).. (res  
45c0: 27 28 29 29 29 0a 20 20 20 20 28 64 65 62 75 67  '())).    (debug
45d0: 3a 70 72 69 6e 74 20 36 20 22 6b 65 79 73 3a 20  :print 6 "keys: 
45e0: 22 20 6b 65 79 73 20 22 20 72 75 6e 2d 69 64 3a  " keys " run-id:
45f0: 20 22 20 72 75 6e 2d 69 64 29 0a 20 20 20 20 28   " run-id).    (
4600: 66 6f 72 2d 65 61 63 68 20 0a 20 20 20 20 20 28  for-each .     (
4610: 6c 61 6d 62 64 61 20 28 6b 65 79 29 0a 20 20 20  lambda (key).   
4620: 20 20 20 20 28 6c 65 74 20 28 28 71 72 79 20 28      (let ((qry (
4630: 63 6f 6e 63 20 22 53 45 4c 45 43 54 20 22 20 28  conc "SELECT " (
4640: 6b 65 79 3a 67 65 74 2d 66 69 65 6c 64 6e 61 6d  key:get-fieldnam
4650: 65 20 6b 65 79 29 20 22 20 46 52 4f 4d 20 72 75  e key) " FROM ru
4660: 6e 73 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 29  ns WHERE id=?;")
4670: 29 29 0a 09 20 3b 3b 20 28 64 65 62 75 67 3a 70  )).. ;; (debug:p
4680: 72 69 6e 74 20 30 20 22 71 72 79 3a 20 22 20 71  rint 0 "qry: " q
4690: 72 79 29 0a 09 20 28 73 71 6c 69 74 65 33 3a 66  ry).. (sqlite3:f
46a0: 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 09 20 20  or-each-row ..  
46b0: 28 6c 61 6d 62 64 61 20 28 6b 65 79 2d 76 61 6c  (lambda (key-val
46c0: 29 0a 09 20 20 20 20 28 73 65 74 21 20 72 65 73  )..    (set! res
46d0: 20 28 63 6f 6e 73 20 28 6c 69 73 74 20 28 6b 65   (cons (list (ke
46e0: 79 3a 67 65 74 2d 66 69 65 6c 64 6e 61 6d 65 20  y:get-fieldname 
46f0: 6b 65 79 29 20 6b 65 79 2d 76 61 6c 29 20 72 65  key) key-val) re
4700: 73 29 29 29 0a 09 20 20 64 62 20 71 72 79 20 72  s)))..  db qry r
4710: 75 6e 2d 69 64 29 29 29 0a 20 20 20 20 20 6b 65  un-id))).     ke
4720: 79 73 29 0a 20 20 20 20 28 72 65 76 65 72 73 65  ys).    (reverse
4730: 20 72 65 73 29 29 29 0a 0a 3b 3b 20 67 65 74 20   res)))..;; get 
4740: 6b 65 79 20 76 61 6c 73 20 66 6f 72 20 61 20 67  key vals for a g
4750: 69 76 65 6e 20 72 75 6e 2d 69 64 0a 28 64 65 66  iven run-id.(def
4760: 69 6e 65 20 28 64 62 3a 67 65 74 2d 6b 65 79 2d  ine (db:get-key-
4770: 76 61 6c 73 20 64 62 20 72 75 6e 2d 69 64 29 0a  vals db run-id).
4780: 20 20 28 6c 65 74 2a 20 28 28 6b 65 79 73 20 28    (let* ((keys (
4790: 67 65 74 2d 6b 65 79 73 20 64 62 29 29 0a 09 20  get-keys db)).. 
47a0: 28 72 65 73 20 20 27 28 29 29 29 0a 20 20 20 20  (res  '())).    
47b0: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 36 20 22  (debug:print 6 "
47c0: 6b 65 79 73 3a 20 22 20 6b 65 79 73 20 22 20 72  keys: " keys " r
47d0: 75 6e 2d 69 64 3a 20 22 20 72 75 6e 2d 69 64 29  un-id: " run-id)
47e0: 0a 20 20 20 20 28 66 6f 72 2d 65 61 63 68 20 0a  .    (for-each .
47f0: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 6b 65       (lambda (ke
4800: 79 29 0a 20 20 20 20 20 20 20 28 6c 65 74 20 28  y).       (let (
4810: 28 71 72 79 20 28 63 6f 6e 63 20 22 53 45 4c 45  (qry (conc "SELE
4820: 43 54 20 22 20 28 6b 65 79 3a 67 65 74 2d 66 69  CT " (key:get-fi
4830: 65 6c 64 6e 61 6d 65 20 6b 65 79 29 20 22 20 46  eldname key) " F
4840: 52 4f 4d 20 72 75 6e 73 20 57 48 45 52 45 20 69  ROM runs WHERE i
4850: 64 3d 3f 3b 22 29 29 29 0a 09 20 3b 3b 20 28 64  d=?;"))).. ;; (d
4860: 65 62 75 67 3a 70 72 69 6e 74 20 30 20 22 71 72  ebug:print 0 "qr
4870: 79 3a 20 22 20 71 72 79 29 0a 09 20 28 73 71 6c  y: " qry).. (sql
4880: 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f  ite3:for-each-ro
4890: 77 20 0a 09 20 20 28 6c 61 6d 62 64 61 20 28 6b  w ..  (lambda (k
48a0: 65 79 2d 76 61 6c 29 0a 09 20 20 20 20 28 73 65  ey-val)..    (se
48b0: 74 21 20 72 65 73 20 28 63 6f 6e 73 20 6b 65 79  t! res (cons key
48c0: 2d 76 61 6c 20 72 65 73 29 29 29 0a 09 20 20 64  -val res)))..  d
48d0: 62 20 71 72 79 20 72 75 6e 2d 69 64 29 29 29 0a  b qry run-id))).
48e0: 20 20 20 20 20 6b 65 79 73 29 0a 20 20 20 20 28       keys).    (
48f0: 72 65 76 65 72 73 65 20 72 65 73 29 29 29 0a 0a  reverse res)))..
4900: 3b 3b 20 54 68 65 20 74 61 72 67 65 74 20 69 73  ;; The target is
4910: 20 6b 65 79 76 61 6c 31 2f 6b 65 79 76 61 6c 32   keyval1/keyval2
4920: 2e 2e 2e 2c 20 63 61 63 68 65 64 20 69 6e 20 2a  ..., cached in *
4930: 74 61 72 67 65 74 2a 20 61 73 20 69 74 20 69 73  target* as it is
4940: 20 75 73 65 64 20 6f 66 74 65 6e 0a 28 64 65 66   used often.(def
4950: 69 6e 65 20 28 64 62 3a 67 65 74 2d 74 61 72 67  ine (db:get-targ
4960: 65 74 20 64 62 20 72 75 6e 2d 69 64 29 0a 20 20  et db run-id).  
4970: 28 69 66 20 2a 74 61 72 67 65 74 2a 0a 20 20 20  (if *target*.   
4980: 20 20 20 2a 74 61 72 67 65 74 2a 0a 20 20 20 20     *target*.    
4990: 20 20 28 6c 65 74 2a 20 28 28 6b 65 79 76 61 6c    (let* ((keyval
49a0: 73 20 28 72 64 62 3a 67 65 74 2d 6b 65 79 2d 76  s (rdb:get-key-v
49b0: 61 6c 73 20 64 62 20 72 75 6e 2d 69 64 29 29 0a  als db run-id)).
49c0: 09 20 20 20 20 20 28 74 68 65 6b 65 79 20 20 28  .     (thekey  (
49d0: 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72  string-intersper
49e0: 73 65 20 28 6d 61 70 20 28 6c 61 6d 62 64 61 20  se (map (lambda 
49f0: 28 78 29 28 69 66 20 78 20 78 20 22 2d 6e 61 2d  (x)(if x x "-na-
4a00: 22 29 29 20 6b 65 79 76 61 6c 73 29 20 22 2f 22  ")) keyvals) "/"
4a10: 29 29 29 0a 09 28 73 65 74 21 20 2a 74 61 72 67  )))..(set! *targ
4a20: 65 74 2a 20 74 68 65 6b 65 79 29 0a 09 74 68 65  et* thekey)..the
4a30: 6b 65 79 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d  key)))..;;======
4a40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4a50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4a60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4a70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4a80: 0a 3b 3b 20 20 54 20 45 20 53 20 54 20 53 0a 3b  .;;  T E S T S.;
4a90: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;===============
4aa0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4ab0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4ac0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4ad0: 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 73 74 61 74  =======..;; stat
4ae0: 65 73 20 61 6e 64 20 73 74 61 74 75 73 65 73 20  es and statuses 
4af0: 61 72 65 20 6c 69 73 74 73 2c 20 74 75 72 6e 20  are lists, turn 
4b00: 74 68 65 6d 20 69 6e 74 6f 20 28 22 50 41 53 53  them into ("PASS
4b10: 22 2c 22 46 41 49 4c 22 2e 2e 2e 29 20 61 6e 64  ","FAIL"...) and
4b20: 20 75 73 65 20 4e 4f 54 20 49 4e 0a 3b 3b 20 69   use NOT IN.;; i
4b30: 2e 65 2e 20 74 68 65 73 65 20 6c 69 73 74 73 20  .e. these lists 
4b40: 64 65 66 69 6e 65 20 77 68 61 74 20 74 6f 20 4e  define what to N
4b50: 4f 54 20 73 68 6f 77 2e 0a 3b 3b 20 73 74 61 74  OT show..;; stat
4b60: 65 73 20 61 6e 64 20 73 74 61 74 75 73 65 73 20  es and statuses 
4b70: 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20  are required to 
4b80: 62 65 20 6c 69 73 74 73 2c 20 65 6d 70 74 79 20  be lists, empty 
4b90: 69 73 20 6f 6b 0a 3b 3b 20 6e 6f 74 2d 69 6e 20  is ok.;; not-in 
4ba0: 23 74 20 3d 20 61 62 6f 76 65 20 62 65 68 61 76  #t = above behav
4bb0: 69 6f 75 72 2c 20 23 66 20 3d 20 6d 75 73 74 20  iour, #f = must 
4bc0: 6d 61 74 63 68 0a 28 64 65 66 69 6e 65 20 28 64  match.(define (d
4bd0: 62 3a 67 65 74 2d 74 65 73 74 73 2d 66 6f 72 2d  b:get-tests-for-
4be0: 72 75 6e 20 64 62 20 72 75 6e 2d 69 64 20 74 65  run db run-id te
4bf0: 73 74 70 61 74 74 20 69 74 65 6d 70 61 74 74 20  stpatt itempatt 
4c00: 73 74 61 74 65 73 20 73 74 61 74 75 73 65 73 20  states statuses 
4c10: 0a 09 09 09 20 20 20 20 20 20 23 21 6b 65 79 20  ....      #!key 
4c20: 28 6e 6f 74 2d 69 6e 20 23 74 29 0a 09 09 09 20  (not-in #t).... 
4c30: 20 20 20 20 20 28 73 6f 72 74 2d 62 79 20 23 66       (sort-by #f
4c40: 29 20 3b 3b 20 27 72 75 6e 64 69 72 20 27 65 76  ) ;; 'rundir 'ev
4c50: 65 6e 74 5f 74 69 6d 65 0a 09 09 09 20 20 20 20  ent_time....    
4c60: 20 20 29 0a 20 20 28 6c 65 74 2a 20 28 28 72 65    ).  (let* ((re
4c70: 73 20 27 28 29 29 0a 09 20 3b 3b 20 69 66 20 73  s '()).. ;; if s
4c80: 74 61 74 65 73 20 6f 72 20 73 74 61 74 75 73 65  tates or statuse
4c90: 73 20 61 72 65 20 6e 75 6c 6c 20 74 68 65 6e 20  s are null then 
4ca0: 61 73 73 75 6d 65 20 6d 61 74 63 68 20 61 6c 6c  assume match all
4cb0: 20 77 68 65 6e 20 6e 6f 74 2d 69 6e 20 69 73 20   when not-in is 
4cc0: 66 61 6c 73 65 0a 09 20 28 73 74 61 74 65 73 2d  false.. (states-
4cd0: 73 74 72 20 20 20 20 28 63 6f 6e 63 20 22 20 73  str    (conc " s
4ce0: 74 61 74 65 20 69 6e 20 28 27 22 20 28 73 74 72  tate in ('" (str
4cf0: 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20  ing-intersperse 
4d00: 73 74 61 74 65 73 20 20 20 22 27 2c 27 22 29 20  states   "','") 
4d10: 22 27 29 22 29 29 0a 09 20 28 73 74 61 74 75 73  "')")).. (status
4d20: 65 73 2d 73 74 72 20 20 28 63 6f 6e 63 20 22 20  es-str  (conc " 
4d30: 73 74 61 74 75 73 20 69 6e 20 28 27 22 20 28 73  status in ('" (s
4d40: 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73  tring-interspers
4d50: 65 20 73 74 61 74 75 73 65 73 20 22 27 2c 27 22  e statuses "','"
4d60: 29 20 22 27 29 22 29 29 0a 09 20 28 73 74 61 74  ) "')")).. (stat
4d70: 65 2d 73 74 61 74 75 73 2d 71 72 79 20 28 69 66  e-status-qry (if
4d80: 20 28 6f 72 20 28 6e 6f 74 20 28 6e 75 6c 6c 3f   (or (not (null?
4d90: 20 73 74 61 74 65 73 29 29 0a 09 09 09 09 20 20   states)).....  
4da0: 20 28 6e 6f 74 20 28 6e 75 6c 6c 3f 20 73 74 61   (not (null? sta
4db0: 74 65 73 29 29 29 0a 09 09 09 20 20 20 20 20 20  tes)))....      
4dc0: 20 28 63 6f 6e 63 20 22 20 41 4e 44 20 22 20 28   (conc " AND " (
4dd0: 69 66 20 6e 6f 74 2d 69 6e 20 22 4e 4f 54 22 20  if not-in "NOT" 
4de0: 22 22 29 20 22 20 28 22 20 73 74 61 74 65 73 2d  "") " (" states-
4df0: 73 74 72 20 22 20 41 4e 44 20 22 20 73 74 61 74  str " AND " stat
4e00: 75 73 65 73 2d 73 74 72 20 22 29 20 22 29 0a 09  uses-str ") ")..
4e10: 09 09 20 20 20 20 20 20 20 22 22 29 29 0a 09 20  ..       "")).. 
4e20: 28 71 72 79 20 20 20 20 20 20 28 63 6f 6e 63 20  (qry      (conc 
4e30: 22 53 45 4c 45 43 54 20 69 64 2c 72 75 6e 5f 69  "SELECT id,run_i
4e40: 64 2c 74 65 73 74 6e 61 6d 65 2c 73 74 61 74 65  d,testname,state
4e50: 2c 73 74 61 74 75 73 2c 65 76 65 6e 74 5f 74 69  ,status,event_ti
4e60: 6d 65 2c 68 6f 73 74 2c 63 70 75 6c 6f 61 64 2c  me,host,cpuload,
4e70: 64 69 73 6b 66 72 65 65 2c 75 6e 61 6d 65 2c 72  diskfree,uname,r
4e80: 75 6e 64 69 72 2c 69 74 65 6d 5f 70 61 74 68 2c  undir,item_path,
4e90: 72 75 6e 5f 64 75 72 61 74 69 6f 6e 2c 66 69 6e  run_duration,fin
4ea0: 61 6c 5f 6c 6f 67 66 2c 63 6f 6d 6d 65 6e 74 20  al_logf,comment 
4eb0: 22 0a 09 09 09 20 22 20 46 52 4f 4d 20 74 65 73  ".... " FROM tes
4ec0: 74 73 20 57 48 45 52 45 20 72 75 6e 5f 69 64 3d  ts WHERE run_id=
4ed0: 3f 20 41 4e 44 20 22 0a 09 09 09 20 3b 3b 20 74  ? AND ".... ;; t
4ee0: 65 73 74 6e 61 6d 65 20 6c 69 6b 65 20 3f 20 41  estname like ? A
4ef0: 4e 44 20 69 74 65 6d 5f 70 61 74 68 20 4c 49 4b  ND item_path LIK
4f00: 45 20 3f 20 22 20 0a 09 09 09 20 28 64 62 3a 70  E ? " .... (db:p
4f10: 61 74 74 2d 3e 6c 69 6b 65 20 22 74 65 73 74 6e  att->like "testn
4f20: 61 6d 65 22 20 74 65 73 74 70 61 74 74 29 20 22  ame" testpatt) "
4f30: 20 41 4e 44 20 22 0a 09 09 09 20 28 64 62 3a 70   AND ".... (db:p
4f40: 61 74 74 2d 3e 6c 69 6b 65 20 22 69 74 65 6d 5f  att->like "item_
4f50: 70 61 74 68 22 20 69 74 65 6d 70 61 74 74 29 0a  path" itempatt).
4f60: 09 09 09 20 73 74 61 74 65 2d 73 74 61 74 75 73  ... state-status
4f70: 2d 71 72 79 0a 09 09 09 20 28 63 61 73 65 20 73  -qry.... (case s
4f80: 6f 72 74 2d 62 79 0a 09 09 09 20 20 20 28 28 72  ort-by....   ((r
4f90: 75 6e 64 69 72 29 20 20 20 20 20 22 20 4f 52 44  undir)     " ORD
4fa0: 45 52 20 42 59 20 6c 65 6e 67 74 68 28 72 75 6e  ER BY length(run
4fb0: 64 69 72 29 20 44 45 53 43 3b 22 29 0a 09 09 09  dir) DESC;")....
4fc0: 20 20 20 28 28 65 76 65 6e 74 5f 74 69 6d 65 29     ((event_time)
4fd0: 20 22 20 4f 52 44 45 52 20 42 59 20 65 76 65 6e   " ORDER BY even
4fe0: 74 5f 74 69 6d 65 20 41 53 43 3b 22 29 0a 09 09  t_time ASC;")...
4ff0: 09 20 20 20 28 65 6c 73 65 20 20 20 20 20 20 20  .   (else       
5000: 20 20 22 3b 22 29 29 0a 09 09 09 20 29 29 29 0a    ";")).... ))).
5010: 20 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74      (debug:print
5020: 20 38 20 22 49 4e 46 4f 3a 20 64 62 3a 67 65 74   8 "INFO: db:get
5030: 2d 74 65 73 74 73 2d 66 6f 72 2d 72 75 6e 20 71  -tests-for-run q
5040: 72 79 3d 22 20 71 72 79 29 0a 20 20 20 20 28 73  ry=" qry).    (s
5050: 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d  qlite3:for-each-
5060: 72 6f 77 20 0a 20 20 20 20 20 28 6c 61 6d 62 64  row .     (lambd
5070: 61 20 28 61 20 2e 20 62 29 20 3b 3b 20 69 64 20  a (a . b) ;; id 
5080: 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20  run-id testname 
5090: 73 74 61 74 65 20 73 74 61 74 75 73 20 65 76 65  state status eve
50a0: 6e 74 2d 74 69 6d 65 20 68 6f 73 74 20 63 70 75  nt-time host cpu
50b0: 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20 75 6e  load diskfree un
50c0: 61 6d 65 20 72 75 6e 64 69 72 20 69 74 65 6d 2d  ame rundir item-
50d0: 70 61 74 68 20 72 75 6e 2d 64 75 72 61 74 69 6f  path run-duratio
50e0: 6e 20 66 69 6e 61 6c 2d 6c 6f 67 66 20 63 6f 6d  n final-logf com
50f0: 6d 65 6e 74 29 0a 20 20 20 20 20 20 20 28 73 65  ment).       (se
5100: 74 21 20 72 65 73 20 28 63 6f 6e 73 20 28 61 70  t! res (cons (ap
5110: 70 6c 79 20 76 65 63 74 6f 72 20 61 20 62 29 20  ply vector a b) 
5120: 72 65 73 29 29 29 20 3b 3b 20 69 64 20 72 75 6e  res))) ;; id run
5130: 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 73 74 61  -id testname sta
5140: 74 65 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d  te status event-
5150: 74 69 6d 65 20 68 6f 73 74 20 63 70 75 6c 6f 61  time host cpuloa
5160: 64 20 64 69 73 6b 66 72 65 65 20 75 6e 61 6d 65  d diskfree uname
5170: 20 72 75 6e 64 69 72 20 69 74 65 6d 2d 70 61 74   rundir item-pat
5180: 68 20 72 75 6e 2d 64 75 72 61 74 69 6f 6e 20 66  h run-duration f
5190: 69 6e 61 6c 2d 6c 6f 67 66 20 63 6f 6d 6d 65 6e  inal-logf commen
51a0: 74 29 20 72 65 73 29 29 29 0a 20 20 20 20 20 64  t) res))).     d
51b0: 62 20 0a 20 20 20 20 20 71 72 79 0a 20 20 20 20  b .     qry.    
51c0: 20 72 75 6e 2d 69 64 0a 20 20 20 20 20 3b 3b 20   run-id.     ;; 
51d0: 28 69 66 20 74 65 73 74 70 61 74 74 20 74 65 73  (if testpatt tes
51e0: 74 70 61 74 74 20 22 25 22 29 0a 20 20 20 20 20  tpatt "%").     
51f0: 3b 3b 20 28 69 66 20 69 74 65 6d 70 61 74 74 20  ;; (if itempatt 
5200: 69 74 65 6d 70 61 74 74 20 22 25 22 29 29 0a 20  itempatt "%")). 
5210: 20 20 20 20 29 0a 20 20 20 20 72 65 73 29 29 0a      ).    res)).
5220: 0a 3b 3b 20 74 68 69 73 20 6f 6e 65 20 69 73 20  .;; this one is 
5230: 61 20 62 69 74 20 62 72 6f 6b 65 6e 20 42 55 47  a bit broken BUG
5240: 20 46 49 58 4d 45 0a 28 64 65 66 69 6e 65 20 28   FIXME.(define (
5250: 64 62 3a 64 65 6c 65 74 65 2d 74 65 73 74 2d 73  db:delete-test-s
5260: 74 65 70 2d 72 65 63 6f 72 64 73 20 64 62 20 72  tep-records db r
5270: 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20  un-id test-name 
5280: 69 74 65 6d 64 61 74 29 0a 20 20 3b 3b 20 42 72  itemdat).  ;; Br
5290: 65 61 6b 69 6e 67 20 69 74 20 69 6e 74 6f 20 74  eaking it into t
52a0: 77 6f 20 71 75 65 72 69 65 73 20 66 6f 72 20 62  wo queries for b
52b0: 65 74 74 65 72 20 66 69 6c 65 20 61 63 63 65 73  etter file acces
52c0: 73 20 69 6e 74 65 72 6c 65 61 76 69 6e 67 0a 20  s interleaving. 
52d0: 20 28 6c 65 74 20 28 28 69 64 73 20 27 28 29 29   (let ((ids '())
52e0: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66  ).    (sqlite3:f
52f0: 6f 72 2d 65 61 63 68 2d 72 6f 77 20 28 6c 61 6d  or-each-row (lam
5300: 62 64 61 20 28 69 64 29 0a 09 09 09 20 20 20 20  bda (id)....    
5310: 28 73 65 74 21 20 69 64 73 20 28 63 6f 6e 73 20  (set! ids (cons 
5320: 69 64 20 69 64 73 29 29 29 0a 09 09 09 20 20 64  id ids)))....  d
5330: 62 0a 09 09 09 20 20 22 53 45 4c 45 43 54 20 69  b....  "SELECT i
5340: 64 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45  d FROM tests WHE
5350: 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20  RE run_id=? AND 
5360: 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69  testname=? AND i
5370: 74 65 6d 5f 70 61 74 68 3d 3f 3b 22 0a 09 09 09  tem_path=?;"....
5380: 20 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61    run-id test-na
5390: 6d 65 20 28 69 74 65 6d 2d 6c 69 73 74 2d 3e 70  me (item-list->p
53a0: 61 74 68 20 69 74 65 6d 64 61 74 29 29 0a 20 20  ath itemdat)).  
53b0: 20 20 28 66 6f 72 2d 65 61 63 68 20 28 6c 61 6d    (for-each (lam
53c0: 62 64 61 20 28 69 64 29 0a 09 09 28 73 71 6c 69  bda (id)...(sqli
53d0: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22  te3:execute db "
53e0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 65 73 74  DELETE FROM test
53f0: 5f 73 74 65 70 73 20 57 48 45 52 45 20 74 65 73  _steps WHERE tes
5400: 74 5f 69 64 3d 3f 3b 22 20 69 64 29 0a 09 09 28  t_id=?;" id)...(
5410: 74 68 72 65 61 64 2d 73 6c 65 65 70 21 20 30 2e  thread-sleep! 0.
5420: 31 29 20 3b 3b 20 67 69 76 65 20 6f 74 68 65 72  1) ;; give other
5430: 73 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20  s access to the 
5440: 64 62 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  db.             
5450: 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63     (sqlite3:exec
5460: 75 74 65 20 64 62 20 22 44 45 4c 45 54 45 20 46  ute db "DELETE F
5470: 52 4f 4d 20 74 65 73 74 5f 64 61 74 61 20 57 48  ROM test_data WH
5480: 45 52 45 20 74 65 73 74 5f 69 64 3d 3f 3b 22 20  ERE test_id=?;" 
5490: 69 64 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  id).            
54a0: 20 20 20 20 28 74 68 72 65 61 64 2d 73 6c 65 65      (thread-slee
54b0: 70 21 20 30 2e 31 29 29 20 3b 3b 20 67 69 76 65  p! 0.1)) ;; give
54c0: 20 6f 74 68 65 72 73 20 61 63 63 65 73 73 20 74   others access t
54d0: 6f 20 74 68 65 20 64 62 0a 09 20 20 20 20 20 20  o the db..      
54e0: 69 64 73 29 29 29 0a 3b 3b 22 44 45 4c 45 54 45  ids))).;;"DELETE
54f0: 20 46 52 4f 4d 20 74 65 73 74 5f 73 74 65 70 73   FROM test_steps
5500: 20 57 48 45 52 45 20 74 65 73 74 5f 69 64 20 69   WHERE test_id i
5510: 6e 20 28 53 45 4c 45 43 54 20 69 64 20 46 52 4f  n (SELECT id FRO
5520: 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 72 75  M tests WHERE ru
5530: 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e  n_id=? AND testn
5540: 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70  ame=? AND item_p
5550: 61 74 68 3d 3f 29 3b 22 20 0a 09 09 20 20 20 0a  ath=?);" ...   .
5560: 3b 3b 20 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  ;; .(define (db:
5570: 64 65 6c 65 74 65 2d 74 65 73 74 2d 72 65 63 6f  delete-test-reco
5580: 72 64 73 20 64 62 20 74 65 73 74 2d 69 64 29 0a  rds db test-id).
5590: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
55a0: 74 65 20 64 62 20 22 44 45 4c 45 54 45 20 46 52  te db "DELETE FR
55b0: 4f 4d 20 74 65 73 74 5f 73 74 65 70 73 20 57 48  OM test_steps WH
55c0: 45 52 45 20 74 65 73 74 5f 69 64 3d 3f 3b 22 20  ERE test_id=?;" 
55d0: 74 65 73 74 2d 69 64 29 0a 20 20 28 73 71 6c 69  test-id).  (sqli
55e0: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22  te3:execute db "
55f0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 65 73 74  DELETE FROM test
5600: 5f 64 61 74 61 20 20 57 48 45 52 45 20 74 65 73  _data  WHERE tes
5610: 74 5f 69 64 3d 3f 3b 22 20 74 65 73 74 2d 69 64  t_id=?;" test-id
5620: 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65  ).  (sqlite3:exe
5630: 63 75 74 65 20 64 62 20 22 44 45 4c 45 54 45 20  cute db "DELETE 
5640: 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45  FROM tests WHERE
5650: 20 69 64 3d 3f 3b 22 20 74 65 73 74 2d 69 64 29   id=?;" test-id)
5660: 29 0a 0a 3b 3b 20 73 65 74 20 74 65 73 74 73 20  )..;; set tests 
5670: 77 69 74 68 20 73 74 61 74 65 20 63 75 72 72 73  with state currs
5680: 74 61 74 65 20 61 6e 64 20 73 74 61 74 75 73 20  tate and status 
5690: 63 75 72 72 73 74 61 74 75 73 20 74 6f 20 6e 65  currstatus to ne
56a0: 77 73 74 61 74 65 20 61 6e 64 20 6e 65 77 73 74  wstate and newst
56b0: 61 74 75 73 0a 3b 3b 20 75 73 65 20 63 75 72 72  atus.;; use curr
56c0: 73 74 61 74 65 20 3d 20 23 66 20 61 6e 64 20 6f  state = #f and o
56d0: 72 20 63 75 72 72 73 74 61 74 75 73 20 3d 20 23  r currstatus = #
56e0: 66 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 61 6e  f to apply to an
56f0: 79 20 73 74 61 74 65 20 6f 72 20 73 74 61 74 75  y state or statu
5700: 73 20 72 65 73 70 65 63 74 69 76 65 6c 79 0a 3b  s respectively.;
5710: 3b 20 57 41 52 4e 49 4e 47 3a 20 53 51 4c 20 69  ; WARNING: SQL i
5720: 6e 6a 65 63 74 69 6f 6e 20 72 69 73 6b 0a 28 64  njection risk.(d
5730: 65 66 69 6e 65 20 28 64 62 3a 73 65 74 2d 74 65  efine (db:set-te
5740: 73 74 73 2d 73 74 61 74 65 2d 73 74 61 74 75 73  sts-state-status
5750: 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 6e   db run-id testn
5760: 61 6d 65 73 20 63 75 72 72 73 74 61 74 65 20 63  ames currstate c
5770: 75 72 72 73 74 61 74 75 73 20 6e 65 77 73 74 61  urrstatus newsta
5780: 74 65 20 6e 65 77 73 74 61 74 75 73 29 0a 20 20  te newstatus).  
5790: 28 66 6f 72 2d 65 61 63 68 20 28 6c 61 6d 62 64  (for-each (lambd
57a0: 61 20 28 74 65 73 74 6e 61 6d 65 29 0a 09 20 20  a (testname)..  
57b0: 20 20 20 20 28 6c 65 74 20 28 28 71 72 79 20 28      (let ((qry (
57c0: 63 6f 6e 63 20 22 55 50 44 41 54 45 20 74 65 73  conc "UPDATE tes
57d0: 74 73 20 53 45 54 20 73 74 61 74 65 3d 3f 2c 73  ts SET state=?,s
57e0: 74 61 74 75 73 3d 3f 20 57 48 45 52 45 20 22 0a  tatus=? WHERE ".
57f0: 09 09 09 20 20 20 20 20 20 20 28 69 66 20 63 75  ...       (if cu
5800: 72 72 73 74 61 74 65 20 20 28 63 6f 6e 63 20 22  rrstate  (conc "
5810: 73 74 61 74 65 3d 27 22 20 63 75 72 72 73 74 61  state='" currsta
5820: 74 65 20 22 27 20 41 4e 44 20 22 29 20 22 22 29  te "' AND ") "")
5830: 0a 09 09 09 20 20 20 20 20 20 20 28 69 66 20 63  ....       (if c
5840: 75 72 72 73 74 61 74 75 73 20 28 63 6f 6e 63 20  urrstatus (conc 
5850: 22 73 74 61 74 75 73 3d 27 22 20 63 75 72 72 73  "status='" currs
5860: 74 61 74 75 73 20 22 27 20 41 4e 44 20 22 29 20  tatus "' AND ") 
5870: 22 22 29 0a 09 09 09 20 20 20 20 20 20 20 22 20  "")....       " 
5880: 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73  run_id=? AND tes
5890: 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 4e 4f 54 20  tname=? AND NOT 
58a0: 28 69 74 65 6d 5f 70 61 74 68 3d 27 27 20 41 4e  (item_path='' AN
58b0: 44 20 74 65 73 74 6e 61 6d 65 20 69 6e 20 28 53  D testname in (S
58c0: 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 74  ELECT DISTINCT t
58d0: 65 73 74 6e 61 6d 65 20 46 52 4f 4d 20 74 65 73  estname FROM tes
58e0: 74 73 20 57 48 45 52 45 20 74 65 73 74 6e 61 6d  ts WHERE testnam
58f0: 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74  e=? AND item_pat
5900: 68 20 21 3d 20 27 27 29 29 3b 22 29 29 29 0a 09  h != ''));")))..
5910: 09 3b 3b 28 64 65 62 75 67 3a 70 72 69 6e 74 20  .;;(debug:print 
5920: 30 20 22 51 52 59 3a 20 22 20 71 72 79 29 0a 09  0 "QRY: " qry)..
5930: 09 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74  .(sqlite3:execut
5940: 65 20 64 62 20 71 72 79 20 72 75 6e 2d 69 64 20  e db qry run-id 
5950: 6e 65 77 73 74 61 74 65 20 6e 65 77 73 74 61 74  newstate newstat
5960: 75 73 20 74 65 73 74 6e 61 6d 65 20 74 65 73 74  us testname test
5970: 6e 61 6d 65 29 29 29 0a 09 20 20 20 20 74 65 73  name)))..    tes
5980: 74 6e 61 6d 65 73 29 29 0a 0a 28 64 65 66 69 6e  tnames))..(defin
5990: 65 20 28 64 62 3a 64 65 6c 65 74 65 2d 74 65 73  e (db:delete-tes
59a0: 74 73 2d 69 6e 2d 73 74 61 74 65 20 64 62 20 72  ts-in-state db r
59b0: 75 6e 2d 69 64 20 73 74 61 74 65 29 0a 20 20 28  un-id state).  (
59c0: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
59d0: 64 62 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  db "DELETE FROM 
59e0: 74 65 73 74 73 20 57 48 45 52 45 20 73 74 61 74  tests WHERE stat
59f0: 65 3d 3f 20 41 4e 44 20 72 75 6e 5f 69 64 3d 3f  e=? AND run_id=?
5a00: 3b 22 20 73 74 61 74 65 20 72 75 6e 2d 69 64 29  ;" state run-id)
5a10: 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 74  )..(define (db:t
5a20: 65 73 74 2d 73 65 74 2d 73 74 61 74 65 2d 73 74  est-set-state-st
5a30: 61 74 75 73 2d 62 79 2d 69 64 20 64 62 20 74 65  atus-by-id db te
5a40: 73 74 2d 69 64 20 6e 65 77 73 74 61 74 65 20 6e  st-id newstate n
5a50: 65 77 73 74 61 74 75 73 20 6e 65 77 63 6f 6d 6d  ewstatus newcomm
5a60: 65 6e 74 29 0a 20 20 28 69 66 20 6e 65 77 73 74  ent).  (if newst
5a70: 61 74 65 20 20 20 28 73 71 6c 69 74 65 33 3a 65  ate   (sqlite3:e
5a80: 78 65 63 75 74 65 20 64 62 20 22 55 50 44 41 54  xecute db "UPDAT
5a90: 45 20 74 65 73 74 73 20 53 45 54 20 73 74 61 74  E tests SET stat
5aa0: 65 3d 3f 20 20 20 57 48 45 52 45 20 69 64 3d 3f  e=?   WHERE id=?
5ab0: 3b 22 20 6e 65 77 73 74 61 74 65 20 20 20 74 65  ;" newstate   te
5ac0: 73 74 2d 69 64 29 29 0a 20 20 28 69 66 20 6e 65  st-id)).  (if ne
5ad0: 77 73 74 61 74 75 73 20 20 28 73 71 6c 69 74 65  wstatus  (sqlite
5ae0: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 55 50  3:execute db "UP
5af0: 44 41 54 45 20 74 65 73 74 73 20 53 45 54 20 73  DATE tests SET s
5b00: 74 61 74 75 73 3d 3f 20 20 57 48 45 52 45 20 69  tatus=?  WHERE i
5b10: 64 3d 3f 3b 22 20 6e 65 77 73 74 61 74 75 73 20  d=?;" newstatus 
5b20: 20 74 65 73 74 2d 69 64 29 29 0a 20 20 28 69 66   test-id)).  (if
5b30: 20 6e 65 77 63 6f 6d 6d 65 6e 74 20 28 73 71 6c   newcomment (sql
5b40: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
5b50: 22 55 50 44 41 54 45 20 74 65 73 74 73 20 53 45  "UPDATE tests SE
5b60: 54 20 63 6f 6d 6d 65 6e 74 3d 3f 20 57 48 45 52  T comment=? WHER
5b70: 45 20 69 64 3d 3f 3b 22 20 6e 65 77 63 6f 6d 6d  E id=?;" newcomm
5b80: 65 6e 74 20 74 65 73 74 2d 69 64 29 29 29 0a 0a  ent test-id)))..
5b90: 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74  (define (db:test
5ba0: 2d 73 65 74 2d 73 74 61 74 65 2d 73 74 61 74 75  -set-state-statu
5bb0: 73 2d 62 79 2d 72 75 6e 2d 69 64 2d 74 65 73 74  s-by-run-id-test
5bc0: 6e 61 6d 65 20 64 62 20 72 75 6e 2d 69 64 20 74  name db run-id t
5bd0: 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61  est-name item-pa
5be0: 74 68 20 73 74 61 74 75 73 20 73 74 61 74 65 29  th status state)
5bf0: 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63  .  (sqlite3:exec
5c00: 75 74 65 20 64 62 20 22 55 50 44 41 54 45 20 74  ute db "UPDATE t
5c10: 65 73 74 73 20 53 45 54 20 73 74 61 74 65 3d 3f  ests SET state=?
5c20: 2c 73 74 61 74 75 73 3d 3f 2c 65 76 65 6e 74 5f  ,status=?,event_
5c30: 74 69 6d 65 3d 73 74 72 66 74 69 6d 65 28 27 25  time=strftime('%
5c40: 73 27 2c 27 6e 6f 77 27 29 20 57 48 45 52 45 20  s','now') WHERE 
5c50: 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73  run_id=? AND tes
5c60: 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d  tname=? AND item
5c70: 5f 70 61 74 68 3d 3f 3b 22 20 0a 09 09 20 20 20  _path=?;" ...   
5c80: 73 74 61 74 65 20 73 74 61 74 75 73 20 72 75 6e  state status run
5c90: 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74  -id test-name it
5ca0: 65 6d 2d 70 61 74 68 29 29 0a 0a 28 64 65 66 69  em-path))..(defi
5cb0: 6e 65 20 28 64 62 3a 67 65 74 2d 63 6f 75 6e 74  ne (db:get-count
5cc0: 2d 74 65 73 74 73 2d 72 75 6e 6e 69 6e 67 20 64  -tests-running d
5cd0: 62 29 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20  b).  (let ((res 
5ce0: 30 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33  0)).    (sqlite3
5cf0: 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20  :for-each-row.  
5d00: 20 20 20 28 6c 61 6d 62 64 61 20 28 63 6f 75 6e     (lambda (coun
5d10: 74 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20  t).       (set! 
5d20: 72 65 73 20 63 6f 75 6e 74 29 29 0a 20 20 20 20  res count)).    
5d30: 20 64 62 0a 20 20 20 20 20 22 53 45 4c 45 43 54   db.     "SELECT
5d40: 20 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20   count(id) FROM 
5d50: 74 65 73 74 73 20 57 48 45 52 45 20 73 74 61 74  tests WHERE stat
5d60: 65 20 3d 20 27 52 55 4e 4e 49 4e 47 27 20 4f 52  e = 'RUNNING' OR
5d70: 20 73 74 61 74 65 20 3d 20 27 4c 41 55 4e 43 48   state = 'LAUNCH
5d80: 45 44 27 20 4f 52 20 73 74 61 74 65 20 3d 20 27  ED' OR state = '
5d90: 52 45 4d 4f 54 45 48 4f 53 54 53 54 41 52 54 27  REMOTEHOSTSTART'
5da0: 3b 22 29 0a 20 20 20 20 72 65 73 29 29 0a 0a 28  ;").    res))..(
5db0: 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 63  define (db:get-c
5dc0: 6f 75 6e 74 2d 74 65 73 74 73 2d 72 75 6e 6e 69  ount-tests-runni
5dd0: 6e 67 2d 69 6e 2d 6a 6f 62 67 72 6f 75 70 20 64  ng-in-jobgroup d
5de0: 62 20 6a 6f 62 67 72 6f 75 70 29 0a 20 20 28 69  b jobgroup).  (i
5df0: 66 20 28 6e 6f 74 20 6a 6f 62 67 72 6f 75 70 29  f (not jobgroup)
5e00: 0a 20 20 20 20 20 20 30 20 3b 3b 20 0a 20 20 20  .      0 ;; .   
5e10: 20 20 20 28 6c 65 74 20 28 28 72 65 73 20 30 29     (let ((res 0)
5e20: 29 0a 09 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d  )..(sqlite3:for-
5e30: 65 61 63 68 2d 72 6f 77 0a 09 20 28 6c 61 6d 62  each-row.. (lamb
5e40: 64 61 20 28 63 6f 75 6e 74 29 0a 09 20 20 20 28  da (count)..   (
5e50: 73 65 74 21 20 72 65 73 20 63 6f 75 6e 74 29 29  set! res count))
5e60: 0a 09 20 64 62 0a 09 20 22 53 45 4c 45 43 54 20  .. db.. "SELECT 
5e70: 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 74  count(id) FROM t
5e80: 65 73 74 73 20 57 48 45 52 45 20 73 74 61 74 65  ests WHERE state
5e90: 20 3d 20 27 52 55 4e 4e 49 4e 47 27 20 4f 52 20   = 'RUNNING' OR 
5ea0: 73 74 61 74 65 20 3d 20 27 4c 41 55 4e 43 48 45  state = 'LAUNCHE
5eb0: 44 27 20 4f 52 20 73 74 61 74 65 20 3d 20 27 52  D' OR state = 'R
5ec0: 45 4d 4f 54 45 48 4f 53 54 53 54 41 52 54 27 0a  EMOTEHOSTSTART'.
5ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44               AND
5ee0: 20 74 65 73 74 6e 61 6d 65 20 69 6e 20 28 53 45   testname in (SE
5ef0: 4c 45 43 54 20 74 65 73 74 6e 61 6d 65 20 46 52  LECT testname FR
5f00: 4f 4d 20 74 65 73 74 5f 6d 65 74 61 20 57 48 45  OM test_meta WHE
5f10: 52 45 20 6a 6f 62 67 72 6f 75 70 3d 3f 3b 22 0a  RE jobgroup=?;".
5f20: 09 20 6a 6f 62 67 72 6f 75 70 29 0a 09 72 65 73  . jobgroup)..res
5f30: 29 29 29 0a 0a 3b 3b 20 64 6f 6e 65 20 77 69 74  )))..;; done wit
5f40: 68 20 72 75 6e 20 77 68 65 6e 3a 0a 3b 3b 20 20  h run when:.;;  
5f50: 20 30 20 74 65 73 74 73 20 69 6e 20 4c 41 55 4e   0 tests in LAUN
5f60: 43 48 45 44 2c 20 4e 4f 54 5f 53 54 41 52 54 45  CHED, NOT_STARTE
5f70: 44 2c 20 52 45 4d 4f 54 45 48 4f 53 54 53 54 41  D, REMOTEHOSTSTA
5f80: 52 54 2c 20 52 55 4e 4e 49 4e 47 0a 28 64 65 66  RT, RUNNING.(def
5f90: 69 6e 65 20 28 64 62 3a 65 73 74 69 6d 61 74 65  ine (db:estimate
5fa0: 64 2d 74 65 73 74 73 2d 72 65 6d 61 69 6e 69 6e  d-tests-remainin
5fb0: 67 20 64 62 20 72 75 6e 2d 69 64 29 0a 20 20 28  g db run-id).  (
5fc0: 6c 65 74 20 28 28 72 65 73 20 30 29 29 0a 20 20  let ((res 0)).  
5fd0: 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65    (sqlite3:for-e
5fe0: 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61  ach-row.     (la
5ff0: 6d 62 64 61 20 28 63 6f 75 6e 74 29 0a 20 20 20  mbda (count).   
6000: 20 20 20 20 28 73 65 74 21 20 72 65 73 20 63 6f      (set! res co
6010: 75 6e 74 29 29 0a 20 20 20 20 20 64 62 20 3b 3b  unt)).     db ;;
6020: 20 4e 42 2f 2f 20 4b 49 4c 4c 52 45 51 20 6d 65   NB// KILLREQ me
6030: 61 6e 73 20 74 68 65 20 6a 6f 62 73 20 69 73 20  ans the jobs is 
6040: 73 74 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 72  still probably r
6050: 75 6e 6e 69 6e 67 0a 20 20 20 20 20 22 53 45 4c  unning.     "SEL
6060: 45 43 54 20 63 6f 75 6e 74 28 69 64 29 20 46 52  ECT count(id) FR
6070: 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 73  OM tests WHERE s
6080: 74 61 74 65 20 69 6e 20 28 27 4c 41 55 4e 43 48  tate in ('LAUNCH
6090: 45 44 27 2c 27 4e 4f 54 5f 53 54 41 52 54 45 44  ED','NOT_STARTED
60a0: 27 2c 27 52 45 4d 4f 54 45 48 4f 53 54 53 54 41  ','REMOTEHOSTSTA
60b0: 52 54 27 2c 27 52 55 4e 4e 49 4e 47 27 2c 27 4b  RT','RUNNING','K
60c0: 49 4c 4c 52 45 51 27 29 20 41 4e 44 20 72 75 6e  ILLREQ') AND run
60d0: 5f 69 64 3d 3f 3b 22 20 72 75 6e 2d 69 64 29 0a  _id=?;" run-id).
60e0: 20 20 20 20 72 65 73 29 29 0a 0a 3b 3b 20 4e 42      res))..;; NB
60f0: 2f 2f 20 53 79 6e 63 20 74 68 69 73 20 77 69 74  // Sync this wit
6100: 68 20 72 75 6e 73 3a 67 65 74 2d 74 65 73 74 2d  h runs:get-test-
6110: 69 6e 66 6f 0a 28 64 65 66 69 6e 65 20 28 64 62  info.(define (db
6120: 3a 67 65 74 2d 74 65 73 74 2d 69 6e 66 6f 20 64  :get-test-info d
6130: 62 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d  b run-id testnam
6140: 65 20 69 74 65 6d 2d 70 61 74 68 29 0a 20 20 28  e item-path).  (
6150: 6c 65 74 20 28 28 72 65 73 20 23 66 29 29 0a 20  let ((res #f)). 
6160: 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d     (sqlite3:for-
6170: 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c  each-row.     (l
6180: 61 6d 62 64 61 20 28 69 64 20 72 75 6e 2d 69 64  ambda (id run-id
6190: 20 74 65 73 74 6e 61 6d 65 20 73 74 61 74 65 20   testname state 
61a0: 73 74 61 74 75 73 20 65 76 65 6e 74 2d 74 69 6d  status event-tim
61b0: 65 20 68 6f 73 74 20 63 70 75 6c 6f 61 64 20 64  e host cpuload d
61c0: 69 73 6b 66 72 65 65 20 75 6e 61 6d 65 20 72 75  iskfree uname ru
61d0: 6e 64 69 72 20 69 74 65 6d 2d 70 61 74 68 20 72  ndir item-path r
61e0: 75 6e 5f 64 75 72 61 74 69 6f 6e 20 66 69 6e 61  un_duration fina
61f0: 6c 5f 6c 6f 67 66 20 63 6f 6d 6d 65 6e 74 20 29  l_logf comment )
6200: 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72 65  .       (set! re
6210: 73 20 28 76 65 63 74 6f 72 20 69 64 20 72 75 6e  s (vector id run
6220: 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 73 74 61  -id testname sta
6230: 74 65 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d  te status event-
6240: 74 69 6d 65 20 68 6f 73 74 20 63 70 75 6c 6f 61  time host cpuloa
6250: 64 20 64 69 73 6b 66 72 65 65 20 75 6e 61 6d 65  d diskfree uname
6260: 20 72 75 6e 64 69 72 20 69 74 65 6d 2d 70 61 74   rundir item-pat
6270: 68 20 72 75 6e 5f 64 75 72 61 74 69 6f 6e 20 66  h run_duration f
6280: 69 6e 61 6c 5f 6c 6f 67 66 20 63 6f 6d 6d 65 6e  inal_logf commen
6290: 74 20 29 29 29 0a 20 20 20 20 20 64 62 20 0a 20  t ))).     db . 
62a0: 20 20 20 20 22 53 45 4c 45 43 54 20 69 64 2c 72      "SELECT id,r
62b0: 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d 65 2c 73  un_id,testname,s
62c0: 74 61 74 65 2c 73 74 61 74 75 73 2c 65 76 65 6e  tate,status,even
62d0: 74 5f 74 69 6d 65 2c 68 6f 73 74 2c 63 70 75 6c  t_time,host,cpul
62e0: 6f 61 64 2c 64 69 73 6b 66 72 65 65 2c 75 6e 61  oad,diskfree,una
62f0: 6d 65 2c 72 75 6e 64 69 72 2c 69 74 65 6d 5f 70  me,rundir,item_p
6300: 61 74 68 2c 72 75 6e 5f 64 75 72 61 74 69 6f 6e  ath,run_duration
6310: 2c 66 69 6e 61 6c 5f 6c 6f 67 66 2c 63 6f 6d 6d  ,final_logf,comm
6320: 65 6e 74 20 46 52 4f 4d 20 74 65 73 74 73 20 57  ent FROM tests W
6330: 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e  HERE run_id=? AN
6340: 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44  D testname=? AND
6350: 20 69 74 65 6d 5f 70 61 74 68 3d 3f 3b 22 0a 20   item_path=?;". 
6360: 20 20 20 20 72 75 6e 2d 69 64 20 74 65 73 74 6e      run-id testn
6370: 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 0a 20  ame item-path). 
6380: 20 20 20 72 65 73 29 29 0a 0a 3b 3b 20 47 65 74     res))..;; Get
6390: 20 74 65 73 74 20 64 61 74 61 20 75 73 69 6e 67   test data using
63a0: 20 74 65 73 74 5f 69 64 0a 28 64 65 66 69 6e 65   test_id.(define
63b0: 20 28 64 62 3a 67 65 74 2d 74 65 73 74 2d 64 61   (db:get-test-da
63c0: 74 61 2d 62 79 2d 69 64 20 64 62 20 74 65 73 74  ta-by-id db test
63d0: 2d 69 64 29 0a 20 20 28 6c 65 74 20 28 28 72 65  -id).  (let ((re
63e0: 73 20 23 66 29 29 0a 20 20 20 20 28 73 71 6c 69  s #f)).    (sqli
63f0: 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77  te3:for-each-row
6400: 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 69  .     (lambda (i
6410: 64 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d  d run-id testnam
6420: 65 20 73 74 61 74 65 20 73 74 61 74 75 73 20 65  e state status e
6430: 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73 74 20 63  vent-time host c
6440: 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20  puload diskfree 
6450: 75 6e 61 6d 65 20 72 75 6e 64 69 72 20 69 74 65  uname rundir ite
6460: 6d 2d 70 61 74 68 20 72 75 6e 5f 64 75 72 61 74  m-path run_durat
6470: 69 6f 6e 20 66 69 6e 61 6c 5f 6c 6f 67 66 20 63  ion final_logf c
6480: 6f 6d 6d 65 6e 74 29 0a 20 20 20 20 20 20 20 28  omment).       (
6490: 73 65 74 21 20 72 65 73 20 28 76 65 63 74 6f 72  set! res (vector
64a0: 20 69 64 20 72 75 6e 2d 69 64 20 74 65 73 74 6e   id run-id testn
64b0: 61 6d 65 20 73 74 61 74 65 20 73 74 61 74 75 73  ame state status
64c0: 20 65 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73 74   event-time host
64d0: 20 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65   cpuload diskfre
64e0: 65 20 75 6e 61 6d 65 20 72 75 6e 64 69 72 20 69  e uname rundir i
64f0: 74 65 6d 2d 70 61 74 68 20 72 75 6e 5f 64 75 72  tem-path run_dur
6500: 61 74 69 6f 6e 20 66 69 6e 61 6c 5f 6c 6f 67 66  ation final_logf
6510: 20 63 6f 6d 6d 65 6e 74 29 29 29 0a 20 20 20 20   comment))).    
6520: 20 64 62 20 0a 20 20 20 20 20 22 53 45 4c 45 43   db .     "SELEC
6530: 54 20 69 64 2c 72 75 6e 5f 69 64 2c 74 65 73 74  T id,run_id,test
6540: 6e 61 6d 65 2c 73 74 61 74 65 2c 73 74 61 74 75  name,state,statu
6550: 73 2c 65 76 65 6e 74 5f 74 69 6d 65 2c 68 6f 73  s,event_time,hos
6560: 74 2c 63 70 75 6c 6f 61 64 2c 64 69 73 6b 66 72  t,cpuload,diskfr
6570: 65 65 2c 75 6e 61 6d 65 2c 72 75 6e 64 69 72 2c  ee,uname,rundir,
6580: 69 74 65 6d 5f 70 61 74 68 2c 72 75 6e 5f 64 75  item_path,run_du
6590: 72 61 74 69 6f 6e 2c 66 69 6e 61 6c 5f 6c 6f 67  ration,final_log
65a0: 66 2c 63 6f 6d 6d 65 6e 74 20 46 52 4f 4d 20 74  f,comment FROM t
65b0: 65 73 74 73 20 57 48 45 52 45 20 69 64 3d 3f 3b  ests WHERE id=?;
65c0: 22 0a 20 20 20 20 20 74 65 73 74 2d 69 64 29 0a  ".     test-id).
65d0: 20 20 20 20 72 65 73 29 29 0a 0a 0a 28 64 65 66      res))...(def
65e0: 69 6e 65 20 28 64 62 3a 74 65 73 74 2d 73 65 74  ine (db:test-set
65f0: 2d 63 6f 6d 6d 65 6e 74 20 64 62 20 74 65 73 74  -comment db test
6600: 2d 69 64 20 63 6f 6d 6d 65 6e 74 29 0a 20 20 28  -id comment).  (
6610: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
6620: 0a 20 20 20 64 62 20 0a 20 20 20 22 55 50 44 41  .   db .   "UPDA
6630: 54 45 20 74 65 73 74 73 20 53 45 54 20 63 6f 6d  TE tests SET com
6640: 6d 65 6e 74 3d 3f 20 57 48 45 52 45 20 69 64 3d  ment=? WHERE id=
6650: 3f 3b 22 0a 20 20 20 63 6f 6d 6d 65 6e 74 20 74  ?;".   comment t
6660: 65 73 74 2d 69 64 29 29 0a 0a 3b 3b 0a 28 64 65  est-id))..;;.(de
6670: 66 69 6e 65 20 28 64 62 3a 74 65 73 74 2d 73 65  fine (db:test-se
6680: 74 2d 72 75 6e 64 69 72 21 20 64 62 20 72 75 6e  t-rundir! db run
6690: 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74  -id test-name it
66a0: 65 6d 2d 70 61 74 68 20 72 75 6e 64 69 72 29 0a  em-path rundir).
66b0: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
66c0: 74 65 20 0a 20 20 20 64 62 20 0a 20 20 20 22 55  te .   db .   "U
66d0: 50 44 41 54 45 20 74 65 73 74 73 20 53 45 54 20  PDATE tests SET 
66e0: 72 75 6e 64 69 72 3d 3f 20 57 48 45 52 45 20 72  rundir=? WHERE r
66f0: 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74  un_id=? AND test
6700: 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f  name=? AND item_
6710: 70 61 74 68 3d 3f 3b 22 0a 20 20 20 72 75 6e 64  path=?;".   rund
6720: 69 72 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e  ir run-id test-n
6730: 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 29 0a  ame item-path)).
6740: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73  .(define (db:tes
6750: 74 2d 73 65 74 2d 6c 6f 67 21 20 64 62 20 74 65  t-set-log! db te
6760: 73 74 2d 69 64 20 6c 6f 67 66 29 0a 20 20 28 69  st-id logf).  (i
6770: 66 20 28 73 74 72 69 6e 67 3f 20 6c 6f 67 66 29  f (string? logf)
6780: 0a 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a  .      (sqlite3:
6790: 65 78 65 63 75 74 65 20 64 62 20 22 55 50 44 41  execute db "UPDA
67a0: 54 45 20 74 65 73 74 73 20 53 45 54 20 66 69 6e  TE tests SET fin
67b0: 61 6c 5f 6c 6f 67 66 3d 3f 20 57 48 45 52 45 20  al_logf=? WHERE 
67c0: 69 64 3d 3f 3b 22 0a 09 09 20 20 20 6c 6f 67 66  id=?;"...   logf
67d0: 20 74 65 73 74 2d 69 64 29 0a 20 20 20 20 20 20   test-id).      
67e0: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 30 20 22  (debug:print 0 "
67f0: 45 52 52 4f 52 3a 20 64 62 3a 74 65 73 74 2d 73  ERROR: db:test-s
6800: 65 74 2d 6c 6f 67 21 20 63 61 6c 6c 65 64 20 77  et-log! called w
6810: 69 74 68 20 6e 6f 6e 2d 73 74 72 69 6e 67 20 6c  ith non-string l
6820: 6f 67 20 66 69 6c 65 20 6e 61 6d 65 20 22 20 6c  og file name " l
6830: 6f 67 66 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d  ogf)))..;;======
6840: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6850: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6860: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6870: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6880: 0a 3b 3b 20 4d 69 73 63 2e 20 74 65 73 74 20 72  .;; Misc. test r
6890: 65 6c 61 74 65 64 20 71 75 65 72 69 65 73 0a 3b  elated queries.;
68a0: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;===============
68b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
68c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
68d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
68e0: 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65 66 69 6e 65  =======..(define
68f0: 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 70 61   (db:test-get-pa
6900: 74 68 73 2d 6d 61 74 63 68 69 6e 67 20 64 62 20  ths-matching db 
6910: 6b 65 79 6e 61 6d 65 73 20 74 61 72 67 65 74 20  keynames target 
6920: 66 6e 61 6d 65 70 61 74 74 20 23 21 6b 65 79 20  fnamepatt #!key 
6930: 28 72 65 73 20 27 28 29 29 29 0a 20 20 28 6c 65  (res '())).  (le
6940: 74 2a 20 28 28 69 74 65 6d 70 61 74 74 20 20 20  t* ((itempatt   
6950: 28 69 66 20 28 61 72 67 73 3a 67 65 74 2d 61 72  (if (args:get-ar
6960: 67 20 22 2d 69 74 65 6d 70 61 74 74 22 29 28 61  g "-itempatt")(a
6970: 72 67 73 3a 67 65 74 2d 61 72 67 20 22 2d 69 74  rgs:get-arg "-it
6980: 65 6d 70 61 74 74 22 29 20 22 25 22 29 29 0a 09  empatt") "%"))..
6990: 20 28 74 65 73 74 70 61 74 74 20 20 20 28 69 66   (testpatt   (if
69a0: 20 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22   (args:get-arg "
69b0: 2d 74 65 73 74 70 61 74 74 22 29 28 61 72 67 73  -testpatt")(args
69c0: 3a 67 65 74 2d 61 72 67 20 22 2d 74 65 73 74 70  :get-arg "-testp
69d0: 61 74 74 22 29 20 22 25 22 29 29 0a 09 20 28 73  att") "%")).. (s
69e0: 74 61 74 65 70 61 74 74 20 20 28 69 66 20 28 61  tatepatt  (if (a
69f0: 72 67 73 3a 67 65 74 2d 61 72 67 20 22 3a 73 74  rgs:get-arg ":st
6a00: 61 74 65 22 29 20 20 20 28 61 72 67 73 3a 67 65  ate")   (args:ge
6a10: 74 2d 61 72 67 20 22 3a 73 74 61 74 65 22 29 20  t-arg ":state") 
6a20: 20 20 20 22 25 22 29 29 0a 09 20 28 73 74 61 74     "%")).. (stat
6a30: 75 73 70 61 74 74 20 28 69 66 20 28 61 72 67 73  uspatt (if (args
6a40: 3a 67 65 74 2d 61 72 67 20 22 3a 73 74 61 74 75  :get-arg ":statu
6a50: 73 22 29 20 20 28 61 72 67 73 3a 67 65 74 2d 61  s")  (args:get-a
6a60: 72 67 20 22 3a 73 74 61 74 75 73 22 29 20 20 20  rg ":status")   
6a70: 22 25 22 29 29 0a 09 20 28 72 75 6e 6e 61 6d 65  "%")).. (runname
6a80: 20 20 20 20 28 69 66 20 28 61 72 67 73 3a 67 65      (if (args:ge
6a90: 74 2d 61 72 67 20 22 3a 72 75 6e 6e 61 6d 65 22  t-arg ":runname"
6aa0: 29 20 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20  ) (args:get-arg 
6ab0: 22 3a 72 75 6e 6e 61 6d 65 22 29 20 20 22 25 22  ":runname")  "%"
6ac0: 29 29 0a 09 20 28 6b 65 79 73 74 72 20 28 73 74  )).. (keystr (st
6ad0: 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65  ring-intersperse
6ae0: 20 0a 09 09 20 20 28 6d 61 70 20 28 6c 61 6d 62   ...  (map (lamb
6af0: 64 61 20 28 6b 65 79 20 76 61 6c 29 0a 09 09 09  da (key val)....
6b00: 20 28 63 6f 6e 63 20 22 72 2e 22 20 6b 65 79 20   (conc "r." key 
6b10: 22 20 6c 69 6b 65 20 27 22 20 76 61 6c 20 22 27  " like '" val "'
6b20: 22 29 29 0a 09 09 20 20 20 20 20 20 20 6b 65 79  "))...       key
6b30: 6e 61 6d 65 73 20 0a 09 09 20 20 20 20 20 20 20  names ...       
6b40: 28 73 74 72 69 6e 67 2d 73 70 6c 69 74 20 74 61  (string-split ta
6b50: 72 67 65 74 20 22 2f 22 29 29 0a 09 09 20 20 22  rget "/"))...  "
6b60: 20 41 4e 44 20 22 29 29 0a 09 20 28 71 72 79 73   AND ")).. (qrys
6b70: 74 72 20 28 63 6f 6e 63 20 22 53 45 4c 45 43 54  tr (conc "SELECT
6b80: 20 74 2e 72 75 6e 64 69 72 20 46 52 4f 4d 20 74   t.rundir FROM t
6b90: 65 73 74 73 20 41 53 20 74 20 49 4e 4e 45 52 20  ests AS t INNER 
6ba0: 4a 4f 49 4e 20 72 75 6e 73 20 41 53 20 72 20 4f  JOIN runs AS r O
6bb0: 4e 20 74 2e 72 75 6e 5f 69 64 3d 72 2e 69 64 20  N t.run_id=r.id 
6bc0: 57 48 45 52 45 20 22 0a 09 09 20 20 20 20 20 20  WHERE "...      
6bd0: 20 6b 65 79 73 74 72 20 22 20 41 4e 44 20 72 2e   keystr " AND r.
6be0: 72 75 6e 6e 61 6d 65 20 4c 49 4b 45 20 27 22 20  runname LIKE '" 
6bf0: 72 75 6e 6e 61 6d 65 20 22 27 20 41 4e 44 20 69  runname "' AND i
6c00: 74 65 6d 5f 70 61 74 68 20 4c 49 4b 45 20 27 22  tem_path LIKE '"
6c10: 20 69 74 65 6d 70 61 74 74 20 22 27 20 41 4e 44   itempatt "' AND
6c20: 20 74 65 73 74 6e 61 6d 65 20 4c 49 4b 45 20 27   testname LIKE '
6c30: 22 0a 09 09 20 20 20 20 20 20 20 74 65 73 74 70  "...       testp
6c40: 61 74 74 20 22 27 20 41 4e 44 20 74 2e 73 74 61  att "' AND t.sta
6c50: 74 65 20 4c 49 4b 45 20 27 22 20 73 74 61 74 65  te LIKE '" state
6c60: 70 61 74 74 20 22 27 20 41 4e 44 20 74 2e 73 74  patt "' AND t.st
6c70: 61 74 75 73 20 4c 49 4b 45 20 27 22 20 73 74 61  atus LIKE '" sta
6c80: 74 75 73 70 61 74 74 20 0a 09 09 20 20 20 20 20  tuspatt ...     
6c90: 20 20 22 27 4f 52 44 45 52 20 42 59 20 74 2e 65    "'ORDER BY t.e
6ca0: 76 65 6e 74 5f 74 69 6d 65 20 41 53 43 3b 22 29  vent_time ASC;")
6cb0: 29 29 0a 20 20 20 20 28 64 65 62 75 67 3a 70 72  )).    (debug:pr
6cc0: 69 6e 74 20 33 20 22 71 72 79 73 74 72 3a 20 22  int 3 "qrystr: "
6cd0: 20 71 72 79 73 74 72 29 0a 20 20 20 20 28 73 71   qrystr).    (sq
6ce0: 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72  lite3:for-each-r
6cf0: 6f 77 20 0a 20 20 20 20 20 28 6c 61 6d 62 64 61  ow .     (lambda
6d00: 20 28 70 29 0a 20 20 20 20 20 20 20 28 73 65 74   (p).       (set
6d10: 21 20 72 65 73 20 28 63 6f 6e 73 20 70 20 72 65  ! res (cons p re
6d20: 73 29 29 29 0a 20 20 20 20 20 64 62 20 0a 20 20  s))).     db .  
6d30: 20 20 20 71 72 79 73 74 72 29 0a 20 20 20 20 28     qrystr).    (
6d40: 69 66 20 66 6e 61 6d 65 70 61 74 74 0a 09 28 61  if fnamepatt..(a
6d50: 70 70 6c 79 20 61 70 70 65 6e 64 20 0a 09 20 20  pply append ..  
6d60: 20 20 20 20 20 28 6d 61 70 20 28 6c 61 6d 62 64       (map (lambd
6d70: 61 20 28 70 29 0a 09 09 20 20 20 20 20 20 28 67  a (p)...      (g
6d80: 6c 6f 62 20 28 63 6f 6e 63 20 70 20 22 2f 22 20  lob (conc p "/" 
6d90: 66 6e 61 6d 65 70 61 74 74 29 29 29 0a 09 09 20  fnamepatt)))... 
6da0: 20 20 20 72 65 73 29 29 0a 09 72 65 73 29 29 29     res))..res)))
6db0: 0a 0a 3b 3b 20 6c 6f 6f 6b 20 74 68 72 6f 75 67  ..;; look throug
6dc0: 68 20 74 65 73 74 73 20 66 72 6f 6d 20 6d 61 74  h tests from mat
6dd0: 63 68 69 6e 67 20 72 75 6e 73 20 66 6f 72 20 61  ching runs for a
6de0: 20 66 69 6c 65 0a 28 64 65 66 69 6e 65 20 28 64   file.(define (d
6df0: 62 3a 74 65 73 74 2d 67 65 74 2d 66 69 72 73 74  b:test-get-first
6e00: 2d 70 61 74 68 2d 6d 61 74 63 68 69 6e 67 20 64  -path-matching d
6e10: 62 20 6b 65 79 6e 61 6d 65 73 20 74 61 72 67 65  b keynames targe
6e20: 74 20 66 6e 61 6d 65 29 0a 20 20 3b 3b 20 5b 72  t fname).  ;; [r
6e30: 65 66 70 61 74 68 73 5d 20 69 73 20 74 68 65 20  efpaths] is the 
6e40: 73 65 63 74 69 6f 6e 20 77 68 65 72 65 20 72 65  section where re
6e50: 66 65 72 65 6e 63 65 73 20 74 6f 20 6f 74 68 65  ferences to othe
6e60: 72 20 6d 65 67 61 74 65 73 74 20 64 61 74 61 62  r megatest datab
6e70: 61 73 65 73 20 61 72 65 20 73 74 6f 72 65 64 0a  ases are stored.
6e80: 20 20 28 6c 65 74 20 28 28 6d 74 2d 70 61 74 68    (let ((mt-path
6e90: 73 20 28 63 6f 6e 66 69 67 66 3a 67 65 74 2d 73  s (configf:get-s
6ea0: 65 63 74 69 6f 6e 20 22 72 65 66 70 61 74 68 73  ection "refpaths
6eb0: 22 29 29 0a 09 28 72 65 73 20 20 20 20 20 20 20  "))..(res       
6ec0: 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 70 61 74  (db:test-get-pat
6ed0: 68 73 2d 6d 61 74 63 68 69 6e 67 20 64 62 20 6b  hs-matching db k
6ee0: 65 79 6e 61 6d 65 73 20 74 61 72 67 65 74 20 66  eynames target f
6ef0: 6e 61 6d 65 29 29 29 0a 20 20 20 20 28 6c 65 74  name))).    (let
6f00: 20 6c 6f 6f 70 20 28 28 70 61 74 68 64 61 74 20   loop ((pathdat 
6f10: 28 69 66 20 28 6e 75 6c 6c 3f 20 70 61 74 68 73  (if (null? paths
6f20: 29 20 23 66 20 28 63 61 72 20 6d 74 2d 70 61 74  ) #f (car mt-pat
6f30: 68 73 29 29 29 0a 09 20 20 20 20 20 20 20 28 74  hs)))..       (t
6f40: 61 6c 20 20 20 20 20 28 69 66 20 28 6e 75 6c 6c  al     (if (null
6f50: 3f 20 70 61 74 68 73 29 20 27 28 29 28 63 64 72  ? paths) '()(cdr
6f60: 20 6d 74 2d 70 61 74 68 73 29 29 29 29 0a 20 20   mt-paths)))).  
6f70: 20 20 20 20 28 69 66 20 28 6e 6f 74 20 28 6e 75      (if (not (nu
6f80: 6c 6c 3f 20 72 65 73 29 29 0a 09 20 20 28 63 61  ll? res))..  (ca
6f90: 72 20 72 65 73 29 20 3b 3b 20 72 65 74 75 72 6e  r res) ;; return
6fa0: 20 66 69 72 73 74 20 66 6f 75 6e 64 0a 09 20 20   first found..  
6fb0: 28 69 66 20 70 61 74 68 0a 09 20 20 20 20 20 20  (if path..      
6fc0: 28 6c 65 74 2a 20 28 28 64 62 20 20 20 20 20 28  (let* ((db     (
6fd0: 6f 70 65 6e 2d 64 62 20 70 61 74 68 3a 20 28 63  open-db path: (c
6fe0: 61 64 72 20 70 61 74 68 64 61 74 29 29 29 0a 09  adr pathdat)))..
6ff0: 09 20 20 20 20 20 28 6e 65 77 72 65 73 20 28 64  .     (newres (d
7000: 62 3a 74 65 73 74 2d 67 65 74 2d 70 61 74 68 73  b:test-get-paths
7010: 2d 6d 61 74 63 68 69 6e 67 20 64 62 20 6b 65 79  -matching db key
7020: 6e 61 6d 65 73 20 74 61 72 67 65 74 20 66 6e 61  names target fna
7030: 6d 65 29 29 29 0a 09 09 28 64 65 62 75 67 3a 70  me)))...(debug:p
7040: 72 69 6e 74 20 34 20 22 49 4e 46 4f 3a 20 54 72  rint 4 "INFO: Tr
7050: 79 69 6e 67 20 22 20 28 63 61 72 20 70 61 74 68  ying " (car path
7060: 64 61 74 29 20 22 20 61 74 20 22 20 28 63 61 64  dat) " at " (cad
7070: 72 20 70 61 74 68 64 61 74 29 29 0a 09 09 28 73  r pathdat))...(s
7080: 71 6c 69 74 65 33 3a 66 69 6e 61 6c 69 7a 65 21  qlite3:finalize!
7090: 20 64 62 29 0a 09 09 28 69 66 20 28 6e 6f 74 20   db)...(if (not 
70a0: 28 6e 75 6c 6c 3f 20 6e 65 77 72 65 73 29 29 0a  (null? newres)).
70b0: 09 09 20 20 20 20 28 63 61 72 20 6e 65 77 72 65  ..    (car newre
70c0: 73 29 0a 09 09 20 20 20 20 28 69 66 20 28 6e 75  s)...    (if (nu
70d0: 6c 6c 3f 20 74 61 6c 29 0a 09 09 09 23 66 0a 09  ll? tal)....#f..
70e0: 09 09 28 6c 6f 6f 70 20 28 63 61 72 20 74 61 6c  ..(loop (car tal
70f0: 29 28 63 64 72 20 74 61 6c 29 29 29 29 29 29 29  )(cdr tal)))))))
7100: 29 29 29 0a 0a 0a 28 64 65 66 69 6e 65 20 28 64  )))...(define (d
7110: 62 3a 74 65 73 74 2d 67 65 74 2d 74 65 73 74 2d  b:test-get-test-
7120: 72 65 63 6f 72 64 73 2d 6d 61 74 63 68 69 6e 67  records-matching
7130: 20 64 62 20 6b 65 79 6e 61 6d 65 73 20 74 61 72   db keynames tar
7140: 67 65 74 29 0a 20 20 28 6c 65 74 2a 20 28 28 72  get).  (let* ((r
7150: 65 73 20 27 28 29 29 0a 09 20 28 69 74 65 6d 70  es '()).. (itemp
7160: 61 74 74 20 20 20 28 69 66 20 28 61 72 67 73 3a  att   (if (args:
7170: 67 65 74 2d 61 72 67 20 22 2d 69 74 65 6d 70 61  get-arg "-itempa
7180: 74 74 22 29 28 61 72 67 73 3a 67 65 74 2d 61 72  tt")(args:get-ar
7190: 67 20 22 2d 69 74 65 6d 70 61 74 74 22 29 20 22  g "-itempatt") "
71a0: 25 22 29 29 0a 09 20 28 74 65 73 74 70 61 74 74  %")).. (testpatt
71b0: 20 20 20 28 69 66 20 28 61 72 67 73 3a 67 65 74     (if (args:get
71c0: 2d 61 72 67 20 22 2d 74 65 73 74 70 61 74 74 22  -arg "-testpatt"
71d0: 29 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22  )(args:get-arg "
71e0: 2d 74 65 73 74 70 61 74 74 22 29 20 22 25 22 29  -testpatt") "%")
71f0: 29 0a 09 20 28 73 74 61 74 65 70 61 74 74 20 20  ).. (statepatt  
7200: 28 69 66 20 28 61 72 67 73 3a 67 65 74 2d 61 72  (if (args:get-ar
7210: 67 20 22 3a 73 74 61 74 65 22 29 20 20 20 28 61  g ":state")   (a
7220: 72 67 73 3a 67 65 74 2d 61 72 67 20 22 3a 73 74  rgs:get-arg ":st
7230: 61 74 65 22 29 20 20 20 20 22 25 22 29 29 0a 09  ate")    "%"))..
7240: 20 28 73 74 61 74 75 73 70 61 74 74 20 28 69 66   (statuspatt (if
7250: 20 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22   (args:get-arg "
7260: 3a 73 74 61 74 75 73 22 29 20 20 28 61 72 67 73  :status")  (args
7270: 3a 67 65 74 2d 61 72 67 20 22 3a 73 74 61 74 75  :get-arg ":statu
7280: 73 22 29 20 20 20 22 25 22 29 29 0a 09 20 28 72  s")   "%")).. (r
7290: 75 6e 6e 61 6d 65 20 20 20 20 28 69 66 20 28 61  unname    (if (a
72a0: 72 67 73 3a 67 65 74 2d 61 72 67 20 22 3a 72 75  rgs:get-arg ":ru
72b0: 6e 6e 61 6d 65 22 29 20 28 61 72 67 73 3a 67 65  nname") (args:ge
72c0: 74 2d 61 72 67 20 22 3a 72 75 6e 6e 61 6d 65 22  t-arg ":runname"
72d0: 29 20 20 22 25 22 29 29 0a 09 20 28 6b 65 79 73  )  "%")).. (keys
72e0: 74 72 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72  tr (string-inter
72f0: 73 70 65 72 73 65 20 0a 09 09 20 20 28 6d 61 70  sperse ...  (map
7300: 20 28 6c 61 6d 62 64 61 20 28 6b 65 79 20 76 61   (lambda (key va
7310: 6c 29 0a 09 09 09 20 28 63 6f 6e 63 20 22 72 2e  l).... (conc "r.
7320: 22 20 6b 65 79 20 22 20 6c 69 6b 65 20 27 22 20  " key " like '" 
7330: 76 61 6c 20 22 27 22 29 29 0a 09 09 20 20 20 20  val "'"))...    
7340: 20 20 20 6b 65 79 6e 61 6d 65 73 20 0a 09 09 20     keynames ... 
7350: 20 20 20 20 20 20 28 73 74 72 69 6e 67 2d 73 70        (string-sp
7360: 6c 69 74 20 74 61 72 67 65 74 20 22 2f 22 29 29  lit target "/"))
7370: 0a 09 09 20 20 22 20 41 4e 44 20 22 29 29 0a 09  ...  " AND "))..
7380: 20 28 71 72 79 73 74 72 20 28 63 6f 6e 63 20 22   (qrystr (conc "
7390: 53 45 4c 45 43 54 20 0a 20 20 20 20 20 20 20 20  SELECT .        
73a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73b0: 20 20 20 20 74 2e 69 64 0a 20 20 20 20 20 20 20      t.id.       
73c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73d0: 20 20 20 20 20 74 2e 72 75 6e 5f 69 64 20 20 20       t.run_id   
73e0: 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20    .             
73f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
7400: 2e 74 65 73 74 6e 61 6d 65 20 20 20 0a 20 20 20  .testname   .   
7410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7420: 20 20 20 20 20 20 20 20 20 74 2e 68 6f 73 74 20           t.host 
7430: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20        .         
7440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7450: 20 20 20 74 2e 63 70 75 6c 6f 61 64 20 20 20 20     t.cpuload    
7460: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 2e 64               t.d
7480: 69 73 6b 66 72 65 65 20 20 20 0a 20 20 20 20 20  iskfree   .     
7490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74a0: 20 20 20 20 20 20 20 74 2e 75 6e 61 6d 65 20 20         t.uname  
74b0: 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20      .           
74c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74d0: 20 74 2e 72 75 6e 64 69 72 20 20 20 20 20 0a 20   t.rundir     . 
74e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74f0: 20 20 20 20 20 20 20 20 20 20 20 74 2e 73 68 6f             t.sho
7500: 72 74 64 69 72 20 20 20 0a 20 20 20 20 20 20 20  rtdir   .       
7510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7520: 20 20 20 20 20 74 2e 69 74 65 6d 5f 70 61 74 68       t.item_path
7530: 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20    .             
7540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
7550: 2e 73 74 61 74 65 20 20 20 20 20 20 0a 20 20 20  .state      .   
7560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7570: 20 20 20 20 20 20 20 20 20 74 2e 73 74 61 74 75           t.statu
7580: 73 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20  s     .         
7590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75a0: 20 20 20 74 2e 61 74 74 65 6d 70 74 6e 75 6d 20     t.attemptnum 
75b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
75c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 2e 66               t.f
75d0: 69 6e 61 6c 5f 6c 6f 67 66 20 0a 20 20 20 20 20  inal_logf .     
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75f0: 20 20 20 20 20 20 20 74 2e 6c 6f 67 64 61 74 20         t.logdat 
7600: 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20      .           
7610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7620: 20 74 2e 72 75 6e 5f 64 75 72 61 74 69 6f 0a 20   t.run_duratio. 
7630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7640: 20 20 20 20 20 20 20 20 20 20 20 74 2e 63 6f 6d             t.com
7650: 6d 65 6e 74 20 20 20 20 0a 20 20 20 20 20 20 20  ment    .       
7660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7670: 20 20 20 20 20 74 2e 65 76 65 6e 74 5f 74 69 6d       t.event_tim
7680: 65 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e .             
7690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
76a0: 2e 66 61 69 6c 5f 63 6f 75 6e 74 20 0a 20 20 20  .fail_count .   
76b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76c0: 20 20 20 20 20 20 20 20 20 74 2e 70 61 73 73 5f           t.pass_
76d0: 63 6f 75 6e 74 20 0a 20 20 20 20 20 20 20 20 20  count .         
76e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76f0: 20 20 20 74 2e 61 72 63 68 69 76 65 64 20 20 20     t.archived   
7700: 0a 0a 0a 0a 20 46 52 4f 4d 20 74 65 73 74 73 20  .... FROM tests 
7710: 41 53 20 74 20 49 4e 4e 45 52 20 4a 4f 49 4e 20  AS t INNER JOIN 
7720: 72 75 6e 73 20 41 53 20 72 20 4f 4e 20 74 2e 72  runs AS r ON t.r
7730: 75 6e 5f 69 64 3d 72 2e 69 64 20 57 48 45 52 45  un_id=r.id WHERE
7740: 20 22 0a 09 09 20 20 20 20 20 20 20 6b 65 79 73   "...       keys
7750: 74 72 20 22 20 41 4e 44 20 72 2e 72 75 6e 6e 61  tr " AND r.runna
7760: 6d 65 20 4c 49 4b 45 20 27 22 20 72 75 6e 6e 61  me LIKE '" runna
7770: 6d 65 20 22 27 20 41 4e 44 20 69 74 65 6d 5f 70  me "' AND item_p
7780: 61 74 68 20 4c 49 4b 45 20 27 22 20 69 74 65 6d  ath LIKE '" item
7790: 70 61 74 74 20 22 27 20 41 4e 44 20 74 65 73 74  patt "' AND test
77a0: 6e 61 6d 65 20 4c 49 4b 45 20 27 22 0a 09 09 20  name LIKE '"... 
77b0: 20 20 20 20 20 20 74 65 73 74 70 61 74 74 20 22        testpatt "
77c0: 27 20 41 4e 44 20 74 2e 73 74 61 74 65 20 4c 49  ' AND t.state LI
77d0: 4b 45 20 27 22 20 73 74 61 74 65 70 61 74 74 20  KE '" statepatt 
77e0: 22 27 20 41 4e 44 20 74 2e 73 74 61 74 75 73 20  "' AND t.status 
77f0: 4c 49 4b 45 20 27 22 20 73 74 61 74 75 73 70 61  LIKE '" statuspa
7800: 74 74 20 0a 09 09 20 20 20 20 20 20 20 22 27 4f  tt ...       "'O
7810: 52 44 45 52 20 42 59 20 74 2e 65 76 65 6e 74 5f  RDER BY t.event_
7820: 74 69 6d 65 20 41 53 43 3b 22 29 29 29 0a 20 20  time ASC;"))).  
7830: 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 33    (debug:print 3
7840: 20 22 71 72 79 73 74 72 3a 20 22 20 71 72 79 73   "qrystr: " qrys
7850: 74 72 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33  tr).    (sqlite3
7860: 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20  :for-each-row . 
7870: 20 20 20 20 28 6c 61 6d 62 64 61 20 28 70 29 0a      (lambda (p).
7880: 20 20 20 20 20 20 20 28 73 65 74 21 20 72 65 73         (set! res
7890: 20 28 63 6f 6e 73 20 70 20 72 65 73 29 29 29 0a   (cons p res))).
78a0: 20 20 20 20 20 64 62 20 0a 20 20 20 20 20 71 72       db .     qr
78b0: 79 73 74 72 29 0a 20 20 20 20 72 65 73 29 29 0a  ystr).    res)).
78c0: 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  .;;=============
78d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
78e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
78f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7900: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 51 55 45  =========.;; QUE
7910: 55 45 20 55 50 20 4d 45 54 41 2c 20 54 45 53 54  UE UP META, TEST
7920: 20 53 54 41 54 55 53 20 41 4e 44 20 53 54 45 50   STATUS AND STEP
7930: 53 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  S.;;============
7940: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7950: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7960: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7970: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65 66  ==========..(def
7980: 69 6e 65 20 28 64 62 3a 75 70 64 61 74 65 72 20  ine (db:updater 
7990: 64 62 29 0a 20 20 28 6c 65 74 20 6c 6f 6f 70 20  db).  (let loop 
79a0: 28 28 73 74 61 72 74 2d 74 69 6d 65 20 28 63 75  ((start-time (cu
79b0: 72 72 65 6e 74 2d 74 69 6d 65 29 29 29 0a 20 20  rrent-time))).  
79c0: 20 20 28 74 68 72 65 61 64 2d 73 6c 65 65 70 21    (thread-sleep!
79d0: 20 30 2e 35 29 20 3b 3b 20 6d 6f 76 65 20 73 61   0.5) ;; move sa
79e0: 76 65 20 74 69 6d 65 20 61 72 6f 75 6e 64 20 74  ve time around t
79f0: 6f 20 6d 69 6e 69 6d 69 7a 65 20 72 65 67 75 6c  o minimize regul
7a00: 61 72 20 63 6f 6c 6c 69 73 69 6f 6e 73 3f 0a 20  ar collisions?. 
7a10: 20 20 20 28 64 62 3a 77 72 69 74 65 2d 63 61 63     (db:write-cac
7a20: 68 65 64 2d 64 61 74 61 20 64 62 29 0a 20 20 20  hed-data db).   
7a30: 20 28 6c 6f 6f 70 20 73 74 61 72 74 2d 74 69 6d   (loop start-tim
7a40: 65 29 29 29 0a 20 20 20 20 0a 28 64 65 66 69 6e  e))).    .(defin
7a50: 65 20 28 64 62 3a 74 65 73 74 2d 75 70 64 61 74  e (db:test-updat
7a60: 65 2d 6d 65 74 61 2d 69 6e 66 6f 20 64 62 20 74  e-meta-info db t
7a70: 65 73 74 2d 69 64 20 6d 69 6e 75 74 65 73 20 63  est-id minutes c
7a80: 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20  puload diskfree 
7a90: 74 6d 70 66 72 65 65 29 0a 20 20 28 6d 75 74 65  tmpfree).  (mute
7aa0: 78 2d 6c 6f 63 6b 21 20 2a 69 6e 63 6f 6d 69 6e  x-lock! *incomin
7ab0: 67 2d 6d 75 74 65 78 2a 29 0a 20 20 28 73 65 74  g-mutex*).  (set
7ac0: 21 20 2a 69 6e 63 6f 6d 69 6e 67 2d 64 61 74 61  ! *incoming-data
7ad0: 2a 20 28 63 6f 6e 73 20 28 76 65 63 74 6f 72 20  * (cons (vector 
7ae0: 27 6d 65 74 61 2d 69 6e 66 6f 0a 09 09 09 09 20  'meta-info..... 
7af0: 20 20 20 20 20 28 63 75 72 72 65 6e 74 2d 73 65       (current-se
7b00: 63 6f 6e 64 73 29 0a 09 09 09 09 20 20 20 20 20  conds).....     
7b10: 20 28 6c 69 73 74 20 63 70 75 6c 6f 61 64 0a 09   (list cpuload..
7b20: 09 09 09 09 20 20 20 20 64 69 73 6b 66 72 65 65  ....    diskfree
7b30: 0a 09 09 09 09 09 20 20 20 20 6d 69 6e 75 74 65  ......    minute
7b40: 73 0a 09 09 09 09 09 20 20 20 20 74 65 73 74 2d  s......    test-
7b50: 69 64 29 29 20 3b 3b 20 72 75 6e 2d 69 64 20 74  id)) ;; run-id t
7b60: 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61  est-name item-pa
7b70: 74 68 20 6d 69 6e 75 74 65 73 20 63 70 75 6c 6f  th minutes cpulo
7b80: 61 64 20 64 69 73 6b 66 72 65 65 20 74 6d 70 66  ad diskfree tmpf
7b90: 72 65 65 29 20 0a 09 09 09 20 20 20 20 20 20 2a  ree) ....      *
7ba0: 69 6e 63 6f 6d 69 6e 67 2d 64 61 74 61 2a 29 29  incoming-data*))
7bb0: 0a 20 20 28 6d 75 74 65 78 2d 75 6e 6c 6f 63 6b  .  (mutex-unlock
7bc0: 21 20 2a 69 6e 63 6f 6d 69 6e 67 2d 6d 75 74 65  ! *incoming-mute
7bd0: 78 2a 29 0a 20 20 28 69 66 20 2a 63 61 63 68 65  x*).  (if *cache
7be0: 2d 6f 6e 2a 0a 20 20 20 20 20 20 28 64 65 62 75  -on*.      (debu
7bf0: 67 3a 70 72 69 6e 74 20 36 20 22 49 4e 46 4f 3a  g:print 6 "INFO:
7c00: 20 2a 63 61 63 68 65 2d 6f 6e 2a 20 69 73 20 22   *cache-on* is "
7c10: 20 2a 63 61 63 68 65 2d 6f 6e 2a 20 22 2c 20 73   *cache-on* ", s
7c20: 6b 69 70 70 69 6e 67 20 63 61 63 68 65 20 77 72  kipping cache wr
7c30: 69 74 65 20 61 73 20 70 61 72 74 20 6f 66 20 74  ite as part of t
7c40: 65 73 74 2d 75 70 64 61 74 65 2d 6d 65 74 61 2d  est-update-meta-
7c50: 69 6e 66 6f 22 29 0a 20 20 20 20 20 20 28 64 62  info").      (db
7c60: 3a 77 72 69 74 65 2d 63 61 63 68 65 64 2d 64 61  :write-cached-da
7c70: 74 61 20 64 62 29 29 29 0a 0a 28 64 65 66 69 6e  ta db)))..(defin
7c80: 65 20 28 64 62 3a 77 72 69 74 65 2d 63 61 63 68  e (db:write-cach
7c90: 65 64 2d 64 61 74 61 20 64 62 29 0a 20 20 28 6c  ed-data db).  (l
7ca0: 65 74 20 28 28 6d 65 74 61 2d 73 74 6d 74 20 28  et ((meta-stmt (
7cb0: 73 71 6c 69 74 65 33 3a 70 72 65 70 61 72 65 20  sqlite3:prepare 
7cc0: 64 62 20 22 55 50 44 41 54 45 20 74 65 73 74 73  db "UPDATE tests
7cd0: 20 53 45 54 20 63 70 75 6c 6f 61 64 3d 3f 2c 64   SET cpuload=?,d
7ce0: 69 73 6b 66 72 65 65 3d 3f 2c 72 75 6e 5f 64 75  iskfree=?,run_du
7cf0: 72 61 74 69 6f 6e 3d 3f 2c 73 74 61 74 65 3d 27  ration=?,state='
7d00: 52 55 4e 4e 49 4e 47 27 20 57 48 45 52 45 20 69  RUNNING' WHERE i
7d10: 64 3d 3f 20 41 4e 44 20 73 74 61 74 65 20 4e 4f  d=? AND state NO
7d20: 54 20 49 4e 20 28 27 43 4f 4d 50 4c 45 54 45 44  T IN ('COMPLETED
7d30: 27 2c 27 4b 49 4c 4c 52 45 51 27 2c 27 4b 49 4c  ','KILLREQ','KIL
7d40: 4c 45 44 27 29 3b 22 29 29 0a 09 28 73 74 65 70  LED');"))..(step
7d50: 2d 73 74 6d 74 20 28 73 71 6c 69 74 65 33 3a 70  -stmt (sqlite3:p
7d60: 72 65 70 61 72 65 20 64 62 20 22 49 4e 53 45 52  repare db "INSER
7d70: 54 20 4f 52 20 52 45 50 4c 41 43 45 20 69 6e 74  T OR REPLACE int
7d80: 6f 20 74 65 73 74 5f 73 74 65 70 73 20 28 74 65  o test_steps (te
7d90: 73 74 5f 69 64 2c 73 74 65 70 6e 61 6d 65 2c 73  st_id,stepname,s
7da0: 74 61 74 65 2c 73 74 61 74 75 73 2c 65 76 65 6e  tate,status,even
7db0: 74 5f 74 69 6d 65 2c 63 6f 6d 6d 65 6e 74 2c 6c  t_time,comment,l
7dc0: 6f 67 66 69 6c 65 29 20 56 41 4c 55 45 53 28 3f  ogfile) VALUES(?
7dd0: 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 29 3b 22 29  ,?,?,?,?,?,?);")
7de0: 29 20 3b 3b 20 73 74 72 66 74 69 6d 65 28 27 25  ) ;; strftime('%
7df0: 73 27 2c 27 6e 6f 77 27 29 23 66 29 0a 09 28 64  s','now')#f)..(d
7e00: 61 74 61 20 28 73 6f 72 74 20 2a 69 6e 63 6f 6d  ata (sort *incom
7e10: 69 6e 67 2d 64 61 74 61 2a 20 28 6c 61 6d 62 64  ing-data* (lambd
7e20: 61 20 28 61 20 62 29 28 3c 20 28 76 65 63 74 6f  a (a b)(< (vecto
7e30: 72 2d 72 65 66 20 61 20 31 29 28 76 65 63 74 6f  r-ref a 1)(vecto
7e40: 72 2d 72 65 66 20 62 20 31 29 29 29 29 29 29 0a  r-ref b 1)))))).
7e50: 20 20 20 20 28 69 66 20 28 3e 20 28 6c 65 6e 67      (if (> (leng
7e60: 74 68 20 64 61 74 61 29 20 30 29 0a 09 28 64 65  th data) 0)..(de
7e70: 62 75 67 3a 70 72 69 6e 74 20 34 20 22 57 72 69  bug:print 4 "Wri
7e80: 74 69 6e 67 20 63 61 63 68 65 64 20 64 61 74 61  ting cached data
7e90: 20 22 20 64 61 74 61 29 29 0a 20 20 20 20 28 6d   " data)).    (m
7ea0: 75 74 65 78 2d 6c 6f 63 6b 21 20 2a 69 6e 63 6f  utex-lock! *inco
7eb0: 6d 69 6e 67 2d 6d 75 74 65 78 2a 29 0a 20 20 20  ming-mutex*).   
7ec0: 20 28 73 71 6c 69 74 65 33 3a 77 69 74 68 2d 74   (sqlite3:with-t
7ed0: 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20 20 20  ransaction .    
7ee0: 20 64 62 0a 20 20 20 20 20 28 6c 61 6d 62 64 61   db.     (lambda
7ef0: 20 28 29 0a 20 20 20 20 20 20 20 28 66 6f 72 2d   ().       (for-
7f00: 65 61 63 68 20 28 6c 61 6d 62 64 61 20 28 65 6e  each (lambda (en
7f10: 74 72 79 29 0a 09 09 20 20 20 28 63 61 73 65 20  try)...   (case 
7f20: 28 76 65 63 74 6f 72 2d 72 65 66 20 65 6e 74 72  (vector-ref entr
7f30: 79 20 30 29 0a 09 09 20 20 20 20 20 28 28 6d 65  y 0)...     ((me
7f40: 74 61 2d 69 6e 66 6f 29 0a 09 09 20 20 20 20 20  ta-info)...     
7f50: 20 28 61 70 70 6c 79 20 73 71 6c 69 74 65 33 3a   (apply sqlite3:
7f60: 65 78 65 63 75 74 65 20 6d 65 74 61 2d 73 74 6d  execute meta-stm
7f70: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 65 6e  t (vector-ref en
7f80: 74 72 79 20 32 29 29 29 0a 09 09 20 20 20 20 20  try 2)))...     
7f90: 28 28 73 74 65 70 2d 73 74 61 74 75 73 29 0a 09  ((step-status)..
7fa0: 09 20 20 20 20 20 20 28 61 70 70 6c 79 20 73 71  .      (apply sq
7fb0: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 73 74  lite3:execute st
7fc0: 65 70 2d 73 74 6d 74 20 28 76 65 63 74 6f 72 2d  ep-stmt (vector-
7fd0: 72 65 66 20 65 6e 74 72 79 20 32 29 29 29 0a 09  ref entry 2)))..
7fe0: 09 20 20 20 20 20 28 65 6c 73 65 0a 09 09 20 20  .     (else...  
7ff0: 20 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74      (debug:print
8000: 20 30 20 22 45 52 52 4f 52 3a 20 51 75 65 75 65   0 "ERROR: Queue
8010: 64 20 65 6e 74 72 79 20 6e 6f 74 20 72 65 63 6f  d entry not reco
8020: 67 6e 69 73 65 64 20 22 20 65 6e 74 72 79 29 29  gnised " entry))
8030: 29 29 0a 09 09 20 64 61 74 61 29 29 29 0a 20 20  ))... data))).  
8040: 20 20 28 73 71 6c 69 74 65 33 3a 66 69 6e 61 6c    (sqlite3:final
8050: 69 7a 65 21 20 6d 65 74 61 2d 73 74 6d 74 29 20  ize! meta-stmt) 
8060: 3b 3b 20 73 71 6c 69 74 65 20 69 73 20 74 68 65  ;; sqlite is the
8070: 20 62 6f 74 74 6c 65 6e 65 63 6b 2c 20 63 6c 65   bottleneck, cle
8080: 61 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ar the statement
8090: 73 20 61 73 61 70 3f 0a 20 20 20 20 28 73 71 6c  s asap?.    (sql
80a0: 69 74 65 33 3a 66 69 6e 61 6c 69 7a 65 21 20 73  ite3:finalize! s
80b0: 74 65 70 2d 73 74 6d 74 29 0a 20 20 20 20 28 73  tep-stmt).    (s
80c0: 65 74 21 20 2a 69 6e 63 6f 6d 69 6e 67 2d 64 61  et! *incoming-da
80d0: 74 61 2a 20 27 28 29 29 0a 20 20 20 20 28 6d 75  ta* '()).    (mu
80e0: 74 65 78 2d 75 6e 6c 6f 63 6b 21 20 2a 69 6e 63  tex-unlock! *inc
80f0: 6f 6d 69 6e 67 2d 6d 75 74 65 78 2a 29 29 29 0a  oming-mutex*))).
8100: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 72 6f 6c  .(define (db:rol
8110: 6c 2d 75 70 2d 70 61 73 73 2d 66 61 69 6c 2d 63  l-up-pass-fail-c
8120: 6f 75 6e 74 73 20 64 62 20 72 75 6e 2d 69 64 20  ounts db run-id 
8130: 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70  test-name item-p
8140: 61 74 68 20 73 74 61 74 75 73 29 0a 20 20 28 69  ath status).  (i
8150: 66 20 28 61 6e 64 20 28 6e 6f 74 20 28 65 71 75  f (and (not (equ
8160: 61 6c 3f 20 69 74 65 6d 2d 70 61 74 68 20 22 22  al? item-path ""
8170: 29 29 0a 09 20 20 20 28 6f 72 20 28 65 71 75 61  ))..   (or (equa
8180: 6c 3f 20 73 74 61 74 75 73 20 22 50 41 53 53 22  l? status "PASS"
8190: 29 0a 09 20 20 20 20 20 20 20 28 65 71 75 61 6c  )..       (equal
81a0: 3f 20 73 74 61 74 75 73 20 22 57 41 52 4e 22 29  ? status "WARN")
81b0: 0a 09 20 20 20 20 20 20 20 28 65 71 75 61 6c 3f  ..       (equal?
81c0: 20 73 74 61 74 75 73 20 22 46 41 49 4c 22 29 0a   status "FAIL").
81d0: 09 20 20 20 20 20 20 20 28 65 71 75 61 6c 3f 20  .       (equal? 
81e0: 73 74 61 74 75 73 20 22 57 41 49 56 45 44 22 29  status "WAIVED")
81f0: 0a 09 20 20 20 20 20 20 20 28 65 71 75 61 6c 3f  ..       (equal?
8200: 20 73 74 61 74 75 73 20 22 52 55 4e 4e 49 4e 47   status "RUNNING
8210: 22 29 29 29 0a 20 20 20 20 20 20 28 62 65 67 69  "))).      (begi
8220: 6e 0a 09 28 73 71 6c 69 74 65 33 3a 65 78 65 63  n..(sqlite3:exec
8230: 75 74 65 20 0a 09 20 64 62 0a 09 20 22 55 50 44  ute .. db.. "UPD
8240: 41 54 45 20 74 65 73 74 73 20 0a 20 20 20 20 20  ATE tests .     
8250: 20 20 20 20 20 20 20 20 53 45 54 20 66 61 69 6c          SET fail
8260: 5f 63 6f 75 6e 74 3d 28 53 45 4c 45 43 54 20 63  _count=(SELECT c
8270: 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 74 65  ount(id) FROM te
8280: 73 74 73 20 57 48 45 52 45 20 72 75 6e 5f 69 64  sts WHERE run_id
8290: 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d  =? AND testname=
82a0: 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 20  ? AND item_path 
82b0: 21 3d 20 27 27 20 41 4e 44 20 73 74 61 74 75 73  != '' AND status
82c0: 3d 27 46 41 49 4c 27 29 2c 0a 20 20 20 20 20 20  ='FAIL'),.      
82d0: 20 20 20 20 20 20 20 20 20 20 20 70 61 73 73 5f             pass_
82e0: 63 6f 75 6e 74 3d 28 53 45 4c 45 43 54 20 63 6f  count=(SELECT co
82f0: 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 74 65 73  unt(id) FROM tes
8300: 74 73 20 57 48 45 52 45 20 72 75 6e 5f 69 64 3d  ts WHERE run_id=
8310: 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f  ? AND testname=?
8320: 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 20 21   AND item_path !
8330: 3d 20 27 27 20 41 4e 44 20 28 73 74 61 74 75 73  = '' AND (status
8340: 3d 27 50 41 53 53 27 20 4f 52 20 73 74 61 74 75  ='PASS' OR statu
8350: 73 3d 27 57 41 52 4e 27 20 4f 52 20 73 74 61 74  s='WARN' OR stat
8360: 75 73 3d 27 57 41 49 56 45 44 27 29 29 0a 20 20  us='WAIVED')).  
8370: 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45             WHERE
8380: 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65   run_id=? AND te
8390: 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65  stname=? AND ite
83a0: 6d 5f 70 61 74 68 3d 27 27 3b 22 0a 09 20 72 75  m_path='';".. ru
83b0: 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 72  n-id test-name r
83c0: 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20  un-id test-name 
83d0: 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65  run-id test-name
83e0: 29 0a 20 20 20 20 20 20 20 20 28 74 68 72 65 61  ).        (threa
83f0: 64 2d 73 6c 65 65 70 21 20 30 2e 31 29 20 3b 3b  d-sleep! 0.1) ;;
8400: 20 67 69 76 65 20 6f 74 68 65 72 20 70 72 6f 63   give other proc
8410: 65 73 73 65 73 20 61 20 63 68 61 6e 63 65 20 68  esses a chance h
8420: 65 72 65 0a 09 28 69 66 20 28 65 71 75 61 6c 3f  ere..(if (equal?
8430: 20 73 74 61 74 75 73 20 22 52 55 4e 4e 49 4e 47   status "RUNNING
8440: 22 29 20 3b 3b 20 72 75 6e 6e 69 6e 67 20 74 61  ") ;; running ta
8450: 6b 65 73 20 70 72 69 6f 72 69 74 79 20 6f 76 65  kes priority ove
8460: 72 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74  r all other stat
8470: 65 73 2c 20 66 6f 72 63 65 20 74 68 65 20 74 65  es, force the te
8480: 73 74 20 73 74 61 74 65 20 74 6f 20 52 55 4e 4e  st state to RUNN
8490: 49 4e 47 0a 09 20 20 20 20 28 73 71 6c 69 74 65  ING..    (sqlite
84a0: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 55 50  3:execute db "UP
84b0: 44 41 54 45 20 74 65 73 74 73 20 53 45 54 20 73  DATE tests SET s
84c0: 74 61 74 65 3d 3f 20 57 48 45 52 45 20 72 75 6e  tate=? WHERE run
84d0: 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61  _id=? AND testna
84e0: 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61  me=? AND item_pa
84f0: 74 68 3d 27 27 3b 22 20 22 52 55 4e 4e 49 4e 47  th='';" "RUNNING
8500: 22 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61  " run-id test-na
8510: 6d 65 29 0a 09 20 20 20 20 28 73 71 6c 69 74 65  me)..    (sqlite
8520: 33 3a 65 78 65 63 75 74 65 0a 09 20 20 20 20 20  3:execute..     
8530: 64 62 0a 09 20 20 20 20 20 22 55 50 44 41 54 45  db..     "UPDATE
8540: 20 74 65 73 74 73 0a 20 20 20 20 20 20 20 20 20   tests.         
8550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 45                SE
8560: 54 20 73 74 61 74 65 3d 43 41 53 45 20 57 48 45  T state=CASE WHE
8570: 4e 20 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  N (SELECT count(
8580: 69 64 29 20 46 52 4f 4d 20 74 65 73 74 73 20 57  id) FROM tests W
8590: 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e  HERE run_id=? AN
85a0: 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44  D testname=? AND
85b0: 20 69 74 65 6d 5f 70 61 74 68 20 21 3d 20 27 27   item_path != ''
85c0: 20 41 4e 44 20 73 74 61 74 65 20 69 6e 20 28 27   AND state in ('
85d0: 52 55 4e 4e 49 4e 47 27 2c 27 4e 4f 54 5f 53 54  RUNNING','NOT_ST
85e0: 41 52 54 45 44 27 29 29 20 3e 20 30 20 54 48 45  ARTED')) > 0 THE
85f0: 4e 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  N .             
8600: 20 20 20 20 20 20 20 20 20 20 20 20 20 27 52 55               'RU
8610: 4e 4e 49 4e 47 27 0a 20 20 20 20 20 20 20 20 20  NNING'.         
8620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 4c                EL
8630: 53 45 20 27 43 4f 4d 50 4c 45 54 45 44 27 20 45  SE 'COMPLETED' E
8640: 4e 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ND,.            
8650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
8660: 61 74 75 73 3d 43 41 53 45 20 57 48 45 4e 20 66  atus=CASE WHEN f
8670: 61 69 6c 5f 63 6f 75 6e 74 20 3e 20 30 20 54 48  ail_count > 0 TH
8680: 45 4e 20 27 46 41 49 4c 27 20 57 48 45 4e 20 70  EN 'FAIL' WHEN p
8690: 61 73 73 5f 63 6f 75 6e 74 20 3e 20 30 20 41 4e  ass_count > 0 AN
86a0: 44 20 66 61 69 6c 5f 63 6f 75 6e 74 3d 30 20 54  D fail_count=0 T
86b0: 48 45 4e 20 27 50 41 53 53 27 20 45 4c 53 45 20  HEN 'PASS' ELSE 
86c0: 27 55 4e 4b 4e 4f 57 4e 27 20 45 4e 44 0a 20 20  'UNKNOWN' END.  
86d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86e0: 20 20 20 20 20 57 48 45 52 45 20 72 75 6e 5f 69       WHERE run_i
86f0: 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65  d=? AND testname
8700: 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68  =? AND item_path
8710: 3d 27 27 3b 22 0a 09 20 20 20 20 20 72 75 6e 2d  ='';"..     run-
8720: 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 72 75 6e  id test-name run
8730: 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 29 29 0a  -id test-name)).
8740: 09 23 66 29 0a 20 20 20 20 20 20 23 66 29 29 0a  .#f).      #f)).
8750: 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ..;;============
8760: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8770: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8780: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8790: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 54 65  ==========.;; Te
87a0: 73 74 73 20 6d 65 74 61 20 64 61 74 61 0a 3b 3b  sts meta data.;;
87b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
87c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
87d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
87e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
87f0: 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 72 65 61 64 20  ======..;; read 
8800: 74 68 65 20 72 65 63 6f 72 64 20 67 69 76 65 6e  the record given
8810: 20 61 20 74 65 73 74 6e 61 6d 65 0a 28 64 65 66   a testname.(def
8820: 69 6e 65 20 28 64 62 3a 74 65 73 74 6d 65 74 61  ine (db:testmeta
8830: 2d 67 65 74 2d 72 65 63 6f 72 64 20 64 62 20 74  -get-record db t
8840: 65 73 74 6e 61 6d 65 29 0a 20 20 28 6c 65 74 20  estname).  (let 
8850: 28 28 72 65 73 20 23 66 29 29 0a 20 20 20 20 28  ((res #f)).    (
8860: 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68  sqlite3:for-each
8870: 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 64  -row.     (lambd
8880: 61 20 28 69 64 20 74 65 73 74 6e 61 6d 65 20 61  a (id testname a
8890: 75 74 68 6f 72 20 6f 77 6e 65 72 20 64 65 73 63  uthor owner desc
88a0: 72 69 70 74 69 6f 6e 20 72 65 76 69 65 77 65 64  ription reviewed
88b0: 20 69 74 65 72 61 74 65 64 20 61 76 67 5f 72 75   iterated avg_ru
88c0: 6e 74 69 6d 65 20 61 76 67 5f 64 69 73 6b 20 74  ntime avg_disk t
88d0: 61 67 73 29 0a 20 20 20 20 20 20 20 28 73 65 74  ags).       (set
88e0: 21 20 72 65 73 20 28 76 65 63 74 6f 72 20 69 64  ! res (vector id
88f0: 20 74 65 73 74 6e 61 6d 65 20 61 75 74 68 6f 72   testname author
8900: 20 6f 77 6e 65 72 20 64 65 73 63 72 69 70 74 69   owner descripti
8910: 6f 6e 20 72 65 76 69 65 77 65 64 20 69 74 65 72  on reviewed iter
8920: 61 74 65 64 20 61 76 67 5f 72 75 6e 74 69 6d 65  ated avg_runtime
8930: 20 61 76 67 5f 64 69 73 6b 20 74 61 67 73 29 29   avg_disk tags))
8940: 29 0a 20 20 20 20 20 64 62 20 22 53 45 4c 45 43  ).     db "SELEC
8950: 54 20 69 64 2c 74 65 73 74 6e 61 6d 65 2c 61 75  T id,testname,au
8960: 74 68 6f 72 2c 6f 77 6e 65 72 2c 64 65 73 63 72  thor,owner,descr
8970: 69 70 74 69 6f 6e 2c 72 65 76 69 65 77 65 64 2c  iption,reviewed,
8980: 69 74 65 72 61 74 65 64 2c 61 76 67 5f 72 75 6e  iterated,avg_run
8990: 74 69 6d 65 2c 61 76 67 5f 64 69 73 6b 2c 74 61  time,avg_disk,ta
89a0: 67 73 20 46 52 4f 4d 20 74 65 73 74 5f 6d 65 74  gs FROM test_met
89b0: 61 20 57 48 45 52 45 20 74 65 73 74 6e 61 6d 65  a WHERE testname
89c0: 3d 3f 3b 22 0a 20 20 20 20 20 74 65 73 74 6e 61  =?;".     testna
89d0: 6d 65 29 0a 20 20 20 20 72 65 73 29 29 0a 0a 3b  me).    res))..;
89e0: 3b 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 72  ; create a new r
89f0: 65 63 6f 72 64 20 66 6f 72 20 61 20 67 69 76 65  ecord for a give
8a00: 6e 20 74 65 73 74 6e 61 6d 65 0a 28 64 65 66 69  n testname.(defi
8a10: 6e 65 20 28 64 62 3a 74 65 73 74 6d 65 74 61 2d  ne (db:testmeta-
8a20: 61 64 64 2d 72 65 63 6f 72 64 20 64 62 20 74 65  add-record db te
8a30: 73 74 6e 61 6d 65 29 0a 20 20 28 73 71 6c 69 74  stname).  (sqlit
8a40: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 49  e3:execute db "I
8a50: 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20  NSERT OR IGNORE 
8a60: 49 4e 54 4f 20 74 65 73 74 5f 6d 65 74 61 20 28  INTO test_meta (
8a70: 74 65 73 74 6e 61 6d 65 2c 61 75 74 68 6f 72 2c  testname,author,
8a80: 6f 77 6e 65 72 2c 64 65 73 63 72 69 70 74 69 6f  owner,descriptio
8a90: 6e 2c 72 65 76 69 65 77 65 64 2c 69 74 65 72 61  n,reviewed,itera
8aa0: 74 65 64 2c 61 76 67 5f 72 75 6e 74 69 6d 65 2c  ted,avg_runtime,
8ab0: 61 76 67 5f 64 69 73 6b 2c 74 61 67 73 29 20 56  avg_disk,tags) V
8ac0: 41 4c 55 45 53 20 28 3f 2c 27 27 2c 27 27 2c 27  ALUES (?,'','','
8ad0: 27 2c 27 27 2c 27 27 2c 27 27 2c 27 27 2c 27 27  ','','','','',''
8ae0: 29 3b 22 20 74 65 73 74 6e 61 6d 65 29 29 0a 0a  );" testname))..
8af0: 3b 3b 20 75 70 64 61 74 65 20 6f 6e 65 20 6f 66  ;; update one of
8b00: 20 74 68 65 20 74 65 73 74 6d 65 74 61 20 66 69   the testmeta fi
8b10: 65 6c 64 73 0a 28 64 65 66 69 6e 65 20 28 64 62  elds.(define (db
8b20: 3a 74 65 73 74 6d 65 74 61 2d 75 70 64 61 74 65  :testmeta-update
8b30: 2d 66 69 65 6c 64 20 64 62 20 74 65 73 74 6e 61  -field db testna
8b40: 6d 65 20 66 69 65 6c 64 20 76 61 6c 75 65 29 0a  me field value).
8b50: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
8b60: 74 65 20 64 62 20 28 63 6f 6e 63 20 22 55 50 44  te db (conc "UPD
8b70: 41 54 45 20 74 65 73 74 5f 6d 65 74 61 20 53 45  ATE test_meta SE
8b80: 54 20 22 20 66 69 65 6c 64 20 22 3d 3f 20 57 48  T " field "=? WH
8b90: 45 52 45 20 74 65 73 74 6e 61 6d 65 3d 3f 3b 22  ERE testname=?;"
8ba0: 29 20 76 61 6c 75 65 20 74 65 73 74 6e 61 6d 65  ) value testname
8bb0: 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ))..;;==========
8bc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8bd0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8be0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8bf0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20  ============.;; 
8c00: 54 20 45 20 53 20 54 20 20 20 44 20 41 20 54 20  T E S T   D A T 
8c10: 41 20 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  A .;;===========
8c20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8c30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8c40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8c50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65  ===========..(de
8c60: 66 69 6e 65 20 28 64 62 3a 63 73 76 2d 3e 74 65  fine (db:csv->te
8c70: 73 74 2d 64 61 74 61 20 64 62 20 74 65 73 74 2d  st-data db test-
8c80: 69 64 20 63 73 76 64 61 74 61 29 0a 20 20 28 64  id csvdata).  (d
8c90: 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22 74 65  ebug:print 4 "te
8ca0: 73 74 2d 69 64 20 22 20 74 65 73 74 2d 69 64 20  st-id " test-id 
8cb0: 22 2c 20 63 73 76 64 61 74 61 3a 20 22 20 63 73  ", csvdata: " cs
8cc0: 76 64 61 74 61 29 0a 20 20 28 6c 65 74 20 28 28  vdata).  (let ((
8cd0: 63 73 76 6c 69 73 74 20 28 63 73 76 2d 3e 6c 69  csvlist (csv->li
8ce0: 73 74 20 28 6d 61 6b 65 2d 63 73 76 2d 72 65 61  st (make-csv-rea
8cf0: 64 65 72 0a 09 09 09 20 20 20 20 20 28 6f 70 65  der....     (ope
8d00: 6e 2d 69 6e 70 75 74 2d 73 74 72 69 6e 67 20 63  n-input-string c
8d10: 73 76 64 61 74 61 29 0a 09 09 09 20 20 20 20 20  svdata)....     
8d20: 27 28 28 73 74 72 69 70 2d 6c 65 61 64 69 6e 67  '((strip-leading
8d30: 2d 77 68 69 74 65 73 70 61 63 65 3f 20 23 74 29  -whitespace? #t)
8d40: 0a 09 09 09 20 20 20 20 20 20 20 28 73 74 72 69  ....       (stri
8d50: 70 2d 74 72 61 69 6c 69 6e 67 2d 77 68 69 74 65  p-trailing-white
8d60: 73 70 61 63 65 3f 20 23 74 29 29 20 29 29 29 29  space? #t)) ))))
8d70: 20 3b 3b 20 28 63 73 76 2d 3e 6c 69 73 74 20 63   ;; (csv->list c
8d80: 73 76 64 61 74 61 29 29 29 0a 20 20 20 20 28 66  svdata))).    (f
8d90: 6f 72 2d 65 61 63 68 20 0a 20 20 20 20 20 28 6c  or-each .     (l
8da0: 61 6d 62 64 61 20 28 63 73 76 72 6f 77 29 0a 20  ambda (csvrow). 
8db0: 20 20 20 20 20 20 28 6c 65 74 2a 20 28 28 70 61        (let* ((pa
8dc0: 64 64 65 64 2d 72 6f 77 20 20 28 74 61 6b 65 20  dded-row  (take 
8dd0: 28 61 70 70 65 6e 64 20 63 73 76 72 6f 77 20 28  (append csvrow (
8de0: 6c 69 73 74 20 23 66 20 23 66 20 23 66 20 23 66  list #f #f #f #f
8df0: 20 23 66 20 23 66 20 23 66 20 23 66 20 23 66 29   #f #f #f #f #f)
8e00: 29 20 39 29 29 0a 09 20 20 20 20 20 20 28 63 61  ) 9))..      (ca
8e10: 74 65 67 6f 72 79 20 20 20 20 28 6c 69 73 74 2d  tegory    (list-
8e20: 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20 30  ref padded-row 0
8e30: 29 29 0a 09 20 20 20 20 20 20 28 76 61 72 69 61  ))..      (varia
8e40: 62 6c 65 20 20 20 20 28 6c 69 73 74 2d 72 65 66  ble    (list-ref
8e50: 20 70 61 64 64 65 64 2d 72 6f 77 20 31 29 29 0a   padded-row 1)).
8e60: 09 20 20 20 20 20 20 28 76 61 6c 75 65 20 20 20  .      (value   
8e70: 20 20 20 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72      (any->number
8e80: 2d 69 66 2d 70 6f 73 73 69 62 6c 65 20 28 6c 69  -if-possible (li
8e90: 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f  st-ref padded-ro
8ea0: 77 20 32 29 29 29 0a 09 20 20 20 20 20 20 28 65  w 2)))..      (e
8eb0: 78 70 65 63 74 65 64 20 20 20 20 28 61 6e 79 2d  xpected    (any-
8ec0: 3e 6e 75 6d 62 65 72 2d 69 66 2d 70 6f 73 73 69  >number-if-possi
8ed0: 62 6c 65 20 28 6c 69 73 74 2d 72 65 66 20 70 61  ble (list-ref pa
8ee0: 64 64 65 64 2d 72 6f 77 20 33 29 29 29 0a 09 20  dded-row 3))).. 
8ef0: 20 20 20 20 20 28 74 6f 6c 20 20 20 20 20 20 20       (tol       
8f00: 20 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 2d 69    (any->number-i
8f10: 66 2d 70 6f 73 73 69 62 6c 65 20 28 6c 69 73 74  f-possible (list
8f20: 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20  -ref padded-row 
8f30: 34 29 29 29 20 3b 3b 20 3e 2c 20 3c 2c 20 3e 3d  4))) ;; >, <, >=
8f40: 2c 20 3c 3d 2c 20 6f 72 20 61 20 6e 75 6d 62 65  , <=, or a numbe
8f50: 72 0a 09 20 20 20 20 20 20 28 75 6e 69 74 73 20  r..      (units 
8f60: 20 20 20 20 20 20 28 6c 69 73 74 2d 72 65 66 20        (list-ref 
8f70: 70 61 64 64 65 64 2d 72 6f 77 20 35 29 29 0a 09  padded-row 5))..
8f80: 20 20 20 20 20 20 28 63 6f 6d 6d 65 6e 74 20 20        (comment  
8f90: 20 20 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64     (list-ref pad
8fa0: 64 65 64 2d 72 6f 77 20 36 29 29 0a 09 20 20 20  ded-row 6))..   
8fb0: 20 20 20 28 73 74 61 74 75 73 20 20 20 20 20 20     (status      
8fc0: 28 6c 65 74 20 28 28 73 20 28 6c 69 73 74 2d 72  (let ((s (list-r
8fd0: 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20 37 29  ef padded-row 7)
8fe0: 29 29 0a 09 09 09 20 20 20 20 20 28 69 66 20 28  ))....     (if (
8ff0: 61 6e 64 20 28 73 74 72 69 6e 67 3f 20 73 29 28  and (string? s)(
9000: 6f 72 20 28 73 74 72 69 6e 67 2d 6d 61 74 63 68  or (string-match
9010: 20 28 72 65 67 65 78 70 20 22 5e 5c 5c 73 2a 24   (regexp "^\\s*$
9020: 22 29 20 73 29 0a 09 09 09 09 09 09 20 20 20 20  ") s).......    
9030: 20 28 73 74 72 69 6e 67 2d 6d 61 74 63 68 20 28   (string-match (
9040: 72 65 67 65 78 70 20 22 5e 6e 2f 61 24 22 29 20  regexp "^n/a$") 
9050: 73 29 29 29 0a 09 09 09 09 20 23 66 0a 09 09 09  s)))..... #f....
9060: 09 20 73 29 29 29 20 3b 3b 20 69 66 20 73 70 65  . s))) ;; if spe
9070: 63 69 66 69 65 64 20 6f 6e 20 74 68 65 20 69 6e  cified on the in
9080: 70 75 74 20 74 68 65 6e 20 75 73 65 2c 20 65 6c  put then use, el
9090: 73 65 20 63 61 6c 63 75 6c 61 74 65 0a 09 20 20  se calculate..  
90a0: 20 20 20 20 28 74 79 70 65 20 20 20 20 20 20 20      (type       
90b0: 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65   (list-ref padde
90c0: 64 2d 72 6f 77 20 38 29 29 29 0a 09 20 3b 3b 20  d-row 8))).. ;; 
90d0: 6c 6f 6f 6b 20 75 70 20 65 78 70 65 63 74 65 64  look up expected
90e0: 2c 74 6f 6c 2c 75 6e 69 74 73 20 66 72 6f 6d 20  ,tol,units from 
90f0: 70 72 65 76 69 6f 75 73 20 62 65 73 74 20 66 69  previous best fi
9100: 74 20 74 65 73 74 20 69 66 20 74 68 65 79 20 61  t test if they a
9110: 72 65 20 61 6c 6c 20 65 69 74 68 65 72 20 23 66  re all either #f
9120: 20 6f 72 20 27 27 0a 09 20 28 64 65 62 75 67 3a   or ''.. (debug:
9130: 70 72 69 6e 74 20 34 20 22 42 45 46 4f 52 45 3a  print 4 "BEFORE:
9140: 20 63 61 74 65 67 6f 72 79 3a 20 22 20 63 61 74   category: " cat
9150: 65 67 6f 72 79 20 22 20 76 61 72 69 61 62 6c 65  egory " variable
9160: 3a 20 22 20 76 61 72 69 61 62 6c 65 20 22 20 76  : " variable " v
9170: 61 6c 75 65 3a 20 22 20 76 61 6c 75 65 20 0a 09  alue: " value ..
9180: 09 20 20 20 20 20 20 22 2c 20 65 78 70 65 63 74  .      ", expect
9190: 65 64 3a 20 22 20 65 78 70 65 63 74 65 64 20 22  ed: " expected "
91a0: 20 74 6f 6c 3a 20 22 20 74 6f 6c 20 22 20 75 6e   tol: " tol " un
91b0: 69 74 73 3a 20 22 20 75 6e 69 74 73 20 22 20 73  its: " units " s
91c0: 74 61 74 75 73 3a 20 22 20 73 74 61 74 75 73 20  tatus: " status 
91d0: 22 20 63 6f 6d 6d 65 6e 74 3a 20 22 20 63 6f 6d  " comment: " com
91e0: 6d 65 6e 74 20 22 20 74 79 70 65 3a 20 22 20 74  ment " type: " t
91f0: 79 70 65 29 0a 0a 09 20 28 69 66 20 28 61 6e 64  ype)... (if (and
9200: 20 28 6f 72 20 28 6e 6f 74 20 65 78 70 65 63 74   (or (not expect
9210: 65 64 29 28 65 71 75 61 6c 3f 20 65 78 70 65 63  ed)(equal? expec
9220: 74 65 64 20 22 22 29 29 0a 09 09 20 20 28 6f 72  ted ""))...  (or
9230: 20 28 6e 6f 74 20 74 6f 6c 29 20 20 20 20 20 28   (not tol)     (
9240: 65 71 75 61 6c 3f 20 65 78 70 65 63 74 65 64 20  equal? expected 
9250: 22 22 29 29 0a 09 09 20 20 28 6f 72 20 28 6e 6f  ""))...  (or (no
9260: 74 20 75 6e 69 74 73 29 20 20 20 28 65 71 75 61  t units)   (equa
9270: 6c 3f 20 65 78 70 65 63 74 65 64 20 22 22 29 29  l? expected ""))
9280: 29 0a 09 20 20 20 20 20 28 6c 65 74 2d 76 61 6c  )..     (let-val
9290: 75 65 73 20 28 28 28 6e 65 77 2d 65 78 70 65 63  ues (((new-expec
92a0: 74 65 64 20 6e 65 77 2d 74 6f 6c 20 6e 65 77 2d  ted new-tol new-
92b0: 75 6e 69 74 73 29 28 64 62 3a 67 65 74 2d 70 72  units)(db:get-pr
92c0: 65 76 2d 74 6f 6c 2d 66 6f 72 2d 74 65 73 74 20  ev-tol-for-test 
92d0: 64 62 20 74 65 73 74 2d 69 64 20 63 61 74 65 67  db test-id categ
92e0: 6f 72 79 20 76 61 72 69 61 62 6c 65 29 29 29 0a  ory variable))).
92f0: 09 09 09 20 28 73 65 74 21 20 65 78 70 65 63 74  ... (set! expect
9300: 65 64 20 6e 65 77 2d 65 78 70 65 63 74 65 64 29  ed new-expected)
9310: 0a 09 09 09 20 28 73 65 74 21 20 74 6f 6c 20 20  .... (set! tol  
9320: 20 20 20 20 6e 65 77 2d 74 6f 6c 29 0a 09 09 09      new-tol)....
9330: 20 28 73 65 74 21 20 75 6e 69 74 73 20 20 20 20   (set! units    
9340: 6e 65 77 2d 75 6e 69 74 73 29 29 29 0a 0a 09 20  new-units)))... 
9350: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22  (debug:print 4 "
9360: 41 46 54 45 52 3a 20 20 63 61 74 65 67 6f 72 79  AFTER:  category
9370: 3a 20 22 20 63 61 74 65 67 6f 72 79 20 22 20 76  : " category " v
9380: 61 72 69 61 62 6c 65 3a 20 22 20 76 61 72 69 61  ariable: " varia
9390: 62 6c 65 20 22 20 76 61 6c 75 65 3a 20 22 20 76  ble " value: " v
93a0: 61 6c 75 65 20 0a 09 09 20 20 20 20 20 20 22 2c  alue ...      ",
93b0: 20 65 78 70 65 63 74 65 64 3a 20 22 20 65 78 70   expected: " exp
93c0: 65 63 74 65 64 20 22 20 74 6f 6c 3a 20 22 20 74  ected " tol: " t
93d0: 6f 6c 20 22 20 75 6e 69 74 73 3a 20 22 20 75 6e  ol " units: " un
93e0: 69 74 73 20 22 20 73 74 61 74 75 73 3a 20 22 20  its " status: " 
93f0: 73 74 61 74 75 73 20 22 20 63 6f 6d 6d 65 6e 74  status " comment
9400: 3a 20 22 20 63 6f 6d 6d 65 6e 74 29 0a 09 20 3b  : " comment).. ;
9410: 3b 20 63 61 6c 63 75 6c 61 74 65 20 73 74 61 74  ; calculate stat
9420: 75 73 20 69 66 20 4e 4f 54 20 73 70 65 63 69 66  us if NOT specif
9430: 69 65 64 0a 09 20 28 69 66 20 28 61 6e 64 20 28  ied.. (if (and (
9440: 6e 6f 74 20 73 74 61 74 75 73 29 28 6e 75 6d 62  not status)(numb
9450: 65 72 3f 20 65 78 70 65 63 74 65 64 29 28 6e 75  er? expected)(nu
9460: 6d 62 65 72 3f 20 76 61 6c 75 65 29 29 20 3b 3b  mber? value)) ;;
9470: 20 6e 65 65 64 20 65 78 70 65 63 74 65 64 20 61   need expected a
9480: 6e 64 20 76 61 6c 75 65 20 74 6f 20 62 65 20 6e  nd value to be n
9490: 75 6d 62 65 72 73 0a 09 20 20 20 20 20 28 69 66  umbers..     (if
94a0: 20 28 6e 75 6d 62 65 72 3f 20 74 6f 6c 29 20 3b   (number? tol) ;
94b0: 3b 20 69 66 20 74 6f 6c 20 69 73 20 61 20 6e 75  ; if tol is a nu
94c0: 6d 62 65 72 20 74 68 65 6e 20 77 65 20 64 6f 20  mber then we do 
94d0: 74 68 65 20 73 74 61 6e 64 61 72 64 20 63 6f 6d  the standard com
94e0: 70 61 72 69 73 6f 6e 0a 09 09 20 28 6c 65 74 2a  parison... (let*
94f0: 20 28 28 6d 61 78 2d 76 61 6c 20 28 2b 20 65 78   ((max-val (+ ex
9500: 70 65 63 74 65 64 20 74 6f 6c 29 29 0a 09 09 09  pected tol))....
9510: 28 6d 69 6e 2d 76 61 6c 20 28 2d 20 65 78 70 65  (min-val (- expe
9520: 63 74 65 64 20 74 6f 6c 29 29 0a 09 09 09 28 72  cted tol))....(r
9530: 65 73 75 6c 74 20 20 28 61 6e 64 20 28 3e 3d 20  esult  (and (>= 
9540: 20 76 61 6c 75 65 20 6d 69 6e 2d 76 61 6c 29 28   value min-val)(
9550: 3c 3d 20 76 61 6c 75 65 20 6d 61 78 2d 76 61 6c  <= value max-val
9560: 29 29 29 29 0a 09 09 20 20 20 28 64 65 62 75 67  ))))...   (debug
9570: 3a 70 72 69 6e 74 20 34 20 22 6d 61 78 2d 76 61  :print 4 "max-va
9580: 6c 3a 20 22 20 6d 61 78 2d 76 61 6c 20 22 20 6d  l: " max-val " m
9590: 69 6e 2d 76 61 6c 3a 20 22 20 6d 69 6e 2d 76 61  in-val: " min-va
95a0: 6c 20 22 20 72 65 73 75 6c 74 3a 20 22 20 72 65  l " result: " re
95b0: 73 75 6c 74 29 0a 09 09 20 20 20 28 73 65 74 21  sult)...   (set!
95c0: 20 73 74 61 74 75 73 20 28 69 66 20 72 65 73 75   status (if resu
95d0: 6c 74 20 22 70 61 73 73 22 20 22 66 61 69 6c 22  lt "pass" "fail"
95e0: 29 29 29 0a 09 09 20 28 73 65 74 21 20 73 74 61  )))... (set! sta
95f0: 74 75 73 20 3b 3b 20 4e 42 2f 2f 20 6e 65 65 64  tus ;; NB// need
9600: 20 74 6f 20 61 73 73 65 73 73 20 65 61 63 68 20   to assess each 
9610: 6f 6e 65 20 28 69 2e 65 2e 20 6e 6f 74 20 72 65  one (i.e. not re
9620: 74 75 72 6e 20 6f 70 65 72 61 74 6f 72 20 73 69  turn operator si
9630: 6e 63 65 20 6e 65 65 64 20 74 6f 20 61 63 74 20  nce need to act 
9640: 69 66 20 6e 6f 74 20 76 61 6c 69 64 20 6f 70 2e  if not valid op.
9650: 0a 09 09 20 20 20 20 20 20 20 28 63 61 73 65 20  ...       (case 
9660: 28 73 74 72 69 6e 67 2d 3e 73 79 6d 62 6f 6c 20  (string->symbol 
9670: 74 6f 6c 29 20 3b 3b 20 74 6f 6c 20 73 68 6f 75  tol) ;; tol shou
9680: 6c 64 20 62 65 20 3e 2c 20 3c 2c 20 3e 3d 2c 20  ld be >, <, >=, 
9690: 3c 3d 0a 09 09 09 20 28 28 3e 29 20 20 28 69 66  <=.... ((>)  (if
96a0: 20 28 3e 20 20 76 61 6c 75 65 20 65 78 70 65 63   (>  value expec
96b0: 74 65 64 29 20 22 70 61 73 73 22 20 22 66 61 69  ted) "pass" "fai
96c0: 6c 22 29 29 0a 09 09 09 20 28 28 3c 29 20 20 28  l")).... ((<)  (
96d0: 69 66 20 28 3c 20 20 76 61 6c 75 65 20 65 78 70  if (<  value exp
96e0: 65 63 74 65 64 29 20 22 70 61 73 73 22 20 22 66  ected) "pass" "f
96f0: 61 69 6c 22 29 29 0a 09 09 09 20 28 28 3e 3d 29  ail")).... ((>=)
9700: 20 28 69 66 20 28 3e 3d 20 76 61 6c 75 65 20 65   (if (>= value e
9710: 78 70 65 63 74 65 64 29 20 22 70 61 73 73 22 20  xpected) "pass" 
9720: 22 66 61 69 6c 22 29 29 0a 09 09 09 20 28 28 3c  "fail")).... ((<
9730: 3d 29 20 28 69 66 20 28 3c 3d 20 76 61 6c 75 65  =) (if (<= value
9740: 20 65 78 70 65 63 74 65 64 29 20 22 70 61 73 73   expected) "pass
9750: 22 20 22 66 61 69 6c 22 29 29 0a 09 09 09 20 28  " "fail")).... (
9760: 65 6c 73 65 20 28 63 6f 6e 63 20 22 45 52 52 4f  else (conc "ERRO
9770: 52 3a 20 62 61 64 20 74 6f 6c 20 63 6f 6d 70 61  R: bad tol compa
9780: 72 61 74 6f 72 20 22 20 74 6f 6c 29 29 29 29 29  rator " tol)))))
9790: 29 0a 09 20 28 64 65 62 75 67 3a 70 72 69 6e 74  ).. (debug:print
97a0: 20 34 20 22 41 46 54 45 52 32 3a 20 63 61 74 65   4 "AFTER2: cate
97b0: 67 6f 72 79 3a 20 22 20 63 61 74 65 67 6f 72 79  gory: " category
97c0: 20 22 20 76 61 72 69 61 62 6c 65 3a 20 22 20 76   " variable: " v
97d0: 61 72 69 61 62 6c 65 20 22 20 76 61 6c 75 65 3a  ariable " value:
97e0: 20 22 20 76 61 6c 75 65 20 0a 09 09 20 20 20 20   " value ...    
97f0: 20 20 22 2c 20 65 78 70 65 63 74 65 64 3a 20 22    ", expected: "
9800: 20 65 78 70 65 63 74 65 64 20 22 20 74 6f 6c 3a   expected " tol:
9810: 20 22 20 74 6f 6c 20 22 20 75 6e 69 74 73 3a 20   " tol " units: 
9820: 22 20 75 6e 69 74 73 20 22 20 73 74 61 74 75 73  " units " status
9830: 3a 20 22 20 73 74 61 74 75 73 20 22 20 63 6f 6d  : " status " com
9840: 6d 65 6e 74 3a 20 22 20 63 6f 6d 6d 65 6e 74 29  ment: " comment)
9850: 0a 09 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63  .. (sqlite3:exec
9860: 75 74 65 20 64 62 20 22 49 4e 53 45 52 54 20 4f  ute db "INSERT O
9870: 52 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 74  R REPLACE INTO t
9880: 65 73 74 5f 64 61 74 61 20 28 74 65 73 74 5f 69  est_data (test_i
9890: 64 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 69 61  d,category,varia
98a0: 62 6c 65 2c 76 61 6c 75 65 2c 65 78 70 65 63 74  ble,value,expect
98b0: 65 64 2c 74 6f 6c 2c 75 6e 69 74 73 2c 63 6f 6d  ed,tol,units,com
98c0: 6d 65 6e 74 2c 73 74 61 74 75 73 2c 74 79 70 65  ment,status,type
98d0: 29 20 56 41 4c 55 45 53 20 28 3f 2c 3f 2c 3f 2c  ) VALUES (?,?,?,
98e0: 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 29 3b 22  ?,?,?,?,?,?,?);"
98f0: 0a 09 09 09 20 20 74 65 73 74 2d 69 64 20 63 61  ....  test-id ca
9900: 74 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65 20  tegory variable 
9910: 76 61 6c 75 65 20 65 78 70 65 63 74 65 64 20 74  value expected t
9920: 6f 6c 20 75 6e 69 74 73 20 28 69 66 20 63 6f 6d  ol units (if com
9930: 6d 65 6e 74 20 63 6f 6d 6d 65 6e 74 20 22 22 29  ment comment "")
9940: 20 73 74 61 74 75 73 20 74 79 70 65 29 29 29 0a   status type))).
9950: 20 20 20 20 20 63 73 76 6c 69 73 74 29 29 29 0a       csvlist))).
9960: 0a 3b 3b 20 67 65 74 20 61 20 6c 69 73 74 20 6f  .;; get a list o
9970: 66 20 74 65 73 74 5f 64 61 74 61 20 72 65 63 6f  f test_data reco
9980: 72 64 73 20 6d 61 74 63 68 69 6e 67 20 63 61 74  rds matching cat
9990: 65 67 6f 72 79 70 61 74 74 0a 28 64 65 66 69 6e  egorypatt.(defin
99a0: 65 20 28 64 62 3a 72 65 61 64 2d 74 65 73 74 2d  e (db:read-test-
99b0: 64 61 74 61 20 64 62 20 74 65 73 74 2d 69 64 20  data db test-id 
99c0: 63 61 74 65 67 6f 72 79 70 61 74 74 29 0a 20 20  categorypatt).  
99d0: 28 6c 65 74 20 28 28 72 65 73 20 27 28 29 29 29  (let ((res '()))
99e0: 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f  .    (sqlite3:fo
99f0: 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20 20 20  r-each-row .    
9a00: 20 28 6c 61 6d 62 64 61 20 28 69 64 20 74 65 73   (lambda (id tes
9a10: 74 5f 69 64 20 63 61 74 65 67 6f 72 79 20 76 61  t_id category va
9a20: 72 69 61 62 6c 65 20 76 61 6c 75 65 20 65 78 70  riable value exp
9a30: 65 63 74 65 64 20 74 6f 6c 20 75 6e 69 74 73 20  ected tol units 
9a40: 63 6f 6d 6d 65 6e 74 20 73 74 61 74 75 73 20 74  comment status t
9a50: 79 70 65 29 0a 20 20 20 20 20 20 20 28 73 65 74  ype).       (set
9a60: 21 20 72 65 73 20 28 63 6f 6e 73 20 28 76 65 63  ! res (cons (vec
9a70: 74 6f 72 20 69 64 20 74 65 73 74 5f 69 64 20 63  tor id test_id c
9a80: 61 74 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65  ategory variable
9a90: 20 76 61 6c 75 65 20 65 78 70 65 63 74 65 64 20   value expected 
9aa0: 74 6f 6c 20 75 6e 69 74 73 20 63 6f 6d 6d 65 6e  tol units commen
9ab0: 74 20 73 74 61 74 75 73 20 74 79 70 65 29 20 72  t status type) r
9ac0: 65 73 29 29 29 0a 20 20 20 20 20 64 62 0a 20 20  es))).     db.  
9ad0: 20 20 20 22 53 45 4c 45 43 54 20 69 64 2c 74 65     "SELECT id,te
9ae0: 73 74 5f 69 64 2c 63 61 74 65 67 6f 72 79 2c 76  st_id,category,v
9af0: 61 72 69 61 62 6c 65 2c 76 61 6c 75 65 2c 65 78  ariable,value,ex
9b00: 70 65 63 74 65 64 2c 74 6f 6c 2c 75 6e 69 74 73  pected,tol,units
9b10: 2c 63 6f 6d 6d 65 6e 74 2c 73 74 61 74 75 73 2c  ,comment,status,
9b20: 74 79 70 65 20 46 52 4f 4d 20 74 65 73 74 5f 64  type FROM test_d
9b30: 61 74 61 20 57 48 45 52 45 20 74 65 73 74 5f 69  ata WHERE test_i
9b40: 64 3d 3f 20 41 4e 44 20 63 61 74 65 67 6f 72 79  d=? AND category
9b50: 20 4c 49 4b 45 20 3f 20 4f 52 44 45 52 20 42 59   LIKE ? ORDER BY
9b60: 20 63 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62   category,variab
9b70: 6c 65 3b 22 20 74 65 73 74 2d 69 64 20 63 61 74  le;" test-id cat
9b80: 65 67 6f 72 79 70 61 74 74 29 0a 20 20 20 20 28  egorypatt).    (
9b90: 72 65 76 65 72 73 65 20 72 65 73 29 29 29 0a 0a  reverse res)))..
9ba0: 28 64 65 66 69 6e 65 20 28 64 62 3a 6c 6f 61 64  (define (db:load
9bb0: 2d 74 65 73 74 2d 64 61 74 61 20 64 62 20 74 65  -test-data db te
9bc0: 73 74 2d 69 64 29 0a 20 20 28 6c 65 74 20 6c 6f  st-id).  (let lo
9bd0: 6f 70 20 28 28 6c 69 6e 20 28 72 65 61 64 2d 6c  op ((lin (read-l
9be0: 69 6e 65 29 29 29 0a 20 20 20 20 28 69 66 20 28  ine))).    (if (
9bf0: 6e 6f 74 20 28 65 6f 66 2d 6f 62 6a 65 63 74 3f  not (eof-object?
9c00: 20 6c 69 6e 29 29 0a 09 28 62 65 67 69 6e 0a 09   lin))..(begin..
9c10: 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34    (debug:print 4
9c20: 20 6c 69 6e 29 0a 09 20 20 28 72 64 62 3a 63 73   lin)..  (rdb:cs
9c30: 76 2d 3e 74 65 73 74 2d 64 61 74 61 20 64 62 20  v->test-data db 
9c40: 74 65 73 74 2d 69 64 20 6c 69 6e 29 0a 09 20 20  test-id lin)..  
9c50: 28 6c 6f 6f 70 20 28 72 65 61 64 2d 6c 69 6e 65  (loop (read-line
9c60: 29 29 29 29 29 0a 20 20 3b 3b 20 72 6f 6c 6c 20  ))))).  ;; roll 
9c70: 75 70 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  up the current r
9c80: 65 73 75 6c 74 73 2e 0a 20 20 3b 3b 20 46 49 58  esults..  ;; FIX
9c90: 4d 45 3a 20 41 64 64 20 74 68 65 20 73 74 61 74  ME: Add the stat
9ca0: 75 73 20 74 6f 20 0a 20 20 28 72 64 62 3a 74 65  us to .  (rdb:te
9cb0: 73 74 2d 64 61 74 61 2d 72 6f 6c 6c 75 70 20 64  st-data-rollup d
9cc0: 62 20 74 65 73 74 2d 69 64 20 23 66 29 29 0a 0a  b test-id #f))..
9cd0: 3b 3b 20 57 41 52 4e 49 4e 47 3a 20 44 6f 20 4e  ;; WARNING: Do N
9ce0: 4f 54 20 63 61 6c 6c 20 74 68 69 73 20 66 6f 72  OT call this for
9cf0: 20 74 68 65 20 70 61 72 65 6e 74 20 74 65 73 74   the parent test
9d00: 20 6f 6e 20 61 6e 20 69 74 65 72 61 74 65 64 20   on an iterated 
9d10: 74 65 73 74 0a 3b 3b 20 52 6f 6c 6c 20 75 70 20  test.;; Roll up 
9d20: 74 65 73 74 5f 64 61 74 61 20 70 61 73 73 2f 66  test_data pass/f
9d30: 61 69 6c 20 72 65 73 75 6c 74 73 0a 3b 3b 20 6c  ail results.;; l
9d40: 6f 6f 6b 20 61 74 20 74 68 65 20 74 65 73 74 5f  ook at the test_
9d50: 64 61 74 61 20 73 74 61 74 75 73 20 66 69 65 6c  data status fiel
9d60: 64 2c 20 0a 3b 3b 20 20 20 20 69 66 20 61 6c 6c  d, .;;    if all
9d70: 20 61 72 65 20 70 61 73 73 20 28 61 6e 79 20 63   are pass (any c
9d80: 61 73 65 29 20 61 6e 64 20 74 68 65 20 74 65 73  ase) and the tes
9d90: 74 20 73 74 61 74 75 73 20 69 73 20 50 41 53 53  t status is PASS
9da0: 20 6f 72 20 4e 55 4c 4c 20 6f 72 20 27 27 20 74   or NULL or '' t
9db0: 68 65 6e 20 73 65 74 20 74 65 73 74 20 73 74 61  hen set test sta
9dc0: 74 75 73 20 74 6f 20 50 41 53 53 2e 0a 3b 3b 20  tus to PASS..;; 
9dd0: 20 20 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72     if one or mor
9de0: 65 20 61 72 65 20 66 61 69 6c 20 28 61 6e 79 20  e are fail (any 
9df0: 63 61 73 65 29 20 74 68 65 6e 20 73 65 74 20 74  case) then set t
9e00: 65 73 74 20 73 74 61 74 75 73 20 74 6f 20 50 41  est status to PA
9e10: 53 53 2c 20 6e 6f 6e 20 22 70 61 73 73 22 20 6f  SS, non "pass" o
9e20: 72 20 22 66 61 69 6c 22 20 61 72 65 20 69 67 6e  r "fail" are ign
9e30: 6f 72 65 64 0a 28 64 65 66 69 6e 65 20 28 64 62  ored.(define (db
9e40: 3a 74 65 73 74 2d 64 61 74 61 2d 72 6f 6c 6c 75  :test-data-rollu
9e50: 70 20 64 62 20 74 65 73 74 2d 69 64 20 73 74 61  p db test-id sta
9e60: 74 75 73 29 0a 20 20 28 73 71 6c 69 74 65 33 3a  tus).  (sqlite3:
9e70: 65 78 65 63 75 74 65 20 0a 20 20 20 64 62 20 0a  execute .   db .
9e80: 20 20 20 22 55 50 44 41 54 45 20 74 65 73 74 73     "UPDATE tests
9e90: 20 0a 20 20 20 20 20 20 53 45 54 20 66 61 69 6c   .      SET fail
9ea0: 5f 63 6f 75 6e 74 3d 28 53 45 4c 45 43 54 20 63  _count=(SELECT c
9eb0: 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 74 65  ount(id) FROM te
9ec0: 73 74 5f 64 61 74 61 20 57 48 45 52 45 20 74 65  st_data WHERE te
9ed0: 73 74 5f 69 64 3d 3f 20 41 4e 44 20 73 74 61 74  st_id=? AND stat
9ee0: 75 73 20 6c 69 6b 65 20 27 66 61 69 6c 27 29 2c  us like 'fail'),
9ef0: 0a 20 20 20 20 20 20 20 20 20 20 70 61 73 73 5f  .          pass_
9f00: 63 6f 75 6e 74 3d 28 53 45 4c 45 43 54 20 63 6f  count=(SELECT co
9f10: 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 74 65 73  unt(id) FROM tes
9f20: 74 5f 64 61 74 61 20 57 48 45 52 45 20 74 65 73  t_data WHERE tes
9f30: 74 5f 69 64 3d 3f 20 41 4e 44 20 73 74 61 74 75  t_id=? AND statu
9f40: 73 20 6c 69 6b 65 20 27 70 61 73 73 27 29 0a 20  s like 'pass'). 
9f50: 20 20 20 20 20 57 48 45 52 45 20 69 64 3d 3f 3b       WHERE id=?;
9f60: 22 0a 20 20 20 74 65 73 74 2d 69 64 20 74 65 73  ".   test-id tes
9f70: 74 2d 69 64 20 74 65 73 74 2d 69 64 29 0a 20 20  t-id test-id).  
9f80: 3b 3b 20 69 66 20 74 68 65 20 74 65 73 74 20 69  ;; if the test i
9f90: 73 20 6e 6f 74 20 46 41 49 4c 20 74 68 65 6e 20  s not FAIL then 
9fa0: 73 65 74 20 73 74 61 74 75 73 20 62 61 73 65 64  set status based
9fb0: 20 6f 6e 20 74 68 65 20 66 61 69 6c 20 61 6e 64   on the fail and
9fc0: 20 70 61 73 73 20 63 6f 75 6e 74 73 2e 0a 20 20   pass counts..  
9fd0: 28 74 68 72 65 61 64 2d 73 6c 65 65 70 21 20 31  (thread-sleep! 1
9fe0: 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65  ).  (sqlite3:exe
9ff0: 63 75 74 65 0a 20 20 20 64 62 20 20 20 3b 3b 3b  cute.   db   ;;;
a000: 20 4e 4f 54 45 3a 20 53 68 6f 75 6c 64 20 74 68   NOTE: Should th
a010: 69 73 20 62 65 20 57 41 52 4e 2c 46 41 49 4c 3f  is be WARN,FAIL?
a020: 20 41 20 57 41 52 4e 20 69 73 20 6e 6f 74 20 61   A WARN is not a
a030: 20 46 41 49 4c 3f 3f 3f 3f 3f 20 42 55 47 20 46   FAIL????? BUG F
a040: 49 58 4d 45 0a 20 20 20 22 55 50 44 41 54 45 20  IXME.   "UPDATE 
a050: 74 65 73 74 73 0a 20 20 20 20 20 20 53 45 54 20  tests.      SET 
a060: 73 74 61 74 75 73 3d 43 41 53 45 20 57 48 45 4e  status=CASE WHEN
a070: 20 28 53 45 4c 45 43 54 20 66 61 69 6c 5f 63 6f   (SELECT fail_co
a080: 75 6e 74 20 46 52 4f 4d 20 74 65 73 74 73 20 57  unt FROM tests W
a090: 48 45 52 45 20 69 64 3d 3f 29 20 3e 20 30 20 0a  HERE id=?) > 0 .
a0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0b0: 20 20 20 20 20 20 20 20 20 54 48 45 4e 20 27 46           THEN 'F
a0c0: 41 49 4c 27 0a 20 20 20 20 20 20 20 20 20 20 20  AIL'.           
a0d0: 20 20 20 20 20 20 20 20 20 20 20 57 48 45 4e 20             WHEN 
a0e0: 28 53 45 4c 45 43 54 20 70 61 73 73 5f 63 6f 75  (SELECT pass_cou
a0f0: 6e 74 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48  nt FROM tests WH
a100: 45 52 45 20 69 64 3d 3f 29 20 3e 20 30 20 41 4e  ERE id=?) > 0 AN
a110: 44 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  D .             
a120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
a130: 45 4c 45 43 54 20 73 74 61 74 75 73 20 46 52 4f  ELECT status FRO
a140: 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 69 64  M tests WHERE id
a150: 3d 3f 29 20 4e 4f 54 20 49 4e 20 28 27 57 41 52  =?) NOT IN ('WAR
a160: 4e 27 2c 27 46 41 49 4c 27 29 0a 20 20 20 20 20  N','FAIL').     
a170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a180: 20 20 20 20 54 48 45 4e 20 27 50 41 53 53 27 0a      THEN 'PASS'.
a190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a1a0: 20 20 20 20 20 20 45 4c 53 45 20 73 74 61 74 75        ELSE statu
a1b0: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s.              
a1c0: 20 20 20 20 45 4e 44 20 57 48 45 52 45 20 69 64      END WHERE id
a1d0: 3d 3f 3b 22 0a 20 20 20 74 65 73 74 2d 69 64 20  =?;".   test-id 
a1e0: 74 65 73 74 2d 69 64 20 74 65 73 74 2d 69 64 20  test-id test-id 
a1f0: 74 65 73 74 2d 69 64 29 29 0a 0a 28 64 65 66 69  test-id))..(defi
a200: 6e 65 20 28 64 62 3a 67 65 74 2d 70 72 65 76 2d  ne (db:get-prev-
a210: 74 6f 6c 2d 66 6f 72 2d 74 65 73 74 20 64 62 20  tol-for-test db 
a220: 74 65 73 74 2d 69 64 20 63 61 74 65 67 6f 72 79  test-id category
a230: 20 76 61 72 69 61 62 6c 65 29 0a 20 20 3b 3b 20   variable).  ;; 
a240: 46 69 6e 69 73 68 20 6d 65 3f 0a 20 20 28 76 61  Finish me?.  (va
a250: 6c 75 65 73 20 23 66 20 23 66 20 23 66 29 29 0a  lues #f #f #f)).
a260: 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  .;;=============
a270: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
a280: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
a290: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
a2a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 53 20 54  =========.;; S T
a2b0: 20 45 20 50 20 53 20 0a 3b 3b 3d 3d 3d 3d 3d 3d   E P S .;;======
a2c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
a2d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
a2e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
a2f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
a300: 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 73 74  ..(define (db:st
a310: 65 70 2d 67 65 74 2d 74 69 6d 65 2d 61 73 2d 73  ep-get-time-as-s
a320: 74 72 69 6e 67 20 76 65 63 29 0a 20 20 28 73 65  tring vec).  (se
a330: 63 6f 6e 64 73 2d 3e 74 69 6d 65 2d 73 74 72 69  conds->time-stri
a340: 6e 67 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d  ng (db:step-get-
a350: 65 76 65 6e 74 5f 74 69 6d 65 20 76 65 63 29 29  event_time vec))
a360: 29 0a 0a 3b 3b 20 64 62 2d 67 65 74 2d 74 65 73  )..;; db-get-tes
a370: 74 2d 73 74 65 70 73 2d 66 6f 72 2d 72 75 6e 0a  t-steps-for-run.
a380: 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d  (define (db:get-
a390: 73 74 65 70 73 2d 66 6f 72 2d 74 65 73 74 20 64  steps-for-test d
a3a0: 62 20 74 65 73 74 2d 69 64 29 0a 20 20 28 6c 65  b test-id).  (le
a3b0: 74 20 28 28 72 65 73 20 27 28 29 29 29 0a 20 20  t ((res '())).  
a3c0: 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65    (sqlite3:for-e
a3d0: 61 63 68 2d 72 6f 77 20 0a 20 20 20 20 20 28 6c  ach-row .     (l
a3e0: 61 6d 62 64 61 20 28 69 64 20 74 65 73 74 2d 69  ambda (id test-i
a3f0: 64 20 73 74 65 70 6e 61 6d 65 20 73 74 61 74 65  d stepname state
a400: 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d 74 69   status event-ti
a410: 6d 65 20 6c 6f 67 66 69 6c 65 29 0a 20 20 20 20  me logfile).    
a420: 20 20 20 28 73 65 74 21 20 72 65 73 20 28 63 6f     (set! res (co
a430: 6e 73 20 28 76 65 63 74 6f 72 20 69 64 20 74 65  ns (vector id te
a440: 73 74 2d 69 64 20 73 74 65 70 6e 61 6d 65 20 73  st-id stepname s
a450: 74 61 74 65 20 73 74 61 74 75 73 20 65 76 65 6e  tate status even
a460: 74 2d 74 69 6d 65 20 28 69 66 20 28 73 74 72 69  t-time (if (stri
a470: 6e 67 3f 20 6c 6f 67 66 69 6c 65 29 20 6c 6f 67  ng? logfile) log
a480: 66 69 6c 65 20 22 22 29 29 20 72 65 73 29 29 29  file "")) res)))
a490: 0a 20 20 20 20 20 64 62 0a 20 20 20 20 20 22 53  .     db.     "S
a4a0: 45 4c 45 43 54 20 69 64 2c 74 65 73 74 5f 69 64  ELECT id,test_id
a4b0: 2c 73 74 65 70 6e 61 6d 65 2c 73 74 61 74 65 2c  ,stepname,state,
a4c0: 73 74 61 74 75 73 2c 65 76 65 6e 74 5f 74 69 6d  status,event_tim
a4d0: 65 2c 6c 6f 67 66 69 6c 65 20 46 52 4f 4d 20 74  e,logfile FROM t
a4e0: 65 73 74 5f 73 74 65 70 73 20 57 48 45 52 45 20  est_steps WHERE 
a4f0: 74 65 73 74 5f 69 64 3d 3f 20 4f 52 44 45 52 20  test_id=? ORDER 
a500: 42 59 20 69 64 20 41 53 43 3b 22 20 3b 3b 20 65  BY id ASC;" ;; e
a510: 76 65 6e 74 5f 74 69 6d 65 20 44 45 53 43 2c 69  vent_time DESC,i
a520: 64 20 41 53 43 3b 0a 20 20 20 20 20 74 65 73 74  d ASC;.     test
a530: 2d 69 64 29 0a 20 20 20 20 28 72 65 76 65 72 73  -id).    (revers
a540: 65 20 72 65 73 29 29 29 0a 0a 3b 3b 20 67 65 74  e res)))..;; get
a550: 20 61 20 70 72 65 74 74 79 20 74 61 62 6c 65 20   a pretty table 
a560: 74 6f 20 73 75 6d 6d 61 72 69 7a 65 20 73 74 65  to summarize ste
a570: 70 73 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 28 64  ps.;;.(define (d
a580: 62 3a 67 65 74 2d 73 74 65 70 73 2d 74 61 62 6c  b:get-steps-tabl
a590: 65 20 64 62 20 74 65 73 74 2d 69 64 29 0a 20 20  e db test-id).  
a5a0: 28 6c 65 74 20 28 28 73 74 65 70 73 20 20 20 28  (let ((steps   (
a5b0: 64 62 3a 67 65 74 2d 73 74 65 70 73 2d 66 6f 72  db:get-steps-for
a5c0: 2d 74 65 73 74 20 64 62 20 74 65 73 74 2d 69 64  -test db test-id
a5d0: 29 29 29 0a 20 20 20 20 3b 3b 20 6f 72 67 61 6e  ))).    ;; organ
a5e0: 69 73 65 20 74 68 65 20 73 74 65 70 73 20 66 6f  ise the steps fo
a5f0: 72 20 62 65 74 74 65 72 20 72 65 61 64 61 62 69  r better readabi
a600: 6c 69 74 79 0a 20 20 20 20 28 6c 65 74 20 28 28  lity.    (let ((
a610: 72 65 73 20 28 6d 61 6b 65 2d 68 61 73 68 2d 74  res (make-hash-t
a620: 61 62 6c 65 29 29 29 0a 20 20 20 20 20 20 28 66  able))).      (f
a630: 6f 72 2d 65 61 63 68 20 0a 20 20 20 20 20 20 20  or-each .       
a640: 28 6c 61 6d 62 64 61 20 28 73 74 65 70 29 0a 09  (lambda (step)..
a650: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 36 20   (debug:print 6 
a660: 22 73 74 65 70 3d 22 20 73 74 65 70 29 0a 09 20  "step=" step).. 
a670: 28 6c 65 74 20 28 28 72 65 63 6f 72 64 20 28 68  (let ((record (h
a680: 61 73 68 2d 74 61 62 6c 65 2d 72 65 66 2f 64 65  ash-table-ref/de
a690: 66 61 75 6c 74 20 0a 09 09 09 72 65 73 20 0a 09  fault ....res ..
a6a0: 09 09 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73  ..(db:step-get-s
a6b0: 74 65 70 6e 61 6d 65 20 73 74 65 70 29 20 0a 09  tepname step) ..
a6c0: 09 09 3b 3b 20 20 20 20 20 20 20 20 73 74 65 70  ..;;        step
a6d0: 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  name            
a6e0: 20 20 20 20 73 74 61 72 74 20 65 6e 64 20 73 74      start end st
a6f0: 61 74 75 73 20 20 20 20 0a 09 09 09 28 76 65 63  atus    ....(vec
a700: 74 6f 72 20 28 64 62 3a 73 74 65 70 2d 67 65 74  tor (db:step-get
a710: 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70 29 20  -stepname step) 
a720: 22 22 20 20 20 22 22 20 22 22 20 20 20 20 20 22  ""   "" ""     "
a730: 22 20 22 22 29 29 29 29 0a 09 20 20 20 28 64 65  " ""))))..   (de
a740: 62 75 67 3a 70 72 69 6e 74 20 36 20 22 72 65 63  bug:print 6 "rec
a750: 6f 72 64 28 62 65 66 6f 72 65 29 20 3d 20 22 20  ord(before) = " 
a760: 72 65 63 6f 72 64 20 0a 09 09 09 22 5c 6e 69 64  record ...."\nid
a770: 3a 20 20 20 20 20 20 20 22 20 28 64 62 3a 73 74  :       " (db:st
a780: 65 70 2d 67 65 74 2d 69 64 20 73 74 65 70 29 0a  ep-get-id step).
a790: 09 09 09 22 5c 6e 73 74 65 70 6e 61 6d 65 3a 20  ..."\nstepname: 
a7a0: 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73  " (db:step-get-s
a7b0: 74 65 70 6e 61 6d 65 20 73 74 65 70 29 0a 09 09  tepname step)...
a7c0: 09 22 5c 6e 73 74 61 74 65 3a 20 20 20 20 22 20  ."\nstate:    " 
a7d0: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61  (db:step-get-sta
a7e0: 74 65 20 73 74 65 70 29 0a 09 09 09 22 5c 6e 73  te step)...."\ns
a7f0: 74 61 74 75 73 3a 20 20 20 22 20 28 64 62 3a 73  tatus:   " (db:s
a800: 74 65 70 2d 67 65 74 2d 73 74 61 74 75 73 20 73  tep-get-status s
a810: 74 65 70 29 0a 09 09 09 22 5c 6e 74 69 6d 65 3a  tep)...."\ntime:
a820: 20 20 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d       " (db:step-
a830: 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73  get-event_time s
a840: 74 65 70 29 29 0a 09 20 20 20 28 63 61 73 65 20  tep))..   (case 
a850: 28 73 74 72 69 6e 67 2d 3e 73 79 6d 62 6f 6c 20  (string->symbol 
a860: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61  (db:step-get-sta
a870: 74 65 20 73 74 65 70 29 29 0a 09 20 20 20 20 20  te step))..     
a880: 28 28 73 74 61 72 74 29 28 76 65 63 74 6f 72 2d  ((start)(vector-
a890: 73 65 74 21 20 72 65 63 6f 72 64 20 31 20 28 64  set! record 1 (d
a8a0: 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74  b:step-get-event
a8b0: 5f 74 69 6d 65 20 73 74 65 70 29 29 0a 09 20 20  _time step))..  
a8c0: 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21      (vector-set!
a8d0: 20 72 65 63 6f 72 64 20 33 20 28 69 66 20 28 65   record 3 (if (e
a8e0: 71 75 61 6c 3f 20 28 76 65 63 74 6f 72 2d 72 65  qual? (vector-re
a8f0: 66 20 72 65 63 6f 72 64 20 33 29 20 22 22 29 0a  f record 3) "").
a900: 09 09 09 09 09 28 64 62 3a 73 74 65 70 2d 67 65  .....(db:step-ge
a910: 74 2d 73 74 61 74 75 73 20 73 74 65 70 29 29 29  t-status step)))
a920: 0a 09 20 20 20 20 20 20 28 69 66 20 28 3e 20 28  ..      (if (> (
a930: 73 74 72 69 6e 67 2d 6c 65 6e 67 74 68 20 28 64  string-length (d
a940: 62 3a 73 74 65 70 2d 67 65 74 2d 6c 6f 67 66 69  b:step-get-logfi
a950: 6c 65 20 73 74 65 70 29 29 0a 09 09 20 20 20 20  le step))...    
a960: 20 30 29 0a 09 09 20 20 28 76 65 63 74 6f 72 2d   0)...  (vector-
a970: 73 65 74 21 20 72 65 63 6f 72 64 20 35 20 28 64  set! record 5 (d
a980: 62 3a 73 74 65 70 2d 67 65 74 2d 6c 6f 67 66 69  b:step-get-logfi
a990: 6c 65 20 73 74 65 70 29 29 29 29 0a 09 20 20 20  le step))))..   
a9a0: 20 20 28 28 65 6e 64 29 20 20 0a 09 20 20 20 20    ((end)  ..    
a9b0: 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72    (vector-set! r
a9c0: 65 63 6f 72 64 20 32 20 28 61 6e 79 2d 3e 6e 75  ecord 2 (any->nu
a9d0: 6d 62 65 72 20 28 64 62 3a 73 74 65 70 2d 67 65  mber (db:step-ge
a9e0: 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73 74 65  t-event_time ste
a9f0: 70 29 29 29 0a 09 20 20 20 20 20 20 28 76 65 63  p)))..      (vec
aa00: 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20  tor-set! record 
aa10: 33 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73  3 (db:step-get-s
aa20: 74 61 74 75 73 20 73 74 65 70 29 29 0a 09 20 20  tatus step))..  
aa30: 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21      (vector-set!
aa40: 20 72 65 63 6f 72 64 20 34 20 28 6c 65 74 20 28   record 4 (let (
aa50: 28 73 74 61 72 74 74 20 28 61 6e 79 2d 3e 6e 75  (startt (any->nu
aa60: 6d 62 65 72 20 28 76 65 63 74 6f 72 2d 72 65 66  mber (vector-ref
aa70: 20 72 65 63 6f 72 64 20 31 29 29 29 0a 09 09 09   record 1)))....
aa80: 09 09 20 20 28 65 6e 64 74 20 20 20 28 61 6e 79  ..  (endt   (any
aa90: 2d 3e 6e 75 6d 62 65 72 20 28 76 65 63 74 6f 72  ->number (vector
aaa0: 2d 72 65 66 20 72 65 63 6f 72 64 20 32 29 29 29  -ref record 2)))
aab0: 29 0a 09 09 09 09 20 20 20 20 20 20 28 64 65 62  ).....      (deb
aac0: 75 67 3a 70 72 69 6e 74 20 34 20 22 72 65 63 6f  ug:print 4 "reco
aad0: 72 64 5b 31 5d 3d 22 20 28 76 65 63 74 6f 72 2d  rd[1]=" (vector-
aae0: 72 65 66 20 72 65 63 6f 72 64 20 31 29 20 0a 09  ref record 1) ..
aaf0: 09 09 09 09 09 20 20 20 22 2c 20 73 74 61 72 74  .....   ", start
ab00: 74 3d 22 20 73 74 61 72 74 74 20 22 2c 20 65 6e  t=" startt ", en
ab10: 64 74 3d 22 20 65 6e 64 74 0a 09 09 09 09 09 09  dt=" endt.......
ab20: 20 20 20 22 2c 20 67 65 74 2d 73 74 61 74 75 73     ", get-status
ab30: 3a 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74  : " (db:step-get
ab40: 2d 73 74 61 74 75 73 20 73 74 65 70 29 29 0a 09  -status step))..
ab50: 09 09 09 20 20 20 20 20 20 28 69 66 20 28 61 6e  ...      (if (an
ab60: 64 20 28 6e 75 6d 62 65 72 3f 20 73 74 61 72 74  d (number? start
ab70: 74 29 28 6e 75 6d 62 65 72 3f 20 65 6e 64 74 29  t)(number? endt)
ab80: 29 0a 09 09 09 09 09 20 20 28 73 65 63 6f 6e 64  )......  (second
ab90: 73 2d 3e 68 72 2d 6d 69 6e 2d 73 65 63 20 28 2d  s->hr-min-sec (-
aba0: 20 65 6e 64 74 20 73 74 61 72 74 74 29 29 20 22   endt startt)) "
abb0: 2d 31 22 29 29 29 0a 09 20 20 20 20 20 20 28 69  -1")))..      (i
abc0: 66 20 28 3e 20 28 73 74 72 69 6e 67 2d 6c 65 6e  f (> (string-len
abd0: 67 74 68 20 28 64 62 3a 73 74 65 70 2d 67 65 74  gth (db:step-get
abe0: 2d 6c 6f 67 66 69 6c 65 20 73 74 65 70 29 29 0a  -logfile step)).
abf0: 09 09 20 20 20 20 20 30 29 0a 09 09 20 20 28 76  ..     0)...  (v
ac00: 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72  ector-set! recor
ac10: 64 20 35 20 28 64 62 3a 73 74 65 70 2d 67 65 74  d 5 (db:step-get
ac20: 2d 6c 6f 67 66 69 6c 65 20 73 74 65 70 29 29 29  -logfile step)))
ac30: 29 0a 09 20 20 20 20 20 28 65 6c 73 65 0a 09 20  )..     (else.. 
ac40: 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74       (vector-set
ac50: 21 20 72 65 63 6f 72 64 20 32 20 28 64 62 3a 73  ! record 2 (db:s
ac60: 74 65 70 2d 67 65 74 2d 73 74 61 74 65 20 73 74  tep-get-state st
ac70: 65 70 29 29 0a 09 20 20 20 20 20 20 28 76 65 63  ep))..      (vec
ac80: 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20  tor-set! record 
ac90: 33 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73  3 (db:step-get-s
aca0: 74 61 74 75 73 20 73 74 65 70 29 29 0a 09 20 20  tatus step))..  
acb0: 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21      (vector-set!
acc0: 20 72 65 63 6f 72 64 20 34 20 28 64 62 3a 73 74   record 4 (db:st
acd0: 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d  ep-get-event_tim
ace0: 65 20 73 74 65 70 29 29 29 29 0a 09 20 20 20 28  e step))))..   (
acf0: 68 61 73 68 2d 74 61 62 6c 65 2d 73 65 74 21 20  hash-table-set! 
ad00: 72 65 73 20 28 64 62 3a 73 74 65 70 2d 67 65 74  res (db:step-get
ad10: 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70 29 20  -stepname step) 
ad20: 72 65 63 6f 72 64 29 0a 09 20 20 20 28 64 65 62  record)..   (deb
ad30: 75 67 3a 70 72 69 6e 74 20 36 20 22 72 65 63 6f  ug:print 6 "reco
ad40: 72 64 28 61 66 74 65 72 29 20 20 3d 20 22 20 72  rd(after)  = " r
ad50: 65 63 6f 72 64 20 0a 09 09 09 22 5c 6e 69 64 3a  ecord ...."\nid:
ad60: 20 20 20 20 20 20 20 22 20 28 64 62 3a 73 74 65         " (db:ste
ad70: 70 2d 67 65 74 2d 69 64 20 73 74 65 70 29 0a 09  p-get-id step)..
ad80: 09 09 22 5c 6e 73 74 65 70 6e 61 6d 65 3a 20 22  .."\nstepname: "
ad90: 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74   (db:step-get-st
ada0: 65 70 6e 61 6d 65 20 73 74 65 70 29 0a 09 09 09  epname step)....
adb0: 22 5c 6e 73 74 61 74 65 3a 20 20 20 20 22 20 28  "\nstate:    " (
adc0: 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 74  db:step-get-stat
add0: 65 20 73 74 65 70 29 0a 09 09 09 22 5c 6e 73 74  e step)...."\nst
ade0: 61 74 75 73 3a 20 20 20 22 20 28 64 62 3a 73 74  atus:   " (db:st
adf0: 65 70 2d 67 65 74 2d 73 74 61 74 75 73 20 73 74  ep-get-status st
ae00: 65 70 29 0a 09 09 09 22 5c 6e 74 69 6d 65 3a 20  ep)...."\ntime: 
ae10: 20 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d 67      " (db:step-g
ae20: 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73 74  et-event_time st
ae30: 65 70 29 29 29 29 0a 20 20 20 20 20 20 20 3b 3b  ep)))).       ;;
ae40: 20 28 65 6c 73 65 20 20 20 28 76 65 63 74 6f 72   (else   (vector
ae50: 2d 73 65 74 21 20 72 65 63 6f 72 64 20 31 20 28  -set! record 1 (
ae60: 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 6e  db:step-get-even
ae70: 74 5f 74 69 6d 65 20 73 74 65 70 29 29 29 0a 20  t_time step))). 
ae80: 20 20 20 20 20 20 28 73 6f 72 74 20 73 74 65 70        (sort step
ae90: 73 20 28 6c 61 6d 62 64 61 20 28 61 20 62 29 28  s (lambda (a b)(
aea0: 3c 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65  < (db:step-get-e
aeb0: 76 65 6e 74 5f 74 69 6d 65 20 61 29 28 64 62 3a  vent_time a)(db:
aec0: 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74  step-get-event_t
aed0: 69 6d 65 20 62 29 29 29 29 29 0a 20 20 20 20 20  ime b))))).     
aee0: 20 72 65 73 29 29 29 0a 0a 3b 3b 20 74 68 65 20   res)))..;; the 
aef0: 6e 65 77 20 70 72 65 72 65 71 73 20 63 61 6c 63  new prereqs calc
af00: 75 6c 61 74 69 6f 6e 2c 20 6c 6f 6f 6b 73 20 61  ulation, looks a
af10: 6c 73 6f 20 61 74 20 69 74 65 6d 70 61 74 68 20  lso at itempath 
af20: 69 66 20 73 70 65 63 69 66 69 65 64 0a 3b 3b 20  if specified.;; 
af30: 61 6c 6c 20 70 72 65 72 65 71 73 20 6d 75 73 74  all prereqs must
af40: 20 62 65 20 6d 65 74 3a 0a 3b 3b 20 20 20 20 69   be met:.;;    i
af50: 66 20 70 72 65 72 65 71 20 74 65 73 74 20 77 69  f prereq test wi
af60: 74 68 20 69 74 65 6d 70 61 74 68 3d 27 27 20 69  th itempath='' i
af70: 73 20 43 4f 4d 50 4c 45 54 45 44 20 61 6e 64 20  s COMPLETED and 
af80: 50 41 53 53 2c 20 57 41 52 4e 2c 20 43 48 45 43  PASS, WARN, CHEC
af90: 4b 2c 20 6f 72 20 57 41 49 56 45 44 20 74 68 65  K, or WAIVED the
afa0: 6e 20 70 72 65 72 65 71 20 69 73 20 6d 65 74 0a  n prereq is met.
afb0: 3b 3b 20 20 20 20 69 66 20 70 72 65 72 65 71 20  ;;    if prereq 
afc0: 74 65 73 74 20 77 69 74 68 20 69 74 65 6d 70 61  test with itempa
afd0: 74 68 3d 72 65 66 2d 69 74 65 6d 2d 70 61 74 68  th=ref-item-path
afe0: 20 61 6e 64 20 43 4f 4d 50 4c 45 54 45 44 20 77   and COMPLETED w
aff0: 69 74 68 20 50 41 53 53 2c 20 57 41 52 4e 2c 20  ith PASS, WARN, 
b000: 43 48 45 43 4b 2c 20 6f 72 20 57 41 49 56 45 44  CHECK, or WAIVED
b010: 20 74 68 65 6e 20 70 72 65 72 65 71 20 69 73 20   then prereq is 
b020: 6d 65 74 0a 3b 3b 0a 3b 3b 20 4e 6f 74 65 3a 20  met.;;.;; Note: 
b030: 64 6f 20 6e 6f 74 20 63 6f 6e 76 65 72 74 20 74  do not convert t
b040: 6f 20 72 65 6d 6f 74 65 20 61 73 20 69 74 20 63  o remote as it c
b050: 61 6c 6c 73 20 72 65 6d 6f 74 65 20 75 6e 64 65  alls remote unde
b060: 72 20 74 68 65 20 68 6f 6f 64 0a 3b 3b 0a 28 64  r the hood.;;.(d
b070: 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 70 72  efine (db:get-pr
b080: 65 72 65 71 73 2d 6e 6f 74 2d 6d 65 74 20 64 62  ereqs-not-met db
b090: 20 72 75 6e 2d 69 64 20 77 61 69 74 6f 6e 73 20   run-id waitons 
b0a0: 72 65 66 2d 69 74 65 6d 2d 70 61 74 68 29 0a 20  ref-item-path). 
b0b0: 20 28 69 66 20 28 6f 72 20 28 6e 6f 74 20 77 61   (if (or (not wa
b0c0: 69 74 6f 6e 73 29 0a 09 20 20 28 6e 75 6c 6c 3f  itons)..  (null?
b0d0: 20 77 61 69 74 6f 6e 73 29 29 0a 20 20 20 20 20   waitons)).     
b0e0: 20 27 28 29 0a 20 20 20 20 20 20 28 6c 65 74 2a   '().      (let*
b0f0: 20 28 28 75 6e 6d 65 74 2d 70 72 65 2d 72 65 71   ((unmet-pre-req
b100: 73 20 27 28 29 29 0a 09 20 20 20 20 20 28 72 65  s '())..     (re
b110: 73 75 6c 74 20 20 20 20 20 20 20 20 20 27 28 29  sult         '()
b120: 29 29 0a 09 28 66 6f 72 2d 65 61 63 68 20 0a 09  ))..(for-each ..
b130: 20 28 6c 61 6d 62 64 61 20 28 77 61 69 74 6f 6e   (lambda (waiton
b140: 74 65 73 74 2d 6e 61 6d 65 29 0a 09 20 20 20 3b  test-name)..   ;
b150: 3b 20 62 79 20 67 65 74 74 69 6e 67 20 74 68 65  ; by getting the
b160: 20 74 65 73 74 73 20 77 69 74 68 20 6d 61 74 63   tests with matc
b170: 68 69 6e 67 20 6e 61 6d 65 20 77 65 20 61 72 65  hing name we are
b180: 20 6c 6f 6f 6b 69 6e 67 20 6f 6e 6c 79 20 61 74   looking only at
b190: 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 74 65   the matching te
b1a0: 73 74 20 0a 09 20 20 20 3b 3b 20 61 6e 64 20 72  st ..   ;; and r
b1b0: 65 6c 61 74 65 64 20 73 75 62 20 69 74 65 6d 73  elated sub items
b1c0: 0a 09 20 20 20 28 6c 65 74 20 28 28 74 65 73 74  ..   (let ((test
b1d0: 73 20 20 20 20 20 20 20 20 20 20 20 20 20 28 72  s             (r
b1e0: 64 62 3a 67 65 74 2d 74 65 73 74 73 2d 66 6f 72  db:get-tests-for
b1f0: 2d 72 75 6e 20 64 62 20 72 75 6e 2d 69 64 20 77  -run db run-id w
b200: 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 20 23  aitontest-name #
b210: 66 20 27 28 29 20 27 28 29 29 29 0a 09 09 20 28  f '() '()))... (
b220: 65 76 65 72 2d 73 65 65 6e 20 20 20 20 20 20 20  ever-seen       
b230: 20 20 23 66 29 0a 09 09 20 28 70 61 72 65 6e 74    #f)... (parent
b240: 2d 77 61 69 74 6f 6e 2d 6d 65 74 20 23 66 29 0a  -waiton-met #f).
b250: 09 09 20 28 69 74 65 6d 2d 77 61 69 74 6f 6e 2d  .. (item-waiton-
b260: 6d 65 74 20 20 20 23 66 29 29 0a 09 20 20 20 20  met   #f))..    
b270: 20 28 66 6f 72 2d 65 61 63 68 20 0a 09 20 20 20   (for-each ..   
b280: 20 20 20 28 6c 61 6d 62 64 61 20 28 74 65 73 74     (lambda (test
b290: 29 0a 09 09 3b 3b 20 28 69 66 20 28 65 71 75 61  )...;; (if (equa
b2a0: 6c 3f 20 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61  l? waitontest-na
b2b0: 6d 65 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d  me (db:test-get-
b2c0: 74 65 73 74 6e 61 6d 65 20 74 65 73 74 29 29 20  testname test)) 
b2d0: 3b 3b 20 62 79 20 64 65 66 69 6e 74 69 6f 6e 20  ;; by defintion 
b2e0: 74 68 69 73 20 68 61 64 20 62 65 74 74 65 72 20  this had better 
b2f0: 62 65 20 74 72 75 65 20 2e 2e 2e 0a 09 09 28 6c  be true ......(l
b300: 65 74 2a 20 28 28 73 74 61 74 65 20 20 20 20 20  et* ((state     
b310: 20 20 20 20 20 20 20 20 28 64 62 3a 74 65 73 74          (db:test
b320: 2d 67 65 74 2d 73 74 61 74 65 20 74 65 73 74 29  -get-state test)
b330: 29 0a 09 09 20 20 20 20 20 20 20 28 73 74 61 74  )...       (stat
b340: 75 73 20 20 20 20 20 20 20 20 20 20 20 20 28 64  us            (d
b350: 62 3a 74 65 73 74 2d 67 65 74 2d 73 74 61 74 75  b:test-get-statu
b360: 73 20 74 65 73 74 29 29 0a 09 09 20 20 20 20 20  s test))...     
b370: 20 20 28 69 74 65 6d 2d 70 61 74 68 20 20 20 20    (item-path    
b380: 20 20 20 20 20 28 64 62 3a 74 65 73 74 2d 67 65       (db:test-ge
b390: 74 2d 69 74 65 6d 2d 70 61 74 68 20 74 65 73 74  t-item-path test
b3a0: 29 29 0a 09 09 20 20 20 20 20 20 20 28 69 73 2d  ))...       (is-
b3b0: 63 6f 6d 70 6c 65 74 65 64 20 20 20 20 20 20 28  completed      (
b3c0: 65 71 75 61 6c 3f 20 73 74 61 74 65 20 22 43 4f  equal? state "CO
b3d0: 4d 50 4c 45 54 45 44 22 29 29 0a 09 09 20 20 20  MPLETED"))...   
b3e0: 20 20 20 20 28 69 73 2d 6f 6b 20 20 20 20 20 20      (is-ok      
b3f0: 20 20 20 20 20 20 20 28 6d 65 6d 62 65 72 20 73         (member s
b400: 74 61 74 75 73 20 27 28 22 50 41 53 53 22 20 22  tatus '("PASS" "
b410: 57 41 52 4e 22 20 22 43 48 45 43 4b 22 20 22 57  WARN" "CHECK" "W
b420: 41 49 56 45 44 22 29 29 29 0a 09 09 20 20 20 20  AIVED")))...    
b430: 20 20 20 28 73 61 6d 65 2d 69 74 65 6d 70 61 74     (same-itempat
b440: 68 20 20 20 20 20 28 65 71 75 61 6c 3f 20 72 65  h     (equal? re
b450: 66 2d 69 74 65 6d 2d 70 61 74 68 20 69 74 65 6d  f-item-path item
b460: 2d 70 61 74 68 29 29 29 0a 09 09 20 20 28 73 65  -path)))...  (se
b470: 74 21 20 65 76 65 72 2d 73 65 65 6e 20 23 74 29  t! ever-seen #t)
b480: 0a 09 09 20 20 28 63 6f 6e 64 0a 09 09 20 20 20  ...  (cond...   
b490: 3b 3b 20 63 61 73 65 20 31 2c 20 6e 6f 6e 2d 69  ;; case 1, non-i
b4a0: 74 65 6d 20 28 70 61 72 65 6e 74 20 74 65 73 74  tem (parent test
b4b0: 29 20 69 73 20 0a 09 09 20 20 20 28 28 61 6e 64  ) is ...   ((and
b4c0: 20 28 65 71 75 61 6c 3f 20 69 74 65 6d 2d 70 61   (equal? item-pa
b4d0: 74 68 20 22 22 29 20 3b 3b 20 74 68 69 73 20 69  th "") ;; this i
b4e0: 73 20 74 68 65 20 70 61 72 65 6e 74 20 74 65 73  s the parent tes
b4f0: 74 0a 09 09 09 20 69 73 2d 63 6f 6d 70 6c 65 74  t.... is-complet
b500: 65 64 0a 09 09 09 20 69 73 2d 6f 6b 29 0a 09 09  ed.... is-ok)...
b510: 20 20 20 20 28 73 65 74 21 20 70 61 72 65 6e 74      (set! parent
b520: 2d 77 61 69 74 6f 6e 2d 6d 65 74 20 23 74 29 29  -waiton-met #t))
b530: 0a 09 09 20 20 20 28 28 61 6e 64 20 73 61 6d 65  ...   ((and same
b540: 2d 69 74 65 6d 70 61 74 68 0a 09 09 09 20 69 73  -itempath.... is
b550: 2d 63 6f 6d 70 6c 65 74 65 64 0a 09 09 09 20 69  -completed.... i
b560: 73 2d 6f 6b 29 0a 09 09 20 20 20 20 28 73 65 74  s-ok)...    (set
b570: 21 20 69 74 65 6d 2d 77 61 69 74 6f 6e 2d 6d 65  ! item-waiton-me
b580: 74 20 23 74 29 29 29 29 29 0a 09 20 20 20 20 20  t #t)))))..     
b590: 20 74 65 73 74 73 29 0a 09 20 20 20 20 20 28 69   tests)..     (i
b5a0: 66 20 28 6e 6f 74 20 28 6f 72 20 70 61 72 65 6e  f (not (or paren
b5b0: 74 2d 77 61 69 74 6f 6e 2d 6d 65 74 20 69 74 65  t-waiton-met ite
b5c0: 6d 2d 77 61 69 74 6f 6e 2d 6d 65 74 29 29 0a 09  m-waiton-met))..
b5d0: 09 20 28 73 65 74 21 20 72 65 73 75 6c 74 20 28  . (set! result (
b5e0: 63 6f 6e 73 20 77 61 69 74 6f 6e 74 65 73 74 2d  cons waitontest-
b5f0: 6e 61 6d 65 20 72 65 73 75 6c 74 29 29 29 0a 09  name result)))..
b600: 20 20 20 20 20 3b 3b 20 69 66 20 74 68 65 20 74       ;; if the t
b610: 65 73 74 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  est is not found
b620: 20 74 68 65 6e 20 63 6c 65 61 72 6c 79 20 74 68   then clearly th
b630: 65 20 77 61 69 74 6f 6e 20 69 73 20 6e 6f 74 20  e waiton is not 
b640: 6d 65 74 2e 2e 2e 0a 09 20 20 20 20 20 28 69 66  met.....     (if
b650: 20 28 6e 6f 74 20 65 76 65 72 2d 73 65 65 6e 29   (not ever-seen)
b660: 28 73 65 74 21 20 72 65 73 75 6c 74 20 28 63 6f  (set! result (co
b670: 6e 73 20 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61  ns waitontest-na
b680: 6d 65 20 72 65 73 75 6c 74 29 29 29 29 29 0a 09  me result)))))..
b690: 77 61 69 74 6f 6e 73 29 0a 20 20 20 20 20 20 28  waitons).      (
b6a0: 64 65 6c 65 74 65 2d 64 75 70 6c 69 63 61 74 65  delete-duplicate
b6b0: 73 20 72 65 73 75 6c 74 29 29 29 29 0a 0a 28 64  s result))))..(d
b6c0: 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74 73 74  efine (db:testst
b6d0: 65 70 2d 73 65 74 2d 73 74 61 74 75 73 21 20 64  ep-set-status! d
b6e0: 62 20 74 65 73 74 2d 69 64 20 74 65 73 74 73 74  b test-id testst
b6f0: 65 70 2d 6e 61 6d 65 20 73 74 61 74 65 2d 69 6e  ep-name state-in
b700: 20 73 74 61 74 75 73 2d 69 6e 20 69 74 65 6d 2d   status-in item-
b710: 70 61 74 68 20 63 6f 6d 6d 65 6e 74 20 6c 6f 67  path comment log
b720: 66 69 6c 65 29 0a 20 20 28 64 65 62 75 67 3a 70  file).  (debug:p
b730: 72 69 6e 74 20 34 20 22 74 65 73 74 2d 69 64 3a  rint 4 "test-id:
b740: 20 22 20 74 65 73 74 2d 69 64 20 22 20 74 65 73   " test-id " tes
b750: 74 73 74 65 70 2d 6e 61 6d 65 3a 20 22 20 74 65  tstep-name: " te
b760: 73 74 73 74 65 70 2d 6e 61 6d 65 29 0a 20 20 28  ststep-name).  (
b770: 6c 65 74 2a 20 28 28 73 74 61 74 65 20 20 20 20  let* ((state    
b780: 20 28 63 68 65 63 6b 2d 76 61 6c 69 64 2d 69 74   (check-valid-it
b790: 65 6d 73 20 22 73 74 61 74 65 22 20 73 74 61 74  ems "state" stat
b7a0: 65 2d 69 6e 29 29 0a 09 20 28 73 74 61 74 75 73  e-in)).. (status
b7b0: 20 20 20 20 28 63 68 65 63 6b 2d 76 61 6c 69 64      (check-valid
b7c0: 2d 69 74 65 6d 73 20 22 73 74 61 74 75 73 22 20  -items "status" 
b7d0: 73 74 61 74 75 73 2d 69 6e 29 29 29 0a 20 20 20  status-in))).   
b7e0: 20 28 69 66 20 28 6f 72 20 28 6e 6f 74 20 73 74   (if (or (not st
b7f0: 61 74 65 29 28 6e 6f 74 20 73 74 61 74 75 73 29  ate)(not status)
b800: 29 0a 09 28 64 65 62 75 67 3a 70 72 69 6e 74 20  )..(debug:print 
b810: 30 20 22 57 41 52 4e 49 4e 47 3a 20 49 6e 76 61  0 "WARNING: Inva
b820: 6c 69 64 20 22 20 28 69 66 20 73 74 61 74 75 73  lid " (if status
b830: 20 22 73 74 61 74 75 73 22 20 22 73 74 61 74 65   "status" "state
b840: 22 29 0a 09 09 20 20 20 20 20 22 20 76 61 6c 75  ")...     " valu
b850: 65 20 5c 22 22 20 28 69 66 20 73 74 61 74 75 73  e \"" (if status
b860: 20 73 74 61 74 65 2d 69 6e 20 73 74 61 74 75 73   state-in status
b870: 2d 69 6e 29 20 22 5c 22 2c 20 75 70 64 61 74 65  -in) "\", update
b880: 20 79 6f 75 72 20 76 61 6c 69 64 76 61 6c 75 65   your validvalue
b890: 73 20 73 65 63 74 69 6f 6e 20 69 6e 20 6d 65 67  s section in meg
b8a0: 61 74 65 73 74 2e 63 6f 6e 66 69 67 22 29 29 0a  atest.config")).
b8b0: 20 20 20 20 28 6d 75 74 65 78 2d 6c 6f 63 6b 21      (mutex-lock!
b8c0: 20 2a 69 6e 63 6f 6d 69 6e 67 2d 6d 75 74 65 78   *incoming-mutex
b8d0: 2a 29 0a 20 20 20 20 28 73 65 74 21 20 2a 69 6e  *).    (set! *in
b8e0: 63 6f 6d 69 6e 67 2d 64 61 74 61 2a 20 28 63 6f  coming-data* (co
b8f0: 6e 73 20 28 76 65 63 74 6f 72 20 27 73 74 65 70  ns (vector 'step
b900: 2d 73 74 61 74 75 73 0a 09 09 09 09 09 28 63 75  -status......(cu
b910: 72 72 65 6e 74 2d 73 65 63 6f 6e 64 73 29 0a 09  rrent-seconds)..
b920: 09 09 09 09 3b 3b 20 46 49 58 4d 45 20 2d 20 74  ....;; FIXME - t
b930: 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 75  his should not u
b940: 70 64 61 74 65 20 74 68 65 20 6c 6f 67 66 69 6c  pdate the logfil
b950: 65 20 75 6e 6c 65 73 73 20 69 74 20 69 73 20 73  e unless it is s
b960: 70 65 63 69 66 69 65 64 2e 0a 09 09 09 09 09 28  pecified.......(
b970: 6c 69 73 74 20 74 65 73 74 2d 69 64 20 74 65 73  list test-id tes
b980: 74 73 74 65 70 2d 6e 61 6d 65 20 73 74 61 74 65  tstep-name state
b990: 2d 69 6e 20 73 74 61 74 75 73 2d 69 6e 20 28 63  -in status-in (c
b9a0: 75 72 72 65 6e 74 2d 73 65 63 6f 6e 64 73 29 20  urrent-seconds) 
b9b0: 28 69 66 20 63 6f 6d 6d 65 6e 74 20 63 6f 6d 6d  (if comment comm
b9c0: 65 6e 74 20 22 22 29 20 28 69 66 20 6c 6f 67 66  ent "") (if logf
b9d0: 69 6c 65 20 6c 6f 67 66 69 6c 65 20 22 22 29 29  ile logfile ""))
b9e0: 29 0a 09 09 09 09 2a 69 6e 63 6f 6d 69 6e 67 2d  ).....*incoming-
b9f0: 64 61 74 61 2a 29 29 0a 20 20 20 20 28 6d 75 74  data*)).    (mut
ba00: 65 78 2d 75 6e 6c 6f 63 6b 21 20 2a 69 6e 63 6f  ex-unlock! *inco
ba10: 6d 69 6e 67 2d 6d 75 74 65 78 2a 29 0a 20 20 20  ming-mutex*).   
ba20: 20 28 69 66 20 28 6e 6f 74 20 2a 63 61 63 68 65   (if (not *cache
ba30: 2d 6f 6e 2a 29 28 64 62 3a 77 72 69 74 65 2d 63  -on*)(db:write-c
ba40: 61 63 68 65 64 2d 64 61 74 61 20 64 62 29 29 0a  ached-data db)).
ba50: 20 20 20 20 23 74 29 29 0a 0a 3b 3b 3d 3d 3d 3d      #t))..;;====
ba60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
ba70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
ba80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
ba90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
baa0: 3d 3d 0a 3b 3b 20 45 78 74 72 61 63 74 20 6f 64  ==.;; Extract od
bab0: 73 20 66 69 6c 65 20 66 72 6f 6d 20 74 68 65 20  s file from the 
bac0: 64 62 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  db.;;===========
bad0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
bae0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
baf0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
bb00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20  ===========..;; 
bb10: 72 75 6e 73 70 61 74 74 20 69 73 20 61 20 63 6f  runspatt is a co
bb20: 6d 6d 61 20 64 65 6c 69 6d 69 74 65 64 20 6c 69  mma delimited li
bb30: 73 74 20 6f 66 20 72 75 6e 20 70 61 74 74 65 72  st of run patter
bb40: 6e 73 0a 3b 3b 20 6b 65 79 70 61 74 74 2d 61 6c  ns.;; keypatt-al
bb50: 69 73 74 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e  ist must contain
bb60: 20 2a 61 6c 6c 2a 20 6b 65 79 73 20 77 69 74 68   *all* keys with
bb70: 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20 70   an associated p
bb80: 61 74 74 65 72 6e 3a 20 27 28 20 28 22 4b 45 59  attern: '( ("KEY
bb90: 31 22 20 22 25 22 29 20 2e 2e 20 29 0a 28 64 65  1" "%") .. ).(de
bba0: 66 69 6e 65 20 28 64 62 3a 65 78 74 72 61 63 74  fine (db:extract
bbb0: 2d 6f 64 73 2d 66 69 6c 65 20 64 62 20 6f 75 74  -ods-file db out
bbc0: 70 75 74 66 69 6c 65 20 6b 65 79 70 61 74 74 2d  putfile keypatt-
bbd0: 61 6c 69 73 74 20 72 75 6e 73 70 61 74 74 20 70  alist runspatt p
bbe0: 61 74 68 6d 6f 64 29 0a 20 20 28 6c 65 74 2a 20  athmod).  (let* 
bbf0: 28 28 6b 65 79 73 73 74 72 20 20 28 73 74 72 69  ((keysstr  (stri
bc00: 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 28  ng-intersperse (
bc10: 6d 61 70 20 63 61 72 20 6b 65 79 70 61 74 74 2d  map car keypatt-
bc20: 61 6c 69 73 74 29 20 22 2c 22 29 29 0a 09 20 28  alist) ",")).. (
bc30: 6b 65 79 71 72 79 20 20 20 28 73 74 72 69 6e 67  keyqry   (string
bc40: 2d 69 6e 74 65 72 73 70 65 72 73 65 20 28 6d 61  -intersperse (ma
bc50: 70 20 28 6c 61 6d 62 64 61 20 28 70 29 28 63 6f  p (lambda (p)(co
bc60: 6e 63 20 28 63 61 72 20 70 29 20 22 20 4c 49 4b  nc (car p) " LIK
bc70: 45 20 3f 20 22 29 29 20 6b 65 79 70 61 74 74 2d  E ? ")) keypatt-
bc80: 61 6c 69 73 74 29 20 22 20 41 4e 44 20 22 29 29  alist) " AND "))
bc90: 0a 09 20 28 6e 75 6d 6b 65 79 73 20 20 28 6c 65  .. (numkeys  (le
bca0: 6e 67 74 68 20 6b 65 79 70 61 74 74 2d 61 6c 69  ngth keypatt-ali
bcb0: 73 74 29 29 0a 09 20 28 74 65 73 74 2d 69 64 73  st)).. (test-ids
bcc0: 20 27 28 29 29 0a 09 20 28 77 69 6e 64 6f 77 73   '()).. (windows
bcd0: 20 20 28 61 6e 64 20 70 61 74 68 6d 6f 64 20 28    (and pathmod (
bce0: 73 75 62 73 74 72 69 6e 67 2d 69 6e 64 65 78 20  substring-index 
bcf0: 22 5c 5c 22 20 70 61 74 68 6d 6f 64 29 29 29 0a  "\\" pathmod))).
bd00: 09 20 28 74 65 6d 70 64 69 72 20 20 28 63 6f 6e  . (tempdir  (con
bd10: 63 20 22 2f 74 6d 70 2f 22 20 28 63 75 72 72 65  c "/tmp/" (curre
bd20: 6e 74 2d 75 73 65 72 2d 6e 61 6d 65 29 20 22 2f  nt-user-name) "/
bd30: 22 20 72 75 6e 73 70 61 74 74 20 22 5f 22 20 28  " runspatt "_" (
bd40: 72 61 6e 64 6f 6d 20 31 30 30 30 30 29 20 22 5f  random 10000) "_
bd50: 22 20 28 63 75 72 72 65 6e 74 2d 70 72 6f 63 65  " (current-proce
bd60: 73 73 2d 69 64 29 29 29 0a 09 20 28 72 75 6e 73  ss-id))).. (runs
bd70: 68 65 61 64 65 72 20 28 61 70 70 65 6e 64 20 28  header (append (
bd80: 6c 69 73 74 20 22 52 75 6e 20 49 64 22 20 22 52  list "Run Id" "R
bd90: 75 6e 6e 61 6d 65 22 29 20 3b 20 30 20 31 0a 09  unname") ; 0 1..
bda0: 09 09 20 20 20 20 20 28 6d 61 70 20 63 61 72 20  ..     (map car 
bdb0: 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 29 20 20  keypatt-alist)  
bdc0: 20 3b 20 2b 20 4e 20 3d 20 6c 65 6e 67 74 68 20   ; + N = length 
bdd0: 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 0a 09 09  keypatt-alist...
bde0: 09 20 20 20 20 20 28 6c 69 73 74 20 22 54 65 73  .     (list "Tes
bdf0: 74 6e 61 6d 65 22 20 20 20 20 20 20 20 20 20 20  tname"          
be00: 3b 20 32 0a 09 09 09 09 20 20 20 22 49 74 65 6d  ; 2.....   "Item
be10: 20 50 61 74 68 22 20 20 20 20 20 20 20 20 20 3b   Path"         ;
be20: 20 33 20 0a 09 09 09 09 20 20 20 22 44 65 73 63   3 .....   "Desc
be30: 72 69 70 74 69 6f 6e 22 20 20 20 20 20 20 20 3b  ription"       ;
be40: 20 34 20 0a 09 09 09 09 20 20 20 22 53 74 61 74   4 .....   "Stat
be50: 65 22 20 20 20 20 20 20 20 20 20 20 20 20 20 3b  e"             ;
be60: 20 35 20 0a 09 09 09 09 20 20 20 22 53 74 61 74   5 .....   "Stat
be70: 75 73 22 20 20 20 20 20 20 20 20 20 20 20 20 3b  us"            ;
be80: 20 36 20 20 0a 09 09 09 09 20 20 20 22 46 69 6e   6  .....   "Fin
be90: 61 6c 20 4c 6f 67 22 20 20 20 20 20 20 20 20 20  al Log"         
bea0: 3b 20 37 20 0a 09 09 09 09 20 20 20 22 52 75 6e  ; 7 .....   "Run
beb0: 20 44 75 72 61 74 69 6f 6e 22 20 20 20 20 20 20   Duration"      
bec0: 3b 20 38 20 0a 09 09 09 09 20 20 20 22 57 68 65  ; 8 .....   "Whe
bed0: 6e 20 52 75 6e 22 20 20 20 20 20 20 20 20 20 20  n Run"          
bee0: 3b 20 39 20 0a 09 09 09 09 20 20 20 22 54 61 67  ; 9 .....   "Tag
bef0: 73 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s"              
bf00: 3b 20 31 30 0a 09 09 09 09 20 20 20 22 52 75 6e  ; 10.....   "Run
bf10: 20 4f 77 6e 65 72 22 20 20 20 20 20 20 20 20 20   Owner"         
bf20: 3b 20 31 31 0a 09 09 09 09 20 20 20 22 43 6f 6d  ; 11.....   "Com
bf30: 6d 65 6e 74 22 20 20 20 20 20 20 20 20 20 20 20  ment"           
bf40: 3b 20 31 32 0a 09 09 09 09 20 20 20 22 41 75 74  ; 12.....   "Aut
bf50: 68 6f 72 22 20 20 20 20 20 20 20 20 20 20 20 20  hor"            
bf60: 3b 20 31 33 0a 09 09 09 09 20 20 20 22 54 65 73  ; 13.....   "Tes
bf70: 74 20 4f 77 6e 65 72 22 20 20 20 20 20 20 20 20  t Owner"        
bf80: 3b 20 31 34 0a 09 09 09 09 20 20 20 22 52 65 76  ; 14.....   "Rev
bf90: 69 65 77 65 64 22 20 20 20 20 20 20 20 20 20 20  iewed"          
bfa0: 3b 20 31 35 0a 09 09 09 09 20 20 20 22 44 69 73  ; 15.....   "Dis
bfb0: 6b 66 72 65 65 22 20 20 20 20 20 20 20 20 20 20  kfree"          
bfc0: 3b 20 31 36 0a 09 09 09 09 20 20 20 22 55 6e 61  ; 16.....   "Una
bfd0: 6d 65 22 20 20 20 20 20 20 20 20 20 20 20 20 20  me"             
bfe0: 3b 20 31 37 0a 09 09 09 09 20 20 20 22 52 75 6e  ; 17.....   "Run
bff0: 64 69 72 22 20 20 20 20 20 20 20 20 20 20 20 20  dir"            
c000: 3b 20 31 38 0a 09 09 09 09 20 20 20 22 48 6f 73  ; 18.....   "Hos
c010: 74 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t"              
c020: 3b 20 31 39 0a 09 09 09 09 20 20 20 22 43 70 75  ; 19.....   "Cpu
c030: 20 4c 6f 61 64 22 20 20 20 20 20 20 20 20 20 20   Load"          
c040: 3b 20 32 30 0a 09 09 09 09 20 20 20 29 29 29 0a  ; 20.....   ))).
c050: 09 20 28 72 65 73 75 6c 74 73 20 28 6c 69 73 74  . (results (list
c060: 20 72 75 6e 73 68 65 61 64 65 72 29 29 09 09 09   runsheader))...
c070: 20 0a 09 20 28 74 65 73 74 64 61 74 61 2d 68 65   .. (testdata-he
c080: 61 64 65 72 20 28 6c 69 73 74 20 22 52 75 6e 20  ader (list "Run 
c090: 49 64 22 20 22 54 65 73 74 6e 61 6d 65 22 20 22  Id" "Testname" "
c0a0: 49 74 65 6d 20 50 61 74 68 22 20 22 43 61 74 65  Item Path" "Cate
c0b0: 67 6f 72 79 22 20 22 56 61 72 69 61 62 6c 65 22  gory" "Variable"
c0c0: 20 22 56 61 6c 75 65 22 20 22 45 78 70 65 63 74   "Value" "Expect
c0d0: 65 64 22 20 22 54 6f 6c 22 20 22 55 6e 69 74 73  ed" "Tol" "Units
c0e0: 22 20 22 53 74 61 74 75 73 22 20 22 43 6f 6d 6d  " "Status" "Comm
c0f0: 65 6e 74 22 29 29 0a 09 20 28 6d 61 69 6e 71 72  ent")).. (mainqr
c100: 79 20 28 63 6f 6e 63 20 22 53 45 4c 45 43 54 0a  y (conc "SELECT.
c110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 2e                t.
c120: 74 65 73 74 6e 61 6d 65 2c 72 2e 69 64 2c 72 75  testname,r.id,ru
c130: 6e 6e 61 6d 65 2c 22 20 6b 65 79 73 73 74 72 20  nname," keysstr 
c140: 22 2c 74 2e 74 65 73 74 6e 61 6d 65 2c 0a 20 20  ",t.testname,.  
c150: 20 20 20 20 20 20 20 20 20 20 20 20 74 2e 69 74              t.it
c160: 65 6d 5f 70 61 74 68 2c 74 6d 2e 64 65 73 63 72  em_path,tm.descr
c170: 69 70 74 69 6f 6e 2c 74 2e 73 74 61 74 65 2c 74  iption,t.state,t
c180: 2e 73 74 61 74 75 73 2c 0a 20 20 20 20 20 20 20  .status,.       
c190: 20 20 20 20 20 20 20 66 69 6e 61 6c 5f 6c 6f 67         final_log
c1a0: 66 2c 72 75 6e 5f 64 75 72 61 74 69 6f 6e 2c 20  f,run_duration, 
c1b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
c1c0: 74 72 66 74 69 6d 65 28 27 25 6d 2f 25 64 2f 25  trftime('%m/%d/%
c1d0: 59 20 25 48 3a 25 4d 3a 25 53 27 2c 64 61 74 65  Y %H:%M:%S',date
c1e0: 74 69 6d 65 28 74 2e 65 76 65 6e 74 5f 74 69 6d  time(t.event_tim
c1f0: 65 2c 27 75 6e 69 78 65 70 6f 63 68 27 29 2c 27  e,'unixepoch'),'
c200: 6c 6f 63 61 6c 74 69 6d 65 27 29 2c 0a 20 20 20  localtime'),.   
c210: 20 20 20 20 20 20 20 20 20 20 20 74 6d 2e 74 61             tm.ta
c220: 67 73 2c 72 2e 6f 77 6e 65 72 2c 74 2e 63 6f 6d  gs,r.owner,t.com
c230: 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20  ment,.          
c240: 20 20 20 20 61 75 74 68 6f 72 2c 0a 20 20 20 20      author,.    
c250: 20 20 20 20 20 20 20 20 20 20 74 6d 2e 6f 77 6e            tm.own
c260: 65 72 2c 72 65 76 69 65 77 65 64 2c 0a 20 20 20  er,reviewed,.   
c270: 20 20 20 20 20 20 20 20 20 20 20 64 69 73 6b 66             diskf
c280: 72 65 65 2c 75 6e 61 6d 65 2c 72 75 6e 64 69 72  ree,uname,rundir
c290: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c2a0: 68 6f 73 74 2c 63 70 75 6c 6f 61 64 0a 20 20 20  host,cpuload.   
c2b0: 20 20 20 20 20 20 20 20 20 46 52 4f 4d 20 74 65           FROM te
c2c0: 73 74 73 20 41 53 20 74 20 4a 4f 49 4e 20 72 75  sts AS t JOIN ru
c2d0: 6e 73 20 41 53 20 72 20 4f 4e 20 74 2e 72 75 6e  ns AS r ON t.run
c2e0: 5f 69 64 3d 72 2e 69 64 20 4a 4f 49 4e 20 74 65  _id=r.id JOIN te
c2f0: 73 74 5f 6d 65 74 61 20 41 53 20 74 6d 20 4f 4e  st_meta AS tm ON
c300: 20 74 6d 2e 74 65 73 74 6e 61 6d 65 3d 74 2e 74   tm.testname=t.t
c310: 65 73 74 6e 61 6d 65 0a 20 20 20 20 20 20 20 20  estname.        
c320: 20 20 20 20 57 48 45 52 45 20 72 75 6e 6e 61 6d      WHERE runnam
c330: 65 20 4c 49 4b 45 20 3f 20 41 4e 44 20 22 20 6b  e LIKE ? AND " k
c340: 65 79 71 72 79 20 22 3b 22 29 29 29 0a 20 20 20  eyqry ";"))).   
c350: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 32 20   (debug:print 2 
c360: 22 55 73 69 6e 67 20 22 20 74 65 6d 70 64 69 72  "Using " tempdir
c370: 20 22 20 66 6f 72 20 63 6f 6e 73 74 72 75 63 74   " for construct
c380: 69 6e 67 20 74 68 65 20 6f 64 73 20 66 69 6c 65  ing the ods file
c390: 2e 20 6b 65 79 71 72 79 3a 20 22 20 6b 65 79 71  . keyqry: " keyq
c3a0: 72 79 20 22 20 6b 65 79 73 74 72 3a 20 22 20 6b  ry " keystr: " k
c3b0: 65 79 73 73 74 72 20 22 20 77 69 74 68 20 6b 65  eysstr " with ke
c3c0: 79 73 3a 20 22 20 28 6d 61 70 20 63 61 64 72 20  ys: " (map cadr 
c3d0: 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 29 0a 09  keypatt-alist)..
c3e0: 09 20 22 5c 6e 20 20 20 20 20 20 6d 61 69 6e 71  . "\n      mainq
c3f0: 72 79 3a 20 22 20 6d 61 69 6e 71 72 79 29 0a 20  ry: " mainqry). 
c400: 20 20 20 3b 3b 20 22 45 78 70 65 63 74 65 64 20     ;; "Expected 
c410: 56 61 6c 75 65 22 0a 20 20 20 20 3b 3b 20 22 56  Value".    ;; "V
c420: 61 6c 75 65 20 46 6f 75 6e 64 22 0a 20 20 20 20  alue Found".    
c430: 3b 3b 20 22 54 6f 6c 65 72 61 6e 63 65 22 0a 20  ;; "Tolerance". 
c440: 20 20 20 28 61 70 70 6c 79 20 73 71 6c 69 74 65     (apply sqlite
c450: 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 09  3:for-each-row..
c460: 20 20 20 28 6c 61 6d 62 64 61 20 28 74 65 73 74     (lambda (test
c470: 2d 69 64 20 2e 20 62 29 0a 09 20 20 20 20 20 28  -id . b)..     (
c480: 73 65 74 21 20 74 65 73 74 2d 69 64 73 20 28 63  set! test-ids (c
c490: 6f 6e 73 20 74 65 73 74 2d 69 64 20 74 65 73 74  ons test-id test
c4a0: 2d 69 64 73 29 29 20 20 20 3b 3b 20 74 65 73 74  -ids))   ;; test
c4b0: 2d 69 64 20 69 73 20 6e 6f 77 20 74 65 73 74 6e  -id is now testn
c4c0: 61 6d 65 0a 09 20 20 20 20 20 28 73 65 74 21 20  ame..     (set! 
c4d0: 72 65 73 75 6c 74 73 20 28 61 70 70 65 6e 64 20  results (append 
c4e0: 72 65 73 75 6c 74 73 20 3b 3b 20 6e 6f 74 65 2c  results ;; note,
c4f0: 20 64 72 6f 70 20 74 68 65 20 74 65 73 74 2d 69   drop the test-i
c500: 64 0a 09 09 09 09 20 20 20 28 6c 69 73 74 0a 09  d.....   (list..
c510: 09 09 09 20 20 20 20 28 69 66 20 70 61 74 68 6d  ...    (if pathm
c520: 6f 64 0a 09 09 09 09 09 28 6c 65 74 2a 20 28 28  od......(let* ((
c530: 76 62 20 20 20 20 20 20 20 20 28 61 70 70 6c 79  vb        (apply
c540: 20 76 65 63 74 6f 72 20 62 29 29 0a 09 09 09 09   vector b)).....
c550: 09 20 20 20 20 20 20 20 28 6b 65 79 76 61 6c 73  .       (keyvals
c560: 20 20 20 28 6c 65 74 20 6c 6f 6f 70 20 28 28 69     (let loop ((i
c570: 20 20 20 20 30 29 0a 09 09 09 09 09 09 09 09 20      0)......... 
c580: 20 20 20 20 28 72 65 73 20 27 28 29 29 29 0a 09      (res '()))..
c590: 09 09 09 09 09 09 20 20 20 20 28 69 66 20 28 3e  ......    (if (>
c5a0: 3d 20 69 20 6e 75 6d 6b 65 79 73 29 0a 09 09 09  = i numkeys)....
c5b0: 09 09 09 09 09 72 65 73 0a 09 09 09 09 09 09 09  .....res........
c5c0: 09 28 6c 6f 6f 70 20 28 2b 20 69 20 31 29 0a 09  .(loop (+ i 1)..
c5d0: 09 09 09 09 09 09 09 20 20 20 20 20 20 28 61 70  .......      (ap
c5e0: 70 65 6e 64 20 72 65 73 20 28 6c 69 73 74 20 28  pend res (list (
c5f0: 76 65 63 74 6f 72 2d 72 65 66 20 76 62 20 28 2b  vector-ref vb (+
c600: 20 69 20 32 29 29 29 29 29 29 29 29 0a 09 09 09   i 2))))))))....
c610: 09 09 20 20 20 20 20 20 20 28 72 75 6e 6e 61 6d  ..       (runnam
c620: 65 20 20 20 28 76 65 63 74 6f 72 2d 72 65 66 20  e   (vector-ref 
c630: 76 62 20 31 29 29 0a 09 09 09 09 09 20 20 20 20  vb 1))......    
c640: 20 20 20 28 74 65 73 74 6e 61 6d 65 20 20 28 76     (testname  (v
c650: 65 63 74 6f 72 2d 72 65 66 20 76 62 20 28 2b 20  ector-ref vb (+ 
c660: 20 32 20 6e 75 6d 6b 65 79 73 29 29 29 0a 09 09   2 numkeys)))...
c670: 09 09 09 20 20 20 20 20 20 20 28 69 74 65 6d 2d  ...       (item-
c680: 70 61 74 68 20 28 76 65 63 74 6f 72 2d 72 65 66  path (vector-ref
c690: 20 76 62 20 28 2b 20 20 33 20 6e 75 6d 6b 65 79   vb (+  3 numkey
c6a0: 73 29 29 29 0a 09 09 09 09 09 20 20 20 20 20 20  s)))......      
c6b0: 20 28 66 69 6e 61 6c 2d 6c 6f 67 20 28 76 65 63   (final-log (vec
c6c0: 74 6f 72 2d 72 65 66 20 76 62 20 28 2b 20 20 37  tor-ref vb (+  7
c6d0: 20 6e 75 6d 6b 65 79 73 29 29 29 0a 09 09 09 09   numkeys))).....
c6e0: 09 20 20 20 20 20 20 20 28 72 75 6e 2d 64 69 72  .       (run-dir
c6f0: 20 20 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76     (vector-ref v
c700: 62 20 28 2b 20 31 38 20 6e 75 6d 6b 65 79 73 29  b (+ 18 numkeys)
c710: 29 29 0a 09 09 09 09 09 20 20 20 20 20 20 20 28  ))......       (
c720: 6c 6f 67 2d 66 70 61 74 68 20 28 63 6f 6e 63 20  log-fpath (conc 
c730: 72 75 6e 2d 64 69 72 20 22 2f 22 20 20 66 69 6e  run-dir "/"  fin
c740: 61 6c 2d 6c 6f 67 29 29 29 20 3b 3b 20 28 73 74  al-log))) ;; (st
c750: 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65  ring-intersperse
c760: 20 6b 65 79 76 61 6c 73 20 22 2f 22 29 20 22 2f   keyvals "/") "/
c770: 22 20 74 65 73 74 6e 61 6d 65 20 22 2f 22 20 69  " testname "/" i
c780: 74 65 6d 2d 70 61 74 68 20 22 2f 22 0a 09 09 09  tem-path "/"....
c790: 09 09 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74  ..  (debug:print
c7a0: 20 34 20 22 6c 6f 67 3a 20 22 20 6c 6f 67 2d 66   4 "log: " log-f
c7b0: 70 61 74 68 20 22 20 65 78 69 73 74 73 3a 20 22  path " exists: "
c7c0: 20 28 66 69 6c 65 2d 65 78 69 73 74 73 3f 20 6c   (file-exists? l
c7d0: 6f 67 2d 66 70 61 74 68 29 29 0a 09 09 09 09 09  og-fpath))......
c7e0: 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 76    (vector-set! v
c7f0: 62 20 28 2b 20 37 20 6e 75 6d 6b 65 79 73 29 20  b (+ 7 numkeys) 
c800: 28 69 66 20 28 66 69 6c 65 2d 65 78 69 73 74 73  (if (file-exists
c810: 3f 20 6c 6f 67 2d 66 70 61 74 68 29 0a 09 09 09  ? log-fpath)....
c820: 09 09 09 09 09 09 20 20 20 20 28 6c 65 74 20 28  ......    (let (
c830: 28 6e 65 77 70 61 74 68 20 28 63 6f 6e 63 20 70  (newpath (conc p
c840: 61 74 68 6d 6f 64 20 22 2f 22 0a 09 09 09 09 09  athmod "/"......
c850: 09 09 09 09 09 09 09 20 28 73 74 72 69 6e 67 2d  ....... (string-
c860: 69 6e 74 65 72 73 70 65 72 73 65 20 6b 65 79 76  intersperse keyv
c870: 61 6c 73 20 22 2f 22 29 0a 09 09 09 09 09 09 09  als "/")........
c880: 09 09 09 09 09 20 22 2f 22 20 72 75 6e 6e 61 6d  ..... "/" runnam
c890: 65 20 22 2f 22 20 74 65 73 74 6e 61 6d 65 20 22  e "/" testname "
c8a0: 2f 22 0a 09 09 09 09 09 09 09 09 09 09 09 09 20  /"............. 
c8b0: 28 69 66 20 28 73 74 72 69 6e 67 3d 3f 20 69 74  (if (string=? it
c8c0: 65 6d 2d 70 61 74 68 20 22 22 29 20 22 22 20 28  em-path "") "" (
c8d0: 63 6f 6e 63 20 22 2f 22 20 69 74 65 6d 2d 70 61  conc "/" item-pa
c8e0: 74 68 29 29 0a 09 09 09 09 09 09 09 09 09 09 09  th))............
c8f0: 09 20 66 69 6e 61 6c 2d 6c 6f 67 29 29 29 0a 09  . final-log)))..
c900: 09 09 09 09 09 09 09 09 20 20 20 20 20 20 3b 3b  ........      ;;
c910: 20 66 6f 72 20 6e 6f 77 20 74 68 72 6f 77 20 61   for now throw a
c920: 77 61 79 20 6e 65 77 70 61 74 68 20 61 6e 64 20  way newpath and 
c930: 75 73 65 20 74 68 65 20 6c 6f 67 2d 66 70 61 74  use the log-fpat
c940: 68 20 63 6f 6e 63 27 64 20 77 69 74 68 20 70 61  h conc'd with pa
c950: 74 68 6d 6f 64 0a 09 09 09 09 09 09 09 09 09 20  thmod.......... 
c960: 20 20 20 20 20 28 73 65 74 21 20 6e 65 77 70 61       (set! newpa
c970: 74 68 20 28 63 6f 6e 63 20 70 61 74 68 6d 6f 64  th (conc pathmod
c980: 20 6c 6f 67 2d 66 70 61 74 68 29 29 0a 09 09 09   log-fpath))....
c990: 09 09 09 09 09 09 20 20 20 20 20 20 28 69 66 20  ......      (if 
c9a0: 77 69 6e 64 6f 77 73 20 28 73 74 72 69 6e 67 2d  windows (string-
c9b0: 74 72 61 6e 73 6c 61 74 65 20 6e 65 77 70 61 74  translate newpat
c9c0: 68 20 22 2f 22 20 22 5c 5c 22 29 20 6e 65 77 70  h "/" "\\") newp
c9d0: 61 74 68 29 29 0a 09 09 09 09 09 09 09 09 09 20  ath)).......... 
c9e0: 20 20 20 28 69 66 20 28 3e 20 2a 76 65 72 62 6f     (if (> *verbo
c9f0: 73 69 74 79 2a 20 31 29 0a 09 09 09 09 09 09 09  sity* 1)........
ca00: 09 09 09 28 63 6f 6e 63 20 66 69 6e 61 6c 2d 6c  ...(conc final-l
ca10: 6f 67 20 22 20 6e 6f 74 2d 66 6f 75 6e 64 22 29  og " not-found")
ca20: 0a 09 09 09 09 09 09 09 09 09 09 22 22 29 29 29  ..........."")))
ca30: 0a 09 09 09 09 09 20 20 28 76 65 63 74 6f 72 2d  ......  (vector-
ca40: 3e 6c 69 73 74 20 76 62 29 29 0a 09 09 09 09 09  >list vb))......
ca50: 62 29 29 29 29 29 0a 09 20 20 20 64 62 0a 09 20  b)))))..   db.. 
ca60: 20 20 6d 61 69 6e 71 72 79 0a 09 20 20 20 72 75    mainqry..   ru
ca70: 6e 73 70 61 74 74 20 28 6d 61 70 20 63 61 64 72  nspatt (map cadr
ca80: 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 29 29   keypatt-alist))
ca90: 0a 20 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e  .    (debug:prin
caa0: 74 20 32 20 22 46 6f 75 6e 64 20 22 20 28 6c 65  t 2 "Found " (le
cab0: 6e 67 74 68 20 74 65 73 74 2d 69 64 73 29 20 22  ngth test-ids) "
cac0: 20 72 65 63 6f 72 64 73 22 29 0a 20 20 20 20 28   records").    (
cad0: 73 65 74 21 20 72 65 73 75 6c 74 73 20 28 6c 69  set! results (li
cae0: 73 74 20 28 63 6f 6e 73 20 22 52 75 6e 73 22 20  st (cons "Runs" 
caf0: 72 65 73 75 6c 74 73 29 29 29 0a 20 20 20 20 3b  results))).    ;
cb00: 3b 20 6e 6f 77 2c 20 66 6f 72 20 65 61 63 68 20  ; now, for each 
cb10: 74 65 73 74 2c 20 63 6f 6c 6c 65 63 74 20 74 68  test, collect th
cb20: 65 20 74 65 73 74 5f 64 61 74 61 20 69 6e 66 6f  e test_data info
cb30: 20 61 6e 64 20 61 64 64 20 61 20 6e 65 77 20 73   and add a new s
cb40: 68 65 65 74 0a 20 20 20 20 28 66 6f 72 2d 65 61  heet.    (for-ea
cb50: 63 68 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20  ch.     (lambda 
cb60: 28 74 65 73 74 2d 69 64 29 0a 20 20 20 20 20 20  (test-id).      
cb70: 20 28 6c 65 74 20 28 28 74 65 73 74 2d 64 61 74   (let ((test-dat
cb80: 61 20 28 6c 69 73 74 20 74 65 73 74 64 61 74 61  a (list testdata
cb90: 2d 68 65 61 64 65 72 29 29 0a 09 20 20 20 20 20  -header))..     
cba0: 28 63 75 72 72 2d 74 65 73 74 2d 6e 61 6d 65 20  (curr-test-name 
cbb0: 23 66 29 29 0a 09 20 28 73 71 6c 69 74 65 33 3a  #f)).. (sqlite3:
cbc0: 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 09 20 20  for-each-row..  
cbd0: 28 6c 61 6d 62 64 61 20 28 72 75 6e 2d 69 64 20  (lambda (run-id 
cbe0: 74 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61  testname item-pa
cbf0: 74 68 20 63 61 74 65 67 6f 72 79 20 76 61 72 69  th category vari
cc00: 61 62 6c 65 20 76 61 6c 75 65 20 65 78 70 65 63  able value expec
cc10: 74 65 64 20 74 6f 6c 20 75 6e 69 74 73 20 73 74  ted tol units st
cc20: 61 74 75 73 20 63 6f 6d 6d 65 6e 74 29 0a 09 20  atus comment).. 
cc30: 20 20 20 28 73 65 74 21 20 63 75 72 72 2d 74 65     (set! curr-te
cc40: 73 74 2d 6e 61 6d 65 20 74 65 73 74 6e 61 6d 65  st-name testname
cc50: 29 0a 09 20 20 20 20 28 73 65 74 21 20 74 65 73  )..    (set! tes
cc60: 74 2d 64 61 74 61 20 28 61 70 70 65 6e 64 20 74  t-data (append t
cc70: 65 73 74 2d 64 61 74 61 20 28 6c 69 73 74 20 28  est-data (list (
cc80: 6c 69 73 74 20 72 75 6e 2d 69 64 20 74 65 73 74  list run-id test
cc90: 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 63  name item-path c
cca0: 61 74 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65  ategory variable
ccb0: 20 76 61 6c 75 65 20 65 78 70 65 63 74 65 64 20   value expected 
ccc0: 74 6f 6c 20 75 6e 69 74 73 20 73 74 61 74 75 73  tol units status
ccd0: 20 63 6f 6d 6d 65 6e 74 29 29 29 29 29 0a 09 20   comment))))).. 
cce0: 20 64 62 20 0a 09 20 20 3b 3b 20 22 53 45 4c 45   db ..  ;; "SELE
ccf0: 43 54 20 72 75 6e 5f 69 64 2c 74 65 73 74 6e 61  CT run_id,testna
cd00: 6d 65 2c 69 74 65 6d 5f 70 61 74 68 2c 63 61 74  me,item_path,cat
cd10: 65 67 6f 72 79 2c 76 61 72 69 61 62 6c 65 2c 74  egory,variable,t
cd20: 64 2e 76 61 6c 75 65 20 41 53 20 76 61 6c 75 65  d.value AS value
cd30: 2c 65 78 70 65 63 74 65 64 2c 74 6f 6c 2c 75 6e  ,expected,tol,un
cd40: 69 74 73 2c 74 64 2e 73 74 61 74 75 73 20 41 53  its,td.status AS
cd50: 20 73 74 61 74 75 73 2c 74 64 2e 63 6f 6d 6d 65   status,td.comme
cd60: 6e 74 20 41 53 20 63 6f 6d 6d 65 6e 74 20 46 52  nt AS comment FR
cd70: 4f 4d 20 74 65 73 74 5f 64 61 74 61 20 41 53 20  OM test_data AS 
cd80: 74 64 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 74 65  td INNER JOIN te
cd90: 73 74 73 20 4f 4e 20 74 65 73 74 73 2e 69 64 3d  sts ON tests.id=
cda0: 74 64 2e 74 65 73 74 5f 69 64 20 57 48 45 52 45  td.test_id WHERE
cdb0: 20 74 65 73 74 5f 69 64 3d 3f 3b 22 0a 09 20 20   test_id=?;"..  
cdc0: 22 53 45 4c 45 43 54 20 72 75 6e 5f 69 64 2c 74  "SELECT run_id,t
cdd0: 65 73 74 6e 61 6d 65 2c 69 74 65 6d 5f 70 61 74  estname,item_pat
cde0: 68 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 69 61  h,category,varia
cdf0: 62 6c 65 2c 74 64 2e 76 61 6c 75 65 20 41 53 20  ble,td.value AS 
ce00: 76 61 6c 75 65 2c 74 64 2e 65 78 70 65 63 74 65  value,td.expecte
ce10: 64 2c 74 64 2e 74 6f 6c 2c 74 64 2e 75 6e 69 74  d,td.tol,td.unit
ce20: 73 2c 74 64 2e 73 74 61 74 75 73 20 41 53 20 73  s,td.status AS s
ce30: 74 61 74 75 73 2c 74 64 2e 63 6f 6d 6d 65 6e 74  tatus,td.comment
ce40: 20 41 53 20 63 6f 6d 6d 65 6e 74 20 46 52 4f 4d   AS comment FROM
ce50: 20 74 65 73 74 5f 64 61 74 61 20 41 53 20 74 64   test_data AS td
ce60: 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 74 65 73 74   INNER JOIN test
ce70: 73 20 4f 4e 20 74 65 73 74 73 2e 69 64 3d 74 64  s ON tests.id=td
ce80: 2e 74 65 73 74 5f 69 64 20 57 48 45 52 45 20 74  .test_id WHERE t
ce90: 65 73 74 6e 61 6d 65 3d 3f 3b 22 0a 09 20 20 74  estname=?;"..  t
cea0: 65 73 74 2d 69 64 29 0a 09 20 28 69 66 20 63 75  est-id).. (if cu
ceb0: 72 72 2d 74 65 73 74 2d 6e 61 6d 65 0a 09 20 20  rr-test-name..  
cec0: 20 20 20 28 73 65 74 21 20 72 65 73 75 6c 74 73     (set! results
ced0: 20 28 61 70 70 65 6e 64 20 72 65 73 75 6c 74 73   (append results
cee0: 20 28 6c 69 73 74 20 28 63 6f 6e 73 20 63 75 72   (list (cons cur
cef0: 72 2d 74 65 73 74 2d 6e 61 6d 65 20 74 65 73 74  r-test-name test
cf00: 2d 64 61 74 61 29 29 29 29 29 0a 09 20 29 29 0a  -data))))).. )).
cf10: 20 20 20 20 20 28 73 6f 72 74 20 28 64 65 6c 65       (sort (dele
cf20: 74 65 2d 64 75 70 6c 69 63 61 74 65 73 20 74 65  te-duplicates te
cf30: 73 74 2d 69 64 73 29 20 73 74 72 69 6e 67 3c 3d  st-ids) string<=
cf40: 29 29 0a 20 20 20 20 28 73 79 73 74 65 6d 20 28  )).    (system (
cf50: 63 6f 6e 63 20 22 6d 6b 64 69 72 20 2d 70 20 22  conc "mkdir -p "
cf60: 20 74 65 6d 70 64 69 72 29 29 0a 20 20 20 20 3b   tempdir)).    ;
cf70: 3b 20 28 70 70 20 72 65 73 75 6c 74 73 29 0a 20  ; (pp results). 
cf80: 20 20 20 28 6f 64 73 3a 6c 69 73 74 2d 3e 6f 64     (ods:list->od
cf90: 73 20 0a 20 20 20 20 20 74 65 6d 70 64 69 72 0a  s .     tempdir.
cfa0: 20 20 20 20 20 28 69 66 20 28 73 74 72 69 6e 67       (if (string
cfb0: 2d 6d 61 74 63 68 20 28 72 65 67 65 78 70 20 22  -match (regexp "
cfc0: 5e 5b 2f 7e 5d 2b 2e 2a 22 29 20 6f 75 74 70 75  ^[/~]+.*") outpu
cfd0: 74 66 69 6c 65 29 20 3b 3b 20 66 75 6c 6c 20 70  tfile) ;; full p
cfe0: 61 74 68 3f 0a 09 20 6f 75 74 70 75 74 66 69 6c  ath?.. outputfil
cff0: 65 0a 09 20 28 62 65 67 69 6e 0a 09 20 20 20 28  e.. (begin..   (
d000: 64 65 62 75 67 3a 70 72 69 6e 74 20 30 20 22 57  debug:print 0 "W
d010: 41 52 4e 49 4e 47 3a 20 70 61 74 68 20 67 69 76  ARNING: path giv
d020: 65 6e 2c 20 22 20 6f 75 74 70 75 74 66 69 6c 65  en, " outputfile
d030: 20 22 20 69 73 20 72 65 6c 61 74 69 76 65 2c 20   " is relative, 
d040: 70 72 65 66 69 78 69 6e 67 20 77 69 74 68 20 63  prefixing with c
d050: 75 72 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79  urrent directory
d060: 22 29 0a 09 20 20 20 28 63 6f 6e 63 20 28 63 75  ")..   (conc (cu
d070: 72 72 65 6e 74 2d 64 69 72 65 63 74 6f 72 79 29  rrent-directory)
d080: 20 22 2f 22 20 6f 75 74 70 75 74 66 69 6c 65 29   "/" outputfile)
d090: 29 29 0a 20 20 20 20 20 72 65 73 75 6c 74 73 29  )).     results)
d0a0: 0a 20 20 20 20 3b 3b 20 62 72 75 74 61 6c 20 63  .    ;; brutal c
d0b0: 6c 65 61 6e 20 75 70 0a 20 20 20 20 28 73 79 73  lean up.    (sys
d0c0: 74 65 6d 20 22 72 6d 20 2d 72 66 20 74 65 6d 70  tem "rm -rf temp
d0d0: 64 69 72 22 29 29 29 0a 0a 3b 3b 20 28 64 62 3a  dir")))..;; (db:
d0e0: 65 78 74 72 61 63 74 2d 6f 64 73 2d 66 69 6c 65  extract-ods-file
d0f0: 20 64 62 20 22 6f 75 74 70 75 74 66 69 6c 65 2e   db "outputfile.
d100: 6f 64 73 22 20 27 28 28 22 73 79 73 6e 61 6d 65  ods" '(("sysname
d110: 22 20 22 25 22 29 28 22 66 73 6e 61 6d 65 22 20  " "%")("fsname" 
d120: 22 25 22 29 28 22 64 61 74 61 70 61 74 68 22 20  "%")("datapath" 
d130: 22 25 22 29 29 20 22 25 22 29 0a 0a 0a 3b 3b 3d  "%")) "%")...;;=
d140: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
d150: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
d160: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
d170: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
d180: 3d 3d 3d 3d 3d 0a 3b 3b 20 52 45 4d 4f 54 45 20  =====.;; REMOTE 
d190: 44 42 20 41 43 43 45 53 53 20 56 49 41 20 52 50  DB ACCESS VIA RP
d1a0: 43 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  C.;;============
d1b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
d1c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
d1d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
d1e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65 66  ==========..(def
d1f0: 69 6e 65 20 28 72 64 62 3a 73 65 74 2d 74 65 73  ine (rdb:set-tes
d200: 74 73 2d 73 74 61 74 65 2d 73 74 61 74 75 73 20  ts-state-status 
d210: 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61  db run-id testna
d220: 6d 65 73 20 63 75 72 72 73 74 61 74 65 20 63 75  mes currstate cu
d230: 72 72 73 74 61 74 75 73 20 6e 65 77 73 74 61 74  rrstatus newstat
d240: 65 20 6e 65 77 73 74 61 74 75 73 29 0a 20 20 28  e newstatus).  (
d250: 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20  if *runremote*. 
d260: 20 20 20 20 20 28 6c 65 74 20 28 28 68 6f 73 74       (let ((host
d270: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75   (vector-ref *ru
d280: 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20  nremote* 0))..  
d290: 20 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72 2d    (port (vector-
d2a0: 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20  ref *runremote* 
d2b0: 31 29 29 29 0a 09 28 28 72 70 63 3a 70 72 6f 63  1)))..((rpc:proc
d2c0: 65 64 75 72 65 20 27 72 64 62 3a 73 65 74 2d 74  edure 'rdb:set-t
d2d0: 65 73 74 73 2d 73 74 61 74 65 2d 73 74 61 74 75  ests-state-statu
d2e0: 73 20 68 6f 73 74 20 70 6f 72 74 29 0a 09 20 72  s host port).. r
d2f0: 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 73 20  un-id testnames 
d300: 63 75 72 72 73 74 61 74 65 20 63 75 72 72 73 74  currstate currst
d310: 61 74 75 73 20 6e 65 77 73 74 61 74 65 20 6e 65  atus newstate ne
d320: 77 73 74 61 74 75 73 29 29 0a 20 20 20 20 20 20  wstatus)).      
d330: 28 64 62 3a 73 65 74 2d 74 65 73 74 73 2d 73 74  (db:set-tests-st
d340: 61 74 65 2d 73 74 61 74 75 73 20 64 62 20 72 75  ate-status db ru
d350: 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 73 20 63  n-id testnames c
d360: 75 72 72 73 74 61 74 65 20 63 75 72 72 73 74 61  urrstate currsta
d370: 74 75 73 20 6e 65 77 73 74 61 74 65 20 6e 65 77  tus newstate new
d380: 73 74 61 74 75 73 29 29 29 0a 0a 28 64 65 66 69  status)))..(defi
d390: 6e 65 20 28 72 64 62 3a 74 65 73 74 73 74 65 70  ne (rdb:teststep
d3a0: 2d 73 65 74 2d 73 74 61 74 75 73 21 20 64 62 20  -set-status! db 
d3b0: 74 65 73 74 2d 69 64 20 74 65 73 74 73 74 65 70  test-id teststep
d3c0: 2d 6e 61 6d 65 20 73 74 61 74 65 2d 69 6e 20 73  -name state-in s
d3d0: 74 61 74 75 73 2d 69 6e 20 69 74 65 6d 64 61 74  tatus-in itemdat
d3e0: 20 63 6f 6d 6d 65 6e 74 20 6c 6f 67 66 69 6c 65   comment logfile
d3f0: 29 0a 20 20 28 6c 65 74 20 28 28 69 74 65 6d 2d  ).  (let ((item-
d400: 70 61 74 68 20 28 69 74 65 6d 2d 6c 69 73 74 2d  path (item-list-
d410: 3e 70 61 74 68 20 69 74 65 6d 64 61 74 29 29 29  >path itemdat)))
d420: 0a 20 20 20 20 28 69 66 20 2a 72 75 6e 72 65 6d  .    (if *runrem
d430: 6f 74 65 2a 0a 09 28 6c 65 74 20 28 28 68 6f 73  ote*..(let ((hos
d440: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72  t (vector-ref *r
d450: 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20  unremote* 0)).. 
d460: 20 20 20 20 20 28 70 6f 72 74 20 28 76 65 63 74       (port (vect
d470: 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74  or-ref *runremot
d480: 65 2a 20 31 29 29 29 0a 09 20 20 28 28 72 70 63  e* 1)))..  ((rpc
d490: 3a 70 72 6f 63 65 64 75 72 65 20 27 72 64 62 3a  :procedure 'rdb:
d4a0: 74 65 73 74 73 74 65 70 2d 73 65 74 2d 73 74 61  teststep-set-sta
d4b0: 74 75 73 21 20 68 6f 73 74 20 70 6f 72 74 29 0a  tus! host port).
d4c0: 09 20 20 20 74 65 73 74 2d 69 64 20 74 65 73 74  .   test-id test
d4d0: 73 74 65 70 2d 6e 61 6d 65 20 73 74 61 74 65 2d  step-name state-
d4e0: 69 6e 20 73 74 61 74 75 73 2d 69 6e 20 69 74 65  in status-in ite
d4f0: 6d 2d 70 61 74 68 20 63 6f 6d 6d 65 6e 74 20 6c  m-path comment l
d500: 6f 67 66 69 6c 65 29 29 0a 09 28 64 62 3a 74 65  ogfile))..(db:te
d510: 73 74 73 74 65 70 2d 73 65 74 2d 73 74 61 74 75  ststep-set-statu
d520: 73 21 20 64 62 20 74 65 73 74 2d 69 64 20 74 65  s! db test-id te
d530: 73 74 73 74 65 70 2d 6e 61 6d 65 20 73 74 61 74  ststep-name stat
d540: 65 2d 69 6e 20 73 74 61 74 75 73 2d 69 6e 20 69  e-in status-in i
d550: 74 65 6d 2d 70 61 74 68 20 63 6f 6d 6d 65 6e 74  tem-path comment
d560: 20 6c 6f 67 66 69 6c 65 29 29 29 29 0a 0a 28 64   logfile))))..(d
d570: 65 66 69 6e 65 20 28 72 64 62 3a 74 65 73 74 2d  efine (rdb:test-
d580: 75 70 64 61 74 65 2d 6d 65 74 61 2d 69 6e 66 6f  update-meta-info
d590: 20 64 62 20 74 65 73 74 2d 69 64 20 6d 69 6e 75   db test-id minu
d5a0: 74 65 73 20 63 70 75 6c 6f 61 64 20 64 69 73 6b  tes cpuload disk
d5b0: 66 72 65 65 20 74 6d 70 66 72 65 65 29 0a 20 20  free tmpfree).  
d5c0: 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a  (if *runremote*.
d5d0: 20 20 20 20 20 20 28 6c 65 74 20 28 28 68 6f 73        (let ((hos
d5e0: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72  t (vector-ref *r
d5f0: 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20  unremote* 0)).. 
d600: 20 20 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72     (port (vector
d610: 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a  -ref *runremote*
d620: 20 31 29 29 29 0a 09 28 28 72 70 63 3a 70 72 6f   1)))..((rpc:pro
d630: 63 65 64 75 72 65 20 27 72 64 62 3a 74 65 73 74  cedure 'rdb:test
d640: 2d 75 70 64 61 74 65 2d 6d 65 74 61 2d 69 6e 66  -update-meta-inf
d650: 6f 20 68 6f 73 74 20 70 6f 72 74 29 0a 09 20 74  o host port).. t
d660: 65 73 74 2d 69 64 20 6d 69 6e 75 74 65 73 20 63  est-id minutes c
d670: 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20  puload diskfree 
d680: 74 6d 70 66 72 65 65 29 29 0a 20 20 20 20 20 20  tmpfree)).      
d690: 28 64 62 3a 74 65 73 74 2d 75 70 64 61 74 65 2d  (db:test-update-
d6a0: 6d 65 74 61 2d 69 6e 66 6f 20 64 62 20 74 65 73  meta-info db tes
d6b0: 74 2d 69 64 20 6d 69 6e 75 74 65 73 20 63 70 75  t-id minutes cpu
d6c0: 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20 74 6d  load diskfree tm
d6d0: 70 66 72 65 65 29 29 29 0a 0a 28 64 65 66 69 6e  pfree)))..(defin
d6e0: 65 20 28 72 64 62 3a 74 65 73 74 2d 73 65 74 2d  e (rdb:test-set-
d6f0: 73 74 61 74 65 2d 73 74 61 74 75 73 2d 62 79 2d  state-status-by-
d700: 72 75 6e 2d 69 64 2d 74 65 73 74 6e 61 6d 65 20  run-id-testname 
d710: 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e  db run-id test-n
d720: 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 73 74  ame item-path st
d730: 61 74 75 73 20 73 74 61 74 65 29 0a 20 20 28 69  atus state).  (i
d740: 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20  f *runremote*.  
d750: 20 20 20 20 28 6c 65 74 20 28 28 68 6f 73 74 20      (let ((host 
d760: 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e  (vector-ref *run
d770: 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20 20  remote* 0))..   
d780: 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72 2d 72   (port (vector-r
d790: 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31  ef *runremote* 1
d7a0: 29 29 29 0a 09 28 28 72 70 63 3a 70 72 6f 63 65  )))..((rpc:proce
d7b0: 64 75 72 65 20 27 72 64 62 3a 74 65 73 74 2d 73  dure 'rdb:test-s
d7c0: 65 74 2d 73 74 61 74 65 2d 73 74 61 74 75 73 2d  et-state-status-
d7d0: 62 79 2d 72 75 6e 2d 69 64 2d 74 65 73 74 6e 61  by-run-id-testna
d7e0: 6d 65 20 68 6f 73 74 20 70 6f 72 74 29 0a 09 20  me host port).. 
d7f0: 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d   run-id test-nam
d800: 65 20 69 74 65 6d 2d 70 61 74 68 20 73 74 61 74  e item-path stat
d810: 75 73 20 73 74 61 74 65 29 29 0a 20 20 20 20 20  us state)).     
d820: 20 28 64 62 3a 74 65 73 74 2d 73 65 74 2d 73 74   (db:test-set-st
d830: 61 74 65 2d 73 74 61 74 75 73 2d 62 79 2d 72 75  ate-status-by-ru
d840: 6e 2d 69 64 2d 74 65 73 74 6e 61 6d 65 20 64 62  n-id-testname db
d850: 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d   run-id test-nam
d860: 65 20 69 74 65 6d 2d 70 61 74 68 20 73 74 61 74  e item-path stat
d870: 75 73 20 73 74 61 74 65 29 29 29 0a 0a 28 64 65  us state)))..(de
d880: 66 69 6e 65 20 28 72 64 62 3a 63 73 76 2d 3e 74  fine (rdb:csv->t
d890: 65 73 74 2d 64 61 74 61 20 64 62 20 74 65 73 74  est-data db test
d8a0: 2d 69 64 20 63 73 76 64 61 74 61 29 0a 20 20 28  -id csvdata).  (
d8b0: 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20  if *runremote*. 
d8c0: 20 20 20 20 20 28 6c 65 74 20 28 28 68 6f 73 74       (let ((host
d8d0: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75   (vector-ref *ru
d8e0: 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20  nremote* 0))..  
d8f0: 20 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72 2d    (port (vector-
d900: 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20  ref *runremote* 
d910: 31 29 29 29 0a 09 28 28 72 70 63 3a 70 72 6f 63  1)))..((rpc:proc
d920: 65 64 75 72 65 20 27 72 64 62 3a 63 73 76 2d 3e  edure 'rdb:csv->
d930: 74 65 73 74 2d 64 61 74 61 20 68 6f 73 74 20 70  test-data host p
d940: 6f 72 74 29 0a 09 20 74 65 73 74 2d 69 64 20 63  ort).. test-id c
d950: 73 76 64 61 74 61 29 29 0a 20 20 20 20 20 20 28  svdata)).      (
d960: 64 62 3a 63 73 76 2d 3e 74 65 73 74 2d 64 61 74  db:csv->test-dat
d970: 61 20 64 62 20 74 65 73 74 2d 69 64 20 63 73 76  a db test-id csv
d980: 64 61 74 61 29 29 29 0a 0a 28 64 65 66 69 6e 65  data)))..(define
d990: 20 28 72 64 62 3a 72 6f 6c 6c 2d 75 70 2d 70 61   (rdb:roll-up-pa
d9a0: 73 73 2d 66 61 69 6c 2d 63 6f 75 6e 74 73 20 64  ss-fail-counts d
d9b0: 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61  b run-id test-na
d9c0: 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 73 74 61  me item-path sta
d9d0: 74 75 73 29 0a 20 20 28 69 66 20 2a 72 75 6e 72  tus).  (if *runr
d9e0: 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c 65  emote*.      (le
d9f0: 74 20 28 28 68 6f 73 74 20 28 76 65 63 74 6f 72  t ((host (vector
da00: 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a  -ref *runremote*
da10: 20 30 29 29 0a 09 20 20 20 20 28 70 6f 72 74 20   0))..    (port 
da20: 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e  (vector-ref *run
da30: 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28 28  remote* 1)))..((
da40: 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20 27 72  rpc:procedure 'r
da50: 64 62 3a 72 6f 6c 6c 2d 75 70 2d 70 61 73 73 2d  db:roll-up-pass-
da60: 66 61 69 6c 2d 63 6f 75 6e 74 73 20 68 6f 73 74  fail-counts host
da70: 20 70 6f 72 74 29 0a 09 20 72 75 6e 2d 69 64 20   port).. run-id 
da80: 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70  test-name item-p
da90: 61 74 68 20 73 74 61 74 75 73 29 29 0a 20 20 20  ath status)).   
daa0: 20 20 20 28 64 62 3a 72 6f 6c 6c 2d 75 70 2d 70     (db:roll-up-p
dab0: 61 73 73 2d 66 61 69 6c 2d 63 6f 75 6e 74 73 20  ass-fail-counts 
dac0: 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e  db run-id test-n
dad0: 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 73 74  ame item-path st
dae0: 61 74 75 73 29 29 29 0a 0a 28 64 65 66 69 6e 65  atus)))..(define
daf0: 20 28 72 64 62 3a 74 65 73 74 2d 73 65 74 2d 63   (rdb:test-set-c
db00: 6f 6d 6d 65 6e 74 20 64 62 20 74 65 73 74 2d 69  omment db test-i
db10: 64 20 63 6f 6d 6d 65 6e 74 29 0a 20 20 28 69 66  d comment).  (if
db20: 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20   *runremote*.   
db30: 20 20 20 28 6c 65 74 20 28 28 68 6f 73 74 20 28     (let ((host (
db40: 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72  vector-ref *runr
db50: 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20 20 20  emote* 0))..    
db60: 28 70 6f 72 74 20 28 76 65 63 74 6f 72 2d 72 65  (port (vector-re
db70: 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29  f *runremote* 1)
db80: 29 29 0a 09 28 28 72 70 63 3a 70 72 6f 63 65 64  ))..((rpc:proced
db90: 75 72 65 20 27 72 64 62 3a 74 65 73 74 2d 73 65  ure 'rdb:test-se
dba0: 74 2d 63 6f 6d 6d 65 6e 74 20 68 6f 73 74 20 70  t-comment host p
dbb0: 6f 72 74 29 0a 09 20 74 65 73 74 2d 69 64 20 63  ort).. test-id c
dbc0: 6f 6d 6d 65 6e 74 29 29 0a 20 20 20 20 20 20 28  omment)).      (
dbd0: 64 62 3a 74 65 73 74 2d 73 65 74 2d 63 6f 6d 6d  db:test-set-comm
dbe0: 65 6e 74 20 64 62 20 74 65 73 74 2d 69 64 20 63  ent db test-id c
dbf0: 6f 6d 6d 65 6e 74 29 29 29 0a 0a 28 64 65 66 69  omment)))..(defi
dc00: 6e 65 20 28 72 64 62 3a 74 65 73 74 2d 73 65 74  ne (rdb:test-set
dc10: 2d 6c 6f 67 21 20 64 62 20 74 65 73 74 2d 69 64  -log! db test-id
dc20: 20 6c 6f 67 66 29 0a 20 20 28 69 66 20 2a 72 75   logf).  (if *ru
dc30: 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28  nremote*.      (
dc40: 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65 63 74  let ((host (vect
dc50: 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74  or-ref *runremot
dc60: 65 2a 20 30 29 29 0a 09 20 20 20 20 28 70 6f 72  e* 0))..    (por
dc70: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72  t (vector-ref *r
dc80: 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09  unremote* 1)))..
dc90: 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20  ((rpc:procedure 
dca0: 27 72 64 62 3a 74 65 73 74 2d 73 65 74 2d 6c 6f  'rdb:test-set-lo
dcb0: 67 21 20 68 6f 73 74 20 70 6f 72 74 29 20 74 65  g! host port) te
dcc0: 73 74 2d 69 64 20 6c 6f 67 66 29 29 0a 20 20 20  st-id logf)).   
dcd0: 20 20 20 28 64 62 3a 74 65 73 74 2d 73 65 74 2d     (db:test-set-
dce0: 6c 6f 67 21 20 64 62 20 74 65 73 74 2d 69 64 20  log! db test-id 
dcf0: 6c 6f 67 66 29 29 29 0a 0a 28 64 65 66 69 6e 65  logf)))..(define
dd00: 20 28 72 64 62 3a 67 65 74 2d 72 75 6e 73 20 64   (rdb:get-runs d
dd10: 62 20 72 75 6e 6e 61 6d 65 70 61 74 74 20 6e 75  b runnamepatt nu
dd20: 6d 72 75 6e 73 20 73 74 61 72 74 72 75 6e 6f 66  mruns startrunof
dd30: 66 73 65 74 20 6b 65 79 70 61 74 74 73 29 0a 20  fset keypatts). 
dd40: 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a   (if *runremote*
dd50: 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28 68 6f  .      (let ((ho
dd60: 73 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a  st (vector-ref *
dd70: 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09  runremote* 0))..
dd80: 20 20 20 20 28 70 6f 72 74 20 28 76 65 63 74 6f      (port (vecto
dd90: 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65  r-ref *runremote
dda0: 2a 20 31 29 29 29 0a 09 28 28 72 70 63 3a 70 72  * 1)))..((rpc:pr
ddb0: 6f 63 65 64 75 72 65 20 27 72 64 62 3a 67 65 74  ocedure 'rdb:get
ddc0: 2d 72 75 6e 73 20 68 6f 73 74 20 70 6f 72 74 29  -runs host port)
ddd0: 0a 09 20 72 75 6e 6e 61 6d 65 70 61 74 74 20 6e  .. runnamepatt n
dde0: 75 6d 72 75 6e 73 20 73 74 61 72 74 72 75 6e 6f  umruns startruno
ddf0: 66 66 73 65 74 20 6b 65 79 70 61 74 74 73 29 29  ffset keypatts))
de00: 0a 20 20 20 20 20 20 28 64 62 3a 67 65 74 2d 72  .      (db:get-r
de10: 75 6e 73 20 64 62 20 72 75 6e 6e 61 6d 65 70 61  uns db runnamepa
de20: 74 74 20 6e 75 6d 72 75 6e 73 20 73 74 61 72 74  tt numruns start
de30: 72 75 6e 6f 66 66 73 65 74 20 6b 65 79 70 61 74  runoffset keypat
de40: 74 73 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  ts)))..(define (
de50: 72 64 62 3a 67 65 74 2d 74 65 73 74 73 2d 66 6f  rdb:get-tests-fo
de60: 72 2d 72 75 6e 20 64 62 20 72 75 6e 2d 69 64 20  r-run db run-id 
de70: 74 65 73 74 70 61 74 74 20 69 74 65 6d 70 61 74  testpatt itempat
de80: 74 20 73 74 61 74 65 73 20 73 74 61 74 75 73 65  t states statuse
de90: 73 20 23 21 6b 65 79 20 28 6e 6f 74 2d 69 6e 20  s #!key (not-in 
dea0: 23 74 29 29 0a 20 20 28 69 66 20 2a 72 75 6e 72  #t)).  (if *runr
deb0: 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c 65  emote*.      (le
dec0: 74 20 28 28 68 6f 73 74 20 28 76 65 63 74 6f 72  t ((host (vector
ded0: 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a  -ref *runremote*
dee0: 20 30 29 29 0a 09 20 20 20 20 28 70 6f 72 74 20   0))..    (port 
def0: 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e  (vector-ref *run
df00: 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28 28  remote* 1)))..((
df10: 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20 27 72  rpc:procedure 'r
df20: 64 62 3a 67 65 74 2d 74 65 73 74 73 2d 66 6f 72  db:get-tests-for
df30: 2d 72 75 6e 20 68 6f 73 74 20 70 6f 72 74 29 0a  -run host port).
df40: 09 20 20 72 75 6e 2d 69 64 20 74 65 73 74 70 61  .  run-id testpa
df50: 74 74 20 69 74 65 6d 70 61 74 74 20 73 74 61 74  tt itempatt stat
df60: 65 73 20 73 74 61 74 75 73 65 73 20 6e 6f 74 2d  es statuses not-
df70: 69 6e 3a 20 6e 6f 74 2d 69 6e 29 29 0a 20 20 20  in: not-in)).   
df80: 20 20 20 28 64 62 3a 67 65 74 2d 74 65 73 74 73     (db:get-tests
df90: 2d 66 6f 72 2d 72 75 6e 20 64 62 20 72 75 6e 2d  -for-run db run-
dfa0: 69 64 20 74 65 73 74 70 61 74 74 20 69 74 65 6d  id testpatt item
dfb0: 70 61 74 74 20 73 74 61 74 65 73 20 73 74 61 74  patt states stat
dfc0: 75 73 65 73 20 6e 6f 74 2d 69 6e 3a 20 6e 6f 74  uses not-in: not
dfd0: 2d 69 6e 29 29 29 0a 0a 28 64 65 66 69 6e 65 20  -in)))..(define 
dfe0: 28 72 64 62 3a 67 65 74 2d 74 65 73 74 2d 64 61  (rdb:get-test-da
dff0: 74 61 2d 62 79 2d 69 64 20 64 62 20 74 65 73 74  ta-by-id db test
e000: 2d 69 64 29 0a 20 20 28 69 66 20 2a 72 75 6e 72  -id).  (if *runr
e010: 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c 65  emote*.      (le
e020: 74 20 28 28 68 6f 73 74 20 28 76 65 63 74 6f 72  t ((host (vector
e030: 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a  -ref *runremote*
e040: 20 30 29 29 0a 09 20 20 20 20 28 70 6f 72 74 20   0))..    (port 
e050: 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e  (vector-ref *run
e060: 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28 28  remote* 1)))..((
e070: 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20 27 72  rpc:procedure 'r
e080: 70 63 3a 67 65 74 2d 74 65 73 74 2d 64 61 74 61  pc:get-test-data
e090: 2d 62 79 2d 69 64 20 68 6f 73 74 20 70 6f 72 74  -by-id host port
e0a0: 29 0a 09 20 74 65 73 74 2d 69 64 29 29 0a 20 20  ).. test-id)).  
e0b0: 20 20 20 20 28 64 62 3a 67 65 74 2d 74 65 73 74      (db:get-test
e0c0: 2d 64 61 74 61 2d 62 79 2d 69 64 20 64 62 20 74  -data-by-id db t
e0d0: 65 73 74 2d 69 64 29 29 29 0a 20 20 20 20 20 20  est-id))).      
e0e0: 0a 28 64 65 66 69 6e 65 20 28 72 64 62 3a 67 65  .(define (rdb:ge
e0f0: 74 2d 6b 65 79 73 20 64 62 29 0a 20 20 28 69 66  t-keys db).  (if
e100: 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20   *runremote*.   
e110: 20 20 20 28 6c 65 74 20 28 28 68 6f 73 74 20 28     (let ((host (
e120: 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72  vector-ref *runr
e130: 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20 20 20  emote* 0))..    
e140: 28 70 6f 72 74 20 28 76 65 63 74 6f 72 2d 72 65  (port (vector-re
e150: 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29  f *runremote* 1)
e160: 29 29 0a 09 28 69 66 20 2a 64 62 2d 6b 65 79 73  ))..(if *db-keys
e170: 2a 20 2a 64 62 2d 6b 65 79 73 2a 20 0a 09 20 20  * *db-keys* ..  
e180: 20 20 28 6c 65 74 20 28 28 6b 65 79 73 20 28 28    (let ((keys ((
e190: 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20 27 72  rpc:procedure 'r
e1a0: 64 62 3a 67 65 74 2d 6b 65 79 73 20 68 6f 73 74  db:get-keys host
e1b0: 20 70 6f 72 74 29 29 29 29 0a 09 20 20 20 20 20   port))))..     
e1c0: 20 28 73 65 74 21 20 2a 64 62 2d 6b 65 79 73 2a   (set! *db-keys*
e1d0: 20 6b 65 79 73 29 0a 09 20 20 20 20 20 20 6b 65   keys)..      ke
e1e0: 79 73 29 29 29 0a 20 20 20 20 20 20 28 64 62 3a  ys))).      (db:
e1f0: 67 65 74 2d 6b 65 79 73 20 64 62 29 29 29 0a 09  get-keys db)))..
e200: 20 0a 28 64 65 66 69 6e 65 20 28 72 64 62 3a 67   .(define (rdb:g
e210: 65 74 2d 6e 75 6d 2d 72 75 6e 73 20 64 62 20 72  et-num-runs db r
e220: 75 6e 70 61 74 74 29 0a 20 20 28 69 66 20 2a 72  unpatt).  (if *r
e230: 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20  unremote*.      
e240: 28 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65 63  (let ((host (vec
e250: 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f  tor-ref *runremo
e260: 74 65 2a 20 30 29 29 0a 09 20 20 20 20 28 70 6f  te* 0))..    (po
e270: 72 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a  rt (vector-ref *
e280: 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a  runremote* 1))).
e290: 09 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65  .((rpc:procedure
e2a0: 20 27 72 64 62 3a 67 65 74 2d 6e 75 6d 2d 72 75   'rdb:get-num-ru
e2b0: 6e 73 20 68 6f 73 74 20 70 6f 72 74 29 20 72 75  ns host port) ru
e2c0: 6e 70 61 74 74 29 29 0a 20 20 20 20 20 20 28 64  npatt)).      (d
e2d0: 62 3a 67 65 74 2d 6e 75 6d 2d 72 75 6e 73 20 64  b:get-num-runs d
e2e0: 62 20 72 75 6e 70 61 74 74 29 29 29 0a 0a 28 64  b runpatt)))..(d
e2f0: 65 66 69 6e 65 20 28 72 64 62 3a 74 65 73 74 2d  efine (rdb:test-
e300: 73 65 74 2d 73 74 61 74 65 2d 73 74 61 74 75 73  set-state-status
e310: 2d 62 79 2d 69 64 20 64 62 20 74 65 73 74 2d 69  -by-id db test-i
e320: 64 20 6e 65 77 73 74 61 74 65 20 6e 65 77 73 74  d newstate newst
e330: 61 74 75 73 20 6e 65 77 63 6f 6d 6d 65 6e 74 29  atus newcomment)
e340: 0a 20 20 20 20 28 69 66 20 2a 72 75 6e 72 65 6d  .    (if *runrem
e350: 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c 65 74 20  ote*.      (let 
e360: 28 28 68 6f 73 74 20 28 76 65 63 74 6f 72 2d 72  ((host (vector-r
e370: 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30  ef *runremote* 0
e380: 29 29 0a 09 20 20 20 20 28 70 6f 72 74 20 28 76  ))..    (port (v
e390: 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65  ector-ref *runre
e3a0: 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28 28 72 70  mote* 1)))..((rp
e3b0: 63 3a 70 72 6f 63 65 64 75 72 65 20 27 72 64 62  c:procedure 'rdb
e3c0: 3a 74 65 73 74 2d 73 65 74 2d 73 74 61 74 65 2d  :test-set-state-
e3d0: 73 74 61 74 75 73 2d 62 79 2d 69 64 20 68 6f 73  status-by-id hos
e3e0: 74 20 70 6f 72 74 29 0a 09 20 74 65 73 74 2d 69  t port).. test-i
e3f0: 64 20 6e 65 77 73 74 61 74 65 20 6e 65 77 73 74  d newstate newst
e400: 61 74 75 73 20 6e 65 77 63 6f 6d 6d 65 6e 74 29  atus newcomment)
e410: 29 0a 20 20 20 20 20 20 28 64 62 3a 74 65 73 74  ).      (db:test
e420: 2d 73 65 74 2d 73 74 61 74 65 2d 73 74 61 74 75  -set-state-statu
e430: 73 2d 62 79 2d 69 64 20 64 62 20 74 65 73 74 2d  s-by-id db test-
e440: 69 64 20 6e 65 77 73 74 61 74 65 20 6e 65 77 73  id newstate news
e450: 74 61 74 75 73 20 6e 65 77 63 6f 6d 6d 65 6e 74  tatus newcomment
e460: 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 72 64  )))..(define (rd
e470: 62 3a 67 65 74 2d 6b 65 79 2d 76 61 6c 2d 70 61  b:get-key-val-pa
e480: 69 72 73 20 64 62 20 72 75 6e 2d 69 64 29 0a 20  irs db run-id). 
e490: 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a   (if *runremote*
e4a0: 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28 68 6f  .      (let ((ho
e4b0: 73 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a  st (vector-ref *
e4c0: 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09  runremote* 0))..
e4d0: 20 20 20 20 28 70 6f 72 74 20 28 76 65 63 74 6f      (port (vecto
e4e0: 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65  r-ref *runremote
e4f0: 2a 20 31 29 29 29 0a 09 28 28 72 70 63 3a 70 72  * 1)))..((rpc:pr
e500: 6f 63 65 64 75 72 65 20 27 72 64 62 3a 67 65 74  ocedure 'rdb:get
e510: 2d 6b 65 79 2d 76 61 6c 2d 70 61 69 72 73 20 68  -key-val-pairs h
e520: 6f 73 74 20 70 6f 72 74 29 20 72 75 6e 2d 69 64  ost port) run-id
e530: 29 29 0a 20 20 20 20 20 20 28 64 62 3a 67 65 74  )).      (db:get
e540: 2d 6b 65 79 2d 76 61 6c 2d 70 61 69 72 73 20 64  -key-val-pairs d
e550: 62 20 72 75 6e 2d 69 64 29 29 29 0a 09 20 0a 28  b run-id))).. .(
e560: 64 65 66 69 6e 65 20 28 72 64 62 3a 67 65 74 2d  define (rdb:get-
e570: 6b 65 79 2d 76 61 6c 73 20 64 62 20 72 75 6e 2d  key-vals db run-
e580: 69 64 29 0a 20 20 20 20 28 69 66 20 2a 72 75 6e  id).    (if *run
e590: 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c  remote*.      (l
e5a0: 65 74 20 28 28 68 6f 73 74 20 28 76 65 63 74 6f  et ((host (vecto
e5b0: 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65  r-ref *runremote
e5c0: 2a 20 30 29 29 0a 09 20 20 20 20 28 70 6f 72 74  * 0))..    (port
e5d0: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75   (vector-ref *ru
e5e0: 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28  nremote* 1)))..(
e5f0: 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20 27  (rpc:procedure '
e600: 72 64 62 3a 67 65 74 2d 6b 65 79 2d 76 61 6c 73  rdb:get-key-vals
e610: 20 68 6f 73 74 20 70 6f 72 74 29 20 72 75 6e 2d   host port) run-
e620: 69 64 29 29 0a 20 20 20 20 20 20 28 64 62 3a 67  id)).      (db:g
e630: 65 74 2d 6b 65 79 2d 76 61 6c 73 20 64 62 20 72  et-key-vals db r
e640: 75 6e 2d 69 64 29 29 29 0a 0a 28 64 65 66 69 6e  un-id)))..(defin
e650: 65 20 28 72 64 62 3a 74 65 73 74 6d 65 74 61 2d  e (rdb:testmeta-
e660: 67 65 74 2d 72 65 63 6f 72 64 20 64 62 20 74 65  get-record db te
e670: 73 74 6e 61 6d 65 29 0a 20 20 20 28 69 66 20 2a  stname).   (if *
e680: 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20  runremote*.     
e690: 20 28 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65   (let ((host (ve
e6a0: 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d  ctor-ref *runrem
e6b0: 6f 74 65 2a 20 30 29 29 0a 09 20 20 20 20 28 70  ote* 0))..    (p
e6c0: 6f 72 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20  ort (vector-ref 
e6d0: 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29  *runremote* 1)))
e6e0: 0a 09 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72  ..((rpc:procedur
e6f0: 65 20 27 72 64 62 3a 74 65 73 74 6d 65 74 61 2d  e 'rdb:testmeta-
e700: 67 65 74 2d 72 65 63 6f 72 64 20 68 6f 73 74 20  get-record host 
e710: 70 6f 72 74 29 20 74 65 73 74 6e 61 6d 65 29 29  port) testname))
e720: 0a 20 20 20 20 20 20 28 64 62 3a 74 65 73 74 6d  .      (db:testm
e730: 65 74 61 2d 67 65 74 2d 72 65 63 6f 72 64 20 64  eta-get-record d
e740: 62 20 74 65 73 74 6e 61 6d 65 29 29 29 0a 0a 28  b testname)))..(
e750: 64 65 66 69 6e 65 20 28 72 64 62 3a 67 65 74 2d  define (rdb:get-
e760: 74 65 73 74 2d 64 61 74 61 2d 62 79 2d 69 64 20  test-data-by-id 
e770: 64 62 20 74 65 73 74 2d 69 64 29 0a 20 20 28 69  db test-id).  (i
e780: 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20  f *runremote*.  
e790: 20 20 20 20 28 6c 65 74 20 28 28 68 6f 73 74 20      (let ((host 
e7a0: 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e  (vector-ref *run
e7b0: 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20 20  remote* 0))..   
e7c0: 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72 2d 72   (port (vector-r
e7d0: 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31  ef *runremote* 1
e7e0: 29 29 29 0a 09 28 28 72 70 63 3a 70 72 6f 63 65  )))..((rpc:proce
e7f0: 64 75 72 65 20 27 72 64 62 3a 67 65 74 2d 74 65  dure 'rdb:get-te
e800: 73 74 2d 64 61 74 61 2d 62 79 2d 69 64 20 68 6f  st-data-by-id ho
e810: 73 74 20 70 6f 72 74 29 20 74 65 73 74 2d 69 64  st port) test-id
e820: 29 29 0a 20 20 20 20 20 20 28 64 62 3a 67 65 74  )).      (db:get
e830: 2d 74 65 73 74 2d 64 61 74 61 2d 62 79 2d 69 64  -test-data-by-id
e840: 20 64 62 20 74 65 73 74 2d 69 64 29 29 29 0a 0a   db test-id)))..
e850: 28 64 65 66 69 6e 65 20 28 72 64 62 3a 67 65 74  (define (rdb:get
e860: 2d 72 75 6e 2d 69 6e 66 6f 20 64 62 20 72 75 6e  -run-info db run
e870: 2d 69 64 29 0a 20 20 28 69 66 20 2a 72 75 6e 72  -id).  (if *runr
e880: 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c 65  emote*.      (le
e890: 74 20 28 28 68 6f 73 74 20 28 76 65 63 74 6f 72  t ((host (vector
e8a0: 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a  -ref *runremote*
e8b0: 20 30 29 29 0a 09 20 20 20 20 28 70 6f 72 74 20   0))..    (port 
e8c0: 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e  (vector-ref *run
e8d0: 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28 28  remote* 1)))..((
e8e0: 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20 27 72  rpc:procedure 'r
e8f0: 64 62 3a 67 65 74 2d 72 75 6e 2d 69 6e 66 6f 20  db:get-run-info 
e900: 68 6f 73 74 20 70 6f 72 74 29 20 72 75 6e 2d 69  host port) run-i
e910: 64 29 29 0a 20 20 20 20 20 20 28 64 62 3a 67 65  d)).      (db:ge
e920: 74 2d 72 75 6e 2d 69 6e 66 6f 20 64 62 20 72 75  t-run-info db ru
e930: 6e 2d 69 64 29 29 29 0a 0a 28 64 65 66 69 6e 65  n-id)))..(define
e940: 20 28 72 64 62 3a 67 65 74 2d 73 74 65 70 73 2d   (rdb:get-steps-
e950: 66 6f 72 2d 74 65 73 74 20 64 62 20 74 65 73 74  for-test db test
e960: 2d 69 64 29 0a 20 20 28 69 66 20 2a 72 75 6e 72  -id).  (if *runr
e970: 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c 65  emote*.      (le
e980: 74 20 28 28 68 6f 73 74 20 28 76 65 63 74 6f 72  t ((host (vector
e990: 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a  -ref *runremote*
e9a0: 20 30 29 29 0a 09 20 20 20 20 28 70 6f 72 74 20   0))..    (port 
e9b0: 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e  (vector-ref *run
e9c0: 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28 28  remote* 1)))..((
e9d0: 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20 27 72  rpc:procedure 'r
e9e0: 64 62 3a 67 65 74 2d 73 74 65 70 73 2d 66 6f 72  db:get-steps-for
e9f0: 2d 74 65 73 74 20 68 6f 73 74 20 70 6f 72 74 29  -test host port)
ea00: 20 74 65 73 74 2d 69 64 29 29 0a 20 20 20 20 20   test-id)).     
ea10: 20 28 64 62 3a 67 65 74 2d 73 74 65 70 73 2d 66   (db:get-steps-f
ea20: 6f 72 2d 74 65 73 74 20 64 62 20 74 65 73 74 2d  or-test db test-
ea30: 69 64 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  id)))..(define (
ea40: 72 64 62 3a 67 65 74 2d 73 74 65 70 73 2d 74 61  rdb:get-steps-ta
ea50: 62 6c 65 20 64 62 20 74 65 73 74 2d 69 64 29 0a  ble db test-id).
ea60: 20 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65    (if *runremote
ea70: 2a 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28 68  *.      (let ((h
ea80: 6f 73 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20  ost (vector-ref 
ea90: 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a  *runremote* 0)).
eaa0: 09 20 20 20 20 28 70 6f 72 74 20 28 76 65 63 74  .    (port (vect
eab0: 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74  or-ref *runremot
eac0: 65 2a 20 31 29 29 29 0a 09 28 28 72 70 63 3a 70  e* 1)))..((rpc:p
ead0: 72 6f 63 65 64 75 72 65 20 27 72 64 62 3a 67 65  rocedure 'rdb:ge
eae0: 74 2d 73 74 65 70 73 2d 74 61 62 6c 65 20 68 6f  t-steps-table ho
eaf0: 73 74 20 70 6f 72 74 29 20 74 65 73 74 2d 69 64  st port) test-id
eb00: 29 29 0a 20 20 20 20 20 20 28 64 62 3a 67 65 74  )).      (db:get
eb10: 2d 73 74 65 70 73 2d 74 61 62 6c 65 20 64 62 20  -steps-table db 
eb20: 74 65 73 74 2d 69 64 29 29 29 0a 0a 28 64 65 66  test-id)))..(def
eb30: 69 6e 65 20 28 72 64 62 3a 72 65 61 64 2d 74 65  ine (rdb:read-te
eb40: 73 74 2d 64 61 74 61 20 64 62 20 74 65 73 74 2d  st-data db test-
eb50: 69 64 20 63 61 74 65 67 6f 72 79 70 61 74 74 29  id categorypatt)
eb60: 0a 20 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74  .  (if *runremot
eb70: 65 2a 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28  e*.      (let ((
eb80: 68 6f 73 74 20 28 76 65 63 74 6f 72 2d 72 65 66  host (vector-ref
eb90: 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29   *runremote* 0))
eba0: 0a 09 20 20 20 20 28 70 6f 72 74 20 28 76 65 63  ..    (port (vec
ebb0: 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f  tor-ref *runremo
ebc0: 74 65 2a 20 31 29 29 29 0a 09 28 28 72 70 63 3a  te* 1)))..((rpc:
ebd0: 70 72 6f 63 65 64 75 72 65 20 27 72 64 62 3a 72  procedure 'rdb:r
ebe0: 65 61 64 2d 74 65 73 74 2d 64 61 74 61 20 68 6f  ead-test-data ho
ebf0: 73 74 20 70 6f 72 74 29 20 74 65 73 74 2d 69 64  st port) test-id
ec00: 20 63 61 74 65 67 6f 72 79 70 61 74 74 29 29 0a   categorypatt)).
ec10: 20 20 20 20 20 20 28 64 62 3a 72 65 61 64 2d 74        (db:read-t
ec20: 65 73 74 2d 64 61 74 61 20 64 62 20 74 65 73 74  est-data db test
ec30: 2d 69 64 20 63 61 74 65 67 6f 72 79 70 61 74 74  -id categorypatt
ec40: 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 72 64  )))..(define (rd
ec50: 62 3a 67 65 74 2d 74 65 73 74 2d 69 6e 66 6f 20  b:get-test-info 
ec60: 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61  db run-id testna
ec70: 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 0a 20 20  me item-path).  
ec80: 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a  (if *runremote*.
ec90: 20 20 20 20 20 20 28 6c 65 74 20 28 28 68 6f 73        (let ((hos
eca0: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72  t (vector-ref *r
ecb0: 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20  unremote* 0)).. 
ecc0: 20 20 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72     (port (vector
ecd0: 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a  -ref *runremote*
ece0: 20 31 29 29 29 0a 09 28 28 72 70 63 3a 70 72 6f   1)))..((rpc:pro
ecf0: 63 65 64 75 72 65 20 27 72 64 62 3a 67 65 74 2d  cedure 'rdb:get-
ed00: 74 65 73 74 2d 69 6e 66 6f 20 68 6f 73 74 20 70  test-info host p
ed10: 6f 72 74 29 20 72 75 6e 2d 69 64 20 74 65 73 74  ort) run-id test
ed20: 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 29  name item-path))
ed30: 0a 20 20 20 20 20 20 28 64 62 3a 67 65 74 2d 74  .      (db:get-t
ed40: 65 73 74 2d 69 6e 66 6f 20 64 62 20 72 75 6e 2d  est-info db run-
ed50: 69 64 20 74 65 73 74 6e 61 6d 65 20 69 74 65 6d  id testname item
ed60: 2d 70 61 74 68 29 29 29 0a 0a 28 64 65 66 69 6e  -path)))..(defin
ed70: 65 20 28 72 64 62 3a 64 65 6c 65 74 65 2d 74 65  e (rdb:delete-te
ed80: 73 74 2d 72 65 63 6f 72 64 73 20 64 62 20 74 65  st-records db te
ed90: 73 74 2d 69 64 29 0a 20 20 28 69 66 20 2a 72 75  st-id).  (if *ru
eda0: 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28  nremote*.      (
edb0: 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65 63 74  let ((host (vect
edc0: 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74  or-ref *runremot
edd0: 65 2a 20 30 29 29 0a 09 20 20 20 20 28 70 6f 72  e* 0))..    (por
ede0: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72  t (vector-ref *r
edf0: 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09  unremote* 1)))..
ee00: 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20  ((rpc:procedure 
ee10: 27 72 64 62 3a 64 65 6c 65 74 65 2d 74 65 73 74  'rdb:delete-test
ee20: 2d 72 65 63 6f 72 64 73 20 68 6f 73 74 20 70 6f  -records host po
ee30: 72 74 29 20 74 65 73 74 2d 69 64 29 29 0a 20 20  rt) test-id)).  
ee40: 20 20 20 20 28 64 62 3a 64 65 6c 65 74 65 2d 74      (db:delete-t
ee50: 65 73 74 2d 72 65 63 6f 72 64 73 20 64 62 20 74  est-records db t
ee60: 65 73 74 2d 69 64 29 29 29 0a 0a 28 64 65 66 69  est-id)))..(defi
ee70: 6e 65 20 28 72 64 62 3a 74 65 73 74 2d 64 61 74  ne (rdb:test-dat
ee80: 61 2d 72 6f 6c 6c 75 70 20 64 62 20 74 65 73 74  a-rollup db test
ee90: 2d 69 64 20 73 74 61 74 75 73 29 0a 20 20 20 20  -id status).    
eea0: 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a  (if *runremote*.
eeb0: 20 20 20 20 20 20 28 6c 65 74 20 28 28 68 6f 73        (let ((hos
eec0: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72  t (vector-ref *r
eed0: 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20  unremote* 0)).. 
eee0: 20 20 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72     (port (vector
eef0: 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a  -ref *runremote*
ef00: 20 31 29 29 29 0a 09 28 28 72 70 63 3a 70 72 6f   1)))..((rpc:pro
ef10: 63 65 64 75 72 65 20 27 72 64 62 3a 74 65 73 74  cedure 'rdb:test
ef20: 2d 64 61 74 61 2d 72 6f 6c 6c 75 70 20 68 6f 73  -data-rollup hos
ef30: 74 20 70 6f 72 74 29 20 74 65 73 74 2d 69 64 20  t port) test-id 
ef40: 73 74 61 74 75 73 29 29 0a 20 20 20 20 20 20 28  status)).      (
ef50: 64 62 3a 74 65 73 74 2d 64 61 74 61 2d 72 6f 6c  db:test-data-rol
ef60: 6c 75 70 20 64 62 20 74 65 73 74 2d 69 64 20 73  lup db test-id s
ef70: 74 61 74 75 73 29 29 29 0a 0a 28 64 65 66 69 6e  tatus)))..(defin
ef80: 65 20 28 72 64 62 3a 74 65 73 74 2d 67 65 74 2d  e (rdb:test-get-
ef90: 70 61 74 68 73 2d 6d 61 74 63 68 69 6e 67 20 64  paths-matching d
efa0: 62 20 6b 65 79 6e 61 6d 65 73 20 74 61 72 67 65  b keynames targe
efb0: 74 20 66 6e 61 6d 65 29 0a 20 20 20 28 69 66 20  t fname).   (if 
efc0: 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20  *runremote*.    
efd0: 20 20 20 28 6c 65 74 20 28 28 68 6f 73 74 20 28     (let ((host (
efe0: 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72  vector-ref *runr
eff0: 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20 20 20  emote* 0))..    
f000: 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72 2d 72   (port (vector-r
f010: 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31  ef *runremote* 1
f020: 29 29 29 0a 09 20 28 28 72 70 63 3a 70 72 6f 63  ))).. ((rpc:proc
f030: 65 64 75 72 65 20 27 72 64 62 3a 74 65 73 74 2d  edure 'rdb:test-
f040: 67 65 74 2d 70 61 74 68 73 2d 6d 61 74 63 68 69  get-paths-matchi
f050: 6e 67 20 68 6f 73 74 20 70 6f 72 74 29 20 6b 65  ng host port) ke
f060: 79 6e 61 6d 65 73 20 74 61 72 67 65 74 20 66 6e  ynames target fn
f070: 61 6d 65 29 29 0a 20 20 20 20 20 20 20 28 64 62  ame)).       (db
f080: 3a 74 65 73 74 2d 67 65 74 2d 70 61 74 68 73 2d  :test-get-paths-
f090: 6d 61 74 63 68 69 6e 67 20 64 62 20 6b 65 79 6e  matching db keyn
f0a0: 61 6d 65 73 20 74 61 72 67 65 74 20 66 6e 61 6d  ames target fnam
f0b0: 65 29 29 29 0a 0a 20 0a                          e))).. .