Megatest

Hex Artifact Content
Login

Artifact cf37c2a3a0f0491dd541d938e48baffc7a76fbd3:


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 20 23 66 29   #f #f #f #f #f)
5c10: 29 20 39 29 29 0a 09 20 20 20 20 20 20 28 63 61  ) 9))..      (ca
5c20: 74 65 67 6f 72 79 20 20 20 20 28 6c 69 73 74 2d  tegory    (list-
5c30: 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20 30  ref padded-row 0
5c40: 29 29 0a 09 20 20 20 20 20 20 28 76 61 72 69 61  ))..      (varia
5c50: 62 6c 65 20 20 20 20 28 6c 69 73 74 2d 72 65 66  ble    (list-ref
5c60: 20 70 61 64 64 65 64 2d 72 6f 77 20 31 29 29 0a   padded-row 1)).
5c70: 09 20 20 20 20 20 20 28 76 61 6c 75 65 20 20 20  .      (value   
5c80: 20 20 20 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72      (any->number
5c90: 2d 69 66 2d 70 6f 73 73 69 62 6c 65 20 28 6c 69  -if-possible (li
5ca0: 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f  st-ref padded-ro
5cb0: 77 20 32 29 29 29 0a 09 20 20 20 20 20 20 28 65  w 2)))..      (e
5cc0: 78 70 65 63 74 65 64 20 20 20 20 28 61 6e 79 2d  xpected    (any-
5cd0: 3e 6e 75 6d 62 65 72 2d 69 66 2d 70 6f 73 73 69  >number-if-possi
5ce0: 62 6c 65 20 28 6c 69 73 74 2d 72 65 66 20 70 61  ble (list-ref pa
5cf0: 64 64 65 64 2d 72 6f 77 20 33 29 29 29 0a 09 20  dded-row 3))).. 
5d00: 20 20 20 20 20 28 74 6f 6c 20 20 20 20 20 20 20       (tol       
5d10: 20 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 2d 69    (any->number-i
5d20: 66 2d 70 6f 73 73 69 62 6c 65 20 28 6c 69 73 74  f-possible (list
5d30: 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20  -ref padded-row 
5d40: 34 29 29 29 20 3b 3b 20 3e 2c 20 3c 2c 20 3e 3d  4))) ;; >, <, >=
5d50: 2c 20 3c 3d 2c 20 6f 72 20 61 20 6e 75 6d 62 65  , <=, or a numbe
5d60: 72 0a 09 20 20 20 20 20 20 28 75 6e 69 74 73 20  r..      (units 
5d70: 20 20 20 20 20 20 28 6c 69 73 74 2d 72 65 66 20        (list-ref 
5d80: 70 61 64 64 65 64 2d 72 6f 77 20 35 29 29 0a 09  padded-row 5))..
5d90: 20 20 20 20 20 20 28 63 6f 6d 6d 65 6e 74 20 20        (comment  
5da0: 20 20 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64     (list-ref pad
5db0: 64 65 64 2d 72 6f 77 20 36 29 29 0a 09 20 20 20  ded-row 6))..   
5dc0: 20 20 20 28 73 74 61 74 75 73 20 20 20 20 20 20     (status      
5dd0: 28 6c 65 74 20 28 28 73 20 28 6c 69 73 74 2d 72  (let ((s (list-r
5de0: 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20 37 29  ef padded-row 7)
5df0: 29 29 0a 09 09 09 20 20 20 20 20 28 69 66 20 28  ))....     (if (
5e00: 61 6e 64 20 28 73 74 72 69 6e 67 3f 20 73 29 28  and (string? s)(
5e10: 6f 72 20 28 73 74 72 69 6e 67 2d 6d 61 74 63 68  or (string-match
5e20: 20 28 72 65 67 65 78 70 20 22 5e 5c 5c 73 2a 24   (regexp "^\\s*$
5e30: 22 29 20 73 29 0a 09 09 09 09 09 09 20 20 20 20  ") s).......    
5e40: 20 28 73 74 72 69 6e 67 2d 6d 61 74 63 68 20 28   (string-match (
5e50: 72 65 67 65 78 70 20 22 5e 6e 2f 61 24 22 29 20  regexp "^n/a$") 
5e60: 73 29 29 29 0a 09 09 09 09 20 23 66 0a 09 09 09  s)))..... #f....
5e70: 09 20 73 29 29 29 20 3b 3b 20 69 66 20 73 70 65  . s))) ;; if spe
5e80: 63 69 66 69 65 64 20 6f 6e 20 74 68 65 20 69 6e  cified on the in
5e90: 70 75 74 20 74 68 65 6e 20 75 73 65 2c 20 65 6c  put then use, el
5ea0: 73 65 20 63 61 6c 63 75 6c 61 74 65 0a 09 20 20  se calculate..  
5eb0: 20 20 20 20 28 74 79 70 65 20 20 20 20 20 20 20      (type       
5ec0: 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65   (list-ref padde
5ed0: 64 2d 72 6f 77 20 38 29 29 29 0a 09 20 3b 3b 20  d-row 8))).. ;; 
5ee0: 6c 6f 6f 6b 20 75 70 20 65 78 70 65 63 74 65 64  look up expected
5ef0: 2c 74 6f 6c 2c 75 6e 69 74 73 20 66 72 6f 6d 20  ,tol,units from 
5f00: 70 72 65 76 69 6f 75 73 20 62 65 73 74 20 66 69  previous best fi
5f10: 74 20 74 65 73 74 20 69 66 20 74 68 65 79 20 61  t test if they a
5f20: 72 65 20 61 6c 6c 20 65 69 74 68 65 72 20 23 66  re all either #f
5f30: 20 6f 72 20 27 27 0a 09 20 28 64 65 62 75 67 3a   or ''.. (debug:
5f40: 70 72 69 6e 74 20 34 20 22 42 45 46 4f 52 45 3a  print 4 "BEFORE:
5f50: 20 63 61 74 65 67 6f 72 79 3a 20 22 20 63 61 74   category: " cat
5f60: 65 67 6f 72 79 20 22 20 76 61 72 69 61 62 6c 65  egory " variable
5f70: 3a 20 22 20 76 61 72 69 61 62 6c 65 20 22 20 76  : " variable " v
5f80: 61 6c 75 65 3a 20 22 20 76 61 6c 75 65 20 0a 09  alue: " value ..
5f90: 09 20 20 20 20 20 20 22 2c 20 65 78 70 65 63 74  .      ", expect
5fa0: 65 64 3a 20 22 20 65 78 70 65 63 74 65 64 20 22  ed: " expected "
5fb0: 20 74 6f 6c 3a 20 22 20 74 6f 6c 20 22 20 75 6e   tol: " tol " un
5fc0: 69 74 73 3a 20 22 20 75 6e 69 74 73 20 22 20 73  its: " units " s
5fd0: 74 61 74 75 73 3a 20 22 20 73 74 61 74 75 73 20  tatus: " status 
5fe0: 22 20 63 6f 6d 6d 65 6e 74 3a 20 22 20 63 6f 6d  " comment: " com
5ff0: 6d 65 6e 74 20 22 20 74 79 70 65 3a 20 22 20 74  ment " type: " t
6000: 79 70 65 29 0a 0a 09 20 28 69 66 20 28 61 6e 64  ype)... (if (and
6010: 20 28 6f 72 20 28 6e 6f 74 20 65 78 70 65 63 74   (or (not expect
6020: 65 64 29 28 65 71 75 61 6c 3f 20 65 78 70 65 63  ed)(equal? expec
6030: 74 65 64 20 22 22 29 29 0a 09 09 20 20 28 6f 72  ted ""))...  (or
6040: 20 28 6e 6f 74 20 74 6f 6c 29 20 20 20 20 20 28   (not tol)     (
6050: 65 71 75 61 6c 3f 20 65 78 70 65 63 74 65 64 20  equal? expected 
6060: 22 22 29 29 0a 09 09 20 20 28 6f 72 20 28 6e 6f  ""))...  (or (no
6070: 74 20 75 6e 69 74 73 29 20 20 20 28 65 71 75 61  t units)   (equa
6080: 6c 3f 20 65 78 70 65 63 74 65 64 20 22 22 29 29  l? expected ""))
6090: 29 0a 09 20 20 20 20 20 28 6c 65 74 2d 76 61 6c  )..     (let-val
60a0: 75 65 73 20 28 28 28 6e 65 77 2d 65 78 70 65 63  ues (((new-expec
60b0: 74 65 64 20 6e 65 77 2d 74 6f 6c 20 6e 65 77 2d  ted new-tol new-
60c0: 75 6e 69 74 73 29 28 64 62 3a 67 65 74 2d 70 72  units)(db:get-pr
60d0: 65 76 2d 74 6f 6c 2d 66 6f 72 2d 74 65 73 74 20  ev-tol-for-test 
60e0: 64 62 20 74 65 73 74 2d 69 64 20 63 61 74 65 67  db test-id categ
60f0: 6f 72 79 20 76 61 72 69 61 62 6c 65 29 29 29 0a  ory variable))).
6100: 09 09 09 20 28 73 65 74 21 20 65 78 70 65 63 74  ... (set! expect
6110: 65 64 20 6e 65 77 2d 65 78 70 65 63 74 65 64 29  ed new-expected)
6120: 0a 09 09 09 20 28 73 65 74 21 20 74 6f 6c 20 20  .... (set! tol  
6130: 20 20 20 20 6e 65 77 2d 74 6f 6c 29 0a 09 09 09      new-tol)....
6140: 20 28 73 65 74 21 20 75 6e 69 74 73 20 20 20 20   (set! units    
6150: 6e 65 77 2d 75 6e 69 74 73 29 29 29 0a 0a 09 20  new-units)))... 
6160: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22  (debug:print 4 "
6170: 41 46 54 45 52 3a 20 20 63 61 74 65 67 6f 72 79  AFTER:  category
6180: 3a 20 22 20 63 61 74 65 67 6f 72 79 20 22 20 76  : " category " v
6190: 61 72 69 61 62 6c 65 3a 20 22 20 76 61 72 69 61  ariable: " varia
61a0: 62 6c 65 20 22 20 76 61 6c 75 65 3a 20 22 20 76  ble " value: " v
61b0: 61 6c 75 65 20 0a 09 09 20 20 20 20 20 20 22 2c  alue ...      ",
61c0: 20 65 78 70 65 63 74 65 64 3a 20 22 20 65 78 70   expected: " exp
61d0: 65 63 74 65 64 20 22 20 74 6f 6c 3a 20 22 20 74  ected " tol: " t
61e0: 6f 6c 20 22 20 75 6e 69 74 73 3a 20 22 20 75 6e  ol " units: " un
61f0: 69 74 73 20 22 20 73 74 61 74 75 73 3a 20 22 20  its " status: " 
6200: 73 74 61 74 75 73 20 22 20 63 6f 6d 6d 65 6e 74  status " comment
6210: 3a 20 22 20 63 6f 6d 6d 65 6e 74 29 0a 09 20 3b  : " comment).. ;
6220: 3b 20 63 61 6c 63 75 6c 61 74 65 20 73 74 61 74  ; calculate stat
6230: 75 73 20 69 66 20 4e 4f 54 20 73 70 65 63 69 66  us if NOT specif
6240: 69 65 64 0a 09 20 28 69 66 20 28 61 6e 64 20 28  ied.. (if (and (
6250: 6e 6f 74 20 73 74 61 74 75 73 29 28 6e 75 6d 62  not status)(numb
6260: 65 72 3f 20 65 78 70 65 63 74 65 64 29 28 6e 75  er? expected)(nu
6270: 6d 62 65 72 3f 20 76 61 6c 75 65 29 29 20 3b 3b  mber? value)) ;;
6280: 20 6e 65 65 64 20 65 78 70 65 63 74 65 64 20 61   need expected a
6290: 6e 64 20 76 61 6c 75 65 20 74 6f 20 62 65 20 6e  nd value to be n
62a0: 75 6d 62 65 72 73 0a 09 20 20 20 20 20 28 69 66  umbers..     (if
62b0: 20 28 6e 75 6d 62 65 72 3f 20 74 6f 6c 29 20 3b   (number? tol) ;
62c0: 3b 20 69 66 20 74 6f 6c 20 69 73 20 61 20 6e 75  ; if tol is a nu
62d0: 6d 62 65 72 20 74 68 65 6e 20 77 65 20 64 6f 20  mber then we do 
62e0: 74 68 65 20 73 74 61 6e 64 61 72 64 20 63 6f 6d  the standard com
62f0: 70 61 72 69 73 6f 6e 0a 09 09 20 28 6c 65 74 2a  parison... (let*
6300: 20 28 28 6d 61 78 2d 76 61 6c 20 28 2b 20 65 78   ((max-val (+ ex
6310: 70 65 63 74 65 64 20 74 6f 6c 29 29 0a 09 09 09  pected tol))....
6320: 28 6d 69 6e 2d 76 61 6c 20 28 2d 20 65 78 70 65  (min-val (- expe
6330: 63 74 65 64 20 74 6f 6c 29 29 0a 09 09 09 28 72  cted tol))....(r
6340: 65 73 75 6c 74 20 20 28 61 6e 64 20 28 3e 3d 20  esult  (and (>= 
6350: 20 76 61 6c 75 65 20 6d 69 6e 2d 76 61 6c 29 28   value min-val)(
6360: 3c 3d 20 76 61 6c 75 65 20 6d 61 78 2d 76 61 6c  <= value max-val
6370: 29 29 29 29 0a 09 09 20 20 20 28 64 65 62 75 67  ))))...   (debug
6380: 3a 70 72 69 6e 74 20 34 20 22 6d 61 78 2d 76 61  :print 4 "max-va
6390: 6c 3a 20 22 20 6d 61 78 2d 76 61 6c 20 22 20 6d  l: " max-val " m
63a0: 69 6e 2d 76 61 6c 3a 20 22 20 6d 69 6e 2d 76 61  in-val: " min-va
63b0: 6c 20 22 20 72 65 73 75 6c 74 3a 20 22 20 72 65  l " result: " re
63c0: 73 75 6c 74 29 0a 09 09 20 20 20 28 73 65 74 21  sult)...   (set!
63d0: 20 73 74 61 74 75 73 20 28 69 66 20 72 65 73 75   status (if resu
63e0: 6c 74 20 22 70 61 73 73 22 20 22 66 61 69 6c 22  lt "pass" "fail"
63f0: 29 29 29 0a 09 09 20 28 73 65 74 21 20 73 74 61  )))... (set! sta
6400: 74 75 73 20 3b 3b 20 4e 42 2f 2f 20 6e 65 65 64  tus ;; NB// need
6410: 20 74 6f 20 61 73 73 65 73 73 20 65 61 63 68 20   to assess each 
6420: 6f 6e 65 20 28 69 2e 65 2e 20 6e 6f 74 20 72 65  one (i.e. not re
6430: 74 75 72 6e 20 6f 70 65 72 61 74 6f 72 20 73 69  turn operator si
6440: 6e 63 65 20 6e 65 65 64 20 74 6f 20 61 63 74 20  nce need to act 
6450: 69 66 20 6e 6f 74 20 76 61 6c 69 64 20 6f 70 2e  if not valid op.
6460: 0a 09 09 20 20 20 20 20 20 20 28 63 61 73 65 20  ...       (case 
6470: 28 73 74 72 69 6e 67 2d 3e 73 79 6d 62 6f 6c 20  (string->symbol 
6480: 74 6f 6c 29 20 3b 3b 20 74 6f 6c 20 73 68 6f 75  tol) ;; tol shou
6490: 6c 64 20 62 65 20 3e 2c 20 3c 2c 20 3e 3d 2c 20  ld be >, <, >=, 
64a0: 3c 3d 0a 09 09 09 20 28 28 3e 29 20 20 28 69 66  <=.... ((>)  (if
64b0: 20 28 3e 20 20 76 61 6c 75 65 20 65 78 70 65 63   (>  value expec
64c0: 74 65 64 29 20 22 70 61 73 73 22 20 22 66 61 69  ted) "pass" "fai
64d0: 6c 22 29 29 0a 09 09 09 20 28 28 3c 29 20 20 28  l")).... ((<)  (
64e0: 69 66 20 28 3c 20 20 76 61 6c 75 65 20 65 78 70  if (<  value exp
64f0: 65 63 74 65 64 29 20 22 70 61 73 73 22 20 22 66  ected) "pass" "f
6500: 61 69 6c 22 29 29 0a 09 09 09 20 28 28 3e 3d 29  ail")).... ((>=)
6510: 20 28 69 66 20 28 3e 3d 20 76 61 6c 75 65 20 65   (if (>= value e
6520: 78 70 65 63 74 65 64 29 20 22 70 61 73 73 22 20  xpected) "pass" 
6530: 22 66 61 69 6c 22 29 29 0a 09 09 09 20 28 28 3c  "fail")).... ((<
6540: 3d 29 20 28 69 66 20 28 3c 3d 20 76 61 6c 75 65  =) (if (<= value
6550: 20 65 78 70 65 63 74 65 64 29 20 22 70 61 73 73   expected) "pass
6560: 22 20 22 66 61 69 6c 22 29 29 0a 09 09 09 20 28  " "fail")).... (
6570: 65 6c 73 65 20 28 63 6f 6e 63 20 22 45 52 52 4f  else (conc "ERRO
6580: 52 3a 20 62 61 64 20 74 6f 6c 20 63 6f 6d 70 61  R: bad tol compa
6590: 72 61 74 6f 72 20 22 20 74 6f 6c 29 29 29 29 29  rator " tol)))))
65a0: 29 0a 09 20 28 64 65 62 75 67 3a 70 72 69 6e 74  ).. (debug:print
65b0: 20 34 20 22 41 46 54 45 52 32 3a 20 63 61 74 65   4 "AFTER2: cate
65c0: 67 6f 72 79 3a 20 22 20 63 61 74 65 67 6f 72 79  gory: " category
65d0: 20 22 20 76 61 72 69 61 62 6c 65 3a 20 22 20 76   " variable: " v
65e0: 61 72 69 61 62 6c 65 20 22 20 76 61 6c 75 65 3a  ariable " value:
65f0: 20 22 20 76 61 6c 75 65 20 0a 09 09 20 20 20 20   " value ...    
6600: 20 20 22 2c 20 65 78 70 65 63 74 65 64 3a 20 22    ", expected: "
6610: 20 65 78 70 65 63 74 65 64 20 22 20 74 6f 6c 3a   expected " tol:
6620: 20 22 20 74 6f 6c 20 22 20 75 6e 69 74 73 3a 20   " tol " units: 
6630: 22 20 75 6e 69 74 73 20 22 20 73 74 61 74 75 73  " units " status
6640: 3a 20 22 20 73 74 61 74 75 73 20 22 20 63 6f 6d  : " status " com
6650: 6d 65 6e 74 3a 20 22 20 63 6f 6d 6d 65 6e 74 29  ment: " comment)
6660: 0a 09 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63  .. (sqlite3:exec
6670: 75 74 65 20 64 62 20 22 49 4e 53 45 52 54 20 4f  ute db "INSERT O
6680: 52 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 74  R REPLACE INTO t
6690: 65 73 74 5f 64 61 74 61 20 28 74 65 73 74 5f 69  est_data (test_i
66a0: 64 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 69 61  d,category,varia
66b0: 62 6c 65 2c 76 61 6c 75 65 2c 65 78 70 65 63 74  ble,value,expect
66c0: 65 64 2c 74 6f 6c 2c 75 6e 69 74 73 2c 63 6f 6d  ed,tol,units,com
66d0: 6d 65 6e 74 2c 73 74 61 74 75 73 2c 74 79 70 65  ment,status,type
66e0: 29 20 56 41 4c 55 45 53 20 28 3f 2c 3f 2c 3f 2c  ) VALUES (?,?,?,
66f0: 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 29 3b 22  ?,?,?,?,?,?,?);"
6700: 0a 09 09 09 20 20 74 65 73 74 2d 69 64 20 63 61  ....  test-id ca
6710: 74 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65 20  tegory variable 
6720: 76 61 6c 75 65 20 65 78 70 65 63 74 65 64 20 74  value expected t
6730: 6f 6c 20 75 6e 69 74 73 20 28 69 66 20 63 6f 6d  ol units (if com
6740: 6d 65 6e 74 20 63 6f 6d 6d 65 6e 74 20 22 22 29  ment comment "")
6750: 20 73 74 61 74 75 73 20 74 79 70 65 29 29 29 0a   status type))).
6760: 20 20 20 20 20 63 73 76 6c 69 73 74 29 29 29 0a       csvlist))).
6770: 0a 3b 3b 20 67 65 74 20 61 20 6c 69 73 74 20 6f  .;; get a list o
6780: 66 20 74 65 73 74 5f 64 61 74 61 20 72 65 63 6f  f test_data reco
6790: 72 64 73 20 6d 61 74 63 68 69 6e 67 20 63 61 74  rds matching cat
67a0: 65 67 6f 72 79 70 61 74 74 0a 28 64 65 66 69 6e  egorypatt.(defin
67b0: 65 20 28 64 62 3a 72 65 61 64 2d 74 65 73 74 2d  e (db:read-test-
67c0: 64 61 74 61 20 64 62 20 74 65 73 74 2d 69 64 20  data db test-id 
67d0: 63 61 74 65 67 6f 72 79 70 61 74 74 29 0a 20 20  categorypatt).  
67e0: 28 6c 65 74 20 28 28 72 65 73 20 27 28 29 29 29  (let ((res '()))
67f0: 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f  .    (sqlite3:fo
6800: 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20 20 20  r-each-row .    
6810: 20 28 6c 61 6d 62 64 61 20 28 69 64 20 74 65 73   (lambda (id tes
6820: 74 5f 69 64 20 63 61 74 65 67 6f 72 79 20 76 61  t_id category va
6830: 72 69 61 62 6c 65 20 76 61 6c 75 65 20 65 78 70  riable value exp
6840: 65 63 74 65 64 20 74 6f 6c 20 75 6e 69 74 73 20  ected tol units 
6850: 63 6f 6d 6d 65 6e 74 20 73 74 61 74 75 73 20 74  comment status t
6860: 79 70 65 29 0a 20 20 20 20 20 20 20 28 73 65 74  ype).       (set
6870: 21 20 72 65 73 20 28 63 6f 6e 73 20 28 76 65 63  ! res (cons (vec
6880: 74 6f 72 20 69 64 20 74 65 73 74 5f 69 64 20 63  tor id test_id c
6890: 61 74 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65  ategory variable
68a0: 20 76 61 6c 75 65 20 65 78 70 65 63 74 65 64 20   value expected 
68b0: 74 6f 6c 20 75 6e 69 74 73 20 63 6f 6d 6d 65 6e  tol units commen
68c0: 74 20 73 74 61 74 75 73 20 74 79 70 65 29 20 72  t status type) r
68d0: 65 73 29 29 29 0a 20 20 20 20 20 64 62 0a 20 20  es))).     db.  
68e0: 20 20 20 22 53 45 4c 45 43 54 20 69 64 2c 74 65     "SELECT id,te
68f0: 73 74 5f 69 64 2c 63 61 74 65 67 6f 72 79 2c 76  st_id,category,v
6900: 61 72 69 61 62 6c 65 2c 76 61 6c 75 65 2c 65 78  ariable,value,ex
6910: 70 65 63 74 65 64 2c 74 6f 6c 2c 75 6e 69 74 73  pected,tol,units
6920: 2c 63 6f 6d 6d 65 6e 74 2c 73 74 61 74 75 73 2c  ,comment,status,
6930: 74 79 70 65 20 46 52 4f 4d 20 74 65 73 74 5f 64  type FROM test_d
6940: 61 74 61 20 57 48 45 52 45 20 74 65 73 74 5f 69  ata WHERE test_i
6950: 64 3d 3f 20 41 4e 44 20 63 61 74 65 67 6f 72 79  d=? AND category
6960: 20 4c 49 4b 45 20 3f 20 4f 52 44 45 52 20 42 59   LIKE ? ORDER BY
6970: 20 63 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62   category,variab
6980: 6c 65 3b 22 20 74 65 73 74 2d 69 64 20 63 61 74  le;" test-id cat
6990: 65 67 6f 72 79 70 61 74 74 29 0a 20 20 20 20 28  egorypatt).    (
69a0: 72 65 76 65 72 73 65 20 72 65 73 29 29 29 0a 0a  reverse res)))..
69b0: 28 64 65 66 69 6e 65 20 28 64 62 3a 6c 6f 61 64  (define (db:load
69c0: 2d 74 65 73 74 2d 64 61 74 61 20 64 62 20 72 75  -test-data db ru
69d0: 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69  n-id test-name i
69e0: 74 65 6d 64 61 74 29 0a 20 20 28 6c 65 74 2a 20  temdat).  (let* 
69f0: 28 28 69 74 65 6d 2d 70 61 74 68 20 28 69 74 65  ((item-path (ite
6a00: 6d 2d 6c 69 73 74 2d 3e 70 61 74 68 20 69 74 65  m-list->path ite
6a10: 6d 64 61 74 29 29 0a 09 20 28 74 65 73 74 64 61  mdat)).. (testda
6a20: 74 20 28 64 62 3a 67 65 74 2d 74 65 73 74 2d 69  t (db:get-test-i
6a30: 6e 66 6f 20 64 62 20 72 75 6e 2d 69 64 20 74 65  nfo db run-id te
6a40: 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74  st-name item-pat
6a50: 68 29 29 0a 09 20 28 74 65 73 74 2d 69 64 20 28  h)).. (test-id (
6a60: 69 66 20 74 65 73 74 64 61 74 20 28 64 62 3a 74  if testdat (db:t
6a70: 65 73 74 2d 67 65 74 2d 69 64 20 74 65 73 74 64  est-get-id testd
6a80: 61 74 29 20 23 66 29 29 29 0a 20 20 20 20 3b 3b  at) #f))).    ;;
6a90: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 31 20   (debug:print 1 
6aa0: 22 45 6e 74 65 72 20 72 65 63 6f 72 64 73 20 74  "Enter records t
6ab0: 6f 20 69 6e 73 65 72 74 20 69 6e 20 74 68 65 20  o insert in the 
6ac0: 74 65 73 74 5f 64 61 74 61 20 74 61 62 6c 65 2c  test_data table,
6ad0: 20 73 65 76 65 6e 20 66 69 65 6c 64 73 2c 20 63   seven fields, c
6ae0: 6f 6d 6d 61 20 73 65 70 61 72 61 74 65 64 20 70  omma separated p
6af0: 65 72 20 6c 69 6e 65 22 29 0a 20 20 20 20 28 64  er line").    (d
6b00: 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22 69 74  ebug:print 4 "it
6b10: 65 6d 64 61 74 3a 20 22 20 69 74 65 6d 64 61 74  emdat: " itemdat
6b20: 20 22 2c 20 74 65 73 74 2d 6e 61 6d 65 3a 20 22   ", test-name: "
6b30: 20 74 65 73 74 2d 6e 61 6d 65 20 22 2c 20 74 65   test-name ", te
6b40: 73 74 2d 69 64 3a 20 22 20 74 65 73 74 2d 69 64  st-id: " test-id
6b50: 29 0a 20 20 20 20 28 69 66 20 74 65 73 74 2d 69  ).    (if test-i
6b60: 64 0a 09 28 6c 65 74 20 6c 6f 6f 70 20 28 28 6c  d..(let loop ((l
6b70: 69 6e 20 28 72 65 61 64 2d 6c 69 6e 65 29 29 29  in (read-line)))
6b80: 0a 09 20 20 28 69 66 20 28 6e 6f 74 20 28 65 6f  ..  (if (not (eo
6b90: 66 2d 6f 62 6a 65 63 74 3f 20 6c 69 6e 29 29 0a  f-object? lin)).
6ba0: 09 20 20 20 20 20 20 28 62 65 67 69 6e 0a 09 09  .      (begin...
6bb0: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20 6c  (debug:print 4 l
6bc0: 69 6e 29 0a 09 09 28 64 62 3a 63 73 76 2d 3e 74  in)...(db:csv->t
6bd0: 65 73 74 2d 64 61 74 61 20 64 62 20 74 65 73 74  est-data db test
6be0: 2d 69 64 20 6c 69 6e 29 0a 09 09 28 6c 6f 6f 70  -id lin)...(loop
6bf0: 20 28 72 65 61 64 2d 6c 69 6e 65 29 29 29 29 29   (read-line)))))
6c00: 29 0a 20 20 20 20 3b 3b 20 72 6f 6c 6c 20 75 70  ).    ;; roll up
6c10: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 73   the current res
6c20: 75 6c 74 73 2e 0a 20 20 20 20 3b 3b 20 46 49 58  ults..    ;; FIX
6c30: 4d 45 3a 20 41 64 64 20 74 68 65 20 73 74 61 74  ME: Add the stat
6c40: 75 73 20 74 6f 20 0a 20 20 20 20 28 64 62 3a 74  us to .    (db:t
6c50: 65 73 74 2d 64 61 74 61 2d 72 6f 6c 6c 75 70 20  est-data-rollup 
6c60: 64 62 20 74 65 73 74 2d 69 64 20 23 66 29 29 29  db test-id #f)))
6c70: 0a 0a 3b 3b 20 57 41 52 4e 49 4e 47 3a 20 44 6f  ..;; WARNING: Do
6c80: 20 4e 4f 54 20 63 61 6c 6c 20 74 68 69 73 20 66   NOT call this f
6c90: 6f 72 20 74 68 65 20 70 61 72 65 6e 74 20 74 65  or the parent te
6ca0: 73 74 20 6f 6e 20 61 6e 20 69 74 65 72 61 74 65  st on an iterate
6cb0: 64 20 74 65 73 74 0a 3b 3b 20 52 6f 6c 6c 20 75  d test.;; Roll u
6cc0: 70 20 74 65 73 74 5f 64 61 74 61 20 70 61 73 73  p test_data pass
6cd0: 2f 66 61 69 6c 20 72 65 73 75 6c 74 73 0a 3b 3b  /fail results.;;
6ce0: 20 6c 6f 6f 6b 20 61 74 20 74 68 65 20 74 65 73   look at the tes
6cf0: 74 5f 64 61 74 61 20 73 74 61 74 75 73 20 66 69  t_data status fi
6d00: 65 6c 64 2c 20 0a 3b 3b 20 20 20 20 69 66 20 61  eld, .;;    if a
6d10: 6c 6c 20 61 72 65 20 70 61 73 73 20 28 61 6e 79  ll are pass (any
6d20: 20 63 61 73 65 29 20 61 6e 64 20 74 68 65 20 74   case) and the t
6d30: 65 73 74 20 73 74 61 74 75 73 20 69 73 20 50 41  est status is PA
6d40: 53 53 20 6f 72 20 4e 55 4c 4c 20 6f 72 20 27 27  SS or NULL or ''
6d50: 20 74 68 65 6e 20 73 65 74 20 74 65 73 74 20 73   then set test s
6d60: 74 61 74 75 73 20 74 6f 20 50 41 53 53 2e 0a 3b  tatus to PASS..;
6d70: 3b 20 20 20 20 69 66 20 6f 6e 65 20 6f 72 20 6d  ;    if one or m
6d80: 6f 72 65 20 61 72 65 20 66 61 69 6c 20 28 61 6e  ore are fail (an
6d90: 79 20 63 61 73 65 29 20 74 68 65 6e 20 73 65 74  y case) then set
6da0: 20 74 65 73 74 20 73 74 61 74 75 73 20 74 6f 20   test status to 
6db0: 50 41 53 53 2c 20 6e 6f 6e 20 22 70 61 73 73 22  PASS, non "pass"
6dc0: 20 6f 72 20 22 66 61 69 6c 22 20 61 72 65 20 69   or "fail" are i
6dd0: 67 6e 6f 72 65 64 0a 28 64 65 66 69 6e 65 20 28  gnored.(define (
6de0: 64 62 3a 74 65 73 74 2d 64 61 74 61 2d 72 6f 6c  db:test-data-rol
6df0: 6c 75 70 20 64 62 20 74 65 73 74 2d 69 64 20 73  lup db test-id s
6e00: 74 61 74 75 73 29 0a 20 20 28 73 71 6c 69 74 65  tatus).  (sqlite
6e10: 33 3a 65 78 65 63 75 74 65 20 0a 20 20 20 64 62  3:execute .   db
6e20: 20 0a 20 20 20 22 55 50 44 41 54 45 20 74 65 73   .   "UPDATE tes
6e30: 74 73 20 0a 20 20 20 20 20 20 53 45 54 20 66 61  ts .      SET fa
6e40: 69 6c 5f 63 6f 75 6e 74 3d 28 53 45 4c 45 43 54  il_count=(SELECT
6e50: 20 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20   count(id) FROM 
6e60: 74 65 73 74 5f 64 61 74 61 20 57 48 45 52 45 20  test_data WHERE 
6e70: 74 65 73 74 5f 69 64 3d 3f 20 41 4e 44 20 73 74  test_id=? AND st
6e80: 61 74 75 73 20 6c 69 6b 65 20 27 66 61 69 6c 27  atus like 'fail'
6e90: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 70 61 73  ),.          pas
6ea0: 73 5f 63 6f 75 6e 74 3d 28 53 45 4c 45 43 54 20  s_count=(SELECT 
6eb0: 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 74  count(id) FROM t
6ec0: 65 73 74 5f 64 61 74 61 20 57 48 45 52 45 20 74  est_data WHERE t
6ed0: 65 73 74 5f 69 64 3d 3f 20 41 4e 44 20 73 74 61  est_id=? AND sta
6ee0: 74 75 73 20 6c 69 6b 65 20 27 70 61 73 73 27 29  tus like 'pass')
6ef0: 0a 20 20 20 20 20 20 57 48 45 52 45 20 69 64 3d  .      WHERE id=
6f00: 3f 3b 22 0a 20 20 20 74 65 73 74 2d 69 64 20 74  ?;".   test-id t
6f10: 65 73 74 2d 69 64 20 74 65 73 74 2d 69 64 29 0a  est-id test-id).
6f20: 20 20 3b 3b 20 69 66 20 74 68 65 20 74 65 73 74    ;; if the test
6f30: 20 69 73 20 6e 6f 74 20 46 41 49 4c 20 74 68 65   is not FAIL the
6f40: 6e 20 73 65 74 20 73 74 61 74 75 73 20 62 61 73  n set status bas
6f50: 65 64 20 6f 6e 20 74 68 65 20 66 61 69 6c 20 61  ed on the fail a
6f60: 6e 64 20 70 61 73 73 20 63 6f 75 6e 74 73 2e 0a  nd pass counts..
6f70: 20 20 28 74 68 72 65 61 64 2d 73 6c 65 65 70 21    (thread-sleep!
6f80: 20 31 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65   1).  (sqlite3:e
6f90: 78 65 63 75 74 65 0a 20 20 20 64 62 20 20 20 3b  xecute.   db   ;
6fa0: 3b 3b 20 4e 4f 54 45 3a 20 53 68 6f 75 6c 64 20  ;; NOTE: Should 
6fb0: 74 68 69 73 20 62 65 20 57 41 52 4e 2c 46 41 49  this be WARN,FAI
6fc0: 4c 3f 20 41 20 57 41 52 4e 20 69 73 20 6e 6f 74  L? A WARN is not
6fd0: 20 61 20 46 41 49 4c 3f 3f 3f 3f 3f 20 42 55 47   a FAIL????? BUG
6fe0: 20 46 49 58 4d 45 0a 20 20 20 22 55 50 44 41 54   FIXME.   "UPDAT
6ff0: 45 20 74 65 73 74 73 0a 20 20 20 20 20 20 53 45  E tests.      SE
7000: 54 20 73 74 61 74 75 73 3d 43 41 53 45 20 57 48  T status=CASE WH
7010: 45 4e 20 28 53 45 4c 45 43 54 20 66 61 69 6c 5f  EN (SELECT fail_
7020: 63 6f 75 6e 74 20 46 52 4f 4d 20 74 65 73 74 73  count FROM tests
7030: 20 57 48 45 52 45 20 69 64 3d 3f 29 20 3e 20 30   WHERE id=?) > 0
7040: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
7050: 20 20 20 20 20 20 20 20 20 20 20 54 48 45 4e 20             THEN 
7060: 27 46 41 49 4c 27 0a 20 20 20 20 20 20 20 20 20  'FAIL'.         
7070: 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45               WHE
7080: 4e 20 28 53 45 4c 45 43 54 20 70 61 73 73 5f 63  N (SELECT pass_c
7090: 6f 75 6e 74 20 46 52 4f 4d 20 74 65 73 74 73 20  ount FROM tests 
70a0: 57 48 45 52 45 20 69 64 3d 3f 29 20 3e 20 30 20  WHERE id=?) > 0 
70b0: 41 4e 44 20 0a 20 20 20 20 20 20 20 20 20 20 20  AND .           
70c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
70d0: 28 53 45 4c 45 43 54 20 73 74 61 74 75 73 20 46  (SELECT status F
70e0: 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 20  ROM tests WHERE 
70f0: 69 64 3d 3f 29 20 4e 4f 54 20 49 4e 20 28 27 57  id=?) NOT IN ('W
7100: 41 52 4e 27 2c 27 46 41 49 4c 27 29 0a 20 20 20  ARN','FAIL').   
7110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7120: 20 20 20 20 20 20 54 48 45 4e 20 27 50 41 53 53        THEN 'PASS
7130: 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  '.              
7140: 20 20 20 20 20 20 20 20 45 4c 53 45 20 73 74 61          ELSE sta
7150: 74 75 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  tus.            
7160: 20 20 20 20 20 20 45 4e 44 20 57 48 45 52 45 20        END WHERE 
7170: 69 64 3d 3f 3b 22 0a 20 20 20 74 65 73 74 2d 69  id=?;".   test-i
7180: 64 20 74 65 73 74 2d 69 64 20 74 65 73 74 2d 69  d test-id test-i
7190: 64 20 74 65 73 74 2d 69 64 29 29 0a 0a 28 64 65  d test-id))..(de
71a0: 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 70 72 65  fine (db:get-pre
71b0: 76 2d 74 6f 6c 2d 66 6f 72 2d 74 65 73 74 20 64  v-tol-for-test d
71c0: 62 20 74 65 73 74 2d 69 64 20 63 61 74 65 67 6f  b test-id catego
71d0: 72 79 20 76 61 72 69 61 62 6c 65 29 0a 20 20 3b  ry variable).  ;
71e0: 3b 20 46 69 6e 69 73 68 20 6d 65 3f 0a 20 20 28  ; Finish me?.  (
71f0: 76 61 6c 75 65 73 20 23 66 20 23 66 20 23 66 29  values #f #f #f)
7200: 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  )..;;===========
7210: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7220: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7230: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7240: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 53  ===========.;; S
7250: 20 54 20 45 20 50 20 53 20 0a 3b 3b 3d 3d 3d 3d   T E P S .;;====
7260: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7270: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7280: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7290: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
72a0: 3d 3d 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  ==..(define (db:
72b0: 73 74 65 70 2d 67 65 74 2d 74 69 6d 65 2d 61 73  step-get-time-as
72c0: 2d 73 74 72 69 6e 67 20 76 65 63 29 0a 20 20 28  -string vec).  (
72d0: 73 65 63 6f 6e 64 73 2d 3e 74 69 6d 65 2d 73 74  seconds->time-st
72e0: 72 69 6e 67 20 28 64 62 3a 73 74 65 70 2d 67 65  ring (db:step-ge
72f0: 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 76 65 63  t-event_time vec
7300: 29 29 29 0a 0a 3b 3b 20 64 62 2d 67 65 74 2d 74  )))..;; db-get-t
7310: 65 73 74 2d 73 74 65 70 73 2d 66 6f 72 2d 72 75  est-steps-for-ru
7320: 6e 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65  n.(define (db:ge
7330: 74 2d 73 74 65 70 73 2d 66 6f 72 2d 74 65 73 74  t-steps-for-test
7340: 20 64 62 20 74 65 73 74 2d 69 64 29 0a 20 20 28   db test-id).  (
7350: 6c 65 74 20 28 28 72 65 73 20 27 28 29 29 29 0a  let ((res '())).
7360: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72      (sqlite3:for
7370: 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20 20 20 20  -each-row .     
7380: 28 6c 61 6d 62 64 61 20 28 69 64 20 74 65 73 74  (lambda (id test
7390: 2d 69 64 20 73 74 65 70 6e 61 6d 65 20 73 74 61  -id stepname sta
73a0: 74 65 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d  te status event-
73b0: 74 69 6d 65 20 6c 6f 67 66 69 6c 65 29 0a 20 20  time logfile).  
73c0: 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28       (set! res (
73d0: 63 6f 6e 73 20 28 76 65 63 74 6f 72 20 69 64 20  cons (vector id 
73e0: 74 65 73 74 2d 69 64 20 73 74 65 70 6e 61 6d 65  test-id stepname
73f0: 20 73 74 61 74 65 20 73 74 61 74 75 73 20 65 76   state status ev
7400: 65 6e 74 2d 74 69 6d 65 20 28 69 66 20 28 73 74  ent-time (if (st
7410: 72 69 6e 67 3f 20 6c 6f 67 66 69 6c 65 29 20 6c  ring? logfile) l
7420: 6f 67 66 69 6c 65 20 22 22 29 29 20 72 65 73 29  ogfile "")) res)
7430: 29 29 0a 20 20 20 20 20 64 62 0a 20 20 20 20 20  )).     db.     
7440: 22 53 45 4c 45 43 54 20 69 64 2c 74 65 73 74 5f  "SELECT id,test_
7450: 69 64 2c 73 74 65 70 6e 61 6d 65 2c 73 74 61 74  id,stepname,stat
7460: 65 2c 73 74 61 74 75 73 2c 65 76 65 6e 74 5f 74  e,status,event_t
7470: 69 6d 65 2c 6c 6f 67 66 69 6c 65 20 46 52 4f 4d  ime,logfile FROM
7480: 20 74 65 73 74 5f 73 74 65 70 73 20 57 48 45 52   test_steps WHER
7490: 45 20 74 65 73 74 5f 69 64 3d 3f 20 4f 52 44 45  E test_id=? ORDE
74a0: 52 20 42 59 20 69 64 20 41 53 43 3b 22 20 3b 3b  R BY id ASC;" ;;
74b0: 20 65 76 65 6e 74 5f 74 69 6d 65 20 44 45 53 43   event_time DESC
74c0: 2c 69 64 20 41 53 43 3b 0a 20 20 20 20 20 74 65  ,id ASC;.     te
74d0: 73 74 2d 69 64 29 0a 20 20 20 20 28 72 65 76 65  st-id).    (reve
74e0: 72 73 65 20 72 65 73 29 29 29 0a 0a 3b 3b 20 67  rse res)))..;; g
74f0: 65 74 20 61 20 70 72 65 74 74 79 20 74 61 62 6c  et a pretty tabl
7500: 65 20 74 6f 20 73 75 6d 6d 61 72 69 7a 65 20 73  e to summarize s
7510: 74 65 70 73 0a 3b 3b 0a 28 64 65 66 69 6e 65 20  teps.;;.(define 
7520: 28 64 62 3a 67 65 74 2d 73 74 65 70 73 2d 74 61  (db:get-steps-ta
7530: 62 6c 65 20 64 62 20 74 65 73 74 2d 69 64 29 0a  ble db test-id).
7540: 20 20 28 6c 65 74 20 28 28 73 74 65 70 73 20 20    (let ((steps  
7550: 20 28 64 62 3a 67 65 74 2d 73 74 65 70 73 2d 66   (db:get-steps-f
7560: 6f 72 2d 74 65 73 74 20 64 62 20 74 65 73 74 2d  or-test db test-
7570: 69 64 29 29 29 0a 20 20 20 20 3b 3b 20 6f 72 67  id))).    ;; org
7580: 61 6e 69 73 65 20 74 68 65 20 73 74 65 70 73 20  anise the steps 
7590: 66 6f 72 20 62 65 74 74 65 72 20 72 65 61 64 61  for better reada
75a0: 62 69 6c 69 74 79 0a 20 20 20 20 28 6c 65 74 20  bility.    (let 
75b0: 28 28 72 65 73 20 28 6d 61 6b 65 2d 68 61 73 68  ((res (make-hash
75c0: 2d 74 61 62 6c 65 29 29 29 0a 20 20 20 20 20 20  -table))).      
75d0: 28 66 6f 72 2d 65 61 63 68 20 0a 20 20 20 20 20  (for-each .     
75e0: 20 20 28 6c 61 6d 62 64 61 20 28 73 74 65 70 29    (lambda (step)
75f0: 0a 09 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20  .. (debug:print 
7600: 36 20 22 73 74 65 70 3d 22 20 73 74 65 70 29 0a  6 "step=" step).
7610: 09 20 28 6c 65 74 20 28 28 72 65 63 6f 72 64 20  . (let ((record 
7620: 28 68 61 73 68 2d 74 61 62 6c 65 2d 72 65 66 2f  (hash-table-ref/
7630: 64 65 66 61 75 6c 74 20 0a 09 09 09 72 65 73 20  default ....res 
7640: 0a 09 09 09 28 64 62 3a 73 74 65 70 2d 67 65 74  ....(db:step-get
7650: 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70 29 20  -stepname step) 
7660: 0a 09 09 09 3b 3b 20 20 20 20 20 20 20 20 73 74  ....;;        st
7670: 65 70 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20  epname          
7680: 20 20 20 20 20 20 73 74 61 72 74 20 65 6e 64 20        start end 
7690: 73 74 61 74 75 73 20 20 20 20 0a 09 09 09 28 76  status    ....(v
76a0: 65 63 74 6f 72 20 28 64 62 3a 73 74 65 70 2d 67  ector (db:step-g
76b0: 65 74 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70  et-stepname step
76c0: 29 20 22 22 20 20 20 22 22 20 22 22 20 20 20 20  ) ""   "" ""    
76d0: 20 22 22 20 22 22 29 29 29 29 0a 09 20 20 20 28   "" ""))))..   (
76e0: 64 65 62 75 67 3a 70 72 69 6e 74 20 36 20 22 72  debug:print 6 "r
76f0: 65 63 6f 72 64 28 62 65 66 6f 72 65 29 20 3d 20  ecord(before) = 
7700: 22 20 72 65 63 6f 72 64 20 0a 09 09 09 22 5c 6e  " record ...."\n
7710: 69 64 3a 20 20 20 20 20 20 20 22 20 28 64 62 3a  id:       " (db:
7720: 73 74 65 70 2d 67 65 74 2d 69 64 20 73 74 65 70  step-get-id step
7730: 29 0a 09 09 09 22 5c 6e 73 74 65 70 6e 61 6d 65  )...."\nstepname
7740: 3a 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74  : " (db:step-get
7750: 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70 29 0a  -stepname step).
7760: 09 09 09 22 5c 6e 73 74 61 74 65 3a 20 20 20 20  ..."\nstate:    
7770: 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73  " (db:step-get-s
7780: 74 61 74 65 20 73 74 65 70 29 0a 09 09 09 22 5c  tate step)...."\
7790: 6e 73 74 61 74 75 73 3a 20 20 20 22 20 28 64 62  nstatus:   " (db
77a0: 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 74 75 73  :step-get-status
77b0: 20 73 74 65 70 29 0a 09 09 09 22 5c 6e 74 69 6d   step)...."\ntim
77c0: 65 3a 20 20 20 20 20 22 20 28 64 62 3a 73 74 65  e:     " (db:ste
77d0: 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65  p-get-event_time
77e0: 20 73 74 65 70 29 29 0a 09 20 20 20 28 63 61 73   step))..   (cas
77f0: 65 20 28 73 74 72 69 6e 67 2d 3e 73 79 6d 62 6f  e (string->symbo
7800: 6c 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73  l (db:step-get-s
7810: 74 61 74 65 20 73 74 65 70 29 29 0a 09 20 20 20  tate step))..   
7820: 20 20 28 28 73 74 61 72 74 29 28 76 65 63 74 6f    ((start)(vecto
7830: 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 31 20  r-set! record 1 
7840: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65  (db:step-get-eve
7850: 6e 74 5f 74 69 6d 65 20 73 74 65 70 29 29 0a 09  nt_time step))..
7860: 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65        (vector-se
7870: 74 21 20 72 65 63 6f 72 64 20 33 20 28 69 66 20  t! record 3 (if 
7880: 28 65 71 75 61 6c 3f 20 28 76 65 63 74 6f 72 2d  (equal? (vector-
7890: 72 65 66 20 72 65 63 6f 72 64 20 33 29 20 22 22  ref record 3) ""
78a0: 29 0a 09 09 09 09 09 28 64 62 3a 73 74 65 70 2d  )......(db:step-
78b0: 67 65 74 2d 73 74 61 74 75 73 20 73 74 65 70 29  get-status step)
78c0: 29 29 0a 09 20 20 20 20 20 20 28 69 66 20 28 3e  ))..      (if (>
78d0: 20 28 73 74 72 69 6e 67 2d 6c 65 6e 67 74 68 20   (string-length 
78e0: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 6c 6f 67  (db:step-get-log
78f0: 66 69 6c 65 20 73 74 65 70 29 29 0a 09 09 20 20  file step))...  
7900: 20 20 20 30 29 0a 09 09 20 20 28 76 65 63 74 6f     0)...  (vecto
7910: 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 35 20  r-set! record 5 
7920: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 6c 6f 67  (db:step-get-log
7930: 66 69 6c 65 20 73 74 65 70 29 29 29 29 0a 09 20  file step)))).. 
7940: 20 20 20 20 28 28 65 6e 64 29 20 20 0a 09 20 20      ((end)  ..  
7950: 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21      (vector-set!
7960: 20 72 65 63 6f 72 64 20 32 20 28 61 6e 79 2d 3e   record 2 (any->
7970: 6e 75 6d 62 65 72 20 28 64 62 3a 73 74 65 70 2d  number (db:step-
7980: 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73  get-event_time s
7990: 74 65 70 29 29 29 0a 09 20 20 20 20 20 20 28 76  tep)))..      (v
79a0: 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72  ector-set! recor
79b0: 64 20 33 20 28 64 62 3a 73 74 65 70 2d 67 65 74  d 3 (db:step-get
79c0: 2d 73 74 61 74 75 73 20 73 74 65 70 29 29 0a 09  -status step))..
79d0: 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65        (vector-se
79e0: 74 21 20 72 65 63 6f 72 64 20 34 20 28 6c 65 74  t! record 4 (let
79f0: 20 28 28 73 74 61 72 74 74 20 28 61 6e 79 2d 3e   ((startt (any->
7a00: 6e 75 6d 62 65 72 20 28 76 65 63 74 6f 72 2d 72  number (vector-r
7a10: 65 66 20 72 65 63 6f 72 64 20 31 29 29 29 0a 09  ef record 1)))..
7a20: 09 09 09 09 20 20 28 65 6e 64 74 20 20 20 28 61  ....  (endt   (a
7a30: 6e 79 2d 3e 6e 75 6d 62 65 72 20 28 76 65 63 74  ny->number (vect
7a40: 6f 72 2d 72 65 66 20 72 65 63 6f 72 64 20 32 29  or-ref record 2)
7a50: 29 29 29 0a 09 09 09 09 20 20 20 20 20 20 28 64  ))).....      (d
7a60: 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22 72 65  ebug:print 4 "re
7a70: 63 6f 72 64 5b 31 5d 3d 22 20 28 76 65 63 74 6f  cord[1]=" (vecto
7a80: 72 2d 72 65 66 20 72 65 63 6f 72 64 20 31 29 20  r-ref record 1) 
7a90: 0a 09 09 09 09 09 09 20 20 20 22 2c 20 73 74 61  .......   ", sta
7aa0: 72 74 74 3d 22 20 73 74 61 72 74 74 20 22 2c 20  rtt=" startt ", 
7ab0: 65 6e 64 74 3d 22 20 65 6e 64 74 0a 09 09 09 09  endt=" endt.....
7ac0: 09 09 20 20 20 22 2c 20 67 65 74 2d 73 74 61 74  ..   ", get-stat
7ad0: 75 73 3a 20 22 20 28 64 62 3a 73 74 65 70 2d 67  us: " (db:step-g
7ae0: 65 74 2d 73 74 61 74 75 73 20 73 74 65 70 29 29  et-status step))
7af0: 0a 09 09 09 09 20 20 20 20 20 20 28 69 66 20 28  .....      (if (
7b00: 61 6e 64 20 28 6e 75 6d 62 65 72 3f 20 73 74 61  and (number? sta
7b10: 72 74 74 29 28 6e 75 6d 62 65 72 3f 20 65 6e 64  rtt)(number? end
7b20: 74 29 29 0a 09 09 09 09 09 20 20 28 73 65 63 6f  t))......  (seco
7b30: 6e 64 73 2d 3e 68 72 2d 6d 69 6e 2d 73 65 63 20  nds->hr-min-sec 
7b40: 28 2d 20 65 6e 64 74 20 73 74 61 72 74 74 29 29  (- endt startt))
7b50: 20 22 2d 31 22 29 29 29 0a 09 20 20 20 20 20 20   "-1")))..      
7b60: 28 69 66 20 28 3e 20 28 73 74 72 69 6e 67 2d 6c  (if (> (string-l
7b70: 65 6e 67 74 68 20 28 64 62 3a 73 74 65 70 2d 67  ength (db:step-g
7b80: 65 74 2d 6c 6f 67 66 69 6c 65 20 73 74 65 70 29  et-logfile step)
7b90: 29 0a 09 09 20 20 20 20 20 30 29 0a 09 09 20 20  )...     0)...  
7ba0: 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63  (vector-set! rec
7bb0: 6f 72 64 20 35 20 28 64 62 3a 73 74 65 70 2d 67  ord 5 (db:step-g
7bc0: 65 74 2d 6c 6f 67 66 69 6c 65 20 73 74 65 70 29  et-logfile step)
7bd0: 29 29 29 0a 09 20 20 20 20 20 28 65 6c 73 65 0a  )))..     (else.
7be0: 09 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73  .      (vector-s
7bf0: 65 74 21 20 72 65 63 6f 72 64 20 32 20 28 64 62  et! record 2 (db
7c00: 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 74 65 20  :step-get-state 
7c10: 73 74 65 70 29 29 0a 09 20 20 20 20 20 20 28 76  step))..      (v
7c20: 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72  ector-set! recor
7c30: 64 20 33 20 28 64 62 3a 73 74 65 70 2d 67 65 74  d 3 (db:step-get
7c40: 2d 73 74 61 74 75 73 20 73 74 65 70 29 29 0a 09  -status step))..
7c50: 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65        (vector-se
7c60: 74 21 20 72 65 63 6f 72 64 20 34 20 28 64 62 3a  t! record 4 (db:
7c70: 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74  step-get-event_t
7c80: 69 6d 65 20 73 74 65 70 29 29 29 29 0a 09 20 20  ime step))))..  
7c90: 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 73 65 74   (hash-table-set
7ca0: 21 20 72 65 73 20 28 64 62 3a 73 74 65 70 2d 67  ! res (db:step-g
7cb0: 65 74 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70  et-stepname step
7cc0: 29 20 72 65 63 6f 72 64 29 0a 09 20 20 20 28 64  ) record)..   (d
7cd0: 65 62 75 67 3a 70 72 69 6e 74 20 36 20 22 72 65  ebug:print 6 "re
7ce0: 63 6f 72 64 28 61 66 74 65 72 29 20 20 3d 20 22  cord(after)  = "
7cf0: 20 72 65 63 6f 72 64 20 0a 09 09 09 22 5c 6e 69   record ...."\ni
7d00: 64 3a 20 20 20 20 20 20 20 22 20 28 64 62 3a 73  d:       " (db:s
7d10: 74 65 70 2d 67 65 74 2d 69 64 20 73 74 65 70 29  tep-get-id step)
7d20: 0a 09 09 09 22 5c 6e 73 74 65 70 6e 61 6d 65 3a  ...."\nstepname:
7d30: 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d   " (db:step-get-
7d40: 73 74 65 70 6e 61 6d 65 20 73 74 65 70 29 0a 09  stepname step)..
7d50: 09 09 22 5c 6e 73 74 61 74 65 3a 20 20 20 20 22  .."\nstate:    "
7d60: 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74   (db:step-get-st
7d70: 61 74 65 20 73 74 65 70 29 0a 09 09 09 22 5c 6e  ate step)...."\n
7d80: 73 74 61 74 75 73 3a 20 20 20 22 20 28 64 62 3a  status:   " (db:
7d90: 73 74 65 70 2d 67 65 74 2d 73 74 61 74 75 73 20  step-get-status 
7da0: 73 74 65 70 29 0a 09 09 09 22 5c 6e 74 69 6d 65  step)...."\ntime
7db0: 3a 20 20 20 20 20 22 20 28 64 62 3a 73 74 65 70  :     " (db:step
7dc0: 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20  -get-event_time 
7dd0: 73 74 65 70 29 29 29 29 0a 20 20 20 20 20 20 20  step)))).       
7de0: 3b 3b 20 28 65 6c 73 65 20 20 20 28 76 65 63 74  ;; (else   (vect
7df0: 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 31  or-set! record 1
7e00: 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 76   (db:step-get-ev
7e10: 65 6e 74 5f 74 69 6d 65 20 73 74 65 70 29 29 29  ent_time step)))
7e20: 0a 20 20 20 20 20 20 20 28 73 6f 72 74 20 73 74  .       (sort st
7e30: 65 70 73 20 28 6c 61 6d 62 64 61 20 28 61 20 62  eps (lambda (a b
7e40: 29 28 3c 20 28 64 62 3a 73 74 65 70 2d 67 65 74  )(< (db:step-get
7e50: 2d 65 76 65 6e 74 5f 74 69 6d 65 20 61 29 28 64  -event_time a)(d
7e60: 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74  b:step-get-event
7e70: 5f 74 69 6d 65 20 62 29 29 29 29 29 0a 20 20 20  _time b))))).   
7e80: 20 20 20 72 65 73 29 29 29 0a 0a 3b 3b 20 55 53     res)))..;; US
7e90: 45 3a 20 28 6c 73 65 74 2d 64 69 66 66 65 72 65  E: (lset-differe
7ea0: 6e 63 65 20 73 74 72 69 6e 67 3d 3f 20 27 28 22  nce string=? '("
7eb0: 61 22 20 22 62 22 20 22 63 22 29 20 27 28 22 64  a" "b" "c") '("d
7ec0: 22 20 22 63 22 20 22 65 22 20 22 61 22 29 29 0a  " "c" "e" "a")).
7ed0: 3b 3b 0a 3b 3b 20 52 65 74 75 72 6e 20 61 20 6c  ;;.;; Return a l
7ee0: 69 73 74 20 6f 66 20 70 72 65 72 65 71 73 20 74  ist of prereqs t
7ef0: 68 61 74 20 77 65 72 65 20 4e 4f 54 20 6d 65 74  hat were NOT met
7f00: 0a 3b 3b 20 20 54 65 73 74 73 20 28 61 6e 64 20  .;;  Tests (and 
7f10: 61 6c 6c 20 69 74 65 6d 73 29 20 69 6e 20 77 61  all items) in wa
7f20: 69 74 6f 6e 20 6c 69 73 74 20 6d 75 73 74 20 62  iton list must b
7f30: 65 20 22 43 4f 4d 50 4c 45 54 45 44 22 20 61 6e  e "COMPLETED" an
7f40: 64 20 22 50 41 53 53 22 0a 28 64 65 66 69 6e 65  d "PASS".(define
7f50: 20 28 64 62 2d 67 65 74 2d 70 72 65 72 65 71 73   (db-get-prereqs
7f60: 2d 6e 6f 74 2d 6d 65 74 20 64 62 20 72 75 6e 2d  -not-met db run-
7f70: 69 64 20 77 61 69 74 6f 6e 29 0a 20 20 28 69 66  id waiton).  (if
7f80: 20 28 6e 75 6c 6c 3f 20 77 61 69 74 6f 6e 29 0a   (null? waiton).
7f90: 20 20 20 20 20 20 27 28 29 0a 20 20 20 20 20 20        '().      
7fa0: 28 6c 65 74 2a 20 28 28 75 6e 6d 65 74 2d 70 72  (let* ((unmet-pr
7fb0: 65 2d 72 65 71 73 20 27 28 29 29 0a 09 20 20 20  e-reqs '())..   
7fc0: 20 20 28 74 65 73 74 73 20 20 20 20 20 20 20 20    (tests        
7fd0: 20 20 20 28 64 62 2d 67 65 74 2d 74 65 73 74 73     (db-get-tests
7fe0: 2d 66 6f 72 2d 72 75 6e 20 64 62 20 72 75 6e 2d  -for-run db run-
7ff0: 69 64 20 23 66 20 23 66 20 27 28 29 20 27 28 29  id #f #f '() '()
8000: 29 29 0a 09 20 20 20 20 20 28 72 65 73 75 6c 74  ))..     (result
8010: 20 20 20 20 20 20 20 20 20 27 28 29 29 29 0a 09           '()))..
8020: 28 66 6f 72 2d 65 61 63 68 20 28 6c 61 6d 62 64  (for-each (lambd
8030: 61 20 28 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61  a (waitontest-na
8040: 6d 65 29 0a 09 09 20 20 20 20 28 6c 65 74 20 28  me)...    (let (
8050: 28 65 76 65 72 2d 73 65 65 6e 20 23 66 29 29 0a  (ever-seen #f)).
8060: 09 09 20 20 20 20 20 20 28 66 6f 72 2d 65 61 63  ..      (for-eac
8070: 68 20 28 6c 61 6d 62 64 61 20 28 74 65 73 74 29  h (lambda (test)
8080: 0a 09 09 09 09 20 20 28 69 66 20 28 65 71 75 61  .....  (if (equa
8090: 6c 3f 20 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61  l? waitontest-na
80a0: 6d 65 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d  me (db:test-get-
80b0: 74 65 73 74 6e 61 6d 65 20 74 65 73 74 29 29 0a  testname test)).
80c0: 09 09 09 09 20 20 20 20 20 20 28 62 65 67 69 6e  ....      (begin
80d0: 0a 09 09 09 09 09 28 73 65 74 21 20 65 76 65 72  ......(set! ever
80e0: 2d 73 65 65 6e 20 23 74 29 0a 09 09 09 09 09 28  -seen #t)......(
80f0: 69 66 20 28 6e 6f 74 20 28 61 6e 64 20 28 65 71  if (not (and (eq
8100: 75 61 6c 3f 20 28 64 62 3a 74 65 73 74 2d 67 65  ual? (db:test-ge
8110: 74 2d 73 74 61 74 65 20 74 65 73 74 29 20 22 43  t-state test) "C
8120: 4f 4d 50 4c 45 54 45 44 22 29 0a 09 09 09 09 09  OMPLETED")......
8130: 09 20 20 20 20 20 20 28 6d 65 6d 62 65 72 20 28  .      (member (
8140: 64 62 3a 74 65 73 74 2d 67 65 74 2d 73 74 61 74  db:test-get-stat
8150: 75 73 20 74 65 73 74 29 20 27 28 22 50 41 53 53  us test) '("PASS
8160: 22 20 22 57 41 52 4e 22 20 22 43 48 45 43 4b 22  " "WARN" "CHECK"
8170: 29 29 29 29 0a 09 09 09 09 09 20 20 20 20 28 73  ))))......    (s
8180: 65 74 21 20 72 65 73 75 6c 74 20 28 63 6f 6e 73  et! result (cons
8190: 20 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65   waitontest-name
81a0: 20 72 65 73 75 6c 74 29 29 29 29 29 29 0a 09 09   result))))))...
81b0: 09 09 74 65 73 74 73 29 0a 09 09 20 20 20 20 20  ..tests)...     
81c0: 20 28 69 66 20 28 6e 6f 74 20 65 76 65 72 2d 73   (if (not ever-s
81d0: 65 65 6e 29 28 73 65 74 21 20 72 65 73 75 6c 74  een)(set! result
81e0: 20 28 63 6f 6e 73 20 77 61 69 74 6f 6e 74 65 73   (cons waitontes
81f0: 74 2d 6e 61 6d 65 20 72 65 73 75 6c 74 29 29 29  t-name result)))
8200: 29 29 0a 09 09 20 20 77 61 69 74 6f 6e 29 0a 09  ))...  waiton)..
8210: 28 64 65 6c 65 74 65 2d 64 75 70 6c 69 63 61 74  (delete-duplicat
8220: 65 73 20 72 65 73 75 6c 74 29 29 29 29 0a 0a 3b  es result))))..;
8230: 3b 20 74 68 65 20 6e 65 77 20 70 72 65 72 65 71  ; the new prereq
8240: 73 20 63 61 6c 63 75 6c 61 74 69 6f 6e 2c 20 6c  s calculation, l
8250: 6f 6f 6b 73 20 61 6c 73 6f 20 61 74 20 69 74 65  ooks also at ite
8260: 6d 70 61 74 68 20 69 66 20 73 70 65 63 69 66 69  mpath if specifi
8270: 65 64 0a 3b 3b 20 61 6c 6c 20 70 72 65 72 65 71  ed.;; all prereq
8280: 73 20 6d 75 73 74 20 62 65 20 6d 65 74 3a 0a 3b  s must be met:.;
8290: 3b 20 20 20 20 69 66 20 70 72 65 72 65 71 20 74  ;    if prereq t
82a0: 65 73 74 20 77 69 74 68 20 69 74 65 6d 70 61 74  est with itempat
82b0: 68 3d 27 27 20 69 73 20 43 4f 4d 50 4c 45 54 45  h='' is COMPLETE
82c0: 44 20 61 6e 64 20 50 41 53 53 2c 20 57 41 52 4e  D and PASS, WARN
82d0: 2c 20 43 48 45 43 4b 2c 20 6f 72 20 57 41 49 56  , CHECK, or WAIV
82e0: 45 44 20 74 68 65 6e 20 70 72 65 72 65 71 20 69  ED then prereq i
82f0: 73 20 6d 65 74 0a 3b 3b 20 20 20 20 69 66 20 70  s met.;;    if p
8300: 72 65 72 65 71 20 74 65 73 74 20 77 69 74 68 20  rereq test with 
8310: 69 74 65 6d 70 61 74 68 3d 72 65 66 2d 69 74 65  itempath=ref-ite
8320: 6d 2d 70 61 74 68 20 61 6e 64 20 43 4f 4d 50 4c  m-path and COMPL
8330: 45 54 45 44 20 77 69 74 68 20 50 41 53 53 2c 20  ETED with PASS, 
8340: 57 41 52 4e 2c 20 43 48 45 43 4b 2c 20 6f 72 20  WARN, CHECK, or 
8350: 57 41 49 56 45 44 20 74 68 65 6e 20 70 72 65 72  WAIVED then prer
8360: 65 71 20 69 73 20 6d 65 74 0a 28 64 65 66 69 6e  eq is met.(defin
8370: 65 20 28 64 62 3a 67 65 74 2d 70 72 65 72 65 71  e (db:get-prereq
8380: 73 2d 6e 6f 74 2d 6d 65 74 20 64 62 20 72 75 6e  s-not-met db run
8390: 2d 69 64 20 77 61 69 74 6f 6e 73 20 72 65 66 2d  -id waitons ref-
83a0: 69 74 65 6d 2d 70 61 74 68 29 0a 20 20 28 69 66  item-path).  (if
83b0: 20 28 6f 72 20 28 6e 6f 74 20 77 61 69 74 6f 6e   (or (not waiton
83c0: 73 29 0a 09 20 20 28 6e 75 6c 6c 3f 20 77 61 69  s)..  (null? wai
83d0: 74 6f 6e 73 29 29 0a 20 20 20 20 20 20 27 28 29  tons)).      '()
83e0: 0a 20 20 20 20 20 20 28 6c 65 74 2a 20 28 28 75  .      (let* ((u
83f0: 6e 6d 65 74 2d 70 72 65 2d 72 65 71 73 20 27 28  nmet-pre-reqs '(
8400: 29 29 0a 09 20 20 20 20 20 28 72 65 73 75 6c 74  ))..     (result
8410: 20 20 20 20 20 20 20 20 20 27 28 29 29 29 0a 09           '()))..
8420: 28 66 6f 72 2d 65 61 63 68 20 0a 09 20 28 6c 61  (for-each .. (la
8430: 6d 62 64 61 20 28 77 61 69 74 6f 6e 74 65 73 74  mbda (waitontest
8440: 2d 6e 61 6d 65 29 0a 09 20 20 20 3b 3b 20 62 79  -name)..   ;; by
8450: 20 67 65 74 74 69 6e 67 20 74 68 65 20 74 65 73   getting the tes
8460: 74 73 20 77 69 74 68 20 6d 61 74 63 68 69 6e 67  ts with matching
8470: 20 6e 61 6d 65 20 77 65 20 61 72 65 20 6c 6f 6f   name we are loo
8480: 6b 69 6e 67 20 6f 6e 6c 79 20 61 74 20 74 68 65  king only at the
8490: 20 6d 61 74 63 68 69 6e 67 20 74 65 73 74 20 0a   matching test .
84a0: 09 20 20 20 3b 3b 20 61 6e 64 20 72 65 6c 61 74  .   ;; and relat
84b0: 65 64 20 73 75 62 20 69 74 65 6d 73 0a 09 20 20  ed sub items..  
84c0: 20 28 6c 65 74 20 28 28 74 65 73 74 73 20 20 20   (let ((tests   
84d0: 20 20 20 20 20 20 20 20 20 20 28 64 62 2d 67 65            (db-ge
84e0: 74 2d 74 65 73 74 73 2d 66 6f 72 2d 72 75 6e 20  t-tests-for-run 
84f0: 64 62 20 72 75 6e 2d 69 64 20 77 61 69 74 6f 6e  db run-id waiton
8500: 74 65 73 74 2d 6e 61 6d 65 20 23 66 20 27 28 29  test-name #f '()
8510: 20 27 28 29 29 29 0a 09 09 20 28 65 76 65 72 2d   '()))... (ever-
8520: 73 65 65 6e 20 20 20 20 20 20 20 20 20 23 66 29  seen         #f)
8530: 0a 09 09 20 28 70 61 72 65 6e 74 2d 77 61 69 74  ... (parent-wait
8540: 6f 6e 2d 6d 65 74 20 23 66 29 0a 09 09 20 28 69  on-met #f)... (i
8550: 74 65 6d 2d 77 61 69 74 6f 6e 2d 6d 65 74 20 20  tem-waiton-met  
8560: 20 23 66 29 29 0a 09 20 20 20 20 20 28 66 6f 72   #f))..     (for
8570: 2d 65 61 63 68 20 0a 09 20 20 20 20 20 20 28 6c  -each ..      (l
8580: 61 6d 62 64 61 20 28 74 65 73 74 29 0a 09 09 3b  ambda (test)...;
8590: 3b 20 28 69 66 20 28 65 71 75 61 6c 3f 20 77 61  ; (if (equal? wa
85a0: 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 20 28 64  itontest-name (d
85b0: 62 3a 74 65 73 74 2d 67 65 74 2d 74 65 73 74 6e  b:test-get-testn
85c0: 61 6d 65 20 74 65 73 74 29 29 20 3b 3b 20 62 79  ame test)) ;; by
85d0: 20 64 65 66 69 6e 74 69 6f 6e 20 74 68 69 73 20   defintion this 
85e0: 68 61 64 20 62 65 74 74 65 72 20 62 65 20 74 72  had better be tr
85f0: 75 65 20 2e 2e 2e 0a 09 09 28 6c 65 74 2a 20 28  ue ......(let* (
8600: 28 73 74 61 74 65 20 20 20 20 20 20 20 20 20 20  (state          
8610: 20 20 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d     (db:test-get-
8620: 73 74 61 74 65 20 74 65 73 74 29 29 0a 09 09 20  state test))... 
8630: 20 20 20 20 20 20 28 73 74 61 74 75 73 20 20 20        (status   
8640: 20 20 20 20 20 20 20 20 20 28 64 62 3a 74 65 73           (db:tes
8650: 74 2d 67 65 74 2d 73 74 61 74 75 73 20 74 65 73  t-get-status tes
8660: 74 29 29 0a 09 09 20 20 20 20 20 20 20 28 69 74  t))...       (it
8670: 65 6d 2d 70 61 74 68 20 20 20 20 20 20 20 20 20  em-path         
8680: 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 69 74 65  (db:test-get-ite
8690: 6d 2d 70 61 74 68 20 74 65 73 74 29 29 0a 09 09  m-path test))...
86a0: 20 20 20 20 20 20 20 28 69 73 2d 63 6f 6d 70 6c         (is-compl
86b0: 65 74 65 64 20 20 20 20 20 20 28 65 71 75 61 6c  eted      (equal
86c0: 3f 20 73 74 61 74 65 20 22 43 4f 4d 50 4c 45 54  ? state "COMPLET
86d0: 45 44 22 29 29 0a 09 09 20 20 20 20 20 20 20 28  ED"))...       (
86e0: 69 73 2d 6f 6b 20 20 20 20 20 20 20 20 20 20 20  is-ok           
86f0: 20 20 28 6d 65 6d 62 65 72 20 73 74 61 74 75 73    (member status
8700: 20 27 28 22 50 41 53 53 22 20 22 57 41 52 4e 22   '("PASS" "WARN"
8710: 20 22 43 48 45 43 4b 22 20 22 57 41 49 56 45 44   "CHECK" "WAIVED
8720: 22 29 29 29 0a 09 09 20 20 20 20 20 20 20 28 73  ")))...       (s
8730: 61 6d 65 2d 69 74 65 6d 70 61 74 68 20 20 20 20  ame-itempath    
8740: 20 28 65 71 75 61 6c 3f 20 72 65 66 2d 69 74 65   (equal? ref-ite
8750: 6d 2d 70 61 74 68 20 69 74 65 6d 2d 70 61 74 68  m-path item-path
8760: 29 29 29 0a 09 09 20 20 28 73 65 74 21 20 65 76  )))...  (set! ev
8770: 65 72 2d 73 65 65 6e 20 23 74 29 0a 09 09 20 20  er-seen #t)...  
8780: 28 63 6f 6e 64 0a 09 09 20 20 20 3b 3b 20 63 61  (cond...   ;; ca
8790: 73 65 20 31 2c 20 6e 6f 6e 2d 69 74 65 6d 20 28  se 1, non-item (
87a0: 70 61 72 65 6e 74 20 74 65 73 74 29 20 69 73 20  parent test) is 
87b0: 0a 09 09 20 20 20 28 28 61 6e 64 20 28 65 71 75  ...   ((and (equ
87c0: 61 6c 3f 20 69 74 65 6d 2d 70 61 74 68 20 22 22  al? item-path ""
87d0: 29 20 3b 3b 20 74 68 69 73 20 69 73 20 74 68 65  ) ;; this is the
87e0: 20 70 61 72 65 6e 74 20 74 65 73 74 0a 09 09 09   parent test....
87f0: 20 69 73 2d 63 6f 6d 70 6c 65 74 65 64 0a 09 09   is-completed...
8800: 09 20 69 73 2d 6f 6b 29 0a 09 09 20 20 20 20 28  . is-ok)...    (
8810: 73 65 74 21 20 70 61 72 65 6e 74 2d 77 61 69 74  set! parent-wait
8820: 6f 6e 2d 6d 65 74 20 23 74 29 29 0a 09 09 20 20  on-met #t))...  
8830: 20 28 28 61 6e 64 20 73 61 6d 65 2d 69 74 65 6d   ((and same-item
8840: 70 61 74 68 0a 09 09 09 20 69 73 2d 63 6f 6d 70  path.... is-comp
8850: 6c 65 74 65 64 0a 09 09 09 20 69 73 2d 6f 6b 29  leted.... is-ok)
8860: 0a 09 09 20 20 20 20 28 73 65 74 21 20 69 74 65  ...    (set! ite
8870: 6d 2d 77 61 69 74 6f 6e 2d 6d 65 74 20 23 74 29  m-waiton-met #t)
8880: 29 29 29 29 0a 09 20 20 20 20 20 20 74 65 73 74  ))))..      test
8890: 73 29 0a 09 20 20 20 20 20 28 69 66 20 28 6e 6f  s)..     (if (no
88a0: 74 20 28 6f 72 20 70 61 72 65 6e 74 2d 77 61 69  t (or parent-wai
88b0: 74 6f 6e 2d 6d 65 74 20 69 74 65 6d 2d 77 61 69  ton-met item-wai
88c0: 74 6f 6e 2d 6d 65 74 29 29 0a 09 09 20 28 73 65  ton-met))... (se
88d0: 74 21 20 72 65 73 75 6c 74 20 28 63 6f 6e 73 20  t! result (cons 
88e0: 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 20  waitontest-name 
88f0: 72 65 73 75 6c 74 29 29 29 0a 09 20 20 20 20 20  result)))..     
8900: 3b 3b 20 69 66 20 74 68 65 20 74 65 73 74 20 69  ;; if the test i
8910: 73 20 6e 6f 74 20 66 6f 75 6e 64 20 74 68 65 6e  s not found then
8920: 20 63 6c 65 61 72 6c 79 20 74 68 65 20 77 61 69   clearly the wai
8930: 74 6f 6e 20 69 73 20 6e 6f 74 20 6d 65 74 2e 2e  ton is not met..
8940: 2e 0a 09 20 20 20 20 20 28 69 66 20 28 6e 6f 74  ...     (if (not
8950: 20 65 76 65 72 2d 73 65 65 6e 29 28 73 65 74 21   ever-seen)(set!
8960: 20 72 65 73 75 6c 74 20 28 63 6f 6e 73 20 77 61   result (cons wa
8970: 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 20 72 65  itontest-name re
8980: 73 75 6c 74 29 29 29 29 29 0a 09 77 61 69 74 6f  sult)))))..waito
8990: 6e 73 29 0a 20 20 20 20 20 20 28 64 65 6c 65 74  ns).      (delet
89a0: 65 2d 64 75 70 6c 69 63 61 74 65 73 20 72 65 73  e-duplicates res
89b0: 75 6c 74 29 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d  ult))))..;;=====
89c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
89d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
89e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
89f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8a00: 3d 0a 3b 3b 20 45 78 74 72 61 63 74 20 6f 64 73  =.;; Extract ods
8a10: 20 66 69 6c 65 20 66 72 6f 6d 20 74 68 65 20 64   file from the d
8a20: 62 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  b.;;============
8a30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8a40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8a50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8a60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 72  ==========..;; r
8a70: 75 6e 73 70 61 74 74 20 69 73 20 61 20 63 6f 6d  unspatt is a com
8a80: 6d 61 20 64 65 6c 69 6d 69 74 65 64 20 6c 69 73  ma delimited lis
8a90: 74 20 6f 66 20 72 75 6e 20 70 61 74 74 65 72 6e  t of run pattern
8aa0: 73 0a 3b 3b 20 6b 65 79 70 61 74 74 2d 61 6c 69  s.;; keypatt-ali
8ab0: 73 74 20 6d 75 73 74 20 63 6f 6e 74 61 69 6e 20  st must contain 
8ac0: 2a 61 6c 6c 2a 20 6b 65 79 73 20 77 69 74 68 20  *all* keys with 
8ad0: 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20 70 61  an associated pa
8ae0: 74 74 65 72 6e 3a 20 27 28 20 28 22 4b 45 59 31  ttern: '( ("KEY1
8af0: 22 20 22 25 22 29 20 2e 2e 20 29 0a 28 64 65 66  " "%") .. ).(def
8b00: 69 6e 65 20 28 64 62 3a 65 78 74 72 61 63 74 2d  ine (db:extract-
8b10: 6f 64 73 2d 66 69 6c 65 20 64 62 20 6f 75 74 70  ods-file db outp
8b20: 75 74 66 69 6c 65 20 6b 65 79 70 61 74 74 2d 61  utfile keypatt-a
8b30: 6c 69 73 74 20 72 75 6e 73 70 61 74 74 20 70 61  list runspatt pa
8b40: 74 68 6d 6f 64 29 0a 20 20 28 6c 65 74 2a 20 28  thmod).  (let* (
8b50: 28 6b 65 79 73 73 74 72 20 20 28 73 74 72 69 6e  (keysstr  (strin
8b60: 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 28 6d  g-intersperse (m
8b70: 61 70 20 63 61 72 20 6b 65 79 70 61 74 74 2d 61  ap car keypatt-a
8b80: 6c 69 73 74 29 20 22 2c 22 29 29 0a 09 20 28 6b  list) ",")).. (k
8b90: 65 79 71 72 79 20 20 20 28 73 74 72 69 6e 67 2d  eyqry   (string-
8ba0: 69 6e 74 65 72 73 70 65 72 73 65 20 28 6d 61 70  intersperse (map
8bb0: 20 28 6c 61 6d 62 64 61 20 28 70 29 28 63 6f 6e   (lambda (p)(con
8bc0: 63 20 28 63 61 72 20 70 29 20 22 20 4c 49 4b 45  c (car p) " LIKE
8bd0: 20 3f 20 22 29 29 20 6b 65 79 70 61 74 74 2d 61   ? ")) keypatt-a
8be0: 6c 69 73 74 29 20 22 20 41 4e 44 20 22 29 29 0a  list) " AND ")).
8bf0: 09 20 28 6e 75 6d 6b 65 79 73 20 20 28 6c 65 6e  . (numkeys  (len
8c00: 67 74 68 20 6b 65 79 70 61 74 74 2d 61 6c 69 73  gth keypatt-alis
8c10: 74 29 29 0a 09 20 28 74 65 73 74 2d 69 64 73 20  t)).. (test-ids 
8c20: 27 28 29 29 0a 09 20 28 77 69 6e 64 6f 77 73 20  '()).. (windows 
8c30: 20 28 61 6e 64 20 70 61 74 68 6d 6f 64 20 28 73   (and pathmod (s
8c40: 75 62 73 74 72 69 6e 67 2d 69 6e 64 65 78 20 22  ubstring-index "
8c50: 5c 5c 22 20 70 61 74 68 6d 6f 64 29 29 29 0a 09  \\" pathmod)))..
8c60: 20 28 74 65 6d 70 64 69 72 20 20 28 63 6f 6e 63   (tempdir  (conc
8c70: 20 22 2f 74 6d 70 2f 22 20 28 63 75 72 72 65 6e   "/tmp/" (curren
8c80: 74 2d 75 73 65 72 2d 6e 61 6d 65 29 20 22 2f 22  t-user-name) "/"
8c90: 20 72 75 6e 73 70 61 74 74 20 22 5f 22 20 28 72   runspatt "_" (r
8ca0: 61 6e 64 6f 6d 20 31 30 30 30 30 29 20 22 5f 22  andom 10000) "_"
8cb0: 20 28 63 75 72 72 65 6e 74 2d 70 72 6f 63 65 73   (current-proces
8cc0: 73 2d 69 64 29 29 29 0a 09 20 28 72 75 6e 73 68  s-id))).. (runsh
8cd0: 65 61 64 65 72 20 28 61 70 70 65 6e 64 20 28 6c  eader (append (l
8ce0: 69 73 74 20 22 52 75 6e 20 49 64 22 20 22 52 75  ist "Run Id" "Ru
8cf0: 6e 6e 61 6d 65 22 29 20 3b 20 30 20 31 0a 09 09  nname") ; 0 1...
8d00: 09 20 20 20 20 20 28 6d 61 70 20 63 61 72 20 6b  .     (map car k
8d10: 65 79 70 61 74 74 2d 61 6c 69 73 74 29 20 20 20  eypatt-alist)   
8d20: 3b 20 2b 20 4e 20 3d 20 6c 65 6e 67 74 68 20 6b  ; + N = length k
8d30: 65 79 70 61 74 74 2d 61 6c 69 73 74 0a 09 09 09  eypatt-alist....
8d40: 20 20 20 20 20 28 6c 69 73 74 20 22 54 65 73 74       (list "Test
8d50: 6e 61 6d 65 22 20 20 20 20 20 20 20 20 20 20 3b  name"          ;
8d60: 20 32 0a 09 09 09 09 20 20 20 22 49 74 65 6d 20   2.....   "Item 
8d70: 50 61 74 68 22 20 20 20 20 20 20 20 20 20 3b 20  Path"         ; 
8d80: 33 20 0a 09 09 09 09 20 20 20 22 44 65 73 63 72  3 .....   "Descr
8d90: 69 70 74 69 6f 6e 22 20 20 20 20 20 20 20 3b 20  iption"       ; 
8da0: 34 20 0a 09 09 09 09 20 20 20 22 53 74 61 74 65  4 .....   "State
8db0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 20  "             ; 
8dc0: 35 20 0a 09 09 09 09 20 20 20 22 53 74 61 74 75  5 .....   "Statu
8dd0: 73 22 20 20 20 20 20 20 20 20 20 20 20 20 3b 20  s"            ; 
8de0: 36 20 20 0a 09 09 09 09 20 20 20 22 46 69 6e 61  6  .....   "Fina
8df0: 6c 20 4c 6f 67 22 20 20 20 20 20 20 20 20 20 3b  l Log"         ;
8e00: 20 37 20 0a 09 09 09 09 20 20 20 22 52 75 6e 20   7 .....   "Run 
8e10: 44 75 72 61 74 69 6f 6e 22 20 20 20 20 20 20 3b  Duration"      ;
8e20: 20 38 20 0a 09 09 09 09 20 20 20 22 57 68 65 6e   8 .....   "When
8e30: 20 52 75 6e 22 20 20 20 20 20 20 20 20 20 20 3b   Run"          ;
8e40: 20 39 20 0a 09 09 09 09 20 20 20 22 54 61 67 73   9 .....   "Tags
8e50: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3b  "              ;
8e60: 20 31 30 0a 09 09 09 09 20 20 20 22 52 75 6e 20   10.....   "Run 
8e70: 4f 77 6e 65 72 22 20 20 20 20 20 20 20 20 20 3b  Owner"         ;
8e80: 20 31 31 0a 09 09 09 09 20 20 20 22 43 6f 6d 6d   11.....   "Comm
8e90: 65 6e 74 22 20 20 20 20 20 20 20 20 20 20 20 3b  ent"           ;
8ea0: 20 31 32 0a 09 09 09 09 20 20 20 22 41 75 74 68   12.....   "Auth
8eb0: 6f 72 22 20 20 20 20 20 20 20 20 20 20 20 20 3b  or"            ;
8ec0: 20 31 33 0a 09 09 09 09 20 20 20 22 54 65 73 74   13.....   "Test
8ed0: 20 4f 77 6e 65 72 22 20 20 20 20 20 20 20 20 3b   Owner"        ;
8ee0: 20 31 34 0a 09 09 09 09 20 20 20 22 52 65 76 69   14.....   "Revi
8ef0: 65 77 65 64 22 20 20 20 20 20 20 20 20 20 20 3b  ewed"          ;
8f00: 20 31 35 0a 09 09 09 09 20 20 20 22 44 69 73 6b   15.....   "Disk
8f10: 66 72 65 65 22 20 20 20 20 20 20 20 20 20 20 3b  free"          ;
8f20: 20 31 36 0a 09 09 09 09 20 20 20 22 55 6e 61 6d   16.....   "Unam
8f30: 65 22 20 20 20 20 20 20 20 20 20 20 20 20 20 3b  e"             ;
8f40: 20 31 37 0a 09 09 09 09 20 20 20 22 52 75 6e 64   17.....   "Rund
8f50: 69 72 22 20 20 20 20 20 20 20 20 20 20 20 20 3b  ir"            ;
8f60: 20 31 38 0a 09 09 09 09 20 20 20 22 48 6f 73 74   18.....   "Host
8f70: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3b  "              ;
8f80: 20 31 39 0a 09 09 09 09 20 20 20 22 43 70 75 20   19.....   "Cpu 
8f90: 4c 6f 61 64 22 20 20 20 20 20 20 20 20 20 20 3b  Load"          ;
8fa0: 20 32 30 0a 09 09 09 09 20 20 20 29 29 29 0a 09   20.....   )))..
8fb0: 20 28 72 65 73 75 6c 74 73 20 28 6c 69 73 74 20   (results (list 
8fc0: 72 75 6e 73 68 65 61 64 65 72 29 29 09 09 09 20  runsheader))... 
8fd0: 0a 09 20 28 74 65 73 74 64 61 74 61 2d 68 65 61  .. (testdata-hea
8fe0: 64 65 72 20 28 6c 69 73 74 20 22 52 75 6e 20 49  der (list "Run I
8ff0: 64 22 20 22 54 65 73 74 6e 61 6d 65 22 20 22 49  d" "Testname" "I
9000: 74 65 6d 20 50 61 74 68 22 20 22 43 61 74 65 67  tem Path" "Categ
9010: 6f 72 79 22 20 22 56 61 72 69 61 62 6c 65 22 20  ory" "Variable" 
9020: 22 56 61 6c 75 65 22 20 22 45 78 70 65 63 74 65  "Value" "Expecte
9030: 64 22 20 22 54 6f 6c 22 20 22 55 6e 69 74 73 22  d" "Tol" "Units"
9040: 20 22 53 74 61 74 75 73 22 20 22 43 6f 6d 6d 65   "Status" "Comme
9050: 6e 74 22 29 29 0a 09 20 28 6d 61 69 6e 71 72 79  nt")).. (mainqry
9060: 20 28 63 6f 6e 63 20 22 53 45 4c 45 43 54 0a 20   (conc "SELECT. 
9070: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 2e 74               t.t
9080: 65 73 74 6e 61 6d 65 2c 72 2e 69 64 2c 72 75 6e  estname,r.id,run
9090: 6e 61 6d 65 2c 22 20 6b 65 79 73 73 74 72 20 22  name," keysstr "
90a0: 2c 74 2e 74 65 73 74 6e 61 6d 65 2c 0a 20 20 20  ,t.testname,.   
90b0: 20 20 20 20 20 20 20 20 20 20 20 74 2e 69 74 65             t.ite
90c0: 6d 5f 70 61 74 68 2c 74 6d 2e 64 65 73 63 72 69  m_path,tm.descri
90d0: 70 74 69 6f 6e 2c 74 2e 73 74 61 74 65 2c 74 2e  ption,t.state,t.
90e0: 73 74 61 74 75 73 2c 0a 20 20 20 20 20 20 20 20  status,.        
90f0: 20 20 20 20 20 20 66 69 6e 61 6c 5f 6c 6f 67 66        final_logf
9100: 2c 72 75 6e 5f 64 75 72 61 74 69 6f 6e 2c 20 0a  ,run_duration, .
9110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
9120: 72 66 74 69 6d 65 28 27 25 6d 2f 25 64 2f 25 59  rftime('%m/%d/%Y
9130: 20 25 48 3a 25 4d 3a 25 53 27 2c 64 61 74 65 74   %H:%M:%S',datet
9140: 69 6d 65 28 74 2e 65 76 65 6e 74 5f 74 69 6d 65  ime(t.event_time
9150: 2c 27 75 6e 69 78 65 70 6f 63 68 27 29 2c 27 6c  ,'unixepoch'),'l
9160: 6f 63 61 6c 74 69 6d 65 27 29 2c 0a 20 20 20 20  ocaltime'),.    
9170: 20 20 20 20 20 20 20 20 20 20 74 6d 2e 74 61 67            tm.tag
9180: 73 2c 72 2e 6f 77 6e 65 72 2c 74 2e 63 6f 6d 6d  s,r.owner,t.comm
9190: 65 6e 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ent,.           
91a0: 20 20 20 61 75 74 68 6f 72 2c 0a 20 20 20 20 20     author,.     
91b0: 20 20 20 20 20 20 20 20 20 74 6d 2e 6f 77 6e 65           tm.owne
91c0: 72 2c 72 65 76 69 65 77 65 64 2c 0a 20 20 20 20  r,reviewed,.    
91d0: 20 20 20 20 20 20 20 20 20 20 64 69 73 6b 66 72            diskfr
91e0: 65 65 2c 75 6e 61 6d 65 2c 72 75 6e 64 69 72 2c  ee,uname,rundir,
91f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68  .              h
9200: 6f 73 74 2c 63 70 75 6c 6f 61 64 0a 20 20 20 20  ost,cpuload.    
9210: 20 20 20 20 20 20 20 20 46 52 4f 4d 20 74 65 73          FROM tes
9220: 74 73 20 41 53 20 74 20 4a 4f 49 4e 20 72 75 6e  ts AS t JOIN run
9230: 73 20 41 53 20 72 20 4f 4e 20 74 2e 72 75 6e 5f  s AS r ON t.run_
9240: 69 64 3d 72 2e 69 64 20 4a 4f 49 4e 20 74 65 73  id=r.id JOIN tes
9250: 74 5f 6d 65 74 61 20 41 53 20 74 6d 20 4f 4e 20  t_meta AS tm ON 
9260: 74 6d 2e 74 65 73 74 6e 61 6d 65 3d 74 2e 74 65  tm.testname=t.te
9270: 73 74 6e 61 6d 65 0a 20 20 20 20 20 20 20 20 20  stname.         
9280: 20 20 20 57 48 45 52 45 20 72 75 6e 6e 61 6d 65     WHERE runname
9290: 20 4c 49 4b 45 20 3f 20 41 4e 44 20 22 20 6b 65   LIKE ? AND " ke
92a0: 79 71 72 79 20 22 3b 22 29 29 29 0a 20 20 20 20  yqry ";"))).    
92b0: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 32 20 22  (debug:print 2 "
92c0: 55 73 69 6e 67 20 22 20 74 65 6d 70 64 69 72 20  Using " tempdir 
92d0: 22 20 66 6f 72 20 63 6f 6e 73 74 72 75 63 74 69  " for constructi
92e0: 6e 67 20 74 68 65 20 6f 64 73 20 66 69 6c 65 2e  ng the ods file.
92f0: 20 6b 65 79 71 72 79 3a 20 22 20 6b 65 79 71 72   keyqry: " keyqr
9300: 79 20 22 20 6b 65 79 73 74 72 3a 20 22 20 6b 65  y " keystr: " ke
9310: 79 73 73 74 72 20 22 20 77 69 74 68 20 6b 65 79  ysstr " with key
9320: 73 3a 20 22 20 28 6d 61 70 20 63 61 64 72 20 6b  s: " (map cadr k
9330: 65 79 70 61 74 74 2d 61 6c 69 73 74 29 0a 09 09  eypatt-alist)...
9340: 20 22 5c 6e 20 20 20 20 20 20 6d 61 69 6e 71 72   "\n      mainqr
9350: 79 3a 20 22 20 6d 61 69 6e 71 72 79 29 0a 20 20  y: " mainqry).  
9360: 20 20 3b 3b 20 22 45 78 70 65 63 74 65 64 20 56    ;; "Expected V
9370: 61 6c 75 65 22 0a 20 20 20 20 3b 3b 20 22 56 61  alue".    ;; "Va
9380: 6c 75 65 20 46 6f 75 6e 64 22 0a 20 20 20 20 3b  lue Found".    ;
9390: 3b 20 22 54 6f 6c 65 72 61 6e 63 65 22 0a 20 20  ; "Tolerance".  
93a0: 20 20 28 61 70 70 6c 79 20 73 71 6c 69 74 65 33    (apply sqlite3
93b0: 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 09 20  :for-each-row.. 
93c0: 20 20 28 6c 61 6d 62 64 61 20 28 74 65 73 74 2d    (lambda (test-
93d0: 69 64 20 2e 20 62 29 0a 09 20 20 20 20 20 28 73  id . b)..     (s
93e0: 65 74 21 20 74 65 73 74 2d 69 64 73 20 28 63 6f  et! test-ids (co
93f0: 6e 73 20 74 65 73 74 2d 69 64 20 74 65 73 74 2d  ns test-id test-
9400: 69 64 73 29 29 20 20 20 3b 3b 20 74 65 73 74 2d  ids))   ;; test-
9410: 69 64 20 69 73 20 6e 6f 77 20 74 65 73 74 6e 61  id is now testna
9420: 6d 65 0a 09 20 20 20 20 20 28 73 65 74 21 20 72  me..     (set! r
9430: 65 73 75 6c 74 73 20 28 61 70 70 65 6e 64 20 72  esults (append r
9440: 65 73 75 6c 74 73 20 3b 3b 20 6e 6f 74 65 2c 20  esults ;; note, 
9450: 64 72 6f 70 20 74 68 65 20 74 65 73 74 2d 69 64  drop the test-id
9460: 0a 09 09 09 09 20 20 20 28 6c 69 73 74 0a 09 09  .....   (list...
9470: 09 09 20 20 20 20 28 69 66 20 70 61 74 68 6d 6f  ..    (if pathmo
9480: 64 0a 09 09 09 09 09 28 6c 65 74 2a 20 28 28 76  d......(let* ((v
9490: 62 20 20 20 20 20 20 20 20 28 61 70 70 6c 79 20  b        (apply 
94a0: 76 65 63 74 6f 72 20 62 29 29 0a 09 09 09 09 09  vector b))......
94b0: 20 20 20 20 20 20 20 28 6b 65 79 76 61 6c 73 20         (keyvals 
94c0: 20 20 28 6c 65 74 20 6c 6f 6f 70 20 28 28 69 20    (let loop ((i 
94d0: 20 20 20 30 29 0a 09 09 09 09 09 09 09 09 20 20     0).........  
94e0: 20 20 20 28 72 65 73 20 27 28 29 29 29 0a 09 09     (res '()))...
94f0: 09 09 09 09 09 20 20 20 20 28 69 66 20 28 3e 3d  .....    (if (>=
9500: 20 69 20 6e 75 6d 6b 65 79 73 29 0a 09 09 09 09   i numkeys).....
9510: 09 09 09 09 72 65 73 0a 09 09 09 09 09 09 09 09  ....res.........
9520: 28 6c 6f 6f 70 20 28 2b 20 69 20 31 29 0a 09 09  (loop (+ i 1)...
9530: 09 09 09 09 09 09 20 20 20 20 20 20 28 61 70 70  ......      (app
9540: 65 6e 64 20 72 65 73 20 28 6c 69 73 74 20 28 76  end res (list (v
9550: 65 63 74 6f 72 2d 72 65 66 20 76 62 20 28 2b 20  ector-ref vb (+ 
9560: 69 20 32 29 29 29 29 29 29 29 29 0a 09 09 09 09  i 2)))))))).....
9570: 09 20 20 20 20 20 20 20 28 72 75 6e 6e 61 6d 65  .       (runname
9580: 20 20 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76     (vector-ref v
9590: 62 20 31 29 29 0a 09 09 09 09 09 20 20 20 20 20  b 1))......     
95a0: 20 20 28 74 65 73 74 6e 61 6d 65 20 20 28 76 65    (testname  (ve
95b0: 63 74 6f 72 2d 72 65 66 20 76 62 20 28 2b 20 20  ctor-ref vb (+  
95c0: 32 20 6e 75 6d 6b 65 79 73 29 29 29 0a 09 09 09  2 numkeys)))....
95d0: 09 09 20 20 20 20 20 20 20 28 69 74 65 6d 2d 70  ..       (item-p
95e0: 61 74 68 20 28 76 65 63 74 6f 72 2d 72 65 66 20  ath (vector-ref 
95f0: 76 62 20 28 2b 20 20 33 20 6e 75 6d 6b 65 79 73  vb (+  3 numkeys
9600: 29 29 29 0a 09 09 09 09 09 20 20 20 20 20 20 20  )))......       
9610: 28 66 69 6e 61 6c 2d 6c 6f 67 20 28 76 65 63 74  (final-log (vect
9620: 6f 72 2d 72 65 66 20 76 62 20 28 2b 20 20 37 20  or-ref vb (+  7 
9630: 6e 75 6d 6b 65 79 73 29 29 29 0a 09 09 09 09 09  numkeys)))......
9640: 20 20 20 20 20 20 20 28 72 75 6e 2d 64 69 72 20         (run-dir 
9650: 20 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62    (vector-ref vb
9660: 20 28 2b 20 31 38 20 6e 75 6d 6b 65 79 73 29 29   (+ 18 numkeys))
9670: 29 0a 09 09 09 09 09 20 20 20 20 20 20 20 28 6c  )......       (l
9680: 6f 67 2d 66 70 61 74 68 20 28 63 6f 6e 63 20 72  og-fpath (conc r
9690: 75 6e 2d 64 69 72 20 22 2f 22 20 20 66 69 6e 61  un-dir "/"  fina
96a0: 6c 2d 6c 6f 67 29 29 29 20 3b 3b 20 28 73 74 72  l-log))) ;; (str
96b0: 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20  ing-intersperse 
96c0: 6b 65 79 76 61 6c 73 20 22 2f 22 29 20 22 2f 22  keyvals "/") "/"
96d0: 20 74 65 73 74 6e 61 6d 65 20 22 2f 22 20 69 74   testname "/" it
96e0: 65 6d 2d 70 61 74 68 20 22 2f 22 0a 09 09 09 09  em-path "/".....
96f0: 09 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20  .  (debug:print 
9700: 34 20 22 6c 6f 67 3a 20 22 20 6c 6f 67 2d 66 70  4 "log: " log-fp
9710: 61 74 68 20 22 20 65 78 69 73 74 73 3a 20 22 20  ath " exists: " 
9720: 28 66 69 6c 65 2d 65 78 69 73 74 73 3f 20 6c 6f  (file-exists? lo
9730: 67 2d 66 70 61 74 68 29 29 0a 09 09 09 09 09 20  g-fpath))...... 
9740: 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 76 62   (vector-set! vb
9750: 20 28 2b 20 37 20 6e 75 6d 6b 65 79 73 29 20 28   (+ 7 numkeys) (
9760: 69 66 20 28 66 69 6c 65 2d 65 78 69 73 74 73 3f  if (file-exists?
9770: 20 6c 6f 67 2d 66 70 61 74 68 29 0a 09 09 09 09   log-fpath).....
9780: 09 09 09 09 09 20 20 20 20 28 6c 65 74 20 28 28  .....    (let ((
9790: 6e 65 77 70 61 74 68 20 28 63 6f 6e 63 20 70 61  newpath (conc pa
97a0: 74 68 6d 6f 64 20 22 2f 22 0a 09 09 09 09 09 09  thmod "/".......
97b0: 09 09 09 09 09 09 20 28 73 74 72 69 6e 67 2d 69  ...... (string-i
97c0: 6e 74 65 72 73 70 65 72 73 65 20 6b 65 79 76 61  ntersperse keyva
97d0: 6c 73 20 22 2f 22 29 0a 09 09 09 09 09 09 09 09  ls "/").........
97e0: 09 09 09 09 20 22 2f 22 20 72 75 6e 6e 61 6d 65  .... "/" runname
97f0: 20 22 2f 22 20 74 65 73 74 6e 61 6d 65 20 22 2f   "/" testname "/
9800: 22 0a 09 09 09 09 09 09 09 09 09 09 09 09 20 28  "............. (
9810: 69 66 20 28 73 74 72 69 6e 67 3d 3f 20 69 74 65  if (string=? ite
9820: 6d 2d 70 61 74 68 20 22 22 29 20 22 22 20 28 63  m-path "") "" (c
9830: 6f 6e 63 20 22 2f 22 20 69 74 65 6d 2d 70 61 74  onc "/" item-pat
9840: 68 29 29 0a 09 09 09 09 09 09 09 09 09 09 09 09  h)).............
9850: 20 66 69 6e 61 6c 2d 6c 6f 67 29 29 29 0a 09 09   final-log)))...
9860: 09 09 09 09 09 09 09 20 20 20 20 20 20 3b 3b 20  .......      ;; 
9870: 66 6f 72 20 6e 6f 77 20 74 68 72 6f 77 20 61 77  for now throw aw
9880: 61 79 20 6e 65 77 70 61 74 68 20 61 6e 64 20 75  ay newpath and u
9890: 73 65 20 74 68 65 20 6c 6f 67 2d 66 70 61 74 68  se the log-fpath
98a0: 20 63 6f 6e 63 27 64 20 77 69 74 68 20 70 61 74   conc'd with pat
98b0: 68 6d 6f 64 0a 09 09 09 09 09 09 09 09 09 20 20  hmod..........  
98c0: 20 20 20 20 28 73 65 74 21 20 6e 65 77 70 61 74      (set! newpat
98d0: 68 20 28 63 6f 6e 63 20 70 61 74 68 6d 6f 64 20  h (conc pathmod 
98e0: 6c 6f 67 2d 66 70 61 74 68 29 29 0a 09 09 09 09  log-fpath)).....
98f0: 09 09 09 09 09 20 20 20 20 20 20 28 69 66 20 77  .....      (if w
9900: 69 6e 64 6f 77 73 20 28 73 74 72 69 6e 67 2d 74  indows (string-t
9910: 72 61 6e 73 6c 61 74 65 20 6e 65 77 70 61 74 68  ranslate newpath
9920: 20 22 2f 22 20 22 5c 5c 22 29 20 6e 65 77 70 61   "/" "\\") newpa
9930: 74 68 29 29 0a 09 09 09 09 09 09 09 09 09 20 20  th))..........  
9940: 20 20 28 69 66 20 28 3e 20 2a 76 65 72 62 6f 73    (if (> *verbos
9950: 69 74 79 2a 20 31 29 0a 09 09 09 09 09 09 09 09  ity* 1).........
9960: 09 09 28 63 6f 6e 63 20 66 69 6e 61 6c 2d 6c 6f  ..(conc final-lo
9970: 67 20 22 20 6e 6f 74 2d 66 6f 75 6e 64 22 29 0a  g " not-found").
9980: 09 09 09 09 09 09 09 09 09 09 22 22 29 29 29 0a  ..........""))).
9990: 09 09 09 09 09 20 20 28 76 65 63 74 6f 72 2d 3e  .....  (vector->
99a0: 6c 69 73 74 20 76 62 29 29 0a 09 09 09 09 09 62  list vb))......b
99b0: 29 29 29 29 29 0a 09 20 20 20 64 62 0a 09 20 20  )))))..   db..  
99c0: 20 6d 61 69 6e 71 72 79 0a 09 20 20 20 72 75 6e   mainqry..   run
99d0: 73 70 61 74 74 20 28 6d 61 70 20 63 61 64 72 20  spatt (map cadr 
99e0: 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 29 29 0a  keypatt-alist)).
99f0: 20 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74      (debug:print
9a00: 20 32 20 22 46 6f 75 6e 64 20 22 20 28 6c 65 6e   2 "Found " (len
9a10: 67 74 68 20 74 65 73 74 2d 69 64 73 29 20 22 20  gth test-ids) " 
9a20: 72 65 63 6f 72 64 73 22 29 0a 20 20 20 20 28 73  records").    (s
9a30: 65 74 21 20 72 65 73 75 6c 74 73 20 28 6c 69 73  et! results (lis
9a40: 74 20 28 63 6f 6e 73 20 22 52 75 6e 73 22 20 72  t (cons "Runs" r
9a50: 65 73 75 6c 74 73 29 29 29 0a 20 20 20 20 3b 3b  esults))).    ;;
9a60: 20 6e 6f 77 2c 20 66 6f 72 20 65 61 63 68 20 74   now, for each t
9a70: 65 73 74 2c 20 63 6f 6c 6c 65 63 74 20 74 68 65  est, collect the
9a80: 20 74 65 73 74 5f 64 61 74 61 20 69 6e 66 6f 20   test_data info 
9a90: 61 6e 64 20 61 64 64 20 61 20 6e 65 77 20 73 68  and add a new sh
9aa0: 65 65 74 0a 20 20 20 20 28 66 6f 72 2d 65 61 63  eet.    (for-eac
9ab0: 68 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28  h.     (lambda (
9ac0: 74 65 73 74 2d 69 64 29 0a 20 20 20 20 20 20 20  test-id).       
9ad0: 28 6c 65 74 20 28 28 74 65 73 74 2d 64 61 74 61  (let ((test-data
9ae0: 20 28 6c 69 73 74 20 74 65 73 74 64 61 74 61 2d   (list testdata-
9af0: 68 65 61 64 65 72 29 29 0a 09 20 20 20 20 20 28  header))..     (
9b00: 63 75 72 72 2d 74 65 73 74 2d 6e 61 6d 65 20 23  curr-test-name #
9b10: 66 29 29 0a 09 20 28 73 71 6c 69 74 65 33 3a 66  f)).. (sqlite3:f
9b20: 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 09 20 20 28  or-each-row..  (
9b30: 6c 61 6d 62 64 61 20 28 72 75 6e 2d 69 64 20 74  lambda (run-id t
9b40: 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74  estname item-pat
9b50: 68 20 63 61 74 65 67 6f 72 79 20 76 61 72 69 61  h category varia
9b60: 62 6c 65 20 76 61 6c 75 65 20 65 78 70 65 63 74  ble value expect
9b70: 65 64 20 74 6f 6c 20 75 6e 69 74 73 20 73 74 61  ed tol units sta
9b80: 74 75 73 20 63 6f 6d 6d 65 6e 74 29 0a 09 20 20  tus comment)..  
9b90: 20 20 28 73 65 74 21 20 63 75 72 72 2d 74 65 73    (set! curr-tes
9ba0: 74 2d 6e 61 6d 65 20 74 65 73 74 6e 61 6d 65 29  t-name testname)
9bb0: 0a 09 20 20 20 20 28 73 65 74 21 20 74 65 73 74  ..    (set! test
9bc0: 2d 64 61 74 61 20 28 61 70 70 65 6e 64 20 74 65  -data (append te
9bd0: 73 74 2d 64 61 74 61 20 28 6c 69 73 74 20 28 6c  st-data (list (l
9be0: 69 73 74 20 72 75 6e 2d 69 64 20 74 65 73 74 6e  ist run-id testn
9bf0: 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 63 61  ame item-path ca
9c00: 74 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65 20  tegory variable 
9c10: 76 61 6c 75 65 20 65 78 70 65 63 74 65 64 20 74  value expected t
9c20: 6f 6c 20 75 6e 69 74 73 20 73 74 61 74 75 73 20  ol units status 
9c30: 63 6f 6d 6d 65 6e 74 29 29 29 29 29 0a 09 20 20  comment)))))..  
9c40: 64 62 20 0a 09 20 20 3b 3b 20 22 53 45 4c 45 43  db ..  ;; "SELEC
9c50: 54 20 72 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d  T run_id,testnam
9c60: 65 2c 69 74 65 6d 5f 70 61 74 68 2c 63 61 74 65  e,item_path,cate
9c70: 67 6f 72 79 2c 76 61 72 69 61 62 6c 65 2c 74 64  gory,variable,td
9c80: 2e 76 61 6c 75 65 20 41 53 20 76 61 6c 75 65 2c  .value AS value,
9c90: 65 78 70 65 63 74 65 64 2c 74 6f 6c 2c 75 6e 69  expected,tol,uni
9ca0: 74 73 2c 74 64 2e 73 74 61 74 75 73 20 41 53 20  ts,td.status AS 
9cb0: 73 74 61 74 75 73 2c 74 64 2e 63 6f 6d 6d 65 6e  status,td.commen
9cc0: 74 20 41 53 20 63 6f 6d 6d 65 6e 74 20 46 52 4f  t AS comment FRO
9cd0: 4d 20 74 65 73 74 5f 64 61 74 61 20 41 53 20 74  M test_data AS t
9ce0: 64 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 74 65 73  d INNER JOIN tes
9cf0: 74 73 20 4f 4e 20 74 65 73 74 73 2e 69 64 3d 74  ts ON tests.id=t
9d00: 64 2e 74 65 73 74 5f 69 64 20 57 48 45 52 45 20  d.test_id WHERE 
9d10: 74 65 73 74 5f 69 64 3d 3f 3b 22 0a 09 20 20 22  test_id=?;"..  "
9d20: 53 45 4c 45 43 54 20 72 75 6e 5f 69 64 2c 74 65  SELECT run_id,te
9d30: 73 74 6e 61 6d 65 2c 69 74 65 6d 5f 70 61 74 68  stname,item_path
9d40: 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62  ,category,variab
9d50: 6c 65 2c 74 64 2e 76 61 6c 75 65 20 41 53 20 76  le,td.value AS v
9d60: 61 6c 75 65 2c 74 64 2e 65 78 70 65 63 74 65 64  alue,td.expected
9d70: 2c 74 64 2e 74 6f 6c 2c 74 64 2e 75 6e 69 74 73  ,td.tol,td.units
9d80: 2c 74 64 2e 73 74 61 74 75 73 20 41 53 20 73 74  ,td.status AS st
9d90: 61 74 75 73 2c 74 64 2e 63 6f 6d 6d 65 6e 74 20  atus,td.comment 
9da0: 41 53 20 63 6f 6d 6d 65 6e 74 20 46 52 4f 4d 20  AS comment FROM 
9db0: 74 65 73 74 5f 64 61 74 61 20 41 53 20 74 64 20  test_data AS td 
9dc0: 49 4e 4e 45 52 20 4a 4f 49 4e 20 74 65 73 74 73  INNER JOIN tests
9dd0: 20 4f 4e 20 74 65 73 74 73 2e 69 64 3d 74 64 2e   ON tests.id=td.
9de0: 74 65 73 74 5f 69 64 20 57 48 45 52 45 20 74 65  test_id WHERE te
9df0: 73 74 6e 61 6d 65 3d 3f 3b 22 0a 09 20 20 74 65  stname=?;"..  te
9e00: 73 74 2d 69 64 29 0a 09 20 28 69 66 20 63 75 72  st-id).. (if cur
9e10: 72 2d 74 65 73 74 2d 6e 61 6d 65 0a 09 20 20 20  r-test-name..   
9e20: 20 20 28 73 65 74 21 20 72 65 73 75 6c 74 73 20    (set! results 
9e30: 28 61 70 70 65 6e 64 20 72 65 73 75 6c 74 73 20  (append results 
9e40: 28 6c 69 73 74 20 28 63 6f 6e 73 20 63 75 72 72  (list (cons curr
9e50: 2d 74 65 73 74 2d 6e 61 6d 65 20 74 65 73 74 2d  -test-name test-
9e60: 64 61 74 61 29 29 29 29 29 0a 09 20 29 29 0a 20  data))))).. )). 
9e70: 20 20 20 20 28 73 6f 72 74 20 28 64 65 6c 65 74      (sort (delet
9e80: 65 2d 64 75 70 6c 69 63 61 74 65 73 20 74 65 73  e-duplicates tes
9e90: 74 2d 69 64 73 29 20 73 74 72 69 6e 67 3c 3d 29  t-ids) string<=)
9ea0: 29 0a 20 20 20 20 28 73 79 73 74 65 6d 20 28 63  ).    (system (c
9eb0: 6f 6e 63 20 22 6d 6b 64 69 72 20 2d 70 20 22 20  onc "mkdir -p " 
9ec0: 74 65 6d 70 64 69 72 29 29 0a 20 20 20 20 3b 3b  tempdir)).    ;;
9ed0: 20 28 70 70 20 72 65 73 75 6c 74 73 29 0a 20 20   (pp results).  
9ee0: 20 20 28 6f 64 73 3a 6c 69 73 74 2d 3e 6f 64 73    (ods:list->ods
9ef0: 20 0a 20 20 20 20 20 74 65 6d 70 64 69 72 0a 20   .     tempdir. 
9f00: 20 20 20 20 28 69 66 20 28 73 74 72 69 6e 67 2d      (if (string-
9f10: 6d 61 74 63 68 20 28 72 65 67 65 78 70 20 22 5e  match (regexp "^
9f20: 5b 2f 7e 5d 2b 2e 2a 22 29 20 6f 75 74 70 75 74  [/~]+.*") output
9f30: 66 69 6c 65 29 20 3b 3b 20 66 75 6c 6c 20 70 61  file) ;; full pa
9f40: 74 68 3f 0a 09 20 6f 75 74 70 75 74 66 69 6c 65  th?.. outputfile
9f50: 0a 09 20 28 62 65 67 69 6e 0a 09 20 20 20 28 64  .. (begin..   (d
9f60: 65 62 75 67 3a 70 72 69 6e 74 20 30 20 22 57 41  ebug:print 0 "WA
9f70: 52 4e 49 4e 47 3a 20 70 61 74 68 20 67 69 76 65  RNING: path give
9f80: 6e 2c 20 22 20 6f 75 74 70 75 74 66 69 6c 65 20  n, " outputfile 
9f90: 22 20 69 73 20 72 65 6c 61 74 69 76 65 2c 20 70  " is relative, p
9fa0: 72 65 66 69 78 69 6e 67 20 77 69 74 68 20 63 75  refixing with cu
9fb0: 72 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 22  rrent directory"
9fc0: 29 0a 09 20 20 20 28 63 6f 6e 63 20 28 63 75 72  )..   (conc (cur
9fd0: 72 65 6e 74 2d 64 69 72 65 63 74 6f 72 79 29 20  rent-directory) 
9fe0: 22 2f 22 20 6f 75 74 70 75 74 66 69 6c 65 29 29  "/" outputfile))
9ff0: 29 0a 20 20 20 20 20 72 65 73 75 6c 74 73 29 0a  ).     results).
a000: 20 20 20 20 3b 3b 20 62 72 75 74 61 6c 20 63 6c      ;; brutal cl
a010: 65 61 6e 20 75 70 0a 20 20 20 20 28 73 79 73 74  ean up.    (syst
a020: 65 6d 20 22 72 6d 20 2d 72 66 20 74 65 6d 70 64  em "rm -rf tempd
a030: 69 72 22 29 29 29 0a 0a 3b 3b 20 28 64 62 3a 65  ir")))..;; (db:e
a040: 78 74 72 61 63 74 2d 6f 64 73 2d 66 69 6c 65 20  xtract-ods-file 
a050: 64 62 20 22 6f 75 74 70 75 74 66 69 6c 65 2e 6f  db "outputfile.o
a060: 64 73 22 20 27 28 28 22 73 79 73 6e 61 6d 65 22  ds" '(("sysname"
a070: 20 22 25 22 29 28 22 66 73 6e 61 6d 65 22 20 22   "%")("fsname" "
a080: 25 22 29 28 22 64 61 74 61 70 61 74 68 22 20 22  %")("datapath" "
a090: 25 22 29 29 20 22 25 22 29 0a                    %")) "%").