Megatest

Hex Artifact Content
Login

Artifact 2c88e7344f9bad2fac6d28c4c92c262f257447f6:


0000: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
0010: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0030: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0040: 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 43 6f 70 79  ========.;; Copy
0050: 72 69 67 68 74 20 32 30 30 36 2d 32 30 31 32 2c  right 2006-2012,
0060: 20 4d 61 74 74 68 65 77 20 57 65 6c 6c 61 6e 64   Matthew Welland
0070: 2e 0a 3b 3b 20 0a 3b 3b 20 20 54 68 69 73 20 70  ..;; .;;  This p
0080: 72 6f 67 72 61 6d 20 69 73 20 6d 61 64 65 20 61  rogram is made a
0090: 76 61 69 6c 61 62 6c 65 20 75 6e 64 65 72 20 74  vailable under t
00a0: 68 65 20 47 4e 55 20 47 50 4c 20 76 65 72 73 69  he GNU GPL versi
00b0: 6f 6e 20 32 2e 30 20 6f 72 0a 3b 3b 20 20 67 72  on 2.0 or.;;  gr
00c0: 65 61 74 65 72 2e 20 53 65 65 20 74 68 65 20 61  eater. See the a
00d0: 63 63 6f 6d 70 61 6e 79 69 6e 67 20 66 69 6c 65  ccompanying file
00e0: 20 43 4f 50 59 49 4e 47 20 66 6f 72 20 64 65 74   COPYING for det
00f0: 61 69 6c 73 2e 0a 3b 3b 20 0a 3b 3b 20 20 54 68  ails..;; .;;  Th
0100: 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69  is program is di
0110: 73 74 72 69 62 75 74 65 64 20 57 49 54 48 4f 55  stributed WITHOU
0120: 54 20 41 4e 59 20 57 41 52 52 41 4e 54 59 3b 20  T ANY WARRANTY; 
0130: 77 69 74 68 6f 75 74 20 65 76 65 6e 20 74 68 65  without even the
0140: 0a 3b 3b 20 20 69 6d 70 6c 69 65 64 20 77 61 72  .;;  implied war
0150: 72 61 6e 74 79 20 6f 66 20 4d 45 52 43 48 41 4e  ranty of MERCHAN
0160: 54 41 42 49 4c 49 54 59 20 6f 72 20 46 49 54 4e  TABILITY or FITN
0170: 45 53 53 20 46 4f 52 20 41 20 50 41 52 54 49 43  ESS FOR A PARTIC
0180: 55 4c 41 52 0a 3b 3b 20 20 50 55 52 50 4f 53 45  ULAR.;;  PURPOSE
0190: 2e 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ..;;============
01a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 3d 3d  ==========..;;==
01e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0200: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0210: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0220: 3d 3d 3d 3d 0a 3b 3b 20 44 61 74 61 62 61 73 65  ====.;; Database
0230: 20 61 63 63 65 73 73 0a 3b 3b 3d 3d 3d 3d 3d 3d   access.;;======
0240: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0250: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0260: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0270: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0280: 0a 0a 28 72 65 71 75 69 72 65 2d 65 78 74 65 6e  ..(require-exten
0290: 73 69 6f 6e 20 28 73 72 66 69 20 31 38 29 20 65  sion (srfi 18) e
02a0: 78 74 72 61 73 20 74 63 70 20 72 70 63 29 0a 28  xtras tcp rpc).(
02b0: 69 6d 70 6f 72 74 20 28 70 72 65 66 69 78 20 72  import (prefix r
02c0: 70 63 20 72 70 63 3a 29 29 0a 0a 28 75 73 65 20  pc rpc:))..(use 
02d0: 73 71 6c 69 74 65 33 20 73 72 66 69 2d 31 20 70  sqlite3 srfi-1 p
02e0: 6f 73 69 78 20 72 65 67 65 78 20 72 65 67 65 78  osix regex regex
02f0: 2d 63 61 73 65 20 73 72 66 69 2d 36 39 20 63 73  -case srfi-69 cs
0300: 76 2d 78 6d 6c 29 0a 28 69 6d 70 6f 72 74 20 28  v-xml).(import (
0310: 70 72 65 66 69 78 20 73 71 6c 69 74 65 33 20 73  prefix sqlite3 s
0320: 71 6c 69 74 65 33 3a 29 29 0a 0a 28 64 65 63 6c  qlite3:))..(decl
0330: 61 72 65 20 28 75 6e 69 74 20 64 62 29 29 0a 28  are (unit db)).(
0340: 64 65 63 6c 61 72 65 20 28 75 73 65 73 20 63 6f  declare (uses co
0350: 6d 6d 6f 6e 29 29 0a 28 64 65 63 6c 61 72 65 20  mmon)).(declare 
0360: 28 75 73 65 73 20 6b 65 79 73 29 29 0a 28 64 65  (uses keys)).(de
0370: 63 6c 61 72 65 20 28 75 73 65 73 20 6f 64 73 29  clare (uses ods)
0380: 29 0a 0a 28 69 6e 63 6c 75 64 65 20 22 63 6f 6d  )..(include "com
0390: 6d 6f 6e 5f 72 65 63 6f 72 64 73 2e 73 63 6d 22  mon_records.scm"
03a0: 29 0a 28 69 6e 63 6c 75 64 65 20 22 64 62 5f 72  ).(include "db_r
03b0: 65 63 6f 72 64 73 2e 73 63 6d 22 29 0a 28 69 6e  ecords.scm").(in
03c0: 63 6c 75 64 65 20 22 6b 65 79 5f 72 65 63 6f 72  clude "key_recor
03d0: 64 73 2e 73 63 6d 22 29 0a 28 69 6e 63 6c 75 64  ds.scm").(includ
03e0: 65 20 22 72 75 6e 5f 72 65 63 6f 72 64 73 2e 73  e "run_records.s
03f0: 63 6d 22 29 0a 0a 3b 3b 20 74 69 6d 65 73 74 61  cm")..;; timesta
0400: 6d 70 20 74 79 70 65 20 28 76 61 6c 31 20 76 61  mp type (val1 va
0410: 6c 32 20 2e 2e 2e 29 0a 3b 3b 20 74 79 70 65 3a  l2 ...).;; type:
0420: 20 6d 65 74 61 2d 69 6e 66 6f 2c 20 73 74 65 70   meta-info, step
0430: 0a 28 64 65 66 69 6e 65 20 2a 69 6e 63 6f 6d 69  .(define *incomi
0440: 6e 67 2d 64 61 74 61 2a 20 20 20 20 20 20 27 28  ng-data*      '(
0450: 29 29 0a 28 64 65 66 69 6e 65 20 2a 69 6e 63 6f  )).(define *inco
0460: 6d 69 6e 67 2d 6c 61 73 74 2d 74 69 6d 65 2a 20  ming-last-time* 
0470: 28 63 75 72 72 65 6e 74 2d 73 65 63 6f 6e 64 73  (current-seconds
0480: 29 29 0a 28 64 65 66 69 6e 65 20 2a 69 6e 63 6f  )).(define *inco
0490: 6d 69 6e 67 2d 6d 75 74 65 78 2a 20 20 20 20 20  ming-mutex*     
04a0: 28 6d 61 6b 65 2d 6d 75 74 65 78 29 29 0a 28 64  (make-mutex)).(d
04b0: 65 66 69 6e 65 20 2a 63 61 63 68 65 2d 6f 6e 2a  efine *cache-on*
04c0: 20 23 66 29 0a 0a 28 64 65 66 69 6e 65 20 28 6f   #f)..(define (o
04d0: 70 65 6e 2d 64 62 29 20 3b 3b 20 20 28 63 6f 6e  pen-db) ;;  (con
04e0: 63 20 2a 74 6f 70 70 61 74 68 2a 20 22 2f 6d 65  c *toppath* "/me
04f0: 67 61 74 65 73 74 2e 64 62 22 29 20 28 63 61 72  gatest.db") (car
0500: 20 2a 63 6f 6e 66 69 67 69 6e 66 6f 2a 29 29 29   *configinfo*)))
0510: 0a 20 20 28 6c 65 74 2a 20 28 28 64 62 70 61 74  .  (let* ((dbpat
0520: 68 20 20 20 20 28 63 6f 6e 63 20 2a 74 6f 70 70  h    (conc *topp
0530: 61 74 68 2a 20 22 2f 6d 65 67 61 74 65 73 74 2e  ath* "/megatest.
0540: 64 62 22 29 29 20 3b 3b 20 66 6e 61 6d 65 29 0a  db")) ;; fname).
0550: 09 20 28 64 62 65 78 69 73 74 73 20 20 28 66 69  . (dbexists  (fi
0560: 6c 65 2d 65 78 69 73 74 73 3f 20 64 62 70 61 74  le-exists? dbpat
0570: 68 29 29 0a 09 20 28 64 62 20 20 20 20 20 20 20  h)).. (db       
0580: 20 28 73 71 6c 69 74 65 33 3a 6f 70 65 6e 2d 64   (sqlite3:open-d
0590: 61 74 61 62 61 73 65 20 64 62 70 61 74 68 29 29  atabase dbpath))
05a0: 20 3b 3b 20 28 6e 65 76 65 72 2d 67 69 76 65 2d   ;; (never-give-
05b0: 75 70 2d 6f 70 65 6e 2d 64 62 20 64 62 70 61 74  up-open-db dbpat
05c0: 68 29 29 0a 09 20 28 68 61 6e 64 6c 65 72 20 20  h)).. (handler  
05d0: 20 28 6d 61 6b 65 2d 62 75 73 79 2d 74 69 6d 65   (make-busy-time
05e0: 6f 75 74 20 28 69 66 20 28 61 72 67 73 3a 67 65  out (if (args:ge
05f0: 74 2d 61 72 67 20 22 2d 6f 76 65 72 72 69 64 65  t-arg "-override
0600: 2d 74 69 6d 65 6f 75 74 22 29 0a 09 09 09 09 09  -timeout")......
0610: 20 20 20 28 73 74 72 69 6e 67 2d 3e 6e 75 6d 62     (string->numb
0620: 65 72 20 28 61 72 67 73 3a 67 65 74 2d 61 72 67  er (args:get-arg
0630: 20 22 2d 6f 76 65 72 72 69 64 65 2d 74 69 6d 65   "-override-time
0640: 6f 75 74 22 29 29 0a 09 09 09 09 09 20 20 20 33  out"))......   3
0650: 36 30 30 30 29 29 29 29 20 3b 3b 20 31 33 36 30  6000)))) ;; 1360
0660: 30 30 29 29 29 0a 20 20 20 20 28 73 71 6c 69 74  00))).    (sqlit
0670: 65 33 3a 73 65 74 2d 62 75 73 79 2d 68 61 6e 64  e3:set-busy-hand
0680: 6c 65 72 21 20 64 62 20 68 61 6e 64 6c 65 72 29  ler! db handler)
0690: 0a 20 20 20 20 28 69 66 20 28 6e 6f 74 20 64 62  .    (if (not db
06a0: 65 78 69 73 74 73 29 0a 09 28 64 62 3a 69 6e 69  exists)..(db:ini
06b0: 74 69 61 6c 69 7a 65 20 64 62 29 29 0a 20 20 20  tialize db)).   
06c0: 20 64 62 29 29 0a 0a 28 64 65 66 69 6e 65 20 28   db))..(define (
06d0: 64 62 3a 69 6e 69 74 69 61 6c 69 7a 65 20 64 62  db:initialize db
06e0: 29 0a 20 20 28 6c 65 74 2a 20 28 28 63 6f 6e 66  ).  (let* ((conf
06f0: 69 67 64 61 74 20 28 63 61 72 20 2a 63 6f 6e 66  igdat (car *conf
0700: 69 67 69 6e 66 6f 2a 29 29 20 20 3b 3b 20 74 75  iginfo*))  ;; tu
0710: 74 20 74 75 74 2c 20 67 6c 6f 62 61 6c 20 77 61  t tut, global wa
0720: 72 6e 69 6e 67 2e 2e 2e 0a 09 20 28 6b 65 79 73  rning..... (keys
0730: 20 20 20 20 20 28 63 6f 6e 66 69 67 2d 67 65 74       (config-get
0740: 2d 66 69 65 6c 64 73 20 63 6f 6e 66 69 67 64 61  -fields configda
0750: 74 29 29 0a 09 20 28 68 61 76 65 6b 65 79 73 20  t)).. (havekeys 
0760: 28 3e 20 28 6c 65 6e 67 74 68 20 6b 65 79 73 29  (> (length keys)
0770: 20 30 29 29 0a 09 20 28 6b 65 79 73 74 72 20 20   0)).. (keystr  
0780: 20 28 6b 65 79 73 2d 3e 6b 65 79 73 74 72 20 6b   (keys->keystr k
0790: 65 79 73 29 29 0a 09 20 28 66 69 65 6c 64 73 74  eys)).. (fieldst
07a0: 72 20 28 6b 65 79 73 2d 3e 6b 65 79 2f 66 69 65  r (keys->key/fie
07b0: 6c 64 20 6b 65 79 73 29 29 29 0a 20 20 20 20 28  ld keys))).    (
07c0: 66 6f 72 2d 65 61 63 68 20 28 6c 61 6d 62 64 61  for-each (lambda
07d0: 20 28 6b 65 79 29 0a 09 09 28 6c 65 74 20 28 28   (key)...(let ((
07e0: 6b 65 79 6e 20 28 76 65 63 74 6f 72 2d 72 65 66  keyn (vector-ref
07f0: 20 6b 65 79 20 30 29 29 29 0a 09 09 20 20 28 69   key 0)))...  (i
0800: 66 20 28 6d 65 6d 62 65 72 20 28 73 74 72 69 6e  f (member (strin
0810: 67 2d 64 6f 77 6e 63 61 73 65 20 6b 65 79 6e 29  g-downcase keyn)
0820: 0a 09 09 09 20 20 20 20 20 20 28 6c 69 73 74 20  ....      (list 
0830: 22 72 75 6e 6e 61 6d 65 22 20 22 73 74 61 74 65  "runname" "state
0840: 22 20 22 73 74 61 74 75 73 22 20 22 6f 77 6e 65  " "status" "owne
0850: 72 22 20 22 65 76 65 6e 74 5f 74 69 6d 65 22 20  r" "event_time" 
0860: 22 63 6f 6d 6d 65 6e 74 22 20 22 66 61 69 6c 5f  "comment" "fail_
0870: 63 6f 75 6e 74 22 0a 09 09 09 09 20 20 20 20 22  count".....    "
0880: 70 61 73 73 5f 63 6f 75 6e 74 22 29 29 0a 09 09  pass_count"))...
0890: 20 20 20 20 20 20 28 62 65 67 69 6e 0a 09 09 09        (begin....
08a0: 28 70 72 69 6e 74 20 22 45 52 52 4f 52 3a 20 79  (print "ERROR: y
08b0: 6f 75 72 20 6b 65 79 20 63 61 6e 6e 6f 74 20 62  our key cannot b
08c0: 65 20 6e 61 6d 65 64 20 22 20 6b 65 79 6e 20 22  e named " keyn "
08d0: 20 61 73 20 74 68 69 73 20 63 6f 6e 66 6c 69 63   as this conflic
08e0: 74 73 20 77 69 74 68 20 74 68 65 20 73 61 6d 65  ts with the same
08f0: 20 6e 61 6d 65 64 20 66 69 65 6c 64 20 69 6e 20   named field in 
0900: 74 68 65 20 72 75 6e 73 20 74 61 62 6c 65 22 29  the runs table")
0910: 0a 09 09 09 28 73 79 73 74 65 6d 20 28 63 6f 6e  ....(system (con
0920: 63 20 22 72 6d 20 2d 66 20 22 20 64 62 70 61 74  c "rm -f " dbpat
0930: 68 29 29 0a 09 09 09 28 65 78 69 74 20 31 29 29  h))....(exit 1))
0940: 29 29 29 0a 09 20 20 20 20 20 20 6b 65 79 73 29  )))..      keys)
0950: 0a 20 20 20 20 3b 3b 20 28 73 71 6c 69 74 65 33  .    ;; (sqlite3
0960: 3a 65 78 65 63 75 74 65 20 64 62 20 22 50 52 41  :execute db "PRA
0970: 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  GMA synchronous 
0980: 3d 20 4f 46 46 3b 22 29 0a 20 20 20 20 28 73 71  = OFF;").    (sq
0990: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62  lite3:execute db
09a0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49   "CREATE TABLE I
09b0: 46 20 4e 4f 54 20 45 58 49 53 54 53 20 6b 65 79  F NOT EXISTS key
09c0: 73 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52  s (id INTEGER PR
09d0: 49 4d 41 52 59 20 4b 45 59 2c 20 66 69 65 6c 64  IMARY KEY, field
09e0: 6e 61 6d 65 20 54 45 58 54 2c 20 66 69 65 6c 64  name TEXT, field
09f0: 74 79 70 65 20 54 45 58 54 2c 20 43 4f 4e 53 54  type TEXT, CONST
0a00: 52 41 49 4e 54 20 6b 65 79 63 6f 6e 73 74 72 61  RAINT keyconstra
0a10: 69 6e 74 20 55 4e 49 51 55 45 20 28 66 69 65 6c  int UNIQUE (fiel
0a20: 64 6e 61 6d 65 29 29 3b 22 29 0a 20 20 20 20 28  dname));").    (
0a30: 66 6f 72 2d 65 61 63 68 20 28 6c 61 6d 62 64 61  for-each (lambda
0a40: 20 28 6b 65 79 29 0a 09 09 28 73 71 6c 69 74 65   (key)...(sqlite
0a50: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 49 4e  3:execute db "IN
0a60: 53 45 52 54 20 49 4e 54 4f 20 6b 65 79 73 20 28  SERT INTO keys (
0a70: 66 69 65 6c 64 6e 61 6d 65 2c 66 69 65 6c 64 74  fieldname,fieldt
0a80: 79 70 65 29 20 56 41 4c 55 45 53 20 28 3f 2c 3f  ype) VALUES (?,?
0a90: 29 3b 22 20 28 6b 65 79 3a 67 65 74 2d 66 69 65  );" (key:get-fie
0aa0: 6c 64 6e 61 6d 65 20 6b 65 79 29 28 6b 65 79 3a  ldname key)(key:
0ab0: 67 65 74 2d 66 69 65 6c 64 74 79 70 65 20 6b 65  get-fieldtype ke
0ac0: 79 29 29 29 0a 09 20 20 20 20 20 20 6b 65 79 73  y)))..      keys
0ad0: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65  ).    (sqlite3:e
0ae0: 78 65 63 75 74 65 20 64 62 20 28 63 6f 6e 63 20  xecute db (conc 
0af0: 0a 09 09 09 20 22 43 52 45 41 54 45 20 54 41 42  .... "CREATE TAB
0b00: 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53  LE IF NOT EXISTS
0b10: 20 72 75 6e 73 20 28 69 64 20 49 4e 54 45 47 45   runs (id INTEGE
0b20: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 22  R PRIMARY KEY, "
0b30: 20 0a 09 09 09 20 66 69 65 6c 64 73 74 72 20 28   .... fieldstr (
0b40: 69 66 20 68 61 76 65 6b 65 79 73 20 22 2c 22 20  if havekeys "," 
0b50: 22 22 29 0a 09 09 09 20 22 72 75 6e 6e 61 6d 65  "").... "runname
0b60: 20 54 45 58 54 2c 22 0a 09 09 09 20 22 73 74 61   TEXT,".... "sta
0b70: 74 65 20 54 45 58 54 20 44 45 46 41 55 4c 54 20  te TEXT DEFAULT 
0b80: 27 27 2c 22 0a 09 09 09 20 22 73 74 61 74 75 73  '',".... "status
0b90: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27   TEXT DEFAULT ''
0ba0: 2c 22 0a 09 09 09 20 22 6f 77 6e 65 72 20 54 45  ,".... "owner TE
0bb0: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 22 0a  XT DEFAULT '',".
0bc0: 09 09 09 20 22 65 76 65 6e 74 5f 74 69 6d 65 20  ... "event_time 
0bd0: 54 49 4d 45 53 54 41 4d 50 2c 22 0a 09 09 09 20  TIMESTAMP,".... 
0be0: 22 63 6f 6d 6d 65 6e 74 20 54 45 58 54 20 44 45  "comment TEXT DE
0bf0: 46 41 55 4c 54 20 27 27 2c 22 0a 09 09 09 20 22  FAULT '',".... "
0c00: 66 61 69 6c 5f 63 6f 75 6e 74 20 49 4e 54 45 47  fail_count INTEG
0c10: 45 52 20 44 45 46 41 55 4c 54 20 30 2c 22 0a 09  ER DEFAULT 0,"..
0c20: 09 09 20 22 70 61 73 73 5f 63 6f 75 6e 74 20 49  .. "pass_count I
0c30: 4e 54 45 47 45 52 20 44 45 46 41 55 4c 54 20 30  NTEGER DEFAULT 0
0c40: 2c 22 0a 09 09 09 20 22 43 4f 4e 53 54 52 41 49  ,".... "CONSTRAI
0c50: 4e 54 20 72 75 6e 73 63 6f 6e 73 74 72 61 69 6e  NT runsconstrain
0c60: 74 20 55 4e 49 51 55 45 20 28 72 75 6e 6e 61 6d  t UNIQUE (runnam
0c70: 65 22 20 28 69 66 20 68 61 76 65 6b 65 79 73 20  e" (if havekeys 
0c80: 22 2c 22 20 22 22 29 20 6b 65 79 73 74 72 20 22  "," "") keystr "
0c90: 29 29 3b 22 29 29 0a 20 20 20 20 28 73 71 6c 69  ));")).    (sqli
0ca0: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 28  te3:execute db (
0cb0: 63 6f 6e 63 20 22 43 52 45 41 54 45 20 49 4e 44  conc "CREATE IND
0cc0: 45 58 20 72 75 6e 73 5f 69 6e 64 65 78 20 4f 4e  EX runs_index ON
0cd0: 20 72 75 6e 73 20 28 72 75 6e 6e 61 6d 65 22 20   runs (runname" 
0ce0: 28 69 66 20 68 61 76 65 6b 65 79 73 20 22 2c 22  (if havekeys ","
0cf0: 20 22 22 29 20 6b 65 79 73 74 72 20 22 29 3b 22   "") keystr ");"
0d00: 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a  )).    (sqlite3:
0d10: 65 78 65 63 75 74 65 20 64 62 20 0a 09 09 20 20  execute db ...  
0d20: 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
0d30: 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 74   IF NOT EXISTS t
0d40: 65 73 74 73 20 0a 20 20 20 20 20 20 20 20 20 20  ests .          
0d50: 20 20 20 20 20 20 20 20 20 20 28 69 64 20 49 4e            (id IN
0d60: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
0d70: 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y,.             
0d80: 20 20 20 20 20 20 20 20 72 75 6e 5f 69 64 20 20          run_id  
0d90: 20 20 20 49 4e 54 45 47 45 52 2c 0a 20 20 20 20     INTEGER,.    
0da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0db0: 20 74 65 73 74 6e 61 6d 65 20 20 20 54 45 58 54   testname   TEXT
0dc0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
0dd0: 20 20 20 20 20 20 20 68 6f 73 74 20 20 20 20 20         host     
0de0: 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27    TEXT DEFAULT '
0df0: 6e 2f 61 27 2c 0a 20 20 20 20 20 20 20 20 20 20  n/a',.          
0e00: 20 20 20 20 20 20 20 20 20 20 20 63 70 75 6c 6f             cpulo
0e10: 61 64 20 20 20 20 52 45 41 4c 20 44 45 46 41 55  ad    REAL DEFAU
0e20: 4c 54 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20  LT -1,.         
0e30: 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 6b              disk
0e40: 66 72 65 65 20 20 20 49 4e 54 45 47 45 52 20 44  free   INTEGER D
0e50: 45 46 41 55 4c 54 20 2d 31 2c 0a 20 20 20 20 20  EFAULT -1,.     
0e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e70: 75 6e 61 6d 65 20 20 20 20 20 20 54 45 58 54 20  uname      TEXT 
0e80: 44 45 46 41 55 4c 54 20 27 6e 2f 61 27 2c 20 0a  DEFAULT 'n/a', .
0e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ea0: 20 20 20 20 20 72 75 6e 64 69 72 20 20 20 20 20       rundir     
0eb0: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 6e 2f  TEXT DEFAULT 'n/
0ec0: 61 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  a',.            
0ed0: 20 20 20 20 20 20 20 20 20 73 68 6f 72 74 64 69           shortdi
0ee0: 72 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54  r   TEXT DEFAULT
0ef0: 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20   '',.           
0f00: 20 20 20 20 20 20 20 20 20 20 69 74 65 6d 5f 70            item_p
0f10: 61 74 68 20 20 54 45 58 54 20 44 45 46 41 55 4c  ath  TEXT DEFAUL
0f20: 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20  T '',.          
0f30: 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65             state
0f40: 20 20 20 20 20 20 54 45 58 54 20 44 45 46 41 55        TEXT DEFAU
0f50: 4c 54 20 27 4e 4f 54 5f 53 54 41 52 54 45 44 27  LT 'NOT_STARTED'
0f60: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
0f70: 20 20 20 20 20 20 20 73 74 61 74 75 73 20 20 20         status   
0f80: 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27    TEXT DEFAULT '
0f90: 46 41 49 4c 27 2c 0a 20 20 20 20 20 20 20 20 20  FAIL',.         
0fa0: 20 20 20 20 20 20 20 20 20 20 20 20 61 74 74 65              atte
0fb0: 6d 70 74 6e 75 6d 20 49 4e 54 45 47 45 52 20 44  mptnum INTEGER D
0fc0: 45 46 41 55 4c 54 20 30 2c 0a 20 20 20 20 20 20  EFAULT 0,.      
0fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
0fe0: 69 6e 61 6c 5f 6c 6f 67 66 20 54 45 58 54 20 44  inal_logf TEXT D
0ff0: 45 46 41 55 4c 54 20 27 6c 6f 67 73 2f 66 69 6e  EFAULT 'logs/fin
1000: 61 6c 2e 6c 6f 67 27 2c 0a 20 20 20 20 20 20 20  al.log',.       
1010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f                lo
1020: 67 64 61 74 20 20 20 20 20 42 4c 4f 42 2c 20 0a  gdat     BLOB, .
1030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1040: 20 20 20 20 20 72 75 6e 5f 64 75 72 61 74 69 6f       run_duratio
1050: 6e 20 49 4e 54 45 47 45 52 20 44 45 46 41 55 4c  n INTEGER DEFAUL
1060: 54 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  T 0,.           
1070: 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 65 6e            commen
1080: 74 20 20 20 20 54 45 58 54 20 44 45 46 41 55 4c  t    TEXT DEFAUL
1090: 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20  T '',.          
10a0: 20 20 20 20 20 20 20 20 20 20 20 65 76 65 6e 74             event
10b0: 5f 74 69 6d 65 20 54 49 4d 45 53 54 41 4d 50 2c  _time TIMESTAMP,
10c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10d0: 20 20 20 20 20 20 66 61 69 6c 5f 63 6f 75 6e 74        fail_count
10e0: 20 49 4e 54 45 47 45 52 20 44 45 46 41 55 4c 54   INTEGER DEFAULT
10f0: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1100: 20 20 20 20 20 20 20 20 20 70 61 73 73 5f 63 6f           pass_co
1110: 75 6e 74 20 49 4e 54 45 47 45 52 20 44 45 46 41  unt INTEGER DEFA
1120: 55 4c 54 20 30 2c 0a 20 20 20 20 20 20 20 20 20  ULT 0,.         
1130: 20 20 20 20 20 20 20 20 20 20 20 20 61 72 63 68              arch
1140: 69 76 65 64 20 20 20 49 4e 54 45 47 45 52 20 44  ived   INTEGER D
1150: 45 46 41 55 4c 54 20 30 2c 20 2d 2d 20 30 3d 6e  EFAULT 0, -- 0=n
1160: 6f 2c 20 31 3d 69 6e 20 70 72 6f 67 72 65 73 73  o, 1=in progress
1170: 2c 20 32 3d 79 65 73 0a 20 20 20 20 20 20 20 20  , 2=yes.        
1180: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e               CON
1190: 53 54 52 41 49 4e 54 20 74 65 73 74 73 63 6f 6e  STRAINT testscon
11a0: 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28  straint UNIQUE (
11b0: 72 75 6e 5f 69 64 2c 20 74 65 73 74 6e 61 6d 65  run_id, testname
11c0: 2c 20 69 74 65 6d 5f 70 61 74 68 29 0a 20 20 20  , item_path).   
11d0: 20 20 20 20 20 20 20 29 3b 22 29 0a 20 20 20 20         );").    
11e0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
11f0: 20 64 62 20 22 43 52 45 41 54 45 20 49 4e 44 45   db "CREATE INDE
1200: 58 20 74 65 73 74 73 5f 69 6e 64 65 78 20 4f 4e  X tests_index ON
1210: 20 74 65 73 74 73 20 28 72 75 6e 5f 69 64 2c 20   tests (run_id, 
1220: 74 65 73 74 6e 61 6d 65 2c 20 69 74 65 6d 5f 70  testname, item_p
1230: 61 74 68 29 3b 22 29 0a 20 20 20 20 28 73 71 6c  ath);").    (sql
1240: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
1250: 22 43 52 45 41 54 45 20 56 49 45 57 20 72 75 6e  "CREATE VIEW run
1260: 73 5f 74 65 73 74 73 20 41 53 20 53 45 4c 45 43  s_tests AS SELEC
1270: 54 20 2a 20 46 52 4f 4d 20 72 75 6e 73 20 49 4e  T * FROM runs IN
1280: 4e 45 52 20 4a 4f 49 4e 20 74 65 73 74 73 20 4f  NER JOIN tests O
1290: 4e 20 72 75 6e 73 2e 69 64 3d 74 65 73 74 73 2e  N runs.id=tests.
12a0: 72 75 6e 5f 69 64 3b 22 29 0a 20 20 20 20 28 73  run_id;").    (s
12b0: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64  qlite3:execute d
12c0: 62 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  b "CREATE TABLE 
12d0: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 74 65  IF NOT EXISTS te
12e0: 73 74 5f 73 74 65 70 73 20 0a 20 20 20 20 20 20  st_steps .      
12f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1300: 20 20 20 20 20 20 20 20 28 69 64 20 49 4e 54 45          (id INTE
1310: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
1320: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1340: 74 65 73 74 5f 69 64 20 49 4e 54 45 47 45 52 2c  test_id INTEGER,
1350: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1370: 20 73 74 65 70 6e 61 6d 65 20 54 45 58 54 2c 20   stepname TEXT, 
1380: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a0: 73 74 61 74 65 20 54 45 58 54 20 44 45 46 41 55  state TEXT DEFAU
13b0: 4c 54 20 27 4e 4f 54 5f 53 54 41 52 54 45 44 27  LT 'NOT_STARTED'
13c0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 73 74 61 74 75 73 20 54 45 58 54 20 44 45    status TEXT DE
13f0: 46 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20 20 20  FAULT 'n/a',.   
1400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1410: 20 20 20 20 20 20 20 20 20 20 20 20 65 76 65 6e              even
1420: 74 5f 74 69 6d 65 20 54 49 4d 45 53 54 41 4d 50  t_time TIMESTAMP
1430: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1450: 20 63 6f 6d 6d 65 6e 74 20 54 45 58 54 20 44 45   comment TEXT DE
1460: 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20  FAULT '',.      
1470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1480: 20 20 20 20 20 20 20 20 20 6c 6f 67 66 69 6c 65           logfile
1490: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27   TEXT DEFAULT ''
14a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c0: 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 65 73 74   CONSTRAINT test
14d0: 5f 73 74 65 70 73 5f 63 6f 6e 73 74 72 61 69 6e  _steps_constrain
14e0: 74 20 55 4e 49 51 55 45 20 28 74 65 73 74 5f 69  t UNIQUE (test_i
14f0: 64 2c 73 74 65 70 6e 61 6d 65 2c 73 74 61 74 65  d,stepname,state
1500: 29 29 3b 22 29 0a 20 20 20 20 28 73 71 6c 69 74  ));").    (sqlit
1510: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 43  e3:execute db "C
1520: 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e  REATE TABLE IF N
1530: 4f 54 20 45 58 49 53 54 53 20 65 78 74 72 61 64  OT EXISTS extrad
1540: 61 74 20 28 69 64 20 49 4e 54 45 47 45 52 20 50  at (id INTEGER P
1550: 52 49 4d 41 52 59 20 4b 45 59 2c 20 72 75 6e 5f  RIMARY KEY, run_
1560: 69 64 20 49 4e 54 45 47 45 52 2c 20 6b 65 79 20  id INTEGER, key 
1570: 54 45 58 54 2c 20 76 61 6c 20 54 45 58 54 29 3b  TEXT, val TEXT);
1580: 22 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a  ").    (sqlite3:
1590: 65 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41  execute db "CREA
15a0: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  TE TABLE IF NOT 
15b0: 45 58 49 53 54 53 20 6d 65 74 61 64 61 74 20 28  EXISTS metadat (
15c0: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  id INTEGER PRIMA
15d0: 52 59 20 4b 45 59 2c 20 76 61 72 20 54 45 58 54  RY KEY, var TEXT
15e0: 2c 20 76 61 6c 20 54 45 58 54 2c 0a 20 20 20 20  , val TEXT,.    
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 4f                CO
1610: 4e 53 54 52 41 49 4e 54 20 6d 65 74 61 64 61 74  NSTRAINT metadat
1620: 5f 63 6f 6e 73 74 72 61 69 6e 74 20 55 4e 49 51  _constraint UNIQ
1630: 55 45 20 28 76 61 72 29 29 3b 22 29 0a 20 20 20  UE (var));").   
1640: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
1650: 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41 42  e db "CREATE TAB
1660: 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53  LE IF NOT EXISTS
1670: 20 61 63 63 65 73 73 5f 6c 6f 67 20 28 69 64 20   access_log (id 
1680: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
1690: 4b 45 59 2c 20 75 73 65 72 20 54 45 58 54 2c 20  KEY, user TEXT, 
16a0: 61 63 63 65 73 73 65 64 20 54 49 4d 45 53 54 41  accessed TIMESTA
16b0: 4d 50 2c 20 61 72 67 73 20 54 45 58 54 29 3b 22  MP, args TEXT);"
16c0: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65  ).    (sqlite3:e
16d0: 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 54  xecute db "CREAT
16e0: 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
16f0: 58 49 53 54 53 20 74 65 73 74 5f 6d 65 74 61 20  XISTS test_meta 
1700: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d  (id INTEGER PRIM
1710: 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 20 20  ARY KEY,.       
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
1740: 73 74 6e 61 6d 65 20 20 20 20 54 45 58 54 20 44  stname    TEXT D
1750: 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20  EFAULT '',.     
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1780: 61 75 74 68 6f 72 20 20 20 20 20 20 54 45 58 54  author      TEXT
1790: 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20   DEFAULT '',.   
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c0: 20 20 6f 77 6e 65 72 20 20 20 20 20 20 20 54 45    owner       TE
17d0: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20  XT DEFAULT '',. 
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1800: 20 20 20 20 64 65 73 63 72 69 70 74 69 6f 6e 20      description 
1810: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c  TEXT DEFAULT '',
1820: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1840: 20 20 20 20 20 20 72 65 76 69 65 77 65 64 20 20        reviewed  
1850: 20 20 54 49 4d 45 53 54 41 4d 50 2c 0a 20 20 20    TIMESTAMP,.   
1860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1880: 20 20 69 74 65 72 61 74 65 64 20 20 20 20 54 45    iterated    TE
1890: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20  XT DEFAULT '',. 
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c0: 20 20 20 20 61 76 67 5f 72 75 6e 74 69 6d 65 20      avg_runtime 
18d0: 52 45 41 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  REAL,.          
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f0: 20 20 20 20 20 20 20 20 20 20 20 61 76 67 5f 64             avg_d
1900: 69 73 6b 20 20 20 20 52 45 41 4c 2c 0a 20 20 20  isk    REAL,.   
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1930: 20 20 74 61 67 73 20 20 20 20 20 20 20 20 54 45    tags        TE
1940: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20  XT DEFAULT '',. 
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1970: 20 20 20 20 6a 6f 62 67 72 6f 75 70 20 20 20 20      jobgroup    
1980: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 64 65  TEXT DEFAULT 'de
1990: 66 61 75 6c 74 27 2c 0a 20 20 20 20 20 20 20 20  fault',.        
19a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b0: 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52 41 49          CONSTRAI
19c0: 4e 54 20 74 65 73 74 5f 6d 65 74 61 5f 63 6f 6e  NT test_meta_con
19d0: 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28  straint UNIQUE (
19e0: 74 65 73 74 6e 61 6d 65 29 29 3b 22 29 0a 20 20  testname));").  
19f0: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
1a00: 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41  te db "CREATE TA
1a10: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54  BLE IF NOT EXIST
1a20: 53 20 74 65 73 74 5f 64 61 74 61 20 28 69 64 20  S test_data (id 
1a30: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
1a40: 4b 45 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20  KEY,.           
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a60: 20 20 20 20 20 74 65 73 74 5f 69 64 20 49 4e 54       test_id INT
1a70: 45 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20  EGER,.          
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 20 20 20 20 20 20 63 61 74 65 67 6f 72 79 20 54        category T
1aa0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a  EXT DEFAULT '',.
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad0: 76 61 72 69 61 62 6c 65 20 54 45 58 54 2c 0a 09  variable TEXT,..
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af0: 20 20 20 20 20 20 20 20 76 61 6c 75 65 20 52 45          value RE
1b00: 41 4c 2c 0a 09 20 20 20 20 20 20 20 20 20 20 20  AL,..           
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70               exp
1b20: 65 63 74 65 64 20 52 45 41 4c 2c 0a 09 20 20 20  ected REAL,..   
1b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b40: 20 20 20 20 20 74 6f 6c 20 52 45 41 4c 2c 0a 20       tol REAL,. 
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75                 u
1b70: 6e 69 74 73 20 54 45 58 54 2c 0a 20 20 20 20 20  nits TEXT,.     
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 65             comme
1ba0: 6e 74 20 54 45 58 54 20 44 45 46 41 55 4c 54 20  nt TEXT DEFAULT 
1bb0: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '',.            
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd0: 20 20 20 20 73 74 61 74 75 73 20 54 45 58 54 20      status TEXT 
1be0: 44 45 46 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20  DEFAULT 'n/a',. 
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1c10: 79 70 65 20 54 45 58 54 20 44 45 46 41 55 4c 54  ype TEXT DEFAULT
1c20: 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20   '',.           
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 65     CONSTRAINT te
1c50: 73 74 5f 64 61 74 61 5f 63 6f 6e 73 74 72 61 69  st_data_constrai
1c60: 6e 74 20 55 4e 49 51 55 45 20 28 74 65 73 74 5f  nt UNIQUE (test_
1c70: 69 64 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 69  id,category,vari
1c80: 61 62 6c 65 29 29 3b 22 29 0a 20 20 20 20 3b 3b  able));").    ;;
1c90: 20 4d 75 73 74 20 64 6f 20 74 68 69 73 20 2a 61   Must do this *a
1ca0: 66 74 65 72 2a 20 72 75 6e 6e 69 6e 67 20 70 61  fter* running pa
1cb0: 74 63 68 20 64 62 20 21 21 20 4e 6f 20 6d 6f 72  tch db !! No mor
1cc0: 65 2e 20 0a 20 20 20 20 28 64 62 3a 73 65 74 2d  e. .    (db:set-
1cd0: 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 53 54  var db "MEGATEST
1ce0: 5f 56 45 52 53 49 4f 4e 22 20 6d 65 67 61 74 65  _VERSION" megate
1cf0: 73 74 2d 76 65 72 73 69 6f 6e 29 0a 20 20 20 20  st-version).    
1d00: 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ))..;;==========
1d10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1d20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1d30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1d40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20  ============.;; 
1d50: 54 4f 44 4f 3a 0a 3b 3b 20 20 20 70 75 74 20 64  TODO:.;;   put d
1d60: 65 6c 74 61 73 20 69 6e 74 6f 20 61 6e 20 61 73  eltas into an as
1d70: 73 6f 63 20 6c 69 73 74 20 77 69 74 68 20 76 65  soc list with ve
1d80: 72 73 69 6f 6e 20 6e 75 6d 62 65 72 73 0a 3b 3b  rsion numbers.;;
1d90: 20 20 20 61 70 70 6c 79 20 61 6c 6c 20 66 72 6f     apply all fro
1da0: 6d 20 6c 61 73 74 20 74 6f 20 63 75 72 72 65 6e  m last to curren
1db0: 74 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  t.;;============
1dc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1dd0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1de0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1df0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 28 64 65 66 69  ==========.(defi
1e00: 6e 65 20 28 70 61 74 63 68 2d 64 62 20 64 62 29  ne (patch-db db)
1e10: 0a 20 20 28 68 61 6e 64 6c 65 2d 65 78 63 65 70  .  (handle-excep
1e20: 74 69 6f 6e 73 0a 20 20 20 65 78 6e 0a 20 20 20  tions.   exn.   
1e30: 28 62 65 67 69 6e 0a 20 20 20 20 20 28 70 72 69  (begin.     (pri
1e40: 6e 74 20 22 45 78 63 65 70 74 69 6f 6e 3a 20 22  nt "Exception: "
1e50: 20 65 78 6e 29 0a 20 20 20 20 20 28 70 72 69 6e   exn).     (prin
1e60: 74 20 22 45 52 52 4f 52 3a 20 50 6f 73 73 69 62  t "ERROR: Possib
1e70: 6c 65 20 6f 75 74 20 6f 66 20 64 61 74 65 20 73  le out of date s
1e80: 63 68 65 6d 61 2c 20 61 74 74 65 6d 70 74 69 6e  chema, attemptin
1e90: 67 20 74 6f 20 61 64 64 20 74 61 62 6c 65 20 6d  g to add table m
1ea0: 65 74 61 64 61 74 61 2e 2e 2e 22 29 0a 20 20 20  etadata...").   
1eb0: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
1ec0: 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41  te db "CREATE TA
1ed0: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54  BLE IF NOT EXIST
1ee0: 53 20 6d 65 74 61 64 61 74 20 28 69 64 20 49 4e  S metadat (id IN
1ef0: 54 45 47 45 52 2c 20 76 61 72 20 54 45 58 54 2c  TEGER, var TEXT,
1f00: 20 76 61 6c 20 54 45 58 54 2c 0a 20 20 20 20 20   val TEXT,.     
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f20: 20 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e 53              CONS
1f30: 54 52 41 49 4e 54 20 6d 65 74 61 64 61 74 5f 63  TRAINT metadat_c
1f40: 6f 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45  onstraint UNIQUE
1f50: 20 28 76 61 72 29 29 3b 22 29 0a 20 20 20 20 20   (var));").     
1f60: 28 69 66 20 28 6e 6f 74 20 28 64 62 3a 67 65 74  (if (not (db:get
1f70: 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 53  -var db "MEGATES
1f80: 54 5f 56 45 52 53 49 4f 4e 22 29 29 0a 09 20 28  T_VERSION")).. (
1f90: 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d  db:set-var db "M
1fa0: 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22  EGATEST_VERSION"
1fb0: 20 31 2e 31 37 29 29 29 0a 20 20 20 28 6c 65 74   1.17))).   (let
1fc0: 20 28 28 6d 76 65 72 20 28 64 62 3a 67 65 74 2d   ((mver (db:get-
1fd0: 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 53 54  var db "MEGATEST
1fe0: 5f 56 45 52 53 49 4f 4e 22 29 29 0a 09 20 28 74  _VERSION")).. (t
1ff0: 65 73 74 2d 6d 65 74 61 2d 64 65 66 20 22 43 52  est-meta-def "CR
2000: 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f  EATE TABLE IF NO
2010: 54 20 45 58 49 53 54 53 20 74 65 73 74 5f 6d 65  T EXISTS test_me
2020: 74 61 20 28 69 64 20 49 4e 54 45 47 45 52 20 50  ta (id INTEGER P
2030: 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20  RIMARY KEY,.    
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2060: 20 74 65 73 74 6e 61 6d 65 20 20 20 20 54 45 58   testname    TEX
2070: 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20  T DEFAULT '',.  
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a0: 20 20 20 61 75 74 68 6f 72 20 20 20 20 20 20 54     author      T
20b0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a  EXT DEFAULT '',.
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e0: 20 20 20 20 20 6f 77 6e 65 72 20 20 20 20 20 20       owner      
20f0: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27   TEXT DEFAULT ''
2100: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2120: 20 20 20 20 20 20 20 64 65 73 63 72 69 70 74 69         descripti
2130: 6f 6e 20 54 45 58 54 20 44 45 46 41 55 4c 54 20  on TEXT DEFAULT 
2140: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '',.            
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 20 20 20 20 20 20 20 72 65 76 69 65 77 65           reviewe
2170: 64 20 20 20 20 54 49 4d 45 53 54 41 4d 50 2c 0a  d    TIMESTAMP,.
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a0: 20 20 20 20 20 69 74 65 72 61 74 65 64 20 20 20       iterated   
21b0: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27   TEXT DEFAULT ''
21c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 20 20 20 20 20 20 20 61 76 67 5f 72 75 6e 74 69         avg_runti
21f0: 6d 65 20 52 45 41 4c 2c 0a 20 20 20 20 20 20 20  me REAL,.       
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 76                av
2220: 67 5f 64 69 73 6b 20 20 20 20 52 45 41 4c 2c 0a  g_disk    REAL,.
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2250: 20 20 20 20 20 74 61 67 73 20 20 20 20 20 20 20       tags       
2260: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27   TEXT DEFAULT ''
2270: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2290: 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 65 73    CONSTRAINT tes
22a0: 74 5f 6d 65 74 61 5f 63 6f 6e 73 74 72 61 69 6e  t_meta_constrain
22b0: 74 20 55 4e 49 51 55 45 20 28 74 65 73 74 6e 61  t UNIQUE (testna
22c0: 6d 65 29 29 3b 22 29 29 0a 20 20 20 20 20 28 70  me));")).     (p
22d0: 72 69 6e 74 20 22 43 75 72 72 65 6e 74 20 73 63  rint "Current sc
22e0: 68 65 6d 61 20 76 65 72 73 69 6f 6e 3a 20 22 20  hema version: " 
22f0: 6d 76 65 72 20 22 20 63 75 72 72 65 6e 74 20 6d  mver " current m
2300: 65 67 61 74 65 73 74 20 76 65 72 73 69 6f 6e 3a  egatest version:
2310: 20 22 20 6d 65 67 61 74 65 73 74 2d 76 65 72 73   " megatest-vers
2320: 69 6f 6e 29 0a 20 20 20 20 20 28 63 6f 6e 64 0a  ion).     (cond.
2330: 20 20 20 20 20 20 28 28 6e 6f 74 20 6d 76 65 72        ((not mver
2340: 29 0a 20 20 20 20 20 20 20 28 70 72 69 6e 74 20  ).       (print 
2350: 22 41 64 64 69 6e 67 20 6d 65 67 61 74 65 73 74  "Adding megatest
2360: 2d 76 65 72 73 69 6f 6e 20 74 6f 20 6d 65 74 61  -version to meta
2370: 64 61 74 61 22 29 20 3b 3b 20 4e 65 65 64 20 74  data") ;; Need t
2380: 6f 20 72 65 63 72 65 61 74 65 20 74 68 65 20 74  o recreate the t
2390: 61 62 6c 65 0a 20 20 20 20 20 20 20 28 73 71 6c  able.       (sql
23a0: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
23b0: 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45  "DROP TABLE IF E
23c0: 58 49 53 54 53 20 6d 65 74 61 64 61 74 3b 22 29  XISTS metadat;")
23d0: 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  .       (sqlite3
23e0: 3a 65 78 65 63 75 74 65 20 64 62 20 22 43 52 45  :execute db "CRE
23f0: 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54  ATE TABLE IF NOT
2400: 20 45 58 49 53 54 53 20 6d 65 74 61 64 61 74 20   EXISTS metadat 
2410: 28 69 64 20 49 4e 54 45 47 45 52 2c 20 76 61 72  (id INTEGER, var
2420: 20 54 45 58 54 2c 20 76 61 6c 20 54 45 58 54 2c   TEXT, val TEXT,
2430: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2450: 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 6d 65     CONSTRAINT me
2460: 74 61 64 61 74 5f 63 6f 6e 73 74 72 61 69 6e 74  tadat_constraint
2470: 20 55 4e 49 51 55 45 20 28 76 61 72 29 29 3b 22   UNIQUE (var));"
2480: 29 0a 20 20 20 20 20 20 20 28 64 62 3a 73 65 74  ).       (db:set
2490: 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 53  -var db "MEGATES
24a0: 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e 31 37 29  T_VERSION" 1.17)
24b0: 0a 20 20 20 20 20 20 20 28 70 61 74 63 68 2d 64  .       (patch-d
24c0: 62 29 29 0a 20 20 20 20 20 20 28 28 3c 20 6d 76  b)).      ((< mv
24d0: 65 72 20 31 2e 32 31 29 0a 20 20 20 20 20 20 20  er 1.21).       
24e0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
24f0: 20 64 62 20 22 44 52 4f 50 20 54 41 42 4c 45 20   db "DROP TABLE 
2500: 49 46 20 45 58 49 53 54 53 20 6d 65 74 61 64 61  IF EXISTS metada
2510: 74 3b 22 29 0a 20 20 20 20 20 20 20 28 73 71 6c  t;").       (sql
2520: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
2530: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46  "CREATE TABLE IF
2540: 20 4e 4f 54 20 45 58 49 53 54 53 20 6d 65 74 61   NOT EXISTS meta
2550: 64 61 74 20 28 69 64 20 49 4e 54 45 47 45 52 2c  dat (id INTEGER,
2560: 20 76 61 72 20 54 45 58 54 2c 20 76 61 6c 20 54   var TEXT, val T
2570: 45 58 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  EXT,.           
2580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2590: 20 20 20 20 20 20 20 43 4f 4e 53 54 52 41 49 4e         CONSTRAIN
25a0: 54 20 6d 65 74 61 64 61 74 5f 63 6f 6e 73 74 72  T metadat_constr
25b0: 61 69 6e 74 20 55 4e 49 51 55 45 20 28 76 61 72  aint UNIQUE (var
25c0: 29 29 3b 22 29 0a 20 20 20 20 20 20 20 28 64 62  ));").       (db
25d0: 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47  :set-var db "MEG
25e0: 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 31  ATEST_VERSION" 1
25f0: 2e 32 31 29 20 3b 3b 20 73 65 74 20 62 65 66 6f  .21) ;; set befo
2600: 72 65 2c 20 6a 75 73 74 20 69 6e 20 63 61 73 65  re, just in case
2610: 20 74 68 65 20 63 68 61 6e 67 65 73 20 61 72 65   the changes are
2620: 20 61 6c 72 65 61 64 79 20 61 70 70 6c 69 65 64   already applied
2630: 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  .       (sqlite3
2640: 3a 65 78 65 63 75 74 65 20 64 62 20 74 65 73 74  :execute db test
2650: 2d 6d 65 74 61 2d 64 65 66 29 0a 09 09 09 09 09  -meta-def)......
2660: 3b 28 66 6f 72 2d 65 61 63 68 20 0a 09 09 09 09  ;(for-each .....
2670: 09 3b 20 28 6c 61 6d 62 64 61 20 28 73 74 6d 74  .; (lambda (stmt
2680: 29 0a 09 09 09 09 09 3b 20 20 20 28 73 71 6c 69  )......;   (sqli
2690: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 73  te3:execute db s
26a0: 74 6d 74 29 29 0a 09 09 09 09 09 3b 20 28 6c 69  tmt))......; (li
26b0: 73 74 20 0a 09 09 09 09 09 3b 20 20 22 41 4c 54  st ......;  "ALT
26c0: 45 52 20 54 41 42 4c 45 20 74 65 73 74 73 20 41  ER TABLE tests A
26d0: 44 44 20 43 4f 4c 55 4d 4e 20 66 69 72 73 74 5f  DD COLUMN first_
26e0: 65 72 72 20 54 45 58 54 3b 22 0a 09 09 09 09 09  err TEXT;"......
26f0: 3b 20 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20  ;  "ALTER TABLE 
2700: 74 65 73 74 73 20 41 44 44 20 43 4f 4c 55 4d 4e  tests ADD COLUMN
2710: 20 66 69 72 73 74 5f 77 61 72 6e 20 54 45 58 54   first_warn TEXT
2720: 3b 22 0a 09 09 09 09 09 3b 20 20 29 29 0a 20 20  ;"......;  )).  
2730: 20 20 20 20 20 28 70 61 74 63 68 2d 64 62 29 29       (patch-db))
2740: 0a 20 20 20 20 20 20 28 28 3c 20 6d 76 65 72 20  .      ((< mver 
2750: 31 2e 32 34 29 0a 20 20 20 20 20 20 20 28 64 62  1.24).       (db
2760: 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47  :set-var db "MEG
2770: 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 31  ATEST_VERSION" 1
2780: 2e 32 34 29 0a 20 20 20 20 20 20 20 28 73 71 6c  .24).       (sql
2790: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
27a0: 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45  "DROP TABLE IF E
27b0: 58 49 53 54 53 20 74 65 73 74 5f 64 61 74 61 3b  XISTS test_data;
27c0: 22 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74  ").       (sqlit
27d0: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 44  e3:execute db "D
27e0: 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49  ROP TABLE IF EXI
27f0: 53 54 53 20 74 65 73 74 5f 6d 65 74 61 3b 22 29  STS test_meta;")
2800: 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  .       (sqlite3
2810: 3a 65 78 65 63 75 74 65 20 64 62 20 74 65 73 74  :execute db test
2820: 2d 6d 65 74 61 2d 64 65 66 29 0a 20 20 20 20 20  -meta-def).     
2830: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
2840: 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41  te db "CREATE TA
2850: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54  BLE IF NOT EXIST
2860: 53 20 74 65 73 74 5f 64 61 74 61 20 28 69 64 20  S test_data (id 
2870: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
2880: 4b 45 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20  KEY,.           
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a0: 20 20 20 20 20 74 65 73 74 5f 69 64 20 49 4e 54       test_id INT
28b0: 45 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20  EGER,.          
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d0: 20 20 20 20 20 20 63 61 74 65 67 6f 72 79 20 54        category T
28e0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a  EXT DEFAULT '',.
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2910: 76 61 72 69 61 62 6c 65 20 54 45 58 54 2c 0a 09  variable TEXT,..
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2930: 20 20 20 20 20 20 20 20 76 61 6c 75 65 20 52 45          value RE
2940: 41 4c 2c 0a 09 20 20 20 20 20 20 20 20 20 20 20  AL,..           
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70               exp
2960: 65 63 74 65 64 20 52 45 41 4c 2c 0a 09 20 20 20  ected REAL,..   
2970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2980: 20 20 20 20 20 74 6f 6c 20 52 45 41 4c 2c 0a 20       tol REAL,. 
2990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75                 u
29b0: 6e 69 74 73 20 54 45 58 54 2c 0a 20 20 20 20 20  nits TEXT,.     
29c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 65             comme
29e0: 6e 74 20 54 45 58 54 20 44 45 46 41 55 4c 54 20  nt TEXT DEFAULT 
29f0: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '',.            
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a10: 20 20 20 20 73 74 61 74 75 73 20 54 45 58 54 20      status TEXT 
2a20: 44 45 46 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20  DEFAULT 'n/a',. 
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e               CON
2a50: 53 54 52 41 49 4e 54 20 74 65 73 74 5f 64 61 74  STRAINT test_dat
2a60: 61 20 55 4e 49 51 55 45 20 28 74 65 73 74 5f 69  a UNIQUE (test_i
2a70: 64 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 69 61  d,category,varia
2a80: 62 6c 65 29 29 3b 22 29 0a 20 20 20 20 20 20 20  ble));").       
2a90: 28 70 72 69 6e 74 20 22 57 41 52 4e 49 4e 47 3a  (print "WARNING:
2aa0: 20 54 61 62 6c 65 20 74 65 73 74 5f 64 61 74 61   Table test_data
2ab0: 20 61 6e 64 20 74 65 73 74 5f 6d 65 74 61 20 77   and test_meta w
2ac0: 65 72 65 20 72 65 63 72 65 61 74 65 64 2e 20 50  ere recreated. P
2ad0: 6c 65 61 73 65 20 64 6f 20 6d 65 67 61 74 65 73  lease do megates
2ae0: 74 20 2d 75 70 64 61 74 65 2d 6d 65 74 61 22 29  t -update-meta")
2af0: 0a 20 20 20 20 20 20 20 28 70 61 74 63 68 2d 64  .       (patch-d
2b00: 62 29 29 0a 20 20 20 20 20 20 28 28 3c 20 6d 76  b)).      ((< mv
2b10: 65 72 20 31 2e 32 37 29 0a 20 20 20 20 20 20 20  er 1.27).       
2b20: 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22  (db:set-var db "
2b30: 4d 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e  MEGATEST_VERSION
2b40: 22 20 31 2e 32 37 29 0a 20 20 20 20 20 20 20 28  " 1.27).       (
2b50: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
2b60: 64 62 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20  db "ALTER TABLE 
2b70: 74 65 73 74 5f 64 61 74 61 20 41 44 44 20 43 4f  test_data ADD CO
2b80: 4c 55 4d 4e 20 74 79 70 65 20 54 45 58 54 20 44  LUMN type TEXT D
2b90: 45 46 41 55 4c 54 20 27 27 3b 22 29 0a 20 20 20  EFAULT '';").   
2ba0: 20 20 20 20 28 70 61 74 63 68 2d 64 62 29 29 0a      (patch-db)).
2bb0: 20 20 20 20 20 20 28 28 3c 20 6d 76 65 72 20 31        ((< mver 1
2bc0: 2e 32 39 29 0a 20 20 20 20 20 20 20 28 64 62 3a  .29).       (db:
2bd0: 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41  set-var db "MEGA
2be0: 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e  TEST_VERSION" 1.
2bf0: 32 39 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69  29).       (sqli
2c00: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22  te3:execute db "
2c10: 41 4c 54 45 52 20 54 41 42 4c 45 20 74 65 73 74  ALTER TABLE test
2c20: 5f 73 74 65 70 73 20 41 44 44 20 43 4f 4c 55 4d  _steps ADD COLUM
2c30: 4e 20 6c 6f 67 66 69 6c 65 20 54 45 58 54 20 44  N logfile TEXT D
2c40: 45 46 41 55 4c 54 20 27 27 3b 22 29 0a 20 20 20  EFAULT '';").   
2c50: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65      (sqlite3:exe
2c60: 63 75 74 65 20 64 62 20 22 41 4c 54 45 52 20 54  cute db "ALTER T
2c70: 41 42 4c 45 20 74 65 73 74 73 20 41 44 44 20 43  ABLE tests ADD C
2c80: 4f 4c 55 4d 4e 20 73 68 6f 72 74 64 69 72 20 54  OLUMN shortdir T
2c90: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 3b 22  EXT DEFAULT '';"
2ca0: 29 29 0a 20 20 20 20 20 20 28 28 3c 20 6d 76 65  )).      ((< mve
2cb0: 72 20 31 2e 33 36 29 0a 20 20 20 20 20 20 20 28  r 1.36).       (
2cc0: 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d  db:set-var db "M
2cd0: 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22  EGATEST_VERSION"
2ce0: 20 31 2e 33 36 29 0a 20 20 20 20 20 20 20 28 73   1.36).       (s
2cf0: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64  qlite3:execute d
2d00: 62 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 74  b "ALTER TABLE t
2d10: 65 73 74 5f 6d 65 74 61 20 41 44 44 20 43 4f 4c  est_meta ADD COL
2d20: 55 4d 4e 20 6a 6f 62 67 72 6f 75 70 20 54 45 58  UMN jobgroup TEX
2d30: 54 20 44 45 46 41 55 4c 54 20 27 64 65 66 61 75  T DEFAULT 'defau
2d40: 6c 74 27 3b 22 29 29 0a 20 20 20 20 20 20 28 28  lt';")).      ((
2d50: 3c 20 6d 76 65 72 20 31 2e 33 37 29 0a 20 20 20  < mver 1.37).   
2d60: 20 20 20 20 28 64 62 3a 73 65 74 2d 76 61 72 20      (db:set-var 
2d70: 64 62 20 22 4d 45 47 41 54 45 53 54 5f 56 45 52  db "MEGATEST_VER
2d80: 53 49 4f 4e 22 20 31 2e 33 37 29 0a 20 20 20 20  SION" 1.37).    
2d90: 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63     (sqlite3:exec
2da0: 75 74 65 20 64 62 20 22 41 4c 54 45 52 20 54 41  ute db "ALTER TA
2db0: 42 4c 45 20 74 65 73 74 73 20 41 44 44 20 43 4f  BLE tests ADD CO
2dc0: 4c 55 4d 4e 20 61 72 63 68 69 76 65 64 20 49 4e  LUMN archived IN
2dd0: 54 45 47 45 52 20 44 45 46 41 55 4c 54 20 30 3b  TEGER DEFAULT 0;
2de0: 22 29 29 20 0a 20 20 20 20 20 20 28 28 3c 20 6d  ")) .      ((< m
2df0: 76 65 72 20 6d 65 67 61 74 65 73 74 2d 76 65 72  ver megatest-ver
2e00: 73 69 6f 6e 29 0a 20 20 20 20 20 20 20 28 64 62  sion).       (db
2e10: 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47  :set-var db "MEG
2e20: 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 6d  ATEST_VERSION" m
2e30: 65 67 61 74 65 73 74 2d 76 65 72 73 69 6f 6e 29  egatest-version)
2e40: 29 29 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d  )))))..;;=======
2e50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2e60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2e70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2e80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a  ===============.
2e90: 3b 3b 20 6d 65 74 61 20 67 65 74 20 61 6e 64 20  ;; meta get and 
2ea0: 73 65 74 20 76 61 72 73 0a 3b 3b 3d 3d 3d 3d 3d  set vars.;;=====
2eb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2ec0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2ed0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2ee0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2ef0: 3d 0a 0a 3b 3b 20 72 65 74 75 72 6e 73 20 6e 75  =..;; returns nu
2f00: 6d 62 65 72 20 69 66 20 73 74 72 69 6e 67 2d 3e  mber if string->
2f10: 6e 75 6d 62 65 72 20 69 73 20 73 75 63 63 65 73  number is succes
2f20: 73 66 75 6c 2c 20 73 74 72 69 6e 67 20 6f 74 68  sful, string oth
2f30: 65 72 77 69 73 65 0a 28 64 65 66 69 6e 65 20 28  erwise.(define (
2f40: 64 62 3a 67 65 74 2d 76 61 72 20 64 62 20 76 61  db:get-var db va
2f50: 72 29 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20  r).  (let ((res 
2f60: 23 66 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65  #f)).    (sqlite
2f70: 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20  3:for-each-row. 
2f80: 20 20 20 20 28 6c 61 6d 62 64 61 20 28 76 61 6c      (lambda (val
2f90: 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72  ).       (set! r
2fa0: 65 73 20 76 61 6c 29 29 0a 20 20 20 20 20 64 62  es val)).     db
2fb0: 20 22 53 45 4c 45 43 54 20 76 61 6c 20 46 52 4f   "SELECT val FRO
2fc0: 4d 20 6d 65 74 61 64 61 74 20 57 48 45 52 45 20  M metadat WHERE 
2fd0: 76 61 72 3d 3f 3b 22 20 76 61 72 29 0a 20 20 20  var=?;" var).   
2fe0: 20 28 69 66 20 28 73 74 72 69 6e 67 3f 20 72 65   (if (string? re
2ff0: 73 29 0a 09 28 6c 65 74 20 28 28 76 61 6c 6e 75  s)..(let ((valnu
3000: 6d 20 28 73 74 72 69 6e 67 2d 3e 6e 75 6d 62 65  m (string->numbe
3010: 72 20 72 65 73 29 29 29 0a 09 20 20 28 69 66 20  r res)))..  (if 
3020: 76 61 6c 6e 75 6d 20 76 61 6c 6e 75 6d 20 72 65  valnum valnum re
3030: 73 29 29 0a 09 72 65 73 29 29 29 0a 0a 28 64 65  s))..res)))..(de
3040: 66 69 6e 65 20 28 64 62 3a 73 65 74 2d 76 61 72  fine (db:set-var
3050: 20 64 62 20 76 61 72 20 76 61 6c 29 0a 20 20 28   db var val).  (
3060: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
3070: 64 62 20 22 49 4e 53 45 52 54 20 4f 52 20 52 45  db "INSERT OR RE
3080: 50 4c 41 43 45 20 49 4e 54 4f 20 6d 65 74 61 64  PLACE INTO metad
3090: 61 74 20 28 76 61 72 2c 76 61 6c 29 20 56 41 4c  at (var,val) VAL
30a0: 55 45 53 20 28 3f 2c 3f 29 3b 22 20 76 61 72 20  UES (?,?);" var 
30b0: 76 61 6c 29 29 0a 0a 3b 3b 20 75 73 65 20 61 20  val))..;; use a 
30c0: 67 6c 6f 62 61 6c 20 66 6f 72 20 73 6f 6d 65 20  global for some 
30d0: 70 72 69 6d 69 74 69 76 65 20 63 61 63 68 69 6e  primitive cachin
30e0: 67 2c 20 69 74 20 69 73 20 6a 75 73 74 20 73 69  g, it is just si
30f0: 6c 6c 79 20 74 6f 20 72 65 2d 72 65 61 64 20 74  lly to re-read t
3100: 68 65 20 64 62 20 0a 3b 3b 20 6f 76 65 72 20 61  he db .;; over a
3110: 6e 64 20 6f 76 65 72 20 61 67 61 69 6e 20 66 6f  nd over again fo
3120: 72 20 74 68 65 20 6b 65 79 73 20 73 69 6e 63 65  r the keys since
3130: 20 74 68 65 79 20 6e 65 76 65 72 20 63 68 61 6e   they never chan
3140: 67 65 0a 0a 28 64 65 66 69 6e 65 20 2a 64 62 2d  ge..(define *db-
3150: 6b 65 79 73 2a 20 23 66 29 0a 0a 28 64 65 66 69  keys* #f)..(defi
3160: 6e 65 20 28 64 62 3a 67 65 74 2d 6b 65 79 73 20  ne (db:get-keys 
3170: 64 62 29 0a 20 20 28 69 66 20 2a 64 62 2d 6b 65  db).  (if *db-ke
3180: 79 73 2a 20 2a 64 62 2d 6b 65 79 73 2a 20 0a 20  ys* *db-keys* . 
3190: 20 20 20 20 20 28 6c 65 74 20 28 28 72 65 73 20       (let ((res 
31a0: 27 28 29 29 29 0a 09 28 73 71 6c 69 74 65 33 3a  '()))..(sqlite3:
31b0: 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 09 20  for-each-row .. 
31c0: 28 6c 61 6d 62 64 61 20 28 6b 65 79 20 6b 65 79  (lambda (key key
31d0: 74 79 70 65 29 0a 09 20 20 20 28 73 65 74 21 20  type)..   (set! 
31e0: 72 65 73 20 28 63 6f 6e 73 20 28 76 65 63 74 6f  res (cons (vecto
31f0: 72 20 6b 65 79 20 6b 65 79 74 79 70 65 29 20 72  r key keytype) r
3200: 65 73 29 29 29 0a 09 20 64 62 0a 09 20 22 53 45  es))).. db.. "SE
3210: 4c 45 43 54 20 66 69 65 6c 64 6e 61 6d 65 2c 66  LECT fieldname,f
3220: 69 65 6c 64 74 79 70 65 20 46 52 4f 4d 20 6b 65  ieldtype FROM ke
3230: 79 73 20 4f 52 44 45 52 20 42 59 20 69 64 20 44  ys ORDER BY id D
3240: 45 53 43 3b 22 29 0a 09 28 73 65 74 21 20 2a 64  ESC;")..(set! *d
3250: 62 2d 6b 65 79 73 2a 20 72 65 73 29 0a 09 72 65  b-keys* res)..re
3260: 73 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64  s)))..(define (d
3270: 62 3a 67 65 74 2d 76 61 6c 75 65 2d 62 79 2d 68  b:get-value-by-h
3280: 65 61 64 65 72 20 72 6f 77 20 68 65 61 64 65 72  eader row header
3290: 20 66 69 65 6c 64 29 0a 20 20 3b 3b 20 28 64 65   field).  ;; (de
32a0: 62 75 67 3a 70 72 69 6e 74 20 32 20 22 64 62 3a  bug:print 2 "db:
32b0: 67 65 74 2d 76 61 6c 75 65 2d 62 79 2d 68 65 61  get-value-by-hea
32c0: 64 65 72 20 72 6f 77 3a 20 22 20 72 6f 77 20 22  der row: " row "
32d0: 20 68 65 61 64 65 72 3a 20 22 20 68 65 61 64 65   header: " heade
32e0: 72 20 22 20 66 69 65 6c 64 3a 20 22 20 66 69 65  r " field: " fie
32f0: 6c 64 29 0a 20 20 28 69 66 20 28 6e 75 6c 6c 3f  ld).  (if (null?
3300: 20 68 65 61 64 65 72 29 20 23 66 0a 20 20 20 20   header) #f.    
3310: 20 20 28 6c 65 74 20 6c 6f 6f 70 20 28 28 68 65    (let loop ((he
3320: 64 20 28 63 61 72 20 68 65 61 64 65 72 29 29 0a  d (car header)).
3330: 09 09 20 28 74 61 6c 20 28 63 64 72 20 68 65 61  .. (tal (cdr hea
3340: 64 65 72 29 29 0a 09 09 20 28 6e 20 20 20 30 29  der))... (n   0)
3350: 29 0a 09 28 69 66 20 28 65 71 75 61 6c 3f 20 68  )..(if (equal? h
3360: 65 64 20 66 69 65 6c 64 29 0a 09 20 20 20 20 28  ed field)..    (
3370: 76 65 63 74 6f 72 2d 72 65 66 20 72 6f 77 20 6e  vector-ref row n
3380: 29 0a 09 20 20 20 20 28 69 66 20 28 6e 75 6c 6c  )..    (if (null
3390: 3f 20 74 61 6c 29 20 23 66 20 28 6c 6f 6f 70 20  ? tal) #f (loop 
33a0: 28 63 61 72 20 74 61 6c 29 28 63 64 72 20 74 61  (car tal)(cdr ta
33b0: 6c 29 28 2b 20 6e 20 31 29 29 29 29 29 29 29 0a  l)(+ n 1))))))).
33c0: 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  .;;=============
33d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
33e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
33f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3400: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 20 52 20  =========.;;  R 
3410: 55 20 4e 20 53 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d  U N S.;;========
3420: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3430: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3440: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3450: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a  ==============..
3460: 28 64 65 66 69 6e 65 20 28 72 75 6e 73 3a 67 65  (define (runs:ge
3470: 74 2d 73 74 64 2d 72 75 6e 2d 66 69 65 6c 64 73  t-std-run-fields
3480: 20 6b 65 79 73 20 72 65 6d 66 69 65 6c 64 73 29   keys remfields)
3490: 0a 20 20 28 6c 65 74 2a 20 28 28 68 65 61 64 65  .  (let* ((heade
34a0: 72 20 20 20 20 28 61 70 70 65 6e 64 20 28 6d 61  r    (append (ma
34b0: 70 20 6b 65 79 3a 67 65 74 2d 66 69 65 6c 64 6e  p key:get-fieldn
34c0: 61 6d 65 20 6b 65 79 73 29 0a 09 09 09 20 20 20  ame keys)....   
34d0: 20 72 65 6d 66 69 65 6c 64 73 29 29 0a 09 20 28   remfields)).. (
34e0: 6b 65 79 73 74 72 20 20 20 20 28 63 6f 6e 63 20  keystr    (conc 
34f0: 28 6b 65 79 73 2d 3e 6b 65 79 73 74 72 20 6b 65  (keys->keystr ke
3500: 79 73 29 20 22 2c 22 0a 09 09 09 20 20 28 73 74  ys) ","....  (st
3510: 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65  ring-intersperse
3520: 20 72 65 6d 66 69 65 6c 64 73 20 22 2c 22 29 29   remfields ","))
3530: 29 29 0a 20 20 20 20 28 6c 69 73 74 20 6b 65 79  )).    (list key
3540: 73 74 72 20 68 65 61 64 65 72 29 29 29 0a 0a 3b  str header)))..;
3550: 3b 20 6d 61 6b 65 20 61 20 71 75 65 72 79 20 28  ; make a query (
3560: 66 69 65 6c 64 6e 61 6d 65 20 6c 69 6b 65 20 27  fieldname like '
3570: 70 61 74 74 31 27 20 4f 52 20 66 69 65 6c 64 6e  patt1' OR fieldn
3580: 61 6d 65 20 0a 28 64 65 66 69 6e 65 20 28 64 62  ame .(define (db
3590: 3a 70 61 74 74 2d 3e 6c 69 6b 65 20 66 69 65 6c  :patt->like fiel
35a0: 64 6e 61 6d 65 20 70 61 74 74 73 74 72 20 23 21  dname pattstr #!
35b0: 6b 65 79 20 28 63 6f 6d 70 61 72 61 74 6f 72 20  key (comparator 
35c0: 22 20 4f 52 20 22 29 29 0a 20 20 28 6c 65 74 20  " OR ")).  (let 
35d0: 28 28 70 61 74 74 73 20 28 69 66 20 28 73 74 72  ((patts (if (str
35e0: 69 6e 67 3f 20 70 61 74 74 73 74 72 29 0a 09 09  ing? pattstr)...
35f0: 20 20 20 28 73 74 72 69 6e 67 2d 73 70 6c 69 74     (string-split
3600: 20 70 61 74 74 73 74 72 20 22 2c 22 29 0a 09 09   pattstr ",")...
3610: 20 20 20 27 28 22 25 22 29 29 29 29 0a 20 20 20     '("%")))).   
3620: 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70   (string-intersp
3630: 65 72 73 65 20 28 6d 61 70 20 28 6c 61 6d 62 64  erse (map (lambd
3640: 61 20 28 70 61 74 74 29 0a 09 09 09 20 20 20 20  a (patt)....    
3650: 20 20 20 28 63 6f 6e 63 20 66 69 65 6c 64 6e 61     (conc fieldna
3660: 6d 65 20 22 20 4c 49 4b 45 20 27 22 20 70 61 74  me " LIKE '" pat
3670: 74 20 22 27 22 29 29 0a 09 09 09 20 20 20 20 20  t "'"))....     
3680: 28 69 66 20 28 6e 75 6c 6c 3f 20 70 61 74 74 73  (if (null? patts
3690: 29 0a 09 09 09 09 20 27 28 22 22 29 0a 09 09 09  )..... '("")....
36a0: 09 20 70 61 74 74 73 29 29 0a 09 09 09 63 6f 6d  . patts))....com
36b0: 70 61 72 61 74 6f 72 29 29 29 0a 0a 3b 3b 20 72  parator)))..;; r
36c0: 65 70 6c 61 63 65 20 68 65 61 64 65 72 20 61 6e  eplace header an
36d0: 64 20 6b 65 79 73 74 72 20 77 69 74 68 20 61 20  d keystr with a 
36e0: 63 61 6c 6c 20 74 6f 20 72 75 6e 73 3a 67 65 74  call to runs:get
36f0: 2d 73 74 64 2d 72 75 6e 2d 66 69 65 6c 64 73 0a  -std-run-fields.
3700: 3b 3b 0a 3b 3b 20 6b 65 79 70 61 74 74 73 3a 20  ;;.;; keypatts: 
3710: 28 20 28 4b 45 59 31 20 22 61 62 63 25 64 65 66  ( (KEY1 "abc%def
3720: 22 29 28 4b 45 59 32 20 22 25 22 29 20 29 0a 3b  ")(KEY2 "%") ).;
3730: 3b 20 72 75 6e 70 61 74 74 73 3a 20 70 61 74 74  ; runpatts: patt
3740: 31 2c 70 61 74 74 32 20 2e 2e 2e 0a 3b 3b 0a 28  1,patt2 ....;;.(
3750: 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 72  define (db:get-r
3760: 75 6e 73 20 64 62 20 72 75 6e 70 61 74 74 20 63  uns db runpatt c
3770: 6f 75 6e 74 20 6f 66 66 73 65 74 20 6b 65 79 70  ount offset keyp
3780: 61 74 74 73 29 0a 20 20 28 6c 65 74 2a 20 28 28  atts).  (let* ((
3790: 72 65 73 20 20 20 20 20 20 20 27 28 29 29 0a 09  res       '())..
37a0: 20 28 6b 65 79 73 20 20 20 20 20 20 20 28 64 62   (keys       (db
37b0: 3a 67 65 74 2d 6b 65 79 73 20 64 62 29 29 0a 09  :get-keys db))..
37c0: 20 28 72 75 6e 70 61 74 74 73 74 72 20 28 64 62   (runpattstr (db
37d0: 3a 70 61 74 74 2d 3e 6c 69 6b 65 20 22 72 75 6e  :patt->like "run
37e0: 6e 61 6d 65 22 20 72 75 6e 70 61 74 74 29 29 0a  name" runpatt)).
37f0: 09 20 28 72 65 6d 66 69 65 6c 64 73 20 20 28 6c  . (remfields  (l
3800: 69 73 74 20 22 69 64 22 20 22 72 75 6e 6e 61 6d  ist "id" "runnam
3810: 65 22 20 22 73 74 61 74 65 22 20 22 73 74 61 74  e" "state" "stat
3820: 75 73 22 20 22 6f 77 6e 65 72 22 20 22 65 76 65  us" "owner" "eve
3830: 6e 74 5f 74 69 6d 65 22 29 29 0a 09 20 28 68 65  nt_time")).. (he
3840: 61 64 65 72 20 20 20 20 20 28 61 70 70 65 6e 64  ader     (append
3850: 20 28 6d 61 70 20 6b 65 79 3a 67 65 74 2d 66 69   (map key:get-fi
3860: 65 6c 64 6e 61 6d 65 20 6b 65 79 73 29 0a 09 09  eldname keys)...
3870: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6d               rem
3880: 66 69 65 6c 64 73 29 29 0a 09 20 28 6b 65 79 73  fields)).. (keys
3890: 74 72 20 20 20 20 20 28 63 6f 6e 63 20 28 6b 65  tr     (conc (ke
38a0: 79 73 2d 3e 6b 65 79 73 74 72 20 6b 65 79 73 29  ys->keystr keys)
38b0: 20 22 2c 22 0a 09 09 20 20 20 20 20 20 20 20 20   ","...         
38c0: 20 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73    (string-inters
38d0: 70 65 72 73 65 20 72 65 6d 66 69 65 6c 64 73 20  perse remfields 
38e0: 22 2c 22 29 29 29 0a 09 20 28 71 72 79 73 74 72  ","))).. (qrystr
38f0: 20 20 20 20 20 28 63 6f 6e 63 20 22 53 45 4c 45       (conc "SELE
3900: 43 54 20 22 20 6b 65 79 73 74 72 20 22 20 46 52  CT " keystr " FR
3910: 4f 4d 20 72 75 6e 73 20 57 48 45 52 45 20 28 22  OM runs WHERE ("
3920: 20 72 75 6e 70 61 74 74 73 74 72 20 22 29 20 22   runpattstr ") "
3930: 20 3b 3b 20 72 75 6e 6e 61 6d 65 20 4c 49 4b 45   ;; runname LIKE
3940: 20 3f 20 22 0a 09 09 20 20 20 20 20 20 20 20 20   ? "...         
3950: 20 20 3b 3b 20 47 65 6e 65 72 61 74 65 3a 20 22    ;; Generate: "
3960: 20 41 4e 44 20 78 20 4c 49 4b 45 20 27 6b 65 79   AND x LIKE 'key
3970: 70 61 74 74 27 20 2e 2e 2e 22 0a 09 09 20 20 20  patt' ..."...   
3980: 20 20 20 20 20 20 20 20 28 69 66 20 28 6e 75 6c          (if (nul
3990: 6c 3f 20 6b 65 79 70 61 74 74 73 29 20 22 22 0a  l? keypatts) "".
39a0: 09 09 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
39b0: 20 28 63 6f 6e 63 20 22 20 41 4e 44 20 22 0a 09   (conc " AND "..
39c0: 09 20 20 20 20 20 20 20 20 20 09 20 20 20 20 28  .         .    (
39d0: 73 74 72 69 6e 67 2d 6a 6f 69 6e 20 0a 09 09 20  string-join ... 
39e0: 20 20 20 20 20 20 20 20 09 20 20 20 20 20 28 6d          .     (m
39f0: 61 70 20 28 6c 61 6d 62 64 61 20 28 6b 65 79 70  ap (lambda (keyp
3a00: 61 74 74 29 0a 09 09 20 20 20 20 20 20 20 20 20  att)...         
3a10: 09 09 20 20 20 20 28 6c 65 74 20 28 28 6b 65 79  ..    (let ((key
3a20: 20 20 28 63 61 72 20 6b 65 79 70 61 74 74 29 29    (car keypatt))
3a30: 0a 09 09 20 20 20 20 20 20 20 20 20 09 09 09 20  ...         ... 
3a40: 20 28 70 61 74 74 20 28 63 61 64 72 20 6b 65 79   (patt (cadr key
3a50: 70 61 74 74 29 29 29 0a 09 09 20 20 20 20 20 20  patt)))...      
3a60: 20 20 20 09 09 20 20 20 20 20 20 28 64 62 3a 70     ..      (db:p
3a70: 61 74 74 2d 3e 6c 69 6b 65 20 6b 65 79 20 70 61  att->like key pa
3a80: 74 74 29 29 29 0a 09 09 20 20 20 20 20 20 20 20  tt)))...        
3a90: 20 09 09 20 20 6b 65 79 70 61 74 74 73 29 0a 09   ..  keypatts)..
3aa0: 09 20 20 20 20 20 20 20 20 20 09 20 20 20 20 20  .         .     
3ab0: 22 20 41 4e 44 20 22 29 29 29 0a 09 09 20 20 20  " AND ")))...   
3ac0: 20 20 20 20 20 20 20 20 22 20 4f 52 44 45 52 20          " ORDER 
3ad0: 42 59 20 65 76 65 6e 74 5f 74 69 6d 65 20 44 45  BY event_time DE
3ae0: 53 43 20 22 0a 09 09 20 20 20 20 20 20 20 20 20  SC "...         
3af0: 20 20 28 69 66 20 28 6e 75 6d 62 65 72 3f 20 63    (if (number? c
3b00: 6f 75 6e 74 29 0a 09 09 20 20 20 20 20 20 20 20  ount)...        
3b10: 20 20 20 20 20 20 20 28 63 6f 6e 63 20 22 20 4c         (conc " L
3b20: 49 4d 49 54 20 22 20 63 6f 75 6e 74 29 0a 09 09  IMIT " count)...
3b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
3b40: 22 29 0a 09 09 20 20 20 20 20 20 20 20 20 20 20  ")...           
3b50: 28 69 66 20 28 6e 75 6d 62 65 72 3f 20 6f 66 66  (if (number? off
3b60: 73 65 74 29 0a 09 09 20 20 20 20 20 20 20 20 20  set)...         
3b70: 20 20 20 20 20 20 28 63 6f 6e 63 20 22 20 4f 46        (conc " OF
3b80: 46 53 45 54 20 22 20 6f 66 66 73 65 74 29 0a 09  FSET " offset)..
3b90: 09 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3ba0: 22 22 29 29 29 29 0a 20 20 20 20 28 64 65 62 75  "")))).    (debu
3bb0: 67 3a 70 72 69 6e 74 20 38 20 22 49 4e 46 4f 3a  g:print 8 "INFO:
3bc0: 20 64 62 3a 67 65 74 2d 72 75 6e 73 20 71 72 79   db:get-runs qry
3bd0: 73 74 72 3a 20 22 20 71 72 79 73 74 72 20 22 5c  str: " qrystr "\
3be0: 6e 6b 65 79 70 61 74 74 73 3a 20 22 20 6b 65 79  nkeypatts: " key
3bf0: 70 61 74 74 73 20 22 5c 6e 20 20 6f 66 66 73 65  patts "\n  offse
3c00: 74 3a 20 22 20 6f 66 66 73 65 74 20 22 20 6c 69  t: " offset " li
3c10: 6d 69 74 3a 20 22 20 63 6f 75 6e 74 29 0a 20 20  mit: " count).  
3c20: 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65    (sqlite3:for-e
3c30: 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61  ach-row.     (la
3c40: 6d 62 64 61 20 28 61 20 2e 20 78 29 0a 20 20 20  mbda (a . x).   
3c50: 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28 63      (set! res (c
3c60: 6f 6e 73 20 28 61 70 70 6c 79 20 76 65 63 74 6f  ons (apply vecto
3c70: 72 20 61 20 78 29 20 72 65 73 29 29 29 0a 20 20  r a x) res))).  
3c80: 20 20 20 64 62 0a 20 20 20 20 20 71 72 79 73 74     db.     qryst
3c90: 72 0a 20 20 20 20 20 29 0a 20 20 20 20 28 76 65  r.     ).    (ve
3ca0: 63 74 6f 72 20 68 65 61 64 65 72 20 72 65 73 29  ctor header res)
3cb0: 29 29 0a 0a 3b 3b 20 6a 75 73 74 20 67 65 74 20  ))..;; just get 
3cc0: 63 6f 75 6e 74 20 6f 66 20 72 75 6e 73 0a 28 64  count of runs.(d
3cd0: 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 6e 75  efine (db:get-nu
3ce0: 6d 2d 72 75 6e 73 20 64 62 20 72 75 6e 70 61 74  m-runs db runpat
3cf0: 74 29 0a 20 20 28 6c 65 74 20 28 28 6e 75 6d 72  t).  (let ((numr
3d00: 75 6e 73 20 30 29 29 0a 20 20 20 20 28 73 71 6c  uns 0)).    (sql
3d10: 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f  ite3:for-each-ro
3d20: 77 20 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20  w .     (lambda 
3d30: 28 63 6f 75 6e 74 29 0a 20 20 20 20 20 20 20 28  (count).       (
3d40: 73 65 74 21 20 6e 75 6d 72 75 6e 73 20 63 6f 75  set! numruns cou
3d50: 6e 74 29 29 0a 20 20 20 20 20 64 62 0a 20 20 20  nt)).     db.   
3d60: 20 20 22 53 45 4c 45 43 54 20 43 4f 55 4e 54 28    "SELECT COUNT(
3d70: 69 64 29 20 46 52 4f 4d 20 72 75 6e 73 20 57 48  id) FROM runs WH
3d80: 45 52 45 20 72 75 6e 6e 61 6d 65 20 4c 49 4b 45  ERE runname LIKE
3d90: 20 3f 3b 22 20 72 75 6e 70 61 74 74 29 0a 20 20   ?;" runpatt).  
3da0: 20 20 6e 75 6d 72 75 6e 73 29 29 0a 0a 3b 3b 20    numruns))..;; 
3db0: 75 73 65 20 28 67 65 74 2d 76 61 6c 75 65 2d 62  use (get-value-b
3dc0: 79 2d 68 65 61 64 65 72 20 28 64 62 3a 67 65 74  y-header (db:get
3dd0: 2d 68 65 61 64 65 72 20 72 75 6e 69 6e 66 6f 29  -header runinfo)
3de0: 28 64 62 3a 67 65 74 2d 72 6f 77 20 72 75 6e 69  (db:get-row runi
3df0: 6e 66 6f 29 29 0a 28 64 65 66 69 6e 65 20 28 64  nfo)).(define (d
3e00: 62 3a 67 65 74 2d 72 75 6e 2d 69 6e 66 6f 20 64  b:get-run-info d
3e10: 62 20 72 75 6e 2d 69 64 29 0a 20 20 28 69 66 20  b run-id).  (if 
3e20: 28 68 61 73 68 2d 74 61 62 6c 65 2d 72 65 66 2f  (hash-table-ref/
3e30: 64 65 66 61 75 6c 74 20 2a 72 75 6e 2d 69 6e 66  default *run-inf
3e40: 6f 2d 63 61 63 68 65 2a 20 72 75 6e 2d 69 64 20  o-cache* run-id 
3e50: 23 66 29 0a 20 20 20 20 20 20 28 68 61 73 68 2d  #f).      (hash-
3e60: 74 61 62 6c 65 2d 72 65 66 20 2a 72 75 6e 2d 69  table-ref *run-i
3e70: 6e 66 6f 2d 63 61 63 68 65 2a 20 72 75 6e 2d 69  nfo-cache* run-i
3e80: 64 29 0a 20 20 20 20 20 20 28 6c 65 74 2a 20 28  d).      (let* (
3e90: 28 72 65 73 20 20 20 20 20 20 23 66 29 0a 09 20  (res      #f).. 
3ea0: 20 20 20 20 28 6b 65 79 73 20 20 20 20 20 20 28      (keys      (
3eb0: 64 62 3a 67 65 74 2d 6b 65 79 73 20 64 62 29 29  db:get-keys db))
3ec0: 0a 09 20 20 20 20 20 28 72 65 6d 66 69 65 6c 64  ..     (remfield
3ed0: 73 20 28 6c 69 73 74 20 22 69 64 22 20 22 72 75  s (list "id" "ru
3ee0: 6e 6e 61 6d 65 22 20 22 73 74 61 74 65 22 20 22  nname" "state" "
3ef0: 73 74 61 74 75 73 22 20 22 6f 77 6e 65 72 22 20  status" "owner" 
3f00: 22 65 76 65 6e 74 5f 74 69 6d 65 22 29 29 0a 09  "event_time"))..
3f10: 20 20 20 20 20 28 68 65 61 64 65 72 20 20 20 20       (header    
3f20: 28 61 70 70 65 6e 64 20 28 6d 61 70 20 6b 65 79  (append (map key
3f30: 3a 67 65 74 2d 66 69 65 6c 64 6e 61 6d 65 20 6b  :get-fieldname k
3f40: 65 79 73 29 0a 09 09 09 09 72 65 6d 66 69 65 6c  eys).....remfiel
3f50: 64 73 29 29 0a 09 20 20 20 20 20 28 6b 65 79 73  ds))..     (keys
3f60: 74 72 20 20 20 20 28 63 6f 6e 63 20 28 6b 65 79  tr    (conc (key
3f70: 73 2d 3e 6b 65 79 73 74 72 20 6b 65 79 73 29 20  s->keystr keys) 
3f80: 22 2c 22 0a 09 09 09 20 20 20 20 20 20 28 73 74  ","....      (st
3f90: 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65  ring-intersperse
3fa0: 20 72 65 6d 66 69 65 6c 64 73 20 22 2c 22 29 29   remfields ","))
3fb0: 29 29 0a 09 3b 3b 20 28 64 65 62 75 67 3a 70 72  ))..;; (debug:pr
3fc0: 69 6e 74 20 30 20 22 64 62 3a 67 65 74 2d 72 75  int 0 "db:get-ru
3fd0: 6e 2d 69 6e 66 6f 20 72 75 6e 2d 69 64 3a 20 22  n-info run-id: "
3fe0: 20 72 75 6e 2d 69 64 20 22 20 68 65 61 64 65 72   run-id " header
3ff0: 3a 20 22 20 68 65 61 64 65 72 20 22 20 6b 65 79  : " header " key
4000: 73 74 72 3a 20 22 20 6b 65 79 73 74 72 29 0a 09  str: " keystr)..
4010: 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63  (sqlite3:for-eac
4020: 68 2d 72 6f 77 0a 09 20 28 6c 61 6d 62 64 61 20  h-row.. (lambda 
4030: 28 61 20 2e 20 78 29 0a 09 20 20 20 28 73 65 74  (a . x)..   (set
4040: 21 20 72 65 73 20 28 61 70 70 6c 79 20 76 65 63  ! res (apply vec
4050: 74 6f 72 20 61 20 78 29 29 29 0a 09 20 64 62 0a  tor a x))).. db.
4060: 09 20 28 63 6f 6e 63 20 22 53 45 4c 45 43 54 20  . (conc "SELECT 
4070: 22 20 6b 65 79 73 74 72 20 22 20 46 52 4f 4d 20  " keystr " FROM 
4080: 72 75 6e 73 20 57 48 45 52 45 20 69 64 3d 3f 3b  runs WHERE id=?;
4090: 22 29 0a 09 20 72 75 6e 2d 69 64 29 0a 09 28 6c  ").. run-id)..(l
40a0: 65 74 20 28 28 66 69 6e 61 6c 72 65 73 20 28 76  et ((finalres (v
40b0: 65 63 74 6f 72 20 68 65 61 64 65 72 20 72 65 73  ector header res
40c0: 29 29 29 0a 09 20 20 28 68 61 73 68 2d 74 61 62  )))..  (hash-tab
40d0: 6c 65 2d 73 65 74 21 20 2a 72 75 6e 2d 69 6e 66  le-set! *run-inf
40e0: 6f 2d 63 61 63 68 65 2a 20 72 75 6e 2d 69 64 20  o-cache* run-id 
40f0: 66 69 6e 61 6c 72 65 73 29 0a 09 20 20 66 69 6e  finalres)..  fin
4100: 61 6c 72 65 73 29 29 29 29 0a 20 20 0a 28 64 65  alres)))).  .(de
4110: 66 69 6e 65 20 28 64 62 3a 73 65 74 2d 63 6f 6d  fine (db:set-com
4120: 6d 65 6e 74 2d 66 6f 72 2d 72 75 6e 20 64 62 20  ment-for-run db 
4130: 72 75 6e 2d 69 64 20 63 6f 6d 6d 65 6e 74 29 0a  run-id comment).
4140: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
4150: 74 65 20 64 62 20 22 55 50 44 41 54 45 20 72 75  te db "UPDATE ru
4160: 6e 73 20 53 45 54 20 63 6f 6d 6d 65 6e 74 3d 3f  ns SET comment=?
4170: 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 63 6f   WHERE id=?;" co
4180: 6d 6d 65 6e 74 20 72 75 6e 2d 69 64 29 29 0a 0a  mment run-id))..
4190: 3b 3b 20 64 6f 65 73 20 6e 6f 74 20 28 6f 62 76  ;; does not (obv
41a0: 69 6f 75 73 6c 79 21 29 20 72 65 6d 6f 76 65 64  iously!) removed
41b0: 20 64 65 70 65 6e 64 65 6e 74 20 64 61 74 61 2e   dependent data.
41c0: 20 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 64 65   .(define (db:de
41d0: 6c 65 74 65 2d 72 75 6e 20 64 62 20 72 75 6e 2d  lete-run db run-
41e0: 69 64 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65  id).  (sqlite3:e
41f0: 78 65 63 75 74 65 20 64 62 20 22 44 45 4c 45 54  xecute db "DELET
4200: 45 20 46 52 4f 4d 20 72 75 6e 73 20 57 48 45 52  E FROM runs WHER
4210: 45 20 69 64 3d 3f 3b 22 20 72 75 6e 2d 69 64 29  E id=?;" run-id)
4220: 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 75  )..(define (db:u
4230: 70 64 61 74 65 2d 72 75 6e 2d 65 76 65 6e 74 5f  pdate-run-event_
4240: 74 69 6d 65 20 64 62 20 72 75 6e 2d 69 64 29 0a  time db run-id).
4250: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
4260: 74 65 20 64 62 20 22 55 50 44 41 54 45 20 72 75  te db "UPDATE ru
4270: 6e 73 20 53 45 54 20 65 76 65 6e 74 5f 74 69 6d  ns SET event_tim
4280: 65 3d 73 74 72 66 74 69 6d 65 28 27 25 73 27 2c  e=strftime('%s',
4290: 27 6e 6f 77 27 29 20 57 48 45 52 45 20 69 64 3d  'now') WHERE id=
42a0: 3f 3b 22 20 72 75 6e 2d 69 64 29 29 20 0a 0a 28  ?;" run-id)) ..(
42b0: 64 65 66 69 6e 65 20 28 64 62 3a 6c 6f 63 6b 2f  define (db:lock/
42c0: 75 6e 6c 6f 63 6b 2d 72 75 6e 20 64 62 20 72 75  unlock-run db ru
42d0: 6e 2d 69 64 20 6c 6f 63 6b 20 75 6e 6c 6f 63 6b  n-id lock unlock
42e0: 20 75 73 65 72 29 0a 20 20 28 6c 65 74 20 28 28   user).  (let ((
42f0: 6e 65 77 6c 6f 63 6b 76 61 6c 20 28 69 66 20 6c  newlockval (if l
4300: 6f 63 6b 20 22 6c 6f 63 6b 65 64 22 0a 09 09 09  ock "locked"....
4310: 28 69 66 20 75 6e 6c 6f 63 6b 0a 09 09 09 20 20  (if unlock....  
4320: 20 20 22 75 6e 6c 6f 63 6b 65 64 22 0a 09 09 09    "unlocked"....
4330: 20 20 20 20 22 6c 6f 63 6b 65 64 22 29 29 29 29      "locked"))))
4340: 20 3b 3b 20 73 65 6d 69 2d 66 61 69 6c 73 61 66   ;; semi-failsaf
4350: 65 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65  e.    (sqlite3:e
4360: 78 65 63 75 74 65 20 64 62 20 22 55 50 44 41 54  xecute db "UPDAT
4370: 45 20 72 75 6e 73 20 53 45 54 20 73 74 61 74 65  E runs SET state
4380: 3d 3f 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20  =? WHERE id=?;" 
4390: 6e 65 77 6c 6f 63 6b 76 61 6c 20 72 75 6e 2d 69  newlockval run-i
43a0: 64 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a  d).    (sqlite3:
43b0: 65 78 65 63 75 74 65 20 64 62 20 22 49 4e 53 45  execute db "INSE
43c0: 52 54 20 49 4e 54 4f 20 61 63 63 65 73 73 5f 6c  RT INTO access_l
43d0: 6f 67 20 28 75 73 65 72 2c 61 63 63 65 73 73 65  og (user,accesse
43e0: 64 2c 61 72 67 73 29 20 56 41 4c 55 45 53 28 3f  d,args) VALUES(?
43f0: 2c 73 74 72 66 74 69 6d 65 28 27 25 73 27 2c 27  ,strftime('%s','
4400: 6e 6f 77 27 29 2c 3f 29 3b 22 0a 09 09 20 20 20  now'),?);"...   
4410: 20 20 75 73 65 72 20 28 63 6f 6e 63 20 6e 65 77    user (conc new
4420: 6c 6f 63 6b 76 61 6c 20 22 20 22 20 72 75 6e 2d  lockval " " run-
4430: 69 64 29 29 0a 20 20 20 20 28 64 65 62 75 67 3a  id)).    (debug:
4440: 70 72 69 6e 74 20 31 20 22 49 4e 46 4f 3a 20 22  print 1 "INFO: "
4450: 20 6e 65 77 6c 6f 63 6b 76 61 6c 20 22 20 72 75   newlockval " ru
4460: 6e 20 6e 75 6d 62 65 72 20 22 20 72 75 6e 2d 69  n number " run-i
4470: 64 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d  d)))..;;========
4480: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4490: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
44a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
44b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b  ==============.;
44c0: 3b 20 4b 20 45 20 59 20 53 0a 3b 3b 3d 3d 3d 3d  ; K E Y S.;;====
44d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
44e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
44f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4500: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4510: 3d 3d 0a 0a 3b 3b 20 67 65 74 20 6b 65 79 20 76  ==..;; get key v
4520: 61 6c 20 70 61 69 72 73 20 66 6f 72 20 61 20 67  al pairs for a g
4530: 69 76 65 6e 20 72 75 6e 2d 69 64 0a 3b 3b 20 28  iven run-id.;; (
4540: 20 28 46 49 45 4c 44 4e 41 4d 45 31 20 6b 65 79   (FIELDNAME1 key
4550: 76 61 6c 31 29 20 28 46 49 45 4c 44 4e 41 4d 45  val1) (FIELDNAME
4560: 32 20 6b 65 79 76 61 6c 32 29 20 2e 2e 2e 20 29  2 keyval2) ... )
4570: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74  .(define (db:get
4580: 2d 6b 65 79 2d 76 61 6c 2d 70 61 69 72 73 20 64  -key-val-pairs d
4590: 62 20 72 75 6e 2d 69 64 29 0a 20 20 28 6c 65 74  b run-id).  (let
45a0: 2a 20 28 28 6b 65 79 73 20 28 67 65 74 2d 6b 65  * ((keys (get-ke
45b0: 79 73 20 64 62 29 29 0a 09 20 28 72 65 73 20 20  ys db)).. (res  
45c0: 27 28 29 29 29 0a 20 20 20 20 28 64 65 62 75 67  '())).    (debug
45d0: 3a 70 72 69 6e 74 20 36 20 22 6b 65 79 73 3a 20  :print 6 "keys: 
45e0: 22 20 6b 65 79 73 20 22 20 72 75 6e 2d 69 64 3a  " keys " run-id:
45f0: 20 22 20 72 75 6e 2d 69 64 29 0a 20 20 20 20 28   " run-id).    (
4600: 66 6f 72 2d 65 61 63 68 20 0a 20 20 20 20 20 28  for-each .     (
4610: 6c 61 6d 62 64 61 20 28 6b 65 79 29 0a 20 20 20  lambda (key).   
4620: 20 20 20 20 28 6c 65 74 20 28 28 71 72 79 20 28      (let ((qry (
4630: 63 6f 6e 63 20 22 53 45 4c 45 43 54 20 22 20 28  conc "SELECT " (
4640: 6b 65 79 3a 67 65 74 2d 66 69 65 6c 64 6e 61 6d  key:get-fieldnam
4650: 65 20 6b 65 79 29 20 22 20 46 52 4f 4d 20 72 75  e key) " FROM ru
4660: 6e 73 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 29  ns WHERE id=?;")
4670: 29 29 0a 09 20 3b 3b 20 28 64 65 62 75 67 3a 70  )).. ;; (debug:p
4680: 72 69 6e 74 20 30 20 22 71 72 79 3a 20 22 20 71  rint 0 "qry: " q
4690: 72 79 29 0a 09 20 28 73 71 6c 69 74 65 33 3a 66  ry).. (sqlite3:f
46a0: 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 09 20 20  or-each-row ..  
46b0: 28 6c 61 6d 62 64 61 20 28 6b 65 79 2d 76 61 6c  (lambda (key-val
46c0: 29 0a 09 20 20 20 20 28 73 65 74 21 20 72 65 73  )..    (set! res
46d0: 20 28 63 6f 6e 73 20 28 6c 69 73 74 20 28 6b 65   (cons (list (ke
46e0: 79 3a 67 65 74 2d 66 69 65 6c 64 6e 61 6d 65 20  y:get-fieldname 
46f0: 6b 65 79 29 20 6b 65 79 2d 76 61 6c 29 20 72 65  key) key-val) re
4700: 73 29 29 29 0a 09 20 20 64 62 20 71 72 79 20 72  s)))..  db qry r
4710: 75 6e 2d 69 64 29 29 29 0a 20 20 20 20 20 6b 65  un-id))).     ke
4720: 79 73 29 0a 20 20 20 20 28 72 65 76 65 72 73 65  ys).    (reverse
4730: 20 72 65 73 29 29 29 0a 0a 3b 3b 20 67 65 74 20   res)))..;; get 
4740: 6b 65 79 20 76 61 6c 73 20 66 6f 72 20 61 20 67  key vals for a g
4750: 69 76 65 6e 20 72 75 6e 2d 69 64 0a 28 64 65 66  iven run-id.(def
4760: 69 6e 65 20 28 64 62 3a 67 65 74 2d 6b 65 79 2d  ine (db:get-key-
4770: 76 61 6c 73 20 64 62 20 72 75 6e 2d 69 64 29 0a  vals db run-id).
4780: 20 20 28 6c 65 74 2a 20 28 28 6b 65 79 73 20 28    (let* ((keys (
4790: 67 65 74 2d 6b 65 79 73 20 64 62 29 29 0a 09 20  get-keys db)).. 
47a0: 28 72 65 73 20 20 27 28 29 29 29 0a 20 20 20 20  (res  '())).    
47b0: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 36 20 22  (debug:print 6 "
47c0: 6b 65 79 73 3a 20 22 20 6b 65 79 73 20 22 20 72  keys: " keys " r
47d0: 75 6e 2d 69 64 3a 20 22 20 72 75 6e 2d 69 64 29  un-id: " run-id)
47e0: 0a 20 20 20 20 28 66 6f 72 2d 65 61 63 68 20 0a  .    (for-each .
47f0: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 6b 65       (lambda (ke
4800: 79 29 0a 20 20 20 20 20 20 20 28 6c 65 74 20 28  y).       (let (
4810: 28 71 72 79 20 28 63 6f 6e 63 20 22 53 45 4c 45  (qry (conc "SELE
4820: 43 54 20 22 20 28 6b 65 79 3a 67 65 74 2d 66 69  CT " (key:get-fi
4830: 65 6c 64 6e 61 6d 65 20 6b 65 79 29 20 22 20 46  eldname key) " F
4840: 52 4f 4d 20 72 75 6e 73 20 57 48 45 52 45 20 69  ROM runs WHERE i
4850: 64 3d 3f 3b 22 29 29 29 0a 09 20 3b 3b 20 28 64  d=?;"))).. ;; (d
4860: 65 62 75 67 3a 70 72 69 6e 74 20 30 20 22 71 72  ebug:print 0 "qr
4870: 79 3a 20 22 20 71 72 79 29 0a 09 20 28 73 71 6c  y: " qry).. (sql
4880: 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f  ite3:for-each-ro
4890: 77 20 0a 09 20 20 28 6c 61 6d 62 64 61 20 28 6b  w ..  (lambda (k
48a0: 65 79 2d 76 61 6c 29 0a 09 20 20 20 20 28 73 65  ey-val)..    (se
48b0: 74 21 20 72 65 73 20 28 63 6f 6e 73 20 6b 65 79  t! res (cons key
48c0: 2d 76 61 6c 20 72 65 73 29 29 29 0a 09 20 20 64  -val res)))..  d
48d0: 62 20 71 72 79 20 72 75 6e 2d 69 64 29 29 29 0a  b qry run-id))).
48e0: 20 20 20 20 20 6b 65 79 73 29 0a 20 20 20 20 28       keys).    (
48f0: 72 65 76 65 72 73 65 20 72 65 73 29 29 29 0a 0a  reverse res)))..
4900: 3b 3b 20 54 68 65 20 74 61 72 67 65 74 20 69 73  ;; The target is
4910: 20 6b 65 79 76 61 6c 31 2f 6b 65 79 76 61 6c 32   keyval1/keyval2
4920: 2e 2e 2e 2c 20 63 61 63 68 65 64 20 69 6e 20 2a  ..., cached in *
4930: 74 61 72 67 65 74 2a 20 61 73 20 69 74 20 69 73  target* as it is
4940: 20 75 73 65 64 20 6f 66 74 65 6e 0a 28 64 65 66   used often.(def
4950: 69 6e 65 20 28 64 62 3a 67 65 74 2d 74 61 72 67  ine (db:get-targ
4960: 65 74 20 64 62 20 72 75 6e 2d 69 64 29 0a 20 20  et db run-id).  
4970: 28 69 66 20 2a 74 61 72 67 65 74 2a 0a 20 20 20  (if *target*.   
4980: 20 20 20 2a 74 61 72 67 65 74 2a 0a 20 20 20 20     *target*.    
4990: 20 20 28 6c 65 74 2a 20 28 28 6b 65 79 76 61 6c    (let* ((keyval
49a0: 73 20 28 72 64 62 3a 67 65 74 2d 6b 65 79 2d 76  s (rdb:get-key-v
49b0: 61 6c 73 20 64 62 20 72 75 6e 2d 69 64 29 29 0a  als db run-id)).
49c0: 09 20 20 20 20 20 28 74 68 65 6b 65 79 20 20 28  .     (thekey  (
49d0: 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72  string-intersper
49e0: 73 65 20 28 6d 61 70 20 28 6c 61 6d 62 64 61 20  se (map (lambda 
49f0: 28 78 29 28 69 66 20 78 20 78 20 22 2d 6e 61 2d  (x)(if x x "-na-
4a00: 22 29 29 20 6b 65 79 76 61 6c 73 29 20 22 2f 22  ")) keyvals) "/"
4a10: 29 29 29 0a 09 28 73 65 74 21 20 2a 74 61 72 67  )))..(set! *targ
4a20: 65 74 2a 20 74 68 65 6b 65 79 29 0a 09 74 68 65  et* thekey)..the
4a30: 6b 65 79 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d  key)))..;;======
4a40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4a50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4a60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4a70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4a80: 0a 3b 3b 20 20 54 20 45 20 53 20 54 20 53 0a 3b  .;;  T E S T S.;
4a90: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;===============
4aa0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4ab0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4ac0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4ad0: 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 73 74 61 74  =======..;; stat
4ae0: 65 73 20 61 6e 64 20 73 74 61 74 75 73 65 73 20  es and statuses 
4af0: 61 72 65 20 6c 69 73 74 73 2c 20 74 75 72 6e 20  are lists, turn 
4b00: 74 68 65 6d 20 69 6e 74 6f 20 28 22 50 41 53 53  them into ("PASS
4b10: 22 2c 22 46 41 49 4c 22 2e 2e 2e 29 20 61 6e 64  ","FAIL"...) and
4b20: 20 75 73 65 20 4e 4f 54 20 49 4e 0a 3b 3b 20 69   use NOT IN.;; i
4b30: 2e 65 2e 20 74 68 65 73 65 20 6c 69 73 74 73 20  .e. these lists 
4b40: 64 65 66 69 6e 65 20 77 68 61 74 20 74 6f 20 4e  define what to N
4b50: 4f 54 20 73 68 6f 77 2e 0a 3b 3b 20 73 74 61 74  OT show..;; stat
4b60: 65 73 20 61 6e 64 20 73 74 61 74 75 73 65 73 20  es and statuses 
4b70: 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20  are required to 
4b80: 62 65 20 6c 69 73 74 73 2c 20 65 6d 70 74 79 20  be lists, empty 
4b90: 69 73 20 6f 6b 0a 3b 3b 20 6e 6f 74 2d 69 6e 20  is ok.;; not-in 
4ba0: 23 74 20 3d 20 61 62 6f 76 65 20 62 65 68 61 76  #t = above behav
4bb0: 69 6f 75 72 2c 20 23 66 20 3d 20 6d 75 73 74 20  iour, #f = must 
4bc0: 6d 61 74 63 68 0a 28 64 65 66 69 6e 65 20 28 64  match.(define (d
4bd0: 62 3a 67 65 74 2d 74 65 73 74 73 2d 66 6f 72 2d  b:get-tests-for-
4be0: 72 75 6e 20 64 62 20 72 75 6e 2d 69 64 20 74 65  run db run-id te
4bf0: 73 74 70 61 74 74 20 69 74 65 6d 70 61 74 74 20  stpatt itempatt 
4c00: 73 74 61 74 65 73 20 73 74 61 74 75 73 65 73 20  states statuses 
4c10: 0a 09 09 09 20 20 20 20 20 20 23 21 6b 65 79 20  ....      #!key 
4c20: 28 6e 6f 74 2d 69 6e 20 23 74 29 0a 09 09 09 20  (not-in #t).... 
4c30: 20 20 20 20 20 28 73 6f 72 74 2d 62 79 20 23 66       (sort-by #f
4c40: 29 20 3b 3b 20 27 72 75 6e 64 69 72 20 27 65 76  ) ;; 'rundir 'ev
4c50: 65 6e 74 5f 74 69 6d 65 0a 09 09 09 20 20 20 20  ent_time....    
4c60: 20 20 29 0a 20 20 28 6c 65 74 2a 20 28 28 72 65    ).  (let* ((re
4c70: 73 20 27 28 29 29 0a 09 20 3b 3b 20 69 66 20 73  s '()).. ;; if s
4c80: 74 61 74 65 73 20 6f 72 20 73 74 61 74 75 73 65  tates or statuse
4c90: 73 20 61 72 65 20 6e 75 6c 6c 20 74 68 65 6e 20  s are null then 
4ca0: 61 73 73 75 6d 65 20 6d 61 74 63 68 20 61 6c 6c  assume match all
4cb0: 20 77 68 65 6e 20 6e 6f 74 2d 69 6e 20 69 73 20   when not-in is 
4cc0: 66 61 6c 73 65 0a 09 20 28 73 74 61 74 65 73 2d  false.. (states-
4cd0: 73 74 72 20 20 20 20 28 63 6f 6e 63 20 22 20 73  str    (conc " s
4ce0: 74 61 74 65 20 69 6e 20 28 27 22 20 28 73 74 72  tate in ('" (str
4cf0: 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20  ing-intersperse 
4d00: 73 74 61 74 65 73 20 20 20 22 27 2c 27 22 29 20  states   "','") 
4d10: 22 27 29 22 29 29 0a 09 20 28 73 74 61 74 75 73  "')")).. (status
4d20: 65 73 2d 73 74 72 20 20 28 63 6f 6e 63 20 22 20  es-str  (conc " 
4d30: 73 74 61 74 75 73 20 69 6e 20 28 27 22 20 28 73  status in ('" (s
4d40: 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73  tring-interspers
4d50: 65 20 73 74 61 74 75 73 65 73 20 22 27 2c 27 22  e statuses "','"
4d60: 29 20 22 27 29 22 29 29 0a 09 20 28 73 74 61 74  ) "')")).. (stat
4d70: 65 2d 73 74 61 74 75 73 2d 71 72 79 20 28 69 66  e-status-qry (if
4d80: 20 28 6f 72 20 28 6e 6f 74 20 28 6e 75 6c 6c 3f   (or (not (null?
4d90: 20 73 74 61 74 65 73 29 29 0a 09 09 09 09 20 20   states)).....  
4da0: 20 28 6e 6f 74 20 28 6e 75 6c 6c 3f 20 73 74 61   (not (null? sta
4db0: 74 65 73 29 29 29 0a 09 09 09 20 20 20 20 20 20  tes)))....      
4dc0: 20 28 63 6f 6e 63 20 22 20 41 4e 44 20 22 20 28   (conc " AND " (
4dd0: 69 66 20 6e 6f 74 2d 69 6e 20 22 4e 4f 54 22 20  if not-in "NOT" 
4de0: 22 22 29 20 22 20 28 22 20 73 74 61 74 65 73 2d  "") " (" states-
4df0: 73 74 72 20 22 20 41 4e 44 20 22 20 73 74 61 74  str " AND " stat
4e00: 75 73 65 73 2d 73 74 72 20 22 29 20 22 29 0a 09  uses-str ") ")..
4e10: 09 09 20 20 20 20 20 20 20 22 22 29 29 0a 09 20  ..       "")).. 
4e20: 28 71 72 79 20 20 20 20 20 20 28 63 6f 6e 63 20  (qry      (conc 
4e30: 22 53 45 4c 45 43 54 20 69 64 2c 72 75 6e 5f 69  "SELECT id,run_i
4e40: 64 2c 74 65 73 74 6e 61 6d 65 2c 73 74 61 74 65  d,testname,state
4e50: 2c 73 74 61 74 75 73 2c 65 76 65 6e 74 5f 74 69  ,status,event_ti
4e60: 6d 65 2c 68 6f 73 74 2c 63 70 75 6c 6f 61 64 2c  me,host,cpuload,
4e70: 64 69 73 6b 66 72 65 65 2c 75 6e 61 6d 65 2c 72  diskfree,uname,r
4e80: 75 6e 64 69 72 2c 69 74 65 6d 5f 70 61 74 68 2c  undir,item_path,
4e90: 72 75 6e 5f 64 75 72 61 74 69 6f 6e 2c 66 69 6e  run_duration,fin
4ea0: 61 6c 5f 6c 6f 67 66 2c 63 6f 6d 6d 65 6e 74 20  al_logf,comment 
4eb0: 22 0a 09 09 09 20 22 20 46 52 4f 4d 20 74 65 73  ".... " FROM tes
4ec0: 74 73 20 57 48 45 52 45 20 72 75 6e 5f 69 64 3d  ts WHERE run_id=
4ed0: 3f 20 41 4e 44 20 22 0a 09 09 09 20 3b 3b 20 74  ? AND ".... ;; t
4ee0: 65 73 74 6e 61 6d 65 20 6c 69 6b 65 20 3f 20 41  estname like ? A
4ef0: 4e 44 20 69 74 65 6d 5f 70 61 74 68 20 4c 49 4b  ND item_path LIK
4f00: 45 20 3f 20 22 20 0a 09 09 09 20 28 64 62 3a 70  E ? " .... (db:p
4f10: 61 74 74 2d 3e 6c 69 6b 65 20 22 74 65 73 74 6e  att->like "testn
4f20: 61 6d 65 22 20 74 65 73 74 70 61 74 74 29 20 22  ame" testpatt) "
4f30: 20 41 4e 44 20 22 0a 09 09 09 20 28 64 62 3a 70   AND ".... (db:p
4f40: 61 74 74 2d 3e 6c 69 6b 65 20 22 69 74 65 6d 5f  att->like "item_
4f50: 70 61 74 68 22 20 69 74 65 6d 70 61 74 74 29 0a  path" itempatt).
4f60: 09 09 09 20 73 74 61 74 65 2d 73 74 61 74 75 73  ... state-status
4f70: 2d 71 72 79 0a 09 09 09 20 28 63 61 73 65 20 73  -qry.... (case s
4f80: 6f 72 74 2d 62 79 0a 09 09 09 20 20 20 28 28 72  ort-by....   ((r
4f90: 75 6e 64 69 72 29 20 20 20 20 20 22 20 4f 52 44  undir)     " ORD
4fa0: 45 52 20 42 59 20 6c 65 6e 67 74 68 28 72 75 6e  ER BY length(run
4fb0: 64 69 72 29 20 44 45 53 43 3b 22 29 0a 09 09 09  dir) DESC;")....
4fc0: 20 20 20 28 28 65 76 65 6e 74 5f 74 69 6d 65 29     ((event_time)
4fd0: 20 22 20 4f 52 44 45 52 20 42 59 20 65 76 65 6e   " ORDER BY even
4fe0: 74 5f 74 69 6d 65 20 41 53 43 3b 22 29 0a 09 09  t_time ASC;")...
4ff0: 09 20 20 20 28 65 6c 73 65 20 20 20 20 20 20 20  .   (else       
5000: 20 20 22 3b 22 29 29 0a 09 09 09 20 29 29 29 0a    ";")).... ))).
5010: 20 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74      (debug:print
5020: 20 38 20 22 49 4e 46 4f 3a 20 64 62 3a 67 65 74   8 "INFO: db:get
5030: 2d 74 65 73 74 73 2d 66 6f 72 2d 72 75 6e 20 71  -tests-for-run q
5040: 72 79 3d 22 20 71 72 79 29 0a 20 20 20 20 28 73  ry=" qry).    (s
5050: 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d  qlite3:for-each-
5060: 72 6f 77 20 0a 20 20 20 20 20 28 6c 61 6d 62 64  row .     (lambd
5070: 61 20 28 61 20 2e 20 62 29 20 3b 3b 20 69 64 20  a (a . b) ;; id 
5080: 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20  run-id testname 
5090: 73 74 61 74 65 20 73 74 61 74 75 73 20 65 76 65  state status eve
50a0: 6e 74 2d 74 69 6d 65 20 68 6f 73 74 20 63 70 75  nt-time host cpu
50b0: 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20 75 6e  load diskfree un
50c0: 61 6d 65 20 72 75 6e 64 69 72 20 69 74 65 6d 2d  ame rundir item-
50d0: 70 61 74 68 20 72 75 6e 2d 64 75 72 61 74 69 6f  path run-duratio
50e0: 6e 20 66 69 6e 61 6c 2d 6c 6f 67 66 20 63 6f 6d  n final-logf com
50f0: 6d 65 6e 74 29 0a 20 20 20 20 20 20 20 28 73 65  ment).       (se
5100: 74 21 20 72 65 73 20 28 63 6f 6e 73 20 28 61 70  t! res (cons (ap
5110: 70 6c 79 20 76 65 63 74 6f 72 20 61 20 62 29 20  ply vector a b) 
5120: 72 65 73 29 29 29 20 3b 3b 20 69 64 20 72 75 6e  res))) ;; id run
5130: 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 73 74 61  -id testname sta
5140: 74 65 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d  te status event-
5150: 74 69 6d 65 20 68 6f 73 74 20 63 70 75 6c 6f 61  time host cpuloa
5160: 64 20 64 69 73 6b 66 72 65 65 20 75 6e 61 6d 65  d diskfree uname
5170: 20 72 75 6e 64 69 72 20 69 74 65 6d 2d 70 61 74   rundir item-pat
5180: 68 20 72 75 6e 2d 64 75 72 61 74 69 6f 6e 20 66  h run-duration f
5190: 69 6e 61 6c 2d 6c 6f 67 66 20 63 6f 6d 6d 65 6e  inal-logf commen
51a0: 74 29 20 72 65 73 29 29 29 0a 20 20 20 20 20 64  t) res))).     d
51b0: 62 20 0a 20 20 20 20 20 71 72 79 0a 20 20 20 20  b .     qry.    
51c0: 20 72 75 6e 2d 69 64 0a 20 20 20 20 20 3b 3b 20   run-id.     ;; 
51d0: 28 69 66 20 74 65 73 74 70 61 74 74 20 74 65 73  (if testpatt tes
51e0: 74 70 61 74 74 20 22 25 22 29 0a 20 20 20 20 20  tpatt "%").     
51f0: 3b 3b 20 28 69 66 20 69 74 65 6d 70 61 74 74 20  ;; (if itempatt 
5200: 69 74 65 6d 70 61 74 74 20 22 25 22 29 29 0a 20  itempatt "%")). 
5210: 20 20 20 20 29 0a 20 20 20 20 72 65 73 29 29 0a      ).    res)).
5220: 0a 3b 3b 20 74 68 69 73 20 6f 6e 65 20 69 73 20  .;; this one is 
5230: 61 20 62 69 74 20 62 72 6f 6b 65 6e 20 42 55 47  a bit broken BUG
5240: 20 46 49 58 4d 45 0a 28 64 65 66 69 6e 65 20 28   FIXME.(define (
5250: 64 62 3a 64 65 6c 65 74 65 2d 74 65 73 74 2d 73  db:delete-test-s
5260: 74 65 70 2d 72 65 63 6f 72 64 73 20 64 62 20 72  tep-records db r
5270: 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20  un-id test-name 
5280: 69 74 65 6d 64 61 74 29 0a 20 20 3b 3b 20 42 72  itemdat).  ;; Br
5290: 65 61 6b 69 6e 67 20 69 74 20 69 6e 74 6f 20 74  eaking it into t
52a0: 77 6f 20 71 75 65 72 69 65 73 20 66 6f 72 20 62  wo queries for b
52b0: 65 74 74 65 72 20 66 69 6c 65 20 61 63 63 65 73  etter file acces
52c0: 73 20 69 6e 74 65 72 6c 65 61 76 69 6e 67 0a 20  s interleaving. 
52d0: 20 28 6c 65 74 20 28 28 69 64 73 20 27 28 29 29   (let ((ids '())
52e0: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66  ).    (sqlite3:f
52f0: 6f 72 2d 65 61 63 68 2d 72 6f 77 20 28 6c 61 6d  or-each-row (lam
5300: 62 64 61 20 28 69 64 29 0a 09 09 09 20 20 20 20  bda (id)....    
5310: 28 73 65 74 21 20 69 64 73 20 28 63 6f 6e 73 20  (set! ids (cons 
5320: 69 64 20 69 64 73 29 29 29 0a 09 09 09 20 20 64  id ids)))....  d
5330: 62 0a 09 09 09 20 20 22 53 45 4c 45 43 54 20 69  b....  "SELECT i
5340: 64 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45  d FROM tests WHE
5350: 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20  RE run_id=? AND 
5360: 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69  testname=? AND i
5370: 74 65 6d 5f 70 61 74 68 3d 3f 3b 22 0a 09 09 09  tem_path=?;"....
5380: 20 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61    run-id test-na
5390: 6d 65 20 28 69 74 65 6d 2d 6c 69 73 74 2d 3e 70  me (item-list->p
53a0: 61 74 68 20 69 74 65 6d 64 61 74 29 29 0a 20 20  ath itemdat)).  
53b0: 20 20 28 66 6f 72 2d 65 61 63 68 20 28 6c 61 6d    (for-each (lam
53c0: 62 64 61 20 28 69 64 29 0a 09 09 28 73 71 6c 69  bda (id)...(sqli
53d0: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22  te3:execute db "
53e0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 65 73 74  DELETE FROM test
53f0: 5f 73 74 65 70 73 20 57 48 45 52 45 20 74 65 73  _steps WHERE tes
5400: 74 5f 69 64 3d 3f 3b 22 20 69 64 29 0a 09 09 28  t_id=?;" id)...(
5410: 74 68 72 65 61 64 2d 73 6c 65 65 70 21 20 30 2e  thread-sleep! 0.
5420: 31 29 20 3b 3b 20 67 69 76 65 20 6f 74 68 65 72  1) ;; give other
5430: 73 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20  s access to the 
5440: 64 62 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  db.             
5450: 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63     (sqlite3:exec
5460: 75 74 65 20 64 62 20 22 44 45 4c 45 54 45 20 46  ute db "DELETE F
5470: 52 4f 4d 20 74 65 73 74 5f 64 61 74 61 20 57 48  ROM test_data WH
5480: 45 52 45 20 74 65 73 74 5f 69 64 3d 3f 3b 22 20  ERE test_id=?;" 
5490: 69 64 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  id).            
54a0: 20 20 20 20 28 74 68 72 65 61 64 2d 73 6c 65 65      (thread-slee
54b0: 70 21 20 30 2e 31 29 29 20 3b 3b 20 67 69 76 65  p! 0.1)) ;; give
54c0: 20 6f 74 68 65 72 73 20 61 63 63 65 73 73 20 74   others access t
54d0: 6f 20 74 68 65 20 64 62 0a 09 20 20 20 20 20 20  o the db..      
54e0: 69 64 73 29 29 29 0a 3b 3b 22 44 45 4c 45 54 45  ids))).;;"DELETE
54f0: 20 46 52 4f 4d 20 74 65 73 74 5f 73 74 65 70 73   FROM test_steps
5500: 20 57 48 45 52 45 20 74 65 73 74 5f 69 64 20 69   WHERE test_id i
5510: 6e 20 28 53 45 4c 45 43 54 20 69 64 20 46 52 4f  n (SELECT id FRO
5520: 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 72 75  M tests WHERE ru
5530: 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e  n_id=? AND testn
5540: 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70  ame=? AND item_p
5550: 61 74 68 3d 3f 29 3b 22 20 0a 09 09 20 20 20 0a  ath=?);" ...   .
5560: 3b 3b 20 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  ;; .(define (db:
5570: 64 65 6c 65 74 65 2d 74 65 73 74 2d 72 65 63 6f  delete-test-reco
5580: 72 64 73 20 64 62 20 74 65 73 74 2d 69 64 29 0a  rds db test-id).
5590: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
55a0: 74 65 20 64 62 20 22 44 45 4c 45 54 45 20 46 52  te db "DELETE FR
55b0: 4f 4d 20 74 65 73 74 5f 73 74 65 70 73 20 57 48  OM test_steps WH
55c0: 45 52 45 20 74 65 73 74 5f 69 64 3d 3f 3b 22 20  ERE test_id=?;" 
55d0: 74 65 73 74 2d 69 64 29 0a 20 20 28 73 71 6c 69  test-id).  (sqli
55e0: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22  te3:execute db "
55f0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 65 73 74  DELETE FROM test
5600: 5f 64 61 74 61 20 20 57 48 45 52 45 20 74 65 73  _data  WHERE tes
5610: 74 5f 69 64 3d 3f 3b 22 20 74 65 73 74 2d 69 64  t_id=?;" test-id
5620: 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65  ).  (sqlite3:exe
5630: 63 75 74 65 20 64 62 20 22 44 45 4c 45 54 45 20  cute db "DELETE 
5640: 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45  FROM tests WHERE
5650: 20 69 64 3d 3f 3b 22 20 74 65 73 74 2d 69 64 29   id=?;" test-id)
5660: 29 0a 0a 3b 3b 20 73 65 74 20 74 65 73 74 73 20  )..;; set tests 
5670: 77 69 74 68 20 73 74 61 74 65 20 63 75 72 72 73  with state currs
5680: 74 61 74 65 20 61 6e 64 20 73 74 61 74 75 73 20  tate and status 
5690: 63 75 72 72 73 74 61 74 75 73 20 74 6f 20 6e 65  currstatus to ne
56a0: 77 73 74 61 74 65 20 61 6e 64 20 6e 65 77 73 74  wstate and newst
56b0: 61 74 75 73 0a 3b 3b 20 75 73 65 20 63 75 72 72  atus.;; use curr
56c0: 73 74 61 74 65 20 3d 20 23 66 20 61 6e 64 20 6f  state = #f and o
56d0: 72 20 63 75 72 72 73 74 61 74 75 73 20 3d 20 23  r currstatus = #
56e0: 66 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 61 6e  f to apply to an
56f0: 79 20 73 74 61 74 65 20 6f 72 20 73 74 61 74 75  y state or statu
5700: 73 20 72 65 73 70 65 63 74 69 76 65 6c 79 0a 3b  s respectively.;
5710: 3b 20 57 41 52 4e 49 4e 47 3a 20 53 51 4c 20 69  ; WARNING: SQL i
5720: 6e 6a 65 63 74 69 6f 6e 20 72 69 73 6b 0a 28 64  njection risk.(d
5730: 65 66 69 6e 65 20 28 64 62 3a 73 65 74 2d 74 65  efine (db:set-te
5740: 73 74 73 2d 73 74 61 74 65 2d 73 74 61 74 75 73  sts-state-status
5750: 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 6e   db run-id testn
5760: 61 6d 65 73 20 63 75 72 72 73 74 61 74 65 20 63  ames currstate c
5770: 75 72 72 73 74 61 74 75 73 20 6e 65 77 73 74 61  urrstatus newsta
5780: 74 65 20 6e 65 77 73 74 61 74 75 73 29 0a 20 20  te newstatus).  
5790: 28 66 6f 72 2d 65 61 63 68 20 28 6c 61 6d 62 64  (for-each (lambd
57a0: 61 20 28 74 65 73 74 6e 61 6d 65 29 0a 09 20 20  a (testname)..  
57b0: 20 20 20 20 28 6c 65 74 20 28 28 71 72 79 20 28      (let ((qry (
57c0: 63 6f 6e 63 20 22 55 50 44 41 54 45 20 74 65 73  conc "UPDATE tes
57d0: 74 73 20 53 45 54 20 73 74 61 74 65 3d 3f 2c 73  ts SET state=?,s
57e0: 74 61 74 75 73 3d 3f 20 57 48 45 52 45 20 22 0a  tatus=? WHERE ".
57f0: 09 09 09 20 20 20 20 20 20 20 28 69 66 20 63 75  ...       (if cu
5800: 72 72 73 74 61 74 65 20 20 28 63 6f 6e 63 20 22  rrstate  (conc "
5810: 73 74 61 74 65 3d 27 22 20 63 75 72 72 73 74 61  state='" currsta
5820: 74 65 20 22 27 20 41 4e 44 20 22 29 20 22 22 29  te "' AND ") "")
5830: 0a 09 09 09 20 20 20 20 20 20 20 28 69 66 20 63  ....       (if c
5840: 75 72 72 73 74 61 74 75 73 20 28 63 6f 6e 63 20  urrstatus (conc 
5850: 22 73 74 61 74 75 73 3d 27 22 20 63 75 72 72 73  "status='" currs
5860: 74 61 74 75 73 20 22 27 20 41 4e 44 20 22 29 20  tatus "' AND ") 
5870: 22 22 29 0a 09 09 09 20 20 20 20 20 20 20 22 20  "")....       " 
5880: 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73  run_id=? AND tes
5890: 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 4e 4f 54 20  tname=? AND NOT 
58a0: 28 69 74 65 6d 5f 70 61 74 68 3d 27 27 20 41 4e  (item_path='' AN
58b0: 44 20 74 65 73 74 6e 61 6d 65 20 69 6e 20 28 53  D testname in (S
58c0: 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 74  ELECT DISTINCT t
58d0: 65 73 74 6e 61 6d 65 20 46 52 4f 4d 20 74 65 73  estname FROM tes
58e0: 74 73 20 57 48 45 52 45 20 74 65 73 74 6e 61 6d  ts WHERE testnam
58f0: 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74  e=? AND item_pat
5900: 68 20 21 3d 20 27 27 29 29 3b 22 29 29 29 0a 09  h != ''));")))..
5910: 09 3b 3b 28 64 65 62 75 67 3a 70 72 69 6e 74 20  .;;(debug:print 
5920: 30 20 22 51 52 59 3a 20 22 20 71 72 79 29 0a 09  0 "QRY: " qry)..
5930: 09 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74  .(sqlite3:execut
5940: 65 20 64 62 20 71 72 79 20 72 75 6e 2d 69 64 20  e db qry run-id 
5950: 6e 65 77 73 74 61 74 65 20 6e 65 77 73 74 61 74  newstate newstat
5960: 75 73 20 74 65 73 74 6e 61 6d 65 20 74 65 73 74  us testname test
5970: 6e 61 6d 65 29 29 29 0a 09 20 20 20 20 74 65 73  name)))..    tes
5980: 74 6e 61 6d 65 73 29 29 0a 0a 28 64 65 66 69 6e  tnames))..(defin
5990: 65 20 28 64 62 3a 64 65 6c 65 74 65 2d 74 65 73  e (db:delete-tes
59a0: 74 73 2d 69 6e 2d 73 74 61 74 65 20 64 62 20 72  ts-in-state db r
59b0: 75 6e 2d 69 64 20 73 74 61 74 65 29 0a 20 20 28  un-id state).  (
59c0: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
59d0: 64 62 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  db "DELETE FROM 
59e0: 74 65 73 74 73 20 57 48 45 52 45 20 73 74 61 74  tests WHERE stat
59f0: 65 3d 3f 20 41 4e 44 20 72 75 6e 5f 69 64 3d 3f  e=? AND run_id=?
5a00: 3b 22 20 73 74 61 74 65 20 72 75 6e 2d 69 64 29  ;" state run-id)
5a10: 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 74  )..(define (db:t
5a20: 65 73 74 2d 73 65 74 2d 73 74 61 74 65 2d 73 74  est-set-state-st
5a30: 61 74 75 73 2d 62 79 2d 69 64 20 64 62 20 74 65  atus-by-id db te
5a40: 73 74 2d 69 64 20 6e 65 77 73 74 61 74 65 20 6e  st-id newstate n
5a50: 65 77 73 74 61 74 75 73 20 6e 65 77 63 6f 6d 6d  ewstatus newcomm
5a60: 65 6e 74 29 0a 20 20 28 69 66 20 6e 65 77 73 74  ent).  (if newst
5a70: 61 74 65 20 20 20 28 73 71 6c 69 74 65 33 3a 65  ate   (sqlite3:e
5a80: 78 65 63 75 74 65 20 64 62 20 22 55 50 44 41 54  xecute db "UPDAT
5a90: 45 20 74 65 73 74 73 20 53 45 54 20 73 74 61 74  E tests SET stat
5aa0: 65 3d 3f 20 20 20 57 48 45 52 45 20 69 64 3d 3f  e=?   WHERE id=?
5ab0: 3b 22 20 6e 65 77 73 74 61 74 65 20 20 20 74 65  ;" newstate   te
5ac0: 73 74 2d 69 64 29 29 0a 20 20 28 69 66 20 6e 65  st-id)).  (if ne
5ad0: 77 73 74 61 74 75 73 20 20 28 73 71 6c 69 74 65  wstatus  (sqlite
5ae0: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 55 50  3:execute db "UP
5af0: 44 41 54 45 20 74 65 73 74 73 20 53 45 54 20 73  DATE tests SET s
5b00: 74 61 74 75 73 3d 3f 20 20 57 48 45 52 45 20 69  tatus=?  WHERE i
5b10: 64 3d 3f 3b 22 20 6e 65 77 73 74 61 74 75 73 20  d=?;" newstatus 
5b20: 20 74 65 73 74 2d 69 64 29 29 0a 20 20 28 69 66   test-id)).  (if
5b30: 20 6e 65 77 63 6f 6d 6d 65 6e 74 20 28 73 71 6c   newcomment (sql
5b40: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
5b50: 22 55 50 44 41 54 45 20 74 65 73 74 73 20 53 45  "UPDATE tests SE
5b60: 54 20 63 6f 6d 6d 65 6e 74 3d 3f 20 57 48 45 52  T comment=? WHER
5b70: 45 20 69 64 3d 3f 3b 22 20 6e 65 77 63 6f 6d 6d  E id=?;" newcomm
5b80: 65 6e 74 20 74 65 73 74 2d 69 64 29 29 29 0a 0a  ent test-id)))..
5b90: 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74  (define (db:test
5ba0: 2d 73 65 74 2d 73 74 61 74 65 2d 73 74 61 74 75  -set-state-statu
5bb0: 73 2d 62 79 2d 72 75 6e 2d 69 64 2d 74 65 73 74  s-by-run-id-test
5bc0: 6e 61 6d 65 20 64 62 20 72 75 6e 2d 69 64 20 74  name db run-id t
5bd0: 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61  est-name item-pa
5be0: 74 68 20 73 74 61 74 75 73 20 73 74 61 74 65 29  th status state)
5bf0: 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63  .  (sqlite3:exec
5c00: 75 74 65 20 64 62 20 22 55 50 44 41 54 45 20 74  ute db "UPDATE t
5c10: 65 73 74 73 20 53 45 54 20 73 74 61 74 65 3d 3f  ests SET state=?
5c20: 2c 73 74 61 74 75 73 3d 3f 2c 65 76 65 6e 74 5f  ,status=?,event_
5c30: 74 69 6d 65 3d 73 74 72 66 74 69 6d 65 28 27 25  time=strftime('%
5c40: 73 27 2c 27 6e 6f 77 27 29 20 57 48 45 52 45 20  s','now') WHERE 
5c50: 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73  run_id=? AND tes
5c60: 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d  tname=? AND item
5c70: 5f 70 61 74 68 3d 3f 3b 22 20 0a 09 09 20 20 20  _path=?;" ...   
5c80: 73 74 61 74 65 20 73 74 61 74 75 73 20 72 75 6e  state status run
5c90: 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74  -id test-name it
5ca0: 65 6d 2d 70 61 74 68 29 29 0a 0a 28 64 65 66 69  em-path))..(defi
5cb0: 6e 65 20 28 64 62 3a 67 65 74 2d 63 6f 75 6e 74  ne (db:get-count
5cc0: 2d 74 65 73 74 73 2d 72 75 6e 6e 69 6e 67 20 64  -tests-running d
5cd0: 62 29 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20  b).  (let ((res 
5ce0: 30 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33  0)).    (sqlite3
5cf0: 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20  :for-each-row.  
5d00: 20 20 20 28 6c 61 6d 62 64 61 20 28 63 6f 75 6e     (lambda (coun
5d10: 74 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20  t).       (set! 
5d20: 72 65 73 20 63 6f 75 6e 74 29 29 0a 20 20 20 20  res count)).    
5d30: 20 64 62 0a 20 20 20 20 20 22 53 45 4c 45 43 54   db.     "SELECT
5d40: 20 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20   count(id) FROM 
5d50: 74 65 73 74 73 20 57 48 45 52 45 20 73 74 61 74  tests WHERE stat
5d60: 65 20 3d 20 27 52 55 4e 4e 49 4e 47 27 20 4f 52  e = 'RUNNING' OR
5d70: 20 73 74 61 74 65 20 3d 20 27 4c 41 55 4e 43 48   state = 'LAUNCH
5d80: 45 44 27 20 4f 52 20 73 74 61 74 65 20 3d 20 27  ED' OR state = '
5d90: 52 45 4d 4f 54 45 48 4f 53 54 53 54 41 52 54 27  REMOTEHOSTSTART'
5da0: 3b 22 29 0a 20 20 20 20 72 65 73 29 29 0a 0a 28  ;").    res))..(
5db0: 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 63  define (db:get-c
5dc0: 6f 75 6e 74 2d 74 65 73 74 73 2d 72 75 6e 6e 69  ount-tests-runni
5dd0: 6e 67 2d 69 6e 2d 6a 6f 62 67 72 6f 75 70 20 64  ng-in-jobgroup d
5de0: 62 20 6a 6f 62 67 72 6f 75 70 29 0a 20 20 28 69  b jobgroup).  (i
5df0: 66 20 28 6e 6f 74 20 6a 6f 62 67 72 6f 75 70 29  f (not jobgroup)
5e00: 0a 20 20 20 20 20 20 30 20 3b 3b 20 0a 20 20 20  .      0 ;; .   
5e10: 20 20 20 28 6c 65 74 20 28 28 72 65 73 20 30 29     (let ((res 0)
5e20: 29 0a 09 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d  )..(sqlite3:for-
5e30: 65 61 63 68 2d 72 6f 77 0a 09 20 28 6c 61 6d 62  each-row.. (lamb
5e40: 64 61 20 28 63 6f 75 6e 74 29 0a 09 20 20 20 28  da (count)..   (
5e50: 73 65 74 21 20 72 65 73 20 63 6f 75 6e 74 29 29  set! res count))
5e60: 0a 09 20 64 62 0a 09 20 22 53 45 4c 45 43 54 20  .. db.. "SELECT 
5e70: 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 74  count(id) FROM t
5e80: 65 73 74 73 20 57 48 45 52 45 20 73 74 61 74 65  ests WHERE state
5e90: 20 3d 20 27 52 55 4e 4e 49 4e 47 27 20 4f 52 20   = 'RUNNING' OR 
5ea0: 73 74 61 74 65 20 3d 20 27 4c 41 55 4e 43 48 45  state = 'LAUNCHE
5eb0: 44 27 20 4f 52 20 73 74 61 74 65 20 3d 20 27 52  D' OR state = 'R
5ec0: 45 4d 4f 54 45 48 4f 53 54 53 54 41 52 54 27 0a  EMOTEHOSTSTART'.
5ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44               AND
5ee0: 20 74 65 73 74 6e 61 6d 65 20 69 6e 20 28 53 45   testname in (SE
5ef0: 4c 45 43 54 20 74 65 73 74 6e 61 6d 65 20 46 52  LECT testname FR
5f00: 4f 4d 20 74 65 73 74 5f 6d 65 74 61 20 57 48 45  OM test_meta WHE
5f10: 52 45 20 6a 6f 62 67 72 6f 75 70 3d 3f 3b 22 0a  RE jobgroup=?;".
5f20: 09 20 6a 6f 62 67 72 6f 75 70 29 0a 09 72 65 73  . jobgroup)..res
5f30: 29 29 29 0a 0a 3b 3b 20 64 6f 6e 65 20 77 69 74  )))..;; done wit
5f40: 68 20 72 75 6e 20 77 68 65 6e 3a 0a 3b 3b 20 20  h run when:.;;  
5f50: 20 30 20 74 65 73 74 73 20 69 6e 20 4c 41 55 4e   0 tests in LAUN
5f60: 43 48 45 44 2c 20 4e 4f 54 5f 53 54 41 52 54 45  CHED, NOT_STARTE
5f70: 44 2c 20 52 45 4d 4f 54 45 48 4f 53 54 53 54 41  D, REMOTEHOSTSTA
5f80: 52 54 2c 20 52 55 4e 4e 49 4e 47 0a 28 64 65 66  RT, RUNNING.(def
5f90: 69 6e 65 20 28 64 62 3a 65 73 74 69 6d 61 74 65  ine (db:estimate
5fa0: 64 2d 74 65 73 74 73 2d 72 65 6d 61 69 6e 69 6e  d-tests-remainin
5fb0: 67 20 64 62 20 72 75 6e 2d 69 64 29 0a 20 20 28  g db run-id).  (
5fc0: 6c 65 74 20 28 28 72 65 73 20 30 29 29 0a 20 20  let ((res 0)).  
5fd0: 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65    (sqlite3:for-e
5fe0: 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61  ach-row.     (la
5ff0: 6d 62 64 61 20 28 63 6f 75 6e 74 29 0a 20 20 20  mbda (count).   
6000: 20 20 20 20 28 73 65 74 21 20 72 65 73 20 63 6f      (set! res co
6010: 75 6e 74 29 29 0a 20 20 20 20 20 64 62 20 3b 3b  unt)).     db ;;
6020: 20 4e 42 2f 2f 20 4b 49 4c 4c 52 45 51 20 6d 65   NB// KILLREQ me
6030: 61 6e 73 20 74 68 65 20 6a 6f 62 73 20 69 73 20  ans the jobs is 
6040: 73 74 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 72  still probably r
6050: 75 6e 6e 69 6e 67 0a 20 20 20 20 20 22 53 45 4c  unning.     "SEL
6060: 45 43 54 20 63 6f 75 6e 74 28 69 64 29 20 46 52  ECT count(id) FR
6070: 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 73  OM tests WHERE s
6080: 74 61 74 65 20 69 6e 20 28 27 4c 41 55 4e 43 48  tate in ('LAUNCH
6090: 45 44 27 2c 27 4e 4f 54 5f 53 54 41 52 54 45 44  ED','NOT_STARTED
60a0: 27 2c 27 52 45 4d 4f 54 45 48 4f 53 54 53 54 41  ','REMOTEHOSTSTA
60b0: 52 54 27 2c 27 52 55 4e 4e 49 4e 47 27 2c 27 4b  RT','RUNNING','K
60c0: 49 4c 4c 52 45 51 27 29 20 41 4e 44 20 72 75 6e  ILLREQ') AND run
60d0: 5f 69 64 3d 3f 3b 22 20 72 75 6e 2d 69 64 29 0a  _id=?;" run-id).
60e0: 20 20 20 20 72 65 73 29 29 0a 0a 3b 3b 20 4e 42      res))..;; NB
60f0: 2f 2f 20 53 79 6e 63 20 74 68 69 73 20 77 69 74  // Sync this wit
6100: 68 20 72 75 6e 73 3a 67 65 74 2d 74 65 73 74 2d  h runs:get-test-
6110: 69 6e 66 6f 0a 28 64 65 66 69 6e 65 20 28 64 62  info.(define (db
6120: 3a 67 65 74 2d 74 65 73 74 2d 69 6e 66 6f 20 64  :get-test-info d
6130: 62 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d  b run-id testnam
6140: 65 20 69 74 65 6d 2d 70 61 74 68 29 0a 20 20 28  e item-path).  (
6150: 6c 65 74 20 28 28 72 65 73 20 23 66 29 29 0a 20  let ((res #f)). 
6160: 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d     (sqlite3:for-
6170: 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c  each-row.     (l
6180: 61 6d 62 64 61 20 28 69 64 20 72 75 6e 2d 69 64  ambda (id run-id
6190: 20 74 65 73 74 6e 61 6d 65 20 73 74 61 74 65 20   testname state 
61a0: 73 74 61 74 75 73 20 65 76 65 6e 74 2d 74 69 6d  status event-tim
61b0: 65 20 68 6f 73 74 20 63 70 75 6c 6f 61 64 20 64  e host cpuload d
61c0: 69 73 6b 66 72 65 65 20 75 6e 61 6d 65 20 72 75  iskfree uname ru
61d0: 6e 64 69 72 20 69 74 65 6d 2d 70 61 74 68 20 72  ndir item-path r
61e0: 75 6e 5f 64 75 72 61 74 69 6f 6e 20 66 69 6e 61  un_duration fina
61f0: 6c 5f 6c 6f 67 66 20 63 6f 6d 6d 65 6e 74 20 29  l_logf comment )
6200: 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72 65  .       (set! re
6210: 73 20 28 76 65 63 74 6f 72 20 69 64 20 72 75 6e  s (vector id run
6220: 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 73 74 61  -id testname sta
6230: 74 65 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d  te status event-
6240: 74 69 6d 65 20 68 6f 73 74 20 63 70 75 6c 6f 61  time host cpuloa
6250: 64 20 64 69 73 6b 66 72 65 65 20 75 6e 61 6d 65  d diskfree uname
6260: 20 72 75 6e 64 69 72 20 69 74 65 6d 2d 70 61 74   rundir item-pat
6270: 68 20 72 75 6e 5f 64 75 72 61 74 69 6f 6e 20 66  h run_duration f
6280: 69 6e 61 6c 5f 6c 6f 67 66 20 63 6f 6d 6d 65 6e  inal_logf commen
6290: 74 20 29 29 29 0a 20 20 20 20 20 64 62 20 0a 20  t ))).     db . 
62a0: 20 20 20 20 22 53 45 4c 45 43 54 20 69 64 2c 72      "SELECT id,r
62b0: 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d 65 2c 73  un_id,testname,s
62c0: 74 61 74 65 2c 73 74 61 74 75 73 2c 65 76 65 6e  tate,status,even
62d0: 74 5f 74 69 6d 65 2c 68 6f 73 74 2c 63 70 75 6c  t_time,host,cpul
62e0: 6f 61 64 2c 64 69 73 6b 66 72 65 65 2c 75 6e 61  oad,diskfree,una
62f0: 6d 65 2c 72 75 6e 64 69 72 2c 69 74 65 6d 5f 70  me,rundir,item_p
6300: 61 74 68 2c 72 75 6e 5f 64 75 72 61 74 69 6f 6e  ath,run_duration
6310: 2c 66 69 6e 61 6c 5f 6c 6f 67 66 2c 63 6f 6d 6d  ,final_logf,comm
6320: 65 6e 74 20 46 52 4f 4d 20 74 65 73 74 73 20 57  ent FROM tests W
6330: 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e  HERE run_id=? AN
6340: 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44  D testname=? AND
6350: 20 69 74 65 6d 5f 70 61 74 68 3d 3f 3b 22 0a 20   item_path=?;". 
6360: 20 20 20 20 72 75 6e 2d 69 64 20 74 65 73 74 6e      run-id testn
6370: 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 0a 20  ame item-path). 
6380: 20 20 20 72 65 73 29 29 0a 0a 3b 3b 20 47 65 74     res))..;; Get
6390: 20 74 65 73 74 20 64 61 74 61 20 75 73 69 6e 67   test data using
63a0: 20 74 65 73 74 5f 69 64 0a 28 64 65 66 69 6e 65   test_id.(define
63b0: 20 28 64 62 3a 67 65 74 2d 74 65 73 74 2d 64 61   (db:get-test-da
63c0: 74 61 2d 62 79 2d 69 64 20 64 62 20 74 65 73 74  ta-by-id db test
63d0: 2d 69 64 29 0a 20 20 28 6c 65 74 20 28 28 72 65  -id).  (let ((re
63e0: 73 20 23 66 29 29 0a 20 20 20 20 28 73 71 6c 69  s #f)).    (sqli
63f0: 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77  te3:for-each-row
6400: 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 69  .     (lambda (i
6410: 64 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d  d run-id testnam
6420: 65 20 73 74 61 74 65 20 73 74 61 74 75 73 20 65  e state status e
6430: 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73 74 20 63  vent-time host c
6440: 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20  puload diskfree 
6450: 75 6e 61 6d 65 20 72 75 6e 64 69 72 20 69 74 65  uname rundir ite
6460: 6d 2d 70 61 74 68 20 72 75 6e 5f 64 75 72 61 74  m-path run_durat
6470: 69 6f 6e 20 66 69 6e 61 6c 5f 6c 6f 67 66 20 63  ion final_logf c
6480: 6f 6d 6d 65 6e 74 29 0a 20 20 20 20 20 20 20 28  omment).       (
6490: 73 65 74 21 20 72 65 73 20 28 76 65 63 74 6f 72  set! res (vector
64a0: 20 69 64 20 72 75 6e 2d 69 64 20 74 65 73 74 6e   id run-id testn
64b0: 61 6d 65 20 73 74 61 74 65 20 73 74 61 74 75 73  ame state status
64c0: 20 65 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73 74   event-time host
64d0: 20 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65   cpuload diskfre
64e0: 65 20 75 6e 61 6d 65 20 72 75 6e 64 69 72 20 69  e uname rundir i
64f0: 74 65 6d 2d 70 61 74 68 20 72 75 6e 5f 64 75 72  tem-path run_dur
6500: 61 74 69 6f 6e 20 66 69 6e 61 6c 5f 6c 6f 67 66  ation final_logf
6510: 20 63 6f 6d 6d 65 6e 74 29 29 29 0a 20 20 20 20   comment))).    
6520: 20 64 62 20 0a 20 20 20 20 20 22 53 45 4c 45 43   db .     "SELEC
6530: 54 20 69 64 2c 72 75 6e 5f 69 64 2c 74 65 73 74  T id,run_id,test
6540: 6e 61 6d 65 2c 73 74 61 74 65 2c 73 74 61 74 75  name,state,statu
6550: 73 2c 65 76 65 6e 74 5f 74 69 6d 65 2c 68 6f 73  s,event_time,hos
6560: 74 2c 63 70 75 6c 6f 61 64 2c 64 69 73 6b 66 72  t,cpuload,diskfr
6570: 65 65 2c 75 6e 61 6d 65 2c 72 75 6e 64 69 72 2c  ee,uname,rundir,
6580: 69 74 65 6d 5f 70 61 74 68 2c 72 75 6e 5f 64 75  item_path,run_du
6590: 72 61 74 69 6f 6e 2c 66 69 6e 61 6c 5f 6c 6f 67  ration,final_log
65a0: 66 2c 63 6f 6d 6d 65 6e 74 20 46 52 4f 4d 20 74  f,comment FROM t
65b0: 65 73 74 73 20 57 48 45 52 45 20 69 64 3d 3f 3b  ests WHERE id=?;
65c0: 22 0a 20 20 20 20 20 74 65 73 74 2d 69 64 29 0a  ".     test-id).
65d0: 20 20 20 20 72 65 73 29 29 0a 0a 0a 28 64 65 66      res))...(def
65e0: 69 6e 65 20 28 64 62 3a 74 65 73 74 2d 73 65 74  ine (db:test-set
65f0: 2d 63 6f 6d 6d 65 6e 74 20 64 62 20 74 65 73 74  -comment db test
6600: 2d 69 64 20 63 6f 6d 6d 65 6e 74 29 0a 20 20 28  -id comment).  (
6610: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
6620: 0a 20 20 20 64 62 20 0a 20 20 20 22 55 50 44 41  .   db .   "UPDA
6630: 54 45 20 74 65 73 74 73 20 53 45 54 20 63 6f 6d  TE tests SET com
6640: 6d 65 6e 74 3d 3f 20 57 48 45 52 45 20 69 64 3d  ment=? WHERE id=
6650: 3f 3b 22 0a 20 20 20 63 6f 6d 6d 65 6e 74 20 74  ?;".   comment t
6660: 65 73 74 2d 69 64 29 29 0a 0a 3b 3b 0a 28 64 65  est-id))..;;.(de
6670: 66 69 6e 65 20 28 64 62 3a 74 65 73 74 2d 73 65  fine (db:test-se
6680: 74 2d 72 75 6e 64 69 72 21 20 64 62 20 72 75 6e  t-rundir! db run
6690: 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74  -id test-name it
66a0: 65 6d 2d 70 61 74 68 20 72 75 6e 64 69 72 29 0a  em-path rundir).
66b0: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
66c0: 74 65 20 0a 20 20 20 64 62 20 0a 20 20 20 22 55  te .   db .   "U
66d0: 50 44 41 54 45 20 74 65 73 74 73 20 53 45 54 20  PDATE tests SET 
66e0: 72 75 6e 64 69 72 3d 3f 20 57 48 45 52 45 20 72  rundir=? WHERE r
66f0: 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74  un_id=? AND test
6700: 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f  name=? AND item_
6710: 70 61 74 68 3d 3f 3b 22 0a 20 20 20 72 75 6e 64  path=?;".   rund
6720: 69 72 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e  ir run-id test-n
6730: 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 29 0a  ame item-path)).
6740: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73  .(define (db:tes
6750: 74 2d 73 65 74 2d 6c 6f 67 21 20 64 62 20 74 65  t-set-log! db te
6760: 73 74 2d 69 64 20 6c 6f 67 66 29 0a 20 20 28 69  st-id logf).  (i
6770: 66 20 28 73 74 72 69 6e 67 3f 20 6c 6f 67 66 29  f (string? logf)
6780: 0a 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a  .      (sqlite3:
6790: 65 78 65 63 75 74 65 20 64 62 20 22 55 50 44 41  execute db "UPDA
67a0: 54 45 20 74 65 73 74 73 20 53 45 54 20 66 69 6e  TE tests SET fin
67b0: 61 6c 5f 6c 6f 67 66 3d 3f 20 57 48 45 52 45 20  al_logf=? WHERE 
67c0: 69 64 3d 3f 3b 22 0a 09 09 20 20 20 6c 6f 67 66  id=?;"...   logf
67d0: 20 74 65 73 74 2d 69 64 29 0a 20 20 20 20 20 20   test-id).      
67e0: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 30 20 22  (debug:print 0 "
67f0: 45 52 52 4f 52 3a 20 64 62 3a 74 65 73 74 2d 73  ERROR: db:test-s
6800: 65 74 2d 6c 6f 67 21 20 63 61 6c 6c 65 64 20 77  et-log! called w
6810: 69 74 68 20 6e 6f 6e 2d 73 74 72 69 6e 67 20 6c  ith non-string l
6820: 6f 67 20 66 69 6c 65 20 6e 61 6d 65 20 22 20 6c  og file name " l
6830: 6f 67 66 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d  ogf)))..;;======
6840: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6850: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6860: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6870: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6880: 0a 3b 3b 20 4d 69 73 63 2e 20 74 65 73 74 20 72  .;; Misc. test r
6890: 65 6c 61 74 65 64 20 71 75 65 72 69 65 73 0a 3b  elated queries.;
68a0: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;===============
68b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
68c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
68d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
68e0: 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65 66 69 6e 65  =======..(define
68f0: 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 70 61   (db:test-get-pa
6900: 74 68 73 2d 6d 61 74 63 68 69 6e 67 20 64 62 20  ths-matching db 
6910: 6b 65 79 6e 61 6d 65 73 20 74 61 72 67 65 74 29  keynames target)
6920: 0a 20 20 28 6c 65 74 2a 20 28 28 72 65 73 20 27  .  (let* ((res '
6930: 28 29 29 0a 09 20 28 69 74 65 6d 70 61 74 74 20  ()).. (itempatt 
6940: 20 20 28 69 66 20 28 61 72 67 73 3a 67 65 74 2d    (if (args:get-
6950: 61 72 67 20 22 2d 69 74 65 6d 70 61 74 74 22 29  arg "-itempatt")
6960: 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22 2d  (args:get-arg "-
6970: 69 74 65 6d 70 61 74 74 22 29 20 22 25 22 29 29  itempatt") "%"))
6980: 0a 09 20 28 74 65 73 74 70 61 74 74 20 20 20 28  .. (testpatt   (
6990: 69 66 20 28 61 72 67 73 3a 67 65 74 2d 61 72 67  if (args:get-arg
69a0: 20 22 2d 74 65 73 74 70 61 74 74 22 29 28 61 72   "-testpatt")(ar
69b0: 67 73 3a 67 65 74 2d 61 72 67 20 22 2d 74 65 73  gs:get-arg "-tes
69c0: 74 70 61 74 74 22 29 20 22 25 22 29 29 0a 09 20  tpatt") "%")).. 
69d0: 28 73 74 61 74 65 70 61 74 74 20 20 28 69 66 20  (statepatt  (if 
69e0: 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22 3a  (args:get-arg ":
69f0: 73 74 61 74 65 22 29 20 20 20 28 61 72 67 73 3a  state")   (args:
6a00: 67 65 74 2d 61 72 67 20 22 3a 73 74 61 74 65 22  get-arg ":state"
6a10: 29 20 20 20 20 22 25 22 29 29 0a 09 20 28 73 74  )    "%")).. (st
6a20: 61 74 75 73 70 61 74 74 20 28 69 66 20 28 61 72  atuspatt (if (ar
6a30: 67 73 3a 67 65 74 2d 61 72 67 20 22 3a 73 74 61  gs:get-arg ":sta
6a40: 74 75 73 22 29 20 20 28 61 72 67 73 3a 67 65 74  tus")  (args:get
6a50: 2d 61 72 67 20 22 3a 73 74 61 74 75 73 22 29 20  -arg ":status") 
6a60: 20 20 22 25 22 29 29 0a 09 20 28 72 75 6e 6e 61    "%")).. (runna
6a70: 6d 65 20 20 20 20 28 69 66 20 28 61 72 67 73 3a  me    (if (args:
6a80: 67 65 74 2d 61 72 67 20 22 3a 72 75 6e 6e 61 6d  get-arg ":runnam
6a90: 65 22 29 20 28 61 72 67 73 3a 67 65 74 2d 61 72  e") (args:get-ar
6aa0: 67 20 22 3a 72 75 6e 6e 61 6d 65 22 29 20 20 22  g ":runname")  "
6ab0: 25 22 29 29 0a 09 20 28 6b 65 79 73 74 72 20 28  %")).. (keystr (
6ac0: 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72  string-intersper
6ad0: 73 65 20 0a 09 09 20 20 28 6d 61 70 20 28 6c 61  se ...  (map (la
6ae0: 6d 62 64 61 20 28 6b 65 79 20 76 61 6c 29 0a 09  mbda (key val)..
6af0: 09 09 20 28 63 6f 6e 63 20 22 72 2e 22 20 6b 65  .. (conc "r." ke
6b00: 79 20 22 20 6c 69 6b 65 20 27 22 20 76 61 6c 20  y " like '" val 
6b10: 22 27 22 29 29 0a 09 09 20 20 20 20 20 20 20 6b  "'"))...       k
6b20: 65 79 6e 61 6d 65 73 20 0a 09 09 20 20 20 20 20  eynames ...     
6b30: 20 20 28 73 74 72 69 6e 67 2d 73 70 6c 69 74 20    (string-split 
6b40: 74 61 72 67 65 74 20 22 2f 22 29 29 0a 09 09 20  target "/"))... 
6b50: 20 22 20 41 4e 44 20 22 29 29 0a 09 20 28 71 72   " AND ")).. (qr
6b60: 79 73 74 72 20 28 63 6f 6e 63 20 22 53 45 4c 45  ystr (conc "SELE
6b70: 43 54 20 74 2e 72 75 6e 64 69 72 20 46 52 4f 4d  CT t.rundir FROM
6b80: 20 74 65 73 74 73 20 41 53 20 74 20 49 4e 4e 45   tests AS t INNE
6b90: 52 20 4a 4f 49 4e 20 72 75 6e 73 20 41 53 20 72  R JOIN runs AS r
6ba0: 20 4f 4e 20 74 2e 72 75 6e 5f 69 64 3d 72 2e 69   ON t.run_id=r.i
6bb0: 64 20 57 48 45 52 45 20 22 0a 09 09 20 20 20 20  d WHERE "...    
6bc0: 20 20 20 6b 65 79 73 74 72 20 22 20 41 4e 44 20     keystr " AND 
6bd0: 72 2e 72 75 6e 6e 61 6d 65 20 4c 49 4b 45 20 27  r.runname LIKE '
6be0: 22 20 72 75 6e 6e 61 6d 65 20 22 27 20 41 4e 44  " runname "' AND
6bf0: 20 69 74 65 6d 5f 70 61 74 68 20 4c 49 4b 45 20   item_path LIKE 
6c00: 27 22 20 69 74 65 6d 70 61 74 74 20 22 27 20 41  '" itempatt "' A
6c10: 4e 44 20 74 65 73 74 6e 61 6d 65 20 4c 49 4b 45  ND testname LIKE
6c20: 20 27 22 0a 09 09 20 20 20 20 20 20 20 74 65 73   '"...       tes
6c30: 74 70 61 74 74 20 22 27 20 41 4e 44 20 74 2e 73  tpatt "' AND t.s
6c40: 74 61 74 65 20 4c 49 4b 45 20 27 22 20 73 74 61  tate LIKE '" sta
6c50: 74 65 70 61 74 74 20 22 27 20 41 4e 44 20 74 2e  tepatt "' AND t.
6c60: 73 74 61 74 75 73 20 4c 49 4b 45 20 27 22 20 73  status LIKE '" s
6c70: 74 61 74 75 73 70 61 74 74 20 0a 09 09 20 20 20  tatuspatt ...   
6c80: 20 20 20 20 22 27 4f 52 44 45 52 20 42 59 20 74      "'ORDER BY t
6c90: 2e 65 76 65 6e 74 5f 74 69 6d 65 20 41 53 43 3b  .event_time ASC;
6ca0: 22 29 29 29 0a 20 20 20 20 28 64 65 62 75 67 3a  "))).    (debug:
6cb0: 70 72 69 6e 74 20 33 20 22 71 72 79 73 74 72 3a  print 3 "qrystr:
6cc0: 20 22 20 71 72 79 73 74 72 29 0a 20 20 20 20 28   " qrystr).    (
6cd0: 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68  sqlite3:for-each
6ce0: 2d 72 6f 77 20 0a 20 20 20 20 20 28 6c 61 6d 62  -row .     (lamb
6cf0: 64 61 20 28 70 29 0a 20 20 20 20 20 20 20 28 73  da (p).       (s
6d00: 65 74 21 20 72 65 73 20 28 63 6f 6e 73 20 70 20  et! res (cons p 
6d10: 72 65 73 29 29 29 0a 20 20 20 20 20 64 62 20 0a  res))).     db .
6d20: 20 20 20 20 20 71 72 79 73 74 72 29 0a 20 20 20       qrystr).   
6d30: 20 72 65 73 29 29 0a 0a 28 64 65 66 69 6e 65 20   res))..(define 
6d40: 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 74 65 73  (db:test-get-tes
6d50: 74 2d 72 65 63 6f 72 64 73 2d 6d 61 74 63 68 69  t-records-matchi
6d60: 6e 67 20 64 62 20 6b 65 79 6e 61 6d 65 73 20 74  ng db keynames t
6d70: 61 72 67 65 74 29 0a 20 20 28 6c 65 74 2a 20 28  arget).  (let* (
6d80: 28 72 65 73 20 27 28 29 29 0a 09 20 28 69 74 65  (res '()).. (ite
6d90: 6d 70 61 74 74 20 20 20 28 69 66 20 28 61 72 67  mpatt   (if (arg
6da0: 73 3a 67 65 74 2d 61 72 67 20 22 2d 69 74 65 6d  s:get-arg "-item
6db0: 70 61 74 74 22 29 28 61 72 67 73 3a 67 65 74 2d  patt")(args:get-
6dc0: 61 72 67 20 22 2d 69 74 65 6d 70 61 74 74 22 29  arg "-itempatt")
6dd0: 20 22 25 22 29 29 0a 09 20 28 74 65 73 74 70 61   "%")).. (testpa
6de0: 74 74 20 20 20 28 69 66 20 28 61 72 67 73 3a 67  tt   (if (args:g
6df0: 65 74 2d 61 72 67 20 22 2d 74 65 73 74 70 61 74  et-arg "-testpat
6e00: 74 22 29 28 61 72 67 73 3a 67 65 74 2d 61 72 67  t")(args:get-arg
6e10: 20 22 2d 74 65 73 74 70 61 74 74 22 29 20 22 25   "-testpatt") "%
6e20: 22 29 29 0a 09 20 28 73 74 61 74 65 70 61 74 74  ")).. (statepatt
6e30: 20 20 28 69 66 20 28 61 72 67 73 3a 67 65 74 2d    (if (args:get-
6e40: 61 72 67 20 22 3a 73 74 61 74 65 22 29 20 20 20  arg ":state")   
6e50: 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22 3a  (args:get-arg ":
6e60: 73 74 61 74 65 22 29 20 20 20 20 22 25 22 29 29  state")    "%"))
6e70: 0a 09 20 28 73 74 61 74 75 73 70 61 74 74 20 28  .. (statuspatt (
6e80: 69 66 20 28 61 72 67 73 3a 67 65 74 2d 61 72 67  if (args:get-arg
6e90: 20 22 3a 73 74 61 74 75 73 22 29 20 20 28 61 72   ":status")  (ar
6ea0: 67 73 3a 67 65 74 2d 61 72 67 20 22 3a 73 74 61  gs:get-arg ":sta
6eb0: 74 75 73 22 29 20 20 20 22 25 22 29 29 0a 09 20  tus")   "%")).. 
6ec0: 28 72 75 6e 6e 61 6d 65 20 20 20 20 28 69 66 20  (runname    (if 
6ed0: 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22 3a  (args:get-arg ":
6ee0: 72 75 6e 6e 61 6d 65 22 29 20 28 61 72 67 73 3a  runname") (args:
6ef0: 67 65 74 2d 61 72 67 20 22 3a 72 75 6e 6e 61 6d  get-arg ":runnam
6f00: 65 22 29 20 20 22 25 22 29 29 0a 09 20 28 6b 65  e")  "%")).. (ke
6f10: 79 73 74 72 20 28 73 74 72 69 6e 67 2d 69 6e 74  ystr (string-int
6f20: 65 72 73 70 65 72 73 65 20 0a 09 09 20 20 28 6d  ersperse ...  (m
6f30: 61 70 20 28 6c 61 6d 62 64 61 20 28 6b 65 79 20  ap (lambda (key 
6f40: 76 61 6c 29 0a 09 09 09 20 28 63 6f 6e 63 20 22  val).... (conc "
6f50: 72 2e 22 20 6b 65 79 20 22 20 6c 69 6b 65 20 27  r." key " like '
6f60: 22 20 76 61 6c 20 22 27 22 29 29 0a 09 09 20 20  " val "'"))...  
6f70: 20 20 20 20 20 6b 65 79 6e 61 6d 65 73 20 0a 09       keynames ..
6f80: 09 20 20 20 20 20 20 20 28 73 74 72 69 6e 67 2d  .       (string-
6f90: 73 70 6c 69 74 20 74 61 72 67 65 74 20 22 2f 22  split target "/"
6fa0: 29 29 0a 09 09 20 20 22 20 41 4e 44 20 22 29 29  ))...  " AND "))
6fb0: 0a 09 20 28 71 72 79 73 74 72 20 28 63 6f 6e 63  .. (qrystr (conc
6fc0: 20 22 53 45 4c 45 43 54 20 0a 20 20 20 20 20 20   "SELECT .      
6fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fe0: 20 20 20 20 20 20 74 2e 69 64 0a 20 20 20 20 20        t.id.     
6ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7000: 20 20 20 20 20 20 20 74 2e 72 75 6e 5f 69 64 20         t.run_id 
7010: 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20      .           
7020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7030: 20 74 2e 74 65 73 74 6e 61 6d 65 20 20 20 0a 20   t.testname   . 
7040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7050: 20 20 20 20 20 20 20 20 20 20 20 74 2e 68 6f 73             t.hos
7060: 74 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20  t       .       
7070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7080: 20 20 20 20 20 74 2e 63 70 75 6c 6f 61 64 20 20       t.cpuload  
7090: 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20    .             
70a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
70b0: 2e 64 69 73 6b 66 72 65 65 20 20 20 0a 20 20 20  .diskfree   .   
70c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70d0: 20 20 20 20 20 20 20 20 20 74 2e 75 6e 61 6d 65           t.uname
70e0: 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20        .         
70f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7100: 20 20 20 74 2e 72 75 6e 64 69 72 20 20 20 20 20     t.rundir     
7110: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7120: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 2e 73               t.s
7130: 68 6f 72 74 64 69 72 20 20 20 0a 20 20 20 20 20  hortdir   .     
7140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7150: 20 20 20 20 20 20 20 74 2e 69 74 65 6d 5f 70 61         t.item_pa
7160: 74 68 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  th  .           
7170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7180: 20 74 2e 73 74 61 74 65 20 20 20 20 20 20 0a 20   t.state      . 
7190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71a0: 20 20 20 20 20 20 20 20 20 20 20 74 2e 73 74 61             t.sta
71b0: 74 75 73 20 20 20 20 20 0a 20 20 20 20 20 20 20  tus     .       
71c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
71d0: 20 20 20 20 20 74 2e 61 74 74 65 6d 70 74 6e 75       t.attemptnu
71e0: 6d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m .             
71f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
7200: 2e 66 69 6e 61 6c 5f 6c 6f 67 66 20 0a 20 20 20  .final_logf .   
7210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7220: 20 20 20 20 20 20 20 20 20 74 2e 6c 6f 67 64 61           t.logda
7230: 74 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20  t     .         
7240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7250: 20 20 20 74 2e 72 75 6e 5f 64 75 72 61 74 69 6f     t.run_duratio
7260: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7270: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 2e 63               t.c
7280: 6f 6d 6d 65 6e 74 20 20 20 20 0a 20 20 20 20 20  omment    .     
7290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72a0: 20 20 20 20 20 20 20 74 2e 65 76 65 6e 74 5f 74         t.event_t
72b0: 69 6d 65 20 0a 20 20 20 20 20 20 20 20 20 20 20  ime .           
72c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72d0: 20 74 2e 66 61 69 6c 5f 63 6f 75 6e 74 20 0a 20   t.fail_count . 
72e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72f0: 20 20 20 20 20 20 20 20 20 20 20 74 2e 70 61 73             t.pas
7300: 73 5f 63 6f 75 6e 74 20 0a 20 20 20 20 20 20 20  s_count .       
7310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7320: 20 20 20 20 20 74 2e 61 72 63 68 69 76 65 64 20       t.archived 
7330: 20 20 0a 0a 0a 0a 20 46 52 4f 4d 20 74 65 73 74    .... FROM test
7340: 73 20 41 53 20 74 20 49 4e 4e 45 52 20 4a 4f 49  s AS t INNER JOI
7350: 4e 20 72 75 6e 73 20 41 53 20 72 20 4f 4e 20 74  N runs AS r ON t
7360: 2e 72 75 6e 5f 69 64 3d 72 2e 69 64 20 57 48 45  .run_id=r.id WHE
7370: 52 45 20 22 0a 09 09 20 20 20 20 20 20 20 6b 65  RE "...       ke
7380: 79 73 74 72 20 22 20 41 4e 44 20 72 2e 72 75 6e  ystr " AND r.run
7390: 6e 61 6d 65 20 4c 49 4b 45 20 27 22 20 72 75 6e  name LIKE '" run
73a0: 6e 61 6d 65 20 22 27 20 41 4e 44 20 69 74 65 6d  name "' AND item
73b0: 5f 70 61 74 68 20 4c 49 4b 45 20 27 22 20 69 74  _path LIKE '" it
73c0: 65 6d 70 61 74 74 20 22 27 20 41 4e 44 20 74 65  empatt "' AND te
73d0: 73 74 6e 61 6d 65 20 4c 49 4b 45 20 27 22 0a 09  stname LIKE '"..
73e0: 09 20 20 20 20 20 20 20 74 65 73 74 70 61 74 74  .       testpatt
73f0: 20 22 27 20 41 4e 44 20 74 2e 73 74 61 74 65 20   "' AND t.state 
7400: 4c 49 4b 45 20 27 22 20 73 74 61 74 65 70 61 74  LIKE '" statepat
7410: 74 20 22 27 20 41 4e 44 20 74 2e 73 74 61 74 75  t "' AND t.statu
7420: 73 20 4c 49 4b 45 20 27 22 20 73 74 61 74 75 73  s LIKE '" status
7430: 70 61 74 74 20 0a 09 09 20 20 20 20 20 20 20 22  patt ...       "
7440: 27 4f 52 44 45 52 20 42 59 20 74 2e 65 76 65 6e  'ORDER BY t.even
7450: 74 5f 74 69 6d 65 20 41 53 43 3b 22 29 29 29 0a  t_time ASC;"))).
7460: 20 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74      (debug:print
7470: 20 33 20 22 71 72 79 73 74 72 3a 20 22 20 71 72   3 "qrystr: " qr
7480: 79 73 74 72 29 0a 20 20 20 20 28 73 71 6c 69 74  ystr).    (sqlit
7490: 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20  e3:for-each-row 
74a0: 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 70  .     (lambda (p
74b0: 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72  ).       (set! r
74c0: 65 73 20 28 63 6f 6e 73 20 70 20 72 65 73 29 29  es (cons p res))
74d0: 29 0a 20 20 20 20 20 64 62 20 0a 20 20 20 20 20  ).     db .     
74e0: 71 72 79 73 74 72 29 0a 20 20 20 20 72 65 73 29  qrystr).    res)
74f0: 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  )..;;===========
7500: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7510: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7520: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7530: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 51  ===========.;; Q
7540: 55 45 55 45 20 55 50 20 4d 45 54 41 2c 20 54 45  UEUE UP META, TE
7550: 53 54 20 53 54 41 54 55 53 20 41 4e 44 20 53 54  ST STATUS AND ST
7560: 45 50 53 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  EPS.;;==========
7570: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7580: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7590: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
75a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64  ============..(d
75b0: 65 66 69 6e 65 20 28 64 62 3a 75 70 64 61 74 65  efine (db:update
75c0: 72 20 64 62 29 0a 20 20 28 6c 65 74 20 6c 6f 6f  r db).  (let loo
75d0: 70 20 28 28 73 74 61 72 74 2d 74 69 6d 65 20 28  p ((start-time (
75e0: 63 75 72 72 65 6e 74 2d 74 69 6d 65 29 29 29 0a  current-time))).
75f0: 20 20 20 20 28 74 68 72 65 61 64 2d 73 6c 65 65      (thread-slee
7600: 70 21 20 30 2e 35 29 20 3b 3b 20 6d 6f 76 65 20  p! 0.5) ;; move 
7610: 73 61 76 65 20 74 69 6d 65 20 61 72 6f 75 6e 64  save time around
7620: 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 72 65 67   to minimize reg
7630: 75 6c 61 72 20 63 6f 6c 6c 69 73 69 6f 6e 73 3f  ular collisions?
7640: 0a 20 20 20 20 28 64 62 3a 77 72 69 74 65 2d 63  .    (db:write-c
7650: 61 63 68 65 64 2d 64 61 74 61 20 64 62 29 0a 20  ached-data db). 
7660: 20 20 20 28 6c 6f 6f 70 20 73 74 61 72 74 2d 74     (loop start-t
7670: 69 6d 65 29 29 29 0a 20 20 20 20 0a 28 64 65 66  ime))).    .(def
7680: 69 6e 65 20 28 64 62 3a 74 65 73 74 2d 75 70 64  ine (db:test-upd
7690: 61 74 65 2d 6d 65 74 61 2d 69 6e 66 6f 20 64 62  ate-meta-info db
76a0: 20 74 65 73 74 2d 69 64 20 6d 69 6e 75 74 65 73   test-id minutes
76b0: 20 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65   cpuload diskfre
76c0: 65 20 74 6d 70 66 72 65 65 29 0a 20 20 28 6d 75  e tmpfree).  (mu
76d0: 74 65 78 2d 6c 6f 63 6b 21 20 2a 69 6e 63 6f 6d  tex-lock! *incom
76e0: 69 6e 67 2d 6d 75 74 65 78 2a 29 0a 20 20 28 73  ing-mutex*).  (s
76f0: 65 74 21 20 2a 69 6e 63 6f 6d 69 6e 67 2d 64 61  et! *incoming-da
7700: 74 61 2a 20 28 63 6f 6e 73 20 28 76 65 63 74 6f  ta* (cons (vecto
7710: 72 20 27 6d 65 74 61 2d 69 6e 66 6f 0a 09 09 09  r 'meta-info....
7720: 09 20 20 20 20 20 20 28 63 75 72 72 65 6e 74 2d  .      (current-
7730: 73 65 63 6f 6e 64 73 29 0a 09 09 09 09 20 20 20  seconds).....   
7740: 20 20 20 28 6c 69 73 74 20 63 70 75 6c 6f 61 64     (list cpuload
7750: 0a 09 09 09 09 09 20 20 20 20 64 69 73 6b 66 72  ......    diskfr
7760: 65 65 0a 09 09 09 09 09 20 20 20 20 6d 69 6e 75  ee......    minu
7770: 74 65 73 0a 09 09 09 09 09 20 20 20 20 74 65 73  tes......    tes
7780: 74 2d 69 64 29 29 20 3b 3b 20 72 75 6e 2d 69 64  t-id)) ;; run-id
7790: 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d   test-name item-
77a0: 70 61 74 68 20 6d 69 6e 75 74 65 73 20 63 70 75  path minutes cpu
77b0: 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20 74 6d  load diskfree tm
77c0: 70 66 72 65 65 29 20 0a 09 09 09 20 20 20 20 20  pfree) ....     
77d0: 20 2a 69 6e 63 6f 6d 69 6e 67 2d 64 61 74 61 2a   *incoming-data*
77e0: 29 29 0a 20 20 28 6d 75 74 65 78 2d 75 6e 6c 6f  )).  (mutex-unlo
77f0: 63 6b 21 20 2a 69 6e 63 6f 6d 69 6e 67 2d 6d 75  ck! *incoming-mu
7800: 74 65 78 2a 29 0a 20 20 28 69 66 20 2a 63 61 63  tex*).  (if *cac
7810: 68 65 2d 6f 6e 2a 0a 20 20 20 20 20 20 28 64 65  he-on*.      (de
7820: 62 75 67 3a 70 72 69 6e 74 20 36 20 22 49 4e 46  bug:print 6 "INF
7830: 4f 3a 20 2a 63 61 63 68 65 2d 6f 6e 2a 20 69 73  O: *cache-on* is
7840: 20 22 20 2a 63 61 63 68 65 2d 6f 6e 2a 20 22 2c   " *cache-on* ",
7850: 20 73 6b 69 70 70 69 6e 67 20 63 61 63 68 65 20   skipping cache 
7860: 77 72 69 74 65 20 61 73 20 70 61 72 74 20 6f 66  write as part of
7870: 20 74 65 73 74 2d 75 70 64 61 74 65 2d 6d 65 74   test-update-met
7880: 61 2d 69 6e 66 6f 22 29 0a 20 20 20 20 20 20 28  a-info").      (
7890: 64 62 3a 77 72 69 74 65 2d 63 61 63 68 65 64 2d  db:write-cached-
78a0: 64 61 74 61 20 64 62 29 29 29 0a 0a 28 64 65 66  data db)))..(def
78b0: 69 6e 65 20 28 64 62 3a 77 72 69 74 65 2d 63 61  ine (db:write-ca
78c0: 63 68 65 64 2d 64 61 74 61 20 64 62 29 0a 20 20  ched-data db).  
78d0: 28 6c 65 74 20 28 28 6d 65 74 61 2d 73 74 6d 74  (let ((meta-stmt
78e0: 20 28 73 71 6c 69 74 65 33 3a 70 72 65 70 61 72   (sqlite3:prepar
78f0: 65 20 64 62 20 22 55 50 44 41 54 45 20 74 65 73  e db "UPDATE tes
7900: 74 73 20 53 45 54 20 63 70 75 6c 6f 61 64 3d 3f  ts SET cpuload=?
7910: 2c 64 69 73 6b 66 72 65 65 3d 3f 2c 72 75 6e 5f  ,diskfree=?,run_
7920: 64 75 72 61 74 69 6f 6e 3d 3f 2c 73 74 61 74 65  duration=?,state
7930: 3d 27 52 55 4e 4e 49 4e 47 27 20 57 48 45 52 45  ='RUNNING' WHERE
7940: 20 69 64 3d 3f 20 41 4e 44 20 73 74 61 74 65 20   id=? AND state 
7950: 4e 4f 54 20 49 4e 20 28 27 43 4f 4d 50 4c 45 54  NOT IN ('COMPLET
7960: 45 44 27 2c 27 4b 49 4c 4c 52 45 51 27 2c 27 4b  ED','KILLREQ','K
7970: 49 4c 4c 45 44 27 29 3b 22 29 29 0a 09 28 73 74  ILLED');"))..(st
7980: 65 70 2d 73 74 6d 74 20 28 73 71 6c 69 74 65 33  ep-stmt (sqlite3
7990: 3a 70 72 65 70 61 72 65 20 64 62 20 22 49 4e 53  :prepare db "INS
79a0: 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 69  ERT OR REPLACE i
79b0: 6e 74 6f 20 74 65 73 74 5f 73 74 65 70 73 20 28  nto test_steps (
79c0: 74 65 73 74 5f 69 64 2c 73 74 65 70 6e 61 6d 65  test_id,stepname
79d0: 2c 73 74 61 74 65 2c 73 74 61 74 75 73 2c 65 76  ,state,status,ev
79e0: 65 6e 74 5f 74 69 6d 65 2c 63 6f 6d 6d 65 6e 74  ent_time,comment
79f0: 2c 6c 6f 67 66 69 6c 65 29 20 56 41 4c 55 45 53  ,logfile) VALUES
7a00: 28 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 29 3b  (?,?,?,?,?,?,?);
7a10: 22 29 29 20 3b 3b 20 73 74 72 66 74 69 6d 65 28  ")) ;; strftime(
7a20: 27 25 73 27 2c 27 6e 6f 77 27 29 23 66 29 0a 09  '%s','now')#f)..
7a30: 28 64 61 74 61 20 28 73 6f 72 74 20 2a 69 6e 63  (data (sort *inc
7a40: 6f 6d 69 6e 67 2d 64 61 74 61 2a 20 28 6c 61 6d  oming-data* (lam
7a50: 62 64 61 20 28 61 20 62 29 28 3c 20 28 76 65 63  bda (a b)(< (vec
7a60: 74 6f 72 2d 72 65 66 20 61 20 31 29 28 76 65 63  tor-ref a 1)(vec
7a70: 74 6f 72 2d 72 65 66 20 62 20 31 29 29 29 29 29  tor-ref b 1)))))
7a80: 29 0a 20 20 20 20 28 69 66 20 28 3e 20 28 6c 65  ).    (if (> (le
7a90: 6e 67 74 68 20 64 61 74 61 29 20 30 29 0a 09 28  ngth data) 0)..(
7aa0: 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22 57  debug:print 4 "W
7ab0: 72 69 74 69 6e 67 20 63 61 63 68 65 64 20 64 61  riting cached da
7ac0: 74 61 20 22 20 64 61 74 61 29 29 0a 20 20 20 20  ta " data)).    
7ad0: 28 6d 75 74 65 78 2d 6c 6f 63 6b 21 20 2a 69 6e  (mutex-lock! *in
7ae0: 63 6f 6d 69 6e 67 2d 6d 75 74 65 78 2a 29 0a 20  coming-mutex*). 
7af0: 20 20 20 28 73 71 6c 69 74 65 33 3a 77 69 74 68     (sqlite3:with
7b00: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a 20 20  -transaction .  
7b10: 20 20 20 64 62 0a 20 20 20 20 20 28 6c 61 6d 62     db.     (lamb
7b20: 64 61 20 28 29 0a 20 20 20 20 20 20 20 28 66 6f  da ().       (fo
7b30: 72 2d 65 61 63 68 20 28 6c 61 6d 62 64 61 20 28  r-each (lambda (
7b40: 65 6e 74 72 79 29 0a 09 09 20 20 20 28 63 61 73  entry)...   (cas
7b50: 65 20 28 76 65 63 74 6f 72 2d 72 65 66 20 65 6e  e (vector-ref en
7b60: 74 72 79 20 30 29 0a 09 09 20 20 20 20 20 28 28  try 0)...     ((
7b70: 6d 65 74 61 2d 69 6e 66 6f 29 0a 09 09 20 20 20  meta-info)...   
7b80: 20 20 20 28 61 70 70 6c 79 20 73 71 6c 69 74 65     (apply sqlite
7b90: 33 3a 65 78 65 63 75 74 65 20 6d 65 74 61 2d 73  3:execute meta-s
7ba0: 74 6d 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20  tmt (vector-ref 
7bb0: 65 6e 74 72 79 20 32 29 29 29 0a 09 09 20 20 20  entry 2)))...   
7bc0: 20 20 28 28 73 74 65 70 2d 73 74 61 74 75 73 29    ((step-status)
7bd0: 0a 09 09 20 20 20 20 20 20 28 61 70 70 6c 79 20  ...      (apply 
7be0: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
7bf0: 73 74 65 70 2d 73 74 6d 74 20 28 76 65 63 74 6f  step-stmt (vecto
7c00: 72 2d 72 65 66 20 65 6e 74 72 79 20 32 29 29 29  r-ref entry 2)))
7c10: 0a 09 09 20 20 20 20 20 28 65 6c 73 65 0a 09 09  ...     (else...
7c20: 20 20 20 20 20 20 28 64 65 62 75 67 3a 70 72 69        (debug:pri
7c30: 6e 74 20 30 20 22 45 52 52 4f 52 3a 20 51 75 65  nt 0 "ERROR: Que
7c40: 75 65 64 20 65 6e 74 72 79 20 6e 6f 74 20 72 65  ued entry not re
7c50: 63 6f 67 6e 69 73 65 64 20 22 20 65 6e 74 72 79  cognised " entry
7c60: 29 29 29 29 0a 09 09 20 64 61 74 61 29 29 29 0a  ))))... data))).
7c70: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 69 6e      (sqlite3:fin
7c80: 61 6c 69 7a 65 21 20 6d 65 74 61 2d 73 74 6d 74  alize! meta-stmt
7c90: 29 20 3b 3b 20 73 71 6c 69 74 65 20 69 73 20 74  ) ;; sqlite is t
7ca0: 68 65 20 62 6f 74 74 6c 65 6e 65 63 6b 2c 20 63  he bottleneck, c
7cb0: 6c 65 61 72 20 74 68 65 20 73 74 61 74 65 6d 65  lear the stateme
7cc0: 6e 74 73 20 61 73 61 70 3f 0a 20 20 20 20 28 73  nts asap?.    (s
7cd0: 71 6c 69 74 65 33 3a 66 69 6e 61 6c 69 7a 65 21  qlite3:finalize!
7ce0: 20 73 74 65 70 2d 73 74 6d 74 29 0a 20 20 20 20   step-stmt).    
7cf0: 28 73 65 74 21 20 2a 69 6e 63 6f 6d 69 6e 67 2d  (set! *incoming-
7d00: 64 61 74 61 2a 20 27 28 29 29 0a 20 20 20 20 28  data* '()).    (
7d10: 6d 75 74 65 78 2d 75 6e 6c 6f 63 6b 21 20 2a 69  mutex-unlock! *i
7d20: 6e 63 6f 6d 69 6e 67 2d 6d 75 74 65 78 2a 29 29  ncoming-mutex*))
7d30: 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 72  )..(define (db:r
7d40: 6f 6c 6c 2d 75 70 2d 70 61 73 73 2d 66 61 69 6c  oll-up-pass-fail
7d50: 2d 63 6f 75 6e 74 73 20 64 62 20 72 75 6e 2d 69  -counts db run-i
7d60: 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d  d test-name item
7d70: 2d 70 61 74 68 20 73 74 61 74 75 73 29 0a 20 20  -path status).  
7d80: 28 69 66 20 28 61 6e 64 20 28 6e 6f 74 20 28 65  (if (and (not (e
7d90: 71 75 61 6c 3f 20 69 74 65 6d 2d 70 61 74 68 20  qual? item-path 
7da0: 22 22 29 29 0a 09 20 20 20 28 6f 72 20 28 65 71  ""))..   (or (eq
7db0: 75 61 6c 3f 20 73 74 61 74 75 73 20 22 50 41 53  ual? status "PAS
7dc0: 53 22 29 0a 09 20 20 20 20 20 20 20 28 65 71 75  S")..       (equ
7dd0: 61 6c 3f 20 73 74 61 74 75 73 20 22 57 41 52 4e  al? status "WARN
7de0: 22 29 0a 09 20 20 20 20 20 20 20 28 65 71 75 61  ")..       (equa
7df0: 6c 3f 20 73 74 61 74 75 73 20 22 46 41 49 4c 22  l? status "FAIL"
7e00: 29 0a 09 20 20 20 20 20 20 20 28 65 71 75 61 6c  )..       (equal
7e10: 3f 20 73 74 61 74 75 73 20 22 57 41 49 56 45 44  ? status "WAIVED
7e20: 22 29 0a 09 20 20 20 20 20 20 20 28 65 71 75 61  ")..       (equa
7e30: 6c 3f 20 73 74 61 74 75 73 20 22 52 55 4e 4e 49  l? status "RUNNI
7e40: 4e 47 22 29 29 29 0a 20 20 20 20 20 20 28 62 65  NG"))).      (be
7e50: 67 69 6e 0a 09 28 73 71 6c 69 74 65 33 3a 65 78  gin..(sqlite3:ex
7e60: 65 63 75 74 65 20 0a 09 20 64 62 0a 09 20 22 55  ecute .. db.. "U
7e70: 50 44 41 54 45 20 74 65 73 74 73 20 0a 20 20 20  PDATE tests .   
7e80: 20 20 20 20 20 20 20 20 20 20 53 45 54 20 66 61            SET fa
7e90: 69 6c 5f 63 6f 75 6e 74 3d 28 53 45 4c 45 43 54  il_count=(SELECT
7ea0: 20 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20   count(id) FROM 
7eb0: 74 65 73 74 73 20 57 48 45 52 45 20 72 75 6e 5f  tests WHERE run_
7ec0: 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d  id=? AND testnam
7ed0: 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74  e=? AND item_pat
7ee0: 68 20 21 3d 20 27 27 20 41 4e 44 20 73 74 61 74  h != '' AND stat
7ef0: 75 73 3d 27 46 41 49 4c 27 29 2c 0a 20 20 20 20  us='FAIL'),.    
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 73               pas
7f10: 73 5f 63 6f 75 6e 74 3d 28 53 45 4c 45 43 54 20  s_count=(SELECT 
7f20: 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 74  count(id) FROM t
7f30: 65 73 74 73 20 57 48 45 52 45 20 72 75 6e 5f 69  ests WHERE run_i
7f40: 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65  d=? AND testname
7f50: 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68  =? AND item_path
7f60: 20 21 3d 20 27 27 20 41 4e 44 20 28 73 74 61 74   != '' AND (stat
7f70: 75 73 3d 27 50 41 53 53 27 20 4f 52 20 73 74 61  us='PASS' OR sta
7f80: 74 75 73 3d 27 57 41 52 4e 27 20 4f 52 20 73 74  tus='WARN' OR st
7f90: 61 74 75 73 3d 27 57 41 49 56 45 44 27 29 29 0a  atus='WAIVED')).
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
7fb0: 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20  RE run_id=? AND 
7fc0: 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69  testname=? AND i
7fd0: 74 65 6d 5f 70 61 74 68 3d 27 27 3b 22 0a 09 20  tem_path='';".. 
7fe0: 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65  run-id test-name
7ff0: 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d   run-id test-nam
8000: 65 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61  e run-id test-na
8010: 6d 65 29 0a 20 20 20 20 20 20 20 20 28 74 68 72  me).        (thr
8020: 65 61 64 2d 73 6c 65 65 70 21 20 30 2e 31 29 20  ead-sleep! 0.1) 
8030: 3b 3b 20 67 69 76 65 20 6f 74 68 65 72 20 70 72  ;; give other pr
8040: 6f 63 65 73 73 65 73 20 61 20 63 68 61 6e 63 65  ocesses a chance
8050: 20 68 65 72 65 0a 09 28 69 66 20 28 65 71 75 61   here..(if (equa
8060: 6c 3f 20 73 74 61 74 75 73 20 22 52 55 4e 4e 49  l? status "RUNNI
8070: 4e 47 22 29 20 3b 3b 20 72 75 6e 6e 69 6e 67 20  NG") ;; running 
8080: 74 61 6b 65 73 20 70 72 69 6f 72 69 74 79 20 6f  takes priority o
8090: 76 65 72 20 61 6c 6c 20 6f 74 68 65 72 20 73 74  ver all other st
80a0: 61 74 65 73 2c 20 66 6f 72 63 65 20 74 68 65 20  ates, force the 
80b0: 74 65 73 74 20 73 74 61 74 65 20 74 6f 20 52 55  test state to RU
80c0: 4e 4e 49 4e 47 0a 09 20 20 20 20 28 73 71 6c 69  NNING..    (sqli
80d0: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22  te3:execute db "
80e0: 55 50 44 41 54 45 20 74 65 73 74 73 20 53 45 54  UPDATE tests SET
80f0: 20 73 74 61 74 65 3d 3f 20 57 48 45 52 45 20 72   state=? WHERE r
8100: 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74  un_id=? AND test
8110: 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f  name=? AND item_
8120: 70 61 74 68 3d 27 27 3b 22 20 22 52 55 4e 4e 49  path='';" "RUNNI
8130: 4e 47 22 20 72 75 6e 2d 69 64 20 74 65 73 74 2d  NG" run-id test-
8140: 6e 61 6d 65 29 0a 09 20 20 20 20 28 73 71 6c 69  name)..    (sqli
8150: 74 65 33 3a 65 78 65 63 75 74 65 0a 09 20 20 20  te3:execute..   
8160: 20 20 64 62 0a 09 20 20 20 20 20 22 55 50 44 41    db..     "UPDA
8170: 54 45 20 74 65 73 74 73 0a 20 20 20 20 20 20 20  TE tests.       
8180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8190: 53 45 54 20 73 74 61 74 65 3d 43 41 53 45 20 57  SET state=CASE W
81a0: 48 45 4e 20 28 53 45 4c 45 43 54 20 63 6f 75 6e  HEN (SELECT coun
81b0: 74 28 69 64 29 20 46 52 4f 4d 20 74 65 73 74 73  t(id) FROM tests
81c0: 20 57 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20   WHERE run_id=? 
81d0: 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41  AND testname=? A
81e0: 4e 44 20 69 74 65 6d 5f 70 61 74 68 20 21 3d 20  ND item_path != 
81f0: 27 27 20 41 4e 44 20 73 74 61 74 65 20 69 6e 20  '' AND state in 
8200: 28 27 52 55 4e 4e 49 4e 47 27 2c 27 4e 4f 54 5f  ('RUNNING','NOT_
8210: 53 54 41 52 54 45 44 27 29 29 20 3e 20 30 20 54  STARTED')) > 0 T
8220: 48 45 4e 20 0a 20 20 20 20 20 20 20 20 20 20 20  HEN .           
8230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 27                 '
8240: 52 55 4e 4e 49 4e 47 27 0a 20 20 20 20 20 20 20  RUNNING'.       
8250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8260: 45 4c 53 45 20 27 43 4f 4d 50 4c 45 54 45 44 27  ELSE 'COMPLETED'
8270: 20 45 4e 44 2c 0a 20 20 20 20 20 20 20 20 20 20   END,.          
8280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8290: 73 74 61 74 75 73 3d 43 41 53 45 20 57 48 45 4e  status=CASE WHEN
82a0: 20 66 61 69 6c 5f 63 6f 75 6e 74 20 3e 20 30 20   fail_count > 0 
82b0: 54 48 45 4e 20 27 46 41 49 4c 27 20 57 48 45 4e  THEN 'FAIL' WHEN
82c0: 20 70 61 73 73 5f 63 6f 75 6e 74 20 3e 20 30 20   pass_count > 0 
82d0: 41 4e 44 20 66 61 69 6c 5f 63 6f 75 6e 74 3d 30  AND fail_count=0
82e0: 20 54 48 45 4e 20 27 50 41 53 53 27 20 45 4c 53   THEN 'PASS' ELS
82f0: 45 20 27 55 4e 4b 4e 4f 57 4e 27 20 45 4e 44 0a  E 'UNKNOWN' END.
8300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8310: 20 20 20 20 20 20 20 57 48 45 52 45 20 72 75 6e         WHERE run
8320: 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61  _id=? AND testna
8330: 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61  me=? AND item_pa
8340: 74 68 3d 27 27 3b 22 0a 09 20 20 20 20 20 72 75  th='';"..     ru
8350: 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 72  n-id test-name r
8360: 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 29  un-id test-name)
8370: 29 0a 09 23 66 29 0a 20 20 20 20 20 20 23 66 29  )..#f).      #f)
8380: 29 0a 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  )...;;==========
8390: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
83a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
83b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
83c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20  ============.;; 
83d0: 54 65 73 74 73 20 6d 65 74 61 20 64 61 74 61 0a  Tests meta data.
83e0: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
83f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8400: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8410: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8420: 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 72 65 61  ========..;; rea
8430: 64 20 74 68 65 20 72 65 63 6f 72 64 20 67 69 76  d the record giv
8440: 65 6e 20 61 20 74 65 73 74 6e 61 6d 65 0a 28 64  en a testname.(d
8450: 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74 6d 65  efine (db:testme
8460: 74 61 2d 67 65 74 2d 72 65 63 6f 72 64 20 64 62  ta-get-record db
8470: 20 74 65 73 74 6e 61 6d 65 29 0a 20 20 28 6c 65   testname).  (le
8480: 74 20 28 28 72 65 73 20 23 66 29 29 0a 20 20 20  t ((res #f)).   
8490: 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61   (sqlite3:for-ea
84a0: 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d  ch-row.     (lam
84b0: 62 64 61 20 28 69 64 20 74 65 73 74 6e 61 6d 65  bda (id testname
84c0: 20 61 75 74 68 6f 72 20 6f 77 6e 65 72 20 64 65   author owner de
84d0: 73 63 72 69 70 74 69 6f 6e 20 72 65 76 69 65 77  scription review
84e0: 65 64 20 69 74 65 72 61 74 65 64 20 61 76 67 5f  ed iterated avg_
84f0: 72 75 6e 74 69 6d 65 20 61 76 67 5f 64 69 73 6b  runtime avg_disk
8500: 20 74 61 67 73 29 0a 20 20 20 20 20 20 20 28 73   tags).       (s
8510: 65 74 21 20 72 65 73 20 28 76 65 63 74 6f 72 20  et! res (vector 
8520: 69 64 20 74 65 73 74 6e 61 6d 65 20 61 75 74 68  id testname auth
8530: 6f 72 20 6f 77 6e 65 72 20 64 65 73 63 72 69 70  or owner descrip
8540: 74 69 6f 6e 20 72 65 76 69 65 77 65 64 20 69 74  tion reviewed it
8550: 65 72 61 74 65 64 20 61 76 67 5f 72 75 6e 74 69  erated avg_runti
8560: 6d 65 20 61 76 67 5f 64 69 73 6b 20 74 61 67 73  me avg_disk tags
8570: 29 29 29 0a 20 20 20 20 20 64 62 20 22 53 45 4c  ))).     db "SEL
8580: 45 43 54 20 69 64 2c 74 65 73 74 6e 61 6d 65 2c  ECT id,testname,
8590: 61 75 74 68 6f 72 2c 6f 77 6e 65 72 2c 64 65 73  author,owner,des
85a0: 63 72 69 70 74 69 6f 6e 2c 72 65 76 69 65 77 65  cription,reviewe
85b0: 64 2c 69 74 65 72 61 74 65 64 2c 61 76 67 5f 72  d,iterated,avg_r
85c0: 75 6e 74 69 6d 65 2c 61 76 67 5f 64 69 73 6b 2c  untime,avg_disk,
85d0: 74 61 67 73 20 46 52 4f 4d 20 74 65 73 74 5f 6d  tags FROM test_m
85e0: 65 74 61 20 57 48 45 52 45 20 74 65 73 74 6e 61  eta WHERE testna
85f0: 6d 65 3d 3f 3b 22 0a 20 20 20 20 20 74 65 73 74  me=?;".     test
8600: 6e 61 6d 65 29 0a 20 20 20 20 72 65 73 29 29 0a  name).    res)).
8610: 0a 3b 3b 20 63 72 65 61 74 65 20 61 20 6e 65 77  .;; create a new
8620: 20 72 65 63 6f 72 64 20 66 6f 72 20 61 20 67 69   record for a gi
8630: 76 65 6e 20 74 65 73 74 6e 61 6d 65 0a 28 64 65  ven testname.(de
8640: 66 69 6e 65 20 28 64 62 3a 74 65 73 74 6d 65 74  fine (db:testmet
8650: 61 2d 61 64 64 2d 72 65 63 6f 72 64 20 64 62 20  a-add-record db 
8660: 74 65 73 74 6e 61 6d 65 29 0a 20 20 28 73 71 6c  testname).  (sql
8670: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
8680: 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52  "INSERT OR IGNOR
8690: 45 20 49 4e 54 4f 20 74 65 73 74 5f 6d 65 74 61  E INTO test_meta
86a0: 20 28 74 65 73 74 6e 61 6d 65 2c 61 75 74 68 6f   (testname,autho
86b0: 72 2c 6f 77 6e 65 72 2c 64 65 73 63 72 69 70 74  r,owner,descript
86c0: 69 6f 6e 2c 72 65 76 69 65 77 65 64 2c 69 74 65  ion,reviewed,ite
86d0: 72 61 74 65 64 2c 61 76 67 5f 72 75 6e 74 69 6d  rated,avg_runtim
86e0: 65 2c 61 76 67 5f 64 69 73 6b 2c 74 61 67 73 29  e,avg_disk,tags)
86f0: 20 56 41 4c 55 45 53 20 28 3f 2c 27 27 2c 27 27   VALUES (?,'',''
8700: 2c 27 27 2c 27 27 2c 27 27 2c 27 27 2c 27 27 2c  ,'','','','','',
8710: 27 27 29 3b 22 20 74 65 73 74 6e 61 6d 65 29 29  '');" testname))
8720: 0a 0a 3b 3b 20 75 70 64 61 74 65 20 6f 6e 65 20  ..;; update one 
8730: 6f 66 20 74 68 65 20 74 65 73 74 6d 65 74 61 20  of the testmeta 
8740: 66 69 65 6c 64 73 0a 28 64 65 66 69 6e 65 20 28  fields.(define (
8750: 64 62 3a 74 65 73 74 6d 65 74 61 2d 75 70 64 61  db:testmeta-upda
8760: 74 65 2d 66 69 65 6c 64 20 64 62 20 74 65 73 74  te-field db test
8770: 6e 61 6d 65 20 66 69 65 6c 64 20 76 61 6c 75 65  name field value
8780: 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65  ).  (sqlite3:exe
8790: 63 75 74 65 20 64 62 20 28 63 6f 6e 63 20 22 55  cute db (conc "U
87a0: 50 44 41 54 45 20 74 65 73 74 5f 6d 65 74 61 20  PDATE test_meta 
87b0: 53 45 54 20 22 20 66 69 65 6c 64 20 22 3d 3f 20  SET " field "=? 
87c0: 57 48 45 52 45 20 74 65 73 74 6e 61 6d 65 3d 3f  WHERE testname=?
87d0: 3b 22 29 20 76 61 6c 75 65 20 74 65 73 74 6e 61  ;") value testna
87e0: 6d 65 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d  me))..;;========
87f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8800: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8810: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8820: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b  ==============.;
8830: 3b 20 54 20 45 20 53 20 54 20 20 20 44 20 41 20  ; T E S T   D A 
8840: 54 20 41 20 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d  T A .;;=========
8850: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8860: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8870: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8880: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28  =============..(
8890: 64 65 66 69 6e 65 20 28 64 62 3a 63 73 76 2d 3e  define (db:csv->
88a0: 74 65 73 74 2d 64 61 74 61 20 64 62 20 74 65 73  test-data db tes
88b0: 74 2d 69 64 20 63 73 76 64 61 74 61 29 0a 20 20  t-id csvdata).  
88c0: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22  (debug:print 4 "
88d0: 74 65 73 74 2d 69 64 20 22 20 74 65 73 74 2d 69  test-id " test-i
88e0: 64 20 22 2c 20 63 73 76 64 61 74 61 3a 20 22 20  d ", csvdata: " 
88f0: 63 73 76 64 61 74 61 29 0a 20 20 28 6c 65 74 20  csvdata).  (let 
8900: 28 28 63 73 76 6c 69 73 74 20 28 63 73 76 2d 3e  ((csvlist (csv->
8910: 6c 69 73 74 20 28 6d 61 6b 65 2d 63 73 76 2d 72  list (make-csv-r
8920: 65 61 64 65 72 0a 09 09 09 20 20 20 20 20 28 6f  eader....     (o
8930: 70 65 6e 2d 69 6e 70 75 74 2d 73 74 72 69 6e 67  pen-input-string
8940: 20 63 73 76 64 61 74 61 29 0a 09 09 09 20 20 20   csvdata)....   
8950: 20 20 27 28 28 73 74 72 69 70 2d 6c 65 61 64 69    '((strip-leadi
8960: 6e 67 2d 77 68 69 74 65 73 70 61 63 65 3f 20 23  ng-whitespace? #
8970: 74 29 0a 09 09 09 20 20 20 20 20 20 20 28 73 74  t)....       (st
8980: 72 69 70 2d 74 72 61 69 6c 69 6e 67 2d 77 68 69  rip-trailing-whi
8990: 74 65 73 70 61 63 65 3f 20 23 74 29 29 20 29 29  tespace? #t)) ))
89a0: 29 29 20 3b 3b 20 28 63 73 76 2d 3e 6c 69 73 74  )) ;; (csv->list
89b0: 20 63 73 76 64 61 74 61 29 29 29 0a 20 20 20 20   csvdata))).    
89c0: 28 66 6f 72 2d 65 61 63 68 20 0a 20 20 20 20 20  (for-each .     
89d0: 28 6c 61 6d 62 64 61 20 28 63 73 76 72 6f 77 29  (lambda (csvrow)
89e0: 0a 20 20 20 20 20 20 20 28 6c 65 74 2a 20 28 28  .       (let* ((
89f0: 70 61 64 64 65 64 2d 72 6f 77 20 20 28 74 61 6b  padded-row  (tak
8a00: 65 20 28 61 70 70 65 6e 64 20 63 73 76 72 6f 77  e (append csvrow
8a10: 20 28 6c 69 73 74 20 23 66 20 23 66 20 23 66 20   (list #f #f #f 
8a20: 23 66 20 23 66 20 23 66 20 23 66 20 23 66 20 23  #f #f #f #f #f #
8a30: 66 29 29 20 39 29 29 0a 09 20 20 20 20 20 20 28  f)) 9))..      (
8a40: 63 61 74 65 67 6f 72 79 20 20 20 20 28 6c 69 73  category    (lis
8a50: 74 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77  t-ref padded-row
8a60: 20 30 29 29 0a 09 20 20 20 20 20 20 28 76 61 72   0))..      (var
8a70: 69 61 62 6c 65 20 20 20 20 28 6c 69 73 74 2d 72  iable    (list-r
8a80: 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20 31 29  ef padded-row 1)
8a90: 29 0a 09 20 20 20 20 20 20 28 76 61 6c 75 65 20  )..      (value 
8aa0: 20 20 20 20 20 20 28 61 6e 79 2d 3e 6e 75 6d 62        (any->numb
8ab0: 65 72 2d 69 66 2d 70 6f 73 73 69 62 6c 65 20 28  er-if-possible (
8ac0: 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d  list-ref padded-
8ad0: 72 6f 77 20 32 29 29 29 0a 09 20 20 20 20 20 20  row 2)))..      
8ae0: 28 65 78 70 65 63 74 65 64 20 20 20 20 28 61 6e  (expected    (an
8af0: 79 2d 3e 6e 75 6d 62 65 72 2d 69 66 2d 70 6f 73  y->number-if-pos
8b00: 73 69 62 6c 65 20 28 6c 69 73 74 2d 72 65 66 20  sible (list-ref 
8b10: 70 61 64 64 65 64 2d 72 6f 77 20 33 29 29 29 0a  padded-row 3))).
8b20: 09 20 20 20 20 20 20 28 74 6f 6c 20 20 20 20 20  .      (tol     
8b30: 20 20 20 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72      (any->number
8b40: 2d 69 66 2d 70 6f 73 73 69 62 6c 65 20 28 6c 69  -if-possible (li
8b50: 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f  st-ref padded-ro
8b60: 77 20 34 29 29 29 20 3b 3b 20 3e 2c 20 3c 2c 20  w 4))) ;; >, <, 
8b70: 3e 3d 2c 20 3c 3d 2c 20 6f 72 20 61 20 6e 75 6d  >=, <=, or a num
8b80: 62 65 72 0a 09 20 20 20 20 20 20 28 75 6e 69 74  ber..      (unit
8b90: 73 20 20 20 20 20 20 20 28 6c 69 73 74 2d 72 65  s       (list-re
8ba0: 66 20 70 61 64 64 65 64 2d 72 6f 77 20 35 29 29  f padded-row 5))
8bb0: 0a 09 20 20 20 20 20 20 28 63 6f 6d 6d 65 6e 74  ..      (comment
8bc0: 20 20 20 20 20 28 6c 69 73 74 2d 72 65 66 20 70       (list-ref p
8bd0: 61 64 64 65 64 2d 72 6f 77 20 36 29 29 0a 09 20  added-row 6)).. 
8be0: 20 20 20 20 20 28 73 74 61 74 75 73 20 20 20 20       (status    
8bf0: 20 20 28 6c 65 74 20 28 28 73 20 28 6c 69 73 74    (let ((s (list
8c00: 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20  -ref padded-row 
8c10: 37 29 29 29 0a 09 09 09 20 20 20 20 20 28 69 66  7)))....     (if
8c20: 20 28 61 6e 64 20 28 73 74 72 69 6e 67 3f 20 73   (and (string? s
8c30: 29 28 6f 72 20 28 73 74 72 69 6e 67 2d 6d 61 74  )(or (string-mat
8c40: 63 68 20 28 72 65 67 65 78 70 20 22 5e 5c 5c 73  ch (regexp "^\\s
8c50: 2a 24 22 29 20 73 29 0a 09 09 09 09 09 09 20 20  *$") s).......  
8c60: 20 20 20 28 73 74 72 69 6e 67 2d 6d 61 74 63 68     (string-match
8c70: 20 28 72 65 67 65 78 70 20 22 5e 6e 2f 61 24 22   (regexp "^n/a$"
8c80: 29 20 73 29 29 29 0a 09 09 09 09 20 23 66 0a 09  ) s)))..... #f..
8c90: 09 09 09 20 73 29 29 29 20 3b 3b 20 69 66 20 73  ... s))) ;; if s
8ca0: 70 65 63 69 66 69 65 64 20 6f 6e 20 74 68 65 20  pecified on the 
8cb0: 69 6e 70 75 74 20 74 68 65 6e 20 75 73 65 2c 20  input then use, 
8cc0: 65 6c 73 65 20 63 61 6c 63 75 6c 61 74 65 0a 09  else calculate..
8cd0: 20 20 20 20 20 20 28 74 79 70 65 20 20 20 20 20        (type     
8ce0: 20 20 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64     (list-ref pad
8cf0: 64 65 64 2d 72 6f 77 20 38 29 29 29 0a 09 20 3b  ded-row 8))).. ;
8d00: 3b 20 6c 6f 6f 6b 20 75 70 20 65 78 70 65 63 74  ; look up expect
8d10: 65 64 2c 74 6f 6c 2c 75 6e 69 74 73 20 66 72 6f  ed,tol,units fro
8d20: 6d 20 70 72 65 76 69 6f 75 73 20 62 65 73 74 20  m previous best 
8d30: 66 69 74 20 74 65 73 74 20 69 66 20 74 68 65 79  fit test if they
8d40: 20 61 72 65 20 61 6c 6c 20 65 69 74 68 65 72 20   are all either 
8d50: 23 66 20 6f 72 20 27 27 0a 09 20 28 64 65 62 75  #f or ''.. (debu
8d60: 67 3a 70 72 69 6e 74 20 34 20 22 42 45 46 4f 52  g:print 4 "BEFOR
8d70: 45 3a 20 63 61 74 65 67 6f 72 79 3a 20 22 20 63  E: category: " c
8d80: 61 74 65 67 6f 72 79 20 22 20 76 61 72 69 61 62  ategory " variab
8d90: 6c 65 3a 20 22 20 76 61 72 69 61 62 6c 65 20 22  le: " variable "
8da0: 20 76 61 6c 75 65 3a 20 22 20 76 61 6c 75 65 20   value: " value 
8db0: 0a 09 09 20 20 20 20 20 20 22 2c 20 65 78 70 65  ...      ", expe
8dc0: 63 74 65 64 3a 20 22 20 65 78 70 65 63 74 65 64  cted: " expected
8dd0: 20 22 20 74 6f 6c 3a 20 22 20 74 6f 6c 20 22 20   " tol: " tol " 
8de0: 75 6e 69 74 73 3a 20 22 20 75 6e 69 74 73 20 22  units: " units "
8df0: 20 73 74 61 74 75 73 3a 20 22 20 73 74 61 74 75   status: " statu
8e00: 73 20 22 20 63 6f 6d 6d 65 6e 74 3a 20 22 20 63  s " comment: " c
8e10: 6f 6d 6d 65 6e 74 20 22 20 74 79 70 65 3a 20 22  omment " type: "
8e20: 20 74 79 70 65 29 0a 0a 09 20 28 69 66 20 28 61   type)... (if (a
8e30: 6e 64 20 28 6f 72 20 28 6e 6f 74 20 65 78 70 65  nd (or (not expe
8e40: 63 74 65 64 29 28 65 71 75 61 6c 3f 20 65 78 70  cted)(equal? exp
8e50: 65 63 74 65 64 20 22 22 29 29 0a 09 09 20 20 28  ected ""))...  (
8e60: 6f 72 20 28 6e 6f 74 20 74 6f 6c 29 20 20 20 20  or (not tol)    
8e70: 20 28 65 71 75 61 6c 3f 20 65 78 70 65 63 74 65   (equal? expecte
8e80: 64 20 22 22 29 29 0a 09 09 20 20 28 6f 72 20 28  d ""))...  (or (
8e90: 6e 6f 74 20 75 6e 69 74 73 29 20 20 20 28 65 71  not units)   (eq
8ea0: 75 61 6c 3f 20 65 78 70 65 63 74 65 64 20 22 22  ual? expected ""
8eb0: 29 29 29 0a 09 20 20 20 20 20 28 6c 65 74 2d 76  )))..     (let-v
8ec0: 61 6c 75 65 73 20 28 28 28 6e 65 77 2d 65 78 70  alues (((new-exp
8ed0: 65 63 74 65 64 20 6e 65 77 2d 74 6f 6c 20 6e 65  ected new-tol ne
8ee0: 77 2d 75 6e 69 74 73 29 28 64 62 3a 67 65 74 2d  w-units)(db:get-
8ef0: 70 72 65 76 2d 74 6f 6c 2d 66 6f 72 2d 74 65 73  prev-tol-for-tes
8f00: 74 20 64 62 20 74 65 73 74 2d 69 64 20 63 61 74  t db test-id cat
8f10: 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65 29 29  egory variable))
8f20: 29 0a 09 09 09 20 28 73 65 74 21 20 65 78 70 65  ).... (set! expe
8f30: 63 74 65 64 20 6e 65 77 2d 65 78 70 65 63 74 65  cted new-expecte
8f40: 64 29 0a 09 09 09 20 28 73 65 74 21 20 74 6f 6c  d).... (set! tol
8f50: 20 20 20 20 20 20 6e 65 77 2d 74 6f 6c 29 0a 09        new-tol)..
8f60: 09 09 20 28 73 65 74 21 20 75 6e 69 74 73 20 20  .. (set! units  
8f70: 20 20 6e 65 77 2d 75 6e 69 74 73 29 29 29 0a 0a    new-units)))..
8f80: 09 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34  . (debug:print 4
8f90: 20 22 41 46 54 45 52 3a 20 20 63 61 74 65 67 6f   "AFTER:  catego
8fa0: 72 79 3a 20 22 20 63 61 74 65 67 6f 72 79 20 22  ry: " category "
8fb0: 20 76 61 72 69 61 62 6c 65 3a 20 22 20 76 61 72   variable: " var
8fc0: 69 61 62 6c 65 20 22 20 76 61 6c 75 65 3a 20 22  iable " value: "
8fd0: 20 76 61 6c 75 65 20 0a 09 09 20 20 20 20 20 20   value ...      
8fe0: 22 2c 20 65 78 70 65 63 74 65 64 3a 20 22 20 65  ", expected: " e
8ff0: 78 70 65 63 74 65 64 20 22 20 74 6f 6c 3a 20 22  xpected " tol: "
9000: 20 74 6f 6c 20 22 20 75 6e 69 74 73 3a 20 22 20   tol " units: " 
9010: 75 6e 69 74 73 20 22 20 73 74 61 74 75 73 3a 20  units " status: 
9020: 22 20 73 74 61 74 75 73 20 22 20 63 6f 6d 6d 65  " status " comme
9030: 6e 74 3a 20 22 20 63 6f 6d 6d 65 6e 74 29 0a 09  nt: " comment)..
9040: 20 3b 3b 20 63 61 6c 63 75 6c 61 74 65 20 73 74   ;; calculate st
9050: 61 74 75 73 20 69 66 20 4e 4f 54 20 73 70 65 63  atus if NOT spec
9060: 69 66 69 65 64 0a 09 20 28 69 66 20 28 61 6e 64  ified.. (if (and
9070: 20 28 6e 6f 74 20 73 74 61 74 75 73 29 28 6e 75   (not status)(nu
9080: 6d 62 65 72 3f 20 65 78 70 65 63 74 65 64 29 28  mber? expected)(
9090: 6e 75 6d 62 65 72 3f 20 76 61 6c 75 65 29 29 20  number? value)) 
90a0: 3b 3b 20 6e 65 65 64 20 65 78 70 65 63 74 65 64  ;; need expected
90b0: 20 61 6e 64 20 76 61 6c 75 65 20 74 6f 20 62 65   and value to be
90c0: 20 6e 75 6d 62 65 72 73 0a 09 20 20 20 20 20 28   numbers..     (
90d0: 69 66 20 28 6e 75 6d 62 65 72 3f 20 74 6f 6c 29  if (number? tol)
90e0: 20 3b 3b 20 69 66 20 74 6f 6c 20 69 73 20 61 20   ;; if tol is a 
90f0: 6e 75 6d 62 65 72 20 74 68 65 6e 20 77 65 20 64  number then we d
9100: 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 63  o the standard c
9110: 6f 6d 70 61 72 69 73 6f 6e 0a 09 09 20 28 6c 65  omparison... (le
9120: 74 2a 20 28 28 6d 61 78 2d 76 61 6c 20 28 2b 20  t* ((max-val (+ 
9130: 65 78 70 65 63 74 65 64 20 74 6f 6c 29 29 0a 09  expected tol))..
9140: 09 09 28 6d 69 6e 2d 76 61 6c 20 28 2d 20 65 78  ..(min-val (- ex
9150: 70 65 63 74 65 64 20 74 6f 6c 29 29 0a 09 09 09  pected tol))....
9160: 28 72 65 73 75 6c 74 20 20 28 61 6e 64 20 28 3e  (result  (and (>
9170: 3d 20 20 76 61 6c 75 65 20 6d 69 6e 2d 76 61 6c  =  value min-val
9180: 29 28 3c 3d 20 76 61 6c 75 65 20 6d 61 78 2d 76  )(<= value max-v
9190: 61 6c 29 29 29 29 0a 09 09 20 20 20 28 64 65 62  al))))...   (deb
91a0: 75 67 3a 70 72 69 6e 74 20 34 20 22 6d 61 78 2d  ug:print 4 "max-
91b0: 76 61 6c 3a 20 22 20 6d 61 78 2d 76 61 6c 20 22  val: " max-val "
91c0: 20 6d 69 6e 2d 76 61 6c 3a 20 22 20 6d 69 6e 2d   min-val: " min-
91d0: 76 61 6c 20 22 20 72 65 73 75 6c 74 3a 20 22 20  val " result: " 
91e0: 72 65 73 75 6c 74 29 0a 09 09 20 20 20 28 73 65  result)...   (se
91f0: 74 21 20 73 74 61 74 75 73 20 28 69 66 20 72 65  t! status (if re
9200: 73 75 6c 74 20 22 70 61 73 73 22 20 22 66 61 69  sult "pass" "fai
9210: 6c 22 29 29 29 0a 09 09 20 28 73 65 74 21 20 73  l")))... (set! s
9220: 74 61 74 75 73 20 3b 3b 20 4e 42 2f 2f 20 6e 65  tatus ;; NB// ne
9230: 65 64 20 74 6f 20 61 73 73 65 73 73 20 65 61 63  ed to assess eac
9240: 68 20 6f 6e 65 20 28 69 2e 65 2e 20 6e 6f 74 20  h one (i.e. not 
9250: 72 65 74 75 72 6e 20 6f 70 65 72 61 74 6f 72 20  return operator 
9260: 73 69 6e 63 65 20 6e 65 65 64 20 74 6f 20 61 63  since need to ac
9270: 74 20 69 66 20 6e 6f 74 20 76 61 6c 69 64 20 6f  t if not valid o
9280: 70 2e 0a 09 09 20 20 20 20 20 20 20 28 63 61 73  p....       (cas
9290: 65 20 28 73 74 72 69 6e 67 2d 3e 73 79 6d 62 6f  e (string->symbo
92a0: 6c 20 74 6f 6c 29 20 3b 3b 20 74 6f 6c 20 73 68  l tol) ;; tol sh
92b0: 6f 75 6c 64 20 62 65 20 3e 2c 20 3c 2c 20 3e 3d  ould be >, <, >=
92c0: 2c 20 3c 3d 0a 09 09 09 20 28 28 3e 29 20 20 28  , <=.... ((>)  (
92d0: 69 66 20 28 3e 20 20 76 61 6c 75 65 20 65 78 70  if (>  value exp
92e0: 65 63 74 65 64 29 20 22 70 61 73 73 22 20 22 66  ected) "pass" "f
92f0: 61 69 6c 22 29 29 0a 09 09 09 20 28 28 3c 29 20  ail")).... ((<) 
9300: 20 28 69 66 20 28 3c 20 20 76 61 6c 75 65 20 65   (if (<  value e
9310: 78 70 65 63 74 65 64 29 20 22 70 61 73 73 22 20  xpected) "pass" 
9320: 22 66 61 69 6c 22 29 29 0a 09 09 09 20 28 28 3e  "fail")).... ((>
9330: 3d 29 20 28 69 66 20 28 3e 3d 20 76 61 6c 75 65  =) (if (>= value
9340: 20 65 78 70 65 63 74 65 64 29 20 22 70 61 73 73   expected) "pass
9350: 22 20 22 66 61 69 6c 22 29 29 0a 09 09 09 20 28  " "fail")).... (
9360: 28 3c 3d 29 20 28 69 66 20 28 3c 3d 20 76 61 6c  (<=) (if (<= val
9370: 75 65 20 65 78 70 65 63 74 65 64 29 20 22 70 61  ue expected) "pa
9380: 73 73 22 20 22 66 61 69 6c 22 29 29 0a 09 09 09  ss" "fail"))....
9390: 20 28 65 6c 73 65 20 28 63 6f 6e 63 20 22 45 52   (else (conc "ER
93a0: 52 4f 52 3a 20 62 61 64 20 74 6f 6c 20 63 6f 6d  ROR: bad tol com
93b0: 70 61 72 61 74 6f 72 20 22 20 74 6f 6c 29 29 29  parator " tol)))
93c0: 29 29 29 0a 09 20 28 64 65 62 75 67 3a 70 72 69  ))).. (debug:pri
93d0: 6e 74 20 34 20 22 41 46 54 45 52 32 3a 20 63 61  nt 4 "AFTER2: ca
93e0: 74 65 67 6f 72 79 3a 20 22 20 63 61 74 65 67 6f  tegory: " catego
93f0: 72 79 20 22 20 76 61 72 69 61 62 6c 65 3a 20 22  ry " variable: "
9400: 20 76 61 72 69 61 62 6c 65 20 22 20 76 61 6c 75   variable " valu
9410: 65 3a 20 22 20 76 61 6c 75 65 20 0a 09 09 20 20  e: " value ...  
9420: 20 20 20 20 22 2c 20 65 78 70 65 63 74 65 64 3a      ", expected:
9430: 20 22 20 65 78 70 65 63 74 65 64 20 22 20 74 6f   " expected " to
9440: 6c 3a 20 22 20 74 6f 6c 20 22 20 75 6e 69 74 73  l: " tol " units
9450: 3a 20 22 20 75 6e 69 74 73 20 22 20 73 74 61 74  : " units " stat
9460: 75 73 3a 20 22 20 73 74 61 74 75 73 20 22 20 63  us: " status " c
9470: 6f 6d 6d 65 6e 74 3a 20 22 20 63 6f 6d 6d 65 6e  omment: " commen
9480: 74 29 0a 09 20 28 73 71 6c 69 74 65 33 3a 65 78  t).. (sqlite3:ex
9490: 65 63 75 74 65 20 64 62 20 22 49 4e 53 45 52 54  ecute db "INSERT
94a0: 20 4f 52 20 52 45 50 4c 41 43 45 20 49 4e 54 4f   OR REPLACE INTO
94b0: 20 74 65 73 74 5f 64 61 74 61 20 28 74 65 73 74   test_data (test
94c0: 5f 69 64 2c 63 61 74 65 67 6f 72 79 2c 76 61 72  _id,category,var
94d0: 69 61 62 6c 65 2c 76 61 6c 75 65 2c 65 78 70 65  iable,value,expe
94e0: 63 74 65 64 2c 74 6f 6c 2c 75 6e 69 74 73 2c 63  cted,tol,units,c
94f0: 6f 6d 6d 65 6e 74 2c 73 74 61 74 75 73 2c 74 79  omment,status,ty
9500: 70 65 29 20 56 41 4c 55 45 53 20 28 3f 2c 3f 2c  pe) VALUES (?,?,
9510: 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 29  ?,?,?,?,?,?,?,?)
9520: 3b 22 0a 09 09 09 20 20 74 65 73 74 2d 69 64 20  ;"....  test-id 
9530: 63 61 74 65 67 6f 72 79 20 76 61 72 69 61 62 6c  category variabl
9540: 65 20 76 61 6c 75 65 20 65 78 70 65 63 74 65 64  e value expected
9550: 20 74 6f 6c 20 75 6e 69 74 73 20 28 69 66 20 63   tol units (if c
9560: 6f 6d 6d 65 6e 74 20 63 6f 6d 6d 65 6e 74 20 22  omment comment "
9570: 22 29 20 73 74 61 74 75 73 20 74 79 70 65 29 29  ") status type))
9580: 29 0a 20 20 20 20 20 63 73 76 6c 69 73 74 29 29  ).     csvlist))
9590: 29 0a 0a 3b 3b 20 67 65 74 20 61 20 6c 69 73 74  )..;; get a list
95a0: 20 6f 66 20 74 65 73 74 5f 64 61 74 61 20 72 65   of test_data re
95b0: 63 6f 72 64 73 20 6d 61 74 63 68 69 6e 67 20 63  cords matching c
95c0: 61 74 65 67 6f 72 79 70 61 74 74 0a 28 64 65 66  ategorypatt.(def
95d0: 69 6e 65 20 28 64 62 3a 72 65 61 64 2d 74 65 73  ine (db:read-tes
95e0: 74 2d 64 61 74 61 20 64 62 20 74 65 73 74 2d 69  t-data db test-i
95f0: 64 20 63 61 74 65 67 6f 72 79 70 61 74 74 29 0a  d categorypatt).
9600: 20 20 28 6c 65 74 20 28 28 72 65 73 20 27 28 29    (let ((res '()
9610: 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a  )).    (sqlite3:
9620: 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20  for-each-row .  
9630: 20 20 20 28 6c 61 6d 62 64 61 20 28 69 64 20 74     (lambda (id t
9640: 65 73 74 5f 69 64 20 63 61 74 65 67 6f 72 79 20  est_id category 
9650: 76 61 72 69 61 62 6c 65 20 76 61 6c 75 65 20 65  variable value e
9660: 78 70 65 63 74 65 64 20 74 6f 6c 20 75 6e 69 74  xpected tol unit
9670: 73 20 63 6f 6d 6d 65 6e 74 20 73 74 61 74 75 73  s comment status
9680: 20 74 79 70 65 29 0a 20 20 20 20 20 20 20 28 73   type).       (s
9690: 65 74 21 20 72 65 73 20 28 63 6f 6e 73 20 28 76  et! res (cons (v
96a0: 65 63 74 6f 72 20 69 64 20 74 65 73 74 5f 69 64  ector id test_id
96b0: 20 63 61 74 65 67 6f 72 79 20 76 61 72 69 61 62   category variab
96c0: 6c 65 20 76 61 6c 75 65 20 65 78 70 65 63 74 65  le value expecte
96d0: 64 20 74 6f 6c 20 75 6e 69 74 73 20 63 6f 6d 6d  d tol units comm
96e0: 65 6e 74 20 73 74 61 74 75 73 20 74 79 70 65 29  ent status type)
96f0: 20 72 65 73 29 29 29 0a 20 20 20 20 20 64 62 0a   res))).     db.
9700: 20 20 20 20 20 22 53 45 4c 45 43 54 20 69 64 2c       "SELECT id,
9710: 74 65 73 74 5f 69 64 2c 63 61 74 65 67 6f 72 79  test_id,category
9720: 2c 76 61 72 69 61 62 6c 65 2c 76 61 6c 75 65 2c  ,variable,value,
9730: 65 78 70 65 63 74 65 64 2c 74 6f 6c 2c 75 6e 69  expected,tol,uni
9740: 74 73 2c 63 6f 6d 6d 65 6e 74 2c 73 74 61 74 75  ts,comment,statu
9750: 73 2c 74 79 70 65 20 46 52 4f 4d 20 74 65 73 74  s,type FROM test
9760: 5f 64 61 74 61 20 57 48 45 52 45 20 74 65 73 74  _data WHERE test
9770: 5f 69 64 3d 3f 20 41 4e 44 20 63 61 74 65 67 6f  _id=? AND catego
9780: 72 79 20 4c 49 4b 45 20 3f 20 4f 52 44 45 52 20  ry LIKE ? ORDER 
9790: 42 59 20 63 61 74 65 67 6f 72 79 2c 76 61 72 69  BY category,vari
97a0: 61 62 6c 65 3b 22 20 74 65 73 74 2d 69 64 20 63  able;" test-id c
97b0: 61 74 65 67 6f 72 79 70 61 74 74 29 0a 20 20 20  ategorypatt).   
97c0: 20 28 72 65 76 65 72 73 65 20 72 65 73 29 29 29   (reverse res)))
97d0: 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 6c 6f  ..(define (db:lo
97e0: 61 64 2d 74 65 73 74 2d 64 61 74 61 20 64 62 20  ad-test-data db 
97f0: 74 65 73 74 2d 69 64 29 0a 20 20 28 6c 65 74 20  test-id).  (let 
9800: 6c 6f 6f 70 20 28 28 6c 69 6e 20 28 72 65 61 64  loop ((lin (read
9810: 2d 6c 69 6e 65 29 29 29 0a 20 20 20 20 28 69 66  -line))).    (if
9820: 20 28 6e 6f 74 20 28 65 6f 66 2d 6f 62 6a 65 63   (not (eof-objec
9830: 74 3f 20 6c 69 6e 29 29 0a 09 28 62 65 67 69 6e  t? lin))..(begin
9840: 0a 09 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74  ..  (debug:print
9850: 20 34 20 6c 69 6e 29 0a 09 20 20 28 72 64 62 3a   4 lin)..  (rdb:
9860: 63 73 76 2d 3e 74 65 73 74 2d 64 61 74 61 20 64  csv->test-data d
9870: 62 20 74 65 73 74 2d 69 64 20 6c 69 6e 29 0a 09  b test-id lin)..
9880: 20 20 28 6c 6f 6f 70 20 28 72 65 61 64 2d 6c 69    (loop (read-li
9890: 6e 65 29 29 29 29 29 0a 20 20 3b 3b 20 72 6f 6c  ne))))).  ;; rol
98a0: 6c 20 75 70 20 74 68 65 20 63 75 72 72 65 6e 74  l up the current
98b0: 20 72 65 73 75 6c 74 73 2e 0a 20 20 3b 3b 20 46   results..  ;; F
98c0: 49 58 4d 45 3a 20 41 64 64 20 74 68 65 20 73 74  IXME: Add the st
98d0: 61 74 75 73 20 74 6f 20 0a 20 20 28 72 64 62 3a  atus to .  (rdb:
98e0: 74 65 73 74 2d 64 61 74 61 2d 72 6f 6c 6c 75 70  test-data-rollup
98f0: 20 64 62 20 74 65 73 74 2d 69 64 20 23 66 29 29   db test-id #f))
9900: 0a 0a 3b 3b 20 57 41 52 4e 49 4e 47 3a 20 44 6f  ..;; WARNING: Do
9910: 20 4e 4f 54 20 63 61 6c 6c 20 74 68 69 73 20 66   NOT call this f
9920: 6f 72 20 74 68 65 20 70 61 72 65 6e 74 20 74 65  or the parent te
9930: 73 74 20 6f 6e 20 61 6e 20 69 74 65 72 61 74 65  st on an iterate
9940: 64 20 74 65 73 74 0a 3b 3b 20 52 6f 6c 6c 20 75  d test.;; Roll u
9950: 70 20 74 65 73 74 5f 64 61 74 61 20 70 61 73 73  p test_data pass
9960: 2f 66 61 69 6c 20 72 65 73 75 6c 74 73 0a 3b 3b  /fail results.;;
9970: 20 6c 6f 6f 6b 20 61 74 20 74 68 65 20 74 65 73   look at the tes
9980: 74 5f 64 61 74 61 20 73 74 61 74 75 73 20 66 69  t_data status fi
9990: 65 6c 64 2c 20 0a 3b 3b 20 20 20 20 69 66 20 61  eld, .;;    if a
99a0: 6c 6c 20 61 72 65 20 70 61 73 73 20 28 61 6e 79  ll are pass (any
99b0: 20 63 61 73 65 29 20 61 6e 64 20 74 68 65 20 74   case) and the t
99c0: 65 73 74 20 73 74 61 74 75 73 20 69 73 20 50 41  est status is PA
99d0: 53 53 20 6f 72 20 4e 55 4c 4c 20 6f 72 20 27 27  SS or NULL or ''
99e0: 20 74 68 65 6e 20 73 65 74 20 74 65 73 74 20 73   then set test s
99f0: 74 61 74 75 73 20 74 6f 20 50 41 53 53 2e 0a 3b  tatus to PASS..;
9a00: 3b 20 20 20 20 69 66 20 6f 6e 65 20 6f 72 20 6d  ;    if one or m
9a10: 6f 72 65 20 61 72 65 20 66 61 69 6c 20 28 61 6e  ore are fail (an
9a20: 79 20 63 61 73 65 29 20 74 68 65 6e 20 73 65 74  y case) then set
9a30: 20 74 65 73 74 20 73 74 61 74 75 73 20 74 6f 20   test status to 
9a40: 50 41 53 53 2c 20 6e 6f 6e 20 22 70 61 73 73 22  PASS, non "pass"
9a50: 20 6f 72 20 22 66 61 69 6c 22 20 61 72 65 20 69   or "fail" are i
9a60: 67 6e 6f 72 65 64 0a 28 64 65 66 69 6e 65 20 28  gnored.(define (
9a70: 64 62 3a 74 65 73 74 2d 64 61 74 61 2d 72 6f 6c  db:test-data-rol
9a80: 6c 75 70 20 64 62 20 74 65 73 74 2d 69 64 20 73  lup db test-id s
9a90: 74 61 74 75 73 29 0a 20 20 28 73 71 6c 69 74 65  tatus).  (sqlite
9aa0: 33 3a 65 78 65 63 75 74 65 20 0a 20 20 20 64 62  3:execute .   db
9ab0: 20 0a 20 20 20 22 55 50 44 41 54 45 20 74 65 73   .   "UPDATE tes
9ac0: 74 73 20 0a 20 20 20 20 20 20 53 45 54 20 66 61  ts .      SET fa
9ad0: 69 6c 5f 63 6f 75 6e 74 3d 28 53 45 4c 45 43 54  il_count=(SELECT
9ae0: 20 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20   count(id) FROM 
9af0: 74 65 73 74 5f 64 61 74 61 20 57 48 45 52 45 20  test_data WHERE 
9b00: 74 65 73 74 5f 69 64 3d 3f 20 41 4e 44 20 73 74  test_id=? AND st
9b10: 61 74 75 73 20 6c 69 6b 65 20 27 66 61 69 6c 27  atus like 'fail'
9b20: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 70 61 73  ),.          pas
9b30: 73 5f 63 6f 75 6e 74 3d 28 53 45 4c 45 43 54 20  s_count=(SELECT 
9b40: 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 74  count(id) FROM t
9b50: 65 73 74 5f 64 61 74 61 20 57 48 45 52 45 20 74  est_data WHERE t
9b60: 65 73 74 5f 69 64 3d 3f 20 41 4e 44 20 73 74 61  est_id=? AND sta
9b70: 74 75 73 20 6c 69 6b 65 20 27 70 61 73 73 27 29  tus like 'pass')
9b80: 0a 20 20 20 20 20 20 57 48 45 52 45 20 69 64 3d  .      WHERE id=
9b90: 3f 3b 22 0a 20 20 20 74 65 73 74 2d 69 64 20 74  ?;".   test-id t
9ba0: 65 73 74 2d 69 64 20 74 65 73 74 2d 69 64 29 0a  est-id test-id).
9bb0: 20 20 3b 3b 20 69 66 20 74 68 65 20 74 65 73 74    ;; if the test
9bc0: 20 69 73 20 6e 6f 74 20 46 41 49 4c 20 74 68 65   is not FAIL the
9bd0: 6e 20 73 65 74 20 73 74 61 74 75 73 20 62 61 73  n set status bas
9be0: 65 64 20 6f 6e 20 74 68 65 20 66 61 69 6c 20 61  ed on the fail a
9bf0: 6e 64 20 70 61 73 73 20 63 6f 75 6e 74 73 2e 0a  nd pass counts..
9c00: 20 20 28 74 68 72 65 61 64 2d 73 6c 65 65 70 21    (thread-sleep!
9c10: 20 31 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65   1).  (sqlite3:e
9c20: 78 65 63 75 74 65 0a 20 20 20 64 62 20 20 20 3b  xecute.   db   ;
9c30: 3b 3b 20 4e 4f 54 45 3a 20 53 68 6f 75 6c 64 20  ;; NOTE: Should 
9c40: 74 68 69 73 20 62 65 20 57 41 52 4e 2c 46 41 49  this be WARN,FAI
9c50: 4c 3f 20 41 20 57 41 52 4e 20 69 73 20 6e 6f 74  L? A WARN is not
9c60: 20 61 20 46 41 49 4c 3f 3f 3f 3f 3f 20 42 55 47   a FAIL????? BUG
9c70: 20 46 49 58 4d 45 0a 20 20 20 22 55 50 44 41 54   FIXME.   "UPDAT
9c80: 45 20 74 65 73 74 73 0a 20 20 20 20 20 20 53 45  E tests.      SE
9c90: 54 20 73 74 61 74 75 73 3d 43 41 53 45 20 57 48  T status=CASE WH
9ca0: 45 4e 20 28 53 45 4c 45 43 54 20 66 61 69 6c 5f  EN (SELECT fail_
9cb0: 63 6f 75 6e 74 20 46 52 4f 4d 20 74 65 73 74 73  count FROM tests
9cc0: 20 57 48 45 52 45 20 69 64 3d 3f 29 20 3e 20 30   WHERE id=?) > 0
9cd0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
9ce0: 20 20 20 20 20 20 20 20 20 20 20 54 48 45 4e 20             THEN 
9cf0: 27 46 41 49 4c 27 0a 20 20 20 20 20 20 20 20 20  'FAIL'.         
9d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
9d10: 4e 20 28 53 45 4c 45 43 54 20 70 61 73 73 5f 63  N (SELECT pass_c
9d20: 6f 75 6e 74 20 46 52 4f 4d 20 74 65 73 74 73 20  ount FROM tests 
9d30: 57 48 45 52 45 20 69 64 3d 3f 29 20 3e 20 30 20  WHERE id=?) > 0 
9d40: 41 4e 44 20 0a 20 20 20 20 20 20 20 20 20 20 20  AND .           
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d60: 28 53 45 4c 45 43 54 20 73 74 61 74 75 73 20 46  (SELECT status F
9d70: 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 20  ROM tests WHERE 
9d80: 69 64 3d 3f 29 20 4e 4f 54 20 49 4e 20 28 27 57  id=?) NOT IN ('W
9d90: 41 52 4e 27 2c 27 46 41 49 4c 27 29 0a 20 20 20  ARN','FAIL').   
9da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9db0: 20 20 20 20 20 20 54 48 45 4e 20 27 50 41 53 53        THEN 'PASS
9dc0: 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  '.              
9dd0: 20 20 20 20 20 20 20 20 45 4c 53 45 20 73 74 61          ELSE sta
9de0: 74 75 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  tus.            
9df0: 20 20 20 20 20 20 45 4e 44 20 57 48 45 52 45 20        END WHERE 
9e00: 69 64 3d 3f 3b 22 0a 20 20 20 74 65 73 74 2d 69  id=?;".   test-i
9e10: 64 20 74 65 73 74 2d 69 64 20 74 65 73 74 2d 69  d test-id test-i
9e20: 64 20 74 65 73 74 2d 69 64 29 29 0a 0a 28 64 65  d test-id))..(de
9e30: 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 70 72 65  fine (db:get-pre
9e40: 76 2d 74 6f 6c 2d 66 6f 72 2d 74 65 73 74 20 64  v-tol-for-test d
9e50: 62 20 74 65 73 74 2d 69 64 20 63 61 74 65 67 6f  b test-id catego
9e60: 72 79 20 76 61 72 69 61 62 6c 65 29 0a 20 20 3b  ry variable).  ;
9e70: 3b 20 46 69 6e 69 73 68 20 6d 65 3f 0a 20 20 28  ; Finish me?.  (
9e80: 76 61 6c 75 65 73 20 23 66 20 23 66 20 23 66 29  values #f #f #f)
9e90: 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  )..;;===========
9ea0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9eb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9ec0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9ed0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 53  ===========.;; S
9ee0: 20 54 20 45 20 50 20 53 20 0a 3b 3b 3d 3d 3d 3d   T E P S .;;====
9ef0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9f00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9f10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9f20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9f30: 3d 3d 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  ==..(define (db:
9f40: 73 74 65 70 2d 67 65 74 2d 74 69 6d 65 2d 61 73  step-get-time-as
9f50: 2d 73 74 72 69 6e 67 20 76 65 63 29 0a 20 20 28  -string vec).  (
9f60: 73 65 63 6f 6e 64 73 2d 3e 74 69 6d 65 2d 73 74  seconds->time-st
9f70: 72 69 6e 67 20 28 64 62 3a 73 74 65 70 2d 67 65  ring (db:step-ge
9f80: 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 76 65 63  t-event_time vec
9f90: 29 29 29 0a 0a 3b 3b 20 64 62 2d 67 65 74 2d 74  )))..;; db-get-t
9fa0: 65 73 74 2d 73 74 65 70 73 2d 66 6f 72 2d 72 75  est-steps-for-ru
9fb0: 6e 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65  n.(define (db:ge
9fc0: 74 2d 73 74 65 70 73 2d 66 6f 72 2d 74 65 73 74  t-steps-for-test
9fd0: 20 64 62 20 74 65 73 74 2d 69 64 29 0a 20 20 28   db test-id).  (
9fe0: 6c 65 74 20 28 28 72 65 73 20 27 28 29 29 29 0a  let ((res '())).
9ff0: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72      (sqlite3:for
a000: 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20 20 20 20  -each-row .     
a010: 28 6c 61 6d 62 64 61 20 28 69 64 20 74 65 73 74  (lambda (id test
a020: 2d 69 64 20 73 74 65 70 6e 61 6d 65 20 73 74 61  -id stepname sta
a030: 74 65 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d  te status event-
a040: 74 69 6d 65 20 6c 6f 67 66 69 6c 65 29 0a 20 20  time logfile).  
a050: 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28       (set! res (
a060: 63 6f 6e 73 20 28 76 65 63 74 6f 72 20 69 64 20  cons (vector id 
a070: 74 65 73 74 2d 69 64 20 73 74 65 70 6e 61 6d 65  test-id stepname
a080: 20 73 74 61 74 65 20 73 74 61 74 75 73 20 65 76   state status ev
a090: 65 6e 74 2d 74 69 6d 65 20 28 69 66 20 28 73 74  ent-time (if (st
a0a0: 72 69 6e 67 3f 20 6c 6f 67 66 69 6c 65 29 20 6c  ring? logfile) l
a0b0: 6f 67 66 69 6c 65 20 22 22 29 29 20 72 65 73 29  ogfile "")) res)
a0c0: 29 29 0a 20 20 20 20 20 64 62 0a 20 20 20 20 20  )).     db.     
a0d0: 22 53 45 4c 45 43 54 20 69 64 2c 74 65 73 74 5f  "SELECT id,test_
a0e0: 69 64 2c 73 74 65 70 6e 61 6d 65 2c 73 74 61 74  id,stepname,stat
a0f0: 65 2c 73 74 61 74 75 73 2c 65 76 65 6e 74 5f 74  e,status,event_t
a100: 69 6d 65 2c 6c 6f 67 66 69 6c 65 20 46 52 4f 4d  ime,logfile FROM
a110: 20 74 65 73 74 5f 73 74 65 70 73 20 57 48 45 52   test_steps WHER
a120: 45 20 74 65 73 74 5f 69 64 3d 3f 20 4f 52 44 45  E test_id=? ORDE
a130: 52 20 42 59 20 69 64 20 41 53 43 3b 22 20 3b 3b  R BY id ASC;" ;;
a140: 20 65 76 65 6e 74 5f 74 69 6d 65 20 44 45 53 43   event_time DESC
a150: 2c 69 64 20 41 53 43 3b 0a 20 20 20 20 20 74 65  ,id ASC;.     te
a160: 73 74 2d 69 64 29 0a 20 20 20 20 28 72 65 76 65  st-id).    (reve
a170: 72 73 65 20 72 65 73 29 29 29 0a 0a 3b 3b 20 67  rse res)))..;; g
a180: 65 74 20 61 20 70 72 65 74 74 79 20 74 61 62 6c  et a pretty tabl
a190: 65 20 74 6f 20 73 75 6d 6d 61 72 69 7a 65 20 73  e to summarize s
a1a0: 74 65 70 73 0a 3b 3b 0a 28 64 65 66 69 6e 65 20  teps.;;.(define 
a1b0: 28 64 62 3a 67 65 74 2d 73 74 65 70 73 2d 74 61  (db:get-steps-ta
a1c0: 62 6c 65 20 64 62 20 74 65 73 74 2d 69 64 29 0a  ble db test-id).
a1d0: 20 20 28 6c 65 74 20 28 28 73 74 65 70 73 20 20    (let ((steps  
a1e0: 20 28 64 62 3a 67 65 74 2d 73 74 65 70 73 2d 66   (db:get-steps-f
a1f0: 6f 72 2d 74 65 73 74 20 64 62 20 74 65 73 74 2d  or-test db test-
a200: 69 64 29 29 29 0a 20 20 20 20 3b 3b 20 6f 72 67  id))).    ;; org
a210: 61 6e 69 73 65 20 74 68 65 20 73 74 65 70 73 20  anise the steps 
a220: 66 6f 72 20 62 65 74 74 65 72 20 72 65 61 64 61  for better reada
a230: 62 69 6c 69 74 79 0a 20 20 20 20 28 6c 65 74 20  bility.    (let 
a240: 28 28 72 65 73 20 28 6d 61 6b 65 2d 68 61 73 68  ((res (make-hash
a250: 2d 74 61 62 6c 65 29 29 29 0a 20 20 20 20 20 20  -table))).      
a260: 28 66 6f 72 2d 65 61 63 68 20 0a 20 20 20 20 20  (for-each .     
a270: 20 20 28 6c 61 6d 62 64 61 20 28 73 74 65 70 29    (lambda (step)
a280: 0a 09 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20  .. (debug:print 
a290: 36 20 22 73 74 65 70 3d 22 20 73 74 65 70 29 0a  6 "step=" step).
a2a0: 09 20 28 6c 65 74 20 28 28 72 65 63 6f 72 64 20  . (let ((record 
a2b0: 28 68 61 73 68 2d 74 61 62 6c 65 2d 72 65 66 2f  (hash-table-ref/
a2c0: 64 65 66 61 75 6c 74 20 0a 09 09 09 72 65 73 20  default ....res 
a2d0: 0a 09 09 09 28 64 62 3a 73 74 65 70 2d 67 65 74  ....(db:step-get
a2e0: 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70 29 20  -stepname step) 
a2f0: 0a 09 09 09 3b 3b 20 20 20 20 20 20 20 20 73 74  ....;;        st
a300: 65 70 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20  epname          
a310: 20 20 20 20 20 20 73 74 61 72 74 20 65 6e 64 20        start end 
a320: 73 74 61 74 75 73 20 20 20 20 0a 09 09 09 28 76  status    ....(v
a330: 65 63 74 6f 72 20 28 64 62 3a 73 74 65 70 2d 67  ector (db:step-g
a340: 65 74 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70  et-stepname step
a350: 29 20 22 22 20 20 20 22 22 20 22 22 20 20 20 20  ) ""   "" ""    
a360: 20 22 22 20 22 22 29 29 29 29 0a 09 20 20 20 28   "" ""))))..   (
a370: 64 65 62 75 67 3a 70 72 69 6e 74 20 36 20 22 72  debug:print 6 "r
a380: 65 63 6f 72 64 28 62 65 66 6f 72 65 29 20 3d 20  ecord(before) = 
a390: 22 20 72 65 63 6f 72 64 20 0a 09 09 09 22 5c 6e  " record ...."\n
a3a0: 69 64 3a 20 20 20 20 20 20 20 22 20 28 64 62 3a  id:       " (db:
a3b0: 73 74 65 70 2d 67 65 74 2d 69 64 20 73 74 65 70  step-get-id step
a3c0: 29 0a 09 09 09 22 5c 6e 73 74 65 70 6e 61 6d 65  )...."\nstepname
a3d0: 3a 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74  : " (db:step-get
a3e0: 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70 29 0a  -stepname step).
a3f0: 09 09 09 22 5c 6e 73 74 61 74 65 3a 20 20 20 20  ..."\nstate:    
a400: 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73  " (db:step-get-s
a410: 74 61 74 65 20 73 74 65 70 29 0a 09 09 09 22 5c  tate step)...."\
a420: 6e 73 74 61 74 75 73 3a 20 20 20 22 20 28 64 62  nstatus:   " (db
a430: 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 74 75 73  :step-get-status
a440: 20 73 74 65 70 29 0a 09 09 09 22 5c 6e 74 69 6d   step)...."\ntim
a450: 65 3a 20 20 20 20 20 22 20 28 64 62 3a 73 74 65  e:     " (db:ste
a460: 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65  p-get-event_time
a470: 20 73 74 65 70 29 29 0a 09 20 20 20 28 63 61 73   step))..   (cas
a480: 65 20 28 73 74 72 69 6e 67 2d 3e 73 79 6d 62 6f  e (string->symbo
a490: 6c 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73  l (db:step-get-s
a4a0: 74 61 74 65 20 73 74 65 70 29 29 0a 09 20 20 20  tate step))..   
a4b0: 20 20 28 28 73 74 61 72 74 29 28 76 65 63 74 6f    ((start)(vecto
a4c0: 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 31 20  r-set! record 1 
a4d0: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65  (db:step-get-eve
a4e0: 6e 74 5f 74 69 6d 65 20 73 74 65 70 29 29 0a 09  nt_time step))..
a4f0: 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65        (vector-se
a500: 74 21 20 72 65 63 6f 72 64 20 33 20 28 69 66 20  t! record 3 (if 
a510: 28 65 71 75 61 6c 3f 20 28 76 65 63 74 6f 72 2d  (equal? (vector-
a520: 72 65 66 20 72 65 63 6f 72 64 20 33 29 20 22 22  ref record 3) ""
a530: 29 0a 09 09 09 09 09 28 64 62 3a 73 74 65 70 2d  )......(db:step-
a540: 67 65 74 2d 73 74 61 74 75 73 20 73 74 65 70 29  get-status step)
a550: 29 29 0a 09 20 20 20 20 20 20 28 69 66 20 28 3e  ))..      (if (>
a560: 20 28 73 74 72 69 6e 67 2d 6c 65 6e 67 74 68 20   (string-length 
a570: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 6c 6f 67  (db:step-get-log
a580: 66 69 6c 65 20 73 74 65 70 29 29 0a 09 09 20 20  file step))...  
a590: 20 20 20 30 29 0a 09 09 20 20 28 76 65 63 74 6f     0)...  (vecto
a5a0: 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 35 20  r-set! record 5 
a5b0: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 6c 6f 67  (db:step-get-log
a5c0: 66 69 6c 65 20 73 74 65 70 29 29 29 29 0a 09 20  file step)))).. 
a5d0: 20 20 20 20 28 28 65 6e 64 29 20 20 0a 09 20 20      ((end)  ..  
a5e0: 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21      (vector-set!
a5f0: 20 72 65 63 6f 72 64 20 32 20 28 61 6e 79 2d 3e   record 2 (any->
a600: 6e 75 6d 62 65 72 20 28 64 62 3a 73 74 65 70 2d  number (db:step-
a610: 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73  get-event_time s
a620: 74 65 70 29 29 29 0a 09 20 20 20 20 20 20 28 76  tep)))..      (v
a630: 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72  ector-set! recor
a640: 64 20 33 20 28 64 62 3a 73 74 65 70 2d 67 65 74  d 3 (db:step-get
a650: 2d 73 74 61 74 75 73 20 73 74 65 70 29 29 0a 09  -status step))..
a660: 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65        (vector-se
a670: 74 21 20 72 65 63 6f 72 64 20 34 20 28 6c 65 74  t! record 4 (let
a680: 20 28 28 73 74 61 72 74 74 20 28 61 6e 79 2d 3e   ((startt (any->
a690: 6e 75 6d 62 65 72 20 28 76 65 63 74 6f 72 2d 72  number (vector-r
a6a0: 65 66 20 72 65 63 6f 72 64 20 31 29 29 29 0a 09  ef record 1)))..
a6b0: 09 09 09 09 20 20 28 65 6e 64 74 20 20 20 28 61  ....  (endt   (a
a6c0: 6e 79 2d 3e 6e 75 6d 62 65 72 20 28 76 65 63 74  ny->number (vect
a6d0: 6f 72 2d 72 65 66 20 72 65 63 6f 72 64 20 32 29  or-ref record 2)
a6e0: 29 29 29 0a 09 09 09 09 20 20 20 20 20 20 28 64  ))).....      (d
a6f0: 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22 72 65  ebug:print 4 "re
a700: 63 6f 72 64 5b 31 5d 3d 22 20 28 76 65 63 74 6f  cord[1]=" (vecto
a710: 72 2d 72 65 66 20 72 65 63 6f 72 64 20 31 29 20  r-ref record 1) 
a720: 0a 09 09 09 09 09 09 20 20 20 22 2c 20 73 74 61  .......   ", sta
a730: 72 74 74 3d 22 20 73 74 61 72 74 74 20 22 2c 20  rtt=" startt ", 
a740: 65 6e 64 74 3d 22 20 65 6e 64 74 0a 09 09 09 09  endt=" endt.....
a750: 09 09 20 20 20 22 2c 20 67 65 74 2d 73 74 61 74  ..   ", get-stat
a760: 75 73 3a 20 22 20 28 64 62 3a 73 74 65 70 2d 67  us: " (db:step-g
a770: 65 74 2d 73 74 61 74 75 73 20 73 74 65 70 29 29  et-status step))
a780: 0a 09 09 09 09 20 20 20 20 20 20 28 69 66 20 28  .....      (if (
a790: 61 6e 64 20 28 6e 75 6d 62 65 72 3f 20 73 74 61  and (number? sta
a7a0: 72 74 74 29 28 6e 75 6d 62 65 72 3f 20 65 6e 64  rtt)(number? end
a7b0: 74 29 29 0a 09 09 09 09 09 20 20 28 73 65 63 6f  t))......  (seco
a7c0: 6e 64 73 2d 3e 68 72 2d 6d 69 6e 2d 73 65 63 20  nds->hr-min-sec 
a7d0: 28 2d 20 65 6e 64 74 20 73 74 61 72 74 74 29 29  (- endt startt))
a7e0: 20 22 2d 31 22 29 29 29 0a 09 20 20 20 20 20 20   "-1")))..      
a7f0: 28 69 66 20 28 3e 20 28 73 74 72 69 6e 67 2d 6c  (if (> (string-l
a800: 65 6e 67 74 68 20 28 64 62 3a 73 74 65 70 2d 67  ength (db:step-g
a810: 65 74 2d 6c 6f 67 66 69 6c 65 20 73 74 65 70 29  et-logfile step)
a820: 29 0a 09 09 20 20 20 20 20 30 29 0a 09 09 20 20  )...     0)...  
a830: 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63  (vector-set! rec
a840: 6f 72 64 20 35 20 28 64 62 3a 73 74 65 70 2d 67  ord 5 (db:step-g
a850: 65 74 2d 6c 6f 67 66 69 6c 65 20 73 74 65 70 29  et-logfile step)
a860: 29 29 29 0a 09 20 20 20 20 20 28 65 6c 73 65 0a  )))..     (else.
a870: 09 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73  .      (vector-s
a880: 65 74 21 20 72 65 63 6f 72 64 20 32 20 28 64 62  et! record 2 (db
a890: 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 74 65 20  :step-get-state 
a8a0: 73 74 65 70 29 29 0a 09 20 20 20 20 20 20 28 76  step))..      (v
a8b0: 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72  ector-set! recor
a8c0: 64 20 33 20 28 64 62 3a 73 74 65 70 2d 67 65 74  d 3 (db:step-get
a8d0: 2d 73 74 61 74 75 73 20 73 74 65 70 29 29 0a 09  -status step))..
a8e0: 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65        (vector-se
a8f0: 74 21 20 72 65 63 6f 72 64 20 34 20 28 64 62 3a  t! record 4 (db:
a900: 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74  step-get-event_t
a910: 69 6d 65 20 73 74 65 70 29 29 29 29 0a 09 20 20  ime step))))..  
a920: 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 73 65 74   (hash-table-set
a930: 21 20 72 65 73 20 28 64 62 3a 73 74 65 70 2d 67  ! res (db:step-g
a940: 65 74 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70  et-stepname step
a950: 29 20 72 65 63 6f 72 64 29 0a 09 20 20 20 28 64  ) record)..   (d
a960: 65 62 75 67 3a 70 72 69 6e 74 20 36 20 22 72 65  ebug:print 6 "re
a970: 63 6f 72 64 28 61 66 74 65 72 29 20 20 3d 20 22  cord(after)  = "
a980: 20 72 65 63 6f 72 64 20 0a 09 09 09 22 5c 6e 69   record ...."\ni
a990: 64 3a 20 20 20 20 20 20 20 22 20 28 64 62 3a 73  d:       " (db:s
a9a0: 74 65 70 2d 67 65 74 2d 69 64 20 73 74 65 70 29  tep-get-id step)
a9b0: 0a 09 09 09 22 5c 6e 73 74 65 70 6e 61 6d 65 3a  ...."\nstepname:
a9c0: 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d   " (db:step-get-
a9d0: 73 74 65 70 6e 61 6d 65 20 73 74 65 70 29 0a 09  stepname step)..
a9e0: 09 09 22 5c 6e 73 74 61 74 65 3a 20 20 20 20 22  .."\nstate:    "
a9f0: 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74   (db:step-get-st
aa00: 61 74 65 20 73 74 65 70 29 0a 09 09 09 22 5c 6e  ate step)...."\n
aa10: 73 74 61 74 75 73 3a 20 20 20 22 20 28 64 62 3a  status:   " (db:
aa20: 73 74 65 70 2d 67 65 74 2d 73 74 61 74 75 73 20  step-get-status 
aa30: 73 74 65 70 29 0a 09 09 09 22 5c 6e 74 69 6d 65  step)...."\ntime
aa40: 3a 20 20 20 20 20 22 20 28 64 62 3a 73 74 65 70  :     " (db:step
aa50: 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20  -get-event_time 
aa60: 73 74 65 70 29 29 29 29 0a 20 20 20 20 20 20 20  step)))).       
aa70: 3b 3b 20 28 65 6c 73 65 20 20 20 28 76 65 63 74  ;; (else   (vect
aa80: 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 31  or-set! record 1
aa90: 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 76   (db:step-get-ev
aaa0: 65 6e 74 5f 74 69 6d 65 20 73 74 65 70 29 29 29  ent_time step)))
aab0: 0a 20 20 20 20 20 20 20 28 73 6f 72 74 20 73 74  .       (sort st
aac0: 65 70 73 20 28 6c 61 6d 62 64 61 20 28 61 20 62  eps (lambda (a b
aad0: 29 28 3c 20 28 64 62 3a 73 74 65 70 2d 67 65 74  )(< (db:step-get
aae0: 2d 65 76 65 6e 74 5f 74 69 6d 65 20 61 29 28 64  -event_time a)(d
aaf0: 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74  b:step-get-event
ab00: 5f 74 69 6d 65 20 62 29 29 29 29 29 0a 20 20 20  _time b))))).   
ab10: 20 20 20 72 65 73 29 29 29 0a 0a 3b 3b 20 74 68     res)))..;; th
ab20: 65 20 6e 65 77 20 70 72 65 72 65 71 73 20 63 61  e new prereqs ca
ab30: 6c 63 75 6c 61 74 69 6f 6e 2c 20 6c 6f 6f 6b 73  lculation, looks
ab40: 20 61 6c 73 6f 20 61 74 20 69 74 65 6d 70 61 74   also at itempat
ab50: 68 20 69 66 20 73 70 65 63 69 66 69 65 64 0a 3b  h if specified.;
ab60: 3b 20 61 6c 6c 20 70 72 65 72 65 71 73 20 6d 75  ; all prereqs mu
ab70: 73 74 20 62 65 20 6d 65 74 3a 0a 3b 3b 20 20 20  st be met:.;;   
ab80: 20 69 66 20 70 72 65 72 65 71 20 74 65 73 74 20   if prereq test 
ab90: 77 69 74 68 20 69 74 65 6d 70 61 74 68 3d 27 27  with itempath=''
aba0: 20 69 73 20 43 4f 4d 50 4c 45 54 45 44 20 61 6e   is COMPLETED an
abb0: 64 20 50 41 53 53 2c 20 57 41 52 4e 2c 20 43 48  d PASS, WARN, CH
abc0: 45 43 4b 2c 20 6f 72 20 57 41 49 56 45 44 20 74  ECK, or WAIVED t
abd0: 68 65 6e 20 70 72 65 72 65 71 20 69 73 20 6d 65  hen prereq is me
abe0: 74 0a 3b 3b 20 20 20 20 69 66 20 70 72 65 72 65  t.;;    if prere
abf0: 71 20 74 65 73 74 20 77 69 74 68 20 69 74 65 6d  q test with item
ac00: 70 61 74 68 3d 72 65 66 2d 69 74 65 6d 2d 70 61  path=ref-item-pa
ac10: 74 68 20 61 6e 64 20 43 4f 4d 50 4c 45 54 45 44  th and COMPLETED
ac20: 20 77 69 74 68 20 50 41 53 53 2c 20 57 41 52 4e   with PASS, WARN
ac30: 2c 20 43 48 45 43 4b 2c 20 6f 72 20 57 41 49 56  , CHECK, or WAIV
ac40: 45 44 20 74 68 65 6e 20 70 72 65 72 65 71 20 69  ED then prereq i
ac50: 73 20 6d 65 74 0a 3b 3b 0a 3b 3b 20 4e 6f 74 65  s met.;;.;; Note
ac60: 3a 20 64 6f 20 6e 6f 74 20 63 6f 6e 76 65 72 74  : do not convert
ac70: 20 74 6f 20 72 65 6d 6f 74 65 20 61 73 20 69 74   to remote as it
ac80: 20 63 61 6c 6c 73 20 72 65 6d 6f 74 65 20 75 6e   calls remote un
ac90: 64 65 72 20 74 68 65 20 68 6f 6f 64 0a 3b 3b 0a  der the hood.;;.
aca0: 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d  (define (db:get-
acb0: 70 72 65 72 65 71 73 2d 6e 6f 74 2d 6d 65 74 20  prereqs-not-met 
acc0: 64 62 20 72 75 6e 2d 69 64 20 77 61 69 74 6f 6e  db run-id waiton
acd0: 73 20 72 65 66 2d 69 74 65 6d 2d 70 61 74 68 29  s ref-item-path)
ace0: 0a 20 20 28 69 66 20 28 6f 72 20 28 6e 6f 74 20  .  (if (or (not 
acf0: 77 61 69 74 6f 6e 73 29 0a 09 20 20 28 6e 75 6c  waitons)..  (nul
ad00: 6c 3f 20 77 61 69 74 6f 6e 73 29 29 0a 20 20 20  l? waitons)).   
ad10: 20 20 20 27 28 29 0a 20 20 20 20 20 20 28 6c 65     '().      (le
ad20: 74 2a 20 28 28 75 6e 6d 65 74 2d 70 72 65 2d 72  t* ((unmet-pre-r
ad30: 65 71 73 20 27 28 29 29 0a 09 20 20 20 20 20 28  eqs '())..     (
ad40: 72 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 27  result         '
ad50: 28 29 29 29 0a 09 28 66 6f 72 2d 65 61 63 68 20  ()))..(for-each 
ad60: 0a 09 20 28 6c 61 6d 62 64 61 20 28 77 61 69 74  .. (lambda (wait
ad70: 6f 6e 74 65 73 74 2d 6e 61 6d 65 29 0a 09 20 20  ontest-name)..  
ad80: 20 3b 3b 20 62 79 20 67 65 74 74 69 6e 67 20 74   ;; by getting t
ad90: 68 65 20 74 65 73 74 73 20 77 69 74 68 20 6d 61  he tests with ma
ada0: 74 63 68 69 6e 67 20 6e 61 6d 65 20 77 65 20 61  tching name we a
adb0: 72 65 20 6c 6f 6f 6b 69 6e 67 20 6f 6e 6c 79 20  re looking only 
adc0: 61 74 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20  at the matching 
add0: 74 65 73 74 20 0a 09 20 20 20 3b 3b 20 61 6e 64  test ..   ;; and
ade0: 20 72 65 6c 61 74 65 64 20 73 75 62 20 69 74 65   related sub ite
adf0: 6d 73 0a 09 20 20 20 28 6c 65 74 20 28 28 74 65  ms..   (let ((te
ae00: 73 74 73 20 20 20 20 20 20 20 20 20 20 20 20 20  sts             
ae10: 28 72 64 62 3a 67 65 74 2d 74 65 73 74 73 2d 66  (rdb:get-tests-f
ae20: 6f 72 2d 72 75 6e 20 64 62 20 72 75 6e 2d 69 64  or-run db run-id
ae30: 20 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65   waitontest-name
ae40: 20 23 66 20 27 28 29 20 27 28 29 29 29 0a 09 09   #f '() '()))...
ae50: 20 28 65 76 65 72 2d 73 65 65 6e 20 20 20 20 20   (ever-seen     
ae60: 20 20 20 20 23 66 29 0a 09 09 20 28 70 61 72 65      #f)... (pare
ae70: 6e 74 2d 77 61 69 74 6f 6e 2d 6d 65 74 20 23 66  nt-waiton-met #f
ae80: 29 0a 09 09 20 28 69 74 65 6d 2d 77 61 69 74 6f  )... (item-waito
ae90: 6e 2d 6d 65 74 20 20 20 23 66 29 29 0a 09 20 20  n-met   #f))..  
aea0: 20 20 20 28 66 6f 72 2d 65 61 63 68 20 0a 09 20     (for-each .. 
aeb0: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 74 65       (lambda (te
aec0: 73 74 29 0a 09 09 3b 3b 20 28 69 66 20 28 65 71  st)...;; (if (eq
aed0: 75 61 6c 3f 20 77 61 69 74 6f 6e 74 65 73 74 2d  ual? waitontest-
aee0: 6e 61 6d 65 20 28 64 62 3a 74 65 73 74 2d 67 65  name (db:test-ge
aef0: 74 2d 74 65 73 74 6e 61 6d 65 20 74 65 73 74 29  t-testname test)
af00: 29 20 3b 3b 20 62 79 20 64 65 66 69 6e 74 69 6f  ) ;; by defintio
af10: 6e 20 74 68 69 73 20 68 61 64 20 62 65 74 74 65  n this had bette
af20: 72 20 62 65 20 74 72 75 65 20 2e 2e 2e 0a 09 09  r be true ......
af30: 28 6c 65 74 2a 20 28 28 73 74 61 74 65 20 20 20  (let* ((state   
af40: 20 20 20 20 20 20 20 20 20 20 28 64 62 3a 74 65            (db:te
af50: 73 74 2d 67 65 74 2d 73 74 61 74 65 20 74 65 73  st-get-state tes
af60: 74 29 29 0a 09 09 20 20 20 20 20 20 20 28 73 74  t))...       (st
af70: 61 74 75 73 20 20 20 20 20 20 20 20 20 20 20 20  atus            
af80: 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 73 74 61  (db:test-get-sta
af90: 74 75 73 20 74 65 73 74 29 29 0a 09 09 20 20 20  tus test))...   
afa0: 20 20 20 20 28 69 74 65 6d 2d 70 61 74 68 20 20      (item-path  
afb0: 20 20 20 20 20 20 20 28 64 62 3a 74 65 73 74 2d         (db:test-
afc0: 67 65 74 2d 69 74 65 6d 2d 70 61 74 68 20 74 65  get-item-path te
afd0: 73 74 29 29 0a 09 09 20 20 20 20 20 20 20 28 69  st))...       (i
afe0: 73 2d 63 6f 6d 70 6c 65 74 65 64 20 20 20 20 20  s-completed     
aff0: 20 28 65 71 75 61 6c 3f 20 73 74 61 74 65 20 22   (equal? state "
b000: 43 4f 4d 50 4c 45 54 45 44 22 29 29 0a 09 09 20  COMPLETED"))... 
b010: 20 20 20 20 20 20 28 69 73 2d 6f 6b 20 20 20 20        (is-ok    
b020: 20 20 20 20 20 20 20 20 20 28 6d 65 6d 62 65 72           (member
b030: 20 73 74 61 74 75 73 20 27 28 22 50 41 53 53 22   status '("PASS"
b040: 20 22 57 41 52 4e 22 20 22 43 48 45 43 4b 22 20   "WARN" "CHECK" 
b050: 22 57 41 49 56 45 44 22 29 29 29 0a 09 09 20 20  "WAIVED")))...  
b060: 20 20 20 20 20 28 73 61 6d 65 2d 69 74 65 6d 70       (same-itemp
b070: 61 74 68 20 20 20 20 20 28 65 71 75 61 6c 3f 20  ath     (equal? 
b080: 72 65 66 2d 69 74 65 6d 2d 70 61 74 68 20 69 74  ref-item-path it
b090: 65 6d 2d 70 61 74 68 29 29 29 0a 09 09 20 20 28  em-path)))...  (
b0a0: 73 65 74 21 20 65 76 65 72 2d 73 65 65 6e 20 23  set! ever-seen #
b0b0: 74 29 0a 09 09 20 20 28 63 6f 6e 64 0a 09 09 20  t)...  (cond... 
b0c0: 20 20 3b 3b 20 63 61 73 65 20 31 2c 20 6e 6f 6e    ;; case 1, non
b0d0: 2d 69 74 65 6d 20 28 70 61 72 65 6e 74 20 74 65  -item (parent te
b0e0: 73 74 29 20 69 73 20 0a 09 09 20 20 20 28 28 61  st) is ...   ((a
b0f0: 6e 64 20 28 65 71 75 61 6c 3f 20 69 74 65 6d 2d  nd (equal? item-
b100: 70 61 74 68 20 22 22 29 20 3b 3b 20 74 68 69 73  path "") ;; this
b110: 20 69 73 20 74 68 65 20 70 61 72 65 6e 74 20 74   is the parent t
b120: 65 73 74 0a 09 09 09 20 69 73 2d 63 6f 6d 70 6c  est.... is-compl
b130: 65 74 65 64 0a 09 09 09 20 69 73 2d 6f 6b 29 0a  eted.... is-ok).
b140: 09 09 20 20 20 20 28 73 65 74 21 20 70 61 72 65  ..    (set! pare
b150: 6e 74 2d 77 61 69 74 6f 6e 2d 6d 65 74 20 23 74  nt-waiton-met #t
b160: 29 29 0a 09 09 20 20 20 28 28 61 6e 64 20 73 61  ))...   ((and sa
b170: 6d 65 2d 69 74 65 6d 70 61 74 68 0a 09 09 09 20  me-itempath.... 
b180: 69 73 2d 63 6f 6d 70 6c 65 74 65 64 0a 09 09 09  is-completed....
b190: 20 69 73 2d 6f 6b 29 0a 09 09 20 20 20 20 28 73   is-ok)...    (s
b1a0: 65 74 21 20 69 74 65 6d 2d 77 61 69 74 6f 6e 2d  et! item-waiton-
b1b0: 6d 65 74 20 23 74 29 29 29 29 29 0a 09 20 20 20  met #t)))))..   
b1c0: 20 20 20 74 65 73 74 73 29 0a 09 20 20 20 20 20     tests)..     
b1d0: 28 69 66 20 28 6e 6f 74 20 28 6f 72 20 70 61 72  (if (not (or par
b1e0: 65 6e 74 2d 77 61 69 74 6f 6e 2d 6d 65 74 20 69  ent-waiton-met i
b1f0: 74 65 6d 2d 77 61 69 74 6f 6e 2d 6d 65 74 29 29  tem-waiton-met))
b200: 0a 09 09 20 28 73 65 74 21 20 72 65 73 75 6c 74  ... (set! result
b210: 20 28 63 6f 6e 73 20 77 61 69 74 6f 6e 74 65 73   (cons waitontes
b220: 74 2d 6e 61 6d 65 20 72 65 73 75 6c 74 29 29 29  t-name result)))
b230: 0a 09 20 20 20 20 20 3b 3b 20 69 66 20 74 68 65  ..     ;; if the
b240: 20 74 65 73 74 20 69 73 20 6e 6f 74 20 66 6f 75   test is not fou
b250: 6e 64 20 74 68 65 6e 20 63 6c 65 61 72 6c 79 20  nd then clearly 
b260: 74 68 65 20 77 61 69 74 6f 6e 20 69 73 20 6e 6f  the waiton is no
b270: 74 20 6d 65 74 2e 2e 2e 0a 09 20 20 20 20 20 28  t met.....     (
b280: 69 66 20 28 6e 6f 74 20 65 76 65 72 2d 73 65 65  if (not ever-see
b290: 6e 29 28 73 65 74 21 20 72 65 73 75 6c 74 20 28  n)(set! result (
b2a0: 63 6f 6e 73 20 77 61 69 74 6f 6e 74 65 73 74 2d  cons waitontest-
b2b0: 6e 61 6d 65 20 72 65 73 75 6c 74 29 29 29 29 29  name result)))))
b2c0: 0a 09 77 61 69 74 6f 6e 73 29 0a 20 20 20 20 20  ..waitons).     
b2d0: 20 28 64 65 6c 65 74 65 2d 64 75 70 6c 69 63 61   (delete-duplica
b2e0: 74 65 73 20 72 65 73 75 6c 74 29 29 29 29 0a 0a  tes result))))..
b2f0: 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74  (define (db:test
b300: 73 74 65 70 2d 73 65 74 2d 73 74 61 74 75 73 21  step-set-status!
b310: 20 64 62 20 74 65 73 74 2d 69 64 20 74 65 73 74   db test-id test
b320: 73 74 65 70 2d 6e 61 6d 65 20 73 74 61 74 65 2d  step-name state-
b330: 69 6e 20 73 74 61 74 75 73 2d 69 6e 20 69 74 65  in status-in ite
b340: 6d 2d 70 61 74 68 20 63 6f 6d 6d 65 6e 74 20 6c  m-path comment l
b350: 6f 67 66 69 6c 65 29 0a 20 20 28 64 65 62 75 67  ogfile).  (debug
b360: 3a 70 72 69 6e 74 20 34 20 22 74 65 73 74 2d 69  :print 4 "test-i
b370: 64 3a 20 22 20 74 65 73 74 2d 69 64 20 22 20 74  d: " test-id " t
b380: 65 73 74 73 74 65 70 2d 6e 61 6d 65 3a 20 22 20  eststep-name: " 
b390: 74 65 73 74 73 74 65 70 2d 6e 61 6d 65 29 0a 20  teststep-name). 
b3a0: 20 28 6c 65 74 2a 20 28 28 73 74 61 74 65 20 20   (let* ((state  
b3b0: 20 20 20 28 63 68 65 63 6b 2d 76 61 6c 69 64 2d     (check-valid-
b3c0: 69 74 65 6d 73 20 22 73 74 61 74 65 22 20 73 74  items "state" st
b3d0: 61 74 65 2d 69 6e 29 29 0a 09 20 28 73 74 61 74  ate-in)).. (stat
b3e0: 75 73 20 20 20 20 28 63 68 65 63 6b 2d 76 61 6c  us    (check-val
b3f0: 69 64 2d 69 74 65 6d 73 20 22 73 74 61 74 75 73  id-items "status
b400: 22 20 73 74 61 74 75 73 2d 69 6e 29 29 29 0a 20  " status-in))). 
b410: 20 20 20 28 69 66 20 28 6f 72 20 28 6e 6f 74 20     (if (or (not 
b420: 73 74 61 74 65 29 28 6e 6f 74 20 73 74 61 74 75  state)(not statu
b430: 73 29 29 0a 09 28 64 65 62 75 67 3a 70 72 69 6e  s))..(debug:prin
b440: 74 20 30 20 22 57 41 52 4e 49 4e 47 3a 20 49 6e  t 0 "WARNING: In
b450: 76 61 6c 69 64 20 22 20 28 69 66 20 73 74 61 74  valid " (if stat
b460: 75 73 20 22 73 74 61 74 75 73 22 20 22 73 74 61  us "status" "sta
b470: 74 65 22 29 0a 09 09 20 20 20 20 20 22 20 76 61  te")...     " va
b480: 6c 75 65 20 5c 22 22 20 28 69 66 20 73 74 61 74  lue \"" (if stat
b490: 75 73 20 73 74 61 74 65 2d 69 6e 20 73 74 61 74  us state-in stat
b4a0: 75 73 2d 69 6e 29 20 22 5c 22 2c 20 75 70 64 61  us-in) "\", upda
b4b0: 74 65 20 79 6f 75 72 20 76 61 6c 69 64 76 61 6c  te your validval
b4c0: 75 65 73 20 73 65 63 74 69 6f 6e 20 69 6e 20 6d  ues section in m
b4d0: 65 67 61 74 65 73 74 2e 63 6f 6e 66 69 67 22 29  egatest.config")
b4e0: 29 0a 20 20 20 20 28 6d 75 74 65 78 2d 6c 6f 63  ).    (mutex-loc
b4f0: 6b 21 20 2a 69 6e 63 6f 6d 69 6e 67 2d 6d 75 74  k! *incoming-mut
b500: 65 78 2a 29 0a 20 20 20 20 28 73 65 74 21 20 2a  ex*).    (set! *
b510: 69 6e 63 6f 6d 69 6e 67 2d 64 61 74 61 2a 20 28  incoming-data* (
b520: 63 6f 6e 73 20 28 76 65 63 74 6f 72 20 27 73 74  cons (vector 'st
b530: 65 70 2d 73 74 61 74 75 73 0a 09 09 09 09 09 28  ep-status......(
b540: 63 75 72 72 65 6e 74 2d 73 65 63 6f 6e 64 73 29  current-seconds)
b550: 0a 09 09 09 09 09 3b 3b 20 46 49 58 4d 45 20 2d  ......;; FIXME -
b560: 20 74 68 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74   this should not
b570: 20 75 70 64 61 74 65 20 74 68 65 20 6c 6f 67 66   update the logf
b580: 69 6c 65 20 75 6e 6c 65 73 73 20 69 74 20 69 73  ile unless it is
b590: 20 73 70 65 63 69 66 69 65 64 2e 0a 09 09 09 09   specified......
b5a0: 09 28 6c 69 73 74 20 74 65 73 74 2d 69 64 20 74  .(list test-id t
b5b0: 65 73 74 73 74 65 70 2d 6e 61 6d 65 20 73 74 61  eststep-name sta
b5c0: 74 65 2d 69 6e 20 73 74 61 74 75 73 2d 69 6e 20  te-in status-in 
b5d0: 28 63 75 72 72 65 6e 74 2d 73 65 63 6f 6e 64 73  (current-seconds
b5e0: 29 20 28 69 66 20 63 6f 6d 6d 65 6e 74 20 63 6f  ) (if comment co
b5f0: 6d 6d 65 6e 74 20 22 22 29 20 28 69 66 20 6c 6f  mment "") (if lo
b600: 67 66 69 6c 65 20 6c 6f 67 66 69 6c 65 20 22 22  gfile logfile ""
b610: 29 29 29 0a 09 09 09 09 2a 69 6e 63 6f 6d 69 6e  ))).....*incomin
b620: 67 2d 64 61 74 61 2a 29 29 0a 20 20 20 20 28 6d  g-data*)).    (m
b630: 75 74 65 78 2d 75 6e 6c 6f 63 6b 21 20 2a 69 6e  utex-unlock! *in
b640: 63 6f 6d 69 6e 67 2d 6d 75 74 65 78 2a 29 0a 20  coming-mutex*). 
b650: 20 20 20 28 69 66 20 28 6e 6f 74 20 2a 63 61 63     (if (not *cac
b660: 68 65 2d 6f 6e 2a 29 28 64 62 3a 77 72 69 74 65  he-on*)(db:write
b670: 2d 63 61 63 68 65 64 2d 64 61 74 61 20 64 62 29  -cached-data db)
b680: 29 0a 20 20 20 20 23 74 29 29 0a 0a 3b 3b 3d 3d  ).    #t))..;;==
b690: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
b6a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
b6b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
b6c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
b6d0: 3d 3d 3d 3d 0a 3b 3b 20 45 78 74 72 61 63 74 20  ====.;; Extract 
b6e0: 6f 64 73 20 66 69 6c 65 20 66 72 6f 6d 20 74 68  ods file from th
b6f0: 65 20 64 62 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d  e db.;;=========
b700: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
b710: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
b720: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
b730: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b  =============..;
b740: 3b 20 72 75 6e 73 70 61 74 74 20 69 73 20 61 20  ; runspatt is a 
b750: 63 6f 6d 6d 61 20 64 65 6c 69 6d 69 74 65 64 20  comma delimited 
b760: 6c 69 73 74 20 6f 66 20 72 75 6e 20 70 61 74 74  list of run patt
b770: 65 72 6e 73 0a 3b 3b 20 6b 65 79 70 61 74 74 2d  erns.;; keypatt-
b780: 61 6c 69 73 74 20 6d 75 73 74 20 63 6f 6e 74 61  alist must conta
b790: 69 6e 20 2a 61 6c 6c 2a 20 6b 65 79 73 20 77 69  in *all* keys wi
b7a0: 74 68 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64  th an associated
b7b0: 20 70 61 74 74 65 72 6e 3a 20 27 28 20 28 22 4b   pattern: '( ("K
b7c0: 45 59 31 22 20 22 25 22 29 20 2e 2e 20 29 0a 28  EY1" "%") .. ).(
b7d0: 64 65 66 69 6e 65 20 28 64 62 3a 65 78 74 72 61  define (db:extra
b7e0: 63 74 2d 6f 64 73 2d 66 69 6c 65 20 64 62 20 6f  ct-ods-file db o
b7f0: 75 74 70 75 74 66 69 6c 65 20 6b 65 79 70 61 74  utputfile keypat
b800: 74 2d 61 6c 69 73 74 20 72 75 6e 73 70 61 74 74  t-alist runspatt
b810: 20 70 61 74 68 6d 6f 64 29 0a 20 20 28 6c 65 74   pathmod).  (let
b820: 2a 20 28 28 6b 65 79 73 73 74 72 20 20 28 73 74  * ((keysstr  (st
b830: 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65  ring-intersperse
b840: 20 28 6d 61 70 20 63 61 72 20 6b 65 79 70 61 74   (map car keypat
b850: 74 2d 61 6c 69 73 74 29 20 22 2c 22 29 29 0a 09  t-alist) ","))..
b860: 20 28 6b 65 79 71 72 79 20 20 20 28 73 74 72 69   (keyqry   (stri
b870: 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 28  ng-intersperse (
b880: 6d 61 70 20 28 6c 61 6d 62 64 61 20 28 70 29 28  map (lambda (p)(
b890: 63 6f 6e 63 20 28 63 61 72 20 70 29 20 22 20 4c  conc (car p) " L
b8a0: 49 4b 45 20 3f 20 22 29 29 20 6b 65 79 70 61 74  IKE ? ")) keypat
b8b0: 74 2d 61 6c 69 73 74 29 20 22 20 41 4e 44 20 22  t-alist) " AND "
b8c0: 29 29 0a 09 20 28 6e 75 6d 6b 65 79 73 20 20 28  )).. (numkeys  (
b8d0: 6c 65 6e 67 74 68 20 6b 65 79 70 61 74 74 2d 61  length keypatt-a
b8e0: 6c 69 73 74 29 29 0a 09 20 28 74 65 73 74 2d 69  list)).. (test-i
b8f0: 64 73 20 27 28 29 29 0a 09 20 28 77 69 6e 64 6f  ds '()).. (windo
b900: 77 73 20 20 28 61 6e 64 20 70 61 74 68 6d 6f 64  ws  (and pathmod
b910: 20 28 73 75 62 73 74 72 69 6e 67 2d 69 6e 64 65   (substring-inde
b920: 78 20 22 5c 5c 22 20 70 61 74 68 6d 6f 64 29 29  x "\\" pathmod))
b930: 29 0a 09 20 28 74 65 6d 70 64 69 72 20 20 28 63  ).. (tempdir  (c
b940: 6f 6e 63 20 22 2f 74 6d 70 2f 22 20 28 63 75 72  onc "/tmp/" (cur
b950: 72 65 6e 74 2d 75 73 65 72 2d 6e 61 6d 65 29 20  rent-user-name) 
b960: 22 2f 22 20 72 75 6e 73 70 61 74 74 20 22 5f 22  "/" runspatt "_"
b970: 20 28 72 61 6e 64 6f 6d 20 31 30 30 30 30 29 20   (random 10000) 
b980: 22 5f 22 20 28 63 75 72 72 65 6e 74 2d 70 72 6f  "_" (current-pro
b990: 63 65 73 73 2d 69 64 29 29 29 0a 09 20 28 72 75  cess-id))).. (ru
b9a0: 6e 73 68 65 61 64 65 72 20 28 61 70 70 65 6e 64  nsheader (append
b9b0: 20 28 6c 69 73 74 20 22 52 75 6e 20 49 64 22 20   (list "Run Id" 
b9c0: 22 52 75 6e 6e 61 6d 65 22 29 20 3b 20 30 20 31  "Runname") ; 0 1
b9d0: 0a 09 09 09 20 20 20 20 20 28 6d 61 70 20 63 61  ....     (map ca
b9e0: 72 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 29  r keypatt-alist)
b9f0: 20 20 20 3b 20 2b 20 4e 20 3d 20 6c 65 6e 67 74     ; + N = lengt
ba00: 68 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 0a  h keypatt-alist.
ba10: 09 09 09 20 20 20 20 20 28 6c 69 73 74 20 22 54  ...     (list "T
ba20: 65 73 74 6e 61 6d 65 22 20 20 20 20 20 20 20 20  estname"        
ba30: 20 20 3b 20 32 0a 09 09 09 09 20 20 20 22 49 74    ; 2.....   "It
ba40: 65 6d 20 50 61 74 68 22 20 20 20 20 20 20 20 20  em Path"        
ba50: 20 3b 20 33 20 0a 09 09 09 09 20 20 20 22 44 65   ; 3 .....   "De
ba60: 73 63 72 69 70 74 69 6f 6e 22 20 20 20 20 20 20  scription"      
ba70: 20 3b 20 34 20 0a 09 09 09 09 20 20 20 22 53 74   ; 4 .....   "St
ba80: 61 74 65 22 20 20 20 20 20 20 20 20 20 20 20 20  ate"            
ba90: 20 3b 20 35 20 0a 09 09 09 09 20 20 20 22 53 74   ; 5 .....   "St
baa0: 61 74 75 73 22 20 20 20 20 20 20 20 20 20 20 20  atus"           
bab0: 20 3b 20 36 20 20 0a 09 09 09 09 20 20 20 22 46   ; 6  .....   "F
bac0: 69 6e 61 6c 20 4c 6f 67 22 20 20 20 20 20 20 20  inal Log"       
bad0: 20 20 3b 20 37 20 0a 09 09 09 09 20 20 20 22 52    ; 7 .....   "R
bae0: 75 6e 20 44 75 72 61 74 69 6f 6e 22 20 20 20 20  un Duration"    
baf0: 20 20 3b 20 38 20 0a 09 09 09 09 20 20 20 22 57    ; 8 .....   "W
bb00: 68 65 6e 20 52 75 6e 22 20 20 20 20 20 20 20 20  hen Run"        
bb10: 20 20 3b 20 39 20 0a 09 09 09 09 20 20 20 22 54    ; 9 .....   "T
bb20: 61 67 73 22 20 20 20 20 20 20 20 20 20 20 20 20  ags"            
bb30: 20 20 3b 20 31 30 0a 09 09 09 09 20 20 20 22 52    ; 10.....   "R
bb40: 75 6e 20 4f 77 6e 65 72 22 20 20 20 20 20 20 20  un Owner"       
bb50: 20 20 3b 20 31 31 0a 09 09 09 09 20 20 20 22 43    ; 11.....   "C
bb60: 6f 6d 6d 65 6e 74 22 20 20 20 20 20 20 20 20 20  omment"         
bb70: 20 20 3b 20 31 32 0a 09 09 09 09 20 20 20 22 41    ; 12.....   "A
bb80: 75 74 68 6f 72 22 20 20 20 20 20 20 20 20 20 20  uthor"          
bb90: 20 20 3b 20 31 33 0a 09 09 09 09 20 20 20 22 54    ; 13.....   "T
bba0: 65 73 74 20 4f 77 6e 65 72 22 20 20 20 20 20 20  est Owner"      
bbb0: 20 20 3b 20 31 34 0a 09 09 09 09 20 20 20 22 52    ; 14.....   "R
bbc0: 65 76 69 65 77 65 64 22 20 20 20 20 20 20 20 20  eviewed"        
bbd0: 20 20 3b 20 31 35 0a 09 09 09 09 20 20 20 22 44    ; 15.....   "D
bbe0: 69 73 6b 66 72 65 65 22 20 20 20 20 20 20 20 20  iskfree"        
bbf0: 20 20 3b 20 31 36 0a 09 09 09 09 20 20 20 22 55    ; 16.....   "U
bc00: 6e 61 6d 65 22 20 20 20 20 20 20 20 20 20 20 20  name"           
bc10: 20 20 3b 20 31 37 0a 09 09 09 09 20 20 20 22 52    ; 17.....   "R
bc20: 75 6e 64 69 72 22 20 20 20 20 20 20 20 20 20 20  undir"          
bc30: 20 20 3b 20 31 38 0a 09 09 09 09 20 20 20 22 48    ; 18.....   "H
bc40: 6f 73 74 22 20 20 20 20 20 20 20 20 20 20 20 20  ost"            
bc50: 20 20 3b 20 31 39 0a 09 09 09 09 20 20 20 22 43    ; 19.....   "C
bc60: 70 75 20 4c 6f 61 64 22 20 20 20 20 20 20 20 20  pu Load"        
bc70: 20 20 3b 20 32 30 0a 09 09 09 09 20 20 20 29 29    ; 20.....   ))
bc80: 29 0a 09 20 28 72 65 73 75 6c 74 73 20 28 6c 69  ).. (results (li
bc90: 73 74 20 72 75 6e 73 68 65 61 64 65 72 29 29 09  st runsheader)).
bca0: 09 09 20 0a 09 20 28 74 65 73 74 64 61 74 61 2d  .. .. (testdata-
bcb0: 68 65 61 64 65 72 20 28 6c 69 73 74 20 22 52 75  header (list "Ru
bcc0: 6e 20 49 64 22 20 22 54 65 73 74 6e 61 6d 65 22  n Id" "Testname"
bcd0: 20 22 49 74 65 6d 20 50 61 74 68 22 20 22 43 61   "Item Path" "Ca
bce0: 74 65 67 6f 72 79 22 20 22 56 61 72 69 61 62 6c  tegory" "Variabl
bcf0: 65 22 20 22 56 61 6c 75 65 22 20 22 45 78 70 65  e" "Value" "Expe
bd00: 63 74 65 64 22 20 22 54 6f 6c 22 20 22 55 6e 69  cted" "Tol" "Uni
bd10: 74 73 22 20 22 53 74 61 74 75 73 22 20 22 43 6f  ts" "Status" "Co
bd20: 6d 6d 65 6e 74 22 29 29 0a 09 20 28 6d 61 69 6e  mment")).. (main
bd30: 71 72 79 20 28 63 6f 6e 63 20 22 53 45 4c 45 43  qry (conc "SELEC
bd40: 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  T.              
bd50: 74 2e 74 65 73 74 6e 61 6d 65 2c 72 2e 69 64 2c  t.testname,r.id,
bd60: 72 75 6e 6e 61 6d 65 2c 22 20 6b 65 79 73 73 74  runname," keysst
bd70: 72 20 22 2c 74 2e 74 65 73 74 6e 61 6d 65 2c 0a  r ",t.testname,.
bd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 2e                t.
bd90: 69 74 65 6d 5f 70 61 74 68 2c 74 6d 2e 64 65 73  item_path,tm.des
bda0: 63 72 69 70 74 69 6f 6e 2c 74 2e 73 74 61 74 65  cription,t.state
bdb0: 2c 74 2e 73 74 61 74 75 73 2c 0a 20 20 20 20 20  ,t.status,.     
bdc0: 20 20 20 20 20 20 20 20 20 66 69 6e 61 6c 5f 6c           final_l
bdd0: 6f 67 66 2c 72 75 6e 5f 64 75 72 61 74 69 6f 6e  ogf,run_duration
bde0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
bdf0: 20 73 74 72 66 74 69 6d 65 28 27 25 6d 2f 25 64   strftime('%m/%d
be00: 2f 25 59 20 25 48 3a 25 4d 3a 25 53 27 2c 64 61  /%Y %H:%M:%S',da
be10: 74 65 74 69 6d 65 28 74 2e 65 76 65 6e 74 5f 74  tetime(t.event_t
be20: 69 6d 65 2c 27 75 6e 69 78 65 70 6f 63 68 27 29  ime,'unixepoch')
be30: 2c 27 6c 6f 63 61 6c 74 69 6d 65 27 29 2c 0a 20  ,'localtime'),. 
be40: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6d 2e               tm.
be50: 74 61 67 73 2c 72 2e 6f 77 6e 65 72 2c 74 2e 63  tags,r.owner,t.c
be60: 6f 6d 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20 20  omment,.        
be70: 20 20 20 20 20 20 61 75 74 68 6f 72 2c 0a 20 20        author,.  
be80: 20 20 20 20 20 20 20 20 20 20 20 20 74 6d 2e 6f              tm.o
be90: 77 6e 65 72 2c 72 65 76 69 65 77 65 64 2c 0a 20  wner,reviewed,. 
bea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
beb0: 6b 66 72 65 65 2c 75 6e 61 6d 65 2c 72 75 6e 64  kfree,uname,rund
bec0: 69 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ir,.            
bed0: 20 20 68 6f 73 74 2c 63 70 75 6c 6f 61 64 0a 20    host,cpuload. 
bee0: 20 20 20 20 20 20 20 20 20 20 20 46 52 4f 4d 20             FROM 
bef0: 74 65 73 74 73 20 41 53 20 74 20 4a 4f 49 4e 20  tests AS t JOIN 
bf00: 72 75 6e 73 20 41 53 20 72 20 4f 4e 20 74 2e 72  runs AS r ON t.r
bf10: 75 6e 5f 69 64 3d 72 2e 69 64 20 4a 4f 49 4e 20  un_id=r.id JOIN 
bf20: 74 65 73 74 5f 6d 65 74 61 20 41 53 20 74 6d 20  test_meta AS tm 
bf30: 4f 4e 20 74 6d 2e 74 65 73 74 6e 61 6d 65 3d 74  ON tm.testname=t
bf40: 2e 74 65 73 74 6e 61 6d 65 0a 20 20 20 20 20 20  .testname.      
bf50: 20 20 20 20 20 20 57 48 45 52 45 20 72 75 6e 6e        WHERE runn
bf60: 61 6d 65 20 4c 49 4b 45 20 3f 20 41 4e 44 20 22  ame LIKE ? AND "
bf70: 20 6b 65 79 71 72 79 20 22 3b 22 29 29 29 0a 20   keyqry ";"))). 
bf80: 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20     (debug:print 
bf90: 32 20 22 55 73 69 6e 67 20 22 20 74 65 6d 70 64  2 "Using " tempd
bfa0: 69 72 20 22 20 66 6f 72 20 63 6f 6e 73 74 72 75  ir " for constru
bfb0: 63 74 69 6e 67 20 74 68 65 20 6f 64 73 20 66 69  cting the ods fi
bfc0: 6c 65 2e 20 6b 65 79 71 72 79 3a 20 22 20 6b 65  le. keyqry: " ke
bfd0: 79 71 72 79 20 22 20 6b 65 79 73 74 72 3a 20 22  yqry " keystr: "
bfe0: 20 6b 65 79 73 73 74 72 20 22 20 77 69 74 68 20   keysstr " with 
bff0: 6b 65 79 73 3a 20 22 20 28 6d 61 70 20 63 61 64  keys: " (map cad
c000: 72 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 29  r keypatt-alist)
c010: 0a 09 09 20 22 5c 6e 20 20 20 20 20 20 6d 61 69  ... "\n      mai
c020: 6e 71 72 79 3a 20 22 20 6d 61 69 6e 71 72 79 29  nqry: " mainqry)
c030: 0a 20 20 20 20 3b 3b 20 22 45 78 70 65 63 74 65  .    ;; "Expecte
c040: 64 20 56 61 6c 75 65 22 0a 20 20 20 20 3b 3b 20  d Value".    ;; 
c050: 22 56 61 6c 75 65 20 46 6f 75 6e 64 22 0a 20 20  "Value Found".  
c060: 20 20 3b 3b 20 22 54 6f 6c 65 72 61 6e 63 65 22    ;; "Tolerance"
c070: 0a 20 20 20 20 28 61 70 70 6c 79 20 73 71 6c 69  .    (apply sqli
c080: 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77  te3:for-each-row
c090: 0a 09 20 20 20 28 6c 61 6d 62 64 61 20 28 74 65  ..   (lambda (te
c0a0: 73 74 2d 69 64 20 2e 20 62 29 0a 09 20 20 20 20  st-id . b)..    
c0b0: 20 28 73 65 74 21 20 74 65 73 74 2d 69 64 73 20   (set! test-ids 
c0c0: 28 63 6f 6e 73 20 74 65 73 74 2d 69 64 20 74 65  (cons test-id te
c0d0: 73 74 2d 69 64 73 29 29 20 20 20 3b 3b 20 74 65  st-ids))   ;; te
c0e0: 73 74 2d 69 64 20 69 73 20 6e 6f 77 20 74 65 73  st-id is now tes
c0f0: 74 6e 61 6d 65 0a 09 20 20 20 20 20 28 73 65 74  tname..     (set
c100: 21 20 72 65 73 75 6c 74 73 20 28 61 70 70 65 6e  ! results (appen
c110: 64 20 72 65 73 75 6c 74 73 20 3b 3b 20 6e 6f 74  d results ;; not
c120: 65 2c 20 64 72 6f 70 20 74 68 65 20 74 65 73 74  e, drop the test
c130: 2d 69 64 0a 09 09 09 09 20 20 20 28 6c 69 73 74  -id.....   (list
c140: 0a 09 09 09 09 20 20 20 20 28 69 66 20 70 61 74  .....    (if pat
c150: 68 6d 6f 64 0a 09 09 09 09 09 28 6c 65 74 2a 20  hmod......(let* 
c160: 28 28 76 62 20 20 20 20 20 20 20 20 28 61 70 70  ((vb        (app
c170: 6c 79 20 76 65 63 74 6f 72 20 62 29 29 0a 09 09  ly vector b))...
c180: 09 09 09 20 20 20 20 20 20 20 28 6b 65 79 76 61  ...       (keyva
c190: 6c 73 20 20 20 28 6c 65 74 20 6c 6f 6f 70 20 28  ls   (let loop (
c1a0: 28 69 20 20 20 20 30 29 0a 09 09 09 09 09 09 09  (i    0)........
c1b0: 09 20 20 20 20 20 28 72 65 73 20 27 28 29 29 29  .     (res '()))
c1c0: 0a 09 09 09 09 09 09 09 20 20 20 20 28 69 66 20  ........    (if 
c1d0: 28 3e 3d 20 69 20 6e 75 6d 6b 65 79 73 29 0a 09  (>= i numkeys)..
c1e0: 09 09 09 09 09 09 09 72 65 73 0a 09 09 09 09 09  .......res......
c1f0: 09 09 09 28 6c 6f 6f 70 20 28 2b 20 69 20 31 29  ...(loop (+ i 1)
c200: 0a 09 09 09 09 09 09 09 09 20 20 20 20 20 20 28  .........      (
c210: 61 70 70 65 6e 64 20 72 65 73 20 28 6c 69 73 74  append res (list
c220: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62 20   (vector-ref vb 
c230: 28 2b 20 69 20 32 29 29 29 29 29 29 29 29 0a 09  (+ i 2))))))))..
c240: 09 09 09 09 20 20 20 20 20 20 20 28 72 75 6e 6e  ....       (runn
c250: 61 6d 65 20 20 20 28 76 65 63 74 6f 72 2d 72 65  ame   (vector-re
c260: 66 20 76 62 20 31 29 29 0a 09 09 09 09 09 20 20  f vb 1))......  
c270: 20 20 20 20 20 28 74 65 73 74 6e 61 6d 65 20 20       (testname  
c280: 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62 20 28  (vector-ref vb (
c290: 2b 20 20 32 20 6e 75 6d 6b 65 79 73 29 29 29 0a  +  2 numkeys))).
c2a0: 09 09 09 09 09 20 20 20 20 20 20 20 28 69 74 65  .....       (ite
c2b0: 6d 2d 70 61 74 68 20 28 76 65 63 74 6f 72 2d 72  m-path (vector-r
c2c0: 65 66 20 76 62 20 28 2b 20 20 33 20 6e 75 6d 6b  ef vb (+  3 numk
c2d0: 65 79 73 29 29 29 0a 09 09 09 09 09 20 20 20 20  eys)))......    
c2e0: 20 20 20 28 66 69 6e 61 6c 2d 6c 6f 67 20 28 76     (final-log (v
c2f0: 65 63 74 6f 72 2d 72 65 66 20 76 62 20 28 2b 20  ector-ref vb (+ 
c300: 20 37 20 6e 75 6d 6b 65 79 73 29 29 29 0a 09 09   7 numkeys)))...
c310: 09 09 09 20 20 20 20 20 20 20 28 72 75 6e 2d 64  ...       (run-d
c320: 69 72 20 20 20 28 76 65 63 74 6f 72 2d 72 65 66  ir   (vector-ref
c330: 20 76 62 20 28 2b 20 31 38 20 6e 75 6d 6b 65 79   vb (+ 18 numkey
c340: 73 29 29 29 0a 09 09 09 09 09 20 20 20 20 20 20  s)))......      
c350: 20 28 6c 6f 67 2d 66 70 61 74 68 20 28 63 6f 6e   (log-fpath (con
c360: 63 20 72 75 6e 2d 64 69 72 20 22 2f 22 20 20 66  c run-dir "/"  f
c370: 69 6e 61 6c 2d 6c 6f 67 29 29 29 20 3b 3b 20 28  inal-log))) ;; (
c380: 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72  string-intersper
c390: 73 65 20 6b 65 79 76 61 6c 73 20 22 2f 22 29 20  se keyvals "/") 
c3a0: 22 2f 22 20 74 65 73 74 6e 61 6d 65 20 22 2f 22  "/" testname "/"
c3b0: 20 69 74 65 6d 2d 70 61 74 68 20 22 2f 22 0a 09   item-path "/"..
c3c0: 09 09 09 09 20 20 28 64 65 62 75 67 3a 70 72 69  ....  (debug:pri
c3d0: 6e 74 20 34 20 22 6c 6f 67 3a 20 22 20 6c 6f 67  nt 4 "log: " log
c3e0: 2d 66 70 61 74 68 20 22 20 65 78 69 73 74 73 3a  -fpath " exists:
c3f0: 20 22 20 28 66 69 6c 65 2d 65 78 69 73 74 73 3f   " (file-exists?
c400: 20 6c 6f 67 2d 66 70 61 74 68 29 29 0a 09 09 09   log-fpath))....
c410: 09 09 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21  ..  (vector-set!
c420: 20 76 62 20 28 2b 20 37 20 6e 75 6d 6b 65 79 73   vb (+ 7 numkeys
c430: 29 20 28 69 66 20 28 66 69 6c 65 2d 65 78 69 73  ) (if (file-exis
c440: 74 73 3f 20 6c 6f 67 2d 66 70 61 74 68 29 0a 09  ts? log-fpath)..
c450: 09 09 09 09 09 09 09 09 20 20 20 20 28 6c 65 74  ........    (let
c460: 20 28 28 6e 65 77 70 61 74 68 20 28 63 6f 6e 63   ((newpath (conc
c470: 20 70 61 74 68 6d 6f 64 20 22 2f 22 0a 09 09 09   pathmod "/"....
c480: 09 09 09 09 09 09 09 09 09 20 28 73 74 72 69 6e  ......... (strin
c490: 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 6b 65  g-intersperse ke
c4a0: 79 76 61 6c 73 20 22 2f 22 29 0a 09 09 09 09 09  yvals "/")......
c4b0: 09 09 09 09 09 09 09 20 22 2f 22 20 72 75 6e 6e  ....... "/" runn
c4c0: 61 6d 65 20 22 2f 22 20 74 65 73 74 6e 61 6d 65  ame "/" testname
c4d0: 20 22 2f 22 0a 09 09 09 09 09 09 09 09 09 09 09   "/"............
c4e0: 09 20 28 69 66 20 28 73 74 72 69 6e 67 3d 3f 20  . (if (string=? 
c4f0: 69 74 65 6d 2d 70 61 74 68 20 22 22 29 20 22 22  item-path "") ""
c500: 20 28 63 6f 6e 63 20 22 2f 22 20 69 74 65 6d 2d   (conc "/" item-
c510: 70 61 74 68 29 29 0a 09 09 09 09 09 09 09 09 09  path))..........
c520: 09 09 09 20 66 69 6e 61 6c 2d 6c 6f 67 29 29 29  ... final-log)))
c530: 0a 09 09 09 09 09 09 09 09 09 20 20 20 20 20 20  ..........      
c540: 3b 3b 20 66 6f 72 20 6e 6f 77 20 74 68 72 6f 77  ;; for now throw
c550: 20 61 77 61 79 20 6e 65 77 70 61 74 68 20 61 6e   away newpath an
c560: 64 20 75 73 65 20 74 68 65 20 6c 6f 67 2d 66 70  d use the log-fp
c570: 61 74 68 20 63 6f 6e 63 27 64 20 77 69 74 68 20  ath conc'd with 
c580: 70 61 74 68 6d 6f 64 0a 09 09 09 09 09 09 09 09  pathmod.........
c590: 09 20 20 20 20 20 20 28 73 65 74 21 20 6e 65 77  .      (set! new
c5a0: 70 61 74 68 20 28 63 6f 6e 63 20 70 61 74 68 6d  path (conc pathm
c5b0: 6f 64 20 6c 6f 67 2d 66 70 61 74 68 29 29 0a 09  od log-fpath))..
c5c0: 09 09 09 09 09 09 09 09 20 20 20 20 20 20 28 69  ........      (i
c5d0: 66 20 77 69 6e 64 6f 77 73 20 28 73 74 72 69 6e  f windows (strin
c5e0: 67 2d 74 72 61 6e 73 6c 61 74 65 20 6e 65 77 70  g-translate newp
c5f0: 61 74 68 20 22 2f 22 20 22 5c 5c 22 29 20 6e 65  ath "/" "\\") ne
c600: 77 70 61 74 68 29 29 0a 09 09 09 09 09 09 09 09  wpath)).........
c610: 09 20 20 20 20 28 69 66 20 28 3e 20 2a 76 65 72  .    (if (> *ver
c620: 62 6f 73 69 74 79 2a 20 31 29 0a 09 09 09 09 09  bosity* 1)......
c630: 09 09 09 09 09 28 63 6f 6e 63 20 66 69 6e 61 6c  .....(conc final
c640: 2d 6c 6f 67 20 22 20 6e 6f 74 2d 66 6f 75 6e 64  -log " not-found
c650: 22 29 0a 09 09 09 09 09 09 09 09 09 09 22 22 29  ")..........."")
c660: 29 29 0a 09 09 09 09 09 20 20 28 76 65 63 74 6f  ))......  (vecto
c670: 72 2d 3e 6c 69 73 74 20 76 62 29 29 0a 09 09 09  r->list vb))....
c680: 09 09 62 29 29 29 29 29 0a 09 20 20 20 64 62 0a  ..b)))))..   db.
c690: 09 20 20 20 6d 61 69 6e 71 72 79 0a 09 20 20 20  .   mainqry..   
c6a0: 72 75 6e 73 70 61 74 74 20 28 6d 61 70 20 63 61  runspatt (map ca
c6b0: 64 72 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74  dr keypatt-alist
c6c0: 29 29 0a 20 20 20 20 28 64 65 62 75 67 3a 70 72  )).    (debug:pr
c6d0: 69 6e 74 20 32 20 22 46 6f 75 6e 64 20 22 20 28  int 2 "Found " (
c6e0: 6c 65 6e 67 74 68 20 74 65 73 74 2d 69 64 73 29  length test-ids)
c6f0: 20 22 20 72 65 63 6f 72 64 73 22 29 0a 20 20 20   " records").   
c700: 20 28 73 65 74 21 20 72 65 73 75 6c 74 73 20 28   (set! results (
c710: 6c 69 73 74 20 28 63 6f 6e 73 20 22 52 75 6e 73  list (cons "Runs
c720: 22 20 72 65 73 75 6c 74 73 29 29 29 0a 20 20 20  " results))).   
c730: 20 3b 3b 20 6e 6f 77 2c 20 66 6f 72 20 65 61 63   ;; now, for eac
c740: 68 20 74 65 73 74 2c 20 63 6f 6c 6c 65 63 74 20  h test, collect 
c750: 74 68 65 20 74 65 73 74 5f 64 61 74 61 20 69 6e  the test_data in
c760: 66 6f 20 61 6e 64 20 61 64 64 20 61 20 6e 65 77  fo and add a new
c770: 20 73 68 65 65 74 0a 20 20 20 20 28 66 6f 72 2d   sheet.    (for-
c780: 65 61 63 68 0a 20 20 20 20 20 28 6c 61 6d 62 64  each.     (lambd
c790: 61 20 28 74 65 73 74 2d 69 64 29 0a 20 20 20 20  a (test-id).    
c7a0: 20 20 20 28 6c 65 74 20 28 28 74 65 73 74 2d 64     (let ((test-d
c7b0: 61 74 61 20 28 6c 69 73 74 20 74 65 73 74 64 61  ata (list testda
c7c0: 74 61 2d 68 65 61 64 65 72 29 29 0a 09 20 20 20  ta-header))..   
c7d0: 20 20 28 63 75 72 72 2d 74 65 73 74 2d 6e 61 6d    (curr-test-nam
c7e0: 65 20 23 66 29 29 0a 09 20 28 73 71 6c 69 74 65  e #f)).. (sqlite
c7f0: 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 09  3:for-each-row..
c800: 20 20 28 6c 61 6d 62 64 61 20 28 72 75 6e 2d 69    (lambda (run-i
c810: 64 20 74 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d  d testname item-
c820: 70 61 74 68 20 63 61 74 65 67 6f 72 79 20 76 61  path category va
c830: 72 69 61 62 6c 65 20 76 61 6c 75 65 20 65 78 70  riable value exp
c840: 65 63 74 65 64 20 74 6f 6c 20 75 6e 69 74 73 20  ected tol units 
c850: 73 74 61 74 75 73 20 63 6f 6d 6d 65 6e 74 29 0a  status comment).
c860: 09 20 20 20 20 28 73 65 74 21 20 63 75 72 72 2d  .    (set! curr-
c870: 74 65 73 74 2d 6e 61 6d 65 20 74 65 73 74 6e 61  test-name testna
c880: 6d 65 29 0a 09 20 20 20 20 28 73 65 74 21 20 74  me)..    (set! t
c890: 65 73 74 2d 64 61 74 61 20 28 61 70 70 65 6e 64  est-data (append
c8a0: 20 74 65 73 74 2d 64 61 74 61 20 28 6c 69 73 74   test-data (list
c8b0: 20 28 6c 69 73 74 20 72 75 6e 2d 69 64 20 74 65   (list run-id te
c8c0: 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68  stname item-path
c8d0: 20 63 61 74 65 67 6f 72 79 20 76 61 72 69 61 62   category variab
c8e0: 6c 65 20 76 61 6c 75 65 20 65 78 70 65 63 74 65  le value expecte
c8f0: 64 20 74 6f 6c 20 75 6e 69 74 73 20 73 74 61 74  d tol units stat
c900: 75 73 20 63 6f 6d 6d 65 6e 74 29 29 29 29 29 0a  us comment))))).
c910: 09 20 20 64 62 20 0a 09 20 20 3b 3b 20 22 53 45  .  db ..  ;; "SE
c920: 4c 45 43 54 20 72 75 6e 5f 69 64 2c 74 65 73 74  LECT run_id,test
c930: 6e 61 6d 65 2c 69 74 65 6d 5f 70 61 74 68 2c 63  name,item_path,c
c940: 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62 6c 65  ategory,variable
c950: 2c 74 64 2e 76 61 6c 75 65 20 41 53 20 76 61 6c  ,td.value AS val
c960: 75 65 2c 65 78 70 65 63 74 65 64 2c 74 6f 6c 2c  ue,expected,tol,
c970: 75 6e 69 74 73 2c 74 64 2e 73 74 61 74 75 73 20  units,td.status 
c980: 41 53 20 73 74 61 74 75 73 2c 74 64 2e 63 6f 6d  AS status,td.com
c990: 6d 65 6e 74 20 41 53 20 63 6f 6d 6d 65 6e 74 20  ment AS comment 
c9a0: 46 52 4f 4d 20 74 65 73 74 5f 64 61 74 61 20 41  FROM test_data A
c9b0: 53 20 74 64 20 49 4e 4e 45 52 20 4a 4f 49 4e 20  S td INNER JOIN 
c9c0: 74 65 73 74 73 20 4f 4e 20 74 65 73 74 73 2e 69  tests ON tests.i
c9d0: 64 3d 74 64 2e 74 65 73 74 5f 69 64 20 57 48 45  d=td.test_id WHE
c9e0: 52 45 20 74 65 73 74 5f 69 64 3d 3f 3b 22 0a 09  RE test_id=?;"..
c9f0: 20 20 22 53 45 4c 45 43 54 20 72 75 6e 5f 69 64    "SELECT run_id
ca00: 2c 74 65 73 74 6e 61 6d 65 2c 69 74 65 6d 5f 70  ,testname,item_p
ca10: 61 74 68 2c 63 61 74 65 67 6f 72 79 2c 76 61 72  ath,category,var
ca20: 69 61 62 6c 65 2c 74 64 2e 76 61 6c 75 65 20 41  iable,td.value A
ca30: 53 20 76 61 6c 75 65 2c 74 64 2e 65 78 70 65 63  S value,td.expec
ca40: 74 65 64 2c 74 64 2e 74 6f 6c 2c 74 64 2e 75 6e  ted,td.tol,td.un
ca50: 69 74 73 2c 74 64 2e 73 74 61 74 75 73 20 41 53  its,td.status AS
ca60: 20 73 74 61 74 75 73 2c 74 64 2e 63 6f 6d 6d 65   status,td.comme
ca70: 6e 74 20 41 53 20 63 6f 6d 6d 65 6e 74 20 46 52  nt AS comment FR
ca80: 4f 4d 20 74 65 73 74 5f 64 61 74 61 20 41 53 20  OM test_data AS 
ca90: 74 64 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 74 65  td INNER JOIN te
caa0: 73 74 73 20 4f 4e 20 74 65 73 74 73 2e 69 64 3d  sts ON tests.id=
cab0: 74 64 2e 74 65 73 74 5f 69 64 20 57 48 45 52 45  td.test_id WHERE
cac0: 20 74 65 73 74 6e 61 6d 65 3d 3f 3b 22 0a 09 20   testname=?;".. 
cad0: 20 74 65 73 74 2d 69 64 29 0a 09 20 28 69 66 20   test-id).. (if 
cae0: 63 75 72 72 2d 74 65 73 74 2d 6e 61 6d 65 0a 09  curr-test-name..
caf0: 20 20 20 20 20 28 73 65 74 21 20 72 65 73 75 6c       (set! resul
cb00: 74 73 20 28 61 70 70 65 6e 64 20 72 65 73 75 6c  ts (append resul
cb10: 74 73 20 28 6c 69 73 74 20 28 63 6f 6e 73 20 63  ts (list (cons c
cb20: 75 72 72 2d 74 65 73 74 2d 6e 61 6d 65 20 74 65  urr-test-name te
cb30: 73 74 2d 64 61 74 61 29 29 29 29 29 0a 09 20 29  st-data))))).. )
cb40: 29 0a 20 20 20 20 20 28 73 6f 72 74 20 28 64 65  ).     (sort (de
cb50: 6c 65 74 65 2d 64 75 70 6c 69 63 61 74 65 73 20  lete-duplicates 
cb60: 74 65 73 74 2d 69 64 73 29 20 73 74 72 69 6e 67  test-ids) string
cb70: 3c 3d 29 29 0a 20 20 20 20 28 73 79 73 74 65 6d  <=)).    (system
cb80: 20 28 63 6f 6e 63 20 22 6d 6b 64 69 72 20 2d 70   (conc "mkdir -p
cb90: 20 22 20 74 65 6d 70 64 69 72 29 29 0a 20 20 20   " tempdir)).   
cba0: 20 3b 3b 20 28 70 70 20 72 65 73 75 6c 74 73 29   ;; (pp results)
cbb0: 0a 20 20 20 20 28 6f 64 73 3a 6c 69 73 74 2d 3e  .    (ods:list->
cbc0: 6f 64 73 20 0a 20 20 20 20 20 74 65 6d 70 64 69  ods .     tempdi
cbd0: 72 0a 20 20 20 20 20 28 69 66 20 28 73 74 72 69  r.     (if (stri
cbe0: 6e 67 2d 6d 61 74 63 68 20 28 72 65 67 65 78 70  ng-match (regexp
cbf0: 20 22 5e 5b 2f 7e 5d 2b 2e 2a 22 29 20 6f 75 74   "^[/~]+.*") out
cc00: 70 75 74 66 69 6c 65 29 20 3b 3b 20 66 75 6c 6c  putfile) ;; full
cc10: 20 70 61 74 68 3f 0a 09 20 6f 75 74 70 75 74 66   path?.. outputf
cc20: 69 6c 65 0a 09 20 28 62 65 67 69 6e 0a 09 20 20  ile.. (begin..  
cc30: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 30 20   (debug:print 0 
cc40: 22 57 41 52 4e 49 4e 47 3a 20 70 61 74 68 20 67  "WARNING: path g
cc50: 69 76 65 6e 2c 20 22 20 6f 75 74 70 75 74 66 69  iven, " outputfi
cc60: 6c 65 20 22 20 69 73 20 72 65 6c 61 74 69 76 65  le " is relative
cc70: 2c 20 70 72 65 66 69 78 69 6e 67 20 77 69 74 68  , prefixing with
cc80: 20 63 75 72 72 65 6e 74 20 64 69 72 65 63 74 6f   current directo
cc90: 72 79 22 29 0a 09 20 20 20 28 63 6f 6e 63 20 28  ry")..   (conc (
cca0: 63 75 72 72 65 6e 74 2d 64 69 72 65 63 74 6f 72  current-director
ccb0: 79 29 20 22 2f 22 20 6f 75 74 70 75 74 66 69 6c  y) "/" outputfil
ccc0: 65 29 29 29 0a 20 20 20 20 20 72 65 73 75 6c 74  e))).     result
ccd0: 73 29 0a 20 20 20 20 3b 3b 20 62 72 75 74 61 6c  s).    ;; brutal
cce0: 20 63 6c 65 61 6e 20 75 70 0a 20 20 20 20 28 73   clean up.    (s
ccf0: 79 73 74 65 6d 20 22 72 6d 20 2d 72 66 20 74 65  ystem "rm -rf te
cd00: 6d 70 64 69 72 22 29 29 29 0a 0a 3b 3b 20 28 64  mpdir")))..;; (d
cd10: 62 3a 65 78 74 72 61 63 74 2d 6f 64 73 2d 66 69  b:extract-ods-fi
cd20: 6c 65 20 64 62 20 22 6f 75 74 70 75 74 66 69 6c  le db "outputfil
cd30: 65 2e 6f 64 73 22 20 27 28 28 22 73 79 73 6e 61  e.ods" '(("sysna
cd40: 6d 65 22 20 22 25 22 29 28 22 66 73 6e 61 6d 65  me" "%")("fsname
cd50: 22 20 22 25 22 29 28 22 64 61 74 61 70 61 74 68  " "%")("datapath
cd60: 22 20 22 25 22 29 29 20 22 25 22 29 0a 0a 0a 3b  " "%")) "%")...;
cd70: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;===============
cd80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
cd90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
cda0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
cdb0: 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 52 45 4d 4f 54  =======.;; REMOT
cdc0: 45 20 44 42 20 41 43 43 45 53 53 20 56 49 41 20  E DB ACCESS VIA 
cdd0: 52 50 43 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  RPC.;;==========
cde0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
cdf0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
ce00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
ce10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64  ============..(d
ce20: 65 66 69 6e 65 20 28 72 64 62 3a 73 65 74 2d 74  efine (rdb:set-t
ce30: 65 73 74 73 2d 73 74 61 74 65 2d 73 74 61 74 75  ests-state-statu
ce40: 73 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74  s db run-id test
ce50: 6e 61 6d 65 73 20 63 75 72 72 73 74 61 74 65 20  names currstate 
ce60: 63 75 72 72 73 74 61 74 75 73 20 6e 65 77 73 74  currstatus newst
ce70: 61 74 65 20 6e 65 77 73 74 61 74 75 73 29 0a 20  ate newstatus). 
ce80: 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a   (if *runremote*
ce90: 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28 68 6f  .      (let ((ho
cea0: 73 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a  st (vector-ref *
ceb0: 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09  runremote* 0))..
cec0: 20 20 20 20 28 70 6f 72 74 20 28 76 65 63 74 6f      (port (vecto
ced0: 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65  r-ref *runremote
cee0: 2a 20 31 29 29 29 0a 09 28 28 72 70 63 3a 70 72  * 1)))..((rpc:pr
cef0: 6f 63 65 64 75 72 65 20 27 72 64 62 3a 73 65 74  ocedure 'rdb:set
cf00: 2d 74 65 73 74 73 2d 73 74 61 74 65 2d 73 74 61  -tests-state-sta
cf10: 74 75 73 20 68 6f 73 74 20 70 6f 72 74 29 0a 09  tus host port)..
cf20: 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65   run-id testname
cf30: 73 20 63 75 72 72 73 74 61 74 65 20 63 75 72 72  s currstate curr
cf40: 73 74 61 74 75 73 20 6e 65 77 73 74 61 74 65 20  status newstate 
cf50: 6e 65 77 73 74 61 74 75 73 29 29 0a 20 20 20 20  newstatus)).    
cf60: 20 20 28 64 62 3a 73 65 74 2d 74 65 73 74 73 2d    (db:set-tests-
cf70: 73 74 61 74 65 2d 73 74 61 74 75 73 20 64 62 20  state-status db 
cf80: 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 73  run-id testnames
cf90: 20 63 75 72 72 73 74 61 74 65 20 63 75 72 72 73   currstate currs
cfa0: 74 61 74 75 73 20 6e 65 77 73 74 61 74 65 20 6e  tatus newstate n
cfb0: 65 77 73 74 61 74 75 73 29 29 29 0a 0a 28 64 65  ewstatus)))..(de
cfc0: 66 69 6e 65 20 28 72 64 62 3a 74 65 73 74 73 74  fine (rdb:testst
cfd0: 65 70 2d 73 65 74 2d 73 74 61 74 75 73 21 20 64  ep-set-status! d
cfe0: 62 20 74 65 73 74 2d 69 64 20 74 65 73 74 73 74  b test-id testst
cff0: 65 70 2d 6e 61 6d 65 20 73 74 61 74 65 2d 69 6e  ep-name state-in
d000: 20 73 74 61 74 75 73 2d 69 6e 20 69 74 65 6d 64   status-in itemd
d010: 61 74 20 63 6f 6d 6d 65 6e 74 20 6c 6f 67 66 69  at comment logfi
d020: 6c 65 29 0a 20 20 28 6c 65 74 20 28 28 69 74 65  le).  (let ((ite
d030: 6d 2d 70 61 74 68 20 28 69 74 65 6d 2d 6c 69 73  m-path (item-lis
d040: 74 2d 3e 70 61 74 68 20 69 74 65 6d 64 61 74 29  t->path itemdat)
d050: 29 29 0a 20 20 20 20 28 69 66 20 2a 72 75 6e 72  )).    (if *runr
d060: 65 6d 6f 74 65 2a 0a 09 28 6c 65 74 20 28 28 68  emote*..(let ((h
d070: 6f 73 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20  ost (vector-ref 
d080: 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a  *runremote* 0)).
d090: 09 20 20 20 20 20 20 28 70 6f 72 74 20 28 76 65  .      (port (ve
d0a0: 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d  ctor-ref *runrem
d0b0: 6f 74 65 2a 20 31 29 29 29 0a 09 20 20 28 28 72  ote* 1)))..  ((r
d0c0: 70 63 3a 70 72 6f 63 65 64 75 72 65 20 27 72 64  pc:procedure 'rd
d0d0: 62 3a 74 65 73 74 73 74 65 70 2d 73 65 74 2d 73  b:teststep-set-s
d0e0: 74 61 74 75 73 21 20 68 6f 73 74 20 70 6f 72 74  tatus! host port
d0f0: 29 0a 09 20 20 20 74 65 73 74 2d 69 64 20 74 65  )..   test-id te
d100: 73 74 73 74 65 70 2d 6e 61 6d 65 20 73 74 61 74  ststep-name stat
d110: 65 2d 69 6e 20 73 74 61 74 75 73 2d 69 6e 20 69  e-in status-in i
d120: 74 65 6d 2d 70 61 74 68 20 63 6f 6d 6d 65 6e 74  tem-path comment
d130: 20 6c 6f 67 66 69 6c 65 29 29 0a 09 28 64 62 3a   logfile))..(db:
d140: 74 65 73 74 73 74 65 70 2d 73 65 74 2d 73 74 61  teststep-set-sta
d150: 74 75 73 21 20 64 62 20 74 65 73 74 2d 69 64 20  tus! db test-id 
d160: 74 65 73 74 73 74 65 70 2d 6e 61 6d 65 20 73 74  teststep-name st
d170: 61 74 65 2d 69 6e 20 73 74 61 74 75 73 2d 69 6e  ate-in status-in
d180: 20 69 74 65 6d 2d 70 61 74 68 20 63 6f 6d 6d 65   item-path comme
d190: 6e 74 20 6c 6f 67 66 69 6c 65 29 29 29 29 0a 0a  nt logfile))))..
d1a0: 28 64 65 66 69 6e 65 20 28 72 64 62 3a 74 65 73  (define (rdb:tes
d1b0: 74 2d 75 70 64 61 74 65 2d 6d 65 74 61 2d 69 6e  t-update-meta-in
d1c0: 66 6f 20 64 62 20 74 65 73 74 2d 69 64 20 6d 69  fo db test-id mi
d1d0: 6e 75 74 65 73 20 63 70 75 6c 6f 61 64 20 64 69  nutes cpuload di
d1e0: 73 6b 66 72 65 65 20 74 6d 70 66 72 65 65 29 0a  skfree tmpfree).
d1f0: 20 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65    (if *runremote
d200: 2a 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28 68  *.      (let ((h
d210: 6f 73 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20  ost (vector-ref 
d220: 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a  *runremote* 0)).
d230: 09 20 20 20 20 28 70 6f 72 74 20 28 76 65 63 74  .    (port (vect
d240: 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74  or-ref *runremot
d250: 65 2a 20 31 29 29 29 0a 09 28 28 72 70 63 3a 70  e* 1)))..((rpc:p
d260: 72 6f 63 65 64 75 72 65 20 27 72 64 62 3a 74 65  rocedure 'rdb:te
d270: 73 74 2d 75 70 64 61 74 65 2d 6d 65 74 61 2d 69  st-update-meta-i
d280: 6e 66 6f 20 68 6f 73 74 20 70 6f 72 74 29 0a 09  nfo host port)..
d290: 20 74 65 73 74 2d 69 64 20 6d 69 6e 75 74 65 73   test-id minutes
d2a0: 20 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65   cpuload diskfre
d2b0: 65 20 74 6d 70 66 72 65 65 29 29 0a 20 20 20 20  e tmpfree)).    
d2c0: 20 20 28 64 62 3a 74 65 73 74 2d 75 70 64 61 74    (db:test-updat
d2d0: 65 2d 6d 65 74 61 2d 69 6e 66 6f 20 64 62 20 74  e-meta-info db t
d2e0: 65 73 74 2d 69 64 20 6d 69 6e 75 74 65 73 20 63  est-id minutes c
d2f0: 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20  puload diskfree 
d300: 74 6d 70 66 72 65 65 29 29 29 0a 0a 28 64 65 66  tmpfree)))..(def
d310: 69 6e 65 20 28 72 64 62 3a 74 65 73 74 2d 73 65  ine (rdb:test-se
d320: 74 2d 73 74 61 74 65 2d 73 74 61 74 75 73 2d 62  t-state-status-b
d330: 79 2d 72 75 6e 2d 69 64 2d 74 65 73 74 6e 61 6d  y-run-id-testnam
d340: 65 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74  e db run-id test
d350: 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 20  -name item-path 
d360: 73 74 61 74 75 73 20 73 74 61 74 65 29 0a 20 20  status state).  
d370: 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a  (if *runremote*.
d380: 20 20 20 20 20 20 28 6c 65 74 20 28 28 68 6f 73        (let ((hos
d390: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72  t (vector-ref *r
d3a0: 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20  unremote* 0)).. 
d3b0: 20 20 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72     (port (vector
d3c0: 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a  -ref *runremote*
d3d0: 20 31 29 29 29 0a 09 28 28 72 70 63 3a 70 72 6f   1)))..((rpc:pro
d3e0: 63 65 64 75 72 65 20 27 72 64 62 3a 74 65 73 74  cedure 'rdb:test
d3f0: 2d 73 65 74 2d 73 74 61 74 65 2d 73 74 61 74 75  -set-state-statu
d400: 73 2d 62 79 2d 72 75 6e 2d 69 64 2d 74 65 73 74  s-by-run-id-test
d410: 6e 61 6d 65 20 68 6f 73 74 20 70 6f 72 74 29 0a  name host port).
d420: 09 20 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e  .  run-id test-n
d430: 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 73 74  ame item-path st
d440: 61 74 75 73 20 73 74 61 74 65 29 29 0a 20 20 20  atus state)).   
d450: 20 20 20 28 64 62 3a 74 65 73 74 2d 73 65 74 2d     (db:test-set-
d460: 73 74 61 74 65 2d 73 74 61 74 75 73 2d 62 79 2d  state-status-by-
d470: 72 75 6e 2d 69 64 2d 74 65 73 74 6e 61 6d 65 20  run-id-testname 
d480: 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e  db run-id test-n
d490: 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 73 74  ame item-path st
d4a0: 61 74 75 73 20 73 74 61 74 65 29 29 29 0a 0a 28  atus state)))..(
d4b0: 64 65 66 69 6e 65 20 28 72 64 62 3a 63 73 76 2d  define (rdb:csv-
d4c0: 3e 74 65 73 74 2d 64 61 74 61 20 64 62 20 74 65  >test-data db te
d4d0: 73 74 2d 69 64 20 63 73 76 64 61 74 61 29 0a 20  st-id csvdata). 
d4e0: 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a   (if *runremote*
d4f0: 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28 68 6f  .      (let ((ho
d500: 73 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a  st (vector-ref *
d510: 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09  runremote* 0))..
d520: 20 20 20 20 28 70 6f 72 74 20 28 76 65 63 74 6f      (port (vecto
d530: 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65  r-ref *runremote
d540: 2a 20 31 29 29 29 0a 09 28 28 72 70 63 3a 70 72  * 1)))..((rpc:pr
d550: 6f 63 65 64 75 72 65 20 27 72 64 62 3a 63 73 76  ocedure 'rdb:csv
d560: 2d 3e 74 65 73 74 2d 64 61 74 61 20 68 6f 73 74  ->test-data host
d570: 20 70 6f 72 74 29 0a 09 20 74 65 73 74 2d 69 64   port).. test-id
d580: 20 63 73 76 64 61 74 61 29 29 0a 20 20 20 20 20   csvdata)).     
d590: 20 28 64 62 3a 63 73 76 2d 3e 74 65 73 74 2d 64   (db:csv->test-d
d5a0: 61 74 61 20 64 62 20 74 65 73 74 2d 69 64 20 63  ata db test-id c
d5b0: 73 76 64 61 74 61 29 29 29 0a 0a 28 64 65 66 69  svdata)))..(defi
d5c0: 6e 65 20 28 72 64 62 3a 72 6f 6c 6c 2d 75 70 2d  ne (rdb:roll-up-
d5d0: 70 61 73 73 2d 66 61 69 6c 2d 63 6f 75 6e 74 73  pass-fail-counts
d5e0: 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d   db run-id test-
d5f0: 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 73  name item-path s
d600: 74 61 74 75 73 29 0a 20 20 28 69 66 20 2a 72 75  tatus).  (if *ru
d610: 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28  nremote*.      (
d620: 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65 63 74  let ((host (vect
d630: 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74  or-ref *runremot
d640: 65 2a 20 30 29 29 0a 09 20 20 20 20 28 70 6f 72  e* 0))..    (por
d650: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72  t (vector-ref *r
d660: 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09  unremote* 1)))..
d670: 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20  ((rpc:procedure 
d680: 27 72 64 62 3a 72 6f 6c 6c 2d 75 70 2d 70 61 73  'rdb:roll-up-pas
d690: 73 2d 66 61 69 6c 2d 63 6f 75 6e 74 73 20 68 6f  s-fail-counts ho
d6a0: 73 74 20 70 6f 72 74 29 0a 09 20 72 75 6e 2d 69  st port).. run-i
d6b0: 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d  d test-name item
d6c0: 2d 70 61 74 68 20 73 74 61 74 75 73 29 29 0a 20  -path status)). 
d6d0: 20 20 20 20 20 28 64 62 3a 72 6f 6c 6c 2d 75 70       (db:roll-up
d6e0: 2d 70 61 73 73 2d 66 61 69 6c 2d 63 6f 75 6e 74  -pass-fail-count
d6f0: 73 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74  s db run-id test
d700: 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 20  -name item-path 
d710: 73 74 61 74 75 73 29 29 29 0a 0a 28 64 65 66 69  status)))..(defi
d720: 6e 65 20 28 72 64 62 3a 74 65 73 74 2d 73 65 74  ne (rdb:test-set
d730: 2d 63 6f 6d 6d 65 6e 74 20 64 62 20 74 65 73 74  -comment db test
d740: 2d 69 64 20 63 6f 6d 6d 65 6e 74 29 0a 20 20 28  -id comment).  (
d750: 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20  if *runremote*. 
d760: 20 20 20 20 20 28 6c 65 74 20 28 28 68 6f 73 74       (let ((host
d770: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75   (vector-ref *ru
d780: 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20  nremote* 0))..  
d790: 20 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72 2d    (port (vector-
d7a0: 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20  ref *runremote* 
d7b0: 31 29 29 29 0a 09 28 28 72 70 63 3a 70 72 6f 63  1)))..((rpc:proc
d7c0: 65 64 75 72 65 20 27 72 64 62 3a 74 65 73 74 2d  edure 'rdb:test-
d7d0: 73 65 74 2d 63 6f 6d 6d 65 6e 74 20 68 6f 73 74  set-comment host
d7e0: 20 70 6f 72 74 29 0a 09 20 74 65 73 74 2d 69 64   port).. test-id
d7f0: 20 63 6f 6d 6d 65 6e 74 29 29 0a 20 20 20 20 20   comment)).     
d800: 20 28 64 62 3a 74 65 73 74 2d 73 65 74 2d 63 6f   (db:test-set-co
d810: 6d 6d 65 6e 74 20 64 62 20 74 65 73 74 2d 69 64  mment db test-id
d820: 20 63 6f 6d 6d 65 6e 74 29 29 29 0a 0a 28 64 65   comment)))..(de
d830: 66 69 6e 65 20 28 72 64 62 3a 74 65 73 74 2d 73  fine (rdb:test-s
d840: 65 74 2d 6c 6f 67 21 20 64 62 20 74 65 73 74 2d  et-log! db test-
d850: 69 64 20 6c 6f 67 66 29 0a 20 20 28 69 66 20 2a  id logf).  (if *
d860: 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20  runremote*.     
d870: 20 28 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65   (let ((host (ve
d880: 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d  ctor-ref *runrem
d890: 6f 74 65 2a 20 30 29 29 0a 09 20 20 20 20 28 70  ote* 0))..    (p
d8a0: 6f 72 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20  ort (vector-ref 
d8b0: 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29  *runremote* 1)))
d8c0: 0a 09 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72  ..((rpc:procedur
d8d0: 65 20 27 72 64 62 3a 74 65 73 74 2d 73 65 74 2d  e 'rdb:test-set-
d8e0: 6c 6f 67 21 20 68 6f 73 74 20 70 6f 72 74 29 20  log! host port) 
d8f0: 74 65 73 74 2d 69 64 20 6c 6f 67 66 29 29 0a 20  test-id logf)). 
d900: 20 20 20 20 20 28 64 62 3a 74 65 73 74 2d 73 65       (db:test-se
d910: 74 2d 6c 6f 67 21 20 64 62 20 74 65 73 74 2d 69  t-log! db test-i
d920: 64 20 6c 6f 67 66 29 29 29 0a 0a 28 64 65 66 69  d logf)))..(defi
d930: 6e 65 20 28 72 64 62 3a 67 65 74 2d 72 75 6e 73  ne (rdb:get-runs
d940: 20 64 62 20 72 75 6e 6e 61 6d 65 70 61 74 74 20   db runnamepatt 
d950: 6e 75 6d 72 75 6e 73 20 73 74 61 72 74 72 75 6e  numruns startrun
d960: 6f 66 66 73 65 74 20 6b 65 79 70 61 74 74 73 29  offset keypatts)
d970: 0a 20 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74  .  (if *runremot
d980: 65 2a 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28  e*.      (let ((
d990: 68 6f 73 74 20 28 76 65 63 74 6f 72 2d 72 65 66  host (vector-ref
d9a0: 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29   *runremote* 0))
d9b0: 0a 09 20 20 20 20 28 70 6f 72 74 20 28 76 65 63  ..    (port (vec
d9c0: 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f  tor-ref *runremo
d9d0: 74 65 2a 20 31 29 29 29 0a 09 28 28 72 70 63 3a  te* 1)))..((rpc:
d9e0: 70 72 6f 63 65 64 75 72 65 20 27 72 64 62 3a 67  procedure 'rdb:g
d9f0: 65 74 2d 72 75 6e 73 20 68 6f 73 74 20 70 6f 72  et-runs host por
da00: 74 29 0a 09 20 72 75 6e 6e 61 6d 65 70 61 74 74  t).. runnamepatt
da10: 20 6e 75 6d 72 75 6e 73 20 73 74 61 72 74 72 75   numruns startru
da20: 6e 6f 66 66 73 65 74 20 6b 65 79 70 61 74 74 73  noffset keypatts
da30: 29 29 0a 20 20 20 20 20 20 28 64 62 3a 67 65 74  )).      (db:get
da40: 2d 72 75 6e 73 20 64 62 20 72 75 6e 6e 61 6d 65  -runs db runname
da50: 70 61 74 74 20 6e 75 6d 72 75 6e 73 20 73 74 61  patt numruns sta
da60: 72 74 72 75 6e 6f 66 66 73 65 74 20 6b 65 79 70  rtrunoffset keyp
da70: 61 74 74 73 29 29 29 0a 0a 28 64 65 66 69 6e 65  atts)))..(define
da80: 20 28 72 64 62 3a 67 65 74 2d 74 65 73 74 73 2d   (rdb:get-tests-
da90: 66 6f 72 2d 72 75 6e 20 64 62 20 72 75 6e 2d 69  for-run db run-i
daa0: 64 20 74 65 73 74 70 61 74 74 20 69 74 65 6d 70  d testpatt itemp
dab0: 61 74 74 20 73 74 61 74 65 73 20 73 74 61 74 75  att states statu
dac0: 73 65 73 20 23 21 6b 65 79 20 28 6e 6f 74 2d 69  ses #!key (not-i
dad0: 6e 20 23 74 29 29 0a 20 20 28 69 66 20 2a 72 75  n #t)).  (if *ru
dae0: 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28  nremote*.      (
daf0: 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65 63 74  let ((host (vect
db00: 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74  or-ref *runremot
db10: 65 2a 20 30 29 29 0a 09 20 20 20 20 28 70 6f 72  e* 0))..    (por
db20: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72  t (vector-ref *r
db30: 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09  unremote* 1)))..
db40: 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20  ((rpc:procedure 
db50: 27 72 64 62 3a 67 65 74 2d 74 65 73 74 73 2d 66  'rdb:get-tests-f
db60: 6f 72 2d 72 75 6e 20 68 6f 73 74 20 70 6f 72 74  or-run host port
db70: 29 0a 09 20 20 72 75 6e 2d 69 64 20 74 65 73 74  )..  run-id test
db80: 70 61 74 74 20 69 74 65 6d 70 61 74 74 20 73 74  patt itempatt st
db90: 61 74 65 73 20 73 74 61 74 75 73 65 73 20 6e 6f  ates statuses no
dba0: 74 2d 69 6e 3a 20 6e 6f 74 2d 69 6e 29 29 0a 20  t-in: not-in)). 
dbb0: 20 20 20 20 20 28 64 62 3a 67 65 74 2d 74 65 73       (db:get-tes
dbc0: 74 73 2d 66 6f 72 2d 72 75 6e 20 64 62 20 72 75  ts-for-run db ru
dbd0: 6e 2d 69 64 20 74 65 73 74 70 61 74 74 20 69 74  n-id testpatt it
dbe0: 65 6d 70 61 74 74 20 73 74 61 74 65 73 20 73 74  empatt states st
dbf0: 61 74 75 73 65 73 20 6e 6f 74 2d 69 6e 3a 20 6e  atuses not-in: n
dc00: 6f 74 2d 69 6e 29 29 29 0a 0a 28 64 65 66 69 6e  ot-in)))..(defin
dc10: 65 20 28 72 64 62 3a 67 65 74 2d 74 65 73 74 2d  e (rdb:get-test-
dc20: 64 61 74 61 2d 62 79 2d 69 64 20 64 62 20 74 65  data-by-id db te
dc30: 73 74 2d 69 64 29 0a 20 20 28 69 66 20 2a 72 75  st-id).  (if *ru
dc40: 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28  nremote*.      (
dc50: 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65 63 74  let ((host (vect
dc60: 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74  or-ref *runremot
dc70: 65 2a 20 30 29 29 0a 09 20 20 20 20 28 70 6f 72  e* 0))..    (por
dc80: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72  t (vector-ref *r
dc90: 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09  unremote* 1)))..
dca0: 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20  ((rpc:procedure 
dcb0: 27 72 70 63 3a 67 65 74 2d 74 65 73 74 2d 64 61  'rpc:get-test-da
dcc0: 74 61 2d 62 79 2d 69 64 20 68 6f 73 74 20 70 6f  ta-by-id host po
dcd0: 72 74 29 0a 09 20 74 65 73 74 2d 69 64 29 29 0a  rt).. test-id)).
dce0: 20 20 20 20 20 20 28 64 62 3a 67 65 74 2d 74 65        (db:get-te
dcf0: 73 74 2d 64 61 74 61 2d 62 79 2d 69 64 20 64 62  st-data-by-id db
dd00: 20 74 65 73 74 2d 69 64 29 29 29 0a 20 20 20 20   test-id))).    
dd10: 20 20 0a 28 64 65 66 69 6e 65 20 28 72 64 62 3a    .(define (rdb:
dd20: 67 65 74 2d 6b 65 79 73 20 64 62 29 0a 20 20 28  get-keys db).  (
dd30: 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20  if *runremote*. 
dd40: 20 20 20 20 20 28 6c 65 74 20 28 28 68 6f 73 74       (let ((host
dd50: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75   (vector-ref *ru
dd60: 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20  nremote* 0))..  
dd70: 20 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72 2d    (port (vector-
dd80: 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20  ref *runremote* 
dd90: 31 29 29 29 0a 09 28 69 66 20 2a 64 62 2d 6b 65  1)))..(if *db-ke
dda0: 79 73 2a 20 2a 64 62 2d 6b 65 79 73 2a 20 0a 09  ys* *db-keys* ..
ddb0: 20 20 20 20 28 6c 65 74 20 28 28 6b 65 79 73 20      (let ((keys 
ddc0: 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20  ((rpc:procedure 
ddd0: 27 72 64 62 3a 67 65 74 2d 6b 65 79 73 20 68 6f  'rdb:get-keys ho
dde0: 73 74 20 70 6f 72 74 29 29 29 29 0a 09 20 20 20  st port))))..   
ddf0: 20 20 20 28 73 65 74 21 20 2a 64 62 2d 6b 65 79     (set! *db-key
de00: 73 2a 20 6b 65 79 73 29 0a 09 20 20 20 20 20 20  s* keys)..      
de10: 6b 65 79 73 29 29 29 0a 20 20 20 20 20 20 28 64  keys))).      (d
de20: 62 3a 67 65 74 2d 6b 65 79 73 20 64 62 29 29 29  b:get-keys db)))
de30: 0a 09 20 0a 28 64 65 66 69 6e 65 20 28 72 64 62  .. .(define (rdb
de40: 3a 67 65 74 2d 6e 75 6d 2d 72 75 6e 73 20 64 62  :get-num-runs db
de50: 20 72 75 6e 70 61 74 74 29 0a 20 20 28 69 66 20   runpatt).  (if 
de60: 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20  *runremote*.    
de70: 20 20 28 6c 65 74 20 28 28 68 6f 73 74 20 28 76    (let ((host (v
de80: 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65  ector-ref *runre
de90: 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20 20 20 28  mote* 0))..    (
dea0: 70 6f 72 74 20 28 76 65 63 74 6f 72 2d 72 65 66  port (vector-ref
deb0: 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29   *runremote* 1))
dec0: 29 0a 09 28 28 72 70 63 3a 70 72 6f 63 65 64 75  )..((rpc:procedu
ded0: 72 65 20 27 72 64 62 3a 67 65 74 2d 6e 75 6d 2d  re 'rdb:get-num-
dee0: 72 75 6e 73 20 68 6f 73 74 20 70 6f 72 74 29 20  runs host port) 
def0: 72 75 6e 70 61 74 74 29 29 0a 20 20 20 20 20 20  runpatt)).      
df00: 28 64 62 3a 67 65 74 2d 6e 75 6d 2d 72 75 6e 73  (db:get-num-runs
df10: 20 64 62 20 72 75 6e 70 61 74 74 29 29 29 0a 0a   db runpatt)))..
df20: 28 64 65 66 69 6e 65 20 28 72 64 62 3a 74 65 73  (define (rdb:tes
df30: 74 2d 73 65 74 2d 73 74 61 74 65 2d 73 74 61 74  t-set-state-stat
df40: 75 73 2d 62 79 2d 69 64 20 64 62 20 74 65 73 74  us-by-id db test
df50: 2d 69 64 20 6e 65 77 73 74 61 74 65 20 6e 65 77  -id newstate new
df60: 73 74 61 74 75 73 20 6e 65 77 63 6f 6d 6d 65 6e  status newcommen
df70: 74 29 0a 20 20 20 20 28 69 66 20 2a 72 75 6e 72  t).    (if *runr
df80: 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c 65  emote*.      (le
df90: 74 20 28 28 68 6f 73 74 20 28 76 65 63 74 6f 72  t ((host (vector
dfa0: 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a  -ref *runremote*
dfb0: 20 30 29 29 0a 09 20 20 20 20 28 70 6f 72 74 20   0))..    (port 
dfc0: 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e  (vector-ref *run
dfd0: 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28 28  remote* 1)))..((
dfe0: 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20 27 72  rpc:procedure 'r
dff0: 64 62 3a 74 65 73 74 2d 73 65 74 2d 73 74 61 74  db:test-set-stat
e000: 65 2d 73 74 61 74 75 73 2d 62 79 2d 69 64 20 68  e-status-by-id h
e010: 6f 73 74 20 70 6f 72 74 29 0a 09 20 74 65 73 74  ost port).. test
e020: 2d 69 64 20 6e 65 77 73 74 61 74 65 20 6e 65 77  -id newstate new
e030: 73 74 61 74 75 73 20 6e 65 77 63 6f 6d 6d 65 6e  status newcommen
e040: 74 29 29 0a 20 20 20 20 20 20 28 64 62 3a 74 65  t)).      (db:te
e050: 73 74 2d 73 65 74 2d 73 74 61 74 65 2d 73 74 61  st-set-state-sta
e060: 74 75 73 2d 62 79 2d 69 64 20 64 62 20 74 65 73  tus-by-id db tes
e070: 74 2d 69 64 20 6e 65 77 73 74 61 74 65 20 6e 65  t-id newstate ne
e080: 77 73 74 61 74 75 73 20 6e 65 77 63 6f 6d 6d 65  wstatus newcomme
e090: 6e 74 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  nt)))..(define (
e0a0: 72 64 62 3a 67 65 74 2d 6b 65 79 2d 76 61 6c 2d  rdb:get-key-val-
e0b0: 70 61 69 72 73 20 64 62 20 72 75 6e 2d 69 64 29  pairs db run-id)
e0c0: 0a 20 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74  .  (if *runremot
e0d0: 65 2a 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28  e*.      (let ((
e0e0: 68 6f 73 74 20 28 76 65 63 74 6f 72 2d 72 65 66  host (vector-ref
e0f0: 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29   *runremote* 0))
e100: 0a 09 20 20 20 20 28 70 6f 72 74 20 28 76 65 63  ..    (port (vec
e110: 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f  tor-ref *runremo
e120: 74 65 2a 20 31 29 29 29 0a 09 28 28 72 70 63 3a  te* 1)))..((rpc:
e130: 70 72 6f 63 65 64 75 72 65 20 27 72 64 62 3a 67  procedure 'rdb:g
e140: 65 74 2d 6b 65 79 2d 76 61 6c 2d 70 61 69 72 73  et-key-val-pairs
e150: 20 68 6f 73 74 20 70 6f 72 74 29 20 72 75 6e 2d   host port) run-
e160: 69 64 29 29 0a 20 20 20 20 20 20 28 64 62 3a 67  id)).      (db:g
e170: 65 74 2d 6b 65 79 2d 76 61 6c 2d 70 61 69 72 73  et-key-val-pairs
e180: 20 64 62 20 72 75 6e 2d 69 64 29 29 29 0a 09 20   db run-id))).. 
e190: 0a 28 64 65 66 69 6e 65 20 28 72 64 62 3a 67 65  .(define (rdb:ge
e1a0: 74 2d 6b 65 79 2d 76 61 6c 73 20 64 62 20 72 75  t-key-vals db ru
e1b0: 6e 2d 69 64 29 0a 20 20 20 20 28 69 66 20 2a 72  n-id).    (if *r
e1c0: 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20  unremote*.      
e1d0: 28 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65 63  (let ((host (vec
e1e0: 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f  tor-ref *runremo
e1f0: 74 65 2a 20 30 29 29 0a 09 20 20 20 20 28 70 6f  te* 0))..    (po
e200: 72 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a  rt (vector-ref *
e210: 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a  runremote* 1))).
e220: 09 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65  .((rpc:procedure
e230: 20 27 72 64 62 3a 67 65 74 2d 6b 65 79 2d 76 61   'rdb:get-key-va
e240: 6c 73 20 68 6f 73 74 20 70 6f 72 74 29 20 72 75  ls host port) ru
e250: 6e 2d 69 64 29 29 0a 20 20 20 20 20 20 28 64 62  n-id)).      (db
e260: 3a 67 65 74 2d 6b 65 79 2d 76 61 6c 73 20 64 62  :get-key-vals db
e270: 20 72 75 6e 2d 69 64 29 29 29 0a 0a 28 64 65 66   run-id)))..(def
e280: 69 6e 65 20 28 72 64 62 3a 74 65 73 74 6d 65 74  ine (rdb:testmet
e290: 61 2d 67 65 74 2d 72 65 63 6f 72 64 20 64 62 20  a-get-record db 
e2a0: 74 65 73 74 6e 61 6d 65 29 0a 20 20 20 28 69 66  testname).   (if
e2b0: 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20   *runremote*.   
e2c0: 20 20 20 28 6c 65 74 20 28 28 68 6f 73 74 20 28     (let ((host (
e2d0: 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72  vector-ref *runr
e2e0: 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20 20 20  emote* 0))..    
e2f0: 28 70 6f 72 74 20 28 76 65 63 74 6f 72 2d 72 65  (port (vector-re
e300: 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29  f *runremote* 1)
e310: 29 29 0a 09 28 28 72 70 63 3a 70 72 6f 63 65 64  ))..((rpc:proced
e320: 75 72 65 20 27 72 64 62 3a 74 65 73 74 6d 65 74  ure 'rdb:testmet
e330: 61 2d 67 65 74 2d 72 65 63 6f 72 64 20 68 6f 73  a-get-record hos
e340: 74 20 70 6f 72 74 29 20 74 65 73 74 6e 61 6d 65  t port) testname
e350: 29 29 0a 20 20 20 20 20 20 28 64 62 3a 74 65 73  )).      (db:tes
e360: 74 6d 65 74 61 2d 67 65 74 2d 72 65 63 6f 72 64  tmeta-get-record
e370: 20 64 62 20 74 65 73 74 6e 61 6d 65 29 29 29 0a   db testname))).
e380: 0a 28 64 65 66 69 6e 65 20 28 72 64 62 3a 67 65  .(define (rdb:ge
e390: 74 2d 74 65 73 74 2d 64 61 74 61 2d 62 79 2d 69  t-test-data-by-i
e3a0: 64 20 64 62 20 74 65 73 74 2d 69 64 29 0a 20 20  d db test-id).  
e3b0: 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a  (if *runremote*.
e3c0: 20 20 20 20 20 20 28 6c 65 74 20 28 28 68 6f 73        (let ((hos
e3d0: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72  t (vector-ref *r
e3e0: 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20  unremote* 0)).. 
e3f0: 20 20 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72     (port (vector
e400: 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a  -ref *runremote*
e410: 20 31 29 29 29 0a 09 28 28 72 70 63 3a 70 72 6f   1)))..((rpc:pro
e420: 63 65 64 75 72 65 20 27 72 64 62 3a 67 65 74 2d  cedure 'rdb:get-
e430: 74 65 73 74 2d 64 61 74 61 2d 62 79 2d 69 64 20  test-data-by-id 
e440: 68 6f 73 74 20 70 6f 72 74 29 20 74 65 73 74 2d  host port) test-
e450: 69 64 29 29 0a 20 20 20 20 20 20 28 64 62 3a 67  id)).      (db:g
e460: 65 74 2d 74 65 73 74 2d 64 61 74 61 2d 62 79 2d  et-test-data-by-
e470: 69 64 20 64 62 20 74 65 73 74 2d 69 64 29 29 29  id db test-id)))
e480: 0a 0a 28 64 65 66 69 6e 65 20 28 72 64 62 3a 67  ..(define (rdb:g
e490: 65 74 2d 72 75 6e 2d 69 6e 66 6f 20 64 62 20 72  et-run-info db r
e4a0: 75 6e 2d 69 64 29 0a 20 20 28 69 66 20 2a 72 75  un-id).  (if *ru
e4b0: 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28  nremote*.      (
e4c0: 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65 63 74  let ((host (vect
e4d0: 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74  or-ref *runremot
e4e0: 65 2a 20 30 29 29 0a 09 20 20 20 20 28 70 6f 72  e* 0))..    (por
e4f0: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72  t (vector-ref *r
e500: 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09  unremote* 1)))..
e510: 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20  ((rpc:procedure 
e520: 27 72 64 62 3a 67 65 74 2d 72 75 6e 2d 69 6e 66  'rdb:get-run-inf
e530: 6f 20 68 6f 73 74 20 70 6f 72 74 29 20 72 75 6e  o host port) run
e540: 2d 69 64 29 29 0a 20 20 20 20 20 20 28 64 62 3a  -id)).      (db:
e550: 67 65 74 2d 72 75 6e 2d 69 6e 66 6f 20 64 62 20  get-run-info db 
e560: 72 75 6e 2d 69 64 29 29 29 0a 0a 28 64 65 66 69  run-id)))..(defi
e570: 6e 65 20 28 72 64 62 3a 67 65 74 2d 73 74 65 70  ne (rdb:get-step
e580: 73 2d 66 6f 72 2d 74 65 73 74 20 64 62 20 74 65  s-for-test db te
e590: 73 74 2d 69 64 29 0a 20 20 28 69 66 20 2a 72 75  st-id).  (if *ru
e5a0: 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28  nremote*.      (
e5b0: 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65 63 74  let ((host (vect
e5c0: 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74  or-ref *runremot
e5d0: 65 2a 20 30 29 29 0a 09 20 20 20 20 28 70 6f 72  e* 0))..    (por
e5e0: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72  t (vector-ref *r
e5f0: 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09  unremote* 1)))..
e600: 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20  ((rpc:procedure 
e610: 27 72 64 62 3a 67 65 74 2d 73 74 65 70 73 2d 66  'rdb:get-steps-f
e620: 6f 72 2d 74 65 73 74 20 68 6f 73 74 20 70 6f 72  or-test host por
e630: 74 29 20 74 65 73 74 2d 69 64 29 29 0a 20 20 20  t) test-id)).   
e640: 20 20 20 28 64 62 3a 67 65 74 2d 73 74 65 70 73     (db:get-steps
e650: 2d 66 6f 72 2d 74 65 73 74 20 64 62 20 74 65 73  -for-test db tes
e660: 74 2d 69 64 29 29 29 0a 0a 28 64 65 66 69 6e 65  t-id)))..(define
e670: 20 28 72 64 62 3a 67 65 74 2d 73 74 65 70 73 2d   (rdb:get-steps-
e680: 74 61 62 6c 65 20 64 62 20 74 65 73 74 2d 69 64  table db test-id
e690: 29 0a 20 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f  ).  (if *runremo
e6a0: 74 65 2a 0a 20 20 20 20 20 20 28 6c 65 74 20 28  te*.      (let (
e6b0: 28 68 6f 73 74 20 28 76 65 63 74 6f 72 2d 72 65  (host (vector-re
e6c0: 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29  f *runremote* 0)
e6d0: 29 0a 09 20 20 20 20 28 70 6f 72 74 20 28 76 65  )..    (port (ve
e6e0: 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d  ctor-ref *runrem
e6f0: 6f 74 65 2a 20 31 29 29 29 0a 09 28 28 72 70 63  ote* 1)))..((rpc
e700: 3a 70 72 6f 63 65 64 75 72 65 20 27 72 64 62 3a  :procedure 'rdb:
e710: 67 65 74 2d 73 74 65 70 73 2d 74 61 62 6c 65 20  get-steps-table 
e720: 68 6f 73 74 20 70 6f 72 74 29 20 74 65 73 74 2d  host port) test-
e730: 69 64 29 29 0a 20 20 20 20 20 20 28 64 62 3a 67  id)).      (db:g
e740: 65 74 2d 73 74 65 70 73 2d 74 61 62 6c 65 20 64  et-steps-table d
e750: 62 20 74 65 73 74 2d 69 64 29 29 29 0a 0a 28 64  b test-id)))..(d
e760: 65 66 69 6e 65 20 28 72 64 62 3a 72 65 61 64 2d  efine (rdb:read-
e770: 74 65 73 74 2d 64 61 74 61 20 64 62 20 74 65 73  test-data db tes
e780: 74 2d 69 64 20 63 61 74 65 67 6f 72 79 70 61 74  t-id categorypat
e790: 74 29 0a 20 20 28 69 66 20 2a 72 75 6e 72 65 6d  t).  (if *runrem
e7a0: 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c 65 74 20  ote*.      (let 
e7b0: 28 28 68 6f 73 74 20 28 76 65 63 74 6f 72 2d 72  ((host (vector-r
e7c0: 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30  ef *runremote* 0
e7d0: 29 29 0a 09 20 20 20 20 28 70 6f 72 74 20 28 76  ))..    (port (v
e7e0: 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65  ector-ref *runre
e7f0: 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28 28 72 70  mote* 1)))..((rp
e800: 63 3a 70 72 6f 63 65 64 75 72 65 20 27 72 64 62  c:procedure 'rdb
e810: 3a 72 65 61 64 2d 74 65 73 74 2d 64 61 74 61 20  :read-test-data 
e820: 68 6f 73 74 20 70 6f 72 74 29 20 74 65 73 74 2d  host port) test-
e830: 69 64 20 63 61 74 65 67 6f 72 79 70 61 74 74 29  id categorypatt)
e840: 29 0a 20 20 20 20 20 20 28 64 62 3a 72 65 61 64  ).      (db:read
e850: 2d 74 65 73 74 2d 64 61 74 61 20 64 62 20 74 65  -test-data db te
e860: 73 74 2d 69 64 20 63 61 74 65 67 6f 72 79 70 61  st-id categorypa
e870: 74 74 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  tt)))..(define (
e880: 72 64 62 3a 67 65 74 2d 74 65 73 74 2d 69 6e 66  rdb:get-test-inf
e890: 6f 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74  o db run-id test
e8a0: 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 0a  name item-path).
e8b0: 20 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65    (if *runremote
e8c0: 2a 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28 68  *.      (let ((h
e8d0: 6f 73 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20  ost (vector-ref 
e8e0: 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a  *runremote* 0)).
e8f0: 09 20 20 20 20 28 70 6f 72 74 20 28 76 65 63 74  .    (port (vect
e900: 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74  or-ref *runremot
e910: 65 2a 20 31 29 29 29 0a 09 28 28 72 70 63 3a 70  e* 1)))..((rpc:p
e920: 72 6f 63 65 64 75 72 65 20 27 72 64 62 3a 67 65  rocedure 'rdb:ge
e930: 74 2d 74 65 73 74 2d 69 6e 66 6f 20 68 6f 73 74  t-test-info host
e940: 20 70 6f 72 74 29 20 72 75 6e 2d 69 64 20 74 65   port) run-id te
e950: 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68  stname item-path
e960: 29 29 0a 20 20 20 20 20 20 28 64 62 3a 67 65 74  )).      (db:get
e970: 2d 74 65 73 74 2d 69 6e 66 6f 20 64 62 20 72 75  -test-info db ru
e980: 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 69 74  n-id testname it
e990: 65 6d 2d 70 61 74 68 29 29 29 0a 0a 28 64 65 66  em-path)))..(def
e9a0: 69 6e 65 20 28 72 64 62 3a 64 65 6c 65 74 65 2d  ine (rdb:delete-
e9b0: 74 65 73 74 2d 72 65 63 6f 72 64 73 20 64 62 20  test-records db 
e9c0: 74 65 73 74 2d 69 64 29 0a 20 20 28 69 66 20 2a  test-id).  (if *
e9d0: 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20  runremote*.     
e9e0: 20 28 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65   (let ((host (ve
e9f0: 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d  ctor-ref *runrem
ea00: 6f 74 65 2a 20 30 29 29 0a 09 20 20 20 20 28 70  ote* 0))..    (p
ea10: 6f 72 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20  ort (vector-ref 
ea20: 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29  *runremote* 1)))
ea30: 0a 09 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72  ..((rpc:procedur
ea40: 65 20 27 72 64 62 3a 64 65 6c 65 74 65 2d 74 65  e 'rdb:delete-te
ea50: 73 74 2d 72 65 63 6f 72 64 73 20 68 6f 73 74 20  st-records host 
ea60: 70 6f 72 74 29 20 74 65 73 74 2d 69 64 29 29 0a  port) test-id)).
ea70: 20 20 20 20 20 20 28 64 62 3a 64 65 6c 65 74 65        (db:delete
ea80: 2d 74 65 73 74 2d 72 65 63 6f 72 64 73 20 64 62  -test-records db
ea90: 20 74 65 73 74 2d 69 64 29 29 29 0a 0a 28 64 65   test-id)))..(de
eaa0: 66 69 6e 65 20 28 72 64 62 3a 74 65 73 74 2d 64  fine (rdb:test-d
eab0: 61 74 61 2d 72 6f 6c 6c 75 70 20 64 62 20 74 65  ata-rollup db te
eac0: 73 74 2d 69 64 20 73 74 61 74 75 73 29 0a 20 20  st-id status).  
ead0: 20 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65    (if *runremote
eae0: 2a 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28 68  *.      (let ((h
eaf0: 6f 73 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20  ost (vector-ref 
eb00: 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a  *runremote* 0)).
eb10: 09 20 20 20 20 28 70 6f 72 74 20 28 76 65 63 74  .    (port (vect
eb20: 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74  or-ref *runremot
eb30: 65 2a 20 31 29 29 29 0a 09 28 28 72 70 63 3a 70  e* 1)))..((rpc:p
eb40: 72 6f 63 65 64 75 72 65 20 27 72 64 62 3a 74 65  rocedure 'rdb:te
eb50: 73 74 2d 64 61 74 61 2d 72 6f 6c 6c 75 70 20 68  st-data-rollup h
eb60: 6f 73 74 20 70 6f 72 74 29 20 74 65 73 74 2d 69  ost port) test-i
eb70: 64 20 73 74 61 74 75 73 29 29 0a 20 20 20 20 20  d status)).     
eb80: 20 28 64 62 3a 74 65 73 74 2d 64 61 74 61 2d 72   (db:test-data-r
eb90: 6f 6c 6c 75 70 20 64 62 20 74 65 73 74 2d 69 64  ollup db test-id
eba0: 20 73 74 61 74 75 73 29 29 29 0a 0a 28 64 65 66   status)))..(def
ebb0: 69 6e 65 20 28 72 64 62 3a 74 65 73 74 2d 67 65  ine (rdb:test-ge
ebc0: 74 2d 70 61 74 68 73 2d 6d 61 74 63 68 69 6e 67  t-paths-matching
ebd0: 20 64 62 20 6b 65 79 6e 61 6d 65 73 20 74 61 72   db keynames tar
ebe0: 67 65 74 29 0a 20 20 20 28 69 66 20 2a 72 75 6e  get).   (if *run
ebf0: 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 20 28  remote*.       (
ec00: 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65 63 74  let ((host (vect
ec10: 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74  or-ref *runremot
ec20: 65 2a 20 30 29 29 0a 09 20 20 20 20 20 28 70 6f  e* 0))..     (po
ec30: 72 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a  rt (vector-ref *
ec40: 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a  runremote* 1))).
ec50: 09 20 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72  . ((rpc:procedur
ec60: 65 20 27 72 64 62 3a 74 65 73 74 2d 67 65 74 2d  e 'rdb:test-get-
ec70: 70 61 74 68 73 2d 6d 61 74 63 68 69 6e 67 20 68  paths-matching h
ec80: 6f 73 74 20 70 6f 72 74 29 20 6b 65 79 6e 61 6d  ost port) keynam
ec90: 65 73 20 74 61 72 67 65 74 29 29 0a 20 20 20 20  es target)).    
eca0: 20 20 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d     (db:test-get-
ecb0: 70 61 74 68 73 2d 6d 61 74 63 68 69 6e 67 20 64  paths-matching d
ecc0: 62 20 6b 65 79 6e 61 6d 65 73 20 74 61 72 67 65  b keynames targe
ecd0: 74 29 29 29 0a 0a 20 0a                          t))).. .