Megatest

Hex Artifact Content
Login

Artifact 48ed807e565b67b36661ada91de939f0829087f3:


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 29 3b 22 29 0a 20 20 20  testname);").   
1230: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
1240: 65 20 64 62 20 22 43 52 45 41 54 45 20 56 49 45  e db "CREATE VIE
1250: 57 20 72 75 6e 73 5f 74 65 73 74 73 20 41 53 20  W runs_tests AS 
1260: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 72 75  SELECT * FROM ru
1270: 6e 73 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 74 65  ns INNER JOIN te
1280: 73 74 73 20 4f 4e 20 72 75 6e 73 2e 69 64 3d 74  sts ON runs.id=t
1290: 65 73 74 73 2e 72 75 6e 5f 69 64 3b 22 29 0a 20  ests.run_id;"). 
12a0: 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63     (sqlite3:exec
12b0: 75 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54  ute db "CREATE T
12c0: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
12d0: 54 53 20 74 65 73 74 5f 73 74 65 70 73 20 0a 20  TS test_steps . 
12e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 64               (id
1300: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
1310: 20 4b 45 59 2c 0a 20 20 20 20 20 20 20 20 20 20   KEY,.          
1320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1330: 20 20 20 20 20 74 65 73 74 5f 69 64 20 49 4e 54       test_id INT
1340: 45 47 45 52 2c 20 0a 20 20 20 20 20 20 20 20 20  EGER, .         
1350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1360: 20 20 20 20 20 20 73 74 65 70 6e 61 6d 65 20 54        stepname T
1370: 45 58 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20  EXT, .          
1380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1390: 20 20 20 20 20 73 74 61 74 65 20 54 45 58 54 20       state TEXT 
13a0: 44 45 46 41 55 4c 54 20 27 4e 4f 54 5f 53 54 41  DEFAULT 'NOT_STA
13b0: 52 54 45 44 27 2c 20 0a 20 20 20 20 20 20 20 20  RTED', .        
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d0: 20 20 20 20 20 20 20 73 74 61 74 75 73 20 54 45         status TE
13e0: 58 54 20 44 45 46 41 55 4c 54 20 27 6e 2f 61 27  XT DEFAULT 'n/a'
13f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1410: 20 65 76 65 6e 74 5f 74 69 6d 65 20 54 49 4d 45   event_time TIME
1420: 53 54 41 4d 50 2c 0a 20 20 20 20 20 20 20 20 20  STAMP,.         
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1440: 20 20 20 20 20 20 63 6f 6d 6d 65 6e 74 20 54 45        comment TE
1450: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20  XT DEFAULT '',. 
1460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f                lo
1480: 67 66 69 6c 65 20 54 45 58 54 20 44 45 46 41 55  gfile TEXT DEFAU
1490: 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20  LT '',.         
14a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14b0: 20 20 20 20 20 20 43 4f 4e 53 54 52 41 49 4e 54        CONSTRAINT
14c0: 20 74 65 73 74 5f 73 74 65 70 73 5f 63 6f 6e 73   test_steps_cons
14d0: 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28 74  traint UNIQUE (t
14e0: 65 73 74 5f 69 64 2c 73 74 65 70 6e 61 6d 65 2c  est_id,stepname,
14f0: 73 74 61 74 65 29 29 3b 22 29 0a 20 20 20 20 28  state));").    (
1500: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
1510: 64 62 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  db "CREATE TABLE
1520: 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 65   IF NOT EXISTS e
1530: 78 74 72 61 64 61 74 20 28 69 64 20 49 4e 54 45  xtradat (id INTE
1540: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
1550: 20 72 75 6e 5f 69 64 20 49 4e 54 45 47 45 52 2c   run_id INTEGER,
1560: 20 6b 65 79 20 54 45 58 54 2c 20 76 61 6c 20 54   key TEXT, val T
1570: 45 58 54 29 3b 22 29 0a 20 20 20 20 28 73 71 6c  EXT);").    (sql
1580: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
1590: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46  "CREATE TABLE IF
15a0: 20 4e 4f 54 20 45 58 49 53 54 53 20 6d 65 74 61   NOT EXISTS meta
15b0: 64 61 74 20 28 69 64 20 49 4e 54 45 47 45 52 20  dat (id INTEGER 
15c0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 61 72  PRIMARY KEY, var
15d0: 20 54 45 58 54 2c 20 76 61 6c 20 54 45 58 54 2c   TEXT, val TEXT,
15e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1600: 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 6d 65     CONSTRAINT me
1610: 74 61 64 61 74 5f 63 6f 6e 73 74 72 61 69 6e 74  tadat_constraint
1620: 20 55 4e 49 51 55 45 20 28 76 61 72 29 29 3b 22   UNIQUE (var));"
1630: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65  ).    (sqlite3:e
1640: 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 54  xecute db "CREAT
1650: 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
1660: 58 49 53 54 53 20 61 63 63 65 73 73 5f 6c 6f 67  XISTS access_log
1670: 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49   (id INTEGER PRI
1680: 4d 41 52 59 20 4b 45 59 2c 20 75 73 65 72 20 54  MARY KEY, user T
1690: 45 58 54 2c 20 61 63 63 65 73 73 65 64 20 54 49  EXT, accessed TI
16a0: 4d 45 53 54 41 4d 50 2c 20 61 72 67 73 20 54 45  MESTAMP, args TE
16b0: 58 54 29 3b 22 29 0a 20 20 20 20 28 73 71 6c 69  XT);").    (sqli
16c0: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22  te3:execute db "
16d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20  CREATE TABLE IF 
16e0: 4e 4f 54 20 45 58 49 53 54 53 20 74 65 73 74 5f  NOT EXISTS test_
16f0: 6d 65 74 61 20 28 69 64 20 49 4e 54 45 47 45 52  meta (id INTEGER
1700: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20   PRIMARY KEY,.  
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1730: 20 20 20 74 65 73 74 6e 61 6d 65 20 20 20 20 54     testname    T
1740: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a  EXT DEFAULT '',.
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1770: 20 20 20 20 20 61 75 74 68 6f 72 20 20 20 20 20       author     
1780: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27   TEXT DEFAULT ''
1790: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
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 6f 77 6e 65 72 20 20 20 20         owner    
17c0: 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20     TEXT DEFAULT 
17d0: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '',.            
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 64 65 73 63 72 69 70           descrip
1800: 74 69 6f 6e 20 54 45 58 54 20 44 45 46 41 55 4c  tion TEXT DEFAUL
1810: 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20  T '',.          
1820: 20 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 72 65 76 69 65             revie
1840: 77 65 64 20 20 20 20 54 49 4d 45 53 54 41 4d 50  wed    TIMESTAMP
1850: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1870: 20 20 20 20 20 20 20 69 74 65 72 61 74 65 64 20         iterated 
1880: 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20     TEXT DEFAULT 
1890: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '',.            
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b0: 20 20 20 20 20 20 20 20 20 61 76 67 5f 72 75 6e           avg_run
18c0: 74 69 6d 65 20 52 45 41 4c 2c 0a 20 20 20 20 20  time REAL,.     
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f0: 61 76 67 5f 64 69 73 6b 20 20 20 20 52 45 41 4c  avg_disk    REAL
1900: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
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 74 61 67 73 20 20 20 20 20         tags     
1930: 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20     TEXT DEFAULT 
1940: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '',.            
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 6a 6f 62 67 72 6f 75           jobgrou
1970: 70 20 20 20 20 54 45 58 54 20 44 45 46 41 55 4c  p    TEXT DEFAUL
1980: 54 20 27 64 65 66 61 75 6c 74 27 2c 0a 20 20 20  T 'default',.   
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e               CON
19b0: 53 54 52 41 49 4e 54 20 74 65 73 74 5f 6d 65 74  STRAINT test_met
19c0: 61 5f 63 6f 6e 73 74 72 61 69 6e 74 20 55 4e 49  a_constraint UNI
19d0: 51 55 45 20 28 74 65 73 74 6e 61 6d 65 29 29 3b  QUE (testname));
19e0: 22 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a  ").    (sqlite3:
19f0: 65 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41  execute db "CREA
1a00: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  TE TABLE IF NOT 
1a10: 45 58 49 53 54 53 20 74 65 73 74 5f 64 61 74 61  EXISTS test_data
1a20: 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49   (id INTEGER PRI
1a30: 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 20  MARY KEY,.      
1a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a50: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 69            test_i
1a60: 64 20 49 4e 54 45 47 45 52 2c 0a 20 20 20 20 20  d INTEGER,.     
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a80: 20 20 20 20 20 20 20 20 20 20 20 63 61 74 65 67             categ
1a90: 6f 72 79 20 54 45 58 54 20 44 45 46 41 55 4c 54  ory TEXT DEFAULT
1aa0: 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20   '',.           
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac0: 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 54 45       variable TE
1ad0: 58 54 2c 0a 09 20 20 20 20 20 20 20 20 20 20 20  XT,..           
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 76 61 6c               val
1af0: 75 65 20 52 45 41 4c 2c 0a 09 20 20 20 20 20 20  ue REAL,..      
1b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b10: 20 20 65 78 70 65 63 74 65 64 20 52 45 41 4c 2c    expected REAL,
1b20: 0a 09 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
1b30: 20 20 20 20 20 20 20 20 20 20 74 6f 6c 20 52 45            tol RE
1b40: 41 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  AL,.            
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b60: 20 20 20 20 75 6e 69 74 73 20 54 45 58 54 2c 0a      units TEXT,.
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 63 6f 6d 6d 65 6e 74 20 54 45 58 54 20 44 45 46  comment TEXT DEF
1ba0: 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20  AULT '',.       
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc0: 20 20 20 20 20 20 20 20 20 73 74 61 74 75 73 20           status 
1bd0: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 6e 2f  TEXT DEFAULT 'n/
1be0: 61 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  a',.            
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c00: 20 20 20 20 74 79 70 65 20 54 45 58 54 20 44 45      type TEXT DE
1c10: 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20  FAULT '',.      
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c30: 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52 41 49          CONSTRAI
1c40: 4e 54 20 74 65 73 74 5f 64 61 74 61 5f 63 6f 6e  NT test_data_con
1c50: 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28  straint UNIQUE (
1c60: 74 65 73 74 5f 69 64 2c 63 61 74 65 67 6f 72 79  test_id,category
1c70: 2c 76 61 72 69 61 62 6c 65 29 29 3b 22 29 0a 20  ,variable));"). 
1c80: 20 20 20 3b 3b 20 4d 75 73 74 20 64 6f 20 74 68     ;; Must do th
1c90: 69 73 20 2a 61 66 74 65 72 2a 20 72 75 6e 6e 69  is *after* runni
1ca0: 6e 67 20 70 61 74 63 68 20 64 62 20 21 21 20 4e  ng patch db !! N
1cb0: 6f 20 6d 6f 72 65 2e 20 0a 20 20 20 20 28 64 62  o more. .    (db
1cc0: 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47  :set-var db "MEG
1cd0: 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 6d  ATEST_VERSION" m
1ce0: 65 67 61 74 65 73 74 2d 76 65 72 73 69 6f 6e 29  egatest-version)
1cf0: 0a 20 20 20 20 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d  .    ))..;;=====
1d00: 3d 3d 3d 3d 3d 3d 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 0a 3b 3b 20 54 4f 44 4f 3a 0a 3b 3b 20 20 20  =.;; TODO:.;;   
1d50: 70 75 74 20 64 65 6c 74 61 73 20 69 6e 74 6f 20  put deltas into 
1d60: 61 6e 20 61 73 73 6f 63 20 6c 69 73 74 20 77 69  an assoc list wi
1d70: 74 68 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65  th version numbe
1d80: 72 73 0a 3b 3b 20 20 20 61 70 70 6c 79 20 61 6c  rs.;;   apply al
1d90: 6c 20 66 72 6f 6d 20 6c 61 73 74 20 74 6f 20 63  l from last to c
1da0: 75 72 72 65 6e 74 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d  urrent.;;=======
1db0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
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 0a  ===============.
1df0: 28 64 65 66 69 6e 65 20 28 70 61 74 63 68 2d 64  (define (patch-d
1e00: 62 20 64 62 29 0a 20 20 28 68 61 6e 64 6c 65 2d  b db).  (handle-
1e10: 65 78 63 65 70 74 69 6f 6e 73 0a 20 20 20 65 78  exceptions.   ex
1e20: 6e 0a 20 20 20 28 62 65 67 69 6e 0a 20 20 20 20  n.   (begin.    
1e30: 20 28 70 72 69 6e 74 20 22 45 78 63 65 70 74 69   (print "Excepti
1e40: 6f 6e 3a 20 22 20 65 78 6e 29 0a 20 20 20 20 20  on: " exn).     
1e50: 28 70 72 69 6e 74 20 22 45 52 52 4f 52 3a 20 50  (print "ERROR: P
1e60: 6f 73 73 69 62 6c 65 20 6f 75 74 20 6f 66 20 64  ossible out of d
1e70: 61 74 65 20 73 63 68 65 6d 61 2c 20 61 74 74 65  ate schema, atte
1e80: 6d 70 74 69 6e 67 20 74 6f 20 61 64 64 20 74 61  mpting to add ta
1e90: 62 6c 65 20 6d 65 74 61 64 61 74 61 2e 2e 2e 22  ble metadata..."
1ea0: 29 0a 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a  ).     (sqlite3:
1eb0: 65 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41  execute db "CREA
1ec0: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  TE TABLE IF NOT 
1ed0: 45 58 49 53 54 53 20 6d 65 74 61 64 61 74 20 28  EXISTS metadat (
1ee0: 69 64 20 49 4e 54 45 47 45 52 2c 20 76 61 72 20  id INTEGER, var 
1ef0: 54 45 58 54 2c 20 76 61 6c 20 54 45 58 54 2c 0a  TEXT, val TEXT,.
1f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f20: 20 43 4f 4e 53 54 52 41 49 4e 54 20 6d 65 74 61   CONSTRAINT meta
1f30: 64 61 74 5f 63 6f 6e 73 74 72 61 69 6e 74 20 55  dat_constraint U
1f40: 4e 49 51 55 45 20 28 76 61 72 29 29 3b 22 29 0a  NIQUE (var));").
1f50: 20 20 20 20 20 28 69 66 20 28 6e 6f 74 20 28 64       (if (not (d
1f60: 62 3a 67 65 74 2d 76 61 72 20 64 62 20 22 4d 45  b:get-var db "ME
1f70: 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 29  GATEST_VERSION")
1f80: 29 0a 09 20 28 64 62 3a 73 65 74 2d 76 61 72 20  ).. (db:set-var 
1f90: 64 62 20 22 4d 45 47 41 54 45 53 54 5f 56 45 52  db "MEGATEST_VER
1fa0: 53 49 4f 4e 22 20 31 2e 31 37 29 29 29 0a 20 20  SION" 1.17))).  
1fb0: 20 28 6c 65 74 20 28 28 6d 76 65 72 20 28 64 62   (let ((mver (db
1fc0: 3a 67 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47  :get-var db "MEG
1fd0: 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 29 29  ATEST_VERSION"))
1fe0: 0a 09 20 28 74 65 73 74 2d 6d 65 74 61 2d 64 65  .. (test-meta-de
1ff0: 66 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  f "CREATE TABLE 
2000: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 74 65  IF NOT EXISTS te
2010: 73 74 5f 6d 65 74 61 20 28 69 64 20 49 4e 54 45  st_meta (id INTE
2020: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
2030: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2050: 20 20 20 20 20 20 74 65 73 74 6e 61 6d 65 20 20        testname  
2060: 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27    TEXT DEFAULT '
2070: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ',.             
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 61 75 74 68 6f 72 20 20          author  
20a0: 20 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54      TEXT DEFAULT
20b0: 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20   '',.           
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 6f 77 6e 65 72 20            owner 
20e0: 20 20 20 20 20 20 54 45 58 54 20 44 45 46 41 55        TEXT DEFAU
20f0: 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20  LT '',.         
2100: 20 20 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 64 65 73 63              desc
2120: 72 69 70 74 69 6f 6e 20 54 45 58 54 20 44 45 46  ription TEXT DEF
2130: 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20  AULT '',.       
2140: 20 20 20 20 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 72 65                re
2160: 76 69 65 77 65 64 20 20 20 20 54 49 4d 45 53 54  viewed    TIMEST
2170: 41 4d 50 2c 0a 20 20 20 20 20 20 20 20 20 20 20  AMP,.           
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 69 74 65 72 61 74            iterat
21a0: 65 64 20 20 20 20 54 45 58 54 20 44 45 46 41 55  ed    TEXT DEFAU
21b0: 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20  LT '',.         
21c0: 20 20 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 61 76 67 5f              avg_
21e0: 72 75 6e 74 69 6d 65 20 52 45 41 4c 2c 0a 20 20  runtime REAL,.  
21f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2210: 20 20 20 61 76 67 5f 64 69 73 6b 20 20 20 20 52     avg_disk    R
2220: 45 41 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  EAL,.           
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 74 61 67 73 20 20            tags  
2250: 20 20 20 20 20 20 54 45 58 54 20 44 45 46 41 55        TEXT DEFAU
2260: 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20  LT '',.         
2270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2280: 20 20 20 20 20 20 20 43 4f 4e 53 54 52 41 49 4e         CONSTRAIN
2290: 54 20 74 65 73 74 5f 6d 65 74 61 5f 63 6f 6e 73  T test_meta_cons
22a0: 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28 74  traint UNIQUE (t
22b0: 65 73 74 6e 61 6d 65 29 29 3b 22 29 29 0a 20 20  estname));")).  
22c0: 20 20 20 28 70 72 69 6e 74 20 22 43 75 72 72 65     (print "Curre
22d0: 6e 74 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f  nt schema versio
22e0: 6e 3a 20 22 20 6d 76 65 72 20 22 20 63 75 72 72  n: " mver " curr
22f0: 65 6e 74 20 6d 65 67 61 74 65 73 74 20 76 65 72  ent megatest ver
2300: 73 69 6f 6e 3a 20 22 20 6d 65 67 61 74 65 73 74  sion: " megatest
2310: 2d 76 65 72 73 69 6f 6e 29 0a 20 20 20 20 20 28  -version).     (
2320: 63 6f 6e 64 0a 20 20 20 20 20 20 28 28 6e 6f 74  cond.      ((not
2330: 20 6d 76 65 72 29 0a 20 20 20 20 20 20 20 28 70   mver).       (p
2340: 72 69 6e 74 20 22 41 64 64 69 6e 67 20 6d 65 67  rint "Adding meg
2350: 61 74 65 73 74 2d 76 65 72 73 69 6f 6e 20 74 6f  atest-version to
2360: 20 6d 65 74 61 64 61 74 61 22 29 20 3b 3b 20 4e   metadata") ;; N
2370: 65 65 64 20 74 6f 20 72 65 63 72 65 61 74 65 20  eed to recreate 
2380: 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 20 20  the table.      
2390: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
23a0: 65 20 64 62 20 22 44 52 4f 50 20 54 41 42 4c 45  e db "DROP TABLE
23b0: 20 49 46 20 45 58 49 53 54 53 20 6d 65 74 61 64   IF EXISTS metad
23c0: 61 74 3b 22 29 0a 20 20 20 20 20 20 20 28 73 71  at;").       (sq
23d0: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62  lite3:execute db
23e0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49   "CREATE TABLE I
23f0: 46 20 4e 4f 54 20 45 58 49 53 54 53 20 6d 65 74  F NOT EXISTS met
2400: 61 64 61 74 20 28 69 64 20 49 4e 54 45 47 45 52  adat (id INTEGER
2410: 2c 20 76 61 72 20 54 45 58 54 2c 20 76 61 6c 20  , var TEXT, val 
2420: 54 45 58 54 2c 0a 20 20 20 20 20 20 20 20 20 20  TEXT,.          
2430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2440: 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52 41 49          CONSTRAI
2450: 4e 54 20 6d 65 74 61 64 61 74 5f 63 6f 6e 73 74  NT metadat_const
2460: 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28 76 61  raint UNIQUE (va
2470: 72 29 29 3b 22 29 0a 20 20 20 20 20 20 20 28 64  r));").       (d
2480: 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45  b:set-var db "ME
2490: 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20  GATEST_VERSION" 
24a0: 31 2e 31 37 29 0a 20 20 20 20 20 20 20 28 70 61  1.17).       (pa
24b0: 74 63 68 2d 64 62 29 29 0a 20 20 20 20 20 20 28  tch-db)).      (
24c0: 28 3c 20 6d 76 65 72 20 31 2e 32 31 29 0a 20 20  (< mver 1.21).  
24d0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78       (sqlite3:ex
24e0: 65 63 75 74 65 20 64 62 20 22 44 52 4f 50 20 54  ecute db "DROP T
24f0: 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 6d  ABLE IF EXISTS m
2500: 65 74 61 64 61 74 3b 22 29 0a 20 20 20 20 20 20  etadat;").      
2510: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
2520: 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41 42  e db "CREATE TAB
2530: 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53  LE IF NOT EXISTS
2540: 20 6d 65 74 61 64 61 74 20 28 69 64 20 49 4e 54   metadat (id INT
2550: 45 47 45 52 2c 20 76 61 72 20 54 45 58 54 2c 20  EGER, var TEXT, 
2560: 76 61 6c 20 54 45 58 54 2c 0a 20 20 20 20 20 20  val TEXT,.      
2570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2580: 20 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e 53              CONS
2590: 54 52 41 49 4e 54 20 6d 65 74 61 64 61 74 5f 63  TRAINT metadat_c
25a0: 6f 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45  onstraint UNIQUE
25b0: 20 28 76 61 72 29 29 3b 22 29 0a 20 20 20 20 20   (var));").     
25c0: 20 20 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62    (db:set-var db
25d0: 20 22 4d 45 47 41 54 45 53 54 5f 56 45 52 53 49   "MEGATEST_VERSI
25e0: 4f 4e 22 20 31 2e 32 31 29 20 3b 3b 20 73 65 74  ON" 1.21) ;; set
25f0: 20 62 65 66 6f 72 65 2c 20 6a 75 73 74 20 69 6e   before, just in
2600: 20 63 61 73 65 20 74 68 65 20 63 68 61 6e 67 65   case the change
2610: 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 61 70  s are already ap
2620: 70 6c 69 65 64 0a 20 20 20 20 20 20 20 28 73 71  plied.       (sq
2630: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62  lite3:execute db
2640: 20 74 65 73 74 2d 6d 65 74 61 2d 64 65 66 29 0a   test-meta-def).
2650: 09 09 09 09 09 3b 28 66 6f 72 2d 65 61 63 68 20  .....;(for-each 
2660: 0a 09 09 09 09 09 3b 20 28 6c 61 6d 62 64 61 20  ......; (lambda 
2670: 28 73 74 6d 74 29 0a 09 09 09 09 09 3b 20 20 20  (stmt)......;   
2680: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
2690: 20 64 62 20 73 74 6d 74 29 29 0a 09 09 09 09 09   db stmt))......
26a0: 3b 20 28 6c 69 73 74 20 0a 09 09 09 09 09 3b 20  ; (list ......; 
26b0: 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 74 65   "ALTER TABLE te
26c0: 73 74 73 20 41 44 44 20 43 4f 4c 55 4d 4e 20 66  sts ADD COLUMN f
26d0: 69 72 73 74 5f 65 72 72 20 54 45 58 54 3b 22 0a  irst_err TEXT;".
26e0: 09 09 09 09 09 3b 20 20 22 41 4c 54 45 52 20 54  .....;  "ALTER T
26f0: 41 42 4c 45 20 74 65 73 74 73 20 41 44 44 20 43  ABLE tests ADD C
2700: 4f 4c 55 4d 4e 20 66 69 72 73 74 5f 77 61 72 6e  OLUMN first_warn
2710: 20 54 45 58 54 3b 22 0a 09 09 09 09 09 3b 20 20   TEXT;"......;  
2720: 29 29 0a 20 20 20 20 20 20 20 28 70 61 74 63 68  )).       (patch
2730: 2d 64 62 29 29 0a 20 20 20 20 20 20 28 28 3c 20  -db)).      ((< 
2740: 6d 76 65 72 20 31 2e 32 34 29 0a 20 20 20 20 20  mver 1.24).     
2750: 20 20 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62    (db:set-var db
2760: 20 22 4d 45 47 41 54 45 53 54 5f 56 45 52 53 49   "MEGATEST_VERSI
2770: 4f 4e 22 20 31 2e 32 34 29 0a 20 20 20 20 20 20  ON" 1.24).      
2780: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
2790: 65 20 64 62 20 22 44 52 4f 50 20 54 41 42 4c 45  e db "DROP TABLE
27a0: 20 49 46 20 45 58 49 53 54 53 20 74 65 73 74 5f   IF EXISTS test_
27b0: 64 61 74 61 3b 22 29 0a 20 20 20 20 20 20 20 28  data;").       (
27c0: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
27d0: 64 62 20 22 44 52 4f 50 20 54 41 42 4c 45 20 49  db "DROP TABLE I
27e0: 46 20 45 58 49 53 54 53 20 74 65 73 74 5f 6d 65  F EXISTS test_me
27f0: 74 61 3b 22 29 0a 20 20 20 20 20 20 20 28 73 71  ta;").       (sq
2800: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62  lite3:execute db
2810: 20 74 65 73 74 2d 6d 65 74 61 2d 64 65 66 29 0a   test-meta-def).
2820: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a         (sqlite3:
2830: 65 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41  execute db "CREA
2840: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  TE TABLE IF NOT 
2850: 45 58 49 53 54 53 20 74 65 73 74 5f 64 61 74 61  EXISTS test_data
2860: 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49   (id INTEGER PRI
2870: 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 20  MARY KEY,.      
2880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2890: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 69            test_i
28a0: 64 20 49 4e 54 45 47 45 52 2c 0a 20 20 20 20 20  d INTEGER,.     
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c0: 20 20 20 20 20 20 20 20 20 20 20 63 61 74 65 67             categ
28d0: 6f 72 79 20 54 45 58 54 20 44 45 46 41 55 4c 54  ory TEXT DEFAULT
28e0: 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20   '',.           
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2900: 20 20 20 20 20 76 61 72 69 61 62 6c 65 20 54 45       variable TE
2910: 58 54 2c 0a 09 20 20 20 20 20 20 20 20 20 20 20  XT,..           
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 76 61 6c               val
2930: 75 65 20 52 45 41 4c 2c 0a 09 20 20 20 20 20 20  ue REAL,..      
2940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2950: 20 20 65 78 70 65 63 74 65 64 20 52 45 41 4c 2c    expected REAL,
2960: 0a 09 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2970: 20 20 20 20 20 20 20 20 20 20 74 6f 6c 20 52 45            tol RE
2980: 41 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  AL,.            
2990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a0: 20 20 20 20 75 6e 69 74 73 20 54 45 58 54 2c 0a      units TEXT,.
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d0: 63 6f 6d 6d 65 6e 74 20 54 45 58 54 20 44 45 46  comment TEXT DEF
29e0: 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20  AULT '',.       
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a00: 20 20 20 20 20 20 20 20 20 73 74 61 74 75 73 20           status 
2a10: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 6e 2f  TEXT DEFAULT 'n/
2a20: 61 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  a',.            
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a40: 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 65 73    CONSTRAINT tes
2a50: 74 5f 64 61 74 61 20 55 4e 49 51 55 45 20 28 74  t_data UNIQUE (t
2a60: 65 73 74 5f 69 64 2c 63 61 74 65 67 6f 72 79 2c  est_id,category,
2a70: 76 61 72 69 61 62 6c 65 29 29 3b 22 29 0a 20 20  variable));").  
2a80: 20 20 20 20 20 28 70 72 69 6e 74 20 22 57 41 52       (print "WAR
2a90: 4e 49 4e 47 3a 20 54 61 62 6c 65 20 74 65 73 74  NING: Table test
2aa0: 5f 64 61 74 61 20 61 6e 64 20 74 65 73 74 5f 6d  _data and test_m
2ab0: 65 74 61 20 77 65 72 65 20 72 65 63 72 65 61 74  eta were recreat
2ac0: 65 64 2e 20 50 6c 65 61 73 65 20 64 6f 20 6d 65  ed. Please do me
2ad0: 67 61 74 65 73 74 20 2d 75 70 64 61 74 65 2d 6d  gatest -update-m
2ae0: 65 74 61 22 29 0a 20 20 20 20 20 20 20 28 70 61  eta").       (pa
2af0: 74 63 68 2d 64 62 29 29 0a 20 20 20 20 20 20 28  tch-db)).      (
2b00: 28 3c 20 6d 76 65 72 20 31 2e 32 37 29 0a 20 20  (< mver 1.27).  
2b10: 20 20 20 20 20 28 64 62 3a 73 65 74 2d 76 61 72       (db:set-var
2b20: 20 64 62 20 22 4d 45 47 41 54 45 53 54 5f 56 45   db "MEGATEST_VE
2b30: 52 53 49 4f 4e 22 20 31 2e 32 37 29 0a 20 20 20  RSION" 1.27).   
2b40: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65      (sqlite3:exe
2b50: 63 75 74 65 20 64 62 20 22 41 4c 54 45 52 20 54  cute db "ALTER T
2b60: 41 42 4c 45 20 74 65 73 74 5f 64 61 74 61 20 41  ABLE test_data A
2b70: 44 44 20 43 4f 4c 55 4d 4e 20 74 79 70 65 20 54  DD COLUMN type T
2b80: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 3b 22  EXT DEFAULT '';"
2b90: 29 0a 20 20 20 20 20 20 20 28 70 61 74 63 68 2d  ).       (patch-
2ba0: 64 62 29 29 0a 20 20 20 20 20 20 28 28 3c 20 6d  db)).      ((< m
2bb0: 76 65 72 20 31 2e 32 39 29 0a 20 20 20 20 20 20  ver 1.29).      
2bc0: 20 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20   (db:set-var db 
2bd0: 22 4d 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f  "MEGATEST_VERSIO
2be0: 4e 22 20 31 2e 32 39 29 0a 20 20 20 20 20 20 20  N" 1.29).       
2bf0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
2c00: 20 64 62 20 22 41 4c 54 45 52 20 54 41 42 4c 45   db "ALTER TABLE
2c10: 20 74 65 73 74 5f 73 74 65 70 73 20 41 44 44 20   test_steps ADD 
2c20: 43 4f 4c 55 4d 4e 20 6c 6f 67 66 69 6c 65 20 54  COLUMN logfile T
2c30: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 3b 22  EXT DEFAULT '';"
2c40: 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ).       (sqlite
2c50: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 41 4c  3:execute db "AL
2c60: 54 45 52 20 54 41 42 4c 45 20 74 65 73 74 73 20  TER TABLE tests 
2c70: 41 44 44 20 43 4f 4c 55 4d 4e 20 73 68 6f 72 74  ADD COLUMN short
2c80: 64 69 72 20 54 45 58 54 20 44 45 46 41 55 4c 54  dir TEXT DEFAULT
2c90: 20 27 27 3b 22 29 29 0a 20 20 20 20 20 20 28 28   '';")).      ((
2ca0: 3c 20 6d 76 65 72 20 31 2e 33 36 29 0a 20 20 20  < mver 1.36).   
2cb0: 20 20 20 20 28 64 62 3a 73 65 74 2d 76 61 72 20      (db:set-var 
2cc0: 64 62 20 22 4d 45 47 41 54 45 53 54 5f 56 45 52  db "MEGATEST_VER
2cd0: 53 49 4f 4e 22 20 31 2e 33 36 29 0a 20 20 20 20  SION" 1.36).    
2ce0: 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63     (sqlite3:exec
2cf0: 75 74 65 20 64 62 20 22 41 4c 54 45 52 20 54 41  ute db "ALTER TA
2d00: 42 4c 45 20 74 65 73 74 5f 6d 65 74 61 20 41 44  BLE test_meta AD
2d10: 44 20 43 4f 4c 55 4d 4e 20 6a 6f 62 67 72 6f 75  D COLUMN jobgrou
2d20: 70 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27  p TEXT DEFAULT '
2d30: 64 65 66 61 75 6c 74 27 3b 22 29 29 0a 20 20 20  default';")).   
2d40: 20 20 20 28 28 3c 20 6d 76 65 72 20 31 2e 33 37     ((< mver 1.37
2d50: 29 0a 20 20 20 20 20 20 20 28 64 62 3a 73 65 74  ).       (db:set
2d60: 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 53  -var db "MEGATES
2d70: 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e 33 37 29  T_VERSION" 1.37)
2d80: 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  .       (sqlite3
2d90: 3a 65 78 65 63 75 74 65 20 64 62 20 22 41 4c 54  :execute db "ALT
2da0: 45 52 20 54 41 42 4c 45 20 74 65 73 74 73 20 41  ER TABLE tests A
2db0: 44 44 20 43 4f 4c 55 4d 4e 20 61 72 63 68 69 76  DD COLUMN archiv
2dc0: 65 64 20 49 4e 54 45 47 45 52 20 44 45 46 41 55  ed INTEGER DEFAU
2dd0: 4c 54 20 30 3b 22 29 29 20 0a 20 20 20 20 20 20  LT 0;")) .      
2de0: 28 28 3c 20 6d 76 65 72 20 6d 65 67 61 74 65 73  ((< mver megates
2df0: 74 2d 76 65 72 73 69 6f 6e 29 0a 20 20 20 20 20  t-version).     
2e00: 20 20 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62    (db:set-var db
2e10: 20 22 4d 45 47 41 54 45 53 54 5f 56 45 52 53 49   "MEGATEST_VERSI
2e20: 4f 4e 22 20 6d 65 67 61 74 65 73 74 2d 76 65 72  ON" megatest-ver
2e30: 73 69 6f 6e 29 29 29 29 29 29 0a 0a 3b 3b 3d 3d  sion))))))..;;==
2e40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 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 0a 3b 3b 20 6d 65 74 61 20 67 65 74  ====.;; meta get
2e90: 20 61 6e 64 20 73 65 74 20 76 61 72 73 0a 3b 3b   and set vars.;;
2ea0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
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 0a 0a 3b 3b 20 72 65 74 75 72  ======..;; retur
2ef0: 6e 73 20 6e 75 6d 62 65 72 20 69 66 20 73 74 72  ns number if str
2f00: 69 6e 67 2d 3e 6e 75 6d 62 65 72 20 69 73 20 73  ing->number is s
2f10: 75 63 63 65 73 73 66 75 6c 2c 20 73 74 72 69 6e  uccessful, strin
2f20: 67 20 6f 74 68 65 72 77 69 73 65 0a 28 64 65 66  g otherwise.(def
2f30: 69 6e 65 20 28 64 62 3a 67 65 74 2d 76 61 72 20  ine (db:get-var 
2f40: 64 62 20 76 61 72 29 0a 20 20 28 6c 65 74 20 28  db var).  (let (
2f50: 28 72 65 73 20 23 66 29 29 0a 20 20 20 20 28 73  (res #f)).    (s
2f60: 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d  qlite3:for-each-
2f70: 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 64 61  row.     (lambda
2f80: 20 28 76 61 6c 29 0a 20 20 20 20 20 20 20 28 73   (val).       (s
2f90: 65 74 21 20 72 65 73 20 76 61 6c 29 29 0a 20 20  et! res val)).  
2fa0: 20 20 20 64 62 20 22 53 45 4c 45 43 54 20 76 61     db "SELECT va
2fb0: 6c 20 46 52 4f 4d 20 6d 65 74 61 64 61 74 20 57  l FROM metadat W
2fc0: 48 45 52 45 20 76 61 72 3d 3f 3b 22 20 76 61 72  HERE var=?;" var
2fd0: 29 0a 20 20 20 20 28 69 66 20 28 73 74 72 69 6e  ).    (if (strin
2fe0: 67 3f 20 72 65 73 29 0a 09 28 6c 65 74 20 28 28  g? res)..(let ((
2ff0: 76 61 6c 6e 75 6d 20 28 73 74 72 69 6e 67 2d 3e  valnum (string->
3000: 6e 75 6d 62 65 72 20 72 65 73 29 29 29 0a 09 20  number res))).. 
3010: 20 28 69 66 20 76 61 6c 6e 75 6d 20 76 61 6c 6e   (if valnum valn
3020: 75 6d 20 72 65 73 29 29 0a 09 72 65 73 29 29 29  um res))..res)))
3030: 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 73 65  ..(define (db:se
3040: 74 2d 76 61 72 20 64 62 20 76 61 72 20 76 61 6c  t-var db var val
3050: 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65  ).  (sqlite3:exe
3060: 63 75 74 65 20 64 62 20 22 49 4e 53 45 52 54 20  cute db "INSERT 
3070: 4f 52 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20  OR REPLACE INTO 
3080: 6d 65 74 61 64 61 74 20 28 76 61 72 2c 76 61 6c  metadat (var,val
3090: 29 20 56 41 4c 55 45 53 20 28 3f 2c 3f 29 3b 22  ) VALUES (?,?);"
30a0: 20 76 61 72 20 76 61 6c 29 29 0a 0a 3b 3b 20 75   var val))..;; u
30b0: 73 65 20 61 20 67 6c 6f 62 61 6c 20 66 6f 72 20  se a global for 
30c0: 73 6f 6d 65 20 70 72 69 6d 69 74 69 76 65 20 63  some primitive c
30d0: 61 63 68 69 6e 67 2c 20 69 74 20 69 73 20 6a 75  aching, it is ju
30e0: 73 74 20 73 69 6c 6c 79 20 74 6f 20 72 65 2d 72  st silly to re-r
30f0: 65 61 64 20 74 68 65 20 64 62 20 0a 3b 3b 20 6f  ead the db .;; o
3100: 76 65 72 20 61 6e 64 20 6f 76 65 72 20 61 67 61  ver and over aga
3110: 69 6e 20 66 6f 72 20 74 68 65 20 6b 65 79 73 20  in for the keys 
3120: 73 69 6e 63 65 20 74 68 65 79 20 6e 65 76 65 72  since they never
3130: 20 63 68 61 6e 67 65 0a 0a 28 64 65 66 69 6e 65   change..(define
3140: 20 2a 64 62 2d 6b 65 79 73 2a 20 23 66 29 0a 0a   *db-keys* #f)..
3150: 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d  (define (db:get-
3160: 6b 65 79 73 20 64 62 29 0a 20 20 28 69 66 20 2a  keys db).  (if *
3170: 64 62 2d 6b 65 79 73 2a 20 2a 64 62 2d 6b 65 79  db-keys* *db-key
3180: 73 2a 20 0a 20 20 20 20 20 20 28 6c 65 74 20 28  s* .      (let (
3190: 28 72 65 73 20 27 28 29 29 29 0a 09 28 73 71 6c  (res '()))..(sql
31a0: 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f  ite3:for-each-ro
31b0: 77 20 0a 09 20 28 6c 61 6d 62 64 61 20 28 6b 65  w .. (lambda (ke
31c0: 79 20 6b 65 79 74 79 70 65 29 0a 09 20 20 20 28  y keytype)..   (
31d0: 73 65 74 21 20 72 65 73 20 28 63 6f 6e 73 20 28  set! res (cons (
31e0: 76 65 63 74 6f 72 20 6b 65 79 20 6b 65 79 74 79  vector key keyty
31f0: 70 65 29 20 72 65 73 29 29 29 0a 09 20 64 62 0a  pe) res))).. db.
3200: 09 20 22 53 45 4c 45 43 54 20 66 69 65 6c 64 6e  . "SELECT fieldn
3210: 61 6d 65 2c 66 69 65 6c 64 74 79 70 65 20 46 52  ame,fieldtype FR
3220: 4f 4d 20 6b 65 79 73 20 4f 52 44 45 52 20 42 59  OM keys ORDER BY
3230: 20 69 64 20 44 45 53 43 3b 22 29 0a 09 28 73 65   id DESC;")..(se
3240: 74 21 20 2a 64 62 2d 6b 65 79 73 2a 20 72 65 73  t! *db-keys* res
3250: 29 0a 09 72 65 73 29 29 29 0a 0a 28 64 65 66 69  )..res)))..(defi
3260: 6e 65 20 28 64 62 3a 67 65 74 2d 76 61 6c 75 65  ne (db:get-value
3270: 2d 62 79 2d 68 65 61 64 65 72 20 72 6f 77 20 68  -by-header row h
3280: 65 61 64 65 72 20 66 69 65 6c 64 29 0a 20 20 3b  eader field).  ;
3290: 3b 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 32  ; (debug:print 2
32a0: 20 22 64 62 3a 67 65 74 2d 76 61 6c 75 65 2d 62   "db:get-value-b
32b0: 79 2d 68 65 61 64 65 72 20 72 6f 77 3a 20 22 20  y-header row: " 
32c0: 72 6f 77 20 22 20 68 65 61 64 65 72 3a 20 22 20  row " header: " 
32d0: 68 65 61 64 65 72 20 22 20 66 69 65 6c 64 3a 20  header " field: 
32e0: 22 20 66 69 65 6c 64 29 0a 20 20 28 69 66 20 28  " field).  (if (
32f0: 6e 75 6c 6c 3f 20 68 65 61 64 65 72 29 20 23 66  null? header) #f
3300: 0a 20 20 20 20 20 20 28 6c 65 74 20 6c 6f 6f 70  .      (let loop
3310: 20 28 28 68 65 64 20 28 63 61 72 20 68 65 61 64   ((hed (car head
3320: 65 72 29 29 0a 09 09 20 28 74 61 6c 20 28 63 64  er))... (tal (cd
3330: 72 20 68 65 61 64 65 72 29 29 0a 09 09 20 28 6e  r header))... (n
3340: 20 20 20 30 29 29 0a 09 28 69 66 20 28 65 71 75     0))..(if (equ
3350: 61 6c 3f 20 68 65 64 20 66 69 65 6c 64 29 0a 09  al? hed field)..
3360: 20 20 20 20 28 76 65 63 74 6f 72 2d 72 65 66 20      (vector-ref 
3370: 72 6f 77 20 6e 29 0a 09 20 20 20 20 28 69 66 20  row n)..    (if 
3380: 28 6e 75 6c 6c 3f 20 74 61 6c 29 20 23 66 20 28  (null? tal) #f (
3390: 6c 6f 6f 70 20 28 63 61 72 20 74 61 6c 29 28 63  loop (car tal)(c
33a0: 64 72 20 74 61 6c 29 28 2b 20 6e 20 31 29 29 29  dr tal)(+ n 1)))
33b0: 29 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d  ))))..;;========
33c0: 3d 3d 3d 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 0a 3b  ==============.;
3400: 3b 20 20 52 20 55 20 4e 20 53 0a 3b 3b 3d 3d 3d  ;  R U N S.;;===
3410: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
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 0a 0a 28 64 65 66 69 6e 65 20 28 72 75  ===..(define (ru
3460: 6e 73 3a 67 65 74 2d 73 74 64 2d 72 75 6e 2d 66  ns:get-std-run-f
3470: 69 65 6c 64 73 20 6b 65 79 73 20 72 65 6d 66 69  ields keys remfi
3480: 65 6c 64 73 29 0a 20 20 28 6c 65 74 2a 20 28 28  elds).  (let* ((
3490: 68 65 61 64 65 72 20 20 20 20 28 61 70 70 65 6e  header    (appen
34a0: 64 20 28 6d 61 70 20 6b 65 79 3a 67 65 74 2d 66  d (map key:get-f
34b0: 69 65 6c 64 6e 61 6d 65 20 6b 65 79 73 29 0a 09  ieldname keys)..
34c0: 09 09 20 20 20 20 72 65 6d 66 69 65 6c 64 73 29  ..    remfields)
34d0: 29 0a 09 20 28 6b 65 79 73 74 72 20 20 20 20 28  ).. (keystr    (
34e0: 63 6f 6e 63 20 28 6b 65 79 73 2d 3e 6b 65 79 73  conc (keys->keys
34f0: 74 72 20 6b 65 79 73 29 20 22 2c 22 0a 09 09 09  tr keys) ","....
3500: 20 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73    (string-inters
3510: 70 65 72 73 65 20 72 65 6d 66 69 65 6c 64 73 20  perse remfields 
3520: 22 2c 22 29 29 29 29 0a 20 20 20 20 28 6c 69 73  ",")))).    (lis
3530: 74 20 6b 65 79 73 74 72 20 68 65 61 64 65 72 29  t keystr header)
3540: 29 29 0a 0a 3b 3b 20 57 41 53 20 64 62 2d 67 65  ))..;; WAS db-ge
3550: 74 2d 72 75 6e 73 20 46 49 58 4d 45 20 49 4e 20  t-runs FIXME IN 
3560: 52 45 4d 41 49 4e 49 4e 47 20 43 4f 44 45 0a 3b  REMAINING CODE.;
3570: 3b 0a 3b 3b 20 4d 45 52 47 45 20 54 48 49 53 20  ;.;; MERGE THIS 
3580: 57 49 54 48 20 64 62 3a 67 65 74 2d 72 75 6e 73  WITH db:get-runs
3590: 2c 20 61 63 63 69 64 65 6e 74 6c 79 20 77 72 6f  , accidently wro
35a0: 74 65 20 69 74 20 74 77 69 63 65 0a 3b 3b 0a 3b  te it twice.;;.;
35b0: 3b 20 72 65 70 6c 61 63 65 20 68 65 61 64 65 72  ; replace header
35c0: 20 61 6e 64 20 6b 65 79 73 74 72 20 77 69 74 68   and keystr with
35d0: 20 61 20 63 61 6c 6c 20 74 6f 20 72 75 6e 73 3a   a call to runs:
35e0: 67 65 74 2d 73 74 64 2d 72 75 6e 2d 66 69 65 6c  get-std-run-fiel
35f0: 64 73 0a 3b 3b 0a 3b 3b 20 6b 65 79 70 61 74 74  ds.;;.;; keypatt
3600: 73 3a 20 28 20 28 4b 45 59 31 20 22 61 62 63 25  s: ( (KEY1 "abc%
3610: 64 65 66 22 29 28 4b 45 59 32 20 22 25 22 29 20  def")(KEY2 "%") 
3620: 29 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 28 64 62  ).;;.(define (db
3630: 3a 67 65 74 2d 72 75 6e 73 20 64 62 20 72 75 6e  :get-runs db run
3640: 70 61 74 74 20 63 6f 75 6e 74 20 6f 66 66 73 65  patt count offse
3650: 74 20 6b 65 79 70 61 74 74 73 29 0a 20 20 28 6c  t keypatts).  (l
3660: 65 74 2a 20 28 28 72 65 73 20 20 20 20 20 20 27  et* ((res      '
3670: 28 29 29 0a 09 20 28 6b 65 79 73 20 20 20 20 20  ()).. (keys     
3680: 20 28 64 62 3a 67 65 74 2d 6b 65 79 73 20 64 62   (db:get-keys db
3690: 29 29 0a 09 20 28 72 65 6d 66 69 65 6c 64 73 20  )).. (remfields 
36a0: 28 6c 69 73 74 20 22 69 64 22 20 22 72 75 6e 6e  (list "id" "runn
36b0: 61 6d 65 22 20 22 73 74 61 74 65 22 20 22 73 74  ame" "state" "st
36c0: 61 74 75 73 22 20 22 6f 77 6e 65 72 22 20 22 65  atus" "owner" "e
36d0: 76 65 6e 74 5f 74 69 6d 65 22 29 29 0a 09 20 28  vent_time")).. (
36e0: 68 65 61 64 65 72 20 20 20 20 28 61 70 70 65 6e  header    (appen
36f0: 64 20 28 6d 61 70 20 6b 65 79 3a 67 65 74 2d 66  d (map key:get-f
3700: 69 65 6c 64 6e 61 6d 65 20 6b 65 79 73 29 0a 09  ieldname keys)..
3710: 09 09 20 20 20 20 72 65 6d 66 69 65 6c 64 73 29  ..    remfields)
3720: 29 0a 09 20 28 6b 65 79 73 74 72 20 20 20 20 28  ).. (keystr    (
3730: 63 6f 6e 63 20 28 6b 65 79 73 2d 3e 6b 65 79 73  conc (keys->keys
3740: 74 72 20 6b 65 79 73 29 20 22 2c 22 0a 09 09 09  tr keys) ","....
3750: 20 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73    (string-inters
3760: 70 65 72 73 65 20 72 65 6d 66 69 65 6c 64 73 20  perse remfields 
3770: 22 2c 22 29 29 29 0a 09 20 28 71 72 79 73 74 72  ","))).. (qrystr
3780: 20 20 20 20 28 63 6f 6e 63 20 22 53 45 4c 45 43      (conc "SELEC
3790: 54 20 22 20 6b 65 79 73 74 72 20 22 20 46 52 4f  T " keystr " FRO
37a0: 4d 20 72 75 6e 73 20 57 48 45 52 45 20 72 75 6e  M runs WHERE run
37b0: 6e 61 6d 65 20 4c 49 4b 45 20 3f 20 22 0a 09 09  name LIKE ? "...
37c0: 09 20 20 3b 3b 20 47 65 6e 65 72 61 74 65 3a 20  .  ;; Generate: 
37d0: 22 20 41 4e 44 20 78 20 4c 49 4b 45 20 27 6b 65  " AND x LIKE 'ke
37e0: 79 70 61 74 74 27 20 2e 2e 2e 22 0a 09 09 09 20  ypatt' ...".... 
37f0: 20 28 69 66 20 28 6e 75 6c 6c 3f 20 6b 65 79 70   (if (null? keyp
3800: 61 74 74 73 29 20 22 22 0a 09 09 09 20 20 20 20  atts) ""....    
3810: 20 20 28 63 6f 6e 63 20 22 20 41 4e 44 20 22 0a    (conc " AND ".
3820: 09 09 09 09 20 20 20 20 28 73 74 72 69 6e 67 2d  ....    (string-
3830: 6a 6f 69 6e 20 0a 09 09 09 09 20 20 20 20 20 28  join .....     (
3840: 6d 61 70 20 28 6c 61 6d 62 64 61 20 28 6b 65 79  map (lambda (key
3850: 70 61 74 74 29 0a 09 09 09 09 09 20 20 20 20 28  patt)......    (
3860: 6c 65 74 20 28 28 6b 65 79 20 20 28 63 61 72 20  let ((key  (car 
3870: 6b 65 79 70 61 74 74 29 29 0a 09 09 09 09 09 09  keypatt)).......
3880: 20 20 28 70 61 74 74 20 28 63 61 64 72 20 6b 65    (patt (cadr ke
3890: 79 70 61 74 74 29 29 29 0a 09 09 09 09 09 20 20  ypatt)))......  
38a0: 20 20 20 20 28 63 6f 6e 63 20 6b 65 79 20 22 20      (conc key " 
38b0: 4c 49 4b 45 20 27 22 20 70 61 74 74 20 22 27 22  LIKE '" patt "'"
38c0: 29 29 29 0a 09 09 09 09 09 20 20 6b 65 79 70 61  )))......  keypa
38d0: 74 74 73 29 0a 09 09 09 09 20 20 20 20 20 22 20  tts).....     " 
38e0: 41 4e 44 20 22 29 29 29 0a 09 09 09 20 20 22 20  AND ")))....  " 
38f0: 4f 52 44 45 52 20 42 59 20 65 76 65 6e 74 5f 74  ORDER BY event_t
3900: 69 6d 65 20 44 45 53 43 20 22 0a 09 09 09 20 20  ime DESC "....  
3910: 28 69 66 20 28 6e 75 6d 62 65 72 3f 20 63 6f 75  (if (number? cou
3920: 6e 74 29 0a 09 09 09 20 20 20 20 20 20 28 63 6f  nt)....      (co
3930: 6e 63 20 22 20 4c 49 4d 49 54 20 22 20 63 6f 75  nc " LIMIT " cou
3940: 6e 74 29 0a 09 09 09 20 20 20 20 20 20 22 22 29  nt)....      "")
3950: 0a 09 09 09 20 20 28 69 66 20 28 6e 75 6d 62 65  ....  (if (numbe
3960: 72 3f 20 6f 66 66 73 65 74 29 0a 09 09 09 20 20  r? offset)....  
3970: 20 20 20 20 28 63 6f 6e 63 20 22 20 4f 46 46 53      (conc " OFFS
3980: 45 54 20 22 20 6f 66 66 73 65 74 29 0a 09 09 09  ET " offset)....
3990: 20 20 20 20 20 20 22 22 29 29 29 29 0a 20 20 20        "")))).   
39a0: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 38 20   (debug:print 8 
39b0: 22 49 4e 46 4f 3a 20 64 62 3a 67 65 74 2d 72 75  "INFO: db:get-ru
39c0: 6e 73 20 71 72 79 73 74 72 3a 20 22 20 71 72 79  ns qrystr: " qry
39d0: 73 74 72 20 22 5c 6e 6b 65 79 70 61 74 74 73 3a  str "\nkeypatts:
39e0: 20 22 20 6b 65 79 70 61 74 74 73 20 22 5c 6e 20   " keypatts "\n 
39f0: 20 6f 66 66 73 65 74 3a 20 22 20 6f 66 66 73 65   offset: " offse
3a00: 74 20 22 20 6c 69 6d 69 74 3a 20 22 20 63 6f 75  t " limit: " cou
3a10: 6e 74 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33  nt).    (sqlite3
3a20: 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20  :for-each-row.  
3a30: 20 20 20 28 6c 61 6d 62 64 61 20 28 61 20 2e 20     (lambda (a . 
3a40: 78 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20  x).       (set! 
3a50: 72 65 73 20 28 63 6f 6e 73 20 28 61 70 70 6c 79  res (cons (apply
3a60: 20 76 65 63 74 6f 72 20 61 20 78 29 20 72 65 73   vector a x) res
3a70: 29 29 29 0a 20 20 20 20 20 64 62 0a 20 20 20 20  ))).     db.    
3a80: 20 71 72 79 73 74 72 0a 20 20 20 20 20 72 75 6e   qrystr.     run
3a90: 70 61 74 74 29 0a 20 20 20 20 28 76 65 63 74 6f  patt).    (vecto
3aa0: 72 20 68 65 61 64 65 72 20 72 65 73 29 29 29 0a  r header res))).
3ab0: 0a 3b 3b 20 6a 75 73 74 20 67 65 74 20 63 6f 75  .;; just get cou
3ac0: 6e 74 20 6f 66 20 72 75 6e 73 0a 28 64 65 66 69  nt of runs.(defi
3ad0: 6e 65 20 28 64 62 3a 67 65 74 2d 6e 75 6d 2d 72  ne (db:get-num-r
3ae0: 75 6e 73 20 64 62 20 72 75 6e 70 61 74 74 29 0a  uns db runpatt).
3af0: 20 20 28 6c 65 74 20 28 28 6e 75 6d 72 75 6e 73    (let ((numruns
3b00: 20 30 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65   0)).    (sqlite
3b10: 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a  3:for-each-row .
3b20: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 63 6f       (lambda (co
3b30: 75 6e 74 29 0a 20 20 20 20 20 20 20 28 73 65 74  unt).       (set
3b40: 21 20 6e 75 6d 72 75 6e 73 20 63 6f 75 6e 74 29  ! numruns count)
3b50: 29 0a 20 20 20 20 20 64 62 0a 20 20 20 20 20 22  ).     db.     "
3b60: 53 45 4c 45 43 54 20 43 4f 55 4e 54 28 69 64 29  SELECT COUNT(id)
3b70: 20 46 52 4f 4d 20 72 75 6e 73 20 57 48 45 52 45   FROM runs WHERE
3b80: 20 72 75 6e 6e 61 6d 65 20 4c 49 4b 45 20 3f 3b   runname LIKE ?;
3b90: 22 20 72 75 6e 70 61 74 74 29 0a 20 20 20 20 6e  " runpatt).    n
3ba0: 75 6d 72 75 6e 73 29 29 0a 0a 3b 3b 20 75 73 65  umruns))..;; use
3bb0: 20 28 67 65 74 2d 76 61 6c 75 65 2d 62 79 2d 68   (get-value-by-h
3bc0: 65 61 64 65 72 20 28 64 62 3a 67 65 74 2d 68 65  eader (db:get-he
3bd0: 61 64 65 72 20 72 75 6e 69 6e 66 6f 29 28 64 62  ader runinfo)(db
3be0: 3a 67 65 74 2d 72 6f 77 20 72 75 6e 69 6e 66 6f  :get-row runinfo
3bf0: 29 29 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67  )).(define (db:g
3c00: 65 74 2d 72 75 6e 2d 69 6e 66 6f 20 64 62 20 72  et-run-info db r
3c10: 75 6e 2d 69 64 29 0a 20 20 28 6c 65 74 2a 20 28  un-id).  (let* (
3c20: 28 72 65 73 20 20 20 20 20 20 23 66 29 0a 09 20  (res      #f).. 
3c30: 28 6b 65 79 73 20 20 20 20 20 20 28 64 62 3a 67  (keys      (db:g
3c40: 65 74 2d 6b 65 79 73 20 64 62 29 29 0a 09 20 28  et-keys db)).. (
3c50: 72 65 6d 66 69 65 6c 64 73 20 28 6c 69 73 74 20  remfields (list 
3c60: 22 69 64 22 20 22 72 75 6e 6e 61 6d 65 22 20 22  "id" "runname" "
3c70: 73 74 61 74 65 22 20 22 73 74 61 74 75 73 22 20  state" "status" 
3c80: 22 6f 77 6e 65 72 22 20 22 65 76 65 6e 74 5f 74  "owner" "event_t
3c90: 69 6d 65 22 29 29 0a 09 20 28 68 65 61 64 65 72  ime")).. (header
3ca0: 20 20 20 20 28 61 70 70 65 6e 64 20 28 6d 61 70      (append (map
3cb0: 20 6b 65 79 3a 67 65 74 2d 66 69 65 6c 64 6e 61   key:get-fieldna
3cc0: 6d 65 20 6b 65 79 73 29 0a 09 09 09 20 20 20 20  me keys)....    
3cd0: 72 65 6d 66 69 65 6c 64 73 29 29 0a 09 20 28 6b  remfields)).. (k
3ce0: 65 79 73 74 72 20 20 20 20 28 63 6f 6e 63 20 28  eystr    (conc (
3cf0: 6b 65 79 73 2d 3e 6b 65 79 73 74 72 20 6b 65 79  keys->keystr key
3d00: 73 29 20 22 2c 22 0a 09 09 09 20 20 28 73 74 72  s) ","....  (str
3d10: 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20  ing-intersperse 
3d20: 72 65 6d 66 69 65 6c 64 73 20 22 2c 22 29 29 29  remfields ",")))
3d30: 29 0a 20 20 20 20 3b 3b 20 28 64 65 62 75 67 3a  ).    ;; (debug:
3d40: 70 72 69 6e 74 20 30 20 22 64 62 3a 67 65 74 2d  print 0 "db:get-
3d50: 72 75 6e 2d 69 6e 66 6f 20 72 75 6e 2d 69 64 3a  run-info run-id:
3d60: 20 22 20 72 75 6e 2d 69 64 20 22 20 68 65 61 64   " run-id " head
3d70: 65 72 3a 20 22 20 68 65 61 64 65 72 20 22 20 6b  er: " header " k
3d80: 65 79 73 74 72 3a 20 22 20 6b 65 79 73 74 72 29  eystr: " keystr)
3d90: 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f  .    (sqlite3:fo
3da0: 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 20  r-each-row.     
3db0: 28 6c 61 6d 62 64 61 20 28 61 20 2e 20 78 29 0a  (lambda (a . x).
3dc0: 20 20 20 20 20 20 20 28 73 65 74 21 20 72 65 73         (set! res
3dd0: 20 28 61 70 70 6c 79 20 76 65 63 74 6f 72 20 61   (apply vector a
3de0: 20 78 29 29 29 0a 20 20 20 20 20 64 62 0a 20 20   x))).     db.  
3df0: 20 20 20 28 63 6f 6e 63 20 22 53 45 4c 45 43 54     (conc "SELECT
3e00: 20 22 20 6b 65 79 73 74 72 20 22 20 46 52 4f 4d   " keystr " FROM
3e10: 20 72 75 6e 73 20 57 48 45 52 45 20 69 64 3d 3f   runs WHERE id=?
3e20: 3b 22 29 0a 20 20 20 20 20 72 75 6e 2d 69 64 29  ;").     run-id)
3e30: 0a 20 20 20 20 28 76 65 63 74 6f 72 20 68 65 61  .    (vector hea
3e40: 64 65 72 20 72 65 73 29 29 29 0a 0a 28 64 65 66  der res)))..(def
3e50: 69 6e 65 20 28 64 62 3a 73 65 74 2d 63 6f 6d 6d  ine (db:set-comm
3e60: 65 6e 74 2d 66 6f 72 2d 72 75 6e 20 64 62 20 72  ent-for-run db r
3e70: 75 6e 2d 69 64 20 63 6f 6d 6d 65 6e 74 29 0a 20  un-id comment). 
3e80: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
3e90: 65 20 64 62 20 22 55 50 44 41 54 45 20 72 75 6e  e db "UPDATE run
3ea0: 73 20 53 45 54 20 63 6f 6d 6d 65 6e 74 3d 3f 20  s SET comment=? 
3eb0: 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 63 6f 6d  WHERE id=?;" com
3ec0: 6d 65 6e 74 20 72 75 6e 2d 69 64 29 29 0a 0a 3b  ment run-id))..;
3ed0: 3b 20 64 6f 65 73 20 6e 6f 74 20 28 6f 62 76 69  ; does not (obvi
3ee0: 6f 75 73 6c 79 21 29 20 72 65 6d 6f 76 65 64 20  ously!) removed 
3ef0: 64 65 70 65 6e 64 65 6e 74 20 64 61 74 61 2e 20  dependent data. 
3f00: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 64 65 6c  .(define (db:del
3f10: 65 74 65 2d 72 75 6e 20 64 62 20 72 75 6e 2d 69  ete-run db run-i
3f20: 64 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78  d).  (sqlite3:ex
3f30: 65 63 75 74 65 20 64 62 20 22 44 45 4c 45 54 45  ecute db "DELETE
3f40: 20 46 52 4f 4d 20 72 75 6e 73 20 57 48 45 52 45   FROM runs WHERE
3f50: 20 69 64 3d 3f 3b 22 20 72 75 6e 2d 69 64 29 29   id=?;" run-id))
3f60: 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 75 70  ..(define (db:up
3f70: 64 61 74 65 2d 72 75 6e 2d 65 76 65 6e 74 5f 74  date-run-event_t
3f80: 69 6d 65 20 64 62 20 72 75 6e 2d 69 64 29 0a 20  ime db run-id). 
3f90: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
3fa0: 65 20 64 62 20 22 55 50 44 41 54 45 20 72 75 6e  e db "UPDATE run
3fb0: 73 20 53 45 54 20 65 76 65 6e 74 5f 74 69 6d 65  s SET event_time
3fc0: 3d 73 74 72 66 74 69 6d 65 28 27 25 73 27 2c 27  =strftime('%s','
3fd0: 6e 6f 77 27 29 20 57 48 45 52 45 20 69 64 3d 3f  now') WHERE id=?
3fe0: 3b 22 20 72 75 6e 2d 69 64 29 29 20 0a 0a 3b 3b  ;" run-id)) ..;;
3ff0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
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 0a 3b 3b 20 4b 20 45 20 59 20  ======.;; K E Y 
4040: 53 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  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 0a 0a 3b 3b 20 67  ==========..;; g
4090: 65 74 20 6b 65 79 20 76 61 6c 20 70 61 69 72 73  et key val pairs
40a0: 20 66 6f 72 20 61 20 67 69 76 65 6e 20 72 75 6e   for a given run
40b0: 2d 69 64 0a 3b 3b 20 28 20 28 46 49 45 4c 44 4e  -id.;; ( (FIELDN
40c0: 41 4d 45 31 20 6b 65 79 76 61 6c 31 29 20 28 46  AME1 keyval1) (F
40d0: 49 45 4c 44 4e 41 4d 45 32 20 6b 65 79 76 61 6c  IELDNAME2 keyval
40e0: 32 29 20 2e 2e 2e 20 29 0a 28 64 65 66 69 6e 65  2) ... ).(define
40f0: 20 28 64 62 3a 67 65 74 2d 6b 65 79 2d 76 61 6c   (db:get-key-val
4100: 2d 70 61 69 72 73 20 64 62 20 72 75 6e 2d 69 64  -pairs db run-id
4110: 29 0a 20 20 28 6c 65 74 2a 20 28 28 6b 65 79 73  ).  (let* ((keys
4120: 20 28 67 65 74 2d 6b 65 79 73 20 64 62 29 29 0a   (get-keys db)).
4130: 09 20 28 72 65 73 20 20 27 28 29 29 29 0a 20 20  . (res  '())).  
4140: 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 36    (debug:print 6
4150: 20 22 6b 65 79 73 3a 20 22 20 6b 65 79 73 20 22   "keys: " keys "
4160: 20 72 75 6e 2d 69 64 3a 20 22 20 72 75 6e 2d 69   run-id: " run-i
4170: 64 29 0a 20 20 20 20 28 66 6f 72 2d 65 61 63 68  d).    (for-each
4180: 20 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28   .     (lambda (
4190: 6b 65 79 29 0a 20 20 20 20 20 20 20 28 6c 65 74  key).       (let
41a0: 20 28 28 71 72 79 20 28 63 6f 6e 63 20 22 53 45   ((qry (conc "SE
41b0: 4c 45 43 54 20 22 20 28 6b 65 79 3a 67 65 74 2d  LECT " (key:get-
41c0: 66 69 65 6c 64 6e 61 6d 65 20 6b 65 79 29 20 22  fieldname key) "
41d0: 20 46 52 4f 4d 20 72 75 6e 73 20 57 48 45 52 45   FROM runs WHERE
41e0: 20 69 64 3d 3f 3b 22 29 29 29 0a 09 20 3b 3b 20   id=?;"))).. ;; 
41f0: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 30 20 22  (debug:print 0 "
4200: 71 72 79 3a 20 22 20 71 72 79 29 0a 09 20 28 73  qry: " qry).. (s
4210: 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d  qlite3:for-each-
4220: 72 6f 77 20 0a 09 20 20 28 6c 61 6d 62 64 61 20  row ..  (lambda 
4230: 28 6b 65 79 2d 76 61 6c 29 0a 09 20 20 20 20 28  (key-val)..    (
4240: 73 65 74 21 20 72 65 73 20 28 63 6f 6e 73 20 28  set! res (cons (
4250: 6c 69 73 74 20 28 6b 65 79 3a 67 65 74 2d 66 69  list (key:get-fi
4260: 65 6c 64 6e 61 6d 65 20 6b 65 79 29 20 6b 65 79  eldname key) key
4270: 2d 76 61 6c 29 20 72 65 73 29 29 29 0a 09 20 20  -val) res)))..  
4280: 64 62 20 71 72 79 20 72 75 6e 2d 69 64 29 29 29  db qry run-id)))
4290: 0a 20 20 20 20 20 6b 65 79 73 29 0a 20 20 20 20  .     keys).    
42a0: 28 72 65 76 65 72 73 65 20 72 65 73 29 29 29 0a  (reverse res))).
42b0: 0a 3b 3b 20 67 65 74 20 6b 65 79 20 76 61 6c 73  .;; get key vals
42c0: 20 66 6f 72 20 61 20 67 69 76 65 6e 20 72 75 6e   for a given run
42d0: 2d 69 64 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  -id.(define (db:
42e0: 67 65 74 2d 6b 65 79 2d 76 61 6c 73 20 64 62 20  get-key-vals db 
42f0: 72 75 6e 2d 69 64 29 0a 20 20 28 6c 65 74 2a 20  run-id).  (let* 
4300: 28 28 6b 65 79 73 20 28 67 65 74 2d 6b 65 79 73  ((keys (get-keys
4310: 20 64 62 29 29 0a 09 20 28 72 65 73 20 20 27 28   db)).. (res  '(
4320: 29 29 29 0a 20 20 20 20 28 64 65 62 75 67 3a 70  ))).    (debug:p
4330: 72 69 6e 74 20 36 20 22 6b 65 79 73 3a 20 22 20  rint 6 "keys: " 
4340: 6b 65 79 73 20 22 20 72 75 6e 2d 69 64 3a 20 22  keys " run-id: "
4350: 20 72 75 6e 2d 69 64 29 0a 20 20 20 20 28 66 6f   run-id).    (fo
4360: 72 2d 65 61 63 68 20 0a 20 20 20 20 20 28 6c 61  r-each .     (la
4370: 6d 62 64 61 20 28 6b 65 79 29 0a 20 20 20 20 20  mbda (key).     
4380: 20 20 28 6c 65 74 20 28 28 71 72 79 20 28 63 6f    (let ((qry (co
4390: 6e 63 20 22 53 45 4c 45 43 54 20 22 20 28 6b 65  nc "SELECT " (ke
43a0: 79 3a 67 65 74 2d 66 69 65 6c 64 6e 61 6d 65 20  y:get-fieldname 
43b0: 6b 65 79 29 20 22 20 46 52 4f 4d 20 72 75 6e 73  key) " FROM runs
43c0: 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 29 29 29   WHERE id=?;")))
43d0: 0a 09 20 3b 3b 20 28 64 65 62 75 67 3a 70 72 69  .. ;; (debug:pri
43e0: 6e 74 20 30 20 22 71 72 79 3a 20 22 20 71 72 79  nt 0 "qry: " qry
43f0: 29 0a 09 20 28 73 71 6c 69 74 65 33 3a 66 6f 72  ).. (sqlite3:for
4400: 2d 65 61 63 68 2d 72 6f 77 20 0a 09 20 20 28 6c  -each-row ..  (l
4410: 61 6d 62 64 61 20 28 6b 65 79 2d 76 61 6c 29 0a  ambda (key-val).
4420: 09 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28  .    (set! res (
4430: 63 6f 6e 73 20 6b 65 79 2d 76 61 6c 20 72 65 73  cons key-val res
4440: 29 29 29 0a 09 20 20 64 62 20 71 72 79 20 72 75  )))..  db qry ru
4450: 6e 2d 69 64 29 29 29 0a 20 20 20 20 20 6b 65 79  n-id))).     key
4460: 73 29 0a 20 20 20 20 28 72 65 76 65 72 73 65 20  s).    (reverse 
4470: 72 65 73 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d  res)))..;;======
4480: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4490: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
44a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
44b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
44c0: 0a 3b 3b 20 20 54 20 45 20 53 20 54 20 53 0a 3b  .;;  T E S T S.;
44d0: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;===============
44e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
44f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4500: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4510: 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 73 74 61 74  =======..;; stat
4520: 65 73 20 61 6e 64 20 73 74 61 74 75 73 65 73 20  es and statuses 
4530: 61 72 65 20 6c 69 73 74 73 2c 20 74 75 72 6e 20  are lists, turn 
4540: 74 68 65 6d 20 69 6e 74 6f 20 28 22 50 41 53 53  them into ("PASS
4550: 22 2c 22 46 41 49 4c 22 2e 2e 2e 29 20 61 6e 64  ","FAIL"...) and
4560: 20 75 73 65 20 4e 4f 54 20 49 4e 0a 3b 3b 20 69   use NOT IN.;; i
4570: 2e 65 2e 20 74 68 65 73 65 20 6c 69 73 74 73 20  .e. these lists 
4580: 64 65 66 69 6e 65 20 77 68 61 74 20 74 6f 20 4e  define what to N
4590: 4f 54 20 73 68 6f 77 2e 0a 3b 3b 20 73 74 61 74  OT show..;; stat
45a0: 65 73 20 61 6e 64 20 73 74 61 74 75 73 65 73 20  es and statuses 
45b0: 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20  are required to 
45c0: 62 65 20 6c 69 73 74 73 2c 20 65 6d 70 74 79 20  be lists, empty 
45d0: 69 73 20 6f 6b 0a 28 64 65 66 69 6e 65 20 28 64  is ok.(define (d
45e0: 62 3a 67 65 74 2d 74 65 73 74 73 2d 66 6f 72 2d  b:get-tests-for-
45f0: 72 75 6e 20 64 62 20 72 75 6e 2d 69 64 20 74 65  run db run-id te
4600: 73 74 70 61 74 74 20 69 74 65 6d 70 61 74 74 20  stpatt itempatt 
4610: 73 74 61 74 65 73 20 73 74 61 74 75 73 65 73 29  states statuses)
4620: 0a 20 20 28 6c 65 74 2a 20 28 28 72 65 73 20 27  .  (let* ((res '
4630: 28 29 29 0a 09 20 28 73 74 61 74 65 73 2d 73 74  ()).. (states-st
4640: 72 20 20 20 20 28 63 6f 6e 63 20 22 28 27 22 20  r    (conc "('" 
4650: 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65  (string-interspe
4660: 72 73 65 20 73 74 61 74 65 73 20 20 20 22 27 2c  rse states   "',
4670: 27 22 29 20 22 27 29 22 29 29 0a 09 20 28 73 74  '") "')")).. (st
4680: 61 74 75 73 65 73 2d 73 74 72 20 20 28 63 6f 6e  atuses-str  (con
4690: 63 20 22 28 27 22 20 28 73 74 72 69 6e 67 2d 69  c "('" (string-i
46a0: 6e 74 65 72 73 70 65 72 73 65 20 73 74 61 74 75  ntersperse statu
46b0: 73 65 73 20 22 27 2c 27 22 29 20 22 27 29 22 29  ses "','") "')")
46c0: 29 0a 09 20 28 71 72 79 20 20 20 20 20 20 28 63  ).. (qry      (c
46d0: 6f 6e 63 20 22 53 45 4c 45 43 54 20 69 64 2c 72  onc "SELECT id,r
46e0: 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d 65 2c 73  un_id,testname,s
46f0: 74 61 74 65 2c 73 74 61 74 75 73 2c 65 76 65 6e  tate,status,even
4700: 74 5f 74 69 6d 65 2c 68 6f 73 74 2c 63 70 75 6c  t_time,host,cpul
4710: 6f 61 64 2c 64 69 73 6b 66 72 65 65 2c 75 6e 61  oad,diskfree,una
4720: 6d 65 2c 72 75 6e 64 69 72 2c 69 74 65 6d 5f 70  me,rundir,item_p
4730: 61 74 68 2c 72 75 6e 5f 64 75 72 61 74 69 6f 6e  ath,run_duration
4740: 2c 66 69 6e 61 6c 5f 6c 6f 67 66 2c 63 6f 6d 6d  ,final_logf,comm
4750: 65 6e 74 20 22 0a 09 09 09 20 22 20 46 52 4f 4d  ent ".... " FROM
4760: 20 74 65 73 74 73 20 57 48 45 52 45 20 72 75 6e   tests WHERE run
4770: 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61  _id=? AND testna
4780: 6d 65 20 6c 69 6b 65 20 3f 20 41 4e 44 20 69 74  me like ? AND it
4790: 65 6d 5f 70 61 74 68 20 4c 49 4b 45 20 3f 20 22  em_path LIKE ? "
47a0: 20 0a 09 09 09 20 22 20 41 4e 44 20 4e 4f 54 20   .... " AND NOT 
47b0: 28 73 74 61 74 65 20 69 6e 20 22 20 73 74 61 74  (state in " stat
47c0: 65 73 2d 73 74 72 20 22 20 41 4e 44 20 73 74 61  es-str " AND sta
47d0: 74 75 73 20 49 4e 20 22 20 73 74 61 74 75 73 65  tus IN " statuse
47e0: 73 2d 73 74 72 20 22 29 20 22 0a 09 09 09 20 3b  s-str ") ".... ;
47f0: 3b 20 22 20 4f 52 44 45 52 20 42 59 20 69 64 20  ; " ORDER BY id 
4800: 44 45 53 43 3b 22 0a 09 09 09 20 22 20 4f 52 44  DESC;".... " ORD
4810: 45 52 20 42 59 20 65 76 65 6e 74 5f 74 69 6d 65  ER BY event_time
4820: 20 41 53 43 3b 22 20 3b 3b 20 50 4f 54 45 4e 54   ASC;" ;; POTENT
4830: 49 41 4c 20 49 53 53 55 45 21 20 43 48 45 43 4b  IAL ISSUE! CHECK
4840: 20 4d 45 21 20 44 6f 65 73 20 61 6e 79 74 69 6e   ME! Does anytin
4850: 67 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 69 73  g depend on this
4860: 20 62 65 69 6e 67 20 73 6f 72 74 65 64 20 62 79   being sorted by
4870: 20 69 64 3f 0a 09 09 09 20 29 29 29 0a 20 20 20   id?.... ))).   
4880: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 38 20   (debug:print 8 
4890: 22 49 4e 46 4f 3a 20 64 62 3a 67 65 74 2d 74 65  "INFO: db:get-te
48a0: 73 74 73 2d 66 6f 72 2d 72 75 6e 20 71 72 79 3d  sts-for-run qry=
48b0: 22 20 71 72 79 29 0a 20 20 20 20 28 73 71 6c 69  " qry).    (sqli
48c0: 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77  te3:for-each-row
48d0: 20 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28   .     (lambda (
48e0: 61 20 2e 20 62 29 20 3b 3b 20 69 64 20 72 75 6e  a . b) ;; id run
48f0: 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 73 74 61  -id testname sta
4900: 74 65 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d  te status event-
4910: 74 69 6d 65 20 68 6f 73 74 20 63 70 75 6c 6f 61  time host cpuloa
4920: 64 20 64 69 73 6b 66 72 65 65 20 75 6e 61 6d 65  d diskfree uname
4930: 20 72 75 6e 64 69 72 20 69 74 65 6d 2d 70 61 74   rundir item-pat
4940: 68 20 72 75 6e 2d 64 75 72 61 74 69 6f 6e 20 66  h run-duration f
4950: 69 6e 61 6c 2d 6c 6f 67 66 20 63 6f 6d 6d 65 6e  inal-logf commen
4960: 74 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20  t).       (set! 
4970: 72 65 73 20 28 63 6f 6e 73 20 28 61 70 70 6c 79  res (cons (apply
4980: 20 76 65 63 74 6f 72 20 61 20 62 29 20 72 65 73   vector a b) res
4990: 29 29 29 20 3b 3b 20 69 64 20 72 75 6e 2d 69 64  ))) ;; id run-id
49a0: 20 74 65 73 74 6e 61 6d 65 20 73 74 61 74 65 20   testname state 
49b0: 73 74 61 74 75 73 20 65 76 65 6e 74 2d 74 69 6d  status event-tim
49c0: 65 20 68 6f 73 74 20 63 70 75 6c 6f 61 64 20 64  e host cpuload d
49d0: 69 73 6b 66 72 65 65 20 75 6e 61 6d 65 20 72 75  iskfree uname ru
49e0: 6e 64 69 72 20 69 74 65 6d 2d 70 61 74 68 20 72  ndir item-path r
49f0: 75 6e 2d 64 75 72 61 74 69 6f 6e 20 66 69 6e 61  un-duration fina
4a00: 6c 2d 6c 6f 67 66 20 63 6f 6d 6d 65 6e 74 29 20  l-logf comment) 
4a10: 72 65 73 29 29 29 0a 20 20 20 20 20 64 62 20 0a  res))).     db .
4a20: 20 20 20 20 20 71 72 79 0a 20 20 20 20 20 72 75       qry.     ru
4a30: 6e 2d 69 64 0a 20 20 20 20 20 28 69 66 20 74 65  n-id.     (if te
4a40: 73 74 70 61 74 74 20 74 65 73 74 70 61 74 74 20  stpatt testpatt 
4a50: 22 25 22 29 0a 20 20 20 20 20 28 69 66 20 69 74  "%").     (if it
4a60: 65 6d 70 61 74 74 20 69 74 65 6d 70 61 74 74 20  empatt itempatt 
4a70: 22 25 22 29 29 0a 20 20 20 20 72 65 73 29 29 0a  "%")).    res)).
4a80: 0a 3b 3b 20 74 68 69 73 20 6f 6e 65 20 69 73 20  .;; this one is 
4a90: 61 20 62 69 74 20 62 72 6f 6b 65 6e 20 42 55 47  a bit broken BUG
4aa0: 20 46 49 58 4d 45 0a 28 64 65 66 69 6e 65 20 28   FIXME.(define (
4ab0: 64 62 3a 64 65 6c 65 74 65 2d 74 65 73 74 2d 73  db:delete-test-s
4ac0: 74 65 70 2d 72 65 63 6f 72 64 73 20 64 62 20 72  tep-records db r
4ad0: 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20  un-id test-name 
4ae0: 69 74 65 6d 64 61 74 29 0a 20 20 3b 3b 20 42 72  itemdat).  ;; Br
4af0: 65 61 6b 69 6e 67 20 69 74 20 69 6e 74 6f 20 74  eaking it into t
4b00: 77 6f 20 71 75 65 72 69 65 73 20 66 6f 72 20 62  wo queries for b
4b10: 65 74 74 65 72 20 66 69 6c 65 20 61 63 63 65 73  etter file acces
4b20: 73 20 69 6e 74 65 72 6c 65 61 76 69 6e 67 0a 20  s interleaving. 
4b30: 20 28 6c 65 74 20 28 28 69 64 73 20 27 28 29 29   (let ((ids '())
4b40: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66  ).    (sqlite3:f
4b50: 6f 72 2d 65 61 63 68 2d 72 6f 77 20 28 6c 61 6d  or-each-row (lam
4b60: 62 64 61 20 28 69 64 29 0a 09 09 09 20 20 20 20  bda (id)....    
4b70: 28 73 65 74 21 20 69 64 73 20 28 63 6f 6e 73 20  (set! ids (cons 
4b80: 69 64 20 69 64 73 29 29 29 0a 09 09 09 20 20 64  id ids)))....  d
4b90: 62 0a 09 09 09 20 20 22 53 45 4c 45 43 54 20 69  b....  "SELECT i
4ba0: 64 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45  d FROM tests WHE
4bb0: 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20  RE run_id=? AND 
4bc0: 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69  testname=? AND i
4bd0: 74 65 6d 5f 70 61 74 68 3d 3f 3b 22 0a 09 09 09  tem_path=?;"....
4be0: 20 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61    run-id test-na
4bf0: 6d 65 20 28 69 74 65 6d 2d 6c 69 73 74 2d 3e 70  me (item-list->p
4c00: 61 74 68 20 69 74 65 6d 64 61 74 29 29 0a 20 20  ath itemdat)).  
4c10: 20 20 28 66 6f 72 2d 65 61 63 68 20 28 6c 61 6d    (for-each (lam
4c20: 62 64 61 20 28 69 64 29 0a 09 09 28 73 71 6c 69  bda (id)...(sqli
4c30: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22  te3:execute db "
4c40: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 65 73 74  DELETE FROM test
4c50: 5f 73 74 65 70 73 20 57 48 45 52 45 20 74 65 73  _steps WHERE tes
4c60: 74 5f 69 64 3d 3f 3b 22 20 69 64 29 0a 09 09 28  t_id=?;" id)...(
4c70: 74 68 72 65 61 64 2d 73 6c 65 65 70 21 20 30 2e  thread-sleep! 0.
4c80: 31 29 20 3b 3b 20 67 69 76 65 20 6f 74 68 65 72  1) ;; give other
4c90: 73 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20  s access to the 
4ca0: 64 62 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  db.             
4cb0: 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63     (sqlite3:exec
4cc0: 75 74 65 20 64 62 20 22 44 45 4c 45 54 45 20 46  ute db "DELETE F
4cd0: 52 4f 4d 20 74 65 73 74 5f 64 61 74 61 20 57 48  ROM test_data WH
4ce0: 45 52 45 20 74 65 73 74 5f 69 64 3d 3f 3b 22 20  ERE test_id=?;" 
4cf0: 69 64 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  id).            
4d00: 20 20 20 20 28 74 68 72 65 61 64 2d 73 6c 65 65      (thread-slee
4d10: 70 21 20 30 2e 31 29 29 20 3b 3b 20 67 69 76 65  p! 0.1)) ;; give
4d20: 20 6f 74 68 65 72 73 20 61 63 63 65 73 73 20 74   others access t
4d30: 6f 20 74 68 65 20 64 62 0a 09 20 20 20 20 20 20  o the db..      
4d40: 69 64 73 29 29 29 0a 3b 3b 22 44 45 4c 45 54 45  ids))).;;"DELETE
4d50: 20 46 52 4f 4d 20 74 65 73 74 5f 73 74 65 70 73   FROM test_steps
4d60: 20 57 48 45 52 45 20 74 65 73 74 5f 69 64 20 69   WHERE test_id i
4d70: 6e 20 28 53 45 4c 45 43 54 20 69 64 20 46 52 4f  n (SELECT id FRO
4d80: 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 72 75  M tests WHERE ru
4d90: 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e  n_id=? AND testn
4da0: 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70  ame=? AND item_p
4db0: 61 74 68 3d 3f 29 3b 22 20 0a 09 09 20 20 20 0a  ath=?);" ...   .
4dc0: 3b 3b 20 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  ;; .(define (db:
4dd0: 64 65 6c 65 74 65 2d 74 65 73 74 2d 72 65 63 6f  delete-test-reco
4de0: 72 64 73 20 64 62 20 74 65 73 74 2d 69 64 29 0a  rds db test-id).
4df0: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
4e00: 74 65 20 64 62 20 22 44 45 4c 45 54 45 20 46 52  te db "DELETE FR
4e10: 4f 4d 20 74 65 73 74 5f 73 74 65 70 73 20 57 48  OM test_steps WH
4e20: 45 52 45 20 74 65 73 74 5f 69 64 3d 3f 3b 22 20  ERE test_id=?;" 
4e30: 74 65 73 74 2d 69 64 29 0a 20 20 28 73 71 6c 69  test-id).  (sqli
4e40: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22  te3:execute db "
4e50: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 65 73 74  DELETE FROM test
4e60: 5f 64 61 74 61 20 20 57 48 45 52 45 20 74 65 73  _data  WHERE tes
4e70: 74 5f 69 64 3d 3f 3b 22 20 74 65 73 74 2d 69 64  t_id=?;" test-id
4e80: 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65  ).  (sqlite3:exe
4e90: 63 75 74 65 20 64 62 20 22 44 45 4c 45 54 45 20  cute db "DELETE 
4ea0: 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45  FROM tests WHERE
4eb0: 20 69 64 3d 3f 3b 22 20 74 65 73 74 2d 69 64 29   id=?;" test-id)
4ec0: 29 0a 0a 3b 3b 20 73 65 74 20 74 65 73 74 73 20  )..;; set tests 
4ed0: 77 69 74 68 20 73 74 61 74 65 20 63 75 72 72 73  with state currs
4ee0: 74 61 74 65 20 61 6e 64 20 73 74 61 74 75 73 20  tate and status 
4ef0: 63 75 72 72 73 74 61 74 75 73 20 74 6f 20 6e 65  currstatus to ne
4f00: 77 73 74 61 74 65 20 61 6e 64 20 6e 65 77 73 74  wstate and newst
4f10: 61 74 75 73 0a 3b 3b 20 75 73 65 20 63 75 72 72  atus.;; use curr
4f20: 73 74 61 74 65 20 3d 20 23 66 20 61 6e 64 20 6f  state = #f and o
4f30: 72 20 63 75 72 72 73 74 61 74 75 73 20 3d 20 23  r currstatus = #
4f40: 66 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 61 6e  f to apply to an
4f50: 79 20 73 74 61 74 65 20 6f 72 20 73 74 61 74 75  y state or statu
4f60: 73 20 72 65 73 70 65 63 74 69 76 65 6c 79 0a 3b  s respectively.;
4f70: 3b 20 57 41 52 4e 49 4e 47 3a 20 53 51 4c 20 69  ; WARNING: SQL i
4f80: 6e 6a 65 63 74 69 6f 6e 20 72 69 73 6b 0a 28 64  njection risk.(d
4f90: 65 66 69 6e 65 20 28 64 62 3a 73 65 74 2d 74 65  efine (db:set-te
4fa0: 73 74 73 2d 73 74 61 74 65 2d 73 74 61 74 75 73  sts-state-status
4fb0: 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 6e   db run-id testn
4fc0: 61 6d 65 73 20 63 75 72 72 73 74 61 74 65 20 63  ames currstate c
4fd0: 75 72 72 73 74 61 74 75 73 20 6e 65 77 73 74 61  urrstatus newsta
4fe0: 74 65 20 6e 65 77 73 74 61 74 75 73 29 0a 20 20  te newstatus).  
4ff0: 28 66 6f 72 2d 65 61 63 68 20 28 6c 61 6d 62 64  (for-each (lambd
5000: 61 20 28 74 65 73 74 6e 61 6d 65 29 0a 09 20 20  a (testname)..  
5010: 20 20 20 20 28 6c 65 74 20 28 28 71 72 79 20 28      (let ((qry (
5020: 63 6f 6e 63 20 22 55 50 44 41 54 45 20 74 65 73  conc "UPDATE tes
5030: 74 73 20 53 45 54 20 73 74 61 74 65 3d 3f 2c 73  ts SET state=?,s
5040: 74 61 74 75 73 3d 3f 20 57 48 45 52 45 20 22 0a  tatus=? WHERE ".
5050: 09 09 09 20 20 20 20 20 20 20 28 69 66 20 63 75  ...       (if cu
5060: 72 72 73 74 61 74 65 20 20 28 63 6f 6e 63 20 22  rrstate  (conc "
5070: 73 74 61 74 65 3d 27 22 20 63 75 72 72 73 74 61  state='" currsta
5080: 74 65 20 22 27 20 41 4e 44 20 22 29 20 22 22 29  te "' AND ") "")
5090: 0a 09 09 09 20 20 20 20 20 20 20 28 69 66 20 63  ....       (if c
50a0: 75 72 72 73 74 61 74 75 73 20 28 63 6f 6e 63 20  urrstatus (conc 
50b0: 22 73 74 61 74 75 73 3d 27 22 20 63 75 72 72 73  "status='" currs
50c0: 74 61 74 75 73 20 22 27 20 41 4e 44 20 22 29 20  tatus "' AND ") 
50d0: 22 22 29 0a 09 09 09 20 20 20 20 20 20 20 22 20  "")....       " 
50e0: 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73  run_id=? AND tes
50f0: 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 4e 4f 54 20  tname=? AND NOT 
5100: 28 69 74 65 6d 5f 70 61 74 68 3d 27 27 20 41 4e  (item_path='' AN
5110: 44 20 74 65 73 74 6e 61 6d 65 20 69 6e 20 28 53  D testname in (S
5120: 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 74  ELECT DISTINCT t
5130: 65 73 74 6e 61 6d 65 20 46 52 4f 4d 20 74 65 73  estname FROM tes
5140: 74 73 20 57 48 45 52 45 20 74 65 73 74 6e 61 6d  ts WHERE testnam
5150: 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74  e=? AND item_pat
5160: 68 20 21 3d 20 27 27 29 29 3b 22 29 29 29 0a 09  h != ''));")))..
5170: 09 3b 3b 28 64 65 62 75 67 3a 70 72 69 6e 74 20  .;;(debug:print 
5180: 30 20 22 51 52 59 3a 20 22 20 71 72 79 29 0a 09  0 "QRY: " qry)..
5190: 09 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74  .(sqlite3:execut
51a0: 65 20 64 62 20 71 72 79 20 72 75 6e 2d 69 64 20  e db qry run-id 
51b0: 6e 65 77 73 74 61 74 65 20 6e 65 77 73 74 61 74  newstate newstat
51c0: 75 73 20 74 65 73 74 6e 61 6d 65 20 74 65 73 74  us testname test
51d0: 6e 61 6d 65 29 29 29 0a 09 20 20 20 20 74 65 73  name)))..    tes
51e0: 74 6e 61 6d 65 73 29 29 0a 0a 28 64 65 66 69 6e  tnames))..(defin
51f0: 65 20 28 64 62 3a 64 65 6c 65 74 65 2d 74 65 73  e (db:delete-tes
5200: 74 73 2d 69 6e 2d 73 74 61 74 65 20 64 62 20 72  ts-in-state db r
5210: 75 6e 2d 69 64 20 73 74 61 74 65 29 0a 20 20 28  un-id state).  (
5220: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
5230: 64 62 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  db "DELETE FROM 
5240: 74 65 73 74 73 20 57 48 45 52 45 20 73 74 61 74  tests WHERE stat
5250: 65 3d 3f 20 41 4e 44 20 72 75 6e 5f 69 64 3d 3f  e=? AND run_id=?
5260: 3b 22 20 73 74 61 74 65 20 72 75 6e 2d 69 64 29  ;" state run-id)
5270: 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 74  )..(define (db:t
5280: 65 73 74 2d 73 65 74 2d 73 74 61 74 65 2d 73 74  est-set-state-st
5290: 61 74 75 73 2d 62 79 2d 69 64 20 64 62 20 74 65  atus-by-id db te
52a0: 73 74 2d 69 64 20 6e 65 77 73 74 61 74 65 20 6e  st-id newstate n
52b0: 65 77 73 74 61 74 75 73 20 6e 65 77 63 6f 6d 6d  ewstatus newcomm
52c0: 65 6e 74 29 0a 20 20 28 69 66 20 6e 65 77 73 74  ent).  (if newst
52d0: 61 74 65 20 20 20 28 73 71 6c 69 74 65 33 3a 65  ate   (sqlite3:e
52e0: 78 65 63 75 74 65 20 64 62 20 22 55 50 44 41 54  xecute db "UPDAT
52f0: 45 20 74 65 73 74 73 20 53 45 54 20 73 74 61 74  E tests SET stat
5300: 65 3d 3f 20 20 20 57 48 45 52 45 20 69 64 3d 3f  e=?   WHERE id=?
5310: 3b 22 20 6e 65 77 73 74 61 74 65 20 20 20 74 65  ;" newstate   te
5320: 73 74 2d 69 64 29 29 0a 20 20 28 69 66 20 6e 65  st-id)).  (if ne
5330: 77 73 74 61 74 75 73 20 20 28 73 71 6c 69 74 65  wstatus  (sqlite
5340: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 55 50  3:execute db "UP
5350: 44 41 54 45 20 74 65 73 74 73 20 53 45 54 20 73  DATE tests SET s
5360: 74 61 74 75 73 3d 3f 20 20 57 48 45 52 45 20 69  tatus=?  WHERE i
5370: 64 3d 3f 3b 22 20 6e 65 77 73 74 61 74 75 73 20  d=?;" newstatus 
5380: 20 74 65 73 74 2d 69 64 29 29 0a 20 20 28 69 66   test-id)).  (if
5390: 20 6e 65 77 63 6f 6d 6d 65 6e 74 20 28 73 71 6c   newcomment (sql
53a0: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
53b0: 22 55 50 44 41 54 45 20 74 65 73 74 73 20 53 45  "UPDATE tests SE
53c0: 54 20 63 6f 6d 6d 65 6e 74 3d 3f 20 57 48 45 52  T comment=? WHER
53d0: 45 20 69 64 3d 3f 3b 22 20 6e 65 77 63 6f 6d 6d  E id=?;" newcomm
53e0: 65 6e 74 20 74 65 73 74 2d 69 64 29 29 29 0a 0a  ent test-id)))..
53f0: 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74  (define (db:test
5400: 2d 73 65 74 2d 73 74 61 74 65 2d 73 74 61 74 75  -set-state-statu
5410: 73 2d 62 79 2d 72 75 6e 2d 69 64 2d 74 65 73 74  s-by-run-id-test
5420: 6e 61 6d 65 20 64 62 20 72 75 6e 2d 69 64 20 74  name db run-id t
5430: 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61  est-name item-pa
5440: 74 68 20 73 74 61 74 75 73 20 73 74 61 74 65 29  th status state)
5450: 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63  .  (sqlite3:exec
5460: 75 74 65 20 64 62 20 22 55 50 44 41 54 45 20 74  ute db "UPDATE t
5470: 65 73 74 73 20 53 45 54 20 73 74 61 74 65 3d 3f  ests SET state=?
5480: 2c 73 74 61 74 75 73 3d 3f 2c 65 76 65 6e 74 5f  ,status=?,event_
5490: 74 69 6d 65 3d 73 74 72 66 74 69 6d 65 28 27 25  time=strftime('%
54a0: 73 27 2c 27 6e 6f 77 27 29 20 57 48 45 52 45 20  s','now') WHERE 
54b0: 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73  run_id=? AND tes
54c0: 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d  tname=? AND item
54d0: 5f 70 61 74 68 3d 3f 3b 22 20 0a 09 09 20 20 20  _path=?;" ...   
54e0: 73 74 61 74 65 20 73 74 61 74 75 73 20 72 75 6e  state status run
54f0: 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74  -id test-name it
5500: 65 6d 2d 70 61 74 68 29 29 0a 0a 28 64 65 66 69  em-path))..(defi
5510: 6e 65 20 28 64 62 3a 67 65 74 2d 63 6f 75 6e 74  ne (db:get-count
5520: 2d 74 65 73 74 73 2d 72 75 6e 6e 69 6e 67 20 64  -tests-running d
5530: 62 29 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20  b).  (let ((res 
5540: 30 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33  0)).    (sqlite3
5550: 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20  :for-each-row.  
5560: 20 20 20 28 6c 61 6d 62 64 61 20 28 63 6f 75 6e     (lambda (coun
5570: 74 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20  t).       (set! 
5580: 72 65 73 20 63 6f 75 6e 74 29 29 0a 20 20 20 20  res count)).    
5590: 20 64 62 0a 20 20 20 20 20 22 53 45 4c 45 43 54   db.     "SELECT
55a0: 20 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20   count(id) FROM 
55b0: 74 65 73 74 73 20 57 48 45 52 45 20 73 74 61 74  tests WHERE stat
55c0: 65 20 3d 20 27 52 55 4e 4e 49 4e 47 27 20 4f 52  e = 'RUNNING' OR
55d0: 20 73 74 61 74 65 20 3d 20 27 4c 41 55 4e 43 48   state = 'LAUNCH
55e0: 45 44 27 20 4f 52 20 73 74 61 74 65 20 3d 20 27  ED' OR state = '
55f0: 52 45 4d 4f 54 45 48 4f 53 54 53 54 41 52 54 27  REMOTEHOSTSTART'
5600: 3b 22 29 0a 20 20 20 20 72 65 73 29 29 0a 0a 28  ;").    res))..(
5610: 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 63  define (db:get-c
5620: 6f 75 6e 74 2d 74 65 73 74 73 2d 72 75 6e 6e 69  ount-tests-runni
5630: 6e 67 2d 69 6e 2d 6a 6f 62 67 72 6f 75 70 20 64  ng-in-jobgroup d
5640: 62 20 6a 6f 62 67 72 6f 75 70 29 0a 20 20 28 69  b jobgroup).  (i
5650: 66 20 28 6e 6f 74 20 6a 6f 62 67 72 6f 75 70 29  f (not jobgroup)
5660: 0a 20 20 20 20 20 20 30 20 3b 3b 20 0a 20 20 20  .      0 ;; .   
5670: 20 20 20 28 6c 65 74 20 28 28 72 65 73 20 30 29     (let ((res 0)
5680: 29 0a 09 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d  )..(sqlite3:for-
5690: 65 61 63 68 2d 72 6f 77 0a 09 20 28 6c 61 6d 62  each-row.. (lamb
56a0: 64 61 20 28 63 6f 75 6e 74 29 0a 09 20 20 20 28  da (count)..   (
56b0: 73 65 74 21 20 72 65 73 20 63 6f 75 6e 74 29 29  set! res count))
56c0: 0a 09 20 64 62 0a 09 20 22 53 45 4c 45 43 54 20  .. db.. "SELECT 
56d0: 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 74  count(id) FROM t
56e0: 65 73 74 73 20 57 48 45 52 45 20 73 74 61 74 65  ests WHERE state
56f0: 20 3d 20 27 52 55 4e 4e 49 4e 47 27 20 4f 52 20   = 'RUNNING' OR 
5700: 73 74 61 74 65 20 3d 20 27 4c 41 55 4e 43 48 45  state = 'LAUNCHE
5710: 44 27 20 4f 52 20 73 74 61 74 65 20 3d 20 27 52  D' OR state = 'R
5720: 45 4d 4f 54 45 48 4f 53 54 53 54 41 52 54 27 0a  EMOTEHOSTSTART'.
5730: 20 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44               AND
5740: 20 74 65 73 74 6e 61 6d 65 20 69 6e 20 28 53 45   testname in (SE
5750: 4c 45 43 54 20 74 65 73 74 6e 61 6d 65 20 46 52  LECT testname FR
5760: 4f 4d 20 74 65 73 74 5f 6d 65 74 61 20 57 48 45  OM test_meta WHE
5770: 52 45 20 6a 6f 62 67 72 6f 75 70 3d 3f 3b 22 0a  RE jobgroup=?;".
5780: 09 20 6a 6f 62 67 72 6f 75 70 29 0a 09 72 65 73  . jobgroup)..res
5790: 29 29 29 0a 0a 3b 3b 20 64 6f 6e 65 20 77 69 74  )))..;; done wit
57a0: 68 20 72 75 6e 20 77 68 65 6e 3a 0a 3b 3b 20 20  h run when:.;;  
57b0: 20 30 20 74 65 73 74 73 20 69 6e 20 4c 41 55 4e   0 tests in LAUN
57c0: 43 48 45 44 2c 20 4e 4f 54 5f 53 54 41 52 54 45  CHED, NOT_STARTE
57d0: 44 2c 20 52 45 4d 4f 54 45 48 4f 53 54 53 54 41  D, REMOTEHOSTSTA
57e0: 52 54 2c 20 52 55 4e 4e 49 4e 47 0a 28 64 65 66  RT, RUNNING.(def
57f0: 69 6e 65 20 28 64 62 3a 65 73 74 69 6d 61 74 65  ine (db:estimate
5800: 64 2d 74 65 73 74 73 2d 72 65 6d 61 69 6e 69 6e  d-tests-remainin
5810: 67 20 64 62 20 72 75 6e 2d 69 64 29 0a 20 20 28  g db run-id).  (
5820: 6c 65 74 20 28 28 72 65 73 20 30 29 29 0a 20 20  let ((res 0)).  
5830: 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65    (sqlite3:for-e
5840: 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61  ach-row.     (la
5850: 6d 62 64 61 20 28 63 6f 75 6e 74 29 0a 20 20 20  mbda (count).   
5860: 20 20 20 20 28 73 65 74 21 20 72 65 73 20 63 6f      (set! res co
5870: 75 6e 74 29 29 0a 20 20 20 20 20 64 62 20 3b 3b  unt)).     db ;;
5880: 20 4e 42 2f 2f 20 4b 49 4c 4c 52 45 51 20 6d 65   NB// KILLREQ me
5890: 61 6e 73 20 74 68 65 20 6a 6f 62 73 20 69 73 20  ans the jobs is 
58a0: 73 74 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 72  still probably r
58b0: 75 6e 6e 69 6e 67 0a 20 20 20 20 20 22 53 45 4c  unning.     "SEL
58c0: 45 43 54 20 63 6f 75 6e 74 28 69 64 29 20 46 52  ECT count(id) FR
58d0: 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 73  OM tests WHERE s
58e0: 74 61 74 65 20 69 6e 20 28 27 4c 41 55 4e 43 48  tate in ('LAUNCH
58f0: 45 44 27 2c 27 4e 4f 54 5f 53 54 41 52 54 45 44  ED','NOT_STARTED
5900: 27 2c 27 52 45 4d 4f 54 45 48 4f 53 54 53 54 41  ','REMOTEHOSTSTA
5910: 52 54 27 2c 27 52 55 4e 4e 49 4e 47 27 2c 27 4b  RT','RUNNING','K
5920: 49 4c 4c 52 45 51 27 29 20 41 4e 44 20 72 75 6e  ILLREQ') AND run
5930: 5f 69 64 3d 3f 3b 22 20 72 75 6e 2d 69 64 29 0a  _id=?;" run-id).
5940: 20 20 20 20 72 65 73 29 29 0a 0a 3b 3b 20 4e 42      res))..;; NB
5950: 2f 2f 20 53 79 6e 63 20 74 68 69 73 20 77 69 74  // Sync this wit
5960: 68 20 72 75 6e 73 3a 67 65 74 2d 74 65 73 74 2d  h runs:get-test-
5970: 69 6e 66 6f 0a 28 64 65 66 69 6e 65 20 28 64 62  info.(define (db
5980: 3a 67 65 74 2d 74 65 73 74 2d 69 6e 66 6f 20 64  :get-test-info d
5990: 62 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d  b run-id testnam
59a0: 65 20 69 74 65 6d 2d 70 61 74 68 29 0a 20 20 28  e item-path).  (
59b0: 6c 65 74 20 28 28 72 65 73 20 23 66 29 29 0a 20  let ((res #f)). 
59c0: 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d     (sqlite3:for-
59d0: 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c  each-row.     (l
59e0: 61 6d 62 64 61 20 28 69 64 20 72 75 6e 2d 69 64  ambda (id run-id
59f0: 20 74 65 73 74 6e 61 6d 65 20 73 74 61 74 65 20   testname state 
5a00: 73 74 61 74 75 73 20 65 76 65 6e 74 2d 74 69 6d  status event-tim
5a10: 65 20 68 6f 73 74 20 63 70 75 6c 6f 61 64 20 64  e host cpuload d
5a20: 69 73 6b 66 72 65 65 20 75 6e 61 6d 65 20 72 75  iskfree uname ru
5a30: 6e 64 69 72 20 69 74 65 6d 2d 70 61 74 68 20 72  ndir item-path r
5a40: 75 6e 5f 64 75 72 61 74 69 6f 6e 20 66 69 6e 61  un_duration fina
5a50: 6c 5f 6c 6f 67 66 20 63 6f 6d 6d 65 6e 74 20 29  l_logf comment )
5a60: 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72 65  .       (set! re
5a70: 73 20 28 76 65 63 74 6f 72 20 69 64 20 72 75 6e  s (vector id run
5a80: 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 73 74 61  -id testname sta
5a90: 74 65 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d  te status event-
5aa0: 74 69 6d 65 20 68 6f 73 74 20 63 70 75 6c 6f 61  time host cpuloa
5ab0: 64 20 64 69 73 6b 66 72 65 65 20 75 6e 61 6d 65  d diskfree uname
5ac0: 20 72 75 6e 64 69 72 20 69 74 65 6d 2d 70 61 74   rundir item-pat
5ad0: 68 20 72 75 6e 5f 64 75 72 61 74 69 6f 6e 20 66  h run_duration f
5ae0: 69 6e 61 6c 5f 6c 6f 67 66 20 63 6f 6d 6d 65 6e  inal_logf commen
5af0: 74 20 29 29 29 0a 20 20 20 20 20 64 62 20 0a 20  t ))).     db . 
5b00: 20 20 20 20 22 53 45 4c 45 43 54 20 69 64 2c 72      "SELECT id,r
5b10: 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d 65 2c 73  un_id,testname,s
5b20: 74 61 74 65 2c 73 74 61 74 75 73 2c 65 76 65 6e  tate,status,even
5b30: 74 5f 74 69 6d 65 2c 68 6f 73 74 2c 63 70 75 6c  t_time,host,cpul
5b40: 6f 61 64 2c 64 69 73 6b 66 72 65 65 2c 75 6e 61  oad,diskfree,una
5b50: 6d 65 2c 72 75 6e 64 69 72 2c 69 74 65 6d 5f 70  me,rundir,item_p
5b60: 61 74 68 2c 72 75 6e 5f 64 75 72 61 74 69 6f 6e  ath,run_duration
5b70: 2c 66 69 6e 61 6c 5f 6c 6f 67 66 2c 63 6f 6d 6d  ,final_logf,comm
5b80: 65 6e 74 20 46 52 4f 4d 20 74 65 73 74 73 20 57  ent FROM tests W
5b90: 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e  HERE run_id=? AN
5ba0: 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44  D testname=? AND
5bb0: 20 69 74 65 6d 5f 70 61 74 68 3d 3f 3b 22 0a 20   item_path=?;". 
5bc0: 20 20 20 20 72 75 6e 2d 69 64 20 74 65 73 74 6e      run-id testn
5bd0: 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 0a 20  ame item-path). 
5be0: 20 20 20 72 65 73 29 29 0a 0a 3b 3b 20 47 65 74     res))..;; Get
5bf0: 20 74 65 73 74 20 64 61 74 61 20 75 73 69 6e 67   test data using
5c00: 20 74 65 73 74 5f 69 64 0a 28 64 65 66 69 6e 65   test_id.(define
5c10: 20 28 64 62 3a 67 65 74 2d 74 65 73 74 2d 64 61   (db:get-test-da
5c20: 74 61 2d 62 79 2d 69 64 20 64 62 20 74 65 73 74  ta-by-id db test
5c30: 2d 69 64 29 0a 20 20 28 6c 65 74 20 28 28 72 65  -id).  (let ((re
5c40: 73 20 23 66 29 29 0a 20 20 20 20 28 73 71 6c 69  s #f)).    (sqli
5c50: 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77  te3:for-each-row
5c60: 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 69  .     (lambda (i
5c70: 64 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d  d run-id testnam
5c80: 65 20 73 74 61 74 65 20 73 74 61 74 75 73 20 65  e state status e
5c90: 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73 74 20 63  vent-time host c
5ca0: 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20  puload diskfree 
5cb0: 75 6e 61 6d 65 20 72 75 6e 64 69 72 20 69 74 65  uname rundir ite
5cc0: 6d 2d 70 61 74 68 20 72 75 6e 5f 64 75 72 61 74  m-path run_durat
5cd0: 69 6f 6e 20 66 69 6e 61 6c 5f 6c 6f 67 66 20 63  ion final_logf c
5ce0: 6f 6d 6d 65 6e 74 29 0a 20 20 20 20 20 20 20 28  omment).       (
5cf0: 73 65 74 21 20 72 65 73 20 28 76 65 63 74 6f 72  set! res (vector
5d00: 20 69 64 20 72 75 6e 2d 69 64 20 74 65 73 74 6e   id run-id testn
5d10: 61 6d 65 20 73 74 61 74 65 20 73 74 61 74 75 73  ame state status
5d20: 20 65 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73 74   event-time host
5d30: 20 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65   cpuload diskfre
5d40: 65 20 75 6e 61 6d 65 20 72 75 6e 64 69 72 20 69  e uname rundir i
5d50: 74 65 6d 2d 70 61 74 68 20 72 75 6e 5f 64 75 72  tem-path run_dur
5d60: 61 74 69 6f 6e 20 66 69 6e 61 6c 5f 6c 6f 67 66  ation final_logf
5d70: 20 63 6f 6d 6d 65 6e 74 29 29 29 0a 20 20 20 20   comment))).    
5d80: 20 64 62 20 0a 20 20 20 20 20 22 53 45 4c 45 43   db .     "SELEC
5d90: 54 20 69 64 2c 72 75 6e 5f 69 64 2c 74 65 73 74  T id,run_id,test
5da0: 6e 61 6d 65 2c 73 74 61 74 65 2c 73 74 61 74 75  name,state,statu
5db0: 73 2c 65 76 65 6e 74 5f 74 69 6d 65 2c 68 6f 73  s,event_time,hos
5dc0: 74 2c 63 70 75 6c 6f 61 64 2c 64 69 73 6b 66 72  t,cpuload,diskfr
5dd0: 65 65 2c 75 6e 61 6d 65 2c 72 75 6e 64 69 72 2c  ee,uname,rundir,
5de0: 69 74 65 6d 5f 70 61 74 68 2c 72 75 6e 5f 64 75  item_path,run_du
5df0: 72 61 74 69 6f 6e 2c 66 69 6e 61 6c 5f 6c 6f 67  ration,final_log
5e00: 66 2c 63 6f 6d 6d 65 6e 74 20 46 52 4f 4d 20 74  f,comment FROM t
5e10: 65 73 74 73 20 57 48 45 52 45 20 69 64 3d 3f 3b  ests WHERE id=?;
5e20: 22 0a 20 20 20 20 20 74 65 73 74 2d 69 64 29 0a  ".     test-id).
5e30: 20 20 20 20 72 65 73 29 29 0a 0a 0a 28 64 65 66      res))...(def
5e40: 69 6e 65 20 28 64 62 3a 74 65 73 74 2d 73 65 74  ine (db:test-set
5e50: 2d 63 6f 6d 6d 65 6e 74 20 64 62 20 74 65 73 74  -comment db test
5e60: 2d 69 64 20 63 6f 6d 6d 65 6e 74 29 0a 20 20 28  -id comment).  (
5e70: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
5e80: 0a 20 20 20 64 62 20 0a 20 20 20 22 55 50 44 41  .   db .   "UPDA
5e90: 54 45 20 74 65 73 74 73 20 53 45 54 20 63 6f 6d  TE tests SET com
5ea0: 6d 65 6e 74 3d 3f 20 57 48 45 52 45 20 69 64 3d  ment=? WHERE id=
5eb0: 3f 3b 22 0a 20 20 20 63 6f 6d 6d 65 6e 74 20 74  ?;".   comment t
5ec0: 65 73 74 2d 69 64 29 29 0a 0a 3b 3b 0a 28 64 65  est-id))..;;.(de
5ed0: 66 69 6e 65 20 28 64 62 3a 74 65 73 74 2d 73 65  fine (db:test-se
5ee0: 74 2d 72 75 6e 64 69 72 21 20 64 62 20 72 75 6e  t-rundir! db run
5ef0: 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74  -id test-name it
5f00: 65 6d 2d 70 61 74 68 20 72 75 6e 64 69 72 29 0a  em-path rundir).
5f10: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
5f20: 74 65 20 0a 20 20 20 64 62 20 0a 20 20 20 22 55  te .   db .   "U
5f30: 50 44 41 54 45 20 74 65 73 74 73 20 53 45 54 20  PDATE tests SET 
5f40: 72 75 6e 64 69 72 3d 3f 20 57 48 45 52 45 20 72  rundir=? WHERE r
5f50: 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74  un_id=? AND test
5f60: 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f  name=? AND item_
5f70: 70 61 74 68 3d 3f 3b 22 0a 20 20 20 72 75 6e 64  path=?;".   rund
5f80: 69 72 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e  ir run-id test-n
5f90: 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 29 0a  ame item-path)).
5fa0: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73  .(define (db:tes
5fb0: 74 2d 73 65 74 2d 6c 6f 67 21 20 64 62 20 74 65  t-set-log! db te
5fc0: 73 74 2d 69 64 20 6c 6f 67 66 29 0a 20 20 28 69  st-id logf).  (i
5fd0: 66 20 28 73 74 72 69 6e 67 3f 20 6c 6f 67 66 29  f (string? logf)
5fe0: 0a 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a  .      (sqlite3:
5ff0: 65 78 65 63 75 74 65 20 64 62 20 22 55 50 44 41  execute db "UPDA
6000: 54 45 20 74 65 73 74 73 20 53 45 54 20 66 69 6e  TE tests SET fin
6010: 61 6c 5f 6c 6f 67 66 3d 3f 20 57 48 45 52 45 20  al_logf=? WHERE 
6020: 69 64 3d 3f 3b 22 0a 09 09 20 20 20 6c 6f 67 66  id=?;"...   logf
6030: 20 74 65 73 74 2d 69 64 29 0a 20 20 20 20 20 20   test-id).      
6040: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 30 20 22  (debug:print 0 "
6050: 45 52 52 4f 52 3a 20 64 62 3a 74 65 73 74 2d 73  ERROR: db:test-s
6060: 65 74 2d 6c 6f 67 21 20 63 61 6c 6c 65 64 20 77  et-log! called w
6070: 69 74 68 20 6e 6f 6e 2d 73 74 72 69 6e 67 20 6c  ith non-string l
6080: 6f 67 20 66 69 6c 65 20 6e 61 6d 65 20 22 20 6c  og file name " l
6090: 6f 67 66 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d  ogf)))..;;======
60a0: 3d 3d 3d 3d 3d 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: 0a 3b 3b 20 4d 69 73 63 2e 20 74 65 73 74 20 72  .;; Misc. test r
60f0: 65 6c 61 74 65 64 20 71 75 65 72 69 65 73 0a 3b  elated queries.;
6100: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;===============
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 0a 0a 28 64 65 66 69 6e 65  =======..(define
6150: 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 70 61   (db:test-get-pa
6160: 74 68 73 2d 6d 61 74 63 68 69 6e 67 20 64 62 20  ths-matching db 
6170: 6b 65 79 6e 61 6d 65 73 20 74 61 72 67 65 74 29  keynames target)
6180: 0a 20 20 28 6c 65 74 2a 20 28 28 72 65 73 20 27  .  (let* ((res '
6190: 28 29 29 0a 09 20 28 69 74 65 6d 70 61 74 74 20  ()).. (itempatt 
61a0: 20 20 28 69 66 20 28 61 72 67 73 3a 67 65 74 2d    (if (args:get-
61b0: 61 72 67 20 22 2d 69 74 65 6d 70 61 74 74 22 29  arg "-itempatt")
61c0: 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22 2d  (args:get-arg "-
61d0: 69 74 65 6d 70 61 74 74 22 29 20 22 25 22 29 29  itempatt") "%"))
61e0: 0a 09 20 28 74 65 73 74 70 61 74 74 20 20 20 28  .. (testpatt   (
61f0: 69 66 20 28 61 72 67 73 3a 67 65 74 2d 61 72 67  if (args:get-arg
6200: 20 22 2d 74 65 73 74 70 61 74 74 22 29 28 61 72   "-testpatt")(ar
6210: 67 73 3a 67 65 74 2d 61 72 67 20 22 2d 74 65 73  gs:get-arg "-tes
6220: 74 70 61 74 74 22 29 20 22 25 22 29 29 0a 09 20  tpatt") "%")).. 
6230: 28 73 74 61 74 65 70 61 74 74 20 20 28 69 66 20  (statepatt  (if 
6240: 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22 3a  (args:get-arg ":
6250: 73 74 61 74 65 22 29 20 20 20 28 61 72 67 73 3a  state")   (args:
6260: 67 65 74 2d 61 72 67 20 22 3a 73 74 61 74 65 22  get-arg ":state"
6270: 29 20 20 20 20 22 25 22 29 29 0a 09 20 28 73 74  )    "%")).. (st
6280: 61 74 75 73 70 61 74 74 20 28 69 66 20 28 61 72  atuspatt (if (ar
6290: 67 73 3a 67 65 74 2d 61 72 67 20 22 3a 73 74 61  gs:get-arg ":sta
62a0: 74 75 73 22 29 20 20 28 61 72 67 73 3a 67 65 74  tus")  (args:get
62b0: 2d 61 72 67 20 22 3a 73 74 61 74 75 73 22 29 20  -arg ":status") 
62c0: 20 20 22 25 22 29 29 0a 09 20 28 72 75 6e 6e 61    "%")).. (runna
62d0: 6d 65 20 20 20 20 28 69 66 20 28 61 72 67 73 3a  me    (if (args:
62e0: 67 65 74 2d 61 72 67 20 22 3a 72 75 6e 6e 61 6d  get-arg ":runnam
62f0: 65 22 29 20 28 61 72 67 73 3a 67 65 74 2d 61 72  e") (args:get-ar
6300: 67 20 22 3a 72 75 6e 6e 61 6d 65 22 29 20 20 22  g ":runname")  "
6310: 25 22 29 29 0a 09 20 28 6b 65 79 73 74 72 20 28  %")).. (keystr (
6320: 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72  string-intersper
6330: 73 65 20 0a 09 09 20 20 28 6d 61 70 20 28 6c 61  se ...  (map (la
6340: 6d 62 64 61 20 28 6b 65 79 20 76 61 6c 29 0a 09  mbda (key val)..
6350: 09 09 20 28 63 6f 6e 63 20 22 72 2e 22 20 6b 65  .. (conc "r." ke
6360: 79 20 22 20 6c 69 6b 65 20 27 22 20 76 61 6c 20  y " like '" val 
6370: 22 27 22 29 29 0a 09 09 20 20 20 20 20 20 20 6b  "'"))...       k
6380: 65 79 6e 61 6d 65 73 20 0a 09 09 20 20 20 20 20  eynames ...     
6390: 20 20 28 73 74 72 69 6e 67 2d 73 70 6c 69 74 20    (string-split 
63a0: 74 61 72 67 65 74 20 22 2f 22 29 29 0a 09 09 20  target "/"))... 
63b0: 20 22 20 41 4e 44 20 22 29 29 0a 09 20 28 71 72   " AND ")).. (qr
63c0: 79 73 74 72 20 28 63 6f 6e 63 20 22 53 45 4c 45  ystr (conc "SELE
63d0: 43 54 20 74 2e 72 75 6e 64 69 72 20 46 52 4f 4d  CT t.rundir FROM
63e0: 20 74 65 73 74 73 20 41 53 20 74 20 49 4e 4e 45   tests AS t INNE
63f0: 52 20 4a 4f 49 4e 20 72 75 6e 73 20 41 53 20 72  R JOIN runs AS r
6400: 20 4f 4e 20 74 2e 72 75 6e 5f 69 64 3d 72 2e 69   ON t.run_id=r.i
6410: 64 20 57 48 45 52 45 20 22 0a 09 09 20 20 20 20  d WHERE "...    
6420: 20 20 20 6b 65 79 73 74 72 20 22 20 41 4e 44 20     keystr " AND 
6430: 72 2e 72 75 6e 6e 61 6d 65 20 4c 49 4b 45 20 27  r.runname LIKE '
6440: 22 20 72 75 6e 6e 61 6d 65 20 22 27 20 41 4e 44  " runname "' AND
6450: 20 69 74 65 6d 5f 70 61 74 68 20 4c 49 4b 45 20   item_path LIKE 
6460: 27 22 20 69 74 65 6d 70 61 74 74 20 22 27 20 41  '" itempatt "' A
6470: 4e 44 20 74 65 73 74 6e 61 6d 65 20 4c 49 4b 45  ND testname LIKE
6480: 20 27 22 0a 09 09 20 20 20 20 20 20 20 74 65 73   '"...       tes
6490: 74 70 61 74 74 20 22 27 20 41 4e 44 20 74 2e 73  tpatt "' AND t.s
64a0: 74 61 74 65 20 4c 49 4b 45 20 27 22 20 73 74 61  tate LIKE '" sta
64b0: 74 65 70 61 74 74 20 22 27 20 41 4e 44 20 74 2e  tepatt "' AND t.
64c0: 73 74 61 74 75 73 20 4c 49 4b 45 20 27 22 20 73  status LIKE '" s
64d0: 74 61 74 75 73 70 61 74 74 20 0a 09 09 20 20 20  tatuspatt ...   
64e0: 20 20 20 20 22 27 4f 52 44 45 52 20 42 59 20 74      "'ORDER BY t
64f0: 2e 65 76 65 6e 74 5f 74 69 6d 65 20 41 53 43 3b  .event_time ASC;
6500: 22 29 29 29 0a 20 20 20 20 28 64 65 62 75 67 3a  "))).    (debug:
6510: 70 72 69 6e 74 20 33 20 22 71 72 79 73 74 72 3a  print 3 "qrystr:
6520: 20 22 20 71 72 79 73 74 72 29 0a 20 20 20 20 28   " qrystr).    (
6530: 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68  sqlite3:for-each
6540: 2d 72 6f 77 20 0a 20 20 20 20 20 28 6c 61 6d 62  -row .     (lamb
6550: 64 61 20 28 70 29 0a 20 20 20 20 20 20 20 28 73  da (p).       (s
6560: 65 74 21 20 72 65 73 20 28 63 6f 6e 73 20 70 20  et! res (cons p 
6570: 72 65 73 29 29 29 0a 20 20 20 20 20 64 62 20 0a  res))).     db .
6580: 20 20 20 20 20 71 72 79 73 74 72 29 0a 20 20 20       qrystr).   
6590: 20 72 65 73 29 29 0a 0a 28 64 65 66 69 6e 65 20   res))..(define 
65a0: 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 74 65 73  (db:test-get-tes
65b0: 74 2d 72 65 63 6f 72 64 73 2d 6d 61 74 63 68 69  t-records-matchi
65c0: 6e 67 20 64 62 20 6b 65 79 6e 61 6d 65 73 20 74  ng db keynames t
65d0: 61 72 67 65 74 29 0a 20 20 28 6c 65 74 2a 20 28  arget).  (let* (
65e0: 28 72 65 73 20 27 28 29 29 0a 09 20 28 69 74 65  (res '()).. (ite
65f0: 6d 70 61 74 74 20 20 20 28 69 66 20 28 61 72 67  mpatt   (if (arg
6600: 73 3a 67 65 74 2d 61 72 67 20 22 2d 69 74 65 6d  s:get-arg "-item
6610: 70 61 74 74 22 29 28 61 72 67 73 3a 67 65 74 2d  patt")(args:get-
6620: 61 72 67 20 22 2d 69 74 65 6d 70 61 74 74 22 29  arg "-itempatt")
6630: 20 22 25 22 29 29 0a 09 20 28 74 65 73 74 70 61   "%")).. (testpa
6640: 74 74 20 20 20 28 69 66 20 28 61 72 67 73 3a 67  tt   (if (args:g
6650: 65 74 2d 61 72 67 20 22 2d 74 65 73 74 70 61 74  et-arg "-testpat
6660: 74 22 29 28 61 72 67 73 3a 67 65 74 2d 61 72 67  t")(args:get-arg
6670: 20 22 2d 74 65 73 74 70 61 74 74 22 29 20 22 25   "-testpatt") "%
6680: 22 29 29 0a 09 20 28 73 74 61 74 65 70 61 74 74  ")).. (statepatt
6690: 20 20 28 69 66 20 28 61 72 67 73 3a 67 65 74 2d    (if (args:get-
66a0: 61 72 67 20 22 3a 73 74 61 74 65 22 29 20 20 20  arg ":state")   
66b0: 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22 3a  (args:get-arg ":
66c0: 73 74 61 74 65 22 29 20 20 20 20 22 25 22 29 29  state")    "%"))
66d0: 0a 09 20 28 73 74 61 74 75 73 70 61 74 74 20 28  .. (statuspatt (
66e0: 69 66 20 28 61 72 67 73 3a 67 65 74 2d 61 72 67  if (args:get-arg
66f0: 20 22 3a 73 74 61 74 75 73 22 29 20 20 28 61 72   ":status")  (ar
6700: 67 73 3a 67 65 74 2d 61 72 67 20 22 3a 73 74 61  gs:get-arg ":sta
6710: 74 75 73 22 29 20 20 20 22 25 22 29 29 0a 09 20  tus")   "%")).. 
6720: 28 72 75 6e 6e 61 6d 65 20 20 20 20 28 69 66 20  (runname    (if 
6730: 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22 3a  (args:get-arg ":
6740: 72 75 6e 6e 61 6d 65 22 29 20 28 61 72 67 73 3a  runname") (args:
6750: 67 65 74 2d 61 72 67 20 22 3a 72 75 6e 6e 61 6d  get-arg ":runnam
6760: 65 22 29 20 20 22 25 22 29 29 0a 09 20 28 6b 65  e")  "%")).. (ke
6770: 79 73 74 72 20 28 73 74 72 69 6e 67 2d 69 6e 74  ystr (string-int
6780: 65 72 73 70 65 72 73 65 20 0a 09 09 20 20 28 6d  ersperse ...  (m
6790: 61 70 20 28 6c 61 6d 62 64 61 20 28 6b 65 79 20  ap (lambda (key 
67a0: 76 61 6c 29 0a 09 09 09 20 28 63 6f 6e 63 20 22  val).... (conc "
67b0: 72 2e 22 20 6b 65 79 20 22 20 6c 69 6b 65 20 27  r." key " like '
67c0: 22 20 76 61 6c 20 22 27 22 29 29 0a 09 09 20 20  " val "'"))...  
67d0: 20 20 20 20 20 6b 65 79 6e 61 6d 65 73 20 0a 09       keynames ..
67e0: 09 20 20 20 20 20 20 20 28 73 74 72 69 6e 67 2d  .       (string-
67f0: 73 70 6c 69 74 20 74 61 72 67 65 74 20 22 2f 22  split target "/"
6800: 29 29 0a 09 09 20 20 22 20 41 4e 44 20 22 29 29  ))...  " AND "))
6810: 0a 09 20 28 71 72 79 73 74 72 20 28 63 6f 6e 63  .. (qrystr (conc
6820: 20 22 53 45 4c 45 43 54 20 0a 20 20 20 20 20 20   "SELECT .      
6830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6840: 20 20 20 20 20 20 74 2e 69 64 0a 20 20 20 20 20        t.id.     
6850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6860: 20 20 20 20 20 20 20 74 2e 72 75 6e 5f 69 64 20         t.run_id 
6870: 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20      .           
6880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6890: 20 74 2e 74 65 73 74 6e 61 6d 65 20 20 20 0a 20   t.testname   . 
68a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68b0: 20 20 20 20 20 20 20 20 20 20 20 74 2e 68 6f 73             t.hos
68c0: 74 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20  t       .       
68d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68e0: 20 20 20 20 20 74 2e 63 70 75 6c 6f 61 64 20 20       t.cpuload  
68f0: 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20    .             
6900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
6910: 2e 64 69 73 6b 66 72 65 65 20 20 20 0a 20 20 20  .diskfree   .   
6920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6930: 20 20 20 20 20 20 20 20 20 74 2e 75 6e 61 6d 65           t.uname
6940: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20        .         
6950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6960: 20 20 20 74 2e 72 75 6e 64 69 72 20 20 20 20 20     t.rundir     
6970: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6980: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 2e 73               t.s
6990: 68 6f 72 74 64 69 72 20 20 20 0a 20 20 20 20 20  hortdir   .     
69a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69b0: 20 20 20 20 20 20 20 74 2e 69 74 65 6d 5f 70 61         t.item_pa
69c0: 74 68 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  th  .           
69d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69e0: 20 74 2e 73 74 61 74 65 20 20 20 20 20 20 0a 20   t.state      . 
69f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a00: 20 20 20 20 20 20 20 20 20 20 20 74 2e 73 74 61             t.sta
6a10: 74 75 73 20 20 20 20 20 0a 20 20 20 20 20 20 20  tus     .       
6a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a30: 20 20 20 20 20 74 2e 61 74 74 65 6d 70 74 6e 75       t.attemptnu
6a40: 6d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m .             
6a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
6a60: 2e 66 69 6e 61 6c 5f 6c 6f 67 66 20 0a 20 20 20  .final_logf .   
6a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a80: 20 20 20 20 20 20 20 20 20 74 2e 6c 6f 67 64 61           t.logda
6a90: 74 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20  t     .         
6aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ab0: 20 20 20 74 2e 72 75 6e 5f 64 75 72 61 74 69 6f     t.run_duratio
6ac0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 2e 63               t.c
6ae0: 6f 6d 6d 65 6e 74 20 20 20 20 0a 20 20 20 20 20  omment    .     
6af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b00: 20 20 20 20 20 20 20 74 2e 65 76 65 6e 74 5f 74         t.event_t
6b10: 69 6d 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  ime .           
6b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b30: 20 74 2e 66 61 69 6c 5f 63 6f 75 6e 74 20 0a 20   t.fail_count . 
6b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b50: 20 20 20 20 20 20 20 20 20 20 20 74 2e 70 61 73             t.pas
6b60: 73 5f 63 6f 75 6e 74 20 0a 20 20 20 20 20 20 20  s_count .       
6b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b80: 20 20 20 20 20 74 2e 61 72 63 68 69 76 65 64 20       t.archived 
6b90: 20 20 0a 0a 0a 0a 20 46 52 4f 4d 20 74 65 73 74    .... FROM test
6ba0: 73 20 41 53 20 74 20 49 4e 4e 45 52 20 4a 4f 49  s AS t INNER JOI
6bb0: 4e 20 72 75 6e 73 20 41 53 20 72 20 4f 4e 20 74  N runs AS r ON t
6bc0: 2e 72 75 6e 5f 69 64 3d 72 2e 69 64 20 57 48 45  .run_id=r.id WHE
6bd0: 52 45 20 22 0a 09 09 20 20 20 20 20 20 20 6b 65  RE "...       ke
6be0: 79 73 74 72 20 22 20 41 4e 44 20 72 2e 72 75 6e  ystr " AND r.run
6bf0: 6e 61 6d 65 20 4c 49 4b 45 20 27 22 20 72 75 6e  name LIKE '" run
6c00: 6e 61 6d 65 20 22 27 20 41 4e 44 20 69 74 65 6d  name "' AND item
6c10: 5f 70 61 74 68 20 4c 49 4b 45 20 27 22 20 69 74  _path LIKE '" it
6c20: 65 6d 70 61 74 74 20 22 27 20 41 4e 44 20 74 65  empatt "' AND te
6c30: 73 74 6e 61 6d 65 20 4c 49 4b 45 20 27 22 0a 09  stname LIKE '"..
6c40: 09 20 20 20 20 20 20 20 74 65 73 74 70 61 74 74  .       testpatt
6c50: 20 22 27 20 41 4e 44 20 74 2e 73 74 61 74 65 20   "' AND t.state 
6c60: 4c 49 4b 45 20 27 22 20 73 74 61 74 65 70 61 74  LIKE '" statepat
6c70: 74 20 22 27 20 41 4e 44 20 74 2e 73 74 61 74 75  t "' AND t.statu
6c80: 73 20 4c 49 4b 45 20 27 22 20 73 74 61 74 75 73  s LIKE '" status
6c90: 70 61 74 74 20 0a 09 09 20 20 20 20 20 20 20 22  patt ...       "
6ca0: 27 4f 52 44 45 52 20 42 59 20 74 2e 65 76 65 6e  'ORDER BY t.even
6cb0: 74 5f 74 69 6d 65 20 41 53 43 3b 22 29 29 29 0a  t_time ASC;"))).
6cc0: 20 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74      (debug:print
6cd0: 20 33 20 22 71 72 79 73 74 72 3a 20 22 20 71 72   3 "qrystr: " qr
6ce0: 79 73 74 72 29 0a 20 20 20 20 28 73 71 6c 69 74  ystr).    (sqlit
6cf0: 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20  e3:for-each-row 
6d00: 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 70  .     (lambda (p
6d10: 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72  ).       (set! r
6d20: 65 73 20 28 63 6f 6e 73 20 70 20 72 65 73 29 29  es (cons p res))
6d30: 29 0a 20 20 20 20 20 64 62 20 0a 20 20 20 20 20  ).     db .     
6d40: 71 72 79 73 74 72 29 0a 20 20 20 20 72 65 73 29  qrystr).    res)
6d50: 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  )..;;===========
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 0a 3b 3b 20 51  ===========.;; Q
6da0: 55 45 55 45 20 55 50 20 4d 45 54 41 2c 20 54 45  UEUE UP META, TE
6db0: 53 54 20 53 54 41 54 55 53 20 41 4e 44 20 53 54  ST STATUS AND ST
6dc0: 45 50 53 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  EPS.;;==========
6dd0: 3d 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 0a 0a 28 64  ============..(d
6e10: 65 66 69 6e 65 20 28 64 62 3a 75 70 64 61 74 65  efine (db:update
6e20: 72 20 64 62 29 0a 20 20 28 6c 65 74 20 6c 6f 6f  r db).  (let loo
6e30: 70 20 28 28 73 74 61 72 74 2d 74 69 6d 65 20 28  p ((start-time (
6e40: 63 75 72 72 65 6e 74 2d 74 69 6d 65 29 29 29 0a  current-time))).
6e50: 20 20 20 20 28 74 68 72 65 61 64 2d 73 6c 65 65      (thread-slee
6e60: 70 21 20 30 2e 35 29 20 3b 3b 20 6d 6f 76 65 20  p! 0.5) ;; move 
6e70: 73 61 76 65 20 74 69 6d 65 20 61 72 6f 75 6e 64  save time around
6e80: 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 72 65 67   to minimize reg
6e90: 75 6c 61 72 20 63 6f 6c 6c 69 73 69 6f 6e 73 3f  ular collisions?
6ea0: 0a 20 20 20 20 28 64 62 3a 77 72 69 74 65 2d 63  .    (db:write-c
6eb0: 61 63 68 65 64 2d 64 61 74 61 20 64 62 29 0a 20  ached-data db). 
6ec0: 20 20 20 28 6c 6f 6f 70 20 73 74 61 72 74 2d 74     (loop start-t
6ed0: 69 6d 65 29 29 29 0a 20 20 20 20 0a 28 64 65 66  ime))).    .(def
6ee0: 69 6e 65 20 28 64 62 3a 74 65 73 74 2d 75 70 64  ine (db:test-upd
6ef0: 61 74 65 2d 6d 65 74 61 2d 69 6e 66 6f 20 64 62  ate-meta-info db
6f00: 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d   run-id test-nam
6f10: 65 20 69 74 65 6d 2d 70 61 74 68 20 6d 69 6e 75  e item-path minu
6f20: 74 65 73 20 63 70 75 6c 6f 61 64 20 64 69 73 6b  tes cpuload disk
6f30: 66 72 65 65 20 74 6d 70 66 72 65 65 29 0a 20 20  free tmpfree).  
6f40: 28 69 66 20 28 6e 6f 74 20 69 74 65 6d 2d 70 61  (if (not item-pa
6f50: 74 68 29 0a 20 20 20 20 20 20 28 62 65 67 69 6e  th).      (begin
6f60: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 30 20   (debug:print 0 
6f70: 22 57 41 52 4e 49 4e 47 3a 20 49 54 45 4d 50 41  "WARNING: ITEMPA
6f80: 54 48 20 6e 6f 74 20 73 65 74 2e 22 29 20 20 20  TH not set.")   
6f90: 0a 09 20 20 20 20 20 28 73 65 74 21 20 69 74 65  ..     (set! ite
6fa0: 6d 2d 70 61 74 68 20 22 22 29 29 29 0a 20 20 28  m-path ""))).  (
6fb0: 6d 75 74 65 78 2d 6c 6f 63 6b 21 20 2a 69 6e 63  mutex-lock! *inc
6fc0: 6f 6d 69 6e 67 2d 6d 75 74 65 78 2a 29 0a 20 20  oming-mutex*).  
6fd0: 28 73 65 74 21 20 2a 69 6e 63 6f 6d 69 6e 67 2d  (set! *incoming-
6fe0: 64 61 74 61 2a 20 28 63 6f 6e 73 20 28 76 65 63  data* (cons (vec
6ff0: 74 6f 72 20 27 6d 65 74 61 2d 69 6e 66 6f 0a 09  tor 'meta-info..
7000: 09 09 09 20 20 20 20 20 20 28 63 75 72 72 65 6e  ...      (curren
7010: 74 2d 73 65 63 6f 6e 64 73 29 0a 09 09 09 09 20  t-seconds)..... 
7020: 20 20 20 20 20 28 6c 69 73 74 20 63 70 75 6c 6f       (list cpulo
7030: 61 64 0a 09 09 09 09 09 20 20 20 20 64 69 73 6b  ad......    disk
7040: 66 72 65 65 0a 09 09 09 09 09 20 20 20 20 6d 69  free......    mi
7050: 6e 75 74 65 73 0a 09 09 09 09 09 20 20 20 20 72  nutes......    r
7060: 75 6e 2d 69 64 0a 09 09 09 09 09 20 20 20 20 74  un-id......    t
7070: 65 73 74 2d 6e 61 6d 65 0a 09 09 09 09 09 20 20  est-name......  
7080: 20 20 69 74 65 6d 2d 70 61 74 68 29 29 20 3b 3b    item-path)) ;;
7090: 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d   run-id test-nam
70a0: 65 20 69 74 65 6d 2d 70 61 74 68 20 6d 69 6e 75  e item-path minu
70b0: 74 65 73 20 63 70 75 6c 6f 61 64 20 64 69 73 6b  tes cpuload disk
70c0: 66 72 65 65 20 74 6d 70 66 72 65 65 29 20 0a 09  free tmpfree) ..
70d0: 09 09 20 20 20 20 20 20 2a 69 6e 63 6f 6d 69 6e  ..      *incomin
70e0: 67 2d 64 61 74 61 2a 29 29 0a 20 20 28 6d 75 74  g-data*)).  (mut
70f0: 65 78 2d 75 6e 6c 6f 63 6b 21 20 2a 69 6e 63 6f  ex-unlock! *inco
7100: 6d 69 6e 67 2d 6d 75 74 65 78 2a 29 0a 20 20 28  ming-mutex*).  (
7110: 69 66 20 28 6e 6f 74 20 2a 63 61 63 68 65 2d 6f  if (not *cache-o
7120: 6e 2a 29 28 64 62 3a 77 72 69 74 65 2d 63 61 63  n*)(db:write-cac
7130: 68 65 64 2d 64 61 74 61 20 64 62 29 29 29 0a 0a  hed-data db)))..
7140: 28 64 65 66 69 6e 65 20 28 64 62 3a 77 72 69 74  (define (db:writ
7150: 65 2d 63 61 63 68 65 64 2d 64 61 74 61 20 64 62  e-cached-data db
7160: 29 0a 20 20 28 6c 65 74 20 28 28 6d 65 74 61 2d  ).  (let ((meta-
7170: 73 74 6d 74 20 28 73 71 6c 69 74 65 33 3a 70 72  stmt (sqlite3:pr
7180: 65 70 61 72 65 20 64 62 20 22 55 50 44 41 54 45  epare db "UPDATE
7190: 20 74 65 73 74 73 20 53 45 54 20 63 70 75 6c 6f   tests SET cpulo
71a0: 61 64 3d 3f 2c 64 69 73 6b 66 72 65 65 3d 3f 2c  ad=?,diskfree=?,
71b0: 72 75 6e 5f 64 75 72 61 74 69 6f 6e 3d 3f 2c 73  run_duration=?,s
71c0: 74 61 74 65 3d 27 52 55 4e 4e 49 4e 47 27 20 57  tate='RUNNING' W
71d0: 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e  HERE run_id=? AN
71e0: 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44  D testname=? AND
71f0: 20 69 74 65 6d 5f 70 61 74 68 3d 3f 20 41 4e 44   item_path=? AND
7200: 20 73 74 61 74 65 20 4e 4f 54 20 49 4e 20 28 27   state NOT IN ('
7210: 43 4f 4d 50 4c 45 54 45 44 27 2c 27 4b 49 4c 4c  COMPLETED','KILL
7220: 52 45 51 27 2c 27 4b 49 4c 4c 45 44 27 29 3b 22  REQ','KILLED');"
7230: 29 29 0a 09 28 73 74 65 70 2d 73 74 6d 74 20 28  ))..(step-stmt (
7240: 73 71 6c 69 74 65 33 3a 70 72 65 70 61 72 65 20  sqlite3:prepare 
7250: 64 62 20 22 49 4e 53 45 52 54 20 4f 52 20 52 45  db "INSERT OR RE
7260: 50 4c 41 43 45 20 69 6e 74 6f 20 74 65 73 74 5f  PLACE into test_
7270: 73 74 65 70 73 20 28 74 65 73 74 5f 69 64 2c 73  steps (test_id,s
7280: 74 65 70 6e 61 6d 65 2c 73 74 61 74 65 2c 73 74  tepname,state,st
7290: 61 74 75 73 2c 65 76 65 6e 74 5f 74 69 6d 65 2c  atus,event_time,
72a0: 63 6f 6d 6d 65 6e 74 2c 6c 6f 67 66 69 6c 65 29  comment,logfile)
72b0: 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f 2c 3f 2c   VALUES(?,?,?,?,
72c0: 3f 2c 3f 2c 3f 29 3b 22 29 29 20 3b 3b 20 73 74  ?,?,?);")) ;; st
72d0: 72 66 74 69 6d 65 28 27 25 73 27 2c 27 6e 6f 77  rftime('%s','now
72e0: 27 29 23 66 29 0a 09 28 64 61 74 61 20 28 73 6f  ')#f)..(data (so
72f0: 72 74 20 2a 69 6e 63 6f 6d 69 6e 67 2d 64 61 74  rt *incoming-dat
7300: 61 2a 20 28 6c 61 6d 62 64 61 20 28 61 20 62 29  a* (lambda (a b)
7310: 28 3c 20 28 76 65 63 74 6f 72 2d 72 65 66 20 61  (< (vector-ref a
7320: 20 31 29 28 76 65 63 74 6f 72 2d 72 65 66 20 62   1)(vector-ref b
7330: 20 31 29 29 29 29 29 29 0a 20 20 20 20 28 69 66   1)))))).    (if
7340: 20 28 3e 20 28 6c 65 6e 67 74 68 20 64 61 74 61   (> (length data
7350: 29 20 30 29 0a 09 28 64 65 62 75 67 3a 70 72 69  ) 0)..(debug:pri
7360: 6e 74 20 34 20 22 57 72 69 74 69 6e 67 20 63 61  nt 4 "Writing ca
7370: 63 68 65 64 20 64 61 74 61 20 22 20 64 61 74 61  ched data " data
7380: 29 29 0a 20 20 20 20 28 6d 75 74 65 78 2d 6c 6f  )).    (mutex-lo
7390: 63 6b 21 20 2a 69 6e 63 6f 6d 69 6e 67 2d 6d 75  ck! *incoming-mu
73a0: 74 65 78 2a 29 0a 20 20 20 20 28 73 71 6c 69 74  tex*).    (sqlit
73b0: 65 33 3a 77 69 74 68 2d 74 72 61 6e 73 61 63 74  e3:with-transact
73c0: 69 6f 6e 20 0a 20 20 20 20 20 64 62 0a 20 20 20  ion .     db.   
73d0: 20 20 28 6c 61 6d 62 64 61 20 28 29 0a 20 20 20    (lambda ().   
73e0: 20 20 20 20 28 66 6f 72 2d 65 61 63 68 20 28 6c      (for-each (l
73f0: 61 6d 62 64 61 20 28 65 6e 74 72 79 29 0a 09 09  ambda (entry)...
7400: 20 20 20 28 63 61 73 65 20 28 76 65 63 74 6f 72     (case (vector
7410: 2d 72 65 66 20 65 6e 74 72 79 20 30 29 0a 09 09  -ref entry 0)...
7420: 20 20 20 20 20 28 28 6d 65 74 61 2d 69 6e 66 6f       ((meta-info
7430: 29 0a 09 09 20 20 20 20 20 20 28 61 70 70 6c 79  )...      (apply
7440: 20 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65   sqlite3:execute
7450: 20 6d 65 74 61 2d 73 74 6d 74 20 28 76 65 63 74   meta-stmt (vect
7460: 6f 72 2d 72 65 66 20 65 6e 74 72 79 20 32 29 29  or-ref entry 2))
7470: 29 0a 09 09 20 20 20 20 20 28 28 73 74 65 70 2d  )...     ((step-
7480: 73 74 61 74 75 73 29 0a 09 09 20 20 20 20 20 20  status)...      
7490: 28 61 70 70 6c 79 20 73 71 6c 69 74 65 33 3a 65  (apply sqlite3:e
74a0: 78 65 63 75 74 65 20 73 74 65 70 2d 73 74 6d 74  xecute step-stmt
74b0: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 65 6e 74   (vector-ref ent
74c0: 72 79 20 32 29 29 29 0a 09 09 20 20 20 20 20 28  ry 2)))...     (
74d0: 65 6c 73 65 0a 09 09 20 20 20 20 20 20 28 64 65  else...      (de
74e0: 62 75 67 3a 70 72 69 6e 74 20 30 20 22 45 52 52  bug:print 0 "ERR
74f0: 4f 52 3a 20 51 75 65 75 65 64 20 65 6e 74 72 79  OR: Queued entry
7500: 20 6e 6f 74 20 72 65 63 6f 67 6e 69 73 65 64 20   not recognised 
7510: 22 20 65 6e 74 72 79 29 29 29 29 0a 09 09 20 64  " entry))))... d
7520: 61 74 61 29 29 29 0a 20 20 20 20 28 73 71 6c 69  ata))).    (sqli
7530: 74 65 33 3a 66 69 6e 61 6c 69 7a 65 21 20 6d 65  te3:finalize! me
7540: 74 61 2d 73 74 6d 74 29 20 3b 3b 20 73 71 6c 69  ta-stmt) ;; sqli
7550: 74 65 20 69 73 20 74 68 65 20 62 6f 74 74 6c 65  te is the bottle
7560: 6e 65 63 6b 2c 20 63 6c 65 61 72 20 74 68 65 20  neck, clear the 
7570: 73 74 61 74 65 6d 65 6e 74 73 20 61 73 61 70 3f  statements asap?
7580: 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 69  .    (sqlite3:fi
7590: 6e 61 6c 69 7a 65 21 20 73 74 65 70 2d 73 74 6d  nalize! step-stm
75a0: 74 29 0a 20 20 20 20 28 73 65 74 21 20 2a 69 6e  t).    (set! *in
75b0: 63 6f 6d 69 6e 67 2d 64 61 74 61 2a 20 27 28 29  coming-data* '()
75c0: 29 0a 20 20 20 20 28 6d 75 74 65 78 2d 75 6e 6c  ).    (mutex-unl
75d0: 6f 63 6b 21 20 2a 69 6e 63 6f 6d 69 6e 67 2d 6d  ock! *incoming-m
75e0: 75 74 65 78 2a 29 29 29 0a 0a 28 64 65 66 69 6e  utex*)))..(defin
75f0: 65 20 28 64 62 3a 72 6f 6c 6c 2d 75 70 2d 70 61  e (db:roll-up-pa
7600: 73 73 2d 66 61 69 6c 2d 63 6f 75 6e 74 73 20 64  ss-fail-counts d
7610: 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61  b run-id test-na
7620: 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 73 74 61  me item-path sta
7630: 74 75 73 29 0a 20 20 28 69 66 20 28 61 6e 64 20  tus).  (if (and 
7640: 28 6e 6f 74 20 28 65 71 75 61 6c 3f 20 69 74 65  (not (equal? ite
7650: 6d 2d 70 61 74 68 20 22 22 29 29 0a 09 20 20 20  m-path ""))..   
7660: 28 6f 72 20 28 65 71 75 61 6c 3f 20 73 74 61 74  (or (equal? stat
7670: 75 73 20 22 50 41 53 53 22 29 0a 09 20 20 20 20  us "PASS")..    
7680: 20 20 20 28 65 71 75 61 6c 3f 20 73 74 61 74 75     (equal? statu
7690: 73 20 22 57 41 52 4e 22 29 0a 09 20 20 20 20 20  s "WARN")..     
76a0: 20 20 28 65 71 75 61 6c 3f 20 73 74 61 74 75 73    (equal? status
76b0: 20 22 46 41 49 4c 22 29 0a 09 20 20 20 20 20 20   "FAIL")..      
76c0: 20 28 65 71 75 61 6c 3f 20 73 74 61 74 75 73 20   (equal? status 
76d0: 22 57 41 49 56 45 44 22 29 0a 09 20 20 20 20 20  "WAIVED")..     
76e0: 20 20 28 65 71 75 61 6c 3f 20 73 74 61 74 75 73    (equal? status
76f0: 20 22 52 55 4e 4e 49 4e 47 22 29 29 29 0a 20 20   "RUNNING"))).  
7700: 20 20 20 20 28 62 65 67 69 6e 0a 09 28 73 71 6c      (begin..(sql
7710: 69 74 65 33 3a 65 78 65 63 75 74 65 20 0a 09 20  ite3:execute .. 
7720: 64 62 0a 09 20 22 55 50 44 41 54 45 20 74 65 73  db.. "UPDATE tes
7730: 74 73 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ts .            
7740: 20 53 45 54 20 66 61 69 6c 5f 63 6f 75 6e 74 3d   SET fail_count=
7750: 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 69 64  (SELECT count(id
7760: 29 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45  ) FROM tests WHE
7770: 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20  RE run_id=? AND 
7780: 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69  testname=? AND i
7790: 74 65 6d 5f 70 61 74 68 20 21 3d 20 27 27 20 41  tem_path != '' A
77a0: 4e 44 20 73 74 61 74 75 73 3d 27 46 41 49 4c 27  ND status='FAIL'
77b0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
77c0: 20 20 20 20 70 61 73 73 5f 63 6f 75 6e 74 3d 28      pass_count=(
77d0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 69 64 29  SELECT count(id)
77e0: 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52   FROM tests WHER
77f0: 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74  E run_id=? AND t
7800: 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74  estname=? AND it
7810: 65 6d 5f 70 61 74 68 20 21 3d 20 27 27 20 41 4e  em_path != '' AN
7820: 44 20 28 73 74 61 74 75 73 3d 27 50 41 53 53 27  D (status='PASS'
7830: 20 4f 52 20 73 74 61 74 75 73 3d 27 57 41 52 4e   OR status='WARN
7840: 27 20 4f 52 20 73 74 61 74 75 73 3d 27 57 41 49  ' OR status='WAI
7850: 56 45 44 27 29 29 0a 20 20 20 20 20 20 20 20 20  VED')).         
7860: 20 20 20 20 57 48 45 52 45 20 72 75 6e 5f 69 64      WHERE run_id
7870: 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d  =? AND testname=
7880: 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 3d  ? AND item_path=
7890: 27 27 3b 22 0a 09 20 72 75 6e 2d 69 64 20 74 65  '';".. run-id te
78a0: 73 74 2d 6e 61 6d 65 20 72 75 6e 2d 69 64 20 74  st-name run-id t
78b0: 65 73 74 2d 6e 61 6d 65 20 72 75 6e 2d 69 64 20  est-name run-id 
78c0: 74 65 73 74 2d 6e 61 6d 65 29 0a 20 20 20 20 20  test-name).     
78d0: 20 20 20 28 74 68 72 65 61 64 2d 73 6c 65 65 70     (thread-sleep
78e0: 21 20 30 2e 31 29 20 3b 3b 20 67 69 76 65 20 6f  ! 0.1) ;; give o
78f0: 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61  ther processes a
7900: 20 63 68 61 6e 63 65 20 68 65 72 65 0a 09 28 69   chance here..(i
7910: 66 20 28 65 71 75 61 6c 3f 20 73 74 61 74 75 73  f (equal? status
7920: 20 22 52 55 4e 4e 49 4e 47 22 29 20 3b 3b 20 72   "RUNNING") ;; r
7930: 75 6e 6e 69 6e 67 20 74 61 6b 65 73 20 70 72 69  unning takes pri
7940: 6f 72 69 74 79 20 6f 76 65 72 20 61 6c 6c 20 6f  ority over all o
7950: 74 68 65 72 20 73 74 61 74 65 73 2c 20 66 6f 72  ther states, for
7960: 63 65 20 74 68 65 20 74 65 73 74 20 73 74 61 74  ce the test stat
7970: 65 20 74 6f 20 52 55 4e 4e 49 4e 47 0a 09 20 20  e to RUNNING..  
7980: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
7990: 74 65 20 64 62 20 22 55 50 44 41 54 45 20 74 65  te db "UPDATE te
79a0: 73 74 73 20 53 45 54 20 73 74 61 74 65 3d 3f 20  sts SET state=? 
79b0: 57 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41  WHERE run_id=? A
79c0: 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e  ND testname=? AN
79d0: 44 20 69 74 65 6d 5f 70 61 74 68 3d 27 27 3b 22  D item_path='';"
79e0: 20 22 52 55 4e 4e 49 4e 47 22 20 72 75 6e 2d 69   "RUNNING" run-i
79f0: 64 20 74 65 73 74 2d 6e 61 6d 65 29 0a 09 20 20  d test-name)..  
7a00: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
7a10: 74 65 0a 09 20 20 20 20 20 64 62 0a 09 20 20 20  te..     db..   
7a20: 20 20 22 55 50 44 41 54 45 20 74 65 73 74 73 0a    "UPDATE tests.
7a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a40: 20 20 20 20 20 20 20 53 45 54 20 73 74 61 74 65         SET state
7a50: 3d 43 41 53 45 20 57 48 45 4e 20 28 53 45 4c 45  =CASE WHEN (SELE
7a60: 43 54 20 63 6f 75 6e 74 28 69 64 29 20 46 52 4f  CT count(id) FRO
7a70: 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 72 75  M tests WHERE ru
7a80: 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e  n_id=? AND testn
7a90: 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70  ame=? AND item_p
7aa0: 61 74 68 20 21 3d 20 27 27 20 41 4e 44 20 73 74  ath != '' AND st
7ab0: 61 74 65 20 69 6e 20 28 27 52 55 4e 4e 49 4e 47  ate in ('RUNNING
7ac0: 27 2c 27 4e 4f 54 5f 53 54 41 52 54 45 44 27 29  ','NOT_STARTED')
7ad0: 29 20 3e 20 30 20 54 48 45 4e 20 0a 20 20 20 20  ) > 0 THEN .    
7ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7af0: 20 20 20 20 20 20 27 52 55 4e 4e 49 4e 47 27 0a        'RUNNING'.
7b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b10: 20 20 20 20 20 20 20 45 4c 53 45 20 27 43 4f 4d         ELSE 'COM
7b20: 50 4c 45 54 45 44 27 20 45 4e 44 2c 0a 20 20 20  PLETED' END,.   
7b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b40: 20 20 20 20 20 20 20 73 74 61 74 75 73 3d 43 41         status=CA
7b50: 53 45 20 57 48 45 4e 20 66 61 69 6c 5f 63 6f 75  SE WHEN fail_cou
7b60: 6e 74 20 3e 20 30 20 54 48 45 4e 20 27 46 41 49  nt > 0 THEN 'FAI
7b70: 4c 27 20 57 48 45 4e 20 70 61 73 73 5f 63 6f 75  L' WHEN pass_cou
7b80: 6e 74 20 3e 20 30 20 41 4e 44 20 66 61 69 6c 5f  nt > 0 AND fail_
7b90: 63 6f 75 6e 74 3d 30 20 54 48 45 4e 20 27 50 41  count=0 THEN 'PA
7ba0: 53 53 27 20 45 4c 53 45 20 27 55 4e 4b 4e 4f 57  SS' ELSE 'UNKNOW
7bb0: 4e 27 20 45 4e 44 0a 20 20 20 20 20 20 20 20 20  N' END.         
7bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
7bd0: 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44  ERE run_id=? AND
7be0: 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20   testname=? AND 
7bf0: 69 74 65 6d 5f 70 61 74 68 3d 27 27 3b 22 0a 09  item_path='';"..
7c00: 20 20 20 20 20 72 75 6e 2d 69 64 20 74 65 73 74       run-id test
7c10: 2d 6e 61 6d 65 20 72 75 6e 2d 69 64 20 74 65 73  -name run-id tes
7c20: 74 2d 6e 61 6d 65 29 29 0a 09 23 66 29 0a 20 20  t-name))..#f).  
7c30: 20 20 20 20 23 66 29 29 0a 0a 0a 3b 3b 3d 3d 3d      #f))...;;===
7c40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
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 0a 3b 3b 20 54 65 73 74 73 20 6d 65 74  ===.;; Tests met
7c90: 61 20 64 61 74 61 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d  a data.;;=======
7ca0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7cb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7cc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7cd0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a  ===============.
7ce0: 0a 3b 3b 20 72 65 61 64 20 74 68 65 20 72 65 63  .;; read the rec
7cf0: 6f 72 64 20 67 69 76 65 6e 20 61 20 74 65 73 74  ord given a test
7d00: 6e 61 6d 65 0a 28 64 65 66 69 6e 65 20 28 64 62  name.(define (db
7d10: 3a 74 65 73 74 6d 65 74 61 2d 67 65 74 2d 72 65  :testmeta-get-re
7d20: 63 6f 72 64 20 64 62 20 74 65 73 74 6e 61 6d 65  cord db testname
7d30: 29 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20 23  ).  (let ((res #
7d40: 66 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33  f)).    (sqlite3
7d50: 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20  :for-each-row.  
7d60: 20 20 20 28 6c 61 6d 62 64 61 20 28 69 64 20 74     (lambda (id t
7d70: 65 73 74 6e 61 6d 65 20 61 75 74 68 6f 72 20 6f  estname author o
7d80: 77 6e 65 72 20 64 65 73 63 72 69 70 74 69 6f 6e  wner description
7d90: 20 72 65 76 69 65 77 65 64 20 69 74 65 72 61 74   reviewed iterat
7da0: 65 64 20 61 76 67 5f 72 75 6e 74 69 6d 65 20 61  ed avg_runtime a
7db0: 76 67 5f 64 69 73 6b 20 74 61 67 73 29 0a 20 20  vg_disk tags).  
7dc0: 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28       (set! res (
7dd0: 76 65 63 74 6f 72 20 69 64 20 74 65 73 74 6e 61  vector id testna
7de0: 6d 65 20 61 75 74 68 6f 72 20 6f 77 6e 65 72 20  me author owner 
7df0: 64 65 73 63 72 69 70 74 69 6f 6e 20 72 65 76 69  description revi
7e00: 65 77 65 64 20 69 74 65 72 61 74 65 64 20 61 76  ewed iterated av
7e10: 67 5f 72 75 6e 74 69 6d 65 20 61 76 67 5f 64 69  g_runtime avg_di
7e20: 73 6b 20 74 61 67 73 29 29 29 0a 20 20 20 20 20  sk tags))).     
7e30: 64 62 20 22 53 45 4c 45 43 54 20 69 64 2c 74 65  db "SELECT id,te
7e40: 73 74 6e 61 6d 65 2c 61 75 74 68 6f 72 2c 6f 77  stname,author,ow
7e50: 6e 65 72 2c 64 65 73 63 72 69 70 74 69 6f 6e 2c  ner,description,
7e60: 72 65 76 69 65 77 65 64 2c 69 74 65 72 61 74 65  reviewed,iterate
7e70: 64 2c 61 76 67 5f 72 75 6e 74 69 6d 65 2c 61 76  d,avg_runtime,av
7e80: 67 5f 64 69 73 6b 2c 74 61 67 73 20 46 52 4f 4d  g_disk,tags FROM
7e90: 20 74 65 73 74 5f 6d 65 74 61 20 57 48 45 52 45   test_meta WHERE
7ea0: 20 74 65 73 74 6e 61 6d 65 3d 3f 3b 22 0a 20 20   testname=?;".  
7eb0: 20 20 20 74 65 73 74 6e 61 6d 65 29 0a 20 20 20     testname).   
7ec0: 20 72 65 73 29 29 0a 0a 3b 3b 20 63 72 65 61 74   res))..;; creat
7ed0: 65 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 66  e a new record f
7ee0: 6f 72 20 61 20 67 69 76 65 6e 20 74 65 73 74 6e  or a given testn
7ef0: 61 6d 65 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  ame.(define (db:
7f00: 74 65 73 74 6d 65 74 61 2d 61 64 64 2d 72 65 63  testmeta-add-rec
7f10: 6f 72 64 20 64 62 20 74 65 73 74 6e 61 6d 65 29  ord db testname)
7f20: 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63  .  (sqlite3:exec
7f30: 75 74 65 20 64 62 20 22 49 4e 53 45 52 54 20 4f  ute db "INSERT O
7f40: 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 74 65  R IGNORE INTO te
7f50: 73 74 5f 6d 65 74 61 20 28 74 65 73 74 6e 61 6d  st_meta (testnam
7f60: 65 2c 61 75 74 68 6f 72 2c 6f 77 6e 65 72 2c 64  e,author,owner,d
7f70: 65 73 63 72 69 70 74 69 6f 6e 2c 72 65 76 69 65  escription,revie
7f80: 77 65 64 2c 69 74 65 72 61 74 65 64 2c 61 76 67  wed,iterated,avg
7f90: 5f 72 75 6e 74 69 6d 65 2c 61 76 67 5f 64 69 73  _runtime,avg_dis
7fa0: 6b 2c 74 61 67 73 29 20 56 41 4c 55 45 53 20 28  k,tags) VALUES (
7fb0: 3f 2c 27 27 2c 27 27 2c 27 27 2c 27 27 2c 27 27  ?,'','','','',''
7fc0: 2c 27 27 2c 27 27 2c 27 27 29 3b 22 20 74 65 73  ,'','','');" tes
7fd0: 74 6e 61 6d 65 29 29 0a 0a 3b 3b 20 75 70 64 61  tname))..;; upda
7fe0: 74 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 65  te one of the te
7ff0: 73 74 6d 65 74 61 20 66 69 65 6c 64 73 0a 28 64  stmeta fields.(d
8000: 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74 6d 65  efine (db:testme
8010: 74 61 2d 75 70 64 61 74 65 2d 66 69 65 6c 64 20  ta-update-field 
8020: 64 62 20 74 65 73 74 6e 61 6d 65 20 66 69 65 6c  db testname fiel
8030: 64 20 76 61 6c 75 65 29 0a 20 20 28 73 71 6c 69  d value).  (sqli
8040: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 28  te3:execute db (
8050: 63 6f 6e 63 20 22 55 50 44 41 54 45 20 74 65 73  conc "UPDATE tes
8060: 74 5f 6d 65 74 61 20 53 45 54 20 22 20 66 69 65  t_meta SET " fie
8070: 6c 64 20 22 3d 3f 20 57 48 45 52 45 20 74 65 73  ld "=? WHERE tes
8080: 74 6e 61 6d 65 3d 3f 3b 22 29 20 76 61 6c 75 65  tname=?;") value
8090: 20 74 65 73 74 6e 61 6d 65 29 29 0a 0a 3b 3b 3d   testname))..;;=
80a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
80b0: 3d 3d 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 0a 3b 3b 20 54 20 45 20 53 20 54  =====.;; T E S T
80f0: 20 20 20 44 20 41 20 54 20 41 20 0a 3b 3b 3d 3d     D A T A .;;==
8100: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8110: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8120: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8130: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8140: 3d 3d 3d 3d 0a 0a 28 64 65 66 69 6e 65 20 28 64  ====..(define (d
8150: 62 3a 63 73 76 2d 3e 74 65 73 74 2d 64 61 74 61  b:csv->test-data
8160: 20 64 62 20 74 65 73 74 2d 69 64 20 63 73 76 64   db test-id csvd
8170: 61 74 61 29 0a 20 20 28 64 65 62 75 67 3a 70 72  ata).  (debug:pr
8180: 69 6e 74 20 34 20 22 74 65 73 74 2d 69 64 20 22  int 4 "test-id "
8190: 20 74 65 73 74 2d 69 64 20 22 2c 20 63 73 76 64   test-id ", csvd
81a0: 61 74 61 3a 20 22 20 63 73 76 64 61 74 61 29 0a  ata: " csvdata).
81b0: 20 20 28 6c 65 74 20 28 28 63 73 76 6c 69 73 74    (let ((csvlist
81c0: 20 28 63 73 76 2d 3e 6c 69 73 74 20 28 6d 61 6b   (csv->list (mak
81d0: 65 2d 63 73 76 2d 72 65 61 64 65 72 0a 09 09 09  e-csv-reader....
81e0: 20 20 20 20 20 28 6f 70 65 6e 2d 69 6e 70 75 74       (open-input
81f0: 2d 73 74 72 69 6e 67 20 63 73 76 64 61 74 61 29  -string csvdata)
8200: 0a 09 09 09 20 20 20 20 20 27 28 28 73 74 72 69  ....     '((stri
8210: 70 2d 6c 65 61 64 69 6e 67 2d 77 68 69 74 65 73  p-leading-whites
8220: 70 61 63 65 3f 20 23 74 29 0a 09 09 09 20 20 20  pace? #t)....   
8230: 20 20 20 20 28 73 74 72 69 70 2d 74 72 61 69 6c      (strip-trail
8240: 69 6e 67 2d 77 68 69 74 65 73 70 61 63 65 3f 20  ing-whitespace? 
8250: 23 74 29 29 20 29 29 29 29 20 3b 3b 20 28 63 73  #t)) )))) ;; (cs
8260: 76 2d 3e 6c 69 73 74 20 63 73 76 64 61 74 61 29  v->list csvdata)
8270: 29 29 0a 20 20 20 20 28 66 6f 72 2d 65 61 63 68  )).    (for-each
8280: 20 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28   .     (lambda (
8290: 63 73 76 72 6f 77 29 0a 20 20 20 20 20 20 20 28  csvrow).       (
82a0: 6c 65 74 2a 20 28 28 70 61 64 64 65 64 2d 72 6f  let* ((padded-ro
82b0: 77 20 20 28 74 61 6b 65 20 28 61 70 70 65 6e 64  w  (take (append
82c0: 20 63 73 76 72 6f 77 20 28 6c 69 73 74 20 23 66   csvrow (list #f
82d0: 20 23 66 20 23 66 20 23 66 20 23 66 20 23 66 20   #f #f #f #f #f 
82e0: 23 66 20 23 66 20 23 66 29 29 20 39 29 29 0a 09  #f #f #f)) 9))..
82f0: 20 20 20 20 20 20 28 63 61 74 65 67 6f 72 79 20        (category 
8300: 20 20 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64     (list-ref pad
8310: 64 65 64 2d 72 6f 77 20 30 29 29 0a 09 20 20 20  ded-row 0))..   
8320: 20 20 20 28 76 61 72 69 61 62 6c 65 20 20 20 20     (variable    
8330: 28 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65 64  (list-ref padded
8340: 2d 72 6f 77 20 31 29 29 0a 09 20 20 20 20 20 20  -row 1))..      
8350: 28 76 61 6c 75 65 20 20 20 20 20 20 20 28 61 6e  (value       (an
8360: 79 2d 3e 6e 75 6d 62 65 72 2d 69 66 2d 70 6f 73  y->number-if-pos
8370: 73 69 62 6c 65 20 28 6c 69 73 74 2d 72 65 66 20  sible (list-ref 
8380: 70 61 64 64 65 64 2d 72 6f 77 20 32 29 29 29 0a  padded-row 2))).
8390: 09 20 20 20 20 20 20 28 65 78 70 65 63 74 65 64  .      (expected
83a0: 20 20 20 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72      (any->number
83b0: 2d 69 66 2d 70 6f 73 73 69 62 6c 65 20 28 6c 69  -if-possible (li
83c0: 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f  st-ref padded-ro
83d0: 77 20 33 29 29 29 0a 09 20 20 20 20 20 20 28 74  w 3)))..      (t
83e0: 6f 6c 20 20 20 20 20 20 20 20 20 28 61 6e 79 2d  ol         (any-
83f0: 3e 6e 75 6d 62 65 72 2d 69 66 2d 70 6f 73 73 69  >number-if-possi
8400: 62 6c 65 20 28 6c 69 73 74 2d 72 65 66 20 70 61  ble (list-ref pa
8410: 64 64 65 64 2d 72 6f 77 20 34 29 29 29 20 3b 3b  dded-row 4))) ;;
8420: 20 3e 2c 20 3c 2c 20 3e 3d 2c 20 3c 3d 2c 20 6f   >, <, >=, <=, o
8430: 72 20 61 20 6e 75 6d 62 65 72 0a 09 20 20 20 20  r a number..    
8440: 20 20 28 75 6e 69 74 73 20 20 20 20 20 20 20 28    (units       (
8450: 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d  list-ref padded-
8460: 72 6f 77 20 35 29 29 0a 09 20 20 20 20 20 20 28  row 5))..      (
8470: 63 6f 6d 6d 65 6e 74 20 20 20 20 20 28 6c 69 73  comment     (lis
8480: 74 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77  t-ref padded-row
8490: 20 36 29 29 0a 09 20 20 20 20 20 20 28 73 74 61   6))..      (sta
84a0: 74 75 73 20 20 20 20 20 20 28 6c 65 74 20 28 28  tus      (let ((
84b0: 73 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64 64  s (list-ref padd
84c0: 65 64 2d 72 6f 77 20 37 29 29 29 0a 09 09 09 20  ed-row 7))).... 
84d0: 20 20 20 20 28 69 66 20 28 61 6e 64 20 28 73 74      (if (and (st
84e0: 72 69 6e 67 3f 20 73 29 28 6f 72 20 28 73 74 72  ring? s)(or (str
84f0: 69 6e 67 2d 6d 61 74 63 68 20 28 72 65 67 65 78  ing-match (regex
8500: 70 20 22 5e 5c 5c 73 2a 24 22 29 20 73 29 0a 09  p "^\\s*$") s)..
8510: 09 09 09 09 09 20 20 20 20 20 28 73 74 72 69 6e  .....     (strin
8520: 67 2d 6d 61 74 63 68 20 28 72 65 67 65 78 70 20  g-match (regexp 
8530: 22 5e 6e 2f 61 24 22 29 20 73 29 29 29 0a 09 09  "^n/a$") s)))...
8540: 09 09 20 23 66 0a 09 09 09 09 20 73 29 29 29 20  .. #f..... s))) 
8550: 3b 3b 20 69 66 20 73 70 65 63 69 66 69 65 64 20  ;; if specified 
8560: 6f 6e 20 74 68 65 20 69 6e 70 75 74 20 74 68 65  on the input the
8570: 6e 20 75 73 65 2c 20 65 6c 73 65 20 63 61 6c 63  n use, else calc
8580: 75 6c 61 74 65 0a 09 20 20 20 20 20 20 28 74 79  ulate..      (ty
8590: 70 65 20 20 20 20 20 20 20 20 28 6c 69 73 74 2d  pe        (list-
85a0: 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20 38  ref padded-row 8
85b0: 29 29 29 0a 09 20 3b 3b 20 6c 6f 6f 6b 20 75 70  ))).. ;; look up
85c0: 20 65 78 70 65 63 74 65 64 2c 74 6f 6c 2c 75 6e   expected,tol,un
85d0: 69 74 73 20 66 72 6f 6d 20 70 72 65 76 69 6f 75  its from previou
85e0: 73 20 62 65 73 74 20 66 69 74 20 74 65 73 74 20  s best fit test 
85f0: 69 66 20 74 68 65 79 20 61 72 65 20 61 6c 6c 20  if they are all 
8600: 65 69 74 68 65 72 20 23 66 20 6f 72 20 27 27 0a  either #f or ''.
8610: 09 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34  . (debug:print 4
8620: 20 22 42 45 46 4f 52 45 3a 20 63 61 74 65 67 6f   "BEFORE: catego
8630: 72 79 3a 20 22 20 63 61 74 65 67 6f 72 79 20 22  ry: " category "
8640: 20 76 61 72 69 61 62 6c 65 3a 20 22 20 76 61 72   variable: " var
8650: 69 61 62 6c 65 20 22 20 76 61 6c 75 65 3a 20 22  iable " value: "
8660: 20 76 61 6c 75 65 20 0a 09 09 20 20 20 20 20 20   value ...      
8670: 22 2c 20 65 78 70 65 63 74 65 64 3a 20 22 20 65  ", expected: " e
8680: 78 70 65 63 74 65 64 20 22 20 74 6f 6c 3a 20 22  xpected " tol: "
8690: 20 74 6f 6c 20 22 20 75 6e 69 74 73 3a 20 22 20   tol " units: " 
86a0: 75 6e 69 74 73 20 22 20 73 74 61 74 75 73 3a 20  units " status: 
86b0: 22 20 73 74 61 74 75 73 20 22 20 63 6f 6d 6d 65  " status " comme
86c0: 6e 74 3a 20 22 20 63 6f 6d 6d 65 6e 74 20 22 20  nt: " comment " 
86d0: 74 79 70 65 3a 20 22 20 74 79 70 65 29 0a 0a 09  type: " type)...
86e0: 20 28 69 66 20 28 61 6e 64 20 28 6f 72 20 28 6e   (if (and (or (n
86f0: 6f 74 20 65 78 70 65 63 74 65 64 29 28 65 71 75  ot expected)(equ
8700: 61 6c 3f 20 65 78 70 65 63 74 65 64 20 22 22 29  al? expected "")
8710: 29 0a 09 09 20 20 28 6f 72 20 28 6e 6f 74 20 74  )...  (or (not t
8720: 6f 6c 29 20 20 20 20 20 28 65 71 75 61 6c 3f 20  ol)     (equal? 
8730: 65 78 70 65 63 74 65 64 20 22 22 29 29 0a 09 09  expected ""))...
8740: 20 20 28 6f 72 20 28 6e 6f 74 20 75 6e 69 74 73    (or (not units
8750: 29 20 20 20 28 65 71 75 61 6c 3f 20 65 78 70 65  )   (equal? expe
8760: 63 74 65 64 20 22 22 29 29 29 0a 09 20 20 20 20  cted "")))..    
8770: 20 28 6c 65 74 2d 76 61 6c 75 65 73 20 28 28 28   (let-values (((
8780: 6e 65 77 2d 65 78 70 65 63 74 65 64 20 6e 65 77  new-expected new
8790: 2d 74 6f 6c 20 6e 65 77 2d 75 6e 69 74 73 29 28  -tol new-units)(
87a0: 64 62 3a 67 65 74 2d 70 72 65 76 2d 74 6f 6c 2d  db:get-prev-tol-
87b0: 66 6f 72 2d 74 65 73 74 20 64 62 20 74 65 73 74  for-test db test
87c0: 2d 69 64 20 63 61 74 65 67 6f 72 79 20 76 61 72  -id category var
87d0: 69 61 62 6c 65 29 29 29 0a 09 09 09 20 28 73 65  iable))).... (se
87e0: 74 21 20 65 78 70 65 63 74 65 64 20 6e 65 77 2d  t! expected new-
87f0: 65 78 70 65 63 74 65 64 29 0a 09 09 09 20 28 73  expected).... (s
8800: 65 74 21 20 74 6f 6c 20 20 20 20 20 20 6e 65 77  et! tol      new
8810: 2d 74 6f 6c 29 0a 09 09 09 20 28 73 65 74 21 20  -tol).... (set! 
8820: 75 6e 69 74 73 20 20 20 20 6e 65 77 2d 75 6e 69  units    new-uni
8830: 74 73 29 29 29 0a 0a 09 20 28 64 65 62 75 67 3a  ts)))... (debug:
8840: 70 72 69 6e 74 20 34 20 22 41 46 54 45 52 3a 20  print 4 "AFTER: 
8850: 20 63 61 74 65 67 6f 72 79 3a 20 22 20 63 61 74   category: " cat
8860: 65 67 6f 72 79 20 22 20 76 61 72 69 61 62 6c 65  egory " variable
8870: 3a 20 22 20 76 61 72 69 61 62 6c 65 20 22 20 76  : " variable " v
8880: 61 6c 75 65 3a 20 22 20 76 61 6c 75 65 20 0a 09  alue: " value ..
8890: 09 20 20 20 20 20 20 22 2c 20 65 78 70 65 63 74  .      ", expect
88a0: 65 64 3a 20 22 20 65 78 70 65 63 74 65 64 20 22  ed: " expected "
88b0: 20 74 6f 6c 3a 20 22 20 74 6f 6c 20 22 20 75 6e   tol: " tol " un
88c0: 69 74 73 3a 20 22 20 75 6e 69 74 73 20 22 20 73  its: " units " s
88d0: 74 61 74 75 73 3a 20 22 20 73 74 61 74 75 73 20  tatus: " status 
88e0: 22 20 63 6f 6d 6d 65 6e 74 3a 20 22 20 63 6f 6d  " comment: " com
88f0: 6d 65 6e 74 29 0a 09 20 3b 3b 20 63 61 6c 63 75  ment).. ;; calcu
8900: 6c 61 74 65 20 73 74 61 74 75 73 20 69 66 20 4e  late status if N
8910: 4f 54 20 73 70 65 63 69 66 69 65 64 0a 09 20 28  OT specified.. (
8920: 69 66 20 28 61 6e 64 20 28 6e 6f 74 20 73 74 61  if (and (not sta
8930: 74 75 73 29 28 6e 75 6d 62 65 72 3f 20 65 78 70  tus)(number? exp
8940: 65 63 74 65 64 29 28 6e 75 6d 62 65 72 3f 20 76  ected)(number? v
8950: 61 6c 75 65 29 29 20 3b 3b 20 6e 65 65 64 20 65  alue)) ;; need e
8960: 78 70 65 63 74 65 64 20 61 6e 64 20 76 61 6c 75  xpected and valu
8970: 65 20 74 6f 20 62 65 20 6e 75 6d 62 65 72 73 0a  e to be numbers.
8980: 09 20 20 20 20 20 28 69 66 20 28 6e 75 6d 62 65  .     (if (numbe
8990: 72 3f 20 74 6f 6c 29 20 3b 3b 20 69 66 20 74 6f  r? tol) ;; if to
89a0: 6c 20 69 73 20 61 20 6e 75 6d 62 65 72 20 74 68  l is a number th
89b0: 65 6e 20 77 65 20 64 6f 20 74 68 65 20 73 74 61  en we do the sta
89c0: 6e 64 61 72 64 20 63 6f 6d 70 61 72 69 73 6f 6e  ndard comparison
89d0: 0a 09 09 20 28 6c 65 74 2a 20 28 28 6d 61 78 2d  ... (let* ((max-
89e0: 76 61 6c 20 28 2b 20 65 78 70 65 63 74 65 64 20  val (+ expected 
89f0: 74 6f 6c 29 29 0a 09 09 09 28 6d 69 6e 2d 76 61  tol))....(min-va
8a00: 6c 20 28 2d 20 65 78 70 65 63 74 65 64 20 74 6f  l (- expected to
8a10: 6c 29 29 0a 09 09 09 28 72 65 73 75 6c 74 20 20  l))....(result  
8a20: 28 61 6e 64 20 28 3e 3d 20 20 76 61 6c 75 65 20  (and (>=  value 
8a30: 6d 69 6e 2d 76 61 6c 29 28 3c 3d 20 76 61 6c 75  min-val)(<= valu
8a40: 65 20 6d 61 78 2d 76 61 6c 29 29 29 29 0a 09 09  e max-val))))...
8a50: 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20     (debug:print 
8a60: 34 20 22 6d 61 78 2d 76 61 6c 3a 20 22 20 6d 61  4 "max-val: " ma
8a70: 78 2d 76 61 6c 20 22 20 6d 69 6e 2d 76 61 6c 3a  x-val " min-val:
8a80: 20 22 20 6d 69 6e 2d 76 61 6c 20 22 20 72 65 73   " min-val " res
8a90: 75 6c 74 3a 20 22 20 72 65 73 75 6c 74 29 0a 09  ult: " result)..
8aa0: 09 20 20 20 28 73 65 74 21 20 73 74 61 74 75 73  .   (set! status
8ab0: 20 28 69 66 20 72 65 73 75 6c 74 20 22 70 61 73   (if result "pas
8ac0: 73 22 20 22 66 61 69 6c 22 29 29 29 0a 09 09 20  s" "fail")))... 
8ad0: 28 73 65 74 21 20 73 74 61 74 75 73 20 3b 3b 20  (set! status ;; 
8ae0: 4e 42 2f 2f 20 6e 65 65 64 20 74 6f 20 61 73 73  NB// need to ass
8af0: 65 73 73 20 65 61 63 68 20 6f 6e 65 20 28 69 2e  ess each one (i.
8b00: 65 2e 20 6e 6f 74 20 72 65 74 75 72 6e 20 6f 70  e. not return op
8b10: 65 72 61 74 6f 72 20 73 69 6e 63 65 20 6e 65 65  erator since nee
8b20: 64 20 74 6f 20 61 63 74 20 69 66 20 6e 6f 74 20  d to act if not 
8b30: 76 61 6c 69 64 20 6f 70 2e 0a 09 09 20 20 20 20  valid op....    
8b40: 20 20 20 28 63 61 73 65 20 28 73 74 72 69 6e 67     (case (string
8b50: 2d 3e 73 79 6d 62 6f 6c 20 74 6f 6c 29 20 3b 3b  ->symbol tol) ;;
8b60: 20 74 6f 6c 20 73 68 6f 75 6c 64 20 62 65 20 3e   tol should be >
8b70: 2c 20 3c 2c 20 3e 3d 2c 20 3c 3d 0a 09 09 09 20  , <, >=, <=.... 
8b80: 28 28 3e 29 20 20 28 69 66 20 28 3e 20 20 76 61  ((>)  (if (>  va
8b90: 6c 75 65 20 65 78 70 65 63 74 65 64 29 20 22 70  lue expected) "p
8ba0: 61 73 73 22 20 22 66 61 69 6c 22 29 29 0a 09 09  ass" "fail"))...
8bb0: 09 20 28 28 3c 29 20 20 28 69 66 20 28 3c 20 20  . ((<)  (if (<  
8bc0: 76 61 6c 75 65 20 65 78 70 65 63 74 65 64 29 20  value expected) 
8bd0: 22 70 61 73 73 22 20 22 66 61 69 6c 22 29 29 0a  "pass" "fail")).
8be0: 09 09 09 20 28 28 3e 3d 29 20 28 69 66 20 28 3e  ... ((>=) (if (>
8bf0: 3d 20 76 61 6c 75 65 20 65 78 70 65 63 74 65 64  = value expected
8c00: 29 20 22 70 61 73 73 22 20 22 66 61 69 6c 22 29  ) "pass" "fail")
8c10: 29 0a 09 09 09 20 28 28 3c 3d 29 20 28 69 66 20  ).... ((<=) (if 
8c20: 28 3c 3d 20 76 61 6c 75 65 20 65 78 70 65 63 74  (<= value expect
8c30: 65 64 29 20 22 70 61 73 73 22 20 22 66 61 69 6c  ed) "pass" "fail
8c40: 22 29 29 0a 09 09 09 20 28 65 6c 73 65 20 28 63  ")).... (else (c
8c50: 6f 6e 63 20 22 45 52 52 4f 52 3a 20 62 61 64 20  onc "ERROR: bad 
8c60: 74 6f 6c 20 63 6f 6d 70 61 72 61 74 6f 72 20 22  tol comparator "
8c70: 20 74 6f 6c 29 29 29 29 29 29 0a 09 20 28 64 65   tol)))))).. (de
8c80: 62 75 67 3a 70 72 69 6e 74 20 34 20 22 41 46 54  bug:print 4 "AFT
8c90: 45 52 32 3a 20 63 61 74 65 67 6f 72 79 3a 20 22  ER2: category: "
8ca0: 20 63 61 74 65 67 6f 72 79 20 22 20 76 61 72 69   category " vari
8cb0: 61 62 6c 65 3a 20 22 20 76 61 72 69 61 62 6c 65  able: " variable
8cc0: 20 22 20 76 61 6c 75 65 3a 20 22 20 76 61 6c 75   " value: " valu
8cd0: 65 20 0a 09 09 20 20 20 20 20 20 22 2c 20 65 78  e ...      ", ex
8ce0: 70 65 63 74 65 64 3a 20 22 20 65 78 70 65 63 74  pected: " expect
8cf0: 65 64 20 22 20 74 6f 6c 3a 20 22 20 74 6f 6c 20  ed " tol: " tol 
8d00: 22 20 75 6e 69 74 73 3a 20 22 20 75 6e 69 74 73  " units: " units
8d10: 20 22 20 73 74 61 74 75 73 3a 20 22 20 73 74 61   " status: " sta
8d20: 74 75 73 20 22 20 63 6f 6d 6d 65 6e 74 3a 20 22  tus " comment: "
8d30: 20 63 6f 6d 6d 65 6e 74 29 0a 09 20 28 73 71 6c   comment).. (sql
8d40: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
8d50: 22 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41  "INSERT OR REPLA
8d60: 43 45 20 49 4e 54 4f 20 74 65 73 74 5f 64 61 74  CE INTO test_dat
8d70: 61 20 28 74 65 73 74 5f 69 64 2c 63 61 74 65 67  a (test_id,categ
8d80: 6f 72 79 2c 76 61 72 69 61 62 6c 65 2c 76 61 6c  ory,variable,val
8d90: 75 65 2c 65 78 70 65 63 74 65 64 2c 74 6f 6c 2c  ue,expected,tol,
8da0: 75 6e 69 74 73 2c 63 6f 6d 6d 65 6e 74 2c 73 74  units,comment,st
8db0: 61 74 75 73 2c 74 79 70 65 29 20 56 41 4c 55 45  atus,type) VALUE
8dc0: 53 20 28 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f  S (?,?,?,?,?,?,?
8dd0: 2c 3f 2c 3f 2c 3f 29 3b 22 0a 09 09 09 20 20 74  ,?,?,?);"....  t
8de0: 65 73 74 2d 69 64 20 63 61 74 65 67 6f 72 79 20  est-id category 
8df0: 76 61 72 69 61 62 6c 65 20 76 61 6c 75 65 20 65  variable value e
8e00: 78 70 65 63 74 65 64 20 74 6f 6c 20 75 6e 69 74  xpected tol unit
8e10: 73 20 28 69 66 20 63 6f 6d 6d 65 6e 74 20 63 6f  s (if comment co
8e20: 6d 6d 65 6e 74 20 22 22 29 20 73 74 61 74 75 73  mment "") status
8e30: 20 74 79 70 65 29 29 29 0a 20 20 20 20 20 63 73   type))).     cs
8e40: 76 6c 69 73 74 29 29 29 0a 0a 3b 3b 20 67 65 74  vlist)))..;; get
8e50: 20 61 20 6c 69 73 74 20 6f 66 20 74 65 73 74 5f   a list of test_
8e60: 64 61 74 61 20 72 65 63 6f 72 64 73 20 6d 61 74  data records mat
8e70: 63 68 69 6e 67 20 63 61 74 65 67 6f 72 79 70 61  ching categorypa
8e80: 74 74 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 72  tt.(define (db:r
8e90: 65 61 64 2d 74 65 73 74 2d 64 61 74 61 20 64 62  ead-test-data db
8ea0: 20 74 65 73 74 2d 69 64 20 63 61 74 65 67 6f 72   test-id categor
8eb0: 79 70 61 74 74 29 0a 20 20 28 6c 65 74 20 28 28  ypatt).  (let ((
8ec0: 72 65 73 20 27 28 29 29 29 0a 20 20 20 20 28 73  res '())).    (s
8ed0: 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d  qlite3:for-each-
8ee0: 72 6f 77 20 0a 20 20 20 20 20 28 6c 61 6d 62 64  row .     (lambd
8ef0: 61 20 28 69 64 20 74 65 73 74 5f 69 64 20 63 61  a (id test_id ca
8f00: 74 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65 20  tegory variable 
8f10: 76 61 6c 75 65 20 65 78 70 65 63 74 65 64 20 74  value expected t
8f20: 6f 6c 20 75 6e 69 74 73 20 63 6f 6d 6d 65 6e 74  ol units comment
8f30: 20 73 74 61 74 75 73 20 74 79 70 65 29 0a 20 20   status type).  
8f40: 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28       (set! res (
8f50: 63 6f 6e 73 20 28 76 65 63 74 6f 72 20 69 64 20  cons (vector id 
8f60: 74 65 73 74 5f 69 64 20 63 61 74 65 67 6f 72 79  test_id category
8f70: 20 76 61 72 69 61 62 6c 65 20 76 61 6c 75 65 20   variable value 
8f80: 65 78 70 65 63 74 65 64 20 74 6f 6c 20 75 6e 69  expected tol uni
8f90: 74 73 20 63 6f 6d 6d 65 6e 74 20 73 74 61 74 75  ts comment statu
8fa0: 73 20 74 79 70 65 29 20 72 65 73 29 29 29 0a 20  s type) res))). 
8fb0: 20 20 20 20 64 62 0a 20 20 20 20 20 22 53 45 4c      db.     "SEL
8fc0: 45 43 54 20 69 64 2c 74 65 73 74 5f 69 64 2c 63  ECT id,test_id,c
8fd0: 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62 6c 65  ategory,variable
8fe0: 2c 76 61 6c 75 65 2c 65 78 70 65 63 74 65 64 2c  ,value,expected,
8ff0: 74 6f 6c 2c 75 6e 69 74 73 2c 63 6f 6d 6d 65 6e  tol,units,commen
9000: 74 2c 73 74 61 74 75 73 2c 74 79 70 65 20 46 52  t,status,type FR
9010: 4f 4d 20 74 65 73 74 5f 64 61 74 61 20 57 48 45  OM test_data WHE
9020: 52 45 20 74 65 73 74 5f 69 64 3d 3f 20 41 4e 44  RE test_id=? AND
9030: 20 63 61 74 65 67 6f 72 79 20 4c 49 4b 45 20 3f   category LIKE ?
9040: 20 4f 52 44 45 52 20 42 59 20 63 61 74 65 67 6f   ORDER BY catego
9050: 72 79 2c 76 61 72 69 61 62 6c 65 3b 22 20 74 65  ry,variable;" te
9060: 73 74 2d 69 64 20 63 61 74 65 67 6f 72 79 70 61  st-id categorypa
9070: 74 74 29 0a 20 20 20 20 28 72 65 76 65 72 73 65  tt).    (reverse
9080: 20 72 65 73 29 29 29 0a 0a 28 64 65 66 69 6e 65   res)))..(define
9090: 20 28 64 62 3a 6c 6f 61 64 2d 74 65 73 74 2d 64   (db:load-test-d
90a0: 61 74 61 20 64 62 20 74 65 73 74 2d 69 64 29 0a  ata db test-id).
90b0: 20 20 28 6c 65 74 20 6c 6f 6f 70 20 28 28 6c 69    (let loop ((li
90c0: 6e 20 28 72 65 61 64 2d 6c 69 6e 65 29 29 29 0a  n (read-line))).
90d0: 20 20 20 20 28 69 66 20 28 6e 6f 74 20 28 65 6f      (if (not (eo
90e0: 66 2d 6f 62 6a 65 63 74 3f 20 6c 69 6e 29 29 0a  f-object? lin)).
90f0: 09 28 62 65 67 69 6e 0a 09 20 20 28 64 65 62 75  .(begin..  (debu
9100: 67 3a 70 72 69 6e 74 20 34 20 6c 69 6e 29 0a 09  g:print 4 lin)..
9110: 20 20 28 72 64 62 3a 63 73 76 2d 3e 74 65 73 74    (rdb:csv->test
9120: 2d 64 61 74 61 20 64 62 20 74 65 73 74 2d 69 64  -data db test-id
9130: 20 6c 69 6e 29 0a 09 20 20 28 6c 6f 6f 70 20 28   lin)..  (loop (
9140: 72 65 61 64 2d 6c 69 6e 65 29 29 29 29 29 0a 20  read-line))))). 
9150: 20 3b 3b 20 72 6f 6c 6c 20 75 70 20 74 68 65 20   ;; roll up the 
9160: 63 75 72 72 65 6e 74 20 72 65 73 75 6c 74 73 2e  current results.
9170: 0a 20 20 3b 3b 20 46 49 58 4d 45 3a 20 41 64 64  .  ;; FIXME: Add
9180: 20 74 68 65 20 73 74 61 74 75 73 20 74 6f 20 0a   the status to .
9190: 20 20 28 72 64 62 3a 74 65 73 74 2d 64 61 74 61    (rdb:test-data
91a0: 2d 72 6f 6c 6c 75 70 20 64 62 20 74 65 73 74 2d  -rollup db test-
91b0: 69 64 20 23 66 29 29 0a 0a 3b 3b 20 57 41 52 4e  id #f))..;; WARN
91c0: 49 4e 47 3a 20 44 6f 20 4e 4f 54 20 63 61 6c 6c  ING: Do NOT call
91d0: 20 74 68 69 73 20 66 6f 72 20 74 68 65 20 70 61   this for the pa
91e0: 72 65 6e 74 20 74 65 73 74 20 6f 6e 20 61 6e 20  rent test on an 
91f0: 69 74 65 72 61 74 65 64 20 74 65 73 74 0a 3b 3b  iterated test.;;
9200: 20 52 6f 6c 6c 20 75 70 20 74 65 73 74 5f 64 61   Roll up test_da
9210: 74 61 20 70 61 73 73 2f 66 61 69 6c 20 72 65 73  ta pass/fail res
9220: 75 6c 74 73 0a 3b 3b 20 6c 6f 6f 6b 20 61 74 20  ults.;; look at 
9230: 74 68 65 20 74 65 73 74 5f 64 61 74 61 20 73 74  the test_data st
9240: 61 74 75 73 20 66 69 65 6c 64 2c 20 0a 3b 3b 20  atus field, .;; 
9250: 20 20 20 69 66 20 61 6c 6c 20 61 72 65 20 70 61     if all are pa
9260: 73 73 20 28 61 6e 79 20 63 61 73 65 29 20 61 6e  ss (any case) an
9270: 64 20 74 68 65 20 74 65 73 74 20 73 74 61 74 75  d the test statu
9280: 73 20 69 73 20 50 41 53 53 20 6f 72 20 4e 55 4c  s is PASS or NUL
9290: 4c 20 6f 72 20 27 27 20 74 68 65 6e 20 73 65 74  L or '' then set
92a0: 20 74 65 73 74 20 73 74 61 74 75 73 20 74 6f 20   test status to 
92b0: 50 41 53 53 2e 0a 3b 3b 20 20 20 20 69 66 20 6f  PASS..;;    if o
92c0: 6e 65 20 6f 72 20 6d 6f 72 65 20 61 72 65 20 66  ne or more are f
92d0: 61 69 6c 20 28 61 6e 79 20 63 61 73 65 29 20 74  ail (any case) t
92e0: 68 65 6e 20 73 65 74 20 74 65 73 74 20 73 74 61  hen set test sta
92f0: 74 75 73 20 74 6f 20 50 41 53 53 2c 20 6e 6f 6e  tus to PASS, non
9300: 20 22 70 61 73 73 22 20 6f 72 20 22 66 61 69 6c   "pass" or "fail
9310: 22 20 61 72 65 20 69 67 6e 6f 72 65 64 0a 28 64  " are ignored.(d
9320: 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74 2d 64  efine (db:test-d
9330: 61 74 61 2d 72 6f 6c 6c 75 70 20 64 62 20 74 65  ata-rollup db te
9340: 73 74 2d 69 64 20 73 74 61 74 75 73 29 0a 20 20  st-id status).  
9350: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
9360: 20 0a 20 20 20 64 62 20 0a 20 20 20 22 55 50 44   .   db .   "UPD
9370: 41 54 45 20 74 65 73 74 73 20 0a 20 20 20 20 20  ATE tests .     
9380: 20 53 45 54 20 66 61 69 6c 5f 63 6f 75 6e 74 3d   SET fail_count=
9390: 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 69 64  (SELECT count(id
93a0: 29 20 46 52 4f 4d 20 74 65 73 74 5f 64 61 74 61  ) FROM test_data
93b0: 20 57 48 45 52 45 20 74 65 73 74 5f 69 64 3d 3f   WHERE test_id=?
93c0: 20 41 4e 44 20 73 74 61 74 75 73 20 6c 69 6b 65   AND status like
93d0: 20 27 66 61 69 6c 27 29 2c 0a 20 20 20 20 20 20   'fail'),.      
93e0: 20 20 20 20 70 61 73 73 5f 63 6f 75 6e 74 3d 28      pass_count=(
93f0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 69 64 29  SELECT count(id)
9400: 20 46 52 4f 4d 20 74 65 73 74 5f 64 61 74 61 20   FROM test_data 
9410: 57 48 45 52 45 20 74 65 73 74 5f 69 64 3d 3f 20  WHERE test_id=? 
9420: 41 4e 44 20 73 74 61 74 75 73 20 6c 69 6b 65 20  AND status like 
9430: 27 70 61 73 73 27 29 0a 20 20 20 20 20 20 57 48  'pass').      WH
9440: 45 52 45 20 69 64 3d 3f 3b 22 0a 20 20 20 74 65  ERE id=?;".   te
9450: 73 74 2d 69 64 20 74 65 73 74 2d 69 64 20 74 65  st-id test-id te
9460: 73 74 2d 69 64 29 0a 20 20 3b 3b 20 69 66 20 74  st-id).  ;; if t
9470: 68 65 20 74 65 73 74 20 69 73 20 6e 6f 74 20 46  he test is not F
9480: 41 49 4c 20 74 68 65 6e 20 73 65 74 20 73 74 61  AIL then set sta
9490: 74 75 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65  tus based on the
94a0: 20 66 61 69 6c 20 61 6e 64 20 70 61 73 73 20 63   fail and pass c
94b0: 6f 75 6e 74 73 2e 0a 20 20 28 74 68 72 65 61 64  ounts..  (thread
94c0: 2d 73 6c 65 65 70 21 20 31 29 0a 20 20 28 73 71  -sleep! 1).  (sq
94d0: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 0a 20 20  lite3:execute.  
94e0: 20 64 62 20 20 20 3b 3b 3b 20 4e 4f 54 45 3a 20   db   ;;; NOTE: 
94f0: 53 68 6f 75 6c 64 20 74 68 69 73 20 62 65 20 57  Should this be W
9500: 41 52 4e 2c 46 41 49 4c 3f 20 41 20 57 41 52 4e  ARN,FAIL? A WARN
9510: 20 69 73 20 6e 6f 74 20 61 20 46 41 49 4c 3f 3f   is not a FAIL??
9520: 3f 3f 3f 20 42 55 47 20 46 49 58 4d 45 0a 20 20  ??? BUG FIXME.  
9530: 20 22 55 50 44 41 54 45 20 74 65 73 74 73 0a 20   "UPDATE tests. 
9540: 20 20 20 20 20 53 45 54 20 73 74 61 74 75 73 3d       SET status=
9550: 43 41 53 45 20 57 48 45 4e 20 28 53 45 4c 45 43  CASE WHEN (SELEC
9560: 54 20 66 61 69 6c 5f 63 6f 75 6e 74 20 46 52 4f  T fail_count FRO
9570: 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 69 64  M tests WHERE id
9580: 3d 3f 29 20 3e 20 30 20 0a 20 20 20 20 20 20 20  =?) > 0 .       
9590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95a0: 20 20 54 48 45 4e 20 27 46 41 49 4c 27 0a 20 20    THEN 'FAIL'.  
95b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95c0: 20 20 20 20 57 48 45 4e 20 28 53 45 4c 45 43 54      WHEN (SELECT
95d0: 20 70 61 73 73 5f 63 6f 75 6e 74 20 46 52 4f 4d   pass_count FROM
95e0: 20 74 65 73 74 73 20 57 48 45 52 45 20 69 64 3d   tests WHERE id=
95f0: 3f 29 20 3e 20 30 20 41 4e 44 20 0a 20 20 20 20  ?) > 0 AND .    
9600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9610: 20 20 20 20 20 20 20 28 53 45 4c 45 43 54 20 73         (SELECT s
9620: 74 61 74 75 73 20 46 52 4f 4d 20 74 65 73 74 73  tatus FROM tests
9630: 20 57 48 45 52 45 20 69 64 3d 3f 29 20 4e 4f 54   WHERE id=?) NOT
9640: 20 49 4e 20 28 27 57 41 52 4e 27 2c 27 46 41 49   IN ('WARN','FAI
9650: 4c 27 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  L').            
9660: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 48 45               THE
9670: 4e 20 27 50 41 53 53 27 0a 20 20 20 20 20 20 20  N 'PASS'.       
9680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
9690: 4c 53 45 20 73 74 61 74 75 73 0a 20 20 20 20 20  LSE status.     
96a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 45 4e 44               END
96b0: 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 0a 20 20   WHERE id=?;".  
96c0: 20 74 65 73 74 2d 69 64 20 74 65 73 74 2d 69 64   test-id test-id
96d0: 20 74 65 73 74 2d 69 64 20 74 65 73 74 2d 69 64   test-id test-id
96e0: 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  ))..(define (db:
96f0: 67 65 74 2d 70 72 65 76 2d 74 6f 6c 2d 66 6f 72  get-prev-tol-for
9700: 2d 74 65 73 74 20 64 62 20 74 65 73 74 2d 69 64  -test db test-id
9710: 20 63 61 74 65 67 6f 72 79 20 76 61 72 69 61 62   category variab
9720: 6c 65 29 0a 20 20 3b 3b 20 46 69 6e 69 73 68 20  le).  ;; Finish 
9730: 6d 65 3f 0a 20 20 28 76 61 6c 75 65 73 20 23 66  me?.  (values #f
9740: 20 23 66 20 23 66 29 29 0a 0a 3b 3b 3d 3d 3d 3d   #f #f))..;;====
9750: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
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 0a 3b 3b 20 53 20 54 20 45 20 50 20 53 20  ==.;; S T E P S 
97a0: 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  .;;=============
97b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
97c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
97d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
97e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65 66 69  =========..(defi
97f0: 6e 65 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d  ne (db:step-get-
9800: 74 69 6d 65 2d 61 73 2d 73 74 72 69 6e 67 20 76  time-as-string v
9810: 65 63 29 0a 20 20 28 73 65 63 6f 6e 64 73 2d 3e  ec).  (seconds->
9820: 74 69 6d 65 2d 73 74 72 69 6e 67 20 28 64 62 3a  time-string (db:
9830: 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74  step-get-event_t
9840: 69 6d 65 20 76 65 63 29 29 29 0a 0a 3b 3b 20 64  ime vec)))..;; d
9850: 62 2d 67 65 74 2d 74 65 73 74 2d 73 74 65 70 73  b-get-test-steps
9860: 2d 66 6f 72 2d 72 75 6e 0a 28 64 65 66 69 6e 65  -for-run.(define
9870: 20 28 64 62 3a 67 65 74 2d 73 74 65 70 73 2d 66   (db:get-steps-f
9880: 6f 72 2d 74 65 73 74 20 64 62 20 74 65 73 74 2d  or-test db test-
9890: 69 64 29 0a 20 20 28 6c 65 74 20 28 28 72 65 73  id).  (let ((res
98a0: 20 27 28 29 29 29 0a 20 20 20 20 28 73 71 6c 69   '())).    (sqli
98b0: 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77  te3:for-each-row
98c0: 20 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28   .     (lambda (
98d0: 69 64 20 74 65 73 74 2d 69 64 20 73 74 65 70 6e  id test-id stepn
98e0: 61 6d 65 20 73 74 61 74 65 20 73 74 61 74 75 73  ame state status
98f0: 20 65 76 65 6e 74 2d 74 69 6d 65 20 6c 6f 67 66   event-time logf
9900: 69 6c 65 29 0a 20 20 20 20 20 20 20 28 73 65 74  ile).       (set
9910: 21 20 72 65 73 20 28 63 6f 6e 73 20 28 76 65 63  ! res (cons (vec
9920: 74 6f 72 20 69 64 20 74 65 73 74 2d 69 64 20 73  tor id test-id s
9930: 74 65 70 6e 61 6d 65 20 73 74 61 74 65 20 73 74  tepname state st
9940: 61 74 75 73 20 65 76 65 6e 74 2d 74 69 6d 65 20  atus event-time 
9950: 28 69 66 20 28 73 74 72 69 6e 67 3f 20 6c 6f 67  (if (string? log
9960: 66 69 6c 65 29 20 6c 6f 67 66 69 6c 65 20 22 22  file) logfile ""
9970: 29 29 20 72 65 73 29 29 29 0a 20 20 20 20 20 64  )) res))).     d
9980: 62 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20 69  b.     "SELECT i
9990: 64 2c 74 65 73 74 5f 69 64 2c 73 74 65 70 6e 61  d,test_id,stepna
99a0: 6d 65 2c 73 74 61 74 65 2c 73 74 61 74 75 73 2c  me,state,status,
99b0: 65 76 65 6e 74 5f 74 69 6d 65 2c 6c 6f 67 66 69  event_time,logfi
99c0: 6c 65 20 46 52 4f 4d 20 74 65 73 74 5f 73 74 65  le FROM test_ste
99d0: 70 73 20 57 48 45 52 45 20 74 65 73 74 5f 69 64  ps WHERE test_id
99e0: 3d 3f 20 4f 52 44 45 52 20 42 59 20 69 64 20 41  =? ORDER BY id A
99f0: 53 43 3b 22 20 3b 3b 20 65 76 65 6e 74 5f 74 69  SC;" ;; event_ti
9a00: 6d 65 20 44 45 53 43 2c 69 64 20 41 53 43 3b 0a  me DESC,id ASC;.
9a10: 20 20 20 20 20 74 65 73 74 2d 69 64 29 0a 20 20       test-id).  
9a20: 20 20 28 72 65 76 65 72 73 65 20 72 65 73 29 29    (reverse res))
9a30: 29 0a 0a 3b 3b 20 67 65 74 20 61 20 70 72 65 74  )..;; get a pret
9a40: 74 79 20 74 61 62 6c 65 20 74 6f 20 73 75 6d 6d  ty table to summ
9a50: 61 72 69 7a 65 20 73 74 65 70 73 0a 3b 3b 0a 28  arize steps.;;.(
9a60: 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 73  define (db:get-s
9a70: 74 65 70 73 2d 74 61 62 6c 65 20 64 62 20 74 65  teps-table db te
9a80: 73 74 2d 69 64 29 0a 20 20 28 6c 65 74 20 28 28  st-id).  (let ((
9a90: 73 74 65 70 73 20 20 20 28 64 62 3a 67 65 74 2d  steps   (db:get-
9aa0: 73 74 65 70 73 2d 66 6f 72 2d 74 65 73 74 20 64  steps-for-test d
9ab0: 62 20 74 65 73 74 2d 69 64 29 29 29 0a 20 20 20  b test-id))).   
9ac0: 20 3b 3b 20 6f 72 67 61 6e 69 73 65 20 74 68 65   ;; organise the
9ad0: 20 73 74 65 70 73 20 66 6f 72 20 62 65 74 74 65   steps for bette
9ae0: 72 20 72 65 61 64 61 62 69 6c 69 74 79 0a 20 20  r readability.  
9af0: 20 20 28 6c 65 74 20 28 28 72 65 73 20 28 6d 61    (let ((res (ma
9b00: 6b 65 2d 68 61 73 68 2d 74 61 62 6c 65 29 29 29  ke-hash-table)))
9b10: 0a 20 20 20 20 20 20 28 66 6f 72 2d 65 61 63 68  .      (for-each
9b20: 20 0a 20 20 20 20 20 20 20 28 6c 61 6d 62 64 61   .       (lambda
9b30: 20 28 73 74 65 70 29 0a 09 20 28 64 65 62 75 67   (step).. (debug
9b40: 3a 70 72 69 6e 74 20 36 20 22 73 74 65 70 3d 22  :print 6 "step="
9b50: 20 73 74 65 70 29 0a 09 20 28 6c 65 74 20 28 28   step).. (let ((
9b60: 72 65 63 6f 72 64 20 28 68 61 73 68 2d 74 61 62  record (hash-tab
9b70: 6c 65 2d 72 65 66 2f 64 65 66 61 75 6c 74 20 0a  le-ref/default .
9b80: 09 09 09 72 65 73 20 0a 09 09 09 28 64 62 3a 73  ...res ....(db:s
9b90: 74 65 70 2d 67 65 74 2d 73 74 65 70 6e 61 6d 65  tep-get-stepname
9ba0: 20 73 74 65 70 29 20 0a 09 09 09 3b 3b 20 20 20   step) ....;;   
9bb0: 20 20 20 20 20 73 74 65 70 6e 61 6d 65 20 20 20       stepname   
9bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61               sta
9bd0: 72 74 20 65 6e 64 20 73 74 61 74 75 73 20 20 20  rt end status   
9be0: 20 0a 09 09 09 28 76 65 63 74 6f 72 20 28 64 62   ....(vector (db
9bf0: 3a 73 74 65 70 2d 67 65 74 2d 73 74 65 70 6e 61  :step-get-stepna
9c00: 6d 65 20 73 74 65 70 29 20 22 22 20 20 20 22 22  me step) ""   ""
9c10: 20 22 22 20 20 20 20 20 22 22 20 22 22 29 29 29   ""     "" "")))
9c20: 29 0a 09 20 20 20 28 64 65 62 75 67 3a 70 72 69  )..   (debug:pri
9c30: 6e 74 20 36 20 22 72 65 63 6f 72 64 28 62 65 66  nt 6 "record(bef
9c40: 6f 72 65 29 20 3d 20 22 20 72 65 63 6f 72 64 20  ore) = " record 
9c50: 0a 09 09 09 22 5c 6e 69 64 3a 20 20 20 20 20 20  ...."\nid:      
9c60: 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d   " (db:step-get-
9c70: 69 64 20 73 74 65 70 29 0a 09 09 09 22 5c 6e 73  id step)...."\ns
9c80: 74 65 70 6e 61 6d 65 3a 20 22 20 28 64 62 3a 73  tepname: " (db:s
9c90: 74 65 70 2d 67 65 74 2d 73 74 65 70 6e 61 6d 65  tep-get-stepname
9ca0: 20 73 74 65 70 29 0a 09 09 09 22 5c 6e 73 74 61   step)...."\nsta
9cb0: 74 65 3a 20 20 20 20 22 20 28 64 62 3a 73 74 65  te:    " (db:ste
9cc0: 70 2d 67 65 74 2d 73 74 61 74 65 20 73 74 65 70  p-get-state step
9cd0: 29 0a 09 09 09 22 5c 6e 73 74 61 74 75 73 3a 20  )...."\nstatus: 
9ce0: 20 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74    " (db:step-get
9cf0: 2d 73 74 61 74 75 73 20 73 74 65 70 29 0a 09 09  -status step)...
9d00: 09 22 5c 6e 74 69 6d 65 3a 20 20 20 20 20 22 20  ."\ntime:     " 
9d10: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65  (db:step-get-eve
9d20: 6e 74 5f 74 69 6d 65 20 73 74 65 70 29 29 0a 09  nt_time step))..
9d30: 20 20 20 28 63 61 73 65 20 28 73 74 72 69 6e 67     (case (string
9d40: 2d 3e 73 79 6d 62 6f 6c 20 28 64 62 3a 73 74 65  ->symbol (db:ste
9d50: 70 2d 67 65 74 2d 73 74 61 74 65 20 73 74 65 70  p-get-state step
9d60: 29 29 0a 09 20 20 20 20 20 28 28 73 74 61 72 74  ))..     ((start
9d70: 29 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72 65  )(vector-set! re
9d80: 63 6f 72 64 20 31 20 28 64 62 3a 73 74 65 70 2d  cord 1 (db:step-
9d90: 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73  get-event_time s
9da0: 74 65 70 29 29 0a 09 20 20 20 20 20 20 28 76 65  tep))..      (ve
9db0: 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64  ctor-set! record
9dc0: 20 33 20 28 69 66 20 28 65 71 75 61 6c 3f 20 28   3 (if (equal? (
9dd0: 76 65 63 74 6f 72 2d 72 65 66 20 72 65 63 6f 72  vector-ref recor
9de0: 64 20 33 29 20 22 22 29 0a 09 09 09 09 09 28 64  d 3) "")......(d
9df0: 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 74 75  b:step-get-statu
9e00: 73 20 73 74 65 70 29 29 29 0a 09 20 20 20 20 20  s step)))..     
9e10: 20 28 69 66 20 28 3e 20 28 73 74 72 69 6e 67 2d   (if (> (string-
9e20: 6c 65 6e 67 74 68 20 28 64 62 3a 73 74 65 70 2d  length (db:step-
9e30: 67 65 74 2d 6c 6f 67 66 69 6c 65 20 73 74 65 70  get-logfile step
9e40: 29 29 0a 09 09 20 20 20 20 20 30 29 0a 09 09 20  ))...     0)... 
9e50: 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72 65   (vector-set! re
9e60: 63 6f 72 64 20 35 20 28 64 62 3a 73 74 65 70 2d  cord 5 (db:step-
9e70: 67 65 74 2d 6c 6f 67 66 69 6c 65 20 73 74 65 70  get-logfile step
9e80: 29 29 29 29 0a 09 20 20 20 20 20 28 28 65 6e 64  ))))..     ((end
9e90: 29 20 20 0a 09 20 20 20 20 20 20 28 76 65 63 74  )  ..      (vect
9ea0: 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 32  or-set! record 2
9eb0: 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 20 28 64   (any->number (d
9ec0: 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74  b:step-get-event
9ed0: 5f 74 69 6d 65 20 73 74 65 70 29 29 29 0a 09 20  _time step))).. 
9ee0: 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74       (vector-set
9ef0: 21 20 72 65 63 6f 72 64 20 33 20 28 64 62 3a 73  ! record 3 (db:s
9f00: 74 65 70 2d 67 65 74 2d 73 74 61 74 75 73 20 73  tep-get-status s
9f10: 74 65 70 29 29 0a 09 20 20 20 20 20 20 28 76 65  tep))..      (ve
9f20: 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64  ctor-set! record
9f30: 20 34 20 28 6c 65 74 20 28 28 73 74 61 72 74 74   4 (let ((startt
9f40: 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 20 28 76   (any->number (v
9f50: 65 63 74 6f 72 2d 72 65 66 20 72 65 63 6f 72 64  ector-ref record
9f60: 20 31 29 29 29 0a 09 09 09 09 09 20 20 28 65 6e   1)))......  (en
9f70: 64 74 20 20 20 28 61 6e 79 2d 3e 6e 75 6d 62 65  dt   (any->numbe
9f80: 72 20 28 76 65 63 74 6f 72 2d 72 65 66 20 72 65  r (vector-ref re
9f90: 63 6f 72 64 20 32 29 29 29 29 0a 09 09 09 09 20  cord 2))))..... 
9fa0: 20 20 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e       (debug:prin
9fb0: 74 20 34 20 22 72 65 63 6f 72 64 5b 31 5d 3d 22  t 4 "record[1]="
9fc0: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 72 65 63   (vector-ref rec
9fd0: 6f 72 64 20 31 29 20 0a 09 09 09 09 09 09 20 20  ord 1) .......  
9fe0: 20 22 2c 20 73 74 61 72 74 74 3d 22 20 73 74 61   ", startt=" sta
9ff0: 72 74 74 20 22 2c 20 65 6e 64 74 3d 22 20 65 6e  rtt ", endt=" en
a000: 64 74 0a 09 09 09 09 09 09 20 20 20 22 2c 20 67  dt.......   ", g
a010: 65 74 2d 73 74 61 74 75 73 3a 20 22 20 28 64 62  et-status: " (db
a020: 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 74 75 73  :step-get-status
a030: 20 73 74 65 70 29 29 0a 09 09 09 09 20 20 20 20   step)).....    
a040: 20 20 28 69 66 20 28 61 6e 64 20 28 6e 75 6d 62    (if (and (numb
a050: 65 72 3f 20 73 74 61 72 74 74 29 28 6e 75 6d 62  er? startt)(numb
a060: 65 72 3f 20 65 6e 64 74 29 29 0a 09 09 09 09 09  er? endt))......
a070: 20 20 28 73 65 63 6f 6e 64 73 2d 3e 68 72 2d 6d    (seconds->hr-m
a080: 69 6e 2d 73 65 63 20 28 2d 20 65 6e 64 74 20 73  in-sec (- endt s
a090: 74 61 72 74 74 29 29 20 22 2d 31 22 29 29 29 0a  tartt)) "-1"))).
a0a0: 09 20 20 20 20 20 20 28 69 66 20 28 3e 20 28 73  .      (if (> (s
a0b0: 74 72 69 6e 67 2d 6c 65 6e 67 74 68 20 28 64 62  tring-length (db
a0c0: 3a 73 74 65 70 2d 67 65 74 2d 6c 6f 67 66 69 6c  :step-get-logfil
a0d0: 65 20 73 74 65 70 29 29 0a 09 09 20 20 20 20 20  e step))...     
a0e0: 30 29 0a 09 09 20 20 28 76 65 63 74 6f 72 2d 73  0)...  (vector-s
a0f0: 65 74 21 20 72 65 63 6f 72 64 20 35 20 28 64 62  et! record 5 (db
a100: 3a 73 74 65 70 2d 67 65 74 2d 6c 6f 67 66 69 6c  :step-get-logfil
a110: 65 20 73 74 65 70 29 29 29 29 0a 09 20 20 20 20  e step))))..    
a120: 20 28 65 6c 73 65 0a 09 20 20 20 20 20 20 28 76   (else..      (v
a130: 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72  ector-set! recor
a140: 64 20 32 20 28 64 62 3a 73 74 65 70 2d 67 65 74  d 2 (db:step-get
a150: 2d 73 74 61 74 65 20 73 74 65 70 29 29 0a 09 20  -state step)).. 
a160: 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74       (vector-set
a170: 21 20 72 65 63 6f 72 64 20 33 20 28 64 62 3a 73  ! record 3 (db:s
a180: 74 65 70 2d 67 65 74 2d 73 74 61 74 75 73 20 73  tep-get-status s
a190: 74 65 70 29 29 0a 09 20 20 20 20 20 20 28 76 65  tep))..      (ve
a1a0: 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64  ctor-set! record
a1b0: 20 34 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d   4 (db:step-get-
a1c0: 65 76 65 6e 74 5f 74 69 6d 65 20 73 74 65 70 29  event_time step)
a1d0: 29 29 29 0a 09 20 20 20 28 68 61 73 68 2d 74 61  )))..   (hash-ta
a1e0: 62 6c 65 2d 73 65 74 21 20 72 65 73 20 28 64 62  ble-set! res (db
a1f0: 3a 73 74 65 70 2d 67 65 74 2d 73 74 65 70 6e 61  :step-get-stepna
a200: 6d 65 20 73 74 65 70 29 20 72 65 63 6f 72 64 29  me step) record)
a210: 0a 09 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e  ..   (debug:prin
a220: 74 20 36 20 22 72 65 63 6f 72 64 28 61 66 74 65  t 6 "record(afte
a230: 72 29 20 20 3d 20 22 20 72 65 63 6f 72 64 20 0a  r)  = " record .
a240: 09 09 09 22 5c 6e 69 64 3a 20 20 20 20 20 20 20  ..."\nid:       
a250: 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 69  " (db:step-get-i
a260: 64 20 73 74 65 70 29 0a 09 09 09 22 5c 6e 73 74  d step)...."\nst
a270: 65 70 6e 61 6d 65 3a 20 22 20 28 64 62 3a 73 74  epname: " (db:st
a280: 65 70 2d 67 65 74 2d 73 74 65 70 6e 61 6d 65 20  ep-get-stepname 
a290: 73 74 65 70 29 0a 09 09 09 22 5c 6e 73 74 61 74  step)...."\nstat
a2a0: 65 3a 20 20 20 20 22 20 28 64 62 3a 73 74 65 70  e:    " (db:step
a2b0: 2d 67 65 74 2d 73 74 61 74 65 20 73 74 65 70 29  -get-state step)
a2c0: 0a 09 09 09 22 5c 6e 73 74 61 74 75 73 3a 20 20  ...."\nstatus:  
a2d0: 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d   " (db:step-get-
a2e0: 73 74 61 74 75 73 20 73 74 65 70 29 0a 09 09 09  status step)....
a2f0: 22 5c 6e 74 69 6d 65 3a 20 20 20 20 20 22 20 28  "\ntime:     " (
a300: 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 6e  db:step-get-even
a310: 74 5f 74 69 6d 65 20 73 74 65 70 29 29 29 29 0a  t_time step)))).
a320: 20 20 20 20 20 20 20 3b 3b 20 28 65 6c 73 65 20         ;; (else 
a330: 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72    (vector-set! r
a340: 65 63 6f 72 64 20 31 20 28 64 62 3a 73 74 65 70  ecord 1 (db:step
a350: 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20  -get-event_time 
a360: 73 74 65 70 29 29 29 0a 20 20 20 20 20 20 20 28  step))).       (
a370: 73 6f 72 74 20 73 74 65 70 73 20 28 6c 61 6d 62  sort steps (lamb
a380: 64 61 20 28 61 20 62 29 28 3c 20 28 64 62 3a 73  da (a b)(< (db:s
a390: 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69  tep-get-event_ti
a3a0: 6d 65 20 61 29 28 64 62 3a 73 74 65 70 2d 67 65  me a)(db:step-ge
a3b0: 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 62 29 29  t-event_time b))
a3c0: 29 29 29 0a 20 20 20 20 20 20 72 65 73 29 29 29  ))).      res)))
a3d0: 0a 0a 3b 3b 20 74 68 65 20 6e 65 77 20 70 72 65  ..;; the new pre
a3e0: 72 65 71 73 20 63 61 6c 63 75 6c 61 74 69 6f 6e  reqs calculation
a3f0: 2c 20 6c 6f 6f 6b 73 20 61 6c 73 6f 20 61 74 20  , looks also at 
a400: 69 74 65 6d 70 61 74 68 20 69 66 20 73 70 65 63  itempath if spec
a410: 69 66 69 65 64 0a 3b 3b 20 61 6c 6c 20 70 72 65  ified.;; all pre
a420: 72 65 71 73 20 6d 75 73 74 20 62 65 20 6d 65 74  reqs must be met
a430: 3a 0a 3b 3b 20 20 20 20 69 66 20 70 72 65 72 65  :.;;    if prere
a440: 71 20 74 65 73 74 20 77 69 74 68 20 69 74 65 6d  q test with item
a450: 70 61 74 68 3d 27 27 20 69 73 20 43 4f 4d 50 4c  path='' is COMPL
a460: 45 54 45 44 20 61 6e 64 20 50 41 53 53 2c 20 57  ETED and PASS, W
a470: 41 52 4e 2c 20 43 48 45 43 4b 2c 20 6f 72 20 57  ARN, CHECK, or W
a480: 41 49 56 45 44 20 74 68 65 6e 20 70 72 65 72 65  AIVED then prere
a490: 71 20 69 73 20 6d 65 74 0a 3b 3b 20 20 20 20 69  q is met.;;    i
a4a0: 66 20 70 72 65 72 65 71 20 74 65 73 74 20 77 69  f prereq test wi
a4b0: 74 68 20 69 74 65 6d 70 61 74 68 3d 72 65 66 2d  th itempath=ref-
a4c0: 69 74 65 6d 2d 70 61 74 68 20 61 6e 64 20 43 4f  item-path and CO
a4d0: 4d 50 4c 45 54 45 44 20 77 69 74 68 20 50 41 53  MPLETED with PAS
a4e0: 53 2c 20 57 41 52 4e 2c 20 43 48 45 43 4b 2c 20  S, WARN, CHECK, 
a4f0: 6f 72 20 57 41 49 56 45 44 20 74 68 65 6e 20 70  or WAIVED then p
a500: 72 65 72 65 71 20 69 73 20 6d 65 74 0a 3b 3b 0a  rereq is met.;;.
a510: 3b 3b 20 4e 6f 74 65 3a 20 64 6f 20 6e 6f 74 20  ;; Note: do not 
a520: 63 6f 6e 76 65 72 74 20 74 6f 20 72 65 6d 6f 74  convert to remot
a530: 65 20 61 73 20 69 74 20 63 61 6c 6c 73 20 72 65  e as it calls re
a540: 6d 6f 74 65 20 75 6e 64 65 72 20 74 68 65 20 68  mote under the h
a550: 6f 6f 64 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 28  ood.;;.(define (
a560: 64 62 3a 67 65 74 2d 70 72 65 72 65 71 73 2d 6e  db:get-prereqs-n
a570: 6f 74 2d 6d 65 74 20 64 62 20 72 75 6e 2d 69 64  ot-met db run-id
a580: 20 77 61 69 74 6f 6e 73 20 72 65 66 2d 69 74 65   waitons ref-ite
a590: 6d 2d 70 61 74 68 29 0a 20 20 28 69 66 20 28 6f  m-path).  (if (o
a5a0: 72 20 28 6e 6f 74 20 77 61 69 74 6f 6e 73 29 0a  r (not waitons).
a5b0: 09 20 20 28 6e 75 6c 6c 3f 20 77 61 69 74 6f 6e  .  (null? waiton
a5c0: 73 29 29 0a 20 20 20 20 20 20 27 28 29 0a 20 20  s)).      '().  
a5d0: 20 20 20 20 28 6c 65 74 2a 20 28 28 75 6e 6d 65      (let* ((unme
a5e0: 74 2d 70 72 65 2d 72 65 71 73 20 27 28 29 29 0a  t-pre-reqs '()).
a5f0: 09 20 20 20 20 20 28 72 65 73 75 6c 74 20 20 20  .     (result   
a600: 20 20 20 20 20 20 27 28 29 29 29 0a 09 28 66 6f        '()))..(fo
a610: 72 2d 65 61 63 68 20 0a 09 20 28 6c 61 6d 62 64  r-each .. (lambd
a620: 61 20 28 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61  a (waitontest-na
a630: 6d 65 29 0a 09 20 20 20 3b 3b 20 62 79 20 67 65  me)..   ;; by ge
a640: 74 74 69 6e 67 20 74 68 65 20 74 65 73 74 73 20  tting the tests 
a650: 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20 6e 61  with matching na
a660: 6d 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e  me we are lookin
a670: 67 20 6f 6e 6c 79 20 61 74 20 74 68 65 20 6d 61  g only at the ma
a680: 74 63 68 69 6e 67 20 74 65 73 74 20 0a 09 20 20  tching test ..  
a690: 20 3b 3b 20 61 6e 64 20 72 65 6c 61 74 65 64 20   ;; and related 
a6a0: 73 75 62 20 69 74 65 6d 73 0a 09 20 20 20 28 6c  sub items..   (l
a6b0: 65 74 20 28 28 74 65 73 74 73 20 20 20 20 20 20  et ((tests      
a6c0: 20 20 20 20 20 20 20 28 72 64 62 3a 67 65 74 2d         (rdb:get-
a6d0: 74 65 73 74 73 2d 66 6f 72 2d 72 75 6e 20 64 62  tests-for-run db
a6e0: 20 72 75 6e 2d 69 64 20 77 61 69 74 6f 6e 74 65   run-id waitonte
a6f0: 73 74 2d 6e 61 6d 65 20 23 66 20 27 28 29 20 27  st-name #f '() '
a700: 28 29 29 29 0a 09 09 20 28 65 76 65 72 2d 73 65  ()))... (ever-se
a710: 65 6e 20 20 20 20 20 20 20 20 20 23 66 29 0a 09  en         #f)..
a720: 09 20 28 70 61 72 65 6e 74 2d 77 61 69 74 6f 6e  . (parent-waiton
a730: 2d 6d 65 74 20 23 66 29 0a 09 09 20 28 69 74 65  -met #f)... (ite
a740: 6d 2d 77 61 69 74 6f 6e 2d 6d 65 74 20 20 20 23  m-waiton-met   #
a750: 66 29 29 0a 09 20 20 20 20 20 28 66 6f 72 2d 65  f))..     (for-e
a760: 61 63 68 20 0a 09 20 20 20 20 20 20 28 6c 61 6d  ach ..      (lam
a770: 62 64 61 20 28 74 65 73 74 29 0a 09 09 3b 3b 20  bda (test)...;; 
a780: 28 69 66 20 28 65 71 75 61 6c 3f 20 77 61 69 74  (if (equal? wait
a790: 6f 6e 74 65 73 74 2d 6e 61 6d 65 20 28 64 62 3a  ontest-name (db:
a7a0: 74 65 73 74 2d 67 65 74 2d 74 65 73 74 6e 61 6d  test-get-testnam
a7b0: 65 20 74 65 73 74 29 29 20 3b 3b 20 62 79 20 64  e test)) ;; by d
a7c0: 65 66 69 6e 74 69 6f 6e 20 74 68 69 73 20 68 61  efintion this ha
a7d0: 64 20 62 65 74 74 65 72 20 62 65 20 74 72 75 65  d better be true
a7e0: 20 2e 2e 2e 0a 09 09 28 6c 65 74 2a 20 28 28 73   ......(let* ((s
a7f0: 74 61 74 65 20 20 20 20 20 20 20 20 20 20 20 20  tate            
a800: 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 73 74   (db:test-get-st
a810: 61 74 65 20 74 65 73 74 29 29 0a 09 09 20 20 20  ate test))...   
a820: 20 20 20 20 28 73 74 61 74 75 73 20 20 20 20 20      (status     
a830: 20 20 20 20 20 20 20 28 64 62 3a 74 65 73 74 2d         (db:test-
a840: 67 65 74 2d 73 74 61 74 75 73 20 74 65 73 74 29  get-status test)
a850: 29 0a 09 09 20 20 20 20 20 20 20 28 69 74 65 6d  )...       (item
a860: 2d 70 61 74 68 20 20 20 20 20 20 20 20 20 28 64  -path         (d
a870: 62 3a 74 65 73 74 2d 67 65 74 2d 69 74 65 6d 2d  b:test-get-item-
a880: 70 61 74 68 20 74 65 73 74 29 29 0a 09 09 20 20  path test))...  
a890: 20 20 20 20 20 28 69 73 2d 63 6f 6d 70 6c 65 74       (is-complet
a8a0: 65 64 20 20 20 20 20 20 28 65 71 75 61 6c 3f 20  ed      (equal? 
a8b0: 73 74 61 74 65 20 22 43 4f 4d 50 4c 45 54 45 44  state "COMPLETED
a8c0: 22 29 29 0a 09 09 20 20 20 20 20 20 20 28 69 73  "))...       (is
a8d0: 2d 6f 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  -ok             
a8e0: 28 6d 65 6d 62 65 72 20 73 74 61 74 75 73 20 27  (member status '
a8f0: 28 22 50 41 53 53 22 20 22 57 41 52 4e 22 20 22  ("PASS" "WARN" "
a900: 43 48 45 43 4b 22 20 22 57 41 49 56 45 44 22 29  CHECK" "WAIVED")
a910: 29 29 0a 09 09 20 20 20 20 20 20 20 28 73 61 6d  ))...       (sam
a920: 65 2d 69 74 65 6d 70 61 74 68 20 20 20 20 20 28  e-itempath     (
a930: 65 71 75 61 6c 3f 20 72 65 66 2d 69 74 65 6d 2d  equal? ref-item-
a940: 70 61 74 68 20 69 74 65 6d 2d 70 61 74 68 29 29  path item-path))
a950: 29 0a 09 09 20 20 28 73 65 74 21 20 65 76 65 72  )...  (set! ever
a960: 2d 73 65 65 6e 20 23 74 29 0a 09 09 20 20 28 63  -seen #t)...  (c
a970: 6f 6e 64 0a 09 09 20 20 20 3b 3b 20 63 61 73 65  ond...   ;; case
a980: 20 31 2c 20 6e 6f 6e 2d 69 74 65 6d 20 28 70 61   1, non-item (pa
a990: 72 65 6e 74 20 74 65 73 74 29 20 69 73 20 0a 09  rent test) is ..
a9a0: 09 20 20 20 28 28 61 6e 64 20 28 65 71 75 61 6c  .   ((and (equal
a9b0: 3f 20 69 74 65 6d 2d 70 61 74 68 20 22 22 29 20  ? item-path "") 
a9c0: 3b 3b 20 74 68 69 73 20 69 73 20 74 68 65 20 70  ;; this is the p
a9d0: 61 72 65 6e 74 20 74 65 73 74 0a 09 09 09 20 69  arent test.... i
a9e0: 73 2d 63 6f 6d 70 6c 65 74 65 64 0a 09 09 09 20  s-completed.... 
a9f0: 69 73 2d 6f 6b 29 0a 09 09 20 20 20 20 28 73 65  is-ok)...    (se
aa00: 74 21 20 70 61 72 65 6e 74 2d 77 61 69 74 6f 6e  t! parent-waiton
aa10: 2d 6d 65 74 20 23 74 29 29 0a 09 09 20 20 20 28  -met #t))...   (
aa20: 28 61 6e 64 20 73 61 6d 65 2d 69 74 65 6d 70 61  (and same-itempa
aa30: 74 68 0a 09 09 09 20 69 73 2d 63 6f 6d 70 6c 65  th.... is-comple
aa40: 74 65 64 0a 09 09 09 20 69 73 2d 6f 6b 29 0a 09  ted.... is-ok)..
aa50: 09 20 20 20 20 28 73 65 74 21 20 69 74 65 6d 2d  .    (set! item-
aa60: 77 61 69 74 6f 6e 2d 6d 65 74 20 23 74 29 29 29  waiton-met #t)))
aa70: 29 29 0a 09 20 20 20 20 20 20 74 65 73 74 73 29  ))..      tests)
aa80: 0a 09 20 20 20 20 20 28 69 66 20 28 6e 6f 74 20  ..     (if (not 
aa90: 28 6f 72 20 70 61 72 65 6e 74 2d 77 61 69 74 6f  (or parent-waito
aaa0: 6e 2d 6d 65 74 20 69 74 65 6d 2d 77 61 69 74 6f  n-met item-waito
aab0: 6e 2d 6d 65 74 29 29 0a 09 09 20 28 73 65 74 21  n-met))... (set!
aac0: 20 72 65 73 75 6c 74 20 28 63 6f 6e 73 20 77 61   result (cons wa
aad0: 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 20 72 65  itontest-name re
aae0: 73 75 6c 74 29 29 29 0a 09 20 20 20 20 20 3b 3b  sult)))..     ;;
aaf0: 20 69 66 20 74 68 65 20 74 65 73 74 20 69 73 20   if the test is 
ab00: 6e 6f 74 20 66 6f 75 6e 64 20 74 68 65 6e 20 63  not found then c
ab10: 6c 65 61 72 6c 79 20 74 68 65 20 77 61 69 74 6f  learly the waito
ab20: 6e 20 69 73 20 6e 6f 74 20 6d 65 74 2e 2e 2e 0a  n is not met....
ab30: 09 20 20 20 20 20 28 69 66 20 28 6e 6f 74 20 65  .     (if (not e
ab40: 76 65 72 2d 73 65 65 6e 29 28 73 65 74 21 20 72  ver-seen)(set! r
ab50: 65 73 75 6c 74 20 28 63 6f 6e 73 20 77 61 69 74  esult (cons wait
ab60: 6f 6e 74 65 73 74 2d 6e 61 6d 65 20 72 65 73 75  ontest-name resu
ab70: 6c 74 29 29 29 29 29 0a 09 77 61 69 74 6f 6e 73  lt)))))..waitons
ab80: 29 0a 20 20 20 20 20 20 28 64 65 6c 65 74 65 2d  ).      (delete-
ab90: 64 75 70 6c 69 63 61 74 65 73 20 72 65 73 75 6c  duplicates resul
aba0: 74 29 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  t))))..(define (
abb0: 64 62 3a 74 65 73 74 73 74 65 70 2d 73 65 74 2d  db:teststep-set-
abc0: 73 74 61 74 75 73 21 20 64 62 20 74 65 73 74 2d  status! db test-
abd0: 69 64 20 74 65 73 74 73 74 65 70 2d 6e 61 6d 65  id teststep-name
abe0: 20 73 74 61 74 65 2d 69 6e 20 73 74 61 74 75 73   state-in status
abf0: 2d 69 6e 20 69 74 65 6d 2d 70 61 74 68 20 63 6f  -in item-path co
ac00: 6d 6d 65 6e 74 20 6c 6f 67 66 69 6c 65 29 0a 20  mment logfile). 
ac10: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20   (debug:print 4 
ac20: 22 74 65 73 74 2d 69 64 3a 20 22 20 74 65 73 74  "test-id: " test
ac30: 2d 69 64 20 22 20 74 65 73 74 73 74 65 70 2d 6e  -id " teststep-n
ac40: 61 6d 65 3a 20 22 20 74 65 73 74 73 74 65 70 2d  ame: " teststep-
ac50: 6e 61 6d 65 29 0a 20 20 28 6c 65 74 2a 20 28 28  name).  (let* ((
ac60: 73 74 61 74 65 20 20 20 20 20 28 63 68 65 63 6b  state     (check
ac70: 2d 76 61 6c 69 64 2d 69 74 65 6d 73 20 22 73 74  -valid-items "st
ac80: 61 74 65 22 20 73 74 61 74 65 2d 69 6e 29 29 0a  ate" state-in)).
ac90: 09 20 28 73 74 61 74 75 73 20 20 20 20 28 63 68  . (status    (ch
aca0: 65 63 6b 2d 76 61 6c 69 64 2d 69 74 65 6d 73 20  eck-valid-items 
acb0: 22 73 74 61 74 75 73 22 20 73 74 61 74 75 73 2d  "status" status-
acc0: 69 6e 29 29 29 0a 20 20 20 20 28 69 66 20 28 6f  in))).    (if (o
acd0: 72 20 28 6e 6f 74 20 73 74 61 74 65 29 28 6e 6f  r (not state)(no
ace0: 74 20 73 74 61 74 75 73 29 29 0a 09 28 64 65 62  t status))..(deb
acf0: 75 67 3a 70 72 69 6e 74 20 30 20 22 57 41 52 4e  ug:print 0 "WARN
ad00: 49 4e 47 3a 20 49 6e 76 61 6c 69 64 20 22 20 28  ING: Invalid " (
ad10: 69 66 20 73 74 61 74 75 73 20 22 73 74 61 74 75  if status "statu
ad20: 73 22 20 22 73 74 61 74 65 22 29 0a 09 09 20 20  s" "state")...  
ad30: 20 20 20 22 20 76 61 6c 75 65 20 5c 22 22 20 28     " value \"" (
ad40: 69 66 20 73 74 61 74 75 73 20 73 74 61 74 65 2d  if status state-
ad50: 69 6e 20 73 74 61 74 75 73 2d 69 6e 29 20 22 5c  in status-in) "\
ad60: 22 2c 20 75 70 64 61 74 65 20 79 6f 75 72 20 76  ", update your v
ad70: 61 6c 69 64 76 61 6c 75 65 73 20 73 65 63 74 69  alidvalues secti
ad80: 6f 6e 20 69 6e 20 6d 65 67 61 74 65 73 74 2e 63  on in megatest.c
ad90: 6f 6e 66 69 67 22 29 29 0a 20 20 20 20 28 6d 75  onfig")).    (mu
ada0: 74 65 78 2d 6c 6f 63 6b 21 20 2a 69 6e 63 6f 6d  tex-lock! *incom
adb0: 69 6e 67 2d 6d 75 74 65 78 2a 29 0a 20 20 20 20  ing-mutex*).    
adc0: 28 73 65 74 21 20 2a 69 6e 63 6f 6d 69 6e 67 2d  (set! *incoming-
add0: 64 61 74 61 2a 20 28 63 6f 6e 73 20 28 76 65 63  data* (cons (vec
ade0: 74 6f 72 20 27 73 74 65 70 2d 73 74 61 74 75 73  tor 'step-status
adf0: 0a 09 09 09 09 09 28 63 75 72 72 65 6e 74 2d 73  ......(current-s
ae00: 65 63 6f 6e 64 73 29 0a 09 09 09 09 09 3b 3b 20  econds)......;; 
ae10: 46 49 58 4d 45 20 2d 20 74 68 69 73 20 73 68 6f  FIXME - this sho
ae20: 75 6c 64 20 6e 6f 74 20 75 70 64 61 74 65 20 74  uld not update t
ae30: 68 65 20 6c 6f 67 66 69 6c 65 20 75 6e 6c 65 73  he logfile unles
ae40: 73 20 69 74 20 69 73 20 73 70 65 63 69 66 69 65  s it is specifie
ae50: 64 2e 0a 09 09 09 09 09 28 6c 69 73 74 20 74 65  d.......(list te
ae60: 73 74 2d 69 64 20 74 65 73 74 73 74 65 70 2d 6e  st-id teststep-n
ae70: 61 6d 65 20 73 74 61 74 65 2d 69 6e 20 73 74 61  ame state-in sta
ae80: 74 75 73 2d 69 6e 20 28 63 75 72 72 65 6e 74 2d  tus-in (current-
ae90: 73 65 63 6f 6e 64 73 29 20 28 69 66 20 63 6f 6d  seconds) (if com
aea0: 6d 65 6e 74 20 63 6f 6d 6d 65 6e 74 20 22 22 29  ment comment "")
aeb0: 20 28 69 66 20 6c 6f 67 66 69 6c 65 20 6c 6f 67   (if logfile log
aec0: 66 69 6c 65 20 22 22 29 29 29 0a 09 09 09 09 2a  file ""))).....*
aed0: 69 6e 63 6f 6d 69 6e 67 2d 64 61 74 61 2a 29 29  incoming-data*))
aee0: 0a 20 20 20 20 28 6d 75 74 65 78 2d 75 6e 6c 6f  .    (mutex-unlo
aef0: 63 6b 21 20 2a 69 6e 63 6f 6d 69 6e 67 2d 6d 75  ck! *incoming-mu
af00: 74 65 78 2a 29 0a 20 20 20 20 28 69 66 20 28 6e  tex*).    (if (n
af10: 6f 74 20 2a 63 61 63 68 65 2d 6f 6e 2a 29 28 64  ot *cache-on*)(d
af20: 62 3a 77 72 69 74 65 2d 63 61 63 68 65 64 2d 64  b:write-cached-d
af30: 61 74 61 20 64 62 29 29 0a 20 20 20 20 23 74 29  ata db)).    #t)
af40: 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  )..;;===========
af50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
af60: 3d 3d 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 0a 3b 3b 20 45  ===========.;; E
af90: 78 74 72 61 63 74 20 6f 64 73 20 66 69 6c 65 20  xtract ods file 
afa0: 66 72 6f 6d 20 74 68 65 20 64 62 0a 3b 3b 3d 3d  from the db.;;==
afb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
afc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
afd0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
afe0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
aff0: 3d 3d 3d 3d 0a 0a 3b 3b 20 72 75 6e 73 70 61 74  ====..;; runspat
b000: 74 20 69 73 20 61 20 63 6f 6d 6d 61 20 64 65 6c  t is a comma del
b010: 69 6d 69 74 65 64 20 6c 69 73 74 20 6f 66 20 72  imited list of r
b020: 75 6e 20 70 61 74 74 65 72 6e 73 0a 3b 3b 20 6b  un patterns.;; k
b030: 65 79 70 61 74 74 2d 61 6c 69 73 74 20 6d 75 73  eypatt-alist mus
b040: 74 20 63 6f 6e 74 61 69 6e 20 2a 61 6c 6c 2a 20  t contain *all* 
b050: 6b 65 79 73 20 77 69 74 68 20 61 6e 20 61 73 73  keys with an ass
b060: 6f 63 69 61 74 65 64 20 70 61 74 74 65 72 6e 3a  ociated pattern:
b070: 20 27 28 20 28 22 4b 45 59 31 22 20 22 25 22 29   '( ("KEY1" "%")
b080: 20 2e 2e 20 29 0a 28 64 65 66 69 6e 65 20 28 64   .. ).(define (d
b090: 62 3a 65 78 74 72 61 63 74 2d 6f 64 73 2d 66 69  b:extract-ods-fi
b0a0: 6c 65 20 64 62 20 6f 75 74 70 75 74 66 69 6c 65  le db outputfile
b0b0: 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 20 72   keypatt-alist r
b0c0: 75 6e 73 70 61 74 74 20 70 61 74 68 6d 6f 64 29  unspatt pathmod)
b0d0: 0a 20 20 28 6c 65 74 2a 20 28 28 6b 65 79 73 73  .  (let* ((keyss
b0e0: 74 72 20 20 28 73 74 72 69 6e 67 2d 69 6e 74 65  tr  (string-inte
b0f0: 72 73 70 65 72 73 65 20 28 6d 61 70 20 63 61 72  rsperse (map car
b100: 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 29 20   keypatt-alist) 
b110: 22 2c 22 29 29 0a 09 20 28 6b 65 79 71 72 79 20  ",")).. (keyqry 
b120: 20 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73    (string-inters
b130: 70 65 72 73 65 20 28 6d 61 70 20 28 6c 61 6d 62  perse (map (lamb
b140: 64 61 20 28 70 29 28 63 6f 6e 63 20 28 63 61 72  da (p)(conc (car
b150: 20 70 29 20 22 20 4c 49 4b 45 20 3f 20 22 29 29   p) " LIKE ? "))
b160: 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 29 20   keypatt-alist) 
b170: 22 20 41 4e 44 20 22 29 29 0a 09 20 28 6e 75 6d  " AND ")).. (num
b180: 6b 65 79 73 20 20 28 6c 65 6e 67 74 68 20 6b 65  keys  (length ke
b190: 79 70 61 74 74 2d 61 6c 69 73 74 29 29 0a 09 20  ypatt-alist)).. 
b1a0: 28 74 65 73 74 2d 69 64 73 20 27 28 29 29 0a 09  (test-ids '())..
b1b0: 20 28 77 69 6e 64 6f 77 73 20 20 28 61 6e 64 20   (windows  (and 
b1c0: 70 61 74 68 6d 6f 64 20 28 73 75 62 73 74 72 69  pathmod (substri
b1d0: 6e 67 2d 69 6e 64 65 78 20 22 5c 5c 22 20 70 61  ng-index "\\" pa
b1e0: 74 68 6d 6f 64 29 29 29 0a 09 20 28 74 65 6d 70  thmod))).. (temp
b1f0: 64 69 72 20 20 28 63 6f 6e 63 20 22 2f 74 6d 70  dir  (conc "/tmp
b200: 2f 22 20 28 63 75 72 72 65 6e 74 2d 75 73 65 72  /" (current-user
b210: 2d 6e 61 6d 65 29 20 22 2f 22 20 72 75 6e 73 70  -name) "/" runsp
b220: 61 74 74 20 22 5f 22 20 28 72 61 6e 64 6f 6d 20  att "_" (random 
b230: 31 30 30 30 30 29 20 22 5f 22 20 28 63 75 72 72  10000) "_" (curr
b240: 65 6e 74 2d 70 72 6f 63 65 73 73 2d 69 64 29 29  ent-process-id))
b250: 29 0a 09 20 28 72 75 6e 73 68 65 61 64 65 72 20  ).. (runsheader 
b260: 28 61 70 70 65 6e 64 20 28 6c 69 73 74 20 22 52  (append (list "R
b270: 75 6e 20 49 64 22 20 22 52 75 6e 6e 61 6d 65 22  un Id" "Runname"
b280: 29 20 3b 20 30 20 31 0a 09 09 09 20 20 20 20 20  ) ; 0 1....     
b290: 28 6d 61 70 20 63 61 72 20 6b 65 79 70 61 74 74  (map car keypatt
b2a0: 2d 61 6c 69 73 74 29 20 20 20 3b 20 2b 20 4e 20  -alist)   ; + N 
b2b0: 3d 20 6c 65 6e 67 74 68 20 6b 65 79 70 61 74 74  = length keypatt
b2c0: 2d 61 6c 69 73 74 0a 09 09 09 20 20 20 20 20 28  -alist....     (
b2d0: 6c 69 73 74 20 22 54 65 73 74 6e 61 6d 65 22 20  list "Testname" 
b2e0: 20 20 20 20 20 20 20 20 20 3b 20 32 0a 09 09 09           ; 2....
b2f0: 09 20 20 20 22 49 74 65 6d 20 50 61 74 68 22 20  .   "Item Path" 
b300: 20 20 20 20 20 20 20 20 3b 20 33 20 0a 09 09 09          ; 3 ....
b310: 09 20 20 20 22 44 65 73 63 72 69 70 74 69 6f 6e  .   "Description
b320: 22 20 20 20 20 20 20 20 3b 20 34 20 0a 09 09 09  "       ; 4 ....
b330: 09 20 20 20 22 53 74 61 74 65 22 20 20 20 20 20  .   "State"     
b340: 20 20 20 20 20 20 20 20 3b 20 35 20 0a 09 09 09          ; 5 ....
b350: 09 20 20 20 22 53 74 61 74 75 73 22 20 20 20 20  .   "Status"    
b360: 20 20 20 20 20 20 20 20 3b 20 36 20 20 0a 09 09          ; 6  ...
b370: 09 09 20 20 20 22 46 69 6e 61 6c 20 4c 6f 67 22  ..   "Final Log"
b380: 20 20 20 20 20 20 20 20 20 3b 20 37 20 0a 09 09           ; 7 ...
b390: 09 09 20 20 20 22 52 75 6e 20 44 75 72 61 74 69  ..   "Run Durati
b3a0: 6f 6e 22 20 20 20 20 20 20 3b 20 38 20 0a 09 09  on"      ; 8 ...
b3b0: 09 09 20 20 20 22 57 68 65 6e 20 52 75 6e 22 20  ..   "When Run" 
b3c0: 20 20 20 20 20 20 20 20 20 3b 20 39 20 0a 09 09           ; 9 ...
b3d0: 09 09 20 20 20 22 54 61 67 73 22 20 20 20 20 20  ..   "Tags"     
b3e0: 20 20 20 20 20 20 20 20 20 3b 20 31 30 0a 09 09           ; 10...
b3f0: 09 09 20 20 20 22 52 75 6e 20 4f 77 6e 65 72 22  ..   "Run Owner"
b400: 20 20 20 20 20 20 20 20 20 3b 20 31 31 0a 09 09           ; 11...
b410: 09 09 20 20 20 22 43 6f 6d 6d 65 6e 74 22 20 20  ..   "Comment"  
b420: 20 20 20 20 20 20 20 20 20 3b 20 31 32 0a 09 09           ; 12...
b430: 09 09 20 20 20 22 41 75 74 68 6f 72 22 20 20 20  ..   "Author"   
b440: 20 20 20 20 20 20 20 20 20 3b 20 31 33 0a 09 09           ; 13...
b450: 09 09 20 20 20 22 54 65 73 74 20 4f 77 6e 65 72  ..   "Test Owner
b460: 22 20 20 20 20 20 20 20 20 3b 20 31 34 0a 09 09  "        ; 14...
b470: 09 09 20 20 20 22 52 65 76 69 65 77 65 64 22 20  ..   "Reviewed" 
b480: 20 20 20 20 20 20 20 20 20 3b 20 31 35 0a 09 09           ; 15...
b490: 09 09 20 20 20 22 44 69 73 6b 66 72 65 65 22 20  ..   "Diskfree" 
b4a0: 20 20 20 20 20 20 20 20 20 3b 20 31 36 0a 09 09           ; 16...
b4b0: 09 09 20 20 20 22 55 6e 61 6d 65 22 20 20 20 20  ..   "Uname"    
b4c0: 20 20 20 20 20 20 20 20 20 3b 20 31 37 0a 09 09           ; 17...
b4d0: 09 09 20 20 20 22 52 75 6e 64 69 72 22 20 20 20  ..   "Rundir"   
b4e0: 20 20 20 20 20 20 20 20 20 3b 20 31 38 0a 09 09           ; 18...
b4f0: 09 09 20 20 20 22 48 6f 73 74 22 20 20 20 20 20  ..   "Host"     
b500: 20 20 20 20 20 20 20 20 20 3b 20 31 39 0a 09 09           ; 19...
b510: 09 09 20 20 20 22 43 70 75 20 4c 6f 61 64 22 20  ..   "Cpu Load" 
b520: 20 20 20 20 20 20 20 20 20 3b 20 32 30 0a 09 09           ; 20...
b530: 09 09 20 20 20 29 29 29 0a 09 20 28 72 65 73 75  ..   ))).. (resu
b540: 6c 74 73 20 28 6c 69 73 74 20 72 75 6e 73 68 65  lts (list runshe
b550: 61 64 65 72 29 29 09 09 09 20 0a 09 20 28 74 65  ader))... .. (te
b560: 73 74 64 61 74 61 2d 68 65 61 64 65 72 20 28 6c  stdata-header (l
b570: 69 73 74 20 22 52 75 6e 20 49 64 22 20 22 54 65  ist "Run Id" "Te
b580: 73 74 6e 61 6d 65 22 20 22 49 74 65 6d 20 50 61  stname" "Item Pa
b590: 74 68 22 20 22 43 61 74 65 67 6f 72 79 22 20 22  th" "Category" "
b5a0: 56 61 72 69 61 62 6c 65 22 20 22 56 61 6c 75 65  Variable" "Value
b5b0: 22 20 22 45 78 70 65 63 74 65 64 22 20 22 54 6f  " "Expected" "To
b5c0: 6c 22 20 22 55 6e 69 74 73 22 20 22 53 74 61 74  l" "Units" "Stat
b5d0: 75 73 22 20 22 43 6f 6d 6d 65 6e 74 22 29 29 0a  us" "Comment")).
b5e0: 09 20 28 6d 61 69 6e 71 72 79 20 28 63 6f 6e 63  . (mainqry (conc
b5f0: 20 22 53 45 4c 45 43 54 0a 20 20 20 20 20 20 20   "SELECT.       
b600: 20 20 20 20 20 20 20 74 2e 74 65 73 74 6e 61 6d         t.testnam
b610: 65 2c 72 2e 69 64 2c 72 75 6e 6e 61 6d 65 2c 22  e,r.id,runname,"
b620: 20 6b 65 79 73 73 74 72 20 22 2c 74 2e 74 65 73   keysstr ",t.tes
b630: 74 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  tname,.         
b640: 20 20 20 20 20 74 2e 69 74 65 6d 5f 70 61 74 68       t.item_path
b650: 2c 74 6d 2e 64 65 73 63 72 69 70 74 69 6f 6e 2c  ,tm.description,
b660: 74 2e 73 74 61 74 65 2c 74 2e 73 74 61 74 75 73  t.state,t.status
b670: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b680: 66 69 6e 61 6c 5f 6c 6f 67 66 2c 72 75 6e 5f 64  final_logf,run_d
b690: 75 72 61 74 69 6f 6e 2c 20 0a 20 20 20 20 20 20  uration, .      
b6a0: 20 20 20 20 20 20 20 20 73 74 72 66 74 69 6d 65          strftime
b6b0: 28 27 25 6d 2f 25 64 2f 25 59 20 25 48 3a 25 4d  ('%m/%d/%Y %H:%M
b6c0: 3a 25 53 27 2c 64 61 74 65 74 69 6d 65 28 74 2e  :%S',datetime(t.
b6d0: 65 76 65 6e 74 5f 74 69 6d 65 2c 27 75 6e 69 78  event_time,'unix
b6e0: 65 70 6f 63 68 27 29 2c 27 6c 6f 63 61 6c 74 69  epoch'),'localti
b6f0: 6d 65 27 29 2c 0a 20 20 20 20 20 20 20 20 20 20  me'),.          
b700: 20 20 20 20 74 6d 2e 74 61 67 73 2c 72 2e 6f 77      tm.tags,r.ow
b710: 6e 65 72 2c 74 2e 63 6f 6d 6d 65 6e 74 2c 0a 20  ner,t.comment,. 
b720: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 75 74               aut
b730: 68 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  hor,.           
b740: 20 20 20 74 6d 2e 6f 77 6e 65 72 2c 72 65 76 69     tm.owner,revi
b750: 65 77 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20  ewed,.          
b760: 20 20 20 20 64 69 73 6b 66 72 65 65 2c 75 6e 61      diskfree,una
b770: 6d 65 2c 72 75 6e 64 69 72 2c 0a 20 20 20 20 20  me,rundir,.     
b780: 20 20 20 20 20 20 20 20 20 68 6f 73 74 2c 63 70           host,cp
b790: 75 6c 6f 61 64 0a 20 20 20 20 20 20 20 20 20 20  uload.          
b7a0: 20 20 46 52 4f 4d 20 74 65 73 74 73 20 41 53 20    FROM tests AS 
b7b0: 74 20 4a 4f 49 4e 20 72 75 6e 73 20 41 53 20 72  t JOIN runs AS r
b7c0: 20 4f 4e 20 74 2e 72 75 6e 5f 69 64 3d 72 2e 69   ON t.run_id=r.i
b7d0: 64 20 4a 4f 49 4e 20 74 65 73 74 5f 6d 65 74 61  d JOIN test_meta
b7e0: 20 41 53 20 74 6d 20 4f 4e 20 74 6d 2e 74 65 73   AS tm ON tm.tes
b7f0: 74 6e 61 6d 65 3d 74 2e 74 65 73 74 6e 61 6d 65  tname=t.testname
b800: 0a 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45  .            WHE
b810: 52 45 20 72 75 6e 6e 61 6d 65 20 4c 49 4b 45 20  RE runname LIKE 
b820: 3f 20 41 4e 44 20 22 20 6b 65 79 71 72 79 20 22  ? AND " keyqry "
b830: 3b 22 29 29 29 0a 20 20 20 20 28 64 65 62 75 67  ;"))).    (debug
b840: 3a 70 72 69 6e 74 20 32 20 22 55 73 69 6e 67 20  :print 2 "Using 
b850: 22 20 74 65 6d 70 64 69 72 20 22 20 66 6f 72 20  " tempdir " for 
b860: 63 6f 6e 73 74 72 75 63 74 69 6e 67 20 74 68 65  constructing the
b870: 20 6f 64 73 20 66 69 6c 65 2e 20 6b 65 79 71 72   ods file. keyqr
b880: 79 3a 20 22 20 6b 65 79 71 72 79 20 22 20 6b 65  y: " keyqry " ke
b890: 79 73 74 72 3a 20 22 20 6b 65 79 73 73 74 72 20  ystr: " keysstr 
b8a0: 22 20 77 69 74 68 20 6b 65 79 73 3a 20 22 20 28  " with keys: " (
b8b0: 6d 61 70 20 63 61 64 72 20 6b 65 79 70 61 74 74  map cadr keypatt
b8c0: 2d 61 6c 69 73 74 29 0a 09 09 20 22 5c 6e 20 20  -alist)... "\n  
b8d0: 20 20 20 20 6d 61 69 6e 71 72 79 3a 20 22 20 6d      mainqry: " m
b8e0: 61 69 6e 71 72 79 29 0a 20 20 20 20 3b 3b 20 22  ainqry).    ;; "
b8f0: 45 78 70 65 63 74 65 64 20 56 61 6c 75 65 22 0a  Expected Value".
b900: 20 20 20 20 3b 3b 20 22 56 61 6c 75 65 20 46 6f      ;; "Value Fo
b910: 75 6e 64 22 0a 20 20 20 20 3b 3b 20 22 54 6f 6c  und".    ;; "Tol
b920: 65 72 61 6e 63 65 22 0a 20 20 20 20 28 61 70 70  erance".    (app
b930: 6c 79 20 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65  ly sqlite3:for-e
b940: 61 63 68 2d 72 6f 77 0a 09 20 20 20 28 6c 61 6d  ach-row..   (lam
b950: 62 64 61 20 28 74 65 73 74 2d 69 64 20 2e 20 62  bda (test-id . b
b960: 29 0a 09 20 20 20 20 20 28 73 65 74 21 20 74 65  )..     (set! te
b970: 73 74 2d 69 64 73 20 28 63 6f 6e 73 20 74 65 73  st-ids (cons tes
b980: 74 2d 69 64 20 74 65 73 74 2d 69 64 73 29 29 20  t-id test-ids)) 
b990: 20 20 3b 3b 20 74 65 73 74 2d 69 64 20 69 73 20    ;; test-id is 
b9a0: 6e 6f 77 20 74 65 73 74 6e 61 6d 65 0a 09 20 20  now testname..  
b9b0: 20 20 20 28 73 65 74 21 20 72 65 73 75 6c 74 73     (set! results
b9c0: 20 28 61 70 70 65 6e 64 20 72 65 73 75 6c 74 73   (append results
b9d0: 20 3b 3b 20 6e 6f 74 65 2c 20 64 72 6f 70 20 74   ;; note, drop t
b9e0: 68 65 20 74 65 73 74 2d 69 64 0a 09 09 09 09 20  he test-id..... 
b9f0: 20 20 28 6c 69 73 74 0a 09 09 09 09 20 20 20 20    (list.....    
ba00: 28 69 66 20 70 61 74 68 6d 6f 64 0a 09 09 09 09  (if pathmod.....
ba10: 09 28 6c 65 74 2a 20 28 28 76 62 20 20 20 20 20  .(let* ((vb     
ba20: 20 20 20 28 61 70 70 6c 79 20 76 65 63 74 6f 72     (apply vector
ba30: 20 62 29 29 0a 09 09 09 09 09 20 20 20 20 20 20   b))......      
ba40: 20 28 6b 65 79 76 61 6c 73 20 20 20 28 6c 65 74   (keyvals   (let
ba50: 20 6c 6f 6f 70 20 28 28 69 20 20 20 20 30 29 0a   loop ((i    0).
ba60: 09 09 09 09 09 09 09 09 20 20 20 20 20 28 72 65  ........     (re
ba70: 73 20 27 28 29 29 29 0a 09 09 09 09 09 09 09 20  s '()))........ 
ba80: 20 20 20 28 69 66 20 28 3e 3d 20 69 20 6e 75 6d     (if (>= i num
ba90: 6b 65 79 73 29 0a 09 09 09 09 09 09 09 09 72 65  keys).........re
baa0: 73 0a 09 09 09 09 09 09 09 09 28 6c 6f 6f 70 20  s.........(loop 
bab0: 28 2b 20 69 20 31 29 0a 09 09 09 09 09 09 09 09  (+ i 1).........
bac0: 20 20 20 20 20 20 28 61 70 70 65 6e 64 20 72 65        (append re
bad0: 73 20 28 6c 69 73 74 20 28 76 65 63 74 6f 72 2d  s (list (vector-
bae0: 72 65 66 20 76 62 20 28 2b 20 69 20 32 29 29 29  ref vb (+ i 2)))
baf0: 29 29 29 29 29 0a 09 09 09 09 09 20 20 20 20 20  )))))......     
bb00: 20 20 28 72 75 6e 6e 61 6d 65 20 20 20 28 76 65    (runname   (ve
bb10: 63 74 6f 72 2d 72 65 66 20 76 62 20 31 29 29 0a  ctor-ref vb 1)).
bb20: 09 09 09 09 09 20 20 20 20 20 20 20 28 74 65 73  .....       (tes
bb30: 74 6e 61 6d 65 20 20 28 76 65 63 74 6f 72 2d 72  tname  (vector-r
bb40: 65 66 20 76 62 20 28 2b 20 20 32 20 6e 75 6d 6b  ef vb (+  2 numk
bb50: 65 79 73 29 29 29 0a 09 09 09 09 09 20 20 20 20  eys)))......    
bb60: 20 20 20 28 69 74 65 6d 2d 70 61 74 68 20 28 76     (item-path (v
bb70: 65 63 74 6f 72 2d 72 65 66 20 76 62 20 28 2b 20  ector-ref vb (+ 
bb80: 20 33 20 6e 75 6d 6b 65 79 73 29 29 29 0a 09 09   3 numkeys)))...
bb90: 09 09 09 20 20 20 20 20 20 20 28 66 69 6e 61 6c  ...       (final
bba0: 2d 6c 6f 67 20 28 76 65 63 74 6f 72 2d 72 65 66  -log (vector-ref
bbb0: 20 76 62 20 28 2b 20 20 37 20 6e 75 6d 6b 65 79   vb (+  7 numkey
bbc0: 73 29 29 29 0a 09 09 09 09 09 20 20 20 20 20 20  s)))......      
bbd0: 20 28 72 75 6e 2d 64 69 72 20 20 20 28 76 65 63   (run-dir   (vec
bbe0: 74 6f 72 2d 72 65 66 20 76 62 20 28 2b 20 31 38  tor-ref vb (+ 18
bbf0: 20 6e 75 6d 6b 65 79 73 29 29 29 0a 09 09 09 09   numkeys))).....
bc00: 09 20 20 20 20 20 20 20 28 6c 6f 67 2d 66 70 61  .       (log-fpa
bc10: 74 68 20 28 63 6f 6e 63 20 72 75 6e 2d 64 69 72  th (conc run-dir
bc20: 20 22 2f 22 20 20 66 69 6e 61 6c 2d 6c 6f 67 29   "/"  final-log)
bc30: 29 29 20 3b 3b 20 28 73 74 72 69 6e 67 2d 69 6e  )) ;; (string-in
bc40: 74 65 72 73 70 65 72 73 65 20 6b 65 79 76 61 6c  tersperse keyval
bc50: 73 20 22 2f 22 29 20 22 2f 22 20 74 65 73 74 6e  s "/") "/" testn
bc60: 61 6d 65 20 22 2f 22 20 69 74 65 6d 2d 70 61 74  ame "/" item-pat
bc70: 68 20 22 2f 22 0a 09 09 09 09 09 20 20 28 64 65  h "/"......  (de
bc80: 62 75 67 3a 70 72 69 6e 74 20 34 20 22 6c 6f 67  bug:print 4 "log
bc90: 3a 20 22 20 6c 6f 67 2d 66 70 61 74 68 20 22 20  : " log-fpath " 
bca0: 65 78 69 73 74 73 3a 20 22 20 28 66 69 6c 65 2d  exists: " (file-
bcb0: 65 78 69 73 74 73 3f 20 6c 6f 67 2d 66 70 61 74  exists? log-fpat
bcc0: 68 29 29 0a 09 09 09 09 09 20 20 28 76 65 63 74  h))......  (vect
bcd0: 6f 72 2d 73 65 74 21 20 76 62 20 28 2b 20 37 20  or-set! vb (+ 7 
bce0: 6e 75 6d 6b 65 79 73 29 20 28 69 66 20 28 66 69  numkeys) (if (fi
bcf0: 6c 65 2d 65 78 69 73 74 73 3f 20 6c 6f 67 2d 66  le-exists? log-f
bd00: 70 61 74 68 29 0a 09 09 09 09 09 09 09 09 09 20  path).......... 
bd10: 20 20 20 28 6c 65 74 20 28 28 6e 65 77 70 61 74     (let ((newpat
bd20: 68 20 28 63 6f 6e 63 20 70 61 74 68 6d 6f 64 20  h (conc pathmod 
bd30: 22 2f 22 0a 09 09 09 09 09 09 09 09 09 09 09 09  "/".............
bd40: 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70   (string-intersp
bd50: 65 72 73 65 20 6b 65 79 76 61 6c 73 20 22 2f 22  erse keyvals "/"
bd60: 29 0a 09 09 09 09 09 09 09 09 09 09 09 09 20 22  )............. "
bd70: 2f 22 20 72 75 6e 6e 61 6d 65 20 22 2f 22 20 74  /" runname "/" t
bd80: 65 73 74 6e 61 6d 65 20 22 2f 22 0a 09 09 09 09  estname "/".....
bd90: 09 09 09 09 09 09 09 09 20 28 69 66 20 28 73 74  ........ (if (st
bda0: 72 69 6e 67 3d 3f 20 69 74 65 6d 2d 70 61 74 68  ring=? item-path
bdb0: 20 22 22 29 20 22 22 20 28 63 6f 6e 63 20 22 2f   "") "" (conc "/
bdc0: 22 20 69 74 65 6d 2d 70 61 74 68 29 29 0a 09 09  " item-path))...
bdd0: 09 09 09 09 09 09 09 09 09 09 20 66 69 6e 61 6c  .......... final
bde0: 2d 6c 6f 67 29 29 29 0a 09 09 09 09 09 09 09 09  -log))).........
bdf0: 09 20 20 20 20 20 20 3b 3b 20 66 6f 72 20 6e 6f  .      ;; for no
be00: 77 20 74 68 72 6f 77 20 61 77 61 79 20 6e 65 77  w throw away new
be10: 70 61 74 68 20 61 6e 64 20 75 73 65 20 74 68 65  path and use the
be20: 20 6c 6f 67 2d 66 70 61 74 68 20 63 6f 6e 63 27   log-fpath conc'
be30: 64 20 77 69 74 68 20 70 61 74 68 6d 6f 64 0a 09  d with pathmod..
be40: 09 09 09 09 09 09 09 09 20 20 20 20 20 20 28 73  ........      (s
be50: 65 74 21 20 6e 65 77 70 61 74 68 20 28 63 6f 6e  et! newpath (con
be60: 63 20 70 61 74 68 6d 6f 64 20 6c 6f 67 2d 66 70  c pathmod log-fp
be70: 61 74 68 29 29 0a 09 09 09 09 09 09 09 09 09 20  ath)).......... 
be80: 20 20 20 20 20 28 69 66 20 77 69 6e 64 6f 77 73       (if windows
be90: 20 28 73 74 72 69 6e 67 2d 74 72 61 6e 73 6c 61   (string-transla
bea0: 74 65 20 6e 65 77 70 61 74 68 20 22 2f 22 20 22  te newpath "/" "
beb0: 5c 5c 22 29 20 6e 65 77 70 61 74 68 29 29 0a 09  \\") newpath))..
bec0: 09 09 09 09 09 09 09 09 20 20 20 20 28 69 66 20  ........    (if 
bed0: 28 3e 20 2a 76 65 72 62 6f 73 69 74 79 2a 20 31  (> *verbosity* 1
bee0: 29 0a 09 09 09 09 09 09 09 09 09 09 28 63 6f 6e  )...........(con
bef0: 63 20 66 69 6e 61 6c 2d 6c 6f 67 20 22 20 6e 6f  c final-log " no
bf00: 74 2d 66 6f 75 6e 64 22 29 0a 09 09 09 09 09 09  t-found").......
bf10: 09 09 09 09 22 22 29 29 29 0a 09 09 09 09 09 20  ...."")))...... 
bf20: 20 28 76 65 63 74 6f 72 2d 3e 6c 69 73 74 20 76   (vector->list v
bf30: 62 29 29 0a 09 09 09 09 09 62 29 29 29 29 29 0a  b))......b))))).
bf40: 09 20 20 20 64 62 0a 09 20 20 20 6d 61 69 6e 71  .   db..   mainq
bf50: 72 79 0a 09 20 20 20 72 75 6e 73 70 61 74 74 20  ry..   runspatt 
bf60: 28 6d 61 70 20 63 61 64 72 20 6b 65 79 70 61 74  (map cadr keypat
bf70: 74 2d 61 6c 69 73 74 29 29 0a 20 20 20 20 28 64  t-alist)).    (d
bf80: 65 62 75 67 3a 70 72 69 6e 74 20 32 20 22 46 6f  ebug:print 2 "Fo
bf90: 75 6e 64 20 22 20 28 6c 65 6e 67 74 68 20 74 65  und " (length te
bfa0: 73 74 2d 69 64 73 29 20 22 20 72 65 63 6f 72 64  st-ids) " record
bfb0: 73 22 29 0a 20 20 20 20 28 73 65 74 21 20 72 65  s").    (set! re
bfc0: 73 75 6c 74 73 20 28 6c 69 73 74 20 28 63 6f 6e  sults (list (con
bfd0: 73 20 22 52 75 6e 73 22 20 72 65 73 75 6c 74 73  s "Runs" results
bfe0: 29 29 29 0a 20 20 20 20 3b 3b 20 6e 6f 77 2c 20  ))).    ;; now, 
bff0: 66 6f 72 20 65 61 63 68 20 74 65 73 74 2c 20 63  for each test, c
c000: 6f 6c 6c 65 63 74 20 74 68 65 20 74 65 73 74 5f  ollect the test_
c010: 64 61 74 61 20 69 6e 66 6f 20 61 6e 64 20 61 64  data info and ad
c020: 64 20 61 20 6e 65 77 20 73 68 65 65 74 0a 20 20  d a new sheet.  
c030: 20 20 28 66 6f 72 2d 65 61 63 68 0a 20 20 20 20    (for-each.    
c040: 20 28 6c 61 6d 62 64 61 20 28 74 65 73 74 2d 69   (lambda (test-i
c050: 64 29 0a 20 20 20 20 20 20 20 28 6c 65 74 20 28  d).       (let (
c060: 28 74 65 73 74 2d 64 61 74 61 20 28 6c 69 73 74  (test-data (list
c070: 20 74 65 73 74 64 61 74 61 2d 68 65 61 64 65 72   testdata-header
c080: 29 29 0a 09 20 20 20 20 20 28 63 75 72 72 2d 74  ))..     (curr-t
c090: 65 73 74 2d 6e 61 6d 65 20 23 66 29 29 0a 09 20  est-name #f)).. 
c0a0: 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63  (sqlite3:for-eac
c0b0: 68 2d 72 6f 77 0a 09 20 20 28 6c 61 6d 62 64 61  h-row..  (lambda
c0c0: 20 28 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d   (run-id testnam
c0d0: 65 20 69 74 65 6d 2d 70 61 74 68 20 63 61 74 65  e item-path cate
c0e0: 67 6f 72 79 20 76 61 72 69 61 62 6c 65 20 76 61  gory variable va
c0f0: 6c 75 65 20 65 78 70 65 63 74 65 64 20 74 6f 6c  lue expected tol
c100: 20 75 6e 69 74 73 20 73 74 61 74 75 73 20 63 6f   units status co
c110: 6d 6d 65 6e 74 29 0a 09 20 20 20 20 28 73 65 74  mment)..    (set
c120: 21 20 63 75 72 72 2d 74 65 73 74 2d 6e 61 6d 65  ! curr-test-name
c130: 20 74 65 73 74 6e 61 6d 65 29 0a 09 20 20 20 20   testname)..    
c140: 28 73 65 74 21 20 74 65 73 74 2d 64 61 74 61 20  (set! test-data 
c150: 28 61 70 70 65 6e 64 20 74 65 73 74 2d 64 61 74  (append test-dat
c160: 61 20 28 6c 69 73 74 20 28 6c 69 73 74 20 72 75  a (list (list ru
c170: 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 69 74  n-id testname it
c180: 65 6d 2d 70 61 74 68 20 63 61 74 65 67 6f 72 79  em-path category
c190: 20 76 61 72 69 61 62 6c 65 20 76 61 6c 75 65 20   variable value 
c1a0: 65 78 70 65 63 74 65 64 20 74 6f 6c 20 75 6e 69  expected tol uni
c1b0: 74 73 20 73 74 61 74 75 73 20 63 6f 6d 6d 65 6e  ts status commen
c1c0: 74 29 29 29 29 29 0a 09 20 20 64 62 20 0a 09 20  t)))))..  db .. 
c1d0: 20 3b 3b 20 22 53 45 4c 45 43 54 20 72 75 6e 5f   ;; "SELECT run_
c1e0: 69 64 2c 74 65 73 74 6e 61 6d 65 2c 69 74 65 6d  id,testname,item
c1f0: 5f 70 61 74 68 2c 63 61 74 65 67 6f 72 79 2c 76  _path,category,v
c200: 61 72 69 61 62 6c 65 2c 74 64 2e 76 61 6c 75 65  ariable,td.value
c210: 20 41 53 20 76 61 6c 75 65 2c 65 78 70 65 63 74   AS value,expect
c220: 65 64 2c 74 6f 6c 2c 75 6e 69 74 73 2c 74 64 2e  ed,tol,units,td.
c230: 73 74 61 74 75 73 20 41 53 20 73 74 61 74 75 73  status AS status
c240: 2c 74 64 2e 63 6f 6d 6d 65 6e 74 20 41 53 20 63  ,td.comment AS c
c250: 6f 6d 6d 65 6e 74 20 46 52 4f 4d 20 74 65 73 74  omment FROM test
c260: 5f 64 61 74 61 20 41 53 20 74 64 20 49 4e 4e 45  _data AS td INNE
c270: 52 20 4a 4f 49 4e 20 74 65 73 74 73 20 4f 4e 20  R JOIN tests ON 
c280: 74 65 73 74 73 2e 69 64 3d 74 64 2e 74 65 73 74  tests.id=td.test
c290: 5f 69 64 20 57 48 45 52 45 20 74 65 73 74 5f 69  _id WHERE test_i
c2a0: 64 3d 3f 3b 22 0a 09 20 20 22 53 45 4c 45 43 54  d=?;"..  "SELECT
c2b0: 20 72 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d 65   run_id,testname
c2c0: 2c 69 74 65 6d 5f 70 61 74 68 2c 63 61 74 65 67  ,item_path,categ
c2d0: 6f 72 79 2c 76 61 72 69 61 62 6c 65 2c 74 64 2e  ory,variable,td.
c2e0: 76 61 6c 75 65 20 41 53 20 76 61 6c 75 65 2c 74  value AS value,t
c2f0: 64 2e 65 78 70 65 63 74 65 64 2c 74 64 2e 74 6f  d.expected,td.to
c300: 6c 2c 74 64 2e 75 6e 69 74 73 2c 74 64 2e 73 74  l,td.units,td.st
c310: 61 74 75 73 20 41 53 20 73 74 61 74 75 73 2c 74  atus AS status,t
c320: 64 2e 63 6f 6d 6d 65 6e 74 20 41 53 20 63 6f 6d  d.comment AS com
c330: 6d 65 6e 74 20 46 52 4f 4d 20 74 65 73 74 5f 64  ment FROM test_d
c340: 61 74 61 20 41 53 20 74 64 20 49 4e 4e 45 52 20  ata AS td INNER 
c350: 4a 4f 49 4e 20 74 65 73 74 73 20 4f 4e 20 74 65  JOIN tests ON te
c360: 73 74 73 2e 69 64 3d 74 64 2e 74 65 73 74 5f 69  sts.id=td.test_i
c370: 64 20 57 48 45 52 45 20 74 65 73 74 6e 61 6d 65  d WHERE testname
c380: 3d 3f 3b 22 0a 09 20 20 74 65 73 74 2d 69 64 29  =?;"..  test-id)
c390: 0a 09 20 28 69 66 20 63 75 72 72 2d 74 65 73 74  .. (if curr-test
c3a0: 2d 6e 61 6d 65 0a 09 20 20 20 20 20 28 73 65 74  -name..     (set
c3b0: 21 20 72 65 73 75 6c 74 73 20 28 61 70 70 65 6e  ! results (appen
c3c0: 64 20 72 65 73 75 6c 74 73 20 28 6c 69 73 74 20  d results (list 
c3d0: 28 63 6f 6e 73 20 63 75 72 72 2d 74 65 73 74 2d  (cons curr-test-
c3e0: 6e 61 6d 65 20 74 65 73 74 2d 64 61 74 61 29 29  name test-data))
c3f0: 29 29 29 0a 09 20 29 29 0a 20 20 20 20 20 28 73  ))).. )).     (s
c400: 6f 72 74 20 28 64 65 6c 65 74 65 2d 64 75 70 6c  ort (delete-dupl
c410: 69 63 61 74 65 73 20 74 65 73 74 2d 69 64 73 29  icates test-ids)
c420: 20 73 74 72 69 6e 67 3c 3d 29 29 0a 20 20 20 20   string<=)).    
c430: 28 73 79 73 74 65 6d 20 28 63 6f 6e 63 20 22 6d  (system (conc "m
c440: 6b 64 69 72 20 2d 70 20 22 20 74 65 6d 70 64 69  kdir -p " tempdi
c450: 72 29 29 0a 20 20 20 20 3b 3b 20 28 70 70 20 72  r)).    ;; (pp r
c460: 65 73 75 6c 74 73 29 0a 20 20 20 20 28 6f 64 73  esults).    (ods
c470: 3a 6c 69 73 74 2d 3e 6f 64 73 20 0a 20 20 20 20  :list->ods .    
c480: 20 74 65 6d 70 64 69 72 0a 20 20 20 20 20 28 69   tempdir.     (i
c490: 66 20 28 73 74 72 69 6e 67 2d 6d 61 74 63 68 20  f (string-match 
c4a0: 28 72 65 67 65 78 70 20 22 5e 5b 2f 7e 5d 2b 2e  (regexp "^[/~]+.
c4b0: 2a 22 29 20 6f 75 74 70 75 74 66 69 6c 65 29 20  *") outputfile) 
c4c0: 3b 3b 20 66 75 6c 6c 20 70 61 74 68 3f 0a 09 20  ;; full path?.. 
c4d0: 6f 75 74 70 75 74 66 69 6c 65 0a 09 20 28 62 65  outputfile.. (be
c4e0: 67 69 6e 0a 09 20 20 20 28 64 65 62 75 67 3a 70  gin..   (debug:p
c4f0: 72 69 6e 74 20 30 20 22 57 41 52 4e 49 4e 47 3a  rint 0 "WARNING:
c500: 20 70 61 74 68 20 67 69 76 65 6e 2c 20 22 20 6f   path given, " o
c510: 75 74 70 75 74 66 69 6c 65 20 22 20 69 73 20 72  utputfile " is r
c520: 65 6c 61 74 69 76 65 2c 20 70 72 65 66 69 78 69  elative, prefixi
c530: 6e 67 20 77 69 74 68 20 63 75 72 72 65 6e 74 20  ng with current 
c540: 64 69 72 65 63 74 6f 72 79 22 29 0a 09 20 20 20  directory")..   
c550: 28 63 6f 6e 63 20 28 63 75 72 72 65 6e 74 2d 64  (conc (current-d
c560: 69 72 65 63 74 6f 72 79 29 20 22 2f 22 20 6f 75  irectory) "/" ou
c570: 74 70 75 74 66 69 6c 65 29 29 29 0a 20 20 20 20  tputfile))).    
c580: 20 72 65 73 75 6c 74 73 29 0a 20 20 20 20 3b 3b   results).    ;;
c590: 20 62 72 75 74 61 6c 20 63 6c 65 61 6e 20 75 70   brutal clean up
c5a0: 0a 20 20 20 20 28 73 79 73 74 65 6d 20 22 72 6d  .    (system "rm
c5b0: 20 2d 72 66 20 74 65 6d 70 64 69 72 22 29 29 29   -rf tempdir")))
c5c0: 0a 0a 3b 3b 20 28 64 62 3a 65 78 74 72 61 63 74  ..;; (db:extract
c5d0: 2d 6f 64 73 2d 66 69 6c 65 20 64 62 20 22 6f 75  -ods-file db "ou
c5e0: 74 70 75 74 66 69 6c 65 2e 6f 64 73 22 20 27 28  tputfile.ods" '(
c5f0: 28 22 73 79 73 6e 61 6d 65 22 20 22 25 22 29 28  ("sysname" "%")(
c600: 22 66 73 6e 61 6d 65 22 20 22 25 22 29 28 22 64  "fsname" "%")("d
c610: 61 74 61 70 61 74 68 22 20 22 25 22 29 29 20 22  atapath" "%")) "
c620: 25 22 29 0a 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d  %")...;;========
c630: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
c640: 3d 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 0a 3b  ==============.;
c670: 3b 20 52 45 4d 4f 54 45 20 44 42 20 41 43 43 45  ; REMOTE DB ACCE
c680: 53 53 20 56 49 41 20 52 50 43 0a 3b 3b 3d 3d 3d  SS VIA RPC.;;===
c690: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
c6a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
c6b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
c6c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
c6d0: 3d 3d 3d 0a 0a 28 64 65 66 69 6e 65 20 28 72 64  ===..(define (rd
c6e0: 62 3a 73 65 74 2d 74 65 73 74 73 2d 73 74 61 74  b:set-tests-stat
c6f0: 65 2d 73 74 61 74 75 73 20 64 62 20 72 75 6e 2d  e-status db run-
c700: 69 64 20 74 65 73 74 6e 61 6d 65 73 20 63 75 72  id testnames cur
c710: 72 73 74 61 74 65 20 63 75 72 72 73 74 61 74 75  rstate currstatu
c720: 73 20 6e 65 77 73 74 61 74 65 20 6e 65 77 73 74  s newstate newst
c730: 61 74 75 73 29 0a 20 20 28 69 66 20 2a 72 75 6e  atus).  (if *run
c740: 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c  remote*.      (l
c750: 65 74 20 28 28 68 6f 73 74 20 28 76 65 63 74 6f  et ((host (vecto
c760: 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65  r-ref *runremote
c770: 2a 20 30 29 29 0a 09 20 20 20 20 28 70 6f 72 74  * 0))..    (port
c780: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75   (vector-ref *ru
c790: 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28  nremote* 1)))..(
c7a0: 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20 27  (rpc:procedure '
c7b0: 72 64 62 3a 73 65 74 2d 74 65 73 74 73 2d 73 74  rdb:set-tests-st
c7c0: 61 74 65 2d 73 74 61 74 75 73 20 68 6f 73 74 20  ate-status host 
c7d0: 70 6f 72 74 29 0a 09 20 72 75 6e 2d 69 64 20 74  port).. run-id t
c7e0: 65 73 74 6e 61 6d 65 73 20 63 75 72 72 73 74 61  estnames currsta
c7f0: 74 65 20 63 75 72 72 73 74 61 74 75 73 20 6e 65  te currstatus ne
c800: 77 73 74 61 74 65 20 6e 65 77 73 74 61 74 75 73  wstate newstatus
c810: 29 29 0a 20 20 20 20 20 20 28 64 62 3a 73 65 74  )).      (db:set
c820: 2d 74 65 73 74 73 2d 73 74 61 74 65 2d 73 74 61  -tests-state-sta
c830: 74 75 73 20 64 62 20 72 75 6e 2d 69 64 20 74 65  tus db run-id te
c840: 73 74 6e 61 6d 65 73 20 63 75 72 72 73 74 61 74  stnames currstat
c850: 65 20 63 75 72 72 73 74 61 74 75 73 20 6e 65 77  e currstatus new
c860: 73 74 61 74 65 20 6e 65 77 73 74 61 74 75 73 29  state newstatus)
c870: 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 72 64 62  ))..(define (rdb
c880: 3a 74 65 73 74 73 74 65 70 2d 73 65 74 2d 73 74  :teststep-set-st
c890: 61 74 75 73 21 20 64 62 20 74 65 73 74 2d 69 64  atus! db test-id
c8a0: 20 74 65 73 74 73 74 65 70 2d 6e 61 6d 65 20 73   teststep-name s
c8b0: 74 61 74 65 2d 69 6e 20 73 74 61 74 75 73 2d 69  tate-in status-i
c8c0: 6e 20 69 74 65 6d 64 61 74 20 63 6f 6d 6d 65 6e  n itemdat commen
c8d0: 74 20 6c 6f 67 66 69 6c 65 29 0a 20 20 28 6c 65  t logfile).  (le
c8e0: 74 20 28 28 69 74 65 6d 2d 70 61 74 68 20 28 69  t ((item-path (i
c8f0: 74 65 6d 2d 6c 69 73 74 2d 3e 70 61 74 68 20 69  tem-list->path i
c900: 74 65 6d 64 61 74 29 29 29 0a 20 20 20 20 28 69  temdat))).    (i
c910: 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 09 28  f *runremote*..(
c920: 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65 63 74  let ((host (vect
c930: 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74  or-ref *runremot
c940: 65 2a 20 30 29 29 0a 09 20 20 20 20 20 20 28 70  e* 0))..      (p
c950: 6f 72 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20  ort (vector-ref 
c960: 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29  *runremote* 1)))
c970: 0a 09 20 20 28 28 72 70 63 3a 70 72 6f 63 65 64  ..  ((rpc:proced
c980: 75 72 65 20 27 72 64 62 3a 74 65 73 74 73 74 65  ure 'rdb:testste
c990: 70 2d 73 65 74 2d 73 74 61 74 75 73 21 20 68 6f  p-set-status! ho
c9a0: 73 74 20 70 6f 72 74 29 0a 09 20 20 20 74 65 73  st port)..   tes
c9b0: 74 2d 69 64 20 74 65 73 74 73 74 65 70 2d 6e 61  t-id teststep-na
c9c0: 6d 65 20 73 74 61 74 65 2d 69 6e 20 73 74 61 74  me state-in stat
c9d0: 75 73 2d 69 6e 20 69 74 65 6d 2d 70 61 74 68 20  us-in item-path 
c9e0: 63 6f 6d 6d 65 6e 74 20 6c 6f 67 66 69 6c 65 29  comment logfile)
c9f0: 29 0a 09 28 64 62 3a 74 65 73 74 73 74 65 70 2d  )..(db:teststep-
ca00: 73 65 74 2d 73 74 61 74 75 73 21 20 64 62 20 74  set-status! db t
ca10: 65 73 74 2d 69 64 20 74 65 73 74 73 74 65 70 2d  est-id teststep-
ca20: 6e 61 6d 65 20 73 74 61 74 65 2d 69 6e 20 73 74  name state-in st
ca30: 61 74 75 73 2d 69 6e 20 69 74 65 6d 2d 70 61 74  atus-in item-pat
ca40: 68 20 63 6f 6d 6d 65 6e 74 20 6c 6f 67 66 69 6c  h comment logfil
ca50: 65 29 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  e))))..(define (
ca60: 72 64 62 3a 74 65 73 74 2d 75 70 64 61 74 65 2d  rdb:test-update-
ca70: 6d 65 74 61 2d 69 6e 66 6f 20 64 62 20 72 75 6e  meta-info db run
ca80: 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74  -id test-name it
ca90: 65 6d 64 61 74 20 6d 69 6e 75 74 65 73 20 63 70  emdat minutes cp
caa0: 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20 74  uload diskfree t
cab0: 6d 70 66 72 65 65 29 0a 20 20 28 6c 65 74 20 28  mpfree).  (let (
cac0: 28 69 74 65 6d 2d 70 61 74 68 20 28 69 74 65 6d  (item-path (item
cad0: 2d 6c 69 73 74 2d 3e 70 61 74 68 20 69 74 65 6d  -list->path item
cae0: 64 61 74 29 29 29 0a 20 20 20 20 28 69 66 20 2a  dat))).    (if *
caf0: 72 75 6e 72 65 6d 6f 74 65 2a 0a 09 28 6c 65 74  runremote*..(let
cb00: 20 28 28 68 6f 73 74 20 28 76 65 63 74 6f 72 2d   ((host (vector-
cb10: 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20  ref *runremote* 
cb20: 30 29 29 0a 09 20 20 20 20 20 20 28 70 6f 72 74  0))..      (port
cb30: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75   (vector-ref *ru
cb40: 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09 20  nremote* 1))).. 
cb50: 20 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65   ((rpc:procedure
cb60: 20 27 72 64 62 3a 74 65 73 74 2d 75 70 64 61 74   'rdb:test-updat
cb70: 65 2d 6d 65 74 61 2d 69 6e 66 6f 20 68 6f 73 74  e-meta-info host
cb80: 20 70 6f 72 74 29 0a 09 20 20 20 72 75 6e 2d 69   port)..   run-i
cb90: 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d  d test-name item
cba0: 2d 70 61 74 68 20 6d 69 6e 75 74 65 73 20 63 70  -path minutes cp
cbb0: 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20 74  uload diskfree t
cbc0: 6d 70 66 72 65 65 29 29 0a 09 28 64 62 3a 74 65  mpfree))..(db:te
cbd0: 73 74 2d 75 70 64 61 74 65 2d 6d 65 74 61 2d 69  st-update-meta-i
cbe0: 6e 66 6f 20 64 62 20 72 75 6e 2d 69 64 20 74 65  nfo db run-id te
cbf0: 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74  st-name item-pat
cc00: 68 20 6d 69 6e 75 74 65 73 20 63 70 75 6c 6f 61  h minutes cpuloa
cc10: 64 20 64 69 73 6b 66 72 65 65 20 74 6d 70 66 72  d diskfree tmpfr
cc20: 65 65 29 29 29 29 0a 0a 28 64 65 66 69 6e 65 20  ee))))..(define 
cc30: 28 72 64 62 3a 74 65 73 74 2d 73 65 74 2d 73 74  (rdb:test-set-st
cc40: 61 74 65 2d 73 74 61 74 75 73 2d 62 79 2d 72 75  ate-status-by-ru
cc50: 6e 2d 69 64 2d 74 65 73 74 6e 61 6d 65 20 64 62  n-id-testname db
cc60: 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d   run-id test-nam
cc70: 65 20 69 74 65 6d 2d 70 61 74 68 20 73 74 61 74  e item-path stat
cc80: 75 73 20 73 74 61 74 65 29 0a 20 20 28 69 66 20  us state).  (if 
cc90: 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20  *runremote*.    
cca0: 20 20 28 6c 65 74 20 28 28 68 6f 73 74 20 28 76    (let ((host (v
ccb0: 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65  ector-ref *runre
ccc0: 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20 20 20 28  mote* 0))..    (
ccd0: 70 6f 72 74 20 28 76 65 63 74 6f 72 2d 72 65 66  port (vector-ref
cce0: 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29   *runremote* 1))
ccf0: 29 0a 09 28 28 72 70 63 3a 70 72 6f 63 65 64 75  )..((rpc:procedu
cd00: 72 65 20 27 72 64 62 3a 74 65 73 74 2d 73 65 74  re 'rdb:test-set
cd10: 2d 73 74 61 74 65 2d 73 74 61 74 75 73 2d 62 79  -state-status-by
cd20: 2d 72 75 6e 2d 69 64 2d 74 65 73 74 6e 61 6d 65  -run-id-testname
cd30: 20 68 6f 73 74 20 70 6f 72 74 29 0a 09 20 20 72   host port)..  r
cd40: 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20  un-id test-name 
cd50: 69 74 65 6d 2d 70 61 74 68 20 73 74 61 74 75 73  item-path status
cd60: 20 73 74 61 74 65 29 29 0a 20 20 20 20 20 20 28   state)).      (
cd70: 64 62 3a 74 65 73 74 2d 73 65 74 2d 73 74 61 74  db:test-set-stat
cd80: 65 2d 73 74 61 74 75 73 2d 62 79 2d 72 75 6e 2d  e-status-by-run-
cd90: 69 64 2d 74 65 73 74 6e 61 6d 65 20 64 62 20 72  id-testname db r
cda0: 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20  un-id test-name 
cdb0: 69 74 65 6d 2d 70 61 74 68 20 73 74 61 74 75 73  item-path status
cdc0: 20 73 74 61 74 65 29 29 29 0a 0a 28 64 65 66 69   state)))..(defi
cdd0: 6e 65 20 28 72 64 62 3a 63 73 76 2d 3e 74 65 73  ne (rdb:csv->tes
cde0: 74 2d 64 61 74 61 20 64 62 20 74 65 73 74 2d 69  t-data db test-i
cdf0: 64 20 63 73 76 64 61 74 61 29 0a 20 20 28 69 66  d csvdata).  (if
ce00: 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20   *runremote*.   
ce10: 20 20 20 28 6c 65 74 20 28 28 68 6f 73 74 20 28     (let ((host (
ce20: 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72  vector-ref *runr
ce30: 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20 20 20  emote* 0))..    
ce40: 28 70 6f 72 74 20 28 76 65 63 74 6f 72 2d 72 65  (port (vector-re
ce50: 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29  f *runremote* 1)
ce60: 29 29 0a 09 28 28 72 70 63 3a 70 72 6f 63 65 64  ))..((rpc:proced
ce70: 75 72 65 20 27 72 64 62 3a 63 73 76 2d 3e 74 65  ure 'rdb:csv->te
ce80: 73 74 2d 64 61 74 61 20 68 6f 73 74 20 70 6f 72  st-data host por
ce90: 74 29 0a 09 20 74 65 73 74 2d 69 64 20 63 73 76  t).. test-id csv
cea0: 64 61 74 61 29 29 0a 20 20 20 20 20 20 28 64 62  data)).      (db
ceb0: 3a 63 73 76 2d 3e 74 65 73 74 2d 64 61 74 61 20  :csv->test-data 
cec0: 64 62 20 74 65 73 74 2d 69 64 20 63 73 76 64 61  db test-id csvda
ced0: 74 61 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  ta)))..(define (
cee0: 72 64 62 3a 72 6f 6c 6c 2d 75 70 2d 70 61 73 73  rdb:roll-up-pass
cef0: 2d 66 61 69 6c 2d 63 6f 75 6e 74 73 20 64 62 20  -fail-counts db 
cf00: 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65  run-id test-name
cf10: 20 69 74 65 6d 2d 70 61 74 68 20 73 74 61 74 75   item-path statu
cf20: 73 29 0a 20 20 28 69 66 20 2a 72 75 6e 72 65 6d  s).  (if *runrem
cf30: 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c 65 74 20  ote*.      (let 
cf40: 28 28 68 6f 73 74 20 28 76 65 63 74 6f 72 2d 72  ((host (vector-r
cf50: 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30  ef *runremote* 0
cf60: 29 29 0a 09 20 20 20 20 28 70 6f 72 74 20 28 76  ))..    (port (v
cf70: 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65  ector-ref *runre
cf80: 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28 28 72 70  mote* 1)))..((rp
cf90: 63 3a 70 72 6f 63 65 64 75 72 65 20 27 72 64 62  c:procedure 'rdb
cfa0: 3a 72 6f 6c 6c 2d 75 70 2d 70 61 73 73 2d 66 61  :roll-up-pass-fa
cfb0: 69 6c 2d 63 6f 75 6e 74 73 20 68 6f 73 74 20 70  il-counts host p
cfc0: 6f 72 74 29 0a 09 20 72 75 6e 2d 69 64 20 74 65  ort).. run-id te
cfd0: 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74  st-name item-pat
cfe0: 68 20 73 74 61 74 75 73 29 29 0a 20 20 20 20 20  h status)).     
cff0: 20 28 64 62 3a 72 6f 6c 6c 2d 75 70 2d 70 61 73   (db:roll-up-pas
d000: 73 2d 66 61 69 6c 2d 63 6f 75 6e 74 73 20 64 62  s-fail-counts db
d010: 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d   run-id test-nam
d020: 65 20 69 74 65 6d 2d 70 61 74 68 20 73 74 61 74  e item-path stat
d030: 75 73 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  us)))..(define (
d040: 72 64 62 3a 74 65 73 74 2d 73 65 74 2d 63 6f 6d  rdb:test-set-com
d050: 6d 65 6e 74 20 64 62 20 74 65 73 74 2d 69 64 20  ment db test-id 
d060: 63 6f 6d 6d 65 6e 74 29 0a 20 20 28 69 66 20 2a  comment).  (if *
d070: 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20  runremote*.     
d080: 20 28 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65   (let ((host (ve
d090: 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d  ctor-ref *runrem
d0a0: 6f 74 65 2a 20 30 29 29 0a 09 20 20 20 20 28 70  ote* 0))..    (p
d0b0: 6f 72 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20  ort (vector-ref 
d0c0: 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29  *runremote* 1)))
d0d0: 0a 09 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72  ..((rpc:procedur
d0e0: 65 20 27 72 64 62 3a 74 65 73 74 2d 73 65 74 2d  e 'rdb:test-set-
d0f0: 63 6f 6d 6d 65 6e 74 20 68 6f 73 74 20 70 6f 72  comment host por
d100: 74 29 0a 09 20 74 65 73 74 2d 69 64 20 63 6f 6d  t).. test-id com
d110: 6d 65 6e 74 29 29 0a 20 20 20 20 20 20 28 64 62  ment)).      (db
d120: 3a 74 65 73 74 2d 73 65 74 2d 63 6f 6d 6d 65 6e  :test-set-commen
d130: 74 20 64 62 20 74 65 73 74 2d 69 64 20 63 6f 6d  t db test-id com
d140: 6d 65 6e 74 29 29 29 0a 0a 28 64 65 66 69 6e 65  ment)))..(define
d150: 20 28 72 64 62 3a 74 65 73 74 2d 73 65 74 2d 6c   (rdb:test-set-l
d160: 6f 67 21 20 64 62 20 74 65 73 74 2d 69 64 20 6c  og! db test-id l
d170: 6f 67 66 29 0a 20 20 28 69 66 20 2a 72 75 6e 72  ogf).  (if *runr
d180: 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c 65  emote*.      (le
d190: 74 20 28 28 68 6f 73 74 20 28 76 65 63 74 6f 72  t ((host (vector
d1a0: 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a  -ref *runremote*
d1b0: 20 30 29 29 0a 09 20 20 20 20 28 70 6f 72 74 20   0))..    (port 
d1c0: 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e  (vector-ref *run
d1d0: 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28 28  remote* 1)))..((
d1e0: 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20 27 72  rpc:procedure 'r
d1f0: 64 62 3a 74 65 73 74 2d 73 65 74 2d 6c 6f 67 21  db:test-set-log!
d200: 20 68 6f 73 74 20 70 6f 72 74 29 20 74 65 73 74   host port) test
d210: 2d 69 64 20 6c 6f 67 66 29 29 0a 20 20 20 20 20  -id logf)).     
d220: 20 28 64 62 3a 74 65 73 74 2d 73 65 74 2d 6c 6f   (db:test-set-lo
d230: 67 21 20 64 62 20 74 65 73 74 2d 69 64 20 6c 6f  g! db test-id lo
d240: 67 66 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  gf)))..(define (
d250: 72 64 62 3a 67 65 74 2d 72 75 6e 73 20 64 62 20  rdb:get-runs db 
d260: 72 75 6e 6e 61 6d 65 70 61 74 74 20 6e 75 6d 72  runnamepatt numr
d270: 75 6e 73 20 73 74 61 72 74 72 75 6e 6f 66 66 73  uns startrunoffs
d280: 65 74 20 6b 65 79 70 61 74 74 73 29 0a 20 20 28  et keypatts).  (
d290: 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20  if *runremote*. 
d2a0: 20 20 20 20 20 28 6c 65 74 20 28 28 68 6f 73 74       (let ((host
d2b0: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75   (vector-ref *ru
d2c0: 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20  nremote* 0))..  
d2d0: 20 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72 2d    (port (vector-
d2e0: 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20  ref *runremote* 
d2f0: 31 29 29 29 0a 09 28 28 72 70 63 3a 70 72 6f 63  1)))..((rpc:proc
d300: 65 64 75 72 65 20 27 72 64 62 3a 67 65 74 2d 72  edure 'rdb:get-r
d310: 75 6e 73 20 68 6f 73 74 20 70 6f 72 74 29 0a 09  uns host port)..
d320: 20 72 75 6e 6e 61 6d 65 70 61 74 74 20 6e 75 6d   runnamepatt num
d330: 72 75 6e 73 20 73 74 61 72 74 72 75 6e 6f 66 66  runs startrunoff
d340: 73 65 74 20 6b 65 79 70 61 74 74 73 29 29 0a 20  set keypatts)). 
d350: 20 20 20 20 20 28 64 62 3a 67 65 74 2d 72 75 6e       (db:get-run
d360: 73 20 64 62 20 72 75 6e 6e 61 6d 65 70 61 74 74  s db runnamepatt
d370: 20 6e 75 6d 72 75 6e 73 20 73 74 61 72 74 72 75   numruns startru
d380: 6e 6f 66 66 73 65 74 20 6b 65 79 70 61 74 74 73  noffset keypatts
d390: 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 72 64  )))..(define (rd
d3a0: 62 3a 67 65 74 2d 74 65 73 74 73 2d 66 6f 72 2d  b:get-tests-for-
d3b0: 72 75 6e 20 64 62 20 72 75 6e 2d 69 64 20 74 65  run db run-id te
d3c0: 73 74 70 61 74 74 20 69 74 65 6d 70 61 74 74 20  stpatt itempatt 
d3d0: 73 74 61 74 65 73 20 73 74 61 74 75 73 65 73 29  states statuses)
d3e0: 0a 20 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74  .  (if *runremot
d3f0: 65 2a 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28  e*.      (let ((
d400: 68 6f 73 74 20 28 76 65 63 74 6f 72 2d 72 65 66  host (vector-ref
d410: 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29   *runremote* 0))
d420: 0a 09 20 20 20 20 28 70 6f 72 74 20 28 76 65 63  ..    (port (vec
d430: 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f  tor-ref *runremo
d440: 74 65 2a 20 31 29 29 29 0a 09 28 28 72 70 63 3a  te* 1)))..((rpc:
d450: 70 72 6f 63 65 64 75 72 65 20 27 72 64 62 3a 67  procedure 'rdb:g
d460: 65 74 2d 74 65 73 74 73 2d 66 6f 72 2d 72 75 6e  et-tests-for-run
d470: 20 68 6f 73 74 20 70 6f 72 74 29 0a 09 20 20 72   host port)..  r
d480: 75 6e 2d 69 64 20 74 65 73 74 70 61 74 74 20 69  un-id testpatt i
d490: 74 65 6d 70 61 74 74 20 73 74 61 74 65 73 20 73  tempatt states s
d4a0: 74 61 74 75 73 65 73 29 29 0a 20 20 20 20 20 20  tatuses)).      
d4b0: 28 64 62 3a 67 65 74 2d 74 65 73 74 73 2d 66 6f  (db:get-tests-fo
d4c0: 72 2d 72 75 6e 20 64 62 20 72 75 6e 2d 69 64 20  r-run db run-id 
d4d0: 74 65 73 74 70 61 74 74 20 69 74 65 6d 70 61 74  testpatt itempat
d4e0: 74 20 73 74 61 74 65 73 20 73 74 61 74 75 73 65  t states statuse
d4f0: 73 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 72  s)))..(define (r
d500: 64 62 3a 67 65 74 2d 74 65 73 74 2d 64 61 74 61  db:get-test-data
d510: 2d 62 79 2d 69 64 20 64 62 20 74 65 73 74 2d 69  -by-id db test-i
d520: 64 29 0a 20 20 28 69 66 20 2a 72 75 6e 72 65 6d  d).  (if *runrem
d530: 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c 65 74 20  ote*.      (let 
d540: 28 28 68 6f 73 74 20 28 76 65 63 74 6f 72 2d 72  ((host (vector-r
d550: 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30  ef *runremote* 0
d560: 29 29 0a 09 20 20 20 20 28 70 6f 72 74 20 28 76  ))..    (port (v
d570: 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65  ector-ref *runre
d580: 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28 28 72 70  mote* 1)))..((rp
d590: 63 3a 70 72 6f 63 65 64 75 72 65 20 27 72 70 63  c:procedure 'rpc
d5a0: 3a 67 65 74 2d 74 65 73 74 2d 64 61 74 61 2d 62  :get-test-data-b
d5b0: 79 2d 69 64 20 68 6f 73 74 20 70 6f 72 74 29 0a  y-id host port).
d5c0: 09 20 74 65 73 74 2d 69 64 29 29 0a 20 20 20 20  . test-id)).    
d5d0: 20 20 28 64 62 3a 67 65 74 2d 74 65 73 74 2d 64    (db:get-test-d
d5e0: 61 74 61 2d 62 79 2d 69 64 20 64 62 20 74 65 73  ata-by-id db tes
d5f0: 74 2d 69 64 29 29 29 0a 20 20 20 20 20 20 0a 28  t-id))).      .(
d600: 64 65 66 69 6e 65 20 28 72 64 62 3a 67 65 74 2d  define (rdb:get-
d610: 6b 65 79 73 20 64 62 29 0a 20 20 28 69 66 20 2a  keys db).  (if *
d620: 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20  runremote*.     
d630: 20 28 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65   (let ((host (ve
d640: 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d  ctor-ref *runrem
d650: 6f 74 65 2a 20 30 29 29 0a 09 20 20 20 20 28 70  ote* 0))..    (p
d660: 6f 72 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20  ort (vector-ref 
d670: 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29  *runremote* 1)))
d680: 0a 09 28 69 66 20 2a 64 62 2d 6b 65 79 73 2a 20  ..(if *db-keys* 
d690: 2a 64 62 2d 6b 65 79 73 2a 20 0a 09 20 20 20 20  *db-keys* ..    
d6a0: 28 6c 65 74 20 28 28 6b 65 79 73 20 28 28 72 70  (let ((keys ((rp
d6b0: 63 3a 70 72 6f 63 65 64 75 72 65 20 27 72 64 62  c:procedure 'rdb
d6c0: 3a 67 65 74 2d 6b 65 79 73 20 68 6f 73 74 20 70  :get-keys host p
d6d0: 6f 72 74 29 29 29 29 0a 09 20 20 20 20 20 20 28  ort))))..      (
d6e0: 73 65 74 21 20 2a 64 62 2d 6b 65 79 73 2a 20 6b  set! *db-keys* k
d6f0: 65 79 73 29 0a 09 20 20 20 20 20 20 6b 65 79 73  eys)..      keys
d700: 29 29 29 0a 20 20 20 20 20 20 28 64 62 3a 67 65  ))).      (db:ge
d710: 74 2d 6b 65 79 73 20 64 62 29 29 29 0a 09 20 0a  t-keys db))).. .
d720: 28 64 65 66 69 6e 65 20 28 72 64 62 3a 67 65 74  (define (rdb:get
d730: 2d 6e 75 6d 2d 72 75 6e 73 20 64 62 20 72 75 6e  -num-runs db run
d740: 70 61 74 74 29 0a 20 20 28 69 66 20 2a 72 75 6e  patt).  (if *run
d750: 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c  remote*.      (l
d760: 65 74 20 28 28 68 6f 73 74 20 28 76 65 63 74 6f  et ((host (vecto
d770: 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65  r-ref *runremote
d780: 2a 20 30 29 29 0a 09 20 20 20 20 28 70 6f 72 74  * 0))..    (port
d790: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75   (vector-ref *ru
d7a0: 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28  nremote* 1)))..(
d7b0: 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20 27  (rpc:procedure '
d7c0: 72 64 62 3a 67 65 74 2d 6e 75 6d 2d 72 75 6e 73  rdb:get-num-runs
d7d0: 20 68 6f 73 74 20 70 6f 72 74 29 20 72 75 6e 70   host port) runp
d7e0: 61 74 74 29 29 0a 20 20 20 20 20 20 28 64 62 3a  att)).      (db:
d7f0: 67 65 74 2d 6e 75 6d 2d 72 75 6e 73 20 64 62 20  get-num-runs db 
d800: 72 75 6e 70 61 74 74 29 29 29 0a 0a 28 64 65 66  runpatt)))..(def
d810: 69 6e 65 20 28 72 64 62 3a 74 65 73 74 2d 73 65  ine (rdb:test-se
d820: 74 2d 73 74 61 74 65 2d 73 74 61 74 75 73 2d 62  t-state-status-b
d830: 79 2d 69 64 20 64 62 20 74 65 73 74 2d 69 64 20  y-id db test-id 
d840: 6e 65 77 73 74 61 74 65 20 6e 65 77 73 74 61 74  newstate newstat
d850: 75 73 20 6e 65 77 63 6f 6d 6d 65 6e 74 29 0a 20  us newcomment). 
d860: 20 20 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74     (if *runremot
d870: 65 2a 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28  e*.      (let ((
d880: 68 6f 73 74 20 28 76 65 63 74 6f 72 2d 72 65 66  host (vector-ref
d890: 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29   *runremote* 0))
d8a0: 0a 09 20 20 20 20 28 70 6f 72 74 20 28 76 65 63  ..    (port (vec
d8b0: 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f  tor-ref *runremo
d8c0: 74 65 2a 20 31 29 29 29 0a 09 28 28 72 70 63 3a  te* 1)))..((rpc:
d8d0: 70 72 6f 63 65 64 75 72 65 20 27 72 64 62 3a 74  procedure 'rdb:t
d8e0: 65 73 74 2d 73 65 74 2d 73 74 61 74 65 2d 73 74  est-set-state-st
d8f0: 61 74 75 73 2d 62 79 2d 69 64 20 68 6f 73 74 20  atus-by-id host 
d900: 70 6f 72 74 29 0a 09 20 74 65 73 74 2d 69 64 20  port).. test-id 
d910: 6e 65 77 73 74 61 74 65 20 6e 65 77 73 74 61 74  newstate newstat
d920: 75 73 20 6e 65 77 63 6f 6d 6d 65 6e 74 29 29 0a  us newcomment)).
d930: 20 20 20 20 20 20 28 64 62 3a 74 65 73 74 2d 73        (db:test-s
d940: 65 74 2d 73 74 61 74 65 2d 73 74 61 74 75 73 2d  et-state-status-
d950: 62 79 2d 69 64 20 64 62 20 74 65 73 74 2d 69 64  by-id db test-id
d960: 20 6e 65 77 73 74 61 74 65 20 6e 65 77 73 74 61   newstate newsta
d970: 74 75 73 20 6e 65 77 63 6f 6d 6d 65 6e 74 29 29  tus newcomment))
d980: 29 0a 0a 28 64 65 66 69 6e 65 20 28 72 64 62 3a  )..(define (rdb:
d990: 67 65 74 2d 6b 65 79 2d 76 61 6c 2d 70 61 69 72  get-key-val-pair
d9a0: 73 20 64 62 20 72 75 6e 2d 69 64 29 0a 20 20 28  s db run-id).  (
d9b0: 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20  if *runremote*. 
d9c0: 20 20 20 20 20 28 6c 65 74 20 28 28 68 6f 73 74       (let ((host
d9d0: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75   (vector-ref *ru
d9e0: 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20  nremote* 0))..  
d9f0: 20 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72 2d    (port (vector-
da00: 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20  ref *runremote* 
da10: 31 29 29 29 0a 09 28 28 72 70 63 3a 70 72 6f 63  1)))..((rpc:proc
da20: 65 64 75 72 65 20 27 72 64 62 3a 67 65 74 2d 6b  edure 'rdb:get-k
da30: 65 79 2d 76 61 6c 2d 70 61 69 72 73 20 68 6f 73  ey-val-pairs hos
da40: 74 20 70 6f 72 74 29 20 72 75 6e 2d 69 64 29 29  t port) run-id))
da50: 0a 20 20 20 20 20 20 28 64 62 3a 67 65 74 2d 6b  .      (db:get-k
da60: 65 79 2d 76 61 6c 2d 70 61 69 72 73 20 64 62 20  ey-val-pairs db 
da70: 72 75 6e 2d 69 64 29 29 29 0a 09 20 0a 28 64 65  run-id))).. .(de
da80: 66 69 6e 65 20 28 72 64 62 3a 67 65 74 2d 6b 65  fine (rdb:get-ke
da90: 79 2d 76 61 6c 73 20 64 62 20 72 75 6e 2d 69 64  y-vals db run-id
daa0: 29 0a 20 20 20 20 28 69 66 20 2a 72 75 6e 72 65  ).    (if *runre
dab0: 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c 65 74  mote*.      (let
dac0: 20 28 28 68 6f 73 74 20 28 76 65 63 74 6f 72 2d   ((host (vector-
dad0: 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20  ref *runremote* 
dae0: 30 29 29 0a 09 20 20 20 20 28 70 6f 72 74 20 28  0))..    (port (
daf0: 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72  vector-ref *runr
db00: 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28 28 72  emote* 1)))..((r
db10: 70 63 3a 70 72 6f 63 65 64 75 72 65 20 27 72 64  pc:procedure 'rd
db20: 62 3a 67 65 74 2d 6b 65 79 2d 76 61 6c 73 20 68  b:get-key-vals h
db30: 6f 73 74 20 70 6f 72 74 29 20 72 75 6e 2d 69 64  ost port) run-id
db40: 29 29 0a 20 20 20 20 20 20 28 64 62 3a 67 65 74  )).      (db:get
db50: 2d 6b 65 79 2d 76 61 6c 73 20 64 62 20 72 75 6e  -key-vals db run
db60: 2d 69 64 29 29 29 0a 0a 28 64 65 66 69 6e 65 20  -id)))..(define 
db70: 28 72 64 62 3a 74 65 73 74 6d 65 74 61 2d 67 65  (rdb:testmeta-ge
db80: 74 2d 72 65 63 6f 72 64 20 64 62 20 74 65 73 74  t-record db test
db90: 6e 61 6d 65 29 0a 20 20 20 28 69 66 20 2a 72 75  name).   (if *ru
dba0: 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28  nremote*.      (
dbb0: 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65 63 74  let ((host (vect
dbc0: 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74  or-ref *runremot
dbd0: 65 2a 20 30 29 29 0a 09 20 20 20 20 28 70 6f 72  e* 0))..    (por
dbe0: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72  t (vector-ref *r
dbf0: 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09  unremote* 1)))..
dc00: 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20  ((rpc:procedure 
dc10: 27 72 64 62 3a 74 65 73 74 6d 65 74 61 2d 67 65  'rdb:testmeta-ge
dc20: 74 2d 72 65 63 6f 72 64 20 68 6f 73 74 20 70 6f  t-record host po
dc30: 72 74 29 20 74 65 73 74 6e 61 6d 65 29 29 0a 20  rt) testname)). 
dc40: 20 20 20 20 20 28 64 62 3a 74 65 73 74 6d 65 74       (db:testmet
dc50: 61 2d 67 65 74 2d 72 65 63 6f 72 64 20 64 62 20  a-get-record db 
dc60: 74 65 73 74 6e 61 6d 65 29 29 29 0a 0a 28 64 65  testname)))..(de
dc70: 66 69 6e 65 20 28 72 64 62 3a 67 65 74 2d 74 65  fine (rdb:get-te
dc80: 73 74 2d 64 61 74 61 2d 62 79 2d 69 64 20 64 62  st-data-by-id db
dc90: 20 74 65 73 74 2d 69 64 29 0a 20 20 28 69 66 20   test-id).  (if 
dca0: 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20  *runremote*.    
dcb0: 20 20 28 6c 65 74 20 28 28 68 6f 73 74 20 28 76    (let ((host (v
dcc0: 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65  ector-ref *runre
dcd0: 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20 20 20 28  mote* 0))..    (
dce0: 70 6f 72 74 20 28 76 65 63 74 6f 72 2d 72 65 66  port (vector-ref
dcf0: 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29   *runremote* 1))
dd00: 29 0a 09 28 28 72 70 63 3a 70 72 6f 63 65 64 75  )..((rpc:procedu
dd10: 72 65 20 27 72 64 62 3a 67 65 74 2d 74 65 73 74  re 'rdb:get-test
dd20: 2d 64 61 74 61 2d 62 79 2d 69 64 20 68 6f 73 74  -data-by-id host
dd30: 20 70 6f 72 74 29 20 74 65 73 74 2d 69 64 29 29   port) test-id))
dd40: 0a 20 20 20 20 20 20 28 64 62 3a 67 65 74 2d 74  .      (db:get-t
dd50: 65 73 74 2d 64 61 74 61 2d 62 79 2d 69 64 20 64  est-data-by-id d
dd60: 62 20 74 65 73 74 2d 69 64 29 29 29 0a 0a 28 64  b test-id)))..(d
dd70: 65 66 69 6e 65 20 28 72 64 62 3a 67 65 74 2d 72  efine (rdb:get-r
dd80: 75 6e 2d 69 6e 66 6f 20 64 62 20 72 75 6e 2d 69  un-info db run-i
dd90: 64 29 0a 20 20 28 69 66 20 2a 72 75 6e 72 65 6d  d).  (if *runrem
dda0: 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c 65 74 20  ote*.      (let 
ddb0: 28 28 68 6f 73 74 20 28 76 65 63 74 6f 72 2d 72  ((host (vector-r
ddc0: 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30  ef *runremote* 0
ddd0: 29 29 0a 09 20 20 20 20 28 70 6f 72 74 20 28 76  ))..    (port (v
dde0: 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65  ector-ref *runre
ddf0: 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28 28 72 70  mote* 1)))..((rp
de00: 63 3a 70 72 6f 63 65 64 75 72 65 20 27 72 64 62  c:procedure 'rdb
de10: 3a 67 65 74 2d 72 75 6e 2d 69 6e 66 6f 20 68 6f  :get-run-info ho
de20: 73 74 20 70 6f 72 74 29 20 72 75 6e 2d 69 64 29  st port) run-id)
de30: 29 0a 20 20 20 20 20 20 28 64 62 3a 67 65 74 2d  ).      (db:get-
de40: 72 75 6e 2d 69 6e 66 6f 20 64 62 20 72 75 6e 2d  run-info db run-
de50: 69 64 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  id)))..(define (
de60: 72 64 62 3a 67 65 74 2d 73 74 65 70 73 2d 66 6f  rdb:get-steps-fo
de70: 72 2d 74 65 73 74 20 64 62 20 74 65 73 74 2d 69  r-test db test-i
de80: 64 29 0a 20 20 28 69 66 20 2a 72 75 6e 72 65 6d  d).  (if *runrem
de90: 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c 65 74 20  ote*.      (let 
dea0: 28 28 68 6f 73 74 20 28 76 65 63 74 6f 72 2d 72  ((host (vector-r
deb0: 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30  ef *runremote* 0
dec0: 29 29 0a 09 20 20 20 20 28 70 6f 72 74 20 28 76  ))..    (port (v
ded0: 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65  ector-ref *runre
dee0: 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28 28 72 70  mote* 1)))..((rp
def0: 63 3a 70 72 6f 63 65 64 75 72 65 20 27 72 64 62  c:procedure 'rdb
df00: 3a 67 65 74 2d 73 74 65 70 73 2d 66 6f 72 2d 74  :get-steps-for-t
df10: 65 73 74 20 68 6f 73 74 20 70 6f 72 74 29 20 74  est host port) t
df20: 65 73 74 2d 69 64 29 29 0a 20 20 20 20 20 20 28  est-id)).      (
df30: 64 62 3a 67 65 74 2d 73 74 65 70 73 2d 66 6f 72  db:get-steps-for
df40: 2d 74 65 73 74 20 64 62 20 74 65 73 74 2d 69 64  -test db test-id
df50: 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 72 64  )))..(define (rd
df60: 62 3a 67 65 74 2d 73 74 65 70 73 2d 74 61 62 6c  b:get-steps-tabl
df70: 65 20 64 62 20 74 65 73 74 2d 69 64 29 0a 20 20  e db test-id).  
df80: 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a  (if *runremote*.
df90: 20 20 20 20 20 20 28 6c 65 74 20 28 28 68 6f 73        (let ((hos
dfa0: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72  t (vector-ref *r
dfb0: 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20  unremote* 0)).. 
dfc0: 20 20 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72     (port (vector
dfd0: 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a  -ref *runremote*
dfe0: 20 31 29 29 29 0a 09 28 28 72 70 63 3a 70 72 6f   1)))..((rpc:pro
dff0: 63 65 64 75 72 65 20 27 72 64 62 3a 67 65 74 2d  cedure 'rdb:get-
e000: 73 74 65 70 73 2d 74 61 62 6c 65 20 68 6f 73 74  steps-table host
e010: 20 70 6f 72 74 29 20 74 65 73 74 2d 69 64 29 29   port) test-id))
e020: 0a 20 20 20 20 20 20 28 64 62 3a 67 65 74 2d 73  .      (db:get-s
e030: 74 65 70 73 2d 74 61 62 6c 65 20 64 62 20 74 65  teps-table db te
e040: 73 74 2d 69 64 29 29 29 0a 0a 28 64 65 66 69 6e  st-id)))..(defin
e050: 65 20 28 72 64 62 3a 72 65 61 64 2d 74 65 73 74  e (rdb:read-test
e060: 2d 64 61 74 61 20 64 62 20 74 65 73 74 2d 69 64  -data db test-id
e070: 20 63 61 74 65 67 6f 72 79 70 61 74 74 29 0a 20   categorypatt). 
e080: 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a   (if *runremote*
e090: 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28 68 6f  .      (let ((ho
e0a0: 73 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a  st (vector-ref *
e0b0: 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09  runremote* 0))..
e0c0: 20 20 20 20 28 70 6f 72 74 20 28 76 65 63 74 6f      (port (vecto
e0d0: 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65  r-ref *runremote
e0e0: 2a 20 31 29 29 29 0a 09 28 28 72 70 63 3a 70 72  * 1)))..((rpc:pr
e0f0: 6f 63 65 64 75 72 65 20 27 72 64 62 3a 72 65 61  ocedure 'rdb:rea
e100: 64 2d 74 65 73 74 2d 64 61 74 61 20 68 6f 73 74  d-test-data host
e110: 20 70 6f 72 74 29 20 74 65 73 74 2d 69 64 20 63   port) test-id c
e120: 61 74 65 67 6f 72 79 70 61 74 74 29 29 0a 20 20  ategorypatt)).  
e130: 20 20 20 20 28 64 62 3a 72 65 61 64 2d 74 65 73      (db:read-tes
e140: 74 2d 64 61 74 61 20 64 62 20 74 65 73 74 2d 69  t-data db test-i
e150: 64 20 63 61 74 65 67 6f 72 79 70 61 74 74 29 29  d categorypatt))
e160: 29 0a 0a 28 64 65 66 69 6e 65 20 28 72 64 62 3a  )..(define (rdb:
e170: 67 65 74 2d 74 65 73 74 2d 69 6e 66 6f 20 64 62  get-test-info db
e180: 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65   run-id testname
e190: 20 69 74 65 6d 2d 70 61 74 68 29 0a 20 20 28 69   item-path).  (i
e1a0: 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20  f *runremote*.  
e1b0: 20 20 20 20 28 6c 65 74 20 28 28 68 6f 73 74 20      (let ((host 
e1c0: 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e  (vector-ref *run
e1d0: 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20 20  remote* 0))..   
e1e0: 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72 2d 72   (port (vector-r
e1f0: 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31  ef *runremote* 1
e200: 29 29 29 0a 09 28 28 72 70 63 3a 70 72 6f 63 65  )))..((rpc:proce
e210: 64 75 72 65 20 27 72 64 62 3a 67 65 74 2d 74 65  dure 'rdb:get-te
e220: 73 74 2d 69 6e 66 6f 20 68 6f 73 74 20 70 6f 72  st-info host por
e230: 74 29 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61  t) run-id testna
e240: 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 29 0a 20  me item-path)). 
e250: 20 20 20 20 20 28 64 62 3a 67 65 74 2d 74 65 73       (db:get-tes
e260: 74 2d 69 6e 66 6f 20 64 62 20 72 75 6e 2d 69 64  t-info db run-id
e270: 20 74 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70   testname item-p
e280: 61 74 68 29 29 29 0a 0a 28 64 65 66 69 6e 65 20  ath)))..(define 
e290: 28 72 64 62 3a 64 65 6c 65 74 65 2d 74 65 73 74  (rdb:delete-test
e2a0: 2d 72 65 63 6f 72 64 73 20 64 62 20 74 65 73 74  -records db test
e2b0: 2d 69 64 29 0a 20 20 28 69 66 20 2a 72 75 6e 72  -id).  (if *runr
e2c0: 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c 65  emote*.      (le
e2d0: 74 20 28 28 68 6f 73 74 20 28 76 65 63 74 6f 72  t ((host (vector
e2e0: 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a  -ref *runremote*
e2f0: 20 30 29 29 0a 09 20 20 20 20 28 70 6f 72 74 20   0))..    (port 
e300: 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e  (vector-ref *run
e310: 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28 28  remote* 1)))..((
e320: 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20 27 72  rpc:procedure 'r
e330: 64 62 3a 64 65 6c 65 74 65 2d 74 65 73 74 2d 72  db:delete-test-r
e340: 65 63 6f 72 64 73 20 68 6f 73 74 20 70 6f 72 74  ecords host port
e350: 29 20 74 65 73 74 2d 69 64 29 29 0a 20 20 20 20  ) test-id)).    
e360: 20 20 28 64 62 3a 64 65 6c 65 74 65 2d 74 65 73    (db:delete-tes
e370: 74 2d 72 65 63 6f 72 64 73 20 64 62 20 74 65 73  t-records db tes
e380: 74 2d 69 64 29 29 29 0a 0a 28 64 65 66 69 6e 65  t-id)))..(define
e390: 20 28 72 64 62 3a 74 65 73 74 2d 64 61 74 61 2d   (rdb:test-data-
e3a0: 72 6f 6c 6c 75 70 20 64 62 20 74 65 73 74 2d 69  rollup db test-i
e3b0: 64 20 73 74 61 74 75 73 29 0a 20 20 20 20 28 69  d status).    (i
e3c0: 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20  f *runremote*.  
e3d0: 20 20 20 20 28 6c 65 74 20 28 28 68 6f 73 74 20      (let ((host 
e3e0: 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e  (vector-ref *run
e3f0: 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20 20  remote* 0))..   
e400: 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72 2d 72   (port (vector-r
e410: 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31  ef *runremote* 1
e420: 29 29 29 0a 09 28 28 72 70 63 3a 70 72 6f 63 65  )))..((rpc:proce
e430: 64 75 72 65 20 27 72 64 62 3a 74 65 73 74 2d 64  dure 'rdb:test-d
e440: 61 74 61 2d 72 6f 6c 6c 75 70 20 68 6f 73 74 20  ata-rollup host 
e450: 70 6f 72 74 29 20 74 65 73 74 2d 69 64 20 73 74  port) test-id st
e460: 61 74 75 73 29 29 0a 20 20 20 20 20 20 28 64 62  atus)).      (db
e470: 3a 74 65 73 74 2d 64 61 74 61 2d 72 6f 6c 6c 75  :test-data-rollu
e480: 70 20 64 62 20 74 65 73 74 2d 69 64 20 73 74 61  p db test-id sta
e490: 74 75 73 29 29 29 0a                             tus))).