Megatest

Hex Artifact Content
Login

Artifact 72acdb1ad4467de93c6d658dd90b1d76f5aec2fb:


0000: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
0010: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0030: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0040: 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 43 6f 70 79  ========.;; Copy
0050: 72 69 67 68 74 20 32 30 30 36 2d 32 30 31 31 2c  right 2006-2011,
0060: 20 4d 61 74 74 68 65 77 20 57 65 6c 6c 61 6e 64   Matthew Welland
0070: 2e 0a 3b 3b 20 0a 3b 3b 20 20 54 68 69 73 20 70  ..;; .;;  This p
0080: 72 6f 67 72 61 6d 20 69 73 20 6d 61 64 65 20 61  rogram is made a
0090: 76 61 69 6c 61 62 6c 65 20 75 6e 64 65 72 20 74  vailable under t
00a0: 68 65 20 47 4e 55 20 47 50 4c 20 76 65 72 73 69  he GNU GPL versi
00b0: 6f 6e 20 32 2e 30 20 6f 72 0a 3b 3b 20 20 67 72  on 2.0 or.;;  gr
00c0: 65 61 74 65 72 2e 20 53 65 65 20 74 68 65 20 61  eater. See the a
00d0: 63 63 6f 6d 70 61 6e 79 69 6e 67 20 66 69 6c 65  ccompanying file
00e0: 20 43 4f 50 59 49 4e 47 20 66 6f 72 20 64 65 74   COPYING for det
00f0: 61 69 6c 73 2e 0a 3b 3b 20 0a 3b 3b 20 20 54 68  ails..;; .;;  Th
0100: 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69  is program is di
0110: 73 74 72 69 62 75 74 65 64 20 57 49 54 48 4f 55  stributed WITHOU
0120: 54 20 41 4e 59 20 57 41 52 52 41 4e 54 59 3b 20  T ANY WARRANTY; 
0130: 77 69 74 68 6f 75 74 20 65 76 65 6e 20 74 68 65  without even the
0140: 0a 3b 3b 20 20 69 6d 70 6c 69 65 64 20 77 61 72  .;;  implied war
0150: 72 61 6e 74 79 20 6f 66 20 4d 45 52 43 48 41 4e  ranty of MERCHAN
0160: 54 41 42 49 4c 49 54 59 20 6f 72 20 46 49 54 4e  TABILITY or FITN
0170: 45 53 53 20 46 4f 52 20 41 20 50 41 52 54 49 43  ESS FOR A PARTIC
0180: 55 4c 41 52 0a 3b 3b 20 20 50 55 52 50 4f 53 45  ULAR.;;  PURPOSE
0190: 2e 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ..;;============
01a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 3d 3d  ==========..;;==
01e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0200: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0210: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0220: 3d 3d 3d 3d 0a 3b 3b 20 44 61 74 61 62 61 73 65  ====.;; Database
0230: 20 61 63 63 65 73 73 0a 3b 3b 3d 3d 3d 3d 3d 3d   access.;;======
0240: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0250: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0260: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0270: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0280: 0a 0a 28 72 65 71 75 69 72 65 2d 65 78 74 65 6e  ..(require-exten
0290: 73 69 6f 6e 20 28 73 72 66 69 20 31 38 29 20 65  sion (srfi 18) e
02a0: 78 74 72 61 73 20 74 63 70 20 72 70 63 29 0a 28  xtras tcp rpc).(
02b0: 69 6d 70 6f 72 74 20 28 70 72 65 66 69 78 20 72  import (prefix r
02c0: 70 63 20 72 70 63 3a 29 29 0a 0a 28 75 73 65 20  pc rpc:))..(use 
02d0: 73 71 6c 69 74 65 33 20 73 72 66 69 2d 31 20 70  sqlite3 srfi-1 p
02e0: 6f 73 69 78 20 72 65 67 65 78 20 72 65 67 65 78  osix regex regex
02f0: 2d 63 61 73 65 20 73 72 66 69 2d 36 39 20 63 73  -case srfi-69 cs
0300: 76 2d 78 6d 6c 29 0a 28 69 6d 70 6f 72 74 20 28  v-xml).(import (
0310: 70 72 65 66 69 78 20 73 71 6c 69 74 65 33 20 73  prefix sqlite3 s
0320: 71 6c 69 74 65 33 3a 29 29 0a 0a 28 64 65 63 6c  qlite3:))..(decl
0330: 61 72 65 20 28 75 6e 69 74 20 64 62 29 29 0a 28  are (unit db)).(
0340: 64 65 63 6c 61 72 65 20 28 75 73 65 73 20 63 6f  declare (uses co
0350: 6d 6d 6f 6e 29 29 0a 28 64 65 63 6c 61 72 65 20  mmon)).(declare 
0360: 28 75 73 65 73 20 6b 65 79 73 29 29 0a 28 64 65  (uses keys)).(de
0370: 63 6c 61 72 65 20 28 75 73 65 73 20 6f 64 73 29  clare (uses ods)
0380: 29 0a 0a 28 69 6e 63 6c 75 64 65 20 22 63 6f 6d  )..(include "com
0390: 6d 6f 6e 5f 72 65 63 6f 72 64 73 2e 73 63 6d 22  mon_records.scm"
03a0: 29 0a 28 69 6e 63 6c 75 64 65 20 22 64 62 5f 72  ).(include "db_r
03b0: 65 63 6f 72 64 73 2e 73 63 6d 22 29 0a 28 69 6e  ecords.scm").(in
03c0: 63 6c 75 64 65 20 22 6b 65 79 5f 72 65 63 6f 72  clude "key_recor
03d0: 64 73 2e 73 63 6d 22 29 0a 28 69 6e 63 6c 75 64  ds.scm").(includ
03e0: 65 20 22 72 75 6e 5f 72 65 63 6f 72 64 73 2e 73  e "run_records.s
03f0: 63 6d 22 29 0a 0a 3b 3b 20 74 69 6d 65 73 74 61  cm")..;; timesta
0400: 6d 70 20 74 79 70 65 20 28 76 61 6c 31 20 76 61  mp type (val1 va
0410: 6c 32 20 2e 2e 2e 29 0a 3b 3b 20 74 79 70 65 3a  l2 ...).;; type:
0420: 20 6d 65 74 61 2d 69 6e 66 6f 2c 20 73 74 65 70   meta-info, step
0430: 0a 28 64 65 66 69 6e 65 20 2a 69 6e 63 6f 6d 69  .(define *incomi
0440: 6e 67 2d 64 61 74 61 2a 20 20 20 20 20 20 27 28  ng-data*      '(
0450: 29 29 0a 28 64 65 66 69 6e 65 20 2a 69 6e 63 6f  )).(define *inco
0460: 6d 69 6e 67 2d 6c 61 73 74 2d 74 69 6d 65 2a 20  ming-last-time* 
0470: 28 63 75 72 72 65 6e 74 2d 73 65 63 6f 6e 64 73  (current-seconds
0480: 29 29 0a 28 64 65 66 69 6e 65 20 2a 69 6e 63 6f  )).(define *inco
0490: 6d 69 6e 67 2d 6d 75 74 65 78 2a 20 20 20 20 20  ming-mutex*     
04a0: 28 6d 61 6b 65 2d 6d 75 74 65 78 29 29 0a 28 64  (make-mutex)).(d
04b0: 65 66 69 6e 65 20 2a 63 61 63 68 65 2d 6f 6e 2a  efine *cache-on*
04c0: 20 23 66 29 0a 0a 28 64 65 66 69 6e 65 20 28 6f   #f)..(define (o
04d0: 70 65 6e 2d 64 62 29 20 3b 3b 20 20 28 63 6f 6e  pen-db) ;;  (con
04e0: 63 20 2a 74 6f 70 70 61 74 68 2a 20 22 2f 6d 65  c *toppath* "/me
04f0: 67 61 74 65 73 74 2e 64 62 22 29 20 28 63 61 72  gatest.db") (car
0500: 20 2a 63 6f 6e 66 69 67 69 6e 66 6f 2a 29 29 29   *configinfo*)))
0510: 0a 20 20 28 6c 65 74 2a 20 28 28 64 62 70 61 74  .  (let* ((dbpat
0520: 68 20 20 20 20 28 63 6f 6e 63 20 2a 74 6f 70 70  h    (conc *topp
0530: 61 74 68 2a 20 22 2f 6d 65 67 61 74 65 73 74 2e  ath* "/megatest.
0540: 64 62 22 29 29 20 3b 3b 20 66 6e 61 6d 65 29 0a  db")) ;; fname).
0550: 09 20 28 64 62 65 78 69 73 74 73 20 20 28 66 69  . (dbexists  (fi
0560: 6c 65 2d 65 78 69 73 74 73 3f 20 64 62 70 61 74  le-exists? dbpat
0570: 68 29 29 0a 09 20 28 64 62 20 20 20 20 20 20 20  h)).. (db       
0580: 20 28 73 71 6c 69 74 65 33 3a 6f 70 65 6e 2d 64   (sqlite3:open-d
0590: 61 74 61 62 61 73 65 20 64 62 70 61 74 68 29 29  atabase dbpath))
05a0: 20 3b 3b 20 28 6e 65 76 65 72 2d 67 69 76 65 2d   ;; (never-give-
05b0: 75 70 2d 6f 70 65 6e 2d 64 62 20 64 62 70 61 74  up-open-db dbpat
05c0: 68 29 29 0a 09 20 28 68 61 6e 64 6c 65 72 20 20  h)).. (handler  
05d0: 20 28 6d 61 6b 65 2d 62 75 73 79 2d 74 69 6d 65   (make-busy-time
05e0: 6f 75 74 20 33 36 30 30 30 29 29 29 0a 20 20 20  out 36000))).   
05f0: 20 28 73 71 6c 69 74 65 33 3a 73 65 74 2d 62 75   (sqlite3:set-bu
0600: 73 79 2d 68 61 6e 64 6c 65 72 21 20 64 62 20 68  sy-handler! db h
0610: 61 6e 64 6c 65 72 29 0a 20 20 20 20 28 69 66 20  andler).    (if 
0620: 28 6e 6f 74 20 64 62 65 78 69 73 74 73 29 0a 09  (not dbexists)..
0630: 28 64 62 3a 69 6e 69 74 69 61 6c 69 7a 65 20 64  (db:initialize d
0640: 62 29 29 0a 20 20 20 20 64 62 29 29 0a 0a 28 64  b)).    db))..(d
0650: 65 66 69 6e 65 20 28 64 62 3a 69 6e 69 74 69 61  efine (db:initia
0660: 6c 69 7a 65 20 64 62 29 0a 20 20 28 6c 65 74 2a  lize db).  (let*
0670: 20 28 28 63 6f 6e 66 69 67 64 61 74 20 28 63 61   ((configdat (ca
0680: 72 20 2a 63 6f 6e 66 69 67 69 6e 66 6f 2a 29 29  r *configinfo*))
0690: 20 20 3b 3b 20 74 75 74 20 74 75 74 2c 20 67 6c    ;; tut tut, gl
06a0: 6f 62 61 6c 20 77 61 72 6e 69 6e 67 2e 2e 2e 0a  obal warning....
06b0: 09 20 28 6b 65 79 73 20 20 20 20 20 28 63 6f 6e  . (keys     (con
06c0: 66 69 67 2d 67 65 74 2d 66 69 65 6c 64 73 20 63  fig-get-fields c
06d0: 6f 6e 66 69 67 64 61 74 29 29 0a 09 20 28 68 61  onfigdat)).. (ha
06e0: 76 65 6b 65 79 73 20 28 3e 20 28 6c 65 6e 67 74  vekeys (> (lengt
06f0: 68 20 6b 65 79 73 29 20 30 29 29 0a 09 20 28 6b  h keys) 0)).. (k
0700: 65 79 73 74 72 20 20 20 28 6b 65 79 73 2d 3e 6b  eystr   (keys->k
0710: 65 79 73 74 72 20 6b 65 79 73 29 29 0a 09 20 28  eystr keys)).. (
0720: 66 69 65 6c 64 73 74 72 20 28 6b 65 79 73 2d 3e  fieldstr (keys->
0730: 6b 65 79 2f 66 69 65 6c 64 20 6b 65 79 73 29 29  key/field keys))
0740: 29 0a 20 20 20 20 28 66 6f 72 2d 65 61 63 68 20  ).    (for-each 
0750: 28 6c 61 6d 62 64 61 20 28 6b 65 79 29 0a 09 09  (lambda (key)...
0760: 28 6c 65 74 20 28 28 6b 65 79 6e 20 28 76 65 63  (let ((keyn (vec
0770: 74 6f 72 2d 72 65 66 20 6b 65 79 20 30 29 29 29  tor-ref key 0)))
0780: 0a 09 09 20 20 28 69 66 20 28 6d 65 6d 62 65 72  ...  (if (member
0790: 20 28 73 74 72 69 6e 67 2d 64 6f 77 6e 63 61 73   (string-downcas
07a0: 65 20 6b 65 79 6e 29 0a 09 09 09 20 20 20 20 20  e keyn)....     
07b0: 20 28 6c 69 73 74 20 22 72 75 6e 6e 61 6d 65 22   (list "runname"
07c0: 20 22 73 74 61 74 65 22 20 22 73 74 61 74 75 73   "state" "status
07d0: 22 20 22 6f 77 6e 65 72 22 20 22 65 76 65 6e 74  " "owner" "event
07e0: 5f 74 69 6d 65 22 20 22 63 6f 6d 6d 65 6e 74 22  _time" "comment"
07f0: 20 22 66 61 69 6c 5f 63 6f 75 6e 74 22 0a 09 09   "fail_count"...
0800: 09 09 20 20 20 20 22 70 61 73 73 5f 63 6f 75 6e  ..    "pass_coun
0810: 74 22 29 29 0a 09 09 20 20 20 20 20 20 28 62 65  t"))...      (be
0820: 67 69 6e 0a 09 09 09 28 70 72 69 6e 74 20 22 45  gin....(print "E
0830: 52 52 4f 52 3a 20 79 6f 75 72 20 6b 65 79 20 63  RROR: your key c
0840: 61 6e 6e 6f 74 20 62 65 20 6e 61 6d 65 64 20 22  annot be named "
0850: 20 6b 65 79 6e 20 22 20 61 73 20 74 68 69 73 20   keyn " as this 
0860: 63 6f 6e 66 6c 69 63 74 73 20 77 69 74 68 20 74  conflicts with t
0870: 68 65 20 73 61 6d 65 20 6e 61 6d 65 64 20 66 69  he same named fi
0880: 65 6c 64 20 69 6e 20 74 68 65 20 72 75 6e 73 20  eld in the runs 
0890: 74 61 62 6c 65 22 29 0a 09 09 09 28 73 79 73 74  table")....(syst
08a0: 65 6d 20 28 63 6f 6e 63 20 22 72 6d 20 2d 66 20  em (conc "rm -f 
08b0: 22 20 64 62 70 61 74 68 29 29 0a 09 09 09 28 65  " dbpath))....(e
08c0: 78 69 74 20 31 29 29 29 29 29 0a 09 20 20 20 20  xit 1)))))..    
08d0: 20 20 6b 65 79 73 29 0a 20 20 20 20 3b 3b 20 28    keys).    ;; (
08e0: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
08f0: 64 62 20 22 50 52 41 47 4d 41 20 73 79 6e 63 68  db "PRAGMA synch
0900: 72 6f 6e 6f 75 73 20 3d 20 4f 46 46 3b 22 29 0a  ronous = OFF;").
0910: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65      (sqlite3:exe
0920: 63 75 74 65 20 64 62 20 22 43 52 45 41 54 45 20  cute db "CREATE 
0930: 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49  TABLE IF NOT EXI
0940: 53 54 53 20 6b 65 79 73 20 28 69 64 20 49 4e 54  STS keys (id INT
0950: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
0960: 2c 20 66 69 65 6c 64 6e 61 6d 65 20 54 45 58 54  , fieldname TEXT
0970: 2c 20 66 69 65 6c 64 74 79 70 65 20 54 45 58 54  , fieldtype TEXT
0980: 2c 20 43 4f 4e 53 54 52 41 49 4e 54 20 6b 65 79  , CONSTRAINT key
0990: 63 6f 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 55  constraint UNIQU
09a0: 45 20 28 66 69 65 6c 64 6e 61 6d 65 29 29 3b 22  E (fieldname));"
09b0: 29 0a 20 20 20 20 28 66 6f 72 2d 65 61 63 68 20  ).    (for-each 
09c0: 28 6c 61 6d 62 64 61 20 28 6b 65 79 29 0a 09 09  (lambda (key)...
09d0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
09e0: 20 64 62 20 22 49 4e 53 45 52 54 20 49 4e 54 4f   db "INSERT INTO
09f0: 20 6b 65 79 73 20 28 66 69 65 6c 64 6e 61 6d 65   keys (fieldname
0a00: 2c 66 69 65 6c 64 74 79 70 65 29 20 56 41 4c 55  ,fieldtype) VALU
0a10: 45 53 20 28 3f 2c 3f 29 3b 22 20 28 6b 65 79 3a  ES (?,?);" (key:
0a20: 67 65 74 2d 66 69 65 6c 64 6e 61 6d 65 20 6b 65  get-fieldname ke
0a30: 79 29 28 6b 65 79 3a 67 65 74 2d 66 69 65 6c 64  y)(key:get-field
0a40: 74 79 70 65 20 6b 65 79 29 29 29 0a 09 20 20 20  type key)))..   
0a50: 20 20 20 6b 65 79 73 29 0a 20 20 20 20 28 73 71     keys).    (sq
0a60: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62  lite3:execute db
0a70: 20 28 63 6f 6e 63 20 0a 09 09 09 20 22 43 52 45   (conc .... "CRE
0a80: 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54  ATE TABLE IF NOT
0a90: 20 45 58 49 53 54 53 20 72 75 6e 73 20 28 69 64   EXISTS runs (id
0aa0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
0ab0: 20 4b 45 59 2c 20 22 20 0a 09 09 09 20 66 69 65   KEY, " .... fie
0ac0: 6c 64 73 74 72 20 28 69 66 20 68 61 76 65 6b 65  ldstr (if haveke
0ad0: 79 73 20 22 2c 22 20 22 22 29 0a 09 09 09 20 22  ys "," "").... "
0ae0: 72 75 6e 6e 61 6d 65 20 54 45 58 54 2c 22 0a 09  runname TEXT,"..
0af0: 09 09 20 22 73 74 61 74 65 20 54 45 58 54 20 44  .. "state TEXT D
0b00: 45 46 41 55 4c 54 20 27 27 2c 22 0a 09 09 09 20  EFAULT '',".... 
0b10: 22 73 74 61 74 75 73 20 54 45 58 54 20 44 45 46  "status TEXT DEF
0b20: 41 55 4c 54 20 27 27 2c 22 0a 09 09 09 20 22 6f  AULT '',".... "o
0b30: 77 6e 65 72 20 54 45 58 54 20 44 45 46 41 55 4c  wner TEXT DEFAUL
0b40: 54 20 27 27 2c 22 0a 09 09 09 20 22 65 76 65 6e  T '',".... "even
0b50: 74 5f 74 69 6d 65 20 54 49 4d 45 53 54 41 4d 50  t_time TIMESTAMP
0b60: 2c 22 0a 09 09 09 20 22 63 6f 6d 6d 65 6e 74 20  ,".... "comment 
0b70: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c  TEXT DEFAULT '',
0b80: 22 0a 09 09 09 20 22 66 61 69 6c 5f 63 6f 75 6e  ".... "fail_coun
0b90: 74 20 49 4e 54 45 47 45 52 20 44 45 46 41 55 4c  t INTEGER DEFAUL
0ba0: 54 20 30 2c 22 0a 09 09 09 20 22 70 61 73 73 5f  T 0,".... "pass_
0bb0: 63 6f 75 6e 74 20 49 4e 54 45 47 45 52 20 44 45  count INTEGER DE
0bc0: 46 41 55 4c 54 20 30 2c 22 0a 09 09 09 20 22 43  FAULT 0,".... "C
0bd0: 4f 4e 53 54 52 41 49 4e 54 20 72 75 6e 73 63 6f  ONSTRAINT runsco
0be0: 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20  nstraint UNIQUE 
0bf0: 28 72 75 6e 6e 61 6d 65 22 20 28 69 66 20 68 61  (runname" (if ha
0c00: 76 65 6b 65 79 73 20 22 2c 22 20 22 22 29 20 6b  vekeys "," "") k
0c10: 65 79 73 74 72 20 22 29 29 3b 22 29 29 0a 20 20  eystr "));")).  
0c20: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
0c30: 74 65 20 64 62 20 28 63 6f 6e 63 20 22 43 52 45  te db (conc "CRE
0c40: 41 54 45 20 49 4e 44 45 58 20 72 75 6e 73 5f 69  ATE INDEX runs_i
0c50: 6e 64 65 78 20 4f 4e 20 72 75 6e 73 20 28 72 75  ndex ON runs (ru
0c60: 6e 6e 61 6d 65 22 20 28 69 66 20 68 61 76 65 6b  nname" (if havek
0c70: 65 79 73 20 22 2c 22 20 22 22 29 20 6b 65 79 73  eys "," "") keys
0c80: 74 72 20 22 29 3b 22 29 29 0a 20 20 20 20 28 73  tr ");")).    (s
0c90: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64  qlite3:execute d
0ca0: 62 20 0a 09 09 20 20 20 20 20 22 43 52 45 41 54  b ...     "CREAT
0cb0: 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
0cc0: 58 49 53 54 53 20 74 65 73 74 73 20 0a 20 20 20  XISTS tests .   
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ce0: 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49   (id INTEGER PRI
0cf0: 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 20  MARY KEY,.      
0d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
0d10: 75 6e 5f 69 64 20 20 20 20 20 49 4e 54 45 47 45  un_id     INTEGE
0d20: 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  R,.             
0d30: 20 20 20 20 20 20 20 20 74 65 73 74 6e 61 6d 65          testname
0d40: 20 20 20 54 45 58 54 2c 0a 20 20 20 20 20 20 20     TEXT,.       
0d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68 6f                ho
0d60: 73 74 20 20 20 20 20 20 20 54 45 58 54 20 44 45  st       TEXT DE
0d70: 46 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20 20 20  FAULT 'n/a',.   
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d90: 20 20 63 70 75 6c 6f 61 64 20 20 20 20 52 45 41    cpuload    REA
0da0: 4c 20 44 45 46 41 55 4c 54 20 2d 31 2c 0a 20 20  L DEFAULT -1,.  
0db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0dc0: 20 20 20 64 69 73 6b 66 72 65 65 20 20 20 49 4e     diskfree   IN
0dd0: 54 45 47 45 52 20 44 45 46 41 55 4c 54 20 2d 31  TEGER DEFAULT -1
0de0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
0df0: 20 20 20 20 20 20 20 75 6e 61 6d 65 20 20 20 20         uname    
0e00: 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27    TEXT DEFAULT '
0e10: 6e 2f 61 27 2c 20 0a 20 20 20 20 20 20 20 20 20  n/a', .         
0e20: 20 20 20 20 20 20 20 20 20 20 20 20 72 75 6e 64              rund
0e30: 69 72 20 20 20 20 20 54 45 58 54 20 44 45 46 41  ir     TEXT DEFA
0e40: 55 4c 54 20 27 6e 2f 61 27 2c 0a 20 20 20 20 20  ULT 'n/a',.     
0e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e60: 73 68 6f 72 74 64 69 72 20 20 20 54 45 58 54 20  shortdir   TEXT 
0e70: 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20  DEFAULT '',.    
0e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e90: 20 69 74 65 6d 5f 70 61 74 68 20 20 54 45 58 54   item_path  TEXT
0ea0: 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20   DEFAULT '',.   
0eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ec0: 20 20 73 74 61 74 65 20 20 20 20 20 20 54 45 58    state      TEX
0ed0: 54 20 44 45 46 41 55 4c 54 20 27 4e 4f 54 5f 53  T DEFAULT 'NOT_S
0ee0: 54 41 52 54 45 44 27 2c 0a 20 20 20 20 20 20 20  TARTED',.       
0ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
0f00: 61 74 75 73 20 20 20 20 20 54 45 58 54 20 44 45  atus     TEXT DE
0f10: 46 41 55 4c 54 20 27 46 41 49 4c 27 2c 0a 20 20  FAULT 'FAIL',.  
0f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f30: 20 20 20 61 74 74 65 6d 70 74 6e 75 6d 20 49 4e     attemptnum IN
0f40: 54 45 47 45 52 20 44 45 46 41 55 4c 54 20 30 2c  TEGER DEFAULT 0,
0f50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0f60: 20 20 20 20 20 20 66 69 6e 61 6c 5f 6c 6f 67 66        final_logf
0f70: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 6c   TEXT DEFAULT 'l
0f80: 6f 67 73 2f 66 69 6e 61 6c 2e 6c 6f 67 27 2c 0a  ogs/final.log',.
0f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fa0: 20 20 20 20 20 6c 6f 67 64 61 74 20 20 20 20 20       logdat     
0fb0: 42 4c 4f 42 2c 20 0a 20 20 20 20 20 20 20 20 20  BLOB, .         
0fc0: 20 20 20 20 20 20 20 20 20 20 20 20 72 75 6e 5f              run_
0fd0: 64 75 72 61 74 69 6f 6e 20 49 4e 54 45 47 45 52  duration INTEGER
0fe0: 20 44 45 46 41 55 4c 54 20 30 2c 0a 20 20 20 20   DEFAULT 0,.    
0ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1000: 20 63 6f 6d 6d 65 6e 74 20 20 20 20 54 45 58 54   comment    TEXT
1010: 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20   DEFAULT '',.   
1020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1030: 20 20 65 76 65 6e 74 5f 74 69 6d 65 20 54 49 4d    event_time TIM
1040: 45 53 54 41 4d 50 2c 0a 20 20 20 20 20 20 20 20  ESTAMP,.        
1050: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 61 69               fai
1060: 6c 5f 63 6f 75 6e 74 20 49 4e 54 45 47 45 52 20  l_count INTEGER 
1070: 44 45 46 41 55 4c 54 20 30 2c 0a 20 20 20 20 20  DEFAULT 0,.     
1080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1090: 70 61 73 73 5f 63 6f 75 6e 74 20 49 4e 54 45 47  pass_count INTEG
10a0: 45 52 20 44 45 46 41 55 4c 54 20 30 2c 0a 20 20  ER DEFAULT 0,.  
10b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c0: 20 20 20 61 72 63 68 69 76 65 64 20 20 20 49 4e     archived   IN
10d0: 54 45 47 45 52 20 44 45 46 41 55 4c 54 20 30 2c  TEGER DEFAULT 0,
10e0: 20 2d 2d 20 30 3d 6e 6f 2c 20 31 3d 69 6e 20 70   -- 0=no, 1=in p
10f0: 72 6f 67 72 65 73 73 2c 20 32 3d 79 65 73 0a 20  rogress, 2=yes. 
1100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1110: 20 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 74      CONSTRAINT t
1120: 65 73 74 73 63 6f 6e 73 74 72 61 69 6e 74 20 55  estsconstraint U
1130: 4e 49 51 55 45 20 28 72 75 6e 5f 69 64 2c 20 74  NIQUE (run_id, t
1140: 65 73 74 6e 61 6d 65 2c 20 69 74 65 6d 5f 70 61  estname, item_pa
1150: 74 68 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b  th).          );
1160: 22 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a  ").    (sqlite3:
1170: 65 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41  execute db "CREA
1180: 54 45 20 49 4e 44 45 58 20 74 65 73 74 73 5f 69  TE INDEX tests_i
1190: 6e 64 65 78 20 4f 4e 20 74 65 73 74 73 20 28 72  ndex ON tests (r
11a0: 75 6e 5f 69 64 2c 20 74 65 73 74 6e 61 6d 65 29  un_id, testname)
11b0: 3b 22 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33  ;").    (sqlite3
11c0: 3a 65 78 65 63 75 74 65 20 64 62 20 22 43 52 45  :execute db "CRE
11d0: 41 54 45 20 56 49 45 57 20 72 75 6e 73 5f 74 65  ATE VIEW runs_te
11e0: 73 74 73 20 41 53 20 53 45 4c 45 43 54 20 2a 20  sts AS SELECT * 
11f0: 46 52 4f 4d 20 72 75 6e 73 20 49 4e 4e 45 52 20  FROM runs INNER 
1200: 4a 4f 49 4e 20 74 65 73 74 73 20 4f 4e 20 72 75  JOIN tests ON ru
1210: 6e 73 2e 69 64 3d 74 65 73 74 73 2e 72 75 6e 5f  ns.id=tests.run_
1220: 69 64 3b 22 29 0a 20 20 20 20 28 73 71 6c 69 74  id;").    (sqlit
1230: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 43  e3:execute db "C
1240: 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e  REATE TABLE IF N
1250: 4f 54 20 45 58 49 53 54 53 20 74 65 73 74 5f 73  OT EXISTS test_s
1260: 74 65 70 73 20 0a 20 20 20 20 20 20 20 20 20 20  teps .          
1270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1280: 20 20 20 20 28 69 64 20 49 4e 54 45 47 45 52 20      (id INTEGER 
1290: 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20  PRIMARY KEY,.   
12a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b0: 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
12c0: 5f 69 64 20 49 4e 54 45 47 45 52 2c 20 0a 20 20  _id INTEGER, .  
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 65               ste
12f0: 70 6e 61 6d 65 20 54 45 58 54 2c 20 0a 20 20 20  pname TEXT, .   
1300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1310: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74              stat
1320: 65 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27  e TEXT DEFAULT '
1330: 4e 4f 54 5f 53 54 41 52 54 45 44 27 2c 20 0a 20  NOT_STARTED', . 
1340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
1360: 61 74 75 73 20 54 45 58 54 20 44 45 46 41 55 4c  atus TEXT DEFAUL
1370: 54 20 27 6e 2f 61 27 2c 0a 20 20 20 20 20 20 20  T 'n/a',.       
1380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1390: 20 20 20 20 20 20 20 20 65 76 65 6e 74 5f 74 69          event_ti
13a0: 6d 65 20 54 49 4d 45 53 54 41 4d 50 2c 0a 20 20  me TIMESTAMP,.  
13b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d               com
13d0: 6d 65 6e 74 20 54 45 58 54 20 44 45 46 41 55 4c  ment TEXT DEFAUL
13e0: 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20  T '',.          
13f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1400: 20 20 20 20 20 6c 6f 67 66 69 6c 65 20 54 45 58       logfile TEX
1410: 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20  T DEFAULT '',.  
1420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1430: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e               CON
1440: 53 54 52 41 49 4e 54 20 74 65 73 74 5f 73 74 65  STRAINT test_ste
1450: 70 73 5f 63 6f 6e 73 74 72 61 69 6e 74 20 55 4e  ps_constraint UN
1460: 49 51 55 45 20 28 74 65 73 74 5f 69 64 2c 73 74  IQUE (test_id,st
1470: 65 70 6e 61 6d 65 2c 73 74 61 74 65 29 29 3b 22  epname,state));"
1480: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65  ).    (sqlite3:e
1490: 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 54  xecute db "CREAT
14a0: 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
14b0: 58 49 53 54 53 20 65 78 74 72 61 64 61 74 20 28  XISTS extradat (
14c0: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  id INTEGER PRIMA
14d0: 52 59 20 4b 45 59 2c 20 72 75 6e 5f 69 64 20 49  RY KEY, run_id I
14e0: 4e 54 45 47 45 52 2c 20 6b 65 79 20 54 45 58 54  NTEGER, key TEXT
14f0: 2c 20 76 61 6c 20 54 45 58 54 29 3b 22 29 0a 20  , val TEXT);"). 
1500: 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63     (sqlite3:exec
1510: 75 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54  ute db "CREATE T
1520: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
1530: 54 53 20 6d 65 74 61 64 61 74 20 28 69 64 20 49  TS metadat (id I
1540: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
1550: 45 59 2c 20 76 61 72 20 54 45 58 54 2c 20 76 61  EY, var TEXT, va
1560: 6c 20 54 45 58 54 2c 0a 20 20 20 20 20 20 20 20  l TEXT,.        
1570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1580: 20 20 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52            CONSTR
1590: 41 49 4e 54 20 6d 65 74 61 64 61 74 5f 63 6f 6e  AINT metadat_con
15a0: 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28  straint UNIQUE (
15b0: 76 61 72 29 29 3b 22 29 0a 20 20 20 20 28 73 71  var));").    (sq
15c0: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62  lite3:execute db
15d0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49   "CREATE TABLE I
15e0: 46 20 4e 4f 54 20 45 58 49 53 54 53 20 61 63 63  F NOT EXISTS acc
15f0: 65 73 73 5f 6c 6f 67 20 28 69 64 20 49 4e 54 45  ess_log (id INTE
1600: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
1610: 20 75 73 65 72 20 54 45 58 54 2c 20 61 63 63 65   user TEXT, acce
1620: 73 73 65 64 20 54 49 4d 45 53 54 41 4d 50 2c 20  ssed TIMESTAMP, 
1630: 61 72 67 73 20 54 45 58 54 29 3b 22 29 0a 20 20  args TEXT);").  
1640: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
1650: 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41  te db "CREATE TA
1660: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54  BLE IF NOT EXIST
1670: 53 20 74 65 73 74 5f 6d 65 74 61 20 28 69 64 20  S test_meta (id 
1680: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
1690: 4b 45 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20  KEY,.           
16a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b0: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 6e 61            testna
16c0: 6d 65 20 20 20 20 54 45 58 54 20 44 45 46 41 55  me    TEXT DEFAU
16d0: 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20  LT '',.         
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 20 20 20 20 20 20 20 20 61 75 74 68              auth
1700: 6f 72 20 20 20 20 20 20 54 45 58 54 20 44 45 46  or      TEXT DEF
1710: 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20  AULT '',.       
1720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 77                ow
1740: 6e 65 72 20 20 20 20 20 20 20 54 45 58 54 20 44  ner       TEXT D
1750: 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20  EFAULT '',.     
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1780: 64 65 73 63 72 69 70 74 69 6f 6e 20 54 45 58 54  description TEXT
1790: 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20   DEFAULT '',.   
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17c0: 20 20 72 65 76 69 65 77 65 64 20 20 20 20 54 49    reviewed    TI
17d0: 4d 45 53 54 41 4d 50 2c 0a 20 20 20 20 20 20 20  MESTAMP,.       
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74                it
1800: 65 72 61 74 65 64 20 20 20 20 54 45 58 54 20 44  erated    TEXT D
1810: 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20  EFAULT '',.     
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1840: 61 76 67 5f 72 75 6e 74 69 6d 65 20 52 45 41 4c  avg_runtime REAL
1850: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1870: 20 20 20 20 20 20 20 61 76 67 5f 64 69 73 6b 20         avg_disk 
1880: 20 20 20 52 45 41 4c 2c 0a 20 20 20 20 20 20 20     REAL,.       
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 61                ta
18b0: 67 73 20 20 20 20 20 20 20 20 54 45 58 54 20 44  gs        TEXT D
18c0: 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20  EFAULT '',.     
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f0: 6a 6f 62 67 72 6f 75 70 20 20 20 20 54 45 58 54  jobgroup    TEXT
1900: 20 44 45 46 41 55 4c 54 20 27 64 65 66 61 75 6c   DEFAULT 'defaul
1910: 74 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t',.            
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1930: 20 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 74      CONSTRAINT t
1940: 65 73 74 5f 6d 65 74 61 5f 63 6f 6e 73 74 72 61  est_meta_constra
1950: 69 6e 74 20 55 4e 49 51 55 45 20 28 74 65 73 74  int UNIQUE (test
1960: 6e 61 6d 65 29 29 3b 22 29 0a 20 20 20 20 28 73  name));").    (s
1970: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64  qlite3:execute d
1980: 62 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  b "CREATE TABLE 
1990: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 74 65  IF NOT EXISTS te
19a0: 73 74 5f 64 61 74 61 20 28 69 64 20 49 4e 54 45  st_data (id INTE
19b0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
19c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e0: 20 74 65 73 74 5f 69 64 20 49 4e 54 45 47 45 52   test_id INTEGER
19f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a10: 20 20 63 61 74 65 67 6f 72 79 20 54 45 58 54 20    category TEXT 
1a20: 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20  DEFAULT '',.    
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 20 20 20 76 61 72 69              vari
1a50: 61 62 6c 65 20 54 45 58 54 2c 0a 09 20 20 20 20  able TEXT,..    
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 76 61 6c 75 65 20 52 45 41 4c 2c 0a      value REAL,.
1a80: 09 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a90: 20 20 20 20 20 20 20 20 20 65 78 70 65 63 74 65           expecte
1aa0: 64 20 52 45 41 4c 2c 0a 09 20 20 20 20 20 20 20  d REAL,..       
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac0: 20 74 6f 6c 20 52 45 41 4c 2c 0a 20 20 20 20 20   tol REAL,.     
1ad0: 20 20 20 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 75 6e 69 74 73             units
1af0: 20 54 45 58 54 2c 0a 20 20 20 20 20 20 20 20 20   TEXT,.         
1b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b10: 20 20 20 20 20 20 20 63 6f 6d 6d 65 6e 74 20 54         comment T
1b20: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a  EXT DEFAULT '',.
1b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b50: 73 74 61 74 75 73 20 54 45 58 54 20 44 45 46 41  status TEXT DEFA
1b60: 55 4c 54 20 27 6e 2f 61 27 2c 0a 20 20 20 20 20  ULT 'n/a',.     
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b80: 20 20 20 20 20 20 20 20 20 20 20 74 79 70 65 20             type 
1b90: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c  TEXT DEFAULT '',
1ba0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43                 C
1bc0: 4f 4e 53 54 52 41 49 4e 54 20 74 65 73 74 5f 64  ONSTRAINT test_d
1bd0: 61 74 61 5f 63 6f 6e 73 74 72 61 69 6e 74 20 55  ata_constraint U
1be0: 4e 49 51 55 45 20 28 74 65 73 74 5f 69 64 2c 63  NIQUE (test_id,c
1bf0: 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62 6c 65  ategory,variable
1c00: 29 29 3b 22 29 0a 20 20 20 20 3b 3b 20 4d 75 73  ));").    ;; Mus
1c10: 74 20 64 6f 20 74 68 69 73 20 2a 61 66 74 65 72  t do this *after
1c20: 2a 20 72 75 6e 6e 69 6e 67 20 70 61 74 63 68 20  * running patch 
1c30: 64 62 20 21 21 20 4e 6f 20 6d 6f 72 65 2e 20 0a  db !! No more. .
1c40: 20 20 20 20 28 64 62 3a 73 65 74 2d 76 61 72 20      (db:set-var 
1c50: 64 62 20 22 4d 45 47 41 54 45 53 54 5f 56 45 52  db "MEGATEST_VER
1c60: 53 49 4f 4e 22 20 6d 65 67 61 74 65 73 74 2d 76  SION" megatest-v
1c70: 65 72 73 69 6f 6e 29 0a 20 20 20 20 29 29 0a 0a  ersion).    ))..
1c80: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
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 0a 3b 3b 20 54 4f 44 4f  ========.;; TODO
1cd0: 3a 0a 3b 3b 20 20 20 70 75 74 20 64 65 6c 74 61  :.;;   put delta
1ce0: 73 20 69 6e 74 6f 20 61 6e 20 61 73 73 6f 63 20  s into an assoc 
1cf0: 6c 69 73 74 20 77 69 74 68 20 76 65 72 73 69 6f  list with versio
1d00: 6e 20 6e 75 6d 62 65 72 73 0a 3b 3b 20 20 20 61  n numbers.;;   a
1d10: 70 70 6c 79 20 61 6c 6c 20 66 72 6f 6d 20 6c 61  pply all from la
1d20: 73 74 20 74 6f 20 63 75 72 72 65 6e 74 0a 3b 3b  st to current.;;
1d30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1d40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1d50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1d60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1d70: 3d 3d 3d 3d 3d 3d 0a 28 64 65 66 69 6e 65 20 28  ======.(define (
1d80: 70 61 74 63 68 2d 64 62 20 64 62 29 0a 20 20 28  patch-db db).  (
1d90: 68 61 6e 64 6c 65 2d 65 78 63 65 70 74 69 6f 6e  handle-exception
1da0: 73 0a 20 20 20 65 78 6e 0a 20 20 20 28 62 65 67  s.   exn.   (beg
1db0: 69 6e 0a 20 20 20 20 20 28 70 72 69 6e 74 20 22  in.     (print "
1dc0: 45 78 63 65 70 74 69 6f 6e 3a 20 22 20 65 78 6e  Exception: " exn
1dd0: 29 0a 20 20 20 20 20 28 70 72 69 6e 74 20 22 45  ).     (print "E
1de0: 52 52 4f 52 3a 20 50 6f 73 73 69 62 6c 65 20 6f  RROR: Possible o
1df0: 75 74 20 6f 66 20 64 61 74 65 20 73 63 68 65 6d  ut of date schem
1e00: 61 2c 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f  a, attempting to
1e10: 20 61 64 64 20 74 61 62 6c 65 20 6d 65 74 61 64   add table metad
1e20: 61 74 61 2e 2e 2e 22 29 0a 20 20 20 20 20 28 73  ata...").     (s
1e30: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64  qlite3:execute d
1e40: 62 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  b "CREATE TABLE 
1e50: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 6d 65  IF NOT EXISTS me
1e60: 74 61 64 61 74 20 28 69 64 20 49 4e 54 45 47 45  tadat (id INTEGE
1e70: 52 2c 20 76 61 72 20 54 45 58 54 2c 20 76 61 6c  R, var TEXT, val
1e80: 20 54 45 58 54 2c 0a 20 20 20 20 20 20 20 20 20   TEXT,.         
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea0: 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52 41 49          CONSTRAI
1eb0: 4e 54 20 6d 65 74 61 64 61 74 5f 63 6f 6e 73 74  NT metadat_const
1ec0: 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28 76 61  raint UNIQUE (va
1ed0: 72 29 29 3b 22 29 0a 20 20 20 20 20 28 69 66 20  r));").     (if 
1ee0: 28 6e 6f 74 20 28 64 62 3a 67 65 74 2d 76 61 72  (not (db:get-var
1ef0: 20 64 62 20 22 4d 45 47 41 54 45 53 54 5f 56 45   db "MEGATEST_VE
1f00: 52 53 49 4f 4e 22 29 29 0a 09 20 28 64 62 3a 73  RSION")).. (db:s
1f10: 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54  et-var db "MEGAT
1f20: 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e 31  EST_VERSION" 1.1
1f30: 37 29 29 29 0a 20 20 20 28 6c 65 74 20 28 28 6d  7))).   (let ((m
1f40: 76 65 72 20 28 64 62 3a 67 65 74 2d 76 61 72 20  ver (db:get-var 
1f50: 64 62 20 22 4d 45 47 41 54 45 53 54 5f 56 45 52  db "MEGATEST_VER
1f60: 53 49 4f 4e 22 29 29 0a 09 20 28 74 65 73 74 2d  SION")).. (test-
1f70: 6d 65 74 61 2d 64 65 66 20 22 43 52 45 41 54 45  meta-def "CREATE
1f80: 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58   TABLE IF NOT EX
1f90: 49 53 54 53 20 74 65 73 74 5f 6d 65 74 61 20 28  ISTS test_meta (
1fa0: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  id INTEGER PRIMA
1fb0: 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 20 20 20  RY KEY,.        
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
1fe0: 74 6e 61 6d 65 20 20 20 20 54 45 58 54 20 44 45  tname    TEXT DE
1ff0: 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20  FAULT '',.      
2000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
2020: 75 74 68 6f 72 20 20 20 20 20 20 54 45 58 54 20  uthor      TEXT 
2030: 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20  DEFAULT '',.    
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2060: 20 6f 77 6e 65 72 20 20 20 20 20 20 20 54 45 58   owner       TEX
2070: 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20  T DEFAULT '',.  
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a0: 20 20 20 64 65 73 63 72 69 70 74 69 6f 6e 20 54     description T
20b0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a  EXT DEFAULT '',.
20c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e0: 20 20 20 20 20 72 65 76 69 65 77 65 64 20 20 20       reviewed   
20f0: 20 54 49 4d 45 53 54 41 4d 50 2c 0a 20 20 20 20   TIMESTAMP,.    
2100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2120: 20 69 74 65 72 61 74 65 64 20 20 20 20 54 45 58   iterated    TEX
2130: 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20  T DEFAULT '',.  
2140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2160: 20 20 20 61 76 67 5f 72 75 6e 74 69 6d 65 20 52     avg_runtime R
2170: 45 41 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  EAL,.           
2180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2190: 20 20 20 20 20 20 20 20 20 20 61 76 67 5f 64 69            avg_di
21a0: 73 6b 20 20 20 20 52 45 41 4c 2c 0a 20 20 20 20  sk    REAL,.    
21b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d0: 20 74 61 67 73 20 20 20 20 20 20 20 20 54 45 58   tags        TEX
21e0: 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20  T DEFAULT '',.  
21f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 4f                CO
2210: 4e 53 54 52 41 49 4e 54 20 74 65 73 74 5f 6d 65  NSTRAINT test_me
2220: 74 61 5f 63 6f 6e 73 74 72 61 69 6e 74 20 55 4e  ta_constraint UN
2230: 49 51 55 45 20 28 74 65 73 74 6e 61 6d 65 29 29  IQUE (testname))
2240: 3b 22 29 29 0a 20 20 20 20 20 28 70 72 69 6e 74  ;")).     (print
2250: 20 22 43 75 72 72 65 6e 74 20 73 63 68 65 6d 61   "Current schema
2260: 20 76 65 72 73 69 6f 6e 3a 20 22 20 6d 76 65 72   version: " mver
2270: 20 22 20 63 75 72 72 65 6e 74 20 6d 65 67 61 74   " current megat
2280: 65 73 74 20 76 65 72 73 69 6f 6e 3a 20 22 20 6d  est version: " m
2290: 65 67 61 74 65 73 74 2d 76 65 72 73 69 6f 6e 29  egatest-version)
22a0: 0a 20 20 20 20 20 28 63 6f 6e 64 0a 20 20 20 20  .     (cond.    
22b0: 20 20 28 28 6e 6f 74 20 6d 76 65 72 29 0a 20 20    ((not mver).  
22c0: 20 20 20 20 20 28 70 72 69 6e 74 20 22 41 64 64       (print "Add
22d0: 69 6e 67 20 6d 65 67 61 74 65 73 74 2d 76 65 72  ing megatest-ver
22e0: 73 69 6f 6e 20 74 6f 20 6d 65 74 61 64 61 74 61  sion to metadata
22f0: 22 29 20 3b 3b 20 4e 65 65 64 20 74 6f 20 72 65  ") ;; Need to re
2300: 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65  create the table
2310: 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  .       (sqlite3
2320: 3a 65 78 65 63 75 74 65 20 64 62 20 22 44 52 4f  :execute db "DRO
2330: 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54  P TABLE IF EXIST
2340: 53 20 6d 65 74 61 64 61 74 3b 22 29 0a 20 20 20  S metadat;").   
2350: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65      (sqlite3:exe
2360: 63 75 74 65 20 64 62 20 22 43 52 45 41 54 45 20  cute db "CREATE 
2370: 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49  TABLE IF NOT EXI
2380: 53 54 53 20 6d 65 74 61 64 61 74 20 28 69 64 20  STS metadat (id 
2390: 49 4e 54 45 47 45 52 2c 20 76 61 72 20 54 45 58  INTEGER, var TEX
23a0: 54 2c 20 76 61 6c 20 54 45 58 54 2c 0a 20 20 20  T, val TEXT,.   
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43                 C
23d0: 4f 4e 53 54 52 41 49 4e 54 20 6d 65 74 61 64 61  ONSTRAINT metada
23e0: 74 5f 63 6f 6e 73 74 72 61 69 6e 74 20 55 4e 49  t_constraint UNI
23f0: 51 55 45 20 28 76 61 72 29 29 3b 22 29 0a 20 20  QUE (var));").  
2400: 20 20 20 20 20 28 64 62 3a 73 65 74 2d 76 61 72       (db:set-var
2410: 20 64 62 20 22 4d 45 47 41 54 45 53 54 5f 56 45   db "MEGATEST_VE
2420: 52 53 49 4f 4e 22 20 31 2e 31 37 29 0a 20 20 20  RSION" 1.17).   
2430: 20 20 20 20 28 70 61 74 63 68 2d 64 62 29 29 0a      (patch-db)).
2440: 20 20 20 20 20 20 28 28 3c 20 6d 76 65 72 20 31        ((< mver 1
2450: 2e 32 31 29 0a 20 20 20 20 20 20 20 28 73 71 6c  .21).       (sql
2460: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
2470: 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45  "DROP TABLE IF E
2480: 58 49 53 54 53 20 6d 65 74 61 64 61 74 3b 22 29  XISTS metadat;")
2490: 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  .       (sqlite3
24a0: 3a 65 78 65 63 75 74 65 20 64 62 20 22 43 52 45  :execute db "CRE
24b0: 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54  ATE TABLE IF NOT
24c0: 20 45 58 49 53 54 53 20 6d 65 74 61 64 61 74 20   EXISTS metadat 
24d0: 28 69 64 20 49 4e 54 45 47 45 52 2c 20 76 61 72  (id INTEGER, var
24e0: 20 54 45 58 54 2c 20 76 61 6c 20 54 45 58 54 2c   TEXT, val TEXT,
24f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2510: 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 6d 65     CONSTRAINT me
2520: 74 61 64 61 74 5f 63 6f 6e 73 74 72 61 69 6e 74  tadat_constraint
2530: 20 55 4e 49 51 55 45 20 28 76 61 72 29 29 3b 22   UNIQUE (var));"
2540: 29 0a 20 20 20 20 20 20 20 28 64 62 3a 73 65 74  ).       (db:set
2550: 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 53  -var db "MEGATES
2560: 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e 32 31 29  T_VERSION" 1.21)
2570: 20 3b 3b 20 73 65 74 20 62 65 66 6f 72 65 2c 20   ;; set before, 
2580: 6a 75 73 74 20 69 6e 20 63 61 73 65 20 74 68 65  just in case the
2590: 20 63 68 61 6e 67 65 73 20 61 72 65 20 61 6c 72   changes are alr
25a0: 65 61 64 79 20 61 70 70 6c 69 65 64 0a 20 20 20  eady applied.   
25b0: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65      (sqlite3:exe
25c0: 63 75 74 65 20 64 62 20 74 65 73 74 2d 6d 65 74  cute db test-met
25d0: 61 2d 64 65 66 29 0a 09 09 09 09 09 3b 28 66 6f  a-def)......;(fo
25e0: 72 2d 65 61 63 68 20 0a 09 09 09 09 09 3b 20 28  r-each ......; (
25f0: 6c 61 6d 62 64 61 20 28 73 74 6d 74 29 0a 09 09  lambda (stmt)...
2600: 09 09 09 3b 20 20 20 28 73 71 6c 69 74 65 33 3a  ...;   (sqlite3:
2610: 65 78 65 63 75 74 65 20 64 62 20 73 74 6d 74 29  execute db stmt)
2620: 29 0a 09 09 09 09 09 3b 20 28 6c 69 73 74 20 0a  )......; (list .
2630: 09 09 09 09 09 3b 20 20 22 41 4c 54 45 52 20 54  .....;  "ALTER T
2640: 41 42 4c 45 20 74 65 73 74 73 20 41 44 44 20 43  ABLE tests ADD C
2650: 4f 4c 55 4d 4e 20 66 69 72 73 74 5f 65 72 72 20  OLUMN first_err 
2660: 54 45 58 54 3b 22 0a 09 09 09 09 09 3b 20 20 22  TEXT;"......;  "
2670: 41 4c 54 45 52 20 54 41 42 4c 45 20 74 65 73 74  ALTER TABLE test
2680: 73 20 41 44 44 20 43 4f 4c 55 4d 4e 20 66 69 72  s ADD COLUMN fir
2690: 73 74 5f 77 61 72 6e 20 54 45 58 54 3b 22 0a 09  st_warn TEXT;"..
26a0: 09 09 09 09 3b 20 20 29 29 0a 20 20 20 20 20 20  ....;  )).      
26b0: 20 28 70 61 74 63 68 2d 64 62 29 29 0a 20 20 20   (patch-db)).   
26c0: 20 20 20 28 28 3c 20 6d 76 65 72 20 31 2e 32 34     ((< mver 1.24
26d0: 29 0a 20 20 20 20 20 20 20 28 64 62 3a 73 65 74  ).       (db:set
26e0: 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 53  -var db "MEGATES
26f0: 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e 32 34 29  T_VERSION" 1.24)
2700: 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  .       (sqlite3
2710: 3a 65 78 65 63 75 74 65 20 64 62 20 22 44 52 4f  :execute db "DRO
2720: 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54  P TABLE IF EXIST
2730: 53 20 74 65 73 74 5f 64 61 74 61 3b 22 29 0a 20  S test_data;"). 
2740: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65        (sqlite3:e
2750: 78 65 63 75 74 65 20 64 62 20 22 44 52 4f 50 20  xecute db "DROP 
2760: 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20  TABLE IF EXISTS 
2770: 74 65 73 74 5f 6d 65 74 61 3b 22 29 0a 20 20 20  test_meta;").   
2780: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65      (sqlite3:exe
2790: 63 75 74 65 20 64 62 20 74 65 73 74 2d 6d 65 74  cute db test-met
27a0: 61 2d 64 65 66 29 0a 20 20 20 20 20 20 20 28 73  a-def).       (s
27b0: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64  qlite3:execute d
27c0: 62 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  b "CREATE TABLE 
27d0: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 74 65  IF NOT EXISTS te
27e0: 73 74 5f 64 61 74 61 20 28 69 64 20 49 4e 54 45  st_data (id INTE
27f0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
2800: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2820: 20 74 65 73 74 5f 69 64 20 49 4e 54 45 47 45 52   test_id INTEGER
2830: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2850: 20 20 63 61 74 65 67 6f 72 79 20 54 45 58 54 20    category TEXT 
2860: 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20  DEFAULT '',.    
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2880: 20 20 20 20 20 20 20 20 20 20 20 20 76 61 72 69              vari
2890: 61 62 6c 65 20 54 45 58 54 2c 0a 09 20 20 20 20  able TEXT,..    
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b0: 20 20 20 20 76 61 6c 75 65 20 52 45 41 4c 2c 0a      value REAL,.
28c0: 09 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28d0: 20 20 20 20 20 20 20 20 20 65 78 70 65 63 74 65           expecte
28e0: 64 20 52 45 41 4c 2c 0a 09 20 20 20 20 20 20 20  d REAL,..       
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2900: 20 74 6f 6c 20 52 45 41 4c 2c 0a 20 20 20 20 20   tol REAL,.     
2910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2920: 20 20 20 20 20 20 20 20 20 20 20 75 6e 69 74 73             units
2930: 20 54 45 58 54 2c 0a 20 20 20 20 20 20 20 20 20   TEXT,.         
2940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2950: 20 20 20 20 20 20 20 63 6f 6d 6d 65 6e 74 20 54         comment T
2960: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a  EXT DEFAULT '',.
2970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2990: 73 74 61 74 75 73 20 54 45 58 54 20 44 45 46 41  status TEXT DEFA
29a0: 55 4c 54 20 27 6e 2f 61 27 2c 0a 20 20 20 20 20  ULT 'n/a',.     
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c0: 20 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52 41           CONSTRA
29d0: 49 4e 54 20 74 65 73 74 5f 64 61 74 61 20 55 4e  INT test_data UN
29e0: 49 51 55 45 20 28 74 65 73 74 5f 69 64 2c 63 61  IQUE (test_id,ca
29f0: 74 65 67 6f 72 79 2c 76 61 72 69 61 62 6c 65 29  tegory,variable)
2a00: 29 3b 22 29 0a 20 20 20 20 20 20 20 28 70 72 69  );").       (pri
2a10: 6e 74 20 22 57 41 52 4e 49 4e 47 3a 20 54 61 62  nt "WARNING: Tab
2a20: 6c 65 20 74 65 73 74 5f 64 61 74 61 20 61 6e 64  le test_data and
2a30: 20 74 65 73 74 5f 6d 65 74 61 20 77 68 65 72 65   test_meta where
2a40: 20 72 65 63 72 65 61 74 65 64 2e 20 50 6c 65 61   recreated. Plea
2a50: 73 65 20 64 6f 20 6d 65 67 61 74 65 73 74 20 2d  se do megatest -
2a60: 75 70 64 61 74 65 2d 6d 65 74 61 22 29 0a 20 20  update-meta").  
2a70: 20 20 20 20 20 28 70 61 74 63 68 2d 64 62 29 29       (patch-db))
2a80: 0a 20 20 20 20 20 20 28 28 3c 20 6d 76 65 72 20  .      ((< mver 
2a90: 31 2e 32 37 29 0a 20 20 20 20 20 20 20 28 64 62  1.27).       (db
2aa0: 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47  :set-var db "MEG
2ab0: 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 31  ATEST_VERSION" 1
2ac0: 2e 32 37 29 0a 20 20 20 20 20 20 20 28 73 71 6c  .27).       (sql
2ad0: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
2ae0: 22 41 4c 54 45 52 20 54 41 42 4c 45 20 74 65 73  "ALTER TABLE tes
2af0: 74 5f 64 61 74 61 20 41 44 44 20 43 4f 4c 55 4d  t_data ADD COLUM
2b00: 4e 20 74 79 70 65 20 54 45 58 54 20 44 45 46 41  N type TEXT DEFA
2b10: 55 4c 54 20 27 27 3b 22 29 0a 20 20 20 20 20 20  ULT '';").      
2b20: 20 28 70 61 74 63 68 2d 64 62 29 29 0a 20 20 20   (patch-db)).   
2b30: 20 20 20 28 28 3c 20 6d 76 65 72 20 31 2e 32 39     ((< mver 1.29
2b40: 29 0a 20 20 20 20 20 20 20 28 64 62 3a 73 65 74  ).       (db:set
2b50: 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 53  -var db "MEGATES
2b60: 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e 32 39 29  T_VERSION" 1.29)
2b70: 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  .       (sqlite3
2b80: 3a 65 78 65 63 75 74 65 20 64 62 20 22 41 4c 54  :execute db "ALT
2b90: 45 52 20 54 41 42 4c 45 20 74 65 73 74 5f 73 74  ER TABLE test_st
2ba0: 65 70 73 20 41 44 44 20 43 4f 4c 55 4d 4e 20 6c  eps ADD COLUMN l
2bb0: 6f 67 66 69 6c 65 20 54 45 58 54 20 44 45 46 41  ogfile TEXT DEFA
2bc0: 55 4c 54 20 27 27 3b 22 29 0a 20 20 20 20 20 20  ULT '';").      
2bd0: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
2be0: 65 20 64 62 20 22 41 4c 54 45 52 20 54 41 42 4c  e db "ALTER TABL
2bf0: 45 20 74 65 73 74 73 20 41 44 44 20 43 4f 4c 55  E tests ADD COLU
2c00: 4d 4e 20 73 68 6f 72 74 64 69 72 20 54 45 58 54  MN shortdir TEXT
2c10: 20 44 45 46 41 55 4c 54 20 27 27 3b 22 29 29 0a   DEFAULT '';")).
2c20: 20 20 20 20 20 20 28 28 3c 20 6d 76 65 72 20 31        ((< mver 1
2c30: 2e 33 36 29 0a 20 20 20 20 20 20 20 28 64 62 3a  .36).       (db:
2c40: 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41  set-var db "MEGA
2c50: 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e  TEST_VERSION" 1.
2c60: 33 36 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69  36).       (sqli
2c70: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22  te3:execute db "
2c80: 41 4c 54 45 52 20 54 41 42 4c 45 20 74 65 73 74  ALTER TABLE test
2c90: 5f 6d 65 74 61 20 41 44 44 20 43 4f 4c 55 4d 4e  _meta ADD COLUMN
2ca0: 20 6a 6f 62 67 72 6f 75 70 20 54 45 58 54 20 44   jobgroup TEXT D
2cb0: 45 46 41 55 4c 54 20 27 64 65 66 61 75 6c 74 27  EFAULT 'default'
2cc0: 3b 22 29 29 0a 20 20 20 20 20 20 28 28 3c 20 6d  ;")).      ((< m
2cd0: 76 65 72 20 31 2e 33 37 29 0a 20 20 20 20 20 20  ver 1.37).      
2ce0: 20 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20   (db:set-var db 
2cf0: 22 4d 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f  "MEGATEST_VERSIO
2d00: 4e 22 20 31 2e 33 37 29 0a 20 20 20 20 20 20 20  N" 1.37).       
2d10: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
2d20: 20 64 62 20 22 41 4c 54 45 52 20 54 41 42 4c 45   db "ALTER TABLE
2d30: 20 74 65 73 74 73 20 41 44 44 20 43 4f 4c 55 4d   tests ADD COLUM
2d40: 4e 20 61 72 63 68 69 76 65 64 20 49 4e 54 45 47  N archived INTEG
2d50: 45 52 20 44 45 46 41 55 4c 54 20 30 3b 22 29 29  ER DEFAULT 0;"))
2d60: 20 0a 20 20 20 20 20 20 28 28 3c 20 6d 76 65 72   .      ((< mver
2d70: 20 6d 65 67 61 74 65 73 74 2d 76 65 72 73 69 6f   megatest-versio
2d80: 6e 29 0a 20 20 20 20 20 20 20 28 64 62 3a 73 65  n).       (db:se
2d90: 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 45  t-var db "MEGATE
2da0: 53 54 5f 56 45 52 53 49 4f 4e 22 20 6d 65 67 61  ST_VERSION" mega
2db0: 74 65 73 74 2d 76 65 72 73 69 6f 6e 29 29 29 29  test-version))))
2dc0: 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ))..;;==========
2dd0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2de0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2df0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2e00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20  ============.;; 
2e10: 6d 65 74 61 20 67 65 74 20 61 6e 64 20 73 65 74  meta get and set
2e20: 20 76 61 72 73 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d   vars.;;========
2e30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2e40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2e50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2e60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a  ==============..
2e70: 3b 3b 20 72 65 74 75 72 6e 73 20 6e 75 6d 62 65  ;; returns numbe
2e80: 72 20 69 66 20 73 74 72 69 6e 67 2d 3e 6e 75 6d  r if string->num
2e90: 62 65 72 20 69 73 20 73 75 63 63 65 73 73 66 75  ber is successfu
2ea0: 6c 2c 20 73 74 72 69 6e 67 20 6f 74 68 65 72 77  l, string otherw
2eb0: 69 73 65 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  ise.(define (db:
2ec0: 67 65 74 2d 76 61 72 20 64 62 20 76 61 72 29 0a  get-var db var).
2ed0: 20 20 28 6c 65 74 20 28 28 72 65 73 20 23 66 29    (let ((res #f)
2ee0: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66  ).    (sqlite3:f
2ef0: 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 20  or-each-row.    
2f00: 20 28 6c 61 6d 62 64 61 20 28 76 61 6c 29 0a 20   (lambda (val). 
2f10: 20 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20        (set! res 
2f20: 76 61 6c 29 29 0a 20 20 20 20 20 64 62 20 22 53  val)).     db "S
2f30: 45 4c 45 43 54 20 76 61 6c 20 46 52 4f 4d 20 6d  ELECT val FROM m
2f40: 65 74 61 64 61 74 20 57 48 45 52 45 20 76 61 72  etadat WHERE var
2f50: 3d 3f 3b 22 20 76 61 72 29 0a 20 20 20 20 28 69  =?;" var).    (i
2f60: 66 20 28 73 74 72 69 6e 67 3f 20 72 65 73 29 0a  f (string? res).
2f70: 09 28 6c 65 74 20 28 28 76 61 6c 6e 75 6d 20 28  .(let ((valnum (
2f80: 73 74 72 69 6e 67 2d 3e 6e 75 6d 62 65 72 20 72  string->number r
2f90: 65 73 29 29 29 0a 09 20 20 28 69 66 20 76 61 6c  es)))..  (if val
2fa0: 6e 75 6d 20 76 61 6c 6e 75 6d 20 72 65 73 29 29  num valnum res))
2fb0: 0a 09 72 65 73 29 29 29 0a 0a 28 64 65 66 69 6e  ..res)))..(defin
2fc0: 65 20 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62  e (db:set-var db
2fd0: 20 76 61 72 20 76 61 6c 29 0a 20 20 28 73 71 6c   var val).  (sql
2fe0: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
2ff0: 22 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41  "INSERT OR REPLA
3000: 43 45 20 49 4e 54 4f 20 6d 65 74 61 64 61 74 20  CE INTO metadat 
3010: 28 76 61 72 2c 76 61 6c 29 20 56 41 4c 55 45 53  (var,val) VALUES
3020: 20 28 3f 2c 3f 29 3b 22 20 76 61 72 20 76 61 6c   (?,?);" var val
3030: 29 29 0a 0a 3b 3b 20 75 73 65 20 61 20 67 6c 6f  ))..;; use a glo
3040: 62 61 6c 20 66 6f 72 20 73 6f 6d 65 20 70 72 69  bal for some pri
3050: 6d 69 74 69 76 65 20 63 61 63 68 69 6e 67 2c 20  mitive caching, 
3060: 69 74 20 69 73 20 6a 75 73 74 20 73 69 6c 6c 79  it is just silly
3070: 20 74 6f 20 72 65 2d 72 65 61 64 20 74 68 65 20   to re-read the 
3080: 64 62 20 0a 3b 3b 20 6f 76 65 72 20 61 6e 64 20  db .;; over and 
3090: 6f 76 65 72 20 61 67 61 69 6e 20 66 6f 72 20 74  over again for t
30a0: 68 65 20 6b 65 79 73 20 73 69 6e 63 65 20 74 68  he keys since th
30b0: 65 79 20 6e 65 76 65 72 20 63 68 61 6e 67 65 0a  ey never change.
30c0: 0a 28 64 65 66 69 6e 65 20 2a 64 62 2d 6b 65 79  .(define *db-key
30d0: 73 2a 20 23 66 29 0a 0a 28 64 65 66 69 6e 65 20  s* #f)..(define 
30e0: 28 64 62 3a 67 65 74 2d 6b 65 79 73 20 64 62 29  (db:get-keys db)
30f0: 0a 20 20 28 69 66 20 2a 64 62 2d 6b 65 79 73 2a  .  (if *db-keys*
3100: 20 2a 64 62 2d 6b 65 79 73 2a 20 0a 20 20 20 20   *db-keys* .    
3110: 20 20 28 6c 65 74 20 28 28 72 65 73 20 27 28 29    (let ((res '()
3120: 29 29 0a 09 28 73 71 6c 69 74 65 33 3a 66 6f 72  ))..(sqlite3:for
3130: 2d 65 61 63 68 2d 72 6f 77 20 0a 09 20 28 6c 61  -each-row .. (la
3140: 6d 62 64 61 20 28 6b 65 79 20 6b 65 79 74 79 70  mbda (key keytyp
3150: 65 29 0a 09 20 20 20 28 73 65 74 21 20 72 65 73  e)..   (set! res
3160: 20 28 63 6f 6e 73 20 28 76 65 63 74 6f 72 20 6b   (cons (vector k
3170: 65 79 20 6b 65 79 74 79 70 65 29 20 72 65 73 29  ey keytype) res)
3180: 29 29 0a 09 20 64 62 0a 09 20 22 53 45 4c 45 43  )).. db.. "SELEC
3190: 54 20 66 69 65 6c 64 6e 61 6d 65 2c 66 69 65 6c  T fieldname,fiel
31a0: 64 74 79 70 65 20 46 52 4f 4d 20 6b 65 79 73 20  dtype FROM keys 
31b0: 4f 52 44 45 52 20 42 59 20 69 64 20 44 45 53 43  ORDER BY id DESC
31c0: 3b 22 29 0a 09 28 73 65 74 21 20 2a 64 62 2d 6b  ;")..(set! *db-k
31d0: 65 79 73 2a 20 72 65 73 29 0a 09 72 65 73 29 29  eys* res)..res))
31e0: 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67  )..(define (db:g
31f0: 65 74 2d 76 61 6c 75 65 2d 62 79 2d 68 65 61 64  et-value-by-head
3200: 65 72 20 72 6f 77 20 68 65 61 64 65 72 20 66 69  er row header fi
3210: 65 6c 64 29 0a 20 20 3b 3b 20 28 64 65 62 75 67  eld).  ;; (debug
3220: 3a 70 72 69 6e 74 20 32 20 22 64 62 3a 67 65 74  :print 2 "db:get
3230: 2d 76 61 6c 75 65 2d 62 79 2d 68 65 61 64 65 72  -value-by-header
3240: 20 72 6f 77 3a 20 22 20 72 6f 77 20 22 20 68 65   row: " row " he
3250: 61 64 65 72 3a 20 22 20 68 65 61 64 65 72 20 22  ader: " header "
3260: 20 66 69 65 6c 64 3a 20 22 20 66 69 65 6c 64 29   field: " field)
3270: 0a 20 20 28 69 66 20 28 6e 75 6c 6c 3f 20 68 65  .  (if (null? he
3280: 61 64 65 72 29 20 23 66 0a 20 20 20 20 20 20 28  ader) #f.      (
3290: 6c 65 74 20 6c 6f 6f 70 20 28 28 68 65 64 20 28  let loop ((hed (
32a0: 63 61 72 20 68 65 61 64 65 72 29 29 0a 09 09 20  car header))... 
32b0: 28 74 61 6c 20 28 63 64 72 20 68 65 61 64 65 72  (tal (cdr header
32c0: 29 29 0a 09 09 20 28 6e 20 20 20 30 29 29 0a 09  ))... (n   0))..
32d0: 28 69 66 20 28 65 71 75 61 6c 3f 20 68 65 64 20  (if (equal? hed 
32e0: 66 69 65 6c 64 29 0a 09 20 20 20 20 28 76 65 63  field)..    (vec
32f0: 74 6f 72 2d 72 65 66 20 72 6f 77 20 6e 29 0a 09  tor-ref row n)..
3300: 20 20 20 20 28 69 66 20 28 6e 75 6c 6c 3f 20 74      (if (null? t
3310: 61 6c 29 20 23 66 20 28 6c 6f 6f 70 20 28 63 61  al) #f (loop (ca
3320: 72 20 74 61 6c 29 28 63 64 72 20 74 61 6c 29 28  r tal)(cdr tal)(
3330: 2b 20 6e 20 31 29 29 29 29 29 29 29 0a 0a 3b 3b  + n 1)))))))..;;
3340: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3350: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3360: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3370: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3380: 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 20 52 20 55 20 4e  ======.;;  R U N
3390: 20 53 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d   S.;;===========
33a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
33b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
33c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
33d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65  ===========..(de
33e0: 66 69 6e 65 20 28 72 75 6e 73 3a 67 65 74 2d 73  fine (runs:get-s
33f0: 74 64 2d 72 75 6e 2d 66 69 65 6c 64 73 20 6b 65  td-run-fields ke
3400: 79 73 20 72 65 6d 66 69 65 6c 64 73 29 0a 20 20  ys remfields).  
3410: 28 6c 65 74 2a 20 28 28 68 65 61 64 65 72 20 20  (let* ((header  
3420: 20 20 28 61 70 70 65 6e 64 20 28 6d 61 70 20 6b    (append (map k
3430: 65 79 3a 67 65 74 2d 66 69 65 6c 64 6e 61 6d 65  ey:get-fieldname
3440: 20 6b 65 79 73 29 0a 09 09 09 20 20 20 20 72 65   keys)....    re
3450: 6d 66 69 65 6c 64 73 29 29 0a 09 20 28 6b 65 79  mfields)).. (key
3460: 73 74 72 20 20 20 20 28 63 6f 6e 63 20 28 6b 65  str    (conc (ke
3470: 79 73 2d 3e 6b 65 79 73 74 72 20 6b 65 79 73 29  ys->keystr keys)
3480: 20 22 2c 22 0a 09 09 09 20 20 28 73 74 72 69 6e   ","....  (strin
3490: 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 72 65  g-intersperse re
34a0: 6d 66 69 65 6c 64 73 20 22 2c 22 29 29 29 29 0a  mfields ",")))).
34b0: 20 20 20 20 28 6c 69 73 74 20 6b 65 79 73 74 72      (list keystr
34c0: 20 68 65 61 64 65 72 29 29 29 0a 0a 3b 3b 20 57   header)))..;; W
34d0: 41 53 20 64 62 2d 67 65 74 2d 72 75 6e 73 20 46  AS db-get-runs F
34e0: 49 58 4d 45 20 49 4e 20 52 45 4d 41 49 4e 49 4e  IXME IN REMAININ
34f0: 47 20 43 4f 44 45 0a 3b 3b 0a 3b 3b 20 4d 45 52  G CODE.;;.;; MER
3500: 47 45 20 54 48 49 53 20 57 49 54 48 20 64 62 3a  GE THIS WITH db:
3510: 67 65 74 2d 72 75 6e 73 2c 20 61 63 63 69 64 65  get-runs, accide
3520: 6e 74 6c 79 20 77 72 6f 74 65 20 69 74 20 74 77  ntly wrote it tw
3530: 69 63 65 0a 3b 3b 0a 3b 3b 20 72 65 70 6c 61 63  ice.;;.;; replac
3540: 65 20 68 65 61 64 65 72 20 61 6e 64 20 6b 65 79  e header and key
3550: 73 74 72 20 77 69 74 68 20 61 20 63 61 6c 6c 20  str with a call 
3560: 74 6f 20 72 75 6e 73 3a 67 65 74 2d 73 74 64 2d  to runs:get-std-
3570: 72 75 6e 2d 66 69 65 6c 64 73 0a 3b 3b 0a 3b 3b  run-fields.;;.;;
3580: 20 6b 65 79 70 61 74 74 73 3a 20 28 20 28 4b 45   keypatts: ( (KE
3590: 59 31 20 22 61 62 63 25 64 65 66 22 29 28 4b 45  Y1 "abc%def")(KE
35a0: 59 32 20 22 25 22 29 20 29 0a 3b 3b 0a 28 64 65  Y2 "%") ).;;.(de
35b0: 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 72 75 6e  fine (db:get-run
35c0: 73 20 64 62 20 72 75 6e 70 61 74 74 20 63 6f 75  s db runpatt cou
35d0: 6e 74 20 6f 66 66 73 65 74 20 6b 65 79 70 61 74  nt offset keypat
35e0: 74 73 29 0a 20 20 28 6c 65 74 2a 20 28 28 72 65  ts).  (let* ((re
35f0: 73 20 20 20 20 20 20 27 28 29 29 0a 09 20 28 6b  s      '()).. (k
3600: 65 79 73 20 20 20 20 20 20 28 64 62 3a 67 65 74  eys      (db:get
3610: 2d 6b 65 79 73 20 64 62 29 29 0a 09 20 28 72 65  -keys db)).. (re
3620: 6d 66 69 65 6c 64 73 20 28 6c 69 73 74 20 22 69  mfields (list "i
3630: 64 22 20 22 72 75 6e 6e 61 6d 65 22 20 22 73 74  d" "runname" "st
3640: 61 74 65 22 20 22 73 74 61 74 75 73 22 20 22 6f  ate" "status" "o
3650: 77 6e 65 72 22 20 22 65 76 65 6e 74 5f 74 69 6d  wner" "event_tim
3660: 65 22 29 29 0a 09 20 28 68 65 61 64 65 72 20 20  e")).. (header  
3670: 20 20 28 61 70 70 65 6e 64 20 28 6d 61 70 20 6b    (append (map k
3680: 65 79 3a 67 65 74 2d 66 69 65 6c 64 6e 61 6d 65  ey:get-fieldname
3690: 20 6b 65 79 73 29 0a 09 09 09 20 20 20 20 72 65   keys)....    re
36a0: 6d 66 69 65 6c 64 73 29 29 0a 09 20 28 6b 65 79  mfields)).. (key
36b0: 73 74 72 20 20 20 20 28 63 6f 6e 63 20 28 6b 65  str    (conc (ke
36c0: 79 73 2d 3e 6b 65 79 73 74 72 20 6b 65 79 73 29  ys->keystr keys)
36d0: 20 22 2c 22 0a 09 09 09 20 20 28 73 74 72 69 6e   ","....  (strin
36e0: 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 72 65  g-intersperse re
36f0: 6d 66 69 65 6c 64 73 20 22 2c 22 29 29 29 0a 09  mfields ",")))..
3700: 20 28 71 72 79 73 74 72 20 20 20 20 28 63 6f 6e   (qrystr    (con
3710: 63 20 22 53 45 4c 45 43 54 20 22 20 6b 65 79 73  c "SELECT " keys
3720: 74 72 20 22 20 46 52 4f 4d 20 72 75 6e 73 20 57  tr " FROM runs W
3730: 48 45 52 45 20 72 75 6e 6e 61 6d 65 20 4c 49 4b  HERE runname LIK
3740: 45 20 3f 20 22 0a 09 09 09 20 20 3b 3b 20 47 65  E ? "....  ;; Ge
3750: 6e 65 72 61 74 65 3a 20 22 20 41 4e 44 20 78 20  nerate: " AND x 
3760: 4c 49 4b 45 20 27 6b 65 79 70 61 74 74 27 20 2e  LIKE 'keypatt' .
3770: 2e 2e 22 0a 09 09 09 20 20 28 69 66 20 28 6e 75  .."....  (if (nu
3780: 6c 6c 3f 20 6b 65 79 70 61 74 74 73 29 20 22 22  ll? keypatts) ""
3790: 0a 09 09 09 20 20 20 20 20 20 28 63 6f 6e 63 20  ....      (conc 
37a0: 22 20 41 4e 44 20 22 0a 09 09 09 09 20 20 20 20  " AND ".....    
37b0: 28 73 74 72 69 6e 67 2d 6a 6f 69 6e 20 0a 09 09  (string-join ...
37c0: 09 09 20 20 20 20 20 28 6d 61 70 20 28 6c 61 6d  ..     (map (lam
37d0: 62 64 61 20 28 6b 65 79 70 61 74 74 29 0a 09 09  bda (keypatt)...
37e0: 09 09 09 20 20 20 20 28 6c 65 74 20 28 28 6b 65  ...    (let ((ke
37f0: 79 20 20 28 63 61 72 20 6b 65 79 70 61 74 74 29  y  (car keypatt)
3800: 29 0a 09 09 09 09 09 09 20 20 28 70 61 74 74 20  ).......  (patt 
3810: 28 63 61 64 72 20 6b 65 79 70 61 74 74 29 29 29  (cadr keypatt)))
3820: 0a 09 09 09 09 09 20 20 20 20 20 20 28 63 6f 6e  ......      (con
3830: 63 20 6b 65 79 20 22 20 4c 49 4b 45 20 27 22 20  c key " LIKE '" 
3840: 70 61 74 74 20 22 27 22 29 29 29 0a 09 09 09 09  patt "'"))).....
3850: 09 20 20 6b 65 79 70 61 74 74 73 29 0a 09 09 09  .  keypatts)....
3860: 09 20 20 20 20 20 22 20 41 4e 44 20 22 29 29 29  .     " AND ")))
3870: 0a 09 09 09 20 20 22 20 4f 52 44 45 52 20 42 59  ....  " ORDER BY
3880: 20 65 76 65 6e 74 5f 74 69 6d 65 20 44 45 53 43   event_time DESC
3890: 20 22 0a 09 09 09 20 20 28 69 66 20 28 6e 75 6d   "....  (if (num
38a0: 62 65 72 3f 20 63 6f 75 6e 74 29 0a 09 09 09 20  ber? count).... 
38b0: 20 20 20 20 20 28 63 6f 6e 63 20 22 20 4c 49 4d       (conc " LIM
38c0: 49 54 20 22 20 63 6f 75 6e 74 29 0a 09 09 09 20  IT " count).... 
38d0: 20 20 20 20 20 22 22 29 0a 09 09 09 20 20 28 69       "")....  (i
38e0: 66 20 28 6e 75 6d 62 65 72 3f 20 6f 66 66 73 65  f (number? offse
38f0: 74 29 0a 09 09 09 20 20 20 20 20 20 28 63 6f 6e  t)....      (con
3900: 63 20 22 20 4f 46 46 53 45 54 20 22 20 6f 66 66  c " OFFSET " off
3910: 73 65 74 29 0a 09 09 09 20 20 20 20 20 20 22 22  set)....      ""
3920: 29 29 29 29 0a 20 20 20 20 28 64 65 62 75 67 3a  )))).    (debug:
3930: 70 72 69 6e 74 20 38 20 22 49 4e 46 4f 3a 20 64  print 8 "INFO: d
3940: 62 3a 67 65 74 2d 72 75 6e 73 20 71 72 79 73 74  b:get-runs qryst
3950: 72 3a 20 22 20 71 72 79 73 74 72 20 22 5c 6e 6b  r: " qrystr "\nk
3960: 65 79 70 61 74 74 73 3a 20 22 20 6b 65 79 70 61  eypatts: " keypa
3970: 74 74 73 20 22 5c 6e 20 20 6f 66 66 73 65 74 3a  tts "\n  offset:
3980: 20 22 20 6f 66 66 73 65 74 20 22 20 6c 69 6d 69   " offset " limi
3990: 74 3a 20 22 20 63 6f 75 6e 74 29 0a 20 20 20 20  t: " count).    
39a0: 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63  (sqlite3:for-eac
39b0: 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62  h-row.     (lamb
39c0: 64 61 20 28 61 20 2e 20 78 29 0a 20 20 20 20 20  da (a . x).     
39d0: 20 20 28 73 65 74 21 20 72 65 73 20 28 63 6f 6e    (set! res (con
39e0: 73 20 28 61 70 70 6c 79 20 76 65 63 74 6f 72 20  s (apply vector 
39f0: 61 20 78 29 20 72 65 73 29 29 29 0a 20 20 20 20  a x) res))).    
3a00: 20 64 62 0a 20 20 20 20 20 71 72 79 73 74 72 0a   db.     qrystr.
3a10: 20 20 20 20 20 72 75 6e 70 61 74 74 29 0a 20 20       runpatt).  
3a20: 20 20 28 76 65 63 74 6f 72 20 68 65 61 64 65 72    (vector header
3a30: 20 72 65 73 29 29 29 0a 0a 3b 3b 20 6a 75 73 74   res)))..;; just
3a40: 20 67 65 74 20 63 6f 75 6e 74 20 6f 66 20 72 75   get count of ru
3a50: 6e 73 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67  ns.(define (db:g
3a60: 65 74 2d 6e 75 6d 2d 72 75 6e 73 20 64 62 20 72  et-num-runs db r
3a70: 75 6e 70 61 74 74 29 0a 20 20 28 6c 65 74 20 28  unpatt).  (let (
3a80: 28 6e 75 6d 72 75 6e 73 20 30 29 29 0a 20 20 20  (numruns 0)).   
3a90: 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61   (sqlite3:for-ea
3aa0: 63 68 2d 72 6f 77 20 0a 20 20 20 20 20 28 6c 61  ch-row .     (la
3ab0: 6d 62 64 61 20 28 63 6f 75 6e 74 29 0a 20 20 20  mbda (count).   
3ac0: 20 20 20 20 28 73 65 74 21 20 6e 75 6d 72 75 6e      (set! numrun
3ad0: 73 20 63 6f 75 6e 74 29 29 0a 20 20 20 20 20 64  s count)).     d
3ae0: 62 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20 43  b.     "SELECT C
3af0: 4f 55 4e 54 28 69 64 29 20 46 52 4f 4d 20 72 75  OUNT(id) FROM ru
3b00: 6e 73 20 57 48 45 52 45 20 72 75 6e 6e 61 6d 65  ns WHERE runname
3b10: 20 4c 49 4b 45 20 3f 3b 22 20 72 75 6e 70 61 74   LIKE ?;" runpat
3b20: 74 29 0a 20 20 20 20 6e 75 6d 72 75 6e 73 29 29  t).    numruns))
3b30: 0a 0a 3b 3b 20 75 73 65 20 28 67 65 74 2d 76 61  ..;; use (get-va
3b40: 6c 75 65 2d 62 79 2d 68 65 61 64 65 72 20 28 64  lue-by-header (d
3b50: 62 3a 67 65 74 2d 68 65 61 64 65 72 20 72 75 6e  b:get-header run
3b60: 69 6e 66 6f 29 28 64 62 3a 67 65 74 2d 72 6f 77  info)(db:get-row
3b70: 20 72 75 6e 69 6e 66 6f 29 29 0a 28 64 65 66 69   runinfo)).(defi
3b80: 6e 65 20 28 64 62 3a 67 65 74 2d 72 75 6e 2d 69  ne (db:get-run-i
3b90: 6e 66 6f 20 64 62 20 72 75 6e 2d 69 64 29 0a 20  nfo db run-id). 
3ba0: 20 28 6c 65 74 2a 20 28 28 72 65 73 20 20 20 20   (let* ((res    
3bb0: 20 20 23 66 29 0a 09 20 28 6b 65 79 73 20 20 20    #f).. (keys   
3bc0: 20 20 20 28 64 62 3a 67 65 74 2d 6b 65 79 73 20     (db:get-keys 
3bd0: 64 62 29 29 0a 09 20 28 72 65 6d 66 69 65 6c 64  db)).. (remfield
3be0: 73 20 28 6c 69 73 74 20 22 69 64 22 20 22 72 75  s (list "id" "ru
3bf0: 6e 6e 61 6d 65 22 20 22 73 74 61 74 65 22 20 22  nname" "state" "
3c00: 73 74 61 74 75 73 22 20 22 6f 77 6e 65 72 22 20  status" "owner" 
3c10: 22 65 76 65 6e 74 5f 74 69 6d 65 22 29 29 0a 09  "event_time"))..
3c20: 20 28 68 65 61 64 65 72 20 20 20 20 28 61 70 70   (header    (app
3c30: 65 6e 64 20 28 6d 61 70 20 6b 65 79 3a 67 65 74  end (map key:get
3c40: 2d 66 69 65 6c 64 6e 61 6d 65 20 6b 65 79 73 29  -fieldname keys)
3c50: 0a 09 09 09 20 20 20 20 72 65 6d 66 69 65 6c 64  ....    remfield
3c60: 73 29 29 0a 09 20 28 6b 65 79 73 74 72 20 20 20  s)).. (keystr   
3c70: 20 28 63 6f 6e 63 20 28 6b 65 79 73 2d 3e 6b 65   (conc (keys->ke
3c80: 79 73 74 72 20 6b 65 79 73 29 20 22 2c 22 0a 09  ystr keys) ","..
3c90: 09 09 20 20 28 73 74 72 69 6e 67 2d 69 6e 74 65  ..  (string-inte
3ca0: 72 73 70 65 72 73 65 20 72 65 6d 66 69 65 6c 64  rsperse remfield
3cb0: 73 20 22 2c 22 29 29 29 29 0a 20 20 20 20 3b 3b  s ",")))).    ;;
3cc0: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 30 20   (debug:print 0 
3cd0: 22 64 62 3a 67 65 74 2d 72 75 6e 2d 69 6e 66 6f  "db:get-run-info
3ce0: 20 72 75 6e 2d 69 64 3a 20 22 20 72 75 6e 2d 69   run-id: " run-i
3cf0: 64 20 22 20 68 65 61 64 65 72 3a 20 22 20 68 65  d " header: " he
3d00: 61 64 65 72 20 22 20 6b 65 79 73 74 72 3a 20 22  ader " keystr: "
3d10: 20 6b 65 79 73 74 72 29 0a 20 20 20 20 28 73 71   keystr).    (sq
3d20: 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72  lite3:for-each-r
3d30: 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20  ow.     (lambda 
3d40: 28 61 20 2e 20 78 29 0a 20 20 20 20 20 20 20 28  (a . x).       (
3d50: 73 65 74 21 20 72 65 73 20 28 61 70 70 6c 79 20  set! res (apply 
3d60: 76 65 63 74 6f 72 20 61 20 78 29 29 29 0a 20 20  vector a x))).  
3d70: 20 20 20 64 62 0a 20 20 20 20 20 28 63 6f 6e 63     db.     (conc
3d80: 20 22 53 45 4c 45 43 54 20 22 20 6b 65 79 73 74   "SELECT " keyst
3d90: 72 20 22 20 46 52 4f 4d 20 72 75 6e 73 20 57 48  r " FROM runs WH
3da0: 45 52 45 20 69 64 3d 3f 3b 22 29 0a 20 20 20 20  ERE id=?;").    
3db0: 20 72 75 6e 2d 69 64 29 0a 20 20 20 20 28 76 65   run-id).    (ve
3dc0: 63 74 6f 72 20 68 65 61 64 65 72 20 72 65 73 29  ctor header res)
3dd0: 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  ))..(define (db:
3de0: 73 65 74 2d 63 6f 6d 6d 65 6e 74 2d 66 6f 72 2d  set-comment-for-
3df0: 72 75 6e 20 64 62 20 72 75 6e 2d 69 64 20 63 6f  run db run-id co
3e00: 6d 6d 65 6e 74 29 0a 20 20 28 73 71 6c 69 74 65  mment).  (sqlite
3e10: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 55 50  3:execute db "UP
3e20: 44 41 54 45 20 72 75 6e 73 20 53 45 54 20 63 6f  DATE runs SET co
3e30: 6d 6d 65 6e 74 3d 3f 20 57 48 45 52 45 20 69 64  mment=? WHERE id
3e40: 3d 3f 3b 22 20 63 6f 6d 6d 65 6e 74 20 72 75 6e  =?;" comment run
3e50: 2d 69 64 29 29 0a 0a 3b 3b 20 64 6f 65 73 20 6e  -id))..;; does n
3e60: 6f 74 20 28 6f 62 76 69 6f 75 73 6c 79 21 29 20  ot (obviously!) 
3e70: 72 65 6d 6f 76 65 64 20 64 65 70 65 6e 64 65 6e  removed dependen
3e80: 74 20 64 61 74 61 2e 20 0a 28 64 65 66 69 6e 65  t data. .(define
3e90: 20 28 64 62 3a 64 65 6c 65 74 65 2d 72 75 6e 20   (db:delete-run 
3ea0: 64 62 20 72 75 6e 2d 69 64 29 0a 20 20 28 73 71  db run-id).  (sq
3eb0: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62  lite3:execute db
3ec0: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 72 75   "DELETE FROM ru
3ed0: 6e 73 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20  ns WHERE id=?;" 
3ee0: 72 75 6e 2d 69 64 29 29 0a 0a 28 64 65 66 69 6e  run-id))..(defin
3ef0: 65 20 28 64 62 3a 75 70 64 61 74 65 2d 72 75 6e  e (db:update-run
3f00: 2d 65 76 65 6e 74 5f 74 69 6d 65 20 64 62 20 72  -event_time db r
3f10: 75 6e 2d 69 64 29 0a 20 20 28 73 71 6c 69 74 65  un-id).  (sqlite
3f20: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 55 50  3:execute db "UP
3f30: 44 41 54 45 20 72 75 6e 73 20 53 45 54 20 65 76  DATE runs SET ev
3f40: 65 6e 74 5f 74 69 6d 65 3d 73 74 72 66 74 69 6d  ent_time=strftim
3f50: 65 28 27 25 73 27 2c 27 6e 6f 77 27 29 20 57 48  e('%s','now') WH
3f60: 45 52 45 20 69 64 3d 3f 3b 22 20 72 75 6e 2d 69  ERE id=?;" run-i
3f70: 64 29 29 20 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d  d)) ..;;========
3f80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3f90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3fa0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3fb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b  ==============.;
3fc0: 3b 20 4b 20 45 20 59 20 53 0a 3b 3b 3d 3d 3d 3d  ; K E Y S.;;====
3fd0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3fe0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3ff0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4000: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4010: 3d 3d 0a 0a 3b 3b 20 67 65 74 20 6b 65 79 20 76  ==..;; get key v
4020: 61 6c 20 70 61 69 72 73 20 66 6f 72 20 61 20 67  al pairs for a g
4030: 69 76 65 6e 20 72 75 6e 2d 69 64 0a 3b 3b 20 28  iven run-id.;; (
4040: 20 28 46 49 45 4c 44 4e 41 4d 45 31 20 6b 65 79   (FIELDNAME1 key
4050: 76 61 6c 31 29 20 28 46 49 45 4c 44 4e 41 4d 45  val1) (FIELDNAME
4060: 32 20 6b 65 79 76 61 6c 32 29 20 2e 2e 2e 20 29  2 keyval2) ... )
4070: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74  .(define (db:get
4080: 2d 6b 65 79 2d 76 61 6c 2d 70 61 69 72 73 20 64  -key-val-pairs d
4090: 62 20 72 75 6e 2d 69 64 29 0a 20 20 28 6c 65 74  b run-id).  (let
40a0: 2a 20 28 28 6b 65 79 73 20 28 67 65 74 2d 6b 65  * ((keys (get-ke
40b0: 79 73 20 64 62 29 29 0a 09 20 28 72 65 73 20 20  ys db)).. (res  
40c0: 27 28 29 29 29 0a 20 20 20 20 28 64 65 62 75 67  '())).    (debug
40d0: 3a 70 72 69 6e 74 20 36 20 22 6b 65 79 73 3a 20  :print 6 "keys: 
40e0: 22 20 6b 65 79 73 20 22 20 72 75 6e 2d 69 64 3a  " keys " run-id:
40f0: 20 22 20 72 75 6e 2d 69 64 29 0a 20 20 20 20 28   " run-id).    (
4100: 66 6f 72 2d 65 61 63 68 20 0a 20 20 20 20 20 28  for-each .     (
4110: 6c 61 6d 62 64 61 20 28 6b 65 79 29 0a 20 20 20  lambda (key).   
4120: 20 20 20 20 28 6c 65 74 20 28 28 71 72 79 20 28      (let ((qry (
4130: 63 6f 6e 63 20 22 53 45 4c 45 43 54 20 22 20 28  conc "SELECT " (
4140: 6b 65 79 3a 67 65 74 2d 66 69 65 6c 64 6e 61 6d  key:get-fieldnam
4150: 65 20 6b 65 79 29 20 22 20 46 52 4f 4d 20 72 75  e key) " FROM ru
4160: 6e 73 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 29  ns WHERE id=?;")
4170: 29 29 0a 09 20 3b 3b 20 28 64 65 62 75 67 3a 70  )).. ;; (debug:p
4180: 72 69 6e 74 20 30 20 22 71 72 79 3a 20 22 20 71  rint 0 "qry: " q
4190: 72 79 29 0a 09 20 28 73 71 6c 69 74 65 33 3a 66  ry).. (sqlite3:f
41a0: 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 09 20 20  or-each-row ..  
41b0: 28 6c 61 6d 62 64 61 20 28 6b 65 79 2d 76 61 6c  (lambda (key-val
41c0: 29 0a 09 20 20 20 20 28 73 65 74 21 20 72 65 73  )..    (set! res
41d0: 20 28 63 6f 6e 73 20 28 6c 69 73 74 20 28 6b 65   (cons (list (ke
41e0: 79 3a 67 65 74 2d 66 69 65 6c 64 6e 61 6d 65 20  y:get-fieldname 
41f0: 6b 65 79 29 20 6b 65 79 2d 76 61 6c 29 20 72 65  key) key-val) re
4200: 73 29 29 29 0a 09 20 20 64 62 20 71 72 79 20 72  s)))..  db qry r
4210: 75 6e 2d 69 64 29 29 29 0a 20 20 20 20 20 6b 65  un-id))).     ke
4220: 79 73 29 0a 20 20 20 20 28 72 65 76 65 72 73 65  ys).    (reverse
4230: 20 72 65 73 29 29 29 0a 0a 3b 3b 20 67 65 74 20   res)))..;; get 
4240: 6b 65 79 20 76 61 6c 73 20 66 6f 72 20 61 20 67  key vals for a g
4250: 69 76 65 6e 20 72 75 6e 2d 69 64 0a 28 64 65 66  iven run-id.(def
4260: 69 6e 65 20 28 64 62 3a 67 65 74 2d 6b 65 79 2d  ine (db:get-key-
4270: 76 61 6c 73 20 64 62 20 72 75 6e 2d 69 64 29 0a  vals db run-id).
4280: 20 20 28 6c 65 74 2a 20 28 28 6b 65 79 73 20 28    (let* ((keys (
4290: 67 65 74 2d 6b 65 79 73 20 64 62 29 29 0a 09 20  get-keys db)).. 
42a0: 28 72 65 73 20 20 27 28 29 29 29 0a 20 20 20 20  (res  '())).    
42b0: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 36 20 22  (debug:print 6 "
42c0: 6b 65 79 73 3a 20 22 20 6b 65 79 73 20 22 20 72  keys: " keys " r
42d0: 75 6e 2d 69 64 3a 20 22 20 72 75 6e 2d 69 64 29  un-id: " run-id)
42e0: 0a 20 20 20 20 28 66 6f 72 2d 65 61 63 68 20 0a  .    (for-each .
42f0: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 6b 65       (lambda (ke
4300: 79 29 0a 20 20 20 20 20 20 20 28 6c 65 74 20 28  y).       (let (
4310: 28 71 72 79 20 28 63 6f 6e 63 20 22 53 45 4c 45  (qry (conc "SELE
4320: 43 54 20 22 20 28 6b 65 79 3a 67 65 74 2d 66 69  CT " (key:get-fi
4330: 65 6c 64 6e 61 6d 65 20 6b 65 79 29 20 22 20 46  eldname key) " F
4340: 52 4f 4d 20 72 75 6e 73 20 57 48 45 52 45 20 69  ROM runs WHERE i
4350: 64 3d 3f 3b 22 29 29 29 0a 09 20 3b 3b 20 28 64  d=?;"))).. ;; (d
4360: 65 62 75 67 3a 70 72 69 6e 74 20 30 20 22 71 72  ebug:print 0 "qr
4370: 79 3a 20 22 20 71 72 79 29 0a 09 20 28 73 71 6c  y: " qry).. (sql
4380: 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f  ite3:for-each-ro
4390: 77 20 0a 09 20 20 28 6c 61 6d 62 64 61 20 28 6b  w ..  (lambda (k
43a0: 65 79 2d 76 61 6c 29 0a 09 20 20 20 20 28 73 65  ey-val)..    (se
43b0: 74 21 20 72 65 73 20 28 63 6f 6e 73 20 6b 65 79  t! res (cons key
43c0: 2d 76 61 6c 20 72 65 73 29 29 29 0a 09 20 20 64  -val res)))..  d
43d0: 62 20 71 72 79 20 72 75 6e 2d 69 64 29 29 29 0a  b qry run-id))).
43e0: 20 20 20 20 20 6b 65 79 73 29 0a 20 20 20 20 28       keys).    (
43f0: 72 65 76 65 72 73 65 20 72 65 73 29 29 29 0a 0a  reverse res)))..
4400: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
4410: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4420: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4430: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4440: 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 20 54 20 45  ========.;;  T E
4450: 20 53 20 54 20 53 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d   S T S.;;=======
4460: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4470: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4480: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4490: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a  ===============.
44a0: 0a 3b 3b 20 73 74 61 74 65 73 20 61 6e 64 20 73  .;; states and s
44b0: 74 61 74 75 73 65 73 20 61 72 65 20 6c 69 73 74  tatuses are list
44c0: 73 2c 20 74 75 72 6e 20 74 68 65 6d 20 69 6e 74  s, turn them int
44d0: 6f 20 28 22 50 41 53 53 22 2c 22 46 41 49 4c 22  o ("PASS","FAIL"
44e0: 2e 2e 2e 29 20 61 6e 64 20 75 73 65 20 4e 4f 54  ...) and use NOT
44f0: 20 49 4e 0a 3b 3b 20 69 2e 65 2e 20 74 68 65 73   IN.;; i.e. thes
4500: 65 20 6c 69 73 74 73 20 64 65 66 69 6e 65 20 77  e lists define w
4510: 68 61 74 20 74 6f 20 4e 4f 54 20 73 68 6f 77 2e  hat to NOT show.
4520: 0a 3b 3b 20 73 74 61 74 65 73 20 61 6e 64 20 73  .;; states and s
4530: 74 61 74 75 73 65 73 20 61 72 65 20 72 65 71 75  tatuses are requ
4540: 69 72 65 64 20 74 6f 20 62 65 20 6c 69 73 74 73  ired to be lists
4550: 2c 20 65 6d 70 74 79 20 69 73 20 6f 6b 0a 28 64  , empty is ok.(d
4560: 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 74 65  efine (db:get-te
4570: 73 74 73 2d 66 6f 72 2d 72 75 6e 20 64 62 20 72  sts-for-run db r
4580: 75 6e 2d 69 64 20 74 65 73 74 70 61 74 74 20 69  un-id testpatt i
4590: 74 65 6d 70 61 74 74 20 73 74 61 74 65 73 20 73  tempatt states s
45a0: 74 61 74 75 73 65 73 29 0a 20 20 28 6c 65 74 2a  tatuses).  (let*
45b0: 20 28 28 72 65 73 20 27 28 29 29 0a 09 20 28 73   ((res '()).. (s
45c0: 74 61 74 65 73 2d 73 74 72 20 20 20 20 28 63 6f  tates-str    (co
45d0: 6e 63 20 22 28 27 22 20 28 73 74 72 69 6e 67 2d  nc "('" (string-
45e0: 69 6e 74 65 72 73 70 65 72 73 65 20 73 74 61 74  intersperse stat
45f0: 65 73 20 20 20 22 27 2c 27 22 29 20 22 27 29 22  es   "','") "')"
4600: 29 29 0a 09 20 28 73 74 61 74 75 73 65 73 2d 73  )).. (statuses-s
4610: 74 72 20 20 28 63 6f 6e 63 20 22 28 27 22 20 28  tr  (conc "('" (
4620: 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72  string-intersper
4630: 73 65 20 73 74 61 74 75 73 65 73 20 22 27 2c 27  se statuses "','
4640: 22 29 20 22 27 29 22 29 29 0a 09 20 28 71 72 79  ") "')")).. (qry
4650: 20 20 20 20 20 20 28 63 6f 6e 63 20 22 53 45 4c        (conc "SEL
4660: 45 43 54 20 69 64 2c 72 75 6e 5f 69 64 2c 74 65  ECT id,run_id,te
4670: 73 74 6e 61 6d 65 2c 73 74 61 74 65 2c 73 74 61  stname,state,sta
4680: 74 75 73 2c 65 76 65 6e 74 5f 74 69 6d 65 2c 68  tus,event_time,h
4690: 6f 73 74 2c 63 70 75 6c 6f 61 64 2c 64 69 73 6b  ost,cpuload,disk
46a0: 66 72 65 65 2c 75 6e 61 6d 65 2c 72 75 6e 64 69  free,uname,rundi
46b0: 72 2c 69 74 65 6d 5f 70 61 74 68 2c 72 75 6e 5f  r,item_path,run_
46c0: 64 75 72 61 74 69 6f 6e 2c 66 69 6e 61 6c 5f 6c  duration,final_l
46d0: 6f 67 66 2c 63 6f 6d 6d 65 6e 74 20 22 0a 09 09  ogf,comment "...
46e0: 09 20 22 20 46 52 4f 4d 20 74 65 73 74 73 20 57  . " FROM tests W
46f0: 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e  HERE run_id=? AN
4700: 44 20 74 65 73 74 6e 61 6d 65 20 6c 69 6b 65 20  D testname like 
4710: 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 20  ? AND item_path 
4720: 4c 49 4b 45 20 3f 20 22 20 0a 09 09 09 20 22 20  LIKE ? " .... " 
4730: 41 4e 44 20 4e 4f 54 20 28 73 74 61 74 65 20 69  AND NOT (state i
4740: 6e 20 22 20 73 74 61 74 65 73 2d 73 74 72 20 22  n " states-str "
4750: 20 41 4e 44 20 73 74 61 74 75 73 20 49 4e 20 22   AND status IN "
4760: 20 73 74 61 74 75 73 65 73 2d 73 74 72 20 22 29   statuses-str ")
4770: 20 22 0a 09 09 09 20 3b 3b 20 22 20 4f 52 44 45   ".... ;; " ORDE
4780: 52 20 42 59 20 69 64 20 44 45 53 43 3b 22 0a 09  R BY id DESC;"..
4790: 09 09 20 22 20 4f 52 44 45 52 20 42 59 20 65 76  .. " ORDER BY ev
47a0: 65 6e 74 5f 74 69 6d 65 20 41 53 43 3b 22 20 3b  ent_time ASC;" ;
47b0: 3b 20 50 4f 54 45 4e 54 49 41 4c 20 49 53 53 55  ; POTENTIAL ISSU
47c0: 45 21 20 43 48 45 43 4b 20 4d 45 21 20 44 6f 65  E! CHECK ME! Doe
47d0: 73 20 61 6e 79 74 69 6e 67 20 64 65 70 65 6e 64  s anyting depend
47e0: 20 6f 6e 20 74 68 69 73 20 62 65 69 6e 67 20 73   on this being s
47f0: 6f 72 74 65 64 20 62 79 20 69 64 3f 0a 09 09 09  orted by id?....
4800: 20 29 29 29 0a 20 20 20 20 28 64 65 62 75 67 3a   ))).    (debug:
4810: 70 72 69 6e 74 20 38 20 22 49 4e 46 4f 3a 20 64  print 8 "INFO: d
4820: 62 3a 67 65 74 2d 74 65 73 74 73 2d 66 6f 72 2d  b:get-tests-for-
4830: 72 75 6e 20 71 72 79 3d 22 20 71 72 79 29 0a 20  run qry=" qry). 
4840: 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d     (sqlite3:for-
4850: 65 61 63 68 2d 72 6f 77 20 0a 20 20 20 20 20 28  each-row .     (
4860: 6c 61 6d 62 64 61 20 28 61 20 2e 20 62 29 20 3b  lambda (a . b) ;
4870: 3b 20 69 64 20 72 75 6e 2d 69 64 20 74 65 73 74  ; id run-id test
4880: 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61 74 75  name state statu
4890: 73 20 65 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73  s event-time hos
48a0: 74 20 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72  t cpuload diskfr
48b0: 65 65 20 75 6e 61 6d 65 20 72 75 6e 64 69 72 20  ee uname rundir 
48c0: 69 74 65 6d 2d 70 61 74 68 20 72 75 6e 2d 64 75  item-path run-du
48d0: 72 61 74 69 6f 6e 20 66 69 6e 61 6c 2d 6c 6f 67  ration final-log
48e0: 66 20 63 6f 6d 6d 65 6e 74 29 0a 20 20 20 20 20  f comment).     
48f0: 20 20 28 73 65 74 21 20 72 65 73 20 28 63 6f 6e    (set! res (con
4900: 73 20 28 61 70 70 6c 79 20 76 65 63 74 6f 72 20  s (apply vector 
4910: 61 20 62 29 20 72 65 73 29 29 29 20 3b 3b 20 69  a b) res))) ;; i
4920: 64 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d  d run-id testnam
4930: 65 20 73 74 61 74 65 20 73 74 61 74 75 73 20 65  e state status e
4940: 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73 74 20 63  vent-time host c
4950: 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20  puload diskfree 
4960: 75 6e 61 6d 65 20 72 75 6e 64 69 72 20 69 74 65  uname rundir ite
4970: 6d 2d 70 61 74 68 20 72 75 6e 2d 64 75 72 61 74  m-path run-durat
4980: 69 6f 6e 20 66 69 6e 61 6c 2d 6c 6f 67 66 20 63  ion final-logf c
4990: 6f 6d 6d 65 6e 74 29 20 72 65 73 29 29 29 0a 20  omment) res))). 
49a0: 20 20 20 20 64 62 20 0a 20 20 20 20 20 71 72 79      db .     qry
49b0: 0a 20 20 20 20 20 72 75 6e 2d 69 64 0a 20 20 20  .     run-id.   
49c0: 20 20 28 69 66 20 74 65 73 74 70 61 74 74 20 74    (if testpatt t
49d0: 65 73 74 70 61 74 74 20 22 25 22 29 0a 20 20 20  estpatt "%").   
49e0: 20 20 28 69 66 20 69 74 65 6d 70 61 74 74 20 69    (if itempatt i
49f0: 74 65 6d 70 61 74 74 20 22 25 22 29 29 0a 20 20  tempatt "%")).  
4a00: 20 20 72 65 73 29 29 0a 0a 3b 3b 20 74 68 69 73    res))..;; this
4a10: 20 6f 6e 65 20 69 73 20 61 20 62 69 74 20 62 72   one is a bit br
4a20: 6f 6b 65 6e 20 42 55 47 20 46 49 58 4d 45 0a 28  oken BUG FIXME.(
4a30: 64 65 66 69 6e 65 20 28 64 62 3a 64 65 6c 65 74  define (db:delet
4a40: 65 2d 74 65 73 74 2d 73 74 65 70 2d 72 65 63 6f  e-test-step-reco
4a50: 72 64 73 20 64 62 20 72 75 6e 2d 69 64 20 74 65  rds db run-id te
4a60: 73 74 2d 6e 61 6d 65 20 69 74 65 6d 64 61 74 29  st-name itemdat)
4a70: 0a 20 20 3b 3b 20 42 72 65 61 6b 69 6e 67 20 69  .  ;; Breaking i
4a80: 74 20 69 6e 74 6f 20 74 77 6f 20 71 75 65 72 69  t into two queri
4a90: 65 73 20 66 6f 72 20 62 65 74 74 65 72 20 66 69  es for better fi
4aa0: 6c 65 20 61 63 63 65 73 73 20 69 6e 74 65 72 6c  le access interl
4ab0: 65 61 76 69 6e 67 0a 20 20 28 6c 65 74 20 28 28  eaving.  (let ((
4ac0: 69 64 73 20 27 28 29 29 29 0a 20 20 20 20 28 73  ids '())).    (s
4ad0: 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d  qlite3:for-each-
4ae0: 72 6f 77 20 28 6c 61 6d 62 64 61 20 28 69 64 29  row (lambda (id)
4af0: 0a 09 09 09 20 20 20 20 28 73 65 74 21 20 69 64  ....    (set! id
4b00: 73 20 28 63 6f 6e 73 20 69 64 20 69 64 73 29 29  s (cons id ids))
4b10: 29 0a 09 09 09 20 20 64 62 0a 09 09 09 20 20 22  )....  db....  "
4b20: 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 74  SELECT id FROM t
4b30: 65 73 74 73 20 57 48 45 52 45 20 72 75 6e 5f 69  ests WHERE run_i
4b40: 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65  d=? AND testname
4b50: 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68  =? AND item_path
4b60: 3d 3f 3b 22 0a 09 09 09 20 20 72 75 6e 2d 69 64  =?;"....  run-id
4b70: 20 74 65 73 74 2d 6e 61 6d 65 20 28 69 74 65 6d   test-name (item
4b80: 2d 6c 69 73 74 2d 3e 70 61 74 68 20 69 74 65 6d  -list->path item
4b90: 64 61 74 29 29 0a 20 20 20 20 28 66 6f 72 2d 65  dat)).    (for-e
4ba0: 61 63 68 20 28 6c 61 6d 62 64 61 20 28 69 64 29  ach (lambda (id)
4bb0: 0a 09 09 28 73 71 6c 69 74 65 33 3a 65 78 65 63  ...(sqlite3:exec
4bc0: 75 74 65 20 64 62 20 22 44 45 4c 45 54 45 20 46  ute db "DELETE F
4bd0: 52 4f 4d 20 74 65 73 74 5f 73 74 65 70 73 20 57  ROM test_steps W
4be0: 48 45 52 45 20 74 65 73 74 5f 69 64 3d 3f 3b 22  HERE test_id=?;"
4bf0: 20 69 64 29 0a 09 09 28 74 68 72 65 61 64 2d 73   id)...(thread-s
4c00: 6c 65 65 70 21 20 30 2e 31 29 29 20 3b 3b 20 67  leep! 0.1)) ;; g
4c10: 69 76 65 20 6f 74 68 65 72 73 20 61 63 63 65 73  ive others acces
4c20: 73 20 74 6f 20 74 68 65 20 64 62 0a 09 20 20 20  s to the db..   
4c30: 20 20 20 69 64 73 29 29 29 0a 3b 3b 22 44 45 4c     ids))).;;"DEL
4c40: 45 54 45 20 46 52 4f 4d 20 74 65 73 74 5f 73 74  ETE FROM test_st
4c50: 65 70 73 20 57 48 45 52 45 20 74 65 73 74 5f 69  eps WHERE test_i
4c60: 64 20 69 6e 20 28 53 45 4c 45 43 54 20 69 64 20  d in (SELECT id 
4c70: 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45  FROM tests WHERE
4c80: 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65   run_id=? AND te
4c90: 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65  stname=? AND ite
4ca0: 6d 5f 70 61 74 68 3d 3f 29 3b 22 20 0a 09 09 20  m_path=?);" ... 
4cb0: 20 20 0a 3b 3b 20 0a 28 64 65 66 69 6e 65 20 28    .;; .(define (
4cc0: 64 62 3a 64 65 6c 65 74 65 2d 74 65 73 74 2d 72  db:delete-test-r
4cd0: 65 63 6f 72 64 73 20 64 62 20 74 65 73 74 2d 69  ecords db test-i
4ce0: 64 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78  d).  (sqlite3:ex
4cf0: 65 63 75 74 65 20 64 62 20 22 44 45 4c 45 54 45  ecute db "DELETE
4d00: 20 46 52 4f 4d 20 74 65 73 74 5f 73 74 65 70 73   FROM test_steps
4d10: 20 57 48 45 52 45 20 74 65 73 74 5f 69 64 3d 3f   WHERE test_id=?
4d20: 3b 22 20 74 65 73 74 2d 69 64 29 0a 20 20 28 73  ;" test-id).  (s
4d30: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64  qlite3:execute d
4d40: 62 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74  b "DELETE FROM t
4d50: 65 73 74 5f 64 61 74 61 20 20 57 48 45 52 45 20  est_data  WHERE 
4d60: 74 65 73 74 5f 69 64 3d 3f 3b 22 20 74 65 73 74  test_id=?;" test
4d70: 2d 69 64 29 0a 20 20 28 73 71 6c 69 74 65 33 3a  -id).  (sqlite3:
4d80: 65 78 65 63 75 74 65 20 64 62 20 22 44 45 4c 45  execute db "DELE
4d90: 54 45 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48  TE FROM tests WH
4da0: 45 52 45 20 69 64 3d 3f 3b 22 20 74 65 73 74 2d  ERE id=?;" test-
4db0: 69 64 29 29 0a 0a 3b 3b 20 73 65 74 20 74 65 73  id))..;; set tes
4dc0: 74 73 20 77 69 74 68 20 73 74 61 74 65 20 63 75  ts with state cu
4dd0: 72 72 73 74 61 74 65 20 61 6e 64 20 73 74 61 74  rrstate and stat
4de0: 75 73 20 63 75 72 72 73 74 61 74 75 73 20 74 6f  us currstatus to
4df0: 20 6e 65 77 73 74 61 74 65 20 61 6e 64 20 6e 65   newstate and ne
4e00: 77 73 74 61 74 75 73 0a 3b 3b 20 75 73 65 20 63  wstatus.;; use c
4e10: 75 72 72 73 74 61 74 65 20 3d 20 23 66 20 61 6e  urrstate = #f an
4e20: 64 20 6f 72 20 63 75 72 72 73 74 61 74 75 73 20  d or currstatus 
4e30: 3d 20 23 66 20 74 6f 20 61 70 70 6c 79 20 74 6f  = #f to apply to
4e40: 20 61 6e 79 20 73 74 61 74 65 20 6f 72 20 73 74   any state or st
4e50: 61 74 75 73 20 72 65 73 70 65 63 74 69 76 65 6c  atus respectivel
4e60: 79 0a 3b 3b 20 57 41 52 4e 49 4e 47 3a 20 53 51  y.;; WARNING: SQ
4e70: 4c 20 69 6e 6a 65 63 74 69 6f 6e 20 72 69 73 6b  L injection risk
4e80: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 73 65 74  .(define (db:set
4e90: 2d 74 65 73 74 73 2d 73 74 61 74 65 2d 73 74 61  -tests-state-sta
4ea0: 74 75 73 20 64 62 20 72 75 6e 2d 69 64 20 74 65  tus db run-id te
4eb0: 73 74 6e 61 6d 65 73 20 63 75 72 72 73 74 61 74  stnames currstat
4ec0: 65 20 63 75 72 72 73 74 61 74 75 73 20 6e 65 77  e currstatus new
4ed0: 73 74 61 74 65 20 6e 65 77 73 74 61 74 75 73 29  state newstatus)
4ee0: 0a 20 20 28 66 6f 72 2d 65 61 63 68 20 28 6c 61  .  (for-each (la
4ef0: 6d 62 64 61 20 28 74 65 73 74 6e 61 6d 65 29 0a  mbda (testname).
4f00: 09 20 20 20 20 20 20 28 6c 65 74 20 28 28 71 72  .      (let ((qr
4f10: 79 20 28 63 6f 6e 63 20 22 55 50 44 41 54 45 20  y (conc "UPDATE 
4f20: 74 65 73 74 73 20 53 45 54 20 73 74 61 74 65 3d  tests SET state=
4f30: 3f 2c 73 74 61 74 75 73 3d 3f 20 57 48 45 52 45  ?,status=? WHERE
4f40: 20 22 0a 09 09 09 20 20 20 20 20 20 20 28 69 66   "....       (if
4f50: 20 63 75 72 72 73 74 61 74 65 20 20 28 63 6f 6e   currstate  (con
4f60: 63 20 22 73 74 61 74 65 3d 27 22 20 63 75 72 72  c "state='" curr
4f70: 73 74 61 74 65 20 22 27 20 41 4e 44 20 22 29 20  state "' AND ") 
4f80: 22 22 29 0a 09 09 09 20 20 20 20 20 20 20 28 69  "")....       (i
4f90: 66 20 63 75 72 72 73 74 61 74 75 73 20 28 63 6f  f currstatus (co
4fa0: 6e 63 20 22 73 74 61 74 75 73 3d 27 22 20 63 75  nc "status='" cu
4fb0: 72 72 73 74 61 74 75 73 20 22 27 20 41 4e 44 20  rrstatus "' AND 
4fc0: 22 29 20 22 22 29 0a 09 09 09 20 20 20 20 20 20  ") "")....      
4fd0: 20 22 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20   " run_id=? AND 
4fe0: 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 4e  testname=? AND N
4ff0: 4f 54 20 28 69 74 65 6d 5f 70 61 74 68 3d 27 27  OT (item_path=''
5000: 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 20 69 6e   AND testname in
5010: 20 28 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43   (SELECT DISTINC
5020: 54 20 74 65 73 74 6e 61 6d 65 20 46 52 4f 4d 20  T testname FROM 
5030: 74 65 73 74 73 20 57 48 45 52 45 20 74 65 73 74  tests WHERE test
5040: 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f  name=? AND item_
5050: 70 61 74 68 20 21 3d 20 27 27 29 29 3b 22 29 29  path != ''));"))
5060: 29 0a 09 09 3b 3b 28 64 65 62 75 67 3a 70 72 69  )...;;(debug:pri
5070: 6e 74 20 30 20 22 51 52 59 3a 20 22 20 71 72 79  nt 0 "QRY: " qry
5080: 29 0a 09 09 28 73 71 6c 69 74 65 33 3a 65 78 65  )...(sqlite3:exe
5090: 63 75 74 65 20 64 62 20 71 72 79 20 72 75 6e 2d  cute db qry run-
50a0: 69 64 20 6e 65 77 73 74 61 74 65 20 6e 65 77 73  id newstate news
50b0: 74 61 74 75 73 20 74 65 73 74 6e 61 6d 65 20 74  tatus testname t
50c0: 65 73 74 6e 61 6d 65 29 29 29 0a 09 20 20 20 20  estname)))..    
50d0: 74 65 73 74 6e 61 6d 65 73 29 29 0a 0a 28 64 65  testnames))..(de
50e0: 66 69 6e 65 20 28 64 62 3a 64 65 6c 65 74 65 2d  fine (db:delete-
50f0: 74 65 73 74 73 2d 69 6e 2d 73 74 61 74 65 20 64  tests-in-state d
5100: 62 20 72 75 6e 2d 69 64 20 73 74 61 74 65 29 0a  b run-id state).
5110: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
5120: 74 65 20 64 62 20 22 44 45 4c 45 54 45 20 46 52  te db "DELETE FR
5130: 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 73  OM tests WHERE s
5140: 74 61 74 65 3d 3f 20 41 4e 44 20 72 75 6e 5f 69  tate=? AND run_i
5150: 64 3d 3f 3b 22 20 73 74 61 74 65 20 72 75 6e 2d  d=?;" state run-
5160: 69 64 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64  id))..(define (d
5170: 62 3a 74 65 73 74 2d 73 65 74 2d 73 74 61 74 65  b:test-set-state
5180: 2d 73 74 61 74 75 73 2d 62 79 2d 69 64 20 64 62  -status-by-id db
5190: 20 74 65 73 74 2d 69 64 20 6e 65 77 73 74 61 74   test-id newstat
51a0: 65 20 6e 65 77 73 74 61 74 75 73 20 6e 65 77 63  e newstatus newc
51b0: 6f 6d 6d 65 6e 74 29 0a 20 20 28 69 66 20 6e 65  omment).  (if ne
51c0: 77 73 74 61 74 65 20 20 20 28 73 71 6c 69 74 65  wstate   (sqlite
51d0: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 55 50  3:execute db "UP
51e0: 44 41 54 45 20 74 65 73 74 73 20 53 45 54 20 73  DATE tests SET s
51f0: 74 61 74 65 3d 3f 20 20 20 57 48 45 52 45 20 69  tate=?   WHERE i
5200: 64 3d 3f 3b 22 20 6e 65 77 73 74 61 74 65 20 20  d=?;" newstate  
5210: 20 74 65 73 74 2d 69 64 29 29 0a 20 20 28 69 66   test-id)).  (if
5220: 20 6e 65 77 73 74 61 74 75 73 20 20 28 73 71 6c   newstatus  (sql
5230: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
5240: 22 55 50 44 41 54 45 20 74 65 73 74 73 20 53 45  "UPDATE tests SE
5250: 54 20 73 74 61 74 75 73 3d 3f 20 20 57 48 45 52  T status=?  WHER
5260: 45 20 69 64 3d 3f 3b 22 20 6e 65 77 73 74 61 74  E id=?;" newstat
5270: 75 73 20 20 74 65 73 74 2d 69 64 29 29 0a 20 20  us  test-id)).  
5280: 28 69 66 20 6e 65 77 63 6f 6d 6d 65 6e 74 20 28  (if newcomment (
5290: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
52a0: 64 62 20 22 55 50 44 41 54 45 20 74 65 73 74 73  db "UPDATE tests
52b0: 20 53 45 54 20 63 6f 6d 6d 65 6e 74 3d 3f 20 57   SET comment=? W
52c0: 48 45 52 45 20 69 64 3d 3f 3b 22 20 6e 65 77 63  HERE id=?;" newc
52d0: 6f 6d 6d 65 6e 74 20 74 65 73 74 2d 69 64 29 29  omment test-id))
52e0: 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 74  )..(define (db:t
52f0: 65 73 74 2d 73 65 74 2d 73 74 61 74 65 2d 73 74  est-set-state-st
5300: 61 74 75 73 2d 62 79 2d 72 75 6e 2d 69 64 2d 74  atus-by-run-id-t
5310: 65 73 74 6e 61 6d 65 20 64 62 20 72 75 6e 2d 69  estname db run-i
5320: 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d  d test-name item
5330: 2d 70 61 74 68 20 73 74 61 74 75 73 20 73 74 61  -path status sta
5340: 74 65 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65  te).  (sqlite3:e
5350: 78 65 63 75 74 65 20 64 62 20 22 55 50 44 41 54  xecute db "UPDAT
5360: 45 20 74 65 73 74 73 20 53 45 54 20 73 74 61 74  E tests SET stat
5370: 65 3d 3f 2c 73 74 61 74 75 73 3d 3f 2c 65 76 65  e=?,status=?,eve
5380: 6e 74 5f 74 69 6d 65 3d 73 74 72 66 74 69 6d 65  nt_time=strftime
5390: 28 27 25 73 27 2c 27 6e 6f 77 27 29 20 57 48 45  ('%s','now') WHE
53a0: 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20  RE run_id=? AND 
53b0: 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69  testname=? AND i
53c0: 74 65 6d 5f 70 61 74 68 3d 3f 3b 22 20 0a 09 09  tem_path=?;" ...
53d0: 20 20 20 73 74 61 74 65 20 73 74 61 74 75 73 20     state status 
53e0: 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65  run-id test-name
53f0: 20 69 74 65 6d 2d 70 61 74 68 29 29 0a 0a 28 64   item-path))..(d
5400: 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 63 6f  efine (db:get-co
5410: 75 6e 74 2d 74 65 73 74 73 2d 72 75 6e 6e 69 6e  unt-tests-runnin
5420: 67 20 64 62 29 0a 20 20 28 6c 65 74 20 28 28 72  g db).  (let ((r
5430: 65 73 20 30 29 29 0a 20 20 20 20 28 73 71 6c 69  es 0)).    (sqli
5440: 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77  te3:for-each-row
5450: 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 63  .     (lambda (c
5460: 6f 75 6e 74 29 0a 20 20 20 20 20 20 20 28 73 65  ount).       (se
5470: 74 21 20 72 65 73 20 63 6f 75 6e 74 29 29 0a 20  t! res count)). 
5480: 20 20 20 20 64 62 0a 20 20 20 20 20 22 53 45 4c      db.     "SEL
5490: 45 43 54 20 63 6f 75 6e 74 28 69 64 29 20 46 52  ECT count(id) FR
54a0: 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 73  OM tests WHERE s
54b0: 74 61 74 65 20 3d 20 27 52 55 4e 4e 49 4e 47 27  tate = 'RUNNING'
54c0: 20 4f 52 20 73 74 61 74 65 20 3d 20 27 4c 41 55   OR state = 'LAU
54d0: 4e 43 48 45 44 27 20 4f 52 20 73 74 61 74 65 20  NCHED' OR state 
54e0: 3d 20 27 52 45 4d 4f 54 45 48 4f 53 54 53 54 41  = 'REMOTEHOSTSTA
54f0: 52 54 27 3b 22 29 0a 20 20 20 20 72 65 73 29 29  RT';").    res))
5500: 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65  ..(define (db:ge
5510: 74 2d 63 6f 75 6e 74 2d 74 65 73 74 73 2d 72 75  t-count-tests-ru
5520: 6e 6e 69 6e 67 2d 69 6e 2d 6a 6f 62 67 72 6f 75  nning-in-jobgrou
5530: 70 20 64 62 20 6a 6f 62 67 72 6f 75 70 29 0a 20  p db jobgroup). 
5540: 20 28 69 66 20 28 6e 6f 74 20 6a 6f 62 67 72 6f   (if (not jobgro
5550: 75 70 29 0a 20 20 20 20 20 20 30 20 3b 3b 20 0a  up).      0 ;; .
5560: 20 20 20 20 20 20 28 6c 65 74 20 28 28 72 65 73        (let ((res
5570: 20 30 29 29 0a 09 28 73 71 6c 69 74 65 33 3a 66   0))..(sqlite3:f
5580: 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 09 20 28 6c  or-each-row.. (l
5590: 61 6d 62 64 61 20 28 63 6f 75 6e 74 29 0a 09 20  ambda (count).. 
55a0: 20 20 28 73 65 74 21 20 72 65 73 20 63 6f 75 6e    (set! res coun
55b0: 74 29 29 0a 09 20 64 62 0a 09 20 22 53 45 4c 45  t)).. db.. "SELE
55c0: 43 54 20 63 6f 75 6e 74 28 69 64 29 20 46 52 4f  CT count(id) FRO
55d0: 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 73 74  M tests WHERE st
55e0: 61 74 65 20 3d 20 27 52 55 4e 4e 49 4e 47 27 20  ate = 'RUNNING' 
55f0: 4f 52 20 73 74 61 74 65 20 3d 20 27 4c 41 55 4e  OR state = 'LAUN
5600: 43 48 45 44 27 20 4f 52 20 73 74 61 74 65 20 3d  CHED' OR state =
5610: 20 27 52 45 4d 4f 54 45 48 4f 53 54 53 54 41 52   'REMOTEHOSTSTAR
5620: 54 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  T'.             
5630: 41 4e 44 20 74 65 73 74 6e 61 6d 65 20 69 6e 20  AND testname in 
5640: 28 53 45 4c 45 43 54 20 74 65 73 74 6e 61 6d 65  (SELECT testname
5650: 20 46 52 4f 4d 20 74 65 73 74 5f 6d 65 74 61 20   FROM test_meta 
5660: 57 48 45 52 45 20 6a 6f 62 67 72 6f 75 70 3d 3f  WHERE jobgroup=?
5670: 3b 22 0a 09 20 6a 6f 62 67 72 6f 75 70 29 0a 09  ;".. jobgroup)..
5680: 72 65 73 29 29 29 0a 0a 3b 3b 20 64 6f 6e 65 20  res)))..;; done 
5690: 77 69 74 68 20 72 75 6e 20 77 68 65 6e 3a 0a 3b  with run when:.;
56a0: 3b 20 20 20 30 20 74 65 73 74 73 20 69 6e 20 4c  ;   0 tests in L
56b0: 41 55 4e 43 48 45 44 2c 20 4e 4f 54 5f 53 54 41  AUNCHED, NOT_STA
56c0: 52 54 45 44 2c 20 52 45 4d 4f 54 45 48 4f 53 54  RTED, REMOTEHOST
56d0: 53 54 41 52 54 2c 20 52 55 4e 4e 49 4e 47 0a 28  START, RUNNING.(
56e0: 64 65 66 69 6e 65 20 28 64 62 3a 65 73 74 69 6d  define (db:estim
56f0: 61 74 65 64 2d 74 65 73 74 73 2d 72 65 6d 61 69  ated-tests-remai
5700: 6e 69 6e 67 20 64 62 20 72 75 6e 2d 69 64 29 0a  ning db run-id).
5710: 20 20 28 6c 65 74 20 28 28 72 65 73 20 30 29 29    (let ((res 0))
5720: 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f  .    (sqlite3:fo
5730: 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 20  r-each-row.     
5740: 28 6c 61 6d 62 64 61 20 28 63 6f 75 6e 74 29 0a  (lambda (count).
5750: 20 20 20 20 20 20 20 28 73 65 74 21 20 72 65 73         (set! res
5760: 20 63 6f 75 6e 74 29 29 0a 20 20 20 20 20 64 62   count)).     db
5770: 20 3b 3b 20 4e 42 2f 2f 20 4b 49 4c 4c 52 45 51   ;; NB// KILLREQ
5780: 20 6d 65 61 6e 73 20 74 68 65 20 6a 6f 62 73 20   means the jobs 
5790: 69 73 20 73 74 69 6c 6c 20 70 72 6f 62 61 62 6c  is still probabl
57a0: 79 20 72 75 6e 6e 69 6e 67 0a 20 20 20 20 20 22  y running.     "
57b0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 69 64 29  SELECT count(id)
57c0: 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52   FROM tests WHER
57d0: 45 20 73 74 61 74 65 20 69 6e 20 28 27 4c 41 55  E state in ('LAU
57e0: 4e 43 48 45 44 27 2c 27 4e 4f 54 5f 53 54 41 52  NCHED','NOT_STAR
57f0: 54 45 44 27 2c 27 52 45 4d 4f 54 45 48 4f 53 54  TED','REMOTEHOST
5800: 53 54 41 52 54 27 2c 27 52 55 4e 4e 49 4e 47 27  START','RUNNING'
5810: 2c 27 4b 49 4c 4c 52 45 51 27 29 20 41 4e 44 20  ,'KILLREQ') AND 
5820: 72 75 6e 5f 69 64 3d 3f 3b 22 20 72 75 6e 2d 69  run_id=?;" run-i
5830: 64 29 0a 20 20 20 20 72 65 73 29 29 0a 0a 3b 3b  d).    res))..;;
5840: 20 4e 42 2f 2f 20 53 79 6e 63 20 74 68 69 73 20   NB// Sync this 
5850: 77 69 74 68 20 72 75 6e 73 3a 67 65 74 2d 74 65  with runs:get-te
5860: 73 74 2d 69 6e 66 6f 0a 28 64 65 66 69 6e 65 20  st-info.(define 
5870: 28 64 62 3a 67 65 74 2d 74 65 73 74 2d 69 6e 66  (db:get-test-inf
5880: 6f 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74  o db run-id test
5890: 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 0a  name item-path).
58a0: 20 20 28 6c 65 74 20 28 28 72 65 73 20 23 66 29    (let ((res #f)
58b0: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66  ).    (sqlite3:f
58c0: 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 20  or-each-row.    
58d0: 20 28 6c 61 6d 62 64 61 20 28 69 64 20 72 75 6e   (lambda (id run
58e0: 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 73 74 61  -id testname sta
58f0: 74 65 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d  te status event-
5900: 74 69 6d 65 20 68 6f 73 74 20 63 70 75 6c 6f 61  time host cpuloa
5910: 64 20 64 69 73 6b 66 72 65 65 20 75 6e 61 6d 65  d diskfree uname
5920: 20 72 75 6e 64 69 72 20 69 74 65 6d 2d 70 61 74   rundir item-pat
5930: 68 20 72 75 6e 5f 64 75 72 61 74 69 6f 6e 20 66  h run_duration f
5940: 69 6e 61 6c 5f 6c 6f 67 66 20 63 6f 6d 6d 65 6e  inal_logf commen
5950: 74 20 29 0a 20 20 20 20 20 20 20 28 73 65 74 21  t ).       (set!
5960: 20 72 65 73 20 28 76 65 63 74 6f 72 20 69 64 20   res (vector id 
5970: 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20  run-id testname 
5980: 73 74 61 74 65 20 73 74 61 74 75 73 20 65 76 65  state status eve
5990: 6e 74 2d 74 69 6d 65 20 68 6f 73 74 20 63 70 75  nt-time host cpu
59a0: 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20 75 6e  load diskfree un
59b0: 61 6d 65 20 72 75 6e 64 69 72 20 69 74 65 6d 2d  ame rundir item-
59c0: 70 61 74 68 20 72 75 6e 5f 64 75 72 61 74 69 6f  path run_duratio
59d0: 6e 20 66 69 6e 61 6c 5f 6c 6f 67 66 20 63 6f 6d  n final_logf com
59e0: 6d 65 6e 74 20 29 29 29 0a 20 20 20 20 20 64 62  ment ))).     db
59f0: 20 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20 69   .     "SELECT i
5a00: 64 2c 72 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d  d,run_id,testnam
5a10: 65 2c 73 74 61 74 65 2c 73 74 61 74 75 73 2c 65  e,state,status,e
5a20: 76 65 6e 74 5f 74 69 6d 65 2c 68 6f 73 74 2c 63  vent_time,host,c
5a30: 70 75 6c 6f 61 64 2c 64 69 73 6b 66 72 65 65 2c  puload,diskfree,
5a40: 75 6e 61 6d 65 2c 72 75 6e 64 69 72 2c 69 74 65  uname,rundir,ite
5a50: 6d 5f 70 61 74 68 2c 72 75 6e 5f 64 75 72 61 74  m_path,run_durat
5a60: 69 6f 6e 2c 66 69 6e 61 6c 5f 6c 6f 67 66 2c 63  ion,final_logf,c
5a70: 6f 6d 6d 65 6e 74 20 46 52 4f 4d 20 74 65 73 74  omment FROM test
5a80: 73 20 57 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f  s WHERE run_id=?
5a90: 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20   AND testname=? 
5aa0: 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 3d 3f 3b  AND item_path=?;
5ab0: 22 0a 20 20 20 20 20 72 75 6e 2d 69 64 20 74 65  ".     run-id te
5ac0: 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68  stname item-path
5ad0: 29 0a 20 20 20 20 72 65 73 29 29 0a 0a 3b 3b 20  ).    res))..;; 
5ae0: 47 65 74 20 74 65 73 74 20 64 61 74 61 20 75 73  Get test data us
5af0: 69 6e 67 20 74 65 73 74 5f 69 64 0a 28 64 65 66  ing test_id.(def
5b00: 69 6e 65 20 28 64 62 3a 67 65 74 2d 74 65 73 74  ine (db:get-test
5b10: 2d 64 61 74 61 2d 62 79 2d 69 64 20 64 62 20 74  -data-by-id db t
5b20: 65 73 74 2d 69 64 29 0a 20 20 28 6c 65 74 20 28  est-id).  (let (
5b30: 28 72 65 73 20 23 66 29 29 0a 20 20 20 20 28 73  (res #f)).    (s
5b40: 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d  qlite3:for-each-
5b50: 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 64 61  row.     (lambda
5b60: 20 28 69 64 20 72 75 6e 2d 69 64 20 74 65 73 74   (id run-id test
5b70: 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61 74 75  name state statu
5b80: 73 20 65 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73  s event-time hos
5b90: 74 20 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72  t cpuload diskfr
5ba0: 65 65 20 75 6e 61 6d 65 20 72 75 6e 64 69 72 20  ee uname rundir 
5bb0: 69 74 65 6d 2d 70 61 74 68 20 72 75 6e 5f 64 75  item-path run_du
5bc0: 72 61 74 69 6f 6e 20 66 69 6e 61 6c 5f 6c 6f 67  ration final_log
5bd0: 66 20 63 6f 6d 6d 65 6e 74 29 0a 20 20 20 20 20  f comment).     
5be0: 20 20 28 73 65 74 21 20 72 65 73 20 28 76 65 63    (set! res (vec
5bf0: 74 6f 72 20 69 64 20 72 75 6e 2d 69 64 20 74 65  tor id run-id te
5c00: 73 74 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61  stname state sta
5c10: 74 75 73 20 65 76 65 6e 74 2d 74 69 6d 65 20 68  tus event-time h
5c20: 6f 73 74 20 63 70 75 6c 6f 61 64 20 64 69 73 6b  ost cpuload disk
5c30: 66 72 65 65 20 75 6e 61 6d 65 20 72 75 6e 64 69  free uname rundi
5c40: 72 20 69 74 65 6d 2d 70 61 74 68 20 72 75 6e 5f  r item-path run_
5c50: 64 75 72 61 74 69 6f 6e 20 66 69 6e 61 6c 5f 6c  duration final_l
5c60: 6f 67 66 20 63 6f 6d 6d 65 6e 74 29 29 29 0a 20  ogf comment))). 
5c70: 20 20 20 20 64 62 20 0a 20 20 20 20 20 22 53 45      db .     "SE
5c80: 4c 45 43 54 20 69 64 2c 72 75 6e 5f 69 64 2c 74  LECT id,run_id,t
5c90: 65 73 74 6e 61 6d 65 2c 73 74 61 74 65 2c 73 74  estname,state,st
5ca0: 61 74 75 73 2c 65 76 65 6e 74 5f 74 69 6d 65 2c  atus,event_time,
5cb0: 68 6f 73 74 2c 63 70 75 6c 6f 61 64 2c 64 69 73  host,cpuload,dis
5cc0: 6b 66 72 65 65 2c 75 6e 61 6d 65 2c 72 75 6e 64  kfree,uname,rund
5cd0: 69 72 2c 69 74 65 6d 5f 70 61 74 68 2c 72 75 6e  ir,item_path,run
5ce0: 5f 64 75 72 61 74 69 6f 6e 2c 66 69 6e 61 6c 5f  _duration,final_
5cf0: 6c 6f 67 66 2c 63 6f 6d 6d 65 6e 74 20 46 52 4f  logf,comment FRO
5d00: 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 69 64  M tests WHERE id
5d10: 3d 3f 3b 22 0a 20 20 20 20 20 74 65 73 74 2d 69  =?;".     test-i
5d20: 64 29 0a 20 20 20 20 72 65 73 29 29 0a 0a 0a 28  d).    res))...(
5d30: 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74 2d  define (db:test-
5d40: 73 65 74 2d 63 6f 6d 6d 65 6e 74 20 64 62 20 72  set-comment db r
5d50: 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20  un-id test-name 
5d60: 69 74 65 6d 2d 70 61 74 68 20 63 6f 6d 6d 65 6e  item-path commen
5d70: 74 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78  t).  (sqlite3:ex
5d80: 65 63 75 74 65 20 0a 20 20 20 64 62 20 0a 20 20  ecute .   db .  
5d90: 20 22 55 50 44 41 54 45 20 74 65 73 74 73 20 53   "UPDATE tests S
5da0: 45 54 20 63 6f 6d 6d 65 6e 74 3d 3f 20 57 48 45  ET comment=? WHE
5db0: 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20  RE run_id=? AND 
5dc0: 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69  testname=? AND i
5dd0: 74 65 6d 5f 70 61 74 68 3d 3f 3b 22 0a 20 20 20  tem_path=?;".   
5de0: 63 6f 6d 6d 65 6e 74 20 72 75 6e 2d 69 64 20 74  comment run-id t
5df0: 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61  est-name item-pa
5e00: 74 68 29 29 0a 0a 3b 3b 0a 28 64 65 66 69 6e 65  th))..;;.(define
5e10: 20 28 64 62 3a 74 65 73 74 2d 73 65 74 2d 72 75   (db:test-set-ru
5e20: 6e 64 69 72 21 20 64 62 20 72 75 6e 2d 69 64 20  ndir! db run-id 
5e30: 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70  test-name item-p
5e40: 61 74 68 20 72 75 6e 64 69 72 29 0a 20 20 28 73  ath rundir).  (s
5e50: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 0a  qlite3:execute .
5e60: 20 20 20 64 62 20 0a 20 20 20 22 55 50 44 41 54     db .   "UPDAT
5e70: 45 20 74 65 73 74 73 20 53 45 54 20 72 75 6e 64  E tests SET rund
5e80: 69 72 3d 3f 20 57 48 45 52 45 20 72 75 6e 5f 69  ir=? WHERE run_i
5e90: 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65  d=? AND testname
5ea0: 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68  =? AND item_path
5eb0: 3d 3f 3b 22 0a 20 20 20 72 75 6e 64 69 72 20 72  =?;".   rundir r
5ec0: 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20  un-id test-name 
5ed0: 69 74 65 6d 2d 70 61 74 68 29 29 0a 0a 28 64 65  item-path))..(de
5ee0: 66 69 6e 65 20 28 64 62 3a 74 65 73 74 2d 73 65  fine (db:test-se
5ef0: 74 2d 6c 6f 67 21 20 64 62 20 72 75 6e 2d 69 64  t-log! db run-id
5f00: 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d   test-name item-
5f10: 70 61 74 68 20 6c 6f 67 66 29 0a 20 20 28 73 71  path logf).  (sq
5f20: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62  lite3:execute db
5f30: 20 22 55 50 44 41 54 45 20 74 65 73 74 73 20 53   "UPDATE tests S
5f40: 45 54 20 66 69 6e 61 6c 5f 6c 6f 67 66 3d 3f 20  ET final_logf=? 
5f50: 57 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41  WHERE run_id=? A
5f60: 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e  ND testname=? AN
5f70: 44 20 69 74 65 6d 5f 70 61 74 68 3d 3f 3b 22 20  D item_path=?;" 
5f80: 0a 09 09 20 20 20 6c 6f 67 66 20 72 75 6e 2d 69  ...   logf run-i
5f90: 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d  d test-name item
5fa0: 2d 70 61 74 68 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d  -path))..;;=====
5fb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5fc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5fd0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5fe0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5ff0: 3d 0a 3b 3b 20 4d 69 73 63 2e 20 74 65 73 74 20  =.;; Misc. test 
6000: 72 65 6c 61 74 65 64 20 71 75 65 72 69 65 73 0a  related queries.
6010: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
6020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6030: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6040: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6050: 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65 66 69 6e  ========..(defin
6060: 65 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 70  e (db:test-get-p
6070: 61 74 68 73 2d 6d 61 74 63 68 69 6e 67 20 64 62  aths-matching db
6080: 20 6b 65 79 6e 61 6d 65 73 20 74 61 72 67 65 74   keynames target
6090: 29 0a 20 20 28 6c 65 74 2a 20 28 28 72 65 73 20  ).  (let* ((res 
60a0: 27 28 29 29 0a 09 20 28 69 74 65 6d 70 61 74 74  '()).. (itempatt
60b0: 20 20 20 28 69 66 20 28 61 72 67 73 3a 67 65 74     (if (args:get
60c0: 2d 61 72 67 20 22 2d 69 74 65 6d 70 61 74 74 22  -arg "-itempatt"
60d0: 29 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22  )(args:get-arg "
60e0: 2d 69 74 65 6d 70 61 74 74 22 29 20 22 25 22 29  -itempatt") "%")
60f0: 29 0a 09 20 28 74 65 73 74 70 61 74 74 20 20 20  ).. (testpatt   
6100: 28 69 66 20 28 61 72 67 73 3a 67 65 74 2d 61 72  (if (args:get-ar
6110: 67 20 22 2d 74 65 73 74 70 61 74 74 22 29 28 61  g "-testpatt")(a
6120: 72 67 73 3a 67 65 74 2d 61 72 67 20 22 2d 74 65  rgs:get-arg "-te
6130: 73 74 70 61 74 74 22 29 20 22 25 22 29 29 0a 09  stpatt") "%"))..
6140: 20 28 73 74 61 74 65 70 61 74 74 20 20 28 69 66   (statepatt  (if
6150: 20 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22   (args:get-arg "
6160: 3a 73 74 61 74 65 22 29 20 20 20 28 61 72 67 73  :state")   (args
6170: 3a 67 65 74 2d 61 72 67 20 22 3a 73 74 61 74 65  :get-arg ":state
6180: 22 29 20 20 20 20 22 25 22 29 29 0a 09 20 28 73  ")    "%")).. (s
6190: 74 61 74 75 73 70 61 74 74 20 28 69 66 20 28 61  tatuspatt (if (a
61a0: 72 67 73 3a 67 65 74 2d 61 72 67 20 22 3a 73 74  rgs:get-arg ":st
61b0: 61 74 75 73 22 29 20 20 28 61 72 67 73 3a 67 65  atus")  (args:ge
61c0: 74 2d 61 72 67 20 22 3a 73 74 61 74 75 73 22 29  t-arg ":status")
61d0: 20 20 20 22 25 22 29 29 0a 09 20 28 72 75 6e 6e     "%")).. (runn
61e0: 61 6d 65 20 20 20 20 28 69 66 20 28 61 72 67 73  ame    (if (args
61f0: 3a 67 65 74 2d 61 72 67 20 22 3a 72 75 6e 6e 61  :get-arg ":runna
6200: 6d 65 22 29 20 28 61 72 67 73 3a 67 65 74 2d 61  me") (args:get-a
6210: 72 67 20 22 3a 72 75 6e 6e 61 6d 65 22 29 20 20  rg ":runname")  
6220: 22 25 22 29 29 0a 09 20 28 6b 65 79 73 74 72 20  "%")).. (keystr 
6230: 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65  (string-interspe
6240: 72 73 65 20 0a 09 09 20 20 28 6d 61 70 20 28 6c  rse ...  (map (l
6250: 61 6d 62 64 61 20 28 6b 65 79 20 76 61 6c 29 0a  ambda (key val).
6260: 09 09 09 20 28 63 6f 6e 63 20 22 72 2e 22 20 6b  ... (conc "r." k
6270: 65 79 20 22 20 6c 69 6b 65 20 27 22 20 76 61 6c  ey " like '" val
6280: 20 22 27 22 29 29 0a 09 09 20 20 20 20 20 20 20   "'"))...       
6290: 6b 65 79 6e 61 6d 65 73 20 0a 09 09 20 20 20 20  keynames ...    
62a0: 20 20 20 28 73 74 72 69 6e 67 2d 73 70 6c 69 74     (string-split
62b0: 20 74 61 72 67 65 74 20 22 2f 22 29 29 0a 09 09   target "/"))...
62c0: 20 20 22 20 41 4e 44 20 22 29 29 0a 09 20 28 71    " AND ")).. (q
62d0: 72 79 73 74 72 20 28 63 6f 6e 63 20 22 53 45 4c  rystr (conc "SEL
62e0: 45 43 54 20 74 2e 72 75 6e 64 69 72 20 46 52 4f  ECT t.rundir FRO
62f0: 4d 20 74 65 73 74 73 20 41 53 20 74 20 49 4e 4e  M tests AS t INN
6300: 45 52 20 4a 4f 49 4e 20 72 75 6e 73 20 41 53 20  ER JOIN runs AS 
6310: 72 20 4f 4e 20 74 2e 72 75 6e 5f 69 64 3d 72 2e  r ON t.run_id=r.
6320: 69 64 20 57 48 45 52 45 20 22 0a 09 09 20 20 20  id WHERE "...   
6330: 20 20 20 20 6b 65 79 73 74 72 20 22 20 41 4e 44      keystr " AND
6340: 20 72 2e 72 75 6e 6e 61 6d 65 20 4c 49 4b 45 20   r.runname LIKE 
6350: 27 22 20 72 75 6e 6e 61 6d 65 20 22 27 20 41 4e  '" runname "' AN
6360: 44 20 69 74 65 6d 5f 70 61 74 68 20 4c 49 4b 45  D item_path LIKE
6370: 20 27 22 20 69 74 65 6d 70 61 74 74 20 22 27 20   '" itempatt "' 
6380: 41 4e 44 20 74 65 73 74 6e 61 6d 65 20 4c 49 4b  AND testname LIK
6390: 45 20 27 22 0a 09 09 20 20 20 20 20 20 20 74 65  E '"...       te
63a0: 73 74 70 61 74 74 20 22 27 20 41 4e 44 20 74 2e  stpatt "' AND t.
63b0: 73 74 61 74 65 20 4c 49 4b 45 20 27 22 20 73 74  state LIKE '" st
63c0: 61 74 65 70 61 74 74 20 22 27 20 41 4e 44 20 74  atepatt "' AND t
63d0: 2e 73 74 61 74 75 73 20 4c 49 4b 45 20 27 22 20  .status LIKE '" 
63e0: 73 74 61 74 75 73 70 61 74 74 20 0a 09 09 20 20  statuspatt ...  
63f0: 20 20 20 20 20 22 27 4f 52 44 45 52 20 42 59 20       "'ORDER BY 
6400: 74 2e 65 76 65 6e 74 5f 74 69 6d 65 20 41 53 43  t.event_time ASC
6410: 3b 22 29 29 29 0a 20 20 20 20 28 64 65 62 75 67  ;"))).    (debug
6420: 3a 70 72 69 6e 74 20 33 20 22 71 72 79 73 74 72  :print 3 "qrystr
6430: 3a 20 22 20 71 72 79 73 74 72 29 0a 20 20 20 20  : " qrystr).    
6440: 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63  (sqlite3:for-eac
6450: 68 2d 72 6f 77 20 0a 20 20 20 20 20 28 6c 61 6d  h-row .     (lam
6460: 62 64 61 20 28 70 29 0a 20 20 20 20 20 20 20 28  bda (p).       (
6470: 73 65 74 21 20 72 65 73 20 28 63 6f 6e 73 20 70  set! res (cons p
6480: 20 72 65 73 29 29 29 0a 20 20 20 20 20 64 62 20   res))).     db 
6490: 0a 20 20 20 20 20 71 72 79 73 74 72 29 0a 20 20  .     qrystr).  
64a0: 20 20 72 65 73 29 29 0a 0a 28 64 65 66 69 6e 65    res))..(define
64b0: 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 74 65   (db:test-get-te
64c0: 73 74 2d 72 65 63 6f 72 64 73 2d 6d 61 74 63 68  st-records-match
64d0: 69 6e 67 20 64 62 20 6b 65 79 6e 61 6d 65 73 20  ing db keynames 
64e0: 74 61 72 67 65 74 29 0a 20 20 28 6c 65 74 2a 20  target).  (let* 
64f0: 28 28 72 65 73 20 27 28 29 29 0a 09 20 28 69 74  ((res '()).. (it
6500: 65 6d 70 61 74 74 20 20 20 28 69 66 20 28 61 72  empatt   (if (ar
6510: 67 73 3a 67 65 74 2d 61 72 67 20 22 2d 69 74 65  gs:get-arg "-ite
6520: 6d 70 61 74 74 22 29 28 61 72 67 73 3a 67 65 74  mpatt")(args:get
6530: 2d 61 72 67 20 22 2d 69 74 65 6d 70 61 74 74 22  -arg "-itempatt"
6540: 29 20 22 25 22 29 29 0a 09 20 28 74 65 73 74 70  ) "%")).. (testp
6550: 61 74 74 20 20 20 28 69 66 20 28 61 72 67 73 3a  att   (if (args:
6560: 67 65 74 2d 61 72 67 20 22 2d 74 65 73 74 70 61  get-arg "-testpa
6570: 74 74 22 29 28 61 72 67 73 3a 67 65 74 2d 61 72  tt")(args:get-ar
6580: 67 20 22 2d 74 65 73 74 70 61 74 74 22 29 20 22  g "-testpatt") "
6590: 25 22 29 29 0a 09 20 28 73 74 61 74 65 70 61 74  %")).. (statepat
65a0: 74 20 20 28 69 66 20 28 61 72 67 73 3a 67 65 74  t  (if (args:get
65b0: 2d 61 72 67 20 22 3a 73 74 61 74 65 22 29 20 20  -arg ":state")  
65c0: 20 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22   (args:get-arg "
65d0: 3a 73 74 61 74 65 22 29 20 20 20 20 22 25 22 29  :state")    "%")
65e0: 29 0a 09 20 28 73 74 61 74 75 73 70 61 74 74 20  ).. (statuspatt 
65f0: 28 69 66 20 28 61 72 67 73 3a 67 65 74 2d 61 72  (if (args:get-ar
6600: 67 20 22 3a 73 74 61 74 75 73 22 29 20 20 28 61  g ":status")  (a
6610: 72 67 73 3a 67 65 74 2d 61 72 67 20 22 3a 73 74  rgs:get-arg ":st
6620: 61 74 75 73 22 29 20 20 20 22 25 22 29 29 0a 09  atus")   "%"))..
6630: 20 28 72 75 6e 6e 61 6d 65 20 20 20 20 28 69 66   (runname    (if
6640: 20 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22   (args:get-arg "
6650: 3a 72 75 6e 6e 61 6d 65 22 29 20 28 61 72 67 73  :runname") (args
6660: 3a 67 65 74 2d 61 72 67 20 22 3a 72 75 6e 6e 61  :get-arg ":runna
6670: 6d 65 22 29 20 20 22 25 22 29 29 0a 09 20 28 6b  me")  "%")).. (k
6680: 65 79 73 74 72 20 28 73 74 72 69 6e 67 2d 69 6e  eystr (string-in
6690: 74 65 72 73 70 65 72 73 65 20 0a 09 09 20 20 28  tersperse ...  (
66a0: 6d 61 70 20 28 6c 61 6d 62 64 61 20 28 6b 65 79  map (lambda (key
66b0: 20 76 61 6c 29 0a 09 09 09 20 28 63 6f 6e 63 20   val).... (conc 
66c0: 22 72 2e 22 20 6b 65 79 20 22 20 6c 69 6b 65 20  "r." key " like 
66d0: 27 22 20 76 61 6c 20 22 27 22 29 29 0a 09 09 20  '" val "'"))... 
66e0: 20 20 20 20 20 20 6b 65 79 6e 61 6d 65 73 20 0a        keynames .
66f0: 09 09 20 20 20 20 20 20 20 28 73 74 72 69 6e 67  ..       (string
6700: 2d 73 70 6c 69 74 20 74 61 72 67 65 74 20 22 2f  -split target "/
6710: 22 29 29 0a 09 09 20 20 22 20 41 4e 44 20 22 29  "))...  " AND ")
6720: 29 0a 09 20 28 71 72 79 73 74 72 20 28 63 6f 6e  ).. (qrystr (con
6730: 63 20 22 53 45 4c 45 43 54 20 0a 20 20 20 20 20  c "SELECT .     
6740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6750: 20 20 20 20 20 20 20 74 2e 69 64 0a 20 20 20 20         t.id.    
6760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6770: 20 20 20 20 20 20 20 20 74 2e 72 75 6e 5f 69 64          t.run_id
6780: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20       .          
6790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67a0: 20 20 74 2e 74 65 73 74 6e 61 6d 65 20 20 20 0a    t.testname   .
67b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67c0: 20 20 20 20 20 20 20 20 20 20 20 20 74 2e 68 6f              t.ho
67d0: 73 74 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  st       .      
67e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67f0: 20 20 20 20 20 20 74 2e 63 70 75 6c 6f 61 64 20        t.cpuload 
6800: 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20     .            
6810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6820: 74 2e 64 69 73 6b 66 72 65 65 20 20 20 0a 20 20  t.diskfree   .  
6830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6840: 20 20 20 20 20 20 20 20 20 20 74 2e 75 6e 61 6d            t.unam
6850: 65 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20  e      .        
6860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6870: 20 20 20 20 74 2e 72 75 6e 64 69 72 20 20 20 20      t.rundir    
6880: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
6890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 2e                t.
68a0: 73 68 6f 72 74 64 69 72 20 20 20 0a 20 20 20 20  shortdir   .    
68b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68c0: 20 20 20 20 20 20 20 20 74 2e 69 74 65 6d 5f 70          t.item_p
68d0: 61 74 68 20 20 0a 20 20 20 20 20 20 20 20 20 20  ath  .          
68e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
68f0: 20 20 74 2e 73 74 61 74 65 20 20 20 20 20 20 0a    t.state      .
6900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6910: 20 20 20 20 20 20 20 20 20 20 20 20 74 2e 73 74              t.st
6920: 61 74 75 73 20 20 20 20 20 0a 20 20 20 20 20 20  atus     .      
6930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6940: 20 20 20 20 20 20 74 2e 61 74 74 65 6d 70 74 6e        t.attemptn
6950: 75 6d 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  um .            
6960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6970: 74 2e 66 69 6e 61 6c 5f 6c 6f 67 66 20 0a 20 20  t.final_logf .  
6980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6990: 20 20 20 20 20 20 20 20 20 20 74 2e 6c 6f 67 64            t.logd
69a0: 61 74 20 20 20 20 20 0a 20 20 20 20 20 20 20 20  at     .        
69b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
69c0: 20 20 20 20 74 2e 72 75 6e 5f 64 75 72 61 74 69      t.run_durati
69d0: 6f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o.              
69e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 2e                t.
69f0: 63 6f 6d 6d 65 6e 74 20 20 20 20 0a 20 20 20 20  comment    .    
6a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a10: 20 20 20 20 20 20 20 20 74 2e 65 76 65 6e 74 5f          t.event_
6a20: 74 69 6d 65 20 0a 20 20 20 20 20 20 20 20 20 20  time .          
6a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a40: 20 20 74 2e 66 61 69 6c 5f 63 6f 75 6e 74 20 0a    t.fail_count .
6a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a60: 20 20 20 20 20 20 20 20 20 20 20 20 74 2e 70 61              t.pa
6a70: 73 73 5f 63 6f 75 6e 74 20 0a 20 20 20 20 20 20  ss_count .      
6a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a90: 20 20 20 20 20 20 74 2e 61 72 63 68 69 76 65 64        t.archived
6aa0: 20 20 20 0a 0a 0a 0a 20 46 52 4f 4d 20 74 65 73     .... FROM tes
6ab0: 74 73 20 41 53 20 74 20 49 4e 4e 45 52 20 4a 4f  ts AS t INNER JO
6ac0: 49 4e 20 72 75 6e 73 20 41 53 20 72 20 4f 4e 20  IN runs AS r ON 
6ad0: 74 2e 72 75 6e 5f 69 64 3d 72 2e 69 64 20 57 48  t.run_id=r.id WH
6ae0: 45 52 45 20 22 0a 09 09 20 20 20 20 20 20 20 6b  ERE "...       k
6af0: 65 79 73 74 72 20 22 20 41 4e 44 20 72 2e 72 75  eystr " AND r.ru
6b00: 6e 6e 61 6d 65 20 4c 49 4b 45 20 27 22 20 72 75  nname LIKE '" ru
6b10: 6e 6e 61 6d 65 20 22 27 20 41 4e 44 20 69 74 65  nname "' AND ite
6b20: 6d 5f 70 61 74 68 20 4c 49 4b 45 20 27 22 20 69  m_path LIKE '" i
6b30: 74 65 6d 70 61 74 74 20 22 27 20 41 4e 44 20 74  tempatt "' AND t
6b40: 65 73 74 6e 61 6d 65 20 4c 49 4b 45 20 27 22 0a  estname LIKE '".
6b50: 09 09 20 20 20 20 20 20 20 74 65 73 74 70 61 74  ..       testpat
6b60: 74 20 22 27 20 41 4e 44 20 74 2e 73 74 61 74 65  t "' AND t.state
6b70: 20 4c 49 4b 45 20 27 22 20 73 74 61 74 65 70 61   LIKE '" statepa
6b80: 74 74 20 22 27 20 41 4e 44 20 74 2e 73 74 61 74  tt "' AND t.stat
6b90: 75 73 20 4c 49 4b 45 20 27 22 20 73 74 61 74 75  us LIKE '" statu
6ba0: 73 70 61 74 74 20 0a 09 09 20 20 20 20 20 20 20  spatt ...       
6bb0: 22 27 4f 52 44 45 52 20 42 59 20 74 2e 65 76 65  "'ORDER BY t.eve
6bc0: 6e 74 5f 74 69 6d 65 20 41 53 43 3b 22 29 29 29  nt_time ASC;")))
6bd0: 0a 20 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e  .    (debug:prin
6be0: 74 20 33 20 22 71 72 79 73 74 72 3a 20 22 20 71  t 3 "qrystr: " q
6bf0: 72 79 73 74 72 29 0a 20 20 20 20 28 73 71 6c 69  rystr).    (sqli
6c00: 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77  te3:for-each-row
6c10: 20 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28   .     (lambda (
6c20: 70 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20  p).       (set! 
6c30: 72 65 73 20 28 63 6f 6e 73 20 70 20 72 65 73 29  res (cons p res)
6c40: 29 29 0a 20 20 20 20 20 64 62 20 0a 20 20 20 20  )).     db .    
6c50: 20 71 72 79 73 74 72 29 0a 20 20 20 20 72 65 73   qrystr).    res
6c60: 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ))..;;==========
6c70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6c80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6c90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6ca0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20  ============.;; 
6cb0: 51 55 45 55 45 20 55 50 20 4d 45 54 41 2c 20 54  QUEUE UP META, T
6cc0: 45 53 54 20 53 54 41 54 55 53 20 41 4e 44 20 53  EST STATUS AND S
6cd0: 54 45 50 53 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d  TEPS.;;=========
6ce0: 3d 3d 3d 3d 3d 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 0a 0a 28  =============..(
6d20: 64 65 66 69 6e 65 20 28 64 62 3a 75 70 64 61 74  define (db:updat
6d30: 65 72 20 64 62 29 0a 20 20 28 6c 65 74 20 6c 6f  er db).  (let lo
6d40: 6f 70 20 28 28 73 74 61 72 74 2d 74 69 6d 65 20  op ((start-time 
6d50: 28 63 75 72 72 65 6e 74 2d 74 69 6d 65 29 29 29  (current-time)))
6d60: 0a 20 20 20 20 28 74 68 72 65 61 64 2d 73 6c 65  .    (thread-sle
6d70: 65 70 21 20 30 2e 35 29 20 3b 3b 20 6d 6f 76 65  ep! 0.5) ;; move
6d80: 20 73 61 76 65 20 74 69 6d 65 20 61 72 6f 75 6e   save time aroun
6d90: 64 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 72 65  d to minimize re
6da0: 67 75 6c 61 72 20 63 6f 6c 6c 69 73 69 6f 6e 73  gular collisions
6db0: 3f 0a 20 20 20 20 28 64 62 3a 77 72 69 74 65 2d  ?.    (db:write-
6dc0: 63 61 63 68 65 64 2d 64 61 74 61 20 64 62 29 0a  cached-data db).
6dd0: 20 20 20 20 28 6c 6f 6f 70 20 73 74 61 72 74 2d      (loop start-
6de0: 74 69 6d 65 29 29 29 0a 20 20 20 20 0a 28 64 65  time))).    .(de
6df0: 66 69 6e 65 20 28 64 62 3a 74 65 73 74 2d 75 70  fine (db:test-up
6e00: 64 61 74 65 2d 6d 65 74 61 2d 69 6e 66 6f 20 64  date-meta-info d
6e10: 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61  b run-id test-na
6e20: 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 6d 69 6e  me item-path min
6e30: 75 74 65 73 20 63 70 75 6c 6f 61 64 20 64 69 73  utes cpuload dis
6e40: 6b 66 72 65 65 20 74 6d 70 66 72 65 65 29 0a 20  kfree tmpfree). 
6e50: 20 28 69 66 20 28 6e 6f 74 20 69 74 65 6d 2d 70   (if (not item-p
6e60: 61 74 68 29 0a 20 20 20 20 20 20 28 62 65 67 69  ath).      (begi
6e70: 6e 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 30  n (debug:print 0
6e80: 20 22 57 41 52 4e 49 4e 47 3a 20 49 54 45 4d 50   "WARNING: ITEMP
6e90: 41 54 48 20 6e 6f 74 20 73 65 74 2e 22 29 20 20  ATH not set.")  
6ea0: 20 0a 09 20 20 20 20 20 28 73 65 74 21 20 69 74   ..     (set! it
6eb0: 65 6d 2d 70 61 74 68 20 22 22 29 29 29 0a 20 20  em-path ""))).  
6ec0: 28 6d 75 74 65 78 2d 6c 6f 63 6b 21 20 2a 69 6e  (mutex-lock! *in
6ed0: 63 6f 6d 69 6e 67 2d 6d 75 74 65 78 2a 29 0a 20  coming-mutex*). 
6ee0: 20 28 73 65 74 21 20 2a 69 6e 63 6f 6d 69 6e 67   (set! *incoming
6ef0: 2d 64 61 74 61 2a 20 28 63 6f 6e 73 20 28 76 65  -data* (cons (ve
6f00: 63 74 6f 72 20 27 6d 65 74 61 2d 69 6e 66 6f 0a  ctor 'meta-info.
6f10: 09 09 09 09 20 20 20 20 20 20 28 63 75 72 72 65  ....      (curre
6f20: 6e 74 2d 73 65 63 6f 6e 64 73 29 0a 09 09 09 09  nt-seconds).....
6f30: 20 20 20 20 20 20 28 6c 69 73 74 20 63 70 75 6c        (list cpul
6f40: 6f 61 64 0a 09 09 09 09 09 20 20 20 20 64 69 73  oad......    dis
6f50: 6b 66 72 65 65 0a 09 09 09 09 09 20 20 20 20 6d  kfree......    m
6f60: 69 6e 75 74 65 73 0a 09 09 09 09 09 20 20 20 20  inutes......    
6f70: 72 75 6e 2d 69 64 0a 09 09 09 09 09 20 20 20 20  run-id......    
6f80: 74 65 73 74 2d 6e 61 6d 65 0a 09 09 09 09 09 20  test-name...... 
6f90: 20 20 20 69 74 65 6d 2d 70 61 74 68 29 29 20 3b     item-path)) ;
6fa0: 3b 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61  ; run-id test-na
6fb0: 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 6d 69 6e  me item-path min
6fc0: 75 74 65 73 20 63 70 75 6c 6f 61 64 20 64 69 73  utes cpuload dis
6fd0: 6b 66 72 65 65 20 74 6d 70 66 72 65 65 29 20 0a  kfree tmpfree) .
6fe0: 09 09 09 20 20 20 20 20 20 2a 69 6e 63 6f 6d 69  ...      *incomi
6ff0: 6e 67 2d 64 61 74 61 2a 29 29 0a 20 20 28 6d 75  ng-data*)).  (mu
7000: 74 65 78 2d 75 6e 6c 6f 63 6b 21 20 2a 69 6e 63  tex-unlock! *inc
7010: 6f 6d 69 6e 67 2d 6d 75 74 65 78 2a 29 0a 20 20  oming-mutex*).  
7020: 28 69 66 20 28 6e 6f 74 20 2a 63 61 63 68 65 2d  (if (not *cache-
7030: 6f 6e 2a 29 28 64 62 3a 77 72 69 74 65 2d 63 61  on*)(db:write-ca
7040: 63 68 65 64 2d 64 61 74 61 20 64 62 29 29 29 0a  ched-data db))).
7050: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 77 72 69  .(define (db:wri
7060: 74 65 2d 63 61 63 68 65 64 2d 64 61 74 61 20 64  te-cached-data d
7070: 62 29 0a 20 20 28 6c 65 74 20 28 28 6d 65 74 61  b).  (let ((meta
7080: 2d 73 74 6d 74 20 28 73 71 6c 69 74 65 33 3a 70  -stmt (sqlite3:p
7090: 72 65 70 61 72 65 20 64 62 20 22 55 50 44 41 54  repare db "UPDAT
70a0: 45 20 74 65 73 74 73 20 53 45 54 20 63 70 75 6c  E tests SET cpul
70b0: 6f 61 64 3d 3f 2c 64 69 73 6b 66 72 65 65 3d 3f  oad=?,diskfree=?
70c0: 2c 72 75 6e 5f 64 75 72 61 74 69 6f 6e 3d 3f 2c  ,run_duration=?,
70d0: 73 74 61 74 65 3d 27 52 55 4e 4e 49 4e 47 27 20  state='RUNNING' 
70e0: 57 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41  WHERE run_id=? A
70f0: 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e  ND testname=? AN
7100: 44 20 69 74 65 6d 5f 70 61 74 68 3d 3f 20 41 4e  D item_path=? AN
7110: 44 20 73 74 61 74 65 20 4e 4f 54 20 49 4e 20 28  D state NOT IN (
7120: 27 43 4f 4d 50 4c 45 54 45 44 27 2c 27 4b 49 4c  'COMPLETED','KIL
7130: 4c 52 45 51 27 2c 27 4b 49 4c 4c 45 44 27 29 3b  LREQ','KILLED');
7140: 22 29 29 0a 09 28 73 74 65 70 2d 73 74 6d 74 20  "))..(step-stmt 
7150: 28 73 71 6c 69 74 65 33 3a 70 72 65 70 61 72 65  (sqlite3:prepare
7160: 20 64 62 20 22 49 4e 53 45 52 54 20 4f 52 20 52   db "INSERT OR R
7170: 45 50 4c 41 43 45 20 69 6e 74 6f 20 74 65 73 74  EPLACE into test
7180: 5f 73 74 65 70 73 20 28 74 65 73 74 5f 69 64 2c  _steps (test_id,
7190: 73 74 65 70 6e 61 6d 65 2c 73 74 61 74 65 2c 73  stepname,state,s
71a0: 74 61 74 75 73 2c 65 76 65 6e 74 5f 74 69 6d 65  tatus,event_time
71b0: 2c 63 6f 6d 6d 65 6e 74 2c 6c 6f 67 66 69 6c 65  ,comment,logfile
71c0: 29 20 56 41 4c 55 45 53 28 3f 2c 3f 2c 3f 2c 3f  ) VALUES(?,?,?,?
71d0: 2c 3f 2c 3f 2c 3f 29 3b 22 29 29 20 3b 3b 20 73  ,?,?,?);")) ;; s
71e0: 74 72 66 74 69 6d 65 28 27 25 73 27 2c 27 6e 6f  trftime('%s','no
71f0: 77 27 29 23 66 29 0a 09 28 64 61 74 61 20 28 73  w')#f)..(data (s
7200: 6f 72 74 20 2a 69 6e 63 6f 6d 69 6e 67 2d 64 61  ort *incoming-da
7210: 74 61 2a 20 28 6c 61 6d 62 64 61 20 28 61 20 62  ta* (lambda (a b
7220: 29 28 3c 20 28 76 65 63 74 6f 72 2d 72 65 66 20  )(< (vector-ref 
7230: 61 20 31 29 28 76 65 63 74 6f 72 2d 72 65 66 20  a 1)(vector-ref 
7240: 62 20 31 29 29 29 29 29 29 0a 20 20 20 20 28 69  b 1)))))).    (i
7250: 66 20 28 3e 20 28 6c 65 6e 67 74 68 20 64 61 74  f (> (length dat
7260: 61 29 20 30 29 0a 09 28 64 65 62 75 67 3a 70 72  a) 0)..(debug:pr
7270: 69 6e 74 20 34 20 22 57 72 69 74 69 6e 67 20 63  int 4 "Writing c
7280: 61 63 68 65 64 20 64 61 74 61 20 22 20 64 61 74  ached data " dat
7290: 61 29 29 0a 20 20 20 20 28 6d 75 74 65 78 2d 6c  a)).    (mutex-l
72a0: 6f 63 6b 21 20 2a 69 6e 63 6f 6d 69 6e 67 2d 6d  ock! *incoming-m
72b0: 75 74 65 78 2a 29 0a 20 20 20 20 28 73 71 6c 69  utex*).    (sqli
72c0: 74 65 33 3a 77 69 74 68 2d 74 72 61 6e 73 61 63  te3:with-transac
72d0: 74 69 6f 6e 20 0a 20 20 20 20 20 64 62 0a 20 20  tion .     db.  
72e0: 20 20 20 28 6c 61 6d 62 64 61 20 28 29 0a 20 20     (lambda ().  
72f0: 20 20 20 20 20 28 66 6f 72 2d 65 61 63 68 20 28       (for-each (
7300: 6c 61 6d 62 64 61 20 28 65 6e 74 72 79 29 0a 09  lambda (entry)..
7310: 09 20 20 20 28 63 61 73 65 20 28 76 65 63 74 6f  .   (case (vecto
7320: 72 2d 72 65 66 20 65 6e 74 72 79 20 30 29 0a 09  r-ref entry 0)..
7330: 09 20 20 20 20 20 28 28 6d 65 74 61 2d 69 6e 66  .     ((meta-inf
7340: 6f 29 0a 09 09 20 20 20 20 20 20 28 61 70 70 6c  o)...      (appl
7350: 79 20 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74  y sqlite3:execut
7360: 65 20 6d 65 74 61 2d 73 74 6d 74 20 28 76 65 63  e meta-stmt (vec
7370: 74 6f 72 2d 72 65 66 20 65 6e 74 72 79 20 32 29  tor-ref entry 2)
7380: 29 29 0a 09 09 20 20 20 20 20 28 28 73 74 65 70  ))...     ((step
7390: 2d 73 74 61 74 75 73 29 0a 09 09 20 20 20 20 20  -status)...     
73a0: 20 28 61 70 70 6c 79 20 73 71 6c 69 74 65 33 3a   (apply sqlite3:
73b0: 65 78 65 63 75 74 65 20 73 74 65 70 2d 73 74 6d  execute step-stm
73c0: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 65 6e  t (vector-ref en
73d0: 74 72 79 20 32 29 29 29 0a 09 09 20 20 20 20 20  try 2)))...     
73e0: 28 65 6c 73 65 0a 09 09 20 20 20 20 20 20 28 64  (else...      (d
73f0: 65 62 75 67 3a 70 72 69 6e 74 20 30 20 22 45 52  ebug:print 0 "ER
7400: 52 4f 52 3a 20 51 75 65 75 65 64 20 65 6e 74 72  ROR: Queued entr
7410: 79 20 6e 6f 74 20 72 65 63 6f 67 6e 69 73 65 64  y not recognised
7420: 20 22 20 65 6e 74 72 79 29 29 29 29 0a 09 09 20   " entry))))... 
7430: 64 61 74 61 29 29 29 0a 20 20 20 20 28 73 65 74  data))).    (set
7440: 21 20 2a 69 6e 63 6f 6d 69 6e 67 2d 64 61 74 61  ! *incoming-data
7450: 2a 20 27 28 29 29 0a 20 20 20 20 28 6d 75 74 65  * '()).    (mute
7460: 78 2d 75 6e 6c 6f 63 6b 21 20 2a 69 6e 63 6f 6d  x-unlock! *incom
7470: 69 6e 67 2d 6d 75 74 65 78 2a 29 0a 20 20 20 20  ing-mutex*).    
7480: 28 73 71 6c 69 74 65 33 3a 66 69 6e 61 6c 69 7a  (sqlite3:finaliz
7490: 65 21 20 6d 65 74 61 2d 73 74 6d 74 29 0a 20 20  e! meta-stmt).  
74a0: 20 20 28 73 71 6c 69 74 65 33 3a 66 69 6e 61 6c    (sqlite3:final
74b0: 69 7a 65 21 20 73 74 65 70 2d 73 74 6d 74 29 29  ize! step-stmt))
74c0: 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 72  )..(define (db:r
74d0: 6f 6c 6c 2d 75 70 2d 70 61 73 73 2d 66 61 69 6c  oll-up-pass-fail
74e0: 2d 63 6f 75 6e 74 73 20 64 62 20 72 75 6e 2d 69  -counts db run-i
74f0: 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d  d test-name item
7500: 2d 70 61 74 68 20 73 74 61 74 75 73 29 0a 20 20  -path status).  
7510: 28 69 66 20 28 61 6e 64 20 28 6e 6f 74 20 28 65  (if (and (not (e
7520: 71 75 61 6c 3f 20 69 74 65 6d 2d 70 61 74 68 20  qual? item-path 
7530: 22 22 29 29 0a 09 20 20 20 28 6f 72 20 28 65 71  ""))..   (or (eq
7540: 75 61 6c 3f 20 73 74 61 74 75 73 20 22 50 41 53  ual? status "PAS
7550: 53 22 29 0a 09 20 20 20 20 20 20 20 28 65 71 75  S")..       (equ
7560: 61 6c 3f 20 73 74 61 74 75 73 20 22 57 41 52 4e  al? status "WARN
7570: 22 29 0a 09 20 20 20 20 20 20 20 28 65 71 75 61  ")..       (equa
7580: 6c 3f 20 73 74 61 74 75 73 20 22 46 41 49 4c 22  l? status "FAIL"
7590: 29 0a 09 20 20 20 20 20 20 20 28 65 71 75 61 6c  )..       (equal
75a0: 3f 20 73 74 61 74 75 73 20 22 57 41 49 56 45 44  ? status "WAIVED
75b0: 22 29 0a 09 20 20 20 20 20 20 20 28 65 71 75 61  ")..       (equa
75c0: 6c 3f 20 73 74 61 74 75 73 20 22 52 55 4e 4e 49  l? status "RUNNI
75d0: 4e 47 22 29 29 29 0a 20 20 20 20 20 20 28 62 65  NG"))).      (be
75e0: 67 69 6e 0a 09 28 73 71 6c 69 74 65 33 3a 65 78  gin..(sqlite3:ex
75f0: 65 63 75 74 65 20 0a 09 20 64 62 0a 09 20 22 55  ecute .. db.. "U
7600: 50 44 41 54 45 20 74 65 73 74 73 20 0a 20 20 20  PDATE tests .   
7610: 20 20 20 20 20 20 20 20 20 20 53 45 54 20 66 61            SET fa
7620: 69 6c 5f 63 6f 75 6e 74 3d 28 53 45 4c 45 43 54  il_count=(SELECT
7630: 20 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20   count(id) FROM 
7640: 74 65 73 74 73 20 57 48 45 52 45 20 72 75 6e 5f  tests WHERE run_
7650: 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d  id=? AND testnam
7660: 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74  e=? AND item_pat
7670: 68 20 21 3d 20 27 27 20 41 4e 44 20 73 74 61 74  h != '' AND stat
7680: 75 73 3d 27 46 41 49 4c 27 29 2c 0a 20 20 20 20  us='FAIL'),.    
7690: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 73               pas
76a0: 73 5f 63 6f 75 6e 74 3d 28 53 45 4c 45 43 54 20  s_count=(SELECT 
76b0: 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 74  count(id) FROM t
76c0: 65 73 74 73 20 57 48 45 52 45 20 72 75 6e 5f 69  ests WHERE run_i
76d0: 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65  d=? AND testname
76e0: 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68  =? AND item_path
76f0: 20 21 3d 20 27 27 20 41 4e 44 20 28 73 74 61 74   != '' AND (stat
7700: 75 73 3d 27 50 41 53 53 27 20 4f 52 20 73 74 61  us='PASS' OR sta
7710: 74 75 73 3d 27 57 41 52 4e 27 20 4f 52 20 73 74  tus='WARN' OR st
7720: 61 74 75 73 3d 27 57 41 49 56 45 44 27 29 29 0a  atus='WAIVED')).
7730: 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
7740: 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20  RE run_id=? AND 
7750: 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69  testname=? AND i
7760: 74 65 6d 5f 70 61 74 68 3d 27 27 3b 22 0a 09 20  tem_path='';".. 
7770: 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65  run-id test-name
7780: 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d   run-id test-nam
7790: 65 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61  e run-id test-na
77a0: 6d 65 29 0a 09 28 69 66 20 28 65 71 75 61 6c 3f  me)..(if (equal?
77b0: 20 73 74 61 74 75 73 20 22 52 55 4e 4e 49 4e 47   status "RUNNING
77c0: 22 29 20 3b 3b 20 72 75 6e 6e 69 6e 67 20 74 61  ") ;; running ta
77d0: 6b 65 73 20 70 72 69 6f 72 69 74 79 20 6f 76 65  kes priority ove
77e0: 72 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 61 74  r all other stat
77f0: 65 73 2c 20 66 6f 72 63 65 20 74 68 65 20 74 65  es, force the te
7800: 73 74 20 73 74 61 74 65 20 74 6f 20 52 55 4e 4e  st state to RUNN
7810: 49 4e 47 0a 09 20 20 20 20 28 73 71 6c 69 74 65  ING..    (sqlite
7820: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 55 50  3:execute db "UP
7830: 44 41 54 45 20 74 65 73 74 73 20 53 45 54 20 73  DATE tests SET s
7840: 74 61 74 65 3d 3f 20 57 48 45 52 45 20 72 75 6e  tate=? WHERE run
7850: 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61  _id=? AND testna
7860: 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61  me=? AND item_pa
7870: 74 68 3d 27 27 3b 22 20 22 52 55 4e 4e 49 4e 47  th='';" "RUNNING
7880: 22 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61  " run-id test-na
7890: 6d 65 29 0a 09 20 20 20 20 28 73 71 6c 69 74 65  me)..    (sqlite
78a0: 33 3a 65 78 65 63 75 74 65 0a 09 20 20 20 20 20  3:execute..     
78b0: 64 62 0a 09 20 20 20 20 20 22 55 50 44 41 54 45  db..     "UPDATE
78c0: 20 74 65 73 74 73 0a 20 20 20 20 20 20 20 20 20   tests.         
78d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 45                SE
78e0: 54 20 73 74 61 74 65 3d 43 41 53 45 20 57 48 45  T state=CASE WHE
78f0: 4e 20 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  N (SELECT count(
7900: 69 64 29 20 46 52 4f 4d 20 74 65 73 74 73 20 57  id) FROM tests W
7910: 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e  HERE run_id=? AN
7920: 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44  D testname=? AND
7930: 20 69 74 65 6d 5f 70 61 74 68 20 21 3d 20 27 27   item_path != ''
7940: 20 41 4e 44 20 73 74 61 74 65 20 69 6e 20 28 27   AND state in ('
7950: 52 55 4e 4e 49 4e 47 27 2c 27 4e 4f 54 5f 53 54  RUNNING','NOT_ST
7960: 41 52 54 45 44 27 29 29 20 3e 20 30 20 54 48 45  ARTED')) > 0 THE
7970: 4e 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  N .             
7980: 20 20 20 20 20 20 20 20 20 20 20 20 20 27 52 55               'RU
7990: 4e 4e 49 4e 47 27 0a 20 20 20 20 20 20 20 20 20  NNING'.         
79a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 4c                EL
79b0: 53 45 20 27 43 4f 4d 50 4c 45 54 45 44 27 20 45  SE 'COMPLETED' E
79c0: 4e 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ND,.            
79d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
79e0: 61 74 75 73 3d 43 41 53 45 20 57 48 45 4e 20 66  atus=CASE WHEN f
79f0: 61 69 6c 5f 63 6f 75 6e 74 20 3e 20 30 20 54 48  ail_count > 0 TH
7a00: 45 4e 20 27 46 41 49 4c 27 20 57 48 45 4e 20 70  EN 'FAIL' WHEN p
7a10: 61 73 73 5f 63 6f 75 6e 74 20 3e 20 30 20 41 4e  ass_count > 0 AN
7a20: 44 20 66 61 69 6c 5f 63 6f 75 6e 74 3d 30 20 54  D fail_count=0 T
7a30: 48 45 4e 20 27 50 41 53 53 27 20 45 4c 53 45 20  HEN 'PASS' ELSE 
7a40: 27 55 4e 4b 4e 4f 57 4e 27 20 45 4e 44 0a 20 20  'UNKNOWN' END.  
7a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7a60: 20 20 20 20 20 57 48 45 52 45 20 72 75 6e 5f 69       WHERE run_i
7a70: 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65  d=? AND testname
7a80: 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68  =? AND item_path
7a90: 3d 27 27 3b 22 0a 09 20 20 20 20 20 72 75 6e 2d  ='';"..     run-
7aa0: 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 72 75 6e  id test-name run
7ab0: 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 29 29 29  -id test-name)))
7ac0: 29 29 0a 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d  ))...;;=========
7ad0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7ae0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7af0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7b00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b  =============.;;
7b10: 20 54 65 73 74 73 20 6d 65 74 61 20 64 61 74 61   Tests meta data
7b20: 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  .;;=============
7b30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7b40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7b50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7b60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 72 65  =========..;; re
7b70: 61 64 20 74 68 65 20 72 65 63 6f 72 64 20 67 69  ad the record gi
7b80: 76 65 6e 20 61 20 74 65 73 74 6e 61 6d 65 0a 28  ven a testname.(
7b90: 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74 6d  define (db:testm
7ba0: 65 74 61 2d 67 65 74 2d 72 65 63 6f 72 64 20 64  eta-get-record d
7bb0: 62 20 74 65 73 74 6e 61 6d 65 29 0a 20 20 28 6c  b testname).  (l
7bc0: 65 74 20 28 28 72 65 73 20 23 66 29 29 0a 20 20  et ((res #f)).  
7bd0: 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65    (sqlite3:for-e
7be0: 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61  ach-row.     (la
7bf0: 6d 62 64 61 20 28 69 64 20 74 65 73 74 6e 61 6d  mbda (id testnam
7c00: 65 20 61 75 74 68 6f 72 20 6f 77 6e 65 72 20 64  e author owner d
7c10: 65 73 63 72 69 70 74 69 6f 6e 20 72 65 76 69 65  escription revie
7c20: 77 65 64 20 69 74 65 72 61 74 65 64 20 61 76 67  wed iterated avg
7c30: 5f 72 75 6e 74 69 6d 65 20 61 76 67 5f 64 69 73  _runtime avg_dis
7c40: 6b 20 74 61 67 73 29 0a 20 20 20 20 20 20 20 28  k tags).       (
7c50: 73 65 74 21 20 72 65 73 20 28 76 65 63 74 6f 72  set! res (vector
7c60: 20 69 64 20 74 65 73 74 6e 61 6d 65 20 61 75 74   id testname aut
7c70: 68 6f 72 20 6f 77 6e 65 72 20 64 65 73 63 72 69  hor owner descri
7c80: 70 74 69 6f 6e 20 72 65 76 69 65 77 65 64 20 69  ption reviewed i
7c90: 74 65 72 61 74 65 64 20 61 76 67 5f 72 75 6e 74  terated avg_runt
7ca0: 69 6d 65 20 61 76 67 5f 64 69 73 6b 20 74 61 67  ime avg_disk tag
7cb0: 73 29 29 29 0a 20 20 20 20 20 64 62 20 22 53 45  s))).     db "SE
7cc0: 4c 45 43 54 20 69 64 2c 74 65 73 74 6e 61 6d 65  LECT id,testname
7cd0: 2c 61 75 74 68 6f 72 2c 6f 77 6e 65 72 2c 64 65  ,author,owner,de
7ce0: 73 63 72 69 70 74 69 6f 6e 2c 72 65 76 69 65 77  scription,review
7cf0: 65 64 2c 69 74 65 72 61 74 65 64 2c 61 76 67 5f  ed,iterated,avg_
7d00: 72 75 6e 74 69 6d 65 2c 61 76 67 5f 64 69 73 6b  runtime,avg_disk
7d10: 2c 74 61 67 73 20 46 52 4f 4d 20 74 65 73 74 5f  ,tags FROM test_
7d20: 6d 65 74 61 20 57 48 45 52 45 20 74 65 73 74 6e  meta WHERE testn
7d30: 61 6d 65 3d 3f 3b 22 0a 20 20 20 20 20 74 65 73  ame=?;".     tes
7d40: 74 6e 61 6d 65 29 0a 20 20 20 20 72 65 73 29 29  tname).    res))
7d50: 0a 0a 3b 3b 20 63 72 65 61 74 65 20 61 20 6e 65  ..;; create a ne
7d60: 77 20 72 65 63 6f 72 64 20 66 6f 72 20 61 20 67  w record for a g
7d70: 69 76 65 6e 20 74 65 73 74 6e 61 6d 65 0a 28 64  iven testname.(d
7d80: 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74 6d 65  efine (db:testme
7d90: 74 61 2d 61 64 64 2d 72 65 63 6f 72 64 20 64 62  ta-add-record db
7da0: 20 74 65 73 74 6e 61 6d 65 29 0a 20 20 28 73 71   testname).  (sq
7db0: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62  lite3:execute db
7dc0: 20 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f   "INSERT OR IGNO
7dd0: 52 45 20 49 4e 54 4f 20 74 65 73 74 5f 6d 65 74  RE INTO test_met
7de0: 61 20 28 74 65 73 74 6e 61 6d 65 2c 61 75 74 68  a (testname,auth
7df0: 6f 72 2c 6f 77 6e 65 72 2c 64 65 73 63 72 69 70  or,owner,descrip
7e00: 74 69 6f 6e 2c 72 65 76 69 65 77 65 64 2c 69 74  tion,reviewed,it
7e10: 65 72 61 74 65 64 2c 61 76 67 5f 72 75 6e 74 69  erated,avg_runti
7e20: 6d 65 2c 61 76 67 5f 64 69 73 6b 2c 74 61 67 73  me,avg_disk,tags
7e30: 29 20 56 41 4c 55 45 53 20 28 3f 2c 27 27 2c 27  ) VALUES (?,'','
7e40: 27 2c 27 27 2c 27 27 2c 27 27 2c 27 27 2c 27 27  ','','','','',''
7e50: 2c 27 27 29 3b 22 20 74 65 73 74 6e 61 6d 65 29  ,'');" testname)
7e60: 29 0a 0a 3b 3b 20 75 70 64 61 74 65 20 6f 6e 65  )..;; update one
7e70: 20 6f 66 20 74 68 65 20 74 65 73 74 6d 65 74 61   of the testmeta
7e80: 20 66 69 65 6c 64 73 0a 28 64 65 66 69 6e 65 20   fields.(define 
7e90: 28 64 62 3a 74 65 73 74 6d 65 74 61 2d 75 70 64  (db:testmeta-upd
7ea0: 61 74 65 2d 66 69 65 6c 64 20 64 62 20 74 65 73  ate-field db tes
7eb0: 74 6e 61 6d 65 20 66 69 65 6c 64 20 76 61 6c 75  tname field valu
7ec0: 65 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78  e).  (sqlite3:ex
7ed0: 65 63 75 74 65 20 64 62 20 28 63 6f 6e 63 20 22  ecute db (conc "
7ee0: 55 50 44 41 54 45 20 74 65 73 74 5f 6d 65 74 61  UPDATE test_meta
7ef0: 20 53 45 54 20 22 20 66 69 65 6c 64 20 22 3d 3f   SET " field "=?
7f00: 20 57 48 45 52 45 20 74 65 73 74 6e 61 6d 65 3d   WHERE testname=
7f10: 3f 3b 22 29 20 76 61 6c 75 65 20 74 65 73 74 6e  ?;") value testn
7f20: 61 6d 65 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d  ame))..;;=======
7f30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7f40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7f50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7f60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a  ===============.
7f70: 3b 3b 20 54 20 45 20 53 20 54 20 20 20 44 20 41  ;; T E S T   D A
7f80: 20 54 20 41 20 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d   T A .;;========
7f90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7fa0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7fb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7fc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a  ==============..
7fd0: 28 64 65 66 69 6e 65 20 28 64 62 3a 63 73 76 2d  (define (db:csv-
7fe0: 3e 74 65 73 74 2d 64 61 74 61 20 64 62 20 74 65  >test-data db te
7ff0: 73 74 2d 69 64 20 63 73 76 64 61 74 61 29 0a 20  st-id csvdata). 
8000: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20   (debug:print 4 
8010: 22 74 65 73 74 2d 69 64 20 22 20 74 65 73 74 2d  "test-id " test-
8020: 69 64 20 22 2c 20 63 73 76 64 61 74 61 3a 20 22  id ", csvdata: "
8030: 20 63 73 76 64 61 74 61 29 0a 20 20 28 6c 65 74   csvdata).  (let
8040: 20 28 28 63 73 76 6c 69 73 74 20 28 63 73 76 2d   ((csvlist (csv-
8050: 3e 6c 69 73 74 20 28 6d 61 6b 65 2d 63 73 76 2d  >list (make-csv-
8060: 72 65 61 64 65 72 0a 09 09 09 20 20 20 20 20 28  reader....     (
8070: 6f 70 65 6e 2d 69 6e 70 75 74 2d 73 74 72 69 6e  open-input-strin
8080: 67 20 63 73 76 64 61 74 61 29 0a 09 09 09 20 20  g csvdata)....  
8090: 20 20 20 27 28 28 73 74 72 69 70 2d 6c 65 61 64     '((strip-lead
80a0: 69 6e 67 2d 77 68 69 74 65 73 70 61 63 65 3f 20  ing-whitespace? 
80b0: 23 74 29 0a 09 09 09 20 20 20 20 20 20 20 28 73  #t)....       (s
80c0: 74 72 69 70 2d 74 72 61 69 6c 69 6e 67 2d 77 68  trip-trailing-wh
80d0: 69 74 65 73 70 61 63 65 3f 20 23 74 29 29 20 29  itespace? #t)) )
80e0: 29 29 29 20 3b 3b 20 28 63 73 76 2d 3e 6c 69 73  ))) ;; (csv->lis
80f0: 74 20 63 73 76 64 61 74 61 29 29 29 0a 20 20 20  t csvdata))).   
8100: 20 28 66 6f 72 2d 65 61 63 68 20 0a 20 20 20 20   (for-each .    
8110: 20 28 6c 61 6d 62 64 61 20 28 63 73 76 72 6f 77   (lambda (csvrow
8120: 29 0a 20 20 20 20 20 20 20 28 6c 65 74 2a 20 28  ).       (let* (
8130: 28 70 61 64 64 65 64 2d 72 6f 77 20 20 28 74 61  (padded-row  (ta
8140: 6b 65 20 28 61 70 70 65 6e 64 20 63 73 76 72 6f  ke (append csvro
8150: 77 20 28 6c 69 73 74 20 23 66 20 23 66 20 23 66  w (list #f #f #f
8160: 20 23 66 20 23 66 20 23 66 20 23 66 20 23 66 20   #f #f #f #f #f 
8170: 23 66 29 29 20 39 29 29 0a 09 20 20 20 20 20 20  #f)) 9))..      
8180: 28 63 61 74 65 67 6f 72 79 20 20 20 20 28 6c 69  (category    (li
8190: 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f  st-ref padded-ro
81a0: 77 20 30 29 29 0a 09 20 20 20 20 20 20 28 76 61  w 0))..      (va
81b0: 72 69 61 62 6c 65 20 20 20 20 28 6c 69 73 74 2d  riable    (list-
81c0: 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20 31  ref padded-row 1
81d0: 29 29 0a 09 20 20 20 20 20 20 28 76 61 6c 75 65  ))..      (value
81e0: 20 20 20 20 20 20 20 28 61 6e 79 2d 3e 6e 75 6d         (any->num
81f0: 62 65 72 2d 69 66 2d 70 6f 73 73 69 62 6c 65 20  ber-if-possible 
8200: 28 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65 64  (list-ref padded
8210: 2d 72 6f 77 20 32 29 29 29 0a 09 20 20 20 20 20  -row 2)))..     
8220: 20 28 65 78 70 65 63 74 65 64 20 20 20 20 28 61   (expected    (a
8230: 6e 79 2d 3e 6e 75 6d 62 65 72 2d 69 66 2d 70 6f  ny->number-if-po
8240: 73 73 69 62 6c 65 20 28 6c 69 73 74 2d 72 65 66  ssible (list-ref
8250: 20 70 61 64 64 65 64 2d 72 6f 77 20 33 29 29 29   padded-row 3)))
8260: 0a 09 20 20 20 20 20 20 28 74 6f 6c 20 20 20 20  ..      (tol    
8270: 20 20 20 20 20 28 61 6e 79 2d 3e 6e 75 6d 62 65       (any->numbe
8280: 72 2d 69 66 2d 70 6f 73 73 69 62 6c 65 20 28 6c  r-if-possible (l
8290: 69 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d 72  ist-ref padded-r
82a0: 6f 77 20 34 29 29 29 20 3b 3b 20 3e 2c 20 3c 2c  ow 4))) ;; >, <,
82b0: 20 3e 3d 2c 20 3c 3d 2c 20 6f 72 20 61 20 6e 75   >=, <=, or a nu
82c0: 6d 62 65 72 0a 09 20 20 20 20 20 20 28 75 6e 69  mber..      (uni
82d0: 74 73 20 20 20 20 20 20 20 28 6c 69 73 74 2d 72  ts       (list-r
82e0: 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20 35 29  ef padded-row 5)
82f0: 29 0a 09 20 20 20 20 20 20 28 63 6f 6d 6d 65 6e  )..      (commen
8300: 74 20 20 20 20 20 28 6c 69 73 74 2d 72 65 66 20  t     (list-ref 
8310: 70 61 64 64 65 64 2d 72 6f 77 20 36 29 29 0a 09  padded-row 6))..
8320: 20 20 20 20 20 20 28 73 74 61 74 75 73 20 20 20        (status   
8330: 20 20 20 28 6c 65 74 20 28 28 73 20 28 6c 69 73     (let ((s (lis
8340: 74 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77  t-ref padded-row
8350: 20 37 29 29 29 0a 09 09 09 20 20 20 20 20 28 69   7)))....     (i
8360: 66 20 28 61 6e 64 20 28 73 74 72 69 6e 67 3f 20  f (and (string? 
8370: 73 29 28 6f 72 20 28 73 74 72 69 6e 67 2d 6d 61  s)(or (string-ma
8380: 74 63 68 20 28 72 65 67 65 78 70 20 22 5e 5c 5c  tch (regexp "^\\
8390: 73 2a 24 22 29 20 73 29 0a 09 09 09 09 09 09 20  s*$") s)....... 
83a0: 20 20 20 20 28 73 74 72 69 6e 67 2d 6d 61 74 63      (string-matc
83b0: 68 20 28 72 65 67 65 78 70 20 22 5e 6e 2f 61 24  h (regexp "^n/a$
83c0: 22 29 20 73 29 29 29 0a 09 09 09 09 20 23 66 0a  ") s)))..... #f.
83d0: 09 09 09 09 20 73 29 29 29 20 3b 3b 20 69 66 20  .... s))) ;; if 
83e0: 73 70 65 63 69 66 69 65 64 20 6f 6e 20 74 68 65  specified on the
83f0: 20 69 6e 70 75 74 20 74 68 65 6e 20 75 73 65 2c   input then use,
8400: 20 65 6c 73 65 20 63 61 6c 63 75 6c 61 74 65 0a   else calculate.
8410: 09 20 20 20 20 20 20 28 74 79 70 65 20 20 20 20  .      (type    
8420: 20 20 20 20 28 6c 69 73 74 2d 72 65 66 20 70 61      (list-ref pa
8430: 64 64 65 64 2d 72 6f 77 20 38 29 29 29 0a 09 20  dded-row 8))).. 
8440: 3b 3b 20 6c 6f 6f 6b 20 75 70 20 65 78 70 65 63  ;; look up expec
8450: 74 65 64 2c 74 6f 6c 2c 75 6e 69 74 73 20 66 72  ted,tol,units fr
8460: 6f 6d 20 70 72 65 76 69 6f 75 73 20 62 65 73 74  om previous best
8470: 20 66 69 74 20 74 65 73 74 20 69 66 20 74 68 65   fit test if the
8480: 79 20 61 72 65 20 61 6c 6c 20 65 69 74 68 65 72  y are all either
8490: 20 23 66 20 6f 72 20 27 27 0a 09 20 28 64 65 62   #f or ''.. (deb
84a0: 75 67 3a 70 72 69 6e 74 20 34 20 22 42 45 46 4f  ug:print 4 "BEFO
84b0: 52 45 3a 20 63 61 74 65 67 6f 72 79 3a 20 22 20  RE: category: " 
84c0: 63 61 74 65 67 6f 72 79 20 22 20 76 61 72 69 61  category " varia
84d0: 62 6c 65 3a 20 22 20 76 61 72 69 61 62 6c 65 20  ble: " variable 
84e0: 22 20 76 61 6c 75 65 3a 20 22 20 76 61 6c 75 65  " value: " value
84f0: 20 0a 09 09 20 20 20 20 20 20 22 2c 20 65 78 70   ...      ", exp
8500: 65 63 74 65 64 3a 20 22 20 65 78 70 65 63 74 65  ected: " expecte
8510: 64 20 22 20 74 6f 6c 3a 20 22 20 74 6f 6c 20 22  d " tol: " tol "
8520: 20 75 6e 69 74 73 3a 20 22 20 75 6e 69 74 73 20   units: " units 
8530: 22 20 73 74 61 74 75 73 3a 20 22 20 73 74 61 74  " status: " stat
8540: 75 73 20 22 20 63 6f 6d 6d 65 6e 74 3a 20 22 20  us " comment: " 
8550: 63 6f 6d 6d 65 6e 74 20 22 20 74 79 70 65 3a 20  comment " type: 
8560: 22 20 74 79 70 65 29 0a 0a 09 20 28 69 66 20 28  " type)... (if (
8570: 61 6e 64 20 28 6f 72 20 28 6e 6f 74 20 65 78 70  and (or (not exp
8580: 65 63 74 65 64 29 28 65 71 75 61 6c 3f 20 65 78  ected)(equal? ex
8590: 70 65 63 74 65 64 20 22 22 29 29 0a 09 09 20 20  pected ""))...  
85a0: 28 6f 72 20 28 6e 6f 74 20 74 6f 6c 29 20 20 20  (or (not tol)   
85b0: 20 20 28 65 71 75 61 6c 3f 20 65 78 70 65 63 74    (equal? expect
85c0: 65 64 20 22 22 29 29 0a 09 09 20 20 28 6f 72 20  ed ""))...  (or 
85d0: 28 6e 6f 74 20 75 6e 69 74 73 29 20 20 20 28 65  (not units)   (e
85e0: 71 75 61 6c 3f 20 65 78 70 65 63 74 65 64 20 22  qual? expected "
85f0: 22 29 29 29 0a 09 20 20 20 20 20 28 6c 65 74 2d  ")))..     (let-
8600: 76 61 6c 75 65 73 20 28 28 28 6e 65 77 2d 65 78  values (((new-ex
8610: 70 65 63 74 65 64 20 6e 65 77 2d 74 6f 6c 20 6e  pected new-tol n
8620: 65 77 2d 75 6e 69 74 73 29 28 64 62 3a 67 65 74  ew-units)(db:get
8630: 2d 70 72 65 76 2d 74 6f 6c 2d 66 6f 72 2d 74 65  -prev-tol-for-te
8640: 73 74 20 64 62 20 74 65 73 74 2d 69 64 20 63 61  st db test-id ca
8650: 74 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65 29  tegory variable)
8660: 29 29 0a 09 09 09 20 28 73 65 74 21 20 65 78 70  )).... (set! exp
8670: 65 63 74 65 64 20 6e 65 77 2d 65 78 70 65 63 74  ected new-expect
8680: 65 64 29 0a 09 09 09 20 28 73 65 74 21 20 74 6f  ed).... (set! to
8690: 6c 20 20 20 20 20 20 6e 65 77 2d 74 6f 6c 29 0a  l      new-tol).
86a0: 09 09 09 20 28 73 65 74 21 20 75 6e 69 74 73 20  ... (set! units 
86b0: 20 20 20 6e 65 77 2d 75 6e 69 74 73 29 29 29 0a     new-units))).
86c0: 0a 09 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20  .. (debug:print 
86d0: 34 20 22 41 46 54 45 52 3a 20 20 63 61 74 65 67  4 "AFTER:  categ
86e0: 6f 72 79 3a 20 22 20 63 61 74 65 67 6f 72 79 20  ory: " category 
86f0: 22 20 76 61 72 69 61 62 6c 65 3a 20 22 20 76 61  " variable: " va
8700: 72 69 61 62 6c 65 20 22 20 76 61 6c 75 65 3a 20  riable " value: 
8710: 22 20 76 61 6c 75 65 20 0a 09 09 20 20 20 20 20  " value ...     
8720: 20 22 2c 20 65 78 70 65 63 74 65 64 3a 20 22 20   ", expected: " 
8730: 65 78 70 65 63 74 65 64 20 22 20 74 6f 6c 3a 20  expected " tol: 
8740: 22 20 74 6f 6c 20 22 20 75 6e 69 74 73 3a 20 22  " tol " units: "
8750: 20 75 6e 69 74 73 20 22 20 73 74 61 74 75 73 3a   units " status:
8760: 20 22 20 73 74 61 74 75 73 20 22 20 63 6f 6d 6d   " status " comm
8770: 65 6e 74 3a 20 22 20 63 6f 6d 6d 65 6e 74 29 0a  ent: " comment).
8780: 09 20 3b 3b 20 63 61 6c 63 75 6c 61 74 65 20 73  . ;; calculate s
8790: 74 61 74 75 73 20 69 66 20 4e 4f 54 20 73 70 65  tatus if NOT spe
87a0: 63 69 66 69 65 64 0a 09 20 28 69 66 20 28 61 6e  cified.. (if (an
87b0: 64 20 28 6e 6f 74 20 73 74 61 74 75 73 29 28 6e  d (not status)(n
87c0: 75 6d 62 65 72 3f 20 65 78 70 65 63 74 65 64 29  umber? expected)
87d0: 28 6e 75 6d 62 65 72 3f 20 76 61 6c 75 65 29 29  (number? value))
87e0: 20 3b 3b 20 6e 65 65 64 20 65 78 70 65 63 74 65   ;; need expecte
87f0: 64 20 61 6e 64 20 76 61 6c 75 65 20 74 6f 20 62  d and value to b
8800: 65 20 6e 75 6d 62 65 72 73 0a 09 20 20 20 20 20  e numbers..     
8810: 28 69 66 20 28 6e 75 6d 62 65 72 3f 20 74 6f 6c  (if (number? tol
8820: 29 20 3b 3b 20 69 66 20 74 6f 6c 20 69 73 20 61  ) ;; if tol is a
8830: 20 6e 75 6d 62 65 72 20 74 68 65 6e 20 77 65 20   number then we 
8840: 64 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  do the standard 
8850: 63 6f 6d 70 61 72 69 73 6f 6e 0a 09 09 20 28 6c  comparison... (l
8860: 65 74 2a 20 28 28 6d 61 78 2d 76 61 6c 20 28 2b  et* ((max-val (+
8870: 20 65 78 70 65 63 74 65 64 20 74 6f 6c 29 29 0a   expected tol)).
8880: 09 09 09 28 6d 69 6e 2d 76 61 6c 20 28 2d 20 65  ...(min-val (- e
8890: 78 70 65 63 74 65 64 20 74 6f 6c 29 29 0a 09 09  xpected tol))...
88a0: 09 28 72 65 73 75 6c 74 20 20 28 61 6e 64 20 28  .(result  (and (
88b0: 3e 3d 20 20 76 61 6c 75 65 20 6d 69 6e 2d 76 61  >=  value min-va
88c0: 6c 29 28 3c 3d 20 76 61 6c 75 65 20 6d 61 78 2d  l)(<= value max-
88d0: 76 61 6c 29 29 29 29 0a 09 09 20 20 20 28 64 65  val))))...   (de
88e0: 62 75 67 3a 70 72 69 6e 74 20 34 20 22 6d 61 78  bug:print 4 "max
88f0: 2d 76 61 6c 3a 20 22 20 6d 61 78 2d 76 61 6c 20  -val: " max-val 
8900: 22 20 6d 69 6e 2d 76 61 6c 3a 20 22 20 6d 69 6e  " min-val: " min
8910: 2d 76 61 6c 20 22 20 72 65 73 75 6c 74 3a 20 22  -val " result: "
8920: 20 72 65 73 75 6c 74 29 0a 09 09 20 20 20 28 73   result)...   (s
8930: 65 74 21 20 73 74 61 74 75 73 20 28 69 66 20 72  et! status (if r
8940: 65 73 75 6c 74 20 22 70 61 73 73 22 20 22 66 61  esult "pass" "fa
8950: 69 6c 22 29 29 29 0a 09 09 20 28 73 65 74 21 20  il")))... (set! 
8960: 73 74 61 74 75 73 20 3b 3b 20 4e 42 2f 2f 20 6e  status ;; NB// n
8970: 65 65 64 20 74 6f 20 61 73 73 65 73 73 20 65 61  eed to assess ea
8980: 63 68 20 6f 6e 65 20 28 69 2e 65 2e 20 6e 6f 74  ch one (i.e. not
8990: 20 72 65 74 75 72 6e 20 6f 70 65 72 61 74 6f 72   return operator
89a0: 20 73 69 6e 63 65 20 6e 65 65 64 20 74 6f 20 61   since need to a
89b0: 63 74 20 69 66 20 6e 6f 74 20 76 61 6c 69 64 20  ct if not valid 
89c0: 6f 70 2e 0a 09 09 20 20 20 20 20 20 20 28 63 61  op....       (ca
89d0: 73 65 20 28 73 74 72 69 6e 67 2d 3e 73 79 6d 62  se (string->symb
89e0: 6f 6c 20 74 6f 6c 29 20 3b 3b 20 74 6f 6c 20 73  ol tol) ;; tol s
89f0: 68 6f 75 6c 64 20 62 65 20 3e 2c 20 3c 2c 20 3e  hould be >, <, >
8a00: 3d 2c 20 3c 3d 0a 09 09 09 20 28 28 3e 29 20 20  =, <=.... ((>)  
8a10: 28 69 66 20 28 3e 20 20 76 61 6c 75 65 20 65 78  (if (>  value ex
8a20: 70 65 63 74 65 64 29 20 22 70 61 73 73 22 20 22  pected) "pass" "
8a30: 66 61 69 6c 22 29 29 0a 09 09 09 20 28 28 3c 29  fail")).... ((<)
8a40: 20 20 28 69 66 20 28 3c 20 20 76 61 6c 75 65 20    (if (<  value 
8a50: 65 78 70 65 63 74 65 64 29 20 22 70 61 73 73 22  expected) "pass"
8a60: 20 22 66 61 69 6c 22 29 29 0a 09 09 09 20 28 28   "fail")).... ((
8a70: 3e 3d 29 20 28 69 66 20 28 3e 3d 20 76 61 6c 75  >=) (if (>= valu
8a80: 65 20 65 78 70 65 63 74 65 64 29 20 22 70 61 73  e expected) "pas
8a90: 73 22 20 22 66 61 69 6c 22 29 29 0a 09 09 09 20  s" "fail")).... 
8aa0: 28 28 3c 3d 29 20 28 69 66 20 28 3c 3d 20 76 61  ((<=) (if (<= va
8ab0: 6c 75 65 20 65 78 70 65 63 74 65 64 29 20 22 70  lue expected) "p
8ac0: 61 73 73 22 20 22 66 61 69 6c 22 29 29 0a 09 09  ass" "fail"))...
8ad0: 09 20 28 65 6c 73 65 20 28 63 6f 6e 63 20 22 45  . (else (conc "E
8ae0: 52 52 4f 52 3a 20 62 61 64 20 74 6f 6c 20 63 6f  RROR: bad tol co
8af0: 6d 70 61 72 61 74 6f 72 20 22 20 74 6f 6c 29 29  mparator " tol))
8b00: 29 29 29 29 0a 09 20 28 64 65 62 75 67 3a 70 72  )))).. (debug:pr
8b10: 69 6e 74 20 34 20 22 41 46 54 45 52 32 3a 20 63  int 4 "AFTER2: c
8b20: 61 74 65 67 6f 72 79 3a 20 22 20 63 61 74 65 67  ategory: " categ
8b30: 6f 72 79 20 22 20 76 61 72 69 61 62 6c 65 3a 20  ory " variable: 
8b40: 22 20 76 61 72 69 61 62 6c 65 20 22 20 76 61 6c  " variable " val
8b50: 75 65 3a 20 22 20 76 61 6c 75 65 20 0a 09 09 20  ue: " value ... 
8b60: 20 20 20 20 20 22 2c 20 65 78 70 65 63 74 65 64       ", expected
8b70: 3a 20 22 20 65 78 70 65 63 74 65 64 20 22 20 74  : " expected " t
8b80: 6f 6c 3a 20 22 20 74 6f 6c 20 22 20 75 6e 69 74  ol: " tol " unit
8b90: 73 3a 20 22 20 75 6e 69 74 73 20 22 20 73 74 61  s: " units " sta
8ba0: 74 75 73 3a 20 22 20 73 74 61 74 75 73 20 22 20  tus: " status " 
8bb0: 63 6f 6d 6d 65 6e 74 3a 20 22 20 63 6f 6d 6d 65  comment: " comme
8bc0: 6e 74 29 0a 09 20 28 73 71 6c 69 74 65 33 3a 65  nt).. (sqlite3:e
8bd0: 78 65 63 75 74 65 20 64 62 20 22 49 4e 53 45 52  xecute db "INSER
8be0: 54 20 4f 52 20 52 45 50 4c 41 43 45 20 49 4e 54  T OR REPLACE INT
8bf0: 4f 20 74 65 73 74 5f 64 61 74 61 20 28 74 65 73  O test_data (tes
8c00: 74 5f 69 64 2c 63 61 74 65 67 6f 72 79 2c 76 61  t_id,category,va
8c10: 72 69 61 62 6c 65 2c 76 61 6c 75 65 2c 65 78 70  riable,value,exp
8c20: 65 63 74 65 64 2c 74 6f 6c 2c 75 6e 69 74 73 2c  ected,tol,units,
8c30: 63 6f 6d 6d 65 6e 74 2c 73 74 61 74 75 73 2c 74  comment,status,t
8c40: 79 70 65 29 20 56 41 4c 55 45 53 20 28 3f 2c 3f  ype) VALUES (?,?
8c50: 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f  ,?,?,?,?,?,?,?,?
8c60: 29 3b 22 0a 09 09 09 20 20 74 65 73 74 2d 69 64  );"....  test-id
8c70: 20 63 61 74 65 67 6f 72 79 20 76 61 72 69 61 62   category variab
8c80: 6c 65 20 76 61 6c 75 65 20 65 78 70 65 63 74 65  le value expecte
8c90: 64 20 74 6f 6c 20 75 6e 69 74 73 20 28 69 66 20  d tol units (if 
8ca0: 63 6f 6d 6d 65 6e 74 20 63 6f 6d 6d 65 6e 74 20  comment comment 
8cb0: 22 22 29 20 73 74 61 74 75 73 20 74 79 70 65 29  "") status type)
8cc0: 29 29 0a 20 20 20 20 20 63 73 76 6c 69 73 74 29  )).     csvlist)
8cd0: 29 29 0a 0a 3b 3b 20 67 65 74 20 61 20 6c 69 73  ))..;; get a lis
8ce0: 74 20 6f 66 20 74 65 73 74 5f 64 61 74 61 20 72  t of test_data r
8cf0: 65 63 6f 72 64 73 20 6d 61 74 63 68 69 6e 67 20  ecords matching 
8d00: 63 61 74 65 67 6f 72 79 70 61 74 74 0a 28 64 65  categorypatt.(de
8d10: 66 69 6e 65 20 28 64 62 3a 72 65 61 64 2d 74 65  fine (db:read-te
8d20: 73 74 2d 64 61 74 61 20 64 62 20 74 65 73 74 2d  st-data db test-
8d30: 69 64 20 63 61 74 65 67 6f 72 79 70 61 74 74 29  id categorypatt)
8d40: 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20 27 28  .  (let ((res '(
8d50: 29 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33  ))).    (sqlite3
8d60: 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20  :for-each-row . 
8d70: 20 20 20 20 28 6c 61 6d 62 64 61 20 28 69 64 20      (lambda (id 
8d80: 74 65 73 74 5f 69 64 20 63 61 74 65 67 6f 72 79  test_id category
8d90: 20 76 61 72 69 61 62 6c 65 20 76 61 6c 75 65 20   variable value 
8da0: 65 78 70 65 63 74 65 64 20 74 6f 6c 20 75 6e 69  expected tol uni
8db0: 74 73 20 63 6f 6d 6d 65 6e 74 20 73 74 61 74 75  ts comment statu
8dc0: 73 20 74 79 70 65 29 0a 20 20 20 20 20 20 20 28  s type).       (
8dd0: 73 65 74 21 20 72 65 73 20 28 63 6f 6e 73 20 28  set! res (cons (
8de0: 76 65 63 74 6f 72 20 69 64 20 74 65 73 74 5f 69  vector id test_i
8df0: 64 20 63 61 74 65 67 6f 72 79 20 76 61 72 69 61  d category varia
8e00: 62 6c 65 20 76 61 6c 75 65 20 65 78 70 65 63 74  ble value expect
8e10: 65 64 20 74 6f 6c 20 75 6e 69 74 73 20 63 6f 6d  ed tol units com
8e20: 6d 65 6e 74 20 73 74 61 74 75 73 20 74 79 70 65  ment status type
8e30: 29 20 72 65 73 29 29 29 0a 20 20 20 20 20 64 62  ) res))).     db
8e40: 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20 69 64  .     "SELECT id
8e50: 2c 74 65 73 74 5f 69 64 2c 63 61 74 65 67 6f 72  ,test_id,categor
8e60: 79 2c 76 61 72 69 61 62 6c 65 2c 76 61 6c 75 65  y,variable,value
8e70: 2c 65 78 70 65 63 74 65 64 2c 74 6f 6c 2c 75 6e  ,expected,tol,un
8e80: 69 74 73 2c 63 6f 6d 6d 65 6e 74 2c 73 74 61 74  its,comment,stat
8e90: 75 73 2c 74 79 70 65 20 46 52 4f 4d 20 74 65 73  us,type FROM tes
8ea0: 74 5f 64 61 74 61 20 57 48 45 52 45 20 74 65 73  t_data WHERE tes
8eb0: 74 5f 69 64 3d 3f 20 41 4e 44 20 63 61 74 65 67  t_id=? AND categ
8ec0: 6f 72 79 20 4c 49 4b 45 20 3f 20 4f 52 44 45 52  ory LIKE ? ORDER
8ed0: 20 42 59 20 63 61 74 65 67 6f 72 79 2c 76 61 72   BY category,var
8ee0: 69 61 62 6c 65 3b 22 20 74 65 73 74 2d 69 64 20  iable;" test-id 
8ef0: 63 61 74 65 67 6f 72 79 70 61 74 74 29 0a 20 20  categorypatt).  
8f00: 20 20 28 72 65 76 65 72 73 65 20 72 65 73 29 29    (reverse res))
8f10: 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 6c  )..(define (db:l
8f20: 6f 61 64 2d 74 65 73 74 2d 64 61 74 61 20 64 62  oad-test-data db
8f30: 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d   run-id test-nam
8f40: 65 20 69 74 65 6d 64 61 74 29 0a 20 20 28 6c 65  e itemdat).  (le
8f50: 74 2a 20 28 28 69 74 65 6d 2d 70 61 74 68 20 28  t* ((item-path (
8f60: 69 74 65 6d 2d 6c 69 73 74 2d 3e 70 61 74 68 20  item-list->path 
8f70: 69 74 65 6d 64 61 74 29 29 0a 09 20 28 74 65 73  itemdat)).. (tes
8f80: 74 64 61 74 20 28 64 62 3a 67 65 74 2d 74 65 73  tdat (db:get-tes
8f90: 74 2d 69 6e 66 6f 20 64 62 20 72 75 6e 2d 69 64  t-info db run-id
8fa0: 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d   test-name item-
8fb0: 70 61 74 68 29 29 0a 09 20 28 74 65 73 74 2d 69  path)).. (test-i
8fc0: 64 20 28 69 66 20 74 65 73 74 64 61 74 20 28 64  d (if testdat (d
8fd0: 62 3a 74 65 73 74 2d 67 65 74 2d 69 64 20 74 65  b:test-get-id te
8fe0: 73 74 64 61 74 29 20 23 66 29 29 29 0a 20 20 20  stdat) #f))).   
8ff0: 20 3b 3b 20 28 64 65 62 75 67 3a 70 72 69 6e 74   ;; (debug:print
9000: 20 31 20 22 45 6e 74 65 72 20 72 65 63 6f 72 64   1 "Enter record
9010: 73 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 20 74  s to insert in t
9020: 68 65 20 74 65 73 74 5f 64 61 74 61 20 74 61 62  he test_data tab
9030: 6c 65 2c 20 73 65 76 65 6e 20 66 69 65 6c 64 73  le, seven fields
9040: 2c 20 63 6f 6d 6d 61 20 73 65 70 61 72 61 74 65  , comma separate
9050: 64 20 70 65 72 20 6c 69 6e 65 22 29 0a 20 20 20  d per line").   
9060: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20   (debug:print 4 
9070: 22 69 74 65 6d 64 61 74 3a 20 22 20 69 74 65 6d  "itemdat: " item
9080: 64 61 74 20 22 2c 20 74 65 73 74 2d 6e 61 6d 65  dat ", test-name
9090: 3a 20 22 20 74 65 73 74 2d 6e 61 6d 65 20 22 2c  : " test-name ",
90a0: 20 74 65 73 74 2d 69 64 3a 20 22 20 74 65 73 74   test-id: " test
90b0: 2d 69 64 29 0a 20 20 20 20 28 69 66 20 74 65 73  -id).    (if tes
90c0: 74 2d 69 64 0a 09 28 6c 65 74 20 6c 6f 6f 70 20  t-id..(let loop 
90d0: 28 28 6c 69 6e 20 28 72 65 61 64 2d 6c 69 6e 65  ((lin (read-line
90e0: 29 29 29 0a 09 20 20 28 69 66 20 28 6e 6f 74 20  )))..  (if (not 
90f0: 28 65 6f 66 2d 6f 62 6a 65 63 74 3f 20 6c 69 6e  (eof-object? lin
9100: 29 29 0a 09 20 20 20 20 20 20 28 62 65 67 69 6e  ))..      (begin
9110: 0a 09 09 28 64 65 62 75 67 3a 70 72 69 6e 74 20  ...(debug:print 
9120: 34 20 6c 69 6e 29 0a 09 09 28 64 62 3a 63 73 76  4 lin)...(db:csv
9130: 2d 3e 74 65 73 74 2d 64 61 74 61 20 64 62 20 74  ->test-data db t
9140: 65 73 74 2d 69 64 20 6c 69 6e 29 0a 09 09 28 6c  est-id lin)...(l
9150: 6f 6f 70 20 28 72 65 61 64 2d 6c 69 6e 65 29 29  oop (read-line))
9160: 29 29 29 29 0a 20 20 20 20 3b 3b 20 72 6f 6c 6c  )))).    ;; roll
9170: 20 75 70 20 74 68 65 20 63 75 72 72 65 6e 74 20   up the current 
9180: 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 3b 3b 20  results..    ;; 
9190: 46 49 58 4d 45 3a 20 41 64 64 20 74 68 65 20 73  FIXME: Add the s
91a0: 74 61 74 75 73 20 74 6f 20 0a 20 20 20 20 28 64  tatus to .    (d
91b0: 62 3a 74 65 73 74 2d 64 61 74 61 2d 72 6f 6c 6c  b:test-data-roll
91c0: 75 70 20 64 62 20 74 65 73 74 2d 69 64 20 23 66  up db test-id #f
91d0: 29 29 29 0a 0a 3b 3b 20 57 41 52 4e 49 4e 47 3a  )))..;; WARNING:
91e0: 20 44 6f 20 4e 4f 54 20 63 61 6c 6c 20 74 68 69   Do NOT call thi
91f0: 73 20 66 6f 72 20 74 68 65 20 70 61 72 65 6e 74  s for the parent
9200: 20 74 65 73 74 20 6f 6e 20 61 6e 20 69 74 65 72   test on an iter
9210: 61 74 65 64 20 74 65 73 74 0a 3b 3b 20 52 6f 6c  ated test.;; Rol
9220: 6c 20 75 70 20 74 65 73 74 5f 64 61 74 61 20 70  l up test_data p
9230: 61 73 73 2f 66 61 69 6c 20 72 65 73 75 6c 74 73  ass/fail results
9240: 0a 3b 3b 20 6c 6f 6f 6b 20 61 74 20 74 68 65 20  .;; look at the 
9250: 74 65 73 74 5f 64 61 74 61 20 73 74 61 74 75 73  test_data status
9260: 20 66 69 65 6c 64 2c 20 0a 3b 3b 20 20 20 20 69   field, .;;    i
9270: 66 20 61 6c 6c 20 61 72 65 20 70 61 73 73 20 28  f all are pass (
9280: 61 6e 79 20 63 61 73 65 29 20 61 6e 64 20 74 68  any case) and th
9290: 65 20 74 65 73 74 20 73 74 61 74 75 73 20 69 73  e test status is
92a0: 20 50 41 53 53 20 6f 72 20 4e 55 4c 4c 20 6f 72   PASS or NULL or
92b0: 20 27 27 20 74 68 65 6e 20 73 65 74 20 74 65 73   '' then set tes
92c0: 74 20 73 74 61 74 75 73 20 74 6f 20 50 41 53 53  t status to PASS
92d0: 2e 0a 3b 3b 20 20 20 20 69 66 20 6f 6e 65 20 6f  ..;;    if one o
92e0: 72 20 6d 6f 72 65 20 61 72 65 20 66 61 69 6c 20  r more are fail 
92f0: 28 61 6e 79 20 63 61 73 65 29 20 74 68 65 6e 20  (any case) then 
9300: 73 65 74 20 74 65 73 74 20 73 74 61 74 75 73 20  set test status 
9310: 74 6f 20 50 41 53 53 2c 20 6e 6f 6e 20 22 70 61  to PASS, non "pa
9320: 73 73 22 20 6f 72 20 22 66 61 69 6c 22 20 61 72  ss" or "fail" ar
9330: 65 20 69 67 6e 6f 72 65 64 0a 28 64 65 66 69 6e  e ignored.(defin
9340: 65 20 28 64 62 3a 74 65 73 74 2d 64 61 74 61 2d  e (db:test-data-
9350: 72 6f 6c 6c 75 70 20 64 62 20 74 65 73 74 2d 69  rollup db test-i
9360: 64 20 73 74 61 74 75 73 29 0a 20 20 28 73 71 6c  d status).  (sql
9370: 69 74 65 33 3a 65 78 65 63 75 74 65 20 0a 20 20  ite3:execute .  
9380: 20 64 62 20 0a 20 20 20 22 55 50 44 41 54 45 20   db .   "UPDATE 
9390: 74 65 73 74 73 20 0a 20 20 20 20 20 20 53 45 54  tests .      SET
93a0: 20 66 61 69 6c 5f 63 6f 75 6e 74 3d 28 53 45 4c   fail_count=(SEL
93b0: 45 43 54 20 63 6f 75 6e 74 28 69 64 29 20 46 52  ECT count(id) FR
93c0: 4f 4d 20 74 65 73 74 5f 64 61 74 61 20 57 48 45  OM test_data WHE
93d0: 52 45 20 74 65 73 74 5f 69 64 3d 3f 20 41 4e 44  RE test_id=? AND
93e0: 20 73 74 61 74 75 73 20 6c 69 6b 65 20 27 66 61   status like 'fa
93f0: 69 6c 27 29 2c 0a 20 20 20 20 20 20 20 20 20 20  il'),.          
9400: 70 61 73 73 5f 63 6f 75 6e 74 3d 28 53 45 4c 45  pass_count=(SELE
9410: 43 54 20 63 6f 75 6e 74 28 69 64 29 20 46 52 4f  CT count(id) FRO
9420: 4d 20 74 65 73 74 5f 64 61 74 61 20 57 48 45 52  M test_data WHER
9430: 45 20 74 65 73 74 5f 69 64 3d 3f 20 41 4e 44 20  E test_id=? AND 
9440: 73 74 61 74 75 73 20 6c 69 6b 65 20 27 70 61 73  status like 'pas
9450: 73 27 29 0a 20 20 20 20 20 20 57 48 45 52 45 20  s').      WHERE 
9460: 69 64 3d 3f 3b 22 0a 20 20 20 74 65 73 74 2d 69  id=?;".   test-i
9470: 64 20 74 65 73 74 2d 69 64 20 74 65 73 74 2d 69  d test-id test-i
9480: 64 29 0a 20 20 3b 3b 20 69 66 20 74 68 65 20 74  d).  ;; if the t
9490: 65 73 74 20 69 73 20 6e 6f 74 20 46 41 49 4c 20  est is not FAIL 
94a0: 74 68 65 6e 20 73 65 74 20 73 74 61 74 75 73 20  then set status 
94b0: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 66 61 69  based on the fai
94c0: 6c 20 61 6e 64 20 70 61 73 73 20 63 6f 75 6e 74  l and pass count
94d0: 73 2e 0a 20 20 28 74 68 72 65 61 64 2d 73 6c 65  s..  (thread-sle
94e0: 65 70 21 20 31 29 0a 20 20 28 73 71 6c 69 74 65  ep! 1).  (sqlite
94f0: 33 3a 65 78 65 63 75 74 65 0a 20 20 20 64 62 20  3:execute.   db 
9500: 20 20 3b 3b 3b 20 4e 4f 54 45 3a 20 53 68 6f 75    ;;; NOTE: Shou
9510: 6c 64 20 74 68 69 73 20 62 65 20 57 41 52 4e 2c  ld this be WARN,
9520: 46 41 49 4c 3f 20 41 20 57 41 52 4e 20 69 73 20  FAIL? A WARN is 
9530: 6e 6f 74 20 61 20 46 41 49 4c 3f 3f 3f 3f 3f 20  not a FAIL????? 
9540: 42 55 47 20 46 49 58 4d 45 0a 20 20 20 22 55 50  BUG FIXME.   "UP
9550: 44 41 54 45 20 74 65 73 74 73 0a 20 20 20 20 20  DATE tests.     
9560: 20 53 45 54 20 73 74 61 74 75 73 3d 43 41 53 45   SET status=CASE
9570: 20 57 48 45 4e 20 28 53 45 4c 45 43 54 20 66 61   WHEN (SELECT fa
9580: 69 6c 5f 63 6f 75 6e 74 20 46 52 4f 4d 20 74 65  il_count FROM te
9590: 73 74 73 20 57 48 45 52 45 20 69 64 3d 3f 29 20  sts WHERE id=?) 
95a0: 3e 20 30 20 0a 20 20 20 20 20 20 20 20 20 20 20  > 0 .           
95b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 48                TH
95c0: 45 4e 20 27 46 41 49 4c 27 0a 20 20 20 20 20 20  EN 'FAIL'.      
95d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95e0: 57 48 45 4e 20 28 53 45 4c 45 43 54 20 70 61 73  WHEN (SELECT pas
95f0: 73 5f 63 6f 75 6e 74 20 46 52 4f 4d 20 74 65 73  s_count FROM tes
9600: 74 73 20 57 48 45 52 45 20 69 64 3d 3f 29 20 3e  ts WHERE id=?) >
9610: 20 30 20 41 4e 44 20 0a 20 20 20 20 20 20 20 20   0 AND .        
9620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9630: 20 20 20 28 53 45 4c 45 43 54 20 73 74 61 74 75     (SELECT statu
9640: 73 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45  s FROM tests WHE
9650: 52 45 20 69 64 3d 3f 29 20 4e 4f 54 20 49 4e 20  RE id=?) NOT IN 
9660: 28 27 57 41 52 4e 27 2c 27 46 41 49 4c 27 29 0a  ('WARN','FAIL').
9670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9680: 20 20 20 20 20 20 20 20 20 54 48 45 4e 20 27 50           THEN 'P
9690: 41 53 53 27 0a 20 20 20 20 20 20 20 20 20 20 20  ASS'.           
96a0: 20 20 20 20 20 20 20 20 20 20 20 45 4c 53 45 20             ELSE 
96b0: 73 74 61 74 75 73 0a 20 20 20 20 20 20 20 20 20  status.         
96c0: 20 20 20 20 20 20 20 20 20 45 4e 44 20 57 48 45           END WHE
96d0: 52 45 20 69 64 3d 3f 3b 22 0a 20 20 20 74 65 73  RE id=?;".   tes
96e0: 74 2d 69 64 20 74 65 73 74 2d 69 64 20 74 65 73  t-id test-id tes
96f0: 74 2d 69 64 20 74 65 73 74 2d 69 64 29 29 0a 0a  t-id test-id))..
9700: 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d  (define (db:get-
9710: 70 72 65 76 2d 74 6f 6c 2d 66 6f 72 2d 74 65 73  prev-tol-for-tes
9720: 74 20 64 62 20 74 65 73 74 2d 69 64 20 63 61 74  t db test-id cat
9730: 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65 29 0a  egory variable).
9740: 20 20 3b 3b 20 46 69 6e 69 73 68 20 6d 65 3f 0a    ;; Finish me?.
9750: 20 20 28 76 61 6c 75 65 73 20 23 66 20 23 66 20    (values #f #f 
9760: 23 66 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d  #f))..;;========
9770: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9780: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9790: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
97a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b  ==============.;
97b0: 3b 20 53 20 54 20 45 20 50 20 53 20 0a 3b 3b 3d  ; S T E P S .;;=
97c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
97d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
97e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
97f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
9800: 3d 3d 3d 3d 3d 0a 0a 28 64 65 66 69 6e 65 20 28  =====..(define (
9810: 64 62 3a 73 74 65 70 2d 67 65 74 2d 74 69 6d 65  db:step-get-time
9820: 2d 61 73 2d 73 74 72 69 6e 67 20 76 65 63 29 0a  -as-string vec).
9830: 20 20 28 73 65 63 6f 6e 64 73 2d 3e 74 69 6d 65    (seconds->time
9840: 2d 73 74 72 69 6e 67 20 28 64 62 3a 73 74 65 70  -string (db:step
9850: 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20  -get-event_time 
9860: 76 65 63 29 29 29 0a 0a 3b 3b 20 64 62 2d 67 65  vec)))..;; db-ge
9870: 74 2d 74 65 73 74 2d 73 74 65 70 73 2d 66 6f 72  t-test-steps-for
9880: 2d 72 75 6e 0a 28 64 65 66 69 6e 65 20 28 64 62  -run.(define (db
9890: 3a 67 65 74 2d 73 74 65 70 73 2d 66 6f 72 2d 74  :get-steps-for-t
98a0: 65 73 74 20 64 62 20 74 65 73 74 2d 69 64 29 0a  est db test-id).
98b0: 20 20 28 6c 65 74 20 28 28 72 65 73 20 27 28 29    (let ((res '()
98c0: 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a  )).    (sqlite3:
98d0: 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20  for-each-row .  
98e0: 20 20 20 28 6c 61 6d 62 64 61 20 28 69 64 20 74     (lambda (id t
98f0: 65 73 74 2d 69 64 20 73 74 65 70 6e 61 6d 65 20  est-id stepname 
9900: 73 74 61 74 65 20 73 74 61 74 75 73 20 65 76 65  state status eve
9910: 6e 74 2d 74 69 6d 65 20 6c 6f 67 66 69 6c 65 29  nt-time logfile)
9920: 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72 65  .       (set! re
9930: 73 20 28 63 6f 6e 73 20 28 76 65 63 74 6f 72 20  s (cons (vector 
9940: 69 64 20 74 65 73 74 2d 69 64 20 73 74 65 70 6e  id test-id stepn
9950: 61 6d 65 20 73 74 61 74 65 20 73 74 61 74 75 73  ame state status
9960: 20 65 76 65 6e 74 2d 74 69 6d 65 20 28 69 66 20   event-time (if 
9970: 28 73 74 72 69 6e 67 3f 20 6c 6f 67 66 69 6c 65  (string? logfile
9980: 29 20 6c 6f 67 66 69 6c 65 20 22 22 29 29 20 72  ) logfile "")) r
9990: 65 73 29 29 29 0a 20 20 20 20 20 64 62 0a 20 20  es))).     db.  
99a0: 20 20 20 22 53 45 4c 45 43 54 20 69 64 2c 74 65     "SELECT id,te
99b0: 73 74 5f 69 64 2c 73 74 65 70 6e 61 6d 65 2c 73  st_id,stepname,s
99c0: 74 61 74 65 2c 73 74 61 74 75 73 2c 65 76 65 6e  tate,status,even
99d0: 74 5f 74 69 6d 65 2c 6c 6f 67 66 69 6c 65 20 46  t_time,logfile F
99e0: 52 4f 4d 20 74 65 73 74 5f 73 74 65 70 73 20 57  ROM test_steps W
99f0: 48 45 52 45 20 74 65 73 74 5f 69 64 3d 3f 20 4f  HERE test_id=? O
9a00: 52 44 45 52 20 42 59 20 69 64 20 41 53 43 3b 22  RDER BY id ASC;"
9a10: 20 3b 3b 20 65 76 65 6e 74 5f 74 69 6d 65 20 44   ;; event_time D
9a20: 45 53 43 2c 69 64 20 41 53 43 3b 0a 20 20 20 20  ESC,id ASC;.    
9a30: 20 74 65 73 74 2d 69 64 29 0a 20 20 20 20 28 72   test-id).    (r
9a40: 65 76 65 72 73 65 20 72 65 73 29 29 29 0a 0a 3b  everse res)))..;
9a50: 3b 20 67 65 74 20 61 20 70 72 65 74 74 79 20 74  ; get a pretty t
9a60: 61 62 6c 65 20 74 6f 20 73 75 6d 6d 61 72 69 7a  able to summariz
9a70: 65 20 73 74 65 70 73 0a 3b 3b 0a 28 64 65 66 69  e steps.;;.(defi
9a80: 6e 65 20 28 64 62 3a 67 65 74 2d 73 74 65 70 73  ne (db:get-steps
9a90: 2d 74 61 62 6c 65 20 64 62 20 74 65 73 74 2d 69  -table db test-i
9aa0: 64 29 0a 20 20 28 6c 65 74 20 28 28 73 74 65 70  d).  (let ((step
9ab0: 73 20 20 20 28 64 62 3a 67 65 74 2d 73 74 65 70  s   (db:get-step
9ac0: 73 2d 66 6f 72 2d 74 65 73 74 20 64 62 20 74 65  s-for-test db te
9ad0: 73 74 2d 69 64 29 29 29 0a 20 20 20 20 3b 3b 20  st-id))).    ;; 
9ae0: 6f 72 67 61 6e 69 73 65 20 74 68 65 20 73 74 65  organise the ste
9af0: 70 73 20 66 6f 72 20 62 65 74 74 65 72 20 72 65  ps for better re
9b00: 61 64 61 62 69 6c 69 74 79 0a 20 20 20 20 28 6c  adability.    (l
9b10: 65 74 20 28 28 72 65 73 20 28 6d 61 6b 65 2d 68  et ((res (make-h
9b20: 61 73 68 2d 74 61 62 6c 65 29 29 29 0a 20 20 20  ash-table))).   
9b30: 20 20 20 28 66 6f 72 2d 65 61 63 68 20 0a 20 20     (for-each .  
9b40: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 73 74       (lambda (st
9b50: 65 70 29 0a 09 20 28 64 65 62 75 67 3a 70 72 69  ep).. (debug:pri
9b60: 6e 74 20 36 20 22 73 74 65 70 3d 22 20 73 74 65  nt 6 "step=" ste
9b70: 70 29 0a 09 20 28 6c 65 74 20 28 28 72 65 63 6f  p).. (let ((reco
9b80: 72 64 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 72  rd (hash-table-r
9b90: 65 66 2f 64 65 66 61 75 6c 74 20 0a 09 09 09 72  ef/default ....r
9ba0: 65 73 20 0a 09 09 09 28 64 62 3a 73 74 65 70 2d  es ....(db:step-
9bb0: 67 65 74 2d 73 74 65 70 6e 61 6d 65 20 73 74 65  get-stepname ste
9bc0: 70 29 20 0a 09 09 09 3b 3b 20 20 20 20 20 20 20  p) ....;;       
9bd0: 20 73 74 65 70 6e 61 6d 65 20 20 20 20 20 20 20   stepname       
9be0: 20 20 20 20 20 20 20 20 20 73 74 61 72 74 20 65           start e
9bf0: 6e 64 20 73 74 61 74 75 73 20 20 20 20 0a 09 09  nd status    ...
9c00: 09 28 76 65 63 74 6f 72 20 28 64 62 3a 73 74 65  .(vector (db:ste
9c10: 70 2d 67 65 74 2d 73 74 65 70 6e 61 6d 65 20 73  p-get-stepname s
9c20: 74 65 70 29 20 22 22 20 20 20 22 22 20 22 22 20  tep) ""   "" "" 
9c30: 20 20 20 20 22 22 20 22 22 29 29 29 29 0a 09 20      "" "")))).. 
9c40: 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 36    (debug:print 6
9c50: 20 22 72 65 63 6f 72 64 28 62 65 66 6f 72 65 29   "record(before)
9c60: 20 3d 20 22 20 72 65 63 6f 72 64 20 0a 09 09 09   = " record ....
9c70: 22 5c 6e 69 64 3a 20 20 20 20 20 20 20 22 20 28  "\nid:       " (
9c80: 64 62 3a 73 74 65 70 2d 67 65 74 2d 69 64 20 73  db:step-get-id s
9c90: 74 65 70 29 0a 09 09 09 22 5c 6e 73 74 65 70 6e  tep)...."\nstepn
9ca0: 61 6d 65 3a 20 22 20 28 64 62 3a 73 74 65 70 2d  ame: " (db:step-
9cb0: 67 65 74 2d 73 74 65 70 6e 61 6d 65 20 73 74 65  get-stepname ste
9cc0: 70 29 0a 09 09 09 22 5c 6e 73 74 61 74 65 3a 20  p)...."\nstate: 
9cd0: 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65     " (db:step-ge
9ce0: 74 2d 73 74 61 74 65 20 73 74 65 70 29 0a 09 09  t-state step)...
9cf0: 09 22 5c 6e 73 74 61 74 75 73 3a 20 20 20 22 20  ."\nstatus:   " 
9d00: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61  (db:step-get-sta
9d10: 74 75 73 20 73 74 65 70 29 0a 09 09 09 22 5c 6e  tus step)...."\n
9d20: 74 69 6d 65 3a 20 20 20 20 20 22 20 28 64 62 3a  time:     " (db:
9d30: 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74  step-get-event_t
9d40: 69 6d 65 20 73 74 65 70 29 29 0a 09 20 20 20 28  ime step))..   (
9d50: 63 61 73 65 20 28 73 74 72 69 6e 67 2d 3e 73 79  case (string->sy
9d60: 6d 62 6f 6c 20 28 64 62 3a 73 74 65 70 2d 67 65  mbol (db:step-ge
9d70: 74 2d 73 74 61 74 65 20 73 74 65 70 29 29 0a 09  t-state step))..
9d80: 20 20 20 20 20 28 28 73 74 61 72 74 29 28 76 65       ((start)(ve
9d90: 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64  ctor-set! record
9da0: 20 31 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d   1 (db:step-get-
9db0: 65 76 65 6e 74 5f 74 69 6d 65 20 73 74 65 70 29  event_time step)
9dc0: 29 0a 09 20 20 20 20 20 20 28 76 65 63 74 6f 72  )..      (vector
9dd0: 2d 73 65 74 21 20 72 65 63 6f 72 64 20 33 20 28  -set! record 3 (
9de0: 69 66 20 28 65 71 75 61 6c 3f 20 28 76 65 63 74  if (equal? (vect
9df0: 6f 72 2d 72 65 66 20 72 65 63 6f 72 64 20 33 29  or-ref record 3)
9e00: 20 22 22 29 0a 09 09 09 09 09 28 64 62 3a 73 74   "")......(db:st
9e10: 65 70 2d 67 65 74 2d 73 74 61 74 75 73 20 73 74  ep-get-status st
9e20: 65 70 29 29 29 0a 09 20 20 20 20 20 20 28 69 66  ep)))..      (if
9e30: 20 28 3e 20 28 73 74 72 69 6e 67 2d 6c 65 6e 67   (> (string-leng
9e40: 74 68 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d  th (db:step-get-
9e50: 6c 6f 67 66 69 6c 65 20 73 74 65 70 29 29 0a 09  logfile step))..
9e60: 09 20 20 20 20 20 30 29 0a 09 09 20 20 28 76 65  .     0)...  (ve
9e70: 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64  ctor-set! record
9e80: 20 35 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d   5 (db:step-get-
9e90: 6c 6f 67 66 69 6c 65 20 73 74 65 70 29 29 29 29  logfile step))))
9ea0: 0a 09 20 20 20 20 20 28 28 65 6e 64 29 20 20 0a  ..     ((end)  .
9eb0: 09 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73  .      (vector-s
9ec0: 65 74 21 20 72 65 63 6f 72 64 20 32 20 28 61 6e  et! record 2 (an
9ed0: 79 2d 3e 6e 75 6d 62 65 72 20 28 64 62 3a 73 74  y->number (db:st
9ee0: 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d  ep-get-event_tim
9ef0: 65 20 73 74 65 70 29 29 29 0a 09 20 20 20 20 20  e step)))..     
9f00: 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72 65   (vector-set! re
9f10: 63 6f 72 64 20 33 20 28 64 62 3a 73 74 65 70 2d  cord 3 (db:step-
9f20: 67 65 74 2d 73 74 61 74 75 73 20 73 74 65 70 29  get-status step)
9f30: 29 0a 09 20 20 20 20 20 20 28 76 65 63 74 6f 72  )..      (vector
9f40: 2d 73 65 74 21 20 72 65 63 6f 72 64 20 34 20 28  -set! record 4 (
9f50: 6c 65 74 20 28 28 73 74 61 72 74 74 20 28 61 6e  let ((startt (an
9f60: 79 2d 3e 6e 75 6d 62 65 72 20 28 76 65 63 74 6f  y->number (vecto
9f70: 72 2d 72 65 66 20 72 65 63 6f 72 64 20 31 29 29  r-ref record 1))
9f80: 29 0a 09 09 09 09 09 20 20 28 65 6e 64 74 20 20  )......  (endt  
9f90: 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 20 28 76   (any->number (v
9fa0: 65 63 74 6f 72 2d 72 65 66 20 72 65 63 6f 72 64  ector-ref record
9fb0: 20 32 29 29 29 29 0a 09 09 09 09 20 20 20 20 20   2)))).....     
9fc0: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20   (debug:print 4 
9fd0: 22 72 65 63 6f 72 64 5b 31 5d 3d 22 20 28 76 65  "record[1]=" (ve
9fe0: 63 74 6f 72 2d 72 65 66 20 72 65 63 6f 72 64 20  ctor-ref record 
9ff0: 31 29 20 0a 09 09 09 09 09 09 20 20 20 22 2c 20  1) .......   ", 
a000: 73 74 61 72 74 74 3d 22 20 73 74 61 72 74 74 20  startt=" startt 
a010: 22 2c 20 65 6e 64 74 3d 22 20 65 6e 64 74 0a 09  ", endt=" endt..
a020: 09 09 09 09 09 20 20 20 22 2c 20 67 65 74 2d 73  .....   ", get-s
a030: 74 61 74 75 73 3a 20 22 20 28 64 62 3a 73 74 65  tatus: " (db:ste
a040: 70 2d 67 65 74 2d 73 74 61 74 75 73 20 73 74 65  p-get-status ste
a050: 70 29 29 0a 09 09 09 09 20 20 20 20 20 20 28 69  p)).....      (i
a060: 66 20 28 61 6e 64 20 28 6e 75 6d 62 65 72 3f 20  f (and (number? 
a070: 73 74 61 72 74 74 29 28 6e 75 6d 62 65 72 3f 20  startt)(number? 
a080: 65 6e 64 74 29 29 0a 09 09 09 09 09 20 20 28 73  endt))......  (s
a090: 65 63 6f 6e 64 73 2d 3e 68 72 2d 6d 69 6e 2d 73  econds->hr-min-s
a0a0: 65 63 20 28 2d 20 65 6e 64 74 20 73 74 61 72 74  ec (- endt start
a0b0: 74 29 29 20 22 2d 31 22 29 29 29 0a 09 20 20 20  t)) "-1")))..   
a0c0: 20 20 20 28 69 66 20 28 3e 20 28 73 74 72 69 6e     (if (> (strin
a0d0: 67 2d 6c 65 6e 67 74 68 20 28 64 62 3a 73 74 65  g-length (db:ste
a0e0: 70 2d 67 65 74 2d 6c 6f 67 66 69 6c 65 20 73 74  p-get-logfile st
a0f0: 65 70 29 29 0a 09 09 20 20 20 20 20 30 29 0a 09  ep))...     0)..
a100: 09 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20  .  (vector-set! 
a110: 72 65 63 6f 72 64 20 35 20 28 64 62 3a 73 74 65  record 5 (db:ste
a120: 70 2d 67 65 74 2d 6c 6f 67 66 69 6c 65 20 73 74  p-get-logfile st
a130: 65 70 29 29 29 29 0a 09 20 20 20 20 20 28 65 6c  ep))))..     (el
a140: 73 65 0a 09 20 20 20 20 20 20 28 76 65 63 74 6f  se..      (vecto
a150: 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 32 20  r-set! record 2 
a160: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61  (db:step-get-sta
a170: 74 65 20 73 74 65 70 29 29 0a 09 20 20 20 20 20  te step))..     
a180: 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72 65   (vector-set! re
a190: 63 6f 72 64 20 33 20 28 64 62 3a 73 74 65 70 2d  cord 3 (db:step-
a1a0: 67 65 74 2d 73 74 61 74 75 73 20 73 74 65 70 29  get-status step)
a1b0: 29 0a 09 20 20 20 20 20 20 28 76 65 63 74 6f 72  )..      (vector
a1c0: 2d 73 65 74 21 20 72 65 63 6f 72 64 20 34 20 28  -set! record 4 (
a1d0: 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 6e  db:step-get-even
a1e0: 74 5f 74 69 6d 65 20 73 74 65 70 29 29 29 29 0a  t_time step)))).
a1f0: 09 20 20 20 28 68 61 73 68 2d 74 61 62 6c 65 2d  .   (hash-table-
a200: 73 65 74 21 20 72 65 73 20 28 64 62 3a 73 74 65  set! res (db:ste
a210: 70 2d 67 65 74 2d 73 74 65 70 6e 61 6d 65 20 73  p-get-stepname s
a220: 74 65 70 29 20 72 65 63 6f 72 64 29 0a 09 20 20  tep) record)..  
a230: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 36 20   (debug:print 6 
a240: 22 72 65 63 6f 72 64 28 61 66 74 65 72 29 20 20  "record(after)  
a250: 3d 20 22 20 72 65 63 6f 72 64 20 0a 09 09 09 22  = " record ...."
a260: 5c 6e 69 64 3a 20 20 20 20 20 20 20 22 20 28 64  \nid:       " (d
a270: 62 3a 73 74 65 70 2d 67 65 74 2d 69 64 20 73 74  b:step-get-id st
a280: 65 70 29 0a 09 09 09 22 5c 6e 73 74 65 70 6e 61  ep)...."\nstepna
a290: 6d 65 3a 20 22 20 28 64 62 3a 73 74 65 70 2d 67  me: " (db:step-g
a2a0: 65 74 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70  et-stepname step
a2b0: 29 0a 09 09 09 22 5c 6e 73 74 61 74 65 3a 20 20  )...."\nstate:  
a2c0: 20 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74    " (db:step-get
a2d0: 2d 73 74 61 74 65 20 73 74 65 70 29 0a 09 09 09  -state step)....
a2e0: 22 5c 6e 73 74 61 74 75 73 3a 20 20 20 22 20 28  "\nstatus:   " (
a2f0: 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 74  db:step-get-stat
a300: 75 73 20 73 74 65 70 29 0a 09 09 09 22 5c 6e 74  us step)...."\nt
a310: 69 6d 65 3a 20 20 20 20 20 22 20 28 64 62 3a 73  ime:     " (db:s
a320: 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69  tep-get-event_ti
a330: 6d 65 20 73 74 65 70 29 29 29 29 0a 20 20 20 20  me step)))).    
a340: 20 20 20 3b 3b 20 28 65 6c 73 65 20 20 20 28 76     ;; (else   (v
a350: 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72  ector-set! recor
a360: 64 20 31 20 28 64 62 3a 73 74 65 70 2d 67 65 74  d 1 (db:step-get
a370: 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73 74 65 70  -event_time step
a380: 29 29 29 0a 20 20 20 20 20 20 20 28 73 6f 72 74  ))).       (sort
a390: 20 73 74 65 70 73 20 28 6c 61 6d 62 64 61 20 28   steps (lambda (
a3a0: 61 20 62 29 28 3c 20 28 64 62 3a 73 74 65 70 2d  a b)(< (db:step-
a3b0: 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 61  get-event_time a
a3c0: 29 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 76  )(db:step-get-ev
a3d0: 65 6e 74 5f 74 69 6d 65 20 62 29 29 29 29 29 0a  ent_time b))))).
a3e0: 20 20 20 20 20 20 72 65 73 29 29 29 0a 0a 3b 3b        res)))..;;
a3f0: 20 74 68 65 20 6e 65 77 20 70 72 65 72 65 71 73   the new prereqs
a400: 20 63 61 6c 63 75 6c 61 74 69 6f 6e 2c 20 6c 6f   calculation, lo
a410: 6f 6b 73 20 61 6c 73 6f 20 61 74 20 69 74 65 6d  oks also at item
a420: 70 61 74 68 20 69 66 20 73 70 65 63 69 66 69 65  path if specifie
a430: 64 0a 3b 3b 20 61 6c 6c 20 70 72 65 72 65 71 73  d.;; all prereqs
a440: 20 6d 75 73 74 20 62 65 20 6d 65 74 3a 0a 3b 3b   must be met:.;;
a450: 20 20 20 20 69 66 20 70 72 65 72 65 71 20 74 65      if prereq te
a460: 73 74 20 77 69 74 68 20 69 74 65 6d 70 61 74 68  st with itempath
a470: 3d 27 27 20 69 73 20 43 4f 4d 50 4c 45 54 45 44  ='' is COMPLETED
a480: 20 61 6e 64 20 50 41 53 53 2c 20 57 41 52 4e 2c   and PASS, WARN,
a490: 20 43 48 45 43 4b 2c 20 6f 72 20 57 41 49 56 45   CHECK, or WAIVE
a4a0: 44 20 74 68 65 6e 20 70 72 65 72 65 71 20 69 73  D then prereq is
a4b0: 20 6d 65 74 0a 3b 3b 20 20 20 20 69 66 20 70 72   met.;;    if pr
a4c0: 65 72 65 71 20 74 65 73 74 20 77 69 74 68 20 69  ereq test with i
a4d0: 74 65 6d 70 61 74 68 3d 72 65 66 2d 69 74 65 6d  tempath=ref-item
a4e0: 2d 70 61 74 68 20 61 6e 64 20 43 4f 4d 50 4c 45  -path and COMPLE
a4f0: 54 45 44 20 77 69 74 68 20 50 41 53 53 2c 20 57  TED with PASS, W
a500: 41 52 4e 2c 20 43 48 45 43 4b 2c 20 6f 72 20 57  ARN, CHECK, or W
a510: 41 49 56 45 44 20 74 68 65 6e 20 70 72 65 72 65  AIVED then prere
a520: 71 20 69 73 20 6d 65 74 0a 3b 3b 0a 3b 3b 20 4e  q is met.;;.;; N
a530: 6f 74 65 3a 20 64 6f 20 6e 6f 74 20 63 6f 6e 76  ote: do not conv
a540: 65 72 74 20 74 6f 20 72 65 6d 6f 74 65 20 61 73  ert to remote as
a550: 20 69 74 20 63 61 6c 6c 73 20 72 65 6d 6f 74 65   it calls remote
a560: 20 75 6e 64 65 72 20 74 68 65 20 68 6f 6f 64 0a   under the hood.
a570: 3b 3b 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67  ;;.(define (db:g
a580: 65 74 2d 70 72 65 72 65 71 73 2d 6e 6f 74 2d 6d  et-prereqs-not-m
a590: 65 74 20 64 62 20 72 75 6e 2d 69 64 20 77 61 69  et db run-id wai
a5a0: 74 6f 6e 73 20 72 65 66 2d 69 74 65 6d 2d 70 61  tons ref-item-pa
a5b0: 74 68 29 0a 20 20 28 69 66 20 28 6f 72 20 28 6e  th).  (if (or (n
a5c0: 6f 74 20 77 61 69 74 6f 6e 73 29 0a 09 20 20 28  ot waitons)..  (
a5d0: 6e 75 6c 6c 3f 20 77 61 69 74 6f 6e 73 29 29 0a  null? waitons)).
a5e0: 20 20 20 20 20 20 27 28 29 0a 20 20 20 20 20 20        '().      
a5f0: 28 6c 65 74 2a 20 28 28 75 6e 6d 65 74 2d 70 72  (let* ((unmet-pr
a600: 65 2d 72 65 71 73 20 27 28 29 29 0a 09 20 20 20  e-reqs '())..   
a610: 20 20 28 72 65 73 75 6c 74 20 20 20 20 20 20 20    (result       
a620: 20 20 27 28 29 29 29 0a 09 28 66 6f 72 2d 65 61    '()))..(for-ea
a630: 63 68 20 0a 09 20 28 6c 61 6d 62 64 61 20 28 77  ch .. (lambda (w
a640: 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 29 0a  aitontest-name).
a650: 09 20 20 20 3b 3b 20 62 79 20 67 65 74 74 69 6e  .   ;; by gettin
a660: 67 20 74 68 65 20 74 65 73 74 73 20 77 69 74 68  g the tests with
a670: 20 6d 61 74 63 68 69 6e 67 20 6e 61 6d 65 20 77   matching name w
a680: 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 6f 6e  e are looking on
a690: 6c 79 20 61 74 20 74 68 65 20 6d 61 74 63 68 69  ly at the matchi
a6a0: 6e 67 20 74 65 73 74 20 0a 09 20 20 20 3b 3b 20  ng test ..   ;; 
a6b0: 61 6e 64 20 72 65 6c 61 74 65 64 20 73 75 62 20  and related sub 
a6c0: 69 74 65 6d 73 0a 09 20 20 20 28 6c 65 74 20 28  items..   (let (
a6d0: 28 74 65 73 74 73 20 20 20 20 20 20 20 20 20 20  (tests          
a6e0: 20 20 20 28 72 64 62 3a 67 65 74 2d 74 65 73 74     (rdb:get-test
a6f0: 73 2d 66 6f 72 2d 72 75 6e 20 64 62 20 72 75 6e  s-for-run db run
a700: 2d 69 64 20 77 61 69 74 6f 6e 74 65 73 74 2d 6e  -id waitontest-n
a710: 61 6d 65 20 23 66 20 27 28 29 20 27 28 29 29 29  ame #f '() '()))
a720: 0a 09 09 20 28 65 76 65 72 2d 73 65 65 6e 20 20  ... (ever-seen  
a730: 20 20 20 20 20 20 20 23 66 29 0a 09 09 20 28 70         #f)... (p
a740: 61 72 65 6e 74 2d 77 61 69 74 6f 6e 2d 6d 65 74  arent-waiton-met
a750: 20 23 66 29 0a 09 09 20 28 69 74 65 6d 2d 77 61   #f)... (item-wa
a760: 69 74 6f 6e 2d 6d 65 74 20 20 20 23 66 29 29 0a  iton-met   #f)).
a770: 09 20 20 20 20 20 28 66 6f 72 2d 65 61 63 68 20  .     (for-each 
a780: 0a 09 20 20 20 20 20 20 28 6c 61 6d 62 64 61 20  ..      (lambda 
a790: 28 74 65 73 74 29 0a 09 09 3b 3b 20 28 69 66 20  (test)...;; (if 
a7a0: 28 65 71 75 61 6c 3f 20 77 61 69 74 6f 6e 74 65  (equal? waitonte
a7b0: 73 74 2d 6e 61 6d 65 20 28 64 62 3a 74 65 73 74  st-name (db:test
a7c0: 2d 67 65 74 2d 74 65 73 74 6e 61 6d 65 20 74 65  -get-testname te
a7d0: 73 74 29 29 20 3b 3b 20 62 79 20 64 65 66 69 6e  st)) ;; by defin
a7e0: 74 69 6f 6e 20 74 68 69 73 20 68 61 64 20 62 65  tion this had be
a7f0: 74 74 65 72 20 62 65 20 74 72 75 65 20 2e 2e 2e  tter be true ...
a800: 0a 09 09 28 6c 65 74 2a 20 28 28 73 74 61 74 65  ...(let* ((state
a810: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 64 62               (db
a820: 3a 74 65 73 74 2d 67 65 74 2d 73 74 61 74 65 20  :test-get-state 
a830: 74 65 73 74 29 29 0a 09 09 20 20 20 20 20 20 20  test))...       
a840: 28 73 74 61 74 75 73 20 20 20 20 20 20 20 20 20  (status         
a850: 20 20 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d     (db:test-get-
a860: 73 74 61 74 75 73 20 74 65 73 74 29 29 0a 09 09  status test))...
a870: 20 20 20 20 20 20 20 28 69 74 65 6d 2d 70 61 74         (item-pat
a880: 68 20 20 20 20 20 20 20 20 20 28 64 62 3a 74 65  h         (db:te
a890: 73 74 2d 67 65 74 2d 69 74 65 6d 2d 70 61 74 68  st-get-item-path
a8a0: 20 74 65 73 74 29 29 0a 09 09 20 20 20 20 20 20   test))...      
a8b0: 20 28 69 73 2d 63 6f 6d 70 6c 65 74 65 64 20 20   (is-completed  
a8c0: 20 20 20 20 28 65 71 75 61 6c 3f 20 73 74 61 74      (equal? stat
a8d0: 65 20 22 43 4f 4d 50 4c 45 54 45 44 22 29 29 0a  e "COMPLETED")).
a8e0: 09 09 20 20 20 20 20 20 20 28 69 73 2d 6f 6b 20  ..       (is-ok 
a8f0: 20 20 20 20 20 20 20 20 20 20 20 20 28 6d 65 6d              (mem
a900: 62 65 72 20 73 74 61 74 75 73 20 27 28 22 50 41  ber status '("PA
a910: 53 53 22 20 22 57 41 52 4e 22 20 22 43 48 45 43  SS" "WARN" "CHEC
a920: 4b 22 20 22 57 41 49 56 45 44 22 29 29 29 0a 09  K" "WAIVED")))..
a930: 09 20 20 20 20 20 20 20 28 73 61 6d 65 2d 69 74  .       (same-it
a940: 65 6d 70 61 74 68 20 20 20 20 20 28 65 71 75 61  empath     (equa
a950: 6c 3f 20 72 65 66 2d 69 74 65 6d 2d 70 61 74 68  l? ref-item-path
a960: 20 69 74 65 6d 2d 70 61 74 68 29 29 29 0a 09 09   item-path)))...
a970: 20 20 28 73 65 74 21 20 65 76 65 72 2d 73 65 65    (set! ever-see
a980: 6e 20 23 74 29 0a 09 09 20 20 28 63 6f 6e 64 0a  n #t)...  (cond.
a990: 09 09 20 20 20 3b 3b 20 63 61 73 65 20 31 2c 20  ..   ;; case 1, 
a9a0: 6e 6f 6e 2d 69 74 65 6d 20 28 70 61 72 65 6e 74  non-item (parent
a9b0: 20 74 65 73 74 29 20 69 73 20 0a 09 09 20 20 20   test) is ...   
a9c0: 28 28 61 6e 64 20 28 65 71 75 61 6c 3f 20 69 74  ((and (equal? it
a9d0: 65 6d 2d 70 61 74 68 20 22 22 29 20 3b 3b 20 74  em-path "") ;; t
a9e0: 68 69 73 20 69 73 20 74 68 65 20 70 61 72 65 6e  his is the paren
a9f0: 74 20 74 65 73 74 0a 09 09 09 20 69 73 2d 63 6f  t test.... is-co
aa00: 6d 70 6c 65 74 65 64 0a 09 09 09 20 69 73 2d 6f  mpleted.... is-o
aa10: 6b 29 0a 09 09 20 20 20 20 28 73 65 74 21 20 70  k)...    (set! p
aa20: 61 72 65 6e 74 2d 77 61 69 74 6f 6e 2d 6d 65 74  arent-waiton-met
aa30: 20 23 74 29 29 0a 09 09 20 20 20 28 28 61 6e 64   #t))...   ((and
aa40: 20 73 61 6d 65 2d 69 74 65 6d 70 61 74 68 0a 09   same-itempath..
aa50: 09 09 20 69 73 2d 63 6f 6d 70 6c 65 74 65 64 0a  .. is-completed.
aa60: 09 09 09 20 69 73 2d 6f 6b 29 0a 09 09 20 20 20  ... is-ok)...   
aa70: 20 28 73 65 74 21 20 69 74 65 6d 2d 77 61 69 74   (set! item-wait
aa80: 6f 6e 2d 6d 65 74 20 23 74 29 29 29 29 29 0a 09  on-met #t)))))..
aa90: 20 20 20 20 20 20 74 65 73 74 73 29 0a 09 20 20        tests)..  
aaa0: 20 20 20 28 69 66 20 28 6e 6f 74 20 28 6f 72 20     (if (not (or 
aab0: 70 61 72 65 6e 74 2d 77 61 69 74 6f 6e 2d 6d 65  parent-waiton-me
aac0: 74 20 69 74 65 6d 2d 77 61 69 74 6f 6e 2d 6d 65  t item-waiton-me
aad0: 74 29 29 0a 09 09 20 28 73 65 74 21 20 72 65 73  t))... (set! res
aae0: 75 6c 74 20 28 63 6f 6e 73 20 77 61 69 74 6f 6e  ult (cons waiton
aaf0: 74 65 73 74 2d 6e 61 6d 65 20 72 65 73 75 6c 74  test-name result
ab00: 29 29 29 0a 09 20 20 20 20 20 3b 3b 20 69 66 20  )))..     ;; if 
ab10: 74 68 65 20 74 65 73 74 20 69 73 20 6e 6f 74 20  the test is not 
ab20: 66 6f 75 6e 64 20 74 68 65 6e 20 63 6c 65 61 72  found then clear
ab30: 6c 79 20 74 68 65 20 77 61 69 74 6f 6e 20 69 73  ly the waiton is
ab40: 20 6e 6f 74 20 6d 65 74 2e 2e 2e 0a 09 20 20 20   not met.....   
ab50: 20 20 28 69 66 20 28 6e 6f 74 20 65 76 65 72 2d    (if (not ever-
ab60: 73 65 65 6e 29 28 73 65 74 21 20 72 65 73 75 6c  seen)(set! resul
ab70: 74 20 28 63 6f 6e 73 20 77 61 69 74 6f 6e 74 65  t (cons waitonte
ab80: 73 74 2d 6e 61 6d 65 20 72 65 73 75 6c 74 29 29  st-name result))
ab90: 29 29 29 0a 09 77 61 69 74 6f 6e 73 29 0a 20 20  )))..waitons).  
aba0: 20 20 20 20 28 64 65 6c 65 74 65 2d 64 75 70 6c      (delete-dupl
abb0: 69 63 61 74 65 73 20 72 65 73 75 6c 74 29 29 29  icates result)))
abc0: 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 74  )..(define (db:t
abd0: 65 73 74 73 74 65 70 2d 73 65 74 2d 73 74 61 74  eststep-set-stat
abe0: 75 73 21 20 64 62 20 72 75 6e 2d 69 64 20 74 65  us! db run-id te
abf0: 73 74 2d 6e 61 6d 65 20 74 65 73 74 73 74 65 70  st-name teststep
ac00: 2d 6e 61 6d 65 20 73 74 61 74 65 2d 69 6e 20 73  -name state-in s
ac10: 74 61 74 75 73 2d 69 6e 20 69 74 65 6d 2d 70 61  tatus-in item-pa
ac20: 74 68 20 63 6f 6d 6d 65 6e 74 20 6c 6f 67 66 69  th comment logfi
ac30: 6c 65 29 0a 20 20 28 64 65 62 75 67 3a 70 72 69  le).  (debug:pri
ac40: 6e 74 20 34 20 22 72 75 6e 2d 69 64 3a 20 22 20  nt 4 "run-id: " 
ac50: 72 75 6e 2d 69 64 20 22 20 74 65 73 74 2d 6e 61  run-id " test-na
ac60: 6d 65 3a 20 22 20 74 65 73 74 2d 6e 61 6d 65 29  me: " test-name)
ac70: 0a 20 20 28 6c 65 74 2a 20 28 28 73 74 61 74 65  .  (let* ((state
ac80: 20 20 20 20 20 28 63 68 65 63 6b 2d 76 61 6c 69       (check-vali
ac90: 64 2d 69 74 65 6d 73 20 22 73 74 61 74 65 22 20  d-items "state" 
aca0: 73 74 61 74 65 2d 69 6e 29 29 0a 09 20 28 73 74  state-in)).. (st
acb0: 61 74 75 73 20 20 20 20 28 63 68 65 63 6b 2d 76  atus    (check-v
acc0: 61 6c 69 64 2d 69 74 65 6d 73 20 22 73 74 61 74  alid-items "stat
acd0: 75 73 22 20 73 74 61 74 75 73 2d 69 6e 29 29 0a  us" status-in)).
ace0: 09 20 28 74 65 73 74 64 61 74 20 20 20 28 64 62  . (testdat   (db
acf0: 3a 67 65 74 2d 74 65 73 74 2d 69 6e 66 6f 20 64  :get-test-info d
ad00: 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61  b run-id test-na
ad10: 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 29 29 0a  me item-path))).
ad20: 20 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74      (debug:print
ad30: 20 35 20 22 74 65 73 74 64 61 74 3a 20 22 20 74   5 "testdat: " t
ad40: 65 73 74 64 61 74 29 0a 20 20 20 20 28 69 66 20  estdat).    (if 
ad50: 28 61 6e 64 20 74 65 73 74 64 61 74 20 3b 3b 20  (and testdat ;; 
ad60: 69 66 20 74 68 65 20 73 65 63 74 69 6f 6e 20 65  if the section e
ad70: 78 69 73 74 73 20 74 68 65 6e 20 66 6f 72 63 65  xists then force
ad80: 20 73 70 65 63 69 66 69 63 61 74 69 6f 6e 20 42   specification B
ad90: 55 47 2c 20 49 20 64 6f 6e 27 74 20 6c 69 6b 65  UG, I don't like
ada0: 20 68 6f 77 20 74 68 69 73 20 77 6f 72 6b 73 2e   how this works.
adb0: 0a 09 20 20 20 20 20 28 6f 72 20 28 6e 6f 74 20  ..     (or (not 
adc0: 73 74 61 74 65 29 28 6e 6f 74 20 73 74 61 74 75  state)(not statu
add0: 73 29 29 29 0a 09 28 64 65 62 75 67 3a 70 72 69  s)))..(debug:pri
ade0: 6e 74 20 30 20 22 57 41 52 4e 49 4e 47 3a 20 49  nt 0 "WARNING: I
adf0: 6e 76 61 6c 69 64 20 22 20 28 69 66 20 73 74 61  nvalid " (if sta
ae00: 74 75 73 20 22 73 74 61 74 75 73 22 20 22 73 74  tus "status" "st
ae10: 61 74 65 22 29 0a 09 20 20 20 20 20 20 20 22 20  ate")..       " 
ae20: 76 61 6c 75 65 20 5c 22 22 20 28 69 66 20 73 74  value \"" (if st
ae30: 61 74 75 73 20 73 74 61 74 65 2d 69 6e 20 73 74  atus state-in st
ae40: 61 74 75 73 2d 69 6e 29 20 22 5c 22 2c 20 75 70  atus-in) "\", up
ae50: 64 61 74 65 20 79 6f 75 72 20 76 61 6c 69 64 76  date your validv
ae60: 61 6c 75 65 73 20 73 65 63 74 69 6f 6e 20 69 6e  alues section in
ae70: 20 6d 65 67 61 74 65 73 74 2e 63 6f 6e 66 69 67   megatest.config
ae80: 22 29 29 0a 20 20 20 20 28 69 66 20 74 65 73 74  ")).    (if test
ae90: 64 61 74 0a 09 28 6c 65 74 20 28 28 74 65 73 74  dat..(let ((test
aea0: 2d 69 64 20 28 74 65 73 74 3a 67 65 74 2d 69 64  -id (test:get-id
aeb0: 20 74 65 73 74 64 61 74 29 29 29 0a 09 20 20 28   testdat)))..  (
aec0: 6d 75 74 65 78 2d 6c 6f 63 6b 21 20 2a 69 6e 63  mutex-lock! *inc
aed0: 6f 6d 69 6e 67 2d 6d 75 74 65 78 2a 29 0a 09 20  oming-mutex*).. 
aee0: 20 28 73 65 74 21 20 2a 69 6e 63 6f 6d 69 6e 67   (set! *incoming
aef0: 2d 64 61 74 61 2a 20 28 63 6f 6e 73 20 28 76 65  -data* (cons (ve
af00: 63 74 6f 72 20 27 73 74 65 70 2d 73 74 61 74 75  ctor 'step-statu
af10: 73 0a 09 09 09 09 09 20 20 20 20 20 20 28 63 75  s......      (cu
af20: 72 72 65 6e 74 2d 73 65 63 6f 6e 64 73 29 0a 09  rrent-seconds)..
af30: 09 09 09 09 20 20 20 20 20 20 3b 3b 20 46 49 58  ....      ;; FIX
af40: 4d 45 20 2d 20 74 68 69 73 20 73 68 6f 75 6c 64  ME - this should
af50: 20 6e 6f 74 20 75 70 64 61 74 65 20 74 68 65 20   not update the 
af60: 6c 6f 67 66 69 6c 65 20 75 6e 6c 65 73 73 20 69  logfile unless i
af70: 74 20 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a  t is specified..
af80: 09 09 09 09 09 20 20 20 20 20 20 28 6c 69 73 74  .....      (list
af90: 20 74 65 73 74 2d 69 64 20 74 65 73 74 73 74 65   test-id testste
afa0: 70 2d 6e 61 6d 65 20 73 74 61 74 65 2d 69 6e 20  p-name state-in 
afb0: 73 74 61 74 75 73 2d 69 6e 20 28 63 75 72 72 65  status-in (curre
afc0: 6e 74 2d 73 65 63 6f 6e 64 73 29 20 28 69 66 20  nt-seconds) (if 
afd0: 63 6f 6d 6d 65 6e 74 20 63 6f 6d 6d 65 6e 74 20  comment comment 
afe0: 22 22 29 20 28 69 66 20 6c 6f 67 66 69 6c 65 20  "") (if logfile 
aff0: 6c 6f 67 66 69 6c 65 20 22 22 29 29 29 0a 09 09  logfile "")))...
b000: 09 09 20 20 20 20 20 20 2a 69 6e 63 6f 6d 69 6e  ..      *incomin
b010: 67 2d 64 61 74 61 2a 29 29 0a 09 20 20 28 6d 75  g-data*))..  (mu
b020: 74 65 78 2d 75 6e 6c 6f 63 6b 21 20 2a 69 6e 63  tex-unlock! *inc
b030: 6f 6d 69 6e 67 2d 6d 75 74 65 78 2a 29 0a 09 20  oming-mutex*).. 
b040: 20 28 69 66 20 28 6e 6f 74 20 2a 63 61 63 68 65   (if (not *cache
b050: 2d 6f 6e 2a 29 28 64 62 3a 77 72 69 74 65 2d 63  -on*)(db:write-c
b060: 61 63 68 65 64 2d 64 61 74 61 20 64 62 29 29 0a  ached-data db)).
b070: 09 20 20 23 74 29 0a 09 28 64 65 62 75 67 3a 70  .  #t)..(debug:p
b080: 72 69 6e 74 20 30 20 22 45 52 52 4f 52 3a 20 43  rint 0 "ERROR: C
b090: 61 6e 27 74 20 75 70 64 61 74 65 20 22 20 74 65  an't update " te
b0a0: 73 74 2d 6e 61 6d 65 20 22 20 66 6f 72 20 72 75  st-name " for ru
b0b0: 6e 20 22 20 72 75 6e 2d 69 64 20 22 20 2d 3e 20  n " run-id " -> 
b0c0: 6e 6f 20 73 75 63 68 20 74 65 73 74 20 69 6e 20  no such test in 
b0d0: 64 62 22 29 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d  db"))))..;;=====
b0e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
b0f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
b100: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
b110: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
b120: 3d 0a 3b 3b 20 45 78 74 72 61 63 74 20 6f 64 73  =.;; Extract ods
b130: 20 66 69 6c 65 20 66 72 6f 6d 20 74 68 65 20 64   file from the d
b140: 62 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  b.;;============
b150: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
b160: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
b170: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
b180: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 72  ==========..;; r
b190: 75 6e 73 70 61 74 74 20 69 73 20 61 20 63 6f 6d  unspatt is a com
b1a0: 6d 61 20 64 65 6c 69 6d 69 74 65 64 20 6c 69 73  ma delimited lis
b1b0: 74 20 6f 66 20 72 75 6e 20 70 61 74 74 65 72 6e  t of run pattern
b1c0: 73 0a 3b 3b 20 6b 65 79 70 61 74 74 2d 61 6c 69  s.;; keypatt-ali
b1d0: 73 74 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20  st must contain 
b1e0: 2a 61 6c 6c 2a 20 6b 65 79 73 20 77 69 74 68 20  *all* keys with 
b1f0: 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20 70 61  an associated pa
b200: 74 74 65 72 6e 3a 20 27 28 20 28 22 4b 45 59 31  ttern: '( ("KEY1
b210: 22 20 22 25 22 29 20 2e 2e 20 29 0a 28 64 65 66  " "%") .. ).(def
b220: 69 6e 65 20 28 64 62 3a 65 78 74 72 61 63 74 2d  ine (db:extract-
b230: 6f 64 73 2d 66 69 6c 65 20 64 62 20 6f 75 74 70  ods-file db outp
b240: 75 74 66 69 6c 65 20 6b 65 79 70 61 74 74 2d 61  utfile keypatt-a
b250: 6c 69 73 74 20 72 75 6e 73 70 61 74 74 20 70 61  list runspatt pa
b260: 74 68 6d 6f 64 29 0a 20 20 28 6c 65 74 2a 20 28  thmod).  (let* (
b270: 28 6b 65 79 73 73 74 72 20 20 28 73 74 72 69 6e  (keysstr  (strin
b280: 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 28 6d  g-intersperse (m
b290: 61 70 20 63 61 72 20 6b 65 79 70 61 74 74 2d 61  ap car keypatt-a
b2a0: 6c 69 73 74 29 20 22 2c 22 29 29 0a 09 20 28 6b  list) ",")).. (k
b2b0: 65 79 71 72 79 20 20 20 28 73 74 72 69 6e 67 2d  eyqry   (string-
b2c0: 69 6e 74 65 72 73 70 65 72 73 65 20 28 6d 61 70  intersperse (map
b2d0: 20 28 6c 61 6d 62 64 61 20 28 70 29 28 63 6f 6e   (lambda (p)(con
b2e0: 63 20 28 63 61 72 20 70 29 20 22 20 4c 49 4b 45  c (car p) " LIKE
b2f0: 20 3f 20 22 29 29 20 6b 65 79 70 61 74 74 2d 61   ? ")) keypatt-a
b300: 6c 69 73 74 29 20 22 20 41 4e 44 20 22 29 29 0a  list) " AND ")).
b310: 09 20 28 6e 75 6d 6b 65 79 73 20 20 28 6c 65 6e  . (numkeys  (len
b320: 67 74 68 20 6b 65 79 70 61 74 74 2d 61 6c 69 73  gth keypatt-alis
b330: 74 29 29 0a 09 20 28 74 65 73 74 2d 69 64 73 20  t)).. (test-ids 
b340: 27 28 29 29 0a 09 20 28 77 69 6e 64 6f 77 73 20  '()).. (windows 
b350: 20 28 61 6e 64 20 70 61 74 68 6d 6f 64 20 28 73   (and pathmod (s
b360: 75 62 73 74 72 69 6e 67 2d 69 6e 64 65 78 20 22  ubstring-index "
b370: 5c 5c 22 20 70 61 74 68 6d 6f 64 29 29 29 0a 09  \\" pathmod)))..
b380: 20 28 74 65 6d 70 64 69 72 20 20 28 63 6f 6e 63   (tempdir  (conc
b390: 20 22 2f 74 6d 70 2f 22 20 28 63 75 72 72 65 6e   "/tmp/" (curren
b3a0: 74 2d 75 73 65 72 2d 6e 61 6d 65 29 20 22 2f 22  t-user-name) "/"
b3b0: 20 72 75 6e 73 70 61 74 74 20 22 5f 22 20 28 72   runspatt "_" (r
b3c0: 61 6e 64 6f 6d 20 31 30 30 30 30 29 20 22 5f 22  andom 10000) "_"
b3d0: 20 28 63 75 72 72 65 6e 74 2d 70 72 6f 63 65 73   (current-proces
b3e0: 73 2d 69 64 29 29 29 0a 09 20 28 72 75 6e 73 68  s-id))).. (runsh
b3f0: 65 61 64 65 72 20 28 61 70 70 65 6e 64 20 28 6c  eader (append (l
b400: 69 73 74 20 22 52 75 6e 20 49 64 22 20 22 52 75  ist "Run Id" "Ru
b410: 6e 6e 61 6d 65 22 29 20 3b 20 30 20 31 0a 09 09  nname") ; 0 1...
b420: 09 20 20 20 20 20 28 6d 61 70 20 63 61 72 20 6b  .     (map car k
b430: 65 79 70 61 74 74 2d 61 6c 69 73 74 29 20 20 20  eypatt-alist)   
b440: 3b 20 2b 20 4e 20 3d 20 6c 65 6e 67 74 68 20 6b  ; + N = length k
b450: 65 79 70 61 74 74 2d 61 6c 69 73 74 0a 09 09 09  eypatt-alist....
b460: 20 20 20 20 20 28 6c 69 73 74 20 22 54 65 73 74       (list "Test
b470: 6e 61 6d 65 22 20 20 20 20 20 20 20 20 20 20 3b  name"          ;
b480: 20 32 0a 09 09 09 09 20 20 20 22 49 74 65 6d 20   2.....   "Item 
b490: 50 61 74 68 22 20 20 20 20 20 20 20 20 20 3b 20  Path"         ; 
b4a0: 33 20 0a 09 09 09 09 20 20 20 22 44 65 73 63 72  3 .....   "Descr
b4b0: 69 70 74 69 6f 6e 22 20 20 20 20 20 20 20 3b 20  iption"       ; 
b4c0: 34 20 0a 09 09 09 09 20 20 20 22 53 74 61 74 65  4 .....   "State
b4d0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 20  "             ; 
b4e0: 35 20 0a 09 09 09 09 20 20 20 22 53 74 61 74 75  5 .....   "Statu
b4f0: 73 22 20 20 20 20 20 20 20 20 20 20 20 20 3b 20  s"            ; 
b500: 36 20 20 0a 09 09 09 09 20 20 20 22 46 69 6e 61  6  .....   "Fina
b510: 6c 20 4c 6f 67 22 20 20 20 20 20 20 20 20 20 3b  l Log"         ;
b520: 20 37 20 0a 09 09 09 09 20 20 20 22 52 75 6e 20   7 .....   "Run 
b530: 44 75 72 61 74 69 6f 6e 22 20 20 20 20 20 20 3b  Duration"      ;
b540: 20 38 20 0a 09 09 09 09 20 20 20 22 57 68 65 6e   8 .....   "When
b550: 20 52 75 6e 22 20 20 20 20 20 20 20 20 20 20 3b   Run"          ;
b560: 20 39 20 0a 09 09 09 09 20 20 20 22 54 61 67 73   9 .....   "Tags
b570: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3b  "              ;
b580: 20 31 30 0a 09 09 09 09 20 20 20 22 52 75 6e 20   10.....   "Run 
b590: 4f 77 6e 65 72 22 20 20 20 20 20 20 20 20 20 3b  Owner"         ;
b5a0: 20 31 31 0a 09 09 09 09 20 20 20 22 43 6f 6d 6d   11.....   "Comm
b5b0: 65 6e 74 22 20 20 20 20 20 20 20 20 20 20 20 3b  ent"           ;
b5c0: 20 31 32 0a 09 09 09 09 20 20 20 22 41 75 74 68   12.....   "Auth
b5d0: 6f 72 22 20 20 20 20 20 20 20 20 20 20 20 20 3b  or"            ;
b5e0: 20 31 33 0a 09 09 09 09 20 20 20 22 54 65 73 74   13.....   "Test
b5f0: 20 4f 77 6e 65 72 22 20 20 20 20 20 20 20 20 3b   Owner"        ;
b600: 20 31 34 0a 09 09 09 09 20 20 20 22 52 65 76 69   14.....   "Revi
b610: 65 77 65 64 22 20 20 20 20 20 20 20 20 20 20 3b  ewed"          ;
b620: 20 31 35 0a 09 09 09 09 20 20 20 22 44 69 73 6b   15.....   "Disk
b630: 66 72 65 65 22 20 20 20 20 20 20 20 20 20 20 3b  free"          ;
b640: 20 31 36 0a 09 09 09 09 20 20 20 22 55 6e 61 6d   16.....   "Unam
b650: 65 22 20 20 20 20 20 20 20 20 20 20 20 20 20 3b  e"             ;
b660: 20 31 37 0a 09 09 09 09 20 20 20 22 52 75 6e 64   17.....   "Rund
b670: 69 72 22 20 20 20 20 20 20 20 20 20 20 20 20 3b  ir"            ;
b680: 20 31 38 0a 09 09 09 09 20 20 20 22 48 6f 73 74   18.....   "Host
b690: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3b  "              ;
b6a0: 20 31 39 0a 09 09 09 09 20 20 20 22 43 70 75 20   19.....   "Cpu 
b6b0: 4c 6f 61 64 22 20 20 20 20 20 20 20 20 20 20 3b  Load"          ;
b6c0: 20 32 30 0a 09 09 09 09 20 20 20 29 29 29 0a 09   20.....   )))..
b6d0: 20 28 72 65 73 75 6c 74 73 20 28 6c 69 73 74 20   (results (list 
b6e0: 72 75 6e 73 68 65 61 64 65 72 29 29 09 09 09 20  runsheader))... 
b6f0: 0a 09 20 28 74 65 73 74 64 61 74 61 2d 68 65 61  .. (testdata-hea
b700: 64 65 72 20 28 6c 69 73 74 20 22 52 75 6e 20 49  der (list "Run I
b710: 64 22 20 22 54 65 73 74 6e 61 6d 65 22 20 22 49  d" "Testname" "I
b720: 74 65 6d 20 50 61 74 68 22 20 22 43 61 74 65 67  tem Path" "Categ
b730: 6f 72 79 22 20 22 56 61 72 69 61 62 6c 65 22 20  ory" "Variable" 
b740: 22 56 61 6c 75 65 22 20 22 45 78 70 65 63 74 65  "Value" "Expecte
b750: 64 22 20 22 54 6f 6c 22 20 22 55 6e 69 74 73 22  d" "Tol" "Units"
b760: 20 22 53 74 61 74 75 73 22 20 22 43 6f 6d 6d 65   "Status" "Comme
b770: 6e 74 22 29 29 0a 09 20 28 6d 61 69 6e 71 72 79  nt")).. (mainqry
b780: 20 28 63 6f 6e 63 20 22 53 45 4c 45 43 54 0a 20   (conc "SELECT. 
b790: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 2e 74               t.t
b7a0: 65 73 74 6e 61 6d 65 2c 72 2e 69 64 2c 72 75 6e  estname,r.id,run
b7b0: 6e 61 6d 65 2c 22 20 6b 65 79 73 73 74 72 20 22  name," keysstr "
b7c0: 2c 74 2e 74 65 73 74 6e 61 6d 65 2c 0a 20 20 20  ,t.testname,.   
b7d0: 20 20 20 20 20 20 20 20 20 20 20 74 2e 69 74 65             t.ite
b7e0: 6d 5f 70 61 74 68 2c 74 6d 2e 64 65 73 63 72 69  m_path,tm.descri
b7f0: 70 74 69 6f 6e 2c 74 2e 73 74 61 74 65 2c 74 2e  ption,t.state,t.
b800: 73 74 61 74 75 73 2c 0a 20 20 20 20 20 20 20 20  status,.        
b810: 20 20 20 20 20 20 66 69 6e 61 6c 5f 6c 6f 67 66        final_logf
b820: 2c 72 75 6e 5f 64 75 72 61 74 69 6f 6e 2c 20 0a  ,run_duration, .
b830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
b840: 72 66 74 69 6d 65 28 27 25 6d 2f 25 64 2f 25 59  rftime('%m/%d/%Y
b850: 20 25 48 3a 25 4d 3a 25 53 27 2c 64 61 74 65 74   %H:%M:%S',datet
b860: 69 6d 65 28 74 2e 65 76 65 6e 74 5f 74 69 6d 65  ime(t.event_time
b870: 2c 27 75 6e 69 78 65 70 6f 63 68 27 29 2c 27 6c  ,'unixepoch'),'l
b880: 6f 63 61 6c 74 69 6d 65 27 29 2c 0a 20 20 20 20  ocaltime'),.    
b890: 20 20 20 20 20 20 20 20 20 20 74 6d 2e 74 61 67            tm.tag
b8a0: 73 2c 72 2e 6f 77 6e 65 72 2c 74 2e 63 6f 6d 6d  s,r.owner,t.comm
b8b0: 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ent,.           
b8c0: 20 20 20 61 75 74 68 6f 72 2c 0a 20 20 20 20 20     author,.     
b8d0: 20 20 20 20 20 20 20 20 20 74 6d 2e 6f 77 6e 65           tm.owne
b8e0: 72 2c 72 65 76 69 65 77 65 64 2c 0a 20 20 20 20  r,reviewed,.    
b8f0: 20 20 20 20 20 20 20 20 20 20 64 69 73 6b 66 72            diskfr
b900: 65 65 2c 75 6e 61 6d 65 2c 72 75 6e 64 69 72 2c  ee,uname,rundir,
b910: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68  .              h
b920: 6f 73 74 2c 63 70 75 6c 6f 61 64 0a 20 20 20 20  ost,cpuload.    
b930: 20 20 20 20 20 20 20 20 46 52 4f 4d 20 74 65 73          FROM tes
b940: 74 73 20 41 53 20 74 20 4a 4f 49 4e 20 72 75 6e  ts AS t JOIN run
b950: 73 20 41 53 20 72 20 4f 4e 20 74 2e 72 75 6e 5f  s AS r ON t.run_
b960: 69 64 3d 72 2e 69 64 20 4a 4f 49 4e 20 74 65 73  id=r.id JOIN tes
b970: 74 5f 6d 65 74 61 20 41 53 20 74 6d 20 4f 4e 20  t_meta AS tm ON 
b980: 74 6d 2e 74 65 73 74 6e 61 6d 65 3d 74 2e 74 65  tm.testname=t.te
b990: 73 74 6e 61 6d 65 0a 20 20 20 20 20 20 20 20 20  stname.         
b9a0: 20 20 20 57 48 45 52 45 20 72 75 6e 6e 61 6d 65     WHERE runname
b9b0: 20 4c 49 4b 45 20 3f 20 41 4e 44 20 22 20 6b 65   LIKE ? AND " ke
b9c0: 79 71 72 79 20 22 3b 22 29 29 29 0a 20 20 20 20  yqry ";"))).    
b9d0: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 32 20 22  (debug:print 2 "
b9e0: 55 73 69 6e 67 20 22 20 74 65 6d 70 64 69 72 20  Using " tempdir 
b9f0: 22 20 66 6f 72 20 63 6f 6e 73 74 72 75 63 74 69  " for constructi
ba00: 6e 67 20 74 68 65 20 6f 64 73 20 66 69 6c 65 2e  ng the ods file.
ba10: 20 6b 65 79 71 72 79 3a 20 22 20 6b 65 79 71 72   keyqry: " keyqr
ba20: 79 20 22 20 6b 65 79 73 74 72 3a 20 22 20 6b 65  y " keystr: " ke
ba30: 79 73 73 74 72 20 22 20 77 69 74 68 20 6b 65 79  ysstr " with key
ba40: 73 3a 20 22 20 28 6d 61 70 20 63 61 64 72 20 6b  s: " (map cadr k
ba50: 65 79 70 61 74 74 2d 61 6c 69 73 74 29 0a 09 09  eypatt-alist)...
ba60: 20 22 5c 6e 20 20 20 20 20 20 6d 61 69 6e 71 72   "\n      mainqr
ba70: 79 3a 20 22 20 6d 61 69 6e 71 72 79 29 0a 20 20  y: " mainqry).  
ba80: 20 20 3b 3b 20 22 45 78 70 65 63 74 65 64 20 56    ;; "Expected V
ba90: 61 6c 75 65 22 0a 20 20 20 20 3b 3b 20 22 56 61  alue".    ;; "Va
baa0: 6c 75 65 20 46 6f 75 6e 64 22 0a 20 20 20 20 3b  lue Found".    ;
bab0: 3b 20 22 54 6f 6c 65 72 61 6e 63 65 22 0a 20 20  ; "Tolerance".  
bac0: 20 20 28 61 70 70 6c 79 20 73 71 6c 69 74 65 33    (apply sqlite3
bad0: 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 09 20  :for-each-row.. 
bae0: 20 20 28 6c 61 6d 62 64 61 20 28 74 65 73 74 2d    (lambda (test-
baf0: 69 64 20 2e 20 62 29 0a 09 20 20 20 20 20 28 73  id . b)..     (s
bb00: 65 74 21 20 74 65 73 74 2d 69 64 73 20 28 63 6f  et! test-ids (co
bb10: 6e 73 20 74 65 73 74 2d 69 64 20 74 65 73 74 2d  ns test-id test-
bb20: 69 64 73 29 29 20 20 20 3b 3b 20 74 65 73 74 2d  ids))   ;; test-
bb30: 69 64 20 69 73 20 6e 6f 77 20 74 65 73 74 6e 61  id is now testna
bb40: 6d 65 0a 09 20 20 20 20 20 28 73 65 74 21 20 72  me..     (set! r
bb50: 65 73 75 6c 74 73 20 28 61 70 70 65 6e 64 20 72  esults (append r
bb60: 65 73 75 6c 74 73 20 3b 3b 20 6e 6f 74 65 2c 20  esults ;; note, 
bb70: 64 72 6f 70 20 74 68 65 20 74 65 73 74 2d 69 64  drop the test-id
bb80: 0a 09 09 09 09 20 20 20 28 6c 69 73 74 0a 09 09  .....   (list...
bb90: 09 09 20 20 20 20 28 69 66 20 70 61 74 68 6d 6f  ..    (if pathmo
bba0: 64 0a 09 09 09 09 09 28 6c 65 74 2a 20 28 28 76  d......(let* ((v
bbb0: 62 20 20 20 20 20 20 20 20 28 61 70 70 6c 79 20  b        (apply 
bbc0: 76 65 63 74 6f 72 20 62 29 29 0a 09 09 09 09 09  vector b))......
bbd0: 20 20 20 20 20 20 20 28 6b 65 79 76 61 6c 73 20         (keyvals 
bbe0: 20 20 28 6c 65 74 20 6c 6f 6f 70 20 28 28 69 20    (let loop ((i 
bbf0: 20 20 20 30 29 0a 09 09 09 09 09 09 09 09 20 20     0).........  
bc00: 20 20 20 28 72 65 73 20 27 28 29 29 29 0a 09 09     (res '()))...
bc10: 09 09 09 09 09 20 20 20 20 28 69 66 20 28 3e 3d  .....    (if (>=
bc20: 20 69 20 6e 75 6d 6b 65 79 73 29 0a 09 09 09 09   i numkeys).....
bc30: 09 09 09 09 72 65 73 0a 09 09 09 09 09 09 09 09  ....res.........
bc40: 28 6c 6f 6f 70 20 28 2b 20 69 20 31 29 0a 09 09  (loop (+ i 1)...
bc50: 09 09 09 09 09 09 20 20 20 20 20 20 28 61 70 70  ......      (app
bc60: 65 6e 64 20 72 65 73 20 28 6c 69 73 74 20 28 76  end res (list (v
bc70: 65 63 74 6f 72 2d 72 65 66 20 76 62 20 28 2b 20  ector-ref vb (+ 
bc80: 69 20 32 29 29 29 29 29 29 29 29 0a 09 09 09 09  i 2)))))))).....
bc90: 09 20 20 20 20 20 20 20 28 72 75 6e 6e 61 6d 65  .       (runname
bca0: 20 20 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76     (vector-ref v
bcb0: 62 20 31 29 29 0a 09 09 09 09 09 20 20 20 20 20  b 1))......     
bcc0: 20 20 28 74 65 73 74 6e 61 6d 65 20 20 28 76 65    (testname  (ve
bcd0: 63 74 6f 72 2d 72 65 66 20 76 62 20 28 2b 20 20  ctor-ref vb (+  
bce0: 32 20 6e 75 6d 6b 65 79 73 29 29 29 0a 09 09 09  2 numkeys)))....
bcf0: 09 09 20 20 20 20 20 20 20 28 69 74 65 6d 2d 70  ..       (item-p
bd00: 61 74 68 20 28 76 65 63 74 6f 72 2d 72 65 66 20  ath (vector-ref 
bd10: 76 62 20 28 2b 20 20 33 20 6e 75 6d 6b 65 79 73  vb (+  3 numkeys
bd20: 29 29 29 0a 09 09 09 09 09 20 20 20 20 20 20 20  )))......       
bd30: 28 66 69 6e 61 6c 2d 6c 6f 67 20 28 76 65 63 74  (final-log (vect
bd40: 6f 72 2d 72 65 66 20 76 62 20 28 2b 20 20 37 20  or-ref vb (+  7 
bd50: 6e 75 6d 6b 65 79 73 29 29 29 0a 09 09 09 09 09  numkeys)))......
bd60: 20 20 20 20 20 20 20 28 72 75 6e 2d 64 69 72 20         (run-dir 
bd70: 20 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62    (vector-ref vb
bd80: 20 28 2b 20 31 38 20 6e 75 6d 6b 65 79 73 29 29   (+ 18 numkeys))
bd90: 29 0a 09 09 09 09 09 20 20 20 20 20 20 20 28 6c  )......       (l
bda0: 6f 67 2d 66 70 61 74 68 20 28 63 6f 6e 63 20 72  og-fpath (conc r
bdb0: 75 6e 2d 64 69 72 20 22 2f 22 20 20 66 69 6e 61  un-dir "/"  fina
bdc0: 6c 2d 6c 6f 67 29 29 29 20 3b 3b 20 28 73 74 72  l-log))) ;; (str
bdd0: 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20  ing-intersperse 
bde0: 6b 65 79 76 61 6c 73 20 22 2f 22 29 20 22 2f 22  keyvals "/") "/"
bdf0: 20 74 65 73 74 6e 61 6d 65 20 22 2f 22 20 69 74   testname "/" it
be00: 65 6d 2d 70 61 74 68 20 22 2f 22 0a 09 09 09 09  em-path "/".....
be10: 09 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20  .  (debug:print 
be20: 34 20 22 6c 6f 67 3a 20 22 20 6c 6f 67 2d 66 70  4 "log: " log-fp
be30: 61 74 68 20 22 20 65 78 69 73 74 73 3a 20 22 20  ath " exists: " 
be40: 28 66 69 6c 65 2d 65 78 69 73 74 73 3f 20 6c 6f  (file-exists? lo
be50: 67 2d 66 70 61 74 68 29 29 0a 09 09 09 09 09 20  g-fpath))...... 
be60: 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 76 62   (vector-set! vb
be70: 20 28 2b 20 37 20 6e 75 6d 6b 65 79 73 29 20 28   (+ 7 numkeys) (
be80: 69 66 20 28 66 69 6c 65 2d 65 78 69 73 74 73 3f  if (file-exists?
be90: 20 6c 6f 67 2d 66 70 61 74 68 29 0a 09 09 09 09   log-fpath).....
bea0: 09 09 09 09 09 20 20 20 20 28 6c 65 74 20 28 28  .....    (let ((
beb0: 6e 65 77 70 61 74 68 20 28 63 6f 6e 63 20 70 61  newpath (conc pa
bec0: 74 68 6d 6f 64 20 22 2f 22 0a 09 09 09 09 09 09  thmod "/".......
bed0: 09 09 09 09 09 09 20 28 73 74 72 69 6e 67 2d 69  ...... (string-i
bee0: 6e 74 65 72 73 70 65 72 73 65 20 6b 65 79 76 61  ntersperse keyva
bef0: 6c 73 20 22 2f 22 29 0a 09 09 09 09 09 09 09 09  ls "/").........
bf00: 09 09 09 09 20 22 2f 22 20 72 75 6e 6e 61 6d 65  .... "/" runname
bf10: 20 22 2f 22 20 74 65 73 74 6e 61 6d 65 20 22 2f   "/" testname "/
bf20: 22 0a 09 09 09 09 09 09 09 09 09 09 09 09 20 28  "............. (
bf30: 69 66 20 28 73 74 72 69 6e 67 3d 3f 20 69 74 65  if (string=? ite
bf40: 6d 2d 70 61 74 68 20 22 22 29 20 22 22 20 28 63  m-path "") "" (c
bf50: 6f 6e 63 20 22 2f 22 20 69 74 65 6d 2d 70 61 74  onc "/" item-pat
bf60: 68 29 29 0a 09 09 09 09 09 09 09 09 09 09 09 09  h)).............
bf70: 20 66 69 6e 61 6c 2d 6c 6f 67 29 29 29 0a 09 09   final-log)))...
bf80: 09 09 09 09 09 09 09 20 20 20 20 20 20 3b 3b 20  .......      ;; 
bf90: 66 6f 72 20 6e 6f 77 20 74 68 72 6f 77 20 61 77  for now throw aw
bfa0: 61 79 20 6e 65 77 70 61 74 68 20 61 6e 64 20 75  ay newpath and u
bfb0: 73 65 20 74 68 65 20 6c 6f 67 2d 66 70 61 74 68  se the log-fpath
bfc0: 20 63 6f 6e 63 27 64 20 77 69 74 68 20 70 61 74   conc'd with pat
bfd0: 68 6d 6f 64 0a 09 09 09 09 09 09 09 09 09 20 20  hmod..........  
bfe0: 20 20 20 20 28 73 65 74 21 20 6e 65 77 70 61 74      (set! newpat
bff0: 68 20 28 63 6f 6e 63 20 70 61 74 68 6d 6f 64 20  h (conc pathmod 
c000: 6c 6f 67 2d 66 70 61 74 68 29 29 0a 09 09 09 09  log-fpath)).....
c010: 09 09 09 09 09 20 20 20 20 20 20 28 69 66 20 77  .....      (if w
c020: 69 6e 64 6f 77 73 20 28 73 74 72 69 6e 67 2d 74  indows (string-t
c030: 72 61 6e 73 6c 61 74 65 20 6e 65 77 70 61 74 68  ranslate newpath
c040: 20 22 2f 22 20 22 5c 5c 22 29 20 6e 65 77 70 61   "/" "\\") newpa
c050: 74 68 29 29 0a 09 09 09 09 09 09 09 09 09 20 20  th))..........  
c060: 20 20 28 69 66 20 28 3e 20 2a 76 65 72 62 6f 73    (if (> *verbos
c070: 69 74 79 2a 20 31 29 0a 09 09 09 09 09 09 09 09  ity* 1).........
c080: 09 09 28 63 6f 6e 63 20 66 69 6e 61 6c 2d 6c 6f  ..(conc final-lo
c090: 67 20 22 20 6e 6f 74 2d 66 6f 75 6e 64 22 29 0a  g " not-found").
c0a0: 09 09 09 09 09 09 09 09 09 09 22 22 29 29 29 0a  ..........""))).
c0b0: 09 09 09 09 09 20 20 28 76 65 63 74 6f 72 2d 3e  .....  (vector->
c0c0: 6c 69 73 74 20 76 62 29 29 0a 09 09 09 09 09 62  list vb))......b
c0d0: 29 29 29 29 29 0a 09 20 20 20 64 62 0a 09 20 20  )))))..   db..  
c0e0: 20 6d 61 69 6e 71 72 79 0a 09 20 20 20 72 75 6e   mainqry..   run
c0f0: 73 70 61 74 74 20 28 6d 61 70 20 63 61 64 72 20  spatt (map cadr 
c100: 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 29 29 0a  keypatt-alist)).
c110: 20 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74      (debug:print
c120: 20 32 20 22 46 6f 75 6e 64 20 22 20 28 6c 65 6e   2 "Found " (len
c130: 67 74 68 20 74 65 73 74 2d 69 64 73 29 20 22 20  gth test-ids) " 
c140: 72 65 63 6f 72 64 73 22 29 0a 20 20 20 20 28 73  records").    (s
c150: 65 74 21 20 72 65 73 75 6c 74 73 20 28 6c 69 73  et! results (lis
c160: 74 20 28 63 6f 6e 73 20 22 52 75 6e 73 22 20 72  t (cons "Runs" r
c170: 65 73 75 6c 74 73 29 29 29 0a 20 20 20 20 3b 3b  esults))).    ;;
c180: 20 6e 6f 77 2c 20 66 6f 72 20 65 61 63 68 20 74   now, for each t
c190: 65 73 74 2c 20 63 6f 6c 6c 65 63 74 20 74 68 65  est, collect the
c1a0: 20 74 65 73 74 5f 64 61 74 61 20 69 6e 66 6f 20   test_data info 
c1b0: 61 6e 64 20 61 64 64 20 61 20 6e 65 77 20 73 68  and add a new sh
c1c0: 65 65 74 0a 20 20 20 20 28 66 6f 72 2d 65 61 63  eet.    (for-eac
c1d0: 68 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28  h.     (lambda (
c1e0: 74 65 73 74 2d 69 64 29 0a 20 20 20 20 20 20 20  test-id).       
c1f0: 28 6c 65 74 20 28 28 74 65 73 74 2d 64 61 74 61  (let ((test-data
c200: 20 28 6c 69 73 74 20 74 65 73 74 64 61 74 61 2d   (list testdata-
c210: 68 65 61 64 65 72 29 29 0a 09 20 20 20 20 20 28  header))..     (
c220: 63 75 72 72 2d 74 65 73 74 2d 6e 61 6d 65 20 23  curr-test-name #
c230: 66 29 29 0a 09 20 28 73 71 6c 69 74 65 33 3a 66  f)).. (sqlite3:f
c240: 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 09 20 20 28  or-each-row..  (
c250: 6c 61 6d 62 64 61 20 28 72 75 6e 2d 69 64 20 74  lambda (run-id t
c260: 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74  estname item-pat
c270: 68 20 63 61 74 65 67 6f 72 79 20 76 61 72 69 61  h category varia
c280: 62 6c 65 20 76 61 6c 75 65 20 65 78 70 65 63 74  ble value expect
c290: 65 64 20 74 6f 6c 20 75 6e 69 74 73 20 73 74 61  ed tol units sta
c2a0: 74 75 73 20 63 6f 6d 6d 65 6e 74 29 0a 09 20 20  tus comment)..  
c2b0: 20 20 28 73 65 74 21 20 63 75 72 72 2d 74 65 73    (set! curr-tes
c2c0: 74 2d 6e 61 6d 65 20 74 65 73 74 6e 61 6d 65 29  t-name testname)
c2d0: 0a 09 20 20 20 20 28 73 65 74 21 20 74 65 73 74  ..    (set! test
c2e0: 2d 64 61 74 61 20 28 61 70 70 65 6e 64 20 74 65  -data (append te
c2f0: 73 74 2d 64 61 74 61 20 28 6c 69 73 74 20 28 6c  st-data (list (l
c300: 69 73 74 20 72 75 6e 2d 69 64 20 74 65 73 74 6e  ist run-id testn
c310: 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 63 61  ame item-path ca
c320: 74 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65 20  tegory variable 
c330: 76 61 6c 75 65 20 65 78 70 65 63 74 65 64 20 74  value expected t
c340: 6f 6c 20 75 6e 69 74 73 20 73 74 61 74 75 73 20  ol units status 
c350: 63 6f 6d 6d 65 6e 74 29 29 29 29 29 0a 09 20 20  comment)))))..  
c360: 64 62 20 0a 09 20 20 3b 3b 20 22 53 45 4c 45 43  db ..  ;; "SELEC
c370: 54 20 72 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d  T run_id,testnam
c380: 65 2c 69 74 65 6d 5f 70 61 74 68 2c 63 61 74 65  e,item_path,cate
c390: 67 6f 72 79 2c 76 61 72 69 61 62 6c 65 2c 74 64  gory,variable,td
c3a0: 2e 76 61 6c 75 65 20 41 53 20 76 61 6c 75 65 2c  .value AS value,
c3b0: 65 78 70 65 63 74 65 64 2c 74 6f 6c 2c 75 6e 69  expected,tol,uni
c3c0: 74 73 2c 74 64 2e 73 74 61 74 75 73 20 41 53 20  ts,td.status AS 
c3d0: 73 74 61 74 75 73 2c 74 64 2e 63 6f 6d 6d 65 6e  status,td.commen
c3e0: 74 20 41 53 20 63 6f 6d 6d 65 6e 74 20 46 52 4f  t AS comment FRO
c3f0: 4d 20 74 65 73 74 5f 64 61 74 61 20 41 53 20 74  M test_data AS t
c400: 64 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 74 65 73  d INNER JOIN tes
c410: 74 73 20 4f 4e 20 74 65 73 74 73 2e 69 64 3d 74  ts ON tests.id=t
c420: 64 2e 74 65 73 74 5f 69 64 20 57 48 45 52 45 20  d.test_id WHERE 
c430: 74 65 73 74 5f 69 64 3d 3f 3b 22 0a 09 20 20 22  test_id=?;"..  "
c440: 53 45 4c 45 43 54 20 72 75 6e 5f 69 64 2c 74 65  SELECT run_id,te
c450: 73 74 6e 61 6d 65 2c 69 74 65 6d 5f 70 61 74 68  stname,item_path
c460: 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62  ,category,variab
c470: 6c 65 2c 74 64 2e 76 61 6c 75 65 20 41 53 20 76  le,td.value AS v
c480: 61 6c 75 65 2c 74 64 2e 65 78 70 65 63 74 65 64  alue,td.expected
c490: 2c 74 64 2e 74 6f 6c 2c 74 64 2e 75 6e 69 74 73  ,td.tol,td.units
c4a0: 2c 74 64 2e 73 74 61 74 75 73 20 41 53 20 73 74  ,td.status AS st
c4b0: 61 74 75 73 2c 74 64 2e 63 6f 6d 6d 65 6e 74 20  atus,td.comment 
c4c0: 41 53 20 63 6f 6d 6d 65 6e 74 20 46 52 4f 4d 20  AS comment FROM 
c4d0: 74 65 73 74 5f 64 61 74 61 20 41 53 20 74 64 20  test_data AS td 
c4e0: 49 4e 4e 45 52 20 4a 4f 49 4e 20 74 65 73 74 73  INNER JOIN tests
c4f0: 20 4f 4e 20 74 65 73 74 73 2e 69 64 3d 74 64 2e   ON tests.id=td.
c500: 74 65 73 74 5f 69 64 20 57 48 45 52 45 20 74 65  test_id WHERE te
c510: 73 74 6e 61 6d 65 3d 3f 3b 22 0a 09 20 20 74 65  stname=?;"..  te
c520: 73 74 2d 69 64 29 0a 09 20 28 69 66 20 63 75 72  st-id).. (if cur
c530: 72 2d 74 65 73 74 2d 6e 61 6d 65 0a 09 20 20 20  r-test-name..   
c540: 20 20 28 73 65 74 21 20 72 65 73 75 6c 74 73 20    (set! results 
c550: 28 61 70 70 65 6e 64 20 72 65 73 75 6c 74 73 20  (append results 
c560: 28 6c 69 73 74 20 28 63 6f 6e 73 20 63 75 72 72  (list (cons curr
c570: 2d 74 65 73 74 2d 6e 61 6d 65 20 74 65 73 74 2d  -test-name test-
c580: 64 61 74 61 29 29 29 29 29 0a 09 20 29 29 0a 20  data))))).. )). 
c590: 20 20 20 20 28 73 6f 72 74 20 28 64 65 6c 65 74      (sort (delet
c5a0: 65 2d 64 75 70 6c 69 63 61 74 65 73 20 74 65 73  e-duplicates tes
c5b0: 74 2d 69 64 73 29 20 73 74 72 69 6e 67 3c 3d 29  t-ids) string<=)
c5c0: 29 0a 20 20 20 20 28 73 79 73 74 65 6d 20 28 63  ).    (system (c
c5d0: 6f 6e 63 20 22 6d 6b 64 69 72 20 2d 70 20 22 20  onc "mkdir -p " 
c5e0: 74 65 6d 70 64 69 72 29 29 0a 20 20 20 20 3b 3b  tempdir)).    ;;
c5f0: 20 28 70 70 20 72 65 73 75 6c 74 73 29 0a 20 20   (pp results).  
c600: 20 20 28 6f 64 73 3a 6c 69 73 74 2d 3e 6f 64 73    (ods:list->ods
c610: 20 0a 20 20 20 20 20 74 65 6d 70 64 69 72 0a 20   .     tempdir. 
c620: 20 20 20 20 28 69 66 20 28 73 74 72 69 6e 67 2d      (if (string-
c630: 6d 61 74 63 68 20 28 72 65 67 65 78 70 20 22 5e  match (regexp "^
c640: 5b 2f 7e 5d 2b 2e 2a 22 29 20 6f 75 74 70 75 74  [/~]+.*") output
c650: 66 69 6c 65 29 20 3b 3b 20 66 75 6c 6c 20 70 61  file) ;; full pa
c660: 74 68 3f 0a 09 20 6f 75 74 70 75 74 66 69 6c 65  th?.. outputfile
c670: 0a 09 20 28 62 65 67 69 6e 0a 09 20 20 20 28 64  .. (begin..   (d
c680: 65 62 75 67 3a 70 72 69 6e 74 20 30 20 22 57 41  ebug:print 0 "WA
c690: 52 4e 49 4e 47 3a 20 70 61 74 68 20 67 69 76 65  RNING: path give
c6a0: 6e 2c 20 22 20 6f 75 74 70 75 74 66 69 6c 65 20  n, " outputfile 
c6b0: 22 20 69 73 20 72 65 6c 61 74 69 76 65 2c 20 70  " is relative, p
c6c0: 72 65 66 69 78 69 6e 67 20 77 69 74 68 20 63 75  refixing with cu
c6d0: 72 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 22  rrent directory"
c6e0: 29 0a 09 20 20 20 28 63 6f 6e 63 20 28 63 75 72  )..   (conc (cur
c6f0: 72 65 6e 74 2d 64 69 72 65 63 74 6f 72 79 29 20  rent-directory) 
c700: 22 2f 22 20 6f 75 74 70 75 74 66 69 6c 65 29 29  "/" outputfile))
c710: 29 0a 20 20 20 20 20 72 65 73 75 6c 74 73 29 0a  ).     results).
c720: 20 20 20 20 3b 3b 20 62 72 75 74 61 6c 20 63 6c      ;; brutal cl
c730: 65 61 6e 20 75 70 0a 20 20 20 20 28 73 79 73 74  ean up.    (syst
c740: 65 6d 20 22 72 6d 20 2d 72 66 20 74 65 6d 70 64  em "rm -rf tempd
c750: 69 72 22 29 29 29 0a 0a 3b 3b 20 28 64 62 3a 65  ir")))..;; (db:e
c760: 78 74 72 61 63 74 2d 6f 64 73 2d 66 69 6c 65 20  xtract-ods-file 
c770: 64 62 20 22 6f 75 74 70 75 74 66 69 6c 65 2e 6f  db "outputfile.o
c780: 64 73 22 20 27 28 28 22 73 79 73 6e 61 6d 65 22  ds" '(("sysname"
c790: 20 22 25 22 29 28 22 66 73 6e 61 6d 65 22 20 22   "%")("fsname" "
c7a0: 25 22 29 28 22 64 61 74 61 70 61 74 68 22 20 22  %")("datapath" "
c7b0: 25 22 29 29 20 22 25 22 29 0a 0a 0a 3b 3b 3d 3d  %")) "%")...;;==
c7c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
c7d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
c7e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
c7f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
c800: 3d 3d 3d 3d 0a 3b 3b 20 52 45 4d 4f 54 45 20 44  ====.;; REMOTE D
c810: 42 20 41 43 43 45 53 53 20 56 49 41 20 52 50 43  B ACCESS VIA RPC
c820: 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  .;;=============
c830: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
c840: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
c850: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
c860: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65 66 69  =========..(defi
c870: 6e 65 20 28 72 64 62 3a 73 65 74 2d 74 65 73 74  ne (rdb:set-test
c880: 73 2d 73 74 61 74 65 2d 73 74 61 74 75 73 20 64  s-state-status d
c890: 62 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d  b run-id testnam
c8a0: 65 73 20 63 75 72 72 73 74 61 74 65 20 63 75 72  es currstate cur
c8b0: 72 73 74 61 74 75 73 20 6e 65 77 73 74 61 74 65  rstatus newstate
c8c0: 20 6e 65 77 73 74 61 74 75 73 29 0a 20 20 28 69   newstatus).  (i
c8d0: 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20  f *runremote*.  
c8e0: 20 20 20 20 28 6c 65 74 20 28 28 68 6f 73 74 20      (let ((host 
c8f0: 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e  (vector-ref *run
c900: 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20 20  remote* 0))..   
c910: 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72 2d 72   (port (vector-r
c920: 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31  ef *runremote* 1
c930: 29 29 29 0a 09 28 28 72 70 63 3a 70 72 6f 63 65  )))..((rpc:proce
c940: 64 75 72 65 20 27 72 64 62 3a 73 65 74 2d 74 65  dure 'rdb:set-te
c950: 73 74 73 2d 73 74 61 74 65 2d 73 74 61 74 75 73  sts-state-status
c960: 20 68 6f 73 74 20 70 6f 72 74 29 0a 09 20 72 75   host port).. ru
c970: 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 73 20 63  n-id testnames c
c980: 75 72 72 73 74 61 74 65 20 63 75 72 72 73 74 61  urrstate currsta
c990: 74 75 73 20 6e 65 77 73 74 61 74 65 20 6e 65 77  tus newstate new
c9a0: 73 74 61 74 75 73 29 29 0a 20 20 20 20 20 20 28  status)).      (
c9b0: 64 62 3a 73 65 74 2d 74 65 73 74 73 2d 73 74 61  db:set-tests-sta
c9c0: 74 65 2d 73 74 61 74 75 73 20 64 62 20 72 75 6e  te-status db run
c9d0: 2d 69 64 20 74 65 73 74 6e 61 6d 65 73 20 63 75  -id testnames cu
c9e0: 72 72 73 74 61 74 65 20 63 75 72 72 73 74 61 74  rrstate currstat
c9f0: 75 73 20 6e 65 77 73 74 61 74 65 20 6e 65 77 73  us newstate news
ca00: 74 61 74 75 73 29 29 29 0a 0a 28 64 65 66 69 6e  tatus)))..(defin
ca10: 65 20 28 72 64 62 3a 74 65 73 74 73 74 65 70 2d  e (rdb:teststep-
ca20: 73 65 74 2d 73 74 61 74 75 73 21 20 64 62 20 72  set-status! db r
ca30: 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20  un-id test-name 
ca40: 74 65 73 74 73 74 65 70 2d 6e 61 6d 65 20 73 74  teststep-name st
ca50: 61 74 65 2d 69 6e 20 73 74 61 74 75 73 2d 69 6e  ate-in status-in
ca60: 20 69 74 65 6d 64 61 74 20 63 6f 6d 6d 65 6e 74   itemdat comment
ca70: 20 6c 6f 67 66 69 6c 65 29 0a 20 20 28 6c 65 74   logfile).  (let
ca80: 20 28 28 69 74 65 6d 2d 70 61 74 68 20 28 69 74   ((item-path (it
ca90: 65 6d 2d 6c 69 73 74 2d 3e 70 61 74 68 20 69 74  em-list->path it
caa0: 65 6d 64 61 74 29 29 29 0a 20 20 20 20 28 69 66  emdat))).    (if
cab0: 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 09 28 6c   *runremote*..(l
cac0: 65 74 20 28 28 68 6f 73 74 20 28 76 65 63 74 6f  et ((host (vecto
cad0: 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65  r-ref *runremote
cae0: 2a 20 30 29 29 0a 09 20 20 20 20 20 20 28 70 6f  * 0))..      (po
caf0: 72 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a  rt (vector-ref *
cb00: 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a  runremote* 1))).
cb10: 09 20 20 28 28 72 70 63 3a 70 72 6f 63 65 64 75  .  ((rpc:procedu
cb20: 72 65 20 27 72 64 62 3a 74 65 73 74 73 74 65 70  re 'rdb:teststep
cb30: 2d 73 65 74 2d 73 74 61 74 75 73 21 20 68 6f 73  -set-status! hos
cb40: 74 20 70 6f 72 74 29 0a 09 20 20 20 72 75 6e 2d  t port)..   run-
cb50: 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 74 65 73  id test-name tes
cb60: 74 73 74 65 70 2d 6e 61 6d 65 20 73 74 61 74 65  tstep-name state
cb70: 2d 69 6e 20 73 74 61 74 75 73 2d 69 6e 20 69 74  -in status-in it
cb80: 65 6d 2d 70 61 74 68 20 63 6f 6d 6d 65 6e 74 20  em-path comment 
cb90: 6c 6f 67 66 69 6c 65 29 29 0a 09 28 64 62 3a 74  logfile))..(db:t
cba0: 65 73 74 73 74 65 70 2d 73 65 74 2d 73 74 61 74  eststep-set-stat
cbb0: 75 73 21 20 64 62 20 72 75 6e 2d 69 64 20 74 65  us! db run-id te
cbc0: 73 74 2d 6e 61 6d 65 20 74 65 73 74 73 74 65 70  st-name teststep
cbd0: 2d 6e 61 6d 65 20 73 74 61 74 65 2d 69 6e 20 73  -name state-in s
cbe0: 74 61 74 75 73 2d 69 6e 20 69 74 65 6d 2d 70 61  tatus-in item-pa
cbf0: 74 68 20 63 6f 6d 6d 65 6e 74 20 6c 6f 67 66 69  th comment logfi
cc00: 6c 65 29 29 29 29 0a 0a 28 64 65 66 69 6e 65 20  le))))..(define 
cc10: 28 72 64 62 3a 74 65 73 74 2d 75 70 64 61 74 65  (rdb:test-update
cc20: 2d 6d 65 74 61 2d 69 6e 66 6f 20 64 62 20 72 75  -meta-info db ru
cc30: 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69  n-id test-name i
cc40: 74 65 6d 64 61 74 20 6d 69 6e 75 74 65 73 20 63  temdat minutes c
cc50: 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20  puload diskfree 
cc60: 74 6d 70 66 72 65 65 29 0a 20 20 28 6c 65 74 20  tmpfree).  (let 
cc70: 28 28 69 74 65 6d 2d 70 61 74 68 20 28 69 74 65  ((item-path (ite
cc80: 6d 2d 6c 69 73 74 2d 3e 70 61 74 68 20 69 74 65  m-list->path ite
cc90: 6d 64 61 74 29 29 29 0a 20 20 20 20 28 69 66 20  mdat))).    (if 
cca0: 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 09 28 6c 65  *runremote*..(le
ccb0: 74 20 28 28 68 6f 73 74 20 28 76 65 63 74 6f 72  t ((host (vector
ccc0: 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a  -ref *runremote*
ccd0: 20 30 29 29 0a 09 20 20 20 20 20 20 28 70 6f 72   0))..      (por
cce0: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72  t (vector-ref *r
ccf0: 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09  unremote* 1)))..
cd00: 20 20 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72    ((rpc:procedur
cd10: 65 20 27 72 64 62 3a 74 65 73 74 2d 75 70 64 61  e 'rdb:test-upda
cd20: 74 65 2d 6d 65 74 61 2d 69 6e 66 6f 20 68 6f 73  te-meta-info hos
cd30: 74 20 70 6f 72 74 29 0a 09 20 20 20 72 75 6e 2d  t port)..   run-
cd40: 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65  id test-name ite
cd50: 6d 2d 70 61 74 68 20 6d 69 6e 75 74 65 73 20 63  m-path minutes c
cd60: 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20  puload diskfree 
cd70: 74 6d 70 66 72 65 65 29 29 0a 09 28 64 62 3a 74  tmpfree))..(db:t
cd80: 65 73 74 2d 75 70 64 61 74 65 2d 6d 65 74 61 2d  est-update-meta-
cd90: 69 6e 66 6f 20 64 62 20 72 75 6e 2d 69 64 20 74  info db run-id t
cda0: 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61  est-name item-pa
cdb0: 74 68 20 6d 69 6e 75 74 65 73 20 63 70 75 6c 6f  th minutes cpulo
cdc0: 61 64 20 64 69 73 6b 66 72 65 65 20 74 6d 70 66  ad diskfree tmpf
cdd0: 72 65 65 29 29 29 29 0a 0a 28 64 65 66 69 6e 65  ree))))..(define
cde0: 20 28 72 64 62 3a 74 65 73 74 2d 73 65 74 2d 73   (rdb:test-set-s
cdf0: 74 61 74 65 2d 73 74 61 74 75 73 2d 62 79 2d 72  tate-status-by-r
ce00: 75 6e 2d 69 64 2d 74 65 73 74 6e 61 6d 65 20 64  un-id-testname d
ce10: 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61  b run-id test-na
ce20: 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 73 74 61  me item-path sta
ce30: 74 75 73 20 73 74 61 74 65 29 0a 20 20 28 69 66  tus state).  (if
ce40: 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20   *runremote*.   
ce50: 20 20 20 28 6c 65 74 20 28 28 68 6f 73 74 20 28     (let ((host (
ce60: 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72  vector-ref *runr
ce70: 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20 20 20  emote* 0))..    
ce80: 28 70 6f 72 74 20 28 76 65 63 74 6f 72 2d 72 65  (port (vector-re
ce90: 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29  f *runremote* 1)
cea0: 29 29 0a 09 28 28 72 70 63 3a 70 72 6f 63 65 64  ))..((rpc:proced
ceb0: 75 72 65 20 27 72 64 62 3a 74 65 73 74 2d 73 65  ure 'rdb:test-se
cec0: 74 2d 73 74 61 74 65 2d 73 74 61 74 75 73 2d 62  t-state-status-b
ced0: 79 2d 72 75 6e 2d 69 64 2d 74 65 73 74 6e 61 6d  y-run-id-testnam
cee0: 65 20 68 6f 73 74 20 70 6f 72 74 29 0a 09 20 20  e host port)..  
cef0: 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65  run-id test-name
cf00: 20 69 74 65 6d 2d 70 61 74 68 20 73 74 61 74 75   item-path statu
cf10: 73 20 73 74 61 74 65 29 29 0a 20 20 20 20 20 20  s state)).      
cf20: 28 64 62 3a 74 65 73 74 2d 73 65 74 2d 73 74 61  (db:test-set-sta
cf30: 74 65 2d 73 74 61 74 75 73 2d 62 79 2d 72 75 6e  te-status-by-run
cf40: 2d 69 64 2d 74 65 73 74 6e 61 6d 65 20 64 62 20  -id-testname db 
cf50: 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65  run-id test-name
cf60: 20 69 74 65 6d 2d 70 61 74 68 20 73 74 61 74 75   item-path statu
cf70: 73 20 73 74 61 74 65 29 29 29 0a 0a 28 64 65 66  s state)))..(def
cf80: 69 6e 65 20 28 72 64 62 3a 63 73 76 2d 3e 74 65  ine (rdb:csv->te
cf90: 73 74 2d 64 61 74 61 20 64 62 20 74 65 73 74 2d  st-data db test-
cfa0: 69 64 20 63 73 76 64 61 74 61 29 0a 20 20 28 69  id csvdata).  (i
cfb0: 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20  f *runremote*.  
cfc0: 20 20 20 20 28 6c 65 74 20 28 28 68 6f 73 74 20      (let ((host 
cfd0: 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e  (vector-ref *run
cfe0: 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20 20  remote* 0))..   
cff0: 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72 2d 72   (port (vector-r
d000: 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31  ef *runremote* 1
d010: 29 29 29 0a 09 28 28 72 70 63 3a 70 72 6f 63 65  )))..((rpc:proce
d020: 64 75 72 65 20 27 72 64 62 3a 63 73 76 2d 3e 74  dure 'rdb:csv->t
d030: 65 73 74 2d 64 61 74 61 20 68 6f 73 74 20 70 6f  est-data host po
d040: 72 74 29 0a 09 20 74 65 73 74 2d 69 64 20 63 73  rt).. test-id cs
d050: 76 64 61 74 61 29 29 0a 20 20 20 20 20 20 28 64  vdata)).      (d
d060: 62 3a 63 73 76 2d 3e 74 65 73 74 2d 64 61 74 61  b:csv->test-data
d070: 20 64 62 20 74 65 73 74 2d 69 64 20 63 73 76 64   db test-id csvd
d080: 61 74 61 29 29 29 0a 0a 28 64 65 66 69 6e 65 20  ata)))..(define 
d090: 28 72 64 62 3a 72 6f 6c 6c 2d 75 70 2d 70 61 73  (rdb:roll-up-pas
d0a0: 73 2d 66 61 69 6c 2d 63 6f 75 6e 74 73 20 64 62  s-fail-counts db
d0b0: 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d   run-id test-nam
d0c0: 65 20 69 74 65 6d 2d 70 61 74 68 20 73 74 61 74  e item-path stat
d0d0: 75 73 29 0a 20 20 28 69 66 20 2a 72 75 6e 72 65  us).  (if *runre
d0e0: 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c 65 74  mote*.      (let
d0f0: 20 28 28 68 6f 73 74 20 28 76 65 63 74 6f 72 2d   ((host (vector-
d100: 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20  ref *runremote* 
d110: 30 29 29 0a 09 20 20 20 20 28 70 6f 72 74 20 28  0))..    (port (
d120: 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72  vector-ref *runr
d130: 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28 28 72  emote* 1)))..((r
d140: 70 63 3a 70 72 6f 63 65 64 75 72 65 20 27 72 64  pc:procedure 'rd
d150: 62 3a 72 6f 6c 6c 2d 75 70 2d 70 61 73 73 2d 66  b:roll-up-pass-f
d160: 61 69 6c 2d 63 6f 75 6e 74 73 20 68 6f 73 74 20  ail-counts host 
d170: 70 6f 72 74 29 0a 09 20 72 75 6e 2d 69 64 20 74  port).. run-id t
d180: 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61  est-name item-pa
d190: 74 68 20 73 74 61 74 75 73 29 29 0a 20 20 20 20  th status)).    
d1a0: 20 20 28 64 62 3a 72 6f 6c 6c 2d 75 70 2d 70 61    (db:roll-up-pa
d1b0: 73 73 2d 66 61 69 6c 2d 63 6f 75 6e 74 73 20 64  ss-fail-counts d
d1c0: 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61  b run-id test-na
d1d0: 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 73 74 61  me item-path sta
d1e0: 74 75 73 29 29 29 0a 0a 28 64 65 66 69 6e 65 20  tus)))..(define 
d1f0: 28 72 64 62 3a 74 65 73 74 2d 73 65 74 2d 63 6f  (rdb:test-set-co
d200: 6d 6d 65 6e 74 20 64 62 20 72 75 6e 2d 69 64 20  mment db run-id 
d210: 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70  test-name item-p
d220: 61 74 68 20 63 6f 6d 6d 65 6e 74 29 0a 20 20 28  ath comment).  (
d230: 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20  if *runremote*. 
d240: 20 20 20 20 20 28 6c 65 74 20 28 28 68 6f 73 74       (let ((host
d250: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75   (vector-ref *ru
d260: 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20  nremote* 0))..  
d270: 20 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72 2d    (port (vector-
d280: 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20  ref *runremote* 
d290: 31 29 29 29 0a 09 28 28 72 70 63 3a 70 72 6f 63  1)))..((rpc:proc
d2a0: 65 64 75 72 65 20 27 72 64 62 3a 74 65 73 74 2d  edure 'rdb:test-
d2b0: 73 65 74 2d 63 6f 6d 6d 65 6e 74 20 68 6f 73 74  set-comment host
d2c0: 20 70 6f 72 74 29 0a 09 20 72 75 6e 2d 69 64 20   port).. run-id 
d2d0: 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70  test-name item-p
d2e0: 61 74 68 20 63 6f 6d 6d 65 6e 74 29 29 0a 20 20  ath comment)).  
d2f0: 20 20 20 20 28 64 62 3a 74 65 73 74 2d 73 65 74      (db:test-set
d300: 2d 63 6f 6d 6d 65 6e 74 20 64 62 20 72 75 6e 2d  -comment db run-
d310: 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65  id test-name ite
d320: 6d 2d 70 61 74 68 20 63 6f 6d 6d 65 6e 74 29 29  m-path comment))
d330: 29 0a 0a 28 64 65 66 69 6e 65 20 28 72 64 62 3a  )..(define (rdb:
d340: 74 65 73 74 2d 73 65 74 2d 6c 6f 67 21 20 64 62  test-set-log! db
d350: 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d   run-id test-nam
d360: 65 20 69 74 65 6d 2d 70 61 74 68 20 6c 6f 67 66  e item-path logf
d370: 29 0a 20 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f  ).  (if *runremo
d380: 74 65 2a 0a 20 20 20 20 20 20 28 6c 65 74 20 28  te*.      (let (
d390: 28 68 6f 73 74 20 28 76 65 63 74 6f 72 2d 72 65  (host (vector-re
d3a0: 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29  f *runremote* 0)
d3b0: 29 0a 09 20 20 20 20 28 70 6f 72 74 20 28 76 65  )..    (port (ve
d3c0: 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d  ctor-ref *runrem
d3d0: 6f 74 65 2a 20 31 29 29 29 0a 09 28 28 72 70 63  ote* 1)))..((rpc
d3e0: 3a 70 72 6f 63 65 64 75 72 65 20 27 72 64 62 3a  :procedure 'rdb:
d3f0: 74 65 73 74 2d 73 65 74 2d 6c 6f 67 21 20 68 6f  test-set-log! ho
d400: 73 74 20 70 6f 72 74 29 0a 09 20 72 75 6e 2d 69  st port).. run-i
d410: 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d  d test-name item
d420: 2d 70 61 74 68 20 6c 6f 67 66 29 29 0a 20 20 20  -path logf)).   
d430: 20 20 20 28 64 62 3a 74 65 73 74 2d 73 65 74 2d     (db:test-set-
d440: 6c 6f 67 21 20 64 62 20 72 75 6e 2d 69 64 20 74  log! db run-id t
d450: 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61  est-name item-pa
d460: 74 68 20 6c 6f 67 66 29 29 29 0a 0a 28 64 65 66  th logf)))..(def
d470: 69 6e 65 20 28 72 64 62 3a 67 65 74 2d 72 75 6e  ine (rdb:get-run
d480: 73 20 64 62 20 72 75 6e 6e 61 6d 65 70 61 74 74  s db runnamepatt
d490: 20 6e 75 6d 72 75 6e 73 20 73 74 61 72 74 72 75   numruns startru
d4a0: 6e 6f 66 66 73 65 74 20 6b 65 79 70 61 74 74 73  noffset keypatts
d4b0: 29 0a 20 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f  ).  (if *runremo
d4c0: 74 65 2a 0a 20 20 20 20 20 20 28 6c 65 74 20 28  te*.      (let (
d4d0: 28 68 6f 73 74 20 28 76 65 63 74 6f 72 2d 72 65  (host (vector-re
d4e0: 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29  f *runremote* 0)
d4f0: 29 0a 09 20 20 20 20 28 70 6f 72 74 20 28 76 65  )..    (port (ve
d500: 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d  ctor-ref *runrem
d510: 6f 74 65 2a 20 31 29 29 29 0a 09 28 28 72 70 63  ote* 1)))..((rpc
d520: 3a 70 72 6f 63 65 64 75 72 65 20 27 72 64 62 3a  :procedure 'rdb:
d530: 67 65 74 2d 72 75 6e 73 20 68 6f 73 74 20 70 6f  get-runs host po
d540: 72 74 29 0a 09 20 72 75 6e 6e 61 6d 65 70 61 74  rt).. runnamepat
d550: 74 20 6e 75 6d 72 75 6e 73 20 73 74 61 72 74 72  t numruns startr
d560: 75 6e 6f 66 66 73 65 74 20 6b 65 79 70 61 74 74  unoffset keypatt
d570: 73 29 29 0a 20 20 20 20 20 20 28 64 62 3a 67 65  s)).      (db:ge
d580: 74 2d 72 75 6e 73 20 64 62 20 72 75 6e 6e 61 6d  t-runs db runnam
d590: 65 70 61 74 74 20 6e 75 6d 72 75 6e 73 20 73 74  epatt numruns st
d5a0: 61 72 74 72 75 6e 6f 66 66 73 65 74 20 6b 65 79  artrunoffset key
d5b0: 70 61 74 74 73 29 29 29 0a 0a 28 64 65 66 69 6e  patts)))..(defin
d5c0: 65 20 28 72 64 62 3a 67 65 74 2d 74 65 73 74 73  e (rdb:get-tests
d5d0: 2d 66 6f 72 2d 72 75 6e 20 64 62 20 72 75 6e 2d  -for-run db run-
d5e0: 69 64 20 74 65 73 74 70 61 74 74 20 69 74 65 6d  id testpatt item
d5f0: 70 61 74 74 20 73 74 61 74 65 73 20 73 74 61 74  patt states stat
d600: 75 73 65 73 29 0a 20 20 28 69 66 20 2a 72 75 6e  uses).  (if *run
d610: 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c  remote*.      (l
d620: 65 74 20 28 28 68 6f 73 74 20 28 76 65 63 74 6f  et ((host (vecto
d630: 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65  r-ref *runremote
d640: 2a 20 30 29 29 0a 09 20 20 20 20 28 70 6f 72 74  * 0))..    (port
d650: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75   (vector-ref *ru
d660: 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28  nremote* 1)))..(
d670: 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20 27  (rpc:procedure '
d680: 72 64 62 3a 67 65 74 2d 74 65 73 74 73 2d 66 6f  rdb:get-tests-fo
d690: 72 2d 72 75 6e 20 68 6f 73 74 20 70 6f 72 74 29  r-run host port)
d6a0: 0a 09 20 20 72 75 6e 2d 69 64 20 74 65 73 74 70  ..  run-id testp
d6b0: 61 74 74 20 69 74 65 6d 70 61 74 74 20 73 74 61  att itempatt sta
d6c0: 74 65 73 20 73 74 61 74 75 73 65 73 29 29 0a 20  tes statuses)). 
d6d0: 20 20 20 20 20 28 64 62 3a 67 65 74 2d 74 65 73       (db:get-tes
d6e0: 74 73 2d 66 6f 72 2d 72 75 6e 20 64 62 20 72 75  ts-for-run db ru
d6f0: 6e 2d 69 64 20 74 65 73 74 70 61 74 74 20 69 74  n-id testpatt it
d700: 65 6d 70 61 74 74 20 73 74 61 74 65 73 20 73 74  empatt states st
d710: 61 74 75 73 65 73 29 29 29 0a 0a 28 64 65 66 69  atuses)))..(defi
d720: 6e 65 20 28 72 64 62 3a 67 65 74 2d 74 65 73 74  ne (rdb:get-test
d730: 2d 64 61 74 61 2d 62 79 2d 69 64 20 64 62 20 74  -data-by-id db t
d740: 65 73 74 2d 69 64 29 0a 20 20 28 69 66 20 2a 72  est-id).  (if *r
d750: 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20  unremote*.      
d760: 28 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65 63  (let ((host (vec
d770: 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f  tor-ref *runremo
d780: 74 65 2a 20 30 29 29 0a 09 20 20 20 20 28 70 6f  te* 0))..    (po
d790: 72 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a  rt (vector-ref *
d7a0: 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a  runremote* 1))).
d7b0: 09 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65  .((rpc:procedure
d7c0: 20 27 72 70 63 3a 67 65 74 2d 74 65 73 74 2d 64   'rpc:get-test-d
d7d0: 61 74 61 2d 62 79 2d 69 64 20 68 6f 73 74 20 70  ata-by-id host p
d7e0: 6f 72 74 29 0a 09 20 74 65 73 74 2d 69 64 29 29  ort).. test-id))
d7f0: 0a 20 20 20 20 20 20 28 64 62 3a 67 65 74 2d 74  .      (db:get-t
d800: 65 73 74 2d 64 61 74 61 2d 62 79 2d 69 64 20 64  est-data-by-id d
d810: 62 20 74 65 73 74 2d 69 64 29 29 29 0a 20 20 20  b test-id))).   
d820: 20 20 20 0a 28 64 65 66 69 6e 65 20 28 72 64 62     .(define (rdb
d830: 3a 67 65 74 2d 6b 65 79 73 20 64 62 29 0a 20 20  :get-keys db).  
d840: 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a  (if *runremote*.
d850: 20 20 20 20 20 20 28 6c 65 74 20 28 28 68 6f 73        (let ((hos
d860: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72  t (vector-ref *r
d870: 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20  unremote* 0)).. 
d880: 20 20 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72     (port (vector
d890: 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a  -ref *runremote*
d8a0: 20 31 29 29 29 0a 09 28 69 66 20 2a 64 62 2d 6b   1)))..(if *db-k
d8b0: 65 79 73 2a 20 2a 64 62 2d 6b 65 79 73 2a 20 0a  eys* *db-keys* .
d8c0: 09 20 20 20 20 28 6c 65 74 20 28 28 6b 65 79 73  .    (let ((keys
d8d0: 20 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65   ((rpc:procedure
d8e0: 20 27 72 64 62 3a 67 65 74 2d 6b 65 79 73 20 68   'rdb:get-keys h
d8f0: 6f 73 74 20 70 6f 72 74 29 29 29 29 0a 09 20 20  ost port))))..  
d900: 20 20 20 20 28 73 65 74 21 20 2a 64 62 2d 6b 65      (set! *db-ke
d910: 79 73 2a 20 6b 65 79 73 29 0a 09 20 20 20 20 20  ys* keys)..     
d920: 20 6b 65 79 73 29 29 29 0a 20 20 20 20 20 20 28   keys))).      (
d930: 64 62 3a 67 65 74 2d 6b 65 79 73 20 64 62 29 29  db:get-keys db))
d940: 29 0a 09 20 0a 28 64 65 66 69 6e 65 20 28 72 64  ).. .(define (rd
d950: 62 3a 67 65 74 2d 6e 75 6d 2d 72 75 6e 73 20 64  b:get-num-runs d
d960: 62 20 72 75 6e 70 61 74 74 29 0a 20 20 28 69 66  b runpatt).  (if
d970: 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20   *runremote*.   
d980: 20 20 20 28 6c 65 74 20 28 28 68 6f 73 74 20 28     (let ((host (
d990: 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72  vector-ref *runr
d9a0: 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20 20 20  emote* 0))..    
d9b0: 28 70 6f 72 74 20 28 76 65 63 74 6f 72 2d 72 65  (port (vector-re
d9c0: 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29  f *runremote* 1)
d9d0: 29 29 0a 09 28 28 72 70 63 3a 70 72 6f 63 65 64  ))..((rpc:proced
d9e0: 75 72 65 20 27 72 64 62 3a 67 65 74 2d 6e 75 6d  ure 'rdb:get-num
d9f0: 2d 72 75 6e 73 20 68 6f 73 74 20 70 6f 72 74 29  -runs host port)
da00: 20 72 75 6e 70 61 74 74 29 29 0a 20 20 20 20 20   runpatt)).     
da10: 20 28 64 62 3a 67 65 74 2d 6e 75 6d 2d 72 75 6e   (db:get-num-run
da20: 73 20 64 62 20 72 75 6e 70 61 74 74 29 29 29 0a  s db runpatt))).
da30: 0a 28 64 65 66 69 6e 65 20 28 72 64 62 3a 74 65  .(define (rdb:te
da40: 73 74 2d 73 65 74 2d 73 74 61 74 65 2d 73 74 61  st-set-state-sta
da50: 74 75 73 2d 62 79 2d 69 64 20 64 62 20 74 65 73  tus-by-id db tes
da60: 74 2d 69 64 20 6e 65 77 73 74 61 74 65 20 6e 65  t-id newstate ne
da70: 77 73 74 61 74 75 73 20 6e 65 77 63 6f 6d 6d 65  wstatus newcomme
da80: 6e 74 29 0a 20 20 20 20 28 69 66 20 2a 72 75 6e  nt).    (if *run
da90: 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c  remote*.      (l
daa0: 65 74 20 28 28 68 6f 73 74 20 28 76 65 63 74 6f  et ((host (vecto
dab0: 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65  r-ref *runremote
dac0: 2a 20 30 29 29 0a 09 20 20 20 20 28 70 6f 72 74  * 0))..    (port
dad0: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75   (vector-ref *ru
dae0: 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28  nremote* 1)))..(
daf0: 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20 27  (rpc:procedure '
db00: 72 64 62 3a 74 65 73 74 2d 73 65 74 2d 73 74 61  rdb:test-set-sta
db10: 74 65 2d 73 74 61 74 75 73 2d 62 79 2d 69 64 20  te-status-by-id 
db20: 68 6f 73 74 20 70 6f 72 74 29 0a 09 20 74 65 73  host port).. tes
db30: 74 2d 69 64 20 6e 65 77 73 74 61 74 65 20 6e 65  t-id newstate ne
db40: 77 73 74 61 74 75 73 20 6e 65 77 63 6f 6d 6d 65  wstatus newcomme
db50: 6e 74 29 29 0a 20 20 20 20 20 20 28 64 62 3a 74  nt)).      (db:t
db60: 65 73 74 2d 73 65 74 2d 73 74 61 74 65 2d 73 74  est-set-state-st
db70: 61 74 75 73 2d 62 79 2d 69 64 20 64 62 20 74 65  atus-by-id db te
db80: 73 74 2d 69 64 20 6e 65 77 73 74 61 74 65 20 6e  st-id newstate n
db90: 65 77 73 74 61 74 75 73 20 6e 65 77 63 6f 6d 6d  ewstatus newcomm
dba0: 65 6e 74 29 29 29 0a 0a 28 64 65 66 69 6e 65 20  ent)))..(define 
dbb0: 28 72 64 62 3a 67 65 74 2d 6b 65 79 2d 76 61 6c  (rdb:get-key-val
dbc0: 2d 70 61 69 72 73 20 64 62 20 72 75 6e 2d 69 64  -pairs db run-id
dbd0: 29 0a 20 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f  ).  (if *runremo
dbe0: 74 65 2a 0a 20 20 20 20 20 20 28 6c 65 74 20 28  te*.      (let (
dbf0: 28 68 6f 73 74 20 28 76 65 63 74 6f 72 2d 72 65  (host (vector-re
dc00: 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29  f *runremote* 0)
dc10: 29 0a 09 20 20 20 20 28 70 6f 72 74 20 28 76 65  )..    (port (ve
dc20: 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d  ctor-ref *runrem
dc30: 6f 74 65 2a 20 31 29 29 29 0a 09 28 28 72 70 63  ote* 1)))..((rpc
dc40: 3a 70 72 6f 63 65 64 75 72 65 20 27 72 64 62 3a  :procedure 'rdb:
dc50: 67 65 74 2d 6b 65 79 2d 76 61 6c 2d 70 61 69 72  get-key-val-pair
dc60: 73 20 68 6f 73 74 20 70 6f 72 74 29 20 72 75 6e  s host port) run
dc70: 2d 69 64 29 29 0a 20 20 20 20 20 20 28 64 62 3a  -id)).      (db:
dc80: 67 65 74 2d 6b 65 79 2d 76 61 6c 2d 70 61 69 72  get-key-val-pair
dc90: 73 20 64 62 20 72 75 6e 2d 69 64 29 29 29 0a 09  s db run-id)))..
dca0: 20 0a 28 64 65 66 69 6e 65 20 28 72 64 62 3a 67   .(define (rdb:g
dcb0: 65 74 2d 6b 65 79 2d 76 61 6c 73 20 64 62 20 72  et-key-vals db r
dcc0: 75 6e 2d 69 64 29 0a 20 20 20 20 28 69 66 20 2a  un-id).    (if *
dcd0: 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20  runremote*.     
dce0: 20 28 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65   (let ((host (ve
dcf0: 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d  ctor-ref *runrem
dd00: 6f 74 65 2a 20 30 29 29 0a 09 20 20 20 20 28 70  ote* 0))..    (p
dd10: 6f 72 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20  ort (vector-ref 
dd20: 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29  *runremote* 1)))
dd30: 0a 09 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72  ..((rpc:procedur
dd40: 65 20 27 72 64 62 3a 67 65 74 2d 6b 65 79 2d 76  e 'rdb:get-key-v
dd50: 61 6c 73 20 68 6f 73 74 20 70 6f 72 74 29 20 72  als host port) r
dd60: 75 6e 2d 69 64 29 29 0a 20 20 20 20 20 20 28 64  un-id)).      (d
dd70: 62 3a 67 65 74 2d 6b 65 79 2d 76 61 6c 73 20 64  b:get-key-vals d
dd80: 62 20 72 75 6e 2d 69 64 29 29 29 0a 0a 28 64 65  b run-id)))..(de
dd90: 66 69 6e 65 20 28 72 64 62 3a 74 65 73 74 6d 65  fine (rdb:testme
dda0: 74 61 2d 67 65 74 2d 72 65 63 6f 72 64 20 64 62  ta-get-record db
ddb0: 20 74 65 73 74 6e 61 6d 65 29 0a 20 20 20 28 69   testname).   (i
ddc0: 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20  f *runremote*.  
ddd0: 20 20 20 20 28 6c 65 74 20 28 28 68 6f 73 74 20      (let ((host 
dde0: 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e  (vector-ref *run
ddf0: 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20 20  remote* 0))..   
de00: 20 28 70 6f 72 74 20 28 76 65 63 74 6f 72 2d 72   (port (vector-r
de10: 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31  ef *runremote* 1
de20: 29 29 29 0a 09 28 28 72 70 63 3a 70 72 6f 63 65  )))..((rpc:proce
de30: 64 75 72 65 20 27 72 64 62 3a 74 65 73 74 6d 65  dure 'rdb:testme
de40: 74 61 2d 67 65 74 2d 72 65 63 6f 72 64 20 68 6f  ta-get-record ho
de50: 73 74 20 70 6f 72 74 29 20 74 65 73 74 6e 61 6d  st port) testnam
de60: 65 29 29 0a 20 20 20 20 20 20 28 64 62 3a 74 65  e)).      (db:te
de70: 73 74 6d 65 74 61 2d 67 65 74 2d 72 65 63 6f 72  stmeta-get-recor
de80: 64 20 64 62 20 74 65 73 74 6e 61 6d 65 29 29 29  d db testname)))
de90: 0a 0a 28 64 65 66 69 6e 65 20 28 72 64 62 3a 67  ..(define (rdb:g
dea0: 65 74 2d 74 65 73 74 2d 64 61 74 61 2d 62 79 2d  et-test-data-by-
deb0: 69 64 20 64 62 20 74 65 73 74 2d 69 64 29 0a 20  id db test-id). 
dec0: 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a   (if *runremote*
ded0: 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28 68 6f  .      (let ((ho
dee0: 73 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a  st (vector-ref *
def0: 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 09  runremote* 0))..
df00: 20 20 20 20 28 70 6f 72 74 20 28 76 65 63 74 6f      (port (vecto
df10: 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65  r-ref *runremote
df20: 2a 20 31 29 29 29 0a 09 28 28 72 70 63 3a 70 72  * 1)))..((rpc:pr
df30: 6f 63 65 64 75 72 65 20 27 72 64 62 3a 67 65 74  ocedure 'rdb:get
df40: 2d 74 65 73 74 2d 64 61 74 61 2d 62 79 2d 69 64  -test-data-by-id
df50: 20 68 6f 73 74 20 70 6f 72 74 29 20 74 65 73 74   host port) test
df60: 2d 69 64 29 29 0a 20 20 20 20 20 20 28 64 62 3a  -id)).      (db:
df70: 67 65 74 2d 74 65 73 74 2d 64 61 74 61 2d 62 79  get-test-data-by
df80: 2d 69 64 20 64 62 20 74 65 73 74 2d 69 64 29 29  -id db test-id))
df90: 29 0a 0a 28 64 65 66 69 6e 65 20 28 72 64 62 3a  )..(define (rdb:
dfa0: 67 65 74 2d 72 75 6e 2d 69 6e 66 6f 20 64 62 20  get-run-info db 
dfb0: 72 75 6e 2d 69 64 29 0a 20 20 28 69 66 20 2a 72  run-id).  (if *r
dfc0: 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20  unremote*.      
dfd0: 28 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65 63  (let ((host (vec
dfe0: 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f  tor-ref *runremo
dff0: 74 65 2a 20 30 29 29 0a 09 20 20 20 20 28 70 6f  te* 0))..    (po
e000: 72 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a  rt (vector-ref *
e010: 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a  runremote* 1))).
e020: 09 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65  .((rpc:procedure
e030: 20 27 72 64 62 3a 67 65 74 2d 72 75 6e 2d 69 6e   'rdb:get-run-in
e040: 66 6f 20 68 6f 73 74 20 70 6f 72 74 29 20 72 75  fo host port) ru
e050: 6e 2d 69 64 29 29 0a 20 20 20 20 20 20 28 64 62  n-id)).      (db
e060: 3a 67 65 74 2d 72 75 6e 2d 69 6e 66 6f 20 64 62  :get-run-info db
e070: 20 72 75 6e 2d 69 64 29 29 29 0a 0a 28 64 65 66   run-id)))..(def
e080: 69 6e 65 20 28 72 64 62 3a 67 65 74 2d 73 74 65  ine (rdb:get-ste
e090: 70 73 2d 66 6f 72 2d 74 65 73 74 20 64 62 20 74  ps-for-test db t
e0a0: 65 73 74 2d 69 64 29 0a 20 20 28 69 66 20 2a 72  est-id).  (if *r
e0b0: 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20 20 20  unremote*.      
e0c0: 28 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65 63  (let ((host (vec
e0d0: 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f  tor-ref *runremo
e0e0: 74 65 2a 20 30 29 29 0a 09 20 20 20 20 28 70 6f  te* 0))..    (po
e0f0: 72 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a  rt (vector-ref *
e100: 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a  runremote* 1))).
e110: 09 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72 65  .((rpc:procedure
e120: 20 27 72 64 62 3a 67 65 74 2d 73 74 65 70 73 2d   'rdb:get-steps-
e130: 66 6f 72 2d 74 65 73 74 20 68 6f 73 74 20 70 6f  for-test host po
e140: 72 74 29 20 74 65 73 74 2d 69 64 29 29 0a 20 20  rt) test-id)).  
e150: 20 20 20 20 28 64 62 3a 67 65 74 2d 73 74 65 70      (db:get-step
e160: 73 2d 66 6f 72 2d 74 65 73 74 20 64 62 20 74 65  s-for-test db te
e170: 73 74 2d 69 64 29 29 29 0a 0a 28 64 65 66 69 6e  st-id)))..(defin
e180: 65 20 28 72 64 62 3a 67 65 74 2d 73 74 65 70 73  e (rdb:get-steps
e190: 2d 74 61 62 6c 65 20 64 62 20 74 65 73 74 2d 69  -table db test-i
e1a0: 64 29 0a 20 20 28 69 66 20 2a 72 75 6e 72 65 6d  d).  (if *runrem
e1b0: 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c 65 74 20  ote*.      (let 
e1c0: 28 28 68 6f 73 74 20 28 76 65 63 74 6f 72 2d 72  ((host (vector-r
e1d0: 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30  ef *runremote* 0
e1e0: 29 29 0a 09 20 20 20 20 28 70 6f 72 74 20 28 76  ))..    (port (v
e1f0: 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65  ector-ref *runre
e200: 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28 28 72 70  mote* 1)))..((rp
e210: 63 3a 70 72 6f 63 65 64 75 72 65 20 27 72 64 62  c:procedure 'rdb
e220: 3a 67 65 74 2d 73 74 65 70 73 2d 74 61 62 6c 65  :get-steps-table
e230: 20 68 6f 73 74 20 70 6f 72 74 29 20 74 65 73 74   host port) test
e240: 2d 69 64 29 29 0a 20 20 20 20 20 20 28 64 62 3a  -id)).      (db:
e250: 67 65 74 2d 73 74 65 70 73 2d 74 61 62 6c 65 20  get-steps-table 
e260: 64 62 20 74 65 73 74 2d 69 64 29 29 29 0a 0a 28  db test-id)))..(
e270: 64 65 66 69 6e 65 20 28 72 64 62 3a 72 65 61 64  define (rdb:read
e280: 2d 74 65 73 74 2d 64 61 74 61 20 64 62 20 74 65  -test-data db te
e290: 73 74 2d 69 64 20 63 61 74 65 67 6f 72 79 70 61  st-id categorypa
e2a0: 74 74 29 0a 20 20 28 69 66 20 2a 72 75 6e 72 65  tt).  (if *runre
e2b0: 6d 6f 74 65 2a 0a 20 20 20 20 20 20 28 6c 65 74  mote*.      (let
e2c0: 20 28 28 68 6f 73 74 20 28 76 65 63 74 6f 72 2d   ((host (vector-
e2d0: 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20  ref *runremote* 
e2e0: 30 29 29 0a 09 20 20 20 20 28 70 6f 72 74 20 28  0))..    (port (
e2f0: 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72  vector-ref *runr
e300: 65 6d 6f 74 65 2a 20 31 29 29 29 0a 09 28 28 72  emote* 1)))..((r
e310: 70 63 3a 70 72 6f 63 65 64 75 72 65 20 27 72 64  pc:procedure 'rd
e320: 62 3a 72 65 61 64 2d 74 65 73 74 2d 64 61 74 61  b:read-test-data
e330: 20 68 6f 73 74 20 70 6f 72 74 29 20 74 65 73 74   host port) test
e340: 2d 69 64 20 63 61 74 65 67 6f 72 79 70 61 74 74  -id categorypatt
e350: 29 29 0a 20 20 20 20 20 20 28 64 62 3a 72 65 61  )).      (db:rea
e360: 64 2d 74 65 73 74 2d 64 61 74 61 20 64 62 20 74  d-test-data db t
e370: 65 73 74 2d 69 64 20 63 61 74 65 67 6f 72 79 70  est-id categoryp
e380: 61 74 74 29 29 29 0a 0a 28 64 65 66 69 6e 65 20  att)))..(define 
e390: 28 72 64 62 3a 67 65 74 2d 74 65 73 74 2d 69 6e  (rdb:get-test-in
e3a0: 66 6f 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73  fo db run-id tes
e3b0: 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29  tname item-path)
e3c0: 0a 20 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74  .  (if *runremot
e3d0: 65 2a 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28  e*.      (let ((
e3e0: 68 6f 73 74 20 28 76 65 63 74 6f 72 2d 72 65 66  host (vector-ref
e3f0: 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29   *runremote* 0))
e400: 0a 09 20 20 20 20 28 70 6f 72 74 20 28 76 65 63  ..    (port (vec
e410: 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f  tor-ref *runremo
e420: 74 65 2a 20 31 29 29 29 0a 09 28 28 72 70 63 3a  te* 1)))..((rpc:
e430: 70 72 6f 63 65 64 75 72 65 20 27 72 64 62 3a 67  procedure 'rdb:g
e440: 65 74 2d 74 65 73 74 2d 69 6e 66 6f 20 68 6f 73  et-test-info hos
e450: 74 20 70 6f 72 74 29 20 72 75 6e 2d 69 64 20 74  t port) run-id t
e460: 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74  estname item-pat
e470: 68 29 29 0a 20 20 20 20 20 20 28 64 62 3a 67 65  h)).      (db:ge
e480: 74 2d 74 65 73 74 2d 69 6e 66 6f 20 64 62 20 72  t-test-info db r
e490: 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 69  un-id testname i
e4a0: 74 65 6d 2d 70 61 74 68 29 29 29 0a 0a 28 64 65  tem-path)))..(de
e4b0: 66 69 6e 65 20 28 72 64 62 3a 64 65 6c 65 74 65  fine (rdb:delete
e4c0: 2d 74 65 73 74 2d 72 65 63 6f 72 64 73 20 64 62  -test-records db
e4d0: 20 74 65 73 74 2d 69 64 29 0a 20 20 28 69 66 20   test-id).  (if 
e4e0: 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 20 20 20 20  *runremote*.    
e4f0: 20 20 28 6c 65 74 20 28 28 68 6f 73 74 20 28 76    (let ((host (v
e500: 65 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65  ector-ref *runre
e510: 6d 6f 74 65 2a 20 30 29 29 0a 09 20 20 20 20 28  mote* 0))..    (
e520: 70 6f 72 74 20 28 76 65 63 74 6f 72 2d 72 65 66  port (vector-ref
e530: 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29   *runremote* 1))
e540: 29 0a 09 28 28 72 70 63 3a 70 72 6f 63 65 64 75  )..((rpc:procedu
e550: 72 65 20 27 72 64 62 3a 64 65 6c 65 74 65 2d 74  re 'rdb:delete-t
e560: 65 73 74 2d 72 65 63 6f 72 64 73 20 68 6f 73 74  est-records host
e570: 20 70 6f 72 74 29 20 74 65 73 74 2d 69 64 29 29   port) test-id))
e580: 0a 20 20 20 20 20 20 28 64 62 3a 64 65 6c 65 74  .      (db:delet
e590: 65 2d 74 65 73 74 2d 72 65 63 6f 72 64 73 20 64  e-test-records d
e5a0: 62 20 74 65 73 74 2d 69 64 29 29 29 0a           b test-id))).