Megatest

Hex Artifact Content
Login

Artifact 9ffe0b96f2767af492eee0e14ea4de111ce741d9:


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 32 2c  right 2006-2012,
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 72 65 71 75 69 72 65 2d 65 78 74 65 6e  ..(require-exten
0290: 73 69 6f 6e 20 28 73 72 66 69 20 31 38 29 20 65  sion (srfi 18) e
02a0: 78 74 72 61 73 20 74 63 70 20 72 70 63 29 0a 28  xtras tcp rpc).(
02b0: 69 6d 70 6f 72 74 20 28 70 72 65 66 69 78 20 72  import (prefix r
02c0: 70 63 20 72 70 63 3a 29 29 0a 0a 28 75 73 65 20  pc rpc:))..(use 
02d0: 73 71 6c 69 74 65 33 20 73 72 66 69 2d 31 20 70  sqlite3 srfi-1 p
02e0: 6f 73 69 78 20 72 65 67 65 78 20 72 65 67 65 78  osix regex regex
02f0: 2d 63 61 73 65 20 73 72 66 69 2d 36 39 20 63 73  -case srfi-69 cs
0300: 76 2d 78 6d 6c 20 73 31 31 6e 20 7a 6d 71 29 0a  v-xml s11n zmq).
0310: 28 69 6d 70 6f 72 74 20 28 70 72 65 66 69 78 20  (import (prefix 
0320: 73 71 6c 69 74 65 33 20 73 71 6c 69 74 65 33 3a  sqlite3 sqlite3:
0330: 29 29 0a 0a 28 64 65 63 6c 61 72 65 20 28 75 6e  ))..(declare (un
0340: 69 74 20 64 62 29 29 0a 28 64 65 63 6c 61 72 65  it db)).(declare
0350: 20 28 75 73 65 73 20 63 6f 6d 6d 6f 6e 29 29 0a   (uses common)).
0360: 28 64 65 63 6c 61 72 65 20 28 75 73 65 73 20 6b  (declare (uses k
0370: 65 79 73 29 29 0a 28 64 65 63 6c 61 72 65 20 28  eys)).(declare (
0380: 75 73 65 73 20 6f 64 73 29 29 0a 0a 28 69 6e 63  uses ods))..(inc
0390: 6c 75 64 65 20 22 63 6f 6d 6d 6f 6e 5f 72 65 63  lude "common_rec
03a0: 6f 72 64 73 2e 73 63 6d 22 29 0a 28 69 6e 63 6c  ords.scm").(incl
03b0: 75 64 65 20 22 64 62 5f 72 65 63 6f 72 64 73 2e  ude "db_records.
03c0: 73 63 6d 22 29 0a 28 69 6e 63 6c 75 64 65 20 22  scm").(include "
03d0: 6b 65 79 5f 72 65 63 6f 72 64 73 2e 73 63 6d 22  key_records.scm"
03e0: 29 0a 28 69 6e 63 6c 75 64 65 20 22 72 75 6e 5f  ).(include "run_
03f0: 72 65 63 6f 72 64 73 2e 73 63 6d 22 29 0a 0a 3b  records.scm")..;
0400: 3b 20 74 69 6d 65 73 74 61 6d 70 20 74 79 70 65  ; timestamp type
0410: 20 28 76 61 6c 31 20 76 61 6c 32 20 2e 2e 2e 29   (val1 val2 ...)
0420: 0a 3b 3b 20 74 79 70 65 3a 20 6d 65 74 61 2d 69  .;; type: meta-i
0430: 6e 66 6f 2c 20 73 74 65 70 0a 28 64 65 66 69 6e  nfo, step.(defin
0440: 65 20 2a 69 6e 63 6f 6d 69 6e 67 2d 64 61 74 61  e *incoming-data
0450: 2a 20 20 20 20 20 20 27 28 29 29 0a 28 64 65 66  *      '()).(def
0460: 69 6e 65 20 2a 69 6e 63 6f 6d 69 6e 67 2d 6c 61  ine *incoming-la
0470: 73 74 2d 74 69 6d 65 2a 20 28 63 75 72 72 65 6e  st-time* (curren
0480: 74 2d 73 65 63 6f 6e 64 73 29 29 0a 28 64 65 66  t-seconds)).(def
0490: 69 6e 65 20 2a 69 6e 63 6f 6d 69 6e 67 2d 6d 75  ine *incoming-mu
04a0: 74 65 78 2a 20 20 20 20 20 28 6d 61 6b 65 2d 6d  tex*     (make-m
04b0: 75 74 65 78 29 29 0a 28 64 65 66 69 6e 65 20 2a  utex)).(define *
04c0: 63 61 63 68 65 2d 6f 6e 2a 20 23 66 29 0a 0a 28  cache-on* #f)..(
04d0: 64 65 66 69 6e 65 20 28 64 62 3a 73 65 74 2d 73  define (db:set-s
04e0: 79 6e 63 20 64 62 29 0a 20 20 28 6c 65 74 2a 20  ync db).  (let* 
04f0: 28 28 73 79 6e 63 76 61 6c 20 20 28 63 6f 6e 66  ((syncval  (conf
0500: 69 67 2d 6c 6f 6f 6b 75 70 20 2a 63 6f 6e 66 69  ig-lookup *confi
0510: 67 64 61 74 2a 20 22 73 65 74 75 70 22 20 20 20  gdat* "setup"   
0520: 20 20 22 73 79 6e 63 68 72 6f 6e 6f 75 73 22 29    "synchronous")
0530: 29 0a 09 20 28 76 61 6c 20 20 20 20 20 20 28 63  ).. (val      (c
0540: 6f 6e 64 20 20 20 3b 3b 20 30 20 7c 20 4f 46 46  ond   ;; 0 | OFF
0550: 20 7c 20 31 20 7c 20 4e 4f 52 4d 41 4c 20 7c 20   | 1 | NORMAL | 
0560: 32 20 7c 20 46 55 4c 4c 3b 0a 09 09 20 20 20 20  2 | FULL;...    
0570: 28 28 6e 6f 74 20 73 79 6e 63 76 61 6c 29 20 23  ((not syncval) #
0580: 66 29 0a 09 09 20 20 20 20 28 28 73 74 72 69 6e  f)...    ((strin
0590: 67 2d 3e 6e 75 6d 62 65 72 20 73 79 6e 63 76 61  g->number syncva
05a0: 6c 29 0a 09 09 20 20 20 20 20 28 6c 65 74 20 28  l)...     (let (
05b0: 28 76 61 6c 20 28 73 74 72 69 6e 67 2d 3e 6e 75  (val (string->nu
05c0: 6d 62 65 72 20 73 79 6e 63 76 61 6c 29 29 29 0a  mber syncval))).
05d0: 09 09 20 20 20 20 20 20 20 28 69 66 20 28 6d 65  ..       (if (me
05e0: 6d 62 65 72 20 76 61 6c 20 27 28 30 20 31 20 32  mber val '(0 1 2
05f0: 29 29 20 76 61 6c 20 23 66 29 29 29 0a 09 09 20  )) val #f)))... 
0600: 20 20 20 28 28 73 74 72 69 6e 67 2d 6d 61 74 63     ((string-matc
0610: 68 20 28 72 65 67 65 78 70 20 22 79 65 73 22 20  h (regexp "yes" 
0620: 23 74 29 20 73 79 6e 63 76 61 6c 29 20 31 29 0a  #t) syncval) 1).
0630: 09 09 20 20 20 20 28 28 73 74 72 69 6e 67 2d 6d  ..    ((string-m
0640: 61 74 63 68 20 28 72 65 67 65 78 70 20 22 6e 6f  atch (regexp "no
0650: 22 20 20 23 74 29 20 73 79 6e 63 76 61 6c 29 20  "  #t) syncval) 
0660: 30 29 0a 09 09 20 20 20 20 28 28 73 74 72 69 6e  0)...    ((strin
0670: 67 2d 6d 61 74 63 68 20 28 72 65 67 65 78 70 20  g-match (regexp 
0680: 22 28 6f 66 66 7c 6e 6f 72 6d 61 6c 7c 66 75 6c  "(off|normal|ful
0690: 6c 29 22 20 23 74 29 20 73 79 6e 63 76 61 6c 29  l)" #t) syncval)
06a0: 20 73 79 6e 63 76 61 6c 29 0a 09 09 20 20 20 20   syncval)...    
06b0: 28 65 6c 73 65 20 0a 09 09 20 20 20 20 20 28 64  (else ...     (d
06c0: 65 62 75 67 3a 70 72 69 6e 74 20 30 20 22 45 52  ebug:print 0 "ER
06d0: 52 4f 52 3a 20 73 79 6e 63 68 72 6f 6e 6f 75 73  ROR: synchronous
06e0: 20 6d 75 73 74 20 62 65 20 30 2c 31 2c 32 2c 4f   must be 0,1,2,O
06f0: 46 46 2c 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c  FF,NORMAL or FUL
0700: 4c 2c 20 79 6f 75 20 70 72 6f 76 69 64 65 64 3a  L, you provided:
0710: 20 22 20 73 79 6e 63 76 61 6c 29 0a 09 09 20 20   " syncval)...  
0720: 20 20 20 23 66 29 29 29 29 0a 20 20 20 20 28 69     #f)))).    (i
0730: 66 20 76 61 6c 0a 09 28 62 65 67 69 6e 0a 09 20  f val..(begin.. 
0740: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 2d 69 6e   (debug:print-in
0750: 66 6f 20 31 31 20 22 64 62 3a 73 65 74 2d 73 79  fo 11 "db:set-sy
0760: 6e 63 2c 20 73 65 74 74 69 6e 67 20 70 72 61 67  nc, setting prag
0770: 6d 61 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 74  ma synchronous t
0780: 6f 20 22 20 76 61 6c 29 0a 09 20 20 28 73 71 6c  o " val)..  (sql
0790: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
07a0: 28 63 6f 6e 63 20 22 50 52 41 47 4d 41 20 73 79  (conc "PRAGMA sy
07b0: 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 27 22 20 76  nchronous = '" v
07c0: 61 6c 20 22 27 3b 22 29 29 29 29 29 29 0a 0a 28  al "';"))))))..(
07d0: 64 65 66 69 6e 65 20 28 6f 70 65 6e 2d 64 62 29  define (open-db)
07e0: 20 3b 3b 20 20 28 63 6f 6e 63 20 2a 74 6f 70 70   ;;  (conc *topp
07f0: 61 74 68 2a 20 22 2f 6d 65 67 61 74 65 73 74 2e  ath* "/megatest.
0800: 64 62 22 29 20 28 63 61 72 20 2a 63 6f 6e 66 69  db") (car *confi
0810: 67 69 6e 66 6f 2a 29 29 29 0a 20 20 28 69 66 20  ginfo*))).  (if 
0820: 28 6e 6f 74 20 2a 74 6f 70 70 61 74 68 2a 29 28  (not *toppath*)(
0830: 73 65 74 75 70 2d 66 6f 72 2d 72 75 6e 29 29 0a  setup-for-run)).
0840: 20 20 28 6c 65 74 2a 20 28 28 64 62 70 61 74 68    (let* ((dbpath
0850: 20 20 20 20 28 63 6f 6e 63 20 2a 74 6f 70 70 61      (conc *toppa
0860: 74 68 2a 20 22 2f 6d 65 67 61 74 65 73 74 2e 64  th* "/megatest.d
0870: 62 22 29 29 20 3b 3b 20 66 6e 61 6d 65 29 0a 09  b")) ;; fname)..
0880: 20 28 64 62 65 78 69 73 74 73 20 20 28 66 69 6c   (dbexists  (fil
0890: 65 2d 65 78 69 73 74 73 3f 20 64 62 70 61 74 68  e-exists? dbpath
08a0: 29 29 0a 09 20 28 64 62 20 20 20 20 20 20 20 20  )).. (db        
08b0: 28 73 71 6c 69 74 65 33 3a 6f 70 65 6e 2d 64 61  (sqlite3:open-da
08c0: 74 61 62 61 73 65 20 64 62 70 61 74 68 29 29 20  tabase dbpath)) 
08d0: 3b 3b 20 28 6e 65 76 65 72 2d 67 69 76 65 2d 75  ;; (never-give-u
08e0: 70 2d 6f 70 65 6e 2d 64 62 20 64 62 70 61 74 68  p-open-db dbpath
08f0: 29 29 0a 09 20 28 68 61 6e 64 6c 65 72 20 20 20  )).. (handler   
0900: 28 6d 61 6b 65 2d 62 75 73 79 2d 74 69 6d 65 6f  (make-busy-timeo
0910: 75 74 20 28 69 66 20 28 61 72 67 73 3a 67 65 74  ut (if (args:get
0920: 2d 61 72 67 20 22 2d 6f 76 65 72 72 69 64 65 2d  -arg "-override-
0930: 74 69 6d 65 6f 75 74 22 29 0a 09 09 09 09 09 20  timeout")...... 
0940: 20 20 28 73 74 72 69 6e 67 2d 3e 6e 75 6d 62 65    (string->numbe
0950: 72 20 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20  r (args:get-arg 
0960: 22 2d 6f 76 65 72 72 69 64 65 2d 74 69 6d 65 6f  "-override-timeo
0970: 75 74 22 29 29 0a 09 09 09 09 09 20 20 20 31 33  ut"))......   13
0980: 36 30 30 30 29 29 29 29 20 3b 3b 20 31 33 36 30  6000)))) ;; 1360
0990: 30 30 29 29 29 20 3b 3b 20 31 33 36 30 30 30 20  00))) ;; 136000 
09a0: 3d 20 32 2e 32 20 6d 69 6e 75 74 65 73 0a 20 20  = 2.2 minutes.  
09b0: 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 2d 69    (debug:print-i
09c0: 6e 66 6f 20 31 31 20 22 6f 70 65 6e 2d 64 62 2c  nfo 11 "open-db,
09d0: 20 64 62 70 61 74 68 3d 22 20 64 62 70 61 74 68   dbpath=" dbpath
09e0: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 73  ).    (sqlite3:s
09f0: 65 74 2d 62 75 73 79 2d 68 61 6e 64 6c 65 72 21  et-busy-handler!
0a00: 20 64 62 20 68 61 6e 64 6c 65 72 29 0a 20 20 20   db handler).   
0a10: 20 28 69 66 20 28 6e 6f 74 20 64 62 65 78 69 73   (if (not dbexis
0a20: 74 73 29 0a 09 28 64 62 3a 69 6e 69 74 69 61 6c  ts)..(db:initial
0a30: 69 7a 65 20 64 62 29 29 0a 20 20 20 20 28 64 62  ize db)).    (db
0a40: 3a 73 65 74 2d 73 79 6e 63 20 64 62 29 0a 20 20  :set-sync db).  
0a50: 20 20 64 62 29 29 0a 0a 3b 3b 20 6b 65 65 70 69    db))..;; keepi
0a60: 6e 67 20 69 74 20 61 72 6f 75 6e 64 20 66 6f 72  ng it around for
0a70: 20 64 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f   debugging purpo
0a80: 73 65 73 20 6f 6e 6c 79 0a 28 64 65 66 69 6e 65  ses only.(define
0a90: 20 28 6f 70 65 6e 2d 72 75 6e 2d 63 6c 6f 73 65   (open-run-close
0aa0: 2d 6e 6f 2d 65 78 63 65 70 74 69 6f 6e 2d 68 61  -no-exception-ha
0ab0: 6e 64 6c 69 6e 67 20 20 70 72 6f 63 20 69 64 62  ndling  proc idb
0ac0: 20 2e 20 70 61 72 61 6d 73 29 0a 20 20 28 64 65   . params).  (de
0ad0: 62 75 67 3a 70 72 69 6e 74 2d 69 6e 66 6f 20 31  bug:print-info 1
0ae0: 31 20 22 6f 70 65 6e 2d 72 75 6e 2d 63 6c 6f 73  1 "open-run-clos
0af0: 65 2d 6e 6f 2d 65 78 63 65 70 74 69 6f 6e 2d 68  e-no-exception-h
0b00: 61 6e 64 6c 69 6e 67 20 53 54 41 52 54 2c 20 69  andling START, i
0b10: 64 62 3d 22 20 69 64 62 20 22 2c 20 70 61 72 61  db=" idb ", para
0b20: 6d 73 3d 22 20 70 61 72 61 6d 73 29 0a 20 20 28  ms=" params).  (
0b30: 6c 65 74 2a 20 28 28 64 62 20 20 20 28 69 66 20  let* ((db   (if 
0b40: 69 64 62 20 69 64 62 20 28 6f 70 65 6e 2d 64 62  idb idb (open-db
0b50: 29 29 29 0a 09 20 28 72 65 73 20 23 66 29 29 0a  ))).. (res #f)).
0b60: 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28 61      (set! res (a
0b70: 70 70 6c 79 20 70 72 6f 63 20 64 62 20 70 61 72  pply proc db par
0b80: 61 6d 73 29 29 0a 20 20 20 20 28 69 66 20 28 6e  ams)).    (if (n
0b90: 6f 74 20 69 64 62 29 28 73 71 6c 69 74 65 33 3a  ot idb)(sqlite3:
0ba0: 66 69 6e 61 6c 69 7a 65 21 20 64 62 29 29 0a 20  finalize! db)). 
0bb0: 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 2d     (debug:print-
0bc0: 69 6e 66 6f 20 31 31 20 22 6f 70 65 6e 2d 72 75  info 11 "open-ru
0bd0: 6e 2d 63 6c 6f 73 65 2d 6e 6f 2d 65 78 63 65 70  n-close-no-excep
0be0: 74 69 6f 6e 2d 68 61 6e 64 6c 69 6e 67 20 45 4e  tion-handling EN
0bf0: 44 22 20 29 0a 20 20 20 20 72 65 73 29 29 0a 0a  D" ).    res))..
0c00: 28 64 65 66 69 6e 65 20 28 6f 70 65 6e 2d 72 75  (define (open-ru
0c10: 6e 2d 63 6c 6f 73 65 2d 65 78 63 65 70 74 69 6f  n-close-exceptio
0c20: 6e 2d 68 61 6e 64 6c 69 6e 67 20 70 72 6f 63 20  n-handling proc 
0c30: 69 64 62 20 2e 20 70 61 72 61 6d 73 29 0a 20 20  idb . params).  
0c40: 28 64 65 62 75 67 3a 70 72 69 6e 74 2d 69 6e 66  (debug:print-inf
0c50: 6f 20 31 31 20 22 6f 70 65 6e 2d 72 75 6e 2d 63  o 11 "open-run-c
0c60: 6c 6f 73 65 2d 65 78 63 65 70 74 69 6f 6e 2d 68  lose-exception-h
0c70: 61 6e 64 6c 69 6e 67 20 53 54 41 52 54 2c 20 69  andling START, i
0c80: 64 62 3d 22 20 69 64 62 20 22 2c 20 70 61 72 61  db=" idb ", para
0c90: 6d 73 3d 22 20 70 61 72 61 6d 73 29 0a 20 20 28  ms=" params).  (
0ca0: 6c 65 74 20 28 28 72 75 6e 6e 65 72 20 28 6c 61  let ((runner (la
0cb0: 6d 62 64 61 20 28 29 0a 09 09 20 20 28 6c 65 74  mbda ()...  (let
0cc0: 2a 20 28 28 64 62 20 20 20 28 69 66 20 69 64 62  * ((db   (if idb
0cd0: 20 69 64 62 20 28 6f 70 65 6e 2d 64 62 29 29 29   idb (open-db)))
0ce0: 0a 09 09 09 20 28 72 65 73 20 23 66 29 29 0a 09  .... (res #f))..
0cf0: 09 20 20 20 20 28 73 65 74 21 20 72 65 73 20 28  .    (set! res (
0d00: 61 70 70 6c 79 20 70 72 6f 63 20 64 62 20 70 61  apply proc db pa
0d10: 72 61 6d 73 29 29 0a 09 09 20 20 20 20 28 69 66  rams))...    (if
0d20: 20 28 6e 6f 74 20 69 64 62 29 28 73 71 6c 69 74   (not idb)(sqlit
0d30: 65 33 3a 66 69 6e 61 6c 69 7a 65 21 20 64 62 29  e3:finalize! db)
0d40: 29 0a 09 09 20 20 20 20 28 64 65 62 75 67 3a 70  )...    (debug:p
0d50: 72 69 6e 74 2d 69 6e 66 6f 20 31 31 20 22 6f 70  rint-info 11 "op
0d60: 65 6e 2d 72 75 6e 2d 63 6c 6f 73 65 2d 6e 6f 2d  en-run-close-no-
0d70: 65 78 63 65 70 74 69 6f 6e 2d 68 61 6e 64 6c 69  exception-handli
0d80: 6e 67 20 45 4e 44 22 20 29 0a 09 09 20 20 20 20  ng END" )...    
0d90: 72 65 73 29 29 29 29 0a 20 20 20 20 28 68 61 6e  res)))).    (han
0da0: 64 6c 65 2d 65 78 63 65 70 74 69 6f 6e 73 0a 20  dle-exceptions. 
0db0: 20 20 20 20 65 78 6e 0a 20 20 20 20 20 28 62 65      exn.     (be
0dc0: 67 69 6e 0a 20 20 20 20 20 20 20 28 64 65 62 75  gin.       (debu
0dd0: 67 3a 70 72 69 6e 74 20 30 20 22 45 58 43 45 50  g:print 0 "EXCEP
0de0: 54 49 4f 4e 3a 20 64 61 74 61 62 61 73 65 20 70  TION: database p
0df0: 72 6f 62 61 62 6c 79 20 6f 76 65 72 6c 6f 61 64  robably overload
0e00: 65 64 3f 22 29 0a 20 20 20 20 20 20 20 28 64 65  ed?").       (de
0e10: 62 75 67 3a 70 72 69 6e 74 20 30 20 22 20 20 22  bug:print 0 "  "
0e20: 20 28 28 63 6f 6e 64 69 74 69 6f 6e 2d 70 72 6f   ((condition-pro
0e30: 70 65 72 74 79 2d 61 63 63 65 73 73 6f 72 20 27  perty-accessor '
0e40: 65 78 6e 20 27 6d 65 73 73 61 67 65 29 20 65 78  exn 'message) ex
0e50: 6e 29 29 0a 20 20 20 20 20 20 20 28 70 72 69 6e  n)).       (prin
0e60: 74 2d 63 61 6c 6c 2d 63 68 61 69 6e 29 0a 20 20  t-call-chain).  
0e70: 20 20 20 20 20 28 74 68 72 65 61 64 2d 73 6c 65       (thread-sle
0e80: 65 70 21 20 28 72 61 6e 64 6f 6d 20 31 32 30 29  ep! (random 120)
0e90: 29 0a 20 20 20 20 20 20 20 28 64 65 62 75 67 3a  ).       (debug:
0ea0: 70 72 69 6e 74 2d 69 6e 66 6f 20 30 20 22 74 72  print-info 0 "tr
0eb0: 79 69 6e 67 20 64 62 20 63 61 6c 6c 20 6f 6e 65  ying db call one
0ec0: 20 6d 6f 72 65 20 74 69 6d 65 2e 2e 2e 2e 22 29   more time....")
0ed0: 0a 20 20 20 20 20 20 20 28 72 75 6e 6e 65 72 29  .       (runner)
0ee0: 29 0a 20 20 20 20 20 28 72 75 6e 6e 65 72 29 29  ).     (runner))
0ef0: 29 29 0a 0a 28 64 65 66 69 6e 65 20 6f 70 65 6e  ))..(define open
0f00: 2d 72 75 6e 2d 63 6c 6f 73 65 20 6f 70 65 6e 2d  -run-close open-
0f10: 72 75 6e 2d 63 6c 6f 73 65 2d 65 78 63 65 70 74  run-close-except
0f20: 69 6f 6e 2d 68 61 6e 64 6c 69 6e 67 29 0a 0a 28  ion-handling)..(
0f30: 64 65 66 69 6e 65 20 2a 67 6c 6f 62 61 6c 2d 64  define *global-d
0f40: 65 6c 74 61 2a 20 30 29 0a 28 64 65 66 69 6e 65  elta* 0).(define
0f50: 20 2a 6c 61 73 74 2d 67 6c 6f 62 61 6c 2d 64 65   *last-global-de
0f60: 6c 74 61 2d 70 72 69 6e 74 65 64 2a 20 30 29 0a  lta-printed* 0).
0f70: 0a 28 64 65 66 69 6e 65 20 28 6f 70 65 6e 2d 72  .(define (open-r
0f80: 75 6e 2d 63 6c 6f 73 65 2d 6d 65 61 73 75 72 65  un-close-measure
0f90: 20 20 70 72 6f 63 20 69 64 62 20 2e 20 70 61 72    proc idb . par
0fa0: 61 6d 73 29 0a 20 20 28 64 65 62 75 67 3a 70 72  ams).  (debug:pr
0fb0: 69 6e 74 2d 69 6e 66 6f 20 31 31 20 22 6f 70 65  int-info 11 "ope
0fc0: 6e 2d 72 75 6e 2d 63 6c 6f 73 65 2d 6d 65 61 73  n-run-close-meas
0fd0: 75 72 65 20 53 54 41 52 54 2c 20 69 64 62 3d 22  ure START, idb="
0fe0: 20 69 64 62 20 22 2c 20 70 61 72 61 6d 73 3d 22   idb ", params="
0ff0: 20 70 61 72 61 6d 73 29 0a 20 20 28 6c 65 74 2a   params).  (let*
1000: 20 28 28 73 74 61 72 74 2d 6d 73 20 28 63 75 72   ((start-ms (cur
1010: 72 65 6e 74 2d 6d 69 6c 6c 69 73 65 63 6f 6e 64  rent-millisecond
1020: 73 29 29 0a 09 20 28 64 62 20 20 20 20 20 20 20  s)).. (db       
1030: 28 69 66 20 69 64 62 20 69 64 62 20 28 6f 70 65  (if idb idb (ope
1040: 6e 2d 64 62 29 29 29 0a 20 20 20 20 20 20 20 20  n-db))).        
1050: 20 28 74 68 72 6f 74 74 6c 65 20 28 73 74 72 69   (throttle (stri
1060: 6e 67 2d 3e 6e 75 6d 62 65 72 20 28 63 6f 6e 66  ng->number (conf
1070: 69 67 2d 6c 6f 6f 6b 75 70 20 2a 63 6f 6e 66 69  ig-lookup *confi
1080: 67 64 61 74 2a 20 22 73 65 74 75 70 22 20 22 74  gdat* "setup" "t
1090: 68 72 6f 74 74 6c 65 22 29 29 29 29 0a 20 20 20  hrottle")))).   
10a0: 20 28 64 62 3a 73 65 74 2d 73 79 6e 63 20 64 62   (db:set-sync db
10b0: 29 0a 20 20 20 20 28 73 65 74 21 20 72 65 73 20  ).    (set! res 
10c0: 20 20 20 20 20 28 61 70 70 6c 79 20 70 72 6f 63       (apply proc
10d0: 20 64 62 20 70 61 72 61 6d 73 29 29 0a 20 20 20   db params)).   
10e0: 20 28 69 66 20 28 6e 6f 74 20 69 64 62 29 28 73   (if (not idb)(s
10f0: 71 6c 69 74 65 33 3a 66 69 6e 61 6c 69 7a 65 21  qlite3:finalize!
1100: 20 64 62 29 29 0a 20 20 20 20 3b 3b 20 73 63 61   db)).    ;; sca
1110: 6c 65 20 62 79 20 31 30 2c 20 61 76 65 72 61 67  le by 10, averag
1120: 65 20 77 69 74 68 20 63 75 72 72 65 6e 74 20 76  e with current v
1130: 61 6c 75 65 2e 0a 20 20 20 20 28 73 65 74 21 20  alue..    (set! 
1140: 2a 67 6c 6f 62 61 6c 2d 64 65 6c 74 61 2a 20 28  *global-delta* (
1150: 2f 20 28 2b 20 2a 67 6c 6f 62 61 6c 2d 64 65 6c  / (+ *global-del
1160: 74 61 2a 20 28 2a 20 28 2d 20 28 63 75 72 72 65  ta* (* (- (curre
1170: 6e 74 2d 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29  nt-milliseconds)
1180: 20 73 74 61 72 74 2d 6d 73 29 0a 09 09 09 09 09   start-ms)......
1190: 09 20 28 69 66 20 74 68 72 6f 74 74 6c 65 20 74  . (if throttle t
11a0: 68 72 6f 74 74 6c 65 20 30 2e 30 31 29 29 29 0a  hrottle 0.01))).
11b0: 09 09 09 20 20 20 20 32 29 29 0a 20 20 20 20 28  ...    2)).    (
11c0: 69 66 20 28 3e 20 28 61 62 73 20 28 2d 20 2a 6c  if (> (abs (- *l
11d0: 61 73 74 2d 67 6c 6f 62 61 6c 2d 64 65 6c 74 61  ast-global-delta
11e0: 2d 70 72 69 6e 74 65 64 2a 20 2a 67 6c 6f 62 61  -printed* *globa
11f0: 6c 2d 64 65 6c 74 61 2a 29 29 20 30 2e 30 38 29  l-delta*)) 0.08)
1200: 20 3b 3b 20 64 6f 6e 27 74 20 70 72 69 6e 74 20   ;; don't print 
1210: 61 6c 6c 20 74 68 65 20 74 69 6d 65 2c 20 6f 6e  all the time, on
1220: 6c 79 20 69 66 20 69 74 20 63 68 61 6e 67 65 73  ly if it changes
1230: 20 61 20 62 69 74 0a 09 28 62 65 67 69 6e 0a 09   a bit..(begin..
1240: 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 2d 69    (debug:print-i
1250: 6e 66 6f 20 31 20 22 6c 61 75 6e 63 68 20 74 68  nfo 1 "launch th
1260: 72 6f 74 74 6c 65 20 66 61 63 74 6f 72 3d 22 20  rottle factor=" 
1270: 2a 67 6c 6f 62 61 6c 2d 64 65 6c 74 61 2a 29 0a  *global-delta*).
1280: 09 20 20 28 73 65 74 21 20 2a 6c 61 73 74 2d 67  .  (set! *last-g
1290: 6c 6f 62 61 6c 2d 64 65 6c 74 61 2d 70 72 69 6e  lobal-delta-prin
12a0: 74 65 64 2a 20 2a 67 6c 6f 62 61 6c 2d 64 65 6c  ted* *global-del
12b0: 74 61 2a 29 29 29 0a 20 20 20 20 28 64 65 62 75  ta*))).    (debu
12c0: 67 3a 70 72 69 6e 74 2d 69 6e 66 6f 20 31 31 20  g:print-info 11 
12d0: 22 6f 70 65 6e 2d 72 75 6e 2d 63 6c 6f 73 65 2d  "open-run-close-
12e0: 6d 65 61 73 75 72 65 20 45 4e 44 22 20 29 0a 20  measure END" ). 
12f0: 20 20 20 72 65 73 29 29 0a 0a 28 64 65 66 69 6e     res))..(defin
1300: 65 20 28 64 62 3a 69 6e 69 74 69 61 6c 69 7a 65  e (db:initialize
1310: 20 64 62 29 0a 20 20 28 64 65 62 75 67 3a 70 72   db).  (debug:pr
1320: 69 6e 74 2d 69 6e 66 6f 20 31 31 20 22 64 62 3a  int-info 11 "db:
1330: 69 6e 69 74 69 61 6c 69 7a 65 20 53 54 41 52 54  initialize START
1340: 22 29 0a 20 20 28 6c 65 74 2a 20 28 28 63 6f 6e  ").  (let* ((con
1350: 66 69 67 64 61 74 20 28 63 61 72 20 2a 63 6f 6e  figdat (car *con
1360: 66 69 67 69 6e 66 6f 2a 29 29 20 20 3b 3b 20 74  figinfo*))  ;; t
1370: 75 74 20 74 75 74 2c 20 67 6c 6f 62 61 6c 20 77  ut tut, global w
1380: 61 72 6e 69 6e 67 2e 2e 2e 0a 09 20 28 6b 65 79  arning..... (key
1390: 73 20 20 20 20 20 28 63 6f 6e 66 69 67 2d 67 65  s     (config-ge
13a0: 74 2d 66 69 65 6c 64 73 20 63 6f 6e 66 69 67 64  t-fields configd
13b0: 61 74 29 29 0a 09 20 28 68 61 76 65 6b 65 79 73  at)).. (havekeys
13c0: 20 28 3e 20 28 6c 65 6e 67 74 68 20 6b 65 79 73   (> (length keys
13d0: 29 20 30 29 29 0a 09 20 28 6b 65 79 73 74 72 20  ) 0)).. (keystr 
13e0: 20 20 28 6b 65 79 73 2d 3e 6b 65 79 73 74 72 20    (keys->keystr 
13f0: 6b 65 79 73 29 29 0a 09 20 28 66 69 65 6c 64 73  keys)).. (fields
1400: 74 72 20 28 6b 65 79 73 2d 3e 6b 65 79 2f 66 69  tr (keys->key/fi
1410: 65 6c 64 20 6b 65 79 73 29 29 29 0a 20 20 20 20  eld keys))).    
1420: 28 66 6f 72 2d 65 61 63 68 20 28 6c 61 6d 62 64  (for-each (lambd
1430: 61 20 28 6b 65 79 29 0a 09 09 28 6c 65 74 20 28  a (key)...(let (
1440: 28 6b 65 79 6e 20 28 76 65 63 74 6f 72 2d 72 65  (keyn (vector-re
1450: 66 20 6b 65 79 20 30 29 29 29 0a 09 09 20 20 28  f key 0)))...  (
1460: 69 66 20 28 6d 65 6d 62 65 72 20 28 73 74 72 69  if (member (stri
1470: 6e 67 2d 64 6f 77 6e 63 61 73 65 20 6b 65 79 6e  ng-downcase keyn
1480: 29 0a 09 09 09 20 20 20 20 20 20 28 6c 69 73 74  )....      (list
1490: 20 22 72 75 6e 6e 61 6d 65 22 20 22 73 74 61 74   "runname" "stat
14a0: 65 22 20 22 73 74 61 74 75 73 22 20 22 6f 77 6e  e" "status" "own
14b0: 65 72 22 20 22 65 76 65 6e 74 5f 74 69 6d 65 22  er" "event_time"
14c0: 20 22 63 6f 6d 6d 65 6e 74 22 20 22 66 61 69 6c   "comment" "fail
14d0: 5f 63 6f 75 6e 74 22 0a 09 09 09 09 20 20 20 20  _count".....    
14e0: 22 70 61 73 73 5f 63 6f 75 6e 74 22 29 29 0a 09  "pass_count"))..
14f0: 09 20 20 20 20 20 20 28 62 65 67 69 6e 0a 09 09  .      (begin...
1500: 09 28 70 72 69 6e 74 20 22 45 52 52 4f 52 3a 20  .(print "ERROR: 
1510: 79 6f 75 72 20 6b 65 79 20 63 61 6e 6e 6f 74 20  your key cannot 
1520: 62 65 20 6e 61 6d 65 64 20 22 20 6b 65 79 6e 20  be named " keyn 
1530: 22 20 61 73 20 74 68 69 73 20 63 6f 6e 66 6c 69  " as this confli
1540: 63 74 73 20 77 69 74 68 20 74 68 65 20 73 61 6d  cts with the sam
1550: 65 20 6e 61 6d 65 64 20 66 69 65 6c 64 20 69 6e  e named field in
1560: 20 74 68 65 20 72 75 6e 73 20 74 61 62 6c 65 22   the runs table"
1570: 29 0a 09 09 09 28 73 79 73 74 65 6d 20 28 63 6f  )....(system (co
1580: 6e 63 20 22 72 6d 20 2d 66 20 22 20 64 62 70 61  nc "rm -f " dbpa
1590: 74 68 29 29 0a 09 09 09 28 65 78 69 74 20 31 29  th))....(exit 1)
15a0: 29 29 29 29 0a 09 20 20 20 20 20 20 6b 65 79 73  ))))..      keys
15b0: 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65  ).    (sqlite3:e
15c0: 78 65 63 75 74 65 20 64 62 20 22 50 52 41 47 4d  xecute db "PRAGM
15d0: 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20  A synchronous = 
15e0: 4f 46 46 3b 22 29 0a 20 20 20 20 28 73 71 6c 69  OFF;").    (sqli
15f0: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22  te3:execute db "
1600: 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20  CREATE TABLE IF 
1610: 4e 4f 54 20 45 58 49 53 54 53 20 6b 65 79 73 20  NOT EXISTS keys 
1620: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d  (id INTEGER PRIM
1630: 41 52 59 20 4b 45 59 2c 20 66 69 65 6c 64 6e 61  ARY KEY, fieldna
1640: 6d 65 20 54 45 58 54 2c 20 66 69 65 6c 64 74 79  me TEXT, fieldty
1650: 70 65 20 54 45 58 54 2c 20 43 4f 4e 53 54 52 41  pe TEXT, CONSTRA
1660: 49 4e 54 20 6b 65 79 63 6f 6e 73 74 72 61 69 6e  INT keyconstrain
1670: 74 20 55 4e 49 51 55 45 20 28 66 69 65 6c 64 6e  t UNIQUE (fieldn
1680: 61 6d 65 29 29 3b 22 29 0a 20 20 20 20 28 66 6f  ame));").    (fo
1690: 72 2d 65 61 63 68 20 28 6c 61 6d 62 64 61 20 28  r-each (lambda (
16a0: 6b 65 79 29 0a 09 09 28 73 71 6c 69 74 65 33 3a  key)...(sqlite3:
16b0: 65 78 65 63 75 74 65 20 64 62 20 22 49 4e 53 45  execute db "INSE
16c0: 52 54 20 49 4e 54 4f 20 6b 65 79 73 20 28 66 69  RT INTO keys (fi
16d0: 65 6c 64 6e 61 6d 65 2c 66 69 65 6c 64 74 79 70  eldname,fieldtyp
16e0: 65 29 20 56 41 4c 55 45 53 20 28 3f 2c 3f 29 3b  e) VALUES (?,?);
16f0: 22 20 28 6b 65 79 3a 67 65 74 2d 66 69 65 6c 64  " (key:get-field
1700: 6e 61 6d 65 20 6b 65 79 29 28 6b 65 79 3a 67 65  name key)(key:ge
1710: 74 2d 66 69 65 6c 64 74 79 70 65 20 6b 65 79 29  t-fieldtype key)
1720: 29 29 0a 09 20 20 20 20 20 20 6b 65 79 73 29 0a  ))..      keys).
1730: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65      (sqlite3:exe
1740: 63 75 74 65 20 64 62 20 28 63 6f 6e 63 20 0a 09  cute db (conc ..
1750: 09 09 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  .. "CREATE TABLE
1760: 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 72   IF NOT EXISTS r
1770: 75 6e 73 20 28 69 64 20 49 4e 54 45 47 45 52 20  uns (id INTEGER 
1780: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 22 20 0a  PRIMARY KEY, " .
1790: 09 09 09 20 66 69 65 6c 64 73 74 72 20 28 69 66  ... fieldstr (if
17a0: 20 68 61 76 65 6b 65 79 73 20 22 2c 22 20 22 22   havekeys "," ""
17b0: 29 0a 09 09 09 20 22 72 75 6e 6e 61 6d 65 20 54  ).... "runname T
17c0: 45 58 54 2c 22 0a 09 09 09 20 22 73 74 61 74 65  EXT,".... "state
17d0: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27   TEXT DEFAULT ''
17e0: 2c 22 0a 09 09 09 20 22 73 74 61 74 75 73 20 54  ,".... "status T
17f0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 22  EXT DEFAULT '',"
1800: 0a 09 09 09 20 22 6f 77 6e 65 72 20 54 45 58 54  .... "owner TEXT
1810: 20 44 45 46 41 55 4c 54 20 27 27 2c 22 0a 09 09   DEFAULT '',"...
1820: 09 20 22 65 76 65 6e 74 5f 74 69 6d 65 20 54 49  . "event_time TI
1830: 4d 45 53 54 41 4d 50 2c 22 0a 09 09 09 20 22 63  MESTAMP,".... "c
1840: 6f 6d 6d 65 6e 74 20 54 45 58 54 20 44 45 46 41  omment TEXT DEFA
1850: 55 4c 54 20 27 27 2c 22 0a 09 09 09 20 22 66 61  ULT '',".... "fa
1860: 69 6c 5f 63 6f 75 6e 74 20 49 4e 54 45 47 45 52  il_count INTEGER
1870: 20 44 45 46 41 55 4c 54 20 30 2c 22 0a 09 09 09   DEFAULT 0,"....
1880: 20 22 70 61 73 73 5f 63 6f 75 6e 74 20 49 4e 54   "pass_count INT
1890: 45 47 45 52 20 44 45 46 41 55 4c 54 20 30 2c 22  EGER DEFAULT 0,"
18a0: 0a 09 09 09 20 22 43 4f 4e 53 54 52 41 49 4e 54  .... "CONSTRAINT
18b0: 20 72 75 6e 73 63 6f 6e 73 74 72 61 69 6e 74 20   runsconstraint 
18c0: 55 4e 49 51 55 45 20 28 72 75 6e 6e 61 6d 65 22  UNIQUE (runname"
18d0: 20 28 69 66 20 68 61 76 65 6b 65 79 73 20 22 2c   (if havekeys ",
18e0: 22 20 22 22 29 20 6b 65 79 73 74 72 20 22 29 29  " "") keystr "))
18f0: 3b 22 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65  ;")).    (sqlite
1900: 33 3a 65 78 65 63 75 74 65 20 64 62 20 28 63 6f  3:execute db (co
1910: 6e 63 20 22 43 52 45 41 54 45 20 49 4e 44 45 58  nc "CREATE INDEX
1920: 20 72 75 6e 73 5f 69 6e 64 65 78 20 4f 4e 20 72   runs_index ON r
1930: 75 6e 73 20 28 72 75 6e 6e 61 6d 65 22 20 28 69  uns (runname" (i
1940: 66 20 68 61 76 65 6b 65 79 73 20 22 2c 22 20 22  f havekeys "," "
1950: 22 29 20 6b 65 79 73 74 72 20 22 29 3b 22 29 29  ") keystr ");"))
1960: 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78  .    (sqlite3:ex
1970: 65 63 75 74 65 20 64 62 20 0a 09 09 20 20 20 20  ecute db ...    
1980: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49   "CREATE TABLE I
1990: 46 20 4e 4f 54 20 45 58 49 53 54 53 20 74 65 73  F NOT EXISTS tes
19a0: 74 73 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ts .            
19b0: 20 20 20 20 20 20 20 20 28 69 64 20 49 4e 54 45          (id INTE
19c0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
19d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19e0: 20 20 20 20 20 20 72 75 6e 5f 69 64 20 20 20 20        run_id    
19f0: 20 49 4e 54 45 47 45 52 2c 0a 20 20 20 20 20 20   INTEGER,.      
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1a10: 65 73 74 6e 61 6d 65 20 20 20 54 45 58 54 2c 0a  estname   TEXT,.
1a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a30: 20 20 20 20 20 68 6f 73 74 20 20 20 20 20 20 20       host       
1a40: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 6e 2f  TEXT DEFAULT 'n/
1a50: 61 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  a',.            
1a60: 20 20 20 20 20 20 20 20 20 63 70 75 6c 6f 61 64           cpuload
1a70: 20 20 20 20 52 45 41 4c 20 44 45 46 41 55 4c 54      REAL DEFAULT
1a80: 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20   -1,.           
1a90: 20 20 20 20 20 20 20 20 20 20 64 69 73 6b 66 72            diskfr
1aa0: 65 65 20 20 20 49 4e 54 45 47 45 52 20 44 45 46  ee   INTEGER DEF
1ab0: 41 55 4c 54 20 2d 31 2c 0a 20 20 20 20 20 20 20  AULT -1,.       
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 6e                un
1ad0: 61 6d 65 20 20 20 20 20 20 54 45 58 54 20 44 45  ame      TEXT DE
1ae0: 46 41 55 4c 54 20 27 6e 2f 61 27 2c 20 0a 20 20  FAULT 'n/a', .  
1af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b00: 20 20 20 72 75 6e 64 69 72 20 20 20 20 20 54 45     rundir     TE
1b10: 58 54 20 44 45 46 41 55 4c 54 20 27 6e 2f 61 27  XT DEFAULT 'n/a'
1b20: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b30: 20 20 20 20 20 20 20 73 68 6f 72 74 64 69 72 20         shortdir 
1b40: 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27    TEXT DEFAULT '
1b50: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ',.             
1b60: 20 20 20 20 20 20 20 20 69 74 65 6d 5f 70 61 74          item_pat
1b70: 68 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20  h  TEXT DEFAULT 
1b80: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '',.            
1b90: 20 20 20 20 20 20 20 20 20 73 74 61 74 65 20 20           state  
1ba0: 20 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54      TEXT DEFAULT
1bb0: 20 27 4e 4f 54 5f 53 54 41 52 54 45 44 27 2c 0a   'NOT_STARTED',.
1bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd0: 20 20 20 20 20 73 74 61 74 75 73 20 20 20 20 20       status     
1be0: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 46 41  TEXT DEFAULT 'FA
1bf0: 49 4c 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20  IL',.           
1c00: 20 20 20 20 20 20 20 20 20 20 61 74 74 65 6d 70            attemp
1c10: 74 6e 75 6d 20 49 4e 54 45 47 45 52 20 44 45 46  tnum INTEGER DEF
1c20: 41 55 4c 54 20 30 2c 0a 20 20 20 20 20 20 20 20  AULT 0,.        
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6e               fin
1c40: 61 6c 5f 6c 6f 67 66 20 54 45 58 54 20 44 45 46  al_logf TEXT DEF
1c50: 41 55 4c 54 20 27 6c 6f 67 73 2f 66 69 6e 61 6c  AULT 'logs/final
1c60: 2e 6c 6f 67 27 2c 0a 20 20 20 20 20 20 20 20 20  .log',.         
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 67 64              logd
1c80: 61 74 20 20 20 20 20 42 4c 4f 42 2c 20 0a 20 20  at     BLOB, .  
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca0: 20 20 20 72 75 6e 5f 64 75 72 61 74 69 6f 6e 20     run_duration 
1cb0: 49 4e 54 45 47 45 52 20 44 45 46 41 55 4c 54 20  INTEGER DEFAULT 
1cc0: 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
1cd0: 20 20 20 20 20 20 20 20 63 6f 6d 6d 65 6e 74 20          comment 
1ce0: 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20     TEXT DEFAULT 
1cf0: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '',.            
1d00: 20 20 20 20 20 20 20 20 20 65 76 65 6e 74 5f 74           event_t
1d10: 69 6d 65 20 54 49 4d 45 53 54 41 4d 50 2c 0a 20  ime TIMESTAMP,. 
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d30: 20 20 20 20 66 61 69 6c 5f 63 6f 75 6e 74 20 49      fail_count I
1d40: 4e 54 45 47 45 52 20 44 45 46 41 55 4c 54 20 30  NTEGER DEFAULT 0
1d50: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d60: 20 20 20 20 20 20 20 70 61 73 73 5f 63 6f 75 6e         pass_coun
1d70: 74 20 49 4e 54 45 47 45 52 20 44 45 46 41 55 4c  t INTEGER DEFAUL
1d80: 54 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  T 0,.           
1d90: 20 20 20 20 20 20 20 20 20 20 61 72 63 68 69 76            archiv
1da0: 65 64 20 20 20 49 4e 54 45 47 45 52 20 44 45 46  ed   INTEGER DEF
1db0: 41 55 4c 54 20 30 2c 20 2d 2d 20 30 3d 6e 6f 2c  AULT 0, -- 0=no,
1dc0: 20 31 3d 69 6e 20 70 72 6f 67 72 65 73 73 2c 20   1=in progress, 
1dd0: 32 3d 79 65 73 0a 20 20 20 20 20 20 20 20 20 20  2=yes.          
1de0: 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e 53 54             CONST
1df0: 52 41 49 4e 54 20 74 65 73 74 73 63 6f 6e 73 74  RAINT testsconst
1e00: 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28 72 75  raint UNIQUE (ru
1e10: 6e 5f 69 64 2c 20 74 65 73 74 6e 61 6d 65 2c 20  n_id, testname, 
1e20: 69 74 65 6d 5f 70 61 74 68 29 0a 20 20 20 20 20  item_path).     
1e30: 20 20 20 20 20 29 3b 22 29 0a 20 20 20 20 28 73       );").    (s
1e40: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64  qlite3:execute d
1e50: 62 20 22 43 52 45 41 54 45 20 49 4e 44 45 58 20  b "CREATE INDEX 
1e60: 74 65 73 74 73 5f 69 6e 64 65 78 20 4f 4e 20 74  tests_index ON t
1e70: 65 73 74 73 20 28 72 75 6e 5f 69 64 2c 20 74 65  ests (run_id, te
1e80: 73 74 6e 61 6d 65 2c 20 69 74 65 6d 5f 70 61 74  stname, item_pat
1e90: 68 29 3b 22 29 0a 20 20 20 20 28 73 71 6c 69 74  h);").    (sqlit
1ea0: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 43  e3:execute db "C
1eb0: 52 45 41 54 45 20 56 49 45 57 20 72 75 6e 73 5f  REATE VIEW runs_
1ec0: 74 65 73 74 73 20 41 53 20 53 45 4c 45 43 54 20  tests AS SELECT 
1ed0: 2a 20 46 52 4f 4d 20 72 75 6e 73 20 49 4e 4e 45  * FROM runs INNE
1ee0: 52 20 4a 4f 49 4e 20 74 65 73 74 73 20 4f 4e 20  R JOIN tests ON 
1ef0: 72 75 6e 73 2e 69 64 3d 74 65 73 74 73 2e 72 75  runs.id=tests.ru
1f00: 6e 5f 69 64 3b 22 29 0a 20 20 20 20 28 73 71 6c  n_id;").    (sql
1f10: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
1f20: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46  "CREATE TABLE IF
1f30: 20 4e 4f 54 20 45 58 49 53 54 53 20 74 65 73 74   NOT EXISTS test
1f40: 5f 73 74 65 70 73 20 0a 20 20 20 20 20 20 20 20  _steps .        
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f60: 20 20 20 20 20 20 28 69 64 20 49 4e 54 45 47 45        (id INTEGE
1f70: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a 20  R PRIMARY KEY,. 
1f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
1fa0: 73 74 5f 69 64 20 49 4e 54 45 47 45 52 2c 20 0a  st_id INTEGER, .
1fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1fd0: 74 65 70 6e 61 6d 65 20 54 45 58 54 2c 20 0a 20  tepname TEXT, . 
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
2000: 61 74 65 20 54 45 58 54 20 44 45 46 41 55 4c 54  ate TEXT DEFAULT
2010: 20 27 4e 4f 54 5f 53 54 41 52 54 45 44 27 2c 20   'NOT_STARTED', 
2020: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2040: 73 74 61 74 75 73 20 54 45 58 54 20 44 45 46 41  status TEXT DEFA
2050: 55 4c 54 20 27 6e 2f 61 27 2c 0a 20 20 20 20 20  ULT 'n/a',.     
2060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2070: 20 20 20 20 20 20 20 20 20 20 65 76 65 6e 74 5f            event_
2080: 74 69 6d 65 20 54 49 4d 45 53 54 41 4d 50 2c 0a  time TIMESTAMP,.
2090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
20b0: 6f 6d 6d 65 6e 74 20 54 45 58 54 20 44 45 46 41  omment TEXT DEFA
20c0: 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20  ULT '',.        
20d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e0: 20 20 20 20 20 20 20 6c 6f 67 66 69 6c 65 20 54         logfile T
20f0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a  EXT DEFAULT '',.
2100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43                 C
2120: 4f 4e 53 54 52 41 49 4e 54 20 74 65 73 74 5f 73  ONSTRAINT test_s
2130: 74 65 70 73 5f 63 6f 6e 73 74 72 61 69 6e 74 20  teps_constraint 
2140: 55 4e 49 51 55 45 20 28 74 65 73 74 5f 69 64 2c  UNIQUE (test_id,
2150: 73 74 65 70 6e 61 6d 65 2c 73 74 61 74 65 29 29  stepname,state))
2160: 3b 22 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33  ;").    (sqlite3
2170: 3a 65 78 65 63 75 74 65 20 64 62 20 22 43 52 45  :execute db "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 65 78 74 72 61 64 61 74   EXISTS extradat
21a0: 20 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49   (id INTEGER PRI
21b0: 4d 41 52 59 20 4b 45 59 2c 20 72 75 6e 5f 69 64  MARY KEY, run_id
21c0: 20 49 4e 54 45 47 45 52 2c 20 6b 65 79 20 54 45   INTEGER, key TE
21d0: 58 54 2c 20 76 61 6c 20 54 45 58 54 29 3b 22 29  XT, val TEXT);")
21e0: 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78  .    (sqlite3:ex
21f0: 65 63 75 74 65 20 64 62 20 22 43 52 45 41 54 45  ecute db "CREATE
2200: 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58   TABLE IF NOT EX
2210: 49 53 54 53 20 6d 65 74 61 64 61 74 20 28 69 64  ISTS metadat (id
2220: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
2230: 20 4b 45 59 2c 20 76 61 72 20 54 45 58 54 2c 20   KEY, var TEXT, 
2240: 76 61 6c 20 54 45 58 54 2c 0a 20 20 20 20 20 20  val TEXT,.      
2250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2260: 20 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e 53              CONS
2270: 54 52 41 49 4e 54 20 6d 65 74 61 64 61 74 5f 63  TRAINT metadat_c
2280: 6f 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45  onstraint UNIQUE
2290: 20 28 76 61 72 29 29 3b 22 29 0a 20 20 20 20 28   (var));").    (
22a0: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
22b0: 64 62 20 22 43 52 45 41 54 45 20 54 41 42 4c 45  db "CREATE TABLE
22c0: 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20 61   IF NOT EXISTS a
22d0: 63 63 65 73 73 5f 6c 6f 67 20 28 69 64 20 49 4e  ccess_log (id IN
22e0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
22f0: 59 2c 20 75 73 65 72 20 54 45 58 54 2c 20 61 63  Y, user TEXT, ac
2300: 63 65 73 73 65 64 20 54 49 4d 45 53 54 41 4d 50  cessed TIMESTAMP
2310: 2c 20 61 72 67 73 20 54 45 58 54 29 3b 22 29 0a  , args TEXT);").
2320: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65      (sqlite3:exe
2330: 63 75 74 65 20 64 62 20 22 43 52 45 41 54 45 20  cute db "CREATE 
2340: 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49  TABLE IF NOT EXI
2350: 53 54 53 20 74 65 73 74 5f 6d 65 74 61 20 28 69  STS test_meta (i
2360: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  d INTEGER PRIMAR
2370: 59 20 4b 45 59 2c 0a 20 20 20 20 20 20 20 20 20  Y KEY,.         
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 74 65 73 74              test
23a0: 6e 61 6d 65 20 20 20 20 54 45 58 54 20 44 45 46  name    TEXT DEF
23b0: 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20  AULT '',.       
23c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 75                au
23e0: 74 68 6f 72 20 20 20 20 20 20 54 45 58 54 20 44  thor      TEXT D
23f0: 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20  EFAULT '',.     
2400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2420: 6f 77 6e 65 72 20 20 20 20 20 20 20 54 45 58 54  owner       TEXT
2430: 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20   DEFAULT '',.   
2440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2460: 20 20 64 65 73 63 72 69 70 74 69 6f 6e 20 54 45    description TE
2470: 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20  XT DEFAULT '',. 
2480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24a0: 20 20 20 20 72 65 76 69 65 77 65 64 20 20 20 20      reviewed    
24b0: 54 49 4d 45 53 54 41 4d 50 2c 0a 20 20 20 20 20  TIMESTAMP,.     
24c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e0: 69 74 65 72 61 74 65 64 20 20 20 20 54 45 58 54  iterated    TEXT
24f0: 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20   DEFAULT '',.   
2500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2520: 20 20 61 76 67 5f 72 75 6e 74 69 6d 65 20 52 45    avg_runtime RE
2530: 41 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  AL,.            
2540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2550: 20 20 20 20 20 20 20 20 20 61 76 67 5f 64 69 73           avg_dis
2560: 6b 20 20 20 20 52 45 41 4c 2c 0a 20 20 20 20 20  k    REAL,.     
2570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2590: 74 61 67 73 20 20 20 20 20 20 20 20 54 45 58 54  tags        TEXT
25a0: 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20   DEFAULT '',.   
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 6a 6f 62 67 72 6f 75 70 20 20 20 20 54 45    jobgroup    TE
25e0: 58 54 20 44 45 46 41 55 4c 54 20 27 64 65 66 61  XT DEFAULT 'defa
25f0: 75 6c 74 27 2c 0a 20 20 20 20 20 20 20 20 20 20  ult',.          
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2610: 20 20 20 20 20 20 43 4f 4e 53 54 52 41 49 4e 54        CONSTRAINT
2620: 20 74 65 73 74 5f 6d 65 74 61 5f 63 6f 6e 73 74   test_meta_const
2630: 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28 74 65  raint UNIQUE (te
2640: 73 74 6e 61 6d 65 29 29 3b 22 29 0a 20 20 20 20  stname));").    
2650: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
2660: 20 64 62 20 22 43 52 45 41 54 45 20 54 41 42 4c   db "CREATE TABL
2670: 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20  E IF NOT EXISTS 
2680: 74 65 73 74 5f 64 61 74 61 20 28 69 64 20 49 4e  test_data (id IN
2690: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
26a0: 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y,.             
26b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c0: 20 20 20 74 65 73 74 5f 69 64 20 49 4e 54 45 47     test_id INTEG
26d0: 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ER,.            
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f0: 20 20 20 20 63 61 74 65 67 6f 72 79 20 54 45 58      category TEX
2700: 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20  T DEFAULT '',.  
2710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76 61                va
2730: 72 69 61 62 6c 65 20 54 45 58 54 2c 0a 09 20 20  riable TEXT,..  
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2750: 20 20 20 20 20 20 76 61 6c 75 65 20 52 45 41 4c        value REAL
2760: 2c 0a 09 20 20 20 20 20 20 20 20 20 20 20 20 20  ,..             
2770: 20 20 20 20 20 20 20 20 20 20 20 65 78 70 65 63             expec
2780: 74 65 64 20 52 45 41 4c 2c 0a 09 20 20 20 20 20  ted REAL,..     
2790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27a0: 20 20 20 74 6f 6c 20 52 45 41 4c 2c 0a 20 20 20     tol REAL,.   
27b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 69               uni
27d0: 74 73 20 54 45 58 54 2c 0a 20 20 20 20 20 20 20  ts TEXT,.       
27e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27f0: 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 65 6e 74           comment
2800: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27   TEXT DEFAULT ''
2810: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2830: 20 20 73 74 61 74 75 73 20 54 45 58 54 20 44 45    status TEXT DE
2840: 46 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20 20 20  FAULT 'n/a',.   
2850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2860: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 79 70               typ
2870: 65 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27  e TEXT DEFAULT '
2880: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ',.             
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a0: 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 65 73 74   CONSTRAINT test
28b0: 5f 64 61 74 61 5f 63 6f 6e 73 74 72 61 69 6e 74  _data_constraint
28c0: 20 55 4e 49 51 55 45 20 28 74 65 73 74 5f 69 64   UNIQUE (test_id
28d0: 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62  ,category,variab
28e0: 6c 65 29 29 3b 22 29 0a 20 20 20 20 3b 3b 20 4d  le));").    ;; M
28f0: 75 73 74 20 64 6f 20 74 68 69 73 20 2a 61 66 74  ust do this *aft
2900: 65 72 2a 20 72 75 6e 6e 69 6e 67 20 70 61 74 63  er* running patc
2910: 68 20 64 62 20 21 21 20 4e 6f 20 6d 6f 72 65 2e  h db !! No more.
2920: 20 0a 20 20 20 20 28 64 62 3a 73 65 74 2d 76 61   .    (db:set-va
2930: 72 20 64 62 20 22 4d 45 47 41 54 45 53 54 5f 56  r db "MEGATEST_V
2940: 45 52 53 49 4f 4e 22 20 6d 65 67 61 74 65 73 74  ERSION" megatest
2950: 2d 76 65 72 73 69 6f 6e 29 0a 20 20 20 20 28 64  -version).    (d
2960: 65 62 75 67 3a 70 72 69 6e 74 2d 69 6e 66 6f 20  ebug:print-info 
2970: 31 31 20 22 64 62 3a 69 6e 69 74 69 61 6c 69 7a  11 "db:initializ
2980: 65 20 45 4e 44 22 29 0a 20 20 20 20 29 29 0a 0a  e END").    ))..
2990: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
29a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
29b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
29c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
29d0: 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 54 20 45 20  ========.;; T E 
29e0: 53 20 54 20 20 20 53 20 50 20 45 20 43 20 49 20  S T   S P E C I 
29f0: 46 20 49 20 43 20 20 20 44 20 42 20 0a 3b 3b 3d  F I C   D B .;;=
2a00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2a10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2a20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2a30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2a40: 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 43 72 65 61 74 65  =====..;; Create
2a50: 20 74 68 65 20 73 71 6c 69 74 65 20 64 62 20 66   the sqlite db f
2a60: 6f 72 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  or the individua
2a70: 6c 20 74 65 73 74 28 73 29 0a 28 64 65 66 69 6e  l test(s).(defin
2a80: 65 20 28 6f 70 65 6e 2d 74 65 73 74 2d 64 62 20  e (open-test-db 
2a90: 74 65 73 74 70 61 74 68 29 20 0a 20 20 28 64 65  testpath) .  (de
2aa0: 62 75 67 3a 70 72 69 6e 74 2d 69 6e 66 6f 20 31  bug:print-info 1
2ab0: 31 20 22 6f 70 65 6e 2d 74 65 73 74 2d 64 62 20  1 "open-test-db 
2ac0: 22 20 74 65 73 74 70 61 74 68 29 0a 20 20 28 69  " testpath).  (i
2ad0: 66 20 28 61 6e 64 20 28 64 69 72 65 63 74 6f 72  f (and (director
2ae0: 79 3f 20 74 65 73 74 70 61 74 68 29 0a 09 20 20  y? testpath)..  
2af0: 20 28 66 69 6c 65 2d 72 65 61 64 2d 61 63 63 65   (file-read-acce
2b00: 73 73 3f 20 74 65 73 74 70 61 74 68 29 29 0a 20  ss? testpath)). 
2b10: 20 20 20 20 20 28 6c 65 74 2a 20 28 28 64 62 70       (let* ((dbp
2b20: 61 74 68 20 20 20 20 28 63 6f 6e 63 20 74 65 73  ath    (conc tes
2b30: 74 70 61 74 68 20 22 2f 74 65 73 74 64 61 74 2e  tpath "/testdat.
2b40: 64 62 22 29 29 0a 09 20 20 20 20 20 28 64 62 65  db"))..     (dbe
2b50: 78 69 73 74 73 20 20 28 66 69 6c 65 2d 65 78 69  xists  (file-exi
2b60: 73 74 73 3f 20 64 62 70 61 74 68 29 29 0a 09 20  sts? dbpath)).. 
2b70: 20 20 20 20 28 64 62 20 20 20 20 20 20 20 20 28      (db        (
2b80: 73 71 6c 69 74 65 33 3a 6f 70 65 6e 2d 64 61 74  sqlite3:open-dat
2b90: 61 62 61 73 65 20 64 62 70 61 74 68 29 29 20 3b  abase dbpath)) ;
2ba0: 3b 20 28 6e 65 76 65 72 2d 67 69 76 65 2d 75 70  ; (never-give-up
2bb0: 2d 6f 70 65 6e 2d 64 62 20 64 62 70 61 74 68 29  -open-db dbpath)
2bc0: 29 0a 09 20 20 20 20 20 28 68 61 6e 64 6c 65 72  )..     (handler
2bd0: 20 20 20 28 6d 61 6b 65 2d 62 75 73 79 2d 74 69     (make-busy-ti
2be0: 6d 65 6f 75 74 20 28 69 66 20 28 61 72 67 73 3a  meout (if (args:
2bf0: 67 65 74 2d 61 72 67 20 22 2d 6f 76 65 72 72 69  get-arg "-overri
2c00: 64 65 2d 74 69 6d 65 6f 75 74 22 29 0a 09 09 09  de-timeout")....
2c10: 09 09 20 20 20 20 20 20 20 28 73 74 72 69 6e 67  ..       (string
2c20: 2d 3e 6e 75 6d 62 65 72 20 28 61 72 67 73 3a 67  ->number (args:g
2c30: 65 74 2d 61 72 67 20 22 2d 6f 76 65 72 72 69 64  et-arg "-overrid
2c40: 65 2d 74 69 6d 65 6f 75 74 22 29 29 0a 09 09 09  e-timeout"))....
2c50: 09 09 20 20 20 20 20 20 20 31 33 36 30 30 30 29  ..       136000)
2c60: 29 29 29 0a 09 28 73 71 6c 69 74 65 33 3a 73 65  )))..(sqlite3:se
2c70: 74 2d 62 75 73 79 2d 68 61 6e 64 6c 65 72 21 20  t-busy-handler! 
2c80: 64 62 20 68 61 6e 64 6c 65 72 29 0a 09 28 69 66  db handler)..(if
2c90: 20 28 6e 6f 74 20 64 62 65 78 69 73 74 73 29 0a   (not dbexists).
2ca0: 09 20 20 20 20 28 62 65 67 69 6e 0a 09 20 20 20  .    (begin..   
2cb0: 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63     (sqlite3:exec
2cc0: 75 74 65 20 64 62 20 22 50 52 41 47 4d 41 20 73  ute db "PRAGMA s
2cd0: 79 6e 63 68 72 6f 6e 6f 75 73 20 3d 20 46 55 4c  ynchronous = FUL
2ce0: 4c 3b 22 29 0a 09 20 20 20 20 20 20 28 64 65 62  L;")..      (deb
2cf0: 75 67 3a 70 72 69 6e 74 2d 69 6e 66 6f 20 31 31  ug:print-info 11
2d00: 20 22 49 6e 69 74 69 61 6c 69 7a 65 64 20 74 65   "Initialized te
2d10: 73 74 20 64 61 74 61 62 61 73 65 20 22 20 64 62  st database " db
2d20: 70 61 74 68 29 0a 09 20 20 20 20 20 20 28 64 62  path)..      (db
2d30: 3a 74 65 73 74 64 62 2d 69 6e 69 74 69 61 6c 69  :testdb-initiali
2d40: 7a 65 20 64 62 29 29 29 0a 09 3b 3b 20 28 73 71  ze db)))..;; (sq
2d50: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62  lite3:execute db
2d60: 20 22 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f   "PRAGMA synchro
2d70: 6e 6f 75 73 20 3d 20 30 3b 22 29 0a 09 28 64 65  nous = 0;")..(de
2d80: 62 75 67 3a 70 72 69 6e 74 2d 69 6e 66 6f 20 31  bug:print-info 1
2d90: 31 20 22 6f 70 65 6e 2d 74 65 73 74 2d 64 62 20  1 "open-test-db 
2da0: 45 4e 44 20 28 73 75 63 65 73 73 66 75 6c 29 22  END (sucessful)"
2db0: 20 74 65 73 74 70 61 74 68 29 0a 09 64 62 29 0a   testpath)..db).
2dc0: 20 20 20 20 20 20 28 62 65 67 69 6e 0a 09 28 64        (begin..(d
2dd0: 65 62 75 67 3a 70 72 69 6e 74 2d 69 6e 66 6f 20  ebug:print-info 
2de0: 31 31 20 22 6f 70 65 6e 2d 74 65 73 74 2d 64 62  11 "open-test-db
2df0: 20 45 4e 44 20 28 75 6e 73 75 63 65 73 73 66 75   END (unsucessfu
2e00: 6c 29 22 20 74 65 73 74 70 61 74 68 29 0a 09 23  l)" testpath)..#
2e10: 66 29 29 29 0a 0a 3b 3b 20 66 69 6e 64 20 61 6e  f)))..;; find an
2e20: 64 20 6f 70 65 6e 20 74 68 65 20 74 65 73 74 64  d open the testd
2e30: 61 74 2e 64 62 20 66 69 6c 65 20 66 6f 72 20 61  at.db file for a
2e40: 6e 20 65 78 69 73 74 69 6e 67 20 74 65 73 74 0a  n existing test.
2e50: 28 64 65 66 69 6e 65 20 28 64 62 3a 6f 70 65 6e  (define (db:open
2e60: 2d 74 65 73 74 2d 64 62 2d 62 79 2d 74 65 73 74  -test-db-by-test
2e70: 2d 69 64 20 64 62 20 74 65 73 74 2d 69 64 29 0a  -id db test-id).
2e80: 20 20 28 6c 65 74 2a 20 28 28 74 65 73 74 2d 70    (let* ((test-p
2e90: 61 74 68 20 28 64 62 3a 74 65 73 74 2d 67 65 74  ath (db:test-get
2ea0: 2d 72 75 6e 64 69 72 2d 66 72 6f 6d 2d 74 65 73  -rundir-from-tes
2eb0: 74 2d 69 64 20 64 62 20 74 65 73 74 2d 69 64 29  t-id db test-id)
2ec0: 29 29 0a 20 20 20 20 28 6f 70 65 6e 2d 74 65 73  )).    (open-tes
2ed0: 74 2d 64 62 20 74 65 73 74 2d 70 61 74 68 29 29  t-db test-path))
2ee0: 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 74  )..(define (db:t
2ef0: 65 73 74 64 62 2d 69 6e 69 74 69 61 6c 69 7a 65  estdb-initialize
2f00: 20 64 62 29 0a 20 20 28 64 65 62 75 67 3a 70 72   db).  (debug:pr
2f10: 69 6e 74 20 31 31 20 22 64 62 3a 74 65 73 74 64  int 11 "db:testd
2f20: 62 2d 69 6e 69 74 69 61 6c 69 7a 65 20 53 54 41  b-initialize STA
2f30: 52 54 22 29 0a 20 20 28 66 6f 72 2d 65 61 63 68  RT").  (for-each
2f40: 0a 20 20 20 28 6c 61 6d 62 64 61 20 28 73 71 6c  .   (lambda (sql
2f50: 63 6d 64 29 0a 20 20 20 20 20 28 73 71 6c 69 74  cmd).     (sqlit
2f60: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 73 71  e3:execute db sq
2f70: 6c 63 6d 64 29 29 0a 20 20 20 28 6c 69 73 74 20  lcmd)).   (list 
2f80: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46  "CREATE TABLE IF
2f90: 20 4e 4f 54 20 45 58 49 53 54 53 20 74 65 73 74   NOT EXISTS test
2fa0: 5f 72 75 6e 64 61 74 20 28 0a 20 20 20 20 20 20  _rundat (.      
2fb0: 20 20 20 20 20 20 20 20 69 64 20 49 4e 54 45 47          id INTEG
2fc0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a  ER PRIMARY KEY,.
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 70                up
2fe0: 64 61 74 65 5f 74 69 6d 65 20 54 49 4d 45 53 54  date_time TIMEST
2ff0: 41 4d 50 2c 0a 20 20 20 20 20 20 20 20 20 20 20  AMP,.           
3000: 20 20 20 63 70 75 6c 6f 61 64 20 49 4e 54 45 47     cpuload INTEG
3010: 45 52 20 44 45 46 41 55 4c 54 20 2d 31 2c 0a 20  ER DEFAULT -1,. 
3020: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
3030: 6b 66 72 65 65 20 49 4e 54 45 47 45 52 20 44 45  kfree INTEGER DE
3040: 46 41 55 4c 54 20 2d 31 2c 0a 20 20 20 20 20 20  FAULT -1,.      
3050: 20 20 20 20 20 20 20 20 64 69 73 6b 75 73 61 67          diskusag
3060: 65 20 49 4e 54 47 45 52 20 44 45 46 41 55 4c 54  e INTGER DEFAULT
3070: 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20   -1,.           
3080: 20 20 20 72 75 6e 5f 64 75 72 61 74 69 6f 6e 20     run_duration 
3090: 49 4e 54 45 47 45 52 20 44 45 46 41 55 4c 54 20  INTEGER DEFAULT 
30a0: 30 29 3b 22 0a 09 20 22 43 52 45 41 54 45 20 54  0);".. "CREATE T
30b0: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
30c0: 54 53 20 74 65 73 74 5f 64 61 74 61 20 28 0a 20  TS test_data (. 
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 64 20               id 
30e0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
30f0: 4b 45 59 2c 0a 20 20 20 20 20 20 20 20 20 20 20  KEY,.           
3100: 20 20 20 74 65 73 74 5f 69 64 20 49 4e 54 45 47     test_id INTEG
3110: 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ER,.            
3120: 20 20 63 61 74 65 67 6f 72 79 20 54 45 58 54 20    category TEXT 
3130: 44 45 46 41 55 4c 54 20 27 27 2c 0a 20 20 20 20  DEFAULT '',.    
3140: 20 20 20 20 20 20 20 20 20 20 76 61 72 69 61 62            variab
3150: 6c 65 20 54 45 58 54 2c 0a 09 20 20 20 20 20 20  le TEXT,..      
3160: 76 61 6c 75 65 20 52 45 41 4c 2c 0a 09 20 20 20  value REAL,..   
3170: 20 20 20 65 78 70 65 63 74 65 64 20 52 45 41 4c     expected REAL
3180: 2c 0a 09 20 20 20 20 20 20 74 6f 6c 20 52 45 41  ,..      tol REA
3190: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
31a0: 20 75 6e 69 74 73 20 54 45 58 54 2c 0a 20 20 20   units TEXT,.   
31b0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6d 6d 65             comme
31c0: 6e 74 20 54 45 58 54 20 44 45 46 41 55 4c 54 20  nt TEXT DEFAULT 
31d0: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '',.            
31e0: 20 20 73 74 61 74 75 73 20 54 45 58 54 20 44 45    status TEXT DE
31f0: 46 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20 20 20  FAULT 'n/a',.   
3200: 20 20 20 20 20 20 20 20 20 20 20 74 79 70 65 20             type 
3210: 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c  TEXT DEFAULT '',
3220: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43  .              C
3230: 4f 4e 53 54 52 41 49 4e 54 20 74 65 73 74 5f 64  ONSTRAINT test_d
3240: 61 74 61 5f 63 6f 6e 73 74 72 61 69 6e 74 20 55  ata_constraint U
3250: 4e 49 51 55 45 20 28 74 65 73 74 5f 69 64 2c 63  NIQUE (test_id,c
3260: 61 74 65 67 6f 72 79 2c 76 61 72 69 61 62 6c 65  ategory,variable
3270: 29 29 3b 22 0a 09 20 22 43 52 45 41 54 45 20 54  ));".. "CREATE T
3280: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
3290: 54 53 20 74 65 73 74 5f 73 74 65 70 73 20 28 0a  TS test_steps (.
32a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 64                id
32b0: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
32c0: 20 4b 45 59 2c 0a 20 20 20 20 20 20 20 20 20 20   KEY,.          
32d0: 20 20 20 20 74 65 73 74 5f 69 64 20 49 4e 54 45      test_id INTE
32e0: 47 45 52 2c 20 0a 20 20 20 20 20 20 20 20 20 20  GER, .          
32f0: 20 20 20 20 73 74 65 70 6e 61 6d 65 20 54 45 58      stepname TEX
3300: 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  T, .            
3310: 20 20 73 74 61 74 65 20 54 45 58 54 20 44 45 46    state TEXT DEF
3320: 41 55 4c 54 20 27 4e 4f 54 5f 53 54 41 52 54 45  AULT 'NOT_STARTE
3330: 44 27 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  D', .           
3340: 20 20 20 73 74 61 74 75 73 20 54 45 58 54 20 44     status TEXT D
3350: 45 46 41 55 4c 54 20 27 6e 2f 61 27 2c 0a 20 20  EFAULT 'n/a',.  
3360: 20 20 20 20 20 20 20 20 20 20 20 20 65 76 65 6e              even
3370: 74 5f 74 69 6d 65 20 54 49 4d 45 53 54 41 4d 50  t_time TIMESTAMP
3380: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3390: 63 6f 6d 6d 65 6e 74 20 54 45 58 54 20 44 45 46  comment TEXT DEF
33a0: 41 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20  AULT '',.       
33b0: 20 20 20 20 20 20 20 6c 6f 67 66 69 6c 65 20 54         logfile T
33c0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 27 2c 0a  EXT DEFAULT '',.
33d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 4f                CO
33e0: 4e 53 54 52 41 49 4e 54 20 74 65 73 74 5f 73 74  NSTRAINT test_st
33f0: 65 70 73 5f 63 6f 6e 73 74 72 61 69 6e 74 20 55  eps_constraint U
3400: 4e 49 51 55 45 20 28 74 65 73 74 5f 69 64 2c 73  NIQUE (test_id,s
3410: 74 65 70 6e 61 6d 65 2c 73 74 61 74 65 29 29 3b  tepname,state));
3420: 22 0a 09 20 3b 3b 20 74 65 73 74 5f 6d 65 74 61  ".. ;; test_meta
3430: 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72   can be used for
3440: 20 68 61 6e 64 69 6e 67 20 63 6f 6d 6d 61 6e 64   handing command
3450: 73 20 74 6f 20 74 68 65 20 74 65 73 74 0a 09 20  s to the test.. 
3460: 3b 3b 20 65 2e 67 2e 20 4b 49 4c 4c 52 45 51 0a  ;; e.g. KILLREQ.
3470: 09 20 3b 3b 20 20 20 20 20 20 74 68 65 20 61 63  . ;;      the ac
3480: 6b 73 74 61 74 65 20 69 73 20 73 65 74 20 74 6f  kstate is set to
3490: 20 31 20 6f 6e 63 65 20 74 68 65 20 63 6f 6d 6d   1 once the comm
34a0: 61 6e 64 20 68 61 73 20 62 65 65 6e 20 63 6f 6d  and has been com
34b0: 70 6c 65 74 65 64 0a 09 20 22 43 52 45 41 54 45  pleted.. "CREATE
34c0: 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58   TABLE IF NOT EX
34d0: 49 53 54 53 20 74 65 73 74 5f 6d 65 74 61 20 28  ISTS test_meta (
34e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
34f0: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  d INTEGER PRIMAR
3500: 59 20 4b 45 59 2c 0a 20 20 20 20 20 20 20 20 20  Y KEY,.         
3510: 20 20 20 20 20 76 61 72 20 54 45 58 54 2c 0a 20       var TEXT,. 
3520: 20 20 20 20 20 20 20 20 20 20 20 20 20 76 61 6c               val
3530: 20 54 45 58 54 2c 0a 20 20 20 20 20 20 20 20 20   TEXT,.         
3540: 20 20 20 20 20 61 63 6b 73 74 61 74 65 20 49 4e       ackstate IN
3550: 54 45 47 45 52 20 44 45 46 41 55 4c 54 20 30 2c  TEGER DEFAULT 0,
3560: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43  .              C
3570: 4f 4e 53 54 52 41 49 4e 54 20 6d 65 74 61 64 61  ONSTRAINT metada
3580: 74 5f 63 6f 6e 73 74 72 61 69 6e 74 20 55 4e 49  t_constraint UNI
3590: 51 55 45 20 28 76 61 72 29 29 3b 22 29 29 0a 20  QUE (var));")). 
35a0: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 31 31   (debug:print 11
35b0: 20 22 64 62 3a 74 65 73 74 64 62 2d 69 6e 69 74   "db:testdb-init
35c0: 69 61 6c 69 7a 65 20 45 4e 44 22 29 29 0a 0a 3b  ialize END"))..;
35d0: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;===============
35e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
35f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3600: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3610: 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 4c 20 4f 20 47  =======.;; L O G
3620: 20 47 20 49 20 4e 20 47 20 20 20 20 44 20 42 20   G I N G    D B 
3630: 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  .;;=============
3640: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3650: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3660: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3670: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65 66 69  =========..(defi
3680: 6e 65 20 28 6f 70 65 6e 2d 6c 6f 67 67 69 6e 67  ne (open-logging
3690: 2d 64 62 29 20 3b 3b 20 20 28 63 6f 6e 63 20 2a  -db) ;;  (conc *
36a0: 74 6f 70 70 61 74 68 2a 20 22 2f 6d 65 67 61 74  toppath* "/megat
36b0: 65 73 74 2e 64 62 22 29 20 28 63 61 72 20 2a 63  est.db") (car *c
36c0: 6f 6e 66 69 67 69 6e 66 6f 2a 29 29 29 0a 20 20  onfiginfo*))).  
36d0: 28 6c 65 74 2a 20 28 28 64 62 70 61 74 68 20 20  (let* ((dbpath  
36e0: 20 20 28 63 6f 6e 63 20 28 69 66 20 2a 74 6f 70    (conc (if *top
36f0: 70 61 74 68 2a 20 28 63 6f 6e 63 20 2a 74 6f 70  path* (conc *top
3700: 70 61 74 68 2a 20 22 2f 22 29 20 22 22 29 20 22  path* "/") "") "
3710: 6c 6f 67 67 69 6e 67 2e 64 62 22 29 29 20 3b 3b  logging.db")) ;;
3720: 20 66 6e 61 6d 65 29 0a 09 20 28 64 62 65 78 69   fname).. (dbexi
3730: 73 74 73 20 20 28 66 69 6c 65 2d 65 78 69 73 74  sts  (file-exist
3740: 73 3f 20 64 62 70 61 74 68 29 29 0a 09 20 28 64  s? dbpath)).. (d
3750: 62 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  b        (sqlite
3760: 33 3a 6f 70 65 6e 2d 64 61 74 61 62 61 73 65 20  3:open-database 
3770: 64 62 70 61 74 68 29 29 20 3b 3b 20 28 6e 65 76  dbpath)) ;; (nev
3780: 65 72 2d 67 69 76 65 2d 75 70 2d 6f 70 65 6e 2d  er-give-up-open-
3790: 64 62 20 64 62 70 61 74 68 29 29 0a 09 20 28 68  db dbpath)).. (h
37a0: 61 6e 64 6c 65 72 20 20 20 28 6d 61 6b 65 2d 62  andler   (make-b
37b0: 75 73 79 2d 74 69 6d 65 6f 75 74 20 28 69 66 20  usy-timeout (if 
37c0: 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22 2d  (args:get-arg "-
37d0: 6f 76 65 72 72 69 64 65 2d 74 69 6d 65 6f 75 74  override-timeout
37e0: 22 29 0a 09 09 09 09 09 20 20 20 28 73 74 72 69  ")......   (stri
37f0: 6e 67 2d 3e 6e 75 6d 62 65 72 20 28 61 72 67 73  ng->number (args
3800: 3a 67 65 74 2d 61 72 67 20 22 2d 6f 76 65 72 72  :get-arg "-overr
3810: 69 64 65 2d 74 69 6d 65 6f 75 74 22 29 29 0a 09  ide-timeout"))..
3820: 09 09 09 09 20 20 20 31 33 36 30 30 30 29 29 29  ....   136000)))
3830: 29 20 3b 3b 20 31 33 36 30 30 30 29 29 29 0a 20  ) ;; 136000))). 
3840: 20 20 20 28 73 71 6c 69 74 65 33 3a 73 65 74 2d     (sqlite3:set-
3850: 62 75 73 79 2d 68 61 6e 64 6c 65 72 21 20 64 62  busy-handler! db
3860: 20 68 61 6e 64 6c 65 72 29 0a 20 20 20 20 28 69   handler).    (i
3870: 66 20 28 6e 6f 74 20 64 62 65 78 69 73 74 73 29  f (not dbexists)
3880: 0a 09 28 62 65 67 69 6e 0a 09 20 20 28 73 71 6c  ..(begin..  (sql
3890: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
38a0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46  "CREATE TABLE IF
38b0: 20 4e 4f 54 20 45 58 49 53 54 53 20 6c 6f 67 20   NOT EXISTS log 
38c0: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d  (id INTEGER PRIM
38d0: 41 52 59 20 4b 45 59 2c 65 76 65 6e 74 5f 74 69  ARY KEY,event_ti
38e0: 6d 65 20 54 49 4d 45 53 54 41 4d 50 20 44 45 46  me TIMESTAMP DEF
38f0: 41 55 4c 54 20 28 73 74 72 66 74 69 6d 65 28 27  AULT (strftime('
3900: 25 73 27 2c 27 6e 6f 77 27 29 29 2c 6c 6f 67 6c  %s','now')),logl
3910: 69 6e 65 20 54 45 58 54 2c 70 77 64 20 54 45 58  ine TEXT,pwd TEX
3920: 54 2c 63 6d 64 6c 69 6e 65 20 54 45 58 54 2c 70  T,cmdline TEXT,p
3930: 69 64 20 49 4e 54 45 47 45 52 29 3b 22 29 0a 09  id INTEGER);")..
3940: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
3950: 74 65 20 64 62 20 28 63 6f 6e 63 20 22 50 52 41  te db (conc "PRA
3960: 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  GMA synchronous 
3970: 3d 20 30 3b 22 29 29 29 29 0a 20 20 20 20 64 62  = 0;")))).    db
3980: 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  ))..(define (db:
3990: 6c 6f 67 2d 65 76 65 6e 74 20 2e 20 6c 6f 67 6c  log-event . logl
39a0: 73 74 29 0a 20 20 28 6c 65 74 20 28 28 64 62 20  st).  (let ((db 
39b0: 20 20 20 20 20 28 6f 70 65 6e 2d 6c 6f 67 67 69       (open-loggi
39c0: 6e 67 2d 64 62 29 29 0a 09 28 6c 6f 67 6c 69 6e  ng-db))..(loglin
39d0: 65 20 28 61 70 70 6c 79 20 63 6f 6e 63 20 6c 6f  e (apply conc lo
39e0: 67 6c 73 74 29 29 29 0a 20 20 20 20 28 73 71 6c  glst))).    (sql
39f0: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
3a00: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 6c 6f 67  "INSERT INTO log
3a10: 20 28 6c 6f 67 6c 69 6e 65 2c 70 77 64 2c 63 6d   (logline,pwd,cm
3a20: 64 6c 69 6e 65 2c 70 69 64 29 20 56 41 4c 55 45  dline,pid) VALUE
3a30: 53 20 28 3f 2c 3f 2c 3f 2c 3f 29 3b 22 20 6c 6f  S (?,?,?,?);" lo
3a40: 67 6c 69 6e 65 20 28 63 75 72 72 65 6e 74 2d 64  gline (current-d
3a50: 69 72 65 63 74 6f 72 79 29 28 73 74 72 69 6e 67  irectory)(string
3a60: 2d 69 6e 74 65 72 73 70 65 72 73 65 20 28 61 72  -intersperse (ar
3a70: 67 76 29 20 22 20 22 29 28 63 75 72 72 65 6e 74  gv) " ")(current
3a80: 2d 70 72 6f 63 65 73 73 2d 69 64 29 29 0a 20 20  -process-id)).  
3a90: 20 20 28 73 71 6c 69 74 65 33 3a 66 69 6e 61 6c    (sqlite3:final
3aa0: 69 7a 65 21 20 64 62 29 0a 20 20 20 20 6c 6f 67  ize! db).    log
3ab0: 6c 69 6e 65 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d  line))..;;======
3ac0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3ad0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3ae0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3af0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3b00: 0a 3b 3b 20 54 4f 44 4f 3a 0a 3b 3b 20 20 20 70  .;; TODO:.;;   p
3b10: 75 74 20 64 65 6c 74 61 73 20 69 6e 74 6f 20 61  ut deltas into a
3b20: 6e 20 61 73 73 6f 63 20 6c 69 73 74 20 77 69 74  n assoc list wit
3b30: 68 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72  h version number
3b40: 73 0a 3b 3b 20 20 20 61 70 70 6c 79 20 61 6c 6c  s.;;   apply all
3b50: 20 66 72 6f 6d 20 6c 61 73 74 20 74 6f 20 63 75   from last to cu
3b60: 72 72 65 6e 74 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d  rrent.;;========
3b70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3b80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3b90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3ba0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 28  ==============.(
3bb0: 64 65 66 69 6e 65 20 28 70 61 74 63 68 2d 64 62  define (patch-db
3bc0: 20 64 62 29 0a 20 20 28 68 61 6e 64 6c 65 2d 65   db).  (handle-e
3bd0: 78 63 65 70 74 69 6f 6e 73 0a 20 20 20 65 78 6e  xceptions.   exn
3be0: 0a 20 20 20 28 62 65 67 69 6e 0a 20 20 20 20 20  .   (begin.     
3bf0: 28 70 72 69 6e 74 20 22 45 78 63 65 70 74 69 6f  (print "Exceptio
3c00: 6e 3a 20 22 20 65 78 6e 29 0a 20 20 20 20 20 28  n: " exn).     (
3c10: 70 72 69 6e 74 20 22 45 52 52 4f 52 3a 20 50 6f  print "ERROR: Po
3c20: 73 73 69 62 6c 65 20 6f 75 74 20 6f 66 20 64 61  ssible out of da
3c30: 74 65 20 73 63 68 65 6d 61 2c 20 61 74 74 65 6d  te schema, attem
3c40: 70 74 69 6e 67 20 74 6f 20 61 64 64 20 74 61 62  pting to add tab
3c50: 6c 65 20 6d 65 74 61 64 61 74 61 2e 2e 2e 22 29  le metadata...")
3c60: 0a 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65  .     (sqlite3:e
3c70: 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 54  xecute db "CREAT
3c80: 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
3c90: 58 49 53 54 53 20 6d 65 74 61 64 61 74 20 28 69  XISTS metadat (i
3ca0: 64 20 49 4e 54 45 47 45 52 2c 20 76 61 72 20 54  d INTEGER, var T
3cb0: 45 58 54 2c 20 76 61 6c 20 54 45 58 54 2c 0a 20  EXT, val TEXT,. 
3cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ce0: 43 4f 4e 53 54 52 41 49 4e 54 20 6d 65 74 61 64  CONSTRAINT metad
3cf0: 61 74 5f 63 6f 6e 73 74 72 61 69 6e 74 20 55 4e  at_constraint UN
3d00: 49 51 55 45 20 28 76 61 72 29 29 3b 22 29 0a 20  IQUE (var));"). 
3d10: 20 20 20 20 28 69 66 20 28 6e 6f 74 20 28 64 62      (if (not (db
3d20: 3a 67 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47  :get-var db "MEG
3d30: 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 29 29  ATEST_VERSION"))
3d40: 0a 09 20 28 64 62 3a 73 65 74 2d 76 61 72 20 64  .. (db:set-var d
3d50: 62 20 22 4d 45 47 41 54 45 53 54 5f 56 45 52 53  b "MEGATEST_VERS
3d60: 49 4f 4e 22 20 31 2e 31 37 29 29 29 0a 20 20 20  ION" 1.17))).   
3d70: 28 6c 65 74 20 28 28 6d 76 65 72 20 28 64 62 3a  (let ((mver (db:
3d80: 67 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47 41  get-var db "MEGA
3d90: 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 29 29 0a  TEST_VERSION")).
3da0: 09 20 28 74 65 73 74 2d 6d 65 74 61 2d 64 65 66  . (test-meta-def
3db0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49   "CREATE TABLE I
3dc0: 46 20 4e 4f 54 20 45 58 49 53 54 53 20 74 65 73  F NOT EXISTS tes
3dd0: 74 5f 6d 65 74 61 20 28 69 64 20 49 4e 54 45 47  t_meta (id INTEG
3de0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 0a  ER PRIMARY KEY,.
3df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e10: 20 20 20 20 20 74 65 73 74 6e 61 6d 65 20 20 20       testname   
3e20: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 27   TEXT DEFAULT ''
3e30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e50: 20 20 20 20 20 20 20 61 75 74 68 6f 72 20 20 20         author   
3e60: 20 20 20 54 45 58 54 20 44 45 46 41 55 4c 54 20     TEXT DEFAULT 
3e70: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '',.            
3e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e90: 20 20 20 20 20 20 20 20 20 6f 77 6e 65 72 20 20           owner  
3ea0: 20 20 20 20 20 54 45 58 54 20 44 45 46 41 55 4c       TEXT DEFAUL
3eb0: 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20  T '',.          
3ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ed0: 20 20 20 20 20 20 20 20 20 20 20 64 65 73 63 72             descr
3ee0: 69 70 74 69 6f 6e 20 54 45 58 54 20 44 45 46 41  iption TEXT DEFA
3ef0: 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20  ULT '',.        
3f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 76               rev
3f20: 69 65 77 65 64 20 20 20 20 54 49 4d 45 53 54 41  iewed    TIMESTA
3f30: 4d 50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  MP,.            
3f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f50: 20 20 20 20 20 20 20 20 20 69 74 65 72 61 74 65           iterate
3f60: 64 20 20 20 20 54 45 58 54 20 44 45 46 41 55 4c  d    TEXT DEFAUL
3f70: 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20  T '',.          
3f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f90: 20 20 20 20 20 20 20 20 20 20 20 61 76 67 5f 72             avg_r
3fa0: 75 6e 74 69 6d 65 20 52 45 41 4c 2c 0a 20 20 20  untime REAL,.   
3fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3fd0: 20 20 61 76 67 5f 64 69 73 6b 20 20 20 20 52 45    avg_disk    RE
3fe0: 41 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  AL,.            
3ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4000: 20 20 20 20 20 20 20 20 20 74 61 67 73 20 20 20           tags   
4010: 20 20 20 20 20 54 45 58 54 20 44 45 46 41 55 4c       TEXT DEFAUL
4020: 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20  T '',.          
4030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4040: 20 20 20 20 20 20 43 4f 4e 53 54 52 41 49 4e 54        CONSTRAINT
4050: 20 74 65 73 74 5f 6d 65 74 61 5f 63 6f 6e 73 74   test_meta_const
4060: 72 61 69 6e 74 20 55 4e 49 51 55 45 20 28 74 65  raint UNIQUE (te
4070: 73 74 6e 61 6d 65 29 29 3b 22 29 29 0a 20 20 20  stname));")).   
4080: 20 20 28 70 72 69 6e 74 20 22 43 75 72 72 65 6e    (print "Curren
4090: 74 20 73 63 68 65 6d 61 20 76 65 72 73 69 6f 6e  t schema version
40a0: 3a 20 22 20 6d 76 65 72 20 22 20 63 75 72 72 65  : " mver " curre
40b0: 6e 74 20 6d 65 67 61 74 65 73 74 20 76 65 72 73  nt megatest vers
40c0: 69 6f 6e 3a 20 22 20 6d 65 67 61 74 65 73 74 2d  ion: " megatest-
40d0: 76 65 72 73 69 6f 6e 29 0a 20 20 20 20 20 28 63  version).     (c
40e0: 6f 6e 64 0a 20 20 20 20 20 20 28 28 6e 6f 74 20  ond.      ((not 
40f0: 6d 76 65 72 29 0a 20 20 20 20 20 20 20 28 70 72  mver).       (pr
4100: 69 6e 74 20 22 41 64 64 69 6e 67 20 6d 65 67 61  int "Adding mega
4110: 74 65 73 74 2d 76 65 72 73 69 6f 6e 20 74 6f 20  test-version to 
4120: 6d 65 74 61 64 61 74 61 22 29 20 3b 3b 20 4e 65  metadata") ;; Ne
4130: 65 64 20 74 6f 20 72 65 63 72 65 61 74 65 20 74  ed to recreate t
4140: 68 65 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20  he table.       
4150: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
4160: 20 64 62 20 22 44 52 4f 50 20 54 41 42 4c 45 20   db "DROP TABLE 
4170: 49 46 20 45 58 49 53 54 53 20 6d 65 74 61 64 61  IF EXISTS metada
4180: 74 3b 22 29 0a 20 20 20 20 20 20 20 28 73 71 6c  t;").       (sql
4190: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
41a0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46  "CREATE TABLE IF
41b0: 20 4e 4f 54 20 45 58 49 53 54 53 20 6d 65 74 61   NOT EXISTS meta
41c0: 64 61 74 20 28 69 64 20 49 4e 54 45 47 45 52 2c  dat (id INTEGER,
41d0: 20 76 61 72 20 54 45 58 54 2c 20 76 61 6c 20 54   var TEXT, val T
41e0: 45 58 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  EXT,.           
41f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4200: 20 20 20 20 20 20 20 43 4f 4e 53 54 52 41 49 4e         CONSTRAIN
4210: 54 20 6d 65 74 61 64 61 74 5f 63 6f 6e 73 74 72  T metadat_constr
4220: 61 69 6e 74 20 55 4e 49 51 55 45 20 28 76 61 72  aint UNIQUE (var
4230: 29 29 3b 22 29 0a 20 20 20 20 20 20 20 28 64 62  ));").       (db
4240: 3a 73 65 74 2d 76 61 72 20 64 62 20 22 4d 45 47  :set-var db "MEG
4250: 41 54 45 53 54 5f 56 45 52 53 49 4f 4e 22 20 31  ATEST_VERSION" 1
4260: 2e 31 37 29 0a 20 20 20 20 20 20 20 28 70 61 74  .17).       (pat
4270: 63 68 2d 64 62 29 29 0a 20 20 20 20 20 20 28 28  ch-db)).      ((
4280: 3c 20 6d 76 65 72 20 31 2e 32 31 29 0a 20 20 20  < mver 1.21).   
4290: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65      (sqlite3:exe
42a0: 63 75 74 65 20 64 62 20 22 44 52 4f 50 20 54 41  cute db "DROP TA
42b0: 42 4c 45 20 49 46 20 45 58 49 53 54 53 20 6d 65  BLE IF EXISTS me
42c0: 74 61 64 61 74 3b 22 29 0a 20 20 20 20 20 20 20  tadat;").       
42d0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
42e0: 20 64 62 20 22 43 52 45 41 54 45 20 54 41 42 4c   db "CREATE TABL
42f0: 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20  E IF NOT EXISTS 
4300: 6d 65 74 61 64 61 74 20 28 69 64 20 49 4e 54 45  metadat (id INTE
4310: 47 45 52 2c 20 76 61 72 20 54 45 58 54 2c 20 76  GER, var TEXT, v
4320: 61 6c 20 54 45 58 54 2c 0a 20 20 20 20 20 20 20  al TEXT,.       
4330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4340: 20 20 20 20 20 20 20 20 20 20 20 43 4f 4e 53 54             CONST
4350: 52 41 49 4e 54 20 6d 65 74 61 64 61 74 5f 63 6f  RAINT metadat_co
4360: 6e 73 74 72 61 69 6e 74 20 55 4e 49 51 55 45 20  nstraint UNIQUE 
4370: 28 76 61 72 29 29 3b 22 29 0a 20 20 20 20 20 20  (var));").      
4380: 20 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20   (db:set-var db 
4390: 22 4d 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f  "MEGATEST_VERSIO
43a0: 4e 22 20 31 2e 32 31 29 20 3b 3b 20 73 65 74 20  N" 1.21) ;; set 
43b0: 62 65 66 6f 72 65 2c 20 6a 75 73 74 20 69 6e 20  before, just in 
43c0: 63 61 73 65 20 74 68 65 20 63 68 61 6e 67 65 73  case the changes
43d0: 20 61 72 65 20 61 6c 72 65 61 64 79 20 61 70 70   are already app
43e0: 6c 69 65 64 0a 20 20 20 20 20 20 20 28 73 71 6c  lied.       (sql
43f0: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
4400: 74 65 73 74 2d 6d 65 74 61 2d 64 65 66 29 0a 09  test-meta-def)..
4410: 09 09 09 09 3b 28 66 6f 72 2d 65 61 63 68 20 0a  ....;(for-each .
4420: 09 09 09 09 09 3b 20 28 6c 61 6d 62 64 61 20 28  .....; (lambda (
4430: 73 74 6d 74 29 0a 09 09 09 09 09 3b 20 20 20 28  stmt)......;   (
4440: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
4450: 64 62 20 73 74 6d 74 29 29 0a 09 09 09 09 09 3b  db stmt))......;
4460: 20 28 6c 69 73 74 20 0a 09 09 09 09 09 3b 20 20   (list ......;  
4470: 22 41 4c 54 45 52 20 54 41 42 4c 45 20 74 65 73  "ALTER TABLE tes
4480: 74 73 20 41 44 44 20 43 4f 4c 55 4d 4e 20 66 69  ts ADD COLUMN fi
4490: 72 73 74 5f 65 72 72 20 54 45 58 54 3b 22 0a 09  rst_err TEXT;"..
44a0: 09 09 09 09 3b 20 20 22 41 4c 54 45 52 20 54 41  ....;  "ALTER TA
44b0: 42 4c 45 20 74 65 73 74 73 20 41 44 44 20 43 4f  BLE tests ADD CO
44c0: 4c 55 4d 4e 20 66 69 72 73 74 5f 77 61 72 6e 20  LUMN first_warn 
44d0: 54 45 58 54 3b 22 0a 09 09 09 09 09 3b 20 20 29  TEXT;"......;  )
44e0: 29 0a 20 20 20 20 20 20 20 28 70 61 74 63 68 2d  ).       (patch-
44f0: 64 62 29 29 0a 20 20 20 20 20 20 28 28 3c 20 6d  db)).      ((< m
4500: 76 65 72 20 31 2e 32 34 29 0a 20 20 20 20 20 20  ver 1.24).      
4510: 20 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20   (db:set-var db 
4520: 22 4d 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f  "MEGATEST_VERSIO
4530: 4e 22 20 31 2e 32 34 29 0a 20 20 20 20 20 20 20  N" 1.24).       
4540: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
4550: 20 64 62 20 22 44 52 4f 50 20 54 41 42 4c 45 20   db "DROP TABLE 
4560: 49 46 20 45 58 49 53 54 53 20 74 65 73 74 5f 64  IF EXISTS test_d
4570: 61 74 61 3b 22 29 0a 20 20 20 20 20 20 20 28 73  ata;").       (s
4580: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64  qlite3:execute d
4590: 62 20 22 44 52 4f 50 20 54 41 42 4c 45 20 49 46  b "DROP TABLE IF
45a0: 20 45 58 49 53 54 53 20 74 65 73 74 5f 6d 65 74   EXISTS test_met
45b0: 61 3b 22 29 0a 20 20 20 20 20 20 20 28 73 71 6c  a;").       (sql
45c0: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
45d0: 74 65 73 74 2d 6d 65 74 61 2d 64 65 66 29 0a 20  test-meta-def). 
45e0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65        (sqlite3:e
45f0: 78 65 63 75 74 65 20 64 62 20 22 43 52 45 41 54  xecute db "CREAT
4600: 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
4610: 58 49 53 54 53 20 74 65 73 74 5f 64 61 74 61 20  XISTS test_data 
4620: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d  (id INTEGER PRIM
4630: 41 52 59 20 4b 45 59 2c 0a 20 20 20 20 20 20 20  ARY KEY,.       
4640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4650: 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 69 64           test_id
4660: 20 49 4e 54 45 47 45 52 2c 0a 20 20 20 20 20 20   INTEGER,.      
4670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4680: 20 20 20 20 20 20 20 20 20 20 63 61 74 65 67 6f            catego
4690: 72 79 20 54 45 58 54 20 44 45 46 41 55 4c 54 20  ry TEXT DEFAULT 
46a0: 27 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  '',.            
46b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
46c0: 20 20 20 20 76 61 72 69 61 62 6c 65 20 54 45 58      variable TEX
46d0: 54 2c 0a 09 20 20 20 20 20 20 20 20 20 20 20 20  T,..            
46e0: 20 20 20 20 20 20 20 20 20 20 20 20 76 61 6c 75              valu
46f0: 65 20 52 45 41 4c 2c 0a 09 20 20 20 20 20 20 20  e REAL,..       
4700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4710: 20 65 78 70 65 63 74 65 64 20 52 45 41 4c 2c 0a   expected REAL,.
4720: 09 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4730: 20 20 20 20 20 20 20 20 20 74 6f 6c 20 52 45 41           tol REA
4740: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
4750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4760: 20 20 20 75 6e 69 74 73 20 54 45 58 54 2c 0a 20     units TEXT,. 
4770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
4790: 6f 6d 6d 65 6e 74 20 54 45 58 54 20 44 45 46 41  omment TEXT DEFA
47a0: 55 4c 54 20 27 27 2c 0a 20 20 20 20 20 20 20 20  ULT '',.        
47b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
47c0: 20 20 20 20 20 20 20 20 73 74 61 74 75 73 20 54          status T
47d0: 45 58 54 20 44 45 46 41 55 4c 54 20 27 6e 2f 61  EXT DEFAULT 'n/a
47e0: 27 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ',.             
47f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4800: 20 43 4f 4e 53 54 52 41 49 4e 54 20 74 65 73 74   CONSTRAINT test
4810: 5f 64 61 74 61 20 55 4e 49 51 55 45 20 28 74 65  _data UNIQUE (te
4820: 73 74 5f 69 64 2c 63 61 74 65 67 6f 72 79 2c 76  st_id,category,v
4830: 61 72 69 61 62 6c 65 29 29 3b 22 29 0a 20 20 20  ariable));").   
4840: 20 20 20 20 28 70 72 69 6e 74 20 22 57 41 52 4e      (print "WARN
4850: 49 4e 47 3a 20 54 61 62 6c 65 20 74 65 73 74 5f  ING: Table test_
4860: 64 61 74 61 20 61 6e 64 20 74 65 73 74 5f 6d 65  data and test_me
4870: 74 61 20 77 65 72 65 20 72 65 63 72 65 61 74 65  ta were recreate
4880: 64 2e 20 50 6c 65 61 73 65 20 64 6f 20 6d 65 67  d. Please do meg
4890: 61 74 65 73 74 20 2d 75 70 64 61 74 65 2d 6d 65  atest -update-me
48a0: 74 61 22 29 0a 20 20 20 20 20 20 20 28 70 61 74  ta").       (pat
48b0: 63 68 2d 64 62 29 29 0a 20 20 20 20 20 20 28 28  ch-db)).      ((
48c0: 3c 20 6d 76 65 72 20 31 2e 32 37 29 0a 20 20 20  < mver 1.27).   
48d0: 20 20 20 20 28 64 62 3a 73 65 74 2d 76 61 72 20      (db:set-var 
48e0: 64 62 20 22 4d 45 47 41 54 45 53 54 5f 56 45 52  db "MEGATEST_VER
48f0: 53 49 4f 4e 22 20 31 2e 32 37 29 0a 20 20 20 20  SION" 1.27).    
4900: 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63     (sqlite3:exec
4910: 75 74 65 20 64 62 20 22 41 4c 54 45 52 20 54 41  ute db "ALTER TA
4920: 42 4c 45 20 74 65 73 74 5f 64 61 74 61 20 41 44  BLE test_data AD
4930: 44 20 43 4f 4c 55 4d 4e 20 74 79 70 65 20 54 45  D COLUMN type TE
4940: 58 54 20 44 45 46 41 55 4c 54 20 27 27 3b 22 29  XT DEFAULT '';")
4950: 0a 20 20 20 20 20 20 20 28 70 61 74 63 68 2d 64  .       (patch-d
4960: 62 29 29 0a 20 20 20 20 20 20 28 28 3c 20 6d 76  b)).      ((< mv
4970: 65 72 20 31 2e 32 39 29 0a 20 20 20 20 20 20 20  er 1.29).       
4980: 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20 22  (db:set-var db "
4990: 4d 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f 4e  MEGATEST_VERSION
49a0: 22 20 31 2e 32 39 29 0a 20 20 20 20 20 20 20 28  " 1.29).       (
49b0: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
49c0: 64 62 20 22 41 4c 54 45 52 20 54 41 42 4c 45 20  db "ALTER TABLE 
49d0: 74 65 73 74 5f 73 74 65 70 73 20 41 44 44 20 43  test_steps ADD C
49e0: 4f 4c 55 4d 4e 20 6c 6f 67 66 69 6c 65 20 54 45  OLUMN logfile TE
49f0: 58 54 20 44 45 46 41 55 4c 54 20 27 27 3b 22 29  XT DEFAULT '';")
4a00: 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  .       (sqlite3
4a10: 3a 65 78 65 63 75 74 65 20 64 62 20 22 41 4c 54  :execute db "ALT
4a20: 45 52 20 54 41 42 4c 45 20 74 65 73 74 73 20 41  ER TABLE tests A
4a30: 44 44 20 43 4f 4c 55 4d 4e 20 73 68 6f 72 74 64  DD COLUMN shortd
4a40: 69 72 20 54 45 58 54 20 44 45 46 41 55 4c 54 20  ir TEXT DEFAULT 
4a50: 27 27 3b 22 29 29 0a 20 20 20 20 20 20 28 28 3c  '';")).      ((<
4a60: 20 6d 76 65 72 20 31 2e 33 36 29 0a 20 20 20 20   mver 1.36).    
4a70: 20 20 20 28 64 62 3a 73 65 74 2d 76 61 72 20 64     (db:set-var d
4a80: 62 20 22 4d 45 47 41 54 45 53 54 5f 56 45 52 53  b "MEGATEST_VERS
4a90: 49 4f 4e 22 20 31 2e 33 36 29 0a 20 20 20 20 20  ION" 1.36).     
4aa0: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
4ab0: 74 65 20 64 62 20 22 41 4c 54 45 52 20 54 41 42  te db "ALTER TAB
4ac0: 4c 45 20 74 65 73 74 5f 6d 65 74 61 20 41 44 44  LE test_meta ADD
4ad0: 20 43 4f 4c 55 4d 4e 20 6a 6f 62 67 72 6f 75 70   COLUMN jobgroup
4ae0: 20 54 45 58 54 20 44 45 46 41 55 4c 54 20 27 64   TEXT DEFAULT 'd
4af0: 65 66 61 75 6c 74 27 3b 22 29 29 0a 20 20 20 20  efault';")).    
4b00: 20 20 28 28 3c 20 6d 76 65 72 20 31 2e 33 37 29    ((< mver 1.37)
4b10: 0a 20 20 20 20 20 20 20 28 64 62 3a 73 65 74 2d  .       (db:set-
4b20: 76 61 72 20 64 62 20 22 4d 45 47 41 54 45 53 54  var db "MEGATEST
4b30: 5f 56 45 52 53 49 4f 4e 22 20 31 2e 33 37 29 0a  _VERSION" 1.37).
4b40: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a         (sqlite3:
4b50: 65 78 65 63 75 74 65 20 64 62 20 22 41 4c 54 45  execute db "ALTE
4b60: 52 20 54 41 42 4c 45 20 74 65 73 74 73 20 41 44  R TABLE tests AD
4b70: 44 20 43 4f 4c 55 4d 4e 20 61 72 63 68 69 76 65  D COLUMN archive
4b80: 64 20 49 4e 54 45 47 45 52 20 44 45 46 41 55 4c  d INTEGER DEFAUL
4b90: 54 20 30 3b 22 29 29 20 0a 20 20 20 20 20 20 28  T 0;")) .      (
4ba0: 28 3c 20 6d 76 65 72 20 6d 65 67 61 74 65 73 74  (< mver megatest
4bb0: 2d 76 65 72 73 69 6f 6e 29 0a 20 20 20 20 20 20  -version).      
4bc0: 20 28 64 62 3a 73 65 74 2d 76 61 72 20 64 62 20   (db:set-var db 
4bd0: 22 4d 45 47 41 54 45 53 54 5f 56 45 52 53 49 4f  "MEGATEST_VERSIO
4be0: 4e 22 20 6d 65 67 61 74 65 73 74 2d 76 65 72 73  N" megatest-vers
4bf0: 69 6f 6e 29 29 29 29 29 29 0a 0a 3b 3b 3d 3d 3d  ion))))))..;;===
4c00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4c10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4c20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4c30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4c40: 3d 3d 3d 0a 3b 3b 20 6d 65 74 61 20 67 65 74 20  ===.;; meta get 
4c50: 61 6e 64 20 73 65 74 20 76 61 72 73 0a 3b 3b 3d  and set vars.;;=
4c60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4c70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4c80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4c90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
4ca0: 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 72 65 74 75 72 6e  =====..;; return
4cb0: 73 20 6e 75 6d 62 65 72 20 69 66 20 73 74 72 69  s number if stri
4cc0: 6e 67 2d 3e 6e 75 6d 62 65 72 20 69 73 20 73 75  ng->number is su
4cd0: 63 63 65 73 73 66 75 6c 2c 20 73 74 72 69 6e 67  ccessful, string
4ce0: 20 6f 74 68 65 72 77 69 73 65 0a 3b 3b 20 61 6c   otherwise.;; al
4cf0: 73 6f 20 75 70 64 61 74 65 73 20 2a 67 6c 6f 62  so updates *glob
4d00: 61 6c 2d 64 65 6c 74 61 2a 0a 28 64 65 66 69 6e  al-delta*.(defin
4d10: 65 20 28 64 62 3a 67 65 74 2d 76 61 72 20 64 62  e (db:get-var db
4d20: 20 76 61 72 29 0a 20 20 28 64 65 62 75 67 3a 70   var).  (debug:p
4d30: 72 69 6e 74 2d 69 6e 66 6f 20 31 31 20 22 64 62  rint-info 11 "db
4d40: 3a 67 65 74 2d 76 61 72 20 53 54 41 52 54 20 22  :get-var START "
4d50: 20 76 61 72 29 0a 20 20 28 6c 65 74 2a 20 28 28   var).  (let* ((
4d60: 73 74 61 72 74 2d 6d 73 20 28 63 75 72 72 65 6e  start-ms (curren
4d70: 74 2d 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 29 29  t-milliseconds))
4d80: 0a 20 20 20 20 20 20 20 20 20 28 74 68 72 6f 74  .         (throt
4d90: 74 6c 65 20 28 6c 65 74 20 28 28 74 20 20 28 63  tle (let ((t  (c
4da0: 6f 6e 66 69 67 2d 6c 6f 6f 6b 75 70 20 2a 63 6f  onfig-lookup *co
4db0: 6e 66 69 67 64 61 74 2a 20 22 73 65 74 75 70 22  nfigdat* "setup"
4dc0: 20 22 74 68 72 6f 74 74 6c 65 22 29 29 29 0a 09   "throttle")))..
4dd0: 09 20 20 20 20 20 28 69 66 20 74 20 28 73 74 72  .     (if t (str
4de0: 69 6e 67 2d 3e 6e 75 6d 62 65 72 20 74 29 20 74  ing->number t) t
4df0: 29 29 29 0a 09 20 28 72 65 73 20 20 20 20 20 20  ))).. (res      
4e00: 23 66 29 29 0a 20 20 20 20 28 73 71 6c 69 74 65  #f)).    (sqlite
4e10: 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20  3:for-each-row. 
4e20: 20 20 20 20 28 6c 61 6d 62 64 61 20 28 76 61 6c      (lambda (val
4e30: 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72  ).       (set! r
4e40: 65 73 20 76 61 6c 29 29 0a 20 20 20 20 20 64 62  es val)).     db
4e50: 20 22 53 45 4c 45 43 54 20 76 61 6c 20 46 52 4f   "SELECT val FRO
4e60: 4d 20 6d 65 74 61 64 61 74 20 57 48 45 52 45 20  M metadat WHERE 
4e70: 76 61 72 3d 3f 3b 22 20 76 61 72 29 0a 20 20 20  var=?;" var).   
4e80: 20 3b 3b 20 63 6f 6e 76 65 72 74 20 74 6f 20 6e   ;; convert to n
4e90: 75 6d 62 65 72 20 69 66 20 63 61 6e 0a 20 20 20  umber if can.   
4ea0: 20 28 69 66 20 28 73 74 72 69 6e 67 3f 20 72 65   (if (string? re
4eb0: 73 29 0a 09 28 6c 65 74 20 28 28 76 61 6c 6e 75  s)..(let ((valnu
4ec0: 6d 20 28 73 74 72 69 6e 67 2d 3e 6e 75 6d 62 65  m (string->numbe
4ed0: 72 20 72 65 73 29 29 29 0a 09 20 20 28 69 66 20  r res)))..  (if 
4ee0: 76 61 6c 6e 75 6d 20 28 73 65 74 21 20 72 65 73  valnum (set! res
4ef0: 20 76 61 6c 6e 75 6d 29 29 29 29 0a 20 20 20 20   valnum)))).    
4f00: 3b 3b 20 73 63 61 6c 65 20 62 79 20 31 30 2c 20  ;; scale by 10, 
4f10: 61 76 65 72 61 67 65 20 77 69 74 68 20 63 75 72  average with cur
4f20: 72 65 6e 74 20 76 61 6c 75 65 2e 0a 20 20 20 20  rent value..    
4f30: 28 73 65 74 21 20 2a 67 6c 6f 62 61 6c 2d 64 65  (set! *global-de
4f40: 6c 74 61 2a 20 28 2f 20 28 2b 20 2a 67 6c 6f 62  lta* (/ (+ *glob
4f50: 61 6c 2d 64 65 6c 74 61 2a 20 28 2a 20 28 2d 20  al-delta* (* (- 
4f60: 28 63 75 72 72 65 6e 74 2d 6d 69 6c 6c 69 73 65  (current-millise
4f70: 63 6f 6e 64 73 29 20 73 74 61 72 74 2d 6d 73 29  conds) start-ms)
4f80: 0a 09 09 09 09 09 09 20 28 69 66 20 74 68 72 6f  ....... (if thro
4f90: 74 74 6c 65 20 74 68 72 6f 74 74 6c 65 20 30 2e  ttle throttle 0.
4fa0: 30 31 29 29 29 0a 09 09 09 20 20 20 20 32 29 29  01)))....    2))
4fb0: 0a 20 20 20 20 28 69 66 20 28 3e 20 28 61 62 73  .    (if (> (abs
4fc0: 20 28 2d 20 2a 6c 61 73 74 2d 67 6c 6f 62 61 6c   (- *last-global
4fd0: 2d 64 65 6c 74 61 2d 70 72 69 6e 74 65 64 2a 20  -delta-printed* 
4fe0: 2a 67 6c 6f 62 61 6c 2d 64 65 6c 74 61 2a 29 29  *global-delta*))
4ff0: 20 30 2e 30 38 29 20 3b 3b 20 64 6f 6e 27 74 20   0.08) ;; don't 
5000: 70 72 69 6e 74 20 61 6c 6c 20 74 68 65 20 74 69  print all the ti
5010: 6d 65 2c 20 6f 6e 6c 79 20 69 66 20 69 74 20 63  me, only if it c
5020: 68 61 6e 67 65 73 20 61 20 62 69 74 0a 09 28 62  hanges a bit..(b
5030: 65 67 69 6e 0a 09 20 20 28 64 65 62 75 67 3a 70  egin..  (debug:p
5040: 72 69 6e 74 2d 69 6e 66 6f 20 34 20 22 6c 61 75  rint-info 4 "lau
5050: 6e 63 68 20 74 68 72 6f 74 74 6c 65 20 66 61 63  nch throttle fac
5060: 74 6f 72 3d 22 20 2a 67 6c 6f 62 61 6c 2d 64 65  tor=" *global-de
5070: 6c 74 61 2a 29 0a 09 20 20 28 73 65 74 21 20 2a  lta*)..  (set! *
5080: 6c 61 73 74 2d 67 6c 6f 62 61 6c 2d 64 65 6c 74  last-global-delt
5090: 61 2d 70 72 69 6e 74 65 64 2a 20 2a 67 6c 6f 62  a-printed* *glob
50a0: 61 6c 2d 64 65 6c 74 61 2a 29 29 29 0a 20 20 20  al-delta*))).   
50b0: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 2d 69 6e   (debug:print-in
50c0: 66 6f 20 31 31 20 22 64 62 3a 67 65 74 2d 76 61  fo 11 "db:get-va
50d0: 72 20 45 4e 44 20 22 20 76 61 72 20 22 20 76 61  r END " var " va
50e0: 6c 3d 22 20 72 65 73 29 0a 20 20 20 20 72 65 73  l=" res).    res
50f0: 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  ))..(define (db:
5100: 73 65 74 2d 76 61 72 20 64 62 20 76 61 72 20 76  set-var db var v
5110: 61 6c 29 0a 20 20 28 64 65 62 75 67 3a 70 72 69  al).  (debug:pri
5120: 6e 74 2d 69 6e 66 6f 20 31 31 20 22 64 62 3a 73  nt-info 11 "db:s
5130: 65 74 2d 76 61 72 20 53 54 41 52 54 20 22 20 76  et-var START " v
5140: 61 72 20 22 20 22 20 76 61 6c 29 0a 20 20 28 73  ar " " val).  (s
5150: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64  qlite3:execute d
5160: 62 20 22 49 4e 53 45 52 54 20 4f 52 20 52 45 50  b "INSERT OR REP
5170: 4c 41 43 45 20 49 4e 54 4f 20 6d 65 74 61 64 61  LACE INTO metada
5180: 74 20 28 76 61 72 2c 76 61 6c 29 20 56 41 4c 55  t (var,val) VALU
5190: 45 53 20 28 3f 2c 3f 29 3b 22 20 76 61 72 20 76  ES (?,?);" var v
51a0: 61 6c 29 0a 20 20 28 64 65 62 75 67 3a 70 72 69  al).  (debug:pri
51b0: 6e 74 2d 69 6e 66 6f 20 31 31 20 22 64 62 3a 73  nt-info 11 "db:s
51c0: 65 74 2d 76 61 72 20 45 4e 44 20 22 20 76 61 72  et-var END " var
51d0: 20 22 20 22 20 76 61 6c 29 29 0a 0a 28 64 65 66   " " val))..(def
51e0: 69 6e 65 20 28 64 62 3a 64 65 6c 2d 76 61 72 20  ine (db:del-var 
51f0: 64 62 20 76 61 72 29 0a 20 20 28 64 65 62 75 67  db var).  (debug
5200: 3a 70 72 69 6e 74 2d 69 6e 66 6f 20 31 31 20 22  :print-info 11 "
5210: 64 62 3a 64 65 6c 2d 76 61 72 20 53 54 41 52 54  db:del-var START
5220: 20 22 20 76 61 72 29 0a 20 20 28 73 71 6c 69 74   " var).  (sqlit
5230: 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 44  e3:execute db "D
5240: 45 4c 45 54 45 20 46 52 4f 4d 20 6d 65 74 61 64  ELETE FROM metad
5250: 61 74 20 57 48 45 52 45 20 76 61 72 3d 3f 3b 22  at WHERE var=?;"
5260: 20 76 61 72 29 0a 20 20 28 64 65 62 75 67 3a 70   var).  (debug:p
5270: 72 69 6e 74 2d 69 6e 66 6f 20 31 31 20 22 64 62  rint-info 11 "db
5280: 3a 64 65 6c 2d 76 61 72 20 45 4e 44 20 22 20 76  :del-var END " v
5290: 61 72 29 29 0a 0a 3b 3b 20 75 73 65 20 61 20 67  ar))..;; use a g
52a0: 6c 6f 62 61 6c 20 66 6f 72 20 73 6f 6d 65 20 70  lobal for some p
52b0: 72 69 6d 69 74 69 76 65 20 63 61 63 68 69 6e 67  rimitive caching
52c0: 2c 20 69 74 20 69 73 20 6a 75 73 74 20 73 69 6c  , it is just sil
52d0: 6c 79 20 74 6f 20 72 65 2d 72 65 61 64 20 74 68  ly to re-read th
52e0: 65 20 64 62 20 0a 3b 3b 20 6f 76 65 72 20 61 6e  e db .;; over an
52f0: 64 20 6f 76 65 72 20 61 67 61 69 6e 20 66 6f 72  d over again for
5300: 20 74 68 65 20 6b 65 79 73 20 73 69 6e 63 65 20   the keys since 
5310: 74 68 65 79 20 6e 65 76 65 72 20 63 68 61 6e 67  they never chang
5320: 65 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67  e..(define (db:g
5330: 65 74 2d 6b 65 79 73 20 64 62 29 0a 20 20 28 69  et-keys db).  (i
5340: 66 20 2a 64 62 2d 6b 65 79 73 2a 20 2a 64 62 2d  f *db-keys* *db-
5350: 6b 65 79 73 2a 20 0a 20 20 20 20 20 20 28 6c 65  keys* .      (le
5360: 74 20 28 28 72 65 73 20 27 28 29 29 29 0a 09 28  t ((res '()))..(
5370: 64 65 62 75 67 3a 70 72 69 6e 74 2d 69 6e 66 6f  debug:print-info
5380: 20 31 31 20 22 64 62 3a 67 65 74 2d 6b 65 79 73   11 "db:get-keys
5390: 20 53 54 41 52 54 20 28 63 61 63 68 65 20 6d 69   START (cache mi
53a0: 73 73 29 22 29 0a 09 28 73 71 6c 69 74 65 33 3a  ss)")..(sqlite3:
53b0: 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a 09 20  for-each-row .. 
53c0: 28 6c 61 6d 62 64 61 20 28 6b 65 79 20 6b 65 79  (lambda (key key
53d0: 74 79 70 65 29 0a 09 20 20 20 28 73 65 74 21 20  type)..   (set! 
53e0: 72 65 73 20 28 63 6f 6e 73 20 28 76 65 63 74 6f  res (cons (vecto
53f0: 72 20 6b 65 79 20 6b 65 79 74 79 70 65 29 20 72  r key keytype) r
5400: 65 73 29 29 29 0a 09 20 64 62 0a 09 20 22 53 45  es))).. db.. "SE
5410: 4c 45 43 54 20 66 69 65 6c 64 6e 61 6d 65 2c 66  LECT fieldname,f
5420: 69 65 6c 64 74 79 70 65 20 46 52 4f 4d 20 6b 65  ieldtype FROM ke
5430: 79 73 20 4f 52 44 45 52 20 42 59 20 69 64 20 44  ys ORDER BY id D
5440: 45 53 43 3b 22 29 0a 09 28 73 65 74 21 20 2a 64  ESC;")..(set! *d
5450: 62 2d 6b 65 79 73 2a 20 72 65 73 29 0a 09 28 64  b-keys* res)..(d
5460: 65 62 75 67 3a 70 72 69 6e 74 2d 69 6e 66 6f 20  ebug:print-info 
5470: 31 31 20 22 64 62 3a 67 65 74 2d 6b 65 79 73 20  11 "db:get-keys 
5480: 45 4e 44 20 28 63 61 63 68 65 20 6d 69 73 73 29  END (cache miss)
5490: 22 29 0a 09 72 65 73 29 29 29 0a 0a 28 64 65 66  ")..res)))..(def
54a0: 69 6e 65 20 28 64 62 3a 67 65 74 2d 76 61 6c 75  ine (db:get-valu
54b0: 65 2d 62 79 2d 68 65 61 64 65 72 20 72 6f 77 20  e-by-header row 
54c0: 68 65 61 64 65 72 20 66 69 65 6c 64 29 0a 20 20  header field).  
54d0: 28 64 65 62 75 67 3a 70 72 69 6e 74 2d 69 6e 66  (debug:print-inf
54e0: 6f 20 34 20 22 64 62 3a 67 65 74 2d 76 61 6c 75  o 4 "db:get-valu
54f0: 65 2d 62 79 2d 68 65 61 64 65 72 20 72 6f 77 3a  e-by-header row:
5500: 20 22 20 72 6f 77 20 22 20 68 65 61 64 65 72 3a   " row " header:
5510: 20 22 20 68 65 61 64 65 72 20 22 20 66 69 65 6c   " header " fiel
5520: 64 3a 20 22 20 66 69 65 6c 64 29 0a 20 20 28 69  d: " field).  (i
5530: 66 20 28 6e 75 6c 6c 3f 20 68 65 61 64 65 72 29  f (null? header)
5540: 20 23 66 0a 20 20 20 20 20 20 28 6c 65 74 20 6c   #f.      (let l
5550: 6f 6f 70 20 28 28 68 65 64 20 28 63 61 72 20 68  oop ((hed (car h
5560: 65 61 64 65 72 29 29 0a 09 09 20 28 74 61 6c 20  eader))... (tal 
5570: 28 63 64 72 20 68 65 61 64 65 72 29 29 0a 09 09  (cdr header))...
5580: 20 28 6e 20 20 20 30 29 29 0a 09 28 69 66 20 28   (n   0))..(if (
5590: 65 71 75 61 6c 3f 20 68 65 64 20 66 69 65 6c 64  equal? hed field
55a0: 29 0a 09 20 20 20 20 28 76 65 63 74 6f 72 2d 72  )..    (vector-r
55b0: 65 66 20 72 6f 77 20 6e 29 0a 09 20 20 20 20 28  ef row n)..    (
55c0: 69 66 20 28 6e 75 6c 6c 3f 20 74 61 6c 29 20 23  if (null? tal) #
55d0: 66 20 28 6c 6f 6f 70 20 28 63 61 72 20 74 61 6c  f (loop (car tal
55e0: 29 28 63 64 72 20 74 61 6c 29 28 2b 20 6e 20 31  )(cdr tal)(+ n 1
55f0: 29 29 29 29 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d  )))))))..;;=====
5600: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5610: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5620: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5630: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5640: 3d 0a 3b 3b 20 20 52 20 55 20 4e 20 53 0a 3b 3b  =.;;  R U N S.;;
5650: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5660: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5670: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5680: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5690: 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65 66 69 6e 65 20  ======..(define 
56a0: 28 72 75 6e 73 3a 67 65 74 2d 73 74 64 2d 72 75  (runs:get-std-ru
56b0: 6e 2d 66 69 65 6c 64 73 20 6b 65 79 73 20 72 65  n-fields keys re
56c0: 6d 66 69 65 6c 64 73 29 0a 20 20 28 6c 65 74 2a  mfields).  (let*
56d0: 20 28 28 68 65 61 64 65 72 20 20 20 20 28 61 70   ((header    (ap
56e0: 70 65 6e 64 20 28 6d 61 70 20 6b 65 79 3a 67 65  pend (map key:ge
56f0: 74 2d 66 69 65 6c 64 6e 61 6d 65 20 6b 65 79 73  t-fieldname keys
5700: 29 0a 09 09 09 20 20 20 20 72 65 6d 66 69 65 6c  )....    remfiel
5710: 64 73 29 29 0a 09 20 28 6b 65 79 73 74 72 20 20  ds)).. (keystr  
5720: 20 20 28 63 6f 6e 63 20 28 6b 65 79 73 2d 3e 6b    (conc (keys->k
5730: 65 79 73 74 72 20 6b 65 79 73 29 20 22 2c 22 0a  eystr keys) ",".
5740: 09 09 09 20 20 28 73 74 72 69 6e 67 2d 69 6e 74  ...  (string-int
5750: 65 72 73 70 65 72 73 65 20 72 65 6d 66 69 65 6c  ersperse remfiel
5760: 64 73 20 22 2c 22 29 29 29 29 0a 20 20 20 20 28  ds ",")))).    (
5770: 6c 69 73 74 20 6b 65 79 73 74 72 20 68 65 61 64  list keystr head
5780: 65 72 29 29 29 0a 0a 3b 3b 20 6d 61 6b 65 20 61  er)))..;; make a
5790: 20 71 75 65 72 79 20 28 66 69 65 6c 64 6e 61 6d   query (fieldnam
57a0: 65 20 6c 69 6b 65 20 27 70 61 74 74 31 27 20 4f  e like 'patt1' O
57b0: 52 20 66 69 65 6c 64 6e 61 6d 65 20 0a 28 64 65  R fieldname .(de
57c0: 66 69 6e 65 20 28 64 62 3a 70 61 74 74 2d 3e 6c  fine (db:patt->l
57d0: 69 6b 65 20 66 69 65 6c 64 6e 61 6d 65 20 70 61  ike fieldname pa
57e0: 74 74 73 74 72 20 23 21 6b 65 79 20 28 63 6f 6d  ttstr #!key (com
57f0: 70 61 72 61 74 6f 72 20 22 20 4f 52 20 22 29 29  parator " OR "))
5800: 0a 20 20 28 6c 65 74 20 28 28 70 61 74 74 73 20  .  (let ((patts 
5810: 28 69 66 20 28 73 74 72 69 6e 67 3f 20 70 61 74  (if (string? pat
5820: 74 73 74 72 29 0a 09 09 20 20 20 28 73 74 72 69  tstr)...   (stri
5830: 6e 67 2d 73 70 6c 69 74 20 70 61 74 74 73 74 72  ng-split pattstr
5840: 20 22 2c 22 29 0a 09 09 20 20 20 27 28 22 25 22   ",")...   '("%"
5850: 29 29 29 29 0a 20 20 20 20 28 73 74 72 69 6e 67  )))).    (string
5860: 2d 69 6e 74 65 72 73 70 65 72 73 65 20 28 6d 61  -intersperse (ma
5870: 70 20 28 6c 61 6d 62 64 61 20 28 70 61 74 74 29  p (lambda (patt)
5880: 0a 09 09 09 20 20 20 20 20 20 20 28 6c 65 74 20  ....       (let 
5890: 28 28 77 69 6c 64 74 79 70 65 20 28 69 66 20 28  ((wildtype (if (
58a0: 73 75 62 73 74 72 69 6e 67 2d 69 6e 64 65 78 20  substring-index 
58b0: 22 25 22 20 70 61 74 74 29 20 22 4c 49 4b 45 22  "%" patt) "LIKE"
58c0: 20 22 47 4c 4f 42 22 29 29 29 0a 09 09 09 09 20   "GLOB")))..... 
58d0: 28 63 6f 6e 63 20 66 69 65 6c 64 6e 61 6d 65 20  (conc fieldname 
58e0: 22 20 22 20 77 69 6c 64 74 79 70 65 20 22 20 27  " " wildtype " '
58f0: 22 20 70 61 74 74 20 22 27 22 29 29 29 0a 09 09  " patt "'")))...
5900: 09 20 20 20 20 20 28 69 66 20 28 6e 75 6c 6c 3f  .     (if (null?
5910: 20 70 61 74 74 73 29 0a 09 09 09 09 20 27 28 22   patts)..... '("
5920: 22 29 0a 09 09 09 09 20 70 61 74 74 73 29 29 0a  ")..... patts)).
5930: 09 09 09 63 6f 6d 70 61 72 61 74 6f 72 29 29 29  ...comparator)))
5940: 0a 0a 3b 3b 20 72 65 70 6c 61 63 65 20 68 65 61  ..;; replace hea
5950: 64 65 72 20 61 6e 64 20 6b 65 79 73 74 72 20 77  der and keystr w
5960: 69 74 68 20 61 20 63 61 6c 6c 20 74 6f 20 72 75  ith a call to ru
5970: 6e 73 3a 67 65 74 2d 73 74 64 2d 72 75 6e 2d 66  ns:get-std-run-f
5980: 69 65 6c 64 73 0a 3b 3b 0a 3b 3b 20 6b 65 79 70  ields.;;.;; keyp
5990: 61 74 74 73 3a 20 28 20 28 4b 45 59 31 20 22 61  atts: ( (KEY1 "a
59a0: 62 63 25 64 65 66 22 29 28 4b 45 59 32 20 22 25  bc%def")(KEY2 "%
59b0: 22 29 20 29 0a 3b 3b 20 72 75 6e 70 61 74 74 73  ") ).;; runpatts
59c0: 3a 20 70 61 74 74 31 2c 70 61 74 74 32 20 2e 2e  : patt1,patt2 ..
59d0: 2e 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 28 64 62  ..;;.(define (db
59e0: 3a 67 65 74 2d 72 75 6e 73 20 64 62 20 72 75 6e  :get-runs db run
59f0: 70 61 74 74 20 63 6f 75 6e 74 20 6f 66 66 73 65  patt count offse
5a00: 74 20 6b 65 79 70 61 74 74 73 29 0a 20 20 28 6c  t keypatts).  (l
5a10: 65 74 2a 20 28 28 72 65 73 20 20 20 20 20 20 20  et* ((res       
5a20: 27 28 29 29 0a 09 20 28 6b 65 79 73 20 20 20 20  '()).. (keys    
5a30: 20 20 20 28 64 62 3a 67 65 74 2d 6b 65 79 73 20     (db:get-keys 
5a40: 64 62 29 29 0a 09 20 28 72 75 6e 70 61 74 74 73  db)).. (runpatts
5a50: 74 72 20 28 64 62 3a 70 61 74 74 2d 3e 6c 69 6b  tr (db:patt->lik
5a60: 65 20 22 72 75 6e 6e 61 6d 65 22 20 72 75 6e 70  e "runname" runp
5a70: 61 74 74 29 29 0a 09 20 28 72 65 6d 66 69 65 6c  att)).. (remfiel
5a80: 64 73 20 20 28 6c 69 73 74 20 22 69 64 22 20 22  ds  (list "id" "
5a90: 72 75 6e 6e 61 6d 65 22 20 22 73 74 61 74 65 22  runname" "state"
5aa0: 20 22 73 74 61 74 75 73 22 20 22 6f 77 6e 65 72   "status" "owner
5ab0: 22 20 22 65 76 65 6e 74 5f 74 69 6d 65 22 29 29  " "event_time"))
5ac0: 0a 09 20 28 68 65 61 64 65 72 20 20 20 20 20 28  .. (header     (
5ad0: 61 70 70 65 6e 64 20 28 6d 61 70 20 6b 65 79 3a  append (map key:
5ae0: 67 65 74 2d 66 69 65 6c 64 6e 61 6d 65 20 6b 65  get-fieldname ke
5af0: 79 73 29 0a 09 09 20 20 20 20 20 20 20 20 20 20  ys)...          
5b00: 20 20 20 72 65 6d 66 69 65 6c 64 73 29 29 0a 09     remfields))..
5b10: 20 28 6b 65 79 73 74 72 20 20 20 20 20 28 63 6f   (keystr     (co
5b20: 6e 63 20 28 6b 65 79 73 2d 3e 6b 65 79 73 74 72  nc (keys->keystr
5b30: 20 6b 65 79 73 29 20 22 2c 22 0a 09 09 20 20 20   keys) ","...   
5b40: 20 20 20 20 20 20 20 20 28 73 74 72 69 6e 67 2d          (string-
5b50: 69 6e 74 65 72 73 70 65 72 73 65 20 72 65 6d 66  intersperse remf
5b60: 69 65 6c 64 73 20 22 2c 22 29 29 29 0a 09 20 28  ields ","))).. (
5b70: 71 72 79 73 74 72 20 20 20 20 20 28 63 6f 6e 63  qrystr     (conc
5b80: 20 22 53 45 4c 45 43 54 20 22 20 6b 65 79 73 74   "SELECT " keyst
5b90: 72 20 22 20 46 52 4f 4d 20 72 75 6e 73 20 57 48  r " FROM runs WH
5ba0: 45 52 45 20 28 22 20 72 75 6e 70 61 74 74 73 74  ERE (" runpattst
5bb0: 72 20 22 29 20 22 20 3b 3b 20 72 75 6e 6e 61 6d  r ") " ;; runnam
5bc0: 65 20 4c 49 4b 45 20 3f 20 22 0a 09 09 20 20 20  e LIKE ? "...   
5bd0: 20 20 20 20 20 20 20 20 3b 3b 20 47 65 6e 65 72          ;; Gener
5be0: 61 74 65 3a 20 22 20 41 4e 44 20 78 20 4c 49 4b  ate: " AND x LIK
5bf0: 45 20 27 6b 65 79 70 61 74 74 27 20 2e 2e 2e 22  E 'keypatt' ..."
5c00: 0a 09 09 20 20 20 20 20 20 20 20 20 20 20 28 69  ...           (i
5c10: 66 20 28 6e 75 6c 6c 3f 20 6b 65 79 70 61 74 74  f (null? keypatt
5c20: 73 29 20 22 22 0a 09 09 20 20 20 20 20 20 20 20  s) ""...        
5c30: 20 20 20 20 20 20 20 28 63 6f 6e 63 20 22 20 41         (conc " A
5c40: 4e 44 20 22 0a 09 09 09 09 20 20 20 20 20 28 73  ND ".....     (s
5c50: 74 72 69 6e 67 2d 6a 6f 69 6e 20 0a 09 09 09 09  tring-join .....
5c60: 20 20 20 20 20 20 28 6d 61 70 20 28 6c 61 6d 62        (map (lamb
5c70: 64 61 20 28 6b 65 79 70 61 74 74 29 0a 09 09 09  da (keypatt)....
5c80: 09 09 20 20 20 20 20 28 6c 65 74 20 28 28 6b 65  ..     (let ((ke
5c90: 79 20 20 28 63 61 72 20 6b 65 79 70 61 74 74 29  y  (car keypatt)
5ca0: 29 0a 09 09 09 09 09 09 20 20 20 28 70 61 74 74  ).......   (patt
5cb0: 20 28 63 61 64 72 20 6b 65 79 70 61 74 74 29 29   (cadr keypatt))
5cc0: 29 0a 09 09 09 09 09 20 20 20 20 20 20 20 28 64  )......       (d
5cd0: 62 3a 70 61 74 74 2d 3e 6c 69 6b 65 20 6b 65 79  b:patt->like key
5ce0: 20 70 61 74 74 29 29 29 0a 09 09 09 09 09 20 20   patt)))......  
5cf0: 20 6b 65 79 70 61 74 74 73 29 0a 09 09 09 09 20   keypatts)..... 
5d00: 20 20 20 20 20 22 20 41 4e 44 20 22 29 29 29 0a       " AND "))).
5d10: 09 09 20 20 20 20 20 20 20 20 20 20 20 22 20 4f  ..           " O
5d20: 52 44 45 52 20 42 59 20 65 76 65 6e 74 5f 74 69  RDER BY event_ti
5d30: 6d 65 20 44 45 53 43 20 22 0a 09 09 20 20 20 20  me DESC "...    
5d40: 20 20 20 20 20 20 20 28 69 66 20 28 6e 75 6d 62         (if (numb
5d50: 65 72 3f 20 63 6f 75 6e 74 29 0a 09 09 20 20 20  er? count)...   
5d60: 20 20 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e              (con
5d70: 63 20 22 20 4c 49 4d 49 54 20 22 20 63 6f 75 6e  c " LIMIT " coun
5d80: 74 29 0a 09 09 20 20 20 20 20 20 20 20 20 20 20  t)...           
5d90: 20 20 20 20 22 22 29 0a 09 09 20 20 20 20 20 20      "")...      
5da0: 20 20 20 20 20 28 69 66 20 28 6e 75 6d 62 65 72       (if (number
5db0: 3f 20 6f 66 66 73 65 74 29 0a 09 09 20 20 20 20  ? offset)...    
5dc0: 20 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e 63             (conc
5dd0: 20 22 20 4f 46 46 53 45 54 20 22 20 6f 66 66 73   " OFFSET " offs
5de0: 65 74 29 0a 09 09 20 20 20 20 20 20 20 20 20 20  et)...          
5df0: 20 20 20 20 20 22 22 29 29 29 29 0a 20 20 20 20       "")))).    
5e00: 28 64 65 62 75 67 3a 70 72 69 6e 74 2d 69 6e 66  (debug:print-inf
5e10: 6f 20 31 31 20 22 64 62 3a 67 65 74 2d 72 75 6e  o 11 "db:get-run
5e20: 73 20 53 54 41 52 54 20 71 72 79 73 74 72 3a 20  s START qrystr: 
5e30: 22 20 71 72 79 73 74 72 20 22 20 6b 65 79 70 61  " qrystr " keypa
5e40: 74 74 73 3a 20 22 20 6b 65 79 70 61 74 74 73 20  tts: " keypatts 
5e50: 22 20 6f 66 66 73 65 74 3a 20 22 20 6f 66 66 73  " offset: " offs
5e60: 65 74 20 22 20 6c 69 6d 69 74 3a 20 22 20 63 6f  et " limit: " co
5e70: 75 6e 74 29 0a 20 20 20 20 28 73 71 6c 69 74 65  unt).    (sqlite
5e80: 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 20  3:for-each-row. 
5e90: 20 20 20 20 28 6c 61 6d 62 64 61 20 28 61 20 2e      (lambda (a .
5ea0: 20 78 29 0a 20 20 20 20 20 20 20 28 73 65 74 21   x).       (set!
5eb0: 20 72 65 73 20 28 63 6f 6e 73 20 28 61 70 70 6c   res (cons (appl
5ec0: 79 20 76 65 63 74 6f 72 20 61 20 78 29 20 72 65  y vector a x) re
5ed0: 73 29 29 29 0a 20 20 20 20 20 64 62 0a 20 20 20  s))).     db.   
5ee0: 20 20 71 72 79 73 74 72 0a 20 20 20 20 20 29 0a    qrystr.     ).
5ef0: 20 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74      (debug:print
5f00: 2d 69 6e 66 6f 20 31 31 20 22 64 62 3a 67 65 74  -info 11 "db:get
5f10: 2d 72 75 6e 73 20 45 4e 44 20 71 72 79 73 74 72  -runs END qrystr
5f20: 3a 20 22 20 71 72 79 73 74 72 20 22 20 6b 65 79  : " qrystr " key
5f30: 70 61 74 74 73 3a 20 22 20 6b 65 79 70 61 74 74  patts: " keypatt
5f40: 73 20 22 20 6f 66 66 73 65 74 3a 20 22 20 6f 66  s " offset: " of
5f50: 66 73 65 74 20 22 20 6c 69 6d 69 74 3a 20 22 20  fset " limit: " 
5f60: 63 6f 75 6e 74 29 0a 20 20 20 20 28 76 65 63 74  count).    (vect
5f70: 6f 72 20 68 65 61 64 65 72 20 72 65 73 29 29 29  or header res)))
5f80: 0a 0a 3b 3b 20 6a 75 73 74 20 67 65 74 20 63 6f  ..;; just get co
5f90: 75 6e 74 20 6f 66 20 72 75 6e 73 0a 28 64 65 66  unt of runs.(def
5fa0: 69 6e 65 20 28 64 62 3a 67 65 74 2d 6e 75 6d 2d  ine (db:get-num-
5fb0: 72 75 6e 73 20 64 62 20 72 75 6e 70 61 74 74 29  runs db runpatt)
5fc0: 0a 20 20 28 6c 65 74 20 28 28 6e 75 6d 72 75 6e  .  (let ((numrun
5fd0: 73 20 30 29 29 0a 20 20 20 20 28 64 65 62 75 67  s 0)).    (debug
5fe0: 3a 70 72 69 6e 74 2d 69 6e 66 6f 20 31 31 20 22  :print-info 11 "
5ff0: 64 62 3a 67 65 74 2d 6e 75 6d 2d 72 75 6e 73 20  db:get-num-runs 
6000: 53 54 41 52 54 20 22 20 72 75 6e 70 61 74 74 29  START " runpatt)
6010: 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f  .    (sqlite3:fo
6020: 72 2d 65 61 63 68 2d 72 6f 77 20 0a 20 20 20 20  r-each-row .    
6030: 20 28 6c 61 6d 62 64 61 20 28 63 6f 75 6e 74 29   (lambda (count)
6040: 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 6e 75  .       (set! nu
6050: 6d 72 75 6e 73 20 63 6f 75 6e 74 29 29 0a 20 20  mruns count)).  
6060: 20 20 20 64 62 0a 20 20 20 20 20 22 53 45 4c 45     db.     "SELE
6070: 43 54 20 43 4f 55 4e 54 28 69 64 29 20 46 52 4f  CT COUNT(id) FRO
6080: 4d 20 72 75 6e 73 20 57 48 45 52 45 20 72 75 6e  M runs WHERE run
6090: 6e 61 6d 65 20 4c 49 4b 45 20 3f 3b 22 20 72 75  name LIKE ?;" ru
60a0: 6e 70 61 74 74 29 0a 20 20 20 20 28 64 65 62 75  npatt).    (debu
60b0: 67 3a 70 72 69 6e 74 2d 69 6e 66 6f 20 31 31 20  g:print-info 11 
60c0: 22 64 62 3a 67 65 74 2d 6e 75 6d 2d 72 75 6e 73  "db:get-num-runs
60d0: 20 45 4e 44 20 22 20 72 75 6e 70 61 74 74 29 0a   END " runpatt).
60e0: 20 20 20 20 6e 75 6d 72 75 6e 73 29 29 0a 0a 3b      numruns))..;
60f0: 3b 20 75 73 65 20 28 67 65 74 2d 76 61 6c 75 65  ; use (get-value
6100: 2d 62 79 2d 68 65 61 64 65 72 20 28 64 62 3a 67  -by-header (db:g
6110: 65 74 2d 68 65 61 64 65 72 20 72 75 6e 69 6e 66  et-header runinf
6120: 6f 29 28 64 62 3a 67 65 74 2d 72 6f 77 20 72 75  o)(db:get-row ru
6130: 6e 69 6e 66 6f 29 29 0a 28 64 65 66 69 6e 65 20  ninfo)).(define 
6140: 28 64 62 3a 67 65 74 2d 72 75 6e 2d 69 6e 66 6f  (db:get-run-info
6150: 20 64 62 20 72 75 6e 2d 69 64 29 0a 20 20 28 69   db run-id).  (i
6160: 66 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 72 65  f (hash-table-re
6170: 66 2f 64 65 66 61 75 6c 74 20 2a 72 75 6e 2d 69  f/default *run-i
6180: 6e 66 6f 2d 63 61 63 68 65 2a 20 72 75 6e 2d 69  nfo-cache* run-i
6190: 64 20 23 66 29 0a 20 20 20 20 20 20 28 68 61 73  d #f).      (has
61a0: 68 2d 74 61 62 6c 65 2d 72 65 66 20 2a 72 75 6e  h-table-ref *run
61b0: 2d 69 6e 66 6f 2d 63 61 63 68 65 2a 20 72 75 6e  -info-cache* run
61c0: 2d 69 64 29 0a 20 20 20 20 20 20 28 6c 65 74 2a  -id).      (let*
61d0: 20 28 28 72 65 73 20 20 20 20 20 20 23 66 29 0a   ((res      #f).
61e0: 09 20 20 20 20 20 28 6b 65 79 73 20 20 20 20 20  .     (keys     
61f0: 20 28 64 62 3a 67 65 74 2d 6b 65 79 73 20 64 62   (db:get-keys db
6200: 29 29 0a 09 20 20 20 20 20 28 72 65 6d 66 69 65  ))..     (remfie
6210: 6c 64 73 20 28 6c 69 73 74 20 22 69 64 22 20 22  lds (list "id" "
6220: 72 75 6e 6e 61 6d 65 22 20 22 73 74 61 74 65 22  runname" "state"
6230: 20 22 73 74 61 74 75 73 22 20 22 6f 77 6e 65 72   "status" "owner
6240: 22 20 22 65 76 65 6e 74 5f 74 69 6d 65 22 29 29  " "event_time"))
6250: 0a 09 20 20 20 20 20 28 68 65 61 64 65 72 20 20  ..     (header  
6260: 20 20 28 61 70 70 65 6e 64 20 28 6d 61 70 20 6b    (append (map k
6270: 65 79 3a 67 65 74 2d 66 69 65 6c 64 6e 61 6d 65  ey:get-fieldname
6280: 20 6b 65 79 73 29 0a 09 09 09 09 72 65 6d 66 69   keys).....remfi
6290: 65 6c 64 73 29 29 0a 09 20 20 20 20 20 28 6b 65  elds))..     (ke
62a0: 79 73 74 72 20 20 20 20 28 63 6f 6e 63 20 28 6b  ystr    (conc (k
62b0: 65 79 73 2d 3e 6b 65 79 73 74 72 20 6b 65 79 73  eys->keystr keys
62c0: 29 20 22 2c 22 0a 09 09 09 20 20 20 20 20 20 28  ) ","....      (
62d0: 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72  string-intersper
62e0: 73 65 20 72 65 6d 66 69 65 6c 64 73 20 22 2c 22  se remfields ","
62f0: 29 29 29 29 0a 09 28 64 65 62 75 67 3a 70 72 69  ))))..(debug:pri
6300: 6e 74 2d 69 6e 66 6f 20 31 31 20 22 64 62 3a 67  nt-info 11 "db:g
6310: 65 74 2d 72 75 6e 2d 69 6e 66 6f 20 72 75 6e 2d  et-run-info run-
6320: 69 64 3a 20 22 20 72 75 6e 2d 69 64 20 22 20 68  id: " run-id " h
6330: 65 61 64 65 72 3a 20 22 20 68 65 61 64 65 72 20  eader: " header 
6340: 22 20 6b 65 79 73 74 72 3a 20 22 20 6b 65 79 73  " keystr: " keys
6350: 74 72 29 0a 09 28 73 71 6c 69 74 65 33 3a 66 6f  tr)..(sqlite3:fo
6360: 72 2d 65 61 63 68 2d 72 6f 77 0a 09 20 28 6c 61  r-each-row.. (la
6370: 6d 62 64 61 20 28 61 20 2e 20 78 29 0a 09 20 20  mbda (a . x)..  
6380: 20 28 73 65 74 21 20 72 65 73 20 28 61 70 70 6c   (set! res (appl
6390: 79 20 76 65 63 74 6f 72 20 61 20 78 29 29 29 0a  y vector a x))).
63a0: 09 20 64 62 0a 09 20 28 63 6f 6e 63 20 22 53 45  . db.. (conc "SE
63b0: 4c 45 43 54 20 22 20 6b 65 79 73 74 72 20 22 20  LECT " keystr " 
63c0: 46 52 4f 4d 20 72 75 6e 73 20 57 48 45 52 45 20  FROM runs WHERE 
63d0: 69 64 3d 3f 3b 22 29 0a 09 20 72 75 6e 2d 69 64  id=?;").. run-id
63e0: 29 0a 09 28 64 65 62 75 67 3a 70 72 69 6e 74 2d  )..(debug:print-
63f0: 69 6e 66 6f 20 31 31 20 22 64 62 3a 67 65 74 2d  info 11 "db:get-
6400: 72 75 6e 2d 69 6e 66 6f 20 72 75 6e 2d 69 64 3a  run-info run-id:
6410: 20 22 20 72 75 6e 2d 69 64 20 22 20 68 65 61 64   " run-id " head
6420: 65 72 3a 20 22 20 68 65 61 64 65 72 20 22 20 6b  er: " header " k
6430: 65 79 73 74 72 3a 20 22 20 6b 65 79 73 74 72 29  eystr: " keystr)
6440: 0a 09 28 6c 65 74 20 28 28 66 69 6e 61 6c 72 65  ..(let ((finalre
6450: 73 20 28 76 65 63 74 6f 72 20 68 65 61 64 65 72  s (vector header
6460: 20 72 65 73 29 29 29 0a 09 20 20 28 68 61 73 68   res)))..  (hash
6470: 2d 74 61 62 6c 65 2d 73 65 74 21 20 2a 72 75 6e  -table-set! *run
6480: 2d 69 6e 66 6f 2d 63 61 63 68 65 2a 20 72 75 6e  -info-cache* run
6490: 2d 69 64 20 66 69 6e 61 6c 72 65 73 29 0a 09 20  -id finalres).. 
64a0: 20 66 69 6e 61 6c 72 65 73 29 29 29 29 0a 0a 28   finalres))))..(
64b0: 64 65 66 69 6e 65 20 28 64 62 3a 73 65 74 2d 63  define (db:set-c
64c0: 6f 6d 6d 65 6e 74 2d 66 6f 72 2d 72 75 6e 20 64  omment-for-run d
64d0: 62 20 72 75 6e 2d 69 64 20 63 6f 6d 6d 65 6e 74  b run-id comment
64e0: 29 0a 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74  ).  (debug:print
64f0: 2d 69 6e 66 6f 20 31 31 20 22 64 62 3a 73 65 74  -info 11 "db:set
6500: 2d 63 6f 6d 6d 65 6e 74 2d 66 6f 72 2d 72 75 6e  -comment-for-run
6510: 20 53 54 41 52 54 20 72 75 6e 2d 69 64 3a 20 22   START run-id: "
6520: 20 72 75 6e 2d 69 64 20 22 20 63 6f 6d 6d 65 6e   run-id " commen
6530: 74 3a 20 22 20 63 6f 6d 6d 65 6e 74 29 0a 20 20  t: " comment).  
6540: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
6550: 20 64 62 20 22 55 50 44 41 54 45 20 72 75 6e 73   db "UPDATE runs
6560: 20 53 45 54 20 63 6f 6d 6d 65 6e 74 3d 3f 20 57   SET comment=? W
6570: 48 45 52 45 20 69 64 3d 3f 3b 22 20 63 6f 6d 6d  HERE id=?;" comm
6580: 65 6e 74 20 72 75 6e 2d 69 64 29 0a 20 20 28 64  ent run-id).  (d
6590: 65 62 75 67 3a 70 72 69 6e 74 2d 69 6e 66 6f 20  ebug:print-info 
65a0: 31 31 20 22 64 62 3a 73 65 74 2d 63 6f 6d 6d 65  11 "db:set-comme
65b0: 6e 74 2d 66 6f 72 2d 72 75 6e 20 45 4e 44 20 72  nt-for-run END r
65c0: 75 6e 2d 69 64 3a 20 22 20 72 75 6e 2d 69 64 20  un-id: " run-id 
65d0: 22 20 63 6f 6d 6d 65 6e 74 3a 20 22 20 63 6f 6d  " comment: " com
65e0: 6d 65 6e 74 29 29 0a 0a 3b 3b 20 64 6f 65 73 20  ment))..;; does 
65f0: 6e 6f 74 20 28 6f 62 76 69 6f 75 73 6c 79 21 29  not (obviously!)
6600: 20 72 65 6d 6f 76 65 64 20 64 65 70 65 6e 64 65   removed depende
6610: 6e 74 20 64 61 74 61 2e 20 42 75 74 20 77 68 79  nt data. But why
6620: 20 6e 6f 74 21 21 3f 0a 28 64 65 66 69 6e 65 20   not!!?.(define 
6630: 28 64 62 3a 64 65 6c 65 74 65 2d 72 75 6e 20 64  (db:delete-run d
6640: 62 20 72 75 6e 2d 69 64 29 0a 20 20 28 73 71 6c  b run-id).  (sql
6650: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
6660: 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 72 75 6e  "DELETE FROM run
6670: 73 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 72  s WHERE id=?;" r
6680: 75 6e 2d 69 64 29 29 0a 0a 28 64 65 66 69 6e 65  un-id))..(define
6690: 20 28 64 62 3a 75 70 64 61 74 65 2d 72 75 6e 2d   (db:update-run-
66a0: 65 76 65 6e 74 5f 74 69 6d 65 20 64 62 20 72 75  event_time db ru
66b0: 6e 2d 69 64 29 0a 20 20 28 64 65 62 75 67 3a 70  n-id).  (debug:p
66c0: 72 69 6e 74 2d 69 6e 66 6f 20 31 31 20 22 64 62  rint-info 11 "db
66d0: 3a 75 70 64 61 74 65 2d 72 75 6e 2d 65 76 65 6e  :update-run-even
66e0: 74 5f 74 69 6d 65 20 53 54 41 52 54 20 72 75 6e  t_time START run
66f0: 2d 69 64 3a 20 22 20 72 75 6e 2d 69 64 29 0a 20  -id: " run-id). 
6700: 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74   (sqlite3:execut
6710: 65 20 64 62 20 22 55 50 44 41 54 45 20 72 75 6e  e db "UPDATE run
6720: 73 20 53 45 54 20 65 76 65 6e 74 5f 74 69 6d 65  s SET event_time
6730: 3d 73 74 72 66 74 69 6d 65 28 27 25 73 27 2c 27  =strftime('%s','
6740: 6e 6f 77 27 29 20 57 48 45 52 45 20 69 64 3d 3f  now') WHERE id=?
6750: 3b 22 20 72 75 6e 2d 69 64 29 0a 20 20 28 64 65  ;" run-id).  (de
6760: 62 75 67 3a 70 72 69 6e 74 2d 69 6e 66 6f 20 31  bug:print-info 1
6770: 31 20 22 64 62 3a 75 70 64 61 74 65 2d 72 75 6e  1 "db:update-run
6780: 2d 65 76 65 6e 74 5f 74 69 6d 65 20 45 4e 44 20  -event_time END 
6790: 72 75 6e 2d 69 64 3a 20 22 20 72 75 6e 2d 69 64  run-id: " run-id
67a0: 29 29 20 0a 0a 28 64 65 66 69 6e 65 20 28 64 62  )) ..(define (db
67b0: 3a 6c 6f 63 6b 2f 75 6e 6c 6f 63 6b 2d 72 75 6e  :lock/unlock-run
67c0: 20 64 62 20 72 75 6e 2d 69 64 20 6c 6f 63 6b 20   db run-id lock 
67d0: 75 6e 6c 6f 63 6b 20 75 73 65 72 29 0a 20 20 28  unlock user).  (
67e0: 6c 65 74 20 28 28 6e 65 77 6c 6f 63 6b 76 61 6c  let ((newlockval
67f0: 20 28 69 66 20 6c 6f 63 6b 20 22 6c 6f 63 6b 65   (if lock "locke
6800: 64 22 0a 09 09 09 28 69 66 20 75 6e 6c 6f 63 6b  d"....(if unlock
6810: 0a 09 09 09 20 20 20 20 22 75 6e 6c 6f 63 6b 65  ....    "unlocke
6820: 64 22 0a 09 09 09 20 20 20 20 22 6c 6f 63 6b 65  d"....    "locke
6830: 64 22 29 29 29 29 20 3b 3b 20 73 65 6d 69 2d 66  d")))) ;; semi-f
6840: 61 69 6c 73 61 66 65 0a 20 20 20 20 28 73 71 6c  ailsafe.    (sql
6850: 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20  ite3:execute db 
6860: 22 55 50 44 41 54 45 20 72 75 6e 73 20 53 45 54  "UPDATE runs SET
6870: 20 73 74 61 74 65 3d 3f 20 57 48 45 52 45 20 69   state=? WHERE i
6880: 64 3d 3f 3b 22 20 6e 65 77 6c 6f 63 6b 76 61 6c  d=?;" newlockval
6890: 20 72 75 6e 2d 69 64 29 0a 20 20 20 20 28 73 71   run-id).    (sq
68a0: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64 62  lite3:execute db
68b0: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 63   "INSERT INTO ac
68c0: 63 65 73 73 5f 6c 6f 67 20 28 75 73 65 72 2c 61  cess_log (user,a
68d0: 63 63 65 73 73 65 64 2c 61 72 67 73 29 20 56 41  ccessed,args) VA
68e0: 4c 55 45 53 28 3f 2c 73 74 72 66 74 69 6d 65 28  LUES(?,strftime(
68f0: 27 25 73 27 2c 27 6e 6f 77 27 29 2c 3f 29 3b 22  '%s','now'),?);"
6900: 0a 09 09 20 20 20 20 20 75 73 65 72 20 28 63 6f  ...     user (co
6910: 6e 63 20 6e 65 77 6c 6f 63 6b 76 61 6c 20 22 20  nc newlockval " 
6920: 22 20 72 75 6e 2d 69 64 29 29 0a 20 20 20 20 28  " run-id)).    (
6930: 64 65 62 75 67 3a 70 72 69 6e 74 2d 69 6e 66 6f  debug:print-info
6940: 20 31 20 22 22 20 6e 65 77 6c 6f 63 6b 76 61 6c   1 "" newlockval
6950: 20 22 20 72 75 6e 20 6e 75 6d 62 65 72 20 22 20   " run number " 
6960: 72 75 6e 2d 69 64 29 29 29 0a 0a 3b 3b 3d 3d 3d  run-id)))..;;===
6970: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6980: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6990: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
69a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
69b0: 3d 3d 3d 0a 3b 3b 20 4b 20 45 20 59 20 53 0a 3b  ===.;; K E Y S.;
69c0: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;===============
69d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
69e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
69f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
6a00: 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 67 65 74 20  =======..;; get 
6a10: 6b 65 79 20 76 61 6c 20 70 61 69 72 73 20 66 6f  key val pairs fo
6a20: 72 20 61 20 67 69 76 65 6e 20 72 75 6e 2d 69 64  r a given run-id
6a30: 0a 3b 3b 20 28 20 28 46 49 45 4c 44 4e 41 4d 45  .;; ( (FIELDNAME
6a40: 31 20 6b 65 79 76 61 6c 31 29 20 28 46 49 45 4c  1 keyval1) (FIEL
6a50: 44 4e 41 4d 45 32 20 6b 65 79 76 61 6c 32 29 20  DNAME2 keyval2) 
6a60: 2e 2e 2e 20 29 0a 28 64 65 66 69 6e 65 20 28 64  ... ).(define (d
6a70: 62 3a 67 65 74 2d 6b 65 79 2d 76 61 6c 2d 70 61  b:get-key-val-pa
6a80: 69 72 73 20 64 62 20 72 75 6e 2d 69 64 29 0a 20  irs db run-id). 
6a90: 20 28 6c 65 74 2a 20 28 28 6b 65 79 73 20 28 67   (let* ((keys (g
6aa0: 65 74 2d 6b 65 79 73 20 64 62 29 29 0a 09 20 28  et-keys db)).. (
6ab0: 72 65 73 20 20 27 28 29 29 29 0a 20 20 20 20 28  res  '())).    (
6ac0: 64 65 62 75 67 3a 70 72 69 6e 74 2d 69 6e 66 6f  debug:print-info
6ad0: 20 31 31 20 22 64 62 3a 67 65 74 2d 6b 65 79 2d   11 "db:get-key-
6ae0: 76 61 6c 2d 70 61 69 72 73 20 53 54 41 52 54 20  val-pairs START 
6af0: 6b 65 79 73 3a 20 22 20 6b 65 79 73 20 22 20 72  keys: " keys " r
6b00: 75 6e 2d 69 64 3a 20 22 20 72 75 6e 2d 69 64 29  un-id: " run-id)
6b10: 0a 20 20 20 20 28 66 6f 72 2d 65 61 63 68 20 0a  .    (for-each .
6b20: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 6b 65       (lambda (ke
6b30: 79 29 0a 20 20 20 20 20 20 20 28 6c 65 74 20 28  y).       (let (
6b40: 28 71 72 79 20 28 63 6f 6e 63 20 22 53 45 4c 45  (qry (conc "SELE
6b50: 43 54 20 22 20 28 6b 65 79 3a 67 65 74 2d 66 69  CT " (key:get-fi
6b60: 65 6c 64 6e 61 6d 65 20 6b 65 79 29 20 22 20 46  eldname key) " F
6b70: 52 4f 4d 20 72 75 6e 73 20 57 48 45 52 45 20 69  ROM runs WHERE i
6b80: 64 3d 3f 3b 22 29 29 29 0a 09 20 3b 3b 20 28 64  d=?;"))).. ;; (d
6b90: 65 62 75 67 3a 70 72 69 6e 74 20 30 20 22 71 72  ebug:print 0 "qr
6ba0: 79 3a 20 22 20 71 72 79 29 0a 09 20 28 73 71 6c  y: " qry).. (sql
6bb0: 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f  ite3:for-each-ro
6bc0: 77 20 0a 09 20 20 28 6c 61 6d 62 64 61 20 28 6b  w ..  (lambda (k
6bd0: 65 79 2d 76 61 6c 29 0a 09 20 20 20 20 28 73 65  ey-val)..    (se
6be0: 74 21 20 72 65 73 20 28 63 6f 6e 73 20 28 6c 69  t! res (cons (li
6bf0: 73 74 20 28 6b 65 79 3a 67 65 74 2d 66 69 65 6c  st (key:get-fiel
6c00: 64 6e 61 6d 65 20 6b 65 79 29 20 6b 65 79 2d 76  dname key) key-v
6c10: 61 6c 29 20 72 65 73 29 29 29 0a 09 20 20 64 62  al) res)))..  db
6c20: 20 71 72 79 20 72 75 6e 2d 69 64 29 29 29 0a 20   qry run-id))). 
6c30: 20 20 20 20 6b 65 79 73 29 0a 20 20 20 20 28 64      keys).    (d
6c40: 65 62 75 67 3a 70 72 69 6e 74 2d 69 6e 66 6f 20  ebug:print-info 
6c50: 31 31 20 22 64 62 3a 67 65 74 2d 6b 65 79 2d 76  11 "db:get-key-v
6c60: 61 6c 2d 70 61 69 72 73 20 45 4e 44 20 6b 65 79  al-pairs END key
6c70: 73 3a 20 22 20 6b 65 79 73 20 22 20 72 75 6e 2d  s: " keys " run-
6c80: 69 64 3a 20 22 20 72 75 6e 2d 69 64 29 0a 20 20  id: " run-id).  
6c90: 20 20 28 72 65 76 65 72 73 65 20 72 65 73 29 29    (reverse res))
6ca0: 29 0a 0a 3b 3b 20 67 65 74 20 6b 65 79 20 76 61  )..;; get key va
6cb0: 6c 73 20 66 6f 72 20 61 20 67 69 76 65 6e 20 72  ls for a given r
6cc0: 75 6e 2d 69 64 0a 28 64 65 66 69 6e 65 20 28 64  un-id.(define (d
6cd0: 62 3a 67 65 74 2d 6b 65 79 2d 76 61 6c 73 20 64  b:get-key-vals d
6ce0: 62 20 72 75 6e 2d 69 64 29 0a 20 20 28 6c 65 74  b run-id).  (let
6cf0: 20 28 28 6d 79 6b 65 79 76 61 6c 73 20 28 68 61   ((mykeyvals (ha
6d00: 73 68 2d 74 61 62 6c 65 2d 72 65 66 2f 64 65 66  sh-table-ref/def
6d10: 61 75 6c 74 20 2a 6b 65 79 76 61 6c 73 2a 20 72  ault *keyvals* r
6d20: 75 6e 2d 69 64 20 23 66 29 29 29 0a 20 20 20 20  un-id #f))).    
6d30: 28 69 66 20 6d 79 6b 65 79 76 61 6c 73 20 0a 09  (if mykeyvals ..
6d40: 6d 79 6b 65 79 76 61 6c 73 0a 09 28 6c 65 74 2a  mykeyvals..(let*
6d50: 20 28 28 6b 65 79 73 20 28 67 65 74 2d 6b 65 79   ((keys (get-key
6d60: 73 20 64 62 29 29 0a 09 20 20 20 20 20 20 20 28  s db))..       (
6d70: 72 65 73 20 20 27 28 29 29 29 0a 09 20 20 28 64  res  '()))..  (d
6d80: 65 62 75 67 3a 70 72 69 6e 74 2d 69 6e 66 6f 20  ebug:print-info 
6d90: 31 31 20 22 64 62 3a 67 65 74 2d 6b 65 79 2d 76  11 "db:get-key-v
6da0: 61 6c 73 20 53 54 41 52 54 20 6b 65 79 73 3a 20  als START keys: 
6db0: 22 20 6b 65 79 73 20 22 20 72 75 6e 2d 69 64 3a  " keys " run-id:
6dc0: 20 22 20 72 75 6e 2d 69 64 29 0a 09 20 20 28 66   " run-id)..  (f
6dd0: 6f 72 2d 65 61 63 68 20 0a 09 20 20 20 28 6c 61  or-each ..   (la
6de0: 6d 62 64 61 20 28 6b 65 79 29 0a 09 20 20 20 20  mbda (key)..    
6df0: 20 28 6c 65 74 20 28 28 71 72 79 20 28 63 6f 6e   (let ((qry (con
6e00: 63 20 22 53 45 4c 45 43 54 20 22 20 28 6b 65 79  c "SELECT " (key
6e10: 3a 67 65 74 2d 66 69 65 6c 64 6e 61 6d 65 20 6b  :get-fieldname k
6e20: 65 79 29 20 22 20 46 52 4f 4d 20 72 75 6e 73 20  ey) " FROM runs 
6e30: 57 48 45 52 45 20 69 64 3d 3f 3b 22 29 29 29 0a  WHERE id=?;"))).
6e40: 09 20 20 20 20 20 20 20 3b 3b 20 28 64 65 62 75  .       ;; (debu
6e50: 67 3a 70 72 69 6e 74 20 30 20 22 71 72 79 3a 20  g:print 0 "qry: 
6e60: 22 20 71 72 79 29 0a 09 20 20 20 20 20 20 20 28  " qry)..       (
6e70: 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68  sqlite3:for-each
6e80: 2d 72 6f 77 20 0a 09 09 28 6c 61 6d 62 64 61 20  -row ...(lambda 
6e90: 28 6b 65 79 2d 76 61 6c 29 0a 09 09 20 20 28 73  (key-val)...  (s
6ea0: 65 74 21 20 72 65 73 20 28 63 6f 6e 73 20 6b 65  et! res (cons ke
6eb0: 79 2d 76 61 6c 20 72 65 73 29 29 29 0a 09 09 64  y-val res)))...d
6ec0: 62 20 71 72 79 20 72 75 6e 2d 69 64 29 29 29 0a  b qry run-id))).
6ed0: 09 20 20 20 6b 65 79 73 29 0a 09 20 20 28 64 65  .   keys)..  (de
6ee0: 62 75 67 3a 70 72 69 6e 74 2d 69 6e 66 6f 20 31  bug:print-info 1
6ef0: 31 20 22 64 62 3a 67 65 74 2d 6b 65 79 2d 76 61  1 "db:get-key-va
6f00: 6c 73 20 45 4e 44 20 6b 65 79 73 3a 20 22 20 6b  ls END keys: " k
6f10: 65 79 73 20 22 20 72 75 6e 2d 69 64 3a 20 22 20  eys " run-id: " 
6f20: 72 75 6e 2d 69 64 29 0a 09 20 20 28 6c 65 74 20  run-id)..  (let 
6f30: 28 28 66 69 6e 61 6c 2d 72 65 73 20 28 72 65 76  ((final-res (rev
6f40: 65 72 73 65 20 72 65 73 29 29 29 0a 09 20 20 20  erse res)))..   
6f50: 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 73 65 74   (hash-table-set
6f60: 21 20 2a 6b 65 79 76 61 6c 73 2a 20 72 75 6e 2d  ! *keyvals* run-
6f70: 69 64 20 66 69 6e 61 6c 2d 72 65 73 29 0a 09 20  id final-res).. 
6f80: 20 20 20 66 69 6e 61 6c 2d 72 65 73 29 29 29 29     final-res))))
6f90: 29 0a 0a 3b 3b 20 54 68 65 20 74 61 72 67 65 74  )..;; The target
6fa0: 20 69 73 20 6b 65 79 76 61 6c 31 2f 6b 65 79 76   is keyval1/keyv
6fb0: 61 6c 32 2e 2e 2e 2c 20 63 61 63 68 65 64 20 69  al2..., cached i
6fc0: 6e 20 2a 74 61 72 67 65 74 2a 20 61 73 20 69 74  n *target* as it
6fd0: 20 69 73 20 75 73 65 64 20 6f 66 74 65 6e 0a 28   is used often.(
6fe0: 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 74  define (db:get-t
6ff0: 61 72 67 65 74 20 64 62 20 72 75 6e 2d 69 64 29  arget db run-id)
7000: 0a 20 20 28 6c 65 74 20 28 28 6d 79 74 61 72 67  .  (let ((mytarg
7010: 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 72 65 66   (hash-table-ref
7020: 2f 64 65 66 61 75 6c 74 20 2a 74 61 72 67 65 74  /default *target
7030: 2a 20 72 75 6e 2d 69 64 20 23 66 29 29 29 0a 20  * run-id #f))). 
7040: 20 20 20 28 69 66 20 6d 79 74 61 72 67 0a 09 6d     (if mytarg..m
7050: 79 74 61 72 67 0a 09 28 6c 65 74 2a 20 28 28 6b  ytarg..(let* ((k
7060: 65 79 76 61 6c 73 20 28 64 62 3a 67 65 74 2d 6b  eyvals (db:get-k
7070: 65 79 2d 76 61 6c 73 20 64 62 20 72 75 6e 2d 69  ey-vals db run-i
7080: 64 29 29 0a 09 20 20 20 20 20 20 20 28 74 68 65  d))..       (the
7090: 6b 65 79 20 20 28 73 74 72 69 6e 67 2d 69 6e 74  key  (string-int
70a0: 65 72 73 70 65 72 73 65 20 28 6d 61 70 20 28 6c  ersperse (map (l
70b0: 61 6d 62 64 61 20 28 78 29 28 69 66 20 78 20 78  ambda (x)(if x x
70c0: 20 22 2d 6e 61 2d 22 29 29 20 6b 65 79 76 61 6c   "-na-")) keyval
70d0: 73 29 20 22 2f 22 29 29 29 0a 09 20 20 28 68 61  s) "/")))..  (ha
70e0: 73 68 2d 74 61 62 6c 65 2d 73 65 74 21 20 2a 74  sh-table-set! *t
70f0: 61 72 67 65 74 2a 20 72 75 6e 2d 69 64 20 74 68  arget* run-id th
7100: 65 6b 65 79 29 0a 09 20 20 74 68 65 6b 65 79 29  ekey)..  thekey)
7110: 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d  )))..;;=========
7120: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7130: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7140: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7150: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b  =============.;;
7160: 20 20 54 20 45 20 53 20 54 20 53 0a 3b 3b 3d 3d    T E S T S.;;==
7170: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7180: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
7190: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
71a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
71b0: 3d 3d 3d 3d 0a 0a 28 64 65 66 69 6e 65 20 28 64  ====..(define (d
71c0: 62 3a 74 65 73 74 73 2d 72 65 67 69 73 74 65 72  b:tests-register
71d0: 2d 74 65 73 74 20 64 62 20 72 75 6e 2d 69 64 20  -test db run-id 
71e0: 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70  test-name item-p
71f0: 61 74 68 29 0a 20 20 28 64 65 62 75 67 3a 70 72  ath).  (debug:pr
7200: 69 6e 74 2d 69 6e 66 6f 20 31 31 20 22 64 62 3a  int-info 11 "db:
7210: 74 65 73 74 73 2d 72 65 67 69 73 74 65 72 2d 74  tests-register-t
7220: 65 73 74 20 53 54 41 52 54 20 64 62 3d 22 20 64  est START db=" d
7230: 62 20 22 2c 20 72 75 6e 2d 69 64 3d 22 20 72 75  b ", run-id=" ru
7240: 6e 2d 69 64 20 22 2c 20 74 65 73 74 2d 6e 61 6d  n-id ", test-nam
7250: 65 3d 22 20 74 65 73 74 2d 6e 61 6d 65 20 22 2c  e=" test-name ",
7260: 20 69 74 65 6d 2d 70 61 74 68 3d 5c 22 22 20 69   item-path=\"" i
7270: 74 65 6d 2d 70 61 74 68 20 22 5c 22 22 29 0a 20  tem-path "\""). 
7280: 20 28 6c 65 74 20 28 28 69 74 65 6d 2d 70 61 74   (let ((item-pat
7290: 68 73 20 28 69 66 20 28 65 71 75 61 6c 3f 20 69  hs (if (equal? i
72a0: 74 65 6d 2d 70 61 74 68 20 22 22 29 0a 09 09 09  tem-path "")....
72b0: 28 6c 69 73 74 20 69 74 65 6d 2d 70 61 74 68 29  (list item-path)
72c0: 0a 09 09 09 28 6c 69 73 74 20 69 74 65 6d 2d 70  ....(list item-p
72d0: 61 74 68 20 22 22 29 29 29 29 0a 20 20 20 20 28  ath "")))).    (
72e0: 66 6f 72 2d 65 61 63 68 20 0a 20 20 20 20 20 28  for-each .     (
72f0: 6c 61 6d 62 64 61 20 28 70 74 68 29 0a 20 20 20  lambda (pth).   
7300: 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65      (sqlite3:exe
7310: 63 75 74 65 20 64 62 20 22 49 4e 53 45 52 54 20  cute db "INSERT 
7320: 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20 74  OR IGNORE INTO t
7330: 65 73 74 73 20 28 72 75 6e 5f 69 64 2c 74 65 73  ests (run_id,tes
7340: 74 6e 61 6d 65 2c 65 76 65 6e 74 5f 74 69 6d 65  tname,event_time
7350: 2c 69 74 65 6d 5f 70 61 74 68 2c 73 74 61 74 65  ,item_path,state
7360: 2c 73 74 61 74 75 73 29 20 56 41 4c 55 45 53 20  ,status) VALUES 
7370: 28 3f 2c 3f 2c 73 74 72 66 74 69 6d 65 28 27 25  (?,?,strftime('%
7380: 73 27 2c 27 6e 6f 77 27 29 2c 3f 2c 27 4e 4f 54  s','now'),?,'NOT
7390: 5f 53 54 41 52 54 45 44 27 2c 27 6e 2f 61 27 29  _STARTED','n/a')
73a0: 3b 22 20 0a 09 09 09 72 75 6e 2d 69 64 20 0a 09  ;" ....run-id ..
73b0: 09 09 74 65 73 74 2d 6e 61 6d 65 0a 09 09 09 70  ..test-name....p
73c0: 74 68 29 29 0a 20 20 20 20 20 69 74 65 6d 2d 70  th)).     item-p
73d0: 61 74 68 73 29 0a 20 20 28 64 65 62 75 67 3a 70  aths).  (debug:p
73e0: 72 69 6e 74 2d 69 6e 66 6f 20 31 31 20 22 64 62  rint-info 11 "db
73f0: 3a 74 65 73 74 73 2d 72 65 67 69 73 74 65 72 2d  :tests-register-
7400: 74 65 73 74 20 45 4e 44 20 64 62 3d 22 20 64 62  test END db=" db
7410: 20 22 2c 20 72 75 6e 2d 69 64 3d 22 20 72 75 6e   ", run-id=" run
7420: 2d 69 64 20 22 2c 20 74 65 73 74 2d 6e 61 6d 65  -id ", test-name
7430: 3d 22 20 74 65 73 74 2d 6e 61 6d 65 20 22 2c 20  =" test-name ", 
7440: 69 74 65 6d 2d 70 61 74 68 3d 5c 22 22 20 69 74  item-path=\"" it
7450: 65 6d 2d 70 61 74 68 20 22 5c 22 22 29 0a 20 20  em-path "\"").  
7460: 20 20 23 66 29 29 0a 0a 0a 3b 3b 20 73 74 61 74    #f))...;; stat
7470: 65 73 20 61 6e 64 20 73 74 61 74 75 73 65 73 20  es and statuses 
7480: 61 72 65 20 6c 69 73 74 73 2c 20 74 75 72 6e 20  are lists, turn 
7490: 74 68 65 6d 20 69 6e 74 6f 20 28 22 50 41 53 53  them into ("PASS
74a0: 22 2c 22 46 41 49 4c 22 2e 2e 2e 29 20 61 6e 64  ","FAIL"...) and
74b0: 20 75 73 65 20 4e 4f 54 20 49 4e 0a 3b 3b 20 69   use NOT IN.;; i
74c0: 2e 65 2e 20 74 68 65 73 65 20 6c 69 73 74 73 20  .e. these lists 
74d0: 64 65 66 69 6e 65 20 77 68 61 74 20 74 6f 20 4e  define what to N
74e0: 4f 54 20 73 68 6f 77 2e 0a 3b 3b 20 73 74 61 74  OT show..;; stat
74f0: 65 73 20 61 6e 64 20 73 74 61 74 75 73 65 73 20  es and statuses 
7500: 61 72 65 20 72 65 71 75 69 72 65 64 20 74 6f 20  are required to 
7510: 62 65 20 6c 69 73 74 73 2c 20 65 6d 70 74 79 20  be lists, empty 
7520: 69 73 20 6f 6b 0a 3b 3b 20 6e 6f 74 2d 69 6e 20  is ok.;; not-in 
7530: 23 74 20 3d 20 61 62 6f 76 65 20 62 65 68 61 76  #t = above behav
7540: 69 6f 75 72 2c 20 23 66 20 3d 20 6d 75 73 74 20  iour, #f = must 
7550: 6d 61 74 63 68 0a 28 64 65 66 69 6e 65 20 28 64  match.(define (d
7560: 62 3a 67 65 74 2d 74 65 73 74 73 2d 66 6f 72 2d  b:get-tests-for-
7570: 72 75 6e 20 64 62 20 72 75 6e 2d 69 64 20 74 65  run db run-id te
7580: 73 74 70 61 74 74 20 73 74 61 74 65 73 20 73 74  stpatt states st
7590: 61 74 75 73 65 73 20 0a 09 09 09 20 20 20 20 20  atuses ....     
75a0: 20 23 21 6b 65 79 20 28 6e 6f 74 2d 69 6e 20 23   #!key (not-in #
75b0: 74 29 0a 09 09 09 20 20 20 20 20 20 28 73 6f 72  t)....      (sor
75c0: 74 2d 62 79 20 23 66 29 20 3b 3b 20 27 72 75 6e  t-by #f) ;; 'run
75d0: 64 69 72 20 27 65 76 65 6e 74 5f 74 69 6d 65 0a  dir 'event_time.
75e0: 09 09 09 20 20 20 20 20 20 29 0a 20 20 28 64 65  ...      ).  (de
75f0: 62 75 67 3a 70 72 69 6e 74 2d 69 6e 66 6f 20 31  bug:print-info 1
7600: 31 20 22 64 62 3a 67 65 74 2d 74 65 73 74 73 2d  1 "db:get-tests-
7610: 66 6f 72 2d 72 75 6e 20 53 54 41 52 54 20 72 75  for-run START ru
7620: 6e 2d 69 64 3d 22 20 72 75 6e 2d 69 64 20 22 2c  n-id=" run-id ",
7630: 20 74 65 73 74 70 61 74 74 3d 22 20 74 65 73 74   testpatt=" test
7640: 70 61 74 74 20 22 2c 20 73 74 61 74 65 73 3d 22  patt ", states="
7650: 20 73 74 61 74 65 73 20 22 2c 20 73 74 61 74 75   states ", statu
7660: 73 65 73 3d 22 20 73 74 61 74 75 73 65 73 20 22  ses=" statuses "
7670: 2c 20 6e 6f 74 2d 69 6e 3d 22 20 6e 6f 74 2d 69  , not-in=" not-i
7680: 6e 20 22 2c 20 73 6f 72 74 2d 62 79 3d 22 20 73  n ", sort-by=" s
7690: 6f 72 74 2d 62 79 29 0a 20 20 28 6c 65 74 2a 20  ort-by).  (let* 
76a0: 28 28 72 65 73 20 27 28 29 29 0a 09 20 3b 3b 20  ((res '()).. ;; 
76b0: 69 66 20 73 74 61 74 65 73 20 6f 72 20 73 74 61  if states or sta
76c0: 74 75 73 65 73 20 61 72 65 20 6e 75 6c 6c 20 74  tuses are null t
76d0: 68 65 6e 20 61 73 73 75 6d 65 20 6d 61 74 63 68  hen assume match
76e0: 20 61 6c 6c 20 77 68 65 6e 20 6e 6f 74 2d 69 6e   all when not-in
76f0: 20 69 73 20 66 61 6c 73 65 0a 09 20 28 73 74 61   is false.. (sta
7700: 74 65 73 2d 71 72 79 20 20 20 20 20 20 28 69 66  tes-qry      (if
7710: 20 28 6e 75 6c 6c 3f 20 73 74 61 74 65 73 29 20   (null? states) 
7720: 0a 09 09 09 20 20 20 20 20 20 23 66 0a 09 09 09  ....      #f....
7730: 20 20 20 20 20 20 28 63 6f 6e 63 20 22 20 73 74        (conc " st
7740: 61 74 65 20 22 20 20 0a 09 09 09 09 20 20 20 20  ate "  .....    
7750: 28 69 66 20 6e 6f 74 2d 69 6e 20 22 4e 4f 54 22  (if not-in "NOT"
7760: 20 22 22 29 20 0a 09 09 09 09 20 20 20 20 22 20   "") .....    " 
7770: 49 4e 20 28 27 22 20 0a 09 09 09 09 20 20 20 20  IN ('" .....    
7780: 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65  (string-interspe
7790: 72 73 65 20 73 74 61 74 65 73 20 20 20 22 27 2c  rse states   "',
77a0: 27 22 29 0a 09 09 09 09 20 20 20 20 22 27 29 22  '").....    "')"
77b0: 29 29 29 0a 09 20 28 73 74 61 74 75 73 65 73 2d  ))).. (statuses-
77c0: 71 72 79 20 20 20 20 28 69 66 20 28 6e 75 6c 6c  qry    (if (null
77d0: 3f 20 73 74 61 74 75 73 65 73 29 0a 09 09 09 20  ? statuses).... 
77e0: 20 20 20 20 20 23 66 0a 09 09 09 20 20 20 20 20       #f....     
77f0: 20 28 63 6f 6e 63 20 22 20 73 74 61 74 75 73 20   (conc " status 
7800: 22 0a 09 09 09 09 20 20 20 20 28 69 66 20 6e 6f  ".....    (if no
7810: 74 2d 69 6e 20 22 4e 4f 54 22 20 22 22 29 20 0a  t-in "NOT" "") .
7820: 09 09 09 09 20 20 20 20 22 20 49 4e 20 28 27 22  ....    " IN ('"
7830: 20 0a 09 09 09 09 20 20 20 20 28 73 74 72 69 6e   .....    (strin
7840: 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 73 74  g-intersperse st
7850: 61 74 75 73 65 73 20 22 27 2c 27 22 29 0a 09 09  atuses "','")...
7860: 09 09 20 20 20 20 22 27 29 22 29 29 29 0a 09 20  ..    "')"))).. 
7870: 28 74 65 73 74 73 2d 6d 61 74 63 68 2d 71 72 79  (tests-match-qry
7880: 20 28 74 65 73 74 73 3a 6d 61 74 63 68 2d 3e 73   (tests:match->s
7890: 71 6c 71 72 79 20 74 65 73 74 70 61 74 74 29 29  qlqry testpatt))
78a0: 0a 09 20 28 71 72 79 20 20 20 20 20 20 20 20 20  .. (qry         
78b0: 20 20 20 20 28 63 6f 6e 63 20 22 53 45 4c 45 43      (conc "SELEC
78c0: 54 20 69 64 2c 72 75 6e 5f 69 64 2c 74 65 73 74  T id,run_id,test
78d0: 6e 61 6d 65 2c 73 74 61 74 65 2c 73 74 61 74 75  name,state,statu
78e0: 73 2c 65 76 65 6e 74 5f 74 69 6d 65 2c 68 6f 73  s,event_time,hos
78f0: 74 2c 63 70 75 6c 6f 61 64 2c 64 69 73 6b 66 72  t,cpuload,diskfr
7900: 65 65 2c 75 6e 61 6d 65 2c 72 75 6e 64 69 72 2c  ee,uname,rundir,
7910: 69 74 65 6d 5f 70 61 74 68 2c 72 75 6e 5f 64 75  item_path,run_du
7920: 72 61 74 69 6f 6e 2c 66 69 6e 61 6c 5f 6c 6f 67  ration,final_log
7930: 66 2c 63 6f 6d 6d 65 6e 74 20 22 0a 09 09 09 09  f,comment ".....
7940: 22 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45  " FROM tests WHE
7950: 52 45 20 72 75 6e 5f 69 64 3d 3f 20 22 0a 09 09  RE run_id=? "...
7960: 09 09 28 69 66 20 73 74 61 74 65 73 2d 71 72 79  ..(if states-qry
7970: 20 20 20 28 63 6f 6e 63 20 22 20 41 4e 44 20 22     (conc " AND "
7980: 20 73 74 61 74 65 73 2d 71 72 79 29 20 20 20 22   states-qry)   "
7990: 22 29 0a 09 09 09 09 28 69 66 20 73 74 61 74 75  ").....(if statu
79a0: 73 65 73 2d 71 72 79 20 28 63 6f 6e 63 20 22 20  ses-qry (conc " 
79b0: 41 4e 44 20 22 20 73 74 61 74 75 73 65 73 2d 71  AND " statuses-q
79c0: 72 79 29 20 22 22 29 0a 09 09 09 09 28 69 66 20  ry) "").....(if 
79d0: 74 65 73 74 73 2d 6d 61 74 63 68 2d 71 72 79 20  tests-match-qry 
79e0: 28 63 6f 6e 63 20 22 20 41 4e 44 20 28 22 20 74  (conc " AND (" t
79f0: 65 73 74 73 2d 6d 61 74 63 68 2d 71 72 79 20 22  ests-match-qry "
7a00: 29 20 22 29 20 22 22 29 0a 09 09 09 09 28 63 61  ) ") "").....(ca
7a10: 73 65 20 73 6f 72 74 2d 62 79 0a 09 09 09 09 20  se sort-by..... 
7a20: 20 28 28 72 75 6e 64 69 72 29 20 20 20 20 20 22   ((rundir)     "
7a30: 20 4f 52 44 45 52 20 42 59 20 6c 65 6e 67 74 68   ORDER BY length
7a40: 28 72 75 6e 64 69 72 29 20 44 45 53 43 3b 22 29  (rundir) DESC;")
7a50: 0a 09 09 09 09 20 20 28 28 65 76 65 6e 74 5f 74  .....  ((event_t
7a60: 69 6d 65 29 20 22 20 4f 52 44 45 52 20 42 59 20  ime) " ORDER BY 
7a70: 65 76 65 6e 74 5f 74 69 6d 65 20 41 53 43 3b 22  event_time ASC;"
7a80: 29 0a 09 09 09 09 20 20 28 65 6c 73 65 20 20 20  ).....  (else   
7a90: 20 20 20 20 20 20 22 3b 22 29 29 0a 09 09 09 20        ";")).... 
7aa0: 29 29 29 0a 20 20 20 20 28 64 65 62 75 67 3a 70  ))).    (debug:p
7ab0: 72 69 6e 74 2d 69 6e 66 6f 20 38 20 22 64 62 3a  rint-info 8 "db:
7ac0: 67 65 74 2d 74 65 73 74 73 2d 66 6f 72 2d 72 75  get-tests-for-ru
7ad0: 6e 20 71 72 79 3d 22 20 71 72 79 29 0a 20 20 20  n qry=" qry).   
7ae0: 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61   (sqlite3:for-ea
7af0: 63 68 2d 72 6f 77 20 0a 20 20 20 20 20 28 6c 61  ch-row .     (la
7b00: 6d 62 64 61 20 28 61 20 2e 20 62 29 20 3b 3b 20  mbda (a . b) ;; 
7b10: 69 64 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61  id run-id testna
7b20: 6d 65 20 73 74 61 74 65 20 73 74 61 74 75 73 20  me state status 
7b30: 65 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73 74 20  event-time host 
7b40: 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65  cpuload diskfree
7b50: 20 75 6e 61 6d 65 20 72 75 6e 64 69 72 20 69 74   uname rundir it
7b60: 65 6d 2d 70 61 74 68 20 72 75 6e 2d 64 75 72 61  em-path run-dura
7b70: 74 69 6f 6e 20 66 69 6e 61 6c 2d 6c 6f 67 66 20  tion final-logf 
7b80: 63 6f 6d 6d 65 6e 74 29 0a 20 20 20 20 20 20 20  comment).       
7b90: 28 73 65 74 21 20 72 65 73 20 28 63 6f 6e 73 20  (set! res (cons 
7ba0: 28 61 70 70 6c 79 20 76 65 63 74 6f 72 20 61 20  (apply vector a 
7bb0: 62 29 20 72 65 73 29 29 29 20 3b 3b 20 69 64 20  b) res))) ;; id 
7bc0: 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20  run-id testname 
7bd0: 73 74 61 74 65 20 73 74 61 74 75 73 20 65 76 65  state status eve
7be0: 6e 74 2d 74 69 6d 65 20 68 6f 73 74 20 63 70 75  nt-time host cpu
7bf0: 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20 75 6e  load diskfree un
7c00: 61 6d 65 20 72 75 6e 64 69 72 20 69 74 65 6d 2d  ame rundir item-
7c10: 70 61 74 68 20 72 75 6e 2d 64 75 72 61 74 69 6f  path run-duratio
7c20: 6e 20 66 69 6e 61 6c 2d 6c 6f 67 66 20 63 6f 6d  n final-logf com
7c30: 6d 65 6e 74 29 20 72 65 73 29 29 29 0a 20 20 20  ment) res))).   
7c40: 20 20 64 62 20 0a 20 20 20 20 20 71 72 79 0a 20    db .     qry. 
7c50: 20 20 20 20 72 75 6e 2d 69 64 0a 20 20 20 20 20      run-id.     
7c60: 3b 3b 20 28 69 66 20 74 65 73 74 70 61 74 74 20  ;; (if testpatt 
7c70: 74 65 73 74 70 61 74 74 20 22 25 22 29 0a 20 20  testpatt "%").  
7c80: 20 20 20 3b 3b 20 28 69 66 20 69 74 65 6d 70 61     ;; (if itempa
7c90: 74 74 20 69 74 65 6d 70 61 74 74 20 22 25 22 29  tt itempatt "%")
7ca0: 29 0a 20 20 20 20 20 29 0a 20 20 20 20 28 64 65  ).     ).    (de
7cb0: 62 75 67 3a 70 72 69 6e 74 2d 69 6e 66 6f 20 31  bug:print-info 1
7cc0: 31 20 22 64 62 3a 67 65 74 2d 74 65 73 74 73 2d  1 "db:get-tests-
7cd0: 66 6f 72 2d 72 75 6e 20 53 54 41 52 54 20 72 75  for-run START ru
7ce0: 6e 2d 69 64 3d 22 20 72 75 6e 2d 69 64 20 22 2c  n-id=" run-id ",
7cf0: 20 74 65 73 74 70 61 74 74 3d 22 20 74 65 73 74   testpatt=" test
7d00: 70 61 74 74 20 22 2c 20 73 74 61 74 65 73 3d 22  patt ", states="
7d10: 20 73 74 61 74 65 73 20 22 2c 20 73 74 61 74 75   states ", statu
7d20: 73 65 73 3d 22 20 73 74 61 74 75 73 65 73 20 22  ses=" statuses "
7d30: 2c 20 6e 6f 74 2d 69 6e 3d 22 20 6e 6f 74 2d 69  , not-in=" not-i
7d40: 6e 20 22 2c 20 73 6f 72 74 2d 62 79 3d 22 20 73  n ", sort-by=" s
7d50: 6f 72 74 2d 62 79 29 0a 20 20 20 20 72 65 73 29  ort-by).    res)
7d60: 29 0a 0a 3b 3b 20 74 68 69 73 20 6f 6e 65 20 69  )..;; this one i
7d70: 73 20 61 20 62 69 74 20 62 72 6f 6b 65 6e 20 42  s a bit broken B
7d80: 55 47 20 46 49 58 4d 45 0a 28 64 65 66 69 6e 65  UG FIXME.(define
7d90: 20 28 64 62 3a 64 65 6c 65 74 65 2d 74 65 73 74   (db:delete-test
7da0: 2d 73 74 65 70 2d 72 65 63 6f 72 64 73 20 64 62  -step-records db
7db0: 20 74 65 73 74 2d 69 64 29 0a 20 20 3b 3b 20 42   test-id).  ;; B
7dc0: 72 65 61 6b 69 6e 67 20 69 74 20 69 6e 74 6f 20  reaking it into 
7dd0: 74 77 6f 20 71 75 65 72 69 65 73 20 66 6f 72 20  two queries for 
7de0: 62 65 74 74 65 72 20 66 69 6c 65 20 61 63 63 65  better file acce
7df0: 73 73 20 69 6e 74 65 72 6c 65 61 76 69 6e 67 0a  ss interleaving.
7e00: 20 20 28 6c 65 74 2a 20 28 28 74 64 62 20 28 64    (let* ((tdb (d
7e10: 62 3a 6f 70 65 6e 2d 74 65 73 74 2d 64 62 2d 62  b:open-test-db-b
7e20: 79 2d 74 65 73 74 2d 69 64 20 64 62 20 74 65 73  y-test-id db tes
7e30: 74 2d 69 64 29 29 29 0a 20 20 20 20 3b 3b 20 74  t-id))).    ;; t
7e40: 65 73 74 20 64 62 27 73 20 63 61 6e 20 67 6f 20  est db's can go 
7e50: 61 77 61 79 20 2d 20 6d 75 73 74 20 63 68 65 63  away - must chec
7e60: 6b 20 65 76 65 72 79 20 74 69 6d 65 0a 20 20 20  k every time.   
7e70: 20 28 69 66 20 74 64 62 0a 09 28 62 65 67 69 6e   (if tdb..(begin
7e80: 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65  ..  (sqlite3:exe
7e90: 63 75 74 65 20 74 64 62 20 22 44 45 4c 45 54 45  cute tdb "DELETE
7ea0: 20 46 52 4f 4d 20 74 65 73 74 5f 73 74 65 70 73   FROM test_steps
7eb0: 3b 22 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a  ;")..  (sqlite3:
7ec0: 65 78 65 63 75 74 65 20 74 64 62 20 22 44 45 4c  execute tdb "DEL
7ed0: 45 54 45 20 46 52 4f 4d 20 74 65 73 74 5f 64 61  ETE FROM test_da
7ee0: 74 61 3b 22 29 0a 09 20 20 28 73 71 6c 69 74 65  ta;")..  (sqlite
7ef0: 33 3a 66 69 6e 61 6c 69 7a 65 21 20 74 64 62 29  3:finalize! tdb)
7f00: 29 29 29 29 0a 0a 3b 3b 20 0a 28 64 65 66 69 6e  ))))..;; .(defin
7f10: 65 20 28 64 62 3a 64 65 6c 65 74 65 2d 74 65 73  e (db:delete-tes
7f20: 74 2d 72 65 63 6f 72 64 73 20 64 62 20 74 64 62  t-records db tdb
7f30: 20 74 65 73 74 2d 69 64 20 23 21 6b 65 79 20 28   test-id #!key (
7f40: 66 6f 72 63 65 20 23 66 29 29 0a 20 20 28 69 66  force #f)).  (if
7f50: 20 74 64 62 20 0a 20 20 20 20 20 20 28 62 65 67   tdb .      (beg
7f60: 69 6e 0a 09 28 73 71 6c 69 74 65 33 3a 65 78 65  in..(sqlite3:exe
7f70: 63 75 74 65 20 74 64 62 20 22 44 45 4c 45 54 45  cute tdb "DELETE
7f80: 20 46 52 4f 4d 20 74 65 73 74 5f 73 74 65 70 73   FROM test_steps
7f90: 3b 22 29 0a 09 28 73 71 6c 69 74 65 33 3a 65 78  ;")..(sqlite3:ex
7fa0: 65 63 75 74 65 20 74 64 62 20 22 44 45 4c 45 54  ecute tdb "DELET
7fb0: 45 20 46 52 4f 4d 20 74 65 73 74 5f 64 61 74 61  E FROM test_data
7fc0: 3b 22 29 29 29 0a 20 20 3b 3b 20 28 73 71 6c 69  ;"))).  ;; (sqli
7fd0: 74 65 33 3a 65 78 65 63 75 74 65 20 64 62 20 22  te3:execute db "
7fe0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 74 65 73 74  DELETE FROM test
7ff0: 73 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20 74  s WHERE id=?;" t
8000: 65 73 74 2d 69 64 29 29 0a 20 20 28 69 66 20 64  est-id)).  (if d
8010: 62 20 0a 20 20 20 20 20 20 28 62 65 67 69 6e 0a  b .      (begin.
8020: 09 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74  .(sqlite3:execut
8030: 65 20 64 62 20 22 44 45 4c 45 54 45 20 46 52 4f  e db "DELETE FRO
8040: 4d 20 74 65 73 74 5f 73 74 65 70 73 20 57 48 45  M test_steps WHE
8050: 52 45 20 74 65 73 74 5f 69 64 3d 3f 3b 22 20 74  RE test_id=?;" t
8060: 65 73 74 2d 69 64 29 0a 09 28 73 71 6c 69 74 65  est-id)..(sqlite
8070: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 44 45  3:execute db "DE
8080: 4c 45 54 45 20 46 52 4f 4d 20 74 65 73 74 5f 64  LETE FROM test_d
8090: 61 74 61 20 20 57 48 45 52 45 20 74 65 73 74 5f  ata  WHERE test_
80a0: 69 64 3d 3f 3b 22 20 74 65 73 74 2d 69 64 29 0a  id=?;" test-id).
80b0: 09 28 69 66 20 66 6f 72 63 65 0a 09 20 20 20 20  .(if force..    
80c0: 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65  (sqlite3:execute
80d0: 20 64 62 20 22 44 45 4c 45 54 45 20 46 52 4f 4d   db "DELETE FROM
80e0: 20 74 65 73 74 73 20 57 48 45 52 45 20 69 64 3d   tests WHERE id=
80f0: 3f 3b 22 20 74 65 73 74 2d 69 64 29 0a 09 20 20  ?;" test-id)..  
8100: 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75    (sqlite3:execu
8110: 74 65 20 64 62 20 22 55 50 44 41 54 45 20 74 65  te db "UPDATE te
8120: 73 74 73 20 53 45 54 20 73 74 61 74 65 3d 27 44  sts SET state='D
8130: 45 4c 45 54 45 44 27 2c 73 74 61 74 75 73 3d 27  ELETED',status='
8140: 6e 2f 61 27 20 57 48 45 52 45 20 69 64 3d 3f 3b  n/a' WHERE id=?;
8150: 22 20 74 65 73 74 2d 69 64 29 29 29 29 29 0a 0a  " test-id)))))..
8160: 28 64 65 66 69 6e 65 20 28 64 62 3a 64 65 6c 65  (define (db:dele
8170: 74 65 2d 74 65 73 74 73 2d 66 6f 72 2d 72 75 6e  te-tests-for-run
8180: 20 64 62 20 72 75 6e 2d 69 64 29 0a 20 20 28 73   db run-id).  (s
8190: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64  qlite3:execute d
81a0: 62 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20 74  b "DELETE FROM t
81b0: 65 73 74 73 20 57 48 45 52 45 20 72 75 6e 5f 69  ests WHERE run_i
81c0: 64 3d 3f 3b 22 20 72 75 6e 2d 69 64 29 29 0a 0a  d=?;" run-id))..
81d0: 28 64 65 66 69 6e 65 20 28 64 62 3a 64 65 6c 65  (define (db:dele
81e0: 74 65 2d 6f 6c 64 2d 64 65 6c 65 74 65 64 2d 74  te-old-deleted-t
81f0: 65 73 74 2d 72 65 63 6f 72 64 73 20 64 62 29 0a  est-records db).
8200: 20 20 28 6c 65 74 20 28 28 74 61 72 67 74 69 6d    (let ((targtim
8210: 65 20 28 2d 20 28 63 75 72 72 65 6e 74 2d 73 65  e (- (current-se
8220: 63 6f 6e 64 73 29 28 2a 20 33 30 20 32 34 20 36  conds)(* 30 24 6
8230: 30 20 36 30 29 29 29 29 20 3b 3b 20 6f 6e 65 20  0 60)))) ;; one 
8240: 6d 6f 6e 74 68 20 69 6e 20 74 68 65 20 70 61 73  month in the pas
8250: 74 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65  t.    (sqlite3:e
8260: 78 65 63 75 74 65 20 64 62 20 22 44 45 4c 45 54  xecute db "DELET
8270: 45 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45  E FROM tests WHE
8280: 52 45 20 73 74 61 74 65 3d 27 44 45 4c 45 54 45  RE state='DELETE
8290: 44 27 20 41 4e 44 20 65 76 65 6e 74 5f 74 69 6d  D' AND event_tim
82a0: 65 3c 3f 3b 22 20 74 61 72 67 74 69 6d 65 29 29  e<?;" targtime))
82b0: 29 0a 0a 3b 3b 20 73 65 74 20 74 65 73 74 73 20  )..;; set tests 
82c0: 77 69 74 68 20 73 74 61 74 65 20 63 75 72 72 73  with state currs
82d0: 74 61 74 65 20 61 6e 64 20 73 74 61 74 75 73 20  tate and status 
82e0: 63 75 72 72 73 74 61 74 75 73 20 74 6f 20 6e 65  currstatus to ne
82f0: 77 73 74 61 74 65 20 61 6e 64 20 6e 65 77 73 74  wstate and newst
8300: 61 74 75 73 0a 3b 3b 20 75 73 65 20 63 75 72 72  atus.;; use curr
8310: 73 74 61 74 65 20 3d 20 23 66 20 61 6e 64 20 6f  state = #f and o
8320: 72 20 63 75 72 72 73 74 61 74 75 73 20 3d 20 23  r currstatus = #
8330: 66 20 74 6f 20 61 70 70 6c 79 20 74 6f 20 61 6e  f to apply to an
8340: 79 20 73 74 61 74 65 20 6f 72 20 73 74 61 74 75  y state or statu
8350: 73 20 72 65 73 70 65 63 74 69 76 65 6c 79 0a 3b  s respectively.;
8360: 3b 20 57 41 52 4e 49 4e 47 3a 20 53 51 4c 20 69  ; WARNING: SQL i
8370: 6e 6a 65 63 74 69 6f 6e 20 72 69 73 6b 0a 28 64  njection risk.(d
8380: 65 66 69 6e 65 20 28 64 62 3a 73 65 74 2d 74 65  efine (db:set-te
8390: 73 74 73 2d 73 74 61 74 65 2d 73 74 61 74 75 73  sts-state-status
83a0: 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 6e   db run-id testn
83b0: 61 6d 65 73 20 63 75 72 72 73 74 61 74 65 20 63  ames currstate c
83c0: 75 72 72 73 74 61 74 75 73 20 6e 65 77 73 74 61  urrstatus newsta
83d0: 74 65 20 6e 65 77 73 74 61 74 75 73 29 0a 20 20  te newstatus).  
83e0: 28 66 6f 72 2d 65 61 63 68 20 28 6c 61 6d 62 64  (for-each (lambd
83f0: 61 20 28 74 65 73 74 6e 61 6d 65 29 0a 09 20 20  a (testname)..  
8400: 20 20 20 20 28 6c 65 74 20 28 28 71 72 79 20 28      (let ((qry (
8410: 63 6f 6e 63 20 22 55 50 44 41 54 45 20 74 65 73  conc "UPDATE tes
8420: 74 73 20 53 45 54 20 73 74 61 74 65 3d 3f 2c 73  ts SET state=?,s
8430: 74 61 74 75 73 3d 3f 20 57 48 45 52 45 20 22 0a  tatus=? WHERE ".
8440: 09 09 09 20 20 20 20 20 20 20 28 69 66 20 63 75  ...       (if cu
8450: 72 72 73 74 61 74 65 20 20 28 63 6f 6e 63 20 22  rrstate  (conc "
8460: 73 74 61 74 65 3d 27 22 20 63 75 72 72 73 74 61  state='" currsta
8470: 74 65 20 22 27 20 41 4e 44 20 22 29 20 22 22 29  te "' AND ") "")
8480: 0a 09 09 09 20 20 20 20 20 20 20 28 69 66 20 63  ....       (if c
8490: 75 72 72 73 74 61 74 75 73 20 28 63 6f 6e 63 20  urrstatus (conc 
84a0: 22 73 74 61 74 75 73 3d 27 22 20 63 75 72 72 73  "status='" currs
84b0: 74 61 74 75 73 20 22 27 20 41 4e 44 20 22 29 20  tatus "' AND ") 
84c0: 22 22 29 0a 09 09 09 20 20 20 20 20 20 20 22 20  "")....       " 
84d0: 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73  run_id=? AND tes
84e0: 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 4e 4f 54 20  tname=? AND NOT 
84f0: 28 69 74 65 6d 5f 70 61 74 68 3d 27 27 20 41 4e  (item_path='' AN
8500: 44 20 74 65 73 74 6e 61 6d 65 20 69 6e 20 28 53  D testname in (S
8510: 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 74  ELECT DISTINCT t
8520: 65 73 74 6e 61 6d 65 20 46 52 4f 4d 20 74 65 73  estname FROM tes
8530: 74 73 20 57 48 45 52 45 20 74 65 73 74 6e 61 6d  ts WHERE testnam
8540: 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74  e=? AND item_pat
8550: 68 20 21 3d 20 27 27 29 29 3b 22 29 29 29 0a 09  h != ''));")))..
8560: 09 3b 3b 28 64 65 62 75 67 3a 70 72 69 6e 74 20  .;;(debug:print 
8570: 30 20 22 51 52 59 3a 20 22 20 71 72 79 29 0a 09  0 "QRY: " qry)..
8580: 09 28 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74  .(sqlite3:execut
8590: 65 20 64 62 20 71 72 79 20 72 75 6e 2d 69 64 20  e db qry run-id 
85a0: 6e 65 77 73 74 61 74 65 20 6e 65 77 73 74 61 74  newstate newstat
85b0: 75 73 20 74 65 73 74 6e 61 6d 65 20 74 65 73 74  us testname test
85c0: 6e 61 6d 65 29 29 29 0a 09 20 20 20 20 74 65 73  name)))..    tes
85d0: 74 6e 61 6d 65 73 29 29 0a 0a 28 64 65 66 69 6e  tnames))..(defin
85e0: 65 20 28 64 62 3a 64 65 6c 65 74 65 2d 74 65 73  e (db:delete-tes
85f0: 74 73 2d 69 6e 2d 73 74 61 74 65 20 64 62 20 72  ts-in-state db r
8600: 75 6e 2d 69 64 20 73 74 61 74 65 29 0a 20 20 28  un-id state).  (
8610: 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
8620: 64 62 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  db "DELETE FROM 
8630: 74 65 73 74 73 20 57 48 45 52 45 20 73 74 61 74  tests WHERE stat
8640: 65 3d 3f 20 41 4e 44 20 72 75 6e 5f 69 64 3d 3f  e=? AND run_id=?
8650: 3b 22 20 73 74 61 74 65 20 72 75 6e 2d 69 64 29  ;" state run-id)
8660: 29 0a 0a 3b 3b 20 73 70 65 65 64 20 75 70 20 66  )..;; speed up f
8670: 6f 72 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 73 20  or common cases 
8680: 77 69 74 68 20 61 20 6c 69 74 74 6c 65 20 6c 6f  with a little lo
8690: 67 69 63 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  gic.(define (db:
86a0: 74 65 73 74 2d 73 65 74 2d 73 74 61 74 65 2d 73  test-set-state-s
86b0: 74 61 74 75 73 2d 62 79 2d 69 64 20 64 62 20 74  tatus-by-id db t
86c0: 65 73 74 2d 69 64 20 6e 65 77 73 74 61 74 65 20  est-id newstate 
86d0: 6e 65 77 73 74 61 74 75 73 20 6e 65 77 63 6f 6d  newstatus newcom
86e0: 6d 65 6e 74 29 0a 20 20 28 63 6f 6e 64 0a 20 20  ment).  (cond.  
86f0: 20 28 28 61 6e 64 20 6e 65 77 73 74 61 74 65 20   ((and newstate 
8700: 6e 65 77 73 74 61 74 75 73 20 6e 65 77 63 6f 6d  newstatus newcom
8710: 6d 65 6e 74 29 0a 20 20 20 20 28 73 71 6c 69 74  ment).    (sqlit
8720: 65 33 3a 65 78 65 63 74 75 74 65 20 64 62 20 22  e3:exectute db "
8730: 55 50 44 41 54 45 20 74 65 73 74 73 20 53 45 54  UPDATE tests SET
8740: 20 73 74 61 74 65 3d 3f 2c 73 74 61 74 75 73 3d   state=?,status=
8750: 3f 2c 63 6f 6d 6d 65 6e 74 3d 3f 20 57 48 45 52  ?,comment=? WHER
8760: 45 20 69 64 3d 3f 3b 22 20 6e 65 77 73 74 61 74  E id=?;" newstat
8770: 65 20 6e 65 77 73 74 61 74 75 73 20 74 65 73 74  e newstatus test
8780: 2d 69 64 29 29 0a 20 20 20 28 28 61 6e 64 20 6e  -id)).   ((and n
8790: 65 77 73 74 61 74 65 20 6e 65 77 73 74 61 74 75  ewstate newstatu
87a0: 73 29 0a 20 20 20 20 28 73 71 6c 69 74 65 33 3a  s).    (sqlite3:
87b0: 65 78 65 63 75 74 65 20 64 62 20 22 55 50 44 41  execute db "UPDA
87c0: 54 45 20 74 65 73 74 73 20 53 45 54 20 73 74 61  TE tests SET sta
87d0: 74 65 3d 3f 2c 73 74 61 74 75 73 3d 3f 20 57 48  te=?,status=? WH
87e0: 45 52 45 20 69 64 3d 3f 3b 22 20 6e 65 77 73 74  ERE id=?;" newst
87f0: 61 74 65 20 6e 65 77 73 74 61 74 75 73 20 74 65  ate newstatus te
8800: 73 74 2d 69 64 29 29 0a 20 20 20 28 65 6c 73 65  st-id)).   (else
8810: 0a 20 20 20 20 28 69 66 20 6e 65 77 73 74 61 74  .    (if newstat
8820: 65 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65  e   (sqlite3:exe
8830: 63 75 74 65 20 64 62 20 22 55 50 44 41 54 45 20  cute db "UPDATE 
8840: 74 65 73 74 73 20 53 45 54 20 73 74 61 74 65 3d  tests SET state=
8850: 3f 20 20 20 57 48 45 52 45 20 69 64 3d 3f 3b 22  ?   WHERE id=?;"
8860: 20 6e 65 77 73 74 61 74 65 20 20 20 74 65 73 74   newstate   test
8870: 2d 69 64 29 29 0a 20 20 20 20 28 69 66 20 6e 65  -id)).    (if ne
8880: 77 73 74 61 74 75 73 20 20 28 73 71 6c 69 74 65  wstatus  (sqlite
8890: 33 3a 65 78 65 63 75 74 65 20 64 62 20 22 55 50  3:execute db "UP
88a0: 44 41 54 45 20 74 65 73 74 73 20 53 45 54 20 73  DATE tests SET s
88b0: 74 61 74 75 73 3d 3f 20 20 57 48 45 52 45 20 69  tatus=?  WHERE i
88c0: 64 3d 3f 3b 22 20 6e 65 77 73 74 61 74 75 73 20  d=?;" newstatus 
88d0: 20 74 65 73 74 2d 69 64 29 29 0a 20 20 20 20 28   test-id)).    (
88e0: 69 66 20 6e 65 77 63 6f 6d 6d 65 6e 74 20 28 73  if newcomment (s
88f0: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64  qlite3:execute d
8900: 62 20 22 55 50 44 41 54 45 20 74 65 73 74 73 20  b "UPDATE tests 
8910: 53 45 54 20 63 6f 6d 6d 65 6e 74 3d 3f 20 57 48  SET comment=? WH
8920: 45 52 45 20 69 64 3d 3f 3b 22 20 6e 65 77 63 6f  ERE id=?;" newco
8930: 6d 6d 65 6e 74 20 74 65 73 74 2d 69 64 29 29 29  mment test-id)))
8940: 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  ))..(define (db:
8950: 74 65 73 74 2d 73 65 74 2d 73 74 61 74 65 2d 73  test-set-state-s
8960: 74 61 74 75 73 2d 62 79 2d 72 75 6e 2d 69 64 2d  tatus-by-run-id-
8970: 74 65 73 74 6e 61 6d 65 20 64 62 20 72 75 6e 2d  testname db run-
8980: 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65  id test-name ite
8990: 6d 2d 70 61 74 68 20 73 74 61 74 75 73 20 73 74  m-path status st
89a0: 61 74 65 29 0a 20 20 28 73 71 6c 69 74 65 33 3a  ate).  (sqlite3:
89b0: 65 78 65 63 75 74 65 20 64 62 20 22 55 50 44 41  execute db "UPDA
89c0: 54 45 20 74 65 73 74 73 20 53 45 54 20 73 74 61  TE tests SET sta
89d0: 74 65 3d 3f 2c 73 74 61 74 75 73 3d 3f 2c 65 76  te=?,status=?,ev
89e0: 65 6e 74 5f 74 69 6d 65 3d 73 74 72 66 74 69 6d  ent_time=strftim
89f0: 65 28 27 25 73 27 2c 27 6e 6f 77 27 29 20 57 48  e('%s','now') WH
8a00: 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44  ERE run_id=? AND
8a10: 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20   testname=? AND 
8a20: 69 74 65 6d 5f 70 61 74 68 3d 3f 3b 22 20 0a 09  item_path=?;" ..
8a30: 09 20 20 20 73 74 61 74 65 20 73 74 61 74 75 73  .   state status
8a40: 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d   run-id test-nam
8a50: 65 20 69 74 65 6d 2d 70 61 74 68 29 29 0a 0a 28  e item-path))..(
8a60: 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 63  define (db:get-c
8a70: 6f 75 6e 74 2d 74 65 73 74 73 2d 72 75 6e 6e 69  ount-tests-runni
8a80: 6e 67 20 64 62 29 0a 20 20 28 6c 65 74 20 28 28  ng db).  (let ((
8a90: 72 65 73 20 30 29 29 0a 20 20 20 20 28 73 71 6c  res 0)).    (sql
8aa0: 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f  ite3:for-each-ro
8ab0: 77 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28  w.     (lambda (
8ac0: 63 6f 75 6e 74 29 0a 20 20 20 20 20 20 20 28 73  count).       (s
8ad0: 65 74 21 20 72 65 73 20 63 6f 75 6e 74 29 29 0a  et! res count)).
8ae0: 20 20 20 20 20 64 62 0a 20 20 20 20 20 22 53 45       db.     "SE
8af0: 4c 45 43 54 20 63 6f 75 6e 74 28 69 64 29 20 46  LECT count(id) F
8b00: 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 20  ROM tests WHERE 
8b10: 73 74 61 74 65 20 69 6e 20 28 27 52 55 4e 4e 49  state in ('RUNNI
8b20: 4e 47 27 2c 27 4c 41 55 4e 43 48 45 44 27 2c 27  NG','LAUNCHED','
8b30: 52 45 4d 4f 54 45 48 4f 53 54 53 54 41 52 54 27  REMOTEHOSTSTART'
8b40: 29 3b 22 29 0a 20 20 20 20 72 65 73 29 29 0a 0a  );").    res))..
8b50: 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d  (define (db:get-
8b60: 63 6f 75 6e 74 2d 74 65 73 74 73 2d 72 75 6e 6e  count-tests-runn
8b70: 69 6e 67 2d 69 6e 2d 6a 6f 62 67 72 6f 75 70 20  ing-in-jobgroup 
8b80: 64 62 20 6a 6f 62 67 72 6f 75 70 29 0a 20 20 28  db jobgroup).  (
8b90: 69 66 20 28 6e 6f 74 20 6a 6f 62 67 72 6f 75 70  if (not jobgroup
8ba0: 29 0a 20 20 20 20 20 20 30 20 3b 3b 20 0a 20 20  ).      0 ;; .  
8bb0: 20 20 20 20 28 6c 65 74 20 28 28 72 65 73 20 30      (let ((res 0
8bc0: 29 29 0a 09 28 73 71 6c 69 74 65 33 3a 66 6f 72  ))..(sqlite3:for
8bd0: 2d 65 61 63 68 2d 72 6f 77 0a 09 20 28 6c 61 6d  -each-row.. (lam
8be0: 62 64 61 20 28 63 6f 75 6e 74 29 0a 09 20 20 20  bda (count)..   
8bf0: 28 73 65 74 21 20 72 65 73 20 63 6f 75 6e 74 29  (set! res count)
8c00: 29 0a 09 20 64 62 0a 09 20 22 53 45 4c 45 43 54  ).. db.. "SELECT
8c10: 20 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20   count(id) FROM 
8c20: 74 65 73 74 73 20 57 48 45 52 45 20 73 74 61 74  tests WHERE stat
8c30: 65 20 3d 20 27 52 55 4e 4e 49 4e 47 27 20 4f 52  e = 'RUNNING' OR
8c40: 20 73 74 61 74 65 20 3d 20 27 4c 41 55 4e 43 48   state = 'LAUNCH
8c50: 45 44 27 20 4f 52 20 73 74 61 74 65 20 3d 20 27  ED' OR state = '
8c60: 52 45 4d 4f 54 45 48 4f 53 54 53 54 41 52 54 27  REMOTEHOSTSTART'
8c70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 41 4e  .             AN
8c80: 44 20 74 65 73 74 6e 61 6d 65 20 69 6e 20 28 53  D testname in (S
8c90: 45 4c 45 43 54 20 74 65 73 74 6e 61 6d 65 20 46  ELECT testname F
8ca0: 52 4f 4d 20 74 65 73 74 5f 6d 65 74 61 20 57 48  ROM test_meta WH
8cb0: 45 52 45 20 6a 6f 62 67 72 6f 75 70 3d 3f 3b 22  ERE jobgroup=?;"
8cc0: 0a 09 20 6a 6f 62 67 72 6f 75 70 29 0a 09 72 65  .. jobgroup)..re
8cd0: 73 29 29 29 0a 0a 3b 3b 20 64 6f 6e 65 20 77 69  s)))..;; done wi
8ce0: 74 68 20 72 75 6e 20 77 68 65 6e 3a 0a 3b 3b 20  th run when:.;; 
8cf0: 20 20 30 20 74 65 73 74 73 20 69 6e 20 4c 41 55    0 tests in LAU
8d00: 4e 43 48 45 44 2c 20 4e 4f 54 5f 53 54 41 52 54  NCHED, NOT_START
8d10: 45 44 2c 20 52 45 4d 4f 54 45 48 4f 53 54 53 54  ED, REMOTEHOSTST
8d20: 41 52 54 2c 20 52 55 4e 4e 49 4e 47 0a 28 64 65  ART, RUNNING.(de
8d30: 66 69 6e 65 20 28 64 62 3a 65 73 74 69 6d 61 74  fine (db:estimat
8d40: 65 64 2d 74 65 73 74 73 2d 72 65 6d 61 69 6e 69  ed-tests-remaini
8d50: 6e 67 20 64 62 20 72 75 6e 2d 69 64 29 0a 20 20  ng db run-id).  
8d60: 28 6c 65 74 20 28 28 72 65 73 20 30 29 29 0a 20  (let ((res 0)). 
8d70: 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d     (sqlite3:for-
8d80: 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c  each-row.     (l
8d90: 61 6d 62 64 61 20 28 63 6f 75 6e 74 29 0a 20 20  ambda (count).  
8da0: 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20 63       (set! res c
8db0: 6f 75 6e 74 29 29 0a 20 20 20 20 20 64 62 20 3b  ount)).     db ;
8dc0: 3b 20 4e 42 2f 2f 20 4b 49 4c 4c 52 45 51 20 6d  ; NB// KILLREQ m
8dd0: 65 61 6e 73 20 74 68 65 20 6a 6f 62 73 20 69 73  eans the jobs is
8de0: 20 73 74 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20   still probably 
8df0: 72 75 6e 6e 69 6e 67 0a 20 20 20 20 20 22 53 45  running.     "SE
8e00: 4c 45 43 54 20 63 6f 75 6e 74 28 69 64 29 20 46  LECT count(id) F
8e10: 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 20  ROM tests WHERE 
8e20: 73 74 61 74 65 20 69 6e 20 28 27 4c 41 55 4e 43  state in ('LAUNC
8e30: 48 45 44 27 2c 27 4e 4f 54 5f 53 54 41 52 54 45  HED','NOT_STARTE
8e40: 44 27 2c 27 52 45 4d 4f 54 45 48 4f 53 54 53 54  D','REMOTEHOSTST
8e50: 41 52 54 27 2c 27 52 55 4e 4e 49 4e 47 27 2c 27  ART','RUNNING','
8e60: 4b 49 4c 4c 52 45 51 27 29 20 41 4e 44 20 72 75  KILLREQ') AND ru
8e70: 6e 5f 69 64 3d 3f 3b 22 20 72 75 6e 2d 69 64 29  n_id=?;" run-id)
8e80: 0a 20 20 20 20 72 65 73 29 29 0a 0a 3b 3b 20 6d  .    res))..;; m
8e90: 61 70 20 72 75 6e 2d 69 64 2c 20 74 65 73 74 6e  ap run-id, testn
8ea0: 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 74 6f  ame item-path to
8eb0: 20 74 65 73 74 2d 69 64 0a 28 64 65 66 69 6e 65   test-id.(define
8ec0: 20 28 64 62 3a 67 65 74 2d 74 65 73 74 2d 69 64   (db:get-test-id
8ed0: 2d 63 61 63 68 65 64 20 64 62 20 72 75 6e 2d 69  -cached db run-i
8ee0: 64 20 74 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d  d testname item-
8ef0: 70 61 74 68 29 0a 20 20 28 6c 65 74 2a 20 28 28  path).  (let* ((
8f00: 74 65 73 74 2d 6b 65 79 20 28 63 6f 6e 63 20 72  test-key (conc r
8f10: 75 6e 2d 69 64 20 22 2d 22 20 74 65 73 74 6e 61  un-id "-" testna
8f20: 6d 65 20 22 2d 22 20 69 74 65 6d 2d 70 61 74 68  me "-" item-path
8f30: 29 29 0a 09 20 28 72 65 73 20 20 20 20 20 20 28  )).. (res      (
8f40: 68 61 73 68 2d 74 61 62 6c 65 2d 72 65 66 2f 64  hash-table-ref/d
8f50: 65 66 61 75 6c 74 20 2a 74 65 73 74 2d 69 64 73  efault *test-ids
8f60: 2a 20 74 65 73 74 2d 6b 65 79 20 23 66 29 29 29  * test-key #f)))
8f70: 0a 20 20 20 20 28 69 66 20 72 65 73 20 0a 09 72  .    (if res ..r
8f80: 65 73 0a 09 28 62 65 67 69 6e 0a 09 20 20 28 73  es..(begin..  (s
8f90: 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d  qlite3:for-each-
8fa0: 72 6f 77 0a 09 20 20 20 28 6c 61 6d 62 64 61 20  row..   (lambda 
8fb0: 28 69 64 29 20 3b 3b 20 20 72 75 6e 2d 69 64 20  (id) ;;  run-id 
8fc0: 74 65 73 74 6e 61 6d 65 20 73 74 61 74 65 20 73  testname state s
8fd0: 74 61 74 75 73 20 65 76 65 6e 74 2d 74 69 6d 65  tatus event-time
8fe0: 20 68 6f 73 74 20 63 70 75 6c 6f 61 64 20 64 69   host cpuload di
8ff0: 73 6b 66 72 65 65 20 75 6e 61 6d 65 20 72 75 6e  skfree uname run
9000: 64 69 72 20 69 74 65 6d 2d 70 61 74 68 20 72 75  dir item-path ru
9010: 6e 5f 64 75 72 61 74 69 6f 6e 20 66 69 6e 61 6c  n_duration final
9020: 5f 6c 6f 67 66 20 63 6f 6d 6d 65 6e 74 20 29 0a  _logf comment ).
9030: 09 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20  .     (set! res 
9040: 69 64 29 29 20 3b 3b 20 28 76 65 63 74 6f 72 20  id)) ;; (vector 
9050: 69 64 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61  id run-id testna
9060: 6d 65 20 73 74 61 74 65 20 73 74 61 74 75 73 20  me state status 
9070: 65 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73 74 20  event-time host 
9080: 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65  cpuload diskfree
9090: 20 75 6e 61 6d 65 20 72 75 6e 64 69 72 20 69 74   uname rundir it
90a0: 65 6d 2d 70 61 74 68 20 72 75 6e 5f 64 75 72 61  em-path run_dura
90b0: 74 69 6f 6e 20 66 69 6e 61 6c 5f 6c 6f 67 66 20  tion final_logf 
90c0: 63 6f 6d 6d 65 6e 74 20 29 29 29 0a 09 20 20 20  comment )))..   
90d0: 64 62 20 0a 09 20 20 20 22 53 45 4c 45 43 54 20  db ..   "SELECT 
90e0: 69 64 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48  id FROM tests WH
90f0: 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44  ERE run_id=? AND
9100: 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20   testname=? AND 
9110: 69 74 65 6d 5f 70 61 74 68 3d 3f 3b 22 0a 09 20  item_path=?;".. 
9120: 20 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d    run-id testnam
9130: 65 20 69 74 65 6d 2d 70 61 74 68 29 0a 09 20 20  e item-path)..  
9140: 28 68 61 73 68 2d 74 61 62 6c 65 2d 73 65 74 21  (hash-table-set!
9150: 20 2a 74 65 73 74 2d 69 64 73 2a 20 74 65 73 74   *test-ids* test
9160: 2d 6b 65 79 20 72 65 73 29 0a 09 20 20 72 65 73  -key res)..  res
9170: 29 29 29 29 0a 0a 3b 3b 20 6d 61 70 20 72 75 6e  ))))..;; map run
9180: 2d 69 64 2c 20 74 65 73 74 6e 61 6d 65 20 69 74  -id, testname it
9190: 65 6d 2d 70 61 74 68 20 74 6f 20 74 65 73 74 2d  em-path to test-
91a0: 69 64 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 67  id.(define (db:g
91b0: 65 74 2d 74 65 73 74 2d 69 64 2d 6e 6f 74 2d 63  et-test-id-not-c
91c0: 61 63 68 65 64 20 64 62 20 72 75 6e 2d 69 64 20  ached db run-id 
91d0: 74 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61  testname item-pa
91e0: 74 68 29 0a 20 20 28 6c 65 74 2a 20 28 28 72 65  th).  (let* ((re
91f0: 73 20 23 66 29 29 0a 20 20 20 20 28 73 71 6c 69  s #f)).    (sqli
9200: 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77  te3:for-each-row
9210: 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 69  .     (lambda (i
9220: 64 29 20 3b 3b 20 20 72 75 6e 2d 69 64 20 74 65  d) ;;  run-id te
9230: 73 74 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61  stname state sta
9240: 74 75 73 20 65 76 65 6e 74 2d 74 69 6d 65 20 68  tus event-time h
9250: 6f 73 74 20 63 70 75 6c 6f 61 64 20 64 69 73 6b  ost cpuload disk
9260: 66 72 65 65 20 75 6e 61 6d 65 20 72 75 6e 64 69  free uname rundi
9270: 72 20 69 74 65 6d 2d 70 61 74 68 20 72 75 6e 5f  r item-path run_
9280: 64 75 72 61 74 69 6f 6e 20 66 69 6e 61 6c 5f 6c  duration final_l
9290: 6f 67 66 20 63 6f 6d 6d 65 6e 74 20 29 0a 20 20  ogf comment ).  
92a0: 20 20 20 20 20 28 73 65 74 21 20 72 65 73 20 69       (set! res i
92b0: 64 29 29 20 3b 3b 20 28 76 65 63 74 6f 72 20 69  d)) ;; (vector i
92c0: 64 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d  d run-id testnam
92d0: 65 20 73 74 61 74 65 20 73 74 61 74 75 73 20 65  e state status e
92e0: 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73 74 20 63  vent-time host c
92f0: 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20  puload diskfree 
9300: 75 6e 61 6d 65 20 72 75 6e 64 69 72 20 69 74 65  uname rundir ite
9310: 6d 2d 70 61 74 68 20 72 75 6e 5f 64 75 72 61 74  m-path run_durat
9320: 69 6f 6e 20 66 69 6e 61 6c 5f 6c 6f 67 66 20 63  ion final_logf c
9330: 6f 6d 6d 65 6e 74 20 29 29 29 0a 20 20 20 20 20  omment ))).     
9340: 64 62 20 0a 20 20 20 20 20 22 53 45 4c 45 43 54  db .     "SELECT
9350: 20 69 64 20 46 52 4f 4d 20 74 65 73 74 73 20 57   id FROM tests W
9360: 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e  HERE run_id=? AN
9370: 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44  D testname=? AND
9380: 20 69 74 65 6d 5f 70 61 74 68 3d 3f 3b 22 0a 20   item_path=?;". 
9390: 20 20 20 20 72 75 6e 2d 69 64 20 74 65 73 74 6e      run-id testn
93a0: 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 0a 20  ame item-path). 
93b0: 20 20 20 72 65 73 29 29 0a 0a 28 64 65 66 69 6e     res))..(defin
93c0: 65 20 64 62 3a 67 65 74 2d 74 65 73 74 2d 69 64  e db:get-test-id
93d0: 20 64 62 3a 67 65 74 2d 74 65 73 74 2d 69 64 2d   db:get-test-id-
93e0: 63 61 63 68 65 64 29 0a 0a 3b 3b 20 67 69 76 65  cached)..;; give
93f0: 6e 20 61 20 74 65 73 74 2d 69 6e 66 6f 20 72 65  n a test-info re
9400: 63 6f 72 64 2c 20 70 61 74 63 68 20 69 6e 20 74  cord, patch in t
9410: 68 65 20 6c 61 74 65 73 74 20 64 61 74 61 20 66  he latest data f
9420: 72 6f 6d 20 74 68 65 20 74 65 73 74 64 61 74 2e  rom the testdat.
9430: 64 62 20 66 69 6c 65 0a 3b 3b 20 66 6f 75 6e 64  db file.;; found
9440: 20 69 6e 20 74 68 65 20 74 65 73 74 20 72 75 6e   in the test run
9450: 20 64 69 72 65 63 74 6f 72 79 0a 28 64 65 66 69   directory.(defi
9460: 6e 65 20 28 64 62 3a 70 61 74 63 68 2d 74 64 62  ne (db:patch-tdb
9470: 2d 64 61 74 61 2d 69 6e 74 6f 2d 74 65 73 74 2d  -data-into-test-
9480: 69 6e 66 6f 20 64 62 20 74 65 73 74 2d 69 64 20  info db test-id 
9490: 72 65 73 29 0a 20 20 28 6c 65 74 20 28 28 74 64  res).  (let ((td
94a0: 62 20 28 64 62 3a 6f 70 65 6e 2d 74 65 73 74 2d  b (db:open-test-
94b0: 64 62 2d 62 79 2d 74 65 73 74 2d 69 64 20 64 62  db-by-test-id db
94c0: 20 74 65 73 74 2d 69 64 29 29 29 0a 20 20 20 20   test-id))).    
94d0: 3b 3b 20 67 65 74 20 73 74 61 74 65 20 61 6e 64  ;; get state and
94e0: 20 73 74 61 74 75 73 20 66 72 6f 6d 20 6d 65 67   status from meg
94f0: 61 74 65 73 74 2e 64 62 20 69 6e 20 72 65 61 6c  atest.db in real
9500: 20 74 69 6d 65 0a 20 20 20 20 3b 3b 20 6f 74 68   time.    ;; oth
9510: 65 72 20 66 69 65 6c 64 73 20 74 68 61 74 20 70  er fields that p
9520: 65 72 68 61 70 73 20 73 68 6f 75 6c 64 20 62 65  erhaps should be
9530: 20 75 70 64 61 74 65 64 3a 0a 20 20 20 20 3b 3b   updated:.    ;;
9540: 20 20 20 66 61 69 6c 5f 63 6f 75 6e 74 0a 20 20     fail_count.  
9550: 20 20 3b 3b 20 20 20 70 61 73 73 5f 63 6f 75 6e    ;;   pass_coun
9560: 74 0a 20 20 20 20 3b 3b 20 20 20 66 69 6e 61 6c  t.    ;;   final
9570: 5f 6c 6f 67 66 0a 20 20 20 20 28 73 71 6c 69 74  _logf.    (sqlit
9580: 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 0a  e3:for-each-row.
9590: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 73 74       (lambda (st
95a0: 61 74 65 20 73 74 61 74 75 73 20 66 69 6e 61 6c  ate status final
95b0: 5f 6c 6f 67 66 29 0a 20 20 20 20 20 20 20 28 64  _logf).       (d
95c0: 62 3a 74 65 73 74 2d 73 65 74 2d 73 74 61 74 65  b:test-set-state
95d0: 21 20 20 20 20 20 20 20 20 72 65 73 20 73 74 61  !        res sta
95e0: 74 65 29 0a 20 20 20 20 20 20 20 28 64 62 3a 74  te).       (db:t
95f0: 65 73 74 2d 73 65 74 2d 73 74 61 74 75 73 21 20  est-set-status! 
9600: 20 20 20 20 20 20 72 65 73 20 73 74 61 74 75 73        res status
9610: 29 0a 20 20 20 20 20 20 20 28 64 62 3a 74 65 73  ).       (db:tes
9620: 74 2d 73 65 74 2d 66 69 6e 61 6c 5f 6c 6f 67 66  t-set-final_logf
9630: 21 20 20 20 72 65 73 20 66 69 6e 61 6c 5f 6c 6f  !   res final_lo
9640: 67 66 29 29 0a 20 20 20 20 20 64 62 0a 20 20 20  gf)).     db.   
9650: 20 20 22 53 45 4c 45 43 54 20 73 74 61 74 65 2c    "SELECT state,
9660: 73 74 61 74 75 73 2c 66 69 6e 61 6c 5f 6c 6f 67  status,final_log
9670: 66 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45  f FROM tests WHE
9680: 52 45 20 69 64 3d 3f 3b 22 0a 20 20 20 20 20 74  RE id=?;".     t
9690: 65 73 74 2d 69 64 29 0a 20 20 20 20 28 69 66 20  est-id).    (if 
96a0: 74 64 62 0a 09 28 62 65 67 69 6e 0a 09 20 20 28  tdb..(begin..  (
96b0: 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68  sqlite3:for-each
96c0: 2d 72 6f 77 0a 09 20 20 20 28 6c 61 6d 62 64 61  -row..   (lambda
96d0: 20 28 75 70 64 61 74 65 5f 74 69 6d 65 20 63 70   (update_time cp
96e0: 75 6c 6f 61 64 20 64 69 73 6b 5f 66 72 65 65 20  uload disk_free 
96f0: 72 75 6e 5f 64 75 72 61 74 69 6f 6e 29 0a 09 20  run_duration).. 
9700: 20 20 20 20 28 64 62 3a 74 65 73 74 2d 73 65 74      (db:test-set
9710: 2d 63 70 75 6c 6f 61 64 21 20 20 20 20 20 20 72  -cpuload!      r
9720: 65 73 20 63 70 75 6c 6f 61 64 29 0a 09 20 20 20  es cpuload)..   
9730: 20 20 28 64 62 3a 74 65 73 74 2d 73 65 74 2d 64    (db:test-set-d
9740: 69 73 6b 66 72 65 65 21 20 20 20 20 20 72 65 73  iskfree!     res
9750: 20 64 69 73 6b 5f 66 72 65 65 29 0a 09 20 20 20   disk_free)..   
9760: 20 20 28 64 62 3a 74 65 73 74 2d 73 65 74 2d 72    (db:test-set-r
9770: 75 6e 5f 64 75 72 61 74 69 6f 6e 21 20 72 65 73  un_duration! res
9780: 20 72 75 6e 5f 64 75 72 61 74 69 6f 6e 29 29 0a   run_duration)).
9790: 09 20 20 20 74 64 62 0a 09 20 20 20 22 53 45 4c  .   tdb..   "SEL
97a0: 45 43 54 20 75 70 64 61 74 65 5f 74 69 6d 65 2c  ECT update_time,
97b0: 63 70 75 6c 6f 61 64 2c 64 69 73 6b 66 72 65 65  cpuload,diskfree
97c0: 2c 72 75 6e 5f 64 75 72 61 74 69 6f 6e 20 46 52  ,run_duration FR
97d0: 4f 4d 20 74 65 73 74 5f 72 75 6e 64 61 74 20 4f  OM test_rundat O
97e0: 52 44 45 52 20 42 59 20 69 64 20 44 45 53 43 20  RDER BY id DESC 
97f0: 4c 49 4d 49 54 20 31 3b 22 29 0a 09 20 20 28 73  LIMIT 1;")..  (s
9800: 71 6c 69 74 65 33 3a 66 69 6e 61 6c 69 7a 65 21  qlite3:finalize!
9810: 20 74 64 62 29 29 0a 09 3b 3b 20 69 66 20 74 68   tdb))..;; if th
9820: 65 20 74 65 73 74 20 64 62 20 69 73 20 6e 6f 74  e test db is not
9830: 20 66 6f 75 6e 64 20 77 68 61 74 20 74 6f 20 64   found what to d
9840: 6f 3f 0a 09 3b 3b 20 31 2e 20 73 65 74 20 73 74  o?..;; 1. set st
9850: 61 74 65 20 74 6f 20 44 45 4c 45 54 45 44 0a 09  ate to DELETED..
9860: 3b 3b 20 32 2e 20 73 65 74 20 73 74 61 74 75 73  ;; 2. set status
9870: 20 74 6f 20 6e 2f 61 0a 09 28 62 65 67 69 6e 0a   to n/a..(begin.
9880: 09 20 20 28 64 62 3a 74 65 73 74 2d 73 65 74 2d  .  (db:test-set-
9890: 73 74 61 74 65 21 20 20 72 65 73 20 22 4e 4f 54  state!  res "NOT
98a0: 5f 53 54 41 52 54 45 44 22 29 0a 09 20 20 28 64  _STARTED")..  (d
98b0: 62 3a 74 65 73 74 2d 73 65 74 2d 73 74 61 74 75  b:test-set-statu
98c0: 73 21 20 72 65 73 20 22 6e 2f 61 22 29 29 29 29  s! res "n/a"))))
98d0: 29 0a 0a 28 64 65 66 69 6e 65 20 2a 6c 61 73 74  )..(define *last
98e0: 2d 74 65 73 74 2d 63 61 63 68 65 2d 64 65 6c 65  -test-cache-dele
98f0: 74 65 2a 20 28 63 75 72 72 65 6e 74 2d 73 65 63  te* (current-sec
9900: 6f 6e 64 73 29 29 0a 0a 28 64 65 66 69 6e 65 20  onds))..(define 
9910: 28 64 62 3a 63 6c 65 61 6e 2d 61 6c 6c 2d 63 61  (db:clean-all-ca
9920: 63 68 65 73 29 0a 20 20 28 73 65 74 21 20 2a 74  ches).  (set! *t
9930: 65 73 74 2d 69 6e 66 6f 2a 20 28 6d 61 6b 65 2d  est-info* (make-
9940: 68 61 73 68 2d 74 61 62 6c 65 29 29 0a 20 20 28  hash-table)).  (
9950: 73 65 74 21 20 2a 74 65 73 74 2d 69 64 2d 63 61  set! *test-id-ca
9960: 63 68 65 2a 20 28 6d 61 6b 65 2d 68 61 73 68 2d  che* (make-hash-
9970: 74 61 62 6c 65 29 29 29 0a 0a 3b 3b 20 47 65 74  table)))..;; Get
9980: 20 74 65 73 74 20 64 61 74 61 20 75 73 69 6e 67   test data using
9990: 20 74 65 73 74 5f 69 64 0a 28 64 65 66 69 6e 65   test_id.(define
99a0: 20 28 64 62 3a 67 65 74 2d 74 65 73 74 2d 69 6e   (db:get-test-in
99b0: 66 6f 2d 63 61 63 68 65 64 2d 62 79 2d 69 64 20  fo-cached-by-id 
99c0: 64 62 20 74 65 73 74 2d 69 64 29 0a 20 20 3b 3b  db test-id).  ;;
99d0: 20 69 73 20 61 6c 6c 20 74 68 69 73 20 63 72 61   is all this cra
99e0: 70 20 72 65 61 6c 6c 79 20 77 6f 72 74 68 20 69  p really worth i
99f0: 74 3f 20 49 20 73 6f 6d 65 68 6f 77 20 64 6f 75  t? I somehow dou
9a00: 62 74 20 69 74 2e 0a 20 20 28 6c 65 74 2a 20 28  bt it..  (let* (
9a10: 28 6c 61 73 74 2d 64 65 6c 65 74 65 2d 73 74 72  (last-delete-str
9a20: 20 28 64 62 3a 67 65 74 2d 76 61 72 20 64 62 20   (db:get-var db 
9a30: 22 44 45 4c 45 54 45 44 5f 54 45 53 54 53 22 29  "DELETED_TESTS")
9a40: 29 0a 09 20 28 6c 61 73 74 2d 64 65 6c 65 74 65  ).. (last-delete
9a50: 20 20 20 20 20 28 69 66 20 28 73 74 72 69 6e 67       (if (string
9a60: 3f 20 6c 61 73 74 2d 64 65 6c 65 74 65 2d 73 74  ? last-delete-st
9a70: 72 29 28 73 74 72 69 6e 67 2d 3e 6e 75 6d 62 65  r)(string->numbe
9a80: 72 20 6c 61 73 74 2d 64 65 6c 65 74 65 2d 73 74  r last-delete-st
9a90: 72 29 20 23 66 29 29 29 0a 20 20 20 20 28 69 66  r) #f))).    (if
9aa0: 20 28 61 6e 64 20 6c 61 73 74 2d 64 65 6c 65 74   (and last-delet
9ab0: 65 20 28 3e 20 6c 61 73 74 2d 64 65 6c 65 74 65  e (> last-delete
9ac0: 20 2a 6c 61 73 74 2d 74 65 73 74 2d 63 61 63 68   *last-test-cach
9ad0: 65 2d 64 65 6c 65 74 65 2a 29 29 0a 09 28 62 65  e-delete*))..(be
9ae0: 67 69 6e 0a 09 20 20 28 73 65 74 21 20 2a 74 65  gin..  (set! *te
9af0: 73 74 2d 69 6e 66 6f 2a 20 28 6d 61 6b 65 2d 68  st-info* (make-h
9b00: 61 73 68 2d 74 61 62 6c 65 29 29 0a 09 20 20 28  ash-table))..  (
9b10: 73 65 74 21 20 2a 74 65 73 74 2d 69 64 2d 63 61  set! *test-id-ca
9b20: 63 68 65 2a 20 28 6d 61 6b 65 2d 68 61 73 68 2d  che* (make-hash-
9b30: 74 61 62 6c 65 29 29 0a 09 20 20 28 73 65 74 21  table))..  (set!
9b40: 20 2a 6c 61 73 74 2d 74 65 73 74 2d 63 61 63 68   *last-test-cach
9b50: 65 2d 64 65 6c 65 74 65 2a 20 6c 61 73 74 2d 64  e-delete* last-d
9b60: 65 6c 65 74 65 29 0a 09 20 20 28 64 65 62 75 67  elete)..  (debug
9b70: 3a 70 72 69 6e 74 2d 69 6e 66 6f 20 34 20 22 43  :print-info 4 "C
9b80: 6c 65 61 72 69 6e 67 20 74 65 73 74 20 64 61 74  learing test dat
9b90: 61 20 63 61 63 68 65 22 29 29 29 29 0a 20 20 28  a cache")))).  (
9ba0: 69 66 20 28 6e 6f 74 20 74 65 73 74 2d 69 64 29  if (not test-id)
9bb0: 0a 20 20 20 20 20 20 28 62 65 67 69 6e 0a 09 28  .      (begin..(
9bc0: 64 65 62 75 67 3a 70 72 69 6e 74 2d 69 6e 66 6f  debug:print-info
9bd0: 20 34 20 22 64 62 3a 67 65 74 2d 74 65 73 74 2d   4 "db:get-test-
9be0: 69 6e 66 6f 2d 62 79 2d 69 64 20 63 61 6c 6c 65  info-by-id calle
9bf0: 64 20 77 69 74 68 20 74 65 73 74 2d 69 64 3d 22  d with test-id="
9c00: 20 74 65 73 74 2d 69 64 29 0a 09 23 66 29 0a 20   test-id)..#f). 
9c10: 20 20 20 20 20 28 6c 65 74 2a 20 28 28 72 65 73       (let* ((res
9c20: 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 72 65 66   (hash-table-ref
9c30: 2f 64 65 66 61 75 6c 74 20 2a 74 65 73 74 2d 69  /default *test-i
9c40: 6e 66 6f 2a 20 74 65 73 74 2d 69 64 20 23 66 29  nfo* test-id #f)
9c50: 29 29 0a 09 28 69 66 20 28 61 6e 64 20 72 65 73  ))..(if (and res
9c60: 0a 09 09 20 28 6d 65 6d 62 65 72 20 28 64 62 3a  ... (member (db:
9c70: 74 65 73 74 2d 67 65 74 2d 73 74 61 74 65 20 72  test-get-state r
9c80: 65 73 29 20 27 28 22 52 55 4e 4e 49 4e 47 22 20  es) '("RUNNING" 
9c90: 22 43 4f 4d 50 4c 45 54 45 44 22 29 29 29 0a 09  "COMPLETED")))..
9ca0: 20 20 20 20 28 64 62 3a 70 61 74 63 68 2d 74 64      (db:patch-td
9cb0: 62 2d 64 61 74 61 2d 69 6e 74 6f 2d 74 65 73 74  b-data-into-test
9cc0: 2d 69 6e 66 6f 20 64 62 20 74 65 73 74 2d 69 64  -info db test-id
9cd0: 20 72 65 73 29 0a 09 20 20 20 20 3b 3b 20 69 66   res)..    ;; if
9ce0: 20 6e 6f 20 63 61 63 68 65 64 20 76 61 6c 75 65   no cached value
9cf0: 20 74 68 65 6e 20 66 75 6c 6c 20 72 65 61 64 20   then full read 
9d00: 61 6e 64 20 77 72 69 74 65 20 74 6f 20 63 61 63  and write to cac
9d10: 68 65 0a 09 20 20 20 20 28 62 65 67 69 6e 0a 09  he..    (begin..
9d20: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a 66        (sqlite3:f
9d30: 6f 72 2d 65 61 63 68 2d 72 6f 77 0a 09 20 20 20  or-each-row..   
9d40: 20 20 20 20 28 6c 61 6d 62 64 61 20 28 69 64 20      (lambda (id 
9d50: 72 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20  run-id testname 
9d60: 73 74 61 74 65 20 73 74 61 74 75 73 20 65 76 65  state status eve
9d70: 6e 74 2d 74 69 6d 65 20 68 6f 73 74 20 63 70 75  nt-time host cpu
9d80: 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20 75 6e  load diskfree un
9d90: 61 6d 65 20 72 75 6e 64 69 72 20 69 74 65 6d 2d  ame rundir item-
9da0: 70 61 74 68 20 72 75 6e 5f 64 75 72 61 74 69 6f  path run_duratio
9db0: 6e 20 66 69 6e 61 6c 5f 6c 6f 67 66 20 63 6f 6d  n final_logf com
9dc0: 6d 65 6e 74 29 0a 09 09 20 3b 3b 20 20 20 20 20  ment)... ;;     
9dd0: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
9de0: 20 31 20 20 20 20 20 20 20 32 20 20 20 20 20 20   1       2      
9df0: 33 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20  3      4        
9e00: 35 20 20 20 20 20 20 20 36 20 20 20 20 20 20 37  5       6      7
9e10: 20 20 20 20 20 20 20 20 38 20 20 20 20 20 39 20          8     9 
9e20: 20 20 20 20 31 30 20 20 20 20 20 20 31 31 20 20      10      11  
9e30: 20 20 20 20 20 20 20 20 31 32 20 20 20 20 20 20          12      
9e40: 20 20 20 20 31 33 20 20 20 20 20 20 20 31 34 0a      13       14.
9e50: 09 09 20 28 73 65 74 21 20 72 65 73 20 28 76 65  .. (set! res (ve
9e60: 63 74 6f 72 20 69 64 20 72 75 6e 2d 69 64 20 74  ctor id run-id t
9e70: 65 73 74 6e 61 6d 65 20 73 74 61 74 65 20 73 74  estname state st
9e80: 61 74 75 73 20 65 76 65 6e 74 2d 74 69 6d 65 20  atus event-time 
9e90: 68 6f 73 74 20 63 70 75 6c 6f 61 64 20 64 69 73  host cpuload dis
9ea0: 6b 66 72 65 65 20 75 6e 61 6d 65 20 72 75 6e 64  kfree uname rund
9eb0: 69 72 20 69 74 65 6d 2d 70 61 74 68 20 72 75 6e  ir item-path run
9ec0: 5f 64 75 72 61 74 69 6f 6e 20 66 69 6e 61 6c 5f  _duration final_
9ed0: 6c 6f 67 66 20 63 6f 6d 6d 65 6e 74 29 29 29 0a  logf comment))).
9ee0: 09 20 20 20 20 20 20 20 64 62 20 0a 09 20 20 20  .       db ..   
9ef0: 20 20 20 20 22 53 45 4c 45 43 54 20 69 64 2c 72      "SELECT id,r
9f00: 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d 65 2c 73  un_id,testname,s
9f10: 74 61 74 65 2c 73 74 61 74 75 73 2c 65 76 65 6e  tate,status,even
9f20: 74 5f 74 69 6d 65 2c 68 6f 73 74 2c 63 70 75 6c  t_time,host,cpul
9f30: 6f 61 64 2c 64 69 73 6b 66 72 65 65 2c 75 6e 61  oad,diskfree,una
9f40: 6d 65 2c 72 75 6e 64 69 72 2c 69 74 65 6d 5f 70  me,rundir,item_p
9f50: 61 74 68 2c 72 75 6e 5f 64 75 72 61 74 69 6f 6e  ath,run_duration
9f60: 2c 66 69 6e 61 6c 5f 6c 6f 67 66 2c 63 6f 6d 6d  ,final_logf,comm
9f70: 65 6e 74 20 46 52 4f 4d 20 74 65 73 74 73 20 57  ent FROM tests W
9f80: 48 45 52 45 20 69 64 3d 3f 3b 22 0a 09 20 20 20  HERE id=?;"..   
9f90: 20 20 20 20 74 65 73 74 2d 69 64 29 0a 09 20 20      test-id)..  
9fa0: 20 20 20 20 28 69 66 20 72 65 73 20 28 64 62 3a      (if res (db:
9fb0: 70 61 74 63 68 2d 74 64 62 2d 64 61 74 61 2d 69  patch-tdb-data-i
9fc0: 6e 74 6f 2d 74 65 73 74 2d 69 6e 66 6f 20 64 62  nto-test-info db
9fd0: 20 74 65 73 74 2d 69 64 20 72 65 73 29 29 0a 09   test-id res))..
9fe0: 20 20 20 20 20 20 72 65 73 29 29 29 29 29 0a 0a        res)))))..
9ff0: 3b 3b 20 47 65 74 20 74 65 73 74 20 64 61 74 61  ;; Get test data
a000: 20 75 73 69 6e 67 20 74 65 73 74 5f 69 64 0a 28   using test_id.(
a010: 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d 74  define (db:get-t
a020: 65 73 74 2d 69 6e 66 6f 2d 6e 6f 74 2d 63 61 63  est-info-not-cac
a030: 68 65 64 2d 62 79 2d 69 64 20 64 62 20 74 65 73  hed-by-id db tes
a040: 74 2d 69 64 29 0a 20 20 28 69 66 20 28 6e 6f 74  t-id).  (if (not
a050: 20 74 65 73 74 2d 69 64 29 0a 20 20 20 20 20 20   test-id).      
a060: 28 62 65 67 69 6e 0a 09 28 64 65 62 75 67 3a 70  (begin..(debug:p
a070: 72 69 6e 74 2d 69 6e 66 6f 20 34 20 22 64 62 3a  rint-info 4 "db:
a080: 67 65 74 2d 74 65 73 74 2d 69 6e 66 6f 2d 62 79  get-test-info-by
a090: 2d 69 64 20 63 61 6c 6c 65 64 20 77 69 74 68 20  -id called with 
a0a0: 74 65 73 74 2d 69 64 3d 22 20 74 65 73 74 2d 69  test-id=" test-i
a0b0: 64 29 0a 09 23 66 29 0a 20 20 20 20 20 20 28 6c  d)..#f).      (l
a0c0: 65 74 20 28 28 72 65 73 20 23 66 29 29 0a 09 28  et ((res #f))..(
a0d0: 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68  sqlite3:for-each
a0e0: 2d 72 6f 77 0a 09 20 28 6c 61 6d 62 64 61 20 28  -row.. (lambda (
a0f0: 69 64 20 72 75 6e 2d 69 64 20 74 65 73 74 6e 61  id run-id testna
a100: 6d 65 20 73 74 61 74 65 20 73 74 61 74 75 73 20  me state status 
a110: 65 76 65 6e 74 2d 74 69 6d 65 20 68 6f 73 74 20  event-time host 
a120: 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65  cpuload diskfree
a130: 20 75 6e 61 6d 65 20 72 75 6e 64 69 72 20 69 74   uname rundir it
a140: 65 6d 2d 70 61 74 68 20 72 75 6e 5f 64 75 72 61  em-path run_dura
a150: 74 69 6f 6e 20 66 69 6e 61 6c 5f 6c 6f 67 66 20  tion final_logf 
a160: 63 6f 6d 6d 65 6e 74 29 0a 09 20 20 20 3b 3b 20  comment)..   ;; 
a170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a180: 30 20 20 20 20 31 20 20 20 20 20 20 20 32 20 20  0    1       2  
a190: 20 20 20 20 33 20 20 20 20 20 20 34 20 20 20 20      3      4    
a1a0: 20 20 20 20 35 20 20 20 20 20 20 20 36 20 20 20      5       6   
a1b0: 20 20 20 37 20 20 20 20 20 20 20 20 38 20 20 20     7        8   
a1c0: 20 20 39 20 20 20 20 20 31 30 20 20 20 20 20 20    9     10      
a1d0: 31 31 20 20 20 20 20 20 20 20 20 20 31 32 20 20  11          12  
a1e0: 20 20 20 20 20 20 20 20 31 33 20 20 20 20 20 20          13      
a1f0: 20 31 34 0a 09 20 20 20 28 73 65 74 21 20 72 65   14..   (set! re
a200: 73 20 28 76 65 63 74 6f 72 20 69 64 20 72 75 6e  s (vector id run
a210: 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 73 74 61  -id testname sta
a220: 74 65 20 73 74 61 74 75 73 20 65 76 65 6e 74 2d  te status event-
a230: 74 69 6d 65 20 68 6f 73 74 20 63 70 75 6c 6f 61  time host cpuloa
a240: 64 20 64 69 73 6b 66 72 65 65 20 75 6e 61 6d 65  d diskfree uname
a250: 20 72 75 6e 64 69 72 20 69 74 65 6d 2d 70 61 74   rundir item-pat
a260: 68 20 72 75 6e 5f 64 75 72 61 74 69 6f 6e 20 66  h run_duration f
a270: 69 6e 61 6c 5f 6c 6f 67 66 20 63 6f 6d 6d 65 6e  inal_logf commen
a280: 74 29 29 29 0a 09 20 64 62 20 0a 09 20 22 53 45  t))).. db .. "SE
a290: 4c 45 43 54 20 69 64 2c 72 75 6e 5f 69 64 2c 74  LECT id,run_id,t
a2a0: 65 73 74 6e 61 6d 65 2c 73 74 61 74 65 2c 73 74  estname,state,st
a2b0: 61 74 75 73 2c 65 76 65 6e 74 5f 74 69 6d 65 2c  atus,event_time,
a2c0: 68 6f 73 74 2c 63 70 75 6c 6f 61 64 2c 64 69 73  host,cpuload,dis
a2d0: 6b 66 72 65 65 2c 75 6e 61 6d 65 2c 72 75 6e 64  kfree,uname,rund
a2e0: 69 72 2c 69 74 65 6d 5f 70 61 74 68 2c 72 75 6e  ir,item_path,run
a2f0: 5f 64 75 72 61 74 69 6f 6e 2c 66 69 6e 61 6c 5f  _duration,final_
a300: 6c 6f 67 66 2c 63 6f 6d 6d 65 6e 74 20 46 52 4f  logf,comment FRO
a310: 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 69 64  M tests WHERE id
a320: 3d 3f 3b 22 0a 09 20 74 65 73 74 2d 69 64 29 0a  =?;".. test-id).
a330: 09 72 65 73 29 29 29 0a 0a 28 64 65 66 69 6e 65  .res)))..(define
a340: 20 64 62 3a 67 65 74 2d 74 65 73 74 2d 69 6e 66   db:get-test-inf
a350: 6f 2d 62 79 2d 69 64 20 64 62 3a 67 65 74 2d 74  o-by-id db:get-t
a360: 65 73 74 2d 69 6e 66 6f 2d 6e 6f 74 2d 63 61 63  est-info-not-cac
a370: 68 65 64 2d 62 79 2d 69 64 29 0a 0a 28 64 65 66  hed-by-id)..(def
a380: 69 6e 65 20 28 64 62 3a 67 65 74 2d 74 65 73 74  ine (db:get-test
a390: 2d 69 6e 66 6f 20 64 62 20 72 75 6e 2d 69 64 20  -info db run-id 
a3a0: 74 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d 70 61  testname item-pa
a3b0: 74 68 29 0a 20 20 28 64 62 3a 67 65 74 2d 74 65  th).  (db:get-te
a3c0: 73 74 2d 69 6e 66 6f 2d 62 79 2d 69 64 20 64 62  st-info-by-id db
a3d0: 20 28 64 62 3a 67 65 74 2d 74 65 73 74 2d 69 64   (db:get-test-id
a3e0: 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 6e   db run-id testn
a3f0: 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 29 29  ame item-path)))
a400: 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65  ..(define (db:te
a410: 73 74 2d 73 65 74 2d 63 6f 6d 6d 65 6e 74 20 64  st-set-comment d
a420: 62 20 74 65 73 74 2d 69 64 20 63 6f 6d 6d 65 6e  b test-id commen
a430: 74 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78  t).  (sqlite3:ex
a440: 65 63 75 74 65 20 0a 20 20 20 64 62 20 0a 20 20  ecute .   db .  
a450: 20 22 55 50 44 41 54 45 20 74 65 73 74 73 20 53   "UPDATE tests S
a460: 45 54 20 63 6f 6d 6d 65 6e 74 3d 3f 20 57 48 45  ET comment=? WHE
a470: 52 45 20 69 64 3d 3f 3b 22 0a 20 20 20 63 6f 6d  RE id=?;".   com
a480: 6d 65 6e 74 20 74 65 73 74 2d 69 64 29 29 0a 0a  ment test-id))..
a490: 3b 3b 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 74  ;;.(define (db:t
a4a0: 65 73 74 2d 73 65 74 2d 72 75 6e 64 69 72 21 20  est-set-rundir! 
a4b0: 64 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e  db run-id test-n
a4c0: 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 72 75  ame item-path ru
a4d0: 6e 64 69 72 29 0a 20 20 28 73 71 6c 69 74 65 33  ndir).  (sqlite3
a4e0: 3a 65 78 65 63 75 74 65 20 0a 20 20 20 64 62 20  :execute .   db 
a4f0: 0a 20 20 20 22 55 50 44 41 54 45 20 74 65 73 74  .   "UPDATE test
a500: 73 20 53 45 54 20 72 75 6e 64 69 72 3d 3f 20 57  s SET rundir=? W
a510: 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e  HERE run_id=? AN
a520: 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44  D testname=? AND
a530: 20 69 74 65 6d 5f 70 61 74 68 3d 3f 3b 22 0a 20   item_path=?;". 
a540: 20 20 72 75 6e 64 69 72 20 72 75 6e 2d 69 64 20    rundir run-id 
a550: 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70  test-name item-p
a560: 61 74 68 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  ath))..(define (
a570: 64 62 3a 74 65 73 74 2d 73 65 74 2d 72 75 6e 64  db:test-set-rund
a580: 69 72 2d 62 79 2d 74 65 73 74 2d 69 64 21 20 64  ir-by-test-id! d
a590: 62 20 74 65 73 74 2d 69 64 20 72 75 6e 64 69 72  b test-id rundir
a5a0: 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65  ).  (sqlite3:exe
a5b0: 63 75 74 65 20 0a 20 20 20 64 62 20 0a 20 20 20  cute .   db .   
a5c0: 22 55 50 44 41 54 45 20 74 65 73 74 73 20 53 45  "UPDATE tests SE
a5d0: 54 20 72 75 6e 64 69 72 3d 3f 20 57 48 45 52 45  T rundir=? WHERE
a5e0: 20 69 64 3d 3f 22 0a 20 20 20 72 75 6e 64 69 72   id=?".   rundir
a5f0: 20 74 65 73 74 2d 69 64 29 29 0a 0a 3b 3b 20 0a   test-id))..;; .
a600: 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74  (define (db:test
a610: 2d 67 65 74 2d 72 75 6e 64 69 72 2d 66 72 6f 6d  -get-rundir-from
a620: 2d 74 65 73 74 2d 69 64 20 64 62 20 74 65 73 74  -test-id db test
a630: 2d 69 64 29 0a 20 20 28 6c 65 74 20 28 28 72 65  -id).  (let ((re
a640: 73 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 72 65  s (hash-table-re
a650: 66 2f 64 65 66 61 75 6c 74 20 2a 74 65 73 74 2d  f/default *test-
a660: 70 61 74 68 73 2a 20 74 65 73 74 2d 69 64 20 23  paths* test-id #
a670: 66 29 29 29 0a 20 20 20 20 28 69 66 20 72 65 73  f))).    (if res
a680: 0a 09 72 65 73 0a 09 28 62 65 67 69 6e 0a 09 20  ..res..(begin.. 
a690: 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d 65 61   (sqlite3:for-ea
a6a0: 63 68 2d 72 6f 77 0a 09 20 20 20 28 6c 61 6d 62  ch-row..   (lamb
a6b0: 64 61 20 28 74 70 61 74 68 29 0a 09 20 20 20 20  da (tpath)..    
a6c0: 20 28 73 65 74 21 20 72 65 73 20 74 70 61 74 68   (set! res tpath
a6d0: 29 29 0a 09 20 20 20 64 62 20 0a 09 20 20 20 22  ))..   db ..   "
a6e0: 53 45 4c 45 43 54 20 72 75 6e 64 69 72 20 46 52  SELECT rundir FR
a6f0: 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 69  OM tests WHERE i
a700: 64 3d 3f 3b 22 0a 09 20 20 20 74 65 73 74 2d 69  d=?;"..   test-i
a710: 64 29 0a 09 20 20 28 68 61 73 68 2d 74 61 62 6c  d)..  (hash-tabl
a720: 65 2d 73 65 74 21 20 2a 74 65 73 74 2d 70 61 74  e-set! *test-pat
a730: 68 73 2a 20 74 65 73 74 2d 69 64 20 72 65 73 29  hs* test-id res)
a740: 0a 09 20 20 72 65 73 29 29 29 29 0a 0a 28 64 65  ..  res))))..(de
a750: 66 69 6e 65 20 28 64 62 3a 74 65 73 74 2d 73 65  fine (db:test-se
a760: 74 2d 6c 6f 67 21 20 64 62 20 74 65 73 74 2d 69  t-log! db test-i
a770: 64 20 6c 6f 67 66 29 0a 20 20 28 69 66 20 28 73  d logf).  (if (s
a780: 74 72 69 6e 67 3f 20 6c 6f 67 66 29 0a 20 20 20  tring? logf).   
a790: 20 20 20 28 73 71 6c 69 74 65 33 3a 65 78 65 63     (sqlite3:exec
a7a0: 75 74 65 20 64 62 20 22 55 50 44 41 54 45 20 74  ute db "UPDATE t
a7b0: 65 73 74 73 20 53 45 54 20 66 69 6e 61 6c 5f 6c  ests SET final_l
a7c0: 6f 67 66 3d 3f 20 57 48 45 52 45 20 69 64 3d 3f  ogf=? WHERE id=?
a7d0: 3b 22 0a 09 09 20 20 20 20 20 20 20 6c 6f 67 66  ;"...       logf
a7e0: 20 74 65 73 74 2d 69 64 29 0a 20 20 20 20 20 20   test-id).      
a7f0: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 30 20 22  (debug:print 0 "
a800: 45 52 52 4f 52 3a 20 64 62 3a 74 65 73 74 2d 73  ERROR: db:test-s
a810: 65 74 2d 6c 6f 67 21 20 63 61 6c 6c 65 64 20 77  et-log! called w
a820: 69 74 68 20 6e 6f 6e 2d 73 74 72 69 6e 67 20 6c  ith non-string l
a830: 6f 67 20 66 69 6c 65 20 6e 61 6d 65 20 22 20 6c  og file name " l
a840: 6f 67 66 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d  ogf)))..;;======
a850: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
a860: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
a870: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
a880: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
a890: 0a 3b 3b 20 4d 69 73 63 2e 20 74 65 73 74 20 72  .;; Misc. test r
a8a0: 65 6c 61 74 65 64 20 71 75 65 72 69 65 73 0a 3b  elated queries.;
a8b0: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;===============
a8c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
a8d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
a8e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
a8f0: 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65 66 69 6e 65  =======..(define
a900: 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 70 61   (db:test-get-pa
a910: 74 68 73 2d 6d 61 74 63 68 69 6e 67 20 64 62 20  ths-matching db 
a920: 6b 65 79 6e 61 6d 65 73 20 74 61 72 67 65 74 20  keynames target 
a930: 66 6e 61 6d 65 70 61 74 74 20 23 21 6b 65 79 20  fnamepatt #!key 
a940: 28 72 65 73 20 27 28 29 29 29 0a 20 20 28 6c 65  (res '())).  (le
a950: 74 2a 20 28 28 74 65 73 74 70 61 74 74 20 20 20  t* ((testpatt   
a960: 28 69 66 20 28 61 72 67 73 3a 67 65 74 2d 61 72  (if (args:get-ar
a970: 67 20 22 2d 74 65 73 74 70 61 74 74 22 29 28 61  g "-testpatt")(a
a980: 72 67 73 3a 67 65 74 2d 61 72 67 20 22 2d 74 65  rgs:get-arg "-te
a990: 73 74 70 61 74 74 22 29 20 22 25 22 29 29 0a 09  stpatt") "%"))..
a9a0: 20 28 73 74 61 74 65 70 61 74 74 20 20 28 69 66   (statepatt  (if
a9b0: 20 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22   (args:get-arg "
a9c0: 3a 73 74 61 74 65 22 29 20 20 20 28 61 72 67 73  :state")   (args
a9d0: 3a 67 65 74 2d 61 72 67 20 22 3a 73 74 61 74 65  :get-arg ":state
a9e0: 22 29 20 20 20 20 22 25 22 29 29 0a 09 20 28 73  ")    "%")).. (s
a9f0: 74 61 74 75 73 70 61 74 74 20 28 69 66 20 28 61  tatuspatt (if (a
aa00: 72 67 73 3a 67 65 74 2d 61 72 67 20 22 3a 73 74  rgs:get-arg ":st
aa10: 61 74 75 73 22 29 20 20 28 61 72 67 73 3a 67 65  atus")  (args:ge
aa20: 74 2d 61 72 67 20 22 3a 73 74 61 74 75 73 22 29  t-arg ":status")
aa30: 20 20 20 22 25 22 29 29 0a 09 20 28 72 75 6e 6e     "%")).. (runn
aa40: 61 6d 65 20 20 20 20 28 69 66 20 28 61 72 67 73  ame    (if (args
aa50: 3a 67 65 74 2d 61 72 67 20 22 3a 72 75 6e 6e 61  :get-arg ":runna
aa60: 6d 65 22 29 20 28 61 72 67 73 3a 67 65 74 2d 61  me") (args:get-a
aa70: 72 67 20 22 3a 72 75 6e 6e 61 6d 65 22 29 20 20  rg ":runname")  
aa80: 22 25 22 29 29 0a 09 20 28 6b 65 79 73 74 72 20  "%")).. (keystr 
aa90: 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65  (string-interspe
aaa0: 72 73 65 20 0a 09 09 20 20 28 6d 61 70 20 28 6c  rse ...  (map (l
aab0: 61 6d 62 64 61 20 28 6b 65 79 20 76 61 6c 29 0a  ambda (key val).
aac0: 09 09 09 20 28 63 6f 6e 63 20 22 72 2e 22 20 6b  ... (conc "r." k
aad0: 65 79 20 22 20 6c 69 6b 65 20 27 22 20 76 61 6c  ey " like '" val
aae0: 20 22 27 22 29 29 0a 09 09 20 20 20 20 20 20 20   "'"))...       
aaf0: 6b 65 79 6e 61 6d 65 73 20 0a 09 09 20 20 20 20  keynames ...    
ab00: 20 20 20 28 73 74 72 69 6e 67 2d 73 70 6c 69 74     (string-split
ab10: 20 74 61 72 67 65 74 20 22 2f 22 29 29 0a 09 09   target "/"))...
ab20: 20 20 22 20 41 4e 44 20 22 29 29 0a 09 20 28 74    " AND ")).. (t
ab30: 65 73 74 71 72 79 20 28 74 65 73 74 73 3a 6d 61  estqry (tests:ma
ab40: 74 63 68 2d 3e 73 71 6c 71 72 79 20 74 65 73 74  tch->sqlqry test
ab50: 70 61 74 74 29 29 0a 09 20 28 71 72 79 73 74 72  patt)).. (qrystr
ab60: 20 28 63 6f 6e 63 20 22 53 45 4c 45 43 54 20 74   (conc "SELECT t
ab70: 2e 72 75 6e 64 69 72 20 46 52 4f 4d 20 74 65 73  .rundir FROM tes
ab80: 74 73 20 41 53 20 74 20 49 4e 4e 45 52 20 4a 4f  ts AS t INNER JO
ab90: 49 4e 20 72 75 6e 73 20 41 53 20 72 20 4f 4e 20  IN runs AS r ON 
aba0: 74 2e 72 75 6e 5f 69 64 3d 72 2e 69 64 20 57 48  t.run_id=r.id WH
abb0: 45 52 45 20 22 0a 09 09 20 20 20 20 20 20 20 6b  ERE "...       k
abc0: 65 79 73 74 72 20 22 20 41 4e 44 20 72 2e 72 75  eystr " AND r.ru
abd0: 6e 6e 61 6d 65 20 4c 49 4b 45 20 27 22 20 72 75  nname LIKE '" ru
abe0: 6e 6e 61 6d 65 20 22 27 20 41 4e 44 20 22 20 74  nname "' AND " t
abf0: 65 73 74 71 72 79 0a 09 09 20 20 20 20 20 20 20  estqry...       
ac00: 22 20 41 4e 44 20 74 2e 73 74 61 74 65 20 4c 49  " AND t.state LI
ac10: 4b 45 20 27 22 20 73 74 61 74 65 70 61 74 74 20  KE '" statepatt 
ac20: 22 27 20 41 4e 44 20 74 2e 73 74 61 74 75 73 20  "' AND t.status 
ac30: 4c 49 4b 45 20 27 22 20 73 74 61 74 75 73 70 61  LIKE '" statuspa
ac40: 74 74 20 0a 09 09 20 20 20 20 20 20 20 22 27 20  tt ...       "' 
ac50: 4f 52 44 45 52 20 42 59 20 74 2e 65 76 65 6e 74  ORDER BY t.event
ac60: 5f 74 69 6d 65 20 41 53 43 3b 22 29 29 29 0a 20  _time ASC;"))). 
ac70: 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20     (debug:print 
ac80: 33 20 22 71 72 79 73 74 72 3a 20 22 20 71 72 79  3 "qrystr: " qry
ac90: 73 74 72 29 0a 20 20 20 20 28 73 71 6c 69 74 65  str).    (sqlite
aca0: 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20 0a  3:for-each-row .
acb0: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 70 29       (lambda (p)
acc0: 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72 65  .       (set! re
acd0: 73 20 28 63 6f 6e 73 20 70 20 72 65 73 29 29 29  s (cons p res)))
ace0: 0a 20 20 20 20 20 64 62 20 0a 20 20 20 20 20 71  .     db .     q
acf0: 72 79 73 74 72 29 0a 20 20 20 20 28 69 66 20 66  rystr).    (if f
ad00: 6e 61 6d 65 70 61 74 74 0a 09 28 61 70 70 6c 79  namepatt..(apply
ad10: 20 61 70 70 65 6e 64 20 0a 09 20 20 20 20 20 20   append ..      
ad20: 20 28 6d 61 70 20 28 6c 61 6d 62 64 61 20 28 70   (map (lambda (p
ad30: 29 0a 09 09 20 20 20 20 20 20 28 67 6c 6f 62 20  )...      (glob 
ad40: 28 63 6f 6e 63 20 70 20 22 2f 22 20 66 6e 61 6d  (conc p "/" fnam
ad50: 65 70 61 74 74 29 29 29 0a 09 09 20 20 20 20 72  epatt)))...    r
ad60: 65 73 29 29 0a 09 72 65 73 29 29 29 0a 0a 3b 3b  es))..res)))..;;
ad70: 20 6c 6f 6f 6b 20 74 68 72 6f 75 67 68 20 74 65   look through te
ad80: 73 74 73 20 66 72 6f 6d 20 6d 61 74 63 68 69 6e  sts from matchin
ad90: 67 20 72 75 6e 73 20 66 6f 72 20 61 20 66 69 6c  g runs for a fil
ada0: 65 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65  e.(define (db:te
adb0: 73 74 2d 67 65 74 2d 66 69 72 73 74 2d 70 61 74  st-get-first-pat
adc0: 68 2d 6d 61 74 63 68 69 6e 67 20 64 62 20 6b 65  h-matching db ke
add0: 79 6e 61 6d 65 73 20 74 61 72 67 65 74 20 66 6e  ynames target fn
ade0: 61 6d 65 29 0a 20 20 3b 3b 20 5b 72 65 66 70 61  ame).  ;; [refpa
adf0: 74 68 73 5d 20 69 73 20 74 68 65 20 73 65 63 74  ths] is the sect
ae00: 69 6f 6e 20 77 68 65 72 65 20 72 65 66 65 72 65  ion where refere
ae10: 6e 63 65 73 20 74 6f 20 6f 74 68 65 72 20 6d 65  nces to other me
ae20: 67 61 74 65 73 74 20 64 61 74 61 62 61 73 65 73  gatest databases
ae30: 20 61 72 65 20 73 74 6f 72 65 64 0a 20 20 28 6c   are stored.  (l
ae40: 65 74 20 28 28 6d 74 2d 70 61 74 68 73 20 28 63  et ((mt-paths (c
ae50: 6f 6e 66 69 67 66 3a 67 65 74 2d 73 65 63 74 69  onfigf:get-secti
ae60: 6f 6e 20 22 72 65 66 70 61 74 68 73 22 29 29 0a  on "refpaths")).
ae70: 09 28 72 65 73 20 20 20 20 20 20 20 28 64 62 3a  .(res       (db:
ae80: 74 65 73 74 2d 67 65 74 2d 70 61 74 68 73 2d 6d  test-get-paths-m
ae90: 61 74 63 68 69 6e 67 20 64 62 20 6b 65 79 6e 61  atching db keyna
aea0: 6d 65 73 20 74 61 72 67 65 74 20 66 6e 61 6d 65  mes target fname
aeb0: 29 29 29 0a 20 20 20 20 28 6c 65 74 20 6c 6f 6f  ))).    (let loo
aec0: 70 20 28 28 70 61 74 68 64 61 74 20 28 69 66 20  p ((pathdat (if 
aed0: 28 6e 75 6c 6c 3f 20 70 61 74 68 73 29 20 23 66  (null? paths) #f
aee0: 20 28 63 61 72 20 6d 74 2d 70 61 74 68 73 29 29   (car mt-paths))
aef0: 29 0a 09 20 20 20 20 20 20 20 28 74 61 6c 20 20  )..       (tal  
af00: 20 20 20 28 69 66 20 28 6e 75 6c 6c 3f 20 70 61     (if (null? pa
af10: 74 68 73 29 20 27 28 29 28 63 64 72 20 6d 74 2d  ths) '()(cdr mt-
af20: 70 61 74 68 73 29 29 29 29 0a 20 20 20 20 20 20  paths)))).      
af30: 28 69 66 20 28 6e 6f 74 20 28 6e 75 6c 6c 3f 20  (if (not (null? 
af40: 72 65 73 29 29 0a 09 20 20 28 63 61 72 20 72 65  res))..  (car re
af50: 73 29 20 3b 3b 20 72 65 74 75 72 6e 20 66 69 72  s) ;; return fir
af60: 73 74 20 66 6f 75 6e 64 0a 09 20 20 28 69 66 20  st found..  (if 
af70: 70 61 74 68 0a 09 20 20 20 20 20 20 28 6c 65 74  path..      (let
af80: 2a 20 28 28 64 62 20 20 20 20 20 28 6f 70 65 6e  * ((db     (open
af90: 2d 64 62 20 70 61 74 68 3a 20 28 63 61 64 72 20  -db path: (cadr 
afa0: 70 61 74 68 64 61 74 29 29 29 0a 09 09 20 20 20  pathdat)))...   
afb0: 20 20 28 6e 65 77 72 65 73 20 28 64 62 3a 74 65    (newres (db:te
afc0: 73 74 2d 67 65 74 2d 70 61 74 68 73 2d 6d 61 74  st-get-paths-mat
afd0: 63 68 69 6e 67 20 64 62 20 6b 65 79 6e 61 6d 65  ching db keyname
afe0: 73 20 74 61 72 67 65 74 20 66 6e 61 6d 65 29 29  s target fname))
aff0: 29 0a 09 09 28 64 65 62 75 67 3a 70 72 69 6e 74  )...(debug:print
b000: 2d 69 6e 66 6f 20 34 20 22 54 72 79 69 6e 67 20  -info 4 "Trying 
b010: 22 20 28 63 61 72 20 70 61 74 68 64 61 74 29 20  " (car pathdat) 
b020: 22 20 61 74 20 22 20 28 63 61 64 72 20 70 61 74  " at " (cadr pat
b030: 68 64 61 74 29 29 0a 09 09 28 73 71 6c 69 74 65  hdat))...(sqlite
b040: 33 3a 66 69 6e 61 6c 69 7a 65 21 20 64 62 29 0a  3:finalize! db).
b050: 09 09 28 69 66 20 28 6e 6f 74 20 28 6e 75 6c 6c  ..(if (not (null
b060: 3f 20 6e 65 77 72 65 73 29 29 0a 09 09 20 20 20  ? newres))...   
b070: 20 28 63 61 72 20 6e 65 77 72 65 73 29 0a 09 09   (car newres)...
b080: 20 20 20 20 28 69 66 20 28 6e 75 6c 6c 3f 20 74      (if (null? t
b090: 61 6c 29 0a 09 09 09 23 66 0a 09 09 09 28 6c 6f  al)....#f....(lo
b0a0: 6f 70 20 28 63 61 72 20 74 61 6c 29 28 63 64 72  op (car tal)(cdr
b0b0: 20 74 61 6c 29 29 29 29 29 29 29 29 29 29 0a 0a   tal))))))))))..
b0c0: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73  .(define (db:tes
b0d0: 74 2d 67 65 74 2d 74 65 73 74 2d 72 65 63 6f 72  t-get-test-recor
b0e0: 64 73 2d 6d 61 74 63 68 69 6e 67 20 64 62 20 6b  ds-matching db k
b0f0: 65 79 6e 61 6d 65 73 20 74 61 72 67 65 74 29 0a  eynames target).
b100: 20 20 28 6c 65 74 2a 20 28 28 72 65 73 20 27 28    (let* ((res '(
b110: 29 29 0a 09 20 28 69 74 65 6d 70 61 74 74 20 20  )).. (itempatt  
b120: 20 28 69 66 20 28 61 72 67 73 3a 67 65 74 2d 61   (if (args:get-a
b130: 72 67 20 22 2d 69 74 65 6d 70 61 74 74 22 29 28  rg "-itempatt")(
b140: 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22 2d 69  args:get-arg "-i
b150: 74 65 6d 70 61 74 74 22 29 20 22 25 22 29 29 0a  tempatt") "%")).
b160: 09 20 28 74 65 73 74 70 61 74 74 20 20 20 28 69  . (testpatt   (i
b170: 66 20 28 61 72 67 73 3a 67 65 74 2d 61 72 67 20  f (args:get-arg 
b180: 22 2d 74 65 73 74 70 61 74 74 22 29 28 61 72 67  "-testpatt")(arg
b190: 73 3a 67 65 74 2d 61 72 67 20 22 2d 74 65 73 74  s:get-arg "-test
b1a0: 70 61 74 74 22 29 20 22 25 22 29 29 0a 09 20 28  patt") "%")).. (
b1b0: 73 74 61 74 65 70 61 74 74 20 20 28 69 66 20 28  statepatt  (if (
b1c0: 61 72 67 73 3a 67 65 74 2d 61 72 67 20 22 3a 73  args:get-arg ":s
b1d0: 74 61 74 65 22 29 20 20 20 28 61 72 67 73 3a 67  tate")   (args:g
b1e0: 65 74 2d 61 72 67 20 22 3a 73 74 61 74 65 22 29  et-arg ":state")
b1f0: 20 20 20 20 22 25 22 29 29 0a 09 20 28 73 74 61      "%")).. (sta
b200: 74 75 73 70 61 74 74 20 28 69 66 20 28 61 72 67  tuspatt (if (arg
b210: 73 3a 67 65 74 2d 61 72 67 20 22 3a 73 74 61 74  s:get-arg ":stat
b220: 75 73 22 29 20 20 28 61 72 67 73 3a 67 65 74 2d  us")  (args:get-
b230: 61 72 67 20 22 3a 73 74 61 74 75 73 22 29 20 20  arg ":status")  
b240: 20 22 25 22 29 29 0a 09 20 28 72 75 6e 6e 61 6d   "%")).. (runnam
b250: 65 20 20 20 20 28 69 66 20 28 61 72 67 73 3a 67  e    (if (args:g
b260: 65 74 2d 61 72 67 20 22 3a 72 75 6e 6e 61 6d 65  et-arg ":runname
b270: 22 29 20 28 61 72 67 73 3a 67 65 74 2d 61 72 67  ") (args:get-arg
b280: 20 22 3a 72 75 6e 6e 61 6d 65 22 29 20 20 22 25   ":runname")  "%
b290: 22 29 29 0a 09 20 28 6b 65 79 73 74 72 20 28 73  ")).. (keystr (s
b2a0: 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73  tring-interspers
b2b0: 65 20 0a 09 09 20 20 28 6d 61 70 20 28 6c 61 6d  e ...  (map (lam
b2c0: 62 64 61 20 28 6b 65 79 20 76 61 6c 29 0a 09 09  bda (key val)...
b2d0: 09 20 28 63 6f 6e 63 20 22 72 2e 22 20 6b 65 79  . (conc "r." key
b2e0: 20 22 20 6c 69 6b 65 20 27 22 20 76 61 6c 20 22   " like '" val "
b2f0: 27 22 29 29 0a 09 09 20 20 20 20 20 20 20 6b 65  '"))...       ke
b300: 79 6e 61 6d 65 73 20 0a 09 09 20 20 20 20 20 20  ynames ...      
b310: 20 28 73 74 72 69 6e 67 2d 73 70 6c 69 74 20 74   (string-split t
b320: 61 72 67 65 74 20 22 2f 22 29 29 0a 09 09 20 20  arget "/"))...  
b330: 22 20 41 4e 44 20 22 29 29 0a 09 20 28 71 72 79  " AND ")).. (qry
b340: 73 74 72 20 28 63 6f 6e 63 20 22 53 45 4c 45 43  str (conc "SELEC
b350: 54 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  T .             
b360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
b370: 2e 69 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  .id.            
b380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b390: 74 2e 72 75 6e 5f 69 64 20 20 20 20 20 0a 20 20  t.run_id     .  
b3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3b0: 20 20 20 20 20 20 20 20 20 20 74 2e 74 65 73 74            t.test
b3c0: 6e 61 6d 65 20 20 20 0a 20 20 20 20 20 20 20 20  name   .        
b3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b3e0: 20 20 20 20 74 2e 68 6f 73 74 20 20 20 20 20 20      t.host      
b3f0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
b400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 2e                t.
b410: 63 70 75 6c 6f 61 64 20 20 20 20 0a 20 20 20 20  cpuload    .    
b420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b430: 20 20 20 20 20 20 20 20 74 2e 64 69 73 6b 66 72          t.diskfr
b440: 65 65 20 20 20 0a 20 20 20 20 20 20 20 20 20 20  ee   .          
b450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b460: 20 20 74 2e 75 6e 61 6d 65 20 20 20 20 20 20 0a    t.uname      .
b470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b480: 20 20 20 20 20 20 20 20 20 20 20 20 74 2e 72 75              t.ru
b490: 6e 64 69 72 20 20 20 20 20 0a 20 20 20 20 20 20  ndir     .      
b4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4b0: 20 20 20 20 20 20 74 2e 73 68 6f 72 74 64 69 72        t.shortdir
b4c0: 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20     .            
b4d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b4e0: 74 2e 69 74 65 6d 5f 70 61 74 68 20 20 0a 20 20  t.item_path  .  
b4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b500: 20 20 20 20 20 20 20 20 20 20 74 2e 73 74 61 74            t.stat
b510: 65 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20  e      .        
b520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b530: 20 20 20 20 74 2e 73 74 61 74 75 73 20 20 20 20      t.status    
b540: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
b550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 2e                t.
b560: 61 74 74 65 6d 70 74 6e 75 6d 20 0a 20 20 20 20  attemptnum .    
b570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b580: 20 20 20 20 20 20 20 20 74 2e 66 69 6e 61 6c 5f          t.final_
b590: 6c 6f 67 66 20 0a 20 20 20 20 20 20 20 20 20 20  logf .          
b5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5b0: 20 20 74 2e 6c 6f 67 64 61 74 20 20 20 20 20 0a    t.logdat     .
b5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b5d0: 20 20 20 20 20 20 20 20 20 20 20 20 74 2e 72 75              t.ru
b5e0: 6e 5f 64 75 72 61 74 69 6f 0a 20 20 20 20 20 20  n_duratio.      
b5f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b600: 20 20 20 20 20 20 74 2e 63 6f 6d 6d 65 6e 74 20        t.comment 
b610: 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20 20     .            
b620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b630: 74 2e 65 76 65 6e 74 5f 74 69 6d 65 20 0a 20 20  t.event_time .  
b640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b650: 20 20 20 20 20 20 20 20 20 20 74 2e 66 61 69 6c            t.fail
b660: 5f 63 6f 75 6e 74 20 0a 20 20 20 20 20 20 20 20  _count .        
b670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b680: 20 20 20 20 74 2e 70 61 73 73 5f 63 6f 75 6e 74      t.pass_count
b690: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
b6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 2e                t.
b6b0: 61 72 63 68 69 76 65 64 20 20 20 0a 20 20 20 20  archived   .    
b6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6d0: 20 20 20 20 20 20 20 46 52 4f 4d 20 74 65 73 74         FROM test
b6e0: 73 20 41 53 20 74 20 49 4e 4e 45 52 20 4a 4f 49  s AS t INNER JOI
b6f0: 4e 20 72 75 6e 73 20 41 53 20 72 20 4f 4e 20 74  N runs AS r ON t
b700: 2e 72 75 6e 5f 69 64 3d 72 2e 69 64 20 57 48 45  .run_id=r.id WHE
b710: 52 45 20 22 0a 09 09 20 20 20 20 20 20 20 6b 65  RE "...       ke
b720: 79 73 74 72 20 22 20 41 4e 44 20 72 2e 72 75 6e  ystr " AND r.run
b730: 6e 61 6d 65 20 4c 49 4b 45 20 27 22 20 72 75 6e  name LIKE '" run
b740: 6e 61 6d 65 20 22 27 20 41 4e 44 20 69 74 65 6d  name "' AND item
b750: 5f 70 61 74 68 20 4c 49 4b 45 20 27 22 20 69 74  _path LIKE '" it
b760: 65 6d 70 61 74 74 20 22 27 20 41 4e 44 20 74 65  empatt "' AND te
b770: 73 74 6e 61 6d 65 20 4c 49 4b 45 20 27 22 0a 09  stname LIKE '"..
b780: 09 20 20 20 20 20 20 20 74 65 73 74 70 61 74 74  .       testpatt
b790: 20 22 27 20 41 4e 44 20 74 2e 73 74 61 74 65 20   "' AND t.state 
b7a0: 4c 49 4b 45 20 27 22 20 73 74 61 74 65 70 61 74  LIKE '" statepat
b7b0: 74 20 22 27 20 41 4e 44 20 74 2e 73 74 61 74 75  t "' AND t.statu
b7c0: 73 20 4c 49 4b 45 20 27 22 20 73 74 61 74 75 73  s LIKE '" status
b7d0: 70 61 74 74 20 0a 09 09 20 20 20 20 20 20 20 22  patt ...       "
b7e0: 27 4f 52 44 45 52 20 42 59 20 74 2e 65 76 65 6e  'ORDER BY t.even
b7f0: 74 5f 74 69 6d 65 20 41 53 43 3b 22 29 29 29 0a  t_time ASC;"))).
b800: 20 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74      (debug:print
b810: 20 33 20 22 71 72 79 73 74 72 3a 20 22 20 71 72   3 "qrystr: " qr
b820: 79 73 74 72 29 0a 20 20 20 20 28 73 71 6c 69 74  ystr).    (sqlit
b830: 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77 20  e3:for-each-row 
b840: 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 70  .     (lambda (p
b850: 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 72  ).       (set! r
b860: 65 73 20 28 63 6f 6e 73 20 70 20 72 65 73 29 29  es (cons p res))
b870: 29 0a 20 20 20 20 20 64 62 20 0a 20 20 20 20 20  ).     db .     
b880: 71 72 79 73 74 72 29 0a 20 20 20 20 72 65 73 29  qrystr).    res)
b890: 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  )..;;===========
b8a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
b8b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
b8c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
b8d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 51  ===========.;; Q
b8e0: 55 45 55 45 20 55 50 20 4d 45 54 41 2c 20 54 45  UEUE UP META, TE
b8f0: 53 54 20 53 54 41 54 55 53 20 41 4e 44 20 53 54  ST STATUS AND ST
b900: 45 50 53 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  EPS.;;==========
b910: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
b920: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
b930: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
b940: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b  ============..;;
b950: 20 64 62 3a 75 70 64 61 74 65 72 20 69 73 20 72   db:updater is r
b960: 75 6e 20 69 6e 20 61 20 74 68 72 65 61 64 20 74  un in a thread t
b970: 6f 20 77 72 69 74 65 20 6f 75 74 20 74 68 65 20  o write out the 
b980: 63 61 63 68 65 64 20 64 61 74 61 20 70 65 72 69  cached data peri
b990: 6f 64 69 63 61 6c 6c 79 0a 28 64 65 66 69 6e 65  odically.(define
b9a0: 20 28 64 62 3a 75 70 64 61 74 65 72 29 0a 20 20   (db:updater).  
b9b0: 28 64 65 62 75 67 3a 70 72 69 6e 74 2d 69 6e 66  (debug:print-inf
b9c0: 6f 20 34 20 22 53 74 61 72 74 69 6e 67 20 63 61  o 4 "Starting ca
b9d0: 63 68 65 20 70 72 6f 63 65 73 73 69 6e 67 22 29  che processing")
b9e0: 0a 20 20 28 6c 65 74 20 6c 6f 6f 70 20 28 29 0a  .  (let loop ().
b9f0: 20 20 20 20 28 74 68 72 65 61 64 2d 73 6c 65 65      (thread-slee
ba00: 70 21 20 31 30 29 20 3b 3b 20 6d 6f 76 65 20 73  p! 10) ;; move s
ba10: 61 76 65 20 74 69 6d 65 20 61 72 6f 75 6e 64 20  ave time around 
ba20: 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 72 65 67 75  to minimize regu
ba30: 6c 61 72 20 63 6f 6c 6c 69 73 69 6f 6e 73 3f 0a  lar collisions?.
ba40: 20 20 20 20 28 64 62 3a 77 72 69 74 65 2d 63 61      (db:write-ca
ba50: 63 68 65 64 2d 64 61 74 61 29 0a 20 20 20 20 28  ched-data).    (
ba60: 6c 6f 6f 70 29 29 29 0a 0a 3b 3b 20 63 64 62 3a  loop)))..;; cdb:
ba70: 63 61 63 68 65 64 2d 61 63 63 65 73 73 20 69 73  cached-access is
ba80: 20 63 61 6c 6c 65 64 20 62 79 20 74 68 65 20 73   called by the s
ba90: 65 72 76 65 72 20 6c 6f 6f 70 20 74 6f 20 64 69  erver loop to di
baa0: 73 70 61 74 63 68 20 63 6f 6d 6d 61 6e 64 73 20  spatch commands 
bab0: 6f 72 20 71 75 65 75 65 20 75 70 0a 3b 3b 20 64  or queue up.;; d
bac0: 62 20 61 63 63 65 73 73 65 73 0a 3b 3b 0a 3b 3b  b accesses.;;.;;
bad0: 20 70 61 72 61 6d 73 20 3a 3d 20 71 72 79 2d 6e   params := qry-n
bae0: 61 6d 65 20 63 61 63 68 65 64 3f 20 76 61 6c 31  ame cached? val1
baf0: 20 76 61 6c 32 20 76 61 6c 33 20 2e 2e 2e 0a 28   val2 val3 ....(
bb00: 64 65 66 69 6e 65 20 28 63 64 62 3a 63 61 63 68  define (cdb:cach
bb10: 65 64 2d 61 63 63 65 73 73 20 70 61 72 61 6d 73  ed-access params
bb20: 29 0a 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74  ).  (debug:print
bb30: 2d 69 6e 66 6f 20 31 32 20 22 63 64 62 3a 63 61  -info 12 "cdb:ca
bb40: 63 68 65 64 2d 61 63 63 65 73 73 20 70 61 72 61  ched-access para
bb50: 6d 73 3d 22 20 70 61 72 61 6d 73 29 0a 20 20 28  ms=" params).  (
bb60: 69 66 20 28 3c 20 28 6c 65 6e 67 74 68 20 70 61  if (< (length pa
bb70: 72 61 6d 73 29 20 32 29 0a 20 20 20 20 20 20 22  rams) 2).      "
bb80: 45 52 52 4f 52 22 0a 20 20 20 20 20 20 28 6c 65  ERROR".      (le
bb90: 74 20 28 28 71 72 79 2d 6e 61 6d 65 20 28 63 61  t ((qry-name (ca
bba0: 72 20 70 61 72 61 6d 73 29 29 0a 09 20 20 20 20  r params))..    
bbb0: 28 63 61 63 68 65 64 3f 20 20 28 63 61 64 72 20  (cached?  (cadr 
bbc0: 70 61 72 61 6d 73 29 29 0a 09 20 20 20 20 28 72  params))..    (r
bbd0: 65 6d 70 61 72 61 6d 20 28 6c 69 73 74 2d 74 61  emparam (list-ta
bbe0: 69 6c 20 70 61 72 61 6d 73 20 32 29 29 29 20 0a  il params 2))) .
bbf0: 09 28 64 65 62 75 67 3a 70 72 69 6e 74 2d 69 6e  .(debug:print-in
bc00: 66 6f 20 31 32 20 22 63 64 62 3a 63 61 63 68 65  fo 12 "cdb:cache
bc10: 64 2d 61 63 63 65 73 73 20 71 72 79 2d 6e 61 6d  d-access qry-nam
bc20: 65 3d 22 20 71 72 79 2d 6e 61 6d 65 20 22 20 70  e=" qry-name " p
bc30: 61 72 61 6d 73 3d 22 20 70 61 72 61 6d 73 29 0a  arams=" params).
bc40: 09 3b 3b 20 41 6e 79 20 73 70 65 63 69 61 6c 20  .;; Any special 
bc50: 63 61 6c 6c 73 20 61 72 65 20 64 69 73 70 61 74  calls are dispat
bc60: 63 68 65 64 20 68 65 72 65 2e 20 0a 09 3b 3b 20  ched here. ..;; 
bc70: 52 65 6d 61 69 6e 64 65 72 20 61 72 65 20 70 75  Remainder are pu
bc80: 74 20 69 6e 20 74 68 65 20 64 62 20 71 75 65 75  t in the db queu
bc90: 65 0a 09 28 63 61 73 65 20 71 72 79 2d 6e 61 6d  e..(case qry-nam
bca0: 65 0a 09 20 20 28 28 6c 6f 67 69 6e 29 20 3b 3b  e..  ((login) ;;
bcb0: 20 6c 6f 67 69 6e 20 63 68 65 63 6b 73 20 74 68   login checks th
bcc0: 61 74 20 74 68 65 20 6d 65 67 61 74 65 73 74 20  at the megatest 
bcd0: 70 61 74 68 20 6d 61 74 63 68 65 73 0a 09 20 20  path matches..  
bce0: 20 28 69 66 20 28 6e 75 6c 6c 3f 20 72 65 6d 70   (if (null? remp
bcf0: 61 72 61 6d 29 0a 09 20 20 20 20 20 20 20 23 66  aram)..       #f
bd00: 20 3b 3b 20 6e 6f 20 70 61 74 68 20 2d 20 66 61   ;; no path - fa
bd10: 69 6c 21 0a 09 20 20 20 20 20 20 20 28 6c 65 74  il!..       (let
bd20: 20 28 28 63 61 6c 6c 69 6e 67 2d 70 61 74 68 20   ((calling-path 
bd30: 28 63 61 72 20 72 65 6d 70 61 72 61 6d 29 29 29  (car remparam)))
bd40: 0a 09 09 20 28 69 66 20 28 65 71 75 61 6c 3f 20  ... (if (equal? 
bd50: 63 61 6c 6c 69 6e 67 2d 70 61 74 68 20 2a 74 6f  calling-path *to
bd60: 70 70 61 74 68 2a 29 0a 09 09 20 20 20 20 20 23  ppath*)...     #
bd70: 74 20 20 20 20 20 20 3b 3b 20 70 61 74 68 20 6d  t      ;; path m
bd80: 61 74 63 68 65 73 20 2d 20 70 61 73 73 21 20 53  atches - pass! S
bd90: 68 6f 75 6c 64 20 76 65 74 20 74 68 65 20 63 61  hould vet the ca
bda0: 6c 6c 65 72 20 61 74 20 74 68 69 73 20 74 69 6d  ller at this tim
bdb0: 65 20 2e 2e 2e 0a 09 09 20 20 20 20 20 23 66 29  e ......     #f)
bdc0: 29 29 29 20 20 3b 3b 20 65 6c 73 65 20 66 61 69  )))  ;; else fai
bdd0: 6c 20 74 6f 20 6c 6f 67 69 6e 0a 09 20 20 28 28  l to login..  ((
bde0: 66 6c 75 73 68 29 0a 09 20 20 20 28 64 62 3a 77  flush)..   (db:w
bdf0: 72 69 74 65 2d 63 61 63 68 65 64 2d 64 61 74 61  rite-cached-data
be00: 29 0a 09 20 20 20 23 74 29 0a 09 20 20 28 65 6c  )..   #t)..  (el
be10: 73 65 0a 09 20 20 20 28 6d 75 74 65 78 2d 6c 6f  se..   (mutex-lo
be20: 63 6b 21 20 2a 69 6e 63 6f 6d 69 6e 67 2d 6d 75  ck! *incoming-mu
be30: 74 65 78 2a 29 0a 09 20 20 20 28 73 65 74 21 20  tex*)..   (set! 
be40: 2a 6c 61 73 74 2d 64 62 2d 61 63 63 65 73 73 2a  *last-db-access*
be50: 20 28 63 75 72 72 65 6e 74 2d 73 65 63 6f 6e 64   (current-second
be60: 73 29 29 0a 09 20 20 20 28 73 65 74 21 20 2a 69  s))..   (set! *i
be70: 6e 63 6f 6d 69 6e 67 2d 64 61 74 61 2a 20 28 63  ncoming-data* (c
be80: 6f 6e 73 20 0a 09 09 09 09 20 20 28 76 65 63 74  ons .....  (vect
be90: 6f 72 20 71 72 79 2d 6e 61 6d 65 0a 09 09 09 09  or qry-name.....
bea0: 09 20 20 28 63 75 72 72 65 6e 74 2d 6d 69 6c 6c  .  (current-mill
beb0: 69 73 65 63 6f 6e 64 73 29 0a 09 09 09 09 09 20  iseconds)...... 
bec0: 20 70 61 72 61 6d 73 29 0a 09 09 09 09 20 20 2a   params).....  *
bed0: 69 6e 63 6f 6d 69 6e 67 2d 64 61 74 61 2a 29 29  incoming-data*))
bee0: 0a 09 20 20 20 28 6d 75 74 65 78 2d 75 6e 6c 6f  ..   (mutex-unlo
bef0: 63 6b 21 20 2a 69 6e 63 6f 6d 69 6e 67 2d 6d 75  ck! *incoming-mu
bf00: 74 65 78 2a 29 0a 09 20 20 20 3b 3b 20 4e 4f 54  tex*)..   ;; NOT
bf10: 45 3a 20 69 66 20 63 61 63 68 65 64 3f 20 69 73  E: if cached? is
bf20: 20 23 66 20 74 68 65 6e 20 74 68 69 73 20 63 61   #f then this ca
bf30: 6c 6c 20 6d 75 73 74 20 62 65 20 72 75 6e 20 69  ll must be run i
bf40: 6d 6d 65 64 69 61 74 65 6c 79 0a 09 20 20 20 3b  mmediately..   ;
bf50: 3b 20 20 20 20 20 20 20 62 75 74 20 66 69 72 73  ;       but firs
bf60: 74 20 61 6c 6c 20 63 61 6c 6c 73 20 69 6e 20 74  t all calls in t
bf70: 68 65 20 71 75 65 75 65 20 61 72 65 20 72 75 6e  he queue are run
bf80: 20 66 69 72 73 74 20 69 6e 20 74 68 65 20 6f 72   first in the or
bf90: 64 65 72 0a 09 20 20 20 3b 3b 20 20 20 20 20 20  der..   ;;      
bfa0: 20 6f 66 20 74 68 65 69 72 20 74 69 6d 65 20 73   of their time s
bfb0: 74 61 6d 70 0a 09 20 20 20 28 69 66 20 28 61 6e  tamp..   (if (an
bfc0: 64 20 63 61 63 68 65 64 3f 20 2a 63 61 63 68 65  d cached? *cache
bfd0: 2d 6f 6e 2a 29 0a 09 20 20 20 20 20 20 20 28 62  -on*)..       (b
bfe0: 65 67 69 6e 0a 09 09 20 28 64 65 62 75 67 3a 70  egin... (debug:p
bff0: 72 69 6e 74 2d 69 6e 66 6f 20 31 32 20 22 2a 63  rint-info 12 "*c
c000: 61 63 68 65 2d 6f 6e 2a 20 69 73 20 22 20 2a 63  ache-on* is " *c
c010: 61 63 68 65 2d 6f 6e 2a 20 22 2c 20 73 6b 69 70  ache-on* ", skip
c020: 70 69 6e 67 20 63 61 63 68 65 20 77 72 69 74 65  ping cache write
c030: 22 29 0a 09 09 20 22 43 41 43 48 45 44 22 29 0a  ")... "CACHED").
c040: 09 20 20 20 20 20 20 20 28 62 65 67 69 6e 0a 09  .       (begin..
c050: 09 20 28 64 62 3a 77 72 69 74 65 2d 63 61 63 68  . (db:write-cach
c060: 65 64 2d 64 61 74 61 29 0a 09 09 20 22 57 52 49  ed-data)... "WRI
c070: 54 54 45 4e 22 29 29 29 29 29 29 29 0a 0a 28 64  TTEN")))))))..(d
c080: 65 66 69 6e 65 20 28 64 62 3a 6f 62 6a 2d 3e 73  efine (db:obj->s
c090: 74 72 69 6e 67 20 6f 62 6a 29 28 77 69 74 68 2d  tring obj)(with-
c0a0: 6f 75 74 70 75 74 2d 74 6f 2d 73 74 72 69 6e 67  output-to-string
c0b0: 20 28 6c 61 6d 62 64 61 20 28 29 28 73 65 72 69   (lambda ()(seri
c0c0: 61 6c 69 7a 65 20 6f 62 6a 29 29 29 29 0a 28 64  alize obj)))).(d
c0d0: 65 66 69 6e 65 20 28 64 62 3a 73 74 72 69 6e 67  efine (db:string
c0e0: 2d 3e 6f 62 6a 20 6d 73 67 29 28 77 69 74 68 2d  ->obj msg)(with-
c0f0: 69 6e 70 75 74 2d 66 72 6f 6d 2d 73 74 72 69 6e  input-from-strin
c100: 67 20 6d 73 67 20 28 6c 61 6d 62 64 61 20 28 29  g msg (lambda ()
c110: 28 64 65 73 65 72 69 61 6c 69 7a 65 29 29 29 29  (deserialize))))
c120: 0a 0a 28 64 65 66 69 6e 65 20 28 63 64 62 3a 63  ..(define (cdb:c
c130: 6c 69 65 6e 74 2d 63 61 6c 6c 20 7a 6d 71 2d 73  lient-call zmq-s
c140: 6f 63 6b 65 74 20 2e 20 70 61 72 61 6d 73 29 0a  ocket . params).
c150: 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 2d 69    (debug:print-i
c160: 6e 66 6f 20 31 31 20 22 63 64 62 3a 63 6c 69 65  nfo 11 "cdb:clie
c170: 6e 74 2d 63 61 6c 6c 20 7a 6d 71 2d 73 6f 63 6b  nt-call zmq-sock
c180: 65 74 3d 22 20 7a 6d 71 2d 73 6f 63 6b 65 74 20  et=" zmq-socket 
c190: 22 20 70 61 72 61 6d 73 3d 22 20 70 61 72 61 6d  " params=" param
c1a0: 73 29 0a 20 20 28 6c 65 74 20 28 28 7a 64 61 74  s).  (let ((zdat
c1b0: 20 28 64 62 3a 6f 62 6a 2d 3e 73 74 72 69 6e 67   (db:obj->string
c1c0: 20 70 61 72 61 6d 73 29 29 20 3b 3b 20 28 77 69   params)) ;; (wi
c1d0: 74 68 2d 6f 75 74 70 75 74 2d 74 6f 2d 73 74 72  th-output-to-str
c1e0: 69 6e 67 20 28 6c 61 6d 62 64 61 20 28 29 28 73  ing (lambda ()(s
c1f0: 65 72 69 61 6c 69 7a 65 20 70 61 72 61 6d 73 29  erialize params)
c200: 29 29 29 0a 09 28 72 65 73 20 20 23 66 29 29 0a  )))..(res  #f)).
c210: 20 20 20 20 28 70 72 69 6e 74 20 22 63 64 62 3a      (print "cdb:
c220: 63 6c 69 65 6e 74 2d 63 61 6c 6c 20 62 65 66 6f  client-call befo
c230: 72 65 20 73 65 6e 64 20 6d 65 73 73 61 67 65 22  re send message"
c240: 29 0a 20 20 20 20 28 73 65 6e 64 2d 6d 65 73 73  ).    (send-mess
c250: 61 67 65 20 7a 6d 71 2d 73 6f 63 6b 65 74 20 7a  age zmq-socket z
c260: 64 61 74 29 0a 20 20 20 20 28 70 72 69 6e 74 20  dat).    (print 
c270: 22 63 64 62 3a 63 6c 69 65 6e 74 2d 63 61 6c 6c  "cdb:client-call
c280: 20 61 66 74 65 72 20 73 65 6e 64 20 6d 65 73 73   after send mess
c290: 61 67 65 22 29 0a 20 20 20 20 28 73 65 74 21 20  age").    (set! 
c2a0: 72 65 73 20 28 64 62 3a 73 74 72 69 6e 67 2d 3e  res (db:string->
c2b0: 6f 62 6a 20 28 72 65 63 65 69 76 65 2d 6d 65 73  obj (receive-mes
c2c0: 73 61 67 65 20 7a 6d 71 2d 73 6f 63 6b 65 74 20  sage zmq-socket 
c2d0: 7a 64 61 74 29 29 29 0a 20 20 20 20 28 64 65 62  zdat))).    (deb
c2e0: 75 67 3a 70 72 69 6e 74 2d 69 6e 66 6f 20 31 31  ug:print-info 11
c2f0: 20 22 7a 6d 71 2d 73 6f 63 6b 65 74 20 22 20 28   "zmq-socket " (
c300: 63 61 72 20 70 61 72 61 6d 73 29 20 22 20 72 65  car params) " re
c310: 73 3d 22 20 72 65 73 29 0a 20 20 20 20 72 65 73  s=" res).    res
c320: 29 29 0a 20 20 0a 28 64 65 66 69 6e 65 20 28 63  )).  .(define (c
c330: 64 62 3a 74 65 73 74 2d 73 65 74 2d 73 74 61 74  db:test-set-stat
c340: 75 73 2d 73 74 61 74 65 20 7a 6d 71 73 6f 63 6b  us-state zmqsock
c350: 65 74 20 74 65 73 74 2d 69 64 20 73 74 61 74 75  et test-id statu
c360: 73 20 73 74 61 74 65 20 6d 73 67 29 0a 20 20 28  s state msg).  (
c370: 69 66 20 6d 73 67 0a 20 20 20 20 20 20 28 63 64  if msg.      (cd
c380: 62 3a 63 6c 69 65 6e 74 2d 63 61 6c 6c 20 7a 6d  b:client-call zm
c390: 71 73 6f 63 6b 65 74 20 27 73 74 61 74 65 2d 73  qsocket 'state-s
c3a0: 74 61 74 75 73 2d 6d 73 67 20 73 74 61 74 65 20  tatus-msg state 
c3b0: 73 74 61 74 75 73 20 6d 73 67 20 74 65 73 74 2d  status msg test-
c3c0: 69 64 29 0a 20 20 20 20 20 20 28 63 64 62 3a 63  id).      (cdb:c
c3d0: 6c 69 65 6e 74 2d 63 61 6c 6c 20 7a 6d 71 73 6f  lient-call zmqso
c3e0: 63 6b 65 74 20 27 73 74 61 74 65 2d 73 74 61 74  cket 'state-stat
c3f0: 75 73 20 73 74 61 74 65 20 73 74 61 74 75 73 20  us state status 
c400: 74 65 73 74 2d 69 64 29 29 29 20 3b 3b 20 72 75  test-id))) ;; ru
c410: 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69  n-id test-name i
c420: 74 65 6d 2d 70 61 74 68 20 6d 69 6e 75 74 65 73  tem-path minutes
c430: 20 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65   cpuload diskfre
c440: 65 20 74 6d 70 66 72 65 65 29 20 0a 0a 28 64 65  e tmpfree) ..(de
c450: 66 69 6e 65 20 28 63 64 62 3a 74 65 73 74 2d 72  fine (cdb:test-r
c460: 6f 6c 6c 75 70 2d 74 65 73 74 5f 64 61 74 61 2d  ollup-test_data-
c470: 70 61 73 73 2d 66 61 69 6c 20 7a 6d 71 73 6f 63  pass-fail zmqsoc
c480: 6b 65 74 20 74 65 73 74 2d 69 64 29 0a 20 20 28  ket test-id).  (
c490: 63 64 62 3a 63 6c 69 65 6e 74 2d 63 61 6c 6c 20  cdb:client-call 
c4a0: 7a 6d 71 73 6f 63 6b 65 74 20 27 74 65 73 74 5f  zmqsocket 'test_
c4b0: 64 61 74 61 2d 70 66 2d 72 6f 6c 6c 75 70 20 23  data-pf-rollup #
c4c0: 74 20 74 65 73 74 2d 69 64 20 74 65 73 74 2d 69  t test-id test-i
c4d0: 64 20 74 65 73 74 2d 69 64 29 29 0a 0a 28 64 65  d test-id))..(de
c4e0: 66 69 6e 65 20 28 63 64 62 3a 70 61 73 73 2d 66  fine (cdb:pass-f
c4f0: 61 69 6c 2d 63 6f 75 6e 74 73 20 7a 6d 71 73 6f  ail-counts zmqso
c500: 63 6b 65 74 20 74 65 73 74 2d 69 64 20 66 61 69  cket test-id fai
c510: 6c 2d 63 6f 75 6e 74 20 70 61 73 73 2d 63 6f 75  l-count pass-cou
c520: 6e 74 29 0a 20 20 28 63 64 62 3a 63 6c 69 65 6e  nt).  (cdb:clien
c530: 74 2d 63 61 6c 6c 20 7a 6d 71 73 6f 63 6b 65 74  t-call zmqsocket
c540: 20 27 70 61 73 73 2d 66 61 69 6c 2d 63 6f 75 6e   'pass-fail-coun
c550: 74 73 20 66 61 69 6c 2d 63 6f 75 6e 74 20 70 61  ts fail-count pa
c560: 73 73 2d 63 6f 75 6e 74 20 74 65 73 74 2d 69 64  ss-count test-id
c570: 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 63 64 62  ))..(define (cdb
c580: 3a 74 65 73 74 73 2d 72 65 67 69 73 74 65 72 2d  :tests-register-
c590: 74 65 73 74 20 7a 6d 71 73 6f 63 6b 65 74 20 64  test zmqsocket d
c5a0: 62 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61  b run-id test-na
c5b0: 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 0a 20 20  me item-path).  
c5c0: 28 6c 65 74 20 28 28 69 74 65 6d 2d 70 61 74 68  (let ((item-path
c5d0: 73 20 28 69 66 20 28 65 71 75 61 6c 3f 20 69 74  s (if (equal? it
c5e0: 65 6d 2d 70 61 74 68 20 22 22 29 0a 09 09 09 28  em-path "")....(
c5f0: 6c 69 73 74 20 69 74 65 6d 2d 70 61 74 68 29 0a  list item-path).
c600: 09 09 09 28 6c 69 73 74 20 69 74 65 6d 2d 70 61  ...(list item-pa
c610: 74 68 20 22 22 29 29 29 29 0a 20 20 20 20 28 63  th "")))).    (c
c620: 64 62 3a 63 6c 69 65 6e 74 2d 63 61 6c 6c 20 7a  db:client-call z
c630: 6d 71 73 6f 63 6b 65 74 20 27 72 65 67 69 73 74  mqsocket 'regist
c640: 65 72 2d 74 65 73 74 20 72 75 6e 2d 69 64 20 74  er-test run-id t
c650: 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61  est-name item-pa
c660: 74 68 29 29 29 0a 0a 3b 3b 20 54 68 65 20 71 75  th)))..;; The qu
c670: 65 75 65 20 69 73 20 61 20 6c 69 73 74 20 6f 66  eue is a list of
c680: 20 76 65 63 74 6f 72 73 20 77 68 65 72 65 20 74   vectors where t
c690: 68 65 20 7a 65 72 6f 74 68 20 73 6c 6f 74 20 69  he zeroth slot i
c6a0: 6e 64 69 63 61 74 65 73 20 74 68 65 20 74 79 70  ndicates the typ
c6b0: 65 20 6f 66 20 71 75 65 72 79 20 74 6f 0a 3b 3b  e of query to.;;
c6c0: 20 61 70 70 6c 79 20 61 6e 64 20 74 68 65 20 73   apply and the s
c6d0: 65 63 6f 6e 64 20 73 6c 6f 74 20 69 73 20 74 68  econd slot is th
c6e0: 65 20 74 69 6d 65 20 6f 66 20 74 68 65 20 71 75  e time of the qu
c6f0: 65 72 79 20 61 6e 64 20 74 68 65 20 74 68 69 72  ery and the thir
c700: 64 20 65 6e 74 72 79 20 69 73 20 61 20 6c 69 73  d entry is a lis
c710: 74 20 6f 66 20 0a 3b 3b 20 76 61 6c 75 65 73 20  t of .;; values 
c720: 74 6f 20 62 65 20 61 70 70 6c 69 65 64 0a 3b 3b  to be applied.;;
c730: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 77 72 69  .(define (db:wri
c740: 74 65 2d 63 61 63 68 65 64 2d 64 61 74 61 29 0a  te-cached-data).
c750: 20 20 28 6f 70 65 6e 2d 72 75 6e 2d 63 6c 6f 73    (open-run-clos
c760: 65 0a 20 20 20 28 6c 61 6d 62 64 61 20 28 64 62  e.   (lambda (db
c770: 20 2e 20 70 61 72 61 6d 73 29 0a 20 20 20 20 20   . params).     
c780: 28 6c 65 74 20 28 28 72 65 67 69 73 74 65 72 2d  (let ((register-
c790: 74 65 73 74 2d 73 74 6d 74 20 20 20 20 28 73 71  test-stmt    (sq
c7a0: 6c 69 74 65 33 3a 70 72 65 70 61 72 65 20 64 62  lite3:prepare db
c7b0: 20 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f   "INSERT OR IGNO
c7c0: 52 45 20 49 4e 54 4f 20 74 65 73 74 73 20 28 72  RE INTO tests (r
c7d0: 75 6e 5f 69 64 2c 74 65 73 74 6e 61 6d 65 2c 65  un_id,testname,e
c7e0: 76 65 6e 74 5f 74 69 6d 65 2c 69 74 65 6d 5f 70  vent_time,item_p
c7f0: 61 74 68 2c 73 74 61 74 65 2c 73 74 61 74 75 73  ath,state,status
c800: 29 20 56 41 4c 55 45 53 20 28 3f 2c 3f 2c 73 74  ) VALUES (?,?,st
c810: 72 66 74 69 6d 65 28 27 25 73 27 2c 27 6e 6f 77  rftime('%s','now
c820: 27 29 2c 3f 2c 27 4e 4f 54 5f 53 54 41 52 54 45  '),?,'NOT_STARTE
c830: 44 27 2c 27 6e 2f 61 27 29 3b 22 29 29 0a 09 20  D','n/a');")).. 
c840: 20 20 28 73 74 61 74 65 2d 73 74 61 74 75 73 2d    (state-status-
c850: 73 74 6d 74 20 20 20 20 20 28 73 71 6c 69 74 65  stmt     (sqlite
c860: 33 3a 70 72 65 70 61 72 65 20 64 62 20 22 55 50  3:prepare db "UP
c870: 44 41 54 45 20 74 65 73 74 73 20 53 45 54 20 73  DATE tests SET s
c880: 74 61 74 65 3d 3f 2c 73 74 61 74 75 73 3d 3f 20  tate=?,status=? 
c890: 57 48 45 52 45 20 69 64 3d 3f 3b 22 29 29 0a 09  WHERE id=?;"))..
c8a0: 20 20 20 28 73 74 61 74 65 2d 73 74 61 74 75 73     (state-status
c8b0: 2d 6d 73 67 2d 73 74 6d 74 20 28 73 71 6c 69 74  -msg-stmt (sqlit
c8c0: 65 33 3a 70 72 65 70 61 72 65 20 64 62 20 22 55  e3:prepare db "U
c8d0: 50 44 41 54 45 20 74 65 73 74 73 20 53 45 54 20  PDATE tests SET 
c8e0: 73 74 61 74 65 3d 3f 2c 73 74 61 74 75 73 3d 3f  state=?,status=?
c8f0: 2c 63 6f 6d 6d 65 6e 74 3d 3f 20 57 48 45 52 45  ,comment=? WHERE
c900: 20 69 64 3d 3f 3b 22 29 29 0a 09 20 20 20 28 70   id=?;"))..   (p
c910: 61 73 73 2d 66 61 69 6c 2d 63 6f 75 6e 74 73 2d  ass-fail-counts-
c920: 73 74 6d 74 20 28 73 71 6c 69 74 65 33 3a 70 72  stmt (sqlite3:pr
c930: 65 70 61 72 65 20 64 62 20 22 55 50 44 41 54 45  epare db "UPDATE
c940: 20 74 65 73 74 73 20 53 45 54 20 66 61 69 6c 5f   tests SET fail_
c950: 63 6f 75 6e 74 3d 3f 2c 70 61 73 73 5f 63 6f 75  count=?,pass_cou
c960: 6e 74 3d 3f 20 57 48 45 52 45 20 69 64 3d 3f 3b  nt=? WHERE id=?;
c970: 22 29 29 0a 09 20 20 20 28 74 65 73 74 5f 64 61  "))..   (test_da
c980: 74 61 2d 72 6f 6c 6c 75 70 2d 73 74 6d 74 20 20  ta-rollup-stmt  
c990: 28 73 71 6c 69 74 65 33 3a 70 72 65 70 61 72 65  (sqlite3:prepare
c9a0: 20 64 62 20 22 55 50 44 41 54 45 20 74 65 73 74   db "UPDATE test
c9b0: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s.              
c9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
c9e0: 45 54 20 73 74 61 74 75 73 3d 43 41 53 45 20 57  ET status=CASE W
c9f0: 48 45 4e 20 28 53 45 4c 45 43 54 20 66 61 69 6c  HEN (SELECT fail
ca00: 5f 63 6f 75 6e 74 20 46 52 4f 4d 20 74 65 73 74  _count FROM test
ca10: 73 20 57 48 45 52 45 20 69 64 3d 3f 29 20 3e 20  s WHERE id=?) > 
ca20: 30 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0 .             
ca30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca50: 20 20 20 54 48 45 4e 20 27 46 41 49 4c 27 0a 20     THEN 'FAIL'. 
ca60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca80: 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 4e              WHEN
ca90: 20 28 53 45 4c 45 43 54 20 70 61 73 73 5f 63 6f   (SELECT pass_co
caa0: 75 6e 74 20 46 52 4f 4d 20 74 65 73 74 73 20 57  unt FROM tests W
cab0: 48 45 52 45 20 69 64 3d 3f 29 20 3e 20 30 20 41  HERE id=?) > 0 A
cac0: 4e 44 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ND .            
cad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
caf0: 20 20 20 20 20 20 28 53 45 4c 45 43 54 20 73 74        (SELECT st
cb00: 61 74 75 73 20 46 52 4f 4d 20 74 65 73 74 73 20  atus FROM tests 
cb10: 57 48 45 52 45 20 69 64 3d 3f 29 20 4e 4f 54 20  WHERE id=?) NOT 
cb20: 49 4e 20 28 27 57 41 52 4e 27 2c 27 46 41 49 4c  IN ('WARN','FAIL
cb30: 27 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ').             
cb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb60: 54 48 45 4e 20 27 50 41 53 53 27 0a 20 20 20 20  THEN 'PASS'.    
cb70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb90: 20 20 20 20 20 20 20 20 20 45 4c 53 45 20 73 74           ELSE st
cba0: 61 74 75 73 0a 20 20 20 20 20 20 20 20 20 20 20  atus.           
cbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cbc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 4e                EN
cbd0: 44 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 29 29  D WHERE id=?;"))
cbe0: 0a 09 20 20 20 28 64 61 74 61 20 20 20 20 20 20  ..   (data      
cbf0: 20 20 20 20 20 20 20 20 20 20 20 20 23 66 29 0a              #f).
cc00: 09 20 20 20 28 72 6f 6c 6c 75 70 73 20 20 20 20  .   (rollups    
cc10: 20 20 20 20 20 20 20 20 20 20 20 28 6d 61 6b 65             (make
cc20: 2d 68 61 73 68 2d 74 61 62 6c 65 29 29 29 0a 20  -hash-table))). 
cc30: 20 20 20 20 20 20 28 6d 75 74 65 78 2d 6c 6f 63        (mutex-loc
cc40: 6b 21 20 2a 69 6e 63 6f 6d 69 6e 67 2d 6d 75 74  k! *incoming-mut
cc50: 65 78 2a 29 0a 20 20 20 20 20 20 20 28 73 65 74  ex*).       (set
cc60: 21 20 64 61 74 61 20 28 73 6f 72 74 20 2a 69 6e  ! data (sort *in
cc70: 63 6f 6d 69 6e 67 2d 64 61 74 61 2a 20 28 6c 61  coming-data* (la
cc80: 6d 62 64 61 20 28 61 20 62 29 28 3c 20 28 76 65  mbda (a b)(< (ve
cc90: 63 74 6f 72 2d 72 65 66 20 61 20 31 29 28 76 65  ctor-ref a 1)(ve
cca0: 63 74 6f 72 2d 72 65 66 20 62 20 31 29 29 29 29  ctor-ref b 1))))
ccb0: 29 0a 20 20 20 20 20 20 20 28 73 65 74 21 20 2a  ).       (set! *
ccc0: 69 6e 63 6f 6d 69 6e 67 2d 64 61 74 61 2a 20 27  incoming-data* '
ccd0: 28 29 29 0a 20 20 20 20 20 20 20 28 6d 75 74 65  ()).       (mute
cce0: 78 2d 75 6e 6c 6f 63 6b 21 20 2a 69 6e 63 6f 6d  x-unlock! *incom
ccf0: 69 6e 67 2d 6d 75 74 65 78 2a 29 0a 20 20 20 20  ing-mutex*).    
cd00: 20 20 20 28 69 66 20 28 3e 20 28 6c 65 6e 67 74     (if (> (lengt
cd10: 68 20 64 61 74 61 29 20 30 29 0a 09 20 20 20 28  h data) 0)..   (
cd20: 64 65 62 75 67 3a 70 72 69 6e 74 2d 69 6e 66 6f  debug:print-info
cd30: 20 34 20 22 57 72 69 74 69 6e 67 20 63 61 63 68   4 "Writing cach
cd40: 65 64 20 64 61 74 61 20 22 20 64 61 74 61 29 29  ed data " data))
cd50: 0a 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  .       (sqlite3
cd60: 3a 77 69 74 68 2d 74 72 61 6e 73 61 63 74 69 6f  :with-transactio
cd70: 6e 20 0a 09 64 62 0a 09 28 6c 61 6d 62 64 61 20  n ..db..(lambda 
cd80: 28 29 0a 09 20 20 28 64 65 62 75 67 3a 70 72 69  ()..  (debug:pri
cd90: 6e 74 2d 69 6e 66 6f 20 34 20 22 66 6c 75 73 68  nt-info 4 "flush
cda0: 69 6e 67 20 22 20 64 61 74 61 20 22 20 74 6f 20  ing " data " to 
cdb0: 64 62 22 29 0a 09 20 20 28 66 6f 72 2d 65 61 63  db")..  (for-eac
cdc0: 68 20 28 6c 61 6d 62 64 61 20 28 65 6e 74 72 79  h (lambda (entry
cdd0: 29 0a 09 09 20 20 20 20 20 20 28 6c 65 74 20 28  )...      (let (
cde0: 28 70 61 72 61 6d 73 20 28 76 65 63 74 6f 72 2d  (params (vector-
cdf0: 72 65 66 20 65 6e 74 72 79 20 32 29 29 29 0a 09  ref entry 2)))..
ce00: 09 09 28 64 65 62 75 67 3a 70 72 69 6e 74 2d 69  ..(debug:print-i
ce10: 6e 66 6f 20 34 20 22 41 70 70 6c 79 69 6e 67 20  nfo 4 "Applying 
ce20: 22 20 65 6e 74 72 79 20 22 20 74 6f 20 70 61 72  " entry " to par
ce30: 61 6d 73 20 22 20 70 61 72 61 6d 73 29 0a 09 09  ams " params)...
ce40: 09 28 63 61 73 65 20 28 76 65 63 74 6f 72 2d 72  .(case (vector-r
ce50: 65 66 20 65 6e 74 72 79 20 30 29 0a 09 09 09 20  ef entry 0).... 
ce60: 20 28 28 73 74 61 74 65 2d 73 74 61 74 75 73 29   ((state-status)
ce70: 0a 09 09 09 20 20 20 28 61 70 70 6c 79 20 73 71  ....   (apply sq
ce80: 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 73 74  lite3:execute st
ce90: 61 74 65 2d 73 74 61 74 75 73 2d 73 74 6d 74 20  ate-status-stmt 
cea0: 20 20 20 20 70 61 72 61 6d 73 29 29 0a 09 09 09      params))....
ceb0: 20 20 28 28 73 74 61 74 65 2d 73 74 61 74 75 73    ((state-status
cec0: 2d 6d 73 67 29 0a 09 09 09 20 20 20 28 61 70 70  -msg)....   (app
ced0: 6c 79 20 73 71 6c 69 74 65 33 3a 65 78 65 63 75  ly sqlite3:execu
cee0: 74 65 20 73 74 61 74 65 2d 73 74 61 74 75 73 2d  te state-status-
cef0: 6d 73 67 2d 73 74 6d 74 20 70 61 72 61 6d 73 29  msg-stmt params)
cf00: 29 0a 09 09 09 20 20 28 28 74 65 73 74 5f 64 61  )....  ((test_da
cf10: 74 61 2d 70 66 2d 72 6f 6c 6c 75 70 29 0a 09 09  ta-pf-rollup)...
cf20: 09 20 20 20 3b 3b 20 28 68 61 73 68 2d 74 61 62  .   ;; (hash-tab
cf30: 6c 65 2d 73 65 74 21 20 72 6f 6c 6c 75 70 73 20  le-set! rollups 
cf40: 28 63 61 72 20 70 61 72 61 6d 73 29 20 70 61 72  (car params) par
cf50: 61 6d 73 29 29 0a 09 09 09 20 20 20 28 61 70 70  ams))....   (app
cf60: 6c 79 20 73 71 6c 69 74 65 33 3a 65 78 65 63 75  ly sqlite3:execu
cf70: 74 65 20 74 65 73 74 5f 64 61 74 61 2d 72 6f 6c  te test_data-rol
cf80: 6c 75 70 2d 73 74 6d 74 20 20 70 61 72 61 6d 73  lup-stmt  params
cf90: 29 29 0a 09 09 09 20 20 28 28 70 61 73 73 2d 66  ))....  ((pass-f
cfa0: 61 69 6c 2d 63 6f 75 6e 74 73 29 0a 09 09 09 20  ail-counts).... 
cfb0: 20 20 28 61 70 70 6c 79 20 73 71 6c 69 74 65 33    (apply sqlite3
cfc0: 3a 65 78 65 63 75 74 65 20 70 61 73 73 2d 66 61  :execute pass-fa
cfd0: 69 6c 2d 63 6f 75 6e 74 73 2d 73 74 6d 74 20 70  il-counts-stmt p
cfe0: 61 72 61 6d 73 29 29 0a 09 09 09 20 20 28 28 72  arams))....  ((r
cff0: 65 67 69 73 74 65 72 2d 74 65 73 74 29 0a 09 09  egister-test)...
d000: 09 20 20 20 28 61 70 70 6c 79 20 73 71 6c 69 74  .   (apply sqlit
d010: 65 33 3a 65 78 65 63 75 74 65 20 72 65 67 69 73  e3:execute regis
d020: 74 65 72 2d 74 65 73 74 2d 73 74 6d 74 20 20 20  ter-test-stmt   
d030: 20 70 61 72 61 6d 73 29 29 0a 09 09 09 20 20 28   params))....  (
d040: 65 6c 73 65 0a 09 09 09 20 20 20 28 64 65 62 75  else....   (debu
d050: 67 3a 70 72 69 6e 74 20 30 20 22 45 52 52 4f 52  g:print 0 "ERROR
d060: 3a 20 51 75 65 75 65 64 20 65 6e 74 72 79 20 6e  : Queued entry n
d070: 6f 74 20 72 65 63 6f 67 6e 69 73 65 64 20 22 20  ot recognised " 
d080: 65 6e 74 72 79 29 29 29 29 29 0a 09 09 20 20 20  entry)))))...   
d090: 20 64 61 74 61 29 29 29 0a 20 20 20 20 20 20 20   data))).       
d0a0: 3b 3b 20 6e 6f 77 20 64 6f 20 61 6e 79 20 72 6f  ;; now do any ro
d0b0: 6c 6c 75 70 73 0a 20 20 20 20 20 20 20 3b 3b 20  llups.       ;; 
d0c0: 28 66 6f 72 2d 65 61 63 68 0a 20 20 20 20 20 20  (for-each.      
d0d0: 20 3b 3b 20 20 28 6c 61 6d 62 64 61 20 28 74 65   ;;  (lambda (te
d0e0: 73 74 2d 69 64 29 0a 20 20 20 20 20 20 20 3b 3b  st-id).       ;;
d0f0: 20 20 20 20 28 61 70 70 6c 79 20 73 71 6c 69 74      (apply sqlit
d100: 65 33 3a 65 78 65 63 75 74 65 20 74 65 73 74 5f  e3:execute test_
d110: 64 61 74 61 2d 72 6f 6c 6c 75 70 2d 73 74 6d 74  data-rollup-stmt
d120: 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 72 65 66   (hash-table-ref
d130: 20 72 6f 6c 6c 75 70 73 20 74 65 73 74 2d 69 64   rollups test-id
d140: 29 29 29 0a 20 20 20 20 20 20 20 3b 3b 20 20 28  ))).       ;;  (
d150: 68 61 73 68 2d 74 61 62 6c 65 2d 6b 65 79 73 20  hash-table-keys 
d160: 72 6f 6c 6c 75 70 73 29 29 0a 20 20 20 20 20 20  rollups)).      
d170: 20 28 73 71 6c 69 74 65 33 3a 66 69 6e 61 6c 69   (sqlite3:finali
d180: 7a 65 21 20 73 74 61 74 65 2d 73 74 61 74 75 73  ze! state-status
d190: 2d 73 74 6d 74 29 0a 20 20 20 20 20 20 20 28 73  -stmt).       (s
d1a0: 71 6c 69 74 65 33 3a 66 69 6e 61 6c 69 7a 65 21  qlite3:finalize!
d1b0: 20 73 74 61 74 65 2d 73 74 61 74 75 73 2d 6d 73   state-status-ms
d1c0: 67 2d 73 74 6d 74 29 0a 20 20 20 20 20 20 20 28  g-stmt).       (
d1d0: 73 71 6c 69 74 65 33 3a 66 69 6e 61 6c 69 7a 65  sqlite3:finalize
d1e0: 21 20 74 65 73 74 5f 64 61 74 61 2d 72 6f 6c 6c  ! test_data-roll
d1f0: 75 70 2d 73 74 6d 74 29 0a 20 20 20 20 20 20 20  up-stmt).       
d200: 28 73 71 6c 69 74 65 33 3a 66 69 6e 61 6c 69 7a  (sqlite3:finaliz
d210: 65 21 20 70 61 73 73 2d 66 61 69 6c 2d 63 6f 75  e! pass-fail-cou
d220: 6e 74 73 2d 73 74 6d 74 29 0a 20 20 20 20 20 20  nts-stmt).      
d230: 20 28 73 71 6c 69 74 65 33 3a 66 69 6e 61 6c 69   (sqlite3:finali
d240: 7a 65 21 20 72 65 67 69 73 74 65 72 2d 74 65 73  ze! register-tes
d250: 74 2d 73 74 6d 74 29 0a 20 20 20 20 20 20 20 28  t-stmt).       (
d260: 6c 65 74 20 28 28 63 61 63 68 65 2d 73 69 7a 65  let ((cache-size
d270: 20 28 6c 65 6e 67 74 68 20 64 61 74 61 29 29 29   (length data)))
d280: 0a 09 20 28 69 66 20 28 3e 20 63 61 63 68 65 2d  .. (if (> cache-
d290: 73 69 7a 65 20 2a 6d 61 78 2d 63 61 63 68 65 2d  size *max-cache-
d2a0: 73 69 7a 65 2a 29 0a 09 20 20 20 20 20 28 73 65  size*)..     (se
d2b0: 74 21 20 2a 6d 61 78 2d 63 61 63 68 65 2d 73 69  t! *max-cache-si
d2c0: 7a 65 2a 20 63 61 63 68 65 2d 73 69 7a 65 29 29  ze* cache-size))
d2d0: 29 0a 20 20 20 20 20 20 20 29 29 0a 20 20 20 23  ).       )).   #
d2e0: 66 29 29 0a 0a 28 64 65 66 69 6e 65 20 63 64 62  f))..(define cdb
d2f0: 3a 66 6c 75 73 68 2d 71 75 65 75 65 20 64 62 3a  :flush-queue db:
d300: 77 72 69 74 65 2d 63 61 63 68 65 64 2d 64 61 74  write-cached-dat
d310: 61 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  a)..(define (db:
d320: 72 6f 6c 6c 2d 75 70 2d 70 61 73 73 2d 66 61 69  roll-up-pass-fai
d330: 6c 2d 63 6f 75 6e 74 73 20 64 62 20 72 75 6e 2d  l-counts db run-
d340: 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65  id test-name ite
d350: 6d 2d 70 61 74 68 20 73 74 61 74 75 73 29 0a 20  m-path status). 
d360: 20 0a 0a 0a 0a 0a 20 20 3b 3b 20 4e 45 45 44 45   .....  ;; NEEDE
d370: 44 21 3f 0a 20 20 3b 3b 20 28 72 64 62 3a 66 6c  D!?.  ;; (rdb:fl
d380: 75 73 68 2d 71 75 65 75 65 29 0a 0a 0a 0a 0a 0a  ush-queue)......
d390: 0a 20 20 28 69 66 20 28 61 6e 64 20 28 6e 6f 74  .  (if (and (not
d3a0: 20 28 65 71 75 61 6c 3f 20 69 74 65 6d 2d 70 61   (equal? item-pa
d3b0: 74 68 20 22 22 29 29 0a 09 20 20 20 28 6f 72 20  th ""))..   (or 
d3c0: 28 65 71 75 61 6c 3f 20 73 74 61 74 75 73 20 22  (equal? status "
d3d0: 50 41 53 53 22 29 0a 09 20 20 20 20 20 20 20 28  PASS")..       (
d3e0: 65 71 75 61 6c 3f 20 73 74 61 74 75 73 20 22 57  equal? status "W
d3f0: 41 52 4e 22 29 0a 09 20 20 20 20 20 20 20 28 65  ARN")..       (e
d400: 71 75 61 6c 3f 20 73 74 61 74 75 73 20 22 46 41  qual? status "FA
d410: 49 4c 22 29 0a 09 20 20 20 20 20 20 20 28 65 71  IL")..       (eq
d420: 75 61 6c 3f 20 73 74 61 74 75 73 20 22 57 41 49  ual? status "WAI
d430: 56 45 44 22 29 0a 09 20 20 20 20 20 20 20 28 65  VED")..       (e
d440: 71 75 61 6c 3f 20 73 74 61 74 75 73 20 22 52 55  qual? status "RU
d450: 4e 4e 49 4e 47 22 29 29 29 0a 20 20 20 20 20 20  NNING"))).      
d460: 28 62 65 67 69 6e 0a 09 28 73 71 6c 69 74 65 33  (begin..(sqlite3
d470: 3a 65 78 65 63 75 74 65 20 0a 09 20 64 62 0a 09  :execute .. db..
d480: 20 22 55 50 44 41 54 45 20 74 65 73 74 73 20 0a   "UPDATE tests .
d490: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 45 54               SET
d4a0: 20 66 61 69 6c 5f 63 6f 75 6e 74 3d 28 53 45 4c   fail_count=(SEL
d4b0: 45 43 54 20 63 6f 75 6e 74 28 69 64 29 20 46 52  ECT count(id) FR
d4c0: 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 72  OM tests WHERE r
d4d0: 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74  un_id=? AND test
d4e0: 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f  name=? AND item_
d4f0: 70 61 74 68 20 21 3d 20 27 27 20 41 4e 44 20 73  path != '' AND s
d500: 74 61 74 75 73 3d 27 46 41 49 4c 27 29 2c 0a 20  tatus='FAIL'),. 
d510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d520: 70 61 73 73 5f 63 6f 75 6e 74 3d 28 53 45 4c 45  pass_count=(SELE
d530: 43 54 20 63 6f 75 6e 74 28 69 64 29 20 46 52 4f  CT count(id) FRO
d540: 4d 20 74 65 73 74 73 20 57 48 45 52 45 20 72 75  M tests WHERE ru
d550: 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 6e  n_id=? AND testn
d560: 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70  ame=? AND item_p
d570: 61 74 68 20 21 3d 20 27 27 20 41 4e 44 20 28 73  ath != '' AND (s
d580: 74 61 74 75 73 3d 27 50 41 53 53 27 20 4f 52 20  tatus='PASS' OR 
d590: 73 74 61 74 75 73 3d 27 57 41 52 4e 27 20 4f 52  status='WARN' OR
d5a0: 20 73 74 61 74 75 73 3d 27 57 41 49 56 45 44 27   status='WAIVED'
d5b0: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  )).             
d5c0: 57 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41  WHERE run_id=? A
d5d0: 4e 44 20 74 65 73 74 6e 61 6d 65 3d 3f 20 41 4e  ND testname=? AN
d5e0: 44 20 69 74 65 6d 5f 70 61 74 68 3d 27 27 3b 22  D item_path='';"
d5f0: 0a 09 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e  .. run-id test-n
d600: 61 6d 65 20 72 75 6e 2d 69 64 20 74 65 73 74 2d  ame run-id test-
d610: 6e 61 6d 65 20 72 75 6e 2d 69 64 20 74 65 73 74  name run-id test
d620: 2d 6e 61 6d 65 29 0a 20 20 20 20 20 20 20 20 3b  -name).        ;
d630: 3b 20 28 74 68 72 65 61 64 2d 73 6c 65 65 70 21  ; (thread-sleep!
d640: 20 30 2e 31 29 20 3b 3b 20 67 69 76 65 20 6f 74   0.1) ;; give ot
d650: 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 20  her processes a 
d660: 63 68 61 6e 63 65 20 68 65 72 65 2c 20 6e 6f 2c  chance here, no,
d670: 20 62 65 74 74 65 72 20 74 6f 20 62 65 20 64 6f   better to be do
d680: 6e 65 20 41 53 41 50 3f 0a 09 28 69 66 20 28 65  ne ASAP?..(if (e
d690: 71 75 61 6c 3f 20 73 74 61 74 75 73 20 22 52 55  qual? status "RU
d6a0: 4e 4e 49 4e 47 22 29 20 3b 3b 20 72 75 6e 6e 69  NNING") ;; runni
d6b0: 6e 67 20 74 61 6b 65 73 20 70 72 69 6f 72 69 74  ng takes priorit
d6c0: 79 20 6f 76 65 72 20 61 6c 6c 20 6f 74 68 65 72  y over all other
d6d0: 20 73 74 61 74 65 73 2c 20 66 6f 72 63 65 20 74   states, force t
d6e0: 68 65 20 74 65 73 74 20 73 74 61 74 65 20 74 6f  he test state to
d6f0: 20 52 55 4e 4e 49 4e 47 0a 09 20 20 20 20 28 73   RUNNING..    (s
d700: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64  qlite3:execute d
d710: 62 20 22 55 50 44 41 54 45 20 74 65 73 74 73 20  b "UPDATE tests 
d720: 53 45 54 20 73 74 61 74 65 3d 3f 20 57 48 45 52  SET state=? WHER
d730: 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74  E run_id=? AND t
d740: 65 73 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74  estname=? AND it
d750: 65 6d 5f 70 61 74 68 3d 27 27 3b 22 20 22 52 55  em_path='';" "RU
d760: 4e 4e 49 4e 47 22 20 72 75 6e 2d 69 64 20 74 65  NNING" run-id te
d770: 73 74 2d 6e 61 6d 65 29 0a 09 20 20 20 20 28 73  st-name)..    (s
d780: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 0a 09  qlite3:execute..
d790: 20 20 20 20 20 64 62 0a 09 20 20 20 20 20 22 55       db..     "U
d7a0: 50 44 41 54 45 20 74 65 73 74 73 0a 20 20 20 20  PDATE tests.    
d7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d7c0: 20 20 20 53 45 54 20 73 74 61 74 65 3d 43 41 53     SET state=CAS
d7d0: 45 20 57 48 45 4e 20 28 53 45 4c 45 43 54 20 63  E WHEN (SELECT c
d7e0: 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d 20 74 65  ount(id) FROM te
d7f0: 73 74 73 20 57 48 45 52 45 20 72 75 6e 5f 69 64  sts WHERE run_id
d800: 3d 3f 20 41 4e 44 20 74 65 73 74 6e 61 6d 65 3d  =? AND testname=
d810: 3f 20 41 4e 44 20 69 74 65 6d 5f 70 61 74 68 20  ? AND item_path 
d820: 21 3d 20 27 27 20 41 4e 44 20 73 74 61 74 65 20  != '' AND state 
d830: 69 6e 20 28 27 52 55 4e 4e 49 4e 47 27 2c 27 4e  in ('RUNNING','N
d840: 4f 54 5f 53 54 41 52 54 45 44 27 29 29 20 3e 20  OT_STARTED')) > 
d850: 30 20 54 48 45 4e 20 0a 20 20 20 20 20 20 20 20  0 THEN .        
d860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d870: 20 20 27 52 55 4e 4e 49 4e 47 27 0a 20 20 20 20    'RUNNING'.    
d880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d890: 20 20 20 45 4c 53 45 20 27 43 4f 4d 50 4c 45 54     ELSE 'COMPLET
d8a0: 45 44 27 20 45 4e 44 2c 0a 20 20 20 20 20 20 20  ED' END,.       
d8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8c0: 20 20 20 73 74 61 74 75 73 3d 43 41 53 45 20 57     status=CASE W
d8d0: 48 45 4e 20 66 61 69 6c 5f 63 6f 75 6e 74 20 3e  HEN fail_count >
d8e0: 20 30 20 54 48 45 4e 20 27 46 41 49 4c 27 20 57   0 THEN 'FAIL' W
d8f0: 48 45 4e 20 70 61 73 73 5f 63 6f 75 6e 74 20 3e  HEN pass_count >
d900: 20 30 20 41 4e 44 20 66 61 69 6c 5f 63 6f 75 6e   0 AND fail_coun
d910: 74 3d 30 20 54 48 45 4e 20 27 50 41 53 53 27 20  t=0 THEN 'PASS' 
d920: 45 4c 53 45 20 27 55 4e 4b 4e 4f 57 4e 27 20 45  ELSE 'UNKNOWN' E
d930: 4e 44 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ND.             
d940: 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 20            WHERE 
d950: 72 75 6e 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73  run_id=? AND tes
d960: 74 6e 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d  tname=? AND item
d970: 5f 70 61 74 68 3d 27 27 3b 22 0a 09 20 20 20 20  _path='';"..    
d980: 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d   run-id test-nam
d990: 65 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61  e run-id test-na
d9a0: 6d 65 29 29 0a 09 23 66 29 0a 20 20 20 20 20 20  me))..#f).      
d9b0: 23 66 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d  #f))..;;========
d9c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
d9d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
d9e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
d9f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b  ==============.;
da00: 3b 20 54 65 73 74 73 20 6d 65 74 61 20 64 61 74  ; Tests meta dat
da10: 61 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  a.;;============
da20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
da30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
da40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
da50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 72  ==========..;; r
da60: 65 61 64 20 74 68 65 20 72 65 63 6f 72 64 20 67  ead the record g
da70: 69 76 65 6e 20 61 20 74 65 73 74 6e 61 6d 65 0a  iven a testname.
da80: 28 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74  (define (db:test
da90: 6d 65 74 61 2d 67 65 74 2d 72 65 63 6f 72 64 20  meta-get-record 
daa0: 64 62 20 74 65 73 74 6e 61 6d 65 29 0a 20 20 28  db testname).  (
dab0: 6c 65 74 20 28 28 72 65 73 20 23 66 29 29 0a 20  let ((res #f)). 
dac0: 20 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72 2d     (sqlite3:for-
dad0: 65 61 63 68 2d 72 6f 77 0a 20 20 20 20 20 28 6c  each-row.     (l
dae0: 61 6d 62 64 61 20 28 69 64 20 74 65 73 74 6e 61  ambda (id testna
daf0: 6d 65 20 61 75 74 68 6f 72 20 6f 77 6e 65 72 20  me author owner 
db00: 64 65 73 63 72 69 70 74 69 6f 6e 20 72 65 76 69  description revi
db10: 65 77 65 64 20 69 74 65 72 61 74 65 64 20 61 76  ewed iterated av
db20: 67 5f 72 75 6e 74 69 6d 65 20 61 76 67 5f 64 69  g_runtime avg_di
db30: 73 6b 20 74 61 67 73 29 0a 20 20 20 20 20 20 20  sk tags).       
db40: 28 73 65 74 21 20 72 65 73 20 28 76 65 63 74 6f  (set! res (vecto
db50: 72 20 69 64 20 74 65 73 74 6e 61 6d 65 20 61 75  r id testname au
db60: 74 68 6f 72 20 6f 77 6e 65 72 20 64 65 73 63 72  thor owner descr
db70: 69 70 74 69 6f 6e 20 72 65 76 69 65 77 65 64 20  iption reviewed 
db80: 69 74 65 72 61 74 65 64 20 61 76 67 5f 72 75 6e  iterated avg_run
db90: 74 69 6d 65 20 61 76 67 5f 64 69 73 6b 20 74 61  time avg_disk ta
dba0: 67 73 29 29 29 0a 20 20 20 20 20 64 62 20 22 53  gs))).     db "S
dbb0: 45 4c 45 43 54 20 69 64 2c 74 65 73 74 6e 61 6d  ELECT id,testnam
dbc0: 65 2c 61 75 74 68 6f 72 2c 6f 77 6e 65 72 2c 64  e,author,owner,d
dbd0: 65 73 63 72 69 70 74 69 6f 6e 2c 72 65 76 69 65  escription,revie
dbe0: 77 65 64 2c 69 74 65 72 61 74 65 64 2c 61 76 67  wed,iterated,avg
dbf0: 5f 72 75 6e 74 69 6d 65 2c 61 76 67 5f 64 69 73  _runtime,avg_dis
dc00: 6b 2c 74 61 67 73 20 46 52 4f 4d 20 74 65 73 74  k,tags FROM test
dc10: 5f 6d 65 74 61 20 57 48 45 52 45 20 74 65 73 74  _meta WHERE test
dc20: 6e 61 6d 65 3d 3f 3b 22 0a 20 20 20 20 20 74 65  name=?;".     te
dc30: 73 74 6e 61 6d 65 29 0a 20 20 20 20 72 65 73 29  stname).    res)
dc40: 29 0a 0a 3b 3b 20 63 72 65 61 74 65 20 61 20 6e  )..;; create a n
dc50: 65 77 20 72 65 63 6f 72 64 20 66 6f 72 20 61 20  ew record for a 
dc60: 67 69 76 65 6e 20 74 65 73 74 6e 61 6d 65 0a 28  given testname.(
dc70: 64 65 66 69 6e 65 20 28 64 62 3a 74 65 73 74 6d  define (db:testm
dc80: 65 74 61 2d 61 64 64 2d 72 65 63 6f 72 64 20 64  eta-add-record d
dc90: 62 20 74 65 73 74 6e 61 6d 65 29 0a 20 20 28 73  b testname).  (s
dca0: 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20 64  qlite3:execute d
dcb0: 62 20 22 49 4e 53 45 52 54 20 4f 52 20 49 47 4e  b "INSERT OR IGN
dcc0: 4f 52 45 20 49 4e 54 4f 20 74 65 73 74 5f 6d 65  ORE INTO test_me
dcd0: 74 61 20 28 74 65 73 74 6e 61 6d 65 2c 61 75 74  ta (testname,aut
dce0: 68 6f 72 2c 6f 77 6e 65 72 2c 64 65 73 63 72 69  hor,owner,descri
dcf0: 70 74 69 6f 6e 2c 72 65 76 69 65 77 65 64 2c 69  ption,reviewed,i
dd00: 74 65 72 61 74 65 64 2c 61 76 67 5f 72 75 6e 74  terated,avg_runt
dd10: 69 6d 65 2c 61 76 67 5f 64 69 73 6b 2c 74 61 67  ime,avg_disk,tag
dd20: 73 29 20 56 41 4c 55 45 53 20 28 3f 2c 27 27 2c  s) VALUES (?,'',
dd30: 27 27 2c 27 27 2c 27 27 2c 27 27 2c 27 27 2c 27  '','','','','','
dd40: 27 2c 27 27 29 3b 22 20 74 65 73 74 6e 61 6d 65  ','');" testname
dd50: 29 29 0a 0a 3b 3b 20 75 70 64 61 74 65 20 6f 6e  ))..;; update on
dd60: 65 20 6f 66 20 74 68 65 20 74 65 73 74 6d 65 74  e of the testmet
dd70: 61 20 66 69 65 6c 64 73 0a 28 64 65 66 69 6e 65  a fields.(define
dd80: 20 28 64 62 3a 74 65 73 74 6d 65 74 61 2d 75 70   (db:testmeta-up
dd90: 64 61 74 65 2d 66 69 65 6c 64 20 64 62 20 74 65  date-field db te
dda0: 73 74 6e 61 6d 65 20 66 69 65 6c 64 20 76 61 6c  stname field val
ddb0: 75 65 29 0a 20 20 28 73 71 6c 69 74 65 33 3a 65  ue).  (sqlite3:e
ddc0: 78 65 63 75 74 65 20 64 62 20 28 63 6f 6e 63 20  xecute db (conc 
ddd0: 22 55 50 44 41 54 45 20 74 65 73 74 5f 6d 65 74  "UPDATE test_met
dde0: 61 20 53 45 54 20 22 20 66 69 65 6c 64 20 22 3d  a SET " field "=
ddf0: 3f 20 57 48 45 52 45 20 74 65 73 74 6e 61 6d 65  ? WHERE testname
de00: 3d 3f 3b 22 29 20 76 61 6c 75 65 20 74 65 73 74  =?;") value test
de10: 6e 61 6d 65 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d  name))..;;======
de20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
de30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
de40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
de50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
de60: 0a 3b 3b 20 54 20 45 20 53 20 54 20 20 20 44 20  .;; T E S T   D 
de70: 41 20 54 20 41 20 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d  A T A .;;=======
de80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
de90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
dea0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
deb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a  ===============.
dec0: 0a 28 64 65 66 69 6e 65 20 28 64 62 3a 63 73 76  .(define (db:csv
ded0: 2d 3e 74 65 73 74 2d 64 61 74 61 20 64 62 20 74  ->test-data db t
dee0: 65 73 74 2d 69 64 20 63 73 76 64 61 74 61 29 0a  est-id csvdata).
def0: 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34    (debug:print 4
df00: 20 22 74 65 73 74 2d 69 64 20 22 20 74 65 73 74   "test-id " test
df10: 2d 69 64 20 22 2c 20 63 73 76 64 61 74 61 3a 20  -id ", csvdata: 
df20: 22 20 63 73 76 64 61 74 61 29 0a 20 20 28 6c 65  " csvdata).  (le
df30: 74 20 28 28 74 64 62 20 20 20 20 20 28 64 62 3a  t ((tdb     (db:
df40: 6f 70 65 6e 2d 74 65 73 74 2d 64 62 2d 62 79 2d  open-test-db-by-
df50: 74 65 73 74 2d 69 64 20 64 62 20 74 65 73 74 2d  test-id db test-
df60: 69 64 29 29 29 0a 20 20 20 20 28 69 66 20 74 64  id))).    (if td
df70: 62 0a 09 28 6c 65 74 20 28 28 63 73 76 6c 69 73  b..(let ((csvlis
df80: 74 20 28 63 73 76 2d 3e 6c 69 73 74 20 28 6d 61  t (csv->list (ma
df90: 6b 65 2d 63 73 76 2d 72 65 61 64 65 72 0a 09 09  ke-csv-reader...
dfa0: 09 09 20 20 20 28 6f 70 65 6e 2d 69 6e 70 75 74  ..   (open-input
dfb0: 2d 73 74 72 69 6e 67 20 63 73 76 64 61 74 61 29  -string csvdata)
dfc0: 0a 09 09 09 09 20 20 20 27 28 28 73 74 72 69 70  .....   '((strip
dfd0: 2d 6c 65 61 64 69 6e 67 2d 77 68 69 74 65 73 70  -leading-whitesp
dfe0: 61 63 65 3f 20 23 74 29 0a 09 09 09 09 20 20 20  ace? #t).....   
dff0: 20 20 28 73 74 72 69 70 2d 74 72 61 69 6c 69 6e    (strip-trailin
e000: 67 2d 77 68 69 74 65 73 70 61 63 65 3f 20 23 74  g-whitespace? #t
e010: 29 29 20 29 29 29 29 20 3b 3b 20 28 63 73 76 2d  )) )))) ;; (csv-
e020: 3e 6c 69 73 74 20 63 73 76 64 61 74 61 29 29 29  >list csvdata)))
e030: 0a 09 20 20 28 66 6f 72 2d 65 61 63 68 20 0a 09  ..  (for-each ..
e040: 20 20 20 28 6c 61 6d 62 64 61 20 28 63 73 76 72     (lambda (csvr
e050: 6f 77 29 0a 09 20 20 20 20 20 28 6c 65 74 2a 20  ow)..     (let* 
e060: 28 28 70 61 64 64 65 64 2d 72 6f 77 20 20 28 74  ((padded-row  (t
e070: 61 6b 65 20 28 61 70 70 65 6e 64 20 63 73 76 72  ake (append csvr
e080: 6f 77 20 28 6c 69 73 74 20 23 66 20 23 66 20 23  ow (list #f #f #
e090: 66 20 23 66 20 23 66 20 23 66 20 23 66 20 23 66  f #f #f #f #f #f
e0a0: 20 23 66 29 29 20 39 29 29 0a 09 09 20 20 20 20   #f)) 9))...    
e0b0: 28 63 61 74 65 67 6f 72 79 20 20 20 20 28 6c 69  (category    (li
e0c0: 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d 72 6f  st-ref padded-ro
e0d0: 77 20 30 29 29 0a 09 09 20 20 20 20 28 76 61 72  w 0))...    (var
e0e0: 69 61 62 6c 65 20 20 20 20 28 6c 69 73 74 2d 72  iable    (list-r
e0f0: 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20 31 29  ef padded-row 1)
e100: 29 0a 09 09 20 20 20 20 28 76 61 6c 75 65 20 20  )...    (value  
e110: 20 20 20 20 20 28 61 6e 79 2d 3e 6e 75 6d 62 65       (any->numbe
e120: 72 2d 69 66 2d 70 6f 73 73 69 62 6c 65 20 28 6c  r-if-possible (l
e130: 69 73 74 2d 72 65 66 20 70 61 64 64 65 64 2d 72  ist-ref padded-r
e140: 6f 77 20 32 29 29 29 0a 09 09 20 20 20 20 28 65  ow 2)))...    (e
e150: 78 70 65 63 74 65 64 20 20 20 20 28 61 6e 79 2d  xpected    (any-
e160: 3e 6e 75 6d 62 65 72 2d 69 66 2d 70 6f 73 73 69  >number-if-possi
e170: 62 6c 65 20 28 6c 69 73 74 2d 72 65 66 20 70 61  ble (list-ref pa
e180: 64 64 65 64 2d 72 6f 77 20 33 29 29 29 0a 09 09  dded-row 3)))...
e190: 20 20 20 20 28 74 6f 6c 20 20 20 20 20 20 20 20      (tol        
e1a0: 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 2d 69 66   (any->number-if
e1b0: 2d 70 6f 73 73 69 62 6c 65 20 28 6c 69 73 74 2d  -possible (list-
e1c0: 72 65 66 20 70 61 64 64 65 64 2d 72 6f 77 20 34  ref padded-row 4
e1d0: 29 29 29 20 3b 3b 20 3e 2c 20 3c 2c 20 3e 3d 2c  ))) ;; >, <, >=,
e1e0: 20 3c 3d 2c 20 6f 72 20 61 20 6e 75 6d 62 65 72   <=, or a number
e1f0: 0a 09 09 20 20 20 20 28 75 6e 69 74 73 20 20 20  ...    (units   
e200: 20 20 20 20 28 6c 69 73 74 2d 72 65 66 20 70 61      (list-ref pa
e210: 64 64 65 64 2d 72 6f 77 20 35 29 29 0a 09 09 20  dded-row 5))... 
e220: 20 20 20 28 63 6f 6d 6d 65 6e 74 20 20 20 20 20     (comment     
e230: 28 6c 69 73 74 2d 72 65 66 20 70 61 64 64 65 64  (list-ref padded
e240: 2d 72 6f 77 20 36 29 29 0a 09 09 20 20 20 20 28  -row 6))...    (
e250: 73 74 61 74 75 73 20 20 20 20 20 20 28 6c 65 74  status      (let
e260: 20 28 28 73 20 28 6c 69 73 74 2d 72 65 66 20 70   ((s (list-ref p
e270: 61 64 64 65 64 2d 72 6f 77 20 37 29 29 29 0a 09  added-row 7)))..
e280: 09 09 09 20 20 20 28 69 66 20 28 61 6e 64 20 28  ...   (if (and (
e290: 73 74 72 69 6e 67 3f 20 73 29 28 6f 72 20 28 73  string? s)(or (s
e2a0: 74 72 69 6e 67 2d 6d 61 74 63 68 20 28 72 65 67  tring-match (reg
e2b0: 65 78 70 20 22 5e 5c 5c 73 2a 24 22 29 20 73 29  exp "^\\s*$") s)
e2c0: 0a 09 09 09 09 09 09 09 20 20 20 28 73 74 72 69  ........   (stri
e2d0: 6e 67 2d 6d 61 74 63 68 20 28 72 65 67 65 78 70  ng-match (regexp
e2e0: 20 22 5e 6e 2f 61 24 22 29 20 73 29 29 29 0a 09   "^n/a$") s)))..
e2f0: 09 09 09 20 20 20 20 20 20 20 23 66 0a 09 09 09  ...       #f....
e300: 09 20 20 20 20 20 20 20 73 29 29 29 20 3b 3b 20  .       s))) ;; 
e310: 69 66 20 73 70 65 63 69 66 69 65 64 20 6f 6e 20  if specified on 
e320: 74 68 65 20 69 6e 70 75 74 20 74 68 65 6e 20 75  the input then u
e330: 73 65 2c 20 65 6c 73 65 20 63 61 6c 63 75 6c 61  se, else calcula
e340: 74 65 0a 09 09 20 20 20 20 28 74 79 70 65 20 20  te...    (type  
e350: 20 20 20 20 20 20 28 6c 69 73 74 2d 72 65 66 20        (list-ref 
e360: 70 61 64 64 65 64 2d 72 6f 77 20 38 29 29 29 0a  padded-row 8))).
e370: 09 20 20 20 20 20 20 20 3b 3b 20 6c 6f 6f 6b 20  .       ;; look 
e380: 75 70 20 65 78 70 65 63 74 65 64 2c 74 6f 6c 2c  up expected,tol,
e390: 75 6e 69 74 73 20 66 72 6f 6d 20 70 72 65 76 69  units from previ
e3a0: 6f 75 73 20 62 65 73 74 20 66 69 74 20 74 65 73  ous best fit tes
e3b0: 74 20 69 66 20 74 68 65 79 20 61 72 65 20 61 6c  t if they are al
e3c0: 6c 20 65 69 74 68 65 72 20 23 66 20 6f 72 20 27  l either #f or '
e3d0: 27 0a 09 20 20 20 20 20 20 20 28 64 65 62 75 67  '..       (debug
e3e0: 3a 70 72 69 6e 74 20 34 20 22 42 45 46 4f 52 45  :print 4 "BEFORE
e3f0: 3a 20 63 61 74 65 67 6f 72 79 3a 20 22 20 63 61  : category: " ca
e400: 74 65 67 6f 72 79 20 22 20 76 61 72 69 61 62 6c  tegory " variabl
e410: 65 3a 20 22 20 76 61 72 69 61 62 6c 65 20 22 20  e: " variable " 
e420: 76 61 6c 75 65 3a 20 22 20 76 61 6c 75 65 20 0a  value: " value .
e430: 09 09 09 20 20 20 20 22 2c 20 65 78 70 65 63 74  ...    ", expect
e440: 65 64 3a 20 22 20 65 78 70 65 63 74 65 64 20 22  ed: " expected "
e450: 20 74 6f 6c 3a 20 22 20 74 6f 6c 20 22 20 75 6e   tol: " tol " un
e460: 69 74 73 3a 20 22 20 75 6e 69 74 73 20 22 20 73  its: " units " s
e470: 74 61 74 75 73 3a 20 22 20 73 74 61 74 75 73 20  tatus: " status 
e480: 22 20 63 6f 6d 6d 65 6e 74 3a 20 22 20 63 6f 6d  " comment: " com
e490: 6d 65 6e 74 20 22 20 74 79 70 65 3a 20 22 20 74  ment " type: " t
e4a0: 79 70 65 29 0a 0a 09 20 20 20 20 20 20 20 28 69  ype)...       (i
e4b0: 66 20 28 61 6e 64 20 28 6f 72 20 28 6e 6f 74 20  f (and (or (not 
e4c0: 65 78 70 65 63 74 65 64 29 28 65 71 75 61 6c 3f  expected)(equal?
e4d0: 20 65 78 70 65 63 74 65 64 20 22 22 29 29 0a 09   expected ""))..
e4e0: 09 09 28 6f 72 20 28 6e 6f 74 20 74 6f 6c 29 20  ..(or (not tol) 
e4f0: 20 20 20 20 28 65 71 75 61 6c 3f 20 65 78 70 65      (equal? expe
e500: 63 74 65 64 20 22 22 29 29 0a 09 09 09 28 6f 72  cted ""))....(or
e510: 20 28 6e 6f 74 20 75 6e 69 74 73 29 20 20 20 28   (not units)   (
e520: 65 71 75 61 6c 3f 20 65 78 70 65 63 74 65 64 20  equal? expected 
e530: 22 22 29 29 29 0a 09 09 20 20 20 28 6c 65 74 2d  "")))...   (let-
e540: 76 61 6c 75 65 73 20 28 28 28 6e 65 77 2d 65 78  values (((new-ex
e550: 70 65 63 74 65 64 20 6e 65 77 2d 74 6f 6c 20 6e  pected new-tol n
e560: 65 77 2d 75 6e 69 74 73 29 28 64 62 3a 67 65 74  ew-units)(db:get
e570: 2d 70 72 65 76 2d 74 6f 6c 2d 66 6f 72 2d 74 65  -prev-tol-for-te
e580: 73 74 20 64 62 20 74 65 73 74 2d 69 64 20 63 61  st db test-id ca
e590: 74 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65 29  tegory variable)
e5a0: 29 29 0a 09 09 09 20 20 20 20 20 20 20 28 73 65  ))....       (se
e5b0: 74 21 20 65 78 70 65 63 74 65 64 20 6e 65 77 2d  t! expected new-
e5c0: 65 78 70 65 63 74 65 64 29 0a 09 09 09 20 20 20  expected)....   
e5d0: 20 20 20 20 28 73 65 74 21 20 74 6f 6c 20 20 20      (set! tol   
e5e0: 20 20 20 6e 65 77 2d 74 6f 6c 29 0a 09 09 09 20     new-tol).... 
e5f0: 20 20 20 20 20 20 28 73 65 74 21 20 75 6e 69 74        (set! unit
e600: 73 20 20 20 20 6e 65 77 2d 75 6e 69 74 73 29 29  s    new-units))
e610: 29 0a 0a 09 20 20 20 20 20 20 20 28 64 65 62 75  )...       (debu
e620: 67 3a 70 72 69 6e 74 20 34 20 22 41 46 54 45 52  g:print 4 "AFTER
e630: 3a 20 20 63 61 74 65 67 6f 72 79 3a 20 22 20 63  :  category: " c
e640: 61 74 65 67 6f 72 79 20 22 20 76 61 72 69 61 62  ategory " variab
e650: 6c 65 3a 20 22 20 76 61 72 69 61 62 6c 65 20 22  le: " variable "
e660: 20 76 61 6c 75 65 3a 20 22 20 76 61 6c 75 65 20   value: " value 
e670: 0a 09 09 09 20 20 20 20 22 2c 20 65 78 70 65 63  ....    ", expec
e680: 74 65 64 3a 20 22 20 65 78 70 65 63 74 65 64 20  ted: " expected 
e690: 22 20 74 6f 6c 3a 20 22 20 74 6f 6c 20 22 20 75  " tol: " tol " u
e6a0: 6e 69 74 73 3a 20 22 20 75 6e 69 74 73 20 22 20  nits: " units " 
e6b0: 73 74 61 74 75 73 3a 20 22 20 73 74 61 74 75 73  status: " status
e6c0: 20 22 20 63 6f 6d 6d 65 6e 74 3a 20 22 20 63 6f   " comment: " co
e6d0: 6d 6d 65 6e 74 29 0a 09 20 20 20 20 20 20 20 3b  mment)..       ;
e6e0: 3b 20 63 61 6c 63 75 6c 61 74 65 20 73 74 61 74  ; calculate stat
e6f0: 75 73 20 69 66 20 4e 4f 54 20 73 70 65 63 69 66  us if NOT specif
e700: 69 65 64 0a 09 20 20 20 20 20 20 20 28 69 66 20  ied..       (if 
e710: 28 61 6e 64 20 28 6e 6f 74 20 73 74 61 74 75 73  (and (not status
e720: 29 28 6e 75 6d 62 65 72 3f 20 65 78 70 65 63 74  )(number? expect
e730: 65 64 29 28 6e 75 6d 62 65 72 3f 20 76 61 6c 75  ed)(number? valu
e740: 65 29 29 20 3b 3b 20 6e 65 65 64 20 65 78 70 65  e)) ;; need expe
e750: 63 74 65 64 20 61 6e 64 20 76 61 6c 75 65 20 74  cted and value t
e760: 6f 20 62 65 20 6e 75 6d 62 65 72 73 0a 09 09 20  o be numbers... 
e770: 20 20 28 69 66 20 28 6e 75 6d 62 65 72 3f 20 74    (if (number? t
e780: 6f 6c 29 20 3b 3b 20 69 66 20 74 6f 6c 20 69 73  ol) ;; if tol is
e790: 20 61 20 6e 75 6d 62 65 72 20 74 68 65 6e 20 77   a number then w
e7a0: 65 20 64 6f 20 74 68 65 20 73 74 61 6e 64 61 72  e do the standar
e7b0: 64 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 09 09 20  d comparison... 
e7c0: 20 20 20 20 20 20 28 6c 65 74 2a 20 28 28 6d 61        (let* ((ma
e7d0: 78 2d 76 61 6c 20 28 2b 20 65 78 70 65 63 74 65  x-val (+ expecte
e7e0: 64 20 74 6f 6c 29 29 0a 09 09 09 20 20 20 20 20  d tol))....     
e7f0: 20 28 6d 69 6e 2d 76 61 6c 20 28 2d 20 65 78 70   (min-val (- exp
e800: 65 63 74 65 64 20 74 6f 6c 29 29 0a 09 09 09 20  ected tol)).... 
e810: 20 20 20 20 20 28 72 65 73 75 6c 74 20 20 28 61       (result  (a
e820: 6e 64 20 28 3e 3d 20 20 76 61 6c 75 65 20 6d 69  nd (>=  value mi
e830: 6e 2d 76 61 6c 29 28 3c 3d 20 76 61 6c 75 65 20  n-val)(<= value 
e840: 6d 61 78 2d 76 61 6c 29 29 29 29 0a 09 09 09 20  max-val)))).... 
e850: 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34 20 22  (debug:print 4 "
e860: 6d 61 78 2d 76 61 6c 3a 20 22 20 6d 61 78 2d 76  max-val: " max-v
e870: 61 6c 20 22 20 6d 69 6e 2d 76 61 6c 3a 20 22 20  al " min-val: " 
e880: 6d 69 6e 2d 76 61 6c 20 22 20 72 65 73 75 6c 74  min-val " result
e890: 3a 20 22 20 72 65 73 75 6c 74 29 0a 09 09 09 20  : " result).... 
e8a0: 28 73 65 74 21 20 73 74 61 74 75 73 20 28 69 66  (set! status (if
e8b0: 20 72 65 73 75 6c 74 20 22 70 61 73 73 22 20 22   result "pass" "
e8c0: 66 61 69 6c 22 29 29 29 0a 09 09 20 20 20 20 20  fail")))...     
e8d0: 20 20 28 73 65 74 21 20 73 74 61 74 75 73 20 3b    (set! status ;
e8e0: 3b 20 4e 42 2f 2f 20 6e 65 65 64 20 74 6f 20 61  ; NB// need to a
e8f0: 73 73 65 73 73 20 65 61 63 68 20 6f 6e 65 20 28  ssess each one (
e900: 69 2e 65 2e 20 6e 6f 74 20 72 65 74 75 72 6e 20  i.e. not return 
e910: 6f 70 65 72 61 74 6f 72 20 73 69 6e 63 65 20 6e  operator since n
e920: 65 65 64 20 74 6f 20 61 63 74 20 69 66 20 6e 6f  eed to act if no
e930: 74 20 76 61 6c 69 64 20 6f 70 2e 0a 09 09 09 20  t valid op..... 
e940: 20 20 20 20 28 63 61 73 65 20 28 73 74 72 69 6e      (case (strin
e950: 67 2d 3e 73 79 6d 62 6f 6c 20 74 6f 6c 29 20 3b  g->symbol tol) ;
e960: 3b 20 74 6f 6c 20 73 68 6f 75 6c 64 20 62 65 20  ; tol should be 
e970: 3e 2c 20 3c 2c 20 3e 3d 2c 20 3c 3d 0a 09 09 09  >, <, >=, <=....
e980: 20 20 20 20 20 20 20 28 28 3e 29 20 20 28 69 66         ((>)  (if
e990: 20 28 3e 20 20 76 61 6c 75 65 20 65 78 70 65 63   (>  value expec
e9a0: 74 65 64 29 20 22 70 61 73 73 22 20 22 66 61 69  ted) "pass" "fai
e9b0: 6c 22 29 29 0a 09 09 09 20 20 20 20 20 20 20 28  l"))....       (
e9c0: 28 3c 29 20 20 28 69 66 20 28 3c 20 20 76 61 6c  (<)  (if (<  val
e9d0: 75 65 20 65 78 70 65 63 74 65 64 29 20 22 70 61  ue expected) "pa
e9e0: 73 73 22 20 22 66 61 69 6c 22 29 29 0a 09 09 09  ss" "fail"))....
e9f0: 20 20 20 20 20 20 20 28 28 3e 3d 29 20 28 69 66         ((>=) (if
ea00: 20 28 3e 3d 20 76 61 6c 75 65 20 65 78 70 65 63   (>= value expec
ea10: 74 65 64 29 20 22 70 61 73 73 22 20 22 66 61 69  ted) "pass" "fai
ea20: 6c 22 29 29 0a 09 09 09 20 20 20 20 20 20 20 28  l"))....       (
ea30: 28 3c 3d 29 20 28 69 66 20 28 3c 3d 20 76 61 6c  (<=) (if (<= val
ea40: 75 65 20 65 78 70 65 63 74 65 64 29 20 22 70 61  ue expected) "pa
ea50: 73 73 22 20 22 66 61 69 6c 22 29 29 0a 09 09 09  ss" "fail"))....
ea60: 20 20 20 20 20 20 20 28 65 6c 73 65 20 28 63 6f         (else (co
ea70: 6e 63 20 22 45 52 52 4f 52 3a 20 62 61 64 20 74  nc "ERROR: bad t
ea80: 6f 6c 20 63 6f 6d 70 61 72 61 74 6f 72 20 22 20  ol comparator " 
ea90: 74 6f 6c 29 29 29 29 29 29 0a 09 20 20 20 20 20  tol))))))..     
eaa0: 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34    (debug:print 4
eab0: 20 22 41 46 54 45 52 32 3a 20 63 61 74 65 67 6f   "AFTER2: catego
eac0: 72 79 3a 20 22 20 63 61 74 65 67 6f 72 79 20 22  ry: " category "
ead0: 20 76 61 72 69 61 62 6c 65 3a 20 22 20 76 61 72   variable: " var
eae0: 69 61 62 6c 65 20 22 20 76 61 6c 75 65 3a 20 22  iable " value: "
eaf0: 20 76 61 6c 75 65 20 0a 09 09 09 20 20 20 20 22   value ....    "
eb00: 2c 20 65 78 70 65 63 74 65 64 3a 20 22 20 65 78  , expected: " ex
eb10: 70 65 63 74 65 64 20 22 20 74 6f 6c 3a 20 22 20  pected " tol: " 
eb20: 74 6f 6c 20 22 20 75 6e 69 74 73 3a 20 22 20 75  tol " units: " u
eb30: 6e 69 74 73 20 22 20 73 74 61 74 75 73 3a 20 22  nits " status: "
eb40: 20 73 74 61 74 75 73 20 22 20 63 6f 6d 6d 65 6e   status " commen
eb50: 74 3a 20 22 20 63 6f 6d 6d 65 6e 74 29 0a 09 20  t: " comment).. 
eb60: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 3a 65        (sqlite3:e
eb70: 78 65 63 75 74 65 20 74 64 62 20 22 49 4e 53 45  xecute tdb "INSE
eb80: 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20 49 4e  RT OR REPLACE IN
eb90: 54 4f 20 74 65 73 74 5f 64 61 74 61 20 28 74 65  TO test_data (te
eba0: 73 74 5f 69 64 2c 63 61 74 65 67 6f 72 79 2c 76  st_id,category,v
ebb0: 61 72 69 61 62 6c 65 2c 76 61 6c 75 65 2c 65 78  ariable,value,ex
ebc0: 70 65 63 74 65 64 2c 74 6f 6c 2c 75 6e 69 74 73  pected,tol,units
ebd0: 2c 63 6f 6d 6d 65 6e 74 2c 73 74 61 74 75 73 2c  ,comment,status,
ebe0: 74 79 70 65 29 20 56 41 4c 55 45 53 20 28 3f 2c  type) VALUES (?,
ebf0: 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c  ?,?,?,?,?,?,?,?,
ec00: 3f 29 3b 22 0a 09 09 09 09 74 65 73 74 2d 69 64  ?);".....test-id
ec10: 20 63 61 74 65 67 6f 72 79 20 76 61 72 69 61 62   category variab
ec20: 6c 65 20 76 61 6c 75 65 20 65 78 70 65 63 74 65  le value expecte
ec30: 64 20 74 6f 6c 20 75 6e 69 74 73 20 28 69 66 20  d tol units (if 
ec40: 63 6f 6d 6d 65 6e 74 20 63 6f 6d 6d 65 6e 74 20  comment comment 
ec50: 22 22 29 20 73 74 61 74 75 73 20 74 79 70 65 29  "") status type)
ec60: 0a 09 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ..       (sqlite
ec70: 33 3a 66 69 6e 61 6c 69 7a 65 21 20 74 64 62 29  3:finalize! tdb)
ec80: 29 29 0a 09 20 20 20 63 73 76 6c 69 73 74 29 29  ))..   csvlist))
ec90: 29 29 29 0a 0a 3b 3b 20 67 65 74 20 61 20 6c 69  )))..;; get a li
eca0: 73 74 20 6f 66 20 74 65 73 74 5f 64 61 74 61 20  st of test_data 
ecb0: 72 65 63 6f 72 64 73 20 6d 61 74 63 68 69 6e 67  records matching
ecc0: 20 63 61 74 65 67 6f 72 79 70 61 74 74 0a 28 64   categorypatt.(d
ecd0: 65 66 69 6e 65 20 28 64 62 3a 72 65 61 64 2d 74  efine (db:read-t
ece0: 65 73 74 2d 64 61 74 61 20 64 62 20 74 65 73 74  est-data db test
ecf0: 2d 69 64 20 63 61 74 65 67 6f 72 79 70 61 74 74  -id categorypatt
ed00: 29 0a 20 20 28 6c 65 74 20 28 28 74 64 62 20 20  ).  (let ((tdb  
ed10: 28 64 62 3a 6f 70 65 6e 2d 74 65 73 74 2d 64 62  (db:open-test-db
ed20: 2d 62 79 2d 74 65 73 74 2d 69 64 20 64 62 20 74  -by-test-id db t
ed30: 65 73 74 2d 69 64 29 29 29 0a 20 20 20 20 28 69  est-id))).    (i
ed40: 66 20 74 64 62 0a 09 28 6c 65 74 20 28 28 72 65  f tdb..(let ((re
ed50: 73 20 27 28 29 29 29 0a 09 20 20 28 73 71 6c 69  s '()))..  (sqli
ed60: 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77  te3:for-each-row
ed70: 20 0a 09 20 20 20 28 6c 61 6d 62 64 61 20 28 69   ..   (lambda (i
ed80: 64 20 74 65 73 74 5f 69 64 20 63 61 74 65 67 6f  d test_id catego
ed90: 72 79 20 76 61 72 69 61 62 6c 65 20 76 61 6c 75  ry variable valu
eda0: 65 20 65 78 70 65 63 74 65 64 20 74 6f 6c 20 75  e expected tol u
edb0: 6e 69 74 73 20 63 6f 6d 6d 65 6e 74 20 73 74 61  nits comment sta
edc0: 74 75 73 20 74 79 70 65 29 0a 09 20 20 20 20 20  tus type)..     
edd0: 28 73 65 74 21 20 72 65 73 20 28 63 6f 6e 73 20  (set! res (cons 
ede0: 28 76 65 63 74 6f 72 20 69 64 20 74 65 73 74 5f  (vector id test_
edf0: 69 64 20 63 61 74 65 67 6f 72 79 20 76 61 72 69  id category vari
ee00: 61 62 6c 65 20 76 61 6c 75 65 20 65 78 70 65 63  able value expec
ee10: 74 65 64 20 74 6f 6c 20 75 6e 69 74 73 20 63 6f  ted tol units co
ee20: 6d 6d 65 6e 74 20 73 74 61 74 75 73 20 74 79 70  mment status typ
ee30: 65 29 20 72 65 73 29 29 29 0a 09 20 20 20 74 64  e) res)))..   td
ee40: 62 0a 09 20 20 20 22 53 45 4c 45 43 54 20 69 64  b..   "SELECT id
ee50: 2c 74 65 73 74 5f 69 64 2c 63 61 74 65 67 6f 72  ,test_id,categor
ee60: 79 2c 76 61 72 69 61 62 6c 65 2c 76 61 6c 75 65  y,variable,value
ee70: 2c 65 78 70 65 63 74 65 64 2c 74 6f 6c 2c 75 6e  ,expected,tol,un
ee80: 69 74 73 2c 63 6f 6d 6d 65 6e 74 2c 73 74 61 74  its,comment,stat
ee90: 75 73 2c 74 79 70 65 20 46 52 4f 4d 20 74 65 73  us,type FROM tes
eea0: 74 5f 64 61 74 61 20 57 48 45 52 45 20 74 65 73  t_data WHERE tes
eeb0: 74 5f 69 64 3d 3f 20 41 4e 44 20 63 61 74 65 67  t_id=? AND categ
eec0: 6f 72 79 20 4c 49 4b 45 20 3f 20 4f 52 44 45 52  ory LIKE ? ORDER
eed0: 20 42 59 20 63 61 74 65 67 6f 72 79 2c 76 61 72   BY category,var
eee0: 69 61 62 6c 65 3b 22 20 74 65 73 74 2d 69 64 20  iable;" test-id 
eef0: 63 61 74 65 67 6f 72 79 70 61 74 74 29 0a 09 20  categorypatt).. 
ef00: 20 28 73 71 6c 69 74 65 33 3a 66 69 6e 61 6c 69   (sqlite3:finali
ef10: 7a 65 21 20 74 64 62 29 0a 09 20 20 28 72 65 76  ze! tdb)..  (rev
ef20: 65 72 73 65 20 72 65 73 29 29 0a 09 27 28 29 29  erse res))..'())
ef30: 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 64 62 3a  ))..(define (db:
ef40: 6c 6f 61 64 2d 74 65 73 74 2d 64 61 74 61 20 64  load-test-data d
ef50: 62 20 74 65 73 74 2d 69 64 29 0a 20 20 28 6c 65  b test-id).  (le
ef60: 74 20 6c 6f 6f 70 20 28 28 6c 69 6e 20 28 72 65  t loop ((lin (re
ef70: 61 64 2d 6c 69 6e 65 29 29 29 0a 20 20 20 20 28  ad-line))).    (
ef80: 69 66 20 28 6e 6f 74 20 28 65 6f 66 2d 6f 62 6a  if (not (eof-obj
ef90: 65 63 74 3f 20 6c 69 6e 29 29 0a 09 28 62 65 67  ect? lin))..(beg
efa0: 69 6e 0a 09 20 20 28 64 65 62 75 67 3a 70 72 69  in..  (debug:pri
efb0: 6e 74 20 34 20 6c 69 6e 29 0a 09 20 20 28 64 62  nt 4 lin)..  (db
efc0: 3a 63 73 76 2d 3e 74 65 73 74 2d 64 61 74 61 20  :csv->test-data 
efd0: 64 62 20 74 65 73 74 2d 69 64 20 6c 69 6e 29 0a  db test-id lin).
efe0: 09 20 20 28 6c 6f 6f 70 20 28 72 65 61 64 2d 6c  .  (loop (read-l
eff0: 69 6e 65 29 29 29 29 29 0a 20 20 3b 3b 20 72 6f  ine))))).  ;; ro
f000: 6c 6c 20 75 70 20 74 68 65 20 63 75 72 72 65 6e  ll up the curren
f010: 74 20 72 65 73 75 6c 74 73 2e 0a 20 20 3b 3b 20  t results..  ;; 
f020: 46 49 58 4d 45 3a 20 41 64 64 20 74 68 65 20 73  FIXME: Add the s
f030: 74 61 74 75 73 20 74 6f 20 0a 20 20 28 64 62 3a  tatus to .  (db:
f040: 74 65 73 74 2d 64 61 74 61 2d 72 6f 6c 6c 75 70  test-data-rollup
f050: 20 64 62 20 74 65 73 74 2d 69 64 20 23 66 29 29   db test-id #f))
f060: 0a 0a 3b 3b 20 57 41 52 4e 49 4e 47 3a 20 44 6f  ..;; WARNING: Do
f070: 20 4e 4f 54 20 63 61 6c 6c 20 74 68 69 73 20 66   NOT call this f
f080: 6f 72 20 74 68 65 20 70 61 72 65 6e 74 20 74 65  or the parent te
f090: 73 74 20 6f 6e 20 61 6e 20 69 74 65 72 61 74 65  st on an iterate
f0a0: 64 20 74 65 73 74 0a 3b 3b 20 52 6f 6c 6c 20 75  d test.;; Roll u
f0b0: 70 20 74 65 73 74 5f 64 61 74 61 20 70 61 73 73  p test_data pass
f0c0: 2f 66 61 69 6c 20 72 65 73 75 6c 74 73 0a 3b 3b  /fail results.;;
f0d0: 20 6c 6f 6f 6b 20 61 74 20 74 68 65 20 74 65 73   look at the tes
f0e0: 74 5f 64 61 74 61 20 73 74 61 74 75 73 20 66 69  t_data status fi
f0f0: 65 6c 64 2c 20 0a 3b 3b 20 20 20 20 69 66 20 61  eld, .;;    if a
f100: 6c 6c 20 61 72 65 20 70 61 73 73 20 28 61 6e 79  ll are pass (any
f110: 20 63 61 73 65 29 20 61 6e 64 20 74 68 65 20 74   case) and the t
f120: 65 73 74 20 73 74 61 74 75 73 20 69 73 20 50 41  est status is PA
f130: 53 53 20 6f 72 20 4e 55 4c 4c 20 6f 72 20 27 27  SS or NULL or ''
f140: 20 74 68 65 6e 20 73 65 74 20 74 65 73 74 20 73   then set test s
f150: 74 61 74 75 73 20 74 6f 20 50 41 53 53 2e 0a 3b  tatus to PASS..;
f160: 3b 20 20 20 20 69 66 20 6f 6e 65 20 6f 72 20 6d  ;    if one or m
f170: 6f 72 65 20 61 72 65 20 66 61 69 6c 20 28 61 6e  ore are fail (an
f180: 79 20 63 61 73 65 29 20 74 68 65 6e 20 73 65 74  y case) then set
f190: 20 74 65 73 74 20 73 74 61 74 75 73 20 74 6f 20   test status to 
f1a0: 50 41 53 53 2c 20 6e 6f 6e 20 22 70 61 73 73 22  PASS, non "pass"
f1b0: 20 6f 72 20 22 66 61 69 6c 22 20 61 72 65 20 69   or "fail" are i
f1c0: 67 6e 6f 72 65 64 0a 28 64 65 66 69 6e 65 20 28  gnored.(define (
f1d0: 64 62 3a 74 65 73 74 2d 64 61 74 61 2d 72 6f 6c  db:test-data-rol
f1e0: 6c 75 70 20 64 62 20 74 65 73 74 2d 69 64 20 73  lup db test-id s
f1f0: 74 61 74 75 73 29 0a 20 20 28 6c 65 74 20 28 28  tatus).  (let ((
f200: 74 64 62 20 28 6f 70 65 6e 2d 72 75 6e 2d 63 6c  tdb (open-run-cl
f210: 6f 73 65 20 64 62 3a 6f 70 65 6e 2d 74 65 73 74  ose db:open-test
f220: 2d 64 62 2d 62 79 2d 74 65 73 74 2d 69 64 20 64  -db-by-test-id d
f230: 62 20 74 65 73 74 2d 69 64 29 29 0a 09 28 66 61  b test-id))..(fa
f240: 69 6c 2d 63 6f 75 6e 74 20 30 29 0a 09 28 70 61  il-count 0)..(pa
f250: 73 73 2d 63 6f 75 6e 74 20 30 29 29 0a 20 20 20  ss-count 0)).   
f260: 20 28 69 66 20 74 64 62 0a 09 28 62 65 67 69 6e   (if tdb..(begin
f270: 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 66 6f 72  ..  (sqlite3:for
f280: 2d 65 61 63 68 2d 72 6f 77 0a 09 20 20 20 28 6c  -each-row..   (l
f290: 61 6d 62 64 61 20 28 66 63 6f 75 6e 74 20 70 63  ambda (fcount pc
f2a0: 6f 75 6e 74 29 0a 09 20 20 20 20 20 28 73 65 74  ount)..     (set
f2b0: 21 20 66 61 69 6c 2d 63 6f 75 6e 74 20 66 63 6f  ! fail-count fco
f2c0: 75 6e 74 29 0a 09 20 20 20 20 20 28 73 65 74 21  unt)..     (set!
f2d0: 20 70 61 73 73 2d 63 6f 75 6e 74 20 70 63 6f 75   pass-count pcou
f2e0: 6e 74 29 29 0a 09 20 20 20 74 64 62 20 0a 09 20  nt))..   tdb .. 
f2f0: 20 20 22 53 45 4c 45 43 54 20 28 53 45 4c 45 43    "SELECT (SELEC
f300: 54 20 63 6f 75 6e 74 28 69 64 29 20 46 52 4f 4d  T count(id) FROM
f310: 20 74 65 73 74 5f 64 61 74 61 20 57 48 45 52 45   test_data WHERE
f320: 20 74 65 73 74 5f 69 64 3d 3f 20 41 4e 44 20 73   test_id=? AND s
f330: 74 61 74 75 73 20 6c 69 6b 65 20 27 66 61 69 6c  tatus like 'fail
f340: 27 29 20 41 53 20 66 61 69 6c 5f 63 6f 75 6e 74  ') AS fail_count
f350: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
f360: 20 20 20 20 20 28 53 45 4c 45 43 54 20 63 6f 75       (SELECT cou
f370: 6e 74 28 69 64 29 20 46 52 4f 4d 20 74 65 73 74  nt(id) FROM test
f380: 5f 64 61 74 61 20 57 48 45 52 45 20 74 65 73 74  _data WHERE test
f390: 5f 69 64 3d 3f 20 41 4e 44 20 73 74 61 74 75 73  _id=? AND status
f3a0: 20 6c 69 6b 65 20 27 70 61 73 73 27 29 20 41 53   like 'pass') AS
f3b0: 20 70 61 73 73 5f 63 6f 75 6e 74 3b 22 0a 09 20   pass_count;".. 
f3c0: 20 20 74 65 73 74 2d 69 64 20 74 65 73 74 2d 69    test-id test-i
f3d0: 64 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 66  d)..  (sqlite3:f
f3e0: 69 6e 61 6c 69 7a 65 21 20 74 64 62 29 0a 0a 09  inalize! tdb)...
f3f0: 20 20 3b 3b 20 4e 6f 77 20 72 6f 6c 6c 75 70 20    ;; Now rollup 
f400: 74 68 65 20 63 6f 75 6e 74 73 20 74 6f 20 74 68  the counts to th
f410: 65 20 63 65 6e 74 72 61 6c 20 6d 65 67 61 74 65  e central megate
f420: 73 74 2e 64 62 0a 09 20 20 28 72 64 62 3a 70 61  st.db..  (rdb:pa
f430: 73 73 2d 66 61 69 6c 2d 63 6f 75 6e 74 73 20 74  ss-fail-counts t
f440: 65 73 74 2d 69 64 20 66 61 69 6c 2d 63 6f 75 6e  est-id fail-coun
f450: 74 20 70 61 73 73 2d 63 6f 75 6e 74 29 0a 09 20  t pass-count).. 
f460: 20 3b 3b 20 28 73 71 6c 69 74 65 33 3a 65 78 65   ;; (sqlite3:exe
f470: 63 75 74 65 20 64 62 20 22 55 50 44 41 54 45 20  cute db "UPDATE 
f480: 74 65 73 74 73 20 53 45 54 20 66 61 69 6c 5f 63  tests SET fail_c
f490: 6f 75 6e 74 3d 3f 2c 70 61 73 73 5f 63 6f 75 6e  ount=?,pass_coun
f4a0: 74 3d 3f 20 57 48 45 52 45 20 69 64 3d 3f 3b 22  t=? WHERE id=?;"
f4b0: 20 0a 09 20 20 3b 3b 20 20 20 20 20 20 20 20 20   ..  ;;         
f4c0: 20 20 20 20 20 20 20 20 20 20 20 20 66 61 69 6c              fail
f4d0: 2d 63 6f 75 6e 74 20 70 61 73 73 2d 63 6f 75 6e  -count pass-coun
f4e0: 74 20 74 65 73 74 2d 69 64 29 0a 0a 09 20 20 28  t test-id)...  (
f4f0: 74 68 72 65 61 64 2d 73 6c 65 65 70 21 20 31 29  thread-sleep! 1)
f500: 20 3b 3b 20 70 6c 61 79 20 6e 69 63 65 20 77 69   ;; play nice wi
f510: 74 68 20 74 68 65 20 71 75 65 75 65 20 62 79 20  th the queue by 
f520: 65 6e 73 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  ensuring the rol
f530: 6c 75 70 20 69 73 20 61 74 20 6c 65 61 73 74 20  lup is at least 
f540: 31 30 6d 73 20 6c 61 74 65 72 20 74 68 61 6e 20  10ms later than 
f550: 74 68 65 20 73 65 74 0a 09 20 20 0a 09 20 20 3b  the set..  ..  ;
f560: 3b 20 69 66 20 74 68 65 20 74 65 73 74 20 69 73  ; if the test is
f570: 20 6e 6f 74 20 46 41 49 4c 20 74 68 65 6e 20 73   not FAIL then s
f580: 65 74 20 73 74 61 74 75 73 20 62 61 73 65 64 20  et status based 
f590: 6f 6e 20 74 68 65 20 66 61 69 6c 20 61 6e 64 20  on the fail and 
f5a0: 70 61 73 73 20 63 6f 75 6e 74 73 2e 0a 09 20 20  pass counts...  
f5b0: 28 72 64 62 3a 74 65 73 74 2d 72 6f 6c 6c 75 70  (rdb:test-rollup
f5c0: 2d 74 65 73 74 5f 64 61 74 61 2d 70 61 73 73 2d  -test_data-pass-
f5d0: 66 61 69 6c 20 74 65 73 74 2d 69 64 29 0a 09 20  fail test-id).. 
f5e0: 20 3b 3b 20 28 73 71 6c 69 74 65 33 3a 65 78 65   ;; (sqlite3:exe
f5f0: 63 75 74 65 0a 09 20 20 3b 3b 20 20 64 62 20 20  cute..  ;;  db  
f600: 20 3b 3b 3b 20 4e 4f 54 45 3a 20 53 68 6f 75 6c   ;;; NOTE: Shoul
f610: 64 20 74 68 69 73 20 62 65 20 57 41 52 4e 2c 46  d this be WARN,F
f620: 41 49 4c 3f 20 41 20 57 41 52 4e 20 69 73 20 6e  AIL? A WARN is n
f630: 6f 74 20 61 20 46 41 49 4c 3f 3f 3f 3f 3f 20 42  ot a FAIL????? B
f640: 55 47 20 46 49 58 4d 45 0a 09 20 20 3b 3b 20 20  UG FIXME..  ;;  
f650: 22 55 50 44 41 54 45 20 74 65 73 74 73 0a 20 20  "UPDATE tests.  
f660: 20 20 20 20 20 20 20 20 3b 3b 20 20 20 20 20 20          ;;      
f670: 20 20 20 20 20 20 20 53 45 54 20 73 74 61 74 75         SET statu
f680: 73 3d 43 41 53 45 20 57 48 45 4e 20 28 53 45 4c  s=CASE WHEN (SEL
f690: 45 43 54 20 66 61 69 6c 5f 63 6f 75 6e 74 20 46  ECT fail_count F
f6a0: 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52 45 20  ROM tests WHERE 
f6b0: 69 64 3d 3f 29 20 3e 20 30 20 0a 20 20 20 20 20  id=?) > 0 .     
f6c0: 20 20 20 20 20 3b 3b 20 20 20 20 20 20 20 20 20       ;;         
f6d0: 20 20 20 20 20 20 20 54 48 45 4e 20 27 46 41 49         THEN 'FAI
f6e0: 4c 27 0a 20 20 20 20 20 20 20 20 20 20 3b 3b 20  L'.          ;; 
f6f0: 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 4e              WHEN
f700: 20 28 53 45 4c 45 43 54 20 70 61 73 73 5f 63 6f   (SELECT pass_co
f710: 75 6e 74 20 46 52 4f 4d 20 74 65 73 74 73 20 57  unt FROM tests W
f720: 48 45 52 45 20 69 64 3d 3f 29 20 3e 20 30 20 41  HERE id=?) > 0 A
f730: 4e 44 20 0a 20 20 20 20 20 20 20 20 20 20 3b 3b  ND .          ;;
f740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f750: 20 20 28 53 45 4c 45 43 54 20 73 74 61 74 75 73    (SELECT status
f760: 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52   FROM tests WHER
f770: 45 20 69 64 3d 3f 29 20 4e 4f 54 20 49 4e 20 28  E id=?) NOT IN (
f780: 27 57 41 52 4e 27 2c 27 46 41 49 4c 27 29 0a 20  'WARN','FAIL'). 
f790: 20 20 20 20 20 20 20 20 20 3b 3b 20 20 20 20 20           ;;     
f7a0: 20 20 20 20 20 20 20 20 54 48 45 4e 20 27 50 41          THEN 'PA
f7b0: 53 53 27 0a 20 20 20 20 20 20 20 20 20 20 3b 3b  SS'.          ;;
f7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 45 4c 53               ELS
f7d0: 45 20 73 74 61 74 75 73 0a 20 20 20 20 20 20 20  E status.       
f7e0: 20 20 20 3b 3b 20 20 20 20 20 20 20 20 20 45 4e     ;;         EN
f7f0: 44 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 0a 09  D WHERE id=?;"..
f800: 20 20 3b 3b 20 20 74 65 73 74 2d 69 64 20 74 65    ;;  test-id te
f810: 73 74 2d 69 64 20 74 65 73 74 2d 69 64 20 74 65  st-id test-id te
f820: 73 74 2d 69 64 29 0a 09 20 20 29 29 29 29 0a 0a  st-id)..  ))))..
f830: 28 64 65 66 69 6e 65 20 28 64 62 3a 67 65 74 2d  (define (db:get-
f840: 70 72 65 76 2d 74 6f 6c 2d 66 6f 72 2d 74 65 73  prev-tol-for-tes
f850: 74 20 64 62 20 74 65 73 74 2d 69 64 20 63 61 74  t db test-id cat
f860: 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65 29 0a  egory variable).
f870: 20 20 3b 3b 20 46 69 6e 69 73 68 20 6d 65 3f 0a    ;; Finish me?.
f880: 20 20 28 76 61 6c 75 65 73 20 23 66 20 23 66 20    (values #f #f 
f890: 23 66 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d  #f))..;;========
f8a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
f8b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
f8c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
f8d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b  ==============.;
f8e0: 3b 20 53 20 54 20 45 20 50 20 53 20 0a 3b 3b 3d  ; S T E P S .;;=
f8f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
f900: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
f910: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
f920: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
f930: 3d 3d 3d 3d 3d 0a 0a 28 64 65 66 69 6e 65 20 28  =====..(define (
f940: 64 62 3a 73 74 65 70 2d 67 65 74 2d 74 69 6d 65  db:step-get-time
f950: 2d 61 73 2d 73 74 72 69 6e 67 20 76 65 63 29 0a  -as-string vec).
f960: 20 20 28 73 65 63 6f 6e 64 73 2d 3e 74 69 6d 65    (seconds->time
f970: 2d 73 74 72 69 6e 67 20 28 64 62 3a 73 74 65 70  -string (db:step
f980: 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20  -get-event_time 
f990: 76 65 63 29 29 29 0a 0a 3b 3b 20 64 62 2d 67 65  vec)))..;; db-ge
f9a0: 74 2d 74 65 73 74 2d 73 74 65 70 73 2d 66 6f 72  t-test-steps-for
f9b0: 2d 72 75 6e 0a 28 64 65 66 69 6e 65 20 28 64 62  -run.(define (db
f9c0: 3a 67 65 74 2d 73 74 65 70 73 2d 66 6f 72 2d 74  :get-steps-for-t
f9d0: 65 73 74 20 64 62 20 74 65 73 74 2d 69 64 29 0a  est db test-id).
f9e0: 20 20 28 6c 65 74 2a 20 28 28 74 64 62 20 28 64    (let* ((tdb (d
f9f0: 62 3a 6f 70 65 6e 2d 74 65 73 74 2d 64 62 2d 62  b:open-test-db-b
fa00: 79 2d 74 65 73 74 2d 69 64 20 64 62 20 74 65 73  y-test-id db tes
fa10: 74 2d 69 64 29 29 0a 09 20 28 72 65 73 20 27 28  t-id)).. (res '(
fa20: 29 29 29 0a 20 20 20 20 28 69 66 20 74 64 62 0a  ))).    (if tdb.
fa30: 09 28 62 65 67 69 6e 0a 09 20 20 28 73 71 6c 69  .(begin..  (sqli
fa40: 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f 77  te3:for-each-row
fa50: 20 0a 09 20 20 20 28 6c 61 6d 62 64 61 20 28 69   ..   (lambda (i
fa60: 64 20 74 65 73 74 2d 69 64 20 73 74 65 70 6e 61  d test-id stepna
fa70: 6d 65 20 73 74 61 74 65 20 73 74 61 74 75 73 20  me state status 
fa80: 65 76 65 6e 74 2d 74 69 6d 65 20 6c 6f 67 66 69  event-time logfi
fa90: 6c 65 29 0a 09 20 20 20 20 20 28 73 65 74 21 20  le)..     (set! 
faa0: 72 65 73 20 28 63 6f 6e 73 20 28 76 65 63 74 6f  res (cons (vecto
fab0: 72 20 69 64 20 74 65 73 74 2d 69 64 20 73 74 65  r id test-id ste
fac0: 70 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61 74  pname state stat
fad0: 75 73 20 65 76 65 6e 74 2d 74 69 6d 65 20 28 69  us event-time (i
fae0: 66 20 28 73 74 72 69 6e 67 3f 20 6c 6f 67 66 69  f (string? logfi
faf0: 6c 65 29 20 6c 6f 67 66 69 6c 65 20 22 22 29 29  le) logfile ""))
fb00: 20 72 65 73 29 29 29 0a 09 20 20 20 74 64 62 0a   res)))..   tdb.
fb10: 09 20 20 20 22 53 45 4c 45 43 54 20 69 64 2c 74  .   "SELECT id,t
fb20: 65 73 74 5f 69 64 2c 73 74 65 70 6e 61 6d 65 2c  est_id,stepname,
fb30: 73 74 61 74 65 2c 73 74 61 74 75 73 2c 65 76 65  state,status,eve
fb40: 6e 74 5f 74 69 6d 65 2c 6c 6f 67 66 69 6c 65 20  nt_time,logfile 
fb50: 46 52 4f 4d 20 74 65 73 74 5f 73 74 65 70 73 20  FROM test_steps 
fb60: 57 48 45 52 45 20 74 65 73 74 5f 69 64 3d 3f 20  WHERE test_id=? 
fb70: 4f 52 44 45 52 20 42 59 20 69 64 20 41 53 43 3b  ORDER BY id ASC;
fb80: 22 20 3b 3b 20 65 76 65 6e 74 5f 74 69 6d 65 20  " ;; event_time 
fb90: 44 45 53 43 2c 69 64 20 41 53 43 3b 0a 09 20 20  DESC,id ASC;..  
fba0: 20 74 65 73 74 2d 69 64 29 0a 09 20 20 28 73 71   test-id)..  (sq
fbb0: 6c 69 74 65 33 3a 66 69 6e 61 6c 69 7a 65 21 20  lite3:finalize! 
fbc0: 74 64 62 29 0a 09 20 20 28 72 65 76 65 72 73 65  tdb)..  (reverse
fbd0: 20 72 65 73 29 29 0a 09 27 28 29 29 29 29 0a 0a   res))..'())))..
fbe0: 3b 3b 20 67 65 74 20 61 20 70 72 65 74 74 79 20  ;; get a pretty 
fbf0: 74 61 62 6c 65 20 74 6f 20 73 75 6d 6d 61 72 69  table to summari
fc00: 7a 65 20 73 74 65 70 73 0a 3b 3b 0a 28 64 65 66  ze steps.;;.(def
fc10: 69 6e 65 20 28 64 62 3a 67 65 74 2d 73 74 65 70  ine (db:get-step
fc20: 73 2d 74 61 62 6c 65 20 64 62 20 74 65 73 74 2d  s-table db test-
fc30: 69 64 29 0a 20 20 28 6c 65 74 20 28 28 73 74 65  id).  (let ((ste
fc40: 70 73 20 20 20 28 64 62 3a 67 65 74 2d 73 74 65  ps   (db:get-ste
fc50: 70 73 2d 66 6f 72 2d 74 65 73 74 20 64 62 20 74  ps-for-test db t
fc60: 65 73 74 2d 69 64 29 29 29 0a 20 20 20 20 3b 3b  est-id))).    ;;
fc70: 20 6f 72 67 61 6e 69 73 65 20 74 68 65 20 73 74   organise the st
fc80: 65 70 73 20 66 6f 72 20 62 65 74 74 65 72 20 72  eps for better r
fc90: 65 61 64 61 62 69 6c 69 74 79 0a 20 20 20 20 28  eadability.    (
fca0: 6c 65 74 20 28 28 72 65 73 20 28 6d 61 6b 65 2d  let ((res (make-
fcb0: 68 61 73 68 2d 74 61 62 6c 65 29 29 29 0a 20 20  hash-table))).  
fcc0: 20 20 20 20 28 66 6f 72 2d 65 61 63 68 20 0a 20      (for-each . 
fcd0: 20 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 73        (lambda (s
fce0: 74 65 70 29 0a 09 20 28 64 65 62 75 67 3a 70 72  tep).. (debug:pr
fcf0: 69 6e 74 20 36 20 22 73 74 65 70 3d 22 20 73 74  int 6 "step=" st
fd00: 65 70 29 0a 09 20 28 6c 65 74 20 28 28 72 65 63  ep).. (let ((rec
fd10: 6f 72 64 20 28 68 61 73 68 2d 74 61 62 6c 65 2d  ord (hash-table-
fd20: 72 65 66 2f 64 65 66 61 75 6c 74 20 0a 09 09 09  ref/default ....
fd30: 72 65 73 20 0a 09 09 09 28 64 62 3a 73 74 65 70  res ....(db:step
fd40: 2d 67 65 74 2d 73 74 65 70 6e 61 6d 65 20 73 74  -get-stepname st
fd50: 65 70 29 20 0a 09 09 09 3b 3b 20 20 20 20 20 20  ep) ....;;      
fd60: 20 20 73 74 65 70 6e 61 6d 65 20 20 20 20 20 20    stepname      
fd70: 20 20 20 20 20 20 20 20 20 20 73 74 61 72 74 20            start 
fd80: 65 6e 64 20 73 74 61 74 75 73 20 20 20 20 0a 09  end status    ..
fd90: 09 09 28 76 65 63 74 6f 72 20 28 64 62 3a 73 74  ..(vector (db:st
fda0: 65 70 2d 67 65 74 2d 73 74 65 70 6e 61 6d 65 20  ep-get-stepname 
fdb0: 73 74 65 70 29 20 22 22 20 20 20 22 22 20 22 22  step) ""   "" ""
fdc0: 20 20 20 20 20 22 22 20 22 22 29 29 29 29 0a 09       "" ""))))..
fdd0: 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20     (debug:print 
fde0: 36 20 22 72 65 63 6f 72 64 28 62 65 66 6f 72 65  6 "record(before
fdf0: 29 20 3d 20 22 20 72 65 63 6f 72 64 20 0a 09 09  ) = " record ...
fe00: 09 22 5c 6e 69 64 3a 20 20 20 20 20 20 20 22 20  ."\nid:       " 
fe10: 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 69 64 20  (db:step-get-id 
fe20: 73 74 65 70 29 0a 09 09 09 22 5c 6e 73 74 65 70  step)...."\nstep
fe30: 6e 61 6d 65 3a 20 22 20 28 64 62 3a 73 74 65 70  name: " (db:step
fe40: 2d 67 65 74 2d 73 74 65 70 6e 61 6d 65 20 73 74  -get-stepname st
fe50: 65 70 29 0a 09 09 09 22 5c 6e 73 74 61 74 65 3a  ep)...."\nstate:
fe60: 20 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d 67      " (db:step-g
fe70: 65 74 2d 73 74 61 74 65 20 73 74 65 70 29 0a 09  et-state step)..
fe80: 09 09 22 5c 6e 73 74 61 74 75 73 3a 20 20 20 22  .."\nstatus:   "
fe90: 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74   (db:step-get-st
fea0: 61 74 75 73 20 73 74 65 70 29 0a 09 09 09 22 5c  atus step)...."\
feb0: 6e 74 69 6d 65 3a 20 20 20 20 20 22 20 28 64 62  ntime:     " (db
fec0: 3a 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f  :step-get-event_
fed0: 74 69 6d 65 20 73 74 65 70 29 29 0a 09 20 20 20  time step))..   
fee0: 28 63 61 73 65 20 28 73 74 72 69 6e 67 2d 3e 73  (case (string->s
fef0: 79 6d 62 6f 6c 20 28 64 62 3a 73 74 65 70 2d 67  ymbol (db:step-g
ff00: 65 74 2d 73 74 61 74 65 20 73 74 65 70 29 29 0a  et-state step)).
ff10: 09 20 20 20 20 20 28 28 73 74 61 72 74 29 28 76  .     ((start)(v
ff20: 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72  ector-set! recor
ff30: 64 20 31 20 28 64 62 3a 73 74 65 70 2d 67 65 74  d 1 (db:step-get
ff40: 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73 74 65 70  -event_time step
ff50: 29 29 0a 09 20 20 20 20 20 20 28 76 65 63 74 6f  ))..      (vecto
ff60: 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 33 20  r-set! record 3 
ff70: 28 69 66 20 28 65 71 75 61 6c 3f 20 28 76 65 63  (if (equal? (vec
ff80: 74 6f 72 2d 72 65 66 20 72 65 63 6f 72 64 20 33  tor-ref record 3
ff90: 29 20 22 22 29 0a 09 09 09 09 09 28 64 62 3a 73  ) "")......(db:s
ffa0: 74 65 70 2d 67 65 74 2d 73 74 61 74 75 73 20 73  tep-get-status s
ffb0: 74 65 70 29 29 29 0a 09 20 20 20 20 20 20 28 69  tep)))..      (i
ffc0: 66 20 28 3e 20 28 73 74 72 69 6e 67 2d 6c 65 6e  f (> (string-len
ffd0: 67 74 68 20 28 64 62 3a 73 74 65 70 2d 67 65 74  gth (db:step-get
ffe0: 2d 6c 6f 67 66 69 6c 65 20 73 74 65 70 29 29 0a  -logfile step)).
fff0: 09 09 20 20 20 20 20 30 29 0a 09 09 20 20 28 76  ..     0)...  (v
10000 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f 72  ector-set! recor
10010 64 20 35 20 28 64 62 3a 73 74 65 70 2d 67 65 74  d 5 (db:step-get
10020 2d 6c 6f 67 66 69 6c 65 20 73 74 65 70 29 29 29  -logfile step)))
10030 29 0a 09 20 20 20 20 20 28 28 65 6e 64 29 20 20  )..     ((end)  
10040 0a 09 20 20 20 20 20 20 28 76 65 63 74 6f 72 2d  ..      (vector-
10050 73 65 74 21 20 72 65 63 6f 72 64 20 32 20 28 61  set! record 2 (a
10060 6e 79 2d 3e 6e 75 6d 62 65 72 20 28 64 62 3a 73  ny->number (db:s
10070 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69  tep-get-event_ti
10080 6d 65 20 73 74 65 70 29 29 29 0a 09 20 20 20 20  me step)))..    
10090 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72    (vector-set! r
100a0 65 63 6f 72 64 20 33 20 28 64 62 3a 73 74 65 70  ecord 3 (db:step
100b0 2d 67 65 74 2d 73 74 61 74 75 73 20 73 74 65 70  -get-status step
100c0 29 29 0a 09 20 20 20 20 20 20 28 76 65 63 74 6f  ))..      (vecto
100d0 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 34 20  r-set! record 4 
100e0 28 6c 65 74 20 28 28 73 74 61 72 74 74 20 28 61  (let ((startt (a
100f0 6e 79 2d 3e 6e 75 6d 62 65 72 20 28 76 65 63 74  ny->number (vect
10100 6f 72 2d 72 65 66 20 72 65 63 6f 72 64 20 31 29  or-ref record 1)
10110 29 29 0a 09 09 09 09 09 20 20 28 65 6e 64 74 20  ))......  (endt 
10120 20 20 28 61 6e 79 2d 3e 6e 75 6d 62 65 72 20 28    (any->number (
10130 76 65 63 74 6f 72 2d 72 65 66 20 72 65 63 6f 72  vector-ref recor
10140 64 20 32 29 29 29 29 0a 09 09 09 09 20 20 20 20  d 2)))).....    
10150 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 34    (debug:print 4
10160 20 22 72 65 63 6f 72 64 5b 31 5d 3d 22 20 28 76   "record[1]=" (v
10170 65 63 74 6f 72 2d 72 65 66 20 72 65 63 6f 72 64  ector-ref record
10180 20 31 29 20 0a 09 09 09 09 09 09 20 20 20 22 2c   1) .......   ",
10190 20 73 74 61 72 74 74 3d 22 20 73 74 61 72 74 74   startt=" startt
101a0 20 22 2c 20 65 6e 64 74 3d 22 20 65 6e 64 74 0a   ", endt=" endt.
101b0 09 09 09 09 09 09 20 20 20 22 2c 20 67 65 74 2d  ......   ", get-
101c0 73 74 61 74 75 73 3a 20 22 20 28 64 62 3a 73 74  status: " (db:st
101d0 65 70 2d 67 65 74 2d 73 74 61 74 75 73 20 73 74  ep-get-status st
101e0 65 70 29 29 0a 09 09 09 09 20 20 20 20 20 20 28  ep)).....      (
101f0 69 66 20 28 61 6e 64 20 28 6e 75 6d 62 65 72 3f  if (and (number?
10200 20 73 74 61 72 74 74 29 28 6e 75 6d 62 65 72 3f   startt)(number?
10210 20 65 6e 64 74 29 29 0a 09 09 09 09 09 20 20 28   endt))......  (
10220 73 65 63 6f 6e 64 73 2d 3e 68 72 2d 6d 69 6e 2d  seconds->hr-min-
10230 73 65 63 20 28 2d 20 65 6e 64 74 20 73 74 61 72  sec (- endt star
10240 74 74 29 29 20 22 2d 31 22 29 29 29 0a 09 20 20  tt)) "-1")))..  
10250 20 20 20 20 28 69 66 20 28 3e 20 28 73 74 72 69      (if (> (stri
10260 6e 67 2d 6c 65 6e 67 74 68 20 28 64 62 3a 73 74  ng-length (db:st
10270 65 70 2d 67 65 74 2d 6c 6f 67 66 69 6c 65 20 73  ep-get-logfile s
10280 74 65 70 29 29 0a 09 09 20 20 20 20 20 30 29 0a  tep))...     0).
10290 09 09 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21  ..  (vector-set!
102a0 20 72 65 63 6f 72 64 20 35 20 28 64 62 3a 73 74   record 5 (db:st
102b0 65 70 2d 67 65 74 2d 6c 6f 67 66 69 6c 65 20 73  ep-get-logfile s
102c0 74 65 70 29 29 29 29 0a 09 20 20 20 20 20 28 65  tep))))..     (e
102d0 6c 73 65 0a 09 20 20 20 20 20 20 28 76 65 63 74  lse..      (vect
102e0 6f 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 32  or-set! record 2
102f0 20 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74   (db:step-get-st
10300 61 74 65 20 73 74 65 70 29 29 0a 09 20 20 20 20  ate step))..    
10310 20 20 28 76 65 63 74 6f 72 2d 73 65 74 21 20 72    (vector-set! r
10320 65 63 6f 72 64 20 33 20 28 64 62 3a 73 74 65 70  ecord 3 (db:step
10330 2d 67 65 74 2d 73 74 61 74 75 73 20 73 74 65 70  -get-status step
10340 29 29 0a 09 20 20 20 20 20 20 28 76 65 63 74 6f  ))..      (vecto
10350 72 2d 73 65 74 21 20 72 65 63 6f 72 64 20 34 20  r-set! record 4 
10360 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65 76 65  (db:step-get-eve
10370 6e 74 5f 74 69 6d 65 20 73 74 65 70 29 29 29 29  nt_time step))))
10380 0a 09 20 20 20 28 68 61 73 68 2d 74 61 62 6c 65  ..   (hash-table
10390 2d 73 65 74 21 20 72 65 73 20 28 64 62 3a 73 74  -set! res (db:st
103a0 65 70 2d 67 65 74 2d 73 74 65 70 6e 61 6d 65 20  ep-get-stepname 
103b0 73 74 65 70 29 20 72 65 63 6f 72 64 29 0a 09 20  step) record).. 
103c0 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 36    (debug:print 6
103d0 20 22 72 65 63 6f 72 64 28 61 66 74 65 72 29 20   "record(after) 
103e0 20 3d 20 22 20 72 65 63 6f 72 64 20 0a 09 09 09   = " record ....
103f0 22 5c 6e 69 64 3a 20 20 20 20 20 20 20 22 20 28  "\nid:       " (
10400 64 62 3a 73 74 65 70 2d 67 65 74 2d 69 64 20 73  db:step-get-id s
10410 74 65 70 29 0a 09 09 09 22 5c 6e 73 74 65 70 6e  tep)...."\nstepn
10420 61 6d 65 3a 20 22 20 28 64 62 3a 73 74 65 70 2d  ame: " (db:step-
10430 67 65 74 2d 73 74 65 70 6e 61 6d 65 20 73 74 65  get-stepname ste
10440 70 29 0a 09 09 09 22 5c 6e 73 74 61 74 65 3a 20  p)...."\nstate: 
10450 20 20 20 22 20 28 64 62 3a 73 74 65 70 2d 67 65     " (db:step-ge
10460 74 2d 73 74 61 74 65 20 73 74 65 70 29 0a 09 09  t-state step)...
10470 09 22 5c 6e 73 74 61 74 75 73 3a 20 20 20 22 20  ."\nstatus:   " 
10480 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 73 74 61  (db:step-get-sta
10490 74 75 73 20 73 74 65 70 29 0a 09 09 09 22 5c 6e  tus step)...."\n
104a0 74 69 6d 65 3a 20 20 20 20 20 22 20 28 64 62 3a  time:     " (db:
104b0 73 74 65 70 2d 67 65 74 2d 65 76 65 6e 74 5f 74  step-get-event_t
104c0 69 6d 65 20 73 74 65 70 29 29 29 29 0a 20 20 20  ime step)))).   
104d0 20 20 20 20 3b 3b 20 28 65 6c 73 65 20 20 20 28      ;; (else   (
104e0 76 65 63 74 6f 72 2d 73 65 74 21 20 72 65 63 6f  vector-set! reco
104f0 72 64 20 31 20 28 64 62 3a 73 74 65 70 2d 67 65  rd 1 (db:step-ge
10500 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20 73 74 65  t-event_time ste
10510 70 29 29 29 0a 20 20 20 20 20 20 20 28 73 6f 72  p))).       (sor
10520 74 20 73 74 65 70 73 20 28 6c 61 6d 62 64 61 20  t steps (lambda 
10530 28 61 20 62 29 28 3c 20 28 64 62 3a 73 74 65 70  (a b)(< (db:step
10540 2d 67 65 74 2d 65 76 65 6e 74 5f 74 69 6d 65 20  -get-event_time 
10550 61 29 28 64 62 3a 73 74 65 70 2d 67 65 74 2d 65  a)(db:step-get-e
10560 76 65 6e 74 5f 74 69 6d 65 20 62 29 29 29 29 29  vent_time b)))))
10570 0a 20 20 20 20 20 20 72 65 73 29 29 29 0a 0a 3b  .      res)))..;
10580 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;===============
10590 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
105a0 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
105b0 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
105c0 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 4d 20 49 20 53  =======.;; M I S
105d0 20 43 20 20 20 4d 20 41 20 4e 20 41 20 47 20 45   C   M A N A G E
105e0 20 4d 20 45 20 4e 20 54 20 20 20 49 20 54 20 45   M E N T   I T E
105f0 20 4d 20 53 20 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d   M S .;;========
10600 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
10610 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
10620 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
10630 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a  ==============..
10640 3b 3b 20 74 68 65 20 6e 65 77 20 70 72 65 72 65  ;; the new prere
10650 71 73 20 63 61 6c 63 75 6c 61 74 69 6f 6e 2c 20  qs calculation, 
10660 6c 6f 6f 6b 73 20 61 6c 73 6f 20 61 74 20 69 74  looks also at it
10670 65 6d 70 61 74 68 20 69 66 20 73 70 65 63 69 66  empath if specif
10680 69 65 64 0a 3b 3b 20 61 6c 6c 20 70 72 65 72 65  ied.;; all prere
10690 71 73 20 6d 75 73 74 20 62 65 20 6d 65 74 3a 0a  qs must be met:.
106a0 3b 3b 20 20 20 20 69 66 20 70 72 65 72 65 71 20  ;;    if prereq 
106b0 74 65 73 74 20 77 69 74 68 20 69 74 65 6d 70 61  test with itempa
106c0 74 68 3d 27 27 20 69 73 20 43 4f 4d 50 4c 45 54  th='' is COMPLET
106d0 45 44 20 61 6e 64 20 50 41 53 53 2c 20 57 41 52  ED and PASS, WAR
106e0 4e 2c 20 43 48 45 43 4b 2c 20 6f 72 20 57 41 49  N, CHECK, or WAI
106f0 56 45 44 20 74 68 65 6e 20 70 72 65 72 65 71 20  VED then prereq 
10700 69 73 20 6d 65 74 0a 3b 3b 20 20 20 20 69 66 20  is met.;;    if 
10710 70 72 65 72 65 71 20 74 65 73 74 20 77 69 74 68  prereq test with
10720 20 69 74 65 6d 70 61 74 68 3d 72 65 66 2d 69 74   itempath=ref-it
10730 65 6d 2d 70 61 74 68 20 61 6e 64 20 43 4f 4d 50  em-path and COMP
10740 4c 45 54 45 44 20 77 69 74 68 20 50 41 53 53 2c  LETED with PASS,
10750 20 57 41 52 4e 2c 20 43 48 45 43 4b 2c 20 6f 72   WARN, CHECK, or
10760 20 57 41 49 56 45 44 20 74 68 65 6e 20 70 72 65   WAIVED then pre
10770 72 65 71 20 69 73 20 6d 65 74 0a 3b 3b 0a 3b 3b  req is met.;;.;;
10780 20 4e 6f 74 65 3a 20 64 6f 20 6e 6f 74 20 63 6f   Note: do not co
10790 6e 76 65 72 74 20 74 6f 20 72 65 6d 6f 74 65 20  nvert to remote 
107a0 61 73 20 69 74 20 63 61 6c 6c 73 20 72 65 6d 6f  as it calls remo
107b0 74 65 20 75 6e 64 65 72 20 74 68 65 20 68 6f 6f  te under the hoo
107c0 64 0a 3b 3b 20 4e 6f 74 65 3a 20 6d 6f 64 65 20  d.;; Note: mode 
107d0 27 6e 6f 72 6d 61 6c 20 6d 65 61 6e 73 20 74 68  'normal means th
107e0 61 74 20 74 65 73 74 73 20 6d 75 73 74 20 62 65  at tests must be
107f0 20 43 4f 4d 50 4c 45 54 45 44 20 61 6e 64 20 6f   COMPLETED and o
10800 6b 20 28 69 2e 65 2e 20 50 41 53 53 2c 20 57 41  k (i.e. PASS, WA
10810 52 4e 2c 20 43 48 45 43 4b 20 6f 72 20 57 41 49  RN, CHECK or WAI
10820 56 45 44 29 0a 3b 3b 20 20 20 20 20 20 20 6d 6f  VED).;;       mo
10830 64 65 20 27 74 6f 70 6c 65 76 65 6c 20 6d 65 61  de 'toplevel mea
10840 6e 73 20 74 68 61 74 20 74 65 73 74 73 20 6d 75  ns that tests mu
10850 73 74 20 62 65 20 43 4f 4d 50 4c 45 54 45 44 20  st be COMPLETED 
10860 6f 6e 6c 79 0a 3b 3b 20 20 20 20 20 20 20 6d 6f  only.;;       mo
10870 64 65 20 27 69 74 65 6d 6d 61 74 63 68 20 6d 65  de 'itemmatch me
10880 61 6e 73 20 74 68 61 74 20 74 65 73 74 73 20 69  ans that tests i
10890 74 65 6d 73 20 6d 75 73 74 20 62 65 20 43 4f 4d  tems must be COM
108a0 50 4c 45 54 45 44 20 61 6e 64 20 28 50 41 53 53  PLETED and (PASS
108b0 7c 57 41 52 4e 7c 57 41 49 56 45 44 7c 43 48 45  |WARN|WAIVED|CHE
108c0 43 4b 29 20 5b 5b 20 4e 42 2f 2f 20 4e 4f 54 20  CK) [[ NB// NOT 
108d0 49 4d 50 4c 45 4d 45 4e 54 45 44 20 59 45 54 20  IMPLEMENTED YET 
108e0 5d 5d 0a 3b 3b 20 0a 28 64 65 66 69 6e 65 20 28  ]].;; .(define (
108f0 64 62 3a 67 65 74 2d 70 72 65 72 65 71 73 2d 6e  db:get-prereqs-n
10900 6f 74 2d 6d 65 74 20 64 62 20 72 75 6e 2d 69 64  ot-met db run-id
10910 20 77 61 69 74 6f 6e 73 20 72 65 66 2d 69 74 65   waitons ref-ite
10920 6d 2d 70 61 74 68 20 23 21 6b 65 79 20 28 6d 6f  m-path #!key (mo
10930 64 65 20 27 6e 6f 72 6d 61 6c 29 29 0a 20 20 28  de 'normal)).  (
10940 69 66 20 28 6f 72 20 28 6e 6f 74 20 77 61 69 74  if (or (not wait
10950 6f 6e 73 29 0a 09 20 20 28 6e 75 6c 6c 3f 20 77  ons)..  (null? w
10960 61 69 74 6f 6e 73 29 29 0a 20 20 20 20 20 20 27  aitons)).      '
10970 28 29 0a 20 20 20 20 20 20 28 6c 65 74 2a 20 28  ().      (let* (
10980 28 75 6e 6d 65 74 2d 70 72 65 2d 72 65 71 73 20  (unmet-pre-reqs 
10990 27 28 29 29 0a 09 20 20 20 20 20 28 72 65 73 75  '())..     (resu
109a0 6c 74 20 20 20 20 20 20 20 20 20 27 28 29 29 29  lt         '()))
109b0 0a 09 28 66 6f 72 2d 65 61 63 68 20 0a 09 20 28  ..(for-each .. (
109c0 6c 61 6d 62 64 61 20 28 77 61 69 74 6f 6e 74 65  lambda (waitonte
109d0 73 74 2d 6e 61 6d 65 29 0a 09 20 20 20 3b 3b 20  st-name)..   ;; 
109e0 62 79 20 67 65 74 74 69 6e 67 20 74 68 65 20 74  by getting the t
109f0 65 73 74 73 20 77 69 74 68 20 6d 61 74 63 68 69  ests with matchi
10a00 6e 67 20 6e 61 6d 65 20 77 65 20 61 72 65 20 6c  ng name we are l
10a10 6f 6f 6b 69 6e 67 20 6f 6e 6c 79 20 61 74 20 74  ooking only at t
10a20 68 65 20 6d 61 74 63 68 69 6e 67 20 74 65 73 74  he matching test
10a30 20 0a 09 20 20 20 3b 3b 20 61 6e 64 20 72 65 6c   ..   ;; and rel
10a40 61 74 65 64 20 73 75 62 20 69 74 65 6d 73 0a 09  ated sub items..
10a50 20 20 20 28 6c 65 74 20 28 28 74 65 73 74 73 20     (let ((tests 
10a60 20 20 20 20 20 20 20 20 20 20 20 20 28 64 62 3a              (db:
10a70 67 65 74 2d 74 65 73 74 73 2d 66 6f 72 2d 72 75  get-tests-for-ru
10a80 6e 20 64 62 20 72 75 6e 2d 69 64 20 77 61 69 74  n db run-id wait
10a90 6f 6e 74 65 73 74 2d 6e 61 6d 65 20 27 28 29 20  ontest-name '() 
10aa0 27 28 29 29 29 0a 09 09 20 28 65 76 65 72 2d 73  '()))... (ever-s
10ab0 65 65 6e 20 20 20 20 20 20 20 20 20 23 66 29 0a  een         #f).
10ac0 09 09 20 28 70 61 72 65 6e 74 2d 77 61 69 74 6f  .. (parent-waito
10ad0 6e 2d 6d 65 74 20 23 66 29 0a 09 09 20 28 69 74  n-met #f)... (it
10ae0 65 6d 2d 77 61 69 74 6f 6e 2d 6d 65 74 20 20 20  em-waiton-met   
10af0 23 66 29 29 0a 09 20 20 20 20 20 28 66 6f 72 2d  #f))..     (for-
10b00 65 61 63 68 20 0a 09 20 20 20 20 20 20 28 6c 61  each ..      (la
10b10 6d 62 64 61 20 28 74 65 73 74 29 0a 09 09 3b 3b  mbda (test)...;;
10b20 20 28 69 66 20 28 65 71 75 61 6c 3f 20 77 61 69   (if (equal? wai
10b30 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 20 28 64 62  tontest-name (db
10b40 3a 74 65 73 74 2d 67 65 74 2d 74 65 73 74 6e 61  :test-get-testna
10b50 6d 65 20 74 65 73 74 29 29 20 3b 3b 20 62 79 20  me test)) ;; by 
10b60 64 65 66 69 6e 74 69 6f 6e 20 74 68 69 73 20 68  defintion this h
10b70 61 64 20 62 65 74 74 65 72 20 62 65 20 74 72 75  ad better be tru
10b80 65 20 2e 2e 2e 0a 09 09 28 6c 65 74 2a 20 28 28  e ......(let* ((
10b90 73 74 61 74 65 20 20 20 20 20 20 20 20 20 20 20  state           
10ba0 20 20 28 64 62 3a 74 65 73 74 2d 67 65 74 2d 73    (db:test-get-s
10bb0 74 61 74 65 20 74 65 73 74 29 29 0a 09 09 20 20  tate test))...  
10bc0 20 20 20 20 20 28 73 74 61 74 75 73 20 20 20 20       (status    
10bd0 20 20 20 20 20 20 20 20 28 64 62 3a 74 65 73 74          (db:test
10be0 2d 67 65 74 2d 73 74 61 74 75 73 20 74 65 73 74  -get-status test
10bf0 29 29 0a 09 09 20 20 20 20 20 20 20 28 69 74 65  ))...       (ite
10c00 6d 2d 70 61 74 68 20 20 20 20 20 20 20 20 20 28  m-path         (
10c10 64 62 3a 74 65 73 74 2d 67 65 74 2d 69 74 65 6d  db:test-get-item
10c20 2d 70 61 74 68 20 74 65 73 74 29 29 0a 09 09 20  -path test))... 
10c30 20 20 20 20 20 20 28 69 73 2d 63 6f 6d 70 6c 65        (is-comple
10c40 74 65 64 20 20 20 20 20 20 28 65 71 75 61 6c 3f  ted      (equal?
10c50 20 73 74 61 74 65 20 22 43 4f 4d 50 4c 45 54 45   state "COMPLETE
10c60 44 22 29 29 0a 09 09 20 20 20 20 20 20 20 28 69  D"))...       (i
10c70 73 2d 6f 6b 20 20 20 20 20 20 20 20 20 20 20 20  s-ok            
10c80 20 28 6d 65 6d 62 65 72 20 73 74 61 74 75 73 20   (member status 
10c90 27 28 22 50 41 53 53 22 20 22 57 41 52 4e 22 20  '("PASS" "WARN" 
10ca0 22 43 48 45 43 4b 22 20 22 57 41 49 56 45 44 22  "CHECK" "WAIVED"
10cb0 29 29 29 0a 09 09 20 20 20 20 20 20 20 28 73 61  )))...       (sa
10cc0 6d 65 2d 69 74 65 6d 70 61 74 68 20 20 20 20 20  me-itempath     
10cd0 28 65 71 75 61 6c 3f 20 72 65 66 2d 69 74 65 6d  (equal? ref-item
10ce0 2d 70 61 74 68 20 69 74 65 6d 2d 70 61 74 68 29  -path item-path)
10cf0 29 29 0a 09 09 20 20 28 73 65 74 21 20 65 76 65  ))...  (set! eve
10d00 72 2d 73 65 65 6e 20 23 74 29 0a 09 09 20 20 28  r-seen #t)...  (
10d10 63 6f 6e 64 0a 09 09 20 20 20 3b 3b 20 63 61 73  cond...   ;; cas
10d20 65 20 31 2c 20 6e 6f 6e 2d 69 74 65 6d 20 28 70  e 1, non-item (p
10d30 61 72 65 6e 74 20 74 65 73 74 29 20 69 73 20 0a  arent test) is .
10d40 09 09 20 20 20 28 28 61 6e 64 20 28 65 71 75 61  ..   ((and (equa
10d50 6c 3f 20 69 74 65 6d 2d 70 61 74 68 20 22 22 29  l? item-path "")
10d60 20 3b 3b 20 74 68 69 73 20 69 73 20 74 68 65 20   ;; this is the 
10d70 70 61 72 65 6e 74 20 74 65 73 74 0a 09 09 09 20  parent test.... 
10d80 69 73 2d 63 6f 6d 70 6c 65 74 65 64 0a 09 09 09  is-completed....
10d90 20 28 6f 72 20 69 73 2d 6f 6b 20 28 65 71 3f 20   (or is-ok (eq? 
10da0 6d 6f 64 65 20 27 74 6f 70 6c 65 76 65 6c 29 29  mode 'toplevel))
10db0 29 0a 09 09 20 20 20 20 28 73 65 74 21 20 70 61  )...    (set! pa
10dc0 72 65 6e 74 2d 77 61 69 74 6f 6e 2d 6d 65 74 20  rent-waiton-met 
10dd0 23 74 29 29 0a 09 09 20 20 20 28 28 61 6e 64 20  #t))...   ((and 
10de0 73 61 6d 65 2d 69 74 65 6d 70 61 74 68 0a 09 09  same-itempath...
10df0 09 20 69 73 2d 63 6f 6d 70 6c 65 74 65 64 0a 09  . is-completed..
10e00 09 09 20 28 6f 72 20 69 73 2d 6f 6b 20 28 65 71  .. (or is-ok (eq
10e10 3f 20 6d 6f 64 65 20 27 74 6f 70 6c 65 76 65 6c  ? mode 'toplevel
10e20 29 29 29 0a 09 09 20 20 20 20 28 73 65 74 21 20  )))...    (set! 
10e30 69 74 65 6d 2d 77 61 69 74 6f 6e 2d 6d 65 74 20  item-waiton-met 
10e40 23 74 29 29 29 29 29 0a 09 20 20 20 20 20 20 74  #t)))))..      t
10e50 65 73 74 73 29 0a 09 20 20 20 20 20 28 69 66 20  ests)..     (if 
10e60 28 6e 6f 74 20 28 6f 72 20 70 61 72 65 6e 74 2d  (not (or parent-
10e70 77 61 69 74 6f 6e 2d 6d 65 74 20 69 74 65 6d 2d  waiton-met item-
10e80 77 61 69 74 6f 6e 2d 6d 65 74 29 29 0a 09 09 20  waiton-met))... 
10e90 28 73 65 74 21 20 72 65 73 75 6c 74 20 28 61 70  (set! result (ap
10ea0 70 65 6e 64 20 28 69 66 20 28 6e 75 6c 6c 3f 20  pend (if (null? 
10eb0 74 65 73 74 73 29 20 28 6c 69 73 74 20 77 61 69  tests) (list wai
10ec0 74 6f 6e 74 65 73 74 2d 6e 61 6d 65 29 20 74 65  tontest-name) te
10ed0 73 74 73 29 20 72 65 73 75 6c 74 29 29 29 0a 09  sts) result)))..
10ee0 20 20 20 20 20 3b 3b 20 69 66 20 74 68 65 20 74       ;; if the t
10ef0 65 73 74 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64  est is not found
10f00 20 74 68 65 6e 20 63 6c 65 61 72 6c 79 20 74 68   then clearly th
10f10 65 20 77 61 69 74 6f 6e 20 69 73 20 6e 6f 74 20  e waiton is not 
10f20 6d 65 74 2e 2e 2e 0a 09 20 20 20 20 20 3b 3b 20  met.....     ;; 
10f30 28 69 66 20 28 6e 6f 74 20 65 76 65 72 2d 73 65  (if (not ever-se
10f40 65 6e 29 28 73 65 74 21 20 72 65 73 75 6c 74 20  en)(set! result 
10f50 28 63 6f 6e 73 20 77 61 69 74 6f 6e 74 65 73 74  (cons waitontest
10f60 2d 6e 61 6d 65 20 72 65 73 75 6c 74 29 29 29 29  -name result))))
10f70 29 0a 09 20 20 20 20 20 28 69 66 20 28 6e 6f 74  )..     (if (not
10f80 20 65 76 65 72 2d 73 65 65 6e 29 0a 09 09 20 28   ever-seen)... (
10f90 73 65 74 21 20 72 65 73 75 6c 74 20 28 61 70 70  set! result (app
10fa0 65 6e 64 20 28 69 66 20 28 6e 75 6c 6c 3f 20 74  end (if (null? t
10fb0 65 73 74 73 29 28 6c 69 73 74 20 77 61 69 74 6f  ests)(list waito
10fc0 6e 74 65 73 74 2d 6e 61 6d 65 29 20 74 65 73 74  ntest-name) test
10fd0 73 29 20 72 65 73 75 6c 74 29 29 29 29 29 0a 09  s) result)))))..
10fe0 20 77 61 69 74 6f 6e 73 29 0a 09 28 64 65 6c 65   waitons)..(dele
10ff0 74 65 2d 64 75 70 6c 69 63 61 74 65 73 20 72 65  te-duplicates re
11000 73 75 6c 74 29 29 29 29 0a 0a 28 64 65 66 69 6e  sult))))..(defin
11010 65 20 28 64 62 3a 74 65 73 74 73 74 65 70 2d 73  e (db:teststep-s
11020 65 74 2d 73 74 61 74 75 73 21 20 64 62 20 74 65  et-status! db te
11030 73 74 2d 69 64 20 74 65 73 74 73 74 65 70 2d 6e  st-id teststep-n
11040 61 6d 65 20 73 74 61 74 65 2d 69 6e 20 73 74 61  ame state-in sta
11050 74 75 73 2d 69 6e 20 63 6f 6d 6d 65 6e 74 20 6c  tus-in comment l
11060 6f 67 66 69 6c 65 29 0a 20 20 28 64 65 62 75 67  ogfile).  (debug
11070 3a 70 72 69 6e 74 20 34 20 22 74 65 73 74 2d 69  :print 4 "test-i
11080 64 3a 20 22 20 74 65 73 74 2d 69 64 20 22 20 74  d: " test-id " t
11090 65 73 74 73 74 65 70 2d 6e 61 6d 65 3a 20 22 20  eststep-name: " 
110a0 74 65 73 74 73 74 65 70 2d 6e 61 6d 65 29 0a 20  teststep-name). 
110b0 20 28 6c 65 74 2a 20 28 28 74 64 62 20 20 20 20   (let* ((tdb    
110c0 20 20 20 28 64 62 3a 6f 70 65 6e 2d 74 65 73 74     (db:open-test
110d0 2d 64 62 2d 62 79 2d 74 65 73 74 2d 69 64 20 64  -db-by-test-id d
110e0 62 20 74 65 73 74 2d 69 64 29 29 0a 09 20 28 73  b test-id)).. (s
110f0 74 61 74 65 20 20 20 20 20 28 63 68 65 63 6b 2d  tate     (check-
11100 76 61 6c 69 64 2d 69 74 65 6d 73 20 22 73 74 61  valid-items "sta
11110 74 65 22 20 73 74 61 74 65 2d 69 6e 29 29 0a 09  te" state-in))..
11120 20 28 73 74 61 74 75 73 20 20 20 20 28 63 68 65   (status    (che
11130 63 6b 2d 76 61 6c 69 64 2d 69 74 65 6d 73 20 22  ck-valid-items "
11140 73 74 61 74 75 73 22 20 73 74 61 74 75 73 2d 69  status" status-i
11150 6e 29 29 29 0a 20 20 20 20 28 69 66 20 28 6f 72  n))).    (if (or
11160 20 28 6e 6f 74 20 73 74 61 74 65 29 28 6e 6f 74   (not state)(not
11170 20 73 74 61 74 75 73 29 29 0a 09 28 64 65 62 75   status))..(debu
11180 67 3a 70 72 69 6e 74 20 30 20 22 57 41 52 4e 49  g:print 0 "WARNI
11190 4e 47 3a 20 49 6e 76 61 6c 69 64 20 22 20 28 69  NG: Invalid " (i
111a0 66 20 73 74 61 74 75 73 20 22 73 74 61 74 75 73  f status "status
111b0 22 20 22 73 74 61 74 65 22 29 0a 09 09 20 20 20  " "state")...   
111c0 20 20 22 20 76 61 6c 75 65 20 5c 22 22 20 28 69    " value \"" (i
111d0 66 20 73 74 61 74 75 73 20 73 74 61 74 65 2d 69  f status state-i
111e0 6e 20 73 74 61 74 75 73 2d 69 6e 29 20 22 5c 22  n status-in) "\"
111f0 2c 20 75 70 64 61 74 65 20 79 6f 75 72 20 76 61  , update your va
11200 6c 69 64 76 61 6c 75 65 73 20 73 65 63 74 69 6f  lidvalues sectio
11210 6e 20 69 6e 20 6d 65 67 61 74 65 73 74 2e 63 6f  n in megatest.co
11220 6e 66 69 67 22 29 29 0a 20 20 20 20 28 69 66 20  nfig")).    (if 
11230 74 64 62 0a 09 28 62 65 67 69 6e 0a 09 20 20 28  tdb..(begin..  (
11240 73 71 6c 69 74 65 33 3a 65 78 65 63 75 74 65 20  sqlite3:execute 
11250 0a 09 20 20 20 74 64 62 0a 09 20 20 20 22 49 4e  ..   tdb..   "IN
11260 53 45 52 54 20 4f 52 20 52 45 50 4c 41 43 45 20  SERT OR REPLACE 
11270 69 6e 74 6f 20 74 65 73 74 5f 73 74 65 70 73 20  into test_steps 
11280 28 74 65 73 74 5f 69 64 2c 73 74 65 70 6e 61 6d  (test_id,stepnam
11290 65 2c 73 74 61 74 65 2c 73 74 61 74 75 73 2c 65  e,state,status,e
112a0 76 65 6e 74 5f 74 69 6d 65 2c 63 6f 6d 6d 65 6e  vent_time,commen
112b0 74 2c 6c 6f 67 66 69 6c 65 29 20 56 41 4c 55 45  t,logfile) VALUE
112c0 53 28 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 29  S(?,?,?,?,?,?,?)
112d0 3b 22 0a 09 20 20 20 74 65 73 74 2d 69 64 20 74  ;"..   test-id t
112e0 65 73 74 73 74 65 70 2d 6e 61 6d 65 20 73 74 61  eststep-name sta
112f0 74 65 2d 69 6e 20 73 74 61 74 75 73 2d 69 6e 20  te-in status-in 
11300 28 63 75 72 72 65 6e 74 2d 73 65 63 6f 6e 64 73  (current-seconds
11310 29 20 28 69 66 20 63 6f 6d 6d 65 6e 74 20 63 6f  ) (if comment co
11320 6d 6d 65 6e 74 20 22 22 29 20 28 69 66 20 6c 6f  mment "") (if lo
11330 67 66 69 6c 65 20 6c 6f 67 66 69 6c 65 20 22 22  gfile logfile ""
11340 29 29 0a 09 20 20 28 73 71 6c 69 74 65 33 3a 66  ))..  (sqlite3:f
11350 69 6e 61 6c 69 7a 65 21 20 74 64 62 29 0a 09 20  inalize! tdb).. 
11360 20 23 74 29 0a 09 23 66 29 29 29 0a 0a 3b 3b 3d   #t)..#f)))..;;=
11370 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
11380 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
11390 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
113a0 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
113b0 3d 3d 3d 3d 3d 0a 3b 3b 20 45 78 74 72 61 63 74  =====.;; Extract
113c0 20 6f 64 73 20 66 69 6c 65 20 66 72 6f 6d 20 74   ods file from t
113d0 68 65 20 64 62 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d  he db.;;========
113e0 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
113f0 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
11400 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
11410 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a  ==============..
11420 3b 3b 20 72 75 6e 73 70 61 74 74 20 69 73 20 61  ;; runspatt is a
11430 20 63 6f 6d 6d 61 20 64 65 6c 69 6d 69 74 65 64   comma delimited
11440 20 6c 69 73 74 20 6f 66 20 72 75 6e 20 70 61 74   list of run pat
11450 74 65 72 6e 73 0a 3b 3b 20 6b 65 79 70 61 74 74  terns.;; keypatt
11460 2d 61 6c 69 73 74 20 6d 75 73 74 20 63 6f 6e 74  -alist must cont
11470 61 69 6e 20 2a 61 6c 6c 2a 20 6b 65 79 73 20 77  ain *all* keys w
11480 69 74 68 20 61 6e 20 61 73 73 6f 63 69 61 74 65  ith an associate
11490 64 20 70 61 74 74 65 72 6e 3a 20 27 28 20 28 22  d pattern: '( ("
114a0 4b 45 59 31 22 20 22 25 22 29 20 2e 2e 20 29 0a  KEY1" "%") .. ).
114b0 28 64 65 66 69 6e 65 20 28 64 62 3a 65 78 74 72  (define (db:extr
114c0 61 63 74 2d 6f 64 73 2d 66 69 6c 65 20 64 62 20  act-ods-file db 
114d0 6f 75 74 70 75 74 66 69 6c 65 20 6b 65 79 70 61  outputfile keypa
114e0 74 74 2d 61 6c 69 73 74 20 72 75 6e 73 70 61 74  tt-alist runspat
114f0 74 20 70 61 74 68 6d 6f 64 29 0a 20 20 28 6c 65  t pathmod).  (le
11500 74 2a 20 28 28 6b 65 79 73 73 74 72 20 20 28 73  t* ((keysstr  (s
11510 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73  tring-interspers
11520 65 20 28 6d 61 70 20 63 61 72 20 6b 65 79 70 61  e (map car keypa
11530 74 74 2d 61 6c 69 73 74 29 20 22 2c 22 29 29 0a  tt-alist) ",")).
11540 09 20 28 6b 65 79 71 72 79 20 20 20 28 73 74 72  . (keyqry   (str
11550 69 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20  ing-intersperse 
11560 28 6d 61 70 20 28 6c 61 6d 62 64 61 20 28 70 29  (map (lambda (p)
11570 28 63 6f 6e 63 20 28 63 61 72 20 70 29 20 22 20  (conc (car p) " 
11580 4c 49 4b 45 20 3f 20 22 29 29 20 6b 65 79 70 61  LIKE ? ")) keypa
11590 74 74 2d 61 6c 69 73 74 29 20 22 20 41 4e 44 20  tt-alist) " AND 
115a0 22 29 29 0a 09 20 28 6e 75 6d 6b 65 79 73 20 20  ")).. (numkeys  
115b0 28 6c 65 6e 67 74 68 20 6b 65 79 70 61 74 74 2d  (length keypatt-
115c0 61 6c 69 73 74 29 29 0a 09 20 28 74 65 73 74 2d  alist)).. (test-
115d0 69 64 73 20 27 28 29 29 0a 09 20 28 77 69 6e 64  ids '()).. (wind
115e0 6f 77 73 20 20 28 61 6e 64 20 70 61 74 68 6d 6f  ows  (and pathmo
115f0 64 20 28 73 75 62 73 74 72 69 6e 67 2d 69 6e 64  d (substring-ind
11600 65 78 20 22 5c 5c 22 20 70 61 74 68 6d 6f 64 29  ex "\\" pathmod)
11610 29 29 0a 09 20 28 74 65 6d 70 64 69 72 20 20 28  )).. (tempdir  (
11620 63 6f 6e 63 20 22 2f 74 6d 70 2f 22 20 28 63 75  conc "/tmp/" (cu
11630 72 72 65 6e 74 2d 75 73 65 72 2d 6e 61 6d 65 29  rrent-user-name)
11640 20 22 2f 22 20 72 75 6e 73 70 61 74 74 20 22 5f   "/" runspatt "_
11650 22 20 28 72 61 6e 64 6f 6d 20 31 30 30 30 30 29  " (random 10000)
11660 20 22 5f 22 20 28 63 75 72 72 65 6e 74 2d 70 72   "_" (current-pr
11670 6f 63 65 73 73 2d 69 64 29 29 29 0a 09 20 28 72  ocess-id))).. (r
11680 75 6e 73 68 65 61 64 65 72 20 28 61 70 70 65 6e  unsheader (appen
11690 64 20 28 6c 69 73 74 20 22 52 75 6e 20 49 64 22  d (list "Run Id"
116a0 20 22 52 75 6e 6e 61 6d 65 22 29 20 3b 20 30 20   "Runname") ; 0 
116b0 31 0a 09 09 09 20 20 20 20 20 28 6d 61 70 20 63  1....     (map c
116c0 61 72 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74  ar keypatt-alist
116d0 29 20 20 20 3b 20 2b 20 4e 20 3d 20 6c 65 6e 67  )   ; + N = leng
116e0 74 68 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74  th keypatt-alist
116f0 0a 09 09 09 20 20 20 20 20 28 6c 69 73 74 20 22  ....     (list "
11700 54 65 73 74 6e 61 6d 65 22 20 20 20 20 20 20 20  Testname"       
11710 20 20 20 3b 20 32 0a 09 09 09 09 20 20 20 22 49     ; 2.....   "I
11720 74 65 6d 20 50 61 74 68 22 20 20 20 20 20 20 20  tem Path"       
11730 20 20 3b 20 33 20 0a 09 09 09 09 20 20 20 22 44    ; 3 .....   "D
11740 65 73 63 72 69 70 74 69 6f 6e 22 20 20 20 20 20  escription"     
11750 20 20 3b 20 34 20 0a 09 09 09 09 20 20 20 22 53    ; 4 .....   "S
11760 74 61 74 65 22 20 20 20 20 20 20 20 20 20 20 20  tate"           
11770 20 20 3b 20 35 20 0a 09 09 09 09 20 20 20 22 53    ; 5 .....   "S
11780 74 61 74 75 73 22 20 20 20 20 20 20 20 20 20 20  tatus"          
11790 20 20 3b 20 36 20 20 0a 09 09 09 09 20 20 20 22    ; 6  .....   "
117a0 46 69 6e 61 6c 20 4c 6f 67 22 20 20 20 20 20 20  Final Log"      
117b0 20 20 20 3b 20 37 20 0a 09 09 09 09 20 20 20 22     ; 7 .....   "
117c0 52 75 6e 20 44 75 72 61 74 69 6f 6e 22 20 20 20  Run Duration"   
117d0 20 20 20 3b 20 38 20 0a 09 09 09 09 20 20 20 22     ; 8 .....   "
117e0 57 68 65 6e 20 52 75 6e 22 20 20 20 20 20 20 20  When Run"       
117f0 20 20 20 3b 20 39 20 0a 09 09 09 09 20 20 20 22     ; 9 .....   "
11800 54 61 67 73 22 20 20 20 20 20 20 20 20 20 20 20  Tags"           
11810 20 20 20 3b 20 31 30 0a 09 09 09 09 20 20 20 22     ; 10.....   "
11820 52 75 6e 20 4f 77 6e 65 72 22 20 20 20 20 20 20  Run Owner"      
11830 20 20 20 3b 20 31 31 0a 09 09 09 09 20 20 20 22     ; 11.....   "
11840 43 6f 6d 6d 65 6e 74 22 20 20 20 20 20 20 20 20  Comment"        
11850 20 20 20 3b 20 31 32 0a 09 09 09 09 20 20 20 22     ; 12.....   "
11860 41 75 74 68 6f 72 22 20 20 20 20 20 20 20 20 20  Author"         
11870 20 20 20 3b 20 31 33 0a 09 09 09 09 20 20 20 22     ; 13.....   "
11880 54 65 73 74 20 4f 77 6e 65 72 22 20 20 20 20 20  Test Owner"     
11890 20 20 20 3b 20 31 34 0a 09 09 09 09 20 20 20 22     ; 14.....   "
118a0 52 65 76 69 65 77 65 64 22 20 20 20 20 20 20 20  Reviewed"       
118b0 20 20 20 3b 20 31 35 0a 09 09 09 09 20 20 20 22     ; 15.....   "
118c0 44 69 73 6b 66 72 65 65 22 20 20 20 20 20 20 20  Diskfree"       
118d0 20 20 20 3b 20 31 36 0a 09 09 09 09 20 20 20 22     ; 16.....   "
118e0 55 6e 61 6d 65 22 20 20 20 20 20 20 20 20 20 20  Uname"          
118f0 20 20 20 3b 20 31 37 0a 09 09 09 09 20 20 20 22     ; 17.....   "
11900 52 75 6e 64 69 72 22 20 20 20 20 20 20 20 20 20  Rundir"         
11910 20 20 20 3b 20 31 38 0a 09 09 09 09 20 20 20 22     ; 18.....   "
11920 48 6f 73 74 22 20 20 20 20 20 20 20 20 20 20 20  Host"           
11930 20 20 20 3b 20 31 39 0a 09 09 09 09 20 20 20 22     ; 19.....   "
11940 43 70 75 20 4c 6f 61 64 22 20 20 20 20 20 20 20  Cpu Load"       
11950 20 20 20 3b 20 32 30 0a 09 09 09 09 20 20 20 29     ; 20.....   )
11960 29 29 0a 09 20 28 72 65 73 75 6c 74 73 20 28 6c  )).. (results (l
11970 69 73 74 20 72 75 6e 73 68 65 61 64 65 72 29 29  ist runsheader))
11980 09 09 09 20 0a 09 20 28 74 65 73 74 64 61 74 61  ... .. (testdata
11990 2d 68 65 61 64 65 72 20 28 6c 69 73 74 20 22 52  -header (list "R
119a0 75 6e 20 49 64 22 20 22 54 65 73 74 6e 61 6d 65  un Id" "Testname
119b0 22 20 22 49 74 65 6d 20 50 61 74 68 22 20 22 43  " "Item Path" "C
119c0 61 74 65 67 6f 72 79 22 20 22 56 61 72 69 61 62  ategory" "Variab
119d0 6c 65 22 20 22 56 61 6c 75 65 22 20 22 45 78 70  le" "Value" "Exp
119e0 65 63 74 65 64 22 20 22 54 6f 6c 22 20 22 55 6e  ected" "Tol" "Un
119f0 69 74 73 22 20 22 53 74 61 74 75 73 22 20 22 43  its" "Status" "C
11a00 6f 6d 6d 65 6e 74 22 29 29 0a 09 20 28 6d 61 69  omment")).. (mai
11a10 6e 71 72 79 20 28 63 6f 6e 63 20 22 53 45 4c 45  nqry (conc "SELE
11a20 43 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  CT.             
11a30 20 74 2e 74 65 73 74 6e 61 6d 65 2c 72 2e 69 64   t.testname,r.id
11a40 2c 72 75 6e 6e 61 6d 65 2c 22 20 6b 65 79 73 73  ,runname," keyss
11a50 74 72 20 22 2c 74 2e 74 65 73 74 6e 61 6d 65 2c  tr ",t.testname,
11a60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  .              t
11a70 2e 69 74 65 6d 5f 70 61 74 68 2c 74 6d 2e 64 65  .item_path,tm.de
11a80 73 63 72 69 70 74 69 6f 6e 2c 74 2e 73 74 61 74  scription,t.stat
11a90 65 2c 74 2e 73 74 61 74 75 73 2c 0a 20 20 20 20  e,t.status,.    
11aa0 20 20 20 20 20 20 20 20 20 20 66 69 6e 61 6c 5f            final_
11ab0 6c 6f 67 66 2c 72 75 6e 5f 64 75 72 61 74 69 6f  logf,run_duratio
11ac0 6e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  n, .            
11ad0 20 20 73 74 72 66 74 69 6d 65 28 27 25 6d 2f 25    strftime('%m/%
11ae0 64 2f 25 59 20 25 48 3a 25 4d 3a 25 53 27 2c 64  d/%Y %H:%M:%S',d
11af0 61 74 65 74 69 6d 65 28 74 2e 65 76 65 6e 74 5f  atetime(t.event_
11b00 74 69 6d 65 2c 27 75 6e 69 78 65 70 6f 63 68 27  time,'unixepoch'
11b10 29 2c 27 6c 6f 63 61 6c 74 69 6d 65 27 29 2c 0a  ),'localtime'),.
11b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6d                tm
11b30 2e 74 61 67 73 2c 72 2e 6f 77 6e 65 72 2c 74 2e  .tags,r.owner,t.
11b40 63 6f 6d 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20  comment,.       
11b50 20 20 20 20 20 20 20 61 75 74 68 6f 72 2c 0a 20         author,. 
11b60 20 20 20 20 20 20 20 20 20 20 20 20 20 74 6d 2e               tm.
11b70 6f 77 6e 65 72 2c 72 65 76 69 65 77 65 64 2c 0a  owner,reviewed,.
11b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
11b90 73 6b 66 72 65 65 2c 75 6e 61 6d 65 2c 72 75 6e  skfree,uname,run
11ba0 64 69 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  dir,.           
11bb0 20 20 20 68 6f 73 74 2c 63 70 75 6c 6f 61 64 0a     host,cpuload.
11bc0 20 20 20 20 20 20 20 20 20 20 20 20 46 52 4f 4d              FROM
11bd0 20 74 65 73 74 73 20 41 53 20 74 20 4a 4f 49 4e   tests AS t JOIN
11be0 20 72 75 6e 73 20 41 53 20 72 20 4f 4e 20 74 2e   runs AS r ON t.
11bf0 72 75 6e 5f 69 64 3d 72 2e 69 64 20 4a 4f 49 4e  run_id=r.id JOIN
11c00 20 74 65 73 74 5f 6d 65 74 61 20 41 53 20 74 6d   test_meta AS tm
11c10 20 4f 4e 20 74 6d 2e 74 65 73 74 6e 61 6d 65 3d   ON tm.testname=
11c20 74 2e 74 65 73 74 6e 61 6d 65 0a 20 20 20 20 20  t.testname.     
11c30 20 20 20 20 20 20 20 57 48 45 52 45 20 72 75 6e         WHERE run
11c40 6e 61 6d 65 20 4c 49 4b 45 20 3f 20 41 4e 44 20  name LIKE ? AND 
11c50 22 20 6b 65 79 71 72 79 20 22 3b 22 29 29 29 0a  " keyqry ";"))).
11c60 20 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e 74      (debug:print
11c70 20 32 20 22 55 73 69 6e 67 20 22 20 74 65 6d 70   2 "Using " temp
11c80 64 69 72 20 22 20 66 6f 72 20 63 6f 6e 73 74 72  dir " for constr
11c90 75 63 74 69 6e 67 20 74 68 65 20 6f 64 73 20 66  ucting the ods f
11ca0 69 6c 65 2e 20 6b 65 79 71 72 79 3a 20 22 20 6b  ile. keyqry: " k
11cb0 65 79 71 72 79 20 22 20 6b 65 79 73 74 72 3a 20  eyqry " keystr: 
11cc0 22 20 6b 65 79 73 73 74 72 20 22 20 77 69 74 68  " keysstr " with
11cd0 20 6b 65 79 73 3a 20 22 20 28 6d 61 70 20 63 61   keys: " (map ca
11ce0 64 72 20 6b 65 79 70 61 74 74 2d 61 6c 69 73 74  dr keypatt-alist
11cf0 29 0a 09 09 20 22 5c 6e 20 20 20 20 20 20 6d 61  )... "\n      ma
11d00 69 6e 71 72 79 3a 20 22 20 6d 61 69 6e 71 72 79  inqry: " mainqry
11d10 29 0a 20 20 20 20 3b 3b 20 22 45 78 70 65 63 74  ).    ;; "Expect
11d20 65 64 20 56 61 6c 75 65 22 0a 20 20 20 20 3b 3b  ed Value".    ;;
11d30 20 22 56 61 6c 75 65 20 46 6f 75 6e 64 22 0a 20   "Value Found". 
11d40 20 20 20 3b 3b 20 22 54 6f 6c 65 72 61 6e 63 65     ;; "Tolerance
11d50 22 0a 20 20 20 20 28 61 70 70 6c 79 20 73 71 6c  ".    (apply sql
11d60 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72 6f  ite3:for-each-ro
11d70 77 0a 09 20 20 20 28 6c 61 6d 62 64 61 20 28 74  w..   (lambda (t
11d80 65 73 74 2d 69 64 20 2e 20 62 29 0a 09 20 20 20  est-id . b)..   
11d90 20 20 28 73 65 74 21 20 74 65 73 74 2d 69 64 73    (set! test-ids
11da0 20 28 63 6f 6e 73 20 74 65 73 74 2d 69 64 20 74   (cons test-id t
11db0 65 73 74 2d 69 64 73 29 29 20 20 20 3b 3b 20 74  est-ids))   ;; t
11dc0 65 73 74 2d 69 64 20 69 73 20 6e 6f 77 20 74 65  est-id is now te
11dd0 73 74 6e 61 6d 65 0a 09 20 20 20 20 20 28 73 65  stname..     (se
11de0 74 21 20 72 65 73 75 6c 74 73 20 28 61 70 70 65  t! results (appe
11df0 6e 64 20 72 65 73 75 6c 74 73 20 3b 3b 20 6e 6f  nd results ;; no
11e00 74 65 2c 20 64 72 6f 70 20 74 68 65 20 74 65 73  te, drop the tes
11e10 74 2d 69 64 0a 09 09 09 09 20 20 20 28 6c 69 73  t-id.....   (lis
11e20 74 0a 09 09 09 09 20 20 20 20 28 69 66 20 70 61  t.....    (if pa
11e30 74 68 6d 6f 64 0a 09 09 09 09 09 28 6c 65 74 2a  thmod......(let*
11e40 20 28 28 76 62 20 20 20 20 20 20 20 20 28 61 70   ((vb        (ap
11e50 70 6c 79 20 76 65 63 74 6f 72 20 62 29 29 0a 09  ply vector b))..
11e60 09 09 09 09 20 20 20 20 20 20 20 28 6b 65 79 76  ....       (keyv
11e70 61 6c 73 20 20 20 28 6c 65 74 20 6c 6f 6f 70 20  als   (let loop 
11e80 28 28 69 20 20 20 20 30 29 0a 09 09 09 09 09 09  ((i    0).......
11e90 09 09 20 20 20 20 20 28 72 65 73 20 27 28 29 29  ..     (res '())
11ea0 29 0a 09 09 09 09 09 09 09 20 20 20 20 28 69 66  )........    (if
11eb0 20 28 3e 3d 20 69 20 6e 75 6d 6b 65 79 73 29 0a   (>= i numkeys).
11ec0 09 09 09 09 09 09 09 09 72 65 73 0a 09 09 09 09  ........res.....
11ed0 09 09 09 09 28 6c 6f 6f 70 20 28 2b 20 69 20 31  ....(loop (+ i 1
11ee0 29 0a 09 09 09 09 09 09 09 09 20 20 20 20 20 20  ).........      
11ef0 28 61 70 70 65 6e 64 20 72 65 73 20 28 6c 69 73  (append res (lis
11f00 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62  t (vector-ref vb
11f10 20 28 2b 20 69 20 32 29 29 29 29 29 29 29 29 0a   (+ i 2)))))))).
11f20 09 09 09 09 09 20 20 20 20 20 20 20 28 72 75 6e  .....       (run
11f30 6e 61 6d 65 20 20 20 28 76 65 63 74 6f 72 2d 72  name   (vector-r
11f40 65 66 20 76 62 20 31 29 29 0a 09 09 09 09 09 20  ef vb 1))...... 
11f50 20 20 20 20 20 20 28 74 65 73 74 6e 61 6d 65 20        (testname 
11f60 20 28 76 65 63 74 6f 72 2d 72 65 66 20 76 62 20   (vector-ref vb 
11f70 28 2b 20 20 32 20 6e 75 6d 6b 65 79 73 29 29 29  (+  2 numkeys)))
11f80 0a 09 09 09 09 09 20 20 20 20 20 20 20 28 69 74  ......       (it
11f90 65 6d 2d 70 61 74 68 20 28 76 65 63 74 6f 72 2d  em-path (vector-
11fa0 72 65 66 20 76 62 20 28 2b 20 20 33 20 6e 75 6d  ref vb (+  3 num
11fb0 6b 65 79 73 29 29 29 0a 09 09 09 09 09 20 20 20  keys)))......   
11fc0 20 20 20 20 28 66 69 6e 61 6c 2d 6c 6f 67 20 28      (final-log (
11fd0 76 65 63 74 6f 72 2d 72 65 66 20 76 62 20 28 2b  vector-ref vb (+
11fe0 20 20 37 20 6e 75 6d 6b 65 79 73 29 29 29 0a 09    7 numkeys)))..
11ff0 09 09 09 09 20 20 20 20 20 20 20 28 72 75 6e 2d  ....       (run-
12000 64 69 72 20 20 20 28 76 65 63 74 6f 72 2d 72 65  dir   (vector-re
12010 66 20 76 62 20 28 2b 20 31 38 20 6e 75 6d 6b 65  f vb (+ 18 numke
12020 79 73 29 29 29 0a 09 09 09 09 09 20 20 20 20 20  ys)))......     
12030 20 20 28 6c 6f 67 2d 66 70 61 74 68 20 28 63 6f    (log-fpath (co
12040 6e 63 20 72 75 6e 2d 64 69 72 20 22 2f 22 20 20  nc run-dir "/"  
12050 66 69 6e 61 6c 2d 6c 6f 67 29 29 29 20 3b 3b 20  final-log))) ;; 
12060 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65  (string-interspe
12070 72 73 65 20 6b 65 79 76 61 6c 73 20 22 2f 22 29  rse keyvals "/")
12080 20 22 2f 22 20 74 65 73 74 6e 61 6d 65 20 22 2f   "/" testname "/
12090 22 20 69 74 65 6d 2d 70 61 74 68 20 22 2f 22 0a  " item-path "/".
120a0 09 09 09 09 09 20 20 28 64 65 62 75 67 3a 70 72  .....  (debug:pr
120b0 69 6e 74 20 34 20 22 6c 6f 67 3a 20 22 20 6c 6f  int 4 "log: " lo
120c0 67 2d 66 70 61 74 68 20 22 20 65 78 69 73 74 73  g-fpath " exists
120d0 3a 20 22 20 28 66 69 6c 65 2d 65 78 69 73 74 73  : " (file-exists
120e0 3f 20 6c 6f 67 2d 66 70 61 74 68 29 29 0a 09 09  ? log-fpath))...
120f0 09 09 09 20 20 28 76 65 63 74 6f 72 2d 73 65 74  ...  (vector-set
12100 21 20 76 62 20 28 2b 20 37 20 6e 75 6d 6b 65 79  ! vb (+ 7 numkey
12110 73 29 20 28 69 66 20 28 66 69 6c 65 2d 65 78 69  s) (if (file-exi
12120 73 74 73 3f 20 6c 6f 67 2d 66 70 61 74 68 29 0a  sts? log-fpath).
12130 09 09 09 09 09 09 09 09 09 20 20 20 20 28 6c 65  .........    (le
12140 74 20 28 28 6e 65 77 70 61 74 68 20 28 63 6f 6e  t ((newpath (con
12150 63 20 70 61 74 68 6d 6f 64 20 22 2f 22 0a 09 09  c pathmod "/"...
12160 09 09 09 09 09 09 09 09 09 09 20 28 73 74 72 69  .......... (stri
12170 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 6b  ng-intersperse k
12180 65 79 76 61 6c 73 20 22 2f 22 29 0a 09 09 09 09  eyvals "/").....
12190 09 09 09 09 09 09 09 09 20 22 2f 22 20 72 75 6e  ........ "/" run
121a0 6e 61 6d 65 20 22 2f 22 20 74 65 73 74 6e 61 6d  name "/" testnam
121b0 65 20 22 2f 22 0a 09 09 09 09 09 09 09 09 09 09  e "/"...........
121c0 09 09 20 28 69 66 20 28 73 74 72 69 6e 67 3d 3f  .. (if (string=?
121d0 20 69 74 65 6d 2d 70 61 74 68 20 22 22 29 20 22   item-path "") "
121e0 22 20 28 63 6f 6e 63 20 22 2f 22 20 69 74 65 6d  " (conc "/" item
121f0 2d 70 61 74 68 29 29 0a 09 09 09 09 09 09 09 09  -path)).........
12200 09 09 09 09 20 66 69 6e 61 6c 2d 6c 6f 67 29 29  .... final-log))
12210 29 0a 09 09 09 09 09 09 09 09 09 20 20 20 20 20  )..........     
12220 20 3b 3b 20 66 6f 72 20 6e 6f 77 20 74 68 72 6f   ;; for now thro
12230 77 20 61 77 61 79 20 6e 65 77 70 61 74 68 20 61  w away newpath a
12240 6e 64 20 75 73 65 20 74 68 65 20 6c 6f 67 2d 66  nd use the log-f
12250 70 61 74 68 20 63 6f 6e 63 27 64 20 77 69 74 68  path conc'd with
12260 20 70 61 74 68 6d 6f 64 0a 09 09 09 09 09 09 09   pathmod........
12270 09 09 20 20 20 20 20 20 28 73 65 74 21 20 6e 65  ..      (set! ne
12280 77 70 61 74 68 20 28 63 6f 6e 63 20 70 61 74 68  wpath (conc path
12290 6d 6f 64 20 6c 6f 67 2d 66 70 61 74 68 29 29 0a  mod log-fpath)).
122a0 09 09 09 09 09 09 09 09 09 20 20 20 20 20 20 28  .........      (
122b0 69 66 20 77 69 6e 64 6f 77 73 20 28 73 74 72 69  if windows (stri
122c0 6e 67 2d 74 72 61 6e 73 6c 61 74 65 20 6e 65 77  ng-translate new
122d0 70 61 74 68 20 22 2f 22 20 22 5c 5c 22 29 20 6e  path "/" "\\") n
122e0 65 77 70 61 74 68 29 29 0a 09 09 09 09 09 09 09  ewpath))........
122f0 09 09 20 20 20 20 28 69 66 20 28 64 65 62 75 67  ..    (if (debug
12300 3a 64 65 62 75 67 2d 6d 6f 64 65 20 31 29 0a 09  :debug-mode 1)..
12310 09 09 09 09 09 09 09 09 09 28 63 6f 6e 63 20 66  .........(conc f
12320 69 6e 61 6c 2d 6c 6f 67 20 22 20 6e 6f 74 2d 66  inal-log " not-f
12330 6f 75 6e 64 22 29 0a 09 09 09 09 09 09 09 09 09  ound")..........
12340 09 22 22 29 29 29 0a 09 09 09 09 09 20 20 28 76  ."")))......  (v
12350 65 63 74 6f 72 2d 3e 6c 69 73 74 20 76 62 29 29  ector->list vb))
12360 0a 09 09 09 09 09 62 29 29 29 29 29 0a 09 20 20  ......b)))))..  
12370 20 64 62 0a 09 20 20 20 6d 61 69 6e 71 72 79 0a   db..   mainqry.
12380 09 20 20 20 72 75 6e 73 70 61 74 74 20 28 6d 61  .   runspatt (ma
12390 70 20 63 61 64 72 20 6b 65 79 70 61 74 74 2d 61  p cadr keypatt-a
123a0 6c 69 73 74 29 29 0a 20 20 20 20 28 64 65 62 75  list)).    (debu
123b0 67 3a 70 72 69 6e 74 20 32 20 22 46 6f 75 6e 64  g:print 2 "Found
123c0 20 22 20 28 6c 65 6e 67 74 68 20 74 65 73 74 2d   " (length test-
123d0 69 64 73 29 20 22 20 72 65 63 6f 72 64 73 22 29  ids) " records")
123e0 0a 20 20 20 20 28 73 65 74 21 20 72 65 73 75 6c  .    (set! resul
123f0 74 73 20 28 6c 69 73 74 20 28 63 6f 6e 73 20 22  ts (list (cons "
12400 52 75 6e 73 22 20 72 65 73 75 6c 74 73 29 29 29  Runs" results)))
12410 0a 20 20 20 20 3b 3b 20 6e 6f 77 2c 20 66 6f 72  .    ;; now, for
12420 20 65 61 63 68 20 74 65 73 74 2c 20 63 6f 6c 6c   each test, coll
12430 65 63 74 20 74 68 65 20 74 65 73 74 5f 64 61 74  ect the test_dat
12440 61 20 69 6e 66 6f 20 61 6e 64 20 61 64 64 20 61  a info and add a
12450 20 6e 65 77 20 73 68 65 65 74 0a 20 20 20 20 28   new sheet.    (
12460 66 6f 72 2d 65 61 63 68 0a 20 20 20 20 20 28 6c  for-each.     (l
12470 61 6d 62 64 61 20 28 74 65 73 74 2d 69 64 29 0a  ambda (test-id).
12480 20 20 20 20 20 20 20 28 6c 65 74 20 28 28 74 65         (let ((te
12490 73 74 2d 64 61 74 61 20 28 6c 69 73 74 20 74 65  st-data (list te
124a0 73 74 64 61 74 61 2d 68 65 61 64 65 72 29 29 0a  stdata-header)).
124b0 09 20 20 20 20 20 28 63 75 72 72 2d 74 65 73 74  .     (curr-test
124c0 2d 6e 61 6d 65 20 23 66 29 29 0a 09 20 28 73 71  -name #f)).. (sq
124d0 6c 69 74 65 33 3a 66 6f 72 2d 65 61 63 68 2d 72  lite3:for-each-r
124e0 6f 77 0a 09 20 20 28 6c 61 6d 62 64 61 20 28 72  ow..  (lambda (r
124f0 75 6e 2d 69 64 20 74 65 73 74 6e 61 6d 65 20 69  un-id testname i
12500 74 65 6d 2d 70 61 74 68 20 63 61 74 65 67 6f 72  tem-path categor
12510 79 20 76 61 72 69 61 62 6c 65 20 76 61 6c 75 65  y variable value
12520 20 65 78 70 65 63 74 65 64 20 74 6f 6c 20 75 6e   expected tol un
12530 69 74 73 20 73 74 61 74 75 73 20 63 6f 6d 6d 65  its status comme
12540 6e 74 29 0a 09 20 20 20 20 28 73 65 74 21 20 63  nt)..    (set! c
12550 75 72 72 2d 74 65 73 74 2d 6e 61 6d 65 20 74 65  urr-test-name te
12560 73 74 6e 61 6d 65 29 0a 09 20 20 20 20 28 73 65  stname)..    (se
12570 74 21 20 74 65 73 74 2d 64 61 74 61 20 28 61 70  t! test-data (ap
12580 70 65 6e 64 20 74 65 73 74 2d 64 61 74 61 20 28  pend test-data (
12590 6c 69 73 74 20 28 6c 69 73 74 20 72 75 6e 2d 69  list (list run-i
125a0 64 20 74 65 73 74 6e 61 6d 65 20 69 74 65 6d 2d  d testname item-
125b0 70 61 74 68 20 63 61 74 65 67 6f 72 79 20 76 61  path category va
125c0 72 69 61 62 6c 65 20 76 61 6c 75 65 20 65 78 70  riable value exp
125d0 65 63 74 65 64 20 74 6f 6c 20 75 6e 69 74 73 20  ected tol units 
125e0 73 74 61 74 75 73 20 63 6f 6d 6d 65 6e 74 29 29  status comment))
125f0 29 29 29 0a 09 20 20 64 62 20 0a 09 20 20 3b 3b  )))..  db ..  ;;
12600 20 22 53 45 4c 45 43 54 20 72 75 6e 5f 69 64 2c   "SELECT run_id,
12610 74 65 73 74 6e 61 6d 65 2c 69 74 65 6d 5f 70 61  testname,item_pa
12620 74 68 2c 63 61 74 65 67 6f 72 79 2c 76 61 72 69  th,category,vari
12630 61 62 6c 65 2c 74 64 2e 76 61 6c 75 65 20 41 53  able,td.value AS
12640 20 76 61 6c 75 65 2c 65 78 70 65 63 74 65 64 2c   value,expected,
12650 74 6f 6c 2c 75 6e 69 74 73 2c 74 64 2e 73 74 61  tol,units,td.sta
12660 74 75 73 20 41 53 20 73 74 61 74 75 73 2c 74 64  tus AS status,td
12670 2e 63 6f 6d 6d 65 6e 74 20 41 53 20 63 6f 6d 6d  .comment AS comm
12680 65 6e 74 20 46 52 4f 4d 20 74 65 73 74 5f 64 61  ent FROM test_da
12690 74 61 20 41 53 20 74 64 20 49 4e 4e 45 52 20 4a  ta AS td INNER J
126a0 4f 49 4e 20 74 65 73 74 73 20 4f 4e 20 74 65 73  OIN tests ON tes
126b0 74 73 2e 69 64 3d 74 64 2e 74 65 73 74 5f 69 64  ts.id=td.test_id
126c0 20 57 48 45 52 45 20 74 65 73 74 5f 69 64 3d 3f   WHERE test_id=?
126d0 3b 22 0a 09 20 20 22 53 45 4c 45 43 54 20 72 75  ;"..  "SELECT ru
126e0 6e 5f 69 64 2c 74 65 73 74 6e 61 6d 65 2c 69 74  n_id,testname,it
126f0 65 6d 5f 70 61 74 68 2c 63 61 74 65 67 6f 72 79  em_path,category
12700 2c 76 61 72 69 61 62 6c 65 2c 74 64 2e 76 61 6c  ,variable,td.val
12710 75 65 20 41 53 20 76 61 6c 75 65 2c 74 64 2e 65  ue AS value,td.e
12720 78 70 65 63 74 65 64 2c 74 64 2e 74 6f 6c 2c 74  xpected,td.tol,t
12730 64 2e 75 6e 69 74 73 2c 74 64 2e 73 74 61 74 75  d.units,td.statu
12740 73 20 41 53 20 73 74 61 74 75 73 2c 74 64 2e 63  s AS status,td.c
12750 6f 6d 6d 65 6e 74 20 41 53 20 63 6f 6d 6d 65 6e  omment AS commen
12760 74 20 46 52 4f 4d 20 74 65 73 74 5f 64 61 74 61  t FROM test_data
12770 20 41 53 20 74 64 20 49 4e 4e 45 52 20 4a 4f 49   AS td INNER JOI
12780 4e 20 74 65 73 74 73 20 4f 4e 20 74 65 73 74 73  N tests ON tests
12790 2e 69 64 3d 74 64 2e 74 65 73 74 5f 69 64 20 57  .id=td.test_id W
127a0 48 45 52 45 20 74 65 73 74 6e 61 6d 65 3d 3f 3b  HERE testname=?;
127b0 22 0a 09 20 20 74 65 73 74 2d 69 64 29 0a 09 20  "..  test-id).. 
127c0 28 69 66 20 63 75 72 72 2d 74 65 73 74 2d 6e 61  (if curr-test-na
127d0 6d 65 0a 09 20 20 20 20 20 28 73 65 74 21 20 72  me..     (set! r
127e0 65 73 75 6c 74 73 20 28 61 70 70 65 6e 64 20 72  esults (append r
127f0 65 73 75 6c 74 73 20 28 6c 69 73 74 20 28 63 6f  esults (list (co
12800 6e 73 20 63 75 72 72 2d 74 65 73 74 2d 6e 61 6d  ns curr-test-nam
12810 65 20 74 65 73 74 2d 64 61 74 61 29 29 29 29 29  e test-data)))))
12820 0a 09 20 29 29 0a 20 20 20 20 20 28 73 6f 72 74  .. )).     (sort
12830 20 28 64 65 6c 65 74 65 2d 64 75 70 6c 69 63 61   (delete-duplica
12840 74 65 73 20 74 65 73 74 2d 69 64 73 29 20 73 74  tes test-ids) st
12850 72 69 6e 67 3c 3d 29 29 0a 20 20 20 20 28 73 79  ring<=)).    (sy
12860 73 74 65 6d 20 28 63 6f 6e 63 20 22 6d 6b 64 69  stem (conc "mkdi
12870 72 20 2d 70 20 22 20 74 65 6d 70 64 69 72 29 29  r -p " tempdir))
12880 0a 20 20 20 20 3b 3b 20 28 70 70 20 72 65 73 75  .    ;; (pp resu
12890 6c 74 73 29 0a 20 20 20 20 28 6f 64 73 3a 6c 69  lts).    (ods:li
128a0 73 74 2d 3e 6f 64 73 20 0a 20 20 20 20 20 74 65  st->ods .     te
128b0 6d 70 64 69 72 0a 20 20 20 20 20 28 69 66 20 28  mpdir.     (if (
128c0 73 74 72 69 6e 67 2d 6d 61 74 63 68 20 28 72 65  string-match (re
128d0 67 65 78 70 20 22 5e 5b 2f 7e 5d 2b 2e 2a 22 29  gexp "^[/~]+.*")
128e0 20 6f 75 74 70 75 74 66 69 6c 65 29 20 3b 3b 20   outputfile) ;; 
128f0 66 75 6c 6c 20 70 61 74 68 3f 0a 09 20 6f 75 74  full path?.. out
12900 70 75 74 66 69 6c 65 0a 09 20 28 62 65 67 69 6e  putfile.. (begin
12910 0a 09 20 20 20 28 64 65 62 75 67 3a 70 72 69 6e  ..   (debug:prin
12920 74 20 30 20 22 57 41 52 4e 49 4e 47 3a 20 70 61  t 0 "WARNING: pa
12930 74 68 20 67 69 76 65 6e 2c 20 22 20 6f 75 74 70  th given, " outp
12940 75 74 66 69 6c 65 20 22 20 69 73 20 72 65 6c 61  utfile " is rela
12950 74 69 76 65 2c 20 70 72 65 66 69 78 69 6e 67 20  tive, prefixing 
12960 77 69 74 68 20 63 75 72 72 65 6e 74 20 64 69 72  with current dir
12970 65 63 74 6f 72 79 22 29 0a 09 20 20 20 28 63 6f  ectory")..   (co
12980 6e 63 20 28 63 75 72 72 65 6e 74 2d 64 69 72 65  nc (current-dire
12990 63 74 6f 72 79 29 20 22 2f 22 20 6f 75 74 70 75  ctory) "/" outpu
129a0 74 66 69 6c 65 29 29 29 0a 20 20 20 20 20 72 65  tfile))).     re
129b0 73 75 6c 74 73 29 0a 20 20 20 20 3b 3b 20 62 72  sults).    ;; br
129c0 75 74 61 6c 20 63 6c 65 61 6e 20 75 70 0a 20 20  utal clean up.  
129d0 20 20 28 73 79 73 74 65 6d 20 22 72 6d 20 2d 72    (system "rm -r
129e0 66 20 74 65 6d 70 64 69 72 22 29 29 29 0a 0a 3b  f tempdir")))..;
129f0 3b 20 28 64 62 3a 65 78 74 72 61 63 74 2d 6f 64  ; (db:extract-od
12a00 73 2d 66 69 6c 65 20 64 62 20 22 6f 75 74 70 75  s-file db "outpu
12a10 74 66 69 6c 65 2e 6f 64 73 22 20 27 28 28 22 73  tfile.ods" '(("s
12a20 79 73 6e 61 6d 65 22 20 22 25 22 29 28 22 66 73  ysname" "%")("fs
12a30 6e 61 6d 65 22 20 22 25 22 29 28 22 64 61 74 61  name" "%")("data
12a40 70 61 74 68 22 20 22 25 22 29 29 20 22 25 22 29  path" "%")) "%")
12a50 0a 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ...;;===========
12a60 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
12a70 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
12a80 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
12a90 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 52  ===========.;; R
12aa0 45 4d 4f 54 45 20 44 42 20 41 43 43 45 53 53 20  EMOTE DB ACCESS 
12ab0 56 49 41 20 52 50 43 0a 3b 3b 3d 3d 3d 3d 3d 3d  VIA RPC.;;======
12ac0 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
12ad0 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
12ae0 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
12af0 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
12b00 0a 0a 3b 3b 20 28 64 65 66 69 6e 65 20 28 72 64  ..;; (define (rd
12b10 62 3a 74 65 73 74 2d 73 65 74 2d 73 74 61 74 75  b:test-set-statu
12b20 73 2d 73 74 61 74 65 20 74 65 73 74 2d 69 64 20  s-state test-id 
12b30 73 74 61 74 75 73 20 73 74 61 74 65 20 6d 73 67  status state msg
12b40 29 0a 3b 3b 20 20 20 28 69 66 20 2a 72 75 6e 72  ).;;   (if *runr
12b50 65 6d 6f 74 65 2a 0a 3b 3b 20 20 20 20 20 20 20  emote*.;;       
12b60 28 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65 63  (let ((host (vec
12b70 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f  tor-ref *runremo
12b80 74 65 2a 20 30 29 29 0a 3b 3b 20 09 20 20 20 20  te* 0)).;; .    
12b90 28 70 6f 72 74 20 28 76 65 63 74 6f 72 2d 72 65  (port (vector-re
12ba0 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29  f *runremote* 1)
12bb0 29 29 0a 3b 3b 20 09 28 68 61 6e 64 6c 65 2d 65  )).;; .(handle-e
12bc0 78 63 65 70 74 69 6f 6e 73 0a 3b 3b 20 09 20 65  xceptions.;; . e
12bd0 78 6e 0a 3b 3b 20 09 20 28 62 65 67 69 6e 0a 3b  xn.;; . (begin.;
12be0 3b 20 09 20 20 20 28 64 65 62 75 67 3a 70 72 69  ; .   (debug:pri
12bf0 6e 74 20 30 20 22 45 58 43 45 50 54 49 4f 4e 3a  nt 0 "EXCEPTION:
12c00 20 72 70 63 20 63 61 6c 6c 20 66 61 69 6c 65 64   rpc call failed
12c10 3f 22 29 0a 3b 3b 20 09 20 20 20 28 64 65 62 75  ?").;; .   (debu
12c20 67 3a 70 72 69 6e 74 20 30 20 22 20 20 22 20 28  g:print 0 "  " (
12c30 28 63 6f 6e 64 69 74 69 6f 6e 2d 70 72 6f 70 65  (condition-prope
12c40 72 74 79 2d 61 63 63 65 73 73 6f 72 20 27 65 78  rty-accessor 'ex
12c50 6e 20 27 6d 65 73 73 61 67 65 29 20 65 78 6e 29  n 'message) exn)
12c60 29 0a 3b 3b 20 09 20 20 20 28 70 72 69 6e 74 2d  ).;; .   (print-
12c70 63 61 6c 6c 2d 63 68 61 69 6e 29 0a 3b 3b 20 09  call-chain).;; .
12c80 20 20 20 28 63 64 62 3a 74 65 73 74 2d 73 65 74     (cdb:test-set
12c90 2d 73 74 61 74 75 73 2d 73 74 61 74 65 20 74 65  -status-state te
12ca0 73 74 2d 69 64 20 73 74 61 74 75 73 20 73 74 61  st-id status sta
12cb0 74 65 20 6d 73 67 29 29 0a 3b 3b 20 09 20 28 28  te msg)).;; . ((
12cc0 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20 27 63  rpc:procedure 'c
12cd0 64 62 3a 74 65 73 74 2d 73 65 74 2d 73 74 61 74  db:test-set-stat
12ce0 75 73 2d 73 74 61 74 65 20 68 6f 73 74 20 70 6f  us-state host po
12cf0 72 74 29 20 74 65 73 74 2d 69 64 20 73 74 61 74  rt) test-id stat
12d00 75 73 20 73 74 61 74 65 20 6d 73 67 29 29 29 0a  us state msg))).
12d10 3b 3b 20 20 20 20 20 20 20 28 63 64 62 3a 74 65  ;;       (cdb:te
12d20 73 74 2d 73 65 74 2d 73 74 61 74 75 73 2d 73 74  st-set-status-st
12d30 61 74 65 20 74 65 73 74 2d 69 64 20 73 74 61 74  ate test-id stat
12d40 75 73 20 73 74 61 74 65 20 6d 73 67 29 29 29 0a  us state msg))).
12d50 3b 3b 20 0a 3b 3b 20 28 64 65 66 69 6e 65 20 28  ;; .;; (define (
12d60 72 64 62 3a 74 65 73 74 2d 72 6f 6c 6c 75 70 2d  rdb:test-rollup-
12d70 74 65 73 74 5f 64 61 74 61 2d 70 61 73 73 2d 66  test_data-pass-f
12d80 61 69 6c 20 74 65 73 74 2d 69 64 29 0a 3b 3b 20  ail test-id).;; 
12d90 20 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f 74 65    (if *runremote
12da0 2a 0a 3b 3b 20 20 20 20 20 20 20 28 6c 65 74 20  *.;;       (let 
12db0 28 28 68 6f 73 74 20 28 76 65 63 74 6f 72 2d 72  ((host (vector-r
12dc0 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 30  ef *runremote* 0
12dd0 29 29 0a 3b 3b 20 09 20 20 20 20 28 70 6f 72 74  )).;; .    (port
12de0 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a 72 75   (vector-ref *ru
12df0 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a 3b 3b  nremote* 1))).;;
12e00 20 09 28 28 72 70 63 3a 70 72 6f 63 65 64 75 72   .((rpc:procedur
12e10 65 20 27 63 64 62 3a 74 65 73 74 2d 72 6f 6c 6c  e 'cdb:test-roll
12e20 75 70 2d 74 65 73 74 5f 64 61 74 61 2d 70 61 73  up-test_data-pas
12e30 73 2d 66 61 69 6c 20 68 6f 73 74 20 70 6f 72 74  s-fail host port
12e40 29 20 74 65 73 74 2d 69 64 29 29 0a 3b 3b 20 20  ) test-id)).;;  
12e50 20 20 20 20 20 28 63 64 62 3a 74 65 73 74 2d 72       (cdb:test-r
12e60 6f 6c 6c 75 70 2d 74 65 73 74 5f 64 61 74 61 2d  ollup-test_data-
12e70 70 61 73 73 2d 66 61 69 6c 20 74 65 73 74 2d 69  pass-fail test-i
12e80 64 29 29 29 0a 3b 3b 20 0a 3b 3b 20 28 64 65 66  d))).;; .;; (def
12e90 69 6e 65 20 28 72 64 62 3a 70 61 73 73 2d 66 61  ine (rdb:pass-fa
12ea0 69 6c 2d 63 6f 75 6e 74 73 20 74 65 73 74 2d 69  il-counts test-i
12eb0 64 20 66 61 69 6c 2d 63 6f 75 6e 74 20 70 61 73  d fail-count pas
12ec0 73 2d 63 6f 75 6e 74 29 0a 3b 3b 20 20 20 28 69  s-count).;;   (i
12ed0 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 0a 3b 3b  f *runremote*.;;
12ee0 20 20 20 20 20 20 20 28 6c 65 74 20 28 28 68 6f         (let ((ho
12ef0 73 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a  st (vector-ref *
12f00 72 75 6e 72 65 6d 6f 74 65 2a 20 30 29 29 0a 3b  runremote* 0)).;
12f10 3b 20 09 20 20 20 20 28 70 6f 72 74 20 28 76 65  ; .    (port (ve
12f20 63 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d  ctor-ref *runrem
12f30 6f 74 65 2a 20 31 29 29 29 0a 3b 3b 20 09 28 28  ote* 1))).;; .((
12f40 72 70 63 3a 70 72 6f 63 65 64 75 72 65 20 27 63  rpc:procedure 'c
12f50 64 62 3a 70 61 73 73 2d 66 61 69 6c 2d 63 6f 75  db:pass-fail-cou
12f60 6e 74 73 20 68 6f 73 74 20 70 6f 72 74 29 20 74  nts host port) t
12f70 65 73 74 2d 69 64 20 66 61 69 6c 2d 63 6f 75 6e  est-id fail-coun
12f80 74 20 70 61 73 73 2d 63 6f 75 6e 74 29 29 0a 3b  t pass-count)).;
12f90 3b 20 20 20 20 20 20 20 28 63 64 62 3a 70 61 73  ;       (cdb:pas
12fa0 73 2d 66 61 69 6c 2d 63 6f 75 6e 74 73 20 74 65  s-fail-counts te
12fb0 73 74 2d 69 64 20 66 61 69 6c 2d 63 6f 75 6e 74  st-id fail-count
12fc0 20 70 61 73 73 2d 63 6f 75 6e 74 29 29 29 0a 3b   pass-count))).;
12fd0 3b 20 0a 3b 3b 20 3b 3b 20 63 75 72 72 65 6e 74  ; .;; ;; current
12fe0 6c 79 20 66 6f 72 63 65 73 20 61 20 66 6c 75 73  ly forces a flus
12ff0 68 20 6f 66 20 74 68 65 20 71 75 65 75 65 0a 3b  h of the queue.;
13000 3b 20 28 64 65 66 69 6e 65 20 28 72 64 62 3a 74  ; (define (rdb:t
13010 65 73 74 73 2d 72 65 67 69 73 74 65 72 2d 74 65  ests-register-te
13020 73 74 20 64 62 20 72 75 6e 2d 69 64 20 74 65 73  st db run-id tes
13030 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74 68  t-name item-path
13040 29 0a 3b 3b 20 20 20 28 69 66 20 2a 72 75 6e 72  ).;;   (if *runr
13050 65 6d 6f 74 65 2a 0a 3b 3b 20 20 20 20 20 20 20  emote*.;;       
13060 28 6c 65 74 20 28 28 68 6f 73 74 20 28 76 65 63  (let ((host (vec
13070 74 6f 72 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f  tor-ref *runremo
13080 74 65 2a 20 30 29 29 0a 3b 3b 20 09 20 20 20 20  te* 0)).;; .    
13090 28 70 6f 72 74 20 28 76 65 63 74 6f 72 2d 72 65  (port (vector-re
130a0 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29  f *runremote* 1)
130b0 29 29 0a 3b 3b 20 09 28 28 72 70 63 3a 70 72 6f  )).;; .((rpc:pro
130c0 63 65 64 75 72 65 20 27 63 64 62 3a 74 65 73 74  cedure 'cdb:test
130d0 73 2d 72 65 67 69 73 74 65 72 2d 74 65 73 74 20  s-register-test 
130e0 68 6f 73 74 20 70 6f 72 74 29 20 64 62 20 72 75  host port) db ru
130f0 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69  n-id test-name i
13100 74 65 6d 2d 70 61 74 68 20 66 6f 72 63 65 2d 77  tem-path force-w
13110 72 69 74 65 3a 20 23 74 29 29 0a 3b 3b 20 20 20  rite: #t)).;;   
13120 20 20 20 20 28 63 64 62 3a 74 65 73 74 73 2d 72      (cdb:tests-r
13130 65 67 69 73 74 65 72 2d 74 65 73 74 20 64 62 20  egister-test db 
13140 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65  run-id test-name
13150 20 69 74 65 6d 2d 70 61 74 68 20 66 6f 72 63 65   item-path force
13160 2d 77 72 69 74 65 3a 20 23 74 29 29 29 0a 3b 3b  -write: #t))).;;
13170 20 0a 3b 3b 20 28 64 65 66 69 6e 65 20 28 72 64   .;; (define (rd
13180 62 3a 66 6c 75 73 68 2d 71 75 65 75 65 29 0a 3b  b:flush-queue).;
13190 3b 20 20 20 28 69 66 20 2a 72 75 6e 72 65 6d 6f  ;   (if *runremo
131a0 74 65 2a 0a 3b 3b 20 20 20 20 20 20 20 28 6c 65  te*.;;       (le
131b0 74 20 28 28 68 6f 73 74 20 28 76 65 63 74 6f 72  t ((host (vector
131c0 2d 72 65 66 20 2a 72 75 6e 72 65 6d 6f 74 65 2a  -ref *runremote*
131d0 20 30 29 29 0a 3b 3b 20 09 20 20 20 20 28 70 6f   0)).;; .    (po
131e0 72 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 2a  rt (vector-ref *
131f0 72 75 6e 72 65 6d 6f 74 65 2a 20 31 29 29 29 0a  runremote* 1))).
13200 3b 3b 20 09 28 28 72 70 63 3a 70 72 6f 63 65 64  ;; .((rpc:proced
13210 75 72 65 20 27 63 64 62 3a 66 6c 75 73 68 2d 71  ure 'cdb:flush-q
13220 75 65 75 65 20 68 6f 73 74 20 70 6f 72 74 29 29  ueue host port))
13230 29 0a 3b 3b 20 20 20 20 20 20 20 28 63 64 62 3a  ).;;       (cdb:
13240 66 6c 75 73 68 2d 71 75 65 75 65 29 29 29 0a 3b  flush-queue))).;
13250 3b 20 0a                                         ; .