Megatest

Hex Artifact Content
Login

Artifact d9dab9adc2a913ed71aabc52434341cc6a65dc5d:


0000: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
0010: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0030: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0040: 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 43 6f 70 79  ========.;; Copy
0050: 72 69 67 68 74 20 32 30 30 36 2d 32 30 31 31 2c  right 2006-2011,
0060: 20 4d 61 74 74 68 65 77 20 57 65 6c 6c 61 6e 64   Matthew Welland
0070: 2e 0a 3b 3b 20 0a 3b 3b 20 20 54 68 69 73 20 70  ..;; .;;  This p
0080: 72 6f 67 72 61 6d 20 69 73 20 6d 61 64 65 20 61  rogram is made a
0090: 76 61 69 6c 61 62 6c 65 20 75 6e 64 65 72 20 74  vailable under t
00a0: 68 65 20 47 4e 55 20 47 50 4c 20 76 65 72 73 69  he GNU GPL versi
00b0: 6f 6e 20 32 2e 30 20 6f 72 0a 3b 3b 20 20 67 72  on 2.0 or.;;  gr
00c0: 65 61 74 65 72 2e 20 53 65 65 20 74 68 65 20 61  eater. See the a
00d0: 63 63 6f 6d 70 61 6e 79 69 6e 67 20 66 69 6c 65  ccompanying file
00e0: 20 43 4f 50 59 49 4e 47 20 66 6f 72 20 64 65 74   COPYING for det
00f0: 61 69 6c 73 2e 0a 3b 3b 20 0a 3b 3b 20 20 54 68  ails..;; .;;  Th
0100: 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69  is program is di
0110: 73 74 72 69 62 75 74 65 64 20 57 49 54 48 4f 55  stributed WITHOU
0120: 54 20 41 4e 59 20 57 41 52 52 41 4e 54 59 3b 20  T ANY WARRANTY; 
0130: 77 69 74 68 6f 75 74 20 65 76 65 6e 20 74 68 65  without even the
0140: 0a 3b 3b 20 20 69 6d 70 6c 69 65 64 20 77 61 72  .;;  implied war
0150: 72 61 6e 74 79 20 6f 66 20 4d 45 52 43 48 41 4e  ranty of MERCHAN
0160: 54 41 42 49 4c 49 54 59 20 6f 72 20 46 49 54 4e  TABILITY or FITN
0170: 45 53 53 20 46 4f 52 20 41 20 50 41 52 54 49 43  ESS FOR A PARTIC
0180: 55 4c 41 52 0a 3b 3b 20 20 50 55 52 50 4f 53 45  ULAR.;;  PURPOSE
0190: 2e 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ..;;============
01a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 3d 3d  ==========..;;==
01e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0200: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0210: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0220: 3d 3d 3d 3d 0a 3b 3b 20 44 61 74 61 62 61 73 65  ====.;; Database
0230: 20 61 63 63 65 73 73 0a 3b 3b 3d 3d 3d 3d 3d 3d   access.;;======
0240: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0250: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0260: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0270: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0280: 0a 0a 28 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 57 41 53 20 64 62 2d 67 65 74 2d 72 75 6e  ; WAS db-get-run
3560: 73 20 46 49 58 4d 45 20 49 4e 20 52 45 4d 41 49  s FIXME IN REMAI
3570: 4e 49 4e 47 20 43 4f 44 45 0a 3b 3b 0a 3b 3b 20  NING CODE.;;.;; 
3580: 4d 45 52 47 45 20 54 48 49 53 20 57 49 54 48 20  MERGE THIS WITH 
3590: 64 62 3a 67 65 74 2d 72 75 6e 73 2c 20 61 63 63  db:get-runs, acc
35a0: 69 64 65 6e 74 6c 79 20 77 72 6f 74 65 20 69 74  idently wrote it
35b0: 20 74 77 69 63 65 0a 3b 3b 0a 3b 3b 20 72 65 70   twice.;;.;; rep
35c0: 6c 61 63 65 20 68 65 61 64 65 72 20 61 6e 64 20  lace header and 
35d0: 6b 65 79 73 74 72 20 77 69 74 68 20 61 20 63 61  keystr with a ca
35e0: 6c 6c 20 74 6f 20 72 75 6e 73 3a 67 65 74 2d 73  ll to runs:get-s
35f0: 74 64 2d 72 75 6e 2d 66 69 65 6c 64 73 0a 3b 3b  td-run-fields.;;
3600: 0a 3b 3b 20 6b 65 79 70 61 74 74 73 3a 20 28 20  .;; keypatts: ( 
3610: 28 4b 45 59 31 20 22 61 62 63 25 64 65 66 22 29  (KEY1 "abc%def")
3620: 28 4b 45 59 32 20 22 25 22 29 20 29 0a 3b 3b 0a  (KEY2 "%") ).;;.
3630: 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d  (define (db:get-
3640: 72 75 6e 73 20 64 62 20 72 75 6e 70 61 74 74 20  runs db runpatt 
3650: 63 6f 75 6e 74 20 6f 66 66 73 65 74 20 6b 65 79  count offset key
3660: 70 61 74 74 73 29 0a 20 20 28 6c 65 74 2a 20 28  patts).  (let* (
3670: 28 72 65 73 20 20 20 20 20 20 27 28 29 29 0a 09  (res      '())..
3680: 20 28 6b 65 79 73 20 20 20 20 20 20 28 64 62 3a   (keys      (db:
3690: 67 65 74 2d 6b 65 79 73 20 64 62 29 29 0a 09 20  get-keys db)).. 
36a0: 28 72 65 6d 66 69 65 6c 64 73 20 28 6c 69 73 74  (remfields (list
36b0: 20 22 69 64 22 20 22 72 75 6e 6e 61 6d 65 22 20   "id" "runname" 
36c0: 22 73 74 61 74 65 22 20 22 73 74 61 74 75 73 22  "state" "status"
36d0: 20 22 6f 77 6e 65 72 22 20 22 65 76 65 6e 74 5f   "owner" "event_
36e0: 74 69 6d 65 22 29 29 0a 09 20 28 68 65 61 64 65  time")).. (heade
36f0: 72 20 20 20 20 28 61 70 70 65 6e 64 20 28 6d 61  r    (append (ma
3700: 70 20 6b 65 79 3a 67 65 74 2d 66 69 65 6c 64 6e  p key:get-fieldn
3710: 61 6d 65 20 6b 65 79 73 29 0a 09 09 09 20 20 20  ame keys)....   
3720: 20 72 65 6d 66 69 65 6c 64 73 29 29 0a 09 20 28   remfields)).. (
3730: 6b 65 79 73 74 72 20 20 20 20 28 63 6f 6e 63 20  keystr    (conc 
3740: 28 6b 65 79 73 2d 3e 6b 65 79 73 74 72 20 6b 65  (keys->keystr ke
3750: 79 73 29 20 22 2c 22 0a 09 09 09 20 20 28 73 74  ys) ","....  (st
3760: 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65  ring-intersperse
3770: 20 72 65 6d 66 69 65 6c 64 73 20 22 2c 22 29 29   remfields ","))
3780: 29 0a 09 20 28 71 72 79 73 74 72 20 20 20 20 28  ).. (qrystr    (
3790: 63 6f 6e 63 20 22 53 45 4c 45 43 54 20 22 20 6b  conc "SELECT " k
37a0: 65 79 73 74 72 20 22 20 46 52 4f 4d 20 72 75 6e  eystr " FROM run
37b0: 73 20 57 48 45 52 45 20 72 75 6e 6e 61 6d 65 20  s WHERE runname 
37c0: 4c 49 4b 45 20 3f 20 22 0a 09 09 09 20 20 3b 3b  LIKE ? "....  ;;
37d0: 20 47 65 6e 65 72 61 74 65 3a 20 22 20 41 4e 44   Generate: " AND
37e0: 20 78 20 4c 49 4b 45 20 27 6b 65 79 70 61 74 74   x LIKE 'keypatt
37f0: 27 20 2e 2e 2e 22 0a 09 09 09 20 20 28 69 66 20  ' ..."....  (if 
3800: 28 6e 75 6c 6c 3f 20 6b 65 79 70 61 74 74 73 29  (null? keypatts)
3810: 20 22 22 0a 09 09 09 20 20 20 20 20 20 28 63 6f   ""....      (co
3820: 6e 63 20 22 20 41 4e 44 20 22 0a 09 09 09 09 20  nc " AND "..... 
3830: 20 20 20 28 73 74 72 69 6e 67 2d 6a 6f 69 6e 20     (string-join 
3840: 0a 09 09 09 09 20 20 20 20 20 28 6d 61 70 20 28  .....     (map (
3850: 6c 61 6d 62 64 61 20 28 6b 65 79 70 61 74 74 29  lambda (keypatt)
3860: 0a 09 09 09 09 09 20 20 20 20 28 6c 65 74 20 28  ......    (let (
3870: 28 6b 65 79 20 20 28 63 61 72 20 6b 65 79 70 61  (key  (car keypa
3880: 74 74 29 29 0a 09 09 09 09 09 09 20 20 28 70 61  tt)).......  (pa
3890: 74 74 20 28 63 61 64 72 20 6b 65 79 70 61 74 74  tt (cadr keypatt
38a0: 29 29 29 0a 09 09 09 09 09 20 20 20 20 20 20 28  )))......      (
38b0: 63 6f 6e 63 20 6b 65 79 20 22 20 4c 49 4b 45 20  conc key " LIKE 
38c0: 27 22 20 70 61 74 74 20 22 27 22 29 29 29 0a 09  '" patt "'")))..
38d0: 09 09 09 09 20 20 6b 65 79 70 61 74 74 73 29 0a  ....  keypatts).
38e0: 09 09 09 09 20 20 20 20 20 22 20 41 4e 44 20 22  ....     " AND "
38f0: 29 29 29 0a 09 09 09 20 20 22 20 4f 52 44 45 52  )))....  " ORDER
3900: 20 42 59 20 65 76 65 6e 74 5f 74 69 6d 65 20 44   BY event_time D
3910: 45 53 43 20 22 0a 09 09 09 20 20 28 69 66 20 28  ESC "....  (if (
3920: 6e 75 6d 62 65 72 3f 20 63 6f 75 6e 74 29 0a 09  number? count)..
3930: 09 09 20 20 20 20 20 20 28 63 6f 6e 63 20 22 20  ..      (conc " 
3940: 4c 49 4d 49 54 20 22 20 63 6f 75 6e 74 29 0a 09  LIMIT " count)..
3950: 09 09 20 20 20 20 20 20 22 22 29 0a 09 09 09 20  ..      "").... 
3960: 20 28 69 66 20 28 6e 75 6d 62 65 72 3f 20 6f 66   (if (number? of
3970: 66 73 65 74 29 0a 09 09 09 20 20 20 20 20 20 28  fset)....      (
3980: 63 6f 6e 63 20 22 20 4f 46 46 53 45 54 20 22 20  conc " OFFSET " 
3990: 6f 66 66 73 65 74 29 0a 09 09 09 20 20 20 20 20  offset)....     
39a0: 20 22 22 29 29 29 29 0a 20 20 20 20 28 64 65 62   "")))).    (deb
39b0: 75 67 3a 70 72 69 6e 74 20 38 20 22 49 4e 46 4f  ug:print 8 "INFO
39c0: 3a 20 64 62 3a 67 65 74 2d 72 75 6e 73 20 71 72  : db:get-runs qr
39d0: 79 73 74 72 3a 20 22 20 71 72 79 73 74 72 20 22  ystr: " qrystr "
39e0: 5c 6e 6b 65 79 70 61 74 74 73 3a 20 22 20 6b 65  \nkeypatts: " ke
39f0: 79 70 61 74 74 73 20 22 5c 6e 20 20 6f 66 66 73  ypatts "\n  offs
3a00: 65 74 3a 20 22 20 6f 66 66 73 65 74 20 22 20 6c  et: " offset " l
3a10: 69 6d 69 74 3a 20 22 20 63 6f 75 6e 74 29 0a 20  imit: " count). 
3a20: 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d     (sqlite3:for-
3a30: 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c  each-row.     (l
3a40: 61 6d 62 64 61 20 28 61 20 2e 20 78 29 0a 20 20  ambda (a . x).  
3a50: 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28       (set! res (
3a60: 63 6f 6e 73 20 28 61 70 70 6c 79 20 76 65 63 74  cons (apply vect
3a70: 6f 72 20 61 20 78 29 20 72 65 73 29 29 29 0a 20  or a x) res))). 
3a80: 20 20 20 20 64 62 0a 20 20 20 20 20 71 72 79 73      db.     qrys
3a90: 74 72 0a 20 20 20 20 20 72 75 6e 70 61 74 74 29  tr.     runpatt)
3aa0: 0a 20 20 20 20 28 76 65 63 74 6f 72 20 68 65 61  .    (vector hea
3ab0: 64 65 72 20 72 65 73 29 29 29 0a 0a 3b 3b 20 6a  der res)))..;; j
3ac0: 75 73 74 20 67 65 74 20 63 6f 75 6e 74 20 6f 66  ust get count of
3ad0: 20 72 75 6e 73 0a 28 64 65 66 69 6e 65 20 28 64   runs.(define (d
3ae0: 62 3a 67 65 74 2d 6e 75 6d 2d 72 75 6e 73 20 64  b:get-num-runs d
3af0: 62 20 72 75 6e 70 61 74 74 29 0a 20 20 28 6c 65  b runpatt).  (le
3b00: 74 20 28 28 6e 75 6d 72 75 6e 73 20 30 29 29 0a  t ((numruns 0)).
3b10: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72      (sqlite3:for
3b20: 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20 20 20 20  -each-row .     
3b30: 28 6c 61 6d 62 64 61 20 28 63 6f 75 6e 74 29 0a  (lambda (count).
3b40: 20 20 20 20 20 20 20 28 73 65 74 21 20 6e 75 6d         (set! num
3b50: 72 75 6e 73 20 63 6f 75 6e 74 29 29 0a 20 20 20  runs count)).   
3b60: 20 20 64 62 0a 20 20 20 20 20 22 53 45 4c 45 43    db.     "SELEC
3b70: 54 20 43 4f 55 4e 54 28 69 64 29 20 46 52 4f 4d  T COUNT(id) FROM
3b80: 20 72 75 6e 73 20 57 48 45 52 45 20 72 75 6e 6e   runs WHERE runn
3b90: 61 6d 65 20 4c 49 4b 45 20 3f 3b 22 20 72 75 6e  ame LIKE ?;" run
3ba0: 70 61 74 74 29 0a 20 20 20 20 6e 75 6d 72 75 6e  patt).    numrun
3bb0: 73 29 29 0a 0a 3b 3b 20 75 73 65 20 28 67 65 74  s))..;; use (get
3bc0: 2d 76 61 6c 75 65 2d 62 79 2d 68 65 61 64 65 72  -value-by-header
3bd0: 20 28 64 62 3a 67 65 74 2d 68 65 61 64 65 72 20   (db:get-header 
3be0: 72 75 6e 69 6e 66 6f 29 28 64 62 3a 67 65 74 2d  runinfo)(db:get-
3bf0: 72 6f 77 20 72 75 6e 69 6e 66 6f 29 29 0a 28 64  row runinfo)).(d
3c00: 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 72 75  efine (db:get-ru
3c10: 6e 2d 69 6e 66 6f 20 64 62 20 72 75 6e 2d 69 64  n-info db run-id
3c20: 29 0a 20 20 28 6c 65 74 2a 20 28 28 72 65 73 20  ).  (let* ((res 
3c30: 20 20 20 20 20 23 66 29 0a 09 20 28 6b 65 79 73       #f).. (keys
3c40: 20 20 20 20 20 20 28 64 62 3a 67 65 74 2d 6b 65        (db:get-ke
3c50: 79 73 20 64 62 29 29 0a 09 20 28 72 65 6d 66 69  ys db)).. (remfi
3c60: 65 6c 64 73 20 28 6c 69 73 74 20 22 69 64 22 20  elds (list "id" 
3c70: 22 72 75 6e 6e 61 6d 65 22 20 22 73 74 61 74 65  "runname" "state
3c80: 22 20 22 73 74 61 74 75 73 22 20 22 6f 77 6e 65  " "status" "owne
3c90: 72 22 20 22 65 76 65 6e 74 5f 74 69 6d 65 22 29  r" "event_time")
3ca0: 29 0a 09 20 28 68 65 61 64 65 72 20 20 20 20 28  ).. (header    (
3cb0: 61 70 70 65 6e 64 20 28 6d 61 70 20 6b 65 79 3a  append (map key:
3cc0: 67 65 74 2d 66 69 65 6c 64 6e 61 6d 65 20 6b 65  get-fieldname ke
3cd0: 79 73 29 0a 09 09 09 20 20 20 20 72 65 6d 66 69  ys)....    remfi
3ce0: 65 6c 64 73 29 29 0a 09 20 28 6b 65 79 73 74 72  elds)).. (keystr
3cf0: 20 20 20 20 28 63 6f 6e 63 20 28 6b 65 79 73 2d      (conc (keys-
3d00: 3e 6b 65 79 73 74 72 20 6b 65 79 73 29 20 22 2c  >keystr keys) ",
3d10: 22 0a 09 09 09 20 20 28 73 74 72 69 6e 67 2d 69  "....  (string-i
3d20: 6e 74 65 72 73 70 65 72 73 65 20 72 65 6d 66 69  ntersperse remfi
3d30: 65 6c 64 73 20 22 2c 22 29 29 29 29 0a 20 20 20  elds ",")))).   
3d40: 20 3b 3b 20 28 64 65 62 75 67 3a 70 72 69 6e 74   ;; (debug:print
3d50: 20 30 20 22 64 62 3a 67 65 74 2d 72 75 6e 2d 69   0 "db:get-run-i
3d60: 6e 66 6f 20 72 75 6e 2d 69 64 3a 20 22 20 72 75  nfo run-id: " ru
3d70: 6e 2d 69 64 20 22 20 68 65 61 64 65 72 3a 20 22  n-id " header: "
3d80: 20 68 65 61 64 65 72 20 22 20 6b 65 79 73 74 72   header " keystr
3d90: 3a 20 22 20 6b 65 79 73 74 72 29 0a 20 20 20 20  : " keystr).    
3da0: 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63  (sqlite3:for-eac
3db0: 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62  h-row.     (lamb
3dc0: 64 61 20 28 61 20 2e 20 78 29 0a 20 20 20 20 20  da (a . x).     
3dd0: 20 20 28 73 65 74 21 20 72 65 73 20 28 61 70 70    (set! res (app
3de0: 6c 79 20 76 65 63 74 6f 72 20 61 20 78 29 29 29  ly vector a x)))
3df0: 0a 20 20 20 20 20 64 62 0a 20 20 20 20 20 28 63  .     db.     (c
3e00: 6f 6e 63 20 22 53 45 4c 45 43 54 20 22 20 6b 65  onc "SELECT " ke
3e10: 79 73 74 72 20 22 20 46 52 4f 4d 20 72 75 6e 73  ystr " FROM runs
3e20: 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 29 0a 20   WHERE id=?;"). 
3e30: 20 20 20 20 72 75 6e 2d 69 64 29 0a 20 20 20 20      run-id).    
3e40: 28 76 65 63 74 6f 72 20 68 65 61 64 65 72 20 72  (vector header r
3e50: 65 73 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  es)))..(define (
3e60: 64 62 3a 73 65 74 2d 63 6f 6d 6d 65 6e 74 2d 66  db:set-comment-f
3e70: 6f 72 2d 72 75 6e 20 64 62 20 72 75 6e 2d 69 64  or-run db run-id
3e80: 20 63 6f 6d 6d 65 6e 74 29 0a 20 20 28 73 71 6c   comment).  (sql
3e90: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
3ea0: 22 55 50 44 41 54 45 20 72 75 6e 73 20 53 45 54  "UPDATE runs SET
3eb0: 20 63 6f 6d 6d 65 6e 74 3d 3f 20 57 48 45 52 45   comment=? WHERE
3ec0: 20 69 64 3d 3f 3b 22 20 63 6f 6d 6d 65 6e 74 20   id=?;" comment 
3ed0: 72 75 6e 2d 69 64 29 29 0a 0a 3b 3b 20 64 6f 65  run-id))..;; doe
3ee0: 73 20 6e 6f 74 20 28 6f 62 76 69 6f 75 73 6c 79  s not (obviously
3ef0: 21 29 20 72 65 6d 6f 76 65 64 20 64 65 70 65 6e  !) removed depen
3f00: 64 65 6e 74 20 64 61 74 61 2e 20 0a 28 64 65 66  dent data. .(def
3f10: 69 6e 65 20 28 64 62 3a 64 65 6c 65 74 65 2d 72  ine (db:delete-r
3f20: 75 6e 20 64 62 20 72 75 6e 2d 69 64 29 0a 20 20  un db run-id).  
3f30: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
3f40: 20 64 62 20 22 44 45 4c 45 54 45 20 46 52 4f 4d   db "DELETE FROM
3f50: 20 72 75 6e 73 20 57 48 45 52 45 20 69 64 3d 3f   runs WHERE id=?
3f60: 3b 22 20 72 75 6e 2d 69 64 29 29 0a 0a 28 64 65  ;" run-id))..(de
3f70: 66 69 6e 65 20 28 64 62 3a 75 70 64 61 74 65 2d  fine (db:update-
3f80: 72 75 6e 2d 65 76 65 6e 74 5f 74 69 6d 65 20 64  run-event_time d
3f90: 62 20 72 75 6e 2d 69 64 29 0a 20 20 28 73 71 6c  b run-id).  (sql
3fa0: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
3fb0: 22 55 50 44 41 54 45 20 72 75 6e 73 20 53 45 54  "UPDATE runs SET
3fc0: 20 65 76 65 6e 74 5f 74 69 6d 65 3d 73 74 72 66   event_time=strf
3fd0: 74 69 6d 65 28 27 25 73 27 2c 27 6e 6f 77 27 29  time('%s','now')
3fe0: 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 72 75   WHERE id=?;" ru
3ff0: 6e 2d 69 64 29 29 20 0a 0a 3b 3b 3d 3d 3d 3d 3d  n-id)) ..;;=====
4000: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4010: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4030: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4040: 3d 0a 3b 3b 20 4b 20 45 20 59 20 53 0a 3b 3b 3d  =.;; K E Y S.;;=
4050: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4060: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4070: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4080: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4090: 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 67 65 74 20 6b 65  =====..;; get ke
40a0: 79 20 76 61 6c 20 70 61 69 72 73 20 66 6f 72 20  y val pairs for 
40b0: 61 20 67 69 76 65 6e 20 72 75 6e 2d 69 64 0a 3b  a given run-id.;
40c0: 3b 20 28 20 28 46 49 45 4c 44 4e 41 4d 45 31 20  ; ( (FIELDNAME1 
40d0: 6b 65 79 76 61 6c 31 29 20 28 46 49 45 4c 44 4e  keyval1) (FIELDN
40e0: 41 4d 45 32 20 6b 65 79 76 61 6c 32 29 20 2e 2e  AME2 keyval2) ..
40f0: 2e 20 29 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  . ).(define (db:
4100: 67 65 74 2d 6b 65 79 2d 76 61 6c 2d 70 61 69 72  get-key-val-pair
4110: 73 20 64 62 20 72 75 6e 2d 69 64 29 0a 20 20 28  s db run-id).  (
4120: 6c 65 74 2a 20 28 28 6b 65 79 73 20 28 67 65 74  let* ((keys (get
4130: 2d 6b 65 79 73 20 64 62 29 29 0a 09 20 28 72 65  -keys db)).. (re
4140: 73 20 20 27 28 29 29 29 0a 20 20 20 20 28 64 65  s  '())).    (de
4150: 62 75 67 3a 70 72 69 6e 74 20 36 20 22 6b 65 79  bug:print 6 "key
4160: 73 3a 20 22 20 6b 65 79 73 20 22 20 72 75 6e 2d  s: " keys " run-
4170: 69 64 3a 20 22 20 72 75 6e 2d 69 64 29 0a 20 20  id: " run-id).  
4180: 20 20 28 66 6f 72 2d 65 61 63 68 20 0a 20 20 20    (for-each .   
4190: 20 20 28 6c 61 6d 62 64 61 20 28 6b 65 79 29 0a    (lambda (key).
41a0: 20 20 20 20 20 20 20 28 6c 65 74 20 28 28 71 72         (let ((qr
41b0: 79 20 28 63 6f 6e 63 20 22 53 45 4c 45 43 54 20  y (conc "SELECT 
41c0: 22 20 28 6b 65 79 3a 67 65 74 2d 66 69 65 6c 64  " (key:get-field
41d0: 6e 61 6d 65 20 6b 65 79 29 20 22 20 46 52 4f 4d  name key) " FROM
41e0: 20 72 75 6e 73 20 57 48 45 52 45 20 69 64 3d 3f   runs WHERE id=?
41f0: 3b 22 29 29 29 0a 09 20 3b 3b 20 28 64 65 62 75  ;"))).. ;; (debu
4200: 67 3a 70 72 69 6e 74 20 30 20 22 71 72 79 3a 20  g:print 0 "qry: 
4210: 22 20 71 72 79 29 0a 09 20 28 73 71 6c 69 74 65  " qry).. (sqlite
4220: 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a  3:for-each-row .
4230: 09 20 20 28 6c 61 6d 62 64 61 20 28 6b 65 79 2d  .  (lambda (key-
4240: 76 61 6c 29 0a 09 20 20 20 20 28 73 65 74 21 20  val)..    (set! 
4250: 72 65 73 20 28 63 6f 6e 73 20 28 6c 69 73 74 20  res (cons (list 
4260: 28 6b 65 79 3a 67 65 74 2d 66 69 65 6c 64 6e 61  (key:get-fieldna
4270: 6d 65 20 6b 65 79 29 20 6b 65 79 2d 76 61 6c 29  me key) key-val)
4280: 20 72 65 73 29 29 29 0a 09 20 20 64 62 20 71 72   res)))..  db qr
4290: 79 20 72 75 6e 2d 69 64 29 29 29 0a 20 20 20 20  y run-id))).    
42a0: 20 6b 65 79 73 29 0a 20 20 20 20 28 72 65 76 65   keys).    (reve
42b0: 72 73 65 20 72 65 73 29 29 29 0a 0a 3b 3b 20 67  rse res)))..;; g
42c0: 65 74 20 6b 65 79 20 76 61 6c 73 20 66 6f 72 20  et key vals for 
42d0: 61 20 67 69 76 65 6e 20 72 75 6e 2d 69 64 0a 28  a given run-id.(
42e0: 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 6b  define (db:get-k
42f0: 65 79 2d 76 61 6c 73 20 64 62 20 72 75 6e 2d 69  ey-vals db run-i
4300: 64 29 0a 20 20 28 6c 65 74 2a 20 28 28 6b 65 79  d).  (let* ((key
4310: 73 20 28 67 65 74 2d 6b 65 79 73 20 64 62 29 29  s (get-keys db))
4320: 0a 09 20 28 72 65 73 20 20 27 28 29 29 29 0a 20  .. (res  '())). 
4330: 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20     (debug:print 
4340: 36 20 22 6b 65 79 73 3a 20 22 20 6b 65 79 73 20  6 "keys: " keys 
4350: 22 20 72 75 6e 2d 69 64 3a 20 22 20 72 75 6e 2d  " run-id: " run-
4360: 69 64 29 0a 20 20 20 20 28 66 6f 72 2d 65 61 63  id).    (for-eac
4370: 68 20 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20  h .     (lambda 
4380: 28 6b 65 79 29 0a 20 20 20 20 20 20 20 28 6c 65  (key).       (le
4390: 74 20 28 28 71 72 79 20 28 63 6f 6e 63 20 22 53  t ((qry (conc "S
43a0: 45 4c 45 43 54 20 22 20 28 6b 65 79 3a 67 65 74  ELECT " (key:get
43b0: 2d 66 69 65 6c 64 6e 61 6d 65 20 6b 65 79 29 20  -fieldname key) 
43c0: 22 20 46 52 4f 4d 20 72 75 6e 73 20 57 48 45 52  " FROM runs WHER
43d0: 45 20 69 64 3d 3f 3b 22 29 29 29 0a 09 20 3b 3b  E id=?;"))).. ;;
43e0: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 30 20   (debug:print 0 
43f0: 22 71 72 79 3a 20 22 20 71 72 79 29 0a 09 20 28  "qry: " qry).. (
4400: 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68  sqlite3:for-each
4410: 2d 72 6f 77 20 0a 09 20 20 28 6c 61 6d 62 64 61  -row ..  (lambda
4420: 20 28 6b 65 79 2d 76 61 6c 29 0a 09 20 20 20 20   (key-val)..    
4430: 28 73 65 74 21 20 72 65 73 20 28 63 6f 6e 73 20  (set! res (cons 
4440: 6b 65 79 2d 76 61 6c 20 72 65 73 29 29 29 0a 09  key-val res)))..
4450: 20 20 64 62 20 71 72 79 20 72 75 6e 2d 69 64 29    db qry run-id)
4460: 29 29 0a 20 20 20 20 20 6b 65 79 73 29 0a 20 20  )).     keys).  
4470: 20 20 28 72 65 76 65 72 73 65 20 72 65 73 29 29    (reverse res))
4480: 29 0a 0a 3b 3b 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 3d 3d  ================
44c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 20  ===========.;;  
44d0: 54 20 45 20 53 20 54 20 53 0a 3b 3b 3d 3d 3d 3d  T E S T S.;;====
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 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4520: 3d 3d 0a 0a 3b 3b 20 73 74 61 74 65 73 20 61 6e  ==..;; states an
4530: 64 20 73 74 61 74 75 73 65 73 20 61 72 65 20 6c  d statuses are l
4540: 69 73 74 73 2c 20 74 75 72 6e 20 74 68 65 6d 20  ists, turn them 
4550: 69 6e 74 6f 20 28 22 50 41 53 53 22 2c 22 46 41  into ("PASS","FA
4560: 49 4c 22 2e 2e 2e 29 20 61 6e 64 20 75 73 65 20  IL"...) and use 
4570: 4e 4f 54 20 49 4e 0a 3b 3b 20 69 2e 65 2e 20 74  NOT IN.;; i.e. t
4580: 68 65 73 65 20 6c 69 73 74 73 20 64 65 66 69 6e  hese lists defin
4590: 65 20 77 68 61 74 20 74 6f 20 4e 4f 54 20 73 68  e what to NOT sh
45a0: 6f 77 2e 0a 3b 3b 20 73 74 61 74 65 73 20 61 6e  ow..;; states an
45b0: 64 20 73 74 61 74 75 73 65 73 20 61 72 65 20 72  d statuses are r
45c0: 65 71 75 69 72 65 64 20 74 6f 20 62 65 20 6c 69  equired to be li
45d0: 73 74 73 2c 20 65 6d 70 74 79 20 69 73 20 6f 6b  sts, empty is ok
45e0: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74  .(define (db:get
45f0: 2d 74 65 73 74 73 2d 66 6f 72 2d 72 75 6e 20 64  -tests-for-run d
4600: 62 20 72 75 6e 2d 69 64 20 74 65 73 74 70 61 74  b run-id testpat
4610: 74 20 69 74 65 6d 70 61 74 74 20 73 74 61 74 65  t itempatt state
4620: 73 20 73 74 61 74 75 73 65 73 29 0a 20 20 28 6c  s statuses).  (l
4630: 65 74 2a 20 28 28 72 65 73 20 27 28 29 29 0a 09  et* ((res '())..
4640: 20 28 73 74 61 74 65 73 2d 73 74 72 20 20 20 20   (states-str    
4650: 28 63 6f 6e 63 20 22 28 27 22 20 28 73 74 72 69  (conc "('" (stri
4660: 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 73  ng-intersperse s
4670: 74 61 74 65 73 20 20 20 22 27 2c 27 22 29 20 22  tates   "','") "
4680: 27 29 22 29 29 0a 09 20 28 73 74 61 74 75 73 65  ')")).. (statuse
4690: 73 2d 73 74 72 20 20 28 63 6f 6e 63 20 22 28 27  s-str  (conc "('
46a0: 22 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73  " (string-inters
46b0: 70 65 72 73 65 20 73 74 61 74 75 73 65 73 20 22  perse statuses "
46c0: 27 2c 27 22 29 20 22 27 29 22 29 29 0a 09 20 28  ','") "')")).. (
46d0: 71 72 79 20 20 20 20 20 20 28 63 6f 6e 63 20 22  qry      (conc "
46e0: 53 45 4c 45 43 54 20 69 64 2c 72 75 6e 5f 69 64  SELECT id,run_id
46f0: 2c 74 65 73 74 6e 61 6d 65 2c 73 74 61 74 65 2c  ,testname,state,
4700: 73 74 61 74 75 73 2c 65 76 65 6e 74 5f 74 69 6d  status,event_tim
4710: 65 2c 68 6f 73 74 2c 63 70 75 6c 6f 61 64 2c 64  e,host,cpuload,d
4720: 69 73 6b 66 72 65 65 2c 75 6e 61 6d 65 2c 72 75  iskfree,uname,ru
4730: 6e 64 69 72 2c 69 74 65 6d 5f 70 61 74 68 2c 72  ndir,item_path,r
4740: 75 6e 5f 64 75 72 61 74 69 6f 6e 2c 66 69 6e 61  un_duration,fina
4750: 6c 5f 6c 6f 67 66 2c 63 6f 6d 6d 65 6e 74 20 22  l_logf,comment "
4760: 0a 09 09 09 20 22 20 46 52 4f 4d 20 74 65 73 74  .... " FROM test
4770: 73 20 57 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f  s WHERE run_id=?
4780: 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 20 6c 69   AND testname li
4790: 6b 65 20 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61  ke ? AND item_pa
47a0: 74 68 20 4c 49 4b 45 20 3f 20 22 20 0a 09 09 09  th LIKE ? " ....
47b0: 20 22 20 41 4e 44 20 4e 4f 54 20 28 73 74 61 74   " AND NOT (stat
47c0: 65 20 69 6e 20 22 20 73 74 61 74 65 73 2d 73 74  e in " states-st
47d0: 72 20 22 20 41 4e 44 20 73 74 61 74 75 73 20 49  r " AND status I
47e0: 4e 20 22 20 73 74 61 74 75 73 65 73 2d 73 74 72  N " statuses-str
47f0: 20 22 29 20 22 0a 09 09 09 20 3b 3b 20 22 20 4f   ") ".... ;; " O
4800: 52 44 45 52 20 42 59 20 69 64 20 44 45 53 43 3b  RDER BY id DESC;
4810: 22 0a 09 09 09 20 22 20 4f 52 44 45 52 20 42 59  ".... " ORDER BY
4820: 20 65 76 65 6e 74 5f 74 69 6d 65 20 41 53 43 3b   event_time ASC;
4830: 22 20 3b 3b 20 50 4f 54 45 4e 54 49 41 4c 20 49  " ;; POTENTIAL I
4840: 53 53 55 45 21 20 43 48 45 43 4b 20 4d 45 21 20  SSUE! CHECK ME! 
4850: 44 6f 65 73 20 61 6e 79 74 69 6e 67 20 64 65 70  Does anyting dep
4860: 65 6e 64 20 6f 6e 20 74 68 69 73 20 62 65 69 6e  end on this bein
4870: 67 20 73 6f 72 74 65 64 20 62 79 20 69 64 3f 0a  g sorted by id?.
4880: 09 09 09 20 29 29 29 0a 20 20 20 20 28 64 65 62  ... ))).    (deb
4890: 75 67 3a 70 72 69 6e 74 20 38 20 22 49 4e 46 4f  ug:print 8 "INFO
48a0: 3a 20 64 62 3a 67 65 74 2d 74 65 73 74 73 2d 66  : db:get-tests-f
48b0: 6f 72 2d 72 75 6e 20 71 72 79 3d 22 20 71 72 79  or-run qry=" qry
48c0: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66  ).    (sqlite3:f
48d0: 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20 20  or-each-row .   
48e0: 20 20 28 6c 61 6d 62 64 61 20 28 61 20 2e 20 62    (lambda (a . b
48f0: 29 20 3b 3b 20 69 64 20 72 75 6e 2d 69 64 20 74  ) ;; id run-id t
4900: 65 73 74 6e 61 6d 65 20 73 74 61 74 65 20 73 74  estname state st
4910: 61 74 75 73 20 65 76 65 6e 74 2d 74 69 6d 65 20  atus event-time 
4920: 68 6f 73 74 20 63 70 75 6c 6f 61 64 20 64 69 73  host cpuload dis
4930: 6b 66 72 65 65 20 75 6e 61 6d 65 20 72 75 6e 64  kfree uname rund
4940: 69 72 20 69 74 65 6d 2d 70 61 74 68 20 72 75 6e  ir item-path run
4950: 2d 64 75 72 61 74 69 6f 6e 20 66 69 6e 61 6c 2d  -duration final-
4960: 6c 6f 67 66 20 63 6f 6d 6d 65 6e 74 29 0a 20 20  logf comment).  
4970: 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28       (set! res (
4980: 63 6f 6e 73 20 28 61 70 70 6c 79 20 76 65 63 74  cons (apply vect
4990: 6f 72 20 61 20 62 29 20 72 65 73 29 29 29 20 3b  or a b) res))) ;
49a0: 3b 20 69 64 20 72 75 6e 2d 69 64 20 74 65 73 74  ; id run-id test
49b0: 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61 74 75  name state statu
49c0: 73 20 65 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73  s event-time hos
49d0: 74 20 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72  t cpuload diskfr
49e0: 65 65 20 75 6e 61 6d 65 20 72 75 6e 64 69 72 20  ee uname rundir 
49f0: 69 74 65 6d 2d 70 61 74 68 20 72 75 6e 2d 64 75  item-path run-du
4a00: 72 61 74 69 6f 6e 20 66 69 6e 61 6c 2d 6c 6f 67  ration final-log
4a10: 66 20 63 6f 6d 6d 65 6e 74 29 20 72 65 73 29 29  f comment) res))
4a20: 29 0a 20 20 20 20 20 64 62 20 0a 20 20 20 20 20  ).     db .     
4a30: 71 72 79 0a 20 20 20 20 20 72 75 6e 2d 69 64 0a  qry.     run-id.
4a40: 20 20 20 20 20 28 69 66 20 74 65 73 74 70 61 74       (if testpat
4a50: 74 20 74 65 73 74 70 61 74 74 20 22 25 22 29 0a  t testpatt "%").
4a60: 20 20 20 20 20 28 69 66 20 69 74 65 6d 70 61 74       (if itempat
4a70: 74 20 69 74 65 6d 70 61 74 74 20 22 25 22 29 29  t itempatt "%"))
4a80: 0a 20 20 20 20 72 65 73 29 29 0a 0a 3b 3b 20 74  .    res))..;; t
4a90: 68 69 73 20 6f 6e 65 20 69 73 20 61 20 62 69 74  his one is a bit
4aa0: 20 62 72 6f 6b 65 6e 20 42 55 47 20 46 49 58 4d   broken BUG FIXM
4ab0: 45 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 64 65  E.(define (db:de
4ac0: 6c 65 74 65 2d 74 65 73 74 2d 73 74 65 70 2d 72  lete-test-step-r
4ad0: 65 63 6f 72 64 73 20 64 62 20 72 75 6e 2d 69 64  ecords db run-id
4ae0: 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 64   test-name itemd
4af0: 61 74 29 0a 20 20 3b 3b 20 42 72 65 61 6b 69 6e  at).  ;; Breakin
4b00: 67 20 69 74 20 69 6e 74 6f 20 74 77 6f 20 71 75  g it into two qu
4b10: 65 72 69 65 73 20 66 6f 72 20 62 65 74 74 65 72  eries for better
4b20: 20 66 69 6c 65 20 61 63 63 65 73 73 20 69 6e 74   file access int
4b30: 65 72 6c 65 61 76 69 6e 67 0a 20 20 28 6c 65 74  erleaving.  (let
4b40: 20 28 28 69 64 73 20 27 28 29 29 29 0a 20 20 20   ((ids '())).   
4b50: 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61   (sqlite3:for-ea
4b60: 63 68 2d 72 6f 77 20 28 6c 61 6d 62 64 61 20 28  ch-row (lambda (
4b70: 69 64 29 0a 09 09 09 20 20 20 20 28 73 65 74 21  id)....    (set!
4b80: 20 69 64 73 20 28 63 6f 6e 73 20 69 64 20 69 64   ids (cons id id
4b90: 73 29 29 29 0a 09 09 09 20 20 64 62 0a 09 09 09  s)))....  db....
4ba0: 20 20 22 53 45 4c 45 43 54 20 69 64 20 46 52 4f    "SELECT id FRO
4bb0: 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 72 75  M tests WHERE ru
4bc0: 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e  n_id=? AND testn
4bd0: 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70  ame=? AND item_p
4be0: 61 74 68 3d 3f 3b 22 0a 09 09 09 20 20 72 75 6e  ath=?;"....  run
4bf0: 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 28 69  -id test-name (i
4c00: 74 65 6d 2d 6c 69 73 74 2d 3e 70 61 74 68 20 69  tem-list->path i
4c10: 74 65 6d 64 61 74 29 29 0a 20 20 20 20 28 66 6f  temdat)).    (fo
4c20: 72 2d 65 61 63 68 20 28 6c 61 6d 62 64 61 20 28  r-each (lambda (
4c30: 69 64 29 0a 09 09 28 73 71 6c 69 74 65 33 3a 65  id)...(sqlite3:e
4c40: 78 65 63 75 74 65 20 64 62 20 22 44 45 4c 45 54  xecute db "DELET
4c50: 45 20 46 52 4f 4d 20 74 65 73 74 5f 73 74 65 70  E FROM test_step
4c60: 73 20 57 48 45 52 45 20 74 65 73 74 5f 69 64 3d  s WHERE test_id=
4c70: 3f 3b 22 20 69 64 29 0a 09 09 28 74 68 72 65 61  ?;" id)...(threa
4c80: 64 2d 73 6c 65 65 70 21 20 30 2e 31 29 20 3b 3b  d-sleep! 0.1) ;;
4c90: 20 67 69 76 65 20 6f 74 68 65 72 73 20 61 63 63   give others acc
4ca0: 65 73 73 20 74 6f 20 74 68 65 20 64 62 0a 20 20  ess to the db.  
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
4cc0: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64  qlite3:execute d
4cd0: 62 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74  b "DELETE FROM t
4ce0: 65 73 74 5f 64 61 74 61 20 57 48 45 52 45 20 74  est_data WHERE t
4cf0: 65 73 74 5f 69 64 3d 3f 3b 22 20 69 64 29 0a 20  est_id=?;" id). 
4d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
4d10: 74 68 72 65 61 64 2d 73 6c 65 65 70 21 20 30 2e  thread-sleep! 0.
4d20: 31 29 29 20 3b 3b 20 67 69 76 65 20 6f 74 68 65  1)) ;; give othe
4d30: 72 73 20 61 63 63 65 73 73 20 74 6f 20 74 68 65  rs access to the
4d40: 20 64 62 0a 09 20 20 20 20 20 20 69 64 73 29 29   db..      ids))
4d50: 29 0a 3b 3b 22 44 45 4c 45 54 45 20 46 52 4f 4d  ).;;"DELETE FROM
4d60: 20 74 65 73 74 5f 73 74 65 70 73 20 57 48 45 52   test_steps WHER
4d70: 45 20 74 65 73 74 5f 69 64 20 69 6e 20 28 53 45  E test_id in (SE
4d80: 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 74 65 73  LECT id FROM tes
4d90: 74 73 20 57 48 45 52 45 20 72 75 6e 5f 69 64 3d  ts WHERE run_id=
4da0: 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f  ? AND testname=?
4db0: 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 3d 3f   AND item_path=?
4dc0: 29 3b 22 20 0a 09 09 20 20 20 0a 3b 3b 20 0a 28  );" ...   .;; .(
4dd0: 64 65 66 69 6e 65 20 28 64 62 3a 64 65 6c 65 74  define (db:delet
4de0: 65 2d 74 65 73 74 2d 72 65 63 6f 72 64 73 20 64  e-test-records d
4df0: 62 20 74 65 73 74 2d 69 64 29 0a 20 20 28 73 71  b test-id).  (sq
4e00: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62  lite3:execute db
4e10: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 65   "DELETE FROM te
4e20: 73 74 5f 73 74 65 70 73 20 57 48 45 52 45 20 74  st_steps WHERE t
4e30: 65 73 74 5f 69 64 3d 3f 3b 22 20 74 65 73 74 2d  est_id=?;" test-
4e40: 69 64 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65  id).  (sqlite3:e
4e50: 78 65 63 75 74 65 20 64 62 20 22 44 45 4c 45 54  xecute db "DELET
4e60: 45 20 46 52 4f 4d 20 74 65 73 74 5f 64 61 74 61  E FROM test_data
4e70: 20 20 57 48 45 52 45 20 74 65 73 74 5f 69 64 3d    WHERE test_id=
4e80: 3f 3b 22 20 74 65 73 74 2d 69 64 29 0a 20 20 28  ?;" test-id).  (
4e90: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
4ea0: 64 62 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  db "DELETE FROM 
4eb0: 74 65 73 74 73 20 57 48 45 52 45 20 69 64 3d 3f  tests WHERE id=?
4ec0: 3b 22 20 74 65 73 74 2d 69 64 29 29 0a 0a 3b 3b  ;" test-id))..;;
4ed0: 20 73 65 74 20 74 65 73 74 73 20 77 69 74 68 20   set tests with 
4ee0: 73 74 61 74 65 20 63 75 72 72 73 74 61 74 65 20  state currstate 
4ef0: 61 6e 64 20 73 74 61 74 75 73 20 63 75 72 72 73  and status currs
4f00: 74 61 74 75 73 20 74 6f 20 6e 65 77 73 74 61 74  tatus to newstat
4f10: 65 20 61 6e 64 20 6e 65 77 73 74 61 74 75 73 0a  e and newstatus.
4f20: 3b 3b 20 75 73 65 20 63 75 72 72 73 74 61 74 65  ;; use currstate
4f30: 20 3d 20 23 66 20 61 6e 64 20 6f 72 20 63 75 72   = #f and or cur
4f40: 72 73 74 61 74 75 73 20 3d 20 23 66 20 74 6f 20  rstatus = #f to 
4f50: 61 70 70 6c 79 20 74 6f 20 61 6e 79 20 73 74 61  apply to any sta
4f60: 74 65 20 6f 72 20 73 74 61 74 75 73 20 72 65 73  te or status res
4f70: 70 65 63 74 69 76 65 6c 79 0a 3b 3b 20 57 41 52  pectively.;; WAR
4f80: 4e 49 4e 47 3a 20 53 51 4c 20 69 6e 6a 65 63 74  NING: SQL inject
4f90: 69 6f 6e 20 72 69 73 6b 0a 28 64 65 66 69 6e 65  ion risk.(define
4fa0: 20 28 64 62 3a 73 65 74 2d 74 65 73 74 73 2d 73   (db:set-tests-s
4fb0: 74 61 74 65 2d 73 74 61 74 75 73 20 64 62 20 72  tate-status db r
4fc0: 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 73 20  un-id testnames 
4fd0: 63 75 72 72 73 74 61 74 65 20 63 75 72 72 73 74  currstate currst
4fe0: 61 74 75 73 20 6e 65 77 73 74 61 74 65 20 6e 65  atus newstate ne
4ff0: 77 73 74 61 74 75 73 29 0a 20 20 28 66 6f 72 2d  wstatus).  (for-
5000: 65 61 63 68 20 28 6c 61 6d 62 64 61 20 28 74 65  each (lambda (te
5010: 73 74 6e 61 6d 65 29 0a 09 20 20 20 20 20 20 28  stname)..      (
5020: 6c 65 74 20 28 28 71 72 79 20 28 63 6f 6e 63 20  let ((qry (conc 
5030: 22 55 50 44 41 54 45 20 74 65 73 74 73 20 53 45  "UPDATE tests SE
5040: 54 20 73 74 61 74 65 3d 3f 2c 73 74 61 74 75 73  T state=?,status
5050: 3d 3f 20 57 48 45 52 45 20 22 0a 09 09 09 20 20  =? WHERE "....  
5060: 20 20 20 20 20 28 69 66 20 63 75 72 72 73 74 61       (if currsta
5070: 74 65 20 20 28 63 6f 6e 63 20 22 73 74 61 74 65  te  (conc "state
5080: 3d 27 22 20 63 75 72 72 73 74 61 74 65 20 22 27  ='" currstate "'
5090: 20 41 4e 44 20 22 29 20 22 22 29 0a 09 09 09 20   AND ") "").... 
50a0: 20 20 20 20 20 20 28 69 66 20 63 75 72 72 73 74        (if currst
50b0: 61 74 75 73 20 28 63 6f 6e 63 20 22 73 74 61 74  atus (conc "stat
50c0: 75 73 3d 27 22 20 63 75 72 72 73 74 61 74 75 73  us='" currstatus
50d0: 20 22 27 20 41 4e 44 20 22 29 20 22 22 29 0a 09   "' AND ") "")..
50e0: 09 09 20 20 20 20 20 20 20 22 20 72 75 6e 5f 69  ..       " run_i
50f0: 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65  d=? AND testname
5100: 3d 3f 20 41 4e 44 20 4e 4f 54 20 28 69 74 65 6d  =? AND NOT (item
5110: 5f 70 61 74 68 3d 27 27 20 41 4e 44 20 74 65 73  _path='' AND tes
5120: 74 6e 61 6d 65 20 69 6e 20 28 53 45 4c 45 43 54  tname in (SELECT
5130: 20 44 49 53 54 49 4e 43 54 20 74 65 73 74 6e 61   DISTINCT testna
5140: 6d 65 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48  me FROM tests WH
5150: 45 52 45 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41  ERE testname=? A
5160: 4e 44 20 69 74 65 6d 5f 70 61 74 68 20 21 3d 20  ND item_path != 
5170: 27 27 29 29 3b 22 29 29 29 0a 09 09 3b 3b 28 64  ''));")))...;;(d
5180: 65 62 75 67 3a 70 72 69 6e 74 20 30 20 22 51 52  ebug:print 0 "QR
5190: 59 3a 20 22 20 71 72 79 29 0a 09 09 28 73 71 6c  Y: " qry)...(sql
51a0: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
51b0: 71 72 79 20 72 75 6e 2d 69 64 20 6e 65 77 73 74  qry run-id newst
51c0: 61 74 65 20 6e 65 77 73 74 61 74 75 73 20 74 65  ate newstatus te
51d0: 73 74 6e 61 6d 65 20 74 65 73 74 6e 61 6d 65 29  stname testname)
51e0: 29 29 0a 09 20 20 20 20 74 65 73 74 6e 61 6d 65  ))..    testname
51f0: 73 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62  s))..(define (db
5200: 3a 64 65 6c 65 74 65 2d 74 65 73 74 73 2d 69 6e  :delete-tests-in
5210: 2d 73 74 61 74 65 20 64 62 20 72 75 6e 2d 69 64  -state db run-id
5220: 20 73 74 61 74 65 29 0a 20 20 28 73 71 6c 69 74   state).  (sqlit
5230: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 44  e3:execute db "D
5240: 45 4c 45 54 45 20 46 52 4f 4d 20 74 65 73 74 73  ELETE FROM tests
5250: 20 57 48 45 52 45 20 73 74 61 74 65 3d 3f 20 41   WHERE state=? A
5260: 4e 44 20 72 75 6e 5f 69 64 3d 3f 3b 22 20 73 74  ND run_id=?;" st
5270: 61 74 65 20 72 75 6e 2d 69 64 29 29 0a 0a 28 64  ate run-id))..(d
5280: 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74 2d 73  efine (db:test-s
5290: 65 74 2d 73 74 61 74 65 2d 73 74 61 74 75 73 2d  et-state-status-
52a0: 62 79 2d 69 64 20 64 62 20 74 65 73 74 2d 69 64  by-id db test-id
52b0: 20 6e 65 77 73 74 61 74 65 20 6e 65 77 73 74 61   newstate newsta
52c0: 74 75 73 20 6e 65 77 63 6f 6d 6d 65 6e 74 29 0a  tus newcomment).
52d0: 20 20 28 69 66 20 6e 65 77 73 74 61 74 65 20 20    (if newstate  
52e0: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
52f0: 65 20 64 62 20 22 55 50 44 41 54 45 20 74 65 73  e db "UPDATE tes
5300: 74 73 20 53 45 54 20 73 74 61 74 65 3d 3f 20 20  ts SET state=?  
5310: 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 6e 65   WHERE id=?;" ne
5320: 77 73 74 61 74 65 20 20 20 74 65 73 74 2d 69 64  wstate   test-id
5330: 29 29 0a 20 20 28 69 66 20 6e 65 77 73 74 61 74  )).  (if newstat
5340: 75 73 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65  us  (sqlite3:exe
5350: 63 75 74 65 20 64 62 20 22 55 50 44 41 54 45 20  cute db "UPDATE 
5360: 74 65 73 74 73 20 53 45 54 20 73 74 61 74 75 73  tests SET status
5370: 3d 3f 20 20 57 48 45 52 45 20 69 64 3d 3f 3b 22  =?  WHERE id=?;"
5380: 20 6e 65 77 73 74 61 74 75 73 20 20 74 65 73 74   newstatus  test
5390: 2d 69 64 29 29 0a 20 20 28 69 66 20 6e 65 77 63  -id)).  (if newc
53a0: 6f 6d 6d 65 6e 74 20 28 73 71 6c 69 74 65 33 3a  omment (sqlite3:
53b0: 65 78 65 63 75 74 65 20 64 62 20 22 55 50 44 41  execute db "UPDA
53c0: 54 45 20 74 65 73 74 73 20 53 45 54 20 63 6f 6d  TE tests SET com
53d0: 6d 65 6e 74 3d 3f 20 57 48 45 52 45 20 69 64 3d  ment=? WHERE id=
53e0: 3f 3b 22 20 6e 65 77 63 6f 6d 6d 65 6e 74 20 74  ?;" newcomment t
53f0: 65 73 74 2d 69 64 29 29 29 0a 0a 28 64 65 66 69  est-id)))..(defi
5400: 6e 65 20 28 64 62 3a 74 65 73 74 2d 73 65 74 2d  ne (db:test-set-
5410: 73 74 61 74 65 2d 73 74 61 74 75 73 2d 62 79 2d  state-status-by-
5420: 72 75 6e 2d 69 64 2d 74 65 73 74 6e 61 6d 65 20  run-id-testname 
5430: 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e  db run-id test-n
5440: 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 73 74  ame item-path st
5450: 61 74 75 73 20 73 74 61 74 65 29 0a 20 20 28 73  atus state).  (s
5460: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64  qlite3:execute d
5470: 62 20 22 55 50 44 41 54 45 20 74 65 73 74 73 20  b "UPDATE tests 
5480: 53 45 54 20 73 74 61 74 65 3d 3f 2c 73 74 61 74  SET state=?,stat
5490: 75 73 3d 3f 2c 65 76 65 6e 74 5f 74 69 6d 65 3d  us=?,event_time=
54a0: 73 74 72 66 74 69 6d 65 28 27 25 73 27 2c 27 6e  strftime('%s','n
54b0: 6f 77 27 29 20 57 48 45 52 45 20 72 75 6e 5f 69  ow') WHERE run_i
54c0: 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65  d=? AND testname
54d0: 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68  =? AND item_path
54e0: 3d 3f 3b 22 20 0a 09 09 20 20 20 73 74 61 74 65  =?;" ...   state
54f0: 20 73 74 61 74 75 73 20 72 75 6e 2d 69 64 20 74   status run-id t
5500: 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61  est-name item-pa
5510: 74 68 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64  th))..(define (d
5520: 62 3a 67 65 74 2d 63 6f 75 6e 74 2d 74 65 73 74  b:get-count-test
5530: 73 2d 72 75 6e 6e 69 6e 67 20 64 62 29 0a 20 20  s-running db).  
5540: 28 6c 65 74 20 28 28 72 65 73 20 30 29 29 0a 20  (let ((res 0)). 
5550: 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d     (sqlite3:for-
5560: 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c  each-row.     (l
5570: 61 6d 62 64 61 20 28 63 6f 75 6e 74 29 0a 20 20  ambda (count).  
5580: 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20 63       (set! res c
5590: 6f 75 6e 74 29 29 0a 20 20 20 20 20 64 62 0a 20  ount)).     db. 
55a0: 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e      "SELECT coun
55b0: 74 28 69 64 29 20 46 52 4f 4d 20 74 65 73 74 73  t(id) FROM tests
55c0: 20 57 48 45 52 45 20 73 74 61 74 65 20 3d 20 27   WHERE state = '
55d0: 52 55 4e 4e 49 4e 47 27 20 4f 52 20 73 74 61 74  RUNNING' OR stat
55e0: 65 20 3d 20 27 4c 41 55 4e 43 48 45 44 27 20 4f  e = 'LAUNCHED' O
55f0: 52 20 73 74 61 74 65 20 3d 20 27 52 45 4d 4f 54  R state = 'REMOT
5600: 45 48 4f 53 54 53 54 41 52 54 27 3b 22 29 0a 20  EHOSTSTART';"). 
5610: 20 20 20 72 65 73 29 29 0a 0a 28 64 65 66 69 6e     res))..(defin
5620: 65 20 28 64 62 3a 67 65 74 2d 63 6f 75 6e 74 2d  e (db:get-count-
5630: 74 65 73 74 73 2d 72 75 6e 6e 69 6e 67 2d 69 6e  tests-running-in
5640: 2d 6a 6f 62 67 72 6f 75 70 20 64 62 20 6a 6f 62  -jobgroup db job
5650: 67 72 6f 75 70 29 0a 20 20 28 69 66 20 28 6e 6f  group).  (if (no
5660: 74 20 6a 6f 62 67 72 6f 75 70 29 0a 20 20 20 20  t jobgroup).    
5670: 20 20 30 20 3b 3b 20 0a 20 20 20 20 20 20 28 6c    0 ;; .      (l
5680: 65 74 20 28 28 72 65 73 20 30 29 29 0a 09 28 73  et ((res 0))..(s
5690: 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d  qlite3:for-each-
56a0: 72 6f 77 0a 09 20 28 6c 61 6d 62 64 61 20 28 63  row.. (lambda (c
56b0: 6f 75 6e 74 29 0a 09 20 20 20 28 73 65 74 21 20  ount)..   (set! 
56c0: 72 65 73 20 63 6f 75 6e 74 29 29 0a 09 20 64 62  res count)).. db
56d0: 0a 09 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74  .. "SELECT count
56e0: 28 69 64 29 20 46 52 4f 4d 20 74 65 73 74 73 20  (id) FROM tests 
56f0: 57 48 45 52 45 20 73 74 61 74 65 20 3d 20 27 52  WHERE state = 'R
5700: 55 4e 4e 49 4e 47 27 20 4f 52 20 73 74 61 74 65  UNNING' OR state
5710: 20 3d 20 27 4c 41 55 4e 43 48 45 44 27 20 4f 52   = 'LAUNCHED' OR
5720: 20 73 74 61 74 65 20 3d 20 27 52 45 4d 4f 54 45   state = 'REMOTE
5730: 48 4f 53 54 53 54 41 52 54 27 0a 20 20 20 20 20  HOSTSTART'.     
5740: 20 20 20 20 20 20 20 20 41 4e 44 20 74 65 73 74          AND test
5750: 6e 61 6d 65 20 69 6e 20 28 53 45 4c 45 43 54 20  name in (SELECT 
5760: 74 65 73 74 6e 61 6d 65 20 46 52 4f 4d 20 74 65  testname FROM te
5770: 73 74 5f 6d 65 74 61 20 57 48 45 52 45 20 6a 6f  st_meta WHERE jo
5780: 62 67 72 6f 75 70 3d 3f 3b 22 0a 09 20 6a 6f 62  bgroup=?;".. job
5790: 67 72 6f 75 70 29 0a 09 72 65 73 29 29 29 0a 0a  group)..res)))..
57a0: 3b 3b 20 64 6f 6e 65 20 77 69 74 68 20 72 75 6e  ;; done with run
57b0: 20 77 68 65 6e 3a 0a 3b 3b 20 20 20 30 20 74 65   when:.;;   0 te
57c0: 73 74 73 20 69 6e 20 4c 41 55 4e 43 48 45 44 2c  sts in LAUNCHED,
57d0: 20 4e 4f 54 5f 53 54 41 52 54 45 44 2c 20 52 45   NOT_STARTED, RE
57e0: 4d 4f 54 45 48 4f 53 54 53 54 41 52 54 2c 20 52  MOTEHOSTSTART, R
57f0: 55 4e 4e 49 4e 47 0a 28 64 65 66 69 6e 65 20 28  UNNING.(define (
5800: 64 62 3a 65 73 74 69 6d 61 74 65 64 2d 74 65 73  db:estimated-tes
5810: 74 73 2d 72 65 6d 61 69 6e 69 6e 67 20 64 62 20  ts-remaining db 
5820: 72 75 6e 2d 69 64 29 0a 20 20 28 6c 65 74 20 28  run-id).  (let (
5830: 28 72 65 73 20 30 29 29 0a 20 20 20 20 28 73 71  (res 0)).    (sq
5840: 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72  lite3:for-each-r
5850: 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20  ow.     (lambda 
5860: 28 63 6f 75 6e 74 29 0a 20 20 20 20 20 20 20 28  (count).       (
5870: 73 65 74 21 20 72 65 73 20 63 6f 75 6e 74 29 29  set! res count))
5880: 0a 20 20 20 20 20 64 62 20 3b 3b 20 4e 42 2f 2f  .     db ;; NB//
5890: 20 4b 49 4c 4c 52 45 51 20 6d 65 61 6e 73 20 74   KILLREQ means t
58a0: 68 65 20 6a 6f 62 73 20 69 73 20 73 74 69 6c 6c  he jobs is still
58b0: 20 70 72 6f 62 61 62 6c 79 20 72 75 6e 6e 69 6e   probably runnin
58c0: 67 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20 63  g.     "SELECT c
58d0: 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 74 65  ount(id) FROM te
58e0: 73 74 73 20 57 48 45 52 45 20 73 74 61 74 65 20  sts WHERE state 
58f0: 69 6e 20 28 27 4c 41 55 4e 43 48 45 44 27 2c 27  in ('LAUNCHED','
5900: 4e 4f 54 5f 53 54 41 52 54 45 44 27 2c 27 52 45  NOT_STARTED','RE
5910: 4d 4f 54 45 48 4f 53 54 53 54 41 52 54 27 2c 27  MOTEHOSTSTART','
5920: 52 55 4e 4e 49 4e 47 27 2c 27 4b 49 4c 4c 52 45  RUNNING','KILLRE
5930: 51 27 29 20 41 4e 44 20 72 75 6e 5f 69 64 3d 3f  Q') AND run_id=?
5940: 3b 22 20 72 75 6e 2d 69 64 29 0a 20 20 20 20 72  ;" run-id).    r
5950: 65 73 29 29 0a 0a 3b 3b 20 4e 42 2f 2f 20 53 79  es))..;; NB// Sy
5960: 6e 63 20 74 68 69 73 20 77 69 74 68 20 72 75 6e  nc this with run
5970: 73 3a 67 65 74 2d 74 65 73 74 2d 69 6e 66 6f 0a  s:get-test-info.
5980: 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d  (define (db:get-
5990: 74 65 73 74 2d 69 6e 66 6f 20 64 62 20 72 75 6e  test-info db run
59a0: 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 69 74 65  -id testname ite
59b0: 6d 2d 70 61 74 68 29 0a 20 20 28 6c 65 74 20 28  m-path).  (let (
59c0: 28 72 65 73 20 23 66 29 29 0a 20 20 20 20 28 73  (res #f)).    (s
59d0: 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d  qlite3:for-each-
59e0: 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 64 61  row.     (lambda
59f0: 20 28 69 64 20 72 75 6e 2d 69 64 20 74 65 73 74   (id run-id test
5a00: 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61 74 75  name state statu
5a10: 73 20 65 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73  s event-time hos
5a20: 74 20 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72  t cpuload diskfr
5a30: 65 65 20 75 6e 61 6d 65 20 72 75 6e 64 69 72 20  ee uname rundir 
5a40: 69 74 65 6d 2d 70 61 74 68 20 72 75 6e 5f 64 75  item-path run_du
5a50: 72 61 74 69 6f 6e 20 66 69 6e 61 6c 5f 6c 6f 67  ration final_log
5a60: 66 20 63 6f 6d 6d 65 6e 74 20 29 0a 20 20 20 20  f comment ).    
5a70: 20 20 20 28 73 65 74 21 20 72 65 73 20 28 76 65     (set! res (ve
5a80: 63 74 6f 72 20 69 64 20 72 75 6e 2d 69 64 20 74  ctor id run-id t
5a90: 65 73 74 6e 61 6d 65 20 73 74 61 74 65 20 73 74  estname state st
5aa0: 61 74 75 73 20 65 76 65 6e 74 2d 74 69 6d 65 20  atus event-time 
5ab0: 68 6f 73 74 20 63 70 75 6c 6f 61 64 20 64 69 73  host cpuload dis
5ac0: 6b 66 72 65 65 20 75 6e 61 6d 65 20 72 75 6e 64  kfree uname rund
5ad0: 69 72 20 69 74 65 6d 2d 70 61 74 68 20 72 75 6e  ir item-path run
5ae0: 5f 64 75 72 61 74 69 6f 6e 20 66 69 6e 61 6c 5f  _duration final_
5af0: 6c 6f 67 66 20 63 6f 6d 6d 65 6e 74 20 29 29 29  logf comment )))
5b00: 0a 20 20 20 20 20 64 62 20 0a 20 20 20 20 20 22  .     db .     "
5b10: 53 45 4c 45 43 54 20 69 64 2c 72 75 6e 5f 69 64  SELECT id,run_id
5b20: 2c 74 65 73 74 6e 61 6d 65 2c 73 74 61 74 65 2c  ,testname,state,
5b30: 73 74 61 74 75 73 2c 65 76 65 6e 74 5f 74 69 6d  status,event_tim
5b40: 65 2c 68 6f 73 74 2c 63 70 75 6c 6f 61 64 2c 64  e,host,cpuload,d
5b50: 69 73 6b 66 72 65 65 2c 75 6e 61 6d 65 2c 72 75  iskfree,uname,ru
5b60: 6e 64 69 72 2c 69 74 65 6d 5f 70 61 74 68 2c 72  ndir,item_path,r
5b70: 75 6e 5f 64 75 72 61 74 69 6f 6e 2c 66 69 6e 61  un_duration,fina
5b80: 6c 5f 6c 6f 67 66 2c 63 6f 6d 6d 65 6e 74 20 46  l_logf,comment F
5b90: 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 20  ROM tests WHERE 
5ba0: 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73  run_id=? AND tes
5bb0: 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d  tname=? AND item
5bc0: 5f 70 61 74 68 3d 3f 3b 22 0a 20 20 20 20 20 72  _path=?;".     r
5bd0: 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 69  un-id testname i
5be0: 74 65 6d 2d 70 61 74 68 29 0a 20 20 20 20 72 65  tem-path).    re
5bf0: 73 29 29 0a 0a 3b 3b 20 47 65 74 20 74 65 73 74  s))..;; Get test
5c00: 20 64 61 74 61 20 75 73 69 6e 67 20 74 65 73 74   data using test
5c10: 5f 69 64 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  _id.(define (db:
5c20: 67 65 74 2d 74 65 73 74 2d 64 61 74 61 2d 62 79  get-test-data-by
5c30: 2d 69 64 20 64 62 20 74 65 73 74 2d 69 64 29 0a  -id db test-id).
5c40: 20 20 28 6c 65 74 20 28 28 72 65 73 20 23 66 29    (let ((res #f)
5c50: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66  ).    (sqlite3:f
5c60: 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 20  or-each-row.    
5c70: 20 28 6c 61 6d 62 64 61 20 28 69 64 20 72 75 6e   (lambda (id run
5c80: 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 73 74 61  -id testname sta
5c90: 74 65 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d  te status event-
5ca0: 74 69 6d 65 20 68 6f 73 74 20 63 70 75 6c 6f 61  time host cpuloa
5cb0: 64 20 64 69 73 6b 66 72 65 65 20 75 6e 61 6d 65  d diskfree uname
5cc0: 20 72 75 6e 64 69 72 20 69 74 65 6d 2d 70 61 74   rundir item-pat
5cd0: 68 20 72 75 6e 5f 64 75 72 61 74 69 6f 6e 20 66  h run_duration f
5ce0: 69 6e 61 6c 5f 6c 6f 67 66 20 63 6f 6d 6d 65 6e  inal_logf commen
5cf0: 74 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20  t).       (set! 
5d00: 72 65 73 20 28 76 65 63 74 6f 72 20 69 64 20 72  res (vector id r
5d10: 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 73  un-id testname s
5d20: 74 61 74 65 20 73 74 61 74 75 73 20 65 76 65 6e  tate status even
5d30: 74 2d 74 69 6d 65 20 68 6f 73 74 20 63 70 75 6c  t-time host cpul
5d40: 6f 61 64 20 64 69 73 6b 66 72 65 65 20 75 6e 61  oad diskfree una
5d50: 6d 65 20 72 75 6e 64 69 72 20 69 74 65 6d 2d 70  me rundir item-p
5d60: 61 74 68 20 72 75 6e 5f 64 75 72 61 74 69 6f 6e  ath run_duration
5d70: 20 66 69 6e 61 6c 5f 6c 6f 67 66 20 63 6f 6d 6d   final_logf comm
5d80: 65 6e 74 29 29 29 0a 20 20 20 20 20 64 62 20 0a  ent))).     db .
5d90: 20 20 20 20 20 22 53 45 4c 45 43 54 20 69 64 2c       "SELECT id,
5da0: 72 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d 65 2c  run_id,testname,
5db0: 73 74 61 74 65 2c 73 74 61 74 75 73 2c 65 76 65  state,status,eve
5dc0: 6e 74 5f 74 69 6d 65 2c 68 6f 73 74 2c 63 70 75  nt_time,host,cpu
5dd0: 6c 6f 61 64 2c 64 69 73 6b 66 72 65 65 2c 75 6e  load,diskfree,un
5de0: 61 6d 65 2c 72 75 6e 64 69 72 2c 69 74 65 6d 5f  ame,rundir,item_
5df0: 70 61 74 68 2c 72 75 6e 5f 64 75 72 61 74 69 6f  path,run_duratio
5e00: 6e 2c 66 69 6e 61 6c 5f 6c 6f 67 66 2c 63 6f 6d  n,final_logf,com
5e10: 6d 65 6e 74 20 46 52 4f 4d 20 74 65 73 74 73 20  ment FROM tests 
5e20: 57 48 45 52 45 20 69 64 3d 3f 3b 22 0a 20 20 20  WHERE id=?;".   
5e30: 20 20 74 65 73 74 2d 69 64 29 0a 20 20 20 20 72    test-id).    r
5e40: 65 73 29 29 0a 0a 0a 28 64 65 66 69 6e 65 20 28  es))...(define (
5e50: 64 62 3a 74 65 73 74 2d 73 65 74 2d 63 6f 6d 6d  db:test-set-comm
5e60: 65 6e 74 20 64 62 20 74 65 73 74 2d 69 64 20 63  ent db test-id c
5e70: 6f 6d 6d 65 6e 74 29 0a 20 20 28 73 71 6c 69 74  omment).  (sqlit
5e80: 65 33 3a 65 78 65 63 75 74 65 20 0a 20 20 20 64  e3:execute .   d
5e90: 62 20 0a 20 20 20 22 55 50 44 41 54 45 20 74 65  b .   "UPDATE te
5ea0: 73 74 73 20 53 45 54 20 63 6f 6d 6d 65 6e 74 3d  sts SET comment=
5eb0: 3f 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 0a 20  ? WHERE id=?;". 
5ec0: 20 20 63 6f 6d 6d 65 6e 74 20 74 65 73 74 2d 69    comment test-i
5ed0: 64 29 29 0a 0a 3b 3b 0a 28 64 65 66 69 6e 65 20  d))..;;.(define 
5ee0: 28 64 62 3a 74 65 73 74 2d 73 65 74 2d 72 75 6e  (db:test-set-run
5ef0: 64 69 72 21 20 64 62 20 72 75 6e 2d 69 64 20 74  dir! db run-id t
5f00: 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61  est-name item-pa
5f10: 74 68 20 72 75 6e 64 69 72 29 0a 20 20 28 73 71  th rundir).  (sq
5f20: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 0a 20  lite3:execute . 
5f30: 20 20 64 62 20 0a 20 20 20 22 55 50 44 41 54 45    db .   "UPDATE
5f40: 20 74 65 73 74 73 20 53 45 54 20 72 75 6e 64 69   tests SET rundi
5f50: 72 3d 3f 20 57 48 45 52 45 20 72 75 6e 5f 69 64  r=? WHERE run_id
5f60: 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d  =? AND testname=
5f70: 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 3d  ? AND item_path=
5f80: 3f 3b 22 0a 20 20 20 72 75 6e 64 69 72 20 72 75  ?;".   rundir ru
5f90: 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69  n-id test-name i
5fa0: 74 65 6d 2d 70 61 74 68 29 29 0a 0a 28 64 65 66  tem-path))..(def
5fb0: 69 6e 65 20 28 64 62 3a 74 65 73 74 2d 73 65 74  ine (db:test-set
5fc0: 2d 6c 6f 67 21 20 64 62 20 74 65 73 74 2d 69 64  -log! db test-id
5fd0: 20 6c 6f 67 66 29 0a 20 20 28 69 66 20 28 73 74   logf).  (if (st
5fe0: 72 69 6e 67 3f 20 6c 6f 67 66 29 0a 20 20 20 20  ring? logf).    
5ff0: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
6000: 74 65 20 64 62 20 22 55 50 44 41 54 45 20 74 65  te db "UPDATE te
6010: 73 74 73 20 53 45 54 20 66 69 6e 61 6c 5f 6c 6f  sts SET final_lo
6020: 67 66 3d 3f 20 57 48 45 52 45 20 69 64 3d 3f 3b  gf=? WHERE id=?;
6030: 22 0a 09 09 20 20 20 6c 6f 67 66 20 74 65 73 74  "...   logf test
6040: 2d 69 64 29 0a 20 20 20 20 20 20 28 64 65 62 75  -id).      (debu
6050: 67 3a 70 72 69 6e 74 20 30 20 22 45 52 52 4f 52  g:print 0 "ERROR
6060: 3a 20 64 62 3a 74 65 73 74 2d 73 65 74 2d 6c 6f  : db:test-set-lo
6070: 67 21 20 63 61 6c 6c 65 64 20 77 69 74 68 20 6e  g! called with n
6080: 6f 6e 2d 73 74 72 69 6e 67 20 6c 6f 67 20 66 69  on-string log fi
6090: 6c 65 20 6e 61 6d 65 20 22 20 6c 6f 67 66 29 29  le name " logf))
60a0: 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  )..;;===========
60b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
60c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
60d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
60e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 4d  ===========.;; M
60f0: 69 73 63 2e 20 74 65 73 74 20 72 65 6c 61 74 65  isc. test relate
6100: 64 20 71 75 65 72 69 65 73 0a 3b 3b 3d 3d 3d 3d  d queries.;;====
6110: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6120: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6130: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6140: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6150: 3d 3d 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  ==..(define (db:
6160: 74 65 73 74 2d 67 65 74 2d 70 61 74 68 73 2d 6d  test-get-paths-m
6170: 61 74 63 68 69 6e 67 20 64 62 20 6b 65 79 6e 61  atching db keyna
6180: 6d 65 73 20 74 61 72 67 65 74 29 0a 20 20 28 6c  mes target).  (l
6190: 65 74 2a 20 28 28 72 65 73 20 27 28 29 29 0a 09  et* ((res '())..
61a0: 20 28 69 74 65 6d 70 61 74 74 20 20 20 28 69 66   (itempatt   (if
61b0: 20 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22   (args:get-arg "
61c0: 2d 69 74 65 6d 70 61 74 74 22 29 28 61 72 67 73  -itempatt")(args
61d0: 3a 67 65 74 2d 61 72 67 20 22 2d 69 74 65 6d 70  :get-arg "-itemp
61e0: 61 74 74 22 29 20 22 25 22 29 29 0a 09 20 28 74  att") "%")).. (t
61f0: 65 73 74 70 61 74 74 20 20 20 28 69 66 20 28 61  estpatt   (if (a
6200: 72 67 73 3a 67 65 74 2d 61 72 67 20 22 2d 74 65  rgs:get-arg "-te
6210: 73 74 70 61 74 74 22 29 28 61 72 67 73 3a 67 65  stpatt")(args:ge
6220: 74 2d 61 72 67 20 22 2d 74 65 73 74 70 61 74 74  t-arg "-testpatt
6230: 22 29 20 22 25 22 29 29 0a 09 20 28 73 74 61 74  ") "%")).. (stat
6240: 65 70 61 74 74 20 20 28 69 66 20 28 61 72 67 73  epatt  (if (args
6250: 3a 67 65 74 2d 61 72 67 20 22 3a 73 74 61 74 65  :get-arg ":state
6260: 22 29 20 20 20 28 61 72 67 73 3a 67 65 74 2d 61  ")   (args:get-a
6270: 72 67 20 22 3a 73 74 61 74 65 22 29 20 20 20 20  rg ":state")    
6280: 22 25 22 29 29 0a 09 20 28 73 74 61 74 75 73 70  "%")).. (statusp
6290: 61 74 74 20 28 69 66 20 28 61 72 67 73 3a 67 65  att (if (args:ge
62a0: 74 2d 61 72 67 20 22 3a 73 74 61 74 75 73 22 29  t-arg ":status")
62b0: 20 20 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20    (args:get-arg 
62c0: 22 3a 73 74 61 74 75 73 22 29 20 20 20 22 25 22  ":status")   "%"
62d0: 29 29 0a 09 20 28 72 75 6e 6e 61 6d 65 20 20 20  )).. (runname   
62e0: 20 28 69 66 20 28 61 72 67 73 3a 67 65 74 2d 61   (if (args:get-a
62f0: 72 67 20 22 3a 72 75 6e 6e 61 6d 65 22 29 20 28  rg ":runname") (
6300: 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22 3a 72  args:get-arg ":r
6310: 75 6e 6e 61 6d 65 22 29 20 20 22 25 22 29 29 0a  unname")  "%")).
6320: 09 20 28 6b 65 79 73 74 72 20 28 73 74 72 69 6e  . (keystr (strin
6330: 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 0a 09  g-intersperse ..
6340: 09 20 20 28 6d 61 70 20 28 6c 61 6d 62 64 61 20  .  (map (lambda 
6350: 28 6b 65 79 20 76 61 6c 29 0a 09 09 09 20 28 63  (key val).... (c
6360: 6f 6e 63 20 22 72 2e 22 20 6b 65 79 20 22 20 6c  onc "r." key " l
6370: 69 6b 65 20 27 22 20 76 61 6c 20 22 27 22 29 29  ike '" val "'"))
6380: 0a 09 09 20 20 20 20 20 20 20 6b 65 79 6e 61 6d  ...       keynam
6390: 65 73 20 0a 09 09 20 20 20 20 20 20 20 28 73 74  es ...       (st
63a0: 72 69 6e 67 2d 73 70 6c 69 74 20 74 61 72 67 65  ring-split targe
63b0: 74 20 22 2f 22 29 29 0a 09 09 20 20 22 20 41 4e  t "/"))...  " AN
63c0: 44 20 22 29 29 0a 09 20 28 71 72 79 73 74 72 20  D ")).. (qrystr 
63d0: 28 63 6f 6e 63 20 22 53 45 4c 45 43 54 20 74 2e  (conc "SELECT t.
63e0: 72 75 6e 64 69 72 20 46 52 4f 4d 20 74 65 73 74  rundir FROM test
63f0: 73 20 41 53 20 74 20 49 4e 4e 45 52 20 4a 4f 49  s AS t INNER JOI
6400: 4e 20 72 75 6e 73 20 41 53 20 72 20 4f 4e 20 74  N runs AS r ON t
6410: 2e 72 75 6e 5f 69 64 3d 72 2e 69 64 20 57 48 45  .run_id=r.id WHE
6420: 52 45 20 22 0a 09 09 20 20 20 20 20 20 20 6b 65  RE "...       ke
6430: 79 73 74 72 20 22 20 41 4e 44 20 72 2e 72 75 6e  ystr " AND r.run
6440: 6e 61 6d 65 20 4c 49 4b 45 20 27 22 20 72 75 6e  name LIKE '" run
6450: 6e 61 6d 65 20 22 27 20 41 4e 44 20 69 74 65 6d  name "' AND item
6460: 5f 70 61 74 68 20 4c 49 4b 45 20 27 22 20 69 74  _path LIKE '" it
6470: 65 6d 70 61 74 74 20 22 27 20 41 4e 44 20 74 65  empatt "' AND te
6480: 73 74 6e 61 6d 65 20 4c 49 4b 45 20 27 22 0a 09  stname LIKE '"..
6490: 09 20 20 20 20 20 20 20 74 65 73 74 70 61 74 74  .       testpatt
64a0: 20 22 27 20 41 4e 44 20 74 2e 73 74 61 74 65 20   "' AND t.state 
64b0: 4c 49 4b 45 20 27 22 20 73 74 61 74 65 70 61 74  LIKE '" statepat
64c0: 74 20 22 27 20 41 4e 44 20 74 2e 73 74 61 74 75  t "' AND t.statu
64d0: 73 20 4c 49 4b 45 20 27 22 20 73 74 61 74 75 73  s LIKE '" status
64e0: 70 61 74 74 20 0a 09 09 20 20 20 20 20 20 20 22  patt ...       "
64f0: 27 4f 52 44 45 52 20 42 59 20 74 2e 65 76 65 6e  'ORDER BY t.even
6500: 74 5f 74 69 6d 65 20 41 53 43 3b 22 29 29 29 0a  t_time ASC;"))).
6510: 20 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74      (debug:print
6520: 20 33 20 22 71 72 79 73 74 72 3a 20 22 20 71 72   3 "qrystr: " qr
6530: 79 73 74 72 29 0a 20 20 20 20 28 73 71 6c 69 74  ystr).    (sqlit
6540: 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20  e3:for-each-row 
6550: 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 70  .     (lambda (p
6560: 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72  ).       (set! r
6570: 65 73 20 28 63 6f 6e 73 20 70 20 72 65 73 29 29  es (cons p res))
6580: 29 0a 20 20 20 20 20 64 62 20 0a 20 20 20 20 20  ).     db .     
6590: 71 72 79 73 74 72 29 0a 20 20 20 20 72 65 73 29  qrystr).    res)
65a0: 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 74  )..(define (db:t
65b0: 65 73 74 2d 67 65 74 2d 74 65 73 74 2d 72 65 63  est-get-test-rec
65c0: 6f 72 64 73 2d 6d 61 74 63 68 69 6e 67 20 64 62  ords-matching db
65d0: 20 6b 65 79 6e 61 6d 65 73 20 74 61 72 67 65 74   keynames target
65e0: 29 0a 20 20 28 6c 65 74 2a 20 28 28 72 65 73 20  ).  (let* ((res 
65f0: 27 28 29 29 0a 09 20 28 69 74 65 6d 70 61 74 74  '()).. (itempatt
6600: 20 20 20 28 69 66 20 28 61 72 67 73 3a 67 65 74     (if (args:get
6610: 2d 61 72 67 20 22 2d 69 74 65 6d 70 61 74 74 22  -arg "-itempatt"
6620: 29 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22  )(args:get-arg "
6630: 2d 69 74 65 6d 70 61 74 74 22 29 20 22 25 22 29  -itempatt") "%")
6640: 29 0a 09 20 28 74 65 73 74 70 61 74 74 20 20 20  ).. (testpatt   
6650: 28 69 66 20 28 61 72 67 73 3a 67 65 74 2d 61 72  (if (args:get-ar
6660: 67 20 22 2d 74 65 73 74 70 61 74 74 22 29 28 61  g "-testpatt")(a
6670: 72 67 73 3a 67 65 74 2d 61 72 67 20 22 2d 74 65  rgs:get-arg "-te
6680: 73 74 70 61 74 74 22 29 20 22 25 22 29 29 0a 09  stpatt") "%"))..
6690: 20 28 73 74 61 74 65 70 61 74 74 20 20 28 69 66   (statepatt  (if
66a0: 20 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22   (args:get-arg "
66b0: 3a 73 74 61 74 65 22 29 20 20 20 28 61 72 67 73  :state")   (args
66c0: 3a 67 65 74 2d 61 72 67 20 22 3a 73 74 61 74 65  :get-arg ":state
66d0: 22 29 20 20 20 20 22 25 22 29 29 0a 09 20 28 73  ")    "%")).. (s
66e0: 74 61 74 75 73 70 61 74 74 20 28 69 66 20 28 61  tatuspatt (if (a
66f0: 72 67 73 3a 67 65 74 2d 61 72 67 20 22 3a 73 74  rgs:get-arg ":st
6700: 61 74 75 73 22 29 20 20 28 61 72 67 73 3a 67 65  atus")  (args:ge
6710: 74 2d 61 72 67 20 22 3a 73 74 61 74 75 73 22 29  t-arg ":status")
6720: 20 20 20 22 25 22 29 29 0a 09 20 28 72 75 6e 6e     "%")).. (runn
6730: 61 6d 65 20 20 20 20 28 69 66 20 28 61 72 67 73  ame    (if (args
6740: 3a 67 65 74 2d 61 72 67 20 22 3a 72 75 6e 6e 61  :get-arg ":runna
6750: 6d 65 22 29 20 28 61 72 67 73 3a 67 65 74 2d 61  me") (args:get-a
6760: 72 67 20 22 3a 72 75 6e 6e 61 6d 65 22 29 20 20  rg ":runname")  
6770: 22 25 22 29 29 0a 09 20 28 6b 65 79 73 74 72 20  "%")).. (keystr 
6780: 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65  (string-interspe
6790: 72 73 65 20 0a 09 09 20 20 28 6d 61 70 20 28 6c  rse ...  (map (l
67a0: 61 6d 62 64 61 20 28 6b 65 79 20 76 61 6c 29 0a  ambda (key val).
67b0: 09 09 09 20 28 63 6f 6e 63 20 22 72 2e 22 20 6b  ... (conc "r." k
67c0: 65 79 20 22 20 6c 69 6b 65 20 27 22 20 76 61 6c  ey " like '" val
67d0: 20 22 27 22 29 29 0a 09 09 20 20 20 20 20 20 20   "'"))...       
67e0: 6b 65 79 6e 61 6d 65 73 20 0a 09 09 20 20 20 20  keynames ...    
67f0: 20 20 20 28 73 74 72 69 6e 67 2d 73 70 6c 69 74     (string-split
6800: 20 74 61 72 67 65 74 20 22 2f 22 29 29 0a 09 09   target "/"))...
6810: 20 20 22 20 41 4e 44 20 22 29 29 0a 09 20 28 71    " AND ")).. (q
6820: 72 79 73 74 72 20 28 63 6f 6e 63 20 22 53 45 4c  rystr (conc "SEL
6830: 45 43 54 20 0a 20 20 20 20 20 20 20 20 20 20 20  ECT .           
6840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6850: 20 74 2e 69 64 0a 20 20 20 20 20 20 20 20 20 20   t.id.          
6860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6870: 20 20 74 2e 72 75 6e 5f 69 64 20 20 20 20 20 0a    t.run_id     .
6880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6890: 20 20 20 20 20 20 20 20 20 20 20 20 74 2e 74 65              t.te
68a0: 73 74 6e 61 6d 65 20 20 20 0a 20 20 20 20 20 20  stname   .      
68b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68c0: 20 20 20 20 20 20 74 2e 68 6f 73 74 20 20 20 20        t.host    
68d0: 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20     .            
68e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68f0: 74 2e 63 70 75 6c 6f 61 64 20 20 20 20 0a 20 20  t.cpuload    .  
6900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6910: 20 20 20 20 20 20 20 20 20 20 74 2e 64 69 73 6b            t.disk
6920: 66 72 65 65 20 20 20 0a 20 20 20 20 20 20 20 20  free   .        
6930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6940: 20 20 20 20 74 2e 75 6e 61 6d 65 20 20 20 20 20      t.uname     
6950: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
6960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 2e                t.
6970: 72 75 6e 64 69 72 20 20 20 20 20 0a 20 20 20 20  rundir     .    
6980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6990: 20 20 20 20 20 20 20 20 74 2e 73 68 6f 72 74 64          t.shortd
69a0: 69 72 20 20 20 0a 20 20 20 20 20 20 20 20 20 20  ir   .          
69b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69c0: 20 20 74 2e 69 74 65 6d 5f 70 61 74 68 20 20 0a    t.item_path  .
69d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69e0: 20 20 20 20 20 20 20 20 20 20 20 20 74 2e 73 74              t.st
69f0: 61 74 65 20 20 20 20 20 20 0a 20 20 20 20 20 20  ate      .      
6a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a10: 20 20 20 20 20 20 74 2e 73 74 61 74 75 73 20 20        t.status  
6a20: 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20     .            
6a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a40: 74 2e 61 74 74 65 6d 70 74 6e 75 6d 20 0a 20 20  t.attemptnum .  
6a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a60: 20 20 20 20 20 20 20 20 20 20 74 2e 66 69 6e 61            t.fina
6a70: 6c 5f 6c 6f 67 66 20 0a 20 20 20 20 20 20 20 20  l_logf .        
6a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a90: 20 20 20 20 74 2e 6c 6f 67 64 61 74 20 20 20 20      t.logdat    
6aa0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
6ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 2e                t.
6ac0: 72 75 6e 5f 64 75 72 61 74 69 6f 0a 20 20 20 20  run_duratio.    
6ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ae0: 20 20 20 20 20 20 20 20 74 2e 63 6f 6d 6d 65 6e          t.commen
6af0: 74 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20  t    .          
6b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b10: 20 20 74 2e 65 76 65 6e 74 5f 74 69 6d 65 20 0a    t.event_time .
6b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b30: 20 20 20 20 20 20 20 20 20 20 20 20 74 2e 66 61              t.fa
6b40: 69 6c 5f 63 6f 75 6e 74 20 0a 20 20 20 20 20 20  il_count .      
6b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b60: 20 20 20 20 20 20 74 2e 70 61 73 73 5f 63 6f 75        t.pass_cou
6b70: 6e 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  nt .            
6b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b90: 74 2e 61 72 63 68 69 76 65 64 20 20 20 0a 0a 0a  t.archived   ...
6ba0: 0a 20 46 52 4f 4d 20 74 65 73 74 73 20 41 53 20  . FROM tests AS 
6bb0: 74 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 72 75 6e  t INNER JOIN run
6bc0: 73 20 41 53 20 72 20 4f 4e 20 74 2e 72 75 6e 5f  s AS r ON t.run_
6bd0: 69 64 3d 72 2e 69 64 20 57 48 45 52 45 20 22 0a  id=r.id WHERE ".
6be0: 09 09 20 20 20 20 20 20 20 6b 65 79 73 74 72 20  ..       keystr 
6bf0: 22 20 41 4e 44 20 72 2e 72 75 6e 6e 61 6d 65 20  " AND r.runname 
6c00: 4c 49 4b 45 20 27 22 20 72 75 6e 6e 61 6d 65 20  LIKE '" runname 
6c10: 22 27 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68  "' AND item_path
6c20: 20 4c 49 4b 45 20 27 22 20 69 74 65 6d 70 61 74   LIKE '" itempat
6c30: 74 20 22 27 20 41 4e 44 20 74 65 73 74 6e 61 6d  t "' AND testnam
6c40: 65 20 4c 49 4b 45 20 27 22 0a 09 09 20 20 20 20  e LIKE '"...    
6c50: 20 20 20 74 65 73 74 70 61 74 74 20 22 27 20 41     testpatt "' A
6c60: 4e 44 20 74 2e 73 74 61 74 65 20 4c 49 4b 45 20  ND t.state LIKE 
6c70: 27 22 20 73 74 61 74 65 70 61 74 74 20 22 27 20  '" statepatt "' 
6c80: 41 4e 44 20 74 2e 73 74 61 74 75 73 20 4c 49 4b  AND t.status LIK
6c90: 45 20 27 22 20 73 74 61 74 75 73 70 61 74 74 20  E '" statuspatt 
6ca0: 0a 09 09 20 20 20 20 20 20 20 22 27 4f 52 44 45  ...       "'ORDE
6cb0: 52 20 42 59 20 74 2e 65 76 65 6e 74 5f 74 69 6d  R BY t.event_tim
6cc0: 65 20 41 53 43 3b 22 29 29 29 0a 20 20 20 20 28  e ASC;"))).    (
6cd0: 64 65 62 75 67 3a 70 72 69 6e 74 20 33 20 22 71  debug:print 3 "q
6ce0: 72 79 73 74 72 3a 20 22 20 71 72 79 73 74 72 29  rystr: " qrystr)
6cf0: 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f  .    (sqlite3:fo
6d00: 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20 20 20  r-each-row .    
6d10: 20 28 6c 61 6d 62 64 61 20 28 70 29 0a 20 20 20   (lambda (p).   
6d20: 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28 63      (set! res (c
6d30: 6f 6e 73 20 70 20 72 65 73 29 29 29 0a 20 20 20  ons p res))).   
6d40: 20 20 64 62 20 0a 20 20 20 20 20 71 72 79 73 74    db .     qryst
6d50: 72 29 0a 20 20 20 20 72 65 73 29 29 0a 0a 3b 3b  r).    res))..;;
6d60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6d70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6d80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6d90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6da0: 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 51 55 45 55 45 20  ======.;; QUEUE 
6db0: 55 50 20 4d 45 54 41 2c 20 54 45 53 54 20 53 54  UP META, TEST ST
6dc0: 41 54 55 53 20 41 4e 44 20 53 54 45 50 53 0a 3b  ATUS AND STEPS.;
6dd0: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;===============
6de0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6df0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6e00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6e10: 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65 66 69 6e 65  =======..(define
6e20: 20 28 64 62 3a 75 70 64 61 74 65 72 20 64 62 29   (db:updater db)
6e30: 0a 20 20 28 6c 65 74 20 6c 6f 6f 70 20 28 28 73  .  (let loop ((s
6e40: 74 61 72 74 2d 74 69 6d 65 20 28 63 75 72 72 65  tart-time (curre
6e50: 6e 74 2d 74 69 6d 65 29 29 29 0a 20 20 20 20 28  nt-time))).    (
6e60: 74 68 72 65 61 64 2d 73 6c 65 65 70 21 20 30 2e  thread-sleep! 0.
6e70: 35 29 20 3b 3b 20 6d 6f 76 65 20 73 61 76 65 20  5) ;; move save 
6e80: 74 69 6d 65 20 61 72 6f 75 6e 64 20 74 6f 20 6d  time around to m
6e90: 69 6e 69 6d 69 7a 65 20 72 65 67 75 6c 61 72 20  inimize regular 
6ea0: 63 6f 6c 6c 69 73 69 6f 6e 73 3f 0a 20 20 20 20  collisions?.    
6eb0: 28 64 62 3a 77 72 69 74 65 2d 63 61 63 68 65 64  (db:write-cached
6ec0: 2d 64 61 74 61 20 64 62 29 0a 20 20 20 20 28 6c  -data db).    (l
6ed0: 6f 6f 70 20 73 74 61 72 74 2d 74 69 6d 65 29 29  oop start-time))
6ee0: 29 0a 20 20 20 20 0a 28 64 65 66 69 6e 65 20 28  ).    .(define (
6ef0: 64 62 3a 74 65 73 74 2d 75 70 64 61 74 65 2d 6d  db:test-update-m
6f00: 65 74 61 2d 69 6e 66 6f 20 64 62 20 74 65 73 74  eta-info db test
6f10: 2d 69 64 20 6d 69 6e 75 74 65 73 20 63 70 75 6c  -id minutes cpul
6f20: 6f 61 64 20 64 69 73 6b 66 72 65 65 20 74 6d 70  oad diskfree tmp
6f30: 66 72 65 65 29 0a 20 20 28 6d 75 74 65 78 2d 6c  free).  (mutex-l
6f40: 6f 63 6b 21 20 2a 69 6e 63 6f 6d 69 6e 67 2d 6d  ock! *incoming-m
6f50: 75 74 65 78 2a 29 0a 20 20 28 73 65 74 21 20 2a  utex*).  (set! *
6f60: 69 6e 63 6f 6d 69 6e 67 2d 64 61 74 61 2a 20 28  incoming-data* (
6f70: 63 6f 6e 73 20 28 76 65 63 74 6f 72 20 27 6d 65  cons (vector 'me
6f80: 74 61 2d 69 6e 66 6f 0a 09 09 09 09 20 20 20 20  ta-info.....    
6f90: 20 20 28 63 75 72 72 65 6e 74 2d 73 65 63 6f 6e    (current-secon
6fa0: 64 73 29 0a 09 09 09 09 20 20 20 20 20 20 28 6c  ds).....      (l
6fb0: 69 73 74 20 63 70 75 6c 6f 61 64 0a 09 09 09 09  ist cpuload.....
6fc0: 09 20 20 20 20 64 69 73 6b 66 72 65 65 0a 09 09  .    diskfree...
6fd0: 09 09 09 20 20 20 20 6d 69 6e 75 74 65 73 0a 09  ...    minutes..
6fe0: 09 09 09 09 20 20 20 20 74 65 73 74 2d 69 64 29  ....    test-id)
6ff0: 29 20 3b 3b 20 72 75 6e 2d 69 64 20 74 65 73 74  ) ;; run-id test
7000: 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 20  -name item-path 
7010: 6d 69 6e 75 74 65 73 20 63 70 75 6c 6f 61 64 20  minutes cpuload 
7020: 64 69 73 6b 66 72 65 65 20 74 6d 70 66 72 65 65  diskfree tmpfree
7030: 29 20 0a 09 09 09 20 20 20 20 20 20 2a 69 6e 63  ) ....      *inc
7040: 6f 6d 69 6e 67 2d 64 61 74 61 2a 29 29 0a 20 20  oming-data*)).  
7050: 28 6d 75 74 65 78 2d 75 6e 6c 6f 63 6b 21 20 2a  (mutex-unlock! *
7060: 69 6e 63 6f 6d 69 6e 67 2d 6d 75 74 65 78 2a 29  incoming-mutex*)
7070: 0a 20 20 28 69 66 20 2a 63 61 63 68 65 2d 6f 6e  .  (if *cache-on
7080: 2a 0a 20 20 20 20 20 20 28 64 65 62 75 67 3a 70  *.      (debug:p
7090: 72 69 6e 74 20 36 20 22 49 4e 46 4f 3a 20 2a 63  rint 6 "INFO: *c
70a0: 61 63 68 65 2d 6f 6e 2a 20 69 73 20 22 20 2a 63  ache-on* is " *c
70b0: 61 63 68 65 2d 6f 6e 2a 20 22 2c 20 73 6b 69 70  ache-on* ", skip
70c0: 70 69 6e 67 20 63 61 63 68 65 20 77 72 69 74 65  ping cache write
70d0: 20 61 73 20 70 61 72 74 20 6f 66 20 74 65 73 74   as part of test
70e0: 2d 75 70 64 61 74 65 2d 6d 65 74 61 2d 69 6e 66  -update-meta-inf
70f0: 6f 22 29 0a 20 20 20 20 20 20 28 64 62 3a 77 72  o").      (db:wr
7100: 69 74 65 2d 63 61 63 68 65 64 2d 64 61 74 61 20  ite-cached-data 
7110: 64 62 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  db)))..(define (
7120: 64 62 3a 77 72 69 74 65 2d 63 61 63 68 65 64 2d  db:write-cached-
7130: 64 61 74 61 20 64 62 29 0a 20 20 28 6c 65 74 20  data db).  (let 
7140: 28 28 6d 65 74 61 2d 73 74 6d 74 20 28 73 71 6c  ((meta-stmt (sql
7150: 69 74 65 33 3a 70 72 65 70 61 72 65 20 64 62 20  ite3:prepare db 
7160: 22 55 50 44 41 54 45 20 74 65 73 74 73 20 53 45  "UPDATE tests SE
7170: 54 20 63 70 75 6c 6f 61 64 3d 3f 2c 64 69 73 6b  T cpuload=?,disk
7180: 66 72 65 65 3d 3f 2c 72 75 6e 5f 64 75 72 61 74  free=?,run_durat
7190: 69 6f 6e 3d 3f 2c 73 74 61 74 65 3d 27 52 55 4e  ion=?,state='RUN
71a0: 4e 49 4e 47 27 20 57 48 45 52 45 20 69 64 3d 3f  NING' WHERE id=?
71b0: 20 41 4e 44 20 73 74 61 74 65 20 4e 4f 54 20 49   AND state NOT I
71c0: 4e 20 28 27 43 4f 4d 50 4c 45 54 45 44 27 2c 27  N ('COMPLETED','
71d0: 4b 49 4c 4c 52 45 51 27 2c 27 4b 49 4c 4c 45 44  KILLREQ','KILLED
71e0: 27 29 3b 22 29 29 0a 09 28 73 74 65 70 2d 73 74  ');"))..(step-st
71f0: 6d 74 20 28 73 71 6c 69 74 65 33 3a 70 72 65 70  mt (sqlite3:prep
7200: 61 72 65 20 64 62 20 22 49 4e 53 45 52 54 20 4f  are db "INSERT O
7210: 52 20 52 45 50 4c 41 43 45 20 69 6e 74 6f 20 74  R REPLACE into t
7220: 65 73 74 5f 73 74 65 70 73 20 28 74 65 73 74 5f  est_steps (test_
7230: 69 64 2c 73 74 65 70 6e 61 6d 65 2c 73 74 61 74  id,stepname,stat
7240: 65 2c 73 74 61 74 75 73 2c 65 76 65 6e 74 5f 74  e,status,event_t
7250: 69 6d 65 2c 63 6f 6d 6d 65 6e 74 2c 6c 6f 67 66  ime,comment,logf
7260: 69 6c 65 29 20 56 41 4c 55 45 53 28 3f 2c 3f 2c  ile) VALUES(?,?,
7270: 3f 2c 3f 2c 3f 2c 3f 2c 3f 29 3b 22 29 29 20 3b  ?,?,?,?,?);")) ;
7280: 3b 20 73 74 72 66 74 69 6d 65 28 27 25 73 27 2c  ; strftime('%s',
7290: 27 6e 6f 77 27 29 23 66 29 0a 09 28 64 61 74 61  'now')#f)..(data
72a0: 20 28 73 6f 72 74 20 2a 69 6e 63 6f 6d 69 6e 67   (sort *incoming
72b0: 2d 64 61 74 61 2a 20 28 6c 61 6d 62 64 61 20 28  -data* (lambda (
72c0: 61 20 62 29 28 3c 20 28 76 65 63 74 6f 72 2d 72  a b)(< (vector-r
72d0: 65 66 20 61 20 31 29 28 76 65 63 74 6f 72 2d 72  ef a 1)(vector-r
72e0: 65 66 20 62 20 31 29 29 29 29 29 29 0a 20 20 20  ef b 1)))))).   
72f0: 20 28 69 66 20 28 3e 20 28 6c 65 6e 67 74 68 20   (if (> (length 
7300: 64 61 74 61 29 20 30 29 0a 09 28 64 65 62 75 67  data) 0)..(debug
7310: 3a 70 72 69 6e 74 20 34 20 22 57 72 69 74 69 6e  :print 4 "Writin
7320: 67 20 63 61 63 68 65 64 20 64 61 74 61 20 22 20  g cached data " 
7330: 64 61 74 61 29 29 0a 20 20 20 20 28 6d 75 74 65  data)).    (mute
7340: 78 2d 6c 6f 63 6b 21 20 2a 69 6e 63 6f 6d 69 6e  x-lock! *incomin
7350: 67 2d 6d 75 74 65 78 2a 29 0a 20 20 20 20 28 73  g-mutex*).    (s
7360: 71 6c 69 74 65 33 3a 77 69 74 68 2d 74 72 61 6e  qlite3:with-tran
7370: 73 61 63 74 69 6f 6e 20 0a 20 20 20 20 20 64 62  saction .     db
7380: 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 29  .     (lambda ()
7390: 0a 20 20 20 20 20 20 20 28 66 6f 72 2d 65 61 63  .       (for-eac
73a0: 68 20 28 6c 61 6d 62 64 61 20 28 65 6e 74 72 79  h (lambda (entry
73b0: 29 0a 09 09 20 20 20 28 63 61 73 65 20 28 76 65  )...   (case (ve
73c0: 63 74 6f 72 2d 72 65 66 20 65 6e 74 72 79 20 30  ctor-ref entry 0
73d0: 29 0a 09 09 20 20 20 20 20 28 28 6d 65 74 61 2d  )...     ((meta-
73e0: 69 6e 66 6f 29 0a 09 09 20 20 20 20 20 20 28 61  info)...      (a
73f0: 70 70 6c 79 20 73 71 6c 69 74 65 33 3a 65 78 65  pply sqlite3:exe
7400: 63 75 74 65 20 6d 65 74 61 2d 73 74 6d 74 20 28  cute meta-stmt (
7410: 76 65 63 74 6f 72 2d 72 65 66 20 65 6e 74 72 79  vector-ref entry
7420: 20 32 29 29 29 0a 09 09 20 20 20 20 20 28 28 73   2)))...     ((s
7430: 74 65 70 2d 73 74 61 74 75 73 29 0a 09 09 20 20  tep-status)...  
7440: 20 20 20 20 28 61 70 70 6c 79 20 73 71 6c 69 74      (apply sqlit
7450: 65 33 3a 65 78 65 63 75 74 65 20 73 74 65 70 2d  e3:execute step-
7460: 73 74 6d 74 20 28 76 65 63 74 6f 72 2d 72 65 66  stmt (vector-ref
7470: 20 65 6e 74 72 79 20 32 29 29 29 0a 09 09 20 20   entry 2)))...  
7480: 20 20 20 28 65 6c 73 65 0a 09 09 20 20 20 20 20     (else...     
7490: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 30 20   (debug:print 0 
74a0: 22 45 52 52 4f 52 3a 20 51 75 65 75 65 64 20 65  "ERROR: Queued e
74b0: 6e 74 72 79 20 6e 6f 74 20 72 65 63 6f 67 6e 69  ntry not recogni
74c0: 73 65 64 20 22 20 65 6e 74 72 79 29 29 29 29 0a  sed " entry)))).
74d0: 09 09 20 64 61 74 61 29 29 29 0a 20 20 20 20 28  .. data))).    (
74e0: 73 71 6c 69 74 65 33 3a 66 69 6e 61 6c 69 7a 65  sqlite3:finalize
74f0: 21 20 6d 65 74 61 2d 73 74 6d 74 29 20 3b 3b 20  ! meta-stmt) ;; 
7500: 73 71 6c 69 74 65 20 69 73 20 74 68 65 20 62 6f  sqlite is the bo
7510: 74 74 6c 65 6e 65 63 6b 2c 20 63 6c 65 61 72 20  ttleneck, clear 
7520: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 73 20 61  the statements a
7530: 73 61 70 3f 0a 20 20 20 20 28 73 71 6c 69 74 65  sap?.    (sqlite
7540: 33 3a 66 69 6e 61 6c 69 7a 65 21 20 73 74 65 70  3:finalize! step
7550: 2d 73 74 6d 74 29 0a 20 20 20 20 28 73 65 74 21  -stmt).    (set!
7560: 20 2a 69 6e 63 6f 6d 69 6e 67 2d 64 61 74 61 2a   *incoming-data*
7570: 20 27 28 29 29 0a 20 20 20 20 28 6d 75 74 65 78   '()).    (mutex
7580: 2d 75 6e 6c 6f 63 6b 21 20 2a 69 6e 63 6f 6d 69  -unlock! *incomi
7590: 6e 67 2d 6d 75 74 65 78 2a 29 29 29 0a 0a 28 64  ng-mutex*)))..(d
75a0: 65 66 69 6e 65 20 28 64 62 3a 72 6f 6c 6c 2d 75  efine (db:roll-u
75b0: 70 2d 70 61 73 73 2d 66 61 69 6c 2d 63 6f 75 6e  p-pass-fail-coun
75c0: 74 73 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73  ts db run-id tes
75d0: 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68  t-name item-path
75e0: 20 73 74 61 74 75 73 29 0a 20 20 28 69 66 20 28   status).  (if (
75f0: 61 6e 64 20 28 6e 6f 74 20 28 65 71 75 61 6c 3f  and (not (equal?
7600: 20 69 74 65 6d 2d 70 61 74 68 20 22 22 29 29 0a   item-path "")).
7610: 09 20 20 20 28 6f 72 20 28 65 71 75 61 6c 3f 20  .   (or (equal? 
7620: 73 74 61 74 75 73 20 22 50 41 53 53 22 29 0a 09  status "PASS")..
7630: 20 20 20 20 20 20 20 28 65 71 75 61 6c 3f 20 73         (equal? s
7640: 74 61 74 75 73 20 22 57 41 52 4e 22 29 0a 09 20  tatus "WARN").. 
7650: 20 20 20 20 20 20 28 65 71 75 61 6c 3f 20 73 74        (equal? st
7660: 61 74 75 73 20 22 46 41 49 4c 22 29 0a 09 20 20  atus "FAIL")..  
7670: 20 20 20 20 20 28 65 71 75 61 6c 3f 20 73 74 61       (equal? sta
7680: 74 75 73 20 22 57 41 49 56 45 44 22 29 0a 09 20  tus "WAIVED").. 
7690: 20 20 20 20 20 20 28 65 71 75 61 6c 3f 20 73 74        (equal? st
76a0: 61 74 75 73 20 22 52 55 4e 4e 49 4e 47 22 29 29  atus "RUNNING"))
76b0: 29 0a 20 20 20 20 20 20 28 62 65 67 69 6e 0a 09  ).      (begin..
76c0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
76d0: 20 0a 09 20 64 62 0a 09 20 22 55 50 44 41 54 45   .. db.. "UPDATE
76e0: 20 74 65 73 74 73 20 0a 20 20 20 20 20 20 20 20   tests .        
76f0: 20 20 20 20 20 53 45 54 20 66 61 69 6c 5f 63 6f       SET fail_co
7700: 75 6e 74 3d 28 53 45 4c 45 43 54 20 63 6f 75 6e  unt=(SELECT coun
7710: 74 28 69 64 29 20 46 52 4f 4d 20 74 65 73 74 73  t(id) FROM tests
7720: 20 57 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20   WHERE run_id=? 
7730: 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41  AND testname=? A
7740: 4e 44 20 69 74 65 6d 5f 70 61 74 68 20 21 3d 20  ND item_path != 
7750: 27 27 20 41 4e 44 20 73 74 61 74 75 73 3d 27 46  '' AND status='F
7760: 41 49 4c 27 29 2c 0a 20 20 20 20 20 20 20 20 20  AIL'),.         
7770: 20 20 20 20 20 20 20 20 70 61 73 73 5f 63 6f 75          pass_cou
7780: 6e 74 3d 28 53 45 4c 45 43 54 20 63 6f 75 6e 74  nt=(SELECT count
7790: 28 69 64 29 20 46 52 4f 4d 20 74 65 73 74 73 20  (id) FROM tests 
77a0: 57 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41  WHERE run_id=? A
77b0: 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e  ND testname=? AN
77c0: 44 20 69 74 65 6d 5f 70 61 74 68 20 21 3d 20 27  D item_path != '
77d0: 27 20 41 4e 44 20 28 73 74 61 74 75 73 3d 27 50  ' AND (status='P
77e0: 41 53 53 27 20 4f 52 20 73 74 61 74 75 73 3d 27  ASS' OR status='
77f0: 57 41 52 4e 27 20 4f 52 20 73 74 61 74 75 73 3d  WARN' OR status=
7800: 27 57 41 49 56 45 44 27 29 29 0a 20 20 20 20 20  'WAIVED')).     
7810: 20 20 20 20 20 20 20 20 57 48 45 52 45 20 72 75          WHERE ru
7820: 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e  n_id=? AND testn
7830: 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70  ame=? AND item_p
7840: 61 74 68 3d 27 27 3b 22 0a 09 20 72 75 6e 2d 69  ath='';".. run-i
7850: 64 20 74 65 73 74 2d 6e 61 6d 65 20 72 75 6e 2d  d test-name run-
7860: 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 72 75 6e  id test-name run
7870: 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 29 0a 20  -id test-name). 
7880: 20 20 20 20 20 20 20 28 74 68 72 65 61 64 2d 73         (thread-s
7890: 6c 65 65 70 21 20 30 2e 31 29 20 3b 3b 20 67 69  leep! 0.1) ;; gi
78a0: 76 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ve other process
78b0: 65 73 20 61 20 63 68 61 6e 63 65 20 68 65 72 65  es a chance here
78c0: 0a 09 28 69 66 20 28 65 71 75 61 6c 3f 20 73 74  ..(if (equal? st
78d0: 61 74 75 73 20 22 52 55 4e 4e 49 4e 47 22 29 20  atus "RUNNING") 
78e0: 3b 3b 20 72 75 6e 6e 69 6e 67 20 74 61 6b 65 73  ;; running takes
78f0: 20 70 72 69 6f 72 69 74 79 20 6f 76 65 72 20 61   priority over a
7900: 6c 6c 20 6f 74 68 65 72 20 73 74 61 74 65 73 2c  ll other states,
7910: 20 66 6f 72 63 65 20 74 68 65 20 74 65 73 74 20   force the test 
7920: 73 74 61 74 65 20 74 6f 20 52 55 4e 4e 49 4e 47  state to RUNNING
7930: 0a 09 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65  ..    (sqlite3:e
7940: 78 65 63 75 74 65 20 64 62 20 22 55 50 44 41 54  xecute db "UPDAT
7950: 45 20 74 65 73 74 73 20 53 45 54 20 73 74 61 74  E tests SET stat
7960: 65 3d 3f 20 57 48 45 52 45 20 72 75 6e 5f 69 64  e=? WHERE run_id
7970: 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d  =? AND testname=
7980: 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 3d  ? AND item_path=
7990: 27 27 3b 22 20 22 52 55 4e 4e 49 4e 47 22 20 72  '';" "RUNNING" r
79a0: 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 29  un-id test-name)
79b0: 0a 09 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65  ..    (sqlite3:e
79c0: 78 65 63 75 74 65 0a 09 20 20 20 20 20 64 62 0a  xecute..     db.
79d0: 09 20 20 20 20 20 22 55 50 44 41 54 45 20 74 65  .     "UPDATE te
79e0: 73 74 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  sts.            
79f0: 20 20 20 20 20 20 20 20 20 20 20 53 45 54 20 73             SET s
7a00: 74 61 74 65 3d 43 41 53 45 20 57 48 45 4e 20 28  tate=CASE WHEN (
7a10: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 69 64 29  SELECT count(id)
7a20: 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52   FROM tests WHER
7a30: 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74  E run_id=? AND t
7a40: 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74  estname=? AND it
7a50: 65 6d 5f 70 61 74 68 20 21 3d 20 27 27 20 41 4e  em_path != '' AN
7a60: 44 20 73 74 61 74 65 20 69 6e 20 28 27 52 55 4e  D state in ('RUN
7a70: 4e 49 4e 47 27 2c 27 4e 4f 54 5f 53 54 41 52 54  NING','NOT_START
7a80: 45 44 27 29 29 20 3e 20 30 20 54 48 45 4e 20 0a  ED')) > 0 THEN .
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7aa0: 20 20 20 20 20 20 20 20 20 20 27 52 55 4e 4e 49            'RUNNI
7ab0: 4e 47 27 0a 20 20 20 20 20 20 20 20 20 20 20 20  NG'.            
7ac0: 20 20 20 20 20 20 20 20 20 20 20 45 4c 53 45 20             ELSE 
7ad0: 27 43 4f 4d 50 4c 45 54 45 44 27 20 45 4e 44 2c  'COMPLETED' END,
7ae0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7af0: 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 75             statu
7b00: 73 3d 43 41 53 45 20 57 48 45 4e 20 66 61 69 6c  s=CASE WHEN fail
7b10: 5f 63 6f 75 6e 74 20 3e 20 30 20 54 48 45 4e 20  _count > 0 THEN 
7b20: 27 46 41 49 4c 27 20 57 48 45 4e 20 70 61 73 73  'FAIL' WHEN pass
7b30: 5f 63 6f 75 6e 74 20 3e 20 30 20 41 4e 44 20 66  _count > 0 AND f
7b40: 61 69 6c 5f 63 6f 75 6e 74 3d 30 20 54 48 45 4e  ail_count=0 THEN
7b50: 20 27 50 41 53 53 27 20 45 4c 53 45 20 27 55 4e   'PASS' ELSE 'UN
7b60: 4b 4e 4f 57 4e 27 20 45 4e 44 0a 20 20 20 20 20  KNOWN' END.     
7b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b80: 20 20 57 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f    WHERE run_id=?
7b90: 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20   AND testname=? 
7ba0: 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 3d 27 27  AND item_path=''
7bb0: 3b 22 0a 09 20 20 20 20 20 72 75 6e 2d 69 64 20  ;"..     run-id 
7bc0: 74 65 73 74 2d 6e 61 6d 65 20 72 75 6e 2d 69 64  test-name run-id
7bd0: 20 74 65 73 74 2d 6e 61 6d 65 29 29 0a 09 23 66   test-name))..#f
7be0: 29 0a 20 20 20 20 20 20 23 66 29 29 0a 0a 0a 3b  ).      #f))...;
7bf0: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;===============
7c00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7c10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7c20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7c30: 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 54 65 73 74 73  =======.;; Tests
7c40: 20 6d 65 74 61 20 64 61 74 61 0a 3b 3b 3d 3d 3d   meta data.;;===
7c50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7c60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7c70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7c80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7c90: 3d 3d 3d 0a 0a 3b 3b 20 72 65 61 64 20 74 68 65  ===..;; read the
7ca0: 20 72 65 63 6f 72 64 20 67 69 76 65 6e 20 61 20   record given a 
7cb0: 74 65 73 74 6e 61 6d 65 0a 28 64 65 66 69 6e 65  testname.(define
7cc0: 20 28 64 62 3a 74 65 73 74 6d 65 74 61 2d 67 65   (db:testmeta-ge
7cd0: 74 2d 72 65 63 6f 72 64 20 64 62 20 74 65 73 74  t-record db test
7ce0: 6e 61 6d 65 29 0a 20 20 28 6c 65 74 20 28 28 72  name).  (let ((r
7cf0: 65 73 20 23 66 29 29 0a 20 20 20 20 28 73 71 6c  es #f)).    (sql
7d00: 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f  ite3:for-each-ro
7d10: 77 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28  w.     (lambda (
7d20: 69 64 20 74 65 73 74 6e 61 6d 65 20 61 75 74 68  id testname auth
7d30: 6f 72 20 6f 77 6e 65 72 20 64 65 73 63 72 69 70  or owner descrip
7d40: 74 69 6f 6e 20 72 65 76 69 65 77 65 64 20 69 74  tion reviewed it
7d50: 65 72 61 74 65 64 20 61 76 67 5f 72 75 6e 74 69  erated avg_runti
7d60: 6d 65 20 61 76 67 5f 64 69 73 6b 20 74 61 67 73  me avg_disk tags
7d70: 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72  ).       (set! r
7d80: 65 73 20 28 76 65 63 74 6f 72 20 69 64 20 74 65  es (vector id te
7d90: 73 74 6e 61 6d 65 20 61 75 74 68 6f 72 20 6f 77  stname author ow
7da0: 6e 65 72 20 64 65 73 63 72 69 70 74 69 6f 6e 20  ner description 
7db0: 72 65 76 69 65 77 65 64 20 69 74 65 72 61 74 65  reviewed iterate
7dc0: 64 20 61 76 67 5f 72 75 6e 74 69 6d 65 20 61 76  d avg_runtime av
7dd0: 67 5f 64 69 73 6b 20 74 61 67 73 29 29 29 0a 20  g_disk tags))). 
7de0: 20 20 20 20 64 62 20 22 53 45 4c 45 43 54 20 69      db "SELECT i
7df0: 64 2c 74 65 73 74 6e 61 6d 65 2c 61 75 74 68 6f  d,testname,autho
7e00: 72 2c 6f 77 6e 65 72 2c 64 65 73 63 72 69 70 74  r,owner,descript
7e10: 69 6f 6e 2c 72 65 76 69 65 77 65 64 2c 69 74 65  ion,reviewed,ite
7e20: 72 61 74 65 64 2c 61 76 67 5f 72 75 6e 74 69 6d  rated,avg_runtim
7e30: 65 2c 61 76 67 5f 64 69 73 6b 2c 74 61 67 73 20  e,avg_disk,tags 
7e40: 46 52 4f 4d 20 74 65 73 74 5f 6d 65 74 61 20 57  FROM test_meta W
7e50: 48 45 52 45 20 74 65 73 74 6e 61 6d 65 3d 3f 3b  HERE testname=?;
7e60: 22 0a 20 20 20 20 20 74 65 73 74 6e 61 6d 65 29  ".     testname)
7e70: 0a 20 20 20 20 72 65 73 29 29 0a 0a 3b 3b 20 63  .    res))..;; c
7e80: 72 65 61 74 65 20 61 20 6e 65 77 20 72 65 63 6f  reate a new reco
7e90: 72 64 20 66 6f 72 20 61 20 67 69 76 65 6e 20 74  rd for a given t
7ea0: 65 73 74 6e 61 6d 65 0a 28 64 65 66 69 6e 65 20  estname.(define 
7eb0: 28 64 62 3a 74 65 73 74 6d 65 74 61 2d 61 64 64  (db:testmeta-add
7ec0: 2d 72 65 63 6f 72 64 20 64 62 20 74 65 73 74 6e  -record db testn
7ed0: 61 6d 65 29 0a 20 20 28 73 71 6c 69 74 65 33 3a  ame).  (sqlite3:
7ee0: 65 78 65 63 75 74 65 20 64 62 20 22 49 4e 53 45  execute db "INSE
7ef0: 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54  RT OR IGNORE INT
7f00: 4f 20 74 65 73 74 5f 6d 65 74 61 20 28 74 65 73  O test_meta (tes
7f10: 74 6e 61 6d 65 2c 61 75 74 68 6f 72 2c 6f 77 6e  tname,author,own
7f20: 65 72 2c 64 65 73 63 72 69 70 74 69 6f 6e 2c 72  er,description,r
7f30: 65 76 69 65 77 65 64 2c 69 74 65 72 61 74 65 64  eviewed,iterated
7f40: 2c 61 76 67 5f 72 75 6e 74 69 6d 65 2c 61 76 67  ,avg_runtime,avg
7f50: 5f 64 69 73 6b 2c 74 61 67 73 29 20 56 41 4c 55  _disk,tags) VALU
7f60: 45 53 20 28 3f 2c 27 27 2c 27 27 2c 27 27 2c 27  ES (?,'','','','
7f70: 27 2c 27 27 2c 27 27 2c 27 27 2c 27 27 29 3b 22  ','','','','');"
7f80: 20 74 65 73 74 6e 61 6d 65 29 29 0a 0a 3b 3b 20   testname))..;; 
7f90: 75 70 64 61 74 65 20 6f 6e 65 20 6f 66 20 74 68  update one of th
7fa0: 65 20 74 65 73 74 6d 65 74 61 20 66 69 65 6c 64  e testmeta field
7fb0: 73 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65  s.(define (db:te
7fc0: 73 74 6d 65 74 61 2d 75 70 64 61 74 65 2d 66 69  stmeta-update-fi
7fd0: 65 6c 64 20 64 62 20 74 65 73 74 6e 61 6d 65 20  eld db testname 
7fe0: 66 69 65 6c 64 20 76 61 6c 75 65 29 0a 20 20 28  field value).  (
7ff0: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
8000: 64 62 20 28 63 6f 6e 63 20 22 55 50 44 41 54 45  db (conc "UPDATE
8010: 20 74 65 73 74 5f 6d 65 74 61 20 53 45 54 20 22   test_meta SET "
8020: 20 66 69 65 6c 64 20 22 3d 3f 20 57 48 45 52 45   field "=? WHERE
8030: 20 74 65 73 74 6e 61 6d 65 3d 3f 3b 22 29 20 76   testname=?;") v
8040: 61 6c 75 65 20 74 65 73 74 6e 61 6d 65 29 29 0a  alue testname)).
8050: 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  .;;=============
8060: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8070: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8080: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8090: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 54 20 45  =========.;; T E
80a0: 20 53 20 54 20 20 20 44 20 41 20 54 20 41 20 0a   S T   D A T A .
80b0: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
80c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
80d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
80e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
80f0: 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65 66 69 6e  ========..(defin
8100: 65 20 28 64 62 3a 63 73 76 2d 3e 74 65 73 74 2d  e (db:csv->test-
8110: 64 61 74 61 20 64 62 20 74 65 73 74 2d 69 64 20  data db test-id 
8120: 63 73 76 64 61 74 61 29 0a 20 20 28 64 65 62 75  csvdata).  (debu
8130: 67 3a 70 72 69 6e 74 20 34 20 22 74 65 73 74 2d  g:print 4 "test-
8140: 69 64 20 22 20 74 65 73 74 2d 69 64 20 22 2c 20  id " test-id ", 
8150: 63 73 76 64 61 74 61 3a 20 22 20 63 73 76 64 61  csvdata: " csvda
8160: 74 61 29 0a 20 20 28 6c 65 74 20 28 28 63 73 76  ta).  (let ((csv
8170: 6c 69 73 74 20 28 63 73 76 2d 3e 6c 69 73 74 20  list (csv->list 
8180: 28 6d 61 6b 65 2d 63 73 76 2d 72 65 61 64 65 72  (make-csv-reader
8190: 0a 09 09 09 20 20 20 20 20 28 6f 70 65 6e 2d 69  ....     (open-i
81a0: 6e 70 75 74 2d 73 74 72 69 6e 67 20 63 73 76 64  nput-string csvd
81b0: 61 74 61 29 0a 09 09 09 20 20 20 20 20 27 28 28  ata)....     '((
81c0: 73 74 72 69 70 2d 6c 65 61 64 69 6e 67 2d 77 68  strip-leading-wh
81d0: 69 74 65 73 70 61 63 65 3f 20 23 74 29 0a 09 09  itespace? #t)...
81e0: 09 20 20 20 20 20 20 20 28 73 74 72 69 70 2d 74  .       (strip-t
81f0: 72 61 69 6c 69 6e 67 2d 77 68 69 74 65 73 70 61  railing-whitespa
8200: 63 65 3f 20 23 74 29 29 20 29 29 29 29 20 3b 3b  ce? #t)) )))) ;;
8210: 20 28 63 73 76 2d 3e 6c 69 73 74 20 63 73 76 64   (csv->list csvd
8220: 61 74 61 29 29 29 0a 20 20 20 20 28 66 6f 72 2d  ata))).    (for-
8230: 65 61 63 68 20 0a 20 20 20 20 20 28 6c 61 6d 62  each .     (lamb
8240: 64 61 20 28 63 73 76 72 6f 77 29 0a 20 20 20 20  da (csvrow).    
8250: 20 20 20 28 6c 65 74 2a 20 28 28 70 61 64 64 65     (let* ((padde
8260: 64 2d 72 6f 77 20 20 28 74 61 6b 65 20 28 61 70  d-row  (take (ap
8270: 70 65 6e 64 20 63 73 76 72 6f 77 20 28 6c 69 73  pend csvrow (lis
8280: 74 20 23 66 20 23 66 20 23 66 20 23 66 20 23 66  t #f #f #f #f #f
8290: 20 23 66 20 23 66 20 23 66 20 23 66 29 29 20 39   #f #f #f #f)) 9
82a0: 29 29 0a 09 20 20 20 20 20 20 28 63 61 74 65 67  ))..      (categ
82b0: 6f 72 79 20 20 20 20 28 6c 69 73 74 2d 72 65 66  ory    (list-ref
82c0: 20 70 61 64 64 65 64 2d 72 6f 77 20 30 29 29 0a   padded-row 0)).
82d0: 09 20 20 20 20 20 20 28 76 61 72 69 61 62 6c 65  .      (variable
82e0: 20 20 20 20 28 6c 69 73 74 2d 72 65 66 20 70 61      (list-ref pa
82f0: 64 64 65 64 2d 72 6f 77 20 31 29 29 0a 09 20 20  dded-row 1))..  
8300: 20 20 20 20 28 76 61 6c 75 65 20 20 20 20 20 20      (value      
8310: 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 2d 69 66   (any->number-if
8320: 2d 70 6f 73 73 69 62 6c 65 20 28 6c 69 73 74 2d  -possible (list-
8330: 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20 32  ref padded-row 2
8340: 29 29 29 0a 09 20 20 20 20 20 20 28 65 78 70 65  )))..      (expe
8350: 63 74 65 64 20 20 20 20 28 61 6e 79 2d 3e 6e 75  cted    (any->nu
8360: 6d 62 65 72 2d 69 66 2d 70 6f 73 73 69 62 6c 65  mber-if-possible
8370: 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65   (list-ref padde
8380: 64 2d 72 6f 77 20 33 29 29 29 0a 09 20 20 20 20  d-row 3)))..    
8390: 20 20 28 74 6f 6c 20 20 20 20 20 20 20 20 20 28    (tol         (
83a0: 61 6e 79 2d 3e 6e 75 6d 62 65 72 2d 69 66 2d 70  any->number-if-p
83b0: 6f 73 73 69 62 6c 65 20 28 6c 69 73 74 2d 72 65  ossible (list-re
83c0: 66 20 70 61 64 64 65 64 2d 72 6f 77 20 34 29 29  f padded-row 4))
83d0: 29 20 3b 3b 20 3e 2c 20 3c 2c 20 3e 3d 2c 20 3c  ) ;; >, <, >=, <
83e0: 3d 2c 20 6f 72 20 61 20 6e 75 6d 62 65 72 0a 09  =, or a number..
83f0: 20 20 20 20 20 20 28 75 6e 69 74 73 20 20 20 20        (units    
8400: 20 20 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64     (list-ref pad
8410: 64 65 64 2d 72 6f 77 20 35 29 29 0a 09 20 20 20  ded-row 5))..   
8420: 20 20 20 28 63 6f 6d 6d 65 6e 74 20 20 20 20 20     (comment     
8430: 28 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65 64  (list-ref padded
8440: 2d 72 6f 77 20 36 29 29 0a 09 20 20 20 20 20 20  -row 6))..      
8450: 28 73 74 61 74 75 73 20 20 20 20 20 20 28 6c 65  (status      (le
8460: 74 20 28 28 73 20 28 6c 69 73 74 2d 72 65 66 20  t ((s (list-ref 
8470: 70 61 64 64 65 64 2d 72 6f 77 20 37 29 29 29 0a  padded-row 7))).
8480: 09 09 09 20 20 20 20 20 28 69 66 20 28 61 6e 64  ...     (if (and
8490: 20 28 73 74 72 69 6e 67 3f 20 73 29 28 6f 72 20   (string? s)(or 
84a0: 28 73 74 72 69 6e 67 2d 6d 61 74 63 68 20 28 72  (string-match (r
84b0: 65 67 65 78 70 20 22 5e 5c 5c 73 2a 24 22 29 20  egexp "^\\s*$") 
84c0: 73 29 0a 09 09 09 09 09 09 20 20 20 20 20 28 73  s).......     (s
84d0: 74 72 69 6e 67 2d 6d 61 74 63 68 20 28 72 65 67  tring-match (reg
84e0: 65 78 70 20 22 5e 6e 2f 61 24 22 29 20 73 29 29  exp "^n/a$") s))
84f0: 29 0a 09 09 09 09 20 23 66 0a 09 09 09 09 20 73  )..... #f..... s
8500: 29 29 29 20 3b 3b 20 69 66 20 73 70 65 63 69 66  ))) ;; if specif
8510: 69 65 64 20 6f 6e 20 74 68 65 20 69 6e 70 75 74  ied on the input
8520: 20 74 68 65 6e 20 75 73 65 2c 20 65 6c 73 65 20   then use, else 
8530: 63 61 6c 63 75 6c 61 74 65 0a 09 20 20 20 20 20  calculate..     
8540: 20 28 74 79 70 65 20 20 20 20 20 20 20 20 28 6c   (type        (l
8550: 69 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d 72  ist-ref padded-r
8560: 6f 77 20 38 29 29 29 0a 09 20 3b 3b 20 6c 6f 6f  ow 8))).. ;; loo
8570: 6b 20 75 70 20 65 78 70 65 63 74 65 64 2c 74 6f  k up expected,to
8580: 6c 2c 75 6e 69 74 73 20 66 72 6f 6d 20 70 72 65  l,units from pre
8590: 76 69 6f 75 73 20 62 65 73 74 20 66 69 74 20 74  vious best fit t
85a0: 65 73 74 20 69 66 20 74 68 65 79 20 61 72 65 20  est if they are 
85b0: 61 6c 6c 20 65 69 74 68 65 72 20 23 66 20 6f 72  all either #f or
85c0: 20 27 27 0a 09 20 28 64 65 62 75 67 3a 70 72 69   ''.. (debug:pri
85d0: 6e 74 20 34 20 22 42 45 46 4f 52 45 3a 20 63 61  nt 4 "BEFORE: ca
85e0: 74 65 67 6f 72 79 3a 20 22 20 63 61 74 65 67 6f  tegory: " catego
85f0: 72 79 20 22 20 76 61 72 69 61 62 6c 65 3a 20 22  ry " variable: "
8600: 20 76 61 72 69 61 62 6c 65 20 22 20 76 61 6c 75   variable " valu
8610: 65 3a 20 22 20 76 61 6c 75 65 20 0a 09 09 20 20  e: " value ...  
8620: 20 20 20 20 22 2c 20 65 78 70 65 63 74 65 64 3a      ", expected:
8630: 20 22 20 65 78 70 65 63 74 65 64 20 22 20 74 6f   " expected " to
8640: 6c 3a 20 22 20 74 6f 6c 20 22 20 75 6e 69 74 73  l: " tol " units
8650: 3a 20 22 20 75 6e 69 74 73 20 22 20 73 74 61 74  : " units " stat
8660: 75 73 3a 20 22 20 73 74 61 74 75 73 20 22 20 63  us: " status " c
8670: 6f 6d 6d 65 6e 74 3a 20 22 20 63 6f 6d 6d 65 6e  omment: " commen
8680: 74 20 22 20 74 79 70 65 3a 20 22 20 74 79 70 65  t " type: " type
8690: 29 0a 0a 09 20 28 69 66 20 28 61 6e 64 20 28 6f  )... (if (and (o
86a0: 72 20 28 6e 6f 74 20 65 78 70 65 63 74 65 64 29  r (not expected)
86b0: 28 65 71 75 61 6c 3f 20 65 78 70 65 63 74 65 64  (equal? expected
86c0: 20 22 22 29 29 0a 09 09 20 20 28 6f 72 20 28 6e   ""))...  (or (n
86d0: 6f 74 20 74 6f 6c 29 20 20 20 20 20 28 65 71 75  ot tol)     (equ
86e0: 61 6c 3f 20 65 78 70 65 63 74 65 64 20 22 22 29  al? expected "")
86f0: 29 0a 09 09 20 20 28 6f 72 20 28 6e 6f 74 20 75  )...  (or (not u
8700: 6e 69 74 73 29 20 20 20 28 65 71 75 61 6c 3f 20  nits)   (equal? 
8710: 65 78 70 65 63 74 65 64 20 22 22 29 29 29 0a 09  expected "")))..
8720: 20 20 20 20 20 28 6c 65 74 2d 76 61 6c 75 65 73       (let-values
8730: 20 28 28 28 6e 65 77 2d 65 78 70 65 63 74 65 64   (((new-expected
8740: 20 6e 65 77 2d 74 6f 6c 20 6e 65 77 2d 75 6e 69   new-tol new-uni
8750: 74 73 29 28 64 62 3a 67 65 74 2d 70 72 65 76 2d  ts)(db:get-prev-
8760: 74 6f 6c 2d 66 6f 72 2d 74 65 73 74 20 64 62 20  tol-for-test db 
8770: 74 65 73 74 2d 69 64 20 63 61 74 65 67 6f 72 79  test-id category
8780: 20 76 61 72 69 61 62 6c 65 29 29 29 0a 09 09 09   variable)))....
8790: 20 28 73 65 74 21 20 65 78 70 65 63 74 65 64 20   (set! expected 
87a0: 6e 65 77 2d 65 78 70 65 63 74 65 64 29 0a 09 09  new-expected)...
87b0: 09 20 28 73 65 74 21 20 74 6f 6c 20 20 20 20 20  . (set! tol     
87c0: 20 6e 65 77 2d 74 6f 6c 29 0a 09 09 09 20 28 73   new-tol).... (s
87d0: 65 74 21 20 75 6e 69 74 73 20 20 20 20 6e 65 77  et! units    new
87e0: 2d 75 6e 69 74 73 29 29 29 0a 0a 09 20 28 64 65  -units)))... (de
87f0: 62 75 67 3a 70 72 69 6e 74 20 34 20 22 41 46 54  bug:print 4 "AFT
8800: 45 52 3a 20 20 63 61 74 65 67 6f 72 79 3a 20 22  ER:  category: "
8810: 20 63 61 74 65 67 6f 72 79 20 22 20 76 61 72 69   category " vari
8820: 61 62 6c 65 3a 20 22 20 76 61 72 69 61 62 6c 65  able: " variable
8830: 20 22 20 76 61 6c 75 65 3a 20 22 20 76 61 6c 75   " value: " valu
8840: 65 20 0a 09 09 20 20 20 20 20 20 22 2c 20 65 78  e ...      ", ex
8850: 70 65 63 74 65 64 3a 20 22 20 65 78 70 65 63 74  pected: " expect
8860: 65 64 20 22 20 74 6f 6c 3a 20 22 20 74 6f 6c 20  ed " tol: " tol 
8870: 22 20 75 6e 69 74 73 3a 20 22 20 75 6e 69 74 73  " units: " units
8880: 20 22 20 73 74 61 74 75 73 3a 20 22 20 73 74 61   " status: " sta
8890: 74 75 73 20 22 20 63 6f 6d 6d 65 6e 74 3a 20 22  tus " comment: "
88a0: 20 63 6f 6d 6d 65 6e 74 29 0a 09 20 3b 3b 20 63   comment).. ;; c
88b0: 61 6c 63 75 6c 61 74 65 20 73 74 61 74 75 73 20  alculate status 
88c0: 69 66 20 4e 4f 54 20 73 70 65 63 69 66 69 65 64  if NOT specified
88d0: 0a 09 20 28 69 66 20 28 61 6e 64 20 28 6e 6f 74  .. (if (and (not
88e0: 20 73 74 61 74 75 73 29 28 6e 75 6d 62 65 72 3f   status)(number?
88f0: 20 65 78 70 65 63 74 65 64 29 28 6e 75 6d 62 65   expected)(numbe
8900: 72 3f 20 76 61 6c 75 65 29 29 20 3b 3b 20 6e 65  r? value)) ;; ne
8910: 65 64 20 65 78 70 65 63 74 65 64 20 61 6e 64 20  ed expected and 
8920: 76 61 6c 75 65 20 74 6f 20 62 65 20 6e 75 6d 62  value to be numb
8930: 65 72 73 0a 09 20 20 20 20 20 28 69 66 20 28 6e  ers..     (if (n
8940: 75 6d 62 65 72 3f 20 74 6f 6c 29 20 3b 3b 20 69  umber? tol) ;; i
8950: 66 20 74 6f 6c 20 69 73 20 61 20 6e 75 6d 62 65  f tol is a numbe
8960: 72 20 74 68 65 6e 20 77 65 20 64 6f 20 74 68 65  r then we do the
8970: 20 73 74 61 6e 64 61 72 64 20 63 6f 6d 70 61 72   standard compar
8980: 69 73 6f 6e 0a 09 09 20 28 6c 65 74 2a 20 28 28  ison... (let* ((
8990: 6d 61 78 2d 76 61 6c 20 28 2b 20 65 78 70 65 63  max-val (+ expec
89a0: 74 65 64 20 74 6f 6c 29 29 0a 09 09 09 28 6d 69  ted tol))....(mi
89b0: 6e 2d 76 61 6c 20 28 2d 20 65 78 70 65 63 74 65  n-val (- expecte
89c0: 64 20 74 6f 6c 29 29 0a 09 09 09 28 72 65 73 75  d tol))....(resu
89d0: 6c 74 20 20 28 61 6e 64 20 28 3e 3d 20 20 76 61  lt  (and (>=  va
89e0: 6c 75 65 20 6d 69 6e 2d 76 61 6c 29 28 3c 3d 20  lue min-val)(<= 
89f0: 76 61 6c 75 65 20 6d 61 78 2d 76 61 6c 29 29 29  value max-val)))
8a00: 29 0a 09 09 20 20 20 28 64 65 62 75 67 3a 70 72  )...   (debug:pr
8a10: 69 6e 74 20 34 20 22 6d 61 78 2d 76 61 6c 3a 20  int 4 "max-val: 
8a20: 22 20 6d 61 78 2d 76 61 6c 20 22 20 6d 69 6e 2d  " max-val " min-
8a30: 76 61 6c 3a 20 22 20 6d 69 6e 2d 76 61 6c 20 22  val: " min-val "
8a40: 20 72 65 73 75 6c 74 3a 20 22 20 72 65 73 75 6c   result: " resul
8a50: 74 29 0a 09 09 20 20 20 28 73 65 74 21 20 73 74  t)...   (set! st
8a60: 61 74 75 73 20 28 69 66 20 72 65 73 75 6c 74 20  atus (if result 
8a70: 22 70 61 73 73 22 20 22 66 61 69 6c 22 29 29 29  "pass" "fail")))
8a80: 0a 09 09 20 28 73 65 74 21 20 73 74 61 74 75 73  ... (set! status
8a90: 20 3b 3b 20 4e 42 2f 2f 20 6e 65 65 64 20 74 6f   ;; NB// need to
8aa0: 20 61 73 73 65 73 73 20 65 61 63 68 20 6f 6e 65   assess each one
8ab0: 20 28 69 2e 65 2e 20 6e 6f 74 20 72 65 74 75 72   (i.e. not retur
8ac0: 6e 20 6f 70 65 72 61 74 6f 72 20 73 69 6e 63 65  n operator since
8ad0: 20 6e 65 65 64 20 74 6f 20 61 63 74 20 69 66 20   need to act if 
8ae0: 6e 6f 74 20 76 61 6c 69 64 20 6f 70 2e 0a 09 09  not valid op....
8af0: 20 20 20 20 20 20 20 28 63 61 73 65 20 28 73 74         (case (st
8b00: 72 69 6e 67 2d 3e 73 79 6d 62 6f 6c 20 74 6f 6c  ring->symbol tol
8b10: 29 20 3b 3b 20 74 6f 6c 20 73 68 6f 75 6c 64 20  ) ;; tol should 
8b20: 62 65 20 3e 2c 20 3c 2c 20 3e 3d 2c 20 3c 3d 0a  be >, <, >=, <=.
8b30: 09 09 09 20 28 28 3e 29 20 20 28 69 66 20 28 3e  ... ((>)  (if (>
8b40: 20 20 76 61 6c 75 65 20 65 78 70 65 63 74 65 64    value expected
8b50: 29 20 22 70 61 73 73 22 20 22 66 61 69 6c 22 29  ) "pass" "fail")
8b60: 29 0a 09 09 09 20 28 28 3c 29 20 20 28 69 66 20  ).... ((<)  (if 
8b70: 28 3c 20 20 76 61 6c 75 65 20 65 78 70 65 63 74  (<  value expect
8b80: 65 64 29 20 22 70 61 73 73 22 20 22 66 61 69 6c  ed) "pass" "fail
8b90: 22 29 29 0a 09 09 09 20 28 28 3e 3d 29 20 28 69  ")).... ((>=) (i
8ba0: 66 20 28 3e 3d 20 76 61 6c 75 65 20 65 78 70 65  f (>= value expe
8bb0: 63 74 65 64 29 20 22 70 61 73 73 22 20 22 66 61  cted) "pass" "fa
8bc0: 69 6c 22 29 29 0a 09 09 09 20 28 28 3c 3d 29 20  il")).... ((<=) 
8bd0: 28 69 66 20 28 3c 3d 20 76 61 6c 75 65 20 65 78  (if (<= value ex
8be0: 70 65 63 74 65 64 29 20 22 70 61 73 73 22 20 22  pected) "pass" "
8bf0: 66 61 69 6c 22 29 29 0a 09 09 09 20 28 65 6c 73  fail")).... (els
8c00: 65 20 28 63 6f 6e 63 20 22 45 52 52 4f 52 3a 20  e (conc "ERROR: 
8c10: 62 61 64 20 74 6f 6c 20 63 6f 6d 70 61 72 61 74  bad tol comparat
8c20: 6f 72 20 22 20 74 6f 6c 29 29 29 29 29 29 0a 09  or " tol))))))..
8c30: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20   (debug:print 4 
8c40: 22 41 46 54 45 52 32 3a 20 63 61 74 65 67 6f 72  "AFTER2: categor
8c50: 79 3a 20 22 20 63 61 74 65 67 6f 72 79 20 22 20  y: " category " 
8c60: 76 61 72 69 61 62 6c 65 3a 20 22 20 76 61 72 69  variable: " vari
8c70: 61 62 6c 65 20 22 20 76 61 6c 75 65 3a 20 22 20  able " value: " 
8c80: 76 61 6c 75 65 20 0a 09 09 20 20 20 20 20 20 22  value ...      "
8c90: 2c 20 65 78 70 65 63 74 65 64 3a 20 22 20 65 78  , expected: " ex
8ca0: 70 65 63 74 65 64 20 22 20 74 6f 6c 3a 20 22 20  pected " tol: " 
8cb0: 74 6f 6c 20 22 20 75 6e 69 74 73 3a 20 22 20 75  tol " units: " u
8cc0: 6e 69 74 73 20 22 20 73 74 61 74 75 73 3a 20 22  nits " status: "
8cd0: 20 73 74 61 74 75 73 20 22 20 63 6f 6d 6d 65 6e   status " commen
8ce0: 74 3a 20 22 20 63 6f 6d 6d 65 6e 74 29 0a 09 20  t: " comment).. 
8cf0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
8d00: 20 64 62 20 22 49 4e 53 45 52 54 20 4f 52 20 52   db "INSERT OR R
8d10: 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 65 73 74  EPLACE INTO test
8d20: 5f 64 61 74 61 20 28 74 65 73 74 5f 69 64 2c 63  _data (test_id,c
8d30: 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62 6c 65  ategory,variable
8d40: 2c 76 61 6c 75 65 2c 65 78 70 65 63 74 65 64 2c  ,value,expected,
8d50: 74 6f 6c 2c 75 6e 69 74 73 2c 63 6f 6d 6d 65 6e  tol,units,commen
8d60: 74 2c 73 74 61 74 75 73 2c 74 79 70 65 29 20 56  t,status,type) V
8d70: 41 4c 55 45 53 20 28 3f 2c 3f 2c 3f 2c 3f 2c 3f  ALUES (?,?,?,?,?
8d80: 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 29 3b 22 0a 09 09  ,?,?,?,?,?);"...
8d90: 09 20 20 74 65 73 74 2d 69 64 20 63 61 74 65 67  .  test-id categ
8da0: 6f 72 79 20 76 61 72 69 61 62 6c 65 20 76 61 6c  ory variable val
8db0: 75 65 20 65 78 70 65 63 74 65 64 20 74 6f 6c 20  ue expected tol 
8dc0: 75 6e 69 74 73 20 28 69 66 20 63 6f 6d 6d 65 6e  units (if commen
8dd0: 74 20 63 6f 6d 6d 65 6e 74 20 22 22 29 20 73 74  t comment "") st
8de0: 61 74 75 73 20 74 79 70 65 29 29 29 0a 20 20 20  atus type))).   
8df0: 20 20 63 73 76 6c 69 73 74 29 29 29 0a 0a 3b 3b    csvlist)))..;;
8e00: 20 67 65 74 20 61 20 6c 69 73 74 20 6f 66 20 74   get a list of t
8e10: 65 73 74 5f 64 61 74 61 20 72 65 63 6f 72 64 73  est_data records
8e20: 20 6d 61 74 63 68 69 6e 67 20 63 61 74 65 67 6f   matching catego
8e30: 72 79 70 61 74 74 0a 28 64 65 66 69 6e 65 20 28  rypatt.(define (
8e40: 64 62 3a 72 65 61 64 2d 74 65 73 74 2d 64 61 74  db:read-test-dat
8e50: 61 20 64 62 20 74 65 73 74 2d 69 64 20 63 61 74  a db test-id cat
8e60: 65 67 6f 72 79 70 61 74 74 29 0a 20 20 28 6c 65  egorypatt).  (le
8e70: 74 20 28 28 72 65 73 20 27 28 29 29 29 0a 20 20  t ((res '())).  
8e80: 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65    (sqlite3:for-e
8e90: 61 63 68 2d 72 6f 77 20 0a 20 20 20 20 20 28 6c  ach-row .     (l
8ea0: 61 6d 62 64 61 20 28 69 64 20 74 65 73 74 5f 69  ambda (id test_i
8eb0: 64 20 63 61 74 65 67 6f 72 79 20 76 61 72 69 61  d category varia
8ec0: 62 6c 65 20 76 61 6c 75 65 20 65 78 70 65 63 74  ble value expect
8ed0: 65 64 20 74 6f 6c 20 75 6e 69 74 73 20 63 6f 6d  ed tol units com
8ee0: 6d 65 6e 74 20 73 74 61 74 75 73 20 74 79 70 65  ment status type
8ef0: 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72  ).       (set! r
8f00: 65 73 20 28 63 6f 6e 73 20 28 76 65 63 74 6f 72  es (cons (vector
8f10: 20 69 64 20 74 65 73 74 5f 69 64 20 63 61 74 65   id test_id cate
8f20: 67 6f 72 79 20 76 61 72 69 61 62 6c 65 20 76 61  gory variable va
8f30: 6c 75 65 20 65 78 70 65 63 74 65 64 20 74 6f 6c  lue expected tol
8f40: 20 75 6e 69 74 73 20 63 6f 6d 6d 65 6e 74 20 73   units comment s
8f50: 74 61 74 75 73 20 74 79 70 65 29 20 72 65 73 29  tatus type) res)
8f60: 29 29 0a 20 20 20 20 20 64 62 0a 20 20 20 20 20  )).     db.     
8f70: 22 53 45 4c 45 43 54 20 69 64 2c 74 65 73 74 5f  "SELECT id,test_
8f80: 69 64 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 69  id,category,vari
8f90: 61 62 6c 65 2c 76 61 6c 75 65 2c 65 78 70 65 63  able,value,expec
8fa0: 74 65 64 2c 74 6f 6c 2c 75 6e 69 74 73 2c 63 6f  ted,tol,units,co
8fb0: 6d 6d 65 6e 74 2c 73 74 61 74 75 73 2c 74 79 70  mment,status,typ
8fc0: 65 20 46 52 4f 4d 20 74 65 73 74 5f 64 61 74 61  e FROM test_data
8fd0: 20 57 48 45 52 45 20 74 65 73 74 5f 69 64 3d 3f   WHERE test_id=?
8fe0: 20 41 4e 44 20 63 61 74 65 67 6f 72 79 20 4c 49   AND category LI
8ff0: 4b 45 20 3f 20 4f 52 44 45 52 20 42 59 20 63 61  KE ? ORDER BY ca
9000: 74 65 67 6f 72 79 2c 76 61 72 69 61 62 6c 65 3b  tegory,variable;
9010: 22 20 74 65 73 74 2d 69 64 20 63 61 74 65 67 6f  " test-id catego
9020: 72 79 70 61 74 74 29 0a 20 20 20 20 28 72 65 76  rypatt).    (rev
9030: 65 72 73 65 20 72 65 73 29 29 29 0a 0a 28 64 65  erse res)))..(de
9040: 66 69 6e 65 20 28 64 62 3a 6c 6f 61 64 2d 74 65  fine (db:load-te
9050: 73 74 2d 64 61 74 61 20 64 62 20 74 65 73 74 2d  st-data db test-
9060: 69 64 29 0a 20 20 28 6c 65 74 20 6c 6f 6f 70 20  id).  (let loop 
9070: 28 28 6c 69 6e 20 28 72 65 61 64 2d 6c 69 6e 65  ((lin (read-line
9080: 29 29 29 0a 20 20 20 20 28 69 66 20 28 6e 6f 74  ))).    (if (not
9090: 20 28 65 6f 66 2d 6f 62 6a 65 63 74 3f 20 6c 69   (eof-object? li
90a0: 6e 29 29 0a 09 28 62 65 67 69 6e 0a 09 20 20 28  n))..(begin..  (
90b0: 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20 6c 69  debug:print 4 li
90c0: 6e 29 0a 09 20 20 28 72 64 62 3a 63 73 76 2d 3e  n)..  (rdb:csv->
90d0: 74 65 73 74 2d 64 61 74 61 20 64 62 20 74 65 73  test-data db tes
90e0: 74 2d 69 64 20 6c 69 6e 29 0a 09 20 20 28 6c 6f  t-id lin)..  (lo
90f0: 6f 70 20 28 72 65 61 64 2d 6c 69 6e 65 29 29 29  op (read-line)))
9100: 29 29 0a 20 20 3b 3b 20 72 6f 6c 6c 20 75 70 20  )).  ;; roll up 
9110: 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 73 75  the current resu
9120: 6c 74 73 2e 0a 20 20 3b 3b 20 46 49 58 4d 45 3a  lts..  ;; FIXME:
9130: 20 41 64 64 20 74 68 65 20 73 74 61 74 75 73 20   Add the status 
9140: 74 6f 20 0a 20 20 28 72 64 62 3a 74 65 73 74 2d  to .  (rdb:test-
9150: 64 61 74 61 2d 72 6f 6c 6c 75 70 20 64 62 20 74  data-rollup db t
9160: 65 73 74 2d 69 64 20 23 66 29 29 0a 0a 3b 3b 20  est-id #f))..;; 
9170: 57 41 52 4e 49 4e 47 3a 20 44 6f 20 4e 4f 54 20  WARNING: Do NOT 
9180: 63 61 6c 6c 20 74 68 69 73 20 66 6f 72 20 74 68  call this for th
9190: 65 20 70 61 72 65 6e 74 20 74 65 73 74 20 6f 6e  e parent test on
91a0: 20 61 6e 20 69 74 65 72 61 74 65 64 20 74 65 73   an iterated tes
91b0: 74 0a 3b 3b 20 52 6f 6c 6c 20 75 70 20 74 65 73  t.;; Roll up tes
91c0: 74 5f 64 61 74 61 20 70 61 73 73 2f 66 61 69 6c  t_data pass/fail
91d0: 20 72 65 73 75 6c 74 73 0a 3b 3b 20 6c 6f 6f 6b   results.;; look
91e0: 20 61 74 20 74 68 65 20 74 65 73 74 5f 64 61 74   at the test_dat
91f0: 61 20 73 74 61 74 75 73 20 66 69 65 6c 64 2c 20  a status field, 
9200: 0a 3b 3b 20 20 20 20 69 66 20 61 6c 6c 20 61 72  .;;    if all ar
9210: 65 20 70 61 73 73 20 28 61 6e 79 20 63 61 73 65  e pass (any case
9220: 29 20 61 6e 64 20 74 68 65 20 74 65 73 74 20 73  ) and the test s
9230: 74 61 74 75 73 20 69 73 20 50 41 53 53 20 6f 72  tatus is PASS or
9240: 20 4e 55 4c 4c 20 6f 72 20 27 27 20 74 68 65 6e   NULL or '' then
9250: 20 73 65 74 20 74 65 73 74 20 73 74 61 74 75 73   set test status
9260: 20 74 6f 20 50 41 53 53 2e 0a 3b 3b 20 20 20 20   to PASS..;;    
9270: 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 61  if one or more a
9280: 72 65 20 66 61 69 6c 20 28 61 6e 79 20 63 61 73  re fail (any cas
9290: 65 29 20 74 68 65 6e 20 73 65 74 20 74 65 73 74  e) then set test
92a0: 20 73 74 61 74 75 73 20 74 6f 20 50 41 53 53 2c   status to PASS,
92b0: 20 6e 6f 6e 20 22 70 61 73 73 22 20 6f 72 20 22   non "pass" or "
92c0: 66 61 69 6c 22 20 61 72 65 20 69 67 6e 6f 72 65  fail" are ignore
92d0: 64 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65  d.(define (db:te
92e0: 73 74 2d 64 61 74 61 2d 72 6f 6c 6c 75 70 20 64  st-data-rollup d
92f0: 62 20 74 65 73 74 2d 69 64 20 73 74 61 74 75 73  b test-id status
9300: 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65  ).  (sqlite3:exe
9310: 63 75 74 65 20 0a 20 20 20 64 62 20 0a 20 20 20  cute .   db .   
9320: 22 55 50 44 41 54 45 20 74 65 73 74 73 20 0a 20  "UPDATE tests . 
9330: 20 20 20 20 20 53 45 54 20 66 61 69 6c 5f 63 6f       SET fail_co
9340: 75 6e 74 3d 28 53 45 4c 45 43 54 20 63 6f 75 6e  unt=(SELECT coun
9350: 74 28 69 64 29 20 46 52 4f 4d 20 74 65 73 74 5f  t(id) FROM test_
9360: 64 61 74 61 20 57 48 45 52 45 20 74 65 73 74 5f  data WHERE test_
9370: 69 64 3d 3f 20 41 4e 44 20 73 74 61 74 75 73 20  id=? AND status 
9380: 6c 69 6b 65 20 27 66 61 69 6c 27 29 2c 0a 20 20  like 'fail'),.  
9390: 20 20 20 20 20 20 20 20 70 61 73 73 5f 63 6f 75          pass_cou
93a0: 6e 74 3d 28 53 45 4c 45 43 54 20 63 6f 75 6e 74  nt=(SELECT count
93b0: 28 69 64 29 20 46 52 4f 4d 20 74 65 73 74 5f 64  (id) FROM test_d
93c0: 61 74 61 20 57 48 45 52 45 20 74 65 73 74 5f 69  ata WHERE test_i
93d0: 64 3d 3f 20 41 4e 44 20 73 74 61 74 75 73 20 6c  d=? AND status l
93e0: 69 6b 65 20 27 70 61 73 73 27 29 0a 20 20 20 20  ike 'pass').    
93f0: 20 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 0a 20    WHERE id=?;". 
9400: 20 20 74 65 73 74 2d 69 64 20 74 65 73 74 2d 69    test-id test-i
9410: 64 20 74 65 73 74 2d 69 64 29 0a 20 20 3b 3b 20  d test-id).  ;; 
9420: 69 66 20 74 68 65 20 74 65 73 74 20 69 73 20 6e  if the test is n
9430: 6f 74 20 46 41 49 4c 20 74 68 65 6e 20 73 65 74  ot FAIL then set
9440: 20 73 74 61 74 75 73 20 62 61 73 65 64 20 6f 6e   status based on
9450: 20 74 68 65 20 66 61 69 6c 20 61 6e 64 20 70 61   the fail and pa
9460: 73 73 20 63 6f 75 6e 74 73 2e 0a 20 20 28 74 68  ss counts..  (th
9470: 72 65 61 64 2d 73 6c 65 65 70 21 20 31 29 0a 20  read-sleep! 1). 
9480: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
9490: 65 0a 20 20 20 64 62 20 20 20 3b 3b 3b 20 4e 4f  e.   db   ;;; NO
94a0: 54 45 3a 20 53 68 6f 75 6c 64 20 74 68 69 73 20  TE: Should this 
94b0: 62 65 20 57 41 52 4e 2c 46 41 49 4c 3f 20 41 20  be WARN,FAIL? A 
94c0: 57 41 52 4e 20 69 73 20 6e 6f 74 20 61 20 46 41  WARN is not a FA
94d0: 49 4c 3f 3f 3f 3f 3f 20 42 55 47 20 46 49 58 4d  IL????? BUG FIXM
94e0: 45 0a 20 20 20 22 55 50 44 41 54 45 20 74 65 73  E.   "UPDATE tes
94f0: 74 73 0a 20 20 20 20 20 20 53 45 54 20 73 74 61  ts.      SET sta
9500: 74 75 73 3d 43 41 53 45 20 57 48 45 4e 20 28 53  tus=CASE WHEN (S
9510: 45 4c 45 43 54 20 66 61 69 6c 5f 63 6f 75 6e 74  ELECT fail_count
9520: 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52   FROM tests WHER
9530: 45 20 69 64 3d 3f 29 20 3e 20 30 20 0a 20 20 20  E id=?) > 0 .   
9540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9550: 20 20 20 20 20 20 54 48 45 4e 20 27 46 41 49 4c        THEN 'FAIL
9560: 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  '.              
9570: 20 20 20 20 20 20 20 20 57 48 45 4e 20 28 53 45          WHEN (SE
9580: 4c 45 43 54 20 70 61 73 73 5f 63 6f 75 6e 74 20  LECT pass_count 
9590: 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45  FROM tests WHERE
95a0: 20 69 64 3d 3f 29 20 3e 20 30 20 41 4e 44 20 0a   id=?) > 0 AND .
95b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95c0: 20 20 20 20 20 20 20 20 20 20 20 28 53 45 4c 45             (SELE
95d0: 43 54 20 73 74 61 74 75 73 20 46 52 4f 4d 20 74  CT status FROM t
95e0: 65 73 74 73 20 57 48 45 52 45 20 69 64 3d 3f 29  ests WHERE id=?)
95f0: 20 4e 4f 54 20 49 4e 20 28 27 57 41 52 4e 27 2c   NOT IN ('WARN',
9600: 27 46 41 49 4c 27 29 0a 20 20 20 20 20 20 20 20  'FAIL').        
9610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9620: 20 54 48 45 4e 20 27 50 41 53 53 27 0a 20 20 20   THEN 'PASS'.   
9630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9640: 20 20 20 45 4c 53 45 20 73 74 61 74 75 73 0a 20     ELSE status. 
9650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9660: 20 45 4e 44 20 57 48 45 52 45 20 69 64 3d 3f 3b   END WHERE id=?;
9670: 22 0a 20 20 20 74 65 73 74 2d 69 64 20 74 65 73  ".   test-id tes
9680: 74 2d 69 64 20 74 65 73 74 2d 69 64 20 74 65 73  t-id test-id tes
9690: 74 2d 69 64 29 29 0a 0a 28 64 65 66 69 6e 65 20  t-id))..(define 
96a0: 28 64 62 3a 67 65 74 2d 70 72 65 76 2d 74 6f 6c  (db:get-prev-tol
96b0: 2d 66 6f 72 2d 74 65 73 74 20 64 62 20 74 65 73  -for-test db tes
96c0: 74 2d 69 64 20 63 61 74 65 67 6f 72 79 20 76 61  t-id category va
96d0: 72 69 61 62 6c 65 29 0a 20 20 3b 3b 20 46 69 6e  riable).  ;; Fin
96e0: 69 73 68 20 6d 65 3f 0a 20 20 28 76 61 6c 75 65  ish me?.  (value
96f0: 73 20 23 66 20 23 66 20 23 66 29 29 0a 0a 3b 3b  s #f #f #f))..;;
9700: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9710: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9720: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9730: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9740: 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 53 20 54 20 45 20  ======.;; S T E 
9750: 50 20 53 20 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d  P S .;;=========
9760: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9770: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9780: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9790: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28  =============..(
97a0: 64 65 66 69 6e 65 20 28 64 62 3a 73 74 65 70 2d  define (db:step-
97b0: 67 65 74 2d 74 69 6d 65 2d 61 73 2d 73 74 72 69  get-time-as-stri
97c0: 6e 67 20 76 65 63 29 0a 20 20 28 73 65 63 6f 6e  ng vec).  (secon
97d0: 64 73 2d 3e 74 69 6d 65 2d 73 74 72 69 6e 67 20  ds->time-string 
97e0: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65  (db:step-get-eve
97f0: 6e 74 5f 74 69 6d 65 20 76 65 63 29 29 29 0a 0a  nt_time vec)))..
9800: 3b 3b 20 64 62 2d 67 65 74 2d 74 65 73 74 2d 73  ;; db-get-test-s
9810: 74 65 70 73 2d 66 6f 72 2d 72 75 6e 0a 28 64 65  teps-for-run.(de
9820: 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 73 74 65  fine (db:get-ste
9830: 70 73 2d 66 6f 72 2d 74 65 73 74 20 64 62 20 74  ps-for-test db t
9840: 65 73 74 2d 69 64 29 0a 20 20 28 6c 65 74 20 28  est-id).  (let (
9850: 28 72 65 73 20 27 28 29 29 29 0a 20 20 20 20 28  (res '())).    (
9860: 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68  sqlite3:for-each
9870: 2d 72 6f 77 20 0a 20 20 20 20 20 28 6c 61 6d 62  -row .     (lamb
9880: 64 61 20 28 69 64 20 74 65 73 74 2d 69 64 20 73  da (id test-id s
9890: 74 65 70 6e 61 6d 65 20 73 74 61 74 65 20 73 74  tepname state st
98a0: 61 74 75 73 20 65 76 65 6e 74 2d 74 69 6d 65 20  atus event-time 
98b0: 6c 6f 67 66 69 6c 65 29 0a 20 20 20 20 20 20 20  logfile).       
98c0: 28 73 65 74 21 20 72 65 73 20 28 63 6f 6e 73 20  (set! res (cons 
98d0: 28 76 65 63 74 6f 72 20 69 64 20 74 65 73 74 2d  (vector id test-
98e0: 69 64 20 73 74 65 70 6e 61 6d 65 20 73 74 61 74  id stepname stat
98f0: 65 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d 74  e status event-t
9900: 69 6d 65 20 28 69 66 20 28 73 74 72 69 6e 67 3f  ime (if (string?
9910: 20 6c 6f 67 66 69 6c 65 29 20 6c 6f 67 66 69 6c   logfile) logfil
9920: 65 20 22 22 29 29 20 72 65 73 29 29 29 0a 20 20  e "")) res))).  
9930: 20 20 20 64 62 0a 20 20 20 20 20 22 53 45 4c 45     db.     "SELE
9940: 43 54 20 69 64 2c 74 65 73 74 5f 69 64 2c 73 74  CT id,test_id,st
9950: 65 70 6e 61 6d 65 2c 73 74 61 74 65 2c 73 74 61  epname,state,sta
9960: 74 75 73 2c 65 76 65 6e 74 5f 74 69 6d 65 2c 6c  tus,event_time,l
9970: 6f 67 66 69 6c 65 20 46 52 4f 4d 20 74 65 73 74  ogfile FROM test
9980: 5f 73 74 65 70 73 20 57 48 45 52 45 20 74 65 73  _steps WHERE tes
9990: 74 5f 69 64 3d 3f 20 4f 52 44 45 52 20 42 59 20  t_id=? ORDER BY 
99a0: 69 64 20 41 53 43 3b 22 20 3b 3b 20 65 76 65 6e  id ASC;" ;; even
99b0: 74 5f 74 69 6d 65 20 44 45 53 43 2c 69 64 20 41  t_time DESC,id A
99c0: 53 43 3b 0a 20 20 20 20 20 74 65 73 74 2d 69 64  SC;.     test-id
99d0: 29 0a 20 20 20 20 28 72 65 76 65 72 73 65 20 72  ).    (reverse r
99e0: 65 73 29 29 29 0a 0a 3b 3b 20 67 65 74 20 61 20  es)))..;; get a 
99f0: 70 72 65 74 74 79 20 74 61 62 6c 65 20 74 6f 20  pretty table to 
9a00: 73 75 6d 6d 61 72 69 7a 65 20 73 74 65 70 73 0a  summarize steps.
9a10: 3b 3b 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67  ;;.(define (db:g
9a20: 65 74 2d 73 74 65 70 73 2d 74 61 62 6c 65 20 64  et-steps-table d
9a30: 62 20 74 65 73 74 2d 69 64 29 0a 20 20 28 6c 65  b test-id).  (le
9a40: 74 20 28 28 73 74 65 70 73 20 20 20 28 64 62 3a  t ((steps   (db:
9a50: 67 65 74 2d 73 74 65 70 73 2d 66 6f 72 2d 74 65  get-steps-for-te
9a60: 73 74 20 64 62 20 74 65 73 74 2d 69 64 29 29 29  st db test-id)))
9a70: 0a 20 20 20 20 3b 3b 20 6f 72 67 61 6e 69 73 65  .    ;; organise
9a80: 20 74 68 65 20 73 74 65 70 73 20 66 6f 72 20 62   the steps for b
9a90: 65 74 74 65 72 20 72 65 61 64 61 62 69 6c 69 74  etter readabilit
9aa0: 79 0a 20 20 20 20 28 6c 65 74 20 28 28 72 65 73  y.    (let ((res
9ab0: 20 28 6d 61 6b 65 2d 68 61 73 68 2d 74 61 62 6c   (make-hash-tabl
9ac0: 65 29 29 29 0a 20 20 20 20 20 20 28 66 6f 72 2d  e))).      (for-
9ad0: 65 61 63 68 20 0a 20 20 20 20 20 20 20 28 6c 61  each .       (la
9ae0: 6d 62 64 61 20 28 73 74 65 70 29 0a 09 20 28 64  mbda (step).. (d
9af0: 65 62 75 67 3a 70 72 69 6e 74 20 36 20 22 73 74  ebug:print 6 "st
9b00: 65 70 3d 22 20 73 74 65 70 29 0a 09 20 28 6c 65  ep=" step).. (le
9b10: 74 20 28 28 72 65 63 6f 72 64 20 28 68 61 73 68  t ((record (hash
9b20: 2d 74 61 62 6c 65 2d 72 65 66 2f 64 65 66 61 75  -table-ref/defau
9b30: 6c 74 20 0a 09 09 09 72 65 73 20 0a 09 09 09 28  lt ....res ....(
9b40: 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 65 70  db:step-get-step
9b50: 6e 61 6d 65 20 73 74 65 70 29 20 0a 09 09 09 3b  name step) ....;
9b60: 3b 20 20 20 20 20 20 20 20 73 74 65 70 6e 61 6d  ;        stepnam
9b70: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
9b80: 20 73 74 61 72 74 20 65 6e 64 20 73 74 61 74 75   start end statu
9b90: 73 20 20 20 20 0a 09 09 09 28 76 65 63 74 6f 72  s    ....(vector
9ba0: 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74   (db:step-get-st
9bb0: 65 70 6e 61 6d 65 20 73 74 65 70 29 20 22 22 20  epname step) "" 
9bc0: 20 20 22 22 20 22 22 20 20 20 20 20 22 22 20 22    "" ""     "" "
9bd0: 22 29 29 29 29 0a 09 20 20 20 28 64 65 62 75 67  "))))..   (debug
9be0: 3a 70 72 69 6e 74 20 36 20 22 72 65 63 6f 72 64  :print 6 "record
9bf0: 28 62 65 66 6f 72 65 29 20 3d 20 22 20 72 65 63  (before) = " rec
9c00: 6f 72 64 20 0a 09 09 09 22 5c 6e 69 64 3a 20 20  ord ...."\nid:  
9c10: 20 20 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d       " (db:step-
9c20: 67 65 74 2d 69 64 20 73 74 65 70 29 0a 09 09 09  get-id step)....
9c30: 22 5c 6e 73 74 65 70 6e 61 6d 65 3a 20 22 20 28  "\nstepname: " (
9c40: 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 65 70  db:step-get-step
9c50: 6e 61 6d 65 20 73 74 65 70 29 0a 09 09 09 22 5c  name step)...."\
9c60: 6e 73 74 61 74 65 3a 20 20 20 20 22 20 28 64 62  nstate:    " (db
9c70: 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 74 65 20  :step-get-state 
9c80: 73 74 65 70 29 0a 09 09 09 22 5c 6e 73 74 61 74  step)...."\nstat
9c90: 75 73 3a 20 20 20 22 20 28 64 62 3a 73 74 65 70  us:   " (db:step
9ca0: 2d 67 65 74 2d 73 74 61 74 75 73 20 73 74 65 70  -get-status step
9cb0: 29 0a 09 09 09 22 5c 6e 74 69 6d 65 3a 20 20 20  )...."\ntime:   
9cc0: 20 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74    " (db:step-get
9cd0: 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73 74 65 70  -event_time step
9ce0: 29 29 0a 09 20 20 20 28 63 61 73 65 20 28 73 74  ))..   (case (st
9cf0: 72 69 6e 67 2d 3e 73 79 6d 62 6f 6c 20 28 64 62  ring->symbol (db
9d00: 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 74 65 20  :step-get-state 
9d10: 73 74 65 70 29 29 0a 09 20 20 20 20 20 28 28 73  step))..     ((s
9d20: 74 61 72 74 29 28 76 65 63 74 6f 72 2d 73 65 74  tart)(vector-set
9d30: 21 20 72 65 63 6f 72 64 20 31 20 28 64 62 3a 73  ! record 1 (db:s
9d40: 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69  tep-get-event_ti
9d50: 6d 65 20 73 74 65 70 29 29 0a 09 20 20 20 20 20  me step))..     
9d60: 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72 65   (vector-set! re
9d70: 63 6f 72 64 20 33 20 28 69 66 20 28 65 71 75 61  cord 3 (if (equa
9d80: 6c 3f 20 28 76 65 63 74 6f 72 2d 72 65 66 20 72  l? (vector-ref r
9d90: 65 63 6f 72 64 20 33 29 20 22 22 29 0a 09 09 09  ecord 3) "")....
9da0: 09 09 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73  ..(db:step-get-s
9db0: 74 61 74 75 73 20 73 74 65 70 29 29 29 0a 09 20  tatus step))).. 
9dc0: 20 20 20 20 20 28 69 66 20 28 3e 20 28 73 74 72       (if (> (str
9dd0: 69 6e 67 2d 6c 65 6e 67 74 68 20 28 64 62 3a 73  ing-length (db:s
9de0: 74 65 70 2d 67 65 74 2d 6c 6f 67 66 69 6c 65 20  tep-get-logfile 
9df0: 73 74 65 70 29 29 0a 09 09 20 20 20 20 20 30 29  step))...     0)
9e00: 0a 09 09 20 20 28 76 65 63 74 6f 72 2d 73 65 74  ...  (vector-set
9e10: 21 20 72 65 63 6f 72 64 20 35 20 28 64 62 3a 73  ! record 5 (db:s
9e20: 74 65 70 2d 67 65 74 2d 6c 6f 67 66 69 6c 65 20  tep-get-logfile 
9e30: 73 74 65 70 29 29 29 29 0a 09 20 20 20 20 20 28  step))))..     (
9e40: 28 65 6e 64 29 20 20 0a 09 20 20 20 20 20 20 28  (end)  ..      (
9e50: 76 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f  vector-set! reco
9e60: 72 64 20 32 20 28 61 6e 79 2d 3e 6e 75 6d 62 65  rd 2 (any->numbe
9e70: 72 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65  r (db:step-get-e
9e80: 76 65 6e 74 5f 74 69 6d 65 20 73 74 65 70 29 29  vent_time step))
9e90: 29 0a 09 20 20 20 20 20 20 28 76 65 63 74 6f 72  )..      (vector
9ea0: 2d 73 65 74 21 20 72 65 63 6f 72 64 20 33 20 28  -set! record 3 (
9eb0: 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 74  db:step-get-stat
9ec0: 75 73 20 73 74 65 70 29 29 0a 09 20 20 20 20 20  us step))..     
9ed0: 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72 65   (vector-set! re
9ee0: 63 6f 72 64 20 34 20 28 6c 65 74 20 28 28 73 74  cord 4 (let ((st
9ef0: 61 72 74 74 20 28 61 6e 79 2d 3e 6e 75 6d 62 65  artt (any->numbe
9f00: 72 20 28 76 65 63 74 6f 72 2d 72 65 66 20 72 65  r (vector-ref re
9f10: 63 6f 72 64 20 31 29 29 29 0a 09 09 09 09 09 20  cord 1)))...... 
9f20: 20 28 65 6e 64 74 20 20 20 28 61 6e 79 2d 3e 6e   (endt   (any->n
9f30: 75 6d 62 65 72 20 28 76 65 63 74 6f 72 2d 72 65  umber (vector-re
9f40: 66 20 72 65 63 6f 72 64 20 32 29 29 29 29 0a 09  f record 2))))..
9f50: 09 09 09 20 20 20 20 20 20 28 64 65 62 75 67 3a  ...      (debug:
9f60: 70 72 69 6e 74 20 34 20 22 72 65 63 6f 72 64 5b  print 4 "record[
9f70: 31 5d 3d 22 20 28 76 65 63 74 6f 72 2d 72 65 66  1]=" (vector-ref
9f80: 20 72 65 63 6f 72 64 20 31 29 20 0a 09 09 09 09   record 1) .....
9f90: 09 09 20 20 20 22 2c 20 73 74 61 72 74 74 3d 22  ..   ", startt="
9fa0: 20 73 74 61 72 74 74 20 22 2c 20 65 6e 64 74 3d   startt ", endt=
9fb0: 22 20 65 6e 64 74 0a 09 09 09 09 09 09 20 20 20  " endt.......   
9fc0: 22 2c 20 67 65 74 2d 73 74 61 74 75 73 3a 20 22  ", get-status: "
9fd0: 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74   (db:step-get-st
9fe0: 61 74 75 73 20 73 74 65 70 29 29 0a 09 09 09 09  atus step)).....
9ff0: 20 20 20 20 20 20 28 69 66 20 28 61 6e 64 20 28        (if (and (
a000: 6e 75 6d 62 65 72 3f 20 73 74 61 72 74 74 29 28  number? startt)(
a010: 6e 75 6d 62 65 72 3f 20 65 6e 64 74 29 29 0a 09  number? endt))..
a020: 09 09 09 09 20 20 28 73 65 63 6f 6e 64 73 2d 3e  ....  (seconds->
a030: 68 72 2d 6d 69 6e 2d 73 65 63 20 28 2d 20 65 6e  hr-min-sec (- en
a040: 64 74 20 73 74 61 72 74 74 29 29 20 22 2d 31 22  dt startt)) "-1"
a050: 29 29 29 0a 09 20 20 20 20 20 20 28 69 66 20 28  )))..      (if (
a060: 3e 20 28 73 74 72 69 6e 67 2d 6c 65 6e 67 74 68  > (string-length
a070: 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 6c 6f   (db:step-get-lo
a080: 67 66 69 6c 65 20 73 74 65 70 29 29 0a 09 09 20  gfile step))... 
a090: 20 20 20 20 30 29 0a 09 09 20 20 28 76 65 63 74      0)...  (vect
a0a0: 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 35  or-set! record 5
a0b0: 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 6c 6f   (db:step-get-lo
a0c0: 67 66 69 6c 65 20 73 74 65 70 29 29 29 29 0a 09  gfile step))))..
a0d0: 20 20 20 20 20 28 65 6c 73 65 0a 09 20 20 20 20       (else..    
a0e0: 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72    (vector-set! r
a0f0: 65 63 6f 72 64 20 32 20 28 64 62 3a 73 74 65 70  ecord 2 (db:step
a100: 2d 67 65 74 2d 73 74 61 74 65 20 73 74 65 70 29  -get-state step)
a110: 29 0a 09 20 20 20 20 20 20 28 76 65 63 74 6f 72  )..      (vector
a120: 2d 73 65 74 21 20 72 65 63 6f 72 64 20 33 20 28  -set! record 3 (
a130: 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 74  db:step-get-stat
a140: 75 73 20 73 74 65 70 29 29 0a 09 20 20 20 20 20  us step))..     
a150: 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72 65   (vector-set! re
a160: 63 6f 72 64 20 34 20 28 64 62 3a 73 74 65 70 2d  cord 4 (db:step-
a170: 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73  get-event_time s
a180: 74 65 70 29 29 29 29 0a 09 20 20 20 28 68 61 73  tep))))..   (has
a190: 68 2d 74 61 62 6c 65 2d 73 65 74 21 20 72 65 73  h-table-set! res
a1a0: 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74   (db:step-get-st
a1b0: 65 70 6e 61 6d 65 20 73 74 65 70 29 20 72 65 63  epname step) rec
a1c0: 6f 72 64 29 0a 09 20 20 20 28 64 65 62 75 67 3a  ord)..   (debug:
a1d0: 70 72 69 6e 74 20 36 20 22 72 65 63 6f 72 64 28  print 6 "record(
a1e0: 61 66 74 65 72 29 20 20 3d 20 22 20 72 65 63 6f  after)  = " reco
a1f0: 72 64 20 0a 09 09 09 22 5c 6e 69 64 3a 20 20 20  rd ...."\nid:   
a200: 20 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d 67      " (db:step-g
a210: 65 74 2d 69 64 20 73 74 65 70 29 0a 09 09 09 22  et-id step)...."
a220: 5c 6e 73 74 65 70 6e 61 6d 65 3a 20 22 20 28 64  \nstepname: " (d
a230: 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 65 70 6e  b:step-get-stepn
a240: 61 6d 65 20 73 74 65 70 29 0a 09 09 09 22 5c 6e  ame step)...."\n
a250: 73 74 61 74 65 3a 20 20 20 20 22 20 28 64 62 3a  state:    " (db:
a260: 73 74 65 70 2d 67 65 74 2d 73 74 61 74 65 20 73  step-get-state s
a270: 74 65 70 29 0a 09 09 09 22 5c 6e 73 74 61 74 75  tep)...."\nstatu
a280: 73 3a 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d  s:   " (db:step-
a290: 67 65 74 2d 73 74 61 74 75 73 20 73 74 65 70 29  get-status step)
a2a0: 0a 09 09 09 22 5c 6e 74 69 6d 65 3a 20 20 20 20  ...."\ntime:    
a2b0: 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d   " (db:step-get-
a2c0: 65 76 65 6e 74 5f 74 69 6d 65 20 73 74 65 70 29  event_time step)
a2d0: 29 29 29 0a 20 20 20 20 20 20 20 3b 3b 20 28 65  ))).       ;; (e
a2e0: 6c 73 65 20 20 20 28 76 65 63 74 6f 72 2d 73 65  lse   (vector-se
a2f0: 74 21 20 72 65 63 6f 72 64 20 31 20 28 64 62 3a  t! record 1 (db:
a300: 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74  step-get-event_t
a310: 69 6d 65 20 73 74 65 70 29 29 29 0a 20 20 20 20  ime step))).    
a320: 20 20 20 28 73 6f 72 74 20 73 74 65 70 73 20 28     (sort steps (
a330: 6c 61 6d 62 64 61 20 28 61 20 62 29 28 3c 20 28  lambda (a b)(< (
a340: 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 6e  db:step-get-even
a350: 74 5f 74 69 6d 65 20 61 29 28 64 62 3a 73 74 65  t_time a)(db:ste
a360: 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65  p-get-event_time
a370: 20 62 29 29 29 29 29 0a 20 20 20 20 20 20 72 65   b))))).      re
a380: 73 29 29 29 0a 0a 3b 3b 20 74 68 65 20 6e 65 77  s)))..;; the new
a390: 20 70 72 65 72 65 71 73 20 63 61 6c 63 75 6c 61   prereqs calcula
a3a0: 74 69 6f 6e 2c 20 6c 6f 6f 6b 73 20 61 6c 73 6f  tion, looks also
a3b0: 20 61 74 20 69 74 65 6d 70 61 74 68 20 69 66 20   at itempath if 
a3c0: 73 70 65 63 69 66 69 65 64 0a 3b 3b 20 61 6c 6c  specified.;; all
a3d0: 20 70 72 65 72 65 71 73 20 6d 75 73 74 20 62 65   prereqs must be
a3e0: 20 6d 65 74 3a 0a 3b 3b 20 20 20 20 69 66 20 70   met:.;;    if p
a3f0: 72 65 72 65 71 20 74 65 73 74 20 77 69 74 68 20  rereq test with 
a400: 69 74 65 6d 70 61 74 68 3d 27 27 20 69 73 20 43  itempath='' is C
a410: 4f 4d 50 4c 45 54 45 44 20 61 6e 64 20 50 41 53  OMPLETED and PAS
a420: 53 2c 20 57 41 52 4e 2c 20 43 48 45 43 4b 2c 20  S, WARN, CHECK, 
a430: 6f 72 20 57 41 49 56 45 44 20 74 68 65 6e 20 70  or WAIVED then p
a440: 72 65 72 65 71 20 69 73 20 6d 65 74 0a 3b 3b 20  rereq is met.;; 
a450: 20 20 20 69 66 20 70 72 65 72 65 71 20 74 65 73     if prereq tes
a460: 74 20 77 69 74 68 20 69 74 65 6d 70 61 74 68 3d  t with itempath=
a470: 72 65 66 2d 69 74 65 6d 2d 70 61 74 68 20 61 6e  ref-item-path an
a480: 64 20 43 4f 4d 50 4c 45 54 45 44 20 77 69 74 68  d COMPLETED with
a490: 20 50 41 53 53 2c 20 57 41 52 4e 2c 20 43 48 45   PASS, WARN, CHE
a4a0: 43 4b 2c 20 6f 72 20 57 41 49 56 45 44 20 74 68  CK, or WAIVED th
a4b0: 65 6e 20 70 72 65 72 65 71 20 69 73 20 6d 65 74  en prereq is met
a4c0: 0a 3b 3b 0a 3b 3b 20 4e 6f 74 65 3a 20 64 6f 20  .;;.;; Note: do 
a4d0: 6e 6f 74 20 63 6f 6e 76 65 72 74 20 74 6f 20 72  not convert to r
a4e0: 65 6d 6f 74 65 20 61 73 20 69 74 20 63 61 6c 6c  emote as it call
a4f0: 73 20 72 65 6d 6f 74 65 20 75 6e 64 65 72 20 74  s remote under t
a500: 68 65 20 68 6f 6f 64 0a 3b 3b 0a 28 64 65 66 69  he hood.;;.(defi
a510: 6e 65 20 28 64 62 3a 67 65 74 2d 70 72 65 72 65  ne (db:get-prere
a520: 71 73 2d 6e 6f 74 2d 6d 65 74 20 64 62 20 72 75  qs-not-met db ru
a530: 6e 2d 69 64 20 77 61 69 74 6f 6e 73 20 72 65 66  n-id waitons ref
a540: 2d 69 74 65 6d 2d 70 61 74 68 29 0a 20 20 28 69  -item-path).  (i
a550: 66 20 28 6f 72 20 28 6e 6f 74 20 77 61 69 74 6f  f (or (not waito
a560: 6e 73 29 0a 09 20 20 28 6e 75 6c 6c 3f 20 77 61  ns)..  (null? wa
a570: 69 74 6f 6e 73 29 29 0a 20 20 20 20 20 20 27 28  itons)).      '(
a580: 29 0a 20 20 20 20 20 20 28 6c 65 74 2a 20 28 28  ).      (let* ((
a590: 75 6e 6d 65 74 2d 70 72 65 2d 72 65 71 73 20 27  unmet-pre-reqs '
a5a0: 28 29 29 0a 09 20 20 20 20 20 28 72 65 73 75 6c  ())..     (resul
a5b0: 74 20 20 20 20 20 20 20 20 20 27 28 29 29 29 0a  t         '())).
a5c0: 09 28 66 6f 72 2d 65 61 63 68 20 0a 09 20 28 6c  .(for-each .. (l
a5d0: 61 6d 62 64 61 20 28 77 61 69 74 6f 6e 74 65 73  ambda (waitontes
a5e0: 74 2d 6e 61 6d 65 29 0a 09 20 20 20 3b 3b 20 62  t-name)..   ;; b
a5f0: 79 20 67 65 74 74 69 6e 67 20 74 68 65 20 74 65  y getting the te
a600: 73 74 73 20 77 69 74 68 20 6d 61 74 63 68 69 6e  sts with matchin
a610: 67 20 6e 61 6d 65 20 77 65 20 61 72 65 20 6c 6f  g name we are lo
a620: 6f 6b 69 6e 67 20 6f 6e 6c 79 20 61 74 20 74 68  oking only at th
a630: 65 20 6d 61 74 63 68 69 6e 67 20 74 65 73 74 20  e matching test 
a640: 0a 09 20 20 20 3b 3b 20 61 6e 64 20 72 65 6c 61  ..   ;; and rela
a650: 74 65 64 20 73 75 62 20 69 74 65 6d 73 0a 09 20  ted sub items.. 
a660: 20 20 28 6c 65 74 20 28 28 74 65 73 74 73 20 20    (let ((tests  
a670: 20 20 20 20 20 20 20 20 20 20 20 28 72 64 62 3a             (rdb:
a680: 67 65 74 2d 74 65 73 74 73 2d 66 6f 72 2d 72 75  get-tests-for-ru
a690: 6e 20 64 62 20 72 75 6e 2d 69 64 20 77 61 69 74  n db run-id wait
a6a0: 6f 6e 74 65 73 74 2d 6e 61 6d 65 20 23 66 20 27  ontest-name #f '
a6b0: 28 29 20 27 28 29 29 29 0a 09 09 20 28 65 76 65  () '()))... (eve
a6c0: 72 2d 73 65 65 6e 20 20 20 20 20 20 20 20 20 23  r-seen         #
a6d0: 66 29 0a 09 09 20 28 70 61 72 65 6e 74 2d 77 61  f)... (parent-wa
a6e0: 69 74 6f 6e 2d 6d 65 74 20 23 66 29 0a 09 09 20  iton-met #f)... 
a6f0: 28 69 74 65 6d 2d 77 61 69 74 6f 6e 2d 6d 65 74  (item-waiton-met
a700: 20 20 20 23 66 29 29 0a 09 20 20 20 20 20 28 66     #f))..     (f
a710: 6f 72 2d 65 61 63 68 20 0a 09 20 20 20 20 20 20  or-each ..      
a720: 28 6c 61 6d 62 64 61 20 28 74 65 73 74 29 0a 09  (lambda (test)..
a730: 09 3b 3b 20 28 69 66 20 28 65 71 75 61 6c 3f 20  .;; (if (equal? 
a740: 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 20  waitontest-name 
a750: 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 74 65 73  (db:test-get-tes
a760: 74 6e 61 6d 65 20 74 65 73 74 29 29 20 3b 3b 20  tname test)) ;; 
a770: 62 79 20 64 65 66 69 6e 74 69 6f 6e 20 74 68 69  by defintion thi
a780: 73 20 68 61 64 20 62 65 74 74 65 72 20 62 65 20  s had better be 
a790: 74 72 75 65 20 2e 2e 2e 0a 09 09 28 6c 65 74 2a  true ......(let*
a7a0: 20 28 28 73 74 61 74 65 20 20 20 20 20 20 20 20   ((state        
a7b0: 20 20 20 20 20 28 64 62 3a 74 65 73 74 2d 67 65       (db:test-ge
a7c0: 74 2d 73 74 61 74 65 20 74 65 73 74 29 29 0a 09  t-state test))..
a7d0: 09 20 20 20 20 20 20 20 28 73 74 61 74 75 73 20  .       (status 
a7e0: 20 20 20 20 20 20 20 20 20 20 20 28 64 62 3a 74             (db:t
a7f0: 65 73 74 2d 67 65 74 2d 73 74 61 74 75 73 20 74  est-get-status t
a800: 65 73 74 29 29 0a 09 09 20 20 20 20 20 20 20 28  est))...       (
a810: 69 74 65 6d 2d 70 61 74 68 20 20 20 20 20 20 20  item-path       
a820: 20 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 69    (db:test-get-i
a830: 74 65 6d 2d 70 61 74 68 20 74 65 73 74 29 29 0a  tem-path test)).
a840: 09 09 20 20 20 20 20 20 20 28 69 73 2d 63 6f 6d  ..       (is-com
a850: 70 6c 65 74 65 64 20 20 20 20 20 20 28 65 71 75  pleted      (equ
a860: 61 6c 3f 20 73 74 61 74 65 20 22 43 4f 4d 50 4c  al? state "COMPL
a870: 45 54 45 44 22 29 29 0a 09 09 20 20 20 20 20 20  ETED"))...      
a880: 20 28 69 73 2d 6f 6b 20 20 20 20 20 20 20 20 20   (is-ok         
a890: 20 20 20 20 28 6d 65 6d 62 65 72 20 73 74 61 74      (member stat
a8a0: 75 73 20 27 28 22 50 41 53 53 22 20 22 57 41 52  us '("PASS" "WAR
a8b0: 4e 22 20 22 43 48 45 43 4b 22 20 22 57 41 49 56  N" "CHECK" "WAIV
a8c0: 45 44 22 29 29 29 0a 09 09 20 20 20 20 20 20 20  ED")))...       
a8d0: 28 73 61 6d 65 2d 69 74 65 6d 70 61 74 68 20 20  (same-itempath  
a8e0: 20 20 20 28 65 71 75 61 6c 3f 20 72 65 66 2d 69     (equal? ref-i
a8f0: 74 65 6d 2d 70 61 74 68 20 69 74 65 6d 2d 70 61  tem-path item-pa
a900: 74 68 29 29 29 0a 09 09 20 20 28 73 65 74 21 20  th)))...  (set! 
a910: 65 76 65 72 2d 73 65 65 6e 20 23 74 29 0a 09 09  ever-seen #t)...
a920: 20 20 28 63 6f 6e 64 0a 09 09 20 20 20 3b 3b 20    (cond...   ;; 
a930: 63 61 73 65 20 31 2c 20 6e 6f 6e 2d 69 74 65 6d  case 1, non-item
a940: 20 28 70 61 72 65 6e 74 20 74 65 73 74 29 20 69   (parent test) i
a950: 73 20 0a 09 09 20 20 20 28 28 61 6e 64 20 28 65  s ...   ((and (e
a960: 71 75 61 6c 3f 20 69 74 65 6d 2d 70 61 74 68 20  qual? item-path 
a970: 22 22 29 20 3b 3b 20 74 68 69 73 20 69 73 20 74  "") ;; this is t
a980: 68 65 20 70 61 72 65 6e 74 20 74 65 73 74 0a 09  he parent test..
a990: 09 09 20 69 73 2d 63 6f 6d 70 6c 65 74 65 64 0a  .. is-completed.
a9a0: 09 09 09 20 69 73 2d 6f 6b 29 0a 09 09 20 20 20  ... is-ok)...   
a9b0: 20 28 73 65 74 21 20 70 61 72 65 6e 74 2d 77 61   (set! parent-wa
a9c0: 69 74 6f 6e 2d 6d 65 74 20 23 74 29 29 0a 09 09  iton-met #t))...
a9d0: 20 20 20 28 28 61 6e 64 20 73 61 6d 65 2d 69 74     ((and same-it
a9e0: 65 6d 70 61 74 68 0a 09 09 09 20 69 73 2d 63 6f  empath.... is-co
a9f0: 6d 70 6c 65 74 65 64 0a 09 09 09 20 69 73 2d 6f  mpleted.... is-o
aa00: 6b 29 0a 09 09 20 20 20 20 28 73 65 74 21 20 69  k)...    (set! i
aa10: 74 65 6d 2d 77 61 69 74 6f 6e 2d 6d 65 74 20 23  tem-waiton-met #
aa20: 74 29 29 29 29 29 0a 09 20 20 20 20 20 20 74 65  t)))))..      te
aa30: 73 74 73 29 0a 09 20 20 20 20 20 28 69 66 20 28  sts)..     (if (
aa40: 6e 6f 74 20 28 6f 72 20 70 61 72 65 6e 74 2d 77  not (or parent-w
aa50: 61 69 74 6f 6e 2d 6d 65 74 20 69 74 65 6d 2d 77  aiton-met item-w
aa60: 61 69 74 6f 6e 2d 6d 65 74 29 29 0a 09 09 20 28  aiton-met))... (
aa70: 73 65 74 21 20 72 65 73 75 6c 74 20 28 63 6f 6e  set! result (con
aa80: 73 20 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d  s waitontest-nam
aa90: 65 20 72 65 73 75 6c 74 29 29 29 0a 09 20 20 20  e result)))..   
aaa0: 20 20 3b 3b 20 69 66 20 74 68 65 20 74 65 73 74    ;; if the test
aab0: 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 20 74 68   is not found th
aac0: 65 6e 20 63 6c 65 61 72 6c 79 20 74 68 65 20 77  en clearly the w
aad0: 61 69 74 6f 6e 20 69 73 20 6e 6f 74 20 6d 65 74  aiton is not met
aae0: 2e 2e 2e 0a 09 20 20 20 20 20 28 69 66 20 28 6e  .....     (if (n
aaf0: 6f 74 20 65 76 65 72 2d 73 65 65 6e 29 28 73 65  ot ever-seen)(se
ab00: 74 21 20 72 65 73 75 6c 74 20 28 63 6f 6e 73 20  t! result (cons 
ab10: 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 20  waitontest-name 
ab20: 72 65 73 75 6c 74 29 29 29 29 29 0a 09 77 61 69  result)))))..wai
ab30: 74 6f 6e 73 29 0a 20 20 20 20 20 20 28 64 65 6c  tons).      (del
ab40: 65 74 65 2d 64 75 70 6c 69 63 61 74 65 73 20 72  ete-duplicates r
ab50: 65 73 75 6c 74 29 29 29 29 0a 0a 28 64 65 66 69  esult))))..(defi
ab60: 6e 65 20 28 64 62 3a 74 65 73 74 73 74 65 70 2d  ne (db:teststep-
ab70: 73 65 74 2d 73 74 61 74 75 73 21 20 64 62 20 74  set-status! db t
ab80: 65 73 74 2d 69 64 20 74 65 73 74 73 74 65 70 2d  est-id teststep-
ab90: 6e 61 6d 65 20 73 74 61 74 65 2d 69 6e 20 73 74  name state-in st
aba0: 61 74 75 73 2d 69 6e 20 69 74 65 6d 2d 70 61 74  atus-in item-pat
abb0: 68 20 63 6f 6d 6d 65 6e 74 20 6c 6f 67 66 69 6c  h comment logfil
abc0: 65 29 0a 20 20 28 64 65 62 75 67 3a 70 72 69 6e  e).  (debug:prin
abd0: 74 20 34 20 22 74 65 73 74 2d 69 64 3a 20 22 20  t 4 "test-id: " 
abe0: 74 65 73 74 2d 69 64 20 22 20 74 65 73 74 73 74  test-id " testst
abf0: 65 70 2d 6e 61 6d 65 3a 20 22 20 74 65 73 74 73  ep-name: " tests
ac00: 74 65 70 2d 6e 61 6d 65 29 0a 20 20 28 6c 65 74  tep-name).  (let
ac10: 2a 20 28 28 73 74 61 74 65 20 20 20 20 20 28 63  * ((state     (c
ac20: 68 65 63 6b 2d 76 61 6c 69 64 2d 69 74 65 6d 73  heck-valid-items
ac30: 20 22 73 74 61 74 65 22 20 73 74 61 74 65 2d 69   "state" state-i
ac40: 6e 29 29 0a 09 20 28 73 74 61 74 75 73 20 20 20  n)).. (status   
ac50: 20 28 63 68 65 63 6b 2d 76 61 6c 69 64 2d 69 74   (check-valid-it
ac60: 65 6d 73 20 22 73 74 61 74 75 73 22 20 73 74 61  ems "status" sta
ac70: 74 75 73 2d 69 6e 29 29 29 0a 20 20 20 20 28 69  tus-in))).    (i
ac80: 66 20 28 6f 72 20 28 6e 6f 74 20 73 74 61 74 65  f (or (not state
ac90: 29 28 6e 6f 74 20 73 74 61 74 75 73 29 29 0a 09  )(not status))..
aca0: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 30 20 22  (debug:print 0 "
acb0: 57 41 52 4e 49 4e 47 3a 20 49 6e 76 61 6c 69 64  WARNING: Invalid
acc0: 20 22 20 28 69 66 20 73 74 61 74 75 73 20 22 73   " (if status "s
acd0: 74 61 74 75 73 22 20 22 73 74 61 74 65 22 29 0a  tatus" "state").
ace0: 09 09 20 20 20 20 20 22 20 76 61 6c 75 65 20 5c  ..     " value \
acf0: 22 22 20 28 69 66 20 73 74 61 74 75 73 20 73 74  "" (if status st
ad00: 61 74 65 2d 69 6e 20 73 74 61 74 75 73 2d 69 6e  ate-in status-in
ad10: 29 20 22 5c 22 2c 20 75 70 64 61 74 65 20 79 6f  ) "\", update yo
ad20: 75 72 20 76 61 6c 69 64 76 61 6c 75 65 73 20 73  ur validvalues s
ad30: 65 63 74 69 6f 6e 20 69 6e 20 6d 65 67 61 74 65  ection in megate
ad40: 73 74 2e 63 6f 6e 66 69 67 22 29 29 0a 20 20 20  st.config")).   
ad50: 20 28 6d 75 74 65 78 2d 6c 6f 63 6b 21 20 2a 69   (mutex-lock! *i
ad60: 6e 63 6f 6d 69 6e 67 2d 6d 75 74 65 78 2a 29 0a  ncoming-mutex*).
ad70: 20 20 20 20 28 73 65 74 21 20 2a 69 6e 63 6f 6d      (set! *incom
ad80: 69 6e 67 2d 64 61 74 61 2a 20 28 63 6f 6e 73 20  ing-data* (cons 
ad90: 28 76 65 63 74 6f 72 20 27 73 74 65 70 2d 73 74  (vector 'step-st
ada0: 61 74 75 73 0a 09 09 09 09 09 28 63 75 72 72 65  atus......(curre
adb0: 6e 74 2d 73 65 63 6f 6e 64 73 29 0a 09 09 09 09  nt-seconds).....
adc0: 09 3b 3b 20 46 49 58 4d 45 20 2d 20 74 68 69 73  .;; FIXME - this
add0: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 75 70 64 61   should not upda
ade0: 74 65 20 74 68 65 20 6c 6f 67 66 69 6c 65 20 75  te the logfile u
adf0: 6e 6c 65 73 73 20 69 74 20 69 73 20 73 70 65 63  nless it is spec
ae00: 69 66 69 65 64 2e 0a 09 09 09 09 09 28 6c 69 73  ified.......(lis
ae10: 74 20 74 65 73 74 2d 69 64 20 74 65 73 74 73 74  t test-id testst
ae20: 65 70 2d 6e 61 6d 65 20 73 74 61 74 65 2d 69 6e  ep-name state-in
ae30: 20 73 74 61 74 75 73 2d 69 6e 20 28 63 75 72 72   status-in (curr
ae40: 65 6e 74 2d 73 65 63 6f 6e 64 73 29 20 28 69 66  ent-seconds) (if
ae50: 20 63 6f 6d 6d 65 6e 74 20 63 6f 6d 6d 65 6e 74   comment comment
ae60: 20 22 22 29 20 28 69 66 20 6c 6f 67 66 69 6c 65   "") (if logfile
ae70: 20 6c 6f 67 66 69 6c 65 20 22 22 29 29 29 0a 09   logfile "")))..
ae80: 09 09 09 2a 69 6e 63 6f 6d 69 6e 67 2d 64 61 74  ...*incoming-dat
ae90: 61 2a 29 29 0a 20 20 20 20 28 6d 75 74 65 78 2d  a*)).    (mutex-
aea0: 75 6e 6c 6f 63 6b 21 20 2a 69 6e 63 6f 6d 69 6e  unlock! *incomin
aeb0: 67 2d 6d 75 74 65 78 2a 29 0a 20 20 20 20 28 69  g-mutex*).    (i
aec0: 66 20 28 6e 6f 74 20 2a 63 61 63 68 65 2d 6f 6e  f (not *cache-on
aed0: 2a 29 28 64 62 3a 77 72 69 74 65 2d 63 61 63 68  *)(db:write-cach
aee0: 65 64 2d 64 61 74 61 20 64 62 29 29 0a 20 20 20  ed-data db)).   
aef0: 20 23 74 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d   #t))..;;=======
af00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
af10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
af20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
af30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a  ===============.
af40: 3b 3b 20 45 78 74 72 61 63 74 20 6f 64 73 20 66  ;; Extract ods f
af50: 69 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62 0a  ile from the db.
af60: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
af70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
af80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
af90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
afa0: 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 72 75 6e  ========..;; run
afb0: 73 70 61 74 74 20 69 73 20 61 20 63 6f 6d 6d 61  spatt is a comma
afc0: 20 64 65 6c 69 6d 69 74 65 64 20 6c 69 73 74 20   delimited list 
afd0: 6f 66 20 72 75 6e 20 70 61 74 74 65 72 6e 73 0a  of run patterns.
afe0: 3b 3b 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74  ;; keypatt-alist
aff0: 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 2a 61   must contain *a
b000: 6c 6c 2a 20 6b 65 79 73 20 77 69 74 68 20 61 6e  ll* keys with an
b010: 20 61 73 73 6f 63 69 61 74 65 64 20 70 61 74 74   associated patt
b020: 65 72 6e 3a 20 27 28 20 28 22 4b 45 59 31 22 20  ern: '( ("KEY1" 
b030: 22 25 22 29 20 2e 2e 20 29 0a 28 64 65 66 69 6e  "%") .. ).(defin
b040: 65 20 28 64 62 3a 65 78 74 72 61 63 74 2d 6f 64  e (db:extract-od
b050: 73 2d 66 69 6c 65 20 64 62 20 6f 75 74 70 75 74  s-file db output
b060: 66 69 6c 65 20 6b 65 79 70 61 74 74 2d 61 6c 69  file keypatt-ali
b070: 73 74 20 72 75 6e 73 70 61 74 74 20 70 61 74 68  st runspatt path
b080: 6d 6f 64 29 0a 20 20 28 6c 65 74 2a 20 28 28 6b  mod).  (let* ((k
b090: 65 79 73 73 74 72 20 20 28 73 74 72 69 6e 67 2d  eysstr  (string-
b0a0: 69 6e 74 65 72 73 70 65 72 73 65 20 28 6d 61 70  intersperse (map
b0b0: 20 63 61 72 20 6b 65 79 70 61 74 74 2d 61 6c 69   car keypatt-ali
b0c0: 73 74 29 20 22 2c 22 29 29 0a 09 20 28 6b 65 79  st) ",")).. (key
b0d0: 71 72 79 20 20 20 28 73 74 72 69 6e 67 2d 69 6e  qry   (string-in
b0e0: 74 65 72 73 70 65 72 73 65 20 28 6d 61 70 20 28  tersperse (map (
b0f0: 6c 61 6d 62 64 61 20 28 70 29 28 63 6f 6e 63 20  lambda (p)(conc 
b100: 28 63 61 72 20 70 29 20 22 20 4c 49 4b 45 20 3f  (car p) " LIKE ?
b110: 20 22 29 29 20 6b 65 79 70 61 74 74 2d 61 6c 69   ")) keypatt-ali
b120: 73 74 29 20 22 20 41 4e 44 20 22 29 29 0a 09 20  st) " AND ")).. 
b130: 28 6e 75 6d 6b 65 79 73 20 20 28 6c 65 6e 67 74  (numkeys  (lengt
b140: 68 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 29  h keypatt-alist)
b150: 29 0a 09 20 28 74 65 73 74 2d 69 64 73 20 27 28  ).. (test-ids '(
b160: 29 29 0a 09 20 28 77 69 6e 64 6f 77 73 20 20 28  )).. (windows  (
b170: 61 6e 64 20 70 61 74 68 6d 6f 64 20 28 73 75 62  and pathmod (sub
b180: 73 74 72 69 6e 67 2d 69 6e 64 65 78 20 22 5c 5c  string-index "\\
b190: 22 20 70 61 74 68 6d 6f 64 29 29 29 0a 09 20 28  " pathmod))).. (
b1a0: 74 65 6d 70 64 69 72 20 20 28 63 6f 6e 63 20 22  tempdir  (conc "
b1b0: 2f 74 6d 70 2f 22 20 28 63 75 72 72 65 6e 74 2d  /tmp/" (current-
b1c0: 75 73 65 72 2d 6e 61 6d 65 29 20 22 2f 22 20 72  user-name) "/" r
b1d0: 75 6e 73 70 61 74 74 20 22 5f 22 20 28 72 61 6e  unspatt "_" (ran
b1e0: 64 6f 6d 20 31 30 30 30 30 29 20 22 5f 22 20 28  dom 10000) "_" (
b1f0: 63 75 72 72 65 6e 74 2d 70 72 6f 63 65 73 73 2d  current-process-
b200: 69 64 29 29 29 0a 09 20 28 72 75 6e 73 68 65 61  id))).. (runshea
b210: 64 65 72 20 28 61 70 70 65 6e 64 20 28 6c 69 73  der (append (lis
b220: 74 20 22 52 75 6e 20 49 64 22 20 22 52 75 6e 6e  t "Run Id" "Runn
b230: 61 6d 65 22 29 20 3b 20 30 20 31 0a 09 09 09 20  ame") ; 0 1.... 
b240: 20 20 20 20 28 6d 61 70 20 63 61 72 20 6b 65 79      (map car key
b250: 70 61 74 74 2d 61 6c 69 73 74 29 20 20 20 3b 20  patt-alist)   ; 
b260: 2b 20 4e 20 3d 20 6c 65 6e 67 74 68 20 6b 65 79  + N = length key
b270: 70 61 74 74 2d 61 6c 69 73 74 0a 09 09 09 20 20  patt-alist....  
b280: 20 20 20 28 6c 69 73 74 20 22 54 65 73 74 6e 61     (list "Testna
b290: 6d 65 22 20 20 20 20 20 20 20 20 20 20 3b 20 32  me"          ; 2
b2a0: 0a 09 09 09 09 20 20 20 22 49 74 65 6d 20 50 61  .....   "Item Pa
b2b0: 74 68 22 20 20 20 20 20 20 20 20 20 3b 20 33 20  th"         ; 3 
b2c0: 0a 09 09 09 09 20 20 20 22 44 65 73 63 72 69 70  .....   "Descrip
b2d0: 74 69 6f 6e 22 20 20 20 20 20 20 20 3b 20 34 20  tion"       ; 4 
b2e0: 0a 09 09 09 09 20 20 20 22 53 74 61 74 65 22 20  .....   "State" 
b2f0: 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 35 20              ; 5 
b300: 0a 09 09 09 09 20 20 20 22 53 74 61 74 75 73 22  .....   "Status"
b310: 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 36 20              ; 6 
b320: 20 0a 09 09 09 09 20 20 20 22 46 69 6e 61 6c 20   .....   "Final 
b330: 4c 6f 67 22 20 20 20 20 20 20 20 20 20 3b 20 37  Log"         ; 7
b340: 20 0a 09 09 09 09 20 20 20 22 52 75 6e 20 44 75   .....   "Run Du
b350: 72 61 74 69 6f 6e 22 20 20 20 20 20 20 3b 20 38  ration"      ; 8
b360: 20 0a 09 09 09 09 20 20 20 22 57 68 65 6e 20 52   .....   "When R
b370: 75 6e 22 20 20 20 20 20 20 20 20 20 20 3b 20 39  un"          ; 9
b380: 20 0a 09 09 09 09 20 20 20 22 54 61 67 73 22 20   .....   "Tags" 
b390: 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 31               ; 1
b3a0: 30 0a 09 09 09 09 20 20 20 22 52 75 6e 20 4f 77  0.....   "Run Ow
b3b0: 6e 65 72 22 20 20 20 20 20 20 20 20 20 3b 20 31  ner"         ; 1
b3c0: 31 0a 09 09 09 09 20 20 20 22 43 6f 6d 6d 65 6e  1.....   "Commen
b3d0: 74 22 20 20 20 20 20 20 20 20 20 20 20 3b 20 31  t"           ; 1
b3e0: 32 0a 09 09 09 09 20 20 20 22 41 75 74 68 6f 72  2.....   "Author
b3f0: 22 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 31  "            ; 1
b400: 33 0a 09 09 09 09 20 20 20 22 54 65 73 74 20 4f  3.....   "Test O
b410: 77 6e 65 72 22 20 20 20 20 20 20 20 20 3b 20 31  wner"        ; 1
b420: 34 0a 09 09 09 09 20 20 20 22 52 65 76 69 65 77  4.....   "Review
b430: 65 64 22 20 20 20 20 20 20 20 20 20 20 3b 20 31  ed"          ; 1
b440: 35 0a 09 09 09 09 20 20 20 22 44 69 73 6b 66 72  5.....   "Diskfr
b450: 65 65 22 20 20 20 20 20 20 20 20 20 20 3b 20 31  ee"          ; 1
b460: 36 0a 09 09 09 09 20 20 20 22 55 6e 61 6d 65 22  6.....   "Uname"
b470: 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 31               ; 1
b480: 37 0a 09 09 09 09 20 20 20 22 52 75 6e 64 69 72  7.....   "Rundir
b490: 22 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 31  "            ; 1
b4a0: 38 0a 09 09 09 09 20 20 20 22 48 6f 73 74 22 20  8.....   "Host" 
b4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 31               ; 1
b4c0: 39 0a 09 09 09 09 20 20 20 22 43 70 75 20 4c 6f  9.....   "Cpu Lo
b4d0: 61 64 22 20 20 20 20 20 20 20 20 20 20 3b 20 32  ad"          ; 2
b4e0: 30 0a 09 09 09 09 20 20 20 29 29 29 0a 09 20 28  0.....   ))).. (
b4f0: 72 65 73 75 6c 74 73 20 28 6c 69 73 74 20 72 75  results (list ru
b500: 6e 73 68 65 61 64 65 72 29 29 09 09 09 20 0a 09  nsheader))... ..
b510: 20 28 74 65 73 74 64 61 74 61 2d 68 65 61 64 65   (testdata-heade
b520: 72 20 28 6c 69 73 74 20 22 52 75 6e 20 49 64 22  r (list "Run Id"
b530: 20 22 54 65 73 74 6e 61 6d 65 22 20 22 49 74 65   "Testname" "Ite
b540: 6d 20 50 61 74 68 22 20 22 43 61 74 65 67 6f 72  m Path" "Categor
b550: 79 22 20 22 56 61 72 69 61 62 6c 65 22 20 22 56  y" "Variable" "V
b560: 61 6c 75 65 22 20 22 45 78 70 65 63 74 65 64 22  alue" "Expected"
b570: 20 22 54 6f 6c 22 20 22 55 6e 69 74 73 22 20 22   "Tol" "Units" "
b580: 53 74 61 74 75 73 22 20 22 43 6f 6d 6d 65 6e 74  Status" "Comment
b590: 22 29 29 0a 09 20 28 6d 61 69 6e 71 72 79 20 28  ")).. (mainqry (
b5a0: 63 6f 6e 63 20 22 53 45 4c 45 43 54 0a 20 20 20  conc "SELECT.   
b5b0: 20 20 20 20 20 20 20 20 20 20 20 74 2e 74 65 73             t.tes
b5c0: 74 6e 61 6d 65 2c 72 2e 69 64 2c 72 75 6e 6e 61  tname,r.id,runna
b5d0: 6d 65 2c 22 20 6b 65 79 73 73 74 72 20 22 2c 74  me," keysstr ",t
b5e0: 2e 74 65 73 74 6e 61 6d 65 2c 0a 20 20 20 20 20  .testname,.     
b5f0: 20 20 20 20 20 20 20 20 20 74 2e 69 74 65 6d 5f           t.item_
b600: 70 61 74 68 2c 74 6d 2e 64 65 73 63 72 69 70 74  path,tm.descript
b610: 69 6f 6e 2c 74 2e 73 74 61 74 65 2c 74 2e 73 74  ion,t.state,t.st
b620: 61 74 75 73 2c 0a 20 20 20 20 20 20 20 20 20 20  atus,.          
b630: 20 20 20 20 66 69 6e 61 6c 5f 6c 6f 67 66 2c 72      final_logf,r
b640: 75 6e 5f 64 75 72 61 74 69 6f 6e 2c 20 0a 20 20  un_duration, .  
b650: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 66              strf
b660: 74 69 6d 65 28 27 25 6d 2f 25 64 2f 25 59 20 25  time('%m/%d/%Y %
b670: 48 3a 25 4d 3a 25 53 27 2c 64 61 74 65 74 69 6d  H:%M:%S',datetim
b680: 65 28 74 2e 65 76 65 6e 74 5f 74 69 6d 65 2c 27  e(t.event_time,'
b690: 75 6e 69 78 65 70 6f 63 68 27 29 2c 27 6c 6f 63  unixepoch'),'loc
b6a0: 61 6c 74 69 6d 65 27 29 2c 0a 20 20 20 20 20 20  altime'),.      
b6b0: 20 20 20 20 20 20 20 20 74 6d 2e 74 61 67 73 2c          tm.tags,
b6c0: 72 2e 6f 77 6e 65 72 2c 74 2e 63 6f 6d 6d 65 6e  r.owner,t.commen
b6d0: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
b6e0: 20 61 75 74 68 6f 72 2c 0a 20 20 20 20 20 20 20   author,.       
b6f0: 20 20 20 20 20 20 20 74 6d 2e 6f 77 6e 65 72 2c         tm.owner,
b700: 72 65 76 69 65 77 65 64 2c 0a 20 20 20 20 20 20  reviewed,.      
b710: 20 20 20 20 20 20 20 20 64 69 73 6b 66 72 65 65          diskfree
b720: 2c 75 6e 61 6d 65 2c 72 75 6e 64 69 72 2c 0a 20  ,uname,rundir,. 
b730: 20 20 20 20 20 20 20 20 20 20 20 20 20 68 6f 73               hos
b740: 74 2c 63 70 75 6c 6f 61 64 0a 20 20 20 20 20 20  t,cpuload.      
b750: 20 20 20 20 20 20 46 52 4f 4d 20 74 65 73 74 73        FROM tests
b760: 20 41 53 20 74 20 4a 4f 49 4e 20 72 75 6e 73 20   AS t JOIN runs 
b770: 41 53 20 72 20 4f 4e 20 74 2e 72 75 6e 5f 69 64  AS r ON t.run_id
b780: 3d 72 2e 69 64 20 4a 4f 49 4e 20 74 65 73 74 5f  =r.id JOIN test_
b790: 6d 65 74 61 20 41 53 20 74 6d 20 4f 4e 20 74 6d  meta AS tm ON tm
b7a0: 2e 74 65 73 74 6e 61 6d 65 3d 74 2e 74 65 73 74  .testname=t.test
b7b0: 6e 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 20  name.           
b7c0: 20 57 48 45 52 45 20 72 75 6e 6e 61 6d 65 20 4c   WHERE runname L
b7d0: 49 4b 45 20 3f 20 41 4e 44 20 22 20 6b 65 79 71  IKE ? AND " keyq
b7e0: 72 79 20 22 3b 22 29 29 29 0a 20 20 20 20 28 64  ry ";"))).    (d
b7f0: 65 62 75 67 3a 70 72 69 6e 74 20 32 20 22 55 73  ebug:print 2 "Us
b800: 69 6e 67 20 22 20 74 65 6d 70 64 69 72 20 22 20  ing " tempdir " 
b810: 66 6f 72 20 63 6f 6e 73 74 72 75 63 74 69 6e 67  for constructing
b820: 20 74 68 65 20 6f 64 73 20 66 69 6c 65 2e 20 6b   the ods file. k
b830: 65 79 71 72 79 3a 20 22 20 6b 65 79 71 72 79 20  eyqry: " keyqry 
b840: 22 20 6b 65 79 73 74 72 3a 20 22 20 6b 65 79 73  " keystr: " keys
b850: 73 74 72 20 22 20 77 69 74 68 20 6b 65 79 73 3a  str " with keys:
b860: 20 22 20 28 6d 61 70 20 63 61 64 72 20 6b 65 79   " (map cadr key
b870: 70 61 74 74 2d 61 6c 69 73 74 29 0a 09 09 20 22  patt-alist)... "
b880: 5c 6e 20 20 20 20 20 20 6d 61 69 6e 71 72 79 3a  \n      mainqry:
b890: 20 22 20 6d 61 69 6e 71 72 79 29 0a 20 20 20 20   " mainqry).    
b8a0: 3b 3b 20 22 45 78 70 65 63 74 65 64 20 56 61 6c  ;; "Expected Val
b8b0: 75 65 22 0a 20 20 20 20 3b 3b 20 22 56 61 6c 75  ue".    ;; "Valu
b8c0: 65 20 46 6f 75 6e 64 22 0a 20 20 20 20 3b 3b 20  e Found".    ;; 
b8d0: 22 54 6f 6c 65 72 61 6e 63 65 22 0a 20 20 20 20  "Tolerance".    
b8e0: 28 61 70 70 6c 79 20 73 71 6c 69 74 65 33 3a 66  (apply sqlite3:f
b8f0: 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 09 20 20 20  or-each-row..   
b900: 28 6c 61 6d 62 64 61 20 28 74 65 73 74 2d 69 64  (lambda (test-id
b910: 20 2e 20 62 29 0a 09 20 20 20 20 20 28 73 65 74   . b)..     (set
b920: 21 20 74 65 73 74 2d 69 64 73 20 28 63 6f 6e 73  ! test-ids (cons
b930: 20 74 65 73 74 2d 69 64 20 74 65 73 74 2d 69 64   test-id test-id
b940: 73 29 29 20 20 20 3b 3b 20 74 65 73 74 2d 69 64  s))   ;; test-id
b950: 20 69 73 20 6e 6f 77 20 74 65 73 74 6e 61 6d 65   is now testname
b960: 0a 09 20 20 20 20 20 28 73 65 74 21 20 72 65 73  ..     (set! res
b970: 75 6c 74 73 20 28 61 70 70 65 6e 64 20 72 65 73  ults (append res
b980: 75 6c 74 73 20 3b 3b 20 6e 6f 74 65 2c 20 64 72  ults ;; note, dr
b990: 6f 70 20 74 68 65 20 74 65 73 74 2d 69 64 0a 09  op the test-id..
b9a0: 09 09 09 20 20 20 28 6c 69 73 74 0a 09 09 09 09  ...   (list.....
b9b0: 20 20 20 20 28 69 66 20 70 61 74 68 6d 6f 64 0a      (if pathmod.
b9c0: 09 09 09 09 09 28 6c 65 74 2a 20 28 28 76 62 20  .....(let* ((vb 
b9d0: 20 20 20 20 20 20 20 28 61 70 70 6c 79 20 76 65         (apply ve
b9e0: 63 74 6f 72 20 62 29 29 0a 09 09 09 09 09 20 20  ctor b))......  
b9f0: 20 20 20 20 20 28 6b 65 79 76 61 6c 73 20 20 20       (keyvals   
ba00: 28 6c 65 74 20 6c 6f 6f 70 20 28 28 69 20 20 20  (let loop ((i   
ba10: 20 30 29 0a 09 09 09 09 09 09 09 09 20 20 20 20   0).........    
ba20: 20 28 72 65 73 20 27 28 29 29 29 0a 09 09 09 09   (res '())).....
ba30: 09 09 09 20 20 20 20 28 69 66 20 28 3e 3d 20 69  ...    (if (>= i
ba40: 20 6e 75 6d 6b 65 79 73 29 0a 09 09 09 09 09 09   numkeys).......
ba50: 09 09 72 65 73 0a 09 09 09 09 09 09 09 09 28 6c  ..res.........(l
ba60: 6f 6f 70 20 28 2b 20 69 20 31 29 0a 09 09 09 09  oop (+ i 1).....
ba70: 09 09 09 09 20 20 20 20 20 20 28 61 70 70 65 6e  ....      (appen
ba80: 64 20 72 65 73 20 28 6c 69 73 74 20 28 76 65 63  d res (list (vec
ba90: 74 6f 72 2d 72 65 66 20 76 62 20 28 2b 20 69 20  tor-ref vb (+ i 
baa0: 32 29 29 29 29 29 29 29 29 0a 09 09 09 09 09 20  2))))))))...... 
bab0: 20 20 20 20 20 20 28 72 75 6e 6e 61 6d 65 20 20        (runname  
bac0: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62 20   (vector-ref vb 
bad0: 31 29 29 0a 09 09 09 09 09 20 20 20 20 20 20 20  1))......       
bae0: 28 74 65 73 74 6e 61 6d 65 20 20 28 76 65 63 74  (testname  (vect
baf0: 6f 72 2d 72 65 66 20 76 62 20 28 2b 20 20 32 20  or-ref vb (+  2 
bb00: 6e 75 6d 6b 65 79 73 29 29 29 0a 09 09 09 09 09  numkeys)))......
bb10: 20 20 20 20 20 20 20 28 69 74 65 6d 2d 70 61 74         (item-pat
bb20: 68 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62  h (vector-ref vb
bb30: 20 28 2b 20 20 33 20 6e 75 6d 6b 65 79 73 29 29   (+  3 numkeys))
bb40: 29 0a 09 09 09 09 09 20 20 20 20 20 20 20 28 66  )......       (f
bb50: 69 6e 61 6c 2d 6c 6f 67 20 28 76 65 63 74 6f 72  inal-log (vector
bb60: 2d 72 65 66 20 76 62 20 28 2b 20 20 37 20 6e 75  -ref vb (+  7 nu
bb70: 6d 6b 65 79 73 29 29 29 0a 09 09 09 09 09 20 20  mkeys)))......  
bb80: 20 20 20 20 20 28 72 75 6e 2d 64 69 72 20 20 20       (run-dir   
bb90: 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62 20 28  (vector-ref vb (
bba0: 2b 20 31 38 20 6e 75 6d 6b 65 79 73 29 29 29 0a  + 18 numkeys))).
bbb0: 09 09 09 09 09 20 20 20 20 20 20 20 28 6c 6f 67  .....       (log
bbc0: 2d 66 70 61 74 68 20 28 63 6f 6e 63 20 72 75 6e  -fpath (conc run
bbd0: 2d 64 69 72 20 22 2f 22 20 20 66 69 6e 61 6c 2d  -dir "/"  final-
bbe0: 6c 6f 67 29 29 29 20 3b 3b 20 28 73 74 72 69 6e  log))) ;; (strin
bbf0: 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 6b 65  g-intersperse ke
bc00: 79 76 61 6c 73 20 22 2f 22 29 20 22 2f 22 20 74  yvals "/") "/" t
bc10: 65 73 74 6e 61 6d 65 20 22 2f 22 20 69 74 65 6d  estname "/" item
bc20: 2d 70 61 74 68 20 22 2f 22 0a 09 09 09 09 09 20  -path "/"...... 
bc30: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20   (debug:print 4 
bc40: 22 6c 6f 67 3a 20 22 20 6c 6f 67 2d 66 70 61 74  "log: " log-fpat
bc50: 68 20 22 20 65 78 69 73 74 73 3a 20 22 20 28 66  h " exists: " (f
bc60: 69 6c 65 2d 65 78 69 73 74 73 3f 20 6c 6f 67 2d  ile-exists? log-
bc70: 66 70 61 74 68 29 29 0a 09 09 09 09 09 20 20 28  fpath))......  (
bc80: 76 65 63 74 6f 72 2d 73 65 74 21 20 76 62 20 28  vector-set! vb (
bc90: 2b 20 37 20 6e 75 6d 6b 65 79 73 29 20 28 69 66  + 7 numkeys) (if
bca0: 20 28 66 69 6c 65 2d 65 78 69 73 74 73 3f 20 6c   (file-exists? l
bcb0: 6f 67 2d 66 70 61 74 68 29 0a 09 09 09 09 09 09  og-fpath).......
bcc0: 09 09 09 20 20 20 20 28 6c 65 74 20 28 28 6e 65  ...    (let ((ne
bcd0: 77 70 61 74 68 20 28 63 6f 6e 63 20 70 61 74 68  wpath (conc path
bce0: 6d 6f 64 20 22 2f 22 0a 09 09 09 09 09 09 09 09  mod "/".........
bcf0: 09 09 09 09 20 28 73 74 72 69 6e 67 2d 69 6e 74  .... (string-int
bd00: 65 72 73 70 65 72 73 65 20 6b 65 79 76 61 6c 73  ersperse keyvals
bd10: 20 22 2f 22 29 0a 09 09 09 09 09 09 09 09 09 09   "/")...........
bd20: 09 09 20 22 2f 22 20 72 75 6e 6e 61 6d 65 20 22  .. "/" runname "
bd30: 2f 22 20 74 65 73 74 6e 61 6d 65 20 22 2f 22 0a  /" testname "/".
bd40: 09 09 09 09 09 09 09 09 09 09 09 09 20 28 69 66  ............ (if
bd50: 20 28 73 74 72 69 6e 67 3d 3f 20 69 74 65 6d 2d   (string=? item-
bd60: 70 61 74 68 20 22 22 29 20 22 22 20 28 63 6f 6e  path "") "" (con
bd70: 63 20 22 2f 22 20 69 74 65 6d 2d 70 61 74 68 29  c "/" item-path)
bd80: 29 0a 09 09 09 09 09 09 09 09 09 09 09 09 20 66  )............. f
bd90: 69 6e 61 6c 2d 6c 6f 67 29 29 29 0a 09 09 09 09  inal-log))).....
bda0: 09 09 09 09 09 20 20 20 20 20 20 3b 3b 20 66 6f  .....      ;; fo
bdb0: 72 20 6e 6f 77 20 74 68 72 6f 77 20 61 77 61 79  r now throw away
bdc0: 20 6e 65 77 70 61 74 68 20 61 6e 64 20 75 73 65   newpath and use
bdd0: 20 74 68 65 20 6c 6f 67 2d 66 70 61 74 68 20 63   the log-fpath c
bde0: 6f 6e 63 27 64 20 77 69 74 68 20 70 61 74 68 6d  onc'd with pathm
bdf0: 6f 64 0a 09 09 09 09 09 09 09 09 09 20 20 20 20  od..........    
be00: 20 20 28 73 65 74 21 20 6e 65 77 70 61 74 68 20    (set! newpath 
be10: 28 63 6f 6e 63 20 70 61 74 68 6d 6f 64 20 6c 6f  (conc pathmod lo
be20: 67 2d 66 70 61 74 68 29 29 0a 09 09 09 09 09 09  g-fpath)).......
be30: 09 09 09 20 20 20 20 20 20 28 69 66 20 77 69 6e  ...      (if win
be40: 64 6f 77 73 20 28 73 74 72 69 6e 67 2d 74 72 61  dows (string-tra
be50: 6e 73 6c 61 74 65 20 6e 65 77 70 61 74 68 20 22  nslate newpath "
be60: 2f 22 20 22 5c 5c 22 29 20 6e 65 77 70 61 74 68  /" "\\") newpath
be70: 29 29 0a 09 09 09 09 09 09 09 09 09 20 20 20 20  ))..........    
be80: 28 69 66 20 28 3e 20 2a 76 65 72 62 6f 73 69 74  (if (> *verbosit
be90: 79 2a 20 31 29 0a 09 09 09 09 09 09 09 09 09 09  y* 1)...........
bea0: 28 63 6f 6e 63 20 66 69 6e 61 6c 2d 6c 6f 67 20  (conc final-log 
beb0: 22 20 6e 6f 74 2d 66 6f 75 6e 64 22 29 0a 09 09  " not-found")...
bec0: 09 09 09 09 09 09 09 09 22 22 29 29 29 0a 09 09  ........"")))...
bed0: 09 09 09 20 20 28 76 65 63 74 6f 72 2d 3e 6c 69  ...  (vector->li
bee0: 73 74 20 76 62 29 29 0a 09 09 09 09 09 62 29 29  st vb))......b))
bef0: 29 29 29 0a 09 20 20 20 64 62 0a 09 20 20 20 6d  )))..   db..   m
bf00: 61 69 6e 71 72 79 0a 09 20 20 20 72 75 6e 73 70  ainqry..   runsp
bf10: 61 74 74 20 28 6d 61 70 20 63 61 64 72 20 6b 65  att (map cadr ke
bf20: 79 70 61 74 74 2d 61 6c 69 73 74 29 29 0a 20 20  ypatt-alist)).  
bf30: 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 32    (debug:print 2
bf40: 20 22 46 6f 75 6e 64 20 22 20 28 6c 65 6e 67 74   "Found " (lengt
bf50: 68 20 74 65 73 74 2d 69 64 73 29 20 22 20 72 65  h test-ids) " re
bf60: 63 6f 72 64 73 22 29 0a 20 20 20 20 28 73 65 74  cords").    (set
bf70: 21 20 72 65 73 75 6c 74 73 20 28 6c 69 73 74 20  ! results (list 
bf80: 28 63 6f 6e 73 20 22 52 75 6e 73 22 20 72 65 73  (cons "Runs" res
bf90: 75 6c 74 73 29 29 29 0a 20 20 20 20 3b 3b 20 6e  ults))).    ;; n
bfa0: 6f 77 2c 20 66 6f 72 20 65 61 63 68 20 74 65 73  ow, for each tes
bfb0: 74 2c 20 63 6f 6c 6c 65 63 74 20 74 68 65 20 74  t, collect the t
bfc0: 65 73 74 5f 64 61 74 61 20 69 6e 66 6f 20 61 6e  est_data info an
bfd0: 64 20 61 64 64 20 61 20 6e 65 77 20 73 68 65 65  d add a new shee
bfe0: 74 0a 20 20 20 20 28 66 6f 72 2d 65 61 63 68 0a  t.    (for-each.
bff0: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 74 65       (lambda (te
c000: 73 74 2d 69 64 29 0a 20 20 20 20 20 20 20 28 6c  st-id).       (l
c010: 65 74 20 28 28 74 65 73 74 2d 64 61 74 61 20 28  et ((test-data (
c020: 6c 69 73 74 20 74 65 73 74 64 61 74 61 2d 68 65  list testdata-he
c030: 61 64 65 72 29 29 0a 09 20 20 20 20 20 28 63 75  ader))..     (cu
c040: 72 72 2d 74 65 73 74 2d 6e 61 6d 65 20 23 66 29  rr-test-name #f)
c050: 29 0a 09 20 28 73 71 6c 69 74 65 33 3a 66 6f 72  ).. (sqlite3:for
c060: 2d 65 61 63 68 2d 72 6f 77 0a 09 20 20 28 6c 61  -each-row..  (la
c070: 6d 62 64 61 20 28 72 75 6e 2d 69 64 20 74 65 73  mbda (run-id tes
c080: 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 20  tname item-path 
c090: 63 61 74 65 67 6f 72 79 20 76 61 72 69 61 62 6c  category variabl
c0a0: 65 20 76 61 6c 75 65 20 65 78 70 65 63 74 65 64  e value expected
c0b0: 20 74 6f 6c 20 75 6e 69 74 73 20 73 74 61 74 75   tol units statu
c0c0: 73 20 63 6f 6d 6d 65 6e 74 29 0a 09 20 20 20 20  s comment)..    
c0d0: 28 73 65 74 21 20 63 75 72 72 2d 74 65 73 74 2d  (set! curr-test-
c0e0: 6e 61 6d 65 20 74 65 73 74 6e 61 6d 65 29 0a 09  name testname)..
c0f0: 20 20 20 20 28 73 65 74 21 20 74 65 73 74 2d 64      (set! test-d
c100: 61 74 61 20 28 61 70 70 65 6e 64 20 74 65 73 74  ata (append test
c110: 2d 64 61 74 61 20 28 6c 69 73 74 20 28 6c 69 73  -data (list (lis
c120: 74 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d  t run-id testnam
c130: 65 20 69 74 65 6d 2d 70 61 74 68 20 63 61 74 65  e item-path cate
c140: 67 6f 72 79 20 76 61 72 69 61 62 6c 65 20 76 61  gory variable va
c150: 6c 75 65 20 65 78 70 65 63 74 65 64 20 74 6f 6c  lue expected tol
c160: 20 75 6e 69 74 73 20 73 74 61 74 75 73 20 63 6f   units status co
c170: 6d 6d 65 6e 74 29 29 29 29 29 0a 09 20 20 64 62  mment)))))..  db
c180: 20 0a 09 20 20 3b 3b 20 22 53 45 4c 45 43 54 20   ..  ;; "SELECT 
c190: 72 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d 65 2c  run_id,testname,
c1a0: 69 74 65 6d 5f 70 61 74 68 2c 63 61 74 65 67 6f  item_path,catego
c1b0: 72 79 2c 76 61 72 69 61 62 6c 65 2c 74 64 2e 76  ry,variable,td.v
c1c0: 61 6c 75 65 20 41 53 20 76 61 6c 75 65 2c 65 78  alue AS value,ex
c1d0: 70 65 63 74 65 64 2c 74 6f 6c 2c 75 6e 69 74 73  pected,tol,units
c1e0: 2c 74 64 2e 73 74 61 74 75 73 20 41 53 20 73 74  ,td.status AS st
c1f0: 61 74 75 73 2c 74 64 2e 63 6f 6d 6d 65 6e 74 20  atus,td.comment 
c200: 41 53 20 63 6f 6d 6d 65 6e 74 20 46 52 4f 4d 20  AS comment FROM 
c210: 74 65 73 74 5f 64 61 74 61 20 41 53 20 74 64 20  test_data AS td 
c220: 49 4e 4e 45 52 20 4a 4f 49 4e 20 74 65 73 74 73  INNER JOIN tests
c230: 20 4f 4e 20 74 65 73 74 73 2e 69 64 3d 74 64 2e   ON tests.id=td.
c240: 74 65 73 74 5f 69 64 20 57 48 45 52 45 20 74 65  test_id WHERE te
c250: 73 74 5f 69 64 3d 3f 3b 22 0a 09 20 20 22 53 45  st_id=?;"..  "SE
c260: 4c 45 43 54 20 72 75 6e 5f 69 64 2c 74 65 73 74  LECT run_id,test
c270: 6e 61 6d 65 2c 69 74 65 6d 5f 70 61 74 68 2c 63  name,item_path,c
c280: 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62 6c 65  ategory,variable
c290: 2c 74 64 2e 76 61 6c 75 65 20 41 53 20 76 61 6c  ,td.value AS val
c2a0: 75 65 2c 74 64 2e 65 78 70 65 63 74 65 64 2c 74  ue,td.expected,t
c2b0: 64 2e 74 6f 6c 2c 74 64 2e 75 6e 69 74 73 2c 74  d.tol,td.units,t
c2c0: 64 2e 73 74 61 74 75 73 20 41 53 20 73 74 61 74  d.status AS stat
c2d0: 75 73 2c 74 64 2e 63 6f 6d 6d 65 6e 74 20 41 53  us,td.comment AS
c2e0: 20 63 6f 6d 6d 65 6e 74 20 46 52 4f 4d 20 74 65   comment FROM te
c2f0: 73 74 5f 64 61 74 61 20 41 53 20 74 64 20 49 4e  st_data AS td IN
c300: 4e 45 52 20 4a 4f 49 4e 20 74 65 73 74 73 20 4f  NER JOIN tests O
c310: 4e 20 74 65 73 74 73 2e 69 64 3d 74 64 2e 74 65  N tests.id=td.te
c320: 73 74 5f 69 64 20 57 48 45 52 45 20 74 65 73 74  st_id WHERE test
c330: 6e 61 6d 65 3d 3f 3b 22 0a 09 20 20 74 65 73 74  name=?;"..  test
c340: 2d 69 64 29 0a 09 20 28 69 66 20 63 75 72 72 2d  -id).. (if curr-
c350: 74 65 73 74 2d 6e 61 6d 65 0a 09 20 20 20 20 20  test-name..     
c360: 28 73 65 74 21 20 72 65 73 75 6c 74 73 20 28 61  (set! results (a
c370: 70 70 65 6e 64 20 72 65 73 75 6c 74 73 20 28 6c  ppend results (l
c380: 69 73 74 20 28 63 6f 6e 73 20 63 75 72 72 2d 74  ist (cons curr-t
c390: 65 73 74 2d 6e 61 6d 65 20 74 65 73 74 2d 64 61  est-name test-da
c3a0: 74 61 29 29 29 29 29 0a 09 20 29 29 0a 20 20 20  ta))))).. )).   
c3b0: 20 20 28 73 6f 72 74 20 28 64 65 6c 65 74 65 2d    (sort (delete-
c3c0: 64 75 70 6c 69 63 61 74 65 73 20 74 65 73 74 2d  duplicates test-
c3d0: 69 64 73 29 20 73 74 72 69 6e 67 3c 3d 29 29 0a  ids) string<=)).
c3e0: 20 20 20 20 28 73 79 73 74 65 6d 20 28 63 6f 6e      (system (con
c3f0: 63 20 22 6d 6b 64 69 72 20 2d 70 20 22 20 74 65  c "mkdir -p " te
c400: 6d 70 64 69 72 29 29 0a 20 20 20 20 3b 3b 20 28  mpdir)).    ;; (
c410: 70 70 20 72 65 73 75 6c 74 73 29 0a 20 20 20 20  pp results).    
c420: 28 6f 64 73 3a 6c 69 73 74 2d 3e 6f 64 73 20 0a  (ods:list->ods .
c430: 20 20 20 20 20 74 65 6d 70 64 69 72 0a 20 20 20       tempdir.   
c440: 20 20 28 69 66 20 28 73 74 72 69 6e 67 2d 6d 61    (if (string-ma
c450: 74 63 68 20 28 72 65 67 65 78 70 20 22 5e 5b 2f  tch (regexp "^[/
c460: 7e 5d 2b 2e 2a 22 29 20 6f 75 74 70 75 74 66 69  ~]+.*") outputfi
c470: 6c 65 29 20 3b 3b 20 66 75 6c 6c 20 70 61 74 68  le) ;; full path
c480: 3f 0a 09 20 6f 75 74 70 75 74 66 69 6c 65 0a 09  ?.. outputfile..
c490: 20 28 62 65 67 69 6e 0a 09 20 20 20 28 64 65 62   (begin..   (deb
c4a0: 75 67 3a 70 72 69 6e 74 20 30 20 22 57 41 52 4e  ug:print 0 "WARN
c4b0: 49 4e 47 3a 20 70 61 74 68 20 67 69 76 65 6e 2c  ING: path given,
c4c0: 20 22 20 6f 75 74 70 75 74 66 69 6c 65 20 22 20   " outputfile " 
c4d0: 69 73 20 72 65 6c 61 74 69 76 65 2c 20 70 72 65  is relative, pre
c4e0: 66 69 78 69 6e 67 20 77 69 74 68 20 63 75 72 72  fixing with curr
c4f0: 65 6e 74 20 64 69 72 65 63 74 6f 72 79 22 29 0a  ent directory").
c500: 09 20 20 20 28 63 6f 6e 63 20 28 63 75 72 72 65  .   (conc (curre
c510: 6e 74 2d 64 69 72 65 63 74 6f 72 79 29 20 22 2f  nt-directory) "/
c520: 22 20 6f 75 74 70 75 74 66 69 6c 65 29 29 29 0a  " outputfile))).
c530: 20 20 20 20 20 72 65 73 75 6c 74 73 29 0a 20 20       results).  
c540: 20 20 3b 3b 20 62 72 75 74 61 6c 20 63 6c 65 61    ;; brutal clea
c550: 6e 20 75 70 0a 20 20 20 20 28 73 79 73 74 65 6d  n up.    (system
c560: 20 22 72 6d 20 2d 72 66 20 74 65 6d 70 64 69 72   "rm -rf tempdir
c570: 22 29 29 29 0a 0a 3b 3b 20 28 64 62 3a 65 78 74  ")))..;; (db:ext
c580: 72 61 63 74 2d 6f 64 73 2d 66 69 6c 65 20 64 62  ract-ods-file db
c590: 20 22 6f 75 74 70 75 74 66 69 6c 65 2e 6f 64 73   "outputfile.ods
c5a0: 22 20 27 28 28 22 73 79 73 6e 61 6d 65 22 20 22  " '(("sysname" "
c5b0: 25 22 29 28 22 66 73 6e 61 6d 65 22 20 22 25 22  %")("fsname" "%"
c5c0: 29 28 22 64 61 74 61 70 61 74 68 22 20 22 25 22  )("datapath" "%"
c5d0: 29 29 20 22 25 22 29 0a 0a 0a 3b 3b 3d 3d 3d 3d  )) "%")...;;====
c5e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
c5f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
c600: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
c610: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
c620: 3d 3d 0a 3b 3b 20 52 45 4d 4f 54 45 20 44 42 20  ==.;; REMOTE DB 
c630: 41 43 43 45 53 53 20 56 49 41 20 52 50 43 0a 3b  ACCESS VIA RPC.;
c640: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;===============
c650: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
c660: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
c670: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
c680: 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65 66 69 6e 65  =======..(define
c690: 20 28 72 64 62 3a 73 65 74 2d 74 65 73 74 73 2d   (rdb:set-tests-
c6a0: 73 74 61 74 65 2d 73 74 61 74 75 73 20 64 62 20  state-status db 
c6b0: 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 73  run-id testnames
c6c0: 20 63 75 72 72 73 74 61 74 65 20 63 75 72 72 73   currstate currs
c6d0: 74 61 74 75 73 20 6e 65 77 73 74 61 74 65 20 6e  tatus newstate n
c6e0: 65 77 73 74 61 74 75 73 29 0a 20 20 28 69 66 20  ewstatus).  (if 
c6f0: 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20  *runremote*.    
c700: 20 20 28 6c 65 74 20 28 28 68 6f 73 74 20 28 76    (let ((host (v
c710: 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65  ector-ref *runre
c720: 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20 20 20 28  mote* 0))..    (
c730: 70 6f 72 74 20 28 76 65 63 74 6f 72 2d 72 65 66  port (vector-ref
c740: 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29   *runremote* 1))
c750: 29 0a 09 28 28 72 70 63 3a 70 72 6f 63 65 64 75  )..((rpc:procedu
c760: 72 65 20 27 72 64 62 3a 73 65 74 2d 74 65 73 74  re 'rdb:set-test
c770: 73 2d 73 74 61 74 65 2d 73 74 61 74 75 73 20 68  s-state-status h
c780: 6f 73 74 20 70 6f 72 74 29 0a 09 20 72 75 6e 2d  ost port).. run-
c790: 69 64 20 74 65 73 74 6e 61 6d 65 73 20 63 75 72  id testnames cur
c7a0: 72 73 74 61 74 65 20 63 75 72 72 73 74 61 74 75  rstate currstatu
c7b0: 73 20 6e 65 77 73 74 61 74 65 20 6e 65 77 73 74  s newstate newst
c7c0: 61 74 75 73 29 29 0a 20 20 20 20 20 20 28 64 62  atus)).      (db
c7d0: 3a 73 65 74 2d 74 65 73 74 73 2d 73 74 61 74 65  :set-tests-state
c7e0: 2d 73 74 61 74 75 73 20 64 62 20 72 75 6e 2d 69  -status db run-i
c7f0: 64 20 74 65 73 74 6e 61 6d 65 73 20 63 75 72 72  d testnames curr
c800: 73 74 61 74 65 20 63 75 72 72 73 74 61 74 75 73  state currstatus
c810: 20 6e 65 77 73 74 61 74 65 20 6e 65 77 73 74 61   newstate newsta
c820: 74 75 73 29 29 29 0a 0a 28 64 65 66 69 6e 65 20  tus)))..(define 
c830: 28 72 64 62 3a 74 65 73 74 73 74 65 70 2d 73 65  (rdb:teststep-se
c840: 74 2d 73 74 61 74 75 73 21 20 64 62 20 74 65 73  t-status! db tes
c850: 74 2d 69 64 20 74 65 73 74 73 74 65 70 2d 6e 61  t-id teststep-na
c860: 6d 65 20 73 74 61 74 65 2d 69 6e 20 73 74 61 74  me state-in stat
c870: 75 73 2d 69 6e 20 69 74 65 6d 64 61 74 20 63 6f  us-in itemdat co
c880: 6d 6d 65 6e 74 20 6c 6f 67 66 69 6c 65 29 0a 20  mment logfile). 
c890: 20 28 6c 65 74 20 28 28 69 74 65 6d 2d 70 61 74   (let ((item-pat
c8a0: 68 20 28 69 74 65 6d 2d 6c 69 73 74 2d 3e 70 61  h (item-list->pa
c8b0: 74 68 20 69 74 65 6d 64 61 74 29 29 29 0a 20 20  th itemdat))).  
c8c0: 20 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65    (if *runremote
c8d0: 2a 0a 09 28 6c 65 74 20 28 28 68 6f 73 74 20 28  *..(let ((host (
c8e0: 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72  vector-ref *runr
c8f0: 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20 20 20  emote* 0))..    
c900: 20 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72 2d    (port (vector-
c910: 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20  ref *runremote* 
c920: 31 29 29 29 0a 09 20 20 28 28 72 70 63 3a 70 72  1)))..  ((rpc:pr
c930: 6f 63 65 64 75 72 65 20 27 72 64 62 3a 74 65 73  ocedure 'rdb:tes
c940: 74 73 74 65 70 2d 73 65 74 2d 73 74 61 74 75 73  tstep-set-status
c950: 21 20 68 6f 73 74 20 70 6f 72 74 29 0a 09 20 20  ! host port)..  
c960: 20 74 65 73 74 2d 69 64 20 74 65 73 74 73 74 65   test-id testste
c970: 70 2d 6e 61 6d 65 20 73 74 61 74 65 2d 69 6e 20  p-name state-in 
c980: 73 74 61 74 75 73 2d 69 6e 20 69 74 65 6d 2d 70  status-in item-p
c990: 61 74 68 20 63 6f 6d 6d 65 6e 74 20 6c 6f 67 66  ath comment logf
c9a0: 69 6c 65 29 29 0a 09 28 64 62 3a 74 65 73 74 73  ile))..(db:tests
c9b0: 74 65 70 2d 73 65 74 2d 73 74 61 74 75 73 21 20  tep-set-status! 
c9c0: 64 62 20 74 65 73 74 2d 69 64 20 74 65 73 74 73  db test-id tests
c9d0: 74 65 70 2d 6e 61 6d 65 20 73 74 61 74 65 2d 69  tep-name state-i
c9e0: 6e 20 73 74 61 74 75 73 2d 69 6e 20 69 74 65 6d  n status-in item
c9f0: 2d 70 61 74 68 20 63 6f 6d 6d 65 6e 74 20 6c 6f  -path comment lo
ca00: 67 66 69 6c 65 29 29 29 29 0a 0a 28 64 65 66 69  gfile))))..(defi
ca10: 6e 65 20 28 72 64 62 3a 74 65 73 74 2d 75 70 64  ne (rdb:test-upd
ca20: 61 74 65 2d 6d 65 74 61 2d 69 6e 66 6f 20 64 62  ate-meta-info db
ca30: 20 74 65 73 74 2d 69 64 20 6d 69 6e 75 74 65 73   test-id minutes
ca40: 20 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65   cpuload diskfre
ca50: 65 20 74 6d 70 66 72 65 65 29 0a 20 20 28 69 66  e tmpfree).  (if
ca60: 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20   *runremote*.   
ca70: 20 20 20 28 6c 65 74 20 28 28 68 6f 73 74 20 28     (let ((host (
ca80: 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72  vector-ref *runr
ca90: 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20 20 20  emote* 0))..    
caa0: 28 70 6f 72 74 20 28 76 65 63 74 6f 72 2d 72 65  (port (vector-re
cab0: 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29  f *runremote* 1)
cac0: 29 29 0a 09 28 28 72 70 63 3a 70 72 6f 63 65 64  ))..((rpc:proced
cad0: 75 72 65 20 27 72 64 62 3a 74 65 73 74 2d 75 70  ure 'rdb:test-up
cae0: 64 61 74 65 2d 6d 65 74 61 2d 69 6e 66 6f 20 68  date-meta-info h
caf0: 6f 73 74 20 70 6f 72 74 29 0a 09 20 74 65 73 74  ost port).. test
cb00: 2d 69 64 20 6d 69 6e 75 74 65 73 20 63 70 75 6c  -id minutes cpul
cb10: 6f 61 64 20 64 69 73 6b 66 72 65 65 20 74 6d 70  oad diskfree tmp
cb20: 66 72 65 65 29 29 0a 20 20 20 20 20 20 28 64 62  free)).      (db
cb30: 3a 74 65 73 74 2d 75 70 64 61 74 65 2d 6d 65 74  :test-update-met
cb40: 61 2d 69 6e 66 6f 20 64 62 20 74 65 73 74 2d 69  a-info db test-i
cb50: 64 20 6d 69 6e 75 74 65 73 20 63 70 75 6c 6f 61  d minutes cpuloa
cb60: 64 20 64 69 73 6b 66 72 65 65 20 74 6d 70 66 72  d diskfree tmpfr
cb70: 65 65 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  ee)))..(define (
cb80: 72 64 62 3a 74 65 73 74 2d 73 65 74 2d 73 74 61  rdb:test-set-sta
cb90: 74 65 2d 73 74 61 74 75 73 2d 62 79 2d 72 75 6e  te-status-by-run
cba0: 2d 69 64 2d 74 65 73 74 6e 61 6d 65 20 64 62 20  -id-testname db 
cbb0: 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65  run-id test-name
cbc0: 20 69 74 65 6d 2d 70 61 74 68 20 73 74 61 74 75   item-path statu
cbd0: 73 20 73 74 61 74 65 29 0a 20 20 28 69 66 20 2a  s state).  (if *
cbe0: 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20  runremote*.     
cbf0: 20 28 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65   (let ((host (ve
cc00: 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d  ctor-ref *runrem
cc10: 6f 74 65 2a 20 30 29 29 0a 09 20 20 20 20 28 70  ote* 0))..    (p
cc20: 6f 72 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20  ort (vector-ref 
cc30: 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29  *runremote* 1)))
cc40: 0a 09 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72  ..((rpc:procedur
cc50: 65 20 27 72 64 62 3a 74 65 73 74 2d 73 65 74 2d  e 'rdb:test-set-
cc60: 73 74 61 74 65 2d 73 74 61 74 75 73 2d 62 79 2d  state-status-by-
cc70: 72 75 6e 2d 69 64 2d 74 65 73 74 6e 61 6d 65 20  run-id-testname 
cc80: 68 6f 73 74 20 70 6f 72 74 29 0a 09 20 20 72 75  host port)..  ru
cc90: 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69  n-id test-name i
cca0: 74 65 6d 2d 70 61 74 68 20 73 74 61 74 75 73 20  tem-path status 
ccb0: 73 74 61 74 65 29 29 0a 20 20 20 20 20 20 28 64  state)).      (d
ccc0: 62 3a 74 65 73 74 2d 73 65 74 2d 73 74 61 74 65  b:test-set-state
ccd0: 2d 73 74 61 74 75 73 2d 62 79 2d 72 75 6e 2d 69  -status-by-run-i
cce0: 64 2d 74 65 73 74 6e 61 6d 65 20 64 62 20 72 75  d-testname db ru
ccf0: 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69  n-id test-name i
cd00: 74 65 6d 2d 70 61 74 68 20 73 74 61 74 75 73 20  tem-path status 
cd10: 73 74 61 74 65 29 29 29 0a 0a 28 64 65 66 69 6e  state)))..(defin
cd20: 65 20 28 72 64 62 3a 63 73 76 2d 3e 74 65 73 74  e (rdb:csv->test
cd30: 2d 64 61 74 61 20 64 62 20 74 65 73 74 2d 69 64  -data db test-id
cd40: 20 63 73 76 64 61 74 61 29 0a 20 20 28 69 66 20   csvdata).  (if 
cd50: 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20  *runremote*.    
cd60: 20 20 28 6c 65 74 20 28 28 68 6f 73 74 20 28 76    (let ((host (v
cd70: 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65  ector-ref *runre
cd80: 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20 20 20 28  mote* 0))..    (
cd90: 70 6f 72 74 20 28 76 65 63 74 6f 72 2d 72 65 66  port (vector-ref
cda0: 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29   *runremote* 1))
cdb0: 29 0a 09 28 28 72 70 63 3a 70 72 6f 63 65 64 75  )..((rpc:procedu
cdc0: 72 65 20 27 72 64 62 3a 63 73 76 2d 3e 74 65 73  re 'rdb:csv->tes
cdd0: 74 2d 64 61 74 61 20 68 6f 73 74 20 70 6f 72 74  t-data host port
cde0: 29 0a 09 20 74 65 73 74 2d 69 64 20 63 73 76 64  ).. test-id csvd
cdf0: 61 74 61 29 29 0a 20 20 20 20 20 20 28 64 62 3a  ata)).      (db:
ce00: 63 73 76 2d 3e 74 65 73 74 2d 64 61 74 61 20 64  csv->test-data d
ce10: 62 20 74 65 73 74 2d 69 64 20 63 73 76 64 61 74  b test-id csvdat
ce20: 61 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 72  a)))..(define (r
ce30: 64 62 3a 72 6f 6c 6c 2d 75 70 2d 70 61 73 73 2d  db:roll-up-pass-
ce40: 66 61 69 6c 2d 63 6f 75 6e 74 73 20 64 62 20 72  fail-counts db r
ce50: 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20  un-id test-name 
ce60: 69 74 65 6d 2d 70 61 74 68 20 73 74 61 74 75 73  item-path status
ce70: 29 0a 20 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f  ).  (if *runremo
ce80: 74 65 2a 0a 20 20 20 20 20 20 28 6c 65 74 20 28  te*.      (let (
ce90: 28 68 6f 73 74 20 28 76 65 63 74 6f 72 2d 72 65  (host (vector-re
cea0: 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29  f *runremote* 0)
ceb0: 29 0a 09 20 20 20 20 28 70 6f 72 74 20 28 76 65  )..    (port (ve
cec0: 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d  ctor-ref *runrem
ced0: 6f 74 65 2a 20 31 29 29 29 0a 09 28 28 72 70 63  ote* 1)))..((rpc
cee0: 3a 70 72 6f 63 65 64 75 72 65 20 27 72 64 62 3a  :procedure 'rdb:
cef0: 72 6f 6c 6c 2d 75 70 2d 70 61 73 73 2d 66 61 69  roll-up-pass-fai
cf00: 6c 2d 63 6f 75 6e 74 73 20 68 6f 73 74 20 70 6f  l-counts host po
cf10: 72 74 29 0a 09 20 72 75 6e 2d 69 64 20 74 65 73  rt).. run-id tes
cf20: 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68  t-name item-path
cf30: 20 73 74 61 74 75 73 29 29 0a 20 20 20 20 20 20   status)).      
cf40: 28 64 62 3a 72 6f 6c 6c 2d 75 70 2d 70 61 73 73  (db:roll-up-pass
cf50: 2d 66 61 69 6c 2d 63 6f 75 6e 74 73 20 64 62 20  -fail-counts db 
cf60: 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65  run-id test-name
cf70: 20 69 74 65 6d 2d 70 61 74 68 20 73 74 61 74 75   item-path statu
cf80: 73 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 72  s)))..(define (r
cf90: 64 62 3a 74 65 73 74 2d 73 65 74 2d 63 6f 6d 6d  db:test-set-comm
cfa0: 65 6e 74 20 64 62 20 74 65 73 74 2d 69 64 20 63  ent db test-id c
cfb0: 6f 6d 6d 65 6e 74 29 0a 20 20 28 69 66 20 2a 72  omment).  (if *r
cfc0: 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20  unremote*.      
cfd0: 28 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65 63  (let ((host (vec
cfe0: 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f  tor-ref *runremo
cff0: 74 65 2a 20 30 29 29 0a 09 20 20 20 20 28 70 6f  te* 0))..    (po
d000: 72 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a  rt (vector-ref *
d010: 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a  runremote* 1))).
d020: 09 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65  .((rpc:procedure
d030: 20 27 72 64 62 3a 74 65 73 74 2d 73 65 74 2d 63   'rdb:test-set-c
d040: 6f 6d 6d 65 6e 74 20 68 6f 73 74 20 70 6f 72 74  omment host port
d050: 29 0a 09 20 74 65 73 74 2d 69 64 20 63 6f 6d 6d  ).. test-id comm
d060: 65 6e 74 29 29 0a 20 20 20 20 20 20 28 64 62 3a  ent)).      (db:
d070: 74 65 73 74 2d 73 65 74 2d 63 6f 6d 6d 65 6e 74  test-set-comment
d080: 20 64 62 20 74 65 73 74 2d 69 64 20 63 6f 6d 6d   db test-id comm
d090: 65 6e 74 29 29 29 0a 0a 28 64 65 66 69 6e 65 20  ent)))..(define 
d0a0: 28 72 64 62 3a 74 65 73 74 2d 73 65 74 2d 6c 6f  (rdb:test-set-lo
d0b0: 67 21 20 64 62 20 74 65 73 74 2d 69 64 20 6c 6f  g! db test-id lo
d0c0: 67 66 29 0a 20 20 28 69 66 20 2a 72 75 6e 72 65  gf).  (if *runre
d0d0: 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c 65 74  mote*.      (let
d0e0: 20 28 28 68 6f 73 74 20 28 76 65 63 74 6f 72 2d   ((host (vector-
d0f0: 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20  ref *runremote* 
d100: 30 29 29 0a 09 20 20 20 20 28 70 6f 72 74 20 28  0))..    (port (
d110: 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72  vector-ref *runr
d120: 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28 28 72  emote* 1)))..((r
d130: 70 63 3a 70 72 6f 63 65 64 75 72 65 20 27 72 64  pc:procedure 'rd
d140: 62 3a 74 65 73 74 2d 73 65 74 2d 6c 6f 67 21 20  b:test-set-log! 
d150: 68 6f 73 74 20 70 6f 72 74 29 20 74 65 73 74 2d  host port) test-
d160: 69 64 20 6c 6f 67 66 29 29 0a 20 20 20 20 20 20  id logf)).      
d170: 28 64 62 3a 74 65 73 74 2d 73 65 74 2d 6c 6f 67  (db:test-set-log
d180: 21 20 64 62 20 74 65 73 74 2d 69 64 20 6c 6f 67  ! db test-id log
d190: 66 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 72  f)))..(define (r
d1a0: 64 62 3a 67 65 74 2d 72 75 6e 73 20 64 62 20 72  db:get-runs db r
d1b0: 75 6e 6e 61 6d 65 70 61 74 74 20 6e 75 6d 72 75  unnamepatt numru
d1c0: 6e 73 20 73 74 61 72 74 72 75 6e 6f 66 66 73 65  ns startrunoffse
d1d0: 74 20 6b 65 79 70 61 74 74 73 29 0a 20 20 28 69  t keypatts).  (i
d1e0: 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20  f *runremote*.  
d1f0: 20 20 20 20 28 6c 65 74 20 28 28 68 6f 73 74 20      (let ((host 
d200: 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e  (vector-ref *run
d210: 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20 20  remote* 0))..   
d220: 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72 2d 72   (port (vector-r
d230: 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31  ef *runremote* 1
d240: 29 29 29 0a 09 28 28 72 70 63 3a 70 72 6f 63 65  )))..((rpc:proce
d250: 64 75 72 65 20 27 72 64 62 3a 67 65 74 2d 72 75  dure 'rdb:get-ru
d260: 6e 73 20 68 6f 73 74 20 70 6f 72 74 29 0a 09 20  ns host port).. 
d270: 72 75 6e 6e 61 6d 65 70 61 74 74 20 6e 75 6d 72  runnamepatt numr
d280: 75 6e 73 20 73 74 61 72 74 72 75 6e 6f 66 66 73  uns startrunoffs
d290: 65 74 20 6b 65 79 70 61 74 74 73 29 29 0a 20 20  et keypatts)).  
d2a0: 20 20 20 20 28 64 62 3a 67 65 74 2d 72 75 6e 73      (db:get-runs
d2b0: 20 64 62 20 72 75 6e 6e 61 6d 65 70 61 74 74 20   db runnamepatt 
d2c0: 6e 75 6d 72 75 6e 73 20 73 74 61 72 74 72 75 6e  numruns startrun
d2d0: 6f 66 66 73 65 74 20 6b 65 79 70 61 74 74 73 29  offset keypatts)
d2e0: 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 72 64 62  ))..(define (rdb
d2f0: 3a 67 65 74 2d 74 65 73 74 73 2d 66 6f 72 2d 72  :get-tests-for-r
d300: 75 6e 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73  un db run-id tes
d310: 74 70 61 74 74 20 69 74 65 6d 70 61 74 74 20 73  tpatt itempatt s
d320: 74 61 74 65 73 20 73 74 61 74 75 73 65 73 29 0a  tates statuses).
d330: 20 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65    (if *runremote
d340: 2a 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28 68  *.      (let ((h
d350: 6f 73 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20  ost (vector-ref 
d360: 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a  *runremote* 0)).
d370: 09 20 20 20 20 28 70 6f 72 74 20 28 76 65 63 74  .    (port (vect
d380: 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74  or-ref *runremot
d390: 65 2a 20 31 29 29 29 0a 09 28 28 72 70 63 3a 70  e* 1)))..((rpc:p
d3a0: 72 6f 63 65 64 75 72 65 20 27 72 64 62 3a 67 65  rocedure 'rdb:ge
d3b0: 74 2d 74 65 73 74 73 2d 66 6f 72 2d 72 75 6e 20  t-tests-for-run 
d3c0: 68 6f 73 74 20 70 6f 72 74 29 0a 09 20 20 72 75  host port)..  ru
d3d0: 6e 2d 69 64 20 74 65 73 74 70 61 74 74 20 69 74  n-id testpatt it
d3e0: 65 6d 70 61 74 74 20 73 74 61 74 65 73 20 73 74  empatt states st
d3f0: 61 74 75 73 65 73 29 29 0a 20 20 20 20 20 20 28  atuses)).      (
d400: 64 62 3a 67 65 74 2d 74 65 73 74 73 2d 66 6f 72  db:get-tests-for
d410: 2d 72 75 6e 20 64 62 20 72 75 6e 2d 69 64 20 74  -run db run-id t
d420: 65 73 74 70 61 74 74 20 69 74 65 6d 70 61 74 74  estpatt itempatt
d430: 20 73 74 61 74 65 73 20 73 74 61 74 75 73 65 73   states statuses
d440: 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 72 64  )))..(define (rd
d450: 62 3a 67 65 74 2d 74 65 73 74 2d 64 61 74 61 2d  b:get-test-data-
d460: 62 79 2d 69 64 20 64 62 20 74 65 73 74 2d 69 64  by-id db test-id
d470: 29 0a 20 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f  ).  (if *runremo
d480: 74 65 2a 0a 20 20 20 20 20 20 28 6c 65 74 20 28  te*.      (let (
d490: 28 68 6f 73 74 20 28 76 65 63 74 6f 72 2d 72 65  (host (vector-re
d4a0: 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29  f *runremote* 0)
d4b0: 29 0a 09 20 20 20 20 28 70 6f 72 74 20 28 76 65  )..    (port (ve
d4c0: 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d  ctor-ref *runrem
d4d0: 6f 74 65 2a 20 31 29 29 29 0a 09 28 28 72 70 63  ote* 1)))..((rpc
d4e0: 3a 70 72 6f 63 65 64 75 72 65 20 27 72 70 63 3a  :procedure 'rpc:
d4f0: 67 65 74 2d 74 65 73 74 2d 64 61 74 61 2d 62 79  get-test-data-by
d500: 2d 69 64 20 68 6f 73 74 20 70 6f 72 74 29 0a 09  -id host port)..
d510: 20 74 65 73 74 2d 69 64 29 29 0a 20 20 20 20 20   test-id)).     
d520: 20 28 64 62 3a 67 65 74 2d 74 65 73 74 2d 64 61   (db:get-test-da
d530: 74 61 2d 62 79 2d 69 64 20 64 62 20 74 65 73 74  ta-by-id db test
d540: 2d 69 64 29 29 29 0a 20 20 20 20 20 20 0a 28 64  -id))).      .(d
d550: 65 66 69 6e 65 20 28 72 64 62 3a 67 65 74 2d 6b  efine (rdb:get-k
d560: 65 79 73 20 64 62 29 0a 20 20 28 69 66 20 2a 72  eys db).  (if *r
d570: 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20  unremote*.      
d580: 28 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65 63  (let ((host (vec
d590: 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f  tor-ref *runremo
d5a0: 74 65 2a 20 30 29 29 0a 09 20 20 20 20 28 70 6f  te* 0))..    (po
d5b0: 72 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a  rt (vector-ref *
d5c0: 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a  runremote* 1))).
d5d0: 09 28 69 66 20 2a 64 62 2d 6b 65 79 73 2a 20 2a  .(if *db-keys* *
d5e0: 64 62 2d 6b 65 79 73 2a 20 0a 09 20 20 20 20 28  db-keys* ..    (
d5f0: 6c 65 74 20 28 28 6b 65 79 73 20 28 28 72 70 63  let ((keys ((rpc
d600: 3a 70 72 6f 63 65 64 75 72 65 20 27 72 64 62 3a  :procedure 'rdb:
d610: 67 65 74 2d 6b 65 79 73 20 68 6f 73 74 20 70 6f  get-keys host po
d620: 72 74 29 29 29 29 0a 09 20 20 20 20 20 20 28 73  rt))))..      (s
d630: 65 74 21 20 2a 64 62 2d 6b 65 79 73 2a 20 6b 65  et! *db-keys* ke
d640: 79 73 29 0a 09 20 20 20 20 20 20 6b 65 79 73 29  ys)..      keys)
d650: 29 29 0a 20 20 20 20 20 20 28 64 62 3a 67 65 74  )).      (db:get
d660: 2d 6b 65 79 73 20 64 62 29 29 29 0a 09 20 0a 28  -keys db))).. .(
d670: 64 65 66 69 6e 65 20 28 72 64 62 3a 67 65 74 2d  define (rdb:get-
d680: 6e 75 6d 2d 72 75 6e 73 20 64 62 20 72 75 6e 70  num-runs db runp
d690: 61 74 74 29 0a 20 20 28 69 66 20 2a 72 75 6e 72  att).  (if *runr
d6a0: 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c 65  emote*.      (le
d6b0: 74 20 28 28 68 6f 73 74 20 28 76 65 63 74 6f 72  t ((host (vector
d6c0: 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a  -ref *runremote*
d6d0: 20 30 29 29 0a 09 20 20 20 20 28 70 6f 72 74 20   0))..    (port 
d6e0: 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e  (vector-ref *run
d6f0: 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28 28  remote* 1)))..((
d700: 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20 27 72  rpc:procedure 'r
d710: 64 62 3a 67 65 74 2d 6e 75 6d 2d 72 75 6e 73 20  db:get-num-runs 
d720: 68 6f 73 74 20 70 6f 72 74 29 20 72 75 6e 70 61  host port) runpa
d730: 74 74 29 29 0a 20 20 20 20 20 20 28 64 62 3a 67  tt)).      (db:g
d740: 65 74 2d 6e 75 6d 2d 72 75 6e 73 20 64 62 20 72  et-num-runs db r
d750: 75 6e 70 61 74 74 29 29 29 0a 0a 28 64 65 66 69  unpatt)))..(defi
d760: 6e 65 20 28 72 64 62 3a 74 65 73 74 2d 73 65 74  ne (rdb:test-set
d770: 2d 73 74 61 74 65 2d 73 74 61 74 75 73 2d 62 79  -state-status-by
d780: 2d 69 64 20 64 62 20 74 65 73 74 2d 69 64 20 6e  -id db test-id n
d790: 65 77 73 74 61 74 65 20 6e 65 77 73 74 61 74 75  ewstate newstatu
d7a0: 73 20 6e 65 77 63 6f 6d 6d 65 6e 74 29 0a 20 20  s newcomment).  
d7b0: 20 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65    (if *runremote
d7c0: 2a 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28 68  *.      (let ((h
d7d0: 6f 73 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20  ost (vector-ref 
d7e0: 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a  *runremote* 0)).
d7f0: 09 20 20 20 20 28 70 6f 72 74 20 28 76 65 63 74  .    (port (vect
d800: 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74  or-ref *runremot
d810: 65 2a 20 31 29 29 29 0a 09 28 28 72 70 63 3a 70  e* 1)))..((rpc:p
d820: 72 6f 63 65 64 75 72 65 20 27 72 64 62 3a 74 65  rocedure 'rdb:te
d830: 73 74 2d 73 65 74 2d 73 74 61 74 65 2d 73 74 61  st-set-state-sta
d840: 74 75 73 2d 62 79 2d 69 64 20 68 6f 73 74 20 70  tus-by-id host p
d850: 6f 72 74 29 0a 09 20 74 65 73 74 2d 69 64 20 6e  ort).. test-id n
d860: 65 77 73 74 61 74 65 20 6e 65 77 73 74 61 74 75  ewstate newstatu
d870: 73 20 6e 65 77 63 6f 6d 6d 65 6e 74 29 29 0a 20  s newcomment)). 
d880: 20 20 20 20 20 28 64 62 3a 74 65 73 74 2d 73 65       (db:test-se
d890: 74 2d 73 74 61 74 65 2d 73 74 61 74 75 73 2d 62  t-state-status-b
d8a0: 79 2d 69 64 20 64 62 20 74 65 73 74 2d 69 64 20  y-id db test-id 
d8b0: 6e 65 77 73 74 61 74 65 20 6e 65 77 73 74 61 74  newstate newstat
d8c0: 75 73 20 6e 65 77 63 6f 6d 6d 65 6e 74 29 29 29  us newcomment)))
d8d0: 0a 0a 28 64 65 66 69 6e 65 20 28 72 64 62 3a 67  ..(define (rdb:g
d8e0: 65 74 2d 6b 65 79 2d 76 61 6c 2d 70 61 69 72 73  et-key-val-pairs
d8f0: 20 64 62 20 72 75 6e 2d 69 64 29 0a 20 20 28 69   db run-id).  (i
d900: 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20  f *runremote*.  
d910: 20 20 20 20 28 6c 65 74 20 28 28 68 6f 73 74 20      (let ((host 
d920: 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e  (vector-ref *run
d930: 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20 20  remote* 0))..   
d940: 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72 2d 72   (port (vector-r
d950: 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31  ef *runremote* 1
d960: 29 29 29 0a 09 28 28 72 70 63 3a 70 72 6f 63 65  )))..((rpc:proce
d970: 64 75 72 65 20 27 72 64 62 3a 67 65 74 2d 6b 65  dure 'rdb:get-ke
d980: 79 2d 76 61 6c 2d 70 61 69 72 73 20 68 6f 73 74  y-val-pairs host
d990: 20 70 6f 72 74 29 20 72 75 6e 2d 69 64 29 29 0a   port) run-id)).
d9a0: 20 20 20 20 20 20 28 64 62 3a 67 65 74 2d 6b 65        (db:get-ke
d9b0: 79 2d 76 61 6c 2d 70 61 69 72 73 20 64 62 20 72  y-val-pairs db r
d9c0: 75 6e 2d 69 64 29 29 29 0a 09 20 0a 28 64 65 66  un-id))).. .(def
d9d0: 69 6e 65 20 28 72 64 62 3a 67 65 74 2d 6b 65 79  ine (rdb:get-key
d9e0: 2d 76 61 6c 73 20 64 62 20 72 75 6e 2d 69 64 29  -vals db run-id)
d9f0: 0a 20 20 20 20 28 69 66 20 2a 72 75 6e 72 65 6d  .    (if *runrem
da00: 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c 65 74 20  ote*.      (let 
da10: 28 28 68 6f 73 74 20 28 76 65 63 74 6f 72 2d 72  ((host (vector-r
da20: 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30  ef *runremote* 0
da30: 29 29 0a 09 20 20 20 20 28 70 6f 72 74 20 28 76  ))..    (port (v
da40: 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65  ector-ref *runre
da50: 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28 28 72 70  mote* 1)))..((rp
da60: 63 3a 70 72 6f 63 65 64 75 72 65 20 27 72 64 62  c:procedure 'rdb
da70: 3a 67 65 74 2d 6b 65 79 2d 76 61 6c 73 20 68 6f  :get-key-vals ho
da80: 73 74 20 70 6f 72 74 29 20 72 75 6e 2d 69 64 29  st port) run-id)
da90: 29 0a 20 20 20 20 20 20 28 64 62 3a 67 65 74 2d  ).      (db:get-
daa0: 6b 65 79 2d 76 61 6c 73 20 64 62 20 72 75 6e 2d  key-vals db run-
dab0: 69 64 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  id)))..(define (
dac0: 72 64 62 3a 74 65 73 74 6d 65 74 61 2d 67 65 74  rdb:testmeta-get
dad0: 2d 72 65 63 6f 72 64 20 64 62 20 74 65 73 74 6e  -record db testn
dae0: 61 6d 65 29 0a 20 20 20 28 69 66 20 2a 72 75 6e  ame).   (if *run
daf0: 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c  remote*.      (l
db00: 65 74 20 28 28 68 6f 73 74 20 28 76 65 63 74 6f  et ((host (vecto
db10: 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65  r-ref *runremote
db20: 2a 20 30 29 29 0a 09 20 20 20 20 28 70 6f 72 74  * 0))..    (port
db30: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75   (vector-ref *ru
db40: 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28  nremote* 1)))..(
db50: 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20 27  (rpc:procedure '
db60: 72 64 62 3a 74 65 73 74 6d 65 74 61 2d 67 65 74  rdb:testmeta-get
db70: 2d 72 65 63 6f 72 64 20 68 6f 73 74 20 70 6f 72  -record host por
db80: 74 29 20 74 65 73 74 6e 61 6d 65 29 29 0a 20 20  t) testname)).  
db90: 20 20 20 20 28 64 62 3a 74 65 73 74 6d 65 74 61      (db:testmeta
dba0: 2d 67 65 74 2d 72 65 63 6f 72 64 20 64 62 20 74  -get-record db t
dbb0: 65 73 74 6e 61 6d 65 29 29 29 0a 0a 28 64 65 66  estname)))..(def
dbc0: 69 6e 65 20 28 72 64 62 3a 67 65 74 2d 74 65 73  ine (rdb:get-tes
dbd0: 74 2d 64 61 74 61 2d 62 79 2d 69 64 20 64 62 20  t-data-by-id db 
dbe0: 74 65 73 74 2d 69 64 29 0a 20 20 28 69 66 20 2a  test-id).  (if *
dbf0: 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20  runremote*.     
dc00: 20 28 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65   (let ((host (ve
dc10: 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d  ctor-ref *runrem
dc20: 6f 74 65 2a 20 30 29 29 0a 09 20 20 20 20 28 70  ote* 0))..    (p
dc30: 6f 72 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20  ort (vector-ref 
dc40: 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29  *runremote* 1)))
dc50: 0a 09 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72  ..((rpc:procedur
dc60: 65 20 27 72 64 62 3a 67 65 74 2d 74 65 73 74 2d  e 'rdb:get-test-
dc70: 64 61 74 61 2d 62 79 2d 69 64 20 68 6f 73 74 20  data-by-id host 
dc80: 70 6f 72 74 29 20 74 65 73 74 2d 69 64 29 29 0a  port) test-id)).
dc90: 20 20 20 20 20 20 28 64 62 3a 67 65 74 2d 74 65        (db:get-te
dca0: 73 74 2d 64 61 74 61 2d 62 79 2d 69 64 20 64 62  st-data-by-id db
dcb0: 20 74 65 73 74 2d 69 64 29 29 29 0a 0a 28 64 65   test-id)))..(de
dcc0: 66 69 6e 65 20 28 72 64 62 3a 67 65 74 2d 72 75  fine (rdb:get-ru
dcd0: 6e 2d 69 6e 66 6f 20 64 62 20 72 75 6e 2d 69 64  n-info db run-id
dce0: 29 0a 20 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f  ).  (if *runremo
dcf0: 74 65 2a 0a 20 20 20 20 20 20 28 6c 65 74 20 28  te*.      (let (
dd00: 28 68 6f 73 74 20 28 76 65 63 74 6f 72 2d 72 65  (host (vector-re
dd10: 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29  f *runremote* 0)
dd20: 29 0a 09 20 20 20 20 28 70 6f 72 74 20 28 76 65  )..    (port (ve
dd30: 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d  ctor-ref *runrem
dd40: 6f 74 65 2a 20 31 29 29 29 0a 09 28 28 72 70 63  ote* 1)))..((rpc
dd50: 3a 70 72 6f 63 65 64 75 72 65 20 27 72 64 62 3a  :procedure 'rdb:
dd60: 67 65 74 2d 72 75 6e 2d 69 6e 66 6f 20 68 6f 73  get-run-info hos
dd70: 74 20 70 6f 72 74 29 20 72 75 6e 2d 69 64 29 29  t port) run-id))
dd80: 0a 20 20 20 20 20 20 28 64 62 3a 67 65 74 2d 72  .      (db:get-r
dd90: 75 6e 2d 69 6e 66 6f 20 64 62 20 72 75 6e 2d 69  un-info db run-i
dda0: 64 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 72  d)))..(define (r
ddb0: 64 62 3a 67 65 74 2d 73 74 65 70 73 2d 66 6f 72  db:get-steps-for
ddc0: 2d 74 65 73 74 20 64 62 20 74 65 73 74 2d 69 64  -test db test-id
ddd0: 29 0a 20 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f  ).  (if *runremo
dde0: 74 65 2a 0a 20 20 20 20 20 20 28 6c 65 74 20 28  te*.      (let (
ddf0: 28 68 6f 73 74 20 28 76 65 63 74 6f 72 2d 72 65  (host (vector-re
de00: 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29  f *runremote* 0)
de10: 29 0a 09 20 20 20 20 28 70 6f 72 74 20 28 76 65  )..    (port (ve
de20: 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d  ctor-ref *runrem
de30: 6f 74 65 2a 20 31 29 29 29 0a 09 28 28 72 70 63  ote* 1)))..((rpc
de40: 3a 70 72 6f 63 65 64 75 72 65 20 27 72 64 62 3a  :procedure 'rdb:
de50: 67 65 74 2d 73 74 65 70 73 2d 66 6f 72 2d 74 65  get-steps-for-te
de60: 73 74 20 68 6f 73 74 20 70 6f 72 74 29 20 74 65  st host port) te
de70: 73 74 2d 69 64 29 29 0a 20 20 20 20 20 20 28 64  st-id)).      (d
de80: 62 3a 67 65 74 2d 73 74 65 70 73 2d 66 6f 72 2d  b:get-steps-for-
de90: 74 65 73 74 20 64 62 20 74 65 73 74 2d 69 64 29  test db test-id)
dea0: 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 72 64 62  ))..(define (rdb
deb0: 3a 67 65 74 2d 73 74 65 70 73 2d 74 61 62 6c 65  :get-steps-table
dec0: 20 64 62 20 74 65 73 74 2d 69 64 29 0a 20 20 28   db test-id).  (
ded0: 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20  if *runremote*. 
dee0: 20 20 20 20 20 28 6c 65 74 20 28 28 68 6f 73 74       (let ((host
def0: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75   (vector-ref *ru
df00: 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20  nremote* 0))..  
df10: 20 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72 2d    (port (vector-
df20: 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20  ref *runremote* 
df30: 31 29 29 29 0a 09 28 28 72 70 63 3a 70 72 6f 63  1)))..((rpc:proc
df40: 65 64 75 72 65 20 27 72 64 62 3a 67 65 74 2d 73  edure 'rdb:get-s
df50: 74 65 70 73 2d 74 61 62 6c 65 20 68 6f 73 74 20  teps-table host 
df60: 70 6f 72 74 29 20 74 65 73 74 2d 69 64 29 29 0a  port) test-id)).
df70: 20 20 20 20 20 20 28 64 62 3a 67 65 74 2d 73 74        (db:get-st
df80: 65 70 73 2d 74 61 62 6c 65 20 64 62 20 74 65 73  eps-table db tes
df90: 74 2d 69 64 29 29 29 0a 0a 28 64 65 66 69 6e 65  t-id)))..(define
dfa0: 20 28 72 64 62 3a 72 65 61 64 2d 74 65 73 74 2d   (rdb:read-test-
dfb0: 64 61 74 61 20 64 62 20 74 65 73 74 2d 69 64 20  data db test-id 
dfc0: 63 61 74 65 67 6f 72 79 70 61 74 74 29 0a 20 20  categorypatt).  
dfd0: 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a  (if *runremote*.
dfe0: 20 20 20 20 20 20 28 6c 65 74 20 28 28 68 6f 73        (let ((hos
dff0: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72  t (vector-ref *r
e000: 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20  unremote* 0)).. 
e010: 20 20 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72     (port (vector
e020: 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a  -ref *runremote*
e030: 20 31 29 29 29 0a 09 28 28 72 70 63 3a 70 72 6f   1)))..((rpc:pro
e040: 63 65 64 75 72 65 20 27 72 64 62 3a 72 65 61 64  cedure 'rdb:read
e050: 2d 74 65 73 74 2d 64 61 74 61 20 68 6f 73 74 20  -test-data host 
e060: 70 6f 72 74 29 20 74 65 73 74 2d 69 64 20 63 61  port) test-id ca
e070: 74 65 67 6f 72 79 70 61 74 74 29 29 0a 20 20 20  tegorypatt)).   
e080: 20 20 20 28 64 62 3a 72 65 61 64 2d 74 65 73 74     (db:read-test
e090: 2d 64 61 74 61 20 64 62 20 74 65 73 74 2d 69 64  -data db test-id
e0a0: 20 63 61 74 65 67 6f 72 79 70 61 74 74 29 29 29   categorypatt)))
e0b0: 0a 0a 28 64 65 66 69 6e 65 20 28 72 64 62 3a 67  ..(define (rdb:g
e0c0: 65 74 2d 74 65 73 74 2d 69 6e 66 6f 20 64 62 20  et-test-info db 
e0d0: 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20  run-id testname 
e0e0: 69 74 65 6d 2d 70 61 74 68 29 0a 20 20 28 69 66  item-path).  (if
e0f0: 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20   *runremote*.   
e100: 20 20 20 28 6c 65 74 20 28 28 68 6f 73 74 20 28     (let ((host (
e110: 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72  vector-ref *runr
e120: 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20 20 20  emote* 0))..    
e130: 28 70 6f 72 74 20 28 76 65 63 74 6f 72 2d 72 65  (port (vector-re
e140: 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29  f *runremote* 1)
e150: 29 29 0a 09 28 28 72 70 63 3a 70 72 6f 63 65 64  ))..((rpc:proced
e160: 75 72 65 20 27 72 64 62 3a 67 65 74 2d 74 65 73  ure 'rdb:get-tes
e170: 74 2d 69 6e 66 6f 20 68 6f 73 74 20 70 6f 72 74  t-info host port
e180: 29 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d  ) run-id testnam
e190: 65 20 69 74 65 6d 2d 70 61 74 68 29 29 0a 20 20  e item-path)).  
e1a0: 20 20 20 20 28 64 62 3a 67 65 74 2d 74 65 73 74      (db:get-test
e1b0: 2d 69 6e 66 6f 20 64 62 20 72 75 6e 2d 69 64 20  -info db run-id 
e1c0: 74 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61  testname item-pa
e1d0: 74 68 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  th)))..(define (
e1e0: 72 64 62 3a 64 65 6c 65 74 65 2d 74 65 73 74 2d  rdb:delete-test-
e1f0: 72 65 63 6f 72 64 73 20 64 62 20 74 65 73 74 2d  records db test-
e200: 69 64 29 0a 20 20 28 69 66 20 2a 72 75 6e 72 65  id).  (if *runre
e210: 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c 65 74  mote*.      (let
e220: 20 28 28 68 6f 73 74 20 28 76 65 63 74 6f 72 2d   ((host (vector-
e230: 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20  ref *runremote* 
e240: 30 29 29 0a 09 20 20 20 20 28 70 6f 72 74 20 28  0))..    (port (
e250: 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72  vector-ref *runr
e260: 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28 28 72  emote* 1)))..((r
e270: 70 63 3a 70 72 6f 63 65 64 75 72 65 20 27 72 64  pc:procedure 'rd
e280: 62 3a 64 65 6c 65 74 65 2d 74 65 73 74 2d 72 65  b:delete-test-re
e290: 63 6f 72 64 73 20 68 6f 73 74 20 70 6f 72 74 29  cords host port)
e2a0: 20 74 65 73 74 2d 69 64 29 29 0a 20 20 20 20 20   test-id)).     
e2b0: 20 28 64 62 3a 64 65 6c 65 74 65 2d 74 65 73 74   (db:delete-test
e2c0: 2d 72 65 63 6f 72 64 73 20 64 62 20 74 65 73 74  -records db test
e2d0: 2d 69 64 29 29 29 0a 0a 28 64 65 66 69 6e 65 20  -id)))..(define 
e2e0: 28 72 64 62 3a 74 65 73 74 2d 64 61 74 61 2d 72  (rdb:test-data-r
e2f0: 6f 6c 6c 75 70 20 64 62 20 74 65 73 74 2d 69 64  ollup db test-id
e300: 20 73 74 61 74 75 73 29 0a 20 20 20 20 28 69 66   status).    (if
e310: 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20   *runremote*.   
e320: 20 20 20 28 6c 65 74 20 28 28 68 6f 73 74 20 28     (let ((host (
e330: 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72  vector-ref *runr
e340: 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20 20 20  emote* 0))..    
e350: 28 70 6f 72 74 20 28 76 65 63 74 6f 72 2d 72 65  (port (vector-re
e360: 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29  f *runremote* 1)
e370: 29 29 0a 09 28 28 72 70 63 3a 70 72 6f 63 65 64  ))..((rpc:proced
e380: 75 72 65 20 27 72 64 62 3a 74 65 73 74 2d 64 61  ure 'rdb:test-da
e390: 74 61 2d 72 6f 6c 6c 75 70 20 68 6f 73 74 20 70  ta-rollup host p
e3a0: 6f 72 74 29 20 74 65 73 74 2d 69 64 20 73 74 61  ort) test-id sta
e3b0: 74 75 73 29 29 0a 20 20 20 20 20 20 28 64 62 3a  tus)).      (db:
e3c0: 74 65 73 74 2d 64 61 74 61 2d 72 6f 6c 6c 75 70  test-data-rollup
e3d0: 20 64 62 20 74 65 73 74 2d 69 64 20 73 74 61 74   db test-id stat
e3e0: 75 73 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  us)))..(define (
e3f0: 72 64 62 3a 74 65 73 74 2d 67 65 74 2d 70 61 74  rdb:test-get-pat
e400: 68 73 2d 6d 61 74 63 68 69 6e 67 20 64 62 20 6b  hs-matching db k
e410: 65 79 6e 61 6d 65 73 20 74 61 72 67 65 74 29 0a  eynames target).
e420: 20 20 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74     (if *runremot
e430: 65 2a 0a 20 20 20 20 20 20 20 28 6c 65 74 20 28  e*.       (let (
e440: 28 68 6f 73 74 20 28 76 65 63 74 6f 72 2d 72 65  (host (vector-re
e450: 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29  f *runremote* 0)
e460: 29 0a 09 20 20 20 20 20 28 70 6f 72 74 20 28 76  )..     (port (v
e470: 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65  ector-ref *runre
e480: 6d 6f 74 65 2a 20 31 29 29 29 0a 09 20 28 28 72  mote* 1))).. ((r
e490: 70 63 3a 70 72 6f 63 65 64 75 72 65 20 27 72 64  pc:procedure 'rd
e4a0: 62 3a 74 65 73 74 2d 67 65 74 2d 70 61 74 68 73  b:test-get-paths
e4b0: 2d 6d 61 74 63 68 69 6e 67 20 68 6f 73 74 20 70  -matching host p
e4c0: 6f 72 74 29 20 6b 65 79 6e 61 6d 65 73 20 74 61  ort) keynames ta
e4d0: 72 67 65 74 29 29 0a 20 20 20 20 20 20 20 28 64  rget)).       (d
e4e0: 62 3a 74 65 73 74 2d 67 65 74 2d 70 61 74 68 73  b:test-get-paths
e4f0: 2d 6d 61 74 63 68 69 6e 67 20 64 62 20 6b 65 79  -matching db key
e500: 6e 61 6d 65 73 20 74 61 72 67 65 74 29 29 29 0a  names target))).
e510: 0a 20 0a                                         . .