Megatest

Hex Artifact Content
Login

Artifact 64f23143e9346f51b4750b619c48728974ab0fbb:


0000: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
0010: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0030: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0040: 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 43 6f 70 79  ========.;; Copy
0050: 72 69 67 68 74 20 32 30 30 36 2d 32 30 31 31 2c  right 2006-2011,
0060: 20 4d 61 74 74 68 65 77 20 57 65 6c 6c 61 6e 64   Matthew Welland
0070: 2e 0a 3b 3b 20 0a 3b 3b 20 20 54 68 69 73 20 70  ..;; .;;  This p
0080: 72 6f 67 72 61 6d 20 69 73 20 6d 61 64 65 20 61  rogram is made a
0090: 76 61 69 6c 61 62 6c 65 20 75 6e 64 65 72 20 74  vailable under t
00a0: 68 65 20 47 4e 55 20 47 50 4c 20 76 65 72 73 69  he GNU GPL versi
00b0: 6f 6e 20 32 2e 30 20 6f 72 0a 3b 3b 20 20 67 72  on 2.0 or.;;  gr
00c0: 65 61 74 65 72 2e 20 53 65 65 20 74 68 65 20 61  eater. See the a
00d0: 63 63 6f 6d 70 61 6e 79 69 6e 67 20 66 69 6c 65  ccompanying file
00e0: 20 43 4f 50 59 49 4e 47 20 66 6f 72 20 64 65 74   COPYING for det
00f0: 61 69 6c 73 2e 0a 3b 3b 20 0a 3b 3b 20 20 54 68  ails..;; .;;  Th
0100: 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69  is program is di
0110: 73 74 72 69 62 75 74 65 64 20 57 49 54 48 4f 55  stributed WITHOU
0120: 54 20 41 4e 59 20 57 41 52 52 41 4e 54 59 3b 20  T ANY WARRANTY; 
0130: 77 69 74 68 6f 75 74 20 65 76 65 6e 20 74 68 65  without even the
0140: 0a 3b 3b 20 20 69 6d 70 6c 69 65 64 20 77 61 72  .;;  implied war
0150: 72 61 6e 74 79 20 6f 66 20 4d 45 52 43 48 41 4e  ranty of MERCHAN
0160: 54 41 42 49 4c 49 54 59 20 6f 72 20 46 49 54 4e  TABILITY or FITN
0170: 45 53 53 20 46 4f 52 20 41 20 50 41 52 54 49 43  ESS FOR A PARTIC
0180: 55 4c 41 52 0a 3b 3b 20 20 50 55 52 50 4f 53 45  ULAR.;;  PURPOSE
0190: 2e 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ..;;============
01a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 3d 3d  ==========..;;==
01e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0200: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0210: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0220: 3d 3d 3d 3d 0a 3b 3b 20 44 61 74 61 62 61 73 65  ====.;; Database
0230: 20 61 63 63 65 73 73 0a 3b 3b 3d 3d 3d 3d 3d 3d   access.;;======
0240: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0250: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0260: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0270: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0280: 0a 0a 28 72 65 71 75 69 72 65 2d 65 78 74 65 6e  ..(require-exten
0290: 73 69 6f 6e 20 28 73 72 66 69 20 31 38 29 20 65  sion (srfi 18) e
02a0: 78 74 72 61 73 20 74 63 70 20 72 70 63 29 0a 28  xtras tcp rpc).(
02b0: 69 6d 70 6f 72 74 20 28 70 72 65 66 69 78 20 72  import (prefix r
02c0: 70 63 20 72 70 63 3a 29 29 0a 0a 28 75 73 65 20  pc rpc:))..(use 
02d0: 73 71 6c 69 74 65 33 20 73 72 66 69 2d 31 20 70  sqlite3 srfi-1 p
02e0: 6f 73 69 78 20 72 65 67 65 78 20 72 65 67 65 78  osix regex regex
02f0: 2d 63 61 73 65 20 73 72 66 69 2d 36 39 20 63 73  -case srfi-69 cs
0300: 76 2d 78 6d 6c 29 0a 28 69 6d 70 6f 72 74 20 28  v-xml).(import (
0310: 70 72 65 66 69 78 20 73 71 6c 69 74 65 33 20 73  prefix sqlite3 s
0320: 71 6c 69 74 65 33 3a 29 29 0a 0a 28 64 65 63 6c  qlite3:))..(decl
0330: 61 72 65 20 28 75 6e 69 74 20 64 62 29 29 0a 28  are (unit db)).(
0340: 64 65 63 6c 61 72 65 20 28 75 73 65 73 20 63 6f  declare (uses co
0350: 6d 6d 6f 6e 29 29 0a 28 64 65 63 6c 61 72 65 20  mmon)).(declare 
0360: 28 75 73 65 73 20 6b 65 79 73 29 29 0a 28 64 65  (uses keys)).(de
0370: 63 6c 61 72 65 20 28 75 73 65 73 20 6f 64 73 29  clare (uses ods)
0380: 29 0a 0a 28 69 6e 63 6c 75 64 65 20 22 63 6f 6d  )..(include "com
0390: 6d 6f 6e 5f 72 65 63 6f 72 64 73 2e 73 63 6d 22  mon_records.scm"
03a0: 29 0a 28 69 6e 63 6c 75 64 65 20 22 64 62 5f 72  ).(include "db_r
03b0: 65 63 6f 72 64 73 2e 73 63 6d 22 29 0a 28 69 6e  ecords.scm").(in
03c0: 63 6c 75 64 65 20 22 6b 65 79 5f 72 65 63 6f 72  clude "key_recor
03d0: 64 73 2e 73 63 6d 22 29 0a 28 69 6e 63 6c 75 64  ds.scm").(includ
03e0: 65 20 22 72 75 6e 5f 72 65 63 6f 72 64 73 2e 73  e "run_records.s
03f0: 63 6d 22 29 0a 0a 3b 3b 20 74 69 6d 65 73 74 61  cm")..;; timesta
0400: 6d 70 20 74 79 70 65 20 28 76 61 6c 31 20 76 61  mp type (val1 va
0410: 6c 32 20 2e 2e 2e 29 0a 3b 3b 20 74 79 70 65 3a  l2 ...).;; type:
0420: 20 6d 65 74 61 2d 69 6e 66 6f 2c 20 73 74 65 70   meta-info, step
0430: 0a 28 64 65 66 69 6e 65 20 2a 69 6e 63 6f 6d 69  .(define *incomi
0440: 6e 67 2d 64 61 74 61 2a 20 20 20 20 20 20 27 28  ng-data*      '(
0450: 29 29 0a 28 64 65 66 69 6e 65 20 2a 69 6e 63 6f  )).(define *inco
0460: 6d 69 6e 67 2d 6c 61 73 74 2d 74 69 6d 65 2a 20  ming-last-time* 
0470: 28 63 75 72 72 65 6e 74 2d 73 65 63 6f 6e 64 73  (current-seconds
0480: 29 29 0a 28 64 65 66 69 6e 65 20 2a 69 6e 63 6f  )).(define *inco
0490: 6d 69 6e 67 2d 6d 75 74 65 78 2a 20 20 20 20 20  ming-mutex*     
04a0: 28 6d 61 6b 65 2d 6d 75 74 65 78 29 29 0a 28 64  (make-mutex)).(d
04b0: 65 66 69 6e 65 20 2a 63 61 63 68 65 2d 6f 6e 2a  efine *cache-on*
04c0: 20 23 66 29 0a 0a 28 64 65 66 69 6e 65 20 28 6f   #f)..(define (o
04d0: 70 65 6e 2d 64 62 29 20 3b 3b 20 20 28 63 6f 6e  pen-db) ;;  (con
04e0: 63 20 2a 74 6f 70 70 61 74 68 2a 20 22 2f 6d 65  c *toppath* "/me
04f0: 67 61 74 65 73 74 2e 64 62 22 29 20 28 63 61 72  gatest.db") (car
0500: 20 2a 63 6f 6e 66 69 67 69 6e 66 6f 2a 29 29 29   *configinfo*)))
0510: 0a 20 20 28 6c 65 74 2a 20 28 28 64 62 70 61 74  .  (let* ((dbpat
0520: 68 20 20 20 20 28 63 6f 6e 63 20 2a 74 6f 70 70  h    (conc *topp
0530: 61 74 68 2a 20 22 2f 6d 65 67 61 74 65 73 74 2e  ath* "/megatest.
0540: 64 62 22 29 29 20 3b 3b 20 66 6e 61 6d 65 29 0a  db")) ;; fname).
0550: 09 20 28 64 62 65 78 69 73 74 73 20 20 28 66 69  . (dbexists  (fi
0560: 6c 65 2d 65 78 69 73 74 73 3f 20 64 62 70 61 74  le-exists? dbpat
0570: 68 29 29 0a 09 20 28 64 62 20 20 20 20 20 20 20  h)).. (db       
0580: 20 28 73 71 6c 69 74 65 33 3a 6f 70 65 6e 2d 64   (sqlite3:open-d
0590: 61 74 61 62 61 73 65 20 64 62 70 61 74 68 29 29  atabase dbpath))
05a0: 20 3b 3b 20 28 6e 65 76 65 72 2d 67 69 76 65 2d   ;; (never-give-
05b0: 75 70 2d 6f 70 65 6e 2d 64 62 20 64 62 70 61 74  up-open-db dbpat
05c0: 68 29 29 0a 09 20 28 68 61 6e 64 6c 65 72 20 20  h)).. (handler  
05d0: 20 28 6d 61 6b 65 2d 62 75 73 79 2d 74 69 6d 65   (make-busy-time
05e0: 6f 75 74 20 28 69 66 20 28 61 72 67 73 3a 67 65  out (if (args:ge
05f0: 74 2d 61 72 67 20 22 2d 6f 76 65 72 72 69 64 65  t-arg "-override
0600: 2d 74 69 6d 65 6f 75 74 22 29 0a 09 09 09 09 09  -timeout")......
0610: 20 20 20 28 73 74 72 69 6e 67 2d 3e 6e 75 6d 62     (string->numb
0620: 65 72 20 28 61 72 67 73 3a 67 65 74 2d 61 72 67  er (args:get-arg
0630: 20 22 2d 6f 76 65 72 72 69 64 65 2d 74 69 6d 65   "-override-time
0640: 6f 75 74 22 29 29 0a 09 09 09 09 09 20 20 20 33  out"))......   3
0650: 36 30 30 30 29 29 29 29 20 3b 3b 20 31 33 36 30  6000)))) ;; 1360
0660: 30 30 29 29 29 0a 20 20 20 20 28 73 71 6c 69 74  00))).    (sqlit
0670: 65 33 3a 73 65 74 2d 62 75 73 79 2d 68 61 6e 64  e3:set-busy-hand
0680: 6c 65 72 21 20 64 62 20 68 61 6e 64 6c 65 72 29  ler! db handler)
0690: 0a 20 20 20 20 28 69 66 20 28 6e 6f 74 20 64 62  .    (if (not db
06a0: 65 78 69 73 74 73 29 0a 09 28 64 62 3a 69 6e 69  exists)..(db:ini
06b0: 74 69 61 6c 69 7a 65 20 64 62 29 29 0a 20 20 20  tialize db)).   
06c0: 20 64 62 29 29 0a 0a 28 64 65 66 69 6e 65 20 28   db))..(define (
06d0: 64 62 3a 69 6e 69 74 69 61 6c 69 7a 65 20 64 62  db:initialize db
06e0: 29 0a 20 20 28 6c 65 74 2a 20 28 28 63 6f 6e 66  ).  (let* ((conf
06f0: 69 67 64 61 74 20 28 63 61 72 20 2a 63 6f 6e 66  igdat (car *conf
0700: 69 67 69 6e 66 6f 2a 29 29 20 20 3b 3b 20 74 75  iginfo*))  ;; tu
0710: 74 20 74 75 74 2c 20 67 6c 6f 62 61 6c 20 77 61  t tut, global wa
0720: 72 6e 69 6e 67 2e 2e 2e 0a 09 20 28 6b 65 79 73  rning..... (keys
0730: 20 20 20 20 20 28 63 6f 6e 66 69 67 2d 67 65 74       (config-get
0740: 2d 66 69 65 6c 64 73 20 63 6f 6e 66 69 67 64 61  -fields configda
0750: 74 29 29 0a 09 20 28 68 61 76 65 6b 65 79 73 20  t)).. (havekeys 
0760: 28 3e 20 28 6c 65 6e 67 74 68 20 6b 65 79 73 29  (> (length keys)
0770: 20 30 29 29 0a 09 20 28 6b 65 79 73 74 72 20 20   0)).. (keystr  
0780: 20 28 6b 65 79 73 2d 3e 6b 65 79 73 74 72 20 6b   (keys->keystr k
0790: 65 79 73 29 29 0a 09 20 28 66 69 65 6c 64 73 74  eys)).. (fieldst
07a0: 72 20 28 6b 65 79 73 2d 3e 6b 65 79 2f 66 69 65  r (keys->key/fie
07b0: 6c 64 20 6b 65 79 73 29 29 29 0a 20 20 20 20 28  ld keys))).    (
07c0: 66 6f 72 2d 65 61 63 68 20 28 6c 61 6d 62 64 61  for-each (lambda
07d0: 20 28 6b 65 79 29 0a 09 09 28 6c 65 74 20 28 28   (key)...(let ((
07e0: 6b 65 79 6e 20 28 76 65 63 74 6f 72 2d 72 65 66  keyn (vector-ref
07f0: 20 6b 65 79 20 30 29 29 29 0a 09 09 20 20 28 69   key 0)))...  (i
0800: 66 20 28 6d 65 6d 62 65 72 20 28 73 74 72 69 6e  f (member (strin
0810: 67 2d 64 6f 77 6e 63 61 73 65 20 6b 65 79 6e 29  g-downcase keyn)
0820: 0a 09 09 09 20 20 20 20 20 20 28 6c 69 73 74 20  ....      (list 
0830: 22 72 75 6e 6e 61 6d 65 22 20 22 73 74 61 74 65  "runname" "state
0840: 22 20 22 73 74 61 74 75 73 22 20 22 6f 77 6e 65  " "status" "owne
0850: 72 22 20 22 65 76 65 6e 74 5f 74 69 6d 65 22 20  r" "event_time" 
0860: 22 63 6f 6d 6d 65 6e 74 22 20 22 66 61 69 6c 5f  "comment" "fail_
0870: 63 6f 75 6e 74 22 0a 09 09 09 09 20 20 20 20 22  count".....    "
0880: 70 61 73 73 5f 63 6f 75 6e 74 22 29 29 0a 09 09  pass_count"))...
0890: 20 20 20 20 20 20 28 62 65 67 69 6e 0a 09 09 09        (begin....
08a0: 28 70 72 69 6e 74 20 22 45 52 52 4f 52 3a 20 79  (print "ERROR: y
08b0: 6f 75 72 20 6b 65 79 20 63 61 6e 6e 6f 74 20 62  our key cannot b
08c0: 65 20 6e 61 6d 65 64 20 22 20 6b 65 79 6e 20 22  e named " keyn "
08d0: 20 61 73 20 74 68 69 73 20 63 6f 6e 66 6c 69 63   as this conflic
08e0: 74 73 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ts with the same
08f0: 20 6e 61 6d 65 64 20 66 69 65 6c 64 20 69 6e 20   named field in 
0900: 74 68 65 20 72 75 6e 73 20 74 61 62 6c 65 22 29  the runs table")
0910: 0a 09 09 09 28 73 79 73 74 65 6d 20 28 63 6f 6e  ....(system (con
0920: 63 20 22 72 6d 20 2d 66 20 22 20 64 62 70 61 74  c "rm -f " dbpat
0930: 68 29 29 0a 09 09 09 28 65 78 69 74 20 31 29 29  h))....(exit 1))
0940: 29 29 29 0a 09 20 20 20 20 20 20 6b 65 79 73 29  )))..      keys)
0950: 0a 20 20 20 20 3b 3b 20 28 73 71 6c 69 74 65 33  .    ;; (sqlite3
0960: 3a 65 78 65 63 75 74 65 20 64 62 20 22 50 52 41  :execute db "PRA
0970: 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  GMA synchronous 
0980: 3d 20 4f 46 46 3b 22 29 0a 20 20 20 20 28 73 71  = OFF;").    (sq
0990: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62  lite3:execute db
09a0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49   "CREATE TABLE I
09b0: 46 20 4e 4f 54 20 45 58 49 53 54 53 20 6b 65 79  F NOT EXISTS key
09c0: 73 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52  s (id INTEGER PR
09d0: 49 4d 41 52 59 20 4b 45 59 2c 20 66 69 65 6c 64  IMARY KEY, field
09e0: 6e 61 6d 65 20 54 45 58 54 2c 20 66 69 65 6c 64  name TEXT, field
09f0: 74 79 70 65 20 54 45 58 54 2c 20 43 4f 4e 53 54  type TEXT, CONST
0a00: 52 41 49 4e 54 20 6b 65 79 63 6f 6e 73 74 72 61  RAINT keyconstra
0a10: 69 6e 74 20 55 4e 49 51 55 45 20 28 66 69 65 6c  int UNIQUE (fiel
0a20: 64 6e 61 6d 65 29 29 3b 22 29 0a 20 20 20 20 28  dname));").    (
0a30: 66 6f 72 2d 65 61 63 68 20 28 6c 61 6d 62 64 61  for-each (lambda
0a40: 20 28 6b 65 79 29 0a 09 09 28 73 71 6c 69 74 65   (key)...(sqlite
0a50: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 49 4e  3:execute db "IN
0a60: 53 45 52 54 20 49 4e 54 4f 20 6b 65 79 73 20 28  SERT INTO keys (
0a70: 66 69 65 6c 64 6e 61 6d 65 2c 66 69 65 6c 64 74  fieldname,fieldt
0a80: 79 70 65 29 20 56 41 4c 55 45 53 20 28 3f 2c 3f  ype) VALUES (?,?
0a90: 29 3b 22 20 28 6b 65 79 3a 67 65 74 2d 66 69 65  );" (key:get-fie
0aa0: 6c 64 6e 61 6d 65 20 6b 65 79 29 28 6b 65 79 3a  ldname key)(key:
0ab0: 67 65 74 2d 66 69 65 6c 64 74 79 70 65 20 6b 65  get-fieldtype ke
0ac0: 79 29 29 29 0a 09 20 20 20 20 20 20 6b 65 79 73  y)))..      keys
0ad0: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65  ).    (sqlite3:e
0ae0: 78 65 63 75 74 65 20 64 62 20 28 63 6f 6e 63 20  xecute db (conc 
0af0: 0a 09 09 09 20 22 43 52 45 41 54 45 20 54 41 42  .... "CREATE TAB
0b00: 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53  LE IF NOT EXISTS
0b10: 20 72 75 6e 73 20 28 69 64 20 49 4e 54 45 47 45   runs (id INTEGE
0b20: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 22  R PRIMARY KEY, "
0b30: 20 0a 09 09 09 20 66 69 65 6c 64 73 74 72 20 28   .... fieldstr (
0b40: 69 66 20 68 61 76 65 6b 65 79 73 20 22 2c 22 20  if havekeys "," 
0b50: 22 22 29 0a 09 09 09 20 22 72 75 6e 6e 61 6d 65  "").... "runname
0b60: 20 54 45 58 54 2c 22 0a 09 09 09 20 22 73 74 61   TEXT,".... "sta
0b70: 74 65 20 54 45 58 54 20 44 45 46 41 55 4c 54 20  te TEXT DEFAULT 
0b80: 27 27 2c 22 0a 09 09 09 20 22 73 74 61 74 75 73  '',".... "status
0b90: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27   TEXT DEFAULT ''
0ba0: 2c 22 0a 09 09 09 20 22 6f 77 6e 65 72 20 54 45  ,".... "owner TE
0bb0: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 22 0a  XT DEFAULT '',".
0bc0: 09 09 09 20 22 65 76 65 6e 74 5f 74 69 6d 65 20  ... "event_time 
0bd0: 54 49 4d 45 53 54 41 4d 50 2c 22 0a 09 09 09 20  TIMESTAMP,".... 
0be0: 22 63 6f 6d 6d 65 6e 74 20 54 45 58 54 20 44 45  "comment TEXT DE
0bf0: 46 41 55 4c 54 20 27 27 2c 22 0a 09 09 09 20 22  FAULT '',".... "
0c00: 66 61 69 6c 5f 63 6f 75 6e 74 20 49 4e 54 45 47  fail_count INTEG
0c10: 45 52 20 44 45 46 41 55 4c 54 20 30 2c 22 0a 09  ER DEFAULT 0,"..
0c20: 09 09 20 22 70 61 73 73 5f 63 6f 75 6e 74 20 49  .. "pass_count I
0c30: 4e 54 45 47 45 52 20 44 45 46 41 55 4c 54 20 30  NTEGER DEFAULT 0
0c40: 2c 22 0a 09 09 09 20 22 43 4f 4e 53 54 52 41 49  ,".... "CONSTRAI
0c50: 4e 54 20 72 75 6e 73 63 6f 6e 73 74 72 61 69 6e  NT runsconstrain
0c60: 74 20 55 4e 49 51 55 45 20 28 72 75 6e 6e 61 6d  t UNIQUE (runnam
0c70: 65 22 20 28 69 66 20 68 61 76 65 6b 65 79 73 20  e" (if havekeys 
0c80: 22 2c 22 20 22 22 29 20 6b 65 79 73 74 72 20 22  "," "") keystr "
0c90: 29 29 3b 22 29 29 0a 20 20 20 20 28 73 71 6c 69  ));")).    (sqli
0ca0: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 28  te3:execute db (
0cb0: 63 6f 6e 63 20 22 43 52 45 41 54 45 20 49 4e 44  conc "CREATE IND
0cc0: 45 58 20 72 75 6e 73 5f 69 6e 64 65 78 20 4f 4e  EX runs_index ON
0cd0: 20 72 75 6e 73 20 28 72 75 6e 6e 61 6d 65 22 20   runs (runname" 
0ce0: 28 69 66 20 68 61 76 65 6b 65 79 73 20 22 2c 22  (if havekeys ","
0cf0: 20 22 22 29 20 6b 65 79 73 74 72 20 22 29 3b 22   "") keystr ");"
0d00: 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a  )).    (sqlite3:
0d10: 65 78 65 63 75 74 65 20 64 62 20 0a 09 09 20 20  execute db ...  
0d20: 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
0d30: 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 74   IF NOT EXISTS t
0d40: 65 73 74 73 20 0a 20 20 20 20 20 20 20 20 20 20  ests .          
0d50: 20 20 20 20 20 20 20 20 20 20 28 69 64 20 49 4e            (id IN
0d60: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
0d70: 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y,.             
0d80: 20 20 20 20 20 20 20 20 72 75 6e 5f 69 64 20 20          run_id  
0d90: 20 20 20 49 4e 54 45 47 45 52 2c 0a 20 20 20 20     INTEGER,.    
0da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0db0: 20 74 65 73 74 6e 61 6d 65 20 20 20 54 45 58 54   testname   TEXT
0dc0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
0dd0: 20 20 20 20 20 20 20 68 6f 73 74 20 20 20 20 20         host     
0de0: 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27    TEXT DEFAULT '
0df0: 6e 2f 61 27 2c 0a 20 20 20 20 20 20 20 20 20 20  n/a',.          
0e00: 20 20 20 20 20 20 20 20 20 20 20 63 70 75 6c 6f             cpulo
0e10: 61 64 20 20 20 20 52 45 41 4c 20 44 45 46 41 55  ad    REAL DEFAU
0e20: 4c 54 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20  LT -1,.         
0e30: 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 6b              disk
0e40: 66 72 65 65 20 20 20 49 4e 54 45 47 45 52 20 44  free   INTEGER D
0e50: 45 46 41 55 4c 54 20 2d 31 2c 0a 20 20 20 20 20  EFAULT -1,.     
0e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e70: 75 6e 61 6d 65 20 20 20 20 20 20 54 45 58 54 20  uname      TEXT 
0e80: 44 45 46 41 55 4c 54 20 27 6e 2f 61 27 2c 20 0a  DEFAULT 'n/a', .
0e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ea0: 20 20 20 20 20 72 75 6e 64 69 72 20 20 20 20 20       rundir     
0eb0: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 6e 2f  TEXT DEFAULT 'n/
0ec0: 61 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  a',.            
0ed0: 20 20 20 20 20 20 20 20 20 73 68 6f 72 74 64 69           shortdi
0ee0: 72 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54  r   TEXT DEFAULT
0ef0: 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20   '',.           
0f00: 20 20 20 20 20 20 20 20 20 20 69 74 65 6d 5f 70            item_p
0f10: 61 74 68 20 20 54 45 58 54 20 44 45 46 41 55 4c  ath  TEXT DEFAUL
0f20: 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20  T '',.          
0f30: 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65             state
0f40: 20 20 20 20 20 20 54 45 58 54 20 44 45 46 41 55        TEXT DEFAU
0f50: 4c 54 20 27 4e 4f 54 5f 53 54 41 52 54 45 44 27  LT 'NOT_STARTED'
0f60: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
0f70: 20 20 20 20 20 20 20 73 74 61 74 75 73 20 20 20         status   
0f80: 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27    TEXT DEFAULT '
0f90: 46 41 49 4c 27 2c 0a 20 20 20 20 20 20 20 20 20  FAIL',.         
0fa0: 20 20 20 20 20 20 20 20 20 20 20 20 61 74 74 65              atte
0fb0: 6d 70 74 6e 75 6d 20 49 4e 54 45 47 45 52 20 44  mptnum INTEGER D
0fc0: 45 46 41 55 4c 54 20 30 2c 0a 20 20 20 20 20 20  EFAULT 0,.      
0fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
0fe0: 69 6e 61 6c 5f 6c 6f 67 66 20 54 45 58 54 20 44  inal_logf TEXT D
0ff0: 45 46 41 55 4c 54 20 27 6c 6f 67 73 2f 66 69 6e  EFAULT 'logs/fin
1000: 61 6c 2e 6c 6f 67 27 2c 0a 20 20 20 20 20 20 20  al.log',.       
1010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f                lo
1020: 67 64 61 74 20 20 20 20 20 42 4c 4f 42 2c 20 0a  gdat     BLOB, .
1030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1040: 20 20 20 20 20 72 75 6e 5f 64 75 72 61 74 69 6f       run_duratio
1050: 6e 20 49 4e 54 45 47 45 52 20 44 45 46 41 55 4c  n INTEGER DEFAUL
1060: 54 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  T 0,.           
1070: 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 65 6e            commen
1080: 74 20 20 20 20 54 45 58 54 20 44 45 46 41 55 4c  t    TEXT DEFAUL
1090: 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20  T '',.          
10a0: 20 20 20 20 20 20 20 20 20 20 20 65 76 65 6e 74             event
10b0: 5f 74 69 6d 65 20 54 49 4d 45 53 54 41 4d 50 2c  _time TIMESTAMP,
10c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10d0: 20 20 20 20 20 20 66 61 69 6c 5f 63 6f 75 6e 74        fail_count
10e0: 20 49 4e 54 45 47 45 52 20 44 45 46 41 55 4c 54   INTEGER DEFAULT
10f0: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1100: 20 20 20 20 20 20 20 20 20 70 61 73 73 5f 63 6f           pass_co
1110: 75 6e 74 20 49 4e 54 45 47 45 52 20 44 45 46 41  unt INTEGER DEFA
1120: 55 4c 54 20 30 2c 0a 20 20 20 20 20 20 20 20 20  ULT 0,.         
1130: 20 20 20 20 20 20 20 20 20 20 20 20 61 72 63 68              arch
1140: 69 76 65 64 20 20 20 49 4e 54 45 47 45 52 20 44  ived   INTEGER D
1150: 45 46 41 55 4c 54 20 30 2c 20 2d 2d 20 30 3d 6e  EFAULT 0, -- 0=n
1160: 6f 2c 20 31 3d 69 6e 20 70 72 6f 67 72 65 73 73  o, 1=in progress
1170: 2c 20 32 3d 79 65 73 0a 20 20 20 20 20 20 20 20  , 2=yes.        
1180: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e               CON
1190: 53 54 52 41 49 4e 54 20 74 65 73 74 73 63 6f 6e  STRAINT testscon
11a0: 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28  straint UNIQUE (
11b0: 72 75 6e 5f 69 64 2c 20 74 65 73 74 6e 61 6d 65  run_id, testname
11c0: 2c 20 69 74 65 6d 5f 70 61 74 68 29 0a 20 20 20  , item_path).   
11d0: 20 20 20 20 20 20 20 29 3b 22 29 0a 20 20 20 20         );").    
11e0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
11f0: 20 64 62 20 22 43 52 45 41 54 45 20 49 4e 44 45   db "CREATE INDE
1200: 58 20 74 65 73 74 73 5f 69 6e 64 65 78 20 4f 4e  X tests_index ON
1210: 20 74 65 73 74 73 20 28 72 75 6e 5f 69 64 2c 20   tests (run_id, 
1220: 74 65 73 74 6e 61 6d 65 2c 20 69 74 65 6d 5f 70  testname, item_p
1230: 61 74 68 29 3b 22 29 0a 20 20 20 20 28 73 71 6c  ath);").    (sql
1240: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
1250: 22 43 52 45 41 54 45 20 56 49 45 57 20 72 75 6e  "CREATE VIEW run
1260: 73 5f 74 65 73 74 73 20 41 53 20 53 45 4c 45 43  s_tests AS SELEC
1270: 54 20 2a 20 46 52 4f 4d 20 72 75 6e 73 20 49 4e  T * FROM runs IN
1280: 4e 45 52 20 4a 4f 49 4e 20 74 65 73 74 73 20 4f  NER JOIN tests O
1290: 4e 20 72 75 6e 73 2e 69 64 3d 74 65 73 74 73 2e  N runs.id=tests.
12a0: 72 75 6e 5f 69 64 3b 22 29 0a 20 20 20 20 28 73  run_id;").    (s
12b0: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64  qlite3:execute d
12c0: 62 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  b "CREATE TABLE 
12d0: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 74 65  IF NOT EXISTS te
12e0: 73 74 5f 73 74 65 70 73 20 0a 20 20 20 20 20 20  st_steps .      
12f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1300: 20 20 20 20 20 20 20 20 28 69 64 20 49 4e 54 45          (id INTE
1310: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
1320: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1340: 74 65 73 74 5f 69 64 20 49 4e 54 45 47 45 52 2c  test_id INTEGER,
1350: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1370: 20 73 74 65 70 6e 61 6d 65 20 54 45 58 54 2c 20   stepname TEXT, 
1380: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a0: 73 74 61 74 65 20 54 45 58 54 20 44 45 46 41 55  state TEXT DEFAU
13b0: 4c 54 20 27 4e 4f 54 5f 53 54 41 52 54 45 44 27  LT 'NOT_STARTED'
13c0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 73 74 61 74 75 73 20 54 45 58 54 20 44 45    status TEXT DE
13f0: 46 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20 20 20  FAULT 'n/a',.   
1400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1410: 20 20 20 20 20 20 20 20 20 20 20 20 65 76 65 6e              even
1420: 74 5f 74 69 6d 65 20 54 49 4d 45 53 54 41 4d 50  t_time TIMESTAMP
1430: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1450: 20 63 6f 6d 6d 65 6e 74 20 54 45 58 54 20 44 45   comment TEXT DE
1460: 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20  FAULT '',.      
1470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1480: 20 20 20 20 20 20 20 20 20 6c 6f 67 66 69 6c 65           logfile
1490: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27   TEXT DEFAULT ''
14a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c0: 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 65 73 74   CONSTRAINT test
14d0: 5f 73 74 65 70 73 5f 63 6f 6e 73 74 72 61 69 6e  _steps_constrain
14e0: 74 20 55 4e 49 51 55 45 20 28 74 65 73 74 5f 69  t UNIQUE (test_i
14f0: 64 2c 73 74 65 70 6e 61 6d 65 2c 73 74 61 74 65  d,stepname,state
1500: 29 29 3b 22 29 0a 20 20 20 20 28 73 71 6c 69 74  ));").    (sqlit
1510: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 43  e3:execute db "C
1520: 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e  REATE TABLE IF N
1530: 4f 54 20 45 58 49 53 54 53 20 65 78 74 72 61 64  OT EXISTS extrad
1540: 61 74 20 28 69 64 20 49 4e 54 45 47 45 52 20 50  at (id INTEGER P
1550: 52 49 4d 41 52 59 20 4b 45 59 2c 20 72 75 6e 5f  RIMARY KEY, run_
1560: 69 64 20 49 4e 54 45 47 45 52 2c 20 6b 65 79 20  id INTEGER, key 
1570: 54 45 58 54 2c 20 76 61 6c 20 54 45 58 54 29 3b  TEXT, val TEXT);
1580: 22 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a  ").    (sqlite3:
1590: 65 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41  execute db "CREA
15a0: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  TE TABLE IF NOT 
15b0: 45 58 49 53 54 53 20 6d 65 74 61 64 61 74 20 28  EXISTS metadat (
15c0: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  id INTEGER PRIMA
15d0: 52 59 20 4b 45 59 2c 20 76 61 72 20 54 45 58 54  RY KEY, var TEXT
15e0: 2c 20 76 61 6c 20 54 45 58 54 2c 0a 20 20 20 20  , val TEXT,.    
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 4f                CO
1610: 4e 53 54 52 41 49 4e 54 20 6d 65 74 61 64 61 74  NSTRAINT metadat
1620: 5f 63 6f 6e 73 74 72 61 69 6e 74 20 55 4e 49 51  _constraint UNIQ
1630: 55 45 20 28 76 61 72 29 29 3b 22 29 0a 20 20 20  UE (var));").   
1640: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
1650: 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41 42  e db "CREATE TAB
1660: 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53  LE IF NOT EXISTS
1670: 20 61 63 63 65 73 73 5f 6c 6f 67 20 28 69 64 20   access_log (id 
1680: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
1690: 4b 45 59 2c 20 75 73 65 72 20 54 45 58 54 2c 20  KEY, user TEXT, 
16a0: 61 63 63 65 73 73 65 64 20 54 49 4d 45 53 54 41  accessed TIMESTA
16b0: 4d 50 2c 20 61 72 67 73 20 54 45 58 54 29 3b 22  MP, args TEXT);"
16c0: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65  ).    (sqlite3:e
16d0: 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 54  xecute db "CREAT
16e0: 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
16f0: 58 49 53 54 53 20 74 65 73 74 5f 6d 65 74 61 20  XISTS test_meta 
1700: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d  (id INTEGER PRIM
1710: 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 20 20  ARY KEY,.       
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
1740: 73 74 6e 61 6d 65 20 20 20 20 54 45 58 54 20 44  stname    TEXT D
1750: 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20  EFAULT '',.     
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1780: 61 75 74 68 6f 72 20 20 20 20 20 20 54 45 58 54  author      TEXT
1790: 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20   DEFAULT '',.   
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c0: 20 20 6f 77 6e 65 72 20 20 20 20 20 20 20 54 45    owner       TE
17d0: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20  XT DEFAULT '',. 
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1800: 20 20 20 20 64 65 73 63 72 69 70 74 69 6f 6e 20      description 
1810: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c  TEXT DEFAULT '',
1820: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1840: 20 20 20 20 20 20 72 65 76 69 65 77 65 64 20 20        reviewed  
1850: 20 20 54 49 4d 45 53 54 41 4d 50 2c 0a 20 20 20    TIMESTAMP,.   
1860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1880: 20 20 69 74 65 72 61 74 65 64 20 20 20 20 54 45    iterated    TE
1890: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20  XT DEFAULT '',. 
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c0: 20 20 20 20 61 76 67 5f 72 75 6e 74 69 6d 65 20      avg_runtime 
18d0: 52 45 41 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  REAL,.          
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f0: 20 20 20 20 20 20 20 20 20 20 20 61 76 67 5f 64             avg_d
1900: 69 73 6b 20 20 20 20 52 45 41 4c 2c 0a 20 20 20  isk    REAL,.   
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1930: 20 20 74 61 67 73 20 20 20 20 20 20 20 20 54 45    tags        TE
1940: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20  XT DEFAULT '',. 
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1970: 20 20 20 20 6a 6f 62 67 72 6f 75 70 20 20 20 20      jobgroup    
1980: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 64 65  TEXT DEFAULT 'de
1990: 66 61 75 6c 74 27 2c 0a 20 20 20 20 20 20 20 20  fault',.        
19a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b0: 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52 41 49          CONSTRAI
19c0: 4e 54 20 74 65 73 74 5f 6d 65 74 61 5f 63 6f 6e  NT test_meta_con
19d0: 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28  straint UNIQUE (
19e0: 74 65 73 74 6e 61 6d 65 29 29 3b 22 29 0a 20 20  testname));").  
19f0: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
1a00: 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41  te db "CREATE TA
1a10: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54  BLE IF NOT EXIST
1a20: 53 20 74 65 73 74 5f 64 61 74 61 20 28 69 64 20  S test_data (id 
1a30: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
1a40: 4b 45 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20  KEY,.           
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a60: 20 20 20 20 20 74 65 73 74 5f 69 64 20 49 4e 54       test_id INT
1a70: 45 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20  EGER,.          
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 20 20 20 20 20 20 63 61 74 65 67 6f 72 79 20 54        category T
1aa0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a  EXT DEFAULT '',.
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad0: 76 61 72 69 61 62 6c 65 20 54 45 58 54 2c 0a 09  variable TEXT,..
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af0: 20 20 20 20 20 20 20 20 76 61 6c 75 65 20 52 45          value RE
1b00: 41 4c 2c 0a 09 20 20 20 20 20 20 20 20 20 20 20  AL,..           
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70               exp
1b20: 65 63 74 65 64 20 52 45 41 4c 2c 0a 09 20 20 20  ected REAL,..   
1b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b40: 20 20 20 20 20 74 6f 6c 20 52 45 41 4c 2c 0a 20       tol REAL,. 
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75                 u
1b70: 6e 69 74 73 20 54 45 58 54 2c 0a 20 20 20 20 20  nits TEXT,.     
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 65             comme
1ba0: 6e 74 20 54 45 58 54 20 44 45 46 41 55 4c 54 20  nt TEXT DEFAULT 
1bb0: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '',.            
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd0: 20 20 20 20 73 74 61 74 75 73 20 54 45 58 54 20      status TEXT 
1be0: 44 45 46 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20  DEFAULT 'n/a',. 
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1c10: 79 70 65 20 54 45 58 54 20 44 45 46 41 55 4c 54  ype TEXT DEFAULT
1c20: 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20   '',.           
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 65     CONSTRAINT te
1c50: 73 74 5f 64 61 74 61 5f 63 6f 6e 73 74 72 61 69  st_data_constrai
1c60: 6e 74 20 55 4e 49 51 55 45 20 28 74 65 73 74 5f  nt UNIQUE (test_
1c70: 69 64 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 69  id,category,vari
1c80: 61 62 6c 65 29 29 3b 22 29 0a 20 20 20 20 3b 3b  able));").    ;;
1c90: 20 4d 75 73 74 20 64 6f 20 74 68 69 73 20 2a 61   Must do this *a
1ca0: 66 74 65 72 2a 20 72 75 6e 6e 69 6e 67 20 70 61  fter* running pa
1cb0: 74 63 68 20 64 62 20 21 21 20 4e 6f 20 6d 6f 72  tch db !! No mor
1cc0: 65 2e 20 0a 20 20 20 20 28 64 62 3a 73 65 74 2d  e. .    (db:set-
1cd0: 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 53 54  var db "MEGATEST
1ce0: 5f 56 45 52 53 49 4f 4e 22 20 6d 65 67 61 74 65  _VERSION" megate
1cf0: 73 74 2d 76 65 72 73 69 6f 6e 29 0a 20 20 20 20  st-version).    
1d00: 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ))..;;==========
1d10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1d20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1d30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1d40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20  ============.;; 
1d50: 54 4f 44 4f 3a 0a 3b 3b 20 20 20 70 75 74 20 64  TODO:.;;   put d
1d60: 65 6c 74 61 73 20 69 6e 74 6f 20 61 6e 20 61 73  eltas into an as
1d70: 73 6f 63 20 6c 69 73 74 20 77 69 74 68 20 76 65  soc list with ve
1d80: 72 73 69 6f 6e 20 6e 75 6d 62 65 72 73 0a 3b 3b  rsion numbers.;;
1d90: 20 20 20 61 70 70 6c 79 20 61 6c 6c 20 66 72 6f     apply all fro
1da0: 6d 20 6c 61 73 74 20 74 6f 20 63 75 72 72 65 6e  m last to curren
1db0: 74 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  t.;;============
1dc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1dd0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1de0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1df0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 28 64 65 66 69  ==========.(defi
1e00: 6e 65 20 28 70 61 74 63 68 2d 64 62 20 64 62 29  ne (patch-db db)
1e10: 0a 20 20 28 68 61 6e 64 6c 65 2d 65 78 63 65 70  .  (handle-excep
1e20: 74 69 6f 6e 73 0a 20 20 20 65 78 6e 0a 20 20 20  tions.   exn.   
1e30: 28 62 65 67 69 6e 0a 20 20 20 20 20 28 70 72 69  (begin.     (pri
1e40: 6e 74 20 22 45 78 63 65 70 74 69 6f 6e 3a 20 22  nt "Exception: "
1e50: 20 65 78 6e 29 0a 20 20 20 20 20 28 70 72 69 6e   exn).     (prin
1e60: 74 20 22 45 52 52 4f 52 3a 20 50 6f 73 73 69 62  t "ERROR: Possib
1e70: 6c 65 20 6f 75 74 20 6f 66 20 64 61 74 65 20 73  le out of date s
1e80: 63 68 65 6d 61 2c 20 61 74 74 65 6d 70 74 69 6e  chema, attemptin
1e90: 67 20 74 6f 20 61 64 64 20 74 61 62 6c 65 20 6d  g to add table m
1ea0: 65 74 61 64 61 74 61 2e 2e 2e 22 29 0a 20 20 20  etadata...").   
1eb0: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
1ec0: 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41  te db "CREATE TA
1ed0: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54  BLE IF NOT EXIST
1ee0: 53 20 6d 65 74 61 64 61 74 20 28 69 64 20 49 4e  S metadat (id IN
1ef0: 54 45 47 45 52 2c 20 76 61 72 20 54 45 58 54 2c  TEGER, var TEXT,
1f00: 20 76 61 6c 20 54 45 58 54 2c 0a 20 20 20 20 20   val TEXT,.     
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f20: 20 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e 53              CONS
1f30: 54 52 41 49 4e 54 20 6d 65 74 61 64 61 74 5f 63  TRAINT metadat_c
1f40: 6f 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45  onstraint UNIQUE
1f50: 20 28 76 61 72 29 29 3b 22 29 0a 20 20 20 20 20   (var));").     
1f60: 28 69 66 20 28 6e 6f 74 20 28 64 62 3a 67 65 74  (if (not (db:get
1f70: 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 53  -var db "MEGATES
1f80: 54 5f 56 45 52 53 49 4f 4e 22 29 29 0a 09 20 28  T_VERSION")).. (
1f90: 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d  db:set-var db "M
1fa0: 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22  EGATEST_VERSION"
1fb0: 20 31 2e 31 37 29 29 29 0a 20 20 20 28 6c 65 74   1.17))).   (let
1fc0: 20 28 28 6d 76 65 72 20 28 64 62 3a 67 65 74 2d   ((mver (db:get-
1fd0: 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 53 54  var db "MEGATEST
1fe0: 5f 56 45 52 53 49 4f 4e 22 29 29 0a 09 20 28 74  _VERSION")).. (t
1ff0: 65 73 74 2d 6d 65 74 61 2d 64 65 66 20 22 43 52  est-meta-def "CR
2000: 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f  EATE TABLE IF NO
2010: 54 20 45 58 49 53 54 53 20 74 65 73 74 5f 6d 65  T EXISTS test_me
2020: 74 61 20 28 69 64 20 49 4e 54 45 47 45 52 20 50  ta (id INTEGER P
2030: 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20  RIMARY KEY,.    
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2060: 20 74 65 73 74 6e 61 6d 65 20 20 20 20 54 45 58   testname    TEX
2070: 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20  T DEFAULT '',.  
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a0: 20 20 20 61 75 74 68 6f 72 20 20 20 20 20 20 54     author      T
20b0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a  EXT DEFAULT '',.
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e0: 20 20 20 20 20 6f 77 6e 65 72 20 20 20 20 20 20       owner      
20f0: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27   TEXT DEFAULT ''
2100: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2120: 20 20 20 20 20 20 20 64 65 73 63 72 69 70 74 69         descripti
2130: 6f 6e 20 54 45 58 54 20 44 45 46 41 55 4c 54 20  on TEXT DEFAULT 
2140: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '',.            
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 20 20 20 20 20 20 20 72 65 76 69 65 77 65           reviewe
2170: 64 20 20 20 20 54 49 4d 45 53 54 41 4d 50 2c 0a  d    TIMESTAMP,.
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 20 20 20 69 74 65 72 61 74 65 64 20 20 20       iterated   
21b0: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27   TEXT DEFAULT ''
21c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 20 20 20 20 20 20 20 61 76 67 5f 72 75 6e 74 69         avg_runti
21f0: 6d 65 20 52 45 41 4c 2c 0a 20 20 20 20 20 20 20  me REAL,.       
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 76                av
2220: 67 5f 64 69 73 6b 20 20 20 20 52 45 41 4c 2c 0a  g_disk    REAL,.
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2250: 20 20 20 20 20 74 61 67 73 20 20 20 20 20 20 20       tags       
2260: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27   TEXT DEFAULT ''
2270: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2290: 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 65 73    CONSTRAINT tes
22a0: 74 5f 6d 65 74 61 5f 63 6f 6e 73 74 72 61 69 6e  t_meta_constrain
22b0: 74 20 55 4e 49 51 55 45 20 28 74 65 73 74 6e 61  t UNIQUE (testna
22c0: 6d 65 29 29 3b 22 29 29 0a 20 20 20 20 20 28 70  me));")).     (p
22d0: 72 69 6e 74 20 22 43 75 72 72 65 6e 74 20 73 63  rint "Current sc
22e0: 68 65 6d 61 20 76 65 72 73 69 6f 6e 3a 20 22 20  hema version: " 
22f0: 6d 76 65 72 20 22 20 63 75 72 72 65 6e 74 20 6d  mver " current m
2300: 65 67 61 74 65 73 74 20 76 65 72 73 69 6f 6e 3a  egatest version:
2310: 20 22 20 6d 65 67 61 74 65 73 74 2d 76 65 72 73   " megatest-vers
2320: 69 6f 6e 29 0a 20 20 20 20 20 28 63 6f 6e 64 0a  ion).     (cond.
2330: 20 20 20 20 20 20 28 28 6e 6f 74 20 6d 76 65 72        ((not mver
2340: 29 0a 20 20 20 20 20 20 20 28 70 72 69 6e 74 20  ).       (print 
2350: 22 41 64 64 69 6e 67 20 6d 65 67 61 74 65 73 74  "Adding megatest
2360: 2d 76 65 72 73 69 6f 6e 20 74 6f 20 6d 65 74 61  -version to meta
2370: 64 61 74 61 22 29 20 3b 3b 20 4e 65 65 64 20 74  data") ;; Need t
2380: 6f 20 72 65 63 72 65 61 74 65 20 74 68 65 20 74  o recreate the t
2390: 61 62 6c 65 0a 20 20 20 20 20 20 20 28 73 71 6c  able.       (sql
23a0: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
23b0: 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45  "DROP TABLE IF E
23c0: 58 49 53 54 53 20 6d 65 74 61 64 61 74 3b 22 29  XISTS metadat;")
23d0: 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  .       (sqlite3
23e0: 3a 65 78 65 63 75 74 65 20 64 62 20 22 43 52 45  :execute db "CRE
23f0: 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54  ATE TABLE IF NOT
2400: 20 45 58 49 53 54 53 20 6d 65 74 61 64 61 74 20   EXISTS metadat 
2410: 28 69 64 20 49 4e 54 45 47 45 52 2c 20 76 61 72  (id INTEGER, var
2420: 20 54 45 58 54 2c 20 76 61 6c 20 54 45 58 54 2c   TEXT, val TEXT,
2430: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2450: 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 6d 65     CONSTRAINT me
2460: 74 61 64 61 74 5f 63 6f 6e 73 74 72 61 69 6e 74  tadat_constraint
2470: 20 55 4e 49 51 55 45 20 28 76 61 72 29 29 3b 22   UNIQUE (var));"
2480: 29 0a 20 20 20 20 20 20 20 28 64 62 3a 73 65 74  ).       (db:set
2490: 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 53  -var db "MEGATES
24a0: 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e 31 37 29  T_VERSION" 1.17)
24b0: 0a 20 20 20 20 20 20 20 28 70 61 74 63 68 2d 64  .       (patch-d
24c0: 62 29 29 0a 20 20 20 20 20 20 28 28 3c 20 6d 76  b)).      ((< mv
24d0: 65 72 20 31 2e 32 31 29 0a 20 20 20 20 20 20 20  er 1.21).       
24e0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
24f0: 20 64 62 20 22 44 52 4f 50 20 54 41 42 4c 45 20   db "DROP TABLE 
2500: 49 46 20 45 58 49 53 54 53 20 6d 65 74 61 64 61  IF EXISTS metada
2510: 74 3b 22 29 0a 20 20 20 20 20 20 20 28 73 71 6c  t;").       (sql
2520: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
2530: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46  "CREATE TABLE IF
2540: 20 4e 4f 54 20 45 58 49 53 54 53 20 6d 65 74 61   NOT EXISTS meta
2550: 64 61 74 20 28 69 64 20 49 4e 54 45 47 45 52 2c  dat (id INTEGER,
2560: 20 76 61 72 20 54 45 58 54 2c 20 76 61 6c 20 54   var TEXT, val T
2570: 45 58 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  EXT,.           
2580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2590: 20 20 20 20 20 20 20 43 4f 4e 53 54 52 41 49 4e         CONSTRAIN
25a0: 54 20 6d 65 74 61 64 61 74 5f 63 6f 6e 73 74 72  T metadat_constr
25b0: 61 69 6e 74 20 55 4e 49 51 55 45 20 28 76 61 72  aint UNIQUE (var
25c0: 29 29 3b 22 29 0a 20 20 20 20 20 20 20 28 64 62  ));").       (db
25d0: 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47  :set-var db "MEG
25e0: 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 31  ATEST_VERSION" 1
25f0: 2e 32 31 29 20 3b 3b 20 73 65 74 20 62 65 66 6f  .21) ;; set befo
2600: 72 65 2c 20 6a 75 73 74 20 69 6e 20 63 61 73 65  re, just in case
2610: 20 74 68 65 20 63 68 61 6e 67 65 73 20 61 72 65   the changes are
2620: 20 61 6c 72 65 61 64 79 20 61 70 70 6c 69 65 64   already applied
2630: 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  .       (sqlite3
2640: 3a 65 78 65 63 75 74 65 20 64 62 20 74 65 73 74  :execute db test
2650: 2d 6d 65 74 61 2d 64 65 66 29 0a 09 09 09 09 09  -meta-def)......
2660: 3b 28 66 6f 72 2d 65 61 63 68 20 0a 09 09 09 09  ;(for-each .....
2670: 09 3b 20 28 6c 61 6d 62 64 61 20 28 73 74 6d 74  .; (lambda (stmt
2680: 29 0a 09 09 09 09 09 3b 20 20 20 28 73 71 6c 69  )......;   (sqli
2690: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 73  te3:execute db s
26a0: 74 6d 74 29 29 0a 09 09 09 09 09 3b 20 28 6c 69  tmt))......; (li
26b0: 73 74 20 0a 09 09 09 09 09 3b 20 20 22 41 4c 54  st ......;  "ALT
26c0: 45 52 20 54 41 42 4c 45 20 74 65 73 74 73 20 41  ER TABLE tests A
26d0: 44 44 20 43 4f 4c 55 4d 4e 20 66 69 72 73 74 5f  DD COLUMN first_
26e0: 65 72 72 20 54 45 58 54 3b 22 0a 09 09 09 09 09  err TEXT;"......
26f0: 3b 20 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20  ;  "ALTER TABLE 
2700: 74 65 73 74 73 20 41 44 44 20 43 4f 4c 55 4d 4e  tests ADD COLUMN
2710: 20 66 69 72 73 74 5f 77 61 72 6e 20 54 45 58 54   first_warn TEXT
2720: 3b 22 0a 09 09 09 09 09 3b 20 20 29 29 0a 20 20  ;"......;  )).  
2730: 20 20 20 20 20 28 70 61 74 63 68 2d 64 62 29 29       (patch-db))
2740: 0a 20 20 20 20 20 20 28 28 3c 20 6d 76 65 72 20  .      ((< mver 
2750: 31 2e 32 34 29 0a 20 20 20 20 20 20 20 28 64 62  1.24).       (db
2760: 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47  :set-var db "MEG
2770: 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 31  ATEST_VERSION" 1
2780: 2e 32 34 29 0a 20 20 20 20 20 20 20 28 73 71 6c  .24).       (sql
2790: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
27a0: 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45  "DROP TABLE IF E
27b0: 58 49 53 54 53 20 74 65 73 74 5f 64 61 74 61 3b  XISTS test_data;
27c0: 22 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74  ").       (sqlit
27d0: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 44  e3:execute db "D
27e0: 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49  ROP TABLE IF EXI
27f0: 53 54 53 20 74 65 73 74 5f 6d 65 74 61 3b 22 29  STS test_meta;")
2800: 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  .       (sqlite3
2810: 3a 65 78 65 63 75 74 65 20 64 62 20 74 65 73 74  :execute db test
2820: 2d 6d 65 74 61 2d 64 65 66 29 0a 20 20 20 20 20  -meta-def).     
2830: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
2840: 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41  te db "CREATE TA
2850: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54  BLE IF NOT EXIST
2860: 53 20 74 65 73 74 5f 64 61 74 61 20 28 69 64 20  S test_data (id 
2870: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
2880: 4b 45 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20  KEY,.           
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a0: 20 20 20 20 20 74 65 73 74 5f 69 64 20 49 4e 54       test_id INT
28b0: 45 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20  EGER,.          
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d0: 20 20 20 20 20 20 63 61 74 65 67 6f 72 79 20 54        category T
28e0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a  EXT DEFAULT '',.
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2910: 76 61 72 69 61 62 6c 65 20 54 45 58 54 2c 0a 09  variable TEXT,..
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2930: 20 20 20 20 20 20 20 20 76 61 6c 75 65 20 52 45          value RE
2940: 41 4c 2c 0a 09 20 20 20 20 20 20 20 20 20 20 20  AL,..           
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70               exp
2960: 65 63 74 65 64 20 52 45 41 4c 2c 0a 09 20 20 20  ected REAL,..   
2970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2980: 20 20 20 20 20 74 6f 6c 20 52 45 41 4c 2c 0a 20       tol REAL,. 
2990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75                 u
29b0: 6e 69 74 73 20 54 45 58 54 2c 0a 20 20 20 20 20  nits TEXT,.     
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 65             comme
29e0: 6e 74 20 54 45 58 54 20 44 45 46 41 55 4c 54 20  nt TEXT DEFAULT 
29f0: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '',.            
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a10: 20 20 20 20 73 74 61 74 75 73 20 54 45 58 54 20      status TEXT 
2a20: 44 45 46 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20  DEFAULT 'n/a',. 
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e               CON
2a50: 53 54 52 41 49 4e 54 20 74 65 73 74 5f 64 61 74  STRAINT test_dat
2a60: 61 20 55 4e 49 51 55 45 20 28 74 65 73 74 5f 69  a UNIQUE (test_i
2a70: 64 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 69 61  d,category,varia
2a80: 62 6c 65 29 29 3b 22 29 0a 20 20 20 20 20 20 20  ble));").       
2a90: 28 70 72 69 6e 74 20 22 57 41 52 4e 49 4e 47 3a  (print "WARNING:
2aa0: 20 54 61 62 6c 65 20 74 65 73 74 5f 64 61 74 61   Table test_data
2ab0: 20 61 6e 64 20 74 65 73 74 5f 6d 65 74 61 20 77   and test_meta w
2ac0: 65 72 65 20 72 65 63 72 65 61 74 65 64 2e 20 50  ere recreated. P
2ad0: 6c 65 61 73 65 20 64 6f 20 6d 65 67 61 74 65 73  lease do megates
2ae0: 74 20 2d 75 70 64 61 74 65 2d 6d 65 74 61 22 29  t -update-meta")
2af0: 0a 20 20 20 20 20 20 20 28 70 61 74 63 68 2d 64  .       (patch-d
2b00: 62 29 29 0a 20 20 20 20 20 20 28 28 3c 20 6d 76  b)).      ((< mv
2b10: 65 72 20 31 2e 32 37 29 0a 20 20 20 20 20 20 20  er 1.27).       
2b20: 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22  (db:set-var db "
2b30: 4d 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e  MEGATEST_VERSION
2b40: 22 20 31 2e 32 37 29 0a 20 20 20 20 20 20 20 28  " 1.27).       (
2b50: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
2b60: 64 62 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20  db "ALTER TABLE 
2b70: 74 65 73 74 5f 64 61 74 61 20 41 44 44 20 43 4f  test_data ADD CO
2b80: 4c 55 4d 4e 20 74 79 70 65 20 54 45 58 54 20 44  LUMN type TEXT D
2b90: 45 46 41 55 4c 54 20 27 27 3b 22 29 0a 20 20 20  EFAULT '';").   
2ba0: 20 20 20 20 28 70 61 74 63 68 2d 64 62 29 29 0a      (patch-db)).
2bb0: 20 20 20 20 20 20 28 28 3c 20 6d 76 65 72 20 31        ((< mver 1
2bc0: 2e 32 39 29 0a 20 20 20 20 20 20 20 28 64 62 3a  .29).       (db:
2bd0: 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41  set-var db "MEGA
2be0: 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e  TEST_VERSION" 1.
2bf0: 32 39 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69  29).       (sqli
2c00: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22  te3:execute db "
2c10: 41 4c 54 45 52 20 54 41 42 4c 45 20 74 65 73 74  ALTER TABLE test
2c20: 5f 73 74 65 70 73 20 41 44 44 20 43 4f 4c 55 4d  _steps ADD COLUM
2c30: 4e 20 6c 6f 67 66 69 6c 65 20 54 45 58 54 20 44  N logfile TEXT D
2c40: 45 46 41 55 4c 54 20 27 27 3b 22 29 0a 20 20 20  EFAULT '';").   
2c50: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65      (sqlite3:exe
2c60: 63 75 74 65 20 64 62 20 22 41 4c 54 45 52 20 54  cute db "ALTER T
2c70: 41 42 4c 45 20 74 65 73 74 73 20 41 44 44 20 43  ABLE tests ADD C
2c80: 4f 4c 55 4d 4e 20 73 68 6f 72 74 64 69 72 20 54  OLUMN shortdir T
2c90: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 3b 22  EXT DEFAULT '';"
2ca0: 29 29 0a 20 20 20 20 20 20 28 28 3c 20 6d 76 65  )).      ((< mve
2cb0: 72 20 31 2e 33 36 29 0a 20 20 20 20 20 20 20 28  r 1.36).       (
2cc0: 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d  db:set-var db "M
2cd0: 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22  EGATEST_VERSION"
2ce0: 20 31 2e 33 36 29 0a 20 20 20 20 20 20 20 28 73   1.36).       (s
2cf0: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64  qlite3:execute d
2d00: 62 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 74  b "ALTER TABLE t
2d10: 65 73 74 5f 6d 65 74 61 20 41 44 44 20 43 4f 4c  est_meta ADD COL
2d20: 55 4d 4e 20 6a 6f 62 67 72 6f 75 70 20 54 45 58  UMN jobgroup TEX
2d30: 54 20 44 45 46 41 55 4c 54 20 27 64 65 66 61 75  T DEFAULT 'defau
2d40: 6c 74 27 3b 22 29 29 0a 20 20 20 20 20 20 28 28  lt';")).      ((
2d50: 3c 20 6d 76 65 72 20 31 2e 33 37 29 0a 20 20 20  < mver 1.37).   
2d60: 20 20 20 20 28 64 62 3a 73 65 74 2d 76 61 72 20      (db:set-var 
2d70: 64 62 20 22 4d 45 47 41 54 45 53 54 5f 56 45 52  db "MEGATEST_VER
2d80: 53 49 4f 4e 22 20 31 2e 33 37 29 0a 20 20 20 20  SION" 1.37).    
2d90: 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63     (sqlite3:exec
2da0: 75 74 65 20 64 62 20 22 41 4c 54 45 52 20 54 41  ute db "ALTER TA
2db0: 42 4c 45 20 74 65 73 74 73 20 41 44 44 20 43 4f  BLE tests ADD CO
2dc0: 4c 55 4d 4e 20 61 72 63 68 69 76 65 64 20 49 4e  LUMN archived IN
2dd0: 54 45 47 45 52 20 44 45 46 41 55 4c 54 20 30 3b  TEGER DEFAULT 0;
2de0: 22 29 29 20 0a 20 20 20 20 20 20 28 28 3c 20 6d  ")) .      ((< m
2df0: 76 65 72 20 6d 65 67 61 74 65 73 74 2d 76 65 72  ver megatest-ver
2e00: 73 69 6f 6e 29 0a 20 20 20 20 20 20 20 28 64 62  sion).       (db
2e10: 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47  :set-var db "MEG
2e20: 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 6d  ATEST_VERSION" m
2e30: 65 67 61 74 65 73 74 2d 76 65 72 73 69 6f 6e 29  egatest-version)
2e40: 29 29 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d  )))))..;;=======
2e50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2e60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2e70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2e80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a  ===============.
2e90: 3b 3b 20 6d 65 74 61 20 67 65 74 20 61 6e 64 20  ;; meta get and 
2ea0: 73 65 74 20 76 61 72 73 0a 3b 3b 3d 3d 3d 3d 3d  set vars.;;=====
2eb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2ec0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2ed0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2ee0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2ef0: 3d 0a 0a 3b 3b 20 72 65 74 75 72 6e 73 20 6e 75  =..;; returns nu
2f00: 6d 62 65 72 20 69 66 20 73 74 72 69 6e 67 2d 3e  mber if string->
2f10: 6e 75 6d 62 65 72 20 69 73 20 73 75 63 63 65 73  number is succes
2f20: 73 66 75 6c 2c 20 73 74 72 69 6e 67 20 6f 74 68  sful, string oth
2f30: 65 72 77 69 73 65 0a 28 64 65 66 69 6e 65 20 28  erwise.(define (
2f40: 64 62 3a 67 65 74 2d 76 61 72 20 64 62 20 76 61  db:get-var db va
2f50: 72 29 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20  r).  (let ((res 
2f60: 23 66 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65  #f)).    (sqlite
2f70: 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20  3:for-each-row. 
2f80: 20 20 20 20 28 6c 61 6d 62 64 61 20 28 76 61 6c      (lambda (val
2f90: 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72  ).       (set! r
2fa0: 65 73 20 76 61 6c 29 29 0a 20 20 20 20 20 64 62  es val)).     db
2fb0: 20 22 53 45 4c 45 43 54 20 76 61 6c 20 46 52 4f   "SELECT val FRO
2fc0: 4d 20 6d 65 74 61 64 61 74 20 57 48 45 52 45 20  M metadat WHERE 
2fd0: 76 61 72 3d 3f 3b 22 20 76 61 72 29 0a 20 20 20  var=?;" var).   
2fe0: 20 28 69 66 20 28 73 74 72 69 6e 67 3f 20 72 65   (if (string? re
2ff0: 73 29 0a 09 28 6c 65 74 20 28 28 76 61 6c 6e 75  s)..(let ((valnu
3000: 6d 20 28 73 74 72 69 6e 67 2d 3e 6e 75 6d 62 65  m (string->numbe
3010: 72 20 72 65 73 29 29 29 0a 09 20 20 28 69 66 20  r res)))..  (if 
3020: 76 61 6c 6e 75 6d 20 76 61 6c 6e 75 6d 20 72 65  valnum valnum re
3030: 73 29 29 0a 09 72 65 73 29 29 29 0a 0a 28 64 65  s))..res)))..(de
3040: 66 69 6e 65 20 28 64 62 3a 73 65 74 2d 76 61 72  fine (db:set-var
3050: 20 64 62 20 76 61 72 20 76 61 6c 29 0a 20 20 28   db var val).  (
3060: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
3070: 64 62 20 22 49 4e 53 45 52 54 20 4f 52 20 52 45  db "INSERT OR RE
3080: 50 4c 41 43 45 20 49 4e 54 4f 20 6d 65 74 61 64  PLACE INTO metad
3090: 61 74 20 28 76 61 72 2c 76 61 6c 29 20 56 41 4c  at (var,val) VAL
30a0: 55 45 53 20 28 3f 2c 3f 29 3b 22 20 76 61 72 20  UES (?,?);" var 
30b0: 76 61 6c 29 29 0a 0a 3b 3b 20 75 73 65 20 61 20  val))..;; use a 
30c0: 67 6c 6f 62 61 6c 20 66 6f 72 20 73 6f 6d 65 20  global for some 
30d0: 70 72 69 6d 69 74 69 76 65 20 63 61 63 68 69 6e  primitive cachin
30e0: 67 2c 20 69 74 20 69 73 20 6a 75 73 74 20 73 69  g, it is just si
30f0: 6c 6c 79 20 74 6f 20 72 65 2d 72 65 61 64 20 74  lly to re-read t
3100: 68 65 20 64 62 20 0a 3b 3b 20 6f 76 65 72 20 61  he db .;; over a
3110: 6e 64 20 6f 76 65 72 20 61 67 61 69 6e 20 66 6f  nd over again fo
3120: 72 20 74 68 65 20 6b 65 79 73 20 73 69 6e 63 65  r the keys since
3130: 20 74 68 65 79 20 6e 65 76 65 72 20 63 68 61 6e   they never chan
3140: 67 65 0a 0a 28 64 65 66 69 6e 65 20 2a 64 62 2d  ge..(define *db-
3150: 6b 65 79 73 2a 20 23 66 29 0a 0a 28 64 65 66 69  keys* #f)..(defi
3160: 6e 65 20 28 64 62 3a 67 65 74 2d 6b 65 79 73 20  ne (db:get-keys 
3170: 64 62 29 0a 20 20 28 69 66 20 2a 64 62 2d 6b 65  db).  (if *db-ke
3180: 79 73 2a 20 2a 64 62 2d 6b 65 79 73 2a 20 0a 20  ys* *db-keys* . 
3190: 20 20 20 20 20 28 6c 65 74 20 28 28 72 65 73 20       (let ((res 
31a0: 27 28 29 29 29 0a 09 28 73 71 6c 69 74 65 33 3a  '()))..(sqlite3:
31b0: 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 09 20  for-each-row .. 
31c0: 28 6c 61 6d 62 64 61 20 28 6b 65 79 20 6b 65 79  (lambda (key key
31d0: 74 79 70 65 29 0a 09 20 20 20 28 73 65 74 21 20  type)..   (set! 
31e0: 72 65 73 20 28 63 6f 6e 73 20 28 76 65 63 74 6f  res (cons (vecto
31f0: 72 20 6b 65 79 20 6b 65 79 74 79 70 65 29 20 72  r key keytype) r
3200: 65 73 29 29 29 0a 09 20 64 62 0a 09 20 22 53 45  es))).. db.. "SE
3210: 4c 45 43 54 20 66 69 65 6c 64 6e 61 6d 65 2c 66  LECT fieldname,f
3220: 69 65 6c 64 74 79 70 65 20 46 52 4f 4d 20 6b 65  ieldtype FROM ke
3230: 79 73 20 4f 52 44 45 52 20 42 59 20 69 64 20 44  ys ORDER BY id D
3240: 45 53 43 3b 22 29 0a 09 28 73 65 74 21 20 2a 64  ESC;")..(set! *d
3250: 62 2d 6b 65 79 73 2a 20 72 65 73 29 0a 09 72 65  b-keys* res)..re
3260: 73 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64  s)))..(define (d
3270: 62 3a 67 65 74 2d 76 61 6c 75 65 2d 62 79 2d 68  b:get-value-by-h
3280: 65 61 64 65 72 20 72 6f 77 20 68 65 61 64 65 72  eader row header
3290: 20 66 69 65 6c 64 29 0a 20 20 3b 3b 20 28 64 65   field).  ;; (de
32a0: 62 75 67 3a 70 72 69 6e 74 20 32 20 22 64 62 3a  bug:print 2 "db:
32b0: 67 65 74 2d 76 61 6c 75 65 2d 62 79 2d 68 65 61  get-value-by-hea
32c0: 64 65 72 20 72 6f 77 3a 20 22 20 72 6f 77 20 22  der row: " row "
32d0: 20 68 65 61 64 65 72 3a 20 22 20 68 65 61 64 65   header: " heade
32e0: 72 20 22 20 66 69 65 6c 64 3a 20 22 20 66 69 65  r " field: " fie
32f0: 6c 64 29 0a 20 20 28 69 66 20 28 6e 75 6c 6c 3f  ld).  (if (null?
3300: 20 68 65 61 64 65 72 29 20 23 66 0a 20 20 20 20   header) #f.    
3310: 20 20 28 6c 65 74 20 6c 6f 6f 70 20 28 28 68 65    (let loop ((he
3320: 64 20 28 63 61 72 20 68 65 61 64 65 72 29 29 0a  d (car header)).
3330: 09 09 20 28 74 61 6c 20 28 63 64 72 20 68 65 61  .. (tal (cdr hea
3340: 64 65 72 29 29 0a 09 09 20 28 6e 20 20 20 30 29  der))... (n   0)
3350: 29 0a 09 28 69 66 20 28 65 71 75 61 6c 3f 20 68  )..(if (equal? h
3360: 65 64 20 66 69 65 6c 64 29 0a 09 20 20 20 20 28  ed field)..    (
3370: 76 65 63 74 6f 72 2d 72 65 66 20 72 6f 77 20 6e  vector-ref row n
3380: 29 0a 09 20 20 20 20 28 69 66 20 28 6e 75 6c 6c  )..    (if (null
3390: 3f 20 74 61 6c 29 20 23 66 20 28 6c 6f 6f 70 20  ? tal) #f (loop 
33a0: 28 63 61 72 20 74 61 6c 29 28 63 64 72 20 74 61  (car tal)(cdr ta
33b0: 6c 29 28 2b 20 6e 20 31 29 29 29 29 29 29 29 0a  l)(+ n 1))))))).
33c0: 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  .;;=============
33d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
33e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
33f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3400: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 20 52 20  =========.;;  R 
3410: 55 20 4e 20 53 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d  U N S.;;========
3420: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3430: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3440: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3450: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a  ==============..
3460: 28 64 65 66 69 6e 65 20 28 72 75 6e 73 3a 67 65  (define (runs:ge
3470: 74 2d 73 74 64 2d 72 75 6e 2d 66 69 65 6c 64 73  t-std-run-fields
3480: 20 6b 65 79 73 20 72 65 6d 66 69 65 6c 64 73 29   keys remfields)
3490: 0a 20 20 28 6c 65 74 2a 20 28 28 68 65 61 64 65  .  (let* ((heade
34a0: 72 20 20 20 20 28 61 70 70 65 6e 64 20 28 6d 61  r    (append (ma
34b0: 70 20 6b 65 79 3a 67 65 74 2d 66 69 65 6c 64 6e  p key:get-fieldn
34c0: 61 6d 65 20 6b 65 79 73 29 0a 09 09 09 20 20 20  ame keys)....   
34d0: 20 72 65 6d 66 69 65 6c 64 73 29 29 0a 09 20 28   remfields)).. (
34e0: 6b 65 79 73 74 72 20 20 20 20 28 63 6f 6e 63 20  keystr    (conc 
34f0: 28 6b 65 79 73 2d 3e 6b 65 79 73 74 72 20 6b 65  (keys->keystr ke
3500: 79 73 29 20 22 2c 22 0a 09 09 09 20 20 28 73 74  ys) ","....  (st
3510: 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65  ring-intersperse
3520: 20 72 65 6d 66 69 65 6c 64 73 20 22 2c 22 29 29   remfields ","))
3530: 29 29 0a 20 20 20 20 28 6c 69 73 74 20 6b 65 79  )).    (list key
3540: 73 74 72 20 68 65 61 64 65 72 29 29 29 0a 0a 3b  str header)))..;
3550: 3b 20 57 41 53 20 64 62 2d 67 65 74 2d 72 75 6e  ; WAS db-get-run
3560: 73 20 46 49 58 4d 45 20 49 4e 20 52 45 4d 41 49  s FIXME IN REMAI
3570: 4e 49 4e 47 20 43 4f 44 45 0a 3b 3b 0a 3b 3b 20  NING CODE.;;.;; 
3580: 4d 45 52 47 45 20 54 48 49 53 20 57 49 54 48 20  MERGE THIS WITH 
3590: 64 62 3a 67 65 74 2d 72 75 6e 73 2c 20 61 63 63  db:get-runs, acc
35a0: 69 64 65 6e 74 6c 79 20 77 72 6f 74 65 20 69 74  idently wrote it
35b0: 20 74 77 69 63 65 0a 3b 3b 0a 3b 3b 20 72 65 70   twice.;;.;; rep
35c0: 6c 61 63 65 20 68 65 61 64 65 72 20 61 6e 64 20  lace header and 
35d0: 6b 65 79 73 74 72 20 77 69 74 68 20 61 20 63 61  keystr with a ca
35e0: 6c 6c 20 74 6f 20 72 75 6e 73 3a 67 65 74 2d 73  ll to runs:get-s
35f0: 74 64 2d 72 75 6e 2d 66 69 65 6c 64 73 0a 3b 3b  td-run-fields.;;
3600: 0a 3b 3b 20 6b 65 79 70 61 74 74 73 3a 20 28 20  .;; keypatts: ( 
3610: 28 4b 45 59 31 20 22 61 62 63 25 64 65 66 22 29  (KEY1 "abc%def")
3620: 28 4b 45 59 32 20 22 25 22 29 20 29 0a 3b 3b 0a  (KEY2 "%") ).;;.
3630: 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d  (define (db:get-
3640: 72 75 6e 73 20 64 62 20 72 75 6e 70 61 74 74 20  runs db runpatt 
3650: 63 6f 75 6e 74 20 6f 66 66 73 65 74 20 6b 65 79  count offset key
3660: 70 61 74 74 73 29 0a 20 20 28 6c 65 74 2a 20 28  patts).  (let* (
3670: 28 72 65 73 20 20 20 20 20 20 27 28 29 29 0a 09  (res      '())..
3680: 20 28 6b 65 79 73 20 20 20 20 20 20 28 64 62 3a   (keys      (db:
3690: 67 65 74 2d 6b 65 79 73 20 64 62 29 29 0a 09 20  get-keys db)).. 
36a0: 28 72 65 6d 66 69 65 6c 64 73 20 28 6c 69 73 74  (remfields (list
36b0: 20 22 69 64 22 20 22 72 75 6e 6e 61 6d 65 22 20   "id" "runname" 
36c0: 22 73 74 61 74 65 22 20 22 73 74 61 74 75 73 22  "state" "status"
36d0: 20 22 6f 77 6e 65 72 22 20 22 65 76 65 6e 74 5f   "owner" "event_
36e0: 74 69 6d 65 22 29 29 0a 09 20 28 68 65 61 64 65  time")).. (heade
36f0: 72 20 20 20 20 28 61 70 70 65 6e 64 20 28 6d 61  r    (append (ma
3700: 70 20 6b 65 79 3a 67 65 74 2d 66 69 65 6c 64 6e  p key:get-fieldn
3710: 61 6d 65 20 6b 65 79 73 29 0a 09 09 09 20 20 20  ame keys)....   
3720: 20 72 65 6d 66 69 65 6c 64 73 29 29 0a 09 20 28   remfields)).. (
3730: 6b 65 79 73 74 72 20 20 20 20 28 63 6f 6e 63 20  keystr    (conc 
3740: 28 6b 65 79 73 2d 3e 6b 65 79 73 74 72 20 6b 65  (keys->keystr ke
3750: 79 73 29 20 22 2c 22 0a 09 09 09 20 20 28 73 74  ys) ","....  (st
3760: 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65  ring-intersperse
3770: 20 72 65 6d 66 69 65 6c 64 73 20 22 2c 22 29 29   remfields ","))
3780: 29 0a 09 20 28 71 72 79 73 74 72 20 20 20 20 28  ).. (qrystr    (
3790: 63 6f 6e 63 20 22 53 45 4c 45 43 54 20 22 20 6b  conc "SELECT " k
37a0: 65 79 73 74 72 20 22 20 46 52 4f 4d 20 72 75 6e  eystr " FROM run
37b0: 73 20 57 48 45 52 45 20 72 75 6e 6e 61 6d 65 20  s WHERE runname 
37c0: 4c 49 4b 45 20 3f 20 22 0a 09 09 09 20 20 3b 3b  LIKE ? "....  ;;
37d0: 20 47 65 6e 65 72 61 74 65 3a 20 22 20 41 4e 44   Generate: " AND
37e0: 20 78 20 4c 49 4b 45 20 27 6b 65 79 70 61 74 74   x LIKE 'keypatt
37f0: 27 20 2e 2e 2e 22 0a 09 09 09 20 20 28 69 66 20  ' ..."....  (if 
3800: 28 6e 75 6c 6c 3f 20 6b 65 79 70 61 74 74 73 29  (null? keypatts)
3810: 20 22 22 0a 09 09 09 20 20 20 20 20 20 28 63 6f   ""....      (co
3820: 6e 63 20 22 20 41 4e 44 20 22 0a 09 09 09 09 20  nc " AND "..... 
3830: 20 20 20 28 73 74 72 69 6e 67 2d 6a 6f 69 6e 20     (string-join 
3840: 0a 09 09 09 09 20 20 20 20 20 28 6d 61 70 20 28  .....     (map (
3850: 6c 61 6d 62 64 61 20 28 6b 65 79 70 61 74 74 29  lambda (keypatt)
3860: 0a 09 09 09 09 09 20 20 20 20 28 6c 65 74 20 28  ......    (let (
3870: 28 6b 65 79 20 20 28 63 61 72 20 6b 65 79 70 61  (key  (car keypa
3880: 74 74 29 29 0a 09 09 09 09 09 09 20 20 28 70 61  tt)).......  (pa
3890: 74 74 20 28 63 61 64 72 20 6b 65 79 70 61 74 74  tt (cadr keypatt
38a0: 29 29 29 0a 09 09 09 09 09 20 20 20 20 20 20 28  )))......      (
38b0: 63 6f 6e 63 20 6b 65 79 20 22 20 4c 49 4b 45 20  conc key " LIKE 
38c0: 27 22 20 70 61 74 74 20 22 27 22 29 29 29 0a 09  '" patt "'")))..
38d0: 09 09 09 09 20 20 6b 65 79 70 61 74 74 73 29 0a  ....  keypatts).
38e0: 09 09 09 09 20 20 20 20 20 22 20 41 4e 44 20 22  ....     " AND "
38f0: 29 29 29 0a 09 09 09 20 20 22 20 4f 52 44 45 52  )))....  " ORDER
3900: 20 42 59 20 65 76 65 6e 74 5f 74 69 6d 65 20 44   BY event_time D
3910: 45 53 43 20 22 0a 09 09 09 20 20 28 69 66 20 28  ESC "....  (if (
3920: 6e 75 6d 62 65 72 3f 20 63 6f 75 6e 74 29 0a 09  number? count)..
3930: 09 09 20 20 20 20 20 20 28 63 6f 6e 63 20 22 20  ..      (conc " 
3940: 4c 49 4d 49 54 20 22 20 63 6f 75 6e 74 29 0a 09  LIMIT " count)..
3950: 09 09 20 20 20 20 20 20 22 22 29 0a 09 09 09 20  ..      "").... 
3960: 20 28 69 66 20 28 6e 75 6d 62 65 72 3f 20 6f 66   (if (number? of
3970: 66 73 65 74 29 0a 09 09 09 20 20 20 20 20 20 28  fset)....      (
3980: 63 6f 6e 63 20 22 20 4f 46 46 53 45 54 20 22 20  conc " OFFSET " 
3990: 6f 66 66 73 65 74 29 0a 09 09 09 20 20 20 20 20  offset)....     
39a0: 20 22 22 29 29 29 29 0a 20 20 20 20 28 64 65 62   "")))).    (deb
39b0: 75 67 3a 70 72 69 6e 74 20 38 20 22 49 4e 46 4f  ug:print 8 "INFO
39c0: 3a 20 64 62 3a 67 65 74 2d 72 75 6e 73 20 71 72  : db:get-runs qr
39d0: 79 73 74 72 3a 20 22 20 71 72 79 73 74 72 20 22  ystr: " qrystr "
39e0: 5c 6e 6b 65 79 70 61 74 74 73 3a 20 22 20 6b 65  \nkeypatts: " ke
39f0: 79 70 61 74 74 73 20 22 5c 6e 20 20 6f 66 66 73  ypatts "\n  offs
3a00: 65 74 3a 20 22 20 6f 66 66 73 65 74 20 22 20 6c  et: " offset " l
3a10: 69 6d 69 74 3a 20 22 20 63 6f 75 6e 74 29 0a 20  imit: " count). 
3a20: 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d     (sqlite3:for-
3a30: 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c  each-row.     (l
3a40: 61 6d 62 64 61 20 28 61 20 2e 20 78 29 0a 20 20  ambda (a . x).  
3a50: 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28       (set! res (
3a60: 63 6f 6e 73 20 28 61 70 70 6c 79 20 76 65 63 74  cons (apply vect
3a70: 6f 72 20 61 20 78 29 20 72 65 73 29 29 29 0a 20  or a x) res))). 
3a80: 20 20 20 20 64 62 0a 20 20 20 20 20 71 72 79 73      db.     qrys
3a90: 74 72 0a 20 20 20 20 20 72 75 6e 70 61 74 74 29  tr.     runpatt)
3aa0: 0a 20 20 20 20 28 76 65 63 74 6f 72 20 68 65 61  .    (vector hea
3ab0: 64 65 72 20 72 65 73 29 29 29 0a 0a 3b 3b 20 6a  der res)))..;; j
3ac0: 75 73 74 20 67 65 74 20 63 6f 75 6e 74 20 6f 66  ust get count of
3ad0: 20 72 75 6e 73 0a 28 64 65 66 69 6e 65 20 28 64   runs.(define (d
3ae0: 62 3a 67 65 74 2d 6e 75 6d 2d 72 75 6e 73 20 64  b:get-num-runs d
3af0: 62 20 72 75 6e 70 61 74 74 29 0a 20 20 28 6c 65  b runpatt).  (le
3b00: 74 20 28 28 6e 75 6d 72 75 6e 73 20 30 29 29 0a  t ((numruns 0)).
3b10: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72      (sqlite3:for
3b20: 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20 20 20 20  -each-row .     
3b30: 28 6c 61 6d 62 64 61 20 28 63 6f 75 6e 74 29 0a  (lambda (count).
3b40: 20 20 20 20 20 20 20 28 73 65 74 21 20 6e 75 6d         (set! num
3b50: 72 75 6e 73 20 63 6f 75 6e 74 29 29 0a 20 20 20  runs count)).   
3b60: 20 20 64 62 0a 20 20 20 20 20 22 53 45 4c 45 43    db.     "SELEC
3b70: 54 20 43 4f 55 4e 54 28 69 64 29 20 46 52 4f 4d  T COUNT(id) FROM
3b80: 20 72 75 6e 73 20 57 48 45 52 45 20 72 75 6e 6e   runs WHERE runn
3b90: 61 6d 65 20 4c 49 4b 45 20 3f 3b 22 20 72 75 6e  ame LIKE ?;" run
3ba0: 70 61 74 74 29 0a 20 20 20 20 6e 75 6d 72 75 6e  patt).    numrun
3bb0: 73 29 29 0a 0a 3b 3b 20 75 73 65 20 28 67 65 74  s))..;; use (get
3bc0: 2d 76 61 6c 75 65 2d 62 79 2d 68 65 61 64 65 72  -value-by-header
3bd0: 20 28 64 62 3a 67 65 74 2d 68 65 61 64 65 72 20   (db:get-header 
3be0: 72 75 6e 69 6e 66 6f 29 28 64 62 3a 67 65 74 2d  runinfo)(db:get-
3bf0: 72 6f 77 20 72 75 6e 69 6e 66 6f 29 29 0a 28 64  row runinfo)).(d
3c00: 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 72 75  efine (db:get-ru
3c10: 6e 2d 69 6e 66 6f 20 64 62 20 72 75 6e 2d 69 64  n-info db run-id
3c20: 29 0a 20 20 28 6c 65 74 2a 20 28 28 72 65 73 20  ).  (let* ((res 
3c30: 20 20 20 20 20 23 66 29 0a 09 20 28 6b 65 79 73       #f).. (keys
3c40: 20 20 20 20 20 20 28 64 62 3a 67 65 74 2d 6b 65        (db:get-ke
3c50: 79 73 20 64 62 29 29 0a 09 20 28 72 65 6d 66 69  ys db)).. (remfi
3c60: 65 6c 64 73 20 28 6c 69 73 74 20 22 69 64 22 20  elds (list "id" 
3c70: 22 72 75 6e 6e 61 6d 65 22 20 22 73 74 61 74 65  "runname" "state
3c80: 22 20 22 73 74 61 74 75 73 22 20 22 6f 77 6e 65  " "status" "owne
3c90: 72 22 20 22 65 76 65 6e 74 5f 74 69 6d 65 22 29  r" "event_time")
3ca0: 29 0a 09 20 28 68 65 61 64 65 72 20 20 20 20 28  ).. (header    (
3cb0: 61 70 70 65 6e 64 20 28 6d 61 70 20 6b 65 79 3a  append (map key:
3cc0: 67 65 74 2d 66 69 65 6c 64 6e 61 6d 65 20 6b 65  get-fieldname ke
3cd0: 79 73 29 0a 09 09 09 20 20 20 20 72 65 6d 66 69  ys)....    remfi
3ce0: 65 6c 64 73 29 29 0a 09 20 28 6b 65 79 73 74 72  elds)).. (keystr
3cf0: 20 20 20 20 28 63 6f 6e 63 20 28 6b 65 79 73 2d      (conc (keys-
3d00: 3e 6b 65 79 73 74 72 20 6b 65 79 73 29 20 22 2c  >keystr keys) ",
3d10: 22 0a 09 09 09 20 20 28 73 74 72 69 6e 67 2d 69  "....  (string-i
3d20: 6e 74 65 72 73 70 65 72 73 65 20 72 65 6d 66 69  ntersperse remfi
3d30: 65 6c 64 73 20 22 2c 22 29 29 29 29 0a 20 20 20  elds ",")))).   
3d40: 20 3b 3b 20 28 64 65 62 75 67 3a 70 72 69 6e 74   ;; (debug:print
3d50: 20 30 20 22 64 62 3a 67 65 74 2d 72 75 6e 2d 69   0 "db:get-run-i
3d60: 6e 66 6f 20 72 75 6e 2d 69 64 3a 20 22 20 72 75  nfo run-id: " ru
3d70: 6e 2d 69 64 20 22 20 68 65 61 64 65 72 3a 20 22  n-id " header: "
3d80: 20 68 65 61 64 65 72 20 22 20 6b 65 79 73 74 72   header " keystr
3d90: 3a 20 22 20 6b 65 79 73 74 72 29 0a 20 20 20 20  : " keystr).    
3da0: 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63  (sqlite3:for-eac
3db0: 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62  h-row.     (lamb
3dc0: 64 61 20 28 61 20 2e 20 78 29 0a 20 20 20 20 20  da (a . x).     
3dd0: 20 20 28 73 65 74 21 20 72 65 73 20 28 61 70 70    (set! res (app
3de0: 6c 79 20 76 65 63 74 6f 72 20 61 20 78 29 29 29  ly vector a x)))
3df0: 0a 20 20 20 20 20 64 62 0a 20 20 20 20 20 28 63  .     db.     (c
3e00: 6f 6e 63 20 22 53 45 4c 45 43 54 20 22 20 6b 65  onc "SELECT " ke
3e10: 79 73 74 72 20 22 20 46 52 4f 4d 20 72 75 6e 73  ystr " FROM runs
3e20: 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 29 0a 20   WHERE id=?;"). 
3e30: 20 20 20 20 72 75 6e 2d 69 64 29 0a 20 20 20 20      run-id).    
3e40: 28 76 65 63 74 6f 72 20 68 65 61 64 65 72 20 72  (vector header r
3e50: 65 73 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  es)))..(define (
3e60: 64 62 3a 73 65 74 2d 63 6f 6d 6d 65 6e 74 2d 66  db:set-comment-f
3e70: 6f 72 2d 72 75 6e 20 64 62 20 72 75 6e 2d 69 64  or-run db run-id
3e80: 20 63 6f 6d 6d 65 6e 74 29 0a 20 20 28 73 71 6c   comment).  (sql
3e90: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
3ea0: 22 55 50 44 41 54 45 20 72 75 6e 73 20 53 45 54  "UPDATE runs SET
3eb0: 20 63 6f 6d 6d 65 6e 74 3d 3f 20 57 48 45 52 45   comment=? WHERE
3ec0: 20 69 64 3d 3f 3b 22 20 63 6f 6d 6d 65 6e 74 20   id=?;" comment 
3ed0: 72 75 6e 2d 69 64 29 29 0a 0a 3b 3b 20 64 6f 65  run-id))..;; doe
3ee0: 73 20 6e 6f 74 20 28 6f 62 76 69 6f 75 73 6c 79  s not (obviously
3ef0: 21 29 20 72 65 6d 6f 76 65 64 20 64 65 70 65 6e  !) removed depen
3f00: 64 65 6e 74 20 64 61 74 61 2e 20 0a 28 64 65 66  dent data. .(def
3f10: 69 6e 65 20 28 64 62 3a 64 65 6c 65 74 65 2d 72  ine (db:delete-r
3f20: 75 6e 20 64 62 20 72 75 6e 2d 69 64 29 0a 20 20  un db run-id).  
3f30: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
3f40: 20 64 62 20 22 44 45 4c 45 54 45 20 46 52 4f 4d   db "DELETE FROM
3f50: 20 72 75 6e 73 20 57 48 45 52 45 20 69 64 3d 3f   runs WHERE id=?
3f60: 3b 22 20 72 75 6e 2d 69 64 29 29 0a 0a 28 64 65  ;" run-id))..(de
3f70: 66 69 6e 65 20 28 64 62 3a 75 70 64 61 74 65 2d  fine (db:update-
3f80: 72 75 6e 2d 65 76 65 6e 74 5f 74 69 6d 65 20 64  run-event_time d
3f90: 62 20 72 75 6e 2d 69 64 29 0a 20 20 28 73 71 6c  b run-id).  (sql
3fa0: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
3fb0: 22 55 50 44 41 54 45 20 72 75 6e 73 20 53 45 54  "UPDATE runs SET
3fc0: 20 65 76 65 6e 74 5f 74 69 6d 65 3d 73 74 72 66   event_time=strf
3fd0: 74 69 6d 65 28 27 25 73 27 2c 27 6e 6f 77 27 29  time('%s','now')
3fe0: 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 72 75   WHERE id=?;" ru
3ff0: 6e 2d 69 64 29 29 20 0a 0a 3b 3b 3d 3d 3d 3d 3d  n-id)) ..;;=====
4000: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4010: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4030: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4040: 3d 0a 3b 3b 20 4b 20 45 20 59 20 53 0a 3b 3b 3d  =.;; K E Y S.;;=
4050: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4060: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4070: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4080: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4090: 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 67 65 74 20 6b 65  =====..;; get ke
40a0: 79 20 76 61 6c 20 70 61 69 72 73 20 66 6f 72 20  y val pairs for 
40b0: 61 20 67 69 76 65 6e 20 72 75 6e 2d 69 64 0a 3b  a given run-id.;
40c0: 3b 20 28 20 28 46 49 45 4c 44 4e 41 4d 45 31 20  ; ( (FIELDNAME1 
40d0: 6b 65 79 76 61 6c 31 29 20 28 46 49 45 4c 44 4e  keyval1) (FIELDN
40e0: 41 4d 45 32 20 6b 65 79 76 61 6c 32 29 20 2e 2e  AME2 keyval2) ..
40f0: 2e 20 29 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  . ).(define (db:
4100: 67 65 74 2d 6b 65 79 2d 76 61 6c 2d 70 61 69 72  get-key-val-pair
4110: 73 20 64 62 20 72 75 6e 2d 69 64 29 0a 20 20 28  s db run-id).  (
4120: 6c 65 74 2a 20 28 28 6b 65 79 73 20 28 67 65 74  let* ((keys (get
4130: 2d 6b 65 79 73 20 64 62 29 29 0a 09 20 28 72 65  -keys db)).. (re
4140: 73 20 20 27 28 29 29 29 0a 20 20 20 20 28 64 65  s  '())).    (de
4150: 62 75 67 3a 70 72 69 6e 74 20 36 20 22 6b 65 79  bug:print 6 "key
4160: 73 3a 20 22 20 6b 65 79 73 20 22 20 72 75 6e 2d  s: " keys " run-
4170: 69 64 3a 20 22 20 72 75 6e 2d 69 64 29 0a 20 20  id: " run-id).  
4180: 20 20 28 66 6f 72 2d 65 61 63 68 20 0a 20 20 20    (for-each .   
4190: 20 20 28 6c 61 6d 62 64 61 20 28 6b 65 79 29 0a    (lambda (key).
41a0: 20 20 20 20 20 20 20 28 6c 65 74 20 28 28 71 72         (let ((qr
41b0: 79 20 28 63 6f 6e 63 20 22 53 45 4c 45 43 54 20  y (conc "SELECT 
41c0: 22 20 28 6b 65 79 3a 67 65 74 2d 66 69 65 6c 64  " (key:get-field
41d0: 6e 61 6d 65 20 6b 65 79 29 20 22 20 46 52 4f 4d  name key) " FROM
41e0: 20 72 75 6e 73 20 57 48 45 52 45 20 69 64 3d 3f   runs WHERE id=?
41f0: 3b 22 29 29 29 0a 09 20 3b 3b 20 28 64 65 62 75  ;"))).. ;; (debu
4200: 67 3a 70 72 69 6e 74 20 30 20 22 71 72 79 3a 20  g:print 0 "qry: 
4210: 22 20 71 72 79 29 0a 09 20 28 73 71 6c 69 74 65  " qry).. (sqlite
4220: 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a  3:for-each-row .
4230: 09 20 20 28 6c 61 6d 62 64 61 20 28 6b 65 79 2d  .  (lambda (key-
4240: 76 61 6c 29 0a 09 20 20 20 20 28 73 65 74 21 20  val)..    (set! 
4250: 72 65 73 20 28 63 6f 6e 73 20 28 6c 69 73 74 20  res (cons (list 
4260: 28 6b 65 79 3a 67 65 74 2d 66 69 65 6c 64 6e 61  (key:get-fieldna
4270: 6d 65 20 6b 65 79 29 20 6b 65 79 2d 76 61 6c 29  me key) key-val)
4280: 20 72 65 73 29 29 29 0a 09 20 20 64 62 20 71 72   res)))..  db qr
4290: 79 20 72 75 6e 2d 69 64 29 29 29 0a 20 20 20 20  y run-id))).    
42a0: 20 6b 65 79 73 29 0a 20 20 20 20 28 72 65 76 65   keys).    (reve
42b0: 72 73 65 20 72 65 73 29 29 29 0a 0a 3b 3b 20 67  rse res)))..;; g
42c0: 65 74 20 6b 65 79 20 76 61 6c 73 20 66 6f 72 20  et key vals for 
42d0: 61 20 67 69 76 65 6e 20 72 75 6e 2d 69 64 0a 28  a given run-id.(
42e0: 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 6b  define (db:get-k
42f0: 65 79 2d 76 61 6c 73 20 64 62 20 72 75 6e 2d 69  ey-vals db run-i
4300: 64 29 0a 20 20 28 6c 65 74 2a 20 28 28 6b 65 79  d).  (let* ((key
4310: 73 20 28 67 65 74 2d 6b 65 79 73 20 64 62 29 29  s (get-keys db))
4320: 0a 09 20 28 72 65 73 20 20 27 28 29 29 29 0a 20  .. (res  '())). 
4330: 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20     (debug:print 
4340: 36 20 22 6b 65 79 73 3a 20 22 20 6b 65 79 73 20  6 "keys: " keys 
4350: 22 20 72 75 6e 2d 69 64 3a 20 22 20 72 75 6e 2d  " run-id: " run-
4360: 69 64 29 0a 20 20 20 20 28 66 6f 72 2d 65 61 63  id).    (for-eac
4370: 68 20 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20  h .     (lambda 
4380: 28 6b 65 79 29 0a 20 20 20 20 20 20 20 28 6c 65  (key).       (le
4390: 74 20 28 28 71 72 79 20 28 63 6f 6e 63 20 22 53  t ((qry (conc "S
43a0: 45 4c 45 43 54 20 22 20 28 6b 65 79 3a 67 65 74  ELECT " (key:get
43b0: 2d 66 69 65 6c 64 6e 61 6d 65 20 6b 65 79 29 20  -fieldname key) 
43c0: 22 20 46 52 4f 4d 20 72 75 6e 73 20 57 48 45 52  " FROM runs WHER
43d0: 45 20 69 64 3d 3f 3b 22 29 29 29 0a 09 20 3b 3b  E id=?;"))).. ;;
43e0: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 30 20   (debug:print 0 
43f0: 22 71 72 79 3a 20 22 20 71 72 79 29 0a 09 20 28  "qry: " qry).. (
4400: 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68  sqlite3:for-each
4410: 2d 72 6f 77 20 0a 09 20 20 28 6c 61 6d 62 64 61  -row ..  (lambda
4420: 20 28 6b 65 79 2d 76 61 6c 29 0a 09 20 20 20 20   (key-val)..    
4430: 28 73 65 74 21 20 72 65 73 20 28 63 6f 6e 73 20  (set! res (cons 
4440: 6b 65 79 2d 76 61 6c 20 72 65 73 29 29 29 0a 09  key-val res)))..
4450: 20 20 64 62 20 71 72 79 20 72 75 6e 2d 69 64 29    db qry run-id)
4460: 29 29 0a 20 20 20 20 20 6b 65 79 73 29 0a 20 20  )).     keys).  
4470: 20 20 28 72 65 76 65 72 73 65 20 72 65 73 29 29    (reverse res))
4480: 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  )..;;===========
4490: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
44a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
44b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
44c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 20  ===========.;;  
44d0: 54 20 45 20 53 20 54 20 53 0a 3b 3b 3d 3d 3d 3d  T E S T S.;;====
44e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
44f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4500: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4510: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4520: 3d 3d 0a 0a 3b 3b 20 73 74 61 74 65 73 20 61 6e  ==..;; states an
4530: 64 20 73 74 61 74 75 73 65 73 20 61 72 65 20 6c  d statuses are l
4540: 69 73 74 73 2c 20 74 75 72 6e 20 74 68 65 6d 20  ists, turn them 
4550: 69 6e 74 6f 20 28 22 50 41 53 53 22 2c 22 46 41  into ("PASS","FA
4560: 49 4c 22 2e 2e 2e 29 20 61 6e 64 20 75 73 65 20  IL"...) and use 
4570: 4e 4f 54 20 49 4e 0a 3b 3b 20 69 2e 65 2e 20 74  NOT IN.;; i.e. t
4580: 68 65 73 65 20 6c 69 73 74 73 20 64 65 66 69 6e  hese lists defin
4590: 65 20 77 68 61 74 20 74 6f 20 4e 4f 54 20 73 68  e what to NOT sh
45a0: 6f 77 2e 0a 3b 3b 20 73 74 61 74 65 73 20 61 6e  ow..;; states an
45b0: 64 20 73 74 61 74 75 73 65 73 20 61 72 65 20 72  d statuses are r
45c0: 65 71 75 69 72 65 64 20 74 6f 20 62 65 20 6c 69  equired to be li
45d0: 73 74 73 2c 20 65 6d 70 74 79 20 69 73 20 6f 6b  sts, empty is ok
45e0: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74  .(define (db:get
45f0: 2d 74 65 73 74 73 2d 66 6f 72 2d 72 75 6e 20 64  -tests-for-run d
4600: 62 20 72 75 6e 2d 69 64 20 74 65 73 74 70 61 74  b run-id testpat
4610: 74 20 69 74 65 6d 70 61 74 74 20 73 74 61 74 65  t itempatt state
4620: 73 20 73 74 61 74 75 73 65 73 29 0a 20 20 28 6c  s statuses).  (l
4630: 65 74 2a 20 28 28 72 65 73 20 27 28 29 29 0a 09  et* ((res '())..
4640: 20 28 73 74 61 74 65 73 2d 73 74 72 20 20 20 20   (states-str    
4650: 28 63 6f 6e 63 20 22 28 27 22 20 28 73 74 72 69  (conc "('" (stri
4660: 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 73  ng-intersperse s
4670: 74 61 74 65 73 20 20 20 22 27 2c 27 22 29 20 22  tates   "','") "
4680: 27 29 22 29 29 0a 09 20 28 73 74 61 74 75 73 65  ')")).. (statuse
4690: 73 2d 73 74 72 20 20 28 63 6f 6e 63 20 22 28 27  s-str  (conc "('
46a0: 22 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73  " (string-inters
46b0: 70 65 72 73 65 20 73 74 61 74 75 73 65 73 20 22  perse statuses "
46c0: 27 2c 27 22 29 20 22 27 29 22 29 29 0a 09 20 28  ','") "')")).. (
46d0: 71 72 79 20 20 20 20 20 20 28 63 6f 6e 63 20 22  qry      (conc "
46e0: 53 45 4c 45 43 54 20 69 64 2c 72 75 6e 5f 69 64  SELECT id,run_id
46f0: 2c 74 65 73 74 6e 61 6d 65 2c 73 74 61 74 65 2c  ,testname,state,
4700: 73 74 61 74 75 73 2c 65 76 65 6e 74 5f 74 69 6d  status,event_tim
4710: 65 2c 68 6f 73 74 2c 63 70 75 6c 6f 61 64 2c 64  e,host,cpuload,d
4720: 69 73 6b 66 72 65 65 2c 75 6e 61 6d 65 2c 72 75  iskfree,uname,ru
4730: 6e 64 69 72 2c 69 74 65 6d 5f 70 61 74 68 2c 72  ndir,item_path,r
4740: 75 6e 5f 64 75 72 61 74 69 6f 6e 2c 66 69 6e 61  un_duration,fina
4750: 6c 5f 6c 6f 67 66 2c 63 6f 6d 6d 65 6e 74 20 22  l_logf,comment "
4760: 0a 09 09 09 20 22 20 46 52 4f 4d 20 74 65 73 74  .... " FROM test
4770: 73 20 57 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f  s WHERE run_id=?
4780: 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 20 6c 69   AND testname li
4790: 6b 65 20 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61  ke ? AND item_pa
47a0: 74 68 20 4c 49 4b 45 20 3f 20 22 20 0a 09 09 09  th LIKE ? " ....
47b0: 20 22 20 41 4e 44 20 4e 4f 54 20 28 73 74 61 74   " AND NOT (stat
47c0: 65 20 69 6e 20 22 20 73 74 61 74 65 73 2d 73 74  e in " states-st
47d0: 72 20 22 20 41 4e 44 20 73 74 61 74 75 73 20 49  r " AND status I
47e0: 4e 20 22 20 73 74 61 74 75 73 65 73 2d 73 74 72  N " statuses-str
47f0: 20 22 29 20 22 0a 09 09 09 20 3b 3b 20 22 20 4f   ") ".... ;; " O
4800: 52 44 45 52 20 42 59 20 69 64 20 44 45 53 43 3b  RDER BY id DESC;
4810: 22 0a 09 09 09 20 22 20 4f 52 44 45 52 20 42 59  ".... " ORDER BY
4820: 20 65 76 65 6e 74 5f 74 69 6d 65 20 41 53 43 3b   event_time ASC;
4830: 22 20 3b 3b 20 50 4f 54 45 4e 54 49 41 4c 20 49  " ;; POTENTIAL I
4840: 53 53 55 45 21 20 43 48 45 43 4b 20 4d 45 21 20  SSUE! CHECK ME! 
4850: 44 6f 65 73 20 61 6e 79 74 69 6e 67 20 64 65 70  Does anyting dep
4860: 65 6e 64 20 6f 6e 20 74 68 69 73 20 62 65 69 6e  end on this bein
4870: 67 20 73 6f 72 74 65 64 20 62 79 20 69 64 3f 0a  g sorted by id?.
4880: 09 09 09 20 29 29 29 0a 20 20 20 20 28 64 65 62  ... ))).    (deb
4890: 75 67 3a 70 72 69 6e 74 20 38 20 22 49 4e 46 4f  ug:print 8 "INFO
48a0: 3a 20 64 62 3a 67 65 74 2d 74 65 73 74 73 2d 66  : db:get-tests-f
48b0: 6f 72 2d 72 75 6e 20 71 72 79 3d 22 20 71 72 79  or-run qry=" qry
48c0: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66  ).    (sqlite3:f
48d0: 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20 20  or-each-row .   
48e0: 20 20 28 6c 61 6d 62 64 61 20 28 61 20 2e 20 62    (lambda (a . b
48f0: 29 20 3b 3b 20 69 64 20 72 75 6e 2d 69 64 20 74  ) ;; id run-id t
4900: 65 73 74 6e 61 6d 65 20 73 74 61 74 65 20 73 74  estname state st
4910: 61 74 75 73 20 65 76 65 6e 74 2d 74 69 6d 65 20  atus event-time 
4920: 68 6f 73 74 20 63 70 75 6c 6f 61 64 20 64 69 73  host cpuload dis
4930: 6b 66 72 65 65 20 75 6e 61 6d 65 20 72 75 6e 64  kfree uname rund
4940: 69 72 20 69 74 65 6d 2d 70 61 74 68 20 72 75 6e  ir item-path run
4950: 2d 64 75 72 61 74 69 6f 6e 20 66 69 6e 61 6c 2d  -duration final-
4960: 6c 6f 67 66 20 63 6f 6d 6d 65 6e 74 29 0a 20 20  logf comment).  
4970: 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28       (set! res (
4980: 63 6f 6e 73 20 28 61 70 70 6c 79 20 76 65 63 74  cons (apply vect
4990: 6f 72 20 61 20 62 29 20 72 65 73 29 29 29 20 3b  or a b) res))) ;
49a0: 3b 20 69 64 20 72 75 6e 2d 69 64 20 74 65 73 74  ; id run-id test
49b0: 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61 74 75  name state statu
49c0: 73 20 65 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73  s event-time hos
49d0: 74 20 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72  t cpuload diskfr
49e0: 65 65 20 75 6e 61 6d 65 20 72 75 6e 64 69 72 20  ee uname rundir 
49f0: 69 74 65 6d 2d 70 61 74 68 20 72 75 6e 2d 64 75  item-path run-du
4a00: 72 61 74 69 6f 6e 20 66 69 6e 61 6c 2d 6c 6f 67  ration final-log
4a10: 66 20 63 6f 6d 6d 65 6e 74 29 20 72 65 73 29 29  f comment) res))
4a20: 29 0a 20 20 20 20 20 64 62 20 0a 20 20 20 20 20  ).     db .     
4a30: 71 72 79 0a 20 20 20 20 20 72 75 6e 2d 69 64 0a  qry.     run-id.
4a40: 20 20 20 20 20 28 69 66 20 74 65 73 74 70 61 74       (if testpat
4a50: 74 20 74 65 73 74 70 61 74 74 20 22 25 22 29 0a  t testpatt "%").
4a60: 20 20 20 20 20 28 69 66 20 69 74 65 6d 70 61 74       (if itempat
4a70: 74 20 69 74 65 6d 70 61 74 74 20 22 25 22 29 29  t itempatt "%"))
4a80: 0a 20 20 20 20 72 65 73 29 29 0a 0a 3b 3b 20 74  .    res))..;; t
4a90: 68 69 73 20 6f 6e 65 20 69 73 20 61 20 62 69 74  his one is a bit
4aa0: 20 62 72 6f 6b 65 6e 20 42 55 47 20 46 49 58 4d   broken BUG FIXM
4ab0: 45 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 64 65  E.(define (db:de
4ac0: 6c 65 74 65 2d 74 65 73 74 2d 73 74 65 70 2d 72  lete-test-step-r
4ad0: 65 63 6f 72 64 73 20 64 62 20 72 75 6e 2d 69 64  ecords db run-id
4ae0: 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 64   test-name itemd
4af0: 61 74 29 0a 20 20 3b 3b 20 42 72 65 61 6b 69 6e  at).  ;; Breakin
4b00: 67 20 69 74 20 69 6e 74 6f 20 74 77 6f 20 71 75  g it into two qu
4b10: 65 72 69 65 73 20 66 6f 72 20 62 65 74 74 65 72  eries for better
4b20: 20 66 69 6c 65 20 61 63 63 65 73 73 20 69 6e 74   file access int
4b30: 65 72 6c 65 61 76 69 6e 67 0a 20 20 28 6c 65 74  erleaving.  (let
4b40: 20 28 28 69 64 73 20 27 28 29 29 29 0a 20 20 20   ((ids '())).   
4b50: 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61   (sqlite3:for-ea
4b60: 63 68 2d 72 6f 77 20 28 6c 61 6d 62 64 61 20 28  ch-row (lambda (
4b70: 69 64 29 0a 09 09 09 20 20 20 20 28 73 65 74 21  id)....    (set!
4b80: 20 69 64 73 20 28 63 6f 6e 73 20 69 64 20 69 64   ids (cons id id
4b90: 73 29 29 29 0a 09 09 09 20 20 64 62 0a 09 09 09  s)))....  db....
4ba0: 20 20 22 53 45 4c 45 43 54 20 69 64 20 46 52 4f    "SELECT id FRO
4bb0: 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 72 75  M tests WHERE ru
4bc0: 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e  n_id=? AND testn
4bd0: 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70  ame=? AND item_p
4be0: 61 74 68 3d 3f 3b 22 0a 09 09 09 20 20 72 75 6e  ath=?;"....  run
4bf0: 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 28 69  -id test-name (i
4c00: 74 65 6d 2d 6c 69 73 74 2d 3e 70 61 74 68 20 69  tem-list->path i
4c10: 74 65 6d 64 61 74 29 29 0a 20 20 20 20 28 66 6f  temdat)).    (fo
4c20: 72 2d 65 61 63 68 20 28 6c 61 6d 62 64 61 20 28  r-each (lambda (
4c30: 69 64 29 0a 09 09 28 73 71 6c 69 74 65 33 3a 65  id)...(sqlite3:e
4c40: 78 65 63 75 74 65 20 64 62 20 22 44 45 4c 45 54  xecute db "DELET
4c50: 45 20 46 52 4f 4d 20 74 65 73 74 5f 73 74 65 70  E FROM test_step
4c60: 73 20 57 48 45 52 45 20 74 65 73 74 5f 69 64 3d  s WHERE test_id=
4c70: 3f 3b 22 20 69 64 29 0a 09 09 28 74 68 72 65 61  ?;" id)...(threa
4c80: 64 2d 73 6c 65 65 70 21 20 30 2e 31 29 20 3b 3b  d-sleep! 0.1) ;;
4c90: 20 67 69 76 65 20 6f 74 68 65 72 73 20 61 63 63   give others acc
4ca0: 65 73 73 20 74 6f 20 74 68 65 20 64 62 0a 20 20  ess to the db.  
4cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 73                (s
4cc0: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64  qlite3:execute d
4cd0: 62 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74  b "DELETE FROM t
4ce0: 65 73 74 5f 64 61 74 61 20 57 48 45 52 45 20 74  est_data WHERE t
4cf0: 65 73 74 5f 69 64 3d 3f 3b 22 20 69 64 29 0a 20  est_id=?;" id). 
4d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
4d10: 74 68 72 65 61 64 2d 73 6c 65 65 70 21 20 30 2e  thread-sleep! 0.
4d20: 31 29 29 20 3b 3b 20 67 69 76 65 20 6f 74 68 65  1)) ;; give othe
4d30: 72 73 20 61 63 63 65 73 73 20 74 6f 20 74 68 65  rs access to the
4d40: 20 64 62 0a 09 20 20 20 20 20 20 69 64 73 29 29   db..      ids))
4d50: 29 0a 3b 3b 22 44 45 4c 45 54 45 20 46 52 4f 4d  ).;;"DELETE FROM
4d60: 20 74 65 73 74 5f 73 74 65 70 73 20 57 48 45 52   test_steps WHER
4d70: 45 20 74 65 73 74 5f 69 64 20 69 6e 20 28 53 45  E test_id in (SE
4d80: 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 74 65 73  LECT id FROM tes
4d90: 74 73 20 57 48 45 52 45 20 72 75 6e 5f 69 64 3d  ts WHERE run_id=
4da0: 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f  ? AND testname=?
4db0: 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 3d 3f   AND item_path=?
4dc0: 29 3b 22 20 0a 09 09 20 20 20 0a 3b 3b 20 0a 28  );" ...   .;; .(
4dd0: 64 65 66 69 6e 65 20 28 64 62 3a 64 65 6c 65 74  define (db:delet
4de0: 65 2d 74 65 73 74 2d 72 65 63 6f 72 64 73 20 64  e-test-records d
4df0: 62 20 74 65 73 74 2d 69 64 29 0a 20 20 28 73 71  b test-id).  (sq
4e00: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62  lite3:execute db
4e10: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 65   "DELETE FROM te
4e20: 73 74 5f 73 74 65 70 73 20 57 48 45 52 45 20 74  st_steps WHERE t
4e30: 65 73 74 5f 69 64 3d 3f 3b 22 20 74 65 73 74 2d  est_id=?;" test-
4e40: 69 64 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65  id).  (sqlite3:e
4e50: 78 65 63 75 74 65 20 64 62 20 22 44 45 4c 45 54  xecute db "DELET
4e60: 45 20 46 52 4f 4d 20 74 65 73 74 5f 64 61 74 61  E FROM test_data
4e70: 20 20 57 48 45 52 45 20 74 65 73 74 5f 69 64 3d    WHERE test_id=
4e80: 3f 3b 22 20 74 65 73 74 2d 69 64 29 0a 20 20 28  ?;" test-id).  (
4e90: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
4ea0: 64 62 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  db "DELETE FROM 
4eb0: 74 65 73 74 73 20 57 48 45 52 45 20 69 64 3d 3f  tests WHERE id=?
4ec0: 3b 22 20 74 65 73 74 2d 69 64 29 29 0a 0a 3b 3b  ;" test-id))..;;
4ed0: 20 73 65 74 20 74 65 73 74 73 20 77 69 74 68 20   set tests with 
4ee0: 73 74 61 74 65 20 63 75 72 72 73 74 61 74 65 20  state currstate 
4ef0: 61 6e 64 20 73 74 61 74 75 73 20 63 75 72 72 73  and status currs
4f00: 74 61 74 75 73 20 74 6f 20 6e 65 77 73 74 61 74  tatus to newstat
4f10: 65 20 61 6e 64 20 6e 65 77 73 74 61 74 75 73 0a  e and newstatus.
4f20: 3b 3b 20 75 73 65 20 63 75 72 72 73 74 61 74 65  ;; use currstate
4f30: 20 3d 20 23 66 20 61 6e 64 20 6f 72 20 63 75 72   = #f and or cur
4f40: 72 73 74 61 74 75 73 20 3d 20 23 66 20 74 6f 20  rstatus = #f to 
4f50: 61 70 70 6c 79 20 74 6f 20 61 6e 79 20 73 74 61  apply to any sta
4f60: 74 65 20 6f 72 20 73 74 61 74 75 73 20 72 65 73  te or status res
4f70: 70 65 63 74 69 76 65 6c 79 0a 3b 3b 20 57 41 52  pectively.;; WAR
4f80: 4e 49 4e 47 3a 20 53 51 4c 20 69 6e 6a 65 63 74  NING: SQL inject
4f90: 69 6f 6e 20 72 69 73 6b 0a 28 64 65 66 69 6e 65  ion risk.(define
4fa0: 20 28 64 62 3a 73 65 74 2d 74 65 73 74 73 2d 73   (db:set-tests-s
4fb0: 74 61 74 65 2d 73 74 61 74 75 73 20 64 62 20 72  tate-status db r
4fc0: 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 73 20  un-id testnames 
4fd0: 63 75 72 72 73 74 61 74 65 20 63 75 72 72 73 74  currstate currst
4fe0: 61 74 75 73 20 6e 65 77 73 74 61 74 65 20 6e 65  atus newstate ne
4ff0: 77 73 74 61 74 75 73 29 0a 20 20 28 66 6f 72 2d  wstatus).  (for-
5000: 65 61 63 68 20 28 6c 61 6d 62 64 61 20 28 74 65  each (lambda (te
5010: 73 74 6e 61 6d 65 29 0a 09 20 20 20 20 20 20 28  stname)..      (
5020: 6c 65 74 20 28 28 71 72 79 20 28 63 6f 6e 63 20  let ((qry (conc 
5030: 22 55 50 44 41 54 45 20 74 65 73 74 73 20 53 45  "UPDATE tests SE
5040: 54 20 73 74 61 74 65 3d 3f 2c 73 74 61 74 75 73  T state=?,status
5050: 3d 3f 20 57 48 45 52 45 20 22 0a 09 09 09 20 20  =? WHERE "....  
5060: 20 20 20 20 20 28 69 66 20 63 75 72 72 73 74 61       (if currsta
5070: 74 65 20 20 28 63 6f 6e 63 20 22 73 74 61 74 65  te  (conc "state
5080: 3d 27 22 20 63 75 72 72 73 74 61 74 65 20 22 27  ='" currstate "'
5090: 20 41 4e 44 20 22 29 20 22 22 29 0a 09 09 09 20   AND ") "").... 
50a0: 20 20 20 20 20 20 28 69 66 20 63 75 72 72 73 74        (if currst
50b0: 61 74 75 73 20 28 63 6f 6e 63 20 22 73 74 61 74  atus (conc "stat
50c0: 75 73 3d 27 22 20 63 75 72 72 73 74 61 74 75 73  us='" currstatus
50d0: 20 22 27 20 41 4e 44 20 22 29 20 22 22 29 0a 09   "' AND ") "")..
50e0: 09 09 20 20 20 20 20 20 20 22 20 72 75 6e 5f 69  ..       " run_i
50f0: 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65  d=? AND testname
5100: 3d 3f 20 41 4e 44 20 4e 4f 54 20 28 69 74 65 6d  =? AND NOT (item
5110: 5f 70 61 74 68 3d 27 27 20 41 4e 44 20 74 65 73  _path='' AND tes
5120: 74 6e 61 6d 65 20 69 6e 20 28 53 45 4c 45 43 54  tname in (SELECT
5130: 20 44 49 53 54 49 4e 43 54 20 74 65 73 74 6e 61   DISTINCT testna
5140: 6d 65 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48  me FROM tests WH
5150: 45 52 45 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41  ERE testname=? A
5160: 4e 44 20 69 74 65 6d 5f 70 61 74 68 20 21 3d 20  ND item_path != 
5170: 27 27 29 29 3b 22 29 29 29 0a 09 09 3b 3b 28 64  ''));")))...;;(d
5180: 65 62 75 67 3a 70 72 69 6e 74 20 30 20 22 51 52  ebug:print 0 "QR
5190: 59 3a 20 22 20 71 72 79 29 0a 09 09 28 73 71 6c  Y: " qry)...(sql
51a0: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
51b0: 71 72 79 20 72 75 6e 2d 69 64 20 6e 65 77 73 74  qry run-id newst
51c0: 61 74 65 20 6e 65 77 73 74 61 74 75 73 20 74 65  ate newstatus te
51d0: 73 74 6e 61 6d 65 20 74 65 73 74 6e 61 6d 65 29  stname testname)
51e0: 29 29 0a 09 20 20 20 20 74 65 73 74 6e 61 6d 65  ))..    testname
51f0: 73 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62  s))..(define (db
5200: 3a 64 65 6c 65 74 65 2d 74 65 73 74 73 2d 69 6e  :delete-tests-in
5210: 2d 73 74 61 74 65 20 64 62 20 72 75 6e 2d 69 64  -state db run-id
5220: 20 73 74 61 74 65 29 0a 20 20 28 73 71 6c 69 74   state).  (sqlit
5230: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 44  e3:execute db "D
5240: 45 4c 45 54 45 20 46 52 4f 4d 20 74 65 73 74 73  ELETE FROM tests
5250: 20 57 48 45 52 45 20 73 74 61 74 65 3d 3f 20 41   WHERE state=? A
5260: 4e 44 20 72 75 6e 5f 69 64 3d 3f 3b 22 20 73 74  ND run_id=?;" st
5270: 61 74 65 20 72 75 6e 2d 69 64 29 29 0a 0a 28 64  ate run-id))..(d
5280: 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74 2d 73  efine (db:test-s
5290: 65 74 2d 73 74 61 74 65 2d 73 74 61 74 75 73 2d  et-state-status-
52a0: 62 79 2d 69 64 20 64 62 20 74 65 73 74 2d 69 64  by-id db test-id
52b0: 20 6e 65 77 73 74 61 74 65 20 6e 65 77 73 74 61   newstate newsta
52c0: 74 75 73 20 6e 65 77 63 6f 6d 6d 65 6e 74 29 0a  tus newcomment).
52d0: 20 20 28 69 66 20 6e 65 77 73 74 61 74 65 20 20    (if newstate  
52e0: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
52f0: 65 20 64 62 20 22 55 50 44 41 54 45 20 74 65 73  e db "UPDATE tes
5300: 74 73 20 53 45 54 20 73 74 61 74 65 3d 3f 20 20  ts SET state=?  
5310: 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 6e 65   WHERE id=?;" ne
5320: 77 73 74 61 74 65 20 20 20 74 65 73 74 2d 69 64  wstate   test-id
5330: 29 29 0a 20 20 28 69 66 20 6e 65 77 73 74 61 74  )).  (if newstat
5340: 75 73 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65  us  (sqlite3:exe
5350: 63 75 74 65 20 64 62 20 22 55 50 44 41 54 45 20  cute db "UPDATE 
5360: 74 65 73 74 73 20 53 45 54 20 73 74 61 74 75 73  tests SET status
5370: 3d 3f 20 20 57 48 45 52 45 20 69 64 3d 3f 3b 22  =?  WHERE id=?;"
5380: 20 6e 65 77 73 74 61 74 75 73 20 20 74 65 73 74   newstatus  test
5390: 2d 69 64 29 29 0a 20 20 28 69 66 20 6e 65 77 63  -id)).  (if newc
53a0: 6f 6d 6d 65 6e 74 20 28 73 71 6c 69 74 65 33 3a  omment (sqlite3:
53b0: 65 78 65 63 75 74 65 20 64 62 20 22 55 50 44 41  execute db "UPDA
53c0: 54 45 20 74 65 73 74 73 20 53 45 54 20 63 6f 6d  TE tests SET com
53d0: 6d 65 6e 74 3d 3f 20 57 48 45 52 45 20 69 64 3d  ment=? WHERE id=
53e0: 3f 3b 22 20 6e 65 77 63 6f 6d 6d 65 6e 74 20 74  ?;" newcomment t
53f0: 65 73 74 2d 69 64 29 29 29 0a 0a 28 64 65 66 69  est-id)))..(defi
5400: 6e 65 20 28 64 62 3a 74 65 73 74 2d 73 65 74 2d  ne (db:test-set-
5410: 73 74 61 74 65 2d 73 74 61 74 75 73 2d 62 79 2d  state-status-by-
5420: 72 75 6e 2d 69 64 2d 74 65 73 74 6e 61 6d 65 20  run-id-testname 
5430: 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e  db run-id test-n
5440: 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 73 74  ame item-path st
5450: 61 74 75 73 20 73 74 61 74 65 29 0a 20 20 28 73  atus state).  (s
5460: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64  qlite3:execute d
5470: 62 20 22 55 50 44 41 54 45 20 74 65 73 74 73 20  b "UPDATE tests 
5480: 53 45 54 20 73 74 61 74 65 3d 3f 2c 73 74 61 74  SET state=?,stat
5490: 75 73 3d 3f 2c 65 76 65 6e 74 5f 74 69 6d 65 3d  us=?,event_time=
54a0: 73 74 72 66 74 69 6d 65 28 27 25 73 27 2c 27 6e  strftime('%s','n
54b0: 6f 77 27 29 20 57 48 45 52 45 20 72 75 6e 5f 69  ow') WHERE run_i
54c0: 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65  d=? AND testname
54d0: 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68  =? AND item_path
54e0: 3d 3f 3b 22 20 0a 09 09 20 20 20 73 74 61 74 65  =?;" ...   state
54f0: 20 73 74 61 74 75 73 20 72 75 6e 2d 69 64 20 74   status run-id t
5500: 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61  est-name item-pa
5510: 74 68 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64  th))..(define (d
5520: 62 3a 67 65 74 2d 63 6f 75 6e 74 2d 74 65 73 74  b:get-count-test
5530: 73 2d 72 75 6e 6e 69 6e 67 20 64 62 29 0a 20 20  s-running db).  
5540: 28 6c 65 74 20 28 28 72 65 73 20 30 29 29 0a 20  (let ((res 0)). 
5550: 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d     (sqlite3:for-
5560: 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c  each-row.     (l
5570: 61 6d 62 64 61 20 28 63 6f 75 6e 74 29 0a 20 20  ambda (count).  
5580: 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20 63       (set! res c
5590: 6f 75 6e 74 29 29 0a 20 20 20 20 20 64 62 0a 20  ount)).     db. 
55a0: 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e      "SELECT coun
55b0: 74 28 69 64 29 20 46 52 4f 4d 20 74 65 73 74 73  t(id) FROM tests
55c0: 20 57 48 45 52 45 20 73 74 61 74 65 20 3d 20 27   WHERE state = '
55d0: 52 55 4e 4e 49 4e 47 27 20 4f 52 20 73 74 61 74  RUNNING' OR stat
55e0: 65 20 3d 20 27 4c 41 55 4e 43 48 45 44 27 20 4f  e = 'LAUNCHED' O
55f0: 52 20 73 74 61 74 65 20 3d 20 27 52 45 4d 4f 54  R state = 'REMOT
5600: 45 48 4f 53 54 53 54 41 52 54 27 3b 22 29 0a 20  EHOSTSTART';"). 
5610: 20 20 20 72 65 73 29 29 0a 0a 28 64 65 66 69 6e     res))..(defin
5620: 65 20 28 64 62 3a 67 65 74 2d 63 6f 75 6e 74 2d  e (db:get-count-
5630: 74 65 73 74 73 2d 72 75 6e 6e 69 6e 67 2d 69 6e  tests-running-in
5640: 2d 6a 6f 62 67 72 6f 75 70 20 64 62 20 6a 6f 62  -jobgroup db job
5650: 67 72 6f 75 70 29 0a 20 20 28 69 66 20 28 6e 6f  group).  (if (no
5660: 74 20 6a 6f 62 67 72 6f 75 70 29 0a 20 20 20 20  t jobgroup).    
5670: 20 20 30 20 3b 3b 20 0a 20 20 20 20 20 20 28 6c    0 ;; .      (l
5680: 65 74 20 28 28 72 65 73 20 30 29 29 0a 09 28 73  et ((res 0))..(s
5690: 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d  qlite3:for-each-
56a0: 72 6f 77 0a 09 20 28 6c 61 6d 62 64 61 20 28 63  row.. (lambda (c
56b0: 6f 75 6e 74 29 0a 09 20 20 20 28 73 65 74 21 20  ount)..   (set! 
56c0: 72 65 73 20 63 6f 75 6e 74 29 29 0a 09 20 64 62  res count)).. db
56d0: 0a 09 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74  .. "SELECT count
56e0: 28 69 64 29 20 46 52 4f 4d 20 74 65 73 74 73 20  (id) FROM tests 
56f0: 57 48 45 52 45 20 73 74 61 74 65 20 3d 20 27 52  WHERE state = 'R
5700: 55 4e 4e 49 4e 47 27 20 4f 52 20 73 74 61 74 65  UNNING' OR state
5710: 20 3d 20 27 4c 41 55 4e 43 48 45 44 27 20 4f 52   = 'LAUNCHED' OR
5720: 20 73 74 61 74 65 20 3d 20 27 52 45 4d 4f 54 45   state = 'REMOTE
5730: 48 4f 53 54 53 54 41 52 54 27 0a 20 20 20 20 20  HOSTSTART'.     
5740: 20 20 20 20 20 20 20 20 41 4e 44 20 74 65 73 74          AND test
5750: 6e 61 6d 65 20 69 6e 20 28 53 45 4c 45 43 54 20  name in (SELECT 
5760: 74 65 73 74 6e 61 6d 65 20 46 52 4f 4d 20 74 65  testname FROM te
5770: 73 74 5f 6d 65 74 61 20 57 48 45 52 45 20 6a 6f  st_meta WHERE jo
5780: 62 67 72 6f 75 70 3d 3f 3b 22 0a 09 20 6a 6f 62  bgroup=?;".. job
5790: 67 72 6f 75 70 29 0a 09 72 65 73 29 29 29 0a 0a  group)..res)))..
57a0: 3b 3b 20 64 6f 6e 65 20 77 69 74 68 20 72 75 6e  ;; done with run
57b0: 20 77 68 65 6e 3a 0a 3b 3b 20 20 20 30 20 74 65   when:.;;   0 te
57c0: 73 74 73 20 69 6e 20 4c 41 55 4e 43 48 45 44 2c  sts in LAUNCHED,
57d0: 20 4e 4f 54 5f 53 54 41 52 54 45 44 2c 20 52 45   NOT_STARTED, RE
57e0: 4d 4f 54 45 48 4f 53 54 53 54 41 52 54 2c 20 52  MOTEHOSTSTART, R
57f0: 55 4e 4e 49 4e 47 0a 28 64 65 66 69 6e 65 20 28  UNNING.(define (
5800: 64 62 3a 65 73 74 69 6d 61 74 65 64 2d 74 65 73  db:estimated-tes
5810: 74 73 2d 72 65 6d 61 69 6e 69 6e 67 20 64 62 20  ts-remaining db 
5820: 72 75 6e 2d 69 64 29 0a 20 20 28 6c 65 74 20 28  run-id).  (let (
5830: 28 72 65 73 20 30 29 29 0a 20 20 20 20 28 73 71  (res 0)).    (sq
5840: 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72  lite3:for-each-r
5850: 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20  ow.     (lambda 
5860: 28 63 6f 75 6e 74 29 0a 20 20 20 20 20 20 20 28  (count).       (
5870: 73 65 74 21 20 72 65 73 20 63 6f 75 6e 74 29 29  set! res count))
5880: 0a 20 20 20 20 20 64 62 20 3b 3b 20 4e 42 2f 2f  .     db ;; NB//
5890: 20 4b 49 4c 4c 52 45 51 20 6d 65 61 6e 73 20 74   KILLREQ means t
58a0: 68 65 20 6a 6f 62 73 20 69 73 20 73 74 69 6c 6c  he jobs is still
58b0: 20 70 72 6f 62 61 62 6c 79 20 72 75 6e 6e 69 6e   probably runnin
58c0: 67 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20 63  g.     "SELECT c
58d0: 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 74 65  ount(id) FROM te
58e0: 73 74 73 20 57 48 45 52 45 20 73 74 61 74 65 20  sts WHERE state 
58f0: 69 6e 20 28 27 4c 41 55 4e 43 48 45 44 27 2c 27  in ('LAUNCHED','
5900: 4e 4f 54 5f 53 54 41 52 54 45 44 27 2c 27 52 45  NOT_STARTED','RE
5910: 4d 4f 54 45 48 4f 53 54 53 54 41 52 54 27 2c 27  MOTEHOSTSTART','
5920: 52 55 4e 4e 49 4e 47 27 2c 27 4b 49 4c 4c 52 45  RUNNING','KILLRE
5930: 51 27 29 20 41 4e 44 20 72 75 6e 5f 69 64 3d 3f  Q') AND run_id=?
5940: 3b 22 20 72 75 6e 2d 69 64 29 0a 20 20 20 20 72  ;" run-id).    r
5950: 65 73 29 29 0a 0a 3b 3b 20 4e 42 2f 2f 20 53 79  es))..;; NB// Sy
5960: 6e 63 20 74 68 69 73 20 77 69 74 68 20 72 75 6e  nc this with run
5970: 73 3a 67 65 74 2d 74 65 73 74 2d 69 6e 66 6f 0a  s:get-test-info.
5980: 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d  (define (db:get-
5990: 74 65 73 74 2d 69 6e 66 6f 20 64 62 20 72 75 6e  test-info db run
59a0: 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 69 74 65  -id testname ite
59b0: 6d 2d 70 61 74 68 29 0a 20 20 28 6c 65 74 20 28  m-path).  (let (
59c0: 28 72 65 73 20 23 66 29 29 0a 20 20 20 20 28 73  (res #f)).    (s
59d0: 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d  qlite3:for-each-
59e0: 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 64 61  row.     (lambda
59f0: 20 28 69 64 20 72 75 6e 2d 69 64 20 74 65 73 74   (id run-id test
5a00: 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61 74 75  name state statu
5a10: 73 20 65 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73  s event-time hos
5a20: 74 20 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72  t cpuload diskfr
5a30: 65 65 20 75 6e 61 6d 65 20 72 75 6e 64 69 72 20  ee uname rundir 
5a40: 69 74 65 6d 2d 70 61 74 68 20 72 75 6e 5f 64 75  item-path run_du
5a50: 72 61 74 69 6f 6e 20 66 69 6e 61 6c 5f 6c 6f 67  ration final_log
5a60: 66 20 63 6f 6d 6d 65 6e 74 20 29 0a 20 20 20 20  f comment ).    
5a70: 20 20 20 28 73 65 74 21 20 72 65 73 20 28 76 65     (set! res (ve
5a80: 63 74 6f 72 20 69 64 20 72 75 6e 2d 69 64 20 74  ctor id run-id t
5a90: 65 73 74 6e 61 6d 65 20 73 74 61 74 65 20 73 74  estname state st
5aa0: 61 74 75 73 20 65 76 65 6e 74 2d 74 69 6d 65 20  atus event-time 
5ab0: 68 6f 73 74 20 63 70 75 6c 6f 61 64 20 64 69 73  host cpuload dis
5ac0: 6b 66 72 65 65 20 75 6e 61 6d 65 20 72 75 6e 64  kfree uname rund
5ad0: 69 72 20 69 74 65 6d 2d 70 61 74 68 20 72 75 6e  ir item-path run
5ae0: 5f 64 75 72 61 74 69 6f 6e 20 66 69 6e 61 6c 5f  _duration final_
5af0: 6c 6f 67 66 20 63 6f 6d 6d 65 6e 74 20 29 29 29  logf comment )))
5b00: 0a 20 20 20 20 20 64 62 20 0a 20 20 20 20 20 22  .     db .     "
5b10: 53 45 4c 45 43 54 20 69 64 2c 72 75 6e 5f 69 64  SELECT id,run_id
5b20: 2c 74 65 73 74 6e 61 6d 65 2c 73 74 61 74 65 2c  ,testname,state,
5b30: 73 74 61 74 75 73 2c 65 76 65 6e 74 5f 74 69 6d  status,event_tim
5b40: 65 2c 68 6f 73 74 2c 63 70 75 6c 6f 61 64 2c 64  e,host,cpuload,d
5b50: 69 73 6b 66 72 65 65 2c 75 6e 61 6d 65 2c 72 75  iskfree,uname,ru
5b60: 6e 64 69 72 2c 69 74 65 6d 5f 70 61 74 68 2c 72  ndir,item_path,r
5b70: 75 6e 5f 64 75 72 61 74 69 6f 6e 2c 66 69 6e 61  un_duration,fina
5b80: 6c 5f 6c 6f 67 66 2c 63 6f 6d 6d 65 6e 74 20 46  l_logf,comment F
5b90: 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 20  ROM tests WHERE 
5ba0: 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73  run_id=? AND tes
5bb0: 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d  tname=? AND item
5bc0: 5f 70 61 74 68 3d 3f 3b 22 0a 20 20 20 20 20 72  _path=?;".     r
5bd0: 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 69  un-id testname i
5be0: 74 65 6d 2d 70 61 74 68 29 0a 20 20 20 20 72 65  tem-path).    re
5bf0: 73 29 29 0a 0a 3b 3b 20 47 65 74 20 74 65 73 74  s))..;; Get test
5c00: 20 64 61 74 61 20 75 73 69 6e 67 20 74 65 73 74   data using test
5c10: 5f 69 64 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  _id.(define (db:
5c20: 67 65 74 2d 74 65 73 74 2d 64 61 74 61 2d 62 79  get-test-data-by
5c30: 2d 69 64 20 64 62 20 74 65 73 74 2d 69 64 29 0a  -id db test-id).
5c40: 20 20 28 6c 65 74 20 28 28 72 65 73 20 23 66 29    (let ((res #f)
5c50: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66  ).    (sqlite3:f
5c60: 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 20  or-each-row.    
5c70: 20 28 6c 61 6d 62 64 61 20 28 69 64 20 72 75 6e   (lambda (id run
5c80: 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 73 74 61  -id testname sta
5c90: 74 65 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d  te status event-
5ca0: 74 69 6d 65 20 68 6f 73 74 20 63 70 75 6c 6f 61  time host cpuloa
5cb0: 64 20 64 69 73 6b 66 72 65 65 20 75 6e 61 6d 65  d diskfree uname
5cc0: 20 72 75 6e 64 69 72 20 69 74 65 6d 2d 70 61 74   rundir item-pat
5cd0: 68 20 72 75 6e 5f 64 75 72 61 74 69 6f 6e 20 66  h run_duration f
5ce0: 69 6e 61 6c 5f 6c 6f 67 66 20 63 6f 6d 6d 65 6e  inal_logf commen
5cf0: 74 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20  t).       (set! 
5d00: 72 65 73 20 28 76 65 63 74 6f 72 20 69 64 20 72  res (vector id r
5d10: 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 73  un-id testname s
5d20: 74 61 74 65 20 73 74 61 74 75 73 20 65 76 65 6e  tate status even
5d30: 74 2d 74 69 6d 65 20 68 6f 73 74 20 63 70 75 6c  t-time host cpul
5d40: 6f 61 64 20 64 69 73 6b 66 72 65 65 20 75 6e 61  oad diskfree una
5d50: 6d 65 20 72 75 6e 64 69 72 20 69 74 65 6d 2d 70  me rundir item-p
5d60: 61 74 68 20 72 75 6e 5f 64 75 72 61 74 69 6f 6e  ath run_duration
5d70: 20 66 69 6e 61 6c 5f 6c 6f 67 66 20 63 6f 6d 6d   final_logf comm
5d80: 65 6e 74 29 29 29 0a 20 20 20 20 20 64 62 20 0a  ent))).     db .
5d90: 20 20 20 20 20 22 53 45 4c 45 43 54 20 69 64 2c       "SELECT id,
5da0: 72 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d 65 2c  run_id,testname,
5db0: 73 74 61 74 65 2c 73 74 61 74 75 73 2c 65 76 65  state,status,eve
5dc0: 6e 74 5f 74 69 6d 65 2c 68 6f 73 74 2c 63 70 75  nt_time,host,cpu
5dd0: 6c 6f 61 64 2c 64 69 73 6b 66 72 65 65 2c 75 6e  load,diskfree,un
5de0: 61 6d 65 2c 72 75 6e 64 69 72 2c 69 74 65 6d 5f  ame,rundir,item_
5df0: 70 61 74 68 2c 72 75 6e 5f 64 75 72 61 74 69 6f  path,run_duratio
5e00: 6e 2c 66 69 6e 61 6c 5f 6c 6f 67 66 2c 63 6f 6d  n,final_logf,com
5e10: 6d 65 6e 74 20 46 52 4f 4d 20 74 65 73 74 73 20  ment FROM tests 
5e20: 57 48 45 52 45 20 69 64 3d 3f 3b 22 0a 20 20 20  WHERE id=?;".   
5e30: 20 20 74 65 73 74 2d 69 64 29 0a 20 20 20 20 72    test-id).    r
5e40: 65 73 29 29 0a 0a 0a 28 64 65 66 69 6e 65 20 28  es))...(define (
5e50: 64 62 3a 74 65 73 74 2d 73 65 74 2d 63 6f 6d 6d  db:test-set-comm
5e60: 65 6e 74 20 64 62 20 74 65 73 74 2d 69 64 20 63  ent db test-id c
5e70: 6f 6d 6d 65 6e 74 29 0a 20 20 28 73 71 6c 69 74  omment).  (sqlit
5e80: 65 33 3a 65 78 65 63 75 74 65 20 0a 20 20 20 64  e3:execute .   d
5e90: 62 20 0a 20 20 20 22 55 50 44 41 54 45 20 74 65  b .   "UPDATE te
5ea0: 73 74 73 20 53 45 54 20 63 6f 6d 6d 65 6e 74 3d  sts SET comment=
5eb0: 3f 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 0a 20  ? WHERE id=?;". 
5ec0: 20 20 63 6f 6d 6d 65 6e 74 20 74 65 73 74 2d 69    comment test-i
5ed0: 64 29 29 0a 0a 3b 3b 0a 28 64 65 66 69 6e 65 20  d))..;;.(define 
5ee0: 28 64 62 3a 74 65 73 74 2d 73 65 74 2d 72 75 6e  (db:test-set-run
5ef0: 64 69 72 21 20 64 62 20 72 75 6e 2d 69 64 20 74  dir! db run-id t
5f00: 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61  est-name item-pa
5f10: 74 68 20 72 75 6e 64 69 72 29 0a 20 20 28 73 71  th rundir).  (sq
5f20: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 0a 20  lite3:execute . 
5f30: 20 20 64 62 20 0a 20 20 20 22 55 50 44 41 54 45    db .   "UPDATE
5f40: 20 74 65 73 74 73 20 53 45 54 20 72 75 6e 64 69   tests SET rundi
5f50: 72 3d 3f 20 57 48 45 52 45 20 72 75 6e 5f 69 64  r=? WHERE run_id
5f60: 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d  =? AND testname=
5f70: 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 3d  ? AND item_path=
5f80: 3f 3b 22 0a 20 20 20 72 75 6e 64 69 72 20 72 75  ?;".   rundir ru
5f90: 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69  n-id test-name i
5fa0: 74 65 6d 2d 70 61 74 68 29 29 0a 0a 28 64 65 66  tem-path))..(def
5fb0: 69 6e 65 20 28 64 62 3a 74 65 73 74 2d 73 65 74  ine (db:test-set
5fc0: 2d 6c 6f 67 21 20 64 62 20 74 65 73 74 2d 69 64  -log! db test-id
5fd0: 20 6c 6f 67 66 29 0a 20 20 28 69 66 20 28 73 74   logf).  (if (st
5fe0: 72 69 6e 67 3f 20 6c 6f 67 66 29 0a 20 20 20 20  ring? logf).    
5ff0: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
6000: 74 65 20 64 62 20 22 55 50 44 41 54 45 20 74 65  te db "UPDATE te
6010: 73 74 73 20 53 45 54 20 66 69 6e 61 6c 5f 6c 6f  sts SET final_lo
6020: 67 66 3d 3f 20 57 48 45 52 45 20 69 64 3d 3f 3b  gf=? WHERE id=?;
6030: 22 0a 09 09 20 20 20 6c 6f 67 66 20 74 65 73 74  "...   logf test
6040: 2d 69 64 29 0a 20 20 20 20 20 20 28 64 65 62 75  -id).      (debu
6050: 67 3a 70 72 69 6e 74 20 30 20 22 45 52 52 4f 52  g:print 0 "ERROR
6060: 3a 20 64 62 3a 74 65 73 74 2d 73 65 74 2d 6c 6f  : db:test-set-lo
6070: 67 21 20 63 61 6c 6c 65 64 20 77 69 74 68 20 6e  g! called with n
6080: 6f 6e 2d 73 74 72 69 6e 67 20 6c 6f 67 20 66 69  on-string log fi
6090: 6c 65 20 6e 61 6d 65 20 22 20 6c 6f 67 66 29 29  le name " logf))
60a0: 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  )..;;===========
60b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
60c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
60d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
60e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 4d  ===========.;; M
60f0: 69 73 63 2e 20 74 65 73 74 20 72 65 6c 61 74 65  isc. test relate
6100: 64 20 71 75 65 72 69 65 73 0a 3b 3b 3d 3d 3d 3d  d queries.;;====
6110: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6120: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6130: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6140: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6150: 3d 3d 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  ==..(define (db:
6160: 74 65 73 74 2d 67 65 74 2d 70 61 74 68 73 2d 6d  test-get-paths-m
6170: 61 74 63 68 69 6e 67 20 64 62 20 6b 65 79 6e 61  atching db keyna
6180: 6d 65 73 20 74 61 72 67 65 74 29 0a 20 20 28 6c  mes target).  (l
6190: 65 74 2a 20 28 28 72 65 73 20 27 28 29 29 0a 09  et* ((res '())..
61a0: 20 28 69 74 65 6d 70 61 74 74 20 20 20 28 69 66   (itempatt   (if
61b0: 20 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22   (args:get-arg "
61c0: 2d 69 74 65 6d 70 61 74 74 22 29 28 61 72 67 73  -itempatt")(args
61d0: 3a 67 65 74 2d 61 72 67 20 22 2d 69 74 65 6d 70  :get-arg "-itemp
61e0: 61 74 74 22 29 20 22 25 22 29 29 0a 09 20 28 74  att") "%")).. (t
61f0: 65 73 74 70 61 74 74 20 20 20 28 69 66 20 28 61  estpatt   (if (a
6200: 72 67 73 3a 67 65 74 2d 61 72 67 20 22 2d 74 65  rgs:get-arg "-te
6210: 73 74 70 61 74 74 22 29 28 61 72 67 73 3a 67 65  stpatt")(args:ge
6220: 74 2d 61 72 67 20 22 2d 74 65 73 74 70 61 74 74  t-arg "-testpatt
6230: 22 29 20 22 25 22 29 29 0a 09 20 28 73 74 61 74  ") "%")).. (stat
6240: 65 70 61 74 74 20 20 28 69 66 20 28 61 72 67 73  epatt  (if (args
6250: 3a 67 65 74 2d 61 72 67 20 22 3a 73 74 61 74 65  :get-arg ":state
6260: 22 29 20 20 20 28 61 72 67 73 3a 67 65 74 2d 61  ")   (args:get-a
6270: 72 67 20 22 3a 73 74 61 74 65 22 29 20 20 20 20  rg ":state")    
6280: 22 25 22 29 29 0a 09 20 28 73 74 61 74 75 73 70  "%")).. (statusp
6290: 61 74 74 20 28 69 66 20 28 61 72 67 73 3a 67 65  att (if (args:ge
62a0: 74 2d 61 72 67 20 22 3a 73 74 61 74 75 73 22 29  t-arg ":status")
62b0: 20 20 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20    (args:get-arg 
62c0: 22 3a 73 74 61 74 75 73 22 29 20 20 20 22 25 22  ":status")   "%"
62d0: 29 29 0a 09 20 28 72 75 6e 6e 61 6d 65 20 20 20  )).. (runname   
62e0: 20 28 69 66 20 28 61 72 67 73 3a 67 65 74 2d 61   (if (args:get-a
62f0: 72 67 20 22 3a 72 75 6e 6e 61 6d 65 22 29 20 28  rg ":runname") (
6300: 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22 3a 72  args:get-arg ":r
6310: 75 6e 6e 61 6d 65 22 29 20 20 22 25 22 29 29 0a  unname")  "%")).
6320: 09 20 28 6b 65 79 73 74 72 20 28 73 74 72 69 6e  . (keystr (strin
6330: 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 0a 09  g-intersperse ..
6340: 09 20 20 28 6d 61 70 20 28 6c 61 6d 62 64 61 20  .  (map (lambda 
6350: 28 6b 65 79 20 76 61 6c 29 0a 09 09 09 20 28 63  (key val).... (c
6360: 6f 6e 63 20 22 72 2e 22 20 6b 65 79 20 22 20 6c  onc "r." key " l
6370: 69 6b 65 20 27 22 20 76 61 6c 20 22 27 22 29 29  ike '" val "'"))
6380: 0a 09 09 20 20 20 20 20 20 20 6b 65 79 6e 61 6d  ...       keynam
6390: 65 73 20 0a 09 09 20 20 20 20 20 20 20 28 73 74  es ...       (st
63a0: 72 69 6e 67 2d 73 70 6c 69 74 20 74 61 72 67 65  ring-split targe
63b0: 74 20 22 2f 22 29 29 0a 09 09 20 20 22 20 41 4e  t "/"))...  " AN
63c0: 44 20 22 29 29 0a 09 20 28 71 72 79 73 74 72 20  D ")).. (qrystr 
63d0: 28 63 6f 6e 63 20 22 53 45 4c 45 43 54 20 74 2e  (conc "SELECT t.
63e0: 72 75 6e 64 69 72 20 46 52 4f 4d 20 74 65 73 74  rundir FROM test
63f0: 73 20 41 53 20 74 20 49 4e 4e 45 52 20 4a 4f 49  s AS t INNER JOI
6400: 4e 20 72 75 6e 73 20 41 53 20 72 20 4f 4e 20 74  N runs AS r ON t
6410: 2e 72 75 6e 5f 69 64 3d 72 2e 69 64 20 57 48 45  .run_id=r.id WHE
6420: 52 45 20 22 0a 09 09 20 20 20 20 20 20 20 6b 65  RE "...       ke
6430: 79 73 74 72 20 22 20 41 4e 44 20 72 2e 72 75 6e  ystr " AND r.run
6440: 6e 61 6d 65 20 4c 49 4b 45 20 27 22 20 72 75 6e  name LIKE '" run
6450: 6e 61 6d 65 20 22 27 20 41 4e 44 20 69 74 65 6d  name "' AND item
6460: 5f 70 61 74 68 20 4c 49 4b 45 20 27 22 20 69 74  _path LIKE '" it
6470: 65 6d 70 61 74 74 20 22 27 20 41 4e 44 20 74 65  empatt "' AND te
6480: 73 74 6e 61 6d 65 20 4c 49 4b 45 20 27 22 0a 09  stname LIKE '"..
6490: 09 20 20 20 20 20 20 20 74 65 73 74 70 61 74 74  .       testpatt
64a0: 20 22 27 20 41 4e 44 20 74 2e 73 74 61 74 65 20   "' AND t.state 
64b0: 4c 49 4b 45 20 27 22 20 73 74 61 74 65 70 61 74  LIKE '" statepat
64c0: 74 20 22 27 20 41 4e 44 20 74 2e 73 74 61 74 75  t "' AND t.statu
64d0: 73 20 4c 49 4b 45 20 27 22 20 73 74 61 74 75 73  s LIKE '" status
64e0: 70 61 74 74 20 0a 09 09 20 20 20 20 20 20 20 22  patt ...       "
64f0: 27 4f 52 44 45 52 20 42 59 20 74 2e 65 76 65 6e  'ORDER BY t.even
6500: 74 5f 74 69 6d 65 20 41 53 43 3b 22 29 29 29 0a  t_time ASC;"))).
6510: 20 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74      (debug:print
6520: 20 33 20 22 71 72 79 73 74 72 3a 20 22 20 71 72   3 "qrystr: " qr
6530: 79 73 74 72 29 0a 20 20 20 20 28 73 71 6c 69 74  ystr).    (sqlit
6540: 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20  e3:for-each-row 
6550: 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 70  .     (lambda (p
6560: 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72  ).       (set! r
6570: 65 73 20 28 63 6f 6e 73 20 70 20 72 65 73 29 29  es (cons p res))
6580: 29 0a 20 20 20 20 20 64 62 20 0a 20 20 20 20 20  ).     db .     
6590: 71 72 79 73 74 72 29 0a 20 20 20 20 72 65 73 29  qrystr).    res)
65a0: 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 74  )..(define (db:t
65b0: 65 73 74 2d 67 65 74 2d 74 65 73 74 2d 72 65 63  est-get-test-rec
65c0: 6f 72 64 73 2d 6d 61 74 63 68 69 6e 67 20 64 62  ords-matching db
65d0: 20 6b 65 79 6e 61 6d 65 73 20 74 61 72 67 65 74   keynames target
65e0: 29 0a 20 20 28 6c 65 74 2a 20 28 28 72 65 73 20  ).  (let* ((res 
65f0: 27 28 29 29 0a 09 20 28 69 74 65 6d 70 61 74 74  '()).. (itempatt
6600: 20 20 20 28 69 66 20 28 61 72 67 73 3a 67 65 74     (if (args:get
6610: 2d 61 72 67 20 22 2d 69 74 65 6d 70 61 74 74 22  -arg "-itempatt"
6620: 29 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22  )(args:get-arg "
6630: 2d 69 74 65 6d 70 61 74 74 22 29 20 22 25 22 29  -itempatt") "%")
6640: 29 0a 09 20 28 74 65 73 74 70 61 74 74 20 20 20  ).. (testpatt   
6650: 28 69 66 20 28 61 72 67 73 3a 67 65 74 2d 61 72  (if (args:get-ar
6660: 67 20 22 2d 74 65 73 74 70 61 74 74 22 29 28 61  g "-testpatt")(a
6670: 72 67 73 3a 67 65 74 2d 61 72 67 20 22 2d 74 65  rgs:get-arg "-te
6680: 73 74 70 61 74 74 22 29 20 22 25 22 29 29 0a 09  stpatt") "%"))..
6690: 20 28 73 74 61 74 65 70 61 74 74 20 20 28 69 66   (statepatt  (if
66a0: 20 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22   (args:get-arg "
66b0: 3a 73 74 61 74 65 22 29 20 20 20 28 61 72 67 73  :state")   (args
66c0: 3a 67 65 74 2d 61 72 67 20 22 3a 73 74 61 74 65  :get-arg ":state
66d0: 22 29 20 20 20 20 22 25 22 29 29 0a 09 20 28 73  ")    "%")).. (s
66e0: 74 61 74 75 73 70 61 74 74 20 28 69 66 20 28 61  tatuspatt (if (a
66f0: 72 67 73 3a 67 65 74 2d 61 72 67 20 22 3a 73 74  rgs:get-arg ":st
6700: 61 74 75 73 22 29 20 20 28 61 72 67 73 3a 67 65  atus")  (args:ge
6710: 74 2d 61 72 67 20 22 3a 73 74 61 74 75 73 22 29  t-arg ":status")
6720: 20 20 20 22 25 22 29 29 0a 09 20 28 72 75 6e 6e     "%")).. (runn
6730: 61 6d 65 20 20 20 20 28 69 66 20 28 61 72 67 73  ame    (if (args
6740: 3a 67 65 74 2d 61 72 67 20 22 3a 72 75 6e 6e 61  :get-arg ":runna
6750: 6d 65 22 29 20 28 61 72 67 73 3a 67 65 74 2d 61  me") (args:get-a
6760: 72 67 20 22 3a 72 75 6e 6e 61 6d 65 22 29 20 20  rg ":runname")  
6770: 22 25 22 29 29 0a 09 20 28 6b 65 79 73 74 72 20  "%")).. (keystr 
6780: 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65  (string-interspe
6790: 72 73 65 20 0a 09 09 20 20 28 6d 61 70 20 28 6c  rse ...  (map (l
67a0: 61 6d 62 64 61 20 28 6b 65 79 20 76 61 6c 29 0a  ambda (key val).
67b0: 09 09 09 20 28 63 6f 6e 63 20 22 72 2e 22 20 6b  ... (conc "r." k
67c0: 65 79 20 22 20 6c 69 6b 65 20 27 22 20 76 61 6c  ey " like '" val
67d0: 20 22 27 22 29 29 0a 09 09 20 20 20 20 20 20 20   "'"))...       
67e0: 6b 65 79 6e 61 6d 65 73 20 0a 09 09 20 20 20 20  keynames ...    
67f0: 20 20 20 28 73 74 72 69 6e 67 2d 73 70 6c 69 74     (string-split
6800: 20 74 61 72 67 65 74 20 22 2f 22 29 29 0a 09 09   target "/"))...
6810: 20 20 22 20 41 4e 44 20 22 29 29 0a 09 20 28 71    " AND ")).. (q
6820: 72 79 73 74 72 20 28 63 6f 6e 63 20 22 53 45 4c  rystr (conc "SEL
6830: 45 43 54 20 0a 20 20 20 20 20 20 20 20 20 20 20  ECT .           
6840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6850: 20 74 2e 69 64 0a 20 20 20 20 20 20 20 20 20 20   t.id.          
6860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6870: 20 20 74 2e 72 75 6e 5f 69 64 20 20 20 20 20 0a    t.run_id     .
6880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6890: 20 20 20 20 20 20 20 20 20 20 20 20 74 2e 74 65              t.te
68a0: 73 74 6e 61 6d 65 20 20 20 0a 20 20 20 20 20 20  stname   .      
68b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68c0: 20 20 20 20 20 20 74 2e 68 6f 73 74 20 20 20 20        t.host    
68d0: 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20     .            
68e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68f0: 74 2e 63 70 75 6c 6f 61 64 20 20 20 20 0a 20 20  t.cpuload    .  
6900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6910: 20 20 20 20 20 20 20 20 20 20 74 2e 64 69 73 6b            t.disk
6920: 66 72 65 65 20 20 20 0a 20 20 20 20 20 20 20 20  free   .        
6930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6940: 20 20 20 20 74 2e 75 6e 61 6d 65 20 20 20 20 20      t.uname     
6950: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
6960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 2e                t.
6970: 72 75 6e 64 69 72 20 20 20 20 20 0a 20 20 20 20  rundir     .    
6980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6990: 20 20 20 20 20 20 20 20 74 2e 73 68 6f 72 74 64          t.shortd
69a0: 69 72 20 20 20 0a 20 20 20 20 20 20 20 20 20 20  ir   .          
69b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69c0: 20 20 74 2e 69 74 65 6d 5f 70 61 74 68 20 20 0a    t.item_path  .
69d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69e0: 20 20 20 20 20 20 20 20 20 20 20 20 74 2e 73 74              t.st
69f0: 61 74 65 20 20 20 20 20 20 0a 20 20 20 20 20 20  ate      .      
6a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a10: 20 20 20 20 20 20 74 2e 73 74 61 74 75 73 20 20        t.status  
6a20: 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20     .            
6a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a40: 74 2e 61 74 74 65 6d 70 74 6e 75 6d 20 0a 20 20  t.attemptnum .  
6a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a60: 20 20 20 20 20 20 20 20 20 20 74 2e 66 69 6e 61            t.fina
6a70: 6c 5f 6c 6f 67 66 20 0a 20 20 20 20 20 20 20 20  l_logf .        
6a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a90: 20 20 20 20 74 2e 6c 6f 67 64 61 74 20 20 20 20      t.logdat    
6aa0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
6ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 2e                t.
6ac0: 72 75 6e 5f 64 75 72 61 74 69 6f 0a 20 20 20 20  run_duratio.    
6ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ae0: 20 20 20 20 20 20 20 20 74 2e 63 6f 6d 6d 65 6e          t.commen
6af0: 74 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20  t    .          
6b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b10: 20 20 74 2e 65 76 65 6e 74 5f 74 69 6d 65 20 0a    t.event_time .
6b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b30: 20 20 20 20 20 20 20 20 20 20 20 20 74 2e 66 61              t.fa
6b40: 69 6c 5f 63 6f 75 6e 74 20 0a 20 20 20 20 20 20  il_count .      
6b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b60: 20 20 20 20 20 20 74 2e 70 61 73 73 5f 63 6f 75        t.pass_cou
6b70: 6e 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  nt .            
6b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b90: 74 2e 61 72 63 68 69 76 65 64 20 20 20 0a 0a 0a  t.archived   ...
6ba0: 0a 20 46 52 4f 4d 20 74 65 73 74 73 20 41 53 20  . FROM tests AS 
6bb0: 74 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 72 75 6e  t INNER JOIN run
6bc0: 73 20 41 53 20 72 20 4f 4e 20 74 2e 72 75 6e 5f  s AS r ON t.run_
6bd0: 69 64 3d 72 2e 69 64 20 57 48 45 52 45 20 22 0a  id=r.id WHERE ".
6be0: 09 09 20 20 20 20 20 20 20 6b 65 79 73 74 72 20  ..       keystr 
6bf0: 22 20 41 4e 44 20 72 2e 72 75 6e 6e 61 6d 65 20  " AND r.runname 
6c00: 4c 49 4b 45 20 27 22 20 72 75 6e 6e 61 6d 65 20  LIKE '" runname 
6c10: 22 27 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68  "' AND item_path
6c20: 20 4c 49 4b 45 20 27 22 20 69 74 65 6d 70 61 74   LIKE '" itempat
6c30: 74 20 22 27 20 41 4e 44 20 74 65 73 74 6e 61 6d  t "' AND testnam
6c40: 65 20 4c 49 4b 45 20 27 22 0a 09 09 20 20 20 20  e LIKE '"...    
6c50: 20 20 20 74 65 73 74 70 61 74 74 20 22 27 20 41     testpatt "' A
6c60: 4e 44 20 74 2e 73 74 61 74 65 20 4c 49 4b 45 20  ND t.state LIKE 
6c70: 27 22 20 73 74 61 74 65 70 61 74 74 20 22 27 20  '" statepatt "' 
6c80: 41 4e 44 20 74 2e 73 74 61 74 75 73 20 4c 49 4b  AND t.status LIK
6c90: 45 20 27 22 20 73 74 61 74 75 73 70 61 74 74 20  E '" statuspatt 
6ca0: 0a 09 09 20 20 20 20 20 20 20 22 27 4f 52 44 45  ...       "'ORDE
6cb0: 52 20 42 59 20 74 2e 65 76 65 6e 74 5f 74 69 6d  R BY t.event_tim
6cc0: 65 20 41 53 43 3b 22 29 29 29 0a 20 20 20 20 28  e ASC;"))).    (
6cd0: 64 65 62 75 67 3a 70 72 69 6e 74 20 33 20 22 71  debug:print 3 "q
6ce0: 72 79 73 74 72 3a 20 22 20 71 72 79 73 74 72 29  rystr: " qrystr)
6cf0: 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f  .    (sqlite3:fo
6d00: 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20 20 20  r-each-row .    
6d10: 20 28 6c 61 6d 62 64 61 20 28 70 29 0a 20 20 20   (lambda (p).   
6d20: 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28 63      (set! res (c
6d30: 6f 6e 73 20 70 20 72 65 73 29 29 29 0a 20 20 20  ons p res))).   
6d40: 20 20 64 62 20 0a 20 20 20 20 20 71 72 79 73 74    db .     qryst
6d50: 72 29 0a 20 20 20 20 72 65 73 29 29 0a 0a 3b 3b  r).    res))..;;
6d60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6d70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6d80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6d90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6da0: 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 51 55 45 55 45 20  ======.;; QUEUE 
6db0: 55 50 20 4d 45 54 41 2c 20 54 45 53 54 20 53 54  UP META, TEST ST
6dc0: 41 54 55 53 20 41 4e 44 20 53 54 45 50 53 0a 3b  ATUS AND STEPS.;
6dd0: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;===============
6de0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6df0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6e00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6e10: 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65 66 69 6e 65  =======..(define
6e20: 20 28 64 62 3a 75 70 64 61 74 65 72 20 64 62 29   (db:updater db)
6e30: 0a 20 20 28 6c 65 74 20 6c 6f 6f 70 20 28 28 73  .  (let loop ((s
6e40: 74 61 72 74 2d 74 69 6d 65 20 28 63 75 72 72 65  tart-time (curre
6e50: 6e 74 2d 74 69 6d 65 29 29 29 0a 20 20 20 20 28  nt-time))).    (
6e60: 74 68 72 65 61 64 2d 73 6c 65 65 70 21 20 30 2e  thread-sleep! 0.
6e70: 35 29 20 3b 3b 20 6d 6f 76 65 20 73 61 76 65 20  5) ;; move save 
6e80: 74 69 6d 65 20 61 72 6f 75 6e 64 20 74 6f 20 6d  time around to m
6e90: 69 6e 69 6d 69 7a 65 20 72 65 67 75 6c 61 72 20  inimize regular 
6ea0: 63 6f 6c 6c 69 73 69 6f 6e 73 3f 0a 20 20 20 20  collisions?.    
6eb0: 28 64 62 3a 77 72 69 74 65 2d 63 61 63 68 65 64  (db:write-cached
6ec0: 2d 64 61 74 61 20 64 62 29 0a 20 20 20 20 28 6c  -data db).    (l
6ed0: 6f 6f 70 20 73 74 61 72 74 2d 74 69 6d 65 29 29  oop start-time))
6ee0: 29 0a 20 20 20 20 0a 28 64 65 66 69 6e 65 20 28  ).    .(define (
6ef0: 64 62 3a 74 65 73 74 2d 75 70 64 61 74 65 2d 6d  db:test-update-m
6f00: 65 74 61 2d 69 6e 66 6f 20 64 62 20 72 75 6e 2d  eta-info db run-
6f10: 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65  id test-name ite
6f20: 6d 2d 70 61 74 68 20 6d 69 6e 75 74 65 73 20 63  m-path minutes c
6f30: 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20  puload diskfree 
6f40: 74 6d 70 66 72 65 65 29 0a 20 20 28 69 66 20 28  tmpfree).  (if (
6f50: 6e 6f 74 20 69 74 65 6d 2d 70 61 74 68 29 0a 20  not item-path). 
6f60: 20 20 20 20 20 28 62 65 67 69 6e 20 28 64 65 62       (begin (deb
6f70: 75 67 3a 70 72 69 6e 74 20 30 20 22 57 41 52 4e  ug:print 0 "WARN
6f80: 49 4e 47 3a 20 49 54 45 4d 50 41 54 48 20 6e 6f  ING: ITEMPATH no
6f90: 74 20 73 65 74 2e 22 29 20 20 20 0a 09 20 20 20  t set.")   ..   
6fa0: 20 20 28 73 65 74 21 20 69 74 65 6d 2d 70 61 74    (set! item-pat
6fb0: 68 20 22 22 29 29 29 0a 20 20 28 6d 75 74 65 78  h ""))).  (mutex
6fc0: 2d 6c 6f 63 6b 21 20 2a 69 6e 63 6f 6d 69 6e 67  -lock! *incoming
6fd0: 2d 6d 75 74 65 78 2a 29 0a 20 20 28 73 65 74 21  -mutex*).  (set!
6fe0: 20 2a 69 6e 63 6f 6d 69 6e 67 2d 64 61 74 61 2a   *incoming-data*
6ff0: 20 28 63 6f 6e 73 20 28 76 65 63 74 6f 72 20 27   (cons (vector '
7000: 6d 65 74 61 2d 69 6e 66 6f 0a 09 09 09 09 20 20  meta-info.....  
7010: 20 20 20 20 28 63 75 72 72 65 6e 74 2d 73 65 63      (current-sec
7020: 6f 6e 64 73 29 0a 09 09 09 09 20 20 20 20 20 20  onds).....      
7030: 28 6c 69 73 74 20 63 70 75 6c 6f 61 64 0a 09 09  (list cpuload...
7040: 09 09 09 20 20 20 20 64 69 73 6b 66 72 65 65 0a  ...    diskfree.
7050: 09 09 09 09 09 20 20 20 20 6d 69 6e 75 74 65 73  .....    minutes
7060: 0a 09 09 09 09 09 20 20 20 20 72 75 6e 2d 69 64  ......    run-id
7070: 0a 09 09 09 09 09 20 20 20 20 74 65 73 74 2d 6e  ......    test-n
7080: 61 6d 65 0a 09 09 09 09 09 20 20 20 20 69 74 65  ame......    ite
7090: 6d 2d 70 61 74 68 29 29 20 3b 3b 20 72 75 6e 2d  m-path)) ;; run-
70a0: 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65  id test-name ite
70b0: 6d 2d 70 61 74 68 20 6d 69 6e 75 74 65 73 20 63  m-path minutes c
70c0: 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20  puload diskfree 
70d0: 74 6d 70 66 72 65 65 29 20 0a 09 09 09 20 20 20  tmpfree) ....   
70e0: 20 20 20 2a 69 6e 63 6f 6d 69 6e 67 2d 64 61 74     *incoming-dat
70f0: 61 2a 29 29 0a 20 20 28 6d 75 74 65 78 2d 75 6e  a*)).  (mutex-un
7100: 6c 6f 63 6b 21 20 2a 69 6e 63 6f 6d 69 6e 67 2d  lock! *incoming-
7110: 6d 75 74 65 78 2a 29 0a 20 20 28 69 66 20 28 6e  mutex*).  (if (n
7120: 6f 74 20 2a 63 61 63 68 65 2d 6f 6e 2a 29 28 64  ot *cache-on*)(d
7130: 62 3a 77 72 69 74 65 2d 63 61 63 68 65 64 2d 64  b:write-cached-d
7140: 61 74 61 20 64 62 29 29 29 0a 0a 28 64 65 66 69  ata db)))..(defi
7150: 6e 65 20 28 64 62 3a 77 72 69 74 65 2d 63 61 63  ne (db:write-cac
7160: 68 65 64 2d 64 61 74 61 20 64 62 29 0a 20 20 28  hed-data db).  (
7170: 6c 65 74 20 28 28 6d 65 74 61 2d 73 74 6d 74 20  let ((meta-stmt 
7180: 28 73 71 6c 69 74 65 33 3a 70 72 65 70 61 72 65  (sqlite3:prepare
7190: 20 64 62 20 22 55 50 44 41 54 45 20 74 65 73 74   db "UPDATE test
71a0: 73 20 53 45 54 20 63 70 75 6c 6f 61 64 3d 3f 2c  s SET cpuload=?,
71b0: 64 69 73 6b 66 72 65 65 3d 3f 2c 72 75 6e 5f 64  diskfree=?,run_d
71c0: 75 72 61 74 69 6f 6e 3d 3f 2c 73 74 61 74 65 3d  uration=?,state=
71d0: 27 52 55 4e 4e 49 4e 47 27 20 57 48 45 52 45 20  'RUNNING' WHERE 
71e0: 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73  run_id=? AND tes
71f0: 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d  tname=? AND item
7200: 5f 70 61 74 68 3d 3f 20 41 4e 44 20 73 74 61 74  _path=? AND stat
7210: 65 20 4e 4f 54 20 49 4e 20 28 27 43 4f 4d 50 4c  e NOT IN ('COMPL
7220: 45 54 45 44 27 2c 27 4b 49 4c 4c 52 45 51 27 2c  ETED','KILLREQ',
7230: 27 4b 49 4c 4c 45 44 27 29 3b 22 29 29 0a 09 28  'KILLED');"))..(
7240: 73 74 65 70 2d 73 74 6d 74 20 28 73 71 6c 69 74  step-stmt (sqlit
7250: 65 33 3a 70 72 65 70 61 72 65 20 64 62 20 22 49  e3:prepare db "I
7260: 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45  NSERT OR REPLACE
7270: 20 69 6e 74 6f 20 74 65 73 74 5f 73 74 65 70 73   into test_steps
7280: 20 28 74 65 73 74 5f 69 64 2c 73 74 65 70 6e 61   (test_id,stepna
7290: 6d 65 2c 73 74 61 74 65 2c 73 74 61 74 75 73 2c  me,state,status,
72a0: 65 76 65 6e 74 5f 74 69 6d 65 2c 63 6f 6d 6d 65  event_time,comme
72b0: 6e 74 2c 6c 6f 67 66 69 6c 65 29 20 56 41 4c 55  nt,logfile) VALU
72c0: 45 53 28 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f  ES(?,?,?,?,?,?,?
72d0: 29 3b 22 29 29 20 3b 3b 20 73 74 72 66 74 69 6d  );")) ;; strftim
72e0: 65 28 27 25 73 27 2c 27 6e 6f 77 27 29 23 66 29  e('%s','now')#f)
72f0: 0a 09 28 64 61 74 61 20 28 73 6f 72 74 20 2a 69  ..(data (sort *i
7300: 6e 63 6f 6d 69 6e 67 2d 64 61 74 61 2a 20 28 6c  ncoming-data* (l
7310: 61 6d 62 64 61 20 28 61 20 62 29 28 3c 20 28 76  ambda (a b)(< (v
7320: 65 63 74 6f 72 2d 72 65 66 20 61 20 31 29 28 76  ector-ref a 1)(v
7330: 65 63 74 6f 72 2d 72 65 66 20 62 20 31 29 29 29  ector-ref b 1)))
7340: 29 29 29 0a 20 20 20 20 28 69 66 20 28 3e 20 28  ))).    (if (> (
7350: 6c 65 6e 67 74 68 20 64 61 74 61 29 20 30 29 0a  length data) 0).
7360: 09 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20  .(debug:print 4 
7370: 22 57 72 69 74 69 6e 67 20 63 61 63 68 65 64 20  "Writing cached 
7380: 64 61 74 61 20 22 20 64 61 74 61 29 29 0a 20 20  data " data)).  
7390: 20 20 28 6d 75 74 65 78 2d 6c 6f 63 6b 21 20 2a    (mutex-lock! *
73a0: 69 6e 63 6f 6d 69 6e 67 2d 6d 75 74 65 78 2a 29  incoming-mutex*)
73b0: 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 77 69  .    (sqlite3:wi
73c0: 74 68 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  th-transaction .
73d0: 20 20 20 20 20 64 62 0a 20 20 20 20 20 28 6c 61       db.     (la
73e0: 6d 62 64 61 20 28 29 0a 20 20 20 20 20 20 20 28  mbda ().       (
73f0: 66 6f 72 2d 65 61 63 68 20 28 6c 61 6d 62 64 61  for-each (lambda
7400: 20 28 65 6e 74 72 79 29 0a 09 09 20 20 20 28 63   (entry)...   (c
7410: 61 73 65 20 28 76 65 63 74 6f 72 2d 72 65 66 20  ase (vector-ref 
7420: 65 6e 74 72 79 20 30 29 0a 09 09 20 20 20 20 20  entry 0)...     
7430: 28 28 6d 65 74 61 2d 69 6e 66 6f 29 0a 09 09 20  ((meta-info)... 
7440: 20 20 20 20 20 28 61 70 70 6c 79 20 73 71 6c 69       (apply sqli
7450: 74 65 33 3a 65 78 65 63 75 74 65 20 6d 65 74 61  te3:execute meta
7460: 2d 73 74 6d 74 20 28 76 65 63 74 6f 72 2d 72 65  -stmt (vector-re
7470: 66 20 65 6e 74 72 79 20 32 29 29 29 0a 09 09 20  f entry 2)))... 
7480: 20 20 20 20 28 28 73 74 65 70 2d 73 74 61 74 75      ((step-statu
7490: 73 29 0a 09 09 20 20 20 20 20 20 28 61 70 70 6c  s)...      (appl
74a0: 79 20 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74  y sqlite3:execut
74b0: 65 20 73 74 65 70 2d 73 74 6d 74 20 28 76 65 63  e step-stmt (vec
74c0: 74 6f 72 2d 72 65 66 20 65 6e 74 72 79 20 32 29  tor-ref entry 2)
74d0: 29 29 0a 09 09 20 20 20 20 20 28 65 6c 73 65 0a  ))...     (else.
74e0: 09 09 20 20 20 20 20 20 28 64 65 62 75 67 3a 70  ..      (debug:p
74f0: 72 69 6e 74 20 30 20 22 45 52 52 4f 52 3a 20 51  rint 0 "ERROR: Q
7500: 75 65 75 65 64 20 65 6e 74 72 79 20 6e 6f 74 20  ueued entry not 
7510: 72 65 63 6f 67 6e 69 73 65 64 20 22 20 65 6e 74  recognised " ent
7520: 72 79 29 29 29 29 0a 09 09 20 64 61 74 61 29 29  ry))))... data))
7530: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66  ).    (sqlite3:f
7540: 69 6e 61 6c 69 7a 65 21 20 6d 65 74 61 2d 73 74  inalize! meta-st
7550: 6d 74 29 20 3b 3b 20 73 71 6c 69 74 65 20 69 73  mt) ;; sqlite is
7560: 20 74 68 65 20 62 6f 74 74 6c 65 6e 65 63 6b 2c   the bottleneck,
7570: 20 63 6c 65 61 72 20 74 68 65 20 73 74 61 74 65   clear the state
7580: 6d 65 6e 74 73 20 61 73 61 70 3f 0a 20 20 20 20  ments asap?.    
7590: 28 73 71 6c 69 74 65 33 3a 66 69 6e 61 6c 69 7a  (sqlite3:finaliz
75a0: 65 21 20 73 74 65 70 2d 73 74 6d 74 29 0a 20 20  e! step-stmt).  
75b0: 20 20 28 73 65 74 21 20 2a 69 6e 63 6f 6d 69 6e    (set! *incomin
75c0: 67 2d 64 61 74 61 2a 20 27 28 29 29 0a 20 20 20  g-data* '()).   
75d0: 20 28 6d 75 74 65 78 2d 75 6e 6c 6f 63 6b 21 20   (mutex-unlock! 
75e0: 2a 69 6e 63 6f 6d 69 6e 67 2d 6d 75 74 65 78 2a  *incoming-mutex*
75f0: 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62  )))..(define (db
7600: 3a 72 6f 6c 6c 2d 75 70 2d 70 61 73 73 2d 66 61  :roll-up-pass-fa
7610: 69 6c 2d 63 6f 75 6e 74 73 20 64 62 20 72 75 6e  il-counts db run
7620: 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74  -id test-name it
7630: 65 6d 2d 70 61 74 68 20 73 74 61 74 75 73 29 0a  em-path status).
7640: 20 20 28 69 66 20 28 61 6e 64 20 28 6e 6f 74 20    (if (and (not 
7650: 28 65 71 75 61 6c 3f 20 69 74 65 6d 2d 70 61 74  (equal? item-pat
7660: 68 20 22 22 29 29 0a 09 20 20 20 28 6f 72 20 28  h ""))..   (or (
7670: 65 71 75 61 6c 3f 20 73 74 61 74 75 73 20 22 50  equal? status "P
7680: 41 53 53 22 29 0a 09 20 20 20 20 20 20 20 28 65  ASS")..       (e
7690: 71 75 61 6c 3f 20 73 74 61 74 75 73 20 22 57 41  qual? status "WA
76a0: 52 4e 22 29 0a 09 20 20 20 20 20 20 20 28 65 71  RN")..       (eq
76b0: 75 61 6c 3f 20 73 74 61 74 75 73 20 22 46 41 49  ual? status "FAI
76c0: 4c 22 29 0a 09 20 20 20 20 20 20 20 28 65 71 75  L")..       (equ
76d0: 61 6c 3f 20 73 74 61 74 75 73 20 22 57 41 49 56  al? status "WAIV
76e0: 45 44 22 29 0a 09 20 20 20 20 20 20 20 28 65 71  ED")..       (eq
76f0: 75 61 6c 3f 20 73 74 61 74 75 73 20 22 52 55 4e  ual? status "RUN
7700: 4e 49 4e 47 22 29 29 29 0a 20 20 20 20 20 20 28  NING"))).      (
7710: 62 65 67 69 6e 0a 09 28 73 71 6c 69 74 65 33 3a  begin..(sqlite3:
7720: 65 78 65 63 75 74 65 20 0a 09 20 64 62 0a 09 20  execute .. db.. 
7730: 22 55 50 44 41 54 45 20 74 65 73 74 73 20 0a 20  "UPDATE tests . 
7740: 20 20 20 20 20 20 20 20 20 20 20 20 53 45 54 20              SET 
7750: 66 61 69 6c 5f 63 6f 75 6e 74 3d 28 53 45 4c 45  fail_count=(SELE
7760: 43 54 20 63 6f 75 6e 74 28 69 64 29 20 46 52 4f  CT count(id) FRO
7770: 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 72 75  M tests WHERE ru
7780: 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e  n_id=? AND testn
7790: 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70  ame=? AND item_p
77a0: 61 74 68 20 21 3d 20 27 27 20 41 4e 44 20 73 74  ath != '' AND st
77b0: 61 74 75 73 3d 27 46 41 49 4c 27 29 2c 0a 20 20  atus='FAIL'),.  
77c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
77d0: 61 73 73 5f 63 6f 75 6e 74 3d 28 53 45 4c 45 43  ass_count=(SELEC
77e0: 54 20 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d  T count(id) FROM
77f0: 20 74 65 73 74 73 20 57 48 45 52 45 20 72 75 6e   tests WHERE run
7800: 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61  _id=? AND testna
7810: 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61  me=? AND item_pa
7820: 74 68 20 21 3d 20 27 27 20 41 4e 44 20 28 73 74  th != '' AND (st
7830: 61 74 75 73 3d 27 50 41 53 53 27 20 4f 52 20 73  atus='PASS' OR s
7840: 74 61 74 75 73 3d 27 57 41 52 4e 27 20 4f 52 20  tatus='WARN' OR 
7850: 73 74 61 74 75 73 3d 27 57 41 49 56 45 44 27 29  status='WAIVED')
7860: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 57  ).             W
7870: 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e  HERE run_id=? AN
7880: 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44  D testname=? AND
7890: 20 69 74 65 6d 5f 70 61 74 68 3d 27 27 3b 22 0a   item_path='';".
78a0: 09 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61  . run-id test-na
78b0: 6d 65 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e  me run-id test-n
78c0: 61 6d 65 20 72 75 6e 2d 69 64 20 74 65 73 74 2d  ame run-id test-
78d0: 6e 61 6d 65 29 0a 20 20 20 20 20 20 20 20 28 74  name).        (t
78e0: 68 72 65 61 64 2d 73 6c 65 65 70 21 20 30 2e 31  hread-sleep! 0.1
78f0: 29 20 3b 3b 20 67 69 76 65 20 6f 74 68 65 72 20  ) ;; give other 
7900: 70 72 6f 63 65 73 73 65 73 20 61 20 63 68 61 6e  processes a chan
7910: 63 65 20 68 65 72 65 0a 09 28 69 66 20 28 65 71  ce here..(if (eq
7920: 75 61 6c 3f 20 73 74 61 74 75 73 20 22 52 55 4e  ual? status "RUN
7930: 4e 49 4e 47 22 29 20 3b 3b 20 72 75 6e 6e 69 6e  NING") ;; runnin
7940: 67 20 74 61 6b 65 73 20 70 72 69 6f 72 69 74 79  g takes priority
7950: 20 6f 76 65 72 20 61 6c 6c 20 6f 74 68 65 72 20   over all other 
7960: 73 74 61 74 65 73 2c 20 66 6f 72 63 65 20 74 68  states, force th
7970: 65 20 74 65 73 74 20 73 74 61 74 65 20 74 6f 20  e test state to 
7980: 52 55 4e 4e 49 4e 47 0a 09 20 20 20 20 28 73 71  RUNNING..    (sq
7990: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62  lite3:execute db
79a0: 20 22 55 50 44 41 54 45 20 74 65 73 74 73 20 53   "UPDATE tests S
79b0: 45 54 20 73 74 61 74 65 3d 3f 20 57 48 45 52 45  ET state=? WHERE
79c0: 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65   run_id=? AND te
79d0: 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65  stname=? AND ite
79e0: 6d 5f 70 61 74 68 3d 27 27 3b 22 20 22 52 55 4e  m_path='';" "RUN
79f0: 4e 49 4e 47 22 20 72 75 6e 2d 69 64 20 74 65 73  NING" run-id tes
7a00: 74 2d 6e 61 6d 65 29 0a 09 20 20 20 20 28 73 71  t-name)..    (sq
7a10: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 0a 09 20  lite3:execute.. 
7a20: 20 20 20 20 64 62 0a 09 20 20 20 20 20 22 55 50      db..     "UP
7a30: 44 41 54 45 20 74 65 73 74 73 0a 20 20 20 20 20  DATE tests.     
7a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a50: 20 20 53 45 54 20 73 74 61 74 65 3d 43 41 53 45    SET state=CASE
7a60: 20 57 48 45 4e 20 28 53 45 4c 45 43 54 20 63 6f   WHEN (SELECT co
7a70: 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 74 65 73  unt(id) FROM tes
7a80: 74 73 20 57 48 45 52 45 20 72 75 6e 5f 69 64 3d  ts WHERE run_id=
7a90: 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f  ? AND testname=?
7aa0: 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 20 21   AND item_path !
7ab0: 3d 20 27 27 20 41 4e 44 20 73 74 61 74 65 20 69  = '' AND state i
7ac0: 6e 20 28 27 52 55 4e 4e 49 4e 47 27 2c 27 4e 4f  n ('RUNNING','NO
7ad0: 54 5f 53 54 41 52 54 45 44 27 29 29 20 3e 20 30  T_STARTED')) > 0
7ae0: 20 54 48 45 4e 20 0a 20 20 20 20 20 20 20 20 20   THEN .         
7af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b00: 20 27 52 55 4e 4e 49 4e 47 27 0a 20 20 20 20 20   'RUNNING'.     
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b20: 20 20 45 4c 53 45 20 27 43 4f 4d 50 4c 45 54 45    ELSE 'COMPLETE
7b30: 44 27 20 45 4e 44 2c 0a 20 20 20 20 20 20 20 20  D' END,.        
7b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b50: 20 20 73 74 61 74 75 73 3d 43 41 53 45 20 57 48    status=CASE WH
7b60: 45 4e 20 66 61 69 6c 5f 63 6f 75 6e 74 20 3e 20  EN fail_count > 
7b70: 30 20 54 48 45 4e 20 27 46 41 49 4c 27 20 57 48  0 THEN 'FAIL' WH
7b80: 45 4e 20 70 61 73 73 5f 63 6f 75 6e 74 20 3e 20  EN pass_count > 
7b90: 30 20 41 4e 44 20 66 61 69 6c 5f 63 6f 75 6e 74  0 AND fail_count
7ba0: 3d 30 20 54 48 45 4e 20 27 50 41 53 53 27 20 45  =0 THEN 'PASS' E
7bb0: 4c 53 45 20 27 55 4e 4b 4e 4f 57 4e 27 20 45 4e  LSE 'UNKNOWN' EN
7bc0: 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D.              
7bd0: 20 20 20 20 20 20 20 20 20 57 48 45 52 45 20 72           WHERE r
7be0: 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74  un_id=? AND test
7bf0: 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f  name=? AND item_
7c00: 70 61 74 68 3d 27 27 3b 22 0a 09 20 20 20 20 20  path='';"..     
7c10: 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65  run-id test-name
7c20: 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d   run-id test-nam
7c30: 65 29 29 0a 09 23 66 29 0a 20 20 20 20 20 20 23  e))..#f).      #
7c40: 66 29 29 0a 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d  f))...;;========
7c50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7c60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7c70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7c80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b  ==============.;
7c90: 3b 20 54 65 73 74 73 20 6d 65 74 61 20 64 61 74  ; Tests meta dat
7ca0: 61 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  a.;;============
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 3d  ================
7ce0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 72  ==========..;; r
7cf0: 65 61 64 20 74 68 65 20 72 65 63 6f 72 64 20 67  ead the record g
7d00: 69 76 65 6e 20 61 20 74 65 73 74 6e 61 6d 65 0a  iven a testname.
7d10: 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74  (define (db:test
7d20: 6d 65 74 61 2d 67 65 74 2d 72 65 63 6f 72 64 20  meta-get-record 
7d30: 64 62 20 74 65 73 74 6e 61 6d 65 29 0a 20 20 28  db testname).  (
7d40: 6c 65 74 20 28 28 72 65 73 20 23 66 29 29 0a 20  let ((res #f)). 
7d50: 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d     (sqlite3:for-
7d60: 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c  each-row.     (l
7d70: 61 6d 62 64 61 20 28 69 64 20 74 65 73 74 6e 61  ambda (id testna
7d80: 6d 65 20 61 75 74 68 6f 72 20 6f 77 6e 65 72 20  me author owner 
7d90: 64 65 73 63 72 69 70 74 69 6f 6e 20 72 65 76 69  description revi
7da0: 65 77 65 64 20 69 74 65 72 61 74 65 64 20 61 76  ewed iterated av
7db0: 67 5f 72 75 6e 74 69 6d 65 20 61 76 67 5f 64 69  g_runtime avg_di
7dc0: 73 6b 20 74 61 67 73 29 0a 20 20 20 20 20 20 20  sk tags).       
7dd0: 28 73 65 74 21 20 72 65 73 20 28 76 65 63 74 6f  (set! res (vecto
7de0: 72 20 69 64 20 74 65 73 74 6e 61 6d 65 20 61 75  r id testname au
7df0: 74 68 6f 72 20 6f 77 6e 65 72 20 64 65 73 63 72  thor owner descr
7e00: 69 70 74 69 6f 6e 20 72 65 76 69 65 77 65 64 20  iption reviewed 
7e10: 69 74 65 72 61 74 65 64 20 61 76 67 5f 72 75 6e  iterated avg_run
7e20: 74 69 6d 65 20 61 76 67 5f 64 69 73 6b 20 74 61  time avg_disk ta
7e30: 67 73 29 29 29 0a 20 20 20 20 20 64 62 20 22 53  gs))).     db "S
7e40: 45 4c 45 43 54 20 69 64 2c 74 65 73 74 6e 61 6d  ELECT id,testnam
7e50: 65 2c 61 75 74 68 6f 72 2c 6f 77 6e 65 72 2c 64  e,author,owner,d
7e60: 65 73 63 72 69 70 74 69 6f 6e 2c 72 65 76 69 65  escription,revie
7e70: 77 65 64 2c 69 74 65 72 61 74 65 64 2c 61 76 67  wed,iterated,avg
7e80: 5f 72 75 6e 74 69 6d 65 2c 61 76 67 5f 64 69 73  _runtime,avg_dis
7e90: 6b 2c 74 61 67 73 20 46 52 4f 4d 20 74 65 73 74  k,tags FROM test
7ea0: 5f 6d 65 74 61 20 57 48 45 52 45 20 74 65 73 74  _meta WHERE test
7eb0: 6e 61 6d 65 3d 3f 3b 22 0a 20 20 20 20 20 74 65  name=?;".     te
7ec0: 73 74 6e 61 6d 65 29 0a 20 20 20 20 72 65 73 29  stname).    res)
7ed0: 29 0a 0a 3b 3b 20 63 72 65 61 74 65 20 61 20 6e  )..;; create a n
7ee0: 65 77 20 72 65 63 6f 72 64 20 66 6f 72 20 61 20  ew record for a 
7ef0: 67 69 76 65 6e 20 74 65 73 74 6e 61 6d 65 0a 28  given testname.(
7f00: 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74 6d  define (db:testm
7f10: 65 74 61 2d 61 64 64 2d 72 65 63 6f 72 64 20 64  eta-add-record d
7f20: 62 20 74 65 73 74 6e 61 6d 65 29 0a 20 20 28 73  b testname).  (s
7f30: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64  qlite3:execute d
7f40: 62 20 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e  b "INSERT OR IGN
7f50: 4f 52 45 20 49 4e 54 4f 20 74 65 73 74 5f 6d 65  ORE INTO test_me
7f60: 74 61 20 28 74 65 73 74 6e 61 6d 65 2c 61 75 74  ta (testname,aut
7f70: 68 6f 72 2c 6f 77 6e 65 72 2c 64 65 73 63 72 69  hor,owner,descri
7f80: 70 74 69 6f 6e 2c 72 65 76 69 65 77 65 64 2c 69  ption,reviewed,i
7f90: 74 65 72 61 74 65 64 2c 61 76 67 5f 72 75 6e 74  terated,avg_runt
7fa0: 69 6d 65 2c 61 76 67 5f 64 69 73 6b 2c 74 61 67  ime,avg_disk,tag
7fb0: 73 29 20 56 41 4c 55 45 53 20 28 3f 2c 27 27 2c  s) VALUES (?,'',
7fc0: 27 27 2c 27 27 2c 27 27 2c 27 27 2c 27 27 2c 27  '','','','','','
7fd0: 27 2c 27 27 29 3b 22 20 74 65 73 74 6e 61 6d 65  ','');" testname
7fe0: 29 29 0a 0a 3b 3b 20 75 70 64 61 74 65 20 6f 6e  ))..;; update on
7ff0: 65 20 6f 66 20 74 68 65 20 74 65 73 74 6d 65 74  e of the testmet
8000: 61 20 66 69 65 6c 64 73 0a 28 64 65 66 69 6e 65  a fields.(define
8010: 20 28 64 62 3a 74 65 73 74 6d 65 74 61 2d 75 70   (db:testmeta-up
8020: 64 61 74 65 2d 66 69 65 6c 64 20 64 62 20 74 65  date-field db te
8030: 73 74 6e 61 6d 65 20 66 69 65 6c 64 20 76 61 6c  stname field val
8040: 75 65 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65  ue).  (sqlite3:e
8050: 78 65 63 75 74 65 20 64 62 20 28 63 6f 6e 63 20  xecute db (conc 
8060: 22 55 50 44 41 54 45 20 74 65 73 74 5f 6d 65 74  "UPDATE test_met
8070: 61 20 53 45 54 20 22 20 66 69 65 6c 64 20 22 3d  a SET " field "=
8080: 3f 20 57 48 45 52 45 20 74 65 73 74 6e 61 6d 65  ? WHERE testname
8090: 3d 3f 3b 22 29 20 76 61 6c 75 65 20 74 65 73 74  =?;") value test
80a0: 6e 61 6d 65 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d  name))..;;======
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 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
80f0: 0a 3b 3b 20 54 20 45 20 53 20 54 20 20 20 44 20  .;; T E S T   D 
8100: 41 20 54 20 41 20 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d  A T A .;;=======
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 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a  ===============.
8150: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 63 73 76  .(define (db:csv
8160: 2d 3e 74 65 73 74 2d 64 61 74 61 20 64 62 20 74  ->test-data db t
8170: 65 73 74 2d 69 64 20 63 73 76 64 61 74 61 29 0a  est-id csvdata).
8180: 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34    (debug:print 4
8190: 20 22 74 65 73 74 2d 69 64 20 22 20 74 65 73 74   "test-id " test
81a0: 2d 69 64 20 22 2c 20 63 73 76 64 61 74 61 3a 20  -id ", csvdata: 
81b0: 22 20 63 73 76 64 61 74 61 29 0a 20 20 28 6c 65  " csvdata).  (le
81c0: 74 20 28 28 63 73 76 6c 69 73 74 20 28 63 73 76  t ((csvlist (csv
81d0: 2d 3e 6c 69 73 74 20 28 6d 61 6b 65 2d 63 73 76  ->list (make-csv
81e0: 2d 72 65 61 64 65 72 0a 09 09 09 20 20 20 20 20  -reader....     
81f0: 28 6f 70 65 6e 2d 69 6e 70 75 74 2d 73 74 72 69  (open-input-stri
8200: 6e 67 20 63 73 76 64 61 74 61 29 0a 09 09 09 20  ng csvdata).... 
8210: 20 20 20 20 27 28 28 73 74 72 69 70 2d 6c 65 61      '((strip-lea
8220: 64 69 6e 67 2d 77 68 69 74 65 73 70 61 63 65 3f  ding-whitespace?
8230: 20 23 74 29 0a 09 09 09 20 20 20 20 20 20 20 28   #t)....       (
8240: 73 74 72 69 70 2d 74 72 61 69 6c 69 6e 67 2d 77  strip-trailing-w
8250: 68 69 74 65 73 70 61 63 65 3f 20 23 74 29 29 20  hitespace? #t)) 
8260: 29 29 29 29 20 3b 3b 20 28 63 73 76 2d 3e 6c 69  )))) ;; (csv->li
8270: 73 74 20 63 73 76 64 61 74 61 29 29 29 0a 20 20  st csvdata))).  
8280: 20 20 28 66 6f 72 2d 65 61 63 68 20 0a 20 20 20    (for-each .   
8290: 20 20 28 6c 61 6d 62 64 61 20 28 63 73 76 72 6f    (lambda (csvro
82a0: 77 29 0a 20 20 20 20 20 20 20 28 6c 65 74 2a 20  w).       (let* 
82b0: 28 28 70 61 64 64 65 64 2d 72 6f 77 20 20 28 74  ((padded-row  (t
82c0: 61 6b 65 20 28 61 70 70 65 6e 64 20 63 73 76 72  ake (append csvr
82d0: 6f 77 20 28 6c 69 73 74 20 23 66 20 23 66 20 23  ow (list #f #f #
82e0: 66 20 23 66 20 23 66 20 23 66 20 23 66 20 23 66  f #f #f #f #f #f
82f0: 20 23 66 29 29 20 39 29 29 0a 09 20 20 20 20 20   #f)) 9))..     
8300: 20 28 63 61 74 65 67 6f 72 79 20 20 20 20 28 6c   (category    (l
8310: 69 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d 72  ist-ref padded-r
8320: 6f 77 20 30 29 29 0a 09 20 20 20 20 20 20 28 76  ow 0))..      (v
8330: 61 72 69 61 62 6c 65 20 20 20 20 28 6c 69 73 74  ariable    (list
8340: 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20  -ref padded-row 
8350: 31 29 29 0a 09 20 20 20 20 20 20 28 76 61 6c 75  1))..      (valu
8360: 65 20 20 20 20 20 20 20 28 61 6e 79 2d 3e 6e 75  e       (any->nu
8370: 6d 62 65 72 2d 69 66 2d 70 6f 73 73 69 62 6c 65  mber-if-possible
8380: 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65   (list-ref padde
8390: 64 2d 72 6f 77 20 32 29 29 29 0a 09 20 20 20 20  d-row 2)))..    
83a0: 20 20 28 65 78 70 65 63 74 65 64 20 20 20 20 28    (expected    (
83b0: 61 6e 79 2d 3e 6e 75 6d 62 65 72 2d 69 66 2d 70  any->number-if-p
83c0: 6f 73 73 69 62 6c 65 20 28 6c 69 73 74 2d 72 65  ossible (list-re
83d0: 66 20 70 61 64 64 65 64 2d 72 6f 77 20 33 29 29  f padded-row 3))
83e0: 29 0a 09 20 20 20 20 20 20 28 74 6f 6c 20 20 20  )..      (tol   
83f0: 20 20 20 20 20 20 28 61 6e 79 2d 3e 6e 75 6d 62        (any->numb
8400: 65 72 2d 69 66 2d 70 6f 73 73 69 62 6c 65 20 28  er-if-possible (
8410: 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d  list-ref padded-
8420: 72 6f 77 20 34 29 29 29 20 3b 3b 20 3e 2c 20 3c  row 4))) ;; >, <
8430: 2c 20 3e 3d 2c 20 3c 3d 2c 20 6f 72 20 61 20 6e  , >=, <=, or a n
8440: 75 6d 62 65 72 0a 09 20 20 20 20 20 20 28 75 6e  umber..      (un
8450: 69 74 73 20 20 20 20 20 20 20 28 6c 69 73 74 2d  its       (list-
8460: 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20 35  ref padded-row 5
8470: 29 29 0a 09 20 20 20 20 20 20 28 63 6f 6d 6d 65  ))..      (comme
8480: 6e 74 20 20 20 20 20 28 6c 69 73 74 2d 72 65 66  nt     (list-ref
8490: 20 70 61 64 64 65 64 2d 72 6f 77 20 36 29 29 0a   padded-row 6)).
84a0: 09 20 20 20 20 20 20 28 73 74 61 74 75 73 20 20  .      (status  
84b0: 20 20 20 20 28 6c 65 74 20 28 28 73 20 28 6c 69      (let ((s (li
84c0: 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f  st-ref padded-ro
84d0: 77 20 37 29 29 29 0a 09 09 09 20 20 20 20 20 28  w 7)))....     (
84e0: 69 66 20 28 61 6e 64 20 28 73 74 72 69 6e 67 3f  if (and (string?
84f0: 20 73 29 28 6f 72 20 28 73 74 72 69 6e 67 2d 6d   s)(or (string-m
8500: 61 74 63 68 20 28 72 65 67 65 78 70 20 22 5e 5c  atch (regexp "^\
8510: 5c 73 2a 24 22 29 20 73 29 0a 09 09 09 09 09 09  \s*$") s).......
8520: 20 20 20 20 20 28 73 74 72 69 6e 67 2d 6d 61 74       (string-mat
8530: 63 68 20 28 72 65 67 65 78 70 20 22 5e 6e 2f 61  ch (regexp "^n/a
8540: 24 22 29 20 73 29 29 29 0a 09 09 09 09 20 23 66  $") s)))..... #f
8550: 0a 09 09 09 09 20 73 29 29 29 20 3b 3b 20 69 66  ..... s))) ;; if
8560: 20 73 70 65 63 69 66 69 65 64 20 6f 6e 20 74 68   specified on th
8570: 65 20 69 6e 70 75 74 20 74 68 65 6e 20 75 73 65  e input then use
8580: 2c 20 65 6c 73 65 20 63 61 6c 63 75 6c 61 74 65  , else calculate
8590: 0a 09 20 20 20 20 20 20 28 74 79 70 65 20 20 20  ..      (type   
85a0: 20 20 20 20 20 28 6c 69 73 74 2d 72 65 66 20 70       (list-ref p
85b0: 61 64 64 65 64 2d 72 6f 77 20 38 29 29 29 0a 09  added-row 8)))..
85c0: 20 3b 3b 20 6c 6f 6f 6b 20 75 70 20 65 78 70 65   ;; look up expe
85d0: 63 74 65 64 2c 74 6f 6c 2c 75 6e 69 74 73 20 66  cted,tol,units f
85e0: 72 6f 6d 20 70 72 65 76 69 6f 75 73 20 62 65 73  rom previous bes
85f0: 74 20 66 69 74 20 74 65 73 74 20 69 66 20 74 68  t fit test if th
8600: 65 79 20 61 72 65 20 61 6c 6c 20 65 69 74 68 65  ey are all eithe
8610: 72 20 23 66 20 6f 72 20 27 27 0a 09 20 28 64 65  r #f or ''.. (de
8620: 62 75 67 3a 70 72 69 6e 74 20 34 20 22 42 45 46  bug:print 4 "BEF
8630: 4f 52 45 3a 20 63 61 74 65 67 6f 72 79 3a 20 22  ORE: category: "
8640: 20 63 61 74 65 67 6f 72 79 20 22 20 76 61 72 69   category " vari
8650: 61 62 6c 65 3a 20 22 20 76 61 72 69 61 62 6c 65  able: " variable
8660: 20 22 20 76 61 6c 75 65 3a 20 22 20 76 61 6c 75   " value: " valu
8670: 65 20 0a 09 09 20 20 20 20 20 20 22 2c 20 65 78  e ...      ", ex
8680: 70 65 63 74 65 64 3a 20 22 20 65 78 70 65 63 74  pected: " expect
8690: 65 64 20 22 20 74 6f 6c 3a 20 22 20 74 6f 6c 20  ed " tol: " tol 
86a0: 22 20 75 6e 69 74 73 3a 20 22 20 75 6e 69 74 73  " units: " units
86b0: 20 22 20 73 74 61 74 75 73 3a 20 22 20 73 74 61   " status: " sta
86c0: 74 75 73 20 22 20 63 6f 6d 6d 65 6e 74 3a 20 22  tus " comment: "
86d0: 20 63 6f 6d 6d 65 6e 74 20 22 20 74 79 70 65 3a   comment " type:
86e0: 20 22 20 74 79 70 65 29 0a 0a 09 20 28 69 66 20   " type)... (if 
86f0: 28 61 6e 64 20 28 6f 72 20 28 6e 6f 74 20 65 78  (and (or (not ex
8700: 70 65 63 74 65 64 29 28 65 71 75 61 6c 3f 20 65  pected)(equal? e
8710: 78 70 65 63 74 65 64 20 22 22 29 29 0a 09 09 20  xpected ""))... 
8720: 20 28 6f 72 20 28 6e 6f 74 20 74 6f 6c 29 20 20   (or (not tol)  
8730: 20 20 20 28 65 71 75 61 6c 3f 20 65 78 70 65 63     (equal? expec
8740: 74 65 64 20 22 22 29 29 0a 09 09 20 20 28 6f 72  ted ""))...  (or
8750: 20 28 6e 6f 74 20 75 6e 69 74 73 29 20 20 20 28   (not units)   (
8760: 65 71 75 61 6c 3f 20 65 78 70 65 63 74 65 64 20  equal? expected 
8770: 22 22 29 29 29 0a 09 20 20 20 20 20 28 6c 65 74  "")))..     (let
8780: 2d 76 61 6c 75 65 73 20 28 28 28 6e 65 77 2d 65  -values (((new-e
8790: 78 70 65 63 74 65 64 20 6e 65 77 2d 74 6f 6c 20  xpected new-tol 
87a0: 6e 65 77 2d 75 6e 69 74 73 29 28 64 62 3a 67 65  new-units)(db:ge
87b0: 74 2d 70 72 65 76 2d 74 6f 6c 2d 66 6f 72 2d 74  t-prev-tol-for-t
87c0: 65 73 74 20 64 62 20 74 65 73 74 2d 69 64 20 63  est db test-id c
87d0: 61 74 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65  ategory variable
87e0: 29 29 29 0a 09 09 09 20 28 73 65 74 21 20 65 78  ))).... (set! ex
87f0: 70 65 63 74 65 64 20 6e 65 77 2d 65 78 70 65 63  pected new-expec
8800: 74 65 64 29 0a 09 09 09 20 28 73 65 74 21 20 74  ted).... (set! t
8810: 6f 6c 20 20 20 20 20 20 6e 65 77 2d 74 6f 6c 29  ol      new-tol)
8820: 0a 09 09 09 20 28 73 65 74 21 20 75 6e 69 74 73  .... (set! units
8830: 20 20 20 20 6e 65 77 2d 75 6e 69 74 73 29 29 29      new-units)))
8840: 0a 0a 09 20 28 64 65 62 75 67 3a 70 72 69 6e 74  ... (debug:print
8850: 20 34 20 22 41 46 54 45 52 3a 20 20 63 61 74 65   4 "AFTER:  cate
8860: 67 6f 72 79 3a 20 22 20 63 61 74 65 67 6f 72 79  gory: " category
8870: 20 22 20 76 61 72 69 61 62 6c 65 3a 20 22 20 76   " variable: " v
8880: 61 72 69 61 62 6c 65 20 22 20 76 61 6c 75 65 3a  ariable " value:
8890: 20 22 20 76 61 6c 75 65 20 0a 09 09 20 20 20 20   " value ...    
88a0: 20 20 22 2c 20 65 78 70 65 63 74 65 64 3a 20 22    ", expected: "
88b0: 20 65 78 70 65 63 74 65 64 20 22 20 74 6f 6c 3a   expected " tol:
88c0: 20 22 20 74 6f 6c 20 22 20 75 6e 69 74 73 3a 20   " tol " units: 
88d0: 22 20 75 6e 69 74 73 20 22 20 73 74 61 74 75 73  " units " status
88e0: 3a 20 22 20 73 74 61 74 75 73 20 22 20 63 6f 6d  : " status " com
88f0: 6d 65 6e 74 3a 20 22 20 63 6f 6d 6d 65 6e 74 29  ment: " comment)
8900: 0a 09 20 3b 3b 20 63 61 6c 63 75 6c 61 74 65 20  .. ;; calculate 
8910: 73 74 61 74 75 73 20 69 66 20 4e 4f 54 20 73 70  status if NOT sp
8920: 65 63 69 66 69 65 64 0a 09 20 28 69 66 20 28 61  ecified.. (if (a
8930: 6e 64 20 28 6e 6f 74 20 73 74 61 74 75 73 29 28  nd (not status)(
8940: 6e 75 6d 62 65 72 3f 20 65 78 70 65 63 74 65 64  number? expected
8950: 29 28 6e 75 6d 62 65 72 3f 20 76 61 6c 75 65 29  )(number? value)
8960: 29 20 3b 3b 20 6e 65 65 64 20 65 78 70 65 63 74  ) ;; need expect
8970: 65 64 20 61 6e 64 20 76 61 6c 75 65 20 74 6f 20  ed and value to 
8980: 62 65 20 6e 75 6d 62 65 72 73 0a 09 20 20 20 20  be numbers..    
8990: 20 28 69 66 20 28 6e 75 6d 62 65 72 3f 20 74 6f   (if (number? to
89a0: 6c 29 20 3b 3b 20 69 66 20 74 6f 6c 20 69 73 20  l) ;; if tol is 
89b0: 61 20 6e 75 6d 62 65 72 20 74 68 65 6e 20 77 65  a number then we
89c0: 20 64 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64   do the standard
89d0: 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 09 09 20 28   comparison... (
89e0: 6c 65 74 2a 20 28 28 6d 61 78 2d 76 61 6c 20 28  let* ((max-val (
89f0: 2b 20 65 78 70 65 63 74 65 64 20 74 6f 6c 29 29  + expected tol))
8a00: 0a 09 09 09 28 6d 69 6e 2d 76 61 6c 20 28 2d 20  ....(min-val (- 
8a10: 65 78 70 65 63 74 65 64 20 74 6f 6c 29 29 0a 09  expected tol))..
8a20: 09 09 28 72 65 73 75 6c 74 20 20 28 61 6e 64 20  ..(result  (and 
8a30: 28 3e 3d 20 20 76 61 6c 75 65 20 6d 69 6e 2d 76  (>=  value min-v
8a40: 61 6c 29 28 3c 3d 20 76 61 6c 75 65 20 6d 61 78  al)(<= value max
8a50: 2d 76 61 6c 29 29 29 29 0a 09 09 20 20 20 28 64  -val))))...   (d
8a60: 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22 6d 61  ebug:print 4 "ma
8a70: 78 2d 76 61 6c 3a 20 22 20 6d 61 78 2d 76 61 6c  x-val: " max-val
8a80: 20 22 20 6d 69 6e 2d 76 61 6c 3a 20 22 20 6d 69   " min-val: " mi
8a90: 6e 2d 76 61 6c 20 22 20 72 65 73 75 6c 74 3a 20  n-val " result: 
8aa0: 22 20 72 65 73 75 6c 74 29 0a 09 09 20 20 20 28  " result)...   (
8ab0: 73 65 74 21 20 73 74 61 74 75 73 20 28 69 66 20  set! status (if 
8ac0: 72 65 73 75 6c 74 20 22 70 61 73 73 22 20 22 66  result "pass" "f
8ad0: 61 69 6c 22 29 29 29 0a 09 09 20 28 73 65 74 21  ail")))... (set!
8ae0: 20 73 74 61 74 75 73 20 3b 3b 20 4e 42 2f 2f 20   status ;; NB// 
8af0: 6e 65 65 64 20 74 6f 20 61 73 73 65 73 73 20 65  need to assess e
8b00: 61 63 68 20 6f 6e 65 20 28 69 2e 65 2e 20 6e 6f  ach one (i.e. no
8b10: 74 20 72 65 74 75 72 6e 20 6f 70 65 72 61 74 6f  t return operato
8b20: 72 20 73 69 6e 63 65 20 6e 65 65 64 20 74 6f 20  r since need to 
8b30: 61 63 74 20 69 66 20 6e 6f 74 20 76 61 6c 69 64  act if not valid
8b40: 20 6f 70 2e 0a 09 09 20 20 20 20 20 20 20 28 63   op....       (c
8b50: 61 73 65 20 28 73 74 72 69 6e 67 2d 3e 73 79 6d  ase (string->sym
8b60: 62 6f 6c 20 74 6f 6c 29 20 3b 3b 20 74 6f 6c 20  bol tol) ;; tol 
8b70: 73 68 6f 75 6c 64 20 62 65 20 3e 2c 20 3c 2c 20  should be >, <, 
8b80: 3e 3d 2c 20 3c 3d 0a 09 09 09 20 28 28 3e 29 20  >=, <=.... ((>) 
8b90: 20 28 69 66 20 28 3e 20 20 76 61 6c 75 65 20 65   (if (>  value e
8ba0: 78 70 65 63 74 65 64 29 20 22 70 61 73 73 22 20  xpected) "pass" 
8bb0: 22 66 61 69 6c 22 29 29 0a 09 09 09 20 28 28 3c  "fail")).... ((<
8bc0: 29 20 20 28 69 66 20 28 3c 20 20 76 61 6c 75 65  )  (if (<  value
8bd0: 20 65 78 70 65 63 74 65 64 29 20 22 70 61 73 73   expected) "pass
8be0: 22 20 22 66 61 69 6c 22 29 29 0a 09 09 09 20 28  " "fail")).... (
8bf0: 28 3e 3d 29 20 28 69 66 20 28 3e 3d 20 76 61 6c  (>=) (if (>= val
8c00: 75 65 20 65 78 70 65 63 74 65 64 29 20 22 70 61  ue expected) "pa
8c10: 73 73 22 20 22 66 61 69 6c 22 29 29 0a 09 09 09  ss" "fail"))....
8c20: 20 28 28 3c 3d 29 20 28 69 66 20 28 3c 3d 20 76   ((<=) (if (<= v
8c30: 61 6c 75 65 20 65 78 70 65 63 74 65 64 29 20 22  alue expected) "
8c40: 70 61 73 73 22 20 22 66 61 69 6c 22 29 29 0a 09  pass" "fail"))..
8c50: 09 09 20 28 65 6c 73 65 20 28 63 6f 6e 63 20 22  .. (else (conc "
8c60: 45 52 52 4f 52 3a 20 62 61 64 20 74 6f 6c 20 63  ERROR: bad tol c
8c70: 6f 6d 70 61 72 61 74 6f 72 20 22 20 74 6f 6c 29  omparator " tol)
8c80: 29 29 29 29 29 0a 09 20 28 64 65 62 75 67 3a 70  ))))).. (debug:p
8c90: 72 69 6e 74 20 34 20 22 41 46 54 45 52 32 3a 20  rint 4 "AFTER2: 
8ca0: 63 61 74 65 67 6f 72 79 3a 20 22 20 63 61 74 65  category: " cate
8cb0: 67 6f 72 79 20 22 20 76 61 72 69 61 62 6c 65 3a  gory " variable:
8cc0: 20 22 20 76 61 72 69 61 62 6c 65 20 22 20 76 61   " variable " va
8cd0: 6c 75 65 3a 20 22 20 76 61 6c 75 65 20 0a 09 09  lue: " value ...
8ce0: 20 20 20 20 20 20 22 2c 20 65 78 70 65 63 74 65        ", expecte
8cf0: 64 3a 20 22 20 65 78 70 65 63 74 65 64 20 22 20  d: " expected " 
8d00: 74 6f 6c 3a 20 22 20 74 6f 6c 20 22 20 75 6e 69  tol: " tol " uni
8d10: 74 73 3a 20 22 20 75 6e 69 74 73 20 22 20 73 74  ts: " units " st
8d20: 61 74 75 73 3a 20 22 20 73 74 61 74 75 73 20 22  atus: " status "
8d30: 20 63 6f 6d 6d 65 6e 74 3a 20 22 20 63 6f 6d 6d   comment: " comm
8d40: 65 6e 74 29 0a 09 20 28 73 71 6c 69 74 65 33 3a  ent).. (sqlite3:
8d50: 65 78 65 63 75 74 65 20 64 62 20 22 49 4e 53 45  execute db "INSE
8d60: 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 49 4e  RT OR REPLACE IN
8d70: 54 4f 20 74 65 73 74 5f 64 61 74 61 20 28 74 65  TO test_data (te
8d80: 73 74 5f 69 64 2c 63 61 74 65 67 6f 72 79 2c 76  st_id,category,v
8d90: 61 72 69 61 62 6c 65 2c 76 61 6c 75 65 2c 65 78  ariable,value,ex
8da0: 70 65 63 74 65 64 2c 74 6f 6c 2c 75 6e 69 74 73  pected,tol,units
8db0: 2c 63 6f 6d 6d 65 6e 74 2c 73 74 61 74 75 73 2c  ,comment,status,
8dc0: 74 79 70 65 29 20 56 41 4c 55 45 53 20 28 3f 2c  type) VALUES (?,
8dd0: 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c  ?,?,?,?,?,?,?,?,
8de0: 3f 29 3b 22 0a 09 09 09 20 20 74 65 73 74 2d 69  ?);"....  test-i
8df0: 64 20 63 61 74 65 67 6f 72 79 20 76 61 72 69 61  d category varia
8e00: 62 6c 65 20 76 61 6c 75 65 20 65 78 70 65 63 74  ble value expect
8e10: 65 64 20 74 6f 6c 20 75 6e 69 74 73 20 28 69 66  ed tol units (if
8e20: 20 63 6f 6d 6d 65 6e 74 20 63 6f 6d 6d 65 6e 74   comment comment
8e30: 20 22 22 29 20 73 74 61 74 75 73 20 74 79 70 65   "") status type
8e40: 29 29 29 0a 20 20 20 20 20 63 73 76 6c 69 73 74  ))).     csvlist
8e50: 29 29 29 0a 0a 3b 3b 20 67 65 74 20 61 20 6c 69  )))..;; get a li
8e60: 73 74 20 6f 66 20 74 65 73 74 5f 64 61 74 61 20  st of test_data 
8e70: 72 65 63 6f 72 64 73 20 6d 61 74 63 68 69 6e 67  records matching
8e80: 20 63 61 74 65 67 6f 72 79 70 61 74 74 0a 28 64   categorypatt.(d
8e90: 65 66 69 6e 65 20 28 64 62 3a 72 65 61 64 2d 74  efine (db:read-t
8ea0: 65 73 74 2d 64 61 74 61 20 64 62 20 74 65 73 74  est-data db test
8eb0: 2d 69 64 20 63 61 74 65 67 6f 72 79 70 61 74 74  -id categorypatt
8ec0: 29 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20 27  ).  (let ((res '
8ed0: 28 29 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65  ())).    (sqlite
8ee0: 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a  3:for-each-row .
8ef0: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 69 64       (lambda (id
8f00: 20 74 65 73 74 5f 69 64 20 63 61 74 65 67 6f 72   test_id categor
8f10: 79 20 76 61 72 69 61 62 6c 65 20 76 61 6c 75 65  y variable value
8f20: 20 65 78 70 65 63 74 65 64 20 74 6f 6c 20 75 6e   expected tol un
8f30: 69 74 73 20 63 6f 6d 6d 65 6e 74 20 73 74 61 74  its comment stat
8f40: 75 73 20 74 79 70 65 29 0a 20 20 20 20 20 20 20  us type).       
8f50: 28 73 65 74 21 20 72 65 73 20 28 63 6f 6e 73 20  (set! res (cons 
8f60: 28 76 65 63 74 6f 72 20 69 64 20 74 65 73 74 5f  (vector id test_
8f70: 69 64 20 63 61 74 65 67 6f 72 79 20 76 61 72 69  id category vari
8f80: 61 62 6c 65 20 76 61 6c 75 65 20 65 78 70 65 63  able value expec
8f90: 74 65 64 20 74 6f 6c 20 75 6e 69 74 73 20 63 6f  ted tol units co
8fa0: 6d 6d 65 6e 74 20 73 74 61 74 75 73 20 74 79 70  mment status typ
8fb0: 65 29 20 72 65 73 29 29 29 0a 20 20 20 20 20 64  e) res))).     d
8fc0: 62 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20 69  b.     "SELECT i
8fd0: 64 2c 74 65 73 74 5f 69 64 2c 63 61 74 65 67 6f  d,test_id,catego
8fe0: 72 79 2c 76 61 72 69 61 62 6c 65 2c 76 61 6c 75  ry,variable,valu
8ff0: 65 2c 65 78 70 65 63 74 65 64 2c 74 6f 6c 2c 75  e,expected,tol,u
9000: 6e 69 74 73 2c 63 6f 6d 6d 65 6e 74 2c 73 74 61  nits,comment,sta
9010: 74 75 73 2c 74 79 70 65 20 46 52 4f 4d 20 74 65  tus,type FROM te
9020: 73 74 5f 64 61 74 61 20 57 48 45 52 45 20 74 65  st_data WHERE te
9030: 73 74 5f 69 64 3d 3f 20 41 4e 44 20 63 61 74 65  st_id=? AND cate
9040: 67 6f 72 79 20 4c 49 4b 45 20 3f 20 4f 52 44 45  gory LIKE ? ORDE
9050: 52 20 42 59 20 63 61 74 65 67 6f 72 79 2c 76 61  R BY category,va
9060: 72 69 61 62 6c 65 3b 22 20 74 65 73 74 2d 69 64  riable;" test-id
9070: 20 63 61 74 65 67 6f 72 79 70 61 74 74 29 0a 20   categorypatt). 
9080: 20 20 20 28 72 65 76 65 72 73 65 20 72 65 73 29     (reverse res)
9090: 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  ))..(define (db:
90a0: 6c 6f 61 64 2d 74 65 73 74 2d 64 61 74 61 20 64  load-test-data d
90b0: 62 20 74 65 73 74 2d 69 64 29 0a 20 20 28 6c 65  b test-id).  (le
90c0: 74 20 6c 6f 6f 70 20 28 28 6c 69 6e 20 28 72 65  t loop ((lin (re
90d0: 61 64 2d 6c 69 6e 65 29 29 29 0a 20 20 20 20 28  ad-line))).    (
90e0: 69 66 20 28 6e 6f 74 20 28 65 6f 66 2d 6f 62 6a  if (not (eof-obj
90f0: 65 63 74 3f 20 6c 69 6e 29 29 0a 09 28 62 65 67  ect? lin))..(beg
9100: 69 6e 0a 09 20 20 28 64 65 62 75 67 3a 70 72 69  in..  (debug:pri
9110: 6e 74 20 34 20 6c 69 6e 29 0a 09 20 20 28 72 64  nt 4 lin)..  (rd
9120: 62 3a 63 73 76 2d 3e 74 65 73 74 2d 64 61 74 61  b:csv->test-data
9130: 20 64 62 20 74 65 73 74 2d 69 64 20 6c 69 6e 29   db test-id lin)
9140: 0a 09 20 20 28 6c 6f 6f 70 20 28 72 65 61 64 2d  ..  (loop (read-
9150: 6c 69 6e 65 29 29 29 29 29 0a 20 20 3b 3b 20 72  line))))).  ;; r
9160: 6f 6c 6c 20 75 70 20 74 68 65 20 63 75 72 72 65  oll up the curre
9170: 6e 74 20 72 65 73 75 6c 74 73 2e 0a 20 20 3b 3b  nt results..  ;;
9180: 20 46 49 58 4d 45 3a 20 41 64 64 20 74 68 65 20   FIXME: Add the 
9190: 73 74 61 74 75 73 20 74 6f 20 0a 20 20 28 72 64  status to .  (rd
91a0: 62 3a 74 65 73 74 2d 64 61 74 61 2d 72 6f 6c 6c  b:test-data-roll
91b0: 75 70 20 64 62 20 74 65 73 74 2d 69 64 20 23 66  up db test-id #f
91c0: 29 29 0a 0a 3b 3b 20 57 41 52 4e 49 4e 47 3a 20  ))..;; WARNING: 
91d0: 44 6f 20 4e 4f 54 20 63 61 6c 6c 20 74 68 69 73  Do NOT call this
91e0: 20 66 6f 72 20 74 68 65 20 70 61 72 65 6e 74 20   for the parent 
91f0: 74 65 73 74 20 6f 6e 20 61 6e 20 69 74 65 72 61  test on an itera
9200: 74 65 64 20 74 65 73 74 0a 3b 3b 20 52 6f 6c 6c  ted test.;; Roll
9210: 20 75 70 20 74 65 73 74 5f 64 61 74 61 20 70 61   up test_data pa
9220: 73 73 2f 66 61 69 6c 20 72 65 73 75 6c 74 73 0a  ss/fail results.
9230: 3b 3b 20 6c 6f 6f 6b 20 61 74 20 74 68 65 20 74  ;; look at the t
9240: 65 73 74 5f 64 61 74 61 20 73 74 61 74 75 73 20  est_data status 
9250: 66 69 65 6c 64 2c 20 0a 3b 3b 20 20 20 20 69 66  field, .;;    if
9260: 20 61 6c 6c 20 61 72 65 20 70 61 73 73 20 28 61   all are pass (a
9270: 6e 79 20 63 61 73 65 29 20 61 6e 64 20 74 68 65  ny case) and the
9280: 20 74 65 73 74 20 73 74 61 74 75 73 20 69 73 20   test status is 
9290: 50 41 53 53 20 6f 72 20 4e 55 4c 4c 20 6f 72 20  PASS or NULL or 
92a0: 27 27 20 74 68 65 6e 20 73 65 74 20 74 65 73 74  '' then set test
92b0: 20 73 74 61 74 75 73 20 74 6f 20 50 41 53 53 2e   status to PASS.
92c0: 0a 3b 3b 20 20 20 20 69 66 20 6f 6e 65 20 6f 72  .;;    if one or
92d0: 20 6d 6f 72 65 20 61 72 65 20 66 61 69 6c 20 28   more are fail (
92e0: 61 6e 79 20 63 61 73 65 29 20 74 68 65 6e 20 73  any case) then s
92f0: 65 74 20 74 65 73 74 20 73 74 61 74 75 73 20 74  et test status t
9300: 6f 20 50 41 53 53 2c 20 6e 6f 6e 20 22 70 61 73  o PASS, non "pas
9310: 73 22 20 6f 72 20 22 66 61 69 6c 22 20 61 72 65  s" or "fail" are
9320: 20 69 67 6e 6f 72 65 64 0a 28 64 65 66 69 6e 65   ignored.(define
9330: 20 28 64 62 3a 74 65 73 74 2d 64 61 74 61 2d 72   (db:test-data-r
9340: 6f 6c 6c 75 70 20 64 62 20 74 65 73 74 2d 69 64  ollup db test-id
9350: 20 73 74 61 74 75 73 29 0a 20 20 28 73 71 6c 69   status).  (sqli
9360: 74 65 33 3a 65 78 65 63 75 74 65 20 0a 20 20 20  te3:execute .   
9370: 64 62 20 0a 20 20 20 22 55 50 44 41 54 45 20 74  db .   "UPDATE t
9380: 65 73 74 73 20 0a 20 20 20 20 20 20 53 45 54 20  ests .      SET 
9390: 66 61 69 6c 5f 63 6f 75 6e 74 3d 28 53 45 4c 45  fail_count=(SELE
93a0: 43 54 20 63 6f 75 6e 74 28 69 64 29 20 46 52 4f  CT count(id) FRO
93b0: 4d 20 74 65 73 74 5f 64 61 74 61 20 57 48 45 52  M test_data WHER
93c0: 45 20 74 65 73 74 5f 69 64 3d 3f 20 41 4e 44 20  E test_id=? AND 
93d0: 73 74 61 74 75 73 20 6c 69 6b 65 20 27 66 61 69  status like 'fai
93e0: 6c 27 29 2c 0a 20 20 20 20 20 20 20 20 20 20 70  l'),.          p
93f0: 61 73 73 5f 63 6f 75 6e 74 3d 28 53 45 4c 45 43  ass_count=(SELEC
9400: 54 20 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d  T count(id) FROM
9410: 20 74 65 73 74 5f 64 61 74 61 20 57 48 45 52 45   test_data WHERE
9420: 20 74 65 73 74 5f 69 64 3d 3f 20 41 4e 44 20 73   test_id=? AND s
9430: 74 61 74 75 73 20 6c 69 6b 65 20 27 70 61 73 73  tatus like 'pass
9440: 27 29 0a 20 20 20 20 20 20 57 48 45 52 45 20 69  ').      WHERE i
9450: 64 3d 3f 3b 22 0a 20 20 20 74 65 73 74 2d 69 64  d=?;".   test-id
9460: 20 74 65 73 74 2d 69 64 20 74 65 73 74 2d 69 64   test-id test-id
9470: 29 0a 20 20 3b 3b 20 69 66 20 74 68 65 20 74 65  ).  ;; if the te
9480: 73 74 20 69 73 20 6e 6f 74 20 46 41 49 4c 20 74  st is not FAIL t
9490: 68 65 6e 20 73 65 74 20 73 74 61 74 75 73 20 62  hen set status b
94a0: 61 73 65 64 20 6f 6e 20 74 68 65 20 66 61 69 6c  ased on the fail
94b0: 20 61 6e 64 20 70 61 73 73 20 63 6f 75 6e 74 73   and pass counts
94c0: 2e 0a 20 20 28 74 68 72 65 61 64 2d 73 6c 65 65  ..  (thread-slee
94d0: 70 21 20 31 29 0a 20 20 28 73 71 6c 69 74 65 33  p! 1).  (sqlite3
94e0: 3a 65 78 65 63 75 74 65 0a 20 20 20 64 62 20 20  :execute.   db  
94f0: 20 3b 3b 3b 20 4e 4f 54 45 3a 20 53 68 6f 75 6c   ;;; NOTE: Shoul
9500: 64 20 74 68 69 73 20 62 65 20 57 41 52 4e 2c 46  d this be WARN,F
9510: 41 49 4c 3f 20 41 20 57 41 52 4e 20 69 73 20 6e  AIL? A WARN is n
9520: 6f 74 20 61 20 46 41 49 4c 3f 3f 3f 3f 3f 20 42  ot a FAIL????? B
9530: 55 47 20 46 49 58 4d 45 0a 20 20 20 22 55 50 44  UG FIXME.   "UPD
9540: 41 54 45 20 74 65 73 74 73 0a 20 20 20 20 20 20  ATE tests.      
9550: 53 45 54 20 73 74 61 74 75 73 3d 43 41 53 45 20  SET status=CASE 
9560: 57 48 45 4e 20 28 53 45 4c 45 43 54 20 66 61 69  WHEN (SELECT fai
9570: 6c 5f 63 6f 75 6e 74 20 46 52 4f 4d 20 74 65 73  l_count FROM tes
9580: 74 73 20 57 48 45 52 45 20 69 64 3d 3f 29 20 3e  ts WHERE id=?) >
9590: 20 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   0 .            
95a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 48 45               THE
95b0: 4e 20 27 46 41 49 4c 27 0a 20 20 20 20 20 20 20  N 'FAIL'.       
95c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
95d0: 48 45 4e 20 28 53 45 4c 45 43 54 20 70 61 73 73  HEN (SELECT pass
95e0: 5f 63 6f 75 6e 74 20 46 52 4f 4d 20 74 65 73 74  _count FROM test
95f0: 73 20 57 48 45 52 45 20 69 64 3d 3f 29 20 3e 20  s WHERE id=?) > 
9600: 30 20 41 4e 44 20 0a 20 20 20 20 20 20 20 20 20  0 AND .         
9610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9620: 20 20 28 53 45 4c 45 43 54 20 73 74 61 74 75 73    (SELECT status
9630: 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52   FROM tests WHER
9640: 45 20 69 64 3d 3f 29 20 4e 4f 54 20 49 4e 20 28  E id=?) NOT IN (
9650: 27 57 41 52 4e 27 2c 27 46 41 49 4c 27 29 0a 20  'WARN','FAIL'). 
9660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9670: 20 20 20 20 20 20 20 20 54 48 45 4e 20 27 50 41          THEN 'PA
9680: 53 53 27 0a 20 20 20 20 20 20 20 20 20 20 20 20  SS'.            
9690: 20 20 20 20 20 20 20 20 20 20 45 4c 53 45 20 73            ELSE s
96a0: 74 61 74 75 73 0a 20 20 20 20 20 20 20 20 20 20  tatus.          
96b0: 20 20 20 20 20 20 20 20 45 4e 44 20 57 48 45 52          END WHER
96c0: 45 20 69 64 3d 3f 3b 22 0a 20 20 20 74 65 73 74  E id=?;".   test
96d0: 2d 69 64 20 74 65 73 74 2d 69 64 20 74 65 73 74  -id test-id test
96e0: 2d 69 64 20 74 65 73 74 2d 69 64 29 29 0a 0a 28  -id test-id))..(
96f0: 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 70  define (db:get-p
9700: 72 65 76 2d 74 6f 6c 2d 66 6f 72 2d 74 65 73 74  rev-tol-for-test
9710: 20 64 62 20 74 65 73 74 2d 69 64 20 63 61 74 65   db test-id cate
9720: 67 6f 72 79 20 76 61 72 69 61 62 6c 65 29 0a 20  gory variable). 
9730: 20 3b 3b 20 46 69 6e 69 73 68 20 6d 65 3f 0a 20   ;; Finish me?. 
9740: 20 28 76 61 6c 75 65 73 20 23 66 20 23 66 20 23   (values #f #f #
9750: 66 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d  f))..;;=========
9760: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9770: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9780: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9790: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b  =============.;;
97a0: 20 53 20 54 20 45 20 50 20 53 20 0a 3b 3b 3d 3d   S T E P S .;;==
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 3d 3d 3d 3d 3d 3d 3d  ================
97f0: 3d 3d 3d 3d 0a 0a 28 64 65 66 69 6e 65 20 28 64  ====..(define (d
9800: 62 3a 73 74 65 70 2d 67 65 74 2d 74 69 6d 65 2d  b:step-get-time-
9810: 61 73 2d 73 74 72 69 6e 67 20 76 65 63 29 0a 20  as-string vec). 
9820: 20 28 73 65 63 6f 6e 64 73 2d 3e 74 69 6d 65 2d   (seconds->time-
9830: 73 74 72 69 6e 67 20 28 64 62 3a 73 74 65 70 2d  string (db:step-
9840: 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 76  get-event_time v
9850: 65 63 29 29 29 0a 0a 3b 3b 20 64 62 2d 67 65 74  ec)))..;; db-get
9860: 2d 74 65 73 74 2d 73 74 65 70 73 2d 66 6f 72 2d  -test-steps-for-
9870: 72 75 6e 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  run.(define (db:
9880: 67 65 74 2d 73 74 65 70 73 2d 66 6f 72 2d 74 65  get-steps-for-te
9890: 73 74 20 64 62 20 74 65 73 74 2d 69 64 29 0a 20  st db test-id). 
98a0: 20 28 6c 65 74 20 28 28 72 65 73 20 27 28 29 29   (let ((res '())
98b0: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66  ).    (sqlite3:f
98c0: 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20 20  or-each-row .   
98d0: 20 20 28 6c 61 6d 62 64 61 20 28 69 64 20 74 65    (lambda (id te
98e0: 73 74 2d 69 64 20 73 74 65 70 6e 61 6d 65 20 73  st-id stepname s
98f0: 74 61 74 65 20 73 74 61 74 75 73 20 65 76 65 6e  tate status even
9900: 74 2d 74 69 6d 65 20 6c 6f 67 66 69 6c 65 29 0a  t-time logfile).
9910: 20 20 20 20 20 20 20 28 73 65 74 21 20 72 65 73         (set! res
9920: 20 28 63 6f 6e 73 20 28 76 65 63 74 6f 72 20 69   (cons (vector i
9930: 64 20 74 65 73 74 2d 69 64 20 73 74 65 70 6e 61  d test-id stepna
9940: 6d 65 20 73 74 61 74 65 20 73 74 61 74 75 73 20  me state status 
9950: 65 76 65 6e 74 2d 74 69 6d 65 20 28 69 66 20 28  event-time (if (
9960: 73 74 72 69 6e 67 3f 20 6c 6f 67 66 69 6c 65 29  string? logfile)
9970: 20 6c 6f 67 66 69 6c 65 20 22 22 29 29 20 72 65   logfile "")) re
9980: 73 29 29 29 0a 20 20 20 20 20 64 62 0a 20 20 20  s))).     db.   
9990: 20 20 22 53 45 4c 45 43 54 20 69 64 2c 74 65 73    "SELECT id,tes
99a0: 74 5f 69 64 2c 73 74 65 70 6e 61 6d 65 2c 73 74  t_id,stepname,st
99b0: 61 74 65 2c 73 74 61 74 75 73 2c 65 76 65 6e 74  ate,status,event
99c0: 5f 74 69 6d 65 2c 6c 6f 67 66 69 6c 65 20 46 52  _time,logfile FR
99d0: 4f 4d 20 74 65 73 74 5f 73 74 65 70 73 20 57 48  OM test_steps WH
99e0: 45 52 45 20 74 65 73 74 5f 69 64 3d 3f 20 4f 52  ERE test_id=? OR
99f0: 44 45 52 20 42 59 20 69 64 20 41 53 43 3b 22 20  DER BY id ASC;" 
9a00: 3b 3b 20 65 76 65 6e 74 5f 74 69 6d 65 20 44 45  ;; event_time DE
9a10: 53 43 2c 69 64 20 41 53 43 3b 0a 20 20 20 20 20  SC,id ASC;.     
9a20: 74 65 73 74 2d 69 64 29 0a 20 20 20 20 28 72 65  test-id).    (re
9a30: 76 65 72 73 65 20 72 65 73 29 29 29 0a 0a 3b 3b  verse res)))..;;
9a40: 20 67 65 74 20 61 20 70 72 65 74 74 79 20 74 61   get a pretty ta
9a50: 62 6c 65 20 74 6f 20 73 75 6d 6d 61 72 69 7a 65  ble to summarize
9a60: 20 73 74 65 70 73 0a 3b 3b 0a 28 64 65 66 69 6e   steps.;;.(defin
9a70: 65 20 28 64 62 3a 67 65 74 2d 73 74 65 70 73 2d  e (db:get-steps-
9a80: 74 61 62 6c 65 20 64 62 20 74 65 73 74 2d 69 64  table db test-id
9a90: 29 0a 20 20 28 6c 65 74 20 28 28 73 74 65 70 73  ).  (let ((steps
9aa0: 20 20 20 28 64 62 3a 67 65 74 2d 73 74 65 70 73     (db:get-steps
9ab0: 2d 66 6f 72 2d 74 65 73 74 20 64 62 20 74 65 73  -for-test db tes
9ac0: 74 2d 69 64 29 29 29 0a 20 20 20 20 3b 3b 20 6f  t-id))).    ;; o
9ad0: 72 67 61 6e 69 73 65 20 74 68 65 20 73 74 65 70  rganise the step
9ae0: 73 20 66 6f 72 20 62 65 74 74 65 72 20 72 65 61  s for better rea
9af0: 64 61 62 69 6c 69 74 79 0a 20 20 20 20 28 6c 65  dability.    (le
9b00: 74 20 28 28 72 65 73 20 28 6d 61 6b 65 2d 68 61  t ((res (make-ha
9b10: 73 68 2d 74 61 62 6c 65 29 29 29 0a 20 20 20 20  sh-table))).    
9b20: 20 20 28 66 6f 72 2d 65 61 63 68 20 0a 20 20 20    (for-each .   
9b30: 20 20 20 20 28 6c 61 6d 62 64 61 20 28 73 74 65      (lambda (ste
9b40: 70 29 0a 09 20 28 64 65 62 75 67 3a 70 72 69 6e  p).. (debug:prin
9b50: 74 20 36 20 22 73 74 65 70 3d 22 20 73 74 65 70  t 6 "step=" step
9b60: 29 0a 09 20 28 6c 65 74 20 28 28 72 65 63 6f 72  ).. (let ((recor
9b70: 64 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 72 65  d (hash-table-re
9b80: 66 2f 64 65 66 61 75 6c 74 20 0a 09 09 09 72 65  f/default ....re
9b90: 73 20 0a 09 09 09 28 64 62 3a 73 74 65 70 2d 67  s ....(db:step-g
9ba0: 65 74 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70  et-stepname step
9bb0: 29 20 0a 09 09 09 3b 3b 20 20 20 20 20 20 20 20  ) ....;;        
9bc0: 73 74 65 70 6e 61 6d 65 20 20 20 20 20 20 20 20  stepname        
9bd0: 20 20 20 20 20 20 20 20 73 74 61 72 74 20 65 6e          start en
9be0: 64 20 73 74 61 74 75 73 20 20 20 20 0a 09 09 09  d status    ....
9bf0: 28 76 65 63 74 6f 72 20 28 64 62 3a 73 74 65 70  (vector (db:step
9c00: 2d 67 65 74 2d 73 74 65 70 6e 61 6d 65 20 73 74  -get-stepname st
9c10: 65 70 29 20 22 22 20 20 20 22 22 20 22 22 20 20  ep) ""   "" ""  
9c20: 20 20 20 22 22 20 22 22 29 29 29 29 0a 09 20 20     "" ""))))..  
9c30: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 36 20   (debug:print 6 
9c40: 22 72 65 63 6f 72 64 28 62 65 66 6f 72 65 29 20  "record(before) 
9c50: 3d 20 22 20 72 65 63 6f 72 64 20 0a 09 09 09 22  = " record ...."
9c60: 5c 6e 69 64 3a 20 20 20 20 20 20 20 22 20 28 64  \nid:       " (d
9c70: 62 3a 73 74 65 70 2d 67 65 74 2d 69 64 20 73 74  b:step-get-id st
9c80: 65 70 29 0a 09 09 09 22 5c 6e 73 74 65 70 6e 61  ep)...."\nstepna
9c90: 6d 65 3a 20 22 20 28 64 62 3a 73 74 65 70 2d 67  me: " (db:step-g
9ca0: 65 74 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70  et-stepname step
9cb0: 29 0a 09 09 09 22 5c 6e 73 74 61 74 65 3a 20 20  )...."\nstate:  
9cc0: 20 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74    " (db:step-get
9cd0: 2d 73 74 61 74 65 20 73 74 65 70 29 0a 09 09 09  -state step)....
9ce0: 22 5c 6e 73 74 61 74 75 73 3a 20 20 20 22 20 28  "\nstatus:   " (
9cf0: 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 74  db:step-get-stat
9d00: 75 73 20 73 74 65 70 29 0a 09 09 09 22 5c 6e 74  us step)...."\nt
9d10: 69 6d 65 3a 20 20 20 20 20 22 20 28 64 62 3a 73  ime:     " (db:s
9d20: 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69  tep-get-event_ti
9d30: 6d 65 20 73 74 65 70 29 29 0a 09 20 20 20 28 63  me step))..   (c
9d40: 61 73 65 20 28 73 74 72 69 6e 67 2d 3e 73 79 6d  ase (string->sym
9d50: 62 6f 6c 20 28 64 62 3a 73 74 65 70 2d 67 65 74  bol (db:step-get
9d60: 2d 73 74 61 74 65 20 73 74 65 70 29 29 0a 09 20  -state step)).. 
9d70: 20 20 20 20 28 28 73 74 61 72 74 29 28 76 65 63      ((start)(vec
9d80: 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20  tor-set! record 
9d90: 31 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65  1 (db:step-get-e
9da0: 76 65 6e 74 5f 74 69 6d 65 20 73 74 65 70 29 29  vent_time step))
9db0: 0a 09 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d  ..      (vector-
9dc0: 73 65 74 21 20 72 65 63 6f 72 64 20 33 20 28 69  set! record 3 (i
9dd0: 66 20 28 65 71 75 61 6c 3f 20 28 76 65 63 74 6f  f (equal? (vecto
9de0: 72 2d 72 65 66 20 72 65 63 6f 72 64 20 33 29 20  r-ref record 3) 
9df0: 22 22 29 0a 09 09 09 09 09 28 64 62 3a 73 74 65  "")......(db:ste
9e00: 70 2d 67 65 74 2d 73 74 61 74 75 73 20 73 74 65  p-get-status ste
9e10: 70 29 29 29 0a 09 20 20 20 20 20 20 28 69 66 20  p)))..      (if 
9e20: 28 3e 20 28 73 74 72 69 6e 67 2d 6c 65 6e 67 74  (> (string-lengt
9e30: 68 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 6c  h (db:step-get-l
9e40: 6f 67 66 69 6c 65 20 73 74 65 70 29 29 0a 09 09  ogfile step))...
9e50: 20 20 20 20 20 30 29 0a 09 09 20 20 28 76 65 63       0)...  (vec
9e60: 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20  tor-set! record 
9e70: 35 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 6c  5 (db:step-get-l
9e80: 6f 67 66 69 6c 65 20 73 74 65 70 29 29 29 29 0a  ogfile step)))).
9e90: 09 20 20 20 20 20 28 28 65 6e 64 29 20 20 0a 09  .     ((end)  ..
9ea0: 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65        (vector-se
9eb0: 74 21 20 72 65 63 6f 72 64 20 32 20 28 61 6e 79  t! record 2 (any
9ec0: 2d 3e 6e 75 6d 62 65 72 20 28 64 62 3a 73 74 65  ->number (db:ste
9ed0: 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65  p-get-event_time
9ee0: 20 73 74 65 70 29 29 29 0a 09 20 20 20 20 20 20   step)))..      
9ef0: 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63  (vector-set! rec
9f00: 6f 72 64 20 33 20 28 64 62 3a 73 74 65 70 2d 67  ord 3 (db:step-g
9f10: 65 74 2d 73 74 61 74 75 73 20 73 74 65 70 29 29  et-status step))
9f20: 0a 09 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d  ..      (vector-
9f30: 73 65 74 21 20 72 65 63 6f 72 64 20 34 20 28 6c  set! record 4 (l
9f40: 65 74 20 28 28 73 74 61 72 74 74 20 28 61 6e 79  et ((startt (any
9f50: 2d 3e 6e 75 6d 62 65 72 20 28 76 65 63 74 6f 72  ->number (vector
9f60: 2d 72 65 66 20 72 65 63 6f 72 64 20 31 29 29 29  -ref record 1)))
9f70: 0a 09 09 09 09 09 20 20 28 65 6e 64 74 20 20 20  ......  (endt   
9f80: 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 20 28 76 65  (any->number (ve
9f90: 63 74 6f 72 2d 72 65 66 20 72 65 63 6f 72 64 20  ctor-ref record 
9fa0: 32 29 29 29 29 0a 09 09 09 09 20 20 20 20 20 20  2)))).....      
9fb0: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22  (debug:print 4 "
9fc0: 72 65 63 6f 72 64 5b 31 5d 3d 22 20 28 76 65 63  record[1]=" (vec
9fd0: 74 6f 72 2d 72 65 66 20 72 65 63 6f 72 64 20 31  tor-ref record 1
9fe0: 29 20 0a 09 09 09 09 09 09 20 20 20 22 2c 20 73  ) .......   ", s
9ff0: 74 61 72 74 74 3d 22 20 73 74 61 72 74 74 20 22  tartt=" startt "
a000: 2c 20 65 6e 64 74 3d 22 20 65 6e 64 74 0a 09 09  , endt=" endt...
a010: 09 09 09 09 20 20 20 22 2c 20 67 65 74 2d 73 74  ....   ", get-st
a020: 61 74 75 73 3a 20 22 20 28 64 62 3a 73 74 65 70  atus: " (db:step
a030: 2d 67 65 74 2d 73 74 61 74 75 73 20 73 74 65 70  -get-status step
a040: 29 29 0a 09 09 09 09 20 20 20 20 20 20 28 69 66  )).....      (if
a050: 20 28 61 6e 64 20 28 6e 75 6d 62 65 72 3f 20 73   (and (number? s
a060: 74 61 72 74 74 29 28 6e 75 6d 62 65 72 3f 20 65  tartt)(number? e
a070: 6e 64 74 29 29 0a 09 09 09 09 09 20 20 28 73 65  ndt))......  (se
a080: 63 6f 6e 64 73 2d 3e 68 72 2d 6d 69 6e 2d 73 65  conds->hr-min-se
a090: 63 20 28 2d 20 65 6e 64 74 20 73 74 61 72 74 74  c (- endt startt
a0a0: 29 29 20 22 2d 31 22 29 29 29 0a 09 20 20 20 20  )) "-1")))..    
a0b0: 20 20 28 69 66 20 28 3e 20 28 73 74 72 69 6e 67    (if (> (string
a0c0: 2d 6c 65 6e 67 74 68 20 28 64 62 3a 73 74 65 70  -length (db:step
a0d0: 2d 67 65 74 2d 6c 6f 67 66 69 6c 65 20 73 74 65  -get-logfile ste
a0e0: 70 29 29 0a 09 09 20 20 20 20 20 30 29 0a 09 09  p))...     0)...
a0f0: 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72    (vector-set! r
a100: 65 63 6f 72 64 20 35 20 28 64 62 3a 73 74 65 70  ecord 5 (db:step
a110: 2d 67 65 74 2d 6c 6f 67 66 69 6c 65 20 73 74 65  -get-logfile ste
a120: 70 29 29 29 29 0a 09 20 20 20 20 20 28 65 6c 73  p))))..     (els
a130: 65 0a 09 20 20 20 20 20 20 28 76 65 63 74 6f 72  e..      (vector
a140: 2d 73 65 74 21 20 72 65 63 6f 72 64 20 32 20 28  -set! record 2 (
a150: 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 74  db:step-get-stat
a160: 65 20 73 74 65 70 29 29 0a 09 20 20 20 20 20 20  e step))..      
a170: 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63  (vector-set! rec
a180: 6f 72 64 20 33 20 28 64 62 3a 73 74 65 70 2d 67  ord 3 (db:step-g
a190: 65 74 2d 73 74 61 74 75 73 20 73 74 65 70 29 29  et-status step))
a1a0: 0a 09 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d  ..      (vector-
a1b0: 73 65 74 21 20 72 65 63 6f 72 64 20 34 20 28 64  set! record 4 (d
a1c0: 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74  b:step-get-event
a1d0: 5f 74 69 6d 65 20 73 74 65 70 29 29 29 29 0a 09  _time step))))..
a1e0: 20 20 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 73     (hash-table-s
a1f0: 65 74 21 20 72 65 73 20 28 64 62 3a 73 74 65 70  et! res (db:step
a200: 2d 67 65 74 2d 73 74 65 70 6e 61 6d 65 20 73 74  -get-stepname st
a210: 65 70 29 20 72 65 63 6f 72 64 29 0a 09 20 20 20  ep) record)..   
a220: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 36 20 22  (debug:print 6 "
a230: 72 65 63 6f 72 64 28 61 66 74 65 72 29 20 20 3d  record(after)  =
a240: 20 22 20 72 65 63 6f 72 64 20 0a 09 09 09 22 5c   " record ...."\
a250: 6e 69 64 3a 20 20 20 20 20 20 20 22 20 28 64 62  nid:       " (db
a260: 3a 73 74 65 70 2d 67 65 74 2d 69 64 20 73 74 65  :step-get-id ste
a270: 70 29 0a 09 09 09 22 5c 6e 73 74 65 70 6e 61 6d  p)...."\nstepnam
a280: 65 3a 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65  e: " (db:step-ge
a290: 74 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70 29  t-stepname step)
a2a0: 0a 09 09 09 22 5c 6e 73 74 61 74 65 3a 20 20 20  ...."\nstate:   
a2b0: 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d   " (db:step-get-
a2c0: 73 74 61 74 65 20 73 74 65 70 29 0a 09 09 09 22  state step)...."
a2d0: 5c 6e 73 74 61 74 75 73 3a 20 20 20 22 20 28 64  \nstatus:   " (d
a2e0: 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 74 75  b:step-get-statu
a2f0: 73 20 73 74 65 70 29 0a 09 09 09 22 5c 6e 74 69  s step)...."\nti
a300: 6d 65 3a 20 20 20 20 20 22 20 28 64 62 3a 73 74  me:     " (db:st
a310: 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d  ep-get-event_tim
a320: 65 20 73 74 65 70 29 29 29 29 0a 20 20 20 20 20  e step)))).     
a330: 20 20 3b 3b 20 28 65 6c 73 65 20 20 20 28 76 65    ;; (else   (ve
a340: 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64  ctor-set! record
a350: 20 31 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d   1 (db:step-get-
a360: 65 76 65 6e 74 5f 74 69 6d 65 20 73 74 65 70 29  event_time step)
a370: 29 29 0a 20 20 20 20 20 20 20 28 73 6f 72 74 20  )).       (sort 
a380: 73 74 65 70 73 20 28 6c 61 6d 62 64 61 20 28 61  steps (lambda (a
a390: 20 62 29 28 3c 20 28 64 62 3a 73 74 65 70 2d 67   b)(< (db:step-g
a3a0: 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 61 29  et-event_time a)
a3b0: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65  (db:step-get-eve
a3c0: 6e 74 5f 74 69 6d 65 20 62 29 29 29 29 29 0a 20  nt_time b))))). 
a3d0: 20 20 20 20 20 72 65 73 29 29 29 0a 0a 3b 3b 20       res)))..;; 
a3e0: 74 68 65 20 6e 65 77 20 70 72 65 72 65 71 73 20  the new prereqs 
a3f0: 63 61 6c 63 75 6c 61 74 69 6f 6e 2c 20 6c 6f 6f  calculation, loo
a400: 6b 73 20 61 6c 73 6f 20 61 74 20 69 74 65 6d 70  ks also at itemp
a410: 61 74 68 20 69 66 20 73 70 65 63 69 66 69 65 64  ath if specified
a420: 0a 3b 3b 20 61 6c 6c 20 70 72 65 72 65 71 73 20  .;; all prereqs 
a430: 6d 75 73 74 20 62 65 20 6d 65 74 3a 0a 3b 3b 20  must be met:.;; 
a440: 20 20 20 69 66 20 70 72 65 72 65 71 20 74 65 73     if prereq tes
a450: 74 20 77 69 74 68 20 69 74 65 6d 70 61 74 68 3d  t with itempath=
a460: 27 27 20 69 73 20 43 4f 4d 50 4c 45 54 45 44 20  '' is COMPLETED 
a470: 61 6e 64 20 50 41 53 53 2c 20 57 41 52 4e 2c 20  and PASS, WARN, 
a480: 43 48 45 43 4b 2c 20 6f 72 20 57 41 49 56 45 44  CHECK, or WAIVED
a490: 20 74 68 65 6e 20 70 72 65 72 65 71 20 69 73 20   then prereq is 
a4a0: 6d 65 74 0a 3b 3b 20 20 20 20 69 66 20 70 72 65  met.;;    if pre
a4b0: 72 65 71 20 74 65 73 74 20 77 69 74 68 20 69 74  req test with it
a4c0: 65 6d 70 61 74 68 3d 72 65 66 2d 69 74 65 6d 2d  empath=ref-item-
a4d0: 70 61 74 68 20 61 6e 64 20 43 4f 4d 50 4c 45 54  path and COMPLET
a4e0: 45 44 20 77 69 74 68 20 50 41 53 53 2c 20 57 41  ED with PASS, WA
a4f0: 52 4e 2c 20 43 48 45 43 4b 2c 20 6f 72 20 57 41  RN, CHECK, or WA
a500: 49 56 45 44 20 74 68 65 6e 20 70 72 65 72 65 71  IVED then prereq
a510: 20 69 73 20 6d 65 74 0a 3b 3b 0a 3b 3b 20 4e 6f   is met.;;.;; No
a520: 74 65 3a 20 64 6f 20 6e 6f 74 20 63 6f 6e 76 65  te: do not conve
a530: 72 74 20 74 6f 20 72 65 6d 6f 74 65 20 61 73 20  rt to remote as 
a540: 69 74 20 63 61 6c 6c 73 20 72 65 6d 6f 74 65 20  it calls remote 
a550: 75 6e 64 65 72 20 74 68 65 20 68 6f 6f 64 0a 3b  under the hood.;
a560: 3b 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65  ;.(define (db:ge
a570: 74 2d 70 72 65 72 65 71 73 2d 6e 6f 74 2d 6d 65  t-prereqs-not-me
a580: 74 20 64 62 20 72 75 6e 2d 69 64 20 77 61 69 74  t db run-id wait
a590: 6f 6e 73 20 72 65 66 2d 69 74 65 6d 2d 70 61 74  ons ref-item-pat
a5a0: 68 29 0a 20 20 28 69 66 20 28 6f 72 20 28 6e 6f  h).  (if (or (no
a5b0: 74 20 77 61 69 74 6f 6e 73 29 0a 09 20 20 28 6e  t waitons)..  (n
a5c0: 75 6c 6c 3f 20 77 61 69 74 6f 6e 73 29 29 0a 20  ull? waitons)). 
a5d0: 20 20 20 20 20 27 28 29 0a 20 20 20 20 20 20 28       '().      (
a5e0: 6c 65 74 2a 20 28 28 75 6e 6d 65 74 2d 70 72 65  let* ((unmet-pre
a5f0: 2d 72 65 71 73 20 27 28 29 29 0a 09 20 20 20 20  -reqs '())..    
a600: 20 28 72 65 73 75 6c 74 20 20 20 20 20 20 20 20   (result        
a610: 20 27 28 29 29 29 0a 09 28 66 6f 72 2d 65 61 63   '()))..(for-eac
a620: 68 20 0a 09 20 28 6c 61 6d 62 64 61 20 28 77 61  h .. (lambda (wa
a630: 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 29 0a 09  itontest-name)..
a640: 20 20 20 3b 3b 20 62 79 20 67 65 74 74 69 6e 67     ;; by getting
a650: 20 74 68 65 20 74 65 73 74 73 20 77 69 74 68 20   the tests with 
a660: 6d 61 74 63 68 69 6e 67 20 6e 61 6d 65 20 77 65  matching name we
a670: 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 6f 6e 6c   are looking onl
a680: 79 20 61 74 20 74 68 65 20 6d 61 74 63 68 69 6e  y at the matchin
a690: 67 20 74 65 73 74 20 0a 09 20 20 20 3b 3b 20 61  g test ..   ;; a
a6a0: 6e 64 20 72 65 6c 61 74 65 64 20 73 75 62 20 69  nd related sub i
a6b0: 74 65 6d 73 0a 09 20 20 20 28 6c 65 74 20 28 28  tems..   (let ((
a6c0: 74 65 73 74 73 20 20 20 20 20 20 20 20 20 20 20  tests           
a6d0: 20 20 28 72 64 62 3a 67 65 74 2d 74 65 73 74 73    (rdb:get-tests
a6e0: 2d 66 6f 72 2d 72 75 6e 20 64 62 20 72 75 6e 2d  -for-run db run-
a6f0: 69 64 20 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61  id waitontest-na
a700: 6d 65 20 23 66 20 27 28 29 20 27 28 29 29 29 0a  me #f '() '())).
a710: 09 09 20 28 65 76 65 72 2d 73 65 65 6e 20 20 20  .. (ever-seen   
a720: 20 20 20 20 20 20 23 66 29 0a 09 09 20 28 70 61        #f)... (pa
a730: 72 65 6e 74 2d 77 61 69 74 6f 6e 2d 6d 65 74 20  rent-waiton-met 
a740: 23 66 29 0a 09 09 20 28 69 74 65 6d 2d 77 61 69  #f)... (item-wai
a750: 74 6f 6e 2d 6d 65 74 20 20 20 23 66 29 29 0a 09  ton-met   #f))..
a760: 20 20 20 20 20 28 66 6f 72 2d 65 61 63 68 20 0a       (for-each .
a770: 09 20 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28  .      (lambda (
a780: 74 65 73 74 29 0a 09 09 3b 3b 20 28 69 66 20 28  test)...;; (if (
a790: 65 71 75 61 6c 3f 20 77 61 69 74 6f 6e 74 65 73  equal? waitontes
a7a0: 74 2d 6e 61 6d 65 20 28 64 62 3a 74 65 73 74 2d  t-name (db:test-
a7b0: 67 65 74 2d 74 65 73 74 6e 61 6d 65 20 74 65 73  get-testname tes
a7c0: 74 29 29 20 3b 3b 20 62 79 20 64 65 66 69 6e 74  t)) ;; by defint
a7d0: 69 6f 6e 20 74 68 69 73 20 68 61 64 20 62 65 74  ion this had bet
a7e0: 74 65 72 20 62 65 20 74 72 75 65 20 2e 2e 2e 0a  ter be true ....
a7f0: 09 09 28 6c 65 74 2a 20 28 28 73 74 61 74 65 20  ..(let* ((state 
a800: 20 20 20 20 20 20 20 20 20 20 20 20 28 64 62 3a              (db:
a810: 74 65 73 74 2d 67 65 74 2d 73 74 61 74 65 20 74  test-get-state t
a820: 65 73 74 29 29 0a 09 09 20 20 20 20 20 20 20 28  est))...       (
a830: 73 74 61 74 75 73 20 20 20 20 20 20 20 20 20 20  status          
a840: 20 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 73    (db:test-get-s
a850: 74 61 74 75 73 20 74 65 73 74 29 29 0a 09 09 20  tatus test))... 
a860: 20 20 20 20 20 20 28 69 74 65 6d 2d 70 61 74 68        (item-path
a870: 20 20 20 20 20 20 20 20 20 28 64 62 3a 74 65 73           (db:tes
a880: 74 2d 67 65 74 2d 69 74 65 6d 2d 70 61 74 68 20  t-get-item-path 
a890: 74 65 73 74 29 29 0a 09 09 20 20 20 20 20 20 20  test))...       
a8a0: 28 69 73 2d 63 6f 6d 70 6c 65 74 65 64 20 20 20  (is-completed   
a8b0: 20 20 20 28 65 71 75 61 6c 3f 20 73 74 61 74 65     (equal? state
a8c0: 20 22 43 4f 4d 50 4c 45 54 45 44 22 29 29 0a 09   "COMPLETED"))..
a8d0: 09 20 20 20 20 20 20 20 28 69 73 2d 6f 6b 20 20  .       (is-ok  
a8e0: 20 20 20 20 20 20 20 20 20 20 20 28 6d 65 6d 62             (memb
a8f0: 65 72 20 73 74 61 74 75 73 20 27 28 22 50 41 53  er status '("PAS
a900: 53 22 20 22 57 41 52 4e 22 20 22 43 48 45 43 4b  S" "WARN" "CHECK
a910: 22 20 22 57 41 49 56 45 44 22 29 29 29 0a 09 09  " "WAIVED")))...
a920: 20 20 20 20 20 20 20 28 73 61 6d 65 2d 69 74 65         (same-ite
a930: 6d 70 61 74 68 20 20 20 20 20 28 65 71 75 61 6c  mpath     (equal
a940: 3f 20 72 65 66 2d 69 74 65 6d 2d 70 61 74 68 20  ? ref-item-path 
a950: 69 74 65 6d 2d 70 61 74 68 29 29 29 0a 09 09 20  item-path)))... 
a960: 20 28 73 65 74 21 20 65 76 65 72 2d 73 65 65 6e   (set! ever-seen
a970: 20 23 74 29 0a 09 09 20 20 28 63 6f 6e 64 0a 09   #t)...  (cond..
a980: 09 20 20 20 3b 3b 20 63 61 73 65 20 31 2c 20 6e  .   ;; case 1, n
a990: 6f 6e 2d 69 74 65 6d 20 28 70 61 72 65 6e 74 20  on-item (parent 
a9a0: 74 65 73 74 29 20 69 73 20 0a 09 09 20 20 20 28  test) is ...   (
a9b0: 28 61 6e 64 20 28 65 71 75 61 6c 3f 20 69 74 65  (and (equal? ite
a9c0: 6d 2d 70 61 74 68 20 22 22 29 20 3b 3b 20 74 68  m-path "") ;; th
a9d0: 69 73 20 69 73 20 74 68 65 20 70 61 72 65 6e 74  is is the parent
a9e0: 20 74 65 73 74 0a 09 09 09 20 69 73 2d 63 6f 6d   test.... is-com
a9f0: 70 6c 65 74 65 64 0a 09 09 09 20 69 73 2d 6f 6b  pleted.... is-ok
aa00: 29 0a 09 09 20 20 20 20 28 73 65 74 21 20 70 61  )...    (set! pa
aa10: 72 65 6e 74 2d 77 61 69 74 6f 6e 2d 6d 65 74 20  rent-waiton-met 
aa20: 23 74 29 29 0a 09 09 20 20 20 28 28 61 6e 64 20  #t))...   ((and 
aa30: 73 61 6d 65 2d 69 74 65 6d 70 61 74 68 0a 09 09  same-itempath...
aa40: 09 20 69 73 2d 63 6f 6d 70 6c 65 74 65 64 0a 09  . is-completed..
aa50: 09 09 20 69 73 2d 6f 6b 29 0a 09 09 20 20 20 20  .. is-ok)...    
aa60: 28 73 65 74 21 20 69 74 65 6d 2d 77 61 69 74 6f  (set! item-waito
aa70: 6e 2d 6d 65 74 20 23 74 29 29 29 29 29 0a 09 20  n-met #t))))).. 
aa80: 20 20 20 20 20 74 65 73 74 73 29 0a 09 20 20 20       tests)..   
aa90: 20 20 28 69 66 20 28 6e 6f 74 20 28 6f 72 20 70    (if (not (or p
aaa0: 61 72 65 6e 74 2d 77 61 69 74 6f 6e 2d 6d 65 74  arent-waiton-met
aab0: 20 69 74 65 6d 2d 77 61 69 74 6f 6e 2d 6d 65 74   item-waiton-met
aac0: 29 29 0a 09 09 20 28 73 65 74 21 20 72 65 73 75  ))... (set! resu
aad0: 6c 74 20 28 63 6f 6e 73 20 77 61 69 74 6f 6e 74  lt (cons waitont
aae0: 65 73 74 2d 6e 61 6d 65 20 72 65 73 75 6c 74 29  est-name result)
aaf0: 29 29 0a 09 20 20 20 20 20 3b 3b 20 69 66 20 74  ))..     ;; if t
ab00: 68 65 20 74 65 73 74 20 69 73 20 6e 6f 74 20 66  he test is not f
ab10: 6f 75 6e 64 20 74 68 65 6e 20 63 6c 65 61 72 6c  ound then clearl
ab20: 79 20 74 68 65 20 77 61 69 74 6f 6e 20 69 73 20  y the waiton is 
ab30: 6e 6f 74 20 6d 65 74 2e 2e 2e 0a 09 20 20 20 20  not met.....    
ab40: 20 28 69 66 20 28 6e 6f 74 20 65 76 65 72 2d 73   (if (not ever-s
ab50: 65 65 6e 29 28 73 65 74 21 20 72 65 73 75 6c 74  een)(set! result
ab60: 20 28 63 6f 6e 73 20 77 61 69 74 6f 6e 74 65 73   (cons waitontes
ab70: 74 2d 6e 61 6d 65 20 72 65 73 75 6c 74 29 29 29  t-name result)))
ab80: 29 29 0a 09 77 61 69 74 6f 6e 73 29 0a 20 20 20  ))..waitons).   
ab90: 20 20 20 28 64 65 6c 65 74 65 2d 64 75 70 6c 69     (delete-dupli
aba0: 63 61 74 65 73 20 72 65 73 75 6c 74 29 29 29 29  cates result))))
abb0: 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65  ..(define (db:te
abc0: 73 74 73 74 65 70 2d 73 65 74 2d 73 74 61 74 75  ststep-set-statu
abd0: 73 21 20 64 62 20 74 65 73 74 2d 69 64 20 74 65  s! db test-id te
abe0: 73 74 73 74 65 70 2d 6e 61 6d 65 20 73 74 61 74  ststep-name stat
abf0: 65 2d 69 6e 20 73 74 61 74 75 73 2d 69 6e 20 69  e-in status-in i
ac00: 74 65 6d 2d 70 61 74 68 20 63 6f 6d 6d 65 6e 74  tem-path comment
ac10: 20 6c 6f 67 66 69 6c 65 29 0a 20 20 28 64 65 62   logfile).  (deb
ac20: 75 67 3a 70 72 69 6e 74 20 34 20 22 74 65 73 74  ug:print 4 "test
ac30: 2d 69 64 3a 20 22 20 74 65 73 74 2d 69 64 20 22  -id: " test-id "
ac40: 20 74 65 73 74 73 74 65 70 2d 6e 61 6d 65 3a 20   teststep-name: 
ac50: 22 20 74 65 73 74 73 74 65 70 2d 6e 61 6d 65 29  " teststep-name)
ac60: 0a 20 20 28 6c 65 74 2a 20 28 28 73 74 61 74 65  .  (let* ((state
ac70: 20 20 20 20 20 28 63 68 65 63 6b 2d 76 61 6c 69       (check-vali
ac80: 64 2d 69 74 65 6d 73 20 22 73 74 61 74 65 22 20  d-items "state" 
ac90: 73 74 61 74 65 2d 69 6e 29 29 0a 09 20 28 73 74  state-in)).. (st
aca0: 61 74 75 73 20 20 20 20 28 63 68 65 63 6b 2d 76  atus    (check-v
acb0: 61 6c 69 64 2d 69 74 65 6d 73 20 22 73 74 61 74  alid-items "stat
acc0: 75 73 22 20 73 74 61 74 75 73 2d 69 6e 29 29 29  us" status-in)))
acd0: 0a 20 20 20 20 28 69 66 20 28 6f 72 20 28 6e 6f  .    (if (or (no
ace0: 74 20 73 74 61 74 65 29 28 6e 6f 74 20 73 74 61  t state)(not sta
acf0: 74 75 73 29 29 0a 09 28 64 65 62 75 67 3a 70 72  tus))..(debug:pr
ad00: 69 6e 74 20 30 20 22 57 41 52 4e 49 4e 47 3a 20  int 0 "WARNING: 
ad10: 49 6e 76 61 6c 69 64 20 22 20 28 69 66 20 73 74  Invalid " (if st
ad20: 61 74 75 73 20 22 73 74 61 74 75 73 22 20 22 73  atus "status" "s
ad30: 74 61 74 65 22 29 0a 09 09 20 20 20 20 20 22 20  tate")...     " 
ad40: 76 61 6c 75 65 20 5c 22 22 20 28 69 66 20 73 74  value \"" (if st
ad50: 61 74 75 73 20 73 74 61 74 65 2d 69 6e 20 73 74  atus state-in st
ad60: 61 74 75 73 2d 69 6e 29 20 22 5c 22 2c 20 75 70  atus-in) "\", up
ad70: 64 61 74 65 20 79 6f 75 72 20 76 61 6c 69 64 76  date your validv
ad80: 61 6c 75 65 73 20 73 65 63 74 69 6f 6e 20 69 6e  alues section in
ad90: 20 6d 65 67 61 74 65 73 74 2e 63 6f 6e 66 69 67   megatest.config
ada0: 22 29 29 0a 20 20 20 20 28 6d 75 74 65 78 2d 6c  ")).    (mutex-l
adb0: 6f 63 6b 21 20 2a 69 6e 63 6f 6d 69 6e 67 2d 6d  ock! *incoming-m
adc0: 75 74 65 78 2a 29 0a 20 20 20 20 28 73 65 74 21  utex*).    (set!
add0: 20 2a 69 6e 63 6f 6d 69 6e 67 2d 64 61 74 61 2a   *incoming-data*
ade0: 20 28 63 6f 6e 73 20 28 76 65 63 74 6f 72 20 27   (cons (vector '
adf0: 73 74 65 70 2d 73 74 61 74 75 73 0a 09 09 09 09  step-status.....
ae00: 09 28 63 75 72 72 65 6e 74 2d 73 65 63 6f 6e 64  .(current-second
ae10: 73 29 0a 09 09 09 09 09 3b 3b 20 46 49 58 4d 45  s)......;; FIXME
ae20: 20 2d 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e   - this should n
ae30: 6f 74 20 75 70 64 61 74 65 20 74 68 65 20 6c 6f  ot update the lo
ae40: 67 66 69 6c 65 20 75 6e 6c 65 73 73 20 69 74 20  gfile unless it 
ae50: 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a 09 09  is specified....
ae60: 09 09 09 28 6c 69 73 74 20 74 65 73 74 2d 69 64  ...(list test-id
ae70: 20 74 65 73 74 73 74 65 70 2d 6e 61 6d 65 20 73   teststep-name s
ae80: 74 61 74 65 2d 69 6e 20 73 74 61 74 75 73 2d 69  tate-in status-i
ae90: 6e 20 28 63 75 72 72 65 6e 74 2d 73 65 63 6f 6e  n (current-secon
aea0: 64 73 29 20 28 69 66 20 63 6f 6d 6d 65 6e 74 20  ds) (if comment 
aeb0: 63 6f 6d 6d 65 6e 74 20 22 22 29 20 28 69 66 20  comment "") (if 
aec0: 6c 6f 67 66 69 6c 65 20 6c 6f 67 66 69 6c 65 20  logfile logfile 
aed0: 22 22 29 29 29 0a 09 09 09 09 2a 69 6e 63 6f 6d  ""))).....*incom
aee0: 69 6e 67 2d 64 61 74 61 2a 29 29 0a 20 20 20 20  ing-data*)).    
aef0: 28 6d 75 74 65 78 2d 75 6e 6c 6f 63 6b 21 20 2a  (mutex-unlock! *
af00: 69 6e 63 6f 6d 69 6e 67 2d 6d 75 74 65 78 2a 29  incoming-mutex*)
af10: 0a 20 20 20 20 28 69 66 20 28 6e 6f 74 20 2a 63  .    (if (not *c
af20: 61 63 68 65 2d 6f 6e 2a 29 28 64 62 3a 77 72 69  ache-on*)(db:wri
af30: 74 65 2d 63 61 63 68 65 64 2d 64 61 74 61 20 64  te-cached-data d
af40: 62 29 29 0a 20 20 20 20 23 74 29 29 0a 0a 3b 3b  b)).    #t))..;;
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 3d 3d 3d 3d 3d  ================
af90: 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 45 78 74 72 61 63  ======.;; Extrac
afa0: 74 20 6f 64 73 20 66 69 6c 65 20 66 72 6f 6d 20  t ods file from 
afb0: 74 68 65 20 64 62 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d  the db.;;=======
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 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a  ===============.
b000: 0a 3b 3b 20 72 75 6e 73 70 61 74 74 20 69 73 20  .;; runspatt is 
b010: 61 20 63 6f 6d 6d 61 20 64 65 6c 69 6d 69 74 65  a comma delimite
b020: 64 20 6c 69 73 74 20 6f 66 20 72 75 6e 20 70 61  d list of run pa
b030: 74 74 65 72 6e 73 0a 3b 3b 20 6b 65 79 70 61 74  tterns.;; keypat
b040: 74 2d 61 6c 69 73 74 20 6d 75 73 74 20 63 6f 6e  t-alist must con
b050: 74 61 69 6e 20 2a 61 6c 6c 2a 20 6b 65 79 73 20  tain *all* keys 
b060: 77 69 74 68 20 61 6e 20 61 73 73 6f 63 69 61 74  with an associat
b070: 65 64 20 70 61 74 74 65 72 6e 3a 20 27 28 20 28  ed pattern: '( (
b080: 22 4b 45 59 31 22 20 22 25 22 29 20 2e 2e 20 29  "KEY1" "%") .. )
b090: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 65 78 74  .(define (db:ext
b0a0: 72 61 63 74 2d 6f 64 73 2d 66 69 6c 65 20 64 62  ract-ods-file db
b0b0: 20 6f 75 74 70 75 74 66 69 6c 65 20 6b 65 79 70   outputfile keyp
b0c0: 61 74 74 2d 61 6c 69 73 74 20 72 75 6e 73 70 61  att-alist runspa
b0d0: 74 74 20 70 61 74 68 6d 6f 64 29 0a 20 20 28 6c  tt pathmod).  (l
b0e0: 65 74 2a 20 28 28 6b 65 79 73 73 74 72 20 20 28  et* ((keysstr  (
b0f0: 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72  string-intersper
b100: 73 65 20 28 6d 61 70 20 63 61 72 20 6b 65 79 70  se (map car keyp
b110: 61 74 74 2d 61 6c 69 73 74 29 20 22 2c 22 29 29  att-alist) ","))
b120: 0a 09 20 28 6b 65 79 71 72 79 20 20 20 28 73 74  .. (keyqry   (st
b130: 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65  ring-intersperse
b140: 20 28 6d 61 70 20 28 6c 61 6d 62 64 61 20 28 70   (map (lambda (p
b150: 29 28 63 6f 6e 63 20 28 63 61 72 20 70 29 20 22  )(conc (car p) "
b160: 20 4c 49 4b 45 20 3f 20 22 29 29 20 6b 65 79 70   LIKE ? ")) keyp
b170: 61 74 74 2d 61 6c 69 73 74 29 20 22 20 41 4e 44  att-alist) " AND
b180: 20 22 29 29 0a 09 20 28 6e 75 6d 6b 65 79 73 20   ")).. (numkeys 
b190: 20 28 6c 65 6e 67 74 68 20 6b 65 79 70 61 74 74   (length keypatt
b1a0: 2d 61 6c 69 73 74 29 29 0a 09 20 28 74 65 73 74  -alist)).. (test
b1b0: 2d 69 64 73 20 27 28 29 29 0a 09 20 28 77 69 6e  -ids '()).. (win
b1c0: 64 6f 77 73 20 20 28 61 6e 64 20 70 61 74 68 6d  dows  (and pathm
b1d0: 6f 64 20 28 73 75 62 73 74 72 69 6e 67 2d 69 6e  od (substring-in
b1e0: 64 65 78 20 22 5c 5c 22 20 70 61 74 68 6d 6f 64  dex "\\" pathmod
b1f0: 29 29 29 0a 09 20 28 74 65 6d 70 64 69 72 20 20  ))).. (tempdir  
b200: 28 63 6f 6e 63 20 22 2f 74 6d 70 2f 22 20 28 63  (conc "/tmp/" (c
b210: 75 72 72 65 6e 74 2d 75 73 65 72 2d 6e 61 6d 65  urrent-user-name
b220: 29 20 22 2f 22 20 72 75 6e 73 70 61 74 74 20 22  ) "/" runspatt "
b230: 5f 22 20 28 72 61 6e 64 6f 6d 20 31 30 30 30 30  _" (random 10000
b240: 29 20 22 5f 22 20 28 63 75 72 72 65 6e 74 2d 70  ) "_" (current-p
b250: 72 6f 63 65 73 73 2d 69 64 29 29 29 0a 09 20 28  rocess-id))).. (
b260: 72 75 6e 73 68 65 61 64 65 72 20 28 61 70 70 65  runsheader (appe
b270: 6e 64 20 28 6c 69 73 74 20 22 52 75 6e 20 49 64  nd (list "Run Id
b280: 22 20 22 52 75 6e 6e 61 6d 65 22 29 20 3b 20 30  " "Runname") ; 0
b290: 20 31 0a 09 09 09 20 20 20 20 20 28 6d 61 70 20   1....     (map 
b2a0: 63 61 72 20 6b 65 79 70 61 74 74 2d 61 6c 69 73  car keypatt-alis
b2b0: 74 29 20 20 20 3b 20 2b 20 4e 20 3d 20 6c 65 6e  t)   ; + N = len
b2c0: 67 74 68 20 6b 65 79 70 61 74 74 2d 61 6c 69 73  gth keypatt-alis
b2d0: 74 0a 09 09 09 20 20 20 20 20 28 6c 69 73 74 20  t....     (list 
b2e0: 22 54 65 73 74 6e 61 6d 65 22 20 20 20 20 20 20  "Testname"      
b2f0: 20 20 20 20 3b 20 32 0a 09 09 09 09 20 20 20 22      ; 2.....   "
b300: 49 74 65 6d 20 50 61 74 68 22 20 20 20 20 20 20  Item Path"      
b310: 20 20 20 3b 20 33 20 0a 09 09 09 09 20 20 20 22     ; 3 .....   "
b320: 44 65 73 63 72 69 70 74 69 6f 6e 22 20 20 20 20  Description"    
b330: 20 20 20 3b 20 34 20 0a 09 09 09 09 20 20 20 22     ; 4 .....   "
b340: 53 74 61 74 65 22 20 20 20 20 20 20 20 20 20 20  State"          
b350: 20 20 20 3b 20 35 20 0a 09 09 09 09 20 20 20 22     ; 5 .....   "
b360: 53 74 61 74 75 73 22 20 20 20 20 20 20 20 20 20  Status"         
b370: 20 20 20 3b 20 36 20 20 0a 09 09 09 09 20 20 20     ; 6  .....   
b380: 22 46 69 6e 61 6c 20 4c 6f 67 22 20 20 20 20 20  "Final Log"     
b390: 20 20 20 20 3b 20 37 20 0a 09 09 09 09 20 20 20      ; 7 .....   
b3a0: 22 52 75 6e 20 44 75 72 61 74 69 6f 6e 22 20 20  "Run Duration"  
b3b0: 20 20 20 20 3b 20 38 20 0a 09 09 09 09 20 20 20      ; 8 .....   
b3c0: 22 57 68 65 6e 20 52 75 6e 22 20 20 20 20 20 20  "When Run"      
b3d0: 20 20 20 20 3b 20 39 20 0a 09 09 09 09 20 20 20      ; 9 .....   
b3e0: 22 54 61 67 73 22 20 20 20 20 20 20 20 20 20 20  "Tags"          
b3f0: 20 20 20 20 3b 20 31 30 0a 09 09 09 09 20 20 20      ; 10.....   
b400: 22 52 75 6e 20 4f 77 6e 65 72 22 20 20 20 20 20  "Run Owner"     
b410: 20 20 20 20 3b 20 31 31 0a 09 09 09 09 20 20 20      ; 11.....   
b420: 22 43 6f 6d 6d 65 6e 74 22 20 20 20 20 20 20 20  "Comment"       
b430: 20 20 20 20 3b 20 31 32 0a 09 09 09 09 20 20 20      ; 12.....   
b440: 22 41 75 74 68 6f 72 22 20 20 20 20 20 20 20 20  "Author"        
b450: 20 20 20 20 3b 20 31 33 0a 09 09 09 09 20 20 20      ; 13.....   
b460: 22 54 65 73 74 20 4f 77 6e 65 72 22 20 20 20 20  "Test Owner"    
b470: 20 20 20 20 3b 20 31 34 0a 09 09 09 09 20 20 20      ; 14.....   
b480: 22 52 65 76 69 65 77 65 64 22 20 20 20 20 20 20  "Reviewed"      
b490: 20 20 20 20 3b 20 31 35 0a 09 09 09 09 20 20 20      ; 15.....   
b4a0: 22 44 69 73 6b 66 72 65 65 22 20 20 20 20 20 20  "Diskfree"      
b4b0: 20 20 20 20 3b 20 31 36 0a 09 09 09 09 20 20 20      ; 16.....   
b4c0: 22 55 6e 61 6d 65 22 20 20 20 20 20 20 20 20 20  "Uname"         
b4d0: 20 20 20 20 3b 20 31 37 0a 09 09 09 09 20 20 20      ; 17.....   
b4e0: 22 52 75 6e 64 69 72 22 20 20 20 20 20 20 20 20  "Rundir"        
b4f0: 20 20 20 20 3b 20 31 38 0a 09 09 09 09 20 20 20      ; 18.....   
b500: 22 48 6f 73 74 22 20 20 20 20 20 20 20 20 20 20  "Host"          
b510: 20 20 20 20 3b 20 31 39 0a 09 09 09 09 20 20 20      ; 19.....   
b520: 22 43 70 75 20 4c 6f 61 64 22 20 20 20 20 20 20  "Cpu Load"      
b530: 20 20 20 20 3b 20 32 30 0a 09 09 09 09 20 20 20      ; 20.....   
b540: 29 29 29 0a 09 20 28 72 65 73 75 6c 74 73 20 28  ))).. (results (
b550: 6c 69 73 74 20 72 75 6e 73 68 65 61 64 65 72 29  list runsheader)
b560: 29 09 09 09 20 0a 09 20 28 74 65 73 74 64 61 74  )... .. (testdat
b570: 61 2d 68 65 61 64 65 72 20 28 6c 69 73 74 20 22  a-header (list "
b580: 52 75 6e 20 49 64 22 20 22 54 65 73 74 6e 61 6d  Run Id" "Testnam
b590: 65 22 20 22 49 74 65 6d 20 50 61 74 68 22 20 22  e" "Item Path" "
b5a0: 43 61 74 65 67 6f 72 79 22 20 22 56 61 72 69 61  Category" "Varia
b5b0: 62 6c 65 22 20 22 56 61 6c 75 65 22 20 22 45 78  ble" "Value" "Ex
b5c0: 70 65 63 74 65 64 22 20 22 54 6f 6c 22 20 22 55  pected" "Tol" "U
b5d0: 6e 69 74 73 22 20 22 53 74 61 74 75 73 22 20 22  nits" "Status" "
b5e0: 43 6f 6d 6d 65 6e 74 22 29 29 0a 09 20 28 6d 61  Comment")).. (ma
b5f0: 69 6e 71 72 79 20 28 63 6f 6e 63 20 22 53 45 4c  inqry (conc "SEL
b600: 45 43 54 0a 20 20 20 20 20 20 20 20 20 20 20 20  ECT.            
b610: 20 20 74 2e 74 65 73 74 6e 61 6d 65 2c 72 2e 69    t.testname,r.i
b620: 64 2c 72 75 6e 6e 61 6d 65 2c 22 20 6b 65 79 73  d,runname," keys
b630: 73 74 72 20 22 2c 74 2e 74 65 73 74 6e 61 6d 65  str ",t.testname
b640: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b650: 74 2e 69 74 65 6d 5f 70 61 74 68 2c 74 6d 2e 64  t.item_path,tm.d
b660: 65 73 63 72 69 70 74 69 6f 6e 2c 74 2e 73 74 61  escription,t.sta
b670: 74 65 2c 74 2e 73 74 61 74 75 73 2c 0a 20 20 20  te,t.status,.   
b680: 20 20 20 20 20 20 20 20 20 20 20 66 69 6e 61 6c             final
b690: 5f 6c 6f 67 66 2c 72 75 6e 5f 64 75 72 61 74 69  _logf,run_durati
b6a0: 6f 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  on, .           
b6b0: 20 20 20 73 74 72 66 74 69 6d 65 28 27 25 6d 2f     strftime('%m/
b6c0: 25 64 2f 25 59 20 25 48 3a 25 4d 3a 25 53 27 2c  %d/%Y %H:%M:%S',
b6d0: 64 61 74 65 74 69 6d 65 28 74 2e 65 76 65 6e 74  datetime(t.event
b6e0: 5f 74 69 6d 65 2c 27 75 6e 69 78 65 70 6f 63 68  _time,'unixepoch
b6f0: 27 29 2c 27 6c 6f 63 61 6c 74 69 6d 65 27 29 2c  '),'localtime'),
b700: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
b710: 6d 2e 74 61 67 73 2c 72 2e 6f 77 6e 65 72 2c 74  m.tags,r.owner,t
b720: 2e 63 6f 6d 6d 65 6e 74 2c 0a 20 20 20 20 20 20  .comment,.      
b730: 20 20 20 20 20 20 20 20 61 75 74 68 6f 72 2c 0a          author,.
b740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6d                tm
b750: 2e 6f 77 6e 65 72 2c 72 65 76 69 65 77 65 64 2c  .owner,reviewed,
b760: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  .              d
b770: 69 73 6b 66 72 65 65 2c 75 6e 61 6d 65 2c 72 75  iskfree,uname,ru
b780: 6e 64 69 72 2c 0a 20 20 20 20 20 20 20 20 20 20  ndir,.          
b790: 20 20 20 20 68 6f 73 74 2c 63 70 75 6c 6f 61 64      host,cpuload
b7a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 46 52 4f  .            FRO
b7b0: 4d 20 74 65 73 74 73 20 41 53 20 74 20 4a 4f 49  M tests AS t JOI
b7c0: 4e 20 72 75 6e 73 20 41 53 20 72 20 4f 4e 20 74  N runs AS r ON t
b7d0: 2e 72 75 6e 5f 69 64 3d 72 2e 69 64 20 4a 4f 49  .run_id=r.id JOI
b7e0: 4e 20 74 65 73 74 5f 6d 65 74 61 20 41 53 20 74  N test_meta AS t
b7f0: 6d 20 4f 4e 20 74 6d 2e 74 65 73 74 6e 61 6d 65  m ON tm.testname
b800: 3d 74 2e 74 65 73 74 6e 61 6d 65 0a 20 20 20 20  =t.testname.    
b810: 20 20 20 20 20 20 20 20 57 48 45 52 45 20 72 75          WHERE ru
b820: 6e 6e 61 6d 65 20 4c 49 4b 45 20 3f 20 41 4e 44  nname LIKE ? AND
b830: 20 22 20 6b 65 79 71 72 79 20 22 3b 22 29 29 29   " keyqry ";")))
b840: 0a 20 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e  .    (debug:prin
b850: 74 20 32 20 22 55 73 69 6e 67 20 22 20 74 65 6d  t 2 "Using " tem
b860: 70 64 69 72 20 22 20 66 6f 72 20 63 6f 6e 73 74  pdir " for const
b870: 72 75 63 74 69 6e 67 20 74 68 65 20 6f 64 73 20  ructing the ods 
b880: 66 69 6c 65 2e 20 6b 65 79 71 72 79 3a 20 22 20  file. keyqry: " 
b890: 6b 65 79 71 72 79 20 22 20 6b 65 79 73 74 72 3a  keyqry " keystr:
b8a0: 20 22 20 6b 65 79 73 73 74 72 20 22 20 77 69 74   " keysstr " wit
b8b0: 68 20 6b 65 79 73 3a 20 22 20 28 6d 61 70 20 63  h keys: " (map c
b8c0: 61 64 72 20 6b 65 79 70 61 74 74 2d 61 6c 69 73  adr keypatt-alis
b8d0: 74 29 0a 09 09 20 22 5c 6e 20 20 20 20 20 20 6d  t)... "\n      m
b8e0: 61 69 6e 71 72 79 3a 20 22 20 6d 61 69 6e 71 72  ainqry: " mainqr
b8f0: 79 29 0a 20 20 20 20 3b 3b 20 22 45 78 70 65 63  y).    ;; "Expec
b900: 74 65 64 20 56 61 6c 75 65 22 0a 20 20 20 20 3b  ted Value".    ;
b910: 3b 20 22 56 61 6c 75 65 20 46 6f 75 6e 64 22 0a  ; "Value Found".
b920: 20 20 20 20 3b 3b 20 22 54 6f 6c 65 72 61 6e 63      ;; "Toleranc
b930: 65 22 0a 20 20 20 20 28 61 70 70 6c 79 20 73 71  e".    (apply sq
b940: 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72  lite3:for-each-r
b950: 6f 77 0a 09 20 20 20 28 6c 61 6d 62 64 61 20 28  ow..   (lambda (
b960: 74 65 73 74 2d 69 64 20 2e 20 62 29 0a 09 20 20  test-id . b)..  
b970: 20 20 20 28 73 65 74 21 20 74 65 73 74 2d 69 64     (set! test-id
b980: 73 20 28 63 6f 6e 73 20 74 65 73 74 2d 69 64 20  s (cons test-id 
b990: 74 65 73 74 2d 69 64 73 29 29 20 20 20 3b 3b 20  test-ids))   ;; 
b9a0: 74 65 73 74 2d 69 64 20 69 73 20 6e 6f 77 20 74  test-id is now t
b9b0: 65 73 74 6e 61 6d 65 0a 09 20 20 20 20 20 28 73  estname..     (s
b9c0: 65 74 21 20 72 65 73 75 6c 74 73 20 28 61 70 70  et! results (app
b9d0: 65 6e 64 20 72 65 73 75 6c 74 73 20 3b 3b 20 6e  end results ;; n
b9e0: 6f 74 65 2c 20 64 72 6f 70 20 74 68 65 20 74 65  ote, drop the te
b9f0: 73 74 2d 69 64 0a 09 09 09 09 20 20 20 28 6c 69  st-id.....   (li
ba00: 73 74 0a 09 09 09 09 20 20 20 20 28 69 66 20 70  st.....    (if p
ba10: 61 74 68 6d 6f 64 0a 09 09 09 09 09 28 6c 65 74  athmod......(let
ba20: 2a 20 28 28 76 62 20 20 20 20 20 20 20 20 28 61  * ((vb        (a
ba30: 70 70 6c 79 20 76 65 63 74 6f 72 20 62 29 29 0a  pply vector b)).
ba40: 09 09 09 09 09 20 20 20 20 20 20 20 28 6b 65 79  .....       (key
ba50: 76 61 6c 73 20 20 20 28 6c 65 74 20 6c 6f 6f 70  vals   (let loop
ba60: 20 28 28 69 20 20 20 20 30 29 0a 09 09 09 09 09   ((i    0)......
ba70: 09 09 09 20 20 20 20 20 28 72 65 73 20 27 28 29  ...     (res '()
ba80: 29 29 0a 09 09 09 09 09 09 09 20 20 20 20 28 69  ))........    (i
ba90: 66 20 28 3e 3d 20 69 20 6e 75 6d 6b 65 79 73 29  f (>= i numkeys)
baa0: 0a 09 09 09 09 09 09 09 09 72 65 73 0a 09 09 09  .........res....
bab0: 09 09 09 09 09 28 6c 6f 6f 70 20 28 2b 20 69 20  .....(loop (+ i 
bac0: 31 29 0a 09 09 09 09 09 09 09 09 20 20 20 20 20  1).........     
bad0: 20 28 61 70 70 65 6e 64 20 72 65 73 20 28 6c 69   (append res (li
bae0: 73 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76  st (vector-ref v
baf0: 62 20 28 2b 20 69 20 32 29 29 29 29 29 29 29 29  b (+ i 2))))))))
bb00: 0a 09 09 09 09 09 20 20 20 20 20 20 20 28 72 75  ......       (ru
bb10: 6e 6e 61 6d 65 20 20 20 28 76 65 63 74 6f 72 2d  nname   (vector-
bb20: 72 65 66 20 76 62 20 31 29 29 0a 09 09 09 09 09  ref vb 1))......
bb30: 20 20 20 20 20 20 20 28 74 65 73 74 6e 61 6d 65         (testname
bb40: 20 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62    (vector-ref vb
bb50: 20 28 2b 20 20 32 20 6e 75 6d 6b 65 79 73 29 29   (+  2 numkeys))
bb60: 29 0a 09 09 09 09 09 20 20 20 20 20 20 20 28 69  )......       (i
bb70: 74 65 6d 2d 70 61 74 68 20 28 76 65 63 74 6f 72  tem-path (vector
bb80: 2d 72 65 66 20 76 62 20 28 2b 20 20 33 20 6e 75  -ref vb (+  3 nu
bb90: 6d 6b 65 79 73 29 29 29 0a 09 09 09 09 09 20 20  mkeys)))......  
bba0: 20 20 20 20 20 28 66 69 6e 61 6c 2d 6c 6f 67 20       (final-log 
bbb0: 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62 20 28  (vector-ref vb (
bbc0: 2b 20 20 37 20 6e 75 6d 6b 65 79 73 29 29 29 0a  +  7 numkeys))).
bbd0: 09 09 09 09 09 20 20 20 20 20 20 20 28 72 75 6e  .....       (run
bbe0: 2d 64 69 72 20 20 20 28 76 65 63 74 6f 72 2d 72  -dir   (vector-r
bbf0: 65 66 20 76 62 20 28 2b 20 31 38 20 6e 75 6d 6b  ef vb (+ 18 numk
bc00: 65 79 73 29 29 29 0a 09 09 09 09 09 20 20 20 20  eys)))......    
bc10: 20 20 20 28 6c 6f 67 2d 66 70 61 74 68 20 28 63     (log-fpath (c
bc20: 6f 6e 63 20 72 75 6e 2d 64 69 72 20 22 2f 22 20  onc run-dir "/" 
bc30: 20 66 69 6e 61 6c 2d 6c 6f 67 29 29 29 20 3b 3b   final-log))) ;;
bc40: 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70   (string-intersp
bc50: 65 72 73 65 20 6b 65 79 76 61 6c 73 20 22 2f 22  erse keyvals "/"
bc60: 29 20 22 2f 22 20 74 65 73 74 6e 61 6d 65 20 22  ) "/" testname "
bc70: 2f 22 20 69 74 65 6d 2d 70 61 74 68 20 22 2f 22  /" item-path "/"
bc80: 0a 09 09 09 09 09 20 20 28 64 65 62 75 67 3a 70  ......  (debug:p
bc90: 72 69 6e 74 20 34 20 22 6c 6f 67 3a 20 22 20 6c  rint 4 "log: " l
bca0: 6f 67 2d 66 70 61 74 68 20 22 20 65 78 69 73 74  og-fpath " exist
bcb0: 73 3a 20 22 20 28 66 69 6c 65 2d 65 78 69 73 74  s: " (file-exist
bcc0: 73 3f 20 6c 6f 67 2d 66 70 61 74 68 29 29 0a 09  s? log-fpath))..
bcd0: 09 09 09 09 20 20 28 76 65 63 74 6f 72 2d 73 65  ....  (vector-se
bce0: 74 21 20 76 62 20 28 2b 20 37 20 6e 75 6d 6b 65  t! vb (+ 7 numke
bcf0: 79 73 29 20 28 69 66 20 28 66 69 6c 65 2d 65 78  ys) (if (file-ex
bd00: 69 73 74 73 3f 20 6c 6f 67 2d 66 70 61 74 68 29  ists? log-fpath)
bd10: 0a 09 09 09 09 09 09 09 09 09 20 20 20 20 28 6c  ..........    (l
bd20: 65 74 20 28 28 6e 65 77 70 61 74 68 20 28 63 6f  et ((newpath (co
bd30: 6e 63 20 70 61 74 68 6d 6f 64 20 22 2f 22 0a 09  nc pathmod "/"..
bd40: 09 09 09 09 09 09 09 09 09 09 09 20 28 73 74 72  ........... (str
bd50: 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20  ing-intersperse 
bd60: 6b 65 79 76 61 6c 73 20 22 2f 22 29 0a 09 09 09  keyvals "/")....
bd70: 09 09 09 09 09 09 09 09 09 20 22 2f 22 20 72 75  ......... "/" ru
bd80: 6e 6e 61 6d 65 20 22 2f 22 20 74 65 73 74 6e 61  nname "/" testna
bd90: 6d 65 20 22 2f 22 0a 09 09 09 09 09 09 09 09 09  me "/"..........
bda0: 09 09 09 20 28 69 66 20 28 73 74 72 69 6e 67 3d  ... (if (string=
bdb0: 3f 20 69 74 65 6d 2d 70 61 74 68 20 22 22 29 20  ? item-path "") 
bdc0: 22 22 20 28 63 6f 6e 63 20 22 2f 22 20 69 74 65  "" (conc "/" ite
bdd0: 6d 2d 70 61 74 68 29 29 0a 09 09 09 09 09 09 09  m-path))........
bde0: 09 09 09 09 09 20 66 69 6e 61 6c 2d 6c 6f 67 29  ..... final-log)
bdf0: 29 29 0a 09 09 09 09 09 09 09 09 09 20 20 20 20  ))..........    
be00: 20 20 3b 3b 20 66 6f 72 20 6e 6f 77 20 74 68 72    ;; for now thr
be10: 6f 77 20 61 77 61 79 20 6e 65 77 70 61 74 68 20  ow away newpath 
be20: 61 6e 64 20 75 73 65 20 74 68 65 20 6c 6f 67 2d  and use the log-
be30: 66 70 61 74 68 20 63 6f 6e 63 27 64 20 77 69 74  fpath conc'd wit
be40: 68 20 70 61 74 68 6d 6f 64 0a 09 09 09 09 09 09  h pathmod.......
be50: 09 09 09 20 20 20 20 20 20 28 73 65 74 21 20 6e  ...      (set! n
be60: 65 77 70 61 74 68 20 28 63 6f 6e 63 20 70 61 74  ewpath (conc pat
be70: 68 6d 6f 64 20 6c 6f 67 2d 66 70 61 74 68 29 29  hmod log-fpath))
be80: 0a 09 09 09 09 09 09 09 09 09 20 20 20 20 20 20  ..........      
be90: 28 69 66 20 77 69 6e 64 6f 77 73 20 28 73 74 72  (if windows (str
bea0: 69 6e 67 2d 74 72 61 6e 73 6c 61 74 65 20 6e 65  ing-translate ne
beb0: 77 70 61 74 68 20 22 2f 22 20 22 5c 5c 22 29 20  wpath "/" "\\") 
bec0: 6e 65 77 70 61 74 68 29 29 0a 09 09 09 09 09 09  newpath)).......
bed0: 09 09 09 20 20 20 20 28 69 66 20 28 3e 20 2a 76  ...    (if (> *v
bee0: 65 72 62 6f 73 69 74 79 2a 20 31 29 0a 09 09 09  erbosity* 1)....
bef0: 09 09 09 09 09 09 09 28 63 6f 6e 63 20 66 69 6e  .......(conc fin
bf00: 61 6c 2d 6c 6f 67 20 22 20 6e 6f 74 2d 66 6f 75  al-log " not-fou
bf10: 6e 64 22 29 0a 09 09 09 09 09 09 09 09 09 09 22  nd")..........."
bf20: 22 29 29 29 0a 09 09 09 09 09 20 20 28 76 65 63  ")))......  (vec
bf30: 74 6f 72 2d 3e 6c 69 73 74 20 76 62 29 29 0a 09  tor->list vb))..
bf40: 09 09 09 09 62 29 29 29 29 29 0a 09 20 20 20 64  ....b)))))..   d
bf50: 62 0a 09 20 20 20 6d 61 69 6e 71 72 79 0a 09 20  b..   mainqry.. 
bf60: 20 20 72 75 6e 73 70 61 74 74 20 28 6d 61 70 20    runspatt (map 
bf70: 63 61 64 72 20 6b 65 79 70 61 74 74 2d 61 6c 69  cadr keypatt-ali
bf80: 73 74 29 29 0a 20 20 20 20 28 64 65 62 75 67 3a  st)).    (debug:
bf90: 70 72 69 6e 74 20 32 20 22 46 6f 75 6e 64 20 22  print 2 "Found "
bfa0: 20 28 6c 65 6e 67 74 68 20 74 65 73 74 2d 69 64   (length test-id
bfb0: 73 29 20 22 20 72 65 63 6f 72 64 73 22 29 0a 20  s) " records"). 
bfc0: 20 20 20 28 73 65 74 21 20 72 65 73 75 6c 74 73     (set! results
bfd0: 20 28 6c 69 73 74 20 28 63 6f 6e 73 20 22 52 75   (list (cons "Ru
bfe0: 6e 73 22 20 72 65 73 75 6c 74 73 29 29 29 0a 20  ns" results))). 
bff0: 20 20 20 3b 3b 20 6e 6f 77 2c 20 66 6f 72 20 65     ;; now, for e
c000: 61 63 68 20 74 65 73 74 2c 20 63 6f 6c 6c 65 63  ach test, collec
c010: 74 20 74 68 65 20 74 65 73 74 5f 64 61 74 61 20  t the test_data 
c020: 69 6e 66 6f 20 61 6e 64 20 61 64 64 20 61 20 6e  info and add a n
c030: 65 77 20 73 68 65 65 74 0a 20 20 20 20 28 66 6f  ew sheet.    (fo
c040: 72 2d 65 61 63 68 0a 20 20 20 20 20 28 6c 61 6d  r-each.     (lam
c050: 62 64 61 20 28 74 65 73 74 2d 69 64 29 0a 20 20  bda (test-id).  
c060: 20 20 20 20 20 28 6c 65 74 20 28 28 74 65 73 74       (let ((test
c070: 2d 64 61 74 61 20 28 6c 69 73 74 20 74 65 73 74  -data (list test
c080: 64 61 74 61 2d 68 65 61 64 65 72 29 29 0a 09 20  data-header)).. 
c090: 20 20 20 20 28 63 75 72 72 2d 74 65 73 74 2d 6e      (curr-test-n
c0a0: 61 6d 65 20 23 66 29 29 0a 09 20 28 73 71 6c 69  ame #f)).. (sqli
c0b0: 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77  te3:for-each-row
c0c0: 0a 09 20 20 28 6c 61 6d 62 64 61 20 28 72 75 6e  ..  (lambda (run
c0d0: 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 69 74 65  -id testname ite
c0e0: 6d 2d 70 61 74 68 20 63 61 74 65 67 6f 72 79 20  m-path category 
c0f0: 76 61 72 69 61 62 6c 65 20 76 61 6c 75 65 20 65  variable value e
c100: 78 70 65 63 74 65 64 20 74 6f 6c 20 75 6e 69 74  xpected tol unit
c110: 73 20 73 74 61 74 75 73 20 63 6f 6d 6d 65 6e 74  s status comment
c120: 29 0a 09 20 20 20 20 28 73 65 74 21 20 63 75 72  )..    (set! cur
c130: 72 2d 74 65 73 74 2d 6e 61 6d 65 20 74 65 73 74  r-test-name test
c140: 6e 61 6d 65 29 0a 09 20 20 20 20 28 73 65 74 21  name)..    (set!
c150: 20 74 65 73 74 2d 64 61 74 61 20 28 61 70 70 65   test-data (appe
c160: 6e 64 20 74 65 73 74 2d 64 61 74 61 20 28 6c 69  nd test-data (li
c170: 73 74 20 28 6c 69 73 74 20 72 75 6e 2d 69 64 20  st (list run-id 
c180: 74 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61  testname item-pa
c190: 74 68 20 63 61 74 65 67 6f 72 79 20 76 61 72 69  th category vari
c1a0: 61 62 6c 65 20 76 61 6c 75 65 20 65 78 70 65 63  able value expec
c1b0: 74 65 64 20 74 6f 6c 20 75 6e 69 74 73 20 73 74  ted tol units st
c1c0: 61 74 75 73 20 63 6f 6d 6d 65 6e 74 29 29 29 29  atus comment))))
c1d0: 29 0a 09 20 20 64 62 20 0a 09 20 20 3b 3b 20 22  )..  db ..  ;; "
c1e0: 53 45 4c 45 43 54 20 72 75 6e 5f 69 64 2c 74 65  SELECT run_id,te
c1f0: 73 74 6e 61 6d 65 2c 69 74 65 6d 5f 70 61 74 68  stname,item_path
c200: 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62  ,category,variab
c210: 6c 65 2c 74 64 2e 76 61 6c 75 65 20 41 53 20 76  le,td.value AS v
c220: 61 6c 75 65 2c 65 78 70 65 63 74 65 64 2c 74 6f  alue,expected,to
c230: 6c 2c 75 6e 69 74 73 2c 74 64 2e 73 74 61 74 75  l,units,td.statu
c240: 73 20 41 53 20 73 74 61 74 75 73 2c 74 64 2e 63  s AS status,td.c
c250: 6f 6d 6d 65 6e 74 20 41 53 20 63 6f 6d 6d 65 6e  omment AS commen
c260: 74 20 46 52 4f 4d 20 74 65 73 74 5f 64 61 74 61  t FROM test_data
c270: 20 41 53 20 74 64 20 49 4e 4e 45 52 20 4a 4f 49   AS td INNER JOI
c280: 4e 20 74 65 73 74 73 20 4f 4e 20 74 65 73 74 73  N tests ON tests
c290: 2e 69 64 3d 74 64 2e 74 65 73 74 5f 69 64 20 57  .id=td.test_id W
c2a0: 48 45 52 45 20 74 65 73 74 5f 69 64 3d 3f 3b 22  HERE test_id=?;"
c2b0: 0a 09 20 20 22 53 45 4c 45 43 54 20 72 75 6e 5f  ..  "SELECT run_
c2c0: 69 64 2c 74 65 73 74 6e 61 6d 65 2c 69 74 65 6d  id,testname,item
c2d0: 5f 70 61 74 68 2c 63 61 74 65 67 6f 72 79 2c 76  _path,category,v
c2e0: 61 72 69 61 62 6c 65 2c 74 64 2e 76 61 6c 75 65  ariable,td.value
c2f0: 20 41 53 20 76 61 6c 75 65 2c 74 64 2e 65 78 70   AS value,td.exp
c300: 65 63 74 65 64 2c 74 64 2e 74 6f 6c 2c 74 64 2e  ected,td.tol,td.
c310: 75 6e 69 74 73 2c 74 64 2e 73 74 61 74 75 73 20  units,td.status 
c320: 41 53 20 73 74 61 74 75 73 2c 74 64 2e 63 6f 6d  AS status,td.com
c330: 6d 65 6e 74 20 41 53 20 63 6f 6d 6d 65 6e 74 20  ment AS comment 
c340: 46 52 4f 4d 20 74 65 73 74 5f 64 61 74 61 20 41  FROM test_data A
c350: 53 20 74 64 20 49 4e 4e 45 52 20 4a 4f 49 4e 20  S td INNER JOIN 
c360: 74 65 73 74 73 20 4f 4e 20 74 65 73 74 73 2e 69  tests ON tests.i
c370: 64 3d 74 64 2e 74 65 73 74 5f 69 64 20 57 48 45  d=td.test_id WHE
c380: 52 45 20 74 65 73 74 6e 61 6d 65 3d 3f 3b 22 0a  RE testname=?;".
c390: 09 20 20 74 65 73 74 2d 69 64 29 0a 09 20 28 69  .  test-id).. (i
c3a0: 66 20 63 75 72 72 2d 74 65 73 74 2d 6e 61 6d 65  f curr-test-name
c3b0: 0a 09 20 20 20 20 20 28 73 65 74 21 20 72 65 73  ..     (set! res
c3c0: 75 6c 74 73 20 28 61 70 70 65 6e 64 20 72 65 73  ults (append res
c3d0: 75 6c 74 73 20 28 6c 69 73 74 20 28 63 6f 6e 73  ults (list (cons
c3e0: 20 63 75 72 72 2d 74 65 73 74 2d 6e 61 6d 65 20   curr-test-name 
c3f0: 74 65 73 74 2d 64 61 74 61 29 29 29 29 29 0a 09  test-data)))))..
c400: 20 29 29 0a 20 20 20 20 20 28 73 6f 72 74 20 28   )).     (sort (
c410: 64 65 6c 65 74 65 2d 64 75 70 6c 69 63 61 74 65  delete-duplicate
c420: 73 20 74 65 73 74 2d 69 64 73 29 20 73 74 72 69  s test-ids) stri
c430: 6e 67 3c 3d 29 29 0a 20 20 20 20 28 73 79 73 74  ng<=)).    (syst
c440: 65 6d 20 28 63 6f 6e 63 20 22 6d 6b 64 69 72 20  em (conc "mkdir 
c450: 2d 70 20 22 20 74 65 6d 70 64 69 72 29 29 0a 20  -p " tempdir)). 
c460: 20 20 20 3b 3b 20 28 70 70 20 72 65 73 75 6c 74     ;; (pp result
c470: 73 29 0a 20 20 20 20 28 6f 64 73 3a 6c 69 73 74  s).    (ods:list
c480: 2d 3e 6f 64 73 20 0a 20 20 20 20 20 74 65 6d 70  ->ods .     temp
c490: 64 69 72 0a 20 20 20 20 20 28 69 66 20 28 73 74  dir.     (if (st
c4a0: 72 69 6e 67 2d 6d 61 74 63 68 20 28 72 65 67 65  ring-match (rege
c4b0: 78 70 20 22 5e 5b 2f 7e 5d 2b 2e 2a 22 29 20 6f  xp "^[/~]+.*") o
c4c0: 75 74 70 75 74 66 69 6c 65 29 20 3b 3b 20 66 75  utputfile) ;; fu
c4d0: 6c 6c 20 70 61 74 68 3f 0a 09 20 6f 75 74 70 75  ll path?.. outpu
c4e0: 74 66 69 6c 65 0a 09 20 28 62 65 67 69 6e 0a 09  tfile.. (begin..
c4f0: 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20     (debug:print 
c500: 30 20 22 57 41 52 4e 49 4e 47 3a 20 70 61 74 68  0 "WARNING: path
c510: 20 67 69 76 65 6e 2c 20 22 20 6f 75 74 70 75 74   given, " output
c520: 66 69 6c 65 20 22 20 69 73 20 72 65 6c 61 74 69  file " is relati
c530: 76 65 2c 20 70 72 65 66 69 78 69 6e 67 20 77 69  ve, prefixing wi
c540: 74 68 20 63 75 72 72 65 6e 74 20 64 69 72 65 63  th current direc
c550: 74 6f 72 79 22 29 0a 09 20 20 20 28 63 6f 6e 63  tory")..   (conc
c560: 20 28 63 75 72 72 65 6e 74 2d 64 69 72 65 63 74   (current-direct
c570: 6f 72 79 29 20 22 2f 22 20 6f 75 74 70 75 74 66  ory) "/" outputf
c580: 69 6c 65 29 29 29 0a 20 20 20 20 20 72 65 73 75  ile))).     resu
c590: 6c 74 73 29 0a 20 20 20 20 3b 3b 20 62 72 75 74  lts).    ;; brut
c5a0: 61 6c 20 63 6c 65 61 6e 20 75 70 0a 20 20 20 20  al clean up.    
c5b0: 28 73 79 73 74 65 6d 20 22 72 6d 20 2d 72 66 20  (system "rm -rf 
c5c0: 74 65 6d 70 64 69 72 22 29 29 29 0a 0a 3b 3b 20  tempdir")))..;; 
c5d0: 28 64 62 3a 65 78 74 72 61 63 74 2d 6f 64 73 2d  (db:extract-ods-
c5e0: 66 69 6c 65 20 64 62 20 22 6f 75 74 70 75 74 66  file db "outputf
c5f0: 69 6c 65 2e 6f 64 73 22 20 27 28 28 22 73 79 73  ile.ods" '(("sys
c600: 6e 61 6d 65 22 20 22 25 22 29 28 22 66 73 6e 61  name" "%")("fsna
c610: 6d 65 22 20 22 25 22 29 28 22 64 61 74 61 70 61  me" "%")("datapa
c620: 74 68 22 20 22 25 22 29 29 20 22 25 22 29 0a 0a  th" "%")) "%")..
c630: 0a 3b 3b 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 3d 3d  ================
c670: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 52 45 4d  =========.;; REM
c680: 4f 54 45 20 44 42 20 41 43 43 45 53 53 20 56 49  OTE DB ACCESS VI
c690: 41 20 52 50 43 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d  A RPC.;;========
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 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a  ==============..
c6e0: 28 64 65 66 69 6e 65 20 28 72 64 62 3a 73 65 74  (define (rdb:set
c6f0: 2d 74 65 73 74 73 2d 73 74 61 74 65 2d 73 74 61  -tests-state-sta
c700: 74 75 73 20 64 62 20 72 75 6e 2d 69 64 20 74 65  tus db run-id te
c710: 73 74 6e 61 6d 65 73 20 63 75 72 72 73 74 61 74  stnames currstat
c720: 65 20 63 75 72 72 73 74 61 74 75 73 20 6e 65 77  e currstatus new
c730: 73 74 61 74 65 20 6e 65 77 73 74 61 74 75 73 29  state newstatus)
c740: 0a 20 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74  .  (if *runremot
c750: 65 2a 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28  e*.      (let ((
c760: 68 6f 73 74 20 28 76 65 63 74 6f 72 2d 72 65 66  host (vector-ref
c770: 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29   *runremote* 0))
c780: 0a 09 20 20 20 20 28 70 6f 72 74 20 28 76 65 63  ..    (port (vec
c790: 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f  tor-ref *runremo
c7a0: 74 65 2a 20 31 29 29 29 0a 09 28 28 72 70 63 3a  te* 1)))..((rpc:
c7b0: 70 72 6f 63 65 64 75 72 65 20 27 72 64 62 3a 73  procedure 'rdb:s
c7c0: 65 74 2d 74 65 73 74 73 2d 73 74 61 74 65 2d 73  et-tests-state-s
c7d0: 74 61 74 75 73 20 68 6f 73 74 20 70 6f 72 74 29  tatus host port)
c7e0: 0a 09 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61  .. run-id testna
c7f0: 6d 65 73 20 63 75 72 72 73 74 61 74 65 20 63 75  mes currstate cu
c800: 72 72 73 74 61 74 75 73 20 6e 65 77 73 74 61 74  rrstatus newstat
c810: 65 20 6e 65 77 73 74 61 74 75 73 29 29 0a 20 20  e newstatus)).  
c820: 20 20 20 20 28 64 62 3a 73 65 74 2d 74 65 73 74      (db:set-test
c830: 73 2d 73 74 61 74 65 2d 73 74 61 74 75 73 20 64  s-state-status d
c840: 62 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d  b run-id testnam
c850: 65 73 20 63 75 72 72 73 74 61 74 65 20 63 75 72  es currstate cur
c860: 72 73 74 61 74 75 73 20 6e 65 77 73 74 61 74 65  rstatus newstate
c870: 20 6e 65 77 73 74 61 74 75 73 29 29 29 0a 0a 28   newstatus)))..(
c880: 64 65 66 69 6e 65 20 28 72 64 62 3a 74 65 73 74  define (rdb:test
c890: 73 74 65 70 2d 73 65 74 2d 73 74 61 74 75 73 21  step-set-status!
c8a0: 20 64 62 20 74 65 73 74 2d 69 64 20 74 65 73 74   db test-id test
c8b0: 73 74 65 70 2d 6e 61 6d 65 20 73 74 61 74 65 2d  step-name state-
c8c0: 69 6e 20 73 74 61 74 75 73 2d 69 6e 20 69 74 65  in status-in ite
c8d0: 6d 64 61 74 20 63 6f 6d 6d 65 6e 74 20 6c 6f 67  mdat comment log
c8e0: 66 69 6c 65 29 0a 20 20 28 6c 65 74 20 28 28 69  file).  (let ((i
c8f0: 74 65 6d 2d 70 61 74 68 20 28 69 74 65 6d 2d 6c  tem-path (item-l
c900: 69 73 74 2d 3e 70 61 74 68 20 69 74 65 6d 64 61  ist->path itemda
c910: 74 29 29 29 0a 20 20 20 20 28 69 66 20 2a 72 75  t))).    (if *ru
c920: 6e 72 65 6d 6f 74 65 2a 0a 09 28 6c 65 74 20 28  nremote*..(let (
c930: 28 68 6f 73 74 20 28 76 65 63 74 6f 72 2d 72 65  (host (vector-re
c940: 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29  f *runremote* 0)
c950: 29 0a 09 20 20 20 20 20 20 28 70 6f 72 74 20 28  )..      (port (
c960: 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72  vector-ref *runr
c970: 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09 20 20 28  emote* 1)))..  (
c980: 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20 27  (rpc:procedure '
c990: 72 64 62 3a 74 65 73 74 73 74 65 70 2d 73 65 74  rdb:teststep-set
c9a0: 2d 73 74 61 74 75 73 21 20 68 6f 73 74 20 70 6f  -status! host po
c9b0: 72 74 29 0a 09 20 20 20 74 65 73 74 2d 69 64 20  rt)..   test-id 
c9c0: 74 65 73 74 73 74 65 70 2d 6e 61 6d 65 20 73 74  teststep-name st
c9d0: 61 74 65 2d 69 6e 20 73 74 61 74 75 73 2d 69 6e  ate-in status-in
c9e0: 20 69 74 65 6d 2d 70 61 74 68 20 63 6f 6d 6d 65   item-path comme
c9f0: 6e 74 20 6c 6f 67 66 69 6c 65 29 29 0a 09 28 64  nt logfile))..(d
ca00: 62 3a 74 65 73 74 73 74 65 70 2d 73 65 74 2d 73  b:teststep-set-s
ca10: 74 61 74 75 73 21 20 64 62 20 74 65 73 74 2d 69  tatus! db test-i
ca20: 64 20 74 65 73 74 73 74 65 70 2d 6e 61 6d 65 20  d teststep-name 
ca30: 73 74 61 74 65 2d 69 6e 20 73 74 61 74 75 73 2d  state-in status-
ca40: 69 6e 20 69 74 65 6d 2d 70 61 74 68 20 63 6f 6d  in item-path com
ca50: 6d 65 6e 74 20 6c 6f 67 66 69 6c 65 29 29 29 29  ment logfile))))
ca60: 0a 0a 28 64 65 66 69 6e 65 20 28 72 64 62 3a 74  ..(define (rdb:t
ca70: 65 73 74 2d 75 70 64 61 74 65 2d 6d 65 74 61 2d  est-update-meta-
ca80: 69 6e 66 6f 20 64 62 20 72 75 6e 2d 69 64 20 74  info db run-id t
ca90: 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 64 61 74  est-name itemdat
caa0: 20 6d 69 6e 75 74 65 73 20 63 70 75 6c 6f 61 64   minutes cpuload
cab0: 20 64 69 73 6b 66 72 65 65 20 74 6d 70 66 72 65   diskfree tmpfre
cac0: 65 29 0a 20 20 28 6c 65 74 20 28 28 69 74 65 6d  e).  (let ((item
cad0: 2d 70 61 74 68 20 28 69 74 65 6d 2d 6c 69 73 74  -path (item-list
cae0: 2d 3e 70 61 74 68 20 69 74 65 6d 64 61 74 29 29  ->path itemdat))
caf0: 29 0a 20 20 20 20 28 69 66 20 2a 72 75 6e 72 65  ).    (if *runre
cb00: 6d 6f 74 65 2a 0a 09 28 6c 65 74 20 28 28 68 6f  mote*..(let ((ho
cb10: 73 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a  st (vector-ref *
cb20: 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09  runremote* 0))..
cb30: 20 20 20 20 20 20 28 70 6f 72 74 20 28 76 65 63        (port (vec
cb40: 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f  tor-ref *runremo
cb50: 74 65 2a 20 31 29 29 29 0a 09 20 20 28 28 72 70  te* 1)))..  ((rp
cb60: 63 3a 70 72 6f 63 65 64 75 72 65 20 27 72 64 62  c:procedure 'rdb
cb70: 3a 74 65 73 74 2d 75 70 64 61 74 65 2d 6d 65 74  :test-update-met
cb80: 61 2d 69 6e 66 6f 20 68 6f 73 74 20 70 6f 72 74  a-info host port
cb90: 29 0a 09 20 20 20 72 75 6e 2d 69 64 20 74 65 73  )..   run-id tes
cba0: 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68  t-name item-path
cbb0: 20 6d 69 6e 75 74 65 73 20 63 70 75 6c 6f 61 64   minutes cpuload
cbc0: 20 64 69 73 6b 66 72 65 65 20 74 6d 70 66 72 65   diskfree tmpfre
cbd0: 65 29 29 0a 09 28 64 62 3a 74 65 73 74 2d 75 70  e))..(db:test-up
cbe0: 64 61 74 65 2d 6d 65 74 61 2d 69 6e 66 6f 20 64  date-meta-info d
cbf0: 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61  b run-id test-na
cc00: 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 6d 69 6e  me item-path min
cc10: 75 74 65 73 20 63 70 75 6c 6f 61 64 20 64 69 73  utes cpuload dis
cc20: 6b 66 72 65 65 20 74 6d 70 66 72 65 65 29 29 29  kfree tmpfree)))
cc30: 29 0a 0a 28 64 65 66 69 6e 65 20 28 72 64 62 3a  )..(define (rdb:
cc40: 74 65 73 74 2d 73 65 74 2d 73 74 61 74 65 2d 73  test-set-state-s
cc50: 74 61 74 75 73 2d 62 79 2d 72 75 6e 2d 69 64 2d  tatus-by-run-id-
cc60: 74 65 73 74 6e 61 6d 65 20 64 62 20 72 75 6e 2d  testname db run-
cc70: 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65  id test-name ite
cc80: 6d 2d 70 61 74 68 20 73 74 61 74 75 73 20 73 74  m-path status st
cc90: 61 74 65 29 0a 20 20 28 69 66 20 2a 72 75 6e 72  ate).  (if *runr
cca0: 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c 65  emote*.      (le
ccb0: 74 20 28 28 68 6f 73 74 20 28 76 65 63 74 6f 72  t ((host (vector
ccc0: 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a  -ref *runremote*
ccd0: 20 30 29 29 0a 09 20 20 20 20 28 70 6f 72 74 20   0))..    (port 
cce0: 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e  (vector-ref *run
ccf0: 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28 28  remote* 1)))..((
cd00: 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20 27 72  rpc:procedure 'r
cd10: 64 62 3a 74 65 73 74 2d 73 65 74 2d 73 74 61 74  db:test-set-stat
cd20: 65 2d 73 74 61 74 75 73 2d 62 79 2d 72 75 6e 2d  e-status-by-run-
cd30: 69 64 2d 74 65 73 74 6e 61 6d 65 20 68 6f 73 74  id-testname host
cd40: 20 70 6f 72 74 29 0a 09 20 20 72 75 6e 2d 69 64   port)..  run-id
cd50: 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d   test-name item-
cd60: 70 61 74 68 20 73 74 61 74 75 73 20 73 74 61 74  path status stat
cd70: 65 29 29 0a 20 20 20 20 20 20 28 64 62 3a 74 65  e)).      (db:te
cd80: 73 74 2d 73 65 74 2d 73 74 61 74 65 2d 73 74 61  st-set-state-sta
cd90: 74 75 73 2d 62 79 2d 72 75 6e 2d 69 64 2d 74 65  tus-by-run-id-te
cda0: 73 74 6e 61 6d 65 20 64 62 20 72 75 6e 2d 69 64  stname db run-id
cdb0: 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d   test-name item-
cdc0: 70 61 74 68 20 73 74 61 74 75 73 20 73 74 61 74  path status stat
cdd0: 65 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 72  e)))..(define (r
cde0: 64 62 3a 63 73 76 2d 3e 74 65 73 74 2d 64 61 74  db:csv->test-dat
cdf0: 61 20 64 62 20 74 65 73 74 2d 69 64 20 63 73 76  a db test-id csv
ce00: 64 61 74 61 29 0a 20 20 28 69 66 20 2a 72 75 6e  data).  (if *run
ce10: 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c  remote*.      (l
ce20: 65 74 20 28 28 68 6f 73 74 20 28 76 65 63 74 6f  et ((host (vecto
ce30: 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65  r-ref *runremote
ce40: 2a 20 30 29 29 0a 09 20 20 20 20 28 70 6f 72 74  * 0))..    (port
ce50: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75   (vector-ref *ru
ce60: 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28  nremote* 1)))..(
ce70: 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20 27  (rpc:procedure '
ce80: 72 64 62 3a 63 73 76 2d 3e 74 65 73 74 2d 64 61  rdb:csv->test-da
ce90: 74 61 20 68 6f 73 74 20 70 6f 72 74 29 0a 09 20  ta host port).. 
cea0: 74 65 73 74 2d 69 64 20 63 73 76 64 61 74 61 29  test-id csvdata)
ceb0: 29 0a 20 20 20 20 20 20 28 64 62 3a 63 73 76 2d  ).      (db:csv-
cec0: 3e 74 65 73 74 2d 64 61 74 61 20 64 62 20 74 65  >test-data db te
ced0: 73 74 2d 69 64 20 63 73 76 64 61 74 61 29 29 29  st-id csvdata)))
cee0: 0a 0a 28 64 65 66 69 6e 65 20 28 72 64 62 3a 72  ..(define (rdb:r
cef0: 6f 6c 6c 2d 75 70 2d 70 61 73 73 2d 66 61 69 6c  oll-up-pass-fail
cf00: 2d 63 6f 75 6e 74 73 20 64 62 20 72 75 6e 2d 69  -counts db run-i
cf10: 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d  d test-name item
cf20: 2d 70 61 74 68 20 73 74 61 74 75 73 29 0a 20 20  -path status).  
cf30: 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a  (if *runremote*.
cf40: 20 20 20 20 20 20 28 6c 65 74 20 28 28 68 6f 73        (let ((hos
cf50: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72  t (vector-ref *r
cf60: 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20  unremote* 0)).. 
cf70: 20 20 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72     (port (vector
cf80: 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a  -ref *runremote*
cf90: 20 31 29 29 29 0a 09 28 28 72 70 63 3a 70 72 6f   1)))..((rpc:pro
cfa0: 63 65 64 75 72 65 20 27 72 64 62 3a 72 6f 6c 6c  cedure 'rdb:roll
cfb0: 2d 75 70 2d 70 61 73 73 2d 66 61 69 6c 2d 63 6f  -up-pass-fail-co
cfc0: 75 6e 74 73 20 68 6f 73 74 20 70 6f 72 74 29 0a  unts host port).
cfd0: 09 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61  . run-id test-na
cfe0: 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 73 74 61  me item-path sta
cff0: 74 75 73 29 29 0a 20 20 20 20 20 20 28 64 62 3a  tus)).      (db:
d000: 72 6f 6c 6c 2d 75 70 2d 70 61 73 73 2d 66 61 69  roll-up-pass-fai
d010: 6c 2d 63 6f 75 6e 74 73 20 64 62 20 72 75 6e 2d  l-counts db run-
d020: 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65  id test-name ite
d030: 6d 2d 70 61 74 68 20 73 74 61 74 75 73 29 29 29  m-path status)))
d040: 0a 0a 28 64 65 66 69 6e 65 20 28 72 64 62 3a 74  ..(define (rdb:t
d050: 65 73 74 2d 73 65 74 2d 63 6f 6d 6d 65 6e 74 20  est-set-comment 
d060: 64 62 20 74 65 73 74 2d 69 64 20 63 6f 6d 6d 65  db test-id comme
d070: 6e 74 29 0a 20 20 28 69 66 20 2a 72 75 6e 72 65  nt).  (if *runre
d080: 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c 65 74  mote*.      (let
d090: 20 28 28 68 6f 73 74 20 28 76 65 63 74 6f 72 2d   ((host (vector-
d0a0: 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20  ref *runremote* 
d0b0: 30 29 29 0a 09 20 20 20 20 28 70 6f 72 74 20 28  0))..    (port (
d0c0: 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72  vector-ref *runr
d0d0: 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28 28 72  emote* 1)))..((r
d0e0: 70 63 3a 70 72 6f 63 65 64 75 72 65 20 27 72 64  pc:procedure 'rd
d0f0: 62 3a 74 65 73 74 2d 73 65 74 2d 63 6f 6d 6d 65  b:test-set-comme
d100: 6e 74 20 68 6f 73 74 20 70 6f 72 74 29 0a 09 20  nt host port).. 
d110: 74 65 73 74 2d 69 64 20 63 6f 6d 6d 65 6e 74 29  test-id comment)
d120: 29 0a 20 20 20 20 20 20 28 64 62 3a 74 65 73 74  ).      (db:test
d130: 2d 73 65 74 2d 63 6f 6d 6d 65 6e 74 20 64 62 20  -set-comment db 
d140: 74 65 73 74 2d 69 64 20 63 6f 6d 6d 65 6e 74 29  test-id comment)
d150: 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 72 64 62  ))..(define (rdb
d160: 3a 74 65 73 74 2d 73 65 74 2d 6c 6f 67 21 20 64  :test-set-log! d
d170: 62 20 74 65 73 74 2d 69 64 20 6c 6f 67 66 29 0a  b test-id logf).
d180: 20 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65    (if *runremote
d190: 2a 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28 68  *.      (let ((h
d1a0: 6f 73 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20  ost (vector-ref 
d1b0: 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a  *runremote* 0)).
d1c0: 09 20 20 20 20 28 70 6f 72 74 20 28 76 65 63 74  .    (port (vect
d1d0: 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74  or-ref *runremot
d1e0: 65 2a 20 31 29 29 29 0a 09 28 28 72 70 63 3a 70  e* 1)))..((rpc:p
d1f0: 72 6f 63 65 64 75 72 65 20 27 72 64 62 3a 74 65  rocedure 'rdb:te
d200: 73 74 2d 73 65 74 2d 6c 6f 67 21 20 68 6f 73 74  st-set-log! host
d210: 20 70 6f 72 74 29 20 74 65 73 74 2d 69 64 20 6c   port) test-id l
d220: 6f 67 66 29 29 0a 20 20 20 20 20 20 28 64 62 3a  ogf)).      (db:
d230: 74 65 73 74 2d 73 65 74 2d 6c 6f 67 21 20 64 62  test-set-log! db
d240: 20 74 65 73 74 2d 69 64 20 6c 6f 67 66 29 29 29   test-id logf)))
d250: 0a 0a 28 64 65 66 69 6e 65 20 28 72 64 62 3a 67  ..(define (rdb:g
d260: 65 74 2d 72 75 6e 73 20 64 62 20 72 75 6e 6e 61  et-runs db runna
d270: 6d 65 70 61 74 74 20 6e 75 6d 72 75 6e 73 20 73  mepatt numruns s
d280: 74 61 72 74 72 75 6e 6f 66 66 73 65 74 20 6b 65  tartrunoffset ke
d290: 79 70 61 74 74 73 29 0a 20 20 28 69 66 20 2a 72  ypatts).  (if *r
d2a0: 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20  unremote*.      
d2b0: 28 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65 63  (let ((host (vec
d2c0: 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f  tor-ref *runremo
d2d0: 74 65 2a 20 30 29 29 0a 09 20 20 20 20 28 70 6f  te* 0))..    (po
d2e0: 72 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a  rt (vector-ref *
d2f0: 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a  runremote* 1))).
d300: 09 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65  .((rpc:procedure
d310: 20 27 72 64 62 3a 67 65 74 2d 72 75 6e 73 20 68   'rdb:get-runs h
d320: 6f 73 74 20 70 6f 72 74 29 0a 09 20 72 75 6e 6e  ost port).. runn
d330: 61 6d 65 70 61 74 74 20 6e 75 6d 72 75 6e 73 20  amepatt numruns 
d340: 73 74 61 72 74 72 75 6e 6f 66 66 73 65 74 20 6b  startrunoffset k
d350: 65 79 70 61 74 74 73 29 29 0a 20 20 20 20 20 20  eypatts)).      
d360: 28 64 62 3a 67 65 74 2d 72 75 6e 73 20 64 62 20  (db:get-runs db 
d370: 72 75 6e 6e 61 6d 65 70 61 74 74 20 6e 75 6d 72  runnamepatt numr
d380: 75 6e 73 20 73 74 61 72 74 72 75 6e 6f 66 66 73  uns startrunoffs
d390: 65 74 20 6b 65 79 70 61 74 74 73 29 29 29 0a 0a  et keypatts)))..
d3a0: 28 64 65 66 69 6e 65 20 28 72 64 62 3a 67 65 74  (define (rdb:get
d3b0: 2d 74 65 73 74 73 2d 66 6f 72 2d 72 75 6e 20 64  -tests-for-run d
d3c0: 62 20 72 75 6e 2d 69 64 20 74 65 73 74 70 61 74  b run-id testpat
d3d0: 74 20 69 74 65 6d 70 61 74 74 20 73 74 61 74 65  t itempatt state
d3e0: 73 20 73 74 61 74 75 73 65 73 29 0a 20 20 28 69  s statuses).  (i
d3f0: 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20  f *runremote*.  
d400: 20 20 20 20 28 6c 65 74 20 28 28 68 6f 73 74 20      (let ((host 
d410: 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e  (vector-ref *run
d420: 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20 20  remote* 0))..   
d430: 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72 2d 72   (port (vector-r
d440: 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31  ef *runremote* 1
d450: 29 29 29 0a 09 28 28 72 70 63 3a 70 72 6f 63 65  )))..((rpc:proce
d460: 64 75 72 65 20 27 72 64 62 3a 67 65 74 2d 74 65  dure 'rdb:get-te
d470: 73 74 73 2d 66 6f 72 2d 72 75 6e 20 68 6f 73 74  sts-for-run host
d480: 20 70 6f 72 74 29 0a 09 20 20 72 75 6e 2d 69 64   port)..  run-id
d490: 20 74 65 73 74 70 61 74 74 20 69 74 65 6d 70 61   testpatt itempa
d4a0: 74 74 20 73 74 61 74 65 73 20 73 74 61 74 75 73  tt states status
d4b0: 65 73 29 29 0a 20 20 20 20 20 20 28 64 62 3a 67  es)).      (db:g
d4c0: 65 74 2d 74 65 73 74 73 2d 66 6f 72 2d 72 75 6e  et-tests-for-run
d4d0: 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 70   db run-id testp
d4e0: 61 74 74 20 69 74 65 6d 70 61 74 74 20 73 74 61  att itempatt sta
d4f0: 74 65 73 20 73 74 61 74 75 73 65 73 29 29 29 0a  tes statuses))).
d500: 0a 28 64 65 66 69 6e 65 20 28 72 64 62 3a 67 65  .(define (rdb:ge
d510: 74 2d 74 65 73 74 2d 64 61 74 61 2d 62 79 2d 69  t-test-data-by-i
d520: 64 20 64 62 20 74 65 73 74 2d 69 64 29 0a 20 20  d db test-id).  
d530: 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a  (if *runremote*.
d540: 20 20 20 20 20 20 28 6c 65 74 20 28 28 68 6f 73        (let ((hos
d550: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72  t (vector-ref *r
d560: 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20  unremote* 0)).. 
d570: 20 20 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72     (port (vector
d580: 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a  -ref *runremote*
d590: 20 31 29 29 29 0a 09 28 28 72 70 63 3a 70 72 6f   1)))..((rpc:pro
d5a0: 63 65 64 75 72 65 20 27 72 70 63 3a 67 65 74 2d  cedure 'rpc:get-
d5b0: 74 65 73 74 2d 64 61 74 61 2d 62 79 2d 69 64 20  test-data-by-id 
d5c0: 68 6f 73 74 20 70 6f 72 74 29 0a 09 20 74 65 73  host port).. tes
d5d0: 74 2d 69 64 29 29 0a 20 20 20 20 20 20 28 64 62  t-id)).      (db
d5e0: 3a 67 65 74 2d 74 65 73 74 2d 64 61 74 61 2d 62  :get-test-data-b
d5f0: 79 2d 69 64 20 64 62 20 74 65 73 74 2d 69 64 29  y-id db test-id)
d600: 29 29 0a 20 20 20 20 20 20 0a 28 64 65 66 69 6e  )).      .(defin
d610: 65 20 28 72 64 62 3a 67 65 74 2d 6b 65 79 73 20  e (rdb:get-keys 
d620: 64 62 29 0a 20 20 28 69 66 20 2a 72 75 6e 72 65  db).  (if *runre
d630: 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c 65 74  mote*.      (let
d640: 20 28 28 68 6f 73 74 20 28 76 65 63 74 6f 72 2d   ((host (vector-
d650: 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20  ref *runremote* 
d660: 30 29 29 0a 09 20 20 20 20 28 70 6f 72 74 20 28  0))..    (port (
d670: 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72  vector-ref *runr
d680: 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28 69 66  emote* 1)))..(if
d690: 20 2a 64 62 2d 6b 65 79 73 2a 20 2a 64 62 2d 6b   *db-keys* *db-k
d6a0: 65 79 73 2a 20 0a 09 20 20 20 20 28 6c 65 74 20  eys* ..    (let 
d6b0: 28 28 6b 65 79 73 20 28 28 72 70 63 3a 70 72 6f  ((keys ((rpc:pro
d6c0: 63 65 64 75 72 65 20 27 72 64 62 3a 67 65 74 2d  cedure 'rdb:get-
d6d0: 6b 65 79 73 20 68 6f 73 74 20 70 6f 72 74 29 29  keys host port))
d6e0: 29 29 0a 09 20 20 20 20 20 20 28 73 65 74 21 20  ))..      (set! 
d6f0: 2a 64 62 2d 6b 65 79 73 2a 20 6b 65 79 73 29 0a  *db-keys* keys).
d700: 09 20 20 20 20 20 20 6b 65 79 73 29 29 29 0a 20  .      keys))). 
d710: 20 20 20 20 20 28 64 62 3a 67 65 74 2d 6b 65 79       (db:get-key
d720: 73 20 64 62 29 29 29 0a 09 20 0a 28 64 65 66 69  s db))).. .(defi
d730: 6e 65 20 28 72 64 62 3a 67 65 74 2d 6e 75 6d 2d  ne (rdb:get-num-
d740: 72 75 6e 73 20 64 62 20 72 75 6e 70 61 74 74 29  runs db runpatt)
d750: 0a 20 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74  .  (if *runremot
d760: 65 2a 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28  e*.      (let ((
d770: 68 6f 73 74 20 28 76 65 63 74 6f 72 2d 72 65 66  host (vector-ref
d780: 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29   *runremote* 0))
d790: 0a 09 20 20 20 20 28 70 6f 72 74 20 28 76 65 63  ..    (port (vec
d7a0: 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f  tor-ref *runremo
d7b0: 74 65 2a 20 31 29 29 29 0a 09 28 28 72 70 63 3a  te* 1)))..((rpc:
d7c0: 70 72 6f 63 65 64 75 72 65 20 27 72 64 62 3a 67  procedure 'rdb:g
d7d0: 65 74 2d 6e 75 6d 2d 72 75 6e 73 20 68 6f 73 74  et-num-runs host
d7e0: 20 70 6f 72 74 29 20 72 75 6e 70 61 74 74 29 29   port) runpatt))
d7f0: 0a 20 20 20 20 20 20 28 64 62 3a 67 65 74 2d 6e  .      (db:get-n
d800: 75 6d 2d 72 75 6e 73 20 64 62 20 72 75 6e 70 61  um-runs db runpa
d810: 74 74 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  tt)))..(define (
d820: 72 64 62 3a 74 65 73 74 2d 73 65 74 2d 73 74 61  rdb:test-set-sta
d830: 74 65 2d 73 74 61 74 75 73 2d 62 79 2d 69 64 20  te-status-by-id 
d840: 64 62 20 74 65 73 74 2d 69 64 20 6e 65 77 73 74  db test-id newst
d850: 61 74 65 20 6e 65 77 73 74 61 74 75 73 20 6e 65  ate newstatus ne
d860: 77 63 6f 6d 6d 65 6e 74 29 0a 20 20 20 20 28 69  wcomment).    (i
d870: 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20  f *runremote*.  
d880: 20 20 20 20 28 6c 65 74 20 28 28 68 6f 73 74 20      (let ((host 
d890: 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e  (vector-ref *run
d8a0: 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20 20  remote* 0))..   
d8b0: 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72 2d 72   (port (vector-r
d8c0: 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31  ef *runremote* 1
d8d0: 29 29 29 0a 09 28 28 72 70 63 3a 70 72 6f 63 65  )))..((rpc:proce
d8e0: 64 75 72 65 20 27 72 64 62 3a 74 65 73 74 2d 73  dure 'rdb:test-s
d8f0: 65 74 2d 73 74 61 74 65 2d 73 74 61 74 75 73 2d  et-state-status-
d900: 62 79 2d 69 64 20 68 6f 73 74 20 70 6f 72 74 29  by-id host port)
d910: 0a 09 20 74 65 73 74 2d 69 64 20 6e 65 77 73 74  .. test-id newst
d920: 61 74 65 20 6e 65 77 73 74 61 74 75 73 20 6e 65  ate newstatus ne
d930: 77 63 6f 6d 6d 65 6e 74 29 29 0a 20 20 20 20 20  wcomment)).     
d940: 20 28 64 62 3a 74 65 73 74 2d 73 65 74 2d 73 74   (db:test-set-st
d950: 61 74 65 2d 73 74 61 74 75 73 2d 62 79 2d 69 64  ate-status-by-id
d960: 20 64 62 20 74 65 73 74 2d 69 64 20 6e 65 77 73   db test-id news
d970: 74 61 74 65 20 6e 65 77 73 74 61 74 75 73 20 6e  tate newstatus n
d980: 65 77 63 6f 6d 6d 65 6e 74 29 29 29 0a 0a 28 64  ewcomment)))..(d
d990: 65 66 69 6e 65 20 28 72 64 62 3a 67 65 74 2d 6b  efine (rdb:get-k
d9a0: 65 79 2d 76 61 6c 2d 70 61 69 72 73 20 64 62 20  ey-val-pairs db 
d9b0: 72 75 6e 2d 69 64 29 0a 20 20 28 69 66 20 2a 72  run-id).  (if *r
d9c0: 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20  unremote*.      
d9d0: 28 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65 63  (let ((host (vec
d9e0: 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f  tor-ref *runremo
d9f0: 74 65 2a 20 30 29 29 0a 09 20 20 20 20 28 70 6f  te* 0))..    (po
da00: 72 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a  rt (vector-ref *
da10: 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a  runremote* 1))).
da20: 09 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65  .((rpc:procedure
da30: 20 27 72 64 62 3a 67 65 74 2d 6b 65 79 2d 76 61   'rdb:get-key-va
da40: 6c 2d 70 61 69 72 73 20 68 6f 73 74 20 70 6f 72  l-pairs host por
da50: 74 29 20 72 75 6e 2d 69 64 29 29 0a 20 20 20 20  t) run-id)).    
da60: 20 20 28 64 62 3a 67 65 74 2d 6b 65 79 2d 76 61    (db:get-key-va
da70: 6c 2d 70 61 69 72 73 20 64 62 20 72 75 6e 2d 69  l-pairs db run-i
da80: 64 29 29 29 0a 09 20 0a 28 64 65 66 69 6e 65 20  d))).. .(define 
da90: 28 72 64 62 3a 67 65 74 2d 6b 65 79 2d 76 61 6c  (rdb:get-key-val
daa0: 73 20 64 62 20 72 75 6e 2d 69 64 29 0a 20 20 20  s db run-id).   
dab0: 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a   (if *runremote*
dac0: 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28 68 6f  .      (let ((ho
dad0: 73 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a  st (vector-ref *
dae0: 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09  runremote* 0))..
daf0: 20 20 20 20 28 70 6f 72 74 20 28 76 65 63 74 6f      (port (vecto
db00: 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65  r-ref *runremote
db10: 2a 20 31 29 29 29 0a 09 28 28 72 70 63 3a 70 72  * 1)))..((rpc:pr
db20: 6f 63 65 64 75 72 65 20 27 72 64 62 3a 67 65 74  ocedure 'rdb:get
db30: 2d 6b 65 79 2d 76 61 6c 73 20 68 6f 73 74 20 70  -key-vals host p
db40: 6f 72 74 29 20 72 75 6e 2d 69 64 29 29 0a 20 20  ort) run-id)).  
db50: 20 20 20 20 28 64 62 3a 67 65 74 2d 6b 65 79 2d      (db:get-key-
db60: 76 61 6c 73 20 64 62 20 72 75 6e 2d 69 64 29 29  vals db run-id))
db70: 29 0a 0a 28 64 65 66 69 6e 65 20 28 72 64 62 3a  )..(define (rdb:
db80: 74 65 73 74 6d 65 74 61 2d 67 65 74 2d 72 65 63  testmeta-get-rec
db90: 6f 72 64 20 64 62 20 74 65 73 74 6e 61 6d 65 29  ord db testname)
dba0: 0a 20 20 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f  .   (if *runremo
dbb0: 74 65 2a 0a 20 20 20 20 20 20 28 6c 65 74 20 28  te*.      (let (
dbc0: 28 68 6f 73 74 20 28 76 65 63 74 6f 72 2d 72 65  (host (vector-re
dbd0: 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29  f *runremote* 0)
dbe0: 29 0a 09 20 20 20 20 28 70 6f 72 74 20 28 76 65  )..    (port (ve
dbf0: 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d  ctor-ref *runrem
dc00: 6f 74 65 2a 20 31 29 29 29 0a 09 28 28 72 70 63  ote* 1)))..((rpc
dc10: 3a 70 72 6f 63 65 64 75 72 65 20 27 72 64 62 3a  :procedure 'rdb:
dc20: 74 65 73 74 6d 65 74 61 2d 67 65 74 2d 72 65 63  testmeta-get-rec
dc30: 6f 72 64 20 68 6f 73 74 20 70 6f 72 74 29 20 74  ord host port) t
dc40: 65 73 74 6e 61 6d 65 29 29 0a 20 20 20 20 20 20  estname)).      
dc50: 28 64 62 3a 74 65 73 74 6d 65 74 61 2d 67 65 74  (db:testmeta-get
dc60: 2d 72 65 63 6f 72 64 20 64 62 20 74 65 73 74 6e  -record db testn
dc70: 61 6d 65 29 29 29 0a 0a 28 64 65 66 69 6e 65 20  ame)))..(define 
dc80: 28 72 64 62 3a 67 65 74 2d 74 65 73 74 2d 64 61  (rdb:get-test-da
dc90: 74 61 2d 62 79 2d 69 64 20 64 62 20 74 65 73 74  ta-by-id db test
dca0: 2d 69 64 29 0a 20 20 28 69 66 20 2a 72 75 6e 72  -id).  (if *runr
dcb0: 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c 65  emote*.      (le
dcc0: 74 20 28 28 68 6f 73 74 20 28 76 65 63 74 6f 72  t ((host (vector
dcd0: 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a  -ref *runremote*
dce0: 20 30 29 29 0a 09 20 20 20 20 28 70 6f 72 74 20   0))..    (port 
dcf0: 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e  (vector-ref *run
dd00: 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28 28  remote* 1)))..((
dd10: 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20 27 72  rpc:procedure 'r
dd20: 64 62 3a 67 65 74 2d 74 65 73 74 2d 64 61 74 61  db:get-test-data
dd30: 2d 62 79 2d 69 64 20 68 6f 73 74 20 70 6f 72 74  -by-id host port
dd40: 29 20 74 65 73 74 2d 69 64 29 29 0a 20 20 20 20  ) test-id)).    
dd50: 20 20 28 64 62 3a 67 65 74 2d 74 65 73 74 2d 64    (db:get-test-d
dd60: 61 74 61 2d 62 79 2d 69 64 20 64 62 20 74 65 73  ata-by-id db tes
dd70: 74 2d 69 64 29 29 29 0a 0a 28 64 65 66 69 6e 65  t-id)))..(define
dd80: 20 28 72 64 62 3a 67 65 74 2d 72 75 6e 2d 69 6e   (rdb:get-run-in
dd90: 66 6f 20 64 62 20 72 75 6e 2d 69 64 29 0a 20 20  fo db run-id).  
dda0: 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a  (if *runremote*.
ddb0: 20 20 20 20 20 20 28 6c 65 74 20 28 28 68 6f 73        (let ((hos
ddc0: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72  t (vector-ref *r
ddd0: 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20  unremote* 0)).. 
dde0: 20 20 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72     (port (vector
ddf0: 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a  -ref *runremote*
de00: 20 31 29 29 29 0a 09 28 28 72 70 63 3a 70 72 6f   1)))..((rpc:pro
de10: 63 65 64 75 72 65 20 27 72 64 62 3a 67 65 74 2d  cedure 'rdb:get-
de20: 72 75 6e 2d 69 6e 66 6f 20 68 6f 73 74 20 70 6f  run-info host po
de30: 72 74 29 20 72 75 6e 2d 69 64 29 29 0a 20 20 20  rt) run-id)).   
de40: 20 20 20 28 64 62 3a 67 65 74 2d 72 75 6e 2d 69     (db:get-run-i
de50: 6e 66 6f 20 64 62 20 72 75 6e 2d 69 64 29 29 29  nfo db run-id)))
de60: 0a 0a 28 64 65 66 69 6e 65 20 28 72 64 62 3a 67  ..(define (rdb:g
de70: 65 74 2d 73 74 65 70 73 2d 66 6f 72 2d 74 65 73  et-steps-for-tes
de80: 74 20 64 62 20 74 65 73 74 2d 69 64 29 0a 20 20  t db test-id).  
de90: 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a  (if *runremote*.
dea0: 20 20 20 20 20 20 28 6c 65 74 20 28 28 68 6f 73        (let ((hos
deb0: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72  t (vector-ref *r
dec0: 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20  unremote* 0)).. 
ded0: 20 20 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72     (port (vector
dee0: 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a  -ref *runremote*
def0: 20 31 29 29 29 0a 09 28 28 72 70 63 3a 70 72 6f   1)))..((rpc:pro
df00: 63 65 64 75 72 65 20 27 72 64 62 3a 67 65 74 2d  cedure 'rdb:get-
df10: 73 74 65 70 73 2d 66 6f 72 2d 74 65 73 74 20 68  steps-for-test h
df20: 6f 73 74 20 70 6f 72 74 29 20 74 65 73 74 2d 69  ost port) test-i
df30: 64 29 29 0a 20 20 20 20 20 20 28 64 62 3a 67 65  d)).      (db:ge
df40: 74 2d 73 74 65 70 73 2d 66 6f 72 2d 74 65 73 74  t-steps-for-test
df50: 20 64 62 20 74 65 73 74 2d 69 64 29 29 29 0a 0a   db test-id)))..
df60: 28 64 65 66 69 6e 65 20 28 72 64 62 3a 67 65 74  (define (rdb:get
df70: 2d 73 74 65 70 73 2d 74 61 62 6c 65 20 64 62 20  -steps-table db 
df80: 74 65 73 74 2d 69 64 29 0a 20 20 28 69 66 20 2a  test-id).  (if *
df90: 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20  runremote*.     
dfa0: 20 28 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65   (let ((host (ve
dfb0: 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d  ctor-ref *runrem
dfc0: 6f 74 65 2a 20 30 29 29 0a 09 20 20 20 20 28 70  ote* 0))..    (p
dfd0: 6f 72 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20  ort (vector-ref 
dfe0: 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29  *runremote* 1)))
dff0: 0a 09 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72  ..((rpc:procedur
e000: 65 20 27 72 64 62 3a 67 65 74 2d 73 74 65 70 73  e 'rdb:get-steps
e010: 2d 74 61 62 6c 65 20 68 6f 73 74 20 70 6f 72 74  -table host port
e020: 29 20 74 65 73 74 2d 69 64 29 29 0a 20 20 20 20  ) test-id)).    
e030: 20 20 28 64 62 3a 67 65 74 2d 73 74 65 70 73 2d    (db:get-steps-
e040: 74 61 62 6c 65 20 64 62 20 74 65 73 74 2d 69 64  table db test-id
e050: 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 72 64  )))..(define (rd
e060: 62 3a 72 65 61 64 2d 74 65 73 74 2d 64 61 74 61  b:read-test-data
e070: 20 64 62 20 74 65 73 74 2d 69 64 20 63 61 74 65   db test-id cate
e080: 67 6f 72 79 70 61 74 74 29 0a 20 20 28 69 66 20  gorypatt).  (if 
e090: 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20  *runremote*.    
e0a0: 20 20 28 6c 65 74 20 28 28 68 6f 73 74 20 28 76    (let ((host (v
e0b0: 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65  ector-ref *runre
e0c0: 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20 20 20 28  mote* 0))..    (
e0d0: 70 6f 72 74 20 28 76 65 63 74 6f 72 2d 72 65 66  port (vector-ref
e0e0: 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29   *runremote* 1))
e0f0: 29 0a 09 28 28 72 70 63 3a 70 72 6f 63 65 64 75  )..((rpc:procedu
e100: 72 65 20 27 72 64 62 3a 72 65 61 64 2d 74 65 73  re 'rdb:read-tes
e110: 74 2d 64 61 74 61 20 68 6f 73 74 20 70 6f 72 74  t-data host port
e120: 29 20 74 65 73 74 2d 69 64 20 63 61 74 65 67 6f  ) test-id catego
e130: 72 79 70 61 74 74 29 29 0a 20 20 20 20 20 20 28  rypatt)).      (
e140: 64 62 3a 72 65 61 64 2d 74 65 73 74 2d 64 61 74  db:read-test-dat
e150: 61 20 64 62 20 74 65 73 74 2d 69 64 20 63 61 74  a db test-id cat
e160: 65 67 6f 72 79 70 61 74 74 29 29 29 0a 0a 28 64  egorypatt)))..(d
e170: 65 66 69 6e 65 20 28 72 64 62 3a 67 65 74 2d 74  efine (rdb:get-t
e180: 65 73 74 2d 69 6e 66 6f 20 64 62 20 72 75 6e 2d  est-info db run-
e190: 69 64 20 74 65 73 74 6e 61 6d 65 20 69 74 65 6d  id testname item
e1a0: 2d 70 61 74 68 29 0a 20 20 28 69 66 20 2a 72 75  -path).  (if *ru
e1b0: 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28  nremote*.      (
e1c0: 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65 63 74  let ((host (vect
e1d0: 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74  or-ref *runremot
e1e0: 65 2a 20 30 29 29 0a 09 20 20 20 20 28 70 6f 72  e* 0))..    (por
e1f0: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72  t (vector-ref *r
e200: 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09  unremote* 1)))..
e210: 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20  ((rpc:procedure 
e220: 27 72 64 62 3a 67 65 74 2d 74 65 73 74 2d 69 6e  'rdb:get-test-in
e230: 66 6f 20 68 6f 73 74 20 70 6f 72 74 29 20 72 75  fo host port) ru
e240: 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 69 74  n-id testname it
e250: 65 6d 2d 70 61 74 68 29 29 0a 20 20 20 20 20 20  em-path)).      
e260: 28 64 62 3a 67 65 74 2d 74 65 73 74 2d 69 6e 66  (db:get-test-inf
e270: 6f 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74  o db run-id test
e280: 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 29  name item-path))
e290: 29 0a 0a 28 64 65 66 69 6e 65 20 28 72 64 62 3a  )..(define (rdb:
e2a0: 64 65 6c 65 74 65 2d 74 65 73 74 2d 72 65 63 6f  delete-test-reco
e2b0: 72 64 73 20 64 62 20 74 65 73 74 2d 69 64 29 0a  rds db test-id).
e2c0: 20 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65    (if *runremote
e2d0: 2a 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28 68  *.      (let ((h
e2e0: 6f 73 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20  ost (vector-ref 
e2f0: 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a  *runremote* 0)).
e300: 09 20 20 20 20 28 70 6f 72 74 20 28 76 65 63 74  .    (port (vect
e310: 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74  or-ref *runremot
e320: 65 2a 20 31 29 29 29 0a 09 28 28 72 70 63 3a 70  e* 1)))..((rpc:p
e330: 72 6f 63 65 64 75 72 65 20 27 72 64 62 3a 64 65  rocedure 'rdb:de
e340: 6c 65 74 65 2d 74 65 73 74 2d 72 65 63 6f 72 64  lete-test-record
e350: 73 20 68 6f 73 74 20 70 6f 72 74 29 20 74 65 73  s host port) tes
e360: 74 2d 69 64 29 29 0a 20 20 20 20 20 20 28 64 62  t-id)).      (db
e370: 3a 64 65 6c 65 74 65 2d 74 65 73 74 2d 72 65 63  :delete-test-rec
e380: 6f 72 64 73 20 64 62 20 74 65 73 74 2d 69 64 29  ords db test-id)
e390: 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 72 64 62  ))..(define (rdb
e3a0: 3a 74 65 73 74 2d 64 61 74 61 2d 72 6f 6c 6c 75  :test-data-rollu
e3b0: 70 20 64 62 20 74 65 73 74 2d 69 64 20 73 74 61  p db test-id sta
e3c0: 74 75 73 29 0a 20 20 20 20 28 69 66 20 2a 72 75  tus).    (if *ru
e3d0: 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28  nremote*.      (
e3e0: 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65 63 74  let ((host (vect
e3f0: 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74  or-ref *runremot
e400: 65 2a 20 30 29 29 0a 09 20 20 20 20 28 70 6f 72  e* 0))..    (por
e410: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72  t (vector-ref *r
e420: 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09  unremote* 1)))..
e430: 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20  ((rpc:procedure 
e440: 27 72 64 62 3a 74 65 73 74 2d 64 61 74 61 2d 72  'rdb:test-data-r
e450: 6f 6c 6c 75 70 20 68 6f 73 74 20 70 6f 72 74 29  ollup host port)
e460: 20 74 65 73 74 2d 69 64 20 73 74 61 74 75 73 29   test-id status)
e470: 29 0a 20 20 20 20 20 20 28 64 62 3a 74 65 73 74  ).      (db:test
e480: 2d 64 61 74 61 2d 72 6f 6c 6c 75 70 20 64 62 20  -data-rollup db 
e490: 74 65 73 74 2d 69 64 20 73 74 61 74 75 73 29 29  test-id status))
e4a0: 29 0a 0a 28 64 65 66 69 6e 65 20 28 72 64 62 3a  )..(define (rdb:
e4b0: 74 65 73 74 2d 67 65 74 2d 70 61 74 68 73 2d 6d  test-get-paths-m
e4c0: 61 74 63 68 69 6e 67 20 64 62 20 6b 65 79 6e 61  atching db keyna
e4d0: 6d 65 73 20 74 61 72 67 65 74 29 0a 20 20 20 28  mes target).   (
e4e0: 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20  if *runremote*. 
e4f0: 20 20 20 20 20 20 28 6c 65 74 20 28 28 68 6f 73        (let ((hos
e500: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72  t (vector-ref *r
e510: 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20  unremote* 0)).. 
e520: 20 20 20 20 28 70 6f 72 74 20 28 76 65 63 74 6f      (port (vecto
e530: 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65  r-ref *runremote
e540: 2a 20 31 29 29 29 0a 09 20 28 28 72 70 63 3a 70  * 1))).. ((rpc:p
e550: 72 6f 63 65 64 75 72 65 20 27 72 64 62 3a 74 65  rocedure 'rdb:te
e560: 73 74 2d 67 65 74 2d 70 61 74 68 73 2d 6d 61 74  st-get-paths-mat
e570: 63 68 69 6e 67 20 68 6f 73 74 20 70 6f 72 74 29  ching host port)
e580: 20 6b 65 79 6e 61 6d 65 73 20 74 61 72 67 65 74   keynames target
e590: 29 29 0a 20 20 20 20 20 20 20 28 64 62 3a 74 65  )).       (db:te
e5a0: 73 74 2d 67 65 74 2d 70 61 74 68 73 2d 6d 61 74  st-get-paths-mat
e5b0: 63 68 69 6e 67 20 64 62 20 6b 65 79 6e 61 6d 65  ching db keyname
e5c0: 73 20 74 61 72 67 65 74 29 29 29 0a 0a 20 0a     s target))).. .