Megatest

Hex Artifact Content
Login

Artifact 807a3e0dc9159003e65e1093f219cd84882fab39:


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 20 44    logfile TEXT D
1280: 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20  EFAULT '',.     
1290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a0: 20 20 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52            CONSTR
12b0: 41 49 4e 54 20 74 65 73 74 5f 73 74 65 70 73 5f  AINT test_steps_
12c0: 63 6f 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 55  constraint UNIQU
12d0: 45 20 28 74 65 73 74 5f 69 64 2c 73 74 65 70 6e  E (test_id,stepn
12e0: 61 6d 65 2c 73 74 61 74 65 29 29 3b 22 29 0a 09  ame,state));")..
12f0: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
1300: 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41  te db "CREATE TA
1310: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54  BLE IF NOT EXIST
1320: 53 20 65 78 74 72 61 64 61 74 20 28 69 64 20 49  S extradat (id I
1330: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
1340: 45 59 2c 20 72 75 6e 5f 69 64 20 49 4e 54 45 47  EY, run_id INTEG
1350: 45 52 2c 20 6b 65 79 20 54 45 58 54 2c 20 76 61  ER, key TEXT, va
1360: 6c 20 54 45 58 54 29 3b 22 29 0a 09 20 20 28 73  l TEXT);")..  (s
1370: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64  qlite3:execute d
1380: 62 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  b "CREATE TABLE 
1390: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 6d 65  IF NOT EXISTS me
13a0: 74 61 64 61 74 20 28 69 64 20 49 4e 54 45 47 45  tadat (id INTEGE
13b0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76  R PRIMARY KEY, v
13c0: 61 72 20 54 45 58 54 2c 20 76 61 6c 20 54 45 58  ar TEXT, val TEX
13d0: 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  T,.             
13e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f0: 20 20 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20       CONSTRAINT 
1400: 6d 65 74 61 64 61 74 5f 63 6f 6e 73 74 72 61 69  metadat_constrai
1410: 6e 74 20 55 4e 49 51 55 45 20 28 76 61 72 29 29  nt UNIQUE (var))
1420: 3b 22 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a  ;")..  (sqlite3:
1430: 65 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41  execute db "CREA
1440: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  TE TABLE IF NOT 
1450: 45 58 49 53 54 53 20 61 63 63 65 73 73 5f 6c 6f  EXISTS access_lo
1460: 67 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52  g (id INTEGER PR
1470: 49 4d 41 52 59 20 4b 45 59 2c 20 75 73 65 72 20  IMARY KEY, user 
1480: 54 45 58 54 2c 20 61 63 63 65 73 73 65 64 20 54  TEXT, accessed T
1490: 49 4d 45 53 54 41 4d 50 2c 20 61 72 67 73 20 54  IMESTAMP, args T
14a0: 45 58 54 29 3b 22 29 0a 09 20 20 28 73 71 6c 69  EXT);")..  (sqli
14b0: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22  te3:execute db "
14c0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20  CREATE TABLE IF 
14d0: 4e 4f 54 20 45 58 49 53 54 53 20 74 65 73 74 5f  NOT EXISTS test_
14e0: 6d 65 74 61 20 28 69 64 20 49 4e 54 45 47 45 52  meta (id INTEGER
14f0: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20   PRIMARY KEY,.  
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 20 20 20 20 20 20 20 20                  
1520: 20 20 20 74 65 73 74 6e 61 6d 65 20 20 20 20 54     testname    T
1530: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a  EXT DEFAULT '',.
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 20 20 20 20 20 20                  
1560: 20 20 20 20 20 61 75 74 68 6f 72 20 20 20 20 20       author     
1570: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27   TEXT DEFAULT ''
1580: 2c 0a 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 20 20 20 20                  
15a0: 20 20 20 20 20 20 20 6f 77 6e 65 72 20 20 20 20         owner    
15b0: 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20     TEXT DEFAULT 
15c0: 27 27 2c 0a 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 20 20                  
15e0: 20 20 20 20 20 20 20 20 20 64 65 73 63 72 69 70           descrip
15f0: 74 69 6f 6e 20 54 45 58 54 20 44 45 46 41 55 4c  tion TEXT DEFAUL
1600: 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20  T '',.          
1610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1620: 20 20 20 20 20 20 20 20 20 20 20 72 65 76 69 65             revie
1630: 77 65 64 20 20 20 20 54 49 4d 45 53 54 41 4d 50  wed    TIMESTAMP
1640: 2c 0a 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 20 20 20 20                  
1660: 20 20 20 20 20 20 20 69 74 65 72 61 74 65 64 20         iterated 
1670: 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20     TEXT DEFAULT 
1680: 27 27 2c 0a 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 20 20                  
16a0: 20 20 20 20 20 20 20 20 20 61 76 67 5f 72 75 6e           avg_run
16b0: 74 69 6d 65 20 52 45 41 4c 2c 0a 20 20 20 20 20  time REAL,.     
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e0: 61 76 67 5f 64 69 73 6b 20 20 20 20 52 45 41 4c  avg_disk    REAL
16f0: 2c 0a 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 20 20 20 20                  
1710: 20 20 20 20 20 20 20 74 61 67 73 20 20 20 20 20         tags     
1720: 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20     TEXT DEFAULT 
1730: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '',.            
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1750: 20 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 74      CONSTRAINT t
1760: 65 73 74 5f 6d 65 74 61 5f 63 6f 6e 73 74 72 61  est_meta_constra
1770: 69 6e 74 20 55 4e 49 51 55 45 20 28 74 65 73 74  int UNIQUE (test
1780: 6e 61 6d 65 29 29 3b 22 29 0a 09 20 20 28 73 71  name));")..  (sq
1790: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62  lite3:execute db
17a0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49   "CREATE TABLE I
17b0: 46 20 4e 4f 54 20 45 58 49 53 54 53 20 74 65 73  F NOT EXISTS tes
17c0: 74 5f 64 61 74 61 20 28 69 64 20 49 4e 54 45 47  t_data (id INTEG
17d0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a  ER PRIMARY KEY,.
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1800: 74 65 73 74 5f 69 64 20 49 4e 54 45 47 45 52 2c  test_id INTEGER,
1810: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1830: 20 63 61 74 65 67 6f 72 79 20 54 45 58 54 20 44   category TEXT D
1840: 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20  EFAULT '',.     
1850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1860: 20 20 20 20 20 20 20 20 20 20 20 76 61 72 69 61             varia
1870: 62 6c 65 20 54 45 58 54 2c 0a 09 20 20 20 20 20  ble TEXT,..     
1880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1890: 20 20 20 76 61 6c 75 65 20 52 45 41 4c 2c 0a 09     value REAL,..
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b0: 20 20 20 20 20 20 20 20 65 78 70 65 63 74 65 64          expected
18c0: 20 52 45 41 4c 2c 0a 09 20 20 20 20 20 20 20 20   REAL,..        
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e0: 74 6f 6c 20 52 45 41 4c 2c 0a 20 20 20 20 20 20  tol REAL,.      
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1900: 20 20 20 20 20 20 20 20 20 20 75 6e 69 74 73 20            units 
1910: 54 45 58 54 2c 0a 20 20 20 20 20 20 20 20 20 20  TEXT,.          
1920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1930: 20 20 20 20 20 20 63 6f 6d 6d 65 6e 74 20 54 45        comment TE
1940: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20  XT DEFAULT '',. 
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1970: 74 61 74 75 73 20 54 45 58 54 20 44 45 46 41 55  tatus TEXT DEFAU
1980: 4c 54 20 27 6e 2f 61 27 2c 0a 20 20 20 20 20 20  LT 'n/a',.      
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a0: 20 20 20 20 20 20 20 20 20 20 74 79 70 65 20 54            type T
19b0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a  EXT DEFAULT '',.
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 4f                CO
19e0: 4e 53 54 52 41 49 4e 54 20 74 65 73 74 5f 64 61  NSTRAINT test_da
19f0: 74 61 5f 63 6f 6e 73 74 72 61 69 6e 74 20 55 4e  ta_constraint UN
1a00: 49 51 55 45 20 28 74 65 73 74 5f 69 64 2c 63 61  IQUE (test_id,ca
1a10: 74 65 67 6f 72 79 2c 76 61 72 69 61 62 6c 65 29  tegory,variable)
1a20: 29 3b 22 29 0a 09 20 20 3b 3b 20 4d 75 73 74 20  );")..  ;; Must 
1a30: 64 6f 20 74 68 69 73 20 2a 61 66 74 65 72 2a 20  do this *after* 
1a40: 72 75 6e 6e 69 6e 67 20 70 61 74 63 68 20 64 62  running patch db
1a50: 20 21 21 20 4e 6f 20 6d 6f 72 65 2e 20 0a 09 20   !! No more. .. 
1a60: 20 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20   (db:set-var db 
1a70: 22 4d 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f  "MEGATEST_VERSIO
1a80: 4e 22 20 6d 65 67 61 74 65 73 74 2d 76 65 72 73  N" megatest-vers
1a90: 69 6f 6e 29 0a 09 20 20 29 29 0a 20 20 20 20 64  ion)..  )).    d
1aa0: 62 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d  b))..;;=========
1ab0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1ac0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1ad0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1ae0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b  =============.;;
1af0: 20 54 4f 44 4f 3a 0a 3b 3b 20 20 20 70 75 74 20   TODO:.;;   put 
1b00: 64 65 6c 74 61 73 20 69 6e 74 6f 20 61 6e 20 61  deltas into an a
1b10: 73 73 6f 63 20 6c 69 73 74 20 77 69 74 68 20 76  ssoc list with v
1b20: 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 73 0a 3b  ersion numbers.;
1b30: 3b 20 20 20 61 70 70 6c 79 20 61 6c 6c 20 66 72  ;   apply all fr
1b40: 6f 6d 20 6c 61 73 74 20 74 6f 20 63 75 72 72 65  om last to curre
1b50: 6e 74 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  nt.;;===========
1b60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1b70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1b80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1b90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 28 64 65 66  ===========.(def
1ba0: 69 6e 65 20 28 70 61 74 63 68 2d 64 62 20 64 62  ine (patch-db db
1bb0: 29 0a 20 20 28 68 61 6e 64 6c 65 2d 65 78 63 65  ).  (handle-exce
1bc0: 70 74 69 6f 6e 73 0a 20 20 20 65 78 6e 0a 20 20  ptions.   exn.  
1bd0: 20 28 62 65 67 69 6e 0a 20 20 20 20 20 28 70 72   (begin.     (pr
1be0: 69 6e 74 20 22 45 78 63 65 70 74 69 6f 6e 3a 20  int "Exception: 
1bf0: 22 20 65 78 6e 29 0a 20 20 20 20 20 28 70 72 69  " exn).     (pri
1c00: 6e 74 20 22 45 52 52 4f 52 3a 20 50 6f 73 73 69  nt "ERROR: Possi
1c10: 62 6c 65 20 6f 75 74 20 6f 66 20 64 61 74 65 20  ble out of date 
1c20: 73 63 68 65 6d 61 2c 20 61 74 74 65 6d 70 74 69  schema, attempti
1c30: 6e 67 20 74 6f 20 61 64 64 20 74 61 62 6c 65 20  ng to add table 
1c40: 6d 65 74 61 64 61 74 61 2e 2e 2e 22 29 0a 20 20  metadata...").  
1c50: 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63     (sqlite3:exec
1c60: 75 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54  ute db "CREATE T
1c70: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
1c80: 54 53 20 6d 65 74 61 64 61 74 20 28 69 64 20 49  TS metadat (id I
1c90: 4e 54 45 47 45 52 2c 20 76 61 72 20 54 45 58 54  NTEGER, var TEXT
1ca0: 2c 20 76 61 6c 20 54 45 58 54 2c 0a 20 20 20 20  , val TEXT,.    
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e               CON
1cd0: 53 54 52 41 49 4e 54 20 6d 65 74 61 64 61 74 5f  STRAINT metadat_
1ce0: 63 6f 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 55  constraint UNIQU
1cf0: 45 20 28 76 61 72 29 29 3b 22 29 0a 20 20 20 20  E (var));").    
1d00: 20 28 69 66 20 28 6e 6f 74 20 28 64 62 3a 67 65   (if (not (db:ge
1d10: 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 45  t-var db "MEGATE
1d20: 53 54 5f 56 45 52 53 49 4f 4e 22 29 29 0a 09 20  ST_VERSION")).. 
1d30: 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22  (db:set-var db "
1d40: 4d 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e  MEGATEST_VERSION
1d50: 22 20 31 2e 31 37 29 29 29 0a 20 20 20 28 6c 65  " 1.17))).   (le
1d60: 74 20 28 28 6d 76 65 72 20 28 64 62 3a 67 65 74  t ((mver (db:get
1d70: 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 53  -var db "MEGATES
1d80: 54 5f 56 45 52 53 49 4f 4e 22 29 29 0a 09 20 28  T_VERSION")).. (
1d90: 74 65 73 74 2d 6d 65 74 61 2d 64 65 66 20 22 43  test-meta-def "C
1da0: 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e  REATE TABLE IF N
1db0: 4f 54 20 45 58 49 53 54 53 20 74 65 73 74 5f 6d  OT EXISTS test_m
1dc0: 65 74 61 20 28 69 64 20 49 4e 54 45 47 45 52 20  eta (id INTEGER 
1dd0: 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20  PRIMARY KEY,.   
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e00: 20 20 74 65 73 74 6e 61 6d 65 20 20 20 20 54 45    testname    TE
1e10: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20  XT DEFAULT '',. 
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e40: 20 20 20 20 61 75 74 68 6f 72 20 20 20 20 20 20      author      
1e50: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c  TEXT DEFAULT '',
1e60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e80: 20 20 20 20 20 20 6f 77 6e 65 72 20 20 20 20 20        owner     
1e90: 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27    TEXT DEFAULT '
1ea0: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ',.             
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ec0: 20 20 20 20 20 20 20 20 64 65 73 63 72 69 70 74          descript
1ed0: 69 6f 6e 20 54 45 58 54 20 44 45 46 41 55 4c 54  ion TEXT DEFAULT
1ee0: 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20   '',.           
1ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f00: 20 20 20 20 20 20 20 20 20 20 72 65 76 69 65 77            review
1f10: 65 64 20 20 20 20 54 49 4d 45 53 54 41 4d 50 2c  ed    TIMESTAMP,
1f20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f40: 20 20 20 20 20 20 69 74 65 72 61 74 65 64 20 20        iterated  
1f50: 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27    TEXT DEFAULT '
1f60: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ',.             
1f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f80: 20 20 20 20 20 20 20 20 61 76 67 5f 72 75 6e 74          avg_runt
1f90: 69 6d 65 20 52 45 41 4c 2c 0a 20 20 20 20 20 20  ime REAL,.      
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
1fc0: 76 67 5f 64 69 73 6b 20 20 20 20 52 45 41 4c 2c  vg_disk    REAL,
1fd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff0: 20 20 20 20 20 20 74 61 67 73 20 20 20 20 20 20        tags      
2000: 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27    TEXT DEFAULT '
2010: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ',.             
2020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2030: 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 65     CONSTRAINT te
2040: 73 74 5f 6d 65 74 61 5f 63 6f 6e 73 74 72 61 69  st_meta_constrai
2050: 6e 74 20 55 4e 49 51 55 45 20 28 74 65 73 74 6e  nt UNIQUE (testn
2060: 61 6d 65 29 29 3b 22 29 29 0a 20 20 20 20 20 28  ame));")).     (
2070: 70 72 69 6e 74 20 22 43 75 72 72 65 6e 74 20 73  print "Current s
2080: 63 68 65 6d 61 20 76 65 72 73 69 6f 6e 3a 20 22  chema version: "
2090: 20 6d 76 65 72 20 22 20 63 75 72 72 65 6e 74 20   mver " current 
20a0: 6d 65 67 61 74 65 73 74 20 76 65 72 73 69 6f 6e  megatest version
20b0: 3a 20 22 20 6d 65 67 61 74 65 73 74 2d 76 65 72  : " megatest-ver
20c0: 73 69 6f 6e 29 0a 20 20 20 20 20 28 63 6f 6e 64  sion).     (cond
20d0: 0a 20 20 20 20 20 20 28 28 6e 6f 74 20 6d 76 65  .      ((not mve
20e0: 72 29 0a 20 20 20 20 20 20 20 28 70 72 69 6e 74  r).       (print
20f0: 20 22 41 64 64 69 6e 67 20 6d 65 67 61 74 65 73   "Adding megates
2100: 74 2d 76 65 72 73 69 6f 6e 20 74 6f 20 6d 65 74  t-version to met
2110: 61 64 61 74 61 22 29 20 3b 3b 20 4e 65 65 64 20  adata") ;; Need 
2120: 74 6f 20 72 65 63 72 65 61 74 65 20 74 68 65 20  to recreate the 
2130: 74 61 62 6c 65 0a 20 20 20 20 20 20 20 28 73 71  table.       (sq
2140: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62  lite3:execute db
2150: 20 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20   "DROP TABLE IF 
2160: 45 58 49 53 54 53 20 6d 65 74 61 64 61 74 3b 22  EXISTS metadat;"
2170: 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ).       (sqlite
2180: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 43 52  3:execute db "CR
2190: 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f  EATE TABLE IF NO
21a0: 54 20 45 58 49 53 54 53 20 6d 65 74 61 64 61 74  T EXISTS metadat
21b0: 20 28 69 64 20 49 4e 54 45 47 45 52 2c 20 76 61   (id INTEGER, va
21c0: 72 20 54 45 58 54 2c 20 76 61 6c 20 54 45 58 54  r TEXT, val TEXT
21d0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21f0: 20 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 6d      CONSTRAINT m
2200: 65 74 61 64 61 74 5f 63 6f 6e 73 74 72 61 69 6e  etadat_constrain
2210: 74 20 55 4e 49 51 55 45 20 28 76 61 72 29 29 3b  t UNIQUE (var));
2220: 22 29 0a 20 20 20 20 20 20 20 28 64 62 3a 73 65  ").       (db:se
2230: 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 45  t-var db "MEGATE
2240: 53 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e 31 37  ST_VERSION" 1.17
2250: 29 0a 20 20 20 20 20 20 20 28 70 61 74 63 68 2d  ).       (patch-
2260: 64 62 29 29 0a 20 20 20 20 20 20 28 28 3c 20 6d  db)).      ((< m
2270: 76 65 72 20 31 2e 32 31 29 0a 20 20 20 20 20 20  ver 1.21).      
2280: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
2290: 65 20 64 62 20 22 44 52 4f 50 20 54 41 42 4c 45  e db "DROP TABLE
22a0: 20 49 46 20 45 58 49 53 54 53 20 6d 65 74 61 64   IF EXISTS metad
22b0: 61 74 3b 22 29 0a 20 20 20 20 20 20 20 28 73 71  at;").       (sq
22c0: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62  lite3:execute db
22d0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49   "CREATE TABLE I
22e0: 46 20 4e 4f 54 20 45 58 49 53 54 53 20 6d 65 74  F NOT EXISTS met
22f0: 61 64 61 74 20 28 69 64 20 49 4e 54 45 47 45 52  adat (id INTEGER
2300: 2c 20 76 61 72 20 54 45 58 54 2c 20 76 61 6c 20  , var TEXT, val 
2310: 54 45 58 54 2c 0a 20 20 20 20 20 20 20 20 20 20  TEXT,.          
2320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2330: 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52 41 49          CONSTRAI
2340: 4e 54 20 6d 65 74 61 64 61 74 5f 63 6f 6e 73 74  NT metadat_const
2350: 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28 76 61  raint UNIQUE (va
2360: 72 29 29 3b 22 29 0a 20 20 20 20 20 20 20 28 64  r));").       (d
2370: 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45  b:set-var db "ME
2380: 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20  GATEST_VERSION" 
2390: 31 2e 32 31 29 20 3b 3b 20 73 65 74 20 62 65 66  1.21) ;; set bef
23a0: 6f 72 65 2c 20 6a 75 73 74 20 69 6e 20 63 61 73  ore, just in cas
23b0: 65 20 74 68 65 20 63 68 61 6e 67 65 73 20 61 72  e the changes ar
23c0: 65 20 61 6c 72 65 61 64 79 20 61 70 70 6c 69 65  e already applie
23d0: 64 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  d.       (sqlite
23e0: 33 3a 65 78 65 63 75 74 65 20 64 62 20 74 65 73  3:execute db tes
23f0: 74 2d 6d 65 74 61 2d 64 65 66 29 0a 20 20 20 20  t-meta-def).    
2400: 20 20 20 3b 28 66 6f 72 2d 65 61 63 68 20 0a 20     ;(for-each . 
2410: 20 20 20 20 20 20 3b 20 28 6c 61 6d 62 64 61 20        ; (lambda 
2420: 28 73 74 6d 74 29 0a 20 20 20 20 20 20 20 3b 20  (stmt).       ; 
2430: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
2440: 74 65 20 64 62 20 73 74 6d 74 29 29 0a 20 20 20  te db stmt)).   
2450: 20 20 20 20 3b 20 28 6c 69 73 74 20 0a 20 20 20      ; (list .   
2460: 20 20 20 20 3b 20 20 22 41 4c 54 45 52 20 54 41      ;  "ALTER TA
2470: 42 4c 45 20 74 65 73 74 73 20 41 44 44 20 43 4f  BLE tests ADD CO
2480: 4c 55 4d 4e 20 66 69 72 73 74 5f 65 72 72 20 54  LUMN first_err T
2490: 45 58 54 3b 22 0a 20 20 20 20 20 20 20 3b 20 20  EXT;".       ;  
24a0: 22 41 4c 54 45 52 20 54 41 42 4c 45 20 74 65 73  "ALTER TABLE tes
24b0: 74 73 20 41 44 44 20 43 4f 4c 55 4d 4e 20 66 69  ts ADD COLUMN fi
24c0: 72 73 74 5f 77 61 72 6e 20 54 45 58 54 3b 22 0a  rst_warn TEXT;".
24d0: 20 20 20 20 20 20 20 3b 20 20 29 29 0a 20 20 20         ;  )).   
24e0: 20 20 20 20 28 70 61 74 63 68 2d 64 62 29 29 0a      (patch-db)).
24f0: 20 20 20 20 20 20 28 28 3c 20 6d 76 65 72 20 31        ((< mver 1
2500: 2e 32 34 29 0a 20 20 20 20 20 20 20 28 64 62 3a  .24).       (db:
2510: 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41  set-var db "MEGA
2520: 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e  TEST_VERSION" 1.
2530: 32 34 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69  24).       (sqli
2540: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22  te3:execute db "
2550: 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58  DROP TABLE IF EX
2560: 49 53 54 53 20 74 65 73 74 5f 64 61 74 61 3b 22  ISTS test_data;"
2570: 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ).       (sqlite
2580: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 44 52  3:execute db "DR
2590: 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53  OP TABLE IF EXIS
25a0: 54 53 20 74 65 73 74 5f 6d 65 74 61 3b 22 29 0a  TS test_meta;").
25b0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a         (sqlite3:
25c0: 65 78 65 63 75 74 65 20 64 62 20 74 65 73 74 2d  execute db test-
25d0: 6d 65 74 61 2d 64 65 66 29 0a 20 20 20 20 20 20  meta-def).      
25e0: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
25f0: 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41 42  e db "CREATE TAB
2600: 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53  LE IF NOT EXISTS
2610: 20 74 65 73 74 5f 64 61 74 61 20 28 69 64 20 49   test_data (id I
2620: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
2630: 45 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  EY,.            
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2650: 20 20 20 20 74 65 73 74 5f 69 64 20 49 4e 54 45      test_id INTE
2660: 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20  GER,.           
2670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2680: 20 20 20 20 20 63 61 74 65 67 6f 72 79 20 54 45       category TE
2690: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20  XT DEFAULT '',. 
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76                 v
26c0: 61 72 69 61 62 6c 65 20 54 45 58 54 2c 0a 09 20  ariable TEXT,.. 
26d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e0: 20 20 20 20 20 20 20 76 61 6c 75 65 20 52 45 41         value REA
26f0: 4c 2c 0a 09 20 20 20 20 20 20 20 20 20 20 20 20  L,..            
2700: 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70 65              expe
2710: 63 74 65 64 20 52 45 41 4c 2c 0a 09 20 20 20 20  cted REAL,..    
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2730: 20 20 20 20 74 6f 6c 20 52 45 41 4c 2c 0a 20 20      tol REAL,.  
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 6e                un
2760: 69 74 73 20 54 45 58 54 2c 0a 20 20 20 20 20 20  its TEXT,.      
2770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2780: 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 65 6e            commen
2790: 74 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27  t TEXT DEFAULT '
27a0: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ',.             
27b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c0: 20 20 20 73 74 61 74 75 73 20 54 45 58 54 20 44     status TEXT D
27d0: 45 46 41 55 4c 54 20 27 6e 2f 61 27 2c 66 6f 73  EFAULT 'n/a',fos
27e0: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s.              
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2800: 43 4f 4e 53 54 52 41 49 4e 54 20 74 65 73 74 5f  CONSTRAINT test_
2810: 64 61 74 61 20 55 4e 49 51 55 45 20 28 74 65 73  data UNIQUE (tes
2820: 74 5f 69 64 2c 63 61 74 65 67 6f 72 79 2c 76 61  t_id,category,va
2830: 72 69 61 62 6c 65 29 29 3b 22 29 0a 20 20 20 20  riable));").    
2840: 20 20 20 28 70 61 74 63 68 2d 64 62 29 29 0a 20     (patch-db)). 
2850: 20 20 20 20 20 28 28 3c 20 6d 76 65 72 20 31 2e       ((< mver 1.
2860: 32 37 29 0a 20 20 20 20 20 20 20 28 64 62 3a 73  27).       (db:s
2870: 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54  et-var db "MEGAT
2880: 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e 32  EST_VERSION" 1.2
2890: 37 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74  7).       (sqlit
28a0: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 41  e3:execute db "A
28b0: 4c 54 45 52 20 54 41 42 4c 45 20 74 65 73 74 5f  LTER TABLE test_
28c0: 64 61 74 61 20 41 44 44 20 43 4f 4c 55 4d 4e 20  data ADD COLUMN 
28d0: 74 79 70 65 20 54 45 58 54 20 44 45 46 41 55 4c  type TEXT DEFAUL
28e0: 54 20 27 27 3b 22 29 0a 20 20 20 20 20 20 20 28  T '';").       (
28f0: 70 61 74 63 68 2d 64 62 29 29 0a 20 20 20 20 20  patch-db)).     
2900: 20 28 28 3c 20 6d 76 65 72 20 31 2e 32 39 29 0a   ((< mver 1.29).
2910: 20 20 20 20 20 20 20 28 64 62 3a 73 65 74 2d 76         (db:set-v
2920: 61 72 20 64 62 20 22 4d 45 47 41 54 45 53 54 5f  ar db "MEGATEST_
2930: 56 45 52 53 49 4f 4e 22 20 31 2e 32 39 29 0a 20  VERSION" 1.29). 
2940: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65        (sqlite3:e
2950: 78 65 63 75 74 65 20 64 62 20 22 41 4c 54 45 52  xecute db "ALTER
2960: 20 54 41 42 4c 45 20 74 65 73 74 5f 73 74 65 70   TABLE test_step
2970: 73 20 41 44 44 20 43 4f 4c 55 4d 4e 20 6c 6f 67  s ADD COLUMN log
2980: 66 69 6c 65 20 54 45 58 54 20 44 45 46 41 55 4c  file TEXT DEFAUL
2990: 54 20 27 27 3b 22 29 0a 20 20 20 20 20 20 20 28  T '';").       (
29a0: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
29b0: 64 62 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20  db "ALTER TABLE 
29c0: 74 65 73 74 73 20 41 44 44 20 43 4f 4c 55 4d 4e  tests ADD COLUMN
29d0: 20 73 68 6f 72 74 64 69 72 20 54 45 58 54 20 44   shortdir TEXT D
29e0: 45 46 41 55 4c 54 20 27 27 3b 22 29 29 0a 20 20  EFAULT '';")).  
29f0: 20 20 20 20 28 28 3c 20 6d 76 65 72 20 6d 65 67      ((< mver meg
2a00: 61 74 65 73 74 2d 76 65 72 73 69 6f 6e 29 0a 20  atest-version). 
2a10: 20 20 20 20 20 20 28 64 62 3a 73 65 74 2d 76 61        (db:set-va
2a20: 72 20 64 62 20 22 4d 45 47 41 54 45 53 54 5f 56  r db "MEGATEST_V
2a30: 45 52 53 49 4f 4e 22 20 6d 65 67 61 74 65 73 74  ERSION" megatest
2a40: 2d 76 65 72 73 69 6f 6e 29 29 29 29 29 29 0a 0a  -version))))))..
2a50: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
2a60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2a70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2a80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2a90: 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 6d 65 74 61  ========.;; meta
2aa0: 20 67 65 74 20 61 6e 64 20 73 65 74 20 76 61 72   get and set var
2ab0: 73 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  s.;;============
2ac0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2ad0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2ae0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2af0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 72  ==========..;; r
2b00: 65 74 75 72 6e 73 20 6e 75 6d 62 65 72 20 69 66  eturns number if
2b10: 20 73 74 72 69 6e 67 2d 3e 6e 75 6d 62 65 72 20   string->number 
2b20: 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73  is successful, s
2b30: 74 72 69 6e 67 20 6f 74 68 65 72 77 69 73 65 0a  tring otherwise.
2b40: 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d  (define (db:get-
2b50: 76 61 72 20 64 62 20 76 61 72 29 0a 20 20 28 6c  var db var).  (l
2b60: 65 74 20 28 28 72 65 73 20 23 66 29 29 0a 20 20  et ((res #f)).  
2b70: 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65    (sqlite3:for-e
2b80: 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61  ach-row.     (la
2b90: 6d 62 64 61 20 28 76 61 6c 29 0a 20 20 20 20 20  mbda (val).     
2ba0: 20 20 28 73 65 74 21 20 72 65 73 20 76 61 6c 29    (set! res val)
2bb0: 29 0a 20 20 20 20 20 64 62 20 22 53 45 4c 45 43  ).     db "SELEC
2bc0: 54 20 76 61 6c 20 46 52 4f 4d 20 6d 65 74 61 64  T val FROM metad
2bd0: 61 74 20 57 48 45 52 45 20 76 61 72 3d 3f 3b 22  at WHERE var=?;"
2be0: 20 76 61 72 29 0a 20 20 20 20 28 69 66 20 28 73   var).    (if (s
2bf0: 74 72 69 6e 67 3f 20 72 65 73 29 0a 09 28 6c 65  tring? res)..(le
2c00: 74 20 28 28 76 61 6c 6e 75 6d 20 28 73 74 72 69  t ((valnum (stri
2c10: 6e 67 2d 3e 6e 75 6d 62 65 72 20 72 65 73 29 29  ng->number res))
2c20: 29 0a 09 20 20 28 69 66 20 76 61 6c 6e 75 6d 20  )..  (if valnum 
2c30: 76 61 6c 6e 75 6d 20 72 65 73 29 29 0a 09 72 65  valnum res))..re
2c40: 73 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64  s)))..(define (d
2c50: 62 3a 73 65 74 2d 76 61 72 20 64 62 20 76 61 72  b:set-var db var
2c60: 20 76 61 6c 29 0a 20 20 28 73 71 6c 69 74 65 33   val).  (sqlite3
2c70: 3a 65 78 65 63 75 74 65 20 64 62 20 22 49 4e 53  :execute db "INS
2c80: 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 49  ERT OR REPLACE I
2c90: 4e 54 4f 20 6d 65 74 61 64 61 74 20 28 76 61 72  NTO metadat (var
2ca0: 2c 76 61 6c 29 20 56 41 4c 55 45 53 20 28 3f 2c  ,val) VALUES (?,
2cb0: 3f 29 3b 22 20 76 61 72 20 76 61 6c 29 29 0a 0a  ?);" var val))..
2cc0: 3b 3b 20 75 73 65 20 61 20 67 6c 6f 62 61 6c 20  ;; use a global 
2cd0: 66 6f 72 20 73 6f 6d 65 20 70 72 69 6d 69 74 69  for some primiti
2ce0: 76 65 20 63 61 63 68 69 6e 67 2c 20 69 74 20 69  ve caching, it i
2cf0: 73 20 6a 75 73 74 20 73 69 6c 6c 79 20 74 6f 20  s just silly to 
2d00: 72 65 2d 72 65 61 64 20 74 68 65 20 64 62 20 0a  re-read the db .
2d10: 3b 3b 20 6f 76 65 72 20 61 6e 64 20 6f 76 65 72  ;; over and over
2d20: 20 61 67 61 69 6e 20 66 6f 72 20 74 68 65 20 6b   again for the k
2d30: 65 79 73 20 73 69 6e 63 65 20 74 68 65 79 20 6e  eys since they n
2d40: 65 76 65 72 20 63 68 61 6e 67 65 0a 0a 28 64 65  ever change..(de
2d50: 66 69 6e 65 20 2a 64 62 2d 6b 65 79 73 2a 20 23  fine *db-keys* #
2d60: 66 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 2d  f)..(define (db-
2d70: 67 65 74 2d 6b 65 79 73 20 64 62 29 0a 20 20 28  get-keys db).  (
2d80: 69 66 20 2a 64 62 2d 6b 65 79 73 2a 20 2a 64 62  if *db-keys* *db
2d90: 2d 6b 65 79 73 2a 20 0a 20 20 20 20 20 20 28 6c  -keys* .      (l
2da0: 65 74 20 28 28 72 65 73 20 27 28 29 29 29 0a 09  et ((res '()))..
2db0: 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63  (sqlite3:for-eac
2dc0: 68 2d 72 6f 77 20 0a 09 20 28 6c 61 6d 62 64 61  h-row .. (lambda
2dd0: 20 28 6b 65 79 20 6b 65 79 74 79 70 65 29 0a 09   (key keytype)..
2de0: 20 20 20 28 73 65 74 21 20 72 65 73 20 28 63 6f     (set! res (co
2df0: 6e 73 20 28 76 65 63 74 6f 72 20 6b 65 79 20 6b  ns (vector key k
2e00: 65 79 74 79 70 65 29 20 72 65 73 29 29 29 0a 09  eytype) res)))..
2e10: 20 64 62 0a 09 20 22 53 45 4c 45 43 54 20 66 69   db.. "SELECT fi
2e20: 65 6c 64 6e 61 6d 65 2c 66 69 65 6c 64 74 79 70  eldname,fieldtyp
2e30: 65 20 46 52 4f 4d 20 6b 65 79 73 20 4f 52 44 45  e FROM keys ORDE
2e40: 52 20 42 59 20 69 64 20 44 45 53 43 3b 22 29 0a  R BY id DESC;").
2e50: 09 28 73 65 74 21 20 2a 64 62 2d 6b 65 79 73 2a  .(set! *db-keys*
2e60: 20 72 65 73 29 0a 09 72 65 73 29 29 29 0a 0a 28   res)..res)))..(
2e70: 64 65 66 69 6e 65 20 64 62 3a 67 65 74 2d 6b 65  define db:get-ke
2e80: 79 73 20 64 62 2d 67 65 74 2d 6b 65 79 73 29 0a  ys db-get-keys).
2e90: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74  .(define (db:get
2ea0: 2d 76 61 6c 75 65 2d 62 79 2d 68 65 61 64 65 72  -value-by-header
2eb0: 20 72 6f 77 20 68 65 61 64 65 72 20 66 69 65 6c   row header fiel
2ec0: 64 29 0a 20 20 3b 3b 20 28 64 65 62 75 67 3a 70  d).  ;; (debug:p
2ed0: 72 69 6e 74 20 32 20 22 64 62 3a 67 65 74 2d 76  rint 2 "db:get-v
2ee0: 61 6c 75 65 2d 62 79 2d 68 65 61 64 65 72 20 72  alue-by-header r
2ef0: 6f 77 3a 20 22 20 72 6f 77 20 22 20 68 65 61 64  ow: " row " head
2f00: 65 72 3a 20 22 20 68 65 61 64 65 72 20 22 20 66  er: " header " f
2f10: 69 65 6c 64 3a 20 22 20 66 69 65 6c 64 29 0a 20  ield: " field). 
2f20: 20 28 69 66 20 28 6e 75 6c 6c 3f 20 68 65 61 64   (if (null? head
2f30: 65 72 29 20 23 66 0a 20 20 20 20 20 20 28 6c 65  er) #f.      (le
2f40: 74 20 6c 6f 6f 70 20 28 28 68 65 64 20 28 63 61  t loop ((hed (ca
2f50: 72 20 68 65 61 64 65 72 29 29 0a 09 09 20 28 74  r header))... (t
2f60: 61 6c 20 28 63 64 72 20 68 65 61 64 65 72 29 29  al (cdr header))
2f70: 0a 09 09 20 28 6e 20 20 20 30 29 29 0a 09 28 69  ... (n   0))..(i
2f80: 66 20 28 65 71 75 61 6c 3f 20 68 65 64 20 66 69  f (equal? hed fi
2f90: 65 6c 64 29 0a 09 20 20 20 20 28 76 65 63 74 6f  eld)..    (vecto
2fa0: 72 2d 72 65 66 20 72 6f 77 20 6e 29 0a 09 20 20  r-ref row n)..  
2fb0: 20 20 28 69 66 20 28 6e 75 6c 6c 3f 20 74 61 6c    (if (null? tal
2fc0: 29 20 23 66 20 28 6c 6f 6f 70 20 28 63 61 72 20  ) #f (loop (car 
2fd0: 74 61 6c 29 28 63 64 72 20 74 61 6c 29 28 2b 20  tal)(cdr tal)(+ 
2fe0: 6e 20 31 29 29 29 29 29 29 29 0a 09 20 20 20 20  n 1)))))))..    
2ff0: 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  .;;=============
3000: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3010: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3030: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 20 52 20  =========.;;  R 
3040: 55 20 4e 20 53 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d  U N S.;;========
3050: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3060: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3070: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3080: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a  ==============..
3090: 28 64 65 66 69 6e 65 20 28 72 75 6e 73 3a 67 65  (define (runs:ge
30a0: 74 2d 73 74 64 2d 72 75 6e 2d 66 69 65 6c 64 73  t-std-run-fields
30b0: 20 6b 65 79 73 20 72 65 6d 66 69 65 6c 64 73 29   keys remfields)
30c0: 0a 20 20 28 6c 65 74 2a 20 28 28 68 65 61 64 65  .  (let* ((heade
30d0: 72 20 20 20 20 28 61 70 70 65 6e 64 20 28 6d 61  r    (append (ma
30e0: 70 20 6b 65 79 3a 67 65 74 2d 66 69 65 6c 64 6e  p key:get-fieldn
30f0: 61 6d 65 20 6b 65 79 73 29 0a 09 09 09 20 20 20  ame keys)....   
3100: 20 72 65 6d 66 69 65 6c 64 73 29 29 0a 09 20 28   remfields)).. (
3110: 6b 65 79 73 74 72 20 20 20 20 28 63 6f 6e 63 20  keystr    (conc 
3120: 28 6b 65 79 73 2d 3e 6b 65 79 73 74 72 20 6b 65  (keys->keystr ke
3130: 79 73 29 20 22 2c 22 0a 09 09 09 20 20 28 73 74  ys) ","....  (st
3140: 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65  ring-intersperse
3150: 20 72 65 6d 66 69 65 6c 64 73 20 22 2c 22 29 29   remfields ","))
3160: 29 29 0a 20 20 20 20 28 6c 69 73 74 20 6b 65 79  )).    (list key
3170: 73 74 72 20 68 65 61 64 65 72 29 29 29 0a 0a 3b  str header)))..;
3180: 3b 20 57 41 53 20 64 62 2d 67 65 74 2d 72 75 6e  ; WAS db-get-run
3190: 73 20 46 49 58 4d 45 20 49 4e 20 52 45 4d 41 49  s FIXME IN REMAI
31a0: 4e 49 4e 47 20 43 4f 44 45 0a 3b 3b 0a 3b 3b 20  NING CODE.;;.;; 
31b0: 4d 45 52 47 45 20 54 48 49 53 20 57 49 54 48 20  MERGE THIS WITH 
31c0: 64 62 3a 67 65 74 2d 72 75 6e 73 2c 20 61 63 63  db:get-runs, acc
31d0: 69 64 65 6e 74 6c 79 20 77 72 6f 74 65 20 69 74  idently wrote it
31e0: 20 74 77 69 63 65 0a 3b 3b 0a 3b 3b 20 72 65 70   twice.;;.;; rep
31f0: 6c 61 63 65 20 68 65 61 64 65 72 20 61 6e 64 20  lace header and 
3200: 6b 65 79 73 74 72 20 77 69 74 68 20 61 20 63 61  keystr with a ca
3210: 6c 6c 20 74 6f 20 72 75 6e 73 3a 67 65 74 2d 73  ll to runs:get-s
3220: 74 64 2d 72 75 6e 2d 66 69 65 6c 64 73 0a 3b 3b  td-run-fields.;;
3230: 0a 3b 3b 20 6b 65 79 70 61 74 74 73 3a 20 28 20  .;; keypatts: ( 
3240: 28 4b 45 59 31 20 22 61 62 63 25 64 65 66 22 29  (KEY1 "abc%def")
3250: 28 4b 45 59 32 20 22 25 22 29 20 29 0a 3b 3b 0a  (KEY2 "%") ).;;.
3260: 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d  (define (db:get-
3270: 72 75 6e 73 20 64 62 20 72 75 6e 70 61 74 74 20  runs db runpatt 
3280: 63 6f 75 6e 74 20 6f 66 66 73 65 74 20 6b 65 79  count offset key
3290: 70 61 74 74 73 29 0a 20 20 28 6c 65 74 2a 20 28  patts).  (let* (
32a0: 28 72 65 73 20 20 20 20 20 20 27 28 29 29 0a 09  (res      '())..
32b0: 20 28 6b 65 79 73 20 20 20 20 20 20 28 64 62 2d   (keys      (db-
32c0: 67 65 74 2d 6b 65 79 73 20 64 62 29 29 0a 09 20  get-keys db)).. 
32d0: 28 72 65 6d 66 69 65 6c 64 73 20 28 6c 69 73 74  (remfields (list
32e0: 20 22 69 64 22 20 22 72 75 6e 6e 61 6d 65 22 20   "id" "runname" 
32f0: 22 73 74 61 74 65 22 20 22 73 74 61 74 75 73 22  "state" "status"
3300: 20 22 6f 77 6e 65 72 22 20 22 65 76 65 6e 74 5f   "owner" "event_
3310: 74 69 6d 65 22 29 29 0a 09 20 28 68 65 61 64 65  time")).. (heade
3320: 72 20 20 20 20 28 61 70 70 65 6e 64 20 28 6d 61  r    (append (ma
3330: 70 20 6b 65 79 3a 67 65 74 2d 66 69 65 6c 64 6e  p key:get-fieldn
3340: 61 6d 65 20 6b 65 79 73 29 0a 09 09 09 20 20 20  ame keys)....   
3350: 20 72 65 6d 66 69 65 6c 64 73 29 29 0a 09 20 28   remfields)).. (
3360: 6b 65 79 73 74 72 20 20 20 20 28 63 6f 6e 63 20  keystr    (conc 
3370: 28 6b 65 79 73 2d 3e 6b 65 79 73 74 72 20 6b 65  (keys->keystr ke
3380: 79 73 29 20 22 2c 22 0a 09 09 09 20 20 28 73 74  ys) ","....  (st
3390: 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65  ring-intersperse
33a0: 20 72 65 6d 66 69 65 6c 64 73 20 22 2c 22 29 29   remfields ","))
33b0: 29 0a 09 20 28 71 72 79 73 74 72 20 20 20 20 28  ).. (qrystr    (
33c0: 63 6f 6e 63 20 22 53 45 4c 45 43 54 20 22 20 6b  conc "SELECT " k
33d0: 65 79 73 74 72 20 22 20 46 52 4f 4d 20 72 75 6e  eystr " FROM run
33e0: 73 20 57 48 45 52 45 20 72 75 6e 6e 61 6d 65 20  s WHERE runname 
33f0: 4c 49 4b 45 20 3f 20 22 0a 09 09 09 20 20 3b 3b  LIKE ? "....  ;;
3400: 20 47 65 6e 65 72 61 74 65 3a 20 22 20 41 4e 44   Generate: " AND
3410: 20 78 20 4c 49 4b 45 20 27 6b 65 79 70 61 74 74   x LIKE 'keypatt
3420: 27 20 2e 2e 2e 22 0a 09 09 09 20 20 28 69 66 20  ' ..."....  (if 
3430: 28 6e 75 6c 6c 3f 20 6b 65 79 70 61 74 74 73 29  (null? keypatts)
3440: 20 22 22 0a 09 09 09 20 20 20 20 20 20 28 63 6f   ""....      (co
3450: 6e 63 20 22 20 41 4e 44 20 22 0a 09 09 09 09 20  nc " AND "..... 
3460: 20 20 20 28 73 74 72 69 6e 67 2d 6a 6f 69 6e 20     (string-join 
3470: 0a 09 09 09 09 20 20 20 20 20 28 6d 61 70 20 28  .....     (map (
3480: 6c 61 6d 62 64 61 20 28 6b 65 79 70 61 74 74 29  lambda (keypatt)
3490: 0a 09 09 09 09 09 20 20 20 20 28 6c 65 74 20 28  ......    (let (
34a0: 28 6b 65 79 20 20 28 63 61 72 20 6b 65 79 70 61  (key  (car keypa
34b0: 74 74 29 29 0a 09 09 09 09 09 09 20 20 28 70 61  tt)).......  (pa
34c0: 74 74 20 28 63 61 64 72 20 6b 65 79 70 61 74 74  tt (cadr keypatt
34d0: 29 29 29 0a 09 09 09 09 09 20 20 20 20 20 20 28  )))......      (
34e0: 63 6f 6e 63 20 6b 65 79 20 22 20 4c 49 4b 45 20  conc key " LIKE 
34f0: 27 22 20 70 61 74 74 20 22 27 22 29 29 29 0a 09  '" patt "'")))..
3500: 09 09 09 09 20 20 6b 65 79 70 61 74 74 73 29 0a  ....  keypatts).
3510: 09 09 09 09 20 20 20 20 20 22 20 41 4e 44 20 22  ....     " AND "
3520: 29 29 29 0a 09 09 09 20 20 22 20 4f 52 44 45 52  )))....  " ORDER
3530: 20 42 59 20 65 76 65 6e 74 5f 74 69 6d 65 20 44   BY event_time D
3540: 45 53 43 20 22 0a 09 09 09 20 20 28 69 66 20 28  ESC "....  (if (
3550: 6e 75 6d 62 65 72 3f 20 63 6f 75 6e 74 29 0a 09  number? count)..
3560: 09 09 20 20 20 20 20 20 28 63 6f 6e 63 20 22 20  ..      (conc " 
3570: 4c 49 4d 49 54 20 22 20 63 6f 75 6e 74 29 0a 09  LIMIT " count)..
3580: 09 09 20 20 20 20 20 20 22 22 29 0a 09 09 09 20  ..      "").... 
3590: 20 28 69 66 20 28 6e 75 6d 62 65 72 3f 20 6f 66   (if (number? of
35a0: 66 73 65 74 29 0a 09 09 09 20 20 20 20 20 20 28  fset)....      (
35b0: 63 6f 6e 63 20 22 20 4f 46 46 53 45 54 20 22 20  conc " OFFSET " 
35c0: 6f 66 66 73 65 74 29 0a 09 09 09 20 20 20 20 20  offset)....     
35d0: 20 22 22 29 29 29 29 0a 20 20 20 20 28 64 65 62   "")))).    (deb
35e0: 75 67 3a 70 72 69 6e 74 20 34 20 22 64 62 3a 67  ug:print 4 "db:g
35f0: 65 74 2d 72 75 6e 73 20 71 72 79 73 74 72 3a 20  et-runs qrystr: 
3600: 22 20 71 72 79 73 74 72 20 22 5c 6e 6b 65 79 70  " qrystr "\nkeyp
3610: 61 74 74 73 3a 20 22 20 6b 65 79 70 61 74 74 73  atts: " keypatts
3620: 20 22 5c 6e 20 20 6f 66 66 73 65 74 3a 20 22 20   "\n  offset: " 
3630: 6f 66 66 73 65 74 20 22 20 6c 69 6d 69 74 3a 20  offset " limit: 
3640: 22 20 63 6f 75 6e 74 29 0a 20 20 20 20 28 73 71  " count).    (sq
3650: 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72  lite3:for-each-r
3660: 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20  ow.     (lambda 
3670: 28 61 20 2e 20 78 29 0a 20 20 20 20 20 20 20 28  (a . x).       (
3680: 73 65 74 21 20 72 65 73 20 28 63 6f 6e 73 20 28  set! res (cons (
3690: 61 70 70 6c 79 20 76 65 63 74 6f 72 20 61 20 78  apply vector a x
36a0: 29 20 72 65 73 29 29 29 0a 20 20 20 20 20 64 62  ) res))).     db
36b0: 0a 20 20 20 20 20 71 72 79 73 74 72 0a 20 20 20  .     qrystr.   
36c0: 20 20 72 75 6e 70 61 74 74 29 0a 20 20 20 20 28    runpatt).    (
36d0: 76 65 63 74 6f 72 20 68 65 61 64 65 72 20 72 65  vector header re
36e0: 73 29 29 29 0a 0a 3b 3b 20 6a 75 73 74 20 67 65  s)))..;; just ge
36f0: 74 20 63 6f 75 6e 74 20 6f 66 20 72 75 6e 73 0a  t count of runs.
3700: 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d  (define (db:get-
3710: 6e 75 6d 2d 72 75 6e 73 20 64 62 20 72 75 6e 70  num-runs db runp
3720: 61 74 74 29 0a 20 20 28 6c 65 74 20 28 28 6e 75  att).  (let ((nu
3730: 6d 72 75 6e 73 20 30 29 29 0a 20 20 20 20 28 73  mruns 0)).    (s
3740: 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d  qlite3:for-each-
3750: 72 6f 77 20 0a 20 20 20 20 20 28 6c 61 6d 62 64  row .     (lambd
3760: 61 20 28 63 6f 75 6e 74 29 0a 20 20 20 20 20 20  a (count).      
3770: 20 28 73 65 74 21 20 6e 75 6d 72 75 6e 73 20 63   (set! numruns c
3780: 6f 75 6e 74 29 29 0a 20 20 20 20 20 64 62 0a 20  ount)).     db. 
3790: 20 20 20 20 22 53 45 4c 45 43 54 20 43 4f 55 4e      "SELECT COUN
37a0: 54 28 69 64 29 20 46 52 4f 4d 20 72 75 6e 73 20  T(id) FROM runs 
37b0: 57 48 45 52 45 20 72 75 6e 6e 61 6d 65 20 4c 49  WHERE runname LI
37c0: 4b 45 20 3f 3b 22 20 72 75 6e 70 61 74 74 29 0a  KE ?;" runpatt).
37d0: 20 20 20 20 6e 75 6d 72 75 6e 73 29 29 0a 0a 0a      numruns))...
37e0: 3b 3b 20 75 73 65 20 28 67 65 74 2d 76 61 6c 75  ;; use (get-valu
37f0: 65 2d 62 79 2d 68 65 61 64 65 72 20 28 64 62 3a  e-by-header (db:
3800: 67 65 74 2d 68 65 61 64 65 72 20 72 75 6e 69 6e  get-header runin
3810: 66 6f 29 28 64 62 3a 67 65 74 2d 72 6f 77 20 72  fo)(db:get-row r
3820: 75 6e 69 6e 66 6f 29 29 0a 28 64 65 66 69 6e 65  uninfo)).(define
3830: 20 28 64 62 3a 67 65 74 2d 72 75 6e 2d 69 6e 66   (db:get-run-inf
3840: 6f 20 64 62 20 72 75 6e 2d 69 64 29 0a 20 20 28  o db run-id).  (
3850: 6c 65 74 2a 20 28 28 72 65 73 20 20 20 20 20 20  let* ((res      
3860: 23 66 29 0a 09 20 28 6b 65 79 73 20 20 20 20 20  #f).. (keys     
3870: 20 28 64 62 2d 67 65 74 2d 6b 65 79 73 20 64 62   (db-get-keys db
3880: 29 29 0a 09 20 28 72 65 6d 66 69 65 6c 64 73 20  )).. (remfields 
3890: 28 6c 69 73 74 20 22 69 64 22 20 22 72 75 6e 6e  (list "id" "runn
38a0: 61 6d 65 22 20 22 73 74 61 74 65 22 20 22 73 74  ame" "state" "st
38b0: 61 74 75 73 22 20 22 6f 77 6e 65 72 22 20 22 65  atus" "owner" "e
38c0: 76 65 6e 74 5f 74 69 6d 65 22 29 29 0a 09 20 28  vent_time")).. (
38d0: 68 65 61 64 65 72 20 20 20 20 28 61 70 70 65 6e  header    (appen
38e0: 64 20 28 6d 61 70 20 6b 65 79 3a 67 65 74 2d 66  d (map key:get-f
38f0: 69 65 6c 64 6e 61 6d 65 20 6b 65 79 73 29 0a 09  ieldname keys)..
3900: 09 09 20 20 20 20 72 65 6d 66 69 65 6c 64 73 29  ..    remfields)
3910: 29 0a 09 20 28 6b 65 79 73 74 72 20 20 20 20 28  ).. (keystr    (
3920: 63 6f 6e 63 20 28 6b 65 79 73 2d 3e 6b 65 79 73  conc (keys->keys
3930: 74 72 20 6b 65 79 73 29 20 22 2c 22 0a 09 09 09  tr keys) ","....
3940: 20 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73    (string-inters
3950: 70 65 72 73 65 20 72 65 6d 66 69 65 6c 64 73 20  perse remfields 
3960: 22 2c 22 29 29 29 29 0a 20 20 20 20 3b 3b 20 28  ",")))).    ;; (
3970: 64 65 62 75 67 3a 70 72 69 6e 74 20 30 20 22 64  debug:print 0 "d
3980: 62 3a 67 65 74 2d 72 75 6e 2d 69 6e 66 6f 20 72  b:get-run-info r
3990: 75 6e 2d 69 64 3a 20 22 20 72 75 6e 2d 69 64 20  un-id: " run-id 
39a0: 22 20 68 65 61 64 65 72 3a 20 22 20 68 65 61 64  " header: " head
39b0: 65 72 20 22 20 6b 65 79 73 74 72 3a 20 22 20 6b  er " keystr: " k
39c0: 65 79 73 74 72 29 0a 20 20 20 20 28 73 71 6c 69  eystr).    (sqli
39d0: 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77  te3:for-each-row
39e0: 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 61  .     (lambda (a
39f0: 20 2e 20 78 29 0a 20 20 20 20 20 20 20 28 73 65   . x).       (se
3a00: 74 21 20 72 65 73 20 28 61 70 70 6c 79 20 76 65  t! res (apply ve
3a10: 63 74 6f 72 20 61 20 78 29 29 29 0a 20 20 20 20  ctor a x))).    
3a20: 20 64 62 0a 20 20 20 20 20 28 63 6f 6e 63 20 22   db.     (conc "
3a30: 53 45 4c 45 43 54 20 22 20 6b 65 79 73 74 72 20  SELECT " keystr 
3a40: 22 20 46 52 4f 4d 20 72 75 6e 73 20 57 48 45 52  " FROM runs WHER
3a50: 45 20 69 64 3d 3f 3b 22 29 0a 20 20 20 20 20 72  E id=?;").     r
3a60: 75 6e 2d 69 64 29 0a 20 20 20 20 28 76 65 63 74  un-id).    (vect
3a70: 6f 72 20 68 65 61 64 65 72 20 72 65 73 29 29 29  or header res)))
3a80: 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 73 65  ..(define (db:se
3a90: 74 2d 63 6f 6d 6d 65 6e 74 2d 66 6f 72 2d 72 75  t-comment-for-ru
3aa0: 6e 20 64 62 20 72 75 6e 2d 69 64 20 63 6f 6d 6d  n db run-id comm
3ab0: 65 6e 74 29 0a 20 20 28 73 71 6c 69 74 65 33 3a  ent).  (sqlite3:
3ac0: 65 78 65 63 75 74 65 20 64 62 20 22 55 50 44 41  execute db "UPDA
3ad0: 54 45 20 72 75 6e 73 20 53 45 54 20 63 6f 6d 6d  TE runs SET comm
3ae0: 65 6e 74 3d 3f 20 57 48 45 52 45 20 69 64 3d 3f  ent=? WHERE id=?
3af0: 3b 22 20 63 6f 6d 6d 65 6e 74 20 72 75 6e 2d 69  ;" comment run-i
3b00: 64 29 29 0a 0a 3b 3b 20 64 6f 65 73 20 6e 6f 74  d))..;; does not
3b10: 20 28 6f 62 76 69 6f 75 73 6c 79 21 29 20 72 65   (obviously!) re
3b20: 6d 6f 76 65 64 20 64 65 70 65 6e 64 65 6e 74 20  moved dependent 
3b30: 64 61 74 61 2e 20 0a 28 64 65 66 69 6e 65 20 28  data. .(define (
3b40: 64 62 3a 64 65 6c 65 74 65 2d 72 75 6e 20 64 62  db:delete-run db
3b50: 20 72 75 6e 2d 69 64 29 0a 20 20 28 73 71 6c 69   run-id).  (sqli
3b60: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22  te3:execute db "
3b70: 44 45 4c 45 54 45 20 46 52 4f 4d 20 72 75 6e 73  DELETE FROM runs
3b80: 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 72 75   WHERE id=?;" ru
3b90: 6e 2d 69 64 29 29 0a 0a 28 64 65 66 69 6e 65 20  n-id))..(define 
3ba0: 28 64 62 3a 75 70 64 61 74 65 2d 72 75 6e 2d 65  (db:update-run-e
3bb0: 76 65 6e 74 5f 74 69 6d 65 20 64 62 20 72 75 6e  vent_time db run
3bc0: 2d 69 64 29 0a 20 20 28 73 71 6c 69 74 65 33 3a  -id).  (sqlite3:
3bd0: 65 78 65 63 75 74 65 20 64 62 20 22 55 50 44 41  execute db "UPDA
3be0: 54 45 20 72 75 6e 73 20 53 45 54 20 65 76 65 6e  TE runs SET even
3bf0: 74 5f 74 69 6d 65 3d 73 74 72 66 74 69 6d 65 28  t_time=strftime(
3c00: 27 25 73 27 2c 27 6e 6f 77 27 29 20 57 48 45 52  '%s','now') WHER
3c10: 45 20 69 64 3d 3f 3b 22 20 72 75 6e 2d 69 64 29  E id=?;" run-id)
3c20: 29 20 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ) ..;;==========
3c30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3c40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3c50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3c60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20  ============.;; 
3c70: 20 54 20 45 20 53 20 54 20 53 0a 3b 3b 3d 3d 3d   T E S T S.;;===
3c80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3c90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3ca0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3cb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3cc0: 3d 3d 3d 0a 0a 3b 3b 20 73 74 61 74 65 73 20 61  ===..;; states a
3cd0: 6e 64 20 73 74 61 74 75 73 65 73 20 61 72 65 20  nd statuses are 
3ce0: 6c 69 73 74 73 2c 20 74 75 72 6e 20 74 68 65 6d  lists, turn them
3cf0: 20 69 6e 74 6f 20 28 22 50 41 53 53 22 2c 22 46   into ("PASS","F
3d00: 41 49 4c 22 2e 2e 2e 29 20 61 6e 64 20 75 73 65  AIL"...) and use
3d10: 20 4e 4f 54 20 49 4e 0a 3b 3b 20 69 2e 65 2e 20   NOT IN.;; i.e. 
3d20: 74 68 65 73 65 20 6c 69 73 74 73 20 64 65 66 69  these lists defi
3d30: 6e 65 20 77 68 61 74 20 74 6f 20 4e 4f 54 20 73  ne what to NOT s
3d40: 68 6f 77 2e 0a 3b 3b 20 73 74 61 74 65 73 20 61  how..;; states a
3d50: 6e 64 20 73 74 61 74 75 73 65 73 20 61 72 65 20  nd statuses are 
3d60: 72 65 71 75 69 72 65 64 20 74 6f 20 62 65 20 6c  required to be l
3d70: 69 73 74 73 2c 20 65 6d 70 74 79 20 69 73 20 6f  ists, empty is o
3d80: 6b 0a 28 64 65 66 69 6e 65 20 28 64 62 2d 67 65  k.(define (db-ge
3d90: 74 2d 74 65 73 74 73 2d 66 6f 72 2d 72 75 6e 20  t-tests-for-run 
3da0: 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 70 61  db run-id testpa
3db0: 74 74 20 69 74 65 6d 70 61 74 74 20 73 74 61 74  tt itempatt stat
3dc0: 65 73 20 73 74 61 74 75 73 65 73 29 0a 20 20 28  es statuses).  (
3dd0: 6c 65 74 20 28 28 72 65 73 20 27 28 29 29 0a 09  let ((res '())..
3de0: 28 73 74 61 74 65 73 2d 73 74 72 20 20 20 20 28  (states-str    (
3df0: 63 6f 6e 63 20 22 28 27 22 20 28 73 74 72 69 6e  conc "('" (strin
3e00: 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 73 74  g-intersperse st
3e10: 61 74 65 73 20 20 20 22 27 2c 27 22 29 20 22 27  ates   "','") "'
3e20: 29 22 29 29 0a 09 28 73 74 61 74 75 73 65 73 2d  )"))..(statuses-
3e30: 73 74 72 20 20 28 63 6f 6e 63 20 22 28 27 22 20  str  (conc "('" 
3e40: 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65  (string-interspe
3e50: 72 73 65 20 73 74 61 74 75 73 65 73 20 22 27 2c  rse statuses "',
3e60: 27 22 29 20 22 27 29 22 29 29 0a 09 29 0a 20 20  '") "')"))..).  
3e70: 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65    (sqlite3:for-e
3e80: 61 63 68 2d 72 6f 77 20 0a 20 20 20 20 20 28 6c  ach-row .     (l
3e90: 61 6d 62 64 61 20 28 69 64 20 72 75 6e 2d 69 64  ambda (id run-id
3ea0: 20 74 65 73 74 6e 61 6d 65 20 73 74 61 74 65 20   testname state 
3eb0: 73 74 61 74 75 73 20 65 76 65 6e 74 2d 74 69 6d  status event-tim
3ec0: 65 20 68 6f 73 74 20 63 70 75 6c 6f 61 64 20 64  e host cpuload d
3ed0: 69 73 6b 66 72 65 65 20 75 6e 61 6d 65 20 72 75  iskfree uname ru
3ee0: 6e 64 69 72 20 69 74 65 6d 2d 70 61 74 68 20 72  ndir item-path r
3ef0: 75 6e 2d 64 75 72 61 74 69 6f 6e 20 66 69 6e 61  un-duration fina
3f00: 6c 2d 6c 6f 67 66 20 63 6f 6d 6d 65 6e 74 29 0a  l-logf comment).
3f10: 20 20 20 20 20 20 20 28 73 65 74 21 20 72 65 73         (set! res
3f20: 20 28 63 6f 6e 73 20 28 76 65 63 74 6f 72 20 69   (cons (vector i
3f30: 64 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d  d run-id testnam
3f40: 65 20 73 74 61 74 65 20 73 74 61 74 75 73 20 65  e state status e
3f50: 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73 74 20 63  vent-time host c
3f60: 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20  puload diskfree 
3f70: 75 6e 61 6d 65 20 72 75 6e 64 69 72 20 69 74 65  uname rundir ite
3f80: 6d 2d 70 61 74 68 20 72 75 6e 2d 64 75 72 61 74  m-path run-durat
3f90: 69 6f 6e 20 66 69 6e 61 6c 2d 6c 6f 67 66 20 63  ion final-logf c
3fa0: 6f 6d 6d 65 6e 74 29 20 72 65 73 29 29 29 0a 20  omment) res))). 
3fb0: 20 20 20 20 64 62 20 0a 20 20 20 20 20 28 63 6f      db .     (co
3fc0: 6e 63 20 22 53 45 4c 45 43 54 20 69 64 2c 72 75  nc "SELECT id,ru
3fd0: 6e 5f 69 64 2c 74 65 73 74 6e 61 6d 65 2c 73 74  n_id,testname,st
3fe0: 61 74 65 2c 73 74 61 74 75 73 2c 65 76 65 6e 74  ate,status,event
3ff0: 5f 74 69 6d 65 2c 68 6f 73 74 2c 63 70 75 6c 6f  _time,host,cpulo
4000: 61 64 2c 64 69 73 6b 66 72 65 65 2c 75 6e 61 6d  ad,diskfree,unam
4010: 65 2c 72 75 6e 64 69 72 2c 69 74 65 6d 5f 70 61  e,rundir,item_pa
4020: 74 68 2c 72 75 6e 5f 64 75 72 61 74 69 6f 6e 2c  th,run_duration,
4030: 66 69 6e 61 6c 5f 6c 6f 67 66 2c 63 6f 6d 6d 65  final_logf,comme
4040: 6e 74 20 22 0a 09 20 20 20 22 20 46 52 4f 4d 20  nt "..   " FROM 
4050: 74 65 73 74 73 20 57 48 45 52 45 20 72 75 6e 5f  tests WHERE run_
4060: 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d  id=? AND testnam
4070: 65 20 6c 69 6b 65 20 3f 20 41 4e 44 20 69 74 65  e like ? AND ite
4080: 6d 5f 70 61 74 68 20 4c 49 4b 45 20 3f 20 22 20  m_path LIKE ? " 
4090: 0a 09 20 20 20 22 20 41 4e 44 20 4e 4f 54 20 28  ..   " AND NOT (
40a0: 73 74 61 74 65 20 69 6e 20 22 20 73 74 61 74 65  state in " state
40b0: 73 2d 73 74 72 20 22 20 41 4e 44 20 73 74 61 74  s-str " AND stat
40c0: 75 73 20 49 4e 20 22 20 73 74 61 74 75 73 65 73  us IN " statuses
40d0: 2d 73 74 72 20 22 29 20 22 0a 09 20 20 20 3b 3b  -str ") "..   ;;
40e0: 20 22 20 4f 52 44 45 52 20 42 59 20 69 64 20 44   " ORDER BY id D
40f0: 45 53 43 3b 22 0a 09 20 20 20 22 20 4f 52 44 45  ESC;"..   " ORDE
4100: 52 20 42 59 20 65 76 65 6e 74 5f 74 69 6d 65 20  R BY event_time 
4110: 41 53 43 3b 22 20 3b 3b 20 50 4f 54 45 4e 54 49  ASC;" ;; POTENTI
4120: 41 4c 20 49 53 53 55 45 21 20 43 48 45 43 4b 20  AL ISSUE! CHECK 
4130: 4d 45 21 20 44 6f 65 73 20 61 6e 79 74 69 6e 67  ME! Does anyting
4140: 20 64 65 70 65 6e 64 20 6f 6e 20 74 68 69 73 20   depend on this 
4150: 62 65 69 6e 67 20 73 6f 72 74 65 64 20 62 79 20  being sorted by 
4160: 69 64 3f 0a 09 20 20 20 29 0a 20 20 20 20 20 72  id?..   ).     r
4170: 75 6e 2d 69 64 0a 20 20 20 20 20 28 69 66 20 74  un-id.     (if t
4180: 65 73 74 70 61 74 74 20 74 65 73 74 70 61 74 74  estpatt testpatt
4190: 20 22 25 22 29 0a 20 20 20 20 20 28 69 66 20 69   "%").     (if i
41a0: 74 65 6d 70 61 74 74 20 69 74 65 6d 70 61 74 74  tempatt itempatt
41b0: 20 22 25 22 29 29 0a 20 20 20 20 72 65 73 29 29   "%")).    res))
41c0: 0a 0a 3b 3b 20 74 68 69 73 20 6f 6e 65 20 69 73  ..;; this one is
41d0: 20 61 20 62 69 74 20 62 72 6f 6b 65 6e 20 42 55   a bit broken BU
41e0: 47 20 46 49 58 4d 45 0a 28 64 65 66 69 6e 65 20  G FIXME.(define 
41f0: 28 64 62 3a 64 65 6c 65 74 65 2d 74 65 73 74 2d  (db:delete-test-
4200: 73 74 65 70 2d 72 65 63 6f 72 64 73 20 64 62 20  step-records db 
4210: 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65  run-id test-name
4220: 20 69 74 65 6d 64 61 74 29 0a 20 20 28 73 71 6c   itemdat).  (sql
4230: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
4240: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 65 73  "DELETE FROM tes
4250: 74 5f 73 74 65 70 73 20 57 48 45 52 45 20 74 65  t_steps WHERE te
4260: 73 74 5f 69 64 20 69 6e 20 28 53 45 4c 45 43 54  st_id in (SELECT
4270: 20 69 64 20 46 52 4f 4d 20 74 65 73 74 73 20 57   id FROM tests W
4280: 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e  HERE run_id=? AN
4290: 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44  D testname=? AND
42a0: 20 69 74 65 6d 5f 70 61 74 68 3d 3f 29 3b 22 20   item_path=?);" 
42b0: 0a 09 09 20 20 20 72 75 6e 2d 69 64 20 74 65 73  ...   run-id tes
42c0: 74 2d 6e 61 6d 65 20 28 69 74 65 6d 2d 6c 69 73  t-name (item-lis
42d0: 74 2d 3e 70 61 74 68 20 69 74 65 6d 64 61 74 29  t->path itemdat)
42e0: 29 29 0a 3b 3b 20 0a 28 64 65 66 69 6e 65 20 28  )).;; .(define (
42f0: 64 62 3a 64 65 6c 65 74 65 2d 74 65 73 74 2d 72  db:delete-test-r
4300: 65 63 6f 72 64 73 20 64 62 20 74 65 73 74 2d 69  ecords db test-i
4310: 64 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78  d).  (sqlite3:ex
4320: 65 63 75 74 65 20 64 62 20 22 44 45 4c 45 54 45  ecute db "DELETE
4330: 20 46 52 4f 4d 20 74 65 73 74 5f 73 74 65 70 73   FROM test_steps
4340: 20 57 48 45 52 45 20 74 65 73 74 5f 69 64 3d 3f   WHERE test_id=?
4350: 3b 22 20 74 65 73 74 2d 69 64 29 0a 20 20 28 73  ;" test-id).  (s
4360: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64  qlite3:execute d
4370: 62 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74  b "DELETE FROM t
4380: 65 73 74 5f 64 61 74 61 20 20 57 48 45 52 45 20  est_data  WHERE 
4390: 74 65 73 74 5f 69 64 3d 3f 3b 22 20 74 65 73 74  test_id=?;" test
43a0: 2d 69 64 29 0a 20 20 28 73 71 6c 69 74 65 33 3a  -id).  (sqlite3:
43b0: 65 78 65 63 75 74 65 20 64 62 20 22 44 45 4c 45  execute db "DELE
43c0: 54 45 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48  TE FROM tests WH
43d0: 45 52 45 20 69 64 3d 3f 3b 22 20 74 65 73 74 2d  ERE id=?;" test-
43e0: 69 64 29 29 0a 0a 3b 3b 20 73 65 74 20 74 65 73  id))..;; set tes
43f0: 74 73 20 77 69 74 68 20 73 74 61 74 65 20 63 75  ts with state cu
4400: 72 72 73 74 61 74 65 20 61 6e 64 20 73 74 61 74  rrstate and stat
4410: 75 73 20 63 75 72 72 73 74 61 74 75 73 20 74 6f  us currstatus to
4420: 20 6e 65 77 73 74 61 74 65 20 61 6e 64 20 6e 65   newstate and ne
4430: 77 73 74 61 74 75 73 0a 3b 3b 20 75 73 65 20 63  wstatus.;; use c
4440: 75 72 72 73 74 61 74 65 20 3d 20 23 66 20 61 6e  urrstate = #f an
4450: 64 20 6f 72 20 63 75 72 72 73 74 61 74 75 73 20  d or currstatus 
4460: 3d 20 23 66 20 74 6f 20 61 70 70 6c 79 20 74 6f  = #f to apply to
4470: 20 61 6e 79 20 73 74 61 74 65 20 6f 72 20 73 74   any state or st
4480: 61 74 75 73 20 72 65 73 70 65 63 74 69 76 65 6c  atus respectivel
4490: 79 0a 3b 3b 20 57 41 52 4e 49 4e 47 3a 20 53 51  y.;; WARNING: SQ
44a0: 4c 20 69 6e 6a 65 63 74 69 6f 6e 20 72 69 73 6b  L injection risk
44b0: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 73 65 74  .(define (db:set
44c0: 2d 74 65 73 74 73 2d 73 74 61 74 65 2d 73 74 61  -tests-state-sta
44d0: 74 75 73 20 64 62 20 72 75 6e 2d 69 64 20 74 65  tus db run-id te
44e0: 73 74 6e 61 6d 65 73 20 63 75 72 72 73 74 61 74  stnames currstat
44f0: 65 20 63 75 72 72 73 74 61 74 75 73 20 6e 65 77  e currstatus new
4500: 73 74 61 74 65 20 6e 65 77 73 74 61 74 75 73 29  state newstatus)
4510: 0a 20 20 28 66 6f 72 2d 65 61 63 68 20 28 6c 61  .  (for-each (la
4520: 6d 62 64 61 20 28 74 65 73 74 6e 61 6d 65 29 0a  mbda (testname).
4530: 09 20 20 20 20 20 20 28 6c 65 74 20 28 28 71 72  .      (let ((qr
4540: 79 20 28 63 6f 6e 63 20 22 55 50 44 41 54 45 20  y (conc "UPDATE 
4550: 74 65 73 74 73 20 53 45 54 20 73 74 61 74 65 3d  tests SET state=
4560: 3f 2c 73 74 61 74 75 73 3d 3f 20 57 48 45 52 45  ?,status=? WHERE
4570: 20 22 0a 09 09 09 09 09 28 69 66 20 63 75 72 72   "......(if curr
4580: 73 74 61 74 65 20 20 28 63 6f 6e 63 20 22 73 74  state  (conc "st
4590: 61 74 65 3d 27 22 20 63 75 72 72 73 74 61 74 65  ate='" currstate
45a0: 20 22 27 20 41 4e 44 20 22 29 20 22 22 29 0a 09   "' AND ") "")..
45b0: 09 09 09 09 28 69 66 20 63 75 72 72 73 74 61 74  ....(if currstat
45c0: 75 73 20 28 63 6f 6e 63 20 22 73 74 61 74 75 73  us (conc "status
45d0: 3d 27 22 20 63 75 72 72 73 74 61 74 75 73 20 22  ='" currstatus "
45e0: 27 20 41 4e 44 20 22 29 20 22 22 29 0a 09 09 09  ' AND ") "")....
45f0: 09 09 22 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44  .." run_id=? AND
4600: 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20   testname=? AND 
4610: 4e 4f 54 20 28 69 74 65 6d 5f 70 61 74 68 3d 27  NOT (item_path='
4620: 27 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 20 69  ' AND testname i
4630: 6e 20 28 53 45 4c 45 43 54 20 44 49 53 54 49 4e  n (SELECT DISTIN
4640: 43 54 20 74 65 73 74 6e 61 6d 65 20 46 52 4f 4d  CT testname FROM
4650: 20 74 65 73 74 73 20 57 48 45 52 45 20 74 65 73   tests WHERE tes
4660: 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d  tname=? AND item
4670: 5f 70 61 74 68 20 21 3d 20 27 27 29 29 3b 22 29  _path != ''));")
4680: 29 29 0a 09 09 3b 3b 28 64 65 62 75 67 3a 70 72  ))...;;(debug:pr
4690: 69 6e 74 20 30 20 22 51 52 59 3a 20 22 20 71 72  int 0 "QRY: " qr
46a0: 79 29 0a 09 09 28 73 71 6c 69 74 65 33 3a 65 78  y)...(sqlite3:ex
46b0: 65 63 75 74 65 20 64 62 20 71 72 79 20 72 75 6e  ecute db qry run
46c0: 2d 69 64 20 6e 65 77 73 74 61 74 65 20 6e 65 77  -id newstate new
46d0: 73 74 61 74 75 73 20 74 65 73 74 6e 61 6d 65 20  status testname 
46e0: 74 65 73 74 6e 61 6d 65 29 29 29 0a 09 20 20 20  testname)))..   
46f0: 20 74 65 73 74 6e 61 6d 65 73 29 29 0a 0a 28 64   testnames))..(d
4700: 65 66 69 6e 65 20 28 64 62 3a 64 65 6c 65 74 65  efine (db:delete
4710: 2d 74 65 73 74 73 2d 69 6e 2d 73 74 61 74 65 20  -tests-in-state 
4720: 64 62 20 72 75 6e 2d 69 64 20 73 74 61 74 65 29  db run-id state)
4730: 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63  .  (sqlite3:exec
4740: 75 74 65 20 64 62 20 22 44 45 4c 45 54 45 20 46  ute db "DELETE F
4750: 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 20  ROM tests WHERE 
4760: 73 74 61 74 65 3d 3f 20 41 4e 44 20 72 75 6e 5f  state=? AND run_
4770: 69 64 3d 3f 3b 22 20 73 74 61 74 65 20 72 75 6e  id=?;" state run
4780: 2d 69 64 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  -id))..(define (
4790: 64 62 3a 74 65 73 74 2d 73 65 74 2d 73 74 61 74  db:test-set-stat
47a0: 65 2d 73 74 61 74 75 73 2d 62 79 2d 69 64 20 64  e-status-by-id d
47b0: 62 20 74 65 73 74 2d 69 64 20 6e 65 77 73 74 61  b test-id newsta
47c0: 74 65 20 6e 65 77 73 74 61 74 75 73 20 6e 65 77  te newstatus new
47d0: 63 6f 6d 6d 65 6e 74 29 0a 20 20 28 69 66 20 6e  comment).  (if n
47e0: 65 77 73 74 61 74 65 20 20 20 28 73 71 6c 69 74  ewstate   (sqlit
47f0: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 55  e3:execute db "U
4800: 50 44 41 54 45 20 74 65 73 74 73 20 53 45 54 20  PDATE tests SET 
4810: 73 74 61 74 65 3d 3f 20 20 20 57 48 45 52 45 20  state=?   WHERE 
4820: 69 64 3d 3f 3b 22 20 6e 65 77 73 74 61 74 65 20  id=?;" newstate 
4830: 20 20 74 65 73 74 2d 69 64 29 29 0a 20 20 28 69    test-id)).  (i
4840: 66 20 6e 65 77 73 74 61 74 75 73 20 20 28 73 71  f newstatus  (sq
4850: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62  lite3:execute db
4860: 20 22 55 50 44 41 54 45 20 74 65 73 74 73 20 53   "UPDATE tests S
4870: 45 54 20 73 74 61 74 75 73 3d 3f 20 20 57 48 45  ET status=?  WHE
4880: 52 45 20 69 64 3d 3f 3b 22 20 6e 65 77 73 74 61  RE id=?;" newsta
4890: 74 75 73 20 20 74 65 73 74 2d 69 64 29 29 0a 20  tus  test-id)). 
48a0: 20 28 69 66 20 6e 65 77 63 6f 6d 6d 65 6e 74 20   (if newcomment 
48b0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
48c0: 20 64 62 20 22 55 50 44 41 54 45 20 74 65 73 74   db "UPDATE test
48d0: 73 20 53 45 54 20 63 6f 6d 6d 65 6e 74 3d 3f 20  s SET comment=? 
48e0: 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 6e 65 77  WHERE id=?;" new
48f0: 63 6f 6d 6d 65 6e 74 20 74 65 73 74 2d 69 64 29  comment test-id)
4900: 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  ))..(define (db:
4910: 67 65 74 2d 63 6f 75 6e 74 2d 74 65 73 74 73 2d  get-count-tests-
4920: 72 75 6e 6e 69 6e 67 20 64 62 29 0a 20 20 28 6c  running db).  (l
4930: 65 74 20 28 28 72 65 73 20 30 29 29 0a 20 20 20  et ((res 0)).   
4940: 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61   (sqlite3:for-ea
4950: 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d  ch-row.     (lam
4960: 62 64 61 20 28 63 6f 75 6e 74 29 0a 20 20 20 20  bda (count).    
4970: 20 20 20 28 73 65 74 21 20 72 65 73 20 63 6f 75     (set! res cou
4980: 6e 74 29 29 0a 20 20 20 20 20 64 62 0a 20 20 20  nt)).     db.   
4990: 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28    "SELECT count(
49a0: 69 64 29 20 46 52 4f 4d 20 74 65 73 74 73 20 57  id) FROM tests W
49b0: 48 45 52 45 20 73 74 61 74 65 20 3d 20 27 52 55  HERE state = 'RU
49c0: 4e 4e 49 4e 47 27 20 4f 52 20 73 74 61 74 65 20  NNING' OR state 
49d0: 3d 20 27 4c 41 55 4e 43 48 45 44 27 20 4f 52 20  = 'LAUNCHED' OR 
49e0: 73 74 61 74 65 20 3d 20 27 52 45 4d 4f 54 45 48  state = 'REMOTEH
49f0: 4f 53 54 53 54 41 52 54 27 3b 22 29 0a 20 20 20  OSTSTART';").   
4a00: 20 72 65 73 29 29 0a 0a 3b 3b 20 64 6f 6e 65 20   res))..;; done 
4a10: 77 69 74 68 20 72 75 6e 20 77 68 65 6e 3a 0a 3b  with run when:.;
4a20: 3b 20 20 20 30 20 74 65 73 74 73 20 69 6e 20 4c  ;   0 tests in L
4a30: 41 55 4e 43 48 45 44 2c 20 4e 4f 54 5f 53 54 41  AUNCHED, NOT_STA
4a40: 52 54 45 44 2c 20 52 45 4d 4f 54 45 48 4f 53 54  RTED, REMOTEHOST
4a50: 53 54 41 52 54 2c 20 52 55 4e 4e 49 4e 47 0a 28  START, RUNNING.(
4a60: 64 65 66 69 6e 65 20 28 64 62 3a 65 73 74 69 6d  define (db:estim
4a70: 61 74 65 64 2d 74 65 73 74 73 2d 72 65 6d 61 69  ated-tests-remai
4a80: 6e 69 6e 67 20 64 62 20 72 75 6e 2d 69 64 29 0a  ning db run-id).
4a90: 20 20 28 6c 65 74 20 28 28 72 65 73 20 30 29 29    (let ((res 0))
4aa0: 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f  .    (sqlite3:fo
4ab0: 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 20  r-each-row.     
4ac0: 28 6c 61 6d 62 64 61 20 28 63 6f 75 6e 74 29 0a  (lambda (count).
4ad0: 20 20 20 20 20 20 20 28 73 65 74 21 20 72 65 73         (set! res
4ae0: 20 63 6f 75 6e 74 29 29 0a 20 20 20 20 20 64 62   count)).     db
4af0: 20 3b 3b 20 4e 42 2f 2f 20 4b 49 4c 4c 52 45 51   ;; NB// KILLREQ
4b00: 20 6d 65 61 6e 73 20 74 68 65 20 6a 6f 62 73 20   means the jobs 
4b10: 69 73 20 73 74 69 6c 6c 20 70 72 6f 62 61 62 6c  is still probabl
4b20: 79 20 72 75 6e 6e 69 6e 67 0a 20 20 20 20 20 22  y running.     "
4b30: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 69 64 29  SELECT count(id)
4b40: 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52   FROM tests WHER
4b50: 45 20 73 74 61 74 65 20 69 6e 20 28 27 4c 41 55  E state in ('LAU
4b60: 4e 43 48 45 44 27 2c 27 4e 4f 54 5f 53 54 41 52  NCHED','NOT_STAR
4b70: 54 45 44 27 2c 27 52 45 4d 4f 54 45 48 4f 53 54  TED','REMOTEHOST
4b80: 53 54 41 52 54 27 2c 27 52 55 4e 4e 49 4e 47 27  START','RUNNING'
4b90: 2c 27 4b 49 4c 4c 52 45 51 27 29 20 41 4e 44 20  ,'KILLREQ') AND 
4ba0: 72 75 6e 5f 69 64 3d 3f 3b 22 20 72 75 6e 2d 69  run_id=?;" run-i
4bb0: 64 29 0a 20 20 20 20 72 65 73 29 29 0a 0a 3b 3b  d).    res))..;;
4bc0: 20 4e 42 2f 2f 20 53 79 6e 63 20 74 68 69 73 20   NB// Sync this 
4bd0: 77 69 74 68 20 72 75 6e 73 3a 67 65 74 2d 74 65  with runs:get-te
4be0: 73 74 2d 69 6e 66 6f 0a 28 64 65 66 69 6e 65 20  st-info.(define 
4bf0: 28 64 62 3a 67 65 74 2d 74 65 73 74 2d 69 6e 66  (db:get-test-inf
4c00: 6f 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74  o db run-id test
4c10: 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 0a  name item-path).
4c20: 20 20 28 6c 65 74 20 28 28 72 65 73 20 23 66 29    (let ((res #f)
4c30: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66  ).    (sqlite3:f
4c40: 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 20  or-each-row.    
4c50: 20 28 6c 61 6d 62 64 61 20 28 69 64 20 72 75 6e   (lambda (id run
4c60: 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 73 74 61  -id testname sta
4c70: 74 65 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d  te status event-
4c80: 74 69 6d 65 20 68 6f 73 74 20 63 70 75 6c 6f 61  time host cpuloa
4c90: 64 20 64 69 73 6b 66 72 65 65 20 75 6e 61 6d 65  d diskfree uname
4ca0: 20 72 75 6e 64 69 72 20 69 74 65 6d 2d 70 61 74   rundir item-pat
4cb0: 68 20 72 75 6e 5f 64 75 72 61 74 69 6f 6e 20 66  h run_duration f
4cc0: 69 6e 61 6c 5f 6c 6f 67 66 20 63 6f 6d 6d 65 6e  inal_logf commen
4cd0: 74 20 29 0a 20 20 20 20 20 20 20 28 73 65 74 21  t ).       (set!
4ce0: 20 72 65 73 20 28 76 65 63 74 6f 72 20 69 64 20   res (vector id 
4cf0: 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20  run-id testname 
4d00: 73 74 61 74 65 20 73 74 61 74 75 73 20 65 76 65  state status eve
4d10: 6e 74 2d 74 69 6d 65 20 68 6f 73 74 20 63 70 75  nt-time host cpu
4d20: 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20 75 6e  load diskfree un
4d30: 61 6d 65 20 72 75 6e 64 69 72 20 69 74 65 6d 2d  ame rundir item-
4d40: 70 61 74 68 20 72 75 6e 5f 64 75 72 61 74 69 6f  path run_duratio
4d50: 6e 20 66 69 6e 61 6c 5f 6c 6f 67 66 20 63 6f 6d  n final_logf com
4d60: 6d 65 6e 74 20 29 29 29 0a 20 20 20 20 20 64 62  ment ))).     db
4d70: 20 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20 69   .     "SELECT i
4d80: 64 2c 72 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d  d,run_id,testnam
4d90: 65 2c 73 74 61 74 65 2c 73 74 61 74 75 73 2c 65  e,state,status,e
4da0: 76 65 6e 74 5f 74 69 6d 65 2c 68 6f 73 74 2c 63  vent_time,host,c
4db0: 70 75 6c 6f 61 64 2c 64 69 73 6b 66 72 65 65 2c  puload,diskfree,
4dc0: 75 6e 61 6d 65 2c 72 75 6e 64 69 72 2c 69 74 65  uname,rundir,ite
4dd0: 6d 5f 70 61 74 68 2c 72 75 6e 5f 64 75 72 61 74  m_path,run_durat
4de0: 69 6f 6e 2c 66 69 6e 61 6c 5f 6c 6f 67 66 2c 63  ion,final_logf,c
4df0: 6f 6d 6d 65 6e 74 20 46 52 4f 4d 20 74 65 73 74  omment FROM test
4e00: 73 20 57 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f  s WHERE run_id=?
4e10: 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20   AND testname=? 
4e20: 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 3d 3f 3b  AND item_path=?;
4e30: 22 0a 20 20 20 20 20 72 75 6e 2d 69 64 20 74 65  ".     run-id te
4e40: 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68  stname item-path
4e50: 29 0a 20 20 20 20 72 65 73 29 29 0a 0a 3b 3b 20  ).    res))..;; 
4e60: 47 65 74 20 74 65 73 74 20 64 61 74 61 20 75 73  Get test data us
4e70: 69 6e 67 20 74 65 73 74 5f 69 64 0a 28 64 65 66  ing test_id.(def
4e80: 69 6e 65 20 28 64 62 3a 67 65 74 2d 74 65 73 74  ine (db:get-test
4e90: 2d 64 61 74 61 2d 62 79 2d 69 64 20 64 62 20 74  -data-by-id db t
4ea0: 65 73 74 2d 69 64 29 0a 20 20 28 6c 65 74 20 28  est-id).  (let (
4eb0: 28 72 65 73 20 23 66 29 29 0a 20 20 20 20 28 73  (res #f)).    (s
4ec0: 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d  qlite3:for-each-
4ed0: 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 64 61  row.     (lambda
4ee0: 20 28 69 64 20 72 75 6e 2d 69 64 20 74 65 73 74   (id run-id test
4ef0: 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61 74 75  name state statu
4f00: 73 20 65 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73  s event-time hos
4f10: 74 20 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72  t cpuload diskfr
4f20: 65 65 20 75 6e 61 6d 65 20 72 75 6e 64 69 72 20  ee uname rundir 
4f30: 69 74 65 6d 2d 70 61 74 68 20 72 75 6e 5f 64 75  item-path run_du
4f40: 72 61 74 69 6f 6e 20 66 69 6e 61 6c 5f 6c 6f 67  ration final_log
4f50: 66 20 63 6f 6d 6d 65 6e 74 29 0a 20 20 20 20 20  f comment).     
4f60: 20 20 28 73 65 74 21 20 72 65 73 20 28 76 65 63    (set! res (vec
4f70: 74 6f 72 20 69 64 20 72 75 6e 2d 69 64 20 74 65  tor id run-id te
4f80: 73 74 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61  stname state sta
4f90: 74 75 73 20 65 76 65 6e 74 2d 74 69 6d 65 20 68  tus event-time h
4fa0: 6f 73 74 20 63 70 75 6c 6f 61 64 20 64 69 73 6b  ost cpuload disk
4fb0: 66 72 65 65 20 75 6e 61 6d 65 20 72 75 6e 64 69  free uname rundi
4fc0: 72 20 69 74 65 6d 2d 70 61 74 68 20 72 75 6e 5f  r item-path run_
4fd0: 64 75 72 61 74 69 6f 6e 20 66 69 6e 61 6c 5f 6c  duration final_l
4fe0: 6f 67 66 20 63 6f 6d 6d 65 6e 74 29 29 29 0a 20  ogf comment))). 
4ff0: 20 20 20 20 64 62 20 0a 20 20 20 20 20 22 53 45      db .     "SE
5000: 4c 45 43 54 20 69 64 2c 72 75 6e 5f 69 64 2c 74  LECT id,run_id,t
5010: 65 73 74 6e 61 6d 65 2c 73 74 61 74 65 2c 73 74  estname,state,st
5020: 61 74 75 73 2c 65 76 65 6e 74 5f 74 69 6d 65 2c  atus,event_time,
5030: 68 6f 73 74 2c 63 70 75 6c 6f 61 64 2c 64 69 73  host,cpuload,dis
5040: 6b 66 72 65 65 2c 75 6e 61 6d 65 2c 72 75 6e 64  kfree,uname,rund
5050: 69 72 2c 69 74 65 6d 5f 70 61 74 68 2c 72 75 6e  ir,item_path,run
5060: 5f 64 75 72 61 74 69 6f 6e 2c 66 69 6e 61 6c 5f  _duration,final_
5070: 6c 6f 67 66 2c 63 6f 6d 6d 65 6e 74 20 46 52 4f  logf,comment FRO
5080: 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 69 64  M tests WHERE id
5090: 3d 3f 3b 22 0a 20 20 20 20 20 74 65 73 74 2d 69  =?;".     test-i
50a0: 64 29 0a 20 20 20 20 72 65 73 29 29 0a 0a 0a 28  d).    res))...(
50b0: 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74 2d  define (db:test-
50c0: 73 65 74 2d 63 6f 6d 6d 65 6e 74 20 64 62 20 72  set-comment db r
50d0: 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 69  un-id testname i
50e0: 74 65 6d 2d 70 61 74 68 20 63 6f 6d 6d 65 6e 74  tem-path comment
50f0: 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65  ).  (sqlite3:exe
5100: 63 75 74 65 20 0a 20 20 20 64 62 20 0a 20 20 20  cute .   db .   
5110: 22 55 50 44 41 54 45 20 74 65 73 74 73 20 53 45  "UPDATE tests SE
5120: 54 20 63 6f 6d 6d 65 6e 74 3d 3f 20 57 48 45 52  T comment=? WHER
5130: 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74  E run_id=? AND t
5140: 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74  estname=? AND it
5150: 65 6d 5f 70 61 74 68 3d 3f 3b 22 0a 20 20 20 20  em_path=?;".    
5160: 20 63 6f 6d 6d 65 6e 74 20 72 75 6e 2d 69 64 20   comment run-id 
5170: 74 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61  testname item-pa
5180: 74 68 29 29 0a 0a 3b 3b 0a 28 64 65 66 69 6e 65  th))..;;.(define
5190: 20 28 64 62 3a 74 65 73 74 2d 73 65 74 2d 72 75   (db:test-set-ru
51a0: 6e 64 69 72 21 20 64 62 20 72 75 6e 2d 69 64 20  ndir! db run-id 
51b0: 74 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61  testname item-pa
51c0: 74 68 20 72 75 6e 64 69 72 29 0a 20 20 28 73 71  th rundir).  (sq
51d0: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 0a 20  lite3:execute . 
51e0: 20 20 64 62 20 0a 20 20 20 22 55 50 44 41 54 45    db .   "UPDATE
51f0: 20 74 65 73 74 73 20 53 45 54 20 72 75 6e 64 69   tests SET rundi
5200: 72 3d 3f 20 57 48 45 52 45 20 72 75 6e 5f 69 64  r=? WHERE run_id
5210: 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d  =? AND testname=
5220: 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 3d  ? AND item_path=
5230: 3f 3b 22 0a 20 20 20 20 20 72 75 6e 64 69 72 20  ?;".     rundir 
5240: 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20  run-id testname 
5250: 69 74 65 6d 2d 70 61 74 68 29 29 0a 0a 3b 3b 3d  item-path))..;;=
5260: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5270: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5280: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5290: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
52a0: 3d 3d 3d 3d 3d 0a 3b 3b 20 54 65 73 74 73 20 6d  =====.;; Tests m
52b0: 65 74 61 20 64 61 74 61 0a 3b 3b 3d 3d 3d 3d 3d  eta data.;;=====
52c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
52d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
52e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
52f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5300: 3d 0a 0a 3b 3b 20 72 65 61 64 20 74 68 65 20 72  =..;; read the r
5310: 65 63 6f 72 64 20 67 69 76 65 6e 20 61 20 74 65  ecord given a te
5320: 73 74 6e 61 6d 65 0a 28 64 65 66 69 6e 65 20 28  stname.(define (
5330: 64 62 3a 74 65 73 74 6d 65 74 61 2d 67 65 74 2d  db:testmeta-get-
5340: 72 65 63 6f 72 64 20 64 62 20 74 65 73 74 6e 61  record db testna
5350: 6d 65 29 0a 20 20 28 6c 65 74 20 28 28 72 65 73  me).  (let ((res
5360: 20 23 66 29 29 0a 20 20 20 20 28 73 71 6c 69 74   #f)).    (sqlit
5370: 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a  e3:for-each-row.
5380: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 69 64       (lambda (id
5390: 20 74 65 73 74 6e 61 6d 65 20 61 75 74 68 6f 72   testname author
53a0: 20 6f 77 6e 65 72 20 64 65 73 63 72 69 70 74 69   owner descripti
53b0: 6f 6e 20 72 65 76 69 65 77 65 64 20 69 74 65 72  on reviewed iter
53c0: 61 74 65 64 20 61 76 67 5f 72 75 6e 74 69 6d 65  ated avg_runtime
53d0: 20 61 76 67 5f 64 69 73 6b 20 74 61 67 73 29 0a   avg_disk tags).
53e0: 20 20 20 20 20 20 20 28 73 65 74 21 20 72 65 73         (set! res
53f0: 20 28 76 65 63 74 6f 72 20 69 64 20 74 65 73 74   (vector id test
5400: 6e 61 6d 65 20 61 75 74 68 6f 72 20 6f 77 6e 65  name author owne
5410: 72 20 64 65 73 63 72 69 70 74 69 6f 6e 20 72 65  r description re
5420: 76 69 65 77 65 64 20 69 74 65 72 61 74 65 64 20  viewed iterated 
5430: 61 76 67 5f 72 75 6e 74 69 6d 65 20 61 76 67 5f  avg_runtime avg_
5440: 64 69 73 6b 20 74 61 67 73 29 29 29 0a 20 20 20  disk tags))).   
5450: 20 20 64 62 20 22 53 45 4c 45 43 54 20 69 64 2c    db "SELECT id,
5460: 74 65 73 74 6e 61 6d 65 2c 61 75 74 68 6f 72 2c  testname,author,
5470: 6f 77 6e 65 72 2c 64 65 73 63 72 69 70 74 69 6f  owner,descriptio
5480: 6e 2c 72 65 76 69 65 77 65 64 2c 69 74 65 72 61  n,reviewed,itera
5490: 74 65 64 2c 61 76 67 5f 72 75 6e 74 69 6d 65 2c  ted,avg_runtime,
54a0: 61 76 67 5f 64 69 73 6b 2c 74 61 67 73 20 46 52  avg_disk,tags FR
54b0: 4f 4d 20 74 65 73 74 5f 6d 65 74 61 20 57 48 45  OM test_meta WHE
54c0: 52 45 20 74 65 73 74 6e 61 6d 65 3d 3f 3b 22 0a  RE testname=?;".
54d0: 20 20 20 20 20 74 65 73 74 6e 61 6d 65 29 0a 20       testname). 
54e0: 20 20 20 72 65 73 29 29 0a 0a 3b 3b 20 63 72 65     res))..;; cre
54f0: 61 74 65 20 61 20 6e 65 77 20 72 65 63 6f 72 64  ate a new record
5500: 20 66 6f 72 20 61 20 67 69 76 65 6e 20 74 65 73   for a given tes
5510: 74 6e 61 6d 65 0a 28 64 65 66 69 6e 65 20 28 64  tname.(define (d
5520: 62 3a 74 65 73 74 6d 65 74 61 2d 61 64 64 2d 72  b:testmeta-add-r
5530: 65 63 6f 72 64 20 64 62 20 74 65 73 74 6e 61 6d  ecord db testnam
5540: 65 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78  e).  (sqlite3:ex
5550: 65 63 75 74 65 20 64 62 20 22 49 4e 53 45 52 54  ecute db "INSERT
5560: 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20   OR IGNORE INTO 
5570: 74 65 73 74 5f 6d 65 74 61 20 28 74 65 73 74 6e  test_meta (testn
5580: 61 6d 65 2c 61 75 74 68 6f 72 2c 6f 77 6e 65 72  ame,author,owner
5590: 2c 64 65 73 63 72 69 70 74 69 6f 6e 2c 72 65 76  ,description,rev
55a0: 69 65 77 65 64 2c 69 74 65 72 61 74 65 64 2c 61  iewed,iterated,a
55b0: 76 67 5f 72 75 6e 74 69 6d 65 2c 61 76 67 5f 64  vg_runtime,avg_d
55c0: 69 73 6b 2c 74 61 67 73 29 20 56 41 4c 55 45 53  isk,tags) VALUES
55d0: 20 28 3f 2c 27 27 2c 27 27 2c 27 27 2c 27 27 2c   (?,'','','','',
55e0: 27 27 2c 27 27 2c 27 27 2c 27 27 29 3b 22 20 74  '','','','');" t
55f0: 65 73 74 6e 61 6d 65 29 29 0a 0a 3b 3b 20 75 70  estname))..;; up
5600: 64 61 74 65 20 6f 6e 65 20 6f 66 20 74 68 65 20  date one of the 
5610: 74 65 73 74 6d 65 74 61 20 66 69 65 6c 64 73 0a  testmeta fields.
5620: 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74  (define (db:test
5630: 6d 65 74 61 2d 75 70 64 61 74 65 2d 66 69 65 6c  meta-update-fiel
5640: 64 20 64 62 20 74 65 73 74 6e 61 6d 65 20 66 69  d db testname fi
5650: 65 6c 64 20 76 61 6c 75 65 29 0a 20 20 28 73 71  eld value).  (sq
5660: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62  lite3:execute db
5670: 20 28 63 6f 6e 63 20 22 55 50 44 41 54 45 20 74   (conc "UPDATE t
5680: 65 73 74 5f 6d 65 74 61 20 53 45 54 20 22 20 66  est_meta SET " f
5690: 69 65 6c 64 20 22 3d 3f 20 57 48 45 52 45 20 74  ield "=? WHERE t
56a0: 65 73 74 6e 61 6d 65 3d 3f 3b 22 29 20 76 61 6c  estname=?;") val
56b0: 75 65 20 74 65 73 74 6e 61 6d 65 29 29 0a 0a 3b  ue testname))..;
56c0: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;===============
56d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
56e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
56f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5700: 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 54 20 45 20 53  =======.;; T E S
5710: 20 54 20 20 20 44 20 41 20 54 20 41 20 0a 3b 3b   T   D A T A .;;
5720: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5730: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5740: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5750: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5760: 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65 66 69 6e 65 20  ======..(define 
5770: 28 64 62 3a 63 73 76 2d 3e 74 65 73 74 2d 64 61  (db:csv->test-da
5780: 74 61 20 64 62 20 74 65 73 74 2d 69 64 20 63 73  ta db test-id cs
5790: 76 64 61 74 61 29 0a 20 20 28 64 65 62 75 67 3a  vdata).  (debug:
57a0: 70 72 69 6e 74 20 34 20 22 74 65 73 74 2d 69 64  print 4 "test-id
57b0: 20 22 20 74 65 73 74 2d 69 64 20 22 2c 20 63 73   " test-id ", cs
57c0: 76 64 61 74 61 3a 20 22 20 63 73 76 64 61 74 61  vdata: " csvdata
57d0: 29 0a 20 20 28 6c 65 74 20 28 28 63 73 76 6c 69  ).  (let ((csvli
57e0: 73 74 20 28 63 73 76 2d 3e 6c 69 73 74 20 28 6d  st (csv->list (m
57f0: 61 6b 65 2d 63 73 76 2d 72 65 61 64 65 72 0a 09  ake-csv-reader..
5800: 09 09 20 20 20 20 20 28 6f 70 65 6e 2d 69 6e 70  ..     (open-inp
5810: 75 74 2d 73 74 72 69 6e 67 20 63 73 76 64 61 74  ut-string csvdat
5820: 61 29 0a 09 09 09 20 20 20 20 20 27 28 28 73 74  a)....     '((st
5830: 72 69 70 2d 6c 65 61 64 69 6e 67 2d 77 68 69 74  rip-leading-whit
5840: 65 73 70 61 63 65 3f 20 23 74 29 0a 09 09 09 20  espace? #t).... 
5850: 20 20 20 20 20 20 28 73 74 72 69 70 2d 74 72 61        (strip-tra
5860: 69 6c 69 6e 67 2d 77 68 69 74 65 73 70 61 63 65  iling-whitespace
5870: 3f 20 23 74 29 29 20 29 29 29 29 20 3b 3b 20 28  ? #t)) )))) ;; (
5880: 63 73 76 2d 3e 6c 69 73 74 20 63 73 76 64 61 74  csv->list csvdat
5890: 61 29 29 29 0a 20 20 20 20 28 66 6f 72 2d 65 61  a))).    (for-ea
58a0: 63 68 20 0a 20 20 20 20 20 28 6c 61 6d 62 64 61  ch .     (lambda
58b0: 20 28 63 73 76 72 6f 77 29 0a 20 20 20 20 20 20   (csvrow).      
58c0: 20 28 6c 65 74 2a 20 28 28 70 61 64 64 65 64 2d   (let* ((padded-
58d0: 72 6f 77 20 20 28 74 61 6b 65 20 28 61 70 70 65  row  (take (appe
58e0: 6e 64 20 63 73 76 72 6f 77 20 28 6c 69 73 74 20  nd csvrow (list 
58f0: 23 66 20 23 66 20 23 66 20 23 66 20 23 66 20 23  #f #f #f #f #f #
5900: 66 20 23 66 20 23 66 29 29 20 38 29 29 0a 09 20  f #f #f)) 8)).. 
5910: 20 20 20 20 20 28 63 61 74 65 67 6f 72 79 20 20       (category  
5920: 20 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64 64    (list-ref padd
5930: 65 64 2d 72 6f 77 20 30 29 29 0a 09 20 20 20 20  ed-row 0))..    
5940: 20 20 28 76 61 72 69 61 62 6c 65 20 20 20 20 28    (variable    (
5950: 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d  list-ref padded-
5960: 72 6f 77 20 31 29 29 0a 09 20 20 20 20 20 20 28  row 1))..      (
5970: 76 61 6c 75 65 20 20 20 20 20 20 20 28 61 6e 79  value       (any
5980: 2d 3e 6e 75 6d 62 65 72 2d 69 66 2d 70 6f 73 73  ->number-if-poss
5990: 69 62 6c 65 20 28 6c 69 73 74 2d 72 65 66 20 70  ible (list-ref p
59a0: 61 64 64 65 64 2d 72 6f 77 20 32 29 29 29 0a 09  added-row 2)))..
59b0: 20 20 20 20 20 20 28 65 78 70 65 63 74 65 64 20        (expected 
59c0: 20 20 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 2d     (any->number-
59d0: 69 66 2d 70 6f 73 73 69 62 6c 65 20 28 6c 69 73  if-possible (lis
59e0: 74 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77  t-ref padded-row
59f0: 20 33 29 29 29 0a 09 20 20 20 20 20 20 28 74 6f   3)))..      (to
5a00: 6c 20 20 20 20 20 20 20 20 20 28 61 6e 79 2d 3e  l         (any->
5a10: 6e 75 6d 62 65 72 2d 69 66 2d 70 6f 73 73 69 62  number-if-possib
5a20: 6c 65 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64  le (list-ref pad
5a30: 64 65 64 2d 72 6f 77 20 34 29 29 29 20 3b 3b 20  ded-row 4))) ;; 
5a40: 3e 2c 20 3c 2c 20 3e 3d 2c 20 3c 3d 2c 20 6f 72  >, <, >=, <=, or
5a50: 20 61 20 6e 75 6d 62 65 72 0a 09 20 20 20 20 20   a number..     
5a60: 20 28 75 6e 69 74 73 20 20 20 20 20 20 20 28 6c   (units       (l
5a70: 69 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d 72  ist-ref padded-r
5a80: 6f 77 20 35 29 29 0a 09 20 20 20 20 20 20 28 63  ow 5))..      (c
5a90: 6f 6d 6d 65 6e 74 20 20 20 20 20 28 6c 69 73 74  omment     (list
5aa0: 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20  -ref padded-row 
5ab0: 36 29 29 0a 09 20 20 20 20 20 20 28 73 74 61 74  6))..      (stat
5ac0: 75 73 20 20 20 20 20 20 28 6c 65 74 20 28 28 73  us      (let ((s
5ad0: 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65   (list-ref padde
5ae0: 64 2d 72 6f 77 20 37 29 29 29 0a 09 09 09 20 20  d-row 7)))....  
5af0: 20 20 20 28 69 66 20 28 61 6e 64 20 28 73 74 72     (if (and (str
5b00: 69 6e 67 3f 20 73 29 28 6f 72 20 28 73 74 72 69  ing? s)(or (stri
5b10: 6e 67 2d 6d 61 74 63 68 20 28 72 65 67 65 78 70  ng-match (regexp
5b20: 20 22 5e 5c 5c 73 2a 24 22 29 20 73 29 0a 09 09   "^\\s*$") s)...
5b30: 09 09 09 09 20 20 20 20 20 28 73 74 72 69 6e 67  ....     (string
5b40: 2d 6d 61 74 63 68 20 28 72 65 67 65 78 70 20 22  -match (regexp "
5b50: 5e 6e 2f 61 24 22 29 20 73 29 29 29 0a 09 09 09  ^n/a$") s)))....
5b60: 09 20 23 66 0a 09 09 09 09 20 73 29 29 29 29 20  . #f..... s)))) 
5b70: 3b 3b 20 69 66 20 73 70 65 63 69 66 69 65 64 20  ;; if specified 
5b80: 6f 6e 20 74 68 65 20 69 6e 70 75 74 20 74 68 65  on the input the
5b90: 6e 20 75 73 65 2c 20 65 6c 73 65 20 63 61 6c 63  n use, else calc
5ba0: 75 6c 61 74 65 0a 09 20 3b 3b 20 6c 6f 6f 6b 20  ulate.. ;; look 
5bb0: 75 70 20 65 78 70 65 63 74 65 64 2c 74 6f 6c 2c  up expected,tol,
5bc0: 75 6e 69 74 73 20 66 72 6f 6d 20 70 72 65 76 69  units from previ
5bd0: 6f 75 73 20 62 65 73 74 20 66 69 74 20 74 65 73  ous best fit tes
5be0: 74 20 69 66 20 74 68 65 79 20 61 72 65 20 61 6c  t if they are al
5bf0: 6c 20 65 69 74 68 65 72 20 23 66 20 6f 72 20 27  l either #f or '
5c00: 27 0a 09 20 28 64 65 62 75 67 3a 70 72 69 6e 74  '.. (debug:print
5c10: 20 34 20 22 42 45 46 4f 52 45 3a 20 63 61 74 65   4 "BEFORE: cate
5c20: 67 6f 72 79 3a 20 22 20 63 61 74 65 67 6f 72 79  gory: " category
5c30: 20 22 20 76 61 72 69 61 62 6c 65 3a 20 22 20 76   " variable: " v
5c40: 61 72 69 61 62 6c 65 20 22 20 76 61 6c 75 65 3a  ariable " value:
5c50: 20 22 20 76 61 6c 75 65 20 0a 09 09 20 20 20 20   " value ...    
5c60: 20 20 22 2c 20 65 78 70 65 63 74 65 64 3a 20 22    ", expected: "
5c70: 20 65 78 70 65 63 74 65 64 20 22 20 74 6f 6c 3a   expected " tol:
5c80: 20 22 20 74 6f 6c 20 22 20 75 6e 69 74 73 3a 20   " tol " units: 
5c90: 22 20 75 6e 69 74 73 20 22 20 73 74 61 74 75 73  " units " status
5ca0: 3a 20 22 20 73 74 61 74 75 73 20 22 20 63 6f 6d  : " status " com
5cb0: 6d 65 6e 74 3a 20 22 20 63 6f 6d 6d 65 6e 74 29  ment: " comment)
5cc0: 0a 0a 09 20 28 69 66 20 28 61 6e 64 20 28 6f 72  ... (if (and (or
5cd0: 20 28 6e 6f 74 20 65 78 70 65 63 74 65 64 29 28   (not expected)(
5ce0: 65 71 75 61 6c 3f 20 65 78 70 65 63 74 65 64 20  equal? expected 
5cf0: 22 22 29 29 0a 09 09 20 20 28 6f 72 20 28 6e 6f  ""))...  (or (no
5d00: 74 20 74 6f 6c 29 20 20 20 20 20 28 65 71 75 61  t tol)     (equa
5d10: 6c 3f 20 65 78 70 65 63 74 65 64 20 22 22 29 29  l? expected ""))
5d20: 0a 09 09 20 20 28 6f 72 20 28 6e 6f 74 20 75 6e  ...  (or (not un
5d30: 69 74 73 29 20 20 20 28 65 71 75 61 6c 3f 20 65  its)   (equal? e
5d40: 78 70 65 63 74 65 64 20 22 22 29 29 29 0a 09 20  xpected ""))).. 
5d50: 20 20 20 20 28 6c 65 74 2d 76 61 6c 75 65 73 20      (let-values 
5d60: 28 28 28 6e 65 77 2d 65 78 70 65 63 74 65 64 20  (((new-expected 
5d70: 6e 65 77 2d 74 6f 6c 20 6e 65 77 2d 75 6e 69 74  new-tol new-unit
5d80: 73 29 28 64 62 3a 67 65 74 2d 70 72 65 76 2d 74  s)(db:get-prev-t
5d90: 6f 6c 2d 66 6f 72 2d 74 65 73 74 20 64 62 20 74  ol-for-test db t
5da0: 65 73 74 2d 69 64 20 63 61 74 65 67 6f 72 79 20  est-id category 
5db0: 76 61 72 69 61 62 6c 65 29 29 29 0a 09 20 20 20  variable)))..   
5dc0: 20 20 20 20 28 73 65 74 21 20 65 78 70 65 63 74      (set! expect
5dd0: 65 64 20 6e 65 77 2d 65 78 70 65 63 74 65 64 29  ed new-expected)
5de0: 0a 09 20 20 20 20 20 20 20 28 73 65 74 21 20 74  ..       (set! t
5df0: 6f 6c 20 20 20 20 20 20 6e 65 77 2d 74 6f 6c 29  ol      new-tol)
5e00: 0a 09 20 20 20 20 20 20 20 28 73 65 74 21 20 75  ..       (set! u
5e10: 6e 69 74 73 20 20 20 20 6e 65 77 2d 75 6e 69 74  nits    new-unit
5e20: 73 29 29 29 0a 0a 09 20 28 64 65 62 75 67 3a 70  s)))... (debug:p
5e30: 72 69 6e 74 20 34 20 22 41 46 54 45 52 3a 20 20  rint 4 "AFTER:  
5e40: 63 61 74 65 67 6f 72 79 3a 20 22 20 63 61 74 65  category: " cate
5e50: 67 6f 72 79 20 22 20 76 61 72 69 61 62 6c 65 3a  gory " variable:
5e60: 20 22 20 76 61 72 69 61 62 6c 65 20 22 20 76 61   " variable " va
5e70: 6c 75 65 3a 20 22 20 76 61 6c 75 65 20 0a 09 09  lue: " value ...
5e80: 20 20 20 20 20 20 22 2c 20 65 78 70 65 63 74 65        ", expecte
5e90: 64 3a 20 22 20 65 78 70 65 63 74 65 64 20 22 20  d: " expected " 
5ea0: 74 6f 6c 3a 20 22 20 74 6f 6c 20 22 20 75 6e 69  tol: " tol " uni
5eb0: 74 73 3a 20 22 20 75 6e 69 74 73 20 22 20 73 74  ts: " units " st
5ec0: 61 74 75 73 3a 20 22 20 73 74 61 74 75 73 20 22  atus: " status "
5ed0: 20 63 6f 6d 6d 65 6e 74 3a 20 22 20 63 6f 6d 6d   comment: " comm
5ee0: 65 6e 74 29 0a 09 20 3b 3b 20 63 61 6c 63 75 6c  ent).. ;; calcul
5ef0: 61 74 65 20 73 74 61 74 75 73 20 69 66 20 4e 4f  ate status if NO
5f00: 54 20 73 70 65 63 69 66 69 65 64 0a 09 20 28 69  T specified.. (i
5f10: 66 20 28 61 6e 64 20 28 6e 6f 74 20 73 74 61 74  f (and (not stat
5f20: 75 73 29 28 6e 75 6d 62 65 72 3f 20 65 78 70 65  us)(number? expe
5f30: 63 74 65 64 29 28 6e 75 6d 62 65 72 3f 20 76 61  cted)(number? va
5f40: 6c 75 65 29 29 20 3b 3b 20 6e 65 65 64 20 65 78  lue)) ;; need ex
5f50: 70 65 63 74 65 64 20 61 6e 64 20 76 61 6c 75 65  pected and value
5f60: 20 74 6f 20 62 65 20 6e 75 6d 62 65 72 73 0a 09   to be numbers..
5f70: 20 20 20 20 20 28 69 66 20 28 6e 75 6d 62 65 72       (if (number
5f80: 3f 20 74 6f 6c 29 20 3b 3b 20 69 66 20 74 6f 6c  ? tol) ;; if tol
5f90: 20 69 73 20 61 20 6e 75 6d 62 65 72 20 74 68 65   is a number the
5fa0: 6e 20 77 65 20 64 6f 20 74 68 65 20 73 74 61 6e  n we do the stan
5fb0: 64 61 72 64 20 63 6f 6d 70 61 72 69 73 6f 6e 0a  dard comparison.
5fc0: 09 09 20 28 6c 65 74 2a 20 28 28 6d 61 78 2d 76  .. (let* ((max-v
5fd0: 61 6c 20 28 2b 20 65 78 70 65 63 74 65 64 20 74  al (+ expected t
5fe0: 6f 6c 29 29 0a 09 09 09 28 6d 69 6e 2d 76 61 6c  ol))....(min-val
5ff0: 20 28 2d 20 65 78 70 65 63 74 65 64 20 74 6f 6c   (- expected tol
6000: 29 29 0a 09 09 09 28 72 65 73 75 6c 74 20 20 28  ))....(result  (
6010: 61 6e 64 20 28 3e 3d 20 20 76 61 6c 75 65 20 6d  and (>=  value m
6020: 69 6e 2d 76 61 6c 29 28 3c 3d 20 76 61 6c 75 65  in-val)(<= value
6030: 20 6d 61 78 2d 76 61 6c 29 29 29 29 0a 09 09 20   max-val))))... 
6040: 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34    (debug:print 4
6050: 20 22 6d 61 78 2d 76 61 6c 3a 20 22 20 6d 61 78   "max-val: " max
6060: 2d 76 61 6c 20 22 20 6d 69 6e 2d 76 61 6c 3a 20  -val " min-val: 
6070: 22 20 6d 69 6e 2d 76 61 6c 20 22 20 72 65 73 75  " min-val " resu
6080: 6c 74 3a 20 22 20 72 65 73 75 6c 74 29 0a 09 09  lt: " result)...
6090: 20 20 20 28 73 65 74 21 20 73 74 61 74 75 73 20     (set! status 
60a0: 28 69 66 20 72 65 73 75 6c 74 20 22 70 61 73 73  (if result "pass
60b0: 22 20 22 66 61 69 6c 22 29 29 29 0a 09 09 20 28  " "fail")))... (
60c0: 73 65 74 21 20 73 74 61 74 75 73 20 3b 3b 20 4e  set! status ;; N
60d0: 42 2f 2f 20 6e 65 65 64 20 74 6f 20 61 73 73 65  B// need to asse
60e0: 73 73 20 65 61 63 68 20 6f 6e 65 20 28 69 2e 65  ss each one (i.e
60f0: 2e 20 6e 6f 74 20 72 65 74 75 72 6e 20 6f 70 65  . not return ope
6100: 72 61 74 6f 72 20 73 69 6e 63 65 20 6e 65 65 64  rator since need
6110: 20 74 6f 20 61 63 74 20 69 66 20 6e 6f 74 20 76   to act if not v
6120: 61 6c 69 64 20 6f 70 2e 0a 09 09 20 20 20 20 20  alid op....     
6130: 20 20 28 63 61 73 65 20 28 73 74 72 69 6e 67 2d    (case (string-
6140: 3e 73 79 6d 62 6f 6c 20 74 6f 6c 29 20 3b 3b 20  >symbol tol) ;; 
6150: 74 6f 6c 20 73 68 6f 75 6c 64 20 62 65 20 3e 2c  tol should be >,
6160: 20 3c 2c 20 3e 3d 2c 20 3c 3d 0a 09 09 09 20 28   <, >=, <=.... (
6170: 28 3e 29 20 20 28 69 66 20 28 3e 20 20 76 61 6c  (>)  (if (>  val
6180: 75 65 20 65 78 70 65 63 74 65 64 29 20 22 70 61  ue expected) "pa
6190: 73 73 22 20 22 66 61 69 6c 22 29 29 0a 09 09 09  ss" "fail"))....
61a0: 20 28 28 3c 29 20 20 28 69 66 20 28 3c 20 20 76   ((<)  (if (<  v
61b0: 61 6c 75 65 20 65 78 70 65 63 74 65 64 29 20 22  alue expected) "
61c0: 70 61 73 73 22 20 22 66 61 69 6c 22 29 29 0a 09  pass" "fail"))..
61d0: 09 09 20 28 28 3e 3d 29 20 28 69 66 20 28 3e 3d  .. ((>=) (if (>=
61e0: 20 76 61 6c 75 65 20 65 78 70 65 63 74 65 64 29   value expected)
61f0: 20 22 70 61 73 73 22 20 22 66 61 69 6c 22 29 29   "pass" "fail"))
6200: 0a 09 09 09 20 28 28 3c 3d 29 20 28 69 66 20 28  .... ((<=) (if (
6210: 3c 3d 20 76 61 6c 75 65 20 65 78 70 65 63 74 65  <= value expecte
6220: 64 29 20 22 70 61 73 73 22 20 22 66 61 69 6c 22  d) "pass" "fail"
6230: 29 29 0a 09 09 09 20 28 65 6c 73 65 20 28 63 6f  )).... (else (co
6240: 6e 63 20 22 45 52 52 4f 52 3a 20 62 61 64 20 74  nc "ERROR: bad t
6250: 6f 6c 20 63 6f 6d 70 61 72 61 74 6f 72 20 22 20  ol comparator " 
6260: 74 6f 6c 29 29 29 29 29 29 0a 09 20 28 64 65 62  tol)))))).. (deb
6270: 75 67 3a 70 72 69 6e 74 20 34 20 22 41 46 54 45  ug:print 4 "AFTE
6280: 52 32 3a 20 63 61 74 65 67 6f 72 79 3a 20 22 20  R2: category: " 
6290: 63 61 74 65 67 6f 72 79 20 22 20 76 61 72 69 61  category " varia
62a0: 62 6c 65 3a 20 22 20 76 61 72 69 61 62 6c 65 20  ble: " variable 
62b0: 22 20 76 61 6c 75 65 3a 20 22 20 76 61 6c 75 65  " value: " value
62c0: 20 0a 09 09 20 20 20 20 20 20 22 2c 20 65 78 70   ...      ", exp
62d0: 65 63 74 65 64 3a 20 22 20 65 78 70 65 63 74 65  ected: " expecte
62e0: 64 20 22 20 74 6f 6c 3a 20 22 20 74 6f 6c 20 22  d " tol: " tol "
62f0: 20 75 6e 69 74 73 3a 20 22 20 75 6e 69 74 73 20   units: " units 
6300: 22 20 73 74 61 74 75 73 3a 20 22 20 73 74 61 74  " status: " stat
6310: 75 73 20 22 20 63 6f 6d 6d 65 6e 74 3a 20 22 20  us " comment: " 
6320: 63 6f 6d 6d 65 6e 74 29 0a 09 20 28 73 71 6c 69  comment).. (sqli
6330: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22  te3:execute db "
6340: 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43  INSERT OR REPLAC
6350: 45 20 49 4e 54 4f 20 74 65 73 74 5f 64 61 74 61  E INTO test_data
6360: 20 28 74 65 73 74 5f 69 64 2c 63 61 74 65 67 6f   (test_id,catego
6370: 72 79 2c 76 61 72 69 61 62 6c 65 2c 76 61 6c 75  ry,variable,valu
6380: 65 2c 65 78 70 65 63 74 65 64 2c 74 6f 6c 2c 75  e,expected,tol,u
6390: 6e 69 74 73 2c 63 6f 6d 6d 65 6e 74 2c 73 74 61  nits,comment,sta
63a0: 74 75 73 29 20 56 41 4c 55 45 53 20 28 3f 2c 3f  tus) VALUES (?,?
63b0: 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 29 3b  ,?,?,?,?,?,?,?);
63c0: 22 0a 09 20 20 20 20 20 20 74 65 73 74 2d 69 64  "..      test-id
63d0: 20 63 61 74 65 67 6f 72 79 20 76 61 72 69 61 62   category variab
63e0: 6c 65 20 76 61 6c 75 65 20 65 78 70 65 63 74 65  le value expecte
63f0: 64 20 74 6f 6c 20 75 6e 69 74 73 20 28 69 66 20  d tol units (if 
6400: 63 6f 6d 6d 65 6e 74 20 63 6f 6d 6d 65 6e 74 20  comment comment 
6410: 22 22 29 20 73 74 61 74 75 73 29 29 29 0a 20 20  "") status))).  
6420: 20 20 20 63 73 76 6c 69 73 74 29 29 29 0a 0a 3b     csvlist)))..;
6430: 3b 20 67 65 74 20 61 20 6c 69 73 74 20 6f 66 20  ; get a list of 
6440: 74 65 73 74 5f 64 61 74 61 20 72 65 63 6f 72 64  test_data record
6450: 73 20 6d 61 74 63 68 69 6e 67 20 63 61 74 65 67  s matching categ
6460: 6f 72 79 70 61 74 74 0a 28 64 65 66 69 6e 65 20  orypatt.(define 
6470: 28 64 62 3a 72 65 61 64 2d 74 65 73 74 2d 64 61  (db:read-test-da
6480: 74 61 20 64 62 20 74 65 73 74 2d 69 64 20 63 61  ta db test-id ca
6490: 74 65 67 6f 72 79 70 61 74 74 29 0a 20 20 28 6c  tegorypatt).  (l
64a0: 65 74 20 28 28 72 65 73 20 27 28 29 29 29 0a 20  et ((res '())). 
64b0: 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d     (sqlite3:for-
64c0: 65 61 63 68 2d 72 6f 77 20 0a 20 20 20 20 20 28  each-row .     (
64d0: 6c 61 6d 62 64 61 20 28 69 64 20 74 65 73 74 5f  lambda (id test_
64e0: 69 64 20 63 61 74 65 67 6f 72 79 20 76 61 72 69  id category vari
64f0: 61 62 6c 65 20 76 61 6c 75 65 20 65 78 70 65 63  able value expec
6500: 74 65 64 20 74 6f 6c 20 75 6e 69 74 73 20 63 6f  ted tol units co
6510: 6d 6d 65 6e 74 20 73 74 61 74 75 73 29 0a 20 20  mment status).  
6520: 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28       (set! res (
6530: 63 6f 6e 73 20 28 76 65 63 74 6f 72 20 69 64 20  cons (vector id 
6540: 74 65 73 74 5f 69 64 20 63 61 74 65 67 6f 72 79  test_id category
6550: 20 76 61 72 69 61 62 6c 65 20 76 61 6c 75 65 20   variable value 
6560: 65 78 70 65 63 74 65 64 20 74 6f 6c 20 75 6e 69  expected tol uni
6570: 74 73 20 63 6f 6d 6d 65 6e 74 20 73 74 61 74 75  ts comment statu
6580: 73 29 20 72 65 73 29 29 29 0a 20 20 20 20 20 64  s) res))).     d
6590: 62 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20 69  b.     "SELECT i
65a0: 64 2c 74 65 73 74 5f 69 64 2c 63 61 74 65 67 6f  d,test_id,catego
65b0: 72 79 2c 76 61 72 69 61 62 6c 65 2c 76 61 6c 75  ry,variable,valu
65c0: 65 2c 65 78 70 65 63 74 65 64 2c 74 6f 6c 2c 75  e,expected,tol,u
65d0: 6e 69 74 73 2c 63 6f 6d 6d 65 6e 74 2c 73 74 61  nits,comment,sta
65e0: 74 75 73 20 46 52 4f 4d 20 74 65 73 74 5f 64 61  tus FROM test_da
65f0: 74 61 20 57 48 45 52 45 20 74 65 73 74 5f 69 64  ta WHERE test_id
6600: 3d 3f 20 41 4e 44 20 63 61 74 65 67 6f 72 79 20  =? AND category 
6610: 4c 49 4b 45 20 3f 20 4f 52 44 45 52 20 42 59 20  LIKE ? ORDER BY 
6620: 63 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62 6c  category,variabl
6630: 65 3b 22 20 74 65 73 74 2d 69 64 20 63 61 74 65  e;" test-id cate
6640: 67 6f 72 79 70 61 74 74 29 0a 20 20 20 20 28 72  gorypatt).    (r
6650: 65 76 65 72 73 65 20 72 65 73 29 29 29 0a 0a 28  everse res)))..(
6660: 64 65 66 69 6e 65 20 28 64 62 3a 6c 6f 61 64 2d  define (db:load-
6670: 74 65 73 74 2d 64 61 74 61 20 64 62 20 72 75 6e  test-data db run
6680: 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74  -id test-name it
6690: 65 6d 64 61 74 29 0a 20 20 28 6c 65 74 2a 20 28  emdat).  (let* (
66a0: 28 69 74 65 6d 2d 70 61 74 68 20 28 69 74 65 6d  (item-path (item
66b0: 2d 6c 69 73 74 2d 3e 70 61 74 68 20 69 74 65 6d  -list->path item
66c0: 64 61 74 29 29 0a 09 20 28 74 65 73 74 64 61 74  dat)).. (testdat
66d0: 20 28 64 62 3a 67 65 74 2d 74 65 73 74 2d 69 6e   (db:get-test-in
66e0: 66 6f 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73  fo db run-id tes
66f0: 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68  t-name item-path
6700: 29 29 0a 09 20 28 74 65 73 74 2d 69 64 20 28 69  )).. (test-id (i
6710: 66 20 74 65 73 74 64 61 74 20 28 64 62 3a 74 65  f testdat (db:te
6720: 73 74 2d 67 65 74 2d 69 64 20 74 65 73 74 64 61  st-get-id testda
6730: 74 29 20 23 66 29 29 29 0a 20 20 20 20 3b 3b 20  t) #f))).    ;; 
6740: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 31 20 22  (debug:print 1 "
6750: 45 6e 74 65 72 20 72 65 63 6f 72 64 73 20 74 6f  Enter records to
6760: 20 69 6e 73 65 72 74 20 69 6e 20 74 68 65 20 74   insert in the t
6770: 65 73 74 5f 64 61 74 61 20 74 61 62 6c 65 2c 20  est_data table, 
6780: 73 65 76 65 6e 20 66 69 65 6c 64 73 2c 20 63 6f  seven fields, co
6790: 6d 6d 61 20 73 65 70 61 72 61 74 65 64 20 70 65  mma separated pe
67a0: 72 20 6c 69 6e 65 22 29 0a 20 20 20 20 28 64 65  r line").    (de
67b0: 62 75 67 3a 70 72 69 6e 74 20 34 20 22 69 74 65  bug:print 4 "ite
67c0: 6d 64 61 74 3a 20 22 20 69 74 65 6d 64 61 74 20  mdat: " itemdat 
67d0: 22 2c 20 74 65 73 74 2d 6e 61 6d 65 3a 20 22 20  ", test-name: " 
67e0: 74 65 73 74 2d 6e 61 6d 65 20 22 2c 20 74 65 73  test-name ", tes
67f0: 74 2d 69 64 3a 20 22 20 74 65 73 74 2d 69 64 29  t-id: " test-id)
6800: 0a 20 20 20 20 28 69 66 20 74 65 73 74 2d 69 64  .    (if test-id
6810: 0a 09 28 6c 65 74 20 6c 6f 6f 70 20 28 28 6c 69  ..(let loop ((li
6820: 6e 20 28 72 65 61 64 2d 6c 69 6e 65 29 29 29 0a  n (read-line))).
6830: 09 20 20 28 69 66 20 28 6e 6f 74 20 28 65 6f 66  .  (if (not (eof
6840: 2d 6f 62 6a 65 63 74 3f 20 6c 69 6e 29 29 0a 09  -object? lin))..
6850: 20 20 20 20 20 20 28 62 65 67 69 6e 0a 09 09 28        (begin...(
6860: 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20 6c 69  debug:print 4 li
6870: 6e 29 0a 09 09 28 64 62 3a 63 73 76 2d 3e 74 65  n)...(db:csv->te
6880: 73 74 2d 64 61 74 61 20 64 62 20 74 65 73 74 2d  st-data db test-
6890: 69 64 20 6c 69 6e 29 0a 09 09 28 6c 6f 6f 70 20  id lin)...(loop 
68a0: 28 72 65 61 64 2d 6c 69 6e 65 29 29 29 29 29 29  (read-line))))))
68b0: 0a 20 20 20 20 3b 3b 20 72 6f 6c 6c 20 75 70 20  .    ;; roll up 
68c0: 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 73 75  the current resu
68d0: 6c 74 73 2e 0a 20 20 20 20 28 64 62 3a 74 65 73  lts..    (db:tes
68e0: 74 2d 64 61 74 61 2d 72 6f 6c 6c 75 70 20 64 62  t-data-rollup db
68f0: 20 74 65 73 74 2d 69 64 29 29 29 0a 20 20 0a 3b   test-id))).  .;
6900: 3b 20 57 41 52 4e 49 4e 47 3a 20 44 6f 20 4e 4f  ; WARNING: Do NO
6910: 54 20 63 61 6c 6c 20 74 68 69 73 20 66 6f 72 20  T call this for 
6920: 74 68 65 20 70 61 72 65 6e 74 20 74 65 73 74 20  the parent test 
6930: 6f 6e 20 61 6e 20 69 74 65 72 61 74 65 64 20 74  on an iterated t
6940: 65 73 74 0a 3b 3b 20 52 6f 6c 6c 20 75 70 20 74  est.;; Roll up t
6950: 65 73 74 5f 64 61 74 61 20 70 61 73 73 2f 66 61  est_data pass/fa
6960: 69 6c 20 72 65 73 75 6c 74 73 0a 3b 3b 20 6c 6f  il results.;; lo
6970: 6f 6b 20 61 74 20 74 68 65 20 74 65 73 74 5f 64  ok at the test_d
6980: 61 74 61 20 73 74 61 74 75 73 20 66 69 65 6c 64  ata status field
6990: 2c 20 0a 3b 3b 20 20 20 20 69 66 20 61 6c 6c 20  , .;;    if all 
69a0: 61 72 65 20 70 61 73 73 20 28 61 6e 79 20 63 61  are pass (any ca
69b0: 73 65 29 20 61 6e 64 20 74 68 65 20 74 65 73 74  se) and the test
69c0: 20 73 74 61 74 75 73 20 69 73 20 50 41 53 53 20   status is PASS 
69d0: 6f 72 20 4e 55 4c 4c 20 6f 72 20 27 27 20 74 68  or NULL or '' th
69e0: 65 6e 20 73 65 74 20 74 65 73 74 20 73 74 61 74  en set test stat
69f0: 75 73 20 74 6f 20 50 41 53 53 2e 0a 3b 3b 20 20  us to PASS..;;  
6a00: 20 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72 65    if one or more
6a10: 20 61 72 65 20 66 61 69 6c 20 28 61 6e 79 20 63   are fail (any c
6a20: 61 73 65 29 20 74 68 65 6e 20 73 65 74 20 74 65  ase) then set te
6a30: 73 74 20 73 74 61 74 75 73 20 74 6f 20 50 41 53  st status to PAS
6a40: 53 2c 20 6e 6f 6e 20 22 70 61 73 73 22 20 6f 72  S, non "pass" or
6a50: 20 22 66 61 69 6c 22 20 61 72 65 20 69 67 6e 6f   "fail" are igno
6a60: 72 65 64 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  red.(define (db:
6a70: 74 65 73 74 2d 64 61 74 61 2d 72 6f 6c 6c 75 70  test-data-rollup
6a80: 20 64 62 20 74 65 73 74 2d 69 64 29 0a 20 20 28   db test-id).  (
6a90: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
6aa0: 0a 20 20 20 64 62 20 0a 20 20 20 22 55 50 44 41  .   db .   "UPDA
6ab0: 54 45 20 74 65 73 74 73 20 0a 20 20 20 20 20 20  TE tests .      
6ac0: 53 45 54 20 66 61 69 6c 5f 63 6f 75 6e 74 3d 28  SET fail_count=(
6ad0: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 69 64 29  SELECT count(id)
6ae0: 20 46 52 4f 4d 20 74 65 73 74 5f 64 61 74 61 20   FROM test_data 
6af0: 57 48 45 52 45 20 74 65 73 74 5f 69 64 3d 3f 20  WHERE test_id=? 
6b00: 41 4e 44 20 73 74 61 74 75 73 20 6c 69 6b 65 20  AND status like 
6b10: 27 66 61 69 6c 27 29 2c 0a 20 20 20 20 20 20 20  'fail'),.       
6b20: 20 20 20 70 61 73 73 5f 63 6f 75 6e 74 3d 28 53     pass_count=(S
6b30: 45 4c 45 43 54 20 63 6f 75 6e 74 28 69 64 29 20  ELECT count(id) 
6b40: 46 52 4f 4d 20 74 65 73 74 5f 64 61 74 61 20 57  FROM test_data W
6b50: 48 45 52 45 20 74 65 73 74 5f 69 64 3d 3f 20 41  HERE test_id=? A
6b60: 4e 44 20 73 74 61 74 75 73 20 6c 69 6b 65 20 27  ND status like '
6b70: 70 61 73 73 27 29 0a 20 20 20 20 20 20 57 48 45  pass').      WHE
6b80: 52 45 20 69 64 3d 3f 3b 22 0a 20 20 20 74 65 73  RE id=?;".   tes
6b90: 74 2d 69 64 20 74 65 73 74 2d 69 64 20 74 65 73  t-id test-id tes
6ba0: 74 2d 69 64 29 0a 20 20 3b 3b 20 69 66 20 74 68  t-id).  ;; if th
6bb0: 65 20 74 65 73 74 20 69 73 20 6e 6f 74 20 46 41  e test is not FA
6bc0: 49 4c 20 74 68 65 6e 20 73 65 74 20 73 74 61 74  IL then set stat
6bd0: 75 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  us based on the 
6be0: 66 61 69 6c 20 61 6e 64 20 70 61 73 73 20 63 6f  fail and pass co
6bf0: 75 6e 74 73 2e 0a 20 20 28 74 68 72 65 61 64 2d  unts..  (thread-
6c00: 73 6c 65 65 70 21 20 31 29 0a 20 20 28 73 71 6c  sleep! 1).  (sql
6c10: 69 74 65 33 3a 65 78 65 63 75 74 65 0a 20 20 20  ite3:execute.   
6c20: 64 62 0a 20 20 20 22 55 50 44 41 54 45 20 74 65  db.   "UPDATE te
6c30: 73 74 73 0a 20 20 20 20 20 20 53 45 54 20 73 74  sts.      SET st
6c40: 61 74 75 73 3d 43 41 53 45 20 57 48 45 4e 20 28  atus=CASE WHEN (
6c50: 53 45 4c 45 43 54 20 66 61 69 6c 5f 63 6f 75 6e  SELECT fail_coun
6c60: 74 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45  t FROM tests WHE
6c70: 52 45 20 69 64 3d 3f 29 20 3e 20 30 20 0a 20 20  RE id=?) > 0 .  
6c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c90: 20 20 20 20 20 20 20 54 48 45 4e 20 27 46 41 49         THEN 'FAI
6ca0: 4c 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L'.             
6cb0: 20 20 20 20 20 20 20 20 20 57 48 45 4e 20 28 53           WHEN (S
6cc0: 45 4c 45 43 54 20 70 61 73 73 5f 63 6f 75 6e 74  ELECT pass_count
6cd0: 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52   FROM tests WHER
6ce0: 45 20 69 64 3d 3f 29 20 3e 20 30 0a 20 20 20 20  E id=?) > 0.    
6cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d00: 20 20 20 20 20 54 48 45 4e 20 27 50 41 53 53 27       THEN 'PASS'
6d10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6d20: 20 20 20 20 20 20 20 45 4c 53 45 20 73 74 61 74         ELSE stat
6d30: 75 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  us.             
6d40: 20 20 20 20 20 45 4e 44 20 57 48 45 52 45 20 69       END WHERE i
6d50: 64 3d 3f 3b 22 0a 20 20 20 74 65 73 74 2d 69 64  d=?;".   test-id
6d60: 20 74 65 73 74 2d 69 64 20 74 65 73 74 2d 69 64   test-id test-id
6d70: 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  ))..(define (db:
6d80: 67 65 74 2d 70 72 65 76 2d 74 6f 6c 2d 66 6f 72  get-prev-tol-for
6d90: 2d 74 65 73 74 20 64 62 20 74 65 73 74 2d 69 64  -test db test-id
6da0: 20 63 61 74 65 67 6f 72 79 20 76 61 72 69 61 62   category variab
6db0: 6c 65 29 0a 20 20 3b 3b 20 46 69 6e 69 73 68 20  le).  ;; Finish 
6dc0: 6d 65 3f 0a 20 20 28 76 61 6c 75 65 73 20 23 66  me?.  (values #f
6dd0: 20 23 66 20 23 66 29 29 0a 0a 3b 3b 3d 3d 3d 3d   #f #f))..;;====
6de0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6df0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6e00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6e10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6e20: 3d 3d 0a 3b 3b 20 53 20 54 20 45 20 50 20 53 20  ==.;; S T E P S 
6e30: 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  .;;=============
6e40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6e50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6e60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6e70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65 66 69  =========..(defi
6e80: 6e 65 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d  ne (db:step-get-
6e90: 74 69 6d 65 2d 61 73 2d 73 74 72 69 6e 67 20 76  time-as-string v
6ea0: 65 63 29 0a 20 20 20 20 28 73 65 63 6f 6e 64 73  ec).    (seconds
6eb0: 2d 3e 74 69 6d 65 2d 73 74 72 69 6e 67 20 28 64  ->time-string (d
6ec0: 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74  b:step-get-event
6ed0: 5f 74 69 6d 65 20 76 65 63 29 29 29 0a 0a 3b 3b  _time vec)))..;;
6ee0: 20 64 62 2d 67 65 74 2d 74 65 73 74 2d 73 74 65   db-get-test-ste
6ef0: 70 73 2d 66 6f 72 2d 72 75 6e 0a 28 64 65 66 69  ps-for-run.(defi
6f00: 6e 65 20 28 64 62 3a 67 65 74 2d 73 74 65 70 73  ne (db:get-steps
6f10: 2d 66 6f 72 2d 74 65 73 74 20 64 62 20 74 65 73  -for-test db tes
6f20: 74 2d 69 64 29 0a 20 20 28 6c 65 74 20 28 28 72  t-id).  (let ((r
6f30: 65 73 20 27 28 29 29 29 0a 20 20 20 20 28 73 71  es '())).    (sq
6f40: 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72  lite3:for-each-r
6f50: 6f 77 20 0a 20 20 20 20 20 28 6c 61 6d 62 64 61  ow .     (lambda
6f60: 20 28 69 64 20 74 65 73 74 2d 69 64 20 73 74 65   (id test-id ste
6f70: 70 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61 74  pname state stat
6f80: 75 73 20 65 76 65 6e 74 2d 74 69 6d 65 20 6c 6f  us event-time lo
6f90: 67 66 69 6c 65 29 0a 20 20 20 20 20 20 20 28 73  gfile).       (s
6fa0: 65 74 21 20 72 65 73 20 28 63 6f 6e 73 20 28 76  et! res (cons (v
6fb0: 65 63 74 6f 72 20 69 64 20 74 65 73 74 2d 69 64  ector id test-id
6fc0: 20 73 74 65 70 6e 61 6d 65 20 73 74 61 74 65 20   stepname state 
6fd0: 73 74 61 74 75 73 20 65 76 65 6e 74 2d 74 69 6d  status event-tim
6fe0: 65 20 28 69 66 20 28 73 74 72 69 6e 67 3f 20 6c  e (if (string? l
6ff0: 6f 67 66 69 6c 65 29 20 6c 6f 67 66 69 6c 65 20  ogfile) logfile 
7000: 22 22 29 29 20 72 65 73 29 29 29 0a 20 20 20 20  "")) res))).    
7010: 20 64 62 0a 20 20 20 20 20 22 53 45 4c 45 43 54   db.     "SELECT
7020: 20 69 64 2c 74 65 73 74 5f 69 64 2c 73 74 65 70   id,test_id,step
7030: 6e 61 6d 65 2c 73 74 61 74 65 2c 73 74 61 74 75  name,state,statu
7040: 73 2c 65 76 65 6e 74 5f 74 69 6d 65 2c 6c 6f 67  s,event_time,log
7050: 66 69 6c 65 20 46 52 4f 4d 20 74 65 73 74 5f 73  file FROM test_s
7060: 74 65 70 73 20 57 48 45 52 45 20 74 65 73 74 5f  teps WHERE test_
7070: 69 64 3d 3f 20 4f 52 44 45 52 20 42 59 20 69 64  id=? ORDER BY id
7080: 20 41 53 43 3b 22 20 3b 3b 20 65 76 65 6e 74 5f   ASC;" ;; event_
7090: 74 69 6d 65 20 44 45 53 43 2c 69 64 20 41 53 43  time DESC,id ASC
70a0: 3b 0a 20 20 20 20 20 74 65 73 74 2d 69 64 29 0a  ;.     test-id).
70b0: 20 20 20 20 28 72 65 76 65 72 73 65 20 72 65 73      (reverse res
70c0: 29 29 29 0a 0a 3b 3b 20 67 65 74 20 61 20 70 72  )))..;; get a pr
70d0: 65 74 74 79 20 74 61 62 6c 65 20 74 6f 20 73 75  etty table to su
70e0: 6d 6d 61 72 69 7a 65 20 73 74 65 70 73 0a 3b 3b  mmarize steps.;;
70f0: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74  .(define (db:get
7100: 2d 73 74 65 70 73 2d 74 61 62 6c 65 20 64 62 20  -steps-table db 
7110: 74 65 73 74 2d 69 64 29 0a 20 20 28 6c 65 74 20  test-id).  (let 
7120: 28 28 73 74 65 70 73 20 20 20 28 64 62 3a 67 65  ((steps   (db:ge
7130: 74 2d 73 74 65 70 73 2d 66 6f 72 2d 74 65 73 74  t-steps-for-test
7140: 20 64 62 20 74 65 73 74 2d 69 64 29 29 29 0a 20   db test-id))). 
7150: 20 20 20 3b 3b 20 6f 72 67 61 6e 69 73 65 20 74     ;; organise t
7160: 68 65 20 73 74 65 70 73 20 66 6f 72 20 62 65 74  he steps for bet
7170: 74 65 72 20 72 65 61 64 61 62 69 6c 69 74 79 0a  ter readability.
7180: 20 20 20 20 28 6c 65 74 20 28 28 72 65 73 20 28      (let ((res (
7190: 6d 61 6b 65 2d 68 61 73 68 2d 74 61 62 6c 65 29  make-hash-table)
71a0: 29 29 0a 20 20 20 20 20 20 28 66 6f 72 2d 65 61  )).      (for-ea
71b0: 63 68 20 0a 20 20 20 20 20 20 20 28 6c 61 6d 62  ch .       (lamb
71c0: 64 61 20 28 73 74 65 70 29 0a 09 20 28 64 65 62  da (step).. (deb
71d0: 75 67 3a 70 72 69 6e 74 20 36 20 22 73 74 65 70  ug:print 6 "step
71e0: 3d 22 20 73 74 65 70 29 0a 09 20 28 6c 65 74 20  =" step).. (let 
71f0: 28 28 72 65 63 6f 72 64 20 28 68 61 73 68 2d 74  ((record (hash-t
7200: 61 62 6c 65 2d 72 65 66 2f 64 65 66 61 75 6c 74  able-ref/default
7210: 20 0a 09 09 09 72 65 73 20 0a 09 09 09 28 64 62   ....res ....(db
7220: 3a 73 74 65 70 2d 67 65 74 2d 73 74 65 70 6e 61  :step-get-stepna
7230: 6d 65 20 73 74 65 70 29 20 0a 09 09 09 3b 3b 20  me step) ....;; 
7240: 20 20 20 20 20 20 20 73 74 65 70 6e 61 6d 65 20         stepname 
7250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
7260: 74 61 72 74 20 65 6e 64 20 73 74 61 74 75 73 20  tart end status 
7270: 20 20 20 0a 09 09 09 28 76 65 63 74 6f 72 20 28     ....(vector (
7280: 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 65 70  db:step-get-step
7290: 6e 61 6d 65 20 73 74 65 70 29 20 22 22 20 20 20  name step) ""   
72a0: 22 22 20 22 22 20 20 20 20 20 22 22 20 22 22 29  "" ""     "" "")
72b0: 29 29 29 0a 09 20 20 20 28 64 65 62 75 67 3a 70  )))..   (debug:p
72c0: 72 69 6e 74 20 36 20 22 72 65 63 6f 72 64 28 62  rint 6 "record(b
72d0: 65 66 6f 72 65 29 20 3d 20 22 20 72 65 63 6f 72  efore) = " recor
72e0: 64 20 0a 09 09 09 22 5c 6e 69 64 3a 20 20 20 20  d ...."\nid:    
72f0: 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65     " (db:step-ge
7300: 74 2d 69 64 20 73 74 65 70 29 0a 09 09 09 22 5c  t-id step)...."\
7310: 6e 73 74 65 70 6e 61 6d 65 3a 20 22 20 28 64 62  nstepname: " (db
7320: 3a 73 74 65 70 2d 67 65 74 2d 73 74 65 70 6e 61  :step-get-stepna
7330: 6d 65 20 73 74 65 70 29 0a 09 09 09 22 5c 6e 73  me step)...."\ns
7340: 74 61 74 65 3a 20 20 20 20 22 20 28 64 62 3a 73  tate:    " (db:s
7350: 74 65 70 2d 67 65 74 2d 73 74 61 74 65 20 73 74  tep-get-state st
7360: 65 70 29 0a 09 09 09 22 5c 6e 73 74 61 74 75 73  ep)...."\nstatus
7370: 3a 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d 67  :   " (db:step-g
7380: 65 74 2d 73 74 61 74 75 73 20 73 74 65 70 29 0a  et-status step).
7390: 09 09 09 22 5c 6e 74 69 6d 65 3a 20 20 20 20 20  ..."\ntime:     
73a0: 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65  " (db:step-get-e
73b0: 76 65 6e 74 5f 74 69 6d 65 20 73 74 65 70 29 29  vent_time step))
73c0: 0a 09 20 20 20 28 63 61 73 65 20 28 73 74 72 69  ..   (case (stri
73d0: 6e 67 2d 3e 73 79 6d 62 6f 6c 20 28 64 62 3a 73  ng->symbol (db:s
73e0: 74 65 70 2d 67 65 74 2d 73 74 61 74 65 20 73 74  tep-get-state st
73f0: 65 70 29 29 0a 09 20 20 20 20 20 28 28 73 74 61  ep))..     ((sta
7400: 72 74 29 28 76 65 63 74 6f 72 2d 73 65 74 21 20  rt)(vector-set! 
7410: 72 65 63 6f 72 64 20 31 20 28 64 62 3a 73 74 65  record 1 (db:ste
7420: 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65  p-get-event_time
7430: 20 73 74 65 70 29 29 0a 09 20 20 20 20 20 20 28   step))..      (
7440: 76 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f  vector-set! reco
7450: 72 64 20 33 20 28 69 66 20 28 65 71 75 61 6c 3f  rd 3 (if (equal?
7460: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 72 65 63   (vector-ref rec
7470: 6f 72 64 20 33 29 20 22 22 29 0a 09 09 09 09 09  ord 3) "")......
7480: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61  (db:step-get-sta
7490: 74 75 73 20 73 74 65 70 29 29 29 0a 09 20 20 20  tus step)))..   
74a0: 20 20 20 28 69 66 20 28 3e 20 28 73 74 72 69 6e     (if (> (strin
74b0: 67 2d 6c 65 6e 67 74 68 20 28 64 62 3a 73 74 65  g-length (db:ste
74c0: 70 2d 67 65 74 2d 6c 6f 67 66 69 6c 65 20 73 74  p-get-logfile st
74d0: 65 70 29 29 0a 09 09 20 20 20 20 20 30 29 0a 09  ep))...     0)..
74e0: 09 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20  .  (vector-set! 
74f0: 72 65 63 6f 72 64 20 35 20 28 64 62 3a 73 74 65  record 5 (db:ste
7500: 70 2d 67 65 74 2d 6c 6f 67 66 69 6c 65 20 73 74  p-get-logfile st
7510: 65 70 29 29 29 29 0a 09 20 20 20 20 20 28 28 65  ep))))..     ((e
7520: 6e 64 29 20 20 0a 09 20 20 20 20 20 20 28 76 65  nd)  ..      (ve
7530: 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64  ctor-set! record
7540: 20 32 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 20   2 (any->number 
7550: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65  (db:step-get-eve
7560: 6e 74 5f 74 69 6d 65 20 73 74 65 70 29 29 29 0a  nt_time step))).
7570: 09 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73  .      (vector-s
7580: 65 74 21 20 72 65 63 6f 72 64 20 33 20 28 64 62  et! record 3 (db
7590: 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 74 75 73  :step-get-status
75a0: 20 73 74 65 70 29 29 0a 09 20 20 20 20 20 20 28   step))..      (
75b0: 76 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f  vector-set! reco
75c0: 72 64 20 34 20 28 6c 65 74 20 28 28 73 74 61 72  rd 4 (let ((star
75d0: 74 74 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 20  tt (any->number 
75e0: 28 76 65 63 74 6f 72 2d 72 65 66 20 72 65 63 6f  (vector-ref reco
75f0: 72 64 20 31 29 29 29 0a 09 09 09 09 09 20 20 28  rd 1)))......  (
7600: 65 6e 64 74 20 20 20 28 61 6e 79 2d 3e 6e 75 6d  endt   (any->num
7610: 62 65 72 20 28 76 65 63 74 6f 72 2d 72 65 66 20  ber (vector-ref 
7620: 72 65 63 6f 72 64 20 32 29 29 29 29 0a 09 09 09  record 2))))....
7630: 09 20 20 20 20 20 20 28 64 65 62 75 67 3a 70 72  .      (debug:pr
7640: 69 6e 74 20 34 20 22 72 65 63 6f 72 64 5b 31 5d  int 4 "record[1]
7650: 3d 22 20 28 76 65 63 74 6f 72 2d 72 65 66 20 72  =" (vector-ref r
7660: 65 63 6f 72 64 20 31 29 20 0a 09 09 09 09 09 09  ecord 1) .......
7670: 20 20 20 22 2c 20 73 74 61 72 74 74 3d 22 20 73     ", startt=" s
7680: 74 61 72 74 74 20 22 2c 20 65 6e 64 74 3d 22 20  tartt ", endt=" 
7690: 65 6e 64 74 0a 09 09 09 09 09 09 20 20 20 22 2c  endt.......   ",
76a0: 20 67 65 74 2d 73 74 61 74 75 73 3a 20 22 20 28   get-status: " (
76b0: 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 74  db:step-get-stat
76c0: 75 73 20 73 74 65 70 29 29 0a 09 09 09 09 20 20  us step)).....  
76d0: 20 20 20 20 28 69 66 20 28 61 6e 64 20 28 6e 75      (if (and (nu
76e0: 6d 62 65 72 3f 20 73 74 61 72 74 74 29 28 6e 75  mber? startt)(nu
76f0: 6d 62 65 72 3f 20 65 6e 64 74 29 29 0a 09 09 09  mber? endt))....
7700: 09 09 20 20 28 73 65 63 6f 6e 64 73 2d 3e 68 72  ..  (seconds->hr
7710: 2d 6d 69 6e 2d 73 65 63 20 28 2d 20 65 6e 64 74  -min-sec (- endt
7720: 20 73 74 61 72 74 74 29 29 20 22 2d 31 22 29 29   startt)) "-1"))
7730: 29 0a 09 20 20 20 20 20 20 28 69 66 20 28 3e 20  )..      (if (> 
7740: 28 73 74 72 69 6e 67 2d 6c 65 6e 67 74 68 20 28  (string-length (
7750: 64 62 3a 73 74 65 70 2d 67 65 74 2d 6c 6f 67 66  db:step-get-logf
7760: 69 6c 65 20 73 74 65 70 29 29 0a 09 09 20 20 20  ile step))...   
7770: 20 20 30 29 0a 09 09 20 20 28 76 65 63 74 6f 72    0)...  (vector
7780: 2d 73 65 74 21 20 72 65 63 6f 72 64 20 35 20 28  -set! record 5 (
7790: 64 62 3a 73 74 65 70 2d 67 65 74 2d 6c 6f 67 66  db:step-get-logf
77a0: 69 6c 65 20 73 74 65 70 29 29 29 29 0a 09 20 20  ile step))))..  
77b0: 20 20 20 28 65 6c 73 65 0a 09 20 20 20 20 20 20     (else..      
77c0: 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72    (vector-set! r
77d0: 65 63 6f 72 64 20 32 20 28 64 62 3a 73 74 65 70  ecord 2 (db:step
77e0: 2d 67 65 74 2d 73 74 61 74 65 20 73 74 65 70 29  -get-state step)
77f0: 29 0a 09 20 20 20 20 20 20 20 20 28 76 65 63 74  )..        (vect
7800: 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 33  or-set! record 3
7810: 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74   (db:step-get-st
7820: 61 74 75 73 20 73 74 65 70 29 29 0a 09 20 20 20  atus step))..   
7830: 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74       (vector-set
7840: 21 20 72 65 63 6f 72 64 20 34 20 28 64 62 3a 73  ! record 4 (db:s
7850: 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69  tep-get-event_ti
7860: 6d 65 20 73 74 65 70 29 29 29 29 0a 09 20 20 20  me step))))..   
7870: 28 68 61 73 68 2d 74 61 62 6c 65 2d 73 65 74 21  (hash-table-set!
7880: 20 72 65 73 20 28 64 62 3a 73 74 65 70 2d 67 65   res (db:step-ge
7890: 74 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70 29  t-stepname step)
78a0: 20 72 65 63 6f 72 64 29 0a 09 20 20 20 28 64 65   record)..   (de
78b0: 62 75 67 3a 70 72 69 6e 74 20 36 20 22 72 65 63  bug:print 6 "rec
78c0: 6f 72 64 28 61 66 74 65 72 29 20 20 3d 20 22 20  ord(after)  = " 
78d0: 72 65 63 6f 72 64 20 0a 09 09 09 22 5c 6e 69 64  record ...."\nid
78e0: 3a 20 20 20 20 20 20 20 22 20 28 64 62 3a 73 74  :       " (db:st
78f0: 65 70 2d 67 65 74 2d 69 64 20 73 74 65 70 29 0a  ep-get-id step).
7900: 09 09 09 22 5c 6e 73 74 65 70 6e 61 6d 65 3a 20  ..."\nstepname: 
7910: 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73  " (db:step-get-s
7920: 74 65 70 6e 61 6d 65 20 73 74 65 70 29 0a 09 09  tepname step)...
7930: 09 22 5c 6e 73 74 61 74 65 3a 20 20 20 20 22 20  ."\nstate:    " 
7940: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61  (db:step-get-sta
7950: 74 65 20 73 74 65 70 29 0a 09 09 09 22 5c 6e 73  te step)...."\ns
7960: 74 61 74 75 73 3a 20 20 20 22 20 28 64 62 3a 73  tatus:   " (db:s
7970: 74 65 70 2d 67 65 74 2d 73 74 61 74 75 73 20 73  tep-get-status s
7980: 74 65 70 29 0a 09 09 09 22 5c 6e 74 69 6d 65 3a  tep)...."\ntime:
7990: 20 20 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d       " (db:step-
79a0: 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73  get-event_time s
79b0: 74 65 70 29 29 29 29 0a 20 20 20 20 20 20 20 3b  tep)))).       ;
79c0: 3b 20 28 65 6c 73 65 20 20 20 28 76 65 63 74 6f  ; (else   (vecto
79d0: 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 31 20  r-set! record 1 
79e0: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65  (db:step-get-eve
79f0: 6e 74 5f 74 69 6d 65 20 73 74 65 70 29 29 29 0a  nt_time step))).
7a00: 20 20 20 20 20 20 20 28 73 6f 72 74 20 73 74 65         (sort ste
7a10: 70 73 20 28 6c 61 6d 62 64 61 20 28 61 20 62 29  ps (lambda (a b)
7a20: 28 3c 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d  (< (db:step-get-
7a30: 65 76 65 6e 74 5f 74 69 6d 65 20 61 29 28 64 62  event_time a)(db
7a40: 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f  :step-get-event_
7a50: 74 69 6d 65 20 62 29 29 29 29 29 0a 20 20 20 20  time b))))).    
7a60: 20 20 72 65 73 29 29 29 0a 0a 3b 3b 20 55 53 45    res)))..;; USE
7a70: 3a 20 28 6c 73 65 74 2d 64 69 66 66 65 72 65 6e  : (lset-differen
7a80: 63 65 20 73 74 72 69 6e 67 3d 3f 20 27 28 22 61  ce string=? '("a
7a90: 22 20 22 62 22 20 22 63 22 29 20 27 28 22 64 22  " "b" "c") '("d"
7aa0: 20 22 63 22 20 22 65 22 20 22 61 22 29 29 0a 3b   "c" "e" "a")).;
7ab0: 3b 0a 3b 3b 20 52 65 74 75 72 6e 20 61 20 6c 69  ;.;; Return a li
7ac0: 73 74 20 6f 66 20 70 72 65 72 65 71 73 20 74 68  st of prereqs th
7ad0: 61 74 20 77 65 72 65 20 4e 4f 54 20 6d 65 74 0a  at were NOT met.
7ae0: 3b 3b 20 20 54 65 73 74 73 20 28 61 6e 64 20 61  ;;  Tests (and a
7af0: 6c 6c 20 69 74 65 6d 73 29 20 69 6e 20 77 61 69  ll items) in wai
7b00: 74 6f 6e 20 6c 69 73 74 20 6d 75 73 74 20 62 65  ton list must be
7b10: 20 22 43 4f 4d 50 4c 45 54 45 44 22 20 61 6e 64   "COMPLETED" and
7b20: 20 22 50 41 53 53 22 0a 28 64 65 66 69 6e 65 20   "PASS".(define 
7b30: 28 64 62 2d 67 65 74 2d 70 72 65 72 65 71 73 2d  (db-get-prereqs-
7b40: 6e 6f 74 2d 6d 65 74 20 64 62 20 72 75 6e 2d 69  not-met db run-i
7b50: 64 20 77 61 69 74 6f 6e 29 0a 20 20 28 69 66 20  d waiton).  (if 
7b60: 28 6e 75 6c 6c 3f 20 77 61 69 74 6f 6e 29 0a 20  (null? waiton). 
7b70: 20 20 20 20 20 27 28 29 0a 20 20 20 20 20 20 28       '().      (
7b80: 6c 65 74 2a 20 28 28 75 6e 6d 65 74 2d 70 72 65  let* ((unmet-pre
7b90: 2d 72 65 71 73 20 27 28 29 29 0a 09 20 20 20 20  -reqs '())..    
7ba0: 20 28 74 65 73 74 73 20 20 20 20 20 20 20 20 20   (tests         
7bb0: 20 20 28 64 62 2d 67 65 74 2d 74 65 73 74 73 2d    (db-get-tests-
7bc0: 66 6f 72 2d 72 75 6e 20 64 62 20 72 75 6e 2d 69  for-run db run-i
7bd0: 64 20 23 66 20 23 66 20 27 28 29 20 27 28 29 29  d #f #f '() '())
7be0: 29 0a 09 20 20 20 20 20 28 72 65 73 75 6c 74 20  )..     (result 
7bf0: 20 20 20 20 20 20 20 20 27 28 29 29 29 0a 09 28          '()))..(
7c00: 66 6f 72 2d 65 61 63 68 20 28 6c 61 6d 62 64 61  for-each (lambda
7c10: 20 28 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d   (waitontest-nam
7c20: 65 29 0a 09 09 20 20 20 20 28 6c 65 74 20 28 28  e)...    (let ((
7c30: 65 76 65 72 2d 73 65 65 6e 20 23 66 29 29 0a 09  ever-seen #f))..
7c40: 09 20 20 20 20 20 20 28 66 6f 72 2d 65 61 63 68  .      (for-each
7c50: 20 28 6c 61 6d 62 64 61 20 28 74 65 73 74 29 0a   (lambda (test).
7c60: 09 09 09 09 20 20 28 69 66 20 28 65 71 75 61 6c  ....  (if (equal
7c70: 3f 20 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d  ? waitontest-nam
7c80: 65 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 74  e (db:test-get-t
7c90: 65 73 74 6e 61 6d 65 20 74 65 73 74 29 29 0a 09  estname test))..
7ca0: 09 09 09 20 20 20 20 20 20 28 62 65 67 69 6e 0a  ...      (begin.
7cb0: 09 09 09 09 09 28 73 65 74 21 20 65 76 65 72 2d  .....(set! ever-
7cc0: 73 65 65 6e 20 23 74 29 0a 09 09 09 09 09 28 69  seen #t)......(i
7cd0: 66 20 28 6e 6f 74 20 28 61 6e 64 20 28 65 71 75  f (not (and (equ
7ce0: 61 6c 3f 20 28 64 62 3a 74 65 73 74 2d 67 65 74  al? (db:test-get
7cf0: 2d 73 74 61 74 65 20 74 65 73 74 29 20 22 43 4f  -state test) "CO
7d00: 4d 50 4c 45 54 45 44 22 29 0a 09 09 09 09 09 09  MPLETED").......
7d10: 20 20 20 20 20 20 28 6d 65 6d 62 65 72 20 28 64        (member (d
7d20: 62 3a 74 65 73 74 2d 67 65 74 2d 73 74 61 74 75  b:test-get-statu
7d30: 73 20 74 65 73 74 29 20 27 28 22 50 41 53 53 22  s test) '("PASS"
7d40: 20 22 57 41 52 4e 22 20 22 43 48 45 43 4b 22 29   "WARN" "CHECK")
7d50: 29 29 29 0a 09 09 09 09 09 20 20 20 20 28 73 65  )))......    (se
7d60: 74 21 20 72 65 73 75 6c 74 20 28 63 6f 6e 73 20  t! result (cons 
7d70: 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 20  waitontest-name 
7d80: 72 65 73 75 6c 74 29 29 29 29 29 29 0a 09 09 09  result))))))....
7d90: 09 74 65 73 74 73 29 0a 09 09 20 20 20 20 20 20  .tests)...      
7da0: 28 69 66 20 28 6e 6f 74 20 65 76 65 72 2d 73 65  (if (not ever-se
7db0: 65 6e 29 28 73 65 74 21 20 72 65 73 75 6c 74 20  en)(set! result 
7dc0: 28 63 6f 6e 73 20 77 61 69 74 6f 6e 74 65 73 74  (cons waitontest
7dd0: 2d 6e 61 6d 65 20 72 65 73 75 6c 74 29 29 29 29  -name result))))
7de0: 29 0a 09 09 20 20 77 61 69 74 6f 6e 29 0a 09 28  )...  waiton)..(
7df0: 64 65 6c 65 74 65 2d 64 75 70 6c 69 63 61 74 65  delete-duplicate
7e00: 73 20 72 65 73 75 6c 74 29 29 29 29 0a 0a 3b 3b  s result))))..;;
7e10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7e20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7e30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7e40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7e50: 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 45 78 74 72 61 63  ======.;; Extrac
7e60: 74 20 6f 64 73 20 66 69 6c 65 20 66 72 6f 6d 20  t ods file from 
7e70: 74 68 65 20 64 62 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d  the db.;;=======
7e80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7e90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7ea0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7eb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a  ===============.
7ec0: 0a 3b 3b 20 72 75 6e 73 70 61 74 74 20 69 73 20  .;; runspatt is 
7ed0: 61 20 63 6f 6d 6d 61 20 64 65 6c 69 6d 69 74 65  a comma delimite
7ee0: 64 20 6c 69 73 74 20 6f 66 20 72 75 6e 20 70 61  d list of run pa
7ef0: 74 74 65 72 6e 73 0a 3b 3b 20 6b 65 79 70 61 74  tterns.;; keypat
7f00: 74 2d 61 6c 69 73 74 20 6d 75 73 74 20 63 6f 6e  t-alist must con
7f10: 74 61 69 6e 20 2a 61 6c 6c 2a 20 6b 65 79 73 20  tain *all* keys 
7f20: 77 69 74 68 20 61 6e 20 61 73 73 6f 63 69 61 74  with an associat
7f30: 65 64 20 70 61 74 74 65 72 6e 3a 20 27 28 20 28  ed pattern: '( (
7f40: 22 4b 45 59 31 22 20 22 25 22 29 20 2e 2e 20 29  "KEY1" "%") .. )
7f50: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 65 78 74  .(define (db:ext
7f60: 72 61 63 74 2d 6f 64 73 2d 66 69 6c 65 20 64 62  ract-ods-file db
7f70: 20 6f 75 74 70 75 74 66 69 6c 65 20 6b 65 79 70   outputfile keyp
7f80: 61 74 74 2d 61 6c 69 73 74 20 72 75 6e 73 70 61  att-alist runspa
7f90: 74 74 20 70 61 74 68 6d 6f 64 29 0a 20 20 28 6c  tt pathmod).  (l
7fa0: 65 74 2a 20 28 28 6b 65 79 73 73 74 72 20 20 28  et* ((keysstr  (
7fb0: 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72  string-intersper
7fc0: 73 65 20 28 6d 61 70 20 63 61 72 20 6b 65 79 70  se (map car keyp
7fd0: 61 74 74 2d 61 6c 69 73 74 29 20 22 2c 22 29 29  att-alist) ","))
7fe0: 0a 09 20 28 6b 65 79 71 72 79 20 20 20 28 73 74  .. (keyqry   (st
7ff0: 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65  ring-intersperse
8000: 20 28 6d 61 70 20 28 6c 61 6d 62 64 61 20 28 70   (map (lambda (p
8010: 29 28 63 6f 6e 63 20 28 63 61 72 20 70 29 20 22  )(conc (car p) "
8020: 20 4c 49 4b 45 20 3f 20 22 29 29 20 6b 65 79 70   LIKE ? ")) keyp
8030: 61 74 74 2d 61 6c 69 73 74 29 20 22 20 41 4e 44  att-alist) " AND
8040: 20 22 29 29 0a 09 20 28 6e 75 6d 6b 65 79 73 20   ")).. (numkeys 
8050: 20 28 6c 65 6e 67 74 68 20 6b 65 79 70 61 74 74   (length keypatt
8060: 2d 61 6c 69 73 74 29 29 0a 09 20 28 74 65 73 74  -alist)).. (test
8070: 2d 69 64 73 20 27 28 29 29 0a 09 20 28 77 69 6e  -ids '()).. (win
8080: 64 6f 77 73 20 20 28 61 6e 64 20 70 61 74 68 6d  dows  (and pathm
8090: 6f 64 20 28 73 75 62 73 74 72 69 6e 67 2d 69 6e  od (substring-in
80a0: 64 65 78 20 22 5c 5c 22 20 70 61 74 68 6d 6f 64  dex "\\" pathmod
80b0: 29 29 29 0a 09 20 28 74 65 6d 70 64 69 72 20 20  ))).. (tempdir  
80c0: 28 63 6f 6e 63 20 22 2f 74 6d 70 2f 22 20 28 63  (conc "/tmp/" (c
80d0: 75 72 72 65 6e 74 2d 75 73 65 72 2d 6e 61 6d 65  urrent-user-name
80e0: 29 20 22 2f 22 20 72 75 6e 73 70 61 74 74 20 22  ) "/" runspatt "
80f0: 5f 22 20 28 72 61 6e 64 6f 6d 20 31 30 30 30 30  _" (random 10000
8100: 29 20 22 5f 22 20 28 63 75 72 72 65 6e 74 2d 70  ) "_" (current-p
8110: 72 6f 63 65 73 73 2d 69 64 29 29 29 0a 09 20 28  rocess-id))).. (
8120: 72 75 6e 73 68 65 61 64 65 72 20 28 61 70 70 65  runsheader (appe
8130: 6e 64 20 28 6c 69 73 74 20 22 52 75 6e 20 49 64  nd (list "Run Id
8140: 22 20 22 52 75 6e 6e 61 6d 65 22 29 20 3b 20 30  " "Runname") ; 0
8150: 20 31 0a 09 09 09 20 20 20 20 20 28 6d 61 70 20   1....     (map 
8160: 63 61 72 20 6b 65 79 70 61 74 74 2d 61 6c 69 73  car keypatt-alis
8170: 74 29 20 20 20 3b 20 2b 20 4e 20 3d 20 6c 65 6e  t)   ; + N = len
8180: 67 74 68 20 6b 65 79 70 61 74 74 2d 61 6c 69 73  gth keypatt-alis
8190: 74 0a 09 09 09 20 20 20 20 20 28 6c 69 73 74 20  t....     (list 
81a0: 22 54 65 73 74 6e 61 6d 65 22 20 20 20 20 20 20  "Testname"      
81b0: 20 20 20 20 3b 20 32 0a 09 09 09 09 20 20 20 22      ; 2.....   "
81c0: 49 74 65 6d 20 50 61 74 68 22 20 20 20 20 20 20  Item Path"      
81d0: 20 20 20 3b 20 33 20 0a 09 09 09 09 20 20 20 22     ; 3 .....   "
81e0: 44 65 73 63 72 69 70 74 69 6f 6e 22 20 20 20 20  Description"    
81f0: 20 20 20 3b 20 34 20 0a 09 09 09 09 20 20 20 22     ; 4 .....   "
8200: 53 74 61 74 65 22 20 20 20 20 20 20 20 20 20 20  State"          
8210: 20 20 20 3b 20 35 20 0a 09 09 09 09 20 20 20 22     ; 5 .....   "
8220: 53 74 61 74 75 73 22 20 20 20 20 20 20 20 20 20  Status"         
8230: 20 20 20 3b 20 36 20 20 0a 09 09 09 09 20 20 20     ; 6  .....   
8240: 22 46 69 6e 61 6c 20 4c 6f 67 22 20 20 20 20 20  "Final Log"     
8250: 20 20 20 20 3b 20 37 20 0a 09 09 09 09 20 20 20      ; 7 .....   
8260: 22 52 75 6e 20 44 75 72 61 74 69 6f 6e 22 20 20  "Run Duration"  
8270: 20 20 20 20 3b 20 38 20 0a 09 09 09 09 20 20 20      ; 8 .....   
8280: 22 57 68 65 6e 20 52 75 6e 22 20 20 20 20 20 20  "When Run"      
8290: 20 20 20 20 3b 20 39 20 0a 09 09 09 09 20 20 20      ; 9 .....   
82a0: 22 54 61 67 73 22 20 20 20 20 20 20 20 20 20 20  "Tags"          
82b0: 20 20 20 20 3b 20 31 30 0a 09 09 09 09 20 20 20      ; 10.....   
82c0: 22 52 75 6e 20 4f 77 6e 65 72 22 20 20 20 20 20  "Run Owner"     
82d0: 20 20 20 20 3b 20 31 31 0a 09 09 09 09 20 20 20      ; 11.....   
82e0: 22 43 6f 6d 6d 65 6e 74 22 20 20 20 20 20 20 20  "Comment"       
82f0: 20 20 20 20 3b 20 31 32 0a 09 09 09 09 20 20 20      ; 12.....   
8300: 22 41 75 74 68 6f 72 22 20 20 20 20 20 20 20 20  "Author"        
8310: 20 20 20 20 3b 20 31 33 0a 09 09 09 09 20 20 20      ; 13.....   
8320: 22 54 65 73 74 20 4f 77 6e 65 72 22 20 20 20 20  "Test Owner"    
8330: 20 20 20 20 3b 20 31 34 0a 09 09 09 09 20 20 20      ; 14.....   
8340: 22 52 65 76 69 65 77 65 64 22 20 20 20 20 20 20  "Reviewed"      
8350: 20 20 20 20 3b 20 31 35 0a 09 09 09 09 20 20 20      ; 15.....   
8360: 22 44 69 73 6b 66 72 65 65 22 20 20 20 20 20 20  "Diskfree"      
8370: 20 20 20 20 3b 20 31 36 0a 09 09 09 09 20 20 20      ; 16.....   
8380: 22 55 6e 61 6d 65 22 20 20 20 20 20 20 20 20 20  "Uname"         
8390: 20 20 20 20 3b 20 31 37 0a 09 09 09 09 20 20 20      ; 17.....   
83a0: 22 52 75 6e 64 69 72 22 20 20 20 20 20 20 20 20  "Rundir"        
83b0: 20 20 20 20 3b 20 31 38 0a 09 09 09 09 20 20 20      ; 18.....   
83c0: 22 48 6f 73 74 22 20 20 20 20 20 20 20 20 20 20  "Host"          
83d0: 20 20 20 20 3b 20 31 39 0a 09 09 09 09 20 20 20      ; 19.....   
83e0: 22 43 70 75 20 4c 6f 61 64 22 20 20 20 20 20 20  "Cpu Load"      
83f0: 20 20 20 20 3b 20 32 30 0a 09 09 09 09 20 20 20      ; 20.....   
8400: 29 29 29 0a 09 20 28 72 65 73 75 6c 74 73 20 28  ))).. (results (
8410: 6c 69 73 74 20 72 75 6e 73 68 65 61 64 65 72 29  list runsheader)
8420: 29 09 09 09 20 0a 09 20 28 74 65 73 74 64 61 74  )... .. (testdat
8430: 61 2d 68 65 61 64 65 72 20 28 6c 69 73 74 20 22  a-header (list "
8440: 52 75 6e 20 49 64 22 20 22 54 65 73 74 6e 61 6d  Run Id" "Testnam
8450: 65 22 20 22 49 74 65 6d 20 50 61 74 68 22 20 22  e" "Item Path" "
8460: 43 61 74 65 67 6f 72 79 22 20 22 56 61 72 69 61  Category" "Varia
8470: 62 6c 65 22 20 22 56 61 6c 75 65 22 20 22 45 78  ble" "Value" "Ex
8480: 70 65 63 74 65 64 22 20 22 54 6f 6c 22 20 22 55  pected" "Tol" "U
8490: 6e 69 74 73 22 20 22 53 74 61 74 75 73 22 20 22  nits" "Status" "
84a0: 43 6f 6d 6d 65 6e 74 22 29 29 29 0a 20 20 20 20  Comment"))).    
84b0: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 32 20 22  (debug:print 2 "
84c0: 55 73 69 6e 67 20 22 20 74 65 6d 70 64 69 72 20  Using " tempdir 
84d0: 22 20 66 6f 72 20 63 6f 6e 73 74 72 75 63 74 69  " for constructi
84e0: 6e 67 20 74 68 65 20 6f 64 73 20 66 69 6c 65 2e  ng the ods file.
84f0: 20 6b 65 79 71 72 79 3a 20 22 20 6b 65 79 71 72   keyqry: " keyqr
8500: 79 20 22 20 6b 65 79 73 74 72 3a 20 22 20 6b 65  y " keystr: " ke
8510: 79 73 73 74 72 20 22 20 77 69 74 68 20 6b 65 79  ysstr " with key
8520: 73 3a 20 22 20 28 6d 61 70 20 63 61 64 72 20 6b  s: " (map cadr k
8530: 65 79 70 61 74 74 2d 61 6c 69 73 74 29 29 0a 20  eypatt-alist)). 
8540: 20 20 20 3b 3b 20 22 45 78 70 65 63 74 65 64 20     ;; "Expected 
8550: 56 61 6c 75 65 22 0a 20 20 20 20 3b 3b 20 22 56  Value".    ;; "V
8560: 61 6c 75 65 20 46 6f 75 6e 64 22 0a 20 20 20 20  alue Found".    
8570: 3b 3b 20 22 54 6f 6c 65 72 61 6e 63 65 22 0a 20  ;; "Tolerance". 
8580: 20 20 20 28 61 70 70 6c 79 20 73 71 6c 69 74 65     (apply sqlite
8590: 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20  3:for-each-row. 
85a0: 20 20 20 20 28 6c 61 6d 62 64 61 20 28 74 65 73      (lambda (tes
85b0: 74 2d 69 64 20 2e 20 62 29 0a 20 20 20 20 20 20  t-id . b).      
85c0: 20 28 73 65 74 21 20 74 65 73 74 2d 69 64 73 20   (set! test-ids 
85d0: 28 63 6f 6e 73 20 74 65 73 74 2d 69 64 20 74 65  (cons test-id te
85e0: 73 74 2d 69 64 73 29 29 20 20 20 3b 3b 20 74 65  st-ids))   ;; te
85f0: 73 74 2d 69 64 20 69 73 20 6e 6f 77 20 74 65 73  st-id is now tes
8600: 74 6e 61 6d 65 0a 20 20 20 20 20 20 20 28 73 65  tname.       (se
8610: 74 21 20 72 65 73 75 6c 74 73 20 28 61 70 70 65  t! results (appe
8620: 6e 64 20 72 65 73 75 6c 74 73 20 3b 3b 20 6e 6f  nd results ;; no
8630: 74 65 2c 20 64 72 6f 70 20 74 68 65 20 74 65 73  te, drop the tes
8640: 74 2d 69 64 0a 09 09 09 20 20 20 20 20 28 6c 69  t-id....     (li
8650: 73 74 0a 09 09 09 20 20 20 20 20 20 28 69 66 20  st....      (if 
8660: 70 61 74 68 6d 6f 64 0a 09 09 09 09 20 20 28 6c  pathmod.....  (l
8670: 65 74 2a 20 28 28 76 62 20 20 20 20 20 20 20 20  et* ((vb        
8680: 28 61 70 70 6c 79 20 76 65 63 74 6f 72 20 62 29  (apply vector b)
8690: 29 0a 09 09 09 09 09 20 28 6b 65 79 76 61 6c 73  )...... (keyvals
86a0: 20 20 20 28 6c 65 74 20 6c 6f 6f 70 20 28 28 69     (let loop ((i
86b0: 20 20 20 20 30 29 0a 09 09 09 09 09 09 09 20 20      0)........  
86c0: 20 20 20 20 20 28 72 65 73 20 27 28 29 29 29 0a       (res '())).
86d0: 09 09 09 09 09 09 20 20 20 20 20 20 28 69 66 20  ......      (if 
86e0: 28 3e 3d 20 69 20 6e 75 6d 6b 65 79 73 29 0a 09  (>= i numkeys)..
86f0: 09 09 09 09 09 09 20 20 72 65 73 0a 09 09 09 09  ......  res.....
8700: 09 09 09 20 20 28 6c 6f 6f 70 20 28 2b 20 69 20  ...  (loop (+ i 
8710: 31 29 0a 09 09 09 09 09 09 09 09 28 61 70 70 65  1).........(appe
8720: 6e 64 20 72 65 73 20 28 6c 69 73 74 20 28 76 65  nd res (list (ve
8730: 63 74 6f 72 2d 72 65 66 20 76 62 20 28 2b 20 69  ctor-ref vb (+ i
8740: 20 32 29 29 29 29 29 29 29 29 0a 09 09 09 09 09   2))))))))......
8750: 20 28 72 75 6e 6e 61 6d 65 20 20 20 28 76 65 63   (runname   (vec
8760: 74 6f 72 2d 72 65 66 20 76 62 20 31 29 29 0a 09  tor-ref vb 1))..
8770: 09 09 09 09 20 28 74 65 73 74 6e 61 6d 65 20 20  .... (testname  
8780: 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62 20 28  (vector-ref vb (
8790: 2b 20 20 32 20 6e 75 6d 6b 65 79 73 29 29 29 0a  +  2 numkeys))).
87a0: 09 09 09 09 09 20 28 69 74 65 6d 2d 70 61 74 68  ..... (item-path
87b0: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62 20   (vector-ref vb 
87c0: 28 2b 20 20 33 20 6e 75 6d 6b 65 79 73 29 29 29  (+  3 numkeys)))
87d0: 0a 09 09 09 09 09 20 28 66 69 6e 61 6c 2d 6c 6f  ...... (final-lo
87e0: 67 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62  g (vector-ref vb
87f0: 20 28 2b 20 20 37 20 6e 75 6d 6b 65 79 73 29 29   (+  7 numkeys))
8800: 29 0a 09 09 09 09 09 20 28 72 75 6e 2d 64 69 72  )...... (run-dir
8810: 20 20 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76     (vector-ref v
8820: 62 20 28 2b 20 31 38 20 6e 75 6d 6b 65 79 73 29  b (+ 18 numkeys)
8830: 29 29 0a 09 09 09 09 09 20 28 6c 6f 67 2d 66 70  ))...... (log-fp
8840: 61 74 68 20 28 63 6f 6e 63 20 72 75 6e 2d 64 69  ath (conc run-di
8850: 72 20 22 2f 22 20 20 66 69 6e 61 6c 2d 6c 6f 67  r "/"  final-log
8860: 29 29 29 20 3b 3b 20 28 73 74 72 69 6e 67 2d 69  ))) ;; (string-i
8870: 6e 74 65 72 73 70 65 72 73 65 20 6b 65 79 76 61  ntersperse keyva
8880: 6c 73 20 22 2f 22 29 20 22 2f 22 20 74 65 73 74  ls "/") "/" test
8890: 6e 61 6d 65 20 22 2f 22 20 69 74 65 6d 2d 70 61  name "/" item-pa
88a0: 74 68 20 22 2f 22 0a 09 09 09 09 20 20 20 20 28  th "/".....    (
88b0: 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22 6c  debug:print 4 "l
88c0: 6f 67 3a 20 22 20 6c 6f 67 2d 66 70 61 74 68 20  og: " log-fpath 
88d0: 22 20 65 78 69 73 74 73 3a 20 22 20 28 66 69 6c  " exists: " (fil
88e0: 65 2d 65 78 69 73 74 73 3f 20 6c 6f 67 2d 66 70  e-exists? log-fp
88f0: 61 74 68 29 29 0a 09 09 09 09 20 20 20 20 28 76  ath)).....    (v
8900: 65 63 74 6f 72 2d 73 65 74 21 20 76 62 20 28 2b  ector-set! vb (+
8910: 20 37 20 6e 75 6d 6b 65 79 73 29 20 28 69 66 20   7 numkeys) (if 
8920: 28 66 69 6c 65 2d 65 78 69 73 74 73 3f 20 6c 6f  (file-exists? lo
8930: 67 2d 66 70 61 74 68 29 0a 09 09 09 09 09 09 09  g-fpath)........
8940: 09 20 20 20 20 20 20 28 6c 65 74 20 28 28 6e 65  .      (let ((ne
8950: 77 70 61 74 68 20 28 63 6f 6e 63 20 70 61 74 68  wpath (conc path
8960: 6d 6f 64 20 22 2f 22 0a 09 09 09 09 09 09 09 09  mod "/".........
8970: 09 09 09 20 20 20 28 73 74 72 69 6e 67 2d 69 6e  ...   (string-in
8980: 74 65 72 73 70 65 72 73 65 20 6b 65 79 76 61 6c  tersperse keyval
8990: 73 20 22 2f 22 29 0a 09 09 09 09 09 09 09 09 09  s "/")..........
89a0: 09 09 20 20 20 22 2f 22 20 72 75 6e 6e 61 6d 65  ..   "/" runname
89b0: 20 22 2f 22 20 74 65 73 74 6e 61 6d 65 20 22 2f   "/" testname "/
89c0: 22 0a 09 09 09 09 09 09 09 09 09 09 09 20 20 20  "............   
89d0: 28 69 66 20 28 73 74 72 69 6e 67 3d 3f 20 69 74  (if (string=? it
89e0: 65 6d 2d 70 61 74 68 20 22 22 29 20 22 22 20 28  em-path "") "" (
89f0: 63 6f 6e 63 20 22 2f 22 20 69 74 65 6d 2d 70 61  conc "/" item-pa
8a00: 74 68 29 29 0a 09 09 09 09 09 09 09 09 09 09 09  th))............
8a10: 20 20 20 66 69 6e 61 6c 2d 6c 6f 67 29 29 29 0a     final-log))).
8a20: 09 09 09 09 09 09 09 09 09 3b 3b 20 66 6f 72 20  .........;; for 
8a30: 6e 6f 77 20 74 68 72 6f 77 20 61 77 61 79 20 6e  now throw away n
8a40: 65 77 70 61 74 68 20 61 6e 64 20 75 73 65 20 74  ewpath and use t
8a50: 68 65 20 6c 6f 67 2d 66 70 61 74 68 20 63 6f 6e  he log-fpath con
8a60: 63 27 64 20 77 69 74 68 20 70 61 74 68 6d 6f 64  c'd with pathmod
8a70: 0a 09 09 09 09 09 09 09 09 09 28 73 65 74 21 20  ..........(set! 
8a80: 6e 65 77 70 61 74 68 20 28 63 6f 6e 63 20 70 61  newpath (conc pa
8a90: 74 68 6d 6f 64 20 6c 6f 67 2d 66 70 61 74 68 29  thmod log-fpath)
8aa0: 29 0a 09 09 09 09 09 09 09 09 09 28 69 66 20 77  )..........(if w
8ab0: 69 6e 64 6f 77 73 20 28 73 74 72 69 6e 67 2d 74  indows (string-t
8ac0: 72 61 6e 73 6c 61 74 65 20 6e 65 77 70 61 74 68  ranslate newpath
8ad0: 20 22 2f 22 20 22 5c 5c 22 29 20 6e 65 77 70 61   "/" "\\") newpa
8ae0: 74 68 29 29 0a 09 09 09 09 09 09 09 09 20 20 20  th)).........   
8af0: 20 20 20 28 69 66 20 28 3e 20 2a 76 65 72 62 6f     (if (> *verbo
8b00: 73 69 74 79 2a 20 31 29 0a 09 09 09 09 09 09 09  sity* 1)........
8b10: 09 09 20 20 28 63 6f 6e 63 20 66 69 6e 61 6c 2d  ..  (conc final-
8b20: 6c 6f 67 20 22 20 6e 6f 74 2d 66 6f 75 6e 64 22  log " not-found"
8b30: 29 0a 09 09 09 09 09 09 09 09 09 20 20 22 22 29  )..........  "")
8b40: 29 29 0a 09 09 09 09 20 20 20 20 28 76 65 63 74  )).....    (vect
8b50: 6f 72 2d 3e 6c 69 73 74 20 76 62 29 29 0a 09 09  or->list vb))...
8b60: 09 09 20 20 62 29 29 29 29 29 0a 20 20 20 20 20  ..  b))))).     
8b70: 64 62 0a 20 20 20 20 20 28 63 6f 6e 63 20 22 53  db.     (conc "S
8b80: 45 4c 45 43 54 0a 20 20 20 20 20 20 20 20 20 20  ELECT.          
8b90: 20 20 20 20 74 2e 74 65 73 74 6e 61 6d 65 2c 72      t.testname,r
8ba0: 2e 69 64 2c 72 75 6e 6e 61 6d 65 2c 22 20 6b 65  .id,runname," ke
8bb0: 79 73 73 74 72 20 22 2c 74 2e 74 65 73 74 6e 61  ysstr ",t.testna
8bc0: 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
8bd0: 20 20 74 2e 69 74 65 6d 5f 70 61 74 68 2c 74 6d    t.item_path,tm
8be0: 2e 64 65 73 63 72 69 70 74 69 6f 6e 2c 74 2e 73  .description,t.s
8bf0: 74 61 74 65 2c 74 2e 73 74 61 74 75 73 2c 0a 20  tate,t.status,. 
8c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6e               fin
8c10: 61 6c 5f 6c 6f 67 66 2c 72 75 6e 5f 64 75 72 61  al_logf,run_dura
8c20: 74 69 6f 6e 2c 20 0a 20 20 20 20 20 20 20 20 20  tion, .         
8c30: 20 20 20 20 20 73 74 72 66 74 69 6d 65 28 27 25       strftime('%
8c40: 6d 2f 25 64 2f 25 59 20 25 48 3a 25 4d 3a 25 53  m/%d/%Y %H:%M:%S
8c50: 27 2c 64 61 74 65 74 69 6d 65 28 74 2e 65 76 65  ',datetime(t.eve
8c60: 6e 74 5f 74 69 6d 65 2c 27 75 6e 69 78 65 70 6f  nt_time,'unixepo
8c70: 63 68 27 29 2c 27 6c 6f 63 61 6c 74 69 6d 65 27  ch'),'localtime'
8c80: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
8c90: 20 74 6d 2e 74 61 67 73 2c 72 2e 6f 77 6e 65 72   tm.tags,r.owner
8ca0: 2c 74 2e 63 6f 6d 6d 65 6e 74 2c 0a 20 20 20 20  ,t.comment,.    
8cb0: 20 20 20 20 20 20 20 20 20 20 61 75 74 68 6f 72            author
8cc0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
8cd0: 74 6d 2e 6f 77 6e 65 72 2c 72 65 76 69 65 77 65  tm.owner,reviewe
8ce0: 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d,.             
8cf0: 20 64 69 73 6b 66 72 65 65 2c 75 6e 61 6d 65 2c   diskfree,uname,
8d00: 72 75 6e 64 69 72 2c 0a 20 20 20 20 20 20 20 20  rundir,.        
8d10: 20 20 20 20 20 20 68 6f 73 74 2c 63 70 75 6c 6f        host,cpulo
8d20: 61 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 46  ad.            F
8d30: 52 4f 4d 20 74 65 73 74 73 20 41 53 20 74 20 49  ROM tests AS t I
8d40: 4e 4e 45 52 20 4a 4f 49 4e 20 72 75 6e 73 20 41  NNER JOIN runs A
8d50: 53 20 72 20 4f 4e 20 74 2e 72 75 6e 5f 69 64 3d  S r ON t.run_id=
8d60: 72 2e 69 64 20 49 4e 4e 45 52 20 4a 4f 49 4e 20  r.id INNER JOIN 
8d70: 74 65 73 74 5f 6d 65 74 61 20 41 53 20 74 6d 20  test_meta AS tm 
8d80: 4f 4e 20 74 6d 2e 74 65 73 74 6e 61 6d 65 3d 74  ON tm.testname=t
8d90: 2e 74 65 73 74 6e 61 6d 65 0a 20 20 20 20 20 20  .testname.      
8da0: 20 20 20 20 20 20 57 48 45 52 45 20 72 75 6e 6e        WHERE runn
8db0: 61 6d 65 20 4c 49 4b 45 20 3f 20 41 4e 44 20 22  ame LIKE ? AND "
8dc0: 20 6b 65 79 71 72 79 20 22 3b 22 29 0a 20 20 20   keyqry ";").   
8dd0: 20 20 72 75 6e 73 70 61 74 74 20 28 6d 61 70 20    runspatt (map 
8de0: 63 61 64 72 20 6b 65 79 70 61 74 74 2d 61 6c 69  cadr keypatt-ali
8df0: 73 74 29 29 0a 20 20 20 20 28 73 65 74 21 20 72  st)).    (set! r
8e00: 65 73 75 6c 74 73 20 28 6c 69 73 74 20 28 63 6f  esults (list (co
8e10: 6e 73 20 22 52 75 6e 73 22 20 72 65 73 75 6c 74  ns "Runs" result
8e20: 73 29 29 29 0a 20 20 20 20 3b 3b 20 6e 6f 77 2c  s))).    ;; now,
8e30: 20 66 6f 72 20 65 61 63 68 20 74 65 73 74 2c 20   for each test, 
8e40: 63 6f 6c 6c 65 63 74 20 74 68 65 20 74 65 73 74  collect the test
8e50: 5f 64 61 74 61 20 69 6e 66 6f 20 61 6e 64 20 61  _data info and a
8e60: 64 64 20 61 20 6e 65 77 20 73 68 65 65 74 0a 20  dd a new sheet. 
8e70: 20 20 20 28 66 6f 72 2d 65 61 63 68 0a 20 20 20     (for-each.   
8e80: 20 20 28 6c 61 6d 62 64 61 20 28 74 65 73 74 2d    (lambda (test-
8e90: 69 64 29 0a 20 20 20 20 20 20 20 28 6c 65 74 20  id).       (let 
8ea0: 28 28 74 65 73 74 2d 64 61 74 61 20 28 6c 69 73  ((test-data (lis
8eb0: 74 20 74 65 73 74 64 61 74 61 2d 68 65 61 64 65  t testdata-heade
8ec0: 72 29 29 0a 09 20 20 20 20 20 28 63 75 72 72 2d  r))..     (curr-
8ed0: 74 65 73 74 2d 6e 61 6d 65 20 23 66 29 29 0a 09  test-name #f))..
8ee0: 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61   (sqlite3:for-ea
8ef0: 63 68 2d 72 6f 77 0a 09 20 20 28 6c 61 6d 62 64  ch-row..  (lambd
8f00: 61 20 28 72 75 6e 2d 69 64 20 74 65 73 74 6e 61  a (run-id testna
8f10: 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 63 61 74  me item-path cat
8f20: 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65 20 76  egory variable v
8f30: 61 6c 75 65 20 65 78 70 65 63 74 65 64 20 74 6f  alue expected to
8f40: 6c 20 75 6e 69 74 73 20 73 74 61 74 75 73 20 63  l units status c
8f50: 6f 6d 6d 65 6e 74 29 0a 09 20 20 20 20 28 73 65  omment)..    (se
8f60: 74 21 20 63 75 72 72 2d 74 65 73 74 2d 6e 61 6d  t! curr-test-nam
8f70: 65 20 74 65 73 74 6e 61 6d 65 29 0a 09 20 20 20  e testname)..   
8f80: 20 28 73 65 74 21 20 74 65 73 74 2d 64 61 74 61   (set! test-data
8f90: 20 28 61 70 70 65 6e 64 20 74 65 73 74 2d 64 61   (append test-da
8fa0: 74 61 20 28 6c 69 73 74 20 28 6c 69 73 74 20 72  ta (list (list r
8fb0: 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 69  un-id testname i
8fc0: 74 65 6d 2d 70 61 74 68 20 63 61 74 65 67 6f 72  tem-path categor
8fd0: 79 20 76 61 72 69 61 62 6c 65 20 76 61 6c 75 65  y variable value
8fe0: 20 65 78 70 65 63 74 65 64 20 74 6f 6c 20 75 6e   expected tol un
8ff0: 69 74 73 20 73 74 61 74 75 73 20 63 6f 6d 6d 65  its status comme
9000: 6e 74 29 29 29 29 29 0a 09 20 20 64 62 20 0a 09  nt)))))..  db ..
9010: 20 20 3b 3b 20 22 53 45 4c 45 43 54 20 72 75 6e    ;; "SELECT run
9020: 5f 69 64 2c 74 65 73 74 6e 61 6d 65 2c 69 74 65  _id,testname,ite
9030: 6d 5f 70 61 74 68 2c 63 61 74 65 67 6f 72 79 2c  m_path,category,
9040: 76 61 72 69 61 62 6c 65 2c 74 64 2e 76 61 6c 75  variable,td.valu
9050: 65 20 41 53 20 76 61 6c 75 65 2c 65 78 70 65 63  e AS value,expec
9060: 74 65 64 2c 74 6f 6c 2c 75 6e 69 74 73 2c 74 64  ted,tol,units,td
9070: 2e 73 74 61 74 75 73 20 41 53 20 73 74 61 74 75  .status AS statu
9080: 73 2c 74 64 2e 63 6f 6d 6d 65 6e 74 20 41 53 20  s,td.comment AS 
9090: 63 6f 6d 6d 65 6e 74 20 46 52 4f 4d 20 74 65 73  comment FROM tes
90a0: 74 5f 64 61 74 61 20 41 53 20 74 64 20 49 4e 4e  t_data AS td INN
90b0: 45 52 20 4a 4f 49 4e 20 74 65 73 74 73 20 4f 4e  ER JOIN tests ON
90c0: 20 74 65 73 74 73 2e 69 64 3d 74 64 2e 74 65 73   tests.id=td.tes
90d0: 74 5f 69 64 20 57 48 45 52 45 20 74 65 73 74 5f  t_id WHERE test_
90e0: 69 64 3d 3f 3b 22 0a 09 20 20 22 53 45 4c 45 43  id=?;"..  "SELEC
90f0: 54 20 72 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d  T run_id,testnam
9100: 65 2c 69 74 65 6d 5f 70 61 74 68 2c 63 61 74 65  e,item_path,cate
9110: 67 6f 72 79 2c 76 61 72 69 61 62 6c 65 2c 74 64  gory,variable,td
9120: 2e 76 61 6c 75 65 20 41 53 20 76 61 6c 75 65 2c  .value AS value,
9130: 74 64 2e 65 78 70 65 63 74 65 64 2c 74 64 2e 74  td.expected,td.t
9140: 6f 6c 2c 74 64 2e 75 6e 69 74 73 2c 74 64 2e 73  ol,td.units,td.s
9150: 74 61 74 75 73 20 41 53 20 73 74 61 74 75 73 2c  tatus AS status,
9160: 74 64 2e 63 6f 6d 6d 65 6e 74 20 41 53 20 63 6f  td.comment AS co
9170: 6d 6d 65 6e 74 20 46 52 4f 4d 20 74 65 73 74 5f  mment FROM test_
9180: 64 61 74 61 20 41 53 20 74 64 20 49 4e 4e 45 52  data AS td INNER
9190: 20 4a 4f 49 4e 20 74 65 73 74 73 20 4f 4e 20 74   JOIN tests ON t
91a0: 65 73 74 73 2e 69 64 3d 74 64 2e 74 65 73 74 5f  ests.id=td.test_
91b0: 69 64 20 57 48 45 52 45 20 74 65 73 74 6e 61 6d  id WHERE testnam
91c0: 65 3d 3f 3b 22 0a 09 20 20 74 65 73 74 2d 69 64  e=?;"..  test-id
91d0: 29 0a 09 20 28 69 66 20 63 75 72 72 2d 74 65 73  ).. (if curr-tes
91e0: 74 2d 6e 61 6d 65 0a 09 20 20 20 20 20 28 73 65  t-name..     (se
91f0: 74 21 20 72 65 73 75 6c 74 73 20 28 61 70 70 65  t! results (appe
9200: 6e 64 20 72 65 73 75 6c 74 73 20 28 6c 69 73 74  nd results (list
9210: 20 28 63 6f 6e 73 20 63 75 72 72 2d 74 65 73 74   (cons curr-test
9220: 2d 6e 61 6d 65 20 74 65 73 74 2d 64 61 74 61 29  -name test-data)
9230: 29 29 29 29 0a 09 20 29 29 0a 20 20 20 20 20 28  )))).. )).     (
9240: 73 6f 72 74 20 28 64 65 6c 65 74 65 2d 64 75 70  sort (delete-dup
9250: 6c 69 63 61 74 65 73 20 74 65 73 74 2d 69 64 73  licates test-ids
9260: 29 20 73 74 72 69 6e 67 3c 3d 29 29 0a 20 20 20  ) string<=)).   
9270: 20 28 73 79 73 74 65 6d 20 28 63 6f 6e 63 20 22   (system (conc "
9280: 6d 6b 64 69 72 20 2d 70 20 22 20 74 65 6d 70 64  mkdir -p " tempd
9290: 69 72 29 29 0a 20 20 20 20 3b 3b 20 28 70 70 20  ir)).    ;; (pp 
92a0: 72 65 73 75 6c 74 73 29 0a 20 20 20 20 28 6f 64  results).    (od
92b0: 73 3a 6c 69 73 74 2d 3e 6f 64 73 20 0a 20 20 20  s:list->ods .   
92c0: 20 20 74 65 6d 70 64 69 72 0a 20 20 20 20 20 28    tempdir.     (
92d0: 69 66 20 28 73 74 72 69 6e 67 2d 6d 61 74 63 68  if (string-match
92e0: 20 28 72 65 67 65 78 70 20 22 5e 5b 2f 7e 5d 2b   (regexp "^[/~]+
92f0: 2e 2a 22 29 20 6f 75 74 70 75 74 66 69 6c 65 29  .*") outputfile)
9300: 20 3b 3b 20 66 75 6c 6c 20 70 61 74 68 3f 0a 09   ;; full path?..
9310: 20 6f 75 74 70 75 74 66 69 6c 65 0a 09 20 28 62   outputfile.. (b
9320: 65 67 69 6e 0a 09 20 20 20 28 64 65 62 75 67 3a  egin..   (debug:
9330: 70 72 69 6e 74 20 30 20 22 57 41 52 4e 49 4e 47  print 0 "WARNING
9340: 3a 20 70 61 74 68 20 67 69 76 65 6e 2c 20 22 20  : path given, " 
9350: 6f 75 74 70 75 74 66 69 6c 65 20 22 20 69 73 20  outputfile " is 
9360: 72 65 6c 61 74 69 76 65 2c 20 70 72 65 66 69 78  relative, prefix
9370: 69 6e 67 20 77 69 74 68 20 63 75 72 72 65 6e 74  ing with current
9380: 20 64 69 72 65 63 74 6f 72 79 22 29 0a 09 20 20   directory")..  
9390: 20 28 63 6f 6e 63 20 28 63 75 72 72 65 6e 74 2d   (conc (current-
93a0: 64 69 72 65 63 74 6f 72 79 29 20 22 2f 22 20 6f  directory) "/" o
93b0: 75 74 70 75 74 66 69 6c 65 29 29 29 0a 20 20 20  utputfile))).   
93c0: 20 20 72 65 73 75 6c 74 73 29 29 29 0a 0a 3b 3b    results)))..;;
93d0: 20 28 64 62 3a 65 78 74 72 61 63 74 2d 6f 64 73   (db:extract-ods
93e0: 2d 66 69 6c 65 20 64 62 20 22 6f 75 74 70 75 74  -file db "output
93f0: 66 69 6c 65 2e 6f 64 73 22 20 27 28 28 22 73 79  file.ods" '(("sy
9400: 73 6e 61 6d 65 22 20 22 25 22 29 28 22 66 73 6e  sname" "%")("fsn
9410: 61 6d 65 22 20 22 25 22 29 28 22 64 61 74 61 70  ame" "%")("datap
9420: 61 74 68 22 20 22 25 22 29 29 20 22 25 22 29 0a  ath" "%")) "%").