Megatest

Hex Artifact Content
Login

Artifact fa70f2b097cb1bf7eaf258e4e57de3f05e23e7ed:


0000: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
0010: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0030: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0040: 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 43 6f 70 79  ========.;; Copy
0050: 72 69 67 68 74 20 32 30 30 36 2d 32 30 31 31 2c  right 2006-2011,
0060: 20 4d 61 74 74 68 65 77 20 57 65 6c 6c 61 6e 64   Matthew Welland
0070: 2e 0a 3b 3b 20 0a 3b 3b 20 20 54 68 69 73 20 70  ..;; .;;  This p
0080: 72 6f 67 72 61 6d 20 69 73 20 6d 61 64 65 20 61  rogram is made a
0090: 76 61 69 6c 61 62 6c 65 20 75 6e 64 65 72 20 74  vailable under t
00a0: 68 65 20 47 4e 55 20 47 50 4c 20 76 65 72 73 69  he GNU GPL versi
00b0: 6f 6e 20 32 2e 30 20 6f 72 0a 3b 3b 20 20 67 72  on 2.0 or.;;  gr
00c0: 65 61 74 65 72 2e 20 53 65 65 20 74 68 65 20 61  eater. See the a
00d0: 63 63 6f 6d 70 61 6e 79 69 6e 67 20 66 69 6c 65  ccompanying file
00e0: 20 43 4f 50 59 49 4e 47 20 66 6f 72 20 64 65 74   COPYING for det
00f0: 61 69 6c 73 2e 0a 3b 3b 20 0a 3b 3b 20 20 54 68  ails..;; .;;  Th
0100: 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69  is program is di
0110: 73 74 72 69 62 75 74 65 64 20 57 49 54 48 4f 55  stributed WITHOU
0120: 54 20 41 4e 59 20 57 41 52 52 41 4e 54 59 3b 20  T ANY WARRANTY; 
0130: 77 69 74 68 6f 75 74 20 65 76 65 6e 20 74 68 65  without even the
0140: 0a 3b 3b 20 20 69 6d 70 6c 69 65 64 20 77 61 72  .;;  implied war
0150: 72 61 6e 74 79 20 6f 66 20 4d 45 52 43 48 41 4e  ranty of MERCHAN
0160: 54 41 42 49 4c 49 54 59 20 6f 72 20 46 49 54 4e  TABILITY or FITN
0170: 45 53 53 20 46 4f 52 20 41 20 50 41 52 54 49 43  ESS FOR A PARTIC
0180: 55 4c 41 52 0a 3b 3b 20 20 50 55 52 50 4f 53 45  ULAR.;;  PURPOSE
0190: 2e 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ..;;============
01a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 3d 3d  ==========..;;==
01e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0200: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0210: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0220: 3d 3d 3d 3d 0a 3b 3b 20 44 61 74 61 62 61 73 65  ====.;; Database
0230: 20 61 63 63 65 73 73 0a 3b 3b 3d 3d 3d 3d 3d 3d   access.;;======
0240: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0250: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0260: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0270: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0280: 0a 0a 28 75 73 65 20 73 71 6c 69 74 65 33 20 73  ..(use sqlite3 s
0290: 72 66 69 2d 31 20 70 6f 73 69 78 20 72 65 67 65  rfi-1 posix rege
02a0: 78 20 72 65 67 65 78 2d 63 61 73 65 20 73 72 66  x regex-case srf
02b0: 69 2d 36 39 20 63 73 76 2d 78 6d 6c 29 0a 28 69  i-69 csv-xml).(i
02c0: 6d 70 6f 72 74 20 28 70 72 65 66 69 78 20 73 71  mport (prefix sq
02d0: 6c 69 74 65 33 20 73 71 6c 69 74 65 33 3a 29 29  lite3 sqlite3:))
02e0: 0a 0a 28 64 65 63 6c 61 72 65 20 28 75 6e 69 74  ..(declare (unit
02f0: 20 64 62 29 29 0a 28 64 65 63 6c 61 72 65 20 28   db)).(declare (
0300: 75 73 65 73 20 63 6f 6d 6d 6f 6e 29 29 0a 28 64  uses common)).(d
0310: 65 63 6c 61 72 65 20 28 75 73 65 73 20 6b 65 79  eclare (uses key
0320: 73 29 29 0a 28 64 65 63 6c 61 72 65 20 28 75 73  s)).(declare (us
0330: 65 73 20 6f 64 73 29 29 0a 0a 28 69 6e 63 6c 75  es ods))..(inclu
0340: 64 65 20 22 63 6f 6d 6d 6f 6e 5f 72 65 63 6f 72  de "common_recor
0350: 64 73 2e 73 63 6d 22 29 0a 28 69 6e 63 6c 75 64  ds.scm").(includ
0360: 65 20 22 64 62 5f 72 65 63 6f 72 64 73 2e 73 63  e "db_records.sc
0370: 6d 22 29 0a 28 69 6e 63 6c 75 64 65 20 22 6b 65  m").(include "ke
0380: 79 5f 72 65 63 6f 72 64 73 2e 73 63 6d 22 29 0a  y_records.scm").
0390: 0a 28 64 65 66 69 6e 65 20 28 6f 70 65 6e 2d 64  .(define (open-d
03a0: 62 29 20 3b 3b 20 20 28 63 6f 6e 63 20 2a 74 6f  b) ;;  (conc *to
03b0: 70 70 61 74 68 2a 20 22 2f 6d 65 67 61 74 65 73  ppath* "/megates
03c0: 74 2e 64 62 22 29 20 28 63 61 72 20 2a 63 6f 6e  t.db") (car *con
03d0: 66 69 67 69 6e 66 6f 2a 29 29 29 0a 20 20 28 6c  figinfo*))).  (l
03e0: 65 74 2a 20 28 28 64 62 70 61 74 68 20 20 20 20  et* ((dbpath    
03f0: 28 63 6f 6e 63 20 2a 74 6f 70 70 61 74 68 2a 20  (conc *toppath* 
0400: 22 2f 6d 65 67 61 74 65 73 74 2e 64 62 22 29 29  "/megatest.db"))
0410: 20 3b 3b 20 66 6e 61 6d 65 29 0a 09 20 28 63 6f   ;; fname).. (co
0420: 6e 66 69 67 64 61 74 20 28 63 61 72 20 2a 63 6f  nfigdat (car *co
0430: 6e 66 69 67 69 6e 66 6f 2a 29 29 0a 09 20 28 64  nfiginfo*)).. (d
0440: 62 65 78 69 73 74 73 20 20 28 66 69 6c 65 2d 65  bexists  (file-e
0450: 78 69 73 74 73 3f 20 64 62 70 61 74 68 29 29 0a  xists? dbpath)).
0460: 09 20 28 64 62 20 20 20 20 20 20 20 20 28 73 71  . (db        (sq
0470: 6c 69 74 65 33 3a 6f 70 65 6e 2d 64 61 74 61 62  lite3:open-datab
0480: 61 73 65 20 64 62 70 61 74 68 29 29 20 3b 3b 20  ase dbpath)) ;; 
0490: 28 6e 65 76 65 72 2d 67 69 76 65 2d 75 70 2d 6f  (never-give-up-o
04a0: 70 65 6e 2d 64 62 20 64 62 70 61 74 68 29 29 0a  pen-db dbpath)).
04b0: 09 20 28 68 61 6e 64 6c 65 72 20 20 20 28 6d 61  . (handler   (ma
04c0: 6b 65 2d 62 75 73 79 2d 74 69 6d 65 6f 75 74 20  ke-busy-timeout 
04d0: 33 36 30 30 30 29 29 29 0a 20 20 20 20 28 73 71  36000))).    (sq
04e0: 6c 69 74 65 33 3a 73 65 74 2d 62 75 73 79 2d 68  lite3:set-busy-h
04f0: 61 6e 64 6c 65 72 21 20 64 62 20 68 61 6e 64 6c  andler! db handl
0500: 65 72 29 0a 20 20 20 20 28 69 66 20 28 6e 6f 74  er).    (if (not
0510: 20 64 62 65 78 69 73 74 73 29 0a 09 28 6c 65 74   dbexists)..(let
0520: 2a 20 28 28 6b 65 79 73 20 20 20 20 20 28 63 6f  * ((keys     (co
0530: 6e 66 69 67 2d 67 65 74 2d 66 69 65 6c 64 73 20  nfig-get-fields 
0540: 63 6f 6e 66 69 67 64 61 74 29 29 0a 09 20 20 20  configdat))..   
0550: 20 20 20 20 28 68 61 76 65 6b 65 79 73 20 28 3e      (havekeys (>
0560: 20 28 6c 65 6e 67 74 68 20 6b 65 79 73 29 20 30   (length keys) 0
0570: 29 29 0a 09 20 20 20 20 20 20 20 28 6b 65 79 73  ))..       (keys
0580: 74 72 20 20 20 28 6b 65 79 73 2d 3e 6b 65 79 73  tr   (keys->keys
0590: 74 72 20 6b 65 79 73 29 29 0a 09 20 20 20 20 20  tr keys))..     
05a0: 20 20 28 66 69 65 6c 64 73 74 72 20 28 6b 65 79    (fieldstr (key
05b0: 73 2d 3e 6b 65 79 2f 66 69 65 6c 64 20 6b 65 79  s->key/field key
05c0: 73 29 29 29 0a 09 20 20 28 66 6f 72 2d 65 61 63  s)))..  (for-eac
05d0: 68 20 28 6c 61 6d 62 64 61 20 28 6b 65 79 29 0a  h (lambda (key).
05e0: 09 09 20 20 20 20 20 20 28 6c 65 74 20 28 28 6b  ..      (let ((k
05f0: 65 79 6e 20 28 76 65 63 74 6f 72 2d 72 65 66 20  eyn (vector-ref 
0600: 6b 65 79 20 30 29 29 29 0a 09 09 09 28 69 66 20  key 0)))....(if 
0610: 28 6d 65 6d 62 65 72 20 28 73 74 72 69 6e 67 2d  (member (string-
0620: 64 6f 77 6e 63 61 73 65 20 6b 65 79 6e 29 0a 09  downcase keyn)..
0630: 09 09 09 20 20 20 20 20 28 6c 69 73 74 20 22 72  ...     (list "r
0640: 75 6e 6e 61 6d 65 22 20 22 73 74 61 74 65 22 20  unname" "state" 
0650: 22 73 74 61 74 75 73 22 20 22 6f 77 6e 65 72 22  "status" "owner"
0660: 20 22 65 76 65 6e 74 5f 74 69 6d 65 22 20 22 63   "event_time" "c
0670: 6f 6d 6d 65 6e 74 22 20 22 66 61 69 6c 5f 63 6f  omment" "fail_co
0680: 75 6e 74 22 0a 09 09 09 09 09 20 20 20 22 70 61  unt"......   "pa
0690: 73 73 5f 63 6f 75 6e 74 22 29 29 0a 09 09 09 20  ss_count")).... 
06a0: 20 20 20 28 62 65 67 69 6e 0a 09 09 09 20 20 20     (begin....   
06b0: 20 20 20 28 70 72 69 6e 74 20 22 45 52 52 4f 52     (print "ERROR
06c0: 3a 20 79 6f 75 72 20 6b 65 79 20 63 61 6e 6e 6f  : your key canno
06d0: 74 20 62 65 20 6e 61 6d 65 64 20 22 20 6b 65 79  t be named " key
06e0: 6e 20 22 20 61 73 20 74 68 69 73 20 63 6f 6e 66  n " as this conf
06f0: 6c 69 63 74 73 20 77 69 74 68 20 74 68 65 20 73  licts with the s
0700: 61 6d 65 20 6e 61 6d 65 64 20 66 69 65 6c 64 20  ame named field 
0710: 69 6e 20 74 68 65 20 72 75 6e 73 20 74 61 62 6c  in the runs tabl
0720: 65 22 29 0a 09 09 09 20 20 20 20 20 20 28 73 79  e")....      (sy
0730: 73 74 65 6d 20 28 63 6f 6e 63 20 22 72 6d 20 2d  stem (conc "rm -
0740: 66 20 22 20 64 62 70 61 74 68 29 29 0a 09 09 09  f " dbpath))....
0750: 20 20 20 20 20 20 28 65 78 69 74 20 31 29 29 29        (exit 1)))
0760: 29 29 0a 09 09 20 20 20 20 6b 65 79 73 29 0a 09  ))...    keys)..
0770: 20 20 3b 3b 20 28 73 71 6c 69 74 65 33 3a 65 78    ;; (sqlite3:ex
0780: 65 63 75 74 65 20 64 62 20 22 50 52 41 47 4d 41  ecute db "PRAGMA
0790: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4f   synchronous = O
07a0: 46 46 3b 22 29 0a 09 20 20 28 73 71 6c 69 74 65  FF;")..  (sqlite
07b0: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 43 52  3:execute db "CR
07c0: 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f  EATE TABLE IF NO
07d0: 54 20 45 58 49 53 54 53 20 6b 65 79 73 20 28 69  T EXISTS keys (i
07e0: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  d INTEGER PRIMAR
07f0: 59 20 4b 45 59 2c 20 66 69 65 6c 64 6e 61 6d 65  Y KEY, fieldname
0800: 20 54 45 58 54 2c 20 66 69 65 6c 64 74 79 70 65   TEXT, fieldtype
0810: 20 54 45 58 54 2c 20 43 4f 4e 53 54 52 41 49 4e   TEXT, CONSTRAIN
0820: 54 20 6b 65 79 63 6f 6e 73 74 72 61 69 6e 74 20  T keyconstraint 
0830: 55 4e 49 51 55 45 20 28 66 69 65 6c 64 6e 61 6d  UNIQUE (fieldnam
0840: 65 29 29 3b 22 29 0a 09 20 20 28 66 6f 72 2d 65  e));")..  (for-e
0850: 61 63 68 20 28 6c 61 6d 62 64 61 20 28 6b 65 79  ach (lambda (key
0860: 29 0a 09 09 20 20 20 20 20 20 28 73 71 6c 69 74  )...      (sqlit
0870: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 49  e3:execute db "I
0880: 4e 53 45 52 54 20 49 4e 54 4f 20 6b 65 79 73 20  NSERT INTO keys 
0890: 28 66 69 65 6c 64 6e 61 6d 65 2c 66 69 65 6c 64  (fieldname,field
08a0: 74 79 70 65 29 20 56 41 4c 55 45 53 20 28 3f 2c  type) VALUES (?,
08b0: 3f 29 3b 22 20 28 6b 65 79 3a 67 65 74 2d 66 69  ?);" (key:get-fi
08c0: 65 6c 64 6e 61 6d 65 20 6b 65 79 29 28 6b 65 79  eldname key)(key
08d0: 3a 67 65 74 2d 66 69 65 6c 64 74 79 70 65 20 6b  :get-fieldtype k
08e0: 65 79 29 29 29 0a 09 09 20 20 20 20 6b 65 79 73  ey)))...    keys
08f0: 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65 78  )..  (sqlite3:ex
0900: 65 63 75 74 65 20 64 62 20 28 63 6f 6e 63 20 0a  ecute db (conc .
0910: 09 09 09 20 20 20 20 22 43 52 45 41 54 45 20 54  ...    "CREATE T
0920: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
0930: 54 53 20 72 75 6e 73 20 28 69 64 20 49 4e 54 45  TS runs (id INTE
0940: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
0950: 20 22 20 0a 09 09 09 20 20 20 20 66 69 65 6c 64   " ....    field
0960: 73 74 72 20 28 69 66 20 68 61 76 65 6b 65 79 73  str (if havekeys
0970: 20 22 2c 22 20 22 22 29 0a 09 09 09 20 20 20 20   "," "")....    
0980: 22 72 75 6e 6e 61 6d 65 20 54 45 58 54 2c 22 0a  "runname TEXT,".
0990: 09 09 09 20 20 20 20 22 73 74 61 74 65 20 54 45  ...    "state TE
09a0: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 22 0a  XT DEFAULT '',".
09b0: 09 09 09 20 20 20 20 22 73 74 61 74 75 73 20 54  ...    "status T
09c0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 22  EXT DEFAULT '',"
09d0: 0a 09 09 09 20 20 20 20 22 6f 77 6e 65 72 20 54  ....    "owner T
09e0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 22  EXT DEFAULT '',"
09f0: 0a 09 09 09 20 20 20 20 22 65 76 65 6e 74 5f 74  ....    "event_t
0a00: 69 6d 65 20 54 49 4d 45 53 54 41 4d 50 2c 22 0a  ime TIMESTAMP,".
0a10: 09 09 09 20 20 20 20 22 63 6f 6d 6d 65 6e 74 20  ...    "comment 
0a20: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c  TEXT DEFAULT '',
0a30: 22 0a 09 09 09 20 20 20 20 22 66 61 69 6c 5f 63  "....    "fail_c
0a40: 6f 75 6e 74 20 49 4e 54 45 47 45 52 20 44 45 46  ount INTEGER DEF
0a50: 41 55 4c 54 20 30 2c 22 0a 09 09 09 20 20 20 20  AULT 0,"....    
0a60: 22 70 61 73 73 5f 63 6f 75 6e 74 20 49 4e 54 45  "pass_count INTE
0a70: 47 45 52 20 44 45 46 41 55 4c 54 20 30 2c 22 0a  GER DEFAULT 0,".
0a80: 09 09 09 20 20 20 20 22 43 4f 4e 53 54 52 41 49  ...    "CONSTRAI
0a90: 4e 54 20 72 75 6e 73 63 6f 6e 73 74 72 61 69 6e  NT runsconstrain
0aa0: 74 20 55 4e 49 51 55 45 20 28 72 75 6e 6e 61 6d  t UNIQUE (runnam
0ab0: 65 22 20 28 69 66 20 68 61 76 65 6b 65 79 73 20  e" (if havekeys 
0ac0: 22 2c 22 20 22 22 29 20 6b 65 79 73 74 72 20 22  "," "") keystr "
0ad0: 29 29 3b 22 29 29 0a 09 20 20 28 73 71 6c 69 74  ));"))..  (sqlit
0ae0: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 28 63  e3:execute db (c
0af0: 6f 6e 63 20 22 43 52 45 41 54 45 20 49 4e 44 45  onc "CREATE INDE
0b00: 58 20 72 75 6e 73 5f 69 6e 64 65 78 20 4f 4e 20  X runs_index ON 
0b10: 72 75 6e 73 20 28 72 75 6e 6e 61 6d 65 22 20 28  runs (runname" (
0b20: 69 66 20 68 61 76 65 6b 65 79 73 20 22 2c 22 20  if havekeys "," 
0b30: 22 22 29 20 6b 65 79 73 74 72 20 22 29 3b 22 29  "") keystr ");")
0b40: 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65 78  )..  (sqlite3:ex
0b50: 65 63 75 74 65 20 64 62 20 0a 20 20 20 20 20 20  ecute db .      
0b60: 20 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41             "CREA
0b70: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  TE TABLE IF NOT 
0b80: 45 58 49 53 54 53 20 74 65 73 74 73 20 0a 20 20  EXISTS tests .  
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ba0: 20 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52    (id INTEGER PR
0bb0: 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20  IMARY KEY,.     
0bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bd0: 72 75 6e 5f 69 64 20 20 20 20 20 49 4e 54 45 47  run_id     INTEG
0be0: 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ER,.            
0bf0: 20 20 20 20 20 20 20 20 20 74 65 73 74 6e 61 6d           testnam
0c00: 65 20 20 20 54 45 58 54 2c 0a 20 20 20 20 20 20  e   TEXT,.      
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68                 h
0c20: 6f 73 74 20 20 20 20 20 20 20 54 45 58 54 20 44  ost       TEXT D
0c30: 45 46 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20 20  EFAULT 'n/a',.  
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c50: 20 20 20 63 70 75 6c 6f 61 64 20 20 20 20 52 45     cpuload    RE
0c60: 41 4c 20 44 45 46 41 55 4c 54 20 2d 31 2c 0a 20  AL DEFAULT -1,. 
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c80: 20 20 20 20 64 69 73 6b 66 72 65 65 20 20 20 49      diskfree   I
0c90: 4e 54 45 47 45 52 20 44 45 46 41 55 4c 54 20 2d  NTEGER DEFAULT -
0ca0: 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
0cb0: 20 20 20 20 20 20 20 20 75 6e 61 6d 65 20 20 20          uname   
0cc0: 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20     TEXT DEFAULT 
0cd0: 27 6e 2f 61 27 2c 20 0a 20 20 20 20 20 20 20 20  'n/a', .        
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 75 6e               run
0cf0: 64 69 72 20 20 20 20 20 54 45 58 54 20 44 45 46  dir     TEXT DEF
0d00: 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20 20 20 20  AULT 'n/a',.    
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d20: 20 73 68 6f 72 74 64 69 72 20 20 20 54 45 58 54   shortdir   TEXT
0d30: 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20   DEFAULT '',.   
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d50: 20 20 69 74 65 6d 5f 70 61 74 68 20 20 54 45 58    item_path  TEX
0d60: 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20  T DEFAULT '',.  
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d80: 20 20 20 73 74 61 74 65 20 20 20 20 20 20 54 45     state      TE
0d90: 58 54 20 44 45 46 41 55 4c 54 20 27 4e 4f 54 5f  XT DEFAULT 'NOT_
0da0: 53 54 41 52 54 45 44 27 2c 0a 20 20 20 20 20 20  STARTED',.      
0db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
0dc0: 74 61 74 75 73 20 20 20 20 20 54 45 58 54 20 44  tatus     TEXT D
0dd0: 45 46 41 55 4c 54 20 27 46 41 49 4c 27 2c 0a 20  EFAULT 'FAIL',. 
0de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0df0: 20 20 20 20 61 74 74 65 6d 70 74 6e 75 6d 20 49      attemptnum I
0e00: 4e 54 45 47 45 52 20 44 45 46 41 55 4c 54 20 30  NTEGER DEFAULT 0
0e10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
0e20: 20 20 20 20 20 20 20 66 69 6e 61 6c 5f 6c 6f 67         final_log
0e30: 66 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27  f TEXT DEFAULT '
0e40: 6c 6f 67 73 2f 66 69 6e 61 6c 2e 6c 6f 67 27 2c  logs/final.log',
0e50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0e60: 20 20 20 20 20 20 6c 6f 67 64 61 74 20 20 20 20        logdat    
0e70: 20 42 4c 4f 42 2c 20 0a 20 20 20 20 20 20 20 20   BLOB, .        
0e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 75 6e               run
0e90: 5f 64 75 72 61 74 69 6f 6e 20 49 4e 54 45 47 45  _duration INTEGE
0ea0: 52 20 44 45 46 41 55 4c 54 20 30 2c 0a 20 20 20  R DEFAULT 0,.   
0eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ec0: 20 20 63 6f 6d 6d 65 6e 74 20 20 20 20 54 45 58    comment    TEX
0ed0: 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20  T DEFAULT '',.  
0ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ef0: 20 20 20 65 76 65 6e 74 5f 74 69 6d 65 20 54 49     event_time TI
0f00: 4d 45 53 54 41 4d 50 2c 0a 20 20 20 20 20 20 20  MESTAMP,.       
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 61                fa
0f20: 69 6c 5f 63 6f 75 6e 74 20 49 4e 54 45 47 45 52  il_count INTEGER
0f30: 20 44 45 46 41 55 4c 54 20 30 2c 0a 20 20 20 20   DEFAULT 0,.    
0f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f50: 20 70 61 73 73 5f 63 6f 75 6e 74 20 49 4e 54 45   pass_count INTE
0f60: 47 45 52 20 44 45 46 41 55 4c 54 20 30 2c 0a 20  GER DEFAULT 0,. 
0f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f80: 20 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 74      CONSTRAINT t
0f90: 65 73 74 73 63 6f 6e 73 74 72 61 69 6e 74 20 55  estsconstraint U
0fa0: 4e 49 51 55 45 20 28 72 75 6e 5f 69 64 2c 20 74  NIQUE (run_id, t
0fb0: 65 73 74 6e 61 6d 65 2c 20 69 74 65 6d 5f 70 61  estname, item_pa
0fc0: 74 68 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b  th).          );
0fd0: 22 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65  ")..  (sqlite3:e
0fe0: 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 54  xecute db "CREAT
0ff0: 45 20 49 4e 44 45 58 20 74 65 73 74 73 5f 69 6e  E INDEX tests_in
1000: 64 65 78 20 4f 4e 20 74 65 73 74 73 20 28 72 75  dex ON tests (ru
1010: 6e 5f 69 64 2c 20 74 65 73 74 6e 61 6d 65 29 3b  n_id, testname);
1020: 22 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65  ")..  (sqlite3:e
1030: 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 54  xecute db "CREAT
1040: 45 20 56 49 45 57 20 72 75 6e 73 5f 74 65 73 74  E VIEW runs_test
1050: 73 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  s AS SELECT * FR
1060: 4f 4d 20 72 75 6e 73 20 49 4e 4e 45 52 20 4a 4f  OM runs INNER JO
1070: 49 4e 20 74 65 73 74 73 20 4f 4e 20 72 75 6e 73  IN tests ON runs
1080: 2e 69 64 3d 74 65 73 74 73 2e 72 75 6e 5f 69 64  .id=tests.run_id
1090: 3b 22 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a  ;")..  (sqlite3:
10a0: 65 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41  execute db "CREA
10b0: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  TE TABLE IF NOT 
10c0: 45 58 49 53 54 53 20 74 65 73 74 5f 73 74 65 70  EXISTS test_step
10d0: 73 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s .             
10e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f0: 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49   (id INTEGER PRI
1100: 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 20  MARY KEY,.      
1110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1120: 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 69 64           test_id
1130: 20 49 4e 54 45 47 45 52 2c 20 0a 20 20 20 20 20   INTEGER, .     
1140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1150: 20 20 20 20 20 20 20 20 20 20 73 74 65 70 6e 61            stepna
1160: 6d 65 20 54 45 58 54 2c 20 0a 20 20 20 20 20 20  me TEXT, .      
1170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1180: 20 20 20 20 20 20 20 20 20 73 74 61 74 65 20 54           state T
1190: 45 58 54 20 44 45 46 41 55 4c 54 20 27 4e 4f 54  EXT DEFAULT 'NOT
11a0: 5f 53 54 41 52 54 45 44 27 2c 20 0a 20 20 20 20  _STARTED', .    
11b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c0: 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 75             statu
11d0: 73 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27  s TEXT DEFAULT '
11e0: 6e 2f 61 27 2c 0a 20 20 20 20 20 20 20 20 20 20  n/a',.          
11f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1200: 20 20 20 20 20 65 76 65 6e 74 5f 74 69 6d 65 20       event_time 
1210: 54 49 4d 45 53 54 41 4d 50 2c 0a 20 20 20 20 20  TIMESTAMP,.     
1220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1230: 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 65 6e            commen
1240: 74 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27  t TEXT DEFAULT '
1250: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ',.             
1260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1270: 20 20 6c 6f 67 66 69 6c 65 20 54 45 58 54 2c 0a    logfile TEXT,.
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43                 C
12a0: 4f 4e 53 54 52 41 49 4e 54 20 74 65 73 74 5f 73  ONSTRAINT test_s
12b0: 74 65 70 73 5f 63 6f 6e 73 74 72 61 69 6e 74 20  teps_constraint 
12c0: 55 4e 49 51 55 45 20 28 74 65 73 74 5f 69 64 2c  UNIQUE (test_id,
12d0: 73 74 65 70 6e 61 6d 65 2c 73 74 61 74 65 29 29  stepname,state))
12e0: 3b 22 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a  ;")..  (sqlite3:
12f0: 65 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41  execute db "CREA
1300: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  TE TABLE IF NOT 
1310: 45 58 49 53 54 53 20 65 78 74 72 61 64 61 74 20  EXISTS extradat 
1320: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d  (id INTEGER PRIM
1330: 41 52 59 20 4b 45 59 2c 20 72 75 6e 5f 69 64 20  ARY KEY, run_id 
1340: 49 4e 54 45 47 45 52 2c 20 6b 65 79 20 54 45 58  INTEGER, key TEX
1350: 54 2c 20 76 61 6c 20 54 45 58 54 29 3b 22 29 0a  T, val TEXT);").
1360: 09 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63  .  (sqlite3:exec
1370: 75 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54  ute db "CREATE T
1380: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
1390: 54 53 20 6d 65 74 61 64 61 74 20 28 69 64 20 49  TS metadat (id I
13a0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
13b0: 45 59 2c 20 76 61 72 20 54 45 58 54 2c 20 76 61  EY, var TEXT, va
13c0: 6c 20 54 45 58 54 2c 0a 20 20 20 20 20 20 20 20  l TEXT,.        
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52            CONSTR
13f0: 41 49 4e 54 20 6d 65 74 61 64 61 74 5f 63 6f 6e  AINT metadat_con
1400: 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28  straint UNIQUE (
1410: 76 61 72 29 29 3b 22 29 0a 09 20 20 28 73 71 6c  var));")..  (sql
1420: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
1430: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46  "CREATE TABLE IF
1440: 20 4e 4f 54 20 45 58 49 53 54 53 20 61 63 63 65   NOT EXISTS acce
1450: 73 73 5f 6c 6f 67 20 28 69 64 20 49 4e 54 45 47  ss_log (id INTEG
1460: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
1470: 75 73 65 72 20 54 45 58 54 2c 20 61 63 63 65 73  user TEXT, acces
1480: 73 65 64 20 54 49 4d 45 53 54 41 4d 50 2c 20 61  sed TIMESTAMP, a
1490: 72 67 73 20 54 45 58 54 29 3b 22 29 0a 09 20 20  rgs TEXT);")..  
14a0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
14b0: 20 64 62 20 22 43 52 45 41 54 45 20 54 41 42 4c   db "CREATE TABL
14c0: 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20  E IF NOT EXISTS 
14d0: 74 65 73 74 5f 6d 65 74 61 20 28 69 64 20 49 4e  test_meta (id IN
14e0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
14f0: 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y,.             
1500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1510: 20 20 20 20 20 20 20 20 74 65 73 74 6e 61 6d 65          testname
1520: 20 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54      TEXT DEFAULT
1530: 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20   '',.           
1540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1550: 20 20 20 20 20 20 20 20 20 20 61 75 74 68 6f 72            author
1560: 20 20 20 20 20 20 54 45 58 54 20 44 45 46 41 55        TEXT DEFAU
1570: 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20  LT '',.         
1580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1590: 20 20 20 20 20 20 20 20 20 20 20 20 6f 77 6e 65              owne
15a0: 72 20 20 20 20 20 20 20 54 45 58 54 20 44 45 46  r       TEXT DEF
15b0: 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20  AULT '',.       
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65                de
15e0: 73 63 72 69 70 74 69 6f 6e 20 54 45 58 54 20 44  scription TEXT D
15f0: 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20  EFAULT '',.     
1600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1620: 72 65 76 69 65 77 65 64 20 20 20 20 54 49 4d 45  reviewed    TIME
1630: 53 54 41 4d 50 2c 0a 20 20 20 20 20 20 20 20 20  STAMP,.         
1640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1650: 20 20 20 20 20 20 20 20 20 20 20 20 69 74 65 72              iter
1660: 61 74 65 64 20 20 20 20 54 45 58 54 20 44 45 46  ated    TEXT DEF
1670: 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20  AULT '',.       
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 76                av
16a0: 67 5f 72 75 6e 74 69 6d 65 20 52 45 41 4c 2c 0a  g_runtime REAL,.
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d0: 20 20 20 20 20 61 76 67 5f 64 69 73 6b 20 20 20       avg_disk   
16e0: 20 52 45 41 4c 2c 0a 20 20 20 20 20 20 20 20 20   REAL,.         
16f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1700: 20 20 20 20 20 20 20 20 20 20 20 20 74 61 67 73              tags
1710: 20 20 20 20 20 20 20 20 54 45 58 54 20 44 45 46          TEXT DEF
1720: 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20  AULT '',.       
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1740: 20 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52 41           CONSTRA
1750: 49 4e 54 20 74 65 73 74 5f 6d 65 74 61 5f 63 6f  INT test_meta_co
1760: 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20  nstraint UNIQUE 
1770: 28 74 65 73 74 6e 61 6d 65 29 29 3b 22 29 0a 09  (testname));")..
1780: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
1790: 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41  te db "CREATE TA
17a0: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54  BLE IF NOT EXIST
17b0: 53 20 74 65 73 74 5f 64 61 74 61 20 28 69 64 20  S test_data (id 
17c0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
17d0: 4b 45 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20  KEY,.           
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f0: 20 20 20 20 20 74 65 73 74 5f 69 64 20 49 4e 54       test_id INT
1800: 45 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20  EGER,.          
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1820: 20 20 20 20 20 20 63 61 74 65 67 6f 72 79 20 54        category T
1830: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a  EXT DEFAULT '',.
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1860: 76 61 72 69 61 62 6c 65 20 54 45 58 54 2c 0a 09  variable TEXT,..
1870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1880: 20 20 20 20 20 20 20 20 76 61 6c 75 65 20 52 45          value RE
1890: 41 4c 2c 0a 09 20 20 20 20 20 20 20 20 20 20 20  AL,..           
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70               exp
18b0: 65 63 74 65 64 20 52 45 41 4c 2c 0a 09 20 20 20  ected REAL,..   
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d0: 20 20 20 20 20 74 6f 6c 20 52 45 41 4c 2c 0a 20       tol REAL,. 
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75                 u
1900: 6e 69 74 73 20 54 45 58 54 2c 0a 20 20 20 20 20  nits TEXT,.     
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 65             comme
1930: 6e 74 20 54 45 58 54 20 44 45 46 41 55 4c 54 20  nt TEXT DEFAULT 
1940: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '',.            
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1960: 20 20 20 20 73 74 61 74 75 73 20 54 45 58 54 20      status TEXT 
1970: 44 45 46 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20  DEFAULT 'n/a',. 
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
19a0: 79 70 65 20 54 45 58 54 20 44 45 46 41 55 4c 54  ype TEXT DEFAULT
19b0: 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20   '',.           
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d0: 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 65     CONSTRAINT te
19e0: 73 74 5f 64 61 74 61 5f 63 6f 6e 73 74 72 61 69  st_data_constrai
19f0: 6e 74 20 55 4e 49 51 55 45 20 28 74 65 73 74 5f  nt UNIQUE (test_
1a00: 69 64 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 69  id,category,vari
1a10: 61 62 6c 65 29 29 3b 22 29 0a 09 20 20 3b 3b 20  able));")..  ;; 
1a20: 4d 75 73 74 20 64 6f 20 74 68 69 73 20 2a 61 66  Must do this *af
1a30: 74 65 72 2a 20 72 75 6e 6e 69 6e 67 20 70 61 74  ter* running pat
1a40: 63 68 20 64 62 20 21 21 20 4e 6f 20 6d 6f 72 65  ch db !! No more
1a50: 2e 20 0a 09 20 20 28 64 62 3a 73 65 74 2d 76 61  . ..  (db:set-va
1a60: 72 20 64 62 20 22 4d 45 47 41 54 45 53 54 5f 56  r db "MEGATEST_V
1a70: 45 52 53 49 4f 4e 22 20 6d 65 67 61 74 65 73 74  ERSION" megatest
1a80: 2d 76 65 72 73 69 6f 6e 29 0a 09 20 20 29 29 0a  -version)..  )).
1a90: 20 20 20 20 64 62 29 29 0a 0a 3b 3b 3d 3d 3d 3d      db))..;;====
1aa0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
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 0a 3b 3b 20 54 4f 44 4f 3a 0a 3b 3b 20 20  ==.;; TODO:.;;  
1af0: 20 70 75 74 20 64 65 6c 74 61 73 20 69 6e 74 6f   put deltas into
1b00: 20 61 6e 20 61 73 73 6f 63 20 6c 69 73 74 20 77   an assoc list w
1b10: 69 74 68 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62  ith version numb
1b20: 65 72 73 0a 3b 3b 20 20 20 61 70 70 6c 79 20 61  ers.;;   apply a
1b30: 6c 6c 20 66 72 6f 6d 20 6c 61 73 74 20 74 6f 20  ll from last to 
1b40: 63 75 72 72 65 6e 74 0a 3b 3b 3d 3d 3d 3d 3d 3d  current.;;======
1b50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
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: 0a 28 64 65 66 69 6e 65 20 28 70 61 74 63 68 2d  .(define (patch-
1ba0: 64 62 20 64 62 29 0a 20 20 28 68 61 6e 64 6c 65  db db).  (handle
1bb0: 2d 65 78 63 65 70 74 69 6f 6e 73 0a 20 20 20 65  -exceptions.   e
1bc0: 78 6e 0a 20 20 20 28 62 65 67 69 6e 0a 20 20 20  xn.   (begin.   
1bd0: 20 20 28 70 72 69 6e 74 20 22 45 78 63 65 70 74    (print "Except
1be0: 69 6f 6e 3a 20 22 20 65 78 6e 29 0a 20 20 20 20  ion: " exn).    
1bf0: 20 28 70 72 69 6e 74 20 22 45 52 52 4f 52 3a 20   (print "ERROR: 
1c00: 50 6f 73 73 69 62 6c 65 20 6f 75 74 20 6f 66 20  Possible out of 
1c10: 64 61 74 65 20 73 63 68 65 6d 61 2c 20 61 74 74  date schema, att
1c20: 65 6d 70 74 69 6e 67 20 74 6f 20 61 64 64 20 74  empting to add t
1c30: 61 62 6c 65 20 6d 65 74 61 64 61 74 61 2e 2e 2e  able metadata...
1c40: 22 29 0a 20 20 20 20 20 28 73 71 6c 69 74 65 33  ").     (sqlite3
1c50: 3a 65 78 65 63 75 74 65 20 64 62 20 22 43 52 45  :execute db "CRE
1c60: 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54  ATE TABLE IF NOT
1c70: 20 45 58 49 53 54 53 20 6d 65 74 61 64 61 74 20   EXISTS metadat 
1c80: 28 69 64 20 49 4e 54 45 47 45 52 2c 20 76 61 72  (id INTEGER, var
1c90: 20 54 45 58 54 2c 20 76 61 6c 20 54 45 58 54 2c   TEXT, val TEXT,
1ca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc0: 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 6d 65 74    CONSTRAINT met
1cd0: 61 64 61 74 5f 63 6f 6e 73 74 72 61 69 6e 74 20  adat_constraint 
1ce0: 55 4e 49 51 55 45 20 28 76 61 72 29 29 3b 22 29  UNIQUE (var));")
1cf0: 0a 20 20 20 20 20 28 69 66 20 28 6e 6f 74 20 28  .     (if (not (
1d00: 64 62 3a 67 65 74 2d 76 61 72 20 64 62 20 22 4d  db:get-var db "M
1d10: 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22  EGATEST_VERSION"
1d20: 29 29 0a 09 20 28 64 62 3a 73 65 74 2d 76 61 72  )).. (db:set-var
1d30: 20 64 62 20 22 4d 45 47 41 54 45 53 54 5f 56 45   db "MEGATEST_VE
1d40: 52 53 49 4f 4e 22 20 31 2e 31 37 29 29 29 0a 20  RSION" 1.17))). 
1d50: 20 20 28 6c 65 74 20 28 28 6d 76 65 72 20 28 64    (let ((mver (d
1d60: 62 3a 67 65 74 2d 76 61 72 20 64 62 20 22 4d 45  b:get-var db "ME
1d70: 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 29  GATEST_VERSION")
1d80: 29 0a 09 20 28 74 65 73 74 2d 6d 65 74 61 2d 64  ).. (test-meta-d
1d90: 65 66 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  ef "CREATE TABLE
1da0: 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 74   IF NOT EXISTS t
1db0: 65 73 74 5f 6d 65 74 61 20 28 69 64 20 49 4e 54  est_meta (id INT
1dc0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
1dd0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
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 74 65 73 74 6e 61 6d 65 20         testname 
1e00: 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20     TEXT DEFAULT 
1e10: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '',.            
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 61 75 74 68 6f 72 20           author 
1e40: 20 20 20 20 20 54 45 58 54 20 44 45 46 41 55 4c       TEXT DEFAUL
1e50: 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20  T '',.          
1e60: 20 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 6f 77 6e 65 72             owner
1e80: 20 20 20 20 20 20 20 54 45 58 54 20 44 45 46 41         TEXT DEFA
1e90: 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20  ULT '',.        
1ea0: 20 20 20 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 64 65 73               des
1ec0: 63 72 69 70 74 69 6f 6e 20 54 45 58 54 20 44 45  cription TEXT DE
1ed0: 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20  FAULT '',.      
1ee0: 20 20 20 20 20 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 72                 r
1f00: 65 76 69 65 77 65 64 20 20 20 20 54 49 4d 45 53  eviewed    TIMES
1f10: 54 41 4d 50 2c 0a 20 20 20 20 20 20 20 20 20 20  TAMP,.          
1f20: 20 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 69 74 65 72 61             itera
1f40: 74 65 64 20 20 20 20 54 45 58 54 20 44 45 46 41  ted    TEXT DEFA
1f50: 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20  ULT '',.        
1f60: 20 20 20 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 61 76 67               avg
1f80: 5f 72 75 6e 74 69 6d 65 20 52 45 41 4c 2c 0a 20  _runtime REAL,. 
1f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb0: 20 20 20 20 61 76 67 5f 64 69 73 6b 20 20 20 20      avg_disk    
1fc0: 52 45 41 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  REAL,.          
1fd0: 20 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 74 61 67 73 20             tags 
1ff0: 20 20 20 20 20 20 20 54 45 58 54 20 44 45 46 41         TEXT DEFA
2000: 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20  ULT '',.        
2010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2020: 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52 41 49          CONSTRAI
2030: 4e 54 20 74 65 73 74 5f 6d 65 74 61 5f 63 6f 6e  NT test_meta_con
2040: 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28  straint UNIQUE (
2050: 74 65 73 74 6e 61 6d 65 29 29 3b 22 29 29 0a 20  testname));")). 
2060: 20 20 20 20 28 70 72 69 6e 74 20 22 43 75 72 72      (print "Curr
2070: 65 6e 74 20 73 63 68 65 6d 61 20 76 65 72 73 69  ent schema versi
2080: 6f 6e 3a 20 22 20 6d 76 65 72 20 22 20 63 75 72  on: " mver " cur
2090: 72 65 6e 74 20 6d 65 67 61 74 65 73 74 20 76 65  rent megatest ve
20a0: 72 73 69 6f 6e 3a 20 22 20 6d 65 67 61 74 65 73  rsion: " megates
20b0: 74 2d 76 65 72 73 69 6f 6e 29 0a 20 20 20 20 20  t-version).     
20c0: 28 63 6f 6e 64 0a 20 20 20 20 20 20 28 28 6e 6f  (cond.      ((no
20d0: 74 20 6d 76 65 72 29 0a 20 20 20 20 20 20 20 28  t mver).       (
20e0: 70 72 69 6e 74 20 22 41 64 64 69 6e 67 20 6d 65  print "Adding me
20f0: 67 61 74 65 73 74 2d 76 65 72 73 69 6f 6e 20 74  gatest-version t
2100: 6f 20 6d 65 74 61 64 61 74 61 22 29 20 3b 3b 20  o metadata") ;; 
2110: 4e 65 65 64 20 74 6f 20 72 65 63 72 65 61 74 65  Need to recreate
2120: 20 74 68 65 20 74 61 62 6c 65 0a 20 20 20 20 20   the table.     
2130: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
2140: 74 65 20 64 62 20 22 44 52 4f 50 20 54 41 42 4c  te db "DROP TABL
2150: 45 20 49 46 20 45 58 49 53 54 53 20 6d 65 74 61  E IF EXISTS meta
2160: 64 61 74 3b 22 29 0a 20 20 20 20 20 20 20 28 73  dat;").       (s
2170: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64  qlite3:execute d
2180: 62 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  b "CREATE TABLE 
2190: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 6d 65  IF NOT EXISTS me
21a0: 74 61 64 61 74 20 28 69 64 20 49 4e 54 45 47 45  tadat (id INTEGE
21b0: 52 2c 20 76 61 72 20 54 45 58 54 2c 20 76 61 6c  R, var TEXT, val
21c0: 20 54 45 58 54 2c 0a 20 20 20 20 20 20 20 20 20   TEXT,.         
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 20 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52 41           CONSTRA
21f0: 49 4e 54 20 6d 65 74 61 64 61 74 5f 63 6f 6e 73  INT metadat_cons
2200: 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28 76  traint UNIQUE (v
2210: 61 72 29 29 3b 22 29 0a 20 20 20 20 20 20 20 28  ar));").       (
2220: 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d  db:set-var db "M
2230: 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22  EGATEST_VERSION"
2240: 20 31 2e 31 37 29 0a 20 20 20 20 20 20 20 28 70   1.17).       (p
2250: 61 74 63 68 2d 64 62 29 29 0a 20 20 20 20 20 20  atch-db)).      
2260: 28 28 3c 20 6d 76 65 72 20 31 2e 32 31 29 0a 20  ((< mver 1.21). 
2270: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65        (sqlite3:e
2280: 78 65 63 75 74 65 20 64 62 20 22 44 52 4f 50 20  xecute db "DROP 
2290: 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20  TABLE IF EXISTS 
22a0: 6d 65 74 61 64 61 74 3b 22 29 0a 20 20 20 20 20  metadat;").     
22b0: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
22c0: 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41  te db "CREATE TA
22d0: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54  BLE IF NOT EXIST
22e0: 53 20 6d 65 74 61 64 61 74 20 28 69 64 20 49 4e  S metadat (id IN
22f0: 54 45 47 45 52 2c 20 76 61 72 20 54 45 58 54 2c  TEGER, var TEXT,
2300: 20 76 61 6c 20 54 45 58 54 2c 0a 20 20 20 20 20   val TEXT,.     
2310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2320: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e               CON
2330: 53 54 52 41 49 4e 54 20 6d 65 74 61 64 61 74 5f  STRAINT metadat_
2340: 63 6f 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 55  constraint UNIQU
2350: 45 20 28 76 61 72 29 29 3b 22 29 0a 20 20 20 20  E (var));").    
2360: 20 20 20 28 64 62 3a 73 65 74 2d 76 61 72 20 64     (db:set-var d
2370: 62 20 22 4d 45 47 41 54 45 53 54 5f 56 45 52 53  b "MEGATEST_VERS
2380: 49 4f 4e 22 20 31 2e 32 31 29 20 3b 3b 20 73 65  ION" 1.21) ;; se
2390: 74 20 62 65 66 6f 72 65 2c 20 6a 75 73 74 20 69  t before, just i
23a0: 6e 20 63 61 73 65 20 74 68 65 20 63 68 61 6e 67  n case the chang
23b0: 65 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 61  es are already a
23c0: 70 70 6c 69 65 64 0a 20 20 20 20 20 20 20 28 73  pplied.       (s
23d0: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64  qlite3:execute d
23e0: 62 20 74 65 73 74 2d 6d 65 74 61 2d 64 65 66 29  b test-meta-def)
23f0: 0a 20 20 20 20 20 20 20 3b 28 66 6f 72 2d 65 61  .       ;(for-ea
2400: 63 68 20 0a 20 20 20 20 20 20 20 3b 20 28 6c 61  ch .       ; (la
2410: 6d 62 64 61 20 28 73 74 6d 74 29 0a 20 20 20 20  mbda (stmt).    
2420: 20 20 20 3b 20 20 20 28 73 71 6c 69 74 65 33 3a     ;   (sqlite3:
2430: 65 78 65 63 75 74 65 20 64 62 20 73 74 6d 74 29  execute db stmt)
2440: 29 0a 20 20 20 20 20 20 20 3b 20 28 6c 69 73 74  ).       ; (list
2450: 20 0a 20 20 20 20 20 20 20 3b 20 20 22 41 4c 54   .       ;  "ALT
2460: 45 52 20 54 41 42 4c 45 20 74 65 73 74 73 20 41  ER TABLE tests A
2470: 44 44 20 43 4f 4c 55 4d 4e 20 66 69 72 73 74 5f  DD COLUMN first_
2480: 65 72 72 20 54 45 58 54 3b 22 0a 20 20 20 20 20  err TEXT;".     
2490: 20 20 3b 20 20 22 41 4c 54 45 52 20 54 41 42 4c    ;  "ALTER TABL
24a0: 45 20 74 65 73 74 73 20 41 44 44 20 43 4f 4c 55  E tests ADD COLU
24b0: 4d 4e 20 66 69 72 73 74 5f 77 61 72 6e 20 54 45  MN first_warn TE
24c0: 58 54 3b 22 0a 20 20 20 20 20 20 20 3b 20 20 29  XT;".       ;  )
24d0: 29 0a 20 20 20 20 20 20 20 28 70 61 74 63 68 2d  ).       (patch-
24e0: 64 62 29 29 0a 20 20 20 20 20 20 28 28 3c 20 6d  db)).      ((< m
24f0: 76 65 72 20 31 2e 32 34 29 0a 20 20 20 20 20 20  ver 1.24).      
2500: 20 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20   (db:set-var db 
2510: 22 4d 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f  "MEGATEST_VERSIO
2520: 4e 22 20 31 2e 32 34 29 0a 20 20 20 20 20 20 20  N" 1.24).       
2530: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
2540: 20 64 62 20 22 44 52 4f 50 20 54 41 42 4c 45 20   db "DROP TABLE 
2550: 49 46 20 45 58 49 53 54 53 20 74 65 73 74 5f 64  IF EXISTS test_d
2560: 61 74 61 3b 22 29 0a 20 20 20 20 20 20 20 28 73  ata;").       (s
2570: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64  qlite3:execute d
2580: 62 20 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46  b "DROP TABLE IF
2590: 20 45 58 49 53 54 53 20 74 65 73 74 5f 6d 65 74   EXISTS test_met
25a0: 61 3b 22 29 0a 20 20 20 20 20 20 20 28 73 71 6c  a;").       (sql
25b0: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
25c0: 74 65 73 74 2d 6d 65 74 61 2d 64 65 66 29 0a 20  test-meta-def). 
25d0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65        (sqlite3:e
25e0: 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 54  xecute db "CREAT
25f0: 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
2600: 58 49 53 54 53 20 74 65 73 74 5f 64 61 74 61 20  XISTS test_data 
2610: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d  (id INTEGER PRIM
2620: 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 20 20  ARY KEY,.       
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2640: 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 69 64           test_id
2650: 20 49 4e 54 45 47 45 52 2c 0a 20 20 20 20 20 20   INTEGER,.      
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2670: 20 20 20 20 20 20 20 20 20 20 63 61 74 65 67 6f            catego
2680: 72 79 20 54 45 58 54 20 44 45 46 41 55 4c 54 20  ry TEXT DEFAULT 
2690: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '',.            
26a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b0: 20 20 20 20 76 61 72 69 61 62 6c 65 20 54 45 58      variable TEX
26c0: 54 2c 0a 09 20 20 20 20 20 20 20 20 20 20 20 20  T,..            
26d0: 20 20 20 20 20 20 20 20 20 20 20 20 76 61 6c 75              valu
26e0: 65 20 52 45 41 4c 2c 0a 09 20 20 20 20 20 20 20  e REAL,..       
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2700: 20 65 78 70 65 63 74 65 64 20 52 45 41 4c 2c 0a   expected REAL,.
2710: 09 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2720: 20 20 20 20 20 20 20 20 20 74 6f 6c 20 52 45 41           tol REA
2730: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2750: 20 20 20 75 6e 69 74 73 20 54 45 58 54 2c 0a 20     units TEXT,. 
2760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
2780: 6f 6d 6d 65 6e 74 20 54 45 58 54 20 44 45 46 41  omment TEXT DEFA
2790: 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20  ULT '',.        
27a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b0: 20 20 20 20 20 20 20 20 73 74 61 74 75 73 20 54          status T
27c0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 6e 2f 61  EXT DEFAULT 'n/a
27d0: 27 2c 66 6f 73 73 0a 20 20 20 20 20 20 20 20 20  ',foss.         
27e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f0: 20 20 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20       CONSTRAINT 
2800: 74 65 73 74 5f 64 61 74 61 20 55 4e 49 51 55 45  test_data UNIQUE
2810: 20 28 74 65 73 74 5f 69 64 2c 63 61 74 65 67 6f   (test_id,catego
2820: 72 79 2c 76 61 72 69 61 62 6c 65 29 29 3b 22 29  ry,variable));")
2830: 0a 20 20 20 20 20 20 20 28 70 61 74 63 68 2d 64  .       (patch-d
2840: 62 29 29 0a 20 20 20 20 20 20 28 28 3c 20 6d 76  b)).      ((< mv
2850: 65 72 20 31 2e 32 37 29 0a 20 20 20 20 20 20 20  er 1.27).       
2860: 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22  (db:set-var db "
2870: 4d 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e  MEGATEST_VERSION
2880: 22 20 31 2e 32 37 29 0a 20 20 20 20 20 20 20 28  " 1.27).       (
2890: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
28a0: 64 62 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20  db "ALTER TABLE 
28b0: 74 65 73 74 5f 64 61 74 61 20 41 44 44 20 43 4f  test_data ADD CO
28c0: 4c 55 4d 4e 20 74 79 70 65 20 54 45 58 54 20 44  LUMN type TEXT D
28d0: 45 46 41 55 4c 54 20 27 27 3b 22 29 0a 20 20 20  EFAULT '';").   
28e0: 20 20 20 20 28 70 61 74 63 68 2d 64 62 29 29 0a      (patch-db)).
28f0: 20 20 20 20 20 20 28 28 3c 20 6d 76 65 72 20 31        ((< mver 1
2900: 2e 32 39 29 0a 20 20 20 20 20 20 20 28 64 62 3a  .29).       (db:
2910: 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41  set-var db "MEGA
2920: 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e  TEST_VERSION" 1.
2930: 32 39 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69  29).       (sqli
2940: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22  te3:execute db "
2950: 41 4c 54 45 52 20 54 41 42 4c 45 20 74 65 73 74  ALTER TABLE test
2960: 5f 73 74 65 70 73 20 41 44 44 20 43 4f 4c 55 4d  _steps ADD COLUM
2970: 4e 20 6c 6f 67 66 69 6c 65 20 54 45 58 54 3b 22  N logfile TEXT;"
2980: 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ).       (sqlite
2990: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 41 4c  3:execute db "AL
29a0: 54 45 52 20 54 41 42 4c 45 20 74 65 73 74 73 20  TER TABLE tests 
29b0: 41 44 44 20 43 4f 4c 55 4d 4e 20 73 68 6f 72 74  ADD COLUMN short
29c0: 64 69 72 20 54 45 58 54 20 44 45 46 41 55 4c 54  dir TEXT DEFAULT
29d0: 20 27 27 3b 22 29 29 0a 20 20 20 20 20 20 28 28   '';")).      ((
29e0: 3c 20 6d 76 65 72 20 6d 65 67 61 74 65 73 74 2d  < mver megatest-
29f0: 76 65 72 73 69 6f 6e 29 0a 20 20 20 20 20 20 20  version).       
2a00: 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22  (db:set-var db "
2a10: 4d 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e  MEGATEST_VERSION
2a20: 22 20 6d 65 67 61 74 65 73 74 2d 76 65 72 73 69  " megatest-versi
2a30: 6f 6e 29 29 29 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d  on))))))..;;====
2a40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2a50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2a60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2a70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2a80: 3d 3d 0a 3b 3b 20 6d 65 74 61 20 67 65 74 20 61  ==.;; meta get a
2a90: 6e 64 20 73 65 74 20 76 61 72 73 0a 3b 3b 3d 3d  nd set vars.;;==
2aa0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2ab0: 3d 3d 3d 3d 3d 3d 3d 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 0a 0a 3b 3b 20 72 65 74 75 72 6e 73  ====..;; returns
2af0: 20 6e 75 6d 62 65 72 20 69 66 20 73 74 72 69 6e   number if strin
2b00: 67 2d 3e 6e 75 6d 62 65 72 20 69 73 20 73 75 63  g->number is suc
2b10: 63 65 73 73 66 75 6c 2c 20 73 74 72 69 6e 67 20  cessful, string 
2b20: 6f 74 68 65 72 77 69 73 65 0a 28 64 65 66 69 6e  otherwise.(defin
2b30: 65 20 28 64 62 3a 67 65 74 2d 76 61 72 20 64 62  e (db:get-var db
2b40: 20 76 61 72 29 0a 20 20 28 6c 65 74 20 28 28 72   var).  (let ((r
2b50: 65 73 20 23 66 29 29 0a 20 20 20 20 28 73 71 6c  es #f)).    (sql
2b60: 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f  ite3:for-each-ro
2b70: 77 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28  w.     (lambda (
2b80: 76 61 6c 29 0a 20 20 20 20 20 20 20 28 73 65 74  val).       (set
2b90: 21 20 72 65 73 20 76 61 6c 29 29 0a 20 20 20 20  ! res val)).    
2ba0: 20 64 62 20 22 53 45 4c 45 43 54 20 76 61 6c 20   db "SELECT val 
2bb0: 46 52 4f 4d 20 6d 65 74 61 64 61 74 20 57 48 45  FROM metadat WHE
2bc0: 52 45 20 76 61 72 3d 3f 3b 22 20 76 61 72 29 0a  RE var=?;" var).
2bd0: 20 20 20 20 28 69 66 20 28 73 74 72 69 6e 67 3f      (if (string?
2be0: 20 72 65 73 29 0a 09 28 6c 65 74 20 28 28 76 61   res)..(let ((va
2bf0: 6c 6e 75 6d 20 28 73 74 72 69 6e 67 2d 3e 6e 75  lnum (string->nu
2c00: 6d 62 65 72 20 72 65 73 29 29 29 0a 09 20 20 28  mber res)))..  (
2c10: 69 66 20 76 61 6c 6e 75 6d 20 76 61 6c 6e 75 6d  if valnum valnum
2c20: 20 72 65 73 29 29 0a 09 72 65 73 29 29 29 0a 0a   res))..res)))..
2c30: 28 64 65 66 69 6e 65 20 28 64 62 3a 73 65 74 2d  (define (db:set-
2c40: 76 61 72 20 64 62 20 76 61 72 20 76 61 6c 29 0a  var db var val).
2c50: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
2c60: 74 65 20 64 62 20 22 49 4e 53 45 52 54 20 4f 52  te db "INSERT OR
2c70: 20 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 6d 65   REPLACE INTO me
2c80: 74 61 64 61 74 20 28 76 61 72 2c 76 61 6c 29 20  tadat (var,val) 
2c90: 56 41 4c 55 45 53 20 28 3f 2c 3f 29 3b 22 20 76  VALUES (?,?);" v
2ca0: 61 72 20 76 61 6c 29 29 0a 0a 3b 3b 20 75 73 65  ar val))..;; use
2cb0: 20 61 20 67 6c 6f 62 61 6c 20 66 6f 72 20 73 6f   a global for so
2cc0: 6d 65 20 70 72 69 6d 69 74 69 76 65 20 63 61 63  me primitive cac
2cd0: 68 69 6e 67 2c 20 69 74 20 69 73 20 6a 75 73 74  hing, it is just
2ce0: 20 73 69 6c 6c 79 20 74 6f 20 72 65 2d 72 65 61   silly to re-rea
2cf0: 64 20 74 68 65 20 64 62 20 0a 3b 3b 20 6f 76 65  d the db .;; ove
2d00: 72 20 61 6e 64 20 6f 76 65 72 20 61 67 61 69 6e  r and over again
2d10: 20 66 6f 72 20 74 68 65 20 6b 65 79 73 20 73 69   for the keys si
2d20: 6e 63 65 20 74 68 65 79 20 6e 65 76 65 72 20 63  nce they never c
2d30: 68 61 6e 67 65 0a 0a 28 64 65 66 69 6e 65 20 2a  hange..(define *
2d40: 64 62 2d 6b 65 79 73 2a 20 23 66 29 0a 0a 28 64  db-keys* #f)..(d
2d50: 65 66 69 6e 65 20 28 64 62 2d 67 65 74 2d 6b 65  efine (db-get-ke
2d60: 79 73 20 64 62 29 0a 20 20 28 69 66 20 2a 64 62  ys db).  (if *db
2d70: 2d 6b 65 79 73 2a 20 2a 64 62 2d 6b 65 79 73 2a  -keys* *db-keys*
2d80: 20 0a 20 20 20 20 20 20 28 6c 65 74 20 28 28 72   .      (let ((r
2d90: 65 73 20 27 28 29 29 29 0a 09 28 73 71 6c 69 74  es '()))..(sqlit
2da0: 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20  e3:for-each-row 
2db0: 0a 09 20 28 6c 61 6d 62 64 61 20 28 6b 65 79 20  .. (lambda (key 
2dc0: 6b 65 79 74 79 70 65 29 0a 09 20 20 20 28 73 65  keytype)..   (se
2dd0: 74 21 20 72 65 73 20 28 63 6f 6e 73 20 28 76 65  t! res (cons (ve
2de0: 63 74 6f 72 20 6b 65 79 20 6b 65 79 74 79 70 65  ctor key keytype
2df0: 29 20 72 65 73 29 29 29 0a 09 20 64 62 0a 09 20  ) res))).. db.. 
2e00: 22 53 45 4c 45 43 54 20 66 69 65 6c 64 6e 61 6d  "SELECT fieldnam
2e10: 65 2c 66 69 65 6c 64 74 79 70 65 20 46 52 4f 4d  e,fieldtype FROM
2e20: 20 6b 65 79 73 20 4f 52 44 45 52 20 42 59 20 69   keys ORDER BY i
2e30: 64 20 44 45 53 43 3b 22 29 0a 09 28 73 65 74 21  d DESC;")..(set!
2e40: 20 2a 64 62 2d 6b 65 79 73 2a 20 72 65 73 29 0a   *db-keys* res).
2e50: 09 72 65 73 29 29 29 0a 0a 28 64 65 66 69 6e 65  .res)))..(define
2e60: 20 64 62 3a 67 65 74 2d 6b 65 79 73 20 64 62 2d   db:get-keys db-
2e70: 67 65 74 2d 6b 65 79 73 29 0a 0a 28 64 65 66 69  get-keys)..(defi
2e80: 6e 65 20 28 64 62 3a 67 65 74 2d 76 61 6c 75 65  ne (db:get-value
2e90: 2d 62 79 2d 68 65 61 64 65 72 20 72 6f 77 20 68  -by-header row h
2ea0: 65 61 64 65 72 20 66 69 65 6c 64 29 0a 20 20 3b  eader field).  ;
2eb0: 3b 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 32  ; (debug:print 2
2ec0: 20 22 64 62 3a 67 65 74 2d 76 61 6c 75 65 2d 62   "db:get-value-b
2ed0: 79 2d 68 65 61 64 65 72 20 72 6f 77 3a 20 22 20  y-header row: " 
2ee0: 72 6f 77 20 22 20 68 65 61 64 65 72 3a 20 22 20  row " header: " 
2ef0: 68 65 61 64 65 72 20 22 20 66 69 65 6c 64 3a 20  header " field: 
2f00: 22 20 66 69 65 6c 64 29 0a 20 20 28 69 66 20 28  " field).  (if (
2f10: 6e 75 6c 6c 3f 20 68 65 61 64 65 72 29 20 23 66  null? header) #f
2f20: 0a 20 20 20 20 20 20 28 6c 65 74 20 6c 6f 6f 70  .      (let loop
2f30: 20 28 28 68 65 64 20 28 63 61 72 20 68 65 61 64   ((hed (car head
2f40: 65 72 29 29 0a 09 09 20 28 74 61 6c 20 28 63 64  er))... (tal (cd
2f50: 72 20 68 65 61 64 65 72 29 29 0a 09 09 20 28 6e  r header))... (n
2f60: 20 20 20 30 29 29 0a 09 28 69 66 20 28 65 71 75     0))..(if (equ
2f70: 61 6c 3f 20 68 65 64 20 66 69 65 6c 64 29 0a 09  al? hed field)..
2f80: 20 20 20 20 28 76 65 63 74 6f 72 2d 72 65 66 20      (vector-ref 
2f90: 72 6f 77 20 6e 29 0a 09 20 20 20 20 28 69 66 20  row n)..    (if 
2fa0: 28 6e 75 6c 6c 3f 20 74 61 6c 29 20 23 66 20 28  (null? tal) #f (
2fb0: 6c 6f 6f 70 20 28 63 61 72 20 74 61 6c 29 28 63  loop (car tal)(c
2fc0: 64 72 20 74 61 6c 29 28 2b 20 6e 20 31 29 29 29  dr tal)(+ n 1)))
2fd0: 29 29 29 29 0a 09 20 20 20 20 0a 3b 3b 3d 3d 3d  ))))..    .;;===
2fe0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2ff0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3000: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3010: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3020: 3d 3d 3d 0a 3b 3b 20 20 52 20 55 20 4e 20 53 0a  ===.;;  R U N S.
3030: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
3040: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3050: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3060: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3070: 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65 66 69 6e  ========..(defin
3080: 65 20 28 72 75 6e 73 3a 67 65 74 2d 73 74 64 2d  e (runs:get-std-
3090: 72 75 6e 2d 66 69 65 6c 64 73 20 6b 65 79 73 20  run-fields keys 
30a0: 72 65 6d 66 69 65 6c 64 73 29 0a 20 20 28 6c 65  remfields).  (le
30b0: 74 2a 20 28 28 68 65 61 64 65 72 20 20 20 20 28  t* ((header    (
30c0: 61 70 70 65 6e 64 20 28 6d 61 70 20 6b 65 79 3a  append (map key:
30d0: 67 65 74 2d 66 69 65 6c 64 6e 61 6d 65 20 6b 65  get-fieldname ke
30e0: 79 73 29 0a 09 09 09 20 20 20 20 72 65 6d 66 69  ys)....    remfi
30f0: 65 6c 64 73 29 29 0a 09 20 28 6b 65 79 73 74 72  elds)).. (keystr
3100: 20 20 20 20 28 63 6f 6e 63 20 28 6b 65 79 73 2d      (conc (keys-
3110: 3e 6b 65 79 73 74 72 20 6b 65 79 73 29 20 22 2c  >keystr keys) ",
3120: 22 0a 09 09 09 20 20 28 73 74 72 69 6e 67 2d 69  "....  (string-i
3130: 6e 74 65 72 73 70 65 72 73 65 20 72 65 6d 66 69  ntersperse remfi
3140: 65 6c 64 73 20 22 2c 22 29 29 29 29 0a 20 20 20  elds ",")))).   
3150: 20 28 6c 69 73 74 20 6b 65 79 73 74 72 20 68 65   (list keystr he
3160: 61 64 65 72 29 29 29 0a 0a 3b 3b 20 57 41 53 20  ader)))..;; WAS 
3170: 64 62 2d 67 65 74 2d 72 75 6e 73 20 46 49 58 4d  db-get-runs FIXM
3180: 45 20 49 4e 20 52 45 4d 41 49 4e 49 4e 47 20 43  E IN REMAINING C
3190: 4f 44 45 0a 3b 3b 0a 3b 3b 20 4d 45 52 47 45 20  ODE.;;.;; MERGE 
31a0: 54 48 49 53 20 57 49 54 48 20 64 62 3a 67 65 74  THIS WITH db:get
31b0: 2d 72 75 6e 73 2c 20 61 63 63 69 64 65 6e 74 6c  -runs, accidentl
31c0: 79 20 77 72 6f 74 65 20 69 74 20 74 77 69 63 65  y wrote it twice
31d0: 0a 3b 3b 0a 3b 3b 20 72 65 70 6c 61 63 65 20 68  .;;.;; replace h
31e0: 65 61 64 65 72 20 61 6e 64 20 6b 65 79 73 74 72  eader and keystr
31f0: 20 77 69 74 68 20 61 20 63 61 6c 6c 20 74 6f 20   with a call to 
3200: 72 75 6e 73 3a 67 65 74 2d 73 74 64 2d 72 75 6e  runs:get-std-run
3210: 2d 66 69 65 6c 64 73 0a 3b 3b 0a 3b 3b 20 6b 65  -fields.;;.;; ke
3220: 79 70 61 74 74 73 3a 20 28 20 28 4b 45 59 31 20  ypatts: ( (KEY1 
3230: 22 61 62 63 25 64 65 66 22 29 28 4b 45 59 32 20  "abc%def")(KEY2 
3240: 22 25 22 29 20 29 0a 3b 3b 0a 28 64 65 66 69 6e  "%") ).;;.(defin
3250: 65 20 28 64 62 3a 67 65 74 2d 72 75 6e 73 20 64  e (db:get-runs d
3260: 62 20 72 75 6e 70 61 74 74 20 63 6f 75 6e 74 20  b runpatt count 
3270: 6f 66 66 73 65 74 20 6b 65 79 70 61 74 74 73 29  offset keypatts)
3280: 0a 20 20 28 6c 65 74 2a 20 28 28 72 65 73 20 20  .  (let* ((res  
3290: 20 20 20 20 27 28 29 29 0a 09 20 28 6b 65 79 73      '()).. (keys
32a0: 20 20 20 20 20 20 28 64 62 2d 67 65 74 2d 6b 65        (db-get-ke
32b0: 79 73 20 64 62 29 29 0a 09 20 28 72 65 6d 66 69  ys db)).. (remfi
32c0: 65 6c 64 73 20 28 6c 69 73 74 20 22 69 64 22 20  elds (list "id" 
32d0: 22 72 75 6e 6e 61 6d 65 22 20 22 73 74 61 74 65  "runname" "state
32e0: 22 20 22 73 74 61 74 75 73 22 20 22 6f 77 6e 65  " "status" "owne
32f0: 72 22 20 22 65 76 65 6e 74 5f 74 69 6d 65 22 29  r" "event_time")
3300: 29 0a 09 20 28 68 65 61 64 65 72 20 20 20 20 28  ).. (header    (
3310: 61 70 70 65 6e 64 20 28 6d 61 70 20 6b 65 79 3a  append (map key:
3320: 67 65 74 2d 66 69 65 6c 64 6e 61 6d 65 20 6b 65  get-fieldname ke
3330: 79 73 29 0a 09 09 09 20 20 20 20 72 65 6d 66 69  ys)....    remfi
3340: 65 6c 64 73 29 29 0a 09 20 28 6b 65 79 73 74 72  elds)).. (keystr
3350: 20 20 20 20 28 63 6f 6e 63 20 28 6b 65 79 73 2d      (conc (keys-
3360: 3e 6b 65 79 73 74 72 20 6b 65 79 73 29 20 22 2c  >keystr keys) ",
3370: 22 0a 09 09 09 20 20 28 73 74 72 69 6e 67 2d 69  "....  (string-i
3380: 6e 74 65 72 73 70 65 72 73 65 20 72 65 6d 66 69  ntersperse remfi
3390: 65 6c 64 73 20 22 2c 22 29 29 29 0a 09 20 28 71  elds ","))).. (q
33a0: 72 79 73 74 72 20 20 20 20 28 63 6f 6e 63 20 22  rystr    (conc "
33b0: 53 45 4c 45 43 54 20 22 20 6b 65 79 73 74 72 20  SELECT " keystr 
33c0: 22 20 46 52 4f 4d 20 72 75 6e 73 20 57 48 45 52  " FROM runs WHER
33d0: 45 20 72 75 6e 6e 61 6d 65 20 4c 49 4b 45 20 3f  E runname LIKE ?
33e0: 20 22 0a 09 09 09 20 20 3b 3b 20 47 65 6e 65 72   "....  ;; Gener
33f0: 61 74 65 3a 20 22 20 41 4e 44 20 78 20 4c 49 4b  ate: " AND x LIK
3400: 45 20 27 6b 65 79 70 61 74 74 27 20 2e 2e 2e 22  E 'keypatt' ..."
3410: 0a 09 09 09 20 20 28 69 66 20 28 6e 75 6c 6c 3f  ....  (if (null?
3420: 20 6b 65 79 70 61 74 74 73 29 20 22 22 0a 09 09   keypatts) ""...
3430: 09 20 20 20 20 20 20 28 63 6f 6e 63 20 22 20 41  .      (conc " A
3440: 4e 44 20 22 0a 09 09 09 09 20 20 20 20 28 73 74  ND ".....    (st
3450: 72 69 6e 67 2d 6a 6f 69 6e 20 0a 09 09 09 09 20  ring-join ..... 
3460: 20 20 20 20 28 6d 61 70 20 28 6c 61 6d 62 64 61      (map (lambda
3470: 20 28 6b 65 79 70 61 74 74 29 0a 09 09 09 09 09   (keypatt)......
3480: 20 20 20 20 28 6c 65 74 20 28 28 6b 65 79 20 20      (let ((key  
3490: 28 63 61 72 20 6b 65 79 70 61 74 74 29 29 0a 09  (car keypatt))..
34a0: 09 09 09 09 09 20 20 28 70 61 74 74 20 28 63 61  .....  (patt (ca
34b0: 64 72 20 6b 65 79 70 61 74 74 29 29 29 0a 09 09  dr keypatt)))...
34c0: 09 09 09 20 20 20 20 20 20 28 63 6f 6e 63 20 6b  ...      (conc k
34d0: 65 79 20 22 20 4c 49 4b 45 20 27 22 20 70 61 74  ey " LIKE '" pat
34e0: 74 20 22 27 22 29 29 29 0a 09 09 09 09 09 20 20  t "'")))......  
34f0: 6b 65 79 70 61 74 74 73 29 0a 09 09 09 09 20 20  keypatts).....  
3500: 20 20 20 22 20 41 4e 44 20 22 29 29 29 0a 09 09     " AND ")))...
3510: 09 20 20 22 20 4f 52 44 45 52 20 42 59 20 65 76  .  " ORDER BY ev
3520: 65 6e 74 5f 74 69 6d 65 20 44 45 53 43 20 22 0a  ent_time DESC ".
3530: 09 09 09 20 20 28 69 66 20 28 6e 75 6d 62 65 72  ...  (if (number
3540: 3f 20 63 6f 75 6e 74 29 0a 09 09 09 20 20 20 20  ? count)....    
3550: 20 20 28 63 6f 6e 63 20 22 20 4c 49 4d 49 54 20    (conc " LIMIT 
3560: 22 20 63 6f 75 6e 74 29 0a 09 09 09 20 20 20 20  " count)....    
3570: 20 20 22 22 29 0a 09 09 09 20 20 28 69 66 20 28    "")....  (if (
3580: 6e 75 6d 62 65 72 3f 20 6f 66 66 73 65 74 29 0a  number? offset).
3590: 09 09 09 20 20 20 20 20 20 28 63 6f 6e 63 20 22  ...      (conc "
35a0: 20 4f 46 46 53 45 54 20 22 20 6f 66 66 73 65 74   OFFSET " offset
35b0: 29 0a 09 09 09 20 20 20 20 20 20 22 22 29 29 29  )....      "")))
35c0: 29 0a 20 20 20 20 28 64 65 62 75 67 3a 70 72 69  ).    (debug:pri
35d0: 6e 74 20 34 20 22 64 62 3a 67 65 74 2d 72 75 6e  nt 4 "db:get-run
35e0: 73 20 71 72 79 73 74 72 3a 20 22 20 71 72 79 73  s qrystr: " qrys
35f0: 74 72 20 22 5c 6e 6b 65 79 70 61 74 74 73 3a 20  tr "\nkeypatts: 
3600: 22 20 6b 65 79 70 61 74 74 73 20 22 5c 6e 20 20  " keypatts "\n  
3610: 6f 66 66 73 65 74 3a 20 22 20 6f 66 66 73 65 74  offset: " offset
3620: 20 22 20 6c 69 6d 69 74 3a 20 22 20 63 6f 75 6e   " limit: " coun
3630: 74 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a  t).    (sqlite3:
3640: 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20  for-each-row.   
3650: 20 20 28 6c 61 6d 62 64 61 20 28 61 20 2e 20 78    (lambda (a . x
3660: 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72  ).       (set! r
3670: 65 73 20 28 63 6f 6e 73 20 28 61 70 70 6c 79 20  es (cons (apply 
3680: 76 65 63 74 6f 72 20 61 20 78 29 20 72 65 73 29  vector a x) res)
3690: 29 29 0a 20 20 20 20 20 64 62 0a 20 20 20 20 20  )).     db.     
36a0: 71 72 79 73 74 72 0a 20 20 20 20 20 72 75 6e 70  qrystr.     runp
36b0: 61 74 74 29 0a 20 20 20 20 28 76 65 63 74 6f 72  att).    (vector
36c0: 20 68 65 61 64 65 72 20 72 65 73 29 29 29 0a 0a   header res)))..
36d0: 3b 3b 20 6a 75 73 74 20 67 65 74 20 63 6f 75 6e  ;; just get coun
36e0: 74 20 6f 66 20 72 75 6e 73 0a 28 64 65 66 69 6e  t of runs.(defin
36f0: 65 20 28 64 62 3a 67 65 74 2d 6e 75 6d 2d 72 75  e (db:get-num-ru
3700: 6e 73 20 64 62 20 72 75 6e 70 61 74 74 29 0a 20  ns db runpatt). 
3710: 20 28 6c 65 74 20 28 28 6e 75 6d 72 75 6e 73 20   (let ((numruns 
3720: 30 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33  0)).    (sqlite3
3730: 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20  :for-each-row . 
3740: 20 20 20 20 28 6c 61 6d 62 64 61 20 28 63 6f 75      (lambda (cou
3750: 6e 74 29 0a 20 20 20 20 20 20 20 28 73 65 74 21  nt).       (set!
3760: 20 6e 75 6d 72 75 6e 73 20 63 6f 75 6e 74 29 29   numruns count))
3770: 0a 20 20 20 20 20 64 62 0a 20 20 20 20 20 22 53  .     db.     "S
3780: 45 4c 45 43 54 20 43 4f 55 4e 54 28 69 64 29 20  ELECT COUNT(id) 
3790: 46 52 4f 4d 20 72 75 6e 73 20 57 48 45 52 45 20  FROM runs WHERE 
37a0: 72 75 6e 6e 61 6d 65 20 4c 49 4b 45 20 3f 3b 22  runname LIKE ?;"
37b0: 20 72 75 6e 70 61 74 74 29 0a 20 20 20 20 6e 75   runpatt).    nu
37c0: 6d 72 75 6e 73 29 29 0a 0a 0a 3b 3b 20 75 73 65  mruns))...;; use
37d0: 20 28 67 65 74 2d 76 61 6c 75 65 2d 62 79 2d 68   (get-value-by-h
37e0: 65 61 64 65 72 20 28 64 62 3a 67 65 74 2d 68 65  eader (db:get-he
37f0: 61 64 65 72 20 72 75 6e 69 6e 66 6f 29 28 64 62  ader runinfo)(db
3800: 3a 67 65 74 2d 72 6f 77 20 72 75 6e 69 6e 66 6f  :get-row runinfo
3810: 29 29 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67  )).(define (db:g
3820: 65 74 2d 72 75 6e 2d 69 6e 66 6f 20 64 62 20 72  et-run-info db r
3830: 75 6e 2d 69 64 29 0a 20 20 28 6c 65 74 2a 20 28  un-id).  (let* (
3840: 28 72 65 73 20 20 20 20 20 20 23 66 29 0a 09 20  (res      #f).. 
3850: 28 6b 65 79 73 20 20 20 20 20 20 28 64 62 2d 67  (keys      (db-g
3860: 65 74 2d 6b 65 79 73 20 64 62 29 29 0a 09 20 28  et-keys db)).. (
3870: 72 65 6d 66 69 65 6c 64 73 20 28 6c 69 73 74 20  remfields (list 
3880: 22 69 64 22 20 22 72 75 6e 6e 61 6d 65 22 20 22  "id" "runname" "
3890: 73 74 61 74 65 22 20 22 73 74 61 74 75 73 22 20  state" "status" 
38a0: 22 6f 77 6e 65 72 22 20 22 65 76 65 6e 74 5f 74  "owner" "event_t
38b0: 69 6d 65 22 29 29 0a 09 20 28 68 65 61 64 65 72  ime")).. (header
38c0: 20 20 20 20 28 61 70 70 65 6e 64 20 28 6d 61 70      (append (map
38d0: 20 6b 65 79 3a 67 65 74 2d 66 69 65 6c 64 6e 61   key:get-fieldna
38e0: 6d 65 20 6b 65 79 73 29 0a 09 09 09 20 20 20 20  me keys)....    
38f0: 72 65 6d 66 69 65 6c 64 73 29 29 0a 09 20 28 6b  remfields)).. (k
3900: 65 79 73 74 72 20 20 20 20 28 63 6f 6e 63 20 28  eystr    (conc (
3910: 6b 65 79 73 2d 3e 6b 65 79 73 74 72 20 6b 65 79  keys->keystr key
3920: 73 29 20 22 2c 22 0a 09 09 09 20 20 28 73 74 72  s) ","....  (str
3930: 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20  ing-intersperse 
3940: 72 65 6d 66 69 65 6c 64 73 20 22 2c 22 29 29 29  remfields ",")))
3950: 29 0a 20 20 20 20 3b 3b 20 28 64 65 62 75 67 3a  ).    ;; (debug:
3960: 70 72 69 6e 74 20 30 20 22 64 62 3a 67 65 74 2d  print 0 "db:get-
3970: 72 75 6e 2d 69 6e 66 6f 20 72 75 6e 2d 69 64 3a  run-info run-id:
3980: 20 22 20 72 75 6e 2d 69 64 20 22 20 68 65 61 64   " run-id " head
3990: 65 72 3a 20 22 20 68 65 61 64 65 72 20 22 20 6b  er: " header " k
39a0: 65 79 73 74 72 3a 20 22 20 6b 65 79 73 74 72 29  eystr: " keystr)
39b0: 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f  .    (sqlite3:fo
39c0: 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 20  r-each-row.     
39d0: 28 6c 61 6d 62 64 61 20 28 61 20 2e 20 78 29 0a  (lambda (a . x).
39e0: 20 20 20 20 20 20 20 28 73 65 74 21 20 72 65 73         (set! res
39f0: 20 28 61 70 70 6c 79 20 76 65 63 74 6f 72 20 61   (apply vector a
3a00: 20 78 29 29 29 0a 20 20 20 20 20 64 62 0a 20 20   x))).     db.  
3a10: 20 20 20 28 63 6f 6e 63 20 22 53 45 4c 45 43 54     (conc "SELECT
3a20: 20 22 20 6b 65 79 73 74 72 20 22 20 46 52 4f 4d   " keystr " FROM
3a30: 20 72 75 6e 73 20 57 48 45 52 45 20 69 64 3d 3f   runs WHERE id=?
3a40: 3b 22 29 0a 20 20 20 20 20 72 75 6e 2d 69 64 29  ;").     run-id)
3a50: 0a 20 20 20 20 28 76 65 63 74 6f 72 20 68 65 61  .    (vector hea
3a60: 64 65 72 20 72 65 73 29 29 29 0a 0a 28 64 65 66  der res)))..(def
3a70: 69 6e 65 20 28 64 62 3a 73 65 74 2d 63 6f 6d 6d  ine (db:set-comm
3a80: 65 6e 74 2d 66 6f 72 2d 72 75 6e 20 64 62 20 72  ent-for-run db r
3a90: 75 6e 2d 69 64 20 63 6f 6d 6d 65 6e 74 29 0a 20  un-id comment). 
3aa0: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
3ab0: 65 20 64 62 20 22 55 50 44 41 54 45 20 72 75 6e  e db "UPDATE run
3ac0: 73 20 53 45 54 20 63 6f 6d 6d 65 6e 74 3d 3f 20  s SET comment=? 
3ad0: 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 63 6f 6d  WHERE id=?;" com
3ae0: 6d 65 6e 74 20 72 75 6e 2d 69 64 29 29 0a 0a 3b  ment run-id))..;
3af0: 3b 20 64 6f 65 73 20 6e 6f 74 20 28 6f 62 76 69  ; does not (obvi
3b00: 6f 75 73 6c 79 21 29 20 72 65 6d 6f 76 65 64 20  ously!) removed 
3b10: 64 65 70 65 6e 64 65 6e 74 20 64 61 74 61 2e 20  dependent data. 
3b20: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 64 65 6c  .(define (db:del
3b30: 65 74 65 2d 72 75 6e 20 64 62 20 72 75 6e 2d 69  ete-run db run-i
3b40: 64 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78  d).  (sqlite3:ex
3b50: 65 63 75 74 65 20 64 62 20 22 44 45 4c 45 54 45  ecute db "DELETE
3b60: 20 46 52 4f 4d 20 72 75 6e 73 20 57 48 45 52 45   FROM runs WHERE
3b70: 20 69 64 3d 3f 3b 22 20 72 75 6e 2d 69 64 29 29   id=?;" run-id))
3b80: 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 75 70  ..(define (db:up
3b90: 64 61 74 65 2d 72 75 6e 2d 65 76 65 6e 74 5f 74  date-run-event_t
3ba0: 69 6d 65 20 64 62 20 72 75 6e 2d 69 64 29 0a 20  ime db run-id). 
3bb0: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
3bc0: 65 20 64 62 20 22 55 50 44 41 54 45 20 72 75 6e  e db "UPDATE run
3bd0: 73 20 53 45 54 20 65 76 65 6e 74 5f 74 69 6d 65  s SET event_time
3be0: 3d 73 74 72 66 74 69 6d 65 28 27 25 73 27 2c 27  =strftime('%s','
3bf0: 6e 6f 77 27 29 20 57 48 45 52 45 20 69 64 3d 3f  now') WHERE id=?
3c00: 3b 22 20 72 75 6e 2d 69 64 29 29 20 0a 0a 3b 3b  ;" run-id)) ..;;
3c10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3c20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3c30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3c40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3c50: 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 20 54 20 45 20 53  ======.;;  T E S
3c60: 20 54 20 53 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d   T S.;;=========
3c70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3c80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3c90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3ca0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b  =============..;
3cb0: 3b 20 73 74 61 74 65 73 20 61 6e 64 20 73 74 61  ; states and sta
3cc0: 74 75 73 65 73 20 61 72 65 20 6c 69 73 74 73 2c  tuses are lists,
3cd0: 20 74 75 72 6e 20 74 68 65 6d 20 69 6e 74 6f 20   turn them into 
3ce0: 28 22 50 41 53 53 22 2c 22 46 41 49 4c 22 2e 2e  ("PASS","FAIL"..
3cf0: 2e 29 20 61 6e 64 20 75 73 65 20 4e 4f 54 20 49  .) and use NOT I
3d00: 4e 0a 3b 3b 20 69 2e 65 2e 20 74 68 65 73 65 20  N.;; i.e. these 
3d10: 6c 69 73 74 73 20 64 65 66 69 6e 65 20 77 68 61  lists define wha
3d20: 74 20 74 6f 20 4e 4f 54 20 73 68 6f 77 2e 0a 3b  t to NOT show..;
3d30: 3b 20 73 74 61 74 65 73 20 61 6e 64 20 73 74 61  ; states and sta
3d40: 74 75 73 65 73 20 61 72 65 20 72 65 71 75 69 72  tuses are requir
3d50: 65 64 20 74 6f 20 62 65 20 6c 69 73 74 73 2c 20  ed to be lists, 
3d60: 65 6d 70 74 79 20 69 73 20 6f 6b 0a 28 64 65 66  empty is ok.(def
3d70: 69 6e 65 20 28 64 62 2d 67 65 74 2d 74 65 73 74  ine (db-get-test
3d80: 73 2d 66 6f 72 2d 72 75 6e 20 64 62 20 72 75 6e  s-for-run db run
3d90: 2d 69 64 20 74 65 73 74 70 61 74 74 20 69 74 65  -id testpatt ite
3da0: 6d 70 61 74 74 20 73 74 61 74 65 73 20 73 74 61  mpatt states sta
3db0: 74 75 73 65 73 29 0a 20 20 28 6c 65 74 20 28 28  tuses).  (let ((
3dc0: 72 65 73 20 27 28 29 29 0a 09 28 73 74 61 74 65  res '())..(state
3dd0: 73 2d 73 74 72 20 20 20 20 28 63 6f 6e 63 20 22  s-str    (conc "
3de0: 28 27 22 20 28 73 74 72 69 6e 67 2d 69 6e 74 65  ('" (string-inte
3df0: 72 73 70 65 72 73 65 20 73 74 61 74 65 73 20 20  rsperse states  
3e00: 20 22 27 2c 27 22 29 20 22 27 29 22 29 29 0a 09   "','") "')"))..
3e10: 28 73 74 61 74 75 73 65 73 2d 73 74 72 20 20 28  (statuses-str  (
3e20: 63 6f 6e 63 20 22 28 27 22 20 28 73 74 72 69 6e  conc "('" (strin
3e30: 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 73 74  g-intersperse st
3e40: 61 74 75 73 65 73 20 22 27 2c 27 22 29 20 22 27  atuses "','") "'
3e50: 29 22 29 29 0a 09 29 0a 20 20 20 20 28 73 71 6c  )"))..).    (sql
3e60: 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f  ite3:for-each-ro
3e70: 77 20 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20  w .     (lambda 
3e80: 28 69 64 20 72 75 6e 2d 69 64 20 74 65 73 74 6e  (id run-id testn
3e90: 61 6d 65 20 73 74 61 74 65 20 73 74 61 74 75 73  ame state status
3ea0: 20 65 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73 74   event-time host
3eb0: 20 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65   cpuload diskfre
3ec0: 65 20 75 6e 61 6d 65 20 72 75 6e 64 69 72 20 69  e uname rundir i
3ed0: 74 65 6d 2d 70 61 74 68 20 72 75 6e 2d 64 75 72  tem-path run-dur
3ee0: 61 74 69 6f 6e 20 66 69 6e 61 6c 2d 6c 6f 67 66  ation final-logf
3ef0: 20 63 6f 6d 6d 65 6e 74 29 0a 20 20 20 20 20 20   comment).      
3f00: 20 28 73 65 74 21 20 72 65 73 20 28 63 6f 6e 73   (set! res (cons
3f10: 20 28 76 65 63 74 6f 72 20 69 64 20 72 75 6e 2d   (vector id run-
3f20: 69 64 20 74 65 73 74 6e 61 6d 65 20 73 74 61 74  id testname stat
3f30: 65 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d 74  e status event-t
3f40: 69 6d 65 20 68 6f 73 74 20 63 70 75 6c 6f 61 64  ime host cpuload
3f50: 20 64 69 73 6b 66 72 65 65 20 75 6e 61 6d 65 20   diskfree uname 
3f60: 72 75 6e 64 69 72 20 69 74 65 6d 2d 70 61 74 68  rundir item-path
3f70: 20 72 75 6e 2d 64 75 72 61 74 69 6f 6e 20 66 69   run-duration fi
3f80: 6e 61 6c 2d 6c 6f 67 66 20 63 6f 6d 6d 65 6e 74  nal-logf comment
3f90: 29 20 72 65 73 29 29 29 0a 20 20 20 20 20 64 62  ) res))).     db
3fa0: 20 0a 20 20 20 20 20 28 63 6f 6e 63 20 22 53 45   .     (conc "SE
3fb0: 4c 45 43 54 20 69 64 2c 72 75 6e 5f 69 64 2c 74  LECT id,run_id,t
3fc0: 65 73 74 6e 61 6d 65 2c 73 74 61 74 65 2c 73 74  estname,state,st
3fd0: 61 74 75 73 2c 65 76 65 6e 74 5f 74 69 6d 65 2c  atus,event_time,
3fe0: 68 6f 73 74 2c 63 70 75 6c 6f 61 64 2c 64 69 73  host,cpuload,dis
3ff0: 6b 66 72 65 65 2c 75 6e 61 6d 65 2c 72 75 6e 64  kfree,uname,rund
4000: 69 72 2c 69 74 65 6d 5f 70 61 74 68 2c 72 75 6e  ir,item_path,run
4010: 5f 64 75 72 61 74 69 6f 6e 2c 66 69 6e 61 6c 5f  _duration,final_
4020: 6c 6f 67 66 2c 63 6f 6d 6d 65 6e 74 20 22 0a 09  logf,comment "..
4030: 20 20 20 22 20 46 52 4f 4d 20 74 65 73 74 73 20     " FROM tests 
4040: 57 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41  WHERE run_id=? A
4050: 4e 44 20 74 65 73 74 6e 61 6d 65 20 6c 69 6b 65  ND testname like
4060: 20 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68   ? AND item_path
4070: 20 4c 49 4b 45 20 3f 20 22 20 0a 09 20 20 20 22   LIKE ? " ..   "
4080: 20 41 4e 44 20 4e 4f 54 20 28 73 74 61 74 65 20   AND NOT (state 
4090: 69 6e 20 22 20 73 74 61 74 65 73 2d 73 74 72 20  in " states-str 
40a0: 22 20 41 4e 44 20 73 74 61 74 75 73 20 49 4e 20  " AND status IN 
40b0: 22 20 73 74 61 74 75 73 65 73 2d 73 74 72 20 22  " statuses-str "
40c0: 29 20 22 0a 09 20 20 20 3b 3b 20 22 20 4f 52 44  ) "..   ;; " ORD
40d0: 45 52 20 42 59 20 69 64 20 44 45 53 43 3b 22 0a  ER BY id DESC;".
40e0: 09 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 65  .   " ORDER BY e
40f0: 76 65 6e 74 5f 74 69 6d 65 20 41 53 43 3b 22 20  vent_time ASC;" 
4100: 3b 3b 20 50 4f 54 45 4e 54 49 41 4c 20 49 53 53  ;; POTENTIAL ISS
4110: 55 45 21 20 43 48 45 43 4b 20 4d 45 21 20 44 6f  UE! CHECK ME! Do
4120: 65 73 20 61 6e 79 74 69 6e 67 20 64 65 70 65 6e  es anyting depen
4130: 64 20 6f 6e 20 74 68 69 73 20 62 65 69 6e 67 20  d on this being 
4140: 73 6f 72 74 65 64 20 62 79 20 69 64 3f 0a 09 20  sorted by id?.. 
4150: 20 20 29 0a 20 20 20 20 20 72 75 6e 2d 69 64 0a    ).     run-id.
4160: 20 20 20 20 20 28 69 66 20 74 65 73 74 70 61 74       (if testpat
4170: 74 20 74 65 73 74 70 61 74 74 20 22 25 22 29 0a  t testpatt "%").
4180: 20 20 20 20 20 28 69 66 20 69 74 65 6d 70 61 74       (if itempat
4190: 74 20 69 74 65 6d 70 61 74 74 20 22 25 22 29 29  t itempatt "%"))
41a0: 0a 20 20 20 20 72 65 73 29 29 0a 0a 3b 3b 20 74  .    res))..;; t
41b0: 68 69 73 20 6f 6e 65 20 69 73 20 61 20 62 69 74  his one is a bit
41c0: 20 62 72 6f 6b 65 6e 20 42 55 47 20 46 49 58 4d   broken BUG FIXM
41d0: 45 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 64 65  E.(define (db:de
41e0: 6c 65 74 65 2d 74 65 73 74 2d 73 74 65 70 2d 72  lete-test-step-r
41f0: 65 63 6f 72 64 73 20 64 62 20 72 75 6e 2d 69 64  ecords db run-id
4200: 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 64   test-name itemd
4210: 61 74 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65  at).  (sqlite3:e
4220: 78 65 63 75 74 65 20 64 62 20 22 44 45 4c 45 54  xecute db "DELET
4230: 45 20 46 52 4f 4d 20 74 65 73 74 5f 73 74 65 70  E FROM test_step
4240: 73 20 57 48 45 52 45 20 74 65 73 74 5f 69 64 20  s WHERE test_id 
4250: 69 6e 20 28 53 45 4c 45 43 54 20 69 64 20 46 52  in (SELECT id FR
4260: 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 72  OM tests WHERE r
4270: 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74  un_id=? AND test
4280: 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f  name=? AND item_
4290: 70 61 74 68 3d 3f 29 3b 22 20 0a 09 09 20 20 20  path=?);" ...   
42a0: 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65  run-id test-name
42b0: 20 28 69 74 65 6d 2d 6c 69 73 74 2d 3e 70 61 74   (item-list->pat
42c0: 68 20 69 74 65 6d 64 61 74 29 29 29 0a 3b 3b 20  h itemdat))).;; 
42d0: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 64 65 6c  .(define (db:del
42e0: 65 74 65 2d 74 65 73 74 2d 72 65 63 6f 72 64 73  ete-test-records
42f0: 20 64 62 20 74 65 73 74 2d 69 64 29 0a 20 20 28   db test-id).  (
4300: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
4310: 64 62 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  db "DELETE FROM 
4320: 74 65 73 74 5f 73 74 65 70 73 20 57 48 45 52 45  test_steps WHERE
4330: 20 74 65 73 74 5f 69 64 3d 3f 3b 22 20 74 65 73   test_id=?;" tes
4340: 74 2d 69 64 29 0a 20 20 28 73 71 6c 69 74 65 33  t-id).  (sqlite3
4350: 3a 65 78 65 63 75 74 65 20 64 62 20 22 44 45 4c  :execute db "DEL
4360: 45 54 45 20 46 52 4f 4d 20 74 65 73 74 5f 64 61  ETE FROM test_da
4370: 74 61 20 20 57 48 45 52 45 20 74 65 73 74 5f 69  ta  WHERE test_i
4380: 64 3d 3f 3b 22 20 74 65 73 74 2d 69 64 29 0a 20  d=?;" test-id). 
4390: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
43a0: 65 20 64 62 20 22 44 45 4c 45 54 45 20 46 52 4f  e db "DELETE FRO
43b0: 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 69 64  M tests WHERE id
43c0: 3d 3f 3b 22 20 74 65 73 74 2d 69 64 29 29 0a 0a  =?;" test-id))..
43d0: 3b 3b 20 73 65 74 20 74 65 73 74 73 20 77 69 74  ;; set tests wit
43e0: 68 20 73 74 61 74 65 20 63 75 72 72 73 74 61 74  h state currstat
43f0: 65 20 61 6e 64 20 73 74 61 74 75 73 20 63 75 72  e and status cur
4400: 72 73 74 61 74 75 73 20 74 6f 20 6e 65 77 73 74  rstatus to newst
4410: 61 74 65 20 61 6e 64 20 6e 65 77 73 74 61 74 75  ate and newstatu
4420: 73 0a 3b 3b 20 75 73 65 20 63 75 72 72 73 74 61  s.;; use currsta
4430: 74 65 20 3d 20 23 66 20 61 6e 64 20 6f 72 20 63  te = #f and or c
4440: 75 72 72 73 74 61 74 75 73 20 3d 20 23 66 20 74  urrstatus = #f t
4450: 6f 20 61 70 70 6c 79 20 74 6f 20 61 6e 79 20 73  o apply to any s
4460: 74 61 74 65 20 6f 72 20 73 74 61 74 75 73 20 72  tate or status r
4470: 65 73 70 65 63 74 69 76 65 6c 79 0a 3b 3b 20 57  espectively.;; W
4480: 41 52 4e 49 4e 47 3a 20 53 51 4c 20 69 6e 6a 65  ARNING: SQL inje
4490: 63 74 69 6f 6e 20 72 69 73 6b 0a 28 64 65 66 69  ction risk.(defi
44a0: 6e 65 20 28 64 62 3a 73 65 74 2d 74 65 73 74 73  ne (db:set-tests
44b0: 2d 73 74 61 74 65 2d 73 74 61 74 75 73 20 64 62  -state-status db
44c0: 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65   run-id testname
44d0: 73 20 63 75 72 72 73 74 61 74 65 20 63 75 72 72  s currstate curr
44e0: 73 74 61 74 75 73 20 6e 65 77 73 74 61 74 65 20  status newstate 
44f0: 6e 65 77 73 74 61 74 75 73 29 0a 20 20 28 66 6f  newstatus).  (fo
4500: 72 2d 65 61 63 68 20 28 6c 61 6d 62 64 61 20 28  r-each (lambda (
4510: 74 65 73 74 6e 61 6d 65 29 0a 09 20 20 20 20 20  testname)..     
4520: 20 28 6c 65 74 20 28 28 71 72 79 20 28 63 6f 6e   (let ((qry (con
4530: 63 20 22 55 50 44 41 54 45 20 74 65 73 74 73 20  c "UPDATE tests 
4540: 53 45 54 20 73 74 61 74 65 3d 3f 2c 73 74 61 74  SET state=?,stat
4550: 75 73 3d 3f 20 57 48 45 52 45 20 22 0a 09 09 09  us=? WHERE "....
4560: 09 09 28 69 66 20 63 75 72 72 73 74 61 74 65 20  ..(if currstate 
4570: 20 28 63 6f 6e 63 20 22 73 74 61 74 65 3d 27 22   (conc "state='"
4580: 20 63 75 72 72 73 74 61 74 65 20 22 27 20 41 4e   currstate "' AN
4590: 44 20 22 29 20 22 22 29 0a 09 09 09 09 09 28 69  D ") "")......(i
45a0: 66 20 63 75 72 72 73 74 61 74 75 73 20 28 63 6f  f currstatus (co
45b0: 6e 63 20 22 73 74 61 74 75 73 3d 27 22 20 63 75  nc "status='" cu
45c0: 72 72 73 74 61 74 75 73 20 22 27 20 41 4e 44 20  rrstatus "' AND 
45d0: 22 29 20 22 22 29 0a 09 09 09 09 09 22 20 72 75  ") "")......" ru
45e0: 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e  n_id=? AND testn
45f0: 61 6d 65 3d 3f 20 41 4e 44 20 4e 4f 54 20 28 69  ame=? AND NOT (i
4600: 74 65 6d 5f 70 61 74 68 3d 27 27 20 41 4e 44 20  tem_path='' AND 
4610: 74 65 73 74 6e 61 6d 65 20 69 6e 20 28 53 45 4c  testname in (SEL
4620: 45 43 54 20 44 49 53 54 49 4e 43 54 20 74 65 73  ECT DISTINCT tes
4630: 74 6e 61 6d 65 20 46 52 4f 4d 20 74 65 73 74 73  tname FROM tests
4640: 20 57 48 45 52 45 20 74 65 73 74 6e 61 6d 65 3d   WHERE testname=
4650: 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 20  ? AND item_path 
4660: 21 3d 20 27 27 29 29 3b 22 29 29 29 0a 09 09 3b  != ''));")))...;
4670: 3b 28 64 65 62 75 67 3a 70 72 69 6e 74 20 30 20  ;(debug:print 0 
4680: 22 51 52 59 3a 20 22 20 71 72 79 29 0a 09 09 28  "QRY: " qry)...(
4690: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
46a0: 64 62 20 71 72 79 20 72 75 6e 2d 69 64 20 6e 65  db qry run-id ne
46b0: 77 73 74 61 74 65 20 6e 65 77 73 74 61 74 75 73  wstate newstatus
46c0: 20 74 65 73 74 6e 61 6d 65 20 74 65 73 74 6e 61   testname testna
46d0: 6d 65 29 29 29 0a 09 20 20 20 20 74 65 73 74 6e  me)))..    testn
46e0: 61 6d 65 73 29 29 0a 0a 28 64 65 66 69 6e 65 20  ames))..(define 
46f0: 28 64 62 3a 64 65 6c 65 74 65 2d 74 65 73 74 73  (db:delete-tests
4700: 2d 69 6e 2d 73 74 61 74 65 20 64 62 20 72 75 6e  -in-state db run
4710: 2d 69 64 20 73 74 61 74 65 29 0a 20 20 28 73 71  -id state).  (sq
4720: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62  lite3:execute db
4730: 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 65   "DELETE FROM te
4740: 73 74 73 20 57 48 45 52 45 20 73 74 61 74 65 3d  sts WHERE state=
4750: 3f 20 41 4e 44 20 72 75 6e 5f 69 64 3d 3f 3b 22  ? AND run_id=?;"
4760: 20 73 74 61 74 65 20 72 75 6e 2d 69 64 29 29 0a   state run-id)).
4770: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73  .(define (db:tes
4780: 74 2d 73 65 74 2d 73 74 61 74 65 2d 73 74 61 74  t-set-state-stat
4790: 75 73 2d 62 79 2d 69 64 20 64 62 20 74 65 73 74  us-by-id db test
47a0: 2d 69 64 20 6e 65 77 73 74 61 74 65 20 6e 65 77  -id newstate new
47b0: 73 74 61 74 75 73 20 6e 65 77 63 6f 6d 6d 65 6e  status newcommen
47c0: 74 29 0a 20 20 28 69 66 20 6e 65 77 73 74 61 74  t).  (if newstat
47d0: 65 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65  e   (sqlite3:exe
47e0: 63 75 74 65 20 64 62 20 22 55 50 44 41 54 45 20  cute db "UPDATE 
47f0: 74 65 73 74 73 20 53 45 54 20 73 74 61 74 65 3d  tests SET state=
4800: 3f 20 20 20 57 48 45 52 45 20 69 64 3d 3f 3b 22  ?   WHERE id=?;"
4810: 20 6e 65 77 73 74 61 74 65 20 20 20 74 65 73 74   newstate   test
4820: 2d 69 64 29 29 0a 20 20 28 69 66 20 6e 65 77 73  -id)).  (if news
4830: 74 61 74 75 73 20 20 28 73 71 6c 69 74 65 33 3a  tatus  (sqlite3:
4840: 65 78 65 63 75 74 65 20 64 62 20 22 55 50 44 41  execute db "UPDA
4850: 54 45 20 74 65 73 74 73 20 53 45 54 20 73 74 61  TE tests SET sta
4860: 74 75 73 3d 3f 20 20 57 48 45 52 45 20 69 64 3d  tus=?  WHERE id=
4870: 3f 3b 22 20 6e 65 77 73 74 61 74 75 73 20 20 74  ?;" newstatus  t
4880: 65 73 74 2d 69 64 29 29 0a 20 20 28 69 66 20 6e  est-id)).  (if n
4890: 65 77 63 6f 6d 6d 65 6e 74 20 28 73 71 6c 69 74  ewcomment (sqlit
48a0: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 55  e3:execute db "U
48b0: 50 44 41 54 45 20 74 65 73 74 73 20 53 45 54 20  PDATE tests SET 
48c0: 63 6f 6d 6d 65 6e 74 3d 3f 20 57 48 45 52 45 20  comment=? WHERE 
48d0: 69 64 3d 3f 3b 22 20 6e 65 77 63 6f 6d 6d 65 6e  id=?;" newcommen
48e0: 74 20 74 65 73 74 2d 69 64 29 29 29 0a 0a 28 64  t test-id)))..(d
48f0: 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 63 6f  efine (db:get-co
4900: 75 6e 74 2d 74 65 73 74 73 2d 72 75 6e 6e 69 6e  unt-tests-runnin
4910: 67 20 64 62 29 0a 20 20 28 6c 65 74 20 28 28 72  g db).  (let ((r
4920: 65 73 20 30 29 29 0a 20 20 20 20 28 73 71 6c 69  es 0)).    (sqli
4930: 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77  te3:for-each-row
4940: 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 63  .     (lambda (c
4950: 6f 75 6e 74 29 0a 20 20 20 20 20 20 20 28 73 65  ount).       (se
4960: 74 21 20 72 65 73 20 63 6f 75 6e 74 29 29 0a 20  t! res count)). 
4970: 20 20 20 20 64 62 0a 20 20 20 20 20 22 53 45 4c      db.     "SEL
4980: 45 43 54 20 63 6f 75 6e 74 28 69 64 29 20 46 52  ECT count(id) FR
4990: 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 73  OM tests WHERE s
49a0: 74 61 74 65 20 3d 20 27 52 55 4e 4e 49 4e 47 27  tate = 'RUNNING'
49b0: 20 4f 52 20 73 74 61 74 65 20 3d 20 27 4c 41 55   OR state = 'LAU
49c0: 4e 43 48 45 44 27 20 4f 52 20 73 74 61 74 65 20  NCHED' OR state 
49d0: 3d 20 27 52 45 4d 4f 54 45 48 4f 53 54 53 54 41  = 'REMOTEHOSTSTA
49e0: 52 54 27 3b 22 29 0a 20 20 20 20 72 65 73 29 29  RT';").    res))
49f0: 0a 0a 3b 3b 20 64 6f 6e 65 20 77 69 74 68 20 72  ..;; done with r
4a00: 75 6e 20 77 68 65 6e 3a 0a 3b 3b 20 20 20 30 20  un when:.;;   0 
4a10: 74 65 73 74 73 20 69 6e 20 4c 41 55 4e 43 48 45  tests in LAUNCHE
4a20: 44 2c 20 4e 4f 54 5f 53 54 41 52 54 45 44 2c 20  D, NOT_STARTED, 
4a30: 52 45 4d 4f 54 45 48 4f 53 54 53 54 41 52 54 2c  REMOTEHOSTSTART,
4a40: 20 52 55 4e 4e 49 4e 47 0a 28 64 65 66 69 6e 65   RUNNING.(define
4a50: 20 28 64 62 3a 65 73 74 69 6d 61 74 65 64 2d 74   (db:estimated-t
4a60: 65 73 74 73 2d 72 65 6d 61 69 6e 69 6e 67 20 64  ests-remaining d
4a70: 62 20 72 75 6e 2d 69 64 29 0a 20 20 28 6c 65 74  b run-id).  (let
4a80: 20 28 28 72 65 73 20 30 29 29 0a 20 20 20 20 28   ((res 0)).    (
4a90: 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68  sqlite3:for-each
4aa0: 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62 64  -row.     (lambd
4ab0: 61 20 28 63 6f 75 6e 74 29 0a 20 20 20 20 20 20  a (count).      
4ac0: 20 28 73 65 74 21 20 72 65 73 20 63 6f 75 6e 74   (set! res count
4ad0: 29 29 0a 20 20 20 20 20 64 62 20 3b 3b 20 4e 42  )).     db ;; NB
4ae0: 2f 2f 20 4b 49 4c 4c 52 45 51 20 6d 65 61 6e 73  // KILLREQ means
4af0: 20 74 68 65 20 6a 6f 62 73 20 69 73 20 73 74 69   the jobs is sti
4b00: 6c 6c 20 70 72 6f 62 61 62 6c 79 20 72 75 6e 6e  ll probably runn
4b10: 69 6e 67 0a 20 20 20 20 20 22 53 45 4c 45 43 54  ing.     "SELECT
4b20: 20 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20   count(id) FROM 
4b30: 74 65 73 74 73 20 57 48 45 52 45 20 73 74 61 74  tests WHERE stat
4b40: 65 20 69 6e 20 28 27 4c 41 55 4e 43 48 45 44 27  e in ('LAUNCHED'
4b50: 2c 27 4e 4f 54 5f 53 54 41 52 54 45 44 27 2c 27  ,'NOT_STARTED','
4b60: 52 45 4d 4f 54 45 48 4f 53 54 53 54 41 52 54 27  REMOTEHOSTSTART'
4b70: 2c 27 52 55 4e 4e 49 4e 47 27 2c 27 4b 49 4c 4c  ,'RUNNING','KILL
4b80: 52 45 51 27 29 20 41 4e 44 20 72 75 6e 5f 69 64  REQ') AND run_id
4b90: 3d 3f 3b 22 20 72 75 6e 2d 69 64 29 0a 20 20 20  =?;" run-id).   
4ba0: 20 72 65 73 29 29 0a 0a 3b 3b 20 4e 42 2f 2f 20   res))..;; NB// 
4bb0: 53 79 6e 63 20 74 68 69 73 20 77 69 74 68 20 72  Sync this with r
4bc0: 75 6e 73 3a 67 65 74 2d 74 65 73 74 2d 69 6e 66  uns:get-test-inf
4bd0: 6f 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65  o.(define (db:ge
4be0: 74 2d 74 65 73 74 2d 69 6e 66 6f 20 64 62 20 72  t-test-info db r
4bf0: 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 69  un-id testname i
4c00: 74 65 6d 2d 70 61 74 68 29 0a 20 20 28 6c 65 74  tem-path).  (let
4c10: 20 28 28 72 65 73 20 23 66 29 29 0a 20 20 20 20   ((res #f)).    
4c20: 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63  (sqlite3:for-eac
4c30: 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62  h-row.     (lamb
4c40: 64 61 20 28 69 64 20 72 75 6e 2d 69 64 20 74 65  da (id run-id te
4c50: 73 74 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61  stname state sta
4c60: 74 75 73 20 65 76 65 6e 74 2d 74 69 6d 65 20 68  tus event-time h
4c70: 6f 73 74 20 63 70 75 6c 6f 61 64 20 64 69 73 6b  ost cpuload disk
4c80: 66 72 65 65 20 75 6e 61 6d 65 20 72 75 6e 64 69  free uname rundi
4c90: 72 20 69 74 65 6d 2d 70 61 74 68 20 72 75 6e 5f  r item-path run_
4ca0: 64 75 72 61 74 69 6f 6e 20 66 69 6e 61 6c 5f 6c  duration final_l
4cb0: 6f 67 66 20 63 6f 6d 6d 65 6e 74 20 29 0a 20 20  ogf comment ).  
4cc0: 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28       (set! res (
4cd0: 76 65 63 74 6f 72 20 69 64 20 72 75 6e 2d 69 64  vector id run-id
4ce0: 20 74 65 73 74 6e 61 6d 65 20 73 74 61 74 65 20   testname state 
4cf0: 73 74 61 74 75 73 20 65 76 65 6e 74 2d 74 69 6d  status event-tim
4d00: 65 20 68 6f 73 74 20 63 70 75 6c 6f 61 64 20 64  e host cpuload d
4d10: 69 73 6b 66 72 65 65 20 75 6e 61 6d 65 20 72 75  iskfree uname ru
4d20: 6e 64 69 72 20 69 74 65 6d 2d 70 61 74 68 20 72  ndir item-path r
4d30: 75 6e 5f 64 75 72 61 74 69 6f 6e 20 66 69 6e 61  un_duration fina
4d40: 6c 5f 6c 6f 67 66 20 63 6f 6d 6d 65 6e 74 20 29  l_logf comment )
4d50: 29 29 0a 20 20 20 20 20 64 62 20 0a 20 20 20 20  )).     db .    
4d60: 20 22 53 45 4c 45 43 54 20 69 64 2c 72 75 6e 5f   "SELECT id,run_
4d70: 69 64 2c 74 65 73 74 6e 61 6d 65 2c 73 74 61 74  id,testname,stat
4d80: 65 2c 73 74 61 74 75 73 2c 65 76 65 6e 74 5f 74  e,status,event_t
4d90: 69 6d 65 2c 68 6f 73 74 2c 63 70 75 6c 6f 61 64  ime,host,cpuload
4da0: 2c 64 69 73 6b 66 72 65 65 2c 75 6e 61 6d 65 2c  ,diskfree,uname,
4db0: 72 75 6e 64 69 72 2c 69 74 65 6d 5f 70 61 74 68  rundir,item_path
4dc0: 2c 72 75 6e 5f 64 75 72 61 74 69 6f 6e 2c 66 69  ,run_duration,fi
4dd0: 6e 61 6c 5f 6c 6f 67 66 2c 63 6f 6d 6d 65 6e 74  nal_logf,comment
4de0: 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52   FROM tests WHER
4df0: 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74  E run_id=? AND t
4e00: 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74  estname=? AND it
4e10: 65 6d 5f 70 61 74 68 3d 3f 3b 22 0a 20 20 20 20  em_path=?;".    
4e20: 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65   run-id testname
4e30: 20 69 74 65 6d 2d 70 61 74 68 29 0a 20 20 20 20   item-path).    
4e40: 72 65 73 29 29 0a 0a 3b 3b 20 47 65 74 20 74 65  res))..;; Get te
4e50: 73 74 20 64 61 74 61 20 75 73 69 6e 67 20 74 65  st data using te
4e60: 73 74 5f 69 64 0a 28 64 65 66 69 6e 65 20 28 64  st_id.(define (d
4e70: 62 3a 67 65 74 2d 74 65 73 74 2d 64 61 74 61 2d  b:get-test-data-
4e80: 62 79 2d 69 64 20 64 62 20 74 65 73 74 2d 69 64  by-id db test-id
4e90: 29 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20 23  ).  (let ((res #
4ea0: 66 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33  f)).    (sqlite3
4eb0: 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20  :for-each-row.  
4ec0: 20 20 20 28 6c 61 6d 62 64 61 20 28 69 64 20 72     (lambda (id r
4ed0: 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 73  un-id testname s
4ee0: 74 61 74 65 20 73 74 61 74 75 73 20 65 76 65 6e  tate status even
4ef0: 74 2d 74 69 6d 65 20 68 6f 73 74 20 63 70 75 6c  t-time host cpul
4f00: 6f 61 64 20 64 69 73 6b 66 72 65 65 20 75 6e 61  oad diskfree una
4f10: 6d 65 20 72 75 6e 64 69 72 20 69 74 65 6d 2d 70  me rundir item-p
4f20: 61 74 68 20 72 75 6e 5f 64 75 72 61 74 69 6f 6e  ath run_duration
4f30: 20 66 69 6e 61 6c 5f 6c 6f 67 66 20 63 6f 6d 6d   final_logf comm
4f40: 65 6e 74 29 0a 20 20 20 20 20 20 20 28 73 65 74  ent).       (set
4f50: 21 20 72 65 73 20 28 76 65 63 74 6f 72 20 69 64  ! res (vector id
4f60: 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65   run-id testname
4f70: 20 73 74 61 74 65 20 73 74 61 74 75 73 20 65 76   state status ev
4f80: 65 6e 74 2d 74 69 6d 65 20 68 6f 73 74 20 63 70  ent-time host cp
4f90: 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20 75  uload diskfree u
4fa0: 6e 61 6d 65 20 72 75 6e 64 69 72 20 69 74 65 6d  name rundir item
4fb0: 2d 70 61 74 68 20 72 75 6e 5f 64 75 72 61 74 69  -path run_durati
4fc0: 6f 6e 20 66 69 6e 61 6c 5f 6c 6f 67 66 20 63 6f  on final_logf co
4fd0: 6d 6d 65 6e 74 29 29 29 0a 20 20 20 20 20 64 62  mment))).     db
4fe0: 20 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20 69   .     "SELECT i
4ff0: 64 2c 72 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d  d,run_id,testnam
5000: 65 2c 73 74 61 74 65 2c 73 74 61 74 75 73 2c 65  e,state,status,e
5010: 76 65 6e 74 5f 74 69 6d 65 2c 68 6f 73 74 2c 63  vent_time,host,c
5020: 70 75 6c 6f 61 64 2c 64 69 73 6b 66 72 65 65 2c  puload,diskfree,
5030: 75 6e 61 6d 65 2c 72 75 6e 64 69 72 2c 69 74 65  uname,rundir,ite
5040: 6d 5f 70 61 74 68 2c 72 75 6e 5f 64 75 72 61 74  m_path,run_durat
5050: 69 6f 6e 2c 66 69 6e 61 6c 5f 6c 6f 67 66 2c 63  ion,final_logf,c
5060: 6f 6d 6d 65 6e 74 20 46 52 4f 4d 20 74 65 73 74  omment FROM test
5070: 73 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 0a 20  s WHERE id=?;". 
5080: 20 20 20 20 74 65 73 74 2d 69 64 29 0a 20 20 20      test-id).   
5090: 20 72 65 73 29 29 0a 0a 0a 28 64 65 66 69 6e 65   res))...(define
50a0: 20 28 64 62 3a 74 65 73 74 2d 73 65 74 2d 63 6f   (db:test-set-co
50b0: 6d 6d 65 6e 74 20 64 62 20 72 75 6e 2d 69 64 20  mment db run-id 
50c0: 74 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61  testname item-pa
50d0: 74 68 20 63 6f 6d 6d 65 6e 74 29 0a 20 20 28 73  th comment).  (s
50e0: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 0a  qlite3:execute .
50f0: 20 20 20 64 62 20 0a 20 20 20 22 55 50 44 41 54     db .   "UPDAT
5100: 45 20 74 65 73 74 73 20 53 45 54 20 63 6f 6d 6d  E tests SET comm
5110: 65 6e 74 3d 3f 20 57 48 45 52 45 20 72 75 6e 5f  ent=? WHERE run_
5120: 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d  id=? AND testnam
5130: 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74  e=? AND item_pat
5140: 68 3d 3f 3b 22 0a 20 20 20 20 20 63 6f 6d 6d 65  h=?;".     comme
5150: 6e 74 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61  nt run-id testna
5160: 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 29 0a 0a  me item-path))..
5170: 3b 3b 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 74  ;;.(define (db:t
5180: 65 73 74 2d 73 65 74 2d 72 75 6e 64 69 72 21 20  est-set-rundir! 
5190: 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61  db run-id testna
51a0: 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 72 75 6e  me item-path run
51b0: 64 69 72 29 0a 20 20 28 73 71 6c 69 74 65 33 3a  dir).  (sqlite3:
51c0: 65 78 65 63 75 74 65 20 0a 20 20 20 64 62 20 0a  execute .   db .
51d0: 20 20 20 22 55 50 44 41 54 45 20 74 65 73 74 73     "UPDATE tests
51e0: 20 53 45 54 20 72 75 6e 64 69 72 3d 3f 20 57 48   SET rundir=? WH
51f0: 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44  ERE run_id=? AND
5200: 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20   testname=? AND 
5210: 69 74 65 6d 5f 70 61 74 68 3d 3f 3b 22 0a 20 20  item_path=?;".  
5220: 20 20 20 72 75 6e 64 69 72 20 72 75 6e 2d 69 64     rundir run-id
5230: 20 74 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70   testname item-p
5240: 61 74 68 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d  ath))..;;=======
5250: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5260: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5270: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5280: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a  ===============.
5290: 3b 3b 20 54 65 73 74 73 20 6d 65 74 61 20 64 61  ;; Tests meta da
52a0: 74 61 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ta.;;===========
52b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
52c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
52d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
52e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20  ===========..;; 
52f0: 72 65 61 64 20 74 68 65 20 72 65 63 6f 72 64 20  read the record 
5300: 67 69 76 65 6e 20 61 20 74 65 73 74 6e 61 6d 65  given a testname
5310: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73  .(define (db:tes
5320: 74 6d 65 74 61 2d 67 65 74 2d 72 65 63 6f 72 64  tmeta-get-record
5330: 20 64 62 20 74 65 73 74 6e 61 6d 65 29 0a 20 20   db testname).  
5340: 28 6c 65 74 20 28 28 72 65 73 20 23 66 29 29 0a  (let ((res #f)).
5350: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72      (sqlite3:for
5360: 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28  -each-row.     (
5370: 6c 61 6d 62 64 61 20 28 69 64 20 74 65 73 74 6e  lambda (id testn
5380: 61 6d 65 20 61 75 74 68 6f 72 20 6f 77 6e 65 72  ame author owner
5390: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 72 65 76   description rev
53a0: 69 65 77 65 64 20 69 74 65 72 61 74 65 64 20 61  iewed iterated a
53b0: 76 67 5f 72 75 6e 74 69 6d 65 20 61 76 67 5f 64  vg_runtime avg_d
53c0: 69 73 6b 20 74 61 67 73 29 0a 20 20 20 20 20 20  isk tags).      
53d0: 20 28 73 65 74 21 20 72 65 73 20 28 76 65 63 74   (set! res (vect
53e0: 6f 72 20 69 64 20 74 65 73 74 6e 61 6d 65 20 61  or id testname a
53f0: 75 74 68 6f 72 20 6f 77 6e 65 72 20 64 65 73 63  uthor owner desc
5400: 72 69 70 74 69 6f 6e 20 72 65 76 69 65 77 65 64  ription reviewed
5410: 20 69 74 65 72 61 74 65 64 20 61 76 67 5f 72 75   iterated avg_ru
5420: 6e 74 69 6d 65 20 61 76 67 5f 64 69 73 6b 20 74  ntime avg_disk t
5430: 61 67 73 29 29 29 0a 20 20 20 20 20 64 62 20 22  ags))).     db "
5440: 53 45 4c 45 43 54 20 69 64 2c 74 65 73 74 6e 61  SELECT id,testna
5450: 6d 65 2c 61 75 74 68 6f 72 2c 6f 77 6e 65 72 2c  me,author,owner,
5460: 64 65 73 63 72 69 70 74 69 6f 6e 2c 72 65 76 69  description,revi
5470: 65 77 65 64 2c 69 74 65 72 61 74 65 64 2c 61 76  ewed,iterated,av
5480: 67 5f 72 75 6e 74 69 6d 65 2c 61 76 67 5f 64 69  g_runtime,avg_di
5490: 73 6b 2c 74 61 67 73 20 46 52 4f 4d 20 74 65 73  sk,tags FROM tes
54a0: 74 5f 6d 65 74 61 20 57 48 45 52 45 20 74 65 73  t_meta WHERE tes
54b0: 74 6e 61 6d 65 3d 3f 3b 22 0a 20 20 20 20 20 74  tname=?;".     t
54c0: 65 73 74 6e 61 6d 65 29 0a 20 20 20 20 72 65 73  estname).    res
54d0: 29 29 0a 0a 3b 3b 20 63 72 65 61 74 65 20 61 20  ))..;; create a 
54e0: 6e 65 77 20 72 65 63 6f 72 64 20 66 6f 72 20 61  new record for a
54f0: 20 67 69 76 65 6e 20 74 65 73 74 6e 61 6d 65 0a   given testname.
5500: 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74  (define (db:test
5510: 6d 65 74 61 2d 61 64 64 2d 72 65 63 6f 72 64 20  meta-add-record 
5520: 64 62 20 74 65 73 74 6e 61 6d 65 29 0a 20 20 28  db testname).  (
5530: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
5540: 64 62 20 22 49 4e 53 45 52 54 20 4f 52 20 49 47  db "INSERT OR IG
5550: 4e 4f 52 45 20 49 4e 54 4f 20 74 65 73 74 5f 6d  NORE INTO test_m
5560: 65 74 61 20 28 74 65 73 74 6e 61 6d 65 2c 61 75  eta (testname,au
5570: 74 68 6f 72 2c 6f 77 6e 65 72 2c 64 65 73 63 72  thor,owner,descr
5580: 69 70 74 69 6f 6e 2c 72 65 76 69 65 77 65 64 2c  iption,reviewed,
5590: 69 74 65 72 61 74 65 64 2c 61 76 67 5f 72 75 6e  iterated,avg_run
55a0: 74 69 6d 65 2c 61 76 67 5f 64 69 73 6b 2c 74 61  time,avg_disk,ta
55b0: 67 73 29 20 56 41 4c 55 45 53 20 28 3f 2c 27 27  gs) VALUES (?,''
55c0: 2c 27 27 2c 27 27 2c 27 27 2c 27 27 2c 27 27 2c  ,'','','','','',
55d0: 27 27 2c 27 27 29 3b 22 20 74 65 73 74 6e 61 6d  '','');" testnam
55e0: 65 29 29 0a 0a 3b 3b 20 75 70 64 61 74 65 20 6f  e))..;; update o
55f0: 6e 65 20 6f 66 20 74 68 65 20 74 65 73 74 6d 65  ne of the testme
5600: 74 61 20 66 69 65 6c 64 73 0a 28 64 65 66 69 6e  ta fields.(defin
5610: 65 20 28 64 62 3a 74 65 73 74 6d 65 74 61 2d 75  e (db:testmeta-u
5620: 70 64 61 74 65 2d 66 69 65 6c 64 20 64 62 20 74  pdate-field db t
5630: 65 73 74 6e 61 6d 65 20 66 69 65 6c 64 20 76 61  estname field va
5640: 6c 75 65 29 0a 20 20 28 73 71 6c 69 74 65 33 3a  lue).  (sqlite3:
5650: 65 78 65 63 75 74 65 20 64 62 20 28 63 6f 6e 63  execute db (conc
5660: 20 22 55 50 44 41 54 45 20 74 65 73 74 5f 6d 65   "UPDATE test_me
5670: 74 61 20 53 45 54 20 22 20 66 69 65 6c 64 20 22  ta SET " field "
5680: 3d 3f 20 57 48 45 52 45 20 74 65 73 74 6e 61 6d  =? WHERE testnam
5690: 65 3d 3f 3b 22 29 20 76 61 6c 75 65 20 74 65 73  e=?;") value tes
56a0: 74 6e 61 6d 65 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d  tname))..;;=====
56b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
56c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
56d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
56e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
56f0: 3d 0a 3b 3b 20 54 20 45 20 53 20 54 20 20 20 44  =.;; T E S T   D
5700: 20 41 20 54 20 41 20 0a 3b 3b 3d 3d 3d 3d 3d 3d   A T A .;;======
5710: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5720: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5730: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5740: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5750: 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 63 73  ..(define (db:cs
5760: 76 2d 3e 74 65 73 74 2d 64 61 74 61 20 64 62 20  v->test-data db 
5770: 74 65 73 74 2d 69 64 20 63 73 76 64 61 74 61 29  test-id csvdata)
5780: 0a 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20  .  (debug:print 
5790: 34 20 22 74 65 73 74 2d 69 64 20 22 20 74 65 73  4 "test-id " tes
57a0: 74 2d 69 64 20 22 2c 20 63 73 76 64 61 74 61 3a  t-id ", csvdata:
57b0: 20 22 20 63 73 76 64 61 74 61 29 0a 20 20 28 6c   " csvdata).  (l
57c0: 65 74 20 28 28 63 73 76 6c 69 73 74 20 28 63 73  et ((csvlist (cs
57d0: 76 2d 3e 6c 69 73 74 20 28 6d 61 6b 65 2d 63 73  v->list (make-cs
57e0: 76 2d 72 65 61 64 65 72 0a 09 09 09 20 20 20 20  v-reader....    
57f0: 20 28 6f 70 65 6e 2d 69 6e 70 75 74 2d 73 74 72   (open-input-str
5800: 69 6e 67 20 63 73 76 64 61 74 61 29 0a 09 09 09  ing csvdata)....
5810: 20 20 20 20 20 27 28 28 73 74 72 69 70 2d 6c 65       '((strip-le
5820: 61 64 69 6e 67 2d 77 68 69 74 65 73 70 61 63 65  ading-whitespace
5830: 3f 20 23 74 29 0a 09 09 09 20 20 20 20 20 20 20  ? #t)....       
5840: 28 73 74 72 69 70 2d 74 72 61 69 6c 69 6e 67 2d  (strip-trailing-
5850: 77 68 69 74 65 73 70 61 63 65 3f 20 23 74 29 29  whitespace? #t))
5860: 20 29 29 29 29 20 3b 3b 20 28 63 73 76 2d 3e 6c   )))) ;; (csv->l
5870: 69 73 74 20 63 73 76 64 61 74 61 29 29 29 0a 20  ist csvdata))). 
5880: 20 20 20 28 66 6f 72 2d 65 61 63 68 20 0a 20 20     (for-each .  
5890: 20 20 20 28 6c 61 6d 62 64 61 20 28 63 73 76 72     (lambda (csvr
58a0: 6f 77 29 0a 20 20 20 20 20 20 20 28 6c 65 74 2a  ow).       (let*
58b0: 20 28 28 70 61 64 64 65 64 2d 72 6f 77 20 20 28   ((padded-row  (
58c0: 74 61 6b 65 20 28 61 70 70 65 6e 64 20 63 73 76  take (append csv
58d0: 72 6f 77 20 28 6c 69 73 74 20 23 66 20 23 66 20  row (list #f #f 
58e0: 23 66 20 23 66 20 23 66 20 23 66 20 23 66 20 23  #f #f #f #f #f #
58f0: 66 29 29 20 38 29 29 0a 09 20 20 20 20 20 20 28  f)) 8))..      (
5900: 63 61 74 65 67 6f 72 79 20 20 20 20 28 6c 69 73  category    (lis
5910: 74 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77  t-ref padded-row
5920: 20 30 29 29 0a 09 20 20 20 20 20 20 28 76 61 72   0))..      (var
5930: 69 61 62 6c 65 20 20 20 20 28 6c 69 73 74 2d 72  iable    (list-r
5940: 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20 31 29  ef padded-row 1)
5950: 29 0a 09 20 20 20 20 20 20 28 76 61 6c 75 65 20  )..      (value 
5960: 20 20 20 20 20 20 28 61 6e 79 2d 3e 6e 75 6d 62        (any->numb
5970: 65 72 2d 69 66 2d 70 6f 73 73 69 62 6c 65 20 28  er-if-possible (
5980: 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d  list-ref padded-
5990: 72 6f 77 20 32 29 29 29 0a 09 20 20 20 20 20 20  row 2)))..      
59a0: 28 65 78 70 65 63 74 65 64 20 20 20 20 28 61 6e  (expected    (an
59b0: 79 2d 3e 6e 75 6d 62 65 72 2d 69 66 2d 70 6f 73  y->number-if-pos
59c0: 73 69 62 6c 65 20 28 6c 69 73 74 2d 72 65 66 20  sible (list-ref 
59d0: 70 61 64 64 65 64 2d 72 6f 77 20 33 29 29 29 0a  padded-row 3))).
59e0: 09 20 20 20 20 20 20 28 74 6f 6c 20 20 20 20 20  .      (tol     
59f0: 20 20 20 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72      (any->number
5a00: 2d 69 66 2d 70 6f 73 73 69 62 6c 65 20 28 6c 69  -if-possible (li
5a10: 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f  st-ref padded-ro
5a20: 77 20 34 29 29 29 20 3b 3b 20 3e 2c 20 3c 2c 20  w 4))) ;; >, <, 
5a30: 3e 3d 2c 20 3c 3d 2c 20 6f 72 20 61 20 6e 75 6d  >=, <=, or a num
5a40: 62 65 72 0a 09 20 20 20 20 20 20 28 75 6e 69 74  ber..      (unit
5a50: 73 20 20 20 20 20 20 20 28 6c 69 73 74 2d 72 65  s       (list-re
5a60: 66 20 70 61 64 64 65 64 2d 72 6f 77 20 35 29 29  f padded-row 5))
5a70: 0a 09 20 20 20 20 20 20 28 63 6f 6d 6d 65 6e 74  ..      (comment
5a80: 20 20 20 20 20 28 6c 69 73 74 2d 72 65 66 20 70       (list-ref p
5a90: 61 64 64 65 64 2d 72 6f 77 20 36 29 29 0a 09 20  added-row 6)).. 
5aa0: 20 20 20 20 20 28 73 74 61 74 75 73 20 20 20 20       (status    
5ab0: 20 20 28 6c 65 74 20 28 28 73 20 28 6c 69 73 74    (let ((s (list
5ac0: 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20  -ref padded-row 
5ad0: 37 29 29 29 0a 09 09 09 20 20 20 20 20 28 69 66  7)))....     (if
5ae0: 20 28 61 6e 64 20 28 73 74 72 69 6e 67 3f 20 73   (and (string? s
5af0: 29 28 6f 72 20 28 73 74 72 69 6e 67 2d 6d 61 74  )(or (string-mat
5b00: 63 68 20 28 72 65 67 65 78 70 20 22 5e 5c 5c 73  ch (regexp "^\\s
5b10: 2a 24 22 29 20 73 29 0a 09 09 09 09 09 09 20 20  *$") s).......  
5b20: 20 20 20 28 73 74 72 69 6e 67 2d 6d 61 74 63 68     (string-match
5b30: 20 28 72 65 67 65 78 70 20 22 5e 6e 2f 61 24 22   (regexp "^n/a$"
5b40: 29 20 73 29 29 29 0a 09 09 09 09 20 23 66 0a 09  ) s)))..... #f..
5b50: 09 09 09 20 73 29 29 29 29 20 3b 3b 20 69 66 20  ... s)))) ;; if 
5b60: 73 70 65 63 69 66 69 65 64 20 6f 6e 20 74 68 65  specified on the
5b70: 20 69 6e 70 75 74 20 74 68 65 6e 20 75 73 65 2c   input then use,
5b80: 20 65 6c 73 65 20 63 61 6c 63 75 6c 61 74 65 0a   else calculate.
5b90: 09 20 3b 3b 20 6c 6f 6f 6b 20 75 70 20 65 78 70  . ;; look up exp
5ba0: 65 63 74 65 64 2c 74 6f 6c 2c 75 6e 69 74 73 20  ected,tol,units 
5bb0: 66 72 6f 6d 20 70 72 65 76 69 6f 75 73 20 62 65  from previous be
5bc0: 73 74 20 66 69 74 20 74 65 73 74 20 69 66 20 74  st fit test if t
5bd0: 68 65 79 20 61 72 65 20 61 6c 6c 20 65 69 74 68  hey are all eith
5be0: 65 72 20 23 66 20 6f 72 20 27 27 0a 09 20 28 64  er #f or ''.. (d
5bf0: 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22 42 45  ebug:print 4 "BE
5c00: 46 4f 52 45 3a 20 63 61 74 65 67 6f 72 79 3a 20  FORE: category: 
5c10: 22 20 63 61 74 65 67 6f 72 79 20 22 20 76 61 72  " category " var
5c20: 69 61 62 6c 65 3a 20 22 20 76 61 72 69 61 62 6c  iable: " variabl
5c30: 65 20 22 20 76 61 6c 75 65 3a 20 22 20 76 61 6c  e " value: " val
5c40: 75 65 20 0a 09 09 20 20 20 20 20 20 22 2c 20 65  ue ...      ", e
5c50: 78 70 65 63 74 65 64 3a 20 22 20 65 78 70 65 63  xpected: " expec
5c60: 74 65 64 20 22 20 74 6f 6c 3a 20 22 20 74 6f 6c  ted " tol: " tol
5c70: 20 22 20 75 6e 69 74 73 3a 20 22 20 75 6e 69 74   " units: " unit
5c80: 73 20 22 20 73 74 61 74 75 73 3a 20 22 20 73 74  s " status: " st
5c90: 61 74 75 73 20 22 20 63 6f 6d 6d 65 6e 74 3a 20  atus " comment: 
5ca0: 22 20 63 6f 6d 6d 65 6e 74 29 0a 0a 09 20 28 69  " comment)... (i
5cb0: 66 20 28 61 6e 64 20 28 6f 72 20 28 6e 6f 74 20  f (and (or (not 
5cc0: 65 78 70 65 63 74 65 64 29 28 65 71 75 61 6c 3f  expected)(equal?
5cd0: 20 65 78 70 65 63 74 65 64 20 22 22 29 29 0a 09   expected ""))..
5ce0: 09 20 20 28 6f 72 20 28 6e 6f 74 20 74 6f 6c 29  .  (or (not tol)
5cf0: 20 20 20 20 20 28 65 71 75 61 6c 3f 20 65 78 70       (equal? exp
5d00: 65 63 74 65 64 20 22 22 29 29 0a 09 09 20 20 28  ected ""))...  (
5d10: 6f 72 20 28 6e 6f 74 20 75 6e 69 74 73 29 20 20  or (not units)  
5d20: 20 28 65 71 75 61 6c 3f 20 65 78 70 65 63 74 65   (equal? expecte
5d30: 64 20 22 22 29 29 29 0a 09 20 20 20 20 20 28 6c  d "")))..     (l
5d40: 65 74 2d 76 61 6c 75 65 73 20 28 28 28 6e 65 77  et-values (((new
5d50: 2d 65 78 70 65 63 74 65 64 20 6e 65 77 2d 74 6f  -expected new-to
5d60: 6c 20 6e 65 77 2d 75 6e 69 74 73 29 28 64 62 3a  l new-units)(db:
5d70: 67 65 74 2d 70 72 65 76 2d 74 6f 6c 2d 66 6f 72  get-prev-tol-for
5d80: 2d 74 65 73 74 20 64 62 20 74 65 73 74 2d 69 64  -test db test-id
5d90: 20 63 61 74 65 67 6f 72 79 20 76 61 72 69 61 62   category variab
5da0: 6c 65 29 29 29 0a 09 20 20 20 20 20 20 20 28 73  le)))..       (s
5db0: 65 74 21 20 65 78 70 65 63 74 65 64 20 6e 65 77  et! expected new
5dc0: 2d 65 78 70 65 63 74 65 64 29 0a 09 20 20 20 20  -expected)..    
5dd0: 20 20 20 28 73 65 74 21 20 74 6f 6c 20 20 20 20     (set! tol    
5de0: 20 20 6e 65 77 2d 74 6f 6c 29 0a 09 20 20 20 20    new-tol)..    
5df0: 20 20 20 28 73 65 74 21 20 75 6e 69 74 73 20 20     (set! units  
5e00: 20 20 6e 65 77 2d 75 6e 69 74 73 29 29 29 0a 0a    new-units)))..
5e10: 09 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34  . (debug:print 4
5e20: 20 22 41 46 54 45 52 3a 20 20 63 61 74 65 67 6f   "AFTER:  catego
5e30: 72 79 3a 20 22 20 63 61 74 65 67 6f 72 79 20 22  ry: " category "
5e40: 20 76 61 72 69 61 62 6c 65 3a 20 22 20 76 61 72   variable: " var
5e50: 69 61 62 6c 65 20 22 20 76 61 6c 75 65 3a 20 22  iable " value: "
5e60: 20 76 61 6c 75 65 20 0a 09 09 20 20 20 20 20 20   value ...      
5e70: 22 2c 20 65 78 70 65 63 74 65 64 3a 20 22 20 65  ", expected: " e
5e80: 78 70 65 63 74 65 64 20 22 20 74 6f 6c 3a 20 22  xpected " tol: "
5e90: 20 74 6f 6c 20 22 20 75 6e 69 74 73 3a 20 22 20   tol " units: " 
5ea0: 75 6e 69 74 73 20 22 20 73 74 61 74 75 73 3a 20  units " status: 
5eb0: 22 20 73 74 61 74 75 73 20 22 20 63 6f 6d 6d 65  " status " comme
5ec0: 6e 74 3a 20 22 20 63 6f 6d 6d 65 6e 74 29 0a 09  nt: " comment)..
5ed0: 20 3b 3b 20 63 61 6c 63 75 6c 61 74 65 20 73 74   ;; calculate st
5ee0: 61 74 75 73 20 69 66 20 4e 4f 54 20 73 70 65 63  atus if NOT spec
5ef0: 69 66 69 65 64 0a 09 20 28 69 66 20 28 61 6e 64  ified.. (if (and
5f00: 20 28 6e 6f 74 20 73 74 61 74 75 73 29 28 6e 75   (not status)(nu
5f10: 6d 62 65 72 3f 20 65 78 70 65 63 74 65 64 29 28  mber? expected)(
5f20: 6e 75 6d 62 65 72 3f 20 76 61 6c 75 65 29 29 20  number? value)) 
5f30: 3b 3b 20 6e 65 65 64 20 65 78 70 65 63 74 65 64  ;; need expected
5f40: 20 61 6e 64 20 76 61 6c 75 65 20 74 6f 20 62 65   and value to be
5f50: 20 6e 75 6d 62 65 72 73 0a 09 20 20 20 20 20 28   numbers..     (
5f60: 69 66 20 28 6e 75 6d 62 65 72 3f 20 74 6f 6c 29  if (number? tol)
5f70: 20 3b 3b 20 69 66 20 74 6f 6c 20 69 73 20 61 20   ;; if tol is a 
5f80: 6e 75 6d 62 65 72 20 74 68 65 6e 20 77 65 20 64  number then we d
5f90: 6f 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 63  o the standard c
5fa0: 6f 6d 70 61 72 69 73 6f 6e 0a 09 09 20 28 6c 65  omparison... (le
5fb0: 74 2a 20 28 28 6d 61 78 2d 76 61 6c 20 28 2b 20  t* ((max-val (+ 
5fc0: 65 78 70 65 63 74 65 64 20 74 6f 6c 29 29 0a 09  expected tol))..
5fd0: 09 09 28 6d 69 6e 2d 76 61 6c 20 28 2d 20 65 78  ..(min-val (- ex
5fe0: 70 65 63 74 65 64 20 74 6f 6c 29 29 0a 09 09 09  pected tol))....
5ff0: 28 72 65 73 75 6c 74 20 20 28 61 6e 64 20 28 3e  (result  (and (>
6000: 3d 20 20 76 61 6c 75 65 20 6d 69 6e 2d 76 61 6c  =  value min-val
6010: 29 28 3c 3d 20 76 61 6c 75 65 20 6d 61 78 2d 76  )(<= value max-v
6020: 61 6c 29 29 29 29 0a 09 09 20 20 20 28 64 65 62  al))))...   (deb
6030: 75 67 3a 70 72 69 6e 74 20 34 20 22 6d 61 78 2d  ug:print 4 "max-
6040: 76 61 6c 3a 20 22 20 6d 61 78 2d 76 61 6c 20 22  val: " max-val "
6050: 20 6d 69 6e 2d 76 61 6c 3a 20 22 20 6d 69 6e 2d   min-val: " min-
6060: 76 61 6c 20 22 20 72 65 73 75 6c 74 3a 20 22 20  val " result: " 
6070: 72 65 73 75 6c 74 29 0a 09 09 20 20 20 28 73 65  result)...   (se
6080: 74 21 20 73 74 61 74 75 73 20 28 69 66 20 72 65  t! status (if re
6090: 73 75 6c 74 20 22 70 61 73 73 22 20 22 66 61 69  sult "pass" "fai
60a0: 6c 22 29 29 29 0a 09 09 20 28 73 65 74 21 20 73  l")))... (set! s
60b0: 74 61 74 75 73 20 3b 3b 20 4e 42 2f 2f 20 6e 65  tatus ;; NB// ne
60c0: 65 64 20 74 6f 20 61 73 73 65 73 73 20 65 61 63  ed to assess eac
60d0: 68 20 6f 6e 65 20 28 69 2e 65 2e 20 6e 6f 74 20  h one (i.e. not 
60e0: 72 65 74 75 72 6e 20 6f 70 65 72 61 74 6f 72 20  return operator 
60f0: 73 69 6e 63 65 20 6e 65 65 64 20 74 6f 20 61 63  since need to ac
6100: 74 20 69 66 20 6e 6f 74 20 76 61 6c 69 64 20 6f  t if not valid o
6110: 70 2e 0a 09 09 20 20 20 20 20 20 20 28 63 61 73  p....       (cas
6120: 65 20 28 73 74 72 69 6e 67 2d 3e 73 79 6d 62 6f  e (string->symbo
6130: 6c 20 74 6f 6c 29 20 3b 3b 20 74 6f 6c 20 73 68  l tol) ;; tol sh
6140: 6f 75 6c 64 20 62 65 20 3e 2c 20 3c 2c 20 3e 3d  ould be >, <, >=
6150: 2c 20 3c 3d 0a 09 09 09 20 28 28 3e 29 20 20 28  , <=.... ((>)  (
6160: 69 66 20 28 3e 20 20 76 61 6c 75 65 20 65 78 70  if (>  value exp
6170: 65 63 74 65 64 29 20 22 70 61 73 73 22 20 22 66  ected) "pass" "f
6180: 61 69 6c 22 29 29 0a 09 09 09 20 28 28 3c 29 20  ail")).... ((<) 
6190: 20 28 69 66 20 28 3c 20 20 76 61 6c 75 65 20 65   (if (<  value e
61a0: 78 70 65 63 74 65 64 29 20 22 70 61 73 73 22 20  xpected) "pass" 
61b0: 22 66 61 69 6c 22 29 29 0a 09 09 09 20 28 28 3e  "fail")).... ((>
61c0: 3d 29 20 28 69 66 20 28 3e 3d 20 76 61 6c 75 65  =) (if (>= value
61d0: 20 65 78 70 65 63 74 65 64 29 20 22 70 61 73 73   expected) "pass
61e0: 22 20 22 66 61 69 6c 22 29 29 0a 09 09 09 20 28  " "fail")).... (
61f0: 28 3c 3d 29 20 28 69 66 20 28 3c 3d 20 76 61 6c  (<=) (if (<= val
6200: 75 65 20 65 78 70 65 63 74 65 64 29 20 22 70 61  ue expected) "pa
6210: 73 73 22 20 22 66 61 69 6c 22 29 29 0a 09 09 09  ss" "fail"))....
6220: 20 28 65 6c 73 65 20 28 63 6f 6e 63 20 22 45 52   (else (conc "ER
6230: 52 4f 52 3a 20 62 61 64 20 74 6f 6c 20 63 6f 6d  ROR: bad tol com
6240: 70 61 72 61 74 6f 72 20 22 20 74 6f 6c 29 29 29  parator " tol)))
6250: 29 29 29 0a 09 20 28 64 65 62 75 67 3a 70 72 69  ))).. (debug:pri
6260: 6e 74 20 34 20 22 41 46 54 45 52 32 3a 20 63 61  nt 4 "AFTER2: ca
6270: 74 65 67 6f 72 79 3a 20 22 20 63 61 74 65 67 6f  tegory: " catego
6280: 72 79 20 22 20 76 61 72 69 61 62 6c 65 3a 20 22  ry " variable: "
6290: 20 76 61 72 69 61 62 6c 65 20 22 20 76 61 6c 75   variable " valu
62a0: 65 3a 20 22 20 76 61 6c 75 65 20 0a 09 09 20 20  e: " value ...  
62b0: 20 20 20 20 22 2c 20 65 78 70 65 63 74 65 64 3a      ", expected:
62c0: 20 22 20 65 78 70 65 63 74 65 64 20 22 20 74 6f   " expected " to
62d0: 6c 3a 20 22 20 74 6f 6c 20 22 20 75 6e 69 74 73  l: " tol " units
62e0: 3a 20 22 20 75 6e 69 74 73 20 22 20 73 74 61 74  : " units " stat
62f0: 75 73 3a 20 22 20 73 74 61 74 75 73 20 22 20 63  us: " status " c
6300: 6f 6d 6d 65 6e 74 3a 20 22 20 63 6f 6d 6d 65 6e  omment: " commen
6310: 74 29 0a 09 20 28 73 71 6c 69 74 65 33 3a 65 78  t).. (sqlite3:ex
6320: 65 63 75 74 65 20 64 62 20 22 49 4e 53 45 52 54  ecute db "INSERT
6330: 20 4f 52 20 52 45 50 4c 41 43 45 20 49 4e 54 4f   OR REPLACE INTO
6340: 20 74 65 73 74 5f 64 61 74 61 20 28 74 65 73 74   test_data (test
6350: 5f 69 64 2c 63 61 74 65 67 6f 72 79 2c 76 61 72  _id,category,var
6360: 69 61 62 6c 65 2c 76 61 6c 75 65 2c 65 78 70 65  iable,value,expe
6370: 63 74 65 64 2c 74 6f 6c 2c 75 6e 69 74 73 2c 63  cted,tol,units,c
6380: 6f 6d 6d 65 6e 74 2c 73 74 61 74 75 73 29 20 56  omment,status) V
6390: 41 4c 55 45 53 20 28 3f 2c 3f 2c 3f 2c 3f 2c 3f  ALUES (?,?,?,?,?
63a0: 2c 3f 2c 3f 2c 3f 2c 3f 29 3b 22 0a 09 20 20 20  ,?,?,?,?);"..   
63b0: 20 20 20 74 65 73 74 2d 69 64 20 63 61 74 65 67     test-id categ
63c0: 6f 72 79 20 76 61 72 69 61 62 6c 65 20 76 61 6c  ory variable val
63d0: 75 65 20 65 78 70 65 63 74 65 64 20 74 6f 6c 20  ue expected tol 
63e0: 75 6e 69 74 73 20 28 69 66 20 63 6f 6d 6d 65 6e  units (if commen
63f0: 74 20 63 6f 6d 6d 65 6e 74 20 22 22 29 20 73 74  t comment "") st
6400: 61 74 75 73 29 29 29 0a 20 20 20 20 20 63 73 76  atus))).     csv
6410: 6c 69 73 74 29 29 29 0a 0a 3b 3b 20 67 65 74 20  list)))..;; get 
6420: 61 20 6c 69 73 74 20 6f 66 20 74 65 73 74 5f 64  a list of test_d
6430: 61 74 61 20 72 65 63 6f 72 64 73 20 6d 61 74 63  ata records matc
6440: 68 69 6e 67 20 63 61 74 65 67 6f 72 79 70 61 74  hing categorypat
6450: 74 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 72 65  t.(define (db:re
6460: 61 64 2d 74 65 73 74 2d 64 61 74 61 20 64 62 20  ad-test-data db 
6470: 74 65 73 74 2d 69 64 20 63 61 74 65 67 6f 72 79  test-id category
6480: 70 61 74 74 29 0a 20 20 28 6c 65 74 20 28 28 72  patt).  (let ((r
6490: 65 73 20 27 28 29 29 29 0a 20 20 20 20 28 73 71  es '())).    (sq
64a0: 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72  lite3:for-each-r
64b0: 6f 77 20 0a 20 20 20 20 20 28 6c 61 6d 62 64 61  ow .     (lambda
64c0: 20 28 69 64 20 74 65 73 74 5f 69 64 20 63 61 74   (id test_id cat
64d0: 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65 20 76  egory variable v
64e0: 61 6c 75 65 20 65 78 70 65 63 74 65 64 20 74 6f  alue expected to
64f0: 6c 20 75 6e 69 74 73 20 63 6f 6d 6d 65 6e 74 20  l units comment 
6500: 73 74 61 74 75 73 29 0a 20 20 20 20 20 20 20 28  status).       (
6510: 73 65 74 21 20 72 65 73 20 28 63 6f 6e 73 20 28  set! res (cons (
6520: 76 65 63 74 6f 72 20 69 64 20 74 65 73 74 5f 69  vector id test_i
6530: 64 20 63 61 74 65 67 6f 72 79 20 76 61 72 69 61  d category varia
6540: 62 6c 65 20 76 61 6c 75 65 20 65 78 70 65 63 74  ble value expect
6550: 65 64 20 74 6f 6c 20 75 6e 69 74 73 20 63 6f 6d  ed tol units com
6560: 6d 65 6e 74 20 73 74 61 74 75 73 29 20 72 65 73  ment status) res
6570: 29 29 29 0a 20 20 20 20 20 64 62 0a 20 20 20 20  ))).     db.    
6580: 20 22 53 45 4c 45 43 54 20 69 64 2c 74 65 73 74   "SELECT id,test
6590: 5f 69 64 2c 63 61 74 65 67 6f 72 79 2c 76 61 72  _id,category,var
65a0: 69 61 62 6c 65 2c 76 61 6c 75 65 2c 65 78 70 65  iable,value,expe
65b0: 63 74 65 64 2c 74 6f 6c 2c 75 6e 69 74 73 2c 63  cted,tol,units,c
65c0: 6f 6d 6d 65 6e 74 2c 73 74 61 74 75 73 20 46 52  omment,status FR
65d0: 4f 4d 20 74 65 73 74 5f 64 61 74 61 20 57 48 45  OM test_data WHE
65e0: 52 45 20 74 65 73 74 5f 69 64 3d 3f 20 41 4e 44  RE test_id=? AND
65f0: 20 63 61 74 65 67 6f 72 79 20 4c 49 4b 45 20 3f   category LIKE ?
6600: 20 4f 52 44 45 52 20 42 59 20 63 61 74 65 67 6f   ORDER BY catego
6610: 72 79 2c 76 61 72 69 61 62 6c 65 3b 22 20 74 65  ry,variable;" te
6620: 73 74 2d 69 64 20 63 61 74 65 67 6f 72 79 70 61  st-id categorypa
6630: 74 74 29 0a 20 20 20 20 28 72 65 76 65 72 73 65  tt).    (reverse
6640: 20 72 65 73 29 29 29 0a 0a 28 64 65 66 69 6e 65   res)))..(define
6650: 20 28 64 62 3a 6c 6f 61 64 2d 74 65 73 74 2d 64   (db:load-test-d
6660: 61 74 61 20 64 62 20 72 75 6e 2d 69 64 20 74 65  ata db run-id te
6670: 73 74 2d 6e 61 6d 65 20 69 74 65 6d 64 61 74 29  st-name itemdat)
6680: 0a 20 20 28 6c 65 74 2a 20 28 28 69 74 65 6d 2d  .  (let* ((item-
6690: 70 61 74 68 20 28 69 74 65 6d 2d 6c 69 73 74 2d  path (item-list-
66a0: 3e 70 61 74 68 20 69 74 65 6d 64 61 74 29 29 0a  >path itemdat)).
66b0: 09 20 28 74 65 73 74 64 61 74 20 28 64 62 3a 67  . (testdat (db:g
66c0: 65 74 2d 74 65 73 74 2d 69 6e 66 6f 20 64 62 20  et-test-info db 
66d0: 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65  run-id test-name
66e0: 20 69 74 65 6d 2d 70 61 74 68 29 29 0a 09 20 28   item-path)).. (
66f0: 74 65 73 74 2d 69 64 20 28 69 66 20 74 65 73 74  test-id (if test
6700: 64 61 74 20 28 64 62 3a 74 65 73 74 2d 67 65 74  dat (db:test-get
6710: 2d 69 64 20 74 65 73 74 64 61 74 29 20 23 66 29  -id testdat) #f)
6720: 29 29 0a 20 20 20 20 3b 3b 20 28 64 65 62 75 67  )).    ;; (debug
6730: 3a 70 72 69 6e 74 20 31 20 22 45 6e 74 65 72 20  :print 1 "Enter 
6740: 72 65 63 6f 72 64 73 20 74 6f 20 69 6e 73 65 72  records to inser
6750: 74 20 69 6e 20 74 68 65 20 74 65 73 74 5f 64 61  t in the test_da
6760: 74 61 20 74 61 62 6c 65 2c 20 73 65 76 65 6e 20  ta table, seven 
6770: 66 69 65 6c 64 73 2c 20 63 6f 6d 6d 61 20 73 65  fields, comma se
6780: 70 61 72 61 74 65 64 20 70 65 72 20 6c 69 6e 65  parated per line
6790: 22 29 0a 20 20 20 20 28 64 65 62 75 67 3a 70 72  ").    (debug:pr
67a0: 69 6e 74 20 34 20 22 69 74 65 6d 64 61 74 3a 20  int 4 "itemdat: 
67b0: 22 20 69 74 65 6d 64 61 74 20 22 2c 20 74 65 73  " itemdat ", tes
67c0: 74 2d 6e 61 6d 65 3a 20 22 20 74 65 73 74 2d 6e  t-name: " test-n
67d0: 61 6d 65 20 22 2c 20 74 65 73 74 2d 69 64 3a 20  ame ", test-id: 
67e0: 22 20 74 65 73 74 2d 69 64 29 0a 20 20 20 20 28  " test-id).    (
67f0: 69 66 20 74 65 73 74 2d 69 64 0a 09 28 6c 65 74  if test-id..(let
6800: 20 6c 6f 6f 70 20 28 28 6c 69 6e 20 28 72 65 61   loop ((lin (rea
6810: 64 2d 6c 69 6e 65 29 29 29 0a 09 20 20 28 69 66  d-line)))..  (if
6820: 20 28 6e 6f 74 20 28 65 6f 66 2d 6f 62 6a 65 63   (not (eof-objec
6830: 74 3f 20 6c 69 6e 29 29 0a 09 20 20 20 20 20 20  t? lin))..      
6840: 28 62 65 67 69 6e 0a 09 09 28 64 65 62 75 67 3a  (begin...(debug:
6850: 70 72 69 6e 74 20 34 20 6c 69 6e 29 0a 09 09 28  print 4 lin)...(
6860: 64 62 3a 63 73 76 2d 3e 74 65 73 74 2d 64 61 74  db:csv->test-dat
6870: 61 20 64 62 20 74 65 73 74 2d 69 64 20 6c 69 6e  a db test-id lin
6880: 29 0a 09 09 28 6c 6f 6f 70 20 28 72 65 61 64 2d  )...(loop (read-
6890: 6c 69 6e 65 29 29 29 29 29 29 0a 20 20 20 20 3b  line)))))).    ;
68a0: 3b 20 72 6f 6c 6c 20 75 70 20 74 68 65 20 63 75  ; roll up the cu
68b0: 72 72 65 6e 74 20 72 65 73 75 6c 74 73 2e 0a 20  rrent results.. 
68c0: 20 20 20 28 64 62 3a 74 65 73 74 2d 64 61 74 61     (db:test-data
68d0: 2d 72 6f 6c 6c 75 70 20 64 62 20 74 65 73 74 2d  -rollup db test-
68e0: 69 64 29 29 29 0a 20 20 0a 3b 3b 20 57 41 52 4e  id))).  .;; WARN
68f0: 49 4e 47 3a 20 44 6f 20 4e 4f 54 20 63 61 6c 6c  ING: Do NOT call
6900: 20 74 68 69 73 20 66 6f 72 20 74 68 65 20 70 61   this for the pa
6910: 72 65 6e 74 20 74 65 73 74 20 6f 6e 20 61 6e 20  rent test on an 
6920: 69 74 65 72 61 74 65 64 20 74 65 73 74 0a 3b 3b  iterated test.;;
6930: 20 52 6f 6c 6c 20 75 70 20 74 65 73 74 5f 64 61   Roll up test_da
6940: 74 61 20 70 61 73 73 2f 66 61 69 6c 20 72 65 73  ta pass/fail res
6950: 75 6c 74 73 0a 3b 3b 20 6c 6f 6f 6b 20 61 74 20  ults.;; look at 
6960: 74 68 65 20 74 65 73 74 5f 64 61 74 61 20 73 74  the test_data st
6970: 61 74 75 73 20 66 69 65 6c 64 2c 20 0a 3b 3b 20  atus field, .;; 
6980: 20 20 20 69 66 20 61 6c 6c 20 61 72 65 20 70 61     if all are pa
6990: 73 73 20 28 61 6e 79 20 63 61 73 65 29 20 61 6e  ss (any case) an
69a0: 64 20 74 68 65 20 74 65 73 74 20 73 74 61 74 75  d the test statu
69b0: 73 20 69 73 20 50 41 53 53 20 6f 72 20 4e 55 4c  s is PASS or NUL
69c0: 4c 20 6f 72 20 27 27 20 74 68 65 6e 20 73 65 74  L or '' then set
69d0: 20 74 65 73 74 20 73 74 61 74 75 73 20 74 6f 20   test status to 
69e0: 50 41 53 53 2e 0a 3b 3b 20 20 20 20 69 66 20 6f  PASS..;;    if o
69f0: 6e 65 20 6f 72 20 6d 6f 72 65 20 61 72 65 20 66  ne or more are f
6a00: 61 69 6c 20 28 61 6e 79 20 63 61 73 65 29 20 74  ail (any case) t
6a10: 68 65 6e 20 73 65 74 20 74 65 73 74 20 73 74 61  hen set test sta
6a20: 74 75 73 20 74 6f 20 50 41 53 53 2c 20 6e 6f 6e  tus to PASS, non
6a30: 20 22 70 61 73 73 22 20 6f 72 20 22 66 61 69 6c   "pass" or "fail
6a40: 22 20 61 72 65 20 69 67 6e 6f 72 65 64 0a 28 64  " are ignored.(d
6a50: 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74 2d 64  efine (db:test-d
6a60: 61 74 61 2d 72 6f 6c 6c 75 70 20 64 62 20 74 65  ata-rollup db te
6a70: 73 74 2d 69 64 29 0a 20 20 28 73 71 6c 69 74 65  st-id).  (sqlite
6a80: 33 3a 65 78 65 63 75 74 65 20 0a 20 20 20 64 62  3:execute .   db
6a90: 20 0a 20 20 20 22 55 50 44 41 54 45 20 74 65 73   .   "UPDATE tes
6aa0: 74 73 20 0a 20 20 20 20 20 20 53 45 54 20 66 61  ts .      SET fa
6ab0: 69 6c 5f 63 6f 75 6e 74 3d 28 53 45 4c 45 43 54  il_count=(SELECT
6ac0: 20 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20   count(id) FROM 
6ad0: 74 65 73 74 5f 64 61 74 61 20 57 48 45 52 45 20  test_data WHERE 
6ae0: 74 65 73 74 5f 69 64 3d 3f 20 41 4e 44 20 73 74  test_id=? AND st
6af0: 61 74 75 73 20 6c 69 6b 65 20 27 66 61 69 6c 27  atus like 'fail'
6b00: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 70 61 73  ),.          pas
6b10: 73 5f 63 6f 75 6e 74 3d 28 53 45 4c 45 43 54 20  s_count=(SELECT 
6b20: 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 74  count(id) FROM t
6b30: 65 73 74 5f 64 61 74 61 20 57 48 45 52 45 20 74  est_data WHERE t
6b40: 65 73 74 5f 69 64 3d 3f 20 41 4e 44 20 73 74 61  est_id=? AND sta
6b50: 74 75 73 20 6c 69 6b 65 20 27 70 61 73 73 27 29  tus like 'pass')
6b60: 0a 20 20 20 20 20 20 57 48 45 52 45 20 69 64 3d  .      WHERE id=
6b70: 3f 3b 22 0a 20 20 20 74 65 73 74 2d 69 64 20 74  ?;".   test-id t
6b80: 65 73 74 2d 69 64 20 74 65 73 74 2d 69 64 29 0a  est-id test-id).
6b90: 20 20 3b 3b 20 69 66 20 74 68 65 20 74 65 73 74    ;; if the test
6ba0: 20 69 73 20 6e 6f 74 20 46 41 49 4c 20 74 68 65   is not FAIL the
6bb0: 6e 20 73 65 74 20 73 74 61 74 75 73 20 62 61 73  n set status bas
6bc0: 65 64 20 6f 6e 20 74 68 65 20 66 61 69 6c 20 61  ed on the fail a
6bd0: 6e 64 20 70 61 73 73 20 63 6f 75 6e 74 73 2e 0a  nd pass counts..
6be0: 20 20 28 74 68 72 65 61 64 2d 73 6c 65 65 70 21    (thread-sleep!
6bf0: 20 31 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65   1).  (sqlite3:e
6c00: 78 65 63 75 74 65 0a 20 20 20 64 62 0a 20 20 20  xecute.   db.   
6c10: 22 55 50 44 41 54 45 20 74 65 73 74 73 0a 20 20  "UPDATE tests.  
6c20: 20 20 20 20 53 45 54 20 73 74 61 74 75 73 3d 43      SET status=C
6c30: 41 53 45 20 57 48 45 4e 20 28 53 45 4c 45 43 54  ASE WHEN (SELECT
6c40: 20 66 61 69 6c 5f 63 6f 75 6e 74 20 46 52 4f 4d   fail_count FROM
6c50: 20 74 65 73 74 73 20 57 48 45 52 45 20 69 64 3d   tests WHERE id=
6c60: 3f 29 20 3e 20 30 20 0a 20 20 20 20 20 20 20 20  ?) > 0 .        
6c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c80: 20 54 48 45 4e 20 27 46 41 49 4c 27 0a 20 20 20   THEN 'FAIL'.   
6c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6ca0: 20 20 20 57 48 45 4e 20 28 53 45 4c 45 43 54 20     WHEN (SELECT 
6cb0: 70 61 73 73 5f 63 6f 75 6e 74 20 46 52 4f 4d 20  pass_count FROM 
6cc0: 74 65 73 74 73 20 57 48 45 52 45 20 69 64 3d 3f  tests WHERE id=?
6cd0: 29 20 3e 20 30 0a 20 20 20 20 20 20 20 20 20 20  ) > 0.          
6ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
6cf0: 48 45 4e 20 27 50 41 53 53 27 0a 20 20 20 20 20  HEN 'PASS'.     
6d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d10: 20 45 4c 53 45 20 73 74 61 74 75 73 0a 20 20 20   ELSE status.   
6d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
6d30: 4e 44 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 0a  ND WHERE id=?;".
6d40: 20 20 20 74 65 73 74 2d 69 64 20 74 65 73 74 2d     test-id test-
6d50: 69 64 20 74 65 73 74 2d 69 64 29 29 0a 0a 28 64  id test-id))..(d
6d60: 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 70 72  efine (db:get-pr
6d70: 65 76 2d 74 6f 6c 2d 66 6f 72 2d 74 65 73 74 20  ev-tol-for-test 
6d80: 64 62 20 74 65 73 74 2d 69 64 20 63 61 74 65 67  db test-id categ
6d90: 6f 72 79 20 76 61 72 69 61 62 6c 65 29 0a 20 20  ory variable).  
6da0: 3b 3b 20 46 69 6e 69 73 68 20 6d 65 3f 0a 20 20  ;; Finish me?.  
6db0: 28 76 61 6c 75 65 73 20 23 66 20 23 66 20 23 66  (values #f #f #f
6dc0: 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ))..;;==========
6dd0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6de0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6df0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6e00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20  ============.;; 
6e10: 53 20 54 20 45 20 50 20 53 20 0a 3b 3b 3d 3d 3d  S T E P S .;;===
6e20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6e30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6e40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6e50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6e60: 3d 3d 3d 0a 0a 28 64 65 66 69 6e 65 20 28 64 62  ===..(define (db
6e70: 3a 73 74 65 70 2d 67 65 74 2d 74 69 6d 65 2d 61  :step-get-time-a
6e80: 73 2d 73 74 72 69 6e 67 20 76 65 63 29 0a 20 20  s-string vec).  
6e90: 20 20 28 73 65 63 6f 6e 64 73 2d 3e 74 69 6d 65    (seconds->time
6ea0: 2d 73 74 72 69 6e 67 20 28 64 62 3a 73 74 65 70  -string (db:step
6eb0: 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20  -get-event_time 
6ec0: 76 65 63 29 29 29 0a 0a 3b 3b 20 64 62 2d 67 65  vec)))..;; db-ge
6ed0: 74 2d 74 65 73 74 2d 73 74 65 70 73 2d 66 6f 72  t-test-steps-for
6ee0: 2d 72 75 6e 0a 28 64 65 66 69 6e 65 20 28 64 62  -run.(define (db
6ef0: 3a 67 65 74 2d 73 74 65 70 73 2d 66 6f 72 2d 74  :get-steps-for-t
6f00: 65 73 74 20 64 62 20 74 65 73 74 2d 69 64 29 0a  est db test-id).
6f10: 20 20 28 6c 65 74 20 28 28 72 65 73 20 27 28 29    (let ((res '()
6f20: 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a  )).    (sqlite3:
6f30: 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20  for-each-row .  
6f40: 20 20 20 28 6c 61 6d 62 64 61 20 28 69 64 20 74     (lambda (id t
6f50: 65 73 74 2d 69 64 20 73 74 65 70 6e 61 6d 65 20  est-id stepname 
6f60: 73 74 61 74 65 20 73 74 61 74 75 73 20 65 76 65  state status eve
6f70: 6e 74 2d 74 69 6d 65 29 0a 20 20 20 20 20 20 20  nt-time).       
6f80: 28 73 65 74 21 20 72 65 73 20 28 63 6f 6e 73 20  (set! res (cons 
6f90: 28 76 65 63 74 6f 72 20 69 64 20 74 65 73 74 2d  (vector id test-
6fa0: 69 64 20 73 74 65 70 6e 61 6d 65 20 73 74 61 74  id stepname stat
6fb0: 65 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d 74  e status event-t
6fc0: 69 6d 65 29 20 72 65 73 29 29 29 0a 20 20 20 20  ime) res))).    
6fd0: 20 64 62 0a 20 20 20 20 20 22 53 45 4c 45 43 54   db.     "SELECT
6fe0: 20 69 64 2c 74 65 73 74 5f 69 64 2c 73 74 65 70   id,test_id,step
6ff0: 6e 61 6d 65 2c 73 74 61 74 65 2c 73 74 61 74 75  name,state,statu
7000: 73 2c 65 76 65 6e 74 5f 74 69 6d 65 20 46 52 4f  s,event_time FRO
7010: 4d 20 74 65 73 74 5f 73 74 65 70 73 20 57 48 45  M test_steps WHE
7020: 52 45 20 74 65 73 74 5f 69 64 3d 3f 20 4f 52 44  RE test_id=? ORD
7030: 45 52 20 42 59 20 69 64 20 41 53 43 3b 22 20 3b  ER BY id ASC;" ;
7040: 3b 20 65 76 65 6e 74 5f 74 69 6d 65 20 44 45 53  ; event_time DES
7050: 43 2c 69 64 20 41 53 43 3b 0a 20 20 20 20 20 74  C,id ASC;.     t
7060: 65 73 74 2d 69 64 29 0a 20 20 20 20 28 72 65 76  est-id).    (rev
7070: 65 72 73 65 20 72 65 73 29 29 29 0a 0a 3b 3b 20  erse res)))..;; 
7080: 67 65 74 20 61 20 70 72 65 74 74 79 20 74 61 62  get a pretty tab
7090: 6c 65 20 74 6f 20 73 75 6d 6d 61 72 69 7a 65 20  le to summarize 
70a0: 73 74 65 70 73 0a 3b 3b 0a 28 64 65 66 69 6e 65  steps.;;.(define
70b0: 20 28 64 62 3a 67 65 74 2d 73 74 65 70 73 2d 74   (db:get-steps-t
70c0: 61 62 6c 65 20 64 62 20 74 65 73 74 2d 69 64 29  able db test-id)
70d0: 0a 20 20 28 6c 65 74 20 28 28 73 74 65 70 73 20  .  (let ((steps 
70e0: 20 20 28 64 62 3a 67 65 74 2d 73 74 65 70 73 2d    (db:get-steps-
70f0: 66 6f 72 2d 74 65 73 74 20 64 62 20 74 65 73 74  for-test db test
7100: 2d 69 64 29 29 29 0a 20 20 20 20 3b 3b 20 6f 72  -id))).    ;; or
7110: 67 61 6e 69 73 65 20 74 68 65 20 73 74 65 70 73  ganise the steps
7120: 20 66 6f 72 20 62 65 74 74 65 72 20 72 65 61 64   for better read
7130: 61 62 69 6c 69 74 79 0a 20 20 20 20 28 6c 65 74  ability.    (let
7140: 20 28 28 72 65 73 20 28 6d 61 6b 65 2d 68 61 73   ((res (make-has
7150: 68 2d 74 61 62 6c 65 29 29 29 0a 20 20 20 20 20  h-table))).     
7160: 20 28 66 6f 72 2d 65 61 63 68 20 0a 20 20 20 20   (for-each .    
7170: 20 20 20 28 6c 61 6d 62 64 61 20 28 73 74 65 70     (lambda (step
7180: 29 0a 09 20 28 64 65 62 75 67 3a 70 72 69 6e 74  ).. (debug:print
7190: 20 36 20 22 73 74 65 70 3d 22 20 73 74 65 70 29   6 "step=" step)
71a0: 0a 09 20 28 6c 65 74 20 28 28 72 65 63 6f 72 64  .. (let ((record
71b0: 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 72 65 66   (hash-table-ref
71c0: 2f 64 65 66 61 75 6c 74 20 0a 09 09 09 72 65 73  /default ....res
71d0: 20 0a 09 09 09 28 64 62 3a 73 74 65 70 2d 67 65   ....(db:step-ge
71e0: 74 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70 29  t-stepname step)
71f0: 20 0a 09 09 09 3b 3b 20 20 20 20 20 20 20 20 73   ....;;        s
7200: 74 65 70 6e 61 6d 65 20 20 20 20 20 20 20 20 20  tepname         
7210: 20 20 20 20 20 20 20 73 74 61 72 74 20 65 6e 64         start end
7220: 20 73 74 61 74 75 73 20 20 20 20 0a 09 09 09 28   status    ....(
7230: 76 65 63 74 6f 72 20 28 64 62 3a 73 74 65 70 2d  vector (db:step-
7240: 67 65 74 2d 73 74 65 70 6e 61 6d 65 20 73 74 65  get-stepname ste
7250: 70 29 20 22 22 20 20 20 22 22 20 22 22 20 20 20  p) ""   "" ""   
7260: 20 20 22 22 29 29 29 29 0a 09 20 20 20 28 64 65    ""))))..   (de
7270: 62 75 67 3a 70 72 69 6e 74 20 36 20 22 72 65 63  bug:print 6 "rec
7280: 6f 72 64 28 62 65 66 6f 72 65 29 20 3d 20 22 20  ord(before) = " 
7290: 72 65 63 6f 72 64 20 0a 09 09 09 22 5c 6e 69 64  record ...."\nid
72a0: 3a 20 20 20 20 20 20 20 22 20 28 64 62 3a 73 74  :       " (db:st
72b0: 65 70 2d 67 65 74 2d 69 64 20 73 74 65 70 29 0a  ep-get-id step).
72c0: 09 09 09 22 5c 6e 73 74 65 70 6e 61 6d 65 3a 20  ..."\nstepname: 
72d0: 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73  " (db:step-get-s
72e0: 74 65 70 6e 61 6d 65 20 73 74 65 70 29 0a 09 09  tepname step)...
72f0: 09 22 5c 6e 73 74 61 74 65 3a 20 20 20 20 22 20  ."\nstate:    " 
7300: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61  (db:step-get-sta
7310: 74 65 20 73 74 65 70 29 0a 09 09 09 22 5c 6e 73  te step)...."\ns
7320: 74 61 74 75 73 3a 20 20 20 22 20 28 64 62 3a 73  tatus:   " (db:s
7330: 74 65 70 2d 67 65 74 2d 73 74 61 74 75 73 20 73  tep-get-status s
7340: 74 65 70 29 0a 09 09 09 22 5c 6e 74 69 6d 65 3a  tep)...."\ntime:
7350: 20 20 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d       " (db:step-
7360: 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73  get-event_time s
7370: 74 65 70 29 29 0a 09 20 20 20 28 63 61 73 65 20  tep))..   (case 
7380: 28 73 74 72 69 6e 67 2d 3e 73 79 6d 62 6f 6c 20  (string->symbol 
7390: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61  (db:step-get-sta
73a0: 74 65 20 73 74 65 70 29 29 0a 09 20 20 20 20 20  te step))..     
73b0: 28 28 73 74 61 72 74 29 28 76 65 63 74 6f 72 2d  ((start)(vector-
73c0: 73 65 74 21 20 72 65 63 6f 72 64 20 31 20 28 64  set! record 1 (d
73d0: 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74  b:step-get-event
73e0: 5f 74 69 6d 65 20 73 74 65 70 29 29 0a 09 20 20  _time step))..  
73f0: 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21      (vector-set!
7400: 20 72 65 63 6f 72 64 20 33 20 28 69 66 20 28 65   record 3 (if (e
7410: 71 75 61 6c 3f 20 28 76 65 63 74 6f 72 2d 72 65  qual? (vector-re
7420: 66 20 72 65 63 6f 72 64 20 33 29 20 22 22 29 0a  f record 3) "").
7430: 09 09 09 09 09 28 64 62 3a 73 74 65 70 2d 67 65  .....(db:step-ge
7440: 74 2d 73 74 61 74 75 73 20 73 74 65 70 29 29 29  t-status step)))
7450: 29 0a 09 20 20 20 20 20 28 28 65 6e 64 29 20 20  )..     ((end)  
7460: 0a 09 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d  ..      (vector-
7470: 73 65 74 21 20 72 65 63 6f 72 64 20 32 20 28 61  set! record 2 (a
7480: 6e 79 2d 3e 6e 75 6d 62 65 72 20 28 64 62 3a 73  ny->number (db:s
7490: 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69  tep-get-event_ti
74a0: 6d 65 20 73 74 65 70 29 29 29 0a 09 20 20 20 20  me step)))..    
74b0: 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72    (vector-set! r
74c0: 65 63 6f 72 64 20 33 20 28 64 62 3a 73 74 65 70  ecord 3 (db:step
74d0: 2d 67 65 74 2d 73 74 61 74 75 73 20 73 74 65 70  -get-status step
74e0: 29 29 0a 09 20 20 20 20 20 20 28 76 65 63 74 6f  ))..      (vecto
74f0: 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 34 20  r-set! record 4 
7500: 28 6c 65 74 20 28 28 73 74 61 72 74 74 20 28 61  (let ((startt (a
7510: 6e 79 2d 3e 6e 75 6d 62 65 72 20 28 76 65 63 74  ny->number (vect
7520: 6f 72 2d 72 65 66 20 72 65 63 6f 72 64 20 31 29  or-ref record 1)
7530: 29 29 0a 09 09 09 09 09 20 20 28 65 6e 64 74 20  ))......  (endt 
7540: 20 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 20 28    (any->number (
7550: 76 65 63 74 6f 72 2d 72 65 66 20 72 65 63 6f 72  vector-ref recor
7560: 64 20 32 29 29 29 29 0a 09 09 09 09 20 20 20 20  d 2)))).....    
7570: 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34    (debug:print 4
7580: 20 22 72 65 63 6f 72 64 5b 31 5d 3d 22 20 28 76   "record[1]=" (v
7590: 65 63 74 6f 72 2d 72 65 66 20 72 65 63 6f 72 64  ector-ref record
75a0: 20 31 29 20 0a 09 09 09 09 09 09 20 20 20 22 2c   1) .......   ",
75b0: 20 73 74 61 72 74 74 3d 22 20 73 74 61 72 74 74   startt=" startt
75c0: 20 22 2c 20 65 6e 64 74 3d 22 20 65 6e 64 74 0a   ", endt=" endt.
75d0: 09 09 09 09 09 09 20 20 20 22 2c 20 67 65 74 2d  ......   ", get-
75e0: 73 74 61 74 75 73 3a 20 22 20 28 64 62 3a 73 74  status: " (db:st
75f0: 65 70 2d 67 65 74 2d 73 74 61 74 75 73 20 73 74  ep-get-status st
7600: 65 70 29 29 0a 09 09 09 09 20 20 20 20 20 20 28  ep)).....      (
7610: 69 66 20 28 61 6e 64 20 28 6e 75 6d 62 65 72 3f  if (and (number?
7620: 20 73 74 61 72 74 74 29 28 6e 75 6d 62 65 72 3f   startt)(number?
7630: 20 65 6e 64 74 29 29 0a 09 09 09 09 09 20 20 28   endt))......  (
7640: 73 65 63 6f 6e 64 73 2d 3e 68 72 2d 6d 69 6e 2d  seconds->hr-min-
7650: 73 65 63 20 28 2d 20 65 6e 64 74 20 73 74 61 72  sec (- endt star
7660: 74 74 29 29 20 22 2d 31 22 29 29 29 29 0a 09 20  tt)) "-1")))).. 
7670: 20 20 20 20 28 65 6c 73 65 0a 09 20 20 20 20 20      (else..     
7680: 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20     (vector-set! 
7690: 72 65 63 6f 72 64 20 32 20 28 64 62 3a 73 74 65  record 2 (db:ste
76a0: 70 2d 67 65 74 2d 73 74 61 74 65 20 73 74 65 70  p-get-state step
76b0: 29 29 0a 09 20 20 20 20 20 20 20 20 28 76 65 63  ))..        (vec
76c0: 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20  tor-set! record 
76d0: 33 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73  3 (db:step-get-s
76e0: 74 61 74 75 73 20 73 74 65 70 29 29 0a 09 20 20  tatus step))..  
76f0: 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65        (vector-se
7700: 74 21 20 72 65 63 6f 72 64 20 34 20 28 64 62 3a  t! record 4 (db:
7710: 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74  step-get-event_t
7720: 69 6d 65 20 73 74 65 70 29 29 29 29 0a 09 20 20  ime step))))..  
7730: 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 73 65 74   (hash-table-set
7740: 21 20 72 65 73 20 28 64 62 3a 73 74 65 70 2d 67  ! res (db:step-g
7750: 65 74 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70  et-stepname step
7760: 29 20 72 65 63 6f 72 64 29 0a 09 20 20 20 28 64  ) record)..   (d
7770: 65 62 75 67 3a 70 72 69 6e 74 20 36 20 22 72 65  ebug:print 6 "re
7780: 63 6f 72 64 28 61 66 74 65 72 29 20 20 3d 20 22  cord(after)  = "
7790: 20 72 65 63 6f 72 64 20 0a 09 09 09 22 5c 6e 69   record ...."\ni
77a0: 64 3a 20 20 20 20 20 20 20 22 20 28 64 62 3a 73  d:       " (db:s
77b0: 74 65 70 2d 67 65 74 2d 69 64 20 73 74 65 70 29  tep-get-id step)
77c0: 0a 09 09 09 22 5c 6e 73 74 65 70 6e 61 6d 65 3a  ...."\nstepname:
77d0: 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d   " (db:step-get-
77e0: 73 74 65 70 6e 61 6d 65 20 73 74 65 70 29 0a 09  stepname step)..
77f0: 09 09 22 5c 6e 73 74 61 74 65 3a 20 20 20 20 22  .."\nstate:    "
7800: 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74   (db:step-get-st
7810: 61 74 65 20 73 74 65 70 29 0a 09 09 09 22 5c 6e  ate step)...."\n
7820: 73 74 61 74 75 73 3a 20 20 20 22 20 28 64 62 3a  status:   " (db:
7830: 73 74 65 70 2d 67 65 74 2d 73 74 61 74 75 73 20  step-get-status 
7840: 73 74 65 70 29 0a 09 09 09 22 5c 6e 74 69 6d 65  step)...."\ntime
7850: 3a 20 20 20 20 20 22 20 28 64 62 3a 73 74 65 70  :     " (db:step
7860: 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20  -get-event_time 
7870: 73 74 65 70 29 29 29 29 0a 20 20 20 20 20 20 20  step)))).       
7880: 3b 3b 20 28 65 6c 73 65 20 20 20 28 76 65 63 74  ;; (else   (vect
7890: 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 31  or-set! record 1
78a0: 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 76   (db:step-get-ev
78b0: 65 6e 74 5f 74 69 6d 65 20 73 74 65 70 29 29 29  ent_time step)))
78c0: 0a 20 20 20 20 20 20 20 28 73 6f 72 74 20 73 74  .       (sort st
78d0: 65 70 73 20 28 6c 61 6d 62 64 61 20 28 61 20 62  eps (lambda (a b
78e0: 29 28 3c 20 28 64 62 3a 73 74 65 70 2d 67 65 74  )(< (db:step-get
78f0: 2d 65 76 65 6e 74 5f 74 69 6d 65 20 61 29 28 64  -event_time a)(d
7900: 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74  b:step-get-event
7910: 5f 74 69 6d 65 20 62 29 29 29 29 29 0a 20 20 20  _time b))))).   
7920: 20 20 20 72 65 73 29 29 29 0a 0a 3b 3b 20 55 53     res)))..;; US
7930: 45 3a 20 28 6c 73 65 74 2d 64 69 66 66 65 72 65  E: (lset-differe
7940: 6e 63 65 20 73 74 72 69 6e 67 3d 3f 20 27 28 22  nce string=? '("
7950: 61 22 20 22 62 22 20 22 63 22 29 20 27 28 22 64  a" "b" "c") '("d
7960: 22 20 22 63 22 20 22 65 22 20 22 61 22 29 29 0a  " "c" "e" "a")).
7970: 3b 3b 0a 3b 3b 20 52 65 74 75 72 6e 20 61 20 6c  ;;.;; Return a l
7980: 69 73 74 20 6f 66 20 70 72 65 72 65 71 73 20 74  ist of prereqs t
7990: 68 61 74 20 77 65 72 65 20 4e 4f 54 20 6d 65 74  hat were NOT met
79a0: 0a 3b 3b 20 20 54 65 73 74 73 20 28 61 6e 64 20  .;;  Tests (and 
79b0: 61 6c 6c 20 69 74 65 6d 73 29 20 69 6e 20 77 61  all items) in wa
79c0: 69 74 6f 6e 20 6c 69 73 74 20 6d 75 73 74 20 62  iton list must b
79d0: 65 20 22 43 4f 4d 50 4c 45 54 45 44 22 20 61 6e  e "COMPLETED" an
79e0: 64 20 22 50 41 53 53 22 0a 28 64 65 66 69 6e 65  d "PASS".(define
79f0: 20 28 64 62 2d 67 65 74 2d 70 72 65 72 65 71 73   (db-get-prereqs
7a00: 2d 6e 6f 74 2d 6d 65 74 20 64 62 20 72 75 6e 2d  -not-met db run-
7a10: 69 64 20 77 61 69 74 6f 6e 29 0a 20 20 28 69 66  id waiton).  (if
7a20: 20 28 6e 75 6c 6c 3f 20 77 61 69 74 6f 6e 29 0a   (null? waiton).
7a30: 20 20 20 20 20 20 27 28 29 0a 20 20 20 20 20 20        '().      
7a40: 28 6c 65 74 2a 20 28 28 75 6e 6d 65 74 2d 70 72  (let* ((unmet-pr
7a50: 65 2d 72 65 71 73 20 27 28 29 29 0a 09 20 20 20  e-reqs '())..   
7a60: 20 20 28 74 65 73 74 73 20 20 20 20 20 20 20 20    (tests        
7a70: 20 20 20 28 64 62 2d 67 65 74 2d 74 65 73 74 73     (db-get-tests
7a80: 2d 66 6f 72 2d 72 75 6e 20 64 62 20 72 75 6e 2d  -for-run db run-
7a90: 69 64 20 23 66 20 23 66 20 27 28 29 20 27 28 29  id #f #f '() '()
7aa0: 29 29 0a 09 20 20 20 20 20 28 72 65 73 75 6c 74  ))..     (result
7ab0: 20 20 20 20 20 20 20 20 20 27 28 29 29 29 0a 09           '()))..
7ac0: 28 66 6f 72 2d 65 61 63 68 20 28 6c 61 6d 62 64  (for-each (lambd
7ad0: 61 20 28 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61  a (waitontest-na
7ae0: 6d 65 29 0a 09 09 20 20 20 20 28 6c 65 74 20 28  me)...    (let (
7af0: 28 65 76 65 72 2d 73 65 65 6e 20 23 66 29 29 0a  (ever-seen #f)).
7b00: 09 09 20 20 20 20 20 20 28 66 6f 72 2d 65 61 63  ..      (for-eac
7b10: 68 20 28 6c 61 6d 62 64 61 20 28 74 65 73 74 29  h (lambda (test)
7b20: 0a 09 09 09 09 20 20 28 69 66 20 28 65 71 75 61  .....  (if (equa
7b30: 6c 3f 20 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61  l? waitontest-na
7b40: 6d 65 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d  me (db:test-get-
7b50: 74 65 73 74 6e 61 6d 65 20 74 65 73 74 29 29 0a  testname test)).
7b60: 09 09 09 09 20 20 20 20 20 20 28 62 65 67 69 6e  ....      (begin
7b70: 0a 09 09 09 09 09 28 73 65 74 21 20 65 76 65 72  ......(set! ever
7b80: 2d 73 65 65 6e 20 23 74 29 0a 09 09 09 09 09 28  -seen #t)......(
7b90: 69 66 20 28 6e 6f 74 20 28 61 6e 64 20 28 65 71  if (not (and (eq
7ba0: 75 61 6c 3f 20 28 64 62 3a 74 65 73 74 2d 67 65  ual? (db:test-ge
7bb0: 74 2d 73 74 61 74 65 20 74 65 73 74 29 20 22 43  t-state test) "C
7bc0: 4f 4d 50 4c 45 54 45 44 22 29 0a 09 09 09 09 09  OMPLETED")......
7bd0: 09 20 20 20 20 20 20 28 6d 65 6d 62 65 72 20 28  .      (member (
7be0: 64 62 3a 74 65 73 74 2d 67 65 74 2d 73 74 61 74  db:test-get-stat
7bf0: 75 73 20 74 65 73 74 29 20 27 28 22 50 41 53 53  us test) '("PASS
7c00: 22 20 22 57 41 52 4e 22 20 22 43 48 45 43 4b 22  " "WARN" "CHECK"
7c10: 29 29 29 29 0a 09 09 09 09 09 20 20 20 20 28 73  ))))......    (s
7c20: 65 74 21 20 72 65 73 75 6c 74 20 28 63 6f 6e 73  et! result (cons
7c30: 20 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65   waitontest-name
7c40: 20 72 65 73 75 6c 74 29 29 29 29 29 29 0a 09 09   result))))))...
7c50: 09 09 74 65 73 74 73 29 0a 09 09 20 20 20 20 20  ..tests)...     
7c60: 20 28 69 66 20 28 6e 6f 74 20 65 76 65 72 2d 73   (if (not ever-s
7c70: 65 65 6e 29 28 73 65 74 21 20 72 65 73 75 6c 74  een)(set! result
7c80: 20 28 63 6f 6e 73 20 77 61 69 74 6f 6e 74 65 73   (cons waitontes
7c90: 74 2d 6e 61 6d 65 20 72 65 73 75 6c 74 29 29 29  t-name result)))
7ca0: 29 29 0a 09 09 20 20 77 61 69 74 6f 6e 29 0a 09  ))...  waiton)..
7cb0: 28 64 65 6c 65 74 65 2d 64 75 70 6c 69 63 61 74  (delete-duplicat
7cc0: 65 73 20 72 65 73 75 6c 74 29 29 29 29 0a 0a 3b  es result))))..;
7cd0: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;===============
7ce0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7cf0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7d00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7d10: 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 45 78 74 72 61  =======.;; Extra
7d20: 63 74 20 6f 64 73 20 66 69 6c 65 20 66 72 6f 6d  ct ods file from
7d30: 20 74 68 65 20 64 62 0a 3b 3b 3d 3d 3d 3d 3d 3d   the db.;;======
7d40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7d50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7d60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7d70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7d80: 0a 0a 3b 3b 20 72 75 6e 73 70 61 74 74 20 69 73  ..;; runspatt is
7d90: 20 61 20 63 6f 6d 6d 61 20 64 65 6c 69 6d 69 74   a comma delimit
7da0: 65 64 20 6c 69 73 74 20 6f 66 20 72 75 6e 20 70  ed list of run p
7db0: 61 74 74 65 72 6e 73 0a 3b 3b 20 6b 65 79 70 61  atterns.;; keypa
7dc0: 74 74 2d 61 6c 69 73 74 20 6d 75 73 74 20 63 6f  tt-alist must co
7dd0: 6e 74 61 69 6e 20 2a 61 6c 6c 2a 20 6b 65 79 73  ntain *all* keys
7de0: 20 77 69 74 68 20 61 6e 20 61 73 73 6f 63 69 61   with an associa
7df0: 74 65 64 20 70 61 74 74 65 72 6e 3a 20 27 28 20  ted pattern: '( 
7e00: 28 22 4b 45 59 31 22 20 22 25 22 29 20 2e 2e 20  ("KEY1" "%") .. 
7e10: 29 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 65 78  ).(define (db:ex
7e20: 74 72 61 63 74 2d 6f 64 73 2d 66 69 6c 65 20 64  tract-ods-file d
7e30: 62 20 6f 75 74 70 75 74 66 69 6c 65 20 6b 65 79  b outputfile key
7e40: 70 61 74 74 2d 61 6c 69 73 74 20 72 75 6e 73 70  patt-alist runsp
7e50: 61 74 74 20 70 61 74 68 6d 6f 64 29 0a 20 20 28  att pathmod).  (
7e60: 6c 65 74 2a 20 28 28 6b 65 79 73 73 74 72 20 20  let* ((keysstr  
7e70: 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65  (string-interspe
7e80: 72 73 65 20 28 6d 61 70 20 63 61 72 20 6b 65 79  rse (map car key
7e90: 70 61 74 74 2d 61 6c 69 73 74 29 20 22 2c 22 29  patt-alist) ",")
7ea0: 29 0a 09 20 28 6b 65 79 71 72 79 20 20 20 28 73  ).. (keyqry   (s
7eb0: 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73  tring-interspers
7ec0: 65 20 28 6d 61 70 20 28 6c 61 6d 62 64 61 20 28  e (map (lambda (
7ed0: 70 29 28 63 6f 6e 63 20 28 63 61 72 20 70 29 20  p)(conc (car p) 
7ee0: 22 20 4c 49 4b 45 20 3f 20 22 29 29 20 6b 65 79  " LIKE ? ")) key
7ef0: 70 61 74 74 2d 61 6c 69 73 74 29 20 22 20 41 4e  patt-alist) " AN
7f00: 44 20 22 29 29 0a 09 20 28 6e 75 6d 6b 65 79 73  D ")).. (numkeys
7f10: 20 20 28 6c 65 6e 67 74 68 20 6b 65 79 70 61 74    (length keypat
7f20: 74 2d 61 6c 69 73 74 29 29 0a 09 20 28 74 65 73  t-alist)).. (tes
7f30: 74 2d 69 64 73 20 27 28 29 29 0a 09 20 28 77 69  t-ids '()).. (wi
7f40: 6e 64 6f 77 73 20 20 28 61 6e 64 20 70 61 74 68  ndows  (and path
7f50: 6d 6f 64 20 28 73 75 62 73 74 72 69 6e 67 2d 69  mod (substring-i
7f60: 6e 64 65 78 20 22 5c 5c 22 20 70 61 74 68 6d 6f  ndex "\\" pathmo
7f70: 64 29 29 29 0a 09 20 28 74 65 6d 70 64 69 72 20  d))).. (tempdir 
7f80: 20 28 63 6f 6e 63 20 22 2f 74 6d 70 2f 22 20 28   (conc "/tmp/" (
7f90: 63 75 72 72 65 6e 74 2d 75 73 65 72 2d 6e 61 6d  current-user-nam
7fa0: 65 29 20 22 2f 22 20 72 75 6e 73 70 61 74 74 20  e) "/" runspatt 
7fb0: 22 5f 22 20 28 72 61 6e 64 6f 6d 20 31 30 30 30  "_" (random 1000
7fc0: 30 29 20 22 5f 22 20 28 63 75 72 72 65 6e 74 2d  0) "_" (current-
7fd0: 70 72 6f 63 65 73 73 2d 69 64 29 29 29 0a 09 20  process-id))).. 
7fe0: 28 72 75 6e 73 68 65 61 64 65 72 20 28 61 70 70  (runsheader (app
7ff0: 65 6e 64 20 28 6c 69 73 74 20 22 52 75 6e 20 49  end (list "Run I
8000: 64 22 20 22 52 75 6e 6e 61 6d 65 22 29 20 3b 20  d" "Runname") ; 
8010: 30 20 31 0a 09 09 09 20 20 20 20 20 28 6d 61 70  0 1....     (map
8020: 20 63 61 72 20 6b 65 79 70 61 74 74 2d 61 6c 69   car keypatt-ali
8030: 73 74 29 20 20 20 3b 20 2b 20 4e 20 3d 20 6c 65  st)   ; + N = le
8040: 6e 67 74 68 20 6b 65 79 70 61 74 74 2d 61 6c 69  ngth keypatt-ali
8050: 73 74 0a 09 09 09 20 20 20 20 20 28 6c 69 73 74  st....     (list
8060: 20 22 54 65 73 74 6e 61 6d 65 22 20 20 20 20 20   "Testname"     
8070: 20 20 20 20 20 3b 20 32 0a 09 09 09 09 20 20 20       ; 2.....   
8080: 22 49 74 65 6d 20 50 61 74 68 22 20 20 20 20 20  "Item Path"     
8090: 20 20 20 20 3b 20 33 20 0a 09 09 09 09 20 20 20      ; 3 .....   
80a0: 22 44 65 73 63 72 69 70 74 69 6f 6e 22 20 20 20  "Description"   
80b0: 20 20 20 20 3b 20 34 20 0a 09 09 09 09 20 20 20      ; 4 .....   
80c0: 22 53 74 61 74 65 22 20 20 20 20 20 20 20 20 20  "State"         
80d0: 20 20 20 20 3b 20 35 20 0a 09 09 09 09 20 20 20      ; 5 .....   
80e0: 22 53 74 61 74 75 73 22 20 20 20 20 20 20 20 20  "Status"        
80f0: 20 20 20 20 3b 20 36 20 20 0a 09 09 09 09 20 20      ; 6  .....  
8100: 20 22 46 69 6e 61 6c 20 4c 6f 67 22 20 20 20 20   "Final Log"    
8110: 20 20 20 20 20 3b 20 37 20 0a 09 09 09 09 20 20       ; 7 .....  
8120: 20 22 52 75 6e 20 44 75 72 61 74 69 6f 6e 22 20   "Run Duration" 
8130: 20 20 20 20 20 3b 20 38 20 0a 09 09 09 09 20 20       ; 8 .....  
8140: 20 22 57 68 65 6e 20 52 75 6e 22 20 20 20 20 20   "When Run"     
8150: 20 20 20 20 20 3b 20 39 20 0a 09 09 09 09 20 20       ; 9 .....  
8160: 20 22 54 61 67 73 22 20 20 20 20 20 20 20 20 20   "Tags"         
8170: 20 20 20 20 20 3b 20 31 30 0a 09 09 09 09 20 20       ; 10.....  
8180: 20 22 52 75 6e 20 4f 77 6e 65 72 22 20 20 20 20   "Run Owner"    
8190: 20 20 20 20 20 3b 20 31 31 0a 09 09 09 09 20 20       ; 11.....  
81a0: 20 22 43 6f 6d 6d 65 6e 74 22 20 20 20 20 20 20   "Comment"      
81b0: 20 20 20 20 20 3b 20 31 32 0a 09 09 09 09 20 20       ; 12.....  
81c0: 20 22 41 75 74 68 6f 72 22 20 20 20 20 20 20 20   "Author"       
81d0: 20 20 20 20 20 3b 20 31 33 0a 09 09 09 09 20 20       ; 13.....  
81e0: 20 22 54 65 73 74 20 4f 77 6e 65 72 22 20 20 20   "Test Owner"   
81f0: 20 20 20 20 20 3b 20 31 34 0a 09 09 09 09 20 20       ; 14.....  
8200: 20 22 52 65 76 69 65 77 65 64 22 20 20 20 20 20   "Reviewed"     
8210: 20 20 20 20 20 3b 20 31 35 0a 09 09 09 09 20 20       ; 15.....  
8220: 20 22 44 69 73 6b 66 72 65 65 22 20 20 20 20 20   "Diskfree"     
8230: 20 20 20 20 20 3b 20 31 36 0a 09 09 09 09 20 20       ; 16.....  
8240: 20 22 55 6e 61 6d 65 22 20 20 20 20 20 20 20 20   "Uname"        
8250: 20 20 20 20 20 3b 20 31 37 0a 09 09 09 09 20 20       ; 17.....  
8260: 20 22 52 75 6e 64 69 72 22 20 20 20 20 20 20 20   "Rundir"       
8270: 20 20 20 20 20 3b 20 31 38 0a 09 09 09 09 20 20       ; 18.....  
8280: 20 22 48 6f 73 74 22 20 20 20 20 20 20 20 20 20   "Host"         
8290: 20 20 20 20 20 3b 20 31 39 0a 09 09 09 09 20 20       ; 19.....  
82a0: 20 22 43 70 75 20 4c 6f 61 64 22 20 20 20 20 20   "Cpu Load"     
82b0: 20 20 20 20 20 3b 20 32 30 0a 09 09 09 09 20 20       ; 20.....  
82c0: 20 29 29 29 0a 09 20 28 72 65 73 75 6c 74 73 20   ))).. (results 
82d0: 28 6c 69 73 74 20 72 75 6e 73 68 65 61 64 65 72  (list runsheader
82e0: 29 29 09 09 09 20 0a 09 20 28 74 65 73 74 64 61  ))... .. (testda
82f0: 74 61 2d 68 65 61 64 65 72 20 28 6c 69 73 74 20  ta-header (list 
8300: 22 52 75 6e 20 49 64 22 20 22 54 65 73 74 6e 61  "Run Id" "Testna
8310: 6d 65 22 20 22 49 74 65 6d 20 50 61 74 68 22 20  me" "Item Path" 
8320: 22 43 61 74 65 67 6f 72 79 22 20 22 56 61 72 69  "Category" "Vari
8330: 61 62 6c 65 22 20 22 56 61 6c 75 65 22 20 22 45  able" "Value" "E
8340: 78 70 65 63 74 65 64 22 20 22 54 6f 6c 22 20 22  xpected" "Tol" "
8350: 55 6e 69 74 73 22 20 22 53 74 61 74 75 73 22 20  Units" "Status" 
8360: 22 43 6f 6d 6d 65 6e 74 22 29 29 29 0a 20 20 20  "Comment"))).   
8370: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 32 20   (debug:print 2 
8380: 22 55 73 69 6e 67 20 22 20 74 65 6d 70 64 69 72  "Using " tempdir
8390: 20 22 20 66 6f 72 20 63 6f 6e 73 74 72 75 63 74   " for construct
83a0: 69 6e 67 20 74 68 65 20 6f 64 73 20 66 69 6c 65  ing the ods file
83b0: 2e 20 6b 65 79 71 72 79 3a 20 22 20 6b 65 79 71  . keyqry: " keyq
83c0: 72 79 20 22 20 6b 65 79 73 74 72 3a 20 22 20 6b  ry " keystr: " k
83d0: 65 79 73 73 74 72 20 22 20 77 69 74 68 20 6b 65  eysstr " with ke
83e0: 79 73 3a 20 22 20 28 6d 61 70 20 63 61 64 72 20  ys: " (map cadr 
83f0: 6b 65 79 70 61 74 74 2d 61 6c 69 73 74 29 29 0a  keypatt-alist)).
8400: 20 20 20 20 3b 3b 20 22 45 78 70 65 63 74 65 64      ;; "Expected
8410: 20 56 61 6c 75 65 22 0a 20 20 20 20 3b 3b 20 22   Value".    ;; "
8420: 56 61 6c 75 65 20 46 6f 75 6e 64 22 0a 20 20 20  Value Found".   
8430: 20 3b 3b 20 22 54 6f 6c 65 72 61 6e 63 65 22 0a   ;; "Tolerance".
8440: 20 20 20 20 28 61 70 70 6c 79 20 73 71 6c 69 74      (apply sqlit
8450: 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a  e3:for-each-row.
8460: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 74 65       (lambda (te
8470: 73 74 2d 69 64 20 2e 20 62 29 0a 20 20 20 20 20  st-id . b).     
8480: 20 20 28 73 65 74 21 20 74 65 73 74 2d 69 64 73    (set! test-ids
8490: 20 28 63 6f 6e 73 20 74 65 73 74 2d 69 64 20 74   (cons test-id t
84a0: 65 73 74 2d 69 64 73 29 29 20 20 20 3b 3b 20 74  est-ids))   ;; t
84b0: 65 73 74 2d 69 64 20 69 73 20 6e 6f 77 20 74 65  est-id is now te
84c0: 73 74 6e 61 6d 65 0a 20 20 20 20 20 20 20 28 73  stname.       (s
84d0: 65 74 21 20 72 65 73 75 6c 74 73 20 28 61 70 70  et! results (app
84e0: 65 6e 64 20 72 65 73 75 6c 74 73 20 3b 3b 20 6e  end results ;; n
84f0: 6f 74 65 2c 20 64 72 6f 70 20 74 68 65 20 74 65  ote, drop the te
8500: 73 74 2d 69 64 0a 09 09 09 20 20 20 20 20 28 6c  st-id....     (l
8510: 69 73 74 0a 09 09 09 20 20 20 20 20 20 28 69 66  ist....      (if
8520: 20 70 61 74 68 6d 6f 64 0a 09 09 09 09 20 20 28   pathmod.....  (
8530: 6c 65 74 2a 20 28 28 76 62 20 20 20 20 20 20 20  let* ((vb       
8540: 20 28 61 70 70 6c 79 20 76 65 63 74 6f 72 20 62   (apply vector b
8550: 29 29 0a 09 09 09 09 09 20 28 6b 65 79 76 61 6c  ))...... (keyval
8560: 73 20 20 20 28 6c 65 74 20 6c 6f 6f 70 20 28 28  s   (let loop ((
8570: 69 20 20 20 20 30 29 0a 09 09 09 09 09 09 09 20  i    0)........ 
8580: 20 20 20 20 20 20 28 72 65 73 20 27 28 29 29 29        (res '()))
8590: 0a 09 09 09 09 09 09 20 20 20 20 20 20 28 69 66  .......      (if
85a0: 20 28 3e 3d 20 69 20 6e 75 6d 6b 65 79 73 29 0a   (>= i numkeys).
85b0: 09 09 09 09 09 09 09 20 20 72 65 73 0a 09 09 09  .......  res....
85c0: 09 09 09 09 20 20 28 6c 6f 6f 70 20 28 2b 20 69  ....  (loop (+ i
85d0: 20 31 29 0a 09 09 09 09 09 09 09 09 28 61 70 70   1).........(app
85e0: 65 6e 64 20 72 65 73 20 28 6c 69 73 74 20 28 76  end res (list (v
85f0: 65 63 74 6f 72 2d 72 65 66 20 76 62 20 28 2b 20  ector-ref vb (+ 
8600: 69 20 32 29 29 29 29 29 29 29 29 0a 09 09 09 09  i 2)))))))).....
8610: 09 20 28 72 75 6e 6e 61 6d 65 20 20 20 28 76 65  . (runname   (ve
8620: 63 74 6f 72 2d 72 65 66 20 76 62 20 31 29 29 0a  ctor-ref vb 1)).
8630: 09 09 09 09 09 20 28 74 65 73 74 6e 61 6d 65 20  ..... (testname 
8640: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62 20   (vector-ref vb 
8650: 28 2b 20 20 32 20 6e 75 6d 6b 65 79 73 29 29 29  (+  2 numkeys)))
8660: 0a 09 09 09 09 09 20 28 69 74 65 6d 2d 70 61 74  ...... (item-pat
8670: 68 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62  h (vector-ref vb
8680: 20 28 2b 20 20 33 20 6e 75 6d 6b 65 79 73 29 29   (+  3 numkeys))
8690: 29 0a 09 09 09 09 09 20 28 66 69 6e 61 6c 2d 6c  )...... (final-l
86a0: 6f 67 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76  og (vector-ref v
86b0: 62 20 28 2b 20 20 37 20 6e 75 6d 6b 65 79 73 29  b (+  7 numkeys)
86c0: 29 29 0a 09 09 09 09 09 20 28 72 75 6e 2d 64 69  ))...... (run-di
86d0: 72 20 20 20 28 76 65 63 74 6f 72 2d 72 65 66 20  r   (vector-ref 
86e0: 76 62 20 28 2b 20 31 38 20 6e 75 6d 6b 65 79 73  vb (+ 18 numkeys
86f0: 29 29 29 0a 09 09 09 09 09 20 28 6c 6f 67 2d 66  )))...... (log-f
8700: 70 61 74 68 20 28 63 6f 6e 63 20 72 75 6e 2d 64  path (conc run-d
8710: 69 72 20 22 2f 22 20 20 66 69 6e 61 6c 2d 6c 6f  ir "/"  final-lo
8720: 67 29 29 29 20 3b 3b 20 28 73 74 72 69 6e 67 2d  g))) ;; (string-
8730: 69 6e 74 65 72 73 70 65 72 73 65 20 6b 65 79 76  intersperse keyv
8740: 61 6c 73 20 22 2f 22 29 20 22 2f 22 20 74 65 73  als "/") "/" tes
8750: 74 6e 61 6d 65 20 22 2f 22 20 69 74 65 6d 2d 70  tname "/" item-p
8760: 61 74 68 20 22 2f 22 0a 09 09 09 09 20 20 20 20  ath "/".....    
8770: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22  (debug:print 4 "
8780: 6c 6f 67 3a 20 22 20 6c 6f 67 2d 66 70 61 74 68  log: " log-fpath
8790: 20 22 20 65 78 69 73 74 73 3a 20 22 20 28 66 69   " exists: " (fi
87a0: 6c 65 2d 65 78 69 73 74 73 3f 20 6c 6f 67 2d 66  le-exists? log-f
87b0: 70 61 74 68 29 29 0a 09 09 09 09 20 20 20 20 28  path)).....    (
87c0: 76 65 63 74 6f 72 2d 73 65 74 21 20 76 62 20 28  vector-set! vb (
87d0: 2b 20 37 20 6e 75 6d 6b 65 79 73 29 20 28 69 66  + 7 numkeys) (if
87e0: 20 28 66 69 6c 65 2d 65 78 69 73 74 73 3f 20 6c   (file-exists? l
87f0: 6f 67 2d 66 70 61 74 68 29 0a 09 09 09 09 09 09  og-fpath).......
8800: 09 09 20 20 20 20 20 20 28 6c 65 74 20 28 28 6e  ..      (let ((n
8810: 65 77 70 61 74 68 20 28 63 6f 6e 63 20 70 61 74  ewpath (conc pat
8820: 68 6d 6f 64 20 22 2f 22 0a 09 09 09 09 09 09 09  hmod "/"........
8830: 09 09 09 09 20 20 20 28 73 74 72 69 6e 67 2d 69  ....   (string-i
8840: 6e 74 65 72 73 70 65 72 73 65 20 6b 65 79 76 61  ntersperse keyva
8850: 6c 73 20 22 2f 22 29 0a 09 09 09 09 09 09 09 09  ls "/").........
8860: 09 09 09 20 20 20 22 2f 22 20 72 75 6e 6e 61 6d  ...   "/" runnam
8870: 65 20 22 2f 22 20 74 65 73 74 6e 61 6d 65 20 22  e "/" testname "
8880: 2f 22 0a 09 09 09 09 09 09 09 09 09 09 09 20 20  /"............  
8890: 20 28 69 66 20 28 73 74 72 69 6e 67 3d 3f 20 69   (if (string=? i
88a0: 74 65 6d 2d 70 61 74 68 20 22 22 29 20 22 22 20  tem-path "") "" 
88b0: 28 63 6f 6e 63 20 22 2f 22 20 69 74 65 6d 2d 70  (conc "/" item-p
88c0: 61 74 68 29 29 0a 09 09 09 09 09 09 09 09 09 09  ath))...........
88d0: 09 20 20 20 66 69 6e 61 6c 2d 6c 6f 67 29 29 29  .   final-log)))
88e0: 0a 09 09 09 09 09 09 09 09 09 3b 3b 20 66 6f 72  ..........;; for
88f0: 20 6e 6f 77 20 74 68 72 6f 77 20 61 77 61 79 20   now throw away 
8900: 6e 65 77 70 61 74 68 20 61 6e 64 20 75 73 65 20  newpath and use 
8910: 74 68 65 20 6c 6f 67 2d 66 70 61 74 68 20 63 6f  the log-fpath co
8920: 6e 63 27 64 20 77 69 74 68 20 70 61 74 68 6d 6f  nc'd with pathmo
8930: 64 0a 09 09 09 09 09 09 09 09 09 28 73 65 74 21  d..........(set!
8940: 20 6e 65 77 70 61 74 68 20 28 63 6f 6e 63 20 70   newpath (conc p
8950: 61 74 68 6d 6f 64 20 6c 6f 67 2d 66 70 61 74 68  athmod log-fpath
8960: 29 29 0a 09 09 09 09 09 09 09 09 09 28 69 66 20  ))..........(if 
8970: 77 69 6e 64 6f 77 73 20 28 73 74 72 69 6e 67 2d  windows (string-
8980: 74 72 61 6e 73 6c 61 74 65 20 6e 65 77 70 61 74  translate newpat
8990: 68 20 22 2f 22 20 22 5c 5c 22 29 20 6e 65 77 70  h "/" "\\") newp
89a0: 61 74 68 29 29 0a 09 09 09 09 09 09 09 09 20 20  ath)).........  
89b0: 20 20 20 20 28 69 66 20 28 3e 20 2a 76 65 72 62      (if (> *verb
89c0: 6f 73 69 74 79 2a 20 31 29 0a 09 09 09 09 09 09  osity* 1).......
89d0: 09 09 09 20 20 28 63 6f 6e 63 20 66 69 6e 61 6c  ...  (conc final
89e0: 2d 6c 6f 67 20 22 20 6e 6f 74 2d 66 6f 75 6e 64  -log " not-found
89f0: 22 29 0a 09 09 09 09 09 09 09 09 09 20 20 22 22  ")..........  ""
8a00: 29 29 29 0a 09 09 09 09 20 20 20 20 28 76 65 63  ))).....    (vec
8a10: 74 6f 72 2d 3e 6c 69 73 74 20 76 62 29 29 0a 09  tor->list vb))..
8a20: 09 09 09 20 20 62 29 29 29 29 29 0a 20 20 20 20  ...  b))))).    
8a30: 20 64 62 0a 20 20 20 20 20 28 63 6f 6e 63 20 22   db.     (conc "
8a40: 53 45 4c 45 43 54 0a 20 20 20 20 20 20 20 20 20  SELECT.         
8a50: 20 20 20 20 20 74 2e 74 65 73 74 6e 61 6d 65 2c       t.testname,
8a60: 72 2e 69 64 2c 72 75 6e 6e 61 6d 65 2c 22 20 6b  r.id,runname," k
8a70: 65 79 73 73 74 72 20 22 2c 74 2e 74 65 73 74 6e  eysstr ",t.testn
8a80: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ame,.           
8a90: 20 20 20 74 2e 69 74 65 6d 5f 70 61 74 68 2c 74     t.item_path,t
8aa0: 6d 2e 64 65 73 63 72 69 70 74 69 6f 6e 2c 74 2e  m.description,t.
8ab0: 73 74 61 74 65 2c 74 2e 73 74 61 74 75 73 2c 0a  state,t.status,.
8ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
8ad0: 6e 61 6c 5f 6c 6f 67 66 2c 72 75 6e 5f 64 75 72  nal_logf,run_dur
8ae0: 61 74 69 6f 6e 2c 20 0a 20 20 20 20 20 20 20 20  ation, .        
8af0: 20 20 20 20 20 20 73 74 72 66 74 69 6d 65 28 27        strftime('
8b00: 25 6d 2f 25 64 2f 25 59 20 25 48 3a 25 4d 3a 25  %m/%d/%Y %H:%M:%
8b10: 53 27 2c 64 61 74 65 74 69 6d 65 28 74 2e 65 76  S',datetime(t.ev
8b20: 65 6e 74 5f 74 69 6d 65 2c 27 75 6e 69 78 65 70  ent_time,'unixep
8b30: 6f 63 68 27 29 2c 27 6c 6f 63 61 6c 74 69 6d 65  och'),'localtime
8b40: 27 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '),.            
8b50: 20 20 74 6d 2e 74 61 67 73 2c 72 2e 6f 77 6e 65    tm.tags,r.owne
8b60: 72 2c 74 2e 63 6f 6d 6d 65 6e 74 2c 0a 20 20 20  r,t.comment,.   
8b70: 20 20 20 20 20 20 20 20 20 20 20 61 75 74 68 6f             autho
8b80: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
8b90: 20 74 6d 2e 6f 77 6e 65 72 2c 72 65 76 69 65 77   tm.owner,review
8ba0: 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed,.            
8bb0: 20 20 64 69 73 6b 66 72 65 65 2c 75 6e 61 6d 65    diskfree,uname
8bc0: 2c 72 75 6e 64 69 72 2c 0a 20 20 20 20 20 20 20  ,rundir,.       
8bd0: 20 20 20 20 20 20 20 68 6f 73 74 2c 63 70 75 6c         host,cpul
8be0: 6f 61 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  oad.            
8bf0: 46 52 4f 4d 20 74 65 73 74 73 20 41 53 20 74 20  FROM tests AS t 
8c00: 49 4e 4e 45 52 20 4a 4f 49 4e 20 72 75 6e 73 20  INNER JOIN runs 
8c10: 41 53 20 72 20 4f 4e 20 74 2e 72 75 6e 5f 69 64  AS r ON t.run_id
8c20: 3d 72 2e 69 64 20 49 4e 4e 45 52 20 4a 4f 49 4e  =r.id INNER JOIN
8c30: 20 74 65 73 74 5f 6d 65 74 61 20 41 53 20 74 6d   test_meta AS tm
8c40: 20 4f 4e 20 74 6d 2e 74 65 73 74 6e 61 6d 65 3d   ON tm.testname=
8c50: 74 2e 74 65 73 74 6e 61 6d 65 0a 20 20 20 20 20  t.testname.     
8c60: 20 20 20 20 20 20 20 57 48 45 52 45 20 72 75 6e         WHERE run
8c70: 6e 61 6d 65 20 4c 49 4b 45 20 3f 20 41 4e 44 20  name LIKE ? AND 
8c80: 22 20 6b 65 79 71 72 79 20 22 3b 22 29 0a 20 20  " keyqry ";").  
8c90: 20 20 20 72 75 6e 73 70 61 74 74 20 28 6d 61 70     runspatt (map
8ca0: 20 63 61 64 72 20 6b 65 79 70 61 74 74 2d 61 6c   cadr keypatt-al
8cb0: 69 73 74 29 29 0a 20 20 20 20 28 73 65 74 21 20  ist)).    (set! 
8cc0: 72 65 73 75 6c 74 73 20 28 6c 69 73 74 20 28 63  results (list (c
8cd0: 6f 6e 73 20 22 52 75 6e 73 22 20 72 65 73 75 6c  ons "Runs" resul
8ce0: 74 73 29 29 29 0a 20 20 20 20 3b 3b 20 6e 6f 77  ts))).    ;; now
8cf0: 2c 20 66 6f 72 20 65 61 63 68 20 74 65 73 74 2c  , for each test,
8d00: 20 63 6f 6c 6c 65 63 74 20 74 68 65 20 74 65 73   collect the tes
8d10: 74 5f 64 61 74 61 20 69 6e 66 6f 20 61 6e 64 20  t_data info and 
8d20: 61 64 64 20 61 20 6e 65 77 20 73 68 65 65 74 0a  add a new sheet.
8d30: 20 20 20 20 28 66 6f 72 2d 65 61 63 68 0a 20 20      (for-each.  
8d40: 20 20 20 28 6c 61 6d 62 64 61 20 28 74 65 73 74     (lambda (test
8d50: 2d 69 64 29 0a 20 20 20 20 20 20 20 28 6c 65 74  -id).       (let
8d60: 20 28 28 74 65 73 74 2d 64 61 74 61 20 28 6c 69   ((test-data (li
8d70: 73 74 20 74 65 73 74 64 61 74 61 2d 68 65 61 64  st testdata-head
8d80: 65 72 29 29 0a 09 20 20 20 20 20 28 63 75 72 72  er))..     (curr
8d90: 2d 74 65 73 74 2d 6e 61 6d 65 20 23 66 29 29 0a  -test-name #f)).
8da0: 09 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65  . (sqlite3:for-e
8db0: 61 63 68 2d 72 6f 77 0a 09 20 20 28 6c 61 6d 62  ach-row..  (lamb
8dc0: 64 61 20 28 72 75 6e 2d 69 64 20 74 65 73 74 6e  da (run-id testn
8dd0: 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 63 61  ame item-path ca
8de0: 74 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65 20  tegory variable 
8df0: 76 61 6c 75 65 20 65 78 70 65 63 74 65 64 20 74  value expected t
8e00: 6f 6c 20 75 6e 69 74 73 20 73 74 61 74 75 73 20  ol units status 
8e10: 63 6f 6d 6d 65 6e 74 29 0a 09 20 20 20 20 28 73  comment)..    (s
8e20: 65 74 21 20 63 75 72 72 2d 74 65 73 74 2d 6e 61  et! curr-test-na
8e30: 6d 65 20 74 65 73 74 6e 61 6d 65 29 0a 09 20 20  me testname)..  
8e40: 20 20 28 73 65 74 21 20 74 65 73 74 2d 64 61 74    (set! test-dat
8e50: 61 20 28 61 70 70 65 6e 64 20 74 65 73 74 2d 64  a (append test-d
8e60: 61 74 61 20 28 6c 69 73 74 20 28 6c 69 73 74 20  ata (list (list 
8e70: 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20  run-id testname 
8e80: 69 74 65 6d 2d 70 61 74 68 20 63 61 74 65 67 6f  item-path catego
8e90: 72 79 20 76 61 72 69 61 62 6c 65 20 76 61 6c 75  ry variable valu
8ea0: 65 20 65 78 70 65 63 74 65 64 20 74 6f 6c 20 75  e expected tol u
8eb0: 6e 69 74 73 20 73 74 61 74 75 73 20 63 6f 6d 6d  nits status comm
8ec0: 65 6e 74 29 29 29 29 29 0a 09 20 20 64 62 20 0a  ent)))))..  db .
8ed0: 09 20 20 3b 3b 20 22 53 45 4c 45 43 54 20 72 75  .  ;; "SELECT ru
8ee0: 6e 5f 69 64 2c 74 65 73 74 6e 61 6d 65 2c 69 74  n_id,testname,it
8ef0: 65 6d 5f 70 61 74 68 2c 63 61 74 65 67 6f 72 79  em_path,category
8f00: 2c 76 61 72 69 61 62 6c 65 2c 74 64 2e 76 61 6c  ,variable,td.val
8f10: 75 65 20 41 53 20 76 61 6c 75 65 2c 65 78 70 65  ue AS value,expe
8f20: 63 74 65 64 2c 74 6f 6c 2c 75 6e 69 74 73 2c 74  cted,tol,units,t
8f30: 64 2e 73 74 61 74 75 73 20 41 53 20 73 74 61 74  d.status AS stat
8f40: 75 73 2c 74 64 2e 63 6f 6d 6d 65 6e 74 20 41 53  us,td.comment AS
8f50: 20 63 6f 6d 6d 65 6e 74 20 46 52 4f 4d 20 74 65   comment FROM te
8f60: 73 74 5f 64 61 74 61 20 41 53 20 74 64 20 49 4e  st_data AS td IN
8f70: 4e 45 52 20 4a 4f 49 4e 20 74 65 73 74 73 20 4f  NER JOIN tests O
8f80: 4e 20 74 65 73 74 73 2e 69 64 3d 74 64 2e 74 65  N tests.id=td.te
8f90: 73 74 5f 69 64 20 57 48 45 52 45 20 74 65 73 74  st_id WHERE test
8fa0: 5f 69 64 3d 3f 3b 22 0a 09 20 20 22 53 45 4c 45  _id=?;"..  "SELE
8fb0: 43 54 20 72 75 6e 5f 69 64 2c 74 65 73 74 6e 61  CT run_id,testna
8fc0: 6d 65 2c 69 74 65 6d 5f 70 61 74 68 2c 63 61 74  me,item_path,cat
8fd0: 65 67 6f 72 79 2c 76 61 72 69 61 62 6c 65 2c 74  egory,variable,t
8fe0: 64 2e 76 61 6c 75 65 20 41 53 20 76 61 6c 75 65  d.value AS value
8ff0: 2c 74 64 2e 65 78 70 65 63 74 65 64 2c 74 64 2e  ,td.expected,td.
9000: 74 6f 6c 2c 74 64 2e 75 6e 69 74 73 2c 74 64 2e  tol,td.units,td.
9010: 73 74 61 74 75 73 20 41 53 20 73 74 61 74 75 73  status AS status
9020: 2c 74 64 2e 63 6f 6d 6d 65 6e 74 20 41 53 20 63  ,td.comment AS c
9030: 6f 6d 6d 65 6e 74 20 46 52 4f 4d 20 74 65 73 74  omment FROM test
9040: 5f 64 61 74 61 20 41 53 20 74 64 20 49 4e 4e 45  _data AS td INNE
9050: 52 20 4a 4f 49 4e 20 74 65 73 74 73 20 4f 4e 20  R JOIN tests ON 
9060: 74 65 73 74 73 2e 69 64 3d 74 64 2e 74 65 73 74  tests.id=td.test
9070: 5f 69 64 20 57 48 45 52 45 20 74 65 73 74 6e 61  _id WHERE testna
9080: 6d 65 3d 3f 3b 22 0a 09 20 20 74 65 73 74 2d 69  me=?;"..  test-i
9090: 64 29 0a 09 20 28 69 66 20 63 75 72 72 2d 74 65  d).. (if curr-te
90a0: 73 74 2d 6e 61 6d 65 0a 09 20 20 20 20 20 28 73  st-name..     (s
90b0: 65 74 21 20 72 65 73 75 6c 74 73 20 28 61 70 70  et! results (app
90c0: 65 6e 64 20 72 65 73 75 6c 74 73 20 28 6c 69 73  end results (lis
90d0: 74 20 28 63 6f 6e 73 20 63 75 72 72 2d 74 65 73  t (cons curr-tes
90e0: 74 2d 6e 61 6d 65 20 74 65 73 74 2d 64 61 74 61  t-name test-data
90f0: 29 29 29 29 29 0a 09 20 29 29 0a 20 20 20 20 20  ))))).. )).     
9100: 28 73 6f 72 74 20 28 64 65 6c 65 74 65 2d 64 75  (sort (delete-du
9110: 70 6c 69 63 61 74 65 73 20 74 65 73 74 2d 69 64  plicates test-id
9120: 73 29 20 73 74 72 69 6e 67 3c 3d 29 29 0a 20 20  s) string<=)).  
9130: 20 20 28 73 79 73 74 65 6d 20 28 63 6f 6e 63 20    (system (conc 
9140: 22 6d 6b 64 69 72 20 2d 70 20 22 20 74 65 6d 70  "mkdir -p " temp
9150: 64 69 72 29 29 0a 20 20 20 20 3b 3b 20 28 70 70  dir)).    ;; (pp
9160: 20 72 65 73 75 6c 74 73 29 0a 20 20 20 20 28 6f   results).    (o
9170: 64 73 3a 6c 69 73 74 2d 3e 6f 64 73 20 0a 20 20  ds:list->ods .  
9180: 20 20 20 74 65 6d 70 64 69 72 0a 20 20 20 20 20     tempdir.     
9190: 28 69 66 20 28 73 74 72 69 6e 67 2d 6d 61 74 63  (if (string-matc
91a0: 68 20 28 72 65 67 65 78 70 20 22 5e 5b 2f 7e 5d  h (regexp "^[/~]
91b0: 2b 2e 2a 22 29 20 6f 75 74 70 75 74 66 69 6c 65  +.*") outputfile
91c0: 29 20 3b 3b 20 66 75 6c 6c 20 70 61 74 68 3f 0a  ) ;; full path?.
91d0: 09 20 6f 75 74 70 75 74 66 69 6c 65 0a 09 20 28  . outputfile.. (
91e0: 62 65 67 69 6e 0a 09 20 20 20 28 64 65 62 75 67  begin..   (debug
91f0: 3a 70 72 69 6e 74 20 30 20 22 57 41 52 4e 49 4e  :print 0 "WARNIN
9200: 47 3a 20 70 61 74 68 20 67 69 76 65 6e 2c 20 22  G: path given, "
9210: 20 6f 75 74 70 75 74 66 69 6c 65 20 22 20 69 73   outputfile " is
9220: 20 72 65 6c 61 74 69 76 65 2c 20 70 72 65 66 69   relative, prefi
9230: 78 69 6e 67 20 77 69 74 68 20 63 75 72 72 65 6e  xing with curren
9240: 74 20 64 69 72 65 63 74 6f 72 79 22 29 0a 09 20  t directory").. 
9250: 20 20 28 63 6f 6e 63 20 28 63 75 72 72 65 6e 74    (conc (current
9260: 2d 64 69 72 65 63 74 6f 72 79 29 20 22 2f 22 20  -directory) "/" 
9270: 6f 75 74 70 75 74 66 69 6c 65 29 29 29 0a 20 20  outputfile))).  
9280: 20 20 20 72 65 73 75 6c 74 73 29 29 29 0a 0a 3b     results)))..;
9290: 3b 20 28 64 62 3a 65 78 74 72 61 63 74 2d 6f 64  ; (db:extract-od
92a0: 73 2d 66 69 6c 65 20 64 62 20 22 6f 75 74 70 75  s-file db "outpu
92b0: 74 66 69 6c 65 2e 6f 64 73 22 20 27 28 28 22 73  tfile.ods" '(("s
92c0: 79 73 6e 61 6d 65 22 20 22 25 22 29 28 22 66 73  ysname" "%")("fs
92d0: 6e 61 6d 65 22 20 22 25 22 29 28 22 64 61 74 61  name" "%")("data
92e0: 70 61 74 68 22 20 22 25 22 29 29 20 22 25 22 29  path" "%")) "%")
92f0: 0a                                               .