Megatest

Hex Artifact Content
Login

Artifact 65214cf6f39701d40460b76a81cd41b368dc518d:


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 0a 20 20  EFAULT 'n/a',.  
27e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f0: 20 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e 53              CONS
2800: 54 52 41 49 4e 54 20 74 65 73 74 5f 64 61 74 61  TRAINT test_data
2810: 20 55 4e 49 51 55 45 20 28 74 65 73 74 5f 69 64   UNIQUE (test_id
2820: 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62  ,category,variab
2830: 6c 65 29 29 3b 22 29 0a 20 20 20 20 20 20 20 28  le));").       (
2840: 70 72 69 6e 74 20 22 57 41 52 4e 49 4e 47 3a 20  print "WARNING: 
2850: 54 61 62 6c 65 20 74 65 73 74 5f 64 61 74 61 20  Table test_data 
2860: 61 6e 64 20 74 65 73 74 5f 6d 65 74 61 20 77 68  and test_meta wh
2870: 65 72 65 20 72 65 63 72 65 61 74 65 64 2e 20 50  ere recreated. P
2880: 6c 65 61 73 65 20 64 6f 20 6d 65 67 61 74 65 73  lease do megates
2890: 74 20 2d 75 70 64 61 74 65 2d 6d 65 74 61 22 29  t -update-meta")
28a0: 0a 20 20 20 20 20 20 20 28 70 61 74 63 68 2d 64  .       (patch-d
28b0: 62 29 29 0a 20 20 20 20 20 20 28 28 3c 20 6d 76  b)).      ((< mv
28c0: 65 72 20 31 2e 32 37 29 0a 20 20 20 20 20 20 20  er 1.27).       
28d0: 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22  (db:set-var db "
28e0: 4d 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e  MEGATEST_VERSION
28f0: 22 20 31 2e 32 37 29 0a 20 20 20 20 20 20 20 28  " 1.27).       (
2900: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
2910: 64 62 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20  db "ALTER TABLE 
2920: 74 65 73 74 5f 64 61 74 61 20 41 44 44 20 43 4f  test_data ADD CO
2930: 4c 55 4d 4e 20 74 79 70 65 20 54 45 58 54 20 44  LUMN type TEXT D
2940: 45 46 41 55 4c 54 20 27 27 3b 22 29 0a 20 20 20  EFAULT '';").   
2950: 20 20 20 20 28 70 61 74 63 68 2d 64 62 29 29 0a      (patch-db)).
2960: 20 20 20 20 20 20 28 28 3c 20 6d 76 65 72 20 31        ((< mver 1
2970: 2e 32 39 29 0a 20 20 20 20 20 20 20 28 64 62 3a  .29).       (db:
2980: 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41  set-var db "MEGA
2990: 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e  TEST_VERSION" 1.
29a0: 32 39 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69  29).       (sqli
29b0: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22  te3:execute db "
29c0: 41 4c 54 45 52 20 54 41 42 4c 45 20 74 65 73 74  ALTER TABLE test
29d0: 5f 73 74 65 70 73 20 41 44 44 20 43 4f 4c 55 4d  _steps ADD COLUM
29e0: 4e 20 6c 6f 67 66 69 6c 65 20 54 45 58 54 20 44  N logfile TEXT D
29f0: 45 46 41 55 4c 54 20 27 27 3b 22 29 0a 20 20 20  EFAULT '';").   
2a00: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65      (sqlite3:exe
2a10: 63 75 74 65 20 64 62 20 22 41 4c 54 45 52 20 54  cute db "ALTER T
2a20: 41 42 4c 45 20 74 65 73 74 73 20 41 44 44 20 43  ABLE tests ADD C
2a30: 4f 4c 55 4d 4e 20 73 68 6f 72 74 64 69 72 20 54  OLUMN shortdir T
2a40: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 3b 22  EXT DEFAULT '';"
2a50: 29 29 0a 20 20 20 20 20 20 28 28 3c 20 6d 76 65  )).      ((< mve
2a60: 72 20 6d 65 67 61 74 65 73 74 2d 76 65 72 73 69  r megatest-versi
2a70: 6f 6e 29 0a 20 20 20 20 20 20 20 28 64 62 3a 73  on).       (db:s
2a80: 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54  et-var db "MEGAT
2a90: 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 6d 65 67  EST_VERSION" meg
2aa0: 61 74 65 73 74 2d 76 65 72 73 69 6f 6e 29 29 29  atest-version)))
2ab0: 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d  )))..;;=========
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 3d 3d 3d 0a 3b 3b  =============.;;
2b00: 20 6d 65 74 61 20 67 65 74 20 61 6e 64 20 73 65   meta get and se
2b10: 74 20 76 61 72 73 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d  t vars.;;=======
2b20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2b30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2b40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2b50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a  ===============.
2b60: 0a 3b 3b 20 72 65 74 75 72 6e 73 20 6e 75 6d 62  .;; returns numb
2b70: 65 72 20 69 66 20 73 74 72 69 6e 67 2d 3e 6e 75  er if string->nu
2b80: 6d 62 65 72 20 69 73 20 73 75 63 63 65 73 73 66  mber is successf
2b90: 75 6c 2c 20 73 74 72 69 6e 67 20 6f 74 68 65 72  ul, string other
2ba0: 77 69 73 65 0a 28 64 65 66 69 6e 65 20 28 64 62  wise.(define (db
2bb0: 3a 67 65 74 2d 76 61 72 20 64 62 20 76 61 72 29  :get-var db var)
2bc0: 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20 23 66  .  (let ((res #f
2bd0: 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a  )).    (sqlite3:
2be0: 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20  for-each-row.   
2bf0: 20 20 28 6c 61 6d 62 64 61 20 28 76 61 6c 29 0a    (lambda (val).
2c00: 20 20 20 20 20 20 20 28 73 65 74 21 20 72 65 73         (set! res
2c10: 20 76 61 6c 29 29 0a 20 20 20 20 20 64 62 20 22   val)).     db "
2c20: 53 45 4c 45 43 54 20 76 61 6c 20 46 52 4f 4d 20  SELECT val FROM 
2c30: 6d 65 74 61 64 61 74 20 57 48 45 52 45 20 76 61  metadat WHERE va
2c40: 72 3d 3f 3b 22 20 76 61 72 29 0a 20 20 20 20 28  r=?;" var).    (
2c50: 69 66 20 28 73 74 72 69 6e 67 3f 20 72 65 73 29  if (string? res)
2c60: 0a 09 28 6c 65 74 20 28 28 76 61 6c 6e 75 6d 20  ..(let ((valnum 
2c70: 28 73 74 72 69 6e 67 2d 3e 6e 75 6d 62 65 72 20  (string->number 
2c80: 72 65 73 29 29 29 0a 09 20 20 28 69 66 20 76 61  res)))..  (if va
2c90: 6c 6e 75 6d 20 76 61 6c 6e 75 6d 20 72 65 73 29  lnum valnum res)
2ca0: 29 0a 09 72 65 73 29 29 29 0a 0a 28 64 65 66 69  )..res)))..(defi
2cb0: 6e 65 20 28 64 62 3a 73 65 74 2d 76 61 72 20 64  ne (db:set-var d
2cc0: 62 20 76 61 72 20 76 61 6c 29 0a 20 20 28 73 71  b var val).  (sq
2cd0: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62  lite3:execute db
2ce0: 20 22 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c   "INSERT OR REPL
2cf0: 41 43 45 20 49 4e 54 4f 20 6d 65 74 61 64 61 74  ACE INTO metadat
2d00: 20 28 76 61 72 2c 76 61 6c 29 20 56 41 4c 55 45   (var,val) VALUE
2d10: 53 20 28 3f 2c 3f 29 3b 22 20 76 61 72 20 76 61  S (?,?);" var va
2d20: 6c 29 29 0a 0a 3b 3b 20 75 73 65 20 61 20 67 6c  l))..;; use a gl
2d30: 6f 62 61 6c 20 66 6f 72 20 73 6f 6d 65 20 70 72  obal for some pr
2d40: 69 6d 69 74 69 76 65 20 63 61 63 68 69 6e 67 2c  imitive caching,
2d50: 20 69 74 20 69 73 20 6a 75 73 74 20 73 69 6c 6c   it is just sill
2d60: 79 20 74 6f 20 72 65 2d 72 65 61 64 20 74 68 65  y to re-read the
2d70: 20 64 62 20 0a 3b 3b 20 6f 76 65 72 20 61 6e 64   db .;; over and
2d80: 20 6f 76 65 72 20 61 67 61 69 6e 20 66 6f 72 20   over again for 
2d90: 74 68 65 20 6b 65 79 73 20 73 69 6e 63 65 20 74  the keys since t
2da0: 68 65 79 20 6e 65 76 65 72 20 63 68 61 6e 67 65  hey never change
2db0: 0a 0a 28 64 65 66 69 6e 65 20 2a 64 62 2d 6b 65  ..(define *db-ke
2dc0: 79 73 2a 20 23 66 29 0a 0a 28 64 65 66 69 6e 65  ys* #f)..(define
2dd0: 20 28 64 62 2d 67 65 74 2d 6b 65 79 73 20 64 62   (db-get-keys db
2de0: 29 0a 20 20 28 69 66 20 2a 64 62 2d 6b 65 79 73  ).  (if *db-keys
2df0: 2a 20 2a 64 62 2d 6b 65 79 73 2a 20 0a 20 20 20  * *db-keys* .   
2e00: 20 20 20 28 6c 65 74 20 28 28 72 65 73 20 27 28     (let ((res '(
2e10: 29 29 29 0a 09 28 73 71 6c 69 74 65 33 3a 66 6f  )))..(sqlite3:fo
2e20: 72 2d 65 61 63 68 2d 72 6f 77 20 0a 09 20 28 6c  r-each-row .. (l
2e30: 61 6d 62 64 61 20 28 6b 65 79 20 6b 65 79 74 79  ambda (key keyty
2e40: 70 65 29 0a 09 20 20 20 28 73 65 74 21 20 72 65  pe)..   (set! re
2e50: 73 20 28 63 6f 6e 73 20 28 76 65 63 74 6f 72 20  s (cons (vector 
2e60: 6b 65 79 20 6b 65 79 74 79 70 65 29 20 72 65 73  key keytype) res
2e70: 29 29 29 0a 09 20 64 62 0a 09 20 22 53 45 4c 45  ))).. db.. "SELE
2e80: 43 54 20 66 69 65 6c 64 6e 61 6d 65 2c 66 69 65  CT fieldname,fie
2e90: 6c 64 74 79 70 65 20 46 52 4f 4d 20 6b 65 79 73  ldtype FROM keys
2ea0: 20 4f 52 44 45 52 20 42 59 20 69 64 20 44 45 53   ORDER BY id DES
2eb0: 43 3b 22 29 0a 09 28 73 65 74 21 20 2a 64 62 2d  C;")..(set! *db-
2ec0: 6b 65 79 73 2a 20 72 65 73 29 0a 09 72 65 73 29  keys* res)..res)
2ed0: 29 29 0a 0a 28 64 65 66 69 6e 65 20 64 62 3a 67  ))..(define db:g
2ee0: 65 74 2d 6b 65 79 73 20 64 62 2d 67 65 74 2d 6b  et-keys db-get-k
2ef0: 65 79 73 29 0a 0a 28 64 65 66 69 6e 65 20 28 64  eys)..(define (d
2f00: 62 3a 67 65 74 2d 76 61 6c 75 65 2d 62 79 2d 68  b:get-value-by-h
2f10: 65 61 64 65 72 20 72 6f 77 20 68 65 61 64 65 72  eader row header
2f20: 20 66 69 65 6c 64 29 0a 20 20 3b 3b 20 28 64 65   field).  ;; (de
2f30: 62 75 67 3a 70 72 69 6e 74 20 32 20 22 64 62 3a  bug:print 2 "db:
2f40: 67 65 74 2d 76 61 6c 75 65 2d 62 79 2d 68 65 61  get-value-by-hea
2f50: 64 65 72 20 72 6f 77 3a 20 22 20 72 6f 77 20 22  der row: " row "
2f60: 20 68 65 61 64 65 72 3a 20 22 20 68 65 61 64 65   header: " heade
2f70: 72 20 22 20 66 69 65 6c 64 3a 20 22 20 66 69 65  r " field: " fie
2f80: 6c 64 29 0a 20 20 28 69 66 20 28 6e 75 6c 6c 3f  ld).  (if (null?
2f90: 20 68 65 61 64 65 72 29 20 23 66 0a 20 20 20 20   header) #f.    
2fa0: 20 20 28 6c 65 74 20 6c 6f 6f 70 20 28 28 68 65    (let loop ((he
2fb0: 64 20 28 63 61 72 20 68 65 61 64 65 72 29 29 0a  d (car header)).
2fc0: 09 09 20 28 74 61 6c 20 28 63 64 72 20 68 65 61  .. (tal (cdr hea
2fd0: 64 65 72 29 29 0a 09 09 20 28 6e 20 20 20 30 29  der))... (n   0)
2fe0: 29 0a 09 28 69 66 20 28 65 71 75 61 6c 3f 20 68  )..(if (equal? h
2ff0: 65 64 20 66 69 65 6c 64 29 0a 09 20 20 20 20 28  ed field)..    (
3000: 76 65 63 74 6f 72 2d 72 65 66 20 72 6f 77 20 6e  vector-ref row n
3010: 29 0a 09 20 20 20 20 28 69 66 20 28 6e 75 6c 6c  )..    (if (null
3020: 3f 20 74 61 6c 29 20 23 66 20 28 6c 6f 6f 70 20  ? tal) #f (loop 
3030: 28 63 61 72 20 74 61 6c 29 28 63 64 72 20 74 61  (car tal)(cdr ta
3040: 6c 29 28 2b 20 6e 20 31 29 29 29 29 29 29 29 0a  l)(+ n 1))))))).
3050: 09 20 20 20 20 0a 3b 3b 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 3d 3d  ================
3090: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b  ==============.;
30a0: 3b 20 20 52 20 55 20 4e 20 53 0a 3b 3b 3d 3d 3d  ;  R U N S.;;===
30b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
30c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
30d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
30e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
30f0: 3d 3d 3d 0a 0a 28 64 65 66 69 6e 65 20 28 72 75  ===..(define (ru
3100: 6e 73 3a 67 65 74 2d 73 74 64 2d 72 75 6e 2d 66  ns:get-std-run-f
3110: 69 65 6c 64 73 20 6b 65 79 73 20 72 65 6d 66 69  ields keys remfi
3120: 65 6c 64 73 29 0a 20 20 28 6c 65 74 2a 20 28 28  elds).  (let* ((
3130: 68 65 61 64 65 72 20 20 20 20 28 61 70 70 65 6e  header    (appen
3140: 64 20 28 6d 61 70 20 6b 65 79 3a 67 65 74 2d 66  d (map key:get-f
3150: 69 65 6c 64 6e 61 6d 65 20 6b 65 79 73 29 0a 09  ieldname keys)..
3160: 09 09 20 20 20 20 72 65 6d 66 69 65 6c 64 73 29  ..    remfields)
3170: 29 0a 09 20 28 6b 65 79 73 74 72 20 20 20 20 28  ).. (keystr    (
3180: 63 6f 6e 63 20 28 6b 65 79 73 2d 3e 6b 65 79 73  conc (keys->keys
3190: 74 72 20 6b 65 79 73 29 20 22 2c 22 0a 09 09 09  tr keys) ","....
31a0: 20 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73    (string-inters
31b0: 70 65 72 73 65 20 72 65 6d 66 69 65 6c 64 73 20  perse remfields 
31c0: 22 2c 22 29 29 29 29 0a 20 20 20 20 28 6c 69 73  ",")))).    (lis
31d0: 74 20 6b 65 79 73 74 72 20 68 65 61 64 65 72 29  t keystr header)
31e0: 29 29 0a 0a 3b 3b 20 57 41 53 20 64 62 2d 67 65  ))..;; WAS db-ge
31f0: 74 2d 72 75 6e 73 20 46 49 58 4d 45 20 49 4e 20  t-runs FIXME IN 
3200: 52 45 4d 41 49 4e 49 4e 47 20 43 4f 44 45 0a 3b  REMAINING CODE.;
3210: 3b 0a 3b 3b 20 4d 45 52 47 45 20 54 48 49 53 20  ;.;; MERGE THIS 
3220: 57 49 54 48 20 64 62 3a 67 65 74 2d 72 75 6e 73  WITH db:get-runs
3230: 2c 20 61 63 63 69 64 65 6e 74 6c 79 20 77 72 6f  , accidently wro
3240: 74 65 20 69 74 20 74 77 69 63 65 0a 3b 3b 0a 3b  te it twice.;;.;
3250: 3b 20 72 65 70 6c 61 63 65 20 68 65 61 64 65 72  ; replace header
3260: 20 61 6e 64 20 6b 65 79 73 74 72 20 77 69 74 68   and keystr with
3270: 20 61 20 63 61 6c 6c 20 74 6f 20 72 75 6e 73 3a   a call to runs:
3280: 67 65 74 2d 73 74 64 2d 72 75 6e 2d 66 69 65 6c  get-std-run-fiel
3290: 64 73 0a 3b 3b 0a 3b 3b 20 6b 65 79 70 61 74 74  ds.;;.;; keypatt
32a0: 73 3a 20 28 20 28 4b 45 59 31 20 22 61 62 63 25  s: ( (KEY1 "abc%
32b0: 64 65 66 22 29 28 4b 45 59 32 20 22 25 22 29 20  def")(KEY2 "%") 
32c0: 29 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 28 64 62  ).;;.(define (db
32d0: 3a 67 65 74 2d 72 75 6e 73 20 64 62 20 72 75 6e  :get-runs db run
32e0: 70 61 74 74 20 63 6f 75 6e 74 20 6f 66 66 73 65  patt count offse
32f0: 74 20 6b 65 79 70 61 74 74 73 29 0a 20 20 28 6c  t keypatts).  (l
3300: 65 74 2a 20 28 28 72 65 73 20 20 20 20 20 20 27  et* ((res      '
3310: 28 29 29 0a 09 20 28 6b 65 79 73 20 20 20 20 20  ()).. (keys     
3320: 20 28 64 62 2d 67 65 74 2d 6b 65 79 73 20 64 62   (db-get-keys db
3330: 29 29 0a 09 20 28 72 65 6d 66 69 65 6c 64 73 20  )).. (remfields 
3340: 28 6c 69 73 74 20 22 69 64 22 20 22 72 75 6e 6e  (list "id" "runn
3350: 61 6d 65 22 20 22 73 74 61 74 65 22 20 22 73 74  ame" "state" "st
3360: 61 74 75 73 22 20 22 6f 77 6e 65 72 22 20 22 65  atus" "owner" "e
3370: 76 65 6e 74 5f 74 69 6d 65 22 29 29 0a 09 20 28  vent_time")).. (
3380: 68 65 61 64 65 72 20 20 20 20 28 61 70 70 65 6e  header    (appen
3390: 64 20 28 6d 61 70 20 6b 65 79 3a 67 65 74 2d 66  d (map key:get-f
33a0: 69 65 6c 64 6e 61 6d 65 20 6b 65 79 73 29 0a 09  ieldname keys)..
33b0: 09 09 20 20 20 20 72 65 6d 66 69 65 6c 64 73 29  ..    remfields)
33c0: 29 0a 09 20 28 6b 65 79 73 74 72 20 20 20 20 28  ).. (keystr    (
33d0: 63 6f 6e 63 20 28 6b 65 79 73 2d 3e 6b 65 79 73  conc (keys->keys
33e0: 74 72 20 6b 65 79 73 29 20 22 2c 22 0a 09 09 09  tr keys) ","....
33f0: 20 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73    (string-inters
3400: 70 65 72 73 65 20 72 65 6d 66 69 65 6c 64 73 20  perse remfields 
3410: 22 2c 22 29 29 29 0a 09 20 28 71 72 79 73 74 72  ","))).. (qrystr
3420: 20 20 20 20 28 63 6f 6e 63 20 22 53 45 4c 45 43      (conc "SELEC
3430: 54 20 22 20 6b 65 79 73 74 72 20 22 20 46 52 4f  T " keystr " FRO
3440: 4d 20 72 75 6e 73 20 57 48 45 52 45 20 72 75 6e  M runs WHERE run
3450: 6e 61 6d 65 20 4c 49 4b 45 20 3f 20 22 0a 09 09  name LIKE ? "...
3460: 09 20 20 3b 3b 20 47 65 6e 65 72 61 74 65 3a 20  .  ;; Generate: 
3470: 22 20 41 4e 44 20 78 20 4c 49 4b 45 20 27 6b 65  " AND x LIKE 'ke
3480: 79 70 61 74 74 27 20 2e 2e 2e 22 0a 09 09 09 20  ypatt' ...".... 
3490: 20 28 69 66 20 28 6e 75 6c 6c 3f 20 6b 65 79 70   (if (null? keyp
34a0: 61 74 74 73 29 20 22 22 0a 09 09 09 20 20 20 20  atts) ""....    
34b0: 20 20 28 63 6f 6e 63 20 22 20 41 4e 44 20 22 0a    (conc " AND ".
34c0: 09 09 09 09 20 20 20 20 28 73 74 72 69 6e 67 2d  ....    (string-
34d0: 6a 6f 69 6e 20 0a 09 09 09 09 20 20 20 20 20 28  join .....     (
34e0: 6d 61 70 20 28 6c 61 6d 62 64 61 20 28 6b 65 79  map (lambda (key
34f0: 70 61 74 74 29 0a 09 09 09 09 09 20 20 20 20 28  patt)......    (
3500: 6c 65 74 20 28 28 6b 65 79 20 20 28 63 61 72 20  let ((key  (car 
3510: 6b 65 79 70 61 74 74 29 29 0a 09 09 09 09 09 09  keypatt)).......
3520: 20 20 28 70 61 74 74 20 28 63 61 64 72 20 6b 65    (patt (cadr ke
3530: 79 70 61 74 74 29 29 29 0a 09 09 09 09 09 20 20  ypatt)))......  
3540: 20 20 20 20 28 63 6f 6e 63 20 6b 65 79 20 22 20      (conc key " 
3550: 4c 49 4b 45 20 27 22 20 70 61 74 74 20 22 27 22  LIKE '" patt "'"
3560: 29 29 29 0a 09 09 09 09 09 20 20 6b 65 79 70 61  )))......  keypa
3570: 74 74 73 29 0a 09 09 09 09 20 20 20 20 20 22 20  tts).....     " 
3580: 41 4e 44 20 22 29 29 29 0a 09 09 09 20 20 22 20  AND ")))....  " 
3590: 4f 52 44 45 52 20 42 59 20 65 76 65 6e 74 5f 74  ORDER BY event_t
35a0: 69 6d 65 20 44 45 53 43 20 22 0a 09 09 09 20 20  ime DESC "....  
35b0: 28 69 66 20 28 6e 75 6d 62 65 72 3f 20 63 6f 75  (if (number? cou
35c0: 6e 74 29 0a 09 09 09 20 20 20 20 20 20 28 63 6f  nt)....      (co
35d0: 6e 63 20 22 20 4c 49 4d 49 54 20 22 20 63 6f 75  nc " LIMIT " cou
35e0: 6e 74 29 0a 09 09 09 20 20 20 20 20 20 22 22 29  nt)....      "")
35f0: 0a 09 09 09 20 20 28 69 66 20 28 6e 75 6d 62 65  ....  (if (numbe
3600: 72 3f 20 6f 66 66 73 65 74 29 0a 09 09 09 20 20  r? offset)....  
3610: 20 20 20 20 28 63 6f 6e 63 20 22 20 4f 46 46 53      (conc " OFFS
3620: 45 54 20 22 20 6f 66 66 73 65 74 29 0a 09 09 09  ET " offset)....
3630: 20 20 20 20 20 20 22 22 29 29 29 29 0a 20 20 20        "")))).   
3640: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20   (debug:print 4 
3650: 22 64 62 3a 67 65 74 2d 72 75 6e 73 20 71 72 79  "db:get-runs qry
3660: 73 74 72 3a 20 22 20 71 72 79 73 74 72 20 22 5c  str: " qrystr "\
3670: 6e 6b 65 79 70 61 74 74 73 3a 20 22 20 6b 65 79  nkeypatts: " key
3680: 70 61 74 74 73 20 22 5c 6e 20 20 6f 66 66 73 65  patts "\n  offse
3690: 74 3a 20 22 20 6f 66 66 73 65 74 20 22 20 6c 69  t: " offset " li
36a0: 6d 69 74 3a 20 22 20 63 6f 75 6e 74 29 0a 20 20  mit: " count).  
36b0: 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65    (sqlite3:for-e
36c0: 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61  ach-row.     (la
36d0: 6d 62 64 61 20 28 61 20 2e 20 78 29 0a 20 20 20  mbda (a . x).   
36e0: 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28 63      (set! res (c
36f0: 6f 6e 73 20 28 61 70 70 6c 79 20 76 65 63 74 6f  ons (apply vecto
3700: 72 20 61 20 78 29 20 72 65 73 29 29 29 0a 20 20  r a x) res))).  
3710: 20 20 20 64 62 0a 20 20 20 20 20 71 72 79 73 74     db.     qryst
3720: 72 0a 20 20 20 20 20 72 75 6e 70 61 74 74 29 0a  r.     runpatt).
3730: 20 20 20 20 28 76 65 63 74 6f 72 20 68 65 61 64      (vector head
3740: 65 72 20 72 65 73 29 29 29 0a 0a 3b 3b 20 6a 75  er res)))..;; ju
3750: 73 74 20 67 65 74 20 63 6f 75 6e 74 20 6f 66 20  st get count of 
3760: 72 75 6e 73 0a 28 64 65 66 69 6e 65 20 28 64 62  runs.(define (db
3770: 3a 67 65 74 2d 6e 75 6d 2d 72 75 6e 73 20 64 62  :get-num-runs db
3780: 20 72 75 6e 70 61 74 74 29 0a 20 20 28 6c 65 74   runpatt).  (let
3790: 20 28 28 6e 75 6d 72 75 6e 73 20 30 29 29 0a 20   ((numruns 0)). 
37a0: 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d     (sqlite3:for-
37b0: 65 61 63 68 2d 72 6f 77 20 0a 20 20 20 20 20 28  each-row .     (
37c0: 6c 61 6d 62 64 61 20 28 63 6f 75 6e 74 29 0a 20  lambda (count). 
37d0: 20 20 20 20 20 20 28 73 65 74 21 20 6e 75 6d 72        (set! numr
37e0: 75 6e 73 20 63 6f 75 6e 74 29 29 0a 20 20 20 20  uns count)).    
37f0: 20 64 62 0a 20 20 20 20 20 22 53 45 4c 45 43 54   db.     "SELECT
3800: 20 43 4f 55 4e 54 28 69 64 29 20 46 52 4f 4d 20   COUNT(id) FROM 
3810: 72 75 6e 73 20 57 48 45 52 45 20 72 75 6e 6e 61  runs WHERE runna
3820: 6d 65 20 4c 49 4b 45 20 3f 3b 22 20 72 75 6e 70  me LIKE ?;" runp
3830: 61 74 74 29 0a 20 20 20 20 6e 75 6d 72 75 6e 73  att).    numruns
3840: 29 29 0a 0a 0a 3b 3b 20 75 73 65 20 28 67 65 74  ))...;; use (get
3850: 2d 76 61 6c 75 65 2d 62 79 2d 68 65 61 64 65 72  -value-by-header
3860: 20 28 64 62 3a 67 65 74 2d 68 65 61 64 65 72 20   (db:get-header 
3870: 72 75 6e 69 6e 66 6f 29 28 64 62 3a 67 65 74 2d  runinfo)(db:get-
3880: 72 6f 77 20 72 75 6e 69 6e 66 6f 29 29 0a 28 64  row runinfo)).(d
3890: 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 72 75  efine (db:get-ru
38a0: 6e 2d 69 6e 66 6f 20 64 62 20 72 75 6e 2d 69 64  n-info db run-id
38b0: 29 0a 20 20 28 6c 65 74 2a 20 28 28 72 65 73 20  ).  (let* ((res 
38c0: 20 20 20 20 20 23 66 29 0a 09 20 28 6b 65 79 73       #f).. (keys
38d0: 20 20 20 20 20 20 28 64 62 2d 67 65 74 2d 6b 65        (db-get-ke
38e0: 79 73 20 64 62 29 29 0a 09 20 28 72 65 6d 66 69  ys db)).. (remfi
38f0: 65 6c 64 73 20 28 6c 69 73 74 20 22 69 64 22 20  elds (list "id" 
3900: 22 72 75 6e 6e 61 6d 65 22 20 22 73 74 61 74 65  "runname" "state
3910: 22 20 22 73 74 61 74 75 73 22 20 22 6f 77 6e 65  " "status" "owne
3920: 72 22 20 22 65 76 65 6e 74 5f 74 69 6d 65 22 29  r" "event_time")
3930: 29 0a 09 20 28 68 65 61 64 65 72 20 20 20 20 28  ).. (header    (
3940: 61 70 70 65 6e 64 20 28 6d 61 70 20 6b 65 79 3a  append (map key:
3950: 67 65 74 2d 66 69 65 6c 64 6e 61 6d 65 20 6b 65  get-fieldname ke
3960: 79 73 29 0a 09 09 09 20 20 20 20 72 65 6d 66 69  ys)....    remfi
3970: 65 6c 64 73 29 29 0a 09 20 28 6b 65 79 73 74 72  elds)).. (keystr
3980: 20 20 20 20 28 63 6f 6e 63 20 28 6b 65 79 73 2d      (conc (keys-
3990: 3e 6b 65 79 73 74 72 20 6b 65 79 73 29 20 22 2c  >keystr keys) ",
39a0: 22 0a 09 09 09 20 20 28 73 74 72 69 6e 67 2d 69  "....  (string-i
39b0: 6e 74 65 72 73 70 65 72 73 65 20 72 65 6d 66 69  ntersperse remfi
39c0: 65 6c 64 73 20 22 2c 22 29 29 29 29 0a 20 20 20  elds ",")))).   
39d0: 20 3b 3b 20 28 64 65 62 75 67 3a 70 72 69 6e 74   ;; (debug:print
39e0: 20 30 20 22 64 62 3a 67 65 74 2d 72 75 6e 2d 69   0 "db:get-run-i
39f0: 6e 66 6f 20 72 75 6e 2d 69 64 3a 20 22 20 72 75  nfo run-id: " ru
3a00: 6e 2d 69 64 20 22 20 68 65 61 64 65 72 3a 20 22  n-id " header: "
3a10: 20 68 65 61 64 65 72 20 22 20 6b 65 79 73 74 72   header " keystr
3a20: 3a 20 22 20 6b 65 79 73 74 72 29 0a 20 20 20 20  : " keystr).    
3a30: 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63  (sqlite3:for-eac
3a40: 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62  h-row.     (lamb
3a50: 64 61 20 28 61 20 2e 20 78 29 0a 20 20 20 20 20  da (a . x).     
3a60: 20 20 28 73 65 74 21 20 72 65 73 20 28 61 70 70    (set! res (app
3a70: 6c 79 20 76 65 63 74 6f 72 20 61 20 78 29 29 29  ly vector a x)))
3a80: 0a 20 20 20 20 20 64 62 0a 20 20 20 20 20 28 63  .     db.     (c
3a90: 6f 6e 63 20 22 53 45 4c 45 43 54 20 22 20 6b 65  onc "SELECT " ke
3aa0: 79 73 74 72 20 22 20 46 52 4f 4d 20 72 75 6e 73  ystr " FROM runs
3ab0: 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 29 0a 20   WHERE id=?;"). 
3ac0: 20 20 20 20 72 75 6e 2d 69 64 29 0a 20 20 20 20      run-id).    
3ad0: 28 76 65 63 74 6f 72 20 68 65 61 64 65 72 20 72  (vector header r
3ae0: 65 73 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  es)))..(define (
3af0: 64 62 3a 73 65 74 2d 63 6f 6d 6d 65 6e 74 2d 66  db:set-comment-f
3b00: 6f 72 2d 72 75 6e 20 64 62 20 72 75 6e 2d 69 64  or-run db run-id
3b10: 20 63 6f 6d 6d 65 6e 74 29 0a 20 20 28 73 71 6c   comment).  (sql
3b20: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
3b30: 22 55 50 44 41 54 45 20 72 75 6e 73 20 53 45 54  "UPDATE runs SET
3b40: 20 63 6f 6d 6d 65 6e 74 3d 3f 20 57 48 45 52 45   comment=? WHERE
3b50: 20 69 64 3d 3f 3b 22 20 63 6f 6d 6d 65 6e 74 20   id=?;" comment 
3b60: 72 75 6e 2d 69 64 29 29 0a 0a 3b 3b 20 64 6f 65  run-id))..;; doe
3b70: 73 20 6e 6f 74 20 28 6f 62 76 69 6f 75 73 6c 79  s not (obviously
3b80: 21 29 20 72 65 6d 6f 76 65 64 20 64 65 70 65 6e  !) removed depen
3b90: 64 65 6e 74 20 64 61 74 61 2e 20 0a 28 64 65 66  dent data. .(def
3ba0: 69 6e 65 20 28 64 62 3a 64 65 6c 65 74 65 2d 72  ine (db:delete-r
3bb0: 75 6e 20 64 62 20 72 75 6e 2d 69 64 29 0a 20 20  un db run-id).  
3bc0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
3bd0: 20 64 62 20 22 44 45 4c 45 54 45 20 46 52 4f 4d   db "DELETE FROM
3be0: 20 72 75 6e 73 20 57 48 45 52 45 20 69 64 3d 3f   runs WHERE id=?
3bf0: 3b 22 20 72 75 6e 2d 69 64 29 29 0a 0a 28 64 65  ;" run-id))..(de
3c00: 66 69 6e 65 20 28 64 62 3a 75 70 64 61 74 65 2d  fine (db:update-
3c10: 72 75 6e 2d 65 76 65 6e 74 5f 74 69 6d 65 20 64  run-event_time d
3c20: 62 20 72 75 6e 2d 69 64 29 0a 20 20 28 73 71 6c  b run-id).  (sql
3c30: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
3c40: 22 55 50 44 41 54 45 20 72 75 6e 73 20 53 45 54  "UPDATE runs SET
3c50: 20 65 76 65 6e 74 5f 74 69 6d 65 3d 73 74 72 66   event_time=strf
3c60: 74 69 6d 65 28 27 25 73 27 2c 27 6e 6f 77 27 29  time('%s','now')
3c70: 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 72 75   WHERE id=?;" ru
3c80: 6e 2d 69 64 29 29 20 0a 0a 3b 3b 3d 3d 3d 3d 3d  n-id)) ..;;=====
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 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3cd0: 3d 0a 3b 3b 20 20 54 20 45 20 53 20 54 20 53 0a  =.;;  T E S T S.
3ce0: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
3cf0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3d00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3d10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3d20: 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 73 74 61  ========..;; sta
3d30: 74 65 73 20 61 6e 64 20 73 74 61 74 75 73 65 73  tes and statuses
3d40: 20 61 72 65 20 6c 69 73 74 73 2c 20 74 75 72 6e   are lists, turn
3d50: 20 74 68 65 6d 20 69 6e 74 6f 20 28 22 50 41 53   them into ("PAS
3d60: 53 22 2c 22 46 41 49 4c 22 2e 2e 2e 29 20 61 6e  S","FAIL"...) an
3d70: 64 20 75 73 65 20 4e 4f 54 20 49 4e 0a 3b 3b 20  d use NOT IN.;; 
3d80: 69 2e 65 2e 20 74 68 65 73 65 20 6c 69 73 74 73  i.e. these lists
3d90: 20 64 65 66 69 6e 65 20 77 68 61 74 20 74 6f 20   define what to 
3da0: 4e 4f 54 20 73 68 6f 77 2e 0a 3b 3b 20 73 74 61  NOT show..;; sta
3db0: 74 65 73 20 61 6e 64 20 73 74 61 74 75 73 65 73  tes and statuses
3dc0: 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f   are required to
3dd0: 20 62 65 20 6c 69 73 74 73 2c 20 65 6d 70 74 79   be lists, empty
3de0: 20 69 73 20 6f 6b 0a 28 64 65 66 69 6e 65 20 28   is ok.(define (
3df0: 64 62 2d 67 65 74 2d 74 65 73 74 73 2d 66 6f 72  db-get-tests-for
3e00: 2d 72 75 6e 20 64 62 20 72 75 6e 2d 69 64 20 74  -run db run-id t
3e10: 65 73 74 70 61 74 74 20 69 74 65 6d 70 61 74 74  estpatt itempatt
3e20: 20 73 74 61 74 65 73 20 73 74 61 74 75 73 65 73   states statuses
3e30: 29 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20 27  ).  (let ((res '
3e40: 28 29 29 0a 09 28 73 74 61 74 65 73 2d 73 74 72  ())..(states-str
3e50: 20 20 20 20 28 63 6f 6e 63 20 22 28 27 22 20 28      (conc "('" (
3e60: 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72  string-intersper
3e70: 73 65 20 73 74 61 74 65 73 20 20 20 22 27 2c 27  se states   "','
3e80: 22 29 20 22 27 29 22 29 29 0a 09 28 73 74 61 74  ") "')"))..(stat
3e90: 75 73 65 73 2d 73 74 72 20 20 28 63 6f 6e 63 20  uses-str  (conc 
3ea0: 22 28 27 22 20 28 73 74 72 69 6e 67 2d 69 6e 74  "('" (string-int
3eb0: 65 72 73 70 65 72 73 65 20 73 74 61 74 75 73 65  ersperse statuse
3ec0: 73 20 22 27 2c 27 22 29 20 22 27 29 22 29 29 0a  s "','") "')")).
3ed0: 09 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a  .).    (sqlite3:
3ee0: 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20  for-each-row .  
3ef0: 20 20 20 28 6c 61 6d 62 64 61 20 28 69 64 20 72     (lambda (id r
3f00: 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 73  un-id testname s
3f10: 74 61 74 65 20 73 74 61 74 75 73 20 65 76 65 6e  tate status even
3f20: 74 2d 74 69 6d 65 20 68 6f 73 74 20 63 70 75 6c  t-time host cpul
3f30: 6f 61 64 20 64 69 73 6b 66 72 65 65 20 75 6e 61  oad diskfree una
3f40: 6d 65 20 72 75 6e 64 69 72 20 69 74 65 6d 2d 70  me rundir item-p
3f50: 61 74 68 20 72 75 6e 2d 64 75 72 61 74 69 6f 6e  ath run-duration
3f60: 20 66 69 6e 61 6c 2d 6c 6f 67 66 20 63 6f 6d 6d   final-logf comm
3f70: 65 6e 74 29 0a 20 20 20 20 20 20 20 28 73 65 74  ent).       (set
3f80: 21 20 72 65 73 20 28 63 6f 6e 73 20 28 76 65 63  ! res (cons (vec
3f90: 74 6f 72 20 69 64 20 72 75 6e 2d 69 64 20 74 65  tor id run-id te
3fa0: 73 74 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61  stname state sta
3fb0: 74 75 73 20 65 76 65 6e 74 2d 74 69 6d 65 20 68  tus event-time h
3fc0: 6f 73 74 20 63 70 75 6c 6f 61 64 20 64 69 73 6b  ost cpuload disk
3fd0: 66 72 65 65 20 75 6e 61 6d 65 20 72 75 6e 64 69  free uname rundi
3fe0: 72 20 69 74 65 6d 2d 70 61 74 68 20 72 75 6e 2d  r item-path run-
3ff0: 64 75 72 61 74 69 6f 6e 20 66 69 6e 61 6c 2d 6c  duration final-l
4000: 6f 67 66 20 63 6f 6d 6d 65 6e 74 29 20 72 65 73  ogf comment) res
4010: 29 29 29 0a 20 20 20 20 20 64 62 20 0a 20 20 20  ))).     db .   
4020: 20 20 28 63 6f 6e 63 20 22 53 45 4c 45 43 54 20    (conc "SELECT 
4030: 69 64 2c 72 75 6e 5f 69 64 2c 74 65 73 74 6e 61  id,run_id,testna
4040: 6d 65 2c 73 74 61 74 65 2c 73 74 61 74 75 73 2c  me,state,status,
4050: 65 76 65 6e 74 5f 74 69 6d 65 2c 68 6f 73 74 2c  event_time,host,
4060: 63 70 75 6c 6f 61 64 2c 64 69 73 6b 66 72 65 65  cpuload,diskfree
4070: 2c 75 6e 61 6d 65 2c 72 75 6e 64 69 72 2c 69 74  ,uname,rundir,it
4080: 65 6d 5f 70 61 74 68 2c 72 75 6e 5f 64 75 72 61  em_path,run_dura
4090: 74 69 6f 6e 2c 66 69 6e 61 6c 5f 6c 6f 67 66 2c  tion,final_logf,
40a0: 63 6f 6d 6d 65 6e 74 20 22 0a 09 20 20 20 22 20  comment "..   " 
40b0: 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45  FROM tests WHERE
40c0: 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65   run_id=? AND te
40d0: 73 74 6e 61 6d 65 20 6c 69 6b 65 20 3f 20 41 4e  stname like ? AN
40e0: 44 20 69 74 65 6d 5f 70 61 74 68 20 4c 49 4b 45  D item_path LIKE
40f0: 20 3f 20 22 20 0a 09 20 20 20 22 20 41 4e 44 20   ? " ..   " AND 
4100: 4e 4f 54 20 28 73 74 61 74 65 20 69 6e 20 22 20  NOT (state in " 
4110: 73 74 61 74 65 73 2d 73 74 72 20 22 20 41 4e 44  states-str " AND
4120: 20 73 74 61 74 75 73 20 49 4e 20 22 20 73 74 61   status IN " sta
4130: 74 75 73 65 73 2d 73 74 72 20 22 29 20 22 0a 09  tuses-str ") "..
4140: 20 20 20 3b 3b 20 22 20 4f 52 44 45 52 20 42 59     ;; " ORDER BY
4150: 20 69 64 20 44 45 53 43 3b 22 0a 09 20 20 20 22   id DESC;"..   "
4160: 20 4f 52 44 45 52 20 42 59 20 65 76 65 6e 74 5f   ORDER BY event_
4170: 74 69 6d 65 20 41 53 43 3b 22 20 3b 3b 20 50 4f  time ASC;" ;; PO
4180: 54 45 4e 54 49 41 4c 20 49 53 53 55 45 21 20 43  TENTIAL ISSUE! C
4190: 48 45 43 4b 20 4d 45 21 20 44 6f 65 73 20 61 6e  HECK ME! Does an
41a0: 79 74 69 6e 67 20 64 65 70 65 6e 64 20 6f 6e 20  yting depend on 
41b0: 74 68 69 73 20 62 65 69 6e 67 20 73 6f 72 74 65  this being sorte
41c0: 64 20 62 79 20 69 64 3f 0a 09 20 20 20 29 0a 20  d by id?..   ). 
41d0: 20 20 20 20 72 75 6e 2d 69 64 0a 20 20 20 20 20      run-id.     
41e0: 28 69 66 20 74 65 73 74 70 61 74 74 20 74 65 73  (if testpatt tes
41f0: 74 70 61 74 74 20 22 25 22 29 0a 20 20 20 20 20  tpatt "%").     
4200: 28 69 66 20 69 74 65 6d 70 61 74 74 20 69 74 65  (if itempatt ite
4210: 6d 70 61 74 74 20 22 25 22 29 29 0a 20 20 20 20  mpatt "%")).    
4220: 72 65 73 29 29 0a 0a 3b 3b 20 74 68 69 73 20 6f  res))..;; this o
4230: 6e 65 20 69 73 20 61 20 62 69 74 20 62 72 6f 6b  ne is a bit brok
4240: 65 6e 20 42 55 47 20 46 49 58 4d 45 0a 28 64 65  en BUG FIXME.(de
4250: 66 69 6e 65 20 28 64 62 3a 64 65 6c 65 74 65 2d  fine (db:delete-
4260: 74 65 73 74 2d 73 74 65 70 2d 72 65 63 6f 72 64  test-step-record
4270: 73 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74  s db run-id test
4280: 2d 6e 61 6d 65 20 69 74 65 6d 64 61 74 29 0a 20  -name itemdat). 
4290: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
42a0: 65 20 64 62 20 22 44 45 4c 45 54 45 20 46 52 4f  e db "DELETE FRO
42b0: 4d 20 74 65 73 74 5f 73 74 65 70 73 20 57 48 45  M test_steps WHE
42c0: 52 45 20 74 65 73 74 5f 69 64 20 69 6e 20 28 53  RE test_id in (S
42d0: 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 74 65  ELECT id FROM te
42e0: 73 74 73 20 57 48 45 52 45 20 72 75 6e 5f 69 64  sts WHERE run_id
42f0: 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d  =? AND testname=
4300: 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 3d  ? AND item_path=
4310: 3f 29 3b 22 20 0a 09 09 20 20 20 72 75 6e 2d 69  ?);" ...   run-i
4320: 64 20 74 65 73 74 2d 6e 61 6d 65 20 28 69 74 65  d test-name (ite
4330: 6d 2d 6c 69 73 74 2d 3e 70 61 74 68 20 69 74 65  m-list->path ite
4340: 6d 64 61 74 29 29 29 0a 3b 3b 20 0a 28 64 65 66  mdat))).;; .(def
4350: 69 6e 65 20 28 64 62 3a 64 65 6c 65 74 65 2d 74  ine (db:delete-t
4360: 65 73 74 2d 72 65 63 6f 72 64 73 20 64 62 20 74  est-records db t
4370: 65 73 74 2d 69 64 29 0a 20 20 28 73 71 6c 69 74  est-id).  (sqlit
4380: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 44  e3:execute db "D
4390: 45 4c 45 54 45 20 46 52 4f 4d 20 74 65 73 74 5f  ELETE FROM test_
43a0: 73 74 65 70 73 20 57 48 45 52 45 20 74 65 73 74  steps WHERE test
43b0: 5f 69 64 3d 3f 3b 22 20 74 65 73 74 2d 69 64 29  _id=?;" test-id)
43c0: 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63  .  (sqlite3:exec
43d0: 75 74 65 20 64 62 20 22 44 45 4c 45 54 45 20 46  ute db "DELETE F
43e0: 52 4f 4d 20 74 65 73 74 5f 64 61 74 61 20 20 57  ROM test_data  W
43f0: 48 45 52 45 20 74 65 73 74 5f 69 64 3d 3f 3b 22  HERE test_id=?;"
4400: 20 74 65 73 74 2d 69 64 29 0a 20 20 28 73 71 6c   test-id).  (sql
4410: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
4420: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 65 73  "DELETE FROM tes
4430: 74 73 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20  ts WHERE id=?;" 
4440: 74 65 73 74 2d 69 64 29 29 0a 0a 3b 3b 20 73 65  test-id))..;; se
4450: 74 20 74 65 73 74 73 20 77 69 74 68 20 73 74 61  t tests with sta
4460: 74 65 20 63 75 72 72 73 74 61 74 65 20 61 6e 64  te currstate and
4470: 20 73 74 61 74 75 73 20 63 75 72 72 73 74 61 74   status currstat
4480: 75 73 20 74 6f 20 6e 65 77 73 74 61 74 65 20 61  us to newstate a
4490: 6e 64 20 6e 65 77 73 74 61 74 75 73 0a 3b 3b 20  nd newstatus.;; 
44a0: 75 73 65 20 63 75 72 72 73 74 61 74 65 20 3d 20  use currstate = 
44b0: 23 66 20 61 6e 64 20 6f 72 20 63 75 72 72 73 74  #f and or currst
44c0: 61 74 75 73 20 3d 20 23 66 20 74 6f 20 61 70 70  atus = #f to app
44d0: 6c 79 20 74 6f 20 61 6e 79 20 73 74 61 74 65 20  ly to any state 
44e0: 6f 72 20 73 74 61 74 75 73 20 72 65 73 70 65 63  or status respec
44f0: 74 69 76 65 6c 79 0a 3b 3b 20 57 41 52 4e 49 4e  tively.;; WARNIN
4500: 47 3a 20 53 51 4c 20 69 6e 6a 65 63 74 69 6f 6e  G: SQL injection
4510: 20 72 69 73 6b 0a 28 64 65 66 69 6e 65 20 28 64   risk.(define (d
4520: 62 3a 73 65 74 2d 74 65 73 74 73 2d 73 74 61 74  b:set-tests-stat
4530: 65 2d 73 74 61 74 75 73 20 64 62 20 72 75 6e 2d  e-status db run-
4540: 69 64 20 74 65 73 74 6e 61 6d 65 73 20 63 75 72  id testnames cur
4550: 72 73 74 61 74 65 20 63 75 72 72 73 74 61 74 75  rstate currstatu
4560: 73 20 6e 65 77 73 74 61 74 65 20 6e 65 77 73 74  s newstate newst
4570: 61 74 75 73 29 0a 20 20 28 66 6f 72 2d 65 61 63  atus).  (for-eac
4580: 68 20 28 6c 61 6d 62 64 61 20 28 74 65 73 74 6e  h (lambda (testn
4590: 61 6d 65 29 0a 09 20 20 20 20 20 20 28 6c 65 74  ame)..      (let
45a0: 20 28 28 71 72 79 20 28 63 6f 6e 63 20 22 55 50   ((qry (conc "UP
45b0: 44 41 54 45 20 74 65 73 74 73 20 53 45 54 20 73  DATE tests SET s
45c0: 74 61 74 65 3d 3f 2c 73 74 61 74 75 73 3d 3f 20  tate=?,status=? 
45d0: 57 48 45 52 45 20 22 0a 09 09 09 09 09 28 69 66  WHERE "......(if
45e0: 20 63 75 72 72 73 74 61 74 65 20 20 28 63 6f 6e   currstate  (con
45f0: 63 20 22 73 74 61 74 65 3d 27 22 20 63 75 72 72  c "state='" curr
4600: 73 74 61 74 65 20 22 27 20 41 4e 44 20 22 29 20  state "' AND ") 
4610: 22 22 29 0a 09 09 09 09 09 28 69 66 20 63 75 72  "")......(if cur
4620: 72 73 74 61 74 75 73 20 28 63 6f 6e 63 20 22 73  rstatus (conc "s
4630: 74 61 74 75 73 3d 27 22 20 63 75 72 72 73 74 61  tatus='" currsta
4640: 74 75 73 20 22 27 20 41 4e 44 20 22 29 20 22 22  tus "' AND ") ""
4650: 29 0a 09 09 09 09 09 22 20 72 75 6e 5f 69 64 3d  )......" run_id=
4660: 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f  ? AND testname=?
4670: 20 41 4e 44 20 4e 4f 54 20 28 69 74 65 6d 5f 70   AND NOT (item_p
4680: 61 74 68 3d 27 27 20 41 4e 44 20 74 65 73 74 6e  ath='' AND testn
4690: 61 6d 65 20 69 6e 20 28 53 45 4c 45 43 54 20 44  ame in (SELECT D
46a0: 49 53 54 49 4e 43 54 20 74 65 73 74 6e 61 6d 65  ISTINCT testname
46b0: 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52   FROM tests WHER
46c0: 45 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44  E testname=? AND
46d0: 20 69 74 65 6d 5f 70 61 74 68 20 21 3d 20 27 27   item_path != ''
46e0: 29 29 3b 22 29 29 29 0a 09 09 3b 3b 28 64 65 62  ));")))...;;(deb
46f0: 75 67 3a 70 72 69 6e 74 20 30 20 22 51 52 59 3a  ug:print 0 "QRY:
4700: 20 22 20 71 72 79 29 0a 09 09 28 73 71 6c 69 74   " qry)...(sqlit
4710: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 71 72  e3:execute db qr
4720: 79 20 72 75 6e 2d 69 64 20 6e 65 77 73 74 61 74  y run-id newstat
4730: 65 20 6e 65 77 73 74 61 74 75 73 20 74 65 73 74  e newstatus test
4740: 6e 61 6d 65 20 74 65 73 74 6e 61 6d 65 29 29 29  name testname)))
4750: 0a 09 20 20 20 20 74 65 73 74 6e 61 6d 65 73 29  ..    testnames)
4760: 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 64  )..(define (db:d
4770: 65 6c 65 74 65 2d 74 65 73 74 73 2d 69 6e 2d 73  elete-tests-in-s
4780: 74 61 74 65 20 64 62 20 72 75 6e 2d 69 64 20 73  tate db run-id s
4790: 74 61 74 65 29 0a 20 20 28 73 71 6c 69 74 65 33  tate).  (sqlite3
47a0: 3a 65 78 65 63 75 74 65 20 64 62 20 22 44 45 4c  :execute db "DEL
47b0: 45 54 45 20 46 52 4f 4d 20 74 65 73 74 73 20 57  ETE FROM tests W
47c0: 48 45 52 45 20 73 74 61 74 65 3d 3f 20 41 4e 44  HERE state=? AND
47d0: 20 72 75 6e 5f 69 64 3d 3f 3b 22 20 73 74 61 74   run_id=?;" stat
47e0: 65 20 72 75 6e 2d 69 64 29 29 0a 0a 28 64 65 66  e run-id))..(def
47f0: 69 6e 65 20 28 64 62 3a 74 65 73 74 2d 73 65 74  ine (db:test-set
4800: 2d 73 74 61 74 65 2d 73 74 61 74 75 73 2d 62 79  -state-status-by
4810: 2d 69 64 20 64 62 20 74 65 73 74 2d 69 64 20 6e  -id db test-id n
4820: 65 77 73 74 61 74 65 20 6e 65 77 73 74 61 74 75  ewstate newstatu
4830: 73 20 6e 65 77 63 6f 6d 6d 65 6e 74 29 0a 20 20  s newcomment).  
4840: 28 69 66 20 6e 65 77 73 74 61 74 65 20 20 20 28  (if newstate   (
4850: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
4860: 64 62 20 22 55 50 44 41 54 45 20 74 65 73 74 73  db "UPDATE tests
4870: 20 53 45 54 20 73 74 61 74 65 3d 3f 20 20 20 57   SET state=?   W
4880: 48 45 52 45 20 69 64 3d 3f 3b 22 20 6e 65 77 73  HERE id=?;" news
4890: 74 61 74 65 20 20 20 74 65 73 74 2d 69 64 29 29  tate   test-id))
48a0: 0a 20 20 28 69 66 20 6e 65 77 73 74 61 74 75 73  .  (if newstatus
48b0: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
48c0: 74 65 20 64 62 20 22 55 50 44 41 54 45 20 74 65  te db "UPDATE te
48d0: 73 74 73 20 53 45 54 20 73 74 61 74 75 73 3d 3f  sts SET status=?
48e0: 20 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 6e    WHERE id=?;" n
48f0: 65 77 73 74 61 74 75 73 20 20 74 65 73 74 2d 69  ewstatus  test-i
4900: 64 29 29 0a 20 20 28 69 66 20 6e 65 77 63 6f 6d  d)).  (if newcom
4910: 6d 65 6e 74 20 28 73 71 6c 69 74 65 33 3a 65 78  ment (sqlite3:ex
4920: 65 63 75 74 65 20 64 62 20 22 55 50 44 41 54 45  ecute db "UPDATE
4930: 20 74 65 73 74 73 20 53 45 54 20 63 6f 6d 6d 65   tests SET comme
4940: 6e 74 3d 3f 20 57 48 45 52 45 20 69 64 3d 3f 3b  nt=? WHERE id=?;
4950: 22 20 6e 65 77 63 6f 6d 6d 65 6e 74 20 74 65 73  " newcomment tes
4960: 74 2d 69 64 29 29 29 0a 0a 28 64 65 66 69 6e 65  t-id)))..(define
4970: 20 28 64 62 3a 67 65 74 2d 63 6f 75 6e 74 2d 74   (db:get-count-t
4980: 65 73 74 73 2d 72 75 6e 6e 69 6e 67 20 64 62 29  ests-running db)
4990: 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20 30 29  .  (let ((res 0)
49a0: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66  ).    (sqlite3:f
49b0: 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 20  or-each-row.    
49c0: 20 28 6c 61 6d 62 64 61 20 28 63 6f 75 6e 74 29   (lambda (count)
49d0: 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72 65  .       (set! re
49e0: 73 20 63 6f 75 6e 74 29 29 0a 20 20 20 20 20 64  s count)).     d
49f0: 62 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20 63  b.     "SELECT c
4a00: 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 74 65  ount(id) FROM te
4a10: 73 74 73 20 57 48 45 52 45 20 73 74 61 74 65 20  sts WHERE state 
4a20: 3d 20 27 52 55 4e 4e 49 4e 47 27 20 4f 52 20 73  = 'RUNNING' OR s
4a30: 74 61 74 65 20 3d 20 27 4c 41 55 4e 43 48 45 44  tate = 'LAUNCHED
4a40: 27 20 4f 52 20 73 74 61 74 65 20 3d 20 27 52 45  ' OR state = 'RE
4a50: 4d 4f 54 45 48 4f 53 54 53 54 41 52 54 27 3b 22  MOTEHOSTSTART';"
4a60: 29 0a 20 20 20 20 72 65 73 29 29 0a 0a 3b 3b 20  ).    res))..;; 
4a70: 64 6f 6e 65 20 77 69 74 68 20 72 75 6e 20 77 68  done with run wh
4a80: 65 6e 3a 0a 3b 3b 20 20 20 30 20 74 65 73 74 73  en:.;;   0 tests
4a90: 20 69 6e 20 4c 41 55 4e 43 48 45 44 2c 20 4e 4f   in LAUNCHED, NO
4aa0: 54 5f 53 54 41 52 54 45 44 2c 20 52 45 4d 4f 54  T_STARTED, REMOT
4ab0: 45 48 4f 53 54 53 54 41 52 54 2c 20 52 55 4e 4e  EHOSTSTART, RUNN
4ac0: 49 4e 47 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  ING.(define (db:
4ad0: 65 73 74 69 6d 61 74 65 64 2d 74 65 73 74 73 2d  estimated-tests-
4ae0: 72 65 6d 61 69 6e 69 6e 67 20 64 62 20 72 75 6e  remaining db run
4af0: 2d 69 64 29 0a 20 20 28 6c 65 74 20 28 28 72 65  -id).  (let ((re
4b00: 73 20 30 29 29 0a 20 20 20 20 28 73 71 6c 69 74  s 0)).    (sqlit
4b10: 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a  e3:for-each-row.
4b20: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 63 6f       (lambda (co
4b30: 75 6e 74 29 0a 20 20 20 20 20 20 20 28 73 65 74  unt).       (set
4b40: 21 20 72 65 73 20 63 6f 75 6e 74 29 29 0a 20 20  ! res count)).  
4b50: 20 20 20 64 62 20 3b 3b 20 4e 42 2f 2f 20 4b 49     db ;; NB// KI
4b60: 4c 4c 52 45 51 20 6d 65 61 6e 73 20 74 68 65 20  LLREQ means the 
4b70: 6a 6f 62 73 20 69 73 20 73 74 69 6c 6c 20 70 72  jobs is still pr
4b80: 6f 62 61 62 6c 79 20 72 75 6e 6e 69 6e 67 0a 20  obably running. 
4b90: 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e      "SELECT coun
4ba0: 74 28 69 64 29 20 46 52 4f 4d 20 74 65 73 74 73  t(id) FROM tests
4bb0: 20 57 48 45 52 45 20 73 74 61 74 65 20 69 6e 20   WHERE state in 
4bc0: 28 27 4c 41 55 4e 43 48 45 44 27 2c 27 4e 4f 54  ('LAUNCHED','NOT
4bd0: 5f 53 54 41 52 54 45 44 27 2c 27 52 45 4d 4f 54  _STARTED','REMOT
4be0: 45 48 4f 53 54 53 54 41 52 54 27 2c 27 52 55 4e  EHOSTSTART','RUN
4bf0: 4e 49 4e 47 27 2c 27 4b 49 4c 4c 52 45 51 27 29  NING','KILLREQ')
4c00: 20 41 4e 44 20 72 75 6e 5f 69 64 3d 3f 3b 22 20   AND run_id=?;" 
4c10: 72 75 6e 2d 69 64 29 0a 20 20 20 20 72 65 73 29  run-id).    res)
4c20: 29 0a 0a 3b 3b 20 4e 42 2f 2f 20 53 79 6e 63 20  )..;; NB// Sync 
4c30: 74 68 69 73 20 77 69 74 68 20 72 75 6e 73 3a 67  this with runs:g
4c40: 65 74 2d 74 65 73 74 2d 69 6e 66 6f 0a 28 64 65  et-test-info.(de
4c50: 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 74 65 73  fine (db:get-tes
4c60: 74 2d 69 6e 66 6f 20 64 62 20 72 75 6e 2d 69 64  t-info db run-id
4c70: 20 74 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70   testname item-p
4c80: 61 74 68 29 0a 20 20 28 6c 65 74 20 28 28 72 65  ath).  (let ((re
4c90: 73 20 23 66 29 29 0a 20 20 20 20 28 73 71 6c 69  s #f)).    (sqli
4ca0: 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77  te3:for-each-row
4cb0: 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 69  .     (lambda (i
4cc0: 64 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d  d run-id testnam
4cd0: 65 20 73 74 61 74 65 20 73 74 61 74 75 73 20 65  e state status e
4ce0: 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73 74 20 63  vent-time host c
4cf0: 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20  puload diskfree 
4d00: 75 6e 61 6d 65 20 72 75 6e 64 69 72 20 69 74 65  uname rundir ite
4d10: 6d 2d 70 61 74 68 20 72 75 6e 5f 64 75 72 61 74  m-path run_durat
4d20: 69 6f 6e 20 66 69 6e 61 6c 5f 6c 6f 67 66 20 63  ion final_logf c
4d30: 6f 6d 6d 65 6e 74 20 29 0a 20 20 20 20 20 20 20  omment ).       
4d40: 28 73 65 74 21 20 72 65 73 20 28 76 65 63 74 6f  (set! res (vecto
4d50: 72 20 69 64 20 72 75 6e 2d 69 64 20 74 65 73 74  r id run-id test
4d60: 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61 74 75  name state statu
4d70: 73 20 65 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73  s event-time hos
4d80: 74 20 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72  t cpuload diskfr
4d90: 65 65 20 75 6e 61 6d 65 20 72 75 6e 64 69 72 20  ee uname rundir 
4da0: 69 74 65 6d 2d 70 61 74 68 20 72 75 6e 5f 64 75  item-path run_du
4db0: 72 61 74 69 6f 6e 20 66 69 6e 61 6c 5f 6c 6f 67  ration final_log
4dc0: 66 20 63 6f 6d 6d 65 6e 74 20 29 29 29 0a 20 20  f comment ))).  
4dd0: 20 20 20 64 62 20 0a 20 20 20 20 20 22 53 45 4c     db .     "SEL
4de0: 45 43 54 20 69 64 2c 72 75 6e 5f 69 64 2c 74 65  ECT id,run_id,te
4df0: 73 74 6e 61 6d 65 2c 73 74 61 74 65 2c 73 74 61  stname,state,sta
4e00: 74 75 73 2c 65 76 65 6e 74 5f 74 69 6d 65 2c 68  tus,event_time,h
4e10: 6f 73 74 2c 63 70 75 6c 6f 61 64 2c 64 69 73 6b  ost,cpuload,disk
4e20: 66 72 65 65 2c 75 6e 61 6d 65 2c 72 75 6e 64 69  free,uname,rundi
4e30: 72 2c 69 74 65 6d 5f 70 61 74 68 2c 72 75 6e 5f  r,item_path,run_
4e40: 64 75 72 61 74 69 6f 6e 2c 66 69 6e 61 6c 5f 6c  duration,final_l
4e50: 6f 67 66 2c 63 6f 6d 6d 65 6e 74 20 46 52 4f 4d  ogf,comment FROM
4e60: 20 74 65 73 74 73 20 57 48 45 52 45 20 72 75 6e   tests WHERE run
4e70: 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61  _id=? AND testna
4e80: 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61  me=? AND item_pa
4e90: 74 68 3d 3f 3b 22 0a 20 20 20 20 20 72 75 6e 2d  th=?;".     run-
4ea0: 69 64 20 74 65 73 74 6e 61 6d 65 20 69 74 65 6d  id testname item
4eb0: 2d 70 61 74 68 29 0a 20 20 20 20 72 65 73 29 29  -path).    res))
4ec0: 0a 0a 3b 3b 20 47 65 74 20 74 65 73 74 20 64 61  ..;; Get test da
4ed0: 74 61 20 75 73 69 6e 67 20 74 65 73 74 5f 69 64  ta using test_id
4ee0: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74  .(define (db:get
4ef0: 2d 74 65 73 74 2d 64 61 74 61 2d 62 79 2d 69 64  -test-data-by-id
4f00: 20 64 62 20 74 65 73 74 2d 69 64 29 0a 20 20 28   db test-id).  (
4f10: 6c 65 74 20 28 28 72 65 73 20 23 66 29 29 0a 20  let ((res #f)). 
4f20: 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d     (sqlite3:for-
4f30: 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c  each-row.     (l
4f40: 61 6d 62 64 61 20 28 69 64 20 72 75 6e 2d 69 64  ambda (id run-id
4f50: 20 74 65 73 74 6e 61 6d 65 20 73 74 61 74 65 20   testname state 
4f60: 73 74 61 74 75 73 20 65 76 65 6e 74 2d 74 69 6d  status event-tim
4f70: 65 20 68 6f 73 74 20 63 70 75 6c 6f 61 64 20 64  e host cpuload d
4f80: 69 73 6b 66 72 65 65 20 75 6e 61 6d 65 20 72 75  iskfree uname ru
4f90: 6e 64 69 72 20 69 74 65 6d 2d 70 61 74 68 20 72  ndir item-path r
4fa0: 75 6e 5f 64 75 72 61 74 69 6f 6e 20 66 69 6e 61  un_duration fina
4fb0: 6c 5f 6c 6f 67 66 20 63 6f 6d 6d 65 6e 74 29 0a  l_logf comment).
4fc0: 20 20 20 20 20 20 20 28 73 65 74 21 20 72 65 73         (set! res
4fd0: 20 28 76 65 63 74 6f 72 20 69 64 20 72 75 6e 2d   (vector id run-
4fe0: 69 64 20 74 65 73 74 6e 61 6d 65 20 73 74 61 74  id testname stat
4ff0: 65 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d 74  e status event-t
5000: 69 6d 65 20 68 6f 73 74 20 63 70 75 6c 6f 61 64  ime host cpuload
5010: 20 64 69 73 6b 66 72 65 65 20 75 6e 61 6d 65 20   diskfree uname 
5020: 72 75 6e 64 69 72 20 69 74 65 6d 2d 70 61 74 68  rundir item-path
5030: 20 72 75 6e 5f 64 75 72 61 74 69 6f 6e 20 66 69   run_duration fi
5040: 6e 61 6c 5f 6c 6f 67 66 20 63 6f 6d 6d 65 6e 74  nal_logf comment
5050: 29 29 29 0a 20 20 20 20 20 64 62 20 0a 20 20 20  ))).     db .   
5060: 20 20 22 53 45 4c 45 43 54 20 69 64 2c 72 75 6e    "SELECT id,run
5070: 5f 69 64 2c 74 65 73 74 6e 61 6d 65 2c 73 74 61  _id,testname,sta
5080: 74 65 2c 73 74 61 74 75 73 2c 65 76 65 6e 74 5f  te,status,event_
5090: 74 69 6d 65 2c 68 6f 73 74 2c 63 70 75 6c 6f 61  time,host,cpuloa
50a0: 64 2c 64 69 73 6b 66 72 65 65 2c 75 6e 61 6d 65  d,diskfree,uname
50b0: 2c 72 75 6e 64 69 72 2c 69 74 65 6d 5f 70 61 74  ,rundir,item_pat
50c0: 68 2c 72 75 6e 5f 64 75 72 61 74 69 6f 6e 2c 66  h,run_duration,f
50d0: 69 6e 61 6c 5f 6c 6f 67 66 2c 63 6f 6d 6d 65 6e  inal_logf,commen
50e0: 74 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45  t FROM tests WHE
50f0: 52 45 20 69 64 3d 3f 3b 22 0a 20 20 20 20 20 74  RE id=?;".     t
5100: 65 73 74 2d 69 64 29 0a 20 20 20 20 72 65 73 29  est-id).    res)
5110: 29 0a 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  )...(define (db:
5120: 74 65 73 74 2d 73 65 74 2d 63 6f 6d 6d 65 6e 74  test-set-comment
5130: 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 6e   db run-id testn
5140: 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 63 6f  ame item-path co
5150: 6d 6d 65 6e 74 29 0a 20 20 28 73 71 6c 69 74 65  mment).  (sqlite
5160: 33 3a 65 78 65 63 75 74 65 20 0a 20 20 20 64 62  3:execute .   db
5170: 20 0a 20 20 20 22 55 50 44 41 54 45 20 74 65 73   .   "UPDATE tes
5180: 74 73 20 53 45 54 20 63 6f 6d 6d 65 6e 74 3d 3f  ts SET comment=?
5190: 20 57 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20   WHERE run_id=? 
51a0: 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41  AND testname=? A
51b0: 4e 44 20 69 74 65 6d 5f 70 61 74 68 3d 3f 3b 22  ND item_path=?;"
51c0: 0a 20 20 20 20 20 63 6f 6d 6d 65 6e 74 20 72 75  .     comment ru
51d0: 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 69 74  n-id testname it
51e0: 65 6d 2d 70 61 74 68 29 29 0a 0a 3b 3b 0a 28 64  em-path))..;;.(d
51f0: 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74 2d 73  efine (db:test-s
5200: 65 74 2d 72 75 6e 64 69 72 21 20 64 62 20 72 75  et-rundir! db ru
5210: 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 69 74  n-id testname it
5220: 65 6d 2d 70 61 74 68 20 72 75 6e 64 69 72 29 0a  em-path rundir).
5230: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
5240: 74 65 20 0a 20 20 20 64 62 20 0a 20 20 20 22 55  te .   db .   "U
5250: 50 44 41 54 45 20 74 65 73 74 73 20 53 45 54 20  PDATE tests SET 
5260: 72 75 6e 64 69 72 3d 3f 20 57 48 45 52 45 20 72  rundir=? WHERE r
5270: 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74  un_id=? AND test
5280: 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f  name=? AND item_
5290: 70 61 74 68 3d 3f 3b 22 0a 20 20 20 20 20 72 75  path=?;".     ru
52a0: 6e 64 69 72 20 72 75 6e 2d 69 64 20 74 65 73 74  ndir run-id test
52b0: 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 29  name item-path))
52c0: 0a 0a 3b 3b 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 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 54 65  ==========.;; Te
5310: 73 74 73 20 6d 65 74 61 20 64 61 74 61 0a 3b 3b  sts meta data.;;
5320: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5330: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5340: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5350: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5360: 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 72 65 61 64 20  ======..;; read 
5370: 74 68 65 20 72 65 63 6f 72 64 20 67 69 76 65 6e  the record given
5380: 20 61 20 74 65 73 74 6e 61 6d 65 0a 28 64 65 66   a testname.(def
5390: 69 6e 65 20 28 64 62 3a 74 65 73 74 6d 65 74 61  ine (db:testmeta
53a0: 2d 67 65 74 2d 72 65 63 6f 72 64 20 64 62 20 74  -get-record db t
53b0: 65 73 74 6e 61 6d 65 29 0a 20 20 28 6c 65 74 20  estname).  (let 
53c0: 28 28 72 65 73 20 23 66 29 29 0a 20 20 20 20 28  ((res #f)).    (
53d0: 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68  sqlite3:for-each
53e0: 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 64  -row.     (lambd
53f0: 61 20 28 69 64 20 74 65 73 74 6e 61 6d 65 20 61  a (id testname a
5400: 75 74 68 6f 72 20 6f 77 6e 65 72 20 64 65 73 63  uthor owner desc
5410: 72 69 70 74 69 6f 6e 20 72 65 76 69 65 77 65 64  ription reviewed
5420: 20 69 74 65 72 61 74 65 64 20 61 76 67 5f 72 75   iterated avg_ru
5430: 6e 74 69 6d 65 20 61 76 67 5f 64 69 73 6b 20 74  ntime avg_disk t
5440: 61 67 73 29 0a 20 20 20 20 20 20 20 28 73 65 74  ags).       (set
5450: 21 20 72 65 73 20 28 76 65 63 74 6f 72 20 69 64  ! res (vector id
5460: 20 74 65 73 74 6e 61 6d 65 20 61 75 74 68 6f 72   testname author
5470: 20 6f 77 6e 65 72 20 64 65 73 63 72 69 70 74 69   owner descripti
5480: 6f 6e 20 72 65 76 69 65 77 65 64 20 69 74 65 72  on reviewed iter
5490: 61 74 65 64 20 61 76 67 5f 72 75 6e 74 69 6d 65  ated avg_runtime
54a0: 20 61 76 67 5f 64 69 73 6b 20 74 61 67 73 29 29   avg_disk tags))
54b0: 29 0a 20 20 20 20 20 64 62 20 22 53 45 4c 45 43  ).     db "SELEC
54c0: 54 20 69 64 2c 74 65 73 74 6e 61 6d 65 2c 61 75  T id,testname,au
54d0: 74 68 6f 72 2c 6f 77 6e 65 72 2c 64 65 73 63 72  thor,owner,descr
54e0: 69 70 74 69 6f 6e 2c 72 65 76 69 65 77 65 64 2c  iption,reviewed,
54f0: 69 74 65 72 61 74 65 64 2c 61 76 67 5f 72 75 6e  iterated,avg_run
5500: 74 69 6d 65 2c 61 76 67 5f 64 69 73 6b 2c 74 61  time,avg_disk,ta
5510: 67 73 20 46 52 4f 4d 20 74 65 73 74 5f 6d 65 74  gs FROM test_met
5520: 61 20 57 48 45 52 45 20 74 65 73 74 6e 61 6d 65  a WHERE testname
5530: 3d 3f 3b 22 0a 20 20 20 20 20 74 65 73 74 6e 61  =?;".     testna
5540: 6d 65 29 0a 20 20 20 20 72 65 73 29 29 0a 0a 3b  me).    res))..;
5550: 3b 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 72  ; create a new r
5560: 65 63 6f 72 64 20 66 6f 72 20 61 20 67 69 76 65  ecord for a give
5570: 6e 20 74 65 73 74 6e 61 6d 65 0a 28 64 65 66 69  n testname.(defi
5580: 6e 65 20 28 64 62 3a 74 65 73 74 6d 65 74 61 2d  ne (db:testmeta-
5590: 61 64 64 2d 72 65 63 6f 72 64 20 64 62 20 74 65  add-record db te
55a0: 73 74 6e 61 6d 65 29 0a 20 20 28 73 71 6c 69 74  stname).  (sqlit
55b0: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 49  e3:execute db "I
55c0: 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20  NSERT OR IGNORE 
55d0: 49 4e 54 4f 20 74 65 73 74 5f 6d 65 74 61 20 28  INTO test_meta (
55e0: 74 65 73 74 6e 61 6d 65 2c 61 75 74 68 6f 72 2c  testname,author,
55f0: 6f 77 6e 65 72 2c 64 65 73 63 72 69 70 74 69 6f  owner,descriptio
5600: 6e 2c 72 65 76 69 65 77 65 64 2c 69 74 65 72 61  n,reviewed,itera
5610: 74 65 64 2c 61 76 67 5f 72 75 6e 74 69 6d 65 2c  ted,avg_runtime,
5620: 61 76 67 5f 64 69 73 6b 2c 74 61 67 73 29 20 56  avg_disk,tags) V
5630: 41 4c 55 45 53 20 28 3f 2c 27 27 2c 27 27 2c 27  ALUES (?,'','','
5640: 27 2c 27 27 2c 27 27 2c 27 27 2c 27 27 2c 27 27  ','','','','',''
5650: 29 3b 22 20 74 65 73 74 6e 61 6d 65 29 29 0a 0a  );" testname))..
5660: 3b 3b 20 75 70 64 61 74 65 20 6f 6e 65 20 6f 66  ;; update one of
5670: 20 74 68 65 20 74 65 73 74 6d 65 74 61 20 66 69   the testmeta fi
5680: 65 6c 64 73 0a 28 64 65 66 69 6e 65 20 28 64 62  elds.(define (db
5690: 3a 74 65 73 74 6d 65 74 61 2d 75 70 64 61 74 65  :testmeta-update
56a0: 2d 66 69 65 6c 64 20 64 62 20 74 65 73 74 6e 61  -field db testna
56b0: 6d 65 20 66 69 65 6c 64 20 76 61 6c 75 65 29 0a  me field value).
56c0: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
56d0: 74 65 20 64 62 20 28 63 6f 6e 63 20 22 55 50 44  te db (conc "UPD
56e0: 41 54 45 20 74 65 73 74 5f 6d 65 74 61 20 53 45  ATE test_meta SE
56f0: 54 20 22 20 66 69 65 6c 64 20 22 3d 3f 20 57 48  T " field "=? WH
5700: 45 52 45 20 74 65 73 74 6e 61 6d 65 3d 3f 3b 22  ERE testname=?;"
5710: 29 20 76 61 6c 75 65 20 74 65 73 74 6e 61 6d 65  ) value testname
5720: 29 29 0a 0a 3b 3b 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 3d 3d 3d 3d 3d 3d 0a 3b 3b 20  ============.;; 
5770: 54 20 45 20 53 20 54 20 20 20 44 20 41 20 54 20  T E S T   D A T 
5780: 41 20 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  A .;;===========
5790: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
57a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
57b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
57c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65  ===========..(de
57d0: 66 69 6e 65 20 28 64 62 3a 63 73 76 2d 3e 74 65  fine (db:csv->te
57e0: 73 74 2d 64 61 74 61 20 64 62 20 74 65 73 74 2d  st-data db test-
57f0: 69 64 20 63 73 76 64 61 74 61 29 0a 20 20 28 64  id csvdata).  (d
5800: 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22 74 65  ebug:print 4 "te
5810: 73 74 2d 69 64 20 22 20 74 65 73 74 2d 69 64 20  st-id " test-id 
5820: 22 2c 20 63 73 76 64 61 74 61 3a 20 22 20 63 73  ", csvdata: " cs
5830: 76 64 61 74 61 29 0a 20 20 28 6c 65 74 20 28 28  vdata).  (let ((
5840: 63 73 76 6c 69 73 74 20 28 63 73 76 2d 3e 6c 69  csvlist (csv->li
5850: 73 74 20 28 6d 61 6b 65 2d 63 73 76 2d 72 65 61  st (make-csv-rea
5860: 64 65 72 0a 09 09 09 20 20 20 20 20 28 6f 70 65  der....     (ope
5870: 6e 2d 69 6e 70 75 74 2d 73 74 72 69 6e 67 20 63  n-input-string c
5880: 73 76 64 61 74 61 29 0a 09 09 09 20 20 20 20 20  svdata)....     
5890: 27 28 28 73 74 72 69 70 2d 6c 65 61 64 69 6e 67  '((strip-leading
58a0: 2d 77 68 69 74 65 73 70 61 63 65 3f 20 23 74 29  -whitespace? #t)
58b0: 0a 09 09 09 20 20 20 20 20 20 20 28 73 74 72 69  ....       (stri
58c0: 70 2d 74 72 61 69 6c 69 6e 67 2d 77 68 69 74 65  p-trailing-white
58d0: 73 70 61 63 65 3f 20 23 74 29 29 20 29 29 29 29  space? #t)) ))))
58e0: 20 3b 3b 20 28 63 73 76 2d 3e 6c 69 73 74 20 63   ;; (csv->list c
58f0: 73 76 64 61 74 61 29 29 29 0a 20 20 20 20 28 66  svdata))).    (f
5900: 6f 72 2d 65 61 63 68 20 0a 20 20 20 20 20 28 6c  or-each .     (l
5910: 61 6d 62 64 61 20 28 63 73 76 72 6f 77 29 0a 20  ambda (csvrow). 
5920: 20 20 20 20 20 20 28 6c 65 74 2a 20 28 28 70 61        (let* ((pa
5930: 64 64 65 64 2d 72 6f 77 20 20 28 74 61 6b 65 20  dded-row  (take 
5940: 28 61 70 70 65 6e 64 20 63 73 76 72 6f 77 20 28  (append csvrow (
5950: 6c 69 73 74 20 23 66 20 23 66 20 23 66 20 23 66  list #f #f #f #f
5960: 20 23 66 20 23 66 20 23 66 20 23 66 29 29 20 38   #f #f #f #f)) 8
5970: 29 29 0a 09 20 20 20 20 20 20 28 63 61 74 65 67  ))..      (categ
5980: 6f 72 79 20 20 20 20 28 6c 69 73 74 2d 72 65 66  ory    (list-ref
5990: 20 70 61 64 64 65 64 2d 72 6f 77 20 30 29 29 0a   padded-row 0)).
59a0: 09 20 20 20 20 20 20 28 76 61 72 69 61 62 6c 65  .      (variable
59b0: 20 20 20 20 28 6c 69 73 74 2d 72 65 66 20 70 61      (list-ref pa
59c0: 64 64 65 64 2d 72 6f 77 20 31 29 29 0a 09 20 20  dded-row 1))..  
59d0: 20 20 20 20 28 76 61 6c 75 65 20 20 20 20 20 20      (value      
59e0: 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 2d 69 66   (any->number-if
59f0: 2d 70 6f 73 73 69 62 6c 65 20 28 6c 69 73 74 2d  -possible (list-
5a00: 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20 32  ref padded-row 2
5a10: 29 29 29 0a 09 20 20 20 20 20 20 28 65 78 70 65  )))..      (expe
5a20: 63 74 65 64 20 20 20 20 28 61 6e 79 2d 3e 6e 75  cted    (any->nu
5a30: 6d 62 65 72 2d 69 66 2d 70 6f 73 73 69 62 6c 65  mber-if-possible
5a40: 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65   (list-ref padde
5a50: 64 2d 72 6f 77 20 33 29 29 29 0a 09 20 20 20 20  d-row 3)))..    
5a60: 20 20 28 74 6f 6c 20 20 20 20 20 20 20 20 20 28    (tol         (
5a70: 61 6e 79 2d 3e 6e 75 6d 62 65 72 2d 69 66 2d 70  any->number-if-p
5a80: 6f 73 73 69 62 6c 65 20 28 6c 69 73 74 2d 72 65  ossible (list-re
5a90: 66 20 70 61 64 64 65 64 2d 72 6f 77 20 34 29 29  f padded-row 4))
5aa0: 29 20 3b 3b 20 3e 2c 20 3c 2c 20 3e 3d 2c 20 3c  ) ;; >, <, >=, <
5ab0: 3d 2c 20 6f 72 20 61 20 6e 75 6d 62 65 72 0a 09  =, or a number..
5ac0: 20 20 20 20 20 20 28 75 6e 69 74 73 20 20 20 20        (units    
5ad0: 20 20 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64     (list-ref pad
5ae0: 64 65 64 2d 72 6f 77 20 35 29 29 0a 09 20 20 20  ded-row 5))..   
5af0: 20 20 20 28 63 6f 6d 6d 65 6e 74 20 20 20 20 20     (comment     
5b00: 28 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65 64  (list-ref padded
5b10: 2d 72 6f 77 20 36 29 29 0a 09 20 20 20 20 20 20  -row 6))..      
5b20: 28 73 74 61 74 75 73 20 20 20 20 20 20 28 6c 65  (status      (le
5b30: 74 20 28 28 73 20 28 6c 69 73 74 2d 72 65 66 20  t ((s (list-ref 
5b40: 70 61 64 64 65 64 2d 72 6f 77 20 37 29 29 29 0a  padded-row 7))).
5b50: 09 09 09 20 20 20 20 20 28 69 66 20 28 61 6e 64  ...     (if (and
5b60: 20 28 73 74 72 69 6e 67 3f 20 73 29 28 6f 72 20   (string? s)(or 
5b70: 28 73 74 72 69 6e 67 2d 6d 61 74 63 68 20 28 72  (string-match (r
5b80: 65 67 65 78 70 20 22 5e 5c 5c 73 2a 24 22 29 20  egexp "^\\s*$") 
5b90: 73 29 0a 09 09 09 09 09 09 20 20 20 20 20 28 73  s).......     (s
5ba0: 74 72 69 6e 67 2d 6d 61 74 63 68 20 28 72 65 67  tring-match (reg
5bb0: 65 78 70 20 22 5e 6e 2f 61 24 22 29 20 73 29 29  exp "^n/a$") s))
5bc0: 29 0a 09 09 09 09 20 23 66 0a 09 09 09 09 20 73  )..... #f..... s
5bd0: 29 29 29 29 20 3b 3b 20 69 66 20 73 70 65 63 69  )))) ;; if speci
5be0: 66 69 65 64 20 6f 6e 20 74 68 65 20 69 6e 70 75  fied on the inpu
5bf0: 74 20 74 68 65 6e 20 75 73 65 2c 20 65 6c 73 65  t then use, else
5c00: 20 63 61 6c 63 75 6c 61 74 65 0a 09 20 3b 3b 20   calculate.. ;; 
5c10: 6c 6f 6f 6b 20 75 70 20 65 78 70 65 63 74 65 64  look up expected
5c20: 2c 74 6f 6c 2c 75 6e 69 74 73 20 66 72 6f 6d 20  ,tol,units from 
5c30: 70 72 65 76 69 6f 75 73 20 62 65 73 74 20 66 69  previous best fi
5c40: 74 20 74 65 73 74 20 69 66 20 74 68 65 79 20 61  t test if they a
5c50: 72 65 20 61 6c 6c 20 65 69 74 68 65 72 20 23 66  re all either #f
5c60: 20 6f 72 20 27 27 0a 09 20 28 64 65 62 75 67 3a   or ''.. (debug:
5c70: 70 72 69 6e 74 20 34 20 22 42 45 46 4f 52 45 3a  print 4 "BEFORE:
5c80: 20 63 61 74 65 67 6f 72 79 3a 20 22 20 63 61 74   category: " cat
5c90: 65 67 6f 72 79 20 22 20 76 61 72 69 61 62 6c 65  egory " variable
5ca0: 3a 20 22 20 76 61 72 69 61 62 6c 65 20 22 20 76  : " variable " v
5cb0: 61 6c 75 65 3a 20 22 20 76 61 6c 75 65 20 0a 09  alue: " value ..
5cc0: 09 20 20 20 20 20 20 22 2c 20 65 78 70 65 63 74  .      ", expect
5cd0: 65 64 3a 20 22 20 65 78 70 65 63 74 65 64 20 22  ed: " expected "
5ce0: 20 74 6f 6c 3a 20 22 20 74 6f 6c 20 22 20 75 6e   tol: " tol " un
5cf0: 69 74 73 3a 20 22 20 75 6e 69 74 73 20 22 20 73  its: " units " s
5d00: 74 61 74 75 73 3a 20 22 20 73 74 61 74 75 73 20  tatus: " status 
5d10: 22 20 63 6f 6d 6d 65 6e 74 3a 20 22 20 63 6f 6d  " comment: " com
5d20: 6d 65 6e 74 29 0a 0a 09 20 28 69 66 20 28 61 6e  ment)... (if (an
5d30: 64 20 28 6f 72 20 28 6e 6f 74 20 65 78 70 65 63  d (or (not expec
5d40: 74 65 64 29 28 65 71 75 61 6c 3f 20 65 78 70 65  ted)(equal? expe
5d50: 63 74 65 64 20 22 22 29 29 0a 09 09 20 20 28 6f  cted ""))...  (o
5d60: 72 20 28 6e 6f 74 20 74 6f 6c 29 20 20 20 20 20  r (not tol)     
5d70: 28 65 71 75 61 6c 3f 20 65 78 70 65 63 74 65 64  (equal? expected
5d80: 20 22 22 29 29 0a 09 09 20 20 28 6f 72 20 28 6e   ""))...  (or (n
5d90: 6f 74 20 75 6e 69 74 73 29 20 20 20 28 65 71 75  ot units)   (equ
5da0: 61 6c 3f 20 65 78 70 65 63 74 65 64 20 22 22 29  al? expected "")
5db0: 29 29 0a 09 20 20 20 20 20 28 6c 65 74 2d 76 61  ))..     (let-va
5dc0: 6c 75 65 73 20 28 28 28 6e 65 77 2d 65 78 70 65  lues (((new-expe
5dd0: 63 74 65 64 20 6e 65 77 2d 74 6f 6c 20 6e 65 77  cted new-tol new
5de0: 2d 75 6e 69 74 73 29 28 64 62 3a 67 65 74 2d 70  -units)(db:get-p
5df0: 72 65 76 2d 74 6f 6c 2d 66 6f 72 2d 74 65 73 74  rev-tol-for-test
5e00: 20 64 62 20 74 65 73 74 2d 69 64 20 63 61 74 65   db test-id cate
5e10: 67 6f 72 79 20 76 61 72 69 61 62 6c 65 29 29 29  gory variable)))
5e20: 0a 09 20 20 20 20 20 20 20 28 73 65 74 21 20 65  ..       (set! e
5e30: 78 70 65 63 74 65 64 20 6e 65 77 2d 65 78 70 65  xpected new-expe
5e40: 63 74 65 64 29 0a 09 20 20 20 20 20 20 20 28 73  cted)..       (s
5e50: 65 74 21 20 74 6f 6c 20 20 20 20 20 20 6e 65 77  et! tol      new
5e60: 2d 74 6f 6c 29 0a 09 20 20 20 20 20 20 20 28 73  -tol)..       (s
5e70: 65 74 21 20 75 6e 69 74 73 20 20 20 20 6e 65 77  et! units    new
5e80: 2d 75 6e 69 74 73 29 29 29 0a 0a 09 20 28 64 65  -units)))... (de
5e90: 62 75 67 3a 70 72 69 6e 74 20 34 20 22 41 46 54  bug:print 4 "AFT
5ea0: 45 52 3a 20 20 63 61 74 65 67 6f 72 79 3a 20 22  ER:  category: "
5eb0: 20 63 61 74 65 67 6f 72 79 20 22 20 76 61 72 69   category " vari
5ec0: 61 62 6c 65 3a 20 22 20 76 61 72 69 61 62 6c 65  able: " variable
5ed0: 20 22 20 76 61 6c 75 65 3a 20 22 20 76 61 6c 75   " value: " valu
5ee0: 65 20 0a 09 09 20 20 20 20 20 20 22 2c 20 65 78  e ...      ", ex
5ef0: 70 65 63 74 65 64 3a 20 22 20 65 78 70 65 63 74  pected: " expect
5f00: 65 64 20 22 20 74 6f 6c 3a 20 22 20 74 6f 6c 20  ed " tol: " tol 
5f10: 22 20 75 6e 69 74 73 3a 20 22 20 75 6e 69 74 73  " units: " units
5f20: 20 22 20 73 74 61 74 75 73 3a 20 22 20 73 74 61   " status: " sta
5f30: 74 75 73 20 22 20 63 6f 6d 6d 65 6e 74 3a 20 22  tus " comment: "
5f40: 20 63 6f 6d 6d 65 6e 74 29 0a 09 20 3b 3b 20 63   comment).. ;; c
5f50: 61 6c 63 75 6c 61 74 65 20 73 74 61 74 75 73 20  alculate status 
5f60: 69 66 20 4e 4f 54 20 73 70 65 63 69 66 69 65 64  if NOT specified
5f70: 0a 09 20 28 69 66 20 28 61 6e 64 20 28 6e 6f 74  .. (if (and (not
5f80: 20 73 74 61 74 75 73 29 28 6e 75 6d 62 65 72 3f   status)(number?
5f90: 20 65 78 70 65 63 74 65 64 29 28 6e 75 6d 62 65   expected)(numbe
5fa0: 72 3f 20 76 61 6c 75 65 29 29 20 3b 3b 20 6e 65  r? value)) ;; ne
5fb0: 65 64 20 65 78 70 65 63 74 65 64 20 61 6e 64 20  ed expected and 
5fc0: 76 61 6c 75 65 20 74 6f 20 62 65 20 6e 75 6d 62  value to be numb
5fd0: 65 72 73 0a 09 20 20 20 20 20 28 69 66 20 28 6e  ers..     (if (n
5fe0: 75 6d 62 65 72 3f 20 74 6f 6c 29 20 3b 3b 20 69  umber? tol) ;; i
5ff0: 66 20 74 6f 6c 20 69 73 20 61 20 6e 75 6d 62 65  f tol is a numbe
6000: 72 20 74 68 65 6e 20 77 65 20 64 6f 20 74 68 65  r then we do the
6010: 20 73 74 61 6e 64 61 72 64 20 63 6f 6d 70 61 72   standard compar
6020: 69 73 6f 6e 0a 09 09 20 28 6c 65 74 2a 20 28 28  ison... (let* ((
6030: 6d 61 78 2d 76 61 6c 20 28 2b 20 65 78 70 65 63  max-val (+ expec
6040: 74 65 64 20 74 6f 6c 29 29 0a 09 09 09 28 6d 69  ted tol))....(mi
6050: 6e 2d 76 61 6c 20 28 2d 20 65 78 70 65 63 74 65  n-val (- expecte
6060: 64 20 74 6f 6c 29 29 0a 09 09 09 28 72 65 73 75  d tol))....(resu
6070: 6c 74 20 20 28 61 6e 64 20 28 3e 3d 20 20 76 61  lt  (and (>=  va
6080: 6c 75 65 20 6d 69 6e 2d 76 61 6c 29 28 3c 3d 20  lue min-val)(<= 
6090: 76 61 6c 75 65 20 6d 61 78 2d 76 61 6c 29 29 29  value max-val)))
60a0: 29 0a 09 09 20 20 20 28 64 65 62 75 67 3a 70 72  )...   (debug:pr
60b0: 69 6e 74 20 34 20 22 6d 61 78 2d 76 61 6c 3a 20  int 4 "max-val: 
60c0: 22 20 6d 61 78 2d 76 61 6c 20 22 20 6d 69 6e 2d  " max-val " min-
60d0: 76 61 6c 3a 20 22 20 6d 69 6e 2d 76 61 6c 20 22  val: " min-val "
60e0: 20 72 65 73 75 6c 74 3a 20 22 20 72 65 73 75 6c   result: " resul
60f0: 74 29 0a 09 09 20 20 20 28 73 65 74 21 20 73 74  t)...   (set! st
6100: 61 74 75 73 20 28 69 66 20 72 65 73 75 6c 74 20  atus (if result 
6110: 22 70 61 73 73 22 20 22 66 61 69 6c 22 29 29 29  "pass" "fail")))
6120: 0a 09 09 20 28 73 65 74 21 20 73 74 61 74 75 73  ... (set! status
6130: 20 3b 3b 20 4e 42 2f 2f 20 6e 65 65 64 20 74 6f   ;; NB// need to
6140: 20 61 73 73 65 73 73 20 65 61 63 68 20 6f 6e 65   assess each one
6150: 20 28 69 2e 65 2e 20 6e 6f 74 20 72 65 74 75 72   (i.e. not retur
6160: 6e 20 6f 70 65 72 61 74 6f 72 20 73 69 6e 63 65  n operator since
6170: 20 6e 65 65 64 20 74 6f 20 61 63 74 20 69 66 20   need to act if 
6180: 6e 6f 74 20 76 61 6c 69 64 20 6f 70 2e 0a 09 09  not valid op....
6190: 20 20 20 20 20 20 20 28 63 61 73 65 20 28 73 74         (case (st
61a0: 72 69 6e 67 2d 3e 73 79 6d 62 6f 6c 20 74 6f 6c  ring->symbol tol
61b0: 29 20 3b 3b 20 74 6f 6c 20 73 68 6f 75 6c 64 20  ) ;; tol should 
61c0: 62 65 20 3e 2c 20 3c 2c 20 3e 3d 2c 20 3c 3d 0a  be >, <, >=, <=.
61d0: 09 09 09 20 28 28 3e 29 20 20 28 69 66 20 28 3e  ... ((>)  (if (>
61e0: 20 20 76 61 6c 75 65 20 65 78 70 65 63 74 65 64    value expected
61f0: 29 20 22 70 61 73 73 22 20 22 66 61 69 6c 22 29  ) "pass" "fail")
6200: 29 0a 09 09 09 20 28 28 3c 29 20 20 28 69 66 20  ).... ((<)  (if 
6210: 28 3c 20 20 76 61 6c 75 65 20 65 78 70 65 63 74  (<  value expect
6220: 65 64 29 20 22 70 61 73 73 22 20 22 66 61 69 6c  ed) "pass" "fail
6230: 22 29 29 0a 09 09 09 20 28 28 3e 3d 29 20 28 69  ")).... ((>=) (i
6240: 66 20 28 3e 3d 20 76 61 6c 75 65 20 65 78 70 65  f (>= value expe
6250: 63 74 65 64 29 20 22 70 61 73 73 22 20 22 66 61  cted) "pass" "fa
6260: 69 6c 22 29 29 0a 09 09 09 20 28 28 3c 3d 29 20  il")).... ((<=) 
6270: 28 69 66 20 28 3c 3d 20 76 61 6c 75 65 20 65 78  (if (<= value ex
6280: 70 65 63 74 65 64 29 20 22 70 61 73 73 22 20 22  pected) "pass" "
6290: 66 61 69 6c 22 29 29 0a 09 09 09 20 28 65 6c 73  fail")).... (els
62a0: 65 20 28 63 6f 6e 63 20 22 45 52 52 4f 52 3a 20  e (conc "ERROR: 
62b0: 62 61 64 20 74 6f 6c 20 63 6f 6d 70 61 72 61 74  bad tol comparat
62c0: 6f 72 20 22 20 74 6f 6c 29 29 29 29 29 29 0a 09  or " tol))))))..
62d0: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20   (debug:print 4 
62e0: 22 41 46 54 45 52 32 3a 20 63 61 74 65 67 6f 72  "AFTER2: categor
62f0: 79 3a 20 22 20 63 61 74 65 67 6f 72 79 20 22 20  y: " category " 
6300: 76 61 72 69 61 62 6c 65 3a 20 22 20 76 61 72 69  variable: " vari
6310: 61 62 6c 65 20 22 20 76 61 6c 75 65 3a 20 22 20  able " value: " 
6320: 76 61 6c 75 65 20 0a 09 09 20 20 20 20 20 20 22  value ...      "
6330: 2c 20 65 78 70 65 63 74 65 64 3a 20 22 20 65 78  , expected: " ex
6340: 70 65 63 74 65 64 20 22 20 74 6f 6c 3a 20 22 20  pected " tol: " 
6350: 74 6f 6c 20 22 20 75 6e 69 74 73 3a 20 22 20 75  tol " units: " u
6360: 6e 69 74 73 20 22 20 73 74 61 74 75 73 3a 20 22  nits " status: "
6370: 20 73 74 61 74 75 73 20 22 20 63 6f 6d 6d 65 6e   status " commen
6380: 74 3a 20 22 20 63 6f 6d 6d 65 6e 74 29 0a 09 20  t: " comment).. 
6390: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
63a0: 20 64 62 20 22 49 4e 53 45 52 54 20 4f 52 20 52   db "INSERT OR R
63b0: 45 50 4c 41 43 45 20 49 4e 54 4f 20 74 65 73 74  EPLACE INTO test
63c0: 5f 64 61 74 61 20 28 74 65 73 74 5f 69 64 2c 63  _data (test_id,c
63d0: 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62 6c 65  ategory,variable
63e0: 2c 76 61 6c 75 65 2c 65 78 70 65 63 74 65 64 2c  ,value,expected,
63f0: 74 6f 6c 2c 75 6e 69 74 73 2c 63 6f 6d 6d 65 6e  tol,units,commen
6400: 74 2c 73 74 61 74 75 73 29 20 56 41 4c 55 45 53  t,status) VALUES
6410: 20 28 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c   (?,?,?,?,?,?,?,
6420: 3f 2c 3f 29 3b 22 0a 09 20 20 20 20 20 20 74 65  ?,?);"..      te
6430: 73 74 2d 69 64 20 63 61 74 65 67 6f 72 79 20 76  st-id category v
6440: 61 72 69 61 62 6c 65 20 76 61 6c 75 65 20 65 78  ariable value ex
6450: 70 65 63 74 65 64 20 74 6f 6c 20 75 6e 69 74 73  pected tol units
6460: 20 28 69 66 20 63 6f 6d 6d 65 6e 74 20 63 6f 6d   (if comment com
6470: 6d 65 6e 74 20 22 22 29 20 73 74 61 74 75 73 29  ment "") status)
6480: 29 29 0a 20 20 20 20 20 63 73 76 6c 69 73 74 29  )).     csvlist)
6490: 29 29 0a 0a 3b 3b 20 67 65 74 20 61 20 6c 69 73  ))..;; get a lis
64a0: 74 20 6f 66 20 74 65 73 74 5f 64 61 74 61 20 72  t of test_data r
64b0: 65 63 6f 72 64 73 20 6d 61 74 63 68 69 6e 67 20  ecords matching 
64c0: 63 61 74 65 67 6f 72 79 70 61 74 74 0a 28 64 65  categorypatt.(de
64d0: 66 69 6e 65 20 28 64 62 3a 72 65 61 64 2d 74 65  fine (db:read-te
64e0: 73 74 2d 64 61 74 61 20 64 62 20 74 65 73 74 2d  st-data db test-
64f0: 69 64 20 63 61 74 65 67 6f 72 79 70 61 74 74 29  id categorypatt)
6500: 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20 27 28  .  (let ((res '(
6510: 29 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33  ))).    (sqlite3
6520: 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20  :for-each-row . 
6530: 20 20 20 20 28 6c 61 6d 62 64 61 20 28 69 64 20      (lambda (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 0a 20 20 20 20 20 20 20 28 73 65 74 21 20  s).       (set! 
6590: 72 65 73 20 28 63 6f 6e 73 20 28 76 65 63 74 6f  res (cons (vecto
65a0: 72 20 69 64 20 74 65 73 74 5f 69 64 20 63 61 74  r id test_id cat
65b0: 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65 20 76  egory variable v
65c0: 61 6c 75 65 20 65 78 70 65 63 74 65 64 20 74 6f  alue expected to
65d0: 6c 20 75 6e 69 74 73 20 63 6f 6d 6d 65 6e 74 20  l units comment 
65e0: 73 74 61 74 75 73 29 20 72 65 73 29 29 29 0a 20  status) res))). 
65f0: 20 20 20 20 64 62 0a 20 20 20 20 20 22 53 45 4c      db.     "SEL
6600: 45 43 54 20 69 64 2c 74 65 73 74 5f 69 64 2c 63  ECT id,test_id,c
6610: 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62 6c 65  ategory,variable
6620: 2c 76 61 6c 75 65 2c 65 78 70 65 63 74 65 64 2c  ,value,expected,
6630: 74 6f 6c 2c 75 6e 69 74 73 2c 63 6f 6d 6d 65 6e  tol,units,commen
6640: 74 2c 73 74 61 74 75 73 20 46 52 4f 4d 20 74 65  t,status FROM te
6650: 73 74 5f 64 61 74 61 20 57 48 45 52 45 20 74 65  st_data WHERE te
6660: 73 74 5f 69 64 3d 3f 20 41 4e 44 20 63 61 74 65  st_id=? AND cate
6670: 67 6f 72 79 20 4c 49 4b 45 20 3f 20 4f 52 44 45  gory LIKE ? ORDE
6680: 52 20 42 59 20 63 61 74 65 67 6f 72 79 2c 76 61  R BY category,va
6690: 72 69 61 62 6c 65 3b 22 20 74 65 73 74 2d 69 64  riable;" test-id
66a0: 20 63 61 74 65 67 6f 72 79 70 61 74 74 29 0a 20   categorypatt). 
66b0: 20 20 20 28 72 65 76 65 72 73 65 20 72 65 73 29     (reverse res)
66c0: 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  ))..(define (db:
66d0: 6c 6f 61 64 2d 74 65 73 74 2d 64 61 74 61 20 64  load-test-data d
66e0: 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61  b run-id test-na
66f0: 6d 65 20 69 74 65 6d 64 61 74 29 0a 20 20 28 6c  me itemdat).  (l
6700: 65 74 2a 20 28 28 69 74 65 6d 2d 70 61 74 68 20  et* ((item-path 
6710: 28 69 74 65 6d 2d 6c 69 73 74 2d 3e 70 61 74 68  (item-list->path
6720: 20 69 74 65 6d 64 61 74 29 29 0a 09 20 28 74 65   itemdat)).. (te
6730: 73 74 64 61 74 20 28 64 62 3a 67 65 74 2d 74 65  stdat (db:get-te
6740: 73 74 2d 69 6e 66 6f 20 64 62 20 72 75 6e 2d 69  st-info db run-i
6750: 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d  d test-name item
6760: 2d 70 61 74 68 29 29 0a 09 20 28 74 65 73 74 2d  -path)).. (test-
6770: 69 64 20 28 69 66 20 74 65 73 74 64 61 74 20 28  id (if testdat (
6780: 64 62 3a 74 65 73 74 2d 67 65 74 2d 69 64 20 74  db:test-get-id t
6790: 65 73 74 64 61 74 29 20 23 66 29 29 29 0a 20 20  estdat) #f))).  
67a0: 20 20 3b 3b 20 28 64 65 62 75 67 3a 70 72 69 6e    ;; (debug:prin
67b0: 74 20 31 20 22 45 6e 74 65 72 20 72 65 63 6f 72  t 1 "Enter recor
67c0: 64 73 20 74 6f 20 69 6e 73 65 72 74 20 69 6e 20  ds to insert in 
67d0: 74 68 65 20 74 65 73 74 5f 64 61 74 61 20 74 61  the test_data ta
67e0: 62 6c 65 2c 20 73 65 76 65 6e 20 66 69 65 6c 64  ble, seven field
67f0: 73 2c 20 63 6f 6d 6d 61 20 73 65 70 61 72 61 74  s, comma separat
6800: 65 64 20 70 65 72 20 6c 69 6e 65 22 29 0a 20 20  ed per line").  
6810: 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34    (debug:print 4
6820: 20 22 69 74 65 6d 64 61 74 3a 20 22 20 69 74 65   "itemdat: " ite
6830: 6d 64 61 74 20 22 2c 20 74 65 73 74 2d 6e 61 6d  mdat ", test-nam
6840: 65 3a 20 22 20 74 65 73 74 2d 6e 61 6d 65 20 22  e: " test-name "
6850: 2c 20 74 65 73 74 2d 69 64 3a 20 22 20 74 65 73  , test-id: " tes
6860: 74 2d 69 64 29 0a 20 20 20 20 28 69 66 20 74 65  t-id).    (if te
6870: 73 74 2d 69 64 0a 09 28 6c 65 74 20 6c 6f 6f 70  st-id..(let loop
6880: 20 28 28 6c 69 6e 20 28 72 65 61 64 2d 6c 69 6e   ((lin (read-lin
6890: 65 29 29 29 0a 09 20 20 28 69 66 20 28 6e 6f 74  e)))..  (if (not
68a0: 20 28 65 6f 66 2d 6f 62 6a 65 63 74 3f 20 6c 69   (eof-object? li
68b0: 6e 29 29 0a 09 20 20 20 20 20 20 28 62 65 67 69  n))..      (begi
68c0: 6e 0a 09 09 28 64 65 62 75 67 3a 70 72 69 6e 74  n...(debug:print
68d0: 20 34 20 6c 69 6e 29 0a 09 09 28 64 62 3a 63 73   4 lin)...(db:cs
68e0: 76 2d 3e 74 65 73 74 2d 64 61 74 61 20 64 62 20  v->test-data db 
68f0: 74 65 73 74 2d 69 64 20 6c 69 6e 29 0a 09 09 28  test-id lin)...(
6900: 6c 6f 6f 70 20 28 72 65 61 64 2d 6c 69 6e 65 29  loop (read-line)
6910: 29 29 29 29 29 0a 20 20 20 20 3b 3b 20 72 6f 6c  ))))).    ;; rol
6920: 6c 20 75 70 20 74 68 65 20 63 75 72 72 65 6e 74  l up the current
6930: 20 72 65 73 75 6c 74 73 2e 0a 20 20 20 20 28 64   results..    (d
6940: 62 3a 74 65 73 74 2d 64 61 74 61 2d 72 6f 6c 6c  b:test-data-roll
6950: 75 70 20 64 62 20 74 65 73 74 2d 69 64 29 29 29  up db test-id)))
6960: 0a 20 20 0a 3b 3b 20 57 41 52 4e 49 4e 47 3a 20  .  .;; WARNING: 
6970: 44 6f 20 4e 4f 54 20 63 61 6c 6c 20 74 68 69 73  Do NOT call this
6980: 20 66 6f 72 20 74 68 65 20 70 61 72 65 6e 74 20   for the parent 
6990: 74 65 73 74 20 6f 6e 20 61 6e 20 69 74 65 72 61  test on an itera
69a0: 74 65 64 20 74 65 73 74 0a 3b 3b 20 52 6f 6c 6c  ted test.;; Roll
69b0: 20 75 70 20 74 65 73 74 5f 64 61 74 61 20 70 61   up test_data pa
69c0: 73 73 2f 66 61 69 6c 20 72 65 73 75 6c 74 73 0a  ss/fail results.
69d0: 3b 3b 20 6c 6f 6f 6b 20 61 74 20 74 68 65 20 74  ;; look at the t
69e0: 65 73 74 5f 64 61 74 61 20 73 74 61 74 75 73 20  est_data status 
69f0: 66 69 65 6c 64 2c 20 0a 3b 3b 20 20 20 20 69 66  field, .;;    if
6a00: 20 61 6c 6c 20 61 72 65 20 70 61 73 73 20 28 61   all are pass (a
6a10: 6e 79 20 63 61 73 65 29 20 61 6e 64 20 74 68 65  ny case) and the
6a20: 20 74 65 73 74 20 73 74 61 74 75 73 20 69 73 20   test status is 
6a30: 50 41 53 53 20 6f 72 20 4e 55 4c 4c 20 6f 72 20  PASS or NULL or 
6a40: 27 27 20 74 68 65 6e 20 73 65 74 20 74 65 73 74  '' then set test
6a50: 20 73 74 61 74 75 73 20 74 6f 20 50 41 53 53 2e   status to PASS.
6a60: 0a 3b 3b 20 20 20 20 69 66 20 6f 6e 65 20 6f 72  .;;    if one or
6a70: 20 6d 6f 72 65 20 61 72 65 20 66 61 69 6c 20 28   more are fail (
6a80: 61 6e 79 20 63 61 73 65 29 20 74 68 65 6e 20 73  any case) then s
6a90: 65 74 20 74 65 73 74 20 73 74 61 74 75 73 20 74  et test status t
6aa0: 6f 20 50 41 53 53 2c 20 6e 6f 6e 20 22 70 61 73  o PASS, non "pas
6ab0: 73 22 20 6f 72 20 22 66 61 69 6c 22 20 61 72 65  s" or "fail" are
6ac0: 20 69 67 6e 6f 72 65 64 0a 28 64 65 66 69 6e 65   ignored.(define
6ad0: 20 28 64 62 3a 74 65 73 74 2d 64 61 74 61 2d 72   (db:test-data-r
6ae0: 6f 6c 6c 75 70 20 64 62 20 74 65 73 74 2d 69 64  ollup db test-id
6af0: 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65  ).  (sqlite3:exe
6b00: 63 75 74 65 20 0a 20 20 20 64 62 20 0a 20 20 20  cute .   db .   
6b10: 22 55 50 44 41 54 45 20 74 65 73 74 73 20 0a 20  "UPDATE tests . 
6b20: 20 20 20 20 20 53 45 54 20 66 61 69 6c 5f 63 6f       SET fail_co
6b30: 75 6e 74 3d 28 53 45 4c 45 43 54 20 63 6f 75 6e  unt=(SELECT coun
6b40: 74 28 69 64 29 20 46 52 4f 4d 20 74 65 73 74 5f  t(id) FROM test_
6b50: 64 61 74 61 20 57 48 45 52 45 20 74 65 73 74 5f  data WHERE test_
6b60: 69 64 3d 3f 20 41 4e 44 20 73 74 61 74 75 73 20  id=? AND status 
6b70: 6c 69 6b 65 20 27 66 61 69 6c 27 29 2c 0a 20 20  like 'fail'),.  
6b80: 20 20 20 20 20 20 20 20 70 61 73 73 5f 63 6f 75          pass_cou
6b90: 6e 74 3d 28 53 45 4c 45 43 54 20 63 6f 75 6e 74  nt=(SELECT count
6ba0: 28 69 64 29 20 46 52 4f 4d 20 74 65 73 74 5f 64  (id) FROM test_d
6bb0: 61 74 61 20 57 48 45 52 45 20 74 65 73 74 5f 69  ata WHERE test_i
6bc0: 64 3d 3f 20 41 4e 44 20 73 74 61 74 75 73 20 6c  d=? AND status l
6bd0: 69 6b 65 20 27 70 61 73 73 27 29 0a 20 20 20 20  ike 'pass').    
6be0: 20 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 0a 20    WHERE id=?;". 
6bf0: 20 20 74 65 73 74 2d 69 64 20 74 65 73 74 2d 69    test-id test-i
6c00: 64 20 74 65 73 74 2d 69 64 29 0a 20 20 3b 3b 20  d test-id).  ;; 
6c10: 69 66 20 74 68 65 20 74 65 73 74 20 69 73 20 6e  if the test is n
6c20: 6f 74 20 46 41 49 4c 20 74 68 65 6e 20 73 65 74  ot FAIL then set
6c30: 20 73 74 61 74 75 73 20 62 61 73 65 64 20 6f 6e   status based on
6c40: 20 74 68 65 20 66 61 69 6c 20 61 6e 64 20 70 61   the fail and pa
6c50: 73 73 20 63 6f 75 6e 74 73 2e 0a 20 20 28 74 68  ss counts..  (th
6c60: 72 65 61 64 2d 73 6c 65 65 70 21 20 31 29 0a 20  read-sleep! 1). 
6c70: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
6c80: 65 0a 20 20 20 64 62 0a 20 20 20 22 55 50 44 41  e.   db.   "UPDA
6c90: 54 45 20 74 65 73 74 73 0a 20 20 20 20 20 20 53  TE tests.      S
6ca0: 45 54 20 73 74 61 74 75 73 3d 43 41 53 45 20 57  ET status=CASE W
6cb0: 48 45 4e 20 28 53 45 4c 45 43 54 20 66 61 69 6c  HEN (SELECT fail
6cc0: 5f 63 6f 75 6e 74 20 46 52 4f 4d 20 74 65 73 74  _count FROM test
6cd0: 73 20 57 48 45 52 45 20 69 64 3d 3f 29 20 3e 20  s WHERE id=?) > 
6ce0: 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0 .             
6cf0: 20 20 20 20 20 20 20 20 20 20 20 20 54 48 45 4e              THEN
6d00: 20 27 46 41 49 4c 27 0a 20 20 20 20 20 20 20 20   'FAIL'.        
6d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 48                WH
6d20: 45 4e 20 28 53 45 4c 45 43 54 20 70 61 73 73 5f  EN (SELECT pass_
6d30: 63 6f 75 6e 74 20 46 52 4f 4d 20 74 65 73 74 73  count FROM tests
6d40: 20 57 48 45 52 45 20 69 64 3d 3f 29 20 3e 20 30   WHERE id=?) > 0
6d50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6d60: 20 20 20 20 20 20 20 20 20 20 54 48 45 4e 20 27            THEN '
6d70: 50 41 53 53 27 0a 20 20 20 20 20 20 20 20 20 20  PASS'.          
6d80: 20 20 20 20 20 20 20 20 20 20 20 20 45 4c 53 45              ELSE
6d90: 20 73 74 61 74 75 73 0a 20 20 20 20 20 20 20 20   status.        
6da0: 20 20 20 20 20 20 20 20 20 20 45 4e 44 20 57 48            END WH
6db0: 45 52 45 20 69 64 3d 3f 3b 22 0a 20 20 20 74 65  ERE id=?;".   te
6dc0: 73 74 2d 69 64 20 74 65 73 74 2d 69 64 20 74 65  st-id test-id te
6dd0: 73 74 2d 69 64 29 29 0a 0a 28 64 65 66 69 6e 65  st-id))..(define
6de0: 20 28 64 62 3a 67 65 74 2d 70 72 65 76 2d 74 6f   (db:get-prev-to
6df0: 6c 2d 66 6f 72 2d 74 65 73 74 20 64 62 20 74 65  l-for-test db te
6e00: 73 74 2d 69 64 20 63 61 74 65 67 6f 72 79 20 76  st-id category v
6e10: 61 72 69 61 62 6c 65 29 0a 20 20 3b 3b 20 46 69  ariable).  ;; Fi
6e20: 6e 69 73 68 20 6d 65 3f 0a 20 20 28 76 61 6c 75  nish me?.  (valu
6e30: 65 73 20 23 66 20 23 66 20 23 66 29 29 0a 0a 3b  es #f #f #f))..;
6e40: 3b 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 3d 3d 3d 3d 3d 3d 3d  ================
6e80: 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 53 20 54 20 45  =======.;; S T E
6e90: 20 50 20 53 20 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d   P S .;;========
6ea0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6eb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6ec0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6ed0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a  ==============..
6ee0: 28 64 65 66 69 6e 65 20 28 64 62 3a 73 74 65 70  (define (db:step
6ef0: 2d 67 65 74 2d 74 69 6d 65 2d 61 73 2d 73 74 72  -get-time-as-str
6f00: 69 6e 67 20 76 65 63 29 0a 20 20 20 20 28 73 65  ing vec).    (se
6f10: 63 6f 6e 64 73 2d 3e 74 69 6d 65 2d 73 74 72 69  conds->time-stri
6f20: 6e 67 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d  ng (db:step-get-
6f30: 65 76 65 6e 74 5f 74 69 6d 65 20 76 65 63 29 29  event_time vec))
6f40: 29 0a 0a 3b 3b 20 64 62 2d 67 65 74 2d 74 65 73  )..;; db-get-tes
6f50: 74 2d 73 74 65 70 73 2d 66 6f 72 2d 72 75 6e 0a  t-steps-for-run.
6f60: 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d  (define (db:get-
6f70: 73 74 65 70 73 2d 66 6f 72 2d 74 65 73 74 20 64  steps-for-test d
6f80: 62 20 74 65 73 74 2d 69 64 29 0a 20 20 28 6c 65  b test-id).  (le
6f90: 74 20 28 28 72 65 73 20 27 28 29 29 29 0a 20 20  t ((res '())).  
6fa0: 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65    (sqlite3:for-e
6fb0: 61 63 68 2d 72 6f 77 20 0a 20 20 20 20 20 28 6c  ach-row .     (l
6fc0: 61 6d 62 64 61 20 28 69 64 20 74 65 73 74 2d 69  ambda (id test-i
6fd0: 64 20 73 74 65 70 6e 61 6d 65 20 73 74 61 74 65  d stepname state
6fe0: 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d 74 69   status event-ti
6ff0: 6d 65 20 6c 6f 67 66 69 6c 65 29 0a 20 20 20 20  me logfile).    
7000: 20 20 20 28 73 65 74 21 20 72 65 73 20 28 63 6f     (set! res (co
7010: 6e 73 20 28 76 65 63 74 6f 72 20 69 64 20 74 65  ns (vector id te
7020: 73 74 2d 69 64 20 73 74 65 70 6e 61 6d 65 20 73  st-id stepname s
7030: 74 61 74 65 20 73 74 61 74 75 73 20 65 76 65 6e  tate status even
7040: 74 2d 74 69 6d 65 20 28 69 66 20 28 73 74 72 69  t-time (if (stri
7050: 6e 67 3f 20 6c 6f 67 66 69 6c 65 29 20 6c 6f 67  ng? logfile) log
7060: 66 69 6c 65 20 22 22 29 29 20 72 65 73 29 29 29  file "")) res)))
7070: 0a 20 20 20 20 20 64 62 0a 20 20 20 20 20 22 53  .     db.     "S
7080: 45 4c 45 43 54 20 69 64 2c 74 65 73 74 5f 69 64  ELECT id,test_id
7090: 2c 73 74 65 70 6e 61 6d 65 2c 73 74 61 74 65 2c  ,stepname,state,
70a0: 73 74 61 74 75 73 2c 65 76 65 6e 74 5f 74 69 6d  status,event_tim
70b0: 65 2c 6c 6f 67 66 69 6c 65 20 46 52 4f 4d 20 74  e,logfile FROM t
70c0: 65 73 74 5f 73 74 65 70 73 20 57 48 45 52 45 20  est_steps WHERE 
70d0: 74 65 73 74 5f 69 64 3d 3f 20 4f 52 44 45 52 20  test_id=? ORDER 
70e0: 42 59 20 69 64 20 41 53 43 3b 22 20 3b 3b 20 65  BY id ASC;" ;; e
70f0: 76 65 6e 74 5f 74 69 6d 65 20 44 45 53 43 2c 69  vent_time DESC,i
7100: 64 20 41 53 43 3b 0a 20 20 20 20 20 74 65 73 74  d ASC;.     test
7110: 2d 69 64 29 0a 20 20 20 20 28 72 65 76 65 72 73  -id).    (revers
7120: 65 20 72 65 73 29 29 29 0a 0a 3b 3b 20 67 65 74  e res)))..;; get
7130: 20 61 20 70 72 65 74 74 79 20 74 61 62 6c 65 20   a pretty table 
7140: 74 6f 20 73 75 6d 6d 61 72 69 7a 65 20 73 74 65  to summarize ste
7150: 70 73 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 28 64  ps.;;.(define (d
7160: 62 3a 67 65 74 2d 73 74 65 70 73 2d 74 61 62 6c  b:get-steps-tabl
7170: 65 20 64 62 20 74 65 73 74 2d 69 64 29 0a 20 20  e db test-id).  
7180: 28 6c 65 74 20 28 28 73 74 65 70 73 20 20 20 28  (let ((steps   (
7190: 64 62 3a 67 65 74 2d 73 74 65 70 73 2d 66 6f 72  db:get-steps-for
71a0: 2d 74 65 73 74 20 64 62 20 74 65 73 74 2d 69 64  -test db test-id
71b0: 29 29 29 0a 20 20 20 20 3b 3b 20 6f 72 67 61 6e  ))).    ;; organ
71c0: 69 73 65 20 74 68 65 20 73 74 65 70 73 20 66 6f  ise the steps fo
71d0: 72 20 62 65 74 74 65 72 20 72 65 61 64 61 62 69  r better readabi
71e0: 6c 69 74 79 0a 20 20 20 20 28 6c 65 74 20 28 28  lity.    (let ((
71f0: 72 65 73 20 28 6d 61 6b 65 2d 68 61 73 68 2d 74  res (make-hash-t
7200: 61 62 6c 65 29 29 29 0a 20 20 20 20 20 20 28 66  able))).      (f
7210: 6f 72 2d 65 61 63 68 20 0a 20 20 20 20 20 20 20  or-each .       
7220: 28 6c 61 6d 62 64 61 20 28 73 74 65 70 29 0a 09  (lambda (step)..
7230: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 36 20   (debug:print 6 
7240: 22 73 74 65 70 3d 22 20 73 74 65 70 29 0a 09 20  "step=" step).. 
7250: 28 6c 65 74 20 28 28 72 65 63 6f 72 64 20 28 68  (let ((record (h
7260: 61 73 68 2d 74 61 62 6c 65 2d 72 65 66 2f 64 65  ash-table-ref/de
7270: 66 61 75 6c 74 20 0a 09 09 09 72 65 73 20 0a 09  fault ....res ..
7280: 09 09 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73  ..(db:step-get-s
7290: 74 65 70 6e 61 6d 65 20 73 74 65 70 29 20 0a 09  tepname step) ..
72a0: 09 09 3b 3b 20 20 20 20 20 20 20 20 73 74 65 70  ..;;        step
72b0: 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  name            
72c0: 20 20 20 20 73 74 61 72 74 20 65 6e 64 20 73 74      start end st
72d0: 61 74 75 73 20 20 20 20 0a 09 09 09 28 76 65 63  atus    ....(vec
72e0: 74 6f 72 20 28 64 62 3a 73 74 65 70 2d 67 65 74  tor (db:step-get
72f0: 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70 29 20  -stepname step) 
7300: 22 22 20 20 20 22 22 20 22 22 20 20 20 20 20 22  ""   "" ""     "
7310: 22 20 22 22 29 29 29 29 0a 09 20 20 20 28 64 65  " ""))))..   (de
7320: 62 75 67 3a 70 72 69 6e 74 20 36 20 22 72 65 63  bug:print 6 "rec
7330: 6f 72 64 28 62 65 66 6f 72 65 29 20 3d 20 22 20  ord(before) = " 
7340: 72 65 63 6f 72 64 20 0a 09 09 09 22 5c 6e 69 64  record ...."\nid
7350: 3a 20 20 20 20 20 20 20 22 20 28 64 62 3a 73 74  :       " (db:st
7360: 65 70 2d 67 65 74 2d 69 64 20 73 74 65 70 29 0a  ep-get-id step).
7370: 09 09 09 22 5c 6e 73 74 65 70 6e 61 6d 65 3a 20  ..."\nstepname: 
7380: 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73  " (db:step-get-s
7390: 74 65 70 6e 61 6d 65 20 73 74 65 70 29 0a 09 09  tepname step)...
73a0: 09 22 5c 6e 73 74 61 74 65 3a 20 20 20 20 22 20  ."\nstate:    " 
73b0: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61  (db:step-get-sta
73c0: 74 65 20 73 74 65 70 29 0a 09 09 09 22 5c 6e 73  te step)...."\ns
73d0: 74 61 74 75 73 3a 20 20 20 22 20 28 64 62 3a 73  tatus:   " (db:s
73e0: 74 65 70 2d 67 65 74 2d 73 74 61 74 75 73 20 73  tep-get-status s
73f0: 74 65 70 29 0a 09 09 09 22 5c 6e 74 69 6d 65 3a  tep)...."\ntime:
7400: 20 20 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d       " (db:step-
7410: 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73  get-event_time s
7420: 74 65 70 29 29 0a 09 20 20 20 28 63 61 73 65 20  tep))..   (case 
7430: 28 73 74 72 69 6e 67 2d 3e 73 79 6d 62 6f 6c 20  (string->symbol 
7440: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61  (db:step-get-sta
7450: 74 65 20 73 74 65 70 29 29 0a 09 20 20 20 20 20  te step))..     
7460: 28 28 73 74 61 72 74 29 28 76 65 63 74 6f 72 2d  ((start)(vector-
7470: 73 65 74 21 20 72 65 63 6f 72 64 20 31 20 28 64  set! record 1 (d
7480: 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74  b:step-get-event
7490: 5f 74 69 6d 65 20 73 74 65 70 29 29 0a 09 20 20  _time step))..  
74a0: 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21      (vector-set!
74b0: 20 72 65 63 6f 72 64 20 33 20 28 69 66 20 28 65   record 3 (if (e
74c0: 71 75 61 6c 3f 20 28 76 65 63 74 6f 72 2d 72 65  qual? (vector-re
74d0: 66 20 72 65 63 6f 72 64 20 33 29 20 22 22 29 0a  f record 3) "").
74e0: 09 09 09 09 09 28 64 62 3a 73 74 65 70 2d 67 65  .....(db:step-ge
74f0: 74 2d 73 74 61 74 75 73 20 73 74 65 70 29 29 29  t-status step)))
7500: 0a 09 20 20 20 20 20 20 28 69 66 20 28 3e 20 28  ..      (if (> (
7510: 73 74 72 69 6e 67 2d 6c 65 6e 67 74 68 20 28 64  string-length (d
7520: 62 3a 73 74 65 70 2d 67 65 74 2d 6c 6f 67 66 69  b:step-get-logfi
7530: 6c 65 20 73 74 65 70 29 29 0a 09 09 20 20 20 20  le step))...    
7540: 20 30 29 0a 09 09 20 20 28 76 65 63 74 6f 72 2d   0)...  (vector-
7550: 73 65 74 21 20 72 65 63 6f 72 64 20 35 20 28 64  set! record 5 (d
7560: 62 3a 73 74 65 70 2d 67 65 74 2d 6c 6f 67 66 69  b:step-get-logfi
7570: 6c 65 20 73 74 65 70 29 29 29 29 0a 09 20 20 20  le step))))..   
7580: 20 20 28 28 65 6e 64 29 20 20 0a 09 20 20 20 20    ((end)  ..    
7590: 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72    (vector-set! r
75a0: 65 63 6f 72 64 20 32 20 28 61 6e 79 2d 3e 6e 75  ecord 2 (any->nu
75b0: 6d 62 65 72 20 28 64 62 3a 73 74 65 70 2d 67 65  mber (db:step-ge
75c0: 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73 74 65  t-event_time ste
75d0: 70 29 29 29 0a 09 20 20 20 20 20 20 28 76 65 63  p)))..      (vec
75e0: 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20  tor-set! record 
75f0: 33 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73  3 (db:step-get-s
7600: 74 61 74 75 73 20 73 74 65 70 29 29 0a 09 20 20  tatus step))..  
7610: 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21      (vector-set!
7620: 20 72 65 63 6f 72 64 20 34 20 28 6c 65 74 20 28   record 4 (let (
7630: 28 73 74 61 72 74 74 20 28 61 6e 79 2d 3e 6e 75  (startt (any->nu
7640: 6d 62 65 72 20 28 76 65 63 74 6f 72 2d 72 65 66  mber (vector-ref
7650: 20 72 65 63 6f 72 64 20 31 29 29 29 0a 09 09 09   record 1)))....
7660: 09 09 20 20 28 65 6e 64 74 20 20 20 28 61 6e 79  ..  (endt   (any
7670: 2d 3e 6e 75 6d 62 65 72 20 28 76 65 63 74 6f 72  ->number (vector
7680: 2d 72 65 66 20 72 65 63 6f 72 64 20 32 29 29 29  -ref record 2)))
7690: 29 0a 09 09 09 09 20 20 20 20 20 20 28 64 65 62  ).....      (deb
76a0: 75 67 3a 70 72 69 6e 74 20 34 20 22 72 65 63 6f  ug:print 4 "reco
76b0: 72 64 5b 31 5d 3d 22 20 28 76 65 63 74 6f 72 2d  rd[1]=" (vector-
76c0: 72 65 66 20 72 65 63 6f 72 64 20 31 29 20 0a 09  ref record 1) ..
76d0: 09 09 09 09 09 20 20 20 22 2c 20 73 74 61 72 74  .....   ", start
76e0: 74 3d 22 20 73 74 61 72 74 74 20 22 2c 20 65 6e  t=" startt ", en
76f0: 64 74 3d 22 20 65 6e 64 74 0a 09 09 09 09 09 09  dt=" endt.......
7700: 20 20 20 22 2c 20 67 65 74 2d 73 74 61 74 75 73     ", get-status
7710: 3a 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74  : " (db:step-get
7720: 2d 73 74 61 74 75 73 20 73 74 65 70 29 29 0a 09  -status step))..
7730: 09 09 09 20 20 20 20 20 20 28 69 66 20 28 61 6e  ...      (if (an
7740: 64 20 28 6e 75 6d 62 65 72 3f 20 73 74 61 72 74  d (number? start
7750: 74 29 28 6e 75 6d 62 65 72 3f 20 65 6e 64 74 29  t)(number? endt)
7760: 29 0a 09 09 09 09 09 20 20 28 73 65 63 6f 6e 64  )......  (second
7770: 73 2d 3e 68 72 2d 6d 69 6e 2d 73 65 63 20 28 2d  s->hr-min-sec (-
7780: 20 65 6e 64 74 20 73 74 61 72 74 74 29 29 20 22   endt startt)) "
7790: 2d 31 22 29 29 29 0a 09 20 20 20 20 20 20 28 69  -1")))..      (i
77a0: 66 20 28 3e 20 28 73 74 72 69 6e 67 2d 6c 65 6e  f (> (string-len
77b0: 67 74 68 20 28 64 62 3a 73 74 65 70 2d 67 65 74  gth (db:step-get
77c0: 2d 6c 6f 67 66 69 6c 65 20 73 74 65 70 29 29 0a  -logfile step)).
77d0: 09 09 20 20 20 20 20 30 29 0a 09 09 20 20 28 76  ..     0)...  (v
77e0: 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72  ector-set! recor
77f0: 64 20 35 20 28 64 62 3a 73 74 65 70 2d 67 65 74  d 5 (db:step-get
7800: 2d 6c 6f 67 66 69 6c 65 20 73 74 65 70 29 29 29  -logfile step)))
7810: 29 0a 09 20 20 20 20 20 28 65 6c 73 65 0a 09 20  )..     (else.. 
7820: 20 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73         (vector-s
7830: 65 74 21 20 72 65 63 6f 72 64 20 32 20 28 64 62  et! record 2 (db
7840: 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 74 65 20  :step-get-state 
7850: 73 74 65 70 29 29 0a 09 20 20 20 20 20 20 20 20  step))..        
7860: 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63  (vector-set! rec
7870: 6f 72 64 20 33 20 28 64 62 3a 73 74 65 70 2d 67  ord 3 (db:step-g
7880: 65 74 2d 73 74 61 74 75 73 20 73 74 65 70 29 29  et-status step))
7890: 0a 09 20 20 20 20 20 20 20 20 28 76 65 63 74 6f  ..        (vecto
78a0: 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 34 20  r-set! record 4 
78b0: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65  (db:step-get-eve
78c0: 6e 74 5f 74 69 6d 65 20 73 74 65 70 29 29 29 29  nt_time step))))
78d0: 0a 09 20 20 20 28 68 61 73 68 2d 74 61 62 6c 65  ..   (hash-table
78e0: 2d 73 65 74 21 20 72 65 73 20 28 64 62 3a 73 74  -set! res (db:st
78f0: 65 70 2d 67 65 74 2d 73 74 65 70 6e 61 6d 65 20  ep-get-stepname 
7900: 73 74 65 70 29 20 72 65 63 6f 72 64 29 0a 09 20  step) record).. 
7910: 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 36    (debug:print 6
7920: 20 22 72 65 63 6f 72 64 28 61 66 74 65 72 29 20   "record(after) 
7930: 20 3d 20 22 20 72 65 63 6f 72 64 20 0a 09 09 09   = " record ....
7940: 22 5c 6e 69 64 3a 20 20 20 20 20 20 20 22 20 28  "\nid:       " (
7950: 64 62 3a 73 74 65 70 2d 67 65 74 2d 69 64 20 73  db:step-get-id s
7960: 74 65 70 29 0a 09 09 09 22 5c 6e 73 74 65 70 6e  tep)...."\nstepn
7970: 61 6d 65 3a 20 22 20 28 64 62 3a 73 74 65 70 2d  ame: " (db:step-
7980: 67 65 74 2d 73 74 65 70 6e 61 6d 65 20 73 74 65  get-stepname ste
7990: 70 29 0a 09 09 09 22 5c 6e 73 74 61 74 65 3a 20  p)...."\nstate: 
79a0: 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65     " (db:step-ge
79b0: 74 2d 73 74 61 74 65 20 73 74 65 70 29 0a 09 09  t-state step)...
79c0: 09 22 5c 6e 73 74 61 74 75 73 3a 20 20 20 22 20  ."\nstatus:   " 
79d0: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61  (db:step-get-sta
79e0: 74 75 73 20 73 74 65 70 29 0a 09 09 09 22 5c 6e  tus step)...."\n
79f0: 74 69 6d 65 3a 20 20 20 20 20 22 20 28 64 62 3a  time:     " (db:
7a00: 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74  step-get-event_t
7a10: 69 6d 65 20 73 74 65 70 29 29 29 29 0a 20 20 20  ime step)))).   
7a20: 20 20 20 20 3b 3b 20 28 65 6c 73 65 20 20 20 28      ;; (else   (
7a30: 76 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f  vector-set! reco
7a40: 72 64 20 31 20 28 64 62 3a 73 74 65 70 2d 67 65  rd 1 (db:step-ge
7a50: 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73 74 65  t-event_time ste
7a60: 70 29 29 29 0a 20 20 20 20 20 20 20 28 73 6f 72  p))).       (sor
7a70: 74 20 73 74 65 70 73 20 28 6c 61 6d 62 64 61 20  t steps (lambda 
7a80: 28 61 20 62 29 28 3c 20 28 64 62 3a 73 74 65 70  (a b)(< (db:step
7a90: 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20  -get-event_time 
7aa0: 61 29 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65  a)(db:step-get-e
7ab0: 76 65 6e 74 5f 74 69 6d 65 20 62 29 29 29 29 29  vent_time b)))))
7ac0: 0a 20 20 20 20 20 20 72 65 73 29 29 29 0a 0a 3b  .      res)))..;
7ad0: 3b 20 55 53 45 3a 20 28 6c 73 65 74 2d 64 69 66  ; USE: (lset-dif
7ae0: 66 65 72 65 6e 63 65 20 73 74 72 69 6e 67 3d 3f  ference string=?
7af0: 20 27 28 22 61 22 20 22 62 22 20 22 63 22 29 20   '("a" "b" "c") 
7b00: 27 28 22 64 22 20 22 63 22 20 22 65 22 20 22 61  '("d" "c" "e" "a
7b10: 22 29 29 0a 3b 3b 0a 3b 3b 20 52 65 74 75 72 6e  ")).;;.;; Return
7b20: 20 61 20 6c 69 73 74 20 6f 66 20 70 72 65 72 65   a list of prere
7b30: 71 73 20 74 68 61 74 20 77 65 72 65 20 4e 4f 54  qs that were NOT
7b40: 20 6d 65 74 0a 3b 3b 20 20 54 65 73 74 73 20 28   met.;;  Tests (
7b50: 61 6e 64 20 61 6c 6c 20 69 74 65 6d 73 29 20 69  and all items) i
7b60: 6e 20 77 61 69 74 6f 6e 20 6c 69 73 74 20 6d 75  n waiton list mu
7b70: 73 74 20 62 65 20 22 43 4f 4d 50 4c 45 54 45 44  st be "COMPLETED
7b80: 22 20 61 6e 64 20 22 50 41 53 53 22 0a 28 64 65  " and "PASS".(de
7b90: 66 69 6e 65 20 28 64 62 2d 67 65 74 2d 70 72 65  fine (db-get-pre
7ba0: 72 65 71 73 2d 6e 6f 74 2d 6d 65 74 20 64 62 20  reqs-not-met db 
7bb0: 72 75 6e 2d 69 64 20 77 61 69 74 6f 6e 29 0a 20  run-id waiton). 
7bc0: 20 28 69 66 20 28 6e 75 6c 6c 3f 20 77 61 69 74   (if (null? wait
7bd0: 6f 6e 29 0a 20 20 20 20 20 20 27 28 29 0a 20 20  on).      '().  
7be0: 20 20 20 20 28 6c 65 74 2a 20 28 28 75 6e 6d 65      (let* ((unme
7bf0: 74 2d 70 72 65 2d 72 65 71 73 20 27 28 29 29 0a  t-pre-reqs '()).
7c00: 09 20 20 20 20 20 28 74 65 73 74 73 20 20 20 20  .     (tests    
7c10: 20 20 20 20 20 20 20 28 64 62 2d 67 65 74 2d 74         (db-get-t
7c20: 65 73 74 73 2d 66 6f 72 2d 72 75 6e 20 64 62 20  ests-for-run db 
7c30: 72 75 6e 2d 69 64 20 23 66 20 23 66 20 27 28 29  run-id #f #f '()
7c40: 20 27 28 29 29 29 0a 09 20 20 20 20 20 28 72 65   '()))..     (re
7c50: 73 75 6c 74 20 20 20 20 20 20 20 20 20 27 28 29  sult         '()
7c60: 29 29 0a 09 28 66 6f 72 2d 65 61 63 68 20 28 6c  ))..(for-each (l
7c70: 61 6d 62 64 61 20 28 77 61 69 74 6f 6e 74 65 73  ambda (waitontes
7c80: 74 2d 6e 61 6d 65 29 0a 09 09 20 20 20 20 28 6c  t-name)...    (l
7c90: 65 74 20 28 28 65 76 65 72 2d 73 65 65 6e 20 23  et ((ever-seen #
7ca0: 66 29 29 0a 09 09 20 20 20 20 20 20 28 66 6f 72  f))...      (for
7cb0: 2d 65 61 63 68 20 28 6c 61 6d 62 64 61 20 28 74  -each (lambda (t
7cc0: 65 73 74 29 0a 09 09 09 09 20 20 28 69 66 20 28  est).....  (if (
7cd0: 65 71 75 61 6c 3f 20 77 61 69 74 6f 6e 74 65 73  equal? waitontes
7ce0: 74 2d 6e 61 6d 65 20 28 64 62 3a 74 65 73 74 2d  t-name (db:test-
7cf0: 67 65 74 2d 74 65 73 74 6e 61 6d 65 20 74 65 73  get-testname tes
7d00: 74 29 29 0a 09 09 09 09 20 20 20 20 20 20 28 62  t)).....      (b
7d10: 65 67 69 6e 0a 09 09 09 09 09 28 73 65 74 21 20  egin......(set! 
7d20: 65 76 65 72 2d 73 65 65 6e 20 23 74 29 0a 09 09  ever-seen #t)...
7d30: 09 09 09 28 69 66 20 28 6e 6f 74 20 28 61 6e 64  ...(if (not (and
7d40: 20 28 65 71 75 61 6c 3f 20 28 64 62 3a 74 65 73   (equal? (db:tes
7d50: 74 2d 67 65 74 2d 73 74 61 74 65 20 74 65 73 74  t-get-state test
7d60: 29 20 22 43 4f 4d 50 4c 45 54 45 44 22 29 0a 09  ) "COMPLETED")..
7d70: 09 09 09 09 09 20 20 20 20 20 20 28 6d 65 6d 62  .....      (memb
7d80: 65 72 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d  er (db:test-get-
7d90: 73 74 61 74 75 73 20 74 65 73 74 29 20 27 28 22  status test) '("
7da0: 50 41 53 53 22 20 22 57 41 52 4e 22 20 22 43 48  PASS" "WARN" "CH
7db0: 45 43 4b 22 29 29 29 29 0a 09 09 09 09 09 20 20  ECK"))))......  
7dc0: 20 20 28 73 65 74 21 20 72 65 73 75 6c 74 20 28    (set! result (
7dd0: 63 6f 6e 73 20 77 61 69 74 6f 6e 74 65 73 74 2d  cons waitontest-
7de0: 6e 61 6d 65 20 72 65 73 75 6c 74 29 29 29 29 29  name result)))))
7df0: 29 0a 09 09 09 09 74 65 73 74 73 29 0a 09 09 20  ).....tests)... 
7e00: 20 20 20 20 20 28 69 66 20 28 6e 6f 74 20 65 76       (if (not ev
7e10: 65 72 2d 73 65 65 6e 29 28 73 65 74 21 20 72 65  er-seen)(set! re
7e20: 73 75 6c 74 20 28 63 6f 6e 73 20 77 61 69 74 6f  sult (cons waito
7e30: 6e 74 65 73 74 2d 6e 61 6d 65 20 72 65 73 75 6c  ntest-name resul
7e40: 74 29 29 29 29 29 0a 09 09 20 20 77 61 69 74 6f  t)))))...  waito
7e50: 6e 29 0a 09 28 64 65 6c 65 74 65 2d 64 75 70 6c  n)..(delete-dupl
7e60: 69 63 61 74 65 73 20 72 65 73 75 6c 74 29 29 29  icates result)))
7e70: 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  )..;;===========
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 0a 3b 3b 20 45  ===========.;; E
7ec0: 78 74 72 61 63 74 20 6f 64 73 20 66 69 6c 65 20  xtract ods file 
7ed0: 66 72 6f 6d 20 74 68 65 20 64 62 0a 3b 3b 3d 3d  from the db.;;==
7ee0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7ef0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7f00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7f10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7f20: 3d 3d 3d 3d 0a 0a 3b 3b 20 72 75 6e 73 70 61 74  ====..;; runspat
7f30: 74 20 69 73 20 61 20 63 6f 6d 6d 61 20 64 65 6c  t is a comma del
7f40: 69 6d 69 74 65 64 20 6c 69 73 74 20 6f 66 20 72  imited list of r
7f50: 75 6e 20 70 61 74 74 65 72 6e 73 0a 3b 3b 20 6b  un patterns.;; k
7f60: 65 79 70 61 74 74 2d 61 6c 69 73 74 20 6d 75 73  eypatt-alist mus
7f70: 74 20 63 6f 6e 74 61 69 6e 20 2a 61 6c 6c 2a 20  t contain *all* 
7f80: 6b 65 79 73 20 77 69 74 68 20 61 6e 20 61 73 73  keys with an ass
7f90: 6f 63 69 61 74 65 64 20 70 61 74 74 65 72 6e 3a  ociated pattern:
7fa0: 20 27 28 20 28 22 4b 45 59 31 22 20 22 25 22 29   '( ("KEY1" "%")
7fb0: 20 2e 2e 20 29 0a 28 64 65 66 69 6e 65 20 28 64   .. ).(define (d
7fc0: 62 3a 65 78 74 72 61 63 74 2d 6f 64 73 2d 66 69  b:extract-ods-fi
7fd0: 6c 65 20 64 62 20 6f 75 74 70 75 74 66 69 6c 65  le db outputfile
7fe0: 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 20 72   keypatt-alist r
7ff0: 75 6e 73 70 61 74 74 20 70 61 74 68 6d 6f 64 29  unspatt pathmod)
8000: 0a 20 20 28 6c 65 74 2a 20 28 28 6b 65 79 73 73  .  (let* ((keyss
8010: 74 72 20 20 28 73 74 72 69 6e 67 2d 69 6e 74 65  tr  (string-inte
8020: 72 73 70 65 72 73 65 20 28 6d 61 70 20 63 61 72  rsperse (map car
8030: 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 29 20   keypatt-alist) 
8040: 22 2c 22 29 29 0a 09 20 28 6b 65 79 71 72 79 20  ",")).. (keyqry 
8050: 20 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73    (string-inters
8060: 70 65 72 73 65 20 28 6d 61 70 20 28 6c 61 6d 62  perse (map (lamb
8070: 64 61 20 28 70 29 28 63 6f 6e 63 20 28 63 61 72  da (p)(conc (car
8080: 20 70 29 20 22 20 4c 49 4b 45 20 3f 20 22 29 29   p) " LIKE ? "))
8090: 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 29 20   keypatt-alist) 
80a0: 22 20 41 4e 44 20 22 29 29 0a 09 20 28 6e 75 6d  " AND ")).. (num
80b0: 6b 65 79 73 20 20 28 6c 65 6e 67 74 68 20 6b 65  keys  (length ke
80c0: 79 70 61 74 74 2d 61 6c 69 73 74 29 29 0a 09 20  ypatt-alist)).. 
80d0: 28 74 65 73 74 2d 69 64 73 20 27 28 29 29 0a 09  (test-ids '())..
80e0: 20 28 77 69 6e 64 6f 77 73 20 20 28 61 6e 64 20   (windows  (and 
80f0: 70 61 74 68 6d 6f 64 20 28 73 75 62 73 74 72 69  pathmod (substri
8100: 6e 67 2d 69 6e 64 65 78 20 22 5c 5c 22 20 70 61  ng-index "\\" pa
8110: 74 68 6d 6f 64 29 29 29 0a 09 20 28 74 65 6d 70  thmod))).. (temp
8120: 64 69 72 20 20 28 63 6f 6e 63 20 22 2f 74 6d 70  dir  (conc "/tmp
8130: 2f 22 20 28 63 75 72 72 65 6e 74 2d 75 73 65 72  /" (current-user
8140: 2d 6e 61 6d 65 29 20 22 2f 22 20 72 75 6e 73 70  -name) "/" runsp
8150: 61 74 74 20 22 5f 22 20 28 72 61 6e 64 6f 6d 20  att "_" (random 
8160: 31 30 30 30 30 29 20 22 5f 22 20 28 63 75 72 72  10000) "_" (curr
8170: 65 6e 74 2d 70 72 6f 63 65 73 73 2d 69 64 29 29  ent-process-id))
8180: 29 0a 09 20 28 72 75 6e 73 68 65 61 64 65 72 20  ).. (runsheader 
8190: 28 61 70 70 65 6e 64 20 28 6c 69 73 74 20 22 52  (append (list "R
81a0: 75 6e 20 49 64 22 20 22 52 75 6e 6e 61 6d 65 22  un Id" "Runname"
81b0: 29 20 3b 20 30 20 31 0a 09 09 09 20 20 20 20 20  ) ; 0 1....     
81c0: 28 6d 61 70 20 63 61 72 20 6b 65 79 70 61 74 74  (map car keypatt
81d0: 2d 61 6c 69 73 74 29 20 20 20 3b 20 2b 20 4e 20  -alist)   ; + N 
81e0: 3d 20 6c 65 6e 67 74 68 20 6b 65 79 70 61 74 74  = length keypatt
81f0: 2d 61 6c 69 73 74 0a 09 09 09 20 20 20 20 20 28  -alist....     (
8200: 6c 69 73 74 20 22 54 65 73 74 6e 61 6d 65 22 20  list "Testname" 
8210: 20 20 20 20 20 20 20 20 20 3b 20 32 0a 09 09 09           ; 2....
8220: 09 20 20 20 22 49 74 65 6d 20 50 61 74 68 22 20  .   "Item Path" 
8230: 20 20 20 20 20 20 20 20 3b 20 33 20 0a 09 09 09          ; 3 ....
8240: 09 20 20 20 22 44 65 73 63 72 69 70 74 69 6f 6e  .   "Description
8250: 22 20 20 20 20 20 20 20 3b 20 34 20 0a 09 09 09  "       ; 4 ....
8260: 09 20 20 20 22 53 74 61 74 65 22 20 20 20 20 20  .   "State"     
8270: 20 20 20 20 20 20 20 20 3b 20 35 20 0a 09 09 09          ; 5 ....
8280: 09 20 20 20 22 53 74 61 74 75 73 22 20 20 20 20  .   "Status"    
8290: 20 20 20 20 20 20 20 20 3b 20 36 20 20 0a 09 09          ; 6  ...
82a0: 09 09 20 20 20 22 46 69 6e 61 6c 20 4c 6f 67 22  ..   "Final Log"
82b0: 20 20 20 20 20 20 20 20 20 3b 20 37 20 0a 09 09           ; 7 ...
82c0: 09 09 20 20 20 22 52 75 6e 20 44 75 72 61 74 69  ..   "Run Durati
82d0: 6f 6e 22 20 20 20 20 20 20 3b 20 38 20 0a 09 09  on"      ; 8 ...
82e0: 09 09 20 20 20 22 57 68 65 6e 20 52 75 6e 22 20  ..   "When Run" 
82f0: 20 20 20 20 20 20 20 20 20 3b 20 39 20 0a 09 09           ; 9 ...
8300: 09 09 20 20 20 22 54 61 67 73 22 20 20 20 20 20  ..   "Tags"     
8310: 20 20 20 20 20 20 20 20 20 3b 20 31 30 0a 09 09           ; 10...
8320: 09 09 20 20 20 22 52 75 6e 20 4f 77 6e 65 72 22  ..   "Run Owner"
8330: 20 20 20 20 20 20 20 20 20 3b 20 31 31 0a 09 09           ; 11...
8340: 09 09 20 20 20 22 43 6f 6d 6d 65 6e 74 22 20 20  ..   "Comment"  
8350: 20 20 20 20 20 20 20 20 20 3b 20 31 32 0a 09 09           ; 12...
8360: 09 09 20 20 20 22 41 75 74 68 6f 72 22 20 20 20  ..   "Author"   
8370: 20 20 20 20 20 20 20 20 20 3b 20 31 33 0a 09 09           ; 13...
8380: 09 09 20 20 20 22 54 65 73 74 20 4f 77 6e 65 72  ..   "Test Owner
8390: 22 20 20 20 20 20 20 20 20 3b 20 31 34 0a 09 09  "        ; 14...
83a0: 09 09 20 20 20 22 52 65 76 69 65 77 65 64 22 20  ..   "Reviewed" 
83b0: 20 20 20 20 20 20 20 20 20 3b 20 31 35 0a 09 09           ; 15...
83c0: 09 09 20 20 20 22 44 69 73 6b 66 72 65 65 22 20  ..   "Diskfree" 
83d0: 20 20 20 20 20 20 20 20 20 3b 20 31 36 0a 09 09           ; 16...
83e0: 09 09 20 20 20 22 55 6e 61 6d 65 22 20 20 20 20  ..   "Uname"    
83f0: 20 20 20 20 20 20 20 20 20 3b 20 31 37 0a 09 09           ; 17...
8400: 09 09 20 20 20 22 52 75 6e 64 69 72 22 20 20 20  ..   "Rundir"   
8410: 20 20 20 20 20 20 20 20 20 3b 20 31 38 0a 09 09           ; 18...
8420: 09 09 20 20 20 22 48 6f 73 74 22 20 20 20 20 20  ..   "Host"     
8430: 20 20 20 20 20 20 20 20 20 3b 20 31 39 0a 09 09           ; 19...
8440: 09 09 20 20 20 22 43 70 75 20 4c 6f 61 64 22 20  ..   "Cpu Load" 
8450: 20 20 20 20 20 20 20 20 20 3b 20 32 30 0a 09 09           ; 20...
8460: 09 09 20 20 20 29 29 29 0a 09 20 28 72 65 73 75  ..   ))).. (resu
8470: 6c 74 73 20 28 6c 69 73 74 20 72 75 6e 73 68 65  lts (list runshe
8480: 61 64 65 72 29 29 09 09 09 20 0a 09 20 28 74 65  ader))... .. (te
8490: 73 74 64 61 74 61 2d 68 65 61 64 65 72 20 28 6c  stdata-header (l
84a0: 69 73 74 20 22 52 75 6e 20 49 64 22 20 22 54 65  ist "Run Id" "Te
84b0: 73 74 6e 61 6d 65 22 20 22 49 74 65 6d 20 50 61  stname" "Item Pa
84c0: 74 68 22 20 22 43 61 74 65 67 6f 72 79 22 20 22  th" "Category" "
84d0: 56 61 72 69 61 62 6c 65 22 20 22 56 61 6c 75 65  Variable" "Value
84e0: 22 20 22 45 78 70 65 63 74 65 64 22 20 22 54 6f  " "Expected" "To
84f0: 6c 22 20 22 55 6e 69 74 73 22 20 22 53 74 61 74  l" "Units" "Stat
8500: 75 73 22 20 22 43 6f 6d 6d 65 6e 74 22 29 29 29  us" "Comment")))
8510: 0a 20 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e  .    (debug:prin
8520: 74 20 32 20 22 55 73 69 6e 67 20 22 20 74 65 6d  t 2 "Using " tem
8530: 70 64 69 72 20 22 20 66 6f 72 20 63 6f 6e 73 74  pdir " for const
8540: 72 75 63 74 69 6e 67 20 74 68 65 20 6f 64 73 20  ructing the ods 
8550: 66 69 6c 65 2e 20 6b 65 79 71 72 79 3a 20 22 20  file. keyqry: " 
8560: 6b 65 79 71 72 79 20 22 20 6b 65 79 73 74 72 3a  keyqry " keystr:
8570: 20 22 20 6b 65 79 73 73 74 72 20 22 20 77 69 74   " keysstr " wit
8580: 68 20 6b 65 79 73 3a 20 22 20 28 6d 61 70 20 63  h keys: " (map c
8590: 61 64 72 20 6b 65 79 70 61 74 74 2d 61 6c 69 73  adr keypatt-alis
85a0: 74 29 29 0a 20 20 20 20 3b 3b 20 22 45 78 70 65  t)).    ;; "Expe
85b0: 63 74 65 64 20 56 61 6c 75 65 22 0a 20 20 20 20  cted Value".    
85c0: 3b 3b 20 22 56 61 6c 75 65 20 46 6f 75 6e 64 22  ;; "Value Found"
85d0: 0a 20 20 20 20 3b 3b 20 22 54 6f 6c 65 72 61 6e  .    ;; "Toleran
85e0: 63 65 22 0a 20 20 20 20 28 61 70 70 6c 79 20 73  ce".    (apply s
85f0: 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d  qlite3:for-each-
8600: 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 64 61  row.     (lambda
8610: 20 28 74 65 73 74 2d 69 64 20 2e 20 62 29 0a 20   (test-id . b). 
8620: 20 20 20 20 20 20 28 73 65 74 21 20 74 65 73 74        (set! test
8630: 2d 69 64 73 20 28 63 6f 6e 73 20 74 65 73 74 2d  -ids (cons test-
8640: 69 64 20 74 65 73 74 2d 69 64 73 29 29 20 20 20  id test-ids))   
8650: 3b 3b 20 74 65 73 74 2d 69 64 20 69 73 20 6e 6f  ;; test-id is no
8660: 77 20 74 65 73 74 6e 61 6d 65 0a 20 20 20 20 20  w testname.     
8670: 20 20 28 73 65 74 21 20 72 65 73 75 6c 74 73 20    (set! results 
8680: 28 61 70 70 65 6e 64 20 72 65 73 75 6c 74 73 20  (append results 
8690: 3b 3b 20 6e 6f 74 65 2c 20 64 72 6f 70 20 74 68  ;; note, drop th
86a0: 65 20 74 65 73 74 2d 69 64 0a 09 09 09 20 20 20  e test-id....   
86b0: 20 20 28 6c 69 73 74 0a 09 09 09 20 20 20 20 20    (list....     
86c0: 20 28 69 66 20 70 61 74 68 6d 6f 64 0a 09 09 09   (if pathmod....
86d0: 09 20 20 28 6c 65 74 2a 20 28 28 76 62 20 20 20  .  (let* ((vb   
86e0: 20 20 20 20 20 28 61 70 70 6c 79 20 76 65 63 74       (apply vect
86f0: 6f 72 20 62 29 29 0a 09 09 09 09 09 20 28 6b 65  or b))...... (ke
8700: 79 76 61 6c 73 20 20 20 28 6c 65 74 20 6c 6f 6f  yvals   (let loo
8710: 70 20 28 28 69 20 20 20 20 30 29 0a 09 09 09 09  p ((i    0).....
8720: 09 09 09 20 20 20 20 20 20 20 28 72 65 73 20 27  ...       (res '
8730: 28 29 29 29 0a 09 09 09 09 09 09 20 20 20 20 20  ())).......     
8740: 20 28 69 66 20 28 3e 3d 20 69 20 6e 75 6d 6b 65   (if (>= i numke
8750: 79 73 29 0a 09 09 09 09 09 09 09 20 20 72 65 73  ys)........  res
8760: 0a 09 09 09 09 09 09 09 20 20 28 6c 6f 6f 70 20  ........  (loop 
8770: 28 2b 20 69 20 31 29 0a 09 09 09 09 09 09 09 09  (+ i 1).........
8780: 28 61 70 70 65 6e 64 20 72 65 73 20 28 6c 69 73  (append res (lis
8790: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62  t (vector-ref vb
87a0: 20 28 2b 20 69 20 32 29 29 29 29 29 29 29 29 0a   (+ i 2)))))))).
87b0: 09 09 09 09 09 20 28 72 75 6e 6e 61 6d 65 20 20  ..... (runname  
87c0: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62 20   (vector-ref vb 
87d0: 31 29 29 0a 09 09 09 09 09 20 28 74 65 73 74 6e  1))...... (testn
87e0: 61 6d 65 20 20 28 76 65 63 74 6f 72 2d 72 65 66  ame  (vector-ref
87f0: 20 76 62 20 28 2b 20 20 32 20 6e 75 6d 6b 65 79   vb (+  2 numkey
8800: 73 29 29 29 0a 09 09 09 09 09 20 28 69 74 65 6d  s)))...... (item
8810: 2d 70 61 74 68 20 28 76 65 63 74 6f 72 2d 72 65  -path (vector-re
8820: 66 20 76 62 20 28 2b 20 20 33 20 6e 75 6d 6b 65  f vb (+  3 numke
8830: 79 73 29 29 29 0a 09 09 09 09 09 20 28 66 69 6e  ys)))...... (fin
8840: 61 6c 2d 6c 6f 67 20 28 76 65 63 74 6f 72 2d 72  al-log (vector-r
8850: 65 66 20 76 62 20 28 2b 20 20 37 20 6e 75 6d 6b  ef vb (+  7 numk
8860: 65 79 73 29 29 29 0a 09 09 09 09 09 20 28 72 75  eys)))...... (ru
8870: 6e 2d 64 69 72 20 20 20 28 76 65 63 74 6f 72 2d  n-dir   (vector-
8880: 72 65 66 20 76 62 20 28 2b 20 31 38 20 6e 75 6d  ref vb (+ 18 num
8890: 6b 65 79 73 29 29 29 0a 09 09 09 09 09 20 28 6c  keys)))...... (l
88a0: 6f 67 2d 66 70 61 74 68 20 28 63 6f 6e 63 20 72  og-fpath (conc r
88b0: 75 6e 2d 64 69 72 20 22 2f 22 20 20 66 69 6e 61  un-dir "/"  fina
88c0: 6c 2d 6c 6f 67 29 29 29 20 3b 3b 20 28 73 74 72  l-log))) ;; (str
88d0: 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20  ing-intersperse 
88e0: 6b 65 79 76 61 6c 73 20 22 2f 22 29 20 22 2f 22  keyvals "/") "/"
88f0: 20 74 65 73 74 6e 61 6d 65 20 22 2f 22 20 69 74   testname "/" it
8900: 65 6d 2d 70 61 74 68 20 22 2f 22 0a 09 09 09 09  em-path "/".....
8910: 20 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74      (debug:print
8920: 20 34 20 22 6c 6f 67 3a 20 22 20 6c 6f 67 2d 66   4 "log: " log-f
8930: 70 61 74 68 20 22 20 65 78 69 73 74 73 3a 20 22  path " exists: "
8940: 20 28 66 69 6c 65 2d 65 78 69 73 74 73 3f 20 6c   (file-exists? l
8950: 6f 67 2d 66 70 61 74 68 29 29 0a 09 09 09 09 20  og-fpath))..... 
8960: 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20     (vector-set! 
8970: 76 62 20 28 2b 20 37 20 6e 75 6d 6b 65 79 73 29  vb (+ 7 numkeys)
8980: 20 28 69 66 20 28 66 69 6c 65 2d 65 78 69 73 74   (if (file-exist
8990: 73 3f 20 6c 6f 67 2d 66 70 61 74 68 29 0a 09 09  s? log-fpath)...
89a0: 09 09 09 09 09 09 20 20 20 20 20 20 28 6c 65 74  ......      (let
89b0: 20 28 28 6e 65 77 70 61 74 68 20 28 63 6f 6e 63   ((newpath (conc
89c0: 20 70 61 74 68 6d 6f 64 20 22 2f 22 0a 09 09 09   pathmod "/"....
89d0: 09 09 09 09 09 09 09 09 20 20 20 28 73 74 72 69  ........   (stri
89e0: 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 6b  ng-intersperse k
89f0: 65 79 76 61 6c 73 20 22 2f 22 29 0a 09 09 09 09  eyvals "/").....
8a00: 09 09 09 09 09 09 09 20 20 20 22 2f 22 20 72 75  .......   "/" ru
8a10: 6e 6e 61 6d 65 20 22 2f 22 20 74 65 73 74 6e 61  nname "/" testna
8a20: 6d 65 20 22 2f 22 0a 09 09 09 09 09 09 09 09 09  me "/"..........
8a30: 09 09 20 20 20 28 69 66 20 28 73 74 72 69 6e 67  ..   (if (string
8a40: 3d 3f 20 69 74 65 6d 2d 70 61 74 68 20 22 22 29  =? item-path "")
8a50: 20 22 22 20 28 63 6f 6e 63 20 22 2f 22 20 69 74   "" (conc "/" it
8a60: 65 6d 2d 70 61 74 68 29 29 0a 09 09 09 09 09 09  em-path)).......
8a70: 09 09 09 09 09 20 20 20 66 69 6e 61 6c 2d 6c 6f  .....   final-lo
8a80: 67 29 29 29 0a 09 09 09 09 09 09 09 09 09 3b 3b  g)))..........;;
8a90: 20 66 6f 72 20 6e 6f 77 20 74 68 72 6f 77 20 61   for now throw a
8aa0: 77 61 79 20 6e 65 77 70 61 74 68 20 61 6e 64 20  way newpath and 
8ab0: 75 73 65 20 74 68 65 20 6c 6f 67 2d 66 70 61 74  use the log-fpat
8ac0: 68 20 63 6f 6e 63 27 64 20 77 69 74 68 20 70 61  h conc'd with pa
8ad0: 74 68 6d 6f 64 0a 09 09 09 09 09 09 09 09 09 28  thmod..........(
8ae0: 73 65 74 21 20 6e 65 77 70 61 74 68 20 28 63 6f  set! newpath (co
8af0: 6e 63 20 70 61 74 68 6d 6f 64 20 6c 6f 67 2d 66  nc pathmod log-f
8b00: 70 61 74 68 29 29 0a 09 09 09 09 09 09 09 09 09  path))..........
8b10: 28 69 66 20 77 69 6e 64 6f 77 73 20 28 73 74 72  (if windows (str
8b20: 69 6e 67 2d 74 72 61 6e 73 6c 61 74 65 20 6e 65  ing-translate ne
8b30: 77 70 61 74 68 20 22 2f 22 20 22 5c 5c 22 29 20  wpath "/" "\\") 
8b40: 6e 65 77 70 61 74 68 29 29 0a 09 09 09 09 09 09  newpath)).......
8b50: 09 09 20 20 20 20 20 20 28 69 66 20 28 3e 20 2a  ..      (if (> *
8b60: 76 65 72 62 6f 73 69 74 79 2a 20 31 29 0a 09 09  verbosity* 1)...
8b70: 09 09 09 09 09 09 09 20 20 28 63 6f 6e 63 20 66  .......  (conc f
8b80: 69 6e 61 6c 2d 6c 6f 67 20 22 20 6e 6f 74 2d 66  inal-log " not-f
8b90: 6f 75 6e 64 22 29 0a 09 09 09 09 09 09 09 09 09  ound")..........
8ba0: 20 20 22 22 29 29 29 0a 09 09 09 09 20 20 20 20    ""))).....    
8bb0: 28 76 65 63 74 6f 72 2d 3e 6c 69 73 74 20 76 62  (vector->list vb
8bc0: 29 29 0a 09 09 09 09 20 20 62 29 29 29 29 29 0a  )).....  b))))).
8bd0: 20 20 20 20 20 64 62 0a 20 20 20 20 20 28 63 6f       db.     (co
8be0: 6e 63 20 22 53 45 4c 45 43 54 0a 20 20 20 20 20  nc "SELECT.     
8bf0: 20 20 20 20 20 20 20 20 20 74 2e 74 65 73 74 6e           t.testn
8c00: 61 6d 65 2c 72 2e 69 64 2c 72 75 6e 6e 61 6d 65  ame,r.id,runname
8c10: 2c 22 20 6b 65 79 73 73 74 72 20 22 2c 74 2e 74  ," keysstr ",t.t
8c20: 65 73 74 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  estname,.       
8c30: 20 20 20 20 20 20 20 74 2e 69 74 65 6d 5f 70 61         t.item_pa
8c40: 74 68 2c 74 6d 2e 64 65 73 63 72 69 70 74 69 6f  th,tm.descriptio
8c50: 6e 2c 74 2e 73 74 61 74 65 2c 74 2e 73 74 61 74  n,t.state,t.stat
8c60: 75 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  us,.            
8c70: 20 20 66 69 6e 61 6c 5f 6c 6f 67 66 2c 72 75 6e    final_logf,run
8c80: 5f 64 75 72 61 74 69 6f 6e 2c 20 0a 20 20 20 20  _duration, .    
8c90: 20 20 20 20 20 20 20 20 20 20 73 74 72 66 74 69            strfti
8ca0: 6d 65 28 27 25 6d 2f 25 64 2f 25 59 20 25 48 3a  me('%m/%d/%Y %H:
8cb0: 25 4d 3a 25 53 27 2c 64 61 74 65 74 69 6d 65 28  %M:%S',datetime(
8cc0: 74 2e 65 76 65 6e 74 5f 74 69 6d 65 2c 27 75 6e  t.event_time,'un
8cd0: 69 78 65 70 6f 63 68 27 29 2c 27 6c 6f 63 61 6c  ixepoch'),'local
8ce0: 74 69 6d 65 27 29 2c 0a 20 20 20 20 20 20 20 20  time'),.        
8cf0: 20 20 20 20 20 20 74 6d 2e 74 61 67 73 2c 72 2e        tm.tags,r.
8d00: 6f 77 6e 65 72 2c 74 2e 63 6f 6d 6d 65 6e 74 2c  owner,t.comment,
8d10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
8d20: 75 74 68 6f 72 2c 0a 20 20 20 20 20 20 20 20 20  uthor,.         
8d30: 20 20 20 20 20 74 6d 2e 6f 77 6e 65 72 2c 72 65       tm.owner,re
8d40: 76 69 65 77 65 64 2c 0a 20 20 20 20 20 20 20 20  viewed,.        
8d50: 20 20 20 20 20 20 64 69 73 6b 66 72 65 65 2c 75        diskfree,u
8d60: 6e 61 6d 65 2c 72 75 6e 64 69 72 2c 0a 20 20 20  name,rundir,.   
8d70: 20 20 20 20 20 20 20 20 20 20 20 68 6f 73 74 2c             host,
8d80: 63 70 75 6c 6f 61 64 0a 20 20 20 20 20 20 20 20  cpuload.        
8d90: 20 20 20 20 46 52 4f 4d 20 74 65 73 74 73 20 41      FROM tests A
8da0: 53 20 74 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 72  S t INNER JOIN r
8db0: 75 6e 73 20 41 53 20 72 20 4f 4e 20 74 2e 72 75  uns AS r ON t.ru
8dc0: 6e 5f 69 64 3d 72 2e 69 64 20 49 4e 4e 45 52 20  n_id=r.id INNER 
8dd0: 4a 4f 49 4e 20 74 65 73 74 5f 6d 65 74 61 20 41  JOIN test_meta A
8de0: 53 20 74 6d 20 4f 4e 20 74 6d 2e 74 65 73 74 6e  S tm ON tm.testn
8df0: 61 6d 65 3d 74 2e 74 65 73 74 6e 61 6d 65 0a 20  ame=t.testname. 
8e00: 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45             WHERE
8e10: 20 72 75 6e 6e 61 6d 65 20 4c 49 4b 45 20 3f 20   runname LIKE ? 
8e20: 41 4e 44 20 22 20 6b 65 79 71 72 79 20 22 3b 22  AND " keyqry ";"
8e30: 29 0a 20 20 20 20 20 72 75 6e 73 70 61 74 74 20  ).     runspatt 
8e40: 28 6d 61 70 20 63 61 64 72 20 6b 65 79 70 61 74  (map cadr keypat
8e50: 74 2d 61 6c 69 73 74 29 29 0a 20 20 20 20 28 73  t-alist)).    (s
8e60: 65 74 21 20 72 65 73 75 6c 74 73 20 28 6c 69 73  et! results (lis
8e70: 74 20 28 63 6f 6e 73 20 22 52 75 6e 73 22 20 72  t (cons "Runs" r
8e80: 65 73 75 6c 74 73 29 29 29 0a 20 20 20 20 3b 3b  esults))).    ;;
8e90: 20 6e 6f 77 2c 20 66 6f 72 20 65 61 63 68 20 74   now, for each t
8ea0: 65 73 74 2c 20 63 6f 6c 6c 65 63 74 20 74 68 65  est, collect the
8eb0: 20 74 65 73 74 5f 64 61 74 61 20 69 6e 66 6f 20   test_data info 
8ec0: 61 6e 64 20 61 64 64 20 61 20 6e 65 77 20 73 68  and add a new sh
8ed0: 65 65 74 0a 20 20 20 20 28 66 6f 72 2d 65 61 63  eet.    (for-eac
8ee0: 68 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28  h.     (lambda (
8ef0: 74 65 73 74 2d 69 64 29 0a 20 20 20 20 20 20 20  test-id).       
8f00: 28 6c 65 74 20 28 28 74 65 73 74 2d 64 61 74 61  (let ((test-data
8f10: 20 28 6c 69 73 74 20 74 65 73 74 64 61 74 61 2d   (list testdata-
8f20: 68 65 61 64 65 72 29 29 0a 09 20 20 20 20 20 28  header))..     (
8f30: 63 75 72 72 2d 74 65 73 74 2d 6e 61 6d 65 20 23  curr-test-name #
8f40: 66 29 29 0a 09 20 28 73 71 6c 69 74 65 33 3a 66  f)).. (sqlite3:f
8f50: 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 09 20 20 28  or-each-row..  (
8f60: 6c 61 6d 62 64 61 20 28 72 75 6e 2d 69 64 20 74  lambda (run-id t
8f70: 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74  estname item-pat
8f80: 68 20 63 61 74 65 67 6f 72 79 20 76 61 72 69 61  h category varia
8f90: 62 6c 65 20 76 61 6c 75 65 20 65 78 70 65 63 74  ble value expect
8fa0: 65 64 20 74 6f 6c 20 75 6e 69 74 73 20 73 74 61  ed tol units sta
8fb0: 74 75 73 20 63 6f 6d 6d 65 6e 74 29 0a 09 20 20  tus comment)..  
8fc0: 20 20 28 73 65 74 21 20 63 75 72 72 2d 74 65 73    (set! curr-tes
8fd0: 74 2d 6e 61 6d 65 20 74 65 73 74 6e 61 6d 65 29  t-name testname)
8fe0: 0a 09 20 20 20 20 28 73 65 74 21 20 74 65 73 74  ..    (set! test
8ff0: 2d 64 61 74 61 20 28 61 70 70 65 6e 64 20 74 65  -data (append te
9000: 73 74 2d 64 61 74 61 20 28 6c 69 73 74 20 28 6c  st-data (list (l
9010: 69 73 74 20 72 75 6e 2d 69 64 20 74 65 73 74 6e  ist run-id testn
9020: 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 63 61  ame item-path ca
9030: 74 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65 20  tegory variable 
9040: 76 61 6c 75 65 20 65 78 70 65 63 74 65 64 20 74  value expected t
9050: 6f 6c 20 75 6e 69 74 73 20 73 74 61 74 75 73 20  ol units status 
9060: 63 6f 6d 6d 65 6e 74 29 29 29 29 29 0a 09 20 20  comment)))))..  
9070: 64 62 20 0a 09 20 20 3b 3b 20 22 53 45 4c 45 43  db ..  ;; "SELEC
9080: 54 20 72 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d  T run_id,testnam
9090: 65 2c 69 74 65 6d 5f 70 61 74 68 2c 63 61 74 65  e,item_path,cate
90a0: 67 6f 72 79 2c 76 61 72 69 61 62 6c 65 2c 74 64  gory,variable,td
90b0: 2e 76 61 6c 75 65 20 41 53 20 76 61 6c 75 65 2c  .value AS value,
90c0: 65 78 70 65 63 74 65 64 2c 74 6f 6c 2c 75 6e 69  expected,tol,uni
90d0: 74 73 2c 74 64 2e 73 74 61 74 75 73 20 41 53 20  ts,td.status AS 
90e0: 73 74 61 74 75 73 2c 74 64 2e 63 6f 6d 6d 65 6e  status,td.commen
90f0: 74 20 41 53 20 63 6f 6d 6d 65 6e 74 20 46 52 4f  t AS comment FRO
9100: 4d 20 74 65 73 74 5f 64 61 74 61 20 41 53 20 74  M test_data AS t
9110: 64 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 74 65 73  d INNER JOIN tes
9120: 74 73 20 4f 4e 20 74 65 73 74 73 2e 69 64 3d 74  ts ON tests.id=t
9130: 64 2e 74 65 73 74 5f 69 64 20 57 48 45 52 45 20  d.test_id WHERE 
9140: 74 65 73 74 5f 69 64 3d 3f 3b 22 0a 09 20 20 22  test_id=?;"..  "
9150: 53 45 4c 45 43 54 20 72 75 6e 5f 69 64 2c 74 65  SELECT run_id,te
9160: 73 74 6e 61 6d 65 2c 69 74 65 6d 5f 70 61 74 68  stname,item_path
9170: 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62  ,category,variab
9180: 6c 65 2c 74 64 2e 76 61 6c 75 65 20 41 53 20 76  le,td.value AS v
9190: 61 6c 75 65 2c 74 64 2e 65 78 70 65 63 74 65 64  alue,td.expected
91a0: 2c 74 64 2e 74 6f 6c 2c 74 64 2e 75 6e 69 74 73  ,td.tol,td.units
91b0: 2c 74 64 2e 73 74 61 74 75 73 20 41 53 20 73 74  ,td.status AS st
91c0: 61 74 75 73 2c 74 64 2e 63 6f 6d 6d 65 6e 74 20  atus,td.comment 
91d0: 41 53 20 63 6f 6d 6d 65 6e 74 20 46 52 4f 4d 20  AS comment FROM 
91e0: 74 65 73 74 5f 64 61 74 61 20 41 53 20 74 64 20  test_data AS td 
91f0: 49 4e 4e 45 52 20 4a 4f 49 4e 20 74 65 73 74 73  INNER JOIN tests
9200: 20 4f 4e 20 74 65 73 74 73 2e 69 64 3d 74 64 2e   ON tests.id=td.
9210: 74 65 73 74 5f 69 64 20 57 48 45 52 45 20 74 65  test_id WHERE te
9220: 73 74 6e 61 6d 65 3d 3f 3b 22 0a 09 20 20 74 65  stname=?;"..  te
9230: 73 74 2d 69 64 29 0a 09 20 28 69 66 20 63 75 72  st-id).. (if cur
9240: 72 2d 74 65 73 74 2d 6e 61 6d 65 0a 09 20 20 20  r-test-name..   
9250: 20 20 28 73 65 74 21 20 72 65 73 75 6c 74 73 20    (set! results 
9260: 28 61 70 70 65 6e 64 20 72 65 73 75 6c 74 73 20  (append results 
9270: 28 6c 69 73 74 20 28 63 6f 6e 73 20 63 75 72 72  (list (cons curr
9280: 2d 74 65 73 74 2d 6e 61 6d 65 20 74 65 73 74 2d  -test-name test-
9290: 64 61 74 61 29 29 29 29 29 0a 09 20 29 29 0a 20  data))))).. )). 
92a0: 20 20 20 20 28 73 6f 72 74 20 28 64 65 6c 65 74      (sort (delet
92b0: 65 2d 64 75 70 6c 69 63 61 74 65 73 20 74 65 73  e-duplicates tes
92c0: 74 2d 69 64 73 29 20 73 74 72 69 6e 67 3c 3d 29  t-ids) string<=)
92d0: 29 0a 20 20 20 20 28 73 79 73 74 65 6d 20 28 63  ).    (system (c
92e0: 6f 6e 63 20 22 6d 6b 64 69 72 20 2d 70 20 22 20  onc "mkdir -p " 
92f0: 74 65 6d 70 64 69 72 29 29 0a 20 20 20 20 3b 3b  tempdir)).    ;;
9300: 20 28 70 70 20 72 65 73 75 6c 74 73 29 0a 20 20   (pp results).  
9310: 20 20 28 6f 64 73 3a 6c 69 73 74 2d 3e 6f 64 73    (ods:list->ods
9320: 20 0a 20 20 20 20 20 74 65 6d 70 64 69 72 0a 20   .     tempdir. 
9330: 20 20 20 20 28 69 66 20 28 73 74 72 69 6e 67 2d      (if (string-
9340: 6d 61 74 63 68 20 28 72 65 67 65 78 70 20 22 5e  match (regexp "^
9350: 5b 2f 7e 5d 2b 2e 2a 22 29 20 6f 75 74 70 75 74  [/~]+.*") output
9360: 66 69 6c 65 29 20 3b 3b 20 66 75 6c 6c 20 70 61  file) ;; full pa
9370: 74 68 3f 0a 09 20 6f 75 74 70 75 74 66 69 6c 65  th?.. outputfile
9380: 0a 09 20 28 62 65 67 69 6e 0a 09 20 20 20 28 64  .. (begin..   (d
9390: 65 62 75 67 3a 70 72 69 6e 74 20 30 20 22 57 41  ebug:print 0 "WA
93a0: 52 4e 49 4e 47 3a 20 70 61 74 68 20 67 69 76 65  RNING: path give
93b0: 6e 2c 20 22 20 6f 75 74 70 75 74 66 69 6c 65 20  n, " outputfile 
93c0: 22 20 69 73 20 72 65 6c 61 74 69 76 65 2c 20 70  " is relative, p
93d0: 72 65 66 69 78 69 6e 67 20 77 69 74 68 20 63 75  refixing with cu
93e0: 72 72 65 6e 74 20 64 69 72 65 63 74 6f 72 79 22  rrent directory"
93f0: 29 0a 09 20 20 20 28 63 6f 6e 63 20 28 63 75 72  )..   (conc (cur
9400: 72 65 6e 74 2d 64 69 72 65 63 74 6f 72 79 29 20  rent-directory) 
9410: 22 2f 22 20 6f 75 74 70 75 74 66 69 6c 65 29 29  "/" outputfile))
9420: 29 0a 20 20 20 20 20 72 65 73 75 6c 74 73 29 29  ).     results))
9430: 29 0a 0a 3b 3b 20 28 64 62 3a 65 78 74 72 61 63  )..;; (db:extrac
9440: 74 2d 6f 64 73 2d 66 69 6c 65 20 64 62 20 22 6f  t-ods-file db "o
9450: 75 74 70 75 74 66 69 6c 65 2e 6f 64 73 22 20 27  utputfile.ods" '
9460: 28 28 22 73 79 73 6e 61 6d 65 22 20 22 25 22 29  (("sysname" "%")
9470: 28 22 66 73 6e 61 6d 65 22 20 22 25 22 29 28 22  ("fsname" "%")("
9480: 64 61 74 61 70 61 74 68 22 20 22 25 22 29 29 20  datapath" "%")) 
9490: 22 25 22 29 0a                                   "%").