Megatest

Hex Artifact Content
Login

Artifact 5c4216dd3a11f4b7fba48ccf32726b2bfab08f10:


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 75 73 65 20 73 71 6c 69 74 65 33 20 73  ..(use sqlite3 s
0290: 72 66 69 2d 31 20 70 6f 73 69 78 20 72 65 67 65  rfi-1 posix rege
02a0: 78 20 72 65 67 65 78 2d 63 61 73 65 20 73 72 66  x regex-case srf
02b0: 69 2d 36 39 20 63 73 76 2d 78 6d 6c 29 0a 28 69  i-69 csv-xml).(i
02c0: 6d 70 6f 72 74 20 28 70 72 65 66 69 78 20 73 71  mport (prefix sq
02d0: 6c 69 74 65 33 20 73 71 6c 69 74 65 33 3a 29 29  lite3 sqlite3:))
02e0: 0a 0a 28 64 65 63 6c 61 72 65 20 28 75 6e 69 74  ..(declare (unit
02f0: 20 64 62 29 29 0a 28 64 65 63 6c 61 72 65 20 28   db)).(declare (
0300: 75 73 65 73 20 63 6f 6d 6d 6f 6e 29 29 0a 28 64  uses common)).(d
0310: 65 63 6c 61 72 65 20 28 75 73 65 73 20 6b 65 79  eclare (uses key
0320: 73 29 29 0a 28 64 65 63 6c 61 72 65 20 28 75 73  s)).(declare (us
0330: 65 73 20 6f 64 73 29 29 0a 0a 28 69 6e 63 6c 75  es ods))..(inclu
0340: 64 65 20 22 63 6f 6d 6d 6f 6e 5f 72 65 63 6f 72  de "common_recor
0350: 64 73 2e 73 63 6d 22 29 0a 28 69 6e 63 6c 75 64  ds.scm").(includ
0360: 65 20 22 64 62 5f 72 65 63 6f 72 64 73 2e 73 63  e "db_records.sc
0370: 6d 22 29 0a 28 69 6e 63 6c 75 64 65 20 22 6b 65  m").(include "ke
0380: 79 5f 72 65 63 6f 72 64 73 2e 73 63 6d 22 29 0a  y_records.scm").
0390: 0a 28 64 65 66 69 6e 65 20 28 6f 70 65 6e 2d 64  .(define (open-d
03a0: 62 29 20 3b 3b 20 20 28 63 6f 6e 63 20 2a 74 6f  b) ;;  (conc *to
03b0: 70 70 61 74 68 2a 20 22 2f 6d 65 67 61 74 65 73  ppath* "/megates
03c0: 74 2e 64 62 22 29 20 28 63 61 72 20 2a 63 6f 6e  t.db") (car *con
03d0: 66 69 67 69 6e 66 6f 2a 29 29 29 0a 20 20 28 6c  figinfo*))).  (l
03e0: 65 74 2a 20 28 28 64 62 70 61 74 68 20 20 20 20  et* ((dbpath    
03f0: 28 63 6f 6e 63 20 2a 74 6f 70 70 61 74 68 2a 20  (conc *toppath* 
0400: 22 2f 6d 65 67 61 74 65 73 74 2e 64 62 22 29 29  "/megatest.db"))
0410: 20 3b 3b 20 66 6e 61 6d 65 29 0a 09 20 28 63 6f   ;; fname).. (co
0420: 6e 66 69 67 64 61 74 20 28 63 61 72 20 2a 63 6f  nfigdat (car *co
0430: 6e 66 69 67 69 6e 66 6f 2a 29 29 0a 09 20 28 64  nfiginfo*)).. (d
0440: 62 65 78 69 73 74 73 20 20 28 66 69 6c 65 2d 65  bexists  (file-e
0450: 78 69 73 74 73 3f 20 64 62 70 61 74 68 29 29 0a  xists? dbpath)).
0460: 09 20 28 64 62 20 20 20 20 20 20 20 20 28 73 71  . (db        (sq
0470: 6c 69 74 65 33 3a 6f 70 65 6e 2d 64 61 74 61 62  lite3:open-datab
0480: 61 73 65 20 64 62 70 61 74 68 29 29 20 3b 3b 20  ase dbpath)) ;; 
0490: 28 6e 65 76 65 72 2d 67 69 76 65 2d 75 70 2d 6f  (never-give-up-o
04a0: 70 65 6e 2d 64 62 20 64 62 70 61 74 68 29 29 0a  pen-db dbpath)).
04b0: 09 20 28 68 61 6e 64 6c 65 72 20 20 20 28 6d 61  . (handler   (ma
04c0: 6b 65 2d 62 75 73 79 2d 74 69 6d 65 6f 75 74 20  ke-busy-timeout 
04d0: 33 36 30 30 30 29 29 29 0a 20 20 20 20 28 73 71  36000))).    (sq
04e0: 6c 69 74 65 33 3a 73 65 74 2d 62 75 73 79 2d 68  lite3:set-busy-h
04f0: 61 6e 64 6c 65 72 21 20 64 62 20 68 61 6e 64 6c  andler! db handl
0500: 65 72 29 0a 20 20 20 20 28 69 66 20 28 6e 6f 74  er).    (if (not
0510: 20 64 62 65 78 69 73 74 73 29 0a 09 28 6c 65 74   dbexists)..(let
0520: 2a 20 28 28 6b 65 79 73 20 20 20 20 20 28 63 6f  * ((keys     (co
0530: 6e 66 69 67 2d 67 65 74 2d 66 69 65 6c 64 73 20  nfig-get-fields 
0540: 63 6f 6e 66 69 67 64 61 74 29 29 0a 09 20 20 20  configdat))..   
0550: 20 20 20 20 28 68 61 76 65 6b 65 79 73 20 28 3e      (havekeys (>
0560: 20 28 6c 65 6e 67 74 68 20 6b 65 79 73 29 20 30   (length keys) 0
0570: 29 29 0a 09 20 20 20 20 20 20 20 28 6b 65 79 73  ))..       (keys
0580: 74 72 20 20 20 28 6b 65 79 73 2d 3e 6b 65 79 73  tr   (keys->keys
0590: 74 72 20 6b 65 79 73 29 29 0a 09 20 20 20 20 20  tr keys))..     
05a0: 20 20 28 66 69 65 6c 64 73 74 72 20 28 6b 65 79    (fieldstr (key
05b0: 73 2d 3e 6b 65 79 2f 66 69 65 6c 64 20 6b 65 79  s->key/field key
05c0: 73 29 29 29 0a 09 20 20 28 66 6f 72 2d 65 61 63  s)))..  (for-eac
05d0: 68 20 28 6c 61 6d 62 64 61 20 28 6b 65 79 29 0a  h (lambda (key).
05e0: 09 09 20 20 20 20 20 20 28 6c 65 74 20 28 28 6b  ..      (let ((k
05f0: 65 79 6e 20 28 76 65 63 74 6f 72 2d 72 65 66 20  eyn (vector-ref 
0600: 6b 65 79 20 30 29 29 29 0a 09 09 09 28 69 66 20  key 0)))....(if 
0610: 28 6d 65 6d 62 65 72 20 28 73 74 72 69 6e 67 2d  (member (string-
0620: 64 6f 77 6e 63 61 73 65 20 6b 65 79 6e 29 0a 09  downcase keyn)..
0630: 09 09 09 20 20 20 20 28 6c 69 73 74 20 22 72 75  ...    (list "ru
0640: 6e 6e 61 6d 65 22 20 22 73 74 61 74 65 22 20 22  nname" "state" "
0650: 73 74 61 74 75 73 22 20 22 6f 77 6e 65 72 22 20  status" "owner" 
0660: 22 65 76 65 6e 74 5f 74 69 6d 65 22 20 22 63 6f  "event_time" "co
0670: 6d 6d 65 6e 74 22 20 22 66 61 69 6c 5f 63 6f 75  mment" "fail_cou
0680: 6e 74 22 0a 09 09 09 09 09 20 20 22 70 61 73 73  nt"......  "pass
0690: 5f 63 6f 75 6e 74 22 29 29 0a 09 09 09 20 20 20  _count"))....   
06a0: 20 28 62 65 67 69 6e 0a 09 09 09 20 20 20 20 20   (begin....     
06b0: 20 28 70 72 69 6e 74 20 22 45 52 52 4f 52 3a 20   (print "ERROR: 
06c0: 79 6f 75 72 20 6b 65 79 20 63 61 6e 6e 6f 74 20  your key cannot 
06d0: 62 65 20 6e 61 6d 65 64 20 22 20 6b 65 79 6e 20  be named " keyn 
06e0: 22 20 61 73 20 74 68 69 73 20 63 6f 6e 66 6c 69  " as this confli
06f0: 63 74 73 20 77 69 74 68 20 74 68 65 20 73 61 6d  cts with the sam
0700: 65 20 6e 61 6d 65 64 20 66 69 65 6c 64 20 69 6e  e named field in
0710: 20 74 68 65 20 72 75 6e 73 20 74 61 62 6c 65 22   the runs table"
0720: 29 0a 09 09 09 20 20 20 20 20 20 28 73 79 73 74  )....      (syst
0730: 65 6d 20 28 63 6f 6e 63 20 22 72 6d 20 2d 66 20  em (conc "rm -f 
0740: 22 20 64 62 70 61 74 68 29 29 0a 09 09 09 20 20  " dbpath))....  
0750: 20 20 20 20 28 65 78 69 74 20 31 29 29 29 29 29      (exit 1)))))
0760: 0a 09 09 20 20 20 20 6b 65 79 73 29 0a 09 20 20  ...    keys)..  
0770: 3b 3b 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63  ;; (sqlite3:exec
0780: 75 74 65 20 64 62 20 22 50 52 41 47 4d 41 20 73  ute db "PRAGMA s
0790: 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4f 46 46  ynchronous = OFF
07a0: 3b 22 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a  ;")..  (sqlite3:
07b0: 65 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41  execute db "CREA
07c0: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  TE TABLE IF NOT 
07d0: 45 58 49 53 54 53 20 6b 65 79 73 20 28 69 64 20  EXISTS keys (id 
07e0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
07f0: 4b 45 59 2c 20 66 69 65 6c 64 6e 61 6d 65 20 54  KEY, fieldname T
0800: 45 58 54 2c 20 66 69 65 6c 64 74 79 70 65 20 54  EXT, fieldtype T
0810: 45 58 54 2c 20 43 4f 4e 53 54 52 41 49 4e 54 20  EXT, CONSTRAINT 
0820: 6b 65 79 63 6f 6e 73 74 72 61 69 6e 74 20 55 4e  keyconstraint UN
0830: 49 51 55 45 20 28 66 69 65 6c 64 6e 61 6d 65 29  IQUE (fieldname)
0840: 29 3b 22 29 0a 09 20 20 28 66 6f 72 2d 65 61 63  );")..  (for-eac
0850: 68 20 28 6c 61 6d 62 64 61 20 28 6b 65 79 29 0a  h (lambda (key).
0860: 09 09 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ..      (sqlite3
0870: 3a 65 78 65 63 75 74 65 20 64 62 20 22 49 4e 53  :execute db "INS
0880: 45 52 54 20 49 4e 54 4f 20 6b 65 79 73 20 28 66  ERT INTO keys (f
0890: 69 65 6c 64 6e 61 6d 65 2c 66 69 65 6c 64 74 79  ieldname,fieldty
08a0: 70 65 29 20 56 41 4c 55 45 53 20 28 3f 2c 3f 29  pe) VALUES (?,?)
08b0: 3b 22 20 28 6b 65 79 3a 67 65 74 2d 66 69 65 6c  ;" (key:get-fiel
08c0: 64 6e 61 6d 65 20 6b 65 79 29 28 6b 65 79 3a 67  dname key)(key:g
08d0: 65 74 2d 66 69 65 6c 64 74 79 70 65 20 6b 65 79  et-fieldtype key
08e0: 29 29 29 0a 09 09 20 20 20 20 6b 65 79 73 29 0a  )))...    keys).
08f0: 09 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63  .  (sqlite3:exec
0900: 75 74 65 20 64 62 20 28 63 6f 6e 63 20 0a 09 09  ute db (conc ...
0910: 09 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20  .       "CREATE 
0920: 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49  TABLE IF NOT EXI
0930: 53 54 53 20 72 75 6e 73 20 28 69 64 20 49 4e 54  STS runs (id INT
0940: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
0950: 2c 20 22 20 0a 09 09 09 20 20 20 20 20 20 20 66  , " ....       f
0960: 69 65 6c 64 73 74 72 20 28 69 66 20 68 61 76 65  ieldstr (if have
0970: 6b 65 79 73 20 22 2c 22 20 22 22 29 0a 09 09 09  keys "," "")....
0980: 20 20 20 20 20 20 20 22 72 75 6e 6e 61 6d 65 20         "runname 
0990: 54 45 58 54 2c 22 0a 09 09 09 20 20 20 20 20 20  TEXT,"....      
09a0: 20 22 73 74 61 74 65 20 54 45 58 54 20 44 45 46   "state TEXT DEF
09b0: 41 55 4c 54 20 27 27 2c 22 0a 09 09 09 20 20 20  AULT '',"....   
09c0: 20 20 20 20 22 73 74 61 74 75 73 20 54 45 58 54      "status TEXT
09d0: 20 44 45 46 41 55 4c 54 20 27 27 2c 22 0a 09 09   DEFAULT '',"...
09e0: 09 20 20 20 20 20 20 20 22 6f 77 6e 65 72 20 54  .       "owner T
09f0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 22  EXT DEFAULT '',"
0a00: 0a 09 09 09 20 20 20 20 20 20 20 22 65 76 65 6e  ....       "even
0a10: 74 5f 74 69 6d 65 20 54 49 4d 45 53 54 41 4d 50  t_time TIMESTAMP
0a20: 2c 22 0a 09 09 09 20 20 20 20 20 20 20 22 63 6f  ,"....       "co
0a30: 6d 6d 65 6e 74 20 54 45 58 54 20 44 45 46 41 55  mment TEXT DEFAU
0a40: 4c 54 20 27 27 2c 22 0a 09 09 09 20 20 20 20 20  LT '',"....     
0a50: 20 20 22 66 61 69 6c 5f 63 6f 75 6e 74 20 49 4e    "fail_count IN
0a60: 54 45 47 45 52 20 44 45 46 41 55 4c 54 20 30 2c  TEGER DEFAULT 0,
0a70: 22 0a 09 09 09 20 20 20 20 20 20 20 22 70 61 73  "....       "pas
0a80: 73 5f 63 6f 75 6e 74 20 49 4e 54 45 47 45 52 20  s_count INTEGER 
0a90: 44 45 46 41 55 4c 54 20 30 2c 22 0a 09 09 09 20  DEFAULT 0,".... 
0aa0: 20 20 20 20 20 20 22 43 4f 4e 53 54 52 41 49 4e        "CONSTRAIN
0ab0: 54 20 72 75 6e 73 63 6f 6e 73 74 72 61 69 6e 74  T runsconstraint
0ac0: 20 55 4e 49 51 55 45 20 28 72 75 6e 6e 61 6d 65   UNIQUE (runname
0ad0: 22 20 28 69 66 20 68 61 76 65 6b 65 79 73 20 22  " (if havekeys "
0ae0: 2c 22 20 22 22 29 20 6b 65 79 73 74 72 20 22 29  ," "") keystr ")
0af0: 29 3b 22 29 29 0a 09 20 20 28 73 71 6c 69 74 65  );"))..  (sqlite
0b00: 33 3a 65 78 65 63 75 74 65 20 64 62 20 28 63 6f  3:execute db (co
0b10: 6e 63 20 22 43 52 45 41 54 45 20 49 4e 44 45 58  nc "CREATE INDEX
0b20: 20 72 75 6e 73 5f 69 6e 64 65 78 20 4f 4e 20 72   runs_index ON r
0b30: 75 6e 73 20 28 72 75 6e 6e 61 6d 65 22 20 28 69  uns (runname" (i
0b40: 66 20 68 61 76 65 6b 65 79 73 20 22 2c 22 20 22  f havekeys "," "
0b50: 22 29 20 6b 65 79 73 74 72 20 22 29 3b 22 29 29  ") keystr ");"))
0b60: 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65  ..  (sqlite3:exe
0b70: 63 75 74 65 20 64 62 20 0a 09 09 09 20 20 20 22  cute db ....   "
0b80: 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20  CREATE TABLE IF 
0b90: 4e 4f 54 20 45 58 49 53 54 53 20 74 65 73 74 73  NOT EXISTS tests
0ba0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
0bb0: 20 20 20 20 20 20 28 69 64 20 49 4e 54 45 47 45        (id INTEGE
0bc0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20  R PRIMARY KEY,. 
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0be0: 20 20 20 20 72 75 6e 5f 69 64 20 20 20 20 20 49      run_id     I
0bf0: 4e 54 45 47 45 52 2c 0a 20 20 20 20 20 20 20 20  NTEGER,.        
0c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
0c10: 74 6e 61 6d 65 20 20 20 54 45 58 54 2c 0a 20 20  tname   TEXT,.  
0c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c30: 20 20 20 68 6f 73 74 20 20 20 20 20 20 20 54 45     host       TE
0c40: 58 54 20 44 45 46 41 55 4c 54 20 27 6e 2f 61 27  XT DEFAULT 'n/a'
0c50: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
0c60: 20 20 20 20 20 20 20 63 70 75 6c 6f 61 64 20 20         cpuload  
0c70: 20 20 52 45 41 4c 20 44 45 46 41 55 4c 54 20 2d    REAL DEFAULT -
0c80: 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
0c90: 20 20 20 20 20 20 20 20 64 69 73 6b 66 72 65 65          diskfree
0ca0: 20 20 20 49 4e 54 45 47 45 52 20 44 45 46 41 55     INTEGER DEFAU
0cb0: 4c 54 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20  LT -1,.         
0cc0: 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 61 6d              unam
0cd0: 65 20 20 20 20 20 20 54 45 58 54 20 44 45 46 41  e      TEXT DEFA
0ce0: 55 4c 54 20 27 6e 2f 61 27 2c 20 0a 20 20 20 20  ULT 'n/a', .    
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d00: 20 72 75 6e 64 69 72 20 20 20 20 20 54 45 58 54   rundir     TEXT
0d10: 20 44 45 46 41 55 4c 54 20 27 6e 2f 61 27 2c 0a   DEFAULT 'n/a',.
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d30: 20 20 20 20 20 73 68 6f 72 74 64 69 72 20 20 20       shortdir   
0d40: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c  TEXT DEFAULT '',
0d50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0d60: 20 20 20 20 20 20 69 74 65 6d 5f 70 61 74 68 20        item_path 
0d70: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27   TEXT DEFAULT ''
0d80: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
0d90: 20 20 20 20 20 20 20 73 74 61 74 65 20 20 20 20         state    
0da0: 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27    TEXT DEFAULT '
0db0: 4e 4f 54 5f 53 54 41 52 54 45 44 27 2c 0a 20 20  NOT_STARTED',.  
0dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0dd0: 20 20 20 73 74 61 74 75 73 20 20 20 20 20 54 45     status     TE
0de0: 58 54 20 44 45 46 41 55 4c 54 20 27 46 41 49 4c  XT DEFAULT 'FAIL
0df0: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ',.             
0e00: 20 20 20 20 20 20 20 20 61 74 74 65 6d 70 74 6e          attemptn
0e10: 75 6d 20 49 4e 54 45 47 45 52 20 44 45 46 41 55  um INTEGER DEFAU
0e20: 4c 54 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  LT 0,.          
0e30: 20 20 20 20 20 20 20 20 20 20 20 66 69 6e 61 6c             final
0e40: 5f 6c 6f 67 66 20 54 45 58 54 20 44 45 46 41 55  _logf TEXT DEFAU
0e50: 4c 54 20 27 6c 6f 67 73 2f 66 69 6e 61 6c 2e 6c  LT 'logs/final.l
0e60: 6f 67 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20  og',.           
0e70: 20 20 20 20 20 20 20 20 20 20 6c 6f 67 64 61 74            logdat
0e80: 20 20 20 20 20 42 4c 4f 42 2c 20 0a 20 20 20 20       BLOB, .    
0e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ea0: 20 72 75 6e 5f 64 75 72 61 74 69 6f 6e 20 49 4e   run_duration IN
0eb0: 54 45 47 45 52 20 44 45 46 41 55 4c 54 20 30 2c  TEGER DEFAULT 0,
0ec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0ed0: 20 20 20 20 20 20 63 6f 6d 6d 65 6e 74 20 20 20        comment   
0ee0: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27   TEXT DEFAULT ''
0ef0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
0f00: 20 20 20 20 20 20 20 65 76 65 6e 74 5f 74 69 6d         event_tim
0f10: 65 20 54 49 4d 45 53 54 41 4d 50 2c 0a 20 20 20  e TIMESTAMP,.   
0f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f30: 20 20 66 61 69 6c 5f 63 6f 75 6e 74 20 49 4e 54    fail_count INT
0f40: 45 47 45 52 20 44 45 46 41 55 4c 54 20 30 2c 0a  EGER DEFAULT 0,.
0f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f60: 20 20 20 20 20 70 61 73 73 5f 63 6f 75 6e 74 20       pass_count 
0f70: 49 4e 54 45 47 45 52 20 44 45 46 41 55 4c 54 20  INTEGER DEFAULT 
0f80: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
0f90: 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52 41 49          CONSTRAI
0fa0: 4e 54 20 74 65 73 74 73 63 6f 6e 73 74 72 61 69  NT testsconstrai
0fb0: 6e 74 20 55 4e 49 51 55 45 20 28 72 75 6e 5f 69  nt UNIQUE (run_i
0fc0: 64 2c 20 74 65 73 74 6e 61 6d 65 2c 20 69 74 65  d, testname, ite
0fd0: 6d 5f 70 61 74 68 29 0a 20 20 20 20 20 20 20 20  m_path).        
0fe0: 20 20 29 3b 22 29 0a 09 20 20 28 73 71 6c 69 74    );")..  (sqlit
0ff0: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 43  e3:execute db "C
1000: 52 45 41 54 45 20 49 4e 44 45 58 20 74 65 73 74  REATE INDEX test
1010: 73 5f 69 6e 64 65 78 20 4f 4e 20 74 65 73 74 73  s_index ON tests
1020: 20 28 72 75 6e 5f 69 64 2c 20 74 65 73 74 6e 61   (run_id, testna
1030: 6d 65 29 3b 22 29 0a 09 20 20 28 73 71 6c 69 74  me);")..  (sqlit
1040: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 43  e3:execute db "C
1050: 52 45 41 54 45 20 56 49 45 57 20 72 75 6e 73 5f  REATE VIEW runs_
1060: 74 65 73 74 73 20 41 53 20 53 45 4c 45 43 54 20  tests AS SELECT 
1070: 2a 20 46 52 4f 4d 20 72 75 6e 73 20 49 4e 4e 45  * FROM runs INNE
1080: 52 20 4a 4f 49 4e 20 74 65 73 74 73 20 4f 4e 20  R JOIN tests ON 
1090: 72 75 6e 73 2e 69 64 3d 74 65 73 74 73 2e 72 75  runs.id=tests.ru
10a0: 6e 5f 69 64 3b 22 29 0a 09 20 20 28 73 71 6c 69  n_id;")..  (sqli
10b0: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22  te3:execute db "
10c0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20  CREATE TABLE IF 
10d0: 4e 4f 54 20 45 58 49 53 54 53 20 74 65 73 74 5f  NOT EXISTS test_
10e0: 73 74 65 70 73 20 0a 20 20 20 20 20 20 20 20 20  steps .         
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1100: 20 20 20 20 20 28 69 64 20 49 4e 54 45 47 45 52       (id INTEGER
1110: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20   PRIMARY KEY,.  
1120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1130: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
1140: 74 5f 69 64 20 49 4e 54 45 47 45 52 2c 20 0a 20  t_id INTEGER, . 
1150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
1170: 65 70 6e 61 6d 65 20 54 45 58 54 2c 20 0a 20 20  epname TEXT, .  
1180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1190: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61               sta
11a0: 74 65 20 54 45 58 54 20 44 45 46 41 55 4c 54 20  te TEXT DEFAULT 
11b0: 27 4e 4f 54 5f 53 54 41 52 54 45 44 27 2c 20 0a  'NOT_STARTED', .
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
11e0: 74 61 74 75 73 20 54 45 58 54 20 44 45 46 41 55  tatus TEXT DEFAU
11f0: 4c 54 20 27 6e 2f 61 27 2c 0a 20 20 20 20 20 20  LT 'n/a',.      
1200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1210: 20 20 20 20 20 20 20 20 20 65 76 65 6e 74 5f 74           event_t
1220: 69 6d 65 20 54 49 4d 45 53 54 41 4d 50 2c 0a 20  ime TIMESTAMP,. 
1230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
1250: 6d 6d 65 6e 74 20 54 45 58 54 20 44 45 46 41 55  mment TEXT DEFAU
1260: 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20  LT '',.         
1270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1280: 20 20 20 20 20 20 6c 6f 67 66 69 6c 65 20 54 45        logfile TE
1290: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20  XT DEFAULT '',. 
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 20 20 43 4f                CO
12c0: 4e 53 54 52 41 49 4e 54 20 74 65 73 74 5f 73 74  NSTRAINT test_st
12d0: 65 70 73 5f 63 6f 6e 73 74 72 61 69 6e 74 20 55  eps_constraint U
12e0: 4e 49 51 55 45 20 28 74 65 73 74 5f 69 64 2c 73  NIQUE (test_id,s
12f0: 74 65 70 6e 61 6d 65 2c 73 74 61 74 65 29 29 3b  tepname,state));
1300: 22 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65  ")..  (sqlite3:e
1310: 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 54  xecute db "CREAT
1320: 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
1330: 58 49 53 54 53 20 65 78 74 72 61 64 61 74 20 28  XISTS extradat (
1340: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  id INTEGER PRIMA
1350: 52 59 20 4b 45 59 2c 20 72 75 6e 5f 69 64 20 49  RY KEY, run_id I
1360: 4e 54 45 47 45 52 2c 20 6b 65 79 20 54 45 58 54  NTEGER, key TEXT
1370: 2c 20 76 61 6c 20 54 45 58 54 29 3b 22 29 0a 09  , val TEXT);")..
1380: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
1390: 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41  te db "CREATE TA
13a0: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54  BLE IF NOT EXIST
13b0: 53 20 6d 65 74 61 64 61 74 20 28 69 64 20 49 4e  S metadat (id IN
13c0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
13d0: 59 2c 20 76 61 72 20 54 45 58 54 2c 20 76 61 6c  Y, var TEXT, val
13e0: 20 54 45 58 54 2c 0a 20 20 20 20 20 20 20 20 20   TEXT,.         
13f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1400: 20 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52 41           CONSTRA
1410: 49 4e 54 20 6d 65 74 61 64 61 74 5f 63 6f 6e 73  INT metadat_cons
1420: 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28 76  traint UNIQUE (v
1430: 61 72 29 29 3b 22 29 0a 09 20 20 28 73 71 6c 69  ar));")..  (sqli
1440: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22  te3:execute db "
1450: 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20  CREATE TABLE IF 
1460: 4e 4f 54 20 45 58 49 53 54 53 20 61 63 63 65 73  NOT EXISTS acces
1470: 73 5f 6c 6f 67 20 28 69 64 20 49 4e 54 45 47 45  s_log (id INTEGE
1480: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 75  R PRIMARY KEY, u
1490: 73 65 72 20 54 45 58 54 2c 20 61 63 63 65 73 73  ser TEXT, access
14a0: 65 64 20 54 49 4d 45 53 54 41 4d 50 2c 20 61 72  ed TIMESTAMP, ar
14b0: 67 73 20 54 45 58 54 29 3b 22 29 0a 09 20 20 28  gs TEXT);")..  (
14c0: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
14d0: 64 62 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  db "CREATE TABLE
14e0: 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 74   IF NOT EXISTS t
14f0: 65 73 74 5f 6d 65 74 61 20 28 69 64 20 49 4e 54  est_meta (id INT
1500: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
1510: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1530: 20 20 20 20 20 20 20 74 65 73 74 6e 61 6d 65 20         testname 
1540: 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20     TEXT DEFAULT 
1550: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '',.            
1560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1570: 20 20 20 20 20 20 20 20 20 61 75 74 68 6f 72 20           author 
1580: 20 20 20 20 20 54 45 58 54 20 44 45 46 41 55 4c       TEXT DEFAUL
1590: 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20  T '',.          
15a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b0: 20 20 20 20 20 20 20 20 20 20 20 6f 77 6e 65 72             owner
15c0: 20 20 20 20 20 20 20 54 45 58 54 20 44 45 46 41         TEXT DEFA
15d0: 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20  ULT '',.        
15e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65 73               des
1600: 63 72 69 70 74 69 6f 6e 20 54 45 58 54 20 44 45  cription TEXT DE
1610: 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20  FAULT '',.      
1620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
1640: 65 76 69 65 77 65 64 20 20 20 20 54 49 4d 45 53  eviewed    TIMES
1650: 54 41 4d 50 2c 0a 20 20 20 20 20 20 20 20 20 20  TAMP,.          
1660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1670: 20 20 20 20 20 20 20 20 20 20 20 69 74 65 72 61             itera
1680: 74 65 64 20 20 20 20 54 45 58 54 20 44 45 46 41  ted    TEXT DEFA
1690: 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20  ULT '',.        
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 20 20 20 61 76 67               avg
16c0: 5f 72 75 6e 74 69 6d 65 20 52 45 41 4c 2c 0a 20  _runtime REAL,. 
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f0: 20 20 20 20 61 76 67 5f 64 69 73 6b 20 20 20 20      avg_disk    
1700: 52 45 41 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  REAL,.          
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1720: 20 20 20 20 20 20 20 20 20 20 20 74 61 67 73 20             tags 
1730: 20 20 20 20 20 20 20 54 45 58 54 20 44 45 46 41         TEXT DEFA
1740: 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20  ULT '',.        
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1760: 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f 62               job
1770: 67 72 6f 75 70 20 20 20 20 54 45 58 54 20 44 45  group    TEXT DE
1780: 46 41 55 4c 54 20 27 64 65 66 61 75 6c 74 27 2c  FAULT 'default',
1790: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17b0: 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 65 73 74   CONSTRAINT test
17c0: 5f 6d 65 74 61 5f 63 6f 6e 73 74 72 61 69 6e 74  _meta_constraint
17d0: 20 55 4e 49 51 55 45 20 28 74 65 73 74 6e 61 6d   UNIQUE (testnam
17e0: 65 29 29 3b 22 29 0a 09 20 20 28 73 71 6c 69 74  e));")..  (sqlit
17f0: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 43  e3:execute db "C
1800: 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e  REATE TABLE IF N
1810: 4f 54 20 45 58 49 53 54 53 20 74 65 73 74 5f 64  OT EXISTS test_d
1820: 61 74 61 20 28 69 64 20 49 4e 54 45 47 45 52 20  ata (id INTEGER 
1830: 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20  PRIMARY KEY,.   
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1850: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
1860: 74 5f 69 64 20 49 4e 54 45 47 45 52 2c 0a 20 20  t_id INTEGER,.  
1870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61                ca
1890: 74 65 67 6f 72 79 20 54 45 58 54 20 44 45 46 41  tegory TEXT DEFA
18a0: 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20  ULT '',.        
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c0: 20 20 20 20 20 20 20 20 76 61 72 69 61 62 6c 65          variable
18d0: 20 54 45 58 54 2c 0a 09 20 20 20 20 20 20 20 20   TEXT,..        
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f0: 76 61 6c 75 65 20 52 45 41 4c 2c 0a 09 20 20 20  value REAL,..   
1900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1910: 20 20 20 20 20 65 78 70 65 63 74 65 64 20 52 45       expected RE
1920: 41 4c 2c 0a 09 20 20 20 20 20 20 20 20 20 20 20  AL,..           
1930: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6f 6c               tol
1940: 20 52 45 41 4c 2c 0a 20 20 20 20 20 20 20 20 20   REAL,.         
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1960: 20 20 20 20 20 20 20 75 6e 69 74 73 20 54 45 58         units TEX
1970: 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  T,.             
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1990: 20 20 20 63 6f 6d 6d 65 6e 74 20 54 45 58 54 20     comment TEXT 
19a0: 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20  DEFAULT '',.    
19b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74              stat
19d0: 75 73 20 54 45 58 54 20 44 45 46 41 55 4c 54 20  us TEXT DEFAULT 
19e0: 27 6e 2f 61 27 2c 0a 20 20 20 20 20 20 20 20 20  'n/a',.         
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a00: 20 20 20 20 20 20 20 74 79 70 65 20 54 45 58 54         type TEXT
1a10: 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20   DEFAULT '',.   
1a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a30: 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e 53 54             CONST
1a40: 52 41 49 4e 54 20 74 65 73 74 5f 64 61 74 61 5f  RAINT test_data_
1a50: 63 6f 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 55  constraint UNIQU
1a60: 45 20 28 74 65 73 74 5f 69 64 2c 63 61 74 65 67  E (test_id,categ
1a70: 6f 72 79 2c 76 61 72 69 61 62 6c 65 29 29 3b 22  ory,variable));"
1a80: 29 0a 09 20 20 3b 3b 20 4d 75 73 74 20 64 6f 20  )..  ;; Must do 
1a90: 74 68 69 73 20 2a 61 66 74 65 72 2a 20 72 75 6e  this *after* run
1aa0: 6e 69 6e 67 20 70 61 74 63 68 20 64 62 20 21 21  ning patch db !!
1ab0: 20 4e 6f 20 6d 6f 72 65 2e 20 0a 09 20 20 28 64   No more. ..  (d
1ac0: 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45  b:set-var db "ME
1ad0: 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20  GATEST_VERSION" 
1ae0: 6d 65 67 61 74 65 73 74 2d 76 65 72 73 69 6f 6e  megatest-version
1af0: 29 0a 09 20 20 29 29 0a 20 20 20 20 64 62 29 29  )..  )).    db))
1b00: 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ..;;============
1b10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1b20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1b30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1b40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 54 4f  ==========.;; TO
1b50: 44 4f 3a 0a 3b 3b 20 20 20 70 75 74 20 64 65 6c  DO:.;;   put del
1b60: 74 61 73 20 69 6e 74 6f 20 61 6e 20 61 73 73 6f  tas into an asso
1b70: 63 20 6c 69 73 74 20 77 69 74 68 20 76 65 72 73  c list with vers
1b80: 69 6f 6e 20 6e 75 6d 62 65 72 73 0a 3b 3b 20 20  ion numbers.;;  
1b90: 20 61 70 70 6c 79 20 61 6c 6c 20 66 72 6f 6d 20   apply all from 
1ba0: 6c 61 73 74 20 74 6f 20 63 75 72 72 65 6e 74 0a  last to current.
1bb0: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
1bc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1bd0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1be0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1bf0: 3d 3d 3d 3d 3d 3d 3d 3d 0a 28 64 65 66 69 6e 65  ========.(define
1c00: 20 28 70 61 74 63 68 2d 64 62 20 64 62 29 0a 20   (patch-db db). 
1c10: 20 28 68 61 6e 64 6c 65 2d 65 78 63 65 70 74 69   (handle-excepti
1c20: 6f 6e 73 0a 20 20 20 65 78 6e 0a 20 20 20 28 62  ons.   exn.   (b
1c30: 65 67 69 6e 0a 20 20 20 20 20 28 70 72 69 6e 74  egin.     (print
1c40: 20 22 45 78 63 65 70 74 69 6f 6e 3a 20 22 20 65   "Exception: " e
1c50: 78 6e 29 0a 20 20 20 20 20 28 70 72 69 6e 74 20  xn).     (print 
1c60: 22 45 52 52 4f 52 3a 20 50 6f 73 73 69 62 6c 65  "ERROR: Possible
1c70: 20 6f 75 74 20 6f 66 20 64 61 74 65 20 73 63 68   out of date sch
1c80: 65 6d 61 2c 20 61 74 74 65 6d 70 74 69 6e 67 20  ema, attempting 
1c90: 74 6f 20 61 64 64 20 74 61 62 6c 65 20 6d 65 74  to add table met
1ca0: 61 64 61 74 61 2e 2e 2e 22 29 0a 20 20 20 20 20  adata...").     
1cb0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
1cc0: 20 64 62 20 22 43 52 45 41 54 45 20 54 41 42 4c   db "CREATE TABL
1cd0: 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20  E IF NOT EXISTS 
1ce0: 6d 65 74 61 64 61 74 20 28 69 64 20 49 4e 54 45  metadat (id INTE
1cf0: 47 45 52 2c 20 76 61 72 20 54 45 58 54 2c 20 76  GER, var TEXT, v
1d00: 61 6c 20 54 45 58 54 2c 0a 20 20 20 20 20 20 20  al TEXT,.       
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d20: 20 20 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52            CONSTR
1d30: 41 49 4e 54 20 6d 65 74 61 64 61 74 5f 63 6f 6e  AINT metadat_con
1d40: 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28  straint UNIQUE (
1d50: 76 61 72 29 29 3b 22 29 0a 20 20 20 20 20 28 69  var));").     (i
1d60: 66 20 28 6e 6f 74 20 28 64 62 3a 67 65 74 2d 76  f (not (db:get-v
1d70: 61 72 20 64 62 20 22 4d 45 47 41 54 45 53 54 5f  ar db "MEGATEST_
1d80: 56 45 52 53 49 4f 4e 22 29 29 0a 09 20 28 64 62  VERSION")).. (db
1d90: 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47  :set-var db "MEG
1da0: 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 31  ATEST_VERSION" 1
1db0: 2e 31 37 29 29 29 0a 20 20 20 28 6c 65 74 20 28  .17))).   (let (
1dc0: 28 6d 76 65 72 20 28 64 62 3a 67 65 74 2d 76 61  (mver (db:get-va
1dd0: 72 20 64 62 20 22 4d 45 47 41 54 45 53 54 5f 56  r db "MEGATEST_V
1de0: 45 52 53 49 4f 4e 22 29 29 0a 09 20 28 74 65 73  ERSION")).. (tes
1df0: 74 2d 6d 65 74 61 2d 64 65 66 20 22 43 52 45 41  t-meta-def "CREA
1e00: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  TE TABLE IF NOT 
1e10: 45 58 49 53 54 53 20 74 65 73 74 5f 6d 65 74 61  EXISTS test_meta
1e20: 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49   (id INTEGER PRI
1e30: 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 20  MARY KEY,.      
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1e60: 65 73 74 6e 61 6d 65 20 20 20 20 54 45 58 54 20  estname    TEXT 
1e70: 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20  DEFAULT '',.    
1e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ea0: 20 61 75 74 68 6f 72 20 20 20 20 20 20 54 45 58   author      TEX
1eb0: 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20  T DEFAULT '',.  
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee0: 20 20 20 6f 77 6e 65 72 20 20 20 20 20 20 20 54     owner       T
1ef0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a  EXT DEFAULT '',.
1f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f20: 20 20 20 20 20 64 65 73 63 72 69 70 74 69 6f 6e       description
1f30: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27   TEXT DEFAULT ''
1f40: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f60: 20 20 20 20 20 20 20 72 65 76 69 65 77 65 64 20         reviewed 
1f70: 20 20 20 54 49 4d 45 53 54 41 4d 50 2c 0a 20 20     TIMESTAMP,.  
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa0: 20 20 20 69 74 65 72 61 74 65 64 20 20 20 20 54     iterated    T
1fb0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a  EXT DEFAULT '',.
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 20 20 20                  
1fe0: 20 20 20 20 20 61 76 67 5f 72 75 6e 74 69 6d 65       avg_runtime
1ff0: 20 52 45 41 4c 2c 0a 20 20 20 20 20 20 20 20 20   REAL,.         
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 61 76 67 5f              avg_
2020: 64 69 73 6b 20 20 20 20 52 45 41 4c 2c 0a 20 20  disk    REAL,.  
2030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2050: 20 20 20 74 61 67 73 20 20 20 20 20 20 20 20 54     tags        T
2060: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a  EXT DEFAULT '',.
2070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2090: 43 4f 4e 53 54 52 41 49 4e 54 20 74 65 73 74 5f  CONSTRAINT test_
20a0: 6d 65 74 61 5f 63 6f 6e 73 74 72 61 69 6e 74 20  meta_constraint 
20b0: 55 4e 49 51 55 45 20 28 74 65 73 74 6e 61 6d 65  UNIQUE (testname
20c0: 29 29 3b 22 29 29 0a 20 20 20 20 20 28 70 72 69  ));")).     (pri
20d0: 6e 74 20 22 43 75 72 72 65 6e 74 20 73 63 68 65  nt "Current sche
20e0: 6d 61 20 76 65 72 73 69 6f 6e 3a 20 22 20 6d 76  ma version: " mv
20f0: 65 72 20 22 20 63 75 72 72 65 6e 74 20 6d 65 67  er " current meg
2100: 61 74 65 73 74 20 76 65 72 73 69 6f 6e 3a 20 22  atest version: "
2110: 20 6d 65 67 61 74 65 73 74 2d 76 65 72 73 69 6f   megatest-versio
2120: 6e 29 0a 20 20 20 20 20 28 63 6f 6e 64 0a 20 20  n).     (cond.  
2130: 20 20 20 20 28 28 6e 6f 74 20 6d 76 65 72 29 0a      ((not mver).
2140: 20 20 20 20 20 20 20 28 70 72 69 6e 74 20 22 41         (print "A
2150: 64 64 69 6e 67 20 6d 65 67 61 74 65 73 74 2d 76  dding megatest-v
2160: 65 72 73 69 6f 6e 20 74 6f 20 6d 65 74 61 64 61  ersion to metada
2170: 74 61 22 29 20 3b 3b 20 4e 65 65 64 20 74 6f 20  ta") ;; Need to 
2180: 72 65 63 72 65 61 74 65 20 74 68 65 20 74 61 62  recreate the tab
2190: 6c 65 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74  le.       (sqlit
21a0: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 44  e3:execute db "D
21b0: 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49  ROP TABLE IF EXI
21c0: 53 54 53 20 6d 65 74 61 64 61 74 3b 22 29 0a 20  STS metadat;"). 
21d0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65        (sqlite3:e
21e0: 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 54  xecute db "CREAT
21f0: 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
2200: 58 49 53 54 53 20 6d 65 74 61 64 61 74 20 28 69  XISTS metadat (i
2210: 64 20 49 4e 54 45 47 45 52 2c 20 76 61 72 20 54  d INTEGER, var T
2220: 45 58 54 2c 20 76 61 6c 20 54 45 58 54 2c 0a 20  EXT, val TEXT,. 
2230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2250: 20 43 4f 4e 53 54 52 41 49 4e 54 20 6d 65 74 61   CONSTRAINT meta
2260: 64 61 74 5f 63 6f 6e 73 74 72 61 69 6e 74 20 55  dat_constraint U
2270: 4e 49 51 55 45 20 28 76 61 72 29 29 3b 22 29 0a  NIQUE (var));").
2280: 20 20 20 20 20 20 20 28 64 62 3a 73 65 74 2d 76         (db:set-v
2290: 61 72 20 64 62 20 22 4d 45 47 41 54 45 53 54 5f  ar db "MEGATEST_
22a0: 56 45 52 53 49 4f 4e 22 20 31 2e 31 37 29 0a 20  VERSION" 1.17). 
22b0: 20 20 20 20 20 20 28 70 61 74 63 68 2d 64 62 29        (patch-db)
22c0: 29 0a 20 20 20 20 20 20 28 28 3c 20 6d 76 65 72  ).      ((< mver
22d0: 20 31 2e 32 31 29 0a 20 20 20 20 20 20 20 28 73   1.21).       (s
22e0: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64  qlite3:execute d
22f0: 62 20 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46  b "DROP TABLE IF
2300: 20 45 58 49 53 54 53 20 6d 65 74 61 64 61 74 3b   EXISTS metadat;
2310: 22 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74  ").       (sqlit
2320: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 43  e3:execute db "C
2330: 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e  REATE TABLE IF N
2340: 4f 54 20 45 58 49 53 54 53 20 6d 65 74 61 64 61  OT EXISTS metada
2350: 74 20 28 69 64 20 49 4e 54 45 47 45 52 2c 20 76  t (id INTEGER, v
2360: 61 72 20 54 45 58 54 2c 20 76 61 6c 20 54 45 58  ar TEXT, val TEX
2370: 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  T,.             
2380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2390: 20 20 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20       CONSTRAINT 
23a0: 6d 65 74 61 64 61 74 5f 63 6f 6e 73 74 72 61 69  metadat_constrai
23b0: 6e 74 20 55 4e 49 51 55 45 20 28 76 61 72 29 29  nt UNIQUE (var))
23c0: 3b 22 29 0a 20 20 20 20 20 20 20 28 64 62 3a 73  ;").       (db:s
23d0: 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54  et-var db "MEGAT
23e0: 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e 32  EST_VERSION" 1.2
23f0: 31 29 20 3b 3b 20 73 65 74 20 62 65 66 6f 72 65  1) ;; set before
2400: 2c 20 6a 75 73 74 20 69 6e 20 63 61 73 65 20 74  , just in case t
2410: 68 65 20 63 68 61 6e 67 65 73 20 61 72 65 20 61  he changes are a
2420: 6c 72 65 61 64 79 20 61 70 70 6c 69 65 64 0a 20  lready applied. 
2430: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65        (sqlite3:e
2440: 78 65 63 75 74 65 20 64 62 20 74 65 73 74 2d 6d  xecute db test-m
2450: 65 74 61 2d 64 65 66 29 0a 09 09 09 09 09 3b 28  eta-def)......;(
2460: 66 6f 72 2d 65 61 63 68 20 0a 09 09 09 09 09 3b  for-each ......;
2470: 20 28 6c 61 6d 62 64 61 20 28 73 74 6d 74 29 0a   (lambda (stmt).
2480: 09 09 09 09 09 3b 20 20 20 28 73 71 6c 69 74 65  .....;   (sqlite
2490: 33 3a 65 78 65 63 75 74 65 20 64 62 20 73 74 6d  3:execute db stm
24a0: 74 29 29 0a 09 09 09 09 09 3b 20 28 6c 69 73 74  t))......; (list
24b0: 20 0a 09 09 09 09 09 3b 20 20 22 41 4c 54 45 52   ......;  "ALTER
24c0: 20 54 41 42 4c 45 20 74 65 73 74 73 20 41 44 44   TABLE tests ADD
24d0: 20 43 4f 4c 55 4d 4e 20 66 69 72 73 74 5f 65 72   COLUMN first_er
24e0: 72 20 54 45 58 54 3b 22 0a 09 09 09 09 09 3b 20  r TEXT;"......; 
24f0: 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 74 65   "ALTER TABLE te
2500: 73 74 73 20 41 44 44 20 43 4f 4c 55 4d 4e 20 66  sts ADD COLUMN f
2510: 69 72 73 74 5f 77 61 72 6e 20 54 45 58 54 3b 22  irst_warn TEXT;"
2520: 0a 09 09 09 09 09 3b 20 20 29 29 0a 20 20 20 20  ......;  )).    
2530: 20 20 20 28 70 61 74 63 68 2d 64 62 29 29 0a 20     (patch-db)). 
2540: 20 20 20 20 20 28 28 3c 20 6d 76 65 72 20 31 2e       ((< mver 1.
2550: 32 34 29 0a 20 20 20 20 20 20 20 28 64 62 3a 73  24).       (db:s
2560: 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54  et-var db "MEGAT
2570: 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e 32  EST_VERSION" 1.2
2580: 34 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74  4).       (sqlit
2590: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 44  e3:execute db "D
25a0: 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49  ROP TABLE IF EXI
25b0: 53 54 53 20 74 65 73 74 5f 64 61 74 61 3b 22 29  STS test_data;")
25c0: 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  .       (sqlite3
25d0: 3a 65 78 65 63 75 74 65 20 64 62 20 22 44 52 4f  :execute db "DRO
25e0: 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54  P TABLE IF EXIST
25f0: 53 20 74 65 73 74 5f 6d 65 74 61 3b 22 29 0a 20  S test_meta;"). 
2600: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65        (sqlite3:e
2610: 78 65 63 75 74 65 20 64 62 20 74 65 73 74 2d 6d  xecute db test-m
2620: 65 74 61 2d 64 65 66 29 0a 20 20 20 20 20 20 20  eta-def).       
2630: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
2640: 20 64 62 20 22 43 52 45 41 54 45 20 54 41 42 4c   db "CREATE TABL
2650: 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20  E IF NOT EXISTS 
2660: 74 65 73 74 5f 64 61 74 61 20 28 69 64 20 49 4e  test_data (id IN
2670: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
2680: 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y,.             
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a0: 20 20 20 74 65 73 74 5f 69 64 20 49 4e 54 45 47     test_id INTEG
26b0: 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ER,.            
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d0: 20 20 20 20 63 61 74 65 67 6f 72 79 20 54 45 58      category TEX
26e0: 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20  T DEFAULT '',.  
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76 61                va
2710: 72 69 61 62 6c 65 20 54 45 58 54 2c 0a 09 20 20  riable TEXT,..  
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2730: 20 20 20 20 20 20 76 61 6c 75 65 20 52 45 41 4c        value REAL
2740: 2c 0a 09 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
2750: 20 20 20 20 20 20 20 20 20 20 20 65 78 70 65 63             expec
2760: 74 65 64 20 52 45 41 4c 2c 0a 09 20 20 20 20 20  ted REAL,..     
2770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2780: 20 20 20 74 6f 6c 20 52 45 41 4c 2c 0a 20 20 20     tol REAL,.   
2790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 69               uni
27b0: 74 73 20 54 45 58 54 2c 0a 20 20 20 20 20 20 20  ts TEXT,.       
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d0: 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 65 6e 74           comment
27e0: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27   TEXT DEFAULT ''
27f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2810: 20 20 73 74 61 74 75 73 20 54 45 58 54 20 44 45    status TEXT DE
2820: 46 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20 20 20  FAULT 'n/a',.   
2830: 20 20 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 43 4f 4e 53 54             CONST
2850: 52 41 49 4e 54 20 74 65 73 74 5f 64 61 74 61 20  RAINT test_data 
2860: 55 4e 49 51 55 45 20 28 74 65 73 74 5f 69 64 2c  UNIQUE (test_id,
2870: 63 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62 6c  category,variabl
2880: 65 29 29 3b 22 29 0a 20 20 20 20 20 20 20 28 70  e));").       (p
2890: 72 69 6e 74 20 22 57 41 52 4e 49 4e 47 3a 20 54  rint "WARNING: T
28a0: 61 62 6c 65 20 74 65 73 74 5f 64 61 74 61 20 61  able test_data a
28b0: 6e 64 20 74 65 73 74 5f 6d 65 74 61 20 77 68 65  nd test_meta whe
28c0: 72 65 20 72 65 63 72 65 61 74 65 64 2e 20 50 6c  re recreated. Pl
28d0: 65 61 73 65 20 64 6f 20 6d 65 67 61 74 65 73 74  ease do megatest
28e0: 20 2d 75 70 64 61 74 65 2d 6d 65 74 61 22 29 0a   -update-meta").
28f0: 20 20 20 20 20 20 20 28 70 61 74 63 68 2d 64 62         (patch-db
2900: 29 29 0a 20 20 20 20 20 20 28 28 3c 20 6d 76 65  )).      ((< mve
2910: 72 20 31 2e 32 37 29 0a 20 20 20 20 20 20 20 28  r 1.27).       (
2920: 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d  db:set-var db "M
2930: 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22  EGATEST_VERSION"
2940: 20 31 2e 32 37 29 0a 20 20 20 20 20 20 20 28 73   1.27).       (s
2950: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64  qlite3:execute d
2960: 62 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20 74  b "ALTER TABLE t
2970: 65 73 74 5f 64 61 74 61 20 41 44 44 20 43 4f 4c  est_data ADD COL
2980: 55 4d 4e 20 74 79 70 65 20 54 45 58 54 20 44 45  UMN type TEXT DE
2990: 46 41 55 4c 54 20 27 27 3b 22 29 0a 20 20 20 20  FAULT '';").    
29a0: 20 20 20 28 70 61 74 63 68 2d 64 62 29 29 0a 20     (patch-db)). 
29b0: 20 20 20 20 20 28 28 3c 20 6d 76 65 72 20 31 2e       ((< mver 1.
29c0: 32 39 29 0a 20 20 20 20 20 20 20 28 64 62 3a 73  29).       (db:s
29d0: 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54  et-var db "MEGAT
29e0: 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e 32  EST_VERSION" 1.2
29f0: 39 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74  9).       (sqlit
2a00: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 41  e3:execute db "A
2a10: 4c 54 45 52 20 54 41 42 4c 45 20 74 65 73 74 5f  LTER TABLE test_
2a20: 73 74 65 70 73 20 41 44 44 20 43 4f 4c 55 4d 4e  steps ADD COLUMN
2a30: 20 6c 6f 67 66 69 6c 65 20 54 45 58 54 20 44 45   logfile TEXT DE
2a40: 46 41 55 4c 54 20 27 27 3b 22 29 0a 20 20 20 20  FAULT '';").    
2a50: 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63     (sqlite3:exec
2a60: 75 74 65 20 64 62 20 22 41 4c 54 45 52 20 54 41  ute db "ALTER TA
2a70: 42 4c 45 20 74 65 73 74 73 20 41 44 44 20 43 4f  BLE tests ADD CO
2a80: 4c 55 4d 4e 20 73 68 6f 72 74 64 69 72 20 54 45  LUMN shortdir TE
2a90: 58 54 20 44 45 46 41 55 4c 54 20 27 27 3b 22 29  XT DEFAULT '';")
2aa0: 29 0a 20 20 20 20 20 20 28 28 3c 20 6d 76 65 72  ).      ((< mver
2ab0: 20 31 2e 33 36 29 0a 20 20 20 20 20 20 20 28 64   1.36).       (d
2ac0: 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45  b:set-var db "ME
2ad0: 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20  GATEST_VERSION" 
2ae0: 31 2e 33 36 29 0a 20 20 20 20 20 20 20 28 73 71  1.36).       (sq
2af0: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62  lite3:execute db
2b00: 20 22 41 4c 54 45 52 20 54 41 42 4c 45 52 20 74   "ALTER TABLER t
2b10: 65 73 74 5f 6d 65 74 61 20 41 44 44 20 43 4f 4c  est_meta ADD COL
2b20: 55 4d 4e 20 6a 6f 62 67 72 6f 75 70 20 54 45 58  UMN jobgroup TEX
2b30: 54 20 44 45 46 41 55 4c 54 20 27 64 65 66 61 75  T DEFAULT 'defau
2b40: 6c 74 27 3b 22 29 29 0a 20 20 20 20 20 20 28 28  lt';")).      ((
2b50: 3c 20 6d 76 65 72 20 6d 65 67 61 74 65 73 74 2d  < mver megatest-
2b60: 76 65 72 73 69 6f 6e 29 0a 20 20 20 20 20 20 20  version).       
2b70: 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22  (db:set-var db "
2b80: 4d 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e  MEGATEST_VERSION
2b90: 22 20 6d 65 67 61 74 65 73 74 2d 76 65 72 73 69  " megatest-versi
2ba0: 6f 6e 29 29 29 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d  on))))))..;;====
2bb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2bc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2bd0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2be0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2bf0: 3d 3d 0a 3b 3b 20 6d 65 74 61 20 67 65 74 20 61  ==.;; meta get a
2c00: 6e 64 20 73 65 74 20 76 61 72 73 0a 3b 3b 3d 3d  nd set vars.;;==
2c10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2c20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2c30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2c40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2c50: 3d 3d 3d 3d 0a 0a 3b 3b 20 72 65 74 75 72 6e 73  ====..;; returns
2c60: 20 6e 75 6d 62 65 72 20 69 66 20 73 74 72 69 6e   number if strin
2c70: 67 2d 3e 6e 75 6d 62 65 72 20 69 73 20 73 75 63  g->number is suc
2c80: 63 65 73 73 66 75 6c 2c 20 73 74 72 69 6e 67 20  cessful, string 
2c90: 6f 74 68 65 72 77 69 73 65 0a 28 64 65 66 69 6e  otherwise.(defin
2ca0: 65 20 28 64 62 3a 67 65 74 2d 76 61 72 20 64 62  e (db:get-var db
2cb0: 20 76 61 72 29 0a 20 20 28 6c 65 74 20 28 28 72   var).  (let ((r
2cc0: 65 73 20 23 66 29 29 0a 20 20 20 20 28 73 71 6c  es #f)).    (sql
2cd0: 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f  ite3:for-each-ro
2ce0: 77 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28  w.     (lambda (
2cf0: 76 61 6c 29 0a 20 20 20 20 20 20 20 28 73 65 74  val).       (set
2d00: 21 20 72 65 73 20 76 61 6c 29 29 0a 20 20 20 20  ! res val)).    
2d10: 20 64 62 20 22 53 45 4c 45 43 54 20 76 61 6c 20   db "SELECT val 
2d20: 46 52 4f 4d 20 6d 65 74 61 64 61 74 20 57 48 45  FROM metadat WHE
2d30: 52 45 20 76 61 72 3d 3f 3b 22 20 76 61 72 29 0a  RE var=?;" var).
2d40: 20 20 20 20 28 69 66 20 28 73 74 72 69 6e 67 3f      (if (string?
2d50: 20 72 65 73 29 0a 09 28 6c 65 74 20 28 28 76 61   res)..(let ((va
2d60: 6c 6e 75 6d 20 28 73 74 72 69 6e 67 2d 3e 6e 75  lnum (string->nu
2d70: 6d 62 65 72 20 72 65 73 29 29 29 0a 09 20 20 28  mber res)))..  (
2d80: 69 66 20 76 61 6c 6e 75 6d 20 76 61 6c 6e 75 6d  if valnum valnum
2d90: 20 72 65 73 29 29 0a 09 72 65 73 29 29 29 0a 0a   res))..res)))..
2da0: 28 64 65 66 69 6e 65 20 28 64 62 3a 73 65 74 2d  (define (db:set-
2db0: 76 61 72 20 64 62 20 76 61 72 20 76 61 6c 29 0a  var db var val).
2dc0: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
2dd0: 74 65 20 64 62 20 22 49 4e 53 45 52 54 20 4f 52  te db "INSERT OR
2de0: 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 6d 65   REPLACE INTO me
2df0: 74 61 64 61 74 20 28 76 61 72 2c 76 61 6c 29 20  tadat (var,val) 
2e00: 56 41 4c 55 45 53 20 28 3f 2c 3f 29 3b 22 20 76  VALUES (?,?);" v
2e10: 61 72 20 76 61 6c 29 29 0a 0a 3b 3b 20 75 73 65  ar val))..;; use
2e20: 20 61 20 67 6c 6f 62 61 6c 20 66 6f 72 20 73 6f   a global for so
2e30: 6d 65 20 70 72 69 6d 69 74 69 76 65 20 63 61 63  me primitive cac
2e40: 68 69 6e 67 2c 20 69 74 20 69 73 20 6a 75 73 74  hing, it is just
2e50: 20 73 69 6c 6c 79 20 74 6f 20 72 65 2d 72 65 61   silly to re-rea
2e60: 64 20 74 68 65 20 64 62 20 0a 3b 3b 20 6f 76 65  d the db .;; ove
2e70: 72 20 61 6e 64 20 6f 76 65 72 20 61 67 61 69 6e  r and over again
2e80: 20 66 6f 72 20 74 68 65 20 6b 65 79 73 20 73 69   for the keys si
2e90: 6e 63 65 20 74 68 65 79 20 6e 65 76 65 72 20 63  nce they never c
2ea0: 68 61 6e 67 65 0a 0a 28 64 65 66 69 6e 65 20 2a  hange..(define *
2eb0: 64 62 2d 6b 65 79 73 2a 20 23 66 29 0a 0a 28 64  db-keys* #f)..(d
2ec0: 65 66 69 6e 65 20 28 64 62 2d 67 65 74 2d 6b 65  efine (db-get-ke
2ed0: 79 73 20 64 62 29 0a 20 20 28 69 66 20 2a 64 62  ys db).  (if *db
2ee0: 2d 6b 65 79 73 2a 20 2a 64 62 2d 6b 65 79 73 2a  -keys* *db-keys*
2ef0: 20 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28 72   .      (let ((r
2f00: 65 73 20 27 28 29 29 29 0a 09 28 73 71 6c 69 74  es '()))..(sqlit
2f10: 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20  e3:for-each-row 
2f20: 0a 09 20 28 6c 61 6d 62 64 61 20 28 6b 65 79 20  .. (lambda (key 
2f30: 6b 65 79 74 79 70 65 29 0a 09 20 20 20 28 73 65  keytype)..   (se
2f40: 74 21 20 72 65 73 20 28 63 6f 6e 73 20 28 76 65  t! res (cons (ve
2f50: 63 74 6f 72 20 6b 65 79 20 6b 65 79 74 79 70 65  ctor key keytype
2f60: 29 20 72 65 73 29 29 29 0a 09 20 64 62 0a 09 20  ) res))).. db.. 
2f70: 22 53 45 4c 45 43 54 20 66 69 65 6c 64 6e 61 6d  "SELECT fieldnam
2f80: 65 2c 66 69 65 6c 64 74 79 70 65 20 46 52 4f 4d  e,fieldtype FROM
2f90: 20 6b 65 79 73 20 4f 52 44 45 52 20 42 59 20 69   keys ORDER BY i
2fa0: 64 20 44 45 53 43 3b 22 29 0a 09 28 73 65 74 21  d DESC;")..(set!
2fb0: 20 2a 64 62 2d 6b 65 79 73 2a 20 72 65 73 29 0a   *db-keys* res).
2fc0: 09 72 65 73 29 29 29 0a 0a 28 64 65 66 69 6e 65  .res)))..(define
2fd0: 20 64 62 3a 67 65 74 2d 6b 65 79 73 20 64 62 2d   db:get-keys db-
2fe0: 67 65 74 2d 6b 65 79 73 29 0a 0a 28 64 65 66 69  get-keys)..(defi
2ff0: 6e 65 20 28 64 62 3a 67 65 74 2d 76 61 6c 75 65  ne (db:get-value
3000: 2d 62 79 2d 68 65 61 64 65 72 20 72 6f 77 20 68  -by-header row h
3010: 65 61 64 65 72 20 66 69 65 6c 64 29 0a 20 20 3b  eader field).  ;
3020: 3b 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 32  ; (debug:print 2
3030: 20 22 64 62 3a 67 65 74 2d 76 61 6c 75 65 2d 62   "db:get-value-b
3040: 79 2d 68 65 61 64 65 72 20 72 6f 77 3a 20 22 20  y-header row: " 
3050: 72 6f 77 20 22 20 68 65 61 64 65 72 3a 20 22 20  row " header: " 
3060: 68 65 61 64 65 72 20 22 20 66 69 65 6c 64 3a 20  header " field: 
3070: 22 20 66 69 65 6c 64 29 0a 20 20 28 69 66 20 28  " field).  (if (
3080: 6e 75 6c 6c 3f 20 68 65 61 64 65 72 29 20 23 66  null? header) #f
3090: 0a 20 20 20 20 20 20 28 6c 65 74 20 6c 6f 6f 70  .      (let loop
30a0: 20 28 28 68 65 64 20 28 63 61 72 20 68 65 61 64   ((hed (car head
30b0: 65 72 29 29 0a 09 09 20 28 74 61 6c 20 28 63 64  er))... (tal (cd
30c0: 72 20 68 65 61 64 65 72 29 29 0a 09 09 20 28 6e  r header))... (n
30d0: 20 20 20 30 29 29 0a 09 28 69 66 20 28 65 71 75     0))..(if (equ
30e0: 61 6c 3f 20 68 65 64 20 66 69 65 6c 64 29 0a 09  al? hed field)..
30f0: 20 20 20 20 28 76 65 63 74 6f 72 2d 72 65 66 20      (vector-ref 
3100: 72 6f 77 20 6e 29 0a 09 20 20 20 20 28 69 66 20  row n)..    (if 
3110: 28 6e 75 6c 6c 3f 20 74 61 6c 29 20 23 66 20 28  (null? tal) #f (
3120: 6c 6f 6f 70 20 28 63 61 72 20 74 61 6c 29 28 63  loop (car tal)(c
3130: 64 72 20 74 61 6c 29 28 2b 20 6e 20 31 29 29 29  dr tal)(+ n 1)))
3140: 29 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d  ))))..;;========
3150: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3160: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3170: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3180: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b  ==============.;
3190: 3b 20 20 52 20 55 20 4e 20 53 0a 3b 3b 3d 3d 3d  ;  R U N S.;;===
31a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
31b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
31c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
31d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
31e0: 3d 3d 3d 0a 0a 28 64 65 66 69 6e 65 20 28 72 75  ===..(define (ru
31f0: 6e 73 3a 67 65 74 2d 73 74 64 2d 72 75 6e 2d 66  ns:get-std-run-f
3200: 69 65 6c 64 73 20 6b 65 79 73 20 72 65 6d 66 69  ields keys remfi
3210: 65 6c 64 73 29 0a 20 20 28 6c 65 74 2a 20 28 28  elds).  (let* ((
3220: 68 65 61 64 65 72 20 20 20 20 28 61 70 70 65 6e  header    (appen
3230: 64 20 28 6d 61 70 20 6b 65 79 3a 67 65 74 2d 66  d (map key:get-f
3240: 69 65 6c 64 6e 61 6d 65 20 6b 65 79 73 29 0a 09  ieldname keys)..
3250: 09 09 20 20 20 20 72 65 6d 66 69 65 6c 64 73 29  ..    remfields)
3260: 29 0a 09 20 28 6b 65 79 73 74 72 20 20 20 20 28  ).. (keystr    (
3270: 63 6f 6e 63 20 28 6b 65 79 73 2d 3e 6b 65 79 73  conc (keys->keys
3280: 74 72 20 6b 65 79 73 29 20 22 2c 22 0a 09 09 09  tr keys) ","....
3290: 20 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73    (string-inters
32a0: 70 65 72 73 65 20 72 65 6d 66 69 65 6c 64 73 20  perse remfields 
32b0: 22 2c 22 29 29 29 29 0a 20 20 20 20 28 6c 69 73  ",")))).    (lis
32c0: 74 20 6b 65 79 73 74 72 20 68 65 61 64 65 72 29  t keystr header)
32d0: 29 29 0a 0a 3b 3b 20 57 41 53 20 64 62 2d 67 65  ))..;; WAS db-ge
32e0: 74 2d 72 75 6e 73 20 46 49 58 4d 45 20 49 4e 20  t-runs FIXME IN 
32f0: 52 45 4d 41 49 4e 49 4e 47 20 43 4f 44 45 0a 3b  REMAINING CODE.;
3300: 3b 0a 3b 3b 20 4d 45 52 47 45 20 54 48 49 53 20  ;.;; MERGE THIS 
3310: 57 49 54 48 20 64 62 3a 67 65 74 2d 72 75 6e 73  WITH db:get-runs
3320: 2c 20 61 63 63 69 64 65 6e 74 6c 79 20 77 72 6f  , accidently wro
3330: 74 65 20 69 74 20 74 77 69 63 65 0a 3b 3b 0a 3b  te it twice.;;.;
3340: 3b 20 72 65 70 6c 61 63 65 20 68 65 61 64 65 72  ; replace header
3350: 20 61 6e 64 20 6b 65 79 73 74 72 20 77 69 74 68   and keystr with
3360: 20 61 20 63 61 6c 6c 20 74 6f 20 72 75 6e 73 3a   a call to runs:
3370: 67 65 74 2d 73 74 64 2d 72 75 6e 2d 66 69 65 6c  get-std-run-fiel
3380: 64 73 0a 3b 3b 0a 3b 3b 20 6b 65 79 70 61 74 74  ds.;;.;; keypatt
3390: 73 3a 20 28 20 28 4b 45 59 31 20 22 61 62 63 25  s: ( (KEY1 "abc%
33a0: 64 65 66 22 29 28 4b 45 59 32 20 22 25 22 29 20  def")(KEY2 "%") 
33b0: 29 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 28 64 62  ).;;.(define (db
33c0: 3a 67 65 74 2d 72 75 6e 73 20 64 62 20 72 75 6e  :get-runs db run
33d0: 70 61 74 74 20 63 6f 75 6e 74 20 6f 66 66 73 65  patt count offse
33e0: 74 20 6b 65 79 70 61 74 74 73 29 0a 20 20 28 6c  t keypatts).  (l
33f0: 65 74 2a 20 28 28 72 65 73 20 20 20 20 20 20 27  et* ((res      '
3400: 28 29 29 0a 09 20 28 6b 65 79 73 20 20 20 20 20  ()).. (keys     
3410: 20 28 64 62 2d 67 65 74 2d 6b 65 79 73 20 64 62   (db-get-keys db
3420: 29 29 0a 09 20 28 72 65 6d 66 69 65 6c 64 73 20  )).. (remfields 
3430: 28 6c 69 73 74 20 22 69 64 22 20 22 72 75 6e 6e  (list "id" "runn
3440: 61 6d 65 22 20 22 73 74 61 74 65 22 20 22 73 74  ame" "state" "st
3450: 61 74 75 73 22 20 22 6f 77 6e 65 72 22 20 22 65  atus" "owner" "e
3460: 76 65 6e 74 5f 74 69 6d 65 22 29 29 0a 09 20 28  vent_time")).. (
3470: 68 65 61 64 65 72 20 20 20 20 28 61 70 70 65 6e  header    (appen
3480: 64 20 28 6d 61 70 20 6b 65 79 3a 67 65 74 2d 66  d (map key:get-f
3490: 69 65 6c 64 6e 61 6d 65 20 6b 65 79 73 29 0a 09  ieldname keys)..
34a0: 09 09 20 20 20 20 72 65 6d 66 69 65 6c 64 73 29  ..    remfields)
34b0: 29 0a 09 20 28 6b 65 79 73 74 72 20 20 20 20 28  ).. (keystr    (
34c0: 63 6f 6e 63 20 28 6b 65 79 73 2d 3e 6b 65 79 73  conc (keys->keys
34d0: 74 72 20 6b 65 79 73 29 20 22 2c 22 0a 09 09 09  tr keys) ","....
34e0: 20 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73    (string-inters
34f0: 70 65 72 73 65 20 72 65 6d 66 69 65 6c 64 73 20  perse remfields 
3500: 22 2c 22 29 29 29 0a 09 20 28 71 72 79 73 74 72  ","))).. (qrystr
3510: 20 20 20 20 28 63 6f 6e 63 20 22 53 45 4c 45 43      (conc "SELEC
3520: 54 20 22 20 6b 65 79 73 74 72 20 22 20 46 52 4f  T " keystr " FRO
3530: 4d 20 72 75 6e 73 20 57 48 45 52 45 20 72 75 6e  M runs WHERE run
3540: 6e 61 6d 65 20 4c 49 4b 45 20 3f 20 22 0a 09 09  name LIKE ? "...
3550: 09 20 20 3b 3b 20 47 65 6e 65 72 61 74 65 3a 20  .  ;; Generate: 
3560: 22 20 41 4e 44 20 78 20 4c 49 4b 45 20 27 6b 65  " AND x LIKE 'ke
3570: 79 70 61 74 74 27 20 2e 2e 2e 22 0a 09 09 09 20  ypatt' ...".... 
3580: 20 28 69 66 20 28 6e 75 6c 6c 3f 20 6b 65 79 70   (if (null? keyp
3590: 61 74 74 73 29 20 22 22 0a 09 09 09 20 20 20 20  atts) ""....    
35a0: 20 20 28 63 6f 6e 63 20 22 20 41 4e 44 20 22 0a    (conc " AND ".
35b0: 09 09 09 09 20 20 20 20 28 73 74 72 69 6e 67 2d  ....    (string-
35c0: 6a 6f 69 6e 20 0a 09 09 09 09 20 20 20 20 20 28  join .....     (
35d0: 6d 61 70 20 28 6c 61 6d 62 64 61 20 28 6b 65 79  map (lambda (key
35e0: 70 61 74 74 29 0a 09 09 09 09 09 20 20 20 20 28  patt)......    (
35f0: 6c 65 74 20 28 28 6b 65 79 20 20 28 63 61 72 20  let ((key  (car 
3600: 6b 65 79 70 61 74 74 29 29 0a 09 09 09 09 09 09  keypatt)).......
3610: 20 20 28 70 61 74 74 20 28 63 61 64 72 20 6b 65    (patt (cadr ke
3620: 79 70 61 74 74 29 29 29 0a 09 09 09 09 09 20 20  ypatt)))......  
3630: 20 20 20 20 28 63 6f 6e 63 20 6b 65 79 20 22 20      (conc key " 
3640: 4c 49 4b 45 20 27 22 20 70 61 74 74 20 22 27 22  LIKE '" patt "'"
3650: 29 29 29 0a 09 09 09 09 09 20 20 6b 65 79 70 61  )))......  keypa
3660: 74 74 73 29 0a 09 09 09 09 20 20 20 20 20 22 20  tts).....     " 
3670: 41 4e 44 20 22 29 29 29 0a 09 09 09 20 20 22 20  AND ")))....  " 
3680: 4f 52 44 45 52 20 42 59 20 65 76 65 6e 74 5f 74  ORDER BY event_t
3690: 69 6d 65 20 44 45 53 43 20 22 0a 09 09 09 20 20  ime DESC "....  
36a0: 28 69 66 20 28 6e 75 6d 62 65 72 3f 20 63 6f 75  (if (number? cou
36b0: 6e 74 29 0a 09 09 09 20 20 20 20 20 20 28 63 6f  nt)....      (co
36c0: 6e 63 20 22 20 4c 49 4d 49 54 20 22 20 63 6f 75  nc " LIMIT " cou
36d0: 6e 74 29 0a 09 09 09 20 20 20 20 20 20 22 22 29  nt)....      "")
36e0: 0a 09 09 09 20 20 28 69 66 20 28 6e 75 6d 62 65  ....  (if (numbe
36f0: 72 3f 20 6f 66 66 73 65 74 29 0a 09 09 09 20 20  r? offset)....  
3700: 20 20 20 20 28 63 6f 6e 63 20 22 20 4f 46 46 53      (conc " OFFS
3710: 45 54 20 22 20 6f 66 66 73 65 74 29 0a 09 09 09  ET " offset)....
3720: 20 20 20 20 20 20 22 22 29 29 29 29 0a 20 20 20        "")))).   
3730: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20   (debug:print 4 
3740: 22 64 62 3a 67 65 74 2d 72 75 6e 73 20 71 72 79  "db:get-runs qry
3750: 73 74 72 3a 20 22 20 71 72 79 73 74 72 20 22 5c  str: " qrystr "\
3760: 6e 6b 65 79 70 61 74 74 73 3a 20 22 20 6b 65 79  nkeypatts: " key
3770: 70 61 74 74 73 20 22 5c 6e 20 20 6f 66 66 73 65  patts "\n  offse
3780: 74 3a 20 22 20 6f 66 66 73 65 74 20 22 20 6c 69  t: " offset " li
3790: 6d 69 74 3a 20 22 20 63 6f 75 6e 74 29 0a 20 20  mit: " count).  
37a0: 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65    (sqlite3:for-e
37b0: 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61  ach-row.     (la
37c0: 6d 62 64 61 20 28 61 20 2e 20 78 29 0a 20 20 20  mbda (a . x).   
37d0: 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28 63      (set! res (c
37e0: 6f 6e 73 20 28 61 70 70 6c 79 20 76 65 63 74 6f  ons (apply vecto
37f0: 72 20 61 20 78 29 20 72 65 73 29 29 29 0a 20 20  r a x) res))).  
3800: 20 20 20 64 62 0a 20 20 20 20 20 71 72 79 73 74     db.     qryst
3810: 72 0a 20 20 20 20 20 72 75 6e 70 61 74 74 29 0a  r.     runpatt).
3820: 20 20 20 20 28 76 65 63 74 6f 72 20 68 65 61 64      (vector head
3830: 65 72 20 72 65 73 29 29 29 0a 0a 3b 3b 20 6a 75  er res)))..;; ju
3840: 73 74 20 67 65 74 20 63 6f 75 6e 74 20 6f 66 20  st get count of 
3850: 72 75 6e 73 0a 28 64 65 66 69 6e 65 20 28 64 62  runs.(define (db
3860: 3a 67 65 74 2d 6e 75 6d 2d 72 75 6e 73 20 64 62  :get-num-runs db
3870: 20 72 75 6e 70 61 74 74 29 0a 20 20 28 6c 65 74   runpatt).  (let
3880: 20 28 28 6e 75 6d 72 75 6e 73 20 30 29 29 0a 20   ((numruns 0)). 
3890: 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d     (sqlite3:for-
38a0: 65 61 63 68 2d 72 6f 77 20 0a 20 20 20 20 20 28  each-row .     (
38b0: 6c 61 6d 62 64 61 20 28 63 6f 75 6e 74 29 0a 20  lambda (count). 
38c0: 20 20 20 20 20 20 28 73 65 74 21 20 6e 75 6d 72        (set! numr
38d0: 75 6e 73 20 63 6f 75 6e 74 29 29 0a 20 20 20 20  uns count)).    
38e0: 20 64 62 0a 20 20 20 20 20 22 53 45 4c 45 43 54   db.     "SELECT
38f0: 20 43 4f 55 4e 54 28 69 64 29 20 46 52 4f 4d 20   COUNT(id) FROM 
3900: 72 75 6e 73 20 57 48 45 52 45 20 72 75 6e 6e 61  runs WHERE runna
3910: 6d 65 20 4c 49 4b 45 20 3f 3b 22 20 72 75 6e 70  me LIKE ?;" runp
3920: 61 74 74 29 0a 20 20 20 20 6e 75 6d 72 75 6e 73  att).    numruns
3930: 29 29 0a 0a 0a 3b 3b 20 75 73 65 20 28 67 65 74  ))...;; use (get
3940: 2d 76 61 6c 75 65 2d 62 79 2d 68 65 61 64 65 72  -value-by-header
3950: 20 28 64 62 3a 67 65 74 2d 68 65 61 64 65 72 20   (db:get-header 
3960: 72 75 6e 69 6e 66 6f 29 28 64 62 3a 67 65 74 2d  runinfo)(db:get-
3970: 72 6f 77 20 72 75 6e 69 6e 66 6f 29 29 0a 28 64  row runinfo)).(d
3980: 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 72 75  efine (db:get-ru
3990: 6e 2d 69 6e 66 6f 20 64 62 20 72 75 6e 2d 69 64  n-info db run-id
39a0: 29 0a 20 20 28 6c 65 74 2a 20 28 28 72 65 73 20  ).  (let* ((res 
39b0: 20 20 20 20 20 23 66 29 0a 09 20 28 6b 65 79 73       #f).. (keys
39c0: 20 20 20 20 20 20 28 64 62 2d 67 65 74 2d 6b 65        (db-get-ke
39d0: 79 73 20 64 62 29 29 0a 09 20 28 72 65 6d 66 69  ys db)).. (remfi
39e0: 65 6c 64 73 20 28 6c 69 73 74 20 22 69 64 22 20  elds (list "id" 
39f0: 22 72 75 6e 6e 61 6d 65 22 20 22 73 74 61 74 65  "runname" "state
3a00: 22 20 22 73 74 61 74 75 73 22 20 22 6f 77 6e 65  " "status" "owne
3a10: 72 22 20 22 65 76 65 6e 74 5f 74 69 6d 65 22 29  r" "event_time")
3a20: 29 0a 09 20 28 68 65 61 64 65 72 20 20 20 20 28  ).. (header    (
3a30: 61 70 70 65 6e 64 20 28 6d 61 70 20 6b 65 79 3a  append (map key:
3a40: 67 65 74 2d 66 69 65 6c 64 6e 61 6d 65 20 6b 65  get-fieldname ke
3a50: 79 73 29 0a 09 09 09 20 20 20 20 72 65 6d 66 69  ys)....    remfi
3a60: 65 6c 64 73 29 29 0a 09 20 28 6b 65 79 73 74 72  elds)).. (keystr
3a70: 20 20 20 20 28 63 6f 6e 63 20 28 6b 65 79 73 2d      (conc (keys-
3a80: 3e 6b 65 79 73 74 72 20 6b 65 79 73 29 20 22 2c  >keystr keys) ",
3a90: 22 0a 09 09 09 20 20 28 73 74 72 69 6e 67 2d 69  "....  (string-i
3aa0: 6e 74 65 72 73 70 65 72 73 65 20 72 65 6d 66 69  ntersperse remfi
3ab0: 65 6c 64 73 20 22 2c 22 29 29 29 29 0a 20 20 20  elds ",")))).   
3ac0: 20 3b 3b 20 28 64 65 62 75 67 3a 70 72 69 6e 74   ;; (debug:print
3ad0: 20 30 20 22 64 62 3a 67 65 74 2d 72 75 6e 2d 69   0 "db:get-run-i
3ae0: 6e 66 6f 20 72 75 6e 2d 69 64 3a 20 22 20 72 75  nfo run-id: " ru
3af0: 6e 2d 69 64 20 22 20 68 65 61 64 65 72 3a 20 22  n-id " header: "
3b00: 20 68 65 61 64 65 72 20 22 20 6b 65 79 73 74 72   header " keystr
3b10: 3a 20 22 20 6b 65 79 73 74 72 29 0a 20 20 20 20  : " keystr).    
3b20: 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63  (sqlite3:for-eac
3b30: 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62  h-row.     (lamb
3b40: 64 61 20 28 61 20 2e 20 78 29 0a 20 20 20 20 20  da (a . x).     
3b50: 20 20 28 73 65 74 21 20 72 65 73 20 28 61 70 70    (set! res (app
3b60: 6c 79 20 76 65 63 74 6f 72 20 61 20 78 29 29 29  ly vector a x)))
3b70: 0a 20 20 20 20 20 64 62 0a 20 20 20 20 20 28 63  .     db.     (c
3b80: 6f 6e 63 20 22 53 45 4c 45 43 54 20 22 20 6b 65  onc "SELECT " ke
3b90: 79 73 74 72 20 22 20 46 52 4f 4d 20 72 75 6e 73  ystr " FROM runs
3ba0: 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 29 0a 20   WHERE id=?;"). 
3bb0: 20 20 20 20 72 75 6e 2d 69 64 29 0a 20 20 20 20      run-id).    
3bc0: 28 76 65 63 74 6f 72 20 68 65 61 64 65 72 20 72  (vector header r
3bd0: 65 73 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  es)))..(define (
3be0: 64 62 3a 73 65 74 2d 63 6f 6d 6d 65 6e 74 2d 66  db:set-comment-f
3bf0: 6f 72 2d 72 75 6e 20 64 62 20 72 75 6e 2d 69 64  or-run db run-id
3c00: 20 63 6f 6d 6d 65 6e 74 29 0a 20 20 28 73 71 6c   comment).  (sql
3c10: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
3c20: 22 55 50 44 41 54 45 20 72 75 6e 73 20 53 45 54  "UPDATE runs SET
3c30: 20 63 6f 6d 6d 65 6e 74 3d 3f 20 57 48 45 52 45   comment=? WHERE
3c40: 20 69 64 3d 3f 3b 22 20 63 6f 6d 6d 65 6e 74 20   id=?;" comment 
3c50: 72 75 6e 2d 69 64 29 29 0a 0a 3b 3b 20 64 6f 65  run-id))..;; doe
3c60: 73 20 6e 6f 74 20 28 6f 62 76 69 6f 75 73 6c 79  s not (obviously
3c70: 21 29 20 72 65 6d 6f 76 65 64 20 64 65 70 65 6e  !) removed depen
3c80: 64 65 6e 74 20 64 61 74 61 2e 20 0a 28 64 65 66  dent data. .(def
3c90: 69 6e 65 20 28 64 62 3a 64 65 6c 65 74 65 2d 72  ine (db:delete-r
3ca0: 75 6e 20 64 62 20 72 75 6e 2d 69 64 29 0a 20 20  un db run-id).  
3cb0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
3cc0: 20 64 62 20 22 44 45 4c 45 54 45 20 46 52 4f 4d   db "DELETE FROM
3cd0: 20 72 75 6e 73 20 57 48 45 52 45 20 69 64 3d 3f   runs WHERE id=?
3ce0: 3b 22 20 72 75 6e 2d 69 64 29 29 0a 0a 28 64 65  ;" run-id))..(de
3cf0: 66 69 6e 65 20 28 64 62 3a 75 70 64 61 74 65 2d  fine (db:update-
3d00: 72 75 6e 2d 65 76 65 6e 74 5f 74 69 6d 65 20 64  run-event_time d
3d10: 62 20 72 75 6e 2d 69 64 29 0a 20 20 28 73 71 6c  b run-id).  (sql
3d20: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
3d30: 22 55 50 44 41 54 45 20 72 75 6e 73 20 53 45 54  "UPDATE runs SET
3d40: 20 65 76 65 6e 74 5f 74 69 6d 65 3d 73 74 72 66   event_time=strf
3d50: 74 69 6d 65 28 27 25 73 27 2c 27 6e 6f 77 27 29  time('%s','now')
3d60: 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 72 75   WHERE id=?;" ru
3d70: 6e 2d 69 64 29 29 20 0a 0a 3b 3b 3d 3d 3d 3d 3d  n-id)) ..;;=====
3d80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3d90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3da0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3db0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3dc0: 3d 0a 3b 3b 20 20 54 20 45 20 53 20 54 20 53 0a  =.;;  T E S T S.
3dd0: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
3de0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3df0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3e00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3e10: 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 73 74 61  ========..;; sta
3e20: 74 65 73 20 61 6e 64 20 73 74 61 74 75 73 65 73  tes and statuses
3e30: 20 61 72 65 20 6c 69 73 74 73 2c 20 74 75 72 6e   are lists, turn
3e40: 20 74 68 65 6d 20 69 6e 74 6f 20 28 22 50 41 53   them into ("PAS
3e50: 53 22 2c 22 46 41 49 4c 22 2e 2e 2e 29 20 61 6e  S","FAIL"...) an
3e60: 64 20 75 73 65 20 4e 4f 54 20 49 4e 0a 3b 3b 20  d use NOT IN.;; 
3e70: 69 2e 65 2e 20 74 68 65 73 65 20 6c 69 73 74 73  i.e. these lists
3e80: 20 64 65 66 69 6e 65 20 77 68 61 74 20 74 6f 20   define what to 
3e90: 4e 4f 54 20 73 68 6f 77 2e 0a 3b 3b 20 73 74 61  NOT show..;; sta
3ea0: 74 65 73 20 61 6e 64 20 73 74 61 74 75 73 65 73  tes and statuses
3eb0: 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f   are required to
3ec0: 20 62 65 20 6c 69 73 74 73 2c 20 65 6d 70 74 79   be lists, empty
3ed0: 20 69 73 20 6f 6b 0a 28 64 65 66 69 6e 65 20 28   is ok.(define (
3ee0: 64 62 2d 67 65 74 2d 74 65 73 74 73 2d 66 6f 72  db-get-tests-for
3ef0: 2d 72 75 6e 20 64 62 20 72 75 6e 2d 69 64 20 74  -run db run-id t
3f00: 65 73 74 70 61 74 74 20 69 74 65 6d 70 61 74 74  estpatt itempatt
3f10: 20 73 74 61 74 65 73 20 73 74 61 74 75 73 65 73   states statuses
3f20: 29 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20 27  ).  (let ((res '
3f30: 28 29 29 0a 09 28 73 74 61 74 65 73 2d 73 74 72  ())..(states-str
3f40: 20 20 20 20 28 63 6f 6e 63 20 22 28 27 22 20 28      (conc "('" (
3f50: 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72  string-intersper
3f60: 73 65 20 73 74 61 74 65 73 20 20 20 22 27 2c 27  se states   "','
3f70: 22 29 20 22 27 29 22 29 29 0a 09 28 73 74 61 74  ") "')"))..(stat
3f80: 75 73 65 73 2d 73 74 72 20 20 28 63 6f 6e 63 20  uses-str  (conc 
3f90: 22 28 27 22 20 28 73 74 72 69 6e 67 2d 69 6e 74  "('" (string-int
3fa0: 65 72 73 70 65 72 73 65 20 73 74 61 74 75 73 65  ersperse statuse
3fb0: 73 20 22 27 2c 27 22 29 20 22 27 29 22 29 29 0a  s "','") "')")).
3fc0: 09 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a  .).    (sqlite3:
3fd0: 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20  for-each-row .  
3fe0: 20 20 20 28 6c 61 6d 62 64 61 20 28 61 20 2e 20     (lambda (a . 
3ff0: 62 29 20 3b 3b 20 69 64 20 72 75 6e 2d 69 64 20  b) ;; id run-id 
4000: 74 65 73 74 6e 61 6d 65 20 73 74 61 74 65 20 73  testname state s
4010: 74 61 74 75 73 20 65 76 65 6e 74 2d 74 69 6d 65  tatus event-time
4020: 20 68 6f 73 74 20 63 70 75 6c 6f 61 64 20 64 69   host cpuload di
4030: 73 6b 66 72 65 65 20 75 6e 61 6d 65 20 72 75 6e  skfree uname run
4040: 64 69 72 20 69 74 65 6d 2d 70 61 74 68 20 72 75  dir item-path ru
4050: 6e 2d 64 75 72 61 74 69 6f 6e 20 66 69 6e 61 6c  n-duration final
4060: 2d 6c 6f 67 66 20 63 6f 6d 6d 65 6e 74 29 0a 20  -logf comment). 
4070: 20 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20        (set! res 
4080: 28 63 6f 6e 73 20 28 61 70 70 6c 79 20 76 65 63  (cons (apply vec
4090: 74 6f 72 20 61 20 62 29 20 72 65 73 29 29 29 20  tor a b) res))) 
40a0: 3b 3b 20 69 64 20 72 75 6e 2d 69 64 20 74 65 73  ;; id run-id tes
40b0: 74 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61 74  tname state stat
40c0: 75 73 20 65 76 65 6e 74 2d 74 69 6d 65 20 68 6f  us event-time ho
40d0: 73 74 20 63 70 75 6c 6f 61 64 20 64 69 73 6b 66  st cpuload diskf
40e0: 72 65 65 20 75 6e 61 6d 65 20 72 75 6e 64 69 72  ree uname rundir
40f0: 20 69 74 65 6d 2d 70 61 74 68 20 72 75 6e 2d 64   item-path run-d
4100: 75 72 61 74 69 6f 6e 20 66 69 6e 61 6c 2d 6c 6f  uration final-lo
4110: 67 66 20 63 6f 6d 6d 65 6e 74 29 20 72 65 73 29  gf comment) res)
4120: 29 29 0a 20 20 20 20 20 64 62 20 0a 20 20 20 20  )).     db .    
4130: 20 28 63 6f 6e 63 20 22 53 45 4c 45 43 54 20 69   (conc "SELECT i
4140: 64 2c 72 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d  d,run_id,testnam
4150: 65 2c 73 74 61 74 65 2c 73 74 61 74 75 73 2c 65  e,state,status,e
4160: 76 65 6e 74 5f 74 69 6d 65 2c 68 6f 73 74 2c 63  vent_time,host,c
4170: 70 75 6c 6f 61 64 2c 64 69 73 6b 66 72 65 65 2c  puload,diskfree,
4180: 75 6e 61 6d 65 2c 72 75 6e 64 69 72 2c 69 74 65  uname,rundir,ite
4190: 6d 5f 70 61 74 68 2c 72 75 6e 5f 64 75 72 61 74  m_path,run_durat
41a0: 69 6f 6e 2c 66 69 6e 61 6c 5f 6c 6f 67 66 2c 63  ion,final_logf,c
41b0: 6f 6d 6d 65 6e 74 20 22 0a 09 20 20 20 22 20 46  omment "..   " F
41c0: 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 20  ROM tests WHERE 
41d0: 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73  run_id=? AND tes
41e0: 74 6e 61 6d 65 20 6c 69 6b 65 20 3f 20 41 4e 44  tname like ? AND
41f0: 20 69 74 65 6d 5f 70 61 74 68 20 4c 49 4b 45 20   item_path LIKE 
4200: 3f 20 22 20 0a 09 20 20 20 22 20 41 4e 44 20 4e  ? " ..   " AND N
4210: 4f 54 20 28 73 74 61 74 65 20 69 6e 20 22 20 73  OT (state in " s
4220: 74 61 74 65 73 2d 73 74 72 20 22 20 41 4e 44 20  tates-str " AND 
4230: 73 74 61 74 75 73 20 49 4e 20 22 20 73 74 61 74  status IN " stat
4240: 75 73 65 73 2d 73 74 72 20 22 29 20 22 0a 09 20  uses-str ") ".. 
4250: 20 20 3b 3b 20 22 20 4f 52 44 45 52 20 42 59 20    ;; " ORDER BY 
4260: 69 64 20 44 45 53 43 3b 22 0a 09 20 20 20 22 20  id DESC;"..   " 
4270: 4f 52 44 45 52 20 42 59 20 65 76 65 6e 74 5f 74  ORDER BY event_t
4280: 69 6d 65 20 41 53 43 3b 22 20 3b 3b 20 50 4f 54  ime ASC;" ;; POT
4290: 45 4e 54 49 41 4c 20 49 53 53 55 45 21 20 43 48  ENTIAL ISSUE! CH
42a0: 45 43 4b 20 4d 45 21 20 44 6f 65 73 20 61 6e 79  ECK ME! Does any
42b0: 74 69 6e 67 20 64 65 70 65 6e 64 20 6f 6e 20 74  ting depend on t
42c0: 68 69 73 20 62 65 69 6e 67 20 73 6f 72 74 65 64  his being sorted
42d0: 20 62 79 20 69 64 3f 0a 09 20 20 20 29 0a 20 20   by id?..   ).  
42e0: 20 20 20 72 75 6e 2d 69 64 0a 20 20 20 20 20 28     run-id.     (
42f0: 69 66 20 74 65 73 74 70 61 74 74 20 74 65 73 74  if testpatt test
4300: 70 61 74 74 20 22 25 22 29 0a 20 20 20 20 20 28  patt "%").     (
4310: 69 66 20 69 74 65 6d 70 61 74 74 20 69 74 65 6d  if itempatt item
4320: 70 61 74 74 20 22 25 22 29 29 0a 20 20 20 20 72  patt "%")).    r
4330: 65 73 29 29 0a 0a 3b 3b 20 74 68 69 73 20 6f 6e  es))..;; this on
4340: 65 20 69 73 20 61 20 62 69 74 20 62 72 6f 6b 65  e is a bit broke
4350: 6e 20 42 55 47 20 46 49 58 4d 45 0a 28 64 65 66  n BUG FIXME.(def
4360: 69 6e 65 20 28 64 62 3a 64 65 6c 65 74 65 2d 74  ine (db:delete-t
4370: 65 73 74 2d 73 74 65 70 2d 72 65 63 6f 72 64 73  est-step-records
4380: 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d   db run-id test-
4390: 6e 61 6d 65 20 69 74 65 6d 64 61 74 29 0a 20 20  name itemdat).  
43a0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
43b0: 20 64 62 20 22 44 45 4c 45 54 45 20 46 52 4f 4d   db "DELETE FROM
43c0: 20 74 65 73 74 5f 73 74 65 70 73 20 57 48 45 52   test_steps WHER
43d0: 45 20 74 65 73 74 5f 69 64 20 69 6e 20 28 53 45  E test_id in (SE
43e0: 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 74 65 73  LECT id FROM tes
43f0: 74 73 20 57 48 45 52 45 20 72 75 6e 5f 69 64 3d  ts WHERE run_id=
4400: 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f  ? AND testname=?
4410: 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 3d 3f   AND item_path=?
4420: 29 3b 22 20 0a 09 09 20 20 20 72 75 6e 2d 69 64  );" ...   run-id
4430: 20 74 65 73 74 2d 6e 61 6d 65 20 28 69 74 65 6d   test-name (item
4440: 2d 6c 69 73 74 2d 3e 70 61 74 68 20 69 74 65 6d  -list->path item
4450: 64 61 74 29 29 29 0a 3b 3b 20 0a 28 64 65 66 69  dat))).;; .(defi
4460: 6e 65 20 28 64 62 3a 64 65 6c 65 74 65 2d 74 65  ne (db:delete-te
4470: 73 74 2d 72 65 63 6f 72 64 73 20 64 62 20 74 65  st-records db te
4480: 73 74 2d 69 64 29 0a 20 20 28 73 71 6c 69 74 65  st-id).  (sqlite
4490: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 44 45  3:execute db "DE
44a0: 4c 45 54 45 20 46 52 4f 4d 20 74 65 73 74 5f 73  LETE FROM test_s
44b0: 74 65 70 73 20 57 48 45 52 45 20 74 65 73 74 5f  teps WHERE test_
44c0: 69 64 3d 3f 3b 22 20 74 65 73 74 2d 69 64 29 0a  id=?;" test-id).
44d0: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
44e0: 74 65 20 64 62 20 22 44 45 4c 45 54 45 20 46 52  te db "DELETE FR
44f0: 4f 4d 20 74 65 73 74 5f 64 61 74 61 20 20 57 48  OM test_data  WH
4500: 45 52 45 20 74 65 73 74 5f 69 64 3d 3f 3b 22 20  ERE test_id=?;" 
4510: 74 65 73 74 2d 69 64 29 0a 20 20 28 73 71 6c 69  test-id).  (sqli
4520: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22  te3:execute db "
4530: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 65 73 74  DELETE FROM test
4540: 73 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 74  s WHERE id=?;" t
4550: 65 73 74 2d 69 64 29 29 0a 0a 3b 3b 20 73 65 74  est-id))..;; set
4560: 20 74 65 73 74 73 20 77 69 74 68 20 73 74 61 74   tests with stat
4570: 65 20 63 75 72 72 73 74 61 74 65 20 61 6e 64 20  e currstate and 
4580: 73 74 61 74 75 73 20 63 75 72 72 73 74 61 74 75  status currstatu
4590: 73 20 74 6f 20 6e 65 77 73 74 61 74 65 20 61 6e  s to newstate an
45a0: 64 20 6e 65 77 73 74 61 74 75 73 0a 3b 3b 20 75  d newstatus.;; u
45b0: 73 65 20 63 75 72 72 73 74 61 74 65 20 3d 20 23  se currstate = #
45c0: 66 20 61 6e 64 20 6f 72 20 63 75 72 72 73 74 61  f and or currsta
45d0: 74 75 73 20 3d 20 23 66 20 74 6f 20 61 70 70 6c  tus = #f to appl
45e0: 79 20 74 6f 20 61 6e 79 20 73 74 61 74 65 20 6f  y to any state o
45f0: 72 20 73 74 61 74 75 73 20 72 65 73 70 65 63 74  r status respect
4600: 69 76 65 6c 79 0a 3b 3b 20 57 41 52 4e 49 4e 47  ively.;; WARNING
4610: 3a 20 53 51 4c 20 69 6e 6a 65 63 74 69 6f 6e 20  : SQL injection 
4620: 72 69 73 6b 0a 28 64 65 66 69 6e 65 20 28 64 62  risk.(define (db
4630: 3a 73 65 74 2d 74 65 73 74 73 2d 73 74 61 74 65  :set-tests-state
4640: 2d 73 74 61 74 75 73 20 64 62 20 72 75 6e 2d 69  -status db run-i
4650: 64 20 74 65 73 74 6e 61 6d 65 73 20 63 75 72 72  d testnames curr
4660: 73 74 61 74 65 20 63 75 72 72 73 74 61 74 75 73  state currstatus
4670: 20 6e 65 77 73 74 61 74 65 20 6e 65 77 73 74 61   newstate newsta
4680: 74 75 73 29 0a 20 20 28 66 6f 72 2d 65 61 63 68  tus).  (for-each
4690: 20 28 6c 61 6d 62 64 61 20 28 74 65 73 74 6e 61   (lambda (testna
46a0: 6d 65 29 0a 09 20 20 20 20 20 20 28 6c 65 74 20  me)..      (let 
46b0: 28 28 71 72 79 20 28 63 6f 6e 63 20 22 55 50 44  ((qry (conc "UPD
46c0: 41 54 45 20 74 65 73 74 73 20 53 45 54 20 73 74  ATE tests SET st
46d0: 61 74 65 3d 3f 2c 73 74 61 74 75 73 3d 3f 20 57  ate=?,status=? W
46e0: 48 45 52 45 20 22 0a 09 09 09 20 20 20 20 20 20  HERE "....      
46f0: 20 28 69 66 20 63 75 72 72 73 74 61 74 65 20 20   (if currstate  
4700: 28 63 6f 6e 63 20 22 73 74 61 74 65 3d 27 22 20  (conc "state='" 
4710: 63 75 72 72 73 74 61 74 65 20 22 27 20 41 4e 44  currstate "' AND
4720: 20 22 29 20 22 22 29 0a 09 09 09 20 20 20 20 20   ") "")....     
4730: 20 20 28 69 66 20 63 75 72 72 73 74 61 74 75 73    (if currstatus
4740: 20 28 63 6f 6e 63 20 22 73 74 61 74 75 73 3d 27   (conc "status='
4750: 22 20 63 75 72 72 73 74 61 74 75 73 20 22 27 20  " currstatus "' 
4760: 41 4e 44 20 22 29 20 22 22 29 0a 09 09 09 20 20  AND ") "")....  
4770: 20 20 20 20 20 22 20 72 75 6e 5f 69 64 3d 3f 20       " run_id=? 
4780: 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41  AND testname=? A
4790: 4e 44 20 4e 4f 54 20 28 69 74 65 6d 5f 70 61 74  ND NOT (item_pat
47a0: 68 3d 27 27 20 41 4e 44 20 74 65 73 74 6e 61 6d  h='' AND testnam
47b0: 65 20 69 6e 20 28 53 45 4c 45 43 54 20 44 49 53  e in (SELECT DIS
47c0: 54 49 4e 43 54 20 74 65 73 74 6e 61 6d 65 20 46  TINCT testname F
47d0: 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 20  ROM tests WHERE 
47e0: 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69  testname=? AND i
47f0: 74 65 6d 5f 70 61 74 68 20 21 3d 20 27 27 29 29  tem_path != ''))
4800: 3b 22 29 29 29 0a 09 09 3b 3b 28 64 65 62 75 67  ;")))...;;(debug
4810: 3a 70 72 69 6e 74 20 30 20 22 51 52 59 3a 20 22  :print 0 "QRY: "
4820: 20 71 72 79 29 0a 09 09 28 73 71 6c 69 74 65 33   qry)...(sqlite3
4830: 3a 65 78 65 63 75 74 65 20 64 62 20 71 72 79 20  :execute db qry 
4840: 72 75 6e 2d 69 64 20 6e 65 77 73 74 61 74 65 20  run-id newstate 
4850: 6e 65 77 73 74 61 74 75 73 20 74 65 73 74 6e 61  newstatus testna
4860: 6d 65 20 74 65 73 74 6e 61 6d 65 29 29 29 0a 09  me testname)))..
4870: 20 20 20 20 74 65 73 74 6e 61 6d 65 73 29 29 0a      testnames)).
4880: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 64 65 6c  .(define (db:del
4890: 65 74 65 2d 74 65 73 74 73 2d 69 6e 2d 73 74 61  ete-tests-in-sta
48a0: 74 65 20 64 62 20 72 75 6e 2d 69 64 20 73 74 61  te db run-id sta
48b0: 74 65 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65  te).  (sqlite3:e
48c0: 78 65 63 75 74 65 20 64 62 20 22 44 45 4c 45 54  xecute db "DELET
48d0: 45 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45  E FROM tests WHE
48e0: 52 45 20 73 74 61 74 65 3d 3f 20 41 4e 44 20 72  RE state=? AND r
48f0: 75 6e 5f 69 64 3d 3f 3b 22 20 73 74 61 74 65 20  un_id=?;" state 
4900: 72 75 6e 2d 69 64 29 29 0a 0a 28 64 65 66 69 6e  run-id))..(defin
4910: 65 20 28 64 62 3a 74 65 73 74 2d 73 65 74 2d 73  e (db:test-set-s
4920: 74 61 74 65 2d 73 74 61 74 75 73 2d 62 79 2d 69  tate-status-by-i
4930: 64 20 64 62 20 74 65 73 74 2d 69 64 20 6e 65 77  d db test-id new
4940: 73 74 61 74 65 20 6e 65 77 73 74 61 74 75 73 20  state newstatus 
4950: 6e 65 77 63 6f 6d 6d 65 6e 74 29 0a 20 20 28 69  newcomment).  (i
4960: 66 20 6e 65 77 73 74 61 74 65 20 20 20 28 73 71  f newstate   (sq
4970: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62  lite3:execute db
4980: 20 22 55 50 44 41 54 45 20 74 65 73 74 73 20 53   "UPDATE tests S
4990: 45 54 20 73 74 61 74 65 3d 3f 20 20 20 57 48 45  ET state=?   WHE
49a0: 52 45 20 69 64 3d 3f 3b 22 20 6e 65 77 73 74 61  RE id=?;" newsta
49b0: 74 65 20 20 20 74 65 73 74 2d 69 64 29 29 0a 20  te   test-id)). 
49c0: 20 28 69 66 20 6e 65 77 73 74 61 74 75 73 20 20   (if newstatus  
49d0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
49e0: 20 64 62 20 22 55 50 44 41 54 45 20 74 65 73 74   db "UPDATE test
49f0: 73 20 53 45 54 20 73 74 61 74 75 73 3d 3f 20 20  s SET status=?  
4a00: 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 6e 65 77  WHERE id=?;" new
4a10: 73 74 61 74 75 73 20 20 74 65 73 74 2d 69 64 29  status  test-id)
4a20: 29 0a 20 20 28 69 66 20 6e 65 77 63 6f 6d 6d 65  ).  (if newcomme
4a30: 6e 74 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63  nt (sqlite3:exec
4a40: 75 74 65 20 64 62 20 22 55 50 44 41 54 45 20 74  ute db "UPDATE t
4a50: 65 73 74 73 20 53 45 54 20 63 6f 6d 6d 65 6e 74  ests SET comment
4a60: 3d 3f 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20  =? WHERE id=?;" 
4a70: 6e 65 77 63 6f 6d 6d 65 6e 74 20 74 65 73 74 2d  newcomment test-
4a80: 69 64 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  id)))..(define (
4a90: 64 62 3a 67 65 74 2d 63 6f 75 6e 74 2d 74 65 73  db:get-count-tes
4aa0: 74 73 2d 72 75 6e 6e 69 6e 67 20 64 62 29 0a 20  ts-running db). 
4ab0: 20 28 6c 65 74 20 28 28 72 65 73 20 30 29 29 0a   (let ((res 0)).
4ac0: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72      (sqlite3:for
4ad0: 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28  -each-row.     (
4ae0: 6c 61 6d 62 64 61 20 28 63 6f 75 6e 74 29 0a 20  lambda (count). 
4af0: 20 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20        (set! res 
4b00: 63 6f 75 6e 74 29 29 0a 20 20 20 20 20 64 62 0a  count)).     db.
4b10: 20 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75       "SELECT cou
4b20: 6e 74 28 69 64 29 20 46 52 4f 4d 20 74 65 73 74  nt(id) FROM test
4b30: 73 20 57 48 45 52 45 20 73 74 61 74 65 20 3d 20  s WHERE state = 
4b40: 27 52 55 4e 4e 49 4e 47 27 20 4f 52 20 73 74 61  'RUNNING' OR sta
4b50: 74 65 20 3d 20 27 4c 41 55 4e 43 48 45 44 27 20  te = 'LAUNCHED' 
4b60: 4f 52 20 73 74 61 74 65 20 3d 20 27 52 45 4d 4f  OR state = 'REMO
4b70: 54 45 48 4f 53 54 53 54 41 52 54 27 3b 22 29 0a  TEHOSTSTART';").
4b80: 20 20 20 20 72 65 73 29 29 0a 0a 28 64 65 66 69      res))..(defi
4b90: 6e 65 20 28 64 62 3a 67 65 74 2d 63 6f 75 6e 74  ne (db:get-count
4ba0: 2d 74 65 73 74 73 2d 72 75 6e 6e 69 6e 67 2d 69  -tests-running-i
4bb0: 6e 2d 6a 6f 62 67 72 6f 75 70 20 64 62 20 6a 6f  n-jobgroup db jo
4bc0: 62 67 72 6f 75 70 29 0a 20 20 28 69 66 20 28 6e  bgroup).  (if (n
4bd0: 6f 74 20 6a 6f 62 67 72 6f 75 70 29 0a 20 20 20  ot jobgroup).   
4be0: 20 20 20 30 20 3b 3b 20 0a 20 20 20 20 20 20 28     0 ;; .      (
4bf0: 6c 65 74 20 28 28 72 65 73 20 30 29 29 0a 09 28  let ((res 0))..(
4c00: 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68  sqlite3:for-each
4c10: 2d 72 6f 77 0a 09 20 28 6c 61 6d 62 64 61 20 28  -row.. (lambda (
4c20: 63 6f 75 6e 74 29 0a 09 20 20 20 28 73 65 74 21  count)..   (set!
4c30: 20 72 65 73 20 63 6f 75 6e 74 29 29 0a 09 20 64   res count)).. d
4c40: 62 0a 09 20 22 53 45 4c 45 43 54 20 63 6f 75 6e  b.. "SELECT coun
4c50: 74 28 69 64 29 20 46 52 4f 4d 20 74 65 73 74 73  t(id) FROM tests
4c60: 20 57 48 45 52 45 20 73 74 61 74 65 20 3d 20 27   WHERE state = '
4c70: 52 55 4e 4e 49 4e 47 27 20 4f 52 20 73 74 61 74  RUNNING' OR stat
4c80: 65 20 3d 20 27 4c 41 55 4e 43 48 45 44 27 20 4f  e = 'LAUNCHED' O
4c90: 52 20 73 74 61 74 65 20 3d 20 27 52 45 4d 4f 54  R state = 'REMOT
4ca0: 45 48 4f 53 54 53 54 41 52 54 27 0a 20 20 20 20  EHOSTSTART'.    
4cb0: 20 20 20 20 20 20 20 20 20 41 4e 44 20 74 65 73           AND tes
4cc0: 74 6e 61 6d 65 20 69 6e 20 28 53 45 4c 45 43 54  tname in (SELECT
4cd0: 20 74 65 73 74 6e 61 6d 65 20 46 52 4f 4d 20 74   testname FROM t
4ce0: 65 73 74 5f 6d 65 74 61 20 57 48 45 52 45 20 6a  est_meta WHERE j
4cf0: 6f 62 67 72 6f 75 70 3d 3f 3b 22 0a 09 20 6a 6f  obgroup=?;".. jo
4d00: 62 67 72 6f 75 70 29 0a 09 72 65 73 29 29 29 0a  bgroup)..res))).
4d10: 0a 3b 3b 20 64 6f 6e 65 20 77 69 74 68 20 72 75  .;; done with ru
4d20: 6e 20 77 68 65 6e 3a 0a 3b 3b 20 20 20 30 20 74  n when:.;;   0 t
4d30: 65 73 74 73 20 69 6e 20 4c 41 55 4e 43 48 45 44  ests in LAUNCHED
4d40: 2c 20 4e 4f 54 5f 53 54 41 52 54 45 44 2c 20 52  , NOT_STARTED, R
4d50: 45 4d 4f 54 45 48 4f 53 54 53 54 41 52 54 2c 20  EMOTEHOSTSTART, 
4d60: 52 55 4e 4e 49 4e 47 0a 28 64 65 66 69 6e 65 20  RUNNING.(define 
4d70: 28 64 62 3a 65 73 74 69 6d 61 74 65 64 2d 74 65  (db:estimated-te
4d80: 73 74 73 2d 72 65 6d 61 69 6e 69 6e 67 20 64 62  sts-remaining db
4d90: 20 72 75 6e 2d 69 64 29 0a 20 20 28 6c 65 74 20   run-id).  (let 
4da0: 28 28 72 65 73 20 30 29 29 0a 20 20 20 20 28 73  ((res 0)).    (s
4db0: 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d  qlite3:for-each-
4dc0: 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 64 61  row.     (lambda
4dd0: 20 28 63 6f 75 6e 74 29 0a 20 20 20 20 20 20 20   (count).       
4de0: 28 73 65 74 21 20 72 65 73 20 63 6f 75 6e 74 29  (set! res count)
4df0: 29 0a 20 20 20 20 20 64 62 20 3b 3b 20 4e 42 2f  ).     db ;; NB/
4e00: 2f 20 4b 49 4c 4c 52 45 51 20 6d 65 61 6e 73 20  / KILLREQ means 
4e10: 74 68 65 20 6a 6f 62 73 20 69 73 20 73 74 69 6c  the jobs is stil
4e20: 6c 20 70 72 6f 62 61 62 6c 79 20 72 75 6e 6e 69  l probably runni
4e30: 6e 67 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20  ng.     "SELECT 
4e40: 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 74  count(id) FROM t
4e50: 65 73 74 73 20 57 48 45 52 45 20 73 74 61 74 65  ests WHERE state
4e60: 20 69 6e 20 28 27 4c 41 55 4e 43 48 45 44 27 2c   in ('LAUNCHED',
4e70: 27 4e 4f 54 5f 53 54 41 52 54 45 44 27 2c 27 52  'NOT_STARTED','R
4e80: 45 4d 4f 54 45 48 4f 53 54 53 54 41 52 54 27 2c  EMOTEHOSTSTART',
4e90: 27 52 55 4e 4e 49 4e 47 27 2c 27 4b 49 4c 4c 52  'RUNNING','KILLR
4ea0: 45 51 27 29 20 41 4e 44 20 72 75 6e 5f 69 64 3d  EQ') AND run_id=
4eb0: 3f 3b 22 20 72 75 6e 2d 69 64 29 0a 20 20 20 20  ?;" run-id).    
4ec0: 72 65 73 29 29 0a 0a 3b 3b 20 4e 42 2f 2f 20 53  res))..;; NB// S
4ed0: 79 6e 63 20 74 68 69 73 20 77 69 74 68 20 72 75  ync this with ru
4ee0: 6e 73 3a 67 65 74 2d 74 65 73 74 2d 69 6e 66 6f  ns:get-test-info
4ef0: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74  .(define (db:get
4f00: 2d 74 65 73 74 2d 69 6e 66 6f 20 64 62 20 72 75  -test-info db ru
4f10: 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 69 74  n-id testname it
4f20: 65 6d 2d 70 61 74 68 29 0a 20 20 28 6c 65 74 20  em-path).  (let 
4f30: 28 28 72 65 73 20 23 66 29 29 0a 20 20 20 20 28  ((res #f)).    (
4f40: 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68  sqlite3:for-each
4f50: 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 64  -row.     (lambd
4f60: 61 20 28 69 64 20 72 75 6e 2d 69 64 20 74 65 73  a (id run-id tes
4f70: 74 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61 74  tname state stat
4f80: 75 73 20 65 76 65 6e 74 2d 74 69 6d 65 20 68 6f  us event-time ho
4f90: 73 74 20 63 70 75 6c 6f 61 64 20 64 69 73 6b 66  st cpuload diskf
4fa0: 72 65 65 20 75 6e 61 6d 65 20 72 75 6e 64 69 72  ree uname rundir
4fb0: 20 69 74 65 6d 2d 70 61 74 68 20 72 75 6e 5f 64   item-path run_d
4fc0: 75 72 61 74 69 6f 6e 20 66 69 6e 61 6c 5f 6c 6f  uration final_lo
4fd0: 67 66 20 63 6f 6d 6d 65 6e 74 20 29 0a 20 20 20  gf comment ).   
4fe0: 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28 76      (set! res (v
4ff0: 65 63 74 6f 72 20 69 64 20 72 75 6e 2d 69 64 20  ector id run-id 
5000: 74 65 73 74 6e 61 6d 65 20 73 74 61 74 65 20 73  testname state s
5010: 74 61 74 75 73 20 65 76 65 6e 74 2d 74 69 6d 65  tatus event-time
5020: 20 68 6f 73 74 20 63 70 75 6c 6f 61 64 20 64 69   host cpuload di
5030: 73 6b 66 72 65 65 20 75 6e 61 6d 65 20 72 75 6e  skfree uname run
5040: 64 69 72 20 69 74 65 6d 2d 70 61 74 68 20 72 75  dir item-path ru
5050: 6e 5f 64 75 72 61 74 69 6f 6e 20 66 69 6e 61 6c  n_duration final
5060: 5f 6c 6f 67 66 20 63 6f 6d 6d 65 6e 74 20 29 29  _logf comment ))
5070: 29 0a 20 20 20 20 20 64 62 20 0a 20 20 20 20 20  ).     db .     
5080: 22 53 45 4c 45 43 54 20 69 64 2c 72 75 6e 5f 69  "SELECT id,run_i
5090: 64 2c 74 65 73 74 6e 61 6d 65 2c 73 74 61 74 65  d,testname,state
50a0: 2c 73 74 61 74 75 73 2c 65 76 65 6e 74 5f 74 69  ,status,event_ti
50b0: 6d 65 2c 68 6f 73 74 2c 63 70 75 6c 6f 61 64 2c  me,host,cpuload,
50c0: 64 69 73 6b 66 72 65 65 2c 75 6e 61 6d 65 2c 72  diskfree,uname,r
50d0: 75 6e 64 69 72 2c 69 74 65 6d 5f 70 61 74 68 2c  undir,item_path,
50e0: 72 75 6e 5f 64 75 72 61 74 69 6f 6e 2c 66 69 6e  run_duration,fin
50f0: 61 6c 5f 6c 6f 67 66 2c 63 6f 6d 6d 65 6e 74 20  al_logf,comment 
5100: 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45  FROM tests WHERE
5110: 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65   run_id=? AND te
5120: 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65  stname=? AND ite
5130: 6d 5f 70 61 74 68 3d 3f 3b 22 0a 20 20 20 20 20  m_path=?;".     
5140: 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20  run-id testname 
5150: 69 74 65 6d 2d 70 61 74 68 29 0a 20 20 20 20 72  item-path).    r
5160: 65 73 29 29 0a 0a 3b 3b 20 47 65 74 20 74 65 73  es))..;; Get tes
5170: 74 20 64 61 74 61 20 75 73 69 6e 67 20 74 65 73  t data using tes
5180: 74 5f 69 64 0a 28 64 65 66 69 6e 65 20 28 64 62  t_id.(define (db
5190: 3a 67 65 74 2d 74 65 73 74 2d 64 61 74 61 2d 62  :get-test-data-b
51a0: 79 2d 69 64 20 64 62 20 74 65 73 74 2d 69 64 29  y-id db test-id)
51b0: 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20 23 66  .  (let ((res #f
51c0: 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a  )).    (sqlite3:
51d0: 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20  for-each-row.   
51e0: 20 20 28 6c 61 6d 62 64 61 20 28 69 64 20 72 75    (lambda (id ru
51f0: 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 73 74  n-id testname st
5200: 61 74 65 20 73 74 61 74 75 73 20 65 76 65 6e 74  ate status event
5210: 2d 74 69 6d 65 20 68 6f 73 74 20 63 70 75 6c 6f  -time host cpulo
5220: 61 64 20 64 69 73 6b 66 72 65 65 20 75 6e 61 6d  ad diskfree unam
5230: 65 20 72 75 6e 64 69 72 20 69 74 65 6d 2d 70 61  e rundir item-pa
5240: 74 68 20 72 75 6e 5f 64 75 72 61 74 69 6f 6e 20  th run_duration 
5250: 66 69 6e 61 6c 5f 6c 6f 67 66 20 63 6f 6d 6d 65  final_logf comme
5260: 6e 74 29 0a 20 20 20 20 20 20 20 28 73 65 74 21  nt).       (set!
5270: 20 72 65 73 20 28 76 65 63 74 6f 72 20 69 64 20   res (vector id 
5280: 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20  run-id testname 
5290: 73 74 61 74 65 20 73 74 61 74 75 73 20 65 76 65  state status eve
52a0: 6e 74 2d 74 69 6d 65 20 68 6f 73 74 20 63 70 75  nt-time host cpu
52b0: 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20 75 6e  load diskfree un
52c0: 61 6d 65 20 72 75 6e 64 69 72 20 69 74 65 6d 2d  ame rundir item-
52d0: 70 61 74 68 20 72 75 6e 5f 64 75 72 61 74 69 6f  path run_duratio
52e0: 6e 20 66 69 6e 61 6c 5f 6c 6f 67 66 20 63 6f 6d  n final_logf com
52f0: 6d 65 6e 74 29 29 29 0a 20 20 20 20 20 64 62 20  ment))).     db 
5300: 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20 69 64  .     "SELECT id
5310: 2c 72 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d 65  ,run_id,testname
5320: 2c 73 74 61 74 65 2c 73 74 61 74 75 73 2c 65 76  ,state,status,ev
5330: 65 6e 74 5f 74 69 6d 65 2c 68 6f 73 74 2c 63 70  ent_time,host,cp
5340: 75 6c 6f 61 64 2c 64 69 73 6b 66 72 65 65 2c 75  uload,diskfree,u
5350: 6e 61 6d 65 2c 72 75 6e 64 69 72 2c 69 74 65 6d  name,rundir,item
5360: 5f 70 61 74 68 2c 72 75 6e 5f 64 75 72 61 74 69  _path,run_durati
5370: 6f 6e 2c 66 69 6e 61 6c 5f 6c 6f 67 66 2c 63 6f  on,final_logf,co
5380: 6d 6d 65 6e 74 20 46 52 4f 4d 20 74 65 73 74 73  mment FROM tests
5390: 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 0a 20 20   WHERE id=?;".  
53a0: 20 20 20 74 65 73 74 2d 69 64 29 0a 20 20 20 20     test-id).    
53b0: 72 65 73 29 29 0a 0a 0a 28 64 65 66 69 6e 65 20  res))...(define 
53c0: 28 64 62 3a 74 65 73 74 2d 73 65 74 2d 63 6f 6d  (db:test-set-com
53d0: 6d 65 6e 74 20 64 62 20 72 75 6e 2d 69 64 20 74  ment db run-id t
53e0: 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74  estname item-pat
53f0: 68 20 63 6f 6d 6d 65 6e 74 29 0a 20 20 28 73 71  h comment).  (sq
5400: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 0a 20  lite3:execute . 
5410: 20 20 64 62 20 0a 20 20 20 22 55 50 44 41 54 45    db .   "UPDATE
5420: 20 74 65 73 74 73 20 53 45 54 20 63 6f 6d 6d 65   tests SET comme
5430: 6e 74 3d 3f 20 57 48 45 52 45 20 72 75 6e 5f 69  nt=? WHERE run_i
5440: 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65  d=? AND testname
5450: 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68  =? AND item_path
5460: 3d 3f 3b 22 0a 20 20 20 63 6f 6d 6d 65 6e 74 20  =?;".   comment 
5470: 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20  run-id testname 
5480: 69 74 65 6d 2d 70 61 74 68 29 29 0a 0a 3b 3b 0a  item-path))..;;.
5490: 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74  (define (db:test
54a0: 2d 73 65 74 2d 72 75 6e 64 69 72 21 20 64 62 20  -set-rundir! db 
54b0: 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20  run-id testname 
54c0: 69 74 65 6d 2d 70 61 74 68 20 72 75 6e 64 69 72  item-path rundir
54d0: 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65  ).  (sqlite3:exe
54e0: 63 75 74 65 20 0a 20 20 20 64 62 20 0a 20 20 20  cute .   db .   
54f0: 22 55 50 44 41 54 45 20 74 65 73 74 73 20 53 45  "UPDATE tests SE
5500: 54 20 72 75 6e 64 69 72 3d 3f 20 57 48 45 52 45  T rundir=? WHERE
5510: 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65   run_id=? AND te
5520: 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65  stname=? AND ite
5530: 6d 5f 70 61 74 68 3d 3f 3b 22 0a 20 20 20 72 75  m_path=?;".   ru
5540: 6e 64 69 72 20 72 75 6e 2d 69 64 20 74 65 73 74  ndir run-id test
5550: 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 29  name item-path))
5560: 0a 0a 3b 3b 20 4d 69 73 63 2e 20 74 65 73 74 20  ..;; Misc. test 
5570: 72 65 6c 61 74 65 64 20 71 75 65 72 69 65 73 0a  related queries.
5580: 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74  (define (db:test
5590: 2d 67 65 74 2d 70 61 74 68 73 2d 6d 61 74 63 68  -get-paths-match
55a0: 69 6e 67 20 64 62 20 6b 65 79 6e 61 6d 65 73 20  ing db keynames 
55b0: 74 61 72 67 65 74 29 0a 20 20 28 6c 65 74 2a 20  target).  (let* 
55c0: 28 28 72 65 73 20 27 28 29 29 0a 09 20 28 69 74  ((res '()).. (it
55d0: 65 6d 70 61 74 74 20 20 20 28 69 66 20 28 61 72  empatt   (if (ar
55e0: 67 73 3a 67 65 74 2d 61 72 67 20 22 2d 69 74 65  gs:get-arg "-ite
55f0: 6d 70 61 74 74 22 29 28 61 72 67 73 3a 67 65 74  mpatt")(args:get
5600: 2d 61 72 67 20 22 2d 69 74 65 6d 70 61 74 74 22  -arg "-itempatt"
5610: 29 20 22 25 22 29 29 0a 09 20 28 74 65 73 74 70  ) "%")).. (testp
5620: 61 74 74 20 20 20 28 69 66 20 28 61 72 67 73 3a  att   (if (args:
5630: 67 65 74 2d 61 72 67 20 22 2d 74 65 73 74 70 61  get-arg "-testpa
5640: 74 74 22 29 28 61 72 67 73 3a 67 65 74 2d 61 72  tt")(args:get-ar
5650: 67 20 22 2d 74 65 73 74 70 61 74 74 22 29 20 22  g "-testpatt") "
5660: 25 22 29 29 0a 09 20 28 73 74 61 74 65 70 61 74  %")).. (statepat
5670: 74 20 20 28 69 66 20 28 61 72 67 73 3a 67 65 74  t  (if (args:get
5680: 2d 61 72 67 20 22 3a 73 74 61 74 65 22 29 20 20  -arg ":state")  
5690: 20 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22   (args:get-arg "
56a0: 3a 73 74 61 74 65 22 29 20 20 20 20 22 25 22 29  :state")    "%")
56b0: 29 0a 09 20 28 73 74 61 74 75 73 70 61 74 74 20  ).. (statuspatt 
56c0: 28 69 66 20 28 61 72 67 73 3a 67 65 74 2d 61 72  (if (args:get-ar
56d0: 67 20 22 3a 73 74 61 74 75 73 22 29 20 20 28 61  g ":status")  (a
56e0: 72 67 73 3a 67 65 74 2d 61 72 67 20 22 3a 73 74  rgs:get-arg ":st
56f0: 61 74 75 73 22 29 20 20 20 22 25 22 29 29 0a 09  atus")   "%"))..
5700: 20 28 72 75 6e 6e 61 6d 65 20 20 20 20 28 69 66   (runname    (if
5710: 20 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22   (args:get-arg "
5720: 3a 72 75 6e 6e 61 6d 65 22 29 20 28 61 72 67 73  :runname") (args
5730: 3a 67 65 74 2d 61 72 67 20 22 3a 72 75 6e 6e 61  :get-arg ":runna
5740: 6d 65 22 29 20 20 22 25 22 29 29 0a 09 20 28 6b  me")  "%")).. (k
5750: 65 79 73 74 72 20 28 73 74 72 69 6e 67 2d 69 6e  eystr (string-in
5760: 74 65 72 73 70 65 72 73 65 20 0a 09 09 20 20 28  tersperse ...  (
5770: 6d 61 70 20 28 6c 61 6d 62 64 61 20 28 6b 65 79  map (lambda (key
5780: 20 76 61 6c 29 0a 09 09 09 20 28 63 6f 6e 63 20   val).... (conc 
5790: 22 72 2e 22 20 6b 65 79 20 22 20 6c 69 6b 65 20  "r." key " like 
57a0: 27 22 20 76 61 6c 20 22 27 22 29 29 0a 09 09 20  '" val "'"))... 
57b0: 20 20 20 20 20 20 6b 65 79 6e 61 6d 65 73 20 0a        keynames .
57c0: 09 09 20 20 20 20 20 20 20 28 73 74 72 69 6e 67  ..       (string
57d0: 2d 73 70 6c 69 74 20 74 61 72 67 65 74 20 22 2f  -split target "/
57e0: 22 29 29 0a 09 09 20 20 22 20 41 4e 44 20 22 29  "))...  " AND ")
57f0: 29 0a 09 20 28 71 72 79 73 74 72 20 28 63 6f 6e  ).. (qrystr (con
5800: 63 20 22 53 45 4c 45 43 54 20 74 2e 72 75 6e 64  c "SELECT t.rund
5810: 69 72 20 46 52 4f 4d 20 74 65 73 74 73 20 41 53  ir FROM tests AS
5820: 20 74 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 72 75   t INNER JOIN ru
5830: 6e 73 20 41 53 20 72 20 4f 4e 20 74 2e 72 75 6e  ns AS r ON t.run
5840: 5f 69 64 3d 72 2e 69 64 20 57 48 45 52 45 20 22  _id=r.id WHERE "
5850: 0a 09 09 20 20 20 20 20 20 20 6b 65 79 73 74 72  ...       keystr
5860: 20 22 20 41 4e 44 20 72 2e 72 75 6e 6e 61 6d 65   " AND r.runname
5870: 20 4c 49 4b 45 20 27 22 20 72 75 6e 6e 61 6d 65   LIKE '" runname
5880: 20 22 27 20 41 4e 44 20 69 74 65 6d 5f 70 61 74   "' AND item_pat
5890: 68 20 4c 49 4b 45 20 27 22 20 69 74 65 6d 70 61  h LIKE '" itempa
58a0: 74 74 20 22 27 20 41 4e 44 20 74 65 73 74 6e 61  tt "' AND testna
58b0: 6d 65 20 4c 49 4b 45 20 27 22 0a 09 09 20 20 20  me LIKE '"...   
58c0: 20 20 20 20 74 65 73 74 70 61 74 74 20 22 27 20      testpatt "' 
58d0: 41 4e 44 20 74 2e 73 74 61 74 65 20 4c 49 4b 45  AND t.state LIKE
58e0: 20 27 22 20 73 74 61 74 65 70 61 74 74 20 22 27   '" statepatt "'
58f0: 20 41 4e 44 20 74 2e 73 74 61 74 75 73 20 4c 49   AND t.status LI
5900: 4b 45 20 27 22 20 73 74 61 74 75 73 70 61 74 74  KE '" statuspatt
5910: 20 0a 09 09 20 20 20 20 20 20 20 22 27 4f 52 44   ...       "'ORD
5920: 45 52 20 42 59 20 74 2e 65 76 65 6e 74 5f 74 69  ER BY t.event_ti
5930: 6d 65 20 41 53 43 3b 22 29 29 29 0a 20 20 20 20  me ASC;"))).    
5940: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 33 20 22  (debug:print 3 "
5950: 71 72 79 73 74 72 3a 20 22 20 71 72 79 73 74 72  qrystr: " qrystr
5960: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66  ).    (sqlite3:f
5970: 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20 20  or-each-row .   
5980: 20 20 28 6c 61 6d 62 64 61 20 28 70 29 0a 20 20    (lambda (p).  
5990: 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28       (set! res (
59a0: 63 6f 6e 73 20 70 20 72 65 73 29 29 29 0a 20 20  cons p res))).  
59b0: 20 20 20 64 62 20 0a 20 20 20 20 20 71 72 79 73     db .     qrys
59c0: 74 72 29 0a 20 20 20 20 72 65 73 29 29 0a 0a 0a  tr).    res))...
59d0: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
59e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
59f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5a00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5a10: 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 54 65 73 74  ========.;; Test
5a20: 73 20 6d 65 74 61 20 64 61 74 61 0a 3b 3b 3d 3d  s meta data.;;==
5a30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5a40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5a50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5a60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5a70: 3d 3d 3d 3d 0a 0a 3b 3b 20 72 65 61 64 20 74 68  ====..;; read th
5a80: 65 20 72 65 63 6f 72 64 20 67 69 76 65 6e 20 61  e record given a
5a90: 20 74 65 73 74 6e 61 6d 65 0a 28 64 65 66 69 6e   testname.(defin
5aa0: 65 20 28 64 62 3a 74 65 73 74 6d 65 74 61 2d 67  e (db:testmeta-g
5ab0: 65 74 2d 72 65 63 6f 72 64 20 64 62 20 74 65 73  et-record db tes
5ac0: 74 6e 61 6d 65 29 0a 20 20 28 6c 65 74 20 28 28  tname).  (let ((
5ad0: 72 65 73 20 23 66 29 29 0a 20 20 20 20 28 73 71  res #f)).    (sq
5ae0: 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72  lite3:for-each-r
5af0: 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20  ow.     (lambda 
5b00: 28 69 64 20 74 65 73 74 6e 61 6d 65 20 61 75 74  (id testname aut
5b10: 68 6f 72 20 6f 77 6e 65 72 20 64 65 73 63 72 69  hor owner descri
5b20: 70 74 69 6f 6e 20 72 65 76 69 65 77 65 64 20 69  ption reviewed i
5b30: 74 65 72 61 74 65 64 20 61 76 67 5f 72 75 6e 74  terated avg_runt
5b40: 69 6d 65 20 61 76 67 5f 64 69 73 6b 20 74 61 67  ime avg_disk tag
5b50: 73 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20  s).       (set! 
5b60: 72 65 73 20 28 76 65 63 74 6f 72 20 69 64 20 74  res (vector id t
5b70: 65 73 74 6e 61 6d 65 20 61 75 74 68 6f 72 20 6f  estname author o
5b80: 77 6e 65 72 20 64 65 73 63 72 69 70 74 69 6f 6e  wner description
5b90: 20 72 65 76 69 65 77 65 64 20 69 74 65 72 61 74   reviewed iterat
5ba0: 65 64 20 61 76 67 5f 72 75 6e 74 69 6d 65 20 61  ed avg_runtime a
5bb0: 76 67 5f 64 69 73 6b 20 74 61 67 73 29 29 29 0a  vg_disk tags))).
5bc0: 20 20 20 20 20 64 62 20 22 53 45 4c 45 43 54 20       db "SELECT 
5bd0: 69 64 2c 74 65 73 74 6e 61 6d 65 2c 61 75 74 68  id,testname,auth
5be0: 6f 72 2c 6f 77 6e 65 72 2c 64 65 73 63 72 69 70  or,owner,descrip
5bf0: 74 69 6f 6e 2c 72 65 76 69 65 77 65 64 2c 69 74  tion,reviewed,it
5c00: 65 72 61 74 65 64 2c 61 76 67 5f 72 75 6e 74 69  erated,avg_runti
5c10: 6d 65 2c 61 76 67 5f 64 69 73 6b 2c 74 61 67 73  me,avg_disk,tags
5c20: 20 46 52 4f 4d 20 74 65 73 74 5f 6d 65 74 61 20   FROM test_meta 
5c30: 57 48 45 52 45 20 74 65 73 74 6e 61 6d 65 3d 3f  WHERE testname=?
5c40: 3b 22 0a 20 20 20 20 20 74 65 73 74 6e 61 6d 65  ;".     testname
5c50: 29 0a 20 20 20 20 72 65 73 29 29 0a 0a 3b 3b 20  ).    res))..;; 
5c60: 63 72 65 61 74 65 20 61 20 6e 65 77 20 72 65 63  create a new rec
5c70: 6f 72 64 20 66 6f 72 20 61 20 67 69 76 65 6e 20  ord for a given 
5c80: 74 65 73 74 6e 61 6d 65 0a 28 64 65 66 69 6e 65  testname.(define
5c90: 20 28 64 62 3a 74 65 73 74 6d 65 74 61 2d 61 64   (db:testmeta-ad
5ca0: 64 2d 72 65 63 6f 72 64 20 64 62 20 74 65 73 74  d-record db test
5cb0: 6e 61 6d 65 29 0a 20 20 28 73 71 6c 69 74 65 33  name).  (sqlite3
5cc0: 3a 65 78 65 63 75 74 65 20 64 62 20 22 49 4e 53  :execute db "INS
5cd0: 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e  ERT OR IGNORE IN
5ce0: 54 4f 20 74 65 73 74 5f 6d 65 74 61 20 28 74 65  TO test_meta (te
5cf0: 73 74 6e 61 6d 65 2c 61 75 74 68 6f 72 2c 6f 77  stname,author,ow
5d00: 6e 65 72 2c 64 65 73 63 72 69 70 74 69 6f 6e 2c  ner,description,
5d10: 72 65 76 69 65 77 65 64 2c 69 74 65 72 61 74 65  reviewed,iterate
5d20: 64 2c 61 76 67 5f 72 75 6e 74 69 6d 65 2c 61 76  d,avg_runtime,av
5d30: 67 5f 64 69 73 6b 2c 74 61 67 73 29 20 56 41 4c  g_disk,tags) VAL
5d40: 55 45 53 20 28 3f 2c 27 27 2c 27 27 2c 27 27 2c  UES (?,'','','',
5d50: 27 27 2c 27 27 2c 27 27 2c 27 27 2c 27 27 29 3b  '','','','','');
5d60: 22 20 74 65 73 74 6e 61 6d 65 29 29 0a 0a 3b 3b  " testname))..;;
5d70: 20 75 70 64 61 74 65 20 6f 6e 65 20 6f 66 20 74   update one of t
5d80: 68 65 20 74 65 73 74 6d 65 74 61 20 66 69 65 6c  he testmeta fiel
5d90: 64 73 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 74  ds.(define (db:t
5da0: 65 73 74 6d 65 74 61 2d 75 70 64 61 74 65 2d 66  estmeta-update-f
5db0: 69 65 6c 64 20 64 62 20 74 65 73 74 6e 61 6d 65  ield db testname
5dc0: 20 66 69 65 6c 64 20 76 61 6c 75 65 29 0a 20 20   field value).  
5dd0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
5de0: 20 64 62 20 28 63 6f 6e 63 20 22 55 50 44 41 54   db (conc "UPDAT
5df0: 45 20 74 65 73 74 5f 6d 65 74 61 20 53 45 54 20  E test_meta SET 
5e00: 22 20 66 69 65 6c 64 20 22 3d 3f 20 57 48 45 52  " field "=? WHER
5e10: 45 20 74 65 73 74 6e 61 6d 65 3d 3f 3b 22 29 20  E testname=?;") 
5e20: 76 61 6c 75 65 20 74 65 73 74 6e 61 6d 65 29 29  value testname))
5e30: 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ..;;============
5e40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5e50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5e60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5e70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 54 20  ==========.;; T 
5e80: 45 20 53 20 54 20 20 20 44 20 41 20 54 20 41 20  E S T   D A T A 
5e90: 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  .;;=============
5ea0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5eb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5ec0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5ed0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65 66 69  =========..(defi
5ee0: 6e 65 20 28 64 62 3a 63 73 76 2d 3e 74 65 73 74  ne (db:csv->test
5ef0: 2d 64 61 74 61 20 64 62 20 74 65 73 74 2d 69 64  -data db test-id
5f00: 20 63 73 76 64 61 74 61 29 0a 20 20 28 64 65 62   csvdata).  (deb
5f10: 75 67 3a 70 72 69 6e 74 20 34 20 22 74 65 73 74  ug:print 4 "test
5f20: 2d 69 64 20 22 20 74 65 73 74 2d 69 64 20 22 2c  -id " test-id ",
5f30: 20 63 73 76 64 61 74 61 3a 20 22 20 63 73 76 64   csvdata: " csvd
5f40: 61 74 61 29 0a 20 20 28 6c 65 74 20 28 28 63 73  ata).  (let ((cs
5f50: 76 6c 69 73 74 20 28 63 73 76 2d 3e 6c 69 73 74  vlist (csv->list
5f60: 20 28 6d 61 6b 65 2d 63 73 76 2d 72 65 61 64 65   (make-csv-reade
5f70: 72 0a 09 09 09 20 20 20 20 20 28 6f 70 65 6e 2d  r....     (open-
5f80: 69 6e 70 75 74 2d 73 74 72 69 6e 67 20 63 73 76  input-string csv
5f90: 64 61 74 61 29 0a 09 09 09 20 20 20 20 20 27 28  data)....     '(
5fa0: 28 73 74 72 69 70 2d 6c 65 61 64 69 6e 67 2d 77  (strip-leading-w
5fb0: 68 69 74 65 73 70 61 63 65 3f 20 23 74 29 0a 09  hitespace? #t)..
5fc0: 09 09 20 20 20 20 20 20 20 28 73 74 72 69 70 2d  ..       (strip-
5fd0: 74 72 61 69 6c 69 6e 67 2d 77 68 69 74 65 73 70  trailing-whitesp
5fe0: 61 63 65 3f 20 23 74 29 29 20 29 29 29 29 20 3b  ace? #t)) )))) ;
5ff0: 3b 20 28 63 73 76 2d 3e 6c 69 73 74 20 63 73 76  ; (csv->list csv
6000: 64 61 74 61 29 29 29 0a 20 20 20 20 28 66 6f 72  data))).    (for
6010: 2d 65 61 63 68 20 0a 20 20 20 20 20 28 6c 61 6d  -each .     (lam
6020: 62 64 61 20 28 63 73 76 72 6f 77 29 0a 20 20 20  bda (csvrow).   
6030: 20 20 20 20 28 6c 65 74 2a 20 28 28 70 61 64 64      (let* ((padd
6040: 65 64 2d 72 6f 77 20 20 28 74 61 6b 65 20 28 61  ed-row  (take (a
6050: 70 70 65 6e 64 20 63 73 76 72 6f 77 20 28 6c 69  ppend csvrow (li
6060: 73 74 20 23 66 20 23 66 20 23 66 20 23 66 20 23  st #f #f #f #f #
6070: 66 20 23 66 20 23 66 20 23 66 20 23 66 29 29 20  f #f #f #f #f)) 
6080: 39 29 29 0a 09 20 20 20 20 20 20 28 63 61 74 65  9))..      (cate
6090: 67 6f 72 79 20 20 20 20 28 6c 69 73 74 2d 72 65  gory    (list-re
60a0: 66 20 70 61 64 64 65 64 2d 72 6f 77 20 30 29 29  f padded-row 0))
60b0: 0a 09 20 20 20 20 20 20 28 76 61 72 69 61 62 6c  ..      (variabl
60c0: 65 20 20 20 20 28 6c 69 73 74 2d 72 65 66 20 70  e    (list-ref p
60d0: 61 64 64 65 64 2d 72 6f 77 20 31 29 29 0a 09 20  added-row 1)).. 
60e0: 20 20 20 20 20 28 76 61 6c 75 65 20 20 20 20 20       (value     
60f0: 20 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 2d 69    (any->number-i
6100: 66 2d 70 6f 73 73 69 62 6c 65 20 28 6c 69 73 74  f-possible (list
6110: 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20  -ref padded-row 
6120: 32 29 29 29 0a 09 20 20 20 20 20 20 28 65 78 70  2)))..      (exp
6130: 65 63 74 65 64 20 20 20 20 28 61 6e 79 2d 3e 6e  ected    (any->n
6140: 75 6d 62 65 72 2d 69 66 2d 70 6f 73 73 69 62 6c  umber-if-possibl
6150: 65 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64 64  e (list-ref padd
6160: 65 64 2d 72 6f 77 20 33 29 29 29 0a 09 20 20 20  ed-row 3)))..   
6170: 20 20 20 28 74 6f 6c 20 20 20 20 20 20 20 20 20     (tol         
6180: 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 2d 69 66 2d  (any->number-if-
6190: 70 6f 73 73 69 62 6c 65 20 28 6c 69 73 74 2d 72  possible (list-r
61a0: 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20 34 29  ef padded-row 4)
61b0: 29 29 20 3b 3b 20 3e 2c 20 3c 2c 20 3e 3d 2c 20  )) ;; >, <, >=, 
61c0: 3c 3d 2c 20 6f 72 20 61 20 6e 75 6d 62 65 72 0a  <=, or a number.
61d0: 09 20 20 20 20 20 20 28 75 6e 69 74 73 20 20 20  .      (units   
61e0: 20 20 20 20 28 6c 69 73 74 2d 72 65 66 20 70 61      (list-ref pa
61f0: 64 64 65 64 2d 72 6f 77 20 35 29 29 0a 09 20 20  dded-row 5))..  
6200: 20 20 20 20 28 63 6f 6d 6d 65 6e 74 20 20 20 20      (comment    
6210: 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65   (list-ref padde
6220: 64 2d 72 6f 77 20 36 29 29 0a 09 20 20 20 20 20  d-row 6))..     
6230: 20 28 73 74 61 74 75 73 20 20 20 20 20 20 28 6c   (status      (l
6240: 65 74 20 28 28 73 20 28 6c 69 73 74 2d 72 65 66  et ((s (list-ref
6250: 20 70 61 64 64 65 64 2d 72 6f 77 20 37 29 29 29   padded-row 7)))
6260: 0a 09 09 09 20 20 20 20 20 28 69 66 20 28 61 6e  ....     (if (an
6270: 64 20 28 73 74 72 69 6e 67 3f 20 73 29 28 6f 72  d (string? s)(or
6280: 20 28 73 74 72 69 6e 67 2d 6d 61 74 63 68 20 28   (string-match (
6290: 72 65 67 65 78 70 20 22 5e 5c 5c 73 2a 24 22 29  regexp "^\\s*$")
62a0: 20 73 29 0a 09 09 09 09 09 09 20 20 20 20 20 28   s).......     (
62b0: 73 74 72 69 6e 67 2d 6d 61 74 63 68 20 28 72 65  string-match (re
62c0: 67 65 78 70 20 22 5e 6e 2f 61 24 22 29 20 73 29  gexp "^n/a$") s)
62d0: 29 29 0a 09 09 09 09 20 23 66 0a 09 09 09 09 20  ))..... #f..... 
62e0: 73 29 29 29 20 3b 3b 20 69 66 20 73 70 65 63 69  s))) ;; if speci
62f0: 66 69 65 64 20 6f 6e 20 74 68 65 20 69 6e 70 75  fied on the inpu
6300: 74 20 74 68 65 6e 20 75 73 65 2c 20 65 6c 73 65  t then use, else
6310: 20 63 61 6c 63 75 6c 61 74 65 0a 09 20 20 20 20   calculate..    
6320: 20 20 28 74 79 70 65 20 20 20 20 20 20 20 20 28    (type        (
6330: 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d  list-ref padded-
6340: 72 6f 77 20 38 29 29 29 0a 09 20 3b 3b 20 6c 6f  row 8))).. ;; lo
6350: 6f 6b 20 75 70 20 65 78 70 65 63 74 65 64 2c 74  ok up expected,t
6360: 6f 6c 2c 75 6e 69 74 73 20 66 72 6f 6d 20 70 72  ol,units from pr
6370: 65 76 69 6f 75 73 20 62 65 73 74 20 66 69 74 20  evious best fit 
6380: 74 65 73 74 20 69 66 20 74 68 65 79 20 61 72 65  test if they are
6390: 20 61 6c 6c 20 65 69 74 68 65 72 20 23 66 20 6f   all either #f o
63a0: 72 20 27 27 0a 09 20 28 64 65 62 75 67 3a 70 72  r ''.. (debug:pr
63b0: 69 6e 74 20 34 20 22 42 45 46 4f 52 45 3a 20 63  int 4 "BEFORE: c
63c0: 61 74 65 67 6f 72 79 3a 20 22 20 63 61 74 65 67  ategory: " categ
63d0: 6f 72 79 20 22 20 76 61 72 69 61 62 6c 65 3a 20  ory " variable: 
63e0: 22 20 76 61 72 69 61 62 6c 65 20 22 20 76 61 6c  " variable " val
63f0: 75 65 3a 20 22 20 76 61 6c 75 65 20 0a 09 09 20  ue: " value ... 
6400: 20 20 20 20 20 22 2c 20 65 78 70 65 63 74 65 64       ", expected
6410: 3a 20 22 20 65 78 70 65 63 74 65 64 20 22 20 74  : " expected " t
6420: 6f 6c 3a 20 22 20 74 6f 6c 20 22 20 75 6e 69 74  ol: " tol " unit
6430: 73 3a 20 22 20 75 6e 69 74 73 20 22 20 73 74 61  s: " units " sta
6440: 74 75 73 3a 20 22 20 73 74 61 74 75 73 20 22 20  tus: " status " 
6450: 63 6f 6d 6d 65 6e 74 3a 20 22 20 63 6f 6d 6d 65  comment: " comme
6460: 6e 74 20 22 20 74 79 70 65 3a 20 22 20 74 79 70  nt " type: " typ
6470: 65 29 0a 0a 09 20 28 69 66 20 28 61 6e 64 20 28  e)... (if (and (
6480: 6f 72 20 28 6e 6f 74 20 65 78 70 65 63 74 65 64  or (not expected
6490: 29 28 65 71 75 61 6c 3f 20 65 78 70 65 63 74 65  )(equal? expecte
64a0: 64 20 22 22 29 29 0a 09 09 20 20 28 6f 72 20 28  d ""))...  (or (
64b0: 6e 6f 74 20 74 6f 6c 29 20 20 20 20 20 28 65 71  not tol)     (eq
64c0: 75 61 6c 3f 20 65 78 70 65 63 74 65 64 20 22 22  ual? expected ""
64d0: 29 29 0a 09 09 20 20 28 6f 72 20 28 6e 6f 74 20  ))...  (or (not 
64e0: 75 6e 69 74 73 29 20 20 20 28 65 71 75 61 6c 3f  units)   (equal?
64f0: 20 65 78 70 65 63 74 65 64 20 22 22 29 29 29 0a   expected ""))).
6500: 09 20 20 20 20 20 28 6c 65 74 2d 76 61 6c 75 65  .     (let-value
6510: 73 20 28 28 28 6e 65 77 2d 65 78 70 65 63 74 65  s (((new-expecte
6520: 64 20 6e 65 77 2d 74 6f 6c 20 6e 65 77 2d 75 6e  d new-tol new-un
6530: 69 74 73 29 28 64 62 3a 67 65 74 2d 70 72 65 76  its)(db:get-prev
6540: 2d 74 6f 6c 2d 66 6f 72 2d 74 65 73 74 20 64 62  -tol-for-test db
6550: 20 74 65 73 74 2d 69 64 20 63 61 74 65 67 6f 72   test-id categor
6560: 79 20 76 61 72 69 61 62 6c 65 29 29 29 0a 09 09  y variable)))...
6570: 09 20 28 73 65 74 21 20 65 78 70 65 63 74 65 64  . (set! expected
6580: 20 6e 65 77 2d 65 78 70 65 63 74 65 64 29 0a 09   new-expected)..
6590: 09 09 20 28 73 65 74 21 20 74 6f 6c 20 20 20 20  .. (set! tol    
65a0: 20 20 6e 65 77 2d 74 6f 6c 29 0a 09 09 09 20 28    new-tol).... (
65b0: 73 65 74 21 20 75 6e 69 74 73 20 20 20 20 6e 65  set! units    ne
65c0: 77 2d 75 6e 69 74 73 29 29 29 0a 0a 09 20 28 64  w-units)))... (d
65d0: 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22 41 46  ebug:print 4 "AF
65e0: 54 45 52 3a 20 20 63 61 74 65 67 6f 72 79 3a 20  TER:  category: 
65f0: 22 20 63 61 74 65 67 6f 72 79 20 22 20 76 61 72  " category " var
6600: 69 61 62 6c 65 3a 20 22 20 76 61 72 69 61 62 6c  iable: " variabl
6610: 65 20 22 20 76 61 6c 75 65 3a 20 22 20 76 61 6c  e " value: " val
6620: 75 65 20 0a 09 09 20 20 20 20 20 20 22 2c 20 65  ue ...      ", e
6630: 78 70 65 63 74 65 64 3a 20 22 20 65 78 70 65 63  xpected: " expec
6640: 74 65 64 20 22 20 74 6f 6c 3a 20 22 20 74 6f 6c  ted " tol: " tol
6650: 20 22 20 75 6e 69 74 73 3a 20 22 20 75 6e 69 74   " units: " unit
6660: 73 20 22 20 73 74 61 74 75 73 3a 20 22 20 73 74  s " status: " st
6670: 61 74 75 73 20 22 20 63 6f 6d 6d 65 6e 74 3a 20  atus " comment: 
6680: 22 20 63 6f 6d 6d 65 6e 74 29 0a 09 20 3b 3b 20  " comment).. ;; 
6690: 63 61 6c 63 75 6c 61 74 65 20 73 74 61 74 75 73  calculate status
66a0: 20 69 66 20 4e 4f 54 20 73 70 65 63 69 66 69 65   if NOT specifie
66b0: 64 0a 09 20 28 69 66 20 28 61 6e 64 20 28 6e 6f  d.. (if (and (no
66c0: 74 20 73 74 61 74 75 73 29 28 6e 75 6d 62 65 72  t status)(number
66d0: 3f 20 65 78 70 65 63 74 65 64 29 28 6e 75 6d 62  ? expected)(numb
66e0: 65 72 3f 20 76 61 6c 75 65 29 29 20 3b 3b 20 6e  er? value)) ;; n
66f0: 65 65 64 20 65 78 70 65 63 74 65 64 20 61 6e 64  eed expected and
6700: 20 76 61 6c 75 65 20 74 6f 20 62 65 20 6e 75 6d   value to be num
6710: 62 65 72 73 0a 09 20 20 20 20 20 28 69 66 20 28  bers..     (if (
6720: 6e 75 6d 62 65 72 3f 20 74 6f 6c 29 20 3b 3b 20  number? tol) ;; 
6730: 69 66 20 74 6f 6c 20 69 73 20 61 20 6e 75 6d 62  if tol is a numb
6740: 65 72 20 74 68 65 6e 20 77 65 20 64 6f 20 74 68  er then we do th
6750: 65 20 73 74 61 6e 64 61 72 64 20 63 6f 6d 70 61  e standard compa
6760: 72 69 73 6f 6e 0a 09 09 20 28 6c 65 74 2a 20 28  rison... (let* (
6770: 28 6d 61 78 2d 76 61 6c 20 28 2b 20 65 78 70 65  (max-val (+ expe
6780: 63 74 65 64 20 74 6f 6c 29 29 0a 09 09 09 28 6d  cted tol))....(m
6790: 69 6e 2d 76 61 6c 20 28 2d 20 65 78 70 65 63 74  in-val (- expect
67a0: 65 64 20 74 6f 6c 29 29 0a 09 09 09 28 72 65 73  ed tol))....(res
67b0: 75 6c 74 20 20 28 61 6e 64 20 28 3e 3d 20 20 76  ult  (and (>=  v
67c0: 61 6c 75 65 20 6d 69 6e 2d 76 61 6c 29 28 3c 3d  alue min-val)(<=
67d0: 20 76 61 6c 75 65 20 6d 61 78 2d 76 61 6c 29 29   value max-val))
67e0: 29 29 0a 09 09 20 20 20 28 64 65 62 75 67 3a 70  ))...   (debug:p
67f0: 72 69 6e 74 20 34 20 22 6d 61 78 2d 76 61 6c 3a  rint 4 "max-val:
6800: 20 22 20 6d 61 78 2d 76 61 6c 20 22 20 6d 69 6e   " max-val " min
6810: 2d 76 61 6c 3a 20 22 20 6d 69 6e 2d 76 61 6c 20  -val: " min-val 
6820: 22 20 72 65 73 75 6c 74 3a 20 22 20 72 65 73 75  " result: " resu
6830: 6c 74 29 0a 09 09 20 20 20 28 73 65 74 21 20 73  lt)...   (set! s
6840: 74 61 74 75 73 20 28 69 66 20 72 65 73 75 6c 74  tatus (if result
6850: 20 22 70 61 73 73 22 20 22 66 61 69 6c 22 29 29   "pass" "fail"))
6860: 29 0a 09 09 20 28 73 65 74 21 20 73 74 61 74 75  )... (set! statu
6870: 73 20 3b 3b 20 4e 42 2f 2f 20 6e 65 65 64 20 74  s ;; NB// need t
6880: 6f 20 61 73 73 65 73 73 20 65 61 63 68 20 6f 6e  o assess each on
6890: 65 20 28 69 2e 65 2e 20 6e 6f 74 20 72 65 74 75  e (i.e. not retu
68a0: 72 6e 20 6f 70 65 72 61 74 6f 72 20 73 69 6e 63  rn operator sinc
68b0: 65 20 6e 65 65 64 20 74 6f 20 61 63 74 20 69 66  e need to act if
68c0: 20 6e 6f 74 20 76 61 6c 69 64 20 6f 70 2e 0a 09   not valid op...
68d0: 09 20 20 20 20 20 20 20 28 63 61 73 65 20 28 73  .       (case (s
68e0: 74 72 69 6e 67 2d 3e 73 79 6d 62 6f 6c 20 74 6f  tring->symbol to
68f0: 6c 29 20 3b 3b 20 74 6f 6c 20 73 68 6f 75 6c 64  l) ;; tol should
6900: 20 62 65 20 3e 2c 20 3c 2c 20 3e 3d 2c 20 3c 3d   be >, <, >=, <=
6910: 0a 09 09 09 20 28 28 3e 29 20 20 28 69 66 20 28  .... ((>)  (if (
6920: 3e 20 20 76 61 6c 75 65 20 65 78 70 65 63 74 65  >  value expecte
6930: 64 29 20 22 70 61 73 73 22 20 22 66 61 69 6c 22  d) "pass" "fail"
6940: 29 29 0a 09 09 09 20 28 28 3c 29 20 20 28 69 66  )).... ((<)  (if
6950: 20 28 3c 20 20 76 61 6c 75 65 20 65 78 70 65 63   (<  value expec
6960: 74 65 64 29 20 22 70 61 73 73 22 20 22 66 61 69  ted) "pass" "fai
6970: 6c 22 29 29 0a 09 09 09 20 28 28 3e 3d 29 20 28  l")).... ((>=) (
6980: 69 66 20 28 3e 3d 20 76 61 6c 75 65 20 65 78 70  if (>= value exp
6990: 65 63 74 65 64 29 20 22 70 61 73 73 22 20 22 66  ected) "pass" "f
69a0: 61 69 6c 22 29 29 0a 09 09 09 20 28 28 3c 3d 29  ail")).... ((<=)
69b0: 20 28 69 66 20 28 3c 3d 20 76 61 6c 75 65 20 65   (if (<= value e
69c0: 78 70 65 63 74 65 64 29 20 22 70 61 73 73 22 20  xpected) "pass" 
69d0: 22 66 61 69 6c 22 29 29 0a 09 09 09 20 28 65 6c  "fail")).... (el
69e0: 73 65 20 28 63 6f 6e 63 20 22 45 52 52 4f 52 3a  se (conc "ERROR:
69f0: 20 62 61 64 20 74 6f 6c 20 63 6f 6d 70 61 72 61   bad tol compara
6a00: 74 6f 72 20 22 20 74 6f 6c 29 29 29 29 29 29 0a  tor " tol)))))).
6a10: 09 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34  . (debug:print 4
6a20: 20 22 41 46 54 45 52 32 3a 20 63 61 74 65 67 6f   "AFTER2: catego
6a30: 72 79 3a 20 22 20 63 61 74 65 67 6f 72 79 20 22  ry: " category "
6a40: 20 76 61 72 69 61 62 6c 65 3a 20 22 20 76 61 72   variable: " var
6a50: 69 61 62 6c 65 20 22 20 76 61 6c 75 65 3a 20 22  iable " value: "
6a60: 20 76 61 6c 75 65 20 0a 09 09 20 20 20 20 20 20   value ...      
6a70: 22 2c 20 65 78 70 65 63 74 65 64 3a 20 22 20 65  ", expected: " e
6a80: 78 70 65 63 74 65 64 20 22 20 74 6f 6c 3a 20 22  xpected " tol: "
6a90: 20 74 6f 6c 20 22 20 75 6e 69 74 73 3a 20 22 20   tol " units: " 
6aa0: 75 6e 69 74 73 20 22 20 73 74 61 74 75 73 3a 20  units " status: 
6ab0: 22 20 73 74 61 74 75 73 20 22 20 63 6f 6d 6d 65  " status " comme
6ac0: 6e 74 3a 20 22 20 63 6f 6d 6d 65 6e 74 29 0a 09  nt: " comment)..
6ad0: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
6ae0: 65 20 64 62 20 22 49 4e 53 45 52 54 20 4f 52 20  e db "INSERT OR 
6af0: 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 65 73  REPLACE INTO tes
6b00: 74 5f 64 61 74 61 20 28 74 65 73 74 5f 69 64 2c  t_data (test_id,
6b10: 63 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62 6c  category,variabl
6b20: 65 2c 76 61 6c 75 65 2c 65 78 70 65 63 74 65 64  e,value,expected
6b30: 2c 74 6f 6c 2c 75 6e 69 74 73 2c 63 6f 6d 6d 65  ,tol,units,comme
6b40: 6e 74 2c 73 74 61 74 75 73 2c 74 79 70 65 29 20  nt,status,type) 
6b50: 56 41 4c 55 45 53 20 28 3f 2c 3f 2c 3f 2c 3f 2c  VALUES (?,?,?,?,
6b60: 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 29 3b 22 0a 09  ?,?,?,?,?,?);"..
6b70: 09 09 20 20 74 65 73 74 2d 69 64 20 63 61 74 65  ..  test-id cate
6b80: 67 6f 72 79 20 76 61 72 69 61 62 6c 65 20 76 61  gory variable va
6b90: 6c 75 65 20 65 78 70 65 63 74 65 64 20 74 6f 6c  lue expected tol
6ba0: 20 75 6e 69 74 73 20 28 69 66 20 63 6f 6d 6d 65   units (if comme
6bb0: 6e 74 20 63 6f 6d 6d 65 6e 74 20 22 22 29 20 73  nt comment "") s
6bc0: 74 61 74 75 73 20 74 79 70 65 29 29 29 0a 20 20  tatus type))).  
6bd0: 20 20 20 63 73 76 6c 69 73 74 29 29 29 0a 0a 3b     csvlist)))..;
6be0: 3b 20 67 65 74 20 61 20 6c 69 73 74 20 6f 66 20  ; get a list of 
6bf0: 74 65 73 74 5f 64 61 74 61 20 72 65 63 6f 72 64  test_data record
6c00: 73 20 6d 61 74 63 68 69 6e 67 20 63 61 74 65 67  s matching categ
6c10: 6f 72 79 70 61 74 74 0a 28 64 65 66 69 6e 65 20  orypatt.(define 
6c20: 28 64 62 3a 72 65 61 64 2d 74 65 73 74 2d 64 61  (db:read-test-da
6c30: 74 61 20 64 62 20 74 65 73 74 2d 69 64 20 63 61  ta db test-id ca
6c40: 74 65 67 6f 72 79 70 61 74 74 29 0a 20 20 28 6c  tegorypatt).  (l
6c50: 65 74 20 28 28 72 65 73 20 27 28 29 29 29 0a 20  et ((res '())). 
6c60: 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d     (sqlite3:for-
6c70: 65 61 63 68 2d 72 6f 77 20 0a 20 20 20 20 20 28  each-row .     (
6c80: 6c 61 6d 62 64 61 20 28 69 64 20 74 65 73 74 5f  lambda (id test_
6c90: 69 64 20 63 61 74 65 67 6f 72 79 20 76 61 72 69  id category vari
6ca0: 61 62 6c 65 20 76 61 6c 75 65 20 65 78 70 65 63  able value expec
6cb0: 74 65 64 20 74 6f 6c 20 75 6e 69 74 73 20 63 6f  ted tol units co
6cc0: 6d 6d 65 6e 74 20 73 74 61 74 75 73 20 74 79 70  mment status typ
6cd0: 65 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20  e).       (set! 
6ce0: 72 65 73 20 28 63 6f 6e 73 20 28 76 65 63 74 6f  res (cons (vecto
6cf0: 72 20 69 64 20 74 65 73 74 5f 69 64 20 63 61 74  r id test_id cat
6d00: 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65 20 76  egory variable v
6d10: 61 6c 75 65 20 65 78 70 65 63 74 65 64 20 74 6f  alue expected to
6d20: 6c 20 75 6e 69 74 73 20 63 6f 6d 6d 65 6e 74 20  l units comment 
6d30: 73 74 61 74 75 73 20 74 79 70 65 29 20 72 65 73  status type) res
6d40: 29 29 29 0a 20 20 20 20 20 64 62 0a 20 20 20 20  ))).     db.    
6d50: 20 22 53 45 4c 45 43 54 20 69 64 2c 74 65 73 74   "SELECT id,test
6d60: 5f 69 64 2c 63 61 74 65 67 6f 72 79 2c 76 61 72  _id,category,var
6d70: 69 61 62 6c 65 2c 76 61 6c 75 65 2c 65 78 70 65  iable,value,expe
6d80: 63 74 65 64 2c 74 6f 6c 2c 75 6e 69 74 73 2c 63  cted,tol,units,c
6d90: 6f 6d 6d 65 6e 74 2c 73 74 61 74 75 73 2c 74 79  omment,status,ty
6da0: 70 65 20 46 52 4f 4d 20 74 65 73 74 5f 64 61 74  pe FROM test_dat
6db0: 61 20 57 48 45 52 45 20 74 65 73 74 5f 69 64 3d  a WHERE test_id=
6dc0: 3f 20 41 4e 44 20 63 61 74 65 67 6f 72 79 20 4c  ? AND category L
6dd0: 49 4b 45 20 3f 20 4f 52 44 45 52 20 42 59 20 63  IKE ? ORDER BY c
6de0: 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62 6c 65  ategory,variable
6df0: 3b 22 20 74 65 73 74 2d 69 64 20 63 61 74 65 67  ;" test-id categ
6e00: 6f 72 79 70 61 74 74 29 0a 20 20 20 20 28 72 65  orypatt).    (re
6e10: 76 65 72 73 65 20 72 65 73 29 29 29 0a 0a 28 64  verse res)))..(d
6e20: 65 66 69 6e 65 20 28 64 62 3a 6c 6f 61 64 2d 74  efine (db:load-t
6e30: 65 73 74 2d 64 61 74 61 20 64 62 20 72 75 6e 2d  est-data db run-
6e40: 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65  id test-name ite
6e50: 6d 64 61 74 29 0a 20 20 28 6c 65 74 2a 20 28 28  mdat).  (let* ((
6e60: 69 74 65 6d 2d 70 61 74 68 20 28 69 74 65 6d 2d  item-path (item-
6e70: 6c 69 73 74 2d 3e 70 61 74 68 20 69 74 65 6d 64  list->path itemd
6e80: 61 74 29 29 0a 09 20 28 74 65 73 74 64 61 74 20  at)).. (testdat 
6e90: 28 64 62 3a 67 65 74 2d 74 65 73 74 2d 69 6e 66  (db:get-test-inf
6ea0: 6f 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74  o db run-id test
6eb0: 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29  -name item-path)
6ec0: 29 0a 09 20 28 74 65 73 74 2d 69 64 20 28 69 66  ).. (test-id (if
6ed0: 20 74 65 73 74 64 61 74 20 28 64 62 3a 74 65 73   testdat (db:tes
6ee0: 74 2d 67 65 74 2d 69 64 20 74 65 73 74 64 61 74  t-get-id testdat
6ef0: 29 20 23 66 29 29 29 0a 20 20 20 20 3b 3b 20 28  ) #f))).    ;; (
6f00: 64 65 62 75 67 3a 70 72 69 6e 74 20 31 20 22 45  debug:print 1 "E
6f10: 6e 74 65 72 20 72 65 63 6f 72 64 73 20 74 6f 20  nter records to 
6f20: 69 6e 73 65 72 74 20 69 6e 20 74 68 65 20 74 65  insert in the te
6f30: 73 74 5f 64 61 74 61 20 74 61 62 6c 65 2c 20 73  st_data table, s
6f40: 65 76 65 6e 20 66 69 65 6c 64 73 2c 20 63 6f 6d  even fields, com
6f50: 6d 61 20 73 65 70 61 72 61 74 65 64 20 70 65 72  ma separated per
6f60: 20 6c 69 6e 65 22 29 0a 20 20 20 20 28 64 65 62   line").    (deb
6f70: 75 67 3a 70 72 69 6e 74 20 34 20 22 69 74 65 6d  ug:print 4 "item
6f80: 64 61 74 3a 20 22 20 69 74 65 6d 64 61 74 20 22  dat: " itemdat "
6f90: 2c 20 74 65 73 74 2d 6e 61 6d 65 3a 20 22 20 74  , test-name: " t
6fa0: 65 73 74 2d 6e 61 6d 65 20 22 2c 20 74 65 73 74  est-name ", test
6fb0: 2d 69 64 3a 20 22 20 74 65 73 74 2d 69 64 29 0a  -id: " test-id).
6fc0: 20 20 20 20 28 69 66 20 74 65 73 74 2d 69 64 0a      (if test-id.
6fd0: 09 28 6c 65 74 20 6c 6f 6f 70 20 28 28 6c 69 6e  .(let loop ((lin
6fe0: 20 28 72 65 61 64 2d 6c 69 6e 65 29 29 29 0a 09   (read-line)))..
6ff0: 20 20 28 69 66 20 28 6e 6f 74 20 28 65 6f 66 2d    (if (not (eof-
7000: 6f 62 6a 65 63 74 3f 20 6c 69 6e 29 29 0a 09 20  object? lin)).. 
7010: 20 20 20 20 20 28 62 65 67 69 6e 0a 09 09 28 64       (begin...(d
7020: 65 62 75 67 3a 70 72 69 6e 74 20 34 20 6c 69 6e  ebug:print 4 lin
7030: 29 0a 09 09 28 64 62 3a 63 73 76 2d 3e 74 65 73  )...(db:csv->tes
7040: 74 2d 64 61 74 61 20 64 62 20 74 65 73 74 2d 69  t-data db test-i
7050: 64 20 6c 69 6e 29 0a 09 09 28 6c 6f 6f 70 20 28  d lin)...(loop (
7060: 72 65 61 64 2d 6c 69 6e 65 29 29 29 29 29 29 0a  read-line)))))).
7070: 20 20 20 20 3b 3b 20 72 6f 6c 6c 20 75 70 20 74      ;; roll up t
7080: 68 65 20 63 75 72 72 65 6e 74 20 72 65 73 75 6c  he current resul
7090: 74 73 2e 0a 20 20 20 20 3b 3b 20 46 49 58 4d 45  ts..    ;; FIXME
70a0: 3a 20 41 64 64 20 74 68 65 20 73 74 61 74 75 73  : Add the status
70b0: 20 74 6f 20 0a 20 20 20 20 28 64 62 3a 74 65 73   to .    (db:tes
70c0: 74 2d 64 61 74 61 2d 72 6f 6c 6c 75 70 20 64 62  t-data-rollup db
70d0: 20 74 65 73 74 2d 69 64 20 23 66 29 29 29 0a 0a   test-id #f)))..
70e0: 3b 3b 20 57 41 52 4e 49 4e 47 3a 20 44 6f 20 4e  ;; WARNING: Do N
70f0: 4f 54 20 63 61 6c 6c 20 74 68 69 73 20 66 6f 72  OT call this for
7100: 20 74 68 65 20 70 61 72 65 6e 74 20 74 65 73 74   the parent test
7110: 20 6f 6e 20 61 6e 20 69 74 65 72 61 74 65 64 20   on an iterated 
7120: 74 65 73 74 0a 3b 3b 20 52 6f 6c 6c 20 75 70 20  test.;; Roll up 
7130: 74 65 73 74 5f 64 61 74 61 20 70 61 73 73 2f 66  test_data pass/f
7140: 61 69 6c 20 72 65 73 75 6c 74 73 0a 3b 3b 20 6c  ail results.;; l
7150: 6f 6f 6b 20 61 74 20 74 68 65 20 74 65 73 74 5f  ook at the test_
7160: 64 61 74 61 20 73 74 61 74 75 73 20 66 69 65 6c  data status fiel
7170: 64 2c 20 0a 3b 3b 20 20 20 20 69 66 20 61 6c 6c  d, .;;    if all
7180: 20 61 72 65 20 70 61 73 73 20 28 61 6e 79 20 63   are pass (any c
7190: 61 73 65 29 20 61 6e 64 20 74 68 65 20 74 65 73  ase) and the tes
71a0: 74 20 73 74 61 74 75 73 20 69 73 20 50 41 53 53  t status is PASS
71b0: 20 6f 72 20 4e 55 4c 4c 20 6f 72 20 27 27 20 74   or NULL or '' t
71c0: 68 65 6e 20 73 65 74 20 74 65 73 74 20 73 74 61  hen set test sta
71d0: 74 75 73 20 74 6f 20 50 41 53 53 2e 0a 3b 3b 20  tus to PASS..;; 
71e0: 20 20 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72     if one or mor
71f0: 65 20 61 72 65 20 66 61 69 6c 20 28 61 6e 79 20  e are fail (any 
7200: 63 61 73 65 29 20 74 68 65 6e 20 73 65 74 20 74  case) then set t
7210: 65 73 74 20 73 74 61 74 75 73 20 74 6f 20 50 41  est status to PA
7220: 53 53 2c 20 6e 6f 6e 20 22 70 61 73 73 22 20 6f  SS, non "pass" o
7230: 72 20 22 66 61 69 6c 22 20 61 72 65 20 69 67 6e  r "fail" are ign
7240: 6f 72 65 64 0a 28 64 65 66 69 6e 65 20 28 64 62  ored.(define (db
7250: 3a 74 65 73 74 2d 64 61 74 61 2d 72 6f 6c 6c 75  :test-data-rollu
7260: 70 20 64 62 20 74 65 73 74 2d 69 64 20 73 74 61  p db test-id sta
7270: 74 75 73 29 0a 20 20 28 73 71 6c 69 74 65 33 3a  tus).  (sqlite3:
7280: 65 78 65 63 75 74 65 20 0a 20 20 20 64 62 20 0a  execute .   db .
7290: 20 20 20 22 55 50 44 41 54 45 20 74 65 73 74 73     "UPDATE tests
72a0: 20 0a 20 20 20 20 20 20 53 45 54 20 66 61 69 6c   .      SET fail
72b0: 5f 63 6f 75 6e 74 3d 28 53 45 4c 45 43 54 20 63  _count=(SELECT c
72c0: 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 74 65  ount(id) FROM te
72d0: 73 74 5f 64 61 74 61 20 57 48 45 52 45 20 74 65  st_data WHERE te
72e0: 73 74 5f 69 64 3d 3f 20 41 4e 44 20 73 74 61 74  st_id=? AND stat
72f0: 75 73 20 6c 69 6b 65 20 27 66 61 69 6c 27 29 2c  us like 'fail'),
7300: 0a 20 20 20 20 20 20 20 20 20 20 70 61 73 73 5f  .          pass_
7310: 63 6f 75 6e 74 3d 28 53 45 4c 45 43 54 20 63 6f  count=(SELECT co
7320: 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 74 65 73  unt(id) FROM tes
7330: 74 5f 64 61 74 61 20 57 48 45 52 45 20 74 65 73  t_data WHERE tes
7340: 74 5f 69 64 3d 3f 20 41 4e 44 20 73 74 61 74 75  t_id=? AND statu
7350: 73 20 6c 69 6b 65 20 27 70 61 73 73 27 29 0a 20  s like 'pass'). 
7360: 20 20 20 20 20 57 48 45 52 45 20 69 64 3d 3f 3b       WHERE id=?;
7370: 22 0a 20 20 20 74 65 73 74 2d 69 64 20 74 65 73  ".   test-id tes
7380: 74 2d 69 64 20 74 65 73 74 2d 69 64 29 0a 20 20  t-id test-id).  
7390: 3b 3b 20 69 66 20 74 68 65 20 74 65 73 74 20 69  ;; if the test i
73a0: 73 20 6e 6f 74 20 46 41 49 4c 20 74 68 65 6e 20  s not FAIL then 
73b0: 73 65 74 20 73 74 61 74 75 73 20 62 61 73 65 64  set status based
73c0: 20 6f 6e 20 74 68 65 20 66 61 69 6c 20 61 6e 64   on the fail and
73d0: 20 70 61 73 73 20 63 6f 75 6e 74 73 2e 0a 20 20   pass counts..  
73e0: 28 74 68 72 65 61 64 2d 73 6c 65 65 70 21 20 31  (thread-sleep! 1
73f0: 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65  ).  (sqlite3:exe
7400: 63 75 74 65 0a 20 20 20 64 62 20 20 20 3b 3b 3b  cute.   db   ;;;
7410: 20 4e 4f 54 45 3a 20 53 68 6f 75 6c 64 20 74 68   NOTE: Should th
7420: 69 73 20 62 65 20 57 41 52 4e 2c 46 41 49 4c 3f  is be WARN,FAIL?
7430: 20 41 20 57 41 52 4e 20 69 73 20 6e 6f 74 20 61   A WARN is not a
7440: 20 46 41 49 4c 3f 3f 3f 3f 3f 20 42 55 47 20 46   FAIL????? BUG F
7450: 49 58 4d 45 0a 20 20 20 22 55 50 44 41 54 45 20  IXME.   "UPDATE 
7460: 74 65 73 74 73 0a 20 20 20 20 20 20 53 45 54 20  tests.      SET 
7470: 73 74 61 74 75 73 3d 43 41 53 45 20 57 48 45 4e  status=CASE WHEN
7480: 20 28 53 45 4c 45 43 54 20 66 61 69 6c 5f 63 6f   (SELECT fail_co
7490: 75 6e 74 20 46 52 4f 4d 20 74 65 73 74 73 20 57  unt FROM tests W
74a0: 48 45 52 45 20 69 64 3d 3f 29 20 3e 20 30 20 0a  HERE id=?) > 0 .
74b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
74c0: 20 20 20 20 20 20 20 20 20 54 48 45 4e 20 27 46           THEN 'F
74d0: 41 49 4c 27 0a 20 20 20 20 20 20 20 20 20 20 20  AIL'.           
74e0: 20 20 20 20 20 20 20 20 20 20 20 57 48 45 4e 20             WHEN 
74f0: 28 53 45 4c 45 43 54 20 70 61 73 73 5f 63 6f 75  (SELECT pass_cou
7500: 6e 74 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48  nt FROM tests WH
7510: 45 52 45 20 69 64 3d 3f 29 20 3e 20 30 20 41 4e  ERE id=?) > 0 AN
7520: 44 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  D .             
7530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
7540: 45 4c 45 43 54 20 73 74 61 74 75 73 20 46 52 4f  ELECT status FRO
7550: 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 69 64  M tests WHERE id
7560: 3d 3f 29 20 4e 4f 54 20 49 4e 20 28 27 57 41 52  =?) NOT IN ('WAR
7570: 4e 27 2c 27 46 41 49 4c 27 29 0a 20 20 20 20 20  N','FAIL').     
7580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7590: 20 20 20 20 54 48 45 4e 20 27 50 41 53 53 27 0a      THEN 'PASS'.
75a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75b0: 20 20 20 20 20 20 45 4c 53 45 20 73 74 61 74 75        ELSE statu
75c0: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s.              
75d0: 20 20 20 20 45 4e 44 20 57 48 45 52 45 20 69 64      END WHERE id
75e0: 3d 3f 3b 22 0a 20 20 20 74 65 73 74 2d 69 64 20  =?;".   test-id 
75f0: 74 65 73 74 2d 69 64 20 74 65 73 74 2d 69 64 20  test-id test-id 
7600: 74 65 73 74 2d 69 64 29 29 0a 0a 28 64 65 66 69  test-id))..(defi
7610: 6e 65 20 28 64 62 3a 67 65 74 2d 70 72 65 76 2d  ne (db:get-prev-
7620: 74 6f 6c 2d 66 6f 72 2d 74 65 73 74 20 64 62 20  tol-for-test db 
7630: 74 65 73 74 2d 69 64 20 63 61 74 65 67 6f 72 79  test-id category
7640: 20 76 61 72 69 61 62 6c 65 29 0a 20 20 3b 3b 20   variable).  ;; 
7650: 46 69 6e 69 73 68 20 6d 65 3f 0a 20 20 28 76 61  Finish me?.  (va
7660: 6c 75 65 73 20 23 66 20 23 66 20 23 66 29 29 0a  lues #f #f #f)).
7670: 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  .;;=============
7680: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7690: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
76a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
76b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 53 20 54  =========.;; S T
76c0: 20 45 20 50 20 53 20 0a 3b 3b 3d 3d 3d 3d 3d 3d   E P S .;;======
76d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
76e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
76f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7700: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7710: 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 73 74  ..(define (db:st
7720: 65 70 2d 67 65 74 2d 74 69 6d 65 2d 61 73 2d 73  ep-get-time-as-s
7730: 74 72 69 6e 67 20 76 65 63 29 0a 20 20 28 73 65  tring vec).  (se
7740: 63 6f 6e 64 73 2d 3e 74 69 6d 65 2d 73 74 72 69  conds->time-stri
7750: 6e 67 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d  ng (db:step-get-
7760: 65 76 65 6e 74 5f 74 69 6d 65 20 76 65 63 29 29  event_time vec))
7770: 29 0a 0a 3b 3b 20 64 62 2d 67 65 74 2d 74 65 73  )..;; db-get-tes
7780: 74 2d 73 74 65 70 73 2d 66 6f 72 2d 72 75 6e 0a  t-steps-for-run.
7790: 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d  (define (db:get-
77a0: 73 74 65 70 73 2d 66 6f 72 2d 74 65 73 74 20 64  steps-for-test d
77b0: 62 20 74 65 73 74 2d 69 64 29 0a 20 20 28 6c 65  b test-id).  (le
77c0: 74 20 28 28 72 65 73 20 27 28 29 29 29 0a 20 20  t ((res '())).  
77d0: 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65    (sqlite3:for-e
77e0: 61 63 68 2d 72 6f 77 20 0a 20 20 20 20 20 28 6c  ach-row .     (l
77f0: 61 6d 62 64 61 20 28 69 64 20 74 65 73 74 2d 69  ambda (id test-i
7800: 64 20 73 74 65 70 6e 61 6d 65 20 73 74 61 74 65  d stepname state
7810: 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d 74 69   status event-ti
7820: 6d 65 20 6c 6f 67 66 69 6c 65 29 0a 20 20 20 20  me logfile).    
7830: 20 20 20 28 73 65 74 21 20 72 65 73 20 28 63 6f     (set! res (co
7840: 6e 73 20 28 76 65 63 74 6f 72 20 69 64 20 74 65  ns (vector id te
7850: 73 74 2d 69 64 20 73 74 65 70 6e 61 6d 65 20 73  st-id stepname s
7860: 74 61 74 65 20 73 74 61 74 75 73 20 65 76 65 6e  tate status even
7870: 74 2d 74 69 6d 65 20 28 69 66 20 28 73 74 72 69  t-time (if (stri
7880: 6e 67 3f 20 6c 6f 67 66 69 6c 65 29 20 6c 6f 67  ng? logfile) log
7890: 66 69 6c 65 20 22 22 29 29 20 72 65 73 29 29 29  file "")) res)))
78a0: 0a 20 20 20 20 20 64 62 0a 20 20 20 20 20 22 53  .     db.     "S
78b0: 45 4c 45 43 54 20 69 64 2c 74 65 73 74 5f 69 64  ELECT id,test_id
78c0: 2c 73 74 65 70 6e 61 6d 65 2c 73 74 61 74 65 2c  ,stepname,state,
78d0: 73 74 61 74 75 73 2c 65 76 65 6e 74 5f 74 69 6d  status,event_tim
78e0: 65 2c 6c 6f 67 66 69 6c 65 20 46 52 4f 4d 20 74  e,logfile FROM t
78f0: 65 73 74 5f 73 74 65 70 73 20 57 48 45 52 45 20  est_steps WHERE 
7900: 74 65 73 74 5f 69 64 3d 3f 20 4f 52 44 45 52 20  test_id=? ORDER 
7910: 42 59 20 69 64 20 41 53 43 3b 22 20 3b 3b 20 65  BY id ASC;" ;; e
7920: 76 65 6e 74 5f 74 69 6d 65 20 44 45 53 43 2c 69  vent_time DESC,i
7930: 64 20 41 53 43 3b 0a 20 20 20 20 20 74 65 73 74  d ASC;.     test
7940: 2d 69 64 29 0a 20 20 20 20 28 72 65 76 65 72 73  -id).    (revers
7950: 65 20 72 65 73 29 29 29 0a 0a 3b 3b 20 67 65 74  e res)))..;; get
7960: 20 61 20 70 72 65 74 74 79 20 74 61 62 6c 65 20   a pretty table 
7970: 74 6f 20 73 75 6d 6d 61 72 69 7a 65 20 73 74 65  to summarize ste
7980: 70 73 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 28 64  ps.;;.(define (d
7990: 62 3a 67 65 74 2d 73 74 65 70 73 2d 74 61 62 6c  b:get-steps-tabl
79a0: 65 20 64 62 20 74 65 73 74 2d 69 64 29 0a 20 20  e db test-id).  
79b0: 28 6c 65 74 20 28 28 73 74 65 70 73 20 20 20 28  (let ((steps   (
79c0: 64 62 3a 67 65 74 2d 73 74 65 70 73 2d 66 6f 72  db:get-steps-for
79d0: 2d 74 65 73 74 20 64 62 20 74 65 73 74 2d 69 64  -test db test-id
79e0: 29 29 29 0a 20 20 20 20 3b 3b 20 6f 72 67 61 6e  ))).    ;; organ
79f0: 69 73 65 20 74 68 65 20 73 74 65 70 73 20 66 6f  ise the steps fo
7a00: 72 20 62 65 74 74 65 72 20 72 65 61 64 61 62 69  r better readabi
7a10: 6c 69 74 79 0a 20 20 20 20 28 6c 65 74 20 28 28  lity.    (let ((
7a20: 72 65 73 20 28 6d 61 6b 65 2d 68 61 73 68 2d 74  res (make-hash-t
7a30: 61 62 6c 65 29 29 29 0a 20 20 20 20 20 20 28 66  able))).      (f
7a40: 6f 72 2d 65 61 63 68 20 0a 20 20 20 20 20 20 20  or-each .       
7a50: 28 6c 61 6d 62 64 61 20 28 73 74 65 70 29 0a 09  (lambda (step)..
7a60: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 36 20   (debug:print 6 
7a70: 22 73 74 65 70 3d 22 20 73 74 65 70 29 0a 09 20  "step=" step).. 
7a80: 28 6c 65 74 20 28 28 72 65 63 6f 72 64 20 28 68  (let ((record (h
7a90: 61 73 68 2d 74 61 62 6c 65 2d 72 65 66 2f 64 65  ash-table-ref/de
7aa0: 66 61 75 6c 74 20 0a 09 09 09 72 65 73 20 0a 09  fault ....res ..
7ab0: 09 09 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73  ..(db:step-get-s
7ac0: 74 65 70 6e 61 6d 65 20 73 74 65 70 29 20 0a 09  tepname step) ..
7ad0: 09 09 3b 3b 20 20 20 20 20 20 20 20 73 74 65 70  ..;;        step
7ae0: 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  name            
7af0: 20 20 20 20 73 74 61 72 74 20 65 6e 64 20 73 74      start end st
7b00: 61 74 75 73 20 20 20 20 0a 09 09 09 28 76 65 63  atus    ....(vec
7b10: 74 6f 72 20 28 64 62 3a 73 74 65 70 2d 67 65 74  tor (db:step-get
7b20: 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70 29 20  -stepname step) 
7b30: 22 22 20 20 20 22 22 20 22 22 20 20 20 20 20 22  ""   "" ""     "
7b40: 22 20 22 22 29 29 29 29 0a 09 20 20 20 28 64 65  " ""))))..   (de
7b50: 62 75 67 3a 70 72 69 6e 74 20 36 20 22 72 65 63  bug:print 6 "rec
7b60: 6f 72 64 28 62 65 66 6f 72 65 29 20 3d 20 22 20  ord(before) = " 
7b70: 72 65 63 6f 72 64 20 0a 09 09 09 22 5c 6e 69 64  record ...."\nid
7b80: 3a 20 20 20 20 20 20 20 22 20 28 64 62 3a 73 74  :       " (db:st
7b90: 65 70 2d 67 65 74 2d 69 64 20 73 74 65 70 29 0a  ep-get-id step).
7ba0: 09 09 09 22 5c 6e 73 74 65 70 6e 61 6d 65 3a 20  ..."\nstepname: 
7bb0: 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73  " (db:step-get-s
7bc0: 74 65 70 6e 61 6d 65 20 73 74 65 70 29 0a 09 09  tepname step)...
7bd0: 09 22 5c 6e 73 74 61 74 65 3a 20 20 20 20 22 20  ."\nstate:    " 
7be0: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61  (db:step-get-sta
7bf0: 74 65 20 73 74 65 70 29 0a 09 09 09 22 5c 6e 73  te step)...."\ns
7c00: 74 61 74 75 73 3a 20 20 20 22 20 28 64 62 3a 73  tatus:   " (db:s
7c10: 74 65 70 2d 67 65 74 2d 73 74 61 74 75 73 20 73  tep-get-status s
7c20: 74 65 70 29 0a 09 09 09 22 5c 6e 74 69 6d 65 3a  tep)...."\ntime:
7c30: 20 20 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d       " (db:step-
7c40: 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73  get-event_time s
7c50: 74 65 70 29 29 0a 09 20 20 20 28 63 61 73 65 20  tep))..   (case 
7c60: 28 73 74 72 69 6e 67 2d 3e 73 79 6d 62 6f 6c 20  (string->symbol 
7c70: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61  (db:step-get-sta
7c80: 74 65 20 73 74 65 70 29 29 0a 09 20 20 20 20 20  te step))..     
7c90: 28 28 73 74 61 72 74 29 28 76 65 63 74 6f 72 2d  ((start)(vector-
7ca0: 73 65 74 21 20 72 65 63 6f 72 64 20 31 20 28 64  set! record 1 (d
7cb0: 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74  b:step-get-event
7cc0: 5f 74 69 6d 65 20 73 74 65 70 29 29 0a 09 20 20  _time step))..  
7cd0: 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21      (vector-set!
7ce0: 20 72 65 63 6f 72 64 20 33 20 28 69 66 20 28 65   record 3 (if (e
7cf0: 71 75 61 6c 3f 20 28 76 65 63 74 6f 72 2d 72 65  qual? (vector-re
7d00: 66 20 72 65 63 6f 72 64 20 33 29 20 22 22 29 0a  f record 3) "").
7d10: 09 09 09 09 09 28 64 62 3a 73 74 65 70 2d 67 65  .....(db:step-ge
7d20: 74 2d 73 74 61 74 75 73 20 73 74 65 70 29 29 29  t-status step)))
7d30: 0a 09 20 20 20 20 20 20 28 69 66 20 28 3e 20 28  ..      (if (> (
7d40: 73 74 72 69 6e 67 2d 6c 65 6e 67 74 68 20 28 64  string-length (d
7d50: 62 3a 73 74 65 70 2d 67 65 74 2d 6c 6f 67 66 69  b:step-get-logfi
7d60: 6c 65 20 73 74 65 70 29 29 0a 09 09 20 20 20 20  le step))...    
7d70: 20 30 29 0a 09 09 20 20 28 76 65 63 74 6f 72 2d   0)...  (vector-
7d80: 73 65 74 21 20 72 65 63 6f 72 64 20 35 20 28 64  set! record 5 (d
7d90: 62 3a 73 74 65 70 2d 67 65 74 2d 6c 6f 67 66 69  b:step-get-logfi
7da0: 6c 65 20 73 74 65 70 29 29 29 29 0a 09 20 20 20  le step))))..   
7db0: 20 20 28 28 65 6e 64 29 20 20 0a 09 20 20 20 20    ((end)  ..    
7dc0: 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72    (vector-set! r
7dd0: 65 63 6f 72 64 20 32 20 28 61 6e 79 2d 3e 6e 75  ecord 2 (any->nu
7de0: 6d 62 65 72 20 28 64 62 3a 73 74 65 70 2d 67 65  mber (db:step-ge
7df0: 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73 74 65  t-event_time ste
7e00: 70 29 29 29 0a 09 20 20 20 20 20 20 28 76 65 63  p)))..      (vec
7e10: 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20  tor-set! record 
7e20: 33 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73  3 (db:step-get-s
7e30: 74 61 74 75 73 20 73 74 65 70 29 29 0a 09 20 20  tatus step))..  
7e40: 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21      (vector-set!
7e50: 20 72 65 63 6f 72 64 20 34 20 28 6c 65 74 20 28   record 4 (let (
7e60: 28 73 74 61 72 74 74 20 28 61 6e 79 2d 3e 6e 75  (startt (any->nu
7e70: 6d 62 65 72 20 28 76 65 63 74 6f 72 2d 72 65 66  mber (vector-ref
7e80: 20 72 65 63 6f 72 64 20 31 29 29 29 0a 09 09 09   record 1)))....
7e90: 09 09 20 20 28 65 6e 64 74 20 20 20 28 61 6e 79  ..  (endt   (any
7ea0: 2d 3e 6e 75 6d 62 65 72 20 28 76 65 63 74 6f 72  ->number (vector
7eb0: 2d 72 65 66 20 72 65 63 6f 72 64 20 32 29 29 29  -ref record 2)))
7ec0: 29 0a 09 09 09 09 20 20 20 20 20 20 28 64 65 62  ).....      (deb
7ed0: 75 67 3a 70 72 69 6e 74 20 34 20 22 72 65 63 6f  ug:print 4 "reco
7ee0: 72 64 5b 31 5d 3d 22 20 28 76 65 63 74 6f 72 2d  rd[1]=" (vector-
7ef0: 72 65 66 20 72 65 63 6f 72 64 20 31 29 20 0a 09  ref record 1) ..
7f00: 09 09 09 09 09 20 20 20 22 2c 20 73 74 61 72 74  .....   ", start
7f10: 74 3d 22 20 73 74 61 72 74 74 20 22 2c 20 65 6e  t=" startt ", en
7f20: 64 74 3d 22 20 65 6e 64 74 0a 09 09 09 09 09 09  dt=" endt.......
7f30: 20 20 20 22 2c 20 67 65 74 2d 73 74 61 74 75 73     ", get-status
7f40: 3a 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74  : " (db:step-get
7f50: 2d 73 74 61 74 75 73 20 73 74 65 70 29 29 0a 09  -status step))..
7f60: 09 09 09 20 20 20 20 20 20 28 69 66 20 28 61 6e  ...      (if (an
7f70: 64 20 28 6e 75 6d 62 65 72 3f 20 73 74 61 72 74  d (number? start
7f80: 74 29 28 6e 75 6d 62 65 72 3f 20 65 6e 64 74 29  t)(number? endt)
7f90: 29 0a 09 09 09 09 09 20 20 28 73 65 63 6f 6e 64  )......  (second
7fa0: 73 2d 3e 68 72 2d 6d 69 6e 2d 73 65 63 20 28 2d  s->hr-min-sec (-
7fb0: 20 65 6e 64 74 20 73 74 61 72 74 74 29 29 20 22   endt startt)) "
7fc0: 2d 31 22 29 29 29 0a 09 20 20 20 20 20 20 28 69  -1")))..      (i
7fd0: 66 20 28 3e 20 28 73 74 72 69 6e 67 2d 6c 65 6e  f (> (string-len
7fe0: 67 74 68 20 28 64 62 3a 73 74 65 70 2d 67 65 74  gth (db:step-get
7ff0: 2d 6c 6f 67 66 69 6c 65 20 73 74 65 70 29 29 0a  -logfile step)).
8000: 09 09 20 20 20 20 20 30 29 0a 09 09 20 20 28 76  ..     0)...  (v
8010: 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72  ector-set! recor
8020: 64 20 35 20 28 64 62 3a 73 74 65 70 2d 67 65 74  d 5 (db:step-get
8030: 2d 6c 6f 67 66 69 6c 65 20 73 74 65 70 29 29 29  -logfile step)))
8040: 29 0a 09 20 20 20 20 20 28 65 6c 73 65 0a 09 20  )..     (else.. 
8050: 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74       (vector-set
8060: 21 20 72 65 63 6f 72 64 20 32 20 28 64 62 3a 73  ! record 2 (db:s
8070: 74 65 70 2d 67 65 74 2d 73 74 61 74 65 20 73 74  tep-get-state st
8080: 65 70 29 29 0a 09 20 20 20 20 20 20 28 76 65 63  ep))..      (vec
8090: 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20  tor-set! record 
80a0: 33 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73  3 (db:step-get-s
80b0: 74 61 74 75 73 20 73 74 65 70 29 29 0a 09 20 20  tatus step))..  
80c0: 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21      (vector-set!
80d0: 20 72 65 63 6f 72 64 20 34 20 28 64 62 3a 73 74   record 4 (db:st
80e0: 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d  ep-get-event_tim
80f0: 65 20 73 74 65 70 29 29 29 29 0a 09 20 20 20 28  e step))))..   (
8100: 68 61 73 68 2d 74 61 62 6c 65 2d 73 65 74 21 20  hash-table-set! 
8110: 72 65 73 20 28 64 62 3a 73 74 65 70 2d 67 65 74  res (db:step-get
8120: 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70 29 20  -stepname step) 
8130: 72 65 63 6f 72 64 29 0a 09 20 20 20 28 64 65 62  record)..   (deb
8140: 75 67 3a 70 72 69 6e 74 20 36 20 22 72 65 63 6f  ug:print 6 "reco
8150: 72 64 28 61 66 74 65 72 29 20 20 3d 20 22 20 72  rd(after)  = " r
8160: 65 63 6f 72 64 20 0a 09 09 09 22 5c 6e 69 64 3a  ecord ...."\nid:
8170: 20 20 20 20 20 20 20 22 20 28 64 62 3a 73 74 65         " (db:ste
8180: 70 2d 67 65 74 2d 69 64 20 73 74 65 70 29 0a 09  p-get-id step)..
8190: 09 09 22 5c 6e 73 74 65 70 6e 61 6d 65 3a 20 22  .."\nstepname: "
81a0: 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74   (db:step-get-st
81b0: 65 70 6e 61 6d 65 20 73 74 65 70 29 0a 09 09 09  epname step)....
81c0: 22 5c 6e 73 74 61 74 65 3a 20 20 20 20 22 20 28  "\nstate:    " (
81d0: 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 74  db:step-get-stat
81e0: 65 20 73 74 65 70 29 0a 09 09 09 22 5c 6e 73 74  e step)...."\nst
81f0: 61 74 75 73 3a 20 20 20 22 20 28 64 62 3a 73 74  atus:   " (db:st
8200: 65 70 2d 67 65 74 2d 73 74 61 74 75 73 20 73 74  ep-get-status st
8210: 65 70 29 0a 09 09 09 22 5c 6e 74 69 6d 65 3a 20  ep)...."\ntime: 
8220: 20 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d 67      " (db:step-g
8230: 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73 74  et-event_time st
8240: 65 70 29 29 29 29 0a 20 20 20 20 20 20 20 3b 3b  ep)))).       ;;
8250: 20 28 65 6c 73 65 20 20 20 28 76 65 63 74 6f 72   (else   (vector
8260: 2d 73 65 74 21 20 72 65 63 6f 72 64 20 31 20 28  -set! record 1 (
8270: 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 6e  db:step-get-even
8280: 74 5f 74 69 6d 65 20 73 74 65 70 29 29 29 0a 20  t_time step))). 
8290: 20 20 20 20 20 20 28 73 6f 72 74 20 73 74 65 70        (sort step
82a0: 73 20 28 6c 61 6d 62 64 61 20 28 61 20 62 29 28  s (lambda (a b)(
82b0: 3c 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65  < (db:step-get-e
82c0: 76 65 6e 74 5f 74 69 6d 65 20 61 29 28 64 62 3a  vent_time a)(db:
82d0: 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74  step-get-event_t
82e0: 69 6d 65 20 62 29 29 29 29 29 0a 20 20 20 20 20  ime b))))).     
82f0: 20 72 65 73 29 29 29 0a 0a 3b 3b 20 55 53 45 3a   res)))..;; USE:
8300: 20 28 6c 73 65 74 2d 64 69 66 66 65 72 65 6e 63   (lset-differenc
8310: 65 20 73 74 72 69 6e 67 3d 3f 20 27 28 22 61 22  e string=? '("a"
8320: 20 22 62 22 20 22 63 22 29 20 27 28 22 64 22 20   "b" "c") '("d" 
8330: 22 63 22 20 22 65 22 20 22 61 22 29 29 0a 3b 3b  "c" "e" "a")).;;
8340: 0a 3b 3b 20 52 65 74 75 72 6e 20 61 20 6c 69 73  .;; Return a lis
8350: 74 20 6f 66 20 70 72 65 72 65 71 73 20 74 68 61  t of prereqs tha
8360: 74 20 77 65 72 65 20 4e 4f 54 20 6d 65 74 0a 3b  t were NOT met.;
8370: 3b 20 20 54 65 73 74 73 20 28 61 6e 64 20 61 6c  ;  Tests (and al
8380: 6c 20 69 74 65 6d 73 29 20 69 6e 20 77 61 69 74  l items) in wait
8390: 6f 6e 20 6c 69 73 74 20 6d 75 73 74 20 62 65 20  on list must be 
83a0: 22 43 4f 4d 50 4c 45 54 45 44 22 20 61 6e 64 20  "COMPLETED" and 
83b0: 22 50 41 53 53 22 0a 28 64 65 66 69 6e 65 20 28  "PASS".(define (
83c0: 64 62 2d 67 65 74 2d 70 72 65 72 65 71 73 2d 6e  db-get-prereqs-n
83d0: 6f 74 2d 6d 65 74 20 64 62 20 72 75 6e 2d 69 64  ot-met db run-id
83e0: 20 77 61 69 74 6f 6e 29 0a 20 20 28 69 66 20 28   waiton).  (if (
83f0: 6e 75 6c 6c 3f 20 77 61 69 74 6f 6e 29 0a 20 20  null? waiton).  
8400: 20 20 20 20 27 28 29 0a 20 20 20 20 20 20 28 6c      '().      (l
8410: 65 74 2a 20 28 28 75 6e 6d 65 74 2d 70 72 65 2d  et* ((unmet-pre-
8420: 72 65 71 73 20 27 28 29 29 0a 09 20 20 20 20 20  reqs '())..     
8430: 28 74 65 73 74 73 20 20 20 20 20 20 20 20 20 20  (tests          
8440: 20 28 64 62 2d 67 65 74 2d 74 65 73 74 73 2d 66   (db-get-tests-f
8450: 6f 72 2d 72 75 6e 20 64 62 20 72 75 6e 2d 69 64  or-run db run-id
8460: 20 23 66 20 23 66 20 27 28 29 20 27 28 29 29 29   #f #f '() '()))
8470: 0a 09 20 20 20 20 20 28 72 65 73 75 6c 74 20 20  ..     (result  
8480: 20 20 20 20 20 20 20 27 28 29 29 29 0a 09 28 66         '()))..(f
8490: 6f 72 2d 65 61 63 68 20 28 6c 61 6d 62 64 61 20  or-each (lambda 
84a0: 28 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65  (waitontest-name
84b0: 29 0a 09 09 20 20 20 20 28 6c 65 74 20 28 28 65  )...    (let ((e
84c0: 76 65 72 2d 73 65 65 6e 20 23 66 29 29 0a 09 09  ver-seen #f))...
84d0: 20 20 20 20 20 20 28 66 6f 72 2d 65 61 63 68 20        (for-each 
84e0: 28 6c 61 6d 62 64 61 20 28 74 65 73 74 29 0a 09  (lambda (test)..
84f0: 09 09 09 20 20 28 69 66 20 28 65 71 75 61 6c 3f  ...  (if (equal?
8500: 20 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65   waitontest-name
8510: 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 74 65   (db:test-get-te
8520: 73 74 6e 61 6d 65 20 74 65 73 74 29 29 0a 09 09  stname test))...
8530: 09 09 20 20 20 20 20 20 28 62 65 67 69 6e 0a 09  ..      (begin..
8540: 09 09 09 09 28 73 65 74 21 20 65 76 65 72 2d 73  ....(set! ever-s
8550: 65 65 6e 20 23 74 29 0a 09 09 09 09 09 28 69 66  een #t)......(if
8560: 20 28 6e 6f 74 20 28 61 6e 64 20 28 65 71 75 61   (not (and (equa
8570: 6c 3f 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d  l? (db:test-get-
8580: 73 74 61 74 65 20 74 65 73 74 29 20 22 43 4f 4d  state test) "COM
8590: 50 4c 45 54 45 44 22 29 0a 09 09 09 09 09 09 20  PLETED")....... 
85a0: 20 20 20 20 20 28 6d 65 6d 62 65 72 20 28 64 62       (member (db
85b0: 3a 74 65 73 74 2d 67 65 74 2d 73 74 61 74 75 73  :test-get-status
85c0: 20 74 65 73 74 29 20 27 28 22 50 41 53 53 22 20   test) '("PASS" 
85d0: 22 57 41 52 4e 22 20 22 43 48 45 43 4b 22 29 29  "WARN" "CHECK"))
85e0: 29 29 0a 09 09 09 09 09 20 20 20 20 28 73 65 74  ))......    (set
85f0: 21 20 72 65 73 75 6c 74 20 28 63 6f 6e 73 20 77  ! result (cons w
8600: 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 20 72  aitontest-name r
8610: 65 73 75 6c 74 29 29 29 29 29 29 0a 09 09 09 09  esult)))))).....
8620: 74 65 73 74 73 29 0a 09 09 20 20 20 20 20 20 28  tests)...      (
8630: 69 66 20 28 6e 6f 74 20 65 76 65 72 2d 73 65 65  if (not ever-see
8640: 6e 29 28 73 65 74 21 20 72 65 73 75 6c 74 20 28  n)(set! result (
8650: 63 6f 6e 73 20 77 61 69 74 6f 6e 74 65 73 74 2d  cons waitontest-
8660: 6e 61 6d 65 20 72 65 73 75 6c 74 29 29 29 29 29  name result)))))
8670: 0a 09 09 20 20 77 61 69 74 6f 6e 29 0a 09 28 64  ...  waiton)..(d
8680: 65 6c 65 74 65 2d 64 75 70 6c 69 63 61 74 65 73  elete-duplicates
8690: 20 72 65 73 75 6c 74 29 29 29 29 0a 0a 3b 3b 20   result))))..;; 
86a0: 74 68 65 20 6e 65 77 20 70 72 65 72 65 71 73 20  the new prereqs 
86b0: 63 61 6c 63 75 6c 61 74 69 6f 6e 2c 20 6c 6f 6f  calculation, loo
86c0: 6b 73 20 61 6c 73 6f 20 61 74 20 69 74 65 6d 70  ks also at itemp
86d0: 61 74 68 20 69 66 20 73 70 65 63 69 66 69 65 64  ath if specified
86e0: 0a 3b 3b 20 61 6c 6c 20 70 72 65 72 65 71 73 20  .;; all prereqs 
86f0: 6d 75 73 74 20 62 65 20 6d 65 74 3a 0a 3b 3b 20  must be met:.;; 
8700: 20 20 20 69 66 20 70 72 65 72 65 71 20 74 65 73     if prereq tes
8710: 74 20 77 69 74 68 20 69 74 65 6d 70 61 74 68 3d  t with itempath=
8720: 27 27 20 69 73 20 43 4f 4d 50 4c 45 54 45 44 20  '' is COMPLETED 
8730: 61 6e 64 20 50 41 53 53 2c 20 57 41 52 4e 2c 20  and PASS, WARN, 
8740: 43 48 45 43 4b 2c 20 6f 72 20 57 41 49 56 45 44  CHECK, or WAIVED
8750: 20 74 68 65 6e 20 70 72 65 72 65 71 20 69 73 20   then prereq is 
8760: 6d 65 74 0a 3b 3b 20 20 20 20 69 66 20 70 72 65  met.;;    if pre
8770: 72 65 71 20 74 65 73 74 20 77 69 74 68 20 69 74  req test with it
8780: 65 6d 70 61 74 68 3d 72 65 66 2d 69 74 65 6d 2d  empath=ref-item-
8790: 70 61 74 68 20 61 6e 64 20 43 4f 4d 50 4c 45 54  path and COMPLET
87a0: 45 44 20 77 69 74 68 20 50 41 53 53 2c 20 57 41  ED with PASS, WA
87b0: 52 4e 2c 20 43 48 45 43 4b 2c 20 6f 72 20 57 41  RN, CHECK, or WA
87c0: 49 56 45 44 20 74 68 65 6e 20 70 72 65 72 65 71  IVED then prereq
87d0: 20 69 73 20 6d 65 74 0a 28 64 65 66 69 6e 65 20   is met.(define 
87e0: 28 64 62 3a 67 65 74 2d 70 72 65 72 65 71 73 2d  (db:get-prereqs-
87f0: 6e 6f 74 2d 6d 65 74 20 64 62 20 72 75 6e 2d 69  not-met db run-i
8800: 64 20 77 61 69 74 6f 6e 73 20 72 65 66 2d 69 74  d waitons ref-it
8810: 65 6d 2d 70 61 74 68 29 0a 20 20 28 69 66 20 28  em-path).  (if (
8820: 6f 72 20 28 6e 6f 74 20 77 61 69 74 6f 6e 73 29  or (not waitons)
8830: 0a 09 20 20 28 6e 75 6c 6c 3f 20 77 61 69 74 6f  ..  (null? waito
8840: 6e 73 29 29 0a 20 20 20 20 20 20 27 28 29 0a 20  ns)).      '(). 
8850: 20 20 20 20 20 28 6c 65 74 2a 20 28 28 75 6e 6d       (let* ((unm
8860: 65 74 2d 70 72 65 2d 72 65 71 73 20 27 28 29 29  et-pre-reqs '())
8870: 0a 09 20 20 20 20 20 28 72 65 73 75 6c 74 20 20  ..     (result  
8880: 20 20 20 20 20 20 20 27 28 29 29 29 0a 09 28 66         '()))..(f
8890: 6f 72 2d 65 61 63 68 20 0a 09 20 28 6c 61 6d 62  or-each .. (lamb
88a0: 64 61 20 28 77 61 69 74 6f 6e 74 65 73 74 2d 6e  da (waitontest-n
88b0: 61 6d 65 29 0a 09 20 20 20 3b 3b 20 62 79 20 67  ame)..   ;; by g
88c0: 65 74 74 69 6e 67 20 74 68 65 20 74 65 73 74 73  etting the tests
88d0: 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67 20 6e   with matching n
88e0: 61 6d 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69  ame we are looki
88f0: 6e 67 20 6f 6e 6c 79 20 61 74 20 74 68 65 20 6d  ng only at the m
8900: 61 74 63 68 69 6e 67 20 74 65 73 74 20 0a 09 20  atching test .. 
8910: 20 20 3b 3b 20 61 6e 64 20 72 65 6c 61 74 65 64    ;; and related
8920: 20 73 75 62 20 69 74 65 6d 73 0a 09 20 20 20 28   sub items..   (
8930: 6c 65 74 20 28 28 74 65 73 74 73 20 20 20 20 20  let ((tests     
8940: 20 20 20 20 20 20 20 20 28 64 62 2d 67 65 74 2d          (db-get-
8950: 74 65 73 74 73 2d 66 6f 72 2d 72 75 6e 20 64 62  tests-for-run db
8960: 20 72 75 6e 2d 69 64 20 77 61 69 74 6f 6e 74 65   run-id waitonte
8970: 73 74 2d 6e 61 6d 65 20 23 66 20 27 28 29 20 27  st-name #f '() '
8980: 28 29 29 29 0a 09 09 20 28 65 76 65 72 2d 73 65  ()))... (ever-se
8990: 65 6e 20 20 20 20 20 20 20 20 20 23 66 29 0a 09  en         #f)..
89a0: 09 20 28 70 61 72 65 6e 74 2d 77 61 69 74 6f 6e  . (parent-waiton
89b0: 2d 6d 65 74 20 23 66 29 0a 09 09 20 28 69 74 65  -met #f)... (ite
89c0: 6d 2d 77 61 69 74 6f 6e 2d 6d 65 74 20 20 20 23  m-waiton-met   #
89d0: 66 29 29 0a 09 20 20 20 20 20 28 66 6f 72 2d 65  f))..     (for-e
89e0: 61 63 68 20 0a 09 20 20 20 20 20 20 28 6c 61 6d  ach ..      (lam
89f0: 62 64 61 20 28 74 65 73 74 29 0a 09 09 3b 3b 20  bda (test)...;; 
8a00: 28 69 66 20 28 65 71 75 61 6c 3f 20 77 61 69 74  (if (equal? wait
8a10: 6f 6e 74 65 73 74 2d 6e 61 6d 65 20 28 64 62 3a  ontest-name (db:
8a20: 74 65 73 74 2d 67 65 74 2d 74 65 73 74 6e 61 6d  test-get-testnam
8a30: 65 20 74 65 73 74 29 29 20 3b 3b 20 62 79 20 64  e test)) ;; by d
8a40: 65 66 69 6e 74 69 6f 6e 20 74 68 69 73 20 68 61  efintion this ha
8a50: 64 20 62 65 74 74 65 72 20 62 65 20 74 72 75 65  d better be true
8a60: 20 2e 2e 2e 0a 09 09 28 6c 65 74 2a 20 28 28 73   ......(let* ((s
8a70: 74 61 74 65 20 20 20 20 20 20 20 20 20 20 20 20  tate            
8a80: 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 73 74   (db:test-get-st
8a90: 61 74 65 20 74 65 73 74 29 29 0a 09 09 20 20 20  ate test))...   
8aa0: 20 20 20 20 28 73 74 61 74 75 73 20 20 20 20 20      (status     
8ab0: 20 20 20 20 20 20 20 28 64 62 3a 74 65 73 74 2d         (db:test-
8ac0: 67 65 74 2d 73 74 61 74 75 73 20 74 65 73 74 29  get-status test)
8ad0: 29 0a 09 09 20 20 20 20 20 20 20 28 69 74 65 6d  )...       (item
8ae0: 2d 70 61 74 68 20 20 20 20 20 20 20 20 20 28 64  -path         (d
8af0: 62 3a 74 65 73 74 2d 67 65 74 2d 69 74 65 6d 2d  b:test-get-item-
8b00: 70 61 74 68 20 74 65 73 74 29 29 0a 09 09 20 20  path test))...  
8b10: 20 20 20 20 20 28 69 73 2d 63 6f 6d 70 6c 65 74       (is-complet
8b20: 65 64 20 20 20 20 20 20 28 65 71 75 61 6c 3f 20  ed      (equal? 
8b30: 73 74 61 74 65 20 22 43 4f 4d 50 4c 45 54 45 44  state "COMPLETED
8b40: 22 29 29 0a 09 09 20 20 20 20 20 20 20 28 69 73  "))...       (is
8b50: 2d 6f 6b 20 20 20 20 20 20 20 20 20 20 20 20 20  -ok             
8b60: 28 6d 65 6d 62 65 72 20 73 74 61 74 75 73 20 27  (member status '
8b70: 28 22 50 41 53 53 22 20 22 57 41 52 4e 22 20 22  ("PASS" "WARN" "
8b80: 43 48 45 43 4b 22 20 22 57 41 49 56 45 44 22 29  CHECK" "WAIVED")
8b90: 29 29 0a 09 09 20 20 20 20 20 20 20 28 73 61 6d  ))...       (sam
8ba0: 65 2d 69 74 65 6d 70 61 74 68 20 20 20 20 20 28  e-itempath     (
8bb0: 65 71 75 61 6c 3f 20 72 65 66 2d 69 74 65 6d 2d  equal? ref-item-
8bc0: 70 61 74 68 20 69 74 65 6d 2d 70 61 74 68 29 29  path item-path))
8bd0: 29 0a 09 09 20 20 28 73 65 74 21 20 65 76 65 72  )...  (set! ever
8be0: 2d 73 65 65 6e 20 23 74 29 0a 09 09 20 20 28 63  -seen #t)...  (c
8bf0: 6f 6e 64 0a 09 09 20 20 20 3b 3b 20 63 61 73 65  ond...   ;; case
8c00: 20 31 2c 20 6e 6f 6e 2d 69 74 65 6d 20 28 70 61   1, non-item (pa
8c10: 72 65 6e 74 20 74 65 73 74 29 20 69 73 20 0a 09  rent test) is ..
8c20: 09 20 20 20 28 28 61 6e 64 20 28 65 71 75 61 6c  .   ((and (equal
8c30: 3f 20 69 74 65 6d 2d 70 61 74 68 20 22 22 29 20  ? item-path "") 
8c40: 3b 3b 20 74 68 69 73 20 69 73 20 74 68 65 20 70  ;; this is the p
8c50: 61 72 65 6e 74 20 74 65 73 74 0a 09 09 09 20 69  arent test.... i
8c60: 73 2d 63 6f 6d 70 6c 65 74 65 64 0a 09 09 09 20  s-completed.... 
8c70: 69 73 2d 6f 6b 29 0a 09 09 20 20 20 20 28 73 65  is-ok)...    (se
8c80: 74 21 20 70 61 72 65 6e 74 2d 77 61 69 74 6f 6e  t! parent-waiton
8c90: 2d 6d 65 74 20 23 74 29 29 0a 09 09 20 20 20 28  -met #t))...   (
8ca0: 28 61 6e 64 20 73 61 6d 65 2d 69 74 65 6d 70 61  (and same-itempa
8cb0: 74 68 0a 09 09 09 20 69 73 2d 63 6f 6d 70 6c 65  th.... is-comple
8cc0: 74 65 64 0a 09 09 09 20 69 73 2d 6f 6b 29 0a 09  ted.... is-ok)..
8cd0: 09 20 20 20 20 28 73 65 74 21 20 69 74 65 6d 2d  .    (set! item-
8ce0: 77 61 69 74 6f 6e 2d 6d 65 74 20 23 74 29 29 29  waiton-met #t)))
8cf0: 29 29 0a 09 20 20 20 20 20 20 74 65 73 74 73 29  ))..      tests)
8d00: 0a 09 20 20 20 20 20 28 69 66 20 28 6e 6f 74 20  ..     (if (not 
8d10: 28 6f 72 20 70 61 72 65 6e 74 2d 77 61 69 74 6f  (or parent-waito
8d20: 6e 2d 6d 65 74 20 69 74 65 6d 2d 77 61 69 74 6f  n-met item-waito
8d30: 6e 2d 6d 65 74 29 29 0a 09 09 20 28 73 65 74 21  n-met))... (set!
8d40: 20 72 65 73 75 6c 74 20 28 63 6f 6e 73 20 77 61   result (cons wa
8d50: 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 20 72 65  itontest-name re
8d60: 73 75 6c 74 29 29 29 0a 09 20 20 20 20 20 3b 3b  sult)))..     ;;
8d70: 20 69 66 20 74 68 65 20 74 65 73 74 20 69 73 20   if the test is 
8d80: 6e 6f 74 20 66 6f 75 6e 64 20 74 68 65 6e 20 63  not found then c
8d90: 6c 65 61 72 6c 79 20 74 68 65 20 77 61 69 74 6f  learly the waito
8da0: 6e 20 69 73 20 6e 6f 74 20 6d 65 74 2e 2e 2e 0a  n is not met....
8db0: 09 20 20 20 20 20 28 69 66 20 28 6e 6f 74 20 65  .     (if (not e
8dc0: 76 65 72 2d 73 65 65 6e 29 28 73 65 74 21 20 72  ver-seen)(set! r
8dd0: 65 73 75 6c 74 20 28 63 6f 6e 73 20 77 61 69 74  esult (cons wait
8de0: 6f 6e 74 65 73 74 2d 6e 61 6d 65 20 72 65 73 75  ontest-name resu
8df0: 6c 74 29 29 29 29 29 0a 09 77 61 69 74 6f 6e 73  lt)))))..waitons
8e00: 29 0a 20 20 20 20 20 20 28 64 65 6c 65 74 65 2d  ).      (delete-
8e10: 64 75 70 6c 69 63 61 74 65 73 20 72 65 73 75 6c  duplicates resul
8e20: 74 29 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d  t))))..;;=======
8e30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8e40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8e50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8e60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a  ===============.
8e70: 3b 3b 20 45 78 74 72 61 63 74 20 6f 64 73 20 66  ;; Extract ods f
8e80: 69 6c 65 20 66 72 6f 6d 20 74 68 65 20 64 62 0a  ile from the db.
8e90: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
8ea0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8eb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8ec0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8ed0: 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 72 75 6e  ========..;; run
8ee0: 73 70 61 74 74 20 69 73 20 61 20 63 6f 6d 6d 61  spatt is a comma
8ef0: 20 64 65 6c 69 6d 69 74 65 64 20 6c 69 73 74 20   delimited list 
8f00: 6f 66 20 72 75 6e 20 70 61 74 74 65 72 6e 73 0a  of run patterns.
8f10: 3b 3b 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74  ;; keypatt-alist
8f20: 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20 2a 61   must contain *a
8f30: 6c 6c 2a 20 6b 65 79 73 20 77 69 74 68 20 61 6e  ll* keys with an
8f40: 20 61 73 73 6f 63 69 61 74 65 64 20 70 61 74 74   associated patt
8f50: 65 72 6e 3a 20 27 28 20 28 22 4b 45 59 31 22 20  ern: '( ("KEY1" 
8f60: 22 25 22 29 20 2e 2e 20 29 0a 28 64 65 66 69 6e  "%") .. ).(defin
8f70: 65 20 28 64 62 3a 65 78 74 72 61 63 74 2d 6f 64  e (db:extract-od
8f80: 73 2d 66 69 6c 65 20 64 62 20 6f 75 74 70 75 74  s-file db output
8f90: 66 69 6c 65 20 6b 65 79 70 61 74 74 2d 61 6c 69  file keypatt-ali
8fa0: 73 74 20 72 75 6e 73 70 61 74 74 20 70 61 74 68  st runspatt path
8fb0: 6d 6f 64 29 0a 20 20 28 6c 65 74 2a 20 28 28 6b  mod).  (let* ((k
8fc0: 65 79 73 73 74 72 20 20 28 73 74 72 69 6e 67 2d  eysstr  (string-
8fd0: 69 6e 74 65 72 73 70 65 72 73 65 20 28 6d 61 70  intersperse (map
8fe0: 20 63 61 72 20 6b 65 79 70 61 74 74 2d 61 6c 69   car keypatt-ali
8ff0: 73 74 29 20 22 2c 22 29 29 0a 09 20 28 6b 65 79  st) ",")).. (key
9000: 71 72 79 20 20 20 28 73 74 72 69 6e 67 2d 69 6e  qry   (string-in
9010: 74 65 72 73 70 65 72 73 65 20 28 6d 61 70 20 28  tersperse (map (
9020: 6c 61 6d 62 64 61 20 28 70 29 28 63 6f 6e 63 20  lambda (p)(conc 
9030: 28 63 61 72 20 70 29 20 22 20 4c 49 4b 45 20 3f  (car p) " LIKE ?
9040: 20 22 29 29 20 6b 65 79 70 61 74 74 2d 61 6c 69   ")) keypatt-ali
9050: 73 74 29 20 22 20 41 4e 44 20 22 29 29 0a 09 20  st) " AND ")).. 
9060: 28 6e 75 6d 6b 65 79 73 20 20 28 6c 65 6e 67 74  (numkeys  (lengt
9070: 68 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 29  h keypatt-alist)
9080: 29 0a 09 20 28 74 65 73 74 2d 69 64 73 20 27 28  ).. (test-ids '(
9090: 29 29 0a 09 20 28 77 69 6e 64 6f 77 73 20 20 28  )).. (windows  (
90a0: 61 6e 64 20 70 61 74 68 6d 6f 64 20 28 73 75 62  and pathmod (sub
90b0: 73 74 72 69 6e 67 2d 69 6e 64 65 78 20 22 5c 5c  string-index "\\
90c0: 22 20 70 61 74 68 6d 6f 64 29 29 29 0a 09 20 28  " pathmod))).. (
90d0: 74 65 6d 70 64 69 72 20 20 28 63 6f 6e 63 20 22  tempdir  (conc "
90e0: 2f 74 6d 70 2f 22 20 28 63 75 72 72 65 6e 74 2d  /tmp/" (current-
90f0: 75 73 65 72 2d 6e 61 6d 65 29 20 22 2f 22 20 72  user-name) "/" r
9100: 75 6e 73 70 61 74 74 20 22 5f 22 20 28 72 61 6e  unspatt "_" (ran
9110: 64 6f 6d 20 31 30 30 30 30 29 20 22 5f 22 20 28  dom 10000) "_" (
9120: 63 75 72 72 65 6e 74 2d 70 72 6f 63 65 73 73 2d  current-process-
9130: 69 64 29 29 29 0a 09 20 28 72 75 6e 73 68 65 61  id))).. (runshea
9140: 64 65 72 20 28 61 70 70 65 6e 64 20 28 6c 69 73  der (append (lis
9150: 74 20 22 52 75 6e 20 49 64 22 20 22 52 75 6e 6e  t "Run Id" "Runn
9160: 61 6d 65 22 29 20 3b 20 30 20 31 0a 09 09 09 20  ame") ; 0 1.... 
9170: 20 20 20 20 28 6d 61 70 20 63 61 72 20 6b 65 79      (map car key
9180: 70 61 74 74 2d 61 6c 69 73 74 29 20 20 20 3b 20  patt-alist)   ; 
9190: 2b 20 4e 20 3d 20 6c 65 6e 67 74 68 20 6b 65 79  + N = length key
91a0: 70 61 74 74 2d 61 6c 69 73 74 0a 09 09 09 20 20  patt-alist....  
91b0: 20 20 20 28 6c 69 73 74 20 22 54 65 73 74 6e 61     (list "Testna
91c0: 6d 65 22 20 20 20 20 20 20 20 20 20 20 3b 20 32  me"          ; 2
91d0: 0a 09 09 09 09 20 20 20 22 49 74 65 6d 20 50 61  .....   "Item Pa
91e0: 74 68 22 20 20 20 20 20 20 20 20 20 3b 20 33 20  th"         ; 3 
91f0: 0a 09 09 09 09 20 20 20 22 44 65 73 63 72 69 70  .....   "Descrip
9200: 74 69 6f 6e 22 20 20 20 20 20 20 20 3b 20 34 20  tion"       ; 4 
9210: 0a 09 09 09 09 20 20 20 22 53 74 61 74 65 22 20  .....   "State" 
9220: 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 35 20              ; 5 
9230: 0a 09 09 09 09 20 20 20 22 53 74 61 74 75 73 22  .....   "Status"
9240: 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 36 20              ; 6 
9250: 20 0a 09 09 09 09 20 20 20 22 46 69 6e 61 6c 20   .....   "Final 
9260: 4c 6f 67 22 20 20 20 20 20 20 20 20 20 3b 20 37  Log"         ; 7
9270: 20 0a 09 09 09 09 20 20 20 22 52 75 6e 20 44 75   .....   "Run Du
9280: 72 61 74 69 6f 6e 22 20 20 20 20 20 20 3b 20 38  ration"      ; 8
9290: 20 0a 09 09 09 09 20 20 20 22 57 68 65 6e 20 52   .....   "When R
92a0: 75 6e 22 20 20 20 20 20 20 20 20 20 20 3b 20 39  un"          ; 9
92b0: 20 0a 09 09 09 09 20 20 20 22 54 61 67 73 22 20   .....   "Tags" 
92c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 31               ; 1
92d0: 30 0a 09 09 09 09 20 20 20 22 52 75 6e 20 4f 77  0.....   "Run Ow
92e0: 6e 65 72 22 20 20 20 20 20 20 20 20 20 3b 20 31  ner"         ; 1
92f0: 31 0a 09 09 09 09 20 20 20 22 43 6f 6d 6d 65 6e  1.....   "Commen
9300: 74 22 20 20 20 20 20 20 20 20 20 20 20 3b 20 31  t"           ; 1
9310: 32 0a 09 09 09 09 20 20 20 22 41 75 74 68 6f 72  2.....   "Author
9320: 22 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 31  "            ; 1
9330: 33 0a 09 09 09 09 20 20 20 22 54 65 73 74 20 4f  3.....   "Test O
9340: 77 6e 65 72 22 20 20 20 20 20 20 20 20 3b 20 31  wner"        ; 1
9350: 34 0a 09 09 09 09 20 20 20 22 52 65 76 69 65 77  4.....   "Review
9360: 65 64 22 20 20 20 20 20 20 20 20 20 20 3b 20 31  ed"          ; 1
9370: 35 0a 09 09 09 09 20 20 20 22 44 69 73 6b 66 72  5.....   "Diskfr
9380: 65 65 22 20 20 20 20 20 20 20 20 20 20 3b 20 31  ee"          ; 1
9390: 36 0a 09 09 09 09 20 20 20 22 55 6e 61 6d 65 22  6.....   "Uname"
93a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 31               ; 1
93b0: 37 0a 09 09 09 09 20 20 20 22 52 75 6e 64 69 72  7.....   "Rundir
93c0: 22 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 31  "            ; 1
93d0: 38 0a 09 09 09 09 20 20 20 22 48 6f 73 74 22 20  8.....   "Host" 
93e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 31               ; 1
93f0: 39 0a 09 09 09 09 20 20 20 22 43 70 75 20 4c 6f  9.....   "Cpu Lo
9400: 61 64 22 20 20 20 20 20 20 20 20 20 20 3b 20 32  ad"          ; 2
9410: 30 0a 09 09 09 09 20 20 20 29 29 29 0a 09 20 28  0.....   ))).. (
9420: 72 65 73 75 6c 74 73 20 28 6c 69 73 74 20 72 75  results (list ru
9430: 6e 73 68 65 61 64 65 72 29 29 09 09 09 20 0a 09  nsheader))... ..
9440: 20 28 74 65 73 74 64 61 74 61 2d 68 65 61 64 65   (testdata-heade
9450: 72 20 28 6c 69 73 74 20 22 52 75 6e 20 49 64 22  r (list "Run Id"
9460: 20 22 54 65 73 74 6e 61 6d 65 22 20 22 49 74 65   "Testname" "Ite
9470: 6d 20 50 61 74 68 22 20 22 43 61 74 65 67 6f 72  m Path" "Categor
9480: 79 22 20 22 56 61 72 69 61 62 6c 65 22 20 22 56  y" "Variable" "V
9490: 61 6c 75 65 22 20 22 45 78 70 65 63 74 65 64 22  alue" "Expected"
94a0: 20 22 54 6f 6c 22 20 22 55 6e 69 74 73 22 20 22   "Tol" "Units" "
94b0: 53 74 61 74 75 73 22 20 22 43 6f 6d 6d 65 6e 74  Status" "Comment
94c0: 22 29 29 0a 09 20 28 6d 61 69 6e 71 72 79 20 28  ")).. (mainqry (
94d0: 63 6f 6e 63 20 22 53 45 4c 45 43 54 0a 20 20 20  conc "SELECT.   
94e0: 20 20 20 20 20 20 20 20 20 20 20 74 2e 74 65 73             t.tes
94f0: 74 6e 61 6d 65 2c 72 2e 69 64 2c 72 75 6e 6e 61  tname,r.id,runna
9500: 6d 65 2c 22 20 6b 65 79 73 73 74 72 20 22 2c 74  me," keysstr ",t
9510: 2e 74 65 73 74 6e 61 6d 65 2c 0a 20 20 20 20 20  .testname,.     
9520: 20 20 20 20 20 20 20 20 20 74 2e 69 74 65 6d 5f           t.item_
9530: 70 61 74 68 2c 74 6d 2e 64 65 73 63 72 69 70 74  path,tm.descript
9540: 69 6f 6e 2c 74 2e 73 74 61 74 65 2c 74 2e 73 74  ion,t.state,t.st
9550: 61 74 75 73 2c 0a 20 20 20 20 20 20 20 20 20 20  atus,.          
9560: 20 20 20 20 66 69 6e 61 6c 5f 6c 6f 67 66 2c 72      final_logf,r
9570: 75 6e 5f 64 75 72 61 74 69 6f 6e 2c 20 0a 20 20  un_duration, .  
9580: 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 66              strf
9590: 74 69 6d 65 28 27 25 6d 2f 25 64 2f 25 59 20 25  time('%m/%d/%Y %
95a0: 48 3a 25 4d 3a 25 53 27 2c 64 61 74 65 74 69 6d  H:%M:%S',datetim
95b0: 65 28 74 2e 65 76 65 6e 74 5f 74 69 6d 65 2c 27  e(t.event_time,'
95c0: 75 6e 69 78 65 70 6f 63 68 27 29 2c 27 6c 6f 63  unixepoch'),'loc
95d0: 61 6c 74 69 6d 65 27 29 2c 0a 20 20 20 20 20 20  altime'),.      
95e0: 20 20 20 20 20 20 20 20 74 6d 2e 74 61 67 73 2c          tm.tags,
95f0: 72 2e 6f 77 6e 65 72 2c 74 2e 63 6f 6d 6d 65 6e  r.owner,t.commen
9600: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
9610: 20 61 75 74 68 6f 72 2c 0a 20 20 20 20 20 20 20   author,.       
9620: 20 20 20 20 20 20 20 74 6d 2e 6f 77 6e 65 72 2c         tm.owner,
9630: 72 65 76 69 65 77 65 64 2c 0a 20 20 20 20 20 20  reviewed,.      
9640: 20 20 20 20 20 20 20 20 64 69 73 6b 66 72 65 65          diskfree
9650: 2c 75 6e 61 6d 65 2c 72 75 6e 64 69 72 2c 0a 20  ,uname,rundir,. 
9660: 20 20 20 20 20 20 20 20 20 20 20 20 20 68 6f 73               hos
9670: 74 2c 63 70 75 6c 6f 61 64 0a 20 20 20 20 20 20  t,cpuload.      
9680: 20 20 20 20 20 20 46 52 4f 4d 20 74 65 73 74 73        FROM tests
9690: 20 41 53 20 74 20 4a 4f 49 4e 20 72 75 6e 73 20   AS t JOIN runs 
96a0: 41 53 20 72 20 4f 4e 20 74 2e 72 75 6e 5f 69 64  AS r ON t.run_id
96b0: 3d 72 2e 69 64 20 4a 4f 49 4e 20 74 65 73 74 5f  =r.id JOIN test_
96c0: 6d 65 74 61 20 41 53 20 74 6d 20 4f 4e 20 74 6d  meta AS tm ON tm
96d0: 2e 74 65 73 74 6e 61 6d 65 3d 74 2e 74 65 73 74  .testname=t.test
96e0: 6e 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 20  name.           
96f0: 20 57 48 45 52 45 20 72 75 6e 6e 61 6d 65 20 4c   WHERE runname L
9700: 49 4b 45 20 3f 20 41 4e 44 20 22 20 6b 65 79 71  IKE ? AND " keyq
9710: 72 79 20 22 3b 22 29 29 29 0a 20 20 20 20 28 64  ry ";"))).    (d
9720: 65 62 75 67 3a 70 72 69 6e 74 20 32 20 22 55 73  ebug:print 2 "Us
9730: 69 6e 67 20 22 20 74 65 6d 70 64 69 72 20 22 20  ing " tempdir " 
9740: 66 6f 72 20 63 6f 6e 73 74 72 75 63 74 69 6e 67  for constructing
9750: 20 74 68 65 20 6f 64 73 20 66 69 6c 65 2e 20 6b   the ods file. k
9760: 65 79 71 72 79 3a 20 22 20 6b 65 79 71 72 79 20  eyqry: " keyqry 
9770: 22 20 6b 65 79 73 74 72 3a 20 22 20 6b 65 79 73  " keystr: " keys
9780: 73 74 72 20 22 20 77 69 74 68 20 6b 65 79 73 3a  str " with keys:
9790: 20 22 20 28 6d 61 70 20 63 61 64 72 20 6b 65 79   " (map cadr key
97a0: 70 61 74 74 2d 61 6c 69 73 74 29 0a 09 09 20 22  patt-alist)... "
97b0: 5c 6e 20 20 20 20 20 20 6d 61 69 6e 71 72 79 3a  \n      mainqry:
97c0: 20 22 20 6d 61 69 6e 71 72 79 29 0a 20 20 20 20   " mainqry).    
97d0: 3b 3b 20 22 45 78 70 65 63 74 65 64 20 56 61 6c  ;; "Expected Val
97e0: 75 65 22 0a 20 20 20 20 3b 3b 20 22 56 61 6c 75  ue".    ;; "Valu
97f0: 65 20 46 6f 75 6e 64 22 0a 20 20 20 20 3b 3b 20  e Found".    ;; 
9800: 22 54 6f 6c 65 72 61 6e 63 65 22 0a 20 20 20 20  "Tolerance".    
9810: 28 61 70 70 6c 79 20 73 71 6c 69 74 65 33 3a 66  (apply sqlite3:f
9820: 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 09 20 20 20  or-each-row..   
9830: 28 6c 61 6d 62 64 61 20 28 74 65 73 74 2d 69 64  (lambda (test-id
9840: 20 2e 20 62 29 0a 09 20 20 20 20 20 28 73 65 74   . b)..     (set
9850: 21 20 74 65 73 74 2d 69 64 73 20 28 63 6f 6e 73  ! test-ids (cons
9860: 20 74 65 73 74 2d 69 64 20 74 65 73 74 2d 69 64   test-id test-id
9870: 73 29 29 20 20 20 3b 3b 20 74 65 73 74 2d 69 64  s))   ;; test-id
9880: 20 69 73 20 6e 6f 77 20 74 65 73 74 6e 61 6d 65   is now testname
9890: 0a 09 20 20 20 20 20 28 73 65 74 21 20 72 65 73  ..     (set! res
98a0: 75 6c 74 73 20 28 61 70 70 65 6e 64 20 72 65 73  ults (append res
98b0: 75 6c 74 73 20 3b 3b 20 6e 6f 74 65 2c 20 64 72  ults ;; note, dr
98c0: 6f 70 20 74 68 65 20 74 65 73 74 2d 69 64 0a 09  op the test-id..
98d0: 09 09 09 20 20 20 28 6c 69 73 74 0a 09 09 09 09  ...   (list.....
98e0: 20 20 20 20 28 69 66 20 70 61 74 68 6d 6f 64 0a      (if pathmod.
98f0: 09 09 09 09 09 28 6c 65 74 2a 20 28 28 76 62 20  .....(let* ((vb 
9900: 20 20 20 20 20 20 20 28 61 70 70 6c 79 20 76 65         (apply ve
9910: 63 74 6f 72 20 62 29 29 0a 09 09 09 09 09 20 20  ctor b))......  
9920: 20 20 20 20 20 28 6b 65 79 76 61 6c 73 20 20 20       (keyvals   
9930: 28 6c 65 74 20 6c 6f 6f 70 20 28 28 69 20 20 20  (let loop ((i   
9940: 20 30 29 0a 09 09 09 09 09 09 09 09 20 20 20 20   0).........    
9950: 20 28 72 65 73 20 27 28 29 29 29 0a 09 09 09 09   (res '())).....
9960: 09 09 09 20 20 20 20 28 69 66 20 28 3e 3d 20 69  ...    (if (>= i
9970: 20 6e 75 6d 6b 65 79 73 29 0a 09 09 09 09 09 09   numkeys).......
9980: 09 09 72 65 73 0a 09 09 09 09 09 09 09 09 28 6c  ..res.........(l
9990: 6f 6f 70 20 28 2b 20 69 20 31 29 0a 09 09 09 09  oop (+ i 1).....
99a0: 09 09 09 09 20 20 20 20 20 20 28 61 70 70 65 6e  ....      (appen
99b0: 64 20 72 65 73 20 28 6c 69 73 74 20 28 76 65 63  d res (list (vec
99c0: 74 6f 72 2d 72 65 66 20 76 62 20 28 2b 20 69 20  tor-ref vb (+ i 
99d0: 32 29 29 29 29 29 29 29 29 0a 09 09 09 09 09 20  2))))))))...... 
99e0: 20 20 20 20 20 20 28 72 75 6e 6e 61 6d 65 20 20        (runname  
99f0: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62 20   (vector-ref vb 
9a00: 31 29 29 0a 09 09 09 09 09 20 20 20 20 20 20 20  1))......       
9a10: 28 74 65 73 74 6e 61 6d 65 20 20 28 76 65 63 74  (testname  (vect
9a20: 6f 72 2d 72 65 66 20 76 62 20 28 2b 20 20 32 20  or-ref vb (+  2 
9a30: 6e 75 6d 6b 65 79 73 29 29 29 0a 09 09 09 09 09  numkeys)))......
9a40: 20 20 20 20 20 20 20 28 69 74 65 6d 2d 70 61 74         (item-pat
9a50: 68 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62  h (vector-ref vb
9a60: 20 28 2b 20 20 33 20 6e 75 6d 6b 65 79 73 29 29   (+  3 numkeys))
9a70: 29 0a 09 09 09 09 09 20 20 20 20 20 20 20 28 66  )......       (f
9a80: 69 6e 61 6c 2d 6c 6f 67 20 28 76 65 63 74 6f 72  inal-log (vector
9a90: 2d 72 65 66 20 76 62 20 28 2b 20 20 37 20 6e 75  -ref vb (+  7 nu
9aa0: 6d 6b 65 79 73 29 29 29 0a 09 09 09 09 09 20 20  mkeys)))......  
9ab0: 20 20 20 20 20 28 72 75 6e 2d 64 69 72 20 20 20       (run-dir   
9ac0: 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62 20 28  (vector-ref vb (
9ad0: 2b 20 31 38 20 6e 75 6d 6b 65 79 73 29 29 29 0a  + 18 numkeys))).
9ae0: 09 09 09 09 09 20 20 20 20 20 20 20 28 6c 6f 67  .....       (log
9af0: 2d 66 70 61 74 68 20 28 63 6f 6e 63 20 72 75 6e  -fpath (conc run
9b00: 2d 64 69 72 20 22 2f 22 20 20 66 69 6e 61 6c 2d  -dir "/"  final-
9b10: 6c 6f 67 29 29 29 20 3b 3b 20 28 73 74 72 69 6e  log))) ;; (strin
9b20: 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 6b 65  g-intersperse ke
9b30: 79 76 61 6c 73 20 22 2f 22 29 20 22 2f 22 20 74  yvals "/") "/" t
9b40: 65 73 74 6e 61 6d 65 20 22 2f 22 20 69 74 65 6d  estname "/" item
9b50: 2d 70 61 74 68 20 22 2f 22 0a 09 09 09 09 09 20  -path "/"...... 
9b60: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20   (debug:print 4 
9b70: 22 6c 6f 67 3a 20 22 20 6c 6f 67 2d 66 70 61 74  "log: " log-fpat
9b80: 68 20 22 20 65 78 69 73 74 73 3a 20 22 20 28 66  h " exists: " (f
9b90: 69 6c 65 2d 65 78 69 73 74 73 3f 20 6c 6f 67 2d  ile-exists? log-
9ba0: 66 70 61 74 68 29 29 0a 09 09 09 09 09 20 20 28  fpath))......  (
9bb0: 76 65 63 74 6f 72 2d 73 65 74 21 20 76 62 20 28  vector-set! vb (
9bc0: 2b 20 37 20 6e 75 6d 6b 65 79 73 29 20 28 69 66  + 7 numkeys) (if
9bd0: 20 28 66 69 6c 65 2d 65 78 69 73 74 73 3f 20 6c   (file-exists? l
9be0: 6f 67 2d 66 70 61 74 68 29 0a 09 09 09 09 09 09  og-fpath).......
9bf0: 09 09 09 20 20 20 20 28 6c 65 74 20 28 28 6e 65  ...    (let ((ne
9c00: 77 70 61 74 68 20 28 63 6f 6e 63 20 70 61 74 68  wpath (conc path
9c10: 6d 6f 64 20 22 2f 22 0a 09 09 09 09 09 09 09 09  mod "/".........
9c20: 09 09 09 09 20 28 73 74 72 69 6e 67 2d 69 6e 74  .... (string-int
9c30: 65 72 73 70 65 72 73 65 20 6b 65 79 76 61 6c 73  ersperse keyvals
9c40: 20 22 2f 22 29 0a 09 09 09 09 09 09 09 09 09 09   "/")...........
9c50: 09 09 20 22 2f 22 20 72 75 6e 6e 61 6d 65 20 22  .. "/" runname "
9c60: 2f 22 20 74 65 73 74 6e 61 6d 65 20 22 2f 22 0a  /" testname "/".
9c70: 09 09 09 09 09 09 09 09 09 09 09 09 20 28 69 66  ............ (if
9c80: 20 28 73 74 72 69 6e 67 3d 3f 20 69 74 65 6d 2d   (string=? item-
9c90: 70 61 74 68 20 22 22 29 20 22 22 20 28 63 6f 6e  path "") "" (con
9ca0: 63 20 22 2f 22 20 69 74 65 6d 2d 70 61 74 68 29  c "/" item-path)
9cb0: 29 0a 09 09 09 09 09 09 09 09 09 09 09 09 20 66  )............. f
9cc0: 69 6e 61 6c 2d 6c 6f 67 29 29 29 0a 09 09 09 09  inal-log))).....
9cd0: 09 09 09 09 09 20 20 20 20 20 20 3b 3b 20 66 6f  .....      ;; fo
9ce0: 72 20 6e 6f 77 20 74 68 72 6f 77 20 61 77 61 79  r now throw away
9cf0: 20 6e 65 77 70 61 74 68 20 61 6e 64 20 75 73 65   newpath and use
9d00: 20 74 68 65 20 6c 6f 67 2d 66 70 61 74 68 20 63   the log-fpath c
9d10: 6f 6e 63 27 64 20 77 69 74 68 20 70 61 74 68 6d  onc'd with pathm
9d20: 6f 64 0a 09 09 09 09 09 09 09 09 09 20 20 20 20  od..........    
9d30: 20 20 28 73 65 74 21 20 6e 65 77 70 61 74 68 20    (set! newpath 
9d40: 28 63 6f 6e 63 20 70 61 74 68 6d 6f 64 20 6c 6f  (conc pathmod lo
9d50: 67 2d 66 70 61 74 68 29 29 0a 09 09 09 09 09 09  g-fpath)).......
9d60: 09 09 09 20 20 20 20 20 20 28 69 66 20 77 69 6e  ...      (if win
9d70: 64 6f 77 73 20 28 73 74 72 69 6e 67 2d 74 72 61  dows (string-tra
9d80: 6e 73 6c 61 74 65 20 6e 65 77 70 61 74 68 20 22  nslate newpath "
9d90: 2f 22 20 22 5c 5c 22 29 20 6e 65 77 70 61 74 68  /" "\\") newpath
9da0: 29 29 0a 09 09 09 09 09 09 09 09 09 20 20 20 20  ))..........    
9db0: 28 69 66 20 28 3e 20 2a 76 65 72 62 6f 73 69 74  (if (> *verbosit
9dc0: 79 2a 20 31 29 0a 09 09 09 09 09 09 09 09 09 09  y* 1)...........
9dd0: 28 63 6f 6e 63 20 66 69 6e 61 6c 2d 6c 6f 67 20  (conc final-log 
9de0: 22 20 6e 6f 74 2d 66 6f 75 6e 64 22 29 0a 09 09  " not-found")...
9df0: 09 09 09 09 09 09 09 09 22 22 29 29 29 0a 09 09  ........"")))...
9e00: 09 09 09 20 20 28 76 65 63 74 6f 72 2d 3e 6c 69  ...  (vector->li
9e10: 73 74 20 76 62 29 29 0a 09 09 09 09 09 62 29 29  st vb))......b))
9e20: 29 29 29 0a 09 20 20 20 64 62 0a 09 20 20 20 6d  )))..   db..   m
9e30: 61 69 6e 71 72 79 0a 09 20 20 20 72 75 6e 73 70  ainqry..   runsp
9e40: 61 74 74 20 28 6d 61 70 20 63 61 64 72 20 6b 65  att (map cadr ke
9e50: 79 70 61 74 74 2d 61 6c 69 73 74 29 29 0a 20 20  ypatt-alist)).  
9e60: 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 32    (debug:print 2
9e70: 20 22 46 6f 75 6e 64 20 22 20 28 6c 65 6e 67 74   "Found " (lengt
9e80: 68 20 74 65 73 74 2d 69 64 73 29 20 22 20 72 65  h test-ids) " re
9e90: 63 6f 72 64 73 22 29 0a 20 20 20 20 28 73 65 74  cords").    (set
9ea0: 21 20 72 65 73 75 6c 74 73 20 28 6c 69 73 74 20  ! results (list 
9eb0: 28 63 6f 6e 73 20 22 52 75 6e 73 22 20 72 65 73  (cons "Runs" res
9ec0: 75 6c 74 73 29 29 29 0a 20 20 20 20 3b 3b 20 6e  ults))).    ;; n
9ed0: 6f 77 2c 20 66 6f 72 20 65 61 63 68 20 74 65 73  ow, for each tes
9ee0: 74 2c 20 63 6f 6c 6c 65 63 74 20 74 68 65 20 74  t, collect the t
9ef0: 65 73 74 5f 64 61 74 61 20 69 6e 66 6f 20 61 6e  est_data info an
9f00: 64 20 61 64 64 20 61 20 6e 65 77 20 73 68 65 65  d add a new shee
9f10: 74 0a 20 20 20 20 28 66 6f 72 2d 65 61 63 68 0a  t.    (for-each.
9f20: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 74 65       (lambda (te
9f30: 73 74 2d 69 64 29 0a 20 20 20 20 20 20 20 28 6c  st-id).       (l
9f40: 65 74 20 28 28 74 65 73 74 2d 64 61 74 61 20 28  et ((test-data (
9f50: 6c 69 73 74 20 74 65 73 74 64 61 74 61 2d 68 65  list testdata-he
9f60: 61 64 65 72 29 29 0a 09 20 20 20 20 20 28 63 75  ader))..     (cu
9f70: 72 72 2d 74 65 73 74 2d 6e 61 6d 65 20 23 66 29  rr-test-name #f)
9f80: 29 0a 09 20 28 73 71 6c 69 74 65 33 3a 66 6f 72  ).. (sqlite3:for
9f90: 2d 65 61 63 68 2d 72 6f 77 0a 09 20 20 28 6c 61  -each-row..  (la
9fa0: 6d 62 64 61 20 28 72 75 6e 2d 69 64 20 74 65 73  mbda (run-id tes
9fb0: 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 20  tname item-path 
9fc0: 63 61 74 65 67 6f 72 79 20 76 61 72 69 61 62 6c  category variabl
9fd0: 65 20 76 61 6c 75 65 20 65 78 70 65 63 74 65 64  e value expected
9fe0: 20 74 6f 6c 20 75 6e 69 74 73 20 73 74 61 74 75   tol units statu
9ff0: 73 20 63 6f 6d 6d 65 6e 74 29 0a 09 20 20 20 20  s comment)..    
a000: 28 73 65 74 21 20 63 75 72 72 2d 74 65 73 74 2d  (set! curr-test-
a010: 6e 61 6d 65 20 74 65 73 74 6e 61 6d 65 29 0a 09  name testname)..
a020: 20 20 20 20 28 73 65 74 21 20 74 65 73 74 2d 64      (set! test-d
a030: 61 74 61 20 28 61 70 70 65 6e 64 20 74 65 73 74  ata (append test
a040: 2d 64 61 74 61 20 28 6c 69 73 74 20 28 6c 69 73  -data (list (lis
a050: 74 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d  t run-id testnam
a060: 65 20 69 74 65 6d 2d 70 61 74 68 20 63 61 74 65  e item-path cate
a070: 67 6f 72 79 20 76 61 72 69 61 62 6c 65 20 76 61  gory variable va
a080: 6c 75 65 20 65 78 70 65 63 74 65 64 20 74 6f 6c  lue expected tol
a090: 20 75 6e 69 74 73 20 73 74 61 74 75 73 20 63 6f   units status co
a0a0: 6d 6d 65 6e 74 29 29 29 29 29 0a 09 20 20 64 62  mment)))))..  db
a0b0: 20 0a 09 20 20 3b 3b 20 22 53 45 4c 45 43 54 20   ..  ;; "SELECT 
a0c0: 72 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d 65 2c  run_id,testname,
a0d0: 69 74 65 6d 5f 70 61 74 68 2c 63 61 74 65 67 6f  item_path,catego
a0e0: 72 79 2c 76 61 72 69 61 62 6c 65 2c 74 64 2e 76  ry,variable,td.v
a0f0: 61 6c 75 65 20 41 53 20 76 61 6c 75 65 2c 65 78  alue AS value,ex
a100: 70 65 63 74 65 64 2c 74 6f 6c 2c 75 6e 69 74 73  pected,tol,units
a110: 2c 74 64 2e 73 74 61 74 75 73 20 41 53 20 73 74  ,td.status AS st
a120: 61 74 75 73 2c 74 64 2e 63 6f 6d 6d 65 6e 74 20  atus,td.comment 
a130: 41 53 20 63 6f 6d 6d 65 6e 74 20 46 52 4f 4d 20  AS comment FROM 
a140: 74 65 73 74 5f 64 61 74 61 20 41 53 20 74 64 20  test_data AS td 
a150: 49 4e 4e 45 52 20 4a 4f 49 4e 20 74 65 73 74 73  INNER JOIN tests
a160: 20 4f 4e 20 74 65 73 74 73 2e 69 64 3d 74 64 2e   ON tests.id=td.
a170: 74 65 73 74 5f 69 64 20 57 48 45 52 45 20 74 65  test_id WHERE te
a180: 73 74 5f 69 64 3d 3f 3b 22 0a 09 20 20 22 53 45  st_id=?;"..  "SE
a190: 4c 45 43 54 20 72 75 6e 5f 69 64 2c 74 65 73 74  LECT run_id,test
a1a0: 6e 61 6d 65 2c 69 74 65 6d 5f 70 61 74 68 2c 63  name,item_path,c
a1b0: 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62 6c 65  ategory,variable
a1c0: 2c 74 64 2e 76 61 6c 75 65 20 41 53 20 76 61 6c  ,td.value AS val
a1d0: 75 65 2c 74 64 2e 65 78 70 65 63 74 65 64 2c 74  ue,td.expected,t
a1e0: 64 2e 74 6f 6c 2c 74 64 2e 75 6e 69 74 73 2c 74  d.tol,td.units,t
a1f0: 64 2e 73 74 61 74 75 73 20 41 53 20 73 74 61 74  d.status AS stat
a200: 75 73 2c 74 64 2e 63 6f 6d 6d 65 6e 74 20 41 53  us,td.comment AS
a210: 20 63 6f 6d 6d 65 6e 74 20 46 52 4f 4d 20 74 65   comment FROM te
a220: 73 74 5f 64 61 74 61 20 41 53 20 74 64 20 49 4e  st_data AS td IN
a230: 4e 45 52 20 4a 4f 49 4e 20 74 65 73 74 73 20 4f  NER JOIN tests O
a240: 4e 20 74 65 73 74 73 2e 69 64 3d 74 64 2e 74 65  N tests.id=td.te
a250: 73 74 5f 69 64 20 57 48 45 52 45 20 74 65 73 74  st_id WHERE test
a260: 6e 61 6d 65 3d 3f 3b 22 0a 09 20 20 74 65 73 74  name=?;"..  test
a270: 2d 69 64 29 0a 09 20 28 69 66 20 63 75 72 72 2d  -id).. (if curr-
a280: 74 65 73 74 2d 6e 61 6d 65 0a 09 20 20 20 20 20  test-name..     
a290: 28 73 65 74 21 20 72 65 73 75 6c 74 73 20 28 61  (set! results (a
a2a0: 70 70 65 6e 64 20 72 65 73 75 6c 74 73 20 28 6c  ppend results (l
a2b0: 69 73 74 20 28 63 6f 6e 73 20 63 75 72 72 2d 74  ist (cons curr-t
a2c0: 65 73 74 2d 6e 61 6d 65 20 74 65 73 74 2d 64 61  est-name test-da
a2d0: 74 61 29 29 29 29 29 0a 09 20 29 29 0a 20 20 20  ta))))).. )).   
a2e0: 20 20 28 73 6f 72 74 20 28 64 65 6c 65 74 65 2d    (sort (delete-
a2f0: 64 75 70 6c 69 63 61 74 65 73 20 74 65 73 74 2d  duplicates test-
a300: 69 64 73 29 20 73 74 72 69 6e 67 3c 3d 29 29 0a  ids) string<=)).
a310: 20 20 20 20 28 73 79 73 74 65 6d 20 28 63 6f 6e      (system (con
a320: 63 20 22 6d 6b 64 69 72 20 2d 70 20 22 20 74 65  c "mkdir -p " te
a330: 6d 70 64 69 72 29 29 0a 20 20 20 20 3b 3b 20 28  mpdir)).    ;; (
a340: 70 70 20 72 65 73 75 6c 74 73 29 0a 20 20 20 20  pp results).    
a350: 28 6f 64 73 3a 6c 69 73 74 2d 3e 6f 64 73 20 0a  (ods:list->ods .
a360: 20 20 20 20 20 74 65 6d 70 64 69 72 0a 20 20 20       tempdir.   
a370: 20 20 28 69 66 20 28 73 74 72 69 6e 67 2d 6d 61    (if (string-ma
a380: 74 63 68 20 28 72 65 67 65 78 70 20 22 5e 5b 2f  tch (regexp "^[/
a390: 7e 5d 2b 2e 2a 22 29 20 6f 75 74 70 75 74 66 69  ~]+.*") outputfi
a3a0: 6c 65 29 20 3b 3b 20 66 75 6c 6c 20 70 61 74 68  le) ;; full path
a3b0: 3f 0a 09 20 6f 75 74 70 75 74 66 69 6c 65 0a 09  ?.. outputfile..
a3c0: 20 28 62 65 67 69 6e 0a 09 20 20 20 28 64 65 62   (begin..   (deb
a3d0: 75 67 3a 70 72 69 6e 74 20 30 20 22 57 41 52 4e  ug:print 0 "WARN
a3e0: 49 4e 47 3a 20 70 61 74 68 20 67 69 76 65 6e 2c  ING: path given,
a3f0: 20 22 20 6f 75 74 70 75 74 66 69 6c 65 20 22 20   " outputfile " 
a400: 69 73 20 72 65 6c 61 74 69 76 65 2c 20 70 72 65  is relative, pre
a410: 66 69 78 69 6e 67 20 77 69 74 68 20 63 75 72 72  fixing with curr
a420: 65 6e 74 20 64 69 72 65 63 74 6f 72 79 22 29 0a  ent directory").
a430: 09 20 20 20 28 63 6f 6e 63 20 28 63 75 72 72 65  .   (conc (curre
a440: 6e 74 2d 64 69 72 65 63 74 6f 72 79 29 20 22 2f  nt-directory) "/
a450: 22 20 6f 75 74 70 75 74 66 69 6c 65 29 29 29 0a  " outputfile))).
a460: 20 20 20 20 20 72 65 73 75 6c 74 73 29 0a 20 20       results).  
a470: 20 20 3b 3b 20 62 72 75 74 61 6c 20 63 6c 65 61    ;; brutal clea
a480: 6e 20 75 70 0a 20 20 20 20 28 73 79 73 74 65 6d  n up.    (system
a490: 20 22 72 6d 20 2d 72 66 20 74 65 6d 70 64 69 72   "rm -rf tempdir
a4a0: 22 29 29 29 0a 0a 3b 3b 20 28 64 62 3a 65 78 74  ")))..;; (db:ext
a4b0: 72 61 63 74 2d 6f 64 73 2d 66 69 6c 65 20 64 62  ract-ods-file db
a4c0: 20 22 6f 75 74 70 75 74 66 69 6c 65 2e 6f 64 73   "outputfile.ods
a4d0: 22 20 27 28 28 22 73 79 73 6e 61 6d 65 22 20 22  " '(("sysname" "
a4e0: 25 22 29 28 22 66 73 6e 61 6d 65 22 20 22 25 22  %")("fsname" "%"
a4f0: 29 28 22 64 61 74 61 70 61 74 68 22 20 22 25 22  )("datapath" "%"
a500: 29 29 20 22 25 22 29 0a                          )) "%").