Megatest

Hex Artifact Content
Login

Artifact a288398d2ab1f3a07ddf95d1e01c5f865bfc5240:


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 20 28 6c 69 73 74 20 22 72  ...     (list "r
0640: 75 6e 6e 61 6d 65 22 20 22 73 74 61 74 65 22 20  unname" "state" 
0650: 22 73 74 61 74 75 73 22 20 22 6f 77 6e 65 72 22  "status" "owner"
0660: 20 22 65 76 65 6e 74 5f 74 69 6d 65 22 20 22 63   "event_time" "c
0670: 6f 6d 6d 65 6e 74 22 20 22 66 61 69 6c 5f 63 6f  omment" "fail_co
0680: 75 6e 74 22 0a 09 09 09 09 09 20 20 20 22 70 61  unt"......   "pa
0690: 73 73 5f 63 6f 75 6e 74 22 29 29 0a 09 09 09 20  ss_count")).... 
06a0: 20 20 20 28 62 65 67 69 6e 0a 09 09 09 20 20 20     (begin....   
06b0: 20 20 20 28 70 72 69 6e 74 20 22 45 52 52 4f 52     (print "ERROR
06c0: 3a 20 79 6f 75 72 20 6b 65 79 20 63 61 6e 6e 6f  : your key canno
06d0: 74 20 62 65 20 6e 61 6d 65 64 20 22 20 6b 65 79  t be named " key
06e0: 6e 20 22 20 61 73 20 74 68 69 73 20 63 6f 6e 66  n " as this conf
06f0: 6c 69 63 74 73 20 77 69 74 68 20 74 68 65 20 73  licts with the s
0700: 61 6d 65 20 6e 61 6d 65 64 20 66 69 65 6c 64 20  ame named field 
0710: 69 6e 20 74 68 65 20 72 75 6e 73 20 74 61 62 6c  in the runs tabl
0720: 65 22 29 0a 09 09 09 20 20 20 20 20 20 28 73 79  e")....      (sy
0730: 73 74 65 6d 20 28 63 6f 6e 63 20 22 72 6d 20 2d  stem (conc "rm -
0740: 66 20 22 20 64 62 70 61 74 68 29 29 0a 09 09 09  f " dbpath))....
0750: 20 20 20 20 20 20 28 65 78 69 74 20 31 29 29 29        (exit 1)))
0760: 29 29 0a 09 09 20 20 20 20 6b 65 79 73 29 0a 09  ))...    keys)..
0770: 20 20 3b 3b 20 28 73 71 6c 69 74 65 33 3a 65 78    ;; (sqlite3:ex
0780: 65 63 75 74 65 20 64 62 20 22 50 52 41 47 4d 41  ecute db "PRAGMA
0790: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4f   synchronous = O
07a0: 46 46 3b 22 29 0a 09 20 20 28 73 71 6c 69 74 65  FF;")..  (sqlite
07b0: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 43 52  3:execute db "CR
07c0: 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f  EATE TABLE IF NO
07d0: 54 20 45 58 49 53 54 53 20 6b 65 79 73 20 28 69  T EXISTS keys (i
07e0: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  d INTEGER PRIMAR
07f0: 59 20 4b 45 59 2c 20 66 69 65 6c 64 6e 61 6d 65  Y KEY, fieldname
0800: 20 54 45 58 54 2c 20 66 69 65 6c 64 74 79 70 65   TEXT, fieldtype
0810: 20 54 45 58 54 2c 20 43 4f 4e 53 54 52 41 49 4e   TEXT, CONSTRAIN
0820: 54 20 6b 65 79 63 6f 6e 73 74 72 61 69 6e 74 20  T keyconstraint 
0830: 55 4e 49 51 55 45 20 28 66 69 65 6c 64 6e 61 6d  UNIQUE (fieldnam
0840: 65 29 29 3b 22 29 0a 09 20 20 28 66 6f 72 2d 65  e));")..  (for-e
0850: 61 63 68 20 28 6c 61 6d 62 64 61 20 28 6b 65 79  ach (lambda (key
0860: 29 0a 09 09 20 20 20 20 20 20 28 73 71 6c 69 74  )...      (sqlit
0870: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 49  e3:execute db "I
0880: 4e 53 45 52 54 20 49 4e 54 4f 20 6b 65 79 73 20  NSERT INTO keys 
0890: 28 66 69 65 6c 64 6e 61 6d 65 2c 66 69 65 6c 64  (fieldname,field
08a0: 74 79 70 65 29 20 56 41 4c 55 45 53 20 28 3f 2c  type) VALUES (?,
08b0: 3f 29 3b 22 20 28 6b 65 79 3a 67 65 74 2d 66 69  ?);" (key:get-fi
08c0: 65 6c 64 6e 61 6d 65 20 6b 65 79 29 28 6b 65 79  eldname key)(key
08d0: 3a 67 65 74 2d 66 69 65 6c 64 74 79 70 65 20 6b  :get-fieldtype k
08e0: 65 79 29 29 29 0a 09 09 20 20 20 20 6b 65 79 73  ey)))...    keys
08f0: 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65 78  )..  (sqlite3:ex
0900: 65 63 75 74 65 20 64 62 20 28 63 6f 6e 63 20 0a  ecute db (conc .
0910: 09 09 09 20 20 20 20 22 43 52 45 41 54 45 20 54  ...    "CREATE T
0920: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
0930: 54 53 20 72 75 6e 73 20 28 69 64 20 49 4e 54 45  TS runs (id INTE
0940: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
0950: 20 22 20 0a 09 09 09 20 20 20 20 66 69 65 6c 64   " ....    field
0960: 73 74 72 20 28 69 66 20 68 61 76 65 6b 65 79 73  str (if havekeys
0970: 20 22 2c 22 20 22 22 29 0a 09 09 09 20 20 20 20   "," "")....    
0980: 22 72 75 6e 6e 61 6d 65 20 54 45 58 54 2c 22 0a  "runname TEXT,".
0990: 09 09 09 20 20 20 20 22 73 74 61 74 65 20 54 45  ...    "state TE
09a0: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 22 0a  XT DEFAULT '',".
09b0: 09 09 09 20 20 20 20 22 73 74 61 74 75 73 20 54  ...    "status T
09c0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 22  EXT DEFAULT '',"
09d0: 0a 09 09 09 20 20 20 20 22 6f 77 6e 65 72 20 54  ....    "owner T
09e0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 22  EXT DEFAULT '',"
09f0: 0a 09 09 09 20 20 20 20 22 65 76 65 6e 74 5f 74  ....    "event_t
0a00: 69 6d 65 20 54 49 4d 45 53 54 41 4d 50 2c 22 0a  ime TIMESTAMP,".
0a10: 09 09 09 20 20 20 20 22 63 6f 6d 6d 65 6e 74 20  ...    "comment 
0a20: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c  TEXT DEFAULT '',
0a30: 22 0a 09 09 09 20 20 20 20 22 66 61 69 6c 5f 63  "....    "fail_c
0a40: 6f 75 6e 74 20 49 4e 54 45 47 45 52 20 44 45 46  ount INTEGER DEF
0a50: 41 55 4c 54 20 30 2c 22 0a 09 09 09 20 20 20 20  AULT 0,"....    
0a60: 22 70 61 73 73 5f 63 6f 75 6e 74 20 49 4e 54 45  "pass_count INTE
0a70: 47 45 52 20 44 45 46 41 55 4c 54 20 30 2c 22 0a  GER DEFAULT 0,".
0a80: 09 09 09 20 20 20 20 22 43 4f 4e 53 54 52 41 49  ...    "CONSTRAI
0a90: 4e 54 20 72 75 6e 73 63 6f 6e 73 74 72 61 69 6e  NT runsconstrain
0aa0: 74 20 55 4e 49 51 55 45 20 28 72 75 6e 6e 61 6d  t UNIQUE (runnam
0ab0: 65 22 20 28 69 66 20 68 61 76 65 6b 65 79 73 20  e" (if havekeys 
0ac0: 22 2c 22 20 22 22 29 20 6b 65 79 73 74 72 20 22  "," "") keystr "
0ad0: 29 29 3b 22 29 29 0a 09 20 20 28 73 71 6c 69 74  ));"))..  (sqlit
0ae0: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 28 63  e3:execute db (c
0af0: 6f 6e 63 20 22 43 52 45 41 54 45 20 49 4e 44 45  onc "CREATE INDE
0b00: 58 20 72 75 6e 73 5f 69 6e 64 65 78 20 4f 4e 20  X runs_index ON 
0b10: 72 75 6e 73 20 28 72 75 6e 6e 61 6d 65 22 20 28  runs (runname" (
0b20: 69 66 20 68 61 76 65 6b 65 79 73 20 22 2c 22 20  if havekeys "," 
0b30: 22 22 29 20 6b 65 79 73 74 72 20 22 29 3b 22 29  "") keystr ");")
0b40: 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65 78  )..  (sqlite3:ex
0b50: 65 63 75 74 65 20 64 62 20 0a 20 20 20 20 20 20  ecute db .      
0b60: 20 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41             "CREA
0b70: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  TE TABLE IF NOT 
0b80: 45 58 49 53 54 53 20 74 65 73 74 73 20 0a 20 20  EXISTS tests .  
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ba0: 20 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52    (id INTEGER PR
0bb0: 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20  IMARY KEY,.     
0bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bd0: 72 75 6e 5f 69 64 20 20 20 20 20 49 4e 54 45 47  run_id     INTEG
0be0: 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ER,.            
0bf0: 20 20 20 20 20 20 20 20 20 74 65 73 74 6e 61 6d           testnam
0c00: 65 20 20 20 54 45 58 54 2c 0a 20 20 20 20 20 20  e   TEXT,.      
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68                 h
0c20: 6f 73 74 20 20 20 20 20 20 20 54 45 58 54 20 44  ost       TEXT D
0c30: 45 46 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20 20  EFAULT 'n/a',.  
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c50: 20 20 20 63 70 75 6c 6f 61 64 20 20 20 20 52 45     cpuload    RE
0c60: 41 4c 20 44 45 46 41 55 4c 54 20 2d 31 2c 0a 20  AL DEFAULT -1,. 
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c80: 20 20 20 20 64 69 73 6b 66 72 65 65 20 20 20 49      diskfree   I
0c90: 4e 54 45 47 45 52 20 44 45 46 41 55 4c 54 20 2d  NTEGER DEFAULT -
0ca0: 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
0cb0: 20 20 20 20 20 20 20 20 75 6e 61 6d 65 20 20 20          uname   
0cc0: 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20     TEXT DEFAULT 
0cd0: 27 6e 2f 61 27 2c 20 0a 20 20 20 20 20 20 20 20  'n/a', .        
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 75 6e               run
0cf0: 64 69 72 20 20 20 20 20 54 45 58 54 20 44 45 46  dir     TEXT DEF
0d00: 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20 20 20 20  AULT 'n/a',.    
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d20: 20 73 68 6f 72 74 64 69 72 20 20 20 54 45 58 54   shortdir   TEXT
0d30: 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20   DEFAULT '',.   
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d50: 20 20 69 74 65 6d 5f 70 61 74 68 20 20 54 45 58    item_path  TEX
0d60: 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20  T DEFAULT '',.  
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d80: 20 20 20 73 74 61 74 65 20 20 20 20 20 20 54 45     state      TE
0d90: 58 54 20 44 45 46 41 55 4c 54 20 27 4e 4f 54 5f  XT DEFAULT 'NOT_
0da0: 53 54 41 52 54 45 44 27 2c 0a 20 20 20 20 20 20  STARTED',.      
0db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
0dc0: 74 61 74 75 73 20 20 20 20 20 54 45 58 54 20 44  tatus     TEXT D
0dd0: 45 46 41 55 4c 54 20 27 46 41 49 4c 27 2c 0a 20  EFAULT 'FAIL',. 
0de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0df0: 20 20 20 20 61 74 74 65 6d 70 74 6e 75 6d 20 49      attemptnum I
0e00: 4e 54 45 47 45 52 20 44 45 46 41 55 4c 54 20 30  NTEGER DEFAULT 0
0e10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
0e20: 20 20 20 20 20 20 20 66 69 6e 61 6c 5f 6c 6f 67         final_log
0e30: 66 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27  f TEXT DEFAULT '
0e40: 6c 6f 67 73 2f 66 69 6e 61 6c 2e 6c 6f 67 27 2c  logs/final.log',
0e50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0e60: 20 20 20 20 20 20 6c 6f 67 64 61 74 20 20 20 20        logdat    
0e70: 20 42 4c 4f 42 2c 20 0a 20 20 20 20 20 20 20 20   BLOB, .        
0e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 75 6e               run
0e90: 5f 64 75 72 61 74 69 6f 6e 20 49 4e 54 45 47 45  _duration INTEGE
0ea0: 52 20 44 45 46 41 55 4c 54 20 30 2c 0a 20 20 20  R DEFAULT 0,.   
0eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ec0: 20 20 63 6f 6d 6d 65 6e 74 20 20 20 20 54 45 58    comment    TEX
0ed0: 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20  T DEFAULT '',.  
0ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ef0: 20 20 20 65 76 65 6e 74 5f 74 69 6d 65 20 54 49     event_time TI
0f00: 4d 45 53 54 41 4d 50 2c 0a 20 20 20 20 20 20 20  MESTAMP,.       
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 61                fa
0f20: 69 6c 5f 63 6f 75 6e 74 20 49 4e 54 45 47 45 52  il_count INTEGER
0f30: 20 44 45 46 41 55 4c 54 20 30 2c 0a 20 20 20 20   DEFAULT 0,.    
0f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f50: 20 70 61 73 73 5f 63 6f 75 6e 74 20 49 4e 54 45   pass_count INTE
0f60: 47 45 52 20 44 45 46 41 55 4c 54 20 30 2c 0a 20  GER DEFAULT 0,. 
0f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f80: 20 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 74      CONSTRAINT t
0f90: 65 73 74 73 63 6f 6e 73 74 72 61 69 6e 74 20 55  estsconstraint U
0fa0: 4e 49 51 55 45 20 28 72 75 6e 5f 69 64 2c 20 74  NIQUE (run_id, t
0fb0: 65 73 74 6e 61 6d 65 2c 20 69 74 65 6d 5f 70 61  estname, item_pa
0fc0: 74 68 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b  th).          );
0fd0: 22 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65  ")..  (sqlite3:e
0fe0: 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 54  xecute db "CREAT
0ff0: 45 20 49 4e 44 45 58 20 74 65 73 74 73 5f 69 6e  E INDEX tests_in
1000: 64 65 78 20 4f 4e 20 74 65 73 74 73 20 28 72 75  dex ON tests (ru
1010: 6e 5f 69 64 2c 20 74 65 73 74 6e 61 6d 65 29 3b  n_id, testname);
1020: 22 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65  ")..  (sqlite3:e
1030: 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 54  xecute db "CREAT
1040: 45 20 56 49 45 57 20 72 75 6e 73 5f 74 65 73 74  E VIEW runs_test
1050: 73 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  s AS SELECT * FR
1060: 4f 4d 20 72 75 6e 73 20 49 4e 4e 45 52 20 4a 4f  OM runs INNER JO
1070: 49 4e 20 74 65 73 74 73 20 4f 4e 20 72 75 6e 73  IN tests ON runs
1080: 2e 69 64 3d 74 65 73 74 73 2e 72 75 6e 5f 69 64  .id=tests.run_id
1090: 3b 22 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a  ;")..  (sqlite3:
10a0: 65 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41  execute db "CREA
10b0: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  TE TABLE IF NOT 
10c0: 45 58 49 53 54 53 20 74 65 73 74 5f 73 74 65 70  EXISTS test_step
10d0: 73 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s .             
10e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f0: 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49   (id INTEGER PRI
1100: 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 20  MARY KEY,.      
1110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1120: 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 69 64           test_id
1130: 20 49 4e 54 45 47 45 52 2c 20 0a 20 20 20 20 20   INTEGER, .     
1140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1150: 20 20 20 20 20 20 20 20 20 20 73 74 65 70 6e 61            stepna
1160: 6d 65 20 54 45 58 54 2c 20 0a 20 20 20 20 20 20  me TEXT, .      
1170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1180: 20 20 20 20 20 20 20 20 20 73 74 61 74 65 20 54           state T
1190: 45 58 54 20 44 45 46 41 55 4c 54 20 27 4e 4f 54  EXT DEFAULT 'NOT
11a0: 5f 53 54 41 52 54 45 44 27 2c 20 0a 20 20 20 20  _STARTED', .    
11b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c0: 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 75             statu
11d0: 73 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27  s TEXT DEFAULT '
11e0: 6e 2f 61 27 2c 0a 20 20 20 20 20 20 20 20 20 20  n/a',.          
11f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1200: 20 20 20 20 20 65 76 65 6e 74 5f 74 69 6d 65 20       event_time 
1210: 54 49 4d 45 53 54 41 4d 50 2c 0a 20 20 20 20 20  TIMESTAMP,.     
1220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1230: 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 65 6e            commen
1240: 74 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27  t TEXT DEFAULT '
1250: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ',.             
1260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1270: 20 20 6c 6f 67 66 69 6c 65 20 54 45 58 54 2c 0a    logfile TEXT,.
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43                 C
12a0: 4f 4e 53 54 52 41 49 4e 54 20 74 65 73 74 5f 73  ONSTRAINT test_s
12b0: 74 65 70 73 5f 63 6f 6e 73 74 72 61 69 6e 74 20  teps_constraint 
12c0: 55 4e 49 51 55 45 20 28 74 65 73 74 5f 69 64 2c  UNIQUE (test_id,
12d0: 73 74 65 70 6e 61 6d 65 2c 73 74 61 74 65 29 29  stepname,state))
12e0: 3b 22 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a  ;")..  (sqlite3:
12f0: 65 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41  execute db "CREA
1300: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  TE TABLE IF NOT 
1310: 45 58 49 53 54 53 20 65 78 74 72 61 64 61 74 20  EXISTS extradat 
1320: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d  (id INTEGER PRIM
1330: 41 52 59 20 4b 45 59 2c 20 72 75 6e 5f 69 64 20  ARY KEY, run_id 
1340: 49 4e 54 45 47 45 52 2c 20 6b 65 79 20 54 45 58  INTEGER, key TEX
1350: 54 2c 20 76 61 6c 20 54 45 58 54 29 3b 22 29 0a  T, val TEXT);").
1360: 09 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63  .  (sqlite3:exec
1370: 75 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54  ute db "CREATE T
1380: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
1390: 54 53 20 6d 65 74 61 64 61 74 20 28 69 64 20 49  TS metadat (id I
13a0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
13b0: 45 59 2c 20 76 61 72 20 54 45 58 54 2c 20 76 61  EY, var TEXT, va
13c0: 6c 20 54 45 58 54 2c 0a 20 20 20 20 20 20 20 20  l TEXT,.        
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52            CONSTR
13f0: 41 49 4e 54 20 6d 65 74 61 64 61 74 5f 63 6f 6e  AINT metadat_con
1400: 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28  straint UNIQUE (
1410: 76 61 72 29 29 3b 22 29 0a 09 20 20 28 73 71 6c  var));")..  (sql
1420: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
1430: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46  "CREATE TABLE IF
1440: 20 4e 4f 54 20 45 58 49 53 54 53 20 61 63 63 65   NOT EXISTS acce
1450: 73 73 5f 6c 6f 67 20 28 69 64 20 49 4e 54 45 47  ss_log (id INTEG
1460: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
1470: 75 73 65 72 20 54 45 58 54 2c 20 61 63 63 65 73  user TEXT, acces
1480: 73 65 64 20 54 49 4d 45 53 54 41 4d 50 2c 20 61  sed TIMESTAMP, a
1490: 72 67 73 20 54 45 58 54 29 3b 22 29 0a 09 20 20  rgs TEXT);")..  
14a0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
14b0: 20 64 62 20 22 43 52 45 41 54 45 20 54 41 42 4c   db "CREATE TABL
14c0: 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20  E IF NOT EXISTS 
14d0: 74 65 73 74 5f 6d 65 74 61 20 28 69 64 20 49 4e  test_meta (id IN
14e0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
14f0: 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y,.             
1500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1510: 20 20 20 20 20 20 20 20 74 65 73 74 6e 61 6d 65          testname
1520: 20 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54      TEXT DEFAULT
1530: 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20   '',.           
1540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1550: 20 20 20 20 20 20 20 20 20 20 61 75 74 68 6f 72            author
1560: 20 20 20 20 20 20 54 45 58 54 20 44 45 46 41 55        TEXT DEFAU
1570: 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20  LT '',.         
1580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1590: 20 20 20 20 20 20 20 20 20 20 20 20 6f 77 6e 65              owne
15a0: 72 20 20 20 20 20 20 20 54 45 58 54 20 44 45 46  r       TEXT DEF
15b0: 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20  AULT '',.       
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65                de
15e0: 73 63 72 69 70 74 69 6f 6e 20 54 45 58 54 20 44  scription TEXT D
15f0: 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20  EFAULT '',.     
1600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1620: 72 65 76 69 65 77 65 64 20 20 20 20 54 49 4d 45  reviewed    TIME
1630: 53 54 41 4d 50 2c 0a 20 20 20 20 20 20 20 20 20  STAMP,.         
1640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1650: 20 20 20 20 20 20 20 20 20 20 20 20 69 74 65 72              iter
1660: 61 74 65 64 20 20 20 20 54 45 58 54 20 44 45 46  ated    TEXT DEF
1670: 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20  AULT '',.       
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 76                av
16a0: 67 5f 72 75 6e 74 69 6d 65 20 52 45 41 4c 2c 0a  g_runtime REAL,.
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d0: 20 20 20 20 20 61 76 67 5f 64 69 73 6b 20 20 20       avg_disk   
16e0: 20 52 45 41 4c 2c 0a 20 20 20 20 20 20 20 20 20   REAL,.         
16f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1700: 20 20 20 20 20 20 20 20 20 20 20 20 74 61 67 73              tags
1710: 20 20 20 20 20 20 20 20 54 45 58 54 20 44 45 46          TEXT DEF
1720: 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20  AULT '',.       
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1740: 20 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52 41           CONSTRA
1750: 49 4e 54 20 74 65 73 74 5f 6d 65 74 61 5f 63 6f  INT test_meta_co
1760: 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20  nstraint UNIQUE 
1770: 28 74 65 73 74 6e 61 6d 65 29 29 3b 22 29 0a 09  (testname));")..
1780: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
1790: 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41  te db "CREATE TA
17a0: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54  BLE IF NOT EXIST
17b0: 53 20 74 65 73 74 5f 64 61 74 61 20 28 69 64 20  S test_data (id 
17c0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
17d0: 4b 45 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20  KEY,.           
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f0: 20 20 20 20 20 74 65 73 74 5f 69 64 20 49 4e 54       test_id INT
1800: 45 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20  EGER,.          
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1820: 20 20 20 20 20 20 63 61 74 65 67 6f 72 79 20 54        category T
1830: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a  EXT DEFAULT '',.
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 20 20 20                  
1860: 76 61 72 69 61 62 6c 65 20 54 45 58 54 2c 0a 09  variable TEXT,..
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 76 61 6c 75 65 20 52 45          value RE
1890: 41 4c 2c 0a 09 20 20 20 20 20 20 20 20 20 20 20  AL,..           
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70               exp
18b0: 65 63 74 65 64 20 52 45 41 4c 2c 0a 09 20 20 20  ected REAL,..   
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d0: 20 20 20 20 20 74 6f 6c 20 52 45 41 4c 2c 0a 20       tol REAL,. 
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75                 u
1900: 6e 69 74 73 20 54 45 58 54 2c 0a 20 20 20 20 20  nits TEXT,.     
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 65             comme
1930: 6e 74 20 54 45 58 54 20 44 45 46 41 55 4c 54 20  nt TEXT DEFAULT 
1940: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '',.            
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1960: 20 20 20 20 73 74 61 74 75 73 20 54 45 58 54 20      status TEXT 
1970: 44 45 46 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20  DEFAULT 'n/a',. 
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
19a0: 79 70 65 20 54 45 58 54 20 44 45 46 41 55 4c 54  ype TEXT DEFAULT
19b0: 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20   '',.           
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d0: 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 65     CONSTRAINT te
19e0: 73 74 5f 64 61 74 61 5f 63 6f 6e 73 74 72 61 69  st_data_constrai
19f0: 6e 74 20 55 4e 49 51 55 45 20 28 74 65 73 74 5f  nt UNIQUE (test_
1a00: 69 64 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 69  id,category,vari
1a10: 61 62 6c 65 29 29 3b 22 29 0a 09 20 20 28 73 71  able));")..  (sq
1a20: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62  lite3:execute db
1a30: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49   "CREATE TABLE I
1a40: 46 20 4e 4f 54 20 45 58 49 53 54 53 20 74 61 73  F NOT EXISTS tas
1a50: 6b 73 5f 71 75 65 75 65 20 28 69 64 20 49 4e 54  ks_queue (id INT
1a60: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
1a70: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 20 20 61 63 74 69 6f 6e 20 54 45 58 54 20 44 45    action TEXT DE
1aa0: 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20  FAULT '',.      
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac0: 20 20 20 20 20 20 20 20 20 20 6f 77 6e 65 72 20            owner 
1ad0: 54 45 58 54 2c 0a 20 20 20 20 20 20 20 20 20 20  TEXT,.          
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af0: 20 20 20 20 20 20 73 74 61 74 65 20 54 45 58 54        state TEXT
1b00: 20 44 45 46 41 55 4c 54 20 27 6e 65 77 27 2c 0a   DEFAULT 'new',.
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b30: 74 61 72 67 65 74 20 54 45 58 54 20 44 45 46 41  target TEXT DEFA
1b40: 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20  ULT '',.        
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b60: 20 20 20 20 20 20 20 20 6e 61 6d 65 20 54 45 58          name TEX
1b70: 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20  T DEFAULT '',.  
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
1ba0: 73 74 20 54 45 58 54 20 44 45 46 41 55 4c 54 20  st TEXT DEFAULT 
1bb0: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '',.            
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd0: 20 20 20 20 69 74 65 6d 20 54 45 58 54 20 44 45      item TEXT DE
1be0: 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20  FAULT '',.      
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c00: 20 20 20 20 20 20 20 20 20 20 63 72 65 61 74 69            creati
1c10: 6f 6e 5f 74 69 6d 65 20 54 49 4d 45 53 54 41 4d  on_time TIMESTAM
1c20: 50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  P,.             
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 20 20 20 65 78 65 63 75 74 69 6f 6e 5f 74 69 6d     execution_tim
1c50: 65 20 54 49 4d 45 53 54 41 4d 50 29 3b 22 29 0a  e TIMESTAMP);").
1c60: 09 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63  .  (sqlite3:exec
1c70: 75 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54  ute db "CREATE T
1c80: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
1c90: 54 53 20 6d 6f 6e 69 74 6f 72 73 20 28 69 64 20  TS monitors (id 
1ca0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
1cb0: 4b 45 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20  KEY,.           
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd0: 20 20 20 20 20 70 69 64 20 49 4e 54 45 47 45 52       pid INTEGER
1ce0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d00: 20 20 73 74 61 72 74 5f 74 69 6d 65 20 54 49 4d    start_time TIM
1d10: 45 53 54 41 4d 50 2c 0a 20 20 20 20 20 20 20 20  ESTAMP,.        
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d30: 20 20 20 20 20 20 20 20 6c 61 73 74 5f 75 70 64          last_upd
1d40: 61 74 65 20 54 49 4d 45 53 54 41 4d 50 2c 0a 20  ate TIMESTAMP,. 
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68                 h
1d70: 6f 73 74 6e 61 6d 65 20 54 45 58 54 2c 0a 20 20  ostname TEXT,.  
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 73                us
1da0: 65 72 6e 61 6d 65 20 54 45 58 54 2c 0a 20 20 20  ername TEXT,.   
1db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e 53              CONS
1dd0: 54 52 41 49 4e 54 20 6d 6f 6e 69 74 6f 72 73 5f  TRAINT monitors_
1de0: 63 6f 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 55  constraint UNIQU
1df0: 45 20 28 70 69 64 2c 68 6f 73 74 6e 61 6d 65 29  E (pid,hostname)
1e00: 29 3b 22 29 0a 09 20 20 3b 3b 20 4d 75 73 74 20  );")..  ;; Must 
1e10: 64 6f 20 74 68 69 73 20 2a 61 66 74 65 72 2a 20  do this *after* 
1e20: 72 75 6e 6e 69 6e 67 20 70 61 74 63 68 20 64 62  running patch db
1e30: 20 21 21 20 4e 6f 20 6d 6f 72 65 2e 20 0a 09 20   !! No more. .. 
1e40: 20 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20   (db:set-var db 
1e50: 22 4d 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f  "MEGATEST_VERSIO
1e60: 4e 22 20 6d 65 67 61 74 65 73 74 2d 76 65 72 73  N" megatest-vers
1e70: 69 6f 6e 29 0a 09 20 20 29 29 0a 20 20 20 20 64  ion)..  )).    d
1e80: 62 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d  b))..;;=========
1e90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1ea0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1eb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1ec0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b  =============.;;
1ed0: 20 54 4f 44 4f 3a 0a 3b 3b 20 20 20 70 75 74 20   TODO:.;;   put 
1ee0: 64 65 6c 74 61 73 20 69 6e 74 6f 20 61 6e 20 61  deltas into an a
1ef0: 73 73 6f 63 20 6c 69 73 74 20 77 69 74 68 20 76  ssoc list with v
1f00: 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 73 0a 3b  ersion numbers.;
1f10: 3b 20 20 20 61 70 70 6c 79 20 61 6c 6c 20 66 72  ;   apply all fr
1f20: 6f 6d 20 6c 61 73 74 20 74 6f 20 63 75 72 72 65  om last to curre
1f30: 6e 74 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  nt.;;===========
1f40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1f50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1f60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1f70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 28 64 65 66  ===========.(def
1f80: 69 6e 65 20 28 70 61 74 63 68 2d 64 62 20 64 62  ine (patch-db db
1f90: 29 0a 20 20 28 68 61 6e 64 6c 65 2d 65 78 63 65  ).  (handle-exce
1fa0: 70 74 69 6f 6e 73 0a 20 20 20 65 78 6e 0a 20 20  ptions.   exn.  
1fb0: 20 28 62 65 67 69 6e 0a 20 20 20 20 20 28 70 72   (begin.     (pr
1fc0: 69 6e 74 20 22 45 78 63 65 70 74 69 6f 6e 3a 20  int "Exception: 
1fd0: 22 20 65 78 6e 29 0a 20 20 20 20 20 28 70 72 69  " exn).     (pri
1fe0: 6e 74 20 22 45 52 52 4f 52 3a 20 50 6f 73 73 69  nt "ERROR: Possi
1ff0: 62 6c 65 20 6f 75 74 20 6f 66 20 64 61 74 65 20  ble out of date 
2000: 73 63 68 65 6d 61 2c 20 61 74 74 65 6d 70 74 69  schema, attempti
2010: 6e 67 20 74 6f 20 61 64 64 20 74 61 62 6c 65 20  ng to add table 
2020: 6d 65 74 61 64 61 74 61 2e 2e 2e 22 29 0a 20 20  metadata...").  
2030: 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63     (sqlite3:exec
2040: 75 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54  ute db "CREATE T
2050: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
2060: 54 53 20 6d 65 74 61 64 61 74 20 28 69 64 20 49  TS metadat (id I
2070: 4e 54 45 47 45 52 2c 20 76 61 72 20 54 45 58 54  NTEGER, var TEXT
2080: 2c 20 76 61 6c 20 54 45 58 54 2c 0a 20 20 20 20  , val TEXT,.    
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e               CON
20b0: 53 54 52 41 49 4e 54 20 6d 65 74 61 64 61 74 5f  STRAINT metadat_
20c0: 63 6f 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 55  constraint UNIQU
20d0: 45 20 28 76 61 72 29 29 3b 22 29 0a 20 20 20 20  E (var));").    
20e0: 20 28 69 66 20 28 6e 6f 74 20 28 64 62 3a 67 65   (if (not (db:ge
20f0: 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 45  t-var db "MEGATE
2100: 53 54 5f 56 45 52 53 49 4f 4e 22 29 29 0a 09 20  ST_VERSION")).. 
2110: 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22  (db:set-var db "
2120: 4d 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e  MEGATEST_VERSION
2130: 22 20 31 2e 31 37 29 29 29 0a 20 20 20 28 6c 65  " 1.17))).   (le
2140: 74 20 28 28 6d 76 65 72 20 28 64 62 3a 67 65 74  t ((mver (db:get
2150: 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 53  -var db "MEGATES
2160: 54 5f 56 45 52 53 49 4f 4e 22 29 29 0a 09 20 28  T_VERSION")).. (
2170: 74 65 73 74 2d 6d 65 74 61 2d 64 65 66 20 22 43  test-meta-def "C
2180: 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e  REATE TABLE IF N
2190: 4f 54 20 45 58 49 53 54 53 20 74 65 73 74 5f 6d  OT EXISTS test_m
21a0: 65 74 61 20 28 69 64 20 49 4e 54 45 47 45 52 20  eta (id INTEGER 
21b0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20  PRIMARY KEY,.   
21c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 20 20 74 65 73 74 6e 61 6d 65 20 20 20 20 54 45    testname    TE
21f0: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20  XT DEFAULT '',. 
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2220: 20 20 20 20 61 75 74 68 6f 72 20 20 20 20 20 20      author      
2230: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c  TEXT DEFAULT '',
2240: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2260: 20 20 20 20 20 20 6f 77 6e 65 72 20 20 20 20 20        owner     
2270: 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27    TEXT DEFAULT '
2280: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ',.             
2290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a0: 20 20 20 20 20 20 20 20 64 65 73 63 72 69 70 74          descript
22b0: 69 6f 6e 20 54 45 58 54 20 44 45 46 41 55 4c 54  ion TEXT DEFAULT
22c0: 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20   '',.           
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e0: 20 20 20 20 20 20 20 20 20 20 72 65 76 69 65 77            review
22f0: 65 64 20 20 20 20 54 49 4d 45 53 54 41 4d 50 2c  ed    TIMESTAMP,
2300: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2320: 20 20 20 20 20 20 69 74 65 72 61 74 65 64 20 20        iterated  
2330: 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27    TEXT DEFAULT '
2340: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ',.             
2350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2360: 20 20 20 20 20 20 20 20 61 76 67 5f 72 75 6e 74          avg_runt
2370: 69 6d 65 20 52 45 41 4c 2c 0a 20 20 20 20 20 20  ime REAL,.      
2380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
23a0: 76 67 5f 64 69 73 6b 20 20 20 20 52 45 41 4c 2c  vg_disk    REAL,
23b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d0: 20 20 20 20 20 20 74 61 67 73 20 20 20 20 20 20        tags      
23e0: 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27    TEXT DEFAULT '
23f0: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ',.             
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2410: 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 65     CONSTRAINT te
2420: 73 74 5f 6d 65 74 61 5f 63 6f 6e 73 74 72 61 69  st_meta_constrai
2430: 6e 74 20 55 4e 49 51 55 45 20 28 74 65 73 74 6e  nt UNIQUE (testn
2440: 61 6d 65 29 29 3b 22 29 29 0a 20 20 20 20 20 28  ame));")).     (
2450: 70 72 69 6e 74 20 22 43 75 72 72 65 6e 74 20 73  print "Current s
2460: 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 3a 20 22  chema version: "
2470: 20 6d 76 65 72 20 22 20 63 75 72 72 65 6e 74 20   mver " current 
2480: 6d 65 67 61 74 65 73 74 20 76 65 72 73 69 6f 6e  megatest version
2490: 3a 20 22 20 6d 65 67 61 74 65 73 74 2d 76 65 72  : " megatest-ver
24a0: 73 69 6f 6e 29 0a 20 20 20 20 20 28 63 6f 6e 64  sion).     (cond
24b0: 0a 20 20 20 20 20 20 28 28 6e 6f 74 20 6d 76 65  .      ((not mve
24c0: 72 29 0a 20 20 20 20 20 20 20 28 70 72 69 6e 74  r).       (print
24d0: 20 22 41 64 64 69 6e 67 20 6d 65 67 61 74 65 73   "Adding megates
24e0: 74 2d 76 65 72 73 69 6f 6e 20 74 6f 20 6d 65 74  t-version to met
24f0: 61 64 61 74 61 22 29 20 3b 3b 20 4e 65 65 64 20  adata") ;; Need 
2500: 74 6f 20 72 65 63 72 65 61 74 65 20 74 68 65 20  to recreate the 
2510: 74 61 62 6c 65 0a 20 20 20 20 20 20 20 28 73 71  table.       (sq
2520: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62  lite3:execute db
2530: 20 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20   "DROP TABLE IF 
2540: 45 58 49 53 54 53 20 6d 65 74 61 64 61 74 3b 22  EXISTS metadat;"
2550: 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ).       (sqlite
2560: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 43 52  3:execute db "CR
2570: 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f  EATE TABLE IF NO
2580: 54 20 45 58 49 53 54 53 20 6d 65 74 61 64 61 74  T EXISTS metadat
2590: 20 28 69 64 20 49 4e 54 45 47 45 52 2c 20 76 61   (id INTEGER, va
25a0: 72 20 54 45 58 54 2c 20 76 61 6c 20 54 45 58 54  r TEXT, val TEXT
25b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d0: 20 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 6d      CONSTRAINT m
25e0: 65 74 61 64 61 74 5f 63 6f 6e 73 74 72 61 69 6e  etadat_constrain
25f0: 74 20 55 4e 49 51 55 45 20 28 76 61 72 29 29 3b  t UNIQUE (var));
2600: 22 29 0a 20 20 20 20 20 20 20 28 64 62 3a 73 65  ").       (db:se
2610: 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 45  t-var db "MEGATE
2620: 53 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e 31 37  ST_VERSION" 1.17
2630: 29 0a 20 20 20 20 20 20 20 28 70 61 74 63 68 2d  ).       (patch-
2640: 64 62 29 29 0a 20 20 20 20 20 20 28 28 3c 20 6d  db)).      ((< m
2650: 76 65 72 20 31 2e 32 31 29 0a 20 20 20 20 20 20  ver 1.21).      
2660: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
2670: 65 20 64 62 20 22 44 52 4f 50 20 54 41 42 4c 45  e db "DROP TABLE
2680: 20 49 46 20 45 58 49 53 54 53 20 6d 65 74 61 64   IF EXISTS metad
2690: 61 74 3b 22 29 0a 20 20 20 20 20 20 20 28 73 71  at;").       (sq
26a0: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62  lite3:execute db
26b0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49   "CREATE TABLE I
26c0: 46 20 4e 4f 54 20 45 58 49 53 54 53 20 6d 65 74  F NOT EXISTS met
26d0: 61 64 61 74 20 28 69 64 20 49 4e 54 45 47 45 52  adat (id INTEGER
26e0: 2c 20 76 61 72 20 54 45 58 54 2c 20 76 61 6c 20  , var TEXT, val 
26f0: 54 45 58 54 2c 0a 20 20 20 20 20 20 20 20 20 20  TEXT,.          
2700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2710: 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52 41 49          CONSTRAI
2720: 4e 54 20 6d 65 74 61 64 61 74 5f 63 6f 6e 73 74  NT metadat_const
2730: 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28 76 61  raint UNIQUE (va
2740: 72 29 29 3b 22 29 0a 20 20 20 20 20 20 20 28 64  r));").       (d
2750: 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45  b:set-var db "ME
2760: 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20  GATEST_VERSION" 
2770: 31 2e 32 31 29 20 3b 3b 20 73 65 74 20 62 65 66  1.21) ;; set bef
2780: 6f 72 65 2c 20 6a 75 73 74 20 69 6e 20 63 61 73  ore, just in cas
2790: 65 20 74 68 65 20 63 68 61 6e 67 65 73 20 61 72  e the changes ar
27a0: 65 20 61 6c 72 65 61 64 79 20 61 70 70 6c 69 65  e already applie
27b0: 64 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  d.       (sqlite
27c0: 33 3a 65 78 65 63 75 74 65 20 64 62 20 74 65 73  3:execute db tes
27d0: 74 2d 6d 65 74 61 2d 64 65 66 29 0a 20 20 20 20  t-meta-def).    
27e0: 20 20 20 3b 28 66 6f 72 2d 65 61 63 68 20 0a 20     ;(for-each . 
27f0: 20 20 20 20 20 20 3b 20 28 6c 61 6d 62 64 61 20        ; (lambda 
2800: 28 73 74 6d 74 29 0a 20 20 20 20 20 20 20 3b 20  (stmt).       ; 
2810: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
2820: 74 65 20 64 62 20 73 74 6d 74 29 29 0a 20 20 20  te db stmt)).   
2830: 20 20 20 20 3b 20 28 6c 69 73 74 20 0a 20 20 20      ; (list .   
2840: 20 20 20 20 3b 20 20 22 41 4c 54 45 52 20 54 41      ;  "ALTER TA
2850: 42 4c 45 20 74 65 73 74 73 20 41 44 44 20 43 4f  BLE tests ADD CO
2860: 4c 55 4d 4e 20 66 69 72 73 74 5f 65 72 72 20 54  LUMN first_err T
2870: 45 58 54 3b 22 0a 20 20 20 20 20 20 20 3b 20 20  EXT;".       ;  
2880: 22 41 4c 54 45 52 20 54 41 42 4c 45 20 74 65 73  "ALTER TABLE tes
2890: 74 73 20 41 44 44 20 43 4f 4c 55 4d 4e 20 66 69  ts ADD COLUMN fi
28a0: 72 73 74 5f 77 61 72 6e 20 54 45 58 54 3b 22 0a  rst_warn TEXT;".
28b0: 20 20 20 20 20 20 20 3b 20 20 29 29 0a 20 20 20         ;  )).   
28c0: 20 20 20 20 28 70 61 74 63 68 2d 64 62 29 29 0a      (patch-db)).
28d0: 20 20 20 20 20 20 28 28 3c 20 6d 76 65 72 20 31        ((< mver 1
28e0: 2e 32 34 29 0a 20 20 20 20 20 20 20 28 64 62 3a  .24).       (db:
28f0: 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41  set-var db "MEGA
2900: 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e  TEST_VERSION" 1.
2910: 32 34 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69  24).       (sqli
2920: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22  te3:execute db "
2930: 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58  DROP TABLE IF EX
2940: 49 53 54 53 20 74 65 73 74 5f 64 61 74 61 3b 22  ISTS test_data;"
2950: 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ).       (sqlite
2960: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 44 52  3:execute db "DR
2970: 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53  OP TABLE IF EXIS
2980: 54 53 20 74 65 73 74 5f 6d 65 74 61 3b 22 29 0a  TS test_meta;").
2990: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a         (sqlite3:
29a0: 65 78 65 63 75 74 65 20 64 62 20 74 65 73 74 2d  execute db test-
29b0: 6d 65 74 61 2d 64 65 66 29 0a 20 20 20 20 20 20  meta-def).      
29c0: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
29d0: 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41 42  e db "CREATE TAB
29e0: 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53  LE IF NOT EXISTS
29f0: 20 74 65 73 74 5f 64 61 74 61 20 28 69 64 20 49   test_data (id I
2a00: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
2a10: 45 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  EY,.            
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a30: 20 20 20 20 74 65 73 74 5f 69 64 20 49 4e 54 45      test_id INTE
2a40: 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20  GER,.           
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a60: 20 20 20 20 20 63 61 74 65 67 6f 72 79 20 54 45       category TE
2a70: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20  XT DEFAULT '',. 
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76                 v
2aa0: 61 72 69 61 62 6c 65 20 54 45 58 54 2c 0a 09 20  ariable TEXT,.. 
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac0: 20 20 20 20 20 20 20 76 61 6c 75 65 20 52 45 41         value REA
2ad0: 4c 2c 0a 09 20 20 20 20 20 20 20 20 20 20 20 20  L,..            
2ae0: 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70 65              expe
2af0: 63 74 65 64 20 52 45 41 4c 2c 0a 09 20 20 20 20  cted REAL,..    
2b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b10: 20 20 20 20 74 6f 6c 20 52 45 41 4c 2c 0a 20 20      tol REAL,.  
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 6e                un
2b40: 69 74 73 20 54 45 58 54 2c 0a 20 20 20 20 20 20  its TEXT,.      
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b60: 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 65 6e            commen
2b70: 74 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27  t TEXT DEFAULT '
2b80: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ',.             
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba0: 20 20 20 73 74 61 74 75 73 20 54 45 58 54 20 44     status TEXT D
2bb0: 45 46 41 55 4c 54 20 27 6e 2f 61 27 2c 66 6f 73  EFAULT 'n/a',fos
2bc0: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s.              
2bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2be0: 43 4f 4e 53 54 52 41 49 4e 54 20 74 65 73 74 5f  CONSTRAINT test_
2bf0: 64 61 74 61 20 55 4e 49 51 55 45 20 28 74 65 73  data UNIQUE (tes
2c00: 74 5f 69 64 2c 63 61 74 65 67 6f 72 79 2c 76 61  t_id,category,va
2c10: 72 69 61 62 6c 65 29 29 3b 22 29 0a 20 20 20 20  riable));").    
2c20: 20 20 20 28 70 61 74 63 68 2d 64 62 29 29 0a 20     (patch-db)). 
2c30: 20 20 20 20 20 28 28 3c 20 6d 76 65 72 20 31 2e       ((< mver 1.
2c40: 32 37 29 0a 20 20 20 20 20 20 20 28 64 62 3a 73  27).       (db:s
2c50: 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54  et-var db "MEGAT
2c60: 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e 32  EST_VERSION" 1.2
2c70: 37 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74  7).       (sqlit
2c80: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 41  e3:execute db "A
2c90: 4c 54 45 52 20 54 41 42 4c 45 20 74 65 73 74 5f  LTER TABLE test_
2ca0: 64 61 74 61 20 41 44 44 20 43 4f 4c 55 4d 4e 20  data ADD COLUMN 
2cb0: 74 79 70 65 20 54 45 58 54 20 44 45 46 41 55 4c  type TEXT DEFAUL
2cc0: 54 20 27 27 3b 22 29 0a 20 20 20 20 20 20 20 28  T '';").       (
2cd0: 70 61 74 63 68 2d 64 62 29 29 0a 20 20 20 20 20  patch-db)).     
2ce0: 20 28 28 3c 20 6d 76 65 72 20 31 2e 32 39 29 0a   ((< mver 1.29).
2cf0: 20 20 20 20 20 20 20 28 64 62 3a 73 65 74 2d 76         (db:set-v
2d00: 61 72 20 64 62 20 22 4d 45 47 41 54 45 53 54 5f  ar db "MEGATEST_
2d10: 56 45 52 53 49 4f 4e 22 20 31 2e 32 39 29 0a 20  VERSION" 1.29). 
2d20: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65        (sqlite3:e
2d30: 78 65 63 75 74 65 20 64 62 20 22 41 4c 54 45 52  xecute db "ALTER
2d40: 20 54 41 42 4c 45 20 74 65 73 74 5f 73 74 65 70   TABLE test_step
2d50: 73 20 41 44 44 20 43 4f 4c 55 4d 4e 20 6c 6f 67  s ADD COLUMN log
2d60: 66 69 6c 65 20 54 45 58 54 3b 22 29 0a 20 20 20  file TEXT;").   
2d70: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65      (sqlite3:exe
2d80: 63 75 74 65 20 64 62 20 22 41 4c 54 45 52 20 54  cute db "ALTER T
2d90: 41 42 4c 45 20 74 65 73 74 73 20 41 44 44 20 43  ABLE tests ADD C
2da0: 4f 4c 55 4d 4e 20 73 68 6f 72 74 64 69 72 20 54  OLUMN shortdir T
2db0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 3b 22  EXT DEFAULT '';"
2dc0: 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ).       (sqlite
2dd0: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 43 52  3:execute db "CR
2de0: 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f  EATE TABLE IF NO
2df0: 54 20 45 58 49 53 54 53 20 74 61 73 6b 73 5f 71  T EXISTS tasks_q
2e00: 75 65 75 65 20 28 69 64 20 49 4e 54 45 47 45 52  ueue (id INTEGER
2e10: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20   PRIMARY KEY,.  
2e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 63                ac
2e40: 74 69 6f 6e 20 54 45 58 54 20 44 45 46 41 55 4c  tion TEXT DEFAUL
2e50: 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20  T '',.          
2e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e70: 20 20 20 20 20 20 6f 77 6e 65 72 20 54 45 58 54        owner TEXT
2e80: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea0: 20 20 73 74 61 74 65 20 54 45 58 54 20 44 45 46    state TEXT DEF
2eb0: 41 55 4c 54 20 27 6e 65 77 27 2c 0a 20 20 20 20  AULT 'new',.    
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 74 61 72 67              targ
2ee0: 65 74 20 54 45 58 54 20 44 45 46 41 55 4c 54 20  et TEXT DEFAULT 
2ef0: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '',.            
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f10: 20 20 20 20 6e 61 6d 65 20 54 45 58 54 20 44 45      name TEXT DE
2f20: 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20  FAULT '',.      
2f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f40: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 20 54            test T
2f50: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a  EXT DEFAULT '',.
2f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f80: 69 74 65 6d 20 54 45 58 54 20 44 45 46 41 55 4c  item TEXT DEFAUL
2f90: 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20  T '',.          
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb0: 20 20 20 20 20 20 63 72 65 61 74 69 6f 6e 5f 74        creation_t
2fc0: 69 6d 65 20 54 49 4d 45 53 54 41 4d 50 2c 0a 20  ime TIMESTAMP,. 
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
2ff0: 78 65 63 75 74 69 6f 6e 5f 74 69 6d 65 20 54 49  xecution_time TI
3000: 4d 45 53 54 41 4d 50 29 3b 22 29 0a 20 20 20 20  MESTAMP);").    
3010: 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63     (sqlite3:exec
3020: 75 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54  ute db "CREATE T
3030: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
3040: 54 53 20 6d 6f 6e 69 74 6f 72 73 20 28 69 64 20  TS monitors (id 
3050: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
3060: 4b 45 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20  KEY,.           
3070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3080: 20 20 20 20 20 70 69 64 20 49 4e 54 45 47 45 52       pid INTEGER
3090: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b0: 20 20 73 74 61 72 74 5f 74 69 6d 65 20 54 49 4d    start_time TIM
30c0: 45 53 54 41 4d 50 2c 0a 20 20 20 20 20 20 20 20  ESTAMP,.        
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e0: 20 20 20 20 20 20 20 20 6c 61 73 74 5f 75 70 64          last_upd
30f0: 61 74 65 20 54 49 4d 45 53 54 41 4d 50 2c 0a 20  ate TIMESTAMP,. 
3100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68                 h
3120: 6f 73 74 6e 61 6d 65 20 54 45 58 54 2c 0a 20 20  ostname TEXT,.  
3130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 73                us
3150: 65 72 6e 61 6d 65 20 54 45 58 54 2c 0a 20 20 20  ername TEXT,.   
3160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3170: 20 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e 53              CONS
3180: 54 52 41 49 4e 54 20 6d 6f 6e 69 74 6f 72 73 5f  TRAINT monitors_
3190: 63 6f 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 55  constraint UNIQU
31a0: 45 20 28 70 69 64 2c 68 6f 73 74 6e 61 6d 65 29  E (pid,hostname)
31b0: 29 3b 22 29 0a 20 20 20 20 20 20 20 28 70 61 74  );").       (pat
31c0: 63 68 2d 64 62 29 29 0a 20 20 20 20 20 20 28 28  ch-db)).      ((
31d0: 3c 20 6d 76 65 72 20 6d 65 67 61 74 65 73 74 2d  < mver megatest-
31e0: 76 65 72 73 69 6f 6e 29 0a 20 20 20 20 20 20 20  version).       
31f0: 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22  (db:set-var db "
3200: 4d 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e  MEGATEST_VERSION
3210: 22 20 6d 65 67 61 74 65 73 74 2d 76 65 72 73 69  " megatest-versi
3220: 6f 6e 29 29 29 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d  on))))))..;;====
3230: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3240: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3250: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3260: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3270: 3d 3d 0a 3b 3b 20 6d 65 74 61 20 67 65 74 20 61  ==.;; meta get a
3280: 6e 64 20 73 65 74 20 76 61 72 73 0a 3b 3b 3d 3d  nd set vars.;;==
3290: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
32a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
32b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
32c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
32d0: 3d 3d 3d 3d 0a 0a 3b 3b 20 72 65 74 75 72 6e 73  ====..;; returns
32e0: 20 6e 75 6d 62 65 72 20 69 66 20 73 74 72 69 6e   number if strin
32f0: 67 2d 3e 6e 75 6d 62 65 72 20 69 73 20 73 75 63  g->number is suc
3300: 63 65 73 73 66 75 6c 2c 20 73 74 72 69 6e 67 20  cessful, string 
3310: 6f 74 68 65 72 77 69 73 65 0a 28 64 65 66 69 6e  otherwise.(defin
3320: 65 20 28 64 62 3a 67 65 74 2d 76 61 72 20 64 62  e (db:get-var db
3330: 20 76 61 72 29 0a 20 20 28 6c 65 74 20 28 28 72   var).  (let ((r
3340: 65 73 20 23 66 29 29 0a 20 20 20 20 28 73 71 6c  es #f)).    (sql
3350: 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f  ite3:for-each-ro
3360: 77 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28  w.     (lambda (
3370: 76 61 6c 29 0a 20 20 20 20 20 20 20 28 73 65 74  val).       (set
3380: 21 20 72 65 73 20 76 61 6c 29 29 0a 20 20 20 20  ! res val)).    
3390: 20 64 62 20 22 53 45 4c 45 43 54 20 76 61 6c 20   db "SELECT val 
33a0: 46 52 4f 4d 20 6d 65 74 61 64 61 74 20 57 48 45  FROM metadat WHE
33b0: 52 45 20 76 61 72 3d 3f 3b 22 20 76 61 72 29 0a  RE var=?;" var).
33c0: 20 20 20 20 28 69 66 20 28 73 74 72 69 6e 67 3f      (if (string?
33d0: 20 72 65 73 29 0a 09 28 6c 65 74 20 28 28 76 61   res)..(let ((va
33e0: 6c 6e 75 6d 20 28 73 74 72 69 6e 67 2d 3e 6e 75  lnum (string->nu
33f0: 6d 62 65 72 20 72 65 73 29 29 29 0a 09 20 20 28  mber res)))..  (
3400: 69 66 20 76 61 6c 6e 75 6d 20 76 61 6c 6e 75 6d  if valnum valnum
3410: 20 72 65 73 29 29 0a 09 72 65 73 29 29 29 0a 0a   res))..res)))..
3420: 28 64 65 66 69 6e 65 20 28 64 62 3a 73 65 74 2d  (define (db:set-
3430: 76 61 72 20 64 62 20 76 61 72 20 76 61 6c 29 0a  var db var val).
3440: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
3450: 74 65 20 64 62 20 22 49 4e 53 45 52 54 20 4f 52  te db "INSERT OR
3460: 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 6d 65   REPLACE INTO me
3470: 74 61 64 61 74 20 28 76 61 72 2c 76 61 6c 29 20  tadat (var,val) 
3480: 56 41 4c 55 45 53 20 28 3f 2c 3f 29 3b 22 20 76  VALUES (?,?);" v
3490: 61 72 20 76 61 6c 29 29 0a 0a 3b 3b 20 75 73 65  ar val))..;; use
34a0: 20 61 20 67 6c 6f 62 61 6c 20 66 6f 72 20 73 6f   a global for so
34b0: 6d 65 20 70 72 69 6d 69 74 69 76 65 20 63 61 63  me primitive cac
34c0: 68 69 6e 67 2c 20 69 74 20 69 73 20 6a 75 73 74  hing, it is just
34d0: 20 73 69 6c 6c 79 20 74 6f 20 72 65 2d 72 65 61   silly to re-rea
34e0: 64 20 74 68 65 20 64 62 20 0a 3b 3b 20 6f 76 65  d the db .;; ove
34f0: 72 20 61 6e 64 20 6f 76 65 72 20 61 67 61 69 6e  r and over again
3500: 20 66 6f 72 20 74 68 65 20 6b 65 79 73 20 73 69   for the keys si
3510: 6e 63 65 20 74 68 65 79 20 6e 65 76 65 72 20 63  nce they never c
3520: 68 61 6e 67 65 0a 0a 28 64 65 66 69 6e 65 20 2a  hange..(define *
3530: 64 62 2d 6b 65 79 73 2a 20 23 66 29 0a 0a 28 64  db-keys* #f)..(d
3540: 65 66 69 6e 65 20 28 64 62 2d 67 65 74 2d 6b 65  efine (db-get-ke
3550: 79 73 20 64 62 29 0a 20 20 28 69 66 20 2a 64 62  ys db).  (if *db
3560: 2d 6b 65 79 73 2a 20 2a 64 62 2d 6b 65 79 73 2a  -keys* *db-keys*
3570: 20 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28 72   .      (let ((r
3580: 65 73 20 27 28 29 29 29 0a 09 28 73 71 6c 69 74  es '()))..(sqlit
3590: 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20  e3:for-each-row 
35a0: 0a 09 20 28 6c 61 6d 62 64 61 20 28 6b 65 79 20  .. (lambda (key 
35b0: 6b 65 79 74 79 70 65 29 0a 09 20 20 20 28 73 65  keytype)..   (se
35c0: 74 21 20 72 65 73 20 28 63 6f 6e 73 20 28 76 65  t! res (cons (ve
35d0: 63 74 6f 72 20 6b 65 79 20 6b 65 79 74 79 70 65  ctor key keytype
35e0: 29 20 72 65 73 29 29 29 0a 09 20 64 62 0a 09 20  ) res))).. db.. 
35f0: 22 53 45 4c 45 43 54 20 66 69 65 6c 64 6e 61 6d  "SELECT fieldnam
3600: 65 2c 66 69 65 6c 64 74 79 70 65 20 46 52 4f 4d  e,fieldtype FROM
3610: 20 6b 65 79 73 20 4f 52 44 45 52 20 42 59 20 69   keys ORDER BY i
3620: 64 20 44 45 53 43 3b 22 29 0a 09 28 73 65 74 21  d DESC;")..(set!
3630: 20 2a 64 62 2d 6b 65 79 73 2a 20 72 65 73 29 0a   *db-keys* res).
3640: 09 72 65 73 29 29 29 0a 0a 28 64 65 66 69 6e 65  .res)))..(define
3650: 20 64 62 3a 67 65 74 2d 6b 65 79 73 20 64 62 2d   db:get-keys db-
3660: 67 65 74 2d 6b 65 79 73 29 0a 0a 28 64 65 66 69  get-keys)..(defi
3670: 6e 65 20 28 64 62 3a 67 65 74 2d 76 61 6c 75 65  ne (db:get-value
3680: 2d 62 79 2d 68 65 61 64 65 72 20 72 6f 77 20 68  -by-header row h
3690: 65 61 64 65 72 20 66 69 65 6c 64 29 0a 20 20 28  eader field).  (
36a0: 64 65 62 75 67 3a 70 72 69 6e 74 20 30 20 22 64  debug:print 0 "d
36b0: 62 3a 67 65 74 2d 76 61 6c 75 65 2d 62 79 2d 68  b:get-value-by-h
36c0: 65 61 64 65 72 20 72 6f 77 3a 20 22 20 72 6f 77  eader row: " row
36d0: 20 22 20 68 65 61 64 65 72 3a 20 22 20 68 65 61   " header: " hea
36e0: 64 65 72 20 22 20 66 69 65 6c 64 3a 20 22 20 66  der " field: " f
36f0: 69 65 6c 64 29 0a 20 20 28 69 66 20 28 6e 75 6c  ield).  (if (nul
3700: 6c 3f 20 68 65 61 64 65 72 29 20 23 66 0a 20 20  l? header) #f.  
3710: 20 20 20 20 28 6c 65 74 20 6c 6f 6f 70 20 28 28      (let loop ((
3720: 68 65 64 20 28 63 61 72 20 68 65 61 64 65 72 29  hed (car header)
3730: 29 0a 09 09 20 28 74 61 6c 20 28 63 64 72 20 68  )... (tal (cdr h
3740: 65 61 64 65 72 29 29 0a 09 09 20 28 6e 20 20 20  eader))... (n   
3750: 30 29 29 0a 09 28 69 66 20 28 65 71 75 61 6c 3f  0))..(if (equal?
3760: 20 68 65 64 20 66 69 65 6c 64 29 0a 09 20 20 20   hed field)..   
3770: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 72 6f 77   (vector-ref row
3780: 20 6e 29 0a 09 20 20 20 20 28 69 66 20 28 6e 75   n)..    (if (nu
3790: 6c 6c 3f 20 74 61 6c 29 20 23 66 20 28 6c 6f 6f  ll? tal) #f (loo
37a0: 70 20 28 63 61 72 20 74 61 6c 29 28 63 64 72 20  p (car tal)(cdr 
37b0: 74 61 6c 29 28 2b 20 6e 20 31 29 29 29 29 29 29  tal)(+ n 1))))))
37c0: 29 0a 09 20 20 20 20 0a 3b 3b 3d 3d 3d 3d 3d 3d  )..    .;;======
37d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
37e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
37f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3800: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3810: 0a 3b 3b 20 20 52 20 55 20 4e 20 53 0a 3b 3b 3d  .;;  R U N S.;;=
3820: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3830: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3840: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3850: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3860: 3d 3d 3d 3d 3d 0a 0a 28 64 65 66 69 6e 65 20 28  =====..(define (
3870: 72 75 6e 73 3a 67 65 74 2d 73 74 64 2d 72 75 6e  runs:get-std-run
3880: 2d 66 69 65 6c 64 73 20 6b 65 79 73 20 72 65 6d  -fields keys rem
3890: 66 69 65 6c 64 73 29 0a 20 20 28 6c 65 74 2a 20  fields).  (let* 
38a0: 28 28 68 65 61 64 65 72 20 20 20 20 28 61 70 70  ((header    (app
38b0: 65 6e 64 20 28 6d 61 70 20 6b 65 79 3a 67 65 74  end (map key:get
38c0: 2d 66 69 65 6c 64 6e 61 6d 65 20 6b 65 79 73 29  -fieldname keys)
38d0: 0a 09 09 09 20 20 20 20 72 65 6d 66 69 65 6c 64  ....    remfield
38e0: 73 29 29 0a 09 20 28 6b 65 79 73 74 72 20 20 20  s)).. (keystr   
38f0: 20 28 63 6f 6e 63 20 28 6b 65 79 73 2d 3e 6b 65   (conc (keys->ke
3900: 79 73 74 72 20 6b 65 79 73 29 20 22 2c 22 0a 09  ystr keys) ","..
3910: 09 09 20 20 28 73 74 72 69 6e 67 2d 69 6e 74 65  ..  (string-inte
3920: 72 73 70 65 72 73 65 20 72 65 6d 66 69 65 6c 64  rsperse remfield
3930: 73 20 22 2c 22 29 29 29 29 0a 20 20 20 20 28 6c  s ",")))).    (l
3940: 69 73 74 20 6b 65 79 73 74 72 20 68 65 61 64 65  ist keystr heade
3950: 72 29 29 29 0a 0a 3b 3b 20 57 41 53 20 64 62 2d  r)))..;; WAS db-
3960: 67 65 74 2d 72 75 6e 73 20 46 49 58 4d 45 20 49  get-runs FIXME I
3970: 4e 20 52 45 4d 41 49 4e 49 4e 47 20 43 4f 44 45  N REMAINING CODE
3980: 0a 3b 3b 0a 3b 3b 20 4d 45 52 47 45 20 54 48 49  .;;.;; MERGE THI
3990: 53 20 57 49 54 48 20 64 62 3a 67 65 74 2d 72 75  S WITH db:get-ru
39a0: 6e 73 2c 20 61 63 63 69 64 65 6e 74 6c 79 20 77  ns, accidently w
39b0: 72 6f 74 65 20 69 74 20 74 77 69 63 65 0a 3b 3b  rote it twice.;;
39c0: 0a 3b 3b 20 72 65 70 6c 61 63 65 20 68 65 61 64  .;; replace head
39d0: 65 72 20 61 6e 64 20 6b 65 79 73 74 72 20 77 69  er and keystr wi
39e0: 74 68 20 61 20 63 61 6c 6c 20 74 6f 20 72 75 6e  th a call to run
39f0: 73 3a 67 65 74 2d 73 74 64 2d 72 75 6e 2d 66 69  s:get-std-run-fi
3a00: 65 6c 64 73 0a 3b 3b 0a 3b 3b 20 6b 65 79 70 61  elds.;;.;; keypa
3a10: 74 74 73 3a 20 28 20 28 4b 45 59 31 20 22 61 62  tts: ( (KEY1 "ab
3a20: 63 25 64 65 66 22 29 28 4b 45 59 32 20 22 25 22  c%def")(KEY2 "%"
3a30: 29 20 29 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 28  ) ).;;.(define (
3a40: 64 62 3a 67 65 74 2d 72 75 6e 73 20 64 62 20 72  db:get-runs db r
3a50: 75 6e 70 61 74 74 20 63 6f 75 6e 74 20 6f 66 66  unpatt count off
3a60: 73 65 74 20 6b 65 79 70 61 74 74 73 29 0a 20 20  set keypatts).  
3a70: 28 6c 65 74 2a 20 28 28 72 65 73 20 20 20 20 20  (let* ((res     
3a80: 20 27 28 29 29 0a 09 20 28 6b 65 79 73 20 20 20   '()).. (keys   
3a90: 20 20 20 28 64 62 2d 67 65 74 2d 6b 65 79 73 20     (db-get-keys 
3aa0: 64 62 29 29 0a 09 20 28 72 65 6d 66 69 65 6c 64  db)).. (remfield
3ab0: 73 20 28 6c 69 73 74 20 22 69 64 22 20 22 72 75  s (list "id" "ru
3ac0: 6e 6e 61 6d 65 22 20 22 73 74 61 74 65 22 20 22  nname" "state" "
3ad0: 73 74 61 74 75 73 22 20 22 6f 77 6e 65 72 22 20  status" "owner" 
3ae0: 22 65 76 65 6e 74 5f 74 69 6d 65 22 29 29 0a 09  "event_time"))..
3af0: 20 28 68 65 61 64 65 72 20 20 20 20 28 61 70 70   (header    (app
3b00: 65 6e 64 20 28 6d 61 70 20 6b 65 79 3a 67 65 74  end (map key:get
3b10: 2d 66 69 65 6c 64 6e 61 6d 65 20 6b 65 79 73 29  -fieldname keys)
3b20: 0a 09 09 09 20 20 20 20 72 65 6d 66 69 65 6c 64  ....    remfield
3b30: 73 29 29 0a 09 20 28 6b 65 79 73 74 72 20 20 20  s)).. (keystr   
3b40: 20 28 63 6f 6e 63 20 28 6b 65 79 73 2d 3e 6b 65   (conc (keys->ke
3b50: 79 73 74 72 20 6b 65 79 73 29 20 22 2c 22 0a 09  ystr keys) ","..
3b60: 09 09 20 20 28 73 74 72 69 6e 67 2d 69 6e 74 65  ..  (string-inte
3b70: 72 73 70 65 72 73 65 20 72 65 6d 66 69 65 6c 64  rsperse remfield
3b80: 73 20 22 2c 22 29 29 29 0a 09 20 28 71 72 79 73  s ","))).. (qrys
3b90: 74 72 20 20 20 20 28 63 6f 6e 63 20 22 53 45 4c  tr    (conc "SEL
3ba0: 45 43 54 20 22 20 6b 65 79 73 74 72 20 22 20 46  ECT " keystr " F
3bb0: 52 4f 4d 20 72 75 6e 73 20 57 48 45 52 45 20 72  ROM runs WHERE r
3bc0: 75 6e 6e 61 6d 65 20 4c 49 4b 45 20 3f 20 22 0a  unname LIKE ? ".
3bd0: 09 09 09 20 20 3b 3b 20 47 65 6e 65 72 61 74 65  ...  ;; Generate
3be0: 3a 20 22 20 41 4e 44 20 78 20 4c 49 4b 45 20 27  : " AND x LIKE '
3bf0: 6b 65 79 70 61 74 74 27 20 2e 2e 2e 22 0a 09 09  keypatt' ..."...
3c00: 09 20 20 28 69 66 20 28 6e 75 6c 6c 3f 20 6b 65  .  (if (null? ke
3c10: 79 70 61 74 74 73 29 20 22 22 0a 09 09 09 20 20  ypatts) ""....  
3c20: 20 20 20 20 28 63 6f 6e 63 20 22 20 41 4e 44 20      (conc " AND 
3c30: 22 0a 09 09 09 09 20 20 20 20 28 73 74 72 69 6e  ".....    (strin
3c40: 67 2d 6a 6f 69 6e 20 0a 09 09 09 09 20 20 20 20  g-join .....    
3c50: 20 28 6d 61 70 20 28 6c 61 6d 62 64 61 20 28 6b   (map (lambda (k
3c60: 65 79 70 61 74 74 29 0a 09 09 09 09 09 20 20 20  eypatt)......   
3c70: 20 28 6c 65 74 20 28 28 6b 65 79 20 20 28 63 61   (let ((key  (ca
3c80: 72 20 6b 65 79 70 61 74 74 29 29 0a 09 09 09 09  r keypatt)).....
3c90: 09 09 20 20 28 70 61 74 74 20 28 63 61 64 72 20  ..  (patt (cadr 
3ca0: 6b 65 79 70 61 74 74 29 29 29 0a 09 09 09 09 09  keypatt)))......
3cb0: 20 20 20 20 20 20 28 63 6f 6e 63 20 6b 65 79 20        (conc key 
3cc0: 22 20 4c 49 4b 45 20 27 22 20 70 61 74 74 20 22  " LIKE '" patt "
3cd0: 27 22 29 29 29 0a 09 09 09 09 09 20 20 6b 65 79  '")))......  key
3ce0: 70 61 74 74 73 29 0a 09 09 09 09 20 20 20 20 20  patts).....     
3cf0: 22 20 41 4e 44 20 22 29 29 29 0a 09 09 09 20 20  " AND ")))....  
3d00: 22 20 4f 52 44 45 52 20 42 59 20 65 76 65 6e 74  " ORDER BY event
3d10: 5f 74 69 6d 65 20 44 45 53 43 20 22 0a 09 09 09  _time DESC "....
3d20: 20 20 28 69 66 20 28 6e 75 6d 62 65 72 3f 20 63    (if (number? c
3d30: 6f 75 6e 74 29 0a 09 09 09 20 20 20 20 20 20 28  ount)....      (
3d40: 63 6f 6e 63 20 22 20 4c 49 4d 49 54 20 22 20 63  conc " LIMIT " c
3d50: 6f 75 6e 74 29 0a 09 09 09 20 20 20 20 20 20 22  ount)....      "
3d60: 22 29 0a 09 09 09 20 20 28 69 66 20 28 6e 75 6d  ")....  (if (num
3d70: 62 65 72 3f 20 6f 66 66 73 65 74 29 0a 09 09 09  ber? offset)....
3d80: 20 20 20 20 20 20 28 63 6f 6e 63 20 22 20 4f 46        (conc " OF
3d90: 46 53 45 54 20 22 20 6f 66 66 73 65 74 29 0a 09  FSET " offset)..
3da0: 09 09 20 20 20 20 20 20 22 22 29 29 29 29 0a 20  ..      "")))). 
3db0: 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20     (debug:print 
3dc0: 34 20 22 64 62 3a 67 65 74 2d 72 75 6e 73 20 71  4 "db:get-runs q
3dd0: 72 79 73 74 72 3a 20 22 20 71 72 79 73 74 72 20  rystr: " qrystr 
3de0: 22 5c 6e 6b 65 79 70 61 74 74 73 3a 20 22 20 6b  "\nkeypatts: " k
3df0: 65 79 70 61 74 74 73 20 22 5c 6e 20 20 6f 66 66  eypatts "\n  off
3e00: 73 65 74 3a 20 22 20 6f 66 66 73 65 74 20 22 20  set: " offset " 
3e10: 6c 69 6d 69 74 3a 20 22 20 63 6f 75 6e 74 29 0a  limit: " count).
3e20: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72      (sqlite3:for
3e30: 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28  -each-row.     (
3e40: 6c 61 6d 62 64 61 20 28 61 20 2e 20 78 29 0a 20  lambda (a . x). 
3e50: 20 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20        (set! res 
3e60: 28 63 6f 6e 73 20 28 61 70 70 6c 79 20 76 65 63  (cons (apply vec
3e70: 74 6f 72 20 61 20 78 29 20 72 65 73 29 29 29 0a  tor a x) res))).
3e80: 20 20 20 20 20 64 62 0a 20 20 20 20 20 71 72 79       db.     qry
3e90: 73 74 72 0a 20 20 20 20 20 72 75 6e 70 61 74 74  str.     runpatt
3ea0: 29 0a 20 20 20 20 28 76 65 63 74 6f 72 20 68 65  ).    (vector he
3eb0: 61 64 65 72 20 72 65 73 29 29 29 0a 0a 3b 3b 20  ader res)))..;; 
3ec0: 6a 75 73 74 20 67 65 74 20 63 6f 75 6e 74 20 6f  just get count o
3ed0: 66 20 72 75 6e 73 0a 28 64 65 66 69 6e 65 20 28  f runs.(define (
3ee0: 64 62 3a 67 65 74 2d 6e 75 6d 2d 72 75 6e 73 20  db:get-num-runs 
3ef0: 64 62 20 72 75 6e 70 61 74 74 29 0a 20 20 28 6c  db runpatt).  (l
3f00: 65 74 20 28 28 6e 75 6d 72 75 6e 73 20 30 29 29  et ((numruns 0))
3f10: 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f  .    (sqlite3:fo
3f20: 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20 20 20  r-each-row .    
3f30: 20 28 6c 61 6d 62 64 61 20 28 63 6f 75 6e 74 29   (lambda (count)
3f40: 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 6e 75  .       (set! nu
3f50: 6d 72 75 6e 73 20 63 6f 75 6e 74 29 29 0a 20 20  mruns count)).  
3f60: 20 20 20 64 62 0a 20 20 20 20 20 22 53 45 4c 45     db.     "SELE
3f70: 43 54 20 43 4f 55 4e 54 28 69 64 29 20 46 52 4f  CT COUNT(id) FRO
3f80: 4d 20 72 75 6e 73 20 57 48 45 52 45 20 72 75 6e  M runs WHERE run
3f90: 6e 61 6d 65 20 4c 49 4b 45 20 3f 3b 22 20 72 75  name LIKE ?;" ru
3fa0: 6e 70 61 74 74 29 0a 20 20 20 20 6e 75 6d 72 75  npatt).    numru
3fb0: 6e 73 29 29 0a 0a 0a 3b 3b 20 75 73 65 20 28 67  ns))...;; use (g
3fc0: 65 74 2d 76 61 6c 75 65 2d 62 79 2d 68 65 61 64  et-value-by-head
3fd0: 65 72 20 28 64 62 3a 67 65 74 2d 68 65 61 64 65  er (db:get-heade
3fe0: 72 20 72 75 6e 69 6e 66 6f 29 28 64 62 3a 67 65  r runinfo)(db:ge
3ff0: 74 2d 72 6f 77 20 72 75 6e 69 6e 66 6f 29 29 0a  t-row runinfo)).
4000: 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d  (define (db:get-
4010: 72 75 6e 2d 69 6e 66 6f 20 64 62 20 72 75 6e 2d  run-info db run-
4020: 69 64 29 0a 20 20 28 6c 65 74 2a 20 28 28 72 65  id).  (let* ((re
4030: 73 20 20 20 20 20 20 23 66 29 0a 09 20 28 6b 65  s      #f).. (ke
4040: 79 73 20 20 20 20 20 20 28 64 62 2d 67 65 74 2d  ys      (db-get-
4050: 6b 65 79 73 20 64 62 29 29 0a 09 20 28 72 65 6d  keys db)).. (rem
4060: 66 69 65 6c 64 73 20 28 6c 69 73 74 20 22 69 64  fields (list "id
4070: 22 20 22 72 75 6e 6e 61 6d 65 22 20 22 73 74 61  " "runname" "sta
4080: 74 65 22 20 22 73 74 61 74 75 73 22 20 22 6f 77  te" "status" "ow
4090: 6e 65 72 22 20 22 65 76 65 6e 74 5f 74 69 6d 65  ner" "event_time
40a0: 22 29 29 0a 09 20 28 68 65 61 64 65 72 20 20 20  ")).. (header   
40b0: 20 28 61 70 70 65 6e 64 20 28 6d 61 70 20 6b 65   (append (map ke
40c0: 79 3a 67 65 74 2d 66 69 65 6c 64 6e 61 6d 65 20  y:get-fieldname 
40d0: 6b 65 79 73 29 0a 09 09 09 20 20 20 20 72 65 6d  keys)....    rem
40e0: 66 69 65 6c 64 73 29 29 0a 09 20 28 6b 65 79 73  fields)).. (keys
40f0: 74 72 20 20 20 20 28 63 6f 6e 63 20 28 6b 65 79  tr    (conc (key
4100: 73 2d 3e 6b 65 79 73 74 72 20 6b 65 79 73 29 20  s->keystr keys) 
4110: 22 2c 22 0a 09 09 09 20 20 28 73 74 72 69 6e 67  ","....  (string
4120: 2d 69 6e 74 65 72 73 70 65 72 73 65 20 72 65 6d  -intersperse rem
4130: 66 69 65 6c 64 73 20 22 2c 22 29 29 29 29 0a 20  fields ",")))). 
4140: 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20     (debug:print 
4150: 30 20 22 64 62 3a 67 65 74 2d 72 75 6e 2d 69 6e  0 "db:get-run-in
4160: 66 6f 20 72 75 6e 2d 69 64 3a 20 22 20 72 75 6e  fo run-id: " run
4170: 2d 69 64 20 22 20 68 65 61 64 65 72 3a 20 22 20  -id " header: " 
4180: 68 65 61 64 65 72 20 22 20 6b 65 79 73 74 72 3a  header " keystr:
4190: 20 22 20 6b 65 79 73 74 72 29 0a 20 20 20 20 28   " keystr).    (
41a0: 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68  sqlite3:for-each
41b0: 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 64  -row.     (lambd
41c0: 61 20 28 61 20 2e 20 78 29 0a 20 20 20 20 20 20  a (a . x).      
41d0: 20 28 73 65 74 21 20 72 65 73 20 28 61 70 70 6c   (set! res (appl
41e0: 79 20 76 65 63 74 6f 72 20 61 20 78 29 29 29 0a  y vector a x))).
41f0: 20 20 20 20 20 64 62 0a 20 20 20 20 20 28 63 6f       db.     (co
4200: 6e 63 20 22 53 45 4c 45 43 54 20 22 20 6b 65 79  nc "SELECT " key
4210: 73 74 72 20 22 20 46 52 4f 4d 20 72 75 6e 73 20  str " FROM runs 
4220: 57 48 45 52 45 20 69 64 3d 3f 3b 22 29 0a 20 20  WHERE id=?;").  
4230: 20 20 20 72 75 6e 2d 69 64 29 0a 20 20 20 20 28     run-id).    (
4240: 76 65 63 74 6f 72 20 68 65 61 64 65 72 20 72 65  vector header re
4250: 73 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64  s)))..(define (d
4260: 62 3a 73 65 74 2d 63 6f 6d 6d 65 6e 74 2d 66 6f  b:set-comment-fo
4270: 72 2d 72 75 6e 20 64 62 20 72 75 6e 2d 69 64 20  r-run db run-id 
4280: 63 6f 6d 6d 65 6e 74 29 0a 20 20 28 73 71 6c 69  comment).  (sqli
4290: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22  te3:execute db "
42a0: 55 50 44 41 54 45 20 72 75 6e 73 20 53 45 54 20  UPDATE runs SET 
42b0: 63 6f 6d 6d 65 6e 74 3d 3f 20 57 48 45 52 45 20  comment=? WHERE 
42c0: 69 64 3d 3f 3b 22 20 63 6f 6d 6d 65 6e 74 20 72  id=?;" comment r
42d0: 75 6e 2d 69 64 29 29 0a 0a 3b 3b 20 64 6f 65 73  un-id))..;; does
42e0: 20 6e 6f 74 20 28 6f 62 76 69 6f 75 73 6c 79 21   not (obviously!
42f0: 29 20 72 65 6d 6f 76 65 64 20 64 65 70 65 6e 64  ) removed depend
4300: 65 6e 74 20 64 61 74 61 2e 20 0a 28 64 65 66 69  ent data. .(defi
4310: 6e 65 20 28 64 62 3a 64 65 6c 65 74 65 2d 72 75  ne (db:delete-ru
4320: 6e 20 64 62 20 72 75 6e 2d 69 64 29 0a 20 20 28  n db run-id).  (
4330: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
4340: 64 62 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  db "DELETE FROM 
4350: 72 75 6e 73 20 57 48 45 52 45 20 69 64 3d 3f 3b  runs WHERE id=?;
4360: 22 20 72 75 6e 2d 69 64 29 29 0a 0a 28 64 65 66  " run-id))..(def
4370: 69 6e 65 20 28 64 62 3a 75 70 64 61 74 65 2d 72  ine (db:update-r
4380: 75 6e 2d 65 76 65 6e 74 5f 74 69 6d 65 20 64 62  un-event_time db
4390: 20 72 75 6e 2d 69 64 29 0a 20 20 28 73 71 6c 69   run-id).  (sqli
43a0: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22  te3:execute db "
43b0: 55 50 44 41 54 45 20 72 75 6e 73 20 53 45 54 20  UPDATE runs SET 
43c0: 65 76 65 6e 74 5f 74 69 6d 65 3d 73 74 72 66 74  event_time=strft
43d0: 69 6d 65 28 27 25 73 27 2c 27 6e 6f 77 27 29 20  ime('%s','now') 
43e0: 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 72 75 6e  WHERE id=?;" run
43f0: 2d 69 64 29 29 20 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d  -id)) ..;;======
4400: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4410: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4420: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4430: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4440: 0a 3b 3b 20 20 54 20 45 20 53 20 54 20 53 0a 3b  .;;  T E S T S.;
4450: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;===============
4460: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4470: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4480: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4490: 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 73 74 61 74  =======..;; stat
44a0: 65 73 20 61 6e 64 20 73 74 61 74 75 73 65 73 20  es and statuses 
44b0: 61 72 65 20 6c 69 73 74 73 2c 20 74 75 72 6e 20  are lists, turn 
44c0: 74 68 65 6d 20 69 6e 74 6f 20 28 22 50 41 53 53  them into ("PASS
44d0: 22 2c 22 46 41 49 4c 22 2e 2e 2e 29 20 61 6e 64  ","FAIL"...) and
44e0: 20 75 73 65 20 4e 4f 54 20 49 4e 0a 3b 3b 20 69   use NOT IN.;; i
44f0: 2e 65 2e 20 74 68 65 73 65 20 6c 69 73 74 73 20  .e. these lists 
4500: 64 65 66 69 6e 65 20 77 68 61 74 20 74 6f 20 4e  define what to N
4510: 4f 54 20 73 68 6f 77 2e 0a 3b 3b 20 73 74 61 74  OT show..;; stat
4520: 65 73 20 61 6e 64 20 73 74 61 74 75 73 65 73 20  es and statuses 
4530: 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20  are required to 
4540: 62 65 20 6c 69 73 74 73 2c 20 65 6d 70 74 79 20  be lists, empty 
4550: 69 73 20 6f 6b 0a 28 64 65 66 69 6e 65 20 28 64  is ok.(define (d
4560: 62 2d 67 65 74 2d 74 65 73 74 73 2d 66 6f 72 2d  b-get-tests-for-
4570: 72 75 6e 20 64 62 20 72 75 6e 2d 69 64 20 74 65  run db run-id te
4580: 73 74 70 61 74 74 20 69 74 65 6d 70 61 74 74 20  stpatt itempatt 
4590: 73 74 61 74 65 73 20 73 74 61 74 75 73 65 73 29  states statuses)
45a0: 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20 27 28  .  (let ((res '(
45b0: 29 29 0a 09 28 73 74 61 74 65 73 2d 73 74 72 20  ))..(states-str 
45c0: 20 20 20 28 63 6f 6e 63 20 22 28 27 22 20 28 73     (conc "('" (s
45d0: 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73  tring-interspers
45e0: 65 20 73 74 61 74 65 73 20 20 20 22 27 2c 27 22  e states   "','"
45f0: 29 20 22 27 29 22 29 29 0a 09 28 73 74 61 74 75  ) "')"))..(statu
4600: 73 65 73 2d 73 74 72 20 20 28 63 6f 6e 63 20 22  ses-str  (conc "
4610: 28 27 22 20 28 73 74 72 69 6e 67 2d 69 6e 74 65  ('" (string-inte
4620: 72 73 70 65 72 73 65 20 73 74 61 74 75 73 65 73  rsperse statuses
4630: 20 22 27 2c 27 22 29 20 22 27 29 22 29 29 0a 09   "','") "')"))..
4640: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66  ).    (sqlite3:f
4650: 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20 20  or-each-row .   
4660: 20 20 28 6c 61 6d 62 64 61 20 28 69 64 20 72 75    (lambda (id ru
4670: 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 73 74  n-id testname st
4680: 61 74 65 20 73 74 61 74 75 73 20 65 76 65 6e 74  ate status event
4690: 2d 74 69 6d 65 20 68 6f 73 74 20 63 70 75 6c 6f  -time host cpulo
46a0: 61 64 20 64 69 73 6b 66 72 65 65 20 75 6e 61 6d  ad diskfree unam
46b0: 65 20 72 75 6e 64 69 72 20 69 74 65 6d 2d 70 61  e rundir item-pa
46c0: 74 68 20 72 75 6e 2d 64 75 72 61 74 69 6f 6e 20  th run-duration 
46d0: 66 69 6e 61 6c 2d 6c 6f 67 66 20 63 6f 6d 6d 65  final-logf comme
46e0: 6e 74 29 0a 20 20 20 20 20 20 20 28 73 65 74 21  nt).       (set!
46f0: 20 72 65 73 20 28 63 6f 6e 73 20 28 76 65 63 74   res (cons (vect
4700: 6f 72 20 69 64 20 72 75 6e 2d 69 64 20 74 65 73  or id run-id tes
4710: 74 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61 74  tname state stat
4720: 75 73 20 65 76 65 6e 74 2d 74 69 6d 65 20 68 6f  us event-time ho
4730: 73 74 20 63 70 75 6c 6f 61 64 20 64 69 73 6b 66  st cpuload diskf
4740: 72 65 65 20 75 6e 61 6d 65 20 72 75 6e 64 69 72  ree uname rundir
4750: 20 69 74 65 6d 2d 70 61 74 68 20 72 75 6e 2d 64   item-path run-d
4760: 75 72 61 74 69 6f 6e 20 66 69 6e 61 6c 2d 6c 6f  uration final-lo
4770: 67 66 20 63 6f 6d 6d 65 6e 74 29 20 72 65 73 29  gf comment) res)
4780: 29 29 0a 20 20 20 20 20 64 62 20 0a 20 20 20 20  )).     db .    
4790: 20 28 63 6f 6e 63 20 22 53 45 4c 45 43 54 20 69   (conc "SELECT i
47a0: 64 2c 72 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d  d,run_id,testnam
47b0: 65 2c 73 74 61 74 65 2c 73 74 61 74 75 73 2c 65  e,state,status,e
47c0: 76 65 6e 74 5f 74 69 6d 65 2c 68 6f 73 74 2c 63  vent_time,host,c
47d0: 70 75 6c 6f 61 64 2c 64 69 73 6b 66 72 65 65 2c  puload,diskfree,
47e0: 75 6e 61 6d 65 2c 72 75 6e 64 69 72 2c 69 74 65  uname,rundir,ite
47f0: 6d 5f 70 61 74 68 2c 72 75 6e 5f 64 75 72 61 74  m_path,run_durat
4800: 69 6f 6e 2c 66 69 6e 61 6c 5f 6c 6f 67 66 2c 63  ion,final_logf,c
4810: 6f 6d 6d 65 6e 74 20 22 0a 09 20 20 20 22 20 46  omment "..   " F
4820: 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 20  ROM tests WHERE 
4830: 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73  run_id=? AND tes
4840: 74 6e 61 6d 65 20 6c 69 6b 65 20 3f 20 41 4e 44  tname like ? AND
4850: 20 69 74 65 6d 5f 70 61 74 68 20 4c 49 4b 45 20   item_path LIKE 
4860: 3f 20 22 20 0a 09 20 20 20 22 20 41 4e 44 20 4e  ? " ..   " AND N
4870: 4f 54 20 28 73 74 61 74 65 20 69 6e 20 22 20 73  OT (state in " s
4880: 74 61 74 65 73 2d 73 74 72 20 22 20 41 4e 44 20  tates-str " AND 
4890: 73 74 61 74 75 73 20 49 4e 20 22 20 73 74 61 74  status IN " stat
48a0: 75 73 65 73 2d 73 74 72 20 22 29 20 22 0a 09 20  uses-str ") ".. 
48b0: 20 20 22 20 4f 52 44 45 52 20 42 59 20 69 64 20    " ORDER BY id 
48c0: 44 45 53 43 3b 22 29 0a 20 20 20 20 20 72 75 6e  DESC;").     run
48d0: 2d 69 64 0a 20 20 20 20 20 28 69 66 20 74 65 73  -id.     (if tes
48e0: 74 70 61 74 74 20 74 65 73 74 70 61 74 74 20 22  tpatt testpatt "
48f0: 25 22 29 0a 20 20 20 20 20 28 69 66 20 69 74 65  %").     (if ite
4900: 6d 70 61 74 74 20 69 74 65 6d 70 61 74 74 20 22  mpatt itempatt "
4910: 25 22 29 29 0a 20 20 20 20 72 65 73 29 29 0a 0a  %")).    res))..
4920: 3b 3b 20 74 68 69 73 20 6f 6e 65 20 69 73 20 61  ;; this one is a
4930: 20 62 69 74 20 62 72 6f 6b 65 6e 20 42 55 47 20   bit broken BUG 
4940: 46 49 58 4d 45 0a 28 64 65 66 69 6e 65 20 28 64  FIXME.(define (d
4950: 62 3a 64 65 6c 65 74 65 2d 74 65 73 74 2d 73 74  b:delete-test-st
4960: 65 70 2d 72 65 63 6f 72 64 73 20 64 62 20 72 75  ep-records db ru
4970: 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69  n-id test-name i
4980: 74 65 6d 64 61 74 29 0a 20 20 28 73 71 6c 69 74  temdat).  (sqlit
4990: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 44  e3:execute db "D
49a0: 45 4c 45 54 45 20 46 52 4f 4d 20 74 65 73 74 5f  ELETE FROM test_
49b0: 73 74 65 70 73 20 57 48 45 52 45 20 74 65 73 74  steps WHERE test
49c0: 5f 69 64 20 69 6e 20 28 53 45 4c 45 43 54 20 69  _id in (SELECT i
49d0: 64 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45  d FROM tests WHE
49e0: 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20  RE run_id=? AND 
49f0: 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69  testname=? AND i
4a00: 74 65 6d 5f 70 61 74 68 3d 3f 29 3b 22 20 0a 09  tem_path=?);" ..
4a10: 09 20 20 20 72 75 6e 2d 69 64 20 74 65 73 74 2d  .   run-id test-
4a20: 6e 61 6d 65 20 28 69 74 65 6d 2d 6c 69 73 74 2d  name (item-list-
4a30: 3e 70 61 74 68 20 69 74 65 6d 64 61 74 29 29 29  >path itemdat)))
4a40: 0a 3b 3b 20 0a 28 64 65 66 69 6e 65 20 28 64 62  .;; .(define (db
4a50: 3a 64 65 6c 65 74 65 2d 74 65 73 74 2d 72 65 63  :delete-test-rec
4a60: 6f 72 64 73 20 64 62 20 74 65 73 74 2d 69 64 29  ords db test-id)
4a70: 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63  .  (sqlite3:exec
4a80: 75 74 65 20 64 62 20 22 44 45 4c 45 54 45 20 46  ute db "DELETE F
4a90: 52 4f 4d 20 74 65 73 74 5f 73 74 65 70 73 20 57  ROM test_steps W
4aa0: 48 45 52 45 20 74 65 73 74 5f 69 64 3d 3f 3b 22  HERE test_id=?;"
4ab0: 20 74 65 73 74 2d 69 64 29 0a 20 20 28 73 71 6c   test-id).  (sql
4ac0: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
4ad0: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 65 73  "DELETE FROM tes
4ae0: 74 5f 64 61 74 61 20 20 57 48 45 52 45 20 74 65  t_data  WHERE te
4af0: 73 74 5f 69 64 3d 3f 3b 22 20 74 65 73 74 2d 69  st_id=?;" test-i
4b00: 64 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78  d).  (sqlite3:ex
4b10: 65 63 75 74 65 20 64 62 20 22 44 45 4c 45 54 45  ecute db "DELETE
4b20: 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52   FROM tests WHER
4b30: 45 20 69 64 3d 3f 3b 22 20 74 65 73 74 2d 69 64  E id=?;" test-id
4b40: 29 29 0a 0a 3b 3b 20 73 65 74 20 74 65 73 74 73  ))..;; set tests
4b50: 20 77 69 74 68 20 73 74 61 74 65 20 63 75 72 72   with state curr
4b60: 73 74 61 74 65 20 61 6e 64 20 73 74 61 74 75 73  state and status
4b70: 20 63 75 72 72 73 74 61 74 75 73 20 74 6f 20 6e   currstatus to n
4b80: 65 77 73 74 61 74 65 20 61 6e 64 20 6e 65 77 73  ewstate and news
4b90: 74 61 74 75 73 0a 3b 3b 20 75 73 65 20 63 75 72  tatus.;; use cur
4ba0: 72 73 74 61 74 65 20 3d 20 23 66 20 61 6e 64 20  rstate = #f and 
4bb0: 6f 72 20 63 75 72 72 73 74 61 74 75 73 20 3d 20  or currstatus = 
4bc0: 23 66 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 61  #f to apply to a
4bd0: 6e 79 20 73 74 61 74 65 20 6f 72 20 73 74 61 74  ny state or stat
4be0: 75 73 20 72 65 73 70 65 63 74 69 76 65 6c 79 0a  us respectively.
4bf0: 3b 3b 20 57 41 52 4e 49 4e 47 3a 20 53 51 4c 20  ;; WARNING: SQL 
4c00: 69 6e 6a 65 63 74 69 6f 6e 20 72 69 73 6b 0a 28  injection risk.(
4c10: 64 65 66 69 6e 65 20 28 64 62 3a 73 65 74 2d 74  define (db:set-t
4c20: 65 73 74 73 2d 73 74 61 74 65 2d 73 74 61 74 75  ests-state-statu
4c30: 73 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74  s db run-id test
4c40: 6e 61 6d 65 73 20 63 75 72 72 73 74 61 74 65 20  names currstate 
4c50: 63 75 72 72 73 74 61 74 75 73 20 6e 65 77 73 74  currstatus newst
4c60: 61 74 65 20 6e 65 77 73 74 61 74 75 73 29 0a 20  ate newstatus). 
4c70: 20 28 66 6f 72 2d 65 61 63 68 20 28 6c 61 6d 62   (for-each (lamb
4c80: 64 61 20 28 74 65 73 74 6e 61 6d 65 29 0a 09 20  da (testname).. 
4c90: 20 20 20 20 20 28 6c 65 74 20 28 28 71 72 79 20       (let ((qry 
4ca0: 28 63 6f 6e 63 20 22 55 50 44 41 54 45 20 74 65  (conc "UPDATE te
4cb0: 73 74 73 20 53 45 54 20 73 74 61 74 65 3d 3f 2c  sts SET state=?,
4cc0: 73 74 61 74 75 73 3d 3f 20 57 48 45 52 45 20 22  status=? WHERE "
4cd0: 0a 09 09 09 09 09 28 69 66 20 63 75 72 72 73 74  ......(if currst
4ce0: 61 74 65 20 20 28 63 6f 6e 63 20 22 73 74 61 74  ate  (conc "stat
4cf0: 65 3d 27 22 20 63 75 72 72 73 74 61 74 65 20 22  e='" currstate "
4d00: 27 20 41 4e 44 20 22 29 20 22 22 29 0a 09 09 09  ' AND ") "")....
4d10: 09 09 28 69 66 20 63 75 72 72 73 74 61 74 75 73  ..(if currstatus
4d20: 20 28 63 6f 6e 63 20 22 73 74 61 74 75 73 3d 27   (conc "status='
4d30: 22 20 63 75 72 72 73 74 61 74 75 73 20 22 27 20  " currstatus "' 
4d40: 41 4e 44 20 22 29 20 22 22 29 0a 09 09 09 09 09  AND ") "")......
4d50: 22 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74  " run_id=? AND t
4d60: 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 4e 4f  estname=? AND NO
4d70: 54 20 28 69 74 65 6d 5f 70 61 74 68 3d 27 27 20  T (item_path='' 
4d80: 41 4e 44 20 74 65 73 74 6e 61 6d 65 20 69 6e 20  AND testname in 
4d90: 28 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54  (SELECT DISTINCT
4da0: 20 74 65 73 74 6e 61 6d 65 20 46 52 4f 4d 20 74   testname FROM t
4db0: 65 73 74 73 20 57 48 45 52 45 20 74 65 73 74 6e  ests WHERE testn
4dc0: 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70  ame=? AND item_p
4dd0: 61 74 68 20 21 3d 20 27 27 29 29 3b 22 29 29 29  ath != ''));")))
4de0: 0a 09 09 3b 3b 28 64 65 62 75 67 3a 70 72 69 6e  ...;;(debug:prin
4df0: 74 20 30 20 22 51 52 59 3a 20 22 20 71 72 79 29  t 0 "QRY: " qry)
4e00: 0a 09 09 28 73 71 6c 69 74 65 33 3a 65 78 65 63  ...(sqlite3:exec
4e10: 75 74 65 20 64 62 20 71 72 79 20 72 75 6e 2d 69  ute db qry run-i
4e20: 64 20 6e 65 77 73 74 61 74 65 20 6e 65 77 73 74  d newstate newst
4e30: 61 74 75 73 20 74 65 73 74 6e 61 6d 65 20 74 65  atus testname te
4e40: 73 74 6e 61 6d 65 29 29 29 0a 09 20 20 20 20 74  stname)))..    t
4e50: 65 73 74 6e 61 6d 65 73 29 29 0a 0a 28 64 65 66  estnames))..(def
4e60: 69 6e 65 20 28 64 62 3a 64 65 6c 65 74 65 2d 74  ine (db:delete-t
4e70: 65 73 74 73 2d 69 6e 2d 73 74 61 74 65 20 64 62  ests-in-state db
4e80: 20 72 75 6e 2d 69 64 20 73 74 61 74 65 29 0a 20   run-id state). 
4e90: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
4ea0: 65 20 64 62 20 22 44 45 4c 45 54 45 20 46 52 4f  e db "DELETE FRO
4eb0: 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 73 74  M tests WHERE st
4ec0: 61 74 65 3d 3f 20 41 4e 44 20 72 75 6e 5f 69 64  ate=? AND run_id
4ed0: 3d 3f 3b 22 20 73 74 61 74 65 20 72 75 6e 2d 69  =?;" state run-i
4ee0: 64 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62  d))..(define (db
4ef0: 3a 74 65 73 74 2d 73 65 74 2d 73 74 61 74 65 2d  :test-set-state-
4f00: 73 74 61 74 75 73 2d 62 79 2d 69 64 20 64 62 20  status-by-id db 
4f10: 74 65 73 74 2d 69 64 20 6e 65 77 73 74 61 74 65  test-id newstate
4f20: 20 6e 65 77 73 74 61 74 75 73 20 6e 65 77 63 6f   newstatus newco
4f30: 6d 6d 65 6e 74 29 0a 20 20 28 69 66 20 6e 65 77  mment).  (if new
4f40: 73 74 61 74 65 20 20 20 28 73 71 6c 69 74 65 33  state   (sqlite3
4f50: 3a 65 78 65 63 75 74 65 20 64 62 20 22 55 50 44  :execute db "UPD
4f60: 41 54 45 20 74 65 73 74 73 20 53 45 54 20 73 74  ATE tests SET st
4f70: 61 74 65 3d 3f 20 20 20 57 48 45 52 45 20 69 64  ate=?   WHERE id
4f80: 3d 3f 3b 22 20 6e 65 77 73 74 61 74 65 20 20 20  =?;" newstate   
4f90: 74 65 73 74 2d 69 64 29 29 0a 20 20 28 69 66 20  test-id)).  (if 
4fa0: 6e 65 77 73 74 61 74 75 73 20 20 28 73 71 6c 69  newstatus  (sqli
4fb0: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22  te3:execute db "
4fc0: 55 50 44 41 54 45 20 74 65 73 74 73 20 53 45 54  UPDATE tests SET
4fd0: 20 73 74 61 74 75 73 3d 3f 20 20 57 48 45 52 45   status=?  WHERE
4fe0: 20 69 64 3d 3f 3b 22 20 6e 65 77 73 74 61 74 75   id=?;" newstatu
4ff0: 73 20 20 74 65 73 74 2d 69 64 29 29 0a 20 20 28  s  test-id)).  (
5000: 69 66 20 6e 65 77 63 6f 6d 6d 65 6e 74 20 28 73  if newcomment (s
5010: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64  qlite3:execute d
5020: 62 20 22 55 50 44 41 54 45 20 74 65 73 74 73 20  b "UPDATE tests 
5030: 53 45 54 20 63 6f 6d 6d 65 6e 74 3d 3f 20 57 48  SET comment=? WH
5040: 45 52 45 20 69 64 3d 3f 3b 22 20 6e 65 77 63 6f  ERE id=?;" newco
5050: 6d 6d 65 6e 74 20 74 65 73 74 2d 69 64 29 29 29  mment test-id)))
5060: 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65  ..(define (db:ge
5070: 74 2d 63 6f 75 6e 74 2d 74 65 73 74 73 2d 72 75  t-count-tests-ru
5080: 6e 6e 69 6e 67 20 64 62 29 0a 20 20 28 6c 65 74  nning db).  (let
5090: 20 28 28 72 65 73 20 30 29 29 0a 20 20 20 20 28   ((res 0)).    (
50a0: 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68  sqlite3:for-each
50b0: 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 64  -row.     (lambd
50c0: 61 20 28 63 6f 75 6e 74 29 0a 20 20 20 20 20 20  a (count).      
50d0: 20 28 73 65 74 21 20 72 65 73 20 63 6f 75 6e 74   (set! res count
50e0: 29 29 0a 20 20 20 20 20 64 62 0a 20 20 20 20 20  )).     db.     
50f0: 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 69 64  "SELECT count(id
5100: 29 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45  ) FROM tests WHE
5110: 52 45 20 73 74 61 74 65 20 3d 20 27 52 55 4e 4e  RE state = 'RUNN
5120: 49 4e 47 27 20 4f 52 20 73 74 61 74 65 20 3d 20  ING' OR state = 
5130: 27 4c 41 55 4e 43 48 45 44 27 20 4f 52 20 73 74  'LAUNCHED' OR st
5140: 61 74 65 20 3d 20 27 52 45 4d 4f 54 45 48 4f 53  ate = 'REMOTEHOS
5150: 54 53 54 41 52 54 27 3b 22 29 0a 20 20 20 20 72  TSTART';").    r
5160: 65 73 29 29 0a 0a 3b 3b 20 64 6f 6e 65 20 77 69  es))..;; done wi
5170: 74 68 20 72 75 6e 20 77 68 65 6e 3a 0a 3b 3b 20  th run when:.;; 
5180: 20 20 30 20 74 65 73 74 73 20 69 6e 20 4c 41 55    0 tests in LAU
5190: 4e 43 48 45 44 2c 20 4e 4f 54 5f 53 54 41 52 54  NCHED, NOT_START
51a0: 45 44 2c 20 52 45 4d 4f 54 45 48 4f 53 54 53 54  ED, REMOTEHOSTST
51b0: 41 52 54 2c 20 52 55 4e 4e 49 4e 47 0a 28 64 65  ART, RUNNING.(de
51c0: 66 69 6e 65 20 28 64 62 3a 65 73 74 69 6d 61 74  fine (db:estimat
51d0: 65 64 2d 74 65 73 74 73 2d 72 65 6d 61 69 6e 69  ed-tests-remaini
51e0: 6e 67 20 64 62 20 72 75 6e 2d 69 64 29 0a 20 20  ng db run-id).  
51f0: 28 6c 65 74 20 28 28 72 65 73 20 30 29 29 0a 20  (let ((res 0)). 
5200: 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d     (sqlite3:for-
5210: 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c  each-row.     (l
5220: 61 6d 62 64 61 20 28 63 6f 75 6e 74 29 0a 20 20  ambda (count).  
5230: 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20 63       (set! res c
5240: 6f 75 6e 74 29 29 0a 20 20 20 20 20 64 62 20 3b  ount)).     db ;
5250: 3b 20 4e 42 2f 2f 20 4b 49 4c 4c 52 45 51 20 6d  ; NB// KILLREQ m
5260: 65 61 6e 73 20 74 68 65 20 6a 6f 62 73 20 69 73  eans the jobs is
5270: 20 73 74 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20   still probably 
5280: 72 75 6e 6e 69 6e 67 0a 20 20 20 20 20 22 53 45  running.     "SE
5290: 4c 45 43 54 20 63 6f 75 6e 74 28 69 64 29 20 46  LECT count(id) F
52a0: 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 20  ROM tests WHERE 
52b0: 73 74 61 74 65 20 69 6e 20 28 27 4c 41 55 4e 43  state in ('LAUNC
52c0: 48 45 44 27 2c 27 4e 4f 54 5f 53 54 41 52 54 45  HED','NOT_STARTE
52d0: 44 27 2c 27 52 45 4d 4f 54 45 48 4f 53 54 53 54  D','REMOTEHOSTST
52e0: 41 52 54 27 2c 27 52 55 4e 4e 49 4e 47 27 2c 27  ART','RUNNING','
52f0: 4b 49 4c 4c 52 45 51 27 29 20 41 4e 44 20 72 75  KILLREQ') AND ru
5300: 6e 5f 69 64 3d 3f 3b 22 20 72 75 6e 2d 69 64 29  n_id=?;" run-id)
5310: 0a 20 20 20 20 72 65 73 29 29 0a 0a 3b 3b 20 4e  .    res))..;; N
5320: 42 2f 2f 20 53 79 6e 63 20 74 68 69 73 20 77 69  B// Sync this wi
5330: 74 68 20 72 75 6e 73 3a 67 65 74 2d 74 65 73 74  th runs:get-test
5340: 2d 69 6e 66 6f 0a 28 64 65 66 69 6e 65 20 28 64  -info.(define (d
5350: 62 3a 67 65 74 2d 74 65 73 74 2d 69 6e 66 6f 20  b:get-test-info 
5360: 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61  db run-id testna
5370: 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 0a 20 20  me item-path).  
5380: 28 6c 65 74 20 28 28 72 65 73 20 23 66 29 29 0a  (let ((res #f)).
5390: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72      (sqlite3:for
53a0: 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28  -each-row.     (
53b0: 6c 61 6d 62 64 61 20 28 69 64 20 72 75 6e 2d 69  lambda (id run-i
53c0: 64 20 74 65 73 74 6e 61 6d 65 20 73 74 61 74 65  d testname state
53d0: 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d 74 69   status event-ti
53e0: 6d 65 20 68 6f 73 74 20 63 70 75 6c 6f 61 64 20  me host cpuload 
53f0: 64 69 73 6b 66 72 65 65 20 75 6e 61 6d 65 20 72  diskfree uname r
5400: 75 6e 64 69 72 20 69 74 65 6d 2d 70 61 74 68 20  undir item-path 
5410: 72 75 6e 5f 64 75 72 61 74 69 6f 6e 20 66 69 6e  run_duration fin
5420: 61 6c 5f 6c 6f 67 66 20 63 6f 6d 6d 65 6e 74 20  al_logf comment 
5430: 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72  ).       (set! r
5440: 65 73 20 28 76 65 63 74 6f 72 20 69 64 20 72 75  es (vector id ru
5450: 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 73 74  n-id testname st
5460: 61 74 65 20 73 74 61 74 75 73 20 65 76 65 6e 74  ate status event
5470: 2d 74 69 6d 65 20 68 6f 73 74 20 63 70 75 6c 6f  -time host cpulo
5480: 61 64 20 64 69 73 6b 66 72 65 65 20 75 6e 61 6d  ad diskfree unam
5490: 65 20 72 75 6e 64 69 72 20 69 74 65 6d 2d 70 61  e rundir item-pa
54a0: 74 68 20 72 75 6e 5f 64 75 72 61 74 69 6f 6e 20  th run_duration 
54b0: 66 69 6e 61 6c 5f 6c 6f 67 66 20 63 6f 6d 6d 65  final_logf comme
54c0: 6e 74 20 29 29 29 0a 20 20 20 20 20 64 62 20 0a  nt ))).     db .
54d0: 20 20 20 20 20 22 53 45 4c 45 43 54 20 69 64 2c       "SELECT id,
54e0: 72 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d 65 2c  run_id,testname,
54f0: 73 74 61 74 65 2c 73 74 61 74 75 73 2c 65 76 65  state,status,eve
5500: 6e 74 5f 74 69 6d 65 2c 68 6f 73 74 2c 63 70 75  nt_time,host,cpu
5510: 6c 6f 61 64 2c 64 69 73 6b 66 72 65 65 2c 75 6e  load,diskfree,un
5520: 61 6d 65 2c 72 75 6e 64 69 72 2c 69 74 65 6d 5f  ame,rundir,item_
5530: 70 61 74 68 2c 72 75 6e 5f 64 75 72 61 74 69 6f  path,run_duratio
5540: 6e 2c 66 69 6e 61 6c 5f 6c 6f 67 66 2c 63 6f 6d  n,final_logf,com
5550: 6d 65 6e 74 20 46 52 4f 4d 20 74 65 73 74 73 20  ment FROM tests 
5560: 57 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41  WHERE run_id=? A
5570: 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e  ND testname=? AN
5580: 44 20 69 74 65 6d 5f 70 61 74 68 3d 3f 3b 22 0a  D item_path=?;".
5590: 20 20 20 20 20 72 75 6e 2d 69 64 20 74 65 73 74       run-id test
55a0: 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 0a  name item-path).
55b0: 20 20 20 20 72 65 73 29 29 0a 0a 3b 3b 20 47 65      res))..;; Ge
55c0: 74 20 74 65 73 74 20 64 61 74 61 20 75 73 69 6e  t test data usin
55d0: 67 20 74 65 73 74 5f 69 64 0a 28 64 65 66 69 6e  g test_id.(defin
55e0: 65 20 28 64 62 3a 67 65 74 2d 74 65 73 74 2d 64  e (db:get-test-d
55f0: 61 74 61 2d 62 79 2d 69 64 20 64 62 20 74 65 73  ata-by-id db tes
5600: 74 2d 69 64 29 0a 20 20 28 6c 65 74 20 28 28 72  t-id).  (let ((r
5610: 65 73 20 23 66 29 29 0a 20 20 20 20 28 73 71 6c  es #f)).    (sql
5620: 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f  ite3:for-each-ro
5630: 77 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28  w.     (lambda (
5640: 69 64 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61  id run-id testna
5650: 6d 65 20 73 74 61 74 65 20 73 74 61 74 75 73 20  me state status 
5660: 65 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73 74 20  event-time host 
5670: 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65  cpuload diskfree
5680: 20 75 6e 61 6d 65 20 72 75 6e 64 69 72 20 69 74   uname rundir it
5690: 65 6d 2d 70 61 74 68 20 72 75 6e 5f 64 75 72 61  em-path run_dura
56a0: 74 69 6f 6e 20 66 69 6e 61 6c 5f 6c 6f 67 66 20  tion final_logf 
56b0: 63 6f 6d 6d 65 6e 74 29 0a 20 20 20 20 20 20 20  comment).       
56c0: 28 73 65 74 21 20 72 65 73 20 28 76 65 63 74 6f  (set! res (vecto
56d0: 72 20 69 64 20 72 75 6e 2d 69 64 20 74 65 73 74  r id run-id test
56e0: 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61 74 75  name state statu
56f0: 73 20 65 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73  s event-time hos
5700: 74 20 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72  t cpuload diskfr
5710: 65 65 20 75 6e 61 6d 65 20 72 75 6e 64 69 72 20  ee uname rundir 
5720: 69 74 65 6d 2d 70 61 74 68 20 72 75 6e 5f 64 75  item-path run_du
5730: 72 61 74 69 6f 6e 20 66 69 6e 61 6c 5f 6c 6f 67  ration final_log
5740: 66 20 63 6f 6d 6d 65 6e 74 29 29 29 0a 20 20 20  f comment))).   
5750: 20 20 64 62 20 0a 20 20 20 20 20 22 53 45 4c 45    db .     "SELE
5760: 43 54 20 69 64 2c 72 75 6e 5f 69 64 2c 74 65 73  CT id,run_id,tes
5770: 74 6e 61 6d 65 2c 73 74 61 74 65 2c 73 74 61 74  tname,state,stat
5780: 75 73 2c 65 76 65 6e 74 5f 74 69 6d 65 2c 68 6f  us,event_time,ho
5790: 73 74 2c 63 70 75 6c 6f 61 64 2c 64 69 73 6b 66  st,cpuload,diskf
57a0: 72 65 65 2c 75 6e 61 6d 65 2c 72 75 6e 64 69 72  ree,uname,rundir
57b0: 2c 69 74 65 6d 5f 70 61 74 68 2c 72 75 6e 5f 64  ,item_path,run_d
57c0: 75 72 61 74 69 6f 6e 2c 66 69 6e 61 6c 5f 6c 6f  uration,final_lo
57d0: 67 66 2c 63 6f 6d 6d 65 6e 74 20 46 52 4f 4d 20  gf,comment FROM 
57e0: 74 65 73 74 73 20 57 48 45 52 45 20 69 64 3d 3f  tests WHERE id=?
57f0: 3b 22 0a 20 20 20 20 20 74 65 73 74 2d 69 64 29  ;".     test-id)
5800: 0a 20 20 20 20 72 65 73 29 29 0a 0a 0a 28 64 65  .    res))...(de
5810: 66 69 6e 65 20 28 64 62 3a 74 65 73 74 2d 73 65  fine (db:test-se
5820: 74 2d 63 6f 6d 6d 65 6e 74 20 64 62 20 72 75 6e  t-comment db run
5830: 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 69 74 65  -id testname ite
5840: 6d 2d 70 61 74 68 20 63 6f 6d 6d 65 6e 74 29 0a  m-path comment).
5850: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
5860: 74 65 20 0a 20 20 20 64 62 20 0a 20 20 20 22 55  te .   db .   "U
5870: 50 44 41 54 45 20 74 65 73 74 73 20 53 45 54 20  PDATE tests SET 
5880: 63 6f 6d 6d 65 6e 74 3d 3f 20 57 48 45 52 45 20  comment=? WHERE 
5890: 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73  run_id=? AND tes
58a0: 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d  tname=? AND item
58b0: 5f 70 61 74 68 3d 3f 3b 22 0a 20 20 20 20 20 63  _path=?;".     c
58c0: 6f 6d 6d 65 6e 74 20 72 75 6e 2d 69 64 20 74 65  omment run-id te
58d0: 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68  stname item-path
58e0: 29 29 0a 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 28  ))..;;.(define (
58f0: 64 62 3a 74 65 73 74 2d 73 65 74 2d 72 75 6e 64  db:test-set-rund
5900: 69 72 21 20 64 62 20 72 75 6e 2d 69 64 20 74 65  ir! db run-id te
5910: 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68  stname item-path
5920: 20 72 75 6e 64 69 72 29 0a 20 20 28 73 71 6c 69   rundir).  (sqli
5930: 74 65 33 3a 65 78 65 63 75 74 65 20 0a 20 20 20  te3:execute .   
5940: 64 62 20 0a 20 20 20 22 55 50 44 41 54 45 20 74  db .   "UPDATE t
5950: 65 73 74 73 20 53 45 54 20 72 75 6e 64 69 72 3d  ests SET rundir=
5960: 3f 20 57 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f  ? WHERE run_id=?
5970: 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20   AND testname=? 
5980: 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 3d 3f 3b  AND item_path=?;
5990: 22 0a 20 20 20 20 20 72 75 6e 64 69 72 20 72 75  ".     rundir ru
59a0: 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 69 74  n-id testname it
59b0: 65 6d 2d 70 61 74 68 29 29 0a 0a 3b 3b 3d 3d 3d  em-path))..;;===
59c0: 3d 3d 3d 3d 3d 3d 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 0a 3b 3b 20 54 65 73 74 73 20 6d 65 74  ===.;; Tests met
5a10: 61 20 64 61 74 61 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d  a data.;;=======
5a20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
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 0a  ===============.
5a60: 0a 3b 3b 20 72 65 61 64 20 74 68 65 20 72 65 63  .;; read the rec
5a70: 6f 72 64 20 67 69 76 65 6e 20 61 20 74 65 73 74  ord given a test
5a80: 6e 61 6d 65 0a 28 64 65 66 69 6e 65 20 28 64 62  name.(define (db
5a90: 3a 74 65 73 74 6d 65 74 61 2d 67 65 74 2d 72 65  :testmeta-get-re
5aa0: 63 6f 72 64 20 64 62 20 74 65 73 74 6e 61 6d 65  cord db testname
5ab0: 29 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20 23  ).  (let ((res #
5ac0: 66 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33  f)).    (sqlite3
5ad0: 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20  :for-each-row.  
5ae0: 20 20 20 28 6c 61 6d 62 64 61 20 28 69 64 20 74     (lambda (id t
5af0: 65 73 74 6e 61 6d 65 20 61 75 74 68 6f 72 20 6f  estname author o
5b00: 77 6e 65 72 20 64 65 73 63 72 69 70 74 69 6f 6e  wner description
5b10: 20 72 65 76 69 65 77 65 64 20 69 74 65 72 61 74   reviewed iterat
5b20: 65 64 20 61 76 67 5f 72 75 6e 74 69 6d 65 20 61  ed avg_runtime a
5b30: 76 67 5f 64 69 73 6b 20 74 61 67 73 29 0a 20 20  vg_disk tags).  
5b40: 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28       (set! res (
5b50: 76 65 63 74 6f 72 20 69 64 20 74 65 73 74 6e 61  vector id testna
5b60: 6d 65 20 61 75 74 68 6f 72 20 6f 77 6e 65 72 20  me author owner 
5b70: 64 65 73 63 72 69 70 74 69 6f 6e 20 72 65 76 69  description revi
5b80: 65 77 65 64 20 69 74 65 72 61 74 65 64 20 61 76  ewed iterated av
5b90: 67 5f 72 75 6e 74 69 6d 65 20 61 76 67 5f 64 69  g_runtime avg_di
5ba0: 73 6b 20 74 61 67 73 29 29 29 0a 20 20 20 20 20  sk tags))).     
5bb0: 64 62 20 22 53 45 4c 45 43 54 20 69 64 2c 74 65  db "SELECT id,te
5bc0: 73 74 6e 61 6d 65 2c 61 75 74 68 6f 72 2c 6f 77  stname,author,ow
5bd0: 6e 65 72 2c 64 65 73 63 72 69 70 74 69 6f 6e 2c  ner,description,
5be0: 72 65 76 69 65 77 65 64 2c 69 74 65 72 61 74 65  reviewed,iterate
5bf0: 64 2c 61 76 67 5f 72 75 6e 74 69 6d 65 2c 61 76  d,avg_runtime,av
5c00: 67 5f 64 69 73 6b 2c 74 61 67 73 20 46 52 4f 4d  g_disk,tags FROM
5c10: 20 74 65 73 74 5f 6d 65 74 61 20 57 48 45 52 45   test_meta WHERE
5c20: 20 74 65 73 74 6e 61 6d 65 3d 3f 3b 22 0a 20 20   testname=?;".  
5c30: 20 20 20 74 65 73 74 6e 61 6d 65 29 0a 20 20 20     testname).   
5c40: 20 72 65 73 29 29 0a 0a 3b 3b 20 63 72 65 61 74   res))..;; creat
5c50: 65 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20 66  e a new record f
5c60: 6f 72 20 61 20 67 69 76 65 6e 20 74 65 73 74 6e  or a given testn
5c70: 61 6d 65 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  ame.(define (db:
5c80: 74 65 73 74 6d 65 74 61 2d 61 64 64 2d 72 65 63  testmeta-add-rec
5c90: 6f 72 64 20 64 62 20 74 65 73 74 6e 61 6d 65 29  ord db testname)
5ca0: 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63  .  (sqlite3:exec
5cb0: 75 74 65 20 64 62 20 22 49 4e 53 45 52 54 20 4f  ute db "INSERT O
5cc0: 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 74 65  R IGNORE INTO te
5cd0: 73 74 5f 6d 65 74 61 20 28 74 65 73 74 6e 61 6d  st_meta (testnam
5ce0: 65 2c 61 75 74 68 6f 72 2c 6f 77 6e 65 72 2c 64  e,author,owner,d
5cf0: 65 73 63 72 69 70 74 69 6f 6e 2c 72 65 76 69 65  escription,revie
5d00: 77 65 64 2c 69 74 65 72 61 74 65 64 2c 61 76 67  wed,iterated,avg
5d10: 5f 72 75 6e 74 69 6d 65 2c 61 76 67 5f 64 69 73  _runtime,avg_dis
5d20: 6b 2c 74 61 67 73 29 20 56 41 4c 55 45 53 20 28  k,tags) VALUES (
5d30: 3f 2c 27 27 2c 27 27 2c 27 27 2c 27 27 2c 27 27  ?,'','','','',''
5d40: 2c 27 27 2c 27 27 2c 27 27 29 3b 22 20 74 65 73  ,'','','');" tes
5d50: 74 6e 61 6d 65 29 29 0a 0a 3b 3b 20 75 70 64 61  tname))..;; upda
5d60: 74 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 65  te one of the te
5d70: 73 74 6d 65 74 61 20 66 69 65 6c 64 73 0a 28 64  stmeta fields.(d
5d80: 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74 6d 65  efine (db:testme
5d90: 74 61 2d 75 70 64 61 74 65 2d 66 69 65 6c 64 20  ta-update-field 
5da0: 64 62 20 74 65 73 74 6e 61 6d 65 20 66 69 65 6c  db testname fiel
5db0: 64 20 76 61 6c 75 65 29 0a 20 20 28 73 71 6c 69  d value).  (sqli
5dc0: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 28  te3:execute db (
5dd0: 63 6f 6e 63 20 22 55 50 44 41 54 45 20 74 65 73  conc "UPDATE tes
5de0: 74 5f 6d 65 74 61 20 53 45 54 20 22 20 66 69 65  t_meta SET " fie
5df0: 6c 64 20 22 3d 3f 20 57 48 45 52 45 20 74 65 73  ld "=? WHERE tes
5e00: 74 6e 61 6d 65 3d 3f 3b 22 29 20 76 61 6c 75 65  tname=?;") value
5e10: 20 74 65 73 74 6e 61 6d 65 29 29 0a 0a 3b 3b 3d   testname))..;;=
5e20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5e30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5e40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5e50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5e60: 3d 3d 3d 3d 3d 0a 3b 3b 20 54 20 45 20 53 20 54  =====.;; T E S T
5e70: 20 20 20 44 20 41 20 54 20 41 20 0a 3b 3b 3d 3d     D A T A .;;==
5e80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5e90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5ea0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5eb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5ec0: 3d 3d 3d 3d 0a 0a 28 64 65 66 69 6e 65 20 28 64  ====..(define (d
5ed0: 62 3a 63 73 76 2d 3e 74 65 73 74 2d 64 61 74 61  b:csv->test-data
5ee0: 20 64 62 20 74 65 73 74 2d 69 64 20 63 73 76 64   db test-id csvd
5ef0: 61 74 61 29 0a 20 20 28 64 65 62 75 67 3a 70 72  ata).  (debug:pr
5f00: 69 6e 74 20 34 20 22 74 65 73 74 2d 69 64 20 22  int 4 "test-id "
5f10: 20 74 65 73 74 2d 69 64 20 22 2c 20 63 73 76 64   test-id ", csvd
5f20: 61 74 61 3a 20 22 20 63 73 76 64 61 74 61 29 0a  ata: " csvdata).
5f30: 20 20 28 6c 65 74 20 28 28 63 73 76 6c 69 73 74    (let ((csvlist
5f40: 20 28 63 73 76 2d 3e 6c 69 73 74 20 28 6d 61 6b   (csv->list (mak
5f50: 65 2d 63 73 76 2d 72 65 61 64 65 72 0a 09 09 09  e-csv-reader....
5f60: 20 20 20 20 20 28 6f 70 65 6e 2d 69 6e 70 75 74       (open-input
5f70: 2d 73 74 72 69 6e 67 20 63 73 76 64 61 74 61 29  -string csvdata)
5f80: 0a 09 09 09 20 20 20 20 20 27 28 28 73 74 72 69  ....     '((stri
5f90: 70 2d 6c 65 61 64 69 6e 67 2d 77 68 69 74 65 73  p-leading-whites
5fa0: 70 61 63 65 3f 20 23 74 29 0a 09 09 09 20 20 20  pace? #t)....   
5fb0: 20 20 20 20 28 73 74 72 69 70 2d 74 72 61 69 6c      (strip-trail
5fc0: 69 6e 67 2d 77 68 69 74 65 73 70 61 63 65 3f 20  ing-whitespace? 
5fd0: 23 74 29 29 20 29 29 29 29 20 3b 3b 20 28 63 73  #t)) )))) ;; (cs
5fe0: 76 2d 3e 6c 69 73 74 20 63 73 76 64 61 74 61 29  v->list csvdata)
5ff0: 29 29 0a 20 20 20 20 28 66 6f 72 2d 65 61 63 68  )).    (for-each
6000: 20 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28   .     (lambda (
6010: 63 73 76 72 6f 77 29 0a 20 20 20 20 20 20 20 28  csvrow).       (
6020: 6c 65 74 2a 20 28 28 70 61 64 64 65 64 2d 72 6f  let* ((padded-ro
6030: 77 20 20 28 74 61 6b 65 20 28 61 70 70 65 6e 64  w  (take (append
6040: 20 63 73 76 72 6f 77 20 28 6c 69 73 74 20 23 66   csvrow (list #f
6050: 20 23 66 20 23 66 20 23 66 20 23 66 20 23 66 20   #f #f #f #f #f 
6060: 23 66 20 23 66 29 29 20 38 29 29 0a 09 20 20 20  #f #f)) 8))..   
6070: 20 20 20 28 63 61 74 65 67 6f 72 79 20 20 20 20     (category    
6080: 28 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65 64  (list-ref padded
6090: 2d 72 6f 77 20 30 29 29 0a 09 20 20 20 20 20 20  -row 0))..      
60a0: 28 76 61 72 69 61 62 6c 65 20 20 20 20 28 6c 69  (variable    (li
60b0: 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f  st-ref padded-ro
60c0: 77 20 31 29 29 0a 09 20 20 20 20 20 20 28 76 61  w 1))..      (va
60d0: 6c 75 65 20 20 20 20 20 20 20 28 61 6e 79 2d 3e  lue       (any->
60e0: 6e 75 6d 62 65 72 2d 69 66 2d 70 6f 73 73 69 62  number-if-possib
60f0: 6c 65 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64  le (list-ref pad
6100: 64 65 64 2d 72 6f 77 20 32 29 29 29 0a 09 20 20  ded-row 2)))..  
6110: 20 20 20 20 28 65 78 70 65 63 74 65 64 20 20 20      (expected   
6120: 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 2d 69 66   (any->number-if
6130: 2d 70 6f 73 73 69 62 6c 65 20 28 6c 69 73 74 2d  -possible (list-
6140: 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20 33  ref padded-row 3
6150: 29 29 29 0a 09 20 20 20 20 20 20 28 74 6f 6c 20  )))..      (tol 
6160: 20 20 20 20 20 20 20 20 28 61 6e 79 2d 3e 6e 75          (any->nu
6170: 6d 62 65 72 2d 69 66 2d 70 6f 73 73 69 62 6c 65  mber-if-possible
6180: 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65   (list-ref padde
6190: 64 2d 72 6f 77 20 34 29 29 29 20 3b 3b 20 3e 2c  d-row 4))) ;; >,
61a0: 20 3c 2c 20 3e 3d 2c 20 3c 3d 2c 20 6f 72 20 61   <, >=, <=, or a
61b0: 20 6e 75 6d 62 65 72 0a 09 20 20 20 20 20 20 28   number..      (
61c0: 75 6e 69 74 73 20 20 20 20 20 20 20 28 6c 69 73  units       (lis
61d0: 74 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77  t-ref padded-row
61e0: 20 35 29 29 0a 09 20 20 20 20 20 20 28 63 6f 6d   5))..      (com
61f0: 6d 65 6e 74 20 20 20 20 20 28 6c 69 73 74 2d 72  ment     (list-r
6200: 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20 36 29  ef padded-row 6)
6210: 29 0a 09 20 20 20 20 20 20 28 73 74 61 74 75 73  )..      (status
6220: 20 20 20 20 20 20 28 6c 65 74 20 28 28 73 20 28        (let ((s (
6230: 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d  list-ref padded-
6240: 72 6f 77 20 37 29 29 29 0a 09 09 09 20 20 20 20  row 7)))....    
6250: 20 28 69 66 20 28 61 6e 64 20 28 73 74 72 69 6e   (if (and (strin
6260: 67 3f 20 73 29 28 6f 72 20 28 73 74 72 69 6e 67  g? s)(or (string
6270: 2d 6d 61 74 63 68 20 28 72 65 67 65 78 70 20 22  -match (regexp "
6280: 5e 5c 5c 73 2a 24 22 29 20 73 29 0a 09 09 09 09  ^\\s*$") s).....
6290: 09 09 20 20 20 20 20 28 73 74 72 69 6e 67 2d 6d  ..     (string-m
62a0: 61 74 63 68 20 28 72 65 67 65 78 70 20 22 5e 6e  atch (regexp "^n
62b0: 2f 61 24 22 29 20 73 29 29 29 0a 09 09 09 09 20  /a$") s)))..... 
62c0: 23 66 0a 09 09 09 09 20 73 29 29 29 29 20 3b 3b  #f..... s)))) ;;
62d0: 20 69 66 20 73 70 65 63 69 66 69 65 64 20 6f 6e   if specified on
62e0: 20 74 68 65 20 69 6e 70 75 74 20 74 68 65 6e 20   the input then 
62f0: 75 73 65 2c 20 65 6c 73 65 20 63 61 6c 63 75 6c  use, else calcul
6300: 61 74 65 0a 09 20 3b 3b 20 6c 6f 6f 6b 20 75 70  ate.. ;; look up
6310: 20 65 78 70 65 63 74 65 64 2c 74 6f 6c 2c 75 6e   expected,tol,un
6320: 69 74 73 20 66 72 6f 6d 20 70 72 65 76 69 6f 75  its from previou
6330: 73 20 62 65 73 74 20 66 69 74 20 74 65 73 74 20  s best fit test 
6340: 69 66 20 74 68 65 79 20 61 72 65 20 61 6c 6c 20  if they are all 
6350: 65 69 74 68 65 72 20 23 66 20 6f 72 20 27 27 0a  either #f or ''.
6360: 09 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34  . (debug:print 4
6370: 20 22 42 45 46 4f 52 45 3a 20 63 61 74 65 67 6f   "BEFORE: catego
6380: 72 79 3a 20 22 20 63 61 74 65 67 6f 72 79 20 22  ry: " category "
6390: 20 76 61 72 69 61 62 6c 65 3a 20 22 20 76 61 72   variable: " var
63a0: 69 61 62 6c 65 20 22 20 76 61 6c 75 65 3a 20 22  iable " value: "
63b0: 20 76 61 6c 75 65 20 0a 09 09 20 20 20 20 20 20   value ...      
63c0: 22 2c 20 65 78 70 65 63 74 65 64 3a 20 22 20 65  ", expected: " e
63d0: 78 70 65 63 74 65 64 20 22 20 74 6f 6c 3a 20 22  xpected " tol: "
63e0: 20 74 6f 6c 20 22 20 75 6e 69 74 73 3a 20 22 20   tol " units: " 
63f0: 75 6e 69 74 73 20 22 20 73 74 61 74 75 73 3a 20  units " status: 
6400: 22 20 73 74 61 74 75 73 20 22 20 63 6f 6d 6d 65  " status " comme
6410: 6e 74 3a 20 22 20 63 6f 6d 6d 65 6e 74 29 0a 0a  nt: " comment)..
6420: 09 20 28 69 66 20 28 61 6e 64 20 28 6f 72 20 28  . (if (and (or (
6430: 6e 6f 74 20 65 78 70 65 63 74 65 64 29 28 65 71  not expected)(eq
6440: 75 61 6c 3f 20 65 78 70 65 63 74 65 64 20 22 22  ual? expected ""
6450: 29 29 0a 09 09 20 20 28 6f 72 20 28 6e 6f 74 20  ))...  (or (not 
6460: 74 6f 6c 29 20 20 20 20 20 28 65 71 75 61 6c 3f  tol)     (equal?
6470: 20 65 78 70 65 63 74 65 64 20 22 22 29 29 0a 09   expected ""))..
6480: 09 20 20 28 6f 72 20 28 6e 6f 74 20 75 6e 69 74  .  (or (not unit
6490: 73 29 20 20 20 28 65 71 75 61 6c 3f 20 65 78 70  s)   (equal? exp
64a0: 65 63 74 65 64 20 22 22 29 29 29 0a 09 20 20 20  ected "")))..   
64b0: 20 20 28 6c 65 74 2d 76 61 6c 75 65 73 20 28 28    (let-values ((
64c0: 28 6e 65 77 2d 65 78 70 65 63 74 65 64 20 6e 65  (new-expected ne
64d0: 77 2d 74 6f 6c 20 6e 65 77 2d 75 6e 69 74 73 29  w-tol new-units)
64e0: 28 64 62 3a 67 65 74 2d 70 72 65 76 2d 74 6f 6c  (db:get-prev-tol
64f0: 2d 66 6f 72 2d 74 65 73 74 20 64 62 20 74 65 73  -for-test db tes
6500: 74 2d 69 64 20 63 61 74 65 67 6f 72 79 20 76 61  t-id category va
6510: 72 69 61 62 6c 65 29 29 29 0a 09 20 20 20 20 20  riable)))..     
6520: 20 20 28 73 65 74 21 20 65 78 70 65 63 74 65 64    (set! expected
6530: 20 6e 65 77 2d 65 78 70 65 63 74 65 64 29 0a 09   new-expected)..
6540: 20 20 20 20 20 20 20 28 73 65 74 21 20 74 6f 6c         (set! tol
6550: 20 20 20 20 20 20 6e 65 77 2d 74 6f 6c 29 0a 09        new-tol)..
6560: 20 20 20 20 20 20 20 28 73 65 74 21 20 75 6e 69         (set! uni
6570: 74 73 20 20 20 20 6e 65 77 2d 75 6e 69 74 73 29  ts    new-units)
6580: 29 29 0a 0a 09 20 28 64 65 62 75 67 3a 70 72 69  ))... (debug:pri
6590: 6e 74 20 34 20 22 41 46 54 45 52 3a 20 20 63 61  nt 4 "AFTER:  ca
65a0: 74 65 67 6f 72 79 3a 20 22 20 63 61 74 65 67 6f  tegory: " catego
65b0: 72 79 20 22 20 76 61 72 69 61 62 6c 65 3a 20 22  ry " variable: "
65c0: 20 76 61 72 69 61 62 6c 65 20 22 20 76 61 6c 75   variable " valu
65d0: 65 3a 20 22 20 76 61 6c 75 65 20 0a 09 09 20 20  e: " value ...  
65e0: 20 20 20 20 22 2c 20 65 78 70 65 63 74 65 64 3a      ", expected:
65f0: 20 22 20 65 78 70 65 63 74 65 64 20 22 20 74 6f   " expected " to
6600: 6c 3a 20 22 20 74 6f 6c 20 22 20 75 6e 69 74 73  l: " tol " units
6610: 3a 20 22 20 75 6e 69 74 73 20 22 20 73 74 61 74  : " units " stat
6620: 75 73 3a 20 22 20 73 74 61 74 75 73 20 22 20 63  us: " status " c
6630: 6f 6d 6d 65 6e 74 3a 20 22 20 63 6f 6d 6d 65 6e  omment: " commen
6640: 74 29 0a 09 20 3b 3b 20 63 61 6c 63 75 6c 61 74  t).. ;; calculat
6650: 65 20 73 74 61 74 75 73 20 69 66 20 4e 4f 54 20  e status if NOT 
6660: 73 70 65 63 69 66 69 65 64 0a 09 20 28 69 66 20  specified.. (if 
6670: 28 61 6e 64 20 28 6e 6f 74 20 73 74 61 74 75 73  (and (not status
6680: 29 28 6e 75 6d 62 65 72 3f 20 65 78 70 65 63 74  )(number? expect
6690: 65 64 29 28 6e 75 6d 62 65 72 3f 20 76 61 6c 75  ed)(number? valu
66a0: 65 29 29 20 3b 3b 20 6e 65 65 64 20 65 78 70 65  e)) ;; need expe
66b0: 63 74 65 64 20 61 6e 64 20 76 61 6c 75 65 20 74  cted and value t
66c0: 6f 20 62 65 20 6e 75 6d 62 65 72 73 0a 09 20 20  o be numbers..  
66d0: 20 20 20 28 69 66 20 28 6e 75 6d 62 65 72 3f 20     (if (number? 
66e0: 74 6f 6c 29 20 3b 3b 20 69 66 20 74 6f 6c 20 69  tol) ;; if tol i
66f0: 73 20 61 20 6e 75 6d 62 65 72 20 74 68 65 6e 20  s a number then 
6700: 77 65 20 64 6f 20 74 68 65 20 73 74 61 6e 64 61  we do the standa
6710: 72 64 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 09 09  rd comparison...
6720: 20 28 6c 65 74 2a 20 28 28 6d 61 78 2d 76 61 6c   (let* ((max-val
6730: 20 28 2b 20 65 78 70 65 63 74 65 64 20 74 6f 6c   (+ expected tol
6740: 29 29 0a 09 09 09 28 6d 69 6e 2d 76 61 6c 20 28  ))....(min-val (
6750: 2d 20 65 78 70 65 63 74 65 64 20 74 6f 6c 29 29  - expected tol))
6760: 0a 09 09 09 28 72 65 73 75 6c 74 20 20 28 61 6e  ....(result  (an
6770: 64 20 28 3e 3d 20 20 76 61 6c 75 65 20 6d 69 6e  d (>=  value min
6780: 2d 76 61 6c 29 28 3c 3d 20 76 61 6c 75 65 20 6d  -val)(<= value m
6790: 61 78 2d 76 61 6c 29 29 29 29 0a 09 09 20 20 20  ax-val))))...   
67a0: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22  (debug:print 4 "
67b0: 6d 61 78 2d 76 61 6c 3a 20 22 20 6d 61 78 2d 76  max-val: " max-v
67c0: 61 6c 20 22 20 6d 69 6e 2d 76 61 6c 3a 20 22 20  al " min-val: " 
67d0: 6d 69 6e 2d 76 61 6c 20 22 20 72 65 73 75 6c 74  min-val " result
67e0: 3a 20 22 20 72 65 73 75 6c 74 29 0a 09 09 20 20  : " result)...  
67f0: 20 28 73 65 74 21 20 73 74 61 74 75 73 20 28 69   (set! status (i
6800: 66 20 72 65 73 75 6c 74 20 22 70 61 73 73 22 20  f result "pass" 
6810: 22 66 61 69 6c 22 29 29 29 0a 09 09 20 28 73 65  "fail")))... (se
6820: 74 21 20 73 74 61 74 75 73 20 3b 3b 20 4e 42 2f  t! status ;; NB/
6830: 2f 20 6e 65 65 64 20 74 6f 20 61 73 73 65 73 73  / need to assess
6840: 20 65 61 63 68 20 6f 6e 65 20 28 69 2e 65 2e 20   each one (i.e. 
6850: 6e 6f 74 20 72 65 74 75 72 6e 20 6f 70 65 72 61  not return opera
6860: 74 6f 72 20 73 69 6e 63 65 20 6e 65 65 64 20 74  tor since need t
6870: 6f 20 61 63 74 20 69 66 20 6e 6f 74 20 76 61 6c  o act if not val
6880: 69 64 20 6f 70 2e 0a 09 09 20 20 20 20 20 20 20  id op....       
6890: 28 63 61 73 65 20 28 73 74 72 69 6e 67 2d 3e 73  (case (string->s
68a0: 79 6d 62 6f 6c 20 74 6f 6c 29 20 3b 3b 20 74 6f  ymbol tol) ;; to
68b0: 6c 20 73 68 6f 75 6c 64 20 62 65 20 3e 2c 20 3c  l should be >, <
68c0: 2c 20 3e 3d 2c 20 3c 3d 0a 09 09 09 20 28 28 3e  , >=, <=.... ((>
68d0: 29 20 20 28 69 66 20 28 3e 20 20 76 61 6c 75 65  )  (if (>  value
68e0: 20 65 78 70 65 63 74 65 64 29 20 22 70 61 73 73   expected) "pass
68f0: 22 20 22 66 61 69 6c 22 29 29 0a 09 09 09 20 28  " "fail")).... (
6900: 28 3c 29 20 20 28 69 66 20 28 3c 20 20 76 61 6c  (<)  (if (<  val
6910: 75 65 20 65 78 70 65 63 74 65 64 29 20 22 70 61  ue expected) "pa
6920: 73 73 22 20 22 66 61 69 6c 22 29 29 0a 09 09 09  ss" "fail"))....
6930: 20 28 28 3e 3d 29 20 28 69 66 20 28 3e 3d 20 76   ((>=) (if (>= v
6940: 61 6c 75 65 20 65 78 70 65 63 74 65 64 29 20 22  alue expected) "
6950: 70 61 73 73 22 20 22 66 61 69 6c 22 29 29 0a 09  pass" "fail"))..
6960: 09 09 20 28 28 3c 3d 29 20 28 69 66 20 28 3c 3d  .. ((<=) (if (<=
6970: 20 76 61 6c 75 65 20 65 78 70 65 63 74 65 64 29   value expected)
6980: 20 22 70 61 73 73 22 20 22 66 61 69 6c 22 29 29   "pass" "fail"))
6990: 0a 09 09 09 20 28 65 6c 73 65 20 28 63 6f 6e 63  .... (else (conc
69a0: 20 22 45 52 52 4f 52 3a 20 62 61 64 20 74 6f 6c   "ERROR: bad tol
69b0: 20 63 6f 6d 70 61 72 61 74 6f 72 20 22 20 74 6f   comparator " to
69c0: 6c 29 29 29 29 29 29 0a 09 20 28 64 65 62 75 67  l)))))).. (debug
69d0: 3a 70 72 69 6e 74 20 34 20 22 41 46 54 45 52 32  :print 4 "AFTER2
69e0: 3a 20 63 61 74 65 67 6f 72 79 3a 20 22 20 63 61  : category: " ca
69f0: 74 65 67 6f 72 79 20 22 20 76 61 72 69 61 62 6c  tegory " variabl
6a00: 65 3a 20 22 20 76 61 72 69 61 62 6c 65 20 22 20  e: " variable " 
6a10: 76 61 6c 75 65 3a 20 22 20 76 61 6c 75 65 20 0a  value: " value .
6a20: 09 09 20 20 20 20 20 20 22 2c 20 65 78 70 65 63  ..      ", expec
6a30: 74 65 64 3a 20 22 20 65 78 70 65 63 74 65 64 20  ted: " expected 
6a40: 22 20 74 6f 6c 3a 20 22 20 74 6f 6c 20 22 20 75  " tol: " tol " u
6a50: 6e 69 74 73 3a 20 22 20 75 6e 69 74 73 20 22 20  nits: " units " 
6a60: 73 74 61 74 75 73 3a 20 22 20 73 74 61 74 75 73  status: " status
6a70: 20 22 20 63 6f 6d 6d 65 6e 74 3a 20 22 20 63 6f   " comment: " co
6a80: 6d 6d 65 6e 74 29 0a 09 20 28 73 71 6c 69 74 65  mment).. (sqlite
6a90: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 49 4e  3:execute db "IN
6aa0: 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20  SERT OR REPLACE 
6ab0: 49 4e 54 4f 20 74 65 73 74 5f 64 61 74 61 20 28  INTO test_data (
6ac0: 74 65 73 74 5f 69 64 2c 63 61 74 65 67 6f 72 79  test_id,category
6ad0: 2c 76 61 72 69 61 62 6c 65 2c 76 61 6c 75 65 2c  ,variable,value,
6ae0: 65 78 70 65 63 74 65 64 2c 74 6f 6c 2c 75 6e 69  expected,tol,uni
6af0: 74 73 2c 63 6f 6d 6d 65 6e 74 2c 73 74 61 74 75  ts,comment,statu
6b00: 73 29 20 56 41 4c 55 45 53 20 28 3f 2c 3f 2c 3f  s) VALUES (?,?,?
6b10: 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 29 3b 22 0a  ,?,?,?,?,?,?);".
6b20: 09 20 20 20 20 20 20 74 65 73 74 2d 69 64 20 63  .      test-id c
6b30: 61 74 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65  ategory variable
6b40: 20 76 61 6c 75 65 20 65 78 70 65 63 74 65 64 20   value expected 
6b50: 74 6f 6c 20 75 6e 69 74 73 20 28 69 66 20 63 6f  tol units (if co
6b60: 6d 6d 65 6e 74 20 63 6f 6d 6d 65 6e 74 20 22 22  mment comment ""
6b70: 29 20 73 74 61 74 75 73 29 29 29 0a 20 20 20 20  ) status))).    
6b80: 20 63 73 76 6c 69 73 74 29 29 29 0a 0a 3b 3b 20   csvlist)))..;; 
6b90: 67 65 74 20 61 20 6c 69 73 74 20 6f 66 20 74 65  get a list of te
6ba0: 73 74 5f 64 61 74 61 20 72 65 63 6f 72 64 73 20  st_data records 
6bb0: 6d 61 74 63 68 69 6e 67 20 63 61 74 65 67 6f 72  matching categor
6bc0: 79 70 61 74 74 0a 28 64 65 66 69 6e 65 20 28 64  ypatt.(define (d
6bd0: 62 3a 72 65 61 64 2d 74 65 73 74 2d 64 61 74 61  b:read-test-data
6be0: 20 64 62 20 74 65 73 74 2d 69 64 20 63 61 74 65   db test-id cate
6bf0: 67 6f 72 79 70 61 74 74 29 0a 20 20 28 6c 65 74  gorypatt).  (let
6c00: 20 28 28 72 65 73 20 27 28 29 29 29 0a 20 20 20   ((res '())).   
6c10: 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61   (sqlite3:for-ea
6c20: 63 68 2d 72 6f 77 20 0a 20 20 20 20 20 28 6c 61  ch-row .     (la
6c30: 6d 62 64 61 20 28 69 64 20 74 65 73 74 5f 69 64  mbda (id test_id
6c40: 20 63 61 74 65 67 6f 72 79 20 76 61 72 69 61 62   category variab
6c50: 6c 65 20 76 61 6c 75 65 20 65 78 70 65 63 74 65  le value expecte
6c60: 64 20 74 6f 6c 20 75 6e 69 74 73 20 63 6f 6d 6d  d tol units comm
6c70: 65 6e 74 20 73 74 61 74 75 73 29 0a 20 20 20 20  ent status).    
6c80: 20 20 20 28 73 65 74 21 20 72 65 73 20 28 63 6f     (set! res (co
6c90: 6e 73 20 28 76 65 63 74 6f 72 20 69 64 20 74 65  ns (vector id te
6ca0: 73 74 5f 69 64 20 63 61 74 65 67 6f 72 79 20 76  st_id category v
6cb0: 61 72 69 61 62 6c 65 20 76 61 6c 75 65 20 65 78  ariable value ex
6cc0: 70 65 63 74 65 64 20 74 6f 6c 20 75 6e 69 74 73  pected tol units
6cd0: 20 63 6f 6d 6d 65 6e 74 20 73 74 61 74 75 73 29   comment status)
6ce0: 20 72 65 73 29 29 29 0a 20 20 20 20 20 64 62 0a   res))).     db.
6cf0: 20 20 20 20 20 22 53 45 4c 45 43 54 20 69 64 2c       "SELECT id,
6d00: 74 65 73 74 5f 69 64 2c 63 61 74 65 67 6f 72 79  test_id,category
6d10: 2c 76 61 72 69 61 62 6c 65 2c 76 61 6c 75 65 2c  ,variable,value,
6d20: 65 78 70 65 63 74 65 64 2c 74 6f 6c 2c 75 6e 69  expected,tol,uni
6d30: 74 73 2c 63 6f 6d 6d 65 6e 74 2c 73 74 61 74 75  ts,comment,statu
6d40: 73 20 46 52 4f 4d 20 74 65 73 74 5f 64 61 74 61  s FROM test_data
6d50: 20 57 48 45 52 45 20 74 65 73 74 5f 69 64 3d 3f   WHERE test_id=?
6d60: 20 41 4e 44 20 63 61 74 65 67 6f 72 79 20 4c 49   AND category LI
6d70: 4b 45 20 3f 20 4f 52 44 45 52 20 42 59 20 63 61  KE ? ORDER BY ca
6d80: 74 65 67 6f 72 79 2c 76 61 72 69 61 62 6c 65 3b  tegory,variable;
6d90: 22 20 74 65 73 74 2d 69 64 20 63 61 74 65 67 6f  " test-id catego
6da0: 72 79 70 61 74 74 29 0a 20 20 20 20 28 72 65 76  rypatt).    (rev
6db0: 65 72 73 65 20 72 65 73 29 29 29 0a 0a 28 64 65  erse res)))..(de
6dc0: 66 69 6e 65 20 28 64 62 3a 6c 6f 61 64 2d 74 65  fine (db:load-te
6dd0: 73 74 2d 64 61 74 61 20 64 62 20 72 75 6e 2d 69  st-data db run-i
6de0: 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d  d test-name item
6df0: 64 61 74 29 0a 20 20 28 6c 65 74 2a 20 28 28 69  dat).  (let* ((i
6e00: 74 65 6d 2d 70 61 74 68 20 28 69 74 65 6d 2d 6c  tem-path (item-l
6e10: 69 73 74 2d 3e 70 61 74 68 20 69 74 65 6d 64 61  ist->path itemda
6e20: 74 29 29 0a 09 20 28 74 65 73 74 64 61 74 20 28  t)).. (testdat (
6e30: 64 62 3a 67 65 74 2d 74 65 73 74 2d 69 6e 66 6f  db:get-test-info
6e40: 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d   db run-id test-
6e50: 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 29  name item-path))
6e60: 0a 09 20 28 74 65 73 74 2d 69 64 20 28 69 66 20  .. (test-id (if 
6e70: 74 65 73 74 64 61 74 20 28 64 62 3a 74 65 73 74  testdat (db:test
6e80: 2d 67 65 74 2d 69 64 20 74 65 73 74 64 61 74 29  -get-id testdat)
6e90: 20 23 66 29 29 29 0a 20 20 20 20 3b 3b 20 28 64   #f))).    ;; (d
6ea0: 65 62 75 67 3a 70 72 69 6e 74 20 31 20 22 45 6e  ebug:print 1 "En
6eb0: 74 65 72 20 72 65 63 6f 72 64 73 20 74 6f 20 69  ter records to i
6ec0: 6e 73 65 72 74 20 69 6e 20 74 68 65 20 74 65 73  nsert in the tes
6ed0: 74 5f 64 61 74 61 20 74 61 62 6c 65 2c 20 73 65  t_data table, se
6ee0: 76 65 6e 20 66 69 65 6c 64 73 2c 20 63 6f 6d 6d  ven fields, comm
6ef0: 61 20 73 65 70 61 72 61 74 65 64 20 70 65 72 20  a separated per 
6f00: 6c 69 6e 65 22 29 0a 20 20 20 20 28 64 65 62 75  line").    (debu
6f10: 67 3a 70 72 69 6e 74 20 34 20 22 69 74 65 6d 64  g:print 4 "itemd
6f20: 61 74 3a 20 22 20 69 74 65 6d 64 61 74 20 22 2c  at: " itemdat ",
6f30: 20 74 65 73 74 2d 6e 61 6d 65 3a 20 22 20 74 65   test-name: " te
6f40: 73 74 2d 6e 61 6d 65 20 22 2c 20 74 65 73 74 2d  st-name ", test-
6f50: 69 64 3a 20 22 20 74 65 73 74 2d 69 64 29 0a 20  id: " test-id). 
6f60: 20 20 20 28 69 66 20 74 65 73 74 2d 69 64 0a 09     (if test-id..
6f70: 28 6c 65 74 20 6c 6f 6f 70 20 28 28 6c 69 6e 20  (let loop ((lin 
6f80: 28 72 65 61 64 2d 6c 69 6e 65 29 29 29 0a 09 20  (read-line))).. 
6f90: 20 28 69 66 20 28 6e 6f 74 20 28 65 6f 66 2d 6f   (if (not (eof-o
6fa0: 62 6a 65 63 74 3f 20 6c 69 6e 29 29 0a 09 20 20  bject? lin))..  
6fb0: 20 20 20 20 28 62 65 67 69 6e 0a 09 09 28 64 65      (begin...(de
6fc0: 62 75 67 3a 70 72 69 6e 74 20 34 20 6c 69 6e 29  bug:print 4 lin)
6fd0: 0a 09 09 28 64 62 3a 63 73 76 2d 3e 74 65 73 74  ...(db:csv->test
6fe0: 2d 64 61 74 61 20 64 62 20 74 65 73 74 2d 69 64  -data db test-id
6ff0: 20 6c 69 6e 29 0a 09 09 28 6c 6f 6f 70 20 28 72   lin)...(loop (r
7000: 65 61 64 2d 6c 69 6e 65 29 29 29 29 29 29 0a 20  ead-line)))))). 
7010: 20 20 20 3b 3b 20 72 6f 6c 6c 20 75 70 20 74 68     ;; roll up th
7020: 65 20 63 75 72 72 65 6e 74 20 72 65 73 75 6c 74  e current result
7030: 73 2e 0a 20 20 20 20 28 64 62 3a 74 65 73 74 2d  s..    (db:test-
7040: 64 61 74 61 2d 72 6f 6c 6c 75 70 20 64 62 20 74  data-rollup db t
7050: 65 73 74 2d 69 64 29 29 29 0a 20 20 0a 3b 3b 20  est-id))).  .;; 
7060: 57 41 52 4e 49 4e 47 3a 20 44 6f 20 4e 4f 54 20  WARNING: Do NOT 
7070: 63 61 6c 6c 20 74 68 69 73 20 66 6f 72 20 74 68  call this for th
7080: 65 20 70 61 72 65 6e 74 20 74 65 73 74 20 6f 6e  e parent test on
7090: 20 61 6e 20 69 74 65 72 61 74 65 64 20 74 65 73   an iterated tes
70a0: 74 0a 3b 3b 20 52 6f 6c 6c 20 75 70 20 74 65 73  t.;; Roll up tes
70b0: 74 5f 64 61 74 61 20 70 61 73 73 2f 66 61 69 6c  t_data pass/fail
70c0: 20 72 65 73 75 6c 74 73 0a 3b 3b 20 6c 6f 6f 6b   results.;; look
70d0: 20 61 74 20 74 68 65 20 74 65 73 74 5f 64 61 74   at the test_dat
70e0: 61 20 73 74 61 74 75 73 20 66 69 65 6c 64 2c 20  a status field, 
70f0: 0a 3b 3b 20 20 20 20 69 66 20 61 6c 6c 20 61 72  .;;    if all ar
7100: 65 20 70 61 73 73 20 28 61 6e 79 20 63 61 73 65  e pass (any case
7110: 29 20 61 6e 64 20 74 68 65 20 74 65 73 74 20 73  ) and the test s
7120: 74 61 74 75 73 20 69 73 20 50 41 53 53 20 6f 72  tatus is PASS or
7130: 20 4e 55 4c 4c 20 6f 72 20 27 27 20 74 68 65 6e   NULL or '' then
7140: 20 73 65 74 20 74 65 73 74 20 73 74 61 74 75 73   set test status
7150: 20 74 6f 20 50 41 53 53 2e 0a 3b 3b 20 20 20 20   to PASS..;;    
7160: 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 61  if one or more a
7170: 72 65 20 66 61 69 6c 20 28 61 6e 79 20 63 61 73  re fail (any cas
7180: 65 29 20 74 68 65 6e 20 73 65 74 20 74 65 73 74  e) then set test
7190: 20 73 74 61 74 75 73 20 74 6f 20 50 41 53 53 2c   status to PASS,
71a0: 20 6e 6f 6e 20 22 70 61 73 73 22 20 6f 72 20 22   non "pass" or "
71b0: 66 61 69 6c 22 20 61 72 65 20 69 67 6e 6f 72 65  fail" are ignore
71c0: 64 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65  d.(define (db:te
71d0: 73 74 2d 64 61 74 61 2d 72 6f 6c 6c 75 70 20 64  st-data-rollup d
71e0: 62 20 74 65 73 74 2d 69 64 29 0a 20 20 28 73 71  b test-id).  (sq
71f0: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 0a 20  lite3:execute . 
7200: 20 20 64 62 20 0a 20 20 20 22 55 50 44 41 54 45    db .   "UPDATE
7210: 20 74 65 73 74 73 20 0a 20 20 20 20 20 20 53 45   tests .      SE
7220: 54 20 66 61 69 6c 5f 63 6f 75 6e 74 3d 28 53 45  T fail_count=(SE
7230: 4c 45 43 54 20 63 6f 75 6e 74 28 69 64 29 20 46  LECT count(id) F
7240: 52 4f 4d 20 74 65 73 74 5f 64 61 74 61 20 57 48  ROM test_data WH
7250: 45 52 45 20 74 65 73 74 5f 69 64 3d 3f 20 41 4e  ERE test_id=? AN
7260: 44 20 73 74 61 74 75 73 20 6c 69 6b 65 20 27 66  D status like 'f
7270: 61 69 6c 27 29 2c 0a 20 20 20 20 20 20 20 20 20  ail'),.         
7280: 20 70 61 73 73 5f 63 6f 75 6e 74 3d 28 53 45 4c   pass_count=(SEL
7290: 45 43 54 20 63 6f 75 6e 74 28 69 64 29 20 46 52  ECT count(id) FR
72a0: 4f 4d 20 74 65 73 74 5f 64 61 74 61 20 57 48 45  OM test_data WHE
72b0: 52 45 20 74 65 73 74 5f 69 64 3d 3f 20 41 4e 44  RE test_id=? AND
72c0: 20 73 74 61 74 75 73 20 6c 69 6b 65 20 27 70 61   status like 'pa
72d0: 73 73 27 29 0a 20 20 20 20 20 20 57 48 45 52 45  ss').      WHERE
72e0: 20 69 64 3d 3f 3b 22 0a 20 20 20 74 65 73 74 2d   id=?;".   test-
72f0: 69 64 20 74 65 73 74 2d 69 64 20 74 65 73 74 2d  id test-id test-
7300: 69 64 29 0a 20 20 3b 3b 20 69 66 20 74 68 65 20  id).  ;; if the 
7310: 74 65 73 74 20 69 73 20 6e 6f 74 20 46 41 49 4c  test is not FAIL
7320: 20 74 68 65 6e 20 73 65 74 20 73 74 61 74 75 73   then set status
7330: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 66 61   based on the fa
7340: 69 6c 20 61 6e 64 20 70 61 73 73 20 63 6f 75 6e  il and pass coun
7350: 74 73 2e 0a 20 20 28 73 6c 65 65 70 20 31 29 0a  ts..  (sleep 1).
7360: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
7370: 74 65 0a 20 20 20 64 62 0a 20 20 20 22 55 50 44  te.   db.   "UPD
7380: 41 54 45 20 74 65 73 74 73 0a 20 20 20 20 20 20  ATE tests.      
7390: 53 45 54 20 73 74 61 74 75 73 3d 43 41 53 45 20  SET status=CASE 
73a0: 57 48 45 4e 20 28 53 45 4c 45 43 54 20 66 61 69  WHEN (SELECT fai
73b0: 6c 5f 63 6f 75 6e 74 20 46 52 4f 4d 20 74 65 73  l_count FROM tes
73c0: 74 73 20 57 48 45 52 45 20 69 64 3d 3f 29 20 3e  ts WHERE id=?) >
73d0: 20 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   0 .            
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 48 45               THE
73f0: 4e 20 27 46 41 49 4c 27 0a 20 20 20 20 20 20 20  N 'FAIL'.       
7400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
7410: 48 45 4e 20 28 53 45 4c 45 43 54 20 70 61 73 73  HEN (SELECT pass
7420: 5f 63 6f 75 6e 74 20 46 52 4f 4d 20 74 65 73 74  _count FROM test
7430: 73 20 57 48 45 52 45 20 69 64 3d 3f 29 20 3e 20  s WHERE id=?) > 
7440: 30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0.              
7450: 20 20 20 20 20 20 20 20 20 20 20 54 48 45 4e 20             THEN 
7460: 27 50 41 53 53 27 0a 20 20 20 20 20 20 20 20 20  'PASS'.         
7470: 20 20 20 20 20 20 20 20 20 20 20 20 20 45 4c 53               ELS
7480: 45 20 73 74 61 74 75 73 0a 20 20 20 20 20 20 20  E status.       
7490: 20 20 20 20 20 20 20 20 20 20 20 45 4e 44 20 57             END W
74a0: 48 45 52 45 20 69 64 3d 3f 3b 22 0a 20 20 20 74  HERE id=?;".   t
74b0: 65 73 74 2d 69 64 20 74 65 73 74 2d 69 64 20 74  est-id test-id t
74c0: 65 73 74 2d 69 64 29 29 0a 0a 28 64 65 66 69 6e  est-id))..(defin
74d0: 65 20 28 64 62 3a 67 65 74 2d 70 72 65 76 2d 74  e (db:get-prev-t
74e0: 6f 6c 2d 66 6f 72 2d 74 65 73 74 20 64 62 20 74  ol-for-test db t
74f0: 65 73 74 2d 69 64 20 63 61 74 65 67 6f 72 79 20  est-id category 
7500: 76 61 72 69 61 62 6c 65 29 0a 20 20 3b 3b 20 46  variable).  ;; F
7510: 69 6e 69 73 68 20 6d 65 3f 0a 20 20 28 76 61 6c  inish me?.  (val
7520: 75 65 73 20 23 66 20 23 66 20 23 66 29 29 0a 0a  ues #f #f #f))..
7530: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
7540: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7550: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7560: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7570: 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 53 20 54 20  ========.;; S T 
7580: 45 20 50 20 53 20 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d  E P S .;;=======
7590: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
75a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
75b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
75c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a  ===============.
75d0: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 73 74 65  .(define (db:ste
75e0: 70 2d 67 65 74 2d 74 69 6d 65 2d 61 73 2d 73 74  p-get-time-as-st
75f0: 72 69 6e 67 20 76 65 63 29 0a 20 20 20 20 28 73  ring vec).    (s
7600: 65 63 6f 6e 64 73 2d 3e 74 69 6d 65 2d 73 74 72  econds->time-str
7610: 69 6e 67 20 28 64 62 3a 73 74 65 70 2d 67 65 74  ing (db:step-get
7620: 2d 65 76 65 6e 74 5f 74 69 6d 65 20 76 65 63 29  -event_time vec)
7630: 29 29 0a 0a 3b 3b 20 64 62 2d 67 65 74 2d 74 65  ))..;; db-get-te
7640: 73 74 2d 73 74 65 70 73 2d 66 6f 72 2d 72 75 6e  st-steps-for-run
7650: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74  .(define (db:get
7660: 2d 73 74 65 70 73 2d 66 6f 72 2d 74 65 73 74 20  -steps-for-test 
7670: 64 62 20 74 65 73 74 2d 69 64 29 0a 20 20 28 6c  db test-id).  (l
7680: 65 74 20 28 28 72 65 73 20 27 28 29 29 29 0a 20  et ((res '())). 
7690: 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d     (sqlite3:for-
76a0: 65 61 63 68 2d 72 6f 77 20 0a 20 20 20 20 20 28  each-row .     (
76b0: 6c 61 6d 62 64 61 20 28 69 64 20 74 65 73 74 2d  lambda (id test-
76c0: 69 64 20 73 74 65 70 6e 61 6d 65 20 73 74 61 74  id stepname stat
76d0: 65 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d 74  e status event-t
76e0: 69 6d 65 29 0a 20 20 20 20 20 20 20 28 73 65 74  ime).       (set
76f0: 21 20 72 65 73 20 28 63 6f 6e 73 20 28 76 65 63  ! res (cons (vec
7700: 74 6f 72 20 69 64 20 74 65 73 74 2d 69 64 20 73  tor id test-id s
7710: 74 65 70 6e 61 6d 65 20 73 74 61 74 65 20 73 74  tepname state st
7720: 61 74 75 73 20 65 76 65 6e 74 2d 74 69 6d 65 29  atus event-time)
7730: 20 72 65 73 29 29 29 0a 20 20 20 20 20 64 62 0a   res))).     db.
7740: 20 20 20 20 20 22 53 45 4c 45 43 54 20 69 64 2c       "SELECT id,
7750: 74 65 73 74 5f 69 64 2c 73 74 65 70 6e 61 6d 65  test_id,stepname
7760: 2c 73 74 61 74 65 2c 73 74 61 74 75 73 2c 65 76  ,state,status,ev
7770: 65 6e 74 5f 74 69 6d 65 20 46 52 4f 4d 20 74 65  ent_time FROM te
7780: 73 74 5f 73 74 65 70 73 20 57 48 45 52 45 20 74  st_steps WHERE t
7790: 65 73 74 5f 69 64 3d 3f 20 4f 52 44 45 52 20 42  est_id=? ORDER B
77a0: 59 20 69 64 20 41 53 43 3b 22 20 3b 3b 20 65 76  Y id ASC;" ;; ev
77b0: 65 6e 74 5f 74 69 6d 65 20 44 45 53 43 2c 69 64  ent_time DESC,id
77c0: 20 41 53 43 3b 0a 20 20 20 20 20 74 65 73 74 2d   ASC;.     test-
77d0: 69 64 29 0a 20 20 20 20 28 72 65 76 65 72 73 65  id).    (reverse
77e0: 20 72 65 73 29 29 29 0a 0a 3b 3b 20 67 65 74 20   res)))..;; get 
77f0: 61 20 70 72 65 74 74 79 20 74 61 62 6c 65 20 74  a pretty table t
7800: 6f 20 73 75 6d 6d 61 72 69 7a 65 20 73 74 65 70  o summarize step
7810: 73 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 28 64 62  s.;;.(define (db
7820: 3a 67 65 74 2d 73 74 65 70 73 2d 74 61 62 6c 65  :get-steps-table
7830: 20 64 62 20 74 65 73 74 2d 69 64 29 0a 20 20 28   db test-id).  (
7840: 6c 65 74 20 28 28 73 74 65 70 73 20 20 20 28 64  let ((steps   (d
7850: 62 3a 67 65 74 2d 73 74 65 70 73 2d 66 6f 72 2d  b:get-steps-for-
7860: 74 65 73 74 20 64 62 20 74 65 73 74 2d 69 64 29  test db test-id)
7870: 29 29 0a 20 20 20 20 3b 3b 20 6f 72 67 61 6e 69  )).    ;; organi
7880: 73 65 20 74 68 65 20 73 74 65 70 73 20 66 6f 72  se the steps for
7890: 20 62 65 74 74 65 72 20 72 65 61 64 61 62 69 6c   better readabil
78a0: 69 74 79 0a 20 20 20 20 28 6c 65 74 20 28 28 72  ity.    (let ((r
78b0: 65 73 20 28 6d 61 6b 65 2d 68 61 73 68 2d 74 61  es (make-hash-ta
78c0: 62 6c 65 29 29 29 0a 20 20 20 20 20 20 28 66 6f  ble))).      (fo
78d0: 72 2d 65 61 63 68 20 0a 20 20 20 20 20 20 20 28  r-each .       (
78e0: 6c 61 6d 62 64 61 20 28 73 74 65 70 29 0a 09 20  lambda (step).. 
78f0: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 36 20 22  (debug:print 6 "
7900: 73 74 65 70 3d 22 20 73 74 65 70 29 0a 09 20 28  step=" step).. (
7910: 6c 65 74 20 28 28 72 65 63 6f 72 64 20 28 68 61  let ((record (ha
7920: 73 68 2d 74 61 62 6c 65 2d 72 65 66 2f 64 65 66  sh-table-ref/def
7930: 61 75 6c 74 20 0a 09 09 09 72 65 73 20 0a 09 09  ault ....res ...
7940: 09 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74  .(db:step-get-st
7950: 65 70 6e 61 6d 65 20 73 74 65 70 29 20 0a 09 09  epname step) ...
7960: 09 3b 3b 20 20 20 20 20 20 20 20 73 74 65 70 6e  .;;        stepn
7970: 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
7980: 20 20 20 73 74 61 72 74 20 65 6e 64 20 73 74 61     start end sta
7990: 74 75 73 20 20 20 20 0a 09 09 09 28 76 65 63 74  tus    ....(vect
79a0: 6f 72 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d  or (db:step-get-
79b0: 73 74 65 70 6e 61 6d 65 20 73 74 65 70 29 20 22  stepname step) "
79c0: 22 20 20 20 22 22 20 22 22 20 20 20 20 20 22 22  "   "" ""     ""
79d0: 29 29 29 29 0a 09 20 20 20 28 64 65 62 75 67 3a  ))))..   (debug:
79e0: 70 72 69 6e 74 20 36 20 22 72 65 63 6f 72 64 28  print 6 "record(
79f0: 62 65 66 6f 72 65 29 20 3d 20 22 20 72 65 63 6f  before) = " reco
7a00: 72 64 20 0a 09 09 09 22 5c 6e 69 64 3a 20 20 20  rd ...."\nid:   
7a10: 20 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d 67      " (db:step-g
7a20: 65 74 2d 69 64 20 73 74 65 70 29 0a 09 09 09 22  et-id step)...."
7a30: 5c 6e 73 74 65 70 6e 61 6d 65 3a 20 22 20 28 64  \nstepname: " (d
7a40: 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 65 70 6e  b:step-get-stepn
7a50: 61 6d 65 20 73 74 65 70 29 0a 09 09 09 22 5c 6e  ame step)...."\n
7a60: 73 74 61 74 65 3a 20 20 20 20 22 20 28 64 62 3a  state:    " (db:
7a70: 73 74 65 70 2d 67 65 74 2d 73 74 61 74 65 20 73  step-get-state s
7a80: 74 65 70 29 0a 09 09 09 22 5c 6e 73 74 61 74 75  tep)...."\nstatu
7a90: 73 3a 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d  s:   " (db:step-
7aa0: 67 65 74 2d 73 74 61 74 75 73 20 73 74 65 70 29  get-status step)
7ab0: 0a 09 09 09 22 5c 6e 74 69 6d 65 3a 20 20 20 20  ...."\ntime:    
7ac0: 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d   " (db:step-get-
7ad0: 65 76 65 6e 74 5f 74 69 6d 65 20 73 74 65 70 29  event_time step)
7ae0: 29 0a 09 20 20 20 28 63 61 73 65 20 28 73 74 72  )..   (case (str
7af0: 69 6e 67 2d 3e 73 79 6d 62 6f 6c 20 28 64 62 3a  ing->symbol (db:
7b00: 73 74 65 70 2d 67 65 74 2d 73 74 61 74 65 20 73  step-get-state s
7b10: 74 65 70 29 29 0a 09 20 20 20 20 20 28 28 73 74  tep))..     ((st
7b20: 61 72 74 29 28 76 65 63 74 6f 72 2d 73 65 74 21  art)(vector-set!
7b30: 20 72 65 63 6f 72 64 20 31 20 28 64 62 3a 73 74   record 1 (db:st
7b40: 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d  ep-get-event_tim
7b50: 65 20 73 74 65 70 29 29 0a 09 20 20 20 20 20 20  e step))..      
7b60: 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63  (vector-set! rec
7b70: 6f 72 64 20 33 20 28 69 66 20 28 65 71 75 61 6c  ord 3 (if (equal
7b80: 3f 20 28 76 65 63 74 6f 72 2d 72 65 66 20 72 65  ? (vector-ref re
7b90: 63 6f 72 64 20 33 29 20 22 22 29 0a 09 09 09 09  cord 3) "").....
7ba0: 09 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74  .(db:step-get-st
7bb0: 61 74 75 73 20 73 74 65 70 29 29 29 29 0a 09 20  atus step)))).. 
7bc0: 20 20 20 20 28 28 65 6e 64 29 20 20 0a 09 20 20      ((end)  ..  
7bd0: 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21      (vector-set!
7be0: 20 72 65 63 6f 72 64 20 32 20 28 61 6e 79 2d 3e   record 2 (any->
7bf0: 6e 75 6d 62 65 72 20 28 64 62 3a 73 74 65 70 2d  number (db:step-
7c00: 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73  get-event_time s
7c10: 74 65 70 29 29 29 0a 09 20 20 20 20 20 20 28 76  tep)))..      (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 6c 65 74  t! record 4 (let
7c70: 20 28 28 73 74 61 72 74 74 20 28 61 6e 79 2d 3e   ((startt (any->
7c80: 6e 75 6d 62 65 72 20 28 76 65 63 74 6f 72 2d 72  number (vector-r
7c90: 65 66 20 72 65 63 6f 72 64 20 31 29 29 29 0a 09  ef record 1)))..
7ca0: 09 09 09 09 20 20 28 65 6e 64 74 20 20 20 28 61  ....  (endt   (a
7cb0: 6e 79 2d 3e 6e 75 6d 62 65 72 20 28 76 65 63 74  ny->number (vect
7cc0: 6f 72 2d 72 65 66 20 72 65 63 6f 72 64 20 32 29  or-ref record 2)
7cd0: 29 29 29 0a 09 09 09 09 20 20 20 20 20 20 28 64  ))).....      (d
7ce0: 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22 72 65  ebug:print 4 "re
7cf0: 63 6f 72 64 5b 31 5d 3d 22 20 28 76 65 63 74 6f  cord[1]=" (vecto
7d00: 72 2d 72 65 66 20 72 65 63 6f 72 64 20 31 29 20  r-ref record 1) 
7d10: 0a 09 09 09 09 09 09 20 20 20 22 2c 20 73 74 61  .......   ", sta
7d20: 72 74 74 3d 22 20 73 74 61 72 74 74 20 22 2c 20  rtt=" startt ", 
7d30: 65 6e 64 74 3d 22 20 65 6e 64 74 0a 09 09 09 09  endt=" endt.....
7d40: 09 09 20 20 20 22 2c 20 67 65 74 2d 73 74 61 74  ..   ", get-stat
7d50: 75 73 3a 20 22 20 28 64 62 3a 73 74 65 70 2d 67  us: " (db:step-g
7d60: 65 74 2d 73 74 61 74 75 73 20 73 74 65 70 29 29  et-status step))
7d70: 0a 09 09 09 09 20 20 20 20 20 20 28 69 66 20 28  .....      (if (
7d80: 61 6e 64 20 28 6e 75 6d 62 65 72 3f 20 73 74 61  and (number? sta
7d90: 72 74 74 29 28 6e 75 6d 62 65 72 3f 20 65 6e 64  rtt)(number? end
7da0: 74 29 29 0a 09 09 09 09 09 20 20 28 73 65 63 6f  t))......  (seco
7db0: 6e 64 73 2d 3e 68 72 2d 6d 69 6e 2d 73 65 63 20  nds->hr-min-sec 
7dc0: 28 2d 20 65 6e 64 74 20 73 74 61 72 74 74 29 29  (- endt startt))
7dd0: 20 22 2d 31 22 29 29 29 29 0a 09 20 20 20 20 20   "-1"))))..     
7de0: 28 65 6c 73 65 0a 09 20 20 20 20 20 20 20 20 28  (else..        (
7df0: 76 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f  vector-set! reco
7e00: 72 64 20 32 20 28 64 62 3a 73 74 65 70 2d 67 65  rd 2 (db:step-ge
7e10: 74 2d 73 74 61 74 65 20 73 74 65 70 29 29 0a 09  t-state step))..
7e20: 20 20 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d          (vector-
7e30: 73 65 74 21 20 72 65 63 6f 72 64 20 33 20 28 64  set! record 3 (d
7e40: 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 74 75  b:step-get-statu
7e50: 73 20 73 74 65 70 29 29 0a 09 20 20 20 20 20 20  s step))..      
7e60: 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72    (vector-set! r
7e70: 65 63 6f 72 64 20 34 20 28 64 62 3a 73 74 65 70  ecord 4 (db:step
7e80: 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20  -get-event_time 
7e90: 73 74 65 70 29 29 29 29 0a 09 20 20 20 28 68 61  step))))..   (ha
7ea0: 73 68 2d 74 61 62 6c 65 2d 73 65 74 21 20 72 65  sh-table-set! re
7eb0: 73 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73  s (db:step-get-s
7ec0: 74 65 70 6e 61 6d 65 20 73 74 65 70 29 20 72 65  tepname step) re
7ed0: 63 6f 72 64 29 0a 09 20 20 20 28 64 65 62 75 67  cord)..   (debug
7ee0: 3a 70 72 69 6e 74 20 36 20 22 72 65 63 6f 72 64  :print 6 "record
7ef0: 28 61 66 74 65 72 29 20 20 3d 20 22 20 72 65 63  (after)  = " rec
7f00: 6f 72 64 20 0a 09 09 09 22 5c 6e 69 64 3a 20 20  ord ...."\nid:  
7f10: 20 20 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d       " (db:step-
7f20: 67 65 74 2d 69 64 20 73 74 65 70 29 0a 09 09 09  get-id step)....
7f30: 22 5c 6e 73 74 65 70 6e 61 6d 65 3a 20 22 20 28  "\nstepname: " (
7f40: 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 65 70  db:step-get-step
7f50: 6e 61 6d 65 20 73 74 65 70 29 0a 09 09 09 22 5c  name step)...."\
7f60: 6e 73 74 61 74 65 3a 20 20 20 20 22 20 28 64 62  nstate:    " (db
7f70: 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 74 65 20  :step-get-state 
7f80: 73 74 65 70 29 0a 09 09 09 22 5c 6e 73 74 61 74  step)...."\nstat
7f90: 75 73 3a 20 20 20 22 20 28 64 62 3a 73 74 65 70  us:   " (db:step
7fa0: 2d 67 65 74 2d 73 74 61 74 75 73 20 73 74 65 70  -get-status step
7fb0: 29 0a 09 09 09 22 5c 6e 74 69 6d 65 3a 20 20 20  )...."\ntime:   
7fc0: 20 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74    " (db:step-get
7fd0: 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73 74 65 70  -event_time step
7fe0: 29 29 29 29 0a 20 20 20 20 20 20 20 3b 3b 20 28  )))).       ;; (
7ff0: 65 6c 73 65 20 20 20 28 76 65 63 74 6f 72 2d 73  else   (vector-s
8000: 65 74 21 20 72 65 63 6f 72 64 20 31 20 28 64 62  et! record 1 (db
8010: 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f  :step-get-event_
8020: 74 69 6d 65 20 73 74 65 70 29 29 29 0a 20 20 20  time step))).   
8030: 20 20 20 20 28 73 6f 72 74 20 73 74 65 70 73 20      (sort steps 
8040: 28 6c 61 6d 62 64 61 20 28 61 20 62 29 28 3c 20  (lambda (a b)(< 
8050: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65  (db:step-get-eve
8060: 6e 74 5f 74 69 6d 65 20 61 29 28 64 62 3a 73 74  nt_time a)(db:st
8070: 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d  ep-get-event_tim
8080: 65 20 62 29 29 29 29 29 0a 20 20 20 20 20 20 72  e b))))).      r
8090: 65 73 29 29 29 0a 0a 3b 3b 20 55 53 45 3a 20 28  es)))..;; USE: (
80a0: 6c 73 65 74 2d 64 69 66 66 65 72 65 6e 63 65 20  lset-difference 
80b0: 73 74 72 69 6e 67 3d 3f 20 27 28 22 61 22 20 22  string=? '("a" "
80c0: 62 22 20 22 63 22 29 20 27 28 22 64 22 20 22 63  b" "c") '("d" "c
80d0: 22 20 22 65 22 20 22 61 22 29 29 0a 3b 3b 0a 3b  " "e" "a")).;;.;
80e0: 3b 20 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20  ; Return a list 
80f0: 6f 66 20 70 72 65 72 65 71 73 20 74 68 61 74 20  of prereqs that 
8100: 77 65 72 65 20 4e 4f 54 20 6d 65 74 0a 3b 3b 20  were NOT met.;; 
8110: 20 54 65 73 74 73 20 28 61 6e 64 20 61 6c 6c 20   Tests (and all 
8120: 69 74 65 6d 73 29 20 69 6e 20 77 61 69 74 6f 6e  items) in waiton
8130: 20 6c 69 73 74 20 6d 75 73 74 20 62 65 20 22 43   list must be "C
8140: 4f 4d 50 4c 45 54 45 44 22 20 61 6e 64 20 22 50  OMPLETED" and "P
8150: 41 53 53 22 0a 28 64 65 66 69 6e 65 20 28 64 62  ASS".(define (db
8160: 2d 67 65 74 2d 70 72 65 72 65 71 73 2d 6e 6f 74  -get-prereqs-not
8170: 2d 6d 65 74 20 64 62 20 72 75 6e 2d 69 64 20 77  -met db run-id w
8180: 61 69 74 6f 6e 29 0a 20 20 28 69 66 20 28 6e 75  aiton).  (if (nu
8190: 6c 6c 3f 20 77 61 69 74 6f 6e 29 0a 20 20 20 20  ll? waiton).    
81a0: 20 20 27 28 29 0a 20 20 20 20 20 20 28 6c 65 74    '().      (let
81b0: 2a 20 28 28 75 6e 6d 65 74 2d 70 72 65 2d 72 65  * ((unmet-pre-re
81c0: 71 73 20 27 28 29 29 0a 09 20 20 20 20 20 28 74  qs '())..     (t
81d0: 65 73 74 73 20 20 20 20 20 20 20 20 20 20 20 28  ests           (
81e0: 64 62 2d 67 65 74 2d 74 65 73 74 73 2d 66 6f 72  db-get-tests-for
81f0: 2d 72 75 6e 20 64 62 20 72 75 6e 2d 69 64 20 23  -run db run-id #
8200: 66 20 23 66 20 27 28 29 20 27 28 29 29 29 0a 09  f #f '() '()))..
8210: 20 20 20 20 20 28 72 65 73 75 6c 74 20 20 20 20       (result    
8220: 20 20 20 20 20 27 28 29 29 29 0a 09 28 66 6f 72       '()))..(for
8230: 2d 65 61 63 68 20 28 6c 61 6d 62 64 61 20 28 77  -each (lambda (w
8240: 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 29 0a  aitontest-name).
8250: 09 09 20 20 20 20 28 6c 65 74 20 28 28 65 76 65  ..    (let ((eve
8260: 72 2d 73 65 65 6e 20 23 66 29 29 0a 09 09 20 20  r-seen #f))...  
8270: 20 20 20 20 28 66 6f 72 2d 65 61 63 68 20 28 6c      (for-each (l
8280: 61 6d 62 64 61 20 28 74 65 73 74 29 0a 09 09 09  ambda (test)....
8290: 09 20 20 28 69 66 20 28 65 71 75 61 6c 3f 20 77  .  (if (equal? w
82a0: 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 20 28  aitontest-name (
82b0: 64 62 3a 74 65 73 74 2d 67 65 74 2d 74 65 73 74  db:test-get-test
82c0: 6e 61 6d 65 20 74 65 73 74 29 29 0a 09 09 09 09  name test)).....
82d0: 20 20 20 20 20 20 28 62 65 67 69 6e 0a 09 09 09        (begin....
82e0: 09 09 28 73 65 74 21 20 65 76 65 72 2d 73 65 65  ..(set! ever-see
82f0: 6e 20 23 74 29 0a 09 09 09 09 09 28 69 66 20 28  n #t)......(if (
8300: 6e 6f 74 20 28 61 6e 64 20 28 65 71 75 61 6c 3f  not (and (equal?
8310: 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 73 74   (db:test-get-st
8320: 61 74 65 20 74 65 73 74 29 20 22 43 4f 4d 50 4c  ate test) "COMPL
8330: 45 54 45 44 22 29 0a 09 09 09 09 09 09 20 20 20  ETED").......   
8340: 20 20 20 28 6d 65 6d 62 65 72 20 28 64 62 3a 74     (member (db:t
8350: 65 73 74 2d 67 65 74 2d 73 74 61 74 75 73 20 74  est-get-status t
8360: 65 73 74 29 20 27 28 22 50 41 53 53 22 20 22 57  est) '("PASS" "W
8370: 41 52 4e 22 20 22 43 48 45 43 4b 22 29 29 29 29  ARN" "CHECK"))))
8380: 0a 09 09 09 09 09 20 20 20 20 28 73 65 74 21 20  ......    (set! 
8390: 72 65 73 75 6c 74 20 28 63 6f 6e 73 20 77 61 69  result (cons wai
83a0: 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 20 72 65 73  tontest-name res
83b0: 75 6c 74 29 29 29 29 29 29 0a 09 09 09 09 74 65  ult)))))).....te
83c0: 73 74 73 29 0a 09 09 20 20 20 20 20 20 28 69 66  sts)...      (if
83d0: 20 28 6e 6f 74 20 65 76 65 72 2d 73 65 65 6e 29   (not ever-seen)
83e0: 28 73 65 74 21 20 72 65 73 75 6c 74 20 28 63 6f  (set! result (co
83f0: 6e 73 20 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61  ns waitontest-na
8400: 6d 65 20 72 65 73 75 6c 74 29 29 29 29 29 0a 09  me result)))))..
8410: 09 20 20 77 61 69 74 6f 6e 29 0a 09 28 64 65 6c  .  waiton)..(del
8420: 65 74 65 2d 64 75 70 6c 69 63 61 74 65 73 20 72  ete-duplicates r
8430: 65 73 75 6c 74 29 29 29 29 0a 0a 3b 3b 3d 3d 3d  esult))))..;;===
8440: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8450: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8460: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8470: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8480: 3d 3d 3d 0a 3b 3b 20 45 78 74 72 61 63 74 20 6f  ===.;; Extract o
8490: 64 73 20 66 69 6c 65 20 66 72 6f 6d 20 74 68 65  ds file from the
84a0: 20 64 62 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d   db.;;==========
84b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
84c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
84d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
84e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b  ============..;;
84f0: 20 72 75 6e 73 70 61 74 74 20 69 73 20 61 20 63   runspatt is a c
8500: 6f 6d 6d 61 20 64 65 6c 69 6d 69 74 65 64 20 6c  omma delimited l
8510: 69 73 74 20 6f 66 20 72 75 6e 20 70 61 74 74 65  ist of run patte
8520: 72 6e 73 0a 3b 3b 20 6b 65 79 70 61 74 74 2d 61  rns.;; keypatt-a
8530: 6c 69 73 74 20 6d 75 73 74 20 63 6f 6e 74 61 69  list must contai
8540: 6e 20 2a 61 6c 6c 2a 20 6b 65 79 73 20 77 69 74  n *all* keys wit
8550: 68 20 61 6e 20 61 73 73 6f 63 69 61 74 65 64 20  h an associated 
8560: 70 61 74 74 65 72 6e 3a 20 27 28 20 28 22 4b 45  pattern: '( ("KE
8570: 59 31 22 20 22 25 22 29 20 2e 2e 20 29 0a 28 64  Y1" "%") .. ).(d
8580: 65 66 69 6e 65 20 28 64 62 3a 65 78 74 72 61 63  efine (db:extrac
8590: 74 2d 6f 64 73 2d 66 69 6c 65 20 64 62 20 6f 75  t-ods-file db ou
85a0: 74 70 75 74 66 69 6c 65 20 6b 65 79 70 61 74 74  tputfile keypatt
85b0: 2d 61 6c 69 73 74 20 72 75 6e 73 70 61 74 74 20  -alist runspatt 
85c0: 70 61 74 68 6d 6f 64 29 0a 20 20 28 6c 65 74 2a  pathmod).  (let*
85d0: 20 28 28 6b 65 79 73 73 74 72 20 20 28 73 74 72   ((keysstr  (str
85e0: 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20  ing-intersperse 
85f0: 28 6d 61 70 20 63 61 72 20 6b 65 79 70 61 74 74  (map car keypatt
8600: 2d 61 6c 69 73 74 29 20 22 2c 22 29 29 0a 09 20  -alist) ",")).. 
8610: 28 6b 65 79 71 72 79 20 20 20 28 73 74 72 69 6e  (keyqry   (strin
8620: 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 28 6d  g-intersperse (m
8630: 61 70 20 28 6c 61 6d 62 64 61 20 28 70 29 28 63  ap (lambda (p)(c
8640: 6f 6e 63 20 28 63 61 72 20 70 29 20 22 20 4c 49  onc (car p) " LI
8650: 4b 45 20 3f 20 22 29 29 20 6b 65 79 70 61 74 74  KE ? ")) keypatt
8660: 2d 61 6c 69 73 74 29 20 22 20 41 4e 44 20 22 29  -alist) " AND ")
8670: 29 0a 09 20 28 6e 75 6d 6b 65 79 73 20 20 28 6c  ).. (numkeys  (l
8680: 65 6e 67 74 68 20 6b 65 79 70 61 74 74 2d 61 6c  ength keypatt-al
8690: 69 73 74 29 29 0a 09 20 28 74 65 73 74 2d 69 64  ist)).. (test-id
86a0: 73 20 27 28 29 29 0a 09 20 28 77 69 6e 64 6f 77  s '()).. (window
86b0: 73 20 20 28 61 6e 64 20 70 61 74 68 6d 6f 64 20  s  (and pathmod 
86c0: 28 73 75 62 73 74 72 69 6e 67 2d 69 6e 64 65 78  (substring-index
86d0: 20 22 5c 5c 22 20 70 61 74 68 6d 6f 64 29 29 29   "\\" pathmod)))
86e0: 0a 09 20 28 74 65 6d 70 64 69 72 20 20 28 63 6f  .. (tempdir  (co
86f0: 6e 63 20 22 2f 74 6d 70 2f 22 20 28 63 75 72 72  nc "/tmp/" (curr
8700: 65 6e 74 2d 75 73 65 72 2d 6e 61 6d 65 29 20 22  ent-user-name) "
8710: 2f 22 20 72 75 6e 73 70 61 74 74 20 22 5f 22 20  /" runspatt "_" 
8720: 28 72 61 6e 64 6f 6d 20 31 30 30 30 30 29 20 22  (random 10000) "
8730: 5f 22 20 28 63 75 72 72 65 6e 74 2d 70 72 6f 63  _" (current-proc
8740: 65 73 73 2d 69 64 29 29 29 0a 09 20 28 72 75 6e  ess-id))).. (run
8750: 73 68 65 61 64 65 72 20 28 61 70 70 65 6e 64 20  sheader (append 
8760: 28 6c 69 73 74 20 22 52 75 6e 20 49 64 22 20 22  (list "Run Id" "
8770: 52 75 6e 6e 61 6d 65 22 29 20 3b 20 30 20 31 0a  Runname") ; 0 1.
8780: 09 09 09 20 20 20 20 20 28 6d 61 70 20 63 61 72  ...     (map car
8790: 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 29 20   keypatt-alist) 
87a0: 20 20 3b 20 2b 20 4e 20 3d 20 6c 65 6e 67 74 68    ; + N = length
87b0: 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 0a 09   keypatt-alist..
87c0: 09 09 20 20 20 20 20 28 6c 69 73 74 20 22 54 65  ..     (list "Te
87d0: 73 74 6e 61 6d 65 22 20 20 20 20 20 20 20 20 20  stname"         
87e0: 20 3b 20 32 0a 09 09 09 09 20 20 20 22 49 74 65   ; 2.....   "Ite
87f0: 6d 20 50 61 74 68 22 20 20 20 20 20 20 20 20 20  m Path"         
8800: 3b 20 33 20 0a 09 09 09 09 20 20 20 22 44 65 73  ; 3 .....   "Des
8810: 63 72 69 70 74 69 6f 6e 22 20 20 20 20 20 20 20  cription"       
8820: 3b 20 34 20 0a 09 09 09 09 20 20 20 22 53 74 61  ; 4 .....   "Sta
8830: 74 65 22 20 20 20 20 20 20 20 20 20 20 20 20 20  te"             
8840: 3b 20 35 20 0a 09 09 09 09 20 20 20 22 53 74 61  ; 5 .....   "Sta
8850: 74 75 73 22 20 20 20 20 20 20 20 20 20 20 20 20  tus"            
8860: 3b 20 36 20 20 0a 09 09 09 09 20 20 20 22 46 69  ; 6  .....   "Fi
8870: 6e 61 6c 20 4c 6f 67 22 20 20 20 20 20 20 20 20  nal Log"        
8880: 20 3b 20 37 20 0a 09 09 09 09 20 20 20 22 52 75   ; 7 .....   "Ru
8890: 6e 20 44 75 72 61 74 69 6f 6e 22 20 20 20 20 20  n Duration"     
88a0: 20 3b 20 38 20 0a 09 09 09 09 20 20 20 22 57 68   ; 8 .....   "Wh
88b0: 65 6e 20 52 75 6e 22 20 20 20 20 20 20 20 20 20  en Run"         
88c0: 20 3b 20 39 20 0a 09 09 09 09 20 20 20 22 54 61   ; 9 .....   "Ta
88d0: 67 73 22 20 20 20 20 20 20 20 20 20 20 20 20 20  gs"             
88e0: 20 3b 20 31 30 0a 09 09 09 09 20 20 20 22 52 75   ; 10.....   "Ru
88f0: 6e 20 4f 77 6e 65 72 22 20 20 20 20 20 20 20 20  n Owner"        
8900: 20 3b 20 31 31 0a 09 09 09 09 20 20 20 22 43 6f   ; 11.....   "Co
8910: 6d 6d 65 6e 74 22 20 20 20 20 20 20 20 20 20 20  mment"          
8920: 20 3b 20 31 32 0a 09 09 09 09 20 20 20 22 41 75   ; 12.....   "Au
8930: 74 68 6f 72 22 20 20 20 20 20 20 20 20 20 20 20  thor"           
8940: 20 3b 20 31 33 0a 09 09 09 09 20 20 20 22 54 65   ; 13.....   "Te
8950: 73 74 20 4f 77 6e 65 72 22 20 20 20 20 20 20 20  st Owner"       
8960: 20 3b 20 31 34 0a 09 09 09 09 20 20 20 22 52 65   ; 14.....   "Re
8970: 76 69 65 77 65 64 22 20 20 20 20 20 20 20 20 20  viewed"         
8980: 20 3b 20 31 35 0a 09 09 09 09 20 20 20 22 44 69   ; 15.....   "Di
8990: 73 6b 66 72 65 65 22 20 20 20 20 20 20 20 20 20  skfree"         
89a0: 20 3b 20 31 36 0a 09 09 09 09 20 20 20 22 55 6e   ; 16.....   "Un
89b0: 61 6d 65 22 20 20 20 20 20 20 20 20 20 20 20 20  ame"            
89c0: 20 3b 20 31 37 0a 09 09 09 09 20 20 20 22 52 75   ; 17.....   "Ru
89d0: 6e 64 69 72 22 20 20 20 20 20 20 20 20 20 20 20  ndir"           
89e0: 20 3b 20 31 38 0a 09 09 09 09 20 20 20 22 48 6f   ; 18.....   "Ho
89f0: 73 74 22 20 20 20 20 20 20 20 20 20 20 20 20 20  st"             
8a00: 20 3b 20 31 39 0a 09 09 09 09 20 20 20 22 43 70   ; 19.....   "Cp
8a10: 75 20 4c 6f 61 64 22 20 20 20 20 20 20 20 20 20  u Load"         
8a20: 20 3b 20 32 30 0a 09 09 09 09 20 20 20 29 29 29   ; 20.....   )))
8a30: 0a 09 20 28 72 65 73 75 6c 74 73 20 28 6c 69 73  .. (results (lis
8a40: 74 20 72 75 6e 73 68 65 61 64 65 72 29 29 09 09  t runsheader))..
8a50: 09 20 0a 09 20 28 74 65 73 74 64 61 74 61 2d 68  . .. (testdata-h
8a60: 65 61 64 65 72 20 28 6c 69 73 74 20 22 52 75 6e  eader (list "Run
8a70: 20 49 64 22 20 22 54 65 73 74 6e 61 6d 65 22 20   Id" "Testname" 
8a80: 22 49 74 65 6d 20 50 61 74 68 22 20 22 43 61 74  "Item Path" "Cat
8a90: 65 67 6f 72 79 22 20 22 56 61 72 69 61 62 6c 65  egory" "Variable
8aa0: 22 20 22 56 61 6c 75 65 22 20 22 45 78 70 65 63  " "Value" "Expec
8ab0: 74 65 64 22 20 22 54 6f 6c 22 20 22 55 6e 69 74  ted" "Tol" "Unit
8ac0: 73 22 20 22 53 74 61 74 75 73 22 20 22 43 6f 6d  s" "Status" "Com
8ad0: 6d 65 6e 74 22 29 29 29 0a 20 20 20 20 28 64 65  ment"))).    (de
8ae0: 62 75 67 3a 70 72 69 6e 74 20 32 20 22 55 73 69  bug:print 2 "Usi
8af0: 6e 67 20 22 20 74 65 6d 70 64 69 72 20 22 20 66  ng " tempdir " f
8b00: 6f 72 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20  or constructing 
8b10: 74 68 65 20 6f 64 73 20 66 69 6c 65 2e 20 6b 65  the ods file. ke
8b20: 79 71 72 79 3a 20 22 20 6b 65 79 71 72 79 20 22  yqry: " keyqry "
8b30: 20 6b 65 79 73 74 72 3a 20 22 20 6b 65 79 73 73   keystr: " keyss
8b40: 74 72 20 22 20 77 69 74 68 20 6b 65 79 73 3a 20  tr " with keys: 
8b50: 22 20 28 6d 61 70 20 63 61 64 72 20 6b 65 79 70  " (map cadr keyp
8b60: 61 74 74 2d 61 6c 69 73 74 29 29 0a 20 20 20 20  att-alist)).    
8b70: 3b 3b 20 22 45 78 70 65 63 74 65 64 20 56 61 6c  ;; "Expected Val
8b80: 75 65 22 0a 20 20 20 20 3b 3b 20 22 56 61 6c 75  ue".    ;; "Valu
8b90: 65 20 46 6f 75 6e 64 22 0a 20 20 20 20 3b 3b 20  e Found".    ;; 
8ba0: 22 54 6f 6c 65 72 61 6e 63 65 22 0a 20 20 20 20  "Tolerance".    
8bb0: 28 61 70 70 6c 79 20 73 71 6c 69 74 65 33 3a 66  (apply sqlite3:f
8bc0: 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 20  or-each-row.    
8bd0: 20 28 6c 61 6d 62 64 61 20 28 74 65 73 74 2d 69   (lambda (test-i
8be0: 64 20 2e 20 62 29 0a 20 20 20 20 20 20 20 28 73  d . b).       (s
8bf0: 65 74 21 20 74 65 73 74 2d 69 64 73 20 28 63 6f  et! test-ids (co
8c00: 6e 73 20 74 65 73 74 2d 69 64 20 74 65 73 74 2d  ns test-id test-
8c10: 69 64 73 29 29 20 20 20 3b 3b 20 74 65 73 74 2d  ids))   ;; test-
8c20: 69 64 20 69 73 20 6e 6f 77 20 74 65 73 74 6e 61  id is now testna
8c30: 6d 65 0a 20 20 20 20 20 20 20 28 73 65 74 21 20  me.       (set! 
8c40: 72 65 73 75 6c 74 73 20 28 61 70 70 65 6e 64 20  results (append 
8c50: 72 65 73 75 6c 74 73 20 3b 3b 20 6e 6f 74 65 2c  results ;; note,
8c60: 20 64 72 6f 70 20 74 68 65 20 74 65 73 74 2d 69   drop the test-i
8c70: 64 0a 09 09 09 20 20 20 20 20 28 6c 69 73 74 0a  d....     (list.
8c80: 09 09 09 20 20 20 20 20 20 28 69 66 20 70 61 74  ...      (if pat
8c90: 68 6d 6f 64 0a 09 09 09 09 20 20 28 6c 65 74 2a  hmod.....  (let*
8ca0: 20 28 28 76 62 20 20 20 20 20 20 20 20 28 61 70   ((vb        (ap
8cb0: 70 6c 79 20 76 65 63 74 6f 72 20 62 29 29 0a 09  ply vector b))..
8cc0: 09 09 09 09 20 28 6b 65 79 76 61 6c 73 20 20 20  .... (keyvals   
8cd0: 28 6c 65 74 20 6c 6f 6f 70 20 28 28 69 20 20 20  (let loop ((i   
8ce0: 20 30 29 0a 09 09 09 09 09 09 09 20 20 20 20 20   0)........     
8cf0: 20 20 28 72 65 73 20 27 28 29 29 29 0a 09 09 09    (res '()))....
8d00: 09 09 09 20 20 20 20 20 20 28 69 66 20 28 3e 3d  ...      (if (>=
8d10: 20 69 20 6e 75 6d 6b 65 79 73 29 0a 09 09 09 09   i numkeys).....
8d20: 09 09 09 20 20 72 65 73 0a 09 09 09 09 09 09 09  ...  res........
8d30: 20 20 28 6c 6f 6f 70 20 28 2b 20 69 20 31 29 0a    (loop (+ i 1).
8d40: 09 09 09 09 09 09 09 09 28 61 70 70 65 6e 64 20  ........(append 
8d50: 72 65 73 20 28 6c 69 73 74 20 28 76 65 63 74 6f  res (list (vecto
8d60: 72 2d 72 65 66 20 76 62 20 28 2b 20 69 20 32 29  r-ref vb (+ i 2)
8d70: 29 29 29 29 29 29 29 0a 09 09 09 09 09 20 28 72  )))))))...... (r
8d80: 75 6e 6e 61 6d 65 20 20 20 28 76 65 63 74 6f 72  unname   (vector
8d90: 2d 72 65 66 20 76 62 20 31 29 29 0a 09 09 09 09  -ref vb 1)).....
8da0: 09 20 28 74 65 73 74 6e 61 6d 65 20 20 28 76 65  . (testname  (ve
8db0: 63 74 6f 72 2d 72 65 66 20 76 62 20 28 2b 20 20  ctor-ref vb (+  
8dc0: 32 20 6e 75 6d 6b 65 79 73 29 29 29 0a 09 09 09  2 numkeys)))....
8dd0: 09 09 20 28 69 74 65 6d 2d 70 61 74 68 20 28 76  .. (item-path (v
8de0: 65 63 74 6f 72 2d 72 65 66 20 76 62 20 28 2b 20  ector-ref vb (+ 
8df0: 20 33 20 6e 75 6d 6b 65 79 73 29 29 29 0a 09 09   3 numkeys)))...
8e00: 09 09 09 20 28 66 69 6e 61 6c 2d 6c 6f 67 20 28  ... (final-log (
8e10: 76 65 63 74 6f 72 2d 72 65 66 20 76 62 20 28 2b  vector-ref vb (+
8e20: 20 20 37 20 6e 75 6d 6b 65 79 73 29 29 29 0a 09    7 numkeys)))..
8e30: 09 09 09 09 20 28 72 75 6e 2d 64 69 72 20 20 20  .... (run-dir   
8e40: 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62 20 28  (vector-ref vb (
8e50: 2b 20 31 38 20 6e 75 6d 6b 65 79 73 29 29 29 0a  + 18 numkeys))).
8e60: 09 09 09 09 09 20 28 6c 6f 67 2d 66 70 61 74 68  ..... (log-fpath
8e70: 20 28 63 6f 6e 63 20 72 75 6e 2d 64 69 72 20 22   (conc run-dir "
8e80: 2f 22 20 20 66 69 6e 61 6c 2d 6c 6f 67 29 29 29  /"  final-log)))
8e90: 20 3b 3b 20 28 73 74 72 69 6e 67 2d 69 6e 74 65   ;; (string-inte
8ea0: 72 73 70 65 72 73 65 20 6b 65 79 76 61 6c 73 20  rsperse keyvals 
8eb0: 22 2f 22 29 20 22 2f 22 20 74 65 73 74 6e 61 6d  "/") "/" testnam
8ec0: 65 20 22 2f 22 20 69 74 65 6d 2d 70 61 74 68 20  e "/" item-path 
8ed0: 22 2f 22 0a 09 09 09 09 20 20 20 20 28 64 65 62  "/".....    (deb
8ee0: 75 67 3a 70 72 69 6e 74 20 34 20 22 6c 6f 67 3a  ug:print 4 "log:
8ef0: 20 22 20 6c 6f 67 2d 66 70 61 74 68 20 22 20 65   " log-fpath " e
8f00: 78 69 73 74 73 3a 20 22 20 28 66 69 6c 65 2d 65  xists: " (file-e
8f10: 78 69 73 74 73 3f 20 6c 6f 67 2d 66 70 61 74 68  xists? log-fpath
8f20: 29 29 0a 09 09 09 09 20 20 20 20 28 76 65 63 74  )).....    (vect
8f30: 6f 72 2d 73 65 74 21 20 76 62 20 28 2b 20 37 20  or-set! vb (+ 7 
8f40: 6e 75 6d 6b 65 79 73 29 20 28 69 66 20 28 66 69  numkeys) (if (fi
8f50: 6c 65 2d 65 78 69 73 74 73 3f 20 6c 6f 67 2d 66  le-exists? log-f
8f60: 70 61 74 68 29 0a 09 09 09 09 09 09 09 09 20 20  path).........  
8f70: 20 20 20 20 28 6c 65 74 20 28 28 6e 65 77 70 61      (let ((newpa
8f80: 74 68 20 28 63 6f 6e 63 20 70 61 74 68 6d 6f 64  th (conc pathmod
8f90: 20 22 2f 22 0a 09 09 09 09 09 09 09 09 09 09 09   "/"............
8fa0: 20 20 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72     (string-inter
8fb0: 73 70 65 72 73 65 20 6b 65 79 76 61 6c 73 20 22  sperse keyvals "
8fc0: 2f 22 29 0a 09 09 09 09 09 09 09 09 09 09 09 20  /")............ 
8fd0: 20 20 22 2f 22 20 72 75 6e 6e 61 6d 65 20 22 2f    "/" runname "/
8fe0: 22 20 74 65 73 74 6e 61 6d 65 20 22 2f 22 0a 09  " testname "/"..
8ff0: 09 09 09 09 09 09 09 09 09 09 20 20 20 28 69 66  ..........   (if
9000: 20 28 73 74 72 69 6e 67 3d 3f 20 69 74 65 6d 2d   (string=? item-
9010: 70 61 74 68 20 22 22 29 20 22 22 20 28 63 6f 6e  path "") "" (con
9020: 63 20 22 2f 22 20 69 74 65 6d 2d 70 61 74 68 29  c "/" item-path)
9030: 29 0a 09 09 09 09 09 09 09 09 09 09 09 20 20 20  )............   
9040: 66 69 6e 61 6c 2d 6c 6f 67 29 29 29 0a 09 09 09  final-log)))....
9050: 09 09 09 09 09 09 3b 3b 20 66 6f 72 20 6e 6f 77  ......;; for now
9060: 20 74 68 72 6f 77 20 61 77 61 79 20 6e 65 77 70   throw away newp
9070: 61 74 68 20 61 6e 64 20 75 73 65 20 74 68 65 20  ath and use the 
9080: 6c 6f 67 2d 66 70 61 74 68 20 63 6f 6e 63 27 64  log-fpath conc'd
9090: 20 77 69 74 68 20 70 61 74 68 6d 6f 64 0a 09 09   with pathmod...
90a0: 09 09 09 09 09 09 09 28 73 65 74 21 20 6e 65 77  .......(set! new
90b0: 70 61 74 68 20 28 63 6f 6e 63 20 70 61 74 68 6d  path (conc pathm
90c0: 6f 64 20 6c 6f 67 2d 66 70 61 74 68 29 29 0a 09  od log-fpath))..
90d0: 09 09 09 09 09 09 09 09 28 69 66 20 77 69 6e 64  ........(if wind
90e0: 6f 77 73 20 28 73 74 72 69 6e 67 2d 74 72 61 6e  ows (string-tran
90f0: 73 6c 61 74 65 20 6e 65 77 70 61 74 68 20 22 2f  slate newpath "/
9100: 22 20 22 5c 5c 22 29 20 6e 65 77 70 61 74 68 29  " "\\") newpath)
9110: 29 0a 09 09 09 09 09 09 09 09 20 20 20 20 20 20  ).........      
9120: 28 69 66 20 28 3e 20 2a 76 65 72 62 6f 73 69 74  (if (> *verbosit
9130: 79 2a 20 31 29 0a 09 09 09 09 09 09 09 09 09 20  y* 1).......... 
9140: 20 28 63 6f 6e 63 20 66 69 6e 61 6c 2d 6c 6f 67   (conc final-log
9150: 20 22 20 6e 6f 74 2d 66 6f 75 6e 64 22 29 0a 09   " not-found")..
9160: 09 09 09 09 09 09 09 09 20 20 22 22 29 29 29 0a  ........  ""))).
9170: 09 09 09 09 20 20 20 20 28 76 65 63 74 6f 72 2d  ....    (vector-
9180: 3e 6c 69 73 74 20 76 62 29 29 0a 09 09 09 09 20  >list vb))..... 
9190: 20 62 29 29 29 29 29 0a 20 20 20 20 20 64 62 0a   b))))).     db.
91a0: 20 20 20 20 20 28 63 6f 6e 63 20 22 53 45 4c 45       (conc "SELE
91b0: 43 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  CT.             
91c0: 20 74 2e 74 65 73 74 6e 61 6d 65 2c 72 2e 69 64   t.testname,r.id
91d0: 2c 72 75 6e 6e 61 6d 65 2c 22 20 6b 65 79 73 73  ,runname," keyss
91e0: 74 72 20 22 2c 74 2e 74 65 73 74 6e 61 6d 65 2c  tr ",t.testname,
91f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
9200: 2e 69 74 65 6d 5f 70 61 74 68 2c 74 6d 2e 64 65  .item_path,tm.de
9210: 73 63 72 69 70 74 69 6f 6e 2c 74 2e 73 74 61 74  scription,t.stat
9220: 65 2c 74 2e 73 74 61 74 75 73 2c 0a 20 20 20 20  e,t.status,.    
9230: 20 20 20 20 20 20 20 20 20 20 66 69 6e 61 6c 5f            final_
9240: 6c 6f 67 66 2c 72 75 6e 5f 64 75 72 61 74 69 6f  logf,run_duratio
9250: 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  n, .            
9260: 20 20 73 74 72 66 74 69 6d 65 28 27 25 6d 2f 25    strftime('%m/%
9270: 64 2f 25 59 20 25 48 3a 25 4d 3a 25 53 27 2c 64  d/%Y %H:%M:%S',d
9280: 61 74 65 74 69 6d 65 28 74 2e 65 76 65 6e 74 5f  atetime(t.event_
9290: 74 69 6d 65 2c 27 75 6e 69 78 65 70 6f 63 68 27  time,'unixepoch'
92a0: 29 2c 27 6c 6f 63 61 6c 74 69 6d 65 27 29 2c 0a  ),'localtime'),.
92b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6d                tm
92c0: 2e 74 61 67 73 2c 72 2e 6f 77 6e 65 72 2c 74 2e  .tags,r.owner,t.
92d0: 63 6f 6d 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20  comment,.       
92e0: 20 20 20 20 20 20 20 61 75 74 68 6f 72 2c 0a 20         author,. 
92f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6d 2e               tm.
9300: 6f 77 6e 65 72 2c 72 65 76 69 65 77 65 64 2c 0a  owner,reviewed,.
9310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
9320: 73 6b 66 72 65 65 2c 75 6e 61 6d 65 2c 72 75 6e  skfree,uname,run
9330: 64 69 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  dir,.           
9340: 20 20 20 68 6f 73 74 2c 63 70 75 6c 6f 61 64 0a     host,cpuload.
9350: 20 20 20 20 20 20 20 20 20 20 20 20 46 52 4f 4d              FROM
9360: 20 74 65 73 74 73 20 41 53 20 74 20 49 4e 4e 45   tests AS t INNE
9370: 52 20 4a 4f 49 4e 20 72 75 6e 73 20 41 53 20 72  R JOIN runs AS r
9380: 20 4f 4e 20 74 2e 72 75 6e 5f 69 64 3d 72 2e 69   ON t.run_id=r.i
9390: 64 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 74 65 73  d INNER JOIN tes
93a0: 74 5f 6d 65 74 61 20 41 53 20 74 6d 20 4f 4e 20  t_meta AS tm ON 
93b0: 74 6d 2e 74 65 73 74 6e 61 6d 65 3d 74 2e 74 65  tm.testname=t.te
93c0: 73 74 6e 61 6d 65 0a 20 20 20 20 20 20 20 20 20  stname.         
93d0: 20 20 20 57 48 45 52 45 20 72 75 6e 6e 61 6d 65     WHERE runname
93e0: 20 4c 49 4b 45 20 3f 20 41 4e 44 20 22 20 6b 65   LIKE ? AND " ke
93f0: 79 71 72 79 20 22 3b 22 29 0a 20 20 20 20 20 72  yqry ";").     r
9400: 75 6e 73 70 61 74 74 20 28 6d 61 70 20 63 61 64  unspatt (map cad
9410: 72 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 29  r keypatt-alist)
9420: 29 0a 20 20 20 20 28 73 65 74 21 20 72 65 73 75  ).    (set! resu
9430: 6c 74 73 20 28 6c 69 73 74 20 28 63 6f 6e 73 20  lts (list (cons 
9440: 22 52 75 6e 73 22 20 72 65 73 75 6c 74 73 29 29  "Runs" results))
9450: 29 0a 20 20 20 20 3b 3b 20 6e 6f 77 2c 20 66 6f  ).    ;; now, fo
9460: 72 20 65 61 63 68 20 74 65 73 74 2c 20 63 6f 6c  r each test, col
9470: 6c 65 63 74 20 74 68 65 20 74 65 73 74 5f 64 61  lect the test_da
9480: 74 61 20 69 6e 66 6f 20 61 6e 64 20 61 64 64 20  ta info and add 
9490: 61 20 6e 65 77 20 73 68 65 65 74 0a 20 20 20 20  a new sheet.    
94a0: 28 66 6f 72 2d 65 61 63 68 0a 20 20 20 20 20 28  (for-each.     (
94b0: 6c 61 6d 62 64 61 20 28 74 65 73 74 2d 69 64 29  lambda (test-id)
94c0: 0a 20 20 20 20 20 20 20 28 6c 65 74 20 28 28 74  .       (let ((t
94d0: 65 73 74 2d 64 61 74 61 20 28 6c 69 73 74 20 74  est-data (list t
94e0: 65 73 74 64 61 74 61 2d 68 65 61 64 65 72 29 29  estdata-header))
94f0: 0a 09 20 20 20 20 20 28 63 75 72 72 2d 74 65 73  ..     (curr-tes
9500: 74 2d 6e 61 6d 65 20 23 66 29 29 0a 09 20 28 73  t-name #f)).. (s
9510: 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d  qlite3:for-each-
9520: 72 6f 77 0a 09 20 20 28 6c 61 6d 62 64 61 20 28  row..  (lambda (
9530: 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20  run-id testname 
9540: 69 74 65 6d 2d 70 61 74 68 20 63 61 74 65 67 6f  item-path catego
9550: 72 79 20 76 61 72 69 61 62 6c 65 20 76 61 6c 75  ry variable valu
9560: 65 20 65 78 70 65 63 74 65 64 20 74 6f 6c 20 75  e expected tol u
9570: 6e 69 74 73 20 73 74 61 74 75 73 20 63 6f 6d 6d  nits status comm
9580: 65 6e 74 29 0a 09 20 20 20 20 28 73 65 74 21 20  ent)..    (set! 
9590: 63 75 72 72 2d 74 65 73 74 2d 6e 61 6d 65 20 74  curr-test-name t
95a0: 65 73 74 6e 61 6d 65 29 0a 09 20 20 20 20 28 73  estname)..    (s
95b0: 65 74 21 20 74 65 73 74 2d 64 61 74 61 20 28 61  et! test-data (a
95c0: 70 70 65 6e 64 20 74 65 73 74 2d 64 61 74 61 20  ppend test-data 
95d0: 28 6c 69 73 74 20 28 6c 69 73 74 20 72 75 6e 2d  (list (list run-
95e0: 69 64 20 74 65 73 74 6e 61 6d 65 20 69 74 65 6d  id testname item
95f0: 2d 70 61 74 68 20 63 61 74 65 67 6f 72 79 20 76  -path category v
9600: 61 72 69 61 62 6c 65 20 76 61 6c 75 65 20 65 78  ariable value ex
9610: 70 65 63 74 65 64 20 74 6f 6c 20 75 6e 69 74 73  pected tol units
9620: 20 73 74 61 74 75 73 20 63 6f 6d 6d 65 6e 74 29   status comment)
9630: 29 29 29 29 0a 09 20 20 64 62 20 0a 09 20 20 3b  ))))..  db ..  ;
9640: 3b 20 22 53 45 4c 45 43 54 20 72 75 6e 5f 69 64  ; "SELECT run_id
9650: 2c 74 65 73 74 6e 61 6d 65 2c 69 74 65 6d 5f 70  ,testname,item_p
9660: 61 74 68 2c 63 61 74 65 67 6f 72 79 2c 76 61 72  ath,category,var
9670: 69 61 62 6c 65 2c 74 64 2e 76 61 6c 75 65 20 41  iable,td.value A
9680: 53 20 76 61 6c 75 65 2c 65 78 70 65 63 74 65 64  S value,expected
9690: 2c 74 6f 6c 2c 75 6e 69 74 73 2c 74 64 2e 73 74  ,tol,units,td.st
96a0: 61 74 75 73 20 41 53 20 73 74 61 74 75 73 2c 74  atus AS status,t
96b0: 64 2e 63 6f 6d 6d 65 6e 74 20 41 53 20 63 6f 6d  d.comment AS com
96c0: 6d 65 6e 74 20 46 52 4f 4d 20 74 65 73 74 5f 64  ment FROM test_d
96d0: 61 74 61 20 41 53 20 74 64 20 49 4e 4e 45 52 20  ata AS td INNER 
96e0: 4a 4f 49 4e 20 74 65 73 74 73 20 4f 4e 20 74 65  JOIN tests ON te
96f0: 73 74 73 2e 69 64 3d 74 64 2e 74 65 73 74 5f 69  sts.id=td.test_i
9700: 64 20 57 48 45 52 45 20 74 65 73 74 5f 69 64 3d  d WHERE test_id=
9710: 3f 3b 22 0a 09 20 20 22 53 45 4c 45 43 54 20 72  ?;"..  "SELECT r
9720: 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d 65 2c 69  un_id,testname,i
9730: 74 65 6d 5f 70 61 74 68 2c 63 61 74 65 67 6f 72  tem_path,categor
9740: 79 2c 76 61 72 69 61 62 6c 65 2c 74 64 2e 76 61  y,variable,td.va
9750: 6c 75 65 20 41 53 20 76 61 6c 75 65 2c 74 64 2e  lue AS value,td.
9760: 65 78 70 65 63 74 65 64 2c 74 64 2e 74 6f 6c 2c  expected,td.tol,
9770: 74 64 2e 75 6e 69 74 73 2c 74 64 2e 73 74 61 74  td.units,td.stat
9780: 75 73 20 41 53 20 73 74 61 74 75 73 2c 74 64 2e  us AS status,td.
9790: 63 6f 6d 6d 65 6e 74 20 41 53 20 63 6f 6d 6d 65  comment AS comme
97a0: 6e 74 20 46 52 4f 4d 20 74 65 73 74 5f 64 61 74  nt FROM test_dat
97b0: 61 20 41 53 20 74 64 20 49 4e 4e 45 52 20 4a 4f  a AS td INNER JO
97c0: 49 4e 20 74 65 73 74 73 20 4f 4e 20 74 65 73 74  IN tests ON test
97d0: 73 2e 69 64 3d 74 64 2e 74 65 73 74 5f 69 64 20  s.id=td.test_id 
97e0: 57 48 45 52 45 20 74 65 73 74 6e 61 6d 65 3d 3f  WHERE testname=?
97f0: 3b 22 0a 09 20 20 74 65 73 74 2d 69 64 29 0a 09  ;"..  test-id)..
9800: 20 28 69 66 20 63 75 72 72 2d 74 65 73 74 2d 6e   (if curr-test-n
9810: 61 6d 65 0a 09 20 20 20 20 20 28 73 65 74 21 20  ame..     (set! 
9820: 72 65 73 75 6c 74 73 20 28 61 70 70 65 6e 64 20  results (append 
9830: 72 65 73 75 6c 74 73 20 28 6c 69 73 74 20 28 63  results (list (c
9840: 6f 6e 73 20 63 75 72 72 2d 74 65 73 74 2d 6e 61  ons curr-test-na
9850: 6d 65 20 74 65 73 74 2d 64 61 74 61 29 29 29 29  me test-data))))
9860: 29 0a 09 20 29 29 0a 20 20 20 20 20 28 73 6f 72  ).. )).     (sor
9870: 74 20 28 64 65 6c 65 74 65 2d 64 75 70 6c 69 63  t (delete-duplic
9880: 61 74 65 73 20 74 65 73 74 2d 69 64 73 29 20 73  ates test-ids) s
9890: 74 72 69 6e 67 3c 3d 29 29 0a 20 20 20 20 28 73  tring<=)).    (s
98a0: 79 73 74 65 6d 20 28 63 6f 6e 63 20 22 6d 6b 64  ystem (conc "mkd
98b0: 69 72 20 2d 70 20 22 20 74 65 6d 70 64 69 72 29  ir -p " tempdir)
98c0: 29 0a 20 20 20 20 3b 3b 20 28 70 70 20 72 65 73  ).    ;; (pp res
98d0: 75 6c 74 73 29 0a 20 20 20 20 28 6f 64 73 3a 6c  ults).    (ods:l
98e0: 69 73 74 2d 3e 6f 64 73 20 0a 20 20 20 20 20 74  ist->ods .     t
98f0: 65 6d 70 64 69 72 0a 20 20 20 20 20 28 69 66 20  empdir.     (if 
9900: 28 73 74 72 69 6e 67 2d 6d 61 74 63 68 20 28 72  (string-match (r
9910: 65 67 65 78 70 20 22 5e 5b 2f 7e 5d 2b 2e 2a 22  egexp "^[/~]+.*"
9920: 29 20 6f 75 74 70 75 74 66 69 6c 65 29 20 3b 3b  ) outputfile) ;;
9930: 20 66 75 6c 6c 20 70 61 74 68 3f 0a 09 20 6f 75   full path?.. ou
9940: 74 70 75 74 66 69 6c 65 0a 09 20 28 62 65 67 69  tputfile.. (begi
9950: 6e 0a 09 20 20 20 28 64 65 62 75 67 3a 70 72 69  n..   (debug:pri
9960: 6e 74 20 30 20 22 57 41 52 4e 49 4e 47 3a 20 70  nt 0 "WARNING: p
9970: 61 74 68 20 67 69 76 65 6e 2c 20 22 20 6f 75 74  ath given, " out
9980: 70 75 74 66 69 6c 65 20 22 20 69 73 20 72 65 6c  putfile " is rel
9990: 61 74 69 76 65 2c 20 70 72 65 66 69 78 69 6e 67  ative, prefixing
99a0: 20 77 69 74 68 20 63 75 72 72 65 6e 74 20 64 69   with current di
99b0: 72 65 63 74 6f 72 79 22 29 0a 09 20 20 20 28 63  rectory")..   (c
99c0: 6f 6e 63 20 28 63 75 72 72 65 6e 74 2d 64 69 72  onc (current-dir
99d0: 65 63 74 6f 72 79 29 20 22 2f 22 20 6f 75 74 70  ectory) "/" outp
99e0: 75 74 66 69 6c 65 29 29 29 0a 20 20 20 20 20 72  utfile))).     r
99f0: 65 73 75 6c 74 73 29 29 29 0a 0a 3b 3b 20 28 64  esults)))..;; (d
9a00: 62 3a 65 78 74 72 61 63 74 2d 6f 64 73 2d 66 69  b:extract-ods-fi
9a10: 6c 65 20 64 62 20 22 6f 75 74 70 75 74 66 69 6c  le db "outputfil
9a20: 65 2e 6f 64 73 22 20 27 28 28 22 73 79 73 6e 61  e.ods" '(("sysna
9a30: 6d 65 22 20 22 25 22 29 28 22 66 73 6e 61 6d 65  me" "%")("fsname
9a40: 22 20 22 25 22 29 28 22 64 61 74 61 70 61 74 68  " "%")("datapath
9a50: 22 20 22 25 22 29 29 20 22 25 22 29 0a           " "%")) "%").