Megatest

Hex Artifact Content
Login

Artifact 05d3c682d2f276a1cce1c9b53411314469d47a9a:


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 74 65 73 74  (define (db:test
4a00: 73 74 65 70 2d 73 65 74 2d 73 74 61 74 75 73 21  step-set-status!
4a10: 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d   db run-id test-
4a20: 6e 61 6d 65 20 74 65 73 74 73 74 65 70 2d 6e 61  name teststep-na
4a30: 6d 65 20 73 74 61 74 65 2d 69 6e 20 73 74 61 74  me state-in stat
4a40: 75 73 2d 69 6e 20 69 74 65 6d 2d 70 61 74 68 20  us-in item-path 
4a50: 63 6f 6d 6d 65 6e 74 20 6c 6f 67 66 69 6c 65 29  comment logfile)
4a60: 0a 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20  .  (debug:print 
4a70: 34 20 22 72 75 6e 2d 69 64 3a 20 22 20 72 75 6e  4 "run-id: " run
4a80: 2d 69 64 20 22 20 74 65 73 74 2d 6e 61 6d 65 3a  -id " test-name:
4a90: 20 22 20 74 65 73 74 2d 6e 61 6d 65 29 0a 20 20   " test-name).  
4aa0: 28 6c 65 74 2a 20 28 28 73 74 61 74 65 20 20 20  (let* ((state   
4ab0: 20 20 28 63 68 65 63 6b 2d 76 61 6c 69 64 2d 69    (check-valid-i
4ac0: 74 65 6d 73 20 22 73 74 61 74 65 22 20 73 74 61  tems "state" sta
4ad0: 74 65 2d 69 6e 29 29 0a 09 20 28 73 74 61 74 75  te-in)).. (statu
4ae0: 73 20 20 20 20 28 63 68 65 63 6b 2d 76 61 6c 69  s    (check-vali
4af0: 64 2d 69 74 65 6d 73 20 22 73 74 61 74 75 73 22  d-items "status"
4b00: 20 73 74 61 74 75 73 2d 69 6e 29 29 0a 09 20 28   status-in)).. (
4b10: 74 65 73 74 64 61 74 20 20 20 28 64 62 3a 67 65  testdat   (db:ge
4b20: 74 2d 74 65 73 74 2d 69 6e 66 6f 20 64 62 20 72  t-test-info db r
4b30: 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20  un-id test-name 
4b40: 69 74 65 6d 2d 70 61 74 68 29 29 29 0a 20 20 20  item-path))).   
4b50: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 35 20   (debug:print 5 
4b60: 22 74 65 73 74 64 61 74 3a 20 22 20 74 65 73 74  "testdat: " test
4b70: 64 61 74 29 0a 20 20 20 20 28 69 66 20 28 61 6e  dat).    (if (an
4b80: 64 20 74 65 73 74 64 61 74 20 3b 3b 20 69 66 20  d testdat ;; if 
4b90: 74 68 65 20 73 65 63 74 69 6f 6e 20 65 78 69 73  the section exis
4ba0: 74 73 20 74 68 65 6e 20 66 6f 72 63 65 20 73 70  ts then force sp
4bb0: 65 63 69 66 69 63 61 74 69 6f 6e 20 42 55 47 2c  ecification BUG,
4bc0: 20 49 20 64 6f 6e 27 74 20 6c 69 6b 65 20 68 6f   I don't like ho
4bd0: 77 20 74 68 69 73 20 77 6f 72 6b 73 2e 0a 09 20  w this works... 
4be0: 20 20 20 20 28 6f 72 20 28 6e 6f 74 20 73 74 61      (or (not sta
4bf0: 74 65 29 28 6e 6f 74 20 73 74 61 74 75 73 29 29  te)(not status))
4c00: 29 0a 09 28 64 65 62 75 67 3a 70 72 69 6e 74 20  )..(debug:print 
4c10: 30 20 22 57 41 52 4e 49 4e 47 3a 20 49 6e 76 61  0 "WARNING: Inva
4c20: 6c 69 64 20 22 20 28 69 66 20 73 74 61 74 75 73  lid " (if status
4c30: 20 22 73 74 61 74 75 73 22 20 22 73 74 61 74 65   "status" "state
4c40: 22 29 0a 09 20 20 20 20 20 20 20 22 20 76 61 6c  ")..       " val
4c50: 75 65 20 5c 22 22 20 28 69 66 20 73 74 61 74 75  ue \"" (if statu
4c60: 73 20 73 74 61 74 65 2d 69 6e 20 73 74 61 74 75  s state-in statu
4c70: 73 2d 69 6e 29 20 22 5c 22 2c 20 75 70 64 61 74  s-in) "\", updat
4c80: 65 20 79 6f 75 72 20 76 61 6c 69 64 76 61 6c 75  e your validvalu
4c90: 65 73 20 73 65 63 74 69 6f 6e 20 69 6e 20 6d 65  es section in me
4ca0: 67 61 74 65 73 74 2e 63 6f 6e 66 69 67 22 29 29  gatest.config"))
4cb0: 0a 20 20 20 20 28 69 66 20 74 65 73 74 64 61 74  .    (if testdat
4cc0: 0a 09 28 6c 65 74 20 28 28 74 65 73 74 2d 69 64  ..(let ((test-id
4cd0: 20 28 74 65 73 74 3a 67 65 74 2d 69 64 20 74 65   (test:get-id te
4ce0: 73 74 64 61 74 29 29 29 0a 09 20 20 3b 3b 20 46  stdat)))..  ;; F
4cf0: 49 58 4d 45 20 2d 20 74 68 69 73 20 73 68 6f 75  IXME - this shou
4d00: 6c 64 20 6e 6f 74 20 75 70 64 61 74 65 20 74 68  ld not update th
4d10: 65 20 6c 6f 67 66 69 6c 65 20 75 6e 6c 65 73 73  e logfile unless
4d20: 20 69 74 20 69 73 20 73 70 65 63 69 66 69 65 64   it is specified
4d30: 2e 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65 78  ...  (sqlite3:ex
4d40: 65 63 75 74 65 20 64 62 20 0a 09 09 09 22 49 4e  ecute db ...."IN
4d50: 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20  SERT OR REPLACE 
4d60: 69 6e 74 6f 20 74 65 73 74 5f 73 74 65 70 73 20  into test_steps 
4d70: 28 74 65 73 74 5f 69 64 2c 73 74 65 70 6e 61 6d  (test_id,stepnam
4d80: 65 2c 73 74 61 74 65 2c 73 74 61 74 75 73 2c 65  e,state,status,e
4d90: 76 65 6e 74 5f 74 69 6d 65 2c 63 6f 6d 6d 65 6e  vent_time,commen
4da0: 74 2c 6c 6f 67 66 69 6c 65 29 20 56 41 4c 55 45  t,logfile) VALUE
4db0: 53 28 3f 2c 3f 2c 3f 2c 3f 2c 73 74 72 66 74 69  S(?,?,?,?,strfti
4dc0: 6d 65 28 27 25 73 27 2c 27 6e 6f 77 27 29 2c 3f  me('%s','now'),?
4dd0: 2c 3f 29 3b 22 0a 09 09 09 74 65 73 74 2d 69 64  ,?);"....test-id
4de0: 20 74 65 73 74 73 74 65 70 2d 6e 61 6d 65 20 73   teststep-name s
4df0: 74 61 74 65 2d 69 6e 20 73 74 61 74 75 73 2d 69  tate-in status-i
4e00: 6e 20 28 69 66 20 63 6f 6d 6d 65 6e 74 20 63 6f  n (if comment co
4e10: 6d 6d 65 6e 74 20 22 22 29 20 28 69 66 20 6c 6f  mment "") (if lo
4e20: 67 66 69 6c 65 20 6c 6f 67 66 69 6c 65 20 22 22  gfile logfile ""
4e30: 29 29 0a 09 20 20 23 74 29 20 3b 3b 20 66 61 6b  ))..  #t) ;; fak
4e40: 65 20 6f 75 74 20 61 20 23 74 20 2d 20 63 6f 75  e out a #t - cou
4e50: 6c 64 20 62 65 20 65 78 65 63 75 74 65 20 69 73  ld be execute is
4e60: 20 72 65 74 75 72 6e 69 6e 67 20 73 6f 6d 65 74   returning somet
4e70: 68 69 6e 67 20 63 6f 6d 70 6c 69 63 61 74 65 64  hing complicated
4e80: 0a 09 28 64 65 62 75 67 3a 70 72 69 6e 74 20 30  ..(debug:print 0
4e90: 20 22 45 52 52 4f 52 3a 20 43 61 6e 27 74 20 75   "ERROR: Can't u
4ea0: 70 64 61 74 65 20 22 20 74 65 73 74 2d 6e 61 6d  pdate " test-nam
4eb0: 65 20 22 20 66 6f 72 20 72 75 6e 20 22 20 72 75  e " for run " ru
4ec0: 6e 2d 69 64 20 22 20 2d 3e 20 6e 6f 20 73 75 63  n-id " -> no suc
4ed0: 68 20 74 65 73 74 20 69 6e 20 64 62 22 29 29 29  h test in db")))
4ee0: 29 0a 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  )...(define (db:
4ef0: 64 65 6c 65 74 65 2d 74 65 73 74 73 2d 69 6e 2d  delete-tests-in-
4f00: 73 74 61 74 65 20 64 62 20 72 75 6e 2d 69 64 20  state db run-id 
4f10: 73 74 61 74 65 29 0a 20 20 28 73 71 6c 69 74 65  state).  (sqlite
4f20: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 44 45  3:execute db "DE
4f30: 4c 45 54 45 20 46 52 4f 4d 20 74 65 73 74 73 20  LETE FROM tests 
4f40: 57 48 45 52 45 20 73 74 61 74 65 3d 3f 20 41 4e  WHERE state=? AN
4f50: 44 20 72 75 6e 5f 69 64 3d 3f 3b 22 20 73 74 61  D run_id=?;" sta
4f60: 74 65 20 72 75 6e 2d 69 64 29 29 0a 0a 28 64 65  te run-id))..(de
4f70: 66 69 6e 65 20 28 64 62 3a 74 65 73 74 2d 73 65  fine (db:test-se
4f80: 74 2d 73 74 61 74 65 2d 73 74 61 74 75 73 2d 62  t-state-status-b
4f90: 79 2d 69 64 20 64 62 20 74 65 73 74 2d 69 64 20  y-id db test-id 
4fa0: 6e 65 77 73 74 61 74 65 20 6e 65 77 73 74 61 74  newstate newstat
4fb0: 75 73 20 6e 65 77 63 6f 6d 6d 65 6e 74 29 0a 20  us newcomment). 
4fc0: 20 28 69 66 20 6e 65 77 73 74 61 74 65 20 20 20   (if newstate   
4fd0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
4fe0: 20 64 62 20 22 55 50 44 41 54 45 20 74 65 73 74   db "UPDATE test
4ff0: 73 20 53 45 54 20 73 74 61 74 65 3d 3f 20 20 20  s SET state=?   
5000: 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 6e 65 77  WHERE id=?;" new
5010: 73 74 61 74 65 20 20 20 74 65 73 74 2d 69 64 29  state   test-id)
5020: 29 0a 20 20 28 69 66 20 6e 65 77 73 74 61 74 75  ).  (if newstatu
5030: 73 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63  s  (sqlite3:exec
5040: 75 74 65 20 64 62 20 22 55 50 44 41 54 45 20 74  ute db "UPDATE t
5050: 65 73 74 73 20 53 45 54 20 73 74 61 74 75 73 3d  ests SET status=
5060: 3f 20 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20  ?  WHERE id=?;" 
5070: 6e 65 77 73 74 61 74 75 73 20 20 74 65 73 74 2d  newstatus  test-
5080: 69 64 29 29 0a 20 20 28 69 66 20 6e 65 77 63 6f  id)).  (if newco
5090: 6d 6d 65 6e 74 20 28 73 71 6c 69 74 65 33 3a 65  mment (sqlite3:e
50a0: 78 65 63 75 74 65 20 64 62 20 22 55 50 44 41 54  xecute db "UPDAT
50b0: 45 20 74 65 73 74 73 20 53 45 54 20 63 6f 6d 6d  E tests SET comm
50c0: 65 6e 74 3d 3f 20 57 48 45 52 45 20 69 64 3d 3f  ent=? WHERE id=?
50d0: 3b 22 20 6e 65 77 63 6f 6d 6d 65 6e 74 20 74 65  ;" newcomment te
50e0: 73 74 2d 69 64 29 29 29 0a 0a 28 64 65 66 69 6e  st-id)))..(defin
50f0: 65 20 28 64 62 3a 67 65 74 2d 63 6f 75 6e 74 2d  e (db:get-count-
5100: 74 65 73 74 73 2d 72 75 6e 6e 69 6e 67 20 64 62  tests-running db
5110: 29 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20 30  ).  (let ((res 0
5120: 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a  )).    (sqlite3:
5130: 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20  for-each-row.   
5140: 20 20 28 6c 61 6d 62 64 61 20 28 63 6f 75 6e 74    (lambda (count
5150: 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72  ).       (set! r
5160: 65 73 20 63 6f 75 6e 74 29 29 0a 20 20 20 20 20  es count)).     
5170: 64 62 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20  db.     "SELECT 
5180: 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 74  count(id) FROM t
5190: 65 73 74 73 20 57 48 45 52 45 20 73 74 61 74 65  ests WHERE state
51a0: 20 3d 20 27 52 55 4e 4e 49 4e 47 27 20 4f 52 20   = 'RUNNING' OR 
51b0: 73 74 61 74 65 20 3d 20 27 4c 41 55 4e 43 48 45  state = 'LAUNCHE
51c0: 44 27 20 4f 52 20 73 74 61 74 65 20 3d 20 27 52  D' OR state = 'R
51d0: 45 4d 4f 54 45 48 4f 53 54 53 54 41 52 54 27 3b  EMOTEHOSTSTART';
51e0: 22 29 0a 20 20 20 20 72 65 73 29 29 0a 0a 28 64  ").    res))..(d
51f0: 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 63 6f  efine (db:get-co
5200: 75 6e 74 2d 74 65 73 74 73 2d 72 75 6e 6e 69 6e  unt-tests-runnin
5210: 67 2d 69 6e 2d 6a 6f 62 67 72 6f 75 70 20 64 62  g-in-jobgroup db
5220: 20 6a 6f 62 67 72 6f 75 70 29 0a 20 20 28 69 66   jobgroup).  (if
5230: 20 28 6e 6f 74 20 6a 6f 62 67 72 6f 75 70 29 0a   (not jobgroup).
5240: 20 20 20 20 20 20 30 20 3b 3b 20 0a 20 20 20 20        0 ;; .    
5250: 20 20 28 6c 65 74 20 28 28 72 65 73 20 30 29 29    (let ((res 0))
5260: 0a 09 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65  ..(sqlite3:for-e
5270: 61 63 68 2d 72 6f 77 0a 09 20 28 6c 61 6d 62 64  ach-row.. (lambd
5280: 61 20 28 63 6f 75 6e 74 29 0a 09 20 20 20 28 73  a (count)..   (s
5290: 65 74 21 20 72 65 73 20 63 6f 75 6e 74 29 29 0a  et! res count)).
52a0: 09 20 64 62 0a 09 20 22 53 45 4c 45 43 54 20 63  . db.. "SELECT c
52b0: 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 74 65  ount(id) FROM te
52c0: 73 74 73 20 57 48 45 52 45 20 73 74 61 74 65 20  sts WHERE state 
52d0: 3d 20 27 52 55 4e 4e 49 4e 47 27 20 4f 52 20 73  = 'RUNNING' OR s
52e0: 74 61 74 65 20 3d 20 27 4c 41 55 4e 43 48 45 44  tate = 'LAUNCHED
52f0: 27 20 4f 52 20 73 74 61 74 65 20 3d 20 27 52 45  ' OR state = 'RE
5300: 4d 4f 54 45 48 4f 53 54 53 54 41 52 54 27 0a 20  MOTEHOSTSTART'. 
5310: 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20              AND 
5320: 74 65 73 74 6e 61 6d 65 20 69 6e 20 28 53 45 4c  testname in (SEL
5330: 45 43 54 20 74 65 73 74 6e 61 6d 65 20 46 52 4f  ECT testname FRO
5340: 4d 20 74 65 73 74 5f 6d 65 74 61 20 57 48 45 52  M test_meta WHER
5350: 45 20 6a 6f 62 67 72 6f 75 70 3d 3f 3b 22 0a 09  E jobgroup=?;"..
5360: 20 6a 6f 62 67 72 6f 75 70 29 0a 09 72 65 73 29   jobgroup)..res)
5370: 29 29 0a 0a 3b 3b 20 64 6f 6e 65 20 77 69 74 68  ))..;; done with
5380: 20 72 75 6e 20 77 68 65 6e 3a 0a 3b 3b 20 20 20   run when:.;;   
5390: 30 20 74 65 73 74 73 20 69 6e 20 4c 41 55 4e 43  0 tests in LAUNC
53a0: 48 45 44 2c 20 4e 4f 54 5f 53 54 41 52 54 45 44  HED, NOT_STARTED
53b0: 2c 20 52 45 4d 4f 54 45 48 4f 53 54 53 54 41 52  , REMOTEHOSTSTAR
53c0: 54 2c 20 52 55 4e 4e 49 4e 47 0a 28 64 65 66 69  T, RUNNING.(defi
53d0: 6e 65 20 28 64 62 3a 65 73 74 69 6d 61 74 65 64  ne (db:estimated
53e0: 2d 74 65 73 74 73 2d 72 65 6d 61 69 6e 69 6e 67  -tests-remaining
53f0: 20 64 62 20 72 75 6e 2d 69 64 29 0a 20 20 28 6c   db run-id).  (l
5400: 65 74 20 28 28 72 65 73 20 30 29 29 0a 20 20 20  et ((res 0)).   
5410: 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61   (sqlite3:for-ea
5420: 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d  ch-row.     (lam
5430: 62 64 61 20 28 63 6f 75 6e 74 29 0a 20 20 20 20  bda (count).    
5440: 20 20 20 28 73 65 74 21 20 72 65 73 20 63 6f 75     (set! res cou
5450: 6e 74 29 29 0a 20 20 20 20 20 64 62 20 3b 3b 20  nt)).     db ;; 
5460: 4e 42 2f 2f 20 4b 49 4c 4c 52 45 51 20 6d 65 61  NB// KILLREQ mea
5470: 6e 73 20 74 68 65 20 6a 6f 62 73 20 69 73 20 73  ns the jobs is s
5480: 74 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 72 75  till probably ru
5490: 6e 6e 69 6e 67 0a 20 20 20 20 20 22 53 45 4c 45  nning.     "SELE
54a0: 43 54 20 63 6f 75 6e 74 28 69 64 29 20 46 52 4f  CT count(id) FRO
54b0: 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 73 74  M tests WHERE st
54c0: 61 74 65 20 69 6e 20 28 27 4c 41 55 4e 43 48 45  ate in ('LAUNCHE
54d0: 44 27 2c 27 4e 4f 54 5f 53 54 41 52 54 45 44 27  D','NOT_STARTED'
54e0: 2c 27 52 45 4d 4f 54 45 48 4f 53 54 53 54 41 52  ,'REMOTEHOSTSTAR
54f0: 54 27 2c 27 52 55 4e 4e 49 4e 47 27 2c 27 4b 49  T','RUNNING','KI
5500: 4c 4c 52 45 51 27 29 20 41 4e 44 20 72 75 6e 5f  LLREQ') AND run_
5510: 69 64 3d 3f 3b 22 20 72 75 6e 2d 69 64 29 0a 20  id=?;" run-id). 
5520: 20 20 20 72 65 73 29 29 0a 0a 3b 3b 20 4e 42 2f     res))..;; NB/
5530: 2f 20 53 79 6e 63 20 74 68 69 73 20 77 69 74 68  / Sync this with
5540: 20 72 75 6e 73 3a 67 65 74 2d 74 65 73 74 2d 69   runs:get-test-i
5550: 6e 66 6f 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  nfo.(define (db:
5560: 67 65 74 2d 74 65 73 74 2d 69 6e 66 6f 20 64 62  get-test-info db
5570: 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65   run-id testname
5580: 20 69 74 65 6d 2d 70 61 74 68 29 0a 20 20 28 6c   item-path).  (l
5590: 65 74 20 28 28 72 65 73 20 23 66 29 29 0a 20 20  et ((res #f)).  
55a0: 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65    (sqlite3:for-e
55b0: 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61  ach-row.     (la
55c0: 6d 62 64 61 20 28 69 64 20 72 75 6e 2d 69 64 20  mbda (id run-id 
55d0: 74 65 73 74 6e 61 6d 65 20 73 74 61 74 65 20 73  testname state s
55e0: 74 61 74 75 73 20 65 76 65 6e 74 2d 74 69 6d 65  tatus event-time
55f0: 20 68 6f 73 74 20 63 70 75 6c 6f 61 64 20 64 69   host cpuload di
5600: 73 6b 66 72 65 65 20 75 6e 61 6d 65 20 72 75 6e  skfree uname run
5610: 64 69 72 20 69 74 65 6d 2d 70 61 74 68 20 72 75  dir item-path ru
5620: 6e 5f 64 75 72 61 74 69 6f 6e 20 66 69 6e 61 6c  n_duration final
5630: 5f 6c 6f 67 66 20 63 6f 6d 6d 65 6e 74 20 29 0a  _logf comment ).
5640: 20 20 20 20 20 20 20 28 73 65 74 21 20 72 65 73         (set! res
5650: 20 28 76 65 63 74 6f 72 20 69 64 20 72 75 6e 2d   (vector id run-
5660: 69 64 20 74 65 73 74 6e 61 6d 65 20 73 74 61 74  id testname stat
5670: 65 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d 74  e status event-t
5680: 69 6d 65 20 68 6f 73 74 20 63 70 75 6c 6f 61 64  ime host cpuload
5690: 20 64 69 73 6b 66 72 65 65 20 75 6e 61 6d 65 20   diskfree uname 
56a0: 72 75 6e 64 69 72 20 69 74 65 6d 2d 70 61 74 68  rundir item-path
56b0: 20 72 75 6e 5f 64 75 72 61 74 69 6f 6e 20 66 69   run_duration fi
56c0: 6e 61 6c 5f 6c 6f 67 66 20 63 6f 6d 6d 65 6e 74  nal_logf comment
56d0: 20 29 29 29 0a 20 20 20 20 20 64 62 20 0a 20 20   ))).     db .  
56e0: 20 20 20 22 53 45 4c 45 43 54 20 69 64 2c 72 75     "SELECT id,ru
56f0: 6e 5f 69 64 2c 74 65 73 74 6e 61 6d 65 2c 73 74  n_id,testname,st
5700: 61 74 65 2c 73 74 61 74 75 73 2c 65 76 65 6e 74  ate,status,event
5710: 5f 74 69 6d 65 2c 68 6f 73 74 2c 63 70 75 6c 6f  _time,host,cpulo
5720: 61 64 2c 64 69 73 6b 66 72 65 65 2c 75 6e 61 6d  ad,diskfree,unam
5730: 65 2c 72 75 6e 64 69 72 2c 69 74 65 6d 5f 70 61  e,rundir,item_pa
5740: 74 68 2c 72 75 6e 5f 64 75 72 61 74 69 6f 6e 2c  th,run_duration,
5750: 66 69 6e 61 6c 5f 6c 6f 67 66 2c 63 6f 6d 6d 65  final_logf,comme
5760: 6e 74 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48  nt FROM tests WH
5770: 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44  ERE run_id=? AND
5780: 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20   testname=? AND 
5790: 69 74 65 6d 5f 70 61 74 68 3d 3f 3b 22 0a 20 20  item_path=?;".  
57a0: 20 20 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61     run-id testna
57b0: 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 0a 20 20  me item-path).  
57c0: 20 20 72 65 73 29 29 0a 0a 3b 3b 20 47 65 74 20    res))..;; Get 
57d0: 74 65 73 74 20 64 61 74 61 20 75 73 69 6e 67 20  test data using 
57e0: 74 65 73 74 5f 69 64 0a 28 64 65 66 69 6e 65 20  test_id.(define 
57f0: 28 64 62 3a 67 65 74 2d 74 65 73 74 2d 64 61 74  (db:get-test-dat
5800: 61 2d 62 79 2d 69 64 20 64 62 20 74 65 73 74 2d  a-by-id db test-
5810: 69 64 29 0a 20 20 28 6c 65 74 20 28 28 72 65 73  id).  (let ((res
5820: 20 23 66 29 29 0a 20 20 20 20 28 73 71 6c 69 74   #f)).    (sqlit
5830: 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a  e3:for-each-row.
5840: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 69 64       (lambda (id
5850: 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65   run-id testname
5860: 20 73 74 61 74 65 20 73 74 61 74 75 73 20 65 76   state status ev
5870: 65 6e 74 2d 74 69 6d 65 20 68 6f 73 74 20 63 70  ent-time host cp
5880: 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20 75  uload diskfree u
5890: 6e 61 6d 65 20 72 75 6e 64 69 72 20 69 74 65 6d  name rundir item
58a0: 2d 70 61 74 68 20 72 75 6e 5f 64 75 72 61 74 69  -path run_durati
58b0: 6f 6e 20 66 69 6e 61 6c 5f 6c 6f 67 66 20 63 6f  on final_logf co
58c0: 6d 6d 65 6e 74 29 0a 20 20 20 20 20 20 20 28 73  mment).       (s
58d0: 65 74 21 20 72 65 73 20 28 76 65 63 74 6f 72 20  et! res (vector 
58e0: 69 64 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61  id run-id testna
58f0: 6d 65 20 73 74 61 74 65 20 73 74 61 74 75 73 20  me state status 
5900: 65 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73 74 20  event-time host 
5910: 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65  cpuload diskfree
5920: 20 75 6e 61 6d 65 20 72 75 6e 64 69 72 20 69 74   uname rundir it
5930: 65 6d 2d 70 61 74 68 20 72 75 6e 5f 64 75 72 61  em-path run_dura
5940: 74 69 6f 6e 20 66 69 6e 61 6c 5f 6c 6f 67 66 20  tion final_logf 
5950: 63 6f 6d 6d 65 6e 74 29 29 29 0a 20 20 20 20 20  comment))).     
5960: 64 62 20 0a 20 20 20 20 20 22 53 45 4c 45 43 54  db .     "SELECT
5970: 20 69 64 2c 72 75 6e 5f 69 64 2c 74 65 73 74 6e   id,run_id,testn
5980: 61 6d 65 2c 73 74 61 74 65 2c 73 74 61 74 75 73  ame,state,status
5990: 2c 65 76 65 6e 74 5f 74 69 6d 65 2c 68 6f 73 74  ,event_time,host
59a0: 2c 63 70 75 6c 6f 61 64 2c 64 69 73 6b 66 72 65  ,cpuload,diskfre
59b0: 65 2c 75 6e 61 6d 65 2c 72 75 6e 64 69 72 2c 69  e,uname,rundir,i
59c0: 74 65 6d 5f 70 61 74 68 2c 72 75 6e 5f 64 75 72  tem_path,run_dur
59d0: 61 74 69 6f 6e 2c 66 69 6e 61 6c 5f 6c 6f 67 66  ation,final_logf
59e0: 2c 63 6f 6d 6d 65 6e 74 20 46 52 4f 4d 20 74 65  ,comment FROM te
59f0: 73 74 73 20 57 48 45 52 45 20 69 64 3d 3f 3b 22  sts WHERE id=?;"
5a00: 0a 20 20 20 20 20 74 65 73 74 2d 69 64 29 0a 20  .     test-id). 
5a10: 20 20 20 72 65 73 29 29 0a 0a 0a 28 64 65 66 69     res))...(defi
5a20: 6e 65 20 28 64 62 3a 74 65 73 74 2d 73 65 74 2d  ne (db:test-set-
5a30: 63 6f 6d 6d 65 6e 74 20 64 62 20 72 75 6e 2d 69  comment db run-i
5a40: 64 20 74 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d  d testname item-
5a50: 70 61 74 68 20 63 6f 6d 6d 65 6e 74 29 0a 20 20  path comment).  
5a60: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
5a70: 20 0a 20 20 20 64 62 20 0a 20 20 20 22 55 50 44   .   db .   "UPD
5a80: 41 54 45 20 74 65 73 74 73 20 53 45 54 20 63 6f  ATE tests SET co
5a90: 6d 6d 65 6e 74 3d 3f 20 57 48 45 52 45 20 72 75  mment=? WHERE ru
5aa0: 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e  n_id=? AND testn
5ab0: 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70  ame=? AND item_p
5ac0: 61 74 68 3d 3f 3b 22 0a 20 20 20 63 6f 6d 6d 65  ath=?;".   comme
5ad0: 6e 74 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61  nt run-id testna
5ae0: 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 29 0a 0a  me item-path))..
5af0: 3b 3b 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 74  ;;.(define (db:t
5b00: 65 73 74 2d 73 65 74 2d 72 75 6e 64 69 72 21 20  est-set-rundir! 
5b10: 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61  db run-id testna
5b20: 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 72 75 6e  me item-path run
5b30: 64 69 72 29 0a 20 20 28 73 71 6c 69 74 65 33 3a  dir).  (sqlite3:
5b40: 65 78 65 63 75 74 65 20 0a 20 20 20 64 62 20 0a  execute .   db .
5b50: 20 20 20 22 55 50 44 41 54 45 20 74 65 73 74 73     "UPDATE tests
5b60: 20 53 45 54 20 72 75 6e 64 69 72 3d 3f 20 57 48   SET rundir=? WH
5b70: 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44  ERE run_id=? AND
5b80: 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20   testname=? AND 
5b90: 69 74 65 6d 5f 70 61 74 68 3d 3f 3b 22 0a 20 20  item_path=?;".  
5ba0: 20 72 75 6e 64 69 72 20 72 75 6e 2d 69 64 20 74   rundir run-id t
5bb0: 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74  estname item-pat
5bc0: 68 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d  h))..;;=========
5bd0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5be0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5bf0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5c00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b  =============.;;
5c10: 20 4d 69 73 63 2e 20 74 65 73 74 20 72 65 6c 61   Misc. test rela
5c20: 74 65 64 20 71 75 65 72 69 65 73 0a 3b 3b 3d 3d  ted queries.;;==
5c30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5c40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5c50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5c60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5c70: 3d 3d 3d 3d 0a 0a 28 64 65 66 69 6e 65 20 28 64  ====..(define (d
5c80: 62 3a 74 65 73 74 2d 67 65 74 2d 70 61 74 68 73  b:test-get-paths
5c90: 2d 6d 61 74 63 68 69 6e 67 20 64 62 20 6b 65 79  -matching db key
5ca0: 6e 61 6d 65 73 20 74 61 72 67 65 74 29 0a 20 20  names target).  
5cb0: 28 6c 65 74 2a 20 28 28 72 65 73 20 27 28 29 29  (let* ((res '())
5cc0: 0a 09 20 28 69 74 65 6d 70 61 74 74 20 20 20 28  .. (itempatt   (
5cd0: 69 66 20 28 61 72 67 73 3a 67 65 74 2d 61 72 67  if (args:get-arg
5ce0: 20 22 2d 69 74 65 6d 70 61 74 74 22 29 28 61 72   "-itempatt")(ar
5cf0: 67 73 3a 67 65 74 2d 61 72 67 20 22 2d 69 74 65  gs:get-arg "-ite
5d00: 6d 70 61 74 74 22 29 20 22 25 22 29 29 0a 09 20  mpatt") "%")).. 
5d10: 28 74 65 73 74 70 61 74 74 20 20 20 28 69 66 20  (testpatt   (if 
5d20: 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22 2d  (args:get-arg "-
5d30: 74 65 73 74 70 61 74 74 22 29 28 61 72 67 73 3a  testpatt")(args:
5d40: 67 65 74 2d 61 72 67 20 22 2d 74 65 73 74 70 61  get-arg "-testpa
5d50: 74 74 22 29 20 22 25 22 29 29 0a 09 20 28 73 74  tt") "%")).. (st
5d60: 61 74 65 70 61 74 74 20 20 28 69 66 20 28 61 72  atepatt  (if (ar
5d70: 67 73 3a 67 65 74 2d 61 72 67 20 22 3a 73 74 61  gs:get-arg ":sta
5d80: 74 65 22 29 20 20 20 28 61 72 67 73 3a 67 65 74  te")   (args:get
5d90: 2d 61 72 67 20 22 3a 73 74 61 74 65 22 29 20 20  -arg ":state")  
5da0: 20 20 22 25 22 29 29 0a 09 20 28 73 74 61 74 75    "%")).. (statu
5db0: 73 70 61 74 74 20 28 69 66 20 28 61 72 67 73 3a  spatt (if (args:
5dc0: 67 65 74 2d 61 72 67 20 22 3a 73 74 61 74 75 73  get-arg ":status
5dd0: 22 29 20 20 28 61 72 67 73 3a 67 65 74 2d 61 72  ")  (args:get-ar
5de0: 67 20 22 3a 73 74 61 74 75 73 22 29 20 20 20 22  g ":status")   "
5df0: 25 22 29 29 0a 09 20 28 72 75 6e 6e 61 6d 65 20  %")).. (runname 
5e00: 20 20 20 28 69 66 20 28 61 72 67 73 3a 67 65 74     (if (args:get
5e10: 2d 61 72 67 20 22 3a 72 75 6e 6e 61 6d 65 22 29  -arg ":runname")
5e20: 20 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22   (args:get-arg "
5e30: 3a 72 75 6e 6e 61 6d 65 22 29 20 20 22 25 22 29  :runname")  "%")
5e40: 29 0a 09 20 28 6b 65 79 73 74 72 20 28 73 74 72  ).. (keystr (str
5e50: 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20  ing-intersperse 
5e60: 0a 09 09 20 20 28 6d 61 70 20 28 6c 61 6d 62 64  ...  (map (lambd
5e70: 61 20 28 6b 65 79 20 76 61 6c 29 0a 09 09 09 20  a (key val).... 
5e80: 28 63 6f 6e 63 20 22 72 2e 22 20 6b 65 79 20 22  (conc "r." key "
5e90: 20 6c 69 6b 65 20 27 22 20 76 61 6c 20 22 27 22   like '" val "'"
5ea0: 29 29 0a 09 09 20 20 20 20 20 20 20 6b 65 79 6e  ))...       keyn
5eb0: 61 6d 65 73 20 0a 09 09 20 20 20 20 20 20 20 28  ames ...       (
5ec0: 73 74 72 69 6e 67 2d 73 70 6c 69 74 20 74 61 72  string-split tar
5ed0: 67 65 74 20 22 2f 22 29 29 0a 09 09 20 20 22 20  get "/"))...  " 
5ee0: 41 4e 44 20 22 29 29 0a 09 20 28 71 72 79 73 74  AND ")).. (qryst
5ef0: 72 20 28 63 6f 6e 63 20 22 53 45 4c 45 43 54 20  r (conc "SELECT 
5f00: 74 2e 72 75 6e 64 69 72 20 46 52 4f 4d 20 74 65  t.rundir FROM te
5f10: 73 74 73 20 41 53 20 74 20 49 4e 4e 45 52 20 4a  sts AS t INNER J
5f20: 4f 49 4e 20 72 75 6e 73 20 41 53 20 72 20 4f 4e  OIN runs AS r ON
5f30: 20 74 2e 72 75 6e 5f 69 64 3d 72 2e 69 64 20 57   t.run_id=r.id W
5f40: 48 45 52 45 20 22 0a 09 09 20 20 20 20 20 20 20  HERE "...       
5f50: 6b 65 79 73 74 72 20 22 20 41 4e 44 20 72 2e 72  keystr " AND r.r
5f60: 75 6e 6e 61 6d 65 20 4c 49 4b 45 20 27 22 20 72  unname LIKE '" r
5f70: 75 6e 6e 61 6d 65 20 22 27 20 41 4e 44 20 69 74  unname "' AND it
5f80: 65 6d 5f 70 61 74 68 20 4c 49 4b 45 20 27 22 20  em_path LIKE '" 
5f90: 69 74 65 6d 70 61 74 74 20 22 27 20 41 4e 44 20  itempatt "' AND 
5fa0: 74 65 73 74 6e 61 6d 65 20 4c 49 4b 45 20 27 22  testname LIKE '"
5fb0: 0a 09 09 20 20 20 20 20 20 20 74 65 73 74 70 61  ...       testpa
5fc0: 74 74 20 22 27 20 41 4e 44 20 74 2e 73 74 61 74  tt "' AND t.stat
5fd0: 65 20 4c 49 4b 45 20 27 22 20 73 74 61 74 65 70  e LIKE '" statep
5fe0: 61 74 74 20 22 27 20 41 4e 44 20 74 2e 73 74 61  att "' AND t.sta
5ff0: 74 75 73 20 4c 49 4b 45 20 27 22 20 73 74 61 74  tus LIKE '" stat
6000: 75 73 70 61 74 74 20 0a 09 09 20 20 20 20 20 20  uspatt ...      
6010: 20 22 27 4f 52 44 45 52 20 42 59 20 74 2e 65 76   "'ORDER BY t.ev
6020: 65 6e 74 5f 74 69 6d 65 20 41 53 43 3b 22 29 29  ent_time ASC;"))
6030: 29 0a 20 20 20 20 28 64 65 62 75 67 3a 70 72 69  ).    (debug:pri
6040: 6e 74 20 33 20 22 71 72 79 73 74 72 3a 20 22 20  nt 3 "qrystr: " 
6050: 71 72 79 73 74 72 29 0a 20 20 20 20 28 73 71 6c  qrystr).    (sql
6060: 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f  ite3:for-each-ro
6070: 77 20 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20  w .     (lambda 
6080: 28 70 29 0a 20 20 20 20 20 20 20 28 73 65 74 21  (p).       (set!
6090: 20 72 65 73 20 28 63 6f 6e 73 20 70 20 72 65 73   res (cons p res
60a0: 29 29 29 0a 20 20 20 20 20 64 62 20 0a 20 20 20  ))).     db .   
60b0: 20 20 71 72 79 73 74 72 29 0a 20 20 20 20 72 65    qrystr).    re
60c0: 73 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62  s))..(define (db
60d0: 3a 74 65 73 74 2d 67 65 74 2d 74 65 73 74 2d 72  :test-get-test-r
60e0: 65 63 6f 72 64 73 2d 6d 61 74 63 68 69 6e 67 20  ecords-matching 
60f0: 64 62 20 6b 65 79 6e 61 6d 65 73 20 74 61 72 67  db keynames targ
6100: 65 74 29 0a 20 20 28 6c 65 74 2a 20 28 28 72 65  et).  (let* ((re
6110: 73 20 27 28 29 29 0a 09 20 28 69 74 65 6d 70 61  s '()).. (itempa
6120: 74 74 20 20 20 28 69 66 20 28 61 72 67 73 3a 67  tt   (if (args:g
6130: 65 74 2d 61 72 67 20 22 2d 69 74 65 6d 70 61 74  et-arg "-itempat
6140: 74 22 29 28 61 72 67 73 3a 67 65 74 2d 61 72 67  t")(args:get-arg
6150: 20 22 2d 69 74 65 6d 70 61 74 74 22 29 20 22 25   "-itempatt") "%
6160: 22 29 29 0a 09 20 28 74 65 73 74 70 61 74 74 20  ")).. (testpatt 
6170: 20 20 28 69 66 20 28 61 72 67 73 3a 67 65 74 2d    (if (args:get-
6180: 61 72 67 20 22 2d 74 65 73 74 70 61 74 74 22 29  arg "-testpatt")
6190: 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22 2d  (args:get-arg "-
61a0: 74 65 73 74 70 61 74 74 22 29 20 22 25 22 29 29  testpatt") "%"))
61b0: 0a 09 20 28 73 74 61 74 65 70 61 74 74 20 20 28  .. (statepatt  (
61c0: 69 66 20 28 61 72 67 73 3a 67 65 74 2d 61 72 67  if (args:get-arg
61d0: 20 22 3a 73 74 61 74 65 22 29 20 20 20 28 61 72   ":state")   (ar
61e0: 67 73 3a 67 65 74 2d 61 72 67 20 22 3a 73 74 61  gs:get-arg ":sta
61f0: 74 65 22 29 20 20 20 20 22 25 22 29 29 0a 09 20  te")    "%")).. 
6200: 28 73 74 61 74 75 73 70 61 74 74 20 28 69 66 20  (statuspatt (if 
6210: 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22 3a  (args:get-arg ":
6220: 73 74 61 74 75 73 22 29 20 20 28 61 72 67 73 3a  status")  (args:
6230: 67 65 74 2d 61 72 67 20 22 3a 73 74 61 74 75 73  get-arg ":status
6240: 22 29 20 20 20 22 25 22 29 29 0a 09 20 28 72 75  ")   "%")).. (ru
6250: 6e 6e 61 6d 65 20 20 20 20 28 69 66 20 28 61 72  nname    (if (ar
6260: 67 73 3a 67 65 74 2d 61 72 67 20 22 3a 72 75 6e  gs:get-arg ":run
6270: 6e 61 6d 65 22 29 20 28 61 72 67 73 3a 67 65 74  name") (args:get
6280: 2d 61 72 67 20 22 3a 72 75 6e 6e 61 6d 65 22 29  -arg ":runname")
6290: 20 20 22 25 22 29 29 0a 09 20 28 6b 65 79 73 74    "%")).. (keyst
62a0: 72 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73  r (string-inters
62b0: 70 65 72 73 65 20 0a 09 09 20 20 28 6d 61 70 20  perse ...  (map 
62c0: 28 6c 61 6d 62 64 61 20 28 6b 65 79 20 76 61 6c  (lambda (key val
62d0: 29 0a 09 09 09 20 28 63 6f 6e 63 20 22 72 2e 22  ).... (conc "r."
62e0: 20 6b 65 79 20 22 20 6c 69 6b 65 20 27 22 20 76   key " like '" v
62f0: 61 6c 20 22 27 22 29 29 0a 09 09 20 20 20 20 20  al "'"))...     
6300: 20 20 6b 65 79 6e 61 6d 65 73 20 0a 09 09 20 20    keynames ...  
6310: 20 20 20 20 20 28 73 74 72 69 6e 67 2d 73 70 6c       (string-spl
6320: 69 74 20 74 61 72 67 65 74 20 22 2f 22 29 29 0a  it target "/")).
6330: 09 09 20 20 22 20 41 4e 44 20 22 29 29 0a 09 20  ..  " AND ")).. 
6340: 28 71 72 79 73 74 72 20 28 63 6f 6e 63 20 22 53  (qrystr (conc "S
6350: 45 4c 45 43 54 20 0a 20 20 20 20 20 20 20 20 20  ELECT .         
6360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6370: 20 20 20 74 2e 69 64 0a 20 20 20 20 20 20 20 20     t.id.        
6380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6390: 20 20 20 20 74 2e 72 75 6e 5f 69 64 20 20 20 20      t.run_id    
63a0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
63b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 2e                t.
63c0: 74 65 73 74 6e 61 6d 65 20 20 20 0a 20 20 20 20  testname   .    
63d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
63e0: 20 20 20 20 20 20 20 20 74 2e 68 6f 73 74 20 20          t.host  
63f0: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
6400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6410: 20 20 74 2e 63 70 75 6c 6f 61 64 20 20 20 20 0a    t.cpuload    .
6420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6430: 20 20 20 20 20 20 20 20 20 20 20 20 74 2e 64 69              t.di
6440: 73 6b 66 72 65 65 20 20 20 0a 20 20 20 20 20 20  skfree   .      
6450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6460: 20 20 20 20 20 20 74 2e 75 6e 61 6d 65 20 20 20        t.uname   
6470: 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20     .            
6480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6490: 74 2e 72 75 6e 64 69 72 20 20 20 20 20 0a 20 20  t.rundir     .  
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64b0: 20 20 20 20 20 20 20 20 20 20 74 2e 73 68 6f 72            t.shor
64c0: 74 64 69 72 20 20 20 0a 20 20 20 20 20 20 20 20  tdir   .        
64d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64e0: 20 20 20 20 74 2e 69 74 65 6d 5f 70 61 74 68 20      t.item_path 
64f0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
6500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 2e                t.
6510: 73 74 61 74 65 20 20 20 20 20 20 0a 20 20 20 20  state      .    
6520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6530: 20 20 20 20 20 20 20 20 74 2e 73 74 61 74 75 73          t.status
6540: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
6550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6560: 20 20 74 2e 61 74 74 65 6d 70 74 6e 75 6d 20 0a    t.attemptnum .
6570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6580: 20 20 20 20 20 20 20 20 20 20 20 20 74 2e 66 69              t.fi
6590: 6e 61 6c 5f 6c 6f 67 66 20 0a 20 20 20 20 20 20  nal_logf .      
65a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65b0: 20 20 20 20 20 20 74 2e 6c 6f 67 64 61 74 20 20        t.logdat  
65c0: 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20     .            
65d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
65e0: 74 2e 72 75 6e 5f 64 75 72 61 74 69 6f 0a 20 20  t.run_duratio.  
65f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6600: 20 20 20 20 20 20 20 20 20 20 74 2e 63 6f 6d 6d            t.comm
6610: 65 6e 74 20 20 20 20 0a 20 20 20 20 20 20 20 20  ent    .        
6620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6630: 20 20 20 20 74 2e 65 76 65 6e 74 5f 74 69 6d 65      t.event_time
6640: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
6650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 2e                t.
6660: 66 61 69 6c 5f 63 6f 75 6e 74 20 0a 20 20 20 20  fail_count .    
6670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6680: 20 20 20 20 20 20 20 20 74 2e 70 61 73 73 5f 63          t.pass_c
6690: 6f 75 6e 74 20 0a 20 20 20 20 20 20 20 20 20 20  ount .          
66a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
66b0: 20 20 74 2e 61 72 63 68 69 76 65 64 20 20 20 0a    t.archived   .
66c0: 0a 0a 0a 20 46 52 4f 4d 20 74 65 73 74 73 20 41  ... FROM tests A
66d0: 53 20 74 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 72  S t INNER JOIN r
66e0: 75 6e 73 20 41 53 20 72 20 4f 4e 20 74 2e 72 75  uns AS r ON t.ru
66f0: 6e 5f 69 64 3d 72 2e 69 64 20 57 48 45 52 45 20  n_id=r.id WHERE 
6700: 22 0a 09 09 20 20 20 20 20 20 20 6b 65 79 73 74  "...       keyst
6710: 72 20 22 20 41 4e 44 20 72 2e 72 75 6e 6e 61 6d  r " AND r.runnam
6720: 65 20 4c 49 4b 45 20 27 22 20 72 75 6e 6e 61 6d  e LIKE '" runnam
6730: 65 20 22 27 20 41 4e 44 20 69 74 65 6d 5f 70 61  e "' AND item_pa
6740: 74 68 20 4c 49 4b 45 20 27 22 20 69 74 65 6d 70  th LIKE '" itemp
6750: 61 74 74 20 22 27 20 41 4e 44 20 74 65 73 74 6e  att "' AND testn
6760: 61 6d 65 20 4c 49 4b 45 20 27 22 0a 09 09 20 20  ame LIKE '"...  
6770: 20 20 20 20 20 74 65 73 74 70 61 74 74 20 22 27       testpatt "'
6780: 20 41 4e 44 20 74 2e 73 74 61 74 65 20 4c 49 4b   AND t.state LIK
6790: 45 20 27 22 20 73 74 61 74 65 70 61 74 74 20 22  E '" statepatt "
67a0: 27 20 41 4e 44 20 74 2e 73 74 61 74 75 73 20 4c  ' AND t.status L
67b0: 49 4b 45 20 27 22 20 73 74 61 74 75 73 70 61 74  IKE '" statuspat
67c0: 74 20 0a 09 09 20 20 20 20 20 20 20 22 27 4f 52  t ...       "'OR
67d0: 44 45 52 20 42 59 20 74 2e 65 76 65 6e 74 5f 74  DER BY t.event_t
67e0: 69 6d 65 20 41 53 43 3b 22 29 29 29 0a 20 20 20  ime ASC;"))).   
67f0: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 33 20   (debug:print 3 
6800: 22 71 72 79 73 74 72 3a 20 22 20 71 72 79 73 74  "qrystr: " qryst
6810: 72 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a  r).    (sqlite3:
6820: 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20  for-each-row .  
6830: 20 20 20 28 6c 61 6d 62 64 61 20 28 70 29 0a 20     (lambda (p). 
6840: 20 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20        (set! res 
6850: 28 63 6f 6e 73 20 70 20 72 65 73 29 29 29 0a 20  (cons p res))). 
6860: 20 20 20 20 64 62 20 0a 20 20 20 20 20 71 72 79      db .     qry
6870: 73 74 72 29 0a 20 20 20 20 72 65 73 29 29 0a 0a  str).    res))..
6880: 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  .;;=============
6890: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
68a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
68b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
68c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 54 65 73  =========.;; Tes
68d0: 74 73 20 6d 65 74 61 20 64 61 74 61 0a 3b 3b 3d  ts meta data.;;=
68e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
68f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6900: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6910: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6920: 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 72 65 61 64 20 74  =====..;; read t
6930: 68 65 20 72 65 63 6f 72 64 20 67 69 76 65 6e 20  he record given 
6940: 61 20 74 65 73 74 6e 61 6d 65 0a 28 64 65 66 69  a testname.(defi
6950: 6e 65 20 28 64 62 3a 74 65 73 74 6d 65 74 61 2d  ne (db:testmeta-
6960: 67 65 74 2d 72 65 63 6f 72 64 20 64 62 20 74 65  get-record db te
6970: 73 74 6e 61 6d 65 29 0a 20 20 28 6c 65 74 20 28  stname).  (let (
6980: 28 72 65 73 20 23 66 29 29 0a 20 20 20 20 28 73  (res #f)).    (s
6990: 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d  qlite3:for-each-
69a0: 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 64 61  row.     (lambda
69b0: 20 28 69 64 20 74 65 73 74 6e 61 6d 65 20 61 75   (id testname au
69c0: 74 68 6f 72 20 6f 77 6e 65 72 20 64 65 73 63 72  thor owner descr
69d0: 69 70 74 69 6f 6e 20 72 65 76 69 65 77 65 64 20  iption reviewed 
69e0: 69 74 65 72 61 74 65 64 20 61 76 67 5f 72 75 6e  iterated avg_run
69f0: 74 69 6d 65 20 61 76 67 5f 64 69 73 6b 20 74 61  time avg_disk ta
6a00: 67 73 29 0a 20 20 20 20 20 20 20 28 73 65 74 21  gs).       (set!
6a10: 20 72 65 73 20 28 76 65 63 74 6f 72 20 69 64 20   res (vector id 
6a20: 74 65 73 74 6e 61 6d 65 20 61 75 74 68 6f 72 20  testname author 
6a30: 6f 77 6e 65 72 20 64 65 73 63 72 69 70 74 69 6f  owner descriptio
6a40: 6e 20 72 65 76 69 65 77 65 64 20 69 74 65 72 61  n reviewed itera
6a50: 74 65 64 20 61 76 67 5f 72 75 6e 74 69 6d 65 20  ted avg_runtime 
6a60: 61 76 67 5f 64 69 73 6b 20 74 61 67 73 29 29 29  avg_disk tags)))
6a70: 0a 20 20 20 20 20 64 62 20 22 53 45 4c 45 43 54  .     db "SELECT
6a80: 20 69 64 2c 74 65 73 74 6e 61 6d 65 2c 61 75 74   id,testname,aut
6a90: 68 6f 72 2c 6f 77 6e 65 72 2c 64 65 73 63 72 69  hor,owner,descri
6aa0: 70 74 69 6f 6e 2c 72 65 76 69 65 77 65 64 2c 69  ption,reviewed,i
6ab0: 74 65 72 61 74 65 64 2c 61 76 67 5f 72 75 6e 74  terated,avg_runt
6ac0: 69 6d 65 2c 61 76 67 5f 64 69 73 6b 2c 74 61 67  ime,avg_disk,tag
6ad0: 73 20 46 52 4f 4d 20 74 65 73 74 5f 6d 65 74 61  s FROM test_meta
6ae0: 20 57 48 45 52 45 20 74 65 73 74 6e 61 6d 65 3d   WHERE testname=
6af0: 3f 3b 22 0a 20 20 20 20 20 74 65 73 74 6e 61 6d  ?;".     testnam
6b00: 65 29 0a 20 20 20 20 72 65 73 29 29 0a 0a 3b 3b  e).    res))..;;
6b10: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 72 65   create a new re
6b20: 63 6f 72 64 20 66 6f 72 20 61 20 67 69 76 65 6e  cord for a given
6b30: 20 74 65 73 74 6e 61 6d 65 0a 28 64 65 66 69 6e   testname.(defin
6b40: 65 20 28 64 62 3a 74 65 73 74 6d 65 74 61 2d 61  e (db:testmeta-a
6b50: 64 64 2d 72 65 63 6f 72 64 20 64 62 20 74 65 73  dd-record db tes
6b60: 74 6e 61 6d 65 29 0a 20 20 28 73 71 6c 69 74 65  tname).  (sqlite
6b70: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 49 4e  3:execute db "IN
6b80: 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49  SERT OR IGNORE I
6b90: 4e 54 4f 20 74 65 73 74 5f 6d 65 74 61 20 28 74  NTO test_meta (t
6ba0: 65 73 74 6e 61 6d 65 2c 61 75 74 68 6f 72 2c 6f  estname,author,o
6bb0: 77 6e 65 72 2c 64 65 73 63 72 69 70 74 69 6f 6e  wner,description
6bc0: 2c 72 65 76 69 65 77 65 64 2c 69 74 65 72 61 74  ,reviewed,iterat
6bd0: 65 64 2c 61 76 67 5f 72 75 6e 74 69 6d 65 2c 61  ed,avg_runtime,a
6be0: 76 67 5f 64 69 73 6b 2c 74 61 67 73 29 20 56 41  vg_disk,tags) VA
6bf0: 4c 55 45 53 20 28 3f 2c 27 27 2c 27 27 2c 27 27  LUES (?,'','',''
6c00: 2c 27 27 2c 27 27 2c 27 27 2c 27 27 2c 27 27 29  ,'','','','','')
6c10: 3b 22 20 74 65 73 74 6e 61 6d 65 29 29 0a 0a 3b  ;" testname))..;
6c20: 3b 20 75 70 64 61 74 65 20 6f 6e 65 20 6f 66 20  ; update one of 
6c30: 74 68 65 20 74 65 73 74 6d 65 74 61 20 66 69 65  the testmeta fie
6c40: 6c 64 73 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  lds.(define (db:
6c50: 74 65 73 74 6d 65 74 61 2d 75 70 64 61 74 65 2d  testmeta-update-
6c60: 66 69 65 6c 64 20 64 62 20 74 65 73 74 6e 61 6d  field db testnam
6c70: 65 20 66 69 65 6c 64 20 76 61 6c 75 65 29 0a 20  e field value). 
6c80: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
6c90: 65 20 64 62 20 28 63 6f 6e 63 20 22 55 50 44 41  e db (conc "UPDA
6ca0: 54 45 20 74 65 73 74 5f 6d 65 74 61 20 53 45 54  TE test_meta SET
6cb0: 20 22 20 66 69 65 6c 64 20 22 3d 3f 20 57 48 45   " field "=? WHE
6cc0: 52 45 20 74 65 73 74 6e 61 6d 65 3d 3f 3b 22 29  RE testname=?;")
6cd0: 20 76 61 6c 75 65 20 74 65 73 74 6e 61 6d 65 29   value testname)
6ce0: 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  )..;;===========
6cf0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6d00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6d10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6d20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 54  ===========.;; T
6d30: 20 45 20 53 20 54 20 20 20 44 20 41 20 54 20 41   E S T   D A T A
6d40: 20 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d   .;;============
6d50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6d60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6d70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6d80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65 66  ==========..(def
6d90: 69 6e 65 20 28 64 62 3a 63 73 76 2d 3e 74 65 73  ine (db:csv->tes
6da0: 74 2d 64 61 74 61 20 64 62 20 74 65 73 74 2d 69  t-data db test-i
6db0: 64 20 63 73 76 64 61 74 61 29 0a 20 20 28 64 65  d csvdata).  (de
6dc0: 62 75 67 3a 70 72 69 6e 74 20 34 20 22 74 65 73  bug:print 4 "tes
6dd0: 74 2d 69 64 20 22 20 74 65 73 74 2d 69 64 20 22  t-id " test-id "
6de0: 2c 20 63 73 76 64 61 74 61 3a 20 22 20 63 73 76  , csvdata: " csv
6df0: 64 61 74 61 29 0a 20 20 28 6c 65 74 20 28 28 63  data).  (let ((c
6e00: 73 76 6c 69 73 74 20 28 63 73 76 2d 3e 6c 69 73  svlist (csv->lis
6e10: 74 20 28 6d 61 6b 65 2d 63 73 76 2d 72 65 61 64  t (make-csv-read
6e20: 65 72 0a 09 09 09 20 20 20 20 20 28 6f 70 65 6e  er....     (open
6e30: 2d 69 6e 70 75 74 2d 73 74 72 69 6e 67 20 63 73  -input-string cs
6e40: 76 64 61 74 61 29 0a 09 09 09 20 20 20 20 20 27  vdata)....     '
6e50: 28 28 73 74 72 69 70 2d 6c 65 61 64 69 6e 67 2d  ((strip-leading-
6e60: 77 68 69 74 65 73 70 61 63 65 3f 20 23 74 29 0a  whitespace? #t).
6e70: 09 09 09 20 20 20 20 20 20 20 28 73 74 72 69 70  ...       (strip
6e80: 2d 74 72 61 69 6c 69 6e 67 2d 77 68 69 74 65 73  -trailing-whites
6e90: 70 61 63 65 3f 20 23 74 29 29 20 29 29 29 29 20  pace? #t)) )))) 
6ea0: 3b 3b 20 28 63 73 76 2d 3e 6c 69 73 74 20 63 73  ;; (csv->list cs
6eb0: 76 64 61 74 61 29 29 29 0a 20 20 20 20 28 66 6f  vdata))).    (fo
6ec0: 72 2d 65 61 63 68 20 0a 20 20 20 20 20 28 6c 61  r-each .     (la
6ed0: 6d 62 64 61 20 28 63 73 76 72 6f 77 29 0a 20 20  mbda (csvrow).  
6ee0: 20 20 20 20 20 28 6c 65 74 2a 20 28 28 70 61 64       (let* ((pad
6ef0: 64 65 64 2d 72 6f 77 20 20 28 74 61 6b 65 20 28  ded-row  (take (
6f00: 61 70 70 65 6e 64 20 63 73 76 72 6f 77 20 28 6c  append csvrow (l
6f10: 69 73 74 20 23 66 20 23 66 20 23 66 20 23 66 20  ist #f #f #f #f 
6f20: 23 66 20 23 66 20 23 66 20 23 66 20 23 66 29 29  #f #f #f #f #f))
6f30: 20 39 29 29 0a 09 20 20 20 20 20 20 28 63 61 74   9))..      (cat
6f40: 65 67 6f 72 79 20 20 20 20 28 6c 69 73 74 2d 72  egory    (list-r
6f50: 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20 30 29  ef padded-row 0)
6f60: 29 0a 09 20 20 20 20 20 20 28 76 61 72 69 61 62  )..      (variab
6f70: 6c 65 20 20 20 20 28 6c 69 73 74 2d 72 65 66 20  le    (list-ref 
6f80: 70 61 64 64 65 64 2d 72 6f 77 20 31 29 29 0a 09  padded-row 1))..
6f90: 20 20 20 20 20 20 28 76 61 6c 75 65 20 20 20 20        (value    
6fa0: 20 20 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 2d     (any->number-
6fb0: 69 66 2d 70 6f 73 73 69 62 6c 65 20 28 6c 69 73  if-possible (lis
6fc0: 74 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77  t-ref padded-row
6fd0: 20 32 29 29 29 0a 09 20 20 20 20 20 20 28 65 78   2)))..      (ex
6fe0: 70 65 63 74 65 64 20 20 20 20 28 61 6e 79 2d 3e  pected    (any->
6ff0: 6e 75 6d 62 65 72 2d 69 66 2d 70 6f 73 73 69 62  number-if-possib
7000: 6c 65 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64  le (list-ref pad
7010: 64 65 64 2d 72 6f 77 20 33 29 29 29 0a 09 20 20  ded-row 3)))..  
7020: 20 20 20 20 28 74 6f 6c 20 20 20 20 20 20 20 20      (tol        
7030: 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 2d 69 66   (any->number-if
7040: 2d 70 6f 73 73 69 62 6c 65 20 28 6c 69 73 74 2d  -possible (list-
7050: 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20 34  ref padded-row 4
7060: 29 29 29 20 3b 3b 20 3e 2c 20 3c 2c 20 3e 3d 2c  ))) ;; >, <, >=,
7070: 20 3c 3d 2c 20 6f 72 20 61 20 6e 75 6d 62 65 72   <=, or a number
7080: 0a 09 20 20 20 20 20 20 28 75 6e 69 74 73 20 20  ..      (units  
7090: 20 20 20 20 20 28 6c 69 73 74 2d 72 65 66 20 70       (list-ref p
70a0: 61 64 64 65 64 2d 72 6f 77 20 35 29 29 0a 09 20  added-row 5)).. 
70b0: 20 20 20 20 20 28 63 6f 6d 6d 65 6e 74 20 20 20       (comment   
70c0: 20 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64 64    (list-ref padd
70d0: 65 64 2d 72 6f 77 20 36 29 29 0a 09 20 20 20 20  ed-row 6))..    
70e0: 20 20 28 73 74 61 74 75 73 20 20 20 20 20 20 28    (status      (
70f0: 6c 65 74 20 28 28 73 20 28 6c 69 73 74 2d 72 65  let ((s (list-re
7100: 66 20 70 61 64 64 65 64 2d 72 6f 77 20 37 29 29  f padded-row 7))
7110: 29 0a 09 09 09 20 20 20 20 20 28 69 66 20 28 61  )....     (if (a
7120: 6e 64 20 28 73 74 72 69 6e 67 3f 20 73 29 28 6f  nd (string? s)(o
7130: 72 20 28 73 74 72 69 6e 67 2d 6d 61 74 63 68 20  r (string-match 
7140: 28 72 65 67 65 78 70 20 22 5e 5c 5c 73 2a 24 22  (regexp "^\\s*$"
7150: 29 20 73 29 0a 09 09 09 09 09 09 20 20 20 20 20  ) s).......     
7160: 28 73 74 72 69 6e 67 2d 6d 61 74 63 68 20 28 72  (string-match (r
7170: 65 67 65 78 70 20 22 5e 6e 2f 61 24 22 29 20 73  egexp "^n/a$") s
7180: 29 29 29 0a 09 09 09 09 20 23 66 0a 09 09 09 09  )))..... #f.....
7190: 20 73 29 29 29 20 3b 3b 20 69 66 20 73 70 65 63   s))) ;; if spec
71a0: 69 66 69 65 64 20 6f 6e 20 74 68 65 20 69 6e 70  ified on the inp
71b0: 75 74 20 74 68 65 6e 20 75 73 65 2c 20 65 6c 73  ut then use, els
71c0: 65 20 63 61 6c 63 75 6c 61 74 65 0a 09 20 20 20  e calculate..   
71d0: 20 20 20 28 74 79 70 65 20 20 20 20 20 20 20 20     (type        
71e0: 28 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65 64  (list-ref padded
71f0: 2d 72 6f 77 20 38 29 29 29 0a 09 20 3b 3b 20 6c  -row 8))).. ;; l
7200: 6f 6f 6b 20 75 70 20 65 78 70 65 63 74 65 64 2c  ook up expected,
7210: 74 6f 6c 2c 75 6e 69 74 73 20 66 72 6f 6d 20 70  tol,units from p
7220: 72 65 76 69 6f 75 73 20 62 65 73 74 20 66 69 74  revious best fit
7230: 20 74 65 73 74 20 69 66 20 74 68 65 79 20 61 72   test if they ar
7240: 65 20 61 6c 6c 20 65 69 74 68 65 72 20 23 66 20  e all either #f 
7250: 6f 72 20 27 27 0a 09 20 28 64 65 62 75 67 3a 70  or ''.. (debug:p
7260: 72 69 6e 74 20 34 20 22 42 45 46 4f 52 45 3a 20  rint 4 "BEFORE: 
7270: 63 61 74 65 67 6f 72 79 3a 20 22 20 63 61 74 65  category: " cate
7280: 67 6f 72 79 20 22 20 76 61 72 69 61 62 6c 65 3a  gory " variable:
7290: 20 22 20 76 61 72 69 61 62 6c 65 20 22 20 76 61   " variable " va
72a0: 6c 75 65 3a 20 22 20 76 61 6c 75 65 20 0a 09 09  lue: " value ...
72b0: 20 20 20 20 20 20 22 2c 20 65 78 70 65 63 74 65        ", expecte
72c0: 64 3a 20 22 20 65 78 70 65 63 74 65 64 20 22 20  d: " expected " 
72d0: 74 6f 6c 3a 20 22 20 74 6f 6c 20 22 20 75 6e 69  tol: " tol " uni
72e0: 74 73 3a 20 22 20 75 6e 69 74 73 20 22 20 73 74  ts: " units " st
72f0: 61 74 75 73 3a 20 22 20 73 74 61 74 75 73 20 22  atus: " status "
7300: 20 63 6f 6d 6d 65 6e 74 3a 20 22 20 63 6f 6d 6d   comment: " comm
7310: 65 6e 74 20 22 20 74 79 70 65 3a 20 22 20 74 79  ent " type: " ty
7320: 70 65 29 0a 0a 09 20 28 69 66 20 28 61 6e 64 20  pe)... (if (and 
7330: 28 6f 72 20 28 6e 6f 74 20 65 78 70 65 63 74 65  (or (not expecte
7340: 64 29 28 65 71 75 61 6c 3f 20 65 78 70 65 63 74  d)(equal? expect
7350: 65 64 20 22 22 29 29 0a 09 09 20 20 28 6f 72 20  ed ""))...  (or 
7360: 28 6e 6f 74 20 74 6f 6c 29 20 20 20 20 20 28 65  (not tol)     (e
7370: 71 75 61 6c 3f 20 65 78 70 65 63 74 65 64 20 22  qual? expected "
7380: 22 29 29 0a 09 09 20 20 28 6f 72 20 28 6e 6f 74  "))...  (or (not
7390: 20 75 6e 69 74 73 29 20 20 20 28 65 71 75 61 6c   units)   (equal
73a0: 3f 20 65 78 70 65 63 74 65 64 20 22 22 29 29 29  ? expected "")))
73b0: 0a 09 20 20 20 20 20 28 6c 65 74 2d 76 61 6c 75  ..     (let-valu
73c0: 65 73 20 28 28 28 6e 65 77 2d 65 78 70 65 63 74  es (((new-expect
73d0: 65 64 20 6e 65 77 2d 74 6f 6c 20 6e 65 77 2d 75  ed new-tol new-u
73e0: 6e 69 74 73 29 28 64 62 3a 67 65 74 2d 70 72 65  nits)(db:get-pre
73f0: 76 2d 74 6f 6c 2d 66 6f 72 2d 74 65 73 74 20 64  v-tol-for-test d
7400: 62 20 74 65 73 74 2d 69 64 20 63 61 74 65 67 6f  b test-id catego
7410: 72 79 20 76 61 72 69 61 62 6c 65 29 29 29 0a 09  ry variable)))..
7420: 09 09 20 28 73 65 74 21 20 65 78 70 65 63 74 65  .. (set! expecte
7430: 64 20 6e 65 77 2d 65 78 70 65 63 74 65 64 29 0a  d new-expected).
7440: 09 09 09 20 28 73 65 74 21 20 74 6f 6c 20 20 20  ... (set! tol   
7450: 20 20 20 6e 65 77 2d 74 6f 6c 29 0a 09 09 09 20     new-tol).... 
7460: 28 73 65 74 21 20 75 6e 69 74 73 20 20 20 20 6e  (set! units    n
7470: 65 77 2d 75 6e 69 74 73 29 29 29 0a 0a 09 20 28  ew-units)))... (
7480: 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22 41  debug:print 4 "A
7490: 46 54 45 52 3a 20 20 63 61 74 65 67 6f 72 79 3a  FTER:  category:
74a0: 20 22 20 63 61 74 65 67 6f 72 79 20 22 20 76 61   " category " va
74b0: 72 69 61 62 6c 65 3a 20 22 20 76 61 72 69 61 62  riable: " variab
74c0: 6c 65 20 22 20 76 61 6c 75 65 3a 20 22 20 76 61  le " value: " va
74d0: 6c 75 65 20 0a 09 09 20 20 20 20 20 20 22 2c 20  lue ...      ", 
74e0: 65 78 70 65 63 74 65 64 3a 20 22 20 65 78 70 65  expected: " expe
74f0: 63 74 65 64 20 22 20 74 6f 6c 3a 20 22 20 74 6f  cted " tol: " to
7500: 6c 20 22 20 75 6e 69 74 73 3a 20 22 20 75 6e 69  l " units: " uni
7510: 74 73 20 22 20 73 74 61 74 75 73 3a 20 22 20 73  ts " status: " s
7520: 74 61 74 75 73 20 22 20 63 6f 6d 6d 65 6e 74 3a  tatus " comment:
7530: 20 22 20 63 6f 6d 6d 65 6e 74 29 0a 09 20 3b 3b   " comment).. ;;
7540: 20 63 61 6c 63 75 6c 61 74 65 20 73 74 61 74 75   calculate statu
7550: 73 20 69 66 20 4e 4f 54 20 73 70 65 63 69 66 69  s if NOT specifi
7560: 65 64 0a 09 20 28 69 66 20 28 61 6e 64 20 28 6e  ed.. (if (and (n
7570: 6f 74 20 73 74 61 74 75 73 29 28 6e 75 6d 62 65  ot status)(numbe
7580: 72 3f 20 65 78 70 65 63 74 65 64 29 28 6e 75 6d  r? expected)(num
7590: 62 65 72 3f 20 76 61 6c 75 65 29 29 20 3b 3b 20  ber? value)) ;; 
75a0: 6e 65 65 64 20 65 78 70 65 63 74 65 64 20 61 6e  need expected an
75b0: 64 20 76 61 6c 75 65 20 74 6f 20 62 65 20 6e 75  d value to be nu
75c0: 6d 62 65 72 73 0a 09 20 20 20 20 20 28 69 66 20  mbers..     (if 
75d0: 28 6e 75 6d 62 65 72 3f 20 74 6f 6c 29 20 3b 3b  (number? tol) ;;
75e0: 20 69 66 20 74 6f 6c 20 69 73 20 61 20 6e 75 6d   if tol is a num
75f0: 62 65 72 20 74 68 65 6e 20 77 65 20 64 6f 20 74  ber then we do t
7600: 68 65 20 73 74 61 6e 64 61 72 64 20 63 6f 6d 70  he standard comp
7610: 61 72 69 73 6f 6e 0a 09 09 20 28 6c 65 74 2a 20  arison... (let* 
7620: 28 28 6d 61 78 2d 76 61 6c 20 28 2b 20 65 78 70  ((max-val (+ exp
7630: 65 63 74 65 64 20 74 6f 6c 29 29 0a 09 09 09 28  ected tol))....(
7640: 6d 69 6e 2d 76 61 6c 20 28 2d 20 65 78 70 65 63  min-val (- expec
7650: 74 65 64 20 74 6f 6c 29 29 0a 09 09 09 28 72 65  ted tol))....(re
7660: 73 75 6c 74 20 20 28 61 6e 64 20 28 3e 3d 20 20  sult  (and (>=  
7670: 76 61 6c 75 65 20 6d 69 6e 2d 76 61 6c 29 28 3c  value min-val)(<
7680: 3d 20 76 61 6c 75 65 20 6d 61 78 2d 76 61 6c 29  = value max-val)
7690: 29 29 29 0a 09 09 20 20 20 28 64 65 62 75 67 3a  )))...   (debug:
76a0: 70 72 69 6e 74 20 34 20 22 6d 61 78 2d 76 61 6c  print 4 "max-val
76b0: 3a 20 22 20 6d 61 78 2d 76 61 6c 20 22 20 6d 69  : " max-val " mi
76c0: 6e 2d 76 61 6c 3a 20 22 20 6d 69 6e 2d 76 61 6c  n-val: " min-val
76d0: 20 22 20 72 65 73 75 6c 74 3a 20 22 20 72 65 73   " result: " res
76e0: 75 6c 74 29 0a 09 09 20 20 20 28 73 65 74 21 20  ult)...   (set! 
76f0: 73 74 61 74 75 73 20 28 69 66 20 72 65 73 75 6c  status (if resul
7700: 74 20 22 70 61 73 73 22 20 22 66 61 69 6c 22 29  t "pass" "fail")
7710: 29 29 0a 09 09 20 28 73 65 74 21 20 73 74 61 74  ))... (set! stat
7720: 75 73 20 3b 3b 20 4e 42 2f 2f 20 6e 65 65 64 20  us ;; NB// need 
7730: 74 6f 20 61 73 73 65 73 73 20 65 61 63 68 20 6f  to assess each o
7740: 6e 65 20 28 69 2e 65 2e 20 6e 6f 74 20 72 65 74  ne (i.e. not ret
7750: 75 72 6e 20 6f 70 65 72 61 74 6f 72 20 73 69 6e  urn operator sin
7760: 63 65 20 6e 65 65 64 20 74 6f 20 61 63 74 20 69  ce need to act i
7770: 66 20 6e 6f 74 20 76 61 6c 69 64 20 6f 70 2e 0a  f not valid op..
7780: 09 09 20 20 20 20 20 20 20 28 63 61 73 65 20 28  ..       (case (
7790: 73 74 72 69 6e 67 2d 3e 73 79 6d 62 6f 6c 20 74  string->symbol t
77a0: 6f 6c 29 20 3b 3b 20 74 6f 6c 20 73 68 6f 75 6c  ol) ;; tol shoul
77b0: 64 20 62 65 20 3e 2c 20 3c 2c 20 3e 3d 2c 20 3c  d be >, <, >=, <
77c0: 3d 0a 09 09 09 20 28 28 3e 29 20 20 28 69 66 20  =.... ((>)  (if 
77d0: 28 3e 20 20 76 61 6c 75 65 20 65 78 70 65 63 74  (>  value expect
77e0: 65 64 29 20 22 70 61 73 73 22 20 22 66 61 69 6c  ed) "pass" "fail
77f0: 22 29 29 0a 09 09 09 20 28 28 3c 29 20 20 28 69  ")).... ((<)  (i
7800: 66 20 28 3c 20 20 76 61 6c 75 65 20 65 78 70 65  f (<  value expe
7810: 63 74 65 64 29 20 22 70 61 73 73 22 20 22 66 61  cted) "pass" "fa
7820: 69 6c 22 29 29 0a 09 09 09 20 28 28 3e 3d 29 20  il")).... ((>=) 
7830: 28 69 66 20 28 3e 3d 20 76 61 6c 75 65 20 65 78  (if (>= value ex
7840: 70 65 63 74 65 64 29 20 22 70 61 73 73 22 20 22  pected) "pass" "
7850: 66 61 69 6c 22 29 29 0a 09 09 09 20 28 28 3c 3d  fail")).... ((<=
7860: 29 20 28 69 66 20 28 3c 3d 20 76 61 6c 75 65 20  ) (if (<= value 
7870: 65 78 70 65 63 74 65 64 29 20 22 70 61 73 73 22  expected) "pass"
7880: 20 22 66 61 69 6c 22 29 29 0a 09 09 09 20 28 65   "fail")).... (e
7890: 6c 73 65 20 28 63 6f 6e 63 20 22 45 52 52 4f 52  lse (conc "ERROR
78a0: 3a 20 62 61 64 20 74 6f 6c 20 63 6f 6d 70 61 72  : bad tol compar
78b0: 61 74 6f 72 20 22 20 74 6f 6c 29 29 29 29 29 29  ator " tol))))))
78c0: 0a 09 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20  .. (debug:print 
78d0: 34 20 22 41 46 54 45 52 32 3a 20 63 61 74 65 67  4 "AFTER2: categ
78e0: 6f 72 79 3a 20 22 20 63 61 74 65 67 6f 72 79 20  ory: " category 
78f0: 22 20 76 61 72 69 61 62 6c 65 3a 20 22 20 76 61  " variable: " va
7900: 72 69 61 62 6c 65 20 22 20 76 61 6c 75 65 3a 20  riable " value: 
7910: 22 20 76 61 6c 75 65 20 0a 09 09 20 20 20 20 20  " value ...     
7920: 20 22 2c 20 65 78 70 65 63 74 65 64 3a 20 22 20   ", expected: " 
7930: 65 78 70 65 63 74 65 64 20 22 20 74 6f 6c 3a 20  expected " tol: 
7940: 22 20 74 6f 6c 20 22 20 75 6e 69 74 73 3a 20 22  " tol " units: "
7950: 20 75 6e 69 74 73 20 22 20 73 74 61 74 75 73 3a   units " status:
7960: 20 22 20 73 74 61 74 75 73 20 22 20 63 6f 6d 6d   " status " comm
7970: 65 6e 74 3a 20 22 20 63 6f 6d 6d 65 6e 74 29 0a  ent: " comment).
7980: 09 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75  . (sqlite3:execu
7990: 74 65 20 64 62 20 22 49 4e 53 45 52 54 20 4f 52  te db "INSERT OR
79a0: 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 65   REPLACE INTO te
79b0: 73 74 5f 64 61 74 61 20 28 74 65 73 74 5f 69 64  st_data (test_id
79c0: 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62  ,category,variab
79d0: 6c 65 2c 76 61 6c 75 65 2c 65 78 70 65 63 74 65  le,value,expecte
79e0: 64 2c 74 6f 6c 2c 75 6e 69 74 73 2c 63 6f 6d 6d  d,tol,units,comm
79f0: 65 6e 74 2c 73 74 61 74 75 73 2c 74 79 70 65 29  ent,status,type)
7a00: 20 56 41 4c 55 45 53 20 28 3f 2c 3f 2c 3f 2c 3f   VALUES (?,?,?,?
7a10: 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 29 3b 22 0a  ,?,?,?,?,?,?);".
7a20: 09 09 09 20 20 74 65 73 74 2d 69 64 20 63 61 74  ...  test-id cat
7a30: 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65 20 76  egory variable v
7a40: 61 6c 75 65 20 65 78 70 65 63 74 65 64 20 74 6f  alue expected to
7a50: 6c 20 75 6e 69 74 73 20 28 69 66 20 63 6f 6d 6d  l units (if comm
7a60: 65 6e 74 20 63 6f 6d 6d 65 6e 74 20 22 22 29 20  ent comment "") 
7a70: 73 74 61 74 75 73 20 74 79 70 65 29 29 29 0a 20  status type))). 
7a80: 20 20 20 20 63 73 76 6c 69 73 74 29 29 29 0a 0a      csvlist)))..
7a90: 3b 3b 20 67 65 74 20 61 20 6c 69 73 74 20 6f 66  ;; get a list of
7aa0: 20 74 65 73 74 5f 64 61 74 61 20 72 65 63 6f 72   test_data recor
7ab0: 64 73 20 6d 61 74 63 68 69 6e 67 20 63 61 74 65  ds matching cate
7ac0: 67 6f 72 79 70 61 74 74 0a 28 64 65 66 69 6e 65  gorypatt.(define
7ad0: 20 28 64 62 3a 72 65 61 64 2d 74 65 73 74 2d 64   (db:read-test-d
7ae0: 61 74 61 20 64 62 20 74 65 73 74 2d 69 64 20 63  ata db test-id c
7af0: 61 74 65 67 6f 72 79 70 61 74 74 29 0a 20 20 28  ategorypatt).  (
7b00: 6c 65 74 20 28 28 72 65 73 20 27 28 29 29 29 0a  let ((res '())).
7b10: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72      (sqlite3:for
7b20: 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20 20 20 20  -each-row .     
7b30: 28 6c 61 6d 62 64 61 20 28 69 64 20 74 65 73 74  (lambda (id test
7b40: 5f 69 64 20 63 61 74 65 67 6f 72 79 20 76 61 72  _id category var
7b50: 69 61 62 6c 65 20 76 61 6c 75 65 20 65 78 70 65  iable value expe
7b60: 63 74 65 64 20 74 6f 6c 20 75 6e 69 74 73 20 63  cted tol units c
7b70: 6f 6d 6d 65 6e 74 20 73 74 61 74 75 73 20 74 79  omment status ty
7b80: 70 65 29 0a 20 20 20 20 20 20 20 28 73 65 74 21  pe).       (set!
7b90: 20 72 65 73 20 28 63 6f 6e 73 20 28 76 65 63 74   res (cons (vect
7ba0: 6f 72 20 69 64 20 74 65 73 74 5f 69 64 20 63 61  or id test_id ca
7bb0: 74 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65 20  tegory variable 
7bc0: 76 61 6c 75 65 20 65 78 70 65 63 74 65 64 20 74  value expected t
7bd0: 6f 6c 20 75 6e 69 74 73 20 63 6f 6d 6d 65 6e 74  ol units comment
7be0: 20 73 74 61 74 75 73 20 74 79 70 65 29 20 72 65   status type) re
7bf0: 73 29 29 29 0a 20 20 20 20 20 64 62 0a 20 20 20  s))).     db.   
7c00: 20 20 22 53 45 4c 45 43 54 20 69 64 2c 74 65 73    "SELECT id,tes
7c10: 74 5f 69 64 2c 63 61 74 65 67 6f 72 79 2c 76 61  t_id,category,va
7c20: 72 69 61 62 6c 65 2c 76 61 6c 75 65 2c 65 78 70  riable,value,exp
7c30: 65 63 74 65 64 2c 74 6f 6c 2c 75 6e 69 74 73 2c  ected,tol,units,
7c40: 63 6f 6d 6d 65 6e 74 2c 73 74 61 74 75 73 2c 74  comment,status,t
7c50: 79 70 65 20 46 52 4f 4d 20 74 65 73 74 5f 64 61  ype FROM test_da
7c60: 74 61 20 57 48 45 52 45 20 74 65 73 74 5f 69 64  ta WHERE test_id
7c70: 3d 3f 20 41 4e 44 20 63 61 74 65 67 6f 72 79 20  =? AND category 
7c80: 4c 49 4b 45 20 3f 20 4f 52 44 45 52 20 42 59 20  LIKE ? ORDER BY 
7c90: 63 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62 6c  category,variabl
7ca0: 65 3b 22 20 74 65 73 74 2d 69 64 20 63 61 74 65  e;" test-id cate
7cb0: 67 6f 72 79 70 61 74 74 29 0a 20 20 20 20 28 72  gorypatt).    (r
7cc0: 65 76 65 72 73 65 20 72 65 73 29 29 29 0a 0a 28  everse res)))..(
7cd0: 64 65 66 69 6e 65 20 28 64 62 3a 6c 6f 61 64 2d  define (db:load-
7ce0: 74 65 73 74 2d 64 61 74 61 20 64 62 20 72 75 6e  test-data db run
7cf0: 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74  -id test-name it
7d00: 65 6d 64 61 74 29 0a 20 20 28 6c 65 74 2a 20 28  emdat).  (let* (
7d10: 28 69 74 65 6d 2d 70 61 74 68 20 28 69 74 65 6d  (item-path (item
7d20: 2d 6c 69 73 74 2d 3e 70 61 74 68 20 69 74 65 6d  -list->path item
7d30: 64 61 74 29 29 0a 09 20 28 74 65 73 74 64 61 74  dat)).. (testdat
7d40: 20 28 64 62 3a 67 65 74 2d 74 65 73 74 2d 69 6e   (db:get-test-in
7d50: 66 6f 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73  fo db run-id tes
7d60: 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68  t-name item-path
7d70: 29 29 0a 09 20 28 74 65 73 74 2d 69 64 20 28 69  )).. (test-id (i
7d80: 66 20 74 65 73 74 64 61 74 20 28 64 62 3a 74 65  f testdat (db:te
7d90: 73 74 2d 67 65 74 2d 69 64 20 74 65 73 74 64 61  st-get-id testda
7da0: 74 29 20 23 66 29 29 29 0a 20 20 20 20 3b 3b 20  t) #f))).    ;; 
7db0: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 31 20 22  (debug:print 1 "
7dc0: 45 6e 74 65 72 20 72 65 63 6f 72 64 73 20 74 6f  Enter records to
7dd0: 20 69 6e 73 65 72 74 20 69 6e 20 74 68 65 20 74   insert in the t
7de0: 65 73 74 5f 64 61 74 61 20 74 61 62 6c 65 2c 20  est_data table, 
7df0: 73 65 76 65 6e 20 66 69 65 6c 64 73 2c 20 63 6f  seven fields, co
7e00: 6d 6d 61 20 73 65 70 61 72 61 74 65 64 20 70 65  mma separated pe
7e10: 72 20 6c 69 6e 65 22 29 0a 20 20 20 20 28 64 65  r line").    (de
7e20: 62 75 67 3a 70 72 69 6e 74 20 34 20 22 69 74 65  bug:print 4 "ite
7e30: 6d 64 61 74 3a 20 22 20 69 74 65 6d 64 61 74 20  mdat: " itemdat 
7e40: 22 2c 20 74 65 73 74 2d 6e 61 6d 65 3a 20 22 20  ", test-name: " 
7e50: 74 65 73 74 2d 6e 61 6d 65 20 22 2c 20 74 65 73  test-name ", tes
7e60: 74 2d 69 64 3a 20 22 20 74 65 73 74 2d 69 64 29  t-id: " test-id)
7e70: 0a 20 20 20 20 28 69 66 20 74 65 73 74 2d 69 64  .    (if test-id
7e80: 0a 09 28 6c 65 74 20 6c 6f 6f 70 20 28 28 6c 69  ..(let loop ((li
7e90: 6e 20 28 72 65 61 64 2d 6c 69 6e 65 29 29 29 0a  n (read-line))).
7ea0: 09 20 20 28 69 66 20 28 6e 6f 74 20 28 65 6f 66  .  (if (not (eof
7eb0: 2d 6f 62 6a 65 63 74 3f 20 6c 69 6e 29 29 0a 09  -object? lin))..
7ec0: 20 20 20 20 20 20 28 62 65 67 69 6e 0a 09 09 28        (begin...(
7ed0: 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20 6c 69  debug:print 4 li
7ee0: 6e 29 0a 09 09 28 64 62 3a 63 73 76 2d 3e 74 65  n)...(db:csv->te
7ef0: 73 74 2d 64 61 74 61 20 64 62 20 74 65 73 74 2d  st-data db test-
7f00: 69 64 20 6c 69 6e 29 0a 09 09 28 6c 6f 6f 70 20  id lin)...(loop 
7f10: 28 72 65 61 64 2d 6c 69 6e 65 29 29 29 29 29 29  (read-line))))))
7f20: 0a 20 20 20 20 3b 3b 20 72 6f 6c 6c 20 75 70 20  .    ;; roll up 
7f30: 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 73 75  the current resu
7f40: 6c 74 73 2e 0a 20 20 20 20 3b 3b 20 46 49 58 4d  lts..    ;; FIXM
7f50: 45 3a 20 41 64 64 20 74 68 65 20 73 74 61 74 75  E: Add the statu
7f60: 73 20 74 6f 20 0a 20 20 20 20 28 64 62 3a 74 65  s to .    (db:te
7f70: 73 74 2d 64 61 74 61 2d 72 6f 6c 6c 75 70 20 64  st-data-rollup d
7f80: 62 20 74 65 73 74 2d 69 64 20 23 66 29 29 29 0a  b test-id #f))).
7f90: 0a 3b 3b 20 57 41 52 4e 49 4e 47 3a 20 44 6f 20  .;; WARNING: Do 
7fa0: 4e 4f 54 20 63 61 6c 6c 20 74 68 69 73 20 66 6f  NOT call this fo
7fb0: 72 20 74 68 65 20 70 61 72 65 6e 74 20 74 65 73  r the parent tes
7fc0: 74 20 6f 6e 20 61 6e 20 69 74 65 72 61 74 65 64  t on an iterated
7fd0: 20 74 65 73 74 0a 3b 3b 20 52 6f 6c 6c 20 75 70   test.;; Roll up
7fe0: 20 74 65 73 74 5f 64 61 74 61 20 70 61 73 73 2f   test_data pass/
7ff0: 66 61 69 6c 20 72 65 73 75 6c 74 73 0a 3b 3b 20  fail results.;; 
8000: 6c 6f 6f 6b 20 61 74 20 74 68 65 20 74 65 73 74  look at the test
8010: 5f 64 61 74 61 20 73 74 61 74 75 73 20 66 69 65  _data status fie
8020: 6c 64 2c 20 0a 3b 3b 20 20 20 20 69 66 20 61 6c  ld, .;;    if al
8030: 6c 20 61 72 65 20 70 61 73 73 20 28 61 6e 79 20  l are pass (any 
8040: 63 61 73 65 29 20 61 6e 64 20 74 68 65 20 74 65  case) and the te
8050: 73 74 20 73 74 61 74 75 73 20 69 73 20 50 41 53  st status is PAS
8060: 53 20 6f 72 20 4e 55 4c 4c 20 6f 72 20 27 27 20  S or NULL or '' 
8070: 74 68 65 6e 20 73 65 74 20 74 65 73 74 20 73 74  then set test st
8080: 61 74 75 73 20 74 6f 20 50 41 53 53 2e 0a 3b 3b  atus to PASS..;;
8090: 20 20 20 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f      if one or mo
80a0: 72 65 20 61 72 65 20 66 61 69 6c 20 28 61 6e 79  re are fail (any
80b0: 20 63 61 73 65 29 20 74 68 65 6e 20 73 65 74 20   case) then set 
80c0: 74 65 73 74 20 73 74 61 74 75 73 20 74 6f 20 50  test status to P
80d0: 41 53 53 2c 20 6e 6f 6e 20 22 70 61 73 73 22 20  ASS, non "pass" 
80e0: 6f 72 20 22 66 61 69 6c 22 20 61 72 65 20 69 67  or "fail" are ig
80f0: 6e 6f 72 65 64 0a 28 64 65 66 69 6e 65 20 28 64  nored.(define (d
8100: 62 3a 74 65 73 74 2d 64 61 74 61 2d 72 6f 6c 6c  b:test-data-roll
8110: 75 70 20 64 62 20 74 65 73 74 2d 69 64 20 73 74  up db test-id st
8120: 61 74 75 73 29 0a 20 20 28 73 71 6c 69 74 65 33  atus).  (sqlite3
8130: 3a 65 78 65 63 75 74 65 20 0a 20 20 20 64 62 20  :execute .   db 
8140: 0a 20 20 20 22 55 50 44 41 54 45 20 74 65 73 74  .   "UPDATE test
8150: 73 20 0a 20 20 20 20 20 20 53 45 54 20 66 61 69  s .      SET fai
8160: 6c 5f 63 6f 75 6e 74 3d 28 53 45 4c 45 43 54 20  l_count=(SELECT 
8170: 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 74  count(id) FROM t
8180: 65 73 74 5f 64 61 74 61 20 57 48 45 52 45 20 74  est_data WHERE t
8190: 65 73 74 5f 69 64 3d 3f 20 41 4e 44 20 73 74 61  est_id=? AND sta
81a0: 74 75 73 20 6c 69 6b 65 20 27 66 61 69 6c 27 29  tus like 'fail')
81b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 61 73 73  ,.          pass
81c0: 5f 63 6f 75 6e 74 3d 28 53 45 4c 45 43 54 20 63  _count=(SELECT c
81d0: 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 74 65  ount(id) FROM te
81e0: 73 74 5f 64 61 74 61 20 57 48 45 52 45 20 74 65  st_data WHERE te
81f0: 73 74 5f 69 64 3d 3f 20 41 4e 44 20 73 74 61 74  st_id=? AND stat
8200: 75 73 20 6c 69 6b 65 20 27 70 61 73 73 27 29 0a  us like 'pass').
8210: 20 20 20 20 20 20 57 48 45 52 45 20 69 64 3d 3f        WHERE id=?
8220: 3b 22 0a 20 20 20 74 65 73 74 2d 69 64 20 74 65  ;".   test-id te
8230: 73 74 2d 69 64 20 74 65 73 74 2d 69 64 29 0a 20  st-id test-id). 
8240: 20 3b 3b 20 69 66 20 74 68 65 20 74 65 73 74 20   ;; if the test 
8250: 69 73 20 6e 6f 74 20 46 41 49 4c 20 74 68 65 6e  is not FAIL then
8260: 20 73 65 74 20 73 74 61 74 75 73 20 62 61 73 65   set status base
8270: 64 20 6f 6e 20 74 68 65 20 66 61 69 6c 20 61 6e  d on the fail an
8280: 64 20 70 61 73 73 20 63 6f 75 6e 74 73 2e 0a 20  d pass counts.. 
8290: 20 28 74 68 72 65 61 64 2d 73 6c 65 65 70 21 20   (thread-sleep! 
82a0: 31 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78  1).  (sqlite3:ex
82b0: 65 63 75 74 65 0a 20 20 20 64 62 20 20 20 3b 3b  ecute.   db   ;;
82c0: 3b 20 4e 4f 54 45 3a 20 53 68 6f 75 6c 64 20 74  ; NOTE: Should t
82d0: 68 69 73 20 62 65 20 57 41 52 4e 2c 46 41 49 4c  his be WARN,FAIL
82e0: 3f 20 41 20 57 41 52 4e 20 69 73 20 6e 6f 74 20  ? A WARN is not 
82f0: 61 20 46 41 49 4c 3f 3f 3f 3f 3f 20 42 55 47 20  a FAIL????? BUG 
8300: 46 49 58 4d 45 0a 20 20 20 22 55 50 44 41 54 45  FIXME.   "UPDATE
8310: 20 74 65 73 74 73 0a 20 20 20 20 20 20 53 45 54   tests.      SET
8320: 20 73 74 61 74 75 73 3d 43 41 53 45 20 57 48 45   status=CASE WHE
8330: 4e 20 28 53 45 4c 45 43 54 20 66 61 69 6c 5f 63  N (SELECT fail_c
8340: 6f 75 6e 74 20 46 52 4f 4d 20 74 65 73 74 73 20  ount FROM tests 
8350: 57 48 45 52 45 20 69 64 3d 3f 29 20 3e 20 30 20  WHERE id=?) > 0 
8360: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8370: 20 20 20 20 20 20 20 20 20 20 54 48 45 4e 20 27            THEN '
8380: 46 41 49 4c 27 0a 20 20 20 20 20 20 20 20 20 20  FAIL'.          
8390: 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 4e              WHEN
83a0: 20 28 53 45 4c 45 43 54 20 70 61 73 73 5f 63 6f   (SELECT pass_co
83b0: 75 6e 74 20 46 52 4f 4d 20 74 65 73 74 73 20 57  unt FROM tests W
83c0: 48 45 52 45 20 69 64 3d 3f 29 20 3e 20 30 20 41  HERE id=?) > 0 A
83d0: 4e 44 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ND .            
83e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
83f0: 53 45 4c 45 43 54 20 73 74 61 74 75 73 20 46 52  SELECT status FR
8400: 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 69  OM tests WHERE i
8410: 64 3d 3f 29 20 4e 4f 54 20 49 4e 20 28 27 57 41  d=?) NOT IN ('WA
8420: 52 4e 27 2c 27 46 41 49 4c 27 29 0a 20 20 20 20  RN','FAIL').    
8430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8440: 20 20 20 20 20 54 48 45 4e 20 27 50 41 53 53 27       THEN 'PASS'
8450: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8460: 20 20 20 20 20 20 20 45 4c 53 45 20 73 74 61 74         ELSE stat
8470: 75 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  us.             
8480: 20 20 20 20 20 45 4e 44 20 57 48 45 52 45 20 69       END WHERE i
8490: 64 3d 3f 3b 22 0a 20 20 20 74 65 73 74 2d 69 64  d=?;".   test-id
84a0: 20 74 65 73 74 2d 69 64 20 74 65 73 74 2d 69 64   test-id test-id
84b0: 20 74 65 73 74 2d 69 64 29 29 0a 0a 28 64 65 66   test-id))..(def
84c0: 69 6e 65 20 28 64 62 3a 67 65 74 2d 70 72 65 76  ine (db:get-prev
84d0: 2d 74 6f 6c 2d 66 6f 72 2d 74 65 73 74 20 64 62  -tol-for-test db
84e0: 20 74 65 73 74 2d 69 64 20 63 61 74 65 67 6f 72   test-id categor
84f0: 79 20 76 61 72 69 61 62 6c 65 29 0a 20 20 3b 3b  y variable).  ;;
8500: 20 46 69 6e 69 73 68 20 6d 65 3f 0a 20 20 28 76   Finish me?.  (v
8510: 61 6c 75 65 73 20 23 66 20 23 66 20 23 66 29 29  alues #f #f #f))
8520: 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ..;;============
8530: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8540: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8550: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8560: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 53 20  ==========.;; S 
8570: 54 20 45 20 50 20 53 20 0a 3b 3b 3d 3d 3d 3d 3d  T E P S .;;=====
8580: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8590: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
85a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
85b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
85c0: 3d 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 73  =..(define (db:s
85d0: 74 65 70 2d 67 65 74 2d 74 69 6d 65 2d 61 73 2d  tep-get-time-as-
85e0: 73 74 72 69 6e 67 20 76 65 63 29 0a 20 20 28 73  string vec).  (s
85f0: 65 63 6f 6e 64 73 2d 3e 74 69 6d 65 2d 73 74 72  econds->time-str
8600: 69 6e 67 20 28 64 62 3a 73 74 65 70 2d 67 65 74  ing (db:step-get
8610: 2d 65 76 65 6e 74 5f 74 69 6d 65 20 76 65 63 29  -event_time vec)
8620: 29 29 0a 0a 3b 3b 20 64 62 2d 67 65 74 2d 74 65  ))..;; db-get-te
8630: 73 74 2d 73 74 65 70 73 2d 66 6f 72 2d 72 75 6e  st-steps-for-run
8640: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74  .(define (db:get
8650: 2d 73 74 65 70 73 2d 66 6f 72 2d 74 65 73 74 20  -steps-for-test 
8660: 64 62 20 74 65 73 74 2d 69 64 29 0a 20 20 28 6c  db test-id).  (l
8670: 65 74 20 28 28 72 65 73 20 27 28 29 29 29 0a 20  et ((res '())). 
8680: 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d     (sqlite3:for-
8690: 65 61 63 68 2d 72 6f 77 20 0a 20 20 20 20 20 28  each-row .     (
86a0: 6c 61 6d 62 64 61 20 28 69 64 20 74 65 73 74 2d  lambda (id test-
86b0: 69 64 20 73 74 65 70 6e 61 6d 65 20 73 74 61 74  id stepname stat
86c0: 65 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d 74  e status event-t
86d0: 69 6d 65 20 6c 6f 67 66 69 6c 65 29 0a 20 20 20  ime logfile).   
86e0: 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28 63      (set! res (c
86f0: 6f 6e 73 20 28 76 65 63 74 6f 72 20 69 64 20 74  ons (vector id t
8700: 65 73 74 2d 69 64 20 73 74 65 70 6e 61 6d 65 20  est-id stepname 
8710: 73 74 61 74 65 20 73 74 61 74 75 73 20 65 76 65  state status eve
8720: 6e 74 2d 74 69 6d 65 20 28 69 66 20 28 73 74 72  nt-time (if (str
8730: 69 6e 67 3f 20 6c 6f 67 66 69 6c 65 29 20 6c 6f  ing? logfile) lo
8740: 67 66 69 6c 65 20 22 22 29 29 20 72 65 73 29 29  gfile "")) res))
8750: 29 0a 20 20 20 20 20 64 62 0a 20 20 20 20 20 22  ).     db.     "
8760: 53 45 4c 45 43 54 20 69 64 2c 74 65 73 74 5f 69  SELECT id,test_i
8770: 64 2c 73 74 65 70 6e 61 6d 65 2c 73 74 61 74 65  d,stepname,state
8780: 2c 73 74 61 74 75 73 2c 65 76 65 6e 74 5f 74 69  ,status,event_ti
8790: 6d 65 2c 6c 6f 67 66 69 6c 65 20 46 52 4f 4d 20  me,logfile FROM 
87a0: 74 65 73 74 5f 73 74 65 70 73 20 57 48 45 52 45  test_steps WHERE
87b0: 20 74 65 73 74 5f 69 64 3d 3f 20 4f 52 44 45 52   test_id=? ORDER
87c0: 20 42 59 20 69 64 20 41 53 43 3b 22 20 3b 3b 20   BY id ASC;" ;; 
87d0: 65 76 65 6e 74 5f 74 69 6d 65 20 44 45 53 43 2c  event_time DESC,
87e0: 69 64 20 41 53 43 3b 0a 20 20 20 20 20 74 65 73  id ASC;.     tes
87f0: 74 2d 69 64 29 0a 20 20 20 20 28 72 65 76 65 72  t-id).    (rever
8800: 73 65 20 72 65 73 29 29 29 0a 0a 3b 3b 20 67 65  se res)))..;; ge
8810: 74 20 61 20 70 72 65 74 74 79 20 74 61 62 6c 65  t a pretty table
8820: 20 74 6f 20 73 75 6d 6d 61 72 69 7a 65 20 73 74   to summarize st
8830: 65 70 73 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 28  eps.;;.(define (
8840: 64 62 3a 67 65 74 2d 73 74 65 70 73 2d 74 61 62  db:get-steps-tab
8850: 6c 65 20 64 62 20 74 65 73 74 2d 69 64 29 0a 20  le db test-id). 
8860: 20 28 6c 65 74 20 28 28 73 74 65 70 73 20 20 20   (let ((steps   
8870: 28 64 62 3a 67 65 74 2d 73 74 65 70 73 2d 66 6f  (db:get-steps-fo
8880: 72 2d 74 65 73 74 20 64 62 20 74 65 73 74 2d 69  r-test db test-i
8890: 64 29 29 29 0a 20 20 20 20 3b 3b 20 6f 72 67 61  d))).    ;; orga
88a0: 6e 69 73 65 20 74 68 65 20 73 74 65 70 73 20 66  nise the steps f
88b0: 6f 72 20 62 65 74 74 65 72 20 72 65 61 64 61 62  or better readab
88c0: 69 6c 69 74 79 0a 20 20 20 20 28 6c 65 74 20 28  ility.    (let (
88d0: 28 72 65 73 20 28 6d 61 6b 65 2d 68 61 73 68 2d  (res (make-hash-
88e0: 74 61 62 6c 65 29 29 29 0a 20 20 20 20 20 20 28  table))).      (
88f0: 66 6f 72 2d 65 61 63 68 20 0a 20 20 20 20 20 20  for-each .      
8900: 20 28 6c 61 6d 62 64 61 20 28 73 74 65 70 29 0a   (lambda (step).
8910: 09 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 36  . (debug:print 6
8920: 20 22 73 74 65 70 3d 22 20 73 74 65 70 29 0a 09   "step=" step)..
8930: 20 28 6c 65 74 20 28 28 72 65 63 6f 72 64 20 28   (let ((record (
8940: 68 61 73 68 2d 74 61 62 6c 65 2d 72 65 66 2f 64  hash-table-ref/d
8950: 65 66 61 75 6c 74 20 0a 09 09 09 72 65 73 20 0a  efault ....res .
8960: 09 09 09 28 64 62 3a 73 74 65 70 2d 67 65 74 2d  ...(db:step-get-
8970: 73 74 65 70 6e 61 6d 65 20 73 74 65 70 29 20 0a  stepname step) .
8980: 09 09 09 3b 3b 20 20 20 20 20 20 20 20 73 74 65  ...;;        ste
8990: 70 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20  pname           
89a0: 20 20 20 20 20 73 74 61 72 74 20 65 6e 64 20 73       start end s
89b0: 74 61 74 75 73 20 20 20 20 0a 09 09 09 28 76 65  tatus    ....(ve
89c0: 63 74 6f 72 20 28 64 62 3a 73 74 65 70 2d 67 65  ctor (db:step-ge
89d0: 74 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70 29  t-stepname step)
89e0: 20 22 22 20 20 20 22 22 20 22 22 20 20 20 20 20   ""   "" ""     
89f0: 22 22 20 22 22 29 29 29 29 0a 09 20 20 20 28 64  "" ""))))..   (d
8a00: 65 62 75 67 3a 70 72 69 6e 74 20 36 20 22 72 65  ebug:print 6 "re
8a10: 63 6f 72 64 28 62 65 66 6f 72 65 29 20 3d 20 22  cord(before) = "
8a20: 20 72 65 63 6f 72 64 20 0a 09 09 09 22 5c 6e 69   record ...."\ni
8a30: 64 3a 20 20 20 20 20 20 20 22 20 28 64 62 3a 73  d:       " (db:s
8a40: 74 65 70 2d 67 65 74 2d 69 64 20 73 74 65 70 29  tep-get-id step)
8a50: 0a 09 09 09 22 5c 6e 73 74 65 70 6e 61 6d 65 3a  ...."\nstepname:
8a60: 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d   " (db:step-get-
8a70: 73 74 65 70 6e 61 6d 65 20 73 74 65 70 29 0a 09  stepname step)..
8a80: 09 09 22 5c 6e 73 74 61 74 65 3a 20 20 20 20 22  .."\nstate:    "
8a90: 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74   (db:step-get-st
8aa0: 61 74 65 20 73 74 65 70 29 0a 09 09 09 22 5c 6e  ate step)...."\n
8ab0: 73 74 61 74 75 73 3a 20 20 20 22 20 28 64 62 3a  status:   " (db:
8ac0: 73 74 65 70 2d 67 65 74 2d 73 74 61 74 75 73 20  step-get-status 
8ad0: 73 74 65 70 29 0a 09 09 09 22 5c 6e 74 69 6d 65  step)...."\ntime
8ae0: 3a 20 20 20 20 20 22 20 28 64 62 3a 73 74 65 70  :     " (db:step
8af0: 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20  -get-event_time 
8b00: 73 74 65 70 29 29 0a 09 20 20 20 28 63 61 73 65  step))..   (case
8b10: 20 28 73 74 72 69 6e 67 2d 3e 73 79 6d 62 6f 6c   (string->symbol
8b20: 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74   (db:step-get-st
8b30: 61 74 65 20 73 74 65 70 29 29 0a 09 20 20 20 20  ate step))..    
8b40: 20 28 28 73 74 61 72 74 29 28 76 65 63 74 6f 72   ((start)(vector
8b50: 2d 73 65 74 21 20 72 65 63 6f 72 64 20 31 20 28  -set! record 1 (
8b60: 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 6e  db:step-get-even
8b70: 74 5f 74 69 6d 65 20 73 74 65 70 29 29 0a 09 20  t_time step)).. 
8b80: 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74       (vector-set
8b90: 21 20 72 65 63 6f 72 64 20 33 20 28 69 66 20 28  ! record 3 (if (
8ba0: 65 71 75 61 6c 3f 20 28 76 65 63 74 6f 72 2d 72  equal? (vector-r
8bb0: 65 66 20 72 65 63 6f 72 64 20 33 29 20 22 22 29  ef record 3) "")
8bc0: 0a 09 09 09 09 09 28 64 62 3a 73 74 65 70 2d 67  ......(db:step-g
8bd0: 65 74 2d 73 74 61 74 75 73 20 73 74 65 70 29 29  et-status step))
8be0: 29 0a 09 20 20 20 20 20 20 28 69 66 20 28 3e 20  )..      (if (> 
8bf0: 28 73 74 72 69 6e 67 2d 6c 65 6e 67 74 68 20 28  (string-length (
8c00: 64 62 3a 73 74 65 70 2d 67 65 74 2d 6c 6f 67 66  db:step-get-logf
8c10: 69 6c 65 20 73 74 65 70 29 29 0a 09 09 20 20 20  ile step))...   
8c20: 20 20 30 29 0a 09 09 20 20 28 76 65 63 74 6f 72    0)...  (vector
8c30: 2d 73 65 74 21 20 72 65 63 6f 72 64 20 35 20 28  -set! record 5 (
8c40: 64 62 3a 73 74 65 70 2d 67 65 74 2d 6c 6f 67 66  db:step-get-logf
8c50: 69 6c 65 20 73 74 65 70 29 29 29 29 0a 09 20 20  ile step))))..  
8c60: 20 20 20 28 28 65 6e 64 29 20 20 0a 09 20 20 20     ((end)  ..   
8c70: 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20     (vector-set! 
8c80: 72 65 63 6f 72 64 20 32 20 28 61 6e 79 2d 3e 6e  record 2 (any->n
8c90: 75 6d 62 65 72 20 28 64 62 3a 73 74 65 70 2d 67  umber (db:step-g
8ca0: 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73 74  et-event_time st
8cb0: 65 70 29 29 29 0a 09 20 20 20 20 20 20 28 76 65  ep)))..      (ve
8cc0: 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64  ctor-set! record
8cd0: 20 33 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d   3 (db:step-get-
8ce0: 73 74 61 74 75 73 20 73 74 65 70 29 29 0a 09 20  status step)).. 
8cf0: 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74       (vector-set
8d00: 21 20 72 65 63 6f 72 64 20 34 20 28 6c 65 74 20  ! record 4 (let 
8d10: 28 28 73 74 61 72 74 74 20 28 61 6e 79 2d 3e 6e  ((startt (any->n
8d20: 75 6d 62 65 72 20 28 76 65 63 74 6f 72 2d 72 65  umber (vector-re
8d30: 66 20 72 65 63 6f 72 64 20 31 29 29 29 0a 09 09  f record 1)))...
8d40: 09 09 09 20 20 28 65 6e 64 74 20 20 20 28 61 6e  ...  (endt   (an
8d50: 79 2d 3e 6e 75 6d 62 65 72 20 28 76 65 63 74 6f  y->number (vecto
8d60: 72 2d 72 65 66 20 72 65 63 6f 72 64 20 32 29 29  r-ref record 2))
8d70: 29 29 0a 09 09 09 09 20 20 20 20 20 20 28 64 65  )).....      (de
8d80: 62 75 67 3a 70 72 69 6e 74 20 34 20 22 72 65 63  bug:print 4 "rec
8d90: 6f 72 64 5b 31 5d 3d 22 20 28 76 65 63 74 6f 72  ord[1]=" (vector
8da0: 2d 72 65 66 20 72 65 63 6f 72 64 20 31 29 20 0a  -ref record 1) .
8db0: 09 09 09 09 09 09 20 20 20 22 2c 20 73 74 61 72  ......   ", star
8dc0: 74 74 3d 22 20 73 74 61 72 74 74 20 22 2c 20 65  tt=" startt ", e
8dd0: 6e 64 74 3d 22 20 65 6e 64 74 0a 09 09 09 09 09  ndt=" endt......
8de0: 09 20 20 20 22 2c 20 67 65 74 2d 73 74 61 74 75  .   ", get-statu
8df0: 73 3a 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65  s: " (db:step-ge
8e00: 74 2d 73 74 61 74 75 73 20 73 74 65 70 29 29 0a  t-status step)).
8e10: 09 09 09 09 20 20 20 20 20 20 28 69 66 20 28 61  ....      (if (a
8e20: 6e 64 20 28 6e 75 6d 62 65 72 3f 20 73 74 61 72  nd (number? star
8e30: 74 74 29 28 6e 75 6d 62 65 72 3f 20 65 6e 64 74  tt)(number? endt
8e40: 29 29 0a 09 09 09 09 09 20 20 28 73 65 63 6f 6e  ))......  (secon
8e50: 64 73 2d 3e 68 72 2d 6d 69 6e 2d 73 65 63 20 28  ds->hr-min-sec (
8e60: 2d 20 65 6e 64 74 20 73 74 61 72 74 74 29 29 20  - endt startt)) 
8e70: 22 2d 31 22 29 29 29 0a 09 20 20 20 20 20 20 28  "-1")))..      (
8e80: 69 66 20 28 3e 20 28 73 74 72 69 6e 67 2d 6c 65  if (> (string-le
8e90: 6e 67 74 68 20 28 64 62 3a 73 74 65 70 2d 67 65  ngth (db:step-ge
8ea0: 74 2d 6c 6f 67 66 69 6c 65 20 73 74 65 70 29 29  t-logfile step))
8eb0: 0a 09 09 20 20 20 20 20 30 29 0a 09 09 20 20 28  ...     0)...  (
8ec0: 76 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f  vector-set! reco
8ed0: 72 64 20 35 20 28 64 62 3a 73 74 65 70 2d 67 65  rd 5 (db:step-ge
8ee0: 74 2d 6c 6f 67 66 69 6c 65 20 73 74 65 70 29 29  t-logfile step))
8ef0: 29 29 0a 09 20 20 20 20 20 28 65 6c 73 65 0a 09  ))..     (else..
8f00: 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65        (vector-se
8f10: 74 21 20 72 65 63 6f 72 64 20 32 20 28 64 62 3a  t! record 2 (db:
8f20: 73 74 65 70 2d 67 65 74 2d 73 74 61 74 65 20 73  step-get-state s
8f30: 74 65 70 29 29 0a 09 20 20 20 20 20 20 28 76 65  tep))..      (ve
8f40: 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64  ctor-set! record
8f50: 20 33 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d   3 (db:step-get-
8f60: 73 74 61 74 75 73 20 73 74 65 70 29 29 0a 09 20  status step)).. 
8f70: 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74       (vector-set
8f80: 21 20 72 65 63 6f 72 64 20 34 20 28 64 62 3a 73  ! record 4 (db:s
8f90: 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69  tep-get-event_ti
8fa0: 6d 65 20 73 74 65 70 29 29 29 29 0a 09 20 20 20  me step))))..   
8fb0: 28 68 61 73 68 2d 74 61 62 6c 65 2d 73 65 74 21  (hash-table-set!
8fc0: 20 72 65 73 20 28 64 62 3a 73 74 65 70 2d 67 65   res (db:step-ge
8fd0: 74 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70 29  t-stepname step)
8fe0: 20 72 65 63 6f 72 64 29 0a 09 20 20 20 28 64 65   record)..   (de
8ff0: 62 75 67 3a 70 72 69 6e 74 20 36 20 22 72 65 63  bug:print 6 "rec
9000: 6f 72 64 28 61 66 74 65 72 29 20 20 3d 20 22 20  ord(after)  = " 
9010: 72 65 63 6f 72 64 20 0a 09 09 09 22 5c 6e 69 64  record ...."\nid
9020: 3a 20 20 20 20 20 20 20 22 20 28 64 62 3a 73 74  :       " (db:st
9030: 65 70 2d 67 65 74 2d 69 64 20 73 74 65 70 29 0a  ep-get-id step).
9040: 09 09 09 22 5c 6e 73 74 65 70 6e 61 6d 65 3a 20  ..."\nstepname: 
9050: 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73  " (db:step-get-s
9060: 74 65 70 6e 61 6d 65 20 73 74 65 70 29 0a 09 09  tepname step)...
9070: 09 22 5c 6e 73 74 61 74 65 3a 20 20 20 20 22 20  ."\nstate:    " 
9080: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61  (db:step-get-sta
9090: 74 65 20 73 74 65 70 29 0a 09 09 09 22 5c 6e 73  te step)...."\ns
90a0: 74 61 74 75 73 3a 20 20 20 22 20 28 64 62 3a 73  tatus:   " (db:s
90b0: 74 65 70 2d 67 65 74 2d 73 74 61 74 75 73 20 73  tep-get-status s
90c0: 74 65 70 29 0a 09 09 09 22 5c 6e 74 69 6d 65 3a  tep)...."\ntime:
90d0: 20 20 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d       " (db:step-
90e0: 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73  get-event_time s
90f0: 74 65 70 29 29 29 29 0a 20 20 20 20 20 20 20 3b  tep)))).       ;
9100: 3b 20 28 65 6c 73 65 20 20 20 28 76 65 63 74 6f  ; (else   (vecto
9110: 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 31 20  r-set! record 1 
9120: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65  (db:step-get-eve
9130: 6e 74 5f 74 69 6d 65 20 73 74 65 70 29 29 29 0a  nt_time step))).
9140: 20 20 20 20 20 20 20 28 73 6f 72 74 20 73 74 65         (sort ste
9150: 70 73 20 28 6c 61 6d 62 64 61 20 28 61 20 62 29  ps (lambda (a b)
9160: 28 3c 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d  (< (db:step-get-
9170: 65 76 65 6e 74 5f 74 69 6d 65 20 61 29 28 64 62  event_time a)(db
9180: 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f  :step-get-event_
9190: 74 69 6d 65 20 62 29 29 29 29 29 0a 20 20 20 20  time b))))).    
91a0: 20 20 72 65 73 29 29 29 0a 0a 3b 3b 20 55 53 45    res)))..;; USE
91b0: 3a 20 28 6c 73 65 74 2d 64 69 66 66 65 72 65 6e  : (lset-differen
91c0: 63 65 20 73 74 72 69 6e 67 3d 3f 20 27 28 22 61  ce string=? '("a
91d0: 22 20 22 62 22 20 22 63 22 29 20 27 28 22 64 22  " "b" "c") '("d"
91e0: 20 22 63 22 20 22 65 22 20 22 61 22 29 29 0a 3b   "c" "e" "a")).;
91f0: 3b 0a 3b 3b 20 52 65 74 75 72 6e 20 61 20 6c 69  ;.;; Return a li
9200: 73 74 20 6f 66 20 70 72 65 72 65 71 73 20 74 68  st of prereqs th
9210: 61 74 20 77 65 72 65 20 4e 4f 54 20 6d 65 74 0a  at were NOT met.
9220: 3b 3b 20 20 54 65 73 74 73 20 28 61 6e 64 20 61  ;;  Tests (and a
9230: 6c 6c 20 69 74 65 6d 73 29 20 69 6e 20 77 61 69  ll items) in wai
9240: 74 6f 6e 20 6c 69 73 74 20 6d 75 73 74 20 62 65  ton list must be
9250: 20 22 43 4f 4d 50 4c 45 54 45 44 22 20 61 6e 64   "COMPLETED" and
9260: 20 22 50 41 53 53 22 0a 28 64 65 66 69 6e 65 20   "PASS".(define 
9270: 28 64 62 2d 67 65 74 2d 70 72 65 72 65 71 73 2d  (db-get-prereqs-
9280: 6e 6f 74 2d 6d 65 74 20 64 62 20 72 75 6e 2d 69  not-met db run-i
9290: 64 20 77 61 69 74 6f 6e 29 0a 20 20 28 69 66 20  d waiton).  (if 
92a0: 28 6e 75 6c 6c 3f 20 77 61 69 74 6f 6e 29 0a 20  (null? waiton). 
92b0: 20 20 20 20 20 27 28 29 0a 20 20 20 20 20 20 28       '().      (
92c0: 6c 65 74 2a 20 28 28 75 6e 6d 65 74 2d 70 72 65  let* ((unmet-pre
92d0: 2d 72 65 71 73 20 27 28 29 29 0a 09 20 20 20 20  -reqs '())..    
92e0: 20 28 74 65 73 74 73 20 20 20 20 20 20 20 20 20   (tests         
92f0: 20 20 28 64 62 2d 67 65 74 2d 74 65 73 74 73 2d    (db-get-tests-
9300: 66 6f 72 2d 72 75 6e 20 64 62 20 72 75 6e 2d 69  for-run db run-i
9310: 64 20 23 66 20 23 66 20 27 28 29 20 27 28 29 29  d #f #f '() '())
9320: 29 0a 09 20 20 20 20 20 28 72 65 73 75 6c 74 20  )..     (result 
9330: 20 20 20 20 20 20 20 20 27 28 29 29 29 0a 09 28          '()))..(
9340: 66 6f 72 2d 65 61 63 68 20 28 6c 61 6d 62 64 61  for-each (lambda
9350: 20 28 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d   (waitontest-nam
9360: 65 29 0a 09 09 20 20 20 20 28 6c 65 74 20 28 28  e)...    (let ((
9370: 65 76 65 72 2d 73 65 65 6e 20 23 66 29 29 0a 09  ever-seen #f))..
9380: 09 20 20 20 20 20 20 28 66 6f 72 2d 65 61 63 68  .      (for-each
9390: 20 28 6c 61 6d 62 64 61 20 28 74 65 73 74 29 0a   (lambda (test).
93a0: 09 09 09 09 20 20 28 69 66 20 28 65 71 75 61 6c  ....  (if (equal
93b0: 3f 20 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d  ? waitontest-nam
93c0: 65 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 74  e (db:test-get-t
93d0: 65 73 74 6e 61 6d 65 20 74 65 73 74 29 29 0a 09  estname test))..
93e0: 09 09 09 20 20 20 20 20 20 28 62 65 67 69 6e 0a  ...      (begin.
93f0: 09 09 09 09 09 28 73 65 74 21 20 65 76 65 72 2d  .....(set! ever-
9400: 73 65 65 6e 20 23 74 29 0a 09 09 09 09 09 28 69  seen #t)......(i
9410: 66 20 28 6e 6f 74 20 28 61 6e 64 20 28 65 71 75  f (not (and (equ
9420: 61 6c 3f 20 28 64 62 3a 74 65 73 74 2d 67 65 74  al? (db:test-get
9430: 2d 73 74 61 74 65 20 74 65 73 74 29 20 22 43 4f  -state test) "CO
9440: 4d 50 4c 45 54 45 44 22 29 0a 09 09 09 09 09 09  MPLETED").......
9450: 20 20 20 20 20 20 28 6d 65 6d 62 65 72 20 28 64        (member (d
9460: 62 3a 74 65 73 74 2d 67 65 74 2d 73 74 61 74 75  b:test-get-statu
9470: 73 20 74 65 73 74 29 20 27 28 22 50 41 53 53 22  s test) '("PASS"
9480: 20 22 57 41 52 4e 22 20 22 43 48 45 43 4b 22 29   "WARN" "CHECK")
9490: 29 29 29 0a 09 09 09 09 09 20 20 20 20 28 73 65  )))......    (se
94a0: 74 21 20 72 65 73 75 6c 74 20 28 63 6f 6e 73 20  t! result (cons 
94b0: 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 20  waitontest-name 
94c0: 72 65 73 75 6c 74 29 29 29 29 29 29 0a 09 09 09  result))))))....
94d0: 09 74 65 73 74 73 29 0a 09 09 20 20 20 20 20 20  .tests)...      
94e0: 28 69 66 20 28 6e 6f 74 20 65 76 65 72 2d 73 65  (if (not ever-se
94f0: 65 6e 29 28 73 65 74 21 20 72 65 73 75 6c 74 20  en)(set! result 
9500: 28 63 6f 6e 73 20 77 61 69 74 6f 6e 74 65 73 74  (cons waitontest
9510: 2d 6e 61 6d 65 20 72 65 73 75 6c 74 29 29 29 29  -name result))))
9520: 29 0a 09 09 20 20 77 61 69 74 6f 6e 29 0a 09 28  )...  waiton)..(
9530: 64 65 6c 65 74 65 2d 64 75 70 6c 69 63 61 74 65  delete-duplicate
9540: 73 20 72 65 73 75 6c 74 29 29 29 29 0a 0a 3b 3b  s result))))..;;
9550: 20 74 68 65 20 6e 65 77 20 70 72 65 72 65 71 73   the new prereqs
9560: 20 63 61 6c 63 75 6c 61 74 69 6f 6e 2c 20 6c 6f   calculation, lo
9570: 6f 6b 73 20 61 6c 73 6f 20 61 74 20 69 74 65 6d  oks also at item
9580: 70 61 74 68 20 69 66 20 73 70 65 63 69 66 69 65  path if specifie
9590: 64 0a 3b 3b 20 61 6c 6c 20 70 72 65 72 65 71 73  d.;; all prereqs
95a0: 20 6d 75 73 74 20 62 65 20 6d 65 74 3a 0a 3b 3b   must be met:.;;
95b0: 20 20 20 20 69 66 20 70 72 65 72 65 71 20 74 65      if prereq te
95c0: 73 74 20 77 69 74 68 20 69 74 65 6d 70 61 74 68  st with itempath
95d0: 3d 27 27 20 69 73 20 43 4f 4d 50 4c 45 54 45 44  ='' is COMPLETED
95e0: 20 61 6e 64 20 50 41 53 53 2c 20 57 41 52 4e 2c   and PASS, WARN,
95f0: 20 43 48 45 43 4b 2c 20 6f 72 20 57 41 49 56 45   CHECK, or WAIVE
9600: 44 20 74 68 65 6e 20 70 72 65 72 65 71 20 69 73  D then prereq is
9610: 20 6d 65 74 0a 3b 3b 20 20 20 20 69 66 20 70 72   met.;;    if pr
9620: 65 72 65 71 20 74 65 73 74 20 77 69 74 68 20 69  ereq test with i
9630: 74 65 6d 70 61 74 68 3d 72 65 66 2d 69 74 65 6d  tempath=ref-item
9640: 2d 70 61 74 68 20 61 6e 64 20 43 4f 4d 50 4c 45  -path and COMPLE
9650: 54 45 44 20 77 69 74 68 20 50 41 53 53 2c 20 57  TED with PASS, W
9660: 41 52 4e 2c 20 43 48 45 43 4b 2c 20 6f 72 20 57  ARN, CHECK, or W
9670: 41 49 56 45 44 20 74 68 65 6e 20 70 72 65 72 65  AIVED then prere
9680: 71 20 69 73 20 6d 65 74 0a 28 64 65 66 69 6e 65  q is met.(define
9690: 20 28 64 62 3a 67 65 74 2d 70 72 65 72 65 71 73   (db:get-prereqs
96a0: 2d 6e 6f 74 2d 6d 65 74 20 64 62 20 72 75 6e 2d  -not-met db run-
96b0: 69 64 20 77 61 69 74 6f 6e 73 20 72 65 66 2d 69  id waitons ref-i
96c0: 74 65 6d 2d 70 61 74 68 29 0a 20 20 28 69 66 20  tem-path).  (if 
96d0: 28 6f 72 20 28 6e 6f 74 20 77 61 69 74 6f 6e 73  (or (not waitons
96e0: 29 0a 09 20 20 28 6e 75 6c 6c 3f 20 77 61 69 74  )..  (null? wait
96f0: 6f 6e 73 29 29 0a 20 20 20 20 20 20 27 28 29 0a  ons)).      '().
9700: 20 20 20 20 20 20 28 6c 65 74 2a 20 28 28 75 6e        (let* ((un
9710: 6d 65 74 2d 70 72 65 2d 72 65 71 73 20 27 28 29  met-pre-reqs '()
9720: 29 0a 09 20 20 20 20 20 28 72 65 73 75 6c 74 20  )..     (result 
9730: 20 20 20 20 20 20 20 20 27 28 29 29 29 0a 09 28          '()))..(
9740: 66 6f 72 2d 65 61 63 68 20 0a 09 20 28 6c 61 6d  for-each .. (lam
9750: 62 64 61 20 28 77 61 69 74 6f 6e 74 65 73 74 2d  bda (waitontest-
9760: 6e 61 6d 65 29 0a 09 20 20 20 3b 3b 20 62 79 20  name)..   ;; by 
9770: 67 65 74 74 69 6e 67 20 74 68 65 20 74 65 73 74  getting the test
9780: 73 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20  s with matching 
9790: 6e 61 6d 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b  name we are look
97a0: 69 6e 67 20 6f 6e 6c 79 20 61 74 20 74 68 65 20  ing only at the 
97b0: 6d 61 74 63 68 69 6e 67 20 74 65 73 74 20 0a 09  matching test ..
97c0: 20 20 20 3b 3b 20 61 6e 64 20 72 65 6c 61 74 65     ;; and relate
97d0: 64 20 73 75 62 20 69 74 65 6d 73 0a 09 20 20 20  d sub items..   
97e0: 28 6c 65 74 20 28 28 74 65 73 74 73 20 20 20 20  (let ((tests    
97f0: 20 20 20 20 20 20 20 20 20 28 64 62 2d 67 65 74           (db-get
9800: 2d 74 65 73 74 73 2d 66 6f 72 2d 72 75 6e 20 64  -tests-for-run d
9810: 62 20 72 75 6e 2d 69 64 20 77 61 69 74 6f 6e 74  b run-id waitont
9820: 65 73 74 2d 6e 61 6d 65 20 23 66 20 27 28 29 20  est-name #f '() 
9830: 27 28 29 29 29 0a 09 09 20 28 65 76 65 72 2d 73  '()))... (ever-s
9840: 65 65 6e 20 20 20 20 20 20 20 20 20 23 66 29 0a  een         #f).
9850: 09 09 20 28 70 61 72 65 6e 74 2d 77 61 69 74 6f  .. (parent-waito
9860: 6e 2d 6d 65 74 20 23 66 29 0a 09 09 20 28 69 74  n-met #f)... (it
9870: 65 6d 2d 77 61 69 74 6f 6e 2d 6d 65 74 20 20 20  em-waiton-met   
9880: 23 66 29 29 0a 09 20 20 20 20 20 28 66 6f 72 2d  #f))..     (for-
9890: 65 61 63 68 20 0a 09 20 20 20 20 20 20 28 6c 61  each ..      (la
98a0: 6d 62 64 61 20 28 74 65 73 74 29 0a 09 09 3b 3b  mbda (test)...;;
98b0: 20 28 69 66 20 28 65 71 75 61 6c 3f 20 77 61 69   (if (equal? wai
98c0: 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 20 28 64 62  tontest-name (db
98d0: 3a 74 65 73 74 2d 67 65 74 2d 74 65 73 74 6e 61  :test-get-testna
98e0: 6d 65 20 74 65 73 74 29 29 20 3b 3b 20 62 79 20  me test)) ;; by 
98f0: 64 65 66 69 6e 74 69 6f 6e 20 74 68 69 73 20 68  defintion this h
9900: 61 64 20 62 65 74 74 65 72 20 62 65 20 74 72 75  ad better be tru
9910: 65 20 2e 2e 2e 0a 09 09 28 6c 65 74 2a 20 28 28  e ......(let* ((
9920: 73 74 61 74 65 20 20 20 20 20 20 20 20 20 20 20  state           
9930: 20 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 73    (db:test-get-s
9940: 74 61 74 65 20 74 65 73 74 29 29 0a 09 09 20 20  tate test))...  
9950: 20 20 20 20 20 28 73 74 61 74 75 73 20 20 20 20       (status    
9960: 20 20 20 20 20 20 20 20 28 64 62 3a 74 65 73 74          (db:test
9970: 2d 67 65 74 2d 73 74 61 74 75 73 20 74 65 73 74  -get-status test
9980: 29 29 0a 09 09 20 20 20 20 20 20 20 28 69 74 65  ))...       (ite
9990: 6d 2d 70 61 74 68 20 20 20 20 20 20 20 20 20 28  m-path         (
99a0: 64 62 3a 74 65 73 74 2d 67 65 74 2d 69 74 65 6d  db:test-get-item
99b0: 2d 70 61 74 68 20 74 65 73 74 29 29 0a 09 09 20  -path test))... 
99c0: 20 20 20 20 20 20 28 69 73 2d 63 6f 6d 70 6c 65        (is-comple
99d0: 74 65 64 20 20 20 20 20 20 28 65 71 75 61 6c 3f  ted      (equal?
99e0: 20 73 74 61 74 65 20 22 43 4f 4d 50 4c 45 54 45   state "COMPLETE
99f0: 44 22 29 29 0a 09 09 20 20 20 20 20 20 20 28 69  D"))...       (i
9a00: 73 2d 6f 6b 20 20 20 20 20 20 20 20 20 20 20 20  s-ok            
9a10: 20 28 6d 65 6d 62 65 72 20 73 74 61 74 75 73 20   (member status 
9a20: 27 28 22 50 41 53 53 22 20 22 57 41 52 4e 22 20  '("PASS" "WARN" 
9a30: 22 43 48 45 43 4b 22 20 22 57 41 49 56 45 44 22  "CHECK" "WAIVED"
9a40: 29 29 29 0a 09 09 20 20 20 20 20 20 20 28 73 61  )))...       (sa
9a50: 6d 65 2d 69 74 65 6d 70 61 74 68 20 20 20 20 20  me-itempath     
9a60: 28 65 71 75 61 6c 3f 20 72 65 66 2d 69 74 65 6d  (equal? ref-item
9a70: 2d 70 61 74 68 20 69 74 65 6d 2d 70 61 74 68 29  -path item-path)
9a80: 29 29 0a 09 09 20 20 28 73 65 74 21 20 65 76 65  ))...  (set! eve
9a90: 72 2d 73 65 65 6e 20 23 74 29 0a 09 09 20 20 28  r-seen #t)...  (
9aa0: 63 6f 6e 64 0a 09 09 20 20 20 3b 3b 20 63 61 73  cond...   ;; cas
9ab0: 65 20 31 2c 20 6e 6f 6e 2d 69 74 65 6d 20 28 70  e 1, non-item (p
9ac0: 61 72 65 6e 74 20 74 65 73 74 29 20 69 73 20 0a  arent test) is .
9ad0: 09 09 20 20 20 28 28 61 6e 64 20 28 65 71 75 61  ..   ((and (equa
9ae0: 6c 3f 20 69 74 65 6d 2d 70 61 74 68 20 22 22 29  l? item-path "")
9af0: 20 3b 3b 20 74 68 69 73 20 69 73 20 74 68 65 20   ;; this is the 
9b00: 70 61 72 65 6e 74 20 74 65 73 74 0a 09 09 09 20  parent test.... 
9b10: 69 73 2d 63 6f 6d 70 6c 65 74 65 64 0a 09 09 09  is-completed....
9b20: 20 69 73 2d 6f 6b 29 0a 09 09 20 20 20 20 28 73   is-ok)...    (s
9b30: 65 74 21 20 70 61 72 65 6e 74 2d 77 61 69 74 6f  et! parent-waito
9b40: 6e 2d 6d 65 74 20 23 74 29 29 0a 09 09 20 20 20  n-met #t))...   
9b50: 28 28 61 6e 64 20 73 61 6d 65 2d 69 74 65 6d 70  ((and same-itemp
9b60: 61 74 68 0a 09 09 09 20 69 73 2d 63 6f 6d 70 6c  ath.... is-compl
9b70: 65 74 65 64 0a 09 09 09 20 69 73 2d 6f 6b 29 0a  eted.... is-ok).
9b80: 09 09 20 20 20 20 28 73 65 74 21 20 69 74 65 6d  ..    (set! item
9b90: 2d 77 61 69 74 6f 6e 2d 6d 65 74 20 23 74 29 29  -waiton-met #t))
9ba0: 29 29 29 0a 09 20 20 20 20 20 20 74 65 73 74 73  )))..      tests
9bb0: 29 0a 09 20 20 20 20 20 28 69 66 20 28 6e 6f 74  )..     (if (not
9bc0: 20 28 6f 72 20 70 61 72 65 6e 74 2d 77 61 69 74   (or parent-wait
9bd0: 6f 6e 2d 6d 65 74 20 69 74 65 6d 2d 77 61 69 74  on-met item-wait
9be0: 6f 6e 2d 6d 65 74 29 29 0a 09 09 20 28 73 65 74  on-met))... (set
9bf0: 21 20 72 65 73 75 6c 74 20 28 63 6f 6e 73 20 77  ! result (cons w
9c00: 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 20 72  aitontest-name r
9c10: 65 73 75 6c 74 29 29 29 0a 09 20 20 20 20 20 3b  esult)))..     ;
9c20: 3b 20 69 66 20 74 68 65 20 74 65 73 74 20 69 73  ; if the test is
9c30: 20 6e 6f 74 20 66 6f 75 6e 64 20 74 68 65 6e 20   not found then 
9c40: 63 6c 65 61 72 6c 79 20 74 68 65 20 77 61 69 74  clearly the wait
9c50: 6f 6e 20 69 73 20 6e 6f 74 20 6d 65 74 2e 2e 2e  on is not met...
9c60: 0a 09 20 20 20 20 20 28 69 66 20 28 6e 6f 74 20  ..     (if (not 
9c70: 65 76 65 72 2d 73 65 65 6e 29 28 73 65 74 21 20  ever-seen)(set! 
9c80: 72 65 73 75 6c 74 20 28 63 6f 6e 73 20 77 61 69  result (cons wai
9c90: 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 20 72 65 73  tontest-name res
9ca0: 75 6c 74 29 29 29 29 29 0a 09 77 61 69 74 6f 6e  ult)))))..waiton
9cb0: 73 29 0a 20 20 20 20 20 20 28 64 65 6c 65 74 65  s).      (delete
9cc0: 2d 64 75 70 6c 69 63 61 74 65 73 20 72 65 73 75  -duplicates resu
9cd0: 6c 74 29 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d  lt))))..;;======
9ce0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9cf0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9d00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9d10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9d20: 0a 3b 3b 20 45 78 74 72 61 63 74 20 6f 64 73 20  .;; Extract ods 
9d30: 66 69 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62  file from the db
9d40: 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  .;;=============
9d50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9d60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9d70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9d80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 72 75  =========..;; ru
9d90: 6e 73 70 61 74 74 20 69 73 20 61 20 63 6f 6d 6d  nspatt is a comm
9da0: 61 20 64 65 6c 69 6d 69 74 65 64 20 6c 69 73 74  a delimited list
9db0: 20 6f 66 20 72 75 6e 20 70 61 74 74 65 72 6e 73   of run patterns
9dc0: 0a 3b 3b 20 6b 65 79 70 61 74 74 2d 61 6c 69 73  .;; keypatt-alis
9dd0: 74 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 2a  t must contain *
9de0: 61 6c 6c 2a 20 6b 65 79 73 20 77 69 74 68 20 61  all* keys with a
9df0: 6e 20 61 73 73 6f 63 69 61 74 65 64 20 70 61 74  n associated pat
9e00: 74 65 72 6e 3a 20 27 28 20 28 22 4b 45 59 31 22  tern: '( ("KEY1"
9e10: 20 22 25 22 29 20 2e 2e 20 29 0a 28 64 65 66 69   "%") .. ).(defi
9e20: 6e 65 20 28 64 62 3a 65 78 74 72 61 63 74 2d 6f  ne (db:extract-o
9e30: 64 73 2d 66 69 6c 65 20 64 62 20 6f 75 74 70 75  ds-file db outpu
9e40: 74 66 69 6c 65 20 6b 65 79 70 61 74 74 2d 61 6c  tfile keypatt-al
9e50: 69 73 74 20 72 75 6e 73 70 61 74 74 20 70 61 74  ist runspatt pat
9e60: 68 6d 6f 64 29 0a 20 20 28 6c 65 74 2a 20 28 28  hmod).  (let* ((
9e70: 6b 65 79 73 73 74 72 20 20 28 73 74 72 69 6e 67  keysstr  (string
9e80: 2d 69 6e 74 65 72 73 70 65 72 73 65 20 28 6d 61  -intersperse (ma
9e90: 70 20 63 61 72 20 6b 65 79 70 61 74 74 2d 61 6c  p car keypatt-al
9ea0: 69 73 74 29 20 22 2c 22 29 29 0a 09 20 28 6b 65  ist) ",")).. (ke
9eb0: 79 71 72 79 20 20 20 28 73 74 72 69 6e 67 2d 69  yqry   (string-i
9ec0: 6e 74 65 72 73 70 65 72 73 65 20 28 6d 61 70 20  ntersperse (map 
9ed0: 28 6c 61 6d 62 64 61 20 28 70 29 28 63 6f 6e 63  (lambda (p)(conc
9ee0: 20 28 63 61 72 20 70 29 20 22 20 4c 49 4b 45 20   (car p) " LIKE 
9ef0: 3f 20 22 29 29 20 6b 65 79 70 61 74 74 2d 61 6c  ? ")) keypatt-al
9f00: 69 73 74 29 20 22 20 41 4e 44 20 22 29 29 0a 09  ist) " AND "))..
9f10: 20 28 6e 75 6d 6b 65 79 73 20 20 28 6c 65 6e 67   (numkeys  (leng
9f20: 74 68 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74  th keypatt-alist
9f30: 29 29 0a 09 20 28 74 65 73 74 2d 69 64 73 20 27  )).. (test-ids '
9f40: 28 29 29 0a 09 20 28 77 69 6e 64 6f 77 73 20 20  ()).. (windows  
9f50: 28 61 6e 64 20 70 61 74 68 6d 6f 64 20 28 73 75  (and pathmod (su
9f60: 62 73 74 72 69 6e 67 2d 69 6e 64 65 78 20 22 5c  bstring-index "\
9f70: 5c 22 20 70 61 74 68 6d 6f 64 29 29 29 0a 09 20  \" pathmod))).. 
9f80: 28 74 65 6d 70 64 69 72 20 20 28 63 6f 6e 63 20  (tempdir  (conc 
9f90: 22 2f 74 6d 70 2f 22 20 28 63 75 72 72 65 6e 74  "/tmp/" (current
9fa0: 2d 75 73 65 72 2d 6e 61 6d 65 29 20 22 2f 22 20  -user-name) "/" 
9fb0: 72 75 6e 73 70 61 74 74 20 22 5f 22 20 28 72 61  runspatt "_" (ra
9fc0: 6e 64 6f 6d 20 31 30 30 30 30 29 20 22 5f 22 20  ndom 10000) "_" 
9fd0: 28 63 75 72 72 65 6e 74 2d 70 72 6f 63 65 73 73  (current-process
9fe0: 2d 69 64 29 29 29 0a 09 20 28 72 75 6e 73 68 65  -id))).. (runshe
9ff0: 61 64 65 72 20 28 61 70 70 65 6e 64 20 28 6c 69  ader (append (li
a000: 73 74 20 22 52 75 6e 20 49 64 22 20 22 52 75 6e  st "Run Id" "Run
a010: 6e 61 6d 65 22 29 20 3b 20 30 20 31 0a 09 09 09  name") ; 0 1....
a020: 20 20 20 20 20 28 6d 61 70 20 63 61 72 20 6b 65       (map car ke
a030: 79 70 61 74 74 2d 61 6c 69 73 74 29 20 20 20 3b  ypatt-alist)   ;
a040: 20 2b 20 4e 20 3d 20 6c 65 6e 67 74 68 20 6b 65   + N = length ke
a050: 79 70 61 74 74 2d 61 6c 69 73 74 0a 09 09 09 20  ypatt-alist.... 
a060: 20 20 20 20 28 6c 69 73 74 20 22 54 65 73 74 6e      (list "Testn
a070: 61 6d 65 22 20 20 20 20 20 20 20 20 20 20 3b 20  ame"          ; 
a080: 32 0a 09 09 09 09 20 20 20 22 49 74 65 6d 20 50  2.....   "Item P
a090: 61 74 68 22 20 20 20 20 20 20 20 20 20 3b 20 33  ath"         ; 3
a0a0: 20 0a 09 09 09 09 20 20 20 22 44 65 73 63 72 69   .....   "Descri
a0b0: 70 74 69 6f 6e 22 20 20 20 20 20 20 20 3b 20 34  ption"       ; 4
a0c0: 20 0a 09 09 09 09 20 20 20 22 53 74 61 74 65 22   .....   "State"
a0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 35               ; 5
a0e0: 20 0a 09 09 09 09 20 20 20 22 53 74 61 74 75 73   .....   "Status
a0f0: 22 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 36  "            ; 6
a100: 20 20 0a 09 09 09 09 20 20 20 22 46 69 6e 61 6c    .....   "Final
a110: 20 4c 6f 67 22 20 20 20 20 20 20 20 20 20 3b 20   Log"         ; 
a120: 37 20 0a 09 09 09 09 20 20 20 22 52 75 6e 20 44  7 .....   "Run D
a130: 75 72 61 74 69 6f 6e 22 20 20 20 20 20 20 3b 20  uration"      ; 
a140: 38 20 0a 09 09 09 09 20 20 20 22 57 68 65 6e 20  8 .....   "When 
a150: 52 75 6e 22 20 20 20 20 20 20 20 20 20 20 3b 20  Run"          ; 
a160: 39 20 0a 09 09 09 09 20 20 20 22 54 61 67 73 22  9 .....   "Tags"
a170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 20                ; 
a180: 31 30 0a 09 09 09 09 20 20 20 22 52 75 6e 20 4f  10.....   "Run O
a190: 77 6e 65 72 22 20 20 20 20 20 20 20 20 20 3b 20  wner"         ; 
a1a0: 31 31 0a 09 09 09 09 20 20 20 22 43 6f 6d 6d 65  11.....   "Comme
a1b0: 6e 74 22 20 20 20 20 20 20 20 20 20 20 20 3b 20  nt"           ; 
a1c0: 31 32 0a 09 09 09 09 20 20 20 22 41 75 74 68 6f  12.....   "Autho
a1d0: 72 22 20 20 20 20 20 20 20 20 20 20 20 20 3b 20  r"            ; 
a1e0: 31 33 0a 09 09 09 09 20 20 20 22 54 65 73 74 20  13.....   "Test 
a1f0: 4f 77 6e 65 72 22 20 20 20 20 20 20 20 20 3b 20  Owner"        ; 
a200: 31 34 0a 09 09 09 09 20 20 20 22 52 65 76 69 65  14.....   "Revie
a210: 77 65 64 22 20 20 20 20 20 20 20 20 20 20 3b 20  wed"          ; 
a220: 31 35 0a 09 09 09 09 20 20 20 22 44 69 73 6b 66  15.....   "Diskf
a230: 72 65 65 22 20 20 20 20 20 20 20 20 20 20 3b 20  ree"          ; 
a240: 31 36 0a 09 09 09 09 20 20 20 22 55 6e 61 6d 65  16.....   "Uname
a250: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 20  "             ; 
a260: 31 37 0a 09 09 09 09 20 20 20 22 52 75 6e 64 69  17.....   "Rundi
a270: 72 22 20 20 20 20 20 20 20 20 20 20 20 20 3b 20  r"            ; 
a280: 31 38 0a 09 09 09 09 20 20 20 22 48 6f 73 74 22  18.....   "Host"
a290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 20                ; 
a2a0: 31 39 0a 09 09 09 09 20 20 20 22 43 70 75 20 4c  19.....   "Cpu L
a2b0: 6f 61 64 22 20 20 20 20 20 20 20 20 20 20 3b 20  oad"          ; 
a2c0: 32 30 0a 09 09 09 09 20 20 20 29 29 29 0a 09 20  20.....   ))).. 
a2d0: 28 72 65 73 75 6c 74 73 20 28 6c 69 73 74 20 72  (results (list r
a2e0: 75 6e 73 68 65 61 64 65 72 29 29 09 09 09 20 0a  unsheader))... .
a2f0: 09 20 28 74 65 73 74 64 61 74 61 2d 68 65 61 64  . (testdata-head
a300: 65 72 20 28 6c 69 73 74 20 22 52 75 6e 20 49 64  er (list "Run Id
a310: 22 20 22 54 65 73 74 6e 61 6d 65 22 20 22 49 74  " "Testname" "It
a320: 65 6d 20 50 61 74 68 22 20 22 43 61 74 65 67 6f  em Path" "Catego
a330: 72 79 22 20 22 56 61 72 69 61 62 6c 65 22 20 22  ry" "Variable" "
a340: 56 61 6c 75 65 22 20 22 45 78 70 65 63 74 65 64  Value" "Expected
a350: 22 20 22 54 6f 6c 22 20 22 55 6e 69 74 73 22 20  " "Tol" "Units" 
a360: 22 53 74 61 74 75 73 22 20 22 43 6f 6d 6d 65 6e  "Status" "Commen
a370: 74 22 29 29 0a 09 20 28 6d 61 69 6e 71 72 79 20  t")).. (mainqry 
a380: 28 63 6f 6e 63 20 22 53 45 4c 45 43 54 0a 20 20  (conc "SELECT.  
a390: 20 20 20 20 20 20 20 20 20 20 20 20 74 2e 74 65              t.te
a3a0: 73 74 6e 61 6d 65 2c 72 2e 69 64 2c 72 75 6e 6e  stname,r.id,runn
a3b0: 61 6d 65 2c 22 20 6b 65 79 73 73 74 72 20 22 2c  ame," keysstr ",
a3c0: 74 2e 74 65 73 74 6e 61 6d 65 2c 0a 20 20 20 20  t.testname,.    
a3d0: 20 20 20 20 20 20 20 20 20 20 74 2e 69 74 65 6d            t.item
a3e0: 5f 70 61 74 68 2c 74 6d 2e 64 65 73 63 72 69 70  _path,tm.descrip
a3f0: 74 69 6f 6e 2c 74 2e 73 74 61 74 65 2c 74 2e 73  tion,t.state,t.s
a400: 74 61 74 75 73 2c 0a 20 20 20 20 20 20 20 20 20  tatus,.         
a410: 20 20 20 20 20 66 69 6e 61 6c 5f 6c 6f 67 66 2c       final_logf,
a420: 72 75 6e 5f 64 75 72 61 74 69 6f 6e 2c 20 0a 20  run_duration, . 
a430: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72               str
a440: 66 74 69 6d 65 28 27 25 6d 2f 25 64 2f 25 59 20  ftime('%m/%d/%Y 
a450: 25 48 3a 25 4d 3a 25 53 27 2c 64 61 74 65 74 69  %H:%M:%S',dateti
a460: 6d 65 28 74 2e 65 76 65 6e 74 5f 74 69 6d 65 2c  me(t.event_time,
a470: 27 75 6e 69 78 65 70 6f 63 68 27 29 2c 27 6c 6f  'unixepoch'),'lo
a480: 63 61 6c 74 69 6d 65 27 29 2c 0a 20 20 20 20 20  caltime'),.     
a490: 20 20 20 20 20 20 20 20 20 74 6d 2e 74 61 67 73           tm.tags
a4a0: 2c 72 2e 6f 77 6e 65 72 2c 74 2e 63 6f 6d 6d 65  ,r.owner,t.comme
a4b0: 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  nt,.            
a4c0: 20 20 61 75 74 68 6f 72 2c 0a 20 20 20 20 20 20    author,.      
a4d0: 20 20 20 20 20 20 20 20 74 6d 2e 6f 77 6e 65 72          tm.owner
a4e0: 2c 72 65 76 69 65 77 65 64 2c 0a 20 20 20 20 20  ,reviewed,.     
a4f0: 20 20 20 20 20 20 20 20 20 64 69 73 6b 66 72 65           diskfre
a500: 65 2c 75 6e 61 6d 65 2c 72 75 6e 64 69 72 2c 0a  e,uname,rundir,.
a510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68 6f                ho
a520: 73 74 2c 63 70 75 6c 6f 61 64 0a 20 20 20 20 20  st,cpuload.     
a530: 20 20 20 20 20 20 20 46 52 4f 4d 20 74 65 73 74         FROM test
a540: 73 20 41 53 20 74 20 4a 4f 49 4e 20 72 75 6e 73  s AS t JOIN runs
a550: 20 41 53 20 72 20 4f 4e 20 74 2e 72 75 6e 5f 69   AS r ON t.run_i
a560: 64 3d 72 2e 69 64 20 4a 4f 49 4e 20 74 65 73 74  d=r.id JOIN test
a570: 5f 6d 65 74 61 20 41 53 20 74 6d 20 4f 4e 20 74  _meta AS tm ON t
a580: 6d 2e 74 65 73 74 6e 61 6d 65 3d 74 2e 74 65 73  m.testname=t.tes
a590: 74 6e 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20  tname.          
a5a0: 20 20 57 48 45 52 45 20 72 75 6e 6e 61 6d 65 20    WHERE runname 
a5b0: 4c 49 4b 45 20 3f 20 41 4e 44 20 22 20 6b 65 79  LIKE ? AND " key
a5c0: 71 72 79 20 22 3b 22 29 29 29 0a 20 20 20 20 28  qry ";"))).    (
a5d0: 64 65 62 75 67 3a 70 72 69 6e 74 20 32 20 22 55  debug:print 2 "U
a5e0: 73 69 6e 67 20 22 20 74 65 6d 70 64 69 72 20 22  sing " tempdir "
a5f0: 20 66 6f 72 20 63 6f 6e 73 74 72 75 63 74 69 6e   for constructin
a600: 67 20 74 68 65 20 6f 64 73 20 66 69 6c 65 2e 20  g the ods file. 
a610: 6b 65 79 71 72 79 3a 20 22 20 6b 65 79 71 72 79  keyqry: " keyqry
a620: 20 22 20 6b 65 79 73 74 72 3a 20 22 20 6b 65 79   " keystr: " key
a630: 73 73 74 72 20 22 20 77 69 74 68 20 6b 65 79 73  sstr " with keys
a640: 3a 20 22 20 28 6d 61 70 20 63 61 64 72 20 6b 65  : " (map cadr ke
a650: 79 70 61 74 74 2d 61 6c 69 73 74 29 0a 09 09 20  ypatt-alist)... 
a660: 22 5c 6e 20 20 20 20 20 20 6d 61 69 6e 71 72 79  "\n      mainqry
a670: 3a 20 22 20 6d 61 69 6e 71 72 79 29 0a 20 20 20  : " mainqry).   
a680: 20 3b 3b 20 22 45 78 70 65 63 74 65 64 20 56 61   ;; "Expected Va
a690: 6c 75 65 22 0a 20 20 20 20 3b 3b 20 22 56 61 6c  lue".    ;; "Val
a6a0: 75 65 20 46 6f 75 6e 64 22 0a 20 20 20 20 3b 3b  ue Found".    ;;
a6b0: 20 22 54 6f 6c 65 72 61 6e 63 65 22 0a 20 20 20   "Tolerance".   
a6c0: 20 28 61 70 70 6c 79 20 73 71 6c 69 74 65 33 3a   (apply sqlite3:
a6d0: 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 09 20 20  for-each-row..  
a6e0: 20 28 6c 61 6d 62 64 61 20 28 74 65 73 74 2d 69   (lambda (test-i
a6f0: 64 20 2e 20 62 29 0a 09 20 20 20 20 20 28 73 65  d . b)..     (se
a700: 74 21 20 74 65 73 74 2d 69 64 73 20 28 63 6f 6e  t! test-ids (con
a710: 73 20 74 65 73 74 2d 69 64 20 74 65 73 74 2d 69  s test-id test-i
a720: 64 73 29 29 20 20 20 3b 3b 20 74 65 73 74 2d 69  ds))   ;; test-i
a730: 64 20 69 73 20 6e 6f 77 20 74 65 73 74 6e 61 6d  d is now testnam
a740: 65 0a 09 20 20 20 20 20 28 73 65 74 21 20 72 65  e..     (set! re
a750: 73 75 6c 74 73 20 28 61 70 70 65 6e 64 20 72 65  sults (append re
a760: 73 75 6c 74 73 20 3b 3b 20 6e 6f 74 65 2c 20 64  sults ;; note, d
a770: 72 6f 70 20 74 68 65 20 74 65 73 74 2d 69 64 0a  rop the test-id.
a780: 09 09 09 09 20 20 20 28 6c 69 73 74 0a 09 09 09  ....   (list....
a790: 09 20 20 20 20 28 69 66 20 70 61 74 68 6d 6f 64  .    (if pathmod
a7a0: 0a 09 09 09 09 09 28 6c 65 74 2a 20 28 28 76 62  ......(let* ((vb
a7b0: 20 20 20 20 20 20 20 20 28 61 70 70 6c 79 20 76          (apply v
a7c0: 65 63 74 6f 72 20 62 29 29 0a 09 09 09 09 09 20  ector b))...... 
a7d0: 20 20 20 20 20 20 28 6b 65 79 76 61 6c 73 20 20        (keyvals  
a7e0: 20 28 6c 65 74 20 6c 6f 6f 70 20 28 28 69 20 20   (let loop ((i  
a7f0: 20 20 30 29 0a 09 09 09 09 09 09 09 09 20 20 20    0).........   
a800: 20 20 28 72 65 73 20 27 28 29 29 29 0a 09 09 09    (res '()))....
a810: 09 09 09 09 20 20 20 20 28 69 66 20 28 3e 3d 20  ....    (if (>= 
a820: 69 20 6e 75 6d 6b 65 79 73 29 0a 09 09 09 09 09  i numkeys)......
a830: 09 09 09 72 65 73 0a 09 09 09 09 09 09 09 09 28  ...res.........(
a840: 6c 6f 6f 70 20 28 2b 20 69 20 31 29 0a 09 09 09  loop (+ i 1)....
a850: 09 09 09 09 09 20 20 20 20 20 20 28 61 70 70 65  .....      (appe
a860: 6e 64 20 72 65 73 20 28 6c 69 73 74 20 28 76 65  nd res (list (ve
a870: 63 74 6f 72 2d 72 65 66 20 76 62 20 28 2b 20 69  ctor-ref vb (+ i
a880: 20 32 29 29 29 29 29 29 29 29 0a 09 09 09 09 09   2))))))))......
a890: 20 20 20 20 20 20 20 28 72 75 6e 6e 61 6d 65 20         (runname 
a8a0: 20 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62    (vector-ref vb
a8b0: 20 31 29 29 0a 09 09 09 09 09 20 20 20 20 20 20   1))......      
a8c0: 20 28 74 65 73 74 6e 61 6d 65 20 20 28 76 65 63   (testname  (vec
a8d0: 74 6f 72 2d 72 65 66 20 76 62 20 28 2b 20 20 32  tor-ref vb (+  2
a8e0: 20 6e 75 6d 6b 65 79 73 29 29 29 0a 09 09 09 09   numkeys))).....
a8f0: 09 20 20 20 20 20 20 20 28 69 74 65 6d 2d 70 61  .       (item-pa
a900: 74 68 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76  th (vector-ref v
a910: 62 20 28 2b 20 20 33 20 6e 75 6d 6b 65 79 73 29  b (+  3 numkeys)
a920: 29 29 0a 09 09 09 09 09 20 20 20 20 20 20 20 28  ))......       (
a930: 66 69 6e 61 6c 2d 6c 6f 67 20 28 76 65 63 74 6f  final-log (vecto
a940: 72 2d 72 65 66 20 76 62 20 28 2b 20 20 37 20 6e  r-ref vb (+  7 n
a950: 75 6d 6b 65 79 73 29 29 29 0a 09 09 09 09 09 20  umkeys)))...... 
a960: 20 20 20 20 20 20 28 72 75 6e 2d 64 69 72 20 20        (run-dir  
a970: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62 20   (vector-ref vb 
a980: 28 2b 20 31 38 20 6e 75 6d 6b 65 79 73 29 29 29  (+ 18 numkeys)))
a990: 0a 09 09 09 09 09 20 20 20 20 20 20 20 28 6c 6f  ......       (lo
a9a0: 67 2d 66 70 61 74 68 20 28 63 6f 6e 63 20 72 75  g-fpath (conc ru
a9b0: 6e 2d 64 69 72 20 22 2f 22 20 20 66 69 6e 61 6c  n-dir "/"  final
a9c0: 2d 6c 6f 67 29 29 29 20 3b 3b 20 28 73 74 72 69  -log))) ;; (stri
a9d0: 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 6b  ng-intersperse k
a9e0: 65 79 76 61 6c 73 20 22 2f 22 29 20 22 2f 22 20  eyvals "/") "/" 
a9f0: 74 65 73 74 6e 61 6d 65 20 22 2f 22 20 69 74 65  testname "/" ite
aa00: 6d 2d 70 61 74 68 20 22 2f 22 0a 09 09 09 09 09  m-path "/"......
aa10: 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34    (debug:print 4
aa20: 20 22 6c 6f 67 3a 20 22 20 6c 6f 67 2d 66 70 61   "log: " log-fpa
aa30: 74 68 20 22 20 65 78 69 73 74 73 3a 20 22 20 28  th " exists: " (
aa40: 66 69 6c 65 2d 65 78 69 73 74 73 3f 20 6c 6f 67  file-exists? log
aa50: 2d 66 70 61 74 68 29 29 0a 09 09 09 09 09 20 20  -fpath))......  
aa60: 28 76 65 63 74 6f 72 2d 73 65 74 21 20 76 62 20  (vector-set! vb 
aa70: 28 2b 20 37 20 6e 75 6d 6b 65 79 73 29 20 28 69  (+ 7 numkeys) (i
aa80: 66 20 28 66 69 6c 65 2d 65 78 69 73 74 73 3f 20  f (file-exists? 
aa90: 6c 6f 67 2d 66 70 61 74 68 29 0a 09 09 09 09 09  log-fpath)......
aaa0: 09 09 09 09 20 20 20 20 28 6c 65 74 20 28 28 6e  ....    (let ((n
aab0: 65 77 70 61 74 68 20 28 63 6f 6e 63 20 70 61 74  ewpath (conc pat
aac0: 68 6d 6f 64 20 22 2f 22 0a 09 09 09 09 09 09 09  hmod "/"........
aad0: 09 09 09 09 09 20 28 73 74 72 69 6e 67 2d 69 6e  ..... (string-in
aae0: 74 65 72 73 70 65 72 73 65 20 6b 65 79 76 61 6c  tersperse keyval
aaf0: 73 20 22 2f 22 29 0a 09 09 09 09 09 09 09 09 09  s "/")..........
ab00: 09 09 09 20 22 2f 22 20 72 75 6e 6e 61 6d 65 20  ... "/" runname 
ab10: 22 2f 22 20 74 65 73 74 6e 61 6d 65 20 22 2f 22  "/" testname "/"
ab20: 0a 09 09 09 09 09 09 09 09 09 09 09 09 20 28 69  ............. (i
ab30: 66 20 28 73 74 72 69 6e 67 3d 3f 20 69 74 65 6d  f (string=? item
ab40: 2d 70 61 74 68 20 22 22 29 20 22 22 20 28 63 6f  -path "") "" (co
ab50: 6e 63 20 22 2f 22 20 69 74 65 6d 2d 70 61 74 68  nc "/" item-path
ab60: 29 29 0a 09 09 09 09 09 09 09 09 09 09 09 09 20  ))............. 
ab70: 66 69 6e 61 6c 2d 6c 6f 67 29 29 29 0a 09 09 09  final-log)))....
ab80: 09 09 09 09 09 09 20 20 20 20 20 20 3b 3b 20 66  ......      ;; f
ab90: 6f 72 20 6e 6f 77 20 74 68 72 6f 77 20 61 77 61  or now throw awa
aba0: 79 20 6e 65 77 70 61 74 68 20 61 6e 64 20 75 73  y newpath and us
abb0: 65 20 74 68 65 20 6c 6f 67 2d 66 70 61 74 68 20  e the log-fpath 
abc0: 63 6f 6e 63 27 64 20 77 69 74 68 20 70 61 74 68  conc'd with path
abd0: 6d 6f 64 0a 09 09 09 09 09 09 09 09 09 20 20 20  mod..........   
abe0: 20 20 20 28 73 65 74 21 20 6e 65 77 70 61 74 68     (set! newpath
abf0: 20 28 63 6f 6e 63 20 70 61 74 68 6d 6f 64 20 6c   (conc pathmod l
ac00: 6f 67 2d 66 70 61 74 68 29 29 0a 09 09 09 09 09  og-fpath))......
ac10: 09 09 09 09 20 20 20 20 20 20 28 69 66 20 77 69  ....      (if wi
ac20: 6e 64 6f 77 73 20 28 73 74 72 69 6e 67 2d 74 72  ndows (string-tr
ac30: 61 6e 73 6c 61 74 65 20 6e 65 77 70 61 74 68 20  anslate newpath 
ac40: 22 2f 22 20 22 5c 5c 22 29 20 6e 65 77 70 61 74  "/" "\\") newpat
ac50: 68 29 29 0a 09 09 09 09 09 09 09 09 09 20 20 20  h))..........   
ac60: 20 28 69 66 20 28 3e 20 2a 76 65 72 62 6f 73 69   (if (> *verbosi
ac70: 74 79 2a 20 31 29 0a 09 09 09 09 09 09 09 09 09  ty* 1)..........
ac80: 09 28 63 6f 6e 63 20 66 69 6e 61 6c 2d 6c 6f 67  .(conc final-log
ac90: 20 22 20 6e 6f 74 2d 66 6f 75 6e 64 22 29 0a 09   " not-found")..
aca0: 09 09 09 09 09 09 09 09 09 22 22 29 29 29 0a 09  ........."")))..
acb0: 09 09 09 09 20 20 28 76 65 63 74 6f 72 2d 3e 6c  ....  (vector->l
acc0: 69 73 74 20 76 62 29 29 0a 09 09 09 09 09 62 29  ist vb))......b)
acd0: 29 29 29 29 0a 09 20 20 20 64 62 0a 09 20 20 20  ))))..   db..   
ace0: 6d 61 69 6e 71 72 79 0a 09 20 20 20 72 75 6e 73  mainqry..   runs
acf0: 70 61 74 74 20 28 6d 61 70 20 63 61 64 72 20 6b  patt (map cadr k
ad00: 65 79 70 61 74 74 2d 61 6c 69 73 74 29 29 0a 20  eypatt-alist)). 
ad10: 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20     (debug:print 
ad20: 32 20 22 46 6f 75 6e 64 20 22 20 28 6c 65 6e 67  2 "Found " (leng
ad30: 74 68 20 74 65 73 74 2d 69 64 73 29 20 22 20 72  th test-ids) " r
ad40: 65 63 6f 72 64 73 22 29 0a 20 20 20 20 28 73 65  ecords").    (se
ad50: 74 21 20 72 65 73 75 6c 74 73 20 28 6c 69 73 74  t! results (list
ad60: 20 28 63 6f 6e 73 20 22 52 75 6e 73 22 20 72 65   (cons "Runs" re
ad70: 73 75 6c 74 73 29 29 29 0a 20 20 20 20 3b 3b 20  sults))).    ;; 
ad80: 6e 6f 77 2c 20 66 6f 72 20 65 61 63 68 20 74 65  now, for each te
ad90: 73 74 2c 20 63 6f 6c 6c 65 63 74 20 74 68 65 20  st, collect the 
ada0: 74 65 73 74 5f 64 61 74 61 20 69 6e 66 6f 20 61  test_data info a
adb0: 6e 64 20 61 64 64 20 61 20 6e 65 77 20 73 68 65  nd add a new she
adc0: 65 74 0a 20 20 20 20 28 66 6f 72 2d 65 61 63 68  et.    (for-each
add0: 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 74  .     (lambda (t
ade0: 65 73 74 2d 69 64 29 0a 20 20 20 20 20 20 20 28  est-id).       (
adf0: 6c 65 74 20 28 28 74 65 73 74 2d 64 61 74 61 20  let ((test-data 
ae00: 28 6c 69 73 74 20 74 65 73 74 64 61 74 61 2d 68  (list testdata-h
ae10: 65 61 64 65 72 29 29 0a 09 20 20 20 20 20 28 63  eader))..     (c
ae20: 75 72 72 2d 74 65 73 74 2d 6e 61 6d 65 20 23 66  urr-test-name #f
ae30: 29 29 0a 09 20 28 73 71 6c 69 74 65 33 3a 66 6f  )).. (sqlite3:fo
ae40: 72 2d 65 61 63 68 2d 72 6f 77 0a 09 20 20 28 6c  r-each-row..  (l
ae50: 61 6d 62 64 61 20 28 72 75 6e 2d 69 64 20 74 65  ambda (run-id te
ae60: 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68  stname item-path
ae70: 20 63 61 74 65 67 6f 72 79 20 76 61 72 69 61 62   category variab
ae80: 6c 65 20 76 61 6c 75 65 20 65 78 70 65 63 74 65  le value expecte
ae90: 64 20 74 6f 6c 20 75 6e 69 74 73 20 73 74 61 74  d tol units stat
aea0: 75 73 20 63 6f 6d 6d 65 6e 74 29 0a 09 20 20 20  us comment)..   
aeb0: 20 28 73 65 74 21 20 63 75 72 72 2d 74 65 73 74   (set! curr-test
aec0: 2d 6e 61 6d 65 20 74 65 73 74 6e 61 6d 65 29 0a  -name testname).
aed0: 09 20 20 20 20 28 73 65 74 21 20 74 65 73 74 2d  .    (set! test-
aee0: 64 61 74 61 20 28 61 70 70 65 6e 64 20 74 65 73  data (append tes
aef0: 74 2d 64 61 74 61 20 28 6c 69 73 74 20 28 6c 69  t-data (list (li
af00: 73 74 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61  st run-id testna
af10: 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 63 61 74  me item-path cat
af20: 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65 20 76  egory variable v
af30: 61 6c 75 65 20 65 78 70 65 63 74 65 64 20 74 6f  alue expected to
af40: 6c 20 75 6e 69 74 73 20 73 74 61 74 75 73 20 63  l units status c
af50: 6f 6d 6d 65 6e 74 29 29 29 29 29 0a 09 20 20 64  omment)))))..  d
af60: 62 20 0a 09 20 20 3b 3b 20 22 53 45 4c 45 43 54  b ..  ;; "SELECT
af70: 20 72 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d 65   run_id,testname
af80: 2c 69 74 65 6d 5f 70 61 74 68 2c 63 61 74 65 67  ,item_path,categ
af90: 6f 72 79 2c 76 61 72 69 61 62 6c 65 2c 74 64 2e  ory,variable,td.
afa0: 76 61 6c 75 65 20 41 53 20 76 61 6c 75 65 2c 65  value AS value,e
afb0: 78 70 65 63 74 65 64 2c 74 6f 6c 2c 75 6e 69 74  xpected,tol,unit
afc0: 73 2c 74 64 2e 73 74 61 74 75 73 20 41 53 20 73  s,td.status AS s
afd0: 74 61 74 75 73 2c 74 64 2e 63 6f 6d 6d 65 6e 74  tatus,td.comment
afe0: 20 41 53 20 63 6f 6d 6d 65 6e 74 20 46 52 4f 4d   AS comment FROM
aff0: 20 74 65 73 74 5f 64 61 74 61 20 41 53 20 74 64   test_data AS td
b000: 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 74 65 73 74   INNER JOIN test
b010: 73 20 4f 4e 20 74 65 73 74 73 2e 69 64 3d 74 64  s ON tests.id=td
b020: 2e 74 65 73 74 5f 69 64 20 57 48 45 52 45 20 74  .test_id WHERE t
b030: 65 73 74 5f 69 64 3d 3f 3b 22 0a 09 20 20 22 53  est_id=?;"..  "S
b040: 45 4c 45 43 54 20 72 75 6e 5f 69 64 2c 74 65 73  ELECT run_id,tes
b050: 74 6e 61 6d 65 2c 69 74 65 6d 5f 70 61 74 68 2c  tname,item_path,
b060: 63 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62 6c  category,variabl
b070: 65 2c 74 64 2e 76 61 6c 75 65 20 41 53 20 76 61  e,td.value AS va
b080: 6c 75 65 2c 74 64 2e 65 78 70 65 63 74 65 64 2c  lue,td.expected,
b090: 74 64 2e 74 6f 6c 2c 74 64 2e 75 6e 69 74 73 2c  td.tol,td.units,
b0a0: 74 64 2e 73 74 61 74 75 73 20 41 53 20 73 74 61  td.status AS sta
b0b0: 74 75 73 2c 74 64 2e 63 6f 6d 6d 65 6e 74 20 41  tus,td.comment A
b0c0: 53 20 63 6f 6d 6d 65 6e 74 20 46 52 4f 4d 20 74  S comment FROM t
b0d0: 65 73 74 5f 64 61 74 61 20 41 53 20 74 64 20 49  est_data AS td I
b0e0: 4e 4e 45 52 20 4a 4f 49 4e 20 74 65 73 74 73 20  NNER JOIN tests 
b0f0: 4f 4e 20 74 65 73 74 73 2e 69 64 3d 74 64 2e 74  ON tests.id=td.t
b100: 65 73 74 5f 69 64 20 57 48 45 52 45 20 74 65 73  est_id WHERE tes
b110: 74 6e 61 6d 65 3d 3f 3b 22 0a 09 20 20 74 65 73  tname=?;"..  tes
b120: 74 2d 69 64 29 0a 09 20 28 69 66 20 63 75 72 72  t-id).. (if curr
b130: 2d 74 65 73 74 2d 6e 61 6d 65 0a 09 20 20 20 20  -test-name..    
b140: 20 28 73 65 74 21 20 72 65 73 75 6c 74 73 20 28   (set! results (
b150: 61 70 70 65 6e 64 20 72 65 73 75 6c 74 73 20 28  append results (
b160: 6c 69 73 74 20 28 63 6f 6e 73 20 63 75 72 72 2d  list (cons curr-
b170: 74 65 73 74 2d 6e 61 6d 65 20 74 65 73 74 2d 64  test-name test-d
b180: 61 74 61 29 29 29 29 29 0a 09 20 29 29 0a 20 20  ata))))).. )).  
b190: 20 20 20 28 73 6f 72 74 20 28 64 65 6c 65 74 65     (sort (delete
b1a0: 2d 64 75 70 6c 69 63 61 74 65 73 20 74 65 73 74  -duplicates test
b1b0: 2d 69 64 73 29 20 73 74 72 69 6e 67 3c 3d 29 29  -ids) string<=))
b1c0: 0a 20 20 20 20 28 73 79 73 74 65 6d 20 28 63 6f  .    (system (co
b1d0: 6e 63 20 22 6d 6b 64 69 72 20 2d 70 20 22 20 74  nc "mkdir -p " t
b1e0: 65 6d 70 64 69 72 29 29 0a 20 20 20 20 3b 3b 20  empdir)).    ;; 
b1f0: 28 70 70 20 72 65 73 75 6c 74 73 29 0a 20 20 20  (pp results).   
b200: 20 28 6f 64 73 3a 6c 69 73 74 2d 3e 6f 64 73 20   (ods:list->ods 
b210: 0a 20 20 20 20 20 74 65 6d 70 64 69 72 0a 20 20  .     tempdir.  
b220: 20 20 20 28 69 66 20 28 73 74 72 69 6e 67 2d 6d     (if (string-m
b230: 61 74 63 68 20 28 72 65 67 65 78 70 20 22 5e 5b  atch (regexp "^[
b240: 2f 7e 5d 2b 2e 2a 22 29 20 6f 75 74 70 75 74 66  /~]+.*") outputf
b250: 69 6c 65 29 20 3b 3b 20 66 75 6c 6c 20 70 61 74  ile) ;; full pat
b260: 68 3f 0a 09 20 6f 75 74 70 75 74 66 69 6c 65 0a  h?.. outputfile.
b270: 09 20 28 62 65 67 69 6e 0a 09 20 20 20 28 64 65  . (begin..   (de
b280: 62 75 67 3a 70 72 69 6e 74 20 30 20 22 57 41 52  bug:print 0 "WAR
b290: 4e 49 4e 47 3a 20 70 61 74 68 20 67 69 76 65 6e  NING: path given
b2a0: 2c 20 22 20 6f 75 74 70 75 74 66 69 6c 65 20 22  , " outputfile "
b2b0: 20 69 73 20 72 65 6c 61 74 69 76 65 2c 20 70 72   is relative, pr
b2c0: 65 66 69 78 69 6e 67 20 77 69 74 68 20 63 75 72  efixing with cur
b2d0: 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 22 29  rent directory")
b2e0: 0a 09 20 20 20 28 63 6f 6e 63 20 28 63 75 72 72  ..   (conc (curr
b2f0: 65 6e 74 2d 64 69 72 65 63 74 6f 72 79 29 20 22  ent-directory) "
b300: 2f 22 20 6f 75 74 70 75 74 66 69 6c 65 29 29 29  /" outputfile)))
b310: 0a 20 20 20 20 20 72 65 73 75 6c 74 73 29 0a 20  .     results). 
b320: 20 20 20 3b 3b 20 62 72 75 74 61 6c 20 63 6c 65     ;; brutal cle
b330: 61 6e 20 75 70 0a 20 20 20 20 28 73 79 73 74 65  an up.    (syste
b340: 6d 20 22 72 6d 20 2d 72 66 20 74 65 6d 70 64 69  m "rm -rf tempdi
b350: 72 22 29 29 29 0a 0a 3b 3b 20 28 64 62 3a 65 78  r")))..;; (db:ex
b360: 74 72 61 63 74 2d 6f 64 73 2d 66 69 6c 65 20 64  tract-ods-file d
b370: 62 20 22 6f 75 74 70 75 74 66 69 6c 65 2e 6f 64  b "outputfile.od
b380: 73 22 20 27 28 28 22 73 79 73 6e 61 6d 65 22 20  s" '(("sysname" 
b390: 22 25 22 29 28 22 66 73 6e 61 6d 65 22 20 22 25  "%")("fsname" "%
b3a0: 22 29 28 22 64 61 74 61 70 61 74 68 22 20 22 25  ")("datapath" "%
b3b0: 22 29 29 20 22 25 22 29 0a 0a 0a 3b 3b 3d 3d 3d  ")) "%")...;;===
b3c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
b3d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
b3e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
b3f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
b400: 3d 3d 3d 0a 3b 3b 20 52 45 4d 4f 54 45 20 44 42  ===.;; REMOTE DB
b410: 20 41 43 43 45 53 53 20 56 49 41 20 52 50 43 0a   ACCESS VIA RPC.
b420: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
b430: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
b440: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
b450: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
b460: 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 28 64 65  ========..;; (de
b470: 66 69 6e 65 20 28 72 64 62 3a 67 65 74 2d 76 61  fine (rdb:get-va
b480: 72 20 64 62 20 76 61 72 29 0a 3b 3b 20 28 64 65  r db var).;; (de
b490: 66 69 6e 65 20 28 72 64 62 3a 73 65 74 2d 76 61  fine (rdb:set-va
b4a0: 72 20 64 62 20 76 61 72 20 76 61 6c 29 0a 3b 3b  r db var val).;;
b4b0: 20 28 64 65 66 69 6e 65 20 28 72 64 62 2d 67 65   (define (rdb-ge
b4c0: 74 2d 6b 65 79 73 20 64 62 29 0a 3b 3b 20 28 64  t-keys db).;; (d
b4d0: 65 66 69 6e 65 20 28 72 64 62 3a 67 65 74 2d 76  efine (rdb:get-v
b4e0: 61 6c 75 65 2d 62 79 2d 68 65 61 64 65 72 20 72  alue-by-header r
b4f0: 6f 77 20 68 65 61 64 65 72 20 66 69 65 6c 64 29  ow header field)
b500: 0a 3b 3b 20 28 64 65 66 69 6e 65 20 28 72 72 75  .;; (define (rru
b510: 6e 73 3a 67 65 74 2d 73 74 64 2d 72 75 6e 2d 66  ns:get-std-run-f
b520: 69 65 6c 64 73 20 6b 65 79 73 20 72 65 6d 66 69  ields keys remfi
b530: 65 6c 64 73 29 0a 3b 3b 20 28 64 65 66 69 6e 65  elds).;; (define
b540: 20 28 72 64 62 3a 67 65 74 2d 72 75 6e 73 20 64   (rdb:get-runs d
b550: 62 20 72 75 6e 70 61 74 74 20 63 6f 75 6e 74 20  b runpatt count 
b560: 6f 66 66 73 65 74 20 6b 65 79 70 61 74 74 73 29  offset keypatts)
b570: 0a 3b 3b 20 28 64 65 66 69 6e 65 20 28 72 64 62  .;; (define (rdb
b580: 3a 67 65 74 2d 6e 75 6d 2d 72 75 6e 73 20 64 62  :get-num-runs db
b590: 20 72 75 6e 70 61 74 74 29 0a 3b 3b 20 28 64 65   runpatt).;; (de
b5a0: 66 69 6e 65 20 28 72 64 62 3a 67 65 74 2d 72 75  fine (rdb:get-ru
b5b0: 6e 2d 69 6e 66 6f 20 64 62 20 72 75 6e 2d 69 64  n-info db run-id
b5c0: 29 0a 3b 3b 20 28 64 65 66 69 6e 65 20 28 72 64  ).;; (define (rd
b5d0: 62 3a 73 65 74 2d 63 6f 6d 6d 65 6e 74 2d 66 6f  b:set-comment-fo
b5e0: 72 2d 72 75 6e 20 64 62 20 72 75 6e 2d 69 64 20  r-run db run-id 
b5f0: 63 6f 6d 6d 65 6e 74 29 0a 3b 3b 20 28 64 65 66  comment).;; (def
b600: 69 6e 65 20 28 72 64 62 3a 64 65 6c 65 74 65 2d  ine (rdb:delete-
b610: 72 75 6e 20 64 62 20 72 75 6e 2d 69 64 29 0a 3b  run db run-id).;
b620: 3b 20 28 64 65 66 69 6e 65 20 28 72 64 62 3a 75  ; (define (rdb:u
b630: 70 64 61 74 65 2d 72 75 6e 2d 65 76 65 6e 74 5f  pdate-run-event_
b640: 74 69 6d 65 20 64 62 20 72 75 6e 2d 69 64 29 0a  time db run-id).
b650: 3b 3b 20 28 64 65 66 69 6e 65 20 28 72 64 62 2d  ;; (define (rdb-
b660: 67 65 74 2d 74 65 73 74 73 2d 66 6f 72 2d 72 75  get-tests-for-ru
b670: 6e 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74  n db run-id test
b680: 70 61 74 74 20 69 74 65 6d 70 61 74 74 20 73 74  patt itempatt st
b690: 61 74 65 73 20 73 74 61 74 75 73 65 73 29 0a 3b  ates statuses).;
b6a0: 3b 20 28 64 65 66 69 6e 65 20 28 72 64 62 3a 64  ; (define (rdb:d
b6b0: 65 6c 65 74 65 2d 74 65 73 74 2d 73 74 65 70 2d  elete-test-step-
b6c0: 72 65 63 6f 72 64 73 20 64 62 20 72 75 6e 2d 69  records db run-i
b6d0: 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d  d test-name item
b6e0: 64 61 74 29 0a 3b 3b 20 28 64 65 66 69 6e 65 20  dat).;; (define 
b6f0: 28 72 64 62 3a 64 65 6c 65 74 65 2d 74 65 73 74  (rdb:delete-test
b700: 2d 72 65 63 6f 72 64 73 20 64 62 20 74 65 73 74  -records db test
b710: 2d 69 64 29 0a 0a 28 64 65 66 69 6e 65 20 28 72  -id)..(define (r
b720: 64 62 3a 73 65 74 2d 74 65 73 74 73 2d 73 74 61  db:set-tests-sta
b730: 74 65 2d 73 74 61 74 75 73 20 64 62 20 72 75 6e  te-status db run
b740: 2d 69 64 20 74 65 73 74 6e 61 6d 65 73 20 63 75  -id testnames cu
b750: 72 72 73 74 61 74 65 20 63 75 72 72 73 74 61 74  rrstate currstat
b760: 75 73 20 6e 65 77 73 74 61 74 65 20 6e 65 77 73  us newstate news
b770: 74 61 74 75 73 29 0a 20 20 28 69 66 20 2a 72 75  tatus).  (if *ru
b780: 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28  nremote*.      (
b790: 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65 63 74  let ((host (vect
b7a0: 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74  or-ref *runremot
b7b0: 65 2a 20 30 29 29 0a 09 20 20 20 20 28 70 6f 72  e* 0))..    (por
b7c0: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72  t (vector-ref *r
b7d0: 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09  unremote* 1)))..
b7e0: 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20  ((rpc:procedure 
b7f0: 27 72 64 62 3a 73 65 74 2d 74 65 73 74 73 2d 73  'rdb:set-tests-s
b800: 74 61 74 65 2d 73 74 61 74 75 73 20 68 6f 73 74  tate-status host
b810: 20 70 6f 72 74 29 0a 09 20 72 75 6e 2d 69 64 20   port).. run-id 
b820: 74 65 73 74 6e 61 6d 65 73 20 63 75 72 72 73 74  testnames currst
b830: 61 74 65 20 63 75 72 72 73 74 61 74 75 73 20 6e  ate currstatus n
b840: 65 77 73 74 61 74 65 20 6e 65 77 73 74 61 74 75  ewstate newstatu
b850: 73 29 29 0a 20 20 20 20 20 20 28 64 62 3a 73 65  s)).      (db:se
b860: 74 2d 74 65 73 74 73 2d 73 74 61 74 65 2d 73 74  t-tests-state-st
b870: 61 74 75 73 20 64 62 20 72 75 6e 2d 69 64 20 74  atus db run-id t
b880: 65 73 74 6e 61 6d 65 73 20 63 75 72 72 73 74 61  estnames currsta
b890: 74 65 20 63 75 72 72 73 74 61 74 75 73 20 6e 65  te currstatus ne
b8a0: 77 73 74 61 74 65 20 6e 65 77 73 74 61 74 75 73  wstate newstatus
b8b0: 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 72 64  )))..(define (rd
b8c0: 62 3a 74 65 73 74 73 74 65 70 2d 73 65 74 2d 73  b:teststep-set-s
b8d0: 74 61 74 75 73 21 20 64 62 20 72 75 6e 2d 69 64  tatus! db run-id
b8e0: 20 74 65 73 74 2d 6e 61 6d 65 20 74 65 73 74 73   test-name tests
b8f0: 74 65 70 2d 6e 61 6d 65 20 73 74 61 74 65 2d 69  tep-name state-i
b900: 6e 20 73 74 61 74 75 73 2d 69 6e 20 69 74 65 6d  n status-in item
b910: 64 61 74 20 63 6f 6d 6d 65 6e 74 20 6c 6f 67 66  dat comment logf
b920: 69 6c 65 29 0a 20 20 28 70 72 69 6e 74 20 22 74  ile).  (print "t
b930: 65 73 74 73 74 65 70 2d 73 65 74 2d 73 74 61 74  eststep-set-stat
b940: 75 73 21 3a 22 20 20 72 75 6e 2d 69 64 20 74 65  us!:"  run-id te
b950: 73 74 2d 6e 61 6d 65 20 74 65 73 74 73 74 65 70  st-name teststep
b960: 2d 6e 61 6d 65 20 73 74 61 74 65 2d 69 6e 20 73  -name state-in s
b970: 74 61 74 75 73 2d 69 6e 20 69 74 65 6d 64 61 74  tatus-in itemdat
b980: 20 63 6f 6d 6d 65 6e 74 20 6c 6f 67 66 69 6c 65   comment logfile
b990: 29 0a 20 20 28 6c 65 74 20 28 28 69 74 65 6d 2d  ).  (let ((item-
b9a0: 70 61 74 68 20 28 69 74 65 6d 2d 6c 69 73 74 2d  path (item-list-
b9b0: 3e 70 61 74 68 20 69 74 65 6d 64 61 74 29 29 29  >path itemdat)))
b9c0: 0a 20 20 20 20 28 69 66 20 2a 72 75 6e 72 65 6d  .    (if *runrem
b9d0: 6f 74 65 2a 0a 09 28 6c 65 74 20 28 28 68 6f 73  ote*..(let ((hos
b9e0: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72  t (vector-ref *r
b9f0: 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20  unremote* 0)).. 
ba00: 20 20 20 20 20 28 70 6f 72 74 20 28 76 65 63 74       (port (vect
ba10: 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74  or-ref *runremot
ba20: 65 2a 20 31 29 29 29 0a 09 20 20 28 28 72 70 63  e* 1)))..  ((rpc
ba30: 3a 70 72 6f 63 65 64 75 72 65 20 27 72 64 62 3a  :procedure 'rdb:
ba40: 74 65 73 74 73 74 65 70 2d 73 65 74 2d 73 74 61  teststep-set-sta
ba50: 74 75 73 21 20 68 6f 73 74 20 70 6f 72 74 29 0a  tus! host port).
ba60: 09 20 20 20 72 75 6e 2d 69 64 20 74 65 73 74 2d  .   run-id test-
ba70: 6e 61 6d 65 20 74 65 73 74 73 74 65 70 2d 6e 61  name teststep-na
ba80: 6d 65 20 73 74 61 74 65 2d 69 6e 20 73 74 61 74  me state-in stat
ba90: 75 73 2d 69 6e 20 69 74 65 6d 2d 70 61 74 68 20  us-in item-path 
baa0: 63 6f 6d 6d 65 6e 74 20 6c 6f 67 66 69 6c 65 29  comment logfile)
bab0: 0a 09 20 20 28 64 62 3a 74 65 73 74 73 74 65 70  ..  (db:teststep
bac0: 2d 73 65 74 2d 73 74 61 74 75 73 21 20 64 62 20  -set-status! db 
bad0: 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65  run-id test-name
bae0: 20 74 65 73 74 73 74 65 70 2d 6e 61 6d 65 20 73   teststep-name s
baf0: 74 61 74 65 2d 69 6e 20 73 74 61 74 75 73 2d 69  tate-in status-i
bb00: 6e 20 69 74 65 6d 2d 70 61 74 68 20 63 6f 6d 6d  n item-path comm
bb10: 65 6e 74 20 6c 6f 67 66 69 6c 65 29 29 29 29 29  ent logfile)))))
bb20: 0a 0a 0a 3b 3b 20 28 64 65 66 69 6e 65 20 28 72  ...;; (define (r
bb30: 64 62 3a 64 65 6c 65 74 65 2d 74 65 73 74 73 2d  db:delete-tests-
bb40: 69 6e 2d 73 74 61 74 65 20 64 62 20 72 75 6e 2d  in-state db run-
bb50: 69 64 20 73 74 61 74 65 29 0a 3b 3b 20 28 64 65  id state).;; (de
bb60: 66 69 6e 65 20 28 72 64 62 3a 74 65 73 74 2d 73  fine (rdb:test-s
bb70: 65 74 2d 73 74 61 74 65 2d 73 74 61 74 75 73 2d  et-state-status-
bb80: 62 79 2d 69 64 20 64 62 20 74 65 73 74 2d 69 64  by-id db test-id
bb90: 20 6e 65 77 73 74 61 74 65 20 6e 65 77 73 74 61   newstate newsta
bba0: 74 75 73 20 6e 65 77 63 6f 6d 6d 65 6e 74 29 0a  tus newcomment).
bbb0: 3b 3b 20 28 64 65 66 69 6e 65 20 28 72 64 62 3a  ;; (define (rdb:
bbc0: 67 65 74 2d 63 6f 75 6e 74 2d 74 65 73 74 73 2d  get-count-tests-
bbd0: 72 75 6e 6e 69 6e 67 20 64 62 29 0a 3b 3b 20 28  running db).;; (
bbe0: 64 65 66 69 6e 65 20 28 72 64 62 3a 67 65 74 2d  define (rdb:get-
bbf0: 63 6f 75 6e 74 2d 74 65 73 74 73 2d 72 75 6e 6e  count-tests-runn
bc00: 69 6e 67 2d 69 6e 2d 6a 6f 62 67 72 6f 75 70 20  ing-in-jobgroup 
bc10: 64 62 20 6a 6f 62 67 72 6f 75 70 29 0a 3b 3b 20  db jobgroup).;; 
bc20: 28 64 65 66 69 6e 65 20 28 72 64 62 3a 65 73 74  (define (rdb:est
bc30: 69 6d 61 74 65 64 2d 74 65 73 74 73 2d 72 65 6d  imated-tests-rem
bc40: 61 69 6e 69 6e 67 20 64 62 20 72 75 6e 2d 69 64  aining db run-id
bc50: 29 0a 3b 3b 20 28 64 65 66 69 6e 65 20 28 72 64  ).;; (define (rd
bc60: 62 3a 67 65 74 2d 74 65 73 74 2d 69 6e 66 6f 20  b:get-test-info 
bc70: 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61  db run-id testna
bc80: 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 0a 3b 3b  me item-path).;;
bc90: 20 28 64 65 66 69 6e 65 20 28 72 64 62 3a 67 65   (define (rdb:ge
bca0: 74 2d 74 65 73 74 2d 64 61 74 61 2d 62 79 2d 69  t-test-data-by-i
bcb0: 64 20 64 62 20 74 65 73 74 2d 69 64 29 0a 3b 3b  d db test-id).;;
bcc0: 20 28 64 65 66 69 6e 65 20 28 72 64 62 3a 74 65   (define (rdb:te
bcd0: 73 74 2d 73 65 74 2d 63 6f 6d 6d 65 6e 74 20 64  st-set-comment d
bce0: 62 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d  b run-id testnam
bcf0: 65 20 69 74 65 6d 2d 70 61 74 68 20 63 6f 6d 6d  e item-path comm
bd00: 65 6e 74 29 0a 3b 3b 20 28 64 65 66 69 6e 65 20  ent).;; (define 
bd10: 28 72 64 62 3a 74 65 73 74 2d 73 65 74 2d 72 75  (rdb:test-set-ru
bd20: 6e 64 69 72 21 20 64 62 20 72 75 6e 2d 69 64 20  ndir! db run-id 
bd30: 74 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61  testname item-pa
bd40: 74 68 20 72 75 6e 64 69 72 29 0a 3b 3b 20 28 64  th rundir).;; (d
bd50: 65 66 69 6e 65 20 28 72 64 62 3a 74 65 73 74 2d  efine (rdb:test-
bd60: 67 65 74 2d 70 61 74 68 73 2d 6d 61 74 63 68 69  get-paths-matchi
bd70: 6e 67 20 64 62 20 6b 65 79 6e 61 6d 65 73 20 74  ng db keynames t
bd80: 61 72 67 65 74 29 0a 3b 3b 20 28 64 65 66 69 6e  arget).;; (defin
bd90: 65 20 28 72 64 62 3a 74 65 73 74 2d 67 65 74 2d  e (rdb:test-get-
bda0: 74 65 73 74 2d 72 65 63 6f 72 64 73 2d 6d 61 74  test-records-mat
bdb0: 63 68 69 6e 67 20 64 62 20 6b 65 79 6e 61 6d 65  ching db keyname
bdc0: 73 20 74 61 72 67 65 74 29 0a 3b 3b 20 28 64 65  s target).;; (de
bdd0: 66 69 6e 65 20 28 72 64 62 3a 74 65 73 74 6d 65  fine (rdb:testme
bde0: 74 61 2d 67 65 74 2d 72 65 63 6f 72 64 20 64 62  ta-get-record db
bdf0: 20 74 65 73 74 6e 61 6d 65 29 0a 3b 3b 20 28 64   testname).;; (d
be00: 65 66 69 6e 65 20 28 72 64 62 3a 74 65 73 74 6d  efine (rdb:testm
be10: 65 74 61 2d 61 64 64 2d 72 65 63 6f 72 64 20 64  eta-add-record d
be20: 62 20 74 65 73 74 6e 61 6d 65 29 0a 3b 3b 20 28  b testname).;; (
be30: 64 65 66 69 6e 65 20 28 72 64 62 3a 74 65 73 74  define (rdb:test
be40: 6d 65 74 61 2d 75 70 64 61 74 65 2d 66 69 65 6c  meta-update-fiel
be50: 64 20 64 62 20 74 65 73 74 6e 61 6d 65 20 66 69  d db testname fi
be60: 65 6c 64 20 76 61 6c 75 65 29 0a 3b 3b 20 28 64  eld value).;; (d
be70: 65 66 69 6e 65 20 28 72 64 62 3a 63 73 76 2d 3e  efine (rdb:csv->
be80: 74 65 73 74 2d 64 61 74 61 20 64 62 20 74 65 73  test-data db tes
be90: 74 2d 69 64 20 63 73 76 64 61 74 61 29 0a 3b 3b  t-id csvdata).;;
bea0: 20 28 64 65 66 69 6e 65 20 28 72 64 62 3a 72 65   (define (rdb:re
beb0: 61 64 2d 74 65 73 74 2d 64 61 74 61 20 64 62 20  ad-test-data db 
bec0: 74 65 73 74 2d 69 64 20 63 61 74 65 67 6f 72 79  test-id category
bed0: 70 61 74 74 29 0a 3b 3b 20 28 64 65 66 69 6e 65  patt).;; (define
bee0: 20 28 72 64 62 3a 6c 6f 61 64 2d 74 65 73 74 2d   (rdb:load-test-
bef0: 64 61 74 61 20 64 62 20 72 75 6e 2d 69 64 20 74  data db run-id t
bf00: 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 64 61 74  est-name itemdat
bf10: 29 0a 3b 3b 20 28 64 65 66 69 6e 65 20 28 72 64  ).;; (define (rd
bf20: 62 3a 74 65 73 74 2d 64 61 74 61 2d 72 6f 6c 6c  b:test-data-roll
bf30: 75 70 20 64 62 20 74 65 73 74 2d 69 64 20 73 74  up db test-id st
bf40: 61 74 75 73 29 0a 3b 3b 20 28 64 65 66 69 6e 65  atus).;; (define
bf50: 20 28 72 64 62 3a 67 65 74 2d 70 72 65 76 2d 74   (rdb:get-prev-t
bf60: 6f 6c 2d 66 6f 72 2d 74 65 73 74 20 64 62 20 74  ol-for-test db t
bf70: 65 73 74 2d 69 64 20 63 61 74 65 67 6f 72 79 20  est-id category 
bf80: 76 61 72 69 61 62 6c 65 29 0a 3b 3b 20 28 64 65  variable).;; (de
bf90: 66 69 6e 65 20 28 72 64 62 3a 73 74 65 70 2d 67  fine (rdb:step-g
bfa0: 65 74 2d 74 69 6d 65 2d 61 73 2d 73 74 72 69 6e  et-time-as-strin
bfb0: 67 20 76 65 63 29 0a 3b 3b 20 28 64 65 66 69 6e  g vec).;; (defin
bfc0: 65 20 28 72 64 62 3a 67 65 74 2d 73 74 65 70 73  e (rdb:get-steps
bfd0: 2d 66 6f 72 2d 74 65 73 74 20 64 62 20 74 65 73  -for-test db tes
bfe0: 74 2d 69 64 29 0a 3b 3b 20 28 64 65 66 69 6e 65  t-id).;; (define
bff0: 20 28 72 64 62 3a 67 65 74 2d 73 74 65 70 73 2d   (rdb:get-steps-
c000: 74 61 62 6c 65 20 64 62 20 74 65 73 74 2d 69 64  table db test-id
c010: 29 0a 3b 3b 20 28 64 65 66 69 6e 65 20 28 72 64  ).;; (define (rd
c020: 62 2d 67 65 74 2d 70 72 65 72 65 71 73 2d 6e 6f  b-get-prereqs-no
c030: 74 2d 6d 65 74 20 64 62 20 72 75 6e 2d 69 64 20  t-met db run-id 
c040: 77 61 69 74 6f 6e 29 0a 3b 3b 20 28 64 65 66 69  waiton).;; (defi
c050: 6e 65 20 28 72 64 62 3a 67 65 74 2d 70 72 65 72  ne (rdb:get-prer
c060: 65 71 73 2d 6e 6f 74 2d 6d 65 74 20 64 62 20 72  eqs-not-met db r
c070: 75 6e 2d 69 64 20 77 61 69 74 6f 6e 73 20 72 65  un-id waitons re
c080: 66 2d 69 74 65 6d 2d 70 61 74 68 29 0a 3b 3b 20  f-item-path).;; 
c090: 28 64 65 66 69 6e 65 20 28 72 64 62 3a 65 78 74  (define (rdb:ext
c0a0: 72 61 63 74 2d 6f 64 73 2d 66 69 6c 65 20 64 62  ract-ods-file db
c0b0: 20 6f 75 74 70 75 74 66 69 6c 65 20 6b 65 79 70   outputfile keyp
c0c0: 61 74 74 2d 61 6c 69 73 74 20 72 75 6e 73 70 61  att-alist runspa
c0d0: 74 74 20 70 61 74 68 6d 6f 64 29 0a              tt pathmod).