Megatest

Hex Artifact Content
Login

Artifact ea2d2124424f7b1d685345e8f42ffd4a3b0fcf9e:


0000: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
0010: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0030: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0040: 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 43 6f 70 79  ========.;; Copy
0050: 72 69 67 68 74 20 32 30 30 36 2d 32 30 31 31 2c  right 2006-2011,
0060: 20 4d 61 74 74 68 65 77 20 57 65 6c 6c 61 6e 64   Matthew Welland
0070: 2e 0a 3b 3b 20 0a 3b 3b 20 20 54 68 69 73 20 70  ..;; .;;  This p
0080: 72 6f 67 72 61 6d 20 69 73 20 6d 61 64 65 20 61  rogram is made a
0090: 76 61 69 6c 61 62 6c 65 20 75 6e 64 65 72 20 74  vailable under t
00a0: 68 65 20 47 4e 55 20 47 50 4c 20 76 65 72 73 69  he GNU GPL versi
00b0: 6f 6e 20 32 2e 30 20 6f 72 0a 3b 3b 20 20 67 72  on 2.0 or.;;  gr
00c0: 65 61 74 65 72 2e 20 53 65 65 20 74 68 65 20 61  eater. See the a
00d0: 63 63 6f 6d 70 61 6e 79 69 6e 67 20 66 69 6c 65  ccompanying file
00e0: 20 43 4f 50 59 49 4e 47 20 66 6f 72 20 64 65 74   COPYING for det
00f0: 61 69 6c 73 2e 0a 3b 3b 20 0a 3b 3b 20 20 54 68  ails..;; .;;  Th
0100: 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69  is program is di
0110: 73 74 72 69 62 75 74 65 64 20 57 49 54 48 4f 55  stributed WITHOU
0120: 54 20 41 4e 59 20 57 41 52 52 41 4e 54 59 3b 20  T ANY WARRANTY; 
0130: 77 69 74 68 6f 75 74 20 65 76 65 6e 20 74 68 65  without even the
0140: 0a 3b 3b 20 20 69 6d 70 6c 69 65 64 20 77 61 72  .;;  implied war
0150: 72 61 6e 74 79 20 6f 66 20 4d 45 52 43 48 41 4e  ranty of MERCHAN
0160: 54 41 42 49 4c 49 54 59 20 6f 72 20 46 49 54 4e  TABILITY or FITN
0170: 45 53 53 20 46 4f 52 20 41 20 50 41 52 54 49 43  ESS FOR A PARTIC
0180: 55 4c 41 52 0a 3b 3b 20 20 50 55 52 50 4f 53 45  ULAR.;;  PURPOSE
0190: 2e 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ..;;============
01a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 3d 3d  ==========..;;==
01e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0200: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0210: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0220: 3d 3d 3d 3d 0a 3b 3b 20 44 61 74 61 62 61 73 65  ====.;; Database
0230: 20 61 63 63 65 73 73 0a 3b 3b 3d 3d 3d 3d 3d 3d   access.;;======
0240: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0250: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0260: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0270: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0280: 0a 0a 28 72 65 71 75 69 72 65 2d 65 78 74 65 6e  ..(require-exten
0290: 73 69 6f 6e 20 28 73 72 66 69 20 31 38 29 20 65  sion (srfi 18) e
02a0: 78 74 72 61 73 20 74 63 70 20 72 70 63 29 0a 28  xtras tcp rpc).(
02b0: 69 6d 70 6f 72 74 20 28 70 72 65 66 69 78 20 72  import (prefix r
02c0: 70 63 20 72 70 63 3a 29 29 0a 0a 28 75 73 65 20  pc rpc:))..(use 
02d0: 73 71 6c 69 74 65 33 20 73 72 66 69 2d 31 20 70  sqlite3 srfi-1 p
02e0: 6f 73 69 78 20 72 65 67 65 78 20 72 65 67 65 78  osix regex regex
02f0: 2d 63 61 73 65 20 73 72 66 69 2d 36 39 20 63 73  -case srfi-69 cs
0300: 76 2d 78 6d 6c 29 0a 28 69 6d 70 6f 72 74 20 28  v-xml).(import (
0310: 70 72 65 66 69 78 20 73 71 6c 69 74 65 33 20 73  prefix sqlite3 s
0320: 71 6c 69 74 65 33 3a 29 29 0a 0a 28 64 65 63 6c  qlite3:))..(decl
0330: 61 72 65 20 28 75 6e 69 74 20 64 62 29 29 0a 28  are (unit db)).(
0340: 64 65 63 6c 61 72 65 20 28 75 73 65 73 20 63 6f  declare (uses co
0350: 6d 6d 6f 6e 29 29 0a 28 64 65 63 6c 61 72 65 20  mmon)).(declare 
0360: 28 75 73 65 73 20 6b 65 79 73 29 29 0a 28 64 65  (uses keys)).(de
0370: 63 6c 61 72 65 20 28 75 73 65 73 20 6f 64 73 29  clare (uses ods)
0380: 29 0a 0a 28 69 6e 63 6c 75 64 65 20 22 63 6f 6d  )..(include "com
0390: 6d 6f 6e 5f 72 65 63 6f 72 64 73 2e 73 63 6d 22  mon_records.scm"
03a0: 29 0a 28 69 6e 63 6c 75 64 65 20 22 64 62 5f 72  ).(include "db_r
03b0: 65 63 6f 72 64 73 2e 73 63 6d 22 29 0a 28 69 6e  ecords.scm").(in
03c0: 63 6c 75 64 65 20 22 6b 65 79 5f 72 65 63 6f 72  clude "key_recor
03d0: 64 73 2e 73 63 6d 22 29 0a 28 69 6e 63 6c 75 64  ds.scm").(includ
03e0: 65 20 22 72 75 6e 5f 72 65 63 6f 72 64 73 2e 73  e "run_records.s
03f0: 63 6d 22 29 0a 0a 28 64 65 66 69 6e 65 20 28 6f  cm")..(define (o
0400: 70 65 6e 2d 64 62 29 20 3b 3b 20 20 28 63 6f 6e  pen-db) ;;  (con
0410: 63 20 2a 74 6f 70 70 61 74 68 2a 20 22 2f 6d 65  c *toppath* "/me
0420: 67 61 74 65 73 74 2e 64 62 22 29 20 28 63 61 72  gatest.db") (car
0430: 20 2a 63 6f 6e 66 69 67 69 6e 66 6f 2a 29 29 29   *configinfo*)))
0440: 0a 20 20 28 6c 65 74 2a 20 28 28 64 62 70 61 74  .  (let* ((dbpat
0450: 68 20 20 20 20 28 63 6f 6e 63 20 2a 74 6f 70 70  h    (conc *topp
0460: 61 74 68 2a 20 22 2f 6d 65 67 61 74 65 73 74 2e  ath* "/megatest.
0470: 64 62 22 29 29 20 3b 3b 20 66 6e 61 6d 65 29 0a  db")) ;; fname).
0480: 09 20 28 63 6f 6e 66 69 67 64 61 74 20 28 63 61  . (configdat (ca
0490: 72 20 2a 63 6f 6e 66 69 67 69 6e 66 6f 2a 29 29  r *configinfo*))
04a0: 0a 09 20 28 64 62 65 78 69 73 74 73 20 20 28 66  .. (dbexists  (f
04b0: 69 6c 65 2d 65 78 69 73 74 73 3f 20 64 62 70 61  ile-exists? dbpa
04c0: 74 68 29 29 0a 09 20 28 64 62 20 20 20 20 20 20  th)).. (db      
04d0: 20 20 28 73 71 6c 69 74 65 33 3a 6f 70 65 6e 2d    (sqlite3:open-
04e0: 64 61 74 61 62 61 73 65 20 64 62 70 61 74 68 29  database dbpath)
04f0: 29 20 3b 3b 20 28 6e 65 76 65 72 2d 67 69 76 65  ) ;; (never-give
0500: 2d 75 70 2d 6f 70 65 6e 2d 64 62 20 64 62 70 61  -up-open-db dbpa
0510: 74 68 29 29 0a 09 20 28 68 61 6e 64 6c 65 72 20  th)).. (handler 
0520: 20 20 28 6d 61 6b 65 2d 62 75 73 79 2d 74 69 6d    (make-busy-tim
0530: 65 6f 75 74 20 33 36 30 30 30 29 29 29 0a 20 20  eout 36000))).  
0540: 20 20 28 73 71 6c 69 74 65 33 3a 73 65 74 2d 62    (sqlite3:set-b
0550: 75 73 79 2d 68 61 6e 64 6c 65 72 21 20 64 62 20  usy-handler! db 
0560: 68 61 6e 64 6c 65 72 29 0a 20 20 20 20 28 69 66  handler).    (if
0570: 20 28 6e 6f 74 20 64 62 65 78 69 73 74 73 29 0a   (not dbexists).
0580: 09 28 6c 65 74 2a 20 28 28 6b 65 79 73 20 20 20  .(let* ((keys   
0590: 20 20 28 63 6f 6e 66 69 67 2d 67 65 74 2d 66 69    (config-get-fi
05a0: 65 6c 64 73 20 63 6f 6e 66 69 67 64 61 74 29 29  elds configdat))
05b0: 0a 09 20 20 20 20 20 20 20 28 68 61 76 65 6b 65  ..       (haveke
05c0: 79 73 20 28 3e 20 28 6c 65 6e 67 74 68 20 6b 65  ys (> (length ke
05d0: 79 73 29 20 30 29 29 0a 09 20 20 20 20 20 20 20  ys) 0))..       
05e0: 28 6b 65 79 73 74 72 20 20 20 28 6b 65 79 73 2d  (keystr   (keys-
05f0: 3e 6b 65 79 73 74 72 20 6b 65 79 73 29 29 0a 09  >keystr keys))..
0600: 20 20 20 20 20 20 20 28 66 69 65 6c 64 73 74 72         (fieldstr
0610: 20 28 6b 65 79 73 2d 3e 6b 65 79 2f 66 69 65 6c   (keys->key/fiel
0620: 64 20 6b 65 79 73 29 29 29 0a 09 20 20 28 66 6f  d keys)))..  (fo
0630: 72 2d 65 61 63 68 20 28 6c 61 6d 62 64 61 20 28  r-each (lambda (
0640: 6b 65 79 29 0a 09 09 20 20 20 20 20 20 28 6c 65  key)...      (le
0650: 74 20 28 28 6b 65 79 6e 20 28 76 65 63 74 6f 72  t ((keyn (vector
0660: 2d 72 65 66 20 6b 65 79 20 30 29 29 29 0a 09 09  -ref key 0)))...
0670: 09 28 69 66 20 28 6d 65 6d 62 65 72 20 28 73 74  .(if (member (st
0680: 72 69 6e 67 2d 64 6f 77 6e 63 61 73 65 20 6b 65  ring-downcase ke
0690: 79 6e 29 0a 09 09 09 09 20 20 20 20 28 6c 69 73  yn).....    (lis
06a0: 74 20 22 72 75 6e 6e 61 6d 65 22 20 22 73 74 61  t "runname" "sta
06b0: 74 65 22 20 22 73 74 61 74 75 73 22 20 22 6f 77  te" "status" "ow
06c0: 6e 65 72 22 20 22 65 76 65 6e 74 5f 74 69 6d 65  ner" "event_time
06d0: 22 20 22 63 6f 6d 6d 65 6e 74 22 20 22 66 61 69  " "comment" "fai
06e0: 6c 5f 63 6f 75 6e 74 22 0a 09 09 09 09 09 20 20  l_count"......  
06f0: 22 70 61 73 73 5f 63 6f 75 6e 74 22 29 29 0a 09  "pass_count"))..
0700: 09 09 20 20 20 20 28 62 65 67 69 6e 0a 09 09 09  ..    (begin....
0710: 20 20 20 20 20 20 28 70 72 69 6e 74 20 22 45 52        (print "ER
0720: 52 4f 52 3a 20 79 6f 75 72 20 6b 65 79 20 63 61  ROR: your key ca
0730: 6e 6e 6f 74 20 62 65 20 6e 61 6d 65 64 20 22 20  nnot be named " 
0740: 6b 65 79 6e 20 22 20 61 73 20 74 68 69 73 20 63  keyn " as this c
0750: 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 74 68  onflicts with th
0760: 65 20 73 61 6d 65 20 6e 61 6d 65 64 20 66 69 65  e same named fie
0770: 6c 64 20 69 6e 20 74 68 65 20 72 75 6e 73 20 74  ld in the runs t
0780: 61 62 6c 65 22 29 0a 09 09 09 20 20 20 20 20 20  able")....      
0790: 28 73 79 73 74 65 6d 20 28 63 6f 6e 63 20 22 72  (system (conc "r
07a0: 6d 20 2d 66 20 22 20 64 62 70 61 74 68 29 29 0a  m -f " dbpath)).
07b0: 09 09 09 20 20 20 20 20 20 28 65 78 69 74 20 31  ...      (exit 1
07c0: 29 29 29 29 29 0a 09 09 20 20 20 20 6b 65 79 73  )))))...    keys
07d0: 29 0a 09 20 20 3b 3b 20 28 73 71 6c 69 74 65 33  )..  ;; (sqlite3
07e0: 3a 65 78 65 63 75 74 65 20 64 62 20 22 50 52 41  :execute db "PRA
07f0: 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  GMA synchronous 
0800: 3d 20 4f 46 46 3b 22 29 0a 09 20 20 28 73 71 6c  = OFF;")..  (sql
0810: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
0820: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46  "CREATE TABLE IF
0830: 20 4e 4f 54 20 45 58 49 53 54 53 20 6b 65 79 73   NOT EXISTS keys
0840: 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49   (id INTEGER PRI
0850: 4d 41 52 59 20 4b 45 59 2c 20 66 69 65 6c 64 6e  MARY KEY, fieldn
0860: 61 6d 65 20 54 45 58 54 2c 20 66 69 65 6c 64 74  ame TEXT, fieldt
0870: 79 70 65 20 54 45 58 54 2c 20 43 4f 4e 53 54 52  ype TEXT, CONSTR
0880: 41 49 4e 54 20 6b 65 79 63 6f 6e 73 74 72 61 69  AINT keyconstrai
0890: 6e 74 20 55 4e 49 51 55 45 20 28 66 69 65 6c 64  nt UNIQUE (field
08a0: 6e 61 6d 65 29 29 3b 22 29 0a 09 20 20 28 66 6f  name));")..  (fo
08b0: 72 2d 65 61 63 68 20 28 6c 61 6d 62 64 61 20 28  r-each (lambda (
08c0: 6b 65 79 29 0a 09 09 20 20 20 20 20 20 28 73 71  key)...      (sq
08d0: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62  lite3:execute db
08e0: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 6b 65   "INSERT INTO ke
08f0: 79 73 20 28 66 69 65 6c 64 6e 61 6d 65 2c 66 69  ys (fieldname,fi
0900: 65 6c 64 74 79 70 65 29 20 56 41 4c 55 45 53 20  eldtype) VALUES 
0910: 28 3f 2c 3f 29 3b 22 20 28 6b 65 79 3a 67 65 74  (?,?);" (key:get
0920: 2d 66 69 65 6c 64 6e 61 6d 65 20 6b 65 79 29 28  -fieldname key)(
0930: 6b 65 79 3a 67 65 74 2d 66 69 65 6c 64 74 79 70  key:get-fieldtyp
0940: 65 20 6b 65 79 29 29 29 0a 09 09 20 20 20 20 6b  e key)))...    k
0950: 65 79 73 29 0a 09 20 20 28 73 71 6c 69 74 65 33  eys)..  (sqlite3
0960: 3a 65 78 65 63 75 74 65 20 64 62 20 28 63 6f 6e  :execute db (con
0970: 63 20 0a 09 09 09 20 20 20 20 20 20 20 22 43 52  c ....       "CR
0980: 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f  EATE TABLE IF NO
0990: 54 20 45 58 49 53 54 53 20 72 75 6e 73 20 28 69  T EXISTS runs (i
09a0: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  d INTEGER PRIMAR
09b0: 59 20 4b 45 59 2c 20 22 20 0a 09 09 09 20 20 20  Y KEY, " ....   
09c0: 20 20 20 20 66 69 65 6c 64 73 74 72 20 28 69 66      fieldstr (if
09d0: 20 68 61 76 65 6b 65 79 73 20 22 2c 22 20 22 22   havekeys "," ""
09e0: 29 0a 09 09 09 20 20 20 20 20 20 20 22 72 75 6e  )....       "run
09f0: 6e 61 6d 65 20 54 45 58 54 2c 22 0a 09 09 09 20  name TEXT,".... 
0a00: 20 20 20 20 20 20 22 73 74 61 74 65 20 54 45 58        "state TEX
0a10: 54 20 44 45 46 41 55 4c 54 20 27 27 2c 22 0a 09  T DEFAULT '',"..
0a20: 09 09 20 20 20 20 20 20 20 22 73 74 61 74 75 73  ..       "status
0a30: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27   TEXT DEFAULT ''
0a40: 2c 22 0a 09 09 09 20 20 20 20 20 20 20 22 6f 77  ,"....       "ow
0a50: 6e 65 72 20 54 45 58 54 20 44 45 46 41 55 4c 54  ner TEXT DEFAULT
0a60: 20 27 27 2c 22 0a 09 09 09 20 20 20 20 20 20 20   '',"....       
0a70: 22 65 76 65 6e 74 5f 74 69 6d 65 20 54 49 4d 45  "event_time TIME
0a80: 53 54 41 4d 50 2c 22 0a 09 09 09 20 20 20 20 20  STAMP,"....     
0a90: 20 20 22 63 6f 6d 6d 65 6e 74 20 54 45 58 54 20    "comment TEXT 
0aa0: 44 45 46 41 55 4c 54 20 27 27 2c 22 0a 09 09 09  DEFAULT '',"....
0ab0: 20 20 20 20 20 20 20 22 66 61 69 6c 5f 63 6f 75         "fail_cou
0ac0: 6e 74 20 49 4e 54 45 47 45 52 20 44 45 46 41 55  nt INTEGER DEFAU
0ad0: 4c 54 20 30 2c 22 0a 09 09 09 20 20 20 20 20 20  LT 0,"....      
0ae0: 20 22 70 61 73 73 5f 63 6f 75 6e 74 20 49 4e 54   "pass_count INT
0af0: 45 47 45 52 20 44 45 46 41 55 4c 54 20 30 2c 22  EGER DEFAULT 0,"
0b00: 0a 09 09 09 20 20 20 20 20 20 20 22 43 4f 4e 53  ....       "CONS
0b10: 54 52 41 49 4e 54 20 72 75 6e 73 63 6f 6e 73 74  TRAINT runsconst
0b20: 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28 72 75  raint UNIQUE (ru
0b30: 6e 6e 61 6d 65 22 20 28 69 66 20 68 61 76 65 6b  nname" (if havek
0b40: 65 79 73 20 22 2c 22 20 22 22 29 20 6b 65 79 73  eys "," "") keys
0b50: 74 72 20 22 29 29 3b 22 29 29 0a 09 20 20 28 73  tr "));"))..  (s
0b60: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64  qlite3:execute d
0b70: 62 20 28 63 6f 6e 63 20 22 43 52 45 41 54 45 20  b (conc "CREATE 
0b80: 49 4e 44 45 58 20 72 75 6e 73 5f 69 6e 64 65 78  INDEX runs_index
0b90: 20 4f 4e 20 72 75 6e 73 20 28 72 75 6e 6e 61 6d   ON runs (runnam
0ba0: 65 22 20 28 69 66 20 68 61 76 65 6b 65 79 73 20  e" (if havekeys 
0bb0: 22 2c 22 20 22 22 29 20 6b 65 79 73 74 72 20 22  "," "") keystr "
0bc0: 29 3b 22 29 29 0a 09 20 20 28 73 71 6c 69 74 65  );"))..  (sqlite
0bd0: 33 3a 65 78 65 63 75 74 65 20 64 62 20 0a 09 09  3:execute db ...
0be0: 09 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c  .   "CREATE TABL
0bf0: 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20  E IF NOT EXISTS 
0c00: 74 65 73 74 73 20 0a 20 20 20 20 20 20 20 20 20  tests .         
0c10: 20 20 20 20 20 20 20 20 20 20 20 28 69 64 20 49             (id I
0c20: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
0c30: 45 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  EY,.            
0c40: 20 20 20 20 20 20 20 20 20 72 75 6e 5f 69 64 20           run_id 
0c50: 20 20 20 20 49 4e 54 45 47 45 52 2c 0a 20 20 20      INTEGER,.   
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c70: 20 20 74 65 73 74 6e 61 6d 65 20 20 20 54 45 58    testname   TEX
0c80: 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  T,.             
0c90: 20 20 20 20 20 20 20 20 68 6f 73 74 20 20 20 20          host    
0ca0: 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20     TEXT DEFAULT 
0cb0: 27 6e 2f 61 27 2c 0a 20 20 20 20 20 20 20 20 20  'n/a',.         
0cc0: 20 20 20 20 20 20 20 20 20 20 20 20 63 70 75 6c              cpul
0cd0: 6f 61 64 20 20 20 20 52 45 41 4c 20 44 45 46 41  oad    REAL DEFA
0ce0: 55 4c 54 20 2d 31 2c 0a 20 20 20 20 20 20 20 20  ULT -1,.        
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
0d00: 6b 66 72 65 65 20 20 20 49 4e 54 45 47 45 52 20  kfree   INTEGER 
0d10: 44 45 46 41 55 4c 54 20 2d 31 2c 0a 20 20 20 20  DEFAULT -1,.    
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d30: 20 75 6e 61 6d 65 20 20 20 20 20 20 54 45 58 54   uname      TEXT
0d40: 20 44 45 46 41 55 4c 54 20 27 6e 2f 61 27 2c 20   DEFAULT 'n/a', 
0d50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0d60: 20 20 20 20 20 20 72 75 6e 64 69 72 20 20 20 20        rundir    
0d70: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 6e   TEXT DEFAULT 'n
0d80: 2f 61 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20  /a',.           
0d90: 20 20 20 20 20 20 20 20 20 20 73 68 6f 72 74 64            shortd
0da0: 69 72 20 20 20 54 45 58 54 20 44 45 46 41 55 4c  ir   TEXT DEFAUL
0db0: 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20  T '',.          
0dc0: 20 20 20 20 20 20 20 20 20 20 20 69 74 65 6d 5f             item_
0dd0: 70 61 74 68 20 20 54 45 58 54 20 44 45 46 41 55  path  TEXT DEFAU
0de0: 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20  LT '',.         
0df0: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74              stat
0e00: 65 20 20 20 20 20 20 54 45 58 54 20 44 45 46 41  e      TEXT DEFA
0e10: 55 4c 54 20 27 4e 4f 54 5f 53 54 41 52 54 45 44  ULT 'NOT_STARTED
0e20: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ',.             
0e30: 20 20 20 20 20 20 20 20 73 74 61 74 75 73 20 20          status  
0e40: 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20     TEXT DEFAULT 
0e50: 27 46 41 49 4c 27 2c 0a 20 20 20 20 20 20 20 20  'FAIL',.        
0e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 74 74               att
0e70: 65 6d 70 74 6e 75 6d 20 49 4e 54 45 47 45 52 20  emptnum INTEGER 
0e80: 44 45 46 41 55 4c 54 20 30 2c 0a 20 20 20 20 20  DEFAULT 0,.     
0e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ea0: 66 69 6e 61 6c 5f 6c 6f 67 66 20 54 45 58 54 20  final_logf TEXT 
0eb0: 44 45 46 41 55 4c 54 20 27 6c 6f 67 73 2f 66 69  DEFAULT 'logs/fi
0ec0: 6e 61 6c 2e 6c 6f 67 27 2c 0a 20 20 20 20 20 20  nal.log',.      
0ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
0ee0: 6f 67 64 61 74 20 20 20 20 20 42 4c 4f 42 2c 20  ogdat     BLOB, 
0ef0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0f00: 20 20 20 20 20 20 72 75 6e 5f 64 75 72 61 74 69        run_durati
0f10: 6f 6e 20 49 4e 54 45 47 45 52 20 44 45 46 41 55  on INTEGER DEFAU
0f20: 4c 54 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  LT 0,.          
0f30: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 65             comme
0f40: 6e 74 20 20 20 20 54 45 58 54 20 44 45 46 41 55  nt    TEXT DEFAU
0f50: 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20  LT '',.         
0f60: 20 20 20 20 20 20 20 20 20 20 20 20 65 76 65 6e              even
0f70: 74 5f 74 69 6d 65 20 54 49 4d 45 53 54 41 4d 50  t_time TIMESTAMP
0f80: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
0f90: 20 20 20 20 20 20 20 66 61 69 6c 5f 63 6f 75 6e         fail_coun
0fa0: 74 20 49 4e 54 45 47 45 52 20 44 45 46 41 55 4c  t INTEGER DEFAUL
0fb0: 54 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  T 0,.           
0fc0: 20 20 20 20 20 20 20 20 20 20 70 61 73 73 5f 63            pass_c
0fd0: 6f 75 6e 74 20 49 4e 54 45 47 45 52 20 44 45 46  ount INTEGER DEF
0fe0: 41 55 4c 54 20 30 2c 0a 20 20 20 20 20 20 20 20  AULT 0,.        
0ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 72 63               arc
1000: 68 69 76 65 64 20 20 20 49 4e 54 45 47 45 52 20  hived   INTEGER 
1010: 44 45 46 41 55 4c 54 20 30 2c 20 2d 2d 20 30 3d  DEFAULT 0, -- 0=
1020: 6e 6f 2c 20 31 3d 69 6e 20 70 72 6f 67 72 65 73  no, 1=in progres
1030: 73 2c 20 32 3d 79 65 73 0a 20 20 20 20 20 20 20  s, 2=yes.       
1040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 4f                CO
1050: 4e 53 54 52 41 49 4e 54 20 74 65 73 74 73 63 6f  NSTRAINT testsco
1060: 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20  nstraint UNIQUE 
1070: 28 72 75 6e 5f 69 64 2c 20 74 65 73 74 6e 61 6d  (run_id, testnam
1080: 65 2c 20 69 74 65 6d 5f 70 61 74 68 29 0a 20 20  e, item_path).  
1090: 20 20 20 20 20 20 20 20 29 3b 22 29 0a 09 20 20          );")..  
10a0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
10b0: 20 64 62 20 22 43 52 45 41 54 45 20 49 4e 44 45   db "CREATE INDE
10c0: 58 20 74 65 73 74 73 5f 69 6e 64 65 78 20 4f 4e  X tests_index ON
10d0: 20 74 65 73 74 73 20 28 72 75 6e 5f 69 64 2c 20   tests (run_id, 
10e0: 74 65 73 74 6e 61 6d 65 29 3b 22 29 0a 09 20 20  testname);")..  
10f0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
1100: 20 64 62 20 22 43 52 45 41 54 45 20 56 49 45 57   db "CREATE VIEW
1110: 20 72 75 6e 73 5f 74 65 73 74 73 20 41 53 20 53   runs_tests AS S
1120: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 72 75 6e  ELECT * FROM run
1130: 73 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 74 65 73  s INNER JOIN tes
1140: 74 73 20 4f 4e 20 72 75 6e 73 2e 69 64 3d 74 65  ts ON runs.id=te
1150: 73 74 73 2e 72 75 6e 5f 69 64 3b 22 29 0a 09 20  sts.run_id;").. 
1160: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
1170: 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41 42  e db "CREATE TAB
1180: 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53  LE IF NOT EXISTS
1190: 20 74 65 73 74 5f 73 74 65 70 73 20 0a 20 20 20   test_steps .   
11a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11b0: 20 20 20 20 20 20 20 20 20 20 20 28 69 64 20 49             (id I
11c0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
11d0: 45 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  EY,.            
11e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f0: 20 20 20 74 65 73 74 5f 69 64 20 49 4e 54 45 47     test_id INTEG
1200: 45 52 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ER, .           
1210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1220: 20 20 20 20 73 74 65 70 6e 61 6d 65 20 54 45 58      stepname TEX
1230: 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  T, .            
1240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1250: 20 20 20 73 74 61 74 65 20 54 45 58 54 20 44 45     state TEXT DE
1260: 46 41 55 4c 54 20 27 4e 4f 54 5f 53 54 41 52 54  FAULT 'NOT_START
1270: 45 44 27 2c 20 0a 20 20 20 20 20 20 20 20 20 20  ED', .          
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1290: 20 20 20 20 20 73 74 61 74 75 73 20 54 45 58 54       status TEXT
12a0: 20 44 45 46 41 55 4c 54 20 27 6e 2f 61 27 2c 0a   DEFAULT 'n/a',.
12b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
12d0: 76 65 6e 74 5f 74 69 6d 65 20 54 49 4d 45 53 54  vent_time TIMEST
12e0: 41 4d 50 2c 0a 20 20 20 20 20 20 20 20 20 20 20  AMP,.           
12f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1300: 20 20 20 20 63 6f 6d 6d 65 6e 74 20 54 45 58 54      comment TEXT
1310: 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20   DEFAULT '',.   
1320: 20 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 6c 6f 67 66              logf
1340: 69 6c 65 20 54 45 58 54 20 44 45 46 41 55 4c 54  ile TEXT DEFAULT
1350: 20 27 27 2c 0a 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 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 74      CONSTRAINT t
1380: 65 73 74 5f 73 74 65 70 73 5f 63 6f 6e 73 74 72  est_steps_constr
1390: 61 69 6e 74 20 55 4e 49 51 55 45 20 28 74 65 73  aint UNIQUE (tes
13a0: 74 5f 69 64 2c 73 74 65 70 6e 61 6d 65 2c 73 74  t_id,stepname,st
13b0: 61 74 65 29 29 3b 22 29 0a 09 20 20 28 73 71 6c  ate));")..  (sql
13c0: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
13d0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46  "CREATE TABLE IF
13e0: 20 4e 4f 54 20 45 58 49 53 54 53 20 65 78 74 72   NOT EXISTS extr
13f0: 61 64 61 74 20 28 69 64 20 49 4e 54 45 47 45 52  adat (id INTEGER
1400: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 72 75   PRIMARY KEY, ru
1410: 6e 5f 69 64 20 49 4e 54 45 47 45 52 2c 20 6b 65  n_id INTEGER, ke
1420: 79 20 54 45 58 54 2c 20 76 61 6c 20 54 45 58 54  y TEXT, val TEXT
1430: 29 3b 22 29 0a 09 20 20 28 73 71 6c 69 74 65 33  );")..  (sqlite3
1440: 3a 65 78 65 63 75 74 65 20 64 62 20 22 43 52 45  :execute db "CRE
1450: 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54  ATE TABLE IF NOT
1460: 20 45 58 49 53 54 53 20 6d 65 74 61 64 61 74 20   EXISTS metadat 
1470: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d  (id INTEGER PRIM
1480: 41 52 59 20 4b 45 59 2c 20 76 61 72 20 54 45 58  ARY KEY, var TEX
1490: 54 2c 20 76 61 6c 20 54 45 58 54 2c 0a 20 20 20  T, val TEXT,.   
14a0: 20 20 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 43                 C
14c0: 4f 4e 53 54 52 41 49 4e 54 20 6d 65 74 61 64 61  ONSTRAINT metada
14d0: 74 5f 63 6f 6e 73 74 72 61 69 6e 74 20 55 4e 49  t_constraint UNI
14e0: 51 55 45 20 28 76 61 72 29 29 3b 22 29 0a 09 20  QUE (var));").. 
14f0: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
1500: 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41 42  e db "CREATE TAB
1510: 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53  LE IF NOT EXISTS
1520: 20 61 63 63 65 73 73 5f 6c 6f 67 20 28 69 64 20   access_log (id 
1530: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
1540: 4b 45 59 2c 20 75 73 65 72 20 54 45 58 54 2c 20  KEY, user TEXT, 
1550: 61 63 63 65 73 73 65 64 20 54 49 4d 45 53 54 41  accessed TIMESTA
1560: 4d 50 2c 20 61 72 67 73 20 54 45 58 54 29 3b 22  MP, args TEXT);"
1570: 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65 78  )..  (sqlite3:ex
1580: 65 63 75 74 65 20 64 62 20 22 43 52 45 41 54 45  ecute db "CREATE
1590: 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58   TABLE IF NOT EX
15a0: 49 53 54 53 20 74 65 73 74 5f 6d 65 74 61 20 28  ISTS test_meta (
15b0: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  id INTEGER PRIMA
15c0: 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 20 20 20  RY KEY,.        
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
15f0: 74 6e 61 6d 65 20 20 20 20 54 45 58 54 20 44 45  tname    TEXT DE
1600: 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20  FAULT '',.      
1610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1630: 75 74 68 6f 72 20 20 20 20 20 20 54 45 58 54 20  uthor      TEXT 
1640: 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20  DEFAULT '',.    
1650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1670: 20 6f 77 6e 65 72 20 20 20 20 20 20 20 54 45 58   owner       TEX
1680: 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20  T DEFAULT '',.  
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b0: 20 20 20 64 65 73 63 72 69 70 74 69 6f 6e 20 54     description T
16c0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a  EXT DEFAULT '',.
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 72 65 76 69 65 77 65 64 20 20 20       reviewed   
1700: 20 54 49 4d 45 53 54 41 4d 50 2c 0a 20 20 20 20   TIMESTAMP,.    
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1730: 20 69 74 65 72 61 74 65 64 20 20 20 20 54 45 58   iterated    TEX
1740: 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20  T DEFAULT '',.  
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1770: 20 20 20 61 76 67 5f 72 75 6e 74 69 6d 65 20 52     avg_runtime R
1780: 45 41 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  EAL,.           
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a0: 20 20 20 20 20 20 20 20 20 20 61 76 67 5f 64 69            avg_di
17b0: 73 6b 20 20 20 20 52 45 41 4c 2c 0a 20 20 20 20  sk    REAL,.    
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e0: 20 74 61 67 73 20 20 20 20 20 20 20 20 54 45 58   tags        TEX
17f0: 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20  T DEFAULT '',.  
1800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1820: 20 20 20 6a 6f 62 67 72 6f 75 70 20 20 20 20 54     jobgroup    T
1830: 45 58 54 20 44 45 46 41 55 4c 54 20 27 64 65 66  EXT DEFAULT 'def
1840: 61 75 6c 74 27 2c 0a 20 20 20 20 20 20 20 20 20  ault',.         
1850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1860: 20 20 20 20 20 20 20 43 4f 4e 53 54 52 41 49 4e         CONSTRAIN
1870: 54 20 74 65 73 74 5f 6d 65 74 61 5f 63 6f 6e 73  T test_meta_cons
1880: 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28 74  traint UNIQUE (t
1890: 65 73 74 6e 61 6d 65 29 29 3b 22 29 0a 09 20 20  estname));")..  
18a0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
18b0: 20 64 62 20 22 43 52 45 41 54 45 20 54 41 42 4c   db "CREATE TABL
18c0: 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20  E IF NOT EXISTS 
18d0: 74 65 73 74 5f 64 61 74 61 20 28 69 64 20 49 4e  test_data (id IN
18e0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
18f0: 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y,.             
1900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1910: 20 20 20 74 65 73 74 5f 69 64 20 49 4e 54 45 47     test_id INTEG
1920: 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ER,.            
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1940: 20 20 20 20 63 61 74 65 67 6f 72 79 20 54 45 58      category TEX
1950: 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20  T DEFAULT '',.  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76 61                va
1980: 72 69 61 62 6c 65 20 54 45 58 54 2c 0a 09 20 20  riable TEXT,..  
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a0: 20 20 20 20 20 20 76 61 6c 75 65 20 52 45 41 4c        value REAL
19b0: 2c 0a 09 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
19c0: 20 20 20 20 20 20 20 20 20 20 20 65 78 70 65 63             expec
19d0: 74 65 64 20 52 45 41 4c 2c 0a 09 20 20 20 20 20  ted REAL,..     
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f0: 20 20 20 74 6f 6c 20 52 45 41 4c 2c 0a 20 20 20     tol REAL,.   
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 69               uni
1a20: 74 73 20 54 45 58 54 2c 0a 20 20 20 20 20 20 20  ts TEXT,.       
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a40: 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 65 6e 74           comment
1a50: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27   TEXT DEFAULT ''
1a60: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a80: 20 20 73 74 61 74 75 73 20 54 45 58 54 20 44 45    status TEXT DE
1a90: 46 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20 20 20  FAULT 'n/a',.   
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 79 70               typ
1ac0: 65 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27  e TEXT DEFAULT '
1ad0: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ',.             
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af0: 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 65 73 74   CONSTRAINT test
1b00: 5f 64 61 74 61 5f 63 6f 6e 73 74 72 61 69 6e 74  _data_constraint
1b10: 20 55 4e 49 51 55 45 20 28 74 65 73 74 5f 69 64   UNIQUE (test_id
1b20: 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62  ,category,variab
1b30: 6c 65 29 29 3b 22 29 0a 09 20 20 3b 3b 20 4d 75  le));")..  ;; Mu
1b40: 73 74 20 64 6f 20 74 68 69 73 20 2a 61 66 74 65  st do this *afte
1b50: 72 2a 20 72 75 6e 6e 69 6e 67 20 70 61 74 63 68  r* running patch
1b60: 20 64 62 20 21 21 20 4e 6f 20 6d 6f 72 65 2e 20   db !! No more. 
1b70: 0a 09 20 20 28 64 62 3a 73 65 74 2d 76 61 72 20  ..  (db:set-var 
1b80: 64 62 20 22 4d 45 47 41 54 45 53 54 5f 56 45 52  db "MEGATEST_VER
1b90: 53 49 4f 4e 22 20 6d 65 67 61 74 65 73 74 2d 76  SION" megatest-v
1ba0: 65 72 73 69 6f 6e 29 0a 09 20 20 29 29 0a 20 20  ersion)..  )).  
1bb0: 20 20 28 73 65 72 76 65 72 3a 63 6c 69 65 6e 74    (server:client
1bc0: 2d 73 65 74 75 70 20 64 62 29 0a 20 20 20 20 64  -setup db).    d
1bd0: 62 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d  b))..;;=========
1be0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1bf0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1c00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1c10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b  =============.;;
1c20: 20 54 4f 44 4f 3a 0a 3b 3b 20 20 20 70 75 74 20   TODO:.;;   put 
1c30: 64 65 6c 74 61 73 20 69 6e 74 6f 20 61 6e 20 61  deltas into an a
1c40: 73 73 6f 63 20 6c 69 73 74 20 77 69 74 68 20 76  ssoc list with v
1c50: 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 73 0a 3b  ersion numbers.;
1c60: 3b 20 20 20 61 70 70 6c 79 20 61 6c 6c 20 66 72  ;   apply all fr
1c70: 6f 6d 20 6c 61 73 74 20 74 6f 20 63 75 72 72 65  om last to curre
1c80: 6e 74 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  nt.;;===========
1c90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1ca0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1cb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1cc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 28 64 65 66  ===========.(def
1cd0: 69 6e 65 20 28 70 61 74 63 68 2d 64 62 20 64 62  ine (patch-db db
1ce0: 29 0a 20 20 28 68 61 6e 64 6c 65 2d 65 78 63 65  ).  (handle-exce
1cf0: 70 74 69 6f 6e 73 0a 20 20 20 65 78 6e 0a 20 20  ptions.   exn.  
1d00: 20 28 62 65 67 69 6e 0a 20 20 20 20 20 28 70 72   (begin.     (pr
1d10: 69 6e 74 20 22 45 78 63 65 70 74 69 6f 6e 3a 20  int "Exception: 
1d20: 22 20 65 78 6e 29 0a 20 20 20 20 20 28 70 72 69  " exn).     (pri
1d30: 6e 74 20 22 45 52 52 4f 52 3a 20 50 6f 73 73 69  nt "ERROR: Possi
1d40: 62 6c 65 20 6f 75 74 20 6f 66 20 64 61 74 65 20  ble out of date 
1d50: 73 63 68 65 6d 61 2c 20 61 74 74 65 6d 70 74 69  schema, attempti
1d60: 6e 67 20 74 6f 20 61 64 64 20 74 61 62 6c 65 20  ng to add table 
1d70: 6d 65 74 61 64 61 74 61 2e 2e 2e 22 29 0a 20 20  metadata...").  
1d80: 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63     (sqlite3:exec
1d90: 75 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54  ute db "CREATE T
1da0: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
1db0: 54 53 20 6d 65 74 61 64 61 74 20 28 69 64 20 49  TS metadat (id I
1dc0: 4e 54 45 47 45 52 2c 20 76 61 72 20 54 45 58 54  NTEGER, var TEXT
1dd0: 2c 20 76 61 6c 20 54 45 58 54 2c 0a 20 20 20 20  , val TEXT,.    
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e               CON
1e00: 53 54 52 41 49 4e 54 20 6d 65 74 61 64 61 74 5f  STRAINT metadat_
1e10: 63 6f 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 55  constraint UNIQU
1e20: 45 20 28 76 61 72 29 29 3b 22 29 0a 20 20 20 20  E (var));").    
1e30: 20 28 69 66 20 28 6e 6f 74 20 28 64 62 3a 67 65   (if (not (db:ge
1e40: 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 45  t-var db "MEGATE
1e50: 53 54 5f 56 45 52 53 49 4f 4e 22 29 29 0a 09 20  ST_VERSION")).. 
1e60: 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22  (db:set-var db "
1e70: 4d 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e  MEGATEST_VERSION
1e80: 22 20 31 2e 31 37 29 29 29 0a 20 20 20 28 6c 65  " 1.17))).   (le
1e90: 74 20 28 28 6d 76 65 72 20 28 64 62 3a 67 65 74  t ((mver (db:get
1ea0: 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 53  -var db "MEGATES
1eb0: 54 5f 56 45 52 53 49 4f 4e 22 29 29 0a 09 20 28  T_VERSION")).. (
1ec0: 74 65 73 74 2d 6d 65 74 61 2d 64 65 66 20 22 43  test-meta-def "C
1ed0: 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e  REATE TABLE IF N
1ee0: 4f 54 20 45 58 49 53 54 53 20 74 65 73 74 5f 6d  OT EXISTS test_m
1ef0: 65 74 61 20 28 69 64 20 49 4e 54 45 47 45 52 20  eta (id INTEGER 
1f00: 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20  PRIMARY KEY,.   
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 20 20 20 20                  
1f30: 20 20 74 65 73 74 6e 61 6d 65 20 20 20 20 54 45    testname    TE
1f40: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20  XT DEFAULT '',. 
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f70: 20 20 20 20 61 75 74 68 6f 72 20 20 20 20 20 20      author      
1f80: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c  TEXT DEFAULT '',
1f90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb0: 20 20 20 20 20 20 6f 77 6e 65 72 20 20 20 20 20        owner     
1fc0: 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27    TEXT DEFAULT '
1fd0: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ',.             
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff0: 20 20 20 20 20 20 20 20 64 65 73 63 72 69 70 74          descript
2000: 69 6f 6e 20 54 45 58 54 20 44 45 46 41 55 4c 54  ion TEXT DEFAULT
2010: 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20   '',.           
2020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2030: 20 20 20 20 20 20 20 20 20 20 72 65 76 69 65 77            review
2040: 65 64 20 20 20 20 54 49 4d 45 53 54 41 4d 50 2c  ed    TIMESTAMP,
2050: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2070: 20 20 20 20 20 20 69 74 65 72 61 74 65 64 20 20        iterated  
2080: 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27    TEXT DEFAULT '
2090: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ',.             
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20b0: 20 20 20 20 20 20 20 20 61 76 67 5f 72 75 6e 74          avg_runt
20c0: 69 6d 65 20 52 45 41 4c 2c 0a 20 20 20 20 20 20  ime REAL,.      
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
20f0: 76 67 5f 64 69 73 6b 20 20 20 20 52 45 41 4c 2c  vg_disk    REAL,
2100: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2120: 20 20 20 20 20 20 74 61 67 73 20 20 20 20 20 20        tags      
2130: 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27    TEXT DEFAULT '
2140: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ',.             
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 65     CONSTRAINT te
2170: 73 74 5f 6d 65 74 61 5f 63 6f 6e 73 74 72 61 69  st_meta_constrai
2180: 6e 74 20 55 4e 49 51 55 45 20 28 74 65 73 74 6e  nt UNIQUE (testn
2190: 61 6d 65 29 29 3b 22 29 29 0a 20 20 20 20 20 28  ame));")).     (
21a0: 70 72 69 6e 74 20 22 43 75 72 72 65 6e 74 20 73  print "Current s
21b0: 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 3a 20 22  chema version: "
21c0: 20 6d 76 65 72 20 22 20 63 75 72 72 65 6e 74 20   mver " current 
21d0: 6d 65 67 61 74 65 73 74 20 76 65 72 73 69 6f 6e  megatest version
21e0: 3a 20 22 20 6d 65 67 61 74 65 73 74 2d 76 65 72  : " megatest-ver
21f0: 73 69 6f 6e 29 0a 20 20 20 20 20 28 63 6f 6e 64  sion).     (cond
2200: 0a 20 20 20 20 20 20 28 28 6e 6f 74 20 6d 76 65  .      ((not mve
2210: 72 29 0a 20 20 20 20 20 20 20 28 70 72 69 6e 74  r).       (print
2220: 20 22 41 64 64 69 6e 67 20 6d 65 67 61 74 65 73   "Adding megates
2230: 74 2d 76 65 72 73 69 6f 6e 20 74 6f 20 6d 65 74  t-version to met
2240: 61 64 61 74 61 22 29 20 3b 3b 20 4e 65 65 64 20  adata") ;; Need 
2250: 74 6f 20 72 65 63 72 65 61 74 65 20 74 68 65 20  to recreate the 
2260: 74 61 62 6c 65 0a 20 20 20 20 20 20 20 28 73 71  table.       (sq
2270: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62  lite3:execute db
2280: 20 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20   "DROP TABLE IF 
2290: 45 58 49 53 54 53 20 6d 65 74 61 64 61 74 3b 22  EXISTS metadat;"
22a0: 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ).       (sqlite
22b0: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 43 52  3:execute db "CR
22c0: 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f  EATE TABLE IF NO
22d0: 54 20 45 58 49 53 54 53 20 6d 65 74 61 64 61 74  T EXISTS metadat
22e0: 20 28 69 64 20 49 4e 54 45 47 45 52 2c 20 76 61   (id INTEGER, va
22f0: 72 20 54 45 58 54 2c 20 76 61 6c 20 54 45 58 54  r TEXT, val TEXT
2300: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2320: 20 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 6d      CONSTRAINT m
2330: 65 74 61 64 61 74 5f 63 6f 6e 73 74 72 61 69 6e  etadat_constrain
2340: 74 20 55 4e 49 51 55 45 20 28 76 61 72 29 29 3b  t UNIQUE (var));
2350: 22 29 0a 20 20 20 20 20 20 20 28 64 62 3a 73 65  ").       (db:se
2360: 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 45  t-var db "MEGATE
2370: 53 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e 31 37  ST_VERSION" 1.17
2380: 29 0a 20 20 20 20 20 20 20 28 70 61 74 63 68 2d  ).       (patch-
2390: 64 62 29 29 0a 20 20 20 20 20 20 28 28 3c 20 6d  db)).      ((< m
23a0: 76 65 72 20 31 2e 32 31 29 0a 20 20 20 20 20 20  ver 1.21).      
23b0: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
23c0: 65 20 64 62 20 22 44 52 4f 50 20 54 41 42 4c 45  e db "DROP TABLE
23d0: 20 49 46 20 45 58 49 53 54 53 20 6d 65 74 61 64   IF EXISTS metad
23e0: 61 74 3b 22 29 0a 20 20 20 20 20 20 20 28 73 71  at;").       (sq
23f0: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62  lite3:execute db
2400: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49   "CREATE TABLE I
2410: 46 20 4e 4f 54 20 45 58 49 53 54 53 20 6d 65 74  F NOT EXISTS met
2420: 61 64 61 74 20 28 69 64 20 49 4e 54 45 47 45 52  adat (id INTEGER
2430: 2c 20 76 61 72 20 54 45 58 54 2c 20 76 61 6c 20  , var TEXT, val 
2440: 54 45 58 54 2c 0a 20 20 20 20 20 20 20 20 20 20  TEXT,.          
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2460: 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52 41 49          CONSTRAI
2470: 4e 54 20 6d 65 74 61 64 61 74 5f 63 6f 6e 73 74  NT metadat_const
2480: 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28 76 61  raint UNIQUE (va
2490: 72 29 29 3b 22 29 0a 20 20 20 20 20 20 20 28 64  r));").       (d
24a0: 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45  b:set-var db "ME
24b0: 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20  GATEST_VERSION" 
24c0: 31 2e 32 31 29 20 3b 3b 20 73 65 74 20 62 65 66  1.21) ;; set bef
24d0: 6f 72 65 2c 20 6a 75 73 74 20 69 6e 20 63 61 73  ore, just in cas
24e0: 65 20 74 68 65 20 63 68 61 6e 67 65 73 20 61 72  e the changes ar
24f0: 65 20 61 6c 72 65 61 64 79 20 61 70 70 6c 69 65  e already applie
2500: 64 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  d.       (sqlite
2510: 33 3a 65 78 65 63 75 74 65 20 64 62 20 74 65 73  3:execute db tes
2520: 74 2d 6d 65 74 61 2d 64 65 66 29 0a 09 09 09 09  t-meta-def).....
2530: 09 3b 28 66 6f 72 2d 65 61 63 68 20 0a 09 09 09  .;(for-each ....
2540: 09 09 3b 20 28 6c 61 6d 62 64 61 20 28 73 74 6d  ..; (lambda (stm
2550: 74 29 0a 09 09 09 09 09 3b 20 20 20 28 73 71 6c  t)......;   (sql
2560: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
2570: 73 74 6d 74 29 29 0a 09 09 09 09 09 3b 20 28 6c  stmt))......; (l
2580: 69 73 74 20 0a 09 09 09 09 09 3b 20 20 22 41 4c  ist ......;  "AL
2590: 54 45 52 20 54 41 42 4c 45 20 74 65 73 74 73 20  TER TABLE tests 
25a0: 41 44 44 20 43 4f 4c 55 4d 4e 20 66 69 72 73 74  ADD COLUMN first
25b0: 5f 65 72 72 20 54 45 58 54 3b 22 0a 09 09 09 09  _err TEXT;".....
25c0: 09 3b 20 20 22 41 4c 54 45 52 20 54 41 42 4c 45  .;  "ALTER TABLE
25d0: 20 74 65 73 74 73 20 41 44 44 20 43 4f 4c 55 4d   tests ADD COLUM
25e0: 4e 20 66 69 72 73 74 5f 77 61 72 6e 20 54 45 58  N first_warn TEX
25f0: 54 3b 22 0a 09 09 09 09 09 3b 20 20 29 29 0a 20  T;"......;  )). 
2600: 20 20 20 20 20 20 28 70 61 74 63 68 2d 64 62 29        (patch-db)
2610: 29 0a 20 20 20 20 20 20 28 28 3c 20 6d 76 65 72  ).      ((< mver
2620: 20 31 2e 32 34 29 0a 20 20 20 20 20 20 20 28 64   1.24).       (d
2630: 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45  b:set-var db "ME
2640: 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20  GATEST_VERSION" 
2650: 31 2e 32 34 29 0a 20 20 20 20 20 20 20 28 73 71  1.24).       (sq
2660: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62  lite3:execute db
2670: 20 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20   "DROP TABLE IF 
2680: 45 58 49 53 54 53 20 74 65 73 74 5f 64 61 74 61  EXISTS test_data
2690: 3b 22 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69  ;").       (sqli
26a0: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22  te3:execute db "
26b0: 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58  DROP TABLE IF EX
26c0: 49 53 54 53 20 74 65 73 74 5f 6d 65 74 61 3b 22  ISTS test_meta;"
26d0: 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ).       (sqlite
26e0: 33 3a 65 78 65 63 75 74 65 20 64 62 20 74 65 73  3:execute db tes
26f0: 74 2d 6d 65 74 61 2d 64 65 66 29 0a 20 20 20 20  t-meta-def).    
2700: 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63     (sqlite3:exec
2710: 75 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54  ute db "CREATE T
2720: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
2730: 54 53 20 74 65 73 74 5f 64 61 74 61 20 28 69 64  TS test_data (id
2740: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
2750: 20 4b 45 59 2c 0a 20 20 20 20 20 20 20 20 20 20   KEY,.          
2760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2770: 20 20 20 20 20 20 74 65 73 74 5f 69 64 20 49 4e        test_id IN
2780: 54 45 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20  TEGER,.         
2790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a0: 20 20 20 20 20 20 20 63 61 74 65 67 6f 72 79 20         category 
27b0: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c  TEXT DEFAULT '',
27c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27e0: 20 76 61 72 69 61 62 6c 65 20 54 45 58 54 2c 0a   variable TEXT,.
27f0: 09 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2800: 20 20 20 20 20 20 20 20 20 76 61 6c 75 65 20 52           value R
2810: 45 41 4c 2c 0a 09 20 20 20 20 20 20 20 20 20 20  EAL,..          
2820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
2830: 70 65 63 74 65 64 20 52 45 41 4c 2c 0a 09 20 20  pected REAL,..  
2840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2850: 20 20 20 20 20 20 74 6f 6c 20 52 45 41 4c 2c 0a        tol REAL,.
2860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2880: 75 6e 69 74 73 20 54 45 58 54 2c 0a 20 20 20 20  units TEXT,.    
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d              comm
28b0: 65 6e 74 20 54 45 58 54 20 44 45 46 41 55 4c 54  ent TEXT DEFAULT
28c0: 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20   '',.           
28d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28e0: 20 20 20 20 20 73 74 61 74 75 73 20 54 45 58 54       status TEXT
28f0: 20 44 45 46 41 55 4c 54 20 27 6e 2f 61 27 2c 0a   DEFAULT 'n/a',.
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 4f                CO
2920: 4e 53 54 52 41 49 4e 54 20 74 65 73 74 5f 64 61  NSTRAINT test_da
2930: 74 61 20 55 4e 49 51 55 45 20 28 74 65 73 74 5f  ta UNIQUE (test_
2940: 69 64 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 69  id,category,vari
2950: 61 62 6c 65 29 29 3b 22 29 0a 20 20 20 20 20 20  able));").      
2960: 20 28 70 72 69 6e 74 20 22 57 41 52 4e 49 4e 47   (print "WARNING
2970: 3a 20 54 61 62 6c 65 20 74 65 73 74 5f 64 61 74  : Table test_dat
2980: 61 20 61 6e 64 20 74 65 73 74 5f 6d 65 74 61 20  a and test_meta 
2990: 77 68 65 72 65 20 72 65 63 72 65 61 74 65 64 2e  where recreated.
29a0: 20 50 6c 65 61 73 65 20 64 6f 20 6d 65 67 61 74   Please do megat
29b0: 65 73 74 20 2d 75 70 64 61 74 65 2d 6d 65 74 61  est -update-meta
29c0: 22 29 0a 20 20 20 20 20 20 20 28 70 61 74 63 68  ").       (patch
29d0: 2d 64 62 29 29 0a 20 20 20 20 20 20 28 28 3c 20  -db)).      ((< 
29e0: 6d 76 65 72 20 31 2e 32 37 29 0a 20 20 20 20 20  mver 1.27).     
29f0: 20 20 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62    (db:set-var db
2a00: 20 22 4d 45 47 41 54 45 53 54 5f 56 45 52 53 49   "MEGATEST_VERSI
2a10: 4f 4e 22 20 31 2e 32 37 29 0a 20 20 20 20 20 20  ON" 1.27).      
2a20: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
2a30: 65 20 64 62 20 22 41 4c 54 45 52 20 54 41 42 4c  e db "ALTER TABL
2a40: 45 20 74 65 73 74 5f 64 61 74 61 20 41 44 44 20  E test_data ADD 
2a50: 43 4f 4c 55 4d 4e 20 74 79 70 65 20 54 45 58 54  COLUMN type TEXT
2a60: 20 44 45 46 41 55 4c 54 20 27 27 3b 22 29 0a 20   DEFAULT '';"). 
2a70: 20 20 20 20 20 20 28 70 61 74 63 68 2d 64 62 29        (patch-db)
2a80: 29 0a 20 20 20 20 20 20 28 28 3c 20 6d 76 65 72  ).      ((< mver
2a90: 20 31 2e 32 39 29 0a 20 20 20 20 20 20 20 28 64   1.29).       (d
2aa0: 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45  b:set-var db "ME
2ab0: 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20  GATEST_VERSION" 
2ac0: 31 2e 32 39 29 0a 20 20 20 20 20 20 20 28 73 71  1.29).       (sq
2ad0: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62  lite3:execute db
2ae0: 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 74 65   "ALTER TABLE te
2af0: 73 74 5f 73 74 65 70 73 20 41 44 44 20 43 4f 4c  st_steps ADD COL
2b00: 55 4d 4e 20 6c 6f 67 66 69 6c 65 20 54 45 58 54  UMN logfile TEXT
2b10: 20 44 45 46 41 55 4c 54 20 27 27 3b 22 29 0a 20   DEFAULT '';"). 
2b20: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65        (sqlite3:e
2b30: 78 65 63 75 74 65 20 64 62 20 22 41 4c 54 45 52  xecute db "ALTER
2b40: 20 54 41 42 4c 45 20 74 65 73 74 73 20 41 44 44   TABLE tests ADD
2b50: 20 43 4f 4c 55 4d 4e 20 73 68 6f 72 74 64 69 72   COLUMN shortdir
2b60: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27   TEXT DEFAULT ''
2b70: 3b 22 29 29 0a 20 20 20 20 20 20 28 28 3c 20 6d  ;")).      ((< m
2b80: 76 65 72 20 31 2e 33 36 29 0a 20 20 20 20 20 20  ver 1.36).      
2b90: 20 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20   (db:set-var db 
2ba0: 22 4d 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f  "MEGATEST_VERSIO
2bb0: 4e 22 20 31 2e 33 36 29 0a 20 20 20 20 20 20 20  N" 1.36).       
2bc0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
2bd0: 20 64 62 20 22 41 4c 54 45 52 20 54 41 42 4c 45   db "ALTER TABLE
2be0: 20 74 65 73 74 5f 6d 65 74 61 20 41 44 44 20 43   test_meta ADD C
2bf0: 4f 4c 55 4d 4e 20 6a 6f 62 67 72 6f 75 70 20 54  OLUMN jobgroup T
2c00: 45 58 54 20 44 45 46 41 55 4c 54 20 27 64 65 66  EXT DEFAULT 'def
2c10: 61 75 6c 74 27 3b 22 29 29 0a 20 20 20 20 20 20  ault';")).      
2c20: 28 28 3c 20 6d 76 65 72 20 31 2e 33 37 29 0a 20  ((< mver 1.37). 
2c30: 20 20 20 20 20 20 28 64 62 3a 73 65 74 2d 76 61        (db:set-va
2c40: 72 20 64 62 20 22 4d 45 47 41 54 45 53 54 5f 56  r db "MEGATEST_V
2c50: 45 52 53 49 4f 4e 22 20 31 2e 33 37 29 0a 20 20  ERSION" 1.37).  
2c60: 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78       (sqlite3:ex
2c70: 65 63 75 74 65 20 64 62 20 22 41 4c 54 45 52 20  ecute db "ALTER 
2c80: 54 41 42 4c 45 20 74 65 73 74 73 20 41 44 44 20  TABLE tests ADD 
2c90: 43 4f 4c 55 4d 4e 20 61 72 63 68 69 76 65 64 20  COLUMN archived 
2ca0: 49 4e 54 45 47 45 52 20 44 45 46 41 55 4c 54 20  INTEGER DEFAULT 
2cb0: 30 3b 22 29 29 20 0a 20 20 20 20 20 20 28 28 3c  0;")) .      ((<
2cc0: 20 6d 76 65 72 20 6d 65 67 61 74 65 73 74 2d 76   mver megatest-v
2cd0: 65 72 73 69 6f 6e 29 0a 20 20 20 20 20 20 20 28  ersion).       (
2ce0: 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d  db:set-var db "M
2cf0: 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22  EGATEST_VERSION"
2d00: 20 6d 65 67 61 74 65 73 74 2d 76 65 72 73 69 6f   megatest-versio
2d10: 6e 29 29 29 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d  n))))))..;;=====
2d20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2d30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2d40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2d50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2d60: 3d 0a 3b 3b 20 6d 65 74 61 20 67 65 74 20 61 6e  =.;; meta get an
2d70: 64 20 73 65 74 20 76 61 72 73 0a 3b 3b 3d 3d 3d  d set vars.;;===
2d80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2d90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2da0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2db0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2dc0: 3d 3d 3d 0a 0a 3b 3b 20 72 65 74 75 72 6e 73 20  ===..;; returns 
2dd0: 6e 75 6d 62 65 72 20 69 66 20 73 74 72 69 6e 67  number if string
2de0: 2d 3e 6e 75 6d 62 65 72 20 69 73 20 73 75 63 63  ->number is succ
2df0: 65 73 73 66 75 6c 2c 20 73 74 72 69 6e 67 20 6f  essful, string o
2e00: 74 68 65 72 77 69 73 65 0a 28 64 65 66 69 6e 65  therwise.(define
2e10: 20 28 64 62 3a 67 65 74 2d 76 61 72 20 64 62 20   (db:get-var db 
2e20: 76 61 72 29 0a 20 20 28 6c 65 74 20 28 28 72 65  var).  (let ((re
2e30: 73 20 23 66 29 29 0a 20 20 20 20 28 73 71 6c 69  s #f)).    (sqli
2e40: 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77  te3:for-each-row
2e50: 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 76  .     (lambda (v
2e60: 61 6c 29 0a 20 20 20 20 20 20 20 28 73 65 74 21  al).       (set!
2e70: 20 72 65 73 20 76 61 6c 29 29 0a 20 20 20 20 20   res val)).     
2e80: 64 62 20 22 53 45 4c 45 43 54 20 76 61 6c 20 46  db "SELECT val F
2e90: 52 4f 4d 20 6d 65 74 61 64 61 74 20 57 48 45 52  ROM metadat WHER
2ea0: 45 20 76 61 72 3d 3f 3b 22 20 76 61 72 29 0a 20  E var=?;" var). 
2eb0: 20 20 20 28 69 66 20 28 73 74 72 69 6e 67 3f 20     (if (string? 
2ec0: 72 65 73 29 0a 09 28 6c 65 74 20 28 28 76 61 6c  res)..(let ((val
2ed0: 6e 75 6d 20 28 73 74 72 69 6e 67 2d 3e 6e 75 6d  num (string->num
2ee0: 62 65 72 20 72 65 73 29 29 29 0a 09 20 20 28 69  ber res)))..  (i
2ef0: 66 20 76 61 6c 6e 75 6d 20 76 61 6c 6e 75 6d 20  f valnum valnum 
2f00: 72 65 73 29 29 0a 09 72 65 73 29 29 29 0a 0a 28  res))..res)))..(
2f10: 64 65 66 69 6e 65 20 28 64 62 3a 73 65 74 2d 76  define (db:set-v
2f20: 61 72 20 64 62 20 76 61 72 20 76 61 6c 29 0a 20  ar db var val). 
2f30: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
2f40: 65 20 64 62 20 22 49 4e 53 45 52 54 20 4f 52 20  e db "INSERT OR 
2f50: 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 6d 65 74  REPLACE INTO met
2f60: 61 64 61 74 20 28 76 61 72 2c 76 61 6c 29 20 56  adat (var,val) V
2f70: 41 4c 55 45 53 20 28 3f 2c 3f 29 3b 22 20 76 61  ALUES (?,?);" va
2f80: 72 20 76 61 6c 29 29 0a 0a 3b 3b 20 75 73 65 20  r val))..;; use 
2f90: 61 20 67 6c 6f 62 61 6c 20 66 6f 72 20 73 6f 6d  a global for som
2fa0: 65 20 70 72 69 6d 69 74 69 76 65 20 63 61 63 68  e primitive cach
2fb0: 69 6e 67 2c 20 69 74 20 69 73 20 6a 75 73 74 20  ing, it is just 
2fc0: 73 69 6c 6c 79 20 74 6f 20 72 65 2d 72 65 61 64  silly to re-read
2fd0: 20 74 68 65 20 64 62 20 0a 3b 3b 20 6f 76 65 72   the db .;; over
2fe0: 20 61 6e 64 20 6f 76 65 72 20 61 67 61 69 6e 20   and over again 
2ff0: 66 6f 72 20 74 68 65 20 6b 65 79 73 20 73 69 6e  for the keys sin
3000: 63 65 20 74 68 65 79 20 6e 65 76 65 72 20 63 68  ce they never ch
3010: 61 6e 67 65 0a 0a 28 64 65 66 69 6e 65 20 2a 64  ange..(define *d
3020: 62 2d 6b 65 79 73 2a 20 23 66 29 0a 0a 28 64 65  b-keys* #f)..(de
3030: 66 69 6e 65 20 28 64 62 2d 67 65 74 2d 6b 65 79  fine (db-get-key
3040: 73 20 64 62 29 0a 20 20 28 69 66 20 2a 64 62 2d  s db).  (if *db-
3050: 6b 65 79 73 2a 20 2a 64 62 2d 6b 65 79 73 2a 20  keys* *db-keys* 
3060: 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28 72 65  .      (let ((re
3070: 73 20 27 28 29 29 29 0a 09 28 73 71 6c 69 74 65  s '()))..(sqlite
3080: 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a  3:for-each-row .
3090: 09 20 28 6c 61 6d 62 64 61 20 28 6b 65 79 20 6b  . (lambda (key k
30a0: 65 79 74 79 70 65 29 0a 09 20 20 20 28 73 65 74  eytype)..   (set
30b0: 21 20 72 65 73 20 28 63 6f 6e 73 20 28 76 65 63  ! res (cons (vec
30c0: 74 6f 72 20 6b 65 79 20 6b 65 79 74 79 70 65 29  tor key keytype)
30d0: 20 72 65 73 29 29 29 0a 09 20 64 62 0a 09 20 22   res))).. db.. "
30e0: 53 45 4c 45 43 54 20 66 69 65 6c 64 6e 61 6d 65  SELECT fieldname
30f0: 2c 66 69 65 6c 64 74 79 70 65 20 46 52 4f 4d 20  ,fieldtype FROM 
3100: 6b 65 79 73 20 4f 52 44 45 52 20 42 59 20 69 64  keys ORDER BY id
3110: 20 44 45 53 43 3b 22 29 0a 09 28 73 65 74 21 20   DESC;")..(set! 
3120: 2a 64 62 2d 6b 65 79 73 2a 20 72 65 73 29 0a 09  *db-keys* res)..
3130: 72 65 73 29 29 29 0a 0a 28 64 65 66 69 6e 65 20  res)))..(define 
3140: 64 62 3a 67 65 74 2d 6b 65 79 73 20 64 62 2d 67  db:get-keys db-g
3150: 65 74 2d 6b 65 79 73 29 0a 0a 28 64 65 66 69 6e  et-keys)..(defin
3160: 65 20 28 64 62 3a 67 65 74 2d 76 61 6c 75 65 2d  e (db:get-value-
3170: 62 79 2d 68 65 61 64 65 72 20 72 6f 77 20 68 65  by-header row he
3180: 61 64 65 72 20 66 69 65 6c 64 29 0a 20 20 3b 3b  ader field).  ;;
3190: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 32 20   (debug:print 2 
31a0: 22 64 62 3a 67 65 74 2d 76 61 6c 75 65 2d 62 79  "db:get-value-by
31b0: 2d 68 65 61 64 65 72 20 72 6f 77 3a 20 22 20 72  -header row: " r
31c0: 6f 77 20 22 20 68 65 61 64 65 72 3a 20 22 20 68  ow " header: " h
31d0: 65 61 64 65 72 20 22 20 66 69 65 6c 64 3a 20 22  eader " field: "
31e0: 20 66 69 65 6c 64 29 0a 20 20 28 69 66 20 28 6e   field).  (if (n
31f0: 75 6c 6c 3f 20 68 65 61 64 65 72 29 20 23 66 0a  ull? header) #f.
3200: 20 20 20 20 20 20 28 6c 65 74 20 6c 6f 6f 70 20        (let loop 
3210: 28 28 68 65 64 20 28 63 61 72 20 68 65 61 64 65  ((hed (car heade
3220: 72 29 29 0a 09 09 20 28 74 61 6c 20 28 63 64 72  r))... (tal (cdr
3230: 20 68 65 61 64 65 72 29 29 0a 09 09 20 28 6e 20   header))... (n 
3240: 20 20 30 29 29 0a 09 28 69 66 20 28 65 71 75 61    0))..(if (equa
3250: 6c 3f 20 68 65 64 20 66 69 65 6c 64 29 0a 09 20  l? hed field).. 
3260: 20 20 20 28 76 65 63 74 6f 72 2d 72 65 66 20 72     (vector-ref r
3270: 6f 77 20 6e 29 0a 09 20 20 20 20 28 69 66 20 28  ow n)..    (if (
3280: 6e 75 6c 6c 3f 20 74 61 6c 29 20 23 66 20 28 6c  null? tal) #f (l
3290: 6f 6f 70 20 28 63 61 72 20 74 61 6c 29 28 63 64  oop (car tal)(cd
32a0: 72 20 74 61 6c 29 28 2b 20 6e 20 31 29 29 29 29  r tal)(+ n 1))))
32b0: 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d  )))..;;=========
32c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
32d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
32e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
32f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b  =============.;;
3300: 20 20 52 20 55 20 4e 20 53 0a 3b 3b 3d 3d 3d 3d    R U N S.;;====
3310: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3320: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3330: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3340: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3350: 3d 3d 0a 0a 28 64 65 66 69 6e 65 20 28 72 75 6e  ==..(define (run
3360: 73 3a 67 65 74 2d 73 74 64 2d 72 75 6e 2d 66 69  s:get-std-run-fi
3370: 65 6c 64 73 20 6b 65 79 73 20 72 65 6d 66 69 65  elds keys remfie
3380: 6c 64 73 29 0a 20 20 28 6c 65 74 2a 20 28 28 68  lds).  (let* ((h
3390: 65 61 64 65 72 20 20 20 20 28 61 70 70 65 6e 64  eader    (append
33a0: 20 28 6d 61 70 20 6b 65 79 3a 67 65 74 2d 66 69   (map key:get-fi
33b0: 65 6c 64 6e 61 6d 65 20 6b 65 79 73 29 0a 09 09  eldname keys)...
33c0: 09 20 20 20 20 72 65 6d 66 69 65 6c 64 73 29 29  .    remfields))
33d0: 0a 09 20 28 6b 65 79 73 74 72 20 20 20 20 28 63  .. (keystr    (c
33e0: 6f 6e 63 20 28 6b 65 79 73 2d 3e 6b 65 79 73 74  onc (keys->keyst
33f0: 72 20 6b 65 79 73 29 20 22 2c 22 0a 09 09 09 20  r keys) ",".... 
3400: 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70   (string-intersp
3410: 65 72 73 65 20 72 65 6d 66 69 65 6c 64 73 20 22  erse remfields "
3420: 2c 22 29 29 29 29 0a 20 20 20 20 28 6c 69 73 74  ,")))).    (list
3430: 20 6b 65 79 73 74 72 20 68 65 61 64 65 72 29 29   keystr header))
3440: 29 0a 0a 3b 3b 20 57 41 53 20 64 62 2d 67 65 74  )..;; WAS db-get
3450: 2d 72 75 6e 73 20 46 49 58 4d 45 20 49 4e 20 52  -runs FIXME IN R
3460: 45 4d 41 49 4e 49 4e 47 20 43 4f 44 45 0a 3b 3b  EMAINING CODE.;;
3470: 0a 3b 3b 20 4d 45 52 47 45 20 54 48 49 53 20 57  .;; MERGE THIS W
3480: 49 54 48 20 64 62 3a 67 65 74 2d 72 75 6e 73 2c  ITH db:get-runs,
3490: 20 61 63 63 69 64 65 6e 74 6c 79 20 77 72 6f 74   accidently wrot
34a0: 65 20 69 74 20 74 77 69 63 65 0a 3b 3b 0a 3b 3b  e it twice.;;.;;
34b0: 20 72 65 70 6c 61 63 65 20 68 65 61 64 65 72 20   replace header 
34c0: 61 6e 64 20 6b 65 79 73 74 72 20 77 69 74 68 20  and keystr with 
34d0: 61 20 63 61 6c 6c 20 74 6f 20 72 75 6e 73 3a 67  a call to runs:g
34e0: 65 74 2d 73 74 64 2d 72 75 6e 2d 66 69 65 6c 64  et-std-run-field
34f0: 73 0a 3b 3b 0a 3b 3b 20 6b 65 79 70 61 74 74 73  s.;;.;; keypatts
3500: 3a 20 28 20 28 4b 45 59 31 20 22 61 62 63 25 64  : ( (KEY1 "abc%d
3510: 65 66 22 29 28 4b 45 59 32 20 22 25 22 29 20 29  ef")(KEY2 "%") )
3520: 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  .;;.(define (db:
3530: 67 65 74 2d 72 75 6e 73 20 64 62 20 72 75 6e 70  get-runs db runp
3540: 61 74 74 20 63 6f 75 6e 74 20 6f 66 66 73 65 74  att count offset
3550: 20 6b 65 79 70 61 74 74 73 29 0a 20 20 28 6c 65   keypatts).  (le
3560: 74 2a 20 28 28 72 65 73 20 20 20 20 20 20 27 28  t* ((res      '(
3570: 29 29 0a 09 20 28 6b 65 79 73 20 20 20 20 20 20  )).. (keys      
3580: 28 64 62 2d 67 65 74 2d 6b 65 79 73 20 64 62 29  (db-get-keys db)
3590: 29 0a 09 20 28 72 65 6d 66 69 65 6c 64 73 20 28  ).. (remfields (
35a0: 6c 69 73 74 20 22 69 64 22 20 22 72 75 6e 6e 61  list "id" "runna
35b0: 6d 65 22 20 22 73 74 61 74 65 22 20 22 73 74 61  me" "state" "sta
35c0: 74 75 73 22 20 22 6f 77 6e 65 72 22 20 22 65 76  tus" "owner" "ev
35d0: 65 6e 74 5f 74 69 6d 65 22 29 29 0a 09 20 28 68  ent_time")).. (h
35e0: 65 61 64 65 72 20 20 20 20 28 61 70 70 65 6e 64  eader    (append
35f0: 20 28 6d 61 70 20 6b 65 79 3a 67 65 74 2d 66 69   (map key:get-fi
3600: 65 6c 64 6e 61 6d 65 20 6b 65 79 73 29 0a 09 09  eldname keys)...
3610: 09 20 20 20 20 72 65 6d 66 69 65 6c 64 73 29 29  .    remfields))
3620: 0a 09 20 28 6b 65 79 73 74 72 20 20 20 20 28 63  .. (keystr    (c
3630: 6f 6e 63 20 28 6b 65 79 73 2d 3e 6b 65 79 73 74  onc (keys->keyst
3640: 72 20 6b 65 79 73 29 20 22 2c 22 0a 09 09 09 20  r keys) ",".... 
3650: 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70   (string-intersp
3660: 65 72 73 65 20 72 65 6d 66 69 65 6c 64 73 20 22  erse remfields "
3670: 2c 22 29 29 29 0a 09 20 28 71 72 79 73 74 72 20  ,"))).. (qrystr 
3680: 20 20 20 28 63 6f 6e 63 20 22 53 45 4c 45 43 54     (conc "SELECT
3690: 20 22 20 6b 65 79 73 74 72 20 22 20 46 52 4f 4d   " keystr " FROM
36a0: 20 72 75 6e 73 20 57 48 45 52 45 20 72 75 6e 6e   runs WHERE runn
36b0: 61 6d 65 20 4c 49 4b 45 20 3f 20 22 0a 09 09 09  ame LIKE ? "....
36c0: 20 20 3b 3b 20 47 65 6e 65 72 61 74 65 3a 20 22    ;; Generate: "
36d0: 20 41 4e 44 20 78 20 4c 49 4b 45 20 27 6b 65 79   AND x LIKE 'key
36e0: 70 61 74 74 27 20 2e 2e 2e 22 0a 09 09 09 20 20  patt' ..."....  
36f0: 28 69 66 20 28 6e 75 6c 6c 3f 20 6b 65 79 70 61  (if (null? keypa
3700: 74 74 73 29 20 22 22 0a 09 09 09 20 20 20 20 20  tts) ""....     
3710: 20 28 63 6f 6e 63 20 22 20 41 4e 44 20 22 0a 09   (conc " AND "..
3720: 09 09 09 20 20 20 20 28 73 74 72 69 6e 67 2d 6a  ...    (string-j
3730: 6f 69 6e 20 0a 09 09 09 09 20 20 20 20 20 28 6d  oin .....     (m
3740: 61 70 20 28 6c 61 6d 62 64 61 20 28 6b 65 79 70  ap (lambda (keyp
3750: 61 74 74 29 0a 09 09 09 09 09 20 20 20 20 28 6c  att)......    (l
3760: 65 74 20 28 28 6b 65 79 20 20 28 63 61 72 20 6b  et ((key  (car k
3770: 65 79 70 61 74 74 29 29 0a 09 09 09 09 09 09 20  eypatt))....... 
3780: 20 28 70 61 74 74 20 28 63 61 64 72 20 6b 65 79   (patt (cadr key
3790: 70 61 74 74 29 29 29 0a 09 09 09 09 09 20 20 20  patt)))......   
37a0: 20 20 20 28 63 6f 6e 63 20 6b 65 79 20 22 20 4c     (conc key " L
37b0: 49 4b 45 20 27 22 20 70 61 74 74 20 22 27 22 29  IKE '" patt "'")
37c0: 29 29 0a 09 09 09 09 09 20 20 6b 65 79 70 61 74  ))......  keypat
37d0: 74 73 29 0a 09 09 09 09 20 20 20 20 20 22 20 41  ts).....     " A
37e0: 4e 44 20 22 29 29 29 0a 09 09 09 20 20 22 20 4f  ND ")))....  " O
37f0: 52 44 45 52 20 42 59 20 65 76 65 6e 74 5f 74 69  RDER BY event_ti
3800: 6d 65 20 44 45 53 43 20 22 0a 09 09 09 20 20 28  me DESC "....  (
3810: 69 66 20 28 6e 75 6d 62 65 72 3f 20 63 6f 75 6e  if (number? coun
3820: 74 29 0a 09 09 09 20 20 20 20 20 20 28 63 6f 6e  t)....      (con
3830: 63 20 22 20 4c 49 4d 49 54 20 22 20 63 6f 75 6e  c " LIMIT " coun
3840: 74 29 0a 09 09 09 20 20 20 20 20 20 22 22 29 0a  t)....      "").
3850: 09 09 09 20 20 28 69 66 20 28 6e 75 6d 62 65 72  ...  (if (number
3860: 3f 20 6f 66 66 73 65 74 29 0a 09 09 09 20 20 20  ? offset)....   
3870: 20 20 20 28 63 6f 6e 63 20 22 20 4f 46 46 53 45     (conc " OFFSE
3880: 54 20 22 20 6f 66 66 73 65 74 29 0a 09 09 09 20  T " offset).... 
3890: 20 20 20 20 20 22 22 29 29 29 29 0a 20 20 20 20       "")))).    
38a0: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22  (debug:print 4 "
38b0: 64 62 3a 67 65 74 2d 72 75 6e 73 20 71 72 79 73  db:get-runs qrys
38c0: 74 72 3a 20 22 20 71 72 79 73 74 72 20 22 5c 6e  tr: " qrystr "\n
38d0: 6b 65 79 70 61 74 74 73 3a 20 22 20 6b 65 79 70  keypatts: " keyp
38e0: 61 74 74 73 20 22 5c 6e 20 20 6f 66 66 73 65 74  atts "\n  offset
38f0: 3a 20 22 20 6f 66 66 73 65 74 20 22 20 6c 69 6d  : " offset " lim
3900: 69 74 3a 20 22 20 63 6f 75 6e 74 29 0a 20 20 20  it: " count).   
3910: 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61   (sqlite3:for-ea
3920: 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d  ch-row.     (lam
3930: 62 64 61 20 28 61 20 2e 20 78 29 0a 20 20 20 20  bda (a . x).    
3940: 20 20 20 28 73 65 74 21 20 72 65 73 20 28 63 6f     (set! res (co
3950: 6e 73 20 28 61 70 70 6c 79 20 76 65 63 74 6f 72  ns (apply vector
3960: 20 61 20 78 29 20 72 65 73 29 29 29 0a 20 20 20   a x) res))).   
3970: 20 20 64 62 0a 20 20 20 20 20 71 72 79 73 74 72    db.     qrystr
3980: 0a 20 20 20 20 20 72 75 6e 70 61 74 74 29 0a 20  .     runpatt). 
3990: 20 20 20 28 76 65 63 74 6f 72 20 68 65 61 64 65     (vector heade
39a0: 72 20 72 65 73 29 29 29 0a 0a 3b 3b 20 6a 75 73  r res)))..;; jus
39b0: 74 20 67 65 74 20 63 6f 75 6e 74 20 6f 66 20 72  t get count of r
39c0: 75 6e 73 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  uns.(define (db:
39d0: 67 65 74 2d 6e 75 6d 2d 72 75 6e 73 20 64 62 20  get-num-runs db 
39e0: 72 75 6e 70 61 74 74 29 0a 20 20 28 6c 65 74 20  runpatt).  (let 
39f0: 28 28 6e 75 6d 72 75 6e 73 20 30 29 29 0a 20 20  ((numruns 0)).  
3a00: 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65    (sqlite3:for-e
3a10: 61 63 68 2d 72 6f 77 20 0a 20 20 20 20 20 28 6c  ach-row .     (l
3a20: 61 6d 62 64 61 20 28 63 6f 75 6e 74 29 0a 20 20  ambda (count).  
3a30: 20 20 20 20 20 28 73 65 74 21 20 6e 75 6d 72 75       (set! numru
3a40: 6e 73 20 63 6f 75 6e 74 29 29 0a 20 20 20 20 20  ns count)).     
3a50: 64 62 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20  db.     "SELECT 
3a60: 43 4f 55 4e 54 28 69 64 29 20 46 52 4f 4d 20 72  COUNT(id) FROM r
3a70: 75 6e 73 20 57 48 45 52 45 20 72 75 6e 6e 61 6d  uns WHERE runnam
3a80: 65 20 4c 49 4b 45 20 3f 3b 22 20 72 75 6e 70 61  e LIKE ?;" runpa
3a90: 74 74 29 0a 20 20 20 20 6e 75 6d 72 75 6e 73 29  tt).    numruns)
3aa0: 29 0a 0a 0a 3b 3b 20 75 73 65 20 28 67 65 74 2d  )...;; use (get-
3ab0: 76 61 6c 75 65 2d 62 79 2d 68 65 61 64 65 72 20  value-by-header 
3ac0: 28 64 62 3a 67 65 74 2d 68 65 61 64 65 72 20 72  (db:get-header r
3ad0: 75 6e 69 6e 66 6f 29 28 64 62 3a 67 65 74 2d 72  uninfo)(db:get-r
3ae0: 6f 77 20 72 75 6e 69 6e 66 6f 29 29 0a 28 64 65  ow runinfo)).(de
3af0: 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 72 75 6e  fine (db:get-run
3b00: 2d 69 6e 66 6f 20 64 62 20 72 75 6e 2d 69 64 29  -info db run-id)
3b10: 0a 20 20 28 6c 65 74 2a 20 28 28 72 65 73 20 20  .  (let* ((res  
3b20: 20 20 20 20 23 66 29 0a 09 20 28 6b 65 79 73 20      #f).. (keys 
3b30: 20 20 20 20 20 28 64 62 2d 67 65 74 2d 6b 65 79       (db-get-key
3b40: 73 20 64 62 29 29 0a 09 20 28 72 65 6d 66 69 65  s db)).. (remfie
3b50: 6c 64 73 20 28 6c 69 73 74 20 22 69 64 22 20 22  lds (list "id" "
3b60: 72 75 6e 6e 61 6d 65 22 20 22 73 74 61 74 65 22  runname" "state"
3b70: 20 22 73 74 61 74 75 73 22 20 22 6f 77 6e 65 72   "status" "owner
3b80: 22 20 22 65 76 65 6e 74 5f 74 69 6d 65 22 29 29  " "event_time"))
3b90: 0a 09 20 28 68 65 61 64 65 72 20 20 20 20 28 61  .. (header    (a
3ba0: 70 70 65 6e 64 20 28 6d 61 70 20 6b 65 79 3a 67  ppend (map key:g
3bb0: 65 74 2d 66 69 65 6c 64 6e 61 6d 65 20 6b 65 79  et-fieldname key
3bc0: 73 29 0a 09 09 09 20 20 20 20 72 65 6d 66 69 65  s)....    remfie
3bd0: 6c 64 73 29 29 0a 09 20 28 6b 65 79 73 74 72 20  lds)).. (keystr 
3be0: 20 20 20 28 63 6f 6e 63 20 28 6b 65 79 73 2d 3e     (conc (keys->
3bf0: 6b 65 79 73 74 72 20 6b 65 79 73 29 20 22 2c 22  keystr keys) ","
3c00: 0a 09 09 09 20 20 28 73 74 72 69 6e 67 2d 69 6e  ....  (string-in
3c10: 74 65 72 73 70 65 72 73 65 20 72 65 6d 66 69 65  tersperse remfie
3c20: 6c 64 73 20 22 2c 22 29 29 29 29 0a 20 20 20 20  lds ",")))).    
3c30: 3b 3b 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20  ;; (debug:print 
3c40: 30 20 22 64 62 3a 67 65 74 2d 72 75 6e 2d 69 6e  0 "db:get-run-in
3c50: 66 6f 20 72 75 6e 2d 69 64 3a 20 22 20 72 75 6e  fo run-id: " run
3c60: 2d 69 64 20 22 20 68 65 61 64 65 72 3a 20 22 20  -id " header: " 
3c70: 68 65 61 64 65 72 20 22 20 6b 65 79 73 74 72 3a  header " keystr:
3c80: 20 22 20 6b 65 79 73 74 72 29 0a 20 20 20 20 28   " keystr).    (
3c90: 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68  sqlite3:for-each
3ca0: 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 64  -row.     (lambd
3cb0: 61 20 28 61 20 2e 20 78 29 0a 20 20 20 20 20 20  a (a . x).      
3cc0: 20 28 73 65 74 21 20 72 65 73 20 28 61 70 70 6c   (set! res (appl
3cd0: 79 20 76 65 63 74 6f 72 20 61 20 78 29 29 29 0a  y vector a x))).
3ce0: 20 20 20 20 20 64 62 0a 20 20 20 20 20 28 63 6f       db.     (co
3cf0: 6e 63 20 22 53 45 4c 45 43 54 20 22 20 6b 65 79  nc "SELECT " key
3d00: 73 74 72 20 22 20 46 52 4f 4d 20 72 75 6e 73 20  str " FROM runs 
3d10: 57 48 45 52 45 20 69 64 3d 3f 3b 22 29 0a 20 20  WHERE id=?;").  
3d20: 20 20 20 72 75 6e 2d 69 64 29 0a 20 20 20 20 28     run-id).    (
3d30: 76 65 63 74 6f 72 20 68 65 61 64 65 72 20 72 65  vector header re
3d40: 73 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64  s)))..(define (d
3d50: 62 3a 73 65 74 2d 63 6f 6d 6d 65 6e 74 2d 66 6f  b:set-comment-fo
3d60: 72 2d 72 75 6e 20 64 62 20 72 75 6e 2d 69 64 20  r-run db run-id 
3d70: 63 6f 6d 6d 65 6e 74 29 0a 20 20 28 73 71 6c 69  comment).  (sqli
3d80: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22  te3:execute db "
3d90: 55 50 44 41 54 45 20 72 75 6e 73 20 53 45 54 20  UPDATE runs SET 
3da0: 63 6f 6d 6d 65 6e 74 3d 3f 20 57 48 45 52 45 20  comment=? WHERE 
3db0: 69 64 3d 3f 3b 22 20 63 6f 6d 6d 65 6e 74 20 72  id=?;" comment r
3dc0: 75 6e 2d 69 64 29 29 0a 0a 3b 3b 20 64 6f 65 73  un-id))..;; does
3dd0: 20 6e 6f 74 20 28 6f 62 76 69 6f 75 73 6c 79 21   not (obviously!
3de0: 29 20 72 65 6d 6f 76 65 64 20 64 65 70 65 6e 64  ) removed depend
3df0: 65 6e 74 20 64 61 74 61 2e 20 0a 28 64 65 66 69  ent data. .(defi
3e00: 6e 65 20 28 64 62 3a 64 65 6c 65 74 65 2d 72 75  ne (db:delete-ru
3e10: 6e 20 64 62 20 72 75 6e 2d 69 64 29 0a 20 20 28  n db run-id).  (
3e20: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
3e30: 64 62 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  db "DELETE FROM 
3e40: 72 75 6e 73 20 57 48 45 52 45 20 69 64 3d 3f 3b  runs WHERE id=?;
3e50: 22 20 72 75 6e 2d 69 64 29 29 0a 0a 28 64 65 66  " run-id))..(def
3e60: 69 6e 65 20 28 64 62 3a 75 70 64 61 74 65 2d 72  ine (db:update-r
3e70: 75 6e 2d 65 76 65 6e 74 5f 74 69 6d 65 20 64 62  un-event_time db
3e80: 20 72 75 6e 2d 69 64 29 0a 20 20 28 73 71 6c 69   run-id).  (sqli
3e90: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22  te3:execute db "
3ea0: 55 50 44 41 54 45 20 72 75 6e 73 20 53 45 54 20  UPDATE runs SET 
3eb0: 65 76 65 6e 74 5f 74 69 6d 65 3d 73 74 72 66 74  event_time=strft
3ec0: 69 6d 65 28 27 25 73 27 2c 27 6e 6f 77 27 29 20  ime('%s','now') 
3ed0: 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 72 75 6e  WHERE id=?;" run
3ee0: 2d 69 64 29 29 20 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d  -id)) ..;;======
3ef0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3f00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3f10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3f20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3f30: 0a 3b 3b 20 20 54 20 45 20 53 20 54 20 53 0a 3b  .;;  T E S T S.;
3f40: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;===============
3f50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3f60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3f70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3f80: 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 73 74 61 74  =======..;; stat
3f90: 65 73 20 61 6e 64 20 73 74 61 74 75 73 65 73 20  es and statuses 
3fa0: 61 72 65 20 6c 69 73 74 73 2c 20 74 75 72 6e 20  are lists, turn 
3fb0: 74 68 65 6d 20 69 6e 74 6f 20 28 22 50 41 53 53  them into ("PASS
3fc0: 22 2c 22 46 41 49 4c 22 2e 2e 2e 29 20 61 6e 64  ","FAIL"...) and
3fd0: 20 75 73 65 20 4e 4f 54 20 49 4e 0a 3b 3b 20 69   use NOT IN.;; i
3fe0: 2e 65 2e 20 74 68 65 73 65 20 6c 69 73 74 73 20  .e. these lists 
3ff0: 64 65 66 69 6e 65 20 77 68 61 74 20 74 6f 20 4e  define what to N
4000: 4f 54 20 73 68 6f 77 2e 0a 3b 3b 20 73 74 61 74  OT show..;; stat
4010: 65 73 20 61 6e 64 20 73 74 61 74 75 73 65 73 20  es and statuses 
4020: 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20  are required to 
4030: 62 65 20 6c 69 73 74 73 2c 20 65 6d 70 74 79 20  be lists, empty 
4040: 69 73 20 6f 6b 0a 28 64 65 66 69 6e 65 20 28 64  is ok.(define (d
4050: 62 2d 67 65 74 2d 74 65 73 74 73 2d 66 6f 72 2d  b-get-tests-for-
4060: 72 75 6e 20 64 62 20 72 75 6e 2d 69 64 20 74 65  run db run-id te
4070: 73 74 70 61 74 74 20 69 74 65 6d 70 61 74 74 20  stpatt itempatt 
4080: 73 74 61 74 65 73 20 73 74 61 74 75 73 65 73 29  states statuses)
4090: 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20 27 28  .  (let ((res '(
40a0: 29 29 0a 09 28 73 74 61 74 65 73 2d 73 74 72 20  ))..(states-str 
40b0: 20 20 20 28 63 6f 6e 63 20 22 28 27 22 20 28 73     (conc "('" (s
40c0: 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73  tring-interspers
40d0: 65 20 73 74 61 74 65 73 20 20 20 22 27 2c 27 22  e states   "','"
40e0: 29 20 22 27 29 22 29 29 0a 09 28 73 74 61 74 75  ) "')"))..(statu
40f0: 73 65 73 2d 73 74 72 20 20 28 63 6f 6e 63 20 22  ses-str  (conc "
4100: 28 27 22 20 28 73 74 72 69 6e 67 2d 69 6e 74 65  ('" (string-inte
4110: 72 73 70 65 72 73 65 20 73 74 61 74 75 73 65 73  rsperse statuses
4120: 20 22 27 2c 27 22 29 20 22 27 29 22 29 29 0a 09   "','") "')"))..
4130: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66  ).    (sqlite3:f
4140: 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20 20  or-each-row .   
4150: 20 20 28 6c 61 6d 62 64 61 20 28 61 20 2e 20 62    (lambda (a . b
4160: 29 20 3b 3b 20 69 64 20 72 75 6e 2d 69 64 20 74  ) ;; id run-id t
4170: 65 73 74 6e 61 6d 65 20 73 74 61 74 65 20 73 74  estname state st
4180: 61 74 75 73 20 65 76 65 6e 74 2d 74 69 6d 65 20  atus event-time 
4190: 68 6f 73 74 20 63 70 75 6c 6f 61 64 20 64 69 73  host cpuload dis
41a0: 6b 66 72 65 65 20 75 6e 61 6d 65 20 72 75 6e 64  kfree uname rund
41b0: 69 72 20 69 74 65 6d 2d 70 61 74 68 20 72 75 6e  ir item-path run
41c0: 2d 64 75 72 61 74 69 6f 6e 20 66 69 6e 61 6c 2d  -duration final-
41d0: 6c 6f 67 66 20 63 6f 6d 6d 65 6e 74 29 0a 20 20  logf comment).  
41e0: 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28       (set! res (
41f0: 63 6f 6e 73 20 28 61 70 70 6c 79 20 76 65 63 74  cons (apply vect
4200: 6f 72 20 61 20 62 29 20 72 65 73 29 29 29 20 3b  or a b) res))) ;
4210: 3b 20 69 64 20 72 75 6e 2d 69 64 20 74 65 73 74  ; id run-id test
4220: 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61 74 75  name state statu
4230: 73 20 65 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73  s event-time hos
4240: 74 20 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72  t cpuload diskfr
4250: 65 65 20 75 6e 61 6d 65 20 72 75 6e 64 69 72 20  ee uname rundir 
4260: 69 74 65 6d 2d 70 61 74 68 20 72 75 6e 2d 64 75  item-path run-du
4270: 72 61 74 69 6f 6e 20 66 69 6e 61 6c 2d 6c 6f 67  ration final-log
4280: 66 20 63 6f 6d 6d 65 6e 74 29 20 72 65 73 29 29  f comment) res))
4290: 29 0a 20 20 20 20 20 64 62 20 0a 20 20 20 20 20  ).     db .     
42a0: 28 63 6f 6e 63 20 22 53 45 4c 45 43 54 20 69 64  (conc "SELECT id
42b0: 2c 72 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d 65  ,run_id,testname
42c0: 2c 73 74 61 74 65 2c 73 74 61 74 75 73 2c 65 76  ,state,status,ev
42d0: 65 6e 74 5f 74 69 6d 65 2c 68 6f 73 74 2c 63 70  ent_time,host,cp
42e0: 75 6c 6f 61 64 2c 64 69 73 6b 66 72 65 65 2c 75  uload,diskfree,u
42f0: 6e 61 6d 65 2c 72 75 6e 64 69 72 2c 69 74 65 6d  name,rundir,item
4300: 5f 70 61 74 68 2c 72 75 6e 5f 64 75 72 61 74 69  _path,run_durati
4310: 6f 6e 2c 66 69 6e 61 6c 5f 6c 6f 67 66 2c 63 6f  on,final_logf,co
4320: 6d 6d 65 6e 74 20 22 0a 09 20 20 20 22 20 46 52  mment "..   " FR
4330: 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 72  OM tests WHERE r
4340: 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74  un_id=? AND test
4350: 6e 61 6d 65 20 6c 69 6b 65 20 3f 20 41 4e 44 20  name like ? AND 
4360: 69 74 65 6d 5f 70 61 74 68 20 4c 49 4b 45 20 3f  item_path LIKE ?
4370: 20 22 20 0a 09 20 20 20 22 20 41 4e 44 20 4e 4f   " ..   " AND NO
4380: 54 20 28 73 74 61 74 65 20 69 6e 20 22 20 73 74  T (state in " st
4390: 61 74 65 73 2d 73 74 72 20 22 20 41 4e 44 20 73  ates-str " AND s
43a0: 74 61 74 75 73 20 49 4e 20 22 20 73 74 61 74 75  tatus IN " statu
43b0: 73 65 73 2d 73 74 72 20 22 29 20 22 0a 09 20 20  ses-str ") "..  
43c0: 20 3b 3b 20 22 20 4f 52 44 45 52 20 42 59 20 69   ;; " ORDER BY i
43d0: 64 20 44 45 53 43 3b 22 0a 09 20 20 20 22 20 4f  d DESC;"..   " O
43e0: 52 44 45 52 20 42 59 20 65 76 65 6e 74 5f 74 69  RDER BY event_ti
43f0: 6d 65 20 41 53 43 3b 22 20 3b 3b 20 50 4f 54 45  me ASC;" ;; POTE
4400: 4e 54 49 41 4c 20 49 53 53 55 45 21 20 43 48 45  NTIAL ISSUE! CHE
4410: 43 4b 20 4d 45 21 20 44 6f 65 73 20 61 6e 79 74  CK ME! Does anyt
4420: 69 6e 67 20 64 65 70 65 6e 64 20 6f 6e 20 74 68  ing depend on th
4430: 69 73 20 62 65 69 6e 67 20 73 6f 72 74 65 64 20  is being sorted 
4440: 62 79 20 69 64 3f 0a 09 20 20 20 29 0a 20 20 20  by id?..   ).   
4450: 20 20 72 75 6e 2d 69 64 0a 20 20 20 20 20 28 69    run-id.     (i
4460: 66 20 74 65 73 74 70 61 74 74 20 74 65 73 74 70  f testpatt testp
4470: 61 74 74 20 22 25 22 29 0a 20 20 20 20 20 28 69  att "%").     (i
4480: 66 20 69 74 65 6d 70 61 74 74 20 69 74 65 6d 70  f itempatt itemp
4490: 61 74 74 20 22 25 22 29 29 0a 20 20 20 20 72 65  att "%")).    re
44a0: 73 29 29 0a 0a 3b 3b 20 74 68 69 73 20 6f 6e 65  s))..;; this one
44b0: 20 69 73 20 61 20 62 69 74 20 62 72 6f 6b 65 6e   is a bit broken
44c0: 20 42 55 47 20 46 49 58 4d 45 0a 28 64 65 66 69   BUG FIXME.(defi
44d0: 6e 65 20 28 64 62 3a 64 65 6c 65 74 65 2d 74 65  ne (db:delete-te
44e0: 73 74 2d 73 74 65 70 2d 72 65 63 6f 72 64 73 20  st-step-records 
44f0: 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e  db run-id test-n
4500: 61 6d 65 20 69 74 65 6d 64 61 74 29 0a 20 20 28  ame itemdat).  (
4510: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
4520: 64 62 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  db "DELETE FROM 
4530: 74 65 73 74 5f 73 74 65 70 73 20 57 48 45 52 45  test_steps WHERE
4540: 20 74 65 73 74 5f 69 64 20 69 6e 20 28 53 45 4c   test_id in (SEL
4550: 45 43 54 20 69 64 20 46 52 4f 4d 20 74 65 73 74  ECT id FROM test
4560: 73 20 57 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f  s WHERE run_id=?
4570: 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20   AND testname=? 
4580: 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 3d 3f 29  AND item_path=?)
4590: 3b 22 20 0a 09 09 20 20 20 72 75 6e 2d 69 64 20  ;" ...   run-id 
45a0: 74 65 73 74 2d 6e 61 6d 65 20 28 69 74 65 6d 2d  test-name (item-
45b0: 6c 69 73 74 2d 3e 70 61 74 68 20 69 74 65 6d 64  list->path itemd
45c0: 61 74 29 29 29 0a 3b 3b 20 0a 28 64 65 66 69 6e  at))).;; .(defin
45d0: 65 20 28 64 62 3a 64 65 6c 65 74 65 2d 74 65 73  e (db:delete-tes
45e0: 74 2d 72 65 63 6f 72 64 73 20 64 62 20 74 65 73  t-records db tes
45f0: 74 2d 69 64 29 0a 20 20 28 73 71 6c 69 74 65 33  t-id).  (sqlite3
4600: 3a 65 78 65 63 75 74 65 20 64 62 20 22 44 45 4c  :execute db "DEL
4610: 45 54 45 20 46 52 4f 4d 20 74 65 73 74 5f 73 74  ETE FROM test_st
4620: 65 70 73 20 57 48 45 52 45 20 74 65 73 74 5f 69  eps WHERE test_i
4630: 64 3d 3f 3b 22 20 74 65 73 74 2d 69 64 29 0a 20  d=?;" test-id). 
4640: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
4650: 65 20 64 62 20 22 44 45 4c 45 54 45 20 46 52 4f  e db "DELETE FRO
4660: 4d 20 74 65 73 74 5f 64 61 74 61 20 20 57 48 45  M test_data  WHE
4670: 52 45 20 74 65 73 74 5f 69 64 3d 3f 3b 22 20 74  RE test_id=?;" t
4680: 65 73 74 2d 69 64 29 0a 20 20 28 73 71 6c 69 74  est-id).  (sqlit
4690: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 44  e3:execute db "D
46a0: 45 4c 45 54 45 20 46 52 4f 4d 20 74 65 73 74 73  ELETE FROM tests
46b0: 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 74 65   WHERE id=?;" te
46c0: 73 74 2d 69 64 29 29 0a 0a 3b 3b 20 73 65 74 20  st-id))..;; set 
46d0: 74 65 73 74 73 20 77 69 74 68 20 73 74 61 74 65  tests with state
46e0: 20 63 75 72 72 73 74 61 74 65 20 61 6e 64 20 73   currstate and s
46f0: 74 61 74 75 73 20 63 75 72 72 73 74 61 74 75 73  tatus currstatus
4700: 20 74 6f 20 6e 65 77 73 74 61 74 65 20 61 6e 64   to newstate and
4710: 20 6e 65 77 73 74 61 74 75 73 0a 3b 3b 20 75 73   newstatus.;; us
4720: 65 20 63 75 72 72 73 74 61 74 65 20 3d 20 23 66  e currstate = #f
4730: 20 61 6e 64 20 6f 72 20 63 75 72 72 73 74 61 74   and or currstat
4740: 75 73 20 3d 20 23 66 20 74 6f 20 61 70 70 6c 79  us = #f to apply
4750: 20 74 6f 20 61 6e 79 20 73 74 61 74 65 20 6f 72   to any state or
4760: 20 73 74 61 74 75 73 20 72 65 73 70 65 63 74 69   status respecti
4770: 76 65 6c 79 0a 3b 3b 20 57 41 52 4e 49 4e 47 3a  vely.;; WARNING:
4780: 20 53 51 4c 20 69 6e 6a 65 63 74 69 6f 6e 20 72   SQL injection r
4790: 69 73 6b 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  isk.(define (db:
47a0: 73 65 74 2d 74 65 73 74 73 2d 73 74 61 74 65 2d  set-tests-state-
47b0: 73 74 61 74 75 73 20 64 62 20 72 75 6e 2d 69 64  status db run-id
47c0: 20 74 65 73 74 6e 61 6d 65 73 20 63 75 72 72 73   testnames currs
47d0: 74 61 74 65 20 63 75 72 72 73 74 61 74 75 73 20  tate currstatus 
47e0: 6e 65 77 73 74 61 74 65 20 6e 65 77 73 74 61 74  newstate newstat
47f0: 75 73 29 0a 20 20 28 66 6f 72 2d 65 61 63 68 20  us).  (for-each 
4800: 28 6c 61 6d 62 64 61 20 28 74 65 73 74 6e 61 6d  (lambda (testnam
4810: 65 29 0a 09 20 20 20 20 20 20 28 6c 65 74 20 28  e)..      (let (
4820: 28 71 72 79 20 28 63 6f 6e 63 20 22 55 50 44 41  (qry (conc "UPDA
4830: 54 45 20 74 65 73 74 73 20 53 45 54 20 73 74 61  TE tests SET sta
4840: 74 65 3d 3f 2c 73 74 61 74 75 73 3d 3f 20 57 48  te=?,status=? WH
4850: 45 52 45 20 22 0a 09 09 09 20 20 20 20 20 20 20  ERE "....       
4860: 28 69 66 20 63 75 72 72 73 74 61 74 65 20 20 28  (if currstate  (
4870: 63 6f 6e 63 20 22 73 74 61 74 65 3d 27 22 20 63  conc "state='" c
4880: 75 72 72 73 74 61 74 65 20 22 27 20 41 4e 44 20  urrstate "' AND 
4890: 22 29 20 22 22 29 0a 09 09 09 20 20 20 20 20 20  ") "")....      
48a0: 20 28 69 66 20 63 75 72 72 73 74 61 74 75 73 20   (if currstatus 
48b0: 28 63 6f 6e 63 20 22 73 74 61 74 75 73 3d 27 22  (conc "status='"
48c0: 20 63 75 72 72 73 74 61 74 75 73 20 22 27 20 41   currstatus "' A
48d0: 4e 44 20 22 29 20 22 22 29 0a 09 09 09 20 20 20  ND ") "")....   
48e0: 20 20 20 20 22 20 72 75 6e 5f 69 64 3d 3f 20 41      " run_id=? A
48f0: 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e  ND testname=? AN
4900: 44 20 4e 4f 54 20 28 69 74 65 6d 5f 70 61 74 68  D NOT (item_path
4910: 3d 27 27 20 41 4e 44 20 74 65 73 74 6e 61 6d 65  ='' AND testname
4920: 20 69 6e 20 28 53 45 4c 45 43 54 20 44 49 53 54   in (SELECT DIST
4930: 49 4e 43 54 20 74 65 73 74 6e 61 6d 65 20 46 52  INCT testname FR
4940: 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 74  OM tests WHERE t
4950: 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74  estname=? AND it
4960: 65 6d 5f 70 61 74 68 20 21 3d 20 27 27 29 29 3b  em_path != ''));
4970: 22 29 29 29 0a 09 09 3b 3b 28 64 65 62 75 67 3a  ")))...;;(debug:
4980: 70 72 69 6e 74 20 30 20 22 51 52 59 3a 20 22 20  print 0 "QRY: " 
4990: 71 72 79 29 0a 09 09 28 73 71 6c 69 74 65 33 3a  qry)...(sqlite3:
49a0: 65 78 65 63 75 74 65 20 64 62 20 71 72 79 20 72  execute db qry r
49b0: 75 6e 2d 69 64 20 6e 65 77 73 74 61 74 65 20 6e  un-id newstate n
49c0: 65 77 73 74 61 74 75 73 20 74 65 73 74 6e 61 6d  ewstatus testnam
49d0: 65 20 74 65 73 74 6e 61 6d 65 29 29 29 0a 09 20  e testname))).. 
49e0: 20 20 20 74 65 73 74 6e 61 6d 65 73 29 29 0a 0a     testnames))..
49f0: 28 64 65 66 69 6e 65 20 28 64 62 3a 64 65 6c 65  (define (db:dele
4a00: 74 65 2d 74 65 73 74 73 2d 69 6e 2d 73 74 61 74  te-tests-in-stat
4a10: 65 20 64 62 20 72 75 6e 2d 69 64 20 73 74 61 74  e db run-id stat
4a20: 65 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78  e).  (sqlite3:ex
4a30: 65 63 75 74 65 20 64 62 20 22 44 45 4c 45 54 45  ecute db "DELETE
4a40: 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52   FROM tests WHER
4a50: 45 20 73 74 61 74 65 3d 3f 20 41 4e 44 20 72 75  E state=? AND ru
4a60: 6e 5f 69 64 3d 3f 3b 22 20 73 74 61 74 65 20 72  n_id=?;" state r
4a70: 75 6e 2d 69 64 29 29 0a 0a 28 64 65 66 69 6e 65  un-id))..(define
4a80: 20 28 64 62 3a 74 65 73 74 2d 73 65 74 2d 73 74   (db:test-set-st
4a90: 61 74 65 2d 73 74 61 74 75 73 2d 62 79 2d 69 64  ate-status-by-id
4aa0: 20 64 62 20 74 65 73 74 2d 69 64 20 6e 65 77 73   db test-id news
4ab0: 74 61 74 65 20 6e 65 77 73 74 61 74 75 73 20 6e  tate newstatus n
4ac0: 65 77 63 6f 6d 6d 65 6e 74 29 0a 20 20 28 69 66  ewcomment).  (if
4ad0: 20 6e 65 77 73 74 61 74 65 20 20 20 28 73 71 6c   newstate   (sql
4ae0: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
4af0: 22 55 50 44 41 54 45 20 74 65 73 74 73 20 53 45  "UPDATE tests SE
4b00: 54 20 73 74 61 74 65 3d 3f 20 20 20 57 48 45 52  T state=?   WHER
4b10: 45 20 69 64 3d 3f 3b 22 20 6e 65 77 73 74 61 74  E id=?;" newstat
4b20: 65 20 20 20 74 65 73 74 2d 69 64 29 29 0a 20 20  e   test-id)).  
4b30: 28 69 66 20 6e 65 77 73 74 61 74 75 73 20 20 28  (if newstatus  (
4b40: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
4b50: 64 62 20 22 55 50 44 41 54 45 20 74 65 73 74 73  db "UPDATE tests
4b60: 20 53 45 54 20 73 74 61 74 75 73 3d 3f 20 20 57   SET status=?  W
4b70: 48 45 52 45 20 69 64 3d 3f 3b 22 20 6e 65 77 73  HERE id=?;" news
4b80: 74 61 74 75 73 20 20 74 65 73 74 2d 69 64 29 29  tatus  test-id))
4b90: 0a 20 20 28 69 66 20 6e 65 77 63 6f 6d 6d 65 6e  .  (if newcommen
4ba0: 74 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75  t (sqlite3:execu
4bb0: 74 65 20 64 62 20 22 55 50 44 41 54 45 20 74 65  te db "UPDATE te
4bc0: 73 74 73 20 53 45 54 20 63 6f 6d 6d 65 6e 74 3d  sts SET comment=
4bd0: 3f 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 6e  ? WHERE id=?;" n
4be0: 65 77 63 6f 6d 6d 65 6e 74 20 74 65 73 74 2d 69  ewcomment test-i
4bf0: 64 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64  d)))..(define (d
4c00: 62 3a 74 65 73 74 2d 73 65 74 2d 73 74 61 74 65  b:test-set-state
4c10: 2d 73 74 61 74 75 73 2d 62 79 2d 72 75 6e 2d 69  -status-by-run-i
4c20: 64 2d 74 65 73 74 6e 61 6d 65 20 64 62 20 72 75  d-testname db ru
4c30: 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69  n-id test-name i
4c40: 74 65 6d 2d 70 61 74 68 20 73 74 61 74 75 73 20  tem-path status 
4c50: 73 74 61 74 65 29 0a 20 20 28 73 71 6c 69 74 65  state).  (sqlite
4c60: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 55 50  3:execute db "UP
4c70: 44 41 54 45 20 74 65 73 74 73 20 53 45 54 20 73  DATE tests SET s
4c80: 74 61 74 65 3d 3f 2c 73 74 61 74 75 73 3d 3f 2c  tate=?,status=?,
4c90: 65 76 65 6e 74 5f 74 69 6d 65 3d 73 74 72 66 74  event_time=strft
4ca0: 69 6d 65 28 27 25 73 27 2c 27 6e 6f 77 27 29 20  ime('%s','now') 
4cb0: 57 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41  WHERE run_id=? A
4cc0: 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e  ND testname=? AN
4cd0: 44 20 69 74 65 6d 5f 70 61 74 68 3d 3f 3b 22 20  D item_path=?;" 
4ce0: 0a 09 09 20 20 20 73 74 61 74 65 20 73 74 61 74  ...   state stat
4cf0: 75 73 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e  us run-id test-n
4d00: 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 29 0a  ame item-path)).
4d10: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74  .(define (db:get
4d20: 2d 63 6f 75 6e 74 2d 74 65 73 74 73 2d 72 75 6e  -count-tests-run
4d30: 6e 69 6e 67 20 64 62 29 0a 20 20 28 6c 65 74 20  ning db).  (let 
4d40: 28 28 72 65 73 20 30 29 29 0a 20 20 20 20 28 73  ((res 0)).    (s
4d50: 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d  qlite3:for-each-
4d60: 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 64 61  row.     (lambda
4d70: 20 28 63 6f 75 6e 74 29 0a 20 20 20 20 20 20 20   (count).       
4d80: 28 73 65 74 21 20 72 65 73 20 63 6f 75 6e 74 29  (set! res count)
4d90: 29 0a 20 20 20 20 20 64 62 0a 20 20 20 20 20 22  ).     db.     "
4da0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 69 64 29  SELECT count(id)
4db0: 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52   FROM tests WHER
4dc0: 45 20 73 74 61 74 65 20 3d 20 27 52 55 4e 4e 49  E state = 'RUNNI
4dd0: 4e 47 27 20 4f 52 20 73 74 61 74 65 20 3d 20 27  NG' OR state = '
4de0: 4c 41 55 4e 43 48 45 44 27 20 4f 52 20 73 74 61  LAUNCHED' OR sta
4df0: 74 65 20 3d 20 27 52 45 4d 4f 54 45 48 4f 53 54  te = 'REMOTEHOST
4e00: 53 54 41 52 54 27 3b 22 29 0a 20 20 20 20 72 65  START';").    re
4e10: 73 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62  s))..(define (db
4e20: 3a 67 65 74 2d 63 6f 75 6e 74 2d 74 65 73 74 73  :get-count-tests
4e30: 2d 72 75 6e 6e 69 6e 67 2d 69 6e 2d 6a 6f 62 67  -running-in-jobg
4e40: 72 6f 75 70 20 64 62 20 6a 6f 62 67 72 6f 75 70  roup db jobgroup
4e50: 29 0a 20 20 28 69 66 20 28 6e 6f 74 20 6a 6f 62  ).  (if (not job
4e60: 67 72 6f 75 70 29 0a 20 20 20 20 20 20 30 20 3b  group).      0 ;
4e70: 3b 20 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28  ; .      (let ((
4e80: 72 65 73 20 30 29 29 0a 09 28 73 71 6c 69 74 65  res 0))..(sqlite
4e90: 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 09  3:for-each-row..
4ea0: 20 28 6c 61 6d 62 64 61 20 28 63 6f 75 6e 74 29   (lambda (count)
4eb0: 0a 09 20 20 20 28 73 65 74 21 20 72 65 73 20 63  ..   (set! res c
4ec0: 6f 75 6e 74 29 29 0a 09 20 64 62 0a 09 20 22 53  ount)).. db.. "S
4ed0: 45 4c 45 43 54 20 63 6f 75 6e 74 28 69 64 29 20  ELECT count(id) 
4ee0: 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45  FROM tests WHERE
4ef0: 20 73 74 61 74 65 20 3d 20 27 52 55 4e 4e 49 4e   state = 'RUNNIN
4f00: 47 27 20 4f 52 20 73 74 61 74 65 20 3d 20 27 4c  G' OR state = 'L
4f10: 41 55 4e 43 48 45 44 27 20 4f 52 20 73 74 61 74  AUNCHED' OR stat
4f20: 65 20 3d 20 27 52 45 4d 4f 54 45 48 4f 53 54 53  e = 'REMOTEHOSTS
4f30: 54 41 52 54 27 0a 20 20 20 20 20 20 20 20 20 20  TART'.          
4f40: 20 20 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 20     AND testname 
4f50: 69 6e 20 28 53 45 4c 45 43 54 20 74 65 73 74 6e  in (SELECT testn
4f60: 61 6d 65 20 46 52 4f 4d 20 74 65 73 74 5f 6d 65  ame FROM test_me
4f70: 74 61 20 57 48 45 52 45 20 6a 6f 62 67 72 6f 75  ta WHERE jobgrou
4f80: 70 3d 3f 3b 22 0a 09 20 6a 6f 62 67 72 6f 75 70  p=?;".. jobgroup
4f90: 29 0a 09 72 65 73 29 29 29 0a 0a 3b 3b 20 64 6f  )..res)))..;; do
4fa0: 6e 65 20 77 69 74 68 20 72 75 6e 20 77 68 65 6e  ne with run when
4fb0: 3a 0a 3b 3b 20 20 20 30 20 74 65 73 74 73 20 69  :.;;   0 tests i
4fc0: 6e 20 4c 41 55 4e 43 48 45 44 2c 20 4e 4f 54 5f  n LAUNCHED, NOT_
4fd0: 53 54 41 52 54 45 44 2c 20 52 45 4d 4f 54 45 48  STARTED, REMOTEH
4fe0: 4f 53 54 53 54 41 52 54 2c 20 52 55 4e 4e 49 4e  OSTSTART, RUNNIN
4ff0: 47 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 65 73  G.(define (db:es
5000: 74 69 6d 61 74 65 64 2d 74 65 73 74 73 2d 72 65  timated-tests-re
5010: 6d 61 69 6e 69 6e 67 20 64 62 20 72 75 6e 2d 69  maining db run-i
5020: 64 29 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20  d).  (let ((res 
5030: 30 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33  0)).    (sqlite3
5040: 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20  :for-each-row.  
5050: 20 20 20 28 6c 61 6d 62 64 61 20 28 63 6f 75 6e     (lambda (coun
5060: 74 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20  t).       (set! 
5070: 72 65 73 20 63 6f 75 6e 74 29 29 0a 20 20 20 20  res count)).    
5080: 20 64 62 20 3b 3b 20 4e 42 2f 2f 20 4b 49 4c 4c   db ;; NB// KILL
5090: 52 45 51 20 6d 65 61 6e 73 20 74 68 65 20 6a 6f  REQ means the jo
50a0: 62 73 20 69 73 20 73 74 69 6c 6c 20 70 72 6f 62  bs is still prob
50b0: 61 62 6c 79 20 72 75 6e 6e 69 6e 67 0a 20 20 20  ably running.   
50c0: 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28    "SELECT count(
50d0: 69 64 29 20 46 52 4f 4d 20 74 65 73 74 73 20 57  id) FROM tests W
50e0: 48 45 52 45 20 73 74 61 74 65 20 69 6e 20 28 27  HERE state in ('
50f0: 4c 41 55 4e 43 48 45 44 27 2c 27 4e 4f 54 5f 53  LAUNCHED','NOT_S
5100: 54 41 52 54 45 44 27 2c 27 52 45 4d 4f 54 45 48  TARTED','REMOTEH
5110: 4f 53 54 53 54 41 52 54 27 2c 27 52 55 4e 4e 49  OSTSTART','RUNNI
5120: 4e 47 27 2c 27 4b 49 4c 4c 52 45 51 27 29 20 41  NG','KILLREQ') A
5130: 4e 44 20 72 75 6e 5f 69 64 3d 3f 3b 22 20 72 75  ND run_id=?;" ru
5140: 6e 2d 69 64 29 0a 20 20 20 20 72 65 73 29 29 0a  n-id).    res)).
5150: 0a 3b 3b 20 4e 42 2f 2f 20 53 79 6e 63 20 74 68  .;; NB// Sync th
5160: 69 73 20 77 69 74 68 20 72 75 6e 73 3a 67 65 74  is with runs:get
5170: 2d 74 65 73 74 2d 69 6e 66 6f 0a 28 64 65 66 69  -test-info.(defi
5180: 6e 65 20 28 64 62 3a 67 65 74 2d 74 65 73 74 2d  ne (db:get-test-
5190: 69 6e 66 6f 20 64 62 20 72 75 6e 2d 69 64 20 74  info db run-id t
51a0: 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74  estname item-pat
51b0: 68 29 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20  h).  (let ((res 
51c0: 23 66 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65  #f)).    (sqlite
51d0: 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20  3:for-each-row. 
51e0: 20 20 20 20 28 6c 61 6d 62 64 61 20 28 69 64 20      (lambda (id 
51f0: 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20  run-id testname 
5200: 73 74 61 74 65 20 73 74 61 74 75 73 20 65 76 65  state status eve
5210: 6e 74 2d 74 69 6d 65 20 68 6f 73 74 20 63 70 75  nt-time host cpu
5220: 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20 75 6e  load diskfree un
5230: 61 6d 65 20 72 75 6e 64 69 72 20 69 74 65 6d 2d  ame rundir item-
5240: 70 61 74 68 20 72 75 6e 5f 64 75 72 61 74 69 6f  path run_duratio
5250: 6e 20 66 69 6e 61 6c 5f 6c 6f 67 66 20 63 6f 6d  n final_logf com
5260: 6d 65 6e 74 20 29 0a 20 20 20 20 20 20 20 28 73  ment ).       (s
5270: 65 74 21 20 72 65 73 20 28 76 65 63 74 6f 72 20  et! res (vector 
5280: 69 64 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61  id run-id testna
5290: 6d 65 20 73 74 61 74 65 20 73 74 61 74 75 73 20  me state status 
52a0: 65 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73 74 20  event-time host 
52b0: 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65  cpuload diskfree
52c0: 20 75 6e 61 6d 65 20 72 75 6e 64 69 72 20 69 74   uname rundir it
52d0: 65 6d 2d 70 61 74 68 20 72 75 6e 5f 64 75 72 61  em-path run_dura
52e0: 74 69 6f 6e 20 66 69 6e 61 6c 5f 6c 6f 67 66 20  tion final_logf 
52f0: 63 6f 6d 6d 65 6e 74 20 29 29 29 0a 20 20 20 20  comment ))).    
5300: 20 64 62 20 0a 20 20 20 20 20 22 53 45 4c 45 43   db .     "SELEC
5310: 54 20 69 64 2c 72 75 6e 5f 69 64 2c 74 65 73 74  T id,run_id,test
5320: 6e 61 6d 65 2c 73 74 61 74 65 2c 73 74 61 74 75  name,state,statu
5330: 73 2c 65 76 65 6e 74 5f 74 69 6d 65 2c 68 6f 73  s,event_time,hos
5340: 74 2c 63 70 75 6c 6f 61 64 2c 64 69 73 6b 66 72  t,cpuload,diskfr
5350: 65 65 2c 75 6e 61 6d 65 2c 72 75 6e 64 69 72 2c  ee,uname,rundir,
5360: 69 74 65 6d 5f 70 61 74 68 2c 72 75 6e 5f 64 75  item_path,run_du
5370: 72 61 74 69 6f 6e 2c 66 69 6e 61 6c 5f 6c 6f 67  ration,final_log
5380: 66 2c 63 6f 6d 6d 65 6e 74 20 46 52 4f 4d 20 74  f,comment FROM t
5390: 65 73 74 73 20 57 48 45 52 45 20 72 75 6e 5f 69  ests WHERE run_i
53a0: 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65  d=? AND testname
53b0: 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68  =? AND item_path
53c0: 3d 3f 3b 22 0a 20 20 20 20 20 72 75 6e 2d 69 64  =?;".     run-id
53d0: 20 74 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70   testname item-p
53e0: 61 74 68 29 0a 20 20 20 20 72 65 73 29 29 0a 0a  ath).    res))..
53f0: 3b 3b 20 47 65 74 20 74 65 73 74 20 64 61 74 61  ;; Get test data
5400: 20 75 73 69 6e 67 20 74 65 73 74 5f 69 64 0a 28   using test_id.(
5410: 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 74  define (db:get-t
5420: 65 73 74 2d 64 61 74 61 2d 62 79 2d 69 64 20 64  est-data-by-id d
5430: 62 20 74 65 73 74 2d 69 64 29 0a 20 20 28 6c 65  b test-id).  (le
5440: 74 20 28 28 72 65 73 20 23 66 29 29 0a 20 20 20  t ((res #f)).   
5450: 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61   (sqlite3:for-ea
5460: 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d  ch-row.     (lam
5470: 62 64 61 20 28 69 64 20 72 75 6e 2d 69 64 20 74  bda (id run-id t
5480: 65 73 74 6e 61 6d 65 20 73 74 61 74 65 20 73 74  estname state st
5490: 61 74 75 73 20 65 76 65 6e 74 2d 74 69 6d 65 20  atus event-time 
54a0: 68 6f 73 74 20 63 70 75 6c 6f 61 64 20 64 69 73  host cpuload dis
54b0: 6b 66 72 65 65 20 75 6e 61 6d 65 20 72 75 6e 64  kfree uname rund
54c0: 69 72 20 69 74 65 6d 2d 70 61 74 68 20 72 75 6e  ir item-path run
54d0: 5f 64 75 72 61 74 69 6f 6e 20 66 69 6e 61 6c 5f  _duration final_
54e0: 6c 6f 67 66 20 63 6f 6d 6d 65 6e 74 29 0a 20 20  logf comment).  
54f0: 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28       (set! res (
5500: 76 65 63 74 6f 72 20 69 64 20 72 75 6e 2d 69 64  vector id run-id
5510: 20 74 65 73 74 6e 61 6d 65 20 73 74 61 74 65 20   testname state 
5520: 73 74 61 74 75 73 20 65 76 65 6e 74 2d 74 69 6d  status event-tim
5530: 65 20 68 6f 73 74 20 63 70 75 6c 6f 61 64 20 64  e host cpuload d
5540: 69 73 6b 66 72 65 65 20 75 6e 61 6d 65 20 72 75  iskfree uname ru
5550: 6e 64 69 72 20 69 74 65 6d 2d 70 61 74 68 20 72  ndir item-path r
5560: 75 6e 5f 64 75 72 61 74 69 6f 6e 20 66 69 6e 61  un_duration fina
5570: 6c 5f 6c 6f 67 66 20 63 6f 6d 6d 65 6e 74 29 29  l_logf comment))
5580: 29 0a 20 20 20 20 20 64 62 20 0a 20 20 20 20 20  ).     db .     
5590: 22 53 45 4c 45 43 54 20 69 64 2c 72 75 6e 5f 69  "SELECT id,run_i
55a0: 64 2c 74 65 73 74 6e 61 6d 65 2c 73 74 61 74 65  d,testname,state
55b0: 2c 73 74 61 74 75 73 2c 65 76 65 6e 74 5f 74 69  ,status,event_ti
55c0: 6d 65 2c 68 6f 73 74 2c 63 70 75 6c 6f 61 64 2c  me,host,cpuload,
55d0: 64 69 73 6b 66 72 65 65 2c 75 6e 61 6d 65 2c 72  diskfree,uname,r
55e0: 75 6e 64 69 72 2c 69 74 65 6d 5f 70 61 74 68 2c  undir,item_path,
55f0: 72 75 6e 5f 64 75 72 61 74 69 6f 6e 2c 66 69 6e  run_duration,fin
5600: 61 6c 5f 6c 6f 67 66 2c 63 6f 6d 6d 65 6e 74 20  al_logf,comment 
5610: 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45  FROM tests WHERE
5620: 20 69 64 3d 3f 3b 22 0a 20 20 20 20 20 74 65 73   id=?;".     tes
5630: 74 2d 69 64 29 0a 20 20 20 20 72 65 73 29 29 0a  t-id).    res)).
5640: 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65  ..(define (db:te
5650: 73 74 2d 73 65 74 2d 63 6f 6d 6d 65 6e 74 20 64  st-set-comment d
5660: 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61  b run-id test-na
5670: 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 63 6f 6d  me item-path com
5680: 6d 65 6e 74 29 0a 20 20 28 73 71 6c 69 74 65 33  ment).  (sqlite3
5690: 3a 65 78 65 63 75 74 65 20 0a 20 20 20 64 62 20  :execute .   db 
56a0: 0a 20 20 20 22 55 50 44 41 54 45 20 74 65 73 74  .   "UPDATE test
56b0: 73 20 53 45 54 20 63 6f 6d 6d 65 6e 74 3d 3f 20  s SET comment=? 
56c0: 57 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41  WHERE run_id=? A
56d0: 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e  ND testname=? AN
56e0: 44 20 69 74 65 6d 5f 70 61 74 68 3d 3f 3b 22 0a  D item_path=?;".
56f0: 20 20 20 63 6f 6d 6d 65 6e 74 20 72 75 6e 2d 69     comment run-i
5700: 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d  d test-name item
5710: 2d 70 61 74 68 29 29 0a 0a 3b 3b 0a 28 64 65 66  -path))..;;.(def
5720: 69 6e 65 20 28 64 62 3a 74 65 73 74 2d 73 65 74  ine (db:test-set
5730: 2d 72 75 6e 64 69 72 21 20 64 62 20 72 75 6e 2d  -rundir! db run-
5740: 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65  id test-name ite
5750: 6d 2d 70 61 74 68 20 72 75 6e 64 69 72 29 0a 20  m-path rundir). 
5760: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
5770: 65 20 0a 20 20 20 64 62 20 0a 20 20 20 22 55 50  e .   db .   "UP
5780: 44 41 54 45 20 74 65 73 74 73 20 53 45 54 20 72  DATE tests SET r
5790: 75 6e 64 69 72 3d 3f 20 57 48 45 52 45 20 72 75  undir=? WHERE ru
57a0: 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e  n_id=? AND testn
57b0: 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70  ame=? AND item_p
57c0: 61 74 68 3d 3f 3b 22 0a 20 20 20 72 75 6e 64 69  ath=?;".   rundi
57d0: 72 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61  r run-id test-na
57e0: 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 29 0a 0a  me item-path))..
57f0: 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74  (define (db:test
5800: 2d 73 65 74 2d 6c 6f 67 21 20 64 62 20 72 75 6e  -set-log! db run
5810: 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74  -id test-name it
5820: 65 6d 2d 70 61 74 68 20 6c 6f 67 66 29 0a 20 20  em-path logf).  
5830: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
5840: 20 64 62 20 22 55 50 44 41 54 45 20 74 65 73 74   db "UPDATE test
5850: 73 20 53 45 54 20 66 69 6e 61 6c 5f 6c 6f 67 66  s SET final_logf
5860: 3d 3f 20 57 48 45 52 45 20 72 75 6e 5f 69 64 3d  =? WHERE run_id=
5870: 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f  ? AND testname=?
5880: 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 3d 3f   AND item_path=?
5890: 3b 22 20 0a 09 09 20 20 20 6c 6f 67 66 20 72 75  ;" ...   logf ru
58a0: 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69  n-id test-name i
58b0: 74 65 6d 2d 70 61 74 68 29 29 0a 0a 3b 3b 3d 3d  tem-path))..;;==
58c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
58d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
58e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
58f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5900: 3d 3d 3d 3d 0a 3b 3b 20 4d 69 73 63 2e 20 74 65  ====.;; Misc. te
5910: 73 74 20 72 65 6c 61 74 65 64 20 71 75 65 72 69  st related queri
5920: 65 73 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  es.;;===========
5930: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5940: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5950: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5960: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65  ===========..(de
5970: 66 69 6e 65 20 28 64 62 3a 74 65 73 74 2d 67 65  fine (db:test-ge
5980: 74 2d 70 61 74 68 73 2d 6d 61 74 63 68 69 6e 67  t-paths-matching
5990: 20 64 62 20 6b 65 79 6e 61 6d 65 73 20 74 61 72   db keynames tar
59a0: 67 65 74 29 0a 20 20 28 6c 65 74 2a 20 28 28 72  get).  (let* ((r
59b0: 65 73 20 27 28 29 29 0a 09 20 28 69 74 65 6d 70  es '()).. (itemp
59c0: 61 74 74 20 20 20 28 69 66 20 28 61 72 67 73 3a  att   (if (args:
59d0: 67 65 74 2d 61 72 67 20 22 2d 69 74 65 6d 70 61  get-arg "-itempa
59e0: 74 74 22 29 28 61 72 67 73 3a 67 65 74 2d 61 72  tt")(args:get-ar
59f0: 67 20 22 2d 69 74 65 6d 70 61 74 74 22 29 20 22  g "-itempatt") "
5a00: 25 22 29 29 0a 09 20 28 74 65 73 74 70 61 74 74  %")).. (testpatt
5a10: 20 20 20 28 69 66 20 28 61 72 67 73 3a 67 65 74     (if (args:get
5a20: 2d 61 72 67 20 22 2d 74 65 73 74 70 61 74 74 22  -arg "-testpatt"
5a30: 29 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22  )(args:get-arg "
5a40: 2d 74 65 73 74 70 61 74 74 22 29 20 22 25 22 29  -testpatt") "%")
5a50: 29 0a 09 20 28 73 74 61 74 65 70 61 74 74 20 20  ).. (statepatt  
5a60: 28 69 66 20 28 61 72 67 73 3a 67 65 74 2d 61 72  (if (args:get-ar
5a70: 67 20 22 3a 73 74 61 74 65 22 29 20 20 20 28 61  g ":state")   (a
5a80: 72 67 73 3a 67 65 74 2d 61 72 67 20 22 3a 73 74  rgs:get-arg ":st
5a90: 61 74 65 22 29 20 20 20 20 22 25 22 29 29 0a 09  ate")    "%"))..
5aa0: 20 28 73 74 61 74 75 73 70 61 74 74 20 28 69 66   (statuspatt (if
5ab0: 20 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22   (args:get-arg "
5ac0: 3a 73 74 61 74 75 73 22 29 20 20 28 61 72 67 73  :status")  (args
5ad0: 3a 67 65 74 2d 61 72 67 20 22 3a 73 74 61 74 75  :get-arg ":statu
5ae0: 73 22 29 20 20 20 22 25 22 29 29 0a 09 20 28 72  s")   "%")).. (r
5af0: 75 6e 6e 61 6d 65 20 20 20 20 28 69 66 20 28 61  unname    (if (a
5b00: 72 67 73 3a 67 65 74 2d 61 72 67 20 22 3a 72 75  rgs:get-arg ":ru
5b10: 6e 6e 61 6d 65 22 29 20 28 61 72 67 73 3a 67 65  nname") (args:ge
5b20: 74 2d 61 72 67 20 22 3a 72 75 6e 6e 61 6d 65 22  t-arg ":runname"
5b30: 29 20 20 22 25 22 29 29 0a 09 20 28 6b 65 79 73  )  "%")).. (keys
5b40: 74 72 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72  tr (string-inter
5b50: 73 70 65 72 73 65 20 0a 09 09 20 20 28 6d 61 70  sperse ...  (map
5b60: 20 28 6c 61 6d 62 64 61 20 28 6b 65 79 20 76 61   (lambda (key va
5b70: 6c 29 0a 09 09 09 20 28 63 6f 6e 63 20 22 72 2e  l).... (conc "r.
5b80: 22 20 6b 65 79 20 22 20 6c 69 6b 65 20 27 22 20  " key " like '" 
5b90: 76 61 6c 20 22 27 22 29 29 0a 09 09 20 20 20 20  val "'"))...    
5ba0: 20 20 20 6b 65 79 6e 61 6d 65 73 20 0a 09 09 20     keynames ... 
5bb0: 20 20 20 20 20 20 28 73 74 72 69 6e 67 2d 73 70        (string-sp
5bc0: 6c 69 74 20 74 61 72 67 65 74 20 22 2f 22 29 29  lit target "/"))
5bd0: 0a 09 09 20 20 22 20 41 4e 44 20 22 29 29 0a 09  ...  " AND "))..
5be0: 20 28 71 72 79 73 74 72 20 28 63 6f 6e 63 20 22   (qrystr (conc "
5bf0: 53 45 4c 45 43 54 20 74 2e 72 75 6e 64 69 72 20  SELECT t.rundir 
5c00: 46 52 4f 4d 20 74 65 73 74 73 20 41 53 20 74 20  FROM tests AS t 
5c10: 49 4e 4e 45 52 20 4a 4f 49 4e 20 72 75 6e 73 20  INNER JOIN runs 
5c20: 41 53 20 72 20 4f 4e 20 74 2e 72 75 6e 5f 69 64  AS r ON t.run_id
5c30: 3d 72 2e 69 64 20 57 48 45 52 45 20 22 0a 09 09  =r.id WHERE "...
5c40: 20 20 20 20 20 20 20 6b 65 79 73 74 72 20 22 20         keystr " 
5c50: 41 4e 44 20 72 2e 72 75 6e 6e 61 6d 65 20 4c 49  AND r.runname LI
5c60: 4b 45 20 27 22 20 72 75 6e 6e 61 6d 65 20 22 27  KE '" runname "'
5c70: 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 20 4c   AND item_path L
5c80: 49 4b 45 20 27 22 20 69 74 65 6d 70 61 74 74 20  IKE '" itempatt 
5c90: 22 27 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 20  "' AND testname 
5ca0: 4c 49 4b 45 20 27 22 0a 09 09 20 20 20 20 20 20  LIKE '"...      
5cb0: 20 74 65 73 74 70 61 74 74 20 22 27 20 41 4e 44   testpatt "' AND
5cc0: 20 74 2e 73 74 61 74 65 20 4c 49 4b 45 20 27 22   t.state LIKE '"
5cd0: 20 73 74 61 74 65 70 61 74 74 20 22 27 20 41 4e   statepatt "' AN
5ce0: 44 20 74 2e 73 74 61 74 75 73 20 4c 49 4b 45 20  D t.status LIKE 
5cf0: 27 22 20 73 74 61 74 75 73 70 61 74 74 20 0a 09  '" statuspatt ..
5d00: 09 20 20 20 20 20 20 20 22 27 4f 52 44 45 52 20  .       "'ORDER 
5d10: 42 59 20 74 2e 65 76 65 6e 74 5f 74 69 6d 65 20  BY t.event_time 
5d20: 41 53 43 3b 22 29 29 29 0a 20 20 20 20 28 64 65  ASC;"))).    (de
5d30: 62 75 67 3a 70 72 69 6e 74 20 33 20 22 71 72 79  bug:print 3 "qry
5d40: 73 74 72 3a 20 22 20 71 72 79 73 74 72 29 0a 20  str: " qrystr). 
5d50: 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d     (sqlite3:for-
5d60: 65 61 63 68 2d 72 6f 77 20 0a 20 20 20 20 20 28  each-row .     (
5d70: 6c 61 6d 62 64 61 20 28 70 29 0a 20 20 20 20 20  lambda (p).     
5d80: 20 20 28 73 65 74 21 20 72 65 73 20 28 63 6f 6e    (set! res (con
5d90: 73 20 70 20 72 65 73 29 29 29 0a 20 20 20 20 20  s p res))).     
5da0: 64 62 20 0a 20 20 20 20 20 71 72 79 73 74 72 29  db .     qrystr)
5db0: 0a 20 20 20 20 72 65 73 29 29 0a 0a 28 64 65 66  .    res))..(def
5dc0: 69 6e 65 20 28 64 62 3a 74 65 73 74 2d 67 65 74  ine (db:test-get
5dd0: 2d 74 65 73 74 2d 72 65 63 6f 72 64 73 2d 6d 61  -test-records-ma
5de0: 74 63 68 69 6e 67 20 64 62 20 6b 65 79 6e 61 6d  tching db keynam
5df0: 65 73 20 74 61 72 67 65 74 29 0a 20 20 28 6c 65  es target).  (le
5e00: 74 2a 20 28 28 72 65 73 20 27 28 29 29 0a 09 20  t* ((res '()).. 
5e10: 28 69 74 65 6d 70 61 74 74 20 20 20 28 69 66 20  (itempatt   (if 
5e20: 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22 2d  (args:get-arg "-
5e30: 69 74 65 6d 70 61 74 74 22 29 28 61 72 67 73 3a  itempatt")(args:
5e40: 67 65 74 2d 61 72 67 20 22 2d 69 74 65 6d 70 61  get-arg "-itempa
5e50: 74 74 22 29 20 22 25 22 29 29 0a 09 20 28 74 65  tt") "%")).. (te
5e60: 73 74 70 61 74 74 20 20 20 28 69 66 20 28 61 72  stpatt   (if (ar
5e70: 67 73 3a 67 65 74 2d 61 72 67 20 22 2d 74 65 73  gs:get-arg "-tes
5e80: 74 70 61 74 74 22 29 28 61 72 67 73 3a 67 65 74  tpatt")(args:get
5e90: 2d 61 72 67 20 22 2d 74 65 73 74 70 61 74 74 22  -arg "-testpatt"
5ea0: 29 20 22 25 22 29 29 0a 09 20 28 73 74 61 74 65  ) "%")).. (state
5eb0: 70 61 74 74 20 20 28 69 66 20 28 61 72 67 73 3a  patt  (if (args:
5ec0: 67 65 74 2d 61 72 67 20 22 3a 73 74 61 74 65 22  get-arg ":state"
5ed0: 29 20 20 20 28 61 72 67 73 3a 67 65 74 2d 61 72  )   (args:get-ar
5ee0: 67 20 22 3a 73 74 61 74 65 22 29 20 20 20 20 22  g ":state")    "
5ef0: 25 22 29 29 0a 09 20 28 73 74 61 74 75 73 70 61  %")).. (statuspa
5f00: 74 74 20 28 69 66 20 28 61 72 67 73 3a 67 65 74  tt (if (args:get
5f10: 2d 61 72 67 20 22 3a 73 74 61 74 75 73 22 29 20  -arg ":status") 
5f20: 20 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22   (args:get-arg "
5f30: 3a 73 74 61 74 75 73 22 29 20 20 20 22 25 22 29  :status")   "%")
5f40: 29 0a 09 20 28 72 75 6e 6e 61 6d 65 20 20 20 20  ).. (runname    
5f50: 28 69 66 20 28 61 72 67 73 3a 67 65 74 2d 61 72  (if (args:get-ar
5f60: 67 20 22 3a 72 75 6e 6e 61 6d 65 22 29 20 28 61  g ":runname") (a
5f70: 72 67 73 3a 67 65 74 2d 61 72 67 20 22 3a 72 75  rgs:get-arg ":ru
5f80: 6e 6e 61 6d 65 22 29 20 20 22 25 22 29 29 0a 09  nname")  "%"))..
5f90: 20 28 6b 65 79 73 74 72 20 28 73 74 72 69 6e 67   (keystr (string
5fa0: 2d 69 6e 74 65 72 73 70 65 72 73 65 20 0a 09 09  -intersperse ...
5fb0: 20 20 28 6d 61 70 20 28 6c 61 6d 62 64 61 20 28    (map (lambda (
5fc0: 6b 65 79 20 76 61 6c 29 0a 09 09 09 20 28 63 6f  key val).... (co
5fd0: 6e 63 20 22 72 2e 22 20 6b 65 79 20 22 20 6c 69  nc "r." key " li
5fe0: 6b 65 20 27 22 20 76 61 6c 20 22 27 22 29 29 0a  ke '" val "'")).
5ff0: 09 09 20 20 20 20 20 20 20 6b 65 79 6e 61 6d 65  ..       keyname
6000: 73 20 0a 09 09 20 20 20 20 20 20 20 28 73 74 72  s ...       (str
6010: 69 6e 67 2d 73 70 6c 69 74 20 74 61 72 67 65 74  ing-split target
6020: 20 22 2f 22 29 29 0a 09 09 20 20 22 20 41 4e 44   "/"))...  " AND
6030: 20 22 29 29 0a 09 20 28 71 72 79 73 74 72 20 28   ")).. (qrystr (
6040: 63 6f 6e 63 20 22 53 45 4c 45 43 54 20 0a 20 20  conc "SELECT .  
6050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6060: 20 20 20 20 20 20 20 20 20 20 74 2e 69 64 0a 20            t.id. 
6070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6080: 20 20 20 20 20 20 20 20 20 20 20 74 2e 72 75 6e             t.run
6090: 5f 69 64 20 20 20 20 20 0a 20 20 20 20 20 20 20  _id     .       
60a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60b0: 20 20 20 20 20 74 2e 74 65 73 74 6e 61 6d 65 20       t.testname 
60c0: 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20    .             
60d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
60e0: 2e 68 6f 73 74 20 20 20 20 20 20 20 0a 20 20 20  .host       .   
60f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6100: 20 20 20 20 20 20 20 20 20 74 2e 63 70 75 6c 6f           t.cpulo
6110: 61 64 20 20 20 20 0a 20 20 20 20 20 20 20 20 20  ad    .         
6120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6130: 20 20 20 74 2e 64 69 73 6b 66 72 65 65 20 20 20     t.diskfree   
6140: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6150: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 2e 75               t.u
6160: 6e 61 6d 65 20 20 20 20 20 20 0a 20 20 20 20 20  name      .     
6170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6180: 20 20 20 20 20 20 20 74 2e 72 75 6e 64 69 72 20         t.rundir 
6190: 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20      .           
61a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61b0: 20 74 2e 73 68 6f 72 74 64 69 72 20 20 20 0a 20   t.shortdir   . 
61c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61d0: 20 20 20 20 20 20 20 20 20 20 20 74 2e 69 74 65             t.ite
61e0: 6d 5f 70 61 74 68 20 20 0a 20 20 20 20 20 20 20  m_path  .       
61f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6200: 20 20 20 20 20 74 2e 73 74 61 74 65 20 20 20 20       t.state    
6210: 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20    .             
6220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
6230: 2e 73 74 61 74 75 73 20 20 20 20 20 0a 20 20 20  .status     .   
6240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6250: 20 20 20 20 20 20 20 20 20 74 2e 61 74 74 65 6d           t.attem
6260: 70 74 6e 75 6d 20 0a 20 20 20 20 20 20 20 20 20  ptnum .         
6270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6280: 20 20 20 74 2e 66 69 6e 61 6c 5f 6c 6f 67 66 20     t.final_logf 
6290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
62a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 2e 6c               t.l
62b0: 6f 67 64 61 74 20 20 20 20 20 0a 20 20 20 20 20  ogdat     .     
62c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
62d0: 20 20 20 20 20 20 20 74 2e 72 75 6e 5f 64 75 72         t.run_dur
62e0: 61 74 69 6f 0a 20 20 20 20 20 20 20 20 20 20 20  atio.           
62f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6300: 20 74 2e 63 6f 6d 6d 65 6e 74 20 20 20 20 0a 20   t.comment    . 
6310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6320: 20 20 20 20 20 20 20 20 20 20 20 74 2e 65 76 65             t.eve
6330: 6e 74 5f 74 69 6d 65 20 0a 20 20 20 20 20 20 20  nt_time .       
6340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6350: 20 20 20 20 20 74 2e 66 61 69 6c 5f 63 6f 75 6e       t.fail_coun
6360: 74 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t .             
6370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
6380: 2e 70 61 73 73 5f 63 6f 75 6e 74 20 0a 20 20 20  .pass_count .   
6390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63a0: 20 20 20 20 20 20 20 20 20 74 2e 61 72 63 68 69           t.archi
63b0: 76 65 64 20 20 20 0a 0a 0a 0a 20 46 52 4f 4d 20  ved   .... FROM 
63c0: 74 65 73 74 73 20 41 53 20 74 20 49 4e 4e 45 52  tests AS t INNER
63d0: 20 4a 4f 49 4e 20 72 75 6e 73 20 41 53 20 72 20   JOIN runs AS r 
63e0: 4f 4e 20 74 2e 72 75 6e 5f 69 64 3d 72 2e 69 64  ON t.run_id=r.id
63f0: 20 57 48 45 52 45 20 22 0a 09 09 20 20 20 20 20   WHERE "...     
6400: 20 20 6b 65 79 73 74 72 20 22 20 41 4e 44 20 72    keystr " AND r
6410: 2e 72 75 6e 6e 61 6d 65 20 4c 49 4b 45 20 27 22  .runname LIKE '"
6420: 20 72 75 6e 6e 61 6d 65 20 22 27 20 41 4e 44 20   runname "' AND 
6430: 69 74 65 6d 5f 70 61 74 68 20 4c 49 4b 45 20 27  item_path LIKE '
6440: 22 20 69 74 65 6d 70 61 74 74 20 22 27 20 41 4e  " itempatt "' AN
6450: 44 20 74 65 73 74 6e 61 6d 65 20 4c 49 4b 45 20  D testname LIKE 
6460: 27 22 0a 09 09 20 20 20 20 20 20 20 74 65 73 74  '"...       test
6470: 70 61 74 74 20 22 27 20 41 4e 44 20 74 2e 73 74  patt "' AND t.st
6480: 61 74 65 20 4c 49 4b 45 20 27 22 20 73 74 61 74  ate LIKE '" stat
6490: 65 70 61 74 74 20 22 27 20 41 4e 44 20 74 2e 73  epatt "' AND t.s
64a0: 74 61 74 75 73 20 4c 49 4b 45 20 27 22 20 73 74  tatus LIKE '" st
64b0: 61 74 75 73 70 61 74 74 20 0a 09 09 20 20 20 20  atuspatt ...    
64c0: 20 20 20 22 27 4f 52 44 45 52 20 42 59 20 74 2e     "'ORDER BY t.
64d0: 65 76 65 6e 74 5f 74 69 6d 65 20 41 53 43 3b 22  event_time ASC;"
64e0: 29 29 29 0a 20 20 20 20 28 64 65 62 75 67 3a 70  ))).    (debug:p
64f0: 72 69 6e 74 20 33 20 22 71 72 79 73 74 72 3a 20  rint 3 "qrystr: 
6500: 22 20 71 72 79 73 74 72 29 0a 20 20 20 20 28 73  " qrystr).    (s
6510: 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d  qlite3:for-each-
6520: 72 6f 77 20 0a 20 20 20 20 20 28 6c 61 6d 62 64  row .     (lambd
6530: 61 20 28 70 29 0a 20 20 20 20 20 20 20 28 73 65  a (p).       (se
6540: 74 21 20 72 65 73 20 28 63 6f 6e 73 20 70 20 72  t! res (cons p r
6550: 65 73 29 29 29 0a 20 20 20 20 20 64 62 20 0a 20  es))).     db . 
6560: 20 20 20 20 71 72 79 73 74 72 29 0a 20 20 20 20      qrystr).    
6570: 72 65 73 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  res))..(define (
6580: 64 62 3a 74 65 73 74 2d 75 70 64 61 74 65 2d 6d  db:test-update-m
6590: 65 74 61 2d 69 6e 66 6f 20 64 62 20 72 75 6e 2d  eta-info db run-
65a0: 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65  id test-name ite
65b0: 6d 2d 70 61 74 68 20 6d 69 6e 75 74 65 73 20 63  m-path minutes c
65c0: 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20  puload diskfree 
65d0: 74 6d 70 66 72 65 65 29 0a 20 20 28 69 66 20 28  tmpfree).  (if (
65e0: 6e 6f 74 20 69 74 65 6d 2d 70 61 74 68 29 0a 20  not item-path). 
65f0: 20 20 20 20 20 28 62 65 67 69 6e 20 28 64 65 62       (begin (deb
6600: 75 67 3a 70 72 69 6e 74 20 30 20 22 57 41 52 4e  ug:print 0 "WARN
6610: 49 4e 47 3a 20 49 54 45 4d 50 41 54 48 20 6e 6f  ING: ITEMPATH no
6620: 74 20 73 65 74 2e 22 29 20 20 20 0a 09 20 20 20  t set.")   ..   
6630: 20 20 28 73 65 74 21 20 69 74 65 6d 2d 70 61 74    (set! item-pat
6640: 68 20 22 22 29 29 29 0a 20 20 28 73 71 6c 69 74  h ""))).  (sqlit
6650: 65 33 3a 65 78 65 63 75 74 65 0a 20 20 20 64 62  e3:execute.   db
6660: 0a 20 20 20 22 55 50 44 41 54 45 20 74 65 73 74  .   "UPDATE test
6670: 73 20 53 45 54 20 63 70 75 6c 6f 61 64 3d 3f 2c  s SET cpuload=?,
6680: 64 69 73 6b 66 72 65 65 3d 3f 2c 72 75 6e 5f 64  diskfree=?,run_d
6690: 75 72 61 74 69 6f 6e 3d 3f 2c 73 74 61 74 65 3d  uration=?,state=
66a0: 27 52 55 4e 4e 49 4e 47 27 20 57 48 45 52 45 20  'RUNNING' WHERE 
66b0: 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73  run_id=? AND tes
66c0: 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d  tname=? AND item
66d0: 5f 70 61 74 68 3d 3f 20 41 4e 44 20 73 74 61 74  _path=? AND stat
66e0: 65 20 4e 4f 54 20 49 4e 20 28 27 43 4f 4d 50 4c  e NOT IN ('COMPL
66f0: 45 54 45 44 27 2c 27 4b 49 4c 4c 52 45 51 27 2c  ETED','KILLREQ',
6700: 27 4b 49 4c 4c 45 44 27 29 3b 22 0a 20 20 20 63  'KILLED');".   c
6710: 70 75 6c 6f 61 64 0a 20 20 20 64 69 73 6b 66 72  puload.   diskfr
6720: 65 65 0a 20 20 20 6d 69 6e 75 74 65 73 0a 20 20  ee.   minutes.  
6730: 20 72 75 6e 2d 69 64 0a 20 20 20 74 65 73 74 2d   run-id.   test-
6740: 6e 61 6d 65 0a 20 20 20 69 74 65 6d 2d 70 61 74  name.   item-pat
6750: 68 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62  h))..(define (db
6760: 3a 72 6f 6c 6c 2d 75 70 2d 70 61 73 73 2d 66 61  :roll-up-pass-fa
6770: 69 6c 2d 63 6f 75 6e 74 73 20 64 62 20 72 75 6e  il-counts db run
6780: 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74  -id test-name it
6790: 65 6d 2d 70 61 74 68 20 73 74 61 74 75 73 29 0a  em-path status).
67a0: 20 20 28 69 66 20 28 61 6e 64 20 28 6e 6f 74 20    (if (and (not 
67b0: 28 65 71 75 61 6c 3f 20 69 74 65 6d 2d 70 61 74  (equal? item-pat
67c0: 68 20 22 22 29 29 0a 09 20 20 20 28 6f 72 20 28  h ""))..   (or (
67d0: 65 71 75 61 6c 3f 20 73 74 61 74 75 73 20 22 50  equal? status "P
67e0: 41 53 53 22 29 0a 09 20 20 20 20 20 20 20 28 65  ASS")..       (e
67f0: 71 75 61 6c 3f 20 73 74 61 74 75 73 20 22 57 41  qual? status "WA
6800: 52 4e 22 29 0a 09 20 20 20 20 20 20 20 28 65 71  RN")..       (eq
6810: 75 61 6c 3f 20 73 74 61 74 75 73 20 22 46 41 49  ual? status "FAI
6820: 4c 22 29 0a 09 20 20 20 20 20 20 20 28 65 71 75  L")..       (equ
6830: 61 6c 3f 20 73 74 61 74 75 73 20 22 57 41 49 56  al? status "WAIV
6840: 45 44 22 29 0a 09 20 20 20 20 20 20 20 28 65 71  ED")..       (eq
6850: 75 61 6c 3f 20 73 74 61 74 75 73 20 22 52 55 4e  ual? status "RUN
6860: 4e 49 4e 47 22 29 29 29 0a 20 20 20 20 20 20 28  NING"))).      (
6870: 62 65 67 69 6e 0a 09 28 73 71 6c 69 74 65 33 3a  begin..(sqlite3:
6880: 65 78 65 63 75 74 65 20 0a 09 20 64 62 0a 09 20  execute .. db.. 
6890: 22 55 50 44 41 54 45 20 74 65 73 74 73 20 0a 20  "UPDATE tests . 
68a0: 20 20 20 20 20 20 20 20 20 20 20 20 53 45 54 20              SET 
68b0: 66 61 69 6c 5f 63 6f 75 6e 74 3d 28 53 45 4c 45  fail_count=(SELE
68c0: 43 54 20 63 6f 75 6e 74 28 69 64 29 20 46 52 4f  CT count(id) FRO
68d0: 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 72 75  M tests WHERE ru
68e0: 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e  n_id=? AND testn
68f0: 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70  ame=? AND item_p
6900: 61 74 68 20 21 3d 20 27 27 20 41 4e 44 20 73 74  ath != '' AND st
6910: 61 74 75 73 3d 27 46 41 49 4c 27 29 2c 0a 20 20  atus='FAIL'),.  
6920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
6930: 61 73 73 5f 63 6f 75 6e 74 3d 28 53 45 4c 45 43  ass_count=(SELEC
6940: 54 20 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d  T count(id) FROM
6950: 20 74 65 73 74 73 20 57 48 45 52 45 20 72 75 6e   tests WHERE run
6960: 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61  _id=? AND testna
6970: 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61  me=? AND item_pa
6980: 74 68 20 21 3d 20 27 27 20 41 4e 44 20 28 73 74  th != '' AND (st
6990: 61 74 75 73 3d 27 50 41 53 53 27 20 4f 52 20 73  atus='PASS' OR s
69a0: 74 61 74 75 73 3d 27 57 41 52 4e 27 20 4f 52 20  tatus='WARN' OR 
69b0: 73 74 61 74 75 73 3d 27 57 41 49 56 45 44 27 29  status='WAIVED')
69c0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 57  ).             W
69d0: 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e  HERE run_id=? AN
69e0: 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44  D testname=? AND
69f0: 20 69 74 65 6d 5f 70 61 74 68 3d 27 27 3b 22 0a   item_path='';".
6a00: 09 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61  . run-id test-na
6a10: 6d 65 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e  me run-id test-n
6a20: 61 6d 65 20 72 75 6e 2d 69 64 20 74 65 73 74 2d  ame run-id test-
6a30: 6e 61 6d 65 29 0a 09 28 69 66 20 28 65 71 75 61  name)..(if (equa
6a40: 6c 3f 20 73 74 61 74 75 73 20 22 52 55 4e 4e 49  l? status "RUNNI
6a50: 4e 47 22 29 20 3b 3b 20 72 75 6e 6e 69 6e 67 20  NG") ;; running 
6a60: 74 61 6b 65 73 20 70 72 69 6f 72 69 74 79 20 6f  takes priority o
6a70: 76 65 72 20 61 6c 6c 20 6f 74 68 65 72 20 73 74  ver all other st
6a80: 61 74 65 73 2c 20 66 6f 72 63 65 20 74 68 65 20  ates, force the 
6a90: 74 65 73 74 20 73 74 61 74 65 20 74 6f 20 52 55  test state to RU
6aa0: 4e 4e 49 4e 47 0a 09 20 20 20 20 28 73 71 6c 69  NNING..    (sqli
6ab0: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22  te3:execute db "
6ac0: 55 50 44 41 54 45 20 74 65 73 74 73 20 53 45 54  UPDATE tests SET
6ad0: 20 73 74 61 74 65 3d 3f 20 57 48 45 52 45 20 72   state=? WHERE r
6ae0: 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74  un_id=? AND test
6af0: 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f  name=? AND item_
6b00: 70 61 74 68 3d 27 27 3b 22 20 22 52 55 4e 4e 49  path='';" "RUNNI
6b10: 4e 47 22 20 72 75 6e 2d 69 64 20 74 65 73 74 2d  NG" run-id test-
6b20: 6e 61 6d 65 29 0a 09 20 20 20 20 28 73 71 6c 69  name)..    (sqli
6b30: 74 65 33 3a 65 78 65 63 75 74 65 0a 09 20 20 20  te3:execute..   
6b40: 20 20 64 62 0a 09 20 20 20 20 20 22 55 50 44 41    db..     "UPDA
6b50: 54 45 20 74 65 73 74 73 0a 20 20 20 20 20 20 20  TE tests.       
6b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b70: 53 45 54 20 73 74 61 74 65 3d 43 41 53 45 20 57  SET state=CASE W
6b80: 48 45 4e 20 28 53 45 4c 45 43 54 20 63 6f 75 6e  HEN (SELECT coun
6b90: 74 28 69 64 29 20 46 52 4f 4d 20 74 65 73 74 73  t(id) FROM tests
6ba0: 20 57 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20   WHERE run_id=? 
6bb0: 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41  AND testname=? A
6bc0: 4e 44 20 69 74 65 6d 5f 70 61 74 68 20 21 3d 20  ND item_path != 
6bd0: 27 27 20 41 4e 44 20 73 74 61 74 65 20 69 6e 20  '' AND state in 
6be0: 28 27 52 55 4e 4e 49 4e 47 27 2c 27 4e 4f 54 5f  ('RUNNING','NOT_
6bf0: 53 54 41 52 54 45 44 27 29 29 20 3e 20 30 20 54  STARTED')) > 0 T
6c00: 48 45 4e 20 0a 20 20 20 20 20 20 20 20 20 20 20  HEN .           
6c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 27                 '
6c20: 52 55 4e 4e 49 4e 47 27 0a 20 20 20 20 20 20 20  RUNNING'.       
6c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c40: 45 4c 53 45 20 27 43 4f 4d 50 4c 45 54 45 44 27  ELSE 'COMPLETED'
6c50: 20 45 4e 44 2c 0a 20 20 20 20 20 20 20 20 20 20   END,.          
6c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c70: 73 74 61 74 75 73 3d 43 41 53 45 20 57 48 45 4e  status=CASE WHEN
6c80: 20 66 61 69 6c 5f 63 6f 75 6e 74 20 3e 20 30 20   fail_count > 0 
6c90: 54 48 45 4e 20 27 46 41 49 4c 27 20 57 48 45 4e  THEN 'FAIL' WHEN
6ca0: 20 70 61 73 73 5f 63 6f 75 6e 74 20 3e 20 30 20   pass_count > 0 
6cb0: 41 4e 44 20 66 61 69 6c 5f 63 6f 75 6e 74 3d 30  AND fail_count=0
6cc0: 20 54 48 45 4e 20 27 50 41 53 53 27 20 45 4c 53   THEN 'PASS' ELS
6cd0: 45 20 27 55 4e 4b 4e 4f 57 4e 27 20 45 4e 44 0a  E 'UNKNOWN' END.
6ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6cf0: 20 20 20 20 20 20 20 57 48 45 52 45 20 72 75 6e         WHERE run
6d00: 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61  _id=? AND testna
6d10: 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61  me=? AND item_pa
6d20: 74 68 3d 27 27 3b 22 0a 09 20 20 20 20 20 72 75  th='';"..     ru
6d30: 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 72  n-id test-name r
6d40: 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 29  un-id test-name)
6d50: 29 29 29 29 0a 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d  ))))...;;=======
6d60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6d70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6d80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6d90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a  ===============.
6da0: 3b 3b 20 54 65 73 74 73 20 6d 65 74 61 20 64 61  ;; Tests meta da
6db0: 74 61 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ta.;;===========
6dc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6dd0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6de0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6df0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20  ===========..;; 
6e00: 72 65 61 64 20 74 68 65 20 72 65 63 6f 72 64 20  read the record 
6e10: 67 69 76 65 6e 20 61 20 74 65 73 74 6e 61 6d 65  given a testname
6e20: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73  .(define (db:tes
6e30: 74 6d 65 74 61 2d 67 65 74 2d 72 65 63 6f 72 64  tmeta-get-record
6e40: 20 64 62 20 74 65 73 74 6e 61 6d 65 29 0a 20 20   db testname).  
6e50: 28 6c 65 74 20 28 28 72 65 73 20 23 66 29 29 0a  (let ((res #f)).
6e60: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72      (sqlite3:for
6e70: 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28  -each-row.     (
6e80: 6c 61 6d 62 64 61 20 28 69 64 20 74 65 73 74 6e  lambda (id testn
6e90: 61 6d 65 20 61 75 74 68 6f 72 20 6f 77 6e 65 72  ame author owner
6ea0: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 72 65 76   description rev
6eb0: 69 65 77 65 64 20 69 74 65 72 61 74 65 64 20 61  iewed iterated a
6ec0: 76 67 5f 72 75 6e 74 69 6d 65 20 61 76 67 5f 64  vg_runtime avg_d
6ed0: 69 73 6b 20 74 61 67 73 29 0a 20 20 20 20 20 20  isk tags).      
6ee0: 20 28 73 65 74 21 20 72 65 73 20 28 76 65 63 74   (set! res (vect
6ef0: 6f 72 20 69 64 20 74 65 73 74 6e 61 6d 65 20 61  or id testname a
6f00: 75 74 68 6f 72 20 6f 77 6e 65 72 20 64 65 73 63  uthor owner desc
6f10: 72 69 70 74 69 6f 6e 20 72 65 76 69 65 77 65 64  ription reviewed
6f20: 20 69 74 65 72 61 74 65 64 20 61 76 67 5f 72 75   iterated avg_ru
6f30: 6e 74 69 6d 65 20 61 76 67 5f 64 69 73 6b 20 74  ntime avg_disk t
6f40: 61 67 73 29 29 29 0a 20 20 20 20 20 64 62 20 22  ags))).     db "
6f50: 53 45 4c 45 43 54 20 69 64 2c 74 65 73 74 6e 61  SELECT id,testna
6f60: 6d 65 2c 61 75 74 68 6f 72 2c 6f 77 6e 65 72 2c  me,author,owner,
6f70: 64 65 73 63 72 69 70 74 69 6f 6e 2c 72 65 76 69  description,revi
6f80: 65 77 65 64 2c 69 74 65 72 61 74 65 64 2c 61 76  ewed,iterated,av
6f90: 67 5f 72 75 6e 74 69 6d 65 2c 61 76 67 5f 64 69  g_runtime,avg_di
6fa0: 73 6b 2c 74 61 67 73 20 46 52 4f 4d 20 74 65 73  sk,tags FROM tes
6fb0: 74 5f 6d 65 74 61 20 57 48 45 52 45 20 74 65 73  t_meta WHERE tes
6fc0: 74 6e 61 6d 65 3d 3f 3b 22 0a 20 20 20 20 20 74  tname=?;".     t
6fd0: 65 73 74 6e 61 6d 65 29 0a 20 20 20 20 72 65 73  estname).    res
6fe0: 29 29 0a 0a 3b 3b 20 63 72 65 61 74 65 20 61 20  ))..;; create a 
6ff0: 6e 65 77 20 72 65 63 6f 72 64 20 66 6f 72 20 61  new record for a
7000: 20 67 69 76 65 6e 20 74 65 73 74 6e 61 6d 65 0a   given testname.
7010: 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74  (define (db:test
7020: 6d 65 74 61 2d 61 64 64 2d 72 65 63 6f 72 64 20  meta-add-record 
7030: 64 62 20 74 65 73 74 6e 61 6d 65 29 0a 20 20 28  db testname).  (
7040: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
7050: 64 62 20 22 49 4e 53 45 52 54 20 4f 52 20 49 47  db "INSERT OR IG
7060: 4e 4f 52 45 20 49 4e 54 4f 20 74 65 73 74 5f 6d  NORE INTO test_m
7070: 65 74 61 20 28 74 65 73 74 6e 61 6d 65 2c 61 75  eta (testname,au
7080: 74 68 6f 72 2c 6f 77 6e 65 72 2c 64 65 73 63 72  thor,owner,descr
7090: 69 70 74 69 6f 6e 2c 72 65 76 69 65 77 65 64 2c  iption,reviewed,
70a0: 69 74 65 72 61 74 65 64 2c 61 76 67 5f 72 75 6e  iterated,avg_run
70b0: 74 69 6d 65 2c 61 76 67 5f 64 69 73 6b 2c 74 61  time,avg_disk,ta
70c0: 67 73 29 20 56 41 4c 55 45 53 20 28 3f 2c 27 27  gs) VALUES (?,''
70d0: 2c 27 27 2c 27 27 2c 27 27 2c 27 27 2c 27 27 2c  ,'','','','','',
70e0: 27 27 2c 27 27 29 3b 22 20 74 65 73 74 6e 61 6d  '','');" testnam
70f0: 65 29 29 0a 0a 3b 3b 20 75 70 64 61 74 65 20 6f  e))..;; update o
7100: 6e 65 20 6f 66 20 74 68 65 20 74 65 73 74 6d 65  ne of the testme
7110: 74 61 20 66 69 65 6c 64 73 0a 28 64 65 66 69 6e  ta fields.(defin
7120: 65 20 28 64 62 3a 74 65 73 74 6d 65 74 61 2d 75  e (db:testmeta-u
7130: 70 64 61 74 65 2d 66 69 65 6c 64 20 64 62 20 74  pdate-field db t
7140: 65 73 74 6e 61 6d 65 20 66 69 65 6c 64 20 76 61  estname field va
7150: 6c 75 65 29 0a 20 20 28 73 71 6c 69 74 65 33 3a  lue).  (sqlite3:
7160: 65 78 65 63 75 74 65 20 64 62 20 28 63 6f 6e 63  execute db (conc
7170: 20 22 55 50 44 41 54 45 20 74 65 73 74 5f 6d 65   "UPDATE test_me
7180: 74 61 20 53 45 54 20 22 20 66 69 65 6c 64 20 22  ta SET " field "
7190: 3d 3f 20 57 48 45 52 45 20 74 65 73 74 6e 61 6d  =? WHERE testnam
71a0: 65 3d 3f 3b 22 29 20 76 61 6c 75 65 20 74 65 73  e=?;") value tes
71b0: 74 6e 61 6d 65 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d  tname))..;;=====
71c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
71d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
71e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
71f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7200: 3d 0a 3b 3b 20 54 20 45 20 53 20 54 20 20 20 44  =.;; T E S T   D
7210: 20 41 20 54 20 41 20 0a 3b 3b 3d 3d 3d 3d 3d 3d   A T A .;;======
7220: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7230: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7240: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7250: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7260: 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 63 73  ..(define (db:cs
7270: 76 2d 3e 74 65 73 74 2d 64 61 74 61 20 64 62 20  v->test-data db 
7280: 74 65 73 74 2d 69 64 20 63 73 76 64 61 74 61 29  test-id csvdata)
7290: 0a 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20  .  (debug:print 
72a0: 34 20 22 74 65 73 74 2d 69 64 20 22 20 74 65 73  4 "test-id " tes
72b0: 74 2d 69 64 20 22 2c 20 63 73 76 64 61 74 61 3a  t-id ", csvdata:
72c0: 20 22 20 63 73 76 64 61 74 61 29 0a 20 20 28 6c   " csvdata).  (l
72d0: 65 74 20 28 28 63 73 76 6c 69 73 74 20 28 63 73  et ((csvlist (cs
72e0: 76 2d 3e 6c 69 73 74 20 28 6d 61 6b 65 2d 63 73  v->list (make-cs
72f0: 76 2d 72 65 61 64 65 72 0a 09 09 09 20 20 20 20  v-reader....    
7300: 20 28 6f 70 65 6e 2d 69 6e 70 75 74 2d 73 74 72   (open-input-str
7310: 69 6e 67 20 63 73 76 64 61 74 61 29 0a 09 09 09  ing csvdata)....
7320: 20 20 20 20 20 27 28 28 73 74 72 69 70 2d 6c 65       '((strip-le
7330: 61 64 69 6e 67 2d 77 68 69 74 65 73 70 61 63 65  ading-whitespace
7340: 3f 20 23 74 29 0a 09 09 09 20 20 20 20 20 20 20  ? #t)....       
7350: 28 73 74 72 69 70 2d 74 72 61 69 6c 69 6e 67 2d  (strip-trailing-
7360: 77 68 69 74 65 73 70 61 63 65 3f 20 23 74 29 29  whitespace? #t))
7370: 20 29 29 29 29 20 3b 3b 20 28 63 73 76 2d 3e 6c   )))) ;; (csv->l
7380: 69 73 74 20 63 73 76 64 61 74 61 29 29 29 0a 20  ist csvdata))). 
7390: 20 20 20 28 66 6f 72 2d 65 61 63 68 20 0a 20 20     (for-each .  
73a0: 20 20 20 28 6c 61 6d 62 64 61 20 28 63 73 76 72     (lambda (csvr
73b0: 6f 77 29 0a 20 20 20 20 20 20 20 28 6c 65 74 2a  ow).       (let*
73c0: 20 28 28 70 61 64 64 65 64 2d 72 6f 77 20 20 28   ((padded-row  (
73d0: 74 61 6b 65 20 28 61 70 70 65 6e 64 20 63 73 76  take (append csv
73e0: 72 6f 77 20 28 6c 69 73 74 20 23 66 20 23 66 20  row (list #f #f 
73f0: 23 66 20 23 66 20 23 66 20 23 66 20 23 66 20 23  #f #f #f #f #f #
7400: 66 20 23 66 29 29 20 39 29 29 0a 09 20 20 20 20  f #f)) 9))..    
7410: 20 20 28 63 61 74 65 67 6f 72 79 20 20 20 20 28    (category    (
7420: 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d  list-ref padded-
7430: 72 6f 77 20 30 29 29 0a 09 20 20 20 20 20 20 28  row 0))..      (
7440: 76 61 72 69 61 62 6c 65 20 20 20 20 28 6c 69 73  variable    (lis
7450: 74 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77  t-ref padded-row
7460: 20 31 29 29 0a 09 20 20 20 20 20 20 28 76 61 6c   1))..      (val
7470: 75 65 20 20 20 20 20 20 20 28 61 6e 79 2d 3e 6e  ue       (any->n
7480: 75 6d 62 65 72 2d 69 66 2d 70 6f 73 73 69 62 6c  umber-if-possibl
7490: 65 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64 64  e (list-ref padd
74a0: 65 64 2d 72 6f 77 20 32 29 29 29 0a 09 20 20 20  ed-row 2)))..   
74b0: 20 20 20 28 65 78 70 65 63 74 65 64 20 20 20 20     (expected    
74c0: 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 2d 69 66 2d  (any->number-if-
74d0: 70 6f 73 73 69 62 6c 65 20 28 6c 69 73 74 2d 72  possible (list-r
74e0: 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20 33 29  ef padded-row 3)
74f0: 29 29 0a 09 20 20 20 20 20 20 28 74 6f 6c 20 20  ))..      (tol  
7500: 20 20 20 20 20 20 20 28 61 6e 79 2d 3e 6e 75 6d         (any->num
7510: 62 65 72 2d 69 66 2d 70 6f 73 73 69 62 6c 65 20  ber-if-possible 
7520: 28 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65 64  (list-ref padded
7530: 2d 72 6f 77 20 34 29 29 29 20 3b 3b 20 3e 2c 20  -row 4))) ;; >, 
7540: 3c 2c 20 3e 3d 2c 20 3c 3d 2c 20 6f 72 20 61 20  <, >=, <=, or a 
7550: 6e 75 6d 62 65 72 0a 09 20 20 20 20 20 20 28 75  number..      (u
7560: 6e 69 74 73 20 20 20 20 20 20 20 28 6c 69 73 74  nits       (list
7570: 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20  -ref padded-row 
7580: 35 29 29 0a 09 20 20 20 20 20 20 28 63 6f 6d 6d  5))..      (comm
7590: 65 6e 74 20 20 20 20 20 28 6c 69 73 74 2d 72 65  ent     (list-re
75a0: 66 20 70 61 64 64 65 64 2d 72 6f 77 20 36 29 29  f padded-row 6))
75b0: 0a 09 20 20 20 20 20 20 28 73 74 61 74 75 73 20  ..      (status 
75c0: 20 20 20 20 20 28 6c 65 74 20 28 28 73 20 28 6c       (let ((s (l
75d0: 69 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d 72  ist-ref padded-r
75e0: 6f 77 20 37 29 29 29 0a 09 09 09 20 20 20 20 20  ow 7)))....     
75f0: 28 69 66 20 28 61 6e 64 20 28 73 74 72 69 6e 67  (if (and (string
7600: 3f 20 73 29 28 6f 72 20 28 73 74 72 69 6e 67 2d  ? s)(or (string-
7610: 6d 61 74 63 68 20 28 72 65 67 65 78 70 20 22 5e  match (regexp "^
7620: 5c 5c 73 2a 24 22 29 20 73 29 0a 09 09 09 09 09  \\s*$") s)......
7630: 09 20 20 20 20 20 28 73 74 72 69 6e 67 2d 6d 61  .     (string-ma
7640: 74 63 68 20 28 72 65 67 65 78 70 20 22 5e 6e 2f  tch (regexp "^n/
7650: 61 24 22 29 20 73 29 29 29 0a 09 09 09 09 20 23  a$") s)))..... #
7660: 66 0a 09 09 09 09 20 73 29 29 29 20 3b 3b 20 69  f..... s))) ;; i
7670: 66 20 73 70 65 63 69 66 69 65 64 20 6f 6e 20 74  f specified on t
7680: 68 65 20 69 6e 70 75 74 20 74 68 65 6e 20 75 73  he input then us
7690: 65 2c 20 65 6c 73 65 20 63 61 6c 63 75 6c 61 74  e, else calculat
76a0: 65 0a 09 20 20 20 20 20 20 28 74 79 70 65 20 20  e..      (type  
76b0: 20 20 20 20 20 20 28 6c 69 73 74 2d 72 65 66 20        (list-ref 
76c0: 70 61 64 64 65 64 2d 72 6f 77 20 38 29 29 29 0a  padded-row 8))).
76d0: 09 20 3b 3b 20 6c 6f 6f 6b 20 75 70 20 65 78 70  . ;; look up exp
76e0: 65 63 74 65 64 2c 74 6f 6c 2c 75 6e 69 74 73 20  ected,tol,units 
76f0: 66 72 6f 6d 20 70 72 65 76 69 6f 75 73 20 62 65  from previous be
7700: 73 74 20 66 69 74 20 74 65 73 74 20 69 66 20 74  st fit test if t
7710: 68 65 79 20 61 72 65 20 61 6c 6c 20 65 69 74 68  hey are all eith
7720: 65 72 20 23 66 20 6f 72 20 27 27 0a 09 20 28 64  er #f or ''.. (d
7730: 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22 42 45  ebug:print 4 "BE
7740: 46 4f 52 45 3a 20 63 61 74 65 67 6f 72 79 3a 20  FORE: category: 
7750: 22 20 63 61 74 65 67 6f 72 79 20 22 20 76 61 72  " category " var
7760: 69 61 62 6c 65 3a 20 22 20 76 61 72 69 61 62 6c  iable: " variabl
7770: 65 20 22 20 76 61 6c 75 65 3a 20 22 20 76 61 6c  e " value: " val
7780: 75 65 20 0a 09 09 20 20 20 20 20 20 22 2c 20 65  ue ...      ", e
7790: 78 70 65 63 74 65 64 3a 20 22 20 65 78 70 65 63  xpected: " expec
77a0: 74 65 64 20 22 20 74 6f 6c 3a 20 22 20 74 6f 6c  ted " tol: " tol
77b0: 20 22 20 75 6e 69 74 73 3a 20 22 20 75 6e 69 74   " units: " unit
77c0: 73 20 22 20 73 74 61 74 75 73 3a 20 22 20 73 74  s " status: " st
77d0: 61 74 75 73 20 22 20 63 6f 6d 6d 65 6e 74 3a 20  atus " comment: 
77e0: 22 20 63 6f 6d 6d 65 6e 74 20 22 20 74 79 70 65  " comment " type
77f0: 3a 20 22 20 74 79 70 65 29 0a 0a 09 20 28 69 66  : " type)... (if
7800: 20 28 61 6e 64 20 28 6f 72 20 28 6e 6f 74 20 65   (and (or (not e
7810: 78 70 65 63 74 65 64 29 28 65 71 75 61 6c 3f 20  xpected)(equal? 
7820: 65 78 70 65 63 74 65 64 20 22 22 29 29 0a 09 09  expected ""))...
7830: 20 20 28 6f 72 20 28 6e 6f 74 20 74 6f 6c 29 20    (or (not tol) 
7840: 20 20 20 20 28 65 71 75 61 6c 3f 20 65 78 70 65      (equal? expe
7850: 63 74 65 64 20 22 22 29 29 0a 09 09 20 20 28 6f  cted ""))...  (o
7860: 72 20 28 6e 6f 74 20 75 6e 69 74 73 29 20 20 20  r (not units)   
7870: 28 65 71 75 61 6c 3f 20 65 78 70 65 63 74 65 64  (equal? expected
7880: 20 22 22 29 29 29 0a 09 20 20 20 20 20 28 6c 65   "")))..     (le
7890: 74 2d 76 61 6c 75 65 73 20 28 28 28 6e 65 77 2d  t-values (((new-
78a0: 65 78 70 65 63 74 65 64 20 6e 65 77 2d 74 6f 6c  expected new-tol
78b0: 20 6e 65 77 2d 75 6e 69 74 73 29 28 64 62 3a 67   new-units)(db:g
78c0: 65 74 2d 70 72 65 76 2d 74 6f 6c 2d 66 6f 72 2d  et-prev-tol-for-
78d0: 74 65 73 74 20 64 62 20 74 65 73 74 2d 69 64 20  test db test-id 
78e0: 63 61 74 65 67 6f 72 79 20 76 61 72 69 61 62 6c  category variabl
78f0: 65 29 29 29 0a 09 09 09 20 28 73 65 74 21 20 65  e))).... (set! e
7900: 78 70 65 63 74 65 64 20 6e 65 77 2d 65 78 70 65  xpected new-expe
7910: 63 74 65 64 29 0a 09 09 09 20 28 73 65 74 21 20  cted).... (set! 
7920: 74 6f 6c 20 20 20 20 20 20 6e 65 77 2d 74 6f 6c  tol      new-tol
7930: 29 0a 09 09 09 20 28 73 65 74 21 20 75 6e 69 74  ).... (set! unit
7940: 73 20 20 20 20 6e 65 77 2d 75 6e 69 74 73 29 29  s    new-units))
7950: 29 0a 0a 09 20 28 64 65 62 75 67 3a 70 72 69 6e  )... (debug:prin
7960: 74 20 34 20 22 41 46 54 45 52 3a 20 20 63 61 74  t 4 "AFTER:  cat
7970: 65 67 6f 72 79 3a 20 22 20 63 61 74 65 67 6f 72  egory: " categor
7980: 79 20 22 20 76 61 72 69 61 62 6c 65 3a 20 22 20  y " variable: " 
7990: 76 61 72 69 61 62 6c 65 20 22 20 76 61 6c 75 65  variable " value
79a0: 3a 20 22 20 76 61 6c 75 65 20 0a 09 09 20 20 20  : " value ...   
79b0: 20 20 20 22 2c 20 65 78 70 65 63 74 65 64 3a 20     ", expected: 
79c0: 22 20 65 78 70 65 63 74 65 64 20 22 20 74 6f 6c  " expected " tol
79d0: 3a 20 22 20 74 6f 6c 20 22 20 75 6e 69 74 73 3a  : " tol " units:
79e0: 20 22 20 75 6e 69 74 73 20 22 20 73 74 61 74 75   " units " statu
79f0: 73 3a 20 22 20 73 74 61 74 75 73 20 22 20 63 6f  s: " status " co
7a00: 6d 6d 65 6e 74 3a 20 22 20 63 6f 6d 6d 65 6e 74  mment: " comment
7a10: 29 0a 09 20 3b 3b 20 63 61 6c 63 75 6c 61 74 65  ).. ;; calculate
7a20: 20 73 74 61 74 75 73 20 69 66 20 4e 4f 54 20 73   status if NOT s
7a30: 70 65 63 69 66 69 65 64 0a 09 20 28 69 66 20 28  pecified.. (if (
7a40: 61 6e 64 20 28 6e 6f 74 20 73 74 61 74 75 73 29  and (not status)
7a50: 28 6e 75 6d 62 65 72 3f 20 65 78 70 65 63 74 65  (number? expecte
7a60: 64 29 28 6e 75 6d 62 65 72 3f 20 76 61 6c 75 65  d)(number? value
7a70: 29 29 20 3b 3b 20 6e 65 65 64 20 65 78 70 65 63  )) ;; need expec
7a80: 74 65 64 20 61 6e 64 20 76 61 6c 75 65 20 74 6f  ted and value to
7a90: 20 62 65 20 6e 75 6d 62 65 72 73 0a 09 20 20 20   be numbers..   
7aa0: 20 20 28 69 66 20 28 6e 75 6d 62 65 72 3f 20 74    (if (number? t
7ab0: 6f 6c 29 20 3b 3b 20 69 66 20 74 6f 6c 20 69 73  ol) ;; if tol is
7ac0: 20 61 20 6e 75 6d 62 65 72 20 74 68 65 6e 20 77   a number then w
7ad0: 65 20 64 6f 20 74 68 65 20 73 74 61 6e 64 61 72  e do the standar
7ae0: 64 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 09 09 20  d comparison... 
7af0: 28 6c 65 74 2a 20 28 28 6d 61 78 2d 76 61 6c 20  (let* ((max-val 
7b00: 28 2b 20 65 78 70 65 63 74 65 64 20 74 6f 6c 29  (+ expected tol)
7b10: 29 0a 09 09 09 28 6d 69 6e 2d 76 61 6c 20 28 2d  )....(min-val (-
7b20: 20 65 78 70 65 63 74 65 64 20 74 6f 6c 29 29 0a   expected tol)).
7b30: 09 09 09 28 72 65 73 75 6c 74 20 20 28 61 6e 64  ...(result  (and
7b40: 20 28 3e 3d 20 20 76 61 6c 75 65 20 6d 69 6e 2d   (>=  value min-
7b50: 76 61 6c 29 28 3c 3d 20 76 61 6c 75 65 20 6d 61  val)(<= value ma
7b60: 78 2d 76 61 6c 29 29 29 29 0a 09 09 20 20 20 28  x-val))))...   (
7b70: 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22 6d  debug:print 4 "m
7b80: 61 78 2d 76 61 6c 3a 20 22 20 6d 61 78 2d 76 61  ax-val: " max-va
7b90: 6c 20 22 20 6d 69 6e 2d 76 61 6c 3a 20 22 20 6d  l " min-val: " m
7ba0: 69 6e 2d 76 61 6c 20 22 20 72 65 73 75 6c 74 3a  in-val " result:
7bb0: 20 22 20 72 65 73 75 6c 74 29 0a 09 09 20 20 20   " result)...   
7bc0: 28 73 65 74 21 20 73 74 61 74 75 73 20 28 69 66  (set! status (if
7bd0: 20 72 65 73 75 6c 74 20 22 70 61 73 73 22 20 22   result "pass" "
7be0: 66 61 69 6c 22 29 29 29 0a 09 09 20 28 73 65 74  fail")))... (set
7bf0: 21 20 73 74 61 74 75 73 20 3b 3b 20 4e 42 2f 2f  ! status ;; NB//
7c00: 20 6e 65 65 64 20 74 6f 20 61 73 73 65 73 73 20   need to assess 
7c10: 65 61 63 68 20 6f 6e 65 20 28 69 2e 65 2e 20 6e  each one (i.e. n
7c20: 6f 74 20 72 65 74 75 72 6e 20 6f 70 65 72 61 74  ot return operat
7c30: 6f 72 20 73 69 6e 63 65 20 6e 65 65 64 20 74 6f  or since need to
7c40: 20 61 63 74 20 69 66 20 6e 6f 74 20 76 61 6c 69   act if not vali
7c50: 64 20 6f 70 2e 0a 09 09 20 20 20 20 20 20 20 28  d op....       (
7c60: 63 61 73 65 20 28 73 74 72 69 6e 67 2d 3e 73 79  case (string->sy
7c70: 6d 62 6f 6c 20 74 6f 6c 29 20 3b 3b 20 74 6f 6c  mbol tol) ;; tol
7c80: 20 73 68 6f 75 6c 64 20 62 65 20 3e 2c 20 3c 2c   should be >, <,
7c90: 20 3e 3d 2c 20 3c 3d 0a 09 09 09 20 28 28 3e 29   >=, <=.... ((>)
7ca0: 20 20 28 69 66 20 28 3e 20 20 76 61 6c 75 65 20    (if (>  value 
7cb0: 65 78 70 65 63 74 65 64 29 20 22 70 61 73 73 22  expected) "pass"
7cc0: 20 22 66 61 69 6c 22 29 29 0a 09 09 09 20 28 28   "fail")).... ((
7cd0: 3c 29 20 20 28 69 66 20 28 3c 20 20 76 61 6c 75  <)  (if (<  valu
7ce0: 65 20 65 78 70 65 63 74 65 64 29 20 22 70 61 73  e expected) "pas
7cf0: 73 22 20 22 66 61 69 6c 22 29 29 0a 09 09 09 20  s" "fail")).... 
7d00: 28 28 3e 3d 29 20 28 69 66 20 28 3e 3d 20 76 61  ((>=) (if (>= va
7d10: 6c 75 65 20 65 78 70 65 63 74 65 64 29 20 22 70  lue expected) "p
7d20: 61 73 73 22 20 22 66 61 69 6c 22 29 29 0a 09 09  ass" "fail"))...
7d30: 09 20 28 28 3c 3d 29 20 28 69 66 20 28 3c 3d 20  . ((<=) (if (<= 
7d40: 76 61 6c 75 65 20 65 78 70 65 63 74 65 64 29 20  value expected) 
7d50: 22 70 61 73 73 22 20 22 66 61 69 6c 22 29 29 0a  "pass" "fail")).
7d60: 09 09 09 20 28 65 6c 73 65 20 28 63 6f 6e 63 20  ... (else (conc 
7d70: 22 45 52 52 4f 52 3a 20 62 61 64 20 74 6f 6c 20  "ERROR: bad tol 
7d80: 63 6f 6d 70 61 72 61 74 6f 72 20 22 20 74 6f 6c  comparator " tol
7d90: 29 29 29 29 29 29 0a 09 20 28 64 65 62 75 67 3a  )))))).. (debug:
7da0: 70 72 69 6e 74 20 34 20 22 41 46 54 45 52 32 3a  print 4 "AFTER2:
7db0: 20 63 61 74 65 67 6f 72 79 3a 20 22 20 63 61 74   category: " cat
7dc0: 65 67 6f 72 79 20 22 20 76 61 72 69 61 62 6c 65  egory " variable
7dd0: 3a 20 22 20 76 61 72 69 61 62 6c 65 20 22 20 76  : " variable " v
7de0: 61 6c 75 65 3a 20 22 20 76 61 6c 75 65 20 0a 09  alue: " value ..
7df0: 09 20 20 20 20 20 20 22 2c 20 65 78 70 65 63 74  .      ", expect
7e00: 65 64 3a 20 22 20 65 78 70 65 63 74 65 64 20 22  ed: " expected "
7e10: 20 74 6f 6c 3a 20 22 20 74 6f 6c 20 22 20 75 6e   tol: " tol " un
7e20: 69 74 73 3a 20 22 20 75 6e 69 74 73 20 22 20 73  its: " units " s
7e30: 74 61 74 75 73 3a 20 22 20 73 74 61 74 75 73 20  tatus: " status 
7e40: 22 20 63 6f 6d 6d 65 6e 74 3a 20 22 20 63 6f 6d  " comment: " com
7e50: 6d 65 6e 74 29 0a 09 20 28 73 71 6c 69 74 65 33  ment).. (sqlite3
7e60: 3a 65 78 65 63 75 74 65 20 64 62 20 22 49 4e 53  :execute db "INS
7e70: 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 49  ERT OR REPLACE I
7e80: 4e 54 4f 20 74 65 73 74 5f 64 61 74 61 20 28 74  NTO test_data (t
7e90: 65 73 74 5f 69 64 2c 63 61 74 65 67 6f 72 79 2c  est_id,category,
7ea0: 76 61 72 69 61 62 6c 65 2c 76 61 6c 75 65 2c 65  variable,value,e
7eb0: 78 70 65 63 74 65 64 2c 74 6f 6c 2c 75 6e 69 74  xpected,tol,unit
7ec0: 73 2c 63 6f 6d 6d 65 6e 74 2c 73 74 61 74 75 73  s,comment,status
7ed0: 2c 74 79 70 65 29 20 56 41 4c 55 45 53 20 28 3f  ,type) VALUES (?
7ee0: 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f  ,?,?,?,?,?,?,?,?
7ef0: 2c 3f 29 3b 22 0a 09 09 09 20 20 74 65 73 74 2d  ,?);"....  test-
7f00: 69 64 20 63 61 74 65 67 6f 72 79 20 76 61 72 69  id category vari
7f10: 61 62 6c 65 20 76 61 6c 75 65 20 65 78 70 65 63  able value expec
7f20: 74 65 64 20 74 6f 6c 20 75 6e 69 74 73 20 28 69  ted tol units (i
7f30: 66 20 63 6f 6d 6d 65 6e 74 20 63 6f 6d 6d 65 6e  f comment commen
7f40: 74 20 22 22 29 20 73 74 61 74 75 73 20 74 79 70  t "") status typ
7f50: 65 29 29 29 0a 20 20 20 20 20 63 73 76 6c 69 73  e))).     csvlis
7f60: 74 29 29 29 0a 0a 3b 3b 20 67 65 74 20 61 20 6c  t)))..;; get a l
7f70: 69 73 74 20 6f 66 20 74 65 73 74 5f 64 61 74 61  ist of test_data
7f80: 20 72 65 63 6f 72 64 73 20 6d 61 74 63 68 69 6e   records matchin
7f90: 67 20 63 61 74 65 67 6f 72 79 70 61 74 74 0a 28  g categorypatt.(
7fa0: 64 65 66 69 6e 65 20 28 64 62 3a 72 65 61 64 2d  define (db:read-
7fb0: 74 65 73 74 2d 64 61 74 61 20 64 62 20 74 65 73  test-data db tes
7fc0: 74 2d 69 64 20 63 61 74 65 67 6f 72 79 70 61 74  t-id categorypat
7fd0: 74 29 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20  t).  (let ((res 
7fe0: 27 28 29 29 29 0a 20 20 20 20 28 73 71 6c 69 74  '())).    (sqlit
7ff0: 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20  e3:for-each-row 
8000: 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 69  .     (lambda (i
8010: 64 20 74 65 73 74 5f 69 64 20 63 61 74 65 67 6f  d test_id catego
8020: 72 79 20 76 61 72 69 61 62 6c 65 20 76 61 6c 75  ry variable valu
8030: 65 20 65 78 70 65 63 74 65 64 20 74 6f 6c 20 75  e expected tol u
8040: 6e 69 74 73 20 63 6f 6d 6d 65 6e 74 20 73 74 61  nits comment sta
8050: 74 75 73 20 74 79 70 65 29 0a 20 20 20 20 20 20  tus type).      
8060: 20 28 73 65 74 21 20 72 65 73 20 28 63 6f 6e 73   (set! res (cons
8070: 20 28 76 65 63 74 6f 72 20 69 64 20 74 65 73 74   (vector id test
8080: 5f 69 64 20 63 61 74 65 67 6f 72 79 20 76 61 72  _id category var
8090: 69 61 62 6c 65 20 76 61 6c 75 65 20 65 78 70 65  iable value expe
80a0: 63 74 65 64 20 74 6f 6c 20 75 6e 69 74 73 20 63  cted tol units c
80b0: 6f 6d 6d 65 6e 74 20 73 74 61 74 75 73 20 74 79  omment status ty
80c0: 70 65 29 20 72 65 73 29 29 29 0a 20 20 20 20 20  pe) res))).     
80d0: 64 62 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20  db.     "SELECT 
80e0: 69 64 2c 74 65 73 74 5f 69 64 2c 63 61 74 65 67  id,test_id,categ
80f0: 6f 72 79 2c 76 61 72 69 61 62 6c 65 2c 76 61 6c  ory,variable,val
8100: 75 65 2c 65 78 70 65 63 74 65 64 2c 74 6f 6c 2c  ue,expected,tol,
8110: 75 6e 69 74 73 2c 63 6f 6d 6d 65 6e 74 2c 73 74  units,comment,st
8120: 61 74 75 73 2c 74 79 70 65 20 46 52 4f 4d 20 74  atus,type FROM t
8130: 65 73 74 5f 64 61 74 61 20 57 48 45 52 45 20 74  est_data WHERE t
8140: 65 73 74 5f 69 64 3d 3f 20 41 4e 44 20 63 61 74  est_id=? AND cat
8150: 65 67 6f 72 79 20 4c 49 4b 45 20 3f 20 4f 52 44  egory LIKE ? ORD
8160: 45 52 20 42 59 20 63 61 74 65 67 6f 72 79 2c 76  ER BY category,v
8170: 61 72 69 61 62 6c 65 3b 22 20 74 65 73 74 2d 69  ariable;" test-i
8180: 64 20 63 61 74 65 67 6f 72 79 70 61 74 74 29 0a  d categorypatt).
8190: 20 20 20 20 28 72 65 76 65 72 73 65 20 72 65 73      (reverse res
81a0: 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62  )))..(define (db
81b0: 3a 6c 6f 61 64 2d 74 65 73 74 2d 64 61 74 61 20  :load-test-data 
81c0: 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e  db run-id test-n
81d0: 61 6d 65 20 69 74 65 6d 64 61 74 29 0a 20 20 28  ame itemdat).  (
81e0: 6c 65 74 2a 20 28 28 69 74 65 6d 2d 70 61 74 68  let* ((item-path
81f0: 20 28 69 74 65 6d 2d 6c 69 73 74 2d 3e 70 61 74   (item-list->pat
8200: 68 20 69 74 65 6d 64 61 74 29 29 0a 09 20 28 74  h itemdat)).. (t
8210: 65 73 74 64 61 74 20 28 64 62 3a 67 65 74 2d 74  estdat (db:get-t
8220: 65 73 74 2d 69 6e 66 6f 20 64 62 20 72 75 6e 2d  est-info db run-
8230: 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65  id test-name ite
8240: 6d 2d 70 61 74 68 29 29 0a 09 20 28 74 65 73 74  m-path)).. (test
8250: 2d 69 64 20 28 69 66 20 74 65 73 74 64 61 74 20  -id (if testdat 
8260: 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 69 64 20  (db:test-get-id 
8270: 74 65 73 74 64 61 74 29 20 23 66 29 29 29 0a 20  testdat) #f))). 
8280: 20 20 20 3b 3b 20 28 64 65 62 75 67 3a 70 72 69     ;; (debug:pri
8290: 6e 74 20 31 20 22 45 6e 74 65 72 20 72 65 63 6f  nt 1 "Enter reco
82a0: 72 64 73 20 74 6f 20 69 6e 73 65 72 74 20 69 6e  rds to insert in
82b0: 20 74 68 65 20 74 65 73 74 5f 64 61 74 61 20 74   the test_data t
82c0: 61 62 6c 65 2c 20 73 65 76 65 6e 20 66 69 65 6c  able, seven fiel
82d0: 64 73 2c 20 63 6f 6d 6d 61 20 73 65 70 61 72 61  ds, comma separa
82e0: 74 65 64 20 70 65 72 20 6c 69 6e 65 22 29 0a 20  ted per line"). 
82f0: 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20     (debug:print 
8300: 34 20 22 69 74 65 6d 64 61 74 3a 20 22 20 69 74  4 "itemdat: " it
8310: 65 6d 64 61 74 20 22 2c 20 74 65 73 74 2d 6e 61  emdat ", test-na
8320: 6d 65 3a 20 22 20 74 65 73 74 2d 6e 61 6d 65 20  me: " test-name 
8330: 22 2c 20 74 65 73 74 2d 69 64 3a 20 22 20 74 65  ", test-id: " te
8340: 73 74 2d 69 64 29 0a 20 20 20 20 28 69 66 20 74  st-id).    (if t
8350: 65 73 74 2d 69 64 0a 09 28 6c 65 74 20 6c 6f 6f  est-id..(let loo
8360: 70 20 28 28 6c 69 6e 20 28 72 65 61 64 2d 6c 69  p ((lin (read-li
8370: 6e 65 29 29 29 0a 09 20 20 28 69 66 20 28 6e 6f  ne)))..  (if (no
8380: 74 20 28 65 6f 66 2d 6f 62 6a 65 63 74 3f 20 6c  t (eof-object? l
8390: 69 6e 29 29 0a 09 20 20 20 20 20 20 28 62 65 67  in))..      (beg
83a0: 69 6e 0a 09 09 28 64 65 62 75 67 3a 70 72 69 6e  in...(debug:prin
83b0: 74 20 34 20 6c 69 6e 29 0a 09 09 28 64 62 3a 63  t 4 lin)...(db:c
83c0: 73 76 2d 3e 74 65 73 74 2d 64 61 74 61 20 64 62  sv->test-data db
83d0: 20 74 65 73 74 2d 69 64 20 6c 69 6e 29 0a 09 09   test-id lin)...
83e0: 28 6c 6f 6f 70 20 28 72 65 61 64 2d 6c 69 6e 65  (loop (read-line
83f0: 29 29 29 29 29 29 0a 20 20 20 20 3b 3b 20 72 6f  )))))).    ;; ro
8400: 6c 6c 20 75 70 20 74 68 65 20 63 75 72 72 65 6e  ll up the curren
8410: 74 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 3b  t results..    ;
8420: 3b 20 46 49 58 4d 45 3a 20 41 64 64 20 74 68 65  ; FIXME: Add the
8430: 20 73 74 61 74 75 73 20 74 6f 20 0a 20 20 20 20   status to .    
8440: 28 64 62 3a 74 65 73 74 2d 64 61 74 61 2d 72 6f  (db:test-data-ro
8450: 6c 6c 75 70 20 64 62 20 74 65 73 74 2d 69 64 20  llup db test-id 
8460: 23 66 29 29 29 0a 0a 3b 3b 20 57 41 52 4e 49 4e  #f)))..;; WARNIN
8470: 47 3a 20 44 6f 20 4e 4f 54 20 63 61 6c 6c 20 74  G: Do NOT call t
8480: 68 69 73 20 66 6f 72 20 74 68 65 20 70 61 72 65  his for the pare
8490: 6e 74 20 74 65 73 74 20 6f 6e 20 61 6e 20 69 74  nt test on an it
84a0: 65 72 61 74 65 64 20 74 65 73 74 0a 3b 3b 20 52  erated test.;; R
84b0: 6f 6c 6c 20 75 70 20 74 65 73 74 5f 64 61 74 61  oll up test_data
84c0: 20 70 61 73 73 2f 66 61 69 6c 20 72 65 73 75 6c   pass/fail resul
84d0: 74 73 0a 3b 3b 20 6c 6f 6f 6b 20 61 74 20 74 68  ts.;; look at th
84e0: 65 20 74 65 73 74 5f 64 61 74 61 20 73 74 61 74  e test_data stat
84f0: 75 73 20 66 69 65 6c 64 2c 20 0a 3b 3b 20 20 20  us field, .;;   
8500: 20 69 66 20 61 6c 6c 20 61 72 65 20 70 61 73 73   if all are pass
8510: 20 28 61 6e 79 20 63 61 73 65 29 20 61 6e 64 20   (any case) and 
8520: 74 68 65 20 74 65 73 74 20 73 74 61 74 75 73 20  the test status 
8530: 69 73 20 50 41 53 53 20 6f 72 20 4e 55 4c 4c 20  is PASS or NULL 
8540: 6f 72 20 27 27 20 74 68 65 6e 20 73 65 74 20 74  or '' then set t
8550: 65 73 74 20 73 74 61 74 75 73 20 74 6f 20 50 41  est status to PA
8560: 53 53 2e 0a 3b 3b 20 20 20 20 69 66 20 6f 6e 65  SS..;;    if one
8570: 20 6f 72 20 6d 6f 72 65 20 61 72 65 20 66 61 69   or more are fai
8580: 6c 20 28 61 6e 79 20 63 61 73 65 29 20 74 68 65  l (any case) the
8590: 6e 20 73 65 74 20 74 65 73 74 20 73 74 61 74 75  n set test statu
85a0: 73 20 74 6f 20 50 41 53 53 2c 20 6e 6f 6e 20 22  s to PASS, non "
85b0: 70 61 73 73 22 20 6f 72 20 22 66 61 69 6c 22 20  pass" or "fail" 
85c0: 61 72 65 20 69 67 6e 6f 72 65 64 0a 28 64 65 66  are ignored.(def
85d0: 69 6e 65 20 28 64 62 3a 74 65 73 74 2d 64 61 74  ine (db:test-dat
85e0: 61 2d 72 6f 6c 6c 75 70 20 64 62 20 74 65 73 74  a-rollup db test
85f0: 2d 69 64 20 73 74 61 74 75 73 29 0a 20 20 28 73  -id status).  (s
8600: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 0a  qlite3:execute .
8610: 20 20 20 64 62 20 0a 20 20 20 22 55 50 44 41 54     db .   "UPDAT
8620: 45 20 74 65 73 74 73 20 0a 20 20 20 20 20 20 53  E tests .      S
8630: 45 54 20 66 61 69 6c 5f 63 6f 75 6e 74 3d 28 53  ET fail_count=(S
8640: 45 4c 45 43 54 20 63 6f 75 6e 74 28 69 64 29 20  ELECT count(id) 
8650: 46 52 4f 4d 20 74 65 73 74 5f 64 61 74 61 20 57  FROM test_data W
8660: 48 45 52 45 20 74 65 73 74 5f 69 64 3d 3f 20 41  HERE test_id=? A
8670: 4e 44 20 73 74 61 74 75 73 20 6c 69 6b 65 20 27  ND status like '
8680: 66 61 69 6c 27 29 2c 0a 20 20 20 20 20 20 20 20  fail'),.        
8690: 20 20 70 61 73 73 5f 63 6f 75 6e 74 3d 28 53 45    pass_count=(SE
86a0: 4c 45 43 54 20 63 6f 75 6e 74 28 69 64 29 20 46  LECT count(id) F
86b0: 52 4f 4d 20 74 65 73 74 5f 64 61 74 61 20 57 48  ROM test_data WH
86c0: 45 52 45 20 74 65 73 74 5f 69 64 3d 3f 20 41 4e  ERE test_id=? AN
86d0: 44 20 73 74 61 74 75 73 20 6c 69 6b 65 20 27 70  D status like 'p
86e0: 61 73 73 27 29 0a 20 20 20 20 20 20 57 48 45 52  ass').      WHER
86f0: 45 20 69 64 3d 3f 3b 22 0a 20 20 20 74 65 73 74  E id=?;".   test
8700: 2d 69 64 20 74 65 73 74 2d 69 64 20 74 65 73 74  -id test-id test
8710: 2d 69 64 29 0a 20 20 3b 3b 20 69 66 20 74 68 65  -id).  ;; if the
8720: 20 74 65 73 74 20 69 73 20 6e 6f 74 20 46 41 49   test is not FAI
8730: 4c 20 74 68 65 6e 20 73 65 74 20 73 74 61 74 75  L then set statu
8740: 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 66  s based on the f
8750: 61 69 6c 20 61 6e 64 20 70 61 73 73 20 63 6f 75  ail and pass cou
8760: 6e 74 73 2e 0a 20 20 28 74 68 72 65 61 64 2d 73  nts..  (thread-s
8770: 6c 65 65 70 21 20 31 29 0a 20 20 28 73 71 6c 69  leep! 1).  (sqli
8780: 74 65 33 3a 65 78 65 63 75 74 65 0a 20 20 20 64  te3:execute.   d
8790: 62 20 20 20 3b 3b 3b 20 4e 4f 54 45 3a 20 53 68  b   ;;; NOTE: Sh
87a0: 6f 75 6c 64 20 74 68 69 73 20 62 65 20 57 41 52  ould this be WAR
87b0: 4e 2c 46 41 49 4c 3f 20 41 20 57 41 52 4e 20 69  N,FAIL? A WARN i
87c0: 73 20 6e 6f 74 20 61 20 46 41 49 4c 3f 3f 3f 3f  s not a FAIL????
87d0: 3f 20 42 55 47 20 46 49 58 4d 45 0a 20 20 20 22  ? BUG FIXME.   "
87e0: 55 50 44 41 54 45 20 74 65 73 74 73 0a 20 20 20  UPDATE tests.   
87f0: 20 20 20 53 45 54 20 73 74 61 74 75 73 3d 43 41     SET status=CA
8800: 53 45 20 57 48 45 4e 20 28 53 45 4c 45 43 54 20  SE WHEN (SELECT 
8810: 66 61 69 6c 5f 63 6f 75 6e 74 20 46 52 4f 4d 20  fail_count FROM 
8820: 74 65 73 74 73 20 57 48 45 52 45 20 69 64 3d 3f  tests WHERE id=?
8830: 29 20 3e 20 30 20 0a 20 20 20 20 20 20 20 20 20  ) > 0 .         
8840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8850: 54 48 45 4e 20 27 46 41 49 4c 27 0a 20 20 20 20  THEN 'FAIL'.    
8860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8870: 20 20 57 48 45 4e 20 28 53 45 4c 45 43 54 20 70    WHEN (SELECT p
8880: 61 73 73 5f 63 6f 75 6e 74 20 46 52 4f 4d 20 74  ass_count FROM t
8890: 65 73 74 73 20 57 48 45 52 45 20 69 64 3d 3f 29  ests WHERE id=?)
88a0: 20 3e 20 30 20 41 4e 44 20 0a 20 20 20 20 20 20   > 0 AND .      
88b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88c0: 20 20 20 20 20 28 53 45 4c 45 43 54 20 73 74 61       (SELECT sta
88d0: 74 75 73 20 46 52 4f 4d 20 74 65 73 74 73 20 57  tus FROM tests W
88e0: 48 45 52 45 20 69 64 3d 3f 29 20 4e 4f 54 20 49  HERE id=?) NOT I
88f0: 4e 20 28 27 57 41 52 4e 27 2c 27 46 41 49 4c 27  N ('WARN','FAIL'
8900: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
8910: 20 20 20 20 20 20 20 20 20 20 20 54 48 45 4e 20             THEN 
8920: 27 50 41 53 53 27 0a 20 20 20 20 20 20 20 20 20  'PASS'.         
8930: 20 20 20 20 20 20 20 20 20 20 20 20 20 45 4c 53               ELS
8940: 45 20 73 74 61 74 75 73 0a 20 20 20 20 20 20 20  E status.       
8950: 20 20 20 20 20 20 20 20 20 20 20 45 4e 44 20 57             END W
8960: 48 45 52 45 20 69 64 3d 3f 3b 22 0a 20 20 20 74  HERE id=?;".   t
8970: 65 73 74 2d 69 64 20 74 65 73 74 2d 69 64 20 74  est-id test-id t
8980: 65 73 74 2d 69 64 20 74 65 73 74 2d 69 64 29 29  est-id test-id))
8990: 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65  ..(define (db:ge
89a0: 74 2d 70 72 65 76 2d 74 6f 6c 2d 66 6f 72 2d 74  t-prev-tol-for-t
89b0: 65 73 74 20 64 62 20 74 65 73 74 2d 69 64 20 63  est db test-id c
89c0: 61 74 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65  ategory variable
89d0: 29 0a 20 20 3b 3b 20 46 69 6e 69 73 68 20 6d 65  ).  ;; Finish me
89e0: 3f 0a 20 20 28 76 61 6c 75 65 73 20 23 66 20 23  ?.  (values #f #
89f0: 66 20 23 66 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d  f #f))..;;======
8a00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8a10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8a20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8a30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8a40: 0a 3b 3b 20 53 20 54 20 45 20 50 20 53 20 0a 3b  .;; S T E P S .;
8a50: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;===============
8a60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8a70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8a80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8a90: 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65 66 69 6e 65  =======..(define
8aa0: 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 74 69   (db:step-get-ti
8ab0: 6d 65 2d 61 73 2d 73 74 72 69 6e 67 20 76 65 63  me-as-string vec
8ac0: 29 0a 20 20 28 73 65 63 6f 6e 64 73 2d 3e 74 69  ).  (seconds->ti
8ad0: 6d 65 2d 73 74 72 69 6e 67 20 28 64 62 3a 73 74  me-string (db:st
8ae0: 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d  ep-get-event_tim
8af0: 65 20 76 65 63 29 29 29 0a 0a 3b 3b 20 64 62 2d  e vec)))..;; db-
8b00: 67 65 74 2d 74 65 73 74 2d 73 74 65 70 73 2d 66  get-test-steps-f
8b10: 6f 72 2d 72 75 6e 0a 28 64 65 66 69 6e 65 20 28  or-run.(define (
8b20: 64 62 3a 67 65 74 2d 73 74 65 70 73 2d 66 6f 72  db:get-steps-for
8b30: 2d 74 65 73 74 20 64 62 20 74 65 73 74 2d 69 64  -test db test-id
8b40: 29 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20 27  ).  (let ((res '
8b50: 28 29 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65  ())).    (sqlite
8b60: 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a  3:for-each-row .
8b70: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 69 64       (lambda (id
8b80: 20 74 65 73 74 2d 69 64 20 73 74 65 70 6e 61 6d   test-id stepnam
8b90: 65 20 73 74 61 74 65 20 73 74 61 74 75 73 20 65  e state status e
8ba0: 76 65 6e 74 2d 74 69 6d 65 20 6c 6f 67 66 69 6c  vent-time logfil
8bb0: 65 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20  e).       (set! 
8bc0: 72 65 73 20 28 63 6f 6e 73 20 28 76 65 63 74 6f  res (cons (vecto
8bd0: 72 20 69 64 20 74 65 73 74 2d 69 64 20 73 74 65  r id test-id ste
8be0: 70 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61 74  pname state stat
8bf0: 75 73 20 65 76 65 6e 74 2d 74 69 6d 65 20 28 69  us event-time (i
8c00: 66 20 28 73 74 72 69 6e 67 3f 20 6c 6f 67 66 69  f (string? logfi
8c10: 6c 65 29 20 6c 6f 67 66 69 6c 65 20 22 22 29 29  le) logfile ""))
8c20: 20 72 65 73 29 29 29 0a 20 20 20 20 20 64 62 0a   res))).     db.
8c30: 20 20 20 20 20 22 53 45 4c 45 43 54 20 69 64 2c       "SELECT id,
8c40: 74 65 73 74 5f 69 64 2c 73 74 65 70 6e 61 6d 65  test_id,stepname
8c50: 2c 73 74 61 74 65 2c 73 74 61 74 75 73 2c 65 76  ,state,status,ev
8c60: 65 6e 74 5f 74 69 6d 65 2c 6c 6f 67 66 69 6c 65  ent_time,logfile
8c70: 20 46 52 4f 4d 20 74 65 73 74 5f 73 74 65 70 73   FROM test_steps
8c80: 20 57 48 45 52 45 20 74 65 73 74 5f 69 64 3d 3f   WHERE test_id=?
8c90: 20 4f 52 44 45 52 20 42 59 20 69 64 20 41 53 43   ORDER BY id ASC
8ca0: 3b 22 20 3b 3b 20 65 76 65 6e 74 5f 74 69 6d 65  ;" ;; event_time
8cb0: 20 44 45 53 43 2c 69 64 20 41 53 43 3b 0a 20 20   DESC,id ASC;.  
8cc0: 20 20 20 74 65 73 74 2d 69 64 29 0a 20 20 20 20     test-id).    
8cd0: 28 72 65 76 65 72 73 65 20 72 65 73 29 29 29 0a  (reverse res))).
8ce0: 0a 3b 3b 20 67 65 74 20 61 20 70 72 65 74 74 79  .;; get a pretty
8cf0: 20 74 61 62 6c 65 20 74 6f 20 73 75 6d 6d 61 72   table to summar
8d00: 69 7a 65 20 73 74 65 70 73 0a 3b 3b 0a 28 64 65  ize steps.;;.(de
8d10: 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 73 74 65  fine (db:get-ste
8d20: 70 73 2d 74 61 62 6c 65 20 64 62 20 74 65 73 74  ps-table db test
8d30: 2d 69 64 29 0a 20 20 28 6c 65 74 20 28 28 73 74  -id).  (let ((st
8d40: 65 70 73 20 20 20 28 64 62 3a 67 65 74 2d 73 74  eps   (db:get-st
8d50: 65 70 73 2d 66 6f 72 2d 74 65 73 74 20 64 62 20  eps-for-test db 
8d60: 74 65 73 74 2d 69 64 29 29 29 0a 20 20 20 20 3b  test-id))).    ;
8d70: 3b 20 6f 72 67 61 6e 69 73 65 20 74 68 65 20 73  ; organise the s
8d80: 74 65 70 73 20 66 6f 72 20 62 65 74 74 65 72 20  teps for better 
8d90: 72 65 61 64 61 62 69 6c 69 74 79 0a 20 20 20 20  readability.    
8da0: 28 6c 65 74 20 28 28 72 65 73 20 28 6d 61 6b 65  (let ((res (make
8db0: 2d 68 61 73 68 2d 74 61 62 6c 65 29 29 29 0a 20  -hash-table))). 
8dc0: 20 20 20 20 20 28 66 6f 72 2d 65 61 63 68 20 0a       (for-each .
8dd0: 20 20 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28         (lambda (
8de0: 73 74 65 70 29 0a 09 20 28 64 65 62 75 67 3a 70  step).. (debug:p
8df0: 72 69 6e 74 20 36 20 22 73 74 65 70 3d 22 20 73  rint 6 "step=" s
8e00: 74 65 70 29 0a 09 20 28 6c 65 74 20 28 28 72 65  tep).. (let ((re
8e10: 63 6f 72 64 20 28 68 61 73 68 2d 74 61 62 6c 65  cord (hash-table
8e20: 2d 72 65 66 2f 64 65 66 61 75 6c 74 20 0a 09 09  -ref/default ...
8e30: 09 72 65 73 20 0a 09 09 09 28 64 62 3a 73 74 65  .res ....(db:ste
8e40: 70 2d 67 65 74 2d 73 74 65 70 6e 61 6d 65 20 73  p-get-stepname s
8e50: 74 65 70 29 20 0a 09 09 09 3b 3b 20 20 20 20 20  tep) ....;;     
8e60: 20 20 20 73 74 65 70 6e 61 6d 65 20 20 20 20 20     stepname     
8e70: 20 20 20 20 20 20 20 20 20 20 20 73 74 61 72 74             start
8e80: 20 65 6e 64 20 73 74 61 74 75 73 20 20 20 20 0a   end status    .
8e90: 09 09 09 28 76 65 63 74 6f 72 20 28 64 62 3a 73  ...(vector (db:s
8ea0: 74 65 70 2d 67 65 74 2d 73 74 65 70 6e 61 6d 65  tep-get-stepname
8eb0: 20 73 74 65 70 29 20 22 22 20 20 20 22 22 20 22   step) ""   "" "
8ec0: 22 20 20 20 20 20 22 22 20 22 22 29 29 29 29 0a  "     "" "")))).
8ed0: 09 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74  .   (debug:print
8ee0: 20 36 20 22 72 65 63 6f 72 64 28 62 65 66 6f 72   6 "record(befor
8ef0: 65 29 20 3d 20 22 20 72 65 63 6f 72 64 20 0a 09  e) = " record ..
8f00: 09 09 22 5c 6e 69 64 3a 20 20 20 20 20 20 20 22  .."\nid:       "
8f10: 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 69 64   (db:step-get-id
8f20: 20 73 74 65 70 29 0a 09 09 09 22 5c 6e 73 74 65   step)...."\nste
8f30: 70 6e 61 6d 65 3a 20 22 20 28 64 62 3a 73 74 65  pname: " (db:ste
8f40: 70 2d 67 65 74 2d 73 74 65 70 6e 61 6d 65 20 73  p-get-stepname s
8f50: 74 65 70 29 0a 09 09 09 22 5c 6e 73 74 61 74 65  tep)...."\nstate
8f60: 3a 20 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d  :    " (db:step-
8f70: 67 65 74 2d 73 74 61 74 65 20 73 74 65 70 29 0a  get-state step).
8f80: 09 09 09 22 5c 6e 73 74 61 74 75 73 3a 20 20 20  ..."\nstatus:   
8f90: 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73  " (db:step-get-s
8fa0: 74 61 74 75 73 20 73 74 65 70 29 0a 09 09 09 22  tatus step)...."
8fb0: 5c 6e 74 69 6d 65 3a 20 20 20 20 20 22 20 28 64  \ntime:     " (d
8fc0: 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74  b:step-get-event
8fd0: 5f 74 69 6d 65 20 73 74 65 70 29 29 0a 09 20 20  _time step))..  
8fe0: 20 28 63 61 73 65 20 28 73 74 72 69 6e 67 2d 3e   (case (string->
8ff0: 73 79 6d 62 6f 6c 20 28 64 62 3a 73 74 65 70 2d  symbol (db:step-
9000: 67 65 74 2d 73 74 61 74 65 20 73 74 65 70 29 29  get-state step))
9010: 0a 09 20 20 20 20 20 28 28 73 74 61 72 74 29 28  ..     ((start)(
9020: 76 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f  vector-set! reco
9030: 72 64 20 31 20 28 64 62 3a 73 74 65 70 2d 67 65  rd 1 (db:step-ge
9040: 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73 74 65  t-event_time ste
9050: 70 29 29 0a 09 20 20 20 20 20 20 28 76 65 63 74  p))..      (vect
9060: 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 33  or-set! record 3
9070: 20 28 69 66 20 28 65 71 75 61 6c 3f 20 28 76 65   (if (equal? (ve
9080: 63 74 6f 72 2d 72 65 66 20 72 65 63 6f 72 64 20  ctor-ref record 
9090: 33 29 20 22 22 29 0a 09 09 09 09 09 28 64 62 3a  3) "")......(db:
90a0: 73 74 65 70 2d 67 65 74 2d 73 74 61 74 75 73 20  step-get-status 
90b0: 73 74 65 70 29 29 29 0a 09 20 20 20 20 20 20 28  step)))..      (
90c0: 69 66 20 28 3e 20 28 73 74 72 69 6e 67 2d 6c 65  if (> (string-le
90d0: 6e 67 74 68 20 28 64 62 3a 73 74 65 70 2d 67 65  ngth (db:step-ge
90e0: 74 2d 6c 6f 67 66 69 6c 65 20 73 74 65 70 29 29  t-logfile step))
90f0: 0a 09 09 20 20 20 20 20 30 29 0a 09 09 20 20 28  ...     0)...  (
9100: 76 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f  vector-set! reco
9110: 72 64 20 35 20 28 64 62 3a 73 74 65 70 2d 67 65  rd 5 (db:step-ge
9120: 74 2d 6c 6f 67 66 69 6c 65 20 73 74 65 70 29 29  t-logfile step))
9130: 29 29 0a 09 20 20 20 20 20 28 28 65 6e 64 29 20  ))..     ((end) 
9140: 20 0a 09 20 20 20 20 20 20 28 76 65 63 74 6f 72   ..      (vector
9150: 2d 73 65 74 21 20 72 65 63 6f 72 64 20 32 20 28  -set! record 2 (
9160: 61 6e 79 2d 3e 6e 75 6d 62 65 72 20 28 64 62 3a  any->number (db:
9170: 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74  step-get-event_t
9180: 69 6d 65 20 73 74 65 70 29 29 29 0a 09 20 20 20  ime step)))..   
9190: 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20     (vector-set! 
91a0: 72 65 63 6f 72 64 20 33 20 28 64 62 3a 73 74 65  record 3 (db:ste
91b0: 70 2d 67 65 74 2d 73 74 61 74 75 73 20 73 74 65  p-get-status ste
91c0: 70 29 29 0a 09 20 20 20 20 20 20 28 76 65 63 74  p))..      (vect
91d0: 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 34  or-set! record 4
91e0: 20 28 6c 65 74 20 28 28 73 74 61 72 74 74 20 28   (let ((startt (
91f0: 61 6e 79 2d 3e 6e 75 6d 62 65 72 20 28 76 65 63  any->number (vec
9200: 74 6f 72 2d 72 65 66 20 72 65 63 6f 72 64 20 31  tor-ref record 1
9210: 29 29 29 0a 09 09 09 09 09 20 20 28 65 6e 64 74  )))......  (endt
9220: 20 20 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 20     (any->number 
9230: 28 76 65 63 74 6f 72 2d 72 65 66 20 72 65 63 6f  (vector-ref reco
9240: 72 64 20 32 29 29 29 29 0a 09 09 09 09 20 20 20  rd 2)))).....   
9250: 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20     (debug:print 
9260: 34 20 22 72 65 63 6f 72 64 5b 31 5d 3d 22 20 28  4 "record[1]=" (
9270: 76 65 63 74 6f 72 2d 72 65 66 20 72 65 63 6f 72  vector-ref recor
9280: 64 20 31 29 20 0a 09 09 09 09 09 09 20 20 20 22  d 1) .......   "
9290: 2c 20 73 74 61 72 74 74 3d 22 20 73 74 61 72 74  , startt=" start
92a0: 74 20 22 2c 20 65 6e 64 74 3d 22 20 65 6e 64 74  t ", endt=" endt
92b0: 0a 09 09 09 09 09 09 20 20 20 22 2c 20 67 65 74  .......   ", get
92c0: 2d 73 74 61 74 75 73 3a 20 22 20 28 64 62 3a 73  -status: " (db:s
92d0: 74 65 70 2d 67 65 74 2d 73 74 61 74 75 73 20 73  tep-get-status s
92e0: 74 65 70 29 29 0a 09 09 09 09 20 20 20 20 20 20  tep)).....      
92f0: 28 69 66 20 28 61 6e 64 20 28 6e 75 6d 62 65 72  (if (and (number
9300: 3f 20 73 74 61 72 74 74 29 28 6e 75 6d 62 65 72  ? startt)(number
9310: 3f 20 65 6e 64 74 29 29 0a 09 09 09 09 09 20 20  ? endt))......  
9320: 28 73 65 63 6f 6e 64 73 2d 3e 68 72 2d 6d 69 6e  (seconds->hr-min
9330: 2d 73 65 63 20 28 2d 20 65 6e 64 74 20 73 74 61  -sec (- endt sta
9340: 72 74 74 29 29 20 22 2d 31 22 29 29 29 0a 09 20  rtt)) "-1"))).. 
9350: 20 20 20 20 20 28 69 66 20 28 3e 20 28 73 74 72       (if (> (str
9360: 69 6e 67 2d 6c 65 6e 67 74 68 20 28 64 62 3a 73  ing-length (db:s
9370: 74 65 70 2d 67 65 74 2d 6c 6f 67 66 69 6c 65 20  tep-get-logfile 
9380: 73 74 65 70 29 29 0a 09 09 20 20 20 20 20 30 29  step))...     0)
9390: 0a 09 09 20 20 28 76 65 63 74 6f 72 2d 73 65 74  ...  (vector-set
93a0: 21 20 72 65 63 6f 72 64 20 35 20 28 64 62 3a 73  ! record 5 (db:s
93b0: 74 65 70 2d 67 65 74 2d 6c 6f 67 66 69 6c 65 20  tep-get-logfile 
93c0: 73 74 65 70 29 29 29 29 0a 09 20 20 20 20 20 28  step))))..     (
93d0: 65 6c 73 65 0a 09 20 20 20 20 20 20 28 76 65 63  else..      (vec
93e0: 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20  tor-set! record 
93f0: 32 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73  2 (db:step-get-s
9400: 74 61 74 65 20 73 74 65 70 29 29 0a 09 20 20 20  tate step))..   
9410: 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20     (vector-set! 
9420: 72 65 63 6f 72 64 20 33 20 28 64 62 3a 73 74 65  record 3 (db:ste
9430: 70 2d 67 65 74 2d 73 74 61 74 75 73 20 73 74 65  p-get-status ste
9440: 70 29 29 0a 09 20 20 20 20 20 20 28 76 65 63 74  p))..      (vect
9450: 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 34  or-set! record 4
9460: 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 76   (db:step-get-ev
9470: 65 6e 74 5f 74 69 6d 65 20 73 74 65 70 29 29 29  ent_time step)))
9480: 29 0a 09 20 20 20 28 68 61 73 68 2d 74 61 62 6c  )..   (hash-tabl
9490: 65 2d 73 65 74 21 20 72 65 73 20 28 64 62 3a 73  e-set! res (db:s
94a0: 74 65 70 2d 67 65 74 2d 73 74 65 70 6e 61 6d 65  tep-get-stepname
94b0: 20 73 74 65 70 29 20 72 65 63 6f 72 64 29 0a 09   step) record)..
94c0: 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20     (debug:print 
94d0: 36 20 22 72 65 63 6f 72 64 28 61 66 74 65 72 29  6 "record(after)
94e0: 20 20 3d 20 22 20 72 65 63 6f 72 64 20 0a 09 09    = " record ...
94f0: 09 22 5c 6e 69 64 3a 20 20 20 20 20 20 20 22 20  ."\nid:       " 
9500: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 69 64 20  (db:step-get-id 
9510: 73 74 65 70 29 0a 09 09 09 22 5c 6e 73 74 65 70  step)...."\nstep
9520: 6e 61 6d 65 3a 20 22 20 28 64 62 3a 73 74 65 70  name: " (db:step
9530: 2d 67 65 74 2d 73 74 65 70 6e 61 6d 65 20 73 74  -get-stepname st
9540: 65 70 29 0a 09 09 09 22 5c 6e 73 74 61 74 65 3a  ep)...."\nstate:
9550: 20 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d 67      " (db:step-g
9560: 65 74 2d 73 74 61 74 65 20 73 74 65 70 29 0a 09  et-state step)..
9570: 09 09 22 5c 6e 73 74 61 74 75 73 3a 20 20 20 22  .."\nstatus:   "
9580: 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74   (db:step-get-st
9590: 61 74 75 73 20 73 74 65 70 29 0a 09 09 09 22 5c  atus step)...."\
95a0: 6e 74 69 6d 65 3a 20 20 20 20 20 22 20 28 64 62  ntime:     " (db
95b0: 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f  :step-get-event_
95c0: 74 69 6d 65 20 73 74 65 70 29 29 29 29 0a 20 20  time step)))).  
95d0: 20 20 20 20 20 3b 3b 20 28 65 6c 73 65 20 20 20       ;; (else   
95e0: 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63  (vector-set! rec
95f0: 6f 72 64 20 31 20 28 64 62 3a 73 74 65 70 2d 67  ord 1 (db:step-g
9600: 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73 74  et-event_time st
9610: 65 70 29 29 29 0a 20 20 20 20 20 20 20 28 73 6f  ep))).       (so
9620: 72 74 20 73 74 65 70 73 20 28 6c 61 6d 62 64 61  rt steps (lambda
9630: 20 28 61 20 62 29 28 3c 20 28 64 62 3a 73 74 65   (a b)(< (db:ste
9640: 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65  p-get-event_time
9650: 20 61 29 28 64 62 3a 73 74 65 70 2d 67 65 74 2d   a)(db:step-get-
9660: 65 76 65 6e 74 5f 74 69 6d 65 20 62 29 29 29 29  event_time b))))
9670: 29 0a 20 20 20 20 20 20 72 65 73 29 29 29 0a 0a  ).      res)))..
9680: 3b 3b 20 55 53 45 3a 20 28 6c 73 65 74 2d 64 69  ;; USE: (lset-di
9690: 66 66 65 72 65 6e 63 65 20 73 74 72 69 6e 67 3d  fference string=
96a0: 3f 20 27 28 22 61 22 20 22 62 22 20 22 63 22 29  ? '("a" "b" "c")
96b0: 20 27 28 22 64 22 20 22 63 22 20 22 65 22 20 22   '("d" "c" "e" "
96c0: 61 22 29 29 0a 3b 3b 0a 3b 3b 20 52 65 74 75 72  a")).;;.;; Retur
96d0: 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 72 65 72  n a list of prer
96e0: 65 71 73 20 74 68 61 74 20 77 65 72 65 20 4e 4f  eqs that were NO
96f0: 54 20 6d 65 74 0a 3b 3b 20 20 54 65 73 74 73 20  T met.;;  Tests 
9700: 28 61 6e 64 20 61 6c 6c 20 69 74 65 6d 73 29 20  (and all items) 
9710: 69 6e 20 77 61 69 74 6f 6e 20 6c 69 73 74 20 6d  in waiton list m
9720: 75 73 74 20 62 65 20 22 43 4f 4d 50 4c 45 54 45  ust be "COMPLETE
9730: 44 22 20 61 6e 64 20 22 50 41 53 53 22 0a 28 64  D" and "PASS".(d
9740: 65 66 69 6e 65 20 28 64 62 2d 67 65 74 2d 70 72  efine (db-get-pr
9750: 65 72 65 71 73 2d 6e 6f 74 2d 6d 65 74 20 64 62  ereqs-not-met db
9760: 20 72 75 6e 2d 69 64 20 77 61 69 74 6f 6e 29 0a   run-id waiton).
9770: 20 20 28 69 66 20 28 6e 75 6c 6c 3f 20 77 61 69    (if (null? wai
9780: 74 6f 6e 29 0a 20 20 20 20 20 20 27 28 29 0a 20  ton).      '(). 
9790: 20 20 20 20 20 28 6c 65 74 2a 20 28 28 75 6e 6d       (let* ((unm
97a0: 65 74 2d 70 72 65 2d 72 65 71 73 20 27 28 29 29  et-pre-reqs '())
97b0: 0a 09 20 20 20 20 20 28 74 65 73 74 73 20 20 20  ..     (tests   
97c0: 20 20 20 20 20 20 20 20 28 64 62 2d 67 65 74 2d          (db-get-
97d0: 74 65 73 74 73 2d 66 6f 72 2d 72 75 6e 20 64 62  tests-for-run db
97e0: 20 72 75 6e 2d 69 64 20 23 66 20 23 66 20 27 28   run-id #f #f '(
97f0: 29 20 27 28 29 29 29 0a 09 20 20 20 20 20 28 72  ) '()))..     (r
9800: 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 27 28  esult         '(
9810: 29 29 29 0a 09 28 66 6f 72 2d 65 61 63 68 20 28  )))..(for-each (
9820: 6c 61 6d 62 64 61 20 28 77 61 69 74 6f 6e 74 65  lambda (waitonte
9830: 73 74 2d 6e 61 6d 65 29 0a 09 09 20 20 20 20 28  st-name)...    (
9840: 6c 65 74 20 28 28 65 76 65 72 2d 73 65 65 6e 20  let ((ever-seen 
9850: 23 66 29 29 0a 09 09 20 20 20 20 20 20 28 66 6f  #f))...      (fo
9860: 72 2d 65 61 63 68 20 28 6c 61 6d 62 64 61 20 28  r-each (lambda (
9870: 74 65 73 74 29 0a 09 09 09 09 20 20 28 69 66 20  test).....  (if 
9880: 28 65 71 75 61 6c 3f 20 77 61 69 74 6f 6e 74 65  (equal? waitonte
9890: 73 74 2d 6e 61 6d 65 20 28 64 62 3a 74 65 73 74  st-name (db:test
98a0: 2d 67 65 74 2d 74 65 73 74 6e 61 6d 65 20 74 65  -get-testname te
98b0: 73 74 29 29 0a 09 09 09 09 20 20 20 20 20 20 28  st)).....      (
98c0: 62 65 67 69 6e 0a 09 09 09 09 09 28 73 65 74 21  begin......(set!
98d0: 20 65 76 65 72 2d 73 65 65 6e 20 23 74 29 0a 09   ever-seen #t)..
98e0: 09 09 09 09 28 69 66 20 28 6e 6f 74 20 28 61 6e  ....(if (not (an
98f0: 64 20 28 65 71 75 61 6c 3f 20 28 64 62 3a 74 65  d (equal? (db:te
9900: 73 74 2d 67 65 74 2d 73 74 61 74 65 20 74 65 73  st-get-state tes
9910: 74 29 20 22 43 4f 4d 50 4c 45 54 45 44 22 29 0a  t) "COMPLETED").
9920: 09 09 09 09 09 09 20 20 20 20 20 20 28 6d 65 6d  ......      (mem
9930: 62 65 72 20 28 64 62 3a 74 65 73 74 2d 67 65 74  ber (db:test-get
9940: 2d 73 74 61 74 75 73 20 74 65 73 74 29 20 27 28  -status test) '(
9950: 22 50 41 53 53 22 20 22 57 41 52 4e 22 20 22 43  "PASS" "WARN" "C
9960: 48 45 43 4b 22 29 29 29 29 0a 09 09 09 09 09 20  HECK"))))...... 
9970: 20 20 20 28 73 65 74 21 20 72 65 73 75 6c 74 20     (set! result 
9980: 28 63 6f 6e 73 20 77 61 69 74 6f 6e 74 65 73 74  (cons waitontest
9990: 2d 6e 61 6d 65 20 72 65 73 75 6c 74 29 29 29 29  -name result))))
99a0: 29 29 0a 09 09 09 09 74 65 73 74 73 29 0a 09 09  )).....tests)...
99b0: 20 20 20 20 20 20 28 69 66 20 28 6e 6f 74 20 65        (if (not e
99c0: 76 65 72 2d 73 65 65 6e 29 28 73 65 74 21 20 72  ver-seen)(set! r
99d0: 65 73 75 6c 74 20 28 63 6f 6e 73 20 77 61 69 74  esult (cons wait
99e0: 6f 6e 74 65 73 74 2d 6e 61 6d 65 20 72 65 73 75  ontest-name resu
99f0: 6c 74 29 29 29 29 29 0a 09 09 20 20 77 61 69 74  lt)))))...  wait
9a00: 6f 6e 29 0a 09 28 64 65 6c 65 74 65 2d 64 75 70  on)..(delete-dup
9a10: 6c 69 63 61 74 65 73 20 72 65 73 75 6c 74 29 29  licates result))
9a20: 29 29 0a 0a 3b 3b 20 74 68 65 20 6e 65 77 20 70  ))..;; the new p
9a30: 72 65 72 65 71 73 20 63 61 6c 63 75 6c 61 74 69  rereqs calculati
9a40: 6f 6e 2c 20 6c 6f 6f 6b 73 20 61 6c 73 6f 20 61  on, looks also a
9a50: 74 20 69 74 65 6d 70 61 74 68 20 69 66 20 73 70  t itempath if sp
9a60: 65 63 69 66 69 65 64 0a 3b 3b 20 61 6c 6c 20 70  ecified.;; all p
9a70: 72 65 72 65 71 73 20 6d 75 73 74 20 62 65 20 6d  rereqs must be m
9a80: 65 74 3a 0a 3b 3b 20 20 20 20 69 66 20 70 72 65  et:.;;    if pre
9a90: 72 65 71 20 74 65 73 74 20 77 69 74 68 20 69 74  req test with it
9aa0: 65 6d 70 61 74 68 3d 27 27 20 69 73 20 43 4f 4d  empath='' is COM
9ab0: 50 4c 45 54 45 44 20 61 6e 64 20 50 41 53 53 2c  PLETED and PASS,
9ac0: 20 57 41 52 4e 2c 20 43 48 45 43 4b 2c 20 6f 72   WARN, CHECK, or
9ad0: 20 57 41 49 56 45 44 20 74 68 65 6e 20 70 72 65   WAIVED then pre
9ae0: 72 65 71 20 69 73 20 6d 65 74 0a 3b 3b 20 20 20  req is met.;;   
9af0: 20 69 66 20 70 72 65 72 65 71 20 74 65 73 74 20   if prereq test 
9b00: 77 69 74 68 20 69 74 65 6d 70 61 74 68 3d 72 65  with itempath=re
9b10: 66 2d 69 74 65 6d 2d 70 61 74 68 20 61 6e 64 20  f-item-path and 
9b20: 43 4f 4d 50 4c 45 54 45 44 20 77 69 74 68 20 50  COMPLETED with P
9b30: 41 53 53 2c 20 57 41 52 4e 2c 20 43 48 45 43 4b  ASS, WARN, CHECK
9b40: 2c 20 6f 72 20 57 41 49 56 45 44 20 74 68 65 6e  , or WAIVED then
9b50: 20 70 72 65 72 65 71 20 69 73 20 6d 65 74 0a 28   prereq is met.(
9b60: 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 70  define (db:get-p
9b70: 72 65 72 65 71 73 2d 6e 6f 74 2d 6d 65 74 20 64  rereqs-not-met d
9b80: 62 20 72 75 6e 2d 69 64 20 77 61 69 74 6f 6e 73  b run-id waitons
9b90: 20 72 65 66 2d 69 74 65 6d 2d 70 61 74 68 29 0a   ref-item-path).
9ba0: 20 20 28 69 66 20 28 6f 72 20 28 6e 6f 74 20 77    (if (or (not w
9bb0: 61 69 74 6f 6e 73 29 0a 09 20 20 28 6e 75 6c 6c  aitons)..  (null
9bc0: 3f 20 77 61 69 74 6f 6e 73 29 29 0a 20 20 20 20  ? waitons)).    
9bd0: 20 20 27 28 29 0a 20 20 20 20 20 20 28 6c 65 74    '().      (let
9be0: 2a 20 28 28 75 6e 6d 65 74 2d 70 72 65 2d 72 65  * ((unmet-pre-re
9bf0: 71 73 20 27 28 29 29 0a 09 20 20 20 20 20 28 72  qs '())..     (r
9c00: 65 73 75 6c 74 20 20 20 20 20 20 20 20 20 27 28  esult         '(
9c10: 29 29 29 0a 09 28 66 6f 72 2d 65 61 63 68 20 0a  )))..(for-each .
9c20: 09 20 28 6c 61 6d 62 64 61 20 28 77 61 69 74 6f  . (lambda (waito
9c30: 6e 74 65 73 74 2d 6e 61 6d 65 29 0a 09 20 20 20  ntest-name)..   
9c40: 3b 3b 20 62 79 20 67 65 74 74 69 6e 67 20 74 68  ;; by getting th
9c50: 65 20 74 65 73 74 73 20 77 69 74 68 20 6d 61 74  e tests with mat
9c60: 63 68 69 6e 67 20 6e 61 6d 65 20 77 65 20 61 72  ching name we ar
9c70: 65 20 6c 6f 6f 6b 69 6e 67 20 6f 6e 6c 79 20 61  e looking only a
9c80: 74 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 74  t the matching t
9c90: 65 73 74 20 0a 09 20 20 20 3b 3b 20 61 6e 64 20  est ..   ;; and 
9ca0: 72 65 6c 61 74 65 64 20 73 75 62 20 69 74 65 6d  related sub item
9cb0: 73 0a 09 20 20 20 28 6c 65 74 20 28 28 74 65 73  s..   (let ((tes
9cc0: 74 73 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ts             (
9cd0: 64 62 2d 67 65 74 2d 74 65 73 74 73 2d 66 6f 72  db-get-tests-for
9ce0: 2d 72 75 6e 20 64 62 20 72 75 6e 2d 69 64 20 77  -run db run-id w
9cf0: 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 20 23  aitontest-name #
9d00: 66 20 27 28 29 20 27 28 29 29 29 0a 09 09 20 28  f '() '()))... (
9d10: 65 76 65 72 2d 73 65 65 6e 20 20 20 20 20 20 20  ever-seen       
9d20: 20 20 23 66 29 0a 09 09 20 28 70 61 72 65 6e 74    #f)... (parent
9d30: 2d 77 61 69 74 6f 6e 2d 6d 65 74 20 23 66 29 0a  -waiton-met #f).
9d40: 09 09 20 28 69 74 65 6d 2d 77 61 69 74 6f 6e 2d  .. (item-waiton-
9d50: 6d 65 74 20 20 20 23 66 29 29 0a 09 20 20 20 20  met   #f))..    
9d60: 20 28 66 6f 72 2d 65 61 63 68 20 0a 09 20 20 20   (for-each ..   
9d70: 20 20 20 28 6c 61 6d 62 64 61 20 28 74 65 73 74     (lambda (test
9d80: 29 0a 09 09 3b 3b 20 28 69 66 20 28 65 71 75 61  )...;; (if (equa
9d90: 6c 3f 20 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61  l? waitontest-na
9da0: 6d 65 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d  me (db:test-get-
9db0: 74 65 73 74 6e 61 6d 65 20 74 65 73 74 29 29 20  testname test)) 
9dc0: 3b 3b 20 62 79 20 64 65 66 69 6e 74 69 6f 6e 20  ;; by defintion 
9dd0: 74 68 69 73 20 68 61 64 20 62 65 74 74 65 72 20  this had better 
9de0: 62 65 20 74 72 75 65 20 2e 2e 2e 0a 09 09 28 6c  be true ......(l
9df0: 65 74 2a 20 28 28 73 74 61 74 65 20 20 20 20 20  et* ((state     
9e00: 20 20 20 20 20 20 20 20 28 64 62 3a 74 65 73 74          (db:test
9e10: 2d 67 65 74 2d 73 74 61 74 65 20 74 65 73 74 29  -get-state test)
9e20: 29 0a 09 09 20 20 20 20 20 20 20 28 73 74 61 74  )...       (stat
9e30: 75 73 20 20 20 20 20 20 20 20 20 20 20 20 28 64  us            (d
9e40: 62 3a 74 65 73 74 2d 67 65 74 2d 73 74 61 74 75  b:test-get-statu
9e50: 73 20 74 65 73 74 29 29 0a 09 09 20 20 20 20 20  s test))...     
9e60: 20 20 28 69 74 65 6d 2d 70 61 74 68 20 20 20 20    (item-path    
9e70: 20 20 20 20 20 28 64 62 3a 74 65 73 74 2d 67 65       (db:test-ge
9e80: 74 2d 69 74 65 6d 2d 70 61 74 68 20 74 65 73 74  t-item-path test
9e90: 29 29 0a 09 09 20 20 20 20 20 20 20 28 69 73 2d  ))...       (is-
9ea0: 63 6f 6d 70 6c 65 74 65 64 20 20 20 20 20 20 28  completed      (
9eb0: 65 71 75 61 6c 3f 20 73 74 61 74 65 20 22 43 4f  equal? state "CO
9ec0: 4d 50 4c 45 54 45 44 22 29 29 0a 09 09 20 20 20  MPLETED"))...   
9ed0: 20 20 20 20 28 69 73 2d 6f 6b 20 20 20 20 20 20      (is-ok      
9ee0: 20 20 20 20 20 20 20 28 6d 65 6d 62 65 72 20 73         (member s
9ef0: 74 61 74 75 73 20 27 28 22 50 41 53 53 22 20 22  tatus '("PASS" "
9f00: 57 41 52 4e 22 20 22 43 48 45 43 4b 22 20 22 57  WARN" "CHECK" "W
9f10: 41 49 56 45 44 22 29 29 29 0a 09 09 20 20 20 20  AIVED")))...    
9f20: 20 20 20 28 73 61 6d 65 2d 69 74 65 6d 70 61 74     (same-itempat
9f30: 68 20 20 20 20 20 28 65 71 75 61 6c 3f 20 72 65  h     (equal? re
9f40: 66 2d 69 74 65 6d 2d 70 61 74 68 20 69 74 65 6d  f-item-path item
9f50: 2d 70 61 74 68 29 29 29 0a 09 09 20 20 28 73 65  -path)))...  (se
9f60: 74 21 20 65 76 65 72 2d 73 65 65 6e 20 23 74 29  t! ever-seen #t)
9f70: 0a 09 09 20 20 28 63 6f 6e 64 0a 09 09 20 20 20  ...  (cond...   
9f80: 3b 3b 20 63 61 73 65 20 31 2c 20 6e 6f 6e 2d 69  ;; case 1, non-i
9f90: 74 65 6d 20 28 70 61 72 65 6e 74 20 74 65 73 74  tem (parent test
9fa0: 29 20 69 73 20 0a 09 09 20 20 20 28 28 61 6e 64  ) is ...   ((and
9fb0: 20 28 65 71 75 61 6c 3f 20 69 74 65 6d 2d 70 61   (equal? item-pa
9fc0: 74 68 20 22 22 29 20 3b 3b 20 74 68 69 73 20 69  th "") ;; this i
9fd0: 73 20 74 68 65 20 70 61 72 65 6e 74 20 74 65 73  s the parent tes
9fe0: 74 0a 09 09 09 20 69 73 2d 63 6f 6d 70 6c 65 74  t.... is-complet
9ff0: 65 64 0a 09 09 09 20 69 73 2d 6f 6b 29 0a 09 09  ed.... is-ok)...
a000: 20 20 20 20 28 73 65 74 21 20 70 61 72 65 6e 74      (set! parent
a010: 2d 77 61 69 74 6f 6e 2d 6d 65 74 20 23 74 29 29  -waiton-met #t))
a020: 0a 09 09 20 20 20 28 28 61 6e 64 20 73 61 6d 65  ...   ((and same
a030: 2d 69 74 65 6d 70 61 74 68 0a 09 09 09 20 69 73  -itempath.... is
a040: 2d 63 6f 6d 70 6c 65 74 65 64 0a 09 09 09 20 69  -completed.... i
a050: 73 2d 6f 6b 29 0a 09 09 20 20 20 20 28 73 65 74  s-ok)...    (set
a060: 21 20 69 74 65 6d 2d 77 61 69 74 6f 6e 2d 6d 65  ! item-waiton-me
a070: 74 20 23 74 29 29 29 29 29 0a 09 20 20 20 20 20  t #t)))))..     
a080: 20 74 65 73 74 73 29 0a 09 20 20 20 20 20 28 69   tests)..     (i
a090: 66 20 28 6e 6f 74 20 28 6f 72 20 70 61 72 65 6e  f (not (or paren
a0a0: 74 2d 77 61 69 74 6f 6e 2d 6d 65 74 20 69 74 65  t-waiton-met ite
a0b0: 6d 2d 77 61 69 74 6f 6e 2d 6d 65 74 29 29 0a 09  m-waiton-met))..
a0c0: 09 20 28 73 65 74 21 20 72 65 73 75 6c 74 20 28  . (set! result (
a0d0: 63 6f 6e 73 20 77 61 69 74 6f 6e 74 65 73 74 2d  cons waitontest-
a0e0: 6e 61 6d 65 20 72 65 73 75 6c 74 29 29 29 0a 09  name result)))..
a0f0: 20 20 20 20 20 3b 3b 20 69 66 20 74 68 65 20 74       ;; if the t
a100: 65 73 74 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  est is not found
a110: 20 74 68 65 6e 20 63 6c 65 61 72 6c 79 20 74 68   then clearly th
a120: 65 20 77 61 69 74 6f 6e 20 69 73 20 6e 6f 74 20  e waiton is not 
a130: 6d 65 74 2e 2e 2e 0a 09 20 20 20 20 20 28 69 66  met.....     (if
a140: 20 28 6e 6f 74 20 65 76 65 72 2d 73 65 65 6e 29   (not ever-seen)
a150: 28 73 65 74 21 20 72 65 73 75 6c 74 20 28 63 6f  (set! result (co
a160: 6e 73 20 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61  ns waitontest-na
a170: 6d 65 20 72 65 73 75 6c 74 29 29 29 29 29 0a 09  me result)))))..
a180: 77 61 69 74 6f 6e 73 29 0a 20 20 20 20 20 20 28  waitons).      (
a190: 64 65 6c 65 74 65 2d 64 75 70 6c 69 63 61 74 65  delete-duplicate
a1a0: 73 20 72 65 73 75 6c 74 29 29 29 29 0a 0a 28 64  s result))))..(d
a1b0: 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74 73 74  efine (db:testst
a1c0: 65 70 2d 73 65 74 2d 73 74 61 74 75 73 21 20 64  ep-set-status! d
a1d0: 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61  b run-id test-na
a1e0: 6d 65 20 74 65 73 74 73 74 65 70 2d 6e 61 6d 65  me teststep-name
a1f0: 20 73 74 61 74 65 2d 69 6e 20 73 74 61 74 75 73   state-in status
a200: 2d 69 6e 20 69 74 65 6d 2d 70 61 74 68 20 63 6f  -in item-path co
a210: 6d 6d 65 6e 74 20 6c 6f 67 66 69 6c 65 29 0a 20  mment logfile). 
a220: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20   (debug:print 4 
a230: 22 72 75 6e 2d 69 64 3a 20 22 20 72 75 6e 2d 69  "run-id: " run-i
a240: 64 20 22 20 74 65 73 74 2d 6e 61 6d 65 3a 20 22  d " test-name: "
a250: 20 74 65 73 74 2d 6e 61 6d 65 29 0a 20 20 28 6c   test-name).  (l
a260: 65 74 2a 20 28 28 73 74 61 74 65 20 20 20 20 20  et* ((state     
a270: 28 63 68 65 63 6b 2d 76 61 6c 69 64 2d 69 74 65  (check-valid-ite
a280: 6d 73 20 22 73 74 61 74 65 22 20 73 74 61 74 65  ms "state" state
a290: 2d 69 6e 29 29 0a 09 20 28 73 74 61 74 75 73 20  -in)).. (status 
a2a0: 20 20 20 28 63 68 65 63 6b 2d 76 61 6c 69 64 2d     (check-valid-
a2b0: 69 74 65 6d 73 20 22 73 74 61 74 75 73 22 20 73  items "status" s
a2c0: 74 61 74 75 73 2d 69 6e 29 29 0a 09 20 28 74 65  tatus-in)).. (te
a2d0: 73 74 64 61 74 20 20 20 28 64 62 3a 67 65 74 2d  stdat   (db:get-
a2e0: 74 65 73 74 2d 69 6e 66 6f 20 64 62 20 72 75 6e  test-info db run
a2f0: 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74  -id test-name it
a300: 65 6d 2d 70 61 74 68 29 29 29 0a 20 20 20 20 28  em-path))).    (
a310: 64 65 62 75 67 3a 70 72 69 6e 74 20 35 20 22 74  debug:print 5 "t
a320: 65 73 74 64 61 74 3a 20 22 20 74 65 73 74 64 61  estdat: " testda
a330: 74 29 0a 20 20 20 20 28 69 66 20 28 61 6e 64 20  t).    (if (and 
a340: 74 65 73 74 64 61 74 20 3b 3b 20 69 66 20 74 68  testdat ;; if th
a350: 65 20 73 65 63 74 69 6f 6e 20 65 78 69 73 74 73  e section exists
a360: 20 74 68 65 6e 20 66 6f 72 63 65 20 73 70 65 63   then force spec
a370: 69 66 69 63 61 74 69 6f 6e 20 42 55 47 2c 20 49  ification BUG, I
a380: 20 64 6f 6e 27 74 20 6c 69 6b 65 20 68 6f 77 20   don't like how 
a390: 74 68 69 73 20 77 6f 72 6b 73 2e 0a 09 20 20 20  this works...   
a3a0: 20 20 28 6f 72 20 28 6e 6f 74 20 73 74 61 74 65    (or (not state
a3b0: 29 28 6e 6f 74 20 73 74 61 74 75 73 29 29 29 0a  )(not status))).
a3c0: 09 28 64 65 62 75 67 3a 70 72 69 6e 74 20 30 20  .(debug:print 0 
a3d0: 22 57 41 52 4e 49 4e 47 3a 20 49 6e 76 61 6c 69  "WARNING: Invali
a3e0: 64 20 22 20 28 69 66 20 73 74 61 74 75 73 20 22  d " (if status "
a3f0: 73 74 61 74 75 73 22 20 22 73 74 61 74 65 22 29  status" "state")
a400: 0a 09 20 20 20 20 20 20 20 22 20 76 61 6c 75 65  ..       " value
a410: 20 5c 22 22 20 28 69 66 20 73 74 61 74 75 73 20   \"" (if status 
a420: 73 74 61 74 65 2d 69 6e 20 73 74 61 74 75 73 2d  state-in status-
a430: 69 6e 29 20 22 5c 22 2c 20 75 70 64 61 74 65 20  in) "\", update 
a440: 79 6f 75 72 20 76 61 6c 69 64 76 61 6c 75 65 73  your validvalues
a450: 20 73 65 63 74 69 6f 6e 20 69 6e 20 6d 65 67 61   section in mega
a460: 74 65 73 74 2e 63 6f 6e 66 69 67 22 29 29 0a 20  test.config")). 
a470: 20 20 20 28 69 66 20 74 65 73 74 64 61 74 0a 09     (if testdat..
a480: 28 6c 65 74 20 28 28 74 65 73 74 2d 69 64 20 28  (let ((test-id (
a490: 74 65 73 74 3a 67 65 74 2d 69 64 20 74 65 73 74  test:get-id test
a4a0: 64 61 74 29 29 29 0a 09 20 20 3b 3b 20 46 49 58  dat)))..  ;; FIX
a4b0: 4d 45 20 2d 20 74 68 69 73 20 73 68 6f 75 6c 64  ME - this should
a4c0: 20 6e 6f 74 20 75 70 64 61 74 65 20 74 68 65 20   not update the 
a4d0: 6c 6f 67 66 69 6c 65 20 75 6e 6c 65 73 73 20 69  logfile unless i
a4e0: 74 20 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a  t is specified..
a4f0: 09 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63  .  (sqlite3:exec
a500: 75 74 65 20 64 62 20 0a 09 09 09 22 49 4e 53 45  ute db ...."INSE
a510: 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 69 6e  RT OR REPLACE in
a520: 74 6f 20 74 65 73 74 5f 73 74 65 70 73 20 28 74  to test_steps (t
a530: 65 73 74 5f 69 64 2c 73 74 65 70 6e 61 6d 65 2c  est_id,stepname,
a540: 73 74 61 74 65 2c 73 74 61 74 75 73 2c 65 76 65  state,status,eve
a550: 6e 74 5f 74 69 6d 65 2c 63 6f 6d 6d 65 6e 74 2c  nt_time,comment,
a560: 6c 6f 67 66 69 6c 65 29 20 56 41 4c 55 45 53 28  logfile) VALUES(
a570: 3f 2c 3f 2c 3f 2c 3f 2c 73 74 72 66 74 69 6d 65  ?,?,?,?,strftime
a580: 28 27 25 73 27 2c 27 6e 6f 77 27 29 2c 3f 2c 3f  ('%s','now'),?,?
a590: 29 3b 22 0a 09 09 09 74 65 73 74 2d 69 64 20 74  );"....test-id t
a5a0: 65 73 74 73 74 65 70 2d 6e 61 6d 65 20 73 74 61  eststep-name sta
a5b0: 74 65 2d 69 6e 20 73 74 61 74 75 73 2d 69 6e 20  te-in status-in 
a5c0: 28 69 66 20 63 6f 6d 6d 65 6e 74 20 63 6f 6d 6d  (if comment comm
a5d0: 65 6e 74 20 22 22 29 20 28 69 66 20 6c 6f 67 66  ent "") (if logf
a5e0: 69 6c 65 20 6c 6f 67 66 69 6c 65 20 22 22 29 29  ile logfile ""))
a5f0: 0a 09 20 20 23 74 29 20 3b 3b 20 66 61 6b 65 20  ..  #t) ;; fake 
a600: 6f 75 74 20 61 20 23 74 20 2d 20 63 6f 75 6c 64  out a #t - could
a610: 20 62 65 20 65 78 65 63 75 74 65 20 69 73 20 72   be execute is r
a620: 65 74 75 72 6e 69 6e 67 20 73 6f 6d 65 74 68 69  eturning somethi
a630: 6e 67 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a 09  ng complicated..
a640: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 30 20 22  (debug:print 0 "
a650: 45 52 52 4f 52 3a 20 43 61 6e 27 74 20 75 70 64  ERROR: Can't upd
a660: 61 74 65 20 22 20 74 65 73 74 2d 6e 61 6d 65 20  ate " test-name 
a670: 22 20 66 6f 72 20 72 75 6e 20 22 20 72 75 6e 2d  " for run " run-
a680: 69 64 20 22 20 2d 3e 20 6e 6f 20 73 75 63 68 20  id " -> no such 
a690: 74 65 73 74 20 69 6e 20 64 62 22 29 29 29 29 0a  test in db")))).
a6a0: 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  .;;=============
a6b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
a6c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
a6d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
a6e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 45 78 74  =========.;; Ext
a6f0: 72 61 63 74 20 6f 64 73 20 66 69 6c 65 20 66 72  ract ods file fr
a700: 6f 6d 20 74 68 65 20 64 62 0a 3b 3b 3d 3d 3d 3d  om the db.;;====
a710: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
a720: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
a730: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
a740: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
a750: 3d 3d 0a 0a 3b 3b 20 72 75 6e 73 70 61 74 74 20  ==..;; runspatt 
a760: 69 73 20 61 20 63 6f 6d 6d 61 20 64 65 6c 69 6d  is a comma delim
a770: 69 74 65 64 20 6c 69 73 74 20 6f 66 20 72 75 6e  ited list of run
a780: 20 70 61 74 74 65 72 6e 73 0a 3b 3b 20 6b 65 79   patterns.;; key
a790: 70 61 74 74 2d 61 6c 69 73 74 20 6d 75 73 74 20  patt-alist must 
a7a0: 63 6f 6e 74 61 69 6e 20 2a 61 6c 6c 2a 20 6b 65  contain *all* ke
a7b0: 79 73 20 77 69 74 68 20 61 6e 20 61 73 73 6f 63  ys with an assoc
a7c0: 69 61 74 65 64 20 70 61 74 74 65 72 6e 3a 20 27  iated pattern: '
a7d0: 28 20 28 22 4b 45 59 31 22 20 22 25 22 29 20 2e  ( ("KEY1" "%") .
a7e0: 2e 20 29 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  . ).(define (db:
a7f0: 65 78 74 72 61 63 74 2d 6f 64 73 2d 66 69 6c 65  extract-ods-file
a800: 20 64 62 20 6f 75 74 70 75 74 66 69 6c 65 20 6b   db outputfile k
a810: 65 79 70 61 74 74 2d 61 6c 69 73 74 20 72 75 6e  eypatt-alist run
a820: 73 70 61 74 74 20 70 61 74 68 6d 6f 64 29 0a 20  spatt pathmod). 
a830: 20 28 6c 65 74 2a 20 28 28 6b 65 79 73 73 74 72   (let* ((keysstr
a840: 20 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73    (string-inters
a850: 70 65 72 73 65 20 28 6d 61 70 20 63 61 72 20 6b  perse (map car k
a860: 65 79 70 61 74 74 2d 61 6c 69 73 74 29 20 22 2c  eypatt-alist) ",
a870: 22 29 29 0a 09 20 28 6b 65 79 71 72 79 20 20 20  ")).. (keyqry   
a880: 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65  (string-interspe
a890: 72 73 65 20 28 6d 61 70 20 28 6c 61 6d 62 64 61  rse (map (lambda
a8a0: 20 28 70 29 28 63 6f 6e 63 20 28 63 61 72 20 70   (p)(conc (car p
a8b0: 29 20 22 20 4c 49 4b 45 20 3f 20 22 29 29 20 6b  ) " LIKE ? ")) k
a8c0: 65 79 70 61 74 74 2d 61 6c 69 73 74 29 20 22 20  eypatt-alist) " 
a8d0: 41 4e 44 20 22 29 29 0a 09 20 28 6e 75 6d 6b 65  AND ")).. (numke
a8e0: 79 73 20 20 28 6c 65 6e 67 74 68 20 6b 65 79 70  ys  (length keyp
a8f0: 61 74 74 2d 61 6c 69 73 74 29 29 0a 09 20 28 74  att-alist)).. (t
a900: 65 73 74 2d 69 64 73 20 27 28 29 29 0a 09 20 28  est-ids '()).. (
a910: 77 69 6e 64 6f 77 73 20 20 28 61 6e 64 20 70 61  windows  (and pa
a920: 74 68 6d 6f 64 20 28 73 75 62 73 74 72 69 6e 67  thmod (substring
a930: 2d 69 6e 64 65 78 20 22 5c 5c 22 20 70 61 74 68  -index "\\" path
a940: 6d 6f 64 29 29 29 0a 09 20 28 74 65 6d 70 64 69  mod))).. (tempdi
a950: 72 20 20 28 63 6f 6e 63 20 22 2f 74 6d 70 2f 22  r  (conc "/tmp/"
a960: 20 28 63 75 72 72 65 6e 74 2d 75 73 65 72 2d 6e   (current-user-n
a970: 61 6d 65 29 20 22 2f 22 20 72 75 6e 73 70 61 74  ame) "/" runspat
a980: 74 20 22 5f 22 20 28 72 61 6e 64 6f 6d 20 31 30  t "_" (random 10
a990: 30 30 30 29 20 22 5f 22 20 28 63 75 72 72 65 6e  000) "_" (curren
a9a0: 74 2d 70 72 6f 63 65 73 73 2d 69 64 29 29 29 0a  t-process-id))).
a9b0: 09 20 28 72 75 6e 73 68 65 61 64 65 72 20 28 61  . (runsheader (a
a9c0: 70 70 65 6e 64 20 28 6c 69 73 74 20 22 52 75 6e  ppend (list "Run
a9d0: 20 49 64 22 20 22 52 75 6e 6e 61 6d 65 22 29 20   Id" "Runname") 
a9e0: 3b 20 30 20 31 0a 09 09 09 20 20 20 20 20 28 6d  ; 0 1....     (m
a9f0: 61 70 20 63 61 72 20 6b 65 79 70 61 74 74 2d 61  ap car keypatt-a
aa00: 6c 69 73 74 29 20 20 20 3b 20 2b 20 4e 20 3d 20  list)   ; + N = 
aa10: 6c 65 6e 67 74 68 20 6b 65 79 70 61 74 74 2d 61  length keypatt-a
aa20: 6c 69 73 74 0a 09 09 09 20 20 20 20 20 28 6c 69  list....     (li
aa30: 73 74 20 22 54 65 73 74 6e 61 6d 65 22 20 20 20  st "Testname"   
aa40: 20 20 20 20 20 20 20 3b 20 32 0a 09 09 09 09 20         ; 2..... 
aa50: 20 20 22 49 74 65 6d 20 50 61 74 68 22 20 20 20    "Item Path"   
aa60: 20 20 20 20 20 20 3b 20 33 20 0a 09 09 09 09 20        ; 3 ..... 
aa70: 20 20 22 44 65 73 63 72 69 70 74 69 6f 6e 22 20    "Description" 
aa80: 20 20 20 20 20 20 3b 20 34 20 0a 09 09 09 09 20        ; 4 ..... 
aa90: 20 20 22 53 74 61 74 65 22 20 20 20 20 20 20 20    "State"       
aaa0: 20 20 20 20 20 20 3b 20 35 20 0a 09 09 09 09 20        ; 5 ..... 
aab0: 20 20 22 53 74 61 74 75 73 22 20 20 20 20 20 20    "Status"      
aac0: 20 20 20 20 20 20 3b 20 36 20 20 0a 09 09 09 09        ; 6  .....
aad0: 20 20 20 22 46 69 6e 61 6c 20 4c 6f 67 22 20 20     "Final Log"  
aae0: 20 20 20 20 20 20 20 3b 20 37 20 0a 09 09 09 09         ; 7 .....
aaf0: 20 20 20 22 52 75 6e 20 44 75 72 61 74 69 6f 6e     "Run Duration
ab00: 22 20 20 20 20 20 20 3b 20 38 20 0a 09 09 09 09  "      ; 8 .....
ab10: 20 20 20 22 57 68 65 6e 20 52 75 6e 22 20 20 20     "When Run"   
ab20: 20 20 20 20 20 20 20 3b 20 39 20 0a 09 09 09 09         ; 9 .....
ab30: 20 20 20 22 54 61 67 73 22 20 20 20 20 20 20 20     "Tags"       
ab40: 20 20 20 20 20 20 20 3b 20 31 30 0a 09 09 09 09         ; 10.....
ab50: 20 20 20 22 52 75 6e 20 4f 77 6e 65 72 22 20 20     "Run Owner"  
ab60: 20 20 20 20 20 20 20 3b 20 31 31 0a 09 09 09 09         ; 11.....
ab70: 20 20 20 22 43 6f 6d 6d 65 6e 74 22 20 20 20 20     "Comment"    
ab80: 20 20 20 20 20 20 20 3b 20 31 32 0a 09 09 09 09         ; 12.....
ab90: 20 20 20 22 41 75 74 68 6f 72 22 20 20 20 20 20     "Author"     
aba0: 20 20 20 20 20 20 20 3b 20 31 33 0a 09 09 09 09         ; 13.....
abb0: 20 20 20 22 54 65 73 74 20 4f 77 6e 65 72 22 20     "Test Owner" 
abc0: 20 20 20 20 20 20 20 3b 20 31 34 0a 09 09 09 09         ; 14.....
abd0: 20 20 20 22 52 65 76 69 65 77 65 64 22 20 20 20     "Reviewed"   
abe0: 20 20 20 20 20 20 20 3b 20 31 35 0a 09 09 09 09         ; 15.....
abf0: 20 20 20 22 44 69 73 6b 66 72 65 65 22 20 20 20     "Diskfree"   
ac00: 20 20 20 20 20 20 20 3b 20 31 36 0a 09 09 09 09         ; 16.....
ac10: 20 20 20 22 55 6e 61 6d 65 22 20 20 20 20 20 20     "Uname"      
ac20: 20 20 20 20 20 20 20 3b 20 31 37 0a 09 09 09 09         ; 17.....
ac30: 20 20 20 22 52 75 6e 64 69 72 22 20 20 20 20 20     "Rundir"     
ac40: 20 20 20 20 20 20 20 3b 20 31 38 0a 09 09 09 09         ; 18.....
ac50: 20 20 20 22 48 6f 73 74 22 20 20 20 20 20 20 20     "Host"       
ac60: 20 20 20 20 20 20 20 3b 20 31 39 0a 09 09 09 09         ; 19.....
ac70: 20 20 20 22 43 70 75 20 4c 6f 61 64 22 20 20 20     "Cpu Load"   
ac80: 20 20 20 20 20 20 20 3b 20 32 30 0a 09 09 09 09         ; 20.....
ac90: 20 20 20 29 29 29 0a 09 20 28 72 65 73 75 6c 74     ))).. (result
aca0: 73 20 28 6c 69 73 74 20 72 75 6e 73 68 65 61 64  s (list runshead
acb0: 65 72 29 29 09 09 09 20 0a 09 20 28 74 65 73 74  er))... .. (test
acc0: 64 61 74 61 2d 68 65 61 64 65 72 20 28 6c 69 73  data-header (lis
acd0: 74 20 22 52 75 6e 20 49 64 22 20 22 54 65 73 74  t "Run Id" "Test
ace0: 6e 61 6d 65 22 20 22 49 74 65 6d 20 50 61 74 68  name" "Item Path
acf0: 22 20 22 43 61 74 65 67 6f 72 79 22 20 22 56 61  " "Category" "Va
ad00: 72 69 61 62 6c 65 22 20 22 56 61 6c 75 65 22 20  riable" "Value" 
ad10: 22 45 78 70 65 63 74 65 64 22 20 22 54 6f 6c 22  "Expected" "Tol"
ad20: 20 22 55 6e 69 74 73 22 20 22 53 74 61 74 75 73   "Units" "Status
ad30: 22 20 22 43 6f 6d 6d 65 6e 74 22 29 29 0a 09 20  " "Comment")).. 
ad40: 28 6d 61 69 6e 71 72 79 20 28 63 6f 6e 63 20 22  (mainqry (conc "
ad50: 53 45 4c 45 43 54 0a 20 20 20 20 20 20 20 20 20  SELECT.         
ad60: 20 20 20 20 20 74 2e 74 65 73 74 6e 61 6d 65 2c       t.testname,
ad70: 72 2e 69 64 2c 72 75 6e 6e 61 6d 65 2c 22 20 6b  r.id,runname," k
ad80: 65 79 73 73 74 72 20 22 2c 74 2e 74 65 73 74 6e  eysstr ",t.testn
ad90: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
ada0: 20 20 20 74 2e 69 74 65 6d 5f 70 61 74 68 2c 74     t.item_path,t
adb0: 6d 2e 64 65 73 63 72 69 70 74 69 6f 6e 2c 74 2e  m.description,t.
adc0: 73 74 61 74 65 2c 74 2e 73 74 61 74 75 73 2c 0a  state,t.status,.
add0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
ade0: 6e 61 6c 5f 6c 6f 67 66 2c 72 75 6e 5f 64 75 72  nal_logf,run_dur
adf0: 61 74 69 6f 6e 2c 20 0a 20 20 20 20 20 20 20 20  ation, .        
ae00: 20 20 20 20 20 20 73 74 72 66 74 69 6d 65 28 27        strftime('
ae10: 25 6d 2f 25 64 2f 25 59 20 25 48 3a 25 4d 3a 25  %m/%d/%Y %H:%M:%
ae20: 53 27 2c 64 61 74 65 74 69 6d 65 28 74 2e 65 76  S',datetime(t.ev
ae30: 65 6e 74 5f 74 69 6d 65 2c 27 75 6e 69 78 65 70  ent_time,'unixep
ae40: 6f 63 68 27 29 2c 27 6c 6f 63 61 6c 74 69 6d 65  och'),'localtime
ae50: 27 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '),.            
ae60: 20 20 74 6d 2e 74 61 67 73 2c 72 2e 6f 77 6e 65    tm.tags,r.owne
ae70: 72 2c 74 2e 63 6f 6d 6d 65 6e 74 2c 0a 20 20 20  r,t.comment,.   
ae80: 20 20 20 20 20 20 20 20 20 20 20 61 75 74 68 6f             autho
ae90: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
aea0: 20 74 6d 2e 6f 77 6e 65 72 2c 72 65 76 69 65 77   tm.owner,review
aeb0: 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
aec0: 20 20 64 69 73 6b 66 72 65 65 2c 75 6e 61 6d 65    diskfree,uname
aed0: 2c 72 75 6e 64 69 72 2c 0a 20 20 20 20 20 20 20  ,rundir,.       
aee0: 20 20 20 20 20 20 20 68 6f 73 74 2c 63 70 75 6c         host,cpul
aef0: 6f 61 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  oad.            
af00: 46 52 4f 4d 20 74 65 73 74 73 20 41 53 20 74 20  FROM tests AS t 
af10: 4a 4f 49 4e 20 72 75 6e 73 20 41 53 20 72 20 4f  JOIN runs AS r O
af20: 4e 20 74 2e 72 75 6e 5f 69 64 3d 72 2e 69 64 20  N t.run_id=r.id 
af30: 4a 4f 49 4e 20 74 65 73 74 5f 6d 65 74 61 20 41  JOIN test_meta A
af40: 53 20 74 6d 20 4f 4e 20 74 6d 2e 74 65 73 74 6e  S tm ON tm.testn
af50: 61 6d 65 3d 74 2e 74 65 73 74 6e 61 6d 65 0a 20  ame=t.testname. 
af60: 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45             WHERE
af70: 20 72 75 6e 6e 61 6d 65 20 4c 49 4b 45 20 3f 20   runname LIKE ? 
af80: 41 4e 44 20 22 20 6b 65 79 71 72 79 20 22 3b 22  AND " keyqry ";"
af90: 29 29 29 0a 20 20 20 20 28 64 65 62 75 67 3a 70  ))).    (debug:p
afa0: 72 69 6e 74 20 32 20 22 55 73 69 6e 67 20 22 20  rint 2 "Using " 
afb0: 74 65 6d 70 64 69 72 20 22 20 66 6f 72 20 63 6f  tempdir " for co
afc0: 6e 73 74 72 75 63 74 69 6e 67 20 74 68 65 20 6f  nstructing the o
afd0: 64 73 20 66 69 6c 65 2e 20 6b 65 79 71 72 79 3a  ds file. keyqry:
afe0: 20 22 20 6b 65 79 71 72 79 20 22 20 6b 65 79 73   " keyqry " keys
aff0: 74 72 3a 20 22 20 6b 65 79 73 73 74 72 20 22 20  tr: " keysstr " 
b000: 77 69 74 68 20 6b 65 79 73 3a 20 22 20 28 6d 61  with keys: " (ma
b010: 70 20 63 61 64 72 20 6b 65 79 70 61 74 74 2d 61  p cadr keypatt-a
b020: 6c 69 73 74 29 0a 09 09 20 22 5c 6e 20 20 20 20  list)... "\n    
b030: 20 20 6d 61 69 6e 71 72 79 3a 20 22 20 6d 61 69    mainqry: " mai
b040: 6e 71 72 79 29 0a 20 20 20 20 3b 3b 20 22 45 78  nqry).    ;; "Ex
b050: 70 65 63 74 65 64 20 56 61 6c 75 65 22 0a 20 20  pected Value".  
b060: 20 20 3b 3b 20 22 56 61 6c 75 65 20 46 6f 75 6e    ;; "Value Foun
b070: 64 22 0a 20 20 20 20 3b 3b 20 22 54 6f 6c 65 72  d".    ;; "Toler
b080: 61 6e 63 65 22 0a 20 20 20 20 28 61 70 70 6c 79  ance".    (apply
b090: 20 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63   sqlite3:for-eac
b0a0: 68 2d 72 6f 77 0a 09 20 20 20 28 6c 61 6d 62 64  h-row..   (lambd
b0b0: 61 20 28 74 65 73 74 2d 69 64 20 2e 20 62 29 0a  a (test-id . b).
b0c0: 09 20 20 20 20 20 28 73 65 74 21 20 74 65 73 74  .     (set! test
b0d0: 2d 69 64 73 20 28 63 6f 6e 73 20 74 65 73 74 2d  -ids (cons test-
b0e0: 69 64 20 74 65 73 74 2d 69 64 73 29 29 20 20 20  id test-ids))   
b0f0: 3b 3b 20 74 65 73 74 2d 69 64 20 69 73 20 6e 6f  ;; test-id is no
b100: 77 20 74 65 73 74 6e 61 6d 65 0a 09 20 20 20 20  w testname..    
b110: 20 28 73 65 74 21 20 72 65 73 75 6c 74 73 20 28   (set! results (
b120: 61 70 70 65 6e 64 20 72 65 73 75 6c 74 73 20 3b  append results ;
b130: 3b 20 6e 6f 74 65 2c 20 64 72 6f 70 20 74 68 65  ; note, drop the
b140: 20 74 65 73 74 2d 69 64 0a 09 09 09 09 20 20 20   test-id.....   
b150: 28 6c 69 73 74 0a 09 09 09 09 20 20 20 20 28 69  (list.....    (i
b160: 66 20 70 61 74 68 6d 6f 64 0a 09 09 09 09 09 28  f pathmod......(
b170: 6c 65 74 2a 20 28 28 76 62 20 20 20 20 20 20 20  let* ((vb       
b180: 20 28 61 70 70 6c 79 20 76 65 63 74 6f 72 20 62   (apply vector b
b190: 29 29 0a 09 09 09 09 09 20 20 20 20 20 20 20 28  ))......       (
b1a0: 6b 65 79 76 61 6c 73 20 20 20 28 6c 65 74 20 6c  keyvals   (let l
b1b0: 6f 6f 70 20 28 28 69 20 20 20 20 30 29 0a 09 09  oop ((i    0)...
b1c0: 09 09 09 09 09 09 20 20 20 20 20 28 72 65 73 20  ......     (res 
b1d0: 27 28 29 29 29 0a 09 09 09 09 09 09 09 20 20 20  '()))........   
b1e0: 20 28 69 66 20 28 3e 3d 20 69 20 6e 75 6d 6b 65   (if (>= i numke
b1f0: 79 73 29 0a 09 09 09 09 09 09 09 09 72 65 73 0a  ys).........res.
b200: 09 09 09 09 09 09 09 09 28 6c 6f 6f 70 20 28 2b  ........(loop (+
b210: 20 69 20 31 29 0a 09 09 09 09 09 09 09 09 20 20   i 1).........  
b220: 20 20 20 20 28 61 70 70 65 6e 64 20 72 65 73 20      (append res 
b230: 28 6c 69 73 74 20 28 76 65 63 74 6f 72 2d 72 65  (list (vector-re
b240: 66 20 76 62 20 28 2b 20 69 20 32 29 29 29 29 29  f vb (+ i 2)))))
b250: 29 29 29 0a 09 09 09 09 09 20 20 20 20 20 20 20  )))......       
b260: 28 72 75 6e 6e 61 6d 65 20 20 20 28 76 65 63 74  (runname   (vect
b270: 6f 72 2d 72 65 66 20 76 62 20 31 29 29 0a 09 09  or-ref vb 1))...
b280: 09 09 09 20 20 20 20 20 20 20 28 74 65 73 74 6e  ...       (testn
b290: 61 6d 65 20 20 28 76 65 63 74 6f 72 2d 72 65 66  ame  (vector-ref
b2a0: 20 76 62 20 28 2b 20 20 32 20 6e 75 6d 6b 65 79   vb (+  2 numkey
b2b0: 73 29 29 29 0a 09 09 09 09 09 20 20 20 20 20 20  s)))......      
b2c0: 20 28 69 74 65 6d 2d 70 61 74 68 20 28 76 65 63   (item-path (vec
b2d0: 74 6f 72 2d 72 65 66 20 76 62 20 28 2b 20 20 33  tor-ref vb (+  3
b2e0: 20 6e 75 6d 6b 65 79 73 29 29 29 0a 09 09 09 09   numkeys))).....
b2f0: 09 20 20 20 20 20 20 20 28 66 69 6e 61 6c 2d 6c  .       (final-l
b300: 6f 67 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76  og (vector-ref v
b310: 62 20 28 2b 20 20 37 20 6e 75 6d 6b 65 79 73 29  b (+  7 numkeys)
b320: 29 29 0a 09 09 09 09 09 20 20 20 20 20 20 20 28  ))......       (
b330: 72 75 6e 2d 64 69 72 20 20 20 28 76 65 63 74 6f  run-dir   (vecto
b340: 72 2d 72 65 66 20 76 62 20 28 2b 20 31 38 20 6e  r-ref vb (+ 18 n
b350: 75 6d 6b 65 79 73 29 29 29 0a 09 09 09 09 09 20  umkeys)))...... 
b360: 20 20 20 20 20 20 28 6c 6f 67 2d 66 70 61 74 68        (log-fpath
b370: 20 28 63 6f 6e 63 20 72 75 6e 2d 64 69 72 20 22   (conc run-dir "
b380: 2f 22 20 20 66 69 6e 61 6c 2d 6c 6f 67 29 29 29  /"  final-log)))
b390: 20 3b 3b 20 28 73 74 72 69 6e 67 2d 69 6e 74 65   ;; (string-inte
b3a0: 72 73 70 65 72 73 65 20 6b 65 79 76 61 6c 73 20  rsperse keyvals 
b3b0: 22 2f 22 29 20 22 2f 22 20 74 65 73 74 6e 61 6d  "/") "/" testnam
b3c0: 65 20 22 2f 22 20 69 74 65 6d 2d 70 61 74 68 20  e "/" item-path 
b3d0: 22 2f 22 0a 09 09 09 09 09 20 20 28 64 65 62 75  "/"......  (debu
b3e0: 67 3a 70 72 69 6e 74 20 34 20 22 6c 6f 67 3a 20  g:print 4 "log: 
b3f0: 22 20 6c 6f 67 2d 66 70 61 74 68 20 22 20 65 78  " log-fpath " ex
b400: 69 73 74 73 3a 20 22 20 28 66 69 6c 65 2d 65 78  ists: " (file-ex
b410: 69 73 74 73 3f 20 6c 6f 67 2d 66 70 61 74 68 29  ists? log-fpath)
b420: 29 0a 09 09 09 09 09 20 20 28 76 65 63 74 6f 72  )......  (vector
b430: 2d 73 65 74 21 20 76 62 20 28 2b 20 37 20 6e 75  -set! vb (+ 7 nu
b440: 6d 6b 65 79 73 29 20 28 69 66 20 28 66 69 6c 65  mkeys) (if (file
b450: 2d 65 78 69 73 74 73 3f 20 6c 6f 67 2d 66 70 61  -exists? log-fpa
b460: 74 68 29 0a 09 09 09 09 09 09 09 09 09 20 20 20  th)..........   
b470: 20 28 6c 65 74 20 28 28 6e 65 77 70 61 74 68 20   (let ((newpath 
b480: 28 63 6f 6e 63 20 70 61 74 68 6d 6f 64 20 22 2f  (conc pathmod "/
b490: 22 0a 09 09 09 09 09 09 09 09 09 09 09 09 20 28  "............. (
b4a0: 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72  string-intersper
b4b0: 73 65 20 6b 65 79 76 61 6c 73 20 22 2f 22 29 0a  se keyvals "/").
b4c0: 09 09 09 09 09 09 09 09 09 09 09 09 20 22 2f 22  ............ "/"
b4d0: 20 72 75 6e 6e 61 6d 65 20 22 2f 22 20 74 65 73   runname "/" tes
b4e0: 74 6e 61 6d 65 20 22 2f 22 0a 09 09 09 09 09 09  tname "/".......
b4f0: 09 09 09 09 09 09 20 28 69 66 20 28 73 74 72 69  ...... (if (stri
b500: 6e 67 3d 3f 20 69 74 65 6d 2d 70 61 74 68 20 22  ng=? item-path "
b510: 22 29 20 22 22 20 28 63 6f 6e 63 20 22 2f 22 20  ") "" (conc "/" 
b520: 69 74 65 6d 2d 70 61 74 68 29 29 0a 09 09 09 09  item-path)).....
b530: 09 09 09 09 09 09 09 09 20 66 69 6e 61 6c 2d 6c  ........ final-l
b540: 6f 67 29 29 29 0a 09 09 09 09 09 09 09 09 09 20  og))).......... 
b550: 20 20 20 20 20 3b 3b 20 66 6f 72 20 6e 6f 77 20       ;; for now 
b560: 74 68 72 6f 77 20 61 77 61 79 20 6e 65 77 70 61  throw away newpa
b570: 74 68 20 61 6e 64 20 75 73 65 20 74 68 65 20 6c  th and use the l
b580: 6f 67 2d 66 70 61 74 68 20 63 6f 6e 63 27 64 20  og-fpath conc'd 
b590: 77 69 74 68 20 70 61 74 68 6d 6f 64 0a 09 09 09  with pathmod....
b5a0: 09 09 09 09 09 09 20 20 20 20 20 20 28 73 65 74  ......      (set
b5b0: 21 20 6e 65 77 70 61 74 68 20 28 63 6f 6e 63 20  ! newpath (conc 
b5c0: 70 61 74 68 6d 6f 64 20 6c 6f 67 2d 66 70 61 74  pathmod log-fpat
b5d0: 68 29 29 0a 09 09 09 09 09 09 09 09 09 20 20 20  h))..........   
b5e0: 20 20 20 28 69 66 20 77 69 6e 64 6f 77 73 20 28     (if windows (
b5f0: 73 74 72 69 6e 67 2d 74 72 61 6e 73 6c 61 74 65  string-translate
b600: 20 6e 65 77 70 61 74 68 20 22 2f 22 20 22 5c 5c   newpath "/" "\\
b610: 22 29 20 6e 65 77 70 61 74 68 29 29 0a 09 09 09  ") newpath))....
b620: 09 09 09 09 09 09 20 20 20 20 28 69 66 20 28 3e  ......    (if (>
b630: 20 2a 76 65 72 62 6f 73 69 74 79 2a 20 31 29 0a   *verbosity* 1).
b640: 09 09 09 09 09 09 09 09 09 09 28 63 6f 6e 63 20  ..........(conc 
b650: 66 69 6e 61 6c 2d 6c 6f 67 20 22 20 6e 6f 74 2d  final-log " not-
b660: 66 6f 75 6e 64 22 29 0a 09 09 09 09 09 09 09 09  found").........
b670: 09 09 22 22 29 29 29 0a 09 09 09 09 09 20 20 28  .."")))......  (
b680: 76 65 63 74 6f 72 2d 3e 6c 69 73 74 20 76 62 29  vector->list vb)
b690: 29 0a 09 09 09 09 09 62 29 29 29 29 29 0a 09 20  )......b))))).. 
b6a0: 20 20 64 62 0a 09 20 20 20 6d 61 69 6e 71 72 79    db..   mainqry
b6b0: 0a 09 20 20 20 72 75 6e 73 70 61 74 74 20 28 6d  ..   runspatt (m
b6c0: 61 70 20 63 61 64 72 20 6b 65 79 70 61 74 74 2d  ap cadr keypatt-
b6d0: 61 6c 69 73 74 29 29 0a 20 20 20 20 28 64 65 62  alist)).    (deb
b6e0: 75 67 3a 70 72 69 6e 74 20 32 20 22 46 6f 75 6e  ug:print 2 "Foun
b6f0: 64 20 22 20 28 6c 65 6e 67 74 68 20 74 65 73 74  d " (length test
b700: 2d 69 64 73 29 20 22 20 72 65 63 6f 72 64 73 22  -ids) " records"
b710: 29 0a 20 20 20 20 28 73 65 74 21 20 72 65 73 75  ).    (set! resu
b720: 6c 74 73 20 28 6c 69 73 74 20 28 63 6f 6e 73 20  lts (list (cons 
b730: 22 52 75 6e 73 22 20 72 65 73 75 6c 74 73 29 29  "Runs" results))
b740: 29 0a 20 20 20 20 3b 3b 20 6e 6f 77 2c 20 66 6f  ).    ;; now, fo
b750: 72 20 65 61 63 68 20 74 65 73 74 2c 20 63 6f 6c  r each test, col
b760: 6c 65 63 74 20 74 68 65 20 74 65 73 74 5f 64 61  lect the test_da
b770: 74 61 20 69 6e 66 6f 20 61 6e 64 20 61 64 64 20  ta info and add 
b780: 61 20 6e 65 77 20 73 68 65 65 74 0a 20 20 20 20  a new sheet.    
b790: 28 66 6f 72 2d 65 61 63 68 0a 20 20 20 20 20 28  (for-each.     (
b7a0: 6c 61 6d 62 64 61 20 28 74 65 73 74 2d 69 64 29  lambda (test-id)
b7b0: 0a 20 20 20 20 20 20 20 28 6c 65 74 20 28 28 74  .       (let ((t
b7c0: 65 73 74 2d 64 61 74 61 20 28 6c 69 73 74 20 74  est-data (list t
b7d0: 65 73 74 64 61 74 61 2d 68 65 61 64 65 72 29 29  estdata-header))
b7e0: 0a 09 20 20 20 20 20 28 63 75 72 72 2d 74 65 73  ..     (curr-tes
b7f0: 74 2d 6e 61 6d 65 20 23 66 29 29 0a 09 20 28 73  t-name #f)).. (s
b800: 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d  qlite3:for-each-
b810: 72 6f 77 0a 09 20 20 28 6c 61 6d 62 64 61 20 28  row..  (lambda (
b820: 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20  run-id testname 
b830: 69 74 65 6d 2d 70 61 74 68 20 63 61 74 65 67 6f  item-path catego
b840: 72 79 20 76 61 72 69 61 62 6c 65 20 76 61 6c 75  ry variable valu
b850: 65 20 65 78 70 65 63 74 65 64 20 74 6f 6c 20 75  e expected tol u
b860: 6e 69 74 73 20 73 74 61 74 75 73 20 63 6f 6d 6d  nits status comm
b870: 65 6e 74 29 0a 09 20 20 20 20 28 73 65 74 21 20  ent)..    (set! 
b880: 63 75 72 72 2d 74 65 73 74 2d 6e 61 6d 65 20 74  curr-test-name t
b890: 65 73 74 6e 61 6d 65 29 0a 09 20 20 20 20 28 73  estname)..    (s
b8a0: 65 74 21 20 74 65 73 74 2d 64 61 74 61 20 28 61  et! test-data (a
b8b0: 70 70 65 6e 64 20 74 65 73 74 2d 64 61 74 61 20  ppend test-data 
b8c0: 28 6c 69 73 74 20 28 6c 69 73 74 20 72 75 6e 2d  (list (list run-
b8d0: 69 64 20 74 65 73 74 6e 61 6d 65 20 69 74 65 6d  id testname item
b8e0: 2d 70 61 74 68 20 63 61 74 65 67 6f 72 79 20 76  -path category v
b8f0: 61 72 69 61 62 6c 65 20 76 61 6c 75 65 20 65 78  ariable value ex
b900: 70 65 63 74 65 64 20 74 6f 6c 20 75 6e 69 74 73  pected tol units
b910: 20 73 74 61 74 75 73 20 63 6f 6d 6d 65 6e 74 29   status comment)
b920: 29 29 29 29 0a 09 20 20 64 62 20 0a 09 20 20 3b  ))))..  db ..  ;
b930: 3b 20 22 53 45 4c 45 43 54 20 72 75 6e 5f 69 64  ; "SELECT run_id
b940: 2c 74 65 73 74 6e 61 6d 65 2c 69 74 65 6d 5f 70  ,testname,item_p
b950: 61 74 68 2c 63 61 74 65 67 6f 72 79 2c 76 61 72  ath,category,var
b960: 69 61 62 6c 65 2c 74 64 2e 76 61 6c 75 65 20 41  iable,td.value A
b970: 53 20 76 61 6c 75 65 2c 65 78 70 65 63 74 65 64  S value,expected
b980: 2c 74 6f 6c 2c 75 6e 69 74 73 2c 74 64 2e 73 74  ,tol,units,td.st
b990: 61 74 75 73 20 41 53 20 73 74 61 74 75 73 2c 74  atus AS status,t
b9a0: 64 2e 63 6f 6d 6d 65 6e 74 20 41 53 20 63 6f 6d  d.comment AS com
b9b0: 6d 65 6e 74 20 46 52 4f 4d 20 74 65 73 74 5f 64  ment FROM test_d
b9c0: 61 74 61 20 41 53 20 74 64 20 49 4e 4e 45 52 20  ata AS td INNER 
b9d0: 4a 4f 49 4e 20 74 65 73 74 73 20 4f 4e 20 74 65  JOIN tests ON te
b9e0: 73 74 73 2e 69 64 3d 74 64 2e 74 65 73 74 5f 69  sts.id=td.test_i
b9f0: 64 20 57 48 45 52 45 20 74 65 73 74 5f 69 64 3d  d WHERE test_id=
ba00: 3f 3b 22 0a 09 20 20 22 53 45 4c 45 43 54 20 72  ?;"..  "SELECT r
ba10: 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d 65 2c 69  un_id,testname,i
ba20: 74 65 6d 5f 70 61 74 68 2c 63 61 74 65 67 6f 72  tem_path,categor
ba30: 79 2c 76 61 72 69 61 62 6c 65 2c 74 64 2e 76 61  y,variable,td.va
ba40: 6c 75 65 20 41 53 20 76 61 6c 75 65 2c 74 64 2e  lue AS value,td.
ba50: 65 78 70 65 63 74 65 64 2c 74 64 2e 74 6f 6c 2c  expected,td.tol,
ba60: 74 64 2e 75 6e 69 74 73 2c 74 64 2e 73 74 61 74  td.units,td.stat
ba70: 75 73 20 41 53 20 73 74 61 74 75 73 2c 74 64 2e  us AS status,td.
ba80: 63 6f 6d 6d 65 6e 74 20 41 53 20 63 6f 6d 6d 65  comment AS comme
ba90: 6e 74 20 46 52 4f 4d 20 74 65 73 74 5f 64 61 74  nt FROM test_dat
baa0: 61 20 41 53 20 74 64 20 49 4e 4e 45 52 20 4a 4f  a AS td INNER JO
bab0: 49 4e 20 74 65 73 74 73 20 4f 4e 20 74 65 73 74  IN tests ON test
bac0: 73 2e 69 64 3d 74 64 2e 74 65 73 74 5f 69 64 20  s.id=td.test_id 
bad0: 57 48 45 52 45 20 74 65 73 74 6e 61 6d 65 3d 3f  WHERE testname=?
bae0: 3b 22 0a 09 20 20 74 65 73 74 2d 69 64 29 0a 09  ;"..  test-id)..
baf0: 20 28 69 66 20 63 75 72 72 2d 74 65 73 74 2d 6e   (if curr-test-n
bb00: 61 6d 65 0a 09 20 20 20 20 20 28 73 65 74 21 20  ame..     (set! 
bb10: 72 65 73 75 6c 74 73 20 28 61 70 70 65 6e 64 20  results (append 
bb20: 72 65 73 75 6c 74 73 20 28 6c 69 73 74 20 28 63  results (list (c
bb30: 6f 6e 73 20 63 75 72 72 2d 74 65 73 74 2d 6e 61  ons curr-test-na
bb40: 6d 65 20 74 65 73 74 2d 64 61 74 61 29 29 29 29  me test-data))))
bb50: 29 0a 09 20 29 29 0a 20 20 20 20 20 28 73 6f 72  ).. )).     (sor
bb60: 74 20 28 64 65 6c 65 74 65 2d 64 75 70 6c 69 63  t (delete-duplic
bb70: 61 74 65 73 20 74 65 73 74 2d 69 64 73 29 20 73  ates test-ids) s
bb80: 74 72 69 6e 67 3c 3d 29 29 0a 20 20 20 20 28 73  tring<=)).    (s
bb90: 79 73 74 65 6d 20 28 63 6f 6e 63 20 22 6d 6b 64  ystem (conc "mkd
bba0: 69 72 20 2d 70 20 22 20 74 65 6d 70 64 69 72 29  ir -p " tempdir)
bbb0: 29 0a 20 20 20 20 3b 3b 20 28 70 70 20 72 65 73  ).    ;; (pp res
bbc0: 75 6c 74 73 29 0a 20 20 20 20 28 6f 64 73 3a 6c  ults).    (ods:l
bbd0: 69 73 74 2d 3e 6f 64 73 20 0a 20 20 20 20 20 74  ist->ods .     t
bbe0: 65 6d 70 64 69 72 0a 20 20 20 20 20 28 69 66 20  empdir.     (if 
bbf0: 28 73 74 72 69 6e 67 2d 6d 61 74 63 68 20 28 72  (string-match (r
bc00: 65 67 65 78 70 20 22 5e 5b 2f 7e 5d 2b 2e 2a 22  egexp "^[/~]+.*"
bc10: 29 20 6f 75 74 70 75 74 66 69 6c 65 29 20 3b 3b  ) outputfile) ;;
bc20: 20 66 75 6c 6c 20 70 61 74 68 3f 0a 09 20 6f 75   full path?.. ou
bc30: 74 70 75 74 66 69 6c 65 0a 09 20 28 62 65 67 69  tputfile.. (begi
bc40: 6e 0a 09 20 20 20 28 64 65 62 75 67 3a 70 72 69  n..   (debug:pri
bc50: 6e 74 20 30 20 22 57 41 52 4e 49 4e 47 3a 20 70  nt 0 "WARNING: p
bc60: 61 74 68 20 67 69 76 65 6e 2c 20 22 20 6f 75 74  ath given, " out
bc70: 70 75 74 66 69 6c 65 20 22 20 69 73 20 72 65 6c  putfile " is rel
bc80: 61 74 69 76 65 2c 20 70 72 65 66 69 78 69 6e 67  ative, prefixing
bc90: 20 77 69 74 68 20 63 75 72 72 65 6e 74 20 64 69   with current di
bca0: 72 65 63 74 6f 72 79 22 29 0a 09 20 20 20 28 63  rectory")..   (c
bcb0: 6f 6e 63 20 28 63 75 72 72 65 6e 74 2d 64 69 72  onc (current-dir
bcc0: 65 63 74 6f 72 79 29 20 22 2f 22 20 6f 75 74 70  ectory) "/" outp
bcd0: 75 74 66 69 6c 65 29 29 29 0a 20 20 20 20 20 72  utfile))).     r
bce0: 65 73 75 6c 74 73 29 0a 20 20 20 20 3b 3b 20 62  esults).    ;; b
bcf0: 72 75 74 61 6c 20 63 6c 65 61 6e 20 75 70 0a 20  rutal clean up. 
bd00: 20 20 20 28 73 79 73 74 65 6d 20 22 72 6d 20 2d     (system "rm -
bd10: 72 66 20 74 65 6d 70 64 69 72 22 29 29 29 0a 0a  rf tempdir")))..
bd20: 3b 3b 20 28 64 62 3a 65 78 74 72 61 63 74 2d 6f  ;; (db:extract-o
bd30: 64 73 2d 66 69 6c 65 20 64 62 20 22 6f 75 74 70  ds-file db "outp
bd40: 75 74 66 69 6c 65 2e 6f 64 73 22 20 27 28 28 22  utfile.ods" '(("
bd50: 73 79 73 6e 61 6d 65 22 20 22 25 22 29 28 22 66  sysname" "%")("f
bd60: 73 6e 61 6d 65 22 20 22 25 22 29 28 22 64 61 74  sname" "%")("dat
bd70: 61 70 61 74 68 22 20 22 25 22 29 29 20 22 25 22  apath" "%")) "%"
bd80: 29 0a 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  )...;;==========
bd90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
bda0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
bdb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
bdc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20  ============.;; 
bdd0: 52 45 4d 4f 54 45 20 44 42 20 41 43 43 45 53 53  REMOTE DB ACCESS
bde0: 20 56 49 41 20 52 50 43 0a 3b 3b 3d 3d 3d 3d 3d   VIA RPC.;;=====
bdf0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
be00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
be10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
be20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
be30: 3d 0a 0a 28 64 65 66 69 6e 65 20 28 72 64 62 3a  =..(define (rdb:
be40: 73 65 74 2d 74 65 73 74 73 2d 73 74 61 74 65 2d  set-tests-state-
be50: 73 74 61 74 75 73 20 64 62 20 72 75 6e 2d 69 64  status db run-id
be60: 20 74 65 73 74 6e 61 6d 65 73 20 63 75 72 72 73   testnames currs
be70: 74 61 74 65 20 63 75 72 72 73 74 61 74 75 73 20  tate currstatus 
be80: 6e 65 77 73 74 61 74 65 20 6e 65 77 73 74 61 74  newstate newstat
be90: 75 73 29 0a 20 20 28 69 66 20 2a 72 75 6e 72 65  us).  (if *runre
bea0: 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c 65 74  mote*.      (let
beb0: 20 28 28 68 6f 73 74 20 28 76 65 63 74 6f 72 2d   ((host (vector-
bec0: 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20  ref *runremote* 
bed0: 30 29 29 0a 09 20 20 20 20 28 70 6f 72 74 20 28  0))..    (port (
bee0: 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72  vector-ref *runr
bef0: 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28 28 72  emote* 1)))..((r
bf00: 70 63 3a 70 72 6f 63 65 64 75 72 65 20 27 72 64  pc:procedure 'rd
bf10: 62 3a 73 65 74 2d 74 65 73 74 73 2d 73 74 61 74  b:set-tests-stat
bf20: 65 2d 73 74 61 74 75 73 20 68 6f 73 74 20 70 6f  e-status host po
bf30: 72 74 29 0a 09 20 72 75 6e 2d 69 64 20 74 65 73  rt).. run-id tes
bf40: 74 6e 61 6d 65 73 20 63 75 72 72 73 74 61 74 65  tnames currstate
bf50: 20 63 75 72 72 73 74 61 74 75 73 20 6e 65 77 73   currstatus news
bf60: 74 61 74 65 20 6e 65 77 73 74 61 74 75 73 29 29  tate newstatus))
bf70: 0a 20 20 20 20 20 20 28 64 62 3a 73 65 74 2d 74  .      (db:set-t
bf80: 65 73 74 73 2d 73 74 61 74 65 2d 73 74 61 74 75  ests-state-statu
bf90: 73 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74  s db run-id test
bfa0: 6e 61 6d 65 73 20 63 75 72 72 73 74 61 74 65 20  names currstate 
bfb0: 63 75 72 72 73 74 61 74 75 73 20 6e 65 77 73 74  currstatus newst
bfc0: 61 74 65 20 6e 65 77 73 74 61 74 75 73 29 29 29  ate newstatus)))
bfd0: 0a 0a 28 64 65 66 69 6e 65 20 28 72 64 62 3a 74  ..(define (rdb:t
bfe0: 65 73 74 73 74 65 70 2d 73 65 74 2d 73 74 61 74  eststep-set-stat
bff0: 75 73 21 20 64 62 20 72 75 6e 2d 69 64 20 74 65  us! db run-id te
c000: 73 74 2d 6e 61 6d 65 20 74 65 73 74 73 74 65 70  st-name teststep
c010: 2d 6e 61 6d 65 20 73 74 61 74 65 2d 69 6e 20 73  -name state-in s
c020: 74 61 74 75 73 2d 69 6e 20 69 74 65 6d 64 61 74  tatus-in itemdat
c030: 20 63 6f 6d 6d 65 6e 74 20 6c 6f 67 66 69 6c 65   comment logfile
c040: 29 0a 20 20 28 6c 65 74 20 28 28 69 74 65 6d 2d  ).  (let ((item-
c050: 70 61 74 68 20 28 69 74 65 6d 2d 6c 69 73 74 2d  path (item-list-
c060: 3e 70 61 74 68 20 69 74 65 6d 64 61 74 29 29 29  >path itemdat)))
c070: 0a 20 20 20 20 28 69 66 20 2a 72 75 6e 72 65 6d  .    (if *runrem
c080: 6f 74 65 2a 0a 09 28 6c 65 74 20 28 28 68 6f 73  ote*..(let ((hos
c090: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72  t (vector-ref *r
c0a0: 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20  unremote* 0)).. 
c0b0: 20 20 20 20 20 28 70 6f 72 74 20 28 76 65 63 74       (port (vect
c0c0: 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74  or-ref *runremot
c0d0: 65 2a 20 31 29 29 29 0a 09 20 20 28 28 72 70 63  e* 1)))..  ((rpc
c0e0: 3a 70 72 6f 63 65 64 75 72 65 20 27 72 64 62 3a  :procedure 'rdb:
c0f0: 74 65 73 74 73 74 65 70 2d 73 65 74 2d 73 74 61  teststep-set-sta
c100: 74 75 73 21 20 68 6f 73 74 20 70 6f 72 74 29 0a  tus! host port).
c110: 09 20 20 20 72 75 6e 2d 69 64 20 74 65 73 74 2d  .   run-id test-
c120: 6e 61 6d 65 20 74 65 73 74 73 74 65 70 2d 6e 61  name teststep-na
c130: 6d 65 20 73 74 61 74 65 2d 69 6e 20 73 74 61 74  me state-in stat
c140: 75 73 2d 69 6e 20 69 74 65 6d 2d 70 61 74 68 20  us-in item-path 
c150: 63 6f 6d 6d 65 6e 74 20 6c 6f 67 66 69 6c 65 29  comment logfile)
c160: 29 0a 09 28 64 62 3a 74 65 73 74 73 74 65 70 2d  )..(db:teststep-
c170: 73 65 74 2d 73 74 61 74 75 73 21 20 64 62 20 72  set-status! db r
c180: 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20  un-id test-name 
c190: 74 65 73 74 73 74 65 70 2d 6e 61 6d 65 20 73 74  teststep-name st
c1a0: 61 74 65 2d 69 6e 20 73 74 61 74 75 73 2d 69 6e  ate-in status-in
c1b0: 20 69 74 65 6d 2d 70 61 74 68 20 63 6f 6d 6d 65   item-path comme
c1c0: 6e 74 20 6c 6f 67 66 69 6c 65 29 29 29 29 0a 0a  nt logfile))))..
c1d0: 28 64 65 66 69 6e 65 20 28 72 64 62 3a 74 65 73  (define (rdb:tes
c1e0: 74 2d 75 70 64 61 74 65 2d 6d 65 74 61 2d 69 6e  t-update-meta-in
c1f0: 66 6f 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73  fo db run-id tes
c200: 74 2d 6e 61 6d 65 20 69 74 65 6d 64 61 74 20 6d  t-name itemdat m
c210: 69 6e 75 74 65 73 20 63 70 75 6c 6f 61 64 20 64  inutes cpuload d
c220: 69 73 6b 66 72 65 65 20 74 6d 70 66 72 65 65 29  iskfree tmpfree)
c230: 0a 20 20 28 6c 65 74 20 28 28 69 74 65 6d 2d 70  .  (let ((item-p
c240: 61 74 68 20 28 69 74 65 6d 2d 6c 69 73 74 2d 3e  ath (item-list->
c250: 70 61 74 68 20 69 74 65 6d 64 61 74 29 29 29 0a  path itemdat))).
c260: 20 20 20 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f      (if *runremo
c270: 74 65 2a 0a 09 28 6c 65 74 20 28 28 68 6f 73 74  te*..(let ((host
c280: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75   (vector-ref *ru
c290: 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20  nremote* 0))..  
c2a0: 20 20 20 20 28 70 6f 72 74 20 28 76 65 63 74 6f      (port (vecto
c2b0: 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65  r-ref *runremote
c2c0: 2a 20 31 29 29 29 0a 09 20 20 28 28 72 70 63 3a  * 1)))..  ((rpc:
c2d0: 70 72 6f 63 65 64 75 72 65 20 27 72 64 62 3a 74  procedure 'rdb:t
c2e0: 65 73 74 2d 75 70 64 61 74 65 2d 6d 65 74 61 2d  est-update-meta-
c2f0: 69 6e 66 6f 20 68 6f 73 74 20 70 6f 72 74 29 0a  info host port).
c300: 09 20 20 20 72 75 6e 2d 69 64 20 74 65 73 74 2d  .   run-id test-
c310: 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 6d  name item-path m
c320: 69 6e 75 74 65 73 20 63 70 75 6c 6f 61 64 20 64  inutes cpuload d
c330: 69 73 6b 66 72 65 65 20 74 6d 70 66 72 65 65 29  iskfree tmpfree)
c340: 29 0a 09 28 64 62 3a 74 65 73 74 2d 75 70 64 61  )..(db:test-upda
c350: 74 65 2d 6d 65 74 61 2d 69 6e 66 6f 20 64 62 20  te-meta-info db 
c360: 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65  run-id test-name
c370: 20 69 74 65 6d 2d 70 61 74 68 20 6d 69 6e 75 74   item-path minut
c380: 65 73 20 63 70 75 6c 6f 61 64 20 64 69 73 6b 66  es cpuload diskf
c390: 72 65 65 20 74 6d 70 66 72 65 65 29 29 29 29 0a  ree tmpfree)))).
c3a0: 0a 28 64 65 66 69 6e 65 20 28 72 64 62 3a 74 65  .(define (rdb:te
c3b0: 73 74 2d 73 65 74 2d 73 74 61 74 65 2d 73 74 61  st-set-state-sta
c3c0: 74 75 73 2d 62 79 2d 72 75 6e 2d 69 64 2d 74 65  tus-by-run-id-te
c3d0: 73 74 6e 61 6d 65 20 64 62 20 72 75 6e 2d 69 64  stname db run-id
c3e0: 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d   test-name item-
c3f0: 70 61 74 68 20 73 74 61 74 75 73 20 73 74 61 74  path status stat
c400: 65 29 0a 20 20 28 69 66 20 2a 72 75 6e 72 65 6d  e).  (if *runrem
c410: 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c 65 74 20  ote*.      (let 
c420: 28 28 68 6f 73 74 20 28 76 65 63 74 6f 72 2d 72  ((host (vector-r
c430: 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30  ef *runremote* 0
c440: 29 29 0a 09 20 20 20 20 28 70 6f 72 74 20 28 76  ))..    (port (v
c450: 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65  ector-ref *runre
c460: 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28 28 72 70  mote* 1)))..((rp
c470: 63 3a 70 72 6f 63 65 64 75 72 65 20 27 72 64 62  c:procedure 'rdb
c480: 3a 74 65 73 74 2d 73 65 74 2d 73 74 61 74 65 2d  :test-set-state-
c490: 73 74 61 74 75 73 2d 62 79 2d 72 75 6e 2d 69 64  status-by-run-id
c4a0: 2d 74 65 73 74 6e 61 6d 65 20 68 6f 73 74 20 70  -testname host p
c4b0: 6f 72 74 29 0a 09 20 20 72 75 6e 2d 69 64 20 74  ort)..  run-id t
c4c0: 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61  est-name item-pa
c4d0: 74 68 20 73 74 61 74 75 73 20 73 74 61 74 65 29  th status state)
c4e0: 29 0a 20 20 20 20 20 20 28 64 62 3a 74 65 73 74  ).      (db:test
c4f0: 2d 73 65 74 2d 73 74 61 74 65 2d 73 74 61 74 75  -set-state-statu
c500: 73 2d 62 79 2d 72 75 6e 2d 69 64 2d 74 65 73 74  s-by-run-id-test
c510: 6e 61 6d 65 20 64 62 20 72 75 6e 2d 69 64 20 74  name db run-id t
c520: 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61  est-name item-pa
c530: 74 68 20 73 74 61 74 75 73 20 73 74 61 74 65 29  th status state)
c540: 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 72 64 62  ))..(define (rdb
c550: 3a 63 73 76 2d 3e 74 65 73 74 2d 64 61 74 61 20  :csv->test-data 
c560: 64 62 20 74 65 73 74 2d 69 64 20 63 73 76 64 61  db test-id csvda
c570: 74 61 29 0a 20 20 28 69 66 20 2a 72 75 6e 72 65  ta).  (if *runre
c580: 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c 65 74  mote*.      (let
c590: 20 28 28 68 6f 73 74 20 28 76 65 63 74 6f 72 2d   ((host (vector-
c5a0: 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20  ref *runremote* 
c5b0: 30 29 29 0a 09 20 20 20 20 28 70 6f 72 74 20 28  0))..    (port (
c5c0: 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72  vector-ref *runr
c5d0: 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28 28 72  emote* 1)))..((r
c5e0: 70 63 3a 70 72 6f 63 65 64 75 72 65 20 27 72 64  pc:procedure 'rd
c5f0: 62 3a 63 73 76 2d 3e 74 65 73 74 2d 64 61 74 61  b:csv->test-data
c600: 20 68 6f 73 74 20 70 6f 72 74 29 0a 09 20 74 65   host port).. te
c610: 73 74 2d 69 64 20 63 73 76 64 61 74 61 29 29 0a  st-id csvdata)).
c620: 20 20 20 20 20 20 28 64 62 3a 63 73 76 2d 3e 74        (db:csv->t
c630: 65 73 74 2d 64 61 74 61 20 64 62 20 74 65 73 74  est-data db test
c640: 2d 69 64 20 63 73 76 64 61 74 61 29 29 29 0a 0a  -id csvdata)))..
c650: 28 64 65 66 69 6e 65 20 28 72 64 62 3a 72 6f 6c  (define (rdb:rol
c660: 6c 2d 75 70 2d 70 61 73 73 2d 66 61 69 6c 2d 63  l-up-pass-fail-c
c670: 6f 75 6e 74 73 20 64 62 20 72 75 6e 2d 69 64 20  ounts db run-id 
c680: 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70  test-name item-p
c690: 61 74 68 20 73 74 61 74 75 73 29 0a 20 20 28 69  ath status).  (i
c6a0: 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20  f *runremote*.  
c6b0: 20 20 20 20 28 6c 65 74 20 28 28 68 6f 73 74 20      (let ((host 
c6c0: 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e  (vector-ref *run
c6d0: 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20 20  remote* 0))..   
c6e0: 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72 2d 72   (port (vector-r
c6f0: 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31  ef *runremote* 1
c700: 29 29 29 0a 09 28 28 72 70 63 3a 70 72 6f 63 65  )))..((rpc:proce
c710: 64 75 72 65 20 27 72 64 62 3a 72 6f 6c 6c 2d 75  dure 'rdb:roll-u
c720: 70 2d 70 61 73 73 2d 66 61 69 6c 2d 63 6f 75 6e  p-pass-fail-coun
c730: 74 73 20 68 6f 73 74 20 70 6f 72 74 29 0a 09 20  ts host port).. 
c740: 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65  run-id test-name
c750: 20 69 74 65 6d 2d 70 61 74 68 20 73 74 61 74 75   item-path statu
c760: 73 29 29 0a 20 20 20 20 20 20 28 64 62 3a 72 6f  s)).      (db:ro
c770: 6c 6c 2d 75 70 2d 70 61 73 73 2d 66 61 69 6c 2d  ll-up-pass-fail-
c780: 63 6f 75 6e 74 73 20 64 62 20 72 75 6e 2d 69 64  counts db run-id
c790: 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d   test-name item-
c7a0: 70 61 74 68 20 73 74 61 74 75 73 29 29 29 0a 0a  path status)))..
c7b0: 28 64 65 66 69 6e 65 20 28 72 64 62 3a 74 65 73  (define (rdb:tes
c7c0: 74 2d 73 65 74 2d 63 6f 6d 6d 65 6e 74 20 64 62  t-set-comment db
c7d0: 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d   run-id test-nam
c7e0: 65 20 69 74 65 6d 2d 70 61 74 68 20 63 6f 6d 6d  e item-path comm
c7f0: 65 6e 74 29 0a 20 20 28 69 66 20 2a 72 75 6e 72  ent).  (if *runr
c800: 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c 65  emote*.      (le
c810: 74 20 28 28 68 6f 73 74 20 28 76 65 63 74 6f 72  t ((host (vector
c820: 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a  -ref *runremote*
c830: 20 30 29 29 0a 09 20 20 20 20 28 70 6f 72 74 20   0))..    (port 
c840: 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e  (vector-ref *run
c850: 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28 28  remote* 1)))..((
c860: 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20 27 72  rpc:procedure 'r
c870: 64 62 3a 74 65 73 74 2d 73 65 74 2d 63 6f 6d 6d  db:test-set-comm
c880: 65 6e 74 20 68 6f 73 74 20 70 6f 72 74 29 0a 09  ent host port)..
c890: 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d   run-id test-nam
c8a0: 65 20 69 74 65 6d 2d 70 61 74 68 20 63 6f 6d 6d  e item-path comm
c8b0: 65 6e 74 29 29 0a 20 20 20 20 20 20 28 64 62 3a  ent)).      (db:
c8c0: 74 65 73 74 2d 73 65 74 2d 63 6f 6d 6d 65 6e 74  test-set-comment
c8d0: 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d   db run-id test-
c8e0: 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 63  name item-path c
c8f0: 6f 6d 6d 65 6e 74 29 29 29 0a 0a 28 64 65 66 69  omment)))..(defi
c900: 6e 65 20 28 72 64 62 3a 74 65 73 74 2d 73 65 74  ne (rdb:test-set
c910: 2d 6c 6f 67 21 20 64 62 20 72 75 6e 2d 69 64 20  -log! db run-id 
c920: 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70  test-name item-p
c930: 61 74 68 20 6c 6f 67 66 29 0a 20 20 28 69 66 20  ath logf).  (if 
c940: 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20  *runremote*.    
c950: 20 20 28 6c 65 74 20 28 28 68 6f 73 74 20 28 76    (let ((host (v
c960: 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65  ector-ref *runre
c970: 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20 20 20 28  mote* 0))..    (
c980: 70 6f 72 74 20 28 76 65 63 74 6f 72 2d 72 65 66  port (vector-ref
c990: 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29   *runremote* 1))
c9a0: 29 0a 09 28 28 72 70 63 3a 70 72 6f 63 65 64 75  )..((rpc:procedu
c9b0: 72 65 20 27 72 70 63 3a 74 65 73 74 2d 73 65 74  re 'rpc:test-set
c9c0: 2d 6c 6f 67 21 20 68 6f 73 74 20 70 6f 72 74 29  -log! host port)
c9d0: 0a 09 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e  .. run-id test-n
c9e0: 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 6c 6f  ame item-path lo
c9f0: 67 66 29 29 0a 20 20 20 20 20 20 28 64 62 3a 74  gf)).      (db:t
ca00: 65 73 74 2d 73 65 74 2d 6c 6f 67 21 20 64 62 20  est-set-log! db 
ca10: 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65  run-id test-name
ca20: 20 69 74 65 6d 2d 70 61 74 68 20 6c 6f 67 66 29   item-path logf)
ca30: 29 29                                            ))