Megatest

Hex Artifact Content
Login

Artifact 6268431c21aa8c106f705d17484c91fa0089980b:


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 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ..;;============
5570: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5580: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5590: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
55a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 54 65  ==========.;; Te
55b0: 73 74 73 20 6d 65 74 61 20 64 61 74 61 0a 3b 3b  sts meta data.;;
55c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
55d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
55e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
55f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5600: 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 72 65 61 64 20  ======..;; read 
5610: 74 68 65 20 72 65 63 6f 72 64 20 67 69 76 65 6e  the record given
5620: 20 61 20 74 65 73 74 6e 61 6d 65 0a 28 64 65 66   a testname.(def
5630: 69 6e 65 20 28 64 62 3a 74 65 73 74 6d 65 74 61  ine (db:testmeta
5640: 2d 67 65 74 2d 72 65 63 6f 72 64 20 64 62 20 74  -get-record db t
5650: 65 73 74 6e 61 6d 65 29 0a 20 20 28 6c 65 74 20  estname).  (let 
5660: 28 28 72 65 73 20 23 66 29 29 0a 20 20 20 20 28  ((res #f)).    (
5670: 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68  sqlite3:for-each
5680: 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 64  -row.     (lambd
5690: 61 20 28 69 64 20 74 65 73 74 6e 61 6d 65 20 61  a (id testname a
56a0: 75 74 68 6f 72 20 6f 77 6e 65 72 20 64 65 73 63  uthor owner desc
56b0: 72 69 70 74 69 6f 6e 20 72 65 76 69 65 77 65 64  ription reviewed
56c0: 20 69 74 65 72 61 74 65 64 20 61 76 67 5f 72 75   iterated avg_ru
56d0: 6e 74 69 6d 65 20 61 76 67 5f 64 69 73 6b 20 74  ntime avg_disk t
56e0: 61 67 73 29 0a 20 20 20 20 20 20 20 28 73 65 74  ags).       (set
56f0: 21 20 72 65 73 20 28 76 65 63 74 6f 72 20 69 64  ! res (vector id
5700: 20 74 65 73 74 6e 61 6d 65 20 61 75 74 68 6f 72   testname author
5710: 20 6f 77 6e 65 72 20 64 65 73 63 72 69 70 74 69   owner descripti
5720: 6f 6e 20 72 65 76 69 65 77 65 64 20 69 74 65 72  on reviewed iter
5730: 61 74 65 64 20 61 76 67 5f 72 75 6e 74 69 6d 65  ated avg_runtime
5740: 20 61 76 67 5f 64 69 73 6b 20 74 61 67 73 29 29   avg_disk tags))
5750: 29 0a 20 20 20 20 20 64 62 20 22 53 45 4c 45 43  ).     db "SELEC
5760: 54 20 69 64 2c 74 65 73 74 6e 61 6d 65 2c 61 75  T id,testname,au
5770: 74 68 6f 72 2c 6f 77 6e 65 72 2c 64 65 73 63 72  thor,owner,descr
5780: 69 70 74 69 6f 6e 2c 72 65 76 69 65 77 65 64 2c  iption,reviewed,
5790: 69 74 65 72 61 74 65 64 2c 61 76 67 5f 72 75 6e  iterated,avg_run
57a0: 74 69 6d 65 2c 61 76 67 5f 64 69 73 6b 2c 74 61  time,avg_disk,ta
57b0: 67 73 20 46 52 4f 4d 20 74 65 73 74 5f 6d 65 74  gs FROM test_met
57c0: 61 20 57 48 45 52 45 20 74 65 73 74 6e 61 6d 65  a WHERE testname
57d0: 3d 3f 3b 22 0a 20 20 20 20 20 74 65 73 74 6e 61  =?;".     testna
57e0: 6d 65 29 0a 20 20 20 20 72 65 73 29 29 0a 0a 3b  me).    res))..;
57f0: 3b 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 72  ; create a new r
5800: 65 63 6f 72 64 20 66 6f 72 20 61 20 67 69 76 65  ecord for a give
5810: 6e 20 74 65 73 74 6e 61 6d 65 0a 28 64 65 66 69  n testname.(defi
5820: 6e 65 20 28 64 62 3a 74 65 73 74 6d 65 74 61 2d  ne (db:testmeta-
5830: 61 64 64 2d 72 65 63 6f 72 64 20 64 62 20 74 65  add-record db te
5840: 73 74 6e 61 6d 65 29 0a 20 20 28 73 71 6c 69 74  stname).  (sqlit
5850: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 49  e3:execute db "I
5860: 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20  NSERT OR IGNORE 
5870: 49 4e 54 4f 20 74 65 73 74 5f 6d 65 74 61 20 28  INTO test_meta (
5880: 74 65 73 74 6e 61 6d 65 2c 61 75 74 68 6f 72 2c  testname,author,
5890: 6f 77 6e 65 72 2c 64 65 73 63 72 69 70 74 69 6f  owner,descriptio
58a0: 6e 2c 72 65 76 69 65 77 65 64 2c 69 74 65 72 61  n,reviewed,itera
58b0: 74 65 64 2c 61 76 67 5f 72 75 6e 74 69 6d 65 2c  ted,avg_runtime,
58c0: 61 76 67 5f 64 69 73 6b 2c 74 61 67 73 29 20 56  avg_disk,tags) V
58d0: 41 4c 55 45 53 20 28 3f 2c 27 27 2c 27 27 2c 27  ALUES (?,'','','
58e0: 27 2c 27 27 2c 27 27 2c 27 27 2c 27 27 2c 27 27  ','','','','',''
58f0: 29 3b 22 20 74 65 73 74 6e 61 6d 65 29 29 0a 0a  );" testname))..
5900: 3b 3b 20 75 70 64 61 74 65 20 6f 6e 65 20 6f 66  ;; update one of
5910: 20 74 68 65 20 74 65 73 74 6d 65 74 61 20 66 69   the testmeta fi
5920: 65 6c 64 73 0a 28 64 65 66 69 6e 65 20 28 64 62  elds.(define (db
5930: 3a 74 65 73 74 6d 65 74 61 2d 75 70 64 61 74 65  :testmeta-update
5940: 2d 66 69 65 6c 64 20 64 62 20 74 65 73 74 6e 61  -field db testna
5950: 6d 65 20 66 69 65 6c 64 20 76 61 6c 75 65 29 0a  me field value).
5960: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
5970: 74 65 20 64 62 20 28 63 6f 6e 63 20 22 55 50 44  te db (conc "UPD
5980: 41 54 45 20 74 65 73 74 5f 6d 65 74 61 20 53 45  ATE test_meta SE
5990: 54 20 22 20 66 69 65 6c 64 20 22 3d 3f 20 57 48  T " field "=? WH
59a0: 45 52 45 20 74 65 73 74 6e 61 6d 65 3d 3f 3b 22  ERE testname=?;"
59b0: 29 20 76 61 6c 75 65 20 74 65 73 74 6e 61 6d 65  ) value testname
59c0: 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ))..;;==========
59d0: 3d 3d 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 0a 3b 3b 20  ============.;; 
5a10: 54 20 45 20 53 20 54 20 20 20 44 20 41 20 54 20  T E S T   D A T 
5a20: 41 20 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  A .;;===========
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 0a 0a 28 64 65  ===========..(de
5a70: 66 69 6e 65 20 28 64 62 3a 63 73 76 2d 3e 74 65  fine (db:csv->te
5a80: 73 74 2d 64 61 74 61 20 64 62 20 74 65 73 74 2d  st-data db test-
5a90: 69 64 20 63 73 76 64 61 74 61 29 0a 20 20 28 64  id csvdata).  (d
5aa0: 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22 74 65  ebug:print 4 "te
5ab0: 73 74 2d 69 64 20 22 20 74 65 73 74 2d 69 64 20  st-id " test-id 
5ac0: 22 2c 20 63 73 76 64 61 74 61 3a 20 22 20 63 73  ", csvdata: " cs
5ad0: 76 64 61 74 61 29 0a 20 20 28 6c 65 74 20 28 28  vdata).  (let ((
5ae0: 63 73 76 6c 69 73 74 20 28 63 73 76 2d 3e 6c 69  csvlist (csv->li
5af0: 73 74 20 28 6d 61 6b 65 2d 63 73 76 2d 72 65 61  st (make-csv-rea
5b00: 64 65 72 0a 09 09 09 20 20 20 20 20 28 6f 70 65  der....     (ope
5b10: 6e 2d 69 6e 70 75 74 2d 73 74 72 69 6e 67 20 63  n-input-string c
5b20: 73 76 64 61 74 61 29 0a 09 09 09 20 20 20 20 20  svdata)....     
5b30: 27 28 28 73 74 72 69 70 2d 6c 65 61 64 69 6e 67  '((strip-leading
5b40: 2d 77 68 69 74 65 73 70 61 63 65 3f 20 23 74 29  -whitespace? #t)
5b50: 0a 09 09 09 20 20 20 20 20 20 20 28 73 74 72 69  ....       (stri
5b60: 70 2d 74 72 61 69 6c 69 6e 67 2d 77 68 69 74 65  p-trailing-white
5b70: 73 70 61 63 65 3f 20 23 74 29 29 20 29 29 29 29  space? #t)) ))))
5b80: 20 3b 3b 20 28 63 73 76 2d 3e 6c 69 73 74 20 63   ;; (csv->list c
5b90: 73 76 64 61 74 61 29 29 29 0a 20 20 20 20 28 66  svdata))).    (f
5ba0: 6f 72 2d 65 61 63 68 20 0a 20 20 20 20 20 28 6c  or-each .     (l
5bb0: 61 6d 62 64 61 20 28 63 73 76 72 6f 77 29 0a 20  ambda (csvrow). 
5bc0: 20 20 20 20 20 20 28 6c 65 74 2a 20 28 28 70 61        (let* ((pa
5bd0: 64 64 65 64 2d 72 6f 77 20 20 28 74 61 6b 65 20  dded-row  (take 
5be0: 28 61 70 70 65 6e 64 20 63 73 76 72 6f 77 20 28  (append csvrow (
5bf0: 6c 69 73 74 20 23 66 20 23 66 20 23 66 20 23 66  list #f #f #f #f
5c00: 20 23 66 20 23 66 20 23 66 20 23 66 29 29 20 38   #f #f #f #f)) 8
5c10: 29 29 0a 09 20 20 20 20 20 20 28 63 61 74 65 67  ))..      (categ
5c20: 6f 72 79 20 20 20 20 28 6c 69 73 74 2d 72 65 66  ory    (list-ref
5c30: 20 70 61 64 64 65 64 2d 72 6f 77 20 30 29 29 0a   padded-row 0)).
5c40: 09 20 20 20 20 20 20 28 76 61 72 69 61 62 6c 65  .      (variable
5c50: 20 20 20 20 28 6c 69 73 74 2d 72 65 66 20 70 61      (list-ref pa
5c60: 64 64 65 64 2d 72 6f 77 20 31 29 29 0a 09 20 20  dded-row 1))..  
5c70: 20 20 20 20 28 76 61 6c 75 65 20 20 20 20 20 20      (value      
5c80: 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 2d 69 66   (any->number-if
5c90: 2d 70 6f 73 73 69 62 6c 65 20 28 6c 69 73 74 2d  -possible (list-
5ca0: 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20 32  ref padded-row 2
5cb0: 29 29 29 0a 09 20 20 20 20 20 20 28 65 78 70 65  )))..      (expe
5cc0: 63 74 65 64 20 20 20 20 28 61 6e 79 2d 3e 6e 75  cted    (any->nu
5cd0: 6d 62 65 72 2d 69 66 2d 70 6f 73 73 69 62 6c 65  mber-if-possible
5ce0: 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65   (list-ref padde
5cf0: 64 2d 72 6f 77 20 33 29 29 29 0a 09 20 20 20 20  d-row 3)))..    
5d00: 20 20 28 74 6f 6c 20 20 20 20 20 20 20 20 20 28    (tol         (
5d10: 61 6e 79 2d 3e 6e 75 6d 62 65 72 2d 69 66 2d 70  any->number-if-p
5d20: 6f 73 73 69 62 6c 65 20 28 6c 69 73 74 2d 72 65  ossible (list-re
5d30: 66 20 70 61 64 64 65 64 2d 72 6f 77 20 34 29 29  f padded-row 4))
5d40: 29 20 3b 3b 20 3e 2c 20 3c 2c 20 3e 3d 2c 20 3c  ) ;; >, <, >=, <
5d50: 3d 2c 20 6f 72 20 61 20 6e 75 6d 62 65 72 0a 09  =, or a number..
5d60: 20 20 20 20 20 20 28 75 6e 69 74 73 20 20 20 20        (units    
5d70: 20 20 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64     (list-ref pad
5d80: 64 65 64 2d 72 6f 77 20 35 29 29 0a 09 20 20 20  ded-row 5))..   
5d90: 20 20 20 28 63 6f 6d 6d 65 6e 74 20 20 20 20 20     (comment     
5da0: 28 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65 64  (list-ref padded
5db0: 2d 72 6f 77 20 36 29 29 0a 09 20 20 20 20 20 20  -row 6))..      
5dc0: 28 73 74 61 74 75 73 20 20 20 20 20 20 28 6c 65  (status      (le
5dd0: 74 20 28 28 73 20 28 6c 69 73 74 2d 72 65 66 20  t ((s (list-ref 
5de0: 70 61 64 64 65 64 2d 72 6f 77 20 37 29 29 29 0a  padded-row 7))).
5df0: 09 09 09 20 20 20 20 20 28 69 66 20 28 61 6e 64  ...     (if (and
5e00: 20 28 73 74 72 69 6e 67 3f 20 73 29 28 6f 72 20   (string? s)(or 
5e10: 28 73 74 72 69 6e 67 2d 6d 61 74 63 68 20 28 72  (string-match (r
5e20: 65 67 65 78 70 20 22 5e 5c 5c 73 2a 24 22 29 20  egexp "^\\s*$") 
5e30: 73 29 0a 09 09 09 09 09 09 20 20 20 20 20 28 73  s).......     (s
5e40: 74 72 69 6e 67 2d 6d 61 74 63 68 20 28 72 65 67  tring-match (reg
5e50: 65 78 70 20 22 5e 6e 2f 61 24 22 29 20 73 29 29  exp "^n/a$") s))
5e60: 29 0a 09 09 09 09 20 23 66 0a 09 09 09 09 20 73  )..... #f..... s
5e70: 29 29 29 29 20 3b 3b 20 69 66 20 73 70 65 63 69  )))) ;; if speci
5e80: 66 69 65 64 20 6f 6e 20 74 68 65 20 69 6e 70 75  fied on the inpu
5e90: 74 20 74 68 65 6e 20 75 73 65 2c 20 65 6c 73 65  t then use, else
5ea0: 20 63 61 6c 63 75 6c 61 74 65 0a 09 20 3b 3b 20   calculate.. ;; 
5eb0: 6c 6f 6f 6b 20 75 70 20 65 78 70 65 63 74 65 64  look up expected
5ec0: 2c 74 6f 6c 2c 75 6e 69 74 73 20 66 72 6f 6d 20  ,tol,units from 
5ed0: 70 72 65 76 69 6f 75 73 20 62 65 73 74 20 66 69  previous best fi
5ee0: 74 20 74 65 73 74 20 69 66 20 74 68 65 79 20 61  t test if they a
5ef0: 72 65 20 61 6c 6c 20 65 69 74 68 65 72 20 23 66  re all either #f
5f00: 20 6f 72 20 27 27 0a 09 20 28 64 65 62 75 67 3a   or ''.. (debug:
5f10: 70 72 69 6e 74 20 34 20 22 42 45 46 4f 52 45 3a  print 4 "BEFORE:
5f20: 20 63 61 74 65 67 6f 72 79 3a 20 22 20 63 61 74   category: " cat
5f30: 65 67 6f 72 79 20 22 20 76 61 72 69 61 62 6c 65  egory " variable
5f40: 3a 20 22 20 76 61 72 69 61 62 6c 65 20 22 20 76  : " variable " v
5f50: 61 6c 75 65 3a 20 22 20 76 61 6c 75 65 20 0a 09  alue: " value ..
5f60: 09 20 20 20 20 20 20 22 2c 20 65 78 70 65 63 74  .      ", expect
5f70: 65 64 3a 20 22 20 65 78 70 65 63 74 65 64 20 22  ed: " expected "
5f80: 20 74 6f 6c 3a 20 22 20 74 6f 6c 20 22 20 75 6e   tol: " tol " un
5f90: 69 74 73 3a 20 22 20 75 6e 69 74 73 20 22 20 73  its: " units " s
5fa0: 74 61 74 75 73 3a 20 22 20 73 74 61 74 75 73 20  tatus: " status 
5fb0: 22 20 63 6f 6d 6d 65 6e 74 3a 20 22 20 63 6f 6d  " comment: " com
5fc0: 6d 65 6e 74 29 0a 0a 09 20 28 69 66 20 28 61 6e  ment)... (if (an
5fd0: 64 20 28 6f 72 20 28 6e 6f 74 20 65 78 70 65 63  d (or (not expec
5fe0: 74 65 64 29 28 65 71 75 61 6c 3f 20 65 78 70 65  ted)(equal? expe
5ff0: 63 74 65 64 20 22 22 29 29 0a 09 09 20 20 28 6f  cted ""))...  (o
6000: 72 20 28 6e 6f 74 20 74 6f 6c 29 20 20 20 20 20  r (not tol)     
6010: 28 65 71 75 61 6c 3f 20 65 78 70 65 63 74 65 64  (equal? expected
6020: 20 22 22 29 29 0a 09 09 20 20 28 6f 72 20 28 6e   ""))...  (or (n
6030: 6f 74 20 75 6e 69 74 73 29 20 20 20 28 65 71 75  ot units)   (equ
6040: 61 6c 3f 20 65 78 70 65 63 74 65 64 20 22 22 29  al? expected "")
6050: 29 29 0a 09 20 20 20 20 20 28 6c 65 74 2d 76 61  ))..     (let-va
6060: 6c 75 65 73 20 28 28 28 6e 65 77 2d 65 78 70 65  lues (((new-expe
6070: 63 74 65 64 20 6e 65 77 2d 74 6f 6c 20 6e 65 77  cted new-tol new
6080: 2d 75 6e 69 74 73 29 28 64 62 3a 67 65 74 2d 70  -units)(db:get-p
6090: 72 65 76 2d 74 6f 6c 2d 66 6f 72 2d 74 65 73 74  rev-tol-for-test
60a0: 20 64 62 20 74 65 73 74 2d 69 64 20 63 61 74 65   db test-id cate
60b0: 67 6f 72 79 20 76 61 72 69 61 62 6c 65 29 29 29  gory variable)))
60c0: 0a 09 09 09 20 28 73 65 74 21 20 65 78 70 65 63  .... (set! expec
60d0: 74 65 64 20 6e 65 77 2d 65 78 70 65 63 74 65 64  ted new-expected
60e0: 29 0a 09 09 09 20 28 73 65 74 21 20 74 6f 6c 20  ).... (set! tol 
60f0: 20 20 20 20 20 6e 65 77 2d 74 6f 6c 29 0a 09 09       new-tol)...
6100: 09 20 28 73 65 74 21 20 75 6e 69 74 73 20 20 20  . (set! units   
6110: 20 6e 65 77 2d 75 6e 69 74 73 29 29 29 0a 0a 09   new-units)))...
6120: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20   (debug:print 4 
6130: 22 41 46 54 45 52 3a 20 20 63 61 74 65 67 6f 72  "AFTER:  categor
6140: 79 3a 20 22 20 63 61 74 65 67 6f 72 79 20 22 20  y: " category " 
6150: 76 61 72 69 61 62 6c 65 3a 20 22 20 76 61 72 69  variable: " vari
6160: 61 62 6c 65 20 22 20 76 61 6c 75 65 3a 20 22 20  able " value: " 
6170: 76 61 6c 75 65 20 0a 09 09 20 20 20 20 20 20 22  value ...      "
6180: 2c 20 65 78 70 65 63 74 65 64 3a 20 22 20 65 78  , expected: " ex
6190: 70 65 63 74 65 64 20 22 20 74 6f 6c 3a 20 22 20  pected " tol: " 
61a0: 74 6f 6c 20 22 20 75 6e 69 74 73 3a 20 22 20 75  tol " units: " u
61b0: 6e 69 74 73 20 22 20 73 74 61 74 75 73 3a 20 22  nits " status: "
61c0: 20 73 74 61 74 75 73 20 22 20 63 6f 6d 6d 65 6e   status " commen
61d0: 74 3a 20 22 20 63 6f 6d 6d 65 6e 74 29 0a 09 20  t: " comment).. 
61e0: 3b 3b 20 63 61 6c 63 75 6c 61 74 65 20 73 74 61  ;; calculate sta
61f0: 74 75 73 20 69 66 20 4e 4f 54 20 73 70 65 63 69  tus if NOT speci
6200: 66 69 65 64 0a 09 20 28 69 66 20 28 61 6e 64 20  fied.. (if (and 
6210: 28 6e 6f 74 20 73 74 61 74 75 73 29 28 6e 75 6d  (not status)(num
6220: 62 65 72 3f 20 65 78 70 65 63 74 65 64 29 28 6e  ber? expected)(n
6230: 75 6d 62 65 72 3f 20 76 61 6c 75 65 29 29 20 3b  umber? value)) ;
6240: 3b 20 6e 65 65 64 20 65 78 70 65 63 74 65 64 20  ; need expected 
6250: 61 6e 64 20 76 61 6c 75 65 20 74 6f 20 62 65 20  and value to be 
6260: 6e 75 6d 62 65 72 73 0a 09 20 20 20 20 20 28 69  numbers..     (i
6270: 66 20 28 6e 75 6d 62 65 72 3f 20 74 6f 6c 29 20  f (number? tol) 
6280: 3b 3b 20 69 66 20 74 6f 6c 20 69 73 20 61 20 6e  ;; if tol is a n
6290: 75 6d 62 65 72 20 74 68 65 6e 20 77 65 20 64 6f  umber then we do
62a0: 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 63 6f   the standard co
62b0: 6d 70 61 72 69 73 6f 6e 0a 09 09 20 28 6c 65 74  mparison... (let
62c0: 2a 20 28 28 6d 61 78 2d 76 61 6c 20 28 2b 20 65  * ((max-val (+ e
62d0: 78 70 65 63 74 65 64 20 74 6f 6c 29 29 0a 09 09  xpected tol))...
62e0: 09 28 6d 69 6e 2d 76 61 6c 20 28 2d 20 65 78 70  .(min-val (- exp
62f0: 65 63 74 65 64 20 74 6f 6c 29 29 0a 09 09 09 28  ected tol))....(
6300: 72 65 73 75 6c 74 20 20 28 61 6e 64 20 28 3e 3d  result  (and (>=
6310: 20 20 76 61 6c 75 65 20 6d 69 6e 2d 76 61 6c 29    value min-val)
6320: 28 3c 3d 20 76 61 6c 75 65 20 6d 61 78 2d 76 61  (<= value max-va
6330: 6c 29 29 29 29 0a 09 09 20 20 20 28 64 65 62 75  l))))...   (debu
6340: 67 3a 70 72 69 6e 74 20 34 20 22 6d 61 78 2d 76  g:print 4 "max-v
6350: 61 6c 3a 20 22 20 6d 61 78 2d 76 61 6c 20 22 20  al: " max-val " 
6360: 6d 69 6e 2d 76 61 6c 3a 20 22 20 6d 69 6e 2d 76  min-val: " min-v
6370: 61 6c 20 22 20 72 65 73 75 6c 74 3a 20 22 20 72  al " result: " r
6380: 65 73 75 6c 74 29 0a 09 09 20 20 20 28 73 65 74  esult)...   (set
6390: 21 20 73 74 61 74 75 73 20 28 69 66 20 72 65 73  ! status (if res
63a0: 75 6c 74 20 22 70 61 73 73 22 20 22 66 61 69 6c  ult "pass" "fail
63b0: 22 29 29 29 0a 09 09 20 28 73 65 74 21 20 73 74  ")))... (set! st
63c0: 61 74 75 73 20 3b 3b 20 4e 42 2f 2f 20 6e 65 65  atus ;; NB// nee
63d0: 64 20 74 6f 20 61 73 73 65 73 73 20 65 61 63 68  d to assess each
63e0: 20 6f 6e 65 20 28 69 2e 65 2e 20 6e 6f 74 20 72   one (i.e. not r
63f0: 65 74 75 72 6e 20 6f 70 65 72 61 74 6f 72 20 73  eturn operator s
6400: 69 6e 63 65 20 6e 65 65 64 20 74 6f 20 61 63 74  ince need to act
6410: 20 69 66 20 6e 6f 74 20 76 61 6c 69 64 20 6f 70   if not valid op
6420: 2e 0a 09 09 20 20 20 20 20 20 20 28 63 61 73 65  ....       (case
6430: 20 28 73 74 72 69 6e 67 2d 3e 73 79 6d 62 6f 6c   (string->symbol
6440: 20 74 6f 6c 29 20 3b 3b 20 74 6f 6c 20 73 68 6f   tol) ;; tol sho
6450: 75 6c 64 20 62 65 20 3e 2c 20 3c 2c 20 3e 3d 2c  uld be >, <, >=,
6460: 20 3c 3d 0a 09 09 09 20 28 28 3e 29 20 20 28 69   <=.... ((>)  (i
6470: 66 20 28 3e 20 20 76 61 6c 75 65 20 65 78 70 65  f (>  value expe
6480: 63 74 65 64 29 20 22 70 61 73 73 22 20 22 66 61  cted) "pass" "fa
6490: 69 6c 22 29 29 0a 09 09 09 20 28 28 3c 29 20 20  il")).... ((<)  
64a0: 28 69 66 20 28 3c 20 20 76 61 6c 75 65 20 65 78  (if (<  value ex
64b0: 70 65 63 74 65 64 29 20 22 70 61 73 73 22 20 22  pected) "pass" "
64c0: 66 61 69 6c 22 29 29 0a 09 09 09 20 28 28 3e 3d  fail")).... ((>=
64d0: 29 20 28 69 66 20 28 3e 3d 20 76 61 6c 75 65 20  ) (if (>= value 
64e0: 65 78 70 65 63 74 65 64 29 20 22 70 61 73 73 22  expected) "pass"
64f0: 20 22 66 61 69 6c 22 29 29 0a 09 09 09 20 28 28   "fail")).... ((
6500: 3c 3d 29 20 28 69 66 20 28 3c 3d 20 76 61 6c 75  <=) (if (<= valu
6510: 65 20 65 78 70 65 63 74 65 64 29 20 22 70 61 73  e expected) "pas
6520: 73 22 20 22 66 61 69 6c 22 29 29 0a 09 09 09 20  s" "fail")).... 
6530: 28 65 6c 73 65 20 28 63 6f 6e 63 20 22 45 52 52  (else (conc "ERR
6540: 4f 52 3a 20 62 61 64 20 74 6f 6c 20 63 6f 6d 70  OR: bad tol comp
6550: 61 72 61 74 6f 72 20 22 20 74 6f 6c 29 29 29 29  arator " tol))))
6560: 29 29 0a 09 20 28 64 65 62 75 67 3a 70 72 69 6e  )).. (debug:prin
6570: 74 20 34 20 22 41 46 54 45 52 32 3a 20 63 61 74  t 4 "AFTER2: cat
6580: 65 67 6f 72 79 3a 20 22 20 63 61 74 65 67 6f 72  egory: " categor
6590: 79 20 22 20 76 61 72 69 61 62 6c 65 3a 20 22 20  y " variable: " 
65a0: 76 61 72 69 61 62 6c 65 20 22 20 76 61 6c 75 65  variable " value
65b0: 3a 20 22 20 76 61 6c 75 65 20 0a 09 09 20 20 20  : " value ...   
65c0: 20 20 20 22 2c 20 65 78 70 65 63 74 65 64 3a 20     ", expected: 
65d0: 22 20 65 78 70 65 63 74 65 64 20 22 20 74 6f 6c  " expected " tol
65e0: 3a 20 22 20 74 6f 6c 20 22 20 75 6e 69 74 73 3a  : " tol " units:
65f0: 20 22 20 75 6e 69 74 73 20 22 20 73 74 61 74 75   " units " statu
6600: 73 3a 20 22 20 73 74 61 74 75 73 20 22 20 63 6f  s: " status " co
6610: 6d 6d 65 6e 74 3a 20 22 20 63 6f 6d 6d 65 6e 74  mment: " comment
6620: 29 0a 09 20 28 73 71 6c 69 74 65 33 3a 65 78 65  ).. (sqlite3:exe
6630: 63 75 74 65 20 64 62 20 22 49 4e 53 45 52 54 20  cute db "INSERT 
6640: 4f 52 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20  OR REPLACE INTO 
6650: 74 65 73 74 5f 64 61 74 61 20 28 74 65 73 74 5f  test_data (test_
6660: 69 64 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 69  id,category,vari
6670: 61 62 6c 65 2c 76 61 6c 75 65 2c 65 78 70 65 63  able,value,expec
6680: 74 65 64 2c 74 6f 6c 2c 75 6e 69 74 73 2c 63 6f  ted,tol,units,co
6690: 6d 6d 65 6e 74 2c 73 74 61 74 75 73 29 20 56 41  mment,status) VA
66a0: 4c 55 45 53 20 28 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c  LUES (?,?,?,?,?,
66b0: 3f 2c 3f 2c 3f 2c 3f 29 3b 22 0a 09 09 09 20 20  ?,?,?,?);"....  
66c0: 74 65 73 74 2d 69 64 20 63 61 74 65 67 6f 72 79  test-id category
66d0: 20 76 61 72 69 61 62 6c 65 20 76 61 6c 75 65 20   variable value 
66e0: 65 78 70 65 63 74 65 64 20 74 6f 6c 20 75 6e 69  expected tol uni
66f0: 74 73 20 28 69 66 20 63 6f 6d 6d 65 6e 74 20 63  ts (if comment c
6700: 6f 6d 6d 65 6e 74 20 22 22 29 20 73 74 61 74 75  omment "") statu
6710: 73 29 29 29 0a 20 20 20 20 20 63 73 76 6c 69 73  s))).     csvlis
6720: 74 29 29 29 0a 0a 3b 3b 20 67 65 74 20 61 20 6c  t)))..;; get a l
6730: 69 73 74 20 6f 66 20 74 65 73 74 5f 64 61 74 61  ist of test_data
6740: 20 72 65 63 6f 72 64 73 20 6d 61 74 63 68 69 6e   records matchin
6750: 67 20 63 61 74 65 67 6f 72 79 70 61 74 74 0a 28  g categorypatt.(
6760: 64 65 66 69 6e 65 20 28 64 62 3a 72 65 61 64 2d  define (db:read-
6770: 74 65 73 74 2d 64 61 74 61 20 64 62 20 74 65 73  test-data db tes
6780: 74 2d 69 64 20 63 61 74 65 67 6f 72 79 70 61 74  t-id categorypat
6790: 74 29 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20  t).  (let ((res 
67a0: 27 28 29 29 29 0a 20 20 20 20 28 73 71 6c 69 74  '())).    (sqlit
67b0: 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20  e3:for-each-row 
67c0: 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 69  .     (lambda (i
67d0: 64 20 74 65 73 74 5f 69 64 20 63 61 74 65 67 6f  d test_id catego
67e0: 72 79 20 76 61 72 69 61 62 6c 65 20 76 61 6c 75  ry variable valu
67f0: 65 20 65 78 70 65 63 74 65 64 20 74 6f 6c 20 75  e expected tol u
6800: 6e 69 74 73 20 63 6f 6d 6d 65 6e 74 20 73 74 61  nits comment sta
6810: 74 75 73 29 0a 20 20 20 20 20 20 20 28 73 65 74  tus).       (set
6820: 21 20 72 65 73 20 28 63 6f 6e 73 20 28 76 65 63  ! res (cons (vec
6830: 74 6f 72 20 69 64 20 74 65 73 74 5f 69 64 20 63  tor id test_id c
6840: 61 74 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65  ategory variable
6850: 20 76 61 6c 75 65 20 65 78 70 65 63 74 65 64 20   value expected 
6860: 74 6f 6c 20 75 6e 69 74 73 20 63 6f 6d 6d 65 6e  tol units commen
6870: 74 20 73 74 61 74 75 73 29 20 72 65 73 29 29 29  t status) res)))
6880: 0a 20 20 20 20 20 64 62 0a 20 20 20 20 20 22 53  .     db.     "S
6890: 45 4c 45 43 54 20 69 64 2c 74 65 73 74 5f 69 64  ELECT id,test_id
68a0: 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62  ,category,variab
68b0: 6c 65 2c 76 61 6c 75 65 2c 65 78 70 65 63 74 65  le,value,expecte
68c0: 64 2c 74 6f 6c 2c 75 6e 69 74 73 2c 63 6f 6d 6d  d,tol,units,comm
68d0: 65 6e 74 2c 73 74 61 74 75 73 20 46 52 4f 4d 20  ent,status FROM 
68e0: 74 65 73 74 5f 64 61 74 61 20 57 48 45 52 45 20  test_data WHERE 
68f0: 74 65 73 74 5f 69 64 3d 3f 20 41 4e 44 20 63 61  test_id=? AND ca
6900: 74 65 67 6f 72 79 20 4c 49 4b 45 20 3f 20 4f 52  tegory LIKE ? OR
6910: 44 45 52 20 42 59 20 63 61 74 65 67 6f 72 79 2c  DER BY category,
6920: 76 61 72 69 61 62 6c 65 3b 22 20 74 65 73 74 2d  variable;" test-
6930: 69 64 20 63 61 74 65 67 6f 72 79 70 61 74 74 29  id categorypatt)
6940: 0a 20 20 20 20 28 72 65 76 65 72 73 65 20 72 65  .    (reverse re
6950: 73 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64  s)))..(define (d
6960: 62 3a 6c 6f 61 64 2d 74 65 73 74 2d 64 61 74 61  b:load-test-data
6970: 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d   db run-id test-
6980: 6e 61 6d 65 20 69 74 65 6d 64 61 74 29 0a 20 20  name itemdat).  
6990: 28 6c 65 74 2a 20 28 28 69 74 65 6d 2d 70 61 74  (let* ((item-pat
69a0: 68 20 28 69 74 65 6d 2d 6c 69 73 74 2d 3e 70 61  h (item-list->pa
69b0: 74 68 20 69 74 65 6d 64 61 74 29 29 0a 09 20 28  th itemdat)).. (
69c0: 74 65 73 74 64 61 74 20 28 64 62 3a 67 65 74 2d  testdat (db:get-
69d0: 74 65 73 74 2d 69 6e 66 6f 20 64 62 20 72 75 6e  test-info db run
69e0: 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74  -id test-name it
69f0: 65 6d 2d 70 61 74 68 29 29 0a 09 20 28 74 65 73  em-path)).. (tes
6a00: 74 2d 69 64 20 28 69 66 20 74 65 73 74 64 61 74  t-id (if testdat
6a10: 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 69 64   (db:test-get-id
6a20: 20 74 65 73 74 64 61 74 29 20 23 66 29 29 29 0a   testdat) #f))).
6a30: 20 20 20 20 3b 3b 20 28 64 65 62 75 67 3a 70 72      ;; (debug:pr
6a40: 69 6e 74 20 31 20 22 45 6e 74 65 72 20 72 65 63  int 1 "Enter rec
6a50: 6f 72 64 73 20 74 6f 20 69 6e 73 65 72 74 20 69  ords to insert i
6a60: 6e 20 74 68 65 20 74 65 73 74 5f 64 61 74 61 20  n the test_data 
6a70: 74 61 62 6c 65 2c 20 73 65 76 65 6e 20 66 69 65  table, seven fie
6a80: 6c 64 73 2c 20 63 6f 6d 6d 61 20 73 65 70 61 72  lds, comma separ
6a90: 61 74 65 64 20 70 65 72 20 6c 69 6e 65 22 29 0a  ated per line").
6aa0: 20 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74      (debug:print
6ab0: 20 34 20 22 69 74 65 6d 64 61 74 3a 20 22 20 69   4 "itemdat: " i
6ac0: 74 65 6d 64 61 74 20 22 2c 20 74 65 73 74 2d 6e  temdat ", test-n
6ad0: 61 6d 65 3a 20 22 20 74 65 73 74 2d 6e 61 6d 65  ame: " test-name
6ae0: 20 22 2c 20 74 65 73 74 2d 69 64 3a 20 22 20 74   ", test-id: " t
6af0: 65 73 74 2d 69 64 29 0a 20 20 20 20 28 69 66 20  est-id).    (if 
6b00: 74 65 73 74 2d 69 64 0a 09 28 6c 65 74 20 6c 6f  test-id..(let lo
6b10: 6f 70 20 28 28 6c 69 6e 20 28 72 65 61 64 2d 6c  op ((lin (read-l
6b20: 69 6e 65 29 29 29 0a 09 20 20 28 69 66 20 28 6e  ine)))..  (if (n
6b30: 6f 74 20 28 65 6f 66 2d 6f 62 6a 65 63 74 3f 20  ot (eof-object? 
6b40: 6c 69 6e 29 29 0a 09 20 20 20 20 20 20 28 62 65  lin))..      (be
6b50: 67 69 6e 0a 09 09 28 64 65 62 75 67 3a 70 72 69  gin...(debug:pri
6b60: 6e 74 20 34 20 6c 69 6e 29 0a 09 09 28 64 62 3a  nt 4 lin)...(db:
6b70: 63 73 76 2d 3e 74 65 73 74 2d 64 61 74 61 20 64  csv->test-data d
6b80: 62 20 74 65 73 74 2d 69 64 20 6c 69 6e 29 0a 09  b test-id lin)..
6b90: 09 28 6c 6f 6f 70 20 28 72 65 61 64 2d 6c 69 6e  .(loop (read-lin
6ba0: 65 29 29 29 29 29 29 0a 20 20 20 20 3b 3b 20 72  e)))))).    ;; r
6bb0: 6f 6c 6c 20 75 70 20 74 68 65 20 63 75 72 72 65  oll up the curre
6bc0: 6e 74 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20  nt results..    
6bd0: 28 64 62 3a 74 65 73 74 2d 64 61 74 61 2d 72 6f  (db:test-data-ro
6be0: 6c 6c 75 70 20 64 62 20 74 65 73 74 2d 69 64 29  llup db test-id)
6bf0: 29 29 0a 0a 3b 3b 20 57 41 52 4e 49 4e 47 3a 20  ))..;; WARNING: 
6c00: 44 6f 20 4e 4f 54 20 63 61 6c 6c 20 74 68 69 73  Do NOT call this
6c10: 20 66 6f 72 20 74 68 65 20 70 61 72 65 6e 74 20   for the parent 
6c20: 74 65 73 74 20 6f 6e 20 61 6e 20 69 74 65 72 61  test on an itera
6c30: 74 65 64 20 74 65 73 74 0a 3b 3b 20 52 6f 6c 6c  ted test.;; Roll
6c40: 20 75 70 20 74 65 73 74 5f 64 61 74 61 20 70 61   up test_data pa
6c50: 73 73 2f 66 61 69 6c 20 72 65 73 75 6c 74 73 0a  ss/fail results.
6c60: 3b 3b 20 6c 6f 6f 6b 20 61 74 20 74 68 65 20 74  ;; look at the t
6c70: 65 73 74 5f 64 61 74 61 20 73 74 61 74 75 73 20  est_data status 
6c80: 66 69 65 6c 64 2c 20 0a 3b 3b 20 20 20 20 69 66  field, .;;    if
6c90: 20 61 6c 6c 20 61 72 65 20 70 61 73 73 20 28 61   all are pass (a
6ca0: 6e 79 20 63 61 73 65 29 20 61 6e 64 20 74 68 65  ny case) and the
6cb0: 20 74 65 73 74 20 73 74 61 74 75 73 20 69 73 20   test status is 
6cc0: 50 41 53 53 20 6f 72 20 4e 55 4c 4c 20 6f 72 20  PASS or NULL or 
6cd0: 27 27 20 74 68 65 6e 20 73 65 74 20 74 65 73 74  '' then set test
6ce0: 20 73 74 61 74 75 73 20 74 6f 20 50 41 53 53 2e   status to PASS.
6cf0: 0a 3b 3b 20 20 20 20 69 66 20 6f 6e 65 20 6f 72  .;;    if one or
6d00: 20 6d 6f 72 65 20 61 72 65 20 66 61 69 6c 20 28   more are fail (
6d10: 61 6e 79 20 63 61 73 65 29 20 74 68 65 6e 20 73  any case) then s
6d20: 65 74 20 74 65 73 74 20 73 74 61 74 75 73 20 74  et test status t
6d30: 6f 20 50 41 53 53 2c 20 6e 6f 6e 20 22 70 61 73  o PASS, non "pas
6d40: 73 22 20 6f 72 20 22 66 61 69 6c 22 20 61 72 65  s" or "fail" are
6d50: 20 69 67 6e 6f 72 65 64 0a 28 64 65 66 69 6e 65   ignored.(define
6d60: 20 28 64 62 3a 74 65 73 74 2d 64 61 74 61 2d 72   (db:test-data-r
6d70: 6f 6c 6c 75 70 20 64 62 20 74 65 73 74 2d 69 64  ollup db test-id
6d80: 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65  ).  (sqlite3:exe
6d90: 63 75 74 65 20 0a 20 20 20 64 62 20 0a 20 20 20  cute .   db .   
6da0: 22 55 50 44 41 54 45 20 74 65 73 74 73 20 0a 20  "UPDATE tests . 
6db0: 20 20 20 20 20 53 45 54 20 66 61 69 6c 5f 63 6f       SET fail_co
6dc0: 75 6e 74 3d 28 53 45 4c 45 43 54 20 63 6f 75 6e  unt=(SELECT coun
6dd0: 74 28 69 64 29 20 46 52 4f 4d 20 74 65 73 74 5f  t(id) FROM test_
6de0: 64 61 74 61 20 57 48 45 52 45 20 74 65 73 74 5f  data WHERE test_
6df0: 69 64 3d 3f 20 41 4e 44 20 73 74 61 74 75 73 20  id=? AND status 
6e00: 6c 69 6b 65 20 27 66 61 69 6c 27 29 2c 0a 20 20  like 'fail'),.  
6e10: 20 20 20 20 20 20 20 20 70 61 73 73 5f 63 6f 75          pass_cou
6e20: 6e 74 3d 28 53 45 4c 45 43 54 20 63 6f 75 6e 74  nt=(SELECT count
6e30: 28 69 64 29 20 46 52 4f 4d 20 74 65 73 74 5f 64  (id) FROM test_d
6e40: 61 74 61 20 57 48 45 52 45 20 74 65 73 74 5f 69  ata WHERE test_i
6e50: 64 3d 3f 20 41 4e 44 20 73 74 61 74 75 73 20 6c  d=? AND status l
6e60: 69 6b 65 20 27 70 61 73 73 27 29 0a 20 20 20 20  ike 'pass').    
6e70: 20 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 0a 20    WHERE id=?;". 
6e80: 20 20 74 65 73 74 2d 69 64 20 74 65 73 74 2d 69    test-id test-i
6e90: 64 20 74 65 73 74 2d 69 64 29 0a 20 20 3b 3b 20  d test-id).  ;; 
6ea0: 69 66 20 74 68 65 20 74 65 73 74 20 69 73 20 6e  if the test is n
6eb0: 6f 74 20 46 41 49 4c 20 74 68 65 6e 20 73 65 74  ot FAIL then set
6ec0: 20 73 74 61 74 75 73 20 62 61 73 65 64 20 6f 6e   status based on
6ed0: 20 74 68 65 20 66 61 69 6c 20 61 6e 64 20 70 61   the fail and pa
6ee0: 73 73 20 63 6f 75 6e 74 73 2e 0a 20 20 28 74 68  ss counts..  (th
6ef0: 72 65 61 64 2d 73 6c 65 65 70 21 20 31 29 0a 20  read-sleep! 1). 
6f00: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
6f10: 65 0a 20 20 20 64 62 0a 20 20 20 22 55 50 44 41  e.   db.   "UPDA
6f20: 54 45 20 74 65 73 74 73 0a 20 20 20 20 20 20 53  TE tests.      S
6f30: 45 54 20 73 74 61 74 75 73 3d 43 41 53 45 20 57  ET status=CASE W
6f40: 48 45 4e 20 28 53 45 4c 45 43 54 20 66 61 69 6c  HEN (SELECT fail
6f50: 5f 63 6f 75 6e 74 20 46 52 4f 4d 20 74 65 73 74  _count FROM test
6f60: 73 20 57 48 45 52 45 20 69 64 3d 3f 29 20 3e 20  s WHERE id=?) > 
6f70: 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0 .             
6f80: 20 20 20 20 20 20 20 20 20 20 20 20 54 48 45 4e              THEN
6f90: 20 27 46 41 49 4c 27 0a 20 20 20 20 20 20 20 20   'FAIL'.        
6fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
6fb0: 45 4e 20 28 53 45 4c 45 43 54 20 70 61 73 73 5f  EN (SELECT pass_
6fc0: 63 6f 75 6e 74 20 46 52 4f 4d 20 74 65 73 74 73  count FROM tests
6fd0: 20 57 48 45 52 45 20 69 64 3d 3f 29 20 3e 20 30   WHERE id=?) > 0
6fe0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6ff0: 20 20 20 20 20 20 20 20 20 20 54 48 45 4e 20 27            THEN '
7000: 50 41 53 53 27 0a 20 20 20 20 20 20 20 20 20 20  PASS'.          
7010: 20 20 20 20 20 20 20 20 20 20 20 20 45 4c 53 45              ELSE
7020: 20 73 74 61 74 75 73 0a 20 20 20 20 20 20 20 20   status.        
7030: 20 20 20 20 20 20 20 20 20 20 45 4e 44 20 57 48            END WH
7040: 45 52 45 20 69 64 3d 3f 3b 22 0a 20 20 20 74 65  ERE id=?;".   te
7050: 73 74 2d 69 64 20 74 65 73 74 2d 69 64 20 74 65  st-id test-id te
7060: 73 74 2d 69 64 29 29 0a 0a 28 64 65 66 69 6e 65  st-id))..(define
7070: 20 28 64 62 3a 67 65 74 2d 70 72 65 76 2d 74 6f   (db:get-prev-to
7080: 6c 2d 66 6f 72 2d 74 65 73 74 20 64 62 20 74 65  l-for-test db te
7090: 73 74 2d 69 64 20 63 61 74 65 67 6f 72 79 20 76  st-id category v
70a0: 61 72 69 61 62 6c 65 29 0a 20 20 3b 3b 20 46 69  ariable).  ;; Fi
70b0: 6e 69 73 68 20 6d 65 3f 0a 20 20 28 76 61 6c 75  nish me?.  (valu
70c0: 65 73 20 23 66 20 23 66 20 23 66 29 29 0a 0a 3b  es #f #f #f))..;
70d0: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;===============
70e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
70f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7100: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7110: 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 53 20 54 20 45  =======.;; S T E
7120: 20 50 20 53 20 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d   P S .;;========
7130: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7140: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7150: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7160: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a  ==============..
7170: 28 64 65 66 69 6e 65 20 28 64 62 3a 73 74 65 70  (define (db:step
7180: 2d 67 65 74 2d 74 69 6d 65 2d 61 73 2d 73 74 72  -get-time-as-str
7190: 69 6e 67 20 76 65 63 29 0a 20 20 28 73 65 63 6f  ing vec).  (seco
71a0: 6e 64 73 2d 3e 74 69 6d 65 2d 73 74 72 69 6e 67  nds->time-string
71b0: 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 76   (db:step-get-ev
71c0: 65 6e 74 5f 74 69 6d 65 20 76 65 63 29 29 29 0a  ent_time vec))).
71d0: 0a 3b 3b 20 64 62 2d 67 65 74 2d 74 65 73 74 2d  .;; db-get-test-
71e0: 73 74 65 70 73 2d 66 6f 72 2d 72 75 6e 0a 28 64  steps-for-run.(d
71f0: 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 73 74  efine (db:get-st
7200: 65 70 73 2d 66 6f 72 2d 74 65 73 74 20 64 62 20  eps-for-test db 
7210: 74 65 73 74 2d 69 64 29 0a 20 20 28 6c 65 74 20  test-id).  (let 
7220: 28 28 72 65 73 20 27 28 29 29 29 0a 20 20 20 20  ((res '())).    
7230: 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63  (sqlite3:for-eac
7240: 68 2d 72 6f 77 20 0a 20 20 20 20 20 28 6c 61 6d  h-row .     (lam
7250: 62 64 61 20 28 69 64 20 74 65 73 74 2d 69 64 20  bda (id test-id 
7260: 73 74 65 70 6e 61 6d 65 20 73 74 61 74 65 20 73  stepname state s
7270: 74 61 74 75 73 20 65 76 65 6e 74 2d 74 69 6d 65  tatus event-time
7280: 20 6c 6f 67 66 69 6c 65 29 0a 20 20 20 20 20 20   logfile).      
7290: 20 28 73 65 74 21 20 72 65 73 20 28 63 6f 6e 73   (set! res (cons
72a0: 20 28 76 65 63 74 6f 72 20 69 64 20 74 65 73 74   (vector id test
72b0: 2d 69 64 20 73 74 65 70 6e 61 6d 65 20 73 74 61  -id stepname sta
72c0: 74 65 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d  te status event-
72d0: 74 69 6d 65 20 28 69 66 20 28 73 74 72 69 6e 67  time (if (string
72e0: 3f 20 6c 6f 67 66 69 6c 65 29 20 6c 6f 67 66 69  ? logfile) logfi
72f0: 6c 65 20 22 22 29 29 20 72 65 73 29 29 29 0a 20  le "")) res))). 
7300: 20 20 20 20 64 62 0a 20 20 20 20 20 22 53 45 4c      db.     "SEL
7310: 45 43 54 20 69 64 2c 74 65 73 74 5f 69 64 2c 73  ECT id,test_id,s
7320: 74 65 70 6e 61 6d 65 2c 73 74 61 74 65 2c 73 74  tepname,state,st
7330: 61 74 75 73 2c 65 76 65 6e 74 5f 74 69 6d 65 2c  atus,event_time,
7340: 6c 6f 67 66 69 6c 65 20 46 52 4f 4d 20 74 65 73  logfile FROM tes
7350: 74 5f 73 74 65 70 73 20 57 48 45 52 45 20 74 65  t_steps WHERE te
7360: 73 74 5f 69 64 3d 3f 20 4f 52 44 45 52 20 42 59  st_id=? ORDER BY
7370: 20 69 64 20 41 53 43 3b 22 20 3b 3b 20 65 76 65   id ASC;" ;; eve
7380: 6e 74 5f 74 69 6d 65 20 44 45 53 43 2c 69 64 20  nt_time DESC,id 
7390: 41 53 43 3b 0a 20 20 20 20 20 74 65 73 74 2d 69  ASC;.     test-i
73a0: 64 29 0a 20 20 20 20 28 72 65 76 65 72 73 65 20  d).    (reverse 
73b0: 72 65 73 29 29 29 0a 0a 3b 3b 20 67 65 74 20 61  res)))..;; get a
73c0: 20 70 72 65 74 74 79 20 74 61 62 6c 65 20 74 6f   pretty table to
73d0: 20 73 75 6d 6d 61 72 69 7a 65 20 73 74 65 70 73   summarize steps
73e0: 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  .;;.(define (db:
73f0: 67 65 74 2d 73 74 65 70 73 2d 74 61 62 6c 65 20  get-steps-table 
7400: 64 62 20 74 65 73 74 2d 69 64 29 0a 20 20 28 6c  db test-id).  (l
7410: 65 74 20 28 28 73 74 65 70 73 20 20 20 28 64 62  et ((steps   (db
7420: 3a 67 65 74 2d 73 74 65 70 73 2d 66 6f 72 2d 74  :get-steps-for-t
7430: 65 73 74 20 64 62 20 74 65 73 74 2d 69 64 29 29  est db test-id))
7440: 29 0a 20 20 20 20 3b 3b 20 6f 72 67 61 6e 69 73  ).    ;; organis
7450: 65 20 74 68 65 20 73 74 65 70 73 20 66 6f 72 20  e the steps for 
7460: 62 65 74 74 65 72 20 72 65 61 64 61 62 69 6c 69  better readabili
7470: 74 79 0a 20 20 20 20 28 6c 65 74 20 28 28 72 65  ty.    (let ((re
7480: 73 20 28 6d 61 6b 65 2d 68 61 73 68 2d 74 61 62  s (make-hash-tab
7490: 6c 65 29 29 29 0a 20 20 20 20 20 20 28 66 6f 72  le))).      (for
74a0: 2d 65 61 63 68 20 0a 20 20 20 20 20 20 20 28 6c  -each .       (l
74b0: 61 6d 62 64 61 20 28 73 74 65 70 29 0a 09 20 28  ambda (step).. (
74c0: 64 65 62 75 67 3a 70 72 69 6e 74 20 36 20 22 73  debug:print 6 "s
74d0: 74 65 70 3d 22 20 73 74 65 70 29 0a 09 20 28 6c  tep=" step).. (l
74e0: 65 74 20 28 28 72 65 63 6f 72 64 20 28 68 61 73  et ((record (has
74f0: 68 2d 74 61 62 6c 65 2d 72 65 66 2f 64 65 66 61  h-table-ref/defa
7500: 75 6c 74 20 0a 09 09 09 72 65 73 20 0a 09 09 09  ult ....res ....
7510: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 65  (db:step-get-ste
7520: 70 6e 61 6d 65 20 73 74 65 70 29 20 0a 09 09 09  pname step) ....
7530: 3b 3b 20 20 20 20 20 20 20 20 73 74 65 70 6e 61  ;;        stepna
7540: 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  me              
7550: 20 20 73 74 61 72 74 20 65 6e 64 20 73 74 61 74    start end stat
7560: 75 73 20 20 20 20 0a 09 09 09 28 76 65 63 74 6f  us    ....(vecto
7570: 72 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73  r (db:step-get-s
7580: 74 65 70 6e 61 6d 65 20 73 74 65 70 29 20 22 22  tepname step) ""
7590: 20 20 20 22 22 20 22 22 20 20 20 20 20 22 22 20     "" ""     "" 
75a0: 22 22 29 29 29 29 0a 09 20 20 20 28 64 65 62 75  ""))))..   (debu
75b0: 67 3a 70 72 69 6e 74 20 36 20 22 72 65 63 6f 72  g:print 6 "recor
75c0: 64 28 62 65 66 6f 72 65 29 20 3d 20 22 20 72 65  d(before) = " re
75d0: 63 6f 72 64 20 0a 09 09 09 22 5c 6e 69 64 3a 20  cord ...."\nid: 
75e0: 20 20 20 20 20 20 22 20 28 64 62 3a 73 74 65 70        " (db:step
75f0: 2d 67 65 74 2d 69 64 20 73 74 65 70 29 0a 09 09  -get-id step)...
7600: 09 22 5c 6e 73 74 65 70 6e 61 6d 65 3a 20 22 20  ."\nstepname: " 
7610: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 65  (db:step-get-ste
7620: 70 6e 61 6d 65 20 73 74 65 70 29 0a 09 09 09 22  pname step)...."
7630: 5c 6e 73 74 61 74 65 3a 20 20 20 20 22 20 28 64  \nstate:    " (d
7640: 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 74 65  b:step-get-state
7650: 20 73 74 65 70 29 0a 09 09 09 22 5c 6e 73 74 61   step)...."\nsta
7660: 74 75 73 3a 20 20 20 22 20 28 64 62 3a 73 74 65  tus:   " (db:ste
7670: 70 2d 67 65 74 2d 73 74 61 74 75 73 20 73 74 65  p-get-status ste
7680: 70 29 0a 09 09 09 22 5c 6e 74 69 6d 65 3a 20 20  p)...."\ntime:  
7690: 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65     " (db:step-ge
76a0: 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73 74 65  t-event_time ste
76b0: 70 29 29 0a 09 20 20 20 28 63 61 73 65 20 28 73  p))..   (case (s
76c0: 74 72 69 6e 67 2d 3e 73 79 6d 62 6f 6c 20 28 64  tring->symbol (d
76d0: 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 74 65  b:step-get-state
76e0: 20 73 74 65 70 29 29 0a 09 20 20 20 20 20 28 28   step))..     ((
76f0: 73 74 61 72 74 29 28 76 65 63 74 6f 72 2d 73 65  start)(vector-se
7700: 74 21 20 72 65 63 6f 72 64 20 31 20 28 64 62 3a  t! record 1 (db:
7710: 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74  step-get-event_t
7720: 69 6d 65 20 73 74 65 70 29 29 0a 09 20 20 20 20  ime step))..    
7730: 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72    (vector-set! r
7740: 65 63 6f 72 64 20 33 20 28 69 66 20 28 65 71 75  ecord 3 (if (equ
7750: 61 6c 3f 20 28 76 65 63 74 6f 72 2d 72 65 66 20  al? (vector-ref 
7760: 72 65 63 6f 72 64 20 33 29 20 22 22 29 0a 09 09  record 3) "")...
7770: 09 09 09 28 64 62 3a 73 74 65 70 2d 67 65 74 2d  ...(db:step-get-
7780: 73 74 61 74 75 73 20 73 74 65 70 29 29 29 0a 09  status step)))..
7790: 20 20 20 20 20 20 28 69 66 20 28 3e 20 28 73 74        (if (> (st
77a0: 72 69 6e 67 2d 6c 65 6e 67 74 68 20 28 64 62 3a  ring-length (db:
77b0: 73 74 65 70 2d 67 65 74 2d 6c 6f 67 66 69 6c 65  step-get-logfile
77c0: 20 73 74 65 70 29 29 0a 09 09 20 20 20 20 20 30   step))...     0
77d0: 29 0a 09 09 20 20 28 76 65 63 74 6f 72 2d 73 65  )...  (vector-se
77e0: 74 21 20 72 65 63 6f 72 64 20 35 20 28 64 62 3a  t! record 5 (db:
77f0: 73 74 65 70 2d 67 65 74 2d 6c 6f 67 66 69 6c 65  step-get-logfile
7800: 20 73 74 65 70 29 29 29 29 0a 09 20 20 20 20 20   step))))..     
7810: 28 28 65 6e 64 29 20 20 0a 09 20 20 20 20 20 20  ((end)  ..      
7820: 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63  (vector-set! rec
7830: 6f 72 64 20 32 20 28 61 6e 79 2d 3e 6e 75 6d 62  ord 2 (any->numb
7840: 65 72 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d  er (db:step-get-
7850: 65 76 65 6e 74 5f 74 69 6d 65 20 73 74 65 70 29  event_time step)
7860: 29 29 0a 09 20 20 20 20 20 20 28 76 65 63 74 6f  ))..      (vecto
7870: 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 33 20  r-set! record 3 
7880: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61  (db:step-get-sta
7890: 74 75 73 20 73 74 65 70 29 29 0a 09 20 20 20 20  tus step))..    
78a0: 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72    (vector-set! r
78b0: 65 63 6f 72 64 20 34 20 28 6c 65 74 20 28 28 73  ecord 4 (let ((s
78c0: 74 61 72 74 74 20 28 61 6e 79 2d 3e 6e 75 6d 62  tartt (any->numb
78d0: 65 72 20 28 76 65 63 74 6f 72 2d 72 65 66 20 72  er (vector-ref r
78e0: 65 63 6f 72 64 20 31 29 29 29 0a 09 09 09 09 09  ecord 1)))......
78f0: 20 20 28 65 6e 64 74 20 20 20 28 61 6e 79 2d 3e    (endt   (any->
7900: 6e 75 6d 62 65 72 20 28 76 65 63 74 6f 72 2d 72  number (vector-r
7910: 65 66 20 72 65 63 6f 72 64 20 32 29 29 29 29 0a  ef record 2)))).
7920: 09 09 09 09 20 20 20 20 20 20 28 64 65 62 75 67  ....      (debug
7930: 3a 70 72 69 6e 74 20 34 20 22 72 65 63 6f 72 64  :print 4 "record
7940: 5b 31 5d 3d 22 20 28 76 65 63 74 6f 72 2d 72 65  [1]=" (vector-re
7950: 66 20 72 65 63 6f 72 64 20 31 29 20 0a 09 09 09  f record 1) ....
7960: 09 09 09 20 20 20 22 2c 20 73 74 61 72 74 74 3d  ...   ", startt=
7970: 22 20 73 74 61 72 74 74 20 22 2c 20 65 6e 64 74  " startt ", endt
7980: 3d 22 20 65 6e 64 74 0a 09 09 09 09 09 09 20 20  =" endt.......  
7990: 20 22 2c 20 67 65 74 2d 73 74 61 74 75 73 3a 20   ", get-status: 
79a0: 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73  " (db:step-get-s
79b0: 74 61 74 75 73 20 73 74 65 70 29 29 0a 09 09 09  tatus step))....
79c0: 09 20 20 20 20 20 20 28 69 66 20 28 61 6e 64 20  .      (if (and 
79d0: 28 6e 75 6d 62 65 72 3f 20 73 74 61 72 74 74 29  (number? startt)
79e0: 28 6e 75 6d 62 65 72 3f 20 65 6e 64 74 29 29 0a  (number? endt)).
79f0: 09 09 09 09 09 20 20 28 73 65 63 6f 6e 64 73 2d  .....  (seconds-
7a00: 3e 68 72 2d 6d 69 6e 2d 73 65 63 20 28 2d 20 65  >hr-min-sec (- e
7a10: 6e 64 74 20 73 74 61 72 74 74 29 29 20 22 2d 31  ndt startt)) "-1
7a20: 22 29 29 29 0a 09 20 20 20 20 20 20 28 69 66 20  ")))..      (if 
7a30: 28 3e 20 28 73 74 72 69 6e 67 2d 6c 65 6e 67 74  (> (string-lengt
7a40: 68 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 6c  h (db:step-get-l
7a50: 6f 67 66 69 6c 65 20 73 74 65 70 29 29 0a 09 09  ogfile step))...
7a60: 20 20 20 20 20 30 29 0a 09 09 20 20 28 76 65 63       0)...  (vec
7a70: 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20  tor-set! record 
7a80: 35 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 6c  5 (db:step-get-l
7a90: 6f 67 66 69 6c 65 20 73 74 65 70 29 29 29 29 0a  ogfile step)))).
7aa0: 09 20 20 20 20 20 28 65 6c 73 65 0a 09 20 20 20  .     (else..   
7ab0: 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20     (vector-set! 
7ac0: 72 65 63 6f 72 64 20 32 20 28 64 62 3a 73 74 65  record 2 (db:ste
7ad0: 70 2d 67 65 74 2d 73 74 61 74 65 20 73 74 65 70  p-get-state step
7ae0: 29 29 0a 09 20 20 20 20 20 20 28 76 65 63 74 6f  ))..      (vecto
7af0: 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 33 20  r-set! record 3 
7b00: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61  (db:step-get-sta
7b10: 74 75 73 20 73 74 65 70 29 29 0a 09 20 20 20 20  tus step))..    
7b20: 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72    (vector-set! r
7b30: 65 63 6f 72 64 20 34 20 28 64 62 3a 73 74 65 70  ecord 4 (db:step
7b40: 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20  -get-event_time 
7b50: 73 74 65 70 29 29 29 29 0a 09 20 20 20 28 68 61  step))))..   (ha
7b60: 73 68 2d 74 61 62 6c 65 2d 73 65 74 21 20 72 65  sh-table-set! re
7b70: 73 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73  s (db:step-get-s
7b80: 74 65 70 6e 61 6d 65 20 73 74 65 70 29 20 72 65  tepname step) re
7b90: 63 6f 72 64 29 0a 09 20 20 20 28 64 65 62 75 67  cord)..   (debug
7ba0: 3a 70 72 69 6e 74 20 36 20 22 72 65 63 6f 72 64  :print 6 "record
7bb0: 28 61 66 74 65 72 29 20 20 3d 20 22 20 72 65 63  (after)  = " rec
7bc0: 6f 72 64 20 0a 09 09 09 22 5c 6e 69 64 3a 20 20  ord ...."\nid:  
7bd0: 20 20 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d       " (db:step-
7be0: 67 65 74 2d 69 64 20 73 74 65 70 29 0a 09 09 09  get-id step)....
7bf0: 22 5c 6e 73 74 65 70 6e 61 6d 65 3a 20 22 20 28  "\nstepname: " (
7c00: 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 65 70  db:step-get-step
7c10: 6e 61 6d 65 20 73 74 65 70 29 0a 09 09 09 22 5c  name step)...."\
7c20: 6e 73 74 61 74 65 3a 20 20 20 20 22 20 28 64 62  nstate:    " (db
7c30: 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 74 65 20  :step-get-state 
7c40: 73 74 65 70 29 0a 09 09 09 22 5c 6e 73 74 61 74  step)...."\nstat
7c50: 75 73 3a 20 20 20 22 20 28 64 62 3a 73 74 65 70  us:   " (db:step
7c60: 2d 67 65 74 2d 73 74 61 74 75 73 20 73 74 65 70  -get-status step
7c70: 29 0a 09 09 09 22 5c 6e 74 69 6d 65 3a 20 20 20  )...."\ntime:   
7c80: 20 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74    " (db:step-get
7c90: 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73 74 65 70  -event_time step
7ca0: 29 29 29 29 0a 20 20 20 20 20 20 20 3b 3b 20 28  )))).       ;; (
7cb0: 65 6c 73 65 20 20 20 28 76 65 63 74 6f 72 2d 73  else   (vector-s
7cc0: 65 74 21 20 72 65 63 6f 72 64 20 31 20 28 64 62  et! record 1 (db
7cd0: 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f  :step-get-event_
7ce0: 74 69 6d 65 20 73 74 65 70 29 29 29 0a 20 20 20  time step))).   
7cf0: 20 20 20 20 28 73 6f 72 74 20 73 74 65 70 73 20      (sort steps 
7d00: 28 6c 61 6d 62 64 61 20 28 61 20 62 29 28 3c 20  (lambda (a b)(< 
7d10: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65  (db:step-get-eve
7d20: 6e 74 5f 74 69 6d 65 20 61 29 28 64 62 3a 73 74  nt_time a)(db:st
7d30: 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d  ep-get-event_tim
7d40: 65 20 62 29 29 29 29 29 0a 20 20 20 20 20 20 72  e b))))).      r
7d50: 65 73 29 29 29 0a 0a 3b 3b 20 55 53 45 3a 20 28  es)))..;; USE: (
7d60: 6c 73 65 74 2d 64 69 66 66 65 72 65 6e 63 65 20  lset-difference 
7d70: 73 74 72 69 6e 67 3d 3f 20 27 28 22 61 22 20 22  string=? '("a" "
7d80: 62 22 20 22 63 22 29 20 27 28 22 64 22 20 22 63  b" "c") '("d" "c
7d90: 22 20 22 65 22 20 22 61 22 29 29 0a 3b 3b 0a 3b  " "e" "a")).;;.;
7da0: 3b 20 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20  ; Return a list 
7db0: 6f 66 20 70 72 65 72 65 71 73 20 74 68 61 74 20  of prereqs that 
7dc0: 77 65 72 65 20 4e 4f 54 20 6d 65 74 0a 3b 3b 20  were NOT met.;; 
7dd0: 20 54 65 73 74 73 20 28 61 6e 64 20 61 6c 6c 20   Tests (and all 
7de0: 69 74 65 6d 73 29 20 69 6e 20 77 61 69 74 6f 6e  items) in waiton
7df0: 20 6c 69 73 74 20 6d 75 73 74 20 62 65 20 22 43   list must be "C
7e00: 4f 4d 50 4c 45 54 45 44 22 20 61 6e 64 20 22 50  OMPLETED" and "P
7e10: 41 53 53 22 0a 28 64 65 66 69 6e 65 20 28 64 62  ASS".(define (db
7e20: 2d 67 65 74 2d 70 72 65 72 65 71 73 2d 6e 6f 74  -get-prereqs-not
7e30: 2d 6d 65 74 20 64 62 20 72 75 6e 2d 69 64 20 77  -met db run-id w
7e40: 61 69 74 6f 6e 29 0a 20 20 28 69 66 20 28 6e 75  aiton).  (if (nu
7e50: 6c 6c 3f 20 77 61 69 74 6f 6e 29 0a 20 20 20 20  ll? waiton).    
7e60: 20 20 27 28 29 0a 20 20 20 20 20 20 28 6c 65 74    '().      (let
7e70: 2a 20 28 28 75 6e 6d 65 74 2d 70 72 65 2d 72 65  * ((unmet-pre-re
7e80: 71 73 20 27 28 29 29 0a 09 20 20 20 20 20 28 74  qs '())..     (t
7e90: 65 73 74 73 20 20 20 20 20 20 20 20 20 20 20 28  ests           (
7ea0: 64 62 2d 67 65 74 2d 74 65 73 74 73 2d 66 6f 72  db-get-tests-for
7eb0: 2d 72 75 6e 20 64 62 20 72 75 6e 2d 69 64 20 23  -run db run-id #
7ec0: 66 20 23 66 20 27 28 29 20 27 28 29 29 29 0a 09  f #f '() '()))..
7ed0: 20 20 20 20 20 28 72 65 73 75 6c 74 20 20 20 20       (result    
7ee0: 20 20 20 20 20 27 28 29 29 29 0a 09 28 66 6f 72       '()))..(for
7ef0: 2d 65 61 63 68 20 28 6c 61 6d 62 64 61 20 28 77  -each (lambda (w
7f00: 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 29 0a  aitontest-name).
7f10: 09 09 20 20 20 20 28 6c 65 74 20 28 28 65 76 65  ..    (let ((eve
7f20: 72 2d 73 65 65 6e 20 23 66 29 29 0a 09 09 20 20  r-seen #f))...  
7f30: 20 20 20 20 28 66 6f 72 2d 65 61 63 68 20 28 6c      (for-each (l
7f40: 61 6d 62 64 61 20 28 74 65 73 74 29 0a 09 09 09  ambda (test)....
7f50: 09 20 20 28 69 66 20 28 65 71 75 61 6c 3f 20 77  .  (if (equal? w
7f60: 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 20 28  aitontest-name (
7f70: 64 62 3a 74 65 73 74 2d 67 65 74 2d 74 65 73 74  db:test-get-test
7f80: 6e 61 6d 65 20 74 65 73 74 29 29 0a 09 09 09 09  name test)).....
7f90: 20 20 20 20 20 20 28 62 65 67 69 6e 0a 09 09 09        (begin....
7fa0: 09 09 28 73 65 74 21 20 65 76 65 72 2d 73 65 65  ..(set! ever-see
7fb0: 6e 20 23 74 29 0a 09 09 09 09 09 28 69 66 20 28  n #t)......(if (
7fc0: 6e 6f 74 20 28 61 6e 64 20 28 65 71 75 61 6c 3f  not (and (equal?
7fd0: 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 73 74   (db:test-get-st
7fe0: 61 74 65 20 74 65 73 74 29 20 22 43 4f 4d 50 4c  ate test) "COMPL
7ff0: 45 54 45 44 22 29 0a 09 09 09 09 09 09 20 20 20  ETED").......   
8000: 20 20 20 28 6d 65 6d 62 65 72 20 28 64 62 3a 74     (member (db:t
8010: 65 73 74 2d 67 65 74 2d 73 74 61 74 75 73 20 74  est-get-status t
8020: 65 73 74 29 20 27 28 22 50 41 53 53 22 20 22 57  est) '("PASS" "W
8030: 41 52 4e 22 20 22 43 48 45 43 4b 22 29 29 29 29  ARN" "CHECK"))))
8040: 0a 09 09 09 09 09 20 20 20 20 28 73 65 74 21 20  ......    (set! 
8050: 72 65 73 75 6c 74 20 28 63 6f 6e 73 20 77 61 69  result (cons wai
8060: 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 20 72 65 73  tontest-name res
8070: 75 6c 74 29 29 29 29 29 29 0a 09 09 09 09 74 65  ult)))))).....te
8080: 73 74 73 29 0a 09 09 20 20 20 20 20 20 28 69 66  sts)...      (if
8090: 20 28 6e 6f 74 20 65 76 65 72 2d 73 65 65 6e 29   (not ever-seen)
80a0: 28 73 65 74 21 20 72 65 73 75 6c 74 20 28 63 6f  (set! result (co
80b0: 6e 73 20 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61  ns waitontest-na
80c0: 6d 65 20 72 65 73 75 6c 74 29 29 29 29 29 0a 09  me result)))))..
80d0: 09 20 20 77 61 69 74 6f 6e 29 0a 09 28 64 65 6c  .  waiton)..(del
80e0: 65 74 65 2d 64 75 70 6c 69 63 61 74 65 73 20 72  ete-duplicates r
80f0: 65 73 75 6c 74 29 29 29 29 0a 0a 3b 3b 20 74 68  esult))))..;; th
8100: 65 20 6e 65 77 20 70 72 65 72 65 71 73 20 63 61  e new prereqs ca
8110: 6c 63 75 6c 61 74 69 6f 6e 2c 20 6c 6f 6f 6b 73  lculation, looks
8120: 20 61 6c 73 6f 20 61 74 20 69 74 65 6d 70 61 74   also at itempat
8130: 68 20 69 66 20 73 70 65 63 69 66 69 65 64 0a 3b  h if specified.;
8140: 3b 20 61 6c 6c 20 70 72 65 72 65 71 73 20 6d 75  ; all prereqs mu
8150: 73 74 20 62 65 20 6d 65 74 3a 0a 3b 3b 20 20 20  st be met:.;;   
8160: 20 69 66 20 70 72 65 72 65 71 20 74 65 73 74 20   if prereq test 
8170: 77 69 74 68 20 69 74 65 6d 70 61 74 68 3d 27 27  with itempath=''
8180: 20 69 73 20 43 4f 4d 50 4c 45 54 45 44 20 61 6e   is COMPLETED an
8190: 64 20 50 41 53 53 2c 20 57 41 52 4e 2c 20 43 48  d PASS, WARN, CH
81a0: 45 43 4b 2c 20 6f 72 20 57 41 49 56 45 44 20 74  ECK, or WAIVED t
81b0: 68 65 6e 20 70 72 65 72 65 71 20 69 73 20 6d 65  hen prereq is me
81c0: 74 0a 3b 3b 20 20 20 20 69 66 20 70 72 65 72 65  t.;;    if prere
81d0: 71 20 74 65 73 74 20 77 69 74 68 20 69 74 65 6d  q test with item
81e0: 70 61 74 68 3d 72 65 66 2d 69 74 65 6d 2d 70 61  path=ref-item-pa
81f0: 74 68 20 61 6e 64 20 43 4f 4d 50 4c 45 54 45 44  th and COMPLETED
8200: 20 77 69 74 68 20 50 41 53 53 2c 20 57 41 52 4e   with PASS, WARN
8210: 2c 20 43 48 45 43 4b 2c 20 6f 72 20 57 41 49 56  , CHECK, or WAIV
8220: 45 44 20 74 68 65 6e 20 70 72 65 72 65 71 20 69  ED then prereq i
8230: 73 20 6d 65 74 0a 28 64 65 66 69 6e 65 20 28 64  s met.(define (d
8240: 62 3a 67 65 74 2d 70 72 65 72 65 71 73 2d 6e 6f  b:get-prereqs-no
8250: 74 2d 6d 65 74 20 64 62 20 72 75 6e 2d 69 64 20  t-met db run-id 
8260: 77 61 69 74 6f 6e 73 20 72 65 66 2d 69 74 65 6d  waitons ref-item
8270: 2d 70 61 74 68 29 0a 20 20 28 69 66 20 28 6f 72  -path).  (if (or
8280: 20 28 6e 6f 74 20 77 61 69 74 6f 6e 73 29 0a 09   (not waitons)..
8290: 20 20 28 6e 75 6c 6c 3f 20 77 61 69 74 6f 6e 73    (null? waitons
82a0: 29 29 0a 20 20 20 20 20 20 27 28 29 0a 20 20 20  )).      '().   
82b0: 20 20 20 28 6c 65 74 2a 20 28 28 75 6e 6d 65 74     (let* ((unmet
82c0: 2d 70 72 65 2d 72 65 71 73 20 27 28 29 29 0a 09  -pre-reqs '())..
82d0: 20 20 20 20 20 28 72 65 73 75 6c 74 20 20 20 20       (result    
82e0: 20 20 20 20 20 27 28 29 29 29 0a 09 28 66 6f 72       '()))..(for
82f0: 2d 65 61 63 68 20 0a 09 20 28 6c 61 6d 62 64 61  -each .. (lambda
8300: 20 28 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d   (waitontest-nam
8310: 65 29 0a 09 20 20 20 3b 3b 20 62 79 20 67 65 74  e)..   ;; by get
8320: 74 69 6e 67 20 74 68 65 20 74 65 73 74 73 20 77  ting the tests w
8330: 69 74 68 20 6d 61 74 63 68 69 6e 67 20 6e 61 6d  ith matching nam
8340: 65 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67  e we are looking
8350: 20 6f 6e 6c 79 20 61 74 20 74 68 65 20 6d 61 74   only at the mat
8360: 63 68 69 6e 67 20 74 65 73 74 20 0a 09 20 20 20  ching test ..   
8370: 3b 3b 20 61 6e 64 20 72 65 6c 61 74 65 64 20 73  ;; and related s
8380: 75 62 20 69 74 65 6d 73 0a 09 20 20 20 28 6c 65  ub items..   (le
8390: 74 20 28 28 74 65 73 74 73 20 20 20 20 20 20 20  t ((tests       
83a0: 20 20 20 20 20 20 28 64 62 2d 67 65 74 2d 74 65        (db-get-te
83b0: 73 74 73 2d 66 6f 72 2d 72 75 6e 20 64 62 20 72  sts-for-run db r
83c0: 75 6e 2d 69 64 20 77 61 69 74 6f 6e 74 65 73 74  un-id waitontest
83d0: 2d 6e 61 6d 65 20 23 66 20 27 28 29 20 27 28 29  -name #f '() '()
83e0: 29 29 0a 09 09 20 28 65 76 65 72 2d 73 65 65 6e  ))... (ever-seen
83f0: 20 20 20 20 20 20 20 20 20 23 66 29 0a 09 09 20           #f)... 
8400: 28 70 61 72 65 6e 74 2d 77 61 69 74 6f 6e 2d 6d  (parent-waiton-m
8410: 65 74 20 23 66 29 0a 09 09 20 28 69 74 65 6d 2d  et #f)... (item-
8420: 77 61 69 74 6f 6e 2d 6d 65 74 20 20 20 23 66 29  waiton-met   #f)
8430: 29 0a 09 20 20 20 20 20 28 66 6f 72 2d 65 61 63  )..     (for-eac
8440: 68 20 0a 09 20 20 20 20 20 20 28 6c 61 6d 62 64  h ..      (lambd
8450: 61 20 28 74 65 73 74 29 0a 09 09 3b 3b 20 28 69  a (test)...;; (i
8460: 66 20 28 65 71 75 61 6c 3f 20 77 61 69 74 6f 6e  f (equal? waiton
8470: 74 65 73 74 2d 6e 61 6d 65 20 28 64 62 3a 74 65  test-name (db:te
8480: 73 74 2d 67 65 74 2d 74 65 73 74 6e 61 6d 65 20  st-get-testname 
8490: 74 65 73 74 29 29 20 3b 3b 20 62 79 20 64 65 66  test)) ;; by def
84a0: 69 6e 74 69 6f 6e 20 74 68 69 73 20 68 61 64 20  intion this had 
84b0: 62 65 74 74 65 72 20 62 65 20 74 72 75 65 20 2e  better be true .
84c0: 2e 2e 0a 09 09 28 6c 65 74 2a 20 28 28 73 74 61  .....(let* ((sta
84d0: 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 28  te             (
84e0: 64 62 3a 74 65 73 74 2d 67 65 74 2d 73 74 61 74  db:test-get-stat
84f0: 65 20 74 65 73 74 29 29 0a 09 09 20 20 20 20 20  e test))...     
8500: 20 20 28 73 74 61 74 75 73 20 20 20 20 20 20 20    (status       
8510: 20 20 20 20 20 28 64 62 3a 74 65 73 74 2d 67 65       (db:test-ge
8520: 74 2d 73 74 61 74 75 73 20 74 65 73 74 29 29 0a  t-status test)).
8530: 09 09 20 20 20 20 20 20 20 28 69 74 65 6d 2d 70  ..       (item-p
8540: 61 74 68 20 20 20 20 20 20 20 20 20 28 64 62 3a  ath         (db:
8550: 74 65 73 74 2d 67 65 74 2d 69 74 65 6d 2d 70 61  test-get-item-pa
8560: 74 68 20 74 65 73 74 29 29 0a 09 09 20 20 20 20  th test))...    
8570: 20 20 20 28 69 73 2d 63 6f 6d 70 6c 65 74 65 64     (is-completed
8580: 20 20 20 20 20 20 28 65 71 75 61 6c 3f 20 73 74        (equal? st
8590: 61 74 65 20 22 43 4f 4d 50 4c 45 54 45 44 22 29  ate "COMPLETED")
85a0: 29 0a 09 09 20 20 20 20 20 20 20 28 69 73 2d 6f  )...       (is-o
85b0: 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6d  k             (m
85c0: 65 6d 62 65 72 20 73 74 61 74 75 73 20 27 28 22  ember status '("
85d0: 50 41 53 53 22 20 22 57 41 52 4e 22 20 22 43 48  PASS" "WARN" "CH
85e0: 45 43 4b 22 20 22 57 41 49 56 45 44 22 29 29 29  ECK" "WAIVED")))
85f0: 0a 09 09 20 20 20 20 20 20 20 28 73 61 6d 65 2d  ...       (same-
8600: 69 74 65 6d 70 61 74 68 20 20 20 20 20 28 65 71  itempath     (eq
8610: 75 61 6c 3f 20 72 65 66 2d 69 74 65 6d 2d 70 61  ual? ref-item-pa
8620: 74 68 20 69 74 65 6d 2d 70 61 74 68 29 29 29 0a  th item-path))).
8630: 09 09 20 20 28 73 65 74 21 20 65 76 65 72 2d 73  ..  (set! ever-s
8640: 65 65 6e 20 23 74 29 0a 09 09 20 20 28 63 6f 6e  een #t)...  (con
8650: 64 0a 09 09 20 20 20 3b 3b 20 63 61 73 65 20 31  d...   ;; case 1
8660: 2c 20 6e 6f 6e 2d 69 74 65 6d 20 28 70 61 72 65  , non-item (pare
8670: 6e 74 20 74 65 73 74 29 20 69 73 20 0a 09 09 20  nt test) is ... 
8680: 20 20 28 28 61 6e 64 20 28 65 71 75 61 6c 3f 20    ((and (equal? 
8690: 69 74 65 6d 2d 70 61 74 68 20 22 22 29 20 3b 3b  item-path "") ;;
86a0: 20 74 68 69 73 20 69 73 20 74 68 65 20 70 61 72   this is the par
86b0: 65 6e 74 20 74 65 73 74 0a 09 09 09 20 69 73 2d  ent test.... is-
86c0: 63 6f 6d 70 6c 65 74 65 64 0a 09 09 09 20 69 73  completed.... is
86d0: 2d 6f 6b 29 0a 09 09 20 20 20 20 28 73 65 74 21  -ok)...    (set!
86e0: 20 70 61 72 65 6e 74 2d 77 61 69 74 6f 6e 2d 6d   parent-waiton-m
86f0: 65 74 20 23 74 29 29 0a 09 09 20 20 20 28 28 61  et #t))...   ((a
8700: 6e 64 20 73 61 6d 65 2d 69 74 65 6d 70 61 74 68  nd same-itempath
8710: 0a 09 09 09 20 69 73 2d 63 6f 6d 70 6c 65 74 65  .... is-complete
8720: 64 0a 09 09 09 20 69 73 2d 6f 6b 29 0a 09 09 20  d.... is-ok)... 
8730: 20 20 20 28 73 65 74 21 20 69 74 65 6d 2d 77 61     (set! item-wa
8740: 69 74 6f 6e 2d 6d 65 74 20 23 74 29 29 29 29 29  iton-met #t)))))
8750: 0a 09 20 20 20 20 20 20 74 65 73 74 73 29 0a 09  ..      tests)..
8760: 20 20 20 20 20 28 69 66 20 28 6e 6f 74 20 28 6f       (if (not (o
8770: 72 20 70 61 72 65 6e 74 2d 77 61 69 74 6f 6e 2d  r parent-waiton-
8780: 6d 65 74 20 69 74 65 6d 2d 77 61 69 74 6f 6e 2d  met item-waiton-
8790: 6d 65 74 29 29 0a 09 09 20 28 73 65 74 21 20 72  met))... (set! r
87a0: 65 73 75 6c 74 20 28 63 6f 6e 73 20 77 61 69 74  esult (cons wait
87b0: 6f 6e 74 65 73 74 2d 6e 61 6d 65 20 72 65 73 75  ontest-name resu
87c0: 6c 74 29 29 29 0a 09 20 20 20 20 20 3b 3b 20 69  lt)))..     ;; i
87d0: 66 20 74 68 65 20 74 65 73 74 20 69 73 20 6e 6f  f the test is no
87e0: 74 20 66 6f 75 6e 64 20 74 68 65 6e 20 63 6c 65  t found then cle
87f0: 61 72 6c 79 20 74 68 65 20 77 61 69 74 6f 6e 20  arly the waiton 
8800: 69 73 20 6e 6f 74 20 6d 65 74 2e 2e 2e 0a 09 20  is not met..... 
8810: 20 20 20 20 28 69 66 20 28 6e 6f 74 20 65 76 65      (if (not eve
8820: 72 2d 73 65 65 6e 29 28 73 65 74 21 20 72 65 73  r-seen)(set! res
8830: 75 6c 74 20 28 63 6f 6e 73 20 77 61 69 74 6f 6e  ult (cons waiton
8840: 74 65 73 74 2d 6e 61 6d 65 20 72 65 73 75 6c 74  test-name result
8850: 29 29 29 29 29 0a 09 77 61 69 74 6f 6e 73 29 0a  )))))..waitons).
8860: 20 20 20 20 20 20 28 64 65 6c 65 74 65 2d 64 75        (delete-du
8870: 70 6c 69 63 61 74 65 73 20 72 65 73 75 6c 74 29  plicates result)
8880: 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d  )))..;;=========
8890: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
88a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
88b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
88c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b  =============.;;
88d0: 20 45 78 74 72 61 63 74 20 6f 64 73 20 66 69 6c   Extract ods fil
88e0: 65 20 66 72 6f 6d 20 74 68 65 20 64 62 0a 3b 3b  e from the db.;;
88f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8900: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8910: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8920: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8930: 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 72 75 6e 73 70  ======..;; runsp
8940: 61 74 74 20 69 73 20 61 20 63 6f 6d 6d 61 20 64  att is a comma d
8950: 65 6c 69 6d 69 74 65 64 20 6c 69 73 74 20 6f 66  elimited list of
8960: 20 72 75 6e 20 70 61 74 74 65 72 6e 73 0a 3b 3b   run patterns.;;
8970: 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 20 6d   keypatt-alist m
8980: 75 73 74 20 63 6f 6e 74 61 69 6e 20 2a 61 6c 6c  ust contain *all
8990: 2a 20 6b 65 79 73 20 77 69 74 68 20 61 6e 20 61  * keys with an a
89a0: 73 73 6f 63 69 61 74 65 64 20 70 61 74 74 65 72  ssociated patter
89b0: 6e 3a 20 27 28 20 28 22 4b 45 59 31 22 20 22 25  n: '( ("KEY1" "%
89c0: 22 29 20 2e 2e 20 29 0a 28 64 65 66 69 6e 65 20  ") .. ).(define 
89d0: 28 64 62 3a 65 78 74 72 61 63 74 2d 6f 64 73 2d  (db:extract-ods-
89e0: 66 69 6c 65 20 64 62 20 6f 75 74 70 75 74 66 69  file db outputfi
89f0: 6c 65 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74  le keypatt-alist
8a00: 20 72 75 6e 73 70 61 74 74 20 70 61 74 68 6d 6f   runspatt pathmo
8a10: 64 29 0a 20 20 28 6c 65 74 2a 20 28 28 6b 65 79  d).  (let* ((key
8a20: 73 73 74 72 20 20 28 73 74 72 69 6e 67 2d 69 6e  sstr  (string-in
8a30: 74 65 72 73 70 65 72 73 65 20 28 6d 61 70 20 63  tersperse (map c
8a40: 61 72 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74  ar keypatt-alist
8a50: 29 20 22 2c 22 29 29 0a 09 20 28 6b 65 79 71 72  ) ",")).. (keyqr
8a60: 79 20 20 20 28 73 74 72 69 6e 67 2d 69 6e 74 65  y   (string-inte
8a70: 72 73 70 65 72 73 65 20 28 6d 61 70 20 28 6c 61  rsperse (map (la
8a80: 6d 62 64 61 20 28 70 29 28 63 6f 6e 63 20 28 63  mbda (p)(conc (c
8a90: 61 72 20 70 29 20 22 20 4c 49 4b 45 20 3f 20 22  ar p) " LIKE ? "
8aa0: 29 29 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74  )) keypatt-alist
8ab0: 29 20 22 20 41 4e 44 20 22 29 29 0a 09 20 28 6e  ) " AND ")).. (n
8ac0: 75 6d 6b 65 79 73 20 20 28 6c 65 6e 67 74 68 20  umkeys  (length 
8ad0: 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 29 29 0a  keypatt-alist)).
8ae0: 09 20 28 74 65 73 74 2d 69 64 73 20 27 28 29 29  . (test-ids '())
8af0: 0a 09 20 28 77 69 6e 64 6f 77 73 20 20 28 61 6e  .. (windows  (an
8b00: 64 20 70 61 74 68 6d 6f 64 20 28 73 75 62 73 74  d pathmod (subst
8b10: 72 69 6e 67 2d 69 6e 64 65 78 20 22 5c 5c 22 20  ring-index "\\" 
8b20: 70 61 74 68 6d 6f 64 29 29 29 0a 09 20 28 74 65  pathmod))).. (te
8b30: 6d 70 64 69 72 20 20 28 63 6f 6e 63 20 22 2f 74  mpdir  (conc "/t
8b40: 6d 70 2f 22 20 28 63 75 72 72 65 6e 74 2d 75 73  mp/" (current-us
8b50: 65 72 2d 6e 61 6d 65 29 20 22 2f 22 20 72 75 6e  er-name) "/" run
8b60: 73 70 61 74 74 20 22 5f 22 20 28 72 61 6e 64 6f  spatt "_" (rando
8b70: 6d 20 31 30 30 30 30 29 20 22 5f 22 20 28 63 75  m 10000) "_" (cu
8b80: 72 72 65 6e 74 2d 70 72 6f 63 65 73 73 2d 69 64  rrent-process-id
8b90: 29 29 29 0a 09 20 28 72 75 6e 73 68 65 61 64 65  ))).. (runsheade
8ba0: 72 20 28 61 70 70 65 6e 64 20 28 6c 69 73 74 20  r (append (list 
8bb0: 22 52 75 6e 20 49 64 22 20 22 52 75 6e 6e 61 6d  "Run Id" "Runnam
8bc0: 65 22 29 20 3b 20 30 20 31 0a 09 09 09 20 20 20  e") ; 0 1....   
8bd0: 20 20 28 6d 61 70 20 63 61 72 20 6b 65 79 70 61    (map car keypa
8be0: 74 74 2d 61 6c 69 73 74 29 20 20 20 3b 20 2b 20  tt-alist)   ; + 
8bf0: 4e 20 3d 20 6c 65 6e 67 74 68 20 6b 65 79 70 61  N = length keypa
8c00: 74 74 2d 61 6c 69 73 74 0a 09 09 09 20 20 20 20  tt-alist....    
8c10: 20 28 6c 69 73 74 20 22 54 65 73 74 6e 61 6d 65   (list "Testname
8c20: 22 20 20 20 20 20 20 20 20 20 20 3b 20 32 0a 09  "          ; 2..
8c30: 09 09 09 20 20 20 22 49 74 65 6d 20 50 61 74 68  ...   "Item Path
8c40: 22 20 20 20 20 20 20 20 20 20 3b 20 33 20 0a 09  "         ; 3 ..
8c50: 09 09 09 20 20 20 22 44 65 73 63 72 69 70 74 69  ...   "Descripti
8c60: 6f 6e 22 20 20 20 20 20 20 20 3b 20 34 20 0a 09  on"       ; 4 ..
8c70: 09 09 09 20 20 20 22 53 74 61 74 65 22 20 20 20  ...   "State"   
8c80: 20 20 20 20 20 20 20 20 20 20 3b 20 35 20 0a 09            ; 5 ..
8c90: 09 09 09 20 20 20 22 53 74 61 74 75 73 22 20 20  ...   "Status"  
8ca0: 20 20 20 20 20 20 20 20 20 20 3b 20 36 20 20 0a            ; 6  .
8cb0: 09 09 09 09 20 20 20 22 46 69 6e 61 6c 20 4c 6f  ....   "Final Lo
8cc0: 67 22 20 20 20 20 20 20 20 20 20 3b 20 37 20 0a  g"         ; 7 .
8cd0: 09 09 09 09 20 20 20 22 52 75 6e 20 44 75 72 61  ....   "Run Dura
8ce0: 74 69 6f 6e 22 20 20 20 20 20 20 3b 20 38 20 0a  tion"      ; 8 .
8cf0: 09 09 09 09 20 20 20 22 57 68 65 6e 20 52 75 6e  ....   "When Run
8d00: 22 20 20 20 20 20 20 20 20 20 20 3b 20 39 20 0a  "          ; 9 .
8d10: 09 09 09 09 20 20 20 22 54 61 67 73 22 20 20 20  ....   "Tags"   
8d20: 20 20 20 20 20 20 20 20 20 20 20 3b 20 31 30 0a             ; 10.
8d30: 09 09 09 09 20 20 20 22 52 75 6e 20 4f 77 6e 65  ....   "Run Owne
8d40: 72 22 20 20 20 20 20 20 20 20 20 3b 20 31 31 0a  r"         ; 11.
8d50: 09 09 09 09 20 20 20 22 43 6f 6d 6d 65 6e 74 22  ....   "Comment"
8d60: 20 20 20 20 20 20 20 20 20 20 20 3b 20 31 32 0a             ; 12.
8d70: 09 09 09 09 20 20 20 22 41 75 74 68 6f 72 22 20  ....   "Author" 
8d80: 20 20 20 20 20 20 20 20 20 20 20 3b 20 31 33 0a             ; 13.
8d90: 09 09 09 09 20 20 20 22 54 65 73 74 20 4f 77 6e  ....   "Test Own
8da0: 65 72 22 20 20 20 20 20 20 20 20 3b 20 31 34 0a  er"        ; 14.
8db0: 09 09 09 09 20 20 20 22 52 65 76 69 65 77 65 64  ....   "Reviewed
8dc0: 22 20 20 20 20 20 20 20 20 20 20 3b 20 31 35 0a  "          ; 15.
8dd0: 09 09 09 09 20 20 20 22 44 69 73 6b 66 72 65 65  ....   "Diskfree
8de0: 22 20 20 20 20 20 20 20 20 20 20 3b 20 31 36 0a  "          ; 16.
8df0: 09 09 09 09 20 20 20 22 55 6e 61 6d 65 22 20 20  ....   "Uname"  
8e00: 20 20 20 20 20 20 20 20 20 20 20 3b 20 31 37 0a             ; 17.
8e10: 09 09 09 09 20 20 20 22 52 75 6e 64 69 72 22 20  ....   "Rundir" 
8e20: 20 20 20 20 20 20 20 20 20 20 20 3b 20 31 38 0a             ; 18.
8e30: 09 09 09 09 20 20 20 22 48 6f 73 74 22 20 20 20  ....   "Host"   
8e40: 20 20 20 20 20 20 20 20 20 20 20 3b 20 31 39 0a             ; 19.
8e50: 09 09 09 09 20 20 20 22 43 70 75 20 4c 6f 61 64  ....   "Cpu Load
8e60: 22 20 20 20 20 20 20 20 20 20 20 3b 20 32 30 0a  "          ; 20.
8e70: 09 09 09 09 20 20 20 29 29 29 0a 09 20 28 72 65  ....   ))).. (re
8e80: 73 75 6c 74 73 20 28 6c 69 73 74 20 72 75 6e 73  sults (list runs
8e90: 68 65 61 64 65 72 29 29 09 09 09 20 0a 09 20 28  header))... .. (
8ea0: 74 65 73 74 64 61 74 61 2d 68 65 61 64 65 72 20  testdata-header 
8eb0: 28 6c 69 73 74 20 22 52 75 6e 20 49 64 22 20 22  (list "Run Id" "
8ec0: 54 65 73 74 6e 61 6d 65 22 20 22 49 74 65 6d 20  Testname" "Item 
8ed0: 50 61 74 68 22 20 22 43 61 74 65 67 6f 72 79 22  Path" "Category"
8ee0: 20 22 56 61 72 69 61 62 6c 65 22 20 22 56 61 6c   "Variable" "Val
8ef0: 75 65 22 20 22 45 78 70 65 63 74 65 64 22 20 22  ue" "Expected" "
8f00: 54 6f 6c 22 20 22 55 6e 69 74 73 22 20 22 53 74  Tol" "Units" "St
8f10: 61 74 75 73 22 20 22 43 6f 6d 6d 65 6e 74 22 29  atus" "Comment")
8f20: 29 29 0a 20 20 20 20 28 64 65 62 75 67 3a 70 72  )).    (debug:pr
8f30: 69 6e 74 20 32 20 22 55 73 69 6e 67 20 22 20 74  int 2 "Using " t
8f40: 65 6d 70 64 69 72 20 22 20 66 6f 72 20 63 6f 6e  empdir " for con
8f50: 73 74 72 75 63 74 69 6e 67 20 74 68 65 20 6f 64  structing the od
8f60: 73 20 66 69 6c 65 2e 20 6b 65 79 71 72 79 3a 20  s file. keyqry: 
8f70: 22 20 6b 65 79 71 72 79 20 22 20 6b 65 79 73 74  " keyqry " keyst
8f80: 72 3a 20 22 20 6b 65 79 73 73 74 72 20 22 20 77  r: " keysstr " w
8f90: 69 74 68 20 6b 65 79 73 3a 20 22 20 28 6d 61 70  ith keys: " (map
8fa0: 20 63 61 64 72 20 6b 65 79 70 61 74 74 2d 61 6c   cadr keypatt-al
8fb0: 69 73 74 29 29 0a 20 20 20 20 3b 3b 20 22 45 78  ist)).    ;; "Ex
8fc0: 70 65 63 74 65 64 20 56 61 6c 75 65 22 0a 20 20  pected Value".  
8fd0: 20 20 3b 3b 20 22 56 61 6c 75 65 20 46 6f 75 6e    ;; "Value Foun
8fe0: 64 22 0a 20 20 20 20 3b 3b 20 22 54 6f 6c 65 72  d".    ;; "Toler
8ff0: 61 6e 63 65 22 0a 20 20 20 20 28 61 70 70 6c 79  ance".    (apply
9000: 20 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63   sqlite3:for-eac
9010: 68 2d 72 6f 77 0a 09 20 20 20 28 6c 61 6d 62 64  h-row..   (lambd
9020: 61 20 28 74 65 73 74 2d 69 64 20 2e 20 62 29 0a  a (test-id . b).
9030: 09 20 20 20 20 20 28 73 65 74 21 20 74 65 73 74  .     (set! test
9040: 2d 69 64 73 20 28 63 6f 6e 73 20 74 65 73 74 2d  -ids (cons test-
9050: 69 64 20 74 65 73 74 2d 69 64 73 29 29 20 20 20  id test-ids))   
9060: 3b 3b 20 74 65 73 74 2d 69 64 20 69 73 20 6e 6f  ;; test-id is no
9070: 77 20 74 65 73 74 6e 61 6d 65 0a 09 20 20 20 20  w testname..    
9080: 20 28 73 65 74 21 20 72 65 73 75 6c 74 73 20 28   (set! results (
9090: 61 70 70 65 6e 64 20 72 65 73 75 6c 74 73 20 3b  append results ;
90a0: 3b 20 6e 6f 74 65 2c 20 64 72 6f 70 20 74 68 65  ; note, drop the
90b0: 20 74 65 73 74 2d 69 64 0a 09 09 09 09 20 20 20   test-id.....   
90c0: 28 6c 69 73 74 0a 09 09 09 09 20 20 20 20 28 69  (list.....    (i
90d0: 66 20 70 61 74 68 6d 6f 64 0a 09 09 09 09 09 28  f pathmod......(
90e0: 6c 65 74 2a 20 28 28 76 62 20 20 20 20 20 20 20  let* ((vb       
90f0: 20 28 61 70 70 6c 79 20 76 65 63 74 6f 72 20 62   (apply vector b
9100: 29 29 0a 09 09 09 09 09 20 20 20 20 20 20 20 28  ))......       (
9110: 6b 65 79 76 61 6c 73 20 20 20 28 6c 65 74 20 6c  keyvals   (let l
9120: 6f 6f 70 20 28 28 69 20 20 20 20 30 29 0a 09 09  oop ((i    0)...
9130: 09 09 09 09 09 09 20 20 20 20 20 28 72 65 73 20  ......     (res 
9140: 27 28 29 29 29 0a 09 09 09 09 09 09 09 20 20 20  '()))........   
9150: 20 28 69 66 20 28 3e 3d 20 69 20 6e 75 6d 6b 65   (if (>= i numke
9160: 79 73 29 0a 09 09 09 09 09 09 09 09 72 65 73 0a  ys).........res.
9170: 09 09 09 09 09 09 09 09 28 6c 6f 6f 70 20 28 2b  ........(loop (+
9180: 20 69 20 31 29 0a 09 09 09 09 09 09 09 09 20 20   i 1).........  
9190: 20 20 20 20 28 61 70 70 65 6e 64 20 72 65 73 20      (append res 
91a0: 28 6c 69 73 74 20 28 76 65 63 74 6f 72 2d 72 65  (list (vector-re
91b0: 66 20 76 62 20 28 2b 20 69 20 32 29 29 29 29 29  f vb (+ i 2)))))
91c0: 29 29 29 0a 09 09 09 09 09 20 20 20 20 20 20 20  )))......       
91d0: 28 72 75 6e 6e 61 6d 65 20 20 20 28 76 65 63 74  (runname   (vect
91e0: 6f 72 2d 72 65 66 20 76 62 20 31 29 29 0a 09 09  or-ref vb 1))...
91f0: 09 09 09 20 20 20 20 20 20 20 28 74 65 73 74 6e  ...       (testn
9200: 61 6d 65 20 20 28 76 65 63 74 6f 72 2d 72 65 66  ame  (vector-ref
9210: 20 76 62 20 28 2b 20 20 32 20 6e 75 6d 6b 65 79   vb (+  2 numkey
9220: 73 29 29 29 0a 09 09 09 09 09 20 20 20 20 20 20  s)))......      
9230: 20 28 69 74 65 6d 2d 70 61 74 68 20 28 76 65 63   (item-path (vec
9240: 74 6f 72 2d 72 65 66 20 76 62 20 28 2b 20 20 33  tor-ref vb (+  3
9250: 20 6e 75 6d 6b 65 79 73 29 29 29 0a 09 09 09 09   numkeys))).....
9260: 09 20 20 20 20 20 20 20 28 66 69 6e 61 6c 2d 6c  .       (final-l
9270: 6f 67 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76  og (vector-ref v
9280: 62 20 28 2b 20 20 37 20 6e 75 6d 6b 65 79 73 29  b (+  7 numkeys)
9290: 29 29 0a 09 09 09 09 09 20 20 20 20 20 20 20 28  ))......       (
92a0: 72 75 6e 2d 64 69 72 20 20 20 28 76 65 63 74 6f  run-dir   (vecto
92b0: 72 2d 72 65 66 20 76 62 20 28 2b 20 31 38 20 6e  r-ref vb (+ 18 n
92c0: 75 6d 6b 65 79 73 29 29 29 0a 09 09 09 09 09 20  umkeys)))...... 
92d0: 20 20 20 20 20 20 28 6c 6f 67 2d 66 70 61 74 68        (log-fpath
92e0: 20 28 63 6f 6e 63 20 72 75 6e 2d 64 69 72 20 22   (conc run-dir "
92f0: 2f 22 20 20 66 69 6e 61 6c 2d 6c 6f 67 29 29 29  /"  final-log)))
9300: 20 3b 3b 20 28 73 74 72 69 6e 67 2d 69 6e 74 65   ;; (string-inte
9310: 72 73 70 65 72 73 65 20 6b 65 79 76 61 6c 73 20  rsperse keyvals 
9320: 22 2f 22 29 20 22 2f 22 20 74 65 73 74 6e 61 6d  "/") "/" testnam
9330: 65 20 22 2f 22 20 69 74 65 6d 2d 70 61 74 68 20  e "/" item-path 
9340: 22 2f 22 0a 09 09 09 09 09 20 20 28 64 65 62 75  "/"......  (debu
9350: 67 3a 70 72 69 6e 74 20 34 20 22 6c 6f 67 3a 20  g:print 4 "log: 
9360: 22 20 6c 6f 67 2d 66 70 61 74 68 20 22 20 65 78  " log-fpath " ex
9370: 69 73 74 73 3a 20 22 20 28 66 69 6c 65 2d 65 78  ists: " (file-ex
9380: 69 73 74 73 3f 20 6c 6f 67 2d 66 70 61 74 68 29  ists? log-fpath)
9390: 29 0a 09 09 09 09 09 20 20 28 76 65 63 74 6f 72  )......  (vector
93a0: 2d 73 65 74 21 20 76 62 20 28 2b 20 37 20 6e 75  -set! vb (+ 7 nu
93b0: 6d 6b 65 79 73 29 20 28 69 66 20 28 66 69 6c 65  mkeys) (if (file
93c0: 2d 65 78 69 73 74 73 3f 20 6c 6f 67 2d 66 70 61  -exists? log-fpa
93d0: 74 68 29 0a 09 09 09 09 09 09 09 09 09 20 20 20  th)..........   
93e0: 20 28 6c 65 74 20 28 28 6e 65 77 70 61 74 68 20   (let ((newpath 
93f0: 28 63 6f 6e 63 20 70 61 74 68 6d 6f 64 20 22 2f  (conc pathmod "/
9400: 22 0a 09 09 09 09 09 09 09 09 09 09 09 09 20 28  "............. (
9410: 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72  string-intersper
9420: 73 65 20 6b 65 79 76 61 6c 73 20 22 2f 22 29 0a  se keyvals "/").
9430: 09 09 09 09 09 09 09 09 09 09 09 09 20 22 2f 22  ............ "/"
9440: 20 72 75 6e 6e 61 6d 65 20 22 2f 22 20 74 65 73   runname "/" tes
9450: 74 6e 61 6d 65 20 22 2f 22 0a 09 09 09 09 09 09  tname "/".......
9460: 09 09 09 09 09 09 20 28 69 66 20 28 73 74 72 69  ...... (if (stri
9470: 6e 67 3d 3f 20 69 74 65 6d 2d 70 61 74 68 20 22  ng=? item-path "
9480: 22 29 20 22 22 20 28 63 6f 6e 63 20 22 2f 22 20  ") "" (conc "/" 
9490: 69 74 65 6d 2d 70 61 74 68 29 29 0a 09 09 09 09  item-path)).....
94a0: 09 09 09 09 09 09 09 09 20 66 69 6e 61 6c 2d 6c  ........ final-l
94b0: 6f 67 29 29 29 0a 09 09 09 09 09 09 09 09 09 20  og))).......... 
94c0: 20 20 20 20 20 3b 3b 20 66 6f 72 20 6e 6f 77 20       ;; for now 
94d0: 74 68 72 6f 77 20 61 77 61 79 20 6e 65 77 70 61  throw away newpa
94e0: 74 68 20 61 6e 64 20 75 73 65 20 74 68 65 20 6c  th and use the l
94f0: 6f 67 2d 66 70 61 74 68 20 63 6f 6e 63 27 64 20  og-fpath conc'd 
9500: 77 69 74 68 20 70 61 74 68 6d 6f 64 0a 09 09 09  with pathmod....
9510: 09 09 09 09 09 09 20 20 20 20 20 20 28 73 65 74  ......      (set
9520: 21 20 6e 65 77 70 61 74 68 20 28 63 6f 6e 63 20  ! newpath (conc 
9530: 70 61 74 68 6d 6f 64 20 6c 6f 67 2d 66 70 61 74  pathmod log-fpat
9540: 68 29 29 0a 09 09 09 09 09 09 09 09 09 20 20 20  h))..........   
9550: 20 20 20 28 69 66 20 77 69 6e 64 6f 77 73 20 28     (if windows (
9560: 73 74 72 69 6e 67 2d 74 72 61 6e 73 6c 61 74 65  string-translate
9570: 20 6e 65 77 70 61 74 68 20 22 2f 22 20 22 5c 5c   newpath "/" "\\
9580: 22 29 20 6e 65 77 70 61 74 68 29 29 0a 09 09 09  ") newpath))....
9590: 09 09 09 09 09 09 20 20 20 20 28 69 66 20 28 3e  ......    (if (>
95a0: 20 2a 76 65 72 62 6f 73 69 74 79 2a 20 31 29 0a   *verbosity* 1).
95b0: 09 09 09 09 09 09 09 09 09 09 28 63 6f 6e 63 20  ..........(conc 
95c0: 66 69 6e 61 6c 2d 6c 6f 67 20 22 20 6e 6f 74 2d  final-log " not-
95d0: 66 6f 75 6e 64 22 29 0a 09 09 09 09 09 09 09 09  found").........
95e0: 09 09 22 22 29 29 29 0a 09 09 09 09 09 20 20 28  .."")))......  (
95f0: 76 65 63 74 6f 72 2d 3e 6c 69 73 74 20 76 62 29  vector->list vb)
9600: 29 0a 09 09 09 09 09 62 29 29 29 29 29 0a 09 20  )......b))))).. 
9610: 20 20 64 62 0a 09 20 20 20 28 63 6f 6e 63 20 22    db..   (conc "
9620: 53 45 4c 45 43 54 0a 20 20 20 20 20 20 20 20 20  SELECT.         
9630: 20 20 20 20 20 74 2e 74 65 73 74 6e 61 6d 65 2c       t.testname,
9640: 72 2e 69 64 2c 72 75 6e 6e 61 6d 65 2c 22 20 6b  r.id,runname," k
9650: 65 79 73 73 74 72 20 22 2c 74 2e 74 65 73 74 6e  eysstr ",t.testn
9660: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
9670: 20 20 20 74 2e 69 74 65 6d 5f 70 61 74 68 2c 74     t.item_path,t
9680: 6d 2e 64 65 73 63 72 69 70 74 69 6f 6e 2c 74 2e  m.description,t.
9690: 73 74 61 74 65 2c 74 2e 73 74 61 74 75 73 2c 0a  state,t.status,.
96a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
96b0: 6e 61 6c 5f 6c 6f 67 66 2c 72 75 6e 5f 64 75 72  nal_logf,run_dur
96c0: 61 74 69 6f 6e 2c 20 0a 20 20 20 20 20 20 20 20  ation, .        
96d0: 20 20 20 20 20 20 73 74 72 66 74 69 6d 65 28 27        strftime('
96e0: 25 6d 2f 25 64 2f 25 59 20 25 48 3a 25 4d 3a 25  %m/%d/%Y %H:%M:%
96f0: 53 27 2c 64 61 74 65 74 69 6d 65 28 74 2e 65 76  S',datetime(t.ev
9700: 65 6e 74 5f 74 69 6d 65 2c 27 75 6e 69 78 65 70  ent_time,'unixep
9710: 6f 63 68 27 29 2c 27 6c 6f 63 61 6c 74 69 6d 65  och'),'localtime
9720: 27 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '),.            
9730: 20 20 74 6d 2e 74 61 67 73 2c 72 2e 6f 77 6e 65    tm.tags,r.owne
9740: 72 2c 74 2e 63 6f 6d 6d 65 6e 74 2c 0a 20 20 20  r,t.comment,.   
9750: 20 20 20 20 20 20 20 20 20 20 20 61 75 74 68 6f             autho
9760: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
9770: 20 74 6d 2e 6f 77 6e 65 72 2c 72 65 76 69 65 77   tm.owner,review
9780: 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
9790: 20 20 64 69 73 6b 66 72 65 65 2c 75 6e 61 6d 65    diskfree,uname
97a0: 2c 72 75 6e 64 69 72 2c 0a 20 20 20 20 20 20 20  ,rundir,.       
97b0: 20 20 20 20 20 20 20 68 6f 73 74 2c 63 70 75 6c         host,cpul
97c0: 6f 61 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  oad.            
97d0: 46 52 4f 4d 20 74 65 73 74 73 20 41 53 20 74 20  FROM tests AS t 
97e0: 49 4e 4e 45 52 20 4a 4f 49 4e 20 72 75 6e 73 20  INNER JOIN runs 
97f0: 41 53 20 72 20 4f 4e 20 74 2e 72 75 6e 5f 69 64  AS r ON t.run_id
9800: 3d 72 2e 69 64 20 49 4e 4e 45 52 20 4a 4f 49 4e  =r.id INNER JOIN
9810: 20 74 65 73 74 5f 6d 65 74 61 20 41 53 20 74 6d   test_meta AS tm
9820: 20 4f 4e 20 74 6d 2e 74 65 73 74 6e 61 6d 65 3d   ON tm.testname=
9830: 74 2e 74 65 73 74 6e 61 6d 65 0a 20 20 20 20 20  t.testname.     
9840: 20 20 20 20 20 20 20 57 48 45 52 45 20 72 75 6e         WHERE run
9850: 6e 61 6d 65 20 4c 49 4b 45 20 3f 20 41 4e 44 20  name LIKE ? AND 
9860: 22 20 6b 65 79 71 72 79 20 22 3b 22 29 0a 09 20  " keyqry ";").. 
9870: 20 20 72 75 6e 73 70 61 74 74 20 28 6d 61 70 20    runspatt (map 
9880: 63 61 64 72 20 6b 65 79 70 61 74 74 2d 61 6c 69  cadr keypatt-ali
9890: 73 74 29 29 0a 20 20 20 20 28 73 65 74 21 20 72  st)).    (set! r
98a0: 65 73 75 6c 74 73 20 28 6c 69 73 74 20 28 63 6f  esults (list (co
98b0: 6e 73 20 22 52 75 6e 73 22 20 72 65 73 75 6c 74  ns "Runs" result
98c0: 73 29 29 29 0a 20 20 20 20 3b 3b 20 6e 6f 77 2c  s))).    ;; now,
98d0: 20 66 6f 72 20 65 61 63 68 20 74 65 73 74 2c 20   for each test, 
98e0: 63 6f 6c 6c 65 63 74 20 74 68 65 20 74 65 73 74  collect the test
98f0: 5f 64 61 74 61 20 69 6e 66 6f 20 61 6e 64 20 61  _data info and a
9900: 64 64 20 61 20 6e 65 77 20 73 68 65 65 74 0a 20  dd a new sheet. 
9910: 20 20 20 28 66 6f 72 2d 65 61 63 68 0a 20 20 20     (for-each.   
9920: 20 20 28 6c 61 6d 62 64 61 20 28 74 65 73 74 2d    (lambda (test-
9930: 69 64 29 0a 20 20 20 20 20 20 20 28 6c 65 74 20  id).       (let 
9940: 28 28 74 65 73 74 2d 64 61 74 61 20 28 6c 69 73  ((test-data (lis
9950: 74 20 74 65 73 74 64 61 74 61 2d 68 65 61 64 65  t testdata-heade
9960: 72 29 29 0a 09 20 20 20 20 20 28 63 75 72 72 2d  r))..     (curr-
9970: 74 65 73 74 2d 6e 61 6d 65 20 23 66 29 29 0a 09  test-name #f))..
9980: 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61   (sqlite3:for-ea
9990: 63 68 2d 72 6f 77 0a 09 20 20 28 6c 61 6d 62 64  ch-row..  (lambd
99a0: 61 20 28 72 75 6e 2d 69 64 20 74 65 73 74 6e 61  a (run-id testna
99b0: 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 63 61 74  me item-path cat
99c0: 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65 20 76  egory variable v
99d0: 61 6c 75 65 20 65 78 70 65 63 74 65 64 20 74 6f  alue expected to
99e0: 6c 20 75 6e 69 74 73 20 73 74 61 74 75 73 20 63  l units status c
99f0: 6f 6d 6d 65 6e 74 29 0a 09 20 20 20 20 28 73 65  omment)..    (se
9a00: 74 21 20 63 75 72 72 2d 74 65 73 74 2d 6e 61 6d  t! curr-test-nam
9a10: 65 20 74 65 73 74 6e 61 6d 65 29 0a 09 20 20 20  e testname)..   
9a20: 20 28 73 65 74 21 20 74 65 73 74 2d 64 61 74 61   (set! test-data
9a30: 20 28 61 70 70 65 6e 64 20 74 65 73 74 2d 64 61   (append test-da
9a40: 74 61 20 28 6c 69 73 74 20 28 6c 69 73 74 20 72  ta (list (list r
9a50: 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 69  un-id testname i
9a60: 74 65 6d 2d 70 61 74 68 20 63 61 74 65 67 6f 72  tem-path categor
9a70: 79 20 76 61 72 69 61 62 6c 65 20 76 61 6c 75 65  y variable value
9a80: 20 65 78 70 65 63 74 65 64 20 74 6f 6c 20 75 6e   expected tol un
9a90: 69 74 73 20 73 74 61 74 75 73 20 63 6f 6d 6d 65  its status comme
9aa0: 6e 74 29 29 29 29 29 0a 09 20 20 64 62 20 0a 09  nt)))))..  db ..
9ab0: 20 20 3b 3b 20 22 53 45 4c 45 43 54 20 72 75 6e    ;; "SELECT run
9ac0: 5f 69 64 2c 74 65 73 74 6e 61 6d 65 2c 69 74 65  _id,testname,ite
9ad0: 6d 5f 70 61 74 68 2c 63 61 74 65 67 6f 72 79 2c  m_path,category,
9ae0: 76 61 72 69 61 62 6c 65 2c 74 64 2e 76 61 6c 75  variable,td.valu
9af0: 65 20 41 53 20 76 61 6c 75 65 2c 65 78 70 65 63  e AS value,expec
9b00: 74 65 64 2c 74 6f 6c 2c 75 6e 69 74 73 2c 74 64  ted,tol,units,td
9b10: 2e 73 74 61 74 75 73 20 41 53 20 73 74 61 74 75  .status AS statu
9b20: 73 2c 74 64 2e 63 6f 6d 6d 65 6e 74 20 41 53 20  s,td.comment AS 
9b30: 63 6f 6d 6d 65 6e 74 20 46 52 4f 4d 20 74 65 73  comment FROM tes
9b40: 74 5f 64 61 74 61 20 41 53 20 74 64 20 49 4e 4e  t_data AS td INN
9b50: 45 52 20 4a 4f 49 4e 20 74 65 73 74 73 20 4f 4e  ER JOIN tests ON
9b60: 20 74 65 73 74 73 2e 69 64 3d 74 64 2e 74 65 73   tests.id=td.tes
9b70: 74 5f 69 64 20 57 48 45 52 45 20 74 65 73 74 5f  t_id WHERE test_
9b80: 69 64 3d 3f 3b 22 0a 09 20 20 22 53 45 4c 45 43  id=?;"..  "SELEC
9b90: 54 20 72 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d  T run_id,testnam
9ba0: 65 2c 69 74 65 6d 5f 70 61 74 68 2c 63 61 74 65  e,item_path,cate
9bb0: 67 6f 72 79 2c 76 61 72 69 61 62 6c 65 2c 74 64  gory,variable,td
9bc0: 2e 76 61 6c 75 65 20 41 53 20 76 61 6c 75 65 2c  .value AS value,
9bd0: 74 64 2e 65 78 70 65 63 74 65 64 2c 74 64 2e 74  td.expected,td.t
9be0: 6f 6c 2c 74 64 2e 75 6e 69 74 73 2c 74 64 2e 73  ol,td.units,td.s
9bf0: 74 61 74 75 73 20 41 53 20 73 74 61 74 75 73 2c  tatus AS status,
9c00: 74 64 2e 63 6f 6d 6d 65 6e 74 20 41 53 20 63 6f  td.comment AS co
9c10: 6d 6d 65 6e 74 20 46 52 4f 4d 20 74 65 73 74 5f  mment FROM test_
9c20: 64 61 74 61 20 41 53 20 74 64 20 49 4e 4e 45 52  data AS td INNER
9c30: 20 4a 4f 49 4e 20 74 65 73 74 73 20 4f 4e 20 74   JOIN tests ON t
9c40: 65 73 74 73 2e 69 64 3d 74 64 2e 74 65 73 74 5f  ests.id=td.test_
9c50: 69 64 20 57 48 45 52 45 20 74 65 73 74 6e 61 6d  id WHERE testnam
9c60: 65 3d 3f 3b 22 0a 09 20 20 74 65 73 74 2d 69 64  e=?;"..  test-id
9c70: 29 0a 09 20 28 69 66 20 63 75 72 72 2d 74 65 73  ).. (if curr-tes
9c80: 74 2d 6e 61 6d 65 0a 09 20 20 20 20 20 28 73 65  t-name..     (se
9c90: 74 21 20 72 65 73 75 6c 74 73 20 28 61 70 70 65  t! results (appe
9ca0: 6e 64 20 72 65 73 75 6c 74 73 20 28 6c 69 73 74  nd results (list
9cb0: 20 28 63 6f 6e 73 20 63 75 72 72 2d 74 65 73 74   (cons curr-test
9cc0: 2d 6e 61 6d 65 20 74 65 73 74 2d 64 61 74 61 29  -name test-data)
9cd0: 29 29 29 29 0a 09 20 29 29 0a 20 20 20 20 20 28  )))).. )).     (
9ce0: 73 6f 72 74 20 28 64 65 6c 65 74 65 2d 64 75 70  sort (delete-dup
9cf0: 6c 69 63 61 74 65 73 20 74 65 73 74 2d 69 64 73  licates test-ids
9d00: 29 20 73 74 72 69 6e 67 3c 3d 29 29 0a 20 20 20  ) string<=)).   
9d10: 20 28 73 79 73 74 65 6d 20 28 63 6f 6e 63 20 22   (system (conc "
9d20: 6d 6b 64 69 72 20 2d 70 20 22 20 74 65 6d 70 64  mkdir -p " tempd
9d30: 69 72 29 29 0a 20 20 20 20 3b 3b 20 28 70 70 20  ir)).    ;; (pp 
9d40: 72 65 73 75 6c 74 73 29 0a 20 20 20 20 28 6f 64  results).    (od
9d50: 73 3a 6c 69 73 74 2d 3e 6f 64 73 20 0a 20 20 20  s:list->ods .   
9d60: 20 20 74 65 6d 70 64 69 72 0a 20 20 20 20 20 28    tempdir.     (
9d70: 69 66 20 28 73 74 72 69 6e 67 2d 6d 61 74 63 68  if (string-match
9d80: 20 28 72 65 67 65 78 70 20 22 5e 5b 2f 7e 5d 2b   (regexp "^[/~]+
9d90: 2e 2a 22 29 20 6f 75 74 70 75 74 66 69 6c 65 29  .*") outputfile)
9da0: 20 3b 3b 20 66 75 6c 6c 20 70 61 74 68 3f 0a 09   ;; full path?..
9db0: 20 6f 75 74 70 75 74 66 69 6c 65 0a 09 20 28 62   outputfile.. (b
9dc0: 65 67 69 6e 0a 09 20 20 20 28 64 65 62 75 67 3a  egin..   (debug:
9dd0: 70 72 69 6e 74 20 30 20 22 57 41 52 4e 49 4e 47  print 0 "WARNING
9de0: 3a 20 70 61 74 68 20 67 69 76 65 6e 2c 20 22 20  : path given, " 
9df0: 6f 75 74 70 75 74 66 69 6c 65 20 22 20 69 73 20  outputfile " is 
9e00: 72 65 6c 61 74 69 76 65 2c 20 70 72 65 66 69 78  relative, prefix
9e10: 69 6e 67 20 77 69 74 68 20 63 75 72 72 65 6e 74  ing with current
9e20: 20 64 69 72 65 63 74 6f 72 79 22 29 0a 09 20 20   directory")..  
9e30: 20 28 63 6f 6e 63 20 28 63 75 72 72 65 6e 74 2d   (conc (current-
9e40: 64 69 72 65 63 74 6f 72 79 29 20 22 2f 22 20 6f  directory) "/" o
9e50: 75 74 70 75 74 66 69 6c 65 29 29 29 0a 20 20 20  utputfile))).   
9e60: 20 20 72 65 73 75 6c 74 73 29 29 29 0a 0a 3b 3b    results)))..;;
9e70: 20 28 64 62 3a 65 78 74 72 61 63 74 2d 6f 64 73   (db:extract-ods
9e80: 2d 66 69 6c 65 20 64 62 20 22 6f 75 74 70 75 74  -file db "output
9e90: 66 69 6c 65 2e 6f 64 73 22 20 27 28 28 22 73 79  file.ods" '(("sy
9ea0: 73 6e 61 6d 65 22 20 22 25 22 29 28 22 66 73 6e  sname" "%")("fsn
9eb0: 61 6d 65 22 20 22 25 22 29 28 22 64 61 74 61 70  ame" "%")("datap
9ec0: 61 74 68 22 20 22 25 22 29 29 20 22 25 22 29 0a  ath" "%")) "%").