Megatest

Hex Artifact Content
Login

Artifact 4136225c9c213b4619c3ad6c79d57c9175fd2141:


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 54 68 69 73 20 66 69 6c 65 20 69 73  .;; This file is
0080: 20 70 61 72 74 20 6f 66 20 4d 65 67 61 74 65 73   part of Megates
0090: 74 2e 0a 3b 3b 20 0a 3b 3b 20 20 20 20 20 4d 65  t..;; .;;     Me
00a0: 67 61 74 65 73 74 20 69 73 20 66 72 65 65 20 73  gatest is free s
00b0: 6f 66 74 77 61 72 65 3a 20 79 6f 75 20 63 61 6e  oftware: you can
00c0: 20 72 65 64 69 73 74 72 69 62 75 74 65 20 69 74   redistribute it
00d0: 20 61 6e 64 2f 6f 72 20 6d 6f 64 69 66 79 0a 3b   and/or modify.;
00e0: 3b 20 20 20 20 20 69 74 20 75 6e 64 65 72 20 74  ;     it under t
00f0: 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20  he terms of the 
0100: 47 4e 55 20 47 65 6e 65 72 61 6c 20 50 75 62 6c  GNU General Publ
0110: 69 63 20 4c 69 63 65 6e 73 65 20 61 73 20 70 75  ic License as pu
0120: 62 6c 69 73 68 65 64 20 62 79 0a 3b 3b 20 20 20  blished by.;;   
0130: 20 20 74 68 65 20 46 72 65 65 20 53 6f 66 74 77    the Free Softw
0140: 61 72 65 20 46 6f 75 6e 64 61 74 69 6f 6e 2c 20  are Foundation, 
0150: 65 69 74 68 65 72 20 76 65 72 73 69 6f 6e 20 33  either version 3
0160: 20 6f 66 20 74 68 65 20 4c 69 63 65 6e 73 65 2c   of the License,
0170: 20 6f 72 0a 3b 3b 20 20 20 20 20 28 61 74 20 79   or.;;     (at y
0180: 6f 75 72 20 6f 70 74 69 6f 6e 29 20 61 6e 79 20  our option) any 
0190: 6c 61 74 65 72 20 76 65 72 73 69 6f 6e 2e 0a 3b  later version..;
01a0: 3b 20 0a 3b 3b 20 20 20 20 20 4d 65 67 61 74 65  ; .;;     Megate
01b0: 73 74 20 69 73 20 64 69 73 74 72 69 62 75 74 65  st is distribute
01c0: 64 20 69 6e 20 74 68 65 20 68 6f 70 65 20 74 68  d in the hope th
01d0: 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20 75 73  at it will be us
01e0: 65 66 75 6c 2c 0a 3b 3b 20 20 20 20 20 62 75 74  eful,.;;     but
01f0: 20 57 49 54 48 4f 55 54 20 41 4e 59 20 57 41 52   WITHOUT ANY WAR
0200: 52 41 4e 54 59 3b 20 77 69 74 68 6f 75 74 20 65  RANTY; without e
0210: 76 65 6e 20 74 68 65 20 69 6d 70 6c 69 65 64 20  ven the implied 
0220: 77 61 72 72 61 6e 74 79 20 6f 66 0a 3b 3b 20 20  warranty of.;;  
0230: 20 20 20 4d 45 52 43 48 41 4e 54 41 42 49 4c 49     MERCHANTABILI
0240: 54 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46 4f  TY or FITNESS FO
0250: 52 20 41 20 50 41 52 54 49 43 55 4c 41 52 20 50  R A PARTICULAR P
0260: 55 52 50 4f 53 45 2e 20 20 53 65 65 20 74 68 65  URPOSE.  See the
0270: 0a 3b 3b 20 20 20 20 20 47 4e 55 20 47 65 6e 65  .;;     GNU Gene
0280: 72 61 6c 20 50 75 62 6c 69 63 20 4c 69 63 65 6e  ral Public Licen
0290: 73 65 20 66 6f 72 20 6d 6f 72 65 20 64 65 74 61  se for more deta
02a0: 69 6c 73 2e 0a 3b 3b 20 0a 3b 3b 20 20 20 20 20  ils..;; .;;     
02b0: 59 6f 75 20 73 68 6f 75 6c 64 20 68 61 76 65 20  You should have 
02c0: 72 65 63 65 69 76 65 64 20 61 20 63 6f 70 79 20  received a copy 
02d0: 6f 66 20 74 68 65 20 47 4e 55 20 47 65 6e 65 72  of the GNU Gener
02e0: 61 6c 20 50 75 62 6c 69 63 20 4c 69 63 65 6e 73  al Public Licens
02f0: 65 0a 3b 3b 20 20 20 20 20 61 6c 6f 6e 67 20 77  e.;;     along w
0300: 69 74 68 20 4d 65 67 61 74 65 73 74 2e 20 20 49  ith Megatest.  I
0310: 66 20 6e 6f 74 2c 20 73 65 65 20 3c 68 74 74 70  f not, see <http
0320: 3a 2f 2f 77 77 77 2e 67 6e 75 2e 6f 72 67 2f 6c  ://www.gnu.org/l
0330: 69 63 65 6e 73 65 73 2f 3e 2e 0a 0a 3b 3b 3d 3d  icenses/>...;;==
0340: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0350: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0360: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0370: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0380: 3d 3d 3d 3d 0a 0a 28 64 65 63 6c 61 72 65 20 28  ====..(declare (
0390: 75 6e 69 74 20 70 67 64 62 29 29 0a 28 64 65 63  unit pgdb)).(dec
03a0: 6c 61 72 65 20 28 75 73 65 73 20 63 6f 6e 66 69  lare (uses confi
03b0: 67 66 29 29 0a 0a 3b 3b 20 49 20 64 6f 6e 27 74  gf))..;; I don't
03c0: 20 6b 6e 6f 77 20 68 6f 77 20 74 6f 20 6d 69 78   know how to mix
03d0: 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 75 6e 69   compilation uni
03e0: 74 73 20 61 6e 64 20 6d 6f 64 75 6c 65 73 2c 20  ts and modules, 
03f0: 73 6f 20 6e 6f 20 6d 6f 64 75 6c 65 20 68 65 72  so no module her
0400: 65 2e 0a 3b 3b 0a 3b 3b 20 28 6d 6f 64 75 6c 65  e..;;.;; (module
0410: 20 70 67 64 62 0a 3b 3b 20 20 20 20 20 28 0a 3b   pgdb.;;     (.;
0420: 3b 20 20 20 20 20 20 6f 70 65 6e 2d 70 67 64 62  ;      open-pgdb
0430: 0a 3b 3b 20 20 20 20 20 20 29 0a 3b 3b 20 0a 3b  .;;      ).;; .;
0440: 3b 20 28 69 6d 70 6f 72 74 20 73 63 68 65 6d 65  ; (import scheme
0450: 29 0a 3b 3b 20 28 69 6d 70 6f 72 74 20 64 61 74  ).;; (import dat
0460: 61 2d 73 74 72 75 63 74 75 72 65 73 29 0a 3b 3b  a-structures).;;
0470: 20 28 69 6d 70 6f 72 74 20 63 68 69 63 6b 65 6e   (import chicken
0480: 29 0a 0a 28 75 73 65 20 74 79 70 65 64 2d 72 65  )..(use typed-re
0490: 63 6f 72 64 73 20 28 70 72 65 66 69 78 20 64 62  cords (prefix db
04a0: 69 20 64 62 69 3a 29 29 0a 0a 3b 3b 20 67 69 76  i dbi:))..;; giv
04b0: 65 6e 20 61 20 63 6f 6e 66 69 67 64 61 74 20 6c  en a configdat l
04c0: 6f 6f 6b 75 70 20 74 68 65 20 63 6f 6e 6e 65 63  ookup the connec
04d0: 74 69 6f 6e 20 69 6e 66 6f 20 61 6e 64 20 6f 70  tion info and op
04e0: 65 6e 20 74 68 65 20 64 62 0a 3b 3b 0a 28 64 65  en the db.;;.(de
04f0: 66 69 6e 65 20 28 70 67 64 62 3a 6f 70 65 6e 20  fine (pgdb:open 
0500: 63 6f 6e 66 69 67 64 61 74 20 23 21 6b 65 79 20  configdat #!key 
0510: 28 64 62 6e 61 6d 65 20 23 66 29 28 64 62 69 73  (dbname #f)(dbis
0520: 70 65 63 20 23 66 29 29 20 20 0a 20 20 28 6c 65  pec #f))  .  (le
0530: 74 20 28 28 70 67 63 6f 6e 66 20 28 6f 72 20 64  t ((pgconf (or d
0540: 62 69 73 70 65 63 0a 09 09 20 20 20 20 28 61 72  bispec...    (ar
0550: 67 73 3a 67 65 74 2d 61 72 67 20 22 2d 70 67 73  gs:get-arg "-pgs
0560: 79 6e 63 22 29 0a 09 09 20 20 20 20 28 69 66 20  ync")...    (if 
0570: 63 6f 6e 66 69 67 64 61 74 0a 09 09 09 28 63 6f  configdat....(co
0580: 6e 66 69 67 66 3a 6c 6f 6f 6b 75 70 20 63 6f 6e  nfigf:lookup con
0590: 66 69 67 64 61 74 20 22 65 78 74 2d 73 79 6e 63  figdat "ext-sync
05a0: 22 20 28 6f 72 20 64 62 6e 61 6d 65 20 22 70 67  " (or dbname "pg
05b0: 64 62 22 29 29 0a 09 09 09 23 66 29 0a 09 09 20  db"))....#f)... 
05c0: 20 20 20 29 29 29 0a 20 20 20 20 28 69 66 20 70     ))).    (if p
05d0: 67 63 6f 6e 66 0a 09 28 6c 65 74 2a 20 28 28 63  gconf..(let* ((c
05e0: 6f 6e 66 64 61 74 20 28 6d 61 70 20 28 6c 61 6d  onfdat (map (lam
05f0: 62 64 61 20 28 63 6f 6e 66 2d 69 74 65 6d 29 0a  bda (conf-item).
0600: 09 09 09 20 20 20 20 20 20 20 28 6c 65 74 20 28  ...       (let (
0610: 28 70 61 72 74 73 20 28 73 74 72 69 6e 67 2d 73  (parts (string-s
0620: 70 6c 69 74 20 63 6f 6e 66 2d 69 74 65 6d 20 22  plit conf-item "
0630: 3a 22 29 29 29 0a 09 09 09 09 20 28 69 66 20 28  :")))..... (if (
0640: 3e 20 28 6c 65 6e 67 74 68 20 70 61 72 74 73 29  > (length parts)
0650: 20 31 29 0a 09 09 09 09 20 20 20 20 20 28 6c 65   1).....     (le
0660: 74 20 28 28 6b 65 79 20 28 63 61 72 20 70 61 72  t ((key (car par
0670: 74 73 29 29 0a 09 09 09 09 09 20 20 20 28 76 61  ts))......   (va
0680: 6c 20 28 63 61 64 72 20 70 61 72 74 73 29 29 29  l (cadr parts)))
0690: 0a 09 09 09 09 20 20 20 20 20 20 20 28 63 6f 6e  .....       (con
06a0: 73 20 28 73 74 72 69 6e 67 2d 3e 73 79 6d 62 6f  s (string->symbo
06b0: 6c 20 6b 65 79 29 20 76 61 6c 29 29 0a 09 09 09  l key) val))....
06c0: 09 20 20 20 20 20 28 62 65 67 69 6e 0a 09 09 09  .     (begin....
06d0: 09 20 20 20 20 20 20 20 28 70 72 69 6e 74 20 22  .       (print "
06e0: 45 52 52 4f 52 3a 20 42 61 64 20 63 6f 6e 66 69  ERROR: Bad confi
06f0: 67 20 73 65 74 74 69 6e 67 20 22 20 63 6f 6e 66  g setting " conf
0700: 2d 69 74 65 6d 20 22 2c 20 73 68 6f 75 6c 64 20  -item ", should 
0710: 62 65 20 6b 65 79 3a 76 61 6c 22 29 0a 09 09 09  be key:val")....
0720: 09 20 20 20 20 20 20 20 60 28 2c 28 73 74 72 69  .       `(,(stri
0730: 6e 67 2d 3e 73 79 6d 62 6f 6c 20 28 63 61 72 20  ng->symbol (car 
0740: 70 61 72 74 73 29 29 20 2e 20 23 66 29 29 29 29  parts)) . #f))))
0750: 29 0a 09 09 09 20 20 20 20 20 28 73 74 72 69 6e  )....     (strin
0760: 67 2d 73 70 6c 69 74 20 70 67 63 6f 6e 66 29 29  g-split pgconf))
0770: 29 0a 09 20 20 20 20 20 20 20 28 64 62 74 79 70  )..       (dbtyp
0780: 65 20 20 20 28 73 74 72 69 6e 67 2d 3e 73 79 6d  e   (string->sym
0790: 62 6f 6c 20 28 6f 72 20 28 61 6c 69 73 74 2d 72  bol (or (alist-r
07a0: 65 66 20 27 64 62 74 79 70 65 20 63 6f 6e 66 64  ef 'dbtype confd
07b0: 61 74 29 20 22 70 67 22 29 29 29 29 0a 09 20 20  at) "pg"))))..  
07c0: 28 69 66 20 28 61 6c 69 73 74 2d 72 65 66 20 27  (if (alist-ref '
07d0: 64 62 74 79 70 65 20 63 6f 6e 66 64 61 74 29 0a  dbtype confdat).
07e0: 09 20 20 20 20 20 20 28 64 62 69 3a 6f 70 65 6e  .      (dbi:open
07f0: 20 64 62 74 79 70 65 20 28 61 6c 69 73 74 2d 64   dbtype (alist-d
0800: 65 6c 65 74 65 20 27 64 62 74 79 70 65 20 63 6f  elete 'dbtype co
0810: 6e 66 64 61 74 29 29 29 29 0a 09 23 66 29 29 29  nfdat))))..#f)))
0820: 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ..;;============
0830: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0840: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0850: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0860: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 20 41  ==========.;;  A
0870: 20 52 20 45 20 41 20 53 0a 3b 3b 3d 3d 3d 3d 3d   R E A S.;;=====
0880: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0890: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
08a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
08b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
08c0: 3d 0a 0a 28 64 65 66 73 74 72 75 63 74 20 61 72  =..(defstruct ar
08d0: 65 61 20 69 64 20 61 72 65 61 2d 6e 61 6d 65 20  ea id area-name 
08e0: 61 72 65 61 2d 70 61 74 68 20 6c 61 73 74 2d 75  area-path last-u
08f0: 70 64 61 74 65 29 0a 0a 28 64 65 66 69 6e 65 20  pdate)..(define 
0900: 28 70 67 64 62 3a 61 64 64 2d 61 72 65 61 20 64  (pgdb:add-area d
0910: 62 68 20 61 72 65 61 2d 6e 61 6d 65 20 61 72 65  bh area-name are
0920: 61 2d 70 61 74 68 29 0a 20 20 28 64 62 69 3a 65  a-path).  (dbi:e
0930: 78 65 63 20 64 62 68 20 22 49 4e 53 45 52 54 20  xec dbh "INSERT 
0940: 49 4e 54 4f 20 61 72 65 61 73 20 28 61 72 65 61  INTO areas (area
0950: 5f 6e 61 6d 65 2c 61 72 65 61 5f 70 61 74 68 29  _name,area_path)
0960: 20 56 41 4c 55 45 53 20 28 3f 2c 3f 29 22 20 61   VALUES (?,?)" a
0970: 72 65 61 2d 6e 61 6d 65 20 61 72 65 61 2d 70 61  rea-name area-pa
0980: 74 68 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 70  th))..(define (p
0990: 67 64 62 3a 67 65 74 2d 61 72 65 61 73 20 64 62  gdb:get-areas db
09a0: 68 29 0a 20 20 3b 3b 20 28 6d 61 70 0a 20 20 3b  h).  ;; (map.  ;
09b0: 3b 20 20 28 6c 61 6d 62 64 61 20 28 72 6f 77 29  ;  (lambda (row)
09c0: 0a 20 20 3b 3b 20 20 20 20 28 70 72 69 6e 74 20  .  ;;    (print 
09d0: 22 72 6f 77 3a 20 22 20 72 6f 77 29 29 0a 20 20  "row: " row)).  
09e0: 28 64 62 69 3a 67 65 74 2d 72 6f 77 73 20 64 62  (dbi:get-rows db
09f0: 68 20 22 53 45 4c 45 43 54 20 69 64 2c 61 72 65  h "SELECT id,are
0a00: 61 5f 6e 61 6d 65 2c 61 72 65 61 5f 70 61 74 68  a_name,area_path
0a10: 2c 6c 61 73 74 5f 73 79 6e 63 20 46 52 4f 4d 20  ,last_sync FROM 
0a20: 61 72 65 61 73 3b 22 29 29 20 3b 3b 20 29 0a 0a  areas;")) ;; )..
0a30: 3b 3b 20 67 69 76 65 6e 20 61 6e 20 61 72 65 61  ;; given an area
0a40: 5f 70 61 74 68 20 67 65 74 20 74 68 65 20 61 72  _path get the ar
0a50: 65 61 20 69 6e 66 6f 0a 3b 3b 0a 28 64 65 66 69  ea info.;;.(defi
0a60: 6e 65 20 28 70 67 64 62 3a 67 65 74 2d 61 72 65  ne (pgdb:get-are
0a70: 61 2d 62 79 2d 70 61 74 68 20 64 62 68 20 61 72  a-by-path dbh ar
0a80: 65 61 2d 70 61 74 68 29 0a 20 20 28 64 62 69 3a  ea-path).  (dbi:
0a90: 67 65 74 2d 6f 6e 65 2d 72 6f 77 20 64 62 68 20  get-one-row dbh 
0aa0: 22 53 45 4c 45 43 54 20 69 64 2c 61 72 65 61 5f  "SELECT id,area_
0ab0: 6e 61 6d 65 2c 61 72 65 61 5f 70 61 74 68 2c 6c  name,area_path,l
0ac0: 61 73 74 5f 73 79 6e 63 20 46 52 4f 4d 20 61 72  ast_sync FROM ar
0ad0: 65 61 73 20 57 48 45 52 45 20 61 72 65 61 5f 70  eas WHERE area_p
0ae0: 61 74 68 3d 3f 3b 22 20 61 72 65 61 2d 70 61 74  ath=?;" area-pat
0af0: 68 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 70 67  h))..(define (pg
0b00: 64 62 3a 77 72 69 74 65 2d 73 79 6e 63 2d 74 69  db:write-sync-ti
0b10: 6d 65 20 64 62 68 20 61 72 65 61 2d 69 6e 66 6f  me dbh area-info
0b20: 20 6e 65 77 2d 73 79 6e 63 2d 74 69 6d 65 29 0a   new-sync-time).
0b30: 20 20 28 6c 65 74 20 28 28 61 72 65 61 2d 69 64    (let ((area-id
0b40: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 61 72 65   (vector-ref are
0b50: 61 2d 69 6e 66 6f 20 30 29 29 29 0a 20 20 20 20  a-info 0))).    
0b60: 28 64 62 69 3a 65 78 65 63 20 64 62 68 20 22 55  (dbi:exec dbh "U
0b70: 50 44 41 54 45 20 61 72 65 61 73 20 53 45 54 20  PDATE areas SET 
0b80: 6c 61 73 74 5f 73 79 6e 63 3d 3f 20 57 48 45 52  last_sync=? WHER
0b90: 45 20 69 64 3d 3f 3b 22 20 6e 65 77 2d 73 79 6e  E id=?;" new-syn
0ba0: 63 2d 74 69 6d 65 20 61 72 65 61 2d 69 64 29 29  c-time area-id))
0bb0: 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  )..;;===========
0bc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0bd0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0be0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0bf0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 20  ===========.;;  
0c00: 54 20 41 20 52 20 47 20 45 20 54 20 53 0a 3b 3b  T A R G E T S.;;
0c10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0c20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0c30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0c40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0c50: 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 47 69 76 65 6e  ======..;; Given
0c60: 20 61 20 74 61 72 67 65 74 2d 73 70 65 63 2c 20   a target-spec, 
0c70: 72 65 74 75 72 6e 20 74 68 65 20 69 64 2e 20 53  return the id. S
0c80: 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 68  hould probably h
0c90: 61 6e 64 6c 65 20 74 68 69 73 20 77 69 74 68 20  andle this with 
0ca0: 61 20 6a 6f 69 6e 2e 2e 2e 0a 3b 3b 20 69 66 20  a join....;; if 
0cb0: 74 61 72 67 65 74 2d 73 70 65 63 20 6e 6f 74 20  target-spec not 
0cc0: 66 6f 75 6e 64 2c 20 63 72 65 61 74 65 20 61 20  found, create a 
0cd0: 72 65 63 6f 72 64 20 66 6f 72 20 69 74 2e 0a 3b  record for it..;
0ce0: 3b 0a 28 64 65 66 69 6e 65 20 28 70 67 64 62 3a  ;.(define (pgdb:
0cf0: 67 65 74 2d 74 74 79 70 65 20 64 62 68 20 74 61  get-ttype dbh ta
0d00: 72 67 65 74 2d 73 70 65 63 29 0a 20 20 28 6c 65  rget-spec).  (le
0d10: 74 20 28 28 73 70 65 63 2d 69 64 20 28 64 62 69  t ((spec-id (dbi
0d20: 3a 67 65 74 2d 6f 6e 65 20 64 62 68 20 22 53 45  :get-one dbh "SE
0d30: 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 74 74 79  LECT id FROM tty
0d40: 70 65 20 57 48 45 52 45 20 74 61 72 67 65 74 5f  pe WHERE target_
0d50: 73 70 65 63 3d 3f 3b 22 20 74 61 72 67 65 74 2d  spec=?;" target-
0d60: 73 70 65 63 29 29 29 0a 20 20 20 20 28 6f 72 20  spec))).    (or 
0d70: 73 70 65 63 2d 69 64 0a 09 28 69 66 20 28 68 61  spec-id..(if (ha
0d80: 6e 64 6c 65 2d 65 78 63 65 70 74 69 6f 6e 73 0a  ndle-exceptions.
0d90: 09 09 65 78 6e 0a 09 09 28 62 65 67 69 6e 0a 09  ..exn...(begin..
0da0: 09 20 20 28 70 72 69 6e 74 2d 63 61 6c 6c 2d 63  .  (print-call-c
0db0: 68 61 69 6e 29 0a 09 09 20 20 28 64 65 62 75 67  hain)...  (debug
0dc0: 3a 70 72 69 6e 74 20 30 20 2a 64 65 66 61 75 6c  :print 0 *defaul
0dd0: 74 2d 6c 6f 67 2d 70 6f 72 74 2a 20 22 45 52 52  t-log-port* "ERR
0de0: 4f 52 3a 20 63 61 6e 6e 6f 74 20 63 72 65 61 74  OR: cannot creat
0df0: 65 20 74 74 79 70 65 20 65 6e 74 72 79 2c 20 22  e ttype entry, "
0e00: 20 28 28 63 6f 6e 64 69 74 69 6f 6e 2d 70 72 6f   ((condition-pro
0e10: 70 65 72 74 79 2d 61 63 63 65 73 73 6f 72 20 27  perty-accessor '
0e20: 65 78 6e 20 27 6d 65 73 73 61 67 65 29 20 65 78  exn 'message) ex
0e30: 6e 29 29 0a 09 09 20 20 23 66 29 0a 09 20 20 20  n))...  #f)..   
0e40: 20 20 20 28 64 62 69 3a 65 78 65 63 20 64 62 68     (dbi:exec dbh
0e50: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 74   "INSERT INTO tt
0e60: 79 70 65 20 28 74 61 72 67 65 74 5f 73 70 65 63  ype (target_spec
0e70: 29 20 56 41 4c 55 45 53 20 28 3f 29 3b 22 20 74  ) VALUES (?);" t
0e80: 61 72 67 65 74 2d 73 70 65 63 29 29 0a 09 20 20  arget-spec))..  
0e90: 20 20 28 70 67 64 62 3a 67 65 74 2d 74 74 79 70    (pgdb:get-ttyp
0ea0: 65 20 64 62 68 20 74 61 72 67 65 74 2d 73 70 65  e dbh target-spe
0eb0: 63 29 29 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d  c)))))..;;======
0ec0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0ed0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0ee0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0ef0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0f00: 0a 3b 3b 20 20 54 20 41 20 47 20 53 0a 3b 3b 3d  .;;  T A G S.;;=
0f10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0f20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0f30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0f40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0f50: 3d 3d 3d 3d 3d 0a 0a 0a 28 64 65 66 69 6e 65 20  =====...(define 
0f60: 28 70 67 64 62 3a 67 65 74 2d 74 61 67 2d 69 6e  (pgdb:get-tag-in
0f70: 66 6f 2d 62 79 2d 6e 61 6d 65 20 64 62 68 20 74  fo-by-name dbh t
0f80: 61 67 29 0a 20 20 28 64 62 69 3a 67 65 74 2d 6f  ag).  (dbi:get-o
0f90: 6e 65 2d 72 6f 77 20 64 62 68 20 22 53 45 4c 45  ne-row dbh "SELE
0fa0: 43 54 20 69 64 2c 74 61 67 5f 6e 61 6d 65 20 46  CT id,tag_name F
0fb0: 52 4f 4d 20 74 61 67 73 20 77 68 65 72 65 20 74  ROM tags where t
0fc0: 61 67 5f 6e 61 6d 65 3d 3f 3b 22 20 74 61 67 29  ag_name=?;" tag)
0fd0: 29 0a 0a 28 64 65 66 69 6e 65 20 28 70 67 64 62  )..(define (pgdb
0fe0: 3a 69 6e 73 65 72 74 2d 74 61 67 20 64 62 68 20  :insert-tag dbh 
0ff0: 6e 61 6d 65 20 29 0a 20 20 28 64 62 69 3a 65 78  name ).  (dbi:ex
1000: 65 63 20 64 62 68 20 22 49 4e 53 45 52 54 20 49  ec dbh "INSERT I
1010: 4e 54 4f 20 74 61 67 73 20 28 74 61 67 5f 6e 61  NTO tags (tag_na
1020: 6d 65 29 20 56 41 4c 55 45 53 20 28 3f 29 22 20  me) VALUES (?)" 
1030: 6e 61 6d 65 20 29 29 0a 0a 28 64 65 66 69 6e 65  name ))..(define
1040: 20 28 70 67 64 62 3a 69 6e 73 65 72 74 2d 61 72   (pgdb:insert-ar
1050: 65 61 2d 74 61 67 20 64 62 68 20 74 61 67 2d 69  ea-tag dbh tag-i
1060: 64 20 61 72 65 61 2d 69 64 20 29 0a 20 20 28 64  d area-id ).  (d
1070: 62 69 3a 65 78 65 63 20 64 62 68 20 22 49 4e 53  bi:exec dbh "INS
1080: 45 52 54 20 49 4e 54 4f 20 61 72 65 61 5f 74 61  ERT INTO area_ta
1090: 67 73 20 28 74 61 67 5f 69 64 2c 20 61 72 65 61  gs (tag_id, area
10a0: 5f 69 64 29 20 56 41 4c 55 45 53 20 28 3f 2c 3f  _id) VALUES (?,?
10b0: 29 22 20 74 61 67 2d 69 64 20 61 72 65 61 2d 69  )" tag-id area-i
10c0: 64 20 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 70  d ))..(define (p
10d0: 67 64 62 3a 69 6e 73 65 72 74 2d 72 75 6e 2d 74  gdb:insert-run-t
10e0: 61 67 20 64 62 68 20 74 61 67 2d 69 64 20 72 75  ag dbh tag-id ru
10f0: 6e 2d 69 64 20 29 0a 20 20 28 64 62 69 3a 65 78  n-id ).  (dbi:ex
1100: 65 63 20 64 62 68 20 22 49 4e 53 45 52 54 20 49  ec dbh "INSERT I
1110: 4e 54 4f 20 72 75 6e 5f 74 61 67 73 20 28 74 61  NTO run_tags (ta
1120: 67 5f 69 64 2c 20 72 75 6e 5f 69 64 29 20 56 41  g_id, run_id) VA
1130: 4c 55 45 53 20 28 3f 2c 3f 29 22 20 74 61 67 2d  LUES (?,?)" tag-
1140: 69 64 20 72 75 6e 2d 69 64 20 29 29 0a 0a 0a 28  id run-id ))...(
1150: 64 65 66 69 6e 65 20 28 70 67 64 62 3a 69 73 2d  define (pgdb:is-
1160: 61 72 65 61 2d 74 61 67 65 64 20 64 62 68 20 61  area-taged dbh a
1170: 72 65 61 2d 69 64 29 0a 20 20 20 28 6c 65 74 20  rea-id).   (let 
1180: 28 28 61 72 65 61 2d 74 61 67 2d 69 64 20 28 64  ((area-tag-id (d
1190: 62 69 3a 67 65 74 2d 6f 6e 65 20 64 62 68 20 22  bi:get-one dbh "
11a0: 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 61  SELECT id FROM a
11b0: 72 65 61 5f 74 61 67 73 20 57 48 45 52 45 20 61  rea_tags WHERE a
11c0: 72 65 61 5f 69 64 3d 3f 3b 22 20 61 72 65 61 2d  rea_id=?;" area-
11d0: 69 64 29 29 29 0a 20 20 20 28 69 66 20 61 72 65  id))).   (if are
11e0: 61 2d 74 61 67 2d 69 64 20 0a 20 20 20 20 20 20  a-tag-id .      
11f0: 20 20 20 20 20 23 74 0a 20 20 20 20 20 20 20 20       #t.        
1200: 20 20 20 20 23 66 29 29 29 0a 0a 28 64 65 66 69      #f)))..(defi
1210: 6e 65 20 28 70 67 64 62 3a 69 73 2d 61 72 65 61  ne (pgdb:is-area
1220: 2d 74 61 67 65 64 2d 77 69 74 68 2d 61 2d 74 61  -taged-with-a-ta
1230: 67 20 64 62 68 20 20 20 74 61 67 2d 69 64 20 61  g dbh   tag-id a
1240: 72 65 61 2d 69 64 29 0a 20 20 20 28 6c 65 74 20  rea-id).   (let 
1250: 28 28 61 72 65 61 2d 74 61 67 2d 69 64 20 28 64  ((area-tag-id (d
1260: 62 69 3a 67 65 74 2d 6f 6e 65 20 64 62 68 20 22  bi:get-one dbh "
1270: 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 61  SELECT id FROM a
1280: 72 65 61 5f 74 61 67 73 20 57 48 45 52 45 20 61  rea_tags WHERE a
1290: 72 65 61 5f 69 64 3d 3f 20 61 6e 64 20 74 61 67  rea_id=? and tag
12a0: 5f 69 64 3d 3f 3b 22 20 61 72 65 61 2d 69 64 20  _id=?;" area-id 
12b0: 74 61 67 2d 69 64 29 29 29 0a 20 20 20 28 69 66  tag-id))).   (if
12c0: 20 61 72 65 61 2d 74 61 67 2d 69 64 20 0a 20 20   area-tag-id .  
12d0: 20 20 20 20 20 20 20 20 20 23 74 0a 20 20 20 20           #t.    
12e0: 20 20 20 20 20 20 20 20 23 66 29 29 29 0a 0a 28          #f)))..(
12f0: 64 65 66 69 6e 65 20 28 70 67 64 62 3a 69 73 2d  define (pgdb:is-
1300: 72 75 6e 2d 74 61 67 65 64 2d 77 69 74 68 2d 61  run-taged-with-a
1310: 2d 74 61 67 20 64 62 68 20 20 20 74 61 67 2d 69  -tag dbh   tag-i
1320: 64 20 72 75 6e 2d 69 64 29 0a 20 20 20 28 6c 65  d run-id).   (le
1330: 74 20 28 28 72 75 6e 2d 74 61 67 2d 69 64 20 28  t ((run-tag-id (
1340: 64 62 69 3a 67 65 74 2d 6f 6e 65 20 64 62 68 20  dbi:get-one dbh 
1350: 22 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20  "SELECT id FROM 
1360: 72 75 6e 5f 74 61 67 73 20 57 48 45 52 45 20 72  run_tags WHERE r
1370: 75 6e 5f 69 64 3d 3f 20 61 6e 64 20 74 61 67 5f  un_id=? and tag_
1380: 69 64 3d 3f 3b 22 20 72 75 6e 2d 69 64 20 74 61  id=?;" run-id ta
1390: 67 2d 69 64 29 29 29 0a 20 20 20 28 69 66 20 72  g-id))).   (if r
13a0: 75 6e 2d 74 61 67 2d 69 64 20 0a 20 20 20 20 20  un-tag-id .     
13b0: 20 20 20 20 20 20 23 74 0a 20 20 20 20 20 20 20        #t.       
13c0: 20 20 20 20 20 23 66 29 29 29 0a 0a 0a 0a 3b 3b       #f)))....;;
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 3d 3d 3d 3d 3d 3d 3d 3d  ================
1400: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1410: 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 20 52 20 55 20 4e  ======.;;  R U N
1420: 20 53 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d   S.;;===========
1430: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1440: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1450: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1460: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20  ===========..;; 
1470: 67 69 76 65 6e 20 61 20 74 61 72 67 65 74 20 73  given a target s
1480: 70 65 63 20 69 64 2c 20 74 61 72 67 65 74 20 61  pec id, target a
1490: 6e 64 20 72 75 6e 2d 6e 61 6d 65 20 72 65 74 75  nd run-name retu
14a0: 72 6e 20 74 68 65 20 72 75 6e 2d 69 64 0a 3b 3b  rn the run-id.;;
14b0: 20 69 66 20 6e 6f 20 72 75 6e 20 66 6f 75 6e 64   if no run found
14c0: 20 72 65 74 75 72 6e 20 23 66 0a 3b 3b 0a 28 64   return #f.;;.(d
14d0: 65 66 69 6e 65 20 28 70 67 64 62 3a 67 65 74 2d  efine (pgdb:get-
14e0: 72 75 6e 2d 69 64 20 64 62 68 20 73 70 65 63 2d  run-id dbh spec-
14f0: 69 64 20 74 61 72 67 65 74 20 72 75 6e 2d 6e 61  id target run-na
1500: 6d 65 20 61 72 65 61 2d 69 64 29 0a 20 20 28 64  me area-id).  (d
1510: 62 69 3a 67 65 74 2d 6f 6e 65 20 64 62 68 20 22  bi:get-one dbh "
1520: 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 72  SELECT id FROM r
1530: 75 6e 73 20 57 48 45 52 45 20 74 74 79 70 65 5f  uns WHERE ttype_
1540: 69 64 3d 3f 20 41 4e 44 20 74 61 72 67 65 74 3d  id=? AND target=
1550: 3f 20 41 4e 44 20 72 75 6e 5f 6e 61 6d 65 3d 3f  ? AND run_name=?
1560: 20 61 6e 64 20 61 72 65 61 5f 69 64 3d 3f 3b 22   and area_id=?;"
1570: 0a 09 20 20 20 20 20 20 20 73 70 65 63 2d 69 64  ..       spec-id
1580: 20 74 61 72 67 65 74 20 72 75 6e 2d 6e 61 6d 65   target run-name
1590: 20 61 72 65 61 2d 69 64 29 29 0a 0a 3b 3b 20 67   area-id))..;; g
15a0: 69 76 65 6e 20 61 20 74 61 72 67 65 74 20 73 70  iven a target sp
15b0: 65 63 20 69 64 2c 20 74 61 72 67 65 74 20 61 6e  ec id, target an
15c0: 64 20 72 75 6e 2d 6e 61 6d 65 20 72 65 74 75 72  d run-name retur
15d0: 6e 20 74 68 65 20 72 75 6e 2d 69 64 0a 3b 3b 20  n the run-id.;; 
15e0: 69 66 20 6e 6f 20 72 75 6e 20 66 6f 75 6e 64 20  if no run found 
15f0: 72 65 74 75 72 6e 20 23 66 0a 3b 3b 0a 28 64 65  return #f.;;.(de
1600: 66 69 6e 65 20 28 70 67 64 62 3a 67 65 74 2d 72  fine (pgdb:get-r
1610: 75 6e 2d 6c 61 73 74 2d 75 70 64 61 74 65 20 64  un-last-update d
1620: 62 68 20 69 64 20 29 0a 20 20 28 64 62 69 3a 67  bh id ).  (dbi:g
1630: 65 74 2d 6f 6e 65 20 64 62 68 20 22 53 45 4c 45  et-one dbh "SELE
1640: 43 54 20 6c 61 73 74 5f 75 70 64 61 74 65 20 46  CT last_update F
1650: 52 4f 4d 20 72 75 6e 73 20 57 48 45 52 45 20 69  ROM runs WHERE i
1660: 64 3d 3f 3b 22 0a 09 20 20 20 20 20 20 20 20 69  d=?;"..        i
1670: 64 29 29 0a 0a 3b 3b 20 67 69 76 65 6e 20 61 20  d))..;; given a 
1680: 72 75 6e 2d 69 64 20 72 65 74 75 72 6e 20 61 6c  run-id return al
1690: 6c 20 74 68 65 20 72 75 6e 20 69 6e 66 6f 0a 3b  l the run info.;
16a0: 3b 0a 28 64 65 66 69 6e 65 20 28 70 67 64 62 3a  ;.(define (pgdb:
16b0: 67 65 74 2d 72 75 6e 2d 69 6e 66 6f 20 64 62 68  get-run-info dbh
16c0: 20 72 75 6e 2d 69 64 20 29 20 3b 3b 20 74 6f 20   run-id ) ;; to 
16d0: 6a 6f 69 6e 20 74 74 79 70 65 20 6f 72 20 6e 6f  join ttype or no
16e0: 74 3f 0a 20 20 28 64 62 69 3a 67 65 74 2d 6f 6e  t?.  (dbi:get-on
16f0: 65 2d 72 6f 77 0a 20 20 20 64 62 68 20 20 20 3b  e-row.   dbh   ;
1700: 3b 20 30 20 20 20 20 31 20 20 20 20 20 20 20 32  ; 0    1       2
1710: 20 20 20 20 20 20 20 33 20 20 20 20 20 20 34 20         3      4 
1720: 20 20 20 20 35 20 20 20 20 20 20 36 20 20 20 20      5      6    
1730: 20 20 20 37 20 20 20 20 20 20 20 20 38 20 20 20     7        8   
1740: 20 20 20 20 20 20 39 20 20 20 20 20 20 20 20 20        9         
1750: 31 30 20 20 20 20 20 20 20 20 20 20 31 31 20 20  10          11  
1760: 20 20 20 20 20 20 20 31 32 0a 20 20 20 22 53 45         12.   "SE
1770: 4c 45 43 54 20 69 64 2c 74 61 72 67 65 74 2c 74  LECT id,target,t
1780: 74 79 70 65 5f 69 64 2c 72 75 6e 5f 6e 61 6d 65  type_id,run_name
1790: 2c 73 74 61 74 65 2c 73 74 61 74 75 73 2c 6f 77  ,state,status,ow
17a0: 6e 65 72 2c 65 76 65 6e 74 5f 74 69 6d 65 2c 63  ner,event_time,c
17b0: 6f 6d 6d 65 6e 74 2c 66 61 69 6c 5f 63 6f 75 6e  omment,fail_coun
17c0: 74 2c 70 61 73 73 5f 63 6f 75 6e 74 2c 6c 61 73  t,pass_count,las
17d0: 74 5f 75 70 64 61 74 65 2c 61 72 65 61 5f 69 64  t_update,area_id
17e0: 0a 20 20 20 20 20 20 20 46 52 4f 4d 20 72 75 6e  .       FROM run
17f0: 73 20 57 48 45 52 45 20 69 64 3d 3f 20 3b 22 20  s WHERE id=? ;" 
1800: 72 75 6e 2d 69 64 20 29 29 0a 0a 3b 3b 20 72 65  run-id ))..;; re
1810: 66 72 65 73 68 20 74 68 65 20 64 61 74 61 20 69  fresh the data i
1820: 6e 20 61 20 72 75 6e 20 72 65 63 6f 72 64 0a 3b  n a run record.;
1830: 3b 0a 28 64 65 66 69 6e 65 20 28 70 67 64 62 3a  ;.(define (pgdb:
1840: 72 65 66 72 65 73 68 2d 72 75 6e 2d 69 6e 66 6f  refresh-run-info
1850: 20 64 62 68 20 72 75 6e 2d 69 64 20 73 74 61 74   dbh run-id stat
1860: 65 20 73 74 61 74 75 73 20 6f 77 6e 65 72 20 65  e status owner e
1870: 76 65 6e 74 2d 74 69 6d 65 20 63 6f 6d 6d 65 6e  vent-time commen
1880: 74 20 66 61 69 6c 2d 63 6f 75 6e 74 20 70 61 73  t fail-count pas
1890: 73 2d 63 6f 75 6e 74 20 61 72 65 61 2d 69 64 20  s-count area-id 
18a0: 6c 61 73 74 5f 75 70 64 61 74 65 20 70 75 62 6c  last_update publ
18b0: 69 73 68 2d 74 69 6d 65 29 20 3b 3b 20 61 72 65  ish-time) ;; are
18c0: 61 2d 69 64 29 0a 20 20 28 64 62 69 3a 65 78 65  a-id).  (dbi:exe
18d0: 63 0a 20 20 20 64 62 68 0a 20 20 20 22 55 50 44  c.   dbh.   "UPD
18e0: 41 54 45 20 72 75 6e 73 20 53 45 54 0a 20 20 20  ATE runs SET.   
18f0: 20 20 20 73 74 61 74 65 3d 3f 2c 73 74 61 74 75     state=?,statu
1900: 73 3d 3f 2c 6f 77 6e 65 72 3d 3f 2c 65 76 65 6e  s=?,owner=?,even
1910: 74 5f 74 69 6d 65 3d 3f 2c 63 6f 6d 6d 65 6e 74  t_time=?,comment
1920: 3d 3f 2c 66 61 69 6c 5f 63 6f 75 6e 74 3d 3f 2c  =?,fail_count=?,
1930: 70 61 73 73 5f 63 6f 75 6e 74 3d 3f 2c 6c 61 73  pass_count=?,las
1940: 74 5f 75 70 64 61 74 65 3d 3f 2c 70 75 62 6c 69  t_update=?,publi
1950: 73 68 5f 74 69 6d 65 3d 3f 20 20 0a 20 20 20 20  sh_time=?  .    
1960: 20 57 48 45 52 45 20 69 64 3d 3f 20 61 6e 64 20   WHERE id=? and 
1970: 61 72 65 61 5f 69 64 3d 3f 3b 22 0a 20 20 20 73  area_id=?;".   s
1980: 74 61 74 65 20 73 74 61 74 75 73 20 6f 77 6e 65  tate status owne
1990: 72 20 65 76 65 6e 74 2d 74 69 6d 65 20 63 6f 6d  r event-time com
19a0: 6d 65 6e 74 20 66 61 69 6c 2d 63 6f 75 6e 74 20  ment fail-count 
19b0: 70 61 73 73 2d 63 6f 75 6e 74 20 6c 61 73 74 5f  pass-count last_
19c0: 75 70 64 61 74 65 20 70 75 62 6c 69 73 68 2d 74  update publish-t
19d0: 69 6d 65 20 72 75 6e 2d 69 64 20 61 72 65 61 2d  ime run-id area-
19e0: 69 64 20 29 29 0a 0a 3b 3b 20 67 69 76 65 6e 20  id ))..;; given 
19f0: 61 6c 6c 20 6e 65 65 64 65 64 20 69 6e 66 6f 20  all needed info 
1a00: 63 72 65 61 74 65 20 72 75 6e 20 72 65 63 6f 72  create run recor
1a10: 64 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 28 70 67  d.;;.(define (pg
1a20: 64 62 3a 69 6e 73 65 72 74 2d 72 75 6e 20 64 62  db:insert-run db
1a30: 68 20 74 74 79 70 65 2d 69 64 20 74 61 72 67 65  h ttype-id targe
1a40: 74 20 72 75 6e 2d 6e 61 6d 65 20 73 74 61 74 65  t run-name state
1a50: 20 73 74 61 74 75 73 20 6f 77 6e 65 72 20 65 76   status owner ev
1a60: 65 6e 74 2d 74 69 6d 65 20 63 6f 6d 6d 65 6e 74  ent-time comment
1a70: 20 66 61 69 6c 2d 63 6f 75 6e 74 20 70 61 73 73   fail-count pass
1a80: 2d 63 6f 75 6e 74 20 61 72 65 61 2d 69 64 20 6c  -count area-id l
1a90: 61 73 74 2d 75 70 64 61 74 65 20 70 75 62 6c 69  ast-update publi
1aa0: 73 68 2d 74 69 6d 65 29 0a 20 20 20 20 28 64 62  sh-time).    (db
1ab0: 69 3a 65 78 65 63 0a 20 20 20 64 62 68 0a 20 20  i:exec.   dbh.  
1ac0: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 72 75   "INSERT INTO ru
1ad0: 6e 73 20 28 74 74 79 70 65 5f 69 64 2c 74 61 72  ns (ttype_id,tar
1ae0: 67 65 74 2c 72 75 6e 5f 6e 61 6d 65 2c 73 74 61  get,run_name,sta
1af0: 74 65 2c 73 74 61 74 75 73 2c 6f 77 6e 65 72 2c  te,status,owner,
1b00: 65 76 65 6e 74 5f 74 69 6d 65 2c 63 6f 6d 6d 65  event_time,comme
1b10: 6e 74 2c 66 61 69 6c 5f 63 6f 75 6e 74 2c 70 61  nt,fail_count,pa
1b20: 73 73 5f 63 6f 75 6e 74 2c 61 72 65 61 5f 69 64  ss_count,area_id
1b30: 2c 6c 61 73 74 5f 75 70 64 61 74 65 2c 70 75 62  ,last_update,pub
1b40: 6c 69 73 68 5f 74 69 6d 65 29 0a 20 20 20 20 20  lish_time).     
1b50: 20 56 41 4c 55 45 53 20 28 3f 2c 3f 2c 3f 2c 3f   VALUES (?,?,?,?
1b60: 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f  ,?,?,?,?,?,?,?,?
1b70: 2c 20 3f 29 3b 22 0a 20 20 20 20 74 74 79 70 65  , ?);".    ttype
1b80: 2d 69 64 20 74 61 72 67 65 74 20 72 75 6e 2d 6e  -id target run-n
1b90: 61 6d 65 20 73 74 61 74 65 20 73 74 61 74 75 73  ame state status
1ba0: 20 6f 77 6e 65 72 20 65 76 65 6e 74 2d 74 69 6d   owner event-tim
1bb0: 65 20 63 6f 6d 6d 65 6e 74 20 66 61 69 6c 2d 63  e comment fail-c
1bc0: 6f 75 6e 74 20 70 61 73 73 2d 63 6f 75 6e 74 20  ount pass-count 
1bd0: 61 72 65 61 2d 69 64 20 6c 61 73 74 2d 75 70 64  area-id last-upd
1be0: 61 74 65 20 70 75 62 6c 69 73 68 2d 74 69 6d 65  ate publish-time
1bf0: 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ))..;;==========
1c00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1c10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1c20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1c30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20  ============.;; 
1c40: 20 54 20 45 20 53 20 54 20 2d 20 53 20 54 20 45   T E S T - S T E
1c50: 20 50 20 53 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d   P S.;;=========
1c60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1c70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1c80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1c90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28  =============..(
1ca0: 64 65 66 69 6e 65 20 28 70 67 64 62 3a 67 65 74  define (pgdb:get
1cb0: 2d 74 65 73 74 2d 73 74 65 70 2d 69 64 20 64 62  -test-step-id db
1cc0: 68 20 74 65 73 74 2d 69 64 20 73 74 65 70 6e 61  h test-id stepna
1cd0: 6d 65 20 73 74 61 74 65 29 0a 20 20 28 64 62 69  me state).  (dbi
1ce0: 3a 67 65 74 2d 6f 6e 65 0a 20 20 20 20 64 62 68  :get-one.    dbh
1cf0: 0a 20 20 20 20 22 53 45 4c 45 43 54 20 69 64 20  .    "SELECT id 
1d00: 46 52 4f 4d 20 74 65 73 74 5f 73 74 65 70 73 20  FROM test_steps 
1d10: 57 48 45 52 45 20 74 65 73 74 5f 69 64 3d 3f 20  WHERE test_id=? 
1d20: 41 4e 44 20 73 74 65 70 6e 61 6d 65 3d 3f 20 61  AND stepname=? a
1d30: 6e 64 20 73 74 61 74 65 20 3d 20 3f 20 3b 22 0a  nd state = ? ;".
1d40: 20 20 20 20 74 65 73 74 2d 69 64 20 73 74 65 70      test-id step
1d50: 6e 61 6d 65 20 73 74 61 74 65 29 29 0a 0a 28 64  name state))..(d
1d60: 65 66 69 6e 65 20 28 70 67 64 62 3a 67 65 74 2d  efine (pgdb:get-
1d70: 74 65 73 74 2d 73 74 65 70 2d 6c 61 73 74 2d 75  test-step-last-u
1d80: 70 64 61 74 65 20 64 62 68 20 69 64 20 29 0a 20  pdate dbh id ). 
1d90: 20 28 64 62 69 3a 67 65 74 2d 6f 6e 65 0a 20 20   (dbi:get-one.  
1da0: 20 20 64 62 68 0a 20 20 20 20 22 53 45 4c 45 43    dbh.    "SELEC
1db0: 54 20 6c 61 73 74 5f 75 70 64 61 74 65 20 46 52  T last_update FR
1dc0: 4f 4d 20 74 65 73 74 5f 73 74 65 70 73 20 57 48  OM test_steps WH
1dd0: 45 52 45 20 69 64 3d 3f 20 3b 22 0a 20 20 20 20  ERE id=? ;".    
1de0: 69 64 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 70  id))..(define (p
1df0: 67 64 62 3a 69 6e 73 65 72 74 2d 74 65 73 74 2d  gdb:insert-test-
1e00: 73 74 65 70 20 64 62 68 20 74 65 73 74 2d 69 64  step dbh test-id
1e10: 20 73 74 65 70 6e 61 6d 65 20 73 74 61 74 65 20   stepname state 
1e20: 73 74 61 74 75 73 20 65 76 65 6e 74 5f 74 69 6d  status event_tim
1e30: 65 20 63 6f 6d 6d 65 6e 74 20 6c 6f 67 66 69 6c  e comment logfil
1e40: 65 20 6c 61 73 74 2d 75 70 64 61 74 65 20 29 0a  e last-update ).
1e50: 20 20 28 64 62 69 3a 65 78 65 63 0a 20 20 20 64    (dbi:exec.   d
1e60: 62 68 0a 20 20 20 22 49 4e 53 45 52 54 20 49 4e  bh.   "INSERT IN
1e70: 54 4f 20 74 65 73 74 5f 73 74 65 70 73 20 28 74  TO test_steps (t
1e80: 65 73 74 5f 69 64 2c 73 74 65 70 6e 61 6d 65 2c  est_id,stepname,
1e90: 73 74 61 74 65 2c 73 74 61 74 75 73 2c 65 76 65  state,status,eve
1ea0: 6e 74 5f 74 69 6d 65 2c 6c 6f 67 66 69 6c 65 2c  nt_time,logfile,
1eb0: 63 6f 6d 6d 65 6e 74 2c 6c 61 73 74 5f 75 70 64  comment,last_upd
1ec0: 61 74 65 29 0a 20 20 20 20 20 20 20 56 41 4c 55  ate).       VALU
1ed0: 45 53 20 28 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c  ES (?,?,?,?,?,?,
1ee0: 3f 2c 3f 20 29 3b 22 0a 20 20 20 74 65 73 74 2d  ?,? );".   test-
1ef0: 69 64 20 73 74 65 70 6e 61 6d 65 20 20 73 74 61  id stepname  sta
1f00: 74 65 20 20 20 73 74 61 74 75 73 20 20 65 76 65  te   status  eve
1f10: 6e 74 5f 74 69 6d 65 20 20 20 6c 6f 67 66 69 6c  nt_time   logfil
1f20: 65 20 20 20 63 6f 6d 6d 65 6e 74 20 6c 61 73 74  e   comment last
1f30: 2d 75 70 64 61 74 65 29 29 0a 0a 28 64 65 66 69  -update))..(defi
1f40: 6e 65 20 28 70 67 64 62 3a 75 70 64 61 74 65 2d  ne (pgdb:update-
1f50: 74 65 73 74 2d 73 74 65 70 20 64 62 68 20 73 74  test-step dbh st
1f60: 65 70 2d 69 64 20 74 65 73 74 2d 69 64 20 73 74  ep-id test-id st
1f70: 65 70 6e 61 6d 65 20 73 74 61 74 65 20 73 74 61  epname state sta
1f80: 74 75 73 20 65 76 65 6e 74 5f 74 69 6d 65 20 63  tus event_time c
1f90: 6f 6d 6d 65 6e 74 20 6c 6f 67 66 69 6c 65 20 6c  omment logfile l
1fa0: 61 73 74 2d 75 70 64 61 74 65 29 0a 20 20 28 64  ast-update).  (d
1fb0: 62 69 3a 65 78 65 63 0a 20 20 20 20 64 62 68 0a  bi:exec.    dbh.
1fc0: 20 20 20 20 22 55 50 44 41 54 45 20 74 65 73 74      "UPDATE test
1fd0: 5f 73 74 65 70 73 20 53 45 54 0a 20 20 20 20 20  _steps SET.     
1fe0: 20 20 20 20 74 65 73 74 5f 69 64 3d 3f 2c 73 74      test_id=?,st
1ff0: 65 70 6e 61 6d 65 3d 3f 2c 73 74 61 74 65 3d 3f  epname=?,state=?
2000: 2c 73 74 61 74 75 73 3d 3f 2c 65 76 65 6e 74 5f  ,status=?,event_
2010: 74 69 6d 65 3d 3f 2c 6c 6f 67 66 69 6c 65 3d 3f  time=?,logfile=?
2020: 2c 63 6f 6d 6d 65 6e 74 3d 3f 2c 6c 61 73 74 5f  ,comment=?,last_
2030: 75 70 64 61 74 65 3d 3f 0a 20 20 20 20 20 20 20  update=?.       
2040: 20 20 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 0a     WHERE id=?;".
2050: 20 20 20 20 74 65 73 74 2d 69 64 20 73 74 65 70      test-id step
2060: 6e 61 6d 65 20 20 73 74 61 74 65 20 20 20 73 74  name  state   st
2070: 61 74 75 73 20 20 65 76 65 6e 74 5f 74 69 6d 65  atus  event_time
2080: 20 20 20 6c 6f 67 66 69 6c 65 20 20 20 63 6f 6d     logfile   com
2090: 6d 65 6e 74 20 6c 61 73 74 2d 75 70 64 61 74 65  ment last-update
20a0: 20 73 74 65 70 2d 69 64 29 29 0a 0a 0a 3b 3b 3d   step-id))...;;=
20b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
20c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
20d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
20e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
20f0: 3d 3d 3d 3d 3d 0a 3b 3b 20 20 54 20 45 20 53 20  =====.;;  T E S 
2100: 54 20 2d 20 44 20 41 20 54 20 41 0a 3b 3b 3d 3d  T - D A T A.;;==
2110: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2120: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2130: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2140: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2150: 3d 3d 3d 3d 0a 0a 28 64 65 66 69 6e 65 20 28 70  ====..(define (p
2160: 67 64 62 3a 67 65 74 2d 74 65 73 74 2d 64 61 74  gdb:get-test-dat
2170: 61 2d 69 64 20 64 62 68 20 74 65 73 74 2d 69 64  a-id dbh test-id
2180: 20 63 61 74 65 67 6f 72 79 20 76 61 72 69 61 62   category variab
2190: 6c 65 29 0a 20 20 28 64 62 69 3a 67 65 74 2d 6f  le).  (dbi:get-o
21a0: 6e 65 0a 20 20 20 20 64 62 68 0a 20 20 20 20 22  ne.    dbh.    "
21b0: 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 74  SELECT id FROM t
21c0: 65 73 74 5f 64 61 74 61 20 57 48 45 52 45 20 74  est_data WHERE t
21d0: 65 73 74 5f 69 64 3d 3f 20 41 4e 44 20 63 61 74  est_id=? AND cat
21e0: 65 67 6f 72 79 3d 3f 20 61 6e 64 20 76 61 72 69  egory=? and vari
21f0: 61 62 6c 65 20 3d 20 3f 20 3b 22 0a 20 20 20 20  able = ? ;".    
2200: 74 65 73 74 2d 69 64 20 63 61 74 65 67 6f 72 79  test-id category
2210: 20 76 61 72 69 61 62 6c 65 29 29 0a 0a 28 64 65   variable))..(de
2220: 66 69 6e 65 20 28 70 67 64 62 3a 67 65 74 2d 74  fine (pgdb:get-t
2230: 65 73 74 2d 64 61 74 61 2d 6c 61 73 74 2d 75 70  est-data-last-up
2240: 64 61 74 65 20 64 62 68 20 74 65 73 74 2d 64 61  date dbh test-da
2250: 74 61 2d 69 64 20 29 0a 20 20 28 64 62 69 3a 67  ta-id ).  (dbi:g
2260: 65 74 2d 6f 6e 65 0a 20 20 20 20 64 62 68 0a 20  et-one.    dbh. 
2270: 20 20 20 22 53 45 4c 45 43 54 20 6c 61 73 74 5f     "SELECT last_
2280: 75 70 64 61 74 65 20 46 52 4f 4d 20 74 65 73 74  update FROM test
2290: 5f 64 61 74 61 20 57 48 45 52 45 20 69 64 3d 3f  _data WHERE id=?
22a0: 20 3b 22 0a 20 20 20 20 74 65 73 74 2d 64 61 74   ;".    test-dat
22b0: 61 2d 69 64 29 29 0a 0a 28 64 65 66 69 6e 65 20  a-id))..(define 
22c0: 28 70 67 64 62 3a 69 6e 73 65 72 74 2d 74 65 73  (pgdb:insert-tes
22d0: 74 2d 64 61 74 61 20 64 62 68 20 74 65 73 74 2d  t-data dbh test-
22e0: 69 64 20 63 61 74 65 67 6f 72 79 20 76 61 72 69  id category vari
22f0: 61 62 6c 65 20 76 61 6c 75 65 20 65 78 70 65 63  able value expec
2300: 74 65 64 20 74 6f 6c 20 75 6e 69 74 73 20 63 6f  ted tol units co
2310: 6d 6d 65 6e 74 20 73 74 61 74 75 73 20 74 79 70  mment status typ
2320: 65 20 6c 61 73 74 2d 75 70 64 61 74 65 29 0a 20  e last-update). 
2330: 3b 20 28 70 72 69 6e 74 20 22 49 4e 53 45 52 54  ; (print "INSERT
2340: 20 49 4e 54 4f 20 74 65 73 74 5f 64 61 74 61 20   INTO test_data 
2350: 28 74 65 73 74 5f 69 64 2c 20 63 61 74 65 67 6f  (test_id, catego
2360: 72 79 2c 20 76 61 72 69 61 62 6c 65 2c 20 76 61  ry, variable, va
2370: 6c 75 65 2c 20 65 78 70 65 63 74 65 64 2c 20 74  lue, expected, t
2380: 6f 6c 2c 20 75 6e 69 74 73 2c 20 63 6f 6d 6d 65  ol, units, comme
2390: 6e 74 2c 20 73 74 61 74 75 73 2c 20 74 79 70 65  nt, status, type
23a0: 29 0a 20 3b 20 20 20 20 20 20 56 41 4c 55 45 53  ). ;      VALUES
23b0: 20 28 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c   (?,?,?,?,?,?,?,
23c0: 3f 2c 3f 2c 3f 29 20 22 20 74 65 73 74 2d 69 64  ?,?,?) " test-id
23d0: 20 22 20 22 20 63 61 74 65 67 6f 72 79 20 22 20   " " category " 
23e0: 22 20 76 61 72 69 61 62 6c 65 20 22 20 22 20 76  " variable " " v
23f0: 61 6c 75 65 20 22 20 22 20 20 65 78 70 65 63 74  alue " "  expect
2400: 65 64 20 22 20 22 20 20 74 6f 6c 20 22 20 22 20  ed " "  tol " " 
2410: 20 75 6e 69 74 73 20 22 20 22 20 63 6f 6d 6d 65   units " " comme
2420: 6e 74 20 20 22 20 22 20 73 74 61 74 75 73 20 20  nt  " " status  
2430: 22 20 22 20 74 79 70 65 29 0a 20 20 28 69 66 20  " " type).  (if 
2440: 28 6e 6f 74 20 28 73 74 72 69 6e 67 3f 20 75 6e  (not (string? un
2450: 69 74 73 29 29 0a 20 20 20 20 20 20 28 73 65 74  its)).      (set
2460: 21 20 75 6e 69 74 73 20 22 22 20 29 29 0a 20 20  ! units "" )).  
2470: 28 69 66 20 28 6e 6f 74 20 28 73 74 72 69 6e 67  (if (not (string
2480: 3f 20 76 61 72 69 61 62 6c 65 29 29 0a 20 20 20  ? variable)).   
2490: 20 20 20 28 73 65 74 21 20 76 61 72 69 61 62 6c     (set! variabl
24a0: 65 20 22 22 20 29 29 0a 20 20 28 69 66 20 28 6e  e "" )).  (if (n
24b0: 6f 74 20 28 72 65 61 6c 3f 20 76 61 6c 75 65 29  ot (real? value)
24c0: 29 0a 20 20 20 20 20 20 28 73 65 74 21 20 76 61  ).      (set! va
24d0: 6c 75 65 20 30 20 29 29 0a 20 20 28 69 66 20 28  lue 0 )).  (if (
24e0: 6e 6f 74 20 28 72 65 61 6c 3f 20 65 78 70 65 63  not (real? expec
24f0: 74 65 64 29 29 0a 20 20 20 20 20 20 28 73 65 74  ted)).      (set
2500: 21 20 65 78 70 65 63 74 65 64 20 30 20 20 29 29  ! expected 0  ))
2510: 0a 28 69 66 20 28 6e 6f 74 20 28 72 65 61 6c 3f  .(if (not (real?
2520: 20 74 6f 6c 29 29 0a 20 20 20 20 20 20 28 73 65   tol)).      (se
2530: 74 21 20 74 6f 6c 20 30 20 20 29 29 0a 0a 20 20  t! tol 0  ))..  
2540: 28 64 62 69 3a 65 78 65 63 0a 20 20 20 64 62 68  (dbi:exec.   dbh
2550: 0a 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  .   "INSERT INTO
2560: 20 74 65 73 74 5f 64 61 74 61 20 28 74 65 73 74   test_data (test
2570: 5f 69 64 2c 20 63 61 74 65 67 6f 72 79 2c 20 76  _id, category, v
2580: 61 72 69 61 62 6c 65 2c 20 76 61 6c 75 65 2c 20  ariable, value, 
2590: 65 78 70 65 63 74 65 64 2c 20 74 6f 6c 2c 20 75  expected, tol, u
25a0: 6e 69 74 73 2c 20 63 6f 6d 6d 65 6e 74 2c 20 73  nits, comment, s
25b0: 74 61 74 75 73 2c 20 74 79 70 65 2c 20 6c 61 73  tatus, type, las
25c0: 74 5f 75 70 64 61 74 65 29 0a 20 20 20 20 20 20  t_update).      
25d0: 20 56 41 4c 55 45 53 20 28 3f 2c 3f 2c 3f 2c 3f   VALUES (?,?,?,?
25e0: 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 20 3f 29  ,?,?,?,?,?,?, ?)
25f0: 3b 22 0a 20 20 20 74 65 73 74 2d 69 64 20 63 61  ;".   test-id ca
2600: 74 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65 20  tegory variable 
2610: 76 61 6c 75 65 20 65 78 70 65 63 74 65 64 20 74  value expected t
2620: 6f 6c 20 75 6e 69 74 73 20 63 6f 6d 6d 65 6e 74  ol units comment
2630: 20 73 74 61 74 75 73 20 74 79 70 65 20 6c 61 73   status type las
2640: 74 2d 75 70 64 61 74 65 29 29 0a 0a 28 64 65 66  t-update))..(def
2650: 69 6e 65 20 28 70 67 64 62 3a 75 70 64 61 74 65  ine (pgdb:update
2660: 2d 74 65 73 74 2d 64 61 74 61 20 64 62 68 20 64  -test-data dbh d
2670: 61 74 61 2d 69 64 20 74 65 73 74 2d 69 64 20 20  ata-id test-id  
2680: 63 61 74 65 67 6f 72 79 20 76 61 72 69 61 62 6c  category variabl
2690: 65 20 76 61 6c 75 65 20 65 78 70 65 63 74 65 64  e value expected
26a0: 20 74 6f 6c 20 75 6e 69 74 73 20 63 6f 6d 6d 65   tol units comme
26b0: 6e 74 20 73 74 61 74 75 73 20 74 79 70 65 20 6c  nt status type l
26c0: 61 73 74 2d 75 70 64 61 74 65 29 0a 20 20 28 64  ast-update).  (d
26d0: 62 69 3a 65 78 65 63 0a 20 20 20 20 64 62 68 0a  bi:exec.    dbh.
26e0: 20 20 20 20 22 55 50 44 41 54 45 20 74 65 73 74      "UPDATE test
26f0: 5f 64 61 74 61 20 53 45 54 0a 20 20 20 20 20 20  _data SET.      
2700: 20 20 20 74 65 73 74 5f 69 64 3d 3f 2c 20 63 61     test_id=?, ca
2710: 74 65 67 6f 72 79 3d 3f 2c 20 76 61 72 69 61 62  tegory=?, variab
2720: 6c 65 3d 3f 2c 20 76 61 6c 75 65 3d 3f 2c 20 65  le=?, value=?, e
2730: 78 70 65 63 74 65 64 3d 3f 2c 20 74 6f 6c 3d 3f  xpected=?, tol=?
2740: 2c 20 75 6e 69 74 73 3d 3f 2c 20 63 6f 6d 6d 65  , units=?, comme
2750: 6e 74 3d 3f 2c 20 73 74 61 74 75 73 3d 3f 2c 20  nt=?, status=?, 
2760: 74 79 70 65 3d 3f 2c 20 6c 61 73 74 5f 75 70 64  type=?, last_upd
2770: 61 74 65 3d 3f 0a 20 20 20 20 20 20 20 20 20 20  ate=?.          
2780: 57 48 45 52 45 20 69 64 3d 3f 3b 22 0a 20 20 20  WHERE id=?;".   
2790: 20 74 65 73 74 2d 69 64 20 63 61 74 65 67 6f 72   test-id categor
27a0: 79 20 76 61 72 69 61 62 6c 65 20 76 61 6c 75 65  y variable value
27b0: 20 65 78 70 65 63 74 65 64 20 74 6f 6c 20 75 6e   expected tol un
27c0: 69 74 73 20 63 6f 6d 6d 65 6e 74 20 73 74 61 74  its comment stat
27d0: 75 73 20 74 79 70 65 20 6c 61 73 74 2d 75 70 64  us type last-upd
27e0: 61 74 65 20 64 61 74 61 2d 69 64 20 29 29 0a 0a  ate data-id ))..
27f0: 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ..;;============
2800: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2810: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2820: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2830: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 20 54  ==========.;;  T
2840: 20 45 20 53 20 54 20 53 0a 3b 3b 3d 3d 3d 3d 3d   E S T S.;;=====
2850: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2860: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2870: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2880: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2890: 3d 0a 0a 3b 3b 20 67 69 76 65 6e 20 72 75 6e 2d  =..;; given run-
28a0: 69 64 2c 20 74 65 73 74 5f 6e 61 6d 65 20 61 6e  id, test_name an
28b0: 64 20 69 74 65 6d 5f 70 61 74 68 20 72 65 74 75  d item_path retu
28c0: 72 6e 20 74 65 73 74 2d 69 64 0a 3b 3b 0a 28 64  rn test-id.;;.(d
28d0: 65 66 69 6e 65 20 28 70 67 64 62 3a 67 65 74 2d  efine (pgdb:get-
28e0: 74 65 73 74 2d 69 64 20 64 62 68 20 72 75 6e 2d  test-id dbh run-
28f0: 69 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65  id test-name ite
2900: 6d 2d 70 61 74 68 29 0a 20 20 28 64 62 69 3a 67  m-path).  (dbi:g
2910: 65 74 2d 6f 6e 65 0a 20 20 20 64 62 68 0a 20 20  et-one.   dbh.  
2920: 20 22 53 45 4c 45 43 54 20 69 64 20 46 52 4f 4d   "SELECT id FROM
2930: 20 74 65 73 74 73 20 57 48 45 52 45 20 72 75 6e   tests WHERE run
2940: 5f 69 64 3d 3f 20 41 4e 44 20 74 65 73 74 5f 6e  _id=? AND test_n
2950: 61 6d 65 3d 3f 20 41 4e 44 20 69 74 65 6d 5f 70  ame=? AND item_p
2960: 61 74 68 3d 3f 3b 22 0a 20 20 20 72 75 6e 2d 69  ath=?;".   run-i
2970: 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d  d test-name item
2980: 2d 70 61 74 68 29 29 0a 0a 28 64 65 66 69 6e 65  -path))..(define
2990: 20 28 70 67 64 62 3a 67 65 74 2d 74 65 73 74 2d   (pgdb:get-test-
29a0: 6c 61 73 74 2d 75 70 64 61 74 65 20 64 62 68 20  last-update dbh 
29b0: 69 64 29 0a 20 20 28 64 62 69 3a 67 65 74 2d 6f  id).  (dbi:get-o
29c0: 6e 65 0a 20 20 20 64 62 68 0a 20 20 20 22 53 45  ne.   dbh.   "SE
29d0: 4c 45 43 54 20 6c 61 73 74 5f 75 70 64 61 74 65  LECT last_update
29e0: 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48 45 52   FROM tests WHER
29f0: 45 20 69 64 3d 3f 20 3b 22 0a 20 20 20 69 64 20  E id=? ;".   id 
2a00: 29 29 0a 0a 0a 3b 3b 20 63 72 65 61 74 65 20 6e  ))...;; create n
2a10: 65 77 20 74 65 73 74 20 72 65 63 6f 72 64 0a 3b  ew test record.;
2a20: 3b 0a 28 64 65 66 69 6e 65 20 28 70 67 64 62 3a  ;.(define (pgdb:
2a30: 69 6e 73 65 72 74 2d 74 65 73 74 20 64 62 68 20  insert-test dbh 
2a40: 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65  run-id test-name
2a50: 20 69 74 65 6d 2d 70 61 74 68 20 73 74 61 74 65   item-path state
2a60: 20 73 74 61 74 75 73 20 68 6f 73 74 20 63 70 75   status host cpu
2a70: 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20 75 6e  load diskfree un
2a80: 61 6d 65 20 72 75 6e 2d 64 69 72 20 6c 6f 67 2d  ame run-dir log-
2a90: 66 69 6c 65 20 72 75 6e 2d 64 75 72 61 74 69 6f  file run-duratio
2aa0: 6e 20 63 6f 6d 6d 65 6e 74 20 65 76 65 6e 74 2d  n comment event-
2ab0: 74 69 6d 65 20 61 72 63 68 69 76 65 64 20 6c 61  time archived la
2ac0: 73 74 2d 75 70 64 61 74 65 20 70 69 64 29 0a 20  st-update pid). 
2ad0: 20 28 64 62 69 3a 65 78 65 63 0a 20 20 20 64 62   (dbi:exec.   db
2ae0: 68 0a 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54  h.   "INSERT INT
2af0: 4f 20 74 65 73 74 73 20 28 72 75 6e 5f 69 64 2c  O tests (run_id,
2b00: 74 65 73 74 5f 6e 61 6d 65 2c 69 74 65 6d 5f 70  test_name,item_p
2b10: 61 74 68 2c 73 74 61 74 65 2c 73 74 61 74 75 73  ath,state,status
2b20: 2c 68 6f 73 74 2c 63 70 75 6c 6f 61 64 2c 64 69  ,host,cpuload,di
2b30: 73 6b 66 72 65 65 2c 75 6e 61 6d 65 2c 72 75 6e  skfree,uname,run
2b40: 64 69 72 2c 66 69 6e 61 6c 5f 6c 6f 67 66 2c 72  dir,final_logf,r
2b50: 75 6e 5f 64 75 72 61 74 69 6f 6e 2c 63 6f 6d 6d  un_duration,comm
2b60: 65 6e 74 2c 65 76 65 6e 74 5f 74 69 6d 65 2c 61  ent,event_time,a
2b70: 72 63 68 69 76 65 64 2c 6c 61 73 74 5f 75 70 64  rchived,last_upd
2b80: 61 74 65 2c 61 74 74 65 6d 70 74 6e 75 6d 29 0a  ate,attemptnum).
2b90: 20 20 20 20 20 20 20 56 41 4c 55 45 53 20 28 3f         VALUES (?
2ba0: 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f  ,?,?,?,?,?,?,?,?
2bb0: 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f  ,?,?,?,?,?,?,?,?
2bc0: 29 3b 22 0a 0a 20 20 20 72 75 6e 2d 69 64 20 20  );"..   run-id  
2bd0: 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70  test-name item-p
2be0: 61 74 68 20 20 20 20 73 74 61 74 65 20 20 20 73  ath    state   s
2bf0: 74 61 74 75 73 20 20 20 20 20 68 6f 73 74 20 20  tatus     host  
2c00: 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65  cpuload diskfree
2c10: 20 75 6e 61 6d 65 0a 20 20 20 72 75 6e 2d 64 69   uname.   run-di
2c20: 72 20 6c 6f 67 2d 66 69 6c 65 20 20 72 75 6e 2d  r log-file  run-
2c30: 64 75 72 61 74 69 6f 6e 20 63 6f 6d 6d 65 6e 74  duration comment
2c40: 20 65 76 65 6e 74 2d 74 69 6d 65 20 61 72 63 68   event-time arch
2c50: 69 76 65 64 20 6c 61 73 74 2d 75 70 64 61 74 65  ived last-update
2c60: 20 70 69 64 29 29 0a 0a 3b 3b 20 75 70 64 61 74   pid))..;; updat
2c70: 65 20 65 78 69 73 74 69 6e 67 20 74 65 73 74 20  e existing test 
2c80: 72 65 63 6f 72 64 0a 3b 3b 0a 28 64 65 66 69 6e  record.;;.(defin
2c90: 65 20 28 70 67 64 62 3a 75 70 64 61 74 65 2d 74  e (pgdb:update-t
2ca0: 65 73 74 20 64 62 68 20 74 65 73 74 2d 69 64 20  est dbh test-id 
2cb0: 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65  run-id test-name
2cc0: 20 69 74 65 6d 2d 70 61 74 68 20 73 74 61 74 65   item-path state
2cd0: 20 73 74 61 74 75 73 20 68 6f 73 74 20 63 70 75   status host cpu
2ce0: 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20 75 6e  load diskfree un
2cf0: 61 6d 65 20 72 75 6e 2d 64 69 72 20 6c 6f 67 2d  ame run-dir log-
2d00: 66 69 6c 65 20 72 75 6e 2d 64 75 72 61 74 69 6f  file run-duratio
2d10: 6e 20 63 6f 6d 6d 65 6e 74 20 65 76 65 6e 74 2d  n comment event-
2d20: 74 69 6d 65 20 61 72 63 68 69 76 65 64 20 6c 61  time archived la
2d30: 73 74 2d 75 70 64 61 74 65 20 70 69 64 29 0a 20  st-update pid). 
2d40: 20 28 64 62 69 3a 65 78 65 63 0a 20 20 20 64 62   (dbi:exec.   db
2d50: 68 0a 20 20 20 22 55 50 44 41 54 45 20 74 65 73  h.   "UPDATE tes
2d60: 74 73 20 53 45 54 0a 20 20 20 20 20 20 72 75 6e  ts SET.      run
2d70: 5f 69 64 3d 3f 2c 74 65 73 74 5f 6e 61 6d 65 3d  _id=?,test_name=
2d80: 3f 2c 69 74 65 6d 5f 70 61 74 68 3d 3f 2c 73 74  ?,item_path=?,st
2d90: 61 74 65 3d 3f 2c 73 74 61 74 75 73 3d 3f 2c 68  ate=?,status=?,h
2da0: 6f 73 74 3d 3f 2c 63 70 75 6c 6f 61 64 3d 3f 2c  ost=?,cpuload=?,
2db0: 64 69 73 6b 66 72 65 65 3d 3f 2c 75 6e 61 6d 65  diskfree=?,uname
2dc0: 3d 3f 2c 72 75 6e 64 69 72 3d 3f 2c 66 69 6e 61  =?,rundir=?,fina
2dd0: 6c 5f 6c 6f 67 66 3d 3f 2c 72 75 6e 5f 64 75 72  l_logf=?,run_dur
2de0: 61 74 69 6f 6e 3d 3f 2c 63 6f 6d 6d 65 6e 74 3d  ation=?,comment=
2df0: 3f 2c 65 76 65 6e 74 5f 74 69 6d 65 3d 3f 2c 61  ?,event_time=?,a
2e00: 72 63 68 69 76 65 64 3d 3f 2c 6c 61 73 74 5f 75  rchived=?,last_u
2e10: 70 64 61 74 65 3d 3f 2c 61 74 74 65 6d 70 74 6e  pdate=?,attemptn
2e20: 75 6d 3d 3f 0a 20 20 20 20 57 48 45 52 45 20 69  um=?.    WHERE i
2e30: 64 3d 3f 3b 22 0a 0a 20 20 20 72 75 6e 2d 69 64  d=?;"..   run-id
2e40: 20 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d    test-name item
2e50: 2d 70 61 74 68 20 20 20 20 73 74 61 74 65 20 20  -path    state  
2e60: 20 73 74 61 74 75 73 20 20 20 20 20 68 6f 73 74   status     host
2e70: 20 20 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72    cpuload diskfr
2e80: 65 65 20 75 6e 61 6d 65 0a 20 20 20 72 75 6e 2d  ee uname.   run-
2e90: 64 69 72 20 6c 6f 67 2d 66 69 6c 65 20 20 72 75  dir log-file  ru
2ea0: 6e 2d 64 75 72 61 74 69 6f 6e 20 63 6f 6d 6d 65  n-duration comme
2eb0: 6e 74 20 65 76 65 6e 74 2d 74 69 6d 65 20 61 72  nt event-time ar
2ec0: 63 68 69 76 65 64 20 6c 61 73 74 2d 75 70 64 61  chived last-upda
2ed0: 74 65 20 70 69 64 20 74 65 73 74 2d 69 64 29 29  te pid test-id))
2ee0: 0a 0a 28 64 65 66 69 6e 65 20 28 70 67 64 62 3a  ..(define (pgdb:
2ef0: 67 65 74 2d 74 65 73 74 73 20 64 62 68 20 74 61  get-tests dbh ta
2f00: 72 67 65 74 2d 70 61 74 74 29 0a 20 20 28 64 62  rget-patt).  (db
2f10: 69 3a 67 65 74 2d 72 6f 77 73 0a 20 20 20 64 62  i:get-rows.   db
2f20: 68 0a 20 20 20 22 53 45 4c 45 43 54 20 74 2e 69  h.   "SELECT t.i
2f30: 64 2c 74 2e 72 75 6e 5f 69 64 2c 74 2e 74 65 73  d,t.run_id,t.tes
2f40: 74 5f 6e 61 6d 65 2c 74 2e 69 74 65 6d 5f 70 61  t_name,t.item_pa
2f50: 74 68 2c 74 2e 73 74 61 74 65 2c 74 2e 73 74 61  th,t.state,t.sta
2f60: 74 75 73 2c 74 2e 68 6f 73 74 2c 74 2e 63 70 75  tus,t.host,t.cpu
2f70: 6c 6f 61 64 2c 74 2e 64 69 73 6b 66 72 65 65 2c  load,t.diskfree,
2f80: 74 2e 75 6e 61 6d 65 2c 74 2e 72 75 6e 64 69 72  t.uname,t.rundir
2f90: 2c 74 2e 66 69 6e 61 6c 5f 6c 6f 67 66 2c 74 2e  ,t.final_logf,t.
2fa0: 72 75 6e 5f 64 75 72 61 74 69 6f 6e 2c 74 2e 63  run_duration,t.c
2fb0: 6f 6d 6d 65 6e 74 2c 74 2e 65 76 65 6e 74 5f 74  omment,t.event_t
2fc0: 69 6d 65 2c 74 2e 61 72 63 68 69 76 65 64 2c 0a  ime,t.archived,.
2fd0: 20 20 20 20 20 20 20 20 20 20 20 72 2e 69 64 2c             r.id,
2fe0: 72 2e 74 61 72 67 65 74 2c 72 2e 74 74 79 70 65  r.target,r.ttype
2ff0: 5f 69 64 2c 72 2e 72 75 6e 5f 6e 61 6d 65 2c 72  _id,r.run_name,r
3000: 2e 73 74 61 74 65 2c 72 2e 73 74 61 74 75 73 2c  .state,r.status,
3010: 72 2e 6f 77 6e 65 72 2c 72 2e 65 76 65 6e 74 5f  r.owner,r.event_
3020: 74 69 6d 65 2c 72 2e 63 6f 6d 6d 65 6e 74 0a 20  time,r.comment. 
3030: 20 20 20 20 46 52 4f 4d 20 74 65 73 74 73 20 41      FROM tests A
3040: 53 20 74 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 72  S t INNER JOIN r
3050: 75 6e 73 20 41 53 20 72 20 4f 4e 20 74 2e 72 75  uns AS r ON t.ru
3060: 6e 5f 69 64 3d 72 2e 69 64 0a 20 20 20 20 20 20  n_id=r.id.      
3070: 57 48 45 52 45 20 72 2e 74 61 72 67 65 74 20 4c  WHERE r.target L
3080: 49 4b 45 20 3f 3b 22 20 74 61 72 67 65 74 2d 70  IKE ?;" target-p
3090: 61 74 74 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  att))..(define (
30a0: 70 67 64 62 3a 67 65 74 2d 73 74 61 74 73 2d 67  pgdb:get-stats-g
30b0: 69 76 65 6e 2d 74 79 70 65 2d 74 61 72 67 65 74  iven-type-target
30c0: 20 64 62 68 20 74 74 79 70 65 2d 69 64 20 74 61   dbh ttype-id ta
30d0: 72 67 65 74 2d 70 61 74 74 29 0a 20 20 28 64 62  rget-patt).  (db
30e0: 69 3a 67 65 74 2d 72 6f 77 73 0a 20 20 20 64 62  i:get-rows.   db
30f0: 68 0a 20 20 20 3b 3b 20 20 20 20 22 53 45 4c 45  h.   ;;    "SELE
3100: 43 54 20 43 4f 55 4e 54 28 74 2e 69 64 29 2c 74  CT COUNT(t.id),t
3110: 2e 73 74 61 74 75 73 2c 72 2e 74 61 72 67 65 74  .status,r.target
3120: 20 46 52 4f 4d 20 74 65 73 74 73 20 41 53 20 74   FROM tests AS t
3130: 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 72 75 6e 73   INNER JOIN runs
3140: 20 41 53 20 72 20 4f 4e 20 74 2e 72 75 6e 5f 69   AS r ON t.run_i
3150: 64 3d 72 2e 69 64 0a 20 20 20 3b 3b 20 20 20 20  d=r.id.   ;;    
3160: 20 20 20 20 20 57 48 45 52 45 20 74 2e 73 74 61       WHERE t.sta
3170: 74 65 3d 27 43 4f 4d 50 4c 45 54 45 44 27 20 41  te='COMPLETED' A
3180: 4e 44 20 74 74 79 70 65 5f 69 64 3d 3f 20 41 4e  ND ttype_id=? AN
3190: 44 20 72 2e 74 61 72 67 65 74 20 4c 49 4b 45 20  D r.target LIKE 
31a0: 3f 20 47 52 4f 55 50 20 42 59 20 72 2e 74 61 72  ? GROUP BY r.tar
31b0: 67 65 74 2c 74 2e 73 74 61 74 75 73 3b 22 0a 20  get,t.status;". 
31c0: 20 20 22 53 45 4c 45 43 54 20 72 2e 74 61 72 67    "SELECT r.targ
31d0: 65 74 2c 43 4f 55 4e 54 28 2a 29 20 41 53 20 74  et,COUNT(*) AS t
31e0: 6f 74 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  otal,.          
31f0: 20 20 20 20 20 20 20 20 20 20 53 55 4d 28 43 41            SUM(CA
3200: 53 45 20 57 48 45 4e 20 74 2e 73 74 61 74 75 73  SE WHEN t.status
3210: 3d 27 50 41 53 53 27 20 54 48 45 4e 20 31 20 45  ='PASS' THEN 1 E
3220: 4c 53 45 20 30 20 45 4e 44 29 20 41 53 20 70 61  LSE 0 END) AS pa
3230: 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ss,.            
3240: 20 20 20 20 20 20 20 20 53 55 4d 28 43 41 53 45          SUM(CASE
3250: 20 57 48 45 4e 20 74 2e 73 74 61 74 75 73 3d 27   WHEN t.status='
3260: 46 41 49 4c 27 20 54 48 45 4e 20 31 20 45 4c 53  FAIL' THEN 1 ELS
3270: 45 20 30 20 45 4e 44 29 20 41 53 20 66 61 69 6c  E 0 END) AS fail
3280: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
3290: 20 20 20 20 20 20 53 55 4d 28 43 41 53 45 20 57        SUM(CASE W
32a0: 48 45 4e 20 74 2e 73 74 61 74 75 73 20 49 4e 20  HEN t.status IN 
32b0: 28 27 50 41 53 53 27 2c 27 46 41 49 4c 27 29 20  ('PASS','FAIL') 
32c0: 54 48 45 4e 20 30 20 45 4c 53 45 20 31 20 45 4e  THEN 0 ELSE 1 EN
32d0: 44 29 20 41 53 20 6f 74 68 65 72 0a 20 20 20 20  D) AS other.    
32e0: 20 20 20 20 20 20 20 20 46 52 4f 4d 20 74 65 73          FROM tes
32f0: 74 73 20 41 53 20 74 20 49 4e 4e 45 52 20 4a 4f  ts AS t INNER JO
3300: 49 4e 20 72 75 6e 73 20 41 53 20 72 20 4f 4e 20  IN runs AS r ON 
3310: 74 2e 72 75 6e 5f 69 64 3d 72 2e 69 64 0a 20 20  t.run_id=r.id.  
3320: 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 20            WHERE 
3330: 74 2e 73 74 61 74 65 3d 27 43 4f 4d 50 4c 45 54  t.state='COMPLET
3340: 45 44 27 20 41 4e 44 20 74 74 79 70 65 5f 69 64  ED' AND ttype_id
3350: 3d 3f 20 41 4e 44 20 72 2e 74 61 72 67 65 74 20  =? AND r.target 
3360: 4c 49 4b 45 20 3f 20 47 52 4f 55 50 20 42 59 20  LIKE ? GROUP BY 
3370: 72 2e 74 61 72 67 65 74 3b 22 0a 20 20 20 74 74  r.target;".   tt
3380: 79 70 65 2d 69 64 20 74 61 72 67 65 74 2d 70 61  ype-id target-pa
3390: 74 74 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 70  tt))..(define (p
33a0: 67 64 62 3a 67 65 74 2d 73 74 61 74 73 2d 67 69  gdb:get-stats-gi
33b0: 76 65 6e 2d 74 61 72 67 65 74 20 64 62 68 20 74  ven-target dbh t
33c0: 61 72 67 65 74 2d 70 61 74 74 29 0a 20 20 28 64  arget-patt).  (d
33d0: 62 69 3a 67 65 74 2d 72 6f 77 73 0a 20 20 20 64  bi:get-rows.   d
33e0: 62 68 0a 20 20 20 3b 3b 20 20 20 20 22 53 45 4c  bh.   ;;    "SEL
33f0: 45 43 54 20 43 4f 55 4e 54 28 74 2e 69 64 29 2c  ECT COUNT(t.id),
3400: 74 2e 73 74 61 74 75 73 2c 72 2e 74 61 72 67 65  t.status,r.targe
3410: 74 20 46 52 4f 4d 20 74 65 73 74 73 20 41 53 20  t FROM tests AS 
3420: 74 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 72 75 6e  t INNER JOIN run
3430: 73 20 41 53 20 72 20 4f 4e 20 74 2e 72 75 6e 5f  s AS r ON t.run_
3440: 69 64 3d 72 2e 69 64 0a 20 20 20 3b 3b 20 20 20  id=r.id.   ;;   
3450: 20 20 20 20 20 20 57 48 45 52 45 20 74 2e 73 74        WHERE t.st
3460: 61 74 65 3d 27 43 4f 4d 50 4c 45 54 45 44 27 20  ate='COMPLETED' 
3470: 41 4e 44 20 74 74 79 70 65 5f 69 64 3d 3f 20 41  AND ttype_id=? A
3480: 4e 44 20 72 2e 74 61 72 67 65 74 20 4c 49 4b 45  ND r.target LIKE
3490: 20 3f 20 47 52 4f 55 50 20 42 59 20 72 2e 74 61   ? GROUP BY r.ta
34a0: 72 67 65 74 2c 74 2e 73 74 61 74 75 73 3b 22 0a  rget,t.status;".
34b0: 20 20 20 22 53 45 4c 45 43 54 20 72 2e 74 61 72     "SELECT r.tar
34c0: 67 65 74 2c 43 4f 55 4e 54 28 2a 29 20 41 53 20  get,COUNT(*) AS 
34d0: 74 6f 74 61 6c 2c 0a 20 20 20 20 20 20 20 20 20  total,.         
34e0: 20 20 20 20 20 20 20 20 20 20 20 53 55 4d 28 43             SUM(C
34f0: 41 53 45 20 57 48 45 4e 20 74 2e 73 74 61 74 75  ASE WHEN t.statu
3500: 73 3d 27 50 41 53 53 27 20 54 48 45 4e 20 31 20  s='PASS' THEN 1 
3510: 45 4c 53 45 20 30 20 45 4e 44 29 20 41 53 20 70  ELSE 0 END) AS p
3520: 61 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ass,.           
3530: 20 20 20 20 20 20 20 20 20 53 55 4d 28 43 41 53           SUM(CAS
3540: 45 20 57 48 45 4e 20 74 2e 73 74 61 74 75 73 3d  E WHEN t.status=
3550: 27 46 41 49 4c 27 20 54 48 45 4e 20 31 20 45 4c  'FAIL' THEN 1 EL
3560: 53 45 20 30 20 45 4e 44 29 20 41 53 20 66 61 69  SE 0 END) AS fai
3570: 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l,.             
3580: 20 20 20 20 20 20 20 53 55 4d 28 43 41 53 45 20         SUM(CASE 
3590: 57 48 45 4e 20 74 2e 73 74 61 74 75 73 20 49 4e  WHEN t.status IN
35a0: 20 28 27 50 41 53 53 27 2c 27 46 41 49 4c 27 29   ('PASS','FAIL')
35b0: 20 54 48 45 4e 20 30 20 45 4c 53 45 20 31 20 45   THEN 0 ELSE 1 E
35c0: 4e 44 29 20 41 53 20 6f 74 68 65 72 0a 20 20 20  ND) AS other.   
35d0: 20 20 20 20 20 20 20 20 20 46 52 4f 4d 20 74 65           FROM te
35e0: 73 74 73 20 41 53 20 74 20 49 4e 4e 45 52 20 4a  sts AS t INNER J
35f0: 4f 49 4e 20 72 75 6e 73 20 41 53 20 72 20 4f 4e  OIN runs AS r ON
3600: 20 74 2e 72 75 6e 5f 69 64 3d 72 2e 69 64 0a 20   t.run_id=r.id. 
3610: 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45             WHERE
3620: 20 74 2e 73 74 61 74 65 3d 27 43 4f 4d 50 4c 45   t.state='COMPLE
3630: 54 45 44 27 20 41 4e 44 20 72 2e 74 61 72 67 65  TED' AND r.targe
3640: 74 20 4c 49 4b 45 20 3f 20 47 52 4f 55 50 20 42  t LIKE ? GROUP B
3650: 59 20 72 2e 74 61 72 67 65 74 3b 22 0a 20 20 20  Y r.target;".   
3660: 74 61 72 67 65 74 2d 70 61 74 74 29 29 0a 0a 0a  target-patt))...
3670: 28 64 65 66 69 6e 65 20 28 70 67 64 62 3a 67 65  (define (pgdb:ge
3680: 74 2d 6c 61 74 65 73 74 2d 72 75 6e 2d 73 74 61  t-latest-run-sta
3690: 74 73 2d 67 69 76 65 6e 2d 74 61 72 67 65 74 20  ts-given-target 
36a0: 64 62 68 20 74 74 79 70 65 2d 69 64 20 74 61 72  dbh ttype-id tar
36b0: 67 65 74 2d 70 61 74 74 20 6c 69 6d 69 74 20 6f  get-patt limit o
36c0: 66 66 73 65 74 29 0a 20 20 28 64 62 69 3a 67 65  ffset).  (dbi:ge
36d0: 74 2d 72 6f 77 73 0a 20 20 20 64 62 68 0a 20 20  t-rows.   dbh.  
36e0: 20 3b 3b 20 20 20 20 22 53 45 4c 45 43 54 20 43   ;;    "SELECT C
36f0: 4f 55 4e 54 28 74 2e 69 64 29 2c 74 2e 73 74 61  OUNT(t.id),t.sta
3700: 74 75 73 2c 72 2e 74 61 72 67 65 74 20 46 52 4f  tus,r.target FRO
3710: 4d 20 74 65 73 74 73 20 41 53 20 74 20 49 4e 4e  M tests AS t INN
3720: 45 52 20 4a 4f 49 4e 20 72 75 6e 73 20 41 53 20  ER JOIN runs AS 
3730: 72 20 4f 4e 20 74 2e 72 75 6e 5f 69 64 3d 72 2e  r ON t.run_id=r.
3740: 69 64 0a 20 20 20 3b 3b 20 20 20 20 20 20 20 20  id.   ;;        
3750: 20 57 48 45 52 45 20 74 2e 73 74 61 74 65 3d 27   WHERE t.state='
3760: 43 4f 4d 50 4c 45 54 45 44 27 20 41 4e 44 20 74  COMPLETED' AND t
3770: 74 79 70 65 5f 69 64 3d 3f 20 41 4e 44 20 72 2e  type_id=? AND r.
3780: 74 61 72 67 65 74 20 4c 49 4b 45 20 3f 20 47 52  target LIKE ? GR
3790: 4f 55 50 20 42 59 20 72 2e 74 61 72 67 65 74 2c  OUP BY r.target,
37a0: 74 2e 73 74 61 74 75 73 3b 22 0a 20 20 20 22 53  t.status;".   "S
37b0: 45 4c 45 43 54 20 72 2e 74 61 72 67 65 74 2c 20  ELECT r.target, 
37c0: 72 2e 65 76 65 6e 74 5f 74 69 6d 65 2c 20 43 4f  r.event_time, CO
37d0: 55 4e 54 28 2a 29 20 41 53 20 74 6f 74 61 6c 2c  UNT(*) AS total,
37e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
37f0: 20 20 20 20 20 53 55 4d 28 43 41 53 45 20 57 48       SUM(CASE WH
3800: 45 4e 20 74 2e 73 74 61 74 75 73 3d 27 50 41 53  EN t.status='PAS
3810: 53 27 20 54 48 45 4e 20 31 20 45 4c 53 45 20 30  S' THEN 1 ELSE 0
3820: 20 45 4e 44 29 20 41 53 20 70 61 73 73 2c 0a 20   END) AS pass,. 
3830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3840: 20 20 20 53 55 4d 28 43 41 53 45 20 57 48 45 4e     SUM(CASE WHEN
3850: 20 74 2e 73 74 61 74 75 73 3d 27 46 41 49 4c 27   t.status='FAIL'
3860: 20 54 48 45 4e 20 31 20 45 4c 53 45 20 30 20 45   THEN 1 ELSE 0 E
3870: 4e 44 29 20 41 53 20 66 61 69 6c 2c 0a 20 20 20  ND) AS fail,.   
3880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3890: 20 53 55 4d 28 43 41 53 45 20 57 48 45 4e 20 74   SUM(CASE WHEN t
38a0: 2e 73 74 61 74 75 73 20 49 4e 20 28 27 50 41 53  .status IN ('PAS
38b0: 53 27 2c 27 46 41 49 4c 27 29 20 54 48 45 4e 20  S','FAIL') THEN 
38c0: 30 20 45 4c 53 45 20 31 20 45 4e 44 29 20 41 53  0 ELSE 1 END) AS
38d0: 20 6f 74 68 65 72 2c 20 72 2e 69 64 0a 20 20 20   other, r.id.   
38e0: 20 20 20 20 20 20 20 20 20 46 52 4f 4d 20 74 65           FROM te
38f0: 73 74 73 20 41 53 20 74 20 49 4e 4e 45 52 20 4a  sts AS t INNER J
3900: 4f 49 4e 20 72 75 6e 73 20 41 53 20 72 20 4f 4e  OIN runs AS r ON
3910: 20 74 2e 72 75 6e 5f 69 64 3d 72 2e 69 64 0a 20   t.run_id=r.id. 
3920: 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45             WHERE
3930: 20 74 2e 73 74 61 74 65 20 6c 69 6b 65 20 27 25   t.state like '%
3940: 27 20 20 41 4e 44 20 74 74 79 70 65 5f 69 64 3d  '  AND ttype_id=
3950: 3f 20 41 4e 44 20 72 2e 74 61 72 67 65 74 20 4c  ? AND r.target L
3960: 49 4b 45 20 3f 20 0a 20 20 20 20 20 20 20 20 20  IKE ? .         
3970: 20 20 20 20 20 20 20 20 61 6e 64 20 72 2e 69 64          and r.id
3980: 20 69 6e 20 0a 20 20 20 20 20 20 20 20 20 20 20   in .           
3990: 28 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54  (SELECT DISTINCT
39a0: 20 6f 6e 20 28 74 61 72 67 65 74 29 20 69 64 20   on (target) id 
39b0: 66 72 6f 6d 20 72 75 6e 73 20 77 68 65 72 65 20  from runs where 
39c0: 74 61 72 67 65 74 20 6c 69 6b 65 20 3f 20 41 4e  target like ? AN
39d0: 44 20 74 74 79 70 65 5f 69 64 3d 3f 20 6f 72 64  D ttype_id=? ord
39e0: 65 72 20 62 79 20 74 61 72 67 65 74 2c 65 76 65  er by target,eve
39f0: 6e 74 5f 74 69 6d 65 20 64 65 73 63 29 20 0a 20  nt_time desc) . 
3a00: 20 20 20 20 20 20 20 20 20 47 52 4f 55 50 20 42           GROUP B
3a10: 59 20 72 2e 74 61 72 67 65 74 2c 72 2e 69 64 20  Y r.target,r.id 
3a20: 0a 20 20 20 20 20 20 20 20 20 20 6f 72 64 65 72  .          order
3a30: 20 62 79 20 72 2e 65 76 65 6e 74 5f 74 69 6d 65   by r.event_time
3a40: 20 64 65 73 63 20 6c 69 6d 69 74 20 3f 20 6f 66   desc limit ? of
3a50: 66 73 65 74 20 3f 20 3b 22 0a 20 20 20 74 74 79  fset ? ;".   tty
3a60: 70 65 2d 69 64 20 74 61 72 67 65 74 2d 70 61 74  pe-id target-pat
3a70: 74 20 74 61 72 67 65 74 2d 70 61 74 74 20 74 74  t target-patt tt
3a80: 79 70 65 2d 69 64 20 6c 69 6d 69 74 20 6f 66 66  ype-id limit off
3a90: 73 65 74 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  set))..(define (
3aa0: 70 67 64 62 3a 67 65 74 2d 6c 61 74 65 73 74 2d  pgdb:get-latest-
3ab0: 72 75 6e 2d 73 74 61 74 73 2d 67 69 76 65 6e 2d  run-stats-given-
3ac0: 70 61 74 74 65 72 6e 20 64 62 68 20 70 61 74 74  pattern dbh patt
3ad0: 20 6c 69 6d 69 74 20 6f 66 66 73 65 74 29 0a 20   limit offset). 
3ae0: 20 28 64 62 69 3a 67 65 74 2d 72 6f 77 73 0a 20   (dbi:get-rows. 
3af0: 20 20 64 62 68 0a 20 20 20 3b 3b 20 20 20 20 22    dbh.   ;;    "
3b00: 53 45 4c 45 43 54 20 43 4f 55 4e 54 28 74 2e 69  SELECT COUNT(t.i
3b10: 64 29 2c 74 2e 73 74 61 74 75 73 2c 72 2e 74 61  d),t.status,r.ta
3b20: 72 67 65 74 20 46 52 4f 4d 20 74 65 73 74 73 20  rget FROM tests 
3b30: 41 53 20 74 20 49 4e 4e 45 52 20 4a 4f 49 4e 20  AS t INNER JOIN 
3b40: 72 75 6e 73 20 41 53 20 72 20 4f 4e 20 74 2e 72  runs AS r ON t.r
3b50: 75 6e 5f 69 64 3d 72 2e 69 64 0a 20 20 20 3b 3b  un_id=r.id.   ;;
3b60: 20 20 20 20 20 20 20 20 20 57 48 45 52 45 20 74           WHERE t
3b70: 2e 73 74 61 74 65 3d 27 43 4f 4d 50 4c 45 54 45  .state='COMPLETE
3b80: 44 27 20 41 4e 44 20 74 74 79 70 65 5f 69 64 3d  D' AND ttype_id=
3b90: 3f 20 41 4e 44 20 72 2e 74 61 72 67 65 74 20 49  ? AND r.target I
3ba0: 4c 49 4b 45 20 3f 20 47 52 4f 55 50 20 42 59 20  LIKE ? GROUP BY 
3bb0: 72 2e 74 61 72 67 65 74 2c 74 2e 73 74 61 74 75  r.target,t.statu
3bc0: 73 3b 22 0a 20 20 20 22 53 45 4c 45 43 54 20 72  s;".   "SELECT r
3bd0: 2e 74 61 72 67 65 74 2c 20 72 2e 65 76 65 6e 74  .target, r.event
3be0: 5f 74 69 6d 65 2c 20 43 4f 55 4e 54 28 2a 29 20  _time, COUNT(*) 
3bf0: 41 53 20 74 6f 74 61 6c 2c 0a 20 20 20 20 20 20  AS total,.      
3c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 55                SU
3c10: 4d 28 43 41 53 45 20 57 48 45 4e 20 74 2e 73 74  M(CASE WHEN t.st
3c20: 61 74 75 73 3d 27 50 41 53 53 27 20 54 48 45 4e  atus='PASS' THEN
3c30: 20 31 20 45 4c 53 45 20 30 20 45 4e 44 29 20 41   1 ELSE 0 END) A
3c40: 53 20 70 61 73 73 2c 0a 20 20 20 20 20 20 20 20  S pass,.        
3c50: 20 20 20 20 20 20 20 20 20 20 20 20 53 55 4d 28              SUM(
3c60: 43 41 53 45 20 57 48 45 4e 20 74 2e 73 74 61 74  CASE WHEN t.stat
3c70: 75 73 3d 27 46 41 49 4c 27 20 54 48 45 4e 20 31  us='FAIL' THEN 1
3c80: 20 45 4c 53 45 20 30 20 45 4e 44 29 20 41 53 20   ELSE 0 END) AS 
3c90: 66 61 69 6c 2c 0a 20 20 20 20 20 20 20 20 20 20  fail,.          
3ca0: 20 20 20 20 20 20 20 20 20 20 53 55 4d 28 43 41            SUM(CA
3cb0: 53 45 20 57 48 45 4e 20 74 2e 73 74 61 74 75 73  SE WHEN t.status
3cc0: 20 49 4e 20 28 27 50 41 53 53 27 2c 27 46 41 49   IN ('PASS','FAI
3cd0: 4c 27 29 20 54 48 45 4e 20 30 20 45 4c 53 45 20  L') THEN 0 ELSE 
3ce0: 31 20 45 4e 44 29 20 41 53 20 6f 74 68 65 72 2c  1 END) AS other,
3cf0: 20 72 2e 69 64 0a 20 20 20 20 20 20 20 20 20 20   r.id.          
3d00: 20 20 46 52 4f 4d 20 74 65 73 74 73 20 41 53 20    FROM tests AS 
3d10: 74 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 72 75 6e  t INNER JOIN run
3d20: 73 20 41 53 20 72 20 4f 4e 20 74 2e 72 75 6e 5f  s AS r ON t.run_
3d30: 69 64 3d 72 2e 69 64 0a 20 20 20 20 20 20 20 20  id=r.id.        
3d40: 20 20 20 20 57 48 45 52 45 20 74 2e 73 74 61 74      WHERE t.stat
3d50: 65 20 6c 69 6b 65 20 27 25 27 20 20 41 4e 44 20  e like '%'  AND 
3d60: 72 2e 74 61 72 67 65 74 20 49 4c 49 4b 45 20 3f  r.target ILIKE ?
3d70: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
3d80: 20 20 20 61 6e 64 20 72 2e 69 64 20 69 6e 20 0a     and r.id in .
3d90: 20 20 20 20 20 20 20 20 20 20 20 28 53 45 4c 45             (SELE
3da0: 43 54 20 44 49 53 54 49 4e 43 54 20 6f 6e 20 28  CT DISTINCT on (
3db0: 74 61 72 67 65 74 29 20 69 64 20 66 72 6f 6d 20  target) id from 
3dc0: 72 75 6e 73 20 77 68 65 72 65 20 74 61 72 67 65  runs where targe
3dd0: 74 20 69 6c 69 6b 65 20 3f 20 20 6f 72 64 65 72  t ilike ?  order
3de0: 20 62 79 20 74 61 72 67 65 74 2c 65 76 65 6e 74   by target,event
3df0: 5f 74 69 6d 65 20 64 65 73 63 29 20 0a 20 20 20  _time desc) .   
3e00: 20 20 20 20 20 20 20 47 52 4f 55 50 20 42 59 20         GROUP BY 
3e10: 72 2e 74 61 72 67 65 74 2c 72 2e 69 64 20 0a 20  r.target,r.id . 
3e20: 20 20 20 20 20 20 20 20 20 6f 72 64 65 72 20 62           order b
3e30: 79 20 72 2e 65 76 65 6e 74 5f 74 69 6d 65 20 64  y r.event_time d
3e40: 65 73 63 20 6c 69 6d 69 74 20 3f 20 6f 66 66 73  esc limit ? offs
3e50: 65 74 20 3f 20 3b 22 0a 20 20 20 70 61 74 74 20  et ? ;".   patt 
3e60: 70 61 74 74 20 20 6c 69 6d 69 74 20 6f 66 66 73  patt  limit offs
3e70: 65 74 29 29 0a 0a 0a 28 64 65 66 69 6e 65 20 28  et))...(define (
3e80: 70 67 64 62 3a 67 65 74 2d 63 6f 75 6e 74 2d 64  pgdb:get-count-d
3e90: 61 74 61 2d 73 74 61 74 73 2d 74 61 72 67 65 74  ata-stats-target
3ea0: 2d 6c 61 74 65 73 74 20 64 62 68 20 74 74 79 70  -latest dbh ttyp
3eb0: 65 2d 69 64 20 74 61 72 67 65 74 2d 70 61 74 74  e-id target-patt
3ec0: 29 0a 20 20 28 64 62 69 3a 67 65 74 2d 72 6f 77  ).  (dbi:get-row
3ed0: 73 0a 20 20 20 64 62 68 0a 20 20 20 20 22 53 45  s.   dbh.    "SE
3ee0: 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 20 66  LECT count(*)  f
3ef0: 72 6f 6d 20 0a 20 20 20 20 20 20 20 20 20 20 28  rom .          (
3f00: 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20  SELECT DISTINCT 
3f10: 6f 6e 20 28 74 61 72 67 65 74 29 20 69 64 20 0a  on (target) id .
3f20: 09 09 66 72 6f 6d 20 72 75 6e 73 20 77 68 65 72  ..from runs wher
3f30: 65 20 74 61 72 67 65 74 20 6c 69 6b 65 20 3f 20  e target like ? 
3f40: 41 4e 44 20 74 74 79 70 65 5f 69 64 20 3d 20 3f  AND ttype_id = ?
3f50: 20 0a 09 09 6f 72 64 65 72 20 62 79 20 74 61 72   ...order by tar
3f60: 67 65 74 2c 20 65 76 65 6e 74 5f 74 69 6d 65 20  get, event_time 
3f70: 64 65 73 63 0a 20 20 20 20 20 20 20 20 20 20 29  desc.          )
3f80: 20 61 73 20 78 3b 22 20 0a 20 20 20 20 74 61 72   as x;" .    tar
3f90: 67 65 74 2d 70 61 74 74 20 74 74 79 70 65 2d 69  get-patt ttype-i
3fa0: 64 29 29 0a 0a 28 64 65 66 69 6e 65 20 20 28 70  d))..(define  (p
3fb0: 67 64 62 3a 67 65 74 2d 6c 61 74 65 73 74 2d 72  gdb:get-latest-r
3fc0: 75 6e 2d 63 6e 74 20 64 62 68 20 74 74 79 70 65  un-cnt dbh ttype
3fd0: 2d 69 64 20 74 61 72 67 65 74 2d 70 61 74 74 29  -id target-patt)
3fe0: 0a 20 20 28 6c 65 74 2a 20 28 28 63 6e 74 2d 72  .  (let* ((cnt-r
3ff0: 65 73 75 6c 74 20 28 70 67 64 62 3a 67 65 74 2d  esult (pgdb:get-
4000: 63 6f 75 6e 74 2d 64 61 74 61 2d 73 74 61 74 73  count-data-stats
4010: 2d 74 61 72 67 65 74 2d 6c 61 74 65 73 74 20 64  -target-latest d
4020: 62 68 20 74 74 79 70 65 2d 69 64 20 74 61 72 67  bh ttype-id targ
4030: 65 74 2d 70 61 74 74 29 29 0a 20 20 20 20 20 20  et-patt)).      
4040: 20 20 20 3b 28 63 6e 74 2d 72 6f 77 20 28 63 61     ;(cnt-row (ca
4050: 72 20 28 63 6e 74 2d 72 65 73 75 6c 74 29 29 29  r (cnt-result)))
4060: 0a 20 20 20 20 20 20 20 20 20 28 63 6e 74 20 30  .         (cnt 0
4070: 29 20 0a 20 20 20 20 20 20 20 29 0a 20 20 20 20  ) .       ).    
4080: 28 66 6f 72 2d 65 61 63 68 0a 20 20 20 20 20 28  (for-each.     (
4090: 6c 61 6d 62 64 61 20 28 72 6f 77 29 0a 20 20 20  lambda (row).   
40a0: 20 20 20 28 73 65 74 21 20 63 6e 74 20 20 28 76     (set! cnt  (v
40b0: 65 63 74 6f 72 2d 72 65 66 20 72 6f 77 20 30 20  ector-ref row 0 
40c0: 29 29 29 20 0a 20 20 20 20 20 63 6e 74 2d 72 65  ))) .     cnt-re
40d0: 73 75 6c 74 29 0a 0a 63 6e 74 29 29 0a 0a 28 64  sult)..cnt))..(d
40e0: 65 66 69 6e 65 20 28 70 67 64 62 3a 67 65 74 2d  efine (pgdb:get-
40f0: 63 6f 75 6e 74 2d 64 61 74 61 2d 73 74 61 74 73  count-data-stats
4100: 2d 6c 61 74 65 73 74 2d 70 61 74 74 65 72 6e 20  -latest-pattern 
4110: 64 62 68 20 70 61 74 74 29 0a 20 20 28 64 62 69  dbh patt).  (dbi
4120: 3a 67 65 74 2d 72 6f 77 73 0a 20 20 20 64 62 68  :get-rows.   dbh
4130: 0a 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75  .    "SELECT cou
4140: 6e 74 28 2a 29 20 20 66 72 6f 6d 20 0a 20 20 20  nt(*)  from .   
4150: 20 20 20 20 20 20 20 28 53 45 4c 45 43 54 20 44         (SELECT D
4160: 49 53 54 49 4e 43 54 20 6f 6e 20 28 74 61 72 67  ISTINCT on (targ
4170: 65 74 29 20 69 64 20 0a 09 09 66 72 6f 6d 20 72  et) id ...from r
4180: 75 6e 73 20 77 68 65 72 65 20 74 61 72 67 65 74  uns where target
4190: 20 69 6c 69 6b 65 20 3f 20 20 0a 09 09 6f 72 64   ilike ?  ...ord
41a0: 65 72 20 62 79 20 74 61 72 67 65 74 2c 20 65 76  er by target, ev
41b0: 65 6e 74 5f 74 69 6d 65 20 64 65 73 63 0a 20 20  ent_time desc.  
41c0: 20 20 20 20 20 20 20 20 29 20 61 73 20 78 3b 22          ) as x;"
41d0: 20 0a 20 20 20 20 70 61 74 74 29 29 0a 0a 28 64   .    patt))..(d
41e0: 65 66 69 6e 65 20 20 28 70 67 64 62 3a 67 65 74  efine  (pgdb:get
41f0: 2d 6c 61 74 65 73 74 2d 72 75 6e 2d 63 6e 74 2d  -latest-run-cnt-
4200: 62 79 2d 70 61 74 74 65 72 6e 20 64 62 68 20 74  by-pattern dbh t
4210: 61 72 67 65 74 2d 70 61 74 74 29 0a 20 20 28 6c  arget-patt).  (l
4220: 65 74 2a 20 28 28 63 6e 74 2d 72 65 73 75 6c 74  et* ((cnt-result
4230: 20 28 70 67 64 62 3a 67 65 74 2d 63 6f 75 6e 74   (pgdb:get-count
4240: 2d 64 61 74 61 2d 73 74 61 74 73 2d 6c 61 74 65  -data-stats-late
4250: 73 74 2d 70 61 74 74 65 72 6e 20 64 62 68 20 74  st-pattern dbh t
4260: 61 72 67 65 74 2d 70 61 74 74 29 29 0a 20 20 20  arget-patt)).   
4270: 20 20 20 20 20 20 3b 28 63 6e 74 2d 72 6f 77 20        ;(cnt-row 
4280: 28 63 61 72 20 28 63 6e 74 2d 72 65 73 75 6c 74  (car (cnt-result
4290: 29 29 29 0a 20 20 20 20 20 20 20 20 20 28 63 6e  ))).         (cn
42a0: 74 20 30 29 20 0a 20 20 20 20 20 20 20 29 0a 20  t 0) .       ). 
42b0: 20 20 20 28 66 6f 72 2d 65 61 63 68 0a 20 20 20     (for-each.   
42c0: 20 20 28 6c 61 6d 62 64 61 20 28 72 6f 77 29 0a    (lambda (row).
42d0: 20 20 20 20 20 20 28 73 65 74 21 20 63 6e 74 20        (set! cnt 
42e0: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 72 6f 77   (vector-ref row
42f0: 20 30 20 29 29 29 20 0a 20 20 20 20 20 63 6e 74   0 ))) .     cnt
4300: 2d 72 65 73 75 6c 74 29 0a 0a 63 6e 74 29 29 0a  -result)..cnt)).
4310: 0a 0a 0a 0a 0a 28 64 65 66 69 6e 65 20 28 70 67  .....(define (pg
4320: 64 62 3a 67 65 74 2d 72 75 6e 2d 73 74 61 74 73  db:get-run-stats
4330: 2d 68 69 73 74 6f 72 79 2d 67 69 76 65 6e 2d 74  -history-given-t
4340: 61 72 67 65 74 20 64 62 68 20 74 74 79 70 65 2d  arget dbh ttype-
4350: 69 64 20 74 61 72 67 65 74 2d 70 61 74 74 29 0a  id target-patt).
4360: 20 20 28 64 62 69 3a 67 65 74 2d 72 6f 77 73 0a    (dbi:get-rows.
4370: 20 20 20 64 62 68 0a 20 20 20 3b 3b 20 20 20 20     dbh.   ;;    
4380: 22 53 45 4c 45 43 54 20 43 4f 55 4e 54 28 74 2e  "SELECT COUNT(t.
4390: 69 64 29 2c 74 2e 73 74 61 74 75 73 2c 72 2e 74  id),t.status,r.t
43a0: 61 72 67 65 74 20 46 52 4f 4d 20 74 65 73 74 73  arget FROM tests
43b0: 20 41 53 20 74 20 49 4e 4e 45 52 20 4a 4f 49 4e   AS t INNER JOIN
43c0: 20 72 75 6e 73 20 41 53 20 72 20 4f 4e 20 74 2e   runs AS r ON t.
43d0: 72 75 6e 5f 69 64 3d 72 2e 69 64 0a 20 20 20 3b  run_id=r.id.   ;
43e0: 3b 20 20 20 20 20 20 20 20 20 57 48 45 52 45 20  ;         WHERE 
43f0: 74 2e 73 74 61 74 65 3d 27 43 4f 4d 50 4c 45 54  t.state='COMPLET
4400: 45 44 27 20 41 4e 44 20 74 74 79 70 65 5f 69 64  ED' AND ttype_id
4410: 3d 3f 20 41 4e 44 20 72 2e 74 61 72 67 65 74 20  =? AND r.target 
4420: 4c 49 4b 45 20 3f 20 47 52 4f 55 50 20 42 59 20  LIKE ? GROUP BY 
4430: 72 2e 74 61 72 67 65 74 2c 74 2e 73 74 61 74 75  r.target,t.statu
4440: 73 3b 22 0a 20 20 20 22 53 45 4c 45 43 54 20 72  s;".   "SELECT r
4450: 2e 72 75 6e 5f 6e 61 6d 65 2c 43 4f 55 4e 54 28  .run_name,COUNT(
4460: 2a 29 20 41 53 20 74 6f 74 61 6c 2c 0a 20 20 20  *) AS total,.   
4470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4480: 20 53 55 4d 28 43 41 53 45 20 57 48 45 4e 20 74   SUM(CASE WHEN t
4490: 2e 73 74 61 74 75 73 3d 27 50 41 53 53 27 20 54  .status='PASS' T
44a0: 48 45 4e 20 31 20 45 4c 53 45 20 30 20 45 4e 44  HEN 1 ELSE 0 END
44b0: 29 20 41 53 20 70 61 73 73 2c 0a 20 20 20 20 20  ) AS pass,.     
44c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
44d0: 55 4d 28 43 41 53 45 20 57 48 45 4e 20 74 2e 73  UM(CASE WHEN t.s
44e0: 74 61 74 75 73 3d 27 46 41 49 4c 27 20 54 48 45  tatus='FAIL' THE
44f0: 4e 20 31 20 45 4c 53 45 20 30 20 45 4e 44 29 20  N 1 ELSE 0 END) 
4500: 41 53 20 66 61 69 6c 2c 0a 20 20 20 20 20 20 20  AS fail,.       
4510: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 55 4d               SUM
4520: 28 43 41 53 45 20 57 48 45 4e 20 74 2e 73 74 61  (CASE WHEN t.sta
4530: 74 75 73 20 49 4e 20 28 27 50 41 53 53 27 2c 27  tus IN ('PASS','
4540: 46 41 49 4c 27 29 20 54 48 45 4e 20 30 20 45 4c  FAIL') THEN 0 EL
4550: 53 45 20 31 20 45 4e 44 29 20 41 53 20 6f 74 68  SE 1 END) AS oth
4560: 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 46  er.            F
4570: 52 4f 4d 20 74 65 73 74 73 20 41 53 20 74 20 49  ROM tests AS t I
4580: 4e 4e 45 52 20 4a 4f 49 4e 20 72 75 6e 73 20 41  NNER JOIN runs A
4590: 53 20 72 20 4f 4e 20 74 2e 72 75 6e 5f 69 64 3d  S r ON t.run_id=
45a0: 72 2e 69 64 0a 20 20 20 20 20 20 20 20 20 20 20  r.id.           
45b0: 20 57 48 45 52 45 20 74 2e 73 74 61 74 65 20 6c   WHERE t.state l
45c0: 69 6b 65 20 27 25 27 20 20 41 4e 44 20 74 74 79  ike '%'  AND tty
45d0: 70 65 5f 69 64 3d 3f 20 41 4e 44 20 72 2e 74 61  pe_id=? AND r.ta
45e0: 72 67 65 74 20 4c 49 4b 45 20 3f 20 0a 20 20 20  rget LIKE ? .   
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 47 52                GR
4600: 4f 55 50 20 42 59 20 72 2e 72 75 6e 5f 6e 61 6d  OUP BY r.run_nam
4610: 65 3b 22 0a 20 20 20 74 74 79 70 65 2d 69 64 20  e;".   ttype-id 
4620: 74 61 72 67 65 74 2d 70 61 74 74 20 29 29 0a 0a  target-patt ))..
4630: 28 64 65 66 69 6e 65 20 28 70 67 64 62 3a 67 65  (define (pgdb:ge
4640: 74 2d 61 6c 6c 2d 72 75 6e 2d 73 74 61 74 73 2d  t-all-run-stats-
4650: 74 61 72 67 65 74 2d 73 6c 69 63 65 20 64 62 68  target-slice dbh
4660: 20 74 61 72 67 65 74 2d 70 61 74 74 20 6c 69 6d   target-patt lim
4670: 69 74 20 6f 66 66 73 65 74 29 0a 20 20 20 20 28  it offset).    (
4680: 64 62 69 3a 67 65 74 2d 72 6f 77 73 0a 20 20 20  dbi:get-rows.   
4690: 20 64 62 68 0a 20 20 20 20 22 53 45 4c 45 43 54   dbh.    "SELECT
46a0: 20 20 72 2e 74 61 72 67 65 74 2c 20 72 2e 72 75    r.target, r.ru
46b0: 6e 5f 6e 61 6d 65 2c 72 2e 65 76 65 6e 74 5f 74  n_name,r.event_t
46c0: 69 6d 65 2c 20 43 4f 55 4e 54 28 2a 29 20 41 53  ime, COUNT(*) AS
46d0: 20 74 6f 74 61 6c 2c 0a 20 20 20 20 20 20 20 20   total,.        
46e0: 20 20 20 20 20 20 20 20 20 20 20 20 53 55 4d 28              SUM(
46f0: 43 41 53 45 20 57 48 45 4e 20 74 2e 73 74 61 74  CASE WHEN t.stat
4700: 75 73 3d 27 50 41 53 53 27 20 54 48 45 4e 20 31  us='PASS' THEN 1
4710: 20 45 4c 53 45 20 30 20 45 4e 44 29 20 41 53 20   ELSE 0 END) AS 
4720: 70 61 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20  pass,.          
4730: 20 20 20 20 20 20 20 20 20 20 53 55 4d 28 43 41            SUM(CA
4740: 53 45 20 57 48 45 4e 20 74 2e 73 74 61 74 75 73  SE WHEN t.status
4750: 3d 27 46 41 49 4c 27 20 54 48 45 4e 20 31 20 45  ='FAIL' THEN 1 E
4760: 4c 53 45 20 30 20 45 4e 44 29 20 41 53 20 66 61  LSE 0 END) AS fa
4770: 69 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  il,.            
4780: 20 20 20 20 20 20 20 20 53 55 4d 28 43 41 53 45          SUM(CASE
4790: 20 57 48 45 4e 20 74 2e 73 74 61 74 75 73 20 49   WHEN t.status I
47a0: 4e 20 28 27 50 41 53 53 27 2c 27 46 41 49 4c 27  N ('PASS','FAIL'
47b0: 29 20 54 48 45 4e 20 30 20 45 4c 53 45 20 31 20  ) THEN 0 ELSE 1 
47c0: 45 4e 44 29 20 41 53 20 6f 74 68 65 72 0a 20 20  END) AS other.  
47d0: 20 20 20 20 20 20 20 20 20 20 46 52 4f 4d 20 74            FROM t
47e0: 65 73 74 73 20 41 53 20 74 20 49 4e 4e 45 52 20  ests AS t INNER 
47f0: 4a 4f 49 4e 20 72 75 6e 73 20 41 53 20 72 20 4f  JOIN runs AS r O
4800: 4e 20 74 2e 72 75 6e 5f 69 64 3d 72 2e 69 64 0a  N t.run_id=r.id.
4810: 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52              WHER
4820: 45 20 72 2e 74 61 72 67 65 74 20 4c 49 4b 45 20  E r.target LIKE 
4830: 3f 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 47  ? .            G
4840: 52 4f 55 50 20 42 59 20 72 2e 74 61 72 67 65 74  ROUP BY r.target
4850: 2c 72 2e 72 75 6e 5f 6e 61 6d 65 2c 20 72 2e 65  ,r.run_name, r.e
4860: 76 65 6e 74 5f 74 69 6d 65 0a 20 20 20 20 20 20  vent_time.      
4870: 20 20 20 20 20 20 20 6f 72 64 65 72 20 62 79 20         order by 
4880: 72 2e 74 61 72 67 65 74 2c 72 2e 65 76 65 6e 74  r.target,r.event
4890: 5f 74 69 6d 65 20 64 65 73 63 20 6c 69 6d 69 74  _time desc limit
48a0: 20 20 3f 20 6f 66 66 73 65 74 20 3f 20 20 20 3b    ? offset ?   ;
48b0: 22 0a 20 20 20 20 74 61 72 67 65 74 2d 70 61 74  ".    target-pat
48c0: 74 20 6c 69 6d 69 74 20 6f 66 66 73 65 74 29 29  t limit offset))
48d0: 0a 20 20 20 20 20 0a 0a 28 64 65 66 69 6e 65 20  .     ..(define 
48e0: 28 70 67 64 62 3a 67 65 74 2d 63 6f 75 6e 74 2d  (pgdb:get-count-
48f0: 64 61 74 61 2d 73 74 61 74 73 2d 74 61 72 67 65  data-stats-targe
4900: 74 2d 73 6c 69 63 65 20 64 62 68 20 74 61 72 67  t-slice dbh targ
4910: 65 74 2d 70 61 74 74 29 0a 20 20 28 64 62 69 3a  et-patt).  (dbi:
4920: 67 65 74 2d 72 6f 77 73 0a 20 20 20 64 62 68 0a  get-rows.   dbh.
4930: 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e      "SELECT coun
4940: 74 28 2a 29 20 20 66 72 6f 6d 20 28 53 45 4c 45  t(*)  from (SELE
4950: 43 54 20 20 72 2e 74 61 72 67 65 74 2c 20 72 2e  CT  r.target, r.
4960: 72 75 6e 5f 6e 61 6d 65 2c 72 2e 65 76 65 6e 74  run_name,r.event
4970: 5f 74 69 6d 65 2c 20 43 4f 55 4e 54 28 2a 29 20  _time, COUNT(*) 
4980: 41 53 20 74 6f 74 61 6c 0a 20 20 20 20 20 20 20  AS total.       
4990: 20 20 20 20 20 46 52 4f 4d 20 74 65 73 74 73 20       FROM tests 
49a0: 41 53 20 74 20 49 4e 4e 45 52 20 4a 4f 49 4e 20  AS t INNER JOIN 
49b0: 72 75 6e 73 20 41 53 20 72 20 4f 4e 20 74 2e 72  runs AS r ON t.r
49c0: 75 6e 5f 69 64 3d 72 2e 69 64 0a 20 20 20 20 20  un_id=r.id.     
49d0: 20 20 20 20 20 20 20 57 48 45 52 45 20 72 2e 74         WHERE r.t
49e0: 61 72 67 65 74 20 4c 49 4b 45 20 3f 0a 20 20 20  arget LIKE ?.   
49f0: 20 20 20 20 20 20 20 20 20 47 52 4f 55 50 20 42           GROUP B
4a00: 59 20 72 2e 74 61 72 67 65 74 2c 72 2e 72 75 6e  Y r.target,r.run
4a10: 5f 6e 61 6d 65 2c 20 72 2e 65 76 65 6e 74 5f 74  _name, r.event_t
4a20: 69 6d 65 20 0a 20 20 20 20 20 20 20 20 20 20 29  ime .          )
4a30: 20 61 73 20 78 3b 22 20 0a 20 20 20 20 74 61 72   as x;" .    tar
4a40: 67 65 74 2d 70 61 74 74 29 29 0a 0a 28 64 65 66  get-patt))..(def
4a50: 69 6e 65 20 20 28 70 67 64 62 3a 67 65 74 2d 73  ine  (pgdb:get-s
4a60: 6c 69 63 65 2d 63 6e 74 20 64 62 68 20 74 61 72  lice-cnt dbh tar
4a70: 67 65 74 2d 70 61 74 74 29 0a 20 20 28 6c 65 74  get-patt).  (let
4a80: 2a 20 28 28 63 6e 74 2d 72 65 73 75 6c 74 20 28  * ((cnt-result (
4a90: 70 67 64 62 3a 67 65 74 2d 63 6f 75 6e 74 2d 64  pgdb:get-count-d
4aa0: 61 74 61 2d 73 74 61 74 73 2d 74 61 72 67 65 74  ata-stats-target
4ab0: 2d 73 6c 69 63 65 20 64 62 68 20 74 61 72 67 65  -slice dbh targe
4ac0: 74 2d 70 61 74 74 29 29 0a 20 20 20 20 20 20 20  t-patt)).       
4ad0: 20 20 3b 28 63 6e 74 2d 72 6f 77 20 28 63 61 72    ;(cnt-row (car
4ae0: 20 28 63 6e 74 2d 72 65 73 75 6c 74 29 29 29 0a   (cnt-result))).
4af0: 20 20 20 20 20 20 20 20 20 28 63 6e 74 20 30 29           (cnt 0)
4b00: 20 0a 20 20 20 20 20 20 20 29 0a 20 20 20 20 28   .       ).    (
4b10: 66 6f 72 2d 65 61 63 68 0a 20 20 20 20 20 28 6c  for-each.     (l
4b20: 61 6d 62 64 61 20 28 72 6f 77 29 0a 20 20 20 20  ambda (row).    
4b30: 20 20 28 73 65 74 21 20 63 6e 74 20 20 28 76 65    (set! cnt  (ve
4b40: 63 74 6f 72 2d 72 65 66 20 72 6f 77 20 30 20 29  ctor-ref row 0 )
4b50: 29 29 20 0a 20 20 20 20 20 63 6e 74 2d 72 65 73  )) .     cnt-res
4b60: 75 6c 74 29 0a 0a 63 6e 74 29 29 0a 20 20 20 0a  ult)..cnt)).   .
4b70: 0a 28 64 65 66 69 6e 65 20 28 70 67 64 62 3a 67  .(define (pgdb:g
4b80: 65 74 2d 74 61 72 67 65 74 2d 74 79 70 65 73 20  et-target-types 
4b90: 64 62 68 29 0a 20 20 28 64 62 69 3a 67 65 74 2d  dbh).  (dbi:get-
4ba0: 72 6f 77 73 20 64 62 68 20 22 53 45 4c 45 43 54  rows dbh "SELECT
4bb0: 20 69 64 2c 74 61 72 67 65 74 5f 73 70 65 63 20   id,target_spec 
4bc0: 46 52 4f 4d 20 74 74 79 70 65 3b 22 29 29 0a 20  FROM ttype;")). 
4bd0: 0a 20 28 64 65 66 69 6e 65 20 28 70 67 64 62 3a  . (define (pgdb:
4be0: 67 65 74 2d 64 69 73 74 69 63 74 2d 74 61 72 67  get-distict-targ
4bf0: 65 74 2d 73 6c 69 63 65 20 64 62 68 29 0a 20 20  et-slice dbh).  
4c00: 28 64 62 69 3a 67 65 74 2d 72 6f 77 73 20 64 62  (dbi:get-rows db
4c10: 68 20 22 20 73 65 6c 65 63 74 20 64 69 73 74 69  h " select disti
4c20: 6e 63 74 20 6f 6e 20 28 73 70 6c 69 74 5f 70 61  nct on (split_pa
4c30: 72 74 20 28 74 61 72 67 65 74 2c 20 27 2f 27 2c  rt (target, '/',
4c40: 20 31 29 29 20 28 73 70 6c 69 74 5f 70 61 72 74   1)) (split_part
4c50: 20 28 74 61 72 67 65 74 2c 20 27 2f 27 2c 20 31   (target, '/', 1
4c60: 29 29 20 66 72 6f 6d 20 72 75 6e 73 3b 22 29 29  )) from runs;"))
4c70: 0a 0a 20 20 28 64 65 66 69 6e 65 20 28 70 67 64  ..  (define (pgd
4c80: 62 3a 67 65 74 2d 64 69 73 74 69 63 74 2d 74 61  b:get-distict-ta
4c90: 72 67 65 74 2d 73 6c 69 63 65 33 20 64 62 68 29  rget-slice3 dbh)
4ca0: 0a 20 20 28 64 62 69 3a 67 65 74 2d 72 6f 77 73  .  (dbi:get-rows
4cb0: 20 64 62 68 20 22 20 73 65 6c 65 63 74 20 64 69   dbh " select di
4cc0: 73 74 69 6e 63 74 20 6f 6e 20 28 73 70 6c 69 74  stinct on (split
4cd0: 5f 70 61 72 74 20 28 74 61 72 67 65 74 2c 20 27  _part (target, '
4ce0: 2f 27 2c 20 33 29 29 20 28 73 70 6c 69 74 5f 70  /', 3)) (split_p
4cf0: 61 72 74 20 28 74 61 72 67 65 74 2c 20 27 2f 27  art (target, '/'
4d00: 2c 20 33 29 29 20 66 72 6f 6d 20 72 75 6e 73 3b  , 3)) from runs;
4d10: 22 29 29 0a 3b 3b 20 0a 28 64 65 66 69 6e 65 20  ")).;; .(define 
4d20: 28 70 67 64 62 3a 67 65 74 2d 74 61 72 67 65 74  (pgdb:get-target
4d30: 73 20 64 62 68 20 74 61 72 67 65 74 2d 70 61 74  s dbh target-pat
4d40: 74 29 0a 20 20 28 6c 65 74 20 28 28 74 74 79 70  t).  (let ((ttyp
4d50: 65 73 20 28 70 67 64 62 3a 67 65 74 2d 74 61 72  es (pgdb:get-tar
4d60: 67 65 74 2d 74 79 70 65 73 20 64 62 68 29 29 29  get-types dbh)))
4d70: 0a 20 20 20 20 28 6d 61 70 0a 20 20 20 20 20 28  .    (map.     (
4d80: 6c 61 6d 62 64 61 20 28 74 74 79 70 65 2d 64 61  lambda (ttype-da
4d90: 74 29 0a 20 20 20 20 20 20 20 28 6c 65 74 20 28  t).       (let (
4da0: 28 74 74 2d 69 64 20 28 76 65 63 74 6f 72 2d 72  (tt-id (vector-r
4db0: 65 66 20 74 74 79 70 65 2d 64 61 74 20 30 29 29  ef ttype-dat 0))
4dc0: 0a 09 20 20 20 20 20 28 74 74 79 70 65 20 28 76  ..     (ttype (v
4dd0: 65 63 74 6f 72 2d 72 65 66 20 74 74 79 70 65 2d  ector-ref ttype-
4de0: 64 61 74 20 31 29 29 29 0a 09 20 28 63 6f 6e 73  dat 1))).. (cons
4df0: 20 74 74 79 70 65 0a 09 20 20 20 20 20 20 20 28   ttype..       (
4e00: 64 62 69 3a 67 65 74 2d 72 6f 77 73 20 0a 09 09  dbi:get-rows ...
4e10: 64 62 68 0a 09 09 22 53 45 4c 45 43 54 20 44 49  dbh..."SELECT DI
4e20: 53 54 49 4e 43 54 20 74 61 72 67 65 74 20 46 52  STINCT target FR
4e30: 4f 4d 20 72 75 6e 73 20 57 48 45 52 45 20 74 61  OM runs WHERE ta
4e40: 72 67 65 74 20 4c 49 4b 45 20 3f 20 41 4e 44 20  rget LIKE ? AND 
4e50: 74 74 79 70 65 5f 69 64 3d 3f 3b 22 20 74 61 72  ttype_id=?;" tar
4e60: 67 65 74 2d 70 61 74 74 20 74 74 2d 69 64 29 29  get-patt tt-id))
4e70: 0a 09 20 29 29 0a 20 20 20 20 20 74 74 79 70 65  .. )).     ttype
4e80: 73 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 70  s)))..(define (p
4e90: 67 64 62 3a 67 65 74 2d 74 61 72 67 65 74 73 2d  gdb:get-targets-
4ea0: 6f 66 2d 74 79 70 65 20 64 62 68 20 74 74 79 70  of-type dbh ttyp
4eb0: 65 2d 69 64 20 74 61 72 67 65 74 2d 70 61 74 74  e-id target-patt
4ec0: 29 0a 20 20 28 64 62 69 3a 67 65 74 2d 72 6f 77  ).  (dbi:get-row
4ed0: 73 20 64 62 68 20 22 53 45 4c 45 43 54 20 44 49  s dbh "SELECT DI
4ee0: 53 54 49 4e 43 54 20 74 61 72 67 65 74 20 46 52  STINCT target FR
4ef0: 4f 4d 20 72 75 6e 73 20 57 48 45 52 45 20 74 61  OM runs WHERE ta
4f00: 72 67 65 74 20 4c 49 4b 45 20 3f 20 41 4e 44 20  rget LIKE ? AND 
4f10: 74 74 79 70 65 5f 69 64 3d 3f 3b 22 20 74 61 72  ttype_id=?;" tar
4f20: 67 65 74 2d 70 61 74 74 20 74 74 79 70 65 2d 69  get-patt ttype-i
4f30: 64 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 70 67  d))..(define (pg
4f40: 64 62 3a 67 65 74 2d 72 75 6e 73 2d 62 79 2d 74  db:get-runs-by-t
4f50: 61 72 67 65 74 20 64 62 68 20 74 61 72 67 65 74  arget dbh target
4f60: 73 20 72 75 6e 2d 70 61 74 74 29 0a 20 20 20 28  s run-patt).   (
4f70: 64 62 69 3a 67 65 74 2d 72 6f 77 73 20 64 62 68  dbi:get-rows dbh
4f80: 20 22 53 45 4c 45 43 54 20 72 2e 72 75 6e 5f 6e   "SELECT r.run_n
4f90: 61 6d 65 2c 20 74 2e 74 65 73 74 5f 6e 61 6d 65  ame, t.test_name
4fa0: 2c 20 74 2e 73 74 61 74 75 73 2c 20 74 2e 69 74  , t.status, t.it
4fb0: 65 6d 5f 70 61 74 68 2c 20 74 2e 69 64 2c 20 74  em_path, t.id, t
4fc0: 2e 72 75 6e 64 69 72 2c 20 74 2e 66 69 6e 61 6c  .rundir, t.final
4fd0: 5f 6c 6f 67 66 20 46 52 4f 4d 20 72 75 6e 73 20  _logf FROM runs 
4fe0: 61 73 20 72 20 49 4e 4e 45 52 20 4a 4f 49 4e 20  as r INNER JOIN 
4ff0: 74 65 73 74 73 20 41 53 20 74 20 4f 4e 20 74 2e  tests AS t ON t.
5000: 72 75 6e 5f 69 64 3d 72 2e 69 64 20 20 0a 20 20  run_id=r.id  .  
5010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5020: 20 20 20 20 20 20 20 20 57 48 45 52 45 20 74 2e          WHERE t.
5030: 73 74 61 74 65 3d 27 43 4f 4d 50 4c 45 54 45 44  state='COMPLETED
5040: 27 20 41 4e 44 20 72 2e 74 61 72 67 65 74 20 6c  ' AND r.target l
5050: 69 6b 65 20 3f 20 41 4e 44 20 20 72 2e 72 75 6e  ike ? AND  r.run
5060: 5f 6e 61 6d 65 20 6c 69 6b 65 20 3f 3b 22 20 74  _name like ?;" t
5070: 61 72 67 65 74 73 20 72 75 6e 2d 70 61 74 74 29  argets run-patt)
5080: 0a 29 0a 0a 28 64 65 66 69 6e 65 20 28 70 67 64  .)..(define (pgd
5090: 62 3a 67 65 74 2d 74 65 73 74 2d 62 79 2d 69 64  b:get-test-by-id
50a0: 20 64 62 68 20 69 64 29 0a 20 20 28 64 62 69 3a   dbh id).  (dbi:
50b0: 67 65 74 2d 72 6f 77 73 20 64 62 68 20 22 53 45  get-rows dbh "SE
50c0: 4c 45 43 54 20 74 2e 74 65 73 74 5f 6e 61 6d 65  LECT t.test_name
50d0: 2c 20 74 2e 69 74 65 6d 5f 70 61 74 68 2c 20 74  , t.item_path, t
50e0: 2e 72 75 6e 64 69 72 2c 20 74 2e 66 69 6e 61 6c  .rundir, t.final
50f0: 5f 6c 6f 67 66 20 46 52 4f 4d 20 72 75 6e 73 20  _logf FROM runs 
5100: 61 73 20 72 20 49 4e 4e 45 52 20 4a 4f 49 4e 20  as r INNER JOIN 
5110: 74 65 73 74 73 20 41 53 20 74 20 4f 4e 20 74 2e  tests AS t ON t.
5120: 72 75 6e 5f 69 64 3d 72 2e 69 64 20 20 0a 20 20  run_id=r.id  .  
5130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5140: 20 20 20 20 20 20 20 20 57 48 45 52 45 20 74 2e          WHERE t.
5150: 69 64 20 3d 20 3f 3b 22 20 69 64 29 0a 29 0a 0a  id = ?;" id).)..
5160: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
5170: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5180: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5190: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
51a0: 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 20 56 20 41  ========.;;  V A
51b0: 20 52 20 49 20 4f 20 55 20 53 20 20 20 44 20 41   R I O U S   D A
51c0: 20 54 20 41 20 20 20 4d 20 41 20 53 20 53 20 41   T A   M A S S A
51d0: 20 47 20 45 20 20 20 52 20 4f 20 55 20 54 20 49   G E   R O U T I
51e0: 20 4e 20 45 20 53 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d   N E S.;;=======
51f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5200: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5210: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5220: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a  ===============.
5230: 0a 3b 3b 20 70 72 6f 62 61 62 6c 79 20 77 61 6e  .;; probably wan
5240: 74 20 74 6f 20 6d 6f 76 65 20 74 68 65 73 65 20  t to move these 
5250: 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 6d  to a different m
5260: 6f 64 65 6c 20 66 69 6c 65 0a 0a 3b 3b 20 63 72  odel file..;; cr
5270: 65 61 74 65 20 61 20 68 61 73 68 20 6f 66 20 68  eate a hash of h
5280: 61 73 68 65 73 20 77 69 74 68 20 6b 65 79 73 20  ashes with keys 
5290: 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20 61  extracted from a
52a0: 6c 6c 2d 70 61 72 74 73 0a 3b 3b 20 75 73 69 6e  ll-parts.;; usin
52b0: 67 20 72 6f 77 2d 6f 72 2d 63 6f 6c 20 74 6f 20  g row-or-col to 
52c0: 63 68 6f 6f 73 65 20 72 6f 77 20 6f 72 20 63 6f  choose row or co
52d0: 6c 75 6d 6e 0a 3b 3b 20 20 20 68 74 7b 72 6f 77  lumn.;;   ht{row
52e0: 20 6b 65 79 7d 3d 3e 68 74 7b 63 6f 6c 20 6b 65   key}=>ht{col ke
52f0: 79 7d 3d 3e 64 61 74 61 0a 3b 3b 0a 3b 3b 20 66  y}=>data.;;.;; f
5300: 6e 75 6d 20 69 73 20 74 68 65 20 66 69 65 6c 64  num is the field
5310: 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 74   number in the t
5320: 75 70 6c 65 73 20 74 6f 20 62 65 20 73 70 6c 69  uples to be spli
5330: 74 0a 3b 3b 0a 0a 28 64 65 66 69 6e 65 20 28 70  t.;;..(define (p
5340: 67 64 62 3a 6d 6b 2d 70 61 74 74 65 72 6e 20 20  gdb:mk-pattern  
5350: 64 6f 74 20 74 79 70 65 20 62 70 20 72 65 6c 29  dot type bp rel)
5360: 0a 20 20 28 6c 65 74 2a 20 28 28 74 79 70 20 28  .  (let* ((typ (
5370: 69 66 20 28 65 71 75 61 6c 3f 20 74 79 70 65 20  if (equal? type 
5380: 22 61 6c 6c 22 29 0a 20 20 20 20 20 20 20 20 20  "all").         
5390: 20 20 20 20 20 20 22 25 22 0a 20 20 20 20 20 20        "%".      
53a0: 20 20 20 20 20 20 20 20 20 20 74 79 70 65 29 29            type))
53b0: 0a 20 20 20 20 20 20 20 20 28 64 6f 74 70 72 6f  .        (dotpro
53c0: 63 65 73 73 20 28 69 66 20 28 65 71 75 61 6c 3f  cess (if (equal?
53d0: 20 64 6f 74 20 22 61 6c 6c 22 29 0a 20 20 20 20   dot "all").    
53e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53f0: 20 20 22 25 22 0a 20 20 20 20 20 20 20 20 20 20    "%".          
5400: 20 20 20 20 20 20 20 20 20 20 20 64 6f 74 29 29             dot))
5410: 0a 20 20 20 20 20 20 20 20 28 72 65 6c 2d 6e 75  .        (rel-nu
5420: 6d 20 28 69 66 20 28 65 71 75 61 6c 3f 20 72 65  m (if (equal? re
5430: 6c 20 22 22 29 0a 20 20 20 20 20 20 20 20 20 20  l "").          
5440: 20 20 20 20 20 20 20 20 20 20 20 20 22 25 22 0a              "%".
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5460: 20 20 20 20 20 72 65 6c 29 29 0a 20 20 20 20 20       rel)).     
5470: 20 20 20 28 70 61 74 74 65 72 6e 20 20 28 63 6f     (pattern  (co
5480: 6e 63 20 22 25 2f 22 20 62 70 20 22 2f 22 20 64  nc "%/" bp "/" d
5490: 6f 74 70 72 6f 63 65 73 73 20 22 2f 22 20 74 79  otprocess "/" ty
54a0: 70 20 22 5f 22 20 72 65 6c 2d 6e 75 6d 29 29 29  p "_" rel-num)))
54b0: 0a 70 61 74 74 65 72 6e 29 29 0a 0a 28 64 65 66  .pattern))..(def
54c0: 69 6e 65 20 28 70 67 64 62 3a 63 6f 61 6c 65 73  ine (pgdb:coales
54d0: 63 65 2d 72 75 6e 73 20 64 62 68 20 72 75 6e 73  ce-runs dbh runs
54e0: 20 61 6c 6c 2d 70 61 72 74 73 20 72 6f 77 2d 6f   all-parts row-o
54f0: 72 2d 63 6f 6c 20 66 6e 75 6d 29 0a 20 20 28 6c  r-col fnum).  (l
5500: 65 74 2a 20 28 28 64 61 74 61 20 20 28 6d 61 6b  et* ((data  (mak
5510: 65 2d 68 61 73 68 2d 74 61 62 6c 65 29 29 29 0a  e-hash-table))).
5520: 20 20 20 20 0a 20 20 20 20 28 66 6f 72 2d 65 61      .    (for-ea
5530: 63 68 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20  ch.     (lambda 
5540: 28 72 75 6e 29 0a 20 20 20 20 20 20 20 28 6c 65  (run).       (le
5550: 74 2a 20 28 28 74 61 72 67 65 74 20 28 76 65 63  t* ((target (vec
5560: 74 6f 72 2d 72 65 66 20 72 75 6e 20 66 6e 75 6d  tor-ref run fnum
5570: 29 29 0a 09 20 20 20 20 20 20 28 70 61 72 74 73  ))..      (parts
5580: 20 20 28 73 74 72 69 6e 67 2d 73 70 6c 69 74 20    (string-split 
5590: 74 61 72 67 65 74 20 22 2f 22 29 29 0a 09 20 20  target "/"))..  
55a0: 20 20 20 20 28 66 69 72 73 74 20 20 28 63 61 72      (first  (car
55b0: 20 70 61 72 74 73 29 29 0a 09 20 20 20 20 20 20   parts))..      
55c0: 28 72 65 73 74 20 20 20 28 73 74 72 69 6e 67 2d  (rest   (string-
55d0: 69 6e 74 65 72 73 70 65 72 73 65 20 28 63 64 72  intersperse (cdr
55e0: 20 70 61 72 74 73 29 20 22 2f 22 29 29 0a 09 20   parts) "/")).. 
55f0: 20 20 20 20 20 28 63 6f 6c 64 61 74 20 28 68 61       (coldat (ha
5600: 73 68 2d 74 61 62 6c 65 2d 72 65 66 2f 64 65 66  sh-table-ref/def
5610: 61 75 6c 74 20 64 61 74 61 20 66 69 72 73 74 20  ault data first 
5620: 23 66 29 29 29 0a 09 20 28 69 66 20 28 6e 6f 74  #f))).. (if (not
5630: 20 63 6f 6c 64 61 74 29 28 6c 65 74 20 28 28 6e   coldat)(let ((n
5640: 65 77 68 74 20 28 6d 61 6b 65 2d 68 61 73 68 2d  ewht (make-hash-
5650: 74 61 62 6c 65 29 29 29 0a 09 09 09 20 20 20 28  table)))....   (
5660: 68 61 73 68 2d 74 61 62 6c 65 2d 73 65 74 21 20  hash-table-set! 
5670: 64 61 74 61 20 66 69 72 73 74 20 6e 65 77 68 74  data first newht
5680: 29 0a 09 09 09 20 20 20 28 73 65 74 21 20 63 6f  )....   (set! co
5690: 6c 64 61 74 20 6e 65 77 68 74 29 29 29 0a 09 20  ldat newht))).. 
56a0: 28 68 61 73 68 2d 74 61 62 6c 65 2d 73 65 74 21  (hash-table-set!
56b0: 20 63 6f 6c 64 61 74 20 72 65 73 74 20 72 75 6e   coldat rest run
56c0: 29 29 29 0a 20 20 20 20 20 72 75 6e 73 29 0a 20  ))).     runs). 
56d0: 20 20 20 64 61 74 61 29 29 0a 0a 0a 28 64 65 66     data))...(def
56e0: 69 6e 65 20 28 70 67 64 62 3a 63 6f 61 6c 65 73  ine (pgdb:coales
56f0: 63 65 2d 72 75 6e 73 31 20 72 75 6e 73 20 20 29  ce-runs1 runs  )
5700: 0a 20 20 28 6c 65 74 2a 20 28 28 64 61 74 61 20  .  (let* ((data 
5710: 20 28 6d 61 6b 65 2d 68 61 73 68 2d 74 61 62 6c   (make-hash-tabl
5720: 65 29 29 29 0a 20 20 20 20 0a 20 20 20 20 28 66  e))).    .    (f
5730: 6f 72 2d 65 61 63 68 0a 20 20 20 20 20 28 6c 61  or-each.     (la
5740: 6d 62 64 61 20 28 72 75 6e 29 0a 20 20 20 20 20  mbda (run).     
5750: 20 20 28 6c 65 74 2a 20 28 28 74 61 72 67 65 74    (let* ((target
5760: 20 28 76 65 63 74 6f 72 2d 72 65 66 20 72 75 6e   (vector-ref run
5770: 20 30 29 29 0a 09 20 20 20 20 20 20 28 70 61 72   0))..      (par
5780: 74 73 20 20 28 73 74 72 69 6e 67 2d 73 70 6c 69  ts  (string-spli
5790: 74 20 74 61 72 67 65 74 20 22 2f 22 29 29 0a 09  t target "/"))..
57a0: 20 20 20 20 20 20 28 66 69 72 73 74 20 20 28 63        (first  (c
57b0: 61 72 20 70 61 72 74 73 29 29 0a 09 20 20 20 20  ar parts))..    
57c0: 20 20 28 72 65 73 74 20 20 20 28 73 74 72 69 6e    (rest   (strin
57d0: 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 28 63  g-intersperse (c
57e0: 64 72 20 70 61 72 74 73 29 20 22 2f 22 29 29 0a  dr parts) "/")).
57f0: 09 20 20 20 20 20 20 28 63 6f 6c 64 61 74 20 28  .      (coldat (
5800: 68 61 73 68 2d 74 61 62 6c 65 2d 72 65 66 2f 64  hash-table-ref/d
5810: 65 66 61 75 6c 74 20 64 61 74 61 20 66 69 72 73  efault data firs
5820: 74 20 23 66 29 29 29 0a 09 20 28 69 66 20 28 6e  t #f))).. (if (n
5830: 6f 74 20 63 6f 6c 64 61 74 29 28 6c 65 74 20 28  ot coldat)(let (
5840: 28 6e 65 77 68 74 20 28 6d 61 6b 65 2d 68 61 73  (newht (make-has
5850: 68 2d 74 61 62 6c 65 29 29 29 0a 09 09 09 20 20  h-table)))....  
5860: 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 73 65 74   (hash-table-set
5870: 21 20 64 61 74 61 20 66 69 72 73 74 20 6e 65 77  ! data first new
5880: 68 74 29 0a 09 09 09 20 20 20 28 73 65 74 21 20  ht)....   (set! 
5890: 63 6f 6c 64 61 74 20 6e 65 77 68 74 29 29 29 0a  coldat newht))).
58a0: 09 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 73 65  . (hash-table-se
58b0: 74 21 20 63 6f 6c 64 61 74 20 72 65 73 74 20 72  t! coldat rest r
58c0: 75 6e 29 29 29 0a 20 20 20 20 20 72 75 6e 73 29  un))).     runs)
58d0: 0a 20 20 20 20 64 61 74 61 29 29 0a 0a 3b 3b 20  .    data))..;; 
58e0: 67 69 76 65 6e 20 6f 72 64 65 72 65 64 20 64 61  given ordered da
58f0: 74 61 20 68 61 73 68 20 72 65 74 75 72 6e 20 61  ta hash return a
5900: 2d 6b 65 79 73 0a 3b 3b 0a 28 64 65 66 69 6e 65  -keys.;;.(define
5910: 20 28 70 67 64 62 3a 6f 72 64 65 72 65 64 2d 64   (pgdb:ordered-d
5920: 61 74 61 2d 3e 61 2d 6b 65 79 73 20 6f 72 64 65  ata->a-keys orde
5930: 72 65 64 2d 64 61 74 61 29 0a 20 20 28 73 6f 72  red-data).  (sor
5940: 74 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 6b 65  t (hash-table-ke
5950: 79 73 20 6f 72 64 65 72 65 64 2d 64 61 74 61 29  ys ordered-data)
5960: 20 73 74 72 69 6e 67 3e 3d 3f 29 29 0a 0a 3b 3b   string>=?))..;;
5970: 20 67 69 76 65 6e 20 6f 72 64 65 72 65 64 20 64   given ordered d
5980: 61 74 61 20 68 61 73 68 20 72 65 74 75 72 6e 20  ata hash return 
5990: 62 2d 6b 65 79 73 0a 3b 3b 0a 28 64 65 66 69 6e  b-keys.;;.(defin
59a0: 65 20 28 70 67 64 62 3a 6f 72 64 65 72 65 64 2d  e (pgdb:ordered-
59b0: 64 61 74 61 2d 3e 62 2d 6b 65 79 73 20 6f 72 64  data->b-keys ord
59c0: 65 72 65 64 2d 64 61 74 61 20 61 2d 6b 65 79 73  ered-data a-keys
59d0: 29 0a 20 20 28 64 65 6c 65 74 65 2d 64 75 70 6c  ).  (delete-dupl
59e0: 69 63 61 74 65 73 0a 20 20 20 28 73 6f 72 74 20  icates.   (sort 
59f0: 28 61 70 70 6c 79 0a 09 20 20 61 70 70 65 6e 64  (apply..  append
5a00: 0a 09 20 20 28 6d 61 70 20 28 6c 61 6d 62 64 61  ..  (map (lambda
5a10: 20 28 73 75 62 2d 6b 65 79 29 0a 09 09 20 28 6c   (sub-key)... (l
5a20: 65 74 20 28 28 73 75 62 64 61 74 20 28 68 61 73  et ((subdat (has
5a30: 68 2d 74 61 62 6c 65 2d 72 65 66 20 6f 72 64 65  h-table-ref orde
5a40: 72 65 64 2d 64 61 74 61 20 73 75 62 2d 6b 65 79  red-data sub-key
5a50: 29 29 29 0a 09 09 20 20 20 28 68 61 73 68 2d 74  )))...   (hash-t
5a60: 61 62 6c 65 2d 6b 65 79 73 20 73 75 62 64 61 74  able-keys subdat
5a70: 29 29 29 0a 09 20 20 20 20 20 20 20 61 2d 6b 65  )))..       a-ke
5a80: 79 73 29 29 0a 09 20 73 74 72 69 6e 67 3e 3d 3f  ys)).. string>=?
5a90: 29 29 29 0a 0a 3b 3b 20 67 69 76 65 6e 20 6f 72  )))..;; given or
5aa0: 64 65 72 65 64 20 64 61 74 61 20 68 61 73 68 20  dered data hash 
5ab0: 72 65 74 75 72 6e 20 61 2d 6b 65 79 73 0a 3b 3b  return a-keys.;;
5ac0: 0a 28 64 65 66 69 6e 65 20 28 70 67 64 62 3a 6f  .(define (pgdb:o
5ad0: 72 64 65 72 65 64 2d 64 61 74 61 2d 3e 61 2d 6b  rdered-data->a-k
5ae0: 65 79 73 20 6f 72 64 65 72 65 64 2d 64 61 74 61  eys ordered-data
5af0: 29 0a 20 20 28 73 6f 72 74 20 28 68 61 73 68 2d  ).  (sort (hash-
5b00: 74 61 62 6c 65 2d 6b 65 79 73 20 6f 72 64 65 72  table-keys order
5b10: 65 64 2d 64 61 74 61 29 20 73 74 72 69 6e 67 3e  ed-data) string>
5b20: 3d 3f 29 29 0a 0a 3b 3b 20 67 69 76 65 6e 20 6f  =?))..;; given o
5b30: 72 64 65 72 65 64 20 64 61 74 61 20 68 61 73 68  rdered data hash
5b40: 20 72 65 74 75 72 6e 20 62 2d 6b 65 79 73 0a 3b   return b-keys.;
5b50: 3b 0a 28 64 65 66 69 6e 65 20 28 70 67 64 62 3a  ;.(define (pgdb:
5b60: 6f 72 64 65 72 65 64 2d 64 61 74 61 2d 3e 62 2d  ordered-data->b-
5b70: 6b 65 79 73 20 6f 72 64 65 72 65 64 2d 64 61 74  keys ordered-dat
5b80: 61 20 61 2d 6b 65 79 73 29 0a 20 20 28 64 65 6c  a a-keys).  (del
5b90: 65 74 65 2d 64 75 70 6c 69 63 61 74 65 73 0a 20  ete-duplicates. 
5ba0: 20 20 28 73 6f 72 74 20 28 61 70 70 6c 79 0a 09    (sort (apply..
5bb0: 20 20 61 70 70 65 6e 64 0a 09 20 20 28 6d 61 70    append..  (map
5bc0: 20 28 6c 61 6d 62 64 61 20 28 73 75 62 2d 6b 65   (lambda (sub-ke
5bd0: 79 29 0a 09 09 20 28 6c 65 74 20 28 28 73 75 62  y)... (let ((sub
5be0: 64 61 74 20 28 68 61 73 68 2d 74 61 62 6c 65 2d  dat (hash-table-
5bf0: 72 65 66 20 6f 72 64 65 72 65 64 2d 64 61 74 61  ref ordered-data
5c00: 20 73 75 62 2d 6b 65 79 29 29 29 0a 09 09 20 20   sub-key)))...  
5c10: 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 6b 65 79   (hash-table-key
5c20: 73 20 73 75 62 64 61 74 29 29 29 0a 09 20 20 20  s subdat)))..   
5c30: 20 20 20 20 61 2d 6b 65 79 73 29 29 0a 09 20 73      a-keys)).. s
5c40: 74 72 69 6e 67 3e 3d 3f 29 29 29 0a 0a 28 64 65  tring>=?)))..(de
5c50: 66 69 6e 65 20 28 70 67 64 62 3a 63 6f 61 6c 65  fine (pgdb:coale
5c60: 73 63 65 2d 72 75 6e 73 2d 62 79 2d 73 6c 69 63  sce-runs-by-slic
5c70: 65 20 72 75 6e 73 20 73 6c 69 63 65 29 0a 20 20  e runs slice).  
5c80: 28 6c 65 74 2a 20 28 28 64 61 74 61 20 20 28 6d  (let* ((data  (m
5c90: 61 6b 65 2d 68 61 73 68 2d 74 61 62 6c 65 29 29  ake-hash-table))
5ca0: 29 0a 20 20 20 20 20 20 28 66 6f 72 2d 65 61 63  ).      (for-eac
5cb0: 68 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28  h.     (lambda (
5cc0: 72 75 6e 29 0a 20 20 20 20 20 20 20 28 6c 65 74  run).       (let
5cd0: 2a 20 28 28 74 61 72 67 65 74 20 28 76 65 63 74  * ((target (vect
5ce0: 6f 72 2d 72 65 66 20 72 75 6e 20 30 29 29 0a 20  or-ref run 0)). 
5cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 72 75               (ru
5d00: 6e 2d 6e 61 6d 65 20 28 76 65 63 74 6f 72 2d 72  n-name (vector-r
5d10: 65 66 20 72 75 6e 20 31 29 29 20 20 20 20 0a 09  ef run 1))    ..
5d20: 20 20 20 20 20 20 28 70 61 72 74 73 20 20 28 73        (parts  (s
5d30: 74 72 69 6e 67 2d 73 70 6c 69 74 20 74 61 72 67  tring-split targ
5d40: 65 74 20 22 2f 22 29 29 0a 09 20 20 20 20 20 20  et "/"))..      
5d50: 28 66 69 72 73 74 20 20 28 63 61 72 20 70 61 72  (first  (car par
5d60: 74 73 29 29 0a 09 20 20 20 20 20 20 28 72 65 73  ts))..      (res
5d70: 74 20 20 20 28 73 74 72 69 6e 67 2d 69 6e 74 65  t   (string-inte
5d80: 72 73 70 65 72 73 65 20 28 63 64 72 20 70 61 72  rsperse (cdr par
5d90: 74 73 29 20 22 2f 22 29 29 0a 09 20 20 20 20 20  ts) "/"))..     
5da0: 20 28 63 6f 6c 64 61 74 20 28 68 61 73 68 2d 74   (coldat (hash-t
5db0: 61 62 6c 65 2d 72 65 66 2f 64 65 66 61 75 6c 74  able-ref/default
5dc0: 20 64 61 74 61 20 72 65 73 74 20 23 66 29 29 29   data rest #f)))
5dd0: 0a 09 20 28 69 66 20 28 6e 6f 74 20 63 6f 6c 64  .. (if (not cold
5de0: 61 74 29 28 6c 65 74 20 28 28 6e 65 77 68 74 20  at)(let ((newht 
5df0: 28 6d 61 6b 65 2d 68 61 73 68 2d 74 61 62 6c 65  (make-hash-table
5e00: 29 29 29 0a 09 09 09 20 20 20 28 68 61 73 68 2d  )))....   (hash-
5e10: 74 61 62 6c 65 2d 73 65 74 21 20 64 61 74 61 20  table-set! data 
5e20: 72 65 73 74 20 6e 65 77 68 74 29 0a 09 09 09 20  rest newht).... 
5e30: 20 20 28 73 65 74 21 20 63 6f 6c 64 61 74 20 6e    (set! coldat n
5e40: 65 77 68 74 29 29 29 0a 09 20 28 68 61 73 68 2d  ewht))).. (hash-
5e50: 74 61 62 6c 65 2d 73 65 74 21 20 63 6f 6c 64 61  table-set! colda
5e60: 74 20 72 75 6e 2d 6e 61 6d 65 20 72 75 6e 29 29  t run-name run))
5e70: 29 0a 20 20 20 20 20 72 75 6e 73 29 0a 20 20 20  ).     runs).   
5e80: 20 64 61 74 61 29 29 0a 0a 0a 28 64 65 66 69 6e   data))...(defin
5e90: 65 20 28 70 67 64 62 3a 72 75 6e 73 2d 74 6f 2d  e (pgdb:runs-to-
5ea0: 68 61 73 68 20 72 75 6e 73 20 29 0a 20 20 28 6c  hash runs ).  (l
5eb0: 65 74 2a 20 28 28 64 61 74 61 20 20 28 6d 61 6b  et* ((data  (mak
5ec0: 65 2d 68 61 73 68 2d 74 61 62 6c 65 29 29 29 0a  e-hash-table))).
5ed0: 20 20 20 20 28 66 6f 72 2d 65 61 63 68 0a 20 20      (for-each.  
5ee0: 20 20 20 28 6c 61 6d 62 64 61 20 28 72 75 6e 29     (lambda (run)
5ef0: 0a 20 20 20 20 20 20 20 28 6c 65 74 2a 20 28 28  .       (let* ((
5f00: 72 75 6e 2d 6e 61 6d 65 20 28 76 65 63 74 6f 72  run-name (vector
5f10: 2d 72 65 66 20 72 75 6e 20 30 29 29 0a 09 20 20  -ref run 0))..  
5f20: 20 20 20 20 28 74 65 73 74 20 28 63 6f 6e 63 20      (test (conc 
5f30: 28 76 65 63 74 6f 72 2d 72 65 66 20 72 75 6e 20  (vector-ref run 
5f40: 31 29 20 22 3a 22 20 28 76 65 63 74 6f 72 2d 72  1) ":" (vector-r
5f50: 65 66 20 72 75 6e 20 33 29 29 29 0a 09 20 20 20  ef run 3)))..   
5f60: 20 20 20 28 63 6f 6c 64 61 74 20 28 68 61 73 68     (coldat (hash
5f70: 2d 74 61 62 6c 65 2d 72 65 66 2f 64 65 66 61 75  -table-ref/defau
5f80: 6c 74 20 64 61 74 61 20 72 75 6e 2d 6e 61 6d 65  lt data run-name
5f90: 20 23 66 29 29 29 0a 09 20 28 69 66 20 28 6e 6f   #f))).. (if (no
5fa0: 74 20 63 6f 6c 64 61 74 29 28 6c 65 74 20 28 28  t coldat)(let ((
5fb0: 6e 65 77 68 74 20 28 6d 61 6b 65 2d 68 61 73 68  newht (make-hash
5fc0: 2d 74 61 62 6c 65 29 29 29 0a 09 09 09 20 20 20  -table)))....   
5fd0: 28 68 61 73 68 2d 74 61 62 6c 65 2d 73 65 74 21  (hash-table-set!
5fe0: 20 64 61 74 61 20 72 75 6e 2d 6e 61 6d 65 20 6e   data run-name n
5ff0: 65 77 68 74 29 0a 09 09 09 20 20 20 28 73 65 74  ewht)....   (set
6000: 21 20 63 6f 6c 64 61 74 20 6e 65 77 68 74 29 29  ! coldat newht))
6010: 29 0a 09 20 28 68 61 73 68 2d 74 61 62 6c 65 2d  ).. (hash-table-
6020: 73 65 74 21 20 63 6f 6c 64 61 74 20 74 65 73 74  set! coldat test
6030: 20 72 75 6e 29 29 29 0a 20 20 20 20 20 72 75 6e   run))).     run
6040: 73 29 0a 20 20 20 20 64 61 74 61 29 29 0a 0a 28  s).    data))..(
6050: 64 65 66 69 6e 65 20 28 70 67 64 62 3a 67 65 74  define (pgdb:get
6060: 2d 68 69 73 74 6f 72 79 2d 68 61 73 68 20 72 75  -history-hash ru
6070: 6e 73 29 0a 20 20 28 6c 65 74 2a 20 28 28 64 61  ns).  (let* ((da
6080: 74 61 20 20 28 6d 61 6b 65 2d 68 61 73 68 2d 74  ta  (make-hash-t
6090: 61 62 6c 65 29 29 29 0a 20 20 20 20 20 28 66 6f  able))).     (fo
60a0: 72 2d 65 61 63 68 0a 20 20 20 20 20 28 6c 61 6d  r-each.     (lam
60b0: 62 64 61 20 28 72 75 6e 29 0a 20 20 20 20 20 20  bda (run).      
60c0: 20 28 6c 65 74 2a 20 28 28 72 75 6e 2d 6e 61 6d   (let* ((run-nam
60d0: 65 20 28 76 65 63 74 6f 72 2d 72 65 66 20 72 75  e (vector-ref ru
60e0: 6e 20 30 29 29 29 0a 09 20 28 68 61 73 68 2d 74  n 0))).. (hash-t
60f0: 61 62 6c 65 2d 73 65 74 21 20 64 61 74 61 20 72  able-set! data r
6100: 75 6e 2d 6e 61 6d 65 20 72 75 6e 29 29 29 0a 20  un-name run))). 
6110: 20 20 20 20 72 75 6e 73 29 0a 20 20 20 20 64 61      runs).    da
6120: 74 61 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 70  ta))..(define (p
6130: 67 64 62 3a 67 65 74 2d 70 67 2d 6c 73 74 20 74  gdb:get-pg-lst t
6140: 61 62 32 2d 70 61 67 65 73 29 0a 20 20 20 20 28  ab2-pages).    (
6150: 6c 65 74 20 6c 6f 6f 70 20 28 28 69 20 31 29 0a  let loop ((i 1).
6160: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6c 73               (ls
6170: 74 20 60 28 29 29 29 0a 20 20 20 20 20 20 20 20  t `())).        
6180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
6190: 63 6f 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20  cond.           
61a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 28 3e               ((>
61b0: 20 69 20 74 61 62 32 2d 70 61 67 65 73 20 29 0a   i tab2-pages ).
61c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61d0: 20 20 20 20 20 20 20 20 6c 73 74 29 20 0a 20 20          lst) .  
61e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61f0: 20 20 20 20 28 65 6c 73 65 20 0a 09 09 20 20 09      (else ...  .
6200: 28 6c 6f 6f 70 20 28 2b 20 69 20 31 29 20 28 61  (loop (+ i 1) (a
6210: 70 70 65 6e 64 20 20 20 6c 73 74 20 28 6c 69 73  ppend   lst (lis
6220: 74 20 69 29 29 29 29 29 29 29 0a 0a              t i)))))))..