Megatest

Hex Artifact Content
Login

Artifact 7df6739618012e5d21ad6c28581fe7ef5b66f33a:


0000: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
0010: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0030: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0040: 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 43 6f 70 79  ========.;; Copy
0050: 72 69 67 68 74 20 32 30 30 36 2d 32 30 31 31 2c  right 2006-2011,
0060: 20 4d 61 74 74 68 65 77 20 57 65 6c 6c 61 6e 64   Matthew Welland
0070: 2e 0a 3b 3b 20 0a 3b 3b 20 20 54 68 69 73 20 70  ..;; .;;  This p
0080: 72 6f 67 72 61 6d 20 69 73 20 6d 61 64 65 20 61  rogram is made a
0090: 76 61 69 6c 61 62 6c 65 20 75 6e 64 65 72 20 74  vailable under t
00a0: 68 65 20 47 4e 55 20 47 50 4c 20 76 65 72 73 69  he GNU GPL versi
00b0: 6f 6e 20 32 2e 30 20 6f 72 0a 3b 3b 20 20 67 72  on 2.0 or.;;  gr
00c0: 65 61 74 65 72 2e 20 53 65 65 20 74 68 65 20 61  eater. See the a
00d0: 63 63 6f 6d 70 61 6e 79 69 6e 67 20 66 69 6c 65  ccompanying file
00e0: 20 43 4f 50 59 49 4e 47 20 66 6f 72 20 64 65 74   COPYING for det
00f0: 61 69 6c 73 2e 0a 3b 3b 20 0a 3b 3b 20 20 54 68  ails..;; .;;  Th
0100: 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69  is program is di
0110: 73 74 72 69 62 75 74 65 64 20 57 49 54 48 4f 55  stributed WITHOU
0120: 54 20 41 4e 59 20 57 41 52 52 41 4e 54 59 3b 20  T ANY WARRANTY; 
0130: 77 69 74 68 6f 75 74 20 65 76 65 6e 20 74 68 65  without even the
0140: 0a 3b 3b 20 20 69 6d 70 6c 69 65 64 20 77 61 72  .;;  implied war
0150: 72 61 6e 74 79 20 6f 66 20 4d 45 52 43 48 41 4e  ranty of MERCHAN
0160: 54 41 42 49 4c 49 54 59 20 6f 72 20 46 49 54 4e  TABILITY or FITN
0170: 45 53 53 20 46 4f 52 20 41 20 50 41 52 54 49 43  ESS FOR A PARTIC
0180: 55 4c 41 52 0a 3b 3b 20 20 50 55 52 50 4f 53 45  ULAR.;;  PURPOSE
0190: 2e 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ..;;============
01a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 3d 3d  ==========..;;==
01e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0200: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0210: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0220: 3d 3d 3d 3d 0a 3b 3b 20 44 61 74 61 62 61 73 65  ====.;; Database
0230: 20 61 63 63 65 73 73 0a 3b 3b 3d 3d 3d 3d 3d 3d   access.;;======
0240: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0250: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0260: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0270: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0280: 0a 0a 28 75 73 65 20 73 71 6c 69 74 65 33 20 73  ..(use sqlite3 s
0290: 72 66 69 2d 31 20 70 6f 73 69 78 20 72 65 67 65  rfi-1 posix rege
02a0: 78 20 72 65 67 65 78 2d 63 61 73 65 20 73 72 66  x regex-case srf
02b0: 69 2d 36 39 20 63 73 76 2d 78 6d 6c 29 0a 28 69  i-69 csv-xml).(i
02c0: 6d 70 6f 72 74 20 28 70 72 65 66 69 78 20 73 71  mport (prefix sq
02d0: 6c 69 74 65 33 20 73 71 6c 69 74 65 33 3a 29 29  lite3 sqlite3:))
02e0: 0a 0a 28 64 65 63 6c 61 72 65 20 28 75 6e 69 74  ..(declare (unit
02f0: 20 64 62 29 29 0a 28 64 65 63 6c 61 72 65 20 28   db)).(declare (
0300: 75 73 65 73 20 63 6f 6d 6d 6f 6e 29 29 0a 28 64  uses common)).(d
0310: 65 63 6c 61 72 65 20 28 75 73 65 73 20 6b 65 79  eclare (uses key
0320: 73 29 29 0a 28 64 65 63 6c 61 72 65 20 28 75 73  s)).(declare (us
0330: 65 73 20 6f 64 73 29 29 0a 0a 28 69 6e 63 6c 75  es ods))..(inclu
0340: 64 65 20 22 63 6f 6d 6d 6f 6e 5f 72 65 63 6f 72  de "common_recor
0350: 64 73 2e 73 63 6d 22 29 0a 28 69 6e 63 6c 75 64  ds.scm").(includ
0360: 65 20 22 64 62 5f 72 65 63 6f 72 64 73 2e 73 63  e "db_records.sc
0370: 6d 22 29 0a 28 69 6e 63 6c 75 64 65 20 22 6b 65  m").(include "ke
0380: 79 5f 72 65 63 6f 72 64 73 2e 73 63 6d 22 29 0a  y_records.scm").
0390: 0a 28 64 65 66 69 6e 65 20 28 6f 70 65 6e 2d 64  .(define (open-d
03a0: 62 29 20 3b 3b 20 20 28 63 6f 6e 63 20 2a 74 6f  b) ;;  (conc *to
03b0: 70 70 61 74 68 2a 20 22 2f 6d 65 67 61 74 65 73  ppath* "/megates
03c0: 74 2e 64 62 22 29 20 28 63 61 72 20 2a 63 6f 6e  t.db") (car *con
03d0: 66 69 67 69 6e 66 6f 2a 29 29 29 0a 20 20 28 6c  figinfo*))).  (l
03e0: 65 74 2a 20 28 28 64 62 70 61 74 68 20 20 20 20  et* ((dbpath    
03f0: 28 63 6f 6e 63 20 2a 74 6f 70 70 61 74 68 2a 20  (conc *toppath* 
0400: 22 2f 6d 65 67 61 74 65 73 74 2e 64 62 22 29 29  "/megatest.db"))
0410: 20 3b 3b 20 66 6e 61 6d 65 29 0a 09 20 28 63 6f   ;; fname).. (co
0420: 6e 66 69 67 64 61 74 20 28 63 61 72 20 2a 63 6f  nfigdat (car *co
0430: 6e 66 69 67 69 6e 66 6f 2a 29 29 0a 09 20 28 64  nfiginfo*)).. (d
0440: 62 65 78 69 73 74 73 20 20 28 66 69 6c 65 2d 65  bexists  (file-e
0450: 78 69 73 74 73 3f 20 64 62 70 61 74 68 29 29 0a  xists? dbpath)).
0460: 09 20 28 64 62 20 20 20 20 20 20 20 20 28 73 71  . (db        (sq
0470: 6c 69 74 65 33 3a 6f 70 65 6e 2d 64 61 74 61 62  lite3:open-datab
0480: 61 73 65 20 64 62 70 61 74 68 29 29 20 3b 3b 20  ase dbpath)) ;; 
0490: 28 6e 65 76 65 72 2d 67 69 76 65 2d 75 70 2d 6f  (never-give-up-o
04a0: 70 65 6e 2d 64 62 20 64 62 70 61 74 68 29 29 0a  pen-db dbpath)).
04b0: 09 20 28 68 61 6e 64 6c 65 72 20 20 20 28 6d 61  . (handler   (ma
04c0: 6b 65 2d 62 75 73 79 2d 74 69 6d 65 6f 75 74 20  ke-busy-timeout 
04d0: 33 36 30 30 30 29 29 29 0a 20 20 20 20 28 73 71  36000))).    (sq
04e0: 6c 69 74 65 33 3a 73 65 74 2d 62 75 73 79 2d 68  lite3:set-busy-h
04f0: 61 6e 64 6c 65 72 21 20 64 62 20 68 61 6e 64 6c  andler! db handl
0500: 65 72 29 0a 20 20 20 20 28 69 66 20 28 6e 6f 74  er).    (if (not
0510: 20 64 62 65 78 69 73 74 73 29 0a 09 28 6c 65 74   dbexists)..(let
0520: 2a 20 28 28 6b 65 79 73 20 20 20 20 20 28 63 6f  * ((keys     (co
0530: 6e 66 69 67 2d 67 65 74 2d 66 69 65 6c 64 73 20  nfig-get-fields 
0540: 63 6f 6e 66 69 67 64 61 74 29 29 0a 09 20 20 20  configdat))..   
0550: 20 20 20 20 28 68 61 76 65 6b 65 79 73 20 28 3e      (havekeys (>
0560: 20 28 6c 65 6e 67 74 68 20 6b 65 79 73 29 20 30   (length keys) 0
0570: 29 29 0a 09 20 20 20 20 20 20 20 28 6b 65 79 73  ))..       (keys
0580: 74 72 20 20 20 28 6b 65 79 73 2d 3e 6b 65 79 73  tr   (keys->keys
0590: 74 72 20 6b 65 79 73 29 29 0a 09 20 20 20 20 20  tr keys))..     
05a0: 20 20 28 66 69 65 6c 64 73 74 72 20 28 6b 65 79    (fieldstr (key
05b0: 73 2d 3e 6b 65 79 2f 66 69 65 6c 64 20 6b 65 79  s->key/field key
05c0: 73 29 29 29 0a 09 20 20 28 66 6f 72 2d 65 61 63  s)))..  (for-eac
05d0: 68 20 28 6c 61 6d 62 64 61 20 28 6b 65 79 29 0a  h (lambda (key).
05e0: 09 09 20 20 20 20 20 20 28 6c 65 74 20 28 28 6b  ..      (let ((k
05f0: 65 79 6e 20 28 76 65 63 74 6f 72 2d 72 65 66 20  eyn (vector-ref 
0600: 6b 65 79 20 30 29 29 29 0a 09 09 09 28 69 66 20  key 0)))....(if 
0610: 28 6d 65 6d 62 65 72 20 28 73 74 72 69 6e 67 2d  (member (string-
0620: 64 6f 77 6e 63 61 73 65 20 6b 65 79 6e 29 0a 09  downcase keyn)..
0630: 09 09 09 20 20 20 20 20 28 6c 69 73 74 20 22 72  ...     (list "r
0640: 75 6e 6e 61 6d 65 22 20 22 73 74 61 74 65 22 20  unname" "state" 
0650: 22 73 74 61 74 75 73 22 20 22 6f 77 6e 65 72 22  "status" "owner"
0660: 20 22 65 76 65 6e 74 5f 74 69 6d 65 22 20 22 63   "event_time" "c
0670: 6f 6d 6d 65 6e 74 22 20 22 66 61 69 6c 5f 63 6f  omment" "fail_co
0680: 75 6e 74 22 0a 09 09 09 09 09 20 20 20 22 70 61  unt"......   "pa
0690: 73 73 5f 63 6f 75 6e 74 22 29 29 0a 09 09 09 20  ss_count")).... 
06a0: 20 20 20 28 62 65 67 69 6e 0a 09 09 09 20 20 20     (begin....   
06b0: 20 20 20 28 70 72 69 6e 74 20 22 45 52 52 4f 52     (print "ERROR
06c0: 3a 20 79 6f 75 72 20 6b 65 79 20 63 61 6e 6e 6f  : your key canno
06d0: 74 20 62 65 20 6e 61 6d 65 64 20 22 20 6b 65 79  t be named " key
06e0: 6e 20 22 20 61 73 20 74 68 69 73 20 63 6f 6e 66  n " as this conf
06f0: 6c 69 63 74 73 20 77 69 74 68 20 74 68 65 20 73  licts with the s
0700: 61 6d 65 20 6e 61 6d 65 64 20 66 69 65 6c 64 20  ame named field 
0710: 69 6e 20 74 68 65 20 72 75 6e 73 20 74 61 62 6c  in the runs tabl
0720: 65 22 29 0a 09 09 09 20 20 20 20 20 20 28 73 79  e")....      (sy
0730: 73 74 65 6d 20 28 63 6f 6e 63 20 22 72 6d 20 2d  stem (conc "rm -
0740: 66 20 22 20 64 62 70 61 74 68 29 29 0a 09 09 09  f " dbpath))....
0750: 20 20 20 20 20 20 28 65 78 69 74 20 31 29 29 29        (exit 1)))
0760: 29 29 0a 09 09 20 20 20 20 6b 65 79 73 29 0a 09  ))...    keys)..
0770: 20 20 3b 3b 20 28 73 71 6c 69 74 65 33 3a 65 78    ;; (sqlite3:ex
0780: 65 63 75 74 65 20 64 62 20 22 50 52 41 47 4d 41  ecute db "PRAGMA
0790: 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 4f   synchronous = O
07a0: 46 46 3b 22 29 0a 09 20 20 28 73 71 6c 69 74 65  FF;")..  (sqlite
07b0: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 43 52  3:execute db "CR
07c0: 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f  EATE TABLE IF NO
07d0: 54 20 45 58 49 53 54 53 20 6b 65 79 73 20 28 69  T EXISTS keys (i
07e0: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  d INTEGER PRIMAR
07f0: 59 20 4b 45 59 2c 20 66 69 65 6c 64 6e 61 6d 65  Y KEY, fieldname
0800: 20 54 45 58 54 2c 20 66 69 65 6c 64 74 79 70 65   TEXT, fieldtype
0810: 20 54 45 58 54 2c 20 43 4f 4e 53 54 52 41 49 4e   TEXT, CONSTRAIN
0820: 54 20 6b 65 79 63 6f 6e 73 74 72 61 69 6e 74 20  T keyconstraint 
0830: 55 4e 49 51 55 45 20 28 66 69 65 6c 64 6e 61 6d  UNIQUE (fieldnam
0840: 65 29 29 3b 22 29 0a 09 20 20 28 66 6f 72 2d 65  e));")..  (for-e
0850: 61 63 68 20 28 6c 61 6d 62 64 61 20 28 6b 65 79  ach (lambda (key
0860: 29 0a 09 09 20 20 20 20 20 20 28 73 71 6c 69 74  )...      (sqlit
0870: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 49  e3:execute db "I
0880: 4e 53 45 52 54 20 49 4e 54 4f 20 6b 65 79 73 20  NSERT INTO keys 
0890: 28 66 69 65 6c 64 6e 61 6d 65 2c 66 69 65 6c 64  (fieldname,field
08a0: 74 79 70 65 29 20 56 41 4c 55 45 53 20 28 3f 2c  type) VALUES (?,
08b0: 3f 29 3b 22 20 28 6b 65 79 3a 67 65 74 2d 66 69  ?);" (key:get-fi
08c0: 65 6c 64 6e 61 6d 65 20 6b 65 79 29 28 6b 65 79  eldname key)(key
08d0: 3a 67 65 74 2d 66 69 65 6c 64 74 79 70 65 20 6b  :get-fieldtype k
08e0: 65 79 29 29 29 0a 09 09 20 20 20 20 6b 65 79 73  ey)))...    keys
08f0: 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65 78  )..  (sqlite3:ex
0900: 65 63 75 74 65 20 64 62 20 28 63 6f 6e 63 20 0a  ecute db (conc .
0910: 09 09 09 20 20 20 20 22 43 52 45 41 54 45 20 54  ...    "CREATE T
0920: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
0930: 54 53 20 72 75 6e 73 20 28 69 64 20 49 4e 54 45  TS runs (id INTE
0940: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
0950: 20 22 20 0a 09 09 09 20 20 20 20 66 69 65 6c 64   " ....    field
0960: 73 74 72 20 28 69 66 20 68 61 76 65 6b 65 79 73  str (if havekeys
0970: 20 22 2c 22 20 22 22 29 0a 09 09 09 20 20 20 20   "," "")....    
0980: 22 72 75 6e 6e 61 6d 65 20 54 45 58 54 2c 22 0a  "runname TEXT,".
0990: 09 09 09 20 20 20 20 22 73 74 61 74 65 20 54 45  ...    "state TE
09a0: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 22 0a  XT DEFAULT '',".
09b0: 09 09 09 20 20 20 20 22 73 74 61 74 75 73 20 54  ...    "status T
09c0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 22  EXT DEFAULT '',"
09d0: 0a 09 09 09 20 20 20 20 22 6f 77 6e 65 72 20 54  ....    "owner T
09e0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 22  EXT DEFAULT '',"
09f0: 0a 09 09 09 20 20 20 20 22 65 76 65 6e 74 5f 74  ....    "event_t
0a00: 69 6d 65 20 54 49 4d 45 53 54 41 4d 50 2c 22 0a  ime TIMESTAMP,".
0a10: 09 09 09 20 20 20 20 22 63 6f 6d 6d 65 6e 74 20  ...    "comment 
0a20: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c  TEXT DEFAULT '',
0a30: 22 0a 09 09 09 20 20 20 20 22 66 61 69 6c 5f 63  "....    "fail_c
0a40: 6f 75 6e 74 20 49 4e 54 45 47 45 52 20 44 45 46  ount INTEGER DEF
0a50: 41 55 4c 54 20 30 2c 22 0a 09 09 09 20 20 20 20  AULT 0,"....    
0a60: 22 70 61 73 73 5f 63 6f 75 6e 74 20 49 4e 54 45  "pass_count INTE
0a70: 47 45 52 20 44 45 46 41 55 4c 54 20 30 2c 22 0a  GER DEFAULT 0,".
0a80: 09 09 09 20 20 20 20 22 43 4f 4e 53 54 52 41 49  ...    "CONSTRAI
0a90: 4e 54 20 72 75 6e 73 63 6f 6e 73 74 72 61 69 6e  NT runsconstrain
0aa0: 74 20 55 4e 49 51 55 45 20 28 72 75 6e 6e 61 6d  t UNIQUE (runnam
0ab0: 65 22 20 28 69 66 20 68 61 76 65 6b 65 79 73 20  e" (if havekeys 
0ac0: 22 2c 22 20 22 22 29 20 6b 65 79 73 74 72 20 22  "," "") keystr "
0ad0: 29 29 3b 22 29 29 0a 09 20 20 28 73 71 6c 69 74  ));"))..  (sqlit
0ae0: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 28 63  e3:execute db (c
0af0: 6f 6e 63 20 22 43 52 45 41 54 45 20 49 4e 44 45  onc "CREATE INDE
0b00: 58 20 72 75 6e 73 5f 69 6e 64 65 78 20 4f 4e 20  X runs_index ON 
0b10: 72 75 6e 73 20 28 72 75 6e 6e 61 6d 65 22 20 28  runs (runname" (
0b20: 69 66 20 68 61 76 65 6b 65 79 73 20 22 2c 22 20  if havekeys "," 
0b30: 22 22 29 20 6b 65 79 73 74 72 20 22 29 3b 22 29  "") keystr ");")
0b40: 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65 78  )..  (sqlite3:ex
0b50: 65 63 75 74 65 20 64 62 20 0a 20 20 20 20 20 20  ecute db .      
0b60: 20 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41             "CREA
0b70: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  TE TABLE IF NOT 
0b80: 45 58 49 53 54 53 20 74 65 73 74 73 20 0a 20 20  EXISTS tests .  
0b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ba0: 20 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52    (id INTEGER PR
0bb0: 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20  IMARY KEY,.     
0bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bd0: 72 75 6e 5f 69 64 20 20 20 20 20 49 4e 54 45 47  run_id     INTEG
0be0: 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ER,.            
0bf0: 20 20 20 20 20 20 20 20 20 74 65 73 74 6e 61 6d           testnam
0c00: 65 20 20 20 54 45 58 54 2c 0a 20 20 20 20 20 20  e   TEXT,.      
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68                 h
0c20: 6f 73 74 20 20 20 20 20 20 20 54 45 58 54 20 44  ost       TEXT D
0c30: 45 46 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20 20  EFAULT 'n/a',.  
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c50: 20 20 20 63 70 75 6c 6f 61 64 20 20 20 20 52 45     cpuload    RE
0c60: 41 4c 20 44 45 46 41 55 4c 54 20 2d 31 2c 0a 20  AL DEFAULT -1,. 
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c80: 20 20 20 20 64 69 73 6b 66 72 65 65 20 20 20 49      diskfree   I
0c90: 4e 54 45 47 45 52 20 44 45 46 41 55 4c 54 20 2d  NTEGER DEFAULT -
0ca0: 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
0cb0: 20 20 20 20 20 20 20 20 75 6e 61 6d 65 20 20 20          uname   
0cc0: 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20     TEXT DEFAULT 
0cd0: 27 6e 2f 61 27 2c 20 0a 20 20 20 20 20 20 20 20  'n/a', .        
0ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 75 6e               run
0cf0: 64 69 72 20 20 20 20 20 54 45 58 54 20 44 45 46  dir     TEXT DEF
0d00: 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20 20 20 20  AULT 'n/a',.    
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d20: 20 73 68 6f 72 74 64 69 72 20 20 20 54 45 58 54   shortdir   TEXT
0d30: 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20   DEFAULT '',.   
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d50: 20 20 69 74 65 6d 5f 70 61 74 68 20 20 54 45 58    item_path  TEX
0d60: 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20  T DEFAULT '',.  
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d80: 20 20 20 73 74 61 74 65 20 20 20 20 20 20 54 45     state      TE
0d90: 58 54 20 44 45 46 41 55 4c 54 20 27 4e 4f 54 5f  XT DEFAULT 'NOT_
0da0: 53 54 41 52 54 45 44 27 2c 0a 20 20 20 20 20 20  STARTED',.      
0db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
0dc0: 74 61 74 75 73 20 20 20 20 20 54 45 58 54 20 44  tatus     TEXT D
0dd0: 45 46 41 55 4c 54 20 27 46 41 49 4c 27 2c 0a 20  EFAULT 'FAIL',. 
0de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0df0: 20 20 20 20 61 74 74 65 6d 70 74 6e 75 6d 20 49      attemptnum I
0e00: 4e 54 45 47 45 52 20 44 45 46 41 55 4c 54 20 30  NTEGER DEFAULT 0
0e10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
0e20: 20 20 20 20 20 20 20 66 69 6e 61 6c 5f 6c 6f 67         final_log
0e30: 66 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27  f TEXT DEFAULT '
0e40: 6c 6f 67 73 2f 66 69 6e 61 6c 2e 6c 6f 67 27 2c  logs/final.log',
0e50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0e60: 20 20 20 20 20 20 6c 6f 67 64 61 74 20 20 20 20        logdat    
0e70: 20 42 4c 4f 42 2c 20 0a 20 20 20 20 20 20 20 20   BLOB, .        
0e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 75 6e               run
0e90: 5f 64 75 72 61 74 69 6f 6e 20 49 4e 54 45 47 45  _duration INTEGE
0ea0: 52 20 44 45 46 41 55 4c 54 20 30 2c 0a 20 20 20  R DEFAULT 0,.   
0eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ec0: 20 20 63 6f 6d 6d 65 6e 74 20 20 20 20 54 45 58    comment    TEX
0ed0: 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20  T DEFAULT '',.  
0ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ef0: 20 20 20 65 76 65 6e 74 5f 74 69 6d 65 20 54 49     event_time TI
0f00: 4d 45 53 54 41 4d 50 2c 0a 20 20 20 20 20 20 20  MESTAMP,.       
0f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 61                fa
0f20: 69 6c 5f 63 6f 75 6e 74 20 49 4e 54 45 47 45 52  il_count INTEGER
0f30: 20 44 45 46 41 55 4c 54 20 30 2c 0a 20 20 20 20   DEFAULT 0,.    
0f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f50: 20 70 61 73 73 5f 63 6f 75 6e 74 20 49 4e 54 45   pass_count INTE
0f60: 47 45 52 20 44 45 46 41 55 4c 54 20 30 2c 0a 20  GER DEFAULT 0,. 
0f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f80: 20 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 74      CONSTRAINT t
0f90: 65 73 74 73 63 6f 6e 73 74 72 61 69 6e 74 20 55  estsconstraint U
0fa0: 4e 49 51 55 45 20 28 72 75 6e 5f 69 64 2c 20 74  NIQUE (run_id, t
0fb0: 65 73 74 6e 61 6d 65 2c 20 69 74 65 6d 5f 70 61  estname, item_pa
0fc0: 74 68 29 0a 20 20 20 20 20 20 20 20 20 20 29 3b  th).          );
0fd0: 22 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65  ")..  (sqlite3:e
0fe0: 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 54  xecute db "CREAT
0ff0: 45 20 49 4e 44 45 58 20 74 65 73 74 73 5f 69 6e  E INDEX tests_in
1000: 64 65 78 20 4f 4e 20 74 65 73 74 73 20 28 72 75  dex ON tests (ru
1010: 6e 5f 69 64 2c 20 74 65 73 74 6e 61 6d 65 29 3b  n_id, testname);
1020: 22 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65  ")..  (sqlite3:e
1030: 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 54  xecute db "CREAT
1040: 45 20 56 49 45 57 20 72 75 6e 73 5f 74 65 73 74  E VIEW runs_test
1050: 73 20 41 53 20 53 45 4c 45 43 54 20 2a 20 46 52  s AS SELECT * FR
1060: 4f 4d 20 72 75 6e 73 20 49 4e 4e 45 52 20 4a 4f  OM runs INNER JO
1070: 49 4e 20 74 65 73 74 73 20 4f 4e 20 72 75 6e 73  IN tests ON runs
1080: 2e 69 64 3d 74 65 73 74 73 2e 72 75 6e 5f 69 64  .id=tests.run_id
1090: 3b 22 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a  ;")..  (sqlite3:
10a0: 65 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41  execute db "CREA
10b0: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  TE TABLE IF NOT 
10c0: 45 58 49 53 54 53 20 74 65 73 74 5f 73 74 65 70  EXISTS test_step
10d0: 73 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  s .             
10e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f0: 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49   (id INTEGER PRI
1100: 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 20  MARY KEY,.      
1110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1120: 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 69 64           test_id
1130: 20 49 4e 54 45 47 45 52 2c 20 0a 20 20 20 20 20   INTEGER, .     
1140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1150: 20 20 20 20 20 20 20 20 20 20 73 74 65 70 6e 61            stepna
1160: 6d 65 20 54 45 58 54 2c 20 0a 20 20 20 20 20 20  me TEXT, .      
1170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1180: 20 20 20 20 20 20 20 20 20 73 74 61 74 65 20 54           state T
1190: 45 58 54 20 44 45 46 41 55 4c 54 20 27 4e 4f 54  EXT DEFAULT 'NOT
11a0: 5f 53 54 41 52 54 45 44 27 2c 20 0a 20 20 20 20  _STARTED', .    
11b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c0: 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 75             statu
11d0: 73 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27  s TEXT DEFAULT '
11e0: 6e 2f 61 27 2c 0a 20 20 20 20 20 20 20 20 20 20  n/a',.          
11f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1200: 20 20 20 20 20 65 76 65 6e 74 5f 74 69 6d 65 20       event_time 
1210: 54 49 4d 45 53 54 41 4d 50 2c 0a 20 20 20 20 20  TIMESTAMP,.     
1220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1230: 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 65 6e            commen
1240: 74 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27  t TEXT DEFAULT '
1250: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ',.             
1260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1270: 20 20 6c 6f 67 66 69 6c 65 20 54 45 58 54 2c 0a    logfile TEXT,.
1280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43                 C
12a0: 4f 4e 53 54 52 41 49 4e 54 20 74 65 73 74 5f 73  ONSTRAINT test_s
12b0: 74 65 70 73 5f 63 6f 6e 73 74 72 61 69 6e 74 20  teps_constraint 
12c0: 55 4e 49 51 55 45 20 28 74 65 73 74 5f 69 64 2c  UNIQUE (test_id,
12d0: 73 74 65 70 6e 61 6d 65 2c 73 74 61 74 65 29 29  stepname,state))
12e0: 3b 22 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a  ;")..  (sqlite3:
12f0: 65 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41  execute db "CREA
1300: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  TE TABLE IF NOT 
1310: 45 58 49 53 54 53 20 65 78 74 72 61 64 61 74 20  EXISTS extradat 
1320: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d  (id INTEGER PRIM
1330: 41 52 59 20 4b 45 59 2c 20 72 75 6e 5f 69 64 20  ARY KEY, run_id 
1340: 49 4e 54 45 47 45 52 2c 20 6b 65 79 20 54 45 58  INTEGER, key TEX
1350: 54 2c 20 76 61 6c 20 54 45 58 54 29 3b 22 29 0a  T, val TEXT);").
1360: 09 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63  .  (sqlite3:exec
1370: 75 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54  ute db "CREATE T
1380: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
1390: 54 53 20 6d 65 74 61 64 61 74 20 28 69 64 20 49  TS metadat (id I
13a0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
13b0: 45 59 2c 20 76 61 72 20 54 45 58 54 2c 20 76 61  EY, var TEXT, va
13c0: 6c 20 54 45 58 54 2c 0a 20 20 20 20 20 20 20 20  l TEXT,.        
13d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13e0: 20 20 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52            CONSTR
13f0: 41 49 4e 54 20 6d 65 74 61 64 61 74 5f 63 6f 6e  AINT metadat_con
1400: 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28  straint UNIQUE (
1410: 76 61 72 29 29 3b 22 29 0a 09 20 20 28 73 71 6c  var));")..  (sql
1420: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
1430: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46  "CREATE TABLE IF
1440: 20 4e 4f 54 20 45 58 49 53 54 53 20 61 63 63 65   NOT EXISTS acce
1450: 73 73 5f 6c 6f 67 20 28 69 64 20 49 4e 54 45 47  ss_log (id INTEG
1460: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  ER PRIMARY KEY, 
1470: 75 73 65 72 20 54 45 58 54 2c 20 61 63 63 65 73  user TEXT, acces
1480: 73 65 64 20 54 49 4d 45 53 54 41 4d 50 2c 20 61  sed TIMESTAMP, a
1490: 72 67 73 20 54 45 58 54 29 3b 22 29 0a 09 20 20  rgs TEXT);")..  
14a0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
14b0: 20 64 62 20 22 43 52 45 41 54 45 20 54 41 42 4c   db "CREATE TABL
14c0: 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20  E IF NOT EXISTS 
14d0: 74 65 73 74 5f 6d 65 74 61 20 28 69 64 20 49 4e  test_meta (id IN
14e0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
14f0: 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y,.             
1500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1510: 20 20 20 20 20 20 20 20 74 65 73 74 6e 61 6d 65          testname
1520: 20 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54      TEXT DEFAULT
1530: 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20   '',.           
1540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1550: 20 20 20 20 20 20 20 20 20 20 61 75 74 68 6f 72            author
1560: 20 20 20 20 20 20 54 45 58 54 20 44 45 46 41 55        TEXT DEFAU
1570: 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20  LT '',.         
1580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1590: 20 20 20 20 20 20 20 20 20 20 20 20 6f 77 6e 65              owne
15a0: 72 20 20 20 20 20 20 20 54 45 58 54 20 44 45 46  r       TEXT DEF
15b0: 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20  AULT '',.       
15c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65                de
15e0: 73 63 72 69 70 74 69 6f 6e 20 54 45 58 54 20 44  scription TEXT D
15f0: 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20  EFAULT '',.     
1600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1620: 72 65 76 69 65 77 65 64 20 20 20 20 54 49 4d 45  reviewed    TIME
1630: 53 54 41 4d 50 2c 0a 20 20 20 20 20 20 20 20 20  STAMP,.         
1640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1650: 20 20 20 20 20 20 20 20 20 20 20 20 69 74 65 72              iter
1660: 61 74 65 64 20 20 20 20 54 45 58 54 20 44 45 46  ated    TEXT DEF
1670: 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20  AULT '',.       
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 76                av
16a0: 67 5f 72 75 6e 74 69 6d 65 20 52 45 41 4c 2c 0a  g_runtime REAL,.
16b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d0: 20 20 20 20 20 61 76 67 5f 64 69 73 6b 20 20 20       avg_disk   
16e0: 20 52 45 41 4c 2c 0a 20 20 20 20 20 20 20 20 20   REAL,.         
16f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1700: 20 20 20 20 20 20 20 20 20 20 20 20 74 61 67 73              tags
1710: 20 20 20 20 20 20 20 20 54 45 58 54 20 44 45 46          TEXT DEF
1720: 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20  AULT '',.       
1730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1740: 20 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52 41           CONSTRA
1750: 49 4e 54 20 74 65 73 74 5f 6d 65 74 61 5f 63 6f  INT test_meta_co
1760: 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20  nstraint UNIQUE 
1770: 28 74 65 73 74 6e 61 6d 65 29 29 3b 22 29 0a 09  (testname));")..
1780: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
1790: 74 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41  te db "CREATE TA
17a0: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54  BLE IF NOT EXIST
17b0: 53 20 74 65 73 74 5f 64 61 74 61 20 28 69 64 20  S test_data (id 
17c0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
17d0: 4b 45 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20  KEY,.           
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f0: 20 20 20 20 20 74 65 73 74 5f 69 64 20 49 4e 54       test_id INT
1800: 45 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20  EGER,.          
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1820: 20 20 20 20 20 20 63 61 74 65 67 6f 72 79 20 54        category T
1830: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a  EXT DEFAULT '',.
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1860: 76 61 72 69 61 62 6c 65 20 54 45 58 54 2c 0a 09  variable TEXT,..
1870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1880: 20 20 20 20 20 20 20 20 76 61 6c 75 65 20 52 45          value RE
1890: 41 4c 2c 0a 09 20 20 20 20 20 20 20 20 20 20 20  AL,..           
18a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70               exp
18b0: 65 63 74 65 64 20 52 45 41 4c 2c 0a 09 20 20 20  ected REAL,..   
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d0: 20 20 20 20 20 74 6f 6c 20 52 45 41 4c 2c 0a 20       tol REAL,. 
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75                 u
1900: 6e 69 74 73 20 54 45 58 54 2c 0a 20 20 20 20 20  nits TEXT,.     
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 65             comme
1930: 6e 74 20 54 45 58 54 20 44 45 46 41 55 4c 54 20  nt TEXT DEFAULT 
1940: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '',.            
1950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1960: 20 20 20 20 73 74 61 74 75 73 20 54 45 58 54 20      status TEXT 
1970: 44 45 46 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20  DEFAULT 'n/a',. 
1980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
19a0: 79 70 65 20 54 45 58 54 20 44 45 46 41 55 4c 54  ype TEXT DEFAULT
19b0: 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20   '',.           
19c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19d0: 20 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 65     CONSTRAINT te
19e0: 73 74 5f 64 61 74 61 5f 63 6f 6e 73 74 72 61 69  st_data_constrai
19f0: 6e 74 20 55 4e 49 51 55 45 20 28 74 65 73 74 5f  nt UNIQUE (test_
1a00: 69 64 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 69  id,category,vari
1a10: 61 62 6c 65 29 29 3b 22 29 0a 09 20 20 28 73 71  able));")..  (sq
1a20: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62  lite3:execute db
1a30: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49   "CREATE TABLE I
1a40: 46 20 4e 4f 54 20 45 58 49 53 54 53 20 74 61 73  F NOT EXISTS tas
1a50: 6b 5f 71 75 65 75 65 20 28 69 64 20 49 4e 54 45  k_queue (id INTE
1a60: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
1a70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 20 61 63 74 69 6f 6e 20 54 45 58 54 20 44 45 46   action TEXT DEF
1aa0: 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20  AULT '',.       
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac0: 20 20 20 20 20 20 20 20 20 6f 77 6e 65 72 20 54           owner T
1ad0: 45 58 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  EXT,.           
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af0: 20 20 20 20 20 73 74 61 74 65 20 54 45 58 54 20       state TEXT 
1b00: 44 45 46 41 55 4c 54 20 27 6e 65 77 27 2c 0a 20  DEFAULT 'new',. 
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1b30: 61 72 67 65 74 20 54 45 58 54 20 44 45 46 41 55  arget TEXT DEFAU
1b40: 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20  LT '',.         
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b60: 20 20 20 20 20 20 20 6e 61 6d 65 20 54 45 58 54         name TEXT
1b70: 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20   DEFAULT '',.   
1b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
1ba0: 74 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27  t TEXT DEFAULT '
1bb0: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ',.             
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd0: 20 20 20 69 74 65 6d 20 54 45 58 54 20 44 45 46     item TEXT DEF
1be0: 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20  AULT '',.       
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c00: 20 20 20 20 20 20 20 20 20 63 72 65 61 74 69 6f           creatio
1c10: 6e 5f 74 69 6d 65 20 54 49 4d 45 53 54 41 4d 50  n_time TIMESTAMP
1c20: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 20 20 65 78 65 63 75 74 69 6f 6e 5f 74 69 6d 65    execution_time
1c50: 20 54 49 4d 45 53 54 41 4d 50 3b 22 29 0a 09 20   TIMESTAMP;").. 
1c60: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
1c70: 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41 42  e db "CREATE TAB
1c80: 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53  LE IF NOT EXISTS
1c90: 20 6d 6f 6e 69 74 6f 72 73 20 28 69 64 20 49 4e   monitors (id IN
1ca0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
1cb0: 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y,.             
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd0: 20 20 20 70 69 64 20 49 4e 54 45 47 45 52 2c 0a     pid INTEGER,.
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d00: 73 74 61 72 74 5f 74 69 6d 65 20 54 49 4d 45 53  start_time TIMES
1d10: 54 41 4d 50 2c 0a 20 20 20 20 20 20 20 20 20 20  TAMP,.          
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d30: 20 20 20 20 20 20 6c 61 73 74 5f 75 70 64 61 74        last_updat
1d40: 65 20 54 49 4d 45 53 54 41 4d 50 2c 0a 20 20 20  e TIMESTAMP,.   
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 68 6f 73               hos
1d70: 74 6e 61 6d 65 20 54 45 58 54 2c 0a 20 20 20 20  tname TEXT,.    
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d90: 20 20 20 20 20 20 20 20 20 20 20 20 75 73 65 72              user
1da0: 6e 61 6d 65 20 54 45 58 54 2c 0a 20 20 20 20 20  name TEXT,.     
1db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc0: 20 20 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52            CONSTR
1dd0: 41 49 4e 54 20 6d 6f 6e 69 74 6f 72 73 5f 63 6f  AINT monitors_co
1de0: 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20  nstraint UNIQUE 
1df0: 28 70 69 64 2c 68 6f 73 74 6e 61 6d 65 29 29 3b  (pid,hostname));
1e00: 22 29 0a 09 20 20 3b 3b 20 4d 75 73 74 20 64 6f  ")..  ;; Must do
1e10: 20 74 68 69 73 20 2a 61 66 74 65 72 2a 20 72 75   this *after* ru
1e20: 6e 6e 69 6e 67 20 70 61 74 63 68 20 64 62 20 21  nning patch db !
1e30: 21 20 4e 6f 20 6d 6f 72 65 2e 20 0a 09 20 20 28  ! No more. ..  (
1e40: 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d  db:set-var db "M
1e50: 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22  EGATEST_VERSION"
1e60: 20 6d 65 67 61 74 65 73 74 2d 76 65 72 73 69 6f   megatest-versio
1e70: 6e 29 0a 09 20 20 29 29 0a 20 20 20 20 64 62 29  n)..  )).    db)
1e80: 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  )..;;===========
1e90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1ea0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1eb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1ec0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 54  ===========.;; T
1ed0: 4f 44 4f 3a 0a 3b 3b 20 20 20 70 75 74 20 64 65  ODO:.;;   put de
1ee0: 6c 74 61 73 20 69 6e 74 6f 20 61 6e 20 61 73 73  ltas into an ass
1ef0: 6f 63 20 6c 69 73 74 20 77 69 74 68 20 76 65 72  oc list with ver
1f00: 73 69 6f 6e 20 6e 75 6d 62 65 72 73 0a 3b 3b 20  sion numbers.;; 
1f10: 20 20 61 70 70 6c 79 20 61 6c 6c 20 66 72 6f 6d    apply all from
1f20: 20 6c 61 73 74 20 74 6f 20 63 75 72 72 65 6e 74   last to current
1f30: 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  .;;=============
1f40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1f50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1f60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1f70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 28 64 65 66 69 6e  =========.(defin
1f80: 65 20 28 70 61 74 63 68 2d 64 62 20 64 62 29 0a  e (patch-db db).
1f90: 20 20 28 68 61 6e 64 6c 65 2d 65 78 63 65 70 74    (handle-except
1fa0: 69 6f 6e 73 0a 20 20 20 65 78 6e 0a 20 20 20 28  ions.   exn.   (
1fb0: 62 65 67 69 6e 0a 20 20 20 20 20 28 70 72 69 6e  begin.     (prin
1fc0: 74 20 22 45 78 63 65 70 74 69 6f 6e 3a 20 22 20  t "Exception: " 
1fd0: 65 78 6e 29 0a 20 20 20 20 20 28 70 72 69 6e 74  exn).     (print
1fe0: 20 22 45 52 52 4f 52 3a 20 50 6f 73 73 69 62 6c   "ERROR: Possibl
1ff0: 65 20 6f 75 74 20 6f 66 20 64 61 74 65 20 73 63  e out of date sc
2000: 68 65 6d 61 2c 20 61 74 74 65 6d 70 74 69 6e 67  hema, attempting
2010: 20 74 6f 20 61 64 64 20 74 61 62 6c 65 20 6d 65   to add table me
2020: 74 61 64 61 74 61 2e 2e 2e 22 29 0a 20 20 20 20  tadata...").    
2030: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
2040: 65 20 64 62 20 22 43 52 45 41 54 45 20 54 41 42  e db "CREATE TAB
2050: 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53  LE IF NOT EXISTS
2060: 20 6d 65 74 61 64 61 74 20 28 69 64 20 49 4e 54   metadat (id INT
2070: 45 47 45 52 2c 20 76 61 72 20 54 45 58 54 2c 20  EGER, var TEXT, 
2080: 76 61 6c 20 54 45 58 54 2c 0a 20 20 20 20 20 20  val TEXT,.      
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a0: 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e 53 54             CONST
20b0: 52 41 49 4e 54 20 6d 65 74 61 64 61 74 5f 63 6f  RAINT metadat_co
20c0: 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20  nstraint UNIQUE 
20d0: 28 76 61 72 29 29 3b 22 29 0a 20 20 20 20 20 28  (var));").     (
20e0: 69 66 20 28 6e 6f 74 20 28 64 62 3a 67 65 74 2d  if (not (db:get-
20f0: 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 53 54  var db "MEGATEST
2100: 5f 56 45 52 53 49 4f 4e 22 29 29 0a 09 20 28 64  _VERSION")).. (d
2110: 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45  b:set-var db "ME
2120: 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20  GATEST_VERSION" 
2130: 31 2e 31 37 29 29 29 0a 20 20 20 28 6c 65 74 20  1.17))).   (let 
2140: 28 28 6d 76 65 72 20 28 64 62 3a 67 65 74 2d 76  ((mver (db:get-v
2150: 61 72 20 64 62 20 22 4d 45 47 41 54 45 53 54 5f  ar db "MEGATEST_
2160: 56 45 52 53 49 4f 4e 22 29 29 0a 09 20 28 74 65  VERSION")).. (te
2170: 73 74 2d 6d 65 74 61 2d 64 65 66 20 22 43 52 45  st-meta-def "CRE
2180: 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54  ATE TABLE IF NOT
2190: 20 45 58 49 53 54 53 20 74 65 73 74 5f 6d 65 74   EXISTS test_met
21a0: 61 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52  a (id INTEGER PR
21b0: 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20  IMARY KEY,.     
21c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 74 65 73 74 6e 61 6d 65 20 20 20 20 54 45 58 54  testname    TEXT
21f0: 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20   DEFAULT '',.   
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2220: 20 20 61 75 74 68 6f 72 20 20 20 20 20 20 54 45    author      TE
2230: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20  XT DEFAULT '',. 
2240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2260: 20 20 20 20 6f 77 6e 65 72 20 20 20 20 20 20 20      owner       
2270: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c  TEXT DEFAULT '',
2280: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22a0: 20 20 20 20 20 20 64 65 73 63 72 69 70 74 69 6f        descriptio
22b0: 6e 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27  n TEXT DEFAULT '
22c0: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ',.             
22d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e0: 20 20 20 20 20 20 20 20 72 65 76 69 65 77 65 64          reviewed
22f0: 20 20 20 20 54 49 4d 45 53 54 41 4d 50 2c 0a 20      TIMESTAMP,. 
2300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2320: 20 20 20 20 69 74 65 72 61 74 65 64 20 20 20 20      iterated    
2330: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c  TEXT DEFAULT '',
2340: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2360: 20 20 20 20 20 20 61 76 67 5f 72 75 6e 74 69 6d        avg_runtim
2370: 65 20 52 45 41 4c 2c 0a 20 20 20 20 20 20 20 20  e REAL,.        
2380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 76 67               avg
23a0: 5f 64 69 73 6b 20 20 20 20 52 45 41 4c 2c 0a 20  _disk    REAL,. 
23b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d0: 20 20 20 20 74 61 67 73 20 20 20 20 20 20 20 20      tags        
23e0: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c  TEXT DEFAULT '',
23f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2410: 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 65 73 74   CONSTRAINT test
2420: 5f 6d 65 74 61 5f 63 6f 6e 73 74 72 61 69 6e 74  _meta_constraint
2430: 20 55 4e 49 51 55 45 20 28 74 65 73 74 6e 61 6d   UNIQUE (testnam
2440: 65 29 29 3b 22 29 29 0a 20 20 20 20 20 28 70 72  e));")).     (pr
2450: 69 6e 74 20 22 43 75 72 72 65 6e 74 20 73 63 68  int "Current sch
2460: 65 6d 61 20 76 65 72 73 69 6f 6e 3a 20 22 20 6d  ema version: " m
2470: 76 65 72 20 22 20 63 75 72 72 65 6e 74 20 6d 65  ver " current me
2480: 67 61 74 65 73 74 20 76 65 72 73 69 6f 6e 3a 20  gatest version: 
2490: 22 20 6d 65 67 61 74 65 73 74 2d 76 65 72 73 69  " megatest-versi
24a0: 6f 6e 29 0a 20 20 20 20 20 28 63 6f 6e 64 0a 20  on).     (cond. 
24b0: 20 20 20 20 20 28 28 6e 6f 74 20 6d 76 65 72 29       ((not mver)
24c0: 0a 20 20 20 20 20 20 20 28 70 72 69 6e 74 20 22  .       (print "
24d0: 41 64 64 69 6e 67 20 6d 65 67 61 74 65 73 74 2d  Adding megatest-
24e0: 76 65 72 73 69 6f 6e 20 74 6f 20 6d 65 74 61 64  version to metad
24f0: 61 74 61 22 29 20 3b 3b 20 4e 65 65 64 20 74 6f  ata") ;; Need to
2500: 20 72 65 63 72 65 61 74 65 20 74 68 65 20 74 61   recreate the ta
2510: 62 6c 65 0a 20 20 20 20 20 20 20 28 73 71 6c 69  ble.       (sqli
2520: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22  te3:execute db "
2530: 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58  DROP TABLE IF EX
2540: 49 53 54 53 20 6d 65 74 61 64 61 74 3b 22 29 0a  ISTS metadat;").
2550: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a         (sqlite3:
2560: 65 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41  execute db "CREA
2570: 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  TE TABLE IF NOT 
2580: 45 58 49 53 54 53 20 6d 65 74 61 64 61 74 20 28  EXISTS metadat (
2590: 69 64 20 49 4e 54 45 47 45 52 2c 20 76 61 72 20  id INTEGER, var 
25a0: 54 45 58 54 2c 20 76 61 6c 20 54 45 58 54 2c 0a  TEXT, val TEXT,.
25b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d0: 20 20 43 4f 4e 53 54 52 41 49 4e 54 20 6d 65 74    CONSTRAINT met
25e0: 61 64 61 74 5f 63 6f 6e 73 74 72 61 69 6e 74 20  adat_constraint 
25f0: 55 4e 49 51 55 45 20 28 76 61 72 29 29 3b 22 29  UNIQUE (var));")
2600: 0a 20 20 20 20 20 20 20 28 64 62 3a 73 65 74 2d  .       (db:set-
2610: 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 53 54  var db "MEGATEST
2620: 5f 56 45 52 53 49 4f 4e 22 20 31 2e 31 37 29 0a  _VERSION" 1.17).
2630: 20 20 20 20 20 20 20 28 70 61 74 63 68 2d 64 62         (patch-db
2640: 29 29 0a 20 20 20 20 20 20 28 28 3c 20 6d 76 65  )).      ((< mve
2650: 72 20 31 2e 32 31 29 0a 20 20 20 20 20 20 20 28  r 1.21).       (
2660: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
2670: 64 62 20 22 44 52 4f 50 20 54 41 42 4c 45 20 49  db "DROP TABLE I
2680: 46 20 45 58 49 53 54 53 20 6d 65 74 61 64 61 74  F EXISTS metadat
2690: 3b 22 29 0a 20 20 20 20 20 20 20 28 73 71 6c 69  ;").       (sqli
26a0: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22  te3:execute db "
26b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20  CREATE TABLE IF 
26c0: 4e 4f 54 20 45 58 49 53 54 53 20 6d 65 74 61 64  NOT EXISTS metad
26d0: 61 74 20 28 69 64 20 49 4e 54 45 47 45 52 2c 20  at (id INTEGER, 
26e0: 76 61 72 20 54 45 58 54 2c 20 76 61 6c 20 54 45  var TEXT, val TE
26f0: 58 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  XT,.            
2700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2710: 20 20 20 20 20 20 43 4f 4e 53 54 52 41 49 4e 54        CONSTRAINT
2720: 20 6d 65 74 61 64 61 74 5f 63 6f 6e 73 74 72 61   metadat_constra
2730: 69 6e 74 20 55 4e 49 51 55 45 20 28 76 61 72 29  int UNIQUE (var)
2740: 29 3b 22 29 0a 20 20 20 20 20 20 20 28 64 62 3a  );").       (db:
2750: 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41  set-var db "MEGA
2760: 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e  TEST_VERSION" 1.
2770: 32 31 29 20 3b 3b 20 73 65 74 20 62 65 66 6f 72  21) ;; set befor
2780: 65 2c 20 6a 75 73 74 20 69 6e 20 63 61 73 65 20  e, just in case 
2790: 74 68 65 20 63 68 61 6e 67 65 73 20 61 72 65 20  the changes are 
27a0: 61 6c 72 65 61 64 79 20 61 70 70 6c 69 65 64 0a  already applied.
27b0: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a         (sqlite3:
27c0: 65 78 65 63 75 74 65 20 64 62 20 74 65 73 74 2d  execute db test-
27d0: 6d 65 74 61 2d 64 65 66 29 0a 20 20 20 20 20 20  meta-def).      
27e0: 20 28 66 6f 72 2d 65 61 63 68 20 0a 09 28 6c 61   (for-each ..(la
27f0: 6d 62 64 61 20 28 73 74 6d 74 29 0a 09 20 20 28  mbda (stmt)..  (
2800: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
2810: 64 62 20 73 74 6d 74 29 29 0a 09 28 6c 69 73 74  db stmt))..(list
2820: 20 0a 09 20 22 41 4c 54 45 52 20 54 41 42 4c 45   .. "ALTER TABLE
2830: 20 74 65 73 74 73 20 41 44 44 20 43 4f 4c 55 4d   tests ADD COLUM
2840: 4e 20 66 69 72 73 74 5f 65 72 72 20 54 45 58 54  N first_err TEXT
2850: 3b 22 0a 09 20 22 41 4c 54 45 52 20 54 41 42 4c  ;".. "ALTER TABL
2860: 45 20 74 65 73 74 73 20 41 44 44 20 43 4f 4c 55  E tests ADD COLU
2870: 4d 4e 20 66 69 72 73 74 5f 77 61 72 6e 20 54 45  MN first_warn TE
2880: 58 54 3b 22 0a 09 20 29 29 0a 20 20 20 20 20 20  XT;".. )).      
2890: 20 28 70 61 74 63 68 2d 64 62 29 29 0a 20 20 20   (patch-db)).   
28a0: 20 20 20 28 28 3c 20 6d 76 65 72 20 31 2e 32 34     ((< mver 1.24
28b0: 29 0a 20 20 20 20 20 20 20 28 64 62 3a 73 65 74  ).       (db:set
28c0: 2d 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 53  -var db "MEGATES
28d0: 54 5f 56 45 52 53 49 4f 4e 22 20 31 2e 32 34 29  T_VERSION" 1.24)
28e0: 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  .       (sqlite3
28f0: 3a 65 78 65 63 75 74 65 20 64 62 20 22 44 52 4f  :execute db "DRO
2900: 50 20 54 41 42 4c 45 20 49 46 20 45 58 49 53 54  P TABLE IF EXIST
2910: 53 20 74 65 73 74 5f 64 61 74 61 3b 22 29 0a 20  S test_data;"). 
2920: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65        (sqlite3:e
2930: 78 65 63 75 74 65 20 64 62 20 22 44 52 4f 50 20  xecute db "DROP 
2940: 54 41 42 4c 45 20 49 46 20 45 58 49 53 54 53 20  TABLE IF EXISTS 
2950: 74 65 73 74 5f 6d 65 74 61 3b 22 29 0a 20 20 20  test_meta;").   
2960: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65      (sqlite3:exe
2970: 63 75 74 65 20 64 62 20 74 65 73 74 2d 6d 65 74  cute db test-met
2980: 61 2d 64 65 66 29 0a 20 20 20 20 20 20 20 28 73  a-def).       (s
2990: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64  qlite3:execute d
29a0: 62 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  b "CREATE TABLE 
29b0: 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 74 65  IF NOT EXISTS te
29c0: 73 74 5f 64 61 74 61 20 28 69 64 20 49 4e 54 45  st_data (id INTE
29d0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
29e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a00: 20 74 65 73 74 5f 69 64 20 49 4e 54 45 47 45 52   test_id INTEGER
2a10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a30: 20 20 63 61 74 65 67 6f 72 79 20 54 45 58 54 20    category TEXT 
2a40: 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20  DEFAULT '',.    
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a60: 20 20 20 20 20 20 20 20 20 20 20 20 76 61 72 69              vari
2a70: 61 62 6c 65 20 54 45 58 54 2c 0a 09 20 20 20 20  able TEXT,..    
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a90: 20 20 20 20 76 61 6c 75 65 20 52 45 41 4c 2c 0a      value REAL,.
2aa0: 09 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ab0: 20 20 20 20 20 20 20 20 20 65 78 70 65 63 74 65           expecte
2ac0: 64 20 52 45 41 4c 2c 0a 09 20 20 20 20 20 20 20  d REAL,..       
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae0: 20 74 6f 6c 20 52 45 41 4c 2c 0a 20 20 20 20 20   tol REAL,.     
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b00: 20 20 20 20 20 20 20 20 20 20 20 75 6e 69 74 73             units
2b10: 20 54 45 58 54 2c 0a 20 20 20 20 20 20 20 20 20   TEXT,.         
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b30: 20 20 20 20 20 20 20 63 6f 6d 6d 65 6e 74 20 54         comment T
2b40: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a  EXT DEFAULT '',.
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b70: 73 74 61 74 75 73 20 54 45 58 54 20 44 45 46 41  status TEXT DEFA
2b80: 55 4c 54 20 27 6e 2f 61 27 2c 66 6f 73 73 0a 20  ULT 'n/a',foss. 
2b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e               CON
2bb0: 53 54 52 41 49 4e 54 20 74 65 73 74 5f 64 61 74  STRAINT test_dat
2bc0: 61 20 55 4e 49 51 55 45 20 28 74 65 73 74 5f 69  a UNIQUE (test_i
2bd0: 64 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 69 61  d,category,varia
2be0: 62 6c 65 29 29 3b 22 29 0a 20 20 20 20 20 20 20  ble));").       
2bf0: 28 70 61 74 63 68 2d 64 62 29 29 0a 20 20 20 20  (patch-db)).    
2c00: 20 20 28 28 3c 20 6d 76 65 72 20 31 2e 32 37 29    ((< mver 1.27)
2c10: 0a 20 20 20 20 20 20 20 28 64 62 3a 73 65 74 2d  .       (db:set-
2c20: 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 53 54  var db "MEGATEST
2c30: 5f 56 45 52 53 49 4f 4e 22 20 31 2e 32 37 29 0a  _VERSION" 1.27).
2c40: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a         (sqlite3:
2c50: 65 78 65 63 75 74 65 20 64 62 20 22 41 4c 54 45  execute db "ALTE
2c60: 52 20 54 41 42 4c 45 20 74 65 73 74 5f 64 61 74  R TABLE test_dat
2c70: 61 20 41 44 44 20 43 4f 4c 55 4d 4e 20 74 79 70  a ADD COLUMN typ
2c80: 65 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27  e TEXT DEFAULT '
2c90: 27 3b 22 29 0a 20 20 20 20 20 20 20 28 70 61 74  ';").       (pat
2ca0: 63 68 2d 64 62 29 29 0a 20 20 20 20 20 20 28 28  ch-db)).      ((
2cb0: 3c 20 6d 76 65 72 20 31 2e 32 39 29 0a 20 20 20  < mver 1.29).   
2cc0: 20 20 20 20 28 64 62 3a 73 65 74 2d 76 61 72 20      (db:set-var 
2cd0: 64 62 20 22 4d 45 47 41 54 45 53 54 5f 56 45 52  db "MEGATEST_VER
2ce0: 53 49 4f 4e 22 20 31 2e 32 39 29 0a 20 20 20 20  SION" 1.29).    
2cf0: 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63     (sqlite3:exec
2d00: 75 74 65 20 64 62 20 22 41 4c 54 45 52 20 54 41  ute db "ALTER TA
2d10: 42 4c 45 20 74 65 73 74 5f 73 74 65 70 73 20 41  BLE test_steps A
2d20: 44 44 20 43 4f 4c 55 4d 4e 20 6c 6f 67 66 69 6c  DD COLUMN logfil
2d30: 65 20 54 45 58 54 3b 22 29 0a 20 20 20 20 20 20  e TEXT;").      
2d40: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
2d50: 65 20 64 62 20 22 41 4c 54 45 52 20 54 41 42 4c  e db "ALTER TABL
2d60: 45 20 74 65 73 74 73 20 41 44 44 20 43 4f 4c 55  E tests ADD COLU
2d70: 4d 4e 20 73 68 6f 72 74 64 69 72 20 54 45 58 54  MN shortdir TEXT
2d80: 20 44 45 46 41 55 4c 54 20 27 27 3b 22 29 0a 20   DEFAULT '';"). 
2d90: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65        (sqlite3:e
2da0: 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 54  xecute db "CREAT
2db0: 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
2dc0: 58 49 53 54 53 20 74 61 73 6b 73 5f 71 75 65 75  XISTS tasks_queu
2dd0: 65 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52  e (id INTEGER PR
2de0: 49 4d 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20  IMARY KEY,.     
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e00: 20 20 20 20 20 20 20 20 20 20 20 61 63 74 69 6f             actio
2e10: 6e 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27  n TEXT DEFAULT '
2e20: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ',.             
2e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e40: 20 20 20 6f 77 6e 65 72 20 54 45 58 54 2c 0a 20     owner TEXT,. 
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2e70: 74 61 74 65 20 54 45 58 54 20 44 45 46 41 55 4c  tate TEXT DEFAUL
2e80: 54 20 27 6e 65 77 27 2c 0a 20 20 20 20 20 20 20  T 'new',.       
2e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea0: 20 20 20 20 20 20 20 20 20 74 61 72 67 65 74 20           target 
2eb0: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c  TEXT DEFAULT '',
2ec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee0: 20 6e 61 6d 65 20 54 45 58 54 20 44 45 46 41 55   name TEXT DEFAU
2ef0: 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20  LT '',.         
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f10: 20 20 20 20 20 20 20 74 65 73 74 20 54 45 58 54         test TEXT
2f20: 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20   DEFAULT '',.   
2f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74 65               ite
2f50: 6d 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27  m TEXT DEFAULT '
2f60: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ',.             
2f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f80: 20 20 20 63 72 65 61 74 69 6f 6e 5f 74 69 6d 65     creation_time
2f90: 20 54 49 4d 45 53 54 41 4d 50 2c 0a 20 20 20 20   TIMESTAMP,.    
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 65 78 65 63              exec
2fc0: 75 74 69 6f 6e 5f 74 69 6d 65 20 54 49 4d 45 53  ution_time TIMES
2fd0: 54 41 4d 50 29 3b 22 29 0a 20 20 20 20 20 20 20  TAMP);").       
2fe0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
2ff0: 20 64 62 20 22 43 52 45 41 54 45 20 54 41 42 4c   db "CREATE TABL
3000: 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20  E IF NOT EXISTS 
3010: 6d 6f 6e 69 74 6f 72 73 20 28 69 64 20 49 4e 54  monitors (id INT
3020: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
3030: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3050: 20 20 70 69 64 20 49 4e 54 45 47 45 52 2c 0a 20    pid INTEGER,. 
3060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
3080: 74 61 72 74 5f 74 69 6d 65 20 54 49 4d 45 53 54  tart_time TIMEST
3090: 41 4d 50 2c 0a 20 20 20 20 20 20 20 20 20 20 20  AMP,.           
30a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30b0: 20 20 20 20 20 6c 61 73 74 5f 75 70 64 61 74 65       last_update
30c0: 20 54 49 4d 45 53 54 41 4d 50 2c 0a 20 20 20 20   TIMESTAMP,.    
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e0: 20 20 20 20 20 20 20 20 20 20 20 20 68 6f 73 74              host
30f0: 6e 61 6d 65 20 54 45 58 54 2c 0a 20 20 20 20 20  name TEXT,.     
3100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3110: 20 20 20 20 20 20 20 20 20 20 20 75 73 65 72 6e             usern
3120: 61 6d 65 20 54 45 58 54 2c 0a 20 20 20 20 20 20  ame TEXT,.      
3130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3140: 20 20 20 20 20 20 20 20 20 43 4f 4e 53 54 52 41           CONSTRA
3150: 49 4e 54 20 6d 6f 6e 69 74 6f 72 73 5f 63 6f 6e  INT monitors_con
3160: 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28  straint UNIQUE (
3170: 70 69 64 2c 68 6f 73 74 6e 61 6d 65 29 29 3b 22  pid,hostname));"
3180: 29 0a 20 20 20 20 20 20 20 28 70 61 74 63 68 2d  ).       (patch-
3190: 64 62 29 29 0a 20 20 20 20 20 20 28 28 3c 20 6d  db)).      ((< m
31a0: 76 65 72 20 6d 65 67 61 74 65 73 74 2d 76 65 72  ver megatest-ver
31b0: 73 69 6f 6e 29 0a 20 20 20 20 20 20 20 28 64 62  sion).       (db
31c0: 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47  :set-var db "MEG
31d0: 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 6d  ATEST_VERSION" m
31e0: 65 67 61 74 65 73 74 2d 76 65 72 73 69 6f 6e 29  egatest-version)
31f0: 29 29 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d  )))))..;;=======
3200: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3210: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3220: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3230: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a  ===============.
3240: 3b 3b 20 6d 65 74 61 20 67 65 74 20 61 6e 64 20  ;; meta get and 
3250: 73 65 74 20 76 61 72 73 0a 3b 3b 3d 3d 3d 3d 3d  set vars.;;=====
3260: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3270: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3280: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3290: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
32a0: 3d 0a 0a 3b 3b 20 72 65 74 75 72 6e 73 20 6e 75  =..;; returns nu
32b0: 6d 62 65 72 20 69 66 20 73 74 72 69 6e 67 2d 3e  mber if string->
32c0: 6e 75 6d 62 65 72 20 69 73 20 73 75 63 63 65 73  number is succes
32d0: 73 66 75 6c 2c 20 73 74 72 69 6e 67 20 6f 74 68  sful, string oth
32e0: 65 72 77 69 73 65 0a 28 64 65 66 69 6e 65 20 28  erwise.(define (
32f0: 64 62 3a 67 65 74 2d 76 61 72 20 64 62 20 76 61  db:get-var db va
3300: 72 29 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20  r).  (let ((res 
3310: 23 66 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65  #f)).    (sqlite
3320: 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20  3:for-each-row. 
3330: 20 20 20 20 28 6c 61 6d 62 64 61 20 28 76 61 6c      (lambda (val
3340: 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72  ).       (set! r
3350: 65 73 20 76 61 6c 29 29 0a 20 20 20 20 20 64 62  es val)).     db
3360: 20 22 53 45 4c 45 43 54 20 76 61 6c 20 46 52 4f   "SELECT val FRO
3370: 4d 20 6d 65 74 61 64 61 74 20 57 48 45 52 45 20  M metadat WHERE 
3380: 76 61 72 3d 3f 3b 22 20 76 61 72 29 0a 20 20 20  var=?;" var).   
3390: 20 28 69 66 20 28 73 74 72 69 6e 67 3f 20 72 65   (if (string? re
33a0: 73 29 0a 09 28 6c 65 74 20 28 28 76 61 6c 6e 75  s)..(let ((valnu
33b0: 6d 20 28 73 74 72 69 6e 67 2d 3e 6e 75 6d 62 65  m (string->numbe
33c0: 72 20 72 65 73 29 29 29 0a 09 20 20 28 69 66 20  r res)))..  (if 
33d0: 76 61 6c 6e 75 6d 20 76 61 6c 6e 75 6d 20 72 65  valnum valnum re
33e0: 73 29 29 0a 09 72 65 73 29 29 29 0a 0a 28 64 65  s))..res)))..(de
33f0: 66 69 6e 65 20 28 64 62 3a 73 65 74 2d 76 61 72  fine (db:set-var
3400: 20 64 62 20 76 61 72 20 76 61 6c 29 0a 20 20 28   db var val).  (
3410: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
3420: 64 62 20 22 49 4e 53 45 52 54 20 4f 52 20 52 45  db "INSERT OR RE
3430: 50 4c 41 43 45 20 49 4e 54 4f 20 6d 65 74 61 64  PLACE INTO metad
3440: 61 74 20 28 76 61 72 2c 76 61 6c 29 20 56 41 4c  at (var,val) VAL
3450: 55 45 53 20 28 3f 2c 3f 29 3b 22 20 76 61 72 20  UES (?,?);" var 
3460: 76 61 6c 29 29 0a 0a 3b 3b 20 75 73 65 20 61 20  val))..;; use a 
3470: 67 6c 6f 62 61 6c 20 66 6f 72 20 73 6f 6d 65 20  global for some 
3480: 70 72 69 6d 69 74 69 76 65 20 63 61 63 68 69 6e  primitive cachin
3490: 67 2c 20 69 74 20 69 73 20 6a 75 73 74 20 73 69  g, it is just si
34a0: 6c 6c 79 20 74 6f 20 72 65 2d 72 65 61 64 20 74  lly to re-read t
34b0: 68 65 20 64 62 20 0a 3b 3b 20 6f 76 65 72 20 61  he db .;; over a
34c0: 6e 64 20 6f 76 65 72 20 61 67 61 69 6e 20 66 6f  nd over again fo
34d0: 72 20 74 68 65 20 6b 65 79 73 20 73 69 6e 63 65  r the keys since
34e0: 20 74 68 65 79 20 6e 65 76 65 72 20 63 68 61 6e   they never chan
34f0: 67 65 0a 0a 28 64 65 66 69 6e 65 20 2a 64 62 2d  ge..(define *db-
3500: 6b 65 79 73 2a 20 23 66 29 0a 0a 28 64 65 66 69  keys* #f)..(defi
3510: 6e 65 20 28 64 62 2d 67 65 74 2d 6b 65 79 73 20  ne (db-get-keys 
3520: 64 62 29 0a 20 20 28 69 66 20 2a 64 62 2d 6b 65  db).  (if *db-ke
3530: 79 73 2a 20 2a 64 62 2d 6b 65 79 73 2a 20 0a 20  ys* *db-keys* . 
3540: 20 20 20 20 20 28 6c 65 74 20 28 28 72 65 73 20       (let ((res 
3550: 27 28 29 29 29 0a 09 28 73 71 6c 69 74 65 33 3a  '()))..(sqlite3:
3560: 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 09 20  for-each-row .. 
3570: 28 6c 61 6d 62 64 61 20 28 6b 65 79 20 6b 65 79  (lambda (key key
3580: 74 79 70 65 29 0a 09 20 20 20 28 73 65 74 21 20  type)..   (set! 
3590: 72 65 73 20 28 63 6f 6e 73 20 28 76 65 63 74 6f  res (cons (vecto
35a0: 72 20 6b 65 79 20 6b 65 79 74 79 70 65 29 20 72  r key keytype) r
35b0: 65 73 29 29 29 0a 09 20 64 62 0a 09 20 22 53 45  es))).. db.. "SE
35c0: 4c 45 43 54 20 66 69 65 6c 64 6e 61 6d 65 2c 66  LECT fieldname,f
35d0: 69 65 6c 64 74 79 70 65 20 46 52 4f 4d 20 6b 65  ieldtype FROM ke
35e0: 79 73 20 4f 52 44 45 52 20 42 59 20 69 64 20 44  ys ORDER BY id D
35f0: 45 53 43 3b 22 29 0a 09 28 73 65 74 21 20 2a 64  ESC;")..(set! *d
3600: 62 2d 6b 65 79 73 2a 20 72 65 73 29 0a 09 72 65  b-keys* res)..re
3610: 73 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 64 62  s)))..(define db
3620: 3a 67 65 74 2d 6b 65 79 73 20 64 62 2d 67 65 74  :get-keys db-get
3630: 2d 6b 65 79 73 29 0a 0a 28 64 65 66 69 6e 65 20  -keys)..(define 
3640: 28 64 62 3a 67 65 74 2d 76 61 6c 75 65 2d 62 79  (db:get-value-by
3650: 2d 68 65 61 64 65 72 20 72 6f 77 20 68 65 61 64  -header row head
3660: 65 72 20 66 69 65 6c 64 29 0a 20 20 28 69 66 20  er field).  (if 
3670: 28 6e 75 6c 6c 3f 20 68 65 61 64 65 72 29 20 23  (null? header) #
3680: 66 0a 20 20 20 20 20 20 28 6c 65 74 20 6c 6f 6f  f.      (let loo
3690: 70 20 28 28 68 65 64 20 28 63 61 72 20 68 65 61  p ((hed (car hea
36a0: 64 65 72 29 29 0a 09 09 20 28 74 61 6c 20 28 63  der))... (tal (c
36b0: 64 72 20 68 65 61 64 65 72 29 29 0a 09 09 20 28  dr header))... (
36c0: 6e 20 20 20 30 29 29 0a 09 28 69 66 20 28 65 71  n   0))..(if (eq
36d0: 75 61 6c 3f 20 68 65 64 20 66 69 65 6c 64 29 0a  ual? hed field).
36e0: 09 20 20 20 20 28 76 65 63 74 6f 72 2d 72 65 66  .    (vector-ref
36f0: 20 72 6f 77 20 6e 29 0a 09 20 20 20 20 28 69 66   row n)..    (if
3700: 20 28 6e 75 6c 6c 3f 20 74 61 6c 29 20 23 66 20   (null? tal) #f 
3710: 28 6c 6f 6f 70 20 28 63 61 72 20 74 61 6c 29 28  (loop (car tal)(
3720: 63 64 72 20 74 61 6c 29 28 2b 20 6e 20 31 29 29  cdr tal)(+ n 1))
3730: 29 29 29 29 29 0a 09 20 20 20 20 0a 3b 3b 3d 3d  )))))..    .;;==
3740: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3750: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3760: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3770: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3780: 3d 3d 3d 3d 0a 3b 3b 20 20 52 20 55 20 4e 20 53  ====.;;  R U N S
3790: 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  .;;=============
37a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
37b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
37c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
37d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65 66 69  =========..(defi
37e0: 6e 65 20 28 72 75 6e 73 3a 67 65 74 2d 73 74 64  ne (runs:get-std
37f0: 2d 72 75 6e 2d 66 69 65 6c 64 73 20 6b 65 79 73  -run-fields keys
3800: 20 72 65 6d 66 69 65 6c 64 73 29 0a 20 20 28 6c   remfields).  (l
3810: 65 74 2a 20 28 28 68 65 61 64 65 72 20 20 20 20  et* ((header    
3820: 28 61 70 70 65 6e 64 20 28 6d 61 70 20 6b 65 79  (append (map key
3830: 3a 67 65 74 2d 66 69 65 6c 64 6e 61 6d 65 20 6b  :get-fieldname k
3840: 65 79 73 29 0a 09 09 09 20 20 20 20 72 65 6d 66  eys)....    remf
3850: 69 65 6c 64 73 29 29 0a 09 20 28 6b 65 79 73 74  ields)).. (keyst
3860: 72 20 20 20 20 28 63 6f 6e 63 20 28 6b 65 79 73  r    (conc (keys
3870: 2d 3e 6b 65 79 73 74 72 20 6b 65 79 73 29 20 22  ->keystr keys) "
3880: 2c 22 0a 09 09 09 20 20 28 73 74 72 69 6e 67 2d  ,"....  (string-
3890: 69 6e 74 65 72 73 70 65 72 73 65 20 72 65 6d 66  intersperse remf
38a0: 69 65 6c 64 73 20 22 2c 22 29 29 29 29 0a 20 20  ields ",")))).  
38b0: 20 20 28 6c 69 73 74 20 6b 65 79 73 74 72 20 68    (list keystr h
38c0: 65 61 64 65 72 29 29 29 0a 0a 3b 3b 20 57 41 53  eader)))..;; WAS
38d0: 20 64 62 2d 67 65 74 2d 72 75 6e 73 20 46 49 58   db-get-runs FIX
38e0: 4d 45 20 49 4e 20 52 45 4d 41 49 4e 49 4e 47 20  ME IN REMAINING 
38f0: 43 4f 44 45 0a 3b 3b 0a 3b 3b 20 4d 45 52 47 45  CODE.;;.;; MERGE
3900: 20 54 48 49 53 20 57 49 54 48 20 64 62 3a 67 65   THIS WITH db:ge
3910: 74 2d 72 75 6e 73 2c 20 61 63 63 69 64 65 6e 74  t-runs, accident
3920: 6c 79 20 77 72 6f 74 65 20 69 74 20 74 77 69 63  ly wrote it twic
3930: 65 0a 3b 3b 0a 3b 3b 20 72 65 70 6c 61 63 65 20  e.;;.;; replace 
3940: 68 65 61 64 65 72 20 61 6e 64 20 6b 65 79 73 74  header and keyst
3950: 72 20 77 69 74 68 20 61 20 63 61 6c 6c 20 74 6f  r with a call to
3960: 20 72 75 6e 73 3a 67 65 74 2d 73 74 64 2d 72 75   runs:get-std-ru
3970: 6e 2d 66 69 65 6c 64 73 0a 3b 3b 0a 3b 3b 20 6b  n-fields.;;.;; k
3980: 65 79 70 61 74 74 73 3a 20 28 20 28 4b 45 59 31  eypatts: ( (KEY1
3990: 20 22 61 62 63 25 64 65 66 22 29 28 4b 45 59 32   "abc%def")(KEY2
39a0: 20 22 25 22 29 20 29 0a 3b 3b 0a 28 64 65 66 69   "%") ).;;.(defi
39b0: 6e 65 20 28 64 62 3a 67 65 74 2d 72 75 6e 73 20  ne (db:get-runs 
39c0: 64 62 20 72 75 6e 70 61 74 74 20 63 6f 75 6e 74  db runpatt count
39d0: 20 6f 66 66 73 65 74 20 6b 65 79 70 61 74 74 73   offset keypatts
39e0: 29 0a 20 20 28 6c 65 74 2a 20 28 28 72 65 73 20  ).  (let* ((res 
39f0: 20 20 20 20 20 27 28 29 29 0a 09 20 28 6b 65 79       '()).. (key
3a00: 73 20 20 20 20 20 20 28 64 62 2d 67 65 74 2d 6b  s      (db-get-k
3a10: 65 79 73 20 64 62 29 29 0a 09 20 28 72 65 6d 66  eys db)).. (remf
3a20: 69 65 6c 64 73 20 28 6c 69 73 74 20 22 69 64 22  ields (list "id"
3a30: 20 22 72 75 6e 6e 61 6d 65 22 20 22 73 74 61 74   "runname" "stat
3a40: 65 22 20 22 73 74 61 74 75 73 22 20 22 6f 77 6e  e" "status" "own
3a50: 65 72 22 20 22 65 76 65 6e 74 5f 74 69 6d 65 22  er" "event_time"
3a60: 29 29 0a 09 20 28 68 65 61 64 65 72 20 20 20 20  )).. (header    
3a70: 28 61 70 70 65 6e 64 20 28 6d 61 70 20 6b 65 79  (append (map key
3a80: 3a 67 65 74 2d 66 69 65 6c 64 6e 61 6d 65 20 6b  :get-fieldname k
3a90: 65 79 73 29 0a 09 09 09 20 20 20 20 72 65 6d 66  eys)....    remf
3aa0: 69 65 6c 64 73 29 29 0a 09 20 28 6b 65 79 73 74  ields)).. (keyst
3ab0: 72 20 20 20 20 28 63 6f 6e 63 20 28 6b 65 79 73  r    (conc (keys
3ac0: 2d 3e 6b 65 79 73 74 72 20 6b 65 79 73 29 20 22  ->keystr keys) "
3ad0: 2c 22 0a 09 09 09 20 20 28 73 74 72 69 6e 67 2d  ,"....  (string-
3ae0: 69 6e 74 65 72 73 70 65 72 73 65 20 72 65 6d 66  intersperse remf
3af0: 69 65 6c 64 73 20 22 2c 22 29 29 29 0a 09 20 28  ields ","))).. (
3b00: 71 72 79 73 74 72 20 20 20 20 28 63 6f 6e 63 20  qrystr    (conc 
3b10: 22 53 45 4c 45 43 54 20 22 20 6b 65 79 73 74 72  "SELECT " keystr
3b20: 20 22 20 46 52 4f 4d 20 72 75 6e 73 20 57 48 45   " FROM runs WHE
3b30: 52 45 20 72 75 6e 6e 61 6d 65 20 4c 49 4b 45 20  RE runname LIKE 
3b40: 3f 20 22 0a 09 09 09 20 20 3b 3b 20 47 65 6e 65  ? "....  ;; Gene
3b50: 72 61 74 65 3a 20 22 20 41 4e 44 20 78 20 4c 49  rate: " AND x LI
3b60: 4b 45 20 27 6b 65 79 70 61 74 74 27 20 2e 2e 2e  KE 'keypatt' ...
3b70: 22 0a 09 09 09 20 20 28 69 66 20 28 6e 75 6c 6c  "....  (if (null
3b80: 3f 20 6b 65 79 70 61 74 74 73 29 20 22 22 0a 09  ? keypatts) ""..
3b90: 09 09 20 20 20 20 20 20 28 63 6f 6e 63 20 22 20  ..      (conc " 
3ba0: 41 4e 44 20 22 0a 09 09 09 09 20 20 20 20 28 73  AND ".....    (s
3bb0: 74 72 69 6e 67 2d 6a 6f 69 6e 20 0a 09 09 09 09  tring-join .....
3bc0: 20 20 20 20 20 28 6d 61 70 20 28 6c 61 6d 62 64       (map (lambd
3bd0: 61 20 28 6b 65 79 70 61 74 74 29 0a 09 09 09 09  a (keypatt).....
3be0: 09 20 20 20 20 28 6c 65 74 20 28 28 6b 65 79 20  .    (let ((key 
3bf0: 20 28 63 61 72 20 6b 65 79 70 61 74 74 29 29 0a   (car keypatt)).
3c00: 09 09 09 09 09 09 20 20 28 70 61 74 74 20 28 63  ......  (patt (c
3c10: 61 64 72 20 6b 65 79 70 61 74 74 29 29 29 0a 09  adr keypatt)))..
3c20: 09 09 09 09 20 20 20 20 20 20 28 63 6f 6e 63 20  ....      (conc 
3c30: 6b 65 79 20 22 20 4c 49 4b 45 20 27 22 20 70 61  key " LIKE '" pa
3c40: 74 74 20 22 27 22 29 29 29 0a 09 09 09 09 09 20  tt "'")))...... 
3c50: 20 6b 65 79 70 61 74 74 73 29 0a 09 09 09 09 20   keypatts)..... 
3c60: 20 20 20 20 22 20 41 4e 44 20 22 29 29 29 0a 09      " AND ")))..
3c70: 09 09 20 20 22 20 4f 52 44 45 52 20 42 59 20 65  ..  " ORDER BY e
3c80: 76 65 6e 74 5f 74 69 6d 65 20 44 45 53 43 20 22  vent_time DESC "
3c90: 0a 09 09 09 20 20 28 69 66 20 28 6e 75 6d 62 65  ....  (if (numbe
3ca0: 72 3f 20 63 6f 75 6e 74 29 0a 09 09 09 20 20 20  r? count)....   
3cb0: 20 20 20 28 63 6f 6e 63 20 22 20 4c 49 4d 49 54     (conc " LIMIT
3cc0: 20 22 20 63 6f 75 6e 74 29 0a 09 09 09 20 20 20   " count)....   
3cd0: 20 20 20 22 22 29 0a 09 09 09 20 20 28 69 66 20     "")....  (if 
3ce0: 28 6e 75 6d 62 65 72 3f 20 6f 66 66 73 65 74 29  (number? offset)
3cf0: 0a 09 09 09 20 20 20 20 20 20 28 63 6f 6e 63 20  ....      (conc 
3d00: 22 20 4f 46 46 53 45 54 20 22 20 6f 66 66 73 65  " OFFSET " offse
3d10: 74 29 0a 09 09 09 20 20 20 20 20 20 22 22 29 29  t)....      ""))
3d20: 29 29 0a 20 20 20 20 28 64 65 62 75 67 3a 70 72  )).    (debug:pr
3d30: 69 6e 74 20 34 20 22 64 62 3a 67 65 74 2d 72 75  int 4 "db:get-ru
3d40: 6e 73 20 71 72 79 73 74 72 3a 20 22 20 71 72 79  ns qrystr: " qry
3d50: 73 74 72 20 22 5c 6e 6b 65 79 70 61 74 74 73 3a  str "\nkeypatts:
3d60: 20 22 20 6b 65 79 70 61 74 74 73 20 22 5c 6e 20   " keypatts "\n 
3d70: 20 6f 66 66 73 65 74 3a 20 22 20 6f 66 66 73 65   offset: " offse
3d80: 74 20 22 20 6c 69 6d 69 74 3a 20 22 20 63 6f 75  t " limit: " cou
3d90: 6e 74 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33  nt).    (sqlite3
3da0: 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20  :for-each-row.  
3db0: 20 20 20 28 6c 61 6d 62 64 61 20 28 61 20 2e 20     (lambda (a . 
3dc0: 78 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20  x).       (set! 
3dd0: 72 65 73 20 28 63 6f 6e 73 20 28 61 70 70 6c 79  res (cons (apply
3de0: 20 76 65 63 74 6f 72 20 61 20 78 29 20 72 65 73   vector a x) res
3df0: 29 29 29 0a 20 20 20 20 20 64 62 0a 20 20 20 20  ))).     db.    
3e00: 20 71 72 79 73 74 72 0a 20 20 20 20 20 72 75 6e   qrystr.     run
3e10: 70 61 74 74 29 0a 20 20 20 20 28 76 65 63 74 6f  patt).    (vecto
3e20: 72 20 68 65 61 64 65 72 20 72 65 73 29 29 29 0a  r header res))).
3e30: 0a 3b 3b 20 6a 75 73 74 20 67 65 74 20 63 6f 75  .;; just get cou
3e40: 6e 74 20 6f 66 20 72 75 6e 73 0a 28 64 65 66 69  nt of runs.(defi
3e50: 6e 65 20 28 64 62 3a 67 65 74 2d 6e 75 6d 2d 72  ne (db:get-num-r
3e60: 75 6e 73 20 64 62 20 72 75 6e 70 61 74 74 29 0a  uns db runpatt).
3e70: 20 20 28 6c 65 74 20 28 28 6e 75 6d 72 75 6e 73    (let ((numruns
3e80: 20 30 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65   0)).    (sqlite
3e90: 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a  3:for-each-row .
3ea0: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 63 6f       (lambda (co
3eb0: 75 6e 74 29 0a 20 20 20 20 20 20 20 28 73 65 74  unt).       (set
3ec0: 21 20 6e 75 6d 72 75 6e 73 20 63 6f 75 6e 74 29  ! numruns count)
3ed0: 29 0a 20 20 20 20 20 64 62 0a 20 20 20 20 20 22  ).     db.     "
3ee0: 53 45 4c 45 43 54 20 43 4f 55 4e 54 28 69 64 29  SELECT COUNT(id)
3ef0: 20 46 52 4f 4d 20 72 75 6e 73 20 57 48 45 52 45   FROM runs WHERE
3f00: 20 72 75 6e 6e 61 6d 65 20 4c 49 4b 45 20 3f 3b   runname LIKE ?;
3f10: 22 20 72 75 6e 70 61 74 74 29 0a 20 20 20 20 6e  " runpatt).    n
3f20: 75 6d 72 75 6e 73 29 29 0a 0a 0a 3b 3b 20 75 73  umruns))...;; us
3f30: 65 20 28 67 65 74 2d 76 61 6c 75 65 2d 62 79 2d  e (get-value-by-
3f40: 68 65 61 64 65 72 20 28 64 62 3a 67 65 74 2d 68  header (db:get-h
3f50: 65 61 64 65 72 20 72 75 6e 69 6e 66 6f 29 28 64  eader runinfo)(d
3f60: 62 3a 67 65 74 2d 72 6f 77 20 72 75 6e 69 6e 66  b:get-row runinf
3f70: 6f 29 29 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  o)).(define (db:
3f80: 67 65 74 2d 72 75 6e 2d 69 6e 66 6f 20 64 62 20  get-run-info db 
3f90: 72 75 6e 2d 69 64 29 0a 20 20 28 6c 65 74 2a 20  run-id).  (let* 
3fa0: 28 28 72 65 73 20 20 20 20 20 20 23 66 29 0a 09  ((res      #f)..
3fb0: 20 28 6b 65 79 73 20 20 20 20 20 20 28 64 62 2d   (keys      (db-
3fc0: 67 65 74 2d 6b 65 79 73 20 64 62 29 29 0a 09 20  get-keys db)).. 
3fd0: 28 72 65 6d 66 69 65 6c 64 73 20 28 6c 69 73 74  (remfields (list
3fe0: 20 22 69 64 22 20 22 72 75 6e 6e 61 6d 65 22 20   "id" "runname" 
3ff0: 22 73 74 61 74 65 22 20 22 73 74 61 74 75 73 22  "state" "status"
4000: 20 22 6f 77 6e 65 72 22 20 22 65 76 65 6e 74 5f   "owner" "event_
4010: 74 69 6d 65 22 29 29 0a 09 20 28 68 65 61 64 65  time")).. (heade
4020: 72 20 20 20 20 28 61 70 70 65 6e 64 20 28 6d 61  r    (append (ma
4030: 70 20 6b 65 79 3a 67 65 74 2d 66 69 65 6c 64 6e  p key:get-fieldn
4040: 61 6d 65 20 6b 65 79 73 29 0a 09 09 09 20 20 20  ame keys)....   
4050: 20 72 65 6d 66 69 65 6c 64 73 29 29 0a 09 20 28   remfields)).. (
4060: 6b 65 79 73 74 72 20 20 20 20 28 63 6f 6e 63 20  keystr    (conc 
4070: 28 6b 65 79 73 2d 3e 6b 65 79 73 74 72 20 6b 65  (keys->keystr ke
4080: 79 73 29 20 22 2c 22 0a 09 09 09 20 20 28 73 74  ys) ","....  (st
4090: 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65  ring-intersperse
40a0: 20 72 65 6d 66 69 65 6c 64 73 20 22 2c 22 29 29   remfields ","))
40b0: 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a  )).    (sqlite3:
40c0: 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20  for-each-row.   
40d0: 20 20 28 6c 61 6d 62 64 61 20 28 61 20 2e 20 78    (lambda (a . x
40e0: 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72  ).       (set! r
40f0: 65 73 20 28 61 70 70 6c 79 20 76 65 63 74 6f 72  es (apply vector
4100: 20 61 20 78 29 29 29 0a 20 20 20 20 20 64 62 0a   a x))).     db.
4110: 20 20 20 20 20 28 63 6f 6e 63 20 22 53 45 4c 45       (conc "SELE
4120: 43 54 20 22 20 6b 65 79 73 74 72 20 22 20 46 52  CT " keystr " FR
4130: 4f 4d 20 72 75 6e 73 20 57 48 45 52 45 20 69 64  OM runs WHERE id
4140: 3d 3f 3b 22 29 0a 20 20 20 20 20 72 75 6e 2d 69  =?;").     run-i
4150: 64 29 0a 20 20 20 20 28 76 65 63 74 6f 72 20 68  d).    (vector h
4160: 65 61 64 65 72 20 72 65 73 29 29 29 0a 0a 28 64  eader res)))..(d
4170: 65 66 69 6e 65 20 28 64 62 3a 73 65 74 2d 63 6f  efine (db:set-co
4180: 6d 6d 65 6e 74 2d 66 6f 72 2d 72 75 6e 20 64 62  mment-for-run db
4190: 20 72 75 6e 2d 69 64 20 63 6f 6d 6d 65 6e 74 29   run-id comment)
41a0: 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63  .  (sqlite3:exec
41b0: 75 74 65 20 64 62 20 22 55 50 44 41 54 45 20 72  ute db "UPDATE r
41c0: 75 6e 73 20 53 45 54 20 63 6f 6d 6d 65 6e 74 3d  uns SET comment=
41d0: 3f 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 63  ? WHERE id=?;" c
41e0: 6f 6d 6d 65 6e 74 20 72 75 6e 2d 69 64 29 29 0a  omment run-id)).
41f0: 0a 3b 3b 20 64 6f 65 73 20 6e 6f 74 20 28 6f 62  .;; does not (ob
4200: 76 69 6f 75 73 6c 79 21 29 20 72 65 6d 6f 76 65  viously!) remove
4210: 64 20 64 65 70 65 6e 64 65 6e 74 20 64 61 74 61  d dependent data
4220: 2e 20 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 64  . .(define (db:d
4230: 65 6c 65 74 65 2d 72 75 6e 20 64 62 20 72 75 6e  elete-run db run
4240: 2d 69 64 29 0a 20 20 28 73 71 6c 69 74 65 33 3a  -id).  (sqlite3:
4250: 65 78 65 63 75 74 65 20 64 62 20 22 44 45 4c 45  execute db "DELE
4260: 54 45 20 46 52 4f 4d 20 72 75 6e 73 20 57 48 45  TE FROM runs WHE
4270: 52 45 20 69 64 3d 3f 3b 22 20 72 75 6e 2d 69 64  RE id=?;" run-id
4280: 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  ))..(define (db:
4290: 75 70 64 61 74 65 2d 72 75 6e 2d 65 76 65 6e 74  update-run-event
42a0: 5f 74 69 6d 65 20 64 62 20 72 75 6e 2d 69 64 29  _time db run-id)
42b0: 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63  .  (sqlite3:exec
42c0: 75 74 65 20 64 62 20 22 55 50 44 41 54 45 20 72  ute db "UPDATE r
42d0: 75 6e 73 20 53 45 54 20 65 76 65 6e 74 5f 74 69  uns SET event_ti
42e0: 6d 65 3d 73 74 72 66 74 69 6d 65 28 27 25 73 27  me=strftime('%s'
42f0: 2c 27 6e 6f 77 27 29 20 57 48 45 52 45 20 69 64  ,'now') WHERE id
4300: 3d 3f 3b 22 20 72 75 6e 2d 69 64 29 29 20 0a 0a  =?;" run-id)) ..
4310: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
4320: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4330: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4340: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4350: 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 20 54 20 45  ========.;;  T E
4360: 20 53 20 54 20 53 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d   S T S.;;=======
4370: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4380: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4390: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
43a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a  ===============.
43b0: 0a 3b 3b 20 73 74 61 74 65 73 20 61 6e 64 20 73  .;; states and s
43c0: 74 61 74 75 73 65 73 20 61 72 65 20 6c 69 73 74  tatuses are list
43d0: 73 2c 20 74 75 72 6e 20 74 68 65 6d 20 69 6e 74  s, turn them int
43e0: 6f 20 28 22 50 41 53 53 22 2c 22 46 41 49 4c 22  o ("PASS","FAIL"
43f0: 2e 2e 2e 29 20 61 6e 64 20 75 73 65 20 4e 4f 54  ...) and use NOT
4400: 20 49 4e 0a 3b 3b 20 69 2e 65 2e 20 74 68 65 73   IN.;; i.e. thes
4410: 65 20 6c 69 73 74 73 20 64 65 66 69 6e 65 20 77  e lists define w
4420: 68 61 74 20 74 6f 20 4e 4f 54 20 73 68 6f 77 2e  hat to NOT show.
4430: 0a 3b 3b 20 73 74 61 74 65 73 20 61 6e 64 20 73  .;; states and s
4440: 74 61 74 75 73 65 73 20 61 72 65 20 72 65 71 75  tatuses are requ
4450: 69 72 65 64 20 74 6f 20 62 65 20 6c 69 73 74 73  ired to be lists
4460: 2c 20 65 6d 70 74 79 20 69 73 20 6f 6b 0a 28 64  , empty is ok.(d
4470: 65 66 69 6e 65 20 28 64 62 2d 67 65 74 2d 74 65  efine (db-get-te
4480: 73 74 73 2d 66 6f 72 2d 72 75 6e 20 64 62 20 72  sts-for-run db r
4490: 75 6e 2d 69 64 20 74 65 73 74 70 61 74 74 20 69  un-id testpatt i
44a0: 74 65 6d 70 61 74 74 20 73 74 61 74 65 73 20 73  tempatt states s
44b0: 74 61 74 75 73 65 73 29 0a 20 20 28 6c 65 74 20  tatuses).  (let 
44c0: 28 28 72 65 73 20 27 28 29 29 0a 09 28 73 74 61  ((res '())..(sta
44d0: 74 65 73 2d 73 74 72 20 20 20 20 28 63 6f 6e 63  tes-str    (conc
44e0: 20 22 28 27 22 20 28 73 74 72 69 6e 67 2d 69 6e   "('" (string-in
44f0: 74 65 72 73 70 65 72 73 65 20 73 74 61 74 65 73  tersperse states
4500: 20 20 20 22 27 2c 27 22 29 20 22 27 29 22 29 29     "','") "')"))
4510: 0a 09 28 73 74 61 74 75 73 65 73 2d 73 74 72 20  ..(statuses-str 
4520: 20 28 63 6f 6e 63 20 22 28 27 22 20 28 73 74 72   (conc "('" (str
4530: 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20  ing-intersperse 
4540: 73 74 61 74 75 73 65 73 20 22 27 2c 27 22 29 20  statuses "','") 
4550: 22 27 29 22 29 29 0a 09 29 0a 20 20 20 20 28 73  "')"))..).    (s
4560: 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d  qlite3:for-each-
4570: 72 6f 77 20 0a 20 20 20 20 20 28 6c 61 6d 62 64  row .     (lambd
4580: 61 20 28 69 64 20 72 75 6e 2d 69 64 20 74 65 73  a (id run-id tes
4590: 74 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61 74  tname state stat
45a0: 75 73 20 65 76 65 6e 74 2d 74 69 6d 65 20 68 6f  us event-time ho
45b0: 73 74 20 63 70 75 6c 6f 61 64 20 64 69 73 6b 66  st cpuload diskf
45c0: 72 65 65 20 75 6e 61 6d 65 20 72 75 6e 64 69 72  ree uname rundir
45d0: 20 69 74 65 6d 2d 70 61 74 68 20 72 75 6e 2d 64   item-path run-d
45e0: 75 72 61 74 69 6f 6e 20 66 69 6e 61 6c 2d 6c 6f  uration final-lo
45f0: 67 66 20 63 6f 6d 6d 65 6e 74 20 66 69 72 73 74  gf comment first
4600: 2d 65 72 72 20 66 69 72 73 74 2d 77 61 72 6e 29  -err first-warn)
4610: 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72 65  .       (set! re
4620: 73 20 28 63 6f 6e 73 20 28 76 65 63 74 6f 72 20  s (cons (vector 
4630: 69 64 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61  id run-id testna
4640: 6d 65 20 73 74 61 74 65 20 73 74 61 74 75 73 20  me state status 
4650: 65 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73 74 20  event-time host 
4660: 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65  cpuload diskfree
4670: 20 75 6e 61 6d 65 20 72 75 6e 64 69 72 20 69 74   uname rundir it
4680: 65 6d 2d 70 61 74 68 20 72 75 6e 2d 64 75 72 61  em-path run-dura
4690: 74 69 6f 6e 20 66 69 6e 61 6c 2d 6c 6f 67 66 20  tion final-logf 
46a0: 63 6f 6d 6d 65 6e 74 20 66 69 72 73 74 2d 65 72  comment first-er
46b0: 72 20 66 69 72 73 74 2d 77 61 72 6e 29 20 72 65  r first-warn) re
46c0: 73 29 29 29 0a 20 20 20 20 20 64 62 20 0a 20 20  s))).     db .  
46d0: 20 20 20 28 63 6f 6e 63 20 22 53 45 4c 45 43 54     (conc "SELECT
46e0: 20 69 64 2c 72 75 6e 5f 69 64 2c 74 65 73 74 6e   id,run_id,testn
46f0: 61 6d 65 2c 73 74 61 74 65 2c 73 74 61 74 75 73  ame,state,status
4700: 2c 65 76 65 6e 74 5f 74 69 6d 65 2c 68 6f 73 74  ,event_time,host
4710: 2c 63 70 75 6c 6f 61 64 2c 64 69 73 6b 66 72 65  ,cpuload,diskfre
4720: 65 2c 75 6e 61 6d 65 2c 72 75 6e 64 69 72 2c 69  e,uname,rundir,i
4730: 74 65 6d 5f 70 61 74 68 2c 72 75 6e 5f 64 75 72  tem_path,run_dur
4740: 61 74 69 6f 6e 2c 66 69 6e 61 6c 5f 6c 6f 67 66  ation,final_logf
4750: 2c 63 6f 6d 6d 65 6e 74 2c 66 69 72 73 74 5f 65  ,comment,first_e
4760: 72 72 2c 66 69 72 73 74 5f 77 61 72 6e 20 22 0a  rr,first_warn ".
4770: 09 20 20 20 22 20 46 52 4f 4d 20 74 65 73 74 73  .   " FROM tests
4780: 20 57 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20   WHERE run_id=? 
4790: 41 4e 44 20 74 65 73 74 6e 61 6d 65 20 6c 69 6b  AND testname lik
47a0: 65 20 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74  e ? AND item_pat
47b0: 68 20 4c 49 4b 45 20 3f 20 22 20 0a 09 20 20 20  h LIKE ? " ..   
47c0: 22 20 41 4e 44 20 4e 4f 54 20 28 73 74 61 74 65  " AND NOT (state
47d0: 20 69 6e 20 22 20 73 74 61 74 65 73 2d 73 74 72   in " states-str
47e0: 20 22 20 41 4e 44 20 73 74 61 74 75 73 20 49 4e   " AND status IN
47f0: 20 22 20 73 74 61 74 75 73 65 73 2d 73 74 72 20   " statuses-str 
4800: 22 29 20 22 0a 09 20 20 20 22 20 4f 52 44 45 52  ") "..   " ORDER
4810: 20 42 59 20 69 64 20 44 45 53 43 3b 22 29 0a 20   BY id DESC;"). 
4820: 20 20 20 20 72 75 6e 2d 69 64 0a 20 20 20 20 20      run-id.     
4830: 28 69 66 20 74 65 73 74 70 61 74 74 20 74 65 73  (if testpatt tes
4840: 74 70 61 74 74 20 22 25 22 29 0a 20 20 20 20 20  tpatt "%").     
4850: 28 69 66 20 69 74 65 6d 70 61 74 74 20 69 74 65  (if itempatt ite
4860: 6d 70 61 74 74 20 22 25 22 29 29 0a 20 20 20 20  mpatt "%")).    
4870: 72 65 73 29 29 0a 0a 3b 3b 20 74 68 69 73 20 6f  res))..;; this o
4880: 6e 65 20 69 73 20 61 20 62 69 74 20 62 72 6f 6b  ne is a bit brok
4890: 65 6e 20 42 55 47 20 46 49 58 4d 45 0a 28 64 65  en BUG FIXME.(de
48a0: 66 69 6e 65 20 28 64 62 3a 64 65 6c 65 74 65 2d  fine (db:delete-
48b0: 74 65 73 74 2d 73 74 65 70 2d 72 65 63 6f 72 64  test-step-record
48c0: 73 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74  s db run-id test
48d0: 2d 6e 61 6d 65 20 69 74 65 6d 64 61 74 29 0a 20  -name itemdat). 
48e0: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
48f0: 65 20 64 62 20 22 44 45 4c 45 54 45 20 46 52 4f  e db "DELETE FRO
4900: 4d 20 74 65 73 74 5f 73 74 65 70 73 20 57 48 45  M test_steps WHE
4910: 52 45 20 74 65 73 74 5f 69 64 20 69 6e 20 28 53  RE test_id in (S
4920: 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 74 65  ELECT id FROM te
4930: 73 74 73 20 57 48 45 52 45 20 72 75 6e 5f 69 64  sts WHERE run_id
4940: 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d  =? AND testname=
4950: 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 3d  ? AND item_path=
4960: 3f 29 3b 22 20 0a 09 09 20 20 20 72 75 6e 2d 69  ?);" ...   run-i
4970: 64 20 74 65 73 74 2d 6e 61 6d 65 20 28 69 74 65  d test-name (ite
4980: 6d 2d 6c 69 73 74 2d 3e 70 61 74 68 20 69 74 65  m-list->path ite
4990: 6d 64 61 74 29 29 29 0a 3b 3b 20 0a 28 64 65 66  mdat))).;; .(def
49a0: 69 6e 65 20 28 64 62 3a 64 65 6c 65 74 65 2d 74  ine (db:delete-t
49b0: 65 73 74 2d 72 65 63 6f 72 64 73 20 64 62 20 74  est-records db t
49c0: 65 73 74 2d 69 64 29 0a 20 20 28 73 71 6c 69 74  est-id).  (sqlit
49d0: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 44  e3:execute db "D
49e0: 45 4c 45 54 45 20 46 52 4f 4d 20 74 65 73 74 5f  ELETE FROM test_
49f0: 73 74 65 70 73 20 57 48 45 52 45 20 74 65 73 74  steps WHERE test
4a00: 5f 69 64 3d 3f 3b 22 20 74 65 73 74 2d 69 64 29  _id=?;" test-id)
4a10: 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63  .  (sqlite3:exec
4a20: 75 74 65 20 64 62 20 22 44 45 4c 45 54 45 20 46  ute db "DELETE F
4a30: 52 4f 4d 20 74 65 73 74 5f 64 61 74 61 20 20 57  ROM test_data  W
4a40: 48 45 52 45 20 74 65 73 74 5f 69 64 3d 3f 3b 22  HERE test_id=?;"
4a50: 20 74 65 73 74 2d 69 64 29 0a 20 20 28 73 71 6c   test-id).  (sql
4a60: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
4a70: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 65 73  "DELETE FROM tes
4a80: 74 73 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20  ts WHERE id=?;" 
4a90: 74 65 73 74 2d 69 64 29 29 0a 0a 3b 3b 20 73 65  test-id))..;; se
4aa0: 74 20 74 65 73 74 73 20 77 69 74 68 20 73 74 61  t tests with sta
4ab0: 74 65 20 63 75 72 72 73 74 61 74 65 20 61 6e 64  te currstate and
4ac0: 20 73 74 61 74 75 73 20 63 75 72 72 73 74 61 74   status currstat
4ad0: 75 73 20 74 6f 20 6e 65 77 73 74 61 74 65 20 61  us to newstate a
4ae0: 6e 64 20 6e 65 77 73 74 61 74 75 73 0a 3b 3b 20  nd newstatus.;; 
4af0: 75 73 65 20 63 75 72 72 73 74 61 74 65 20 3d 20  use currstate = 
4b00: 23 66 20 61 6e 64 20 6f 72 20 63 75 72 72 73 74  #f and or currst
4b10: 61 74 75 73 20 3d 20 23 66 20 74 6f 20 61 70 70  atus = #f to app
4b20: 6c 79 20 74 6f 20 61 6e 79 20 73 74 61 74 65 20  ly to any state 
4b30: 6f 72 20 73 74 61 74 75 73 20 72 65 73 70 65 63  or status respec
4b40: 74 69 76 65 6c 79 0a 3b 3b 20 57 41 52 4e 49 4e  tively.;; WARNIN
4b50: 47 3a 20 53 51 4c 20 69 6e 6a 65 63 74 69 6f 6e  G: SQL injection
4b60: 20 72 69 73 6b 0a 28 64 65 66 69 6e 65 20 28 64   risk.(define (d
4b70: 62 3a 73 65 74 2d 74 65 73 74 73 2d 73 74 61 74  b:set-tests-stat
4b80: 65 2d 73 74 61 74 75 73 20 64 62 20 72 75 6e 2d  e-status db run-
4b90: 69 64 20 74 65 73 74 6e 61 6d 65 73 20 63 75 72  id testnames cur
4ba0: 72 73 74 61 74 65 20 63 75 72 72 73 74 61 74 75  rstate currstatu
4bb0: 73 20 6e 65 77 73 74 61 74 65 20 6e 65 77 73 74  s newstate newst
4bc0: 61 74 75 73 29 0a 20 20 28 66 6f 72 2d 65 61 63  atus).  (for-eac
4bd0: 68 20 28 6c 61 6d 62 64 61 20 28 74 65 73 74 6e  h (lambda (testn
4be0: 61 6d 65 29 0a 09 20 20 20 20 20 20 28 6c 65 74  ame)..      (let
4bf0: 20 28 28 71 72 79 20 28 63 6f 6e 63 20 22 55 50   ((qry (conc "UP
4c00: 44 41 54 45 20 74 65 73 74 73 20 53 45 54 20 73  DATE tests SET s
4c10: 74 61 74 65 3d 3f 2c 73 74 61 74 75 73 3d 3f 20  tate=?,status=? 
4c20: 57 48 45 52 45 20 22 0a 09 09 09 09 09 28 69 66  WHERE "......(if
4c30: 20 63 75 72 72 73 74 61 74 65 20 20 28 63 6f 6e   currstate  (con
4c40: 63 20 22 73 74 61 74 65 3d 27 22 20 63 75 72 72  c "state='" curr
4c50: 73 74 61 74 65 20 22 27 20 41 4e 44 20 22 29 20  state "' AND ") 
4c60: 22 22 29 0a 09 09 09 09 09 28 69 66 20 63 75 72  "")......(if cur
4c70: 72 73 74 61 74 75 73 20 28 63 6f 6e 63 20 22 73  rstatus (conc "s
4c80: 74 61 74 75 73 3d 27 22 20 63 75 72 72 73 74 61  tatus='" currsta
4c90: 74 75 73 20 22 27 20 41 4e 44 20 22 29 20 22 22  tus "' AND ") ""
4ca0: 29 0a 09 09 09 09 09 22 20 72 75 6e 5f 69 64 3d  )......" run_id=
4cb0: 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f  ? AND testname=?
4cc0: 20 41 4e 44 20 4e 4f 54 20 28 69 74 65 6d 5f 70   AND NOT (item_p
4cd0: 61 74 68 3d 27 27 20 41 4e 44 20 74 65 73 74 6e  ath='' AND testn
4ce0: 61 6d 65 20 69 6e 20 28 53 45 4c 45 43 54 20 44  ame in (SELECT D
4cf0: 49 53 54 49 4e 43 54 20 74 65 73 74 6e 61 6d 65  ISTINCT testname
4d00: 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52   FROM tests WHER
4d10: 45 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44  E testname=? AND
4d20: 20 69 74 65 6d 5f 70 61 74 68 20 21 3d 20 27 27   item_path != ''
4d30: 29 29 3b 22 29 29 29 0a 09 09 3b 3b 28 64 65 62  ));")))...;;(deb
4d40: 75 67 3a 70 72 69 6e 74 20 30 20 22 51 52 59 3a  ug:print 0 "QRY:
4d50: 20 22 20 71 72 79 29 0a 09 09 28 73 71 6c 69 74   " qry)...(sqlit
4d60: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 71 72  e3:execute db qr
4d70: 79 20 72 75 6e 2d 69 64 20 6e 65 77 73 74 61 74  y run-id newstat
4d80: 65 20 6e 65 77 73 74 61 74 75 73 20 74 65 73 74  e newstatus test
4d90: 6e 61 6d 65 20 74 65 73 74 6e 61 6d 65 29 29 29  name testname)))
4da0: 0a 09 20 20 20 20 74 65 73 74 6e 61 6d 65 73 29  ..    testnames)
4db0: 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 64  )..(define (db:d
4dc0: 65 6c 65 74 65 2d 74 65 73 74 73 2d 69 6e 2d 73  elete-tests-in-s
4dd0: 74 61 74 65 20 64 62 20 72 75 6e 2d 69 64 20 73  tate db run-id s
4de0: 74 61 74 65 29 0a 20 20 28 73 71 6c 69 74 65 33  tate).  (sqlite3
4df0: 3a 65 78 65 63 75 74 65 20 64 62 20 22 44 45 4c  :execute db "DEL
4e00: 45 54 45 20 46 52 4f 4d 20 74 65 73 74 73 20 57  ETE FROM tests W
4e10: 48 45 52 45 20 73 74 61 74 65 3d 3f 20 41 4e 44  HERE state=? AND
4e20: 20 72 75 6e 5f 69 64 3d 3f 3b 22 20 73 74 61 74   run_id=?;" stat
4e30: 65 20 72 75 6e 2d 69 64 29 29 0a 0a 28 64 65 66  e run-id))..(def
4e40: 69 6e 65 20 28 64 62 3a 74 65 73 74 2d 73 65 74  ine (db:test-set
4e50: 2d 73 74 61 74 65 2d 73 74 61 74 75 73 2d 62 79  -state-status-by
4e60: 2d 69 64 20 64 62 20 74 65 73 74 2d 69 64 20 6e  -id db test-id n
4e70: 65 77 73 74 61 74 65 20 6e 65 77 73 74 61 74 75  ewstate newstatu
4e80: 73 20 6e 65 77 63 6f 6d 6d 65 6e 74 29 0a 20 20  s newcomment).  
4e90: 28 69 66 20 6e 65 77 73 74 61 74 65 20 20 20 28  (if newstate   (
4ea0: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
4eb0: 64 62 20 22 55 50 44 41 54 45 20 74 65 73 74 73  db "UPDATE tests
4ec0: 20 53 45 54 20 73 74 61 74 65 3d 3f 20 20 20 57   SET state=?   W
4ed0: 48 45 52 45 20 69 64 3d 3f 3b 22 20 6e 65 77 73  HERE id=?;" news
4ee0: 74 61 74 65 20 20 20 74 65 73 74 2d 69 64 29 29  tate   test-id))
4ef0: 0a 20 20 28 69 66 20 6e 65 77 73 74 61 74 75 73  .  (if newstatus
4f00: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
4f10: 74 65 20 64 62 20 22 55 50 44 41 54 45 20 74 65  te db "UPDATE te
4f20: 73 74 73 20 53 45 54 20 73 74 61 74 75 73 3d 3f  sts SET status=?
4f30: 20 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 6e    WHERE id=?;" n
4f40: 65 77 73 74 61 74 75 73 20 20 74 65 73 74 2d 69  ewstatus  test-i
4f50: 64 29 29 0a 20 20 28 69 66 20 6e 65 77 63 6f 6d  d)).  (if newcom
4f60: 6d 65 6e 74 20 28 73 71 6c 69 74 65 33 3a 65 78  ment (sqlite3:ex
4f70: 65 63 75 74 65 20 64 62 20 22 55 50 44 41 54 45  ecute db "UPDATE
4f80: 20 74 65 73 74 73 20 53 45 54 20 63 6f 6d 6d 65   tests SET comme
4f90: 6e 74 3d 3f 20 57 48 45 52 45 20 69 64 3d 3f 3b  nt=? WHERE id=?;
4fa0: 22 20 6e 65 77 63 6f 6d 6d 65 6e 74 20 74 65 73  " newcomment tes
4fb0: 74 2d 69 64 29 29 29 0a 0a 28 64 65 66 69 6e 65  t-id)))..(define
4fc0: 20 28 64 62 3a 67 65 74 2d 63 6f 75 6e 74 2d 74   (db:get-count-t
4fd0: 65 73 74 73 2d 72 75 6e 6e 69 6e 67 20 64 62 29  ests-running db)
4fe0: 0a 20 20 28 6c 65 74 20 28 28 72 65 73 20 30 29  .  (let ((res 0)
4ff0: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66  ).    (sqlite3:f
5000: 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 20  or-each-row.    
5010: 20 28 6c 61 6d 62 64 61 20 28 63 6f 75 6e 74 29   (lambda (count)
5020: 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72 65  .       (set! re
5030: 73 20 63 6f 75 6e 74 29 29 0a 20 20 20 20 20 64  s count)).     d
5040: 62 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20 63  b.     "SELECT c
5050: 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 74 65  ount(id) FROM te
5060: 73 74 73 20 57 48 45 52 45 20 73 74 61 74 65 20  sts WHERE state 
5070: 3d 20 27 52 55 4e 4e 49 4e 47 27 20 4f 52 20 73  = 'RUNNING' OR s
5080: 74 61 74 65 20 3d 20 27 4c 41 55 4e 43 48 45 44  tate = 'LAUNCHED
5090: 27 20 4f 52 20 73 74 61 74 65 20 3d 20 27 52 45  ' OR state = 'RE
50a0: 4d 4f 54 45 48 4f 53 54 53 54 41 52 54 27 3b 22  MOTEHOSTSTART';"
50b0: 29 0a 20 20 20 20 72 65 73 29 29 0a 0a 3b 3b 20  ).    res))..;; 
50c0: 64 6f 6e 65 20 77 69 74 68 20 72 75 6e 20 77 68  done with run wh
50d0: 65 6e 3a 0a 3b 3b 20 20 20 30 20 74 65 73 74 73  en:.;;   0 tests
50e0: 20 69 6e 20 4c 41 55 4e 43 48 45 44 2c 20 4e 4f   in LAUNCHED, NO
50f0: 54 5f 53 54 41 52 54 45 44 2c 20 52 45 4d 4f 54  T_STARTED, REMOT
5100: 45 48 4f 53 54 53 54 41 52 54 2c 20 52 55 4e 4e  EHOSTSTART, RUNN
5110: 49 4e 47 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  ING.(define (db:
5120: 65 73 74 69 6d 61 74 65 64 2d 74 65 73 74 73 2d  estimated-tests-
5130: 72 65 6d 61 69 6e 69 6e 67 20 64 62 20 72 75 6e  remaining db run
5140: 2d 69 64 29 0a 20 20 28 6c 65 74 20 28 28 72 65  -id).  (let ((re
5150: 73 20 30 29 29 0a 20 20 20 20 28 73 71 6c 69 74  s 0)).    (sqlit
5160: 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a  e3:for-each-row.
5170: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 63 6f       (lambda (co
5180: 75 6e 74 29 0a 20 20 20 20 20 20 20 28 73 65 74  unt).       (set
5190: 21 20 72 65 73 20 63 6f 75 6e 74 29 29 0a 20 20  ! res count)).  
51a0: 20 20 20 64 62 20 3b 3b 20 4e 42 2f 2f 20 4b 49     db ;; NB// KI
51b0: 4c 4c 52 45 51 20 6d 65 61 6e 73 20 74 68 65 20  LLREQ means the 
51c0: 6a 6f 62 73 20 69 73 20 73 74 69 6c 6c 20 70 72  jobs is still pr
51d0: 6f 62 61 62 6c 79 20 72 75 6e 6e 69 6e 67 0a 20  obably running. 
51e0: 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e      "SELECT coun
51f0: 74 28 69 64 29 20 46 52 4f 4d 20 74 65 73 74 73  t(id) FROM tests
5200: 20 57 48 45 52 45 20 73 74 61 74 65 20 69 6e 20   WHERE state in 
5210: 28 27 4c 41 55 4e 43 48 45 44 27 2c 27 4e 4f 54  ('LAUNCHED','NOT
5220: 5f 53 54 41 52 54 45 44 27 2c 27 52 45 4d 4f 54  _STARTED','REMOT
5230: 45 48 4f 53 54 53 54 41 52 54 27 2c 27 52 55 4e  EHOSTSTART','RUN
5240: 4e 49 4e 47 27 2c 27 4b 49 4c 4c 52 45 51 27 29  NING','KILLREQ')
5250: 20 41 4e 44 20 72 75 6e 5f 69 64 3d 3f 3b 22 20   AND run_id=?;" 
5260: 72 75 6e 2d 69 64 29 0a 20 20 20 20 72 65 73 29  run-id).    res)
5270: 29 0a 0a 3b 3b 20 4e 42 2f 2f 20 53 79 6e 63 20  )..;; NB// Sync 
5280: 74 68 69 73 20 77 69 74 68 20 72 75 6e 73 3a 67  this with runs:g
5290: 65 74 2d 74 65 73 74 2d 69 6e 66 6f 0a 28 64 65  et-test-info.(de
52a0: 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 74 65 73  fine (db:get-tes
52b0: 74 2d 69 6e 66 6f 20 64 62 20 72 75 6e 2d 69 64  t-info db run-id
52c0: 20 74 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70   testname item-p
52d0: 61 74 68 29 0a 20 20 28 6c 65 74 20 28 28 72 65  ath).  (let ((re
52e0: 73 20 23 66 29 29 0a 20 20 20 20 28 73 71 6c 69  s #f)).    (sqli
52f0: 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77  te3:for-each-row
5300: 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 69  .     (lambda (i
5310: 64 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d  d run-id testnam
5320: 65 20 73 74 61 74 65 20 73 74 61 74 75 73 20 65  e state status e
5330: 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73 74 20 63  vent-time host c
5340: 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20  puload diskfree 
5350: 75 6e 61 6d 65 20 72 75 6e 64 69 72 20 69 74 65  uname rundir ite
5360: 6d 2d 70 61 74 68 20 72 75 6e 5f 64 75 72 61 74  m-path run_durat
5370: 69 6f 6e 20 66 69 6e 61 6c 5f 6c 6f 67 66 20 63  ion final_logf c
5380: 6f 6d 6d 65 6e 74 20 66 69 72 73 74 2d 65 72 72  omment first-err
5390: 20 66 69 72 73 74 2d 77 61 72 6e 29 0a 20 20 20   first-warn).   
53a0: 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28 76      (set! res (v
53b0: 65 63 74 6f 72 20 69 64 20 72 75 6e 2d 69 64 20  ector id run-id 
53c0: 74 65 73 74 6e 61 6d 65 20 73 74 61 74 65 20 73  testname state s
53d0: 74 61 74 75 73 20 65 76 65 6e 74 2d 74 69 6d 65  tatus event-time
53e0: 20 68 6f 73 74 20 63 70 75 6c 6f 61 64 20 64 69   host cpuload di
53f0: 73 6b 66 72 65 65 20 75 6e 61 6d 65 20 72 75 6e  skfree uname run
5400: 64 69 72 20 69 74 65 6d 2d 70 61 74 68 20 72 75  dir item-path ru
5410: 6e 5f 64 75 72 61 74 69 6f 6e 20 66 69 6e 61 6c  n_duration final
5420: 5f 6c 6f 67 66 20 63 6f 6d 6d 65 6e 74 20 66 69  _logf comment fi
5430: 72 73 74 2d 65 72 72 20 66 69 72 73 74 2d 77 61  rst-err first-wa
5440: 72 6e 29 29 29 0a 20 20 20 20 20 64 62 20 0a 20  rn))).     db . 
5450: 20 20 20 20 22 53 45 4c 45 43 54 20 69 64 2c 72      "SELECT id,r
5460: 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d 65 2c 73  un_id,testname,s
5470: 74 61 74 65 2c 73 74 61 74 75 73 2c 65 76 65 6e  tate,status,even
5480: 74 5f 74 69 6d 65 2c 68 6f 73 74 2c 63 70 75 6c  t_time,host,cpul
5490: 6f 61 64 2c 64 69 73 6b 66 72 65 65 2c 75 6e 61  oad,diskfree,una
54a0: 6d 65 2c 72 75 6e 64 69 72 2c 69 74 65 6d 5f 70  me,rundir,item_p
54b0: 61 74 68 2c 72 75 6e 5f 64 75 72 61 74 69 6f 6e  ath,run_duration
54c0: 2c 66 69 6e 61 6c 5f 6c 6f 67 66 2c 63 6f 6d 6d  ,final_logf,comm
54d0: 65 6e 74 2c 66 69 72 73 74 5f 65 72 72 2c 66 69  ent,first_err,fi
54e0: 72 73 74 5f 77 61 72 6e 20 46 52 4f 4d 20 74 65  rst_warn FROM te
54f0: 73 74 73 20 57 48 45 52 45 20 72 75 6e 5f 69 64  sts WHERE run_id
5500: 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d  =? AND testname=
5510: 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 3d  ? AND item_path=
5520: 3f 3b 22 0a 20 20 20 20 20 72 75 6e 2d 69 64 20  ?;".     run-id 
5530: 74 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61  testname item-pa
5540: 74 68 29 0a 20 20 20 20 72 65 73 29 29 0a 0a 3b  th).    res))..;
5550: 3b 20 47 65 74 20 74 65 73 74 20 64 61 74 61 20  ; Get test data 
5560: 75 73 69 6e 67 20 74 65 73 74 5f 69 64 0a 28 64  using test_id.(d
5570: 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 74 65  efine (db:get-te
5580: 73 74 2d 64 61 74 61 2d 62 79 2d 69 64 20 64 62  st-data-by-id db
5590: 20 74 65 73 74 2d 69 64 29 0a 20 20 28 6c 65 74   test-id).  (let
55a0: 20 28 28 72 65 73 20 23 66 29 29 0a 20 20 20 20   ((res #f)).    
55b0: 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63  (sqlite3:for-eac
55c0: 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c 61 6d 62  h-row.     (lamb
55d0: 64 61 20 28 69 64 20 72 75 6e 2d 69 64 20 74 65  da (id run-id te
55e0: 73 74 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61  stname state sta
55f0: 74 75 73 20 65 76 65 6e 74 2d 74 69 6d 65 20 68  tus event-time h
5600: 6f 73 74 20 63 70 75 6c 6f 61 64 20 64 69 73 6b  ost cpuload disk
5610: 66 72 65 65 20 75 6e 61 6d 65 20 72 75 6e 64 69  free uname rundi
5620: 72 20 69 74 65 6d 2d 70 61 74 68 20 72 75 6e 5f  r item-path run_
5630: 64 75 72 61 74 69 6f 6e 20 66 69 6e 61 6c 5f 6c  duration final_l
5640: 6f 67 66 20 63 6f 6d 6d 65 6e 74 20 66 69 72 73  ogf comment firs
5650: 74 2d 65 72 72 20 66 69 72 73 74 2d 77 61 72 6e  t-err first-warn
5660: 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72  ).       (set! r
5670: 65 73 20 28 76 65 63 74 6f 72 20 69 64 20 72 75  es (vector id ru
5680: 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 73 74  n-id testname st
5690: 61 74 65 20 73 74 61 74 75 73 20 65 76 65 6e 74  ate status event
56a0: 2d 74 69 6d 65 20 68 6f 73 74 20 63 70 75 6c 6f  -time host cpulo
56b0: 61 64 20 64 69 73 6b 66 72 65 65 20 75 6e 61 6d  ad diskfree unam
56c0: 65 20 72 75 6e 64 69 72 20 69 74 65 6d 2d 70 61  e rundir item-pa
56d0: 74 68 20 72 75 6e 5f 64 75 72 61 74 69 6f 6e 20  th run_duration 
56e0: 66 69 6e 61 6c 5f 6c 6f 67 66 20 63 6f 6d 6d 65  final_logf comme
56f0: 6e 74 20 66 69 72 73 74 2d 65 72 72 20 66 69 72  nt first-err fir
5700: 73 74 2d 77 61 72 6e 29 29 29 0a 20 20 20 20 20  st-warn))).     
5710: 64 62 20 0a 20 20 20 20 20 22 53 45 4c 45 43 54  db .     "SELECT
5720: 20 69 64 2c 72 75 6e 5f 69 64 2c 74 65 73 74 6e   id,run_id,testn
5730: 61 6d 65 2c 73 74 61 74 65 2c 73 74 61 74 75 73  ame,state,status
5740: 2c 65 76 65 6e 74 5f 74 69 6d 65 2c 68 6f 73 74  ,event_time,host
5750: 2c 63 70 75 6c 6f 61 64 2c 64 69 73 6b 66 72 65  ,cpuload,diskfre
5760: 65 2c 75 6e 61 6d 65 2c 72 75 6e 64 69 72 2c 69  e,uname,rundir,i
5770: 74 65 6d 5f 70 61 74 68 2c 72 75 6e 5f 64 75 72  tem_path,run_dur
5780: 61 74 69 6f 6e 2c 66 69 6e 61 6c 5f 6c 6f 67 66  ation,final_logf
5790: 2c 63 6f 6d 6d 65 6e 74 2c 66 69 72 73 74 5f 65  ,comment,first_e
57a0: 72 72 2c 66 69 72 73 74 5f 77 61 72 6e 20 46 52  rr,first_warn FR
57b0: 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 69  OM tests WHERE i
57c0: 64 3d 3f 3b 22 0a 20 20 20 20 20 74 65 73 74 2d  d=?;".     test-
57d0: 69 64 29 0a 20 20 20 20 72 65 73 29 29 0a 0a 0a  id).    res))...
57e0: 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74  (define (db:test
57f0: 2d 73 65 74 2d 63 6f 6d 6d 65 6e 74 20 64 62 20  -set-comment db 
5800: 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20  run-id testname 
5810: 69 74 65 6d 2d 70 61 74 68 20 63 6f 6d 6d 65 6e  item-path commen
5820: 74 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78  t).  (sqlite3:ex
5830: 65 63 75 74 65 20 0a 20 20 20 64 62 20 0a 20 20  ecute .   db .  
5840: 20 22 55 50 44 41 54 45 20 74 65 73 74 73 20 53   "UPDATE tests S
5850: 45 54 20 63 6f 6d 6d 65 6e 74 3d 3f 20 57 48 45  ET comment=? WHE
5860: 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20  RE run_id=? AND 
5870: 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69  testname=? AND i
5880: 74 65 6d 5f 70 61 74 68 3d 3f 3b 22 0a 20 20 20  tem_path=?;".   
5890: 20 20 63 6f 6d 6d 65 6e 74 20 72 75 6e 2d 69 64    comment run-id
58a0: 20 74 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70   testname item-p
58b0: 61 74 68 29 29 0a 0a 3b 3b 0a 28 64 65 66 69 6e  ath))..;;.(defin
58c0: 65 20 28 64 62 3a 74 65 73 74 2d 73 65 74 2d 72  e (db:test-set-r
58d0: 75 6e 64 69 72 21 20 64 62 20 72 75 6e 2d 69 64  undir! db run-id
58e0: 20 74 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70   testname item-p
58f0: 61 74 68 20 72 75 6e 64 69 72 29 0a 20 20 28 73  ath rundir).  (s
5900: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 0a  qlite3:execute .
5910: 20 20 20 64 62 20 0a 20 20 20 22 55 50 44 41 54     db .   "UPDAT
5920: 45 20 74 65 73 74 73 20 53 45 54 20 72 75 6e 64  E tests SET rund
5930: 69 72 3d 3f 20 57 48 45 52 45 20 72 75 6e 5f 69  ir=? WHERE run_i
5940: 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65  d=? AND testname
5950: 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68  =? AND item_path
5960: 3d 3f 3b 22 0a 20 20 20 20 20 72 75 6e 64 69 72  =?;".     rundir
5970: 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65   run-id testname
5980: 20 69 74 65 6d 2d 70 61 74 68 29 29 0a 0a 3b 3b   item-path))..;;
5990: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
59a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
59b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
59c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
59d0: 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 54 65 73 74 73 20  ======.;; Tests 
59e0: 6d 65 74 61 20 64 61 74 61 0a 3b 3b 3d 3d 3d 3d  meta data.;;====
59f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5a00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5a10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5a20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5a30: 3d 3d 0a 0a 3b 3b 20 72 65 61 64 20 74 68 65 20  ==..;; read the 
5a40: 72 65 63 6f 72 64 20 67 69 76 65 6e 20 61 20 74  record given a t
5a50: 65 73 74 6e 61 6d 65 0a 28 64 65 66 69 6e 65 20  estname.(define 
5a60: 28 64 62 3a 74 65 73 74 6d 65 74 61 2d 67 65 74  (db:testmeta-get
5a70: 2d 72 65 63 6f 72 64 20 64 62 20 74 65 73 74 6e  -record db testn
5a80: 61 6d 65 29 0a 20 20 28 6c 65 74 20 28 28 72 65  ame).  (let ((re
5a90: 73 20 23 66 29 29 0a 20 20 20 20 28 73 71 6c 69  s #f)).    (sqli
5aa0: 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77  te3:for-each-row
5ab0: 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 69  .     (lambda (i
5ac0: 64 20 74 65 73 74 6e 61 6d 65 20 61 75 74 68 6f  d testname autho
5ad0: 72 20 6f 77 6e 65 72 20 64 65 73 63 72 69 70 74  r owner descript
5ae0: 69 6f 6e 20 72 65 76 69 65 77 65 64 20 69 74 65  ion reviewed ite
5af0: 72 61 74 65 64 20 61 76 67 5f 72 75 6e 74 69 6d  rated avg_runtim
5b00: 65 20 61 76 67 5f 64 69 73 6b 20 74 61 67 73 29  e avg_disk tags)
5b10: 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72 65  .       (set! re
5b20: 73 20 28 76 65 63 74 6f 72 20 69 64 20 74 65 73  s (vector id tes
5b30: 74 6e 61 6d 65 20 61 75 74 68 6f 72 20 6f 77 6e  tname author own
5b40: 65 72 20 64 65 73 63 72 69 70 74 69 6f 6e 20 72  er description r
5b50: 65 76 69 65 77 65 64 20 69 74 65 72 61 74 65 64  eviewed iterated
5b60: 20 61 76 67 5f 72 75 6e 74 69 6d 65 20 61 76 67   avg_runtime avg
5b70: 5f 64 69 73 6b 20 74 61 67 73 29 29 29 0a 20 20  _disk tags))).  
5b80: 20 20 20 64 62 20 22 53 45 4c 45 43 54 20 69 64     db "SELECT id
5b90: 2c 74 65 73 74 6e 61 6d 65 2c 61 75 74 68 6f 72  ,testname,author
5ba0: 2c 6f 77 6e 65 72 2c 64 65 73 63 72 69 70 74 69  ,owner,descripti
5bb0: 6f 6e 2c 72 65 76 69 65 77 65 64 2c 69 74 65 72  on,reviewed,iter
5bc0: 61 74 65 64 2c 61 76 67 5f 72 75 6e 74 69 6d 65  ated,avg_runtime
5bd0: 2c 61 76 67 5f 64 69 73 6b 2c 74 61 67 73 20 46  ,avg_disk,tags F
5be0: 52 4f 4d 20 74 65 73 74 5f 6d 65 74 61 20 57 48  ROM test_meta WH
5bf0: 45 52 45 20 74 65 73 74 6e 61 6d 65 3d 3f 3b 22  ERE testname=?;"
5c00: 0a 20 20 20 20 20 74 65 73 74 6e 61 6d 65 29 0a  .     testname).
5c10: 20 20 20 20 72 65 73 29 29 0a 0a 3b 3b 20 63 72      res))..;; cr
5c20: 65 61 74 65 20 61 20 6e 65 77 20 72 65 63 6f 72  eate a new recor
5c30: 64 20 66 6f 72 20 61 20 67 69 76 65 6e 20 74 65  d for a given te
5c40: 73 74 6e 61 6d 65 0a 28 64 65 66 69 6e 65 20 28  stname.(define (
5c50: 64 62 3a 74 65 73 74 6d 65 74 61 2d 61 64 64 2d  db:testmeta-add-
5c60: 72 65 63 6f 72 64 20 64 62 20 74 65 73 74 6e 61  record db testna
5c70: 6d 65 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65  me).  (sqlite3:e
5c80: 78 65 63 75 74 65 20 64 62 20 22 49 4e 53 45 52  xecute db "INSER
5c90: 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f  T OR IGNORE INTO
5ca0: 20 74 65 73 74 5f 6d 65 74 61 20 28 74 65 73 74   test_meta (test
5cb0: 6e 61 6d 65 2c 61 75 74 68 6f 72 2c 6f 77 6e 65  name,author,owne
5cc0: 72 2c 64 65 73 63 72 69 70 74 69 6f 6e 2c 72 65  r,description,re
5cd0: 76 69 65 77 65 64 2c 69 74 65 72 61 74 65 64 2c  viewed,iterated,
5ce0: 61 76 67 5f 72 75 6e 74 69 6d 65 2c 61 76 67 5f  avg_runtime,avg_
5cf0: 64 69 73 6b 2c 74 61 67 73 29 20 56 41 4c 55 45  disk,tags) VALUE
5d00: 53 20 28 3f 2c 27 27 2c 27 27 2c 27 27 2c 27 27  S (?,'','','',''
5d10: 2c 27 27 2c 27 27 2c 27 27 2c 27 27 29 3b 22 20  ,'','','','');" 
5d20: 74 65 73 74 6e 61 6d 65 29 29 0a 0a 3b 3b 20 75  testname))..;; u
5d30: 70 64 61 74 65 20 6f 6e 65 20 6f 66 20 74 68 65  pdate one of the
5d40: 20 74 65 73 74 6d 65 74 61 20 66 69 65 6c 64 73   testmeta fields
5d50: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73  .(define (db:tes
5d60: 74 6d 65 74 61 2d 75 70 64 61 74 65 2d 66 69 65  tmeta-update-fie
5d70: 6c 64 20 64 62 20 74 65 73 74 6e 61 6d 65 20 66  ld db testname f
5d80: 69 65 6c 64 20 76 61 6c 75 65 29 0a 20 20 28 73  ield value).  (s
5d90: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64  qlite3:execute d
5da0: 62 20 28 63 6f 6e 63 20 22 55 50 44 41 54 45 20  b (conc "UPDATE 
5db0: 74 65 73 74 5f 6d 65 74 61 20 53 45 54 20 22 20  test_meta SET " 
5dc0: 66 69 65 6c 64 20 22 3d 3f 20 57 48 45 52 45 20  field "=? WHERE 
5dd0: 74 65 73 74 6e 61 6d 65 3d 3f 3b 22 29 20 76 61  testname=?;") va
5de0: 6c 75 65 20 74 65 73 74 6e 61 6d 65 29 29 0a 0a  lue testname))..
5df0: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
5e00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5e10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5e20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5e30: 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 54 20 45 20  ========.;; T E 
5e40: 53 20 54 20 20 20 44 20 41 20 54 20 41 20 0a 3b  S T   D A T A .;
5e50: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;===============
5e60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5e70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5e80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5e90: 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65 66 69 6e 65  =======..(define
5ea0: 20 28 64 62 3a 63 73 76 2d 3e 74 65 73 74 2d 64   (db:csv->test-d
5eb0: 61 74 61 20 64 62 20 74 65 73 74 2d 69 64 20 63  ata db test-id c
5ec0: 73 76 64 61 74 61 29 0a 20 20 28 64 65 62 75 67  svdata).  (debug
5ed0: 3a 70 72 69 6e 74 20 34 20 22 74 65 73 74 2d 69  :print 4 "test-i
5ee0: 64 20 22 20 74 65 73 74 2d 69 64 20 22 2c 20 63  d " test-id ", c
5ef0: 73 76 64 61 74 61 3a 20 22 20 63 73 76 64 61 74  svdata: " csvdat
5f00: 61 29 0a 20 20 28 6c 65 74 20 28 28 63 73 76 6c  a).  (let ((csvl
5f10: 69 73 74 20 28 63 73 76 2d 3e 6c 69 73 74 20 28  ist (csv->list (
5f20: 6d 61 6b 65 2d 63 73 76 2d 72 65 61 64 65 72 0a  make-csv-reader.
5f30: 09 09 09 20 20 20 20 20 28 6f 70 65 6e 2d 69 6e  ...     (open-in
5f40: 70 75 74 2d 73 74 72 69 6e 67 20 63 73 76 64 61  put-string csvda
5f50: 74 61 29 0a 09 09 09 20 20 20 20 20 27 28 28 73  ta)....     '((s
5f60: 74 72 69 70 2d 6c 65 61 64 69 6e 67 2d 77 68 69  trip-leading-whi
5f70: 74 65 73 70 61 63 65 3f 20 23 74 29 0a 09 09 09  tespace? #t)....
5f80: 20 20 20 20 20 20 20 28 73 74 72 69 70 2d 74 72         (strip-tr
5f90: 61 69 6c 69 6e 67 2d 77 68 69 74 65 73 70 61 63  ailing-whitespac
5fa0: 65 3f 20 23 74 29 29 20 29 29 29 29 20 3b 3b 20  e? #t)) )))) ;; 
5fb0: 28 63 73 76 2d 3e 6c 69 73 74 20 63 73 76 64 61  (csv->list csvda
5fc0: 74 61 29 29 29 0a 20 20 20 20 28 66 6f 72 2d 65  ta))).    (for-e
5fd0: 61 63 68 20 0a 20 20 20 20 20 28 6c 61 6d 62 64  ach .     (lambd
5fe0: 61 20 28 63 73 76 72 6f 77 29 0a 20 20 20 20 20  a (csvrow).     
5ff0: 20 20 28 6c 65 74 2a 20 28 28 70 61 64 64 65 64    (let* ((padded
6000: 2d 72 6f 77 20 20 28 74 61 6b 65 20 28 61 70 70  -row  (take (app
6010: 65 6e 64 20 63 73 76 72 6f 77 20 28 6c 69 73 74  end csvrow (list
6020: 20 23 66 20 23 66 20 23 66 20 23 66 20 23 66 20   #f #f #f #f #f 
6030: 23 66 20 23 66 20 23 66 29 29 20 38 29 29 0a 09  #f #f #f)) 8))..
6040: 20 20 20 20 20 20 28 63 61 74 65 67 6f 72 79 20        (category 
6050: 20 20 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64     (list-ref pad
6060: 64 65 64 2d 72 6f 77 20 30 29 29 0a 09 20 20 20  ded-row 0))..   
6070: 20 20 20 28 76 61 72 69 61 62 6c 65 20 20 20 20     (variable    
6080: 28 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65 64  (list-ref padded
6090: 2d 72 6f 77 20 31 29 29 0a 09 20 20 20 20 20 20  -row 1))..      
60a0: 28 76 61 6c 75 65 20 20 20 20 20 20 20 28 61 6e  (value       (an
60b0: 79 2d 3e 6e 75 6d 62 65 72 2d 69 66 2d 70 6f 73  y->number-if-pos
60c0: 73 69 62 6c 65 20 28 6c 69 73 74 2d 72 65 66 20  sible (list-ref 
60d0: 70 61 64 64 65 64 2d 72 6f 77 20 32 29 29 29 0a  padded-row 2))).
60e0: 09 20 20 20 20 20 20 28 65 78 70 65 63 74 65 64  .      (expected
60f0: 20 20 20 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72      (any->number
6100: 2d 69 66 2d 70 6f 73 73 69 62 6c 65 20 28 6c 69  -if-possible (li
6110: 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f  st-ref padded-ro
6120: 77 20 33 29 29 29 0a 09 20 20 20 20 20 20 28 74  w 3)))..      (t
6130: 6f 6c 20 20 20 20 20 20 20 20 20 28 61 6e 79 2d  ol         (any-
6140: 3e 6e 75 6d 62 65 72 2d 69 66 2d 70 6f 73 73 69  >number-if-possi
6150: 62 6c 65 20 28 6c 69 73 74 2d 72 65 66 20 70 61  ble (list-ref pa
6160: 64 64 65 64 2d 72 6f 77 20 34 29 29 29 20 3b 3b  dded-row 4))) ;;
6170: 20 3e 2c 20 3c 2c 20 3e 3d 2c 20 3c 3d 2c 20 6f   >, <, >=, <=, o
6180: 72 20 61 20 6e 75 6d 62 65 72 0a 09 20 20 20 20  r a number..    
6190: 20 20 28 75 6e 69 74 73 20 20 20 20 20 20 20 28    (units       (
61a0: 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d  list-ref padded-
61b0: 72 6f 77 20 35 29 29 0a 09 20 20 20 20 20 20 28  row 5))..      (
61c0: 63 6f 6d 6d 65 6e 74 20 20 20 20 20 28 6c 69 73  comment     (lis
61d0: 74 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77  t-ref padded-row
61e0: 20 36 29 29 0a 09 20 20 20 20 20 20 28 73 74 61   6))..      (sta
61f0: 74 75 73 20 20 20 20 20 20 28 6c 65 74 20 28 28  tus      (let ((
6200: 73 20 28 6c 69 73 74 2d 72 65 66 20 70 61 64 64  s (list-ref padd
6210: 65 64 2d 72 6f 77 20 37 29 29 29 0a 09 09 09 20  ed-row 7))).... 
6220: 20 20 20 20 28 69 66 20 28 61 6e 64 20 28 73 74      (if (and (st
6230: 72 69 6e 67 3f 20 73 29 28 6f 72 20 28 73 74 72  ring? s)(or (str
6240: 69 6e 67 2d 6d 61 74 63 68 20 28 72 65 67 65 78  ing-match (regex
6250: 70 20 22 5e 5c 5c 73 2a 24 22 29 20 73 29 0a 09  p "^\\s*$") s)..
6260: 09 09 09 09 09 20 20 20 20 20 28 73 74 72 69 6e  .....     (strin
6270: 67 2d 6d 61 74 63 68 20 28 72 65 67 65 78 70 20  g-match (regexp 
6280: 22 5e 6e 2f 61 24 22 29 20 73 29 29 29 0a 09 09  "^n/a$") s)))...
6290: 09 09 20 23 66 0a 09 09 09 09 20 73 29 29 29 29  .. #f..... s))))
62a0: 20 3b 3b 20 69 66 20 73 70 65 63 69 66 69 65 64   ;; if specified
62b0: 20 6f 6e 20 74 68 65 20 69 6e 70 75 74 20 74 68   on the input th
62c0: 65 6e 20 75 73 65 2c 20 65 6c 73 65 20 63 61 6c  en use, else cal
62d0: 63 75 6c 61 74 65 0a 09 20 3b 3b 20 6c 6f 6f 6b  culate.. ;; look
62e0: 20 75 70 20 65 78 70 65 63 74 65 64 2c 74 6f 6c   up expected,tol
62f0: 2c 75 6e 69 74 73 20 66 72 6f 6d 20 70 72 65 76  ,units from prev
6300: 69 6f 75 73 20 62 65 73 74 20 66 69 74 20 74 65  ious best fit te
6310: 73 74 20 69 66 20 74 68 65 79 20 61 72 65 20 61  st if they are a
6320: 6c 6c 20 65 69 74 68 65 72 20 23 66 20 6f 72 20  ll either #f or 
6330: 27 27 0a 09 20 28 64 65 62 75 67 3a 70 72 69 6e  ''.. (debug:prin
6340: 74 20 34 20 22 42 45 46 4f 52 45 3a 20 63 61 74  t 4 "BEFORE: cat
6350: 65 67 6f 72 79 3a 20 22 20 63 61 74 65 67 6f 72  egory: " categor
6360: 79 20 22 20 76 61 72 69 61 62 6c 65 3a 20 22 20  y " variable: " 
6370: 76 61 72 69 61 62 6c 65 20 22 20 76 61 6c 75 65  variable " value
6380: 3a 20 22 20 76 61 6c 75 65 20 0a 09 09 20 20 20  : " value ...   
6390: 20 20 20 22 2c 20 65 78 70 65 63 74 65 64 3a 20     ", expected: 
63a0: 22 20 65 78 70 65 63 74 65 64 20 22 20 74 6f 6c  " expected " tol
63b0: 3a 20 22 20 74 6f 6c 20 22 20 75 6e 69 74 73 3a  : " tol " units:
63c0: 20 22 20 75 6e 69 74 73 20 22 20 73 74 61 74 75   " units " statu
63d0: 73 3a 20 22 20 73 74 61 74 75 73 20 22 20 63 6f  s: " status " co
63e0: 6d 6d 65 6e 74 3a 20 22 20 63 6f 6d 6d 65 6e 74  mment: " comment
63f0: 29 0a 0a 09 20 28 69 66 20 28 61 6e 64 20 28 6f  )... (if (and (o
6400: 72 20 28 6e 6f 74 20 65 78 70 65 63 74 65 64 29  r (not expected)
6410: 28 65 71 75 61 6c 3f 20 65 78 70 65 63 74 65 64  (equal? expected
6420: 20 22 22 29 29 0a 09 09 20 20 28 6f 72 20 28 6e   ""))...  (or (n
6430: 6f 74 20 74 6f 6c 29 20 20 20 20 20 28 65 71 75  ot tol)     (equ
6440: 61 6c 3f 20 65 78 70 65 63 74 65 64 20 22 22 29  al? expected "")
6450: 29 0a 09 09 20 20 28 6f 72 20 28 6e 6f 74 20 75  )...  (or (not u
6460: 6e 69 74 73 29 20 20 20 28 65 71 75 61 6c 3f 20  nits)   (equal? 
6470: 65 78 70 65 63 74 65 64 20 22 22 29 29 29 0a 09  expected "")))..
6480: 20 20 20 20 20 28 6c 65 74 2d 76 61 6c 75 65 73       (let-values
6490: 20 28 28 28 6e 65 77 2d 65 78 70 65 63 74 65 64   (((new-expected
64a0: 20 6e 65 77 2d 74 6f 6c 20 6e 65 77 2d 75 6e 69   new-tol new-uni
64b0: 74 73 29 28 64 62 3a 67 65 74 2d 70 72 65 76 2d  ts)(db:get-prev-
64c0: 74 6f 6c 2d 66 6f 72 2d 74 65 73 74 20 64 62 20  tol-for-test db 
64d0: 74 65 73 74 2d 69 64 20 63 61 74 65 67 6f 72 79  test-id category
64e0: 20 76 61 72 69 61 62 6c 65 29 29 29 0a 09 20 20   variable)))..  
64f0: 20 20 20 20 20 28 73 65 74 21 20 65 78 70 65 63       (set! expec
6500: 74 65 64 20 6e 65 77 2d 65 78 70 65 63 74 65 64  ted new-expected
6510: 29 0a 09 20 20 20 20 20 20 20 28 73 65 74 21 20  )..       (set! 
6520: 74 6f 6c 20 20 20 20 20 20 6e 65 77 2d 74 6f 6c  tol      new-tol
6530: 29 0a 09 20 20 20 20 20 20 20 28 73 65 74 21 20  )..       (set! 
6540: 75 6e 69 74 73 20 20 20 20 6e 65 77 2d 75 6e 69  units    new-uni
6550: 74 73 29 29 29 0a 0a 09 20 28 64 65 62 75 67 3a  ts)))... (debug:
6560: 70 72 69 6e 74 20 34 20 22 41 46 54 45 52 3a 20  print 4 "AFTER: 
6570: 20 63 61 74 65 67 6f 72 79 3a 20 22 20 63 61 74   category: " cat
6580: 65 67 6f 72 79 20 22 20 76 61 72 69 61 62 6c 65  egory " variable
6590: 3a 20 22 20 76 61 72 69 61 62 6c 65 20 22 20 76  : " variable " v
65a0: 61 6c 75 65 3a 20 22 20 76 61 6c 75 65 20 0a 09  alue: " value ..
65b0: 09 20 20 20 20 20 20 22 2c 20 65 78 70 65 63 74  .      ", expect
65c0: 65 64 3a 20 22 20 65 78 70 65 63 74 65 64 20 22  ed: " expected "
65d0: 20 74 6f 6c 3a 20 22 20 74 6f 6c 20 22 20 75 6e   tol: " tol " un
65e0: 69 74 73 3a 20 22 20 75 6e 69 74 73 20 22 20 73  its: " units " s
65f0: 74 61 74 75 73 3a 20 22 20 73 74 61 74 75 73 20  tatus: " status 
6600: 22 20 63 6f 6d 6d 65 6e 74 3a 20 22 20 63 6f 6d  " comment: " com
6610: 6d 65 6e 74 29 0a 09 20 3b 3b 20 63 61 6c 63 75  ment).. ;; calcu
6620: 6c 61 74 65 20 73 74 61 74 75 73 20 69 66 20 4e  late status if N
6630: 4f 54 20 73 70 65 63 69 66 69 65 64 0a 09 20 28  OT specified.. (
6640: 69 66 20 28 61 6e 64 20 28 6e 6f 74 20 73 74 61  if (and (not sta
6650: 74 75 73 29 28 6e 75 6d 62 65 72 3f 20 65 78 70  tus)(number? exp
6660: 65 63 74 65 64 29 28 6e 75 6d 62 65 72 3f 20 76  ected)(number? v
6670: 61 6c 75 65 29 29 20 3b 3b 20 6e 65 65 64 20 65  alue)) ;; need e
6680: 78 70 65 63 74 65 64 20 61 6e 64 20 76 61 6c 75  xpected and valu
6690: 65 20 74 6f 20 62 65 20 6e 75 6d 62 65 72 73 0a  e to be numbers.
66a0: 09 20 20 20 20 20 28 69 66 20 28 6e 75 6d 62 65  .     (if (numbe
66b0: 72 3f 20 74 6f 6c 29 20 3b 3b 20 69 66 20 74 6f  r? tol) ;; if to
66c0: 6c 20 69 73 20 61 20 6e 75 6d 62 65 72 20 74 68  l is a number th
66d0: 65 6e 20 77 65 20 64 6f 20 74 68 65 20 73 74 61  en we do the sta
66e0: 6e 64 61 72 64 20 63 6f 6d 70 61 72 69 73 6f 6e  ndard comparison
66f0: 0a 09 09 20 28 6c 65 74 2a 20 28 28 6d 61 78 2d  ... (let* ((max-
6700: 76 61 6c 20 28 2b 20 65 78 70 65 63 74 65 64 20  val (+ expected 
6710: 74 6f 6c 29 29 0a 09 09 09 28 6d 69 6e 2d 76 61  tol))....(min-va
6720: 6c 20 28 2d 20 65 78 70 65 63 74 65 64 20 74 6f  l (- expected to
6730: 6c 29 29 0a 09 09 09 28 72 65 73 75 6c 74 20 20  l))....(result  
6740: 28 61 6e 64 20 28 3e 3d 20 20 76 61 6c 75 65 20  (and (>=  value 
6750: 6d 69 6e 2d 76 61 6c 29 28 3c 3d 20 76 61 6c 75  min-val)(<= valu
6760: 65 20 6d 61 78 2d 76 61 6c 29 29 29 29 0a 09 09  e max-val))))...
6770: 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20     (debug:print 
6780: 34 20 22 6d 61 78 2d 76 61 6c 3a 20 22 20 6d 61  4 "max-val: " ma
6790: 78 2d 76 61 6c 20 22 20 6d 69 6e 2d 76 61 6c 3a  x-val " min-val:
67a0: 20 22 20 6d 69 6e 2d 76 61 6c 20 22 20 72 65 73   " min-val " res
67b0: 75 6c 74 3a 20 22 20 72 65 73 75 6c 74 29 0a 09  ult: " result)..
67c0: 09 20 20 20 28 73 65 74 21 20 73 74 61 74 75 73  .   (set! status
67d0: 20 28 69 66 20 72 65 73 75 6c 74 20 22 70 61 73   (if result "pas
67e0: 73 22 20 22 66 61 69 6c 22 29 29 29 0a 09 09 20  s" "fail")))... 
67f0: 28 73 65 74 21 20 73 74 61 74 75 73 20 3b 3b 20  (set! status ;; 
6800: 4e 42 2f 2f 20 6e 65 65 64 20 74 6f 20 61 73 73  NB// need to ass
6810: 65 73 73 20 65 61 63 68 20 6f 6e 65 20 28 69 2e  ess each one (i.
6820: 65 2e 20 6e 6f 74 20 72 65 74 75 72 6e 20 6f 70  e. not return op
6830: 65 72 61 74 6f 72 20 73 69 6e 63 65 20 6e 65 65  erator since nee
6840: 64 20 74 6f 20 61 63 74 20 69 66 20 6e 6f 74 20  d to act if not 
6850: 76 61 6c 69 64 20 6f 70 2e 0a 09 09 20 20 20 20  valid op....    
6860: 20 20 20 28 63 61 73 65 20 28 73 74 72 69 6e 67     (case (string
6870: 2d 3e 73 79 6d 62 6f 6c 20 74 6f 6c 29 20 3b 3b  ->symbol tol) ;;
6880: 20 74 6f 6c 20 73 68 6f 75 6c 64 20 62 65 20 3e   tol should be >
6890: 2c 20 3c 2c 20 3e 3d 2c 20 3c 3d 0a 09 09 09 20  , <, >=, <=.... 
68a0: 28 28 3e 29 20 20 28 69 66 20 28 3e 20 20 76 61  ((>)  (if (>  va
68b0: 6c 75 65 20 65 78 70 65 63 74 65 64 29 20 22 70  lue expected) "p
68c0: 61 73 73 22 20 22 66 61 69 6c 22 29 29 0a 09 09  ass" "fail"))...
68d0: 09 20 28 28 3c 29 20 20 28 69 66 20 28 3c 20 20  . ((<)  (if (<  
68e0: 76 61 6c 75 65 20 65 78 70 65 63 74 65 64 29 20  value expected) 
68f0: 22 70 61 73 73 22 20 22 66 61 69 6c 22 29 29 0a  "pass" "fail")).
6900: 09 09 09 20 28 28 3e 3d 29 20 28 69 66 20 28 3e  ... ((>=) (if (>
6910: 3d 20 76 61 6c 75 65 20 65 78 70 65 63 74 65 64  = value expected
6920: 29 20 22 70 61 73 73 22 20 22 66 61 69 6c 22 29  ) "pass" "fail")
6930: 29 0a 09 09 09 20 28 28 3c 3d 29 20 28 69 66 20  ).... ((<=) (if 
6940: 28 3c 3d 20 76 61 6c 75 65 20 65 78 70 65 63 74  (<= value expect
6950: 65 64 29 20 22 70 61 73 73 22 20 22 66 61 69 6c  ed) "pass" "fail
6960: 22 29 29 0a 09 09 09 20 28 65 6c 73 65 20 28 63  ")).... (else (c
6970: 6f 6e 63 20 22 45 52 52 4f 52 3a 20 62 61 64 20  onc "ERROR: bad 
6980: 74 6f 6c 20 63 6f 6d 70 61 72 61 74 6f 72 20 22  tol comparator "
6990: 20 74 6f 6c 29 29 29 29 29 29 0a 09 20 28 64 65   tol)))))).. (de
69a0: 62 75 67 3a 70 72 69 6e 74 20 34 20 22 41 46 54  bug:print 4 "AFT
69b0: 45 52 32 3a 20 63 61 74 65 67 6f 72 79 3a 20 22  ER2: category: "
69c0: 20 63 61 74 65 67 6f 72 79 20 22 20 76 61 72 69   category " vari
69d0: 61 62 6c 65 3a 20 22 20 76 61 72 69 61 62 6c 65  able: " variable
69e0: 20 22 20 76 61 6c 75 65 3a 20 22 20 76 61 6c 75   " value: " valu
69f0: 65 20 0a 09 09 20 20 20 20 20 20 22 2c 20 65 78  e ...      ", ex
6a00: 70 65 63 74 65 64 3a 20 22 20 65 78 70 65 63 74  pected: " expect
6a10: 65 64 20 22 20 74 6f 6c 3a 20 22 20 74 6f 6c 20  ed " tol: " tol 
6a20: 22 20 75 6e 69 74 73 3a 20 22 20 75 6e 69 74 73  " units: " units
6a30: 20 22 20 73 74 61 74 75 73 3a 20 22 20 73 74 61   " status: " sta
6a40: 74 75 73 20 22 20 63 6f 6d 6d 65 6e 74 3a 20 22  tus " comment: "
6a50: 20 63 6f 6d 6d 65 6e 74 29 0a 09 20 28 73 71 6c   comment).. (sql
6a60: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
6a70: 22 49 4e 53 45 52 54 20 4f 52 20 52 45 50 4c 41  "INSERT OR REPLA
6a80: 43 45 20 49 4e 54 4f 20 74 65 73 74 5f 64 61 74  CE INTO test_dat
6a90: 61 20 28 74 65 73 74 5f 69 64 2c 63 61 74 65 67  a (test_id,categ
6aa0: 6f 72 79 2c 76 61 72 69 61 62 6c 65 2c 76 61 6c  ory,variable,val
6ab0: 75 65 2c 65 78 70 65 63 74 65 64 2c 74 6f 6c 2c  ue,expected,tol,
6ac0: 75 6e 69 74 73 2c 63 6f 6d 6d 65 6e 74 2c 73 74  units,comment,st
6ad0: 61 74 75 73 29 20 56 41 4c 55 45 53 20 28 3f 2c  atus) VALUES (?,
6ae0: 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 29  ?,?,?,?,?,?,?,?)
6af0: 3b 22 0a 09 20 20 20 20 20 20 74 65 73 74 2d 69  ;"..      test-i
6b00: 64 20 63 61 74 65 67 6f 72 79 20 76 61 72 69 61  d category varia
6b10: 62 6c 65 20 76 61 6c 75 65 20 65 78 70 65 63 74  ble value expect
6b20: 65 64 20 74 6f 6c 20 75 6e 69 74 73 20 28 69 66  ed tol units (if
6b30: 20 63 6f 6d 6d 65 6e 74 20 63 6f 6d 6d 65 6e 74   comment comment
6b40: 20 22 22 29 20 73 74 61 74 75 73 29 29 29 0a 20   "") status))). 
6b50: 20 20 20 20 63 73 76 6c 69 73 74 29 29 29 0a 0a      csvlist)))..
6b60: 3b 3b 20 67 65 74 20 61 20 6c 69 73 74 20 6f 66  ;; get a list of
6b70: 20 74 65 73 74 5f 64 61 74 61 20 72 65 63 6f 72   test_data recor
6b80: 64 73 20 6d 61 74 63 68 69 6e 67 20 63 61 74 65  ds matching cate
6b90: 67 6f 72 79 70 61 74 74 0a 28 64 65 66 69 6e 65  gorypatt.(define
6ba0: 20 28 64 62 3a 72 65 61 64 2d 74 65 73 74 2d 64   (db:read-test-d
6bb0: 61 74 61 20 64 62 20 74 65 73 74 2d 69 64 20 63  ata db test-id c
6bc0: 61 74 65 67 6f 72 79 70 61 74 74 29 0a 20 20 28  ategorypatt).  (
6bd0: 6c 65 74 20 28 28 72 65 73 20 27 28 29 29 29 0a  let ((res '())).
6be0: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72      (sqlite3:for
6bf0: 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20 20 20 20  -each-row .     
6c00: 28 6c 61 6d 62 64 61 20 28 69 64 20 74 65 73 74  (lambda (id test
6c10: 5f 69 64 20 63 61 74 65 67 6f 72 79 20 76 61 72  _id category var
6c20: 69 61 62 6c 65 20 76 61 6c 75 65 20 65 78 70 65  iable value expe
6c30: 63 74 65 64 20 74 6f 6c 20 75 6e 69 74 73 20 63  cted tol units c
6c40: 6f 6d 6d 65 6e 74 20 73 74 61 74 75 73 29 0a 20  omment status). 
6c50: 20 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20        (set! res 
6c60: 28 63 6f 6e 73 20 28 76 65 63 74 6f 72 20 69 64  (cons (vector id
6c70: 20 74 65 73 74 5f 69 64 20 63 61 74 65 67 6f 72   test_id categor
6c80: 79 20 76 61 72 69 61 62 6c 65 20 76 61 6c 75 65  y variable value
6c90: 20 65 78 70 65 63 74 65 64 20 74 6f 6c 20 75 6e   expected tol un
6ca0: 69 74 73 20 63 6f 6d 6d 65 6e 74 20 73 74 61 74  its comment stat
6cb0: 75 73 29 20 72 65 73 29 29 29 0a 20 20 20 20 20  us) res))).     
6cc0: 64 62 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20  db.     "SELECT 
6cd0: 69 64 2c 74 65 73 74 5f 69 64 2c 63 61 74 65 67  id,test_id,categ
6ce0: 6f 72 79 2c 76 61 72 69 61 62 6c 65 2c 76 61 6c  ory,variable,val
6cf0: 75 65 2c 65 78 70 65 63 74 65 64 2c 74 6f 6c 2c  ue,expected,tol,
6d00: 75 6e 69 74 73 2c 63 6f 6d 6d 65 6e 74 2c 73 74  units,comment,st
6d10: 61 74 75 73 20 46 52 4f 4d 20 74 65 73 74 5f 64  atus FROM test_d
6d20: 61 74 61 20 57 48 45 52 45 20 74 65 73 74 5f 69  ata WHERE test_i
6d30: 64 3d 3f 20 41 4e 44 20 63 61 74 65 67 6f 72 79  d=? AND category
6d40: 20 4c 49 4b 45 20 3f 20 4f 52 44 45 52 20 42 59   LIKE ? ORDER BY
6d50: 20 63 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62   category,variab
6d60: 6c 65 3b 22 20 74 65 73 74 2d 69 64 20 63 61 74  le;" test-id cat
6d70: 65 67 6f 72 79 70 61 74 74 29 0a 20 20 20 20 28  egorypatt).    (
6d80: 72 65 76 65 72 73 65 20 72 65 73 29 29 29 0a 0a  reverse res)))..
6d90: 28 64 65 66 69 6e 65 20 28 64 62 3a 6c 6f 61 64  (define (db:load
6da0: 2d 74 65 73 74 2d 64 61 74 61 20 64 62 20 72 75  -test-data db ru
6db0: 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69  n-id test-name i
6dc0: 74 65 6d 64 61 74 29 0a 20 20 28 6c 65 74 2a 20  temdat).  (let* 
6dd0: 28 28 69 74 65 6d 2d 70 61 74 68 20 28 69 74 65  ((item-path (ite
6de0: 6d 2d 6c 69 73 74 2d 3e 70 61 74 68 20 69 74 65  m-list->path ite
6df0: 6d 64 61 74 29 29 0a 09 20 28 74 65 73 74 64 61  mdat)).. (testda
6e00: 74 20 28 64 62 3a 67 65 74 2d 74 65 73 74 2d 69  t (db:get-test-i
6e10: 6e 66 6f 20 64 62 20 72 75 6e 2d 69 64 20 74 65  nfo db run-id te
6e20: 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74  st-name item-pat
6e30: 68 29 29 0a 09 20 28 74 65 73 74 2d 69 64 20 28  h)).. (test-id (
6e40: 69 66 20 74 65 73 74 64 61 74 20 28 64 62 3a 74  if testdat (db:t
6e50: 65 73 74 2d 67 65 74 2d 69 64 20 74 65 73 74 64  est-get-id testd
6e60: 61 74 29 20 23 66 29 29 29 0a 20 20 20 20 3b 3b  at) #f))).    ;;
6e70: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 31 20   (debug:print 1 
6e80: 22 45 6e 74 65 72 20 72 65 63 6f 72 64 73 20 74  "Enter records t
6e90: 6f 20 69 6e 73 65 72 74 20 69 6e 20 74 68 65 20  o insert in the 
6ea0: 74 65 73 74 5f 64 61 74 61 20 74 61 62 6c 65 2c  test_data table,
6eb0: 20 73 65 76 65 6e 20 66 69 65 6c 64 73 2c 20 63   seven fields, c
6ec0: 6f 6d 6d 61 20 73 65 70 61 72 61 74 65 64 20 70  omma separated p
6ed0: 65 72 20 6c 69 6e 65 22 29 0a 20 20 20 20 28 64  er line").    (d
6ee0: 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22 69 74  ebug:print 4 "it
6ef0: 65 6d 64 61 74 3a 20 22 20 69 74 65 6d 64 61 74  emdat: " itemdat
6f00: 20 22 2c 20 74 65 73 74 2d 6e 61 6d 65 3a 20 22   ", test-name: "
6f10: 20 74 65 73 74 2d 6e 61 6d 65 20 22 2c 20 74 65   test-name ", te
6f20: 73 74 2d 69 64 3a 20 22 20 74 65 73 74 2d 69 64  st-id: " test-id
6f30: 29 0a 20 20 20 20 28 69 66 20 74 65 73 74 2d 69  ).    (if test-i
6f40: 64 0a 09 28 6c 65 74 20 6c 6f 6f 70 20 28 28 6c  d..(let loop ((l
6f50: 69 6e 20 28 72 65 61 64 2d 6c 69 6e 65 29 29 29  in (read-line)))
6f60: 0a 09 20 20 28 69 66 20 28 6e 6f 74 20 28 65 6f  ..  (if (not (eo
6f70: 66 2d 6f 62 6a 65 63 74 3f 20 6c 69 6e 29 29 0a  f-object? lin)).
6f80: 09 20 20 20 20 20 20 28 62 65 67 69 6e 0a 09 09  .      (begin...
6f90: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20 6c  (debug:print 4 l
6fa0: 69 6e 29 0a 09 09 28 64 62 3a 63 73 76 2d 3e 74  in)...(db:csv->t
6fb0: 65 73 74 2d 64 61 74 61 20 64 62 20 74 65 73 74  est-data db test
6fc0: 2d 69 64 20 6c 69 6e 29 0a 09 09 28 6c 6f 6f 70  -id lin)...(loop
6fd0: 20 28 72 65 61 64 2d 6c 69 6e 65 29 29 29 29 29   (read-line)))))
6fe0: 29 0a 20 20 20 20 3b 3b 20 72 6f 6c 6c 20 75 70  ).    ;; roll up
6ff0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 65 73   the current res
7000: 75 6c 74 73 2e 0a 20 20 20 20 28 64 62 3a 74 65  ults..    (db:te
7010: 73 74 2d 64 61 74 61 2d 72 6f 6c 6c 75 70 20 64  st-data-rollup d
7020: 62 20 74 65 73 74 2d 69 64 29 29 29 0a 20 20 0a  b test-id))).  .
7030: 3b 3b 20 57 41 52 4e 49 4e 47 3a 20 44 6f 20 4e  ;; WARNING: Do N
7040: 4f 54 20 63 61 6c 6c 20 74 68 69 73 20 66 6f 72  OT call this for
7050: 20 74 68 65 20 70 61 72 65 6e 74 20 74 65 73 74   the parent test
7060: 20 6f 6e 20 61 6e 20 69 74 65 72 61 74 65 64 20   on an iterated 
7070: 74 65 73 74 0a 3b 3b 20 52 6f 6c 6c 20 75 70 20  test.;; Roll up 
7080: 74 65 73 74 5f 64 61 74 61 20 70 61 73 73 2f 66  test_data pass/f
7090: 61 69 6c 20 72 65 73 75 6c 74 73 0a 3b 3b 20 6c  ail results.;; l
70a0: 6f 6f 6b 20 61 74 20 74 68 65 20 74 65 73 74 5f  ook at the test_
70b0: 64 61 74 61 20 73 74 61 74 75 73 20 66 69 65 6c  data status fiel
70c0: 64 2c 20 0a 3b 3b 20 20 20 20 69 66 20 61 6c 6c  d, .;;    if all
70d0: 20 61 72 65 20 70 61 73 73 20 28 61 6e 79 20 63   are pass (any c
70e0: 61 73 65 29 20 61 6e 64 20 74 68 65 20 74 65 73  ase) and the tes
70f0: 74 20 73 74 61 74 75 73 20 69 73 20 50 41 53 53  t status is PASS
7100: 20 6f 72 20 4e 55 4c 4c 20 6f 72 20 27 27 20 74   or NULL or '' t
7110: 68 65 6e 20 73 65 74 20 74 65 73 74 20 73 74 61  hen set test sta
7120: 74 75 73 20 74 6f 20 50 41 53 53 2e 0a 3b 3b 20  tus to PASS..;; 
7130: 20 20 20 69 66 20 6f 6e 65 20 6f 72 20 6d 6f 72     if one or mor
7140: 65 20 61 72 65 20 66 61 69 6c 20 28 61 6e 79 20  e are fail (any 
7150: 63 61 73 65 29 20 74 68 65 6e 20 73 65 74 20 74  case) then set t
7160: 65 73 74 20 73 74 61 74 75 73 20 74 6f 20 50 41  est status to PA
7170: 53 53 2c 20 6e 6f 6e 20 22 70 61 73 73 22 20 6f  SS, non "pass" o
7180: 72 20 22 66 61 69 6c 22 20 61 72 65 20 69 67 6e  r "fail" are ign
7190: 6f 72 65 64 0a 28 64 65 66 69 6e 65 20 28 64 62  ored.(define (db
71a0: 3a 74 65 73 74 2d 64 61 74 61 2d 72 6f 6c 6c 75  :test-data-rollu
71b0: 70 20 64 62 20 74 65 73 74 2d 69 64 29 0a 20 20  p db test-id).  
71c0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
71d0: 20 0a 20 20 20 64 62 20 0a 20 20 20 22 55 50 44   .   db .   "UPD
71e0: 41 54 45 20 74 65 73 74 73 20 0a 20 20 20 20 20  ATE tests .     
71f0: 20 53 45 54 20 66 61 69 6c 5f 63 6f 75 6e 74 3d   SET fail_count=
7200: 28 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 69 64  (SELECT count(id
7210: 29 20 46 52 4f 4d 20 74 65 73 74 5f 64 61 74 61  ) FROM test_data
7220: 20 57 48 45 52 45 20 74 65 73 74 5f 69 64 3d 3f   WHERE test_id=?
7230: 20 41 4e 44 20 73 74 61 74 75 73 20 6c 69 6b 65   AND status like
7240: 20 27 66 61 69 6c 27 29 2c 0a 20 20 20 20 20 20   'fail'),.      
7250: 20 20 20 20 70 61 73 73 5f 63 6f 75 6e 74 3d 28      pass_count=(
7260: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 69 64 29  SELECT count(id)
7270: 20 46 52 4f 4d 20 74 65 73 74 5f 64 61 74 61 20   FROM test_data 
7280: 57 48 45 52 45 20 74 65 73 74 5f 69 64 3d 3f 20  WHERE test_id=? 
7290: 41 4e 44 20 73 74 61 74 75 73 20 6c 69 6b 65 20  AND status like 
72a0: 27 70 61 73 73 27 29 0a 20 20 20 20 20 20 57 48  'pass').      WH
72b0: 45 52 45 20 69 64 3d 3f 3b 22 0a 20 20 20 74 65  ERE id=?;".   te
72c0: 73 74 2d 69 64 20 74 65 73 74 2d 69 64 20 74 65  st-id test-id te
72d0: 73 74 2d 69 64 29 0a 20 20 3b 3b 20 69 66 20 74  st-id).  ;; if t
72e0: 68 65 20 74 65 73 74 20 69 73 20 6e 6f 74 20 46  he test is not F
72f0: 41 49 4c 20 74 68 65 6e 20 73 65 74 20 73 74 61  AIL then set sta
7300: 74 75 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65  tus based on the
7310: 20 66 61 69 6c 20 61 6e 64 20 70 61 73 73 20 63   fail and pass c
7320: 6f 75 6e 74 73 2e 0a 20 20 28 73 6c 65 65 70 20  ounts..  (sleep 
7330: 31 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78  1).  (sqlite3:ex
7340: 65 63 75 74 65 0a 20 20 20 64 62 0a 20 20 20 22  ecute.   db.   "
7350: 55 50 44 41 54 45 20 74 65 73 74 73 0a 20 20 20  UPDATE tests.   
7360: 20 20 20 53 45 54 20 73 74 61 74 75 73 3d 43 41     SET status=CA
7370: 53 45 20 57 48 45 4e 20 28 53 45 4c 45 43 54 20  SE WHEN (SELECT 
7380: 66 61 69 6c 5f 63 6f 75 6e 74 20 46 52 4f 4d 20  fail_count FROM 
7390: 74 65 73 74 73 20 57 48 45 52 45 20 69 64 3d 3f  tests WHERE id=?
73a0: 29 20 3e 20 30 20 0a 20 20 20 20 20 20 20 20 20  ) > 0 .         
73b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73c0: 54 48 45 4e 20 27 46 41 49 4c 27 0a 20 20 20 20  THEN 'FAIL'.    
73d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73e0: 20 20 57 48 45 4e 20 28 53 45 4c 45 43 54 20 70    WHEN (SELECT p
73f0: 61 73 73 5f 63 6f 75 6e 74 20 46 52 4f 4d 20 74  ass_count FROM t
7400: 65 73 74 73 20 57 48 45 52 45 20 69 64 3d 3f 29  ests WHERE id=?)
7410: 20 3e 20 30 0a 20 20 20 20 20 20 20 20 20 20 20   > 0.           
7420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 48                TH
7430: 45 4e 20 27 50 41 53 53 27 0a 20 20 20 20 20 20  EN 'PASS'.      
7440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7450: 45 4c 53 45 20 73 74 61 74 75 73 0a 20 20 20 20  ELSE status.    
7460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 4e                EN
7470: 44 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 0a 20  D WHERE id=?;". 
7480: 20 20 74 65 73 74 2d 69 64 20 74 65 73 74 2d 69    test-id test-i
7490: 64 20 74 65 73 74 2d 69 64 29 29 0a 0a 28 64 65  d test-id))..(de
74a0: 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 70 72 65  fine (db:get-pre
74b0: 76 2d 74 6f 6c 2d 66 6f 72 2d 74 65 73 74 20 64  v-tol-for-test d
74c0: 62 20 74 65 73 74 2d 69 64 20 63 61 74 65 67 6f  b test-id catego
74d0: 72 79 20 76 61 72 69 61 62 6c 65 29 0a 20 20 3b  ry variable).  ;
74e0: 3b 20 46 69 6e 69 73 68 20 6d 65 3f 0a 20 20 28  ; Finish me?.  (
74f0: 76 61 6c 75 65 73 20 23 66 20 23 66 20 23 66 29  values #f #f #f)
7500: 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  )..;;===========
7510: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7520: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7530: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7540: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 53  ===========.;; S
7550: 20 54 20 45 20 50 20 53 20 0a 3b 3b 3d 3d 3d 3d   T E P S .;;====
7560: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7570: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7580: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7590: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
75a0: 3d 3d 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  ==..(define (db:
75b0: 73 74 65 70 2d 67 65 74 2d 74 69 6d 65 2d 61 73  step-get-time-as
75c0: 2d 73 74 72 69 6e 67 20 76 65 63 29 0a 20 20 20  -string vec).   
75d0: 20 28 73 65 63 6f 6e 64 73 2d 3e 74 69 6d 65 2d   (seconds->time-
75e0: 73 74 72 69 6e 67 20 28 64 62 3a 73 74 65 70 2d  string (db:step-
75f0: 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 76  get-event_time v
7600: 65 63 29 29 29 0a 0a 3b 3b 20 64 62 2d 67 65 74  ec)))..;; db-get
7610: 2d 74 65 73 74 2d 73 74 65 70 73 2d 66 6f 72 2d  -test-steps-for-
7620: 72 75 6e 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  run.(define (db:
7630: 67 65 74 2d 73 74 65 70 73 2d 66 6f 72 2d 74 65  get-steps-for-te
7640: 73 74 20 64 62 20 74 65 73 74 2d 69 64 29 0a 20  st db test-id). 
7650: 20 28 6c 65 74 20 28 28 72 65 73 20 27 28 29 29   (let ((res '())
7660: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66  ).    (sqlite3:f
7670: 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20 20  or-each-row .   
7680: 20 20 28 6c 61 6d 62 64 61 20 28 69 64 20 74 65    (lambda (id te
7690: 73 74 2d 69 64 20 73 74 65 70 6e 61 6d 65 20 73  st-id stepname s
76a0: 74 61 74 65 20 73 74 61 74 75 73 20 65 76 65 6e  tate status even
76b0: 74 2d 74 69 6d 65 29 0a 20 20 20 20 20 20 20 28  t-time).       (
76c0: 73 65 74 21 20 72 65 73 20 28 63 6f 6e 73 20 28  set! res (cons (
76d0: 76 65 63 74 6f 72 20 69 64 20 74 65 73 74 2d 69  vector id test-i
76e0: 64 20 73 74 65 70 6e 61 6d 65 20 73 74 61 74 65  d stepname state
76f0: 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d 74 69   status event-ti
7700: 6d 65 29 20 72 65 73 29 29 29 0a 20 20 20 20 20  me) res))).     
7710: 64 62 0a 20 20 20 20 20 22 53 45 4c 45 43 54 20  db.     "SELECT 
7720: 69 64 2c 74 65 73 74 5f 69 64 2c 73 74 65 70 6e  id,test_id,stepn
7730: 61 6d 65 2c 73 74 61 74 65 2c 73 74 61 74 75 73  ame,state,status
7740: 2c 65 76 65 6e 74 5f 74 69 6d 65 20 46 52 4f 4d  ,event_time FROM
7750: 20 74 65 73 74 5f 73 74 65 70 73 20 57 48 45 52   test_steps WHER
7760: 45 20 74 65 73 74 5f 69 64 3d 3f 20 4f 52 44 45  E test_id=? ORDE
7770: 52 20 42 59 20 69 64 20 41 53 43 3b 22 20 3b 3b  R BY id ASC;" ;;
7780: 20 65 76 65 6e 74 5f 74 69 6d 65 20 44 45 53 43   event_time DESC
7790: 2c 69 64 20 41 53 43 3b 0a 20 20 20 20 20 74 65  ,id ASC;.     te
77a0: 73 74 2d 69 64 29 0a 20 20 20 20 28 72 65 76 65  st-id).    (reve
77b0: 72 73 65 20 72 65 73 29 29 29 0a 0a 3b 3b 20 67  rse res)))..;; g
77c0: 65 74 20 61 20 70 72 65 74 74 79 20 74 61 62 6c  et a pretty tabl
77d0: 65 20 74 6f 20 73 75 6d 6d 61 72 69 7a 65 20 73  e to summarize s
77e0: 74 65 70 73 0a 3b 3b 0a 28 64 65 66 69 6e 65 20  teps.;;.(define 
77f0: 28 64 62 3a 67 65 74 2d 73 74 65 70 73 2d 74 61  (db:get-steps-ta
7800: 62 6c 65 20 64 62 20 74 65 73 74 2d 69 64 29 0a  ble db test-id).
7810: 20 20 28 6c 65 74 20 28 28 73 74 65 70 73 20 20    (let ((steps  
7820: 20 28 64 62 3a 67 65 74 2d 73 74 65 70 73 2d 66   (db:get-steps-f
7830: 6f 72 2d 74 65 73 74 20 64 62 20 74 65 73 74 2d  or-test db test-
7840: 69 64 29 29 29 0a 20 20 20 20 3b 3b 20 6f 72 67  id))).    ;; org
7850: 61 6e 69 73 65 20 74 68 65 20 73 74 65 70 73 20  anise the steps 
7860: 66 6f 72 20 62 65 74 74 65 72 20 72 65 61 64 61  for better reada
7870: 62 69 6c 69 74 79 0a 20 20 20 20 28 6c 65 74 20  bility.    (let 
7880: 28 28 72 65 73 20 28 6d 61 6b 65 2d 68 61 73 68  ((res (make-hash
7890: 2d 74 61 62 6c 65 29 29 29 0a 20 20 20 20 20 20  -table))).      
78a0: 28 66 6f 72 2d 65 61 63 68 20 0a 20 20 20 20 20  (for-each .     
78b0: 20 20 28 6c 61 6d 62 64 61 20 28 73 74 65 70 29    (lambda (step)
78c0: 0a 09 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20  .. (debug:print 
78d0: 36 20 22 73 74 65 70 3d 22 20 73 74 65 70 29 0a  6 "step=" step).
78e0: 09 20 28 6c 65 74 20 28 28 72 65 63 6f 72 64 20  . (let ((record 
78f0: 28 68 61 73 68 2d 74 61 62 6c 65 2d 72 65 66 2f  (hash-table-ref/
7900: 64 65 66 61 75 6c 74 20 0a 09 09 09 72 65 73 20  default ....res 
7910: 0a 09 09 09 28 64 62 3a 73 74 65 70 2d 67 65 74  ....(db:step-get
7920: 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70 29 20  -stepname step) 
7930: 0a 09 09 09 3b 3b 20 20 20 20 20 20 20 20 73 74  ....;;        st
7940: 65 70 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20  epname          
7950: 20 20 20 20 20 20 73 74 61 72 74 20 65 6e 64 20        start end 
7960: 73 74 61 74 75 73 20 20 20 20 0a 09 09 09 28 76  status    ....(v
7970: 65 63 74 6f 72 20 28 64 62 3a 73 74 65 70 2d 67  ector (db:step-g
7980: 65 74 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70  et-stepname step
7990: 29 20 22 22 20 20 20 22 22 20 22 22 20 20 20 20  ) ""   "" ""    
79a0: 20 22 22 29 29 29 29 0a 09 20 20 20 28 64 65 62   ""))))..   (deb
79b0: 75 67 3a 70 72 69 6e 74 20 36 20 22 72 65 63 6f  ug:print 6 "reco
79c0: 72 64 28 62 65 66 6f 72 65 29 20 3d 20 22 20 72  rd(before) = " r
79d0: 65 63 6f 72 64 20 0a 09 09 09 22 5c 6e 69 64 3a  ecord ...."\nid:
79e0: 20 20 20 20 20 20 20 22 20 28 64 62 3a 73 74 65         " (db:ste
79f0: 70 2d 67 65 74 2d 69 64 20 73 74 65 70 29 0a 09  p-get-id step)..
7a00: 09 09 22 5c 6e 73 74 65 70 6e 61 6d 65 3a 20 22  .."\nstepname: "
7a10: 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74   (db:step-get-st
7a20: 65 70 6e 61 6d 65 20 73 74 65 70 29 0a 09 09 09  epname step)....
7a30: 22 5c 6e 73 74 61 74 65 3a 20 20 20 20 22 20 28  "\nstate:    " (
7a40: 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 74  db:step-get-stat
7a50: 65 20 73 74 65 70 29 0a 09 09 09 22 5c 6e 73 74  e step)...."\nst
7a60: 61 74 75 73 3a 20 20 20 22 20 28 64 62 3a 73 74  atus:   " (db:st
7a70: 65 70 2d 67 65 74 2d 73 74 61 74 75 73 20 73 74  ep-get-status st
7a80: 65 70 29 0a 09 09 09 22 5c 6e 74 69 6d 65 3a 20  ep)...."\ntime: 
7a90: 20 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d 67      " (db:step-g
7aa0: 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73 74  et-event_time st
7ab0: 65 70 29 29 0a 09 20 20 20 28 63 61 73 65 20 28  ep))..   (case (
7ac0: 73 74 72 69 6e 67 2d 3e 73 79 6d 62 6f 6c 20 28  string->symbol (
7ad0: 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61 74  db:step-get-stat
7ae0: 65 20 73 74 65 70 29 29 0a 09 20 20 20 20 20 28  e step))..     (
7af0: 28 73 74 61 72 74 29 28 76 65 63 74 6f 72 2d 73  (start)(vector-s
7b00: 65 74 21 20 72 65 63 6f 72 64 20 31 20 28 64 62  et! record 1 (db
7b10: 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f  :step-get-event_
7b20: 74 69 6d 65 20 73 74 65 70 29 29 0a 09 20 20 20  time step))..   
7b30: 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20     (vector-set! 
7b40: 72 65 63 6f 72 64 20 33 20 28 69 66 20 28 65 71  record 3 (if (eq
7b50: 75 61 6c 3f 20 28 76 65 63 74 6f 72 2d 72 65 66  ual? (vector-ref
7b60: 20 72 65 63 6f 72 64 20 33 29 20 22 22 29 0a 09   record 3) "")..
7b70: 09 09 09 09 28 64 62 3a 73 74 65 70 2d 67 65 74  ....(db:step-get
7b80: 2d 73 74 61 74 75 73 20 73 74 65 70 29 29 29 29  -status step))))
7b90: 0a 09 20 20 20 20 20 28 28 65 6e 64 29 20 20 0a  ..     ((end)  .
7ba0: 09 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73  .      (vector-s
7bb0: 65 74 21 20 72 65 63 6f 72 64 20 32 20 28 61 6e  et! record 2 (an
7bc0: 79 2d 3e 6e 75 6d 62 65 72 20 28 64 62 3a 73 74  y->number (db:st
7bd0: 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d  ep-get-event_tim
7be0: 65 20 73 74 65 70 29 29 29 0a 09 20 20 20 20 20  e step)))..     
7bf0: 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72 65   (vector-set! re
7c00: 63 6f 72 64 20 33 20 28 64 62 3a 73 74 65 70 2d  cord 3 (db:step-
7c10: 67 65 74 2d 73 74 61 74 75 73 20 73 74 65 70 29  get-status step)
7c20: 29 0a 09 20 20 20 20 20 20 28 76 65 63 74 6f 72  )..      (vector
7c30: 2d 73 65 74 21 20 72 65 63 6f 72 64 20 34 20 28  -set! record 4 (
7c40: 6c 65 74 20 28 28 73 74 61 72 74 74 20 28 61 6e  let ((startt (an
7c50: 79 2d 3e 6e 75 6d 62 65 72 20 28 76 65 63 74 6f  y->number (vecto
7c60: 72 2d 72 65 66 20 72 65 63 6f 72 64 20 31 29 29  r-ref record 1))
7c70: 29 0a 09 09 09 09 09 20 20 28 65 6e 64 74 20 20  )......  (endt  
7c80: 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 20 28 76   (any->number (v
7c90: 65 63 74 6f 72 2d 72 65 66 20 72 65 63 6f 72 64  ector-ref record
7ca0: 20 32 29 29 29 29 0a 09 09 09 09 20 20 20 20 20   2)))).....     
7cb0: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20   (debug:print 4 
7cc0: 22 72 65 63 6f 72 64 5b 31 5d 3d 22 20 28 76 65  "record[1]=" (ve
7cd0: 63 74 6f 72 2d 72 65 66 20 72 65 63 6f 72 64 20  ctor-ref record 
7ce0: 31 29 20 0a 09 09 09 09 09 09 20 20 20 22 2c 20  1) .......   ", 
7cf0: 73 74 61 72 74 74 3d 22 20 73 74 61 72 74 74 20  startt=" startt 
7d00: 22 2c 20 65 6e 64 74 3d 22 20 65 6e 64 74 0a 09  ", endt=" endt..
7d10: 09 09 09 09 09 20 20 20 22 2c 20 67 65 74 2d 73  .....   ", get-s
7d20: 74 61 74 75 73 3a 20 22 20 28 64 62 3a 73 74 65  tatus: " (db:ste
7d30: 70 2d 67 65 74 2d 73 74 61 74 75 73 20 73 74 65  p-get-status ste
7d40: 70 29 29 0a 09 09 09 09 20 20 20 20 20 20 28 69  p)).....      (i
7d50: 66 20 28 61 6e 64 20 28 6e 75 6d 62 65 72 3f 20  f (and (number? 
7d60: 73 74 61 72 74 74 29 28 6e 75 6d 62 65 72 3f 20  startt)(number? 
7d70: 65 6e 64 74 29 29 0a 09 09 09 09 09 20 20 28 73  endt))......  (s
7d80: 65 63 6f 6e 64 73 2d 3e 68 72 2d 6d 69 6e 2d 73  econds->hr-min-s
7d90: 65 63 20 28 2d 20 65 6e 64 74 20 73 74 61 72 74  ec (- endt start
7da0: 74 29 29 20 22 2d 31 22 29 29 29 29 0a 09 20 20  t)) "-1"))))..  
7db0: 20 20 20 28 65 6c 73 65 0a 09 20 20 20 20 20 20     (else..      
7dc0: 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72    (vector-set! r
7dd0: 65 63 6f 72 64 20 32 20 28 64 62 3a 73 74 65 70  ecord 2 (db:step
7de0: 2d 67 65 74 2d 73 74 61 74 65 20 73 74 65 70 29  -get-state step)
7df0: 29 0a 09 20 20 20 20 20 20 20 20 28 76 65 63 74  )..        (vect
7e00: 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 33  or-set! record 3
7e10: 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74   (db:step-get-st
7e20: 61 74 75 73 20 73 74 65 70 29 29 0a 09 20 20 20  atus step))..   
7e30: 20 20 20 20 20 28 76 65 63 74 6f 72 2d 73 65 74       (vector-set
7e40: 21 20 72 65 63 6f 72 64 20 34 20 28 64 62 3a 73  ! record 4 (db:s
7e50: 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69  tep-get-event_ti
7e60: 6d 65 20 73 74 65 70 29 29 29 29 0a 09 20 20 20  me step))))..   
7e70: 28 68 61 73 68 2d 74 61 62 6c 65 2d 73 65 74 21  (hash-table-set!
7e80: 20 72 65 73 20 28 64 62 3a 73 74 65 70 2d 67 65   res (db:step-ge
7e90: 74 2d 73 74 65 70 6e 61 6d 65 20 73 74 65 70 29  t-stepname step)
7ea0: 20 72 65 63 6f 72 64 29 0a 09 20 20 20 28 64 65   record)..   (de
7eb0: 62 75 67 3a 70 72 69 6e 74 20 36 20 22 72 65 63  bug:print 6 "rec
7ec0: 6f 72 64 28 61 66 74 65 72 29 20 20 3d 20 22 20  ord(after)  = " 
7ed0: 72 65 63 6f 72 64 20 0a 09 09 09 22 5c 6e 69 64  record ...."\nid
7ee0: 3a 20 20 20 20 20 20 20 22 20 28 64 62 3a 73 74  :       " (db:st
7ef0: 65 70 2d 67 65 74 2d 69 64 20 73 74 65 70 29 0a  ep-get-id step).
7f00: 09 09 09 22 5c 6e 73 74 65 70 6e 61 6d 65 3a 20  ..."\nstepname: 
7f10: 22 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73  " (db:step-get-s
7f20: 74 65 70 6e 61 6d 65 20 73 74 65 70 29 0a 09 09  tepname step)...
7f30: 09 22 5c 6e 73 74 61 74 65 3a 20 20 20 20 22 20  ."\nstate:    " 
7f40: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61  (db:step-get-sta
7f50: 74 65 20 73 74 65 70 29 0a 09 09 09 22 5c 6e 73  te step)...."\ns
7f60: 74 61 74 75 73 3a 20 20 20 22 20 28 64 62 3a 73  tatus:   " (db:s
7f70: 74 65 70 2d 67 65 74 2d 73 74 61 74 75 73 20 73  tep-get-status s
7f80: 74 65 70 29 0a 09 09 09 22 5c 6e 74 69 6d 65 3a  tep)...."\ntime:
7f90: 20 20 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d       " (db:step-
7fa0: 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73  get-event_time s
7fb0: 74 65 70 29 29 29 29 0a 20 20 20 20 20 20 20 3b  tep)))).       ;
7fc0: 3b 20 28 65 6c 73 65 20 20 20 28 76 65 63 74 6f  ; (else   (vecto
7fd0: 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 31 20  r-set! record 1 
7fe0: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65  (db:step-get-eve
7ff0: 6e 74 5f 74 69 6d 65 20 73 74 65 70 29 29 29 0a  nt_time step))).
8000: 20 20 20 20 20 20 20 28 73 6f 72 74 20 73 74 65         (sort ste
8010: 70 73 20 28 6c 61 6d 62 64 61 20 28 61 20 62 29  ps (lambda (a b)
8020: 28 3c 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d  (< (db:step-get-
8030: 65 76 65 6e 74 5f 74 69 6d 65 20 61 29 28 64 62  event_time a)(db
8040: 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f  :step-get-event_
8050: 74 69 6d 65 20 62 29 29 29 29 29 0a 20 20 20 20  time b))))).    
8060: 20 20 72 65 73 29 29 29 0a 0a 3b 3b 20 55 53 45    res)))..;; USE
8070: 3a 20 28 6c 73 65 74 2d 64 69 66 66 65 72 65 6e  : (lset-differen
8080: 63 65 20 73 74 72 69 6e 67 3d 3f 20 27 28 22 61  ce string=? '("a
8090: 22 20 22 62 22 20 22 63 22 29 20 27 28 22 64 22  " "b" "c") '("d"
80a0: 20 22 63 22 20 22 65 22 20 22 61 22 29 29 0a 3b   "c" "e" "a")).;
80b0: 3b 0a 3b 3b 20 52 65 74 75 72 6e 20 61 20 6c 69  ;.;; Return a li
80c0: 73 74 20 6f 66 20 70 72 65 72 65 71 73 20 74 68  st of prereqs th
80d0: 61 74 20 77 65 72 65 20 4e 4f 54 20 6d 65 74 0a  at were NOT met.
80e0: 3b 3b 20 20 54 65 73 74 73 20 28 61 6e 64 20 61  ;;  Tests (and a
80f0: 6c 6c 20 69 74 65 6d 73 29 20 69 6e 20 77 61 69  ll items) in wai
8100: 74 6f 6e 20 6c 69 73 74 20 6d 75 73 74 20 62 65  ton list must be
8110: 20 22 43 4f 4d 50 4c 45 54 45 44 22 20 61 6e 64   "COMPLETED" and
8120: 20 22 50 41 53 53 22 0a 28 64 65 66 69 6e 65 20   "PASS".(define 
8130: 28 64 62 2d 67 65 74 2d 70 72 65 72 65 71 73 2d  (db-get-prereqs-
8140: 6e 6f 74 2d 6d 65 74 20 64 62 20 72 75 6e 2d 69  not-met db run-i
8150: 64 20 77 61 69 74 6f 6e 29 0a 20 20 28 69 66 20  d waiton).  (if 
8160: 28 6e 75 6c 6c 3f 20 77 61 69 74 6f 6e 29 0a 20  (null? waiton). 
8170: 20 20 20 20 20 27 28 29 0a 20 20 20 20 20 20 28       '().      (
8180: 6c 65 74 2a 20 28 28 75 6e 6d 65 74 2d 70 72 65  let* ((unmet-pre
8190: 2d 72 65 71 73 20 27 28 29 29 0a 09 20 20 20 20  -reqs '())..    
81a0: 20 28 74 65 73 74 73 20 20 20 20 20 20 20 20 20   (tests         
81b0: 20 20 28 64 62 2d 67 65 74 2d 74 65 73 74 73 2d    (db-get-tests-
81c0: 66 6f 72 2d 72 75 6e 20 64 62 20 72 75 6e 2d 69  for-run db run-i
81d0: 64 20 23 66 20 23 66 20 27 28 29 20 27 28 29 29  d #f #f '() '())
81e0: 29 0a 09 20 20 20 20 20 28 72 65 73 75 6c 74 20  )..     (result 
81f0: 20 20 20 20 20 20 20 20 27 28 29 29 29 0a 09 28          '()))..(
8200: 66 6f 72 2d 65 61 63 68 20 28 6c 61 6d 62 64 61  for-each (lambda
8210: 20 28 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d   (waitontest-nam
8220: 65 29 0a 09 09 20 20 20 20 28 6c 65 74 20 28 28  e)...    (let ((
8230: 65 76 65 72 2d 73 65 65 6e 20 23 66 29 29 0a 09  ever-seen #f))..
8240: 09 20 20 20 20 20 20 28 66 6f 72 2d 65 61 63 68  .      (for-each
8250: 20 28 6c 61 6d 62 64 61 20 28 74 65 73 74 29 0a   (lambda (test).
8260: 09 09 09 09 20 20 28 69 66 20 28 65 71 75 61 6c  ....  (if (equal
8270: 3f 20 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d  ? waitontest-nam
8280: 65 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 74  e (db:test-get-t
8290: 65 73 74 6e 61 6d 65 20 74 65 73 74 29 29 0a 09  estname test))..
82a0: 09 09 09 20 20 20 20 20 20 28 62 65 67 69 6e 0a  ...      (begin.
82b0: 09 09 09 09 09 28 73 65 74 21 20 65 76 65 72 2d  .....(set! ever-
82c0: 73 65 65 6e 20 23 74 29 0a 09 09 09 09 09 28 69  seen #t)......(i
82d0: 66 20 28 6e 6f 74 20 28 61 6e 64 20 28 65 71 75  f (not (and (equ
82e0: 61 6c 3f 20 28 64 62 3a 74 65 73 74 2d 67 65 74  al? (db:test-get
82f0: 2d 73 74 61 74 65 20 74 65 73 74 29 20 22 43 4f  -state test) "CO
8300: 4d 50 4c 45 54 45 44 22 29 0a 09 09 09 09 09 09  MPLETED").......
8310: 20 20 20 20 20 20 28 6d 65 6d 62 65 72 20 28 64        (member (d
8320: 62 3a 74 65 73 74 2d 67 65 74 2d 73 74 61 74 75  b:test-get-statu
8330: 73 20 74 65 73 74 29 20 27 28 22 50 41 53 53 22  s test) '("PASS"
8340: 20 22 57 41 52 4e 22 20 22 43 48 45 43 4b 22 29   "WARN" "CHECK")
8350: 29 29 29 0a 09 09 09 09 09 20 20 20 20 28 73 65  )))......    (se
8360: 74 21 20 72 65 73 75 6c 74 20 28 63 6f 6e 73 20  t! result (cons 
8370: 77 61 69 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 20  waitontest-name 
8380: 72 65 73 75 6c 74 29 29 29 29 29 29 0a 09 09 09  result))))))....
8390: 09 74 65 73 74 73 29 0a 09 09 20 20 20 20 20 20  .tests)...      
83a0: 28 69 66 20 28 6e 6f 74 20 65 76 65 72 2d 73 65  (if (not ever-se
83b0: 65 6e 29 28 73 65 74 21 20 72 65 73 75 6c 74 20  en)(set! result 
83c0: 28 63 6f 6e 73 20 77 61 69 74 6f 6e 74 65 73 74  (cons waitontest
83d0: 2d 6e 61 6d 65 20 72 65 73 75 6c 74 29 29 29 29  -name result))))
83e0: 29 0a 09 09 20 20 77 61 69 74 6f 6e 29 0a 09 28  )...  waiton)..(
83f0: 64 65 6c 65 74 65 2d 64 75 70 6c 69 63 61 74 65  delete-duplicate
8400: 73 20 72 65 73 75 6c 74 29 29 29 29 0a 0a 3b 3b  s result))))..;;
8410: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8420: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8430: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8440: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8450: 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 45 78 74 72 61 63  ======.;; Extrac
8460: 74 20 6f 64 73 20 66 69 6c 65 20 66 72 6f 6d 20  t ods file from 
8470: 74 68 65 20 64 62 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d  the db.;;=======
8480: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
8490: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
84a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
84b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a  ===============.
84c0: 0a 3b 3b 20 72 75 6e 73 70 61 74 74 20 69 73 20  .;; runspatt is 
84d0: 61 20 63 6f 6d 6d 61 20 64 65 6c 69 6d 69 74 65  a comma delimite
84e0: 64 20 6c 69 73 74 20 6f 66 20 72 75 6e 20 70 61  d list of run pa
84f0: 74 74 65 72 6e 73 0a 3b 3b 20 6b 65 79 70 61 74  tterns.;; keypat
8500: 74 2d 61 6c 69 73 74 20 6d 75 73 74 20 63 6f 6e  t-alist must con
8510: 74 61 69 6e 20 2a 61 6c 6c 2a 20 6b 65 79 73 20  tain *all* keys 
8520: 77 69 74 68 20 61 6e 20 61 73 73 6f 63 69 61 74  with an associat
8530: 65 64 20 70 61 74 74 65 72 6e 3a 20 27 28 20 28  ed pattern: '( (
8540: 22 4b 45 59 31 22 20 22 25 22 29 20 2e 2e 20 29  "KEY1" "%") .. )
8550: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 65 78 74  .(define (db:ext
8560: 72 61 63 74 2d 6f 64 73 2d 66 69 6c 65 20 64 62  ract-ods-file db
8570: 20 6f 75 74 70 75 74 66 69 6c 65 20 6b 65 79 70   outputfile keyp
8580: 61 74 74 2d 61 6c 69 73 74 20 72 75 6e 73 70 61  att-alist runspa
8590: 74 74 20 70 61 74 68 6d 6f 64 29 0a 20 20 28 6c  tt pathmod).  (l
85a0: 65 74 2a 20 28 28 6b 65 79 73 73 74 72 20 20 28  et* ((keysstr  (
85b0: 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72  string-intersper
85c0: 73 65 20 28 6d 61 70 20 63 61 72 20 6b 65 79 70  se (map car keyp
85d0: 61 74 74 2d 61 6c 69 73 74 29 20 22 2c 22 29 29  att-alist) ","))
85e0: 0a 09 20 28 6b 65 79 71 72 79 20 20 20 28 73 74  .. (keyqry   (st
85f0: 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65  ring-intersperse
8600: 20 28 6d 61 70 20 28 6c 61 6d 62 64 61 20 28 70   (map (lambda (p
8610: 29 28 63 6f 6e 63 20 28 63 61 72 20 70 29 20 22  )(conc (car p) "
8620: 20 4c 49 4b 45 20 3f 20 22 29 29 20 6b 65 79 70   LIKE ? ")) keyp
8630: 61 74 74 2d 61 6c 69 73 74 29 20 22 20 41 4e 44  att-alist) " AND
8640: 20 22 29 29 0a 09 20 28 6e 75 6d 6b 65 79 73 20   ")).. (numkeys 
8650: 20 28 6c 65 6e 67 74 68 20 6b 65 79 70 61 74 74   (length keypatt
8660: 2d 61 6c 69 73 74 29 29 0a 09 20 28 74 65 73 74  -alist)).. (test
8670: 2d 69 64 73 20 27 28 29 29 0a 09 20 28 77 69 6e  -ids '()).. (win
8680: 64 6f 77 73 20 20 28 61 6e 64 20 70 61 74 68 6d  dows  (and pathm
8690: 6f 64 20 28 73 75 62 73 74 72 69 6e 67 2d 69 6e  od (substring-in
86a0: 64 65 78 20 22 5c 5c 22 20 70 61 74 68 6d 6f 64  dex "\\" pathmod
86b0: 29 29 29 0a 09 20 28 74 65 6d 70 64 69 72 20 20  ))).. (tempdir  
86c0: 28 63 6f 6e 63 20 22 2f 74 6d 70 2f 22 20 28 63  (conc "/tmp/" (c
86d0: 75 72 72 65 6e 74 2d 75 73 65 72 2d 6e 61 6d 65  urrent-user-name
86e0: 29 20 22 2f 22 20 72 75 6e 73 70 61 74 74 20 22  ) "/" runspatt "
86f0: 5f 22 20 28 72 61 6e 64 6f 6d 20 31 30 30 30 30  _" (random 10000
8700: 29 20 22 5f 22 20 28 63 75 72 72 65 6e 74 2d 70  ) "_" (current-p
8710: 72 6f 63 65 73 73 2d 69 64 29 29 29 0a 09 20 28  rocess-id))).. (
8720: 72 75 6e 73 68 65 61 64 65 72 20 28 61 70 70 65  runsheader (appe
8730: 6e 64 20 28 6c 69 73 74 20 22 52 75 6e 20 49 64  nd (list "Run Id
8740: 22 20 22 52 75 6e 6e 61 6d 65 22 29 20 3b 20 30  " "Runname") ; 0
8750: 20 31 0a 09 09 09 20 20 20 20 20 28 6d 61 70 20   1....     (map 
8760: 63 61 72 20 6b 65 79 70 61 74 74 2d 61 6c 69 73  car keypatt-alis
8770: 74 29 20 20 20 3b 20 2b 20 4e 20 3d 20 6c 65 6e  t)   ; + N = len
8780: 67 74 68 20 6b 65 79 70 61 74 74 2d 61 6c 69 73  gth keypatt-alis
8790: 74 0a 09 09 09 20 20 20 20 20 28 6c 69 73 74 20  t....     (list 
87a0: 22 54 65 73 74 6e 61 6d 65 22 20 20 20 20 20 20  "Testname"      
87b0: 20 20 20 20 3b 20 32 0a 09 09 09 09 20 20 20 22      ; 2.....   "
87c0: 49 74 65 6d 20 50 61 74 68 22 20 20 20 20 20 20  Item Path"      
87d0: 20 20 20 3b 20 33 20 0a 09 09 09 09 20 20 20 22     ; 3 .....   "
87e0: 44 65 73 63 72 69 70 74 69 6f 6e 22 20 20 20 20  Description"    
87f0: 20 20 20 3b 20 34 20 0a 09 09 09 09 20 20 20 22     ; 4 .....   "
8800: 53 74 61 74 65 22 20 20 20 20 20 20 20 20 20 20  State"          
8810: 20 20 20 3b 20 35 20 0a 09 09 09 09 20 20 20 22     ; 5 .....   "
8820: 53 74 61 74 75 73 22 20 20 20 20 20 20 20 20 20  Status"         
8830: 20 20 20 3b 20 36 20 20 0a 09 09 09 09 20 20 20     ; 6  .....   
8840: 22 46 69 6e 61 6c 20 4c 6f 67 22 20 20 20 20 20  "Final Log"     
8850: 20 20 20 20 3b 20 37 20 0a 09 09 09 09 20 20 20      ; 7 .....   
8860: 22 52 75 6e 20 44 75 72 61 74 69 6f 6e 22 20 20  "Run Duration"  
8870: 20 20 20 20 3b 20 38 20 0a 09 09 09 09 20 20 20      ; 8 .....   
8880: 22 57 68 65 6e 20 52 75 6e 22 20 20 20 20 20 20  "When Run"      
8890: 20 20 20 20 3b 20 39 20 0a 09 09 09 09 20 20 20      ; 9 .....   
88a0: 22 54 61 67 73 22 20 20 20 20 20 20 20 20 20 20  "Tags"          
88b0: 20 20 20 20 3b 20 31 30 0a 09 09 09 09 20 20 20      ; 10.....   
88c0: 22 52 75 6e 20 4f 77 6e 65 72 22 20 20 20 20 20  "Run Owner"     
88d0: 20 20 20 20 3b 20 31 31 0a 09 09 09 09 20 20 20      ; 11.....   
88e0: 22 43 6f 6d 6d 65 6e 74 22 20 20 20 20 20 20 20  "Comment"       
88f0: 20 20 20 20 3b 20 31 32 0a 09 09 09 09 20 20 20      ; 12.....   
8900: 22 41 75 74 68 6f 72 22 20 20 20 20 20 20 20 20  "Author"        
8910: 20 20 20 20 3b 20 31 33 0a 09 09 09 09 20 20 20      ; 13.....   
8920: 22 54 65 73 74 20 4f 77 6e 65 72 22 20 20 20 20  "Test Owner"    
8930: 20 20 20 20 3b 20 31 34 0a 09 09 09 09 20 20 20      ; 14.....   
8940: 22 52 65 76 69 65 77 65 64 22 20 20 20 20 20 20  "Reviewed"      
8950: 20 20 20 20 3b 20 31 35 0a 09 09 09 09 20 20 20      ; 15.....   
8960: 22 44 69 73 6b 66 72 65 65 22 20 20 20 20 20 20  "Diskfree"      
8970: 20 20 20 20 3b 20 31 36 0a 09 09 09 09 20 20 20      ; 16.....   
8980: 22 55 6e 61 6d 65 22 20 20 20 20 20 20 20 20 20  "Uname"         
8990: 20 20 20 20 3b 20 31 37 0a 09 09 09 09 20 20 20      ; 17.....   
89a0: 22 52 75 6e 64 69 72 22 20 20 20 20 20 20 20 20  "Rundir"        
89b0: 20 20 20 20 3b 20 31 38 0a 09 09 09 09 20 20 20      ; 18.....   
89c0: 22 48 6f 73 74 22 20 20 20 20 20 20 20 20 20 20  "Host"          
89d0: 20 20 20 20 3b 20 31 39 0a 09 09 09 09 20 20 20      ; 19.....   
89e0: 22 43 70 75 20 4c 6f 61 64 22 20 20 20 20 20 20  "Cpu Load"      
89f0: 20 20 20 20 3b 20 32 30 0a 20 20 20 20 20 20 20      ; 20.       
8a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a10: 20 20 20 20 20 20 20 20 20 20 20 20 22 57 61 72              "War
8a20: 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n"              
8a30: 3b 20 32 31 0a 20 20 20 20 20 20 20 20 20 20 20  ; 21.           
8a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a50: 20 20 20 20 20 20 20 20 22 45 72 72 6f 72 22 29          "Error")
8a60: 29 29 20 20 20 20 20 20 20 20 20 20 3b 20 32 32  ))          ; 22
8a70: 0a 09 20 28 72 65 73 75 6c 74 73 20 28 6c 69 73  .. (results (lis
8a80: 74 20 72 75 6e 73 68 65 61 64 65 72 29 29 09 09  t runsheader))..
8a90: 09 20 0a 09 20 28 74 65 73 74 64 61 74 61 2d 68  . .. (testdata-h
8aa0: 65 61 64 65 72 20 28 6c 69 73 74 20 22 52 75 6e  eader (list "Run
8ab0: 20 49 64 22 20 22 54 65 73 74 6e 61 6d 65 22 20   Id" "Testname" 
8ac0: 22 49 74 65 6d 20 50 61 74 68 22 20 22 43 61 74  "Item Path" "Cat
8ad0: 65 67 6f 72 79 22 20 22 56 61 72 69 61 62 6c 65  egory" "Variable
8ae0: 22 20 22 56 61 6c 75 65 22 20 22 45 78 70 65 63  " "Value" "Expec
8af0: 74 65 64 22 20 22 54 6f 6c 22 20 22 55 6e 69 74  ted" "Tol" "Unit
8b00: 73 22 20 22 53 74 61 74 75 73 22 20 22 43 6f 6d  s" "Status" "Com
8b10: 6d 65 6e 74 22 29 29 29 0a 20 20 20 20 28 64 65  ment"))).    (de
8b20: 62 75 67 3a 70 72 69 6e 74 20 32 20 22 55 73 69  bug:print 2 "Usi
8b30: 6e 67 20 22 20 74 65 6d 70 64 69 72 20 22 20 66  ng " tempdir " f
8b40: 6f 72 20 63 6f 6e 73 74 72 75 63 74 69 6e 67 20  or constructing 
8b50: 74 68 65 20 6f 64 73 20 66 69 6c 65 2e 20 6b 65  the ods file. ke
8b60: 79 71 72 79 3a 20 22 20 6b 65 79 71 72 79 20 22  yqry: " keyqry "
8b70: 20 6b 65 79 73 74 72 3a 20 22 20 6b 65 79 73 73   keystr: " keyss
8b80: 74 72 20 22 20 77 69 74 68 20 6b 65 79 73 3a 20  tr " with keys: 
8b90: 22 20 28 6d 61 70 20 63 61 64 72 20 6b 65 79 70  " (map cadr keyp
8ba0: 61 74 74 2d 61 6c 69 73 74 29 29 0a 20 20 20 20  att-alist)).    
8bb0: 3b 3b 20 22 45 78 70 65 63 74 65 64 20 56 61 6c  ;; "Expected Val
8bc0: 75 65 22 0a 20 20 20 20 3b 3b 20 22 56 61 6c 75  ue".    ;; "Valu
8bd0: 65 20 46 6f 75 6e 64 22 0a 20 20 20 20 3b 3b 20  e Found".    ;; 
8be0: 22 54 6f 6c 65 72 61 6e 63 65 22 0a 20 20 20 20  "Tolerance".    
8bf0: 28 61 70 70 6c 79 20 73 71 6c 69 74 65 33 3a 66  (apply sqlite3:f
8c00: 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20 20 20 20  or-each-row.    
8c10: 20 28 6c 61 6d 62 64 61 20 28 74 65 73 74 2d 69   (lambda (test-i
8c20: 64 20 2e 20 62 29 0a 20 20 20 20 20 20 20 28 73  d . b).       (s
8c30: 65 74 21 20 74 65 73 74 2d 69 64 73 20 28 63 6f  et! test-ids (co
8c40: 6e 73 20 74 65 73 74 2d 69 64 20 74 65 73 74 2d  ns test-id test-
8c50: 69 64 73 29 29 20 20 20 3b 3b 20 74 65 73 74 2d  ids))   ;; test-
8c60: 69 64 20 69 73 20 6e 6f 77 20 74 65 73 74 6e 61  id is now testna
8c70: 6d 65 0a 20 20 20 20 20 20 20 28 73 65 74 21 20  me.       (set! 
8c80: 72 65 73 75 6c 74 73 20 28 61 70 70 65 6e 64 20  results (append 
8c90: 72 65 73 75 6c 74 73 20 3b 3b 20 6e 6f 74 65 2c  results ;; note,
8ca0: 20 64 72 6f 70 20 74 68 65 20 74 65 73 74 2d 69   drop the test-i
8cb0: 64 0a 09 09 09 20 20 20 20 20 28 6c 69 73 74 0a  d....     (list.
8cc0: 09 09 09 20 20 20 20 20 20 28 69 66 20 70 61 74  ...      (if pat
8cd0: 68 6d 6f 64 0a 09 09 09 09 20 20 28 6c 65 74 2a  hmod.....  (let*
8ce0: 20 28 28 76 62 20 20 20 20 20 20 20 20 28 61 70   ((vb        (ap
8cf0: 70 6c 79 20 76 65 63 74 6f 72 20 62 29 29 0a 09  ply vector b))..
8d00: 09 09 09 09 20 28 6b 65 79 76 61 6c 73 20 20 20  .... (keyvals   
8d10: 28 6c 65 74 20 6c 6f 6f 70 20 28 28 69 20 20 20  (let loop ((i   
8d20: 20 30 29 0a 09 09 09 09 09 09 09 20 20 20 20 20   0)........     
8d30: 20 20 28 72 65 73 20 27 28 29 29 29 0a 09 09 09    (res '()))....
8d40: 09 09 09 20 20 20 20 20 20 28 69 66 20 28 3e 3d  ...      (if (>=
8d50: 20 69 20 6e 75 6d 6b 65 79 73 29 0a 09 09 09 09   i numkeys).....
8d60: 09 09 09 20 20 72 65 73 0a 09 09 09 09 09 09 09  ...  res........
8d70: 20 20 28 6c 6f 6f 70 20 28 2b 20 69 20 31 29 0a    (loop (+ i 1).
8d80: 09 09 09 09 09 09 09 09 28 61 70 70 65 6e 64 20  ........(append 
8d90: 72 65 73 20 28 6c 69 73 74 20 28 76 65 63 74 6f  res (list (vecto
8da0: 72 2d 72 65 66 20 76 62 20 28 2b 20 69 20 32 29  r-ref vb (+ i 2)
8db0: 29 29 29 29 29 29 29 0a 09 09 09 09 09 20 28 72  )))))))...... (r
8dc0: 75 6e 6e 61 6d 65 20 20 20 28 76 65 63 74 6f 72  unname   (vector
8dd0: 2d 72 65 66 20 76 62 20 31 29 29 0a 09 09 09 09  -ref vb 1)).....
8de0: 09 20 28 74 65 73 74 6e 61 6d 65 20 20 28 76 65  . (testname  (ve
8df0: 63 74 6f 72 2d 72 65 66 20 76 62 20 28 2b 20 20  ctor-ref vb (+  
8e00: 32 20 6e 75 6d 6b 65 79 73 29 29 29 0a 09 09 09  2 numkeys)))....
8e10: 09 09 20 28 69 74 65 6d 2d 70 61 74 68 20 28 76  .. (item-path (v
8e20: 65 63 74 6f 72 2d 72 65 66 20 76 62 20 28 2b 20  ector-ref vb (+ 
8e30: 20 33 20 6e 75 6d 6b 65 79 73 29 29 29 0a 09 09   3 numkeys)))...
8e40: 09 09 09 20 28 66 69 6e 61 6c 2d 6c 6f 67 20 28  ... (final-log (
8e50: 76 65 63 74 6f 72 2d 72 65 66 20 76 62 20 28 2b  vector-ref vb (+
8e60: 20 20 37 20 6e 75 6d 6b 65 79 73 29 29 29 0a 09    7 numkeys)))..
8e70: 09 09 09 09 20 28 72 75 6e 2d 64 69 72 20 20 20  .... (run-dir   
8e80: 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62 20 28  (vector-ref vb (
8e90: 2b 20 31 38 20 6e 75 6d 6b 65 79 73 29 29 29 0a  + 18 numkeys))).
8ea0: 09 09 09 09 09 20 28 6c 6f 67 2d 66 70 61 74 68  ..... (log-fpath
8eb0: 20 28 63 6f 6e 63 20 72 75 6e 2d 64 69 72 20 22   (conc run-dir "
8ec0: 2f 22 20 20 66 69 6e 61 6c 2d 6c 6f 67 29 29 29  /"  final-log)))
8ed0: 20 3b 3b 20 28 73 74 72 69 6e 67 2d 69 6e 74 65   ;; (string-inte
8ee0: 72 73 70 65 72 73 65 20 6b 65 79 76 61 6c 73 20  rsperse keyvals 
8ef0: 22 2f 22 29 20 22 2f 22 20 74 65 73 74 6e 61 6d  "/") "/" testnam
8f00: 65 20 22 2f 22 20 69 74 65 6d 2d 70 61 74 68 20  e "/" item-path 
8f10: 22 2f 22 0a 09 09 09 09 20 20 20 20 28 64 65 62  "/".....    (deb
8f20: 75 67 3a 70 72 69 6e 74 20 34 20 22 6c 6f 67 3a  ug:print 4 "log:
8f30: 20 22 20 6c 6f 67 2d 66 70 61 74 68 20 22 20 65   " log-fpath " e
8f40: 78 69 73 74 73 3a 20 22 20 28 66 69 6c 65 2d 65  xists: " (file-e
8f50: 78 69 73 74 73 3f 20 6c 6f 67 2d 66 70 61 74 68  xists? log-fpath
8f60: 29 29 0a 09 09 09 09 20 20 20 20 28 76 65 63 74  )).....    (vect
8f70: 6f 72 2d 73 65 74 21 20 76 62 20 28 2b 20 37 20  or-set! vb (+ 7 
8f80: 6e 75 6d 6b 65 79 73 29 20 28 69 66 20 28 66 69  numkeys) (if (fi
8f90: 6c 65 2d 65 78 69 73 74 73 3f 20 6c 6f 67 2d 66  le-exists? log-f
8fa0: 70 61 74 68 29 0a 09 09 09 09 09 09 09 09 20 20  path).........  
8fb0: 20 20 20 20 28 6c 65 74 20 28 28 6e 65 77 70 61      (let ((newpa
8fc0: 74 68 20 28 63 6f 6e 63 20 70 61 74 68 6d 6f 64  th (conc pathmod
8fd0: 20 22 2f 22 0a 09 09 09 09 09 09 09 09 09 09 09   "/"............
8fe0: 20 20 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72     (string-inter
8ff0: 73 70 65 72 73 65 20 6b 65 79 76 61 6c 73 20 22  sperse keyvals "
9000: 2f 22 29 0a 09 09 09 09 09 09 09 09 09 09 09 20  /")............ 
9010: 20 20 22 2f 22 20 72 75 6e 6e 61 6d 65 20 22 2f    "/" runname "/
9020: 22 20 74 65 73 74 6e 61 6d 65 20 22 2f 22 0a 09  " testname "/"..
9030: 09 09 09 09 09 09 09 09 09 09 20 20 20 28 69 66  ..........   (if
9040: 20 28 73 74 72 69 6e 67 3d 3f 20 69 74 65 6d 2d   (string=? item-
9050: 70 61 74 68 20 22 22 29 20 22 22 20 28 63 6f 6e  path "") "" (con
9060: 63 20 22 2f 22 20 69 74 65 6d 2d 70 61 74 68 29  c "/" item-path)
9070: 29 0a 09 09 09 09 09 09 09 09 09 09 09 20 20 20  )............   
9080: 66 69 6e 61 6c 2d 6c 6f 67 29 29 29 0a 09 09 09  final-log)))....
9090: 09 09 09 09 09 09 3b 3b 20 66 6f 72 20 6e 6f 77  ......;; for now
90a0: 20 74 68 72 6f 77 20 61 77 61 79 20 6e 65 77 70   throw away newp
90b0: 61 74 68 20 61 6e 64 20 75 73 65 20 74 68 65 20  ath and use the 
90c0: 6c 6f 67 2d 66 70 61 74 68 20 63 6f 6e 63 27 64  log-fpath conc'd
90d0: 20 77 69 74 68 20 70 61 74 68 6d 6f 64 0a 09 09   with pathmod...
90e0: 09 09 09 09 09 09 09 28 73 65 74 21 20 6e 65 77  .......(set! new
90f0: 70 61 74 68 20 28 63 6f 6e 63 20 70 61 74 68 6d  path (conc pathm
9100: 6f 64 20 6c 6f 67 2d 66 70 61 74 68 29 29 0a 09  od log-fpath))..
9110: 09 09 09 09 09 09 09 09 28 69 66 20 77 69 6e 64  ........(if wind
9120: 6f 77 73 20 28 73 74 72 69 6e 67 2d 74 72 61 6e  ows (string-tran
9130: 73 6c 61 74 65 20 6e 65 77 70 61 74 68 20 22 2f  slate newpath "/
9140: 22 20 22 5c 5c 22 29 20 6e 65 77 70 61 74 68 29  " "\\") newpath)
9150: 29 0a 09 09 09 09 09 09 09 09 20 20 20 20 20 20  ).........      
9160: 28 69 66 20 28 3e 20 2a 76 65 72 62 6f 73 69 74  (if (> *verbosit
9170: 79 2a 20 31 29 0a 09 09 09 09 09 09 09 09 09 20  y* 1).......... 
9180: 20 28 63 6f 6e 63 20 66 69 6e 61 6c 2d 6c 6f 67   (conc final-log
9190: 20 22 20 6e 6f 74 2d 66 6f 75 6e 64 22 29 0a 09   " not-found")..
91a0: 09 09 09 09 09 09 09 09 20 20 22 22 29 29 29 0a  ........  ""))).
91b0: 09 09 09 09 20 20 20 20 28 76 65 63 74 6f 72 2d  ....    (vector-
91c0: 3e 6c 69 73 74 20 76 62 29 29 0a 09 09 09 09 20  >list vb))..... 
91d0: 20 62 29 29 29 29 29 0a 20 20 20 20 20 64 62 0a   b))))).     db.
91e0: 20 20 20 20 20 28 63 6f 6e 63 20 22 53 45 4c 45       (conc "SELE
91f0: 43 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  CT.             
9200: 20 74 2e 74 65 73 74 6e 61 6d 65 2c 72 2e 69 64   t.testname,r.id
9210: 2c 72 75 6e 6e 61 6d 65 2c 22 20 6b 65 79 73 73  ,runname," keyss
9220: 74 72 20 22 2c 74 2e 74 65 73 74 6e 61 6d 65 2c  tr ",t.testname,
9230: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
9240: 2e 69 74 65 6d 5f 70 61 74 68 2c 74 6d 2e 64 65  .item_path,tm.de
9250: 73 63 72 69 70 74 69 6f 6e 2c 74 2e 73 74 61 74  scription,t.stat
9260: 65 2c 74 2e 73 74 61 74 75 73 2c 0a 20 20 20 20  e,t.status,.    
9270: 20 20 20 20 20 20 20 20 20 20 66 69 6e 61 6c 5f            final_
9280: 6c 6f 67 66 2c 72 75 6e 5f 64 75 72 61 74 69 6f  logf,run_duratio
9290: 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  n, .            
92a0: 20 20 73 74 72 66 74 69 6d 65 28 27 25 6d 2f 25    strftime('%m/%
92b0: 64 2f 25 59 20 25 48 3a 25 4d 3a 25 53 27 2c 64  d/%Y %H:%M:%S',d
92c0: 61 74 65 74 69 6d 65 28 74 2e 65 76 65 6e 74 5f  atetime(t.event_
92d0: 74 69 6d 65 2c 27 75 6e 69 78 65 70 6f 63 68 27  time,'unixepoch'
92e0: 29 2c 27 6c 6f 63 61 6c 74 69 6d 65 27 29 2c 0a  ),'localtime'),.
92f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6d                tm
9300: 2e 74 61 67 73 2c 72 2e 6f 77 6e 65 72 2c 74 2e  .tags,r.owner,t.
9310: 63 6f 6d 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20  comment,.       
9320: 20 20 20 20 20 20 20 61 75 74 68 6f 72 2c 0a 20         author,. 
9330: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6d 2e               tm.
9340: 6f 77 6e 65 72 2c 72 65 76 69 65 77 65 64 2c 0a  owner,reviewed,.
9350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
9360: 73 6b 66 72 65 65 2c 75 6e 61 6d 65 2c 72 75 6e  skfree,uname,run
9370: 64 69 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  dir,.           
9380: 20 20 20 68 6f 73 74 2c 63 70 75 6c 6f 61 64 2c     host,cpuload,
9390: 66 69 72 73 74 5f 65 72 72 2c 66 69 72 73 74 5f  first_err,first_
93a0: 77 61 72 6e 0a 20 20 20 20 20 20 20 20 20 20 20  warn.           
93b0: 20 46 52 4f 4d 20 74 65 73 74 73 20 41 53 20 74   FROM tests AS t
93c0: 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 72 75 6e 73   INNER JOIN runs
93d0: 20 41 53 20 72 20 4f 4e 20 74 2e 72 75 6e 5f 69   AS r ON t.run_i
93e0: 64 3d 72 2e 69 64 20 49 4e 4e 45 52 20 4a 4f 49  d=r.id INNER JOI
93f0: 4e 20 74 65 73 74 5f 6d 65 74 61 20 41 53 20 74  N test_meta AS t
9400: 6d 20 4f 4e 20 74 6d 2e 74 65 73 74 6e 61 6d 65  m ON tm.testname
9410: 3d 74 2e 74 65 73 74 6e 61 6d 65 0a 20 20 20 20  =t.testname.    
9420: 20 20 20 20 20 20 20 20 57 48 45 52 45 20 72 75          WHERE ru
9430: 6e 6e 61 6d 65 20 4c 49 4b 45 20 3f 20 41 4e 44  nname LIKE ? AND
9440: 20 22 20 6b 65 79 71 72 79 20 22 3b 22 29 0a 20   " keyqry ";"). 
9450: 20 20 20 20 72 75 6e 73 70 61 74 74 20 28 6d 61      runspatt (ma
9460: 70 20 63 61 64 72 20 6b 65 79 70 61 74 74 2d 61  p cadr keypatt-a
9470: 6c 69 73 74 29 29 0a 20 20 20 20 28 73 65 74 21  list)).    (set!
9480: 20 72 65 73 75 6c 74 73 20 28 6c 69 73 74 20 28   results (list (
9490: 63 6f 6e 73 20 22 52 75 6e 73 22 20 72 65 73 75  cons "Runs" resu
94a0: 6c 74 73 29 29 29 0a 20 20 20 20 3b 3b 20 6e 6f  lts))).    ;; no
94b0: 77 2c 20 66 6f 72 20 65 61 63 68 20 74 65 73 74  w, for each test
94c0: 2c 20 63 6f 6c 6c 65 63 74 20 74 68 65 20 74 65  , collect the te
94d0: 73 74 5f 64 61 74 61 20 69 6e 66 6f 20 61 6e 64  st_data info and
94e0: 20 61 64 64 20 61 20 6e 65 77 20 73 68 65 65 74   add a new sheet
94f0: 0a 20 20 20 20 28 66 6f 72 2d 65 61 63 68 0a 20  .    (for-each. 
9500: 20 20 20 20 28 6c 61 6d 62 64 61 20 28 74 65 73      (lambda (tes
9510: 74 2d 69 64 29 0a 20 20 20 20 20 20 20 28 6c 65  t-id).       (le
9520: 74 20 28 28 74 65 73 74 2d 64 61 74 61 20 28 6c  t ((test-data (l
9530: 69 73 74 20 74 65 73 74 64 61 74 61 2d 68 65 61  ist testdata-hea
9540: 64 65 72 29 29 0a 09 20 20 20 20 20 28 63 75 72  der))..     (cur
9550: 72 2d 74 65 73 74 2d 6e 61 6d 65 20 23 66 29 29  r-test-name #f))
9560: 0a 09 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d  .. (sqlite3:for-
9570: 65 61 63 68 2d 72 6f 77 0a 09 20 20 28 6c 61 6d  each-row..  (lam
9580: 62 64 61 20 28 72 75 6e 2d 69 64 20 74 65 73 74  bda (run-id test
9590: 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 63  name item-path c
95a0: 61 74 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65  ategory variable
95b0: 20 76 61 6c 75 65 20 65 78 70 65 63 74 65 64 20   value expected 
95c0: 74 6f 6c 20 75 6e 69 74 73 20 73 74 61 74 75 73  tol units status
95d0: 20 63 6f 6d 6d 65 6e 74 29 0a 09 20 20 20 20 28   comment)..    (
95e0: 73 65 74 21 20 63 75 72 72 2d 74 65 73 74 2d 6e  set! curr-test-n
95f0: 61 6d 65 20 74 65 73 74 6e 61 6d 65 29 0a 09 20  ame testname).. 
9600: 20 20 20 28 73 65 74 21 20 74 65 73 74 2d 64 61     (set! test-da
9610: 74 61 20 28 61 70 70 65 6e 64 20 74 65 73 74 2d  ta (append test-
9620: 64 61 74 61 20 28 6c 69 73 74 20 28 6c 69 73 74  data (list (list
9630: 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65   run-id testname
9640: 20 69 74 65 6d 2d 70 61 74 68 20 63 61 74 65 67   item-path categ
9650: 6f 72 79 20 76 61 72 69 61 62 6c 65 20 76 61 6c  ory variable val
9660: 75 65 20 65 78 70 65 63 74 65 64 20 74 6f 6c 20  ue expected tol 
9670: 75 6e 69 74 73 20 73 74 61 74 75 73 20 63 6f 6d  units status com
9680: 6d 65 6e 74 29 29 29 29 29 0a 09 20 20 64 62 20  ment)))))..  db 
9690: 0a 09 20 20 3b 3b 20 22 53 45 4c 45 43 54 20 72  ..  ;; "SELECT r
96a0: 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d 65 2c 69  un_id,testname,i
96b0: 74 65 6d 5f 70 61 74 68 2c 63 61 74 65 67 6f 72  tem_path,categor
96c0: 79 2c 76 61 72 69 61 62 6c 65 2c 74 64 2e 76 61  y,variable,td.va
96d0: 6c 75 65 20 41 53 20 76 61 6c 75 65 2c 65 78 70  lue AS value,exp
96e0: 65 63 74 65 64 2c 74 6f 6c 2c 75 6e 69 74 73 2c  ected,tol,units,
96f0: 74 64 2e 73 74 61 74 75 73 20 41 53 20 73 74 61  td.status AS sta
9700: 74 75 73 2c 74 64 2e 63 6f 6d 6d 65 6e 74 20 41  tus,td.comment A
9710: 53 20 63 6f 6d 6d 65 6e 74 20 46 52 4f 4d 20 74  S comment FROM t
9720: 65 73 74 5f 64 61 74 61 20 41 53 20 74 64 20 49  est_data AS td I
9730: 4e 4e 45 52 20 4a 4f 49 4e 20 74 65 73 74 73 20  NNER JOIN tests 
9740: 4f 4e 20 74 65 73 74 73 2e 69 64 3d 74 64 2e 74  ON tests.id=td.t
9750: 65 73 74 5f 69 64 20 57 48 45 52 45 20 74 65 73  est_id WHERE tes
9760: 74 5f 69 64 3d 3f 3b 22 0a 09 20 20 22 53 45 4c  t_id=?;"..  "SEL
9770: 45 43 54 20 72 75 6e 5f 69 64 2c 74 65 73 74 6e  ECT run_id,testn
9780: 61 6d 65 2c 69 74 65 6d 5f 70 61 74 68 2c 63 61  ame,item_path,ca
9790: 74 65 67 6f 72 79 2c 76 61 72 69 61 62 6c 65 2c  tegory,variable,
97a0: 74 64 2e 76 61 6c 75 65 20 41 53 20 76 61 6c 75  td.value AS valu
97b0: 65 2c 74 64 2e 65 78 70 65 63 74 65 64 2c 74 64  e,td.expected,td
97c0: 2e 74 6f 6c 2c 74 64 2e 75 6e 69 74 73 2c 74 64  .tol,td.units,td
97d0: 2e 73 74 61 74 75 73 20 41 53 20 73 74 61 74 75  .status AS statu
97e0: 73 2c 74 64 2e 63 6f 6d 6d 65 6e 74 20 41 53 20  s,td.comment AS 
97f0: 63 6f 6d 6d 65 6e 74 20 46 52 4f 4d 20 74 65 73  comment FROM tes
9800: 74 5f 64 61 74 61 20 41 53 20 74 64 20 49 4e 4e  t_data AS td INN
9810: 45 52 20 4a 4f 49 4e 20 74 65 73 74 73 20 4f 4e  ER JOIN tests ON
9820: 20 74 65 73 74 73 2e 69 64 3d 74 64 2e 74 65 73   tests.id=td.tes
9830: 74 5f 69 64 20 57 48 45 52 45 20 74 65 73 74 6e  t_id WHERE testn
9840: 61 6d 65 3d 3f 3b 22 0a 09 20 20 74 65 73 74 2d  ame=?;"..  test-
9850: 69 64 29 0a 09 20 28 69 66 20 63 75 72 72 2d 74  id).. (if curr-t
9860: 65 73 74 2d 6e 61 6d 65 0a 09 20 20 20 20 20 28  est-name..     (
9870: 73 65 74 21 20 72 65 73 75 6c 74 73 20 28 61 70  set! results (ap
9880: 70 65 6e 64 20 72 65 73 75 6c 74 73 20 28 6c 69  pend results (li
9890: 73 74 20 28 63 6f 6e 73 20 63 75 72 72 2d 74 65  st (cons curr-te
98a0: 73 74 2d 6e 61 6d 65 20 74 65 73 74 2d 64 61 74  st-name test-dat
98b0: 61 29 29 29 29 29 0a 09 20 29 29 0a 20 20 20 20  a))))).. )).    
98c0: 20 28 73 6f 72 74 20 28 64 65 6c 65 74 65 2d 64   (sort (delete-d
98d0: 75 70 6c 69 63 61 74 65 73 20 74 65 73 74 2d 69  uplicates test-i
98e0: 64 73 29 20 73 74 72 69 6e 67 3c 3d 29 29 0a 20  ds) string<=)). 
98f0: 20 20 20 28 73 79 73 74 65 6d 20 28 63 6f 6e 63     (system (conc
9900: 20 22 6d 6b 64 69 72 20 2d 70 20 22 20 74 65 6d   "mkdir -p " tem
9910: 70 64 69 72 29 29 0a 20 20 20 20 3b 3b 20 28 70  pdir)).    ;; (p
9920: 70 20 72 65 73 75 6c 74 73 29 0a 20 20 20 20 28  p results).    (
9930: 6f 64 73 3a 6c 69 73 74 2d 3e 6f 64 73 20 0a 20  ods:list->ods . 
9940: 20 20 20 20 74 65 6d 70 64 69 72 0a 20 20 20 20      tempdir.    
9950: 20 28 69 66 20 28 73 74 72 69 6e 67 2d 6d 61 74   (if (string-mat
9960: 63 68 20 28 72 65 67 65 78 70 20 22 5e 5b 2f 7e  ch (regexp "^[/~
9970: 5d 2b 2e 2a 22 29 20 6f 75 74 70 75 74 66 69 6c  ]+.*") outputfil
9980: 65 29 20 3b 3b 20 66 75 6c 6c 20 70 61 74 68 3f  e) ;; full path?
9990: 0a 09 20 6f 75 74 70 75 74 66 69 6c 65 0a 09 20  .. outputfile.. 
99a0: 28 62 65 67 69 6e 0a 09 20 20 20 28 64 65 62 75  (begin..   (debu
99b0: 67 3a 70 72 69 6e 74 20 30 20 22 57 41 52 4e 49  g:print 0 "WARNI
99c0: 4e 47 3a 20 70 61 74 68 20 67 69 76 65 6e 2c 20  NG: path given, 
99d0: 22 20 6f 75 74 70 75 74 66 69 6c 65 20 22 20 69  " outputfile " i
99e0: 73 20 72 65 6c 61 74 69 76 65 2c 20 70 72 65 66  s relative, pref
99f0: 69 78 69 6e 67 20 77 69 74 68 20 63 75 72 72 65  ixing with curre
9a00: 6e 74 20 64 69 72 65 63 74 6f 72 79 22 29 0a 09  nt directory")..
9a10: 20 20 20 28 63 6f 6e 63 20 28 63 75 72 72 65 6e     (conc (curren
9a20: 74 2d 64 69 72 65 63 74 6f 72 79 29 20 22 2f 22  t-directory) "/"
9a30: 20 6f 75 74 70 75 74 66 69 6c 65 29 29 29 0a 20   outputfile))). 
9a40: 20 20 20 20 72 65 73 75 6c 74 73 29 29 29 0a 0a      results)))..
9a50: 3b 3b 20 28 64 62 3a 65 78 74 72 61 63 74 2d 6f  ;; (db:extract-o
9a60: 64 73 2d 66 69 6c 65 20 64 62 20 22 6f 75 74 70  ds-file db "outp
9a70: 75 74 66 69 6c 65 2e 6f 64 73 22 20 27 28 28 22  utfile.ods" '(("
9a80: 73 79 73 6e 61 6d 65 22 20 22 25 22 29 28 22 66  sysname" "%")("f
9a90: 73 6e 61 6d 65 22 20 22 25 22 29 28 22 64 61 74  sname" "%")("dat
9aa0: 61 70 61 74 68 22 20 22 25 22 29 29 20 22 25 22  apath" "%")) "%"
9ab0: 29 0a                                            ).