Megatest

Hex Artifact Content
Login

Artifact c47a2a291e2b0d1a4134bfbc9deaecaf9004d73d:


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 31 37 2c 20 4d 61 74 74  right 2017, Matt
0060: 68 65 77 20 57 65 6c 6c 61 6e 64 2e 0a 3b 3b 20  hew Welland..;; 
0070: 0a 3b 3b 20 20 54 68 69 73 20 70 72 6f 67 72 61  .;;  This progra
0080: 6d 20 69 73 20 6d 61 64 65 20 61 76 61 69 6c 61  m is made availa
0090: 62 6c 65 20 75 6e 64 65 72 20 74 68 65 20 47 4e  ble under the GN
00a0: 55 20 47 50 4c 20 76 65 72 73 69 6f 6e 20 32 2e  U GPL version 2.
00b0: 30 20 6f 72 0a 3b 3b 20 20 67 72 65 61 74 65 72  0 or.;;  greater
00c0: 2e 20 53 65 65 20 74 68 65 20 61 63 63 6f 6d 70  . See the accomp
00d0: 61 6e 79 69 6e 67 20 66 69 6c 65 20 43 4f 50 59  anying file COPY
00e0: 49 4e 47 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  ING for details.
00f0: 0a 3b 3b 20 0a 3b 3b 20 20 54 68 69 73 20 70 72  .;; .;;  This pr
0100: 6f 67 72 61 6d 20 69 73 20 64 69 73 74 72 69 62  ogram is distrib
0110: 75 74 65 64 20 57 49 54 48 4f 55 54 20 41 4e 59  uted WITHOUT ANY
0120: 20 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 6f   WARRANTY; witho
0130: 75 74 20 65 76 65 6e 20 74 68 65 0a 3b 3b 20 20  ut even the.;;  
0140: 69 6d 70 6c 69 65 64 20 77 61 72 72 61 6e 74 79  implied warranty
0150: 20 6f 66 20 4d 45 52 43 48 41 4e 54 41 42 49 4c   of MERCHANTABIL
0160: 49 54 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46  ITY or FITNESS F
0170: 4f 52 20 41 20 50 41 52 54 49 43 55 4c 41 52 0a  OR A PARTICULAR.
0180: 3b 3b 20 20 50 55 52 50 4f 53 45 2e 0a 3b 3b 3d  ;;  PURPOSE..;;=
0190: 3d 3d 3d 3d 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 0a 0a 28 64 65 63 6c 61 72 65 20  =====..(declare 
01e0: 28 75 6e 69 74 20 70 67 64 62 29 29 0a 28 64 65  (unit pgdb)).(de
01f0: 63 6c 61 72 65 20 28 75 73 65 73 20 63 6f 6e 66  clare (uses conf
0200: 69 67 66 29 29 0a 0a 3b 3b 20 49 20 64 6f 6e 27  igf))..;; I don'
0210: 74 20 6b 6e 6f 77 20 68 6f 77 20 74 6f 20 6d 69  t know how to mi
0220: 78 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 75 6e  x compilation un
0230: 69 74 73 20 61 6e 64 20 6d 6f 64 75 6c 65 73 2c  its and modules,
0240: 20 73 6f 20 6e 6f 20 6d 6f 64 75 6c 65 20 68 65   so no module he
0250: 72 65 2e 0a 3b 3b 0a 3b 3b 20 28 6d 6f 64 75 6c  re..;;.;; (modul
0260: 65 20 70 67 64 62 0a 3b 3b 20 20 20 20 20 28 0a  e pgdb.;;     (.
0270: 3b 3b 20 20 20 20 20 20 6f 70 65 6e 2d 70 67 64  ;;      open-pgd
0280: 62 0a 3b 3b 20 20 20 20 20 20 29 0a 3b 3b 20 0a  b.;;      ).;; .
0290: 3b 3b 20 28 69 6d 70 6f 72 74 20 73 63 68 65 6d  ;; (import schem
02a0: 65 29 0a 3b 3b 20 28 69 6d 70 6f 72 74 20 64 61  e).;; (import da
02b0: 74 61 2d 73 74 72 75 63 74 75 72 65 73 29 0a 3b  ta-structures).;
02c0: 3b 20 28 69 6d 70 6f 72 74 20 63 68 69 63 6b 65  ; (import chicke
02d0: 6e 29 0a 0a 28 75 73 65 20 74 79 70 65 64 2d 72  n)..(use typed-r
02e0: 65 63 6f 72 64 73 20 28 70 72 65 66 69 78 20 64  ecords (prefix d
02f0: 62 69 20 64 62 69 3a 29 29 0a 0a 3b 3b 20 67 69  bi dbi:))..;; gi
0300: 76 65 6e 20 61 20 63 6f 6e 66 69 67 64 61 74 20  ven a configdat 
0310: 6c 6f 6f 6b 75 70 20 74 68 65 20 63 6f 6e 6e 65  lookup the conne
0320: 63 74 69 6f 6e 20 69 6e 66 6f 20 61 6e 64 20 6f  ction info and o
0330: 70 65 6e 20 74 68 65 20 64 62 0a 3b 3b 0a 28 64  pen the db.;;.(d
0340: 65 66 69 6e 65 20 28 70 67 64 62 3a 6f 70 65 6e  efine (pgdb:open
0350: 20 63 6f 6e 66 69 67 64 61 74 20 23 21 6b 65 79   configdat #!key
0360: 20 28 64 62 6e 61 6d 65 20 23 66 29 28 64 62 69   (dbname #f)(dbi
0370: 73 70 65 63 20 23 66 29 29 20 20 0a 20 20 28 6c  spec #f))  .  (l
0380: 65 74 20 28 28 70 67 63 6f 6e 66 20 28 6f 72 20  et ((pgconf (or 
0390: 64 62 69 73 70 65 63 0a 09 09 20 20 20 20 28 61  dbispec...    (a
03a0: 72 67 73 3a 67 65 74 2d 61 72 67 20 22 2d 70 67  rgs:get-arg "-pg
03b0: 73 79 6e 63 22 29 0a 09 09 20 20 20 20 28 69 66  sync")...    (if
03c0: 20 63 6f 6e 66 69 67 64 61 74 0a 09 09 09 28 63   configdat....(c
03d0: 6f 6e 66 69 67 66 3a 6c 6f 6f 6b 75 70 20 63 6f  onfigf:lookup co
03e0: 6e 66 69 67 64 61 74 20 22 65 78 74 2d 73 79 6e  nfigdat "ext-syn
03f0: 63 22 20 28 6f 72 20 64 62 6e 61 6d 65 20 22 70  c" (or dbname "p
0400: 67 64 62 22 29 29 0a 09 09 09 23 66 29 0a 09 09  gdb"))....#f)...
0410: 20 20 20 20 29 29 29 0a 20 20 20 20 28 69 66 20      ))).    (if 
0420: 70 67 63 6f 6e 66 0a 09 28 6c 65 74 2a 20 28 28  pgconf..(let* ((
0430: 63 6f 6e 66 64 61 74 20 28 6d 61 70 20 28 6c 61  confdat (map (la
0440: 6d 62 64 61 20 28 63 6f 6e 66 2d 69 74 65 6d 29  mbda (conf-item)
0450: 0a 09 09 09 20 20 20 20 20 20 20 28 6c 65 74 20  ....       (let 
0460: 28 28 70 61 72 74 73 20 28 73 74 72 69 6e 67 2d  ((parts (string-
0470: 73 70 6c 69 74 20 63 6f 6e 66 2d 69 74 65 6d 20  split conf-item 
0480: 22 3a 22 29 29 29 0a 09 09 09 09 20 28 69 66 20  ":")))..... (if 
0490: 28 3e 20 28 6c 65 6e 67 74 68 20 70 61 72 74 73  (> (length parts
04a0: 29 20 31 29 0a 09 09 09 09 20 20 20 20 20 28 6c  ) 1).....     (l
04b0: 65 74 20 28 28 6b 65 79 20 28 63 61 72 20 70 61  et ((key (car pa
04c0: 72 74 73 29 29 0a 09 09 09 09 09 20 20 20 28 76  rts))......   (v
04d0: 61 6c 20 28 63 61 64 72 20 70 61 72 74 73 29 29  al (cadr parts))
04e0: 29 0a 09 09 09 09 20 20 20 20 20 20 20 28 63 6f  ).....       (co
04f0: 6e 73 20 28 73 74 72 69 6e 67 2d 3e 73 79 6d 62  ns (string->symb
0500: 6f 6c 20 6b 65 79 29 20 76 61 6c 29 29 0a 09 09  ol key) val))...
0510: 09 09 20 20 20 20 20 28 62 65 67 69 6e 0a 09 09  ..     (begin...
0520: 09 09 20 20 20 20 20 20 20 28 70 72 69 6e 74 20  ..       (print 
0530: 22 45 52 52 4f 52 3a 20 42 61 64 20 63 6f 6e 66  "ERROR: Bad conf
0540: 69 67 20 73 65 74 74 69 6e 67 20 22 20 63 6f 6e  ig setting " con
0550: 66 2d 69 74 65 6d 20 22 2c 20 73 68 6f 75 6c 64  f-item ", should
0560: 20 62 65 20 6b 65 79 3a 76 61 6c 22 29 0a 09 09   be key:val")...
0570: 09 09 20 20 20 20 20 20 20 60 28 2c 28 73 74 72  ..       `(,(str
0580: 69 6e 67 2d 3e 73 79 6d 62 6f 6c 20 28 63 61 72  ing->symbol (car
0590: 20 70 61 72 74 73 29 29 20 2e 20 23 66 29 29 29   parts)) . #f)))
05a0: 29 29 0a 09 09 09 20 20 20 20 20 28 73 74 72 69  ))....     (stri
05b0: 6e 67 2d 73 70 6c 69 74 20 70 67 63 6f 6e 66 29  ng-split pgconf)
05c0: 29 29 0a 09 20 20 20 20 20 20 20 28 64 62 74 79  ))..       (dbty
05d0: 70 65 20 20 20 28 73 74 72 69 6e 67 2d 3e 73 79  pe   (string->sy
05e0: 6d 62 6f 6c 20 28 6f 72 20 28 61 6c 69 73 74 2d  mbol (or (alist-
05f0: 72 65 66 20 27 64 62 74 79 70 65 20 63 6f 6e 66  ref 'dbtype conf
0600: 64 61 74 29 20 22 70 67 22 29 29 29 29 0a 09 20  dat) "pg")))).. 
0610: 20 28 69 66 20 28 61 6c 69 73 74 2d 72 65 66 20   (if (alist-ref 
0620: 27 64 62 74 79 70 65 20 63 6f 6e 66 64 61 74 29  'dbtype confdat)
0630: 0a 09 20 20 20 20 20 20 28 64 62 69 3a 6f 70 65  ..      (dbi:ope
0640: 6e 20 64 62 74 79 70 65 20 28 61 6c 69 73 74 2d  n dbtype (alist-
0650: 64 65 6c 65 74 65 20 27 64 62 74 79 70 65 20 63  delete 'dbtype c
0660: 6f 6e 66 64 61 74 29 29 29 29 0a 09 23 66 29 29  onfdat))))..#f))
0670: 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  )..;;===========
0680: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0690: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
06a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
06b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 20  ===========.;;  
06c0: 41 20 52 20 45 20 41 20 53 0a 3b 3b 3d 3d 3d 3d  A R E A S.;;====
06d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
06e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
06f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0700: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0710: 3d 3d 0a 0a 28 64 65 66 73 74 72 75 63 74 20 61  ==..(defstruct a
0720: 72 65 61 20 69 64 20 61 72 65 61 2d 6e 61 6d 65  rea id area-name
0730: 20 61 72 65 61 2d 70 61 74 68 20 6c 61 73 74 2d   area-path last-
0740: 75 70 64 61 74 65 29 0a 0a 28 64 65 66 69 6e 65  update)..(define
0750: 20 28 70 67 64 62 3a 61 64 64 2d 61 72 65 61 20   (pgdb:add-area 
0760: 64 62 68 20 61 72 65 61 2d 6e 61 6d 65 20 61 72  dbh area-name ar
0770: 65 61 2d 70 61 74 68 29 0a 20 20 28 64 62 69 3a  ea-path).  (dbi:
0780: 65 78 65 63 20 64 62 68 20 22 49 4e 53 45 52 54  exec dbh "INSERT
0790: 20 49 4e 54 4f 20 61 72 65 61 73 20 28 61 72 65   INTO areas (are
07a0: 61 5f 6e 61 6d 65 2c 61 72 65 61 5f 70 61 74 68  a_name,area_path
07b0: 29 20 56 41 4c 55 45 53 20 28 3f 2c 3f 29 22 20  ) VALUES (?,?)" 
07c0: 61 72 65 61 2d 6e 61 6d 65 20 61 72 65 61 2d 70  area-name area-p
07d0: 61 74 68 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  ath))..(define (
07e0: 70 67 64 62 3a 67 65 74 2d 61 72 65 61 73 20 64  pgdb:get-areas d
07f0: 62 68 29 0a 20 20 3b 3b 20 28 6d 61 70 0a 20 20  bh).  ;; (map.  
0800: 3b 3b 20 20 28 6c 61 6d 62 64 61 20 28 72 6f 77  ;;  (lambda (row
0810: 29 0a 20 20 3b 3b 20 20 20 20 28 70 72 69 6e 74  ).  ;;    (print
0820: 20 22 72 6f 77 3a 20 22 20 72 6f 77 29 29 0a 20   "row: " row)). 
0830: 20 28 64 62 69 3a 67 65 74 2d 72 6f 77 73 20 64   (dbi:get-rows d
0840: 62 68 20 22 53 45 4c 45 43 54 20 69 64 2c 61 72  bh "SELECT id,ar
0850: 65 61 5f 6e 61 6d 65 2c 61 72 65 61 5f 70 61 74  ea_name,area_pat
0860: 68 2c 6c 61 73 74 5f 73 79 6e 63 20 46 52 4f 4d  h,last_sync FROM
0870: 20 61 72 65 61 73 3b 22 29 29 20 3b 3b 20 29 0a   areas;")) ;; ).
0880: 0a 3b 3b 20 67 69 76 65 6e 20 61 6e 20 61 72 65  .;; given an are
0890: 61 5f 70 61 74 68 20 67 65 74 20 74 68 65 20 61  a_path get the a
08a0: 72 65 61 20 69 6e 66 6f 0a 3b 3b 0a 28 64 65 66  rea info.;;.(def
08b0: 69 6e 65 20 28 70 67 64 62 3a 67 65 74 2d 61 72  ine (pgdb:get-ar
08c0: 65 61 2d 62 79 2d 70 61 74 68 20 64 62 68 20 61  ea-by-path dbh a
08d0: 72 65 61 2d 70 61 74 68 29 0a 20 20 28 64 62 69  rea-path).  (dbi
08e0: 3a 67 65 74 2d 6f 6e 65 2d 72 6f 77 20 64 62 68  :get-one-row dbh
08f0: 20 22 53 45 4c 45 43 54 20 69 64 2c 61 72 65 61   "SELECT id,area
0900: 5f 6e 61 6d 65 2c 61 72 65 61 5f 70 61 74 68 2c  _name,area_path,
0910: 6c 61 73 74 5f 73 79 6e 63 20 46 52 4f 4d 20 61  last_sync FROM a
0920: 72 65 61 73 20 57 48 45 52 45 20 61 72 65 61 5f  reas WHERE area_
0930: 70 61 74 68 3d 3f 3b 22 20 61 72 65 61 2d 70 61  path=?;" area-pa
0940: 74 68 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 70  th))..(define (p
0950: 67 64 62 3a 77 72 69 74 65 2d 73 79 6e 63 2d 74  gdb:write-sync-t
0960: 69 6d 65 20 64 62 68 20 61 72 65 61 2d 69 6e 66  ime dbh area-inf
0970: 6f 20 6e 65 77 2d 73 79 6e 63 2d 74 69 6d 65 29  o new-sync-time)
0980: 0a 20 20 28 6c 65 74 20 28 28 61 72 65 61 2d 69  .  (let ((area-i
0990: 64 20 28 76 65 63 74 6f 72 2d 72 65 66 20 61 72  d (vector-ref ar
09a0: 65 61 2d 69 6e 66 6f 20 30 29 29 29 0a 20 20 20  ea-info 0))).   
09b0: 20 28 64 62 69 3a 65 78 65 63 20 64 62 68 20 22   (dbi:exec dbh "
09c0: 55 50 44 41 54 45 20 61 72 65 61 73 20 53 45 54  UPDATE areas SET
09d0: 20 6c 61 73 74 5f 73 79 6e 63 3d 3f 20 57 48 45   last_sync=? WHE
09e0: 52 45 20 69 64 3d 3f 3b 22 20 6e 65 77 2d 73 79  RE id=?;" new-sy
09f0: 6e 63 2d 74 69 6d 65 20 61 72 65 61 2d 69 64 29  nc-time area-id)
0a00: 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ))..;;==========
0a10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0a20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0a30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0a40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20  ============.;; 
0a50: 20 54 20 41 20 52 20 47 20 45 20 54 20 53 0a 3b   T A R G E T S.;
0a60: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;===============
0a70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0a80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0a90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0aa0: 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 47 69 76 65  =======..;; Give
0ab0: 6e 20 61 20 74 61 72 67 65 74 2d 73 70 65 63 2c  n a target-spec,
0ac0: 20 72 65 74 75 72 6e 20 74 68 65 20 69 64 2e 20   return the id. 
0ad0: 53 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20  Should probably 
0ae0: 68 61 6e 64 6c 65 20 74 68 69 73 20 77 69 74 68  handle this with
0af0: 20 61 20 6a 6f 69 6e 2e 2e 2e 0a 3b 3b 20 69 66   a join....;; if
0b00: 20 74 61 72 67 65 74 2d 73 70 65 63 20 6e 6f 74   target-spec not
0b10: 20 66 6f 75 6e 64 2c 20 63 72 65 61 74 65 20 61   found, create a
0b20: 20 72 65 63 6f 72 64 20 66 6f 72 20 69 74 2e 0a   record for it..
0b30: 3b 3b 0a 28 64 65 66 69 6e 65 20 28 70 67 64 62  ;;.(define (pgdb
0b40: 3a 67 65 74 2d 74 74 79 70 65 20 64 62 68 20 74  :get-ttype dbh t
0b50: 61 72 67 65 74 2d 73 70 65 63 29 0a 20 20 28 6c  arget-spec).  (l
0b60: 65 74 20 28 28 73 70 65 63 2d 69 64 20 28 64 62  et ((spec-id (db
0b70: 69 3a 67 65 74 2d 6f 6e 65 20 64 62 68 20 22 53  i:get-one dbh "S
0b80: 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 74 74  ELECT id FROM tt
0b90: 79 70 65 20 57 48 45 52 45 20 74 61 72 67 65 74  ype WHERE target
0ba0: 5f 73 70 65 63 3d 3f 3b 22 20 74 61 72 67 65 74  _spec=?;" target
0bb0: 2d 73 70 65 63 29 29 29 0a 20 20 20 20 28 6f 72  -spec))).    (or
0bc0: 20 73 70 65 63 2d 69 64 0a 09 28 69 66 20 28 68   spec-id..(if (h
0bd0: 61 6e 64 6c 65 2d 65 78 63 65 70 74 69 6f 6e 73  andle-exceptions
0be0: 0a 09 09 65 78 6e 0a 09 09 28 62 65 67 69 6e 0a  ...exn...(begin.
0bf0: 09 09 20 20 28 70 72 69 6e 74 2d 63 61 6c 6c 2d  ..  (print-call-
0c00: 63 68 61 69 6e 29 0a 09 09 20 20 28 64 65 62 75  chain)...  (debu
0c10: 67 3a 70 72 69 6e 74 20 30 20 2a 64 65 66 61 75  g:print 0 *defau
0c20: 6c 74 2d 6c 6f 67 2d 70 6f 72 74 2a 20 22 45 52  lt-log-port* "ER
0c30: 52 4f 52 3a 20 63 61 6e 6e 6f 74 20 63 72 65 61  ROR: cannot crea
0c40: 74 65 20 74 74 79 70 65 20 65 6e 74 72 79 2c 20  te ttype entry, 
0c50: 22 20 28 28 63 6f 6e 64 69 74 69 6f 6e 2d 70 72  " ((condition-pr
0c60: 6f 70 65 72 74 79 2d 61 63 63 65 73 73 6f 72 20  operty-accessor 
0c70: 27 65 78 6e 20 27 6d 65 73 73 61 67 65 29 20 65  'exn 'message) e
0c80: 78 6e 29 29 0a 09 09 20 20 23 66 29 0a 09 20 20  xn))...  #f)..  
0c90: 20 20 20 20 28 64 62 69 3a 65 78 65 63 20 64 62      (dbi:exec db
0ca0: 68 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  h "INSERT INTO t
0cb0: 74 79 70 65 20 28 74 61 72 67 65 74 5f 73 70 65  type (target_spe
0cc0: 63 29 20 56 41 4c 55 45 53 20 28 3f 29 3b 22 20  c) VALUES (?);" 
0cd0: 74 61 72 67 65 74 2d 73 70 65 63 29 29 0a 09 20  target-spec)).. 
0ce0: 20 20 20 28 70 67 64 62 3a 67 65 74 2d 74 74 79     (pgdb:get-tty
0cf0: 70 65 20 64 62 68 20 74 61 72 67 65 74 2d 73 70  pe dbh target-sp
0d00: 65 63 29 29 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d  ec)))))..;;=====
0d10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0d20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0d30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0d40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0d50: 3d 0a 3b 3b 20 20 52 20 55 20 4e 20 53 0a 3b 3b  =.;;  R U N S.;;
0d60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0d70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0d80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0d90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0da0: 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 67 69 76 65 6e  ======..;; given
0db0: 20 61 20 74 61 72 67 65 74 20 73 70 65 63 20 69   a target spec i
0dc0: 64 2c 20 74 61 72 67 65 74 20 61 6e 64 20 72 75  d, target and ru
0dd0: 6e 2d 6e 61 6d 65 20 72 65 74 75 72 6e 20 74 68  n-name return th
0de0: 65 20 72 75 6e 2d 69 64 0a 3b 3b 20 69 66 20 6e  e run-id.;; if n
0df0: 6f 20 72 75 6e 20 66 6f 75 6e 64 20 72 65 74 75  o run found retu
0e00: 72 6e 20 23 66 0a 3b 3b 0a 28 64 65 66 69 6e 65  rn #f.;;.(define
0e10: 20 28 70 67 64 62 3a 67 65 74 2d 72 75 6e 2d 69   (pgdb:get-run-i
0e20: 64 20 64 62 68 20 73 70 65 63 2d 69 64 20 74 61  d dbh spec-id ta
0e30: 72 67 65 74 20 72 75 6e 2d 6e 61 6d 65 29 0a 20  rget run-name). 
0e40: 20 28 64 62 69 3a 67 65 74 2d 6f 6e 65 20 64 62   (dbi:get-one db
0e50: 68 20 22 53 45 4c 45 43 54 20 69 64 20 46 52 4f  h "SELECT id FRO
0e60: 4d 20 72 75 6e 73 20 57 48 45 52 45 20 74 74 79  M runs WHERE tty
0e70: 70 65 5f 69 64 3d 3f 20 41 4e 44 20 74 61 72 67  pe_id=? AND targ
0e80: 65 74 3d 3f 20 41 4e 44 20 72 75 6e 5f 6e 61 6d  et=? AND run_nam
0e90: 65 3d 3f 3b 22 0a 09 20 20 20 20 20 20 20 73 70  e=?;"..       sp
0ea0: 65 63 2d 69 64 20 74 61 72 67 65 74 20 72 75 6e  ec-id target run
0eb0: 2d 6e 61 6d 65 29 29 0a 0a 3b 3b 20 67 69 76 65  -name))..;; give
0ec0: 6e 20 61 20 72 75 6e 2d 69 64 20 72 65 74 75 72  n a run-id retur
0ed0: 6e 20 61 6c 6c 20 74 68 65 20 72 75 6e 20 69 6e  n all the run in
0ee0: 66 6f 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 28 70  fo.;;.(define (p
0ef0: 67 64 62 3a 67 65 74 2d 72 75 6e 2d 69 6e 66 6f  gdb:get-run-info
0f00: 20 64 62 68 20 72 75 6e 2d 69 64 29 20 3b 3b 20   dbh run-id) ;; 
0f10: 74 6f 20 6a 6f 69 6e 20 74 74 79 70 65 20 6f 72  to join ttype or
0f20: 20 6e 6f 74 3f 0a 20 20 28 64 62 69 3a 67 65 74   not?.  (dbi:get
0f30: 2d 6f 6e 65 2d 72 6f 77 0a 20 20 20 64 62 68 20  -one-row.   dbh 
0f40: 20 20 3b 3b 20 30 20 20 20 20 31 20 20 20 20 20    ;; 0    1     
0f50: 20 20 32 20 20 20 20 20 20 20 33 20 20 20 20 20    2       3     
0f60: 20 34 20 20 20 20 20 35 20 20 20 20 20 20 36 20   4     5      6 
0f70: 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20 38        7        8
0f80: 20 20 20 20 20 20 20 20 20 39 20 20 20 20 20 20           9      
0f90: 20 20 20 31 30 20 20 20 20 20 20 20 20 20 20 31     10          1
0fa0: 31 20 20 20 20 20 20 20 20 20 31 32 0a 20 20 20  1         12.   
0fb0: 22 53 45 4c 45 43 54 20 69 64 2c 74 61 72 67 65  "SELECT id,targe
0fc0: 74 2c 74 74 79 70 65 5f 69 64 2c 72 75 6e 5f 6e  t,ttype_id,run_n
0fd0: 61 6d 65 2c 73 74 61 74 65 2c 73 74 61 74 75 73  ame,state,status
0fe0: 2c 6f 77 6e 65 72 2c 65 76 65 6e 74 5f 74 69 6d  ,owner,event_tim
0ff0: 65 2c 63 6f 6d 6d 65 6e 74 2c 66 61 69 6c 5f 63  e,comment,fail_c
1000: 6f 75 6e 74 2c 70 61 73 73 5f 63 6f 75 6e 74 2c  ount,pass_count,
1010: 6c 61 73 74 5f 75 70 64 61 74 65 2c 61 72 65 61  last_update,area
1020: 5f 69 64 0a 20 20 20 20 20 20 20 46 52 4f 4d 20  _id.       FROM 
1030: 72 75 6e 73 20 57 48 45 52 45 20 69 64 3d 3f 3b  runs WHERE id=?;
1040: 22 20 72 75 6e 2d 69 64 29 29 0a 0a 3b 3b 20 72  " run-id))..;; r
1050: 65 66 72 65 73 68 20 74 68 65 20 64 61 74 61 20  efresh the data 
1060: 69 6e 20 61 20 72 75 6e 20 72 65 63 6f 72 64 0a  in a run record.
1070: 3b 3b 0a 28 64 65 66 69 6e 65 20 28 70 67 64 62  ;;.(define (pgdb
1080: 3a 72 65 66 72 65 73 68 2d 72 75 6e 2d 69 6e 66  :refresh-run-inf
1090: 6f 20 64 62 68 20 72 75 6e 2d 69 64 20 73 74 61  o dbh run-id sta
10a0: 74 65 20 73 74 61 74 75 73 20 6f 77 6e 65 72 20  te status owner 
10b0: 65 76 65 6e 74 2d 74 69 6d 65 20 63 6f 6d 6d 65  event-time comme
10c0: 6e 74 20 66 61 69 6c 2d 63 6f 75 6e 74 20 70 61  nt fail-count pa
10d0: 73 73 2d 63 6f 75 6e 74 29 20 3b 3b 20 61 72 65  ss-count) ;; are
10e0: 61 2d 69 64 29 0a 20 20 28 64 62 69 3a 65 78 65  a-id).  (dbi:exe
10f0: 63 0a 20 20 20 64 62 68 0a 20 20 20 22 55 50 44  c.   dbh.   "UPD
1100: 41 54 45 20 72 75 6e 73 20 53 45 54 0a 20 20 20  ATE runs SET.   
1110: 20 20 20 73 74 61 74 65 3d 3f 2c 73 74 61 74 75     state=?,statu
1120: 73 3d 3f 2c 6f 77 6e 65 72 3d 3f 2c 65 76 65 6e  s=?,owner=?,even
1130: 74 5f 74 69 6d 65 3d 3f 2c 63 6f 6d 6d 65 6e 74  t_time=?,comment
1140: 3d 3f 2c 66 61 69 6c 5f 63 6f 75 6e 74 3d 3f 2c  =?,fail_count=?,
1150: 70 61 73 73 5f 63 6f 75 6e 74 3d 3f 0a 20 20 20  pass_count=?.   
1160: 20 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 0a 20    WHERE id=?;". 
1170: 20 20 73 74 61 74 65 20 73 74 61 74 75 73 20 6f    state status o
1180: 77 6e 65 72 20 65 76 65 6e 74 2d 74 69 6d 65 20  wner event-time 
1190: 63 6f 6d 6d 65 6e 74 20 66 61 69 6c 2d 63 6f 75  comment fail-cou
11a0: 6e 74 20 70 61 73 73 2d 63 6f 75 6e 74 20 72 75  nt pass-count ru
11b0: 6e 2d 69 64 29 29 0a 0a 3b 3b 20 67 69 76 65 6e  n-id))..;; given
11c0: 20 61 6c 6c 20 6e 65 65 64 65 64 20 69 6e 66 6f   all needed info
11d0: 20 63 72 65 61 74 65 20 72 75 6e 20 72 65 63 6f   create run reco
11e0: 72 64 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 28 70  rd.;;.(define (p
11f0: 67 64 62 3a 69 6e 73 65 72 74 2d 72 75 6e 20 64  gdb:insert-run d
1200: 62 68 20 74 74 79 70 65 2d 69 64 20 74 61 72 67  bh ttype-id targ
1210: 65 74 20 72 75 6e 2d 6e 61 6d 65 20 73 74 61 74  et run-name stat
1220: 65 20 73 74 61 74 75 73 20 6f 77 6e 65 72 20 65  e status owner e
1230: 76 65 6e 74 2d 74 69 6d 65 20 63 6f 6d 6d 65 6e  vent-time commen
1240: 74 20 66 61 69 6c 2d 63 6f 75 6e 74 20 70 61 73  t fail-count pas
1250: 73 2d 63 6f 75 6e 74 29 0a 20 20 28 64 62 69 3a  s-count).  (dbi:
1260: 65 78 65 63 0a 20 20 20 64 62 68 0a 20 20 20 22  exec.   dbh.   "
1270: 49 4e 53 45 52 54 20 49 4e 54 4f 20 72 75 6e 73  INSERT INTO runs
1280: 20 28 74 74 79 70 65 5f 69 64 2c 74 61 72 67 65   (ttype_id,targe
1290: 74 2c 72 75 6e 5f 6e 61 6d 65 2c 73 74 61 74 65  t,run_name,state
12a0: 2c 73 74 61 74 75 73 2c 6f 77 6e 65 72 2c 65 76  ,status,owner,ev
12b0: 65 6e 74 5f 74 69 6d 65 2c 63 6f 6d 6d 65 6e 74  ent_time,comment
12c0: 2c 66 61 69 6c 5f 63 6f 75 6e 74 2c 70 61 73 73  ,fail_count,pass
12d0: 5f 63 6f 75 6e 74 29 0a 20 20 20 20 20 20 56 41  _count).      VA
12e0: 4c 55 45 53 20 28 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c  LUES (?,?,?,?,?,
12f0: 3f 2c 3f 2c 3f 2c 3f 2c 3f 29 3b 22 0a 20 20 20  ?,?,?,?,?);".   
1300: 20 74 74 79 70 65 2d 69 64 20 74 61 72 67 65 74   ttype-id target
1310: 20 72 75 6e 2d 6e 61 6d 65 20 73 74 61 74 65 20   run-name state 
1320: 73 74 61 74 75 73 20 6f 77 6e 65 72 20 65 76 65  status owner eve
1330: 6e 74 2d 74 69 6d 65 20 63 6f 6d 6d 65 6e 74 20  nt-time comment 
1340: 66 61 69 6c 2d 63 6f 75 6e 74 20 70 61 73 73 2d  fail-count pass-
1350: 63 6f 75 6e 74 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d  count))..;;=====
1360: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1370: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1380: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1390: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
13a0: 3d 0a 3b 3b 20 20 54 20 45 20 53 20 54 20 53 0a  =.;;  T E S T S.
13b0: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
13c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
13d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
13e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
13f0: 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 67 69 76  ========..;; giv
1400: 65 6e 20 72 75 6e 2d 69 64 2c 20 74 65 73 74 5f  en run-id, test_
1410: 6e 61 6d 65 20 61 6e 64 20 69 74 65 6d 5f 70 61  name and item_pa
1420: 74 68 20 72 65 74 75 72 6e 20 74 65 73 74 2d 69  th return test-i
1430: 64 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 28 70 67  d.;;.(define (pg
1440: 64 62 3a 67 65 74 2d 74 65 73 74 2d 69 64 20 64  db:get-test-id d
1450: 62 68 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e  bh run-id test-n
1460: 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 0a 20  ame item-path). 
1470: 20 28 64 62 69 3a 67 65 74 2d 6f 6e 65 0a 20 20   (dbi:get-one.  
1480: 20 64 62 68 0a 20 20 20 22 53 45 4c 45 43 54 20   dbh.   "SELECT 
1490: 69 64 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48  id FROM tests WH
14a0: 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44  ERE run_id=? AND
14b0: 20 74 65 73 74 5f 6e 61 6d 65 3d 3f 20 41 4e 44   test_name=? AND
14c0: 20 69 74 65 6d 5f 70 61 74 68 3d 3f 3b 22 0a 20   item_path=?;". 
14d0: 20 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61    run-id test-na
14e0: 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 29 0a 0a  me item-path))..
14f0: 3b 3b 20 63 72 65 61 74 65 20 6e 65 77 20 74 65  ;; create new te
1500: 73 74 20 72 65 63 6f 72 64 0a 3b 3b 0a 28 64 65  st record.;;.(de
1510: 66 69 6e 65 20 28 70 67 64 62 3a 69 6e 73 65 72  fine (pgdb:inser
1520: 74 2d 74 65 73 74 20 64 62 68 20 72 75 6e 2d 69  t-test dbh run-i
1530: 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d  d test-name item
1540: 2d 70 61 74 68 20 73 74 61 74 65 20 73 74 61 74  -path state stat
1550: 75 73 20 68 6f 73 74 20 63 70 75 6c 6f 61 64 20  us host cpuload 
1560: 64 69 73 6b 66 72 65 65 20 75 6e 61 6d 65 20 72  diskfree uname r
1570: 75 6e 2d 64 69 72 20 6c 6f 67 2d 66 69 6c 65 20  un-dir log-file 
1580: 72 75 6e 2d 64 75 72 61 74 69 6f 6e 20 63 6f 6d  run-duration com
1590: 6d 65 6e 74 20 65 76 65 6e 74 2d 74 69 6d 65 20  ment event-time 
15a0: 61 72 63 68 69 76 65 64 29 0a 20 20 28 64 62 69  archived).  (dbi
15b0: 3a 65 78 65 63 0a 20 20 20 64 62 68 0a 20 20 20  :exec.   dbh.   
15c0: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 65 73  "INSERT INTO tes
15d0: 74 73 20 28 72 75 6e 5f 69 64 2c 74 65 73 74 5f  ts (run_id,test_
15e0: 6e 61 6d 65 2c 69 74 65 6d 5f 70 61 74 68 2c 73  name,item_path,s
15f0: 74 61 74 65 2c 73 74 61 74 75 73 2c 68 6f 73 74  tate,status,host
1600: 2c 63 70 75 6c 6f 61 64 2c 64 69 73 6b 66 72 65  ,cpuload,diskfre
1610: 65 2c 75 6e 61 6d 65 2c 72 75 6e 64 69 72 2c 66  e,uname,rundir,f
1620: 69 6e 61 6c 5f 6c 6f 67 66 2c 72 75 6e 5f 64 75  inal_logf,run_du
1630: 72 61 74 69 6f 6e 2c 63 6f 6d 6d 65 6e 74 2c 65  ration,comment,e
1640: 76 65 6e 74 5f 74 69 6d 65 2c 61 72 63 68 69 76  vent_time,archiv
1650: 65 64 29 0a 20 20 20 20 20 20 20 56 41 4c 55 45  ed).       VALUE
1660: 53 20 28 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f  S (?,?,?,?,?,?,?
1670: 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f  ,?,?,?,?,?,?,?,?
1680: 29 3b 22 0a 0a 20 20 20 72 75 6e 2d 69 64 20 20  );"..   run-id  
1690: 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70  test-name item-p
16a0: 61 74 68 20 20 20 20 73 74 61 74 65 20 20 20 73  ath    state   s
16b0: 74 61 74 75 73 20 20 20 20 20 68 6f 73 74 20 20  tatus     host  
16c0: 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65  cpuload diskfree
16d0: 20 75 6e 61 6d 65 0a 20 20 20 72 75 6e 2d 64 69   uname.   run-di
16e0: 72 20 6c 6f 67 2d 66 69 6c 65 20 20 72 75 6e 2d  r log-file  run-
16f0: 64 75 72 61 74 69 6f 6e 20 63 6f 6d 6d 65 6e 74  duration comment
1700: 20 65 76 65 6e 74 2d 74 69 6d 65 20 61 72 63 68   event-time arch
1710: 69 76 65 64 29 29 0a 0a 3b 3b 20 75 70 64 61 74  ived))..;; updat
1720: 65 20 65 78 69 73 74 69 6e 67 20 74 65 73 74 20  e existing test 
1730: 72 65 63 6f 72 64 0a 3b 3b 0a 28 64 65 66 69 6e  record.;;.(defin
1740: 65 20 28 70 67 64 62 3a 75 70 64 61 74 65 2d 74  e (pgdb:update-t
1750: 65 73 74 20 64 62 68 20 74 65 73 74 2d 69 64 20  est dbh test-id 
1760: 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65  run-id test-name
1770: 20 69 74 65 6d 2d 70 61 74 68 20 73 74 61 74 65   item-path state
1780: 20 73 74 61 74 75 73 20 68 6f 73 74 20 63 70 75   status host cpu
1790: 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20 75 6e  load diskfree un
17a0: 61 6d 65 20 72 75 6e 2d 64 69 72 20 6c 6f 67 2d  ame run-dir log-
17b0: 66 69 6c 65 20 72 75 6e 2d 64 75 72 61 74 69 6f  file run-duratio
17c0: 6e 20 63 6f 6d 6d 65 6e 74 20 65 76 65 6e 74 2d  n comment event-
17d0: 74 69 6d 65 20 61 72 63 68 69 76 65 64 29 0a 20  time archived). 
17e0: 20 28 64 62 69 3a 65 78 65 63 0a 20 20 20 64 62   (dbi:exec.   db
17f0: 68 0a 20 20 20 22 55 50 44 41 54 45 20 74 65 73  h.   "UPDATE tes
1800: 74 73 20 53 45 54 0a 20 20 20 20 20 20 72 75 6e  ts SET.      run
1810: 5f 69 64 3d 3f 2c 74 65 73 74 5f 6e 61 6d 65 3d  _id=?,test_name=
1820: 3f 2c 69 74 65 6d 5f 70 61 74 68 3d 3f 2c 73 74  ?,item_path=?,st
1830: 61 74 65 3d 3f 2c 73 74 61 74 75 73 3d 3f 2c 68  ate=?,status=?,h
1840: 6f 73 74 3d 3f 2c 63 70 75 6c 6f 61 64 3d 3f 2c  ost=?,cpuload=?,
1850: 64 69 73 6b 66 72 65 65 3d 3f 2c 75 6e 61 6d 65  diskfree=?,uname
1860: 3d 3f 2c 72 75 6e 64 69 72 3d 3f 2c 66 69 6e 61  =?,rundir=?,fina
1870: 6c 5f 6c 6f 67 66 3d 3f 2c 72 75 6e 5f 64 75 72  l_logf=?,run_dur
1880: 61 74 69 6f 6e 3d 3f 2c 63 6f 6d 6d 65 6e 74 3d  ation=?,comment=
1890: 3f 2c 65 76 65 6e 74 5f 74 69 6d 65 3d 3f 2c 61  ?,event_time=?,a
18a0: 72 63 68 69 76 65 64 3d 3f 0a 20 20 20 20 57 48  rchived=?.    WH
18b0: 45 52 45 20 69 64 3d 3f 3b 22 0a 0a 20 20 20 72  ERE id=?;"..   r
18c0: 75 6e 2d 69 64 20 20 74 65 73 74 2d 6e 61 6d 65  un-id  test-name
18d0: 20 69 74 65 6d 2d 70 61 74 68 20 20 20 20 73 74   item-path    st
18e0: 61 74 65 20 20 20 73 74 61 74 75 73 20 20 20 20  ate   status    
18f0: 20 68 6f 73 74 20 20 63 70 75 6c 6f 61 64 20 64   host  cpuload d
1900: 69 73 6b 66 72 65 65 20 75 6e 61 6d 65 0a 20 20  iskfree uname.  
1910: 20 72 75 6e 2d 64 69 72 20 6c 6f 67 2d 66 69 6c   run-dir log-fil
1920: 65 20 20 72 75 6e 2d 64 75 72 61 74 69 6f 6e 20  e  run-duration 
1930: 63 6f 6d 6d 65 6e 74 20 65 76 65 6e 74 2d 74 69  comment event-ti
1940: 6d 65 20 61 72 63 68 69 76 65 64 20 74 65 73 74  me archived test
1950: 2d 69 64 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  -id))..(define (
1960: 70 67 64 62 3a 67 65 74 2d 74 65 73 74 73 20 64  pgdb:get-tests d
1970: 62 68 20 74 61 72 67 65 74 2d 70 61 74 74 29 0a  bh target-patt).
1980: 20 20 28 64 62 69 3a 67 65 74 2d 72 6f 77 73 0a    (dbi:get-rows.
1990: 20 20 20 64 62 68 0a 20 20 20 22 53 45 4c 45 43     dbh.   "SELEC
19a0: 54 20 74 2e 69 64 2c 74 2e 72 75 6e 5f 69 64 2c  T t.id,t.run_id,
19b0: 74 2e 74 65 73 74 5f 6e 61 6d 65 2c 74 2e 69 74  t.test_name,t.it
19c0: 65 6d 5f 70 61 74 68 2c 74 2e 73 74 61 74 65 2c  em_path,t.state,
19d0: 74 2e 73 74 61 74 75 73 2c 74 2e 68 6f 73 74 2c  t.status,t.host,
19e0: 74 2e 63 70 75 6c 6f 61 64 2c 74 2e 64 69 73 6b  t.cpuload,t.disk
19f0: 66 72 65 65 2c 74 2e 75 6e 61 6d 65 2c 74 2e 72  free,t.uname,t.r
1a00: 75 6e 64 69 72 2c 74 2e 66 69 6e 61 6c 5f 6c 6f  undir,t.final_lo
1a10: 67 66 2c 74 2e 72 75 6e 5f 64 75 72 61 74 69 6f  gf,t.run_duratio
1a20: 6e 2c 74 2e 63 6f 6d 6d 65 6e 74 2c 74 2e 65 76  n,t.comment,t.ev
1a30: 65 6e 74 5f 74 69 6d 65 2c 74 2e 61 72 63 68 69  ent_time,t.archi
1a40: 76 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ved,.           
1a50: 72 2e 69 64 2c 72 2e 74 61 72 67 65 74 2c 72 2e  r.id,r.target,r.
1a60: 74 74 79 70 65 5f 69 64 2c 72 2e 72 75 6e 5f 6e  ttype_id,r.run_n
1a70: 61 6d 65 2c 72 2e 73 74 61 74 65 2c 72 2e 73 74  ame,r.state,r.st
1a80: 61 74 75 73 2c 72 2e 6f 77 6e 65 72 2c 72 2e 65  atus,r.owner,r.e
1a90: 76 65 6e 74 5f 74 69 6d 65 2c 72 2e 63 6f 6d 6d  vent_time,r.comm
1aa0: 65 6e 74 0a 20 20 20 20 20 46 52 4f 4d 20 74 65  ent.     FROM te
1ab0: 73 74 73 20 41 53 20 74 20 49 4e 4e 45 52 20 4a  sts AS t INNER J
1ac0: 4f 49 4e 20 72 75 6e 73 20 41 53 20 72 20 4f 4e  OIN runs AS r ON
1ad0: 20 74 2e 72 75 6e 5f 69 64 3d 72 2e 69 64 0a 20   t.run_id=r.id. 
1ae0: 20 20 20 20 20 57 48 45 52 45 20 72 2e 74 61 72       WHERE r.tar
1af0: 67 65 74 20 4c 49 4b 45 20 3f 3b 22 20 74 61 72  get LIKE ?;" tar
1b00: 67 65 74 2d 70 61 74 74 29 29 0a 0a 28 64 65 66  get-patt))..(def
1b10: 69 6e 65 20 28 70 67 64 62 3a 67 65 74 2d 73 74  ine (pgdb:get-st
1b20: 61 74 73 2d 67 69 76 65 6e 2d 74 79 70 65 2d 74  ats-given-type-t
1b30: 61 72 67 65 74 20 64 62 68 20 74 74 79 70 65 2d  arget dbh ttype-
1b40: 69 64 20 74 61 72 67 65 74 2d 70 61 74 74 29 0a  id target-patt).
1b50: 20 20 28 64 62 69 3a 67 65 74 2d 72 6f 77 73 0a    (dbi:get-rows.
1b60: 20 20 20 64 62 68 0a 20 20 20 3b 3b 20 20 20 20     dbh.   ;;    
1b70: 22 53 45 4c 45 43 54 20 43 4f 55 4e 54 28 74 2e  "SELECT COUNT(t.
1b80: 69 64 29 2c 74 2e 73 74 61 74 75 73 2c 72 2e 74  id),t.status,r.t
1b90: 61 72 67 65 74 20 46 52 4f 4d 20 74 65 73 74 73  arget FROM tests
1ba0: 20 41 53 20 74 20 49 4e 4e 45 52 20 4a 4f 49 4e   AS t INNER JOIN
1bb0: 20 72 75 6e 73 20 41 53 20 72 20 4f 4e 20 74 2e   runs AS r ON t.
1bc0: 72 75 6e 5f 69 64 3d 72 2e 69 64 0a 20 20 20 3b  run_id=r.id.   ;
1bd0: 3b 20 20 20 20 20 20 20 20 20 57 48 45 52 45 20  ;         WHERE 
1be0: 74 2e 73 74 61 74 65 3d 27 43 4f 4d 50 4c 45 54  t.state='COMPLET
1bf0: 45 44 27 20 41 4e 44 20 74 74 79 70 65 5f 69 64  ED' AND ttype_id
1c00: 3d 3f 20 41 4e 44 20 72 2e 74 61 72 67 65 74 20  =? AND r.target 
1c10: 4c 49 4b 45 20 3f 20 47 52 4f 55 50 20 42 59 20  LIKE ? GROUP BY 
1c20: 72 2e 74 61 72 67 65 74 2c 74 2e 73 74 61 74 75  r.target,t.statu
1c30: 73 3b 22 0a 20 20 20 22 53 45 4c 45 43 54 20 72  s;".   "SELECT r
1c40: 2e 74 61 72 67 65 74 2c 43 4f 55 4e 54 28 2a 29  .target,COUNT(*)
1c50: 20 41 53 20 74 6f 74 61 6c 2c 0a 20 20 20 20 20   AS total,.     
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1c70: 55 4d 28 43 41 53 45 20 57 48 45 4e 20 74 2e 73  UM(CASE WHEN t.s
1c80: 74 61 74 75 73 3d 27 50 41 53 53 27 20 54 48 45  tatus='PASS' THE
1c90: 4e 20 31 20 45 4c 53 45 20 30 20 45 4e 44 29 20  N 1 ELSE 0 END) 
1ca0: 41 53 20 70 61 73 73 2c 0a 20 20 20 20 20 20 20  AS pass,.       
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 55 4d               SUM
1cc0: 28 43 41 53 45 20 57 48 45 4e 20 74 2e 73 74 61  (CASE WHEN t.sta
1cd0: 74 75 73 3d 27 46 41 49 4c 27 20 54 48 45 4e 20  tus='FAIL' THEN 
1ce0: 31 20 45 4c 53 45 20 30 20 45 4e 44 29 20 41 53  1 ELSE 0 END) AS
1cf0: 20 66 61 69 6c 2c 0a 20 20 20 20 20 20 20 20 20   fail,.         
1d00: 20 20 20 20 20 20 20 20 20 20 20 53 55 4d 28 43             SUM(C
1d10: 41 53 45 20 57 48 45 4e 20 74 2e 73 74 61 74 75  ASE WHEN t.statu
1d20: 73 20 49 4e 20 28 27 50 41 53 53 27 2c 27 46 41  s IN ('PASS','FA
1d30: 49 4c 27 29 20 54 48 45 4e 20 30 20 45 4c 53 45  IL') THEN 0 ELSE
1d40: 20 31 20 45 4e 44 29 20 41 53 20 6f 74 68 65 72   1 END) AS other
1d50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 46 52 4f  .            FRO
1d60: 4d 20 74 65 73 74 73 20 41 53 20 74 20 49 4e 4e  M tests AS t INN
1d70: 45 52 20 4a 4f 49 4e 20 72 75 6e 73 20 41 53 20  ER JOIN runs AS 
1d80: 72 20 4f 4e 20 74 2e 72 75 6e 5f 69 64 3d 72 2e  r ON t.run_id=r.
1d90: 69 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 57  id.            W
1da0: 48 45 52 45 20 74 2e 73 74 61 74 65 3d 27 43 4f  HERE t.state='CO
1db0: 4d 50 4c 45 54 45 44 27 20 41 4e 44 20 74 74 79  MPLETED' AND tty
1dc0: 70 65 5f 69 64 3d 3f 20 41 4e 44 20 72 2e 74 61  pe_id=? AND r.ta
1dd0: 72 67 65 74 20 4c 49 4b 45 20 3f 20 47 52 4f 55  rget LIKE ? GROU
1de0: 50 20 42 59 20 72 2e 74 61 72 67 65 74 3b 22 0a  P BY r.target;".
1df0: 20 20 20 74 74 79 70 65 2d 69 64 20 74 61 72 67     ttype-id targ
1e00: 65 74 2d 70 61 74 74 29 29 0a 0a 28 64 65 66 69  et-patt))..(defi
1e10: 6e 65 20 28 70 67 64 62 3a 67 65 74 2d 73 74 61  ne (pgdb:get-sta
1e20: 74 73 2d 67 69 76 65 6e 2d 74 61 72 67 65 74 20  ts-given-target 
1e30: 64 62 68 20 74 61 72 67 65 74 2d 70 61 74 74 29  dbh target-patt)
1e40: 0a 20 20 28 64 62 69 3a 67 65 74 2d 72 6f 77 73  .  (dbi:get-rows
1e50: 0a 20 20 20 64 62 68 0a 20 20 20 3b 3b 20 20 20  .   dbh.   ;;   
1e60: 20 22 53 45 4c 45 43 54 20 43 4f 55 4e 54 28 74   "SELECT COUNT(t
1e70: 2e 69 64 29 2c 74 2e 73 74 61 74 75 73 2c 72 2e  .id),t.status,r.
1e80: 74 61 72 67 65 74 20 46 52 4f 4d 20 74 65 73 74  target FROM test
1e90: 73 20 41 53 20 74 20 49 4e 4e 45 52 20 4a 4f 49  s AS t INNER JOI
1ea0: 4e 20 72 75 6e 73 20 41 53 20 72 20 4f 4e 20 74  N runs AS r ON t
1eb0: 2e 72 75 6e 5f 69 64 3d 72 2e 69 64 0a 20 20 20  .run_id=r.id.   
1ec0: 3b 3b 20 20 20 20 20 20 20 20 20 57 48 45 52 45  ;;         WHERE
1ed0: 20 74 2e 73 74 61 74 65 3d 27 43 4f 4d 50 4c 45   t.state='COMPLE
1ee0: 54 45 44 27 20 41 4e 44 20 74 74 79 70 65 5f 69  TED' AND ttype_i
1ef0: 64 3d 3f 20 41 4e 44 20 72 2e 74 61 72 67 65 74  d=? AND r.target
1f00: 20 4c 49 4b 45 20 3f 20 47 52 4f 55 50 20 42 59   LIKE ? GROUP BY
1f10: 20 72 2e 74 61 72 67 65 74 2c 74 2e 73 74 61 74   r.target,t.stat
1f20: 75 73 3b 22 0a 20 20 20 22 53 45 4c 45 43 54 20  us;".   "SELECT 
1f30: 72 2e 74 61 72 67 65 74 2c 43 4f 55 4e 54 28 2a  r.target,COUNT(*
1f40: 29 20 41 53 20 74 6f 74 61 6c 2c 0a 20 20 20 20  ) AS total,.    
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f60: 53 55 4d 28 43 41 53 45 20 57 48 45 4e 20 74 2e  SUM(CASE WHEN t.
1f70: 73 74 61 74 75 73 3d 27 50 41 53 53 27 20 54 48  status='PASS' TH
1f80: 45 4e 20 31 20 45 4c 53 45 20 30 20 45 4e 44 29  EN 1 ELSE 0 END)
1f90: 20 41 53 20 70 61 73 73 2c 0a 20 20 20 20 20 20   AS pass,.      
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 55                SU
1fb0: 4d 28 43 41 53 45 20 57 48 45 4e 20 74 2e 73 74  M(CASE WHEN t.st
1fc0: 61 74 75 73 3d 27 46 41 49 4c 27 20 54 48 45 4e  atus='FAIL' THEN
1fd0: 20 31 20 45 4c 53 45 20 30 20 45 4e 44 29 20 41   1 ELSE 0 END) A
1fe0: 53 20 66 61 69 6c 2c 0a 20 20 20 20 20 20 20 20  S fail,.        
1ff0: 20 20 20 20 20 20 20 20 20 20 20 20 53 55 4d 28              SUM(
2000: 43 41 53 45 20 57 48 45 4e 20 74 2e 73 74 61 74  CASE WHEN t.stat
2010: 75 73 20 49 4e 20 28 27 50 41 53 53 27 2c 27 46  us IN ('PASS','F
2020: 41 49 4c 27 29 20 54 48 45 4e 20 30 20 45 4c 53  AIL') THEN 0 ELS
2030: 45 20 31 20 45 4e 44 29 20 41 53 20 6f 74 68 65  E 1 END) AS othe
2040: 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 46 52  r.            FR
2050: 4f 4d 20 74 65 73 74 73 20 41 53 20 74 20 49 4e  OM tests AS t IN
2060: 4e 45 52 20 4a 4f 49 4e 20 72 75 6e 73 20 41 53  NER JOIN runs AS
2070: 20 72 20 4f 4e 20 74 2e 72 75 6e 5f 69 64 3d 72   r ON t.run_id=r
2080: 2e 69 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  .id.            
2090: 57 48 45 52 45 20 74 2e 73 74 61 74 65 3d 27 43  WHERE t.state='C
20a0: 4f 4d 50 4c 45 54 45 44 27 20 41 4e 44 20 72 2e  OMPLETED' AND r.
20b0: 74 61 72 67 65 74 20 4c 49 4b 45 20 3f 20 47 52  target LIKE ? GR
20c0: 4f 55 50 20 42 59 20 72 2e 74 61 72 67 65 74 3b  OUP BY r.target;
20d0: 22 0a 20 20 20 74 61 72 67 65 74 2d 70 61 74 74  ".   target-patt
20e0: 29 29 0a 0a 0a 28 64 65 66 69 6e 65 20 28 70 67  ))...(define (pg
20f0: 64 62 3a 67 65 74 2d 6c 61 74 65 73 74 2d 72 75  db:get-latest-ru
2100: 6e 2d 73 74 61 74 73 2d 67 69 76 65 6e 2d 74 61  n-stats-given-ta
2110: 72 67 65 74 20 64 62 68 20 74 74 79 70 65 2d 69  rget dbh ttype-i
2120: 64 20 74 61 72 67 65 74 2d 70 61 74 74 20 6c 69  d target-patt li
2130: 6d 69 74 20 6f 66 66 73 65 74 29 0a 20 20 28 64  mit offset).  (d
2140: 62 69 3a 67 65 74 2d 72 6f 77 73 0a 20 20 20 64  bi:get-rows.   d
2150: 62 68 0a 20 20 20 3b 3b 20 20 20 20 22 53 45 4c  bh.   ;;    "SEL
2160: 45 43 54 20 43 4f 55 4e 54 28 74 2e 69 64 29 2c  ECT COUNT(t.id),
2170: 74 2e 73 74 61 74 75 73 2c 72 2e 74 61 72 67 65  t.status,r.targe
2180: 74 20 46 52 4f 4d 20 74 65 73 74 73 20 41 53 20  t FROM tests AS 
2190: 74 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 72 75 6e  t INNER JOIN run
21a0: 73 20 41 53 20 72 20 4f 4e 20 74 2e 72 75 6e 5f  s AS r ON t.run_
21b0: 69 64 3d 72 2e 69 64 0a 20 20 20 3b 3b 20 20 20  id=r.id.   ;;   
21c0: 20 20 20 20 20 20 57 48 45 52 45 20 74 2e 73 74        WHERE t.st
21d0: 61 74 65 3d 27 43 4f 4d 50 4c 45 54 45 44 27 20  ate='COMPLETED' 
21e0: 41 4e 44 20 74 74 79 70 65 5f 69 64 3d 3f 20 41  AND ttype_id=? A
21f0: 4e 44 20 72 2e 74 61 72 67 65 74 20 4c 49 4b 45  ND r.target LIKE
2200: 20 3f 20 47 52 4f 55 50 20 42 59 20 72 2e 74 61   ? GROUP BY r.ta
2210: 72 67 65 74 2c 74 2e 73 74 61 74 75 73 3b 22 0a  rget,t.status;".
2220: 20 20 20 22 53 45 4c 45 43 54 20 72 2e 74 61 72     "SELECT r.tar
2230: 67 65 74 2c 20 72 2e 65 76 65 6e 74 5f 74 69 6d  get, r.event_tim
2240: 65 2c 20 43 4f 55 4e 54 28 2a 29 20 41 53 20 74  e, COUNT(*) AS t
2250: 6f 74 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  otal,.          
2260: 20 20 20 20 20 20 20 20 20 20 53 55 4d 28 43 41            SUM(CA
2270: 53 45 20 57 48 45 4e 20 74 2e 73 74 61 74 75 73  SE WHEN t.status
2280: 3d 27 50 41 53 53 27 20 54 48 45 4e 20 31 20 45  ='PASS' THEN 1 E
2290: 4c 53 45 20 30 20 45 4e 44 29 20 41 53 20 70 61  LSE 0 END) AS pa
22a0: 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ss,.            
22b0: 20 20 20 20 20 20 20 20 53 55 4d 28 43 41 53 45          SUM(CASE
22c0: 20 57 48 45 4e 20 74 2e 73 74 61 74 75 73 3d 27   WHEN t.status='
22d0: 46 41 49 4c 27 20 54 48 45 4e 20 31 20 45 4c 53  FAIL' THEN 1 ELS
22e0: 45 20 30 20 45 4e 44 29 20 41 53 20 66 61 69 6c  E 0 END) AS fail
22f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2300: 20 20 20 20 20 20 53 55 4d 28 43 41 53 45 20 57        SUM(CASE W
2310: 48 45 4e 20 74 2e 73 74 61 74 75 73 20 49 4e 20  HEN t.status IN 
2320: 28 27 50 41 53 53 27 2c 27 46 41 49 4c 27 29 20  ('PASS','FAIL') 
2330: 54 48 45 4e 20 30 20 45 4c 53 45 20 31 20 45 4e  THEN 0 ELSE 1 EN
2340: 44 29 20 41 53 20 6f 74 68 65 72 2c 20 72 2e 69  D) AS other, r.i
2350: 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 46 52  d.            FR
2360: 4f 4d 20 74 65 73 74 73 20 41 53 20 74 20 49 4e  OM tests AS t IN
2370: 4e 45 52 20 4a 4f 49 4e 20 72 75 6e 73 20 41 53  NER JOIN runs AS
2380: 20 72 20 4f 4e 20 74 2e 72 75 6e 5f 69 64 3d 72   r ON t.run_id=r
2390: 2e 69 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  .id.            
23a0: 57 48 45 52 45 20 74 2e 73 74 61 74 65 20 6c 69  WHERE t.state li
23b0: 6b 65 20 27 25 27 20 20 41 4e 44 20 74 74 79 70  ke '%'  AND ttyp
23c0: 65 5f 69 64 3d 3f 20 41 4e 44 20 72 2e 74 61 72  e_id=? AND r.tar
23d0: 67 65 74 20 4c 49 4b 45 20 3f 20 0a 20 20 20 20  get LIKE ? .    
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64               and
23f0: 20 72 2e 69 64 20 69 6e 20 0a 20 20 20 20 20 20   r.id in .      
2400: 20 20 20 20 20 28 53 45 4c 45 43 54 20 44 49 53       (SELECT DIS
2410: 54 49 4e 43 54 20 6f 6e 20 28 74 61 72 67 65 74  TINCT on (target
2420: 29 20 69 64 20 66 72 6f 6d 20 72 75 6e 73 20 77  ) id from runs w
2430: 68 65 72 65 20 74 61 72 67 65 74 20 6c 69 6b 65  here target like
2440: 20 3f 20 41 4e 44 20 74 74 79 70 65 5f 69 64 3d   ? AND ttype_id=
2450: 3f 20 6f 72 64 65 72 20 62 79 20 74 61 72 67 65  ? order by targe
2460: 74 2c 65 76 65 6e 74 5f 74 69 6d 65 20 64 65 73  t,event_time des
2470: 63 29 20 0a 20 20 20 20 20 20 20 20 20 20 47 52  c) .          GR
2480: 4f 55 50 20 42 59 20 72 2e 74 61 72 67 65 74 2c  OUP BY r.target,
2490: 72 2e 69 64 20 0a 20 20 20 20 20 20 20 20 20 20  r.id .          
24a0: 6f 72 64 65 72 20 62 79 20 72 2e 65 76 65 6e 74  order by r.event
24b0: 5f 74 69 6d 65 20 64 65 73 63 20 6c 69 6d 69 74  _time desc limit
24c0: 20 3f 20 6f 66 66 73 65 74 20 3f 20 3b 22 0a 20   ? offset ? ;". 
24d0: 20 20 74 74 79 70 65 2d 69 64 20 74 61 72 67 65    ttype-id targe
24e0: 74 2d 70 61 74 74 20 74 61 72 67 65 74 2d 70 61  t-patt target-pa
24f0: 74 74 20 74 74 79 70 65 2d 69 64 20 6c 69 6d 69  tt ttype-id limi
2500: 74 20 6f 66 66 73 65 74 29 29 0a 0a 28 64 65 66  t offset))..(def
2510: 69 6e 65 20 28 70 67 64 62 3a 67 65 74 2d 6c 61  ine (pgdb:get-la
2520: 74 65 73 74 2d 72 75 6e 2d 73 74 61 74 73 2d 67  test-run-stats-g
2530: 69 76 65 6e 2d 70 61 74 74 65 72 6e 20 64 62 68  iven-pattern dbh
2540: 20 70 61 74 74 20 6c 69 6d 69 74 20 6f 66 66 73   patt limit offs
2550: 65 74 29 0a 20 20 28 64 62 69 3a 67 65 74 2d 72  et).  (dbi:get-r
2560: 6f 77 73 0a 20 20 20 64 62 68 0a 20 20 20 3b 3b  ows.   dbh.   ;;
2570: 20 20 20 20 22 53 45 4c 45 43 54 20 43 4f 55 4e      "SELECT COUN
2580: 54 28 74 2e 69 64 29 2c 74 2e 73 74 61 74 75 73  T(t.id),t.status
2590: 2c 72 2e 74 61 72 67 65 74 20 46 52 4f 4d 20 74  ,r.target FROM t
25a0: 65 73 74 73 20 41 53 20 74 20 49 4e 4e 45 52 20  ests AS t INNER 
25b0: 4a 4f 49 4e 20 72 75 6e 73 20 41 53 20 72 20 4f  JOIN runs AS r O
25c0: 4e 20 74 2e 72 75 6e 5f 69 64 3d 72 2e 69 64 0a  N t.run_id=r.id.
25d0: 20 20 20 3b 3b 20 20 20 20 20 20 20 20 20 57 48     ;;         WH
25e0: 45 52 45 20 74 2e 73 74 61 74 65 3d 27 43 4f 4d  ERE t.state='COM
25f0: 50 4c 45 54 45 44 27 20 41 4e 44 20 74 74 79 70  PLETED' AND ttyp
2600: 65 5f 69 64 3d 3f 20 41 4e 44 20 72 2e 74 61 72  e_id=? AND r.tar
2610: 67 65 74 20 4c 49 4b 45 20 3f 20 47 52 4f 55 50  get LIKE ? GROUP
2620: 20 42 59 20 72 2e 74 61 72 67 65 74 2c 74 2e 73   BY r.target,t.s
2630: 74 61 74 75 73 3b 22 0a 20 20 20 22 53 45 4c 45  tatus;".   "SELE
2640: 43 54 20 72 2e 74 61 72 67 65 74 2c 20 72 2e 65  CT r.target, r.e
2650: 76 65 6e 74 5f 74 69 6d 65 2c 20 43 4f 55 4e 54  vent_time, COUNT
2660: 28 2a 29 20 41 53 20 74 6f 74 61 6c 2c 0a 20 20  (*) AS total,.  
2670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2680: 20 20 53 55 4d 28 43 41 53 45 20 57 48 45 4e 20    SUM(CASE WHEN 
2690: 74 2e 73 74 61 74 75 73 3d 27 50 41 53 53 27 20  t.status='PASS' 
26a0: 54 48 45 4e 20 31 20 45 4c 53 45 20 30 20 45 4e  THEN 1 ELSE 0 EN
26b0: 44 29 20 41 53 20 70 61 73 73 2c 0a 20 20 20 20  D) AS pass,.    
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26d0: 53 55 4d 28 43 41 53 45 20 57 48 45 4e 20 74 2e  SUM(CASE WHEN t.
26e0: 73 74 61 74 75 73 3d 27 46 41 49 4c 27 20 54 48  status='FAIL' TH
26f0: 45 4e 20 31 20 45 4c 53 45 20 30 20 45 4e 44 29  EN 1 ELSE 0 END)
2700: 20 41 53 20 66 61 69 6c 2c 0a 20 20 20 20 20 20   AS fail,.      
2710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 55                SU
2720: 4d 28 43 41 53 45 20 57 48 45 4e 20 74 2e 73 74  M(CASE WHEN t.st
2730: 61 74 75 73 20 49 4e 20 28 27 50 41 53 53 27 2c  atus IN ('PASS',
2740: 27 46 41 49 4c 27 29 20 54 48 45 4e 20 30 20 45  'FAIL') THEN 0 E
2750: 4c 53 45 20 31 20 45 4e 44 29 20 41 53 20 6f 74  LSE 1 END) AS ot
2760: 68 65 72 2c 20 72 2e 69 64 0a 20 20 20 20 20 20  her, r.id.      
2770: 20 20 20 20 20 20 46 52 4f 4d 20 74 65 73 74 73        FROM tests
2780: 20 41 53 20 74 20 49 4e 4e 45 52 20 4a 4f 49 4e   AS t INNER JOIN
2790: 20 72 75 6e 73 20 41 53 20 72 20 4f 4e 20 74 2e   runs AS r ON t.
27a0: 72 75 6e 5f 69 64 3d 72 2e 69 64 0a 20 20 20 20  run_id=r.id.    
27b0: 20 20 20 20 20 20 20 20 57 48 45 52 45 20 74 2e          WHERE t.
27c0: 73 74 61 74 65 20 6c 69 6b 65 20 27 25 27 20 20  state like '%'  
27d0: 41 4e 44 20 72 2e 74 61 72 67 65 74 20 4c 49 4b  AND r.target LIK
27e0: 45 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20 20  E ? .           
27f0: 20 20 20 20 20 20 61 6e 64 20 72 2e 69 64 20 69        and r.id i
2800: 6e 20 0a 20 20 20 20 20 20 20 20 20 20 20 28 53  n .           (S
2810: 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 6f  ELECT DISTINCT o
2820: 6e 20 28 74 61 72 67 65 74 29 20 69 64 20 66 72  n (target) id fr
2830: 6f 6d 20 72 75 6e 73 20 77 68 65 72 65 20 74 61  om runs where ta
2840: 72 67 65 74 20 6c 69 6b 65 20 3f 20 20 6f 72 64  rget like ?  ord
2850: 65 72 20 62 79 20 74 61 72 67 65 74 2c 65 76 65  er by target,eve
2860: 6e 74 5f 74 69 6d 65 20 64 65 73 63 29 20 0a 20  nt_time desc) . 
2870: 20 20 20 20 20 20 20 20 20 47 52 4f 55 50 20 42           GROUP B
2880: 59 20 72 2e 74 61 72 67 65 74 2c 72 2e 69 64 20  Y r.target,r.id 
2890: 0a 20 20 20 20 20 20 20 20 20 20 6f 72 64 65 72  .          order
28a0: 20 62 79 20 72 2e 65 76 65 6e 74 5f 74 69 6d 65   by r.event_time
28b0: 20 64 65 73 63 20 6c 69 6d 69 74 20 3f 20 6f 66   desc limit ? of
28c0: 66 73 65 74 20 3f 20 3b 22 0a 20 20 20 70 61 74  fset ? ;".   pat
28d0: 74 20 70 61 74 74 20 20 6c 69 6d 69 74 20 6f 66  t patt  limit of
28e0: 66 73 65 74 29 29 0a 0a 0a 28 64 65 66 69 6e 65  fset))...(define
28f0: 20 28 70 67 64 62 3a 67 65 74 2d 63 6f 75 6e 74   (pgdb:get-count
2900: 2d 64 61 74 61 2d 73 74 61 74 73 2d 74 61 72 67  -data-stats-targ
2910: 65 74 2d 6c 61 74 65 73 74 20 64 62 68 20 74 74  et-latest dbh tt
2920: 79 70 65 2d 69 64 20 74 61 72 67 65 74 2d 70 61  ype-id target-pa
2930: 74 74 29 0a 20 20 28 64 62 69 3a 67 65 74 2d 72  tt).  (dbi:get-r
2940: 6f 77 73 0a 20 20 20 64 62 68 0a 20 20 20 20 22  ows.   dbh.    "
2950: 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
2960: 20 66 72 6f 6d 20 0a 20 20 20 20 20 20 20 20 20   from .         
2970: 20 28 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43   (SELECT DISTINC
2980: 54 20 6f 6e 20 28 74 61 72 67 65 74 29 20 69 64  T on (target) id
2990: 20 0a 09 09 66 72 6f 6d 20 72 75 6e 73 20 77 68   ...from runs wh
29a0: 65 72 65 20 74 61 72 67 65 74 20 6c 69 6b 65 20  ere target like 
29b0: 3f 20 41 4e 44 20 74 74 79 70 65 5f 69 64 20 3d  ? AND ttype_id =
29c0: 20 3f 20 0a 09 09 6f 72 64 65 72 20 62 79 20 74   ? ...order by t
29d0: 61 72 67 65 74 2c 20 65 76 65 6e 74 5f 74 69 6d  arget, event_tim
29e0: 65 20 64 65 73 63 0a 20 20 20 20 20 20 20 20 20  e desc.         
29f0: 20 29 20 61 73 20 78 3b 22 20 0a 20 20 20 20 74   ) as x;" .    t
2a00: 61 72 67 65 74 2d 70 61 74 74 20 74 74 79 70 65  arget-patt ttype
2a10: 2d 69 64 29 29 0a 0a 28 64 65 66 69 6e 65 20 20  -id))..(define  
2a20: 28 70 67 64 62 3a 67 65 74 2d 6c 61 74 65 73 74  (pgdb:get-latest
2a30: 2d 72 75 6e 2d 63 6e 74 20 64 62 68 20 74 74 79  -run-cnt dbh tty
2a40: 70 65 2d 69 64 20 74 61 72 67 65 74 2d 70 61 74  pe-id target-pat
2a50: 74 29 0a 20 20 28 6c 65 74 2a 20 28 28 63 6e 74  t).  (let* ((cnt
2a60: 2d 72 65 73 75 6c 74 20 28 70 67 64 62 3a 67 65  -result (pgdb:ge
2a70: 74 2d 63 6f 75 6e 74 2d 64 61 74 61 2d 73 74 61  t-count-data-sta
2a80: 74 73 2d 74 61 72 67 65 74 2d 6c 61 74 65 73 74  ts-target-latest
2a90: 20 64 62 68 20 74 74 79 70 65 2d 69 64 20 74 61   dbh ttype-id ta
2aa0: 72 67 65 74 2d 70 61 74 74 29 29 0a 20 20 20 20  rget-patt)).    
2ab0: 20 20 20 20 20 3b 28 63 6e 74 2d 72 6f 77 20 28       ;(cnt-row (
2ac0: 63 61 72 20 28 63 6e 74 2d 72 65 73 75 6c 74 29  car (cnt-result)
2ad0: 29 29 0a 20 20 20 20 20 20 20 20 20 28 63 6e 74  )).         (cnt
2ae0: 20 30 29 20 0a 20 20 20 20 20 20 20 29 0a 20 20   0) .       ).  
2af0: 20 20 28 66 6f 72 2d 65 61 63 68 0a 20 20 20 20    (for-each.    
2b00: 20 28 6c 61 6d 62 64 61 20 28 72 6f 77 29 0a 20   (lambda (row). 
2b10: 20 20 20 20 20 28 73 65 74 21 20 63 6e 74 20 20       (set! cnt  
2b20: 28 76 65 63 74 6f 72 2d 72 65 66 20 72 6f 77 20  (vector-ref row 
2b30: 30 20 29 29 29 20 0a 20 20 20 20 20 63 6e 74 2d  0 ))) .     cnt-
2b40: 72 65 73 75 6c 74 29 0a 0a 63 6e 74 29 29 0a 0a  result)..cnt))..
2b50: 28 64 65 66 69 6e 65 20 28 70 67 64 62 3a 67 65  (define (pgdb:ge
2b60: 74 2d 63 6f 75 6e 74 2d 64 61 74 61 2d 73 74 61  t-count-data-sta
2b70: 74 73 2d 6c 61 74 65 73 74 2d 70 61 74 74 65 72  ts-latest-patter
2b80: 6e 20 64 62 68 20 70 61 74 74 29 0a 20 20 28 64  n dbh patt).  (d
2b90: 62 69 3a 67 65 74 2d 72 6f 77 73 0a 20 20 20 64  bi:get-rows.   d
2ba0: 62 68 0a 20 20 20 20 22 53 45 4c 45 43 54 20 63  bh.    "SELECT c
2bb0: 6f 75 6e 74 28 2a 29 20 20 66 72 6f 6d 20 0a 20  ount(*)  from . 
2bc0: 20 20 20 20 20 20 20 20 20 28 53 45 4c 45 43 54           (SELECT
2bd0: 20 44 49 53 54 49 4e 43 54 20 6f 6e 20 28 74 61   DISTINCT on (ta
2be0: 72 67 65 74 29 20 69 64 20 0a 09 09 66 72 6f 6d  rget) id ...from
2bf0: 20 72 75 6e 73 20 77 68 65 72 65 20 74 61 72 67   runs where targ
2c00: 65 74 20 6c 69 6b 65 20 3f 20 20 0a 09 09 6f 72  et like ?  ...or
2c10: 64 65 72 20 62 79 20 74 61 72 67 65 74 2c 20 65  der by target, e
2c20: 76 65 6e 74 5f 74 69 6d 65 20 64 65 73 63 0a 20  vent_time desc. 
2c30: 20 20 20 20 20 20 20 20 20 29 20 61 73 20 78 3b           ) as x;
2c40: 22 20 0a 20 20 20 20 70 61 74 74 29 29 0a 0a 28  " .    patt))..(
2c50: 64 65 66 69 6e 65 20 20 28 70 67 64 62 3a 67 65  define  (pgdb:ge
2c60: 74 2d 6c 61 74 65 73 74 2d 72 75 6e 2d 63 6e 74  t-latest-run-cnt
2c70: 2d 62 79 2d 70 61 74 74 65 72 6e 20 64 62 68 20  -by-pattern dbh 
2c80: 74 61 72 67 65 74 2d 70 61 74 74 29 0a 20 20 28  target-patt).  (
2c90: 6c 65 74 2a 20 28 28 63 6e 74 2d 72 65 73 75 6c  let* ((cnt-resul
2ca0: 74 20 28 70 67 64 62 3a 67 65 74 2d 63 6f 75 6e  t (pgdb:get-coun
2cb0: 74 2d 64 61 74 61 2d 73 74 61 74 73 2d 6c 61 74  t-data-stats-lat
2cc0: 65 73 74 2d 70 61 74 74 65 72 6e 20 64 62 68 20  est-pattern dbh 
2cd0: 74 61 72 67 65 74 2d 70 61 74 74 29 29 0a 20 20  target-patt)).  
2ce0: 20 20 20 20 20 20 20 3b 28 63 6e 74 2d 72 6f 77         ;(cnt-row
2cf0: 20 28 63 61 72 20 28 63 6e 74 2d 72 65 73 75 6c   (car (cnt-resul
2d00: 74 29 29 29 0a 20 20 20 20 20 20 20 20 20 28 63  t))).         (c
2d10: 6e 74 20 30 29 20 0a 20 20 20 20 20 20 20 29 0a  nt 0) .       ).
2d20: 20 20 20 20 28 66 6f 72 2d 65 61 63 68 0a 20 20      (for-each.  
2d30: 20 20 20 28 6c 61 6d 62 64 61 20 28 72 6f 77 29     (lambda (row)
2d40: 0a 20 20 20 20 20 20 28 73 65 74 21 20 63 6e 74  .      (set! cnt
2d50: 20 20 28 76 65 63 74 6f 72 2d 72 65 66 20 72 6f    (vector-ref ro
2d60: 77 20 30 20 29 29 29 20 0a 20 20 20 20 20 63 6e  w 0 ))) .     cn
2d70: 74 2d 72 65 73 75 6c 74 29 0a 0a 63 6e 74 29 29  t-result)..cnt))
2d80: 0a 0a 0a 0a 0a 0a 28 64 65 66 69 6e 65 20 28 70  ......(define (p
2d90: 67 64 62 3a 67 65 74 2d 72 75 6e 2d 73 74 61 74  gdb:get-run-stat
2da0: 73 2d 68 69 73 74 6f 72 79 2d 67 69 76 65 6e 2d  s-history-given-
2db0: 74 61 72 67 65 74 20 64 62 68 20 74 74 79 70 65  target dbh ttype
2dc0: 2d 69 64 20 74 61 72 67 65 74 2d 70 61 74 74 29  -id target-patt)
2dd0: 0a 20 20 28 64 62 69 3a 67 65 74 2d 72 6f 77 73  .  (dbi:get-rows
2de0: 0a 20 20 20 64 62 68 0a 20 20 20 3b 3b 20 20 20  .   dbh.   ;;   
2df0: 20 22 53 45 4c 45 43 54 20 43 4f 55 4e 54 28 74   "SELECT COUNT(t
2e00: 2e 69 64 29 2c 74 2e 73 74 61 74 75 73 2c 72 2e  .id),t.status,r.
2e10: 74 61 72 67 65 74 20 46 52 4f 4d 20 74 65 73 74  target FROM test
2e20: 73 20 41 53 20 74 20 49 4e 4e 45 52 20 4a 4f 49  s AS t INNER JOI
2e30: 4e 20 72 75 6e 73 20 41 53 20 72 20 4f 4e 20 74  N runs AS r ON t
2e40: 2e 72 75 6e 5f 69 64 3d 72 2e 69 64 0a 20 20 20  .run_id=r.id.   
2e50: 3b 3b 20 20 20 20 20 20 20 20 20 57 48 45 52 45  ;;         WHERE
2e60: 20 74 2e 73 74 61 74 65 3d 27 43 4f 4d 50 4c 45   t.state='COMPLE
2e70: 54 45 44 27 20 41 4e 44 20 74 74 79 70 65 5f 69  TED' AND ttype_i
2e80: 64 3d 3f 20 41 4e 44 20 72 2e 74 61 72 67 65 74  d=? AND r.target
2e90: 20 4c 49 4b 45 20 3f 20 47 52 4f 55 50 20 42 59   LIKE ? GROUP BY
2ea0: 20 72 2e 74 61 72 67 65 74 2c 74 2e 73 74 61 74   r.target,t.stat
2eb0: 75 73 3b 22 0a 20 20 20 22 53 45 4c 45 43 54 20  us;".   "SELECT 
2ec0: 72 2e 72 75 6e 5f 6e 61 6d 65 2c 43 4f 55 4e 54  r.run_name,COUNT
2ed0: 28 2a 29 20 41 53 20 74 6f 74 61 6c 2c 0a 20 20  (*) AS total,.  
2ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef0: 20 20 53 55 4d 28 43 41 53 45 20 57 48 45 4e 20    SUM(CASE WHEN 
2f00: 74 2e 73 74 61 74 75 73 3d 27 50 41 53 53 27 20  t.status='PASS' 
2f10: 54 48 45 4e 20 31 20 45 4c 53 45 20 30 20 45 4e  THEN 1 ELSE 0 EN
2f20: 44 29 20 41 53 20 70 61 73 73 2c 0a 20 20 20 20  D) AS pass,.    
2f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f40: 53 55 4d 28 43 41 53 45 20 57 48 45 4e 20 74 2e  SUM(CASE WHEN t.
2f50: 73 74 61 74 75 73 3d 27 46 41 49 4c 27 20 54 48  status='FAIL' TH
2f60: 45 4e 20 31 20 45 4c 53 45 20 30 20 45 4e 44 29  EN 1 ELSE 0 END)
2f70: 20 41 53 20 66 61 69 6c 2c 0a 20 20 20 20 20 20   AS fail,.      
2f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 55                SU
2f90: 4d 28 43 41 53 45 20 57 48 45 4e 20 74 2e 73 74  M(CASE WHEN t.st
2fa0: 61 74 75 73 20 49 4e 20 28 27 50 41 53 53 27 2c  atus IN ('PASS',
2fb0: 27 46 41 49 4c 27 29 20 54 48 45 4e 20 30 20 45  'FAIL') THEN 0 E
2fc0: 4c 53 45 20 31 20 45 4e 44 29 20 41 53 20 6f 74  LSE 1 END) AS ot
2fd0: 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  her.            
2fe0: 46 52 4f 4d 20 74 65 73 74 73 20 41 53 20 74 20  FROM tests AS t 
2ff0: 49 4e 4e 45 52 20 4a 4f 49 4e 20 72 75 6e 73 20  INNER JOIN runs 
3000: 41 53 20 72 20 4f 4e 20 74 2e 72 75 6e 5f 69 64  AS r ON t.run_id
3010: 3d 72 2e 69 64 0a 20 20 20 20 20 20 20 20 20 20  =r.id.          
3020: 20 20 57 48 45 52 45 20 74 2e 73 74 61 74 65 20    WHERE t.state 
3030: 6c 69 6b 65 20 27 25 27 20 20 41 4e 44 20 74 74  like '%'  AND tt
3040: 79 70 65 5f 69 64 3d 3f 20 41 4e 44 20 72 2e 74  ype_id=? AND r.t
3050: 61 72 67 65 74 20 4c 49 4b 45 20 3f 20 0a 20 20  arget LIKE ? .  
3060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 47                 G
3070: 52 4f 55 50 20 42 59 20 72 2e 72 75 6e 5f 6e 61  ROUP BY r.run_na
3080: 6d 65 3b 22 0a 20 20 20 74 74 79 70 65 2d 69 64  me;".   ttype-id
3090: 20 74 61 72 67 65 74 2d 70 61 74 74 20 29 29 0a   target-patt )).
30a0: 0a 28 64 65 66 69 6e 65 20 28 70 67 64 62 3a 67  .(define (pgdb:g
30b0: 65 74 2d 61 6c 6c 2d 72 75 6e 2d 73 74 61 74 73  et-all-run-stats
30c0: 2d 74 61 72 67 65 74 2d 73 6c 69 63 65 20 64 62  -target-slice db
30d0: 68 20 74 61 72 67 65 74 2d 70 61 74 74 20 6c 69  h target-patt li
30e0: 6d 69 74 20 6f 66 66 73 65 74 29 0a 20 20 20 20  mit offset).    
30f0: 28 64 62 69 3a 67 65 74 2d 72 6f 77 73 0a 20 20  (dbi:get-rows.  
3100: 20 20 64 62 68 0a 20 20 20 20 22 53 45 4c 45 43    dbh.    "SELEC
3110: 54 20 20 72 2e 74 61 72 67 65 74 2c 20 72 2e 72  T  r.target, r.r
3120: 75 6e 5f 6e 61 6d 65 2c 72 2e 65 76 65 6e 74 5f  un_name,r.event_
3130: 74 69 6d 65 2c 20 43 4f 55 4e 54 28 2a 29 20 41  time, COUNT(*) A
3140: 53 20 74 6f 74 61 6c 2c 0a 20 20 20 20 20 20 20  S total,.       
3150: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 55 4d               SUM
3160: 28 43 41 53 45 20 57 48 45 4e 20 74 2e 73 74 61  (CASE WHEN t.sta
3170: 74 75 73 3d 27 50 41 53 53 27 20 54 48 45 4e 20  tus='PASS' THEN 
3180: 31 20 45 4c 53 45 20 30 20 45 4e 44 29 20 41 53  1 ELSE 0 END) AS
3190: 20 70 61 73 73 2c 0a 20 20 20 20 20 20 20 20 20   pass,.         
31a0: 20 20 20 20 20 20 20 20 20 20 20 53 55 4d 28 43             SUM(C
31b0: 41 53 45 20 57 48 45 4e 20 74 2e 73 74 61 74 75  ASE WHEN t.statu
31c0: 73 3d 27 46 41 49 4c 27 20 54 48 45 4e 20 31 20  s='FAIL' THEN 1 
31d0: 45 4c 53 45 20 30 20 45 4e 44 29 20 41 53 20 66  ELSE 0 END) AS f
31e0: 61 69 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ail,.           
31f0: 20 20 20 20 20 20 20 20 20 53 55 4d 28 43 41 53           SUM(CAS
3200: 45 20 57 48 45 4e 20 74 2e 73 74 61 74 75 73 20  E WHEN t.status 
3210: 49 4e 20 28 27 50 41 53 53 27 2c 27 46 41 49 4c  IN ('PASS','FAIL
3220: 27 29 20 54 48 45 4e 20 30 20 45 4c 53 45 20 31  ') THEN 0 ELSE 1
3230: 20 45 4e 44 29 20 41 53 20 6f 74 68 65 72 0a 20   END) AS other. 
3240: 20 20 20 20 20 20 20 20 20 20 20 46 52 4f 4d 20             FROM 
3250: 74 65 73 74 73 20 41 53 20 74 20 49 4e 4e 45 52  tests AS t INNER
3260: 20 4a 4f 49 4e 20 72 75 6e 73 20 41 53 20 72 20   JOIN runs AS r 
3270: 4f 4e 20 74 2e 72 75 6e 5f 69 64 3d 72 2e 69 64  ON t.run_id=r.id
3280: 0a 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45  .            WHE
3290: 52 45 20 72 2e 74 61 72 67 65 74 20 4c 49 4b 45  RE r.target LIKE
32a0: 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   ? .            
32b0: 47 52 4f 55 50 20 42 59 20 72 2e 74 61 72 67 65  GROUP BY r.targe
32c0: 74 2c 72 2e 72 75 6e 5f 6e 61 6d 65 2c 20 72 2e  t,r.run_name, r.
32d0: 65 76 65 6e 74 5f 74 69 6d 65 0a 20 20 20 20 20  event_time.     
32e0: 20 20 20 20 20 20 20 20 6f 72 64 65 72 20 62 79          order by
32f0: 20 72 2e 74 61 72 67 65 74 2c 72 2e 65 76 65 6e   r.target,r.even
3300: 74 5f 74 69 6d 65 20 64 65 73 63 20 6c 69 6d 69  t_time desc limi
3310: 74 20 20 3f 20 6f 66 66 73 65 74 20 3f 20 20 20  t  ? offset ?   
3320: 3b 22 0a 20 20 20 20 74 61 72 67 65 74 2d 70 61  ;".    target-pa
3330: 74 74 20 6c 69 6d 69 74 20 6f 66 66 73 65 74 29  tt limit offset)
3340: 29 0a 20 20 20 20 20 0a 0a 28 64 65 66 69 6e 65  ).     ..(define
3350: 20 28 70 67 64 62 3a 67 65 74 2d 63 6f 75 6e 74   (pgdb:get-count
3360: 2d 64 61 74 61 2d 73 74 61 74 73 2d 74 61 72 67  -data-stats-targ
3370: 65 74 2d 73 6c 69 63 65 20 64 62 68 20 74 61 72  et-slice dbh tar
3380: 67 65 74 2d 70 61 74 74 29 0a 20 20 28 64 62 69  get-patt).  (dbi
3390: 3a 67 65 74 2d 72 6f 77 73 0a 20 20 20 64 62 68  :get-rows.   dbh
33a0: 0a 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75  .    "SELECT cou
33b0: 6e 74 28 2a 29 20 20 66 72 6f 6d 20 28 53 45 4c  nt(*)  from (SEL
33c0: 45 43 54 20 20 72 2e 74 61 72 67 65 74 2c 20 72  ECT  r.target, r
33d0: 2e 72 75 6e 5f 6e 61 6d 65 2c 72 2e 65 76 65 6e  .run_name,r.even
33e0: 74 5f 74 69 6d 65 2c 20 43 4f 55 4e 54 28 2a 29  t_time, COUNT(*)
33f0: 20 41 53 20 74 6f 74 61 6c 0a 20 20 20 20 20 20   AS total.      
3400: 20 20 20 20 20 20 46 52 4f 4d 20 74 65 73 74 73        FROM tests
3410: 20 41 53 20 74 20 49 4e 4e 45 52 20 4a 4f 49 4e   AS t INNER JOIN
3420: 20 72 75 6e 73 20 41 53 20 72 20 4f 4e 20 74 2e   runs AS r ON t.
3430: 72 75 6e 5f 69 64 3d 72 2e 69 64 0a 20 20 20 20  run_id=r.id.    
3440: 20 20 20 20 20 20 20 20 57 48 45 52 45 20 72 2e          WHERE r.
3450: 74 61 72 67 65 74 20 4c 49 4b 45 20 3f 0a 20 20  target LIKE ?.  
3460: 20 20 20 20 20 20 20 20 20 20 47 52 4f 55 50 20            GROUP 
3470: 42 59 20 72 2e 74 61 72 67 65 74 2c 72 2e 72 75  BY r.target,r.ru
3480: 6e 5f 6e 61 6d 65 2c 20 72 2e 65 76 65 6e 74 5f  n_name, r.event_
3490: 74 69 6d 65 20 0a 20 20 20 20 20 20 20 20 20 20  time .          
34a0: 29 20 61 73 20 78 3b 22 20 0a 20 20 20 20 74 61  ) as x;" .    ta
34b0: 72 67 65 74 2d 70 61 74 74 29 29 0a 0a 28 64 65  rget-patt))..(de
34c0: 66 69 6e 65 20 20 28 70 67 64 62 3a 67 65 74 2d  fine  (pgdb:get-
34d0: 73 6c 69 63 65 2d 63 6e 74 20 64 62 68 20 74 61  slice-cnt dbh ta
34e0: 72 67 65 74 2d 70 61 74 74 29 0a 20 20 28 6c 65  rget-patt).  (le
34f0: 74 2a 20 28 28 63 6e 74 2d 72 65 73 75 6c 74 20  t* ((cnt-result 
3500: 28 70 67 64 62 3a 67 65 74 2d 63 6f 75 6e 74 2d  (pgdb:get-count-
3510: 64 61 74 61 2d 73 74 61 74 73 2d 74 61 72 67 65  data-stats-targe
3520: 74 2d 73 6c 69 63 65 20 64 62 68 20 74 61 72 67  t-slice dbh targ
3530: 65 74 2d 70 61 74 74 29 29 0a 20 20 20 20 20 20  et-patt)).      
3540: 20 20 20 3b 28 63 6e 74 2d 72 6f 77 20 28 63 61     ;(cnt-row (ca
3550: 72 20 28 63 6e 74 2d 72 65 73 75 6c 74 29 29 29  r (cnt-result)))
3560: 0a 20 20 20 20 20 20 20 20 20 28 63 6e 74 20 30  .         (cnt 0
3570: 29 20 0a 20 20 20 20 20 20 20 29 0a 20 20 20 20  ) .       ).    
3580: 28 66 6f 72 2d 65 61 63 68 0a 20 20 20 20 20 28  (for-each.     (
3590: 6c 61 6d 62 64 61 20 28 72 6f 77 29 0a 20 20 20  lambda (row).   
35a0: 20 20 20 28 73 65 74 21 20 63 6e 74 20 20 28 76     (set! cnt  (v
35b0: 65 63 74 6f 72 2d 72 65 66 20 72 6f 77 20 30 20  ector-ref row 0 
35c0: 29 29 29 20 0a 20 20 20 20 20 63 6e 74 2d 72 65  ))) .     cnt-re
35d0: 73 75 6c 74 29 0a 0a 63 6e 74 29 29 0a 20 20 20  sult)..cnt)).   
35e0: 0a 0a 28 64 65 66 69 6e 65 20 28 70 67 64 62 3a  ..(define (pgdb:
35f0: 67 65 74 2d 74 61 72 67 65 74 2d 74 79 70 65 73  get-target-types
3600: 20 64 62 68 29 0a 20 20 28 64 62 69 3a 67 65 74   dbh).  (dbi:get
3610: 2d 72 6f 77 73 20 64 62 68 20 22 53 45 4c 45 43  -rows dbh "SELEC
3620: 54 20 69 64 2c 74 61 72 67 65 74 5f 73 70 65 63  T id,target_spec
3630: 20 46 52 4f 4d 20 74 74 79 70 65 3b 22 29 29 0a   FROM ttype;")).
3640: 20 0a 20 28 64 65 66 69 6e 65 20 28 70 67 64 62   . (define (pgdb
3650: 3a 67 65 74 2d 64 69 73 74 69 63 74 2d 74 61 72  :get-distict-tar
3660: 67 65 74 2d 73 6c 69 63 65 20 64 62 68 29 0a 20  get-slice dbh). 
3670: 20 28 64 62 69 3a 67 65 74 2d 72 6f 77 73 20 64   (dbi:get-rows d
3680: 62 68 20 22 20 73 65 6c 65 63 74 20 64 69 73 74  bh " select dist
3690: 69 6e 63 74 20 6f 6e 20 28 73 70 6c 69 74 5f 70  inct on (split_p
36a0: 61 72 74 20 28 74 61 72 67 65 74 2c 20 27 2f 27  art (target, '/'
36b0: 2c 20 31 29 29 20 28 73 70 6c 69 74 5f 70 61 72  , 1)) (split_par
36c0: 74 20 28 74 61 72 67 65 74 2c 20 27 2f 27 2c 20  t (target, '/', 
36d0: 31 29 29 20 66 72 6f 6d 20 72 75 6e 73 3b 22 29  1)) from runs;")
36e0: 29 0a 0a 20 20 28 64 65 66 69 6e 65 20 28 70 67  )..  (define (pg
36f0: 64 62 3a 67 65 74 2d 64 69 73 74 69 63 74 2d 74  db:get-distict-t
3700: 61 72 67 65 74 2d 73 6c 69 63 65 33 20 64 62 68  arget-slice3 dbh
3710: 29 0a 20 20 28 64 62 69 3a 67 65 74 2d 72 6f 77  ).  (dbi:get-row
3720: 73 20 64 62 68 20 22 20 73 65 6c 65 63 74 20 64  s dbh " select d
3730: 69 73 74 69 6e 63 74 20 6f 6e 20 28 73 70 6c 69  istinct on (spli
3740: 74 5f 70 61 72 74 20 28 74 61 72 67 65 74 2c 20  t_part (target, 
3750: 27 2f 27 2c 20 33 29 29 20 28 73 70 6c 69 74 5f  '/', 3)) (split_
3760: 70 61 72 74 20 28 74 61 72 67 65 74 2c 20 27 2f  part (target, '/
3770: 27 2c 20 33 29 29 20 66 72 6f 6d 20 72 75 6e 73  ', 3)) from runs
3780: 3b 22 29 29 0a 3b 3b 20 0a 28 64 65 66 69 6e 65  ;")).;; .(define
3790: 20 28 70 67 64 62 3a 67 65 74 2d 74 61 72 67 65   (pgdb:get-targe
37a0: 74 73 20 64 62 68 20 74 61 72 67 65 74 2d 70 61  ts dbh target-pa
37b0: 74 74 29 0a 20 20 28 6c 65 74 20 28 28 74 74 79  tt).  (let ((tty
37c0: 70 65 73 20 28 70 67 64 62 3a 67 65 74 2d 74 61  pes (pgdb:get-ta
37d0: 72 67 65 74 2d 74 79 70 65 73 20 64 62 68 29 29  rget-types dbh))
37e0: 29 0a 20 20 20 20 28 6d 61 70 0a 20 20 20 20 20  ).    (map.     
37f0: 28 6c 61 6d 62 64 61 20 28 74 74 79 70 65 2d 64  (lambda (ttype-d
3800: 61 74 29 0a 20 20 20 20 20 20 20 28 6c 65 74 20  at).       (let 
3810: 28 28 74 74 2d 69 64 20 28 76 65 63 74 6f 72 2d  ((tt-id (vector-
3820: 72 65 66 20 74 74 79 70 65 2d 64 61 74 20 30 29  ref ttype-dat 0)
3830: 29 0a 09 20 20 20 20 20 28 74 74 79 70 65 20 28  )..     (ttype (
3840: 76 65 63 74 6f 72 2d 72 65 66 20 74 74 79 70 65  vector-ref ttype
3850: 2d 64 61 74 20 31 29 29 29 0a 09 20 28 63 6f 6e  -dat 1))).. (con
3860: 73 20 74 74 79 70 65 0a 09 20 20 20 20 20 20 20  s ttype..       
3870: 28 64 62 69 3a 67 65 74 2d 72 6f 77 73 20 0a 09  (dbi:get-rows ..
3880: 09 64 62 68 0a 09 09 22 53 45 4c 45 43 54 20 44  .dbh..."SELECT D
3890: 49 53 54 49 4e 43 54 20 74 61 72 67 65 74 20 46  ISTINCT target F
38a0: 52 4f 4d 20 72 75 6e 73 20 57 48 45 52 45 20 74  ROM runs WHERE t
38b0: 61 72 67 65 74 20 4c 49 4b 45 20 3f 20 41 4e 44  arget LIKE ? AND
38c0: 20 74 74 79 70 65 5f 69 64 3d 3f 3b 22 20 74 61   ttype_id=?;" ta
38d0: 72 67 65 74 2d 70 61 74 74 20 74 74 2d 69 64 29  rget-patt tt-id)
38e0: 29 0a 09 20 29 29 0a 20 20 20 20 20 74 74 79 70  ).. )).     ttyp
38f0: 65 73 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  es)))..(define (
3900: 70 67 64 62 3a 67 65 74 2d 74 61 72 67 65 74 73  pgdb:get-targets
3910: 2d 6f 66 2d 74 79 70 65 20 64 62 68 20 74 74 79  -of-type dbh tty
3920: 70 65 2d 69 64 20 74 61 72 67 65 74 2d 70 61 74  pe-id target-pat
3930: 74 29 0a 20 20 28 64 62 69 3a 67 65 74 2d 72 6f  t).  (dbi:get-ro
3940: 77 73 20 64 62 68 20 22 53 45 4c 45 43 54 20 44  ws dbh "SELECT D
3950: 49 53 54 49 4e 43 54 20 74 61 72 67 65 74 20 46  ISTINCT target F
3960: 52 4f 4d 20 72 75 6e 73 20 57 48 45 52 45 20 74  ROM runs WHERE t
3970: 61 72 67 65 74 20 4c 49 4b 45 20 3f 20 41 4e 44  arget LIKE ? AND
3980: 20 74 74 79 70 65 5f 69 64 3d 3f 3b 22 20 74 61   ttype_id=?;" ta
3990: 72 67 65 74 2d 70 61 74 74 20 74 74 79 70 65 2d  rget-patt ttype-
39a0: 69 64 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 70  id))..(define (p
39b0: 67 64 62 3a 67 65 74 2d 72 75 6e 73 2d 62 79 2d  gdb:get-runs-by-
39c0: 74 61 72 67 65 74 20 64 62 68 20 74 61 72 67 65  target dbh targe
39d0: 74 73 20 72 75 6e 2d 70 61 74 74 29 0a 20 20 20  ts run-patt).   
39e0: 28 64 62 69 3a 67 65 74 2d 72 6f 77 73 20 64 62  (dbi:get-rows db
39f0: 68 20 22 53 45 4c 45 43 54 20 72 2e 72 75 6e 5f  h "SELECT r.run_
3a00: 6e 61 6d 65 2c 20 74 2e 74 65 73 74 5f 6e 61 6d  name, t.test_nam
3a10: 65 2c 20 74 2e 73 74 61 74 75 73 2c 20 74 2e 69  e, t.status, t.i
3a20: 74 65 6d 5f 70 61 74 68 2c 20 74 2e 69 64 2c 20  tem_path, t.id, 
3a30: 74 2e 72 75 6e 64 69 72 2c 20 74 2e 66 69 6e 61  t.rundir, t.fina
3a40: 6c 5f 6c 6f 67 66 20 46 52 4f 4d 20 72 75 6e 73  l_logf FROM runs
3a50: 20 61 73 20 72 20 49 4e 4e 45 52 20 4a 4f 49 4e   as r INNER JOIN
3a60: 20 74 65 73 74 73 20 41 53 20 74 20 4f 4e 20 74   tests AS t ON t
3a70: 2e 72 75 6e 5f 69 64 3d 72 2e 69 64 20 20 0a 20  .run_id=r.id  . 
3a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a90: 20 20 20 20 20 20 20 20 20 57 48 45 52 45 20 74           WHERE t
3aa0: 2e 73 74 61 74 65 3d 27 43 4f 4d 50 4c 45 54 45  .state='COMPLETE
3ab0: 44 27 20 41 4e 44 20 72 2e 74 61 72 67 65 74 20  D' AND r.target 
3ac0: 6c 69 6b 65 20 3f 20 41 4e 44 20 20 72 2e 72 75  like ? AND  r.ru
3ad0: 6e 5f 6e 61 6d 65 20 6c 69 6b 65 20 3f 3b 22 20  n_name like ?;" 
3ae0: 74 61 72 67 65 74 73 20 72 75 6e 2d 70 61 74 74  targets run-patt
3af0: 29 0a 29 0a 0a 28 64 65 66 69 6e 65 20 28 70 67  ).)..(define (pg
3b00: 64 62 3a 67 65 74 2d 74 65 73 74 2d 62 79 2d 69  db:get-test-by-i
3b10: 64 20 64 62 68 20 69 64 29 0a 20 20 28 64 62 69  d dbh id).  (dbi
3b20: 3a 67 65 74 2d 72 6f 77 73 20 64 62 68 20 22 53  :get-rows dbh "S
3b30: 45 4c 45 43 54 20 74 2e 74 65 73 74 5f 6e 61 6d  ELECT t.test_nam
3b40: 65 2c 20 74 2e 69 74 65 6d 5f 70 61 74 68 2c 20  e, t.item_path, 
3b50: 74 2e 72 75 6e 64 69 72 2c 20 74 2e 66 69 6e 61  t.rundir, t.fina
3b60: 6c 5f 6c 6f 67 66 20 46 52 4f 4d 20 72 75 6e 73  l_logf FROM runs
3b70: 20 61 73 20 72 20 49 4e 4e 45 52 20 4a 4f 49 4e   as r INNER JOIN
3b80: 20 74 65 73 74 73 20 41 53 20 74 20 4f 4e 20 74   tests AS t ON t
3b90: 2e 72 75 6e 5f 69 64 3d 72 2e 69 64 20 20 0a 20  .run_id=r.id  . 
3ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3bb0: 20 20 20 20 20 20 20 20 20 57 48 45 52 45 20 74           WHERE t
3bc0: 2e 69 64 20 3d 20 3f 3b 22 20 69 64 29 0a 29 0a  .id = ?;" id).).
3bd0: 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  .;;=============
3be0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3bf0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3c00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3c10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 20 56 20  =========.;;  V 
3c20: 41 20 52 20 49 20 4f 20 55 20 53 20 20 20 44 20  A R I O U S   D 
3c30: 41 20 54 20 41 20 20 20 4d 20 41 20 53 20 53 20  A T A   M A S S 
3c40: 41 20 47 20 45 20 20 20 52 20 4f 20 55 20 54 20  A G E   R O U T 
3c50: 49 20 4e 20 45 20 53 0a 3b 3b 3d 3d 3d 3d 3d 3d  I N E S.;;======
3c60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3c70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3c80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3c90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3ca0: 0a 0a 3b 3b 20 70 72 6f 62 61 62 6c 79 20 77 61  ..;; probably wa
3cb0: 6e 74 20 74 6f 20 6d 6f 76 65 20 74 68 65 73 65  nt to move these
3cc0: 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20   to a different 
3cd0: 6d 6f 64 65 6c 20 66 69 6c 65 0a 0a 3b 3b 20 63  model file..;; c
3ce0: 72 65 61 74 65 20 61 20 68 61 73 68 20 6f 66 20  reate a hash of 
3cf0: 68 61 73 68 65 73 20 77 69 74 68 20 6b 65 79 73  hashes with keys
3d00: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
3d10: 61 6c 6c 2d 70 61 72 74 73 0a 3b 3b 20 75 73 69  all-parts.;; usi
3d20: 6e 67 20 72 6f 77 2d 6f 72 2d 63 6f 6c 20 74 6f  ng row-or-col to
3d30: 20 63 68 6f 6f 73 65 20 72 6f 77 20 6f 72 20 63   choose row or c
3d40: 6f 6c 75 6d 6e 0a 3b 3b 20 20 20 68 74 7b 72 6f  olumn.;;   ht{ro
3d50: 77 20 6b 65 79 7d 3d 3e 68 74 7b 63 6f 6c 20 6b  w key}=>ht{col k
3d60: 65 79 7d 3d 3e 64 61 74 61 0a 3b 3b 0a 3b 3b 20  ey}=>data.;;.;; 
3d70: 66 6e 75 6d 20 69 73 20 74 68 65 20 66 69 65 6c  fnum is the fiel
3d80: 64 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20  d number in the 
3d90: 74 75 70 6c 65 73 20 74 6f 20 62 65 20 73 70 6c  tuples to be spl
3da0: 69 74 0a 3b 3b 0a 0a 28 64 65 66 69 6e 65 20 28  it.;;..(define (
3db0: 70 67 64 62 3a 6d 6b 2d 70 61 74 74 65 72 6e 20  pgdb:mk-pattern 
3dc0: 20 64 6f 74 20 74 79 70 65 20 62 70 20 72 65 6c   dot type bp rel
3dd0: 29 0a 20 20 28 6c 65 74 2a 20 28 28 74 79 70 20  ).  (let* ((typ 
3de0: 28 69 66 20 28 65 71 75 61 6c 3f 20 74 79 70 65  (if (equal? type
3df0: 20 22 61 6c 6c 22 29 0a 20 20 20 20 20 20 20 20   "all").        
3e00: 20 20 20 20 20 20 20 22 25 22 0a 20 20 20 20 20         "%".     
3e10: 20 20 20 20 20 20 20 20 20 20 20 74 79 70 65 29             type)
3e20: 29 0a 20 20 20 20 20 20 20 20 28 64 6f 74 70 72  ).        (dotpr
3e30: 6f 63 65 73 73 20 28 69 66 20 28 65 71 75 61 6c  ocess (if (equal
3e40: 3f 20 64 6f 74 20 22 61 6c 6c 22 29 0a 20 20 20  ? dot "all").   
3e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3e60: 20 20 20 22 25 22 0a 20 20 20 20 20 20 20 20 20     "%".         
3e70: 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 74 29              dot)
3e80: 29 0a 20 20 20 20 20 20 20 20 28 72 65 6c 2d 6e  ).        (rel-n
3e90: 75 6d 20 28 69 66 20 28 65 71 75 61 6c 3f 20 72  um (if (equal? r
3ea0: 65 6c 20 22 22 29 0a 20 20 20 20 20 20 20 20 20  el "").         
3eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25 22               "%"
3ec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3ed0: 20 20 20 20 20 20 72 65 6c 29 29 0a 20 20 20 20        rel)).    
3ee0: 20 20 20 20 28 70 61 74 74 65 72 6e 20 20 28 63      (pattern  (c
3ef0: 6f 6e 63 20 22 25 2f 22 20 62 70 20 22 2f 22 20  onc "%/" bp "/" 
3f00: 64 6f 74 70 72 6f 63 65 73 73 20 22 2f 22 20 74  dotprocess "/" t
3f10: 79 70 20 22 5f 22 20 72 65 6c 2d 6e 75 6d 29 29  yp "_" rel-num))
3f20: 29 0a 70 61 74 74 65 72 6e 29 29 0a 0a 28 64 65  ).pattern))..(de
3f30: 66 69 6e 65 20 28 70 67 64 62 3a 63 6f 61 6c 65  fine (pgdb:coale
3f40: 73 63 65 2d 72 75 6e 73 20 64 62 68 20 72 75 6e  sce-runs dbh run
3f50: 73 20 61 6c 6c 2d 70 61 72 74 73 20 72 6f 77 2d  s all-parts row-
3f60: 6f 72 2d 63 6f 6c 20 66 6e 75 6d 29 0a 20 20 28  or-col fnum).  (
3f70: 6c 65 74 2a 20 28 28 64 61 74 61 20 20 28 6d 61  let* ((data  (ma
3f80: 6b 65 2d 68 61 73 68 2d 74 61 62 6c 65 29 29 29  ke-hash-table)))
3f90: 0a 20 20 20 20 0a 20 20 20 20 28 66 6f 72 2d 65  .    .    (for-e
3fa0: 61 63 68 0a 20 20 20 20 20 28 6c 61 6d 62 64 61  ach.     (lambda
3fb0: 20 28 72 75 6e 29 0a 20 20 20 20 20 20 20 28 6c   (run).       (l
3fc0: 65 74 2a 20 28 28 74 61 72 67 65 74 20 28 76 65  et* ((target (ve
3fd0: 63 74 6f 72 2d 72 65 66 20 72 75 6e 20 66 6e 75  ctor-ref run fnu
3fe0: 6d 29 29 0a 09 20 20 20 20 20 20 28 70 61 72 74  m))..      (part
3ff0: 73 20 20 28 73 74 72 69 6e 67 2d 73 70 6c 69 74  s  (string-split
4000: 20 74 61 72 67 65 74 20 22 2f 22 29 29 0a 09 20   target "/")).. 
4010: 20 20 20 20 20 28 66 69 72 73 74 20 20 28 63 61       (first  (ca
4020: 72 20 70 61 72 74 73 29 29 0a 09 20 20 20 20 20  r parts))..     
4030: 20 28 72 65 73 74 20 20 20 28 73 74 72 69 6e 67   (rest   (string
4040: 2d 69 6e 74 65 72 73 70 65 72 73 65 20 28 63 64  -intersperse (cd
4050: 72 20 70 61 72 74 73 29 20 22 2f 22 29 29 0a 09  r parts) "/"))..
4060: 20 20 20 20 20 20 28 63 6f 6c 64 61 74 20 28 68        (coldat (h
4070: 61 73 68 2d 74 61 62 6c 65 2d 72 65 66 2f 64 65  ash-table-ref/de
4080: 66 61 75 6c 74 20 64 61 74 61 20 66 69 72 73 74  fault data first
4090: 20 23 66 29 29 29 0a 09 20 28 69 66 20 28 6e 6f   #f))).. (if (no
40a0: 74 20 63 6f 6c 64 61 74 29 28 6c 65 74 20 28 28  t coldat)(let ((
40b0: 6e 65 77 68 74 20 28 6d 61 6b 65 2d 68 61 73 68  newht (make-hash
40c0: 2d 74 61 62 6c 65 29 29 29 0a 09 09 09 20 20 20  -table)))....   
40d0: 28 68 61 73 68 2d 74 61 62 6c 65 2d 73 65 74 21  (hash-table-set!
40e0: 20 64 61 74 61 20 66 69 72 73 74 20 6e 65 77 68   data first newh
40f0: 74 29 0a 09 09 09 20 20 20 28 73 65 74 21 20 63  t)....   (set! c
4100: 6f 6c 64 61 74 20 6e 65 77 68 74 29 29 29 0a 09  oldat newht)))..
4110: 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 73 65 74   (hash-table-set
4120: 21 20 63 6f 6c 64 61 74 20 72 65 73 74 20 72 75  ! coldat rest ru
4130: 6e 29 29 29 0a 20 20 20 20 20 72 75 6e 73 29 0a  n))).     runs).
4140: 20 20 20 20 64 61 74 61 29 29 0a 0a 0a 28 64 65      data))...(de
4150: 66 69 6e 65 20 28 70 67 64 62 3a 63 6f 61 6c 65  fine (pgdb:coale
4160: 73 63 65 2d 72 75 6e 73 31 20 72 75 6e 73 20 20  sce-runs1 runs  
4170: 29 0a 20 20 28 6c 65 74 2a 20 28 28 64 61 74 61  ).  (let* ((data
4180: 20 20 28 6d 61 6b 65 2d 68 61 73 68 2d 74 61 62    (make-hash-tab
4190: 6c 65 29 29 29 0a 20 20 20 20 0a 20 20 20 20 28  le))).    .    (
41a0: 66 6f 72 2d 65 61 63 68 0a 20 20 20 20 20 28 6c  for-each.     (l
41b0: 61 6d 62 64 61 20 28 72 75 6e 29 0a 20 20 20 20  ambda (run).    
41c0: 20 20 20 28 6c 65 74 2a 20 28 28 74 61 72 67 65     (let* ((targe
41d0: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 72 75  t (vector-ref ru
41e0: 6e 20 30 29 29 0a 09 20 20 20 20 20 20 28 70 61  n 0))..      (pa
41f0: 72 74 73 20 20 28 73 74 72 69 6e 67 2d 73 70 6c  rts  (string-spl
4200: 69 74 20 74 61 72 67 65 74 20 22 2f 22 29 29 0a  it target "/")).
4210: 09 20 20 20 20 20 20 28 66 69 72 73 74 20 20 28  .      (first  (
4220: 63 61 72 20 70 61 72 74 73 29 29 0a 09 20 20 20  car parts))..   
4230: 20 20 20 28 72 65 73 74 20 20 20 28 73 74 72 69     (rest   (stri
4240: 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 28  ng-intersperse (
4250: 63 64 72 20 70 61 72 74 73 29 20 22 2f 22 29 29  cdr parts) "/"))
4260: 0a 09 20 20 20 20 20 20 28 63 6f 6c 64 61 74 20  ..      (coldat 
4270: 28 68 61 73 68 2d 74 61 62 6c 65 2d 72 65 66 2f  (hash-table-ref/
4280: 64 65 66 61 75 6c 74 20 64 61 74 61 20 66 69 72  default data fir
4290: 73 74 20 23 66 29 29 29 0a 09 20 28 69 66 20 28  st #f))).. (if (
42a0: 6e 6f 74 20 63 6f 6c 64 61 74 29 28 6c 65 74 20  not coldat)(let 
42b0: 28 28 6e 65 77 68 74 20 28 6d 61 6b 65 2d 68 61  ((newht (make-ha
42c0: 73 68 2d 74 61 62 6c 65 29 29 29 0a 09 09 09 20  sh-table))).... 
42d0: 20 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 73 65    (hash-table-se
42e0: 74 21 20 64 61 74 61 20 66 69 72 73 74 20 6e 65  t! data first ne
42f0: 77 68 74 29 0a 09 09 09 20 20 20 28 73 65 74 21  wht)....   (set!
4300: 20 63 6f 6c 64 61 74 20 6e 65 77 68 74 29 29 29   coldat newht)))
4310: 0a 09 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 73  .. (hash-table-s
4320: 65 74 21 20 63 6f 6c 64 61 74 20 72 65 73 74 20  et! coldat rest 
4330: 72 75 6e 29 29 29 0a 20 20 20 20 20 72 75 6e 73  run))).     runs
4340: 29 0a 20 20 20 20 64 61 74 61 29 29 0a 0a 3b 3b  ).    data))..;;
4350: 20 67 69 76 65 6e 20 6f 72 64 65 72 65 64 20 64   given ordered d
4360: 61 74 61 20 68 61 73 68 20 72 65 74 75 72 6e 20  ata hash return 
4370: 61 2d 6b 65 79 73 0a 3b 3b 0a 28 64 65 66 69 6e  a-keys.;;.(defin
4380: 65 20 28 70 67 64 62 3a 6f 72 64 65 72 65 64 2d  e (pgdb:ordered-
4390: 64 61 74 61 2d 3e 61 2d 6b 65 79 73 20 6f 72 64  data->a-keys ord
43a0: 65 72 65 64 2d 64 61 74 61 29 0a 20 20 28 73 6f  ered-data).  (so
43b0: 72 74 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 6b  rt (hash-table-k
43c0: 65 79 73 20 6f 72 64 65 72 65 64 2d 64 61 74 61  eys ordered-data
43d0: 29 20 73 74 72 69 6e 67 3e 3d 3f 29 29 0a 0a 3b  ) string>=?))..;
43e0: 3b 20 67 69 76 65 6e 20 6f 72 64 65 72 65 64 20  ; given ordered 
43f0: 64 61 74 61 20 68 61 73 68 20 72 65 74 75 72 6e  data hash return
4400: 20 62 2d 6b 65 79 73 0a 3b 3b 0a 28 64 65 66 69   b-keys.;;.(defi
4410: 6e 65 20 28 70 67 64 62 3a 6f 72 64 65 72 65 64  ne (pgdb:ordered
4420: 2d 64 61 74 61 2d 3e 62 2d 6b 65 79 73 20 6f 72  -data->b-keys or
4430: 64 65 72 65 64 2d 64 61 74 61 20 61 2d 6b 65 79  dered-data a-key
4440: 73 29 0a 20 20 28 64 65 6c 65 74 65 2d 64 75 70  s).  (delete-dup
4450: 6c 69 63 61 74 65 73 0a 20 20 20 28 73 6f 72 74  licates.   (sort
4460: 20 28 61 70 70 6c 79 0a 09 20 20 61 70 70 65 6e   (apply..  appen
4470: 64 0a 09 20 20 28 6d 61 70 20 28 6c 61 6d 62 64  d..  (map (lambd
4480: 61 20 28 73 75 62 2d 6b 65 79 29 0a 09 09 20 28  a (sub-key)... (
4490: 6c 65 74 20 28 28 73 75 62 64 61 74 20 28 68 61  let ((subdat (ha
44a0: 73 68 2d 74 61 62 6c 65 2d 72 65 66 20 6f 72 64  sh-table-ref ord
44b0: 65 72 65 64 2d 64 61 74 61 20 73 75 62 2d 6b 65  ered-data sub-ke
44c0: 79 29 29 29 0a 09 09 20 20 20 28 68 61 73 68 2d  y)))...   (hash-
44d0: 74 61 62 6c 65 2d 6b 65 79 73 20 73 75 62 64 61  table-keys subda
44e0: 74 29 29 29 0a 09 20 20 20 20 20 20 20 61 2d 6b  t)))..       a-k
44f0: 65 79 73 29 29 0a 09 20 73 74 72 69 6e 67 3e 3d  eys)).. string>=
4500: 3f 29 29 29 0a 0a 3b 3b 20 67 69 76 65 6e 20 6f  ?)))..;; given o
4510: 72 64 65 72 65 64 20 64 61 74 61 20 68 61 73 68  rdered data hash
4520: 20 72 65 74 75 72 6e 20 61 2d 6b 65 79 73 0a 3b   return a-keys.;
4530: 3b 0a 28 64 65 66 69 6e 65 20 28 70 67 64 62 3a  ;.(define (pgdb:
4540: 6f 72 64 65 72 65 64 2d 64 61 74 61 2d 3e 61 2d  ordered-data->a-
4550: 6b 65 79 73 20 6f 72 64 65 72 65 64 2d 64 61 74  keys ordered-dat
4560: 61 29 0a 20 20 28 73 6f 72 74 20 28 68 61 73 68  a).  (sort (hash
4570: 2d 74 61 62 6c 65 2d 6b 65 79 73 20 6f 72 64 65  -table-keys orde
4580: 72 65 64 2d 64 61 74 61 29 20 73 74 72 69 6e 67  red-data) string
4590: 3e 3d 3f 29 29 0a 0a 3b 3b 20 67 69 76 65 6e 20  >=?))..;; given 
45a0: 6f 72 64 65 72 65 64 20 64 61 74 61 20 68 61 73  ordered data has
45b0: 68 20 72 65 74 75 72 6e 20 62 2d 6b 65 79 73 0a  h return b-keys.
45c0: 3b 3b 0a 28 64 65 66 69 6e 65 20 28 70 67 64 62  ;;.(define (pgdb
45d0: 3a 6f 72 64 65 72 65 64 2d 64 61 74 61 2d 3e 62  :ordered-data->b
45e0: 2d 6b 65 79 73 20 6f 72 64 65 72 65 64 2d 64 61  -keys ordered-da
45f0: 74 61 20 61 2d 6b 65 79 73 29 0a 20 20 28 64 65  ta a-keys).  (de
4600: 6c 65 74 65 2d 64 75 70 6c 69 63 61 74 65 73 0a  lete-duplicates.
4610: 20 20 20 28 73 6f 72 74 20 28 61 70 70 6c 79 0a     (sort (apply.
4620: 09 20 20 61 70 70 65 6e 64 0a 09 20 20 28 6d 61  .  append..  (ma
4630: 70 20 28 6c 61 6d 62 64 61 20 28 73 75 62 2d 6b  p (lambda (sub-k
4640: 65 79 29 0a 09 09 20 28 6c 65 74 20 28 28 73 75  ey)... (let ((su
4650: 62 64 61 74 20 28 68 61 73 68 2d 74 61 62 6c 65  bdat (hash-table
4660: 2d 72 65 66 20 6f 72 64 65 72 65 64 2d 64 61 74  -ref ordered-dat
4670: 61 20 73 75 62 2d 6b 65 79 29 29 29 0a 09 09 20  a sub-key)))... 
4680: 20 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 6b 65    (hash-table-ke
4690: 79 73 20 73 75 62 64 61 74 29 29 29 0a 09 20 20  ys subdat)))..  
46a0: 20 20 20 20 20 61 2d 6b 65 79 73 29 29 0a 09 20       a-keys)).. 
46b0: 73 74 72 69 6e 67 3e 3d 3f 29 29 29 0a 0a 28 64  string>=?)))..(d
46c0: 65 66 69 6e 65 20 28 70 67 64 62 3a 63 6f 61 6c  efine (pgdb:coal
46d0: 65 73 63 65 2d 72 75 6e 73 2d 62 79 2d 73 6c 69  esce-runs-by-sli
46e0: 63 65 20 72 75 6e 73 20 73 6c 69 63 65 29 0a 20  ce runs slice). 
46f0: 20 28 6c 65 74 2a 20 28 28 64 61 74 61 20 20 28   (let* ((data  (
4700: 6d 61 6b 65 2d 68 61 73 68 2d 74 61 62 6c 65 29  make-hash-table)
4710: 29 29 0a 20 20 20 20 20 20 28 66 6f 72 2d 65 61  )).      (for-ea
4720: 63 68 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20  ch.     (lambda 
4730: 28 72 75 6e 29 0a 20 20 20 20 20 20 20 28 6c 65  (run).       (le
4740: 74 2a 20 28 28 74 61 72 67 65 74 20 28 76 65 63  t* ((target (vec
4750: 74 6f 72 2d 72 65 66 20 72 75 6e 20 30 29 29 0a  tor-ref run 0)).
4760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 72                (r
4770: 75 6e 2d 6e 61 6d 65 20 28 76 65 63 74 6f 72 2d  un-name (vector-
4780: 72 65 66 20 72 75 6e 20 31 29 29 20 20 20 20 0a  ref run 1))    .
4790: 09 20 20 20 20 20 20 28 70 61 72 74 73 20 20 28  .      (parts  (
47a0: 73 74 72 69 6e 67 2d 73 70 6c 69 74 20 74 61 72  string-split tar
47b0: 67 65 74 20 22 2f 22 29 29 0a 09 20 20 20 20 20  get "/"))..     
47c0: 20 28 66 69 72 73 74 20 20 28 63 61 72 20 70 61   (first  (car pa
47d0: 72 74 73 29 29 0a 09 20 20 20 20 20 20 28 72 65  rts))..      (re
47e0: 73 74 20 20 20 28 73 74 72 69 6e 67 2d 69 6e 74  st   (string-int
47f0: 65 72 73 70 65 72 73 65 20 28 63 64 72 20 70 61  ersperse (cdr pa
4800: 72 74 73 29 20 22 2f 22 29 29 0a 09 20 20 20 20  rts) "/"))..    
4810: 20 20 28 63 6f 6c 64 61 74 20 28 68 61 73 68 2d    (coldat (hash-
4820: 74 61 62 6c 65 2d 72 65 66 2f 64 65 66 61 75 6c  table-ref/defaul
4830: 74 20 64 61 74 61 20 72 65 73 74 20 23 66 29 29  t data rest #f))
4840: 29 0a 09 20 28 69 66 20 28 6e 6f 74 20 63 6f 6c  ).. (if (not col
4850: 64 61 74 29 28 6c 65 74 20 28 28 6e 65 77 68 74  dat)(let ((newht
4860: 20 28 6d 61 6b 65 2d 68 61 73 68 2d 74 61 62 6c   (make-hash-tabl
4870: 65 29 29 29 0a 09 09 09 20 20 20 28 68 61 73 68  e)))....   (hash
4880: 2d 74 61 62 6c 65 2d 73 65 74 21 20 64 61 74 61  -table-set! data
4890: 20 72 65 73 74 20 6e 65 77 68 74 29 0a 09 09 09   rest newht)....
48a0: 20 20 20 28 73 65 74 21 20 63 6f 6c 64 61 74 20     (set! coldat 
48b0: 6e 65 77 68 74 29 29 29 0a 09 20 28 68 61 73 68  newht))).. (hash
48c0: 2d 74 61 62 6c 65 2d 73 65 74 21 20 63 6f 6c 64  -table-set! cold
48d0: 61 74 20 72 75 6e 2d 6e 61 6d 65 20 72 75 6e 29  at run-name run)
48e0: 29 29 0a 20 20 20 20 20 72 75 6e 73 29 0a 20 20  )).     runs).  
48f0: 20 20 64 61 74 61 29 29 0a 0a 0a 28 64 65 66 69    data))...(defi
4900: 6e 65 20 28 70 67 64 62 3a 72 75 6e 73 2d 74 6f  ne (pgdb:runs-to
4910: 2d 68 61 73 68 20 72 75 6e 73 20 29 0a 20 20 28  -hash runs ).  (
4920: 6c 65 74 2a 20 28 28 64 61 74 61 20 20 28 6d 61  let* ((data  (ma
4930: 6b 65 2d 68 61 73 68 2d 74 61 62 6c 65 29 29 29  ke-hash-table)))
4940: 0a 20 20 20 20 28 66 6f 72 2d 65 61 63 68 0a 20  .    (for-each. 
4950: 20 20 20 20 28 6c 61 6d 62 64 61 20 28 72 75 6e      (lambda (run
4960: 29 0a 20 20 20 20 20 20 20 28 6c 65 74 2a 20 28  ).       (let* (
4970: 28 72 75 6e 2d 6e 61 6d 65 20 28 76 65 63 74 6f  (run-name (vecto
4980: 72 2d 72 65 66 20 72 75 6e 20 30 29 29 0a 09 20  r-ref run 0)).. 
4990: 20 20 20 20 20 28 74 65 73 74 20 28 63 6f 6e 63       (test (conc
49a0: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 72 75 6e   (vector-ref run
49b0: 20 31 29 20 22 3a 22 20 28 76 65 63 74 6f 72 2d   1) ":" (vector-
49c0: 72 65 66 20 72 75 6e 20 33 29 29 29 0a 09 20 20  ref run 3)))..  
49d0: 20 20 20 20 28 63 6f 6c 64 61 74 20 28 68 61 73      (coldat (has
49e0: 68 2d 74 61 62 6c 65 2d 72 65 66 2f 64 65 66 61  h-table-ref/defa
49f0: 75 6c 74 20 64 61 74 61 20 72 75 6e 2d 6e 61 6d  ult data run-nam
4a00: 65 20 23 66 29 29 29 0a 09 20 28 69 66 20 28 6e  e #f))).. (if (n
4a10: 6f 74 20 63 6f 6c 64 61 74 29 28 6c 65 74 20 28  ot coldat)(let (
4a20: 28 6e 65 77 68 74 20 28 6d 61 6b 65 2d 68 61 73  (newht (make-has
4a30: 68 2d 74 61 62 6c 65 29 29 29 0a 09 09 09 20 20  h-table)))....  
4a40: 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 73 65 74   (hash-table-set
4a50: 21 20 64 61 74 61 20 72 75 6e 2d 6e 61 6d 65 20  ! data run-name 
4a60: 6e 65 77 68 74 29 0a 09 09 09 20 20 20 28 73 65  newht)....   (se
4a70: 74 21 20 63 6f 6c 64 61 74 20 6e 65 77 68 74 29  t! coldat newht)
4a80: 29 29 0a 09 20 28 68 61 73 68 2d 74 61 62 6c 65  )).. (hash-table
4a90: 2d 73 65 74 21 20 63 6f 6c 64 61 74 20 74 65 73  -set! coldat tes
4aa0: 74 20 72 75 6e 29 29 29 0a 20 20 20 20 20 72 75  t run))).     ru
4ab0: 6e 73 29 0a 20 20 20 20 64 61 74 61 29 29 0a 0a  ns).    data))..
4ac0: 28 64 65 66 69 6e 65 20 28 70 67 64 62 3a 67 65  (define (pgdb:ge
4ad0: 74 2d 68 69 73 74 6f 72 79 2d 68 61 73 68 20 72  t-history-hash r
4ae0: 75 6e 73 29 0a 20 20 28 6c 65 74 2a 20 28 28 64  uns).  (let* ((d
4af0: 61 74 61 20 20 28 6d 61 6b 65 2d 68 61 73 68 2d  ata  (make-hash-
4b00: 74 61 62 6c 65 29 29 29 0a 20 20 20 20 20 28 66  table))).     (f
4b10: 6f 72 2d 65 61 63 68 0a 20 20 20 20 20 28 6c 61  or-each.     (la
4b20: 6d 62 64 61 20 28 72 75 6e 29 0a 20 20 20 20 20  mbda (run).     
4b30: 20 20 28 6c 65 74 2a 20 28 28 72 75 6e 2d 6e 61    (let* ((run-na
4b40: 6d 65 20 28 76 65 63 74 6f 72 2d 72 65 66 20 72  me (vector-ref r
4b50: 75 6e 20 30 29 29 29 0a 09 20 28 68 61 73 68 2d  un 0))).. (hash-
4b60: 74 61 62 6c 65 2d 73 65 74 21 20 64 61 74 61 20  table-set! data 
4b70: 72 75 6e 2d 6e 61 6d 65 20 72 75 6e 29 29 29 0a  run-name run))).
4b80: 20 20 20 20 20 72 75 6e 73 29 0a 20 20 20 20 64       runs).    d
4b90: 61 74 61 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  ata))..(define (
4ba0: 70 67 64 62 3a 67 65 74 2d 70 67 2d 6c 73 74 20  pgdb:get-pg-lst 
4bb0: 74 61 62 32 2d 70 61 67 65 73 29 0a 20 20 20 20  tab2-pages).    
4bc0: 28 6c 65 74 20 6c 6f 6f 70 20 28 28 69 20 31 29  (let loop ((i 1)
4bd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6c  .             (l
4be0: 73 74 20 60 28 29 29 29 0a 20 20 20 20 20 20 20  st `())).       
4bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c00: 28 63 6f 6e 64 0a 20 20 20 20 20 20 20 20 20 20  (cond.          
4c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28                ((
4c20: 3e 20 69 20 74 61 62 32 2d 70 61 67 65 73 20 29  > i tab2-pages )
4c30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4c40: 20 20 20 20 20 20 20 20 20 6c 73 74 29 20 0a 20           lst) . 
4c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4c60: 20 20 20 20 20 28 65 6c 73 65 20 0a 09 09 20 20       (else ...  
4c70: 09 28 6c 6f 6f 70 20 28 2b 20 69 20 31 29 20 28  .(loop (+ i 1) (
4c80: 61 70 70 65 6e 64 20 20 20 6c 73 74 20 28 6c 69  append   lst (li
4c90: 73 74 20 69 29 29 29 29 29 29 29 0a 0a           st i)))))))..