Megatest

Hex Artifact Content
Login

Artifact 2ad595b83f76f7ecee719d2d7624124d6794f41d:


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 28 64 65 63 6c 61 72 65 20 28 75  gf)).(declare (u
03c0: 73 65 73 20 6d 74 61 72 67 73 29 29 0a 0a 3b 3b  ses mtargs))..;;
03d0: 20 49 20 64 6f 6e 27 74 20 6b 6e 6f 77 20 68 6f   I don't know ho
03e0: 77 20 74 6f 20 6d 69 78 20 63 6f 6d 70 69 6c 61  w to mix compila
03f0: 74 69 6f 6e 20 75 6e 69 74 73 20 61 6e 64 20 6d  tion units and m
0400: 6f 64 75 6c 65 73 2c 20 73 6f 20 6e 6f 20 6d 6f  odules, so no mo
0410: 64 75 6c 65 20 68 65 72 65 2e 0a 3b 3b 0a 3b 3b  dule here..;;.;;
0420: 20 28 6d 6f 64 75 6c 65 20 70 67 64 62 0a 3b 3b   (module pgdb.;;
0430: 20 20 20 20 20 28 0a 3b 3b 20 20 20 20 20 20 6f       (.;;      o
0440: 70 65 6e 2d 70 67 64 62 0a 3b 3b 20 20 20 20 20  pen-pgdb.;;     
0450: 20 29 0a 3b 3b 20 0a 3b 3b 20 28 69 6d 70 6f 72   ).;; .;; (impor
0460: 74 20 73 63 68 65 6d 65 29 0a 3b 3b 20 28 69 6d  t scheme).;; (im
0470: 70 6f 72 74 20 64 61 74 61 2d 73 74 72 75 63 74  port data-struct
0480: 75 72 65 73 29 0a 3b 3b 20 28 69 6d 70 6f 72 74  ures).;; (import
0490: 20 63 68 69 63 6b 65 6e 29 0a 0a 28 75 73 65 20   chicken)..(use 
04a0: 74 79 70 65 64 2d 72 65 63 6f 72 64 73 20 28 70  typed-records (p
04b0: 72 65 66 69 78 20 64 62 69 20 64 62 69 3a 29 29  refix dbi dbi:))
04c0: 0a 28 69 6d 70 6f 72 74 20 28 70 72 65 66 69 78  .(import (prefix
04d0: 20 6d 74 61 72 67 73 20 61 72 67 73 3a 29 29 0a   mtargs args:)).
04e0: 0a 3b 3b 20 67 69 76 65 6e 20 61 20 63 6f 6e 66  .;; given a conf
04f0: 69 67 64 61 74 20 6c 6f 6f 6b 75 70 20 74 68 65  igdat lookup the
0500: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 66 6f   connection info
0510: 20 61 6e 64 20 6f 70 65 6e 20 74 68 65 20 64 62   and open the db
0520: 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 28 70 67 64  .;;.(define (pgd
0530: 62 3a 6f 70 65 6e 20 63 6f 6e 66 69 67 64 61 74  b:open configdat
0540: 20 23 21 6b 65 79 20 28 64 62 6e 61 6d 65 20 23   #!key (dbname #
0550: 66 29 28 64 62 69 73 70 65 63 20 23 66 29 29 20  f)(dbispec #f)) 
0560: 20 0a 20 20 28 6c 65 74 20 28 28 70 67 63 6f 6e   .  (let ((pgcon
0570: 66 20 28 6f 72 20 64 62 69 73 70 65 63 0a 09 09  f (or dbispec...
0580: 20 20 20 20 28 61 72 67 73 3a 67 65 74 2d 61 72      (args:get-ar
0590: 67 20 22 2d 70 67 73 79 6e 63 22 29 0a 09 09 20  g "-pgsync")... 
05a0: 20 20 20 28 69 66 20 63 6f 6e 66 69 67 64 61 74     (if configdat
05b0: 0a 09 09 09 28 63 6f 6e 66 69 67 66 3a 6c 6f 6f  ....(configf:loo
05c0: 6b 75 70 20 63 6f 6e 66 69 67 64 61 74 20 22 65  kup configdat "e
05d0: 78 74 2d 73 79 6e 63 22 20 28 6f 72 20 64 62 6e  xt-sync" (or dbn
05e0: 61 6d 65 20 22 70 67 64 62 22 29 29 0a 09 09 09  ame "pgdb"))....
05f0: 23 66 29 0a 09 09 20 20 20 20 29 29 29 0a 20 20  #f)...    ))).  
0600: 20 20 28 69 66 20 70 67 63 6f 6e 66 0a 09 28 6c    (if pgconf..(l
0610: 65 74 2a 20 28 28 63 6f 6e 66 64 61 74 20 28 6d  et* ((confdat (m
0620: 61 70 20 28 6c 61 6d 62 64 61 20 28 63 6f 6e 66  ap (lambda (conf
0630: 2d 69 74 65 6d 29 0a 09 09 09 20 20 20 20 20 20  -item)....      
0640: 20 28 6c 65 74 20 28 28 70 61 72 74 73 20 28 73   (let ((parts (s
0650: 74 72 69 6e 67 2d 73 70 6c 69 74 20 63 6f 6e 66  tring-split conf
0660: 2d 69 74 65 6d 20 22 3a 22 29 29 29 0a 09 09 09  -item ":")))....
0670: 09 20 28 69 66 20 28 3e 20 28 6c 65 6e 67 74 68  . (if (> (length
0680: 20 70 61 72 74 73 29 20 31 29 0a 09 09 09 09 20   parts) 1)..... 
0690: 20 20 20 20 28 6c 65 74 20 28 28 6b 65 79 20 28      (let ((key (
06a0: 63 61 72 20 70 61 72 74 73 29 29 0a 09 09 09 09  car parts)).....
06b0: 09 20 20 20 28 76 61 6c 20 28 63 61 64 72 20 70  .   (val (cadr p
06c0: 61 72 74 73 29 29 29 0a 09 09 09 09 20 20 20 20  arts))).....    
06d0: 20 20 20 28 63 6f 6e 73 20 28 73 74 72 69 6e 67     (cons (string
06e0: 2d 3e 73 79 6d 62 6f 6c 20 6b 65 79 29 20 76 61  ->symbol key) va
06f0: 6c 29 29 0a 09 09 09 09 20 20 20 20 20 28 62 65  l)).....     (be
0700: 67 69 6e 0a 09 09 09 09 20 20 20 20 20 20 20 28  gin.....       (
0710: 70 72 69 6e 74 20 22 45 52 52 4f 52 3a 20 42 61  print "ERROR: Ba
0720: 64 20 63 6f 6e 66 69 67 20 73 65 74 74 69 6e 67  d config setting
0730: 20 22 20 63 6f 6e 66 2d 69 74 65 6d 20 22 2c 20   " conf-item ", 
0740: 73 68 6f 75 6c 64 20 62 65 20 6b 65 79 3a 76 61  should be key:va
0750: 6c 22 29 0a 09 09 09 09 20 20 20 20 20 20 20 60  l").....       `
0760: 28 2c 28 73 74 72 69 6e 67 2d 3e 73 79 6d 62 6f  (,(string->symbo
0770: 6c 20 28 63 61 72 20 70 61 72 74 73 29 29 20 2e  l (car parts)) .
0780: 20 23 66 29 29 29 29 29 0a 09 09 09 20 20 20 20   #f)))))....    
0790: 20 28 73 74 72 69 6e 67 2d 73 70 6c 69 74 20 70   (string-split p
07a0: 67 63 6f 6e 66 29 29 29 0a 09 20 20 20 20 20 20  gconf)))..      
07b0: 20 28 64 62 74 79 70 65 20 20 20 28 73 74 72 69   (dbtype   (stri
07c0: 6e 67 2d 3e 73 79 6d 62 6f 6c 20 28 6f 72 20 28  ng->symbol (or (
07d0: 61 6c 69 73 74 2d 72 65 66 20 27 64 62 74 79 70  alist-ref 'dbtyp
07e0: 65 20 63 6f 6e 66 64 61 74 29 20 22 70 67 22 29  e confdat) "pg")
07f0: 29 29 29 0a 09 20 20 28 69 66 20 28 61 6c 69 73  )))..  (if (alis
0800: 74 2d 72 65 66 20 27 64 62 74 79 70 65 20 63 6f  t-ref 'dbtype co
0810: 6e 66 64 61 74 29 0a 09 20 20 20 20 20 20 28 64  nfdat)..      (d
0820: 62 69 3a 6f 70 65 6e 20 64 62 74 79 70 65 20 28  bi:open dbtype (
0830: 61 6c 69 73 74 2d 64 65 6c 65 74 65 20 27 64 62  alist-delete 'db
0840: 74 79 70 65 20 63 6f 6e 66 64 61 74 29 29 29 29  type confdat))))
0850: 0a 09 23 66 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d  ..#f)))..;;=====
0860: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0870: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
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 0a 3b 3b 20 20 41 20 52 20 45 20 41 20 53 0a  =.;;  A R E A S.
08b0: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
08c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
08d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
08e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
08f0: 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65 66 73 74  ========..(defst
0900: 72 75 63 74 20 61 72 65 61 20 69 64 20 61 72 65  ruct area id are
0910: 61 2d 6e 61 6d 65 20 61 72 65 61 2d 70 61 74 68  a-name area-path
0920: 20 6c 61 73 74 2d 75 70 64 61 74 65 29 0a 0a 28   last-update)..(
0930: 64 65 66 69 6e 65 20 28 70 67 64 62 3a 61 64 64  define (pgdb:add
0940: 2d 61 72 65 61 20 64 62 68 20 61 72 65 61 2d 6e  -area dbh area-n
0950: 61 6d 65 20 61 72 65 61 2d 70 61 74 68 29 0a 20  ame area-path). 
0960: 20 28 64 62 69 3a 65 78 65 63 20 64 62 68 20 22   (dbi:exec dbh "
0970: 49 4e 53 45 52 54 20 49 4e 54 4f 20 61 72 65 61  INSERT INTO area
0980: 73 20 28 61 72 65 61 5f 6e 61 6d 65 2c 61 72 65  s (area_name,are
0990: 61 5f 70 61 74 68 29 20 56 41 4c 55 45 53 20 28  a_path) VALUES (
09a0: 3f 2c 3f 29 22 20 61 72 65 61 2d 6e 61 6d 65 20  ?,?)" area-name 
09b0: 61 72 65 61 2d 70 61 74 68 29 29 0a 0a 28 64 65  area-path))..(de
09c0: 66 69 6e 65 20 28 70 67 64 62 3a 67 65 74 2d 61  fine (pgdb:get-a
09d0: 72 65 61 73 20 64 62 68 29 0a 20 20 3b 3b 20 28  reas dbh).  ;; (
09e0: 6d 61 70 0a 20 20 3b 3b 20 20 28 6c 61 6d 62 64  map.  ;;  (lambd
09f0: 61 20 28 72 6f 77 29 0a 20 20 3b 3b 20 20 20 20  a (row).  ;;    
0a00: 28 70 72 69 6e 74 20 22 72 6f 77 3a 20 22 20 72  (print "row: " r
0a10: 6f 77 29 29 0a 20 20 28 64 62 69 3a 67 65 74 2d  ow)).  (dbi:get-
0a20: 72 6f 77 73 20 64 62 68 20 22 53 45 4c 45 43 54  rows dbh "SELECT
0a30: 20 69 64 2c 61 72 65 61 5f 6e 61 6d 65 2c 61 72   id,area_name,ar
0a40: 65 61 5f 70 61 74 68 2c 6c 61 73 74 5f 73 79 6e  ea_path,last_syn
0a50: 63 20 46 52 4f 4d 20 61 72 65 61 73 3b 22 29 29  c FROM areas;"))
0a60: 20 3b 3b 20 29 0a 0a 3b 3b 20 67 69 76 65 6e 20   ;; )..;; given 
0a70: 61 6e 20 61 72 65 61 5f 70 61 74 68 20 67 65 74  an area_path get
0a80: 20 74 68 65 20 61 72 65 61 20 69 6e 66 6f 0a 3b   the area info.;
0a90: 3b 0a 28 64 65 66 69 6e 65 20 28 70 67 64 62 3a  ;.(define (pgdb:
0aa0: 67 65 74 2d 61 72 65 61 2d 62 79 2d 70 61 74 68  get-area-by-path
0ab0: 20 64 62 68 20 61 72 65 61 2d 70 61 74 68 29 0a   dbh area-path).
0ac0: 20 20 28 64 62 69 3a 67 65 74 2d 6f 6e 65 2d 72    (dbi:get-one-r
0ad0: 6f 77 20 64 62 68 20 22 53 45 4c 45 43 54 20 69  ow dbh "SELECT i
0ae0: 64 2c 61 72 65 61 5f 6e 61 6d 65 2c 61 72 65 61  d,area_name,area
0af0: 5f 70 61 74 68 2c 6c 61 73 74 5f 73 79 6e 63 20  _path,last_sync 
0b00: 46 52 4f 4d 20 61 72 65 61 73 20 57 48 45 52 45  FROM areas WHERE
0b10: 20 61 72 65 61 5f 70 61 74 68 3d 3f 3b 22 20 61   area_path=?;" a
0b20: 72 65 61 2d 70 61 74 68 29 29 0a 0a 28 64 65 66  rea-path))..(def
0b30: 69 6e 65 20 28 70 67 64 62 3a 77 72 69 74 65 2d  ine (pgdb:write-
0b40: 73 79 6e 63 2d 74 69 6d 65 20 64 62 68 20 61 72  sync-time dbh ar
0b50: 65 61 2d 69 6e 66 6f 20 6e 65 77 2d 73 79 6e 63  ea-info new-sync
0b60: 2d 74 69 6d 65 29 0a 20 20 28 6c 65 74 20 28 28  -time).  (let ((
0b70: 61 72 65 61 2d 69 64 20 28 76 65 63 74 6f 72 2d  area-id (vector-
0b80: 72 65 66 20 61 72 65 61 2d 69 6e 66 6f 20 30 29  ref area-info 0)
0b90: 29 29 0a 20 20 20 20 28 64 62 69 3a 65 78 65 63  )).    (dbi:exec
0ba0: 20 64 62 68 20 22 55 50 44 41 54 45 20 61 72 65   dbh "UPDATE are
0bb0: 61 73 20 53 45 54 20 6c 61 73 74 5f 73 79 6e 63  as SET last_sync
0bc0: 3d 3f 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 20  =? WHERE id=?;" 
0bd0: 6e 65 77 2d 73 79 6e 63 2d 74 69 6d 65 20 61 72  new-sync-time ar
0be0: 65 61 2d 69 64 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d  ea-id)))..;;====
0bf0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0c00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
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 0a 3b 3b 20 20 54 20 41 20 52 20 47 20 45  ==.;;  T A R G E
0c40: 20 54 20 53 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d   T S.;;=========
0c50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0c60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0c70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0c80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b  =============..;
0c90: 3b 20 47 69 76 65 6e 20 61 20 74 61 72 67 65 74  ; Given a target
0ca0: 2d 73 70 65 63 2c 20 72 65 74 75 72 6e 20 74 68  -spec, return th
0cb0: 65 20 69 64 2e 20 53 68 6f 75 6c 64 20 70 72 6f  e id. Should pro
0cc0: 62 61 62 6c 79 20 68 61 6e 64 6c 65 20 74 68 69  bably handle thi
0cd0: 73 20 77 69 74 68 20 61 20 6a 6f 69 6e 2e 2e 2e  s with a join...
0ce0: 0a 3b 3b 20 69 66 20 74 61 72 67 65 74 2d 73 70  .;; if target-sp
0cf0: 65 63 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 63 72  ec not found, cr
0d00: 65 61 74 65 20 61 20 72 65 63 6f 72 64 20 66 6f  eate a record fo
0d10: 72 20 69 74 2e 0a 3b 3b 0a 28 64 65 66 69 6e 65  r it..;;.(define
0d20: 20 28 70 67 64 62 3a 67 65 74 2d 74 74 79 70 65   (pgdb:get-ttype
0d30: 20 64 62 68 20 74 61 72 67 65 74 2d 73 70 65 63   dbh target-spec
0d40: 29 0a 20 20 28 6c 65 74 20 28 28 73 70 65 63 2d  ).  (let ((spec-
0d50: 69 64 20 28 64 62 69 3a 67 65 74 2d 6f 6e 65 20  id (dbi:get-one 
0d60: 64 62 68 20 22 53 45 4c 45 43 54 20 69 64 20 46  dbh "SELECT id F
0d70: 52 4f 4d 20 74 74 79 70 65 20 57 48 45 52 45 20  ROM ttype WHERE 
0d80: 74 61 72 67 65 74 5f 73 70 65 63 3d 3f 3b 22 20  target_spec=?;" 
0d90: 74 61 72 67 65 74 2d 73 70 65 63 29 29 29 0a 20  target-spec))). 
0da0: 20 20 20 28 6f 72 20 73 70 65 63 2d 69 64 0a 09     (or spec-id..
0db0: 28 69 66 20 28 68 61 6e 64 6c 65 2d 65 78 63 65  (if (handle-exce
0dc0: 70 74 69 6f 6e 73 0a 09 09 65 78 6e 0a 09 09 28  ptions...exn...(
0dd0: 62 65 67 69 6e 0a 09 09 20 20 28 70 72 69 6e 74  begin...  (print
0de0: 2d 63 61 6c 6c 2d 63 68 61 69 6e 29 0a 09 09 20  -call-chain)... 
0df0: 20 28 64 65 62 75 67 3a 70 72 69 6e 74 20 30 20   (debug:print 0 
0e00: 2a 64 65 66 61 75 6c 74 2d 6c 6f 67 2d 70 6f 72  *default-log-por
0e10: 74 2a 20 22 45 52 52 4f 52 3a 20 63 61 6e 6e 6f  t* "ERROR: canno
0e20: 74 20 63 72 65 61 74 65 20 74 74 79 70 65 20 65  t create ttype e
0e30: 6e 74 72 79 2c 20 22 20 28 28 63 6f 6e 64 69 74  ntry, " ((condit
0e40: 69 6f 6e 2d 70 72 6f 70 65 72 74 79 2d 61 63 63  ion-property-acc
0e50: 65 73 73 6f 72 20 27 65 78 6e 20 27 6d 65 73 73  essor 'exn 'mess
0e60: 61 67 65 29 20 65 78 6e 29 29 0a 09 09 20 20 23  age) exn))...  #
0e70: 66 29 0a 09 20 20 20 20 20 20 28 64 62 69 3a 65  f)..      (dbi:e
0e80: 78 65 63 20 64 62 68 20 22 49 4e 53 45 52 54 20  xec dbh "INSERT 
0e90: 49 4e 54 4f 20 74 74 79 70 65 20 28 74 61 72 67  INTO ttype (targ
0ea0: 65 74 5f 73 70 65 63 29 20 56 41 4c 55 45 53 20  et_spec) VALUES 
0eb0: 28 3f 29 3b 22 20 74 61 72 67 65 74 2d 73 70 65  (?);" target-spe
0ec0: 63 29 29 0a 09 20 20 20 20 28 70 67 64 62 3a 67  c))..    (pgdb:g
0ed0: 65 74 2d 74 74 79 70 65 20 64 62 68 20 74 61 72  et-ttype dbh tar
0ee0: 67 65 74 2d 73 70 65 63 29 29 29 29 29 0a 0a 3b  get-spec)))))..;
0ef0: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;===============
0f00: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
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 0a 3b 3b 20 20 54 20 41 20  =======.;;  T A 
0f40: 47 20 53 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  G S.;;==========
0f50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0f60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0f70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0f80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 0a 28  ============...(
0f90: 64 65 66 69 6e 65 20 28 70 67 64 62 3a 67 65 74  define (pgdb:get
0fa0: 2d 74 61 67 2d 69 6e 66 6f 2d 62 79 2d 6e 61 6d  -tag-info-by-nam
0fb0: 65 20 64 62 68 20 74 61 67 29 0a 20 20 28 64 62  e dbh tag).  (db
0fc0: 69 3a 67 65 74 2d 6f 6e 65 2d 72 6f 77 20 64 62  i:get-one-row db
0fd0: 68 20 22 53 45 4c 45 43 54 20 69 64 2c 74 61 67  h "SELECT id,tag
0fe0: 5f 6e 61 6d 65 20 46 52 4f 4d 20 74 61 67 73 20  _name FROM tags 
0ff0: 77 68 65 72 65 20 74 61 67 5f 6e 61 6d 65 3d 3f  where tag_name=?
1000: 3b 22 20 74 61 67 29 29 0a 0a 28 64 65 66 69 6e  ;" tag))..(defin
1010: 65 20 28 70 67 64 62 3a 69 6e 73 65 72 74 2d 74  e (pgdb:insert-t
1020: 61 67 20 64 62 68 20 6e 61 6d 65 20 29 0a 20 20  ag dbh name ).  
1030: 28 64 62 69 3a 65 78 65 63 20 64 62 68 20 22 49  (dbi:exec dbh "I
1040: 4e 53 45 52 54 20 49 4e 54 4f 20 74 61 67 73 20  NSERT INTO tags 
1050: 28 74 61 67 5f 6e 61 6d 65 29 20 56 41 4c 55 45  (tag_name) VALUE
1060: 53 20 28 3f 29 22 20 6e 61 6d 65 20 29 29 0a 0a  S (?)" name ))..
1070: 28 64 65 66 69 6e 65 20 28 70 67 64 62 3a 69 6e  (define (pgdb:in
1080: 73 65 72 74 2d 61 72 65 61 2d 74 61 67 20 64 62  sert-area-tag db
1090: 68 20 74 61 67 2d 69 64 20 61 72 65 61 2d 69 64  h tag-id area-id
10a0: 20 29 0a 20 20 28 64 62 69 3a 65 78 65 63 20 64   ).  (dbi:exec d
10b0: 62 68 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  bh "INSERT INTO 
10c0: 61 72 65 61 5f 74 61 67 73 20 28 74 61 67 5f 69  area_tags (tag_i
10d0: 64 2c 20 61 72 65 61 5f 69 64 29 20 56 41 4c 55  d, area_id) VALU
10e0: 45 53 20 28 3f 2c 3f 29 22 20 74 61 67 2d 69 64  ES (?,?)" tag-id
10f0: 20 61 72 65 61 2d 69 64 20 29 29 0a 0a 28 64 65   area-id ))..(de
1100: 66 69 6e 65 20 28 70 67 64 62 3a 69 6e 73 65 72  fine (pgdb:inser
1110: 74 2d 72 75 6e 2d 74 61 67 20 64 62 68 20 74 61  t-run-tag dbh ta
1120: 67 2d 69 64 20 72 75 6e 2d 69 64 20 29 0a 20 20  g-id run-id ).  
1130: 28 64 62 69 3a 65 78 65 63 20 64 62 68 20 22 49  (dbi:exec dbh "I
1140: 4e 53 45 52 54 20 49 4e 54 4f 20 72 75 6e 5f 74  NSERT INTO run_t
1150: 61 67 73 20 28 74 61 67 5f 69 64 2c 20 72 75 6e  ags (tag_id, run
1160: 5f 69 64 29 20 56 41 4c 55 45 53 20 28 3f 2c 3f  _id) VALUES (?,?
1170: 29 22 20 74 61 67 2d 69 64 20 72 75 6e 2d 69 64  )" tag-id run-id
1180: 20 29 29 0a 0a 0a 28 64 65 66 69 6e 65 20 28 70   ))...(define (p
1190: 67 64 62 3a 69 73 2d 61 72 65 61 2d 74 61 67 65  gdb:is-area-tage
11a0: 64 20 64 62 68 20 61 72 65 61 2d 69 64 29 0a 20  d dbh area-id). 
11b0: 20 20 28 6c 65 74 20 28 28 61 72 65 61 2d 74 61    (let ((area-ta
11c0: 67 2d 69 64 20 28 64 62 69 3a 67 65 74 2d 6f 6e  g-id (dbi:get-on
11d0: 65 20 64 62 68 20 22 53 45 4c 45 43 54 20 69 64  e dbh "SELECT id
11e0: 20 46 52 4f 4d 20 61 72 65 61 5f 74 61 67 73 20   FROM area_tags 
11f0: 57 48 45 52 45 20 61 72 65 61 5f 69 64 3d 3f 3b  WHERE area_id=?;
1200: 22 20 61 72 65 61 2d 69 64 29 29 29 0a 20 20 20  " area-id))).   
1210: 28 69 66 20 61 72 65 61 2d 74 61 67 2d 69 64 20  (if area-tag-id 
1220: 0a 20 20 20 20 20 20 20 20 20 20 20 23 74 0a 20  .           #t. 
1230: 20 20 20 20 20 20 20 20 20 20 20 23 66 29 29 29             #f)))
1240: 0a 0a 28 64 65 66 69 6e 65 20 28 70 67 64 62 3a  ..(define (pgdb:
1250: 69 73 2d 61 72 65 61 2d 74 61 67 65 64 2d 77 69  is-area-taged-wi
1260: 74 68 2d 61 2d 74 61 67 20 64 62 68 20 20 20 74  th-a-tag dbh   t
1270: 61 67 2d 69 64 20 61 72 65 61 2d 69 64 29 0a 20  ag-id area-id). 
1280: 20 20 28 6c 65 74 20 28 28 61 72 65 61 2d 74 61    (let ((area-ta
1290: 67 2d 69 64 20 28 64 62 69 3a 67 65 74 2d 6f 6e  g-id (dbi:get-on
12a0: 65 20 64 62 68 20 22 53 45 4c 45 43 54 20 69 64  e dbh "SELECT id
12b0: 20 46 52 4f 4d 20 61 72 65 61 5f 74 61 67 73 20   FROM area_tags 
12c0: 57 48 45 52 45 20 61 72 65 61 5f 69 64 3d 3f 20  WHERE area_id=? 
12d0: 61 6e 64 20 74 61 67 5f 69 64 3d 3f 3b 22 20 61  and tag_id=?;" a
12e0: 72 65 61 2d 69 64 20 74 61 67 2d 69 64 29 29 29  rea-id tag-id)))
12f0: 0a 20 20 20 28 69 66 20 61 72 65 61 2d 74 61 67  .   (if area-tag
1300: 2d 69 64 20 0a 20 20 20 20 20 20 20 20 20 20 20  -id .           
1310: 23 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 23  #t.            #
1320: 66 29 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 70  f)))..(define (p
1330: 67 64 62 3a 69 73 2d 72 75 6e 2d 74 61 67 65 64  gdb:is-run-taged
1340: 2d 77 69 74 68 2d 61 2d 74 61 67 20 64 62 68 20  -with-a-tag dbh 
1350: 20 20 74 61 67 2d 69 64 20 72 75 6e 2d 69 64 29    tag-id run-id)
1360: 0a 20 20 20 28 6c 65 74 20 28 28 72 75 6e 2d 74  .   (let ((run-t
1370: 61 67 2d 69 64 20 28 64 62 69 3a 67 65 74 2d 6f  ag-id (dbi:get-o
1380: 6e 65 20 64 62 68 20 22 53 45 4c 45 43 54 20 69  ne dbh "SELECT i
1390: 64 20 46 52 4f 4d 20 72 75 6e 5f 74 61 67 73 20  d FROM run_tags 
13a0: 57 48 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 61  WHERE run_id=? a
13b0: 6e 64 20 74 61 67 5f 69 64 3d 3f 3b 22 20 72 75  nd tag_id=?;" ru
13c0: 6e 2d 69 64 20 74 61 67 2d 69 64 29 29 29 0a 20  n-id tag-id))). 
13d0: 20 20 28 69 66 20 72 75 6e 2d 74 61 67 2d 69 64    (if run-tag-id
13e0: 20 0a 20 20 20 20 20 20 20 20 20 20 20 23 74 0a   .           #t.
13f0: 20 20 20 20 20 20 20 20 20 20 20 20 23 66 29 29              #f))
1400: 29 0a 0a 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d  )....;;=========
1410: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1420: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
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 0a 3b 3b  =============.;;
1450: 20 20 52 20 55 20 4e 20 53 0a 3b 3b 3d 3d 3d 3d    R U N S.;;====
1460: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1470: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1480: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1490: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
14a0: 3d 3d 0a 0a 3b 3b 20 67 69 76 65 6e 20 61 20 74  ==..;; given a t
14b0: 61 72 67 65 74 20 73 70 65 63 20 69 64 2c 20 74  arget spec id, t
14c0: 61 72 67 65 74 20 61 6e 64 20 72 75 6e 2d 6e 61  arget and run-na
14d0: 6d 65 20 72 65 74 75 72 6e 20 74 68 65 20 72 75  me return the ru
14e0: 6e 2d 69 64 0a 3b 3b 20 69 66 20 6e 6f 20 72 75  n-id.;; if no ru
14f0: 6e 20 66 6f 75 6e 64 20 72 65 74 75 72 6e 20 23  n found return #
1500: 66 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 28 70 67  f.;;.(define (pg
1510: 64 62 3a 67 65 74 2d 72 75 6e 2d 69 64 20 64 62  db:get-run-id db
1520: 68 20 73 70 65 63 2d 69 64 20 74 61 72 67 65 74  h spec-id target
1530: 20 72 75 6e 2d 6e 61 6d 65 20 61 72 65 61 2d 69   run-name area-i
1540: 64 29 0a 20 20 28 64 62 69 3a 67 65 74 2d 6f 6e  d).  (dbi:get-on
1550: 65 20 64 62 68 20 22 53 45 4c 45 43 54 20 69 64  e dbh "SELECT id
1560: 20 46 52 4f 4d 20 72 75 6e 73 20 57 48 45 52 45   FROM runs WHERE
1570: 20 74 74 79 70 65 5f 69 64 3d 3f 20 41 4e 44 20   ttype_id=? AND 
1580: 74 61 72 67 65 74 3d 3f 20 41 4e 44 20 72 75 6e  target=? AND run
1590: 5f 6e 61 6d 65 3d 3f 20 61 6e 64 20 61 72 65 61  _name=? and area
15a0: 5f 69 64 3d 3f 3b 22 0a 09 20 20 20 20 20 20 20  _id=?;"..       
15b0: 73 70 65 63 2d 69 64 20 74 61 72 67 65 74 20 72  spec-id target r
15c0: 75 6e 2d 6e 61 6d 65 20 61 72 65 61 2d 69 64 29  un-name area-id)
15d0: 29 0a 0a 3b 3b 20 67 69 76 65 6e 20 61 20 74 61  )..;; given a ta
15e0: 72 67 65 74 20 73 70 65 63 20 69 64 2c 20 74 61  rget spec id, ta
15f0: 72 67 65 74 20 61 6e 64 20 72 75 6e 2d 6e 61 6d  rget and run-nam
1600: 65 20 72 65 74 75 72 6e 20 74 68 65 20 72 75 6e  e return the run
1610: 2d 69 64 0a 3b 3b 20 69 66 20 6e 6f 20 72 75 6e  -id.;; if no run
1620: 20 66 6f 75 6e 64 20 72 65 74 75 72 6e 20 23 66   found return #f
1630: 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 28 70 67 64  .;;.(define (pgd
1640: 62 3a 67 65 74 2d 72 75 6e 2d 6c 61 73 74 2d 75  b:get-run-last-u
1650: 70 64 61 74 65 20 64 62 68 20 69 64 20 29 0a 20  pdate dbh id ). 
1660: 20 28 64 62 69 3a 67 65 74 2d 6f 6e 65 20 64 62   (dbi:get-one db
1670: 68 20 22 53 45 4c 45 43 54 20 6c 61 73 74 5f 75  h "SELECT last_u
1680: 70 64 61 74 65 20 46 52 4f 4d 20 72 75 6e 73 20  pdate FROM runs 
1690: 57 48 45 52 45 20 69 64 3d 3f 3b 22 0a 09 20 20  WHERE id=?;"..  
16a0: 20 20 20 20 20 20 69 64 29 29 0a 0a 3b 3b 20 67        id))..;; g
16b0: 69 76 65 6e 20 61 20 72 75 6e 2d 69 64 20 72 65  iven a run-id re
16c0: 74 75 72 6e 20 61 6c 6c 20 74 68 65 20 72 75 6e  turn all the run
16d0: 20 69 6e 66 6f 0a 3b 3b 0a 28 64 65 66 69 6e 65   info.;;.(define
16e0: 20 28 70 67 64 62 3a 67 65 74 2d 72 75 6e 2d 69   (pgdb:get-run-i
16f0: 6e 66 6f 20 64 62 68 20 72 75 6e 2d 69 64 20 29  nfo dbh run-id )
1700: 20 3b 3b 20 74 6f 20 6a 6f 69 6e 20 74 74 79 70   ;; to join ttyp
1710: 65 20 6f 72 20 6e 6f 74 3f 0a 20 20 28 64 62 69  e or not?.  (dbi
1720: 3a 67 65 74 2d 6f 6e 65 2d 72 6f 77 0a 20 20 20  :get-one-row.   
1730: 64 62 68 20 20 20 3b 3b 20 30 20 20 20 20 31 20  dbh   ;; 0    1 
1740: 20 20 20 20 20 20 32 20 20 20 20 20 20 20 33 20        2       3 
1750: 20 20 20 20 20 34 20 20 20 20 20 35 20 20 20 20       4     5    
1760: 20 20 36 20 20 20 20 20 20 20 37 20 20 20 20 20    6       7     
1770: 20 20 20 38 20 20 20 20 20 20 20 20 20 39 20 20     8         9  
1780: 20 20 20 20 20 20 20 31 30 20 20 20 20 20 20 20         10       
1790: 20 20 20 31 31 20 20 20 20 20 20 20 20 20 31 32     11         12
17a0: 0a 20 20 20 22 53 45 4c 45 43 54 20 69 64 2c 74  .   "SELECT id,t
17b0: 61 72 67 65 74 2c 74 74 79 70 65 5f 69 64 2c 72  arget,ttype_id,r
17c0: 75 6e 5f 6e 61 6d 65 2c 73 74 61 74 65 2c 73 74  un_name,state,st
17d0: 61 74 75 73 2c 6f 77 6e 65 72 2c 65 76 65 6e 74  atus,owner,event
17e0: 5f 74 69 6d 65 2c 63 6f 6d 6d 65 6e 74 2c 66 61  _time,comment,fa
17f0: 69 6c 5f 63 6f 75 6e 74 2c 70 61 73 73 5f 63 6f  il_count,pass_co
1800: 75 6e 74 2c 6c 61 73 74 5f 75 70 64 61 74 65 2c  unt,last_update,
1810: 61 72 65 61 5f 69 64 0a 20 20 20 20 20 20 20 46  area_id.       F
1820: 52 4f 4d 20 72 75 6e 73 20 57 48 45 52 45 20 69  ROM runs WHERE i
1830: 64 3d 3f 20 3b 22 20 72 75 6e 2d 69 64 20 29 29  d=? ;" run-id ))
1840: 0a 0a 3b 3b 20 72 65 66 72 65 73 68 20 74 68 65  ..;; refresh the
1850: 20 64 61 74 61 20 69 6e 20 61 20 72 75 6e 20 72   data in a run r
1860: 65 63 6f 72 64 0a 3b 3b 0a 28 64 65 66 69 6e 65  ecord.;;.(define
1870: 20 28 70 67 64 62 3a 72 65 66 72 65 73 68 2d 72   (pgdb:refresh-r
1880: 75 6e 2d 69 6e 66 6f 20 64 62 68 20 72 75 6e 2d  un-info dbh run-
1890: 69 64 20 73 74 61 74 65 20 73 74 61 74 75 73 20  id state status 
18a0: 6f 77 6e 65 72 20 65 76 65 6e 74 2d 74 69 6d 65  owner event-time
18b0: 20 63 6f 6d 6d 65 6e 74 20 66 61 69 6c 2d 63 6f   comment fail-co
18c0: 75 6e 74 20 70 61 73 73 2d 63 6f 75 6e 74 20 61  unt pass-count a
18d0: 72 65 61 2d 69 64 20 6c 61 73 74 5f 75 70 64 61  rea-id last_upda
18e0: 74 65 20 70 75 62 6c 69 73 68 2d 74 69 6d 65 29  te publish-time)
18f0: 20 3b 3b 20 61 72 65 61 2d 69 64 29 0a 20 20 28   ;; area-id).  (
1900: 64 62 69 3a 65 78 65 63 0a 20 20 20 64 62 68 0a  dbi:exec.   dbh.
1910: 20 20 20 22 55 50 44 41 54 45 20 72 75 6e 73 20     "UPDATE runs 
1920: 53 45 54 0a 20 20 20 20 20 20 73 74 61 74 65 3d  SET.      state=
1930: 3f 2c 73 74 61 74 75 73 3d 3f 2c 6f 77 6e 65 72  ?,status=?,owner
1940: 3d 3f 2c 65 76 65 6e 74 5f 74 69 6d 65 3d 3f 2c  =?,event_time=?,
1950: 63 6f 6d 6d 65 6e 74 3d 3f 2c 66 61 69 6c 5f 63  comment=?,fail_c
1960: 6f 75 6e 74 3d 3f 2c 70 61 73 73 5f 63 6f 75 6e  ount=?,pass_coun
1970: 74 3d 3f 2c 6c 61 73 74 5f 75 70 64 61 74 65 3d  t=?,last_update=
1980: 3f 2c 70 75 62 6c 69 73 68 5f 74 69 6d 65 3d 3f  ?,publish_time=?
1990: 20 20 0a 20 20 20 20 20 57 48 45 52 45 20 69 64    .     WHERE id
19a0: 3d 3f 20 61 6e 64 20 61 72 65 61 5f 69 64 3d 3f  =? and area_id=?
19b0: 3b 22 0a 20 20 20 73 74 61 74 65 20 73 74 61 74  ;".   state stat
19c0: 75 73 20 6f 77 6e 65 72 20 65 76 65 6e 74 2d 74  us owner event-t
19d0: 69 6d 65 20 63 6f 6d 6d 65 6e 74 20 66 61 69 6c  ime comment fail
19e0: 2d 63 6f 75 6e 74 20 70 61 73 73 2d 63 6f 75 6e  -count pass-coun
19f0: 74 20 6c 61 73 74 5f 75 70 64 61 74 65 20 70 75  t last_update pu
1a00: 62 6c 69 73 68 2d 74 69 6d 65 20 72 75 6e 2d 69  blish-time run-i
1a10: 64 20 61 72 65 61 2d 69 64 20 29 29 0a 0a 3b 3b  d area-id ))..;;
1a20: 20 67 69 76 65 6e 20 61 6c 6c 20 6e 65 65 64 65   given all neede
1a30: 64 20 69 6e 66 6f 20 63 72 65 61 74 65 20 72 75  d info create ru
1a40: 6e 20 72 65 63 6f 72 64 0a 3b 3b 0a 28 64 65 66  n record.;;.(def
1a50: 69 6e 65 20 28 70 67 64 62 3a 69 6e 73 65 72 74  ine (pgdb:insert
1a60: 2d 72 75 6e 20 64 62 68 20 74 74 79 70 65 2d 69  -run dbh ttype-i
1a70: 64 20 74 61 72 67 65 74 20 72 75 6e 2d 6e 61 6d  d target run-nam
1a80: 65 20 73 74 61 74 65 20 73 74 61 74 75 73 20 6f  e state status o
1a90: 77 6e 65 72 20 65 76 65 6e 74 2d 74 69 6d 65 20  wner event-time 
1aa0: 63 6f 6d 6d 65 6e 74 20 66 61 69 6c 2d 63 6f 75  comment fail-cou
1ab0: 6e 74 20 70 61 73 73 2d 63 6f 75 6e 74 20 61 72  nt pass-count ar
1ac0: 65 61 2d 69 64 20 6c 61 73 74 2d 75 70 64 61 74  ea-id last-updat
1ad0: 65 20 70 75 62 6c 69 73 68 2d 74 69 6d 65 29 0a  e publish-time).
1ae0: 20 20 20 20 28 64 62 69 3a 65 78 65 63 0a 20 20      (dbi:exec.  
1af0: 20 64 62 68 0a 20 20 20 22 49 4e 53 45 52 54 20   dbh.   "INSERT 
1b00: 49 4e 54 4f 20 72 75 6e 73 20 28 74 74 79 70 65  INTO runs (ttype
1b10: 5f 69 64 2c 74 61 72 67 65 74 2c 72 75 6e 5f 6e  _id,target,run_n
1b20: 61 6d 65 2c 73 74 61 74 65 2c 73 74 61 74 75 73  ame,state,status
1b30: 2c 6f 77 6e 65 72 2c 65 76 65 6e 74 5f 74 69 6d  ,owner,event_tim
1b40: 65 2c 63 6f 6d 6d 65 6e 74 2c 66 61 69 6c 5f 63  e,comment,fail_c
1b50: 6f 75 6e 74 2c 70 61 73 73 5f 63 6f 75 6e 74 2c  ount,pass_count,
1b60: 61 72 65 61 5f 69 64 2c 6c 61 73 74 5f 75 70 64  area_id,last_upd
1b70: 61 74 65 2c 70 75 62 6c 69 73 68 5f 74 69 6d 65  ate,publish_time
1b80: 29 0a 20 20 20 20 20 20 56 41 4c 55 45 53 20 28  ).      VALUES (
1b90: 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c  ?,?,?,?,?,?,?,?,
1ba0: 3f 2c 3f 2c 3f 2c 3f 2c 20 3f 29 3b 22 0a 20 20  ?,?,?,?, ?);".  
1bb0: 20 20 74 74 79 70 65 2d 69 64 20 74 61 72 67 65    ttype-id targe
1bc0: 74 20 72 75 6e 2d 6e 61 6d 65 20 73 74 61 74 65  t run-name state
1bd0: 20 73 74 61 74 75 73 20 6f 77 6e 65 72 20 65 76   status owner ev
1be0: 65 6e 74 2d 74 69 6d 65 20 63 6f 6d 6d 65 6e 74  ent-time comment
1bf0: 20 66 61 69 6c 2d 63 6f 75 6e 74 20 70 61 73 73   fail-count pass
1c00: 2d 63 6f 75 6e 74 20 61 72 65 61 2d 69 64 20 6c  -count area-id l
1c10: 61 73 74 2d 75 70 64 61 74 65 20 70 75 62 6c 69  ast-update publi
1c20: 73 68 2d 74 69 6d 65 29 29 0a 0a 3b 3b 3d 3d 3d  sh-time))..;;===
1c30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1c40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1c50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1c60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1c70: 3d 3d 3d 0a 3b 3b 20 20 54 20 45 20 53 20 54 20  ===.;;  T E S T 
1c80: 2d 20 53 20 54 20 45 20 50 20 53 0a 3b 3b 3d 3d  - S T E P S.;;==
1c90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1ca0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1cb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1cc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1cd0: 3d 3d 3d 3d 0a 0a 28 64 65 66 69 6e 65 20 28 70  ====..(define (p
1ce0: 67 64 62 3a 67 65 74 2d 74 65 73 74 2d 73 74 65  gdb:get-test-ste
1cf0: 70 2d 69 64 20 64 62 68 20 74 65 73 74 2d 69 64  p-id dbh test-id
1d00: 20 73 74 65 70 6e 61 6d 65 20 73 74 61 74 65 29   stepname state)
1d10: 0a 20 20 28 64 62 69 3a 67 65 74 2d 6f 6e 65 0a  .  (dbi:get-one.
1d20: 20 20 20 20 64 62 68 0a 20 20 20 20 22 53 45 4c      dbh.    "SEL
1d30: 45 43 54 20 69 64 20 46 52 4f 4d 20 74 65 73 74  ECT id FROM test
1d40: 5f 73 74 65 70 73 20 57 48 45 52 45 20 74 65 73  _steps WHERE tes
1d50: 74 5f 69 64 3d 3f 20 41 4e 44 20 73 74 65 70 6e  t_id=? AND stepn
1d60: 61 6d 65 3d 3f 20 61 6e 64 20 73 74 61 74 65 20  ame=? and state 
1d70: 3d 20 3f 20 3b 22 0a 20 20 20 20 74 65 73 74 2d  = ? ;".    test-
1d80: 69 64 20 73 74 65 70 6e 61 6d 65 20 73 74 61 74  id stepname stat
1d90: 65 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 70 67  e))..(define (pg
1da0: 64 62 3a 67 65 74 2d 74 65 73 74 2d 73 74 65 70  db:get-test-step
1db0: 2d 6c 61 73 74 2d 75 70 64 61 74 65 20 64 62 68  -last-update dbh
1dc0: 20 69 64 20 29 0a 20 20 28 64 62 69 3a 67 65 74   id ).  (dbi:get
1dd0: 2d 6f 6e 65 0a 20 20 20 20 64 62 68 0a 20 20 20  -one.    dbh.   
1de0: 20 22 53 45 4c 45 43 54 20 6c 61 73 74 5f 75 70   "SELECT last_up
1df0: 64 61 74 65 20 46 52 4f 4d 20 74 65 73 74 5f 73  date FROM test_s
1e00: 74 65 70 73 20 57 48 45 52 45 20 69 64 3d 3f 20  teps WHERE id=? 
1e10: 3b 22 0a 20 20 20 20 69 64 29 29 0a 0a 28 64 65  ;".    id))..(de
1e20: 66 69 6e 65 20 28 70 67 64 62 3a 69 6e 73 65 72  fine (pgdb:inser
1e30: 74 2d 74 65 73 74 2d 73 74 65 70 20 64 62 68 20  t-test-step dbh 
1e40: 74 65 73 74 2d 69 64 20 73 74 65 70 6e 61 6d 65  test-id stepname
1e50: 20 73 74 61 74 65 20 73 74 61 74 75 73 20 65 76   state status ev
1e60: 65 6e 74 5f 74 69 6d 65 20 63 6f 6d 6d 65 6e 74  ent_time comment
1e70: 20 6c 6f 67 66 69 6c 65 20 6c 61 73 74 2d 75 70   logfile last-up
1e80: 64 61 74 65 20 29 0a 20 20 28 64 62 69 3a 65 78  date ).  (dbi:ex
1e90: 65 63 0a 20 20 20 64 62 68 0a 20 20 20 22 49 4e  ec.   dbh.   "IN
1ea0: 53 45 52 54 20 49 4e 54 4f 20 74 65 73 74 5f 73  SERT INTO test_s
1eb0: 74 65 70 73 20 28 74 65 73 74 5f 69 64 2c 73 74  teps (test_id,st
1ec0: 65 70 6e 61 6d 65 2c 73 74 61 74 65 2c 73 74 61  epname,state,sta
1ed0: 74 75 73 2c 65 76 65 6e 74 5f 74 69 6d 65 2c 6c  tus,event_time,l
1ee0: 6f 67 66 69 6c 65 2c 63 6f 6d 6d 65 6e 74 2c 6c  ogfile,comment,l
1ef0: 61 73 74 5f 75 70 64 61 74 65 29 0a 20 20 20 20  ast_update).    
1f00: 20 20 20 56 41 4c 55 45 53 20 28 3f 2c 3f 2c 3f     VALUES (?,?,?
1f10: 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 20 29 3b 22 0a 20  ,?,?,?,?,? );". 
1f20: 20 20 74 65 73 74 2d 69 64 20 73 74 65 70 6e 61    test-id stepna
1f30: 6d 65 20 20 73 74 61 74 65 20 20 20 73 74 61 74  me  state   stat
1f40: 75 73 20 20 65 76 65 6e 74 5f 74 69 6d 65 20 20  us  event_time  
1f50: 20 6c 6f 67 66 69 6c 65 20 20 20 63 6f 6d 6d 65   logfile   comme
1f60: 6e 74 20 6c 61 73 74 2d 75 70 64 61 74 65 29 29  nt last-update))
1f70: 0a 0a 28 64 65 66 69 6e 65 20 28 70 67 64 62 3a  ..(define (pgdb:
1f80: 75 70 64 61 74 65 2d 74 65 73 74 2d 73 74 65 70  update-test-step
1f90: 20 64 62 68 20 73 74 65 70 2d 69 64 20 74 65 73   dbh step-id tes
1fa0: 74 2d 69 64 20 73 74 65 70 6e 61 6d 65 20 73 74  t-id stepname st
1fb0: 61 74 65 20 73 74 61 74 75 73 20 65 76 65 6e 74  ate status event
1fc0: 5f 74 69 6d 65 20 63 6f 6d 6d 65 6e 74 20 6c 6f  _time comment lo
1fd0: 67 66 69 6c 65 20 6c 61 73 74 2d 75 70 64 61 74  gfile last-updat
1fe0: 65 29 0a 20 20 28 64 62 69 3a 65 78 65 63 0a 20  e).  (dbi:exec. 
1ff0: 20 20 20 64 62 68 0a 20 20 20 20 22 55 50 44 41     dbh.    "UPDA
2000: 54 45 20 74 65 73 74 5f 73 74 65 70 73 20 53 45  TE test_steps SE
2010: 54 0a 20 20 20 20 20 20 20 20 20 74 65 73 74 5f  T.         test_
2020: 69 64 3d 3f 2c 73 74 65 70 6e 61 6d 65 3d 3f 2c  id=?,stepname=?,
2030: 73 74 61 74 65 3d 3f 2c 73 74 61 74 75 73 3d 3f  state=?,status=?
2040: 2c 65 76 65 6e 74 5f 74 69 6d 65 3d 3f 2c 6c 6f  ,event_time=?,lo
2050: 67 66 69 6c 65 3d 3f 2c 63 6f 6d 6d 65 6e 74 3d  gfile=?,comment=
2060: 3f 2c 6c 61 73 74 5f 75 70 64 61 74 65 3d 3f 0a  ?,last_update=?.
2070: 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 20            WHERE 
2080: 69 64 3d 3f 3b 22 0a 20 20 20 20 74 65 73 74 2d  id=?;".    test-
2090: 69 64 20 73 74 65 70 6e 61 6d 65 20 20 73 74 61  id stepname  sta
20a0: 74 65 20 20 20 73 74 61 74 75 73 20 20 65 76 65  te   status  eve
20b0: 6e 74 5f 74 69 6d 65 20 20 20 6c 6f 67 66 69 6c  nt_time   logfil
20c0: 65 20 20 20 63 6f 6d 6d 65 6e 74 20 6c 61 73 74  e   comment last
20d0: 2d 75 70 64 61 74 65 20 73 74 65 70 2d 69 64 29  -update step-id)
20e0: 29 0a 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  )...;;==========
20f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2100: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
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 0a 3b 3b 20  ============.;; 
2130: 20 54 20 45 20 53 20 54 20 2d 20 44 20 41 20 54   T E S T - D A T
2140: 20 41 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d   A.;;===========
2150: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2160: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2170: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2180: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 28 64 65  ===========..(de
2190: 66 69 6e 65 20 28 70 67 64 62 3a 67 65 74 2d 74  fine (pgdb:get-t
21a0: 65 73 74 2d 64 61 74 61 2d 69 64 20 64 62 68 20  est-data-id dbh 
21b0: 74 65 73 74 2d 69 64 20 63 61 74 65 67 6f 72 79  test-id category
21c0: 20 76 61 72 69 61 62 6c 65 29 0a 20 20 28 64 62   variable).  (db
21d0: 69 3a 67 65 74 2d 6f 6e 65 0a 20 20 20 20 64 62  i:get-one.    db
21e0: 68 0a 20 20 20 20 22 53 45 4c 45 43 54 20 69 64  h.    "SELECT id
21f0: 20 46 52 4f 4d 20 74 65 73 74 5f 64 61 74 61 20   FROM test_data 
2200: 57 48 45 52 45 20 74 65 73 74 5f 69 64 3d 3f 20  WHERE test_id=? 
2210: 41 4e 44 20 63 61 74 65 67 6f 72 79 3d 3f 20 61  AND category=? a
2220: 6e 64 20 76 61 72 69 61 62 6c 65 20 3d 20 3f 20  nd variable = ? 
2230: 3b 22 0a 20 20 20 20 74 65 73 74 2d 69 64 20 63  ;".    test-id c
2240: 61 74 65 67 6f 72 79 20 76 61 72 69 61 62 6c 65  ategory variable
2250: 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 70 67 64  ))..(define (pgd
2260: 62 3a 67 65 74 2d 74 65 73 74 2d 64 61 74 61 2d  b:get-test-data-
2270: 6c 61 73 74 2d 75 70 64 61 74 65 20 64 62 68 20  last-update dbh 
2280: 74 65 73 74 2d 64 61 74 61 2d 69 64 20 29 0a 20  test-data-id ). 
2290: 20 28 64 62 69 3a 67 65 74 2d 6f 6e 65 0a 20 20   (dbi:get-one.  
22a0: 20 20 64 62 68 0a 20 20 20 20 22 53 45 4c 45 43    dbh.    "SELEC
22b0: 54 20 6c 61 73 74 5f 75 70 64 61 74 65 20 46 52  T last_update FR
22c0: 4f 4d 20 74 65 73 74 5f 64 61 74 61 20 57 48 45  OM test_data WHE
22d0: 52 45 20 69 64 3d 3f 20 3b 22 0a 20 20 20 20 74  RE id=? ;".    t
22e0: 65 73 74 2d 64 61 74 61 2d 69 64 29 29 0a 0a 28  est-data-id))..(
22f0: 64 65 66 69 6e 65 20 28 70 67 64 62 3a 69 6e 73  define (pgdb:ins
2300: 65 72 74 2d 74 65 73 74 2d 64 61 74 61 20 64 62  ert-test-data db
2310: 68 20 74 65 73 74 2d 69 64 20 63 61 74 65 67 6f  h test-id catego
2320: 72 79 20 76 61 72 69 61 62 6c 65 20 76 61 6c 75  ry variable valu
2330: 65 20 65 78 70 65 63 74 65 64 20 74 6f 6c 20 75  e expected tol u
2340: 6e 69 74 73 20 63 6f 6d 6d 65 6e 74 20 73 74 61  nits comment sta
2350: 74 75 73 20 74 79 70 65 20 6c 61 73 74 2d 75 70  tus type last-up
2360: 64 61 74 65 29 0a 20 3b 20 28 70 72 69 6e 74 20  date). ; (print 
2370: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 65 73  "INSERT INTO tes
2380: 74 5f 64 61 74 61 20 28 74 65 73 74 5f 69 64 2c  t_data (test_id,
2390: 20 63 61 74 65 67 6f 72 79 2c 20 76 61 72 69 61   category, varia
23a0: 62 6c 65 2c 20 76 61 6c 75 65 2c 20 65 78 70 65  ble, value, expe
23b0: 63 74 65 64 2c 20 74 6f 6c 2c 20 75 6e 69 74 73  cted, tol, units
23c0: 2c 20 63 6f 6d 6d 65 6e 74 2c 20 73 74 61 74 75  , comment, statu
23d0: 73 2c 20 74 79 70 65 29 0a 20 3b 20 20 20 20 20  s, type). ;     
23e0: 20 56 41 4c 55 45 53 20 28 3f 2c 3f 2c 3f 2c 3f   VALUES (?,?,?,?
23f0: 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 29 20 22 20  ,?,?,?,?,?,?) " 
2400: 74 65 73 74 2d 69 64 20 22 20 22 20 63 61 74 65  test-id " " cate
2410: 67 6f 72 79 20 22 20 22 20 76 61 72 69 61 62 6c  gory " " variabl
2420: 65 20 22 20 22 20 76 61 6c 75 65 20 22 20 22 20  e " " value " " 
2430: 20 65 78 70 65 63 74 65 64 20 22 20 22 20 20 74   expected " "  t
2440: 6f 6c 20 22 20 22 20 20 75 6e 69 74 73 20 22 20  ol " "  units " 
2450: 22 20 63 6f 6d 6d 65 6e 74 20 20 22 20 22 20 73  " comment  " " s
2460: 74 61 74 75 73 20 20 22 20 22 20 74 79 70 65 29  tatus  " " type)
2470: 0a 20 20 28 69 66 20 28 6e 6f 74 20 28 73 74 72  .  (if (not (str
2480: 69 6e 67 3f 20 75 6e 69 74 73 29 29 0a 20 20 20  ing? units)).   
2490: 20 20 20 28 73 65 74 21 20 75 6e 69 74 73 20 22     (set! units "
24a0: 22 20 29 29 0a 20 20 28 69 66 20 28 6e 6f 74 20  " )).  (if (not 
24b0: 28 73 74 72 69 6e 67 3f 20 76 61 72 69 61 62 6c  (string? variabl
24c0: 65 29 29 0a 20 20 20 20 20 20 28 73 65 74 21 20  e)).      (set! 
24d0: 76 61 72 69 61 62 6c 65 20 22 22 20 29 29 0a 20  variable "" )). 
24e0: 20 28 69 66 20 28 6e 6f 74 20 28 72 65 61 6c 3f   (if (not (real?
24f0: 20 76 61 6c 75 65 29 29 0a 20 20 20 20 20 20 28   value)).      (
2500: 73 65 74 21 20 76 61 6c 75 65 20 30 20 29 29 0a  set! value 0 )).
2510: 20 20 28 69 66 20 28 6e 6f 74 20 28 72 65 61 6c    (if (not (real
2520: 3f 20 65 78 70 65 63 74 65 64 29 29 0a 20 20 20  ? expected)).   
2530: 20 20 20 28 73 65 74 21 20 65 78 70 65 63 74 65     (set! expecte
2540: 64 20 30 20 20 29 29 0a 28 69 66 20 28 6e 6f 74  d 0  )).(if (not
2550: 20 28 72 65 61 6c 3f 20 74 6f 6c 29 29 0a 20 20   (real? tol)).  
2560: 20 20 20 20 28 73 65 74 21 20 74 6f 6c 20 30 20      (set! tol 0 
2570: 20 29 29 0a 0a 20 20 28 64 62 69 3a 65 78 65 63   ))..  (dbi:exec
2580: 0a 20 20 20 64 62 68 0a 20 20 20 22 49 4e 53 45  .   dbh.   "INSE
2590: 52 54 20 49 4e 54 4f 20 74 65 73 74 5f 64 61 74  RT INTO test_dat
25a0: 61 20 28 74 65 73 74 5f 69 64 2c 20 63 61 74 65  a (test_id, cate
25b0: 67 6f 72 79 2c 20 76 61 72 69 61 62 6c 65 2c 20  gory, variable, 
25c0: 76 61 6c 75 65 2c 20 65 78 70 65 63 74 65 64 2c  value, expected,
25d0: 20 74 6f 6c 2c 20 75 6e 69 74 73 2c 20 63 6f 6d   tol, units, com
25e0: 6d 65 6e 74 2c 20 73 74 61 74 75 73 2c 20 74 79  ment, status, ty
25f0: 70 65 2c 20 6c 61 73 74 5f 75 70 64 61 74 65 29  pe, last_update)
2600: 0a 20 20 20 20 20 20 20 56 41 4c 55 45 53 20 28  .       VALUES (
2610: 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c  ?,?,?,?,?,?,?,?,
2620: 3f 2c 3f 2c 20 3f 29 3b 22 0a 20 20 20 74 65 73  ?,?, ?);".   tes
2630: 74 2d 69 64 20 63 61 74 65 67 6f 72 79 20 76 61  t-id category va
2640: 72 69 61 62 6c 65 20 76 61 6c 75 65 20 65 78 70  riable value exp
2650: 65 63 74 65 64 20 74 6f 6c 20 75 6e 69 74 73 20  ected tol units 
2660: 63 6f 6d 6d 65 6e 74 20 73 74 61 74 75 73 20 74  comment status t
2670: 79 70 65 20 6c 61 73 74 2d 75 70 64 61 74 65 29  ype last-update)
2680: 29 0a 0a 28 64 65 66 69 6e 65 20 28 70 67 64 62  )..(define (pgdb
2690: 3a 75 70 64 61 74 65 2d 74 65 73 74 2d 64 61 74  :update-test-dat
26a0: 61 20 64 62 68 20 64 61 74 61 2d 69 64 20 74 65  a dbh data-id te
26b0: 73 74 2d 69 64 20 20 63 61 74 65 67 6f 72 79 20  st-id  category 
26c0: 76 61 72 69 61 62 6c 65 20 76 61 6c 75 65 20 65  variable value e
26d0: 78 70 65 63 74 65 64 20 74 6f 6c 20 75 6e 69 74  xpected tol unit
26e0: 73 20 63 6f 6d 6d 65 6e 74 20 73 74 61 74 75 73  s comment status
26f0: 20 74 79 70 65 20 6c 61 73 74 2d 75 70 64 61 74   type last-updat
2700: 65 29 0a 20 20 28 64 62 69 3a 65 78 65 63 0a 20  e).  (dbi:exec. 
2710: 20 20 20 64 62 68 0a 20 20 20 20 22 55 50 44 41     dbh.    "UPDA
2720: 54 45 20 74 65 73 74 5f 64 61 74 61 20 53 45 54  TE test_data SET
2730: 0a 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 69  .         test_i
2740: 64 3d 3f 2c 20 63 61 74 65 67 6f 72 79 3d 3f 2c  d=?, category=?,
2750: 20 76 61 72 69 61 62 6c 65 3d 3f 2c 20 76 61 6c   variable=?, val
2760: 75 65 3d 3f 2c 20 65 78 70 65 63 74 65 64 3d 3f  ue=?, expected=?
2770: 2c 20 74 6f 6c 3d 3f 2c 20 75 6e 69 74 73 3d 3f  , tol=?, units=?
2780: 2c 20 63 6f 6d 6d 65 6e 74 3d 3f 2c 20 73 74 61  , comment=?, sta
2790: 74 75 73 3d 3f 2c 20 74 79 70 65 3d 3f 2c 20 6c  tus=?, type=?, l
27a0: 61 73 74 5f 75 70 64 61 74 65 3d 3f 0a 20 20 20  ast_update=?.   
27b0: 20 20 20 20 20 20 20 57 48 45 52 45 20 69 64 3d         WHERE id=
27c0: 3f 3b 22 0a 20 20 20 20 74 65 73 74 2d 69 64 20  ?;".    test-id 
27d0: 63 61 74 65 67 6f 72 79 20 76 61 72 69 61 62 6c  category variabl
27e0: 65 20 76 61 6c 75 65 20 65 78 70 65 63 74 65 64  e value expected
27f0: 20 74 6f 6c 20 75 6e 69 74 73 20 63 6f 6d 6d 65   tol units comme
2800: 6e 74 20 73 74 61 74 75 73 20 74 79 70 65 20 6c  nt status type l
2810: 61 73 74 2d 75 70 64 61 74 65 20 64 61 74 61 2d  ast-update data-
2820: 69 64 20 29 29 0a 0a 0a 0a 3b 3b 3d 3d 3d 3d 3d  id ))....;;=====
2830: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2840: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
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 0a 3b 3b 20 20 54 20 45 20 53 20 54 20 53 0a  =.;;  T E S T S.
2880: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
2890: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
28a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
28b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
28c0: 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 67 69 76  ========..;; giv
28d0: 65 6e 20 72 75 6e 2d 69 64 2c 20 74 65 73 74 5f  en run-id, test_
28e0: 6e 61 6d 65 20 61 6e 64 20 69 74 65 6d 5f 70 61  name and item_pa
28f0: 74 68 20 72 65 74 75 72 6e 20 74 65 73 74 2d 69  th return test-i
2900: 64 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 28 70 67  d.;;.(define (pg
2910: 64 62 3a 67 65 74 2d 74 65 73 74 2d 69 64 20 64  db:get-test-id d
2920: 62 68 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e  bh run-id test-n
2930: 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 0a 20  ame item-path). 
2940: 20 28 64 62 69 3a 67 65 74 2d 6f 6e 65 0a 20 20   (dbi:get-one.  
2950: 20 64 62 68 0a 20 20 20 22 53 45 4c 45 43 54 20   dbh.   "SELECT 
2960: 69 64 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48  id FROM tests WH
2970: 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44  ERE run_id=? AND
2980: 20 74 65 73 74 5f 6e 61 6d 65 3d 3f 20 41 4e 44   test_name=? AND
2990: 20 69 74 65 6d 5f 70 61 74 68 3d 3f 3b 22 0a 20   item_path=?;". 
29a0: 20 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61    run-id test-na
29b0: 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 29 0a 0a  me item-path))..
29c0: 28 64 65 66 69 6e 65 20 28 70 67 64 62 3a 67 65  (define (pgdb:ge
29d0: 74 2d 74 65 73 74 2d 6c 61 73 74 2d 75 70 64 61  t-test-last-upda
29e0: 74 65 20 64 62 68 20 69 64 29 0a 20 20 28 64 62  te dbh id).  (db
29f0: 69 3a 67 65 74 2d 6f 6e 65 0a 20 20 20 64 62 68  i:get-one.   dbh
2a00: 0a 20 20 20 22 53 45 4c 45 43 54 20 6c 61 73 74  .   "SELECT last
2a10: 5f 75 70 64 61 74 65 20 46 52 4f 4d 20 74 65 73  _update FROM tes
2a20: 74 73 20 57 48 45 52 45 20 69 64 3d 3f 20 3b 22  ts WHERE id=? ;"
2a30: 0a 20 20 20 69 64 20 29 29 0a 0a 0a 3b 3b 20 63  .   id ))...;; c
2a40: 72 65 61 74 65 20 6e 65 77 20 74 65 73 74 20 72  reate new test r
2a50: 65 63 6f 72 64 0a 3b 3b 0a 28 64 65 66 69 6e 65  ecord.;;.(define
2a60: 20 28 70 67 64 62 3a 69 6e 73 65 72 74 2d 74 65   (pgdb:insert-te
2a70: 73 74 20 64 62 68 20 72 75 6e 2d 69 64 20 74 65  st dbh run-id te
2a80: 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74  st-name item-pat
2a90: 68 20 73 74 61 74 65 20 73 74 61 74 75 73 20 68  h state status h
2aa0: 6f 73 74 20 63 70 75 6c 6f 61 64 20 64 69 73 6b  ost cpuload disk
2ab0: 66 72 65 65 20 75 6e 61 6d 65 20 72 75 6e 2d 64  free uname run-d
2ac0: 69 72 20 6c 6f 67 2d 66 69 6c 65 20 72 75 6e 2d  ir log-file run-
2ad0: 64 75 72 61 74 69 6f 6e 20 63 6f 6d 6d 65 6e 74  duration comment
2ae0: 20 65 76 65 6e 74 2d 74 69 6d 65 20 61 72 63 68   event-time arch
2af0: 69 76 65 64 20 6c 61 73 74 2d 75 70 64 61 74 65  ived last-update
2b00: 20 70 69 64 29 0a 20 20 28 64 62 69 3a 65 78 65   pid).  (dbi:exe
2b10: 63 0a 20 20 20 64 62 68 0a 20 20 20 22 49 4e 53  c.   dbh.   "INS
2b20: 45 52 54 20 49 4e 54 4f 20 74 65 73 74 73 20 28  ERT INTO tests (
2b30: 72 75 6e 5f 69 64 2c 74 65 73 74 5f 6e 61 6d 65  run_id,test_name
2b40: 2c 69 74 65 6d 5f 70 61 74 68 2c 73 74 61 74 65  ,item_path,state
2b50: 2c 73 74 61 74 75 73 2c 68 6f 73 74 2c 63 70 75  ,status,host,cpu
2b60: 6c 6f 61 64 2c 64 69 73 6b 66 72 65 65 2c 75 6e  load,diskfree,un
2b70: 61 6d 65 2c 72 75 6e 64 69 72 2c 66 69 6e 61 6c  ame,rundir,final
2b80: 5f 6c 6f 67 66 2c 72 75 6e 5f 64 75 72 61 74 69  _logf,run_durati
2b90: 6f 6e 2c 63 6f 6d 6d 65 6e 74 2c 65 76 65 6e 74  on,comment,event
2ba0: 5f 74 69 6d 65 2c 61 72 63 68 69 76 65 64 2c 6c  _time,archived,l
2bb0: 61 73 74 5f 75 70 64 61 74 65 2c 61 74 74 65 6d  ast_update,attem
2bc0: 70 74 6e 75 6d 29 0a 20 20 20 20 20 20 20 56 41  ptnum).       VA
2bd0: 4c 55 45 53 20 28 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c  LUES (?,?,?,?,?,
2be0: 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c  ?,?,?,?,?,?,?,?,
2bf0: 3f 2c 3f 2c 3f 2c 3f 29 3b 22 0a 0a 20 20 20 72  ?,?,?,?);"..   r
2c00: 75 6e 2d 69 64 20 20 74 65 73 74 2d 6e 61 6d 65  un-id  test-name
2c10: 20 69 74 65 6d 2d 70 61 74 68 20 20 20 20 73 74   item-path    st
2c20: 61 74 65 20 20 20 73 74 61 74 75 73 20 20 20 20  ate   status    
2c30: 20 68 6f 73 74 20 20 63 70 75 6c 6f 61 64 20 64   host  cpuload d
2c40: 69 73 6b 66 72 65 65 20 75 6e 61 6d 65 0a 20 20  iskfree uname.  
2c50: 20 72 75 6e 2d 64 69 72 20 6c 6f 67 2d 66 69 6c   run-dir log-fil
2c60: 65 20 20 72 75 6e 2d 64 75 72 61 74 69 6f 6e 20  e  run-duration 
2c70: 63 6f 6d 6d 65 6e 74 20 65 76 65 6e 74 2d 74 69  comment event-ti
2c80: 6d 65 20 61 72 63 68 69 76 65 64 20 6c 61 73 74  me archived last
2c90: 2d 75 70 64 61 74 65 20 70 69 64 29 29 0a 0a 3b  -update pid))..;
2ca0: 3b 20 75 70 64 61 74 65 20 65 78 69 73 74 69 6e  ; update existin
2cb0: 67 20 74 65 73 74 20 72 65 63 6f 72 64 0a 3b 3b  g test record.;;
2cc0: 0a 28 64 65 66 69 6e 65 20 28 70 67 64 62 3a 75  .(define (pgdb:u
2cd0: 70 64 61 74 65 2d 74 65 73 74 20 64 62 68 20 74  pdate-test dbh t
2ce0: 65 73 74 2d 69 64 20 72 75 6e 2d 69 64 20 74 65  est-id run-id te
2cf0: 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70 61 74  st-name item-pat
2d00: 68 20 73 74 61 74 65 20 73 74 61 74 75 73 20 68  h state status h
2d10: 6f 73 74 20 63 70 75 6c 6f 61 64 20 64 69 73 6b  ost cpuload disk
2d20: 66 72 65 65 20 75 6e 61 6d 65 20 72 75 6e 2d 64  free uname run-d
2d30: 69 72 20 6c 6f 67 2d 66 69 6c 65 20 72 75 6e 2d  ir log-file run-
2d40: 64 75 72 61 74 69 6f 6e 20 63 6f 6d 6d 65 6e 74  duration comment
2d50: 20 65 76 65 6e 74 2d 74 69 6d 65 20 61 72 63 68   event-time arch
2d60: 69 76 65 64 20 6c 61 73 74 2d 75 70 64 61 74 65  ived last-update
2d70: 20 70 69 64 29 0a 20 20 28 64 62 69 3a 65 78 65   pid).  (dbi:exe
2d80: 63 0a 20 20 20 64 62 68 0a 20 20 20 22 55 50 44  c.   dbh.   "UPD
2d90: 41 54 45 20 74 65 73 74 73 20 53 45 54 0a 20 20  ATE tests SET.  
2da0: 20 20 20 20 72 75 6e 5f 69 64 3d 3f 2c 74 65 73      run_id=?,tes
2db0: 74 5f 6e 61 6d 65 3d 3f 2c 69 74 65 6d 5f 70 61  t_name=?,item_pa
2dc0: 74 68 3d 3f 2c 73 74 61 74 65 3d 3f 2c 73 74 61  th=?,state=?,sta
2dd0: 74 75 73 3d 3f 2c 68 6f 73 74 3d 3f 2c 63 70 75  tus=?,host=?,cpu
2de0: 6c 6f 61 64 3d 3f 2c 64 69 73 6b 66 72 65 65 3d  load=?,diskfree=
2df0: 3f 2c 75 6e 61 6d 65 3d 3f 2c 72 75 6e 64 69 72  ?,uname=?,rundir
2e00: 3d 3f 2c 66 69 6e 61 6c 5f 6c 6f 67 66 3d 3f 2c  =?,final_logf=?,
2e10: 72 75 6e 5f 64 75 72 61 74 69 6f 6e 3d 3f 2c 63  run_duration=?,c
2e20: 6f 6d 6d 65 6e 74 3d 3f 2c 65 76 65 6e 74 5f 74  omment=?,event_t
2e30: 69 6d 65 3d 3f 2c 61 72 63 68 69 76 65 64 3d 3f  ime=?,archived=?
2e40: 2c 6c 61 73 74 5f 75 70 64 61 74 65 3d 3f 2c 61  ,last_update=?,a
2e50: 74 74 65 6d 70 74 6e 75 6d 3d 3f 0a 20 20 20 20  ttemptnum=?.    
2e60: 57 48 45 52 45 20 69 64 3d 3f 3b 22 0a 0a 20 20  WHERE id=?;"..  
2e70: 20 72 75 6e 2d 69 64 20 20 74 65 73 74 2d 6e 61   run-id  test-na
2e80: 6d 65 20 69 74 65 6d 2d 70 61 74 68 20 20 20 20  me item-path    
2e90: 73 74 61 74 65 20 20 20 73 74 61 74 75 73 20 20  state   status  
2ea0: 20 20 20 68 6f 73 74 20 20 63 70 75 6c 6f 61 64     host  cpuload
2eb0: 20 64 69 73 6b 66 72 65 65 20 75 6e 61 6d 65 0a   diskfree uname.
2ec0: 20 20 20 72 75 6e 2d 64 69 72 20 6c 6f 67 2d 66     run-dir log-f
2ed0: 69 6c 65 20 20 72 75 6e 2d 64 75 72 61 74 69 6f  ile  run-duratio
2ee0: 6e 20 63 6f 6d 6d 65 6e 74 20 65 76 65 6e 74 2d  n comment event-
2ef0: 74 69 6d 65 20 61 72 63 68 69 76 65 64 20 6c 61  time archived la
2f00: 73 74 2d 75 70 64 61 74 65 20 70 69 64 20 74 65  st-update pid te
2f10: 73 74 2d 69 64 29 29 0a 0a 28 64 65 66 69 6e 65  st-id))..(define
2f20: 20 28 70 67 64 62 3a 67 65 74 2d 74 65 73 74 73   (pgdb:get-tests
2f30: 20 64 62 68 20 74 61 72 67 65 74 2d 70 61 74 74   dbh target-patt
2f40: 29 0a 20 20 28 64 62 69 3a 67 65 74 2d 72 6f 77  ).  (dbi:get-row
2f50: 73 0a 20 20 20 64 62 68 0a 20 20 20 22 53 45 4c  s.   dbh.   "SEL
2f60: 45 43 54 20 74 2e 69 64 2c 74 2e 72 75 6e 5f 69  ECT t.id,t.run_i
2f70: 64 2c 74 2e 74 65 73 74 5f 6e 61 6d 65 2c 74 2e  d,t.test_name,t.
2f80: 69 74 65 6d 5f 70 61 74 68 2c 74 2e 73 74 61 74  item_path,t.stat
2f90: 65 2c 74 2e 73 74 61 74 75 73 2c 74 2e 68 6f 73  e,t.status,t.hos
2fa0: 74 2c 74 2e 63 70 75 6c 6f 61 64 2c 74 2e 64 69  t,t.cpuload,t.di
2fb0: 73 6b 66 72 65 65 2c 74 2e 75 6e 61 6d 65 2c 74  skfree,t.uname,t
2fc0: 2e 72 75 6e 64 69 72 2c 74 2e 66 69 6e 61 6c 5f  .rundir,t.final_
2fd0: 6c 6f 67 66 2c 74 2e 72 75 6e 5f 64 75 72 61 74  logf,t.run_durat
2fe0: 69 6f 6e 2c 74 2e 63 6f 6d 6d 65 6e 74 2c 74 2e  ion,t.comment,t.
2ff0: 65 76 65 6e 74 5f 74 69 6d 65 2c 74 2e 61 72 63  event_time,t.arc
3000: 68 69 76 65 64 2c 0a 20 20 20 20 20 20 20 20 20  hived,.         
3010: 20 20 72 2e 69 64 2c 72 2e 74 61 72 67 65 74 2c    r.id,r.target,
3020: 72 2e 74 74 79 70 65 5f 69 64 2c 72 2e 72 75 6e  r.ttype_id,r.run
3030: 5f 6e 61 6d 65 2c 72 2e 73 74 61 74 65 2c 72 2e  _name,r.state,r.
3040: 73 74 61 74 75 73 2c 72 2e 6f 77 6e 65 72 2c 72  status,r.owner,r
3050: 2e 65 76 65 6e 74 5f 74 69 6d 65 2c 72 2e 63 6f  .event_time,r.co
3060: 6d 6d 65 6e 74 0a 20 20 20 20 20 46 52 4f 4d 20  mment.     FROM 
3070: 74 65 73 74 73 20 41 53 20 74 20 49 4e 4e 45 52  tests AS t INNER
3080: 20 4a 4f 49 4e 20 72 75 6e 73 20 41 53 20 72 20   JOIN runs AS r 
3090: 4f 4e 20 74 2e 72 75 6e 5f 69 64 3d 72 2e 69 64  ON t.run_id=r.id
30a0: 0a 20 20 20 20 20 20 57 48 45 52 45 20 72 2e 74  .      WHERE r.t
30b0: 61 72 67 65 74 20 4c 49 4b 45 20 3f 3b 22 20 74  arget LIKE ?;" t
30c0: 61 72 67 65 74 2d 70 61 74 74 29 29 0a 0a 28 64  arget-patt))..(d
30d0: 65 66 69 6e 65 20 28 70 67 64 62 3a 67 65 74 2d  efine (pgdb:get-
30e0: 73 74 61 74 73 2d 67 69 76 65 6e 2d 74 79 70 65  stats-given-type
30f0: 2d 74 61 72 67 65 74 20 64 62 68 20 74 74 79 70  -target dbh ttyp
3100: 65 2d 69 64 20 74 61 72 67 65 74 2d 70 61 74 74  e-id target-patt
3110: 29 0a 20 20 28 64 62 69 3a 67 65 74 2d 72 6f 77  ).  (dbi:get-row
3120: 73 0a 20 20 20 64 62 68 0a 20 20 20 3b 3b 20 20  s.   dbh.   ;;  
3130: 20 20 22 53 45 4c 45 43 54 20 43 4f 55 4e 54 28    "SELECT COUNT(
3140: 74 2e 69 64 29 2c 74 2e 73 74 61 74 75 73 2c 72  t.id),t.status,r
3150: 2e 74 61 72 67 65 74 20 46 52 4f 4d 20 74 65 73  .target FROM tes
3160: 74 73 20 41 53 20 74 20 49 4e 4e 45 52 20 4a 4f  ts AS t INNER JO
3170: 49 4e 20 72 75 6e 73 20 41 53 20 72 20 4f 4e 20  IN runs AS r ON 
3180: 74 2e 72 75 6e 5f 69 64 3d 72 2e 69 64 0a 20 20  t.run_id=r.id.  
3190: 20 3b 3b 20 20 20 20 20 20 20 20 20 57 48 45 52   ;;         WHER
31a0: 45 20 74 2e 73 74 61 74 65 3d 27 43 4f 4d 50 4c  E t.state='COMPL
31b0: 45 54 45 44 27 20 41 4e 44 20 74 74 79 70 65 5f  ETED' AND ttype_
31c0: 69 64 3d 3f 20 41 4e 44 20 72 2e 74 61 72 67 65  id=? AND r.targe
31d0: 74 20 4c 49 4b 45 20 3f 20 47 52 4f 55 50 20 42  t LIKE ? GROUP B
31e0: 59 20 72 2e 74 61 72 67 65 74 2c 74 2e 73 74 61  Y r.target,t.sta
31f0: 74 75 73 3b 22 0a 20 20 20 22 53 45 4c 45 43 54  tus;".   "SELECT
3200: 20 72 2e 74 61 72 67 65 74 2c 43 4f 55 4e 54 28   r.target,COUNT(
3210: 2a 29 20 41 53 20 74 6f 74 61 6c 2c 0a 20 20 20  *) AS total,.   
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3230: 20 53 55 4d 28 43 41 53 45 20 57 48 45 4e 20 74   SUM(CASE WHEN t
3240: 2e 73 74 61 74 75 73 3d 27 50 41 53 53 27 20 54  .status='PASS' T
3250: 48 45 4e 20 31 20 45 4c 53 45 20 30 20 45 4e 44  HEN 1 ELSE 0 END
3260: 29 20 41 53 20 70 61 73 73 2c 0a 20 20 20 20 20  ) AS pass,.     
3270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
3280: 55 4d 28 43 41 53 45 20 57 48 45 4e 20 74 2e 73  UM(CASE WHEN t.s
3290: 74 61 74 75 73 3d 27 46 41 49 4c 27 20 54 48 45  tatus='FAIL' THE
32a0: 4e 20 31 20 45 4c 53 45 20 30 20 45 4e 44 29 20  N 1 ELSE 0 END) 
32b0: 41 53 20 66 61 69 6c 2c 0a 20 20 20 20 20 20 20  AS fail,.       
32c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 55 4d               SUM
32d0: 28 43 41 53 45 20 57 48 45 4e 20 74 2e 73 74 61  (CASE WHEN t.sta
32e0: 74 75 73 20 49 4e 20 28 27 50 41 53 53 27 2c 27  tus IN ('PASS','
32f0: 46 41 49 4c 27 29 20 54 48 45 4e 20 30 20 45 4c  FAIL') THEN 0 EL
3300: 53 45 20 31 20 45 4e 44 29 20 41 53 20 6f 74 68  SE 1 END) AS oth
3310: 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 46  er.            F
3320: 52 4f 4d 20 74 65 73 74 73 20 41 53 20 74 20 49  ROM tests AS t I
3330: 4e 4e 45 52 20 4a 4f 49 4e 20 72 75 6e 73 20 41  NNER JOIN runs A
3340: 53 20 72 20 4f 4e 20 74 2e 72 75 6e 5f 69 64 3d  S r ON t.run_id=
3350: 72 2e 69 64 0a 20 20 20 20 20 20 20 20 20 20 20  r.id.           
3360: 20 57 48 45 52 45 20 74 2e 73 74 61 74 65 3d 27   WHERE t.state='
3370: 43 4f 4d 50 4c 45 54 45 44 27 20 41 4e 44 20 74  COMPLETED' AND t
3380: 74 79 70 65 5f 69 64 3d 3f 20 41 4e 44 20 72 2e  type_id=? AND r.
3390: 74 61 72 67 65 74 20 4c 49 4b 45 20 3f 20 47 52  target LIKE ? GR
33a0: 4f 55 50 20 42 59 20 72 2e 74 61 72 67 65 74 3b  OUP BY r.target;
33b0: 22 0a 20 20 20 74 74 79 70 65 2d 69 64 20 74 61  ".   ttype-id ta
33c0: 72 67 65 74 2d 70 61 74 74 29 29 0a 0a 28 64 65  rget-patt))..(de
33d0: 66 69 6e 65 20 28 70 67 64 62 3a 67 65 74 2d 73  fine (pgdb:get-s
33e0: 74 61 74 73 2d 67 69 76 65 6e 2d 74 61 72 67 65  tats-given-targe
33f0: 74 20 64 62 68 20 74 61 72 67 65 74 2d 70 61 74  t dbh target-pat
3400: 74 29 0a 20 20 28 64 62 69 3a 67 65 74 2d 72 6f  t).  (dbi:get-ro
3410: 77 73 0a 20 20 20 64 62 68 0a 20 20 20 3b 3b 20  ws.   dbh.   ;; 
3420: 20 20 20 22 53 45 4c 45 43 54 20 43 4f 55 4e 54     "SELECT COUNT
3430: 28 74 2e 69 64 29 2c 74 2e 73 74 61 74 75 73 2c  (t.id),t.status,
3440: 72 2e 74 61 72 67 65 74 20 46 52 4f 4d 20 74 65  r.target FROM te
3450: 73 74 73 20 41 53 20 74 20 49 4e 4e 45 52 20 4a  sts AS t INNER J
3460: 4f 49 4e 20 72 75 6e 73 20 41 53 20 72 20 4f 4e  OIN runs AS r ON
3470: 20 74 2e 72 75 6e 5f 69 64 3d 72 2e 69 64 0a 20   t.run_id=r.id. 
3480: 20 20 3b 3b 20 20 20 20 20 20 20 20 20 57 48 45    ;;         WHE
3490: 52 45 20 74 2e 73 74 61 74 65 3d 27 43 4f 4d 50  RE t.state='COMP
34a0: 4c 45 54 45 44 27 20 41 4e 44 20 74 74 79 70 65  LETED' AND ttype
34b0: 5f 69 64 3d 3f 20 41 4e 44 20 72 2e 74 61 72 67  _id=? AND r.targ
34c0: 65 74 20 4c 49 4b 45 20 3f 20 47 52 4f 55 50 20  et LIKE ? GROUP 
34d0: 42 59 20 72 2e 74 61 72 67 65 74 2c 74 2e 73 74  BY r.target,t.st
34e0: 61 74 75 73 3b 22 0a 20 20 20 22 53 45 4c 45 43  atus;".   "SELEC
34f0: 54 20 72 2e 74 61 72 67 65 74 2c 43 4f 55 4e 54  T r.target,COUNT
3500: 28 2a 29 20 41 53 20 74 6f 74 61 6c 2c 0a 20 20  (*) AS total,.  
3510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3520: 20 20 53 55 4d 28 43 41 53 45 20 57 48 45 4e 20    SUM(CASE WHEN 
3530: 74 2e 73 74 61 74 75 73 3d 27 50 41 53 53 27 20  t.status='PASS' 
3540: 54 48 45 4e 20 31 20 45 4c 53 45 20 30 20 45 4e  THEN 1 ELSE 0 EN
3550: 44 29 20 41 53 20 70 61 73 73 2c 0a 20 20 20 20  D) AS pass,.    
3560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3570: 53 55 4d 28 43 41 53 45 20 57 48 45 4e 20 74 2e  SUM(CASE WHEN t.
3580: 73 74 61 74 75 73 3d 27 46 41 49 4c 27 20 54 48  status='FAIL' TH
3590: 45 4e 20 31 20 45 4c 53 45 20 30 20 45 4e 44 29  EN 1 ELSE 0 END)
35a0: 20 41 53 20 66 61 69 6c 2c 0a 20 20 20 20 20 20   AS fail,.      
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 55                SU
35c0: 4d 28 43 41 53 45 20 57 48 45 4e 20 74 2e 73 74  M(CASE WHEN t.st
35d0: 61 74 75 73 20 49 4e 20 28 27 50 41 53 53 27 2c  atus IN ('PASS',
35e0: 27 46 41 49 4c 27 29 20 54 48 45 4e 20 30 20 45  'FAIL') THEN 0 E
35f0: 4c 53 45 20 31 20 45 4e 44 29 20 41 53 20 6f 74  LSE 1 END) AS ot
3600: 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 20 20  her.            
3610: 46 52 4f 4d 20 74 65 73 74 73 20 41 53 20 74 20  FROM tests AS t 
3620: 49 4e 4e 45 52 20 4a 4f 49 4e 20 72 75 6e 73 20  INNER JOIN runs 
3630: 41 53 20 72 20 4f 4e 20 74 2e 72 75 6e 5f 69 64  AS r ON t.run_id
3640: 3d 72 2e 69 64 0a 20 20 20 20 20 20 20 20 20 20  =r.id.          
3650: 20 20 57 48 45 52 45 20 74 2e 73 74 61 74 65 3d    WHERE t.state=
3660: 27 43 4f 4d 50 4c 45 54 45 44 27 20 41 4e 44 20  'COMPLETED' AND 
3670: 72 2e 74 61 72 67 65 74 20 4c 49 4b 45 20 3f 20  r.target LIKE ? 
3680: 47 52 4f 55 50 20 42 59 20 72 2e 74 61 72 67 65  GROUP BY r.targe
3690: 74 3b 22 0a 20 20 20 74 61 72 67 65 74 2d 70 61  t;".   target-pa
36a0: 74 74 29 29 0a 0a 0a 28 64 65 66 69 6e 65 20 28  tt))...(define (
36b0: 70 67 64 62 3a 67 65 74 2d 6c 61 74 65 73 74 2d  pgdb:get-latest-
36c0: 72 75 6e 2d 73 74 61 74 73 2d 67 69 76 65 6e 2d  run-stats-given-
36d0: 74 61 72 67 65 74 20 64 62 68 20 74 74 79 70 65  target dbh ttype
36e0: 2d 69 64 20 74 61 72 67 65 74 2d 70 61 74 74 20  -id target-patt 
36f0: 6c 69 6d 69 74 20 6f 66 66 73 65 74 29 0a 20 20  limit offset).  
3700: 28 64 62 69 3a 67 65 74 2d 72 6f 77 73 0a 20 20  (dbi:get-rows.  
3710: 20 64 62 68 0a 20 20 20 3b 3b 20 20 20 20 22 53   dbh.   ;;    "S
3720: 45 4c 45 43 54 20 43 4f 55 4e 54 28 74 2e 69 64  ELECT COUNT(t.id
3730: 29 2c 74 2e 73 74 61 74 75 73 2c 72 2e 74 61 72  ),t.status,r.tar
3740: 67 65 74 20 46 52 4f 4d 20 74 65 73 74 73 20 41  get FROM tests A
3750: 53 20 74 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 72  S t INNER JOIN r
3760: 75 6e 73 20 41 53 20 72 20 4f 4e 20 74 2e 72 75  uns AS r ON t.ru
3770: 6e 5f 69 64 3d 72 2e 69 64 0a 20 20 20 3b 3b 20  n_id=r.id.   ;; 
3780: 20 20 20 20 20 20 20 20 57 48 45 52 45 20 74 2e          WHERE t.
3790: 73 74 61 74 65 3d 27 43 4f 4d 50 4c 45 54 45 44  state='COMPLETED
37a0: 27 20 41 4e 44 20 74 74 79 70 65 5f 69 64 3d 3f  ' AND ttype_id=?
37b0: 20 41 4e 44 20 72 2e 74 61 72 67 65 74 20 4c 49   AND r.target LI
37c0: 4b 45 20 3f 20 47 52 4f 55 50 20 42 59 20 72 2e  KE ? GROUP BY r.
37d0: 74 61 72 67 65 74 2c 74 2e 73 74 61 74 75 73 3b  target,t.status;
37e0: 22 0a 20 20 20 22 53 45 4c 45 43 54 20 72 2e 74  ".   "SELECT r.t
37f0: 61 72 67 65 74 2c 20 72 2e 65 76 65 6e 74 5f 74  arget, r.event_t
3800: 69 6d 65 2c 20 43 4f 55 4e 54 28 2a 29 20 41 53  ime, COUNT(*) AS
3810: 20 74 6f 74 61 6c 2c 0a 20 20 20 20 20 20 20 20   total,.        
3820: 20 20 20 20 20 20 20 20 20 20 20 20 53 55 4d 28              SUM(
3830: 43 41 53 45 20 57 48 45 4e 20 74 2e 73 74 61 74  CASE WHEN t.stat
3840: 75 73 3d 27 50 41 53 53 27 20 54 48 45 4e 20 31  us='PASS' THEN 1
3850: 20 45 4c 53 45 20 30 20 45 4e 44 29 20 41 53 20   ELSE 0 END) AS 
3860: 70 61 73 73 2c 0a 20 20 20 20 20 20 20 20 20 20  pass,.          
3870: 20 20 20 20 20 20 20 20 20 20 53 55 4d 28 43 41            SUM(CA
3880: 53 45 20 57 48 45 4e 20 74 2e 73 74 61 74 75 73  SE WHEN t.status
3890: 3d 27 46 41 49 4c 27 20 54 48 45 4e 20 31 20 45  ='FAIL' THEN 1 E
38a0: 4c 53 45 20 30 20 45 4e 44 29 20 41 53 20 66 61  LSE 0 END) AS fa
38b0: 69 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  il,.            
38c0: 20 20 20 20 20 20 20 20 53 55 4d 28 43 41 53 45          SUM(CASE
38d0: 20 57 48 45 4e 20 74 2e 73 74 61 74 75 73 20 49   WHEN t.status I
38e0: 4e 20 28 27 50 41 53 53 27 2c 27 46 41 49 4c 27  N ('PASS','FAIL'
38f0: 29 20 54 48 45 4e 20 30 20 45 4c 53 45 20 31 20  ) THEN 0 ELSE 1 
3900: 45 4e 44 29 20 41 53 20 6f 74 68 65 72 2c 20 72  END) AS other, r
3910: 2e 69 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  .id.            
3920: 46 52 4f 4d 20 74 65 73 74 73 20 41 53 20 74 20  FROM tests AS t 
3930: 49 4e 4e 45 52 20 4a 4f 49 4e 20 72 75 6e 73 20  INNER JOIN runs 
3940: 41 53 20 72 20 4f 4e 20 74 2e 72 75 6e 5f 69 64  AS r ON t.run_id
3950: 3d 72 2e 69 64 0a 20 20 20 20 20 20 20 20 20 20  =r.id.          
3960: 20 20 57 48 45 52 45 20 74 2e 73 74 61 74 65 20    WHERE t.state 
3970: 6c 69 6b 65 20 27 25 27 20 20 41 4e 44 20 74 74  like '%'  AND tt
3980: 79 70 65 5f 69 64 3d 3f 20 41 4e 44 20 72 2e 74  ype_id=? AND r.t
3990: 61 72 67 65 74 20 4c 49 4b 45 20 3f 20 0a 20 20  arget LIKE ? .  
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
39b0: 6e 64 20 72 2e 69 64 20 69 6e 20 0a 20 20 20 20  nd r.id in .    
39c0: 20 20 20 20 20 20 20 28 53 45 4c 45 43 54 20 44         (SELECT D
39d0: 49 53 54 49 4e 43 54 20 6f 6e 20 28 74 61 72 67  ISTINCT on (targ
39e0: 65 74 29 20 69 64 20 66 72 6f 6d 20 72 75 6e 73  et) id from runs
39f0: 20 77 68 65 72 65 20 74 61 72 67 65 74 20 6c 69   where target li
3a00: 6b 65 20 3f 20 41 4e 44 20 74 74 79 70 65 5f 69  ke ? AND ttype_i
3a10: 64 3d 3f 20 6f 72 64 65 72 20 62 79 20 74 61 72  d=? order by tar
3a20: 67 65 74 2c 65 76 65 6e 74 5f 74 69 6d 65 20 64  get,event_time d
3a30: 65 73 63 29 20 0a 20 20 20 20 20 20 20 20 20 20  esc) .          
3a40: 47 52 4f 55 50 20 42 59 20 72 2e 74 61 72 67 65  GROUP BY r.targe
3a50: 74 2c 72 2e 69 64 20 0a 20 20 20 20 20 20 20 20  t,r.id .        
3a60: 20 20 6f 72 64 65 72 20 62 79 20 72 2e 65 76 65    order by r.eve
3a70: 6e 74 5f 74 69 6d 65 20 64 65 73 63 20 6c 69 6d  nt_time desc lim
3a80: 69 74 20 3f 20 6f 66 66 73 65 74 20 3f 20 3b 22  it ? offset ? ;"
3a90: 0a 20 20 20 74 74 79 70 65 2d 69 64 20 74 61 72  .   ttype-id tar
3aa0: 67 65 74 2d 70 61 74 74 20 74 61 72 67 65 74 2d  get-patt target-
3ab0: 70 61 74 74 20 74 74 79 70 65 2d 69 64 20 6c 69  patt ttype-id li
3ac0: 6d 69 74 20 6f 66 66 73 65 74 29 29 0a 0a 28 64  mit offset))..(d
3ad0: 65 66 69 6e 65 20 28 70 67 64 62 3a 67 65 74 2d  efine (pgdb:get-
3ae0: 6c 61 74 65 73 74 2d 72 75 6e 2d 73 74 61 74 73  latest-run-stats
3af0: 2d 67 69 76 65 6e 2d 70 61 74 74 65 72 6e 20 64  -given-pattern d
3b00: 62 68 20 70 61 74 74 20 6c 69 6d 69 74 20 6f 66  bh patt limit of
3b10: 66 73 65 74 29 0a 20 20 28 64 62 69 3a 67 65 74  fset).  (dbi:get
3b20: 2d 72 6f 77 73 0a 20 20 20 64 62 68 0a 20 20 20  -rows.   dbh.   
3b30: 3b 3b 20 20 20 20 22 53 45 4c 45 43 54 20 43 4f  ;;    "SELECT CO
3b40: 55 4e 54 28 74 2e 69 64 29 2c 74 2e 73 74 61 74  UNT(t.id),t.stat
3b50: 75 73 2c 72 2e 74 61 72 67 65 74 20 46 52 4f 4d  us,r.target FROM
3b60: 20 74 65 73 74 73 20 41 53 20 74 20 49 4e 4e 45   tests AS t INNE
3b70: 52 20 4a 4f 49 4e 20 72 75 6e 73 20 41 53 20 72  R JOIN runs AS r
3b80: 20 4f 4e 20 74 2e 72 75 6e 5f 69 64 3d 72 2e 69   ON t.run_id=r.i
3b90: 64 0a 20 20 20 3b 3b 20 20 20 20 20 20 20 20 20  d.   ;;         
3ba0: 57 48 45 52 45 20 74 2e 73 74 61 74 65 3d 27 43  WHERE t.state='C
3bb0: 4f 4d 50 4c 45 54 45 44 27 20 41 4e 44 20 74 74  OMPLETED' AND tt
3bc0: 79 70 65 5f 69 64 3d 3f 20 41 4e 44 20 72 2e 74  ype_id=? AND r.t
3bd0: 61 72 67 65 74 20 49 4c 49 4b 45 20 3f 20 47 52  arget ILIKE ? GR
3be0: 4f 55 50 20 42 59 20 72 2e 74 61 72 67 65 74 2c  OUP BY r.target,
3bf0: 74 2e 73 74 61 74 75 73 3b 22 0a 20 20 20 22 53  t.status;".   "S
3c00: 45 4c 45 43 54 20 72 2e 74 61 72 67 65 74 2c 20  ELECT r.target, 
3c10: 72 2e 65 76 65 6e 74 5f 74 69 6d 65 2c 20 43 4f  r.event_time, CO
3c20: 55 4e 54 28 2a 29 20 41 53 20 74 6f 74 61 6c 2c  UNT(*) AS total,
3c30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3c40: 20 20 20 20 20 53 55 4d 28 43 41 53 45 20 57 48       SUM(CASE WH
3c50: 45 4e 20 74 2e 73 74 61 74 75 73 3d 27 50 41 53  EN t.status='PAS
3c60: 53 27 20 54 48 45 4e 20 31 20 45 4c 53 45 20 30  S' THEN 1 ELSE 0
3c70: 20 45 4e 44 29 20 41 53 20 70 61 73 73 2c 0a 20   END) AS pass,. 
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c90: 20 20 20 53 55 4d 28 43 41 53 45 20 57 48 45 4e     SUM(CASE WHEN
3ca0: 20 74 2e 73 74 61 74 75 73 3d 27 46 41 49 4c 27   t.status='FAIL'
3cb0: 20 54 48 45 4e 20 31 20 45 4c 53 45 20 30 20 45   THEN 1 ELSE 0 E
3cc0: 4e 44 29 20 41 53 20 66 61 69 6c 2c 0a 20 20 20  ND) AS fail,.   
3cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ce0: 20 53 55 4d 28 43 41 53 45 20 57 48 45 4e 20 74   SUM(CASE WHEN t
3cf0: 2e 73 74 61 74 75 73 20 49 4e 20 28 27 50 41 53  .status IN ('PAS
3d00: 53 27 2c 27 46 41 49 4c 27 29 20 54 48 45 4e 20  S','FAIL') THEN 
3d10: 30 20 45 4c 53 45 20 31 20 45 4e 44 29 20 41 53  0 ELSE 1 END) AS
3d20: 20 6f 74 68 65 72 2c 20 72 2e 69 64 0a 20 20 20   other, r.id.   
3d30: 20 20 20 20 20 20 20 20 20 46 52 4f 4d 20 74 65           FROM te
3d40: 73 74 73 20 41 53 20 74 20 49 4e 4e 45 52 20 4a  sts AS t INNER J
3d50: 4f 49 4e 20 72 75 6e 73 20 41 53 20 72 20 4f 4e  OIN runs AS r ON
3d60: 20 74 2e 72 75 6e 5f 69 64 3d 72 2e 69 64 0a 20   t.run_id=r.id. 
3d70: 20 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45             WHERE
3d80: 20 74 2e 73 74 61 74 65 20 6c 69 6b 65 20 27 25   t.state like '%
3d90: 27 20 20 41 4e 44 20 72 2e 74 61 72 67 65 74 20  '  AND r.target 
3da0: 49 4c 49 4b 45 20 3f 20 0a 20 20 20 20 20 20 20  ILIKE ? .       
3db0: 20 20 20 20 20 20 20 20 20 20 61 6e 64 20 72 2e            and r.
3dc0: 69 64 20 69 6e 20 0a 20 20 20 20 20 20 20 20 20  id in .         
3dd0: 20 20 28 53 45 4c 45 43 54 20 44 49 53 54 49 4e    (SELECT DISTIN
3de0: 43 54 20 6f 6e 20 28 74 61 72 67 65 74 29 20 69  CT on (target) i
3df0: 64 20 66 72 6f 6d 20 72 75 6e 73 20 77 68 65 72  d from runs wher
3e00: 65 20 74 61 72 67 65 74 20 69 6c 69 6b 65 20 3f  e target ilike ?
3e10: 20 20 6f 72 64 65 72 20 62 79 20 74 61 72 67 65    order by targe
3e20: 74 2c 65 76 65 6e 74 5f 74 69 6d 65 20 64 65 73  t,event_time des
3e30: 63 29 20 0a 20 20 20 20 20 20 20 20 20 20 47 52  c) .          GR
3e40: 4f 55 50 20 42 59 20 72 2e 74 61 72 67 65 74 2c  OUP BY r.target,
3e50: 72 2e 69 64 20 0a 20 20 20 20 20 20 20 20 20 20  r.id .          
3e60: 6f 72 64 65 72 20 62 79 20 72 2e 65 76 65 6e 74  order by r.event
3e70: 5f 74 69 6d 65 20 64 65 73 63 20 6c 69 6d 69 74  _time desc limit
3e80: 20 3f 20 6f 66 66 73 65 74 20 3f 20 3b 22 0a 20   ? offset ? ;". 
3e90: 20 20 70 61 74 74 20 70 61 74 74 20 20 6c 69 6d    patt patt  lim
3ea0: 69 74 20 6f 66 66 73 65 74 29 29 0a 0a 0a 28 64  it offset))...(d
3eb0: 65 66 69 6e 65 20 28 70 67 64 62 3a 67 65 74 2d  efine (pgdb:get-
3ec0: 63 6f 75 6e 74 2d 64 61 74 61 2d 73 74 61 74 73  count-data-stats
3ed0: 2d 74 61 72 67 65 74 2d 6c 61 74 65 73 74 20 64  -target-latest d
3ee0: 62 68 20 74 74 79 70 65 2d 69 64 20 74 61 72 67  bh ttype-id targ
3ef0: 65 74 2d 70 61 74 74 29 0a 20 20 28 64 62 69 3a  et-patt).  (dbi:
3f00: 67 65 74 2d 72 6f 77 73 0a 20 20 20 64 62 68 0a  get-rows.   dbh.
3f10: 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e      "SELECT coun
3f20: 74 28 2a 29 20 20 66 72 6f 6d 20 0a 20 20 20 20  t(*)  from .    
3f30: 20 20 20 20 20 20 28 53 45 4c 45 43 54 20 44 49        (SELECT DI
3f40: 53 54 49 4e 43 54 20 6f 6e 20 28 74 61 72 67 65  STINCT on (targe
3f50: 74 29 20 69 64 20 0a 09 09 66 72 6f 6d 20 72 75  t) id ...from ru
3f60: 6e 73 20 77 68 65 72 65 20 74 61 72 67 65 74 20  ns where target 
3f70: 6c 69 6b 65 20 3f 20 41 4e 44 20 74 74 79 70 65  like ? AND ttype
3f80: 5f 69 64 20 3d 20 3f 20 0a 09 09 6f 72 64 65 72  _id = ? ...order
3f90: 20 62 79 20 74 61 72 67 65 74 2c 20 65 76 65 6e   by target, even
3fa0: 74 5f 74 69 6d 65 20 64 65 73 63 0a 20 20 20 20  t_time desc.    
3fb0: 20 20 20 20 20 20 29 20 61 73 20 78 3b 22 20 0a        ) as x;" .
3fc0: 20 20 20 20 74 61 72 67 65 74 2d 70 61 74 74 20      target-patt 
3fd0: 74 74 79 70 65 2d 69 64 29 29 0a 0a 28 64 65 66  ttype-id))..(def
3fe0: 69 6e 65 20 20 28 70 67 64 62 3a 67 65 74 2d 6c  ine  (pgdb:get-l
3ff0: 61 74 65 73 74 2d 72 75 6e 2d 63 6e 74 20 64 62  atest-run-cnt db
4000: 68 20 74 74 79 70 65 2d 69 64 20 74 61 72 67 65  h ttype-id targe
4010: 74 2d 70 61 74 74 29 0a 20 20 28 6c 65 74 2a 20  t-patt).  (let* 
4020: 28 28 63 6e 74 2d 72 65 73 75 6c 74 20 28 70 67  ((cnt-result (pg
4030: 64 62 3a 67 65 74 2d 63 6f 75 6e 74 2d 64 61 74  db:get-count-dat
4040: 61 2d 73 74 61 74 73 2d 74 61 72 67 65 74 2d 6c  a-stats-target-l
4050: 61 74 65 73 74 20 64 62 68 20 74 74 79 70 65 2d  atest dbh ttype-
4060: 69 64 20 74 61 72 67 65 74 2d 70 61 74 74 29 29  id target-patt))
4070: 0a 20 20 20 20 20 20 20 20 20 3b 28 63 6e 74 2d  .         ;(cnt-
4080: 72 6f 77 20 28 63 61 72 20 28 63 6e 74 2d 72 65  row (car (cnt-re
4090: 73 75 6c 74 29 29 29 0a 20 20 20 20 20 20 20 20  sult))).        
40a0: 20 28 63 6e 74 20 30 29 20 0a 20 20 20 20 20 20   (cnt 0) .      
40b0: 20 29 0a 20 20 20 20 28 66 6f 72 2d 65 61 63 68   ).    (for-each
40c0: 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 72  .     (lambda (r
40d0: 6f 77 29 0a 20 20 20 20 20 20 28 73 65 74 21 20  ow).      (set! 
40e0: 63 6e 74 20 20 28 76 65 63 74 6f 72 2d 72 65 66  cnt  (vector-ref
40f0: 20 72 6f 77 20 30 20 29 29 29 20 0a 20 20 20 20   row 0 ))) .    
4100: 20 63 6e 74 2d 72 65 73 75 6c 74 29 0a 0a 63 6e   cnt-result)..cn
4110: 74 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 70 67  t))..(define (pg
4120: 64 62 3a 67 65 74 2d 63 6f 75 6e 74 2d 64 61 74  db:get-count-dat
4130: 61 2d 73 74 61 74 73 2d 6c 61 74 65 73 74 2d 70  a-stats-latest-p
4140: 61 74 74 65 72 6e 20 64 62 68 20 70 61 74 74 29  attern dbh patt)
4150: 0a 20 20 28 64 62 69 3a 67 65 74 2d 72 6f 77 73  .  (dbi:get-rows
4160: 0a 20 20 20 64 62 68 0a 20 20 20 20 22 53 45 4c  .   dbh.    "SEL
4170: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 20 66 72  ECT count(*)  fr
4180: 6f 6d 20 0a 20 20 20 20 20 20 20 20 20 20 28 53  om .          (S
4190: 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 6f  ELECT DISTINCT o
41a0: 6e 20 28 74 61 72 67 65 74 29 20 69 64 20 0a 09  n (target) id ..
41b0: 09 66 72 6f 6d 20 72 75 6e 73 20 77 68 65 72 65  .from runs where
41c0: 20 74 61 72 67 65 74 20 69 6c 69 6b 65 20 3f 20   target ilike ? 
41d0: 20 0a 09 09 6f 72 64 65 72 20 62 79 20 74 61 72   ...order by tar
41e0: 67 65 74 2c 20 65 76 65 6e 74 5f 74 69 6d 65 20  get, event_time 
41f0: 64 65 73 63 0a 20 20 20 20 20 20 20 20 20 20 29  desc.          )
4200: 20 61 73 20 78 3b 22 20 0a 20 20 20 20 70 61 74   as x;" .    pat
4210: 74 29 29 0a 0a 28 64 65 66 69 6e 65 20 20 28 70  t))..(define  (p
4220: 67 64 62 3a 67 65 74 2d 6c 61 74 65 73 74 2d 72  gdb:get-latest-r
4230: 75 6e 2d 63 6e 74 2d 62 79 2d 70 61 74 74 65 72  un-cnt-by-patter
4240: 6e 20 64 62 68 20 74 61 72 67 65 74 2d 70 61 74  n dbh target-pat
4250: 74 29 0a 20 20 28 6c 65 74 2a 20 28 28 63 6e 74  t).  (let* ((cnt
4260: 2d 72 65 73 75 6c 74 20 28 70 67 64 62 3a 67 65  -result (pgdb:ge
4270: 74 2d 63 6f 75 6e 74 2d 64 61 74 61 2d 73 74 61  t-count-data-sta
4280: 74 73 2d 6c 61 74 65 73 74 2d 70 61 74 74 65 72  ts-latest-patter
4290: 6e 20 64 62 68 20 74 61 72 67 65 74 2d 70 61 74  n dbh target-pat
42a0: 74 29 29 0a 20 20 20 20 20 20 20 20 20 3b 28 63  t)).         ;(c
42b0: 6e 74 2d 72 6f 77 20 28 63 61 72 20 28 63 6e 74  nt-row (car (cnt
42c0: 2d 72 65 73 75 6c 74 29 29 29 0a 20 20 20 20 20  -result))).     
42d0: 20 20 20 20 28 63 6e 74 20 30 29 20 0a 20 20 20      (cnt 0) .   
42e0: 20 20 20 20 29 0a 20 20 20 20 28 66 6f 72 2d 65      ).    (for-e
42f0: 61 63 68 0a 20 20 20 20 20 28 6c 61 6d 62 64 61  ach.     (lambda
4300: 20 28 72 6f 77 29 0a 20 20 20 20 20 20 28 73 65   (row).      (se
4310: 74 21 20 63 6e 74 20 20 28 76 65 63 74 6f 72 2d  t! cnt  (vector-
4320: 72 65 66 20 72 6f 77 20 30 20 29 29 29 20 0a 20  ref row 0 ))) . 
4330: 20 20 20 20 63 6e 74 2d 72 65 73 75 6c 74 29 0a      cnt-result).
4340: 0a 63 6e 74 29 29 0a 0a 0a 0a 0a 0a 28 64 65 66  .cnt))......(def
4350: 69 6e 65 20 28 70 67 64 62 3a 67 65 74 2d 72 75  ine (pgdb:get-ru
4360: 6e 2d 73 74 61 74 73 2d 68 69 73 74 6f 72 79 2d  n-stats-history-
4370: 67 69 76 65 6e 2d 74 61 72 67 65 74 20 64 62 68  given-target dbh
4380: 20 74 74 79 70 65 2d 69 64 20 74 61 72 67 65 74   ttype-id target
4390: 2d 70 61 74 74 29 0a 20 20 28 64 62 69 3a 67 65  -patt).  (dbi:ge
43a0: 74 2d 72 6f 77 73 0a 20 20 20 64 62 68 0a 20 20  t-rows.   dbh.  
43b0: 20 3b 3b 20 20 20 20 22 53 45 4c 45 43 54 20 43   ;;    "SELECT C
43c0: 4f 55 4e 54 28 74 2e 69 64 29 2c 74 2e 73 74 61  OUNT(t.id),t.sta
43d0: 74 75 73 2c 72 2e 74 61 72 67 65 74 20 46 52 4f  tus,r.target FRO
43e0: 4d 20 74 65 73 74 73 20 41 53 20 74 20 49 4e 4e  M tests AS t INN
43f0: 45 52 20 4a 4f 49 4e 20 72 75 6e 73 20 41 53 20  ER JOIN runs AS 
4400: 72 20 4f 4e 20 74 2e 72 75 6e 5f 69 64 3d 72 2e  r ON t.run_id=r.
4410: 69 64 0a 20 20 20 3b 3b 20 20 20 20 20 20 20 20  id.   ;;        
4420: 20 57 48 45 52 45 20 74 2e 73 74 61 74 65 3d 27   WHERE t.state='
4430: 43 4f 4d 50 4c 45 54 45 44 27 20 41 4e 44 20 74  COMPLETED' AND t
4440: 74 79 70 65 5f 69 64 3d 3f 20 41 4e 44 20 72 2e  type_id=? AND r.
4450: 74 61 72 67 65 74 20 4c 49 4b 45 20 3f 20 47 52  target LIKE ? GR
4460: 4f 55 50 20 42 59 20 72 2e 74 61 72 67 65 74 2c  OUP BY r.target,
4470: 74 2e 73 74 61 74 75 73 3b 22 0a 20 20 20 22 53  t.status;".   "S
4480: 45 4c 45 43 54 20 72 2e 72 75 6e 5f 6e 61 6d 65  ELECT r.run_name
4490: 2c 43 4f 55 4e 54 28 2a 29 20 41 53 20 74 6f 74  ,COUNT(*) AS tot
44a0: 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  al,.            
44b0: 20 20 20 20 20 20 20 20 53 55 4d 28 43 41 53 45          SUM(CASE
44c0: 20 57 48 45 4e 20 74 2e 73 74 61 74 75 73 3d 27   WHEN t.status='
44d0: 50 41 53 53 27 20 54 48 45 4e 20 31 20 45 4c 53  PASS' THEN 1 ELS
44e0: 45 20 30 20 45 4e 44 29 20 41 53 20 70 61 73 73  E 0 END) AS pass
44f0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
4500: 20 20 20 20 20 20 53 55 4d 28 43 41 53 45 20 57        SUM(CASE W
4510: 48 45 4e 20 74 2e 73 74 61 74 75 73 3d 27 46 41  HEN t.status='FA
4520: 49 4c 27 20 54 48 45 4e 20 31 20 45 4c 53 45 20  IL' THEN 1 ELSE 
4530: 30 20 45 4e 44 29 20 41 53 20 66 61 69 6c 2c 0a  0 END) AS fail,.
4540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4550: 20 20 20 20 53 55 4d 28 43 41 53 45 20 57 48 45      SUM(CASE WHE
4560: 4e 20 74 2e 73 74 61 74 75 73 20 49 4e 20 28 27  N t.status IN ('
4570: 50 41 53 53 27 2c 27 46 41 49 4c 27 29 20 54 48  PASS','FAIL') TH
4580: 45 4e 20 30 20 45 4c 53 45 20 31 20 45 4e 44 29  EN 0 ELSE 1 END)
4590: 20 41 53 20 6f 74 68 65 72 0a 20 20 20 20 20 20   AS other.      
45a0: 20 20 20 20 20 20 46 52 4f 4d 20 74 65 73 74 73        FROM tests
45b0: 20 41 53 20 74 20 49 4e 4e 45 52 20 4a 4f 49 4e   AS t INNER JOIN
45c0: 20 72 75 6e 73 20 41 53 20 72 20 4f 4e 20 74 2e   runs AS r ON t.
45d0: 72 75 6e 5f 69 64 3d 72 2e 69 64 0a 20 20 20 20  run_id=r.id.    
45e0: 20 20 20 20 20 20 20 20 57 48 45 52 45 20 74 2e          WHERE t.
45f0: 73 74 61 74 65 20 6c 69 6b 65 20 27 25 27 20 20  state like '%'  
4600: 41 4e 44 20 74 74 79 70 65 5f 69 64 3d 3f 20 41  AND ttype_id=? A
4610: 4e 44 20 72 2e 74 61 72 67 65 74 20 4c 49 4b 45  ND r.target LIKE
4620: 20 3f 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   ? .            
4630: 20 20 20 20 20 47 52 4f 55 50 20 42 59 20 72 2e       GROUP BY r.
4640: 72 75 6e 5f 6e 61 6d 65 3b 22 0a 20 20 20 74 74  run_name;".   tt
4650: 79 70 65 2d 69 64 20 74 61 72 67 65 74 2d 70 61  ype-id target-pa
4660: 74 74 20 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  tt ))..(define (
4670: 70 67 64 62 3a 67 65 74 2d 61 6c 6c 2d 72 75 6e  pgdb:get-all-run
4680: 2d 73 74 61 74 73 2d 74 61 72 67 65 74 2d 73 6c  -stats-target-sl
4690: 69 63 65 20 64 62 68 20 74 61 72 67 65 74 2d 70  ice dbh target-p
46a0: 61 74 74 20 6c 69 6d 69 74 20 6f 66 66 73 65 74  att limit offset
46b0: 29 0a 20 20 20 20 28 64 62 69 3a 67 65 74 2d 72  ).    (dbi:get-r
46c0: 6f 77 73 0a 20 20 20 20 64 62 68 0a 20 20 20 20  ows.    dbh.    
46d0: 22 53 45 4c 45 43 54 20 20 72 2e 74 61 72 67 65  "SELECT  r.targe
46e0: 74 2c 20 72 2e 72 75 6e 5f 6e 61 6d 65 2c 72 2e  t, r.run_name,r.
46f0: 65 76 65 6e 74 5f 74 69 6d 65 2c 20 43 4f 55 4e  event_time, COUN
4700: 54 28 2a 29 20 41 53 20 74 6f 74 61 6c 2c 0a 20  T(*) AS total,. 
4710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4720: 20 20 20 53 55 4d 28 43 41 53 45 20 57 48 45 4e     SUM(CASE WHEN
4730: 20 74 2e 73 74 61 74 75 73 3d 27 50 41 53 53 27   t.status='PASS'
4740: 20 54 48 45 4e 20 31 20 45 4c 53 45 20 30 20 45   THEN 1 ELSE 0 E
4750: 4e 44 29 20 41 53 20 70 61 73 73 2c 0a 20 20 20  ND) AS pass,.   
4760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4770: 20 53 55 4d 28 43 41 53 45 20 57 48 45 4e 20 74   SUM(CASE WHEN t
4780: 2e 73 74 61 74 75 73 3d 27 46 41 49 4c 27 20 54  .status='FAIL' T
4790: 48 45 4e 20 31 20 45 4c 53 45 20 30 20 45 4e 44  HEN 1 ELSE 0 END
47a0: 29 20 41 53 20 66 61 69 6c 2c 0a 20 20 20 20 20  ) AS fail,.     
47b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
47c0: 55 4d 28 43 41 53 45 20 57 48 45 4e 20 74 2e 73  UM(CASE WHEN t.s
47d0: 74 61 74 75 73 20 49 4e 20 28 27 50 41 53 53 27  tatus IN ('PASS'
47e0: 2c 27 46 41 49 4c 27 29 20 54 48 45 4e 20 30 20  ,'FAIL') THEN 0 
47f0: 45 4c 53 45 20 31 20 45 4e 44 29 20 41 53 20 6f  ELSE 1 END) AS o
4800: 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 20  ther.           
4810: 20 46 52 4f 4d 20 74 65 73 74 73 20 41 53 20 74   FROM tests AS t
4820: 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 72 75 6e 73   INNER JOIN runs
4830: 20 41 53 20 72 20 4f 4e 20 74 2e 72 75 6e 5f 69   AS r ON t.run_i
4840: 64 3d 72 2e 69 64 0a 20 20 20 20 20 20 20 20 20  d=r.id.         
4850: 20 20 20 57 48 45 52 45 20 72 2e 74 61 72 67 65     WHERE r.targe
4860: 74 20 4c 49 4b 45 20 3f 20 0a 20 20 20 20 20 20  t LIKE ? .      
4870: 20 20 20 20 20 20 47 52 4f 55 50 20 42 59 20 72        GROUP BY r
4880: 2e 74 61 72 67 65 74 2c 72 2e 72 75 6e 5f 6e 61  .target,r.run_na
4890: 6d 65 2c 20 72 2e 65 76 65 6e 74 5f 74 69 6d 65  me, r.event_time
48a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 72  .             or
48b0: 64 65 72 20 62 79 20 72 2e 74 61 72 67 65 74 2c  der by r.target,
48c0: 72 2e 65 76 65 6e 74 5f 74 69 6d 65 20 64 65 73  r.event_time des
48d0: 63 20 6c 69 6d 69 74 20 20 3f 20 6f 66 66 73 65  c limit  ? offse
48e0: 74 20 3f 20 20 20 3b 22 0a 20 20 20 20 74 61 72  t ?   ;".    tar
48f0: 67 65 74 2d 70 61 74 74 20 6c 69 6d 69 74 20 6f  get-patt limit o
4900: 66 66 73 65 74 29 29 0a 20 20 20 20 20 0a 0a 28  ffset)).     ..(
4910: 64 65 66 69 6e 65 20 28 70 67 64 62 3a 67 65 74  define (pgdb:get
4920: 2d 63 6f 75 6e 74 2d 64 61 74 61 2d 73 74 61 74  -count-data-stat
4930: 73 2d 74 61 72 67 65 74 2d 73 6c 69 63 65 20 64  s-target-slice d
4940: 62 68 20 74 61 72 67 65 74 2d 70 61 74 74 29 0a  bh target-patt).
4950: 20 20 28 64 62 69 3a 67 65 74 2d 72 6f 77 73 0a    (dbi:get-rows.
4960: 20 20 20 64 62 68 0a 20 20 20 20 22 53 45 4c 45     dbh.    "SELE
4970: 43 54 20 63 6f 75 6e 74 28 2a 29 20 20 66 72 6f  CT count(*)  fro
4980: 6d 20 28 53 45 4c 45 43 54 20 20 72 2e 74 61 72  m (SELECT  r.tar
4990: 67 65 74 2c 20 72 2e 72 75 6e 5f 6e 61 6d 65 2c  get, r.run_name,
49a0: 72 2e 65 76 65 6e 74 5f 74 69 6d 65 2c 20 43 4f  r.event_time, CO
49b0: 55 4e 54 28 2a 29 20 41 53 20 74 6f 74 61 6c 0a  UNT(*) AS total.
49c0: 20 20 20 20 20 20 20 20 20 20 20 20 46 52 4f 4d              FROM
49d0: 20 74 65 73 74 73 20 41 53 20 74 20 49 4e 4e 45   tests AS t INNE
49e0: 52 20 4a 4f 49 4e 20 72 75 6e 73 20 41 53 20 72  R JOIN runs AS r
49f0: 20 4f 4e 20 74 2e 72 75 6e 5f 69 64 3d 72 2e 69   ON t.run_id=r.i
4a00: 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 57 48  d.            WH
4a10: 45 52 45 20 72 2e 74 61 72 67 65 74 20 4c 49 4b  ERE r.target LIK
4a20: 45 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20  E ?.            
4a30: 47 52 4f 55 50 20 42 59 20 72 2e 74 61 72 67 65  GROUP BY r.targe
4a40: 74 2c 72 2e 72 75 6e 5f 6e 61 6d 65 2c 20 72 2e  t,r.run_name, r.
4a50: 65 76 65 6e 74 5f 74 69 6d 65 20 0a 20 20 20 20  event_time .    
4a60: 20 20 20 20 20 20 29 20 61 73 20 78 3b 22 20 0a        ) as x;" .
4a70: 20 20 20 20 74 61 72 67 65 74 2d 70 61 74 74 29      target-patt)
4a80: 29 0a 0a 28 64 65 66 69 6e 65 20 20 28 70 67 64  )..(define  (pgd
4a90: 62 3a 67 65 74 2d 73 6c 69 63 65 2d 63 6e 74 20  b:get-slice-cnt 
4aa0: 64 62 68 20 74 61 72 67 65 74 2d 70 61 74 74 29  dbh target-patt)
4ab0: 0a 20 20 28 6c 65 74 2a 20 28 28 63 6e 74 2d 72  .  (let* ((cnt-r
4ac0: 65 73 75 6c 74 20 28 70 67 64 62 3a 67 65 74 2d  esult (pgdb:get-
4ad0: 63 6f 75 6e 74 2d 64 61 74 61 2d 73 74 61 74 73  count-data-stats
4ae0: 2d 74 61 72 67 65 74 2d 73 6c 69 63 65 20 64 62  -target-slice db
4af0: 68 20 74 61 72 67 65 74 2d 70 61 74 74 29 29 0a  h target-patt)).
4b00: 20 20 20 20 20 20 20 20 20 3b 28 63 6e 74 2d 72           ;(cnt-r
4b10: 6f 77 20 28 63 61 72 20 28 63 6e 74 2d 72 65 73  ow (car (cnt-res
4b20: 75 6c 74 29 29 29 0a 20 20 20 20 20 20 20 20 20  ult))).         
4b30: 28 63 6e 74 20 30 29 20 0a 20 20 20 20 20 20 20  (cnt 0) .       
4b40: 29 0a 20 20 20 20 28 66 6f 72 2d 65 61 63 68 0a  ).    (for-each.
4b50: 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 72 6f       (lambda (ro
4b60: 77 29 0a 20 20 20 20 20 20 28 73 65 74 21 20 63  w).      (set! c
4b70: 6e 74 20 20 28 76 65 63 74 6f 72 2d 72 65 66 20  nt  (vector-ref 
4b80: 72 6f 77 20 30 20 29 29 29 20 0a 20 20 20 20 20  row 0 ))) .     
4b90: 63 6e 74 2d 72 65 73 75 6c 74 29 0a 0a 63 6e 74  cnt-result)..cnt
4ba0: 29 29 0a 20 20 20 0a 0a 28 64 65 66 69 6e 65 20  )).   ..(define 
4bb0: 28 70 67 64 62 3a 67 65 74 2d 74 61 72 67 65 74  (pgdb:get-target
4bc0: 2d 74 79 70 65 73 20 64 62 68 29 0a 20 20 28 64  -types dbh).  (d
4bd0: 62 69 3a 67 65 74 2d 72 6f 77 73 20 64 62 68 20  bi:get-rows dbh 
4be0: 22 53 45 4c 45 43 54 20 69 64 2c 74 61 72 67 65  "SELECT id,targe
4bf0: 74 5f 73 70 65 63 20 46 52 4f 4d 20 74 74 79 70  t_spec FROM ttyp
4c00: 65 3b 22 29 29 0a 20 0a 20 28 64 65 66 69 6e 65  e;")). . (define
4c10: 20 28 70 67 64 62 3a 67 65 74 2d 64 69 73 74 69   (pgdb:get-disti
4c20: 63 74 2d 74 61 72 67 65 74 2d 73 6c 69 63 65 20  ct-target-slice 
4c30: 64 62 68 29 0a 20 20 28 64 62 69 3a 67 65 74 2d  dbh).  (dbi:get-
4c40: 72 6f 77 73 20 64 62 68 20 22 20 73 65 6c 65 63  rows dbh " selec
4c50: 74 20 64 69 73 74 69 6e 63 74 20 6f 6e 20 28 73  t distinct on (s
4c60: 70 6c 69 74 5f 70 61 72 74 20 28 74 61 72 67 65  plit_part (targe
4c70: 74 2c 20 27 2f 27 2c 20 31 29 29 20 28 73 70 6c  t, '/', 1)) (spl
4c80: 69 74 5f 70 61 72 74 20 28 74 61 72 67 65 74 2c  it_part (target,
4c90: 20 27 2f 27 2c 20 31 29 29 20 66 72 6f 6d 20 72   '/', 1)) from r
4ca0: 75 6e 73 3b 22 29 29 0a 0a 20 20 28 64 65 66 69  uns;"))..  (defi
4cb0: 6e 65 20 28 70 67 64 62 3a 67 65 74 2d 64 69 73  ne (pgdb:get-dis
4cc0: 74 69 63 74 2d 74 61 72 67 65 74 2d 73 6c 69 63  tict-target-slic
4cd0: 65 33 20 64 62 68 29 0a 20 20 28 64 62 69 3a 67  e3 dbh).  (dbi:g
4ce0: 65 74 2d 72 6f 77 73 20 64 62 68 20 22 20 73 65  et-rows dbh " se
4cf0: 6c 65 63 74 20 64 69 73 74 69 6e 63 74 20 6f 6e  lect distinct on
4d00: 20 28 73 70 6c 69 74 5f 70 61 72 74 20 28 74 61   (split_part (ta
4d10: 72 67 65 74 2c 20 27 2f 27 2c 20 33 29 29 20 28  rget, '/', 3)) (
4d20: 73 70 6c 69 74 5f 70 61 72 74 20 28 74 61 72 67  split_part (targ
4d30: 65 74 2c 20 27 2f 27 2c 20 33 29 29 20 66 72 6f  et, '/', 3)) fro
4d40: 6d 20 72 75 6e 73 3b 22 29 29 0a 3b 3b 20 0a 28  m runs;")).;; .(
4d50: 64 65 66 69 6e 65 20 28 70 67 64 62 3a 67 65 74  define (pgdb:get
4d60: 2d 74 61 72 67 65 74 73 20 64 62 68 20 74 61 72  -targets dbh tar
4d70: 67 65 74 2d 70 61 74 74 29 0a 20 20 28 6c 65 74  get-patt).  (let
4d80: 20 28 28 74 74 79 70 65 73 20 28 70 67 64 62 3a   ((ttypes (pgdb:
4d90: 67 65 74 2d 74 61 72 67 65 74 2d 74 79 70 65 73  get-target-types
4da0: 20 64 62 68 29 29 29 0a 20 20 20 20 28 6d 61 70   dbh))).    (map
4db0: 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28 74  .     (lambda (t
4dc0: 74 79 70 65 2d 64 61 74 29 0a 20 20 20 20 20 20  type-dat).      
4dd0: 20 28 6c 65 74 20 28 28 74 74 2d 69 64 20 28 76   (let ((tt-id (v
4de0: 65 63 74 6f 72 2d 72 65 66 20 74 74 79 70 65 2d  ector-ref ttype-
4df0: 64 61 74 20 30 29 29 0a 09 20 20 20 20 20 28 74  dat 0))..     (t
4e00: 74 79 70 65 20 28 76 65 63 74 6f 72 2d 72 65 66  type (vector-ref
4e10: 20 74 74 79 70 65 2d 64 61 74 20 31 29 29 29 0a   ttype-dat 1))).
4e20: 09 20 28 63 6f 6e 73 20 74 74 79 70 65 0a 09 20  . (cons ttype.. 
4e30: 20 20 20 20 20 20 28 64 62 69 3a 67 65 74 2d 72        (dbi:get-r
4e40: 6f 77 73 20 0a 09 09 64 62 68 0a 09 09 22 53 45  ows ...dbh..."SE
4e50: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 74 61  LECT DISTINCT ta
4e60: 72 67 65 74 20 46 52 4f 4d 20 72 75 6e 73 20 57  rget FROM runs W
4e70: 48 45 52 45 20 74 61 72 67 65 74 20 4c 49 4b 45  HERE target LIKE
4e80: 20 3f 20 41 4e 44 20 74 74 79 70 65 5f 69 64 3d   ? AND ttype_id=
4e90: 3f 3b 22 20 74 61 72 67 65 74 2d 70 61 74 74 20  ?;" target-patt 
4ea0: 74 74 2d 69 64 29 29 0a 09 20 29 29 0a 20 20 20  tt-id)).. )).   
4eb0: 20 20 74 74 79 70 65 73 29 29 29 0a 0a 28 64 65    ttypes)))..(de
4ec0: 66 69 6e 65 20 28 70 67 64 62 3a 67 65 74 2d 74  fine (pgdb:get-t
4ed0: 61 72 67 65 74 73 2d 6f 66 2d 74 79 70 65 20 64  argets-of-type d
4ee0: 62 68 20 74 74 79 70 65 2d 69 64 20 74 61 72 67  bh ttype-id targ
4ef0: 65 74 2d 70 61 74 74 29 0a 20 20 28 64 62 69 3a  et-patt).  (dbi:
4f00: 67 65 74 2d 72 6f 77 73 20 64 62 68 20 22 53 45  get-rows dbh "SE
4f10: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 74 61  LECT DISTINCT ta
4f20: 72 67 65 74 20 46 52 4f 4d 20 72 75 6e 73 20 57  rget FROM runs W
4f30: 48 45 52 45 20 74 61 72 67 65 74 20 4c 49 4b 45  HERE target LIKE
4f40: 20 3f 20 41 4e 44 20 74 74 79 70 65 5f 69 64 3d   ? AND ttype_id=
4f50: 3f 3b 22 20 74 61 72 67 65 74 2d 70 61 74 74 20  ?;" target-patt 
4f60: 74 74 79 70 65 2d 69 64 29 29 0a 0a 28 64 65 66  ttype-id))..(def
4f70: 69 6e 65 20 28 70 67 64 62 3a 67 65 74 2d 72 75  ine (pgdb:get-ru
4f80: 6e 73 2d 62 79 2d 74 61 72 67 65 74 20 64 62 68  ns-by-target dbh
4f90: 20 74 61 72 67 65 74 73 20 72 75 6e 2d 70 61 74   targets run-pat
4fa0: 74 29 0a 20 20 20 28 64 62 69 3a 67 65 74 2d 72  t).   (dbi:get-r
4fb0: 6f 77 73 20 64 62 68 20 22 53 45 4c 45 43 54 20  ows dbh "SELECT 
4fc0: 72 2e 72 75 6e 5f 6e 61 6d 65 2c 20 74 2e 74 65  r.run_name, t.te
4fd0: 73 74 5f 6e 61 6d 65 2c 20 74 2e 73 74 61 74 75  st_name, t.statu
4fe0: 73 2c 20 74 2e 69 74 65 6d 5f 70 61 74 68 2c 20  s, t.item_path, 
4ff0: 74 2e 69 64 2c 20 74 2e 72 75 6e 64 69 72 2c 20  t.id, t.rundir, 
5000: 74 2e 66 69 6e 61 6c 5f 6c 6f 67 66 20 46 52 4f  t.final_logf FRO
5010: 4d 20 72 75 6e 73 20 61 73 20 72 20 49 4e 4e 45  M runs as r INNE
5020: 52 20 4a 4f 49 4e 20 74 65 73 74 73 20 41 53 20  R JOIN tests AS 
5030: 74 20 4f 4e 20 74 2e 72 75 6e 5f 69 64 3d 72 2e  t ON t.run_id=r.
5040: 69 64 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  id  .           
5050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
5060: 48 45 52 45 20 74 2e 73 74 61 74 65 3d 27 43 4f  HERE t.state='CO
5070: 4d 50 4c 45 54 45 44 27 20 41 4e 44 20 72 2e 74  MPLETED' AND r.t
5080: 61 72 67 65 74 20 6c 69 6b 65 20 3f 20 41 4e 44  arget like ? AND
5090: 20 20 72 2e 72 75 6e 5f 6e 61 6d 65 20 6c 69 6b    r.run_name lik
50a0: 65 20 3f 3b 22 20 74 61 72 67 65 74 73 20 72 75  e ?;" targets ru
50b0: 6e 2d 70 61 74 74 29 0a 29 0a 0a 28 64 65 66 69  n-patt).)..(defi
50c0: 6e 65 20 28 70 67 64 62 3a 67 65 74 2d 74 65 73  ne (pgdb:get-tes
50d0: 74 2d 62 79 2d 69 64 20 64 62 68 20 69 64 29 0a  t-by-id dbh id).
50e0: 20 20 28 64 62 69 3a 67 65 74 2d 72 6f 77 73 20    (dbi:get-rows 
50f0: 64 62 68 20 22 53 45 4c 45 43 54 20 74 2e 74 65  dbh "SELECT t.te
5100: 73 74 5f 6e 61 6d 65 2c 20 74 2e 69 74 65 6d 5f  st_name, t.item_
5110: 70 61 74 68 2c 20 74 2e 72 75 6e 64 69 72 2c 20  path, t.rundir, 
5120: 74 2e 66 69 6e 61 6c 5f 6c 6f 67 66 20 46 52 4f  t.final_logf FRO
5130: 4d 20 72 75 6e 73 20 61 73 20 72 20 49 4e 4e 45  M runs as r INNE
5140: 52 20 4a 4f 49 4e 20 74 65 73 74 73 20 41 53 20  R JOIN tests AS 
5150: 74 20 4f 4e 20 74 2e 72 75 6e 5f 69 64 3d 72 2e  t ON t.run_id=r.
5160: 69 64 20 20 0a 20 20 20 20 20 20 20 20 20 20 20  id  .           
5170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57                 W
5180: 48 45 52 45 20 74 2e 69 64 20 3d 20 3f 3b 22 20  HERE t.id = ?;" 
5190: 69 64 29 0a 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d  id).)..;;=======
51a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
51b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
51c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
51d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a  ===============.
51e0: 3b 3b 20 20 56 20 41 20 52 20 49 20 4f 20 55 20  ;;  V A R I O U 
51f0: 53 20 20 20 44 20 41 20 54 20 41 20 20 20 4d 20  S   D A T A   M 
5200: 41 20 53 20 53 20 41 20 47 20 45 20 20 20 52 20  A S S A G E   R 
5210: 4f 20 55 20 54 20 49 20 4e 20 45 20 53 0a 3b 3b  O U T I N E S.;;
5220: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5230: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5240: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5250: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
5260: 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 70 72 6f 62 61  ======..;; proba
5270: 62 6c 79 20 77 61 6e 74 20 74 6f 20 6d 6f 76 65  bly want to move
5280: 20 74 68 65 73 65 20 74 6f 20 61 20 64 69 66 66   these to a diff
5290: 65 72 65 6e 74 20 6d 6f 64 65 6c 20 66 69 6c 65  erent model file
52a0: 0a 0a 3b 3b 20 63 72 65 61 74 65 20 61 20 68 61  ..;; create a ha
52b0: 73 68 20 6f 66 20 68 61 73 68 65 73 20 77 69 74  sh of hashes wit
52c0: 68 20 6b 65 79 73 20 65 78 74 72 61 63 74 65 64  h keys extracted
52d0: 20 66 72 6f 6d 20 61 6c 6c 2d 70 61 72 74 73 0a   from all-parts.
52e0: 3b 3b 20 75 73 69 6e 67 20 72 6f 77 2d 6f 72 2d  ;; using row-or-
52f0: 63 6f 6c 20 74 6f 20 63 68 6f 6f 73 65 20 72 6f  col to choose ro
5300: 77 20 6f 72 20 63 6f 6c 75 6d 6e 0a 3b 3b 20 20  w or column.;;  
5310: 20 68 74 7b 72 6f 77 20 6b 65 79 7d 3d 3e 68 74   ht{row key}=>ht
5320: 7b 63 6f 6c 20 6b 65 79 7d 3d 3e 64 61 74 61 0a  {col key}=>data.
5330: 3b 3b 0a 3b 3b 20 66 6e 75 6d 20 69 73 20 74 68  ;;.;; fnum is th
5340: 65 20 66 69 65 6c 64 20 6e 75 6d 62 65 72 20 69  e field number i
5350: 6e 20 74 68 65 20 74 75 70 6c 65 73 20 74 6f 20  n the tuples to 
5360: 62 65 20 73 70 6c 69 74 0a 3b 3b 0a 0a 28 64 65  be split.;;..(de
5370: 66 69 6e 65 20 28 70 67 64 62 3a 6d 6b 2d 70 61  fine (pgdb:mk-pa
5380: 74 74 65 72 6e 20 20 64 6f 74 20 74 79 70 65 20  ttern  dot type 
5390: 62 70 20 72 65 6c 29 0a 20 20 28 6c 65 74 2a 20  bp rel).  (let* 
53a0: 28 28 74 79 70 20 28 69 66 20 28 65 71 75 61 6c  ((typ (if (equal
53b0: 3f 20 74 79 70 65 20 22 61 6c 6c 22 29 0a 20 20  ? type "all").  
53c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25 22               "%"
53d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
53e0: 20 74 79 70 65 29 29 0a 20 20 20 20 20 20 20 20   type)).        
53f0: 28 64 6f 74 70 72 6f 63 65 73 73 20 28 69 66 20  (dotprocess (if 
5400: 28 65 71 75 61 6c 3f 20 64 6f 74 20 22 61 6c 6c  (equal? dot "all
5410: 22 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ").             
5420: 20 20 20 20 20 20 20 20 20 22 25 22 0a 20 20 20           "%".   
5430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5440: 20 20 64 6f 74 29 29 0a 20 20 20 20 20 20 20 20    dot)).        
5450: 28 72 65 6c 2d 6e 75 6d 20 28 69 66 20 28 65 71  (rel-num (if (eq
5460: 75 61 6c 3f 20 72 65 6c 20 22 22 29 0a 20 20 20  ual? rel "").   
5470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5480: 20 20 20 22 25 22 0a 20 20 20 20 20 20 20 20 20     "%".         
5490: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 29              rel)
54a0: 29 0a 20 20 20 20 20 20 20 20 28 70 61 74 74 65  ).        (patte
54b0: 72 6e 20 20 28 63 6f 6e 63 20 22 25 2f 22 20 62  rn  (conc "%/" b
54c0: 70 20 22 2f 22 20 64 6f 74 70 72 6f 63 65 73 73  p "/" dotprocess
54d0: 20 22 2f 22 20 74 79 70 20 22 5f 22 20 72 65 6c   "/" typ "_" rel
54e0: 2d 6e 75 6d 29 29 29 0a 70 61 74 74 65 72 6e 29  -num))).pattern)
54f0: 29 0a 0a 28 64 65 66 69 6e 65 20 28 70 67 64 62  )..(define (pgdb
5500: 3a 63 6f 61 6c 65 73 63 65 2d 72 75 6e 73 20 64  :coalesce-runs d
5510: 62 68 20 72 75 6e 73 20 61 6c 6c 2d 70 61 72 74  bh runs all-part
5520: 73 20 72 6f 77 2d 6f 72 2d 63 6f 6c 20 66 6e 75  s row-or-col fnu
5530: 6d 29 0a 20 20 28 6c 65 74 2a 20 28 28 64 61 74  m).  (let* ((dat
5540: 61 20 20 28 6d 61 6b 65 2d 68 61 73 68 2d 74 61  a  (make-hash-ta
5550: 62 6c 65 29 29 29 0a 20 20 20 20 0a 20 20 20 20  ble))).    .    
5560: 28 66 6f 72 2d 65 61 63 68 0a 20 20 20 20 20 28  (for-each.     (
5570: 6c 61 6d 62 64 61 20 28 72 75 6e 29 0a 20 20 20  lambda (run).   
5580: 20 20 20 20 28 6c 65 74 2a 20 28 28 74 61 72 67      (let* ((targ
5590: 65 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 72  et (vector-ref r
55a0: 75 6e 20 66 6e 75 6d 29 29 0a 09 20 20 20 20 20  un fnum))..     
55b0: 20 28 70 61 72 74 73 20 20 28 73 74 72 69 6e 67   (parts  (string
55c0: 2d 73 70 6c 69 74 20 74 61 72 67 65 74 20 22 2f  -split target "/
55d0: 22 29 29 0a 09 20 20 20 20 20 20 28 66 69 72 73  "))..      (firs
55e0: 74 20 20 28 63 61 72 20 70 61 72 74 73 29 29 0a  t  (car parts)).
55f0: 09 20 20 20 20 20 20 28 72 65 73 74 20 20 20 28  .      (rest   (
5600: 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72  string-intersper
5610: 73 65 20 28 63 64 72 20 70 61 72 74 73 29 20 22  se (cdr parts) "
5620: 2f 22 29 29 0a 09 20 20 20 20 20 20 28 63 6f 6c  /"))..      (col
5630: 64 61 74 20 28 68 61 73 68 2d 74 61 62 6c 65 2d  dat (hash-table-
5640: 72 65 66 2f 64 65 66 61 75 6c 74 20 64 61 74 61  ref/default data
5650: 20 66 69 72 73 74 20 23 66 29 29 29 0a 09 20 28   first #f))).. (
5660: 69 66 20 28 6e 6f 74 20 63 6f 6c 64 61 74 29 28  if (not coldat)(
5670: 6c 65 74 20 28 28 6e 65 77 68 74 20 28 6d 61 6b  let ((newht (mak
5680: 65 2d 68 61 73 68 2d 74 61 62 6c 65 29 29 29 0a  e-hash-table))).
5690: 09 09 09 20 20 20 28 68 61 73 68 2d 74 61 62 6c  ...   (hash-tabl
56a0: 65 2d 73 65 74 21 20 64 61 74 61 20 66 69 72 73  e-set! data firs
56b0: 74 20 6e 65 77 68 74 29 0a 09 09 09 20 20 20 28  t newht)....   (
56c0: 73 65 74 21 20 63 6f 6c 64 61 74 20 6e 65 77 68  set! coldat newh
56d0: 74 29 29 29 0a 09 20 28 68 61 73 68 2d 74 61 62  t))).. (hash-tab
56e0: 6c 65 2d 73 65 74 21 20 63 6f 6c 64 61 74 20 72  le-set! coldat r
56f0: 65 73 74 20 72 75 6e 29 29 29 0a 20 20 20 20 20  est run))).     
5700: 72 75 6e 73 29 0a 20 20 20 20 64 61 74 61 29 29  runs).    data))
5710: 0a 0a 0a 28 64 65 66 69 6e 65 20 28 70 67 64 62  ...(define (pgdb
5720: 3a 63 6f 61 6c 65 73 63 65 2d 72 75 6e 73 31 20  :coalesce-runs1 
5730: 72 75 6e 73 20 20 29 0a 20 20 28 6c 65 74 2a 20  runs  ).  (let* 
5740: 28 28 64 61 74 61 20 20 28 6d 61 6b 65 2d 68 61  ((data  (make-ha
5750: 73 68 2d 74 61 62 6c 65 29 29 29 0a 20 20 20 20  sh-table))).    
5760: 0a 20 20 20 20 28 66 6f 72 2d 65 61 63 68 0a 20  .    (for-each. 
5770: 20 20 20 20 28 6c 61 6d 62 64 61 20 28 72 75 6e      (lambda (run
5780: 29 0a 20 20 20 20 20 20 20 28 6c 65 74 2a 20 28  ).       (let* (
5790: 28 74 61 72 67 65 74 20 28 76 65 63 74 6f 72 2d  (target (vector-
57a0: 72 65 66 20 72 75 6e 20 30 29 29 0a 09 20 20 20  ref run 0))..   
57b0: 20 20 20 28 70 61 72 74 73 20 20 28 73 74 72 69     (parts  (stri
57c0: 6e 67 2d 73 70 6c 69 74 20 74 61 72 67 65 74 20  ng-split target 
57d0: 22 2f 22 29 29 0a 09 20 20 20 20 20 20 28 66 69  "/"))..      (fi
57e0: 72 73 74 20 20 28 63 61 72 20 70 61 72 74 73 29  rst  (car parts)
57f0: 29 0a 09 20 20 20 20 20 20 28 72 65 73 74 20 20  )..      (rest  
5800: 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70   (string-intersp
5810: 65 72 73 65 20 28 63 64 72 20 70 61 72 74 73 29  erse (cdr parts)
5820: 20 22 2f 22 29 29 0a 09 20 20 20 20 20 20 28 63   "/"))..      (c
5830: 6f 6c 64 61 74 20 28 68 61 73 68 2d 74 61 62 6c  oldat (hash-tabl
5840: 65 2d 72 65 66 2f 64 65 66 61 75 6c 74 20 64 61  e-ref/default da
5850: 74 61 20 66 69 72 73 74 20 23 66 29 29 29 0a 09  ta first #f)))..
5860: 20 28 69 66 20 28 6e 6f 74 20 63 6f 6c 64 61 74   (if (not coldat
5870: 29 28 6c 65 74 20 28 28 6e 65 77 68 74 20 28 6d  )(let ((newht (m
5880: 61 6b 65 2d 68 61 73 68 2d 74 61 62 6c 65 29 29  ake-hash-table))
5890: 29 0a 09 09 09 20 20 20 28 68 61 73 68 2d 74 61  )....   (hash-ta
58a0: 62 6c 65 2d 73 65 74 21 20 64 61 74 61 20 66 69  ble-set! data fi
58b0: 72 73 74 20 6e 65 77 68 74 29 0a 09 09 09 20 20  rst newht)....  
58c0: 20 28 73 65 74 21 20 63 6f 6c 64 61 74 20 6e 65   (set! coldat ne
58d0: 77 68 74 29 29 29 0a 09 20 28 68 61 73 68 2d 74  wht))).. (hash-t
58e0: 61 62 6c 65 2d 73 65 74 21 20 63 6f 6c 64 61 74  able-set! coldat
58f0: 20 72 65 73 74 20 72 75 6e 29 29 29 0a 20 20 20   rest run))).   
5900: 20 20 72 75 6e 73 29 0a 20 20 20 20 64 61 74 61    runs).    data
5910: 29 29 0a 0a 3b 3b 20 67 69 76 65 6e 20 6f 72 64  ))..;; given ord
5920: 65 72 65 64 20 64 61 74 61 20 68 61 73 68 20 72  ered data hash r
5930: 65 74 75 72 6e 20 61 2d 6b 65 79 73 0a 3b 3b 0a  eturn a-keys.;;.
5940: 28 64 65 66 69 6e 65 20 28 70 67 64 62 3a 6f 72  (define (pgdb:or
5950: 64 65 72 65 64 2d 64 61 74 61 2d 3e 61 2d 6b 65  dered-data->a-ke
5960: 79 73 20 6f 72 64 65 72 65 64 2d 64 61 74 61 29  ys ordered-data)
5970: 0a 20 20 28 73 6f 72 74 20 28 68 61 73 68 2d 74  .  (sort (hash-t
5980: 61 62 6c 65 2d 6b 65 79 73 20 6f 72 64 65 72 65  able-keys ordere
5990: 64 2d 64 61 74 61 29 20 73 74 72 69 6e 67 3e 3d  d-data) string>=
59a0: 3f 29 29 0a 0a 3b 3b 20 67 69 76 65 6e 20 6f 72  ?))..;; given or
59b0: 64 65 72 65 64 20 64 61 74 61 20 68 61 73 68 20  dered data hash 
59c0: 72 65 74 75 72 6e 20 62 2d 6b 65 79 73 0a 3b 3b  return b-keys.;;
59d0: 0a 28 64 65 66 69 6e 65 20 28 70 67 64 62 3a 6f  .(define (pgdb:o
59e0: 72 64 65 72 65 64 2d 64 61 74 61 2d 3e 62 2d 6b  rdered-data->b-k
59f0: 65 79 73 20 6f 72 64 65 72 65 64 2d 64 61 74 61  eys ordered-data
5a00: 20 61 2d 6b 65 79 73 29 0a 20 20 28 64 65 6c 65   a-keys).  (dele
5a10: 74 65 2d 64 75 70 6c 69 63 61 74 65 73 0a 20 20  te-duplicates.  
5a20: 20 28 73 6f 72 74 20 28 61 70 70 6c 79 0a 09 20   (sort (apply.. 
5a30: 20 61 70 70 65 6e 64 0a 09 20 20 28 6d 61 70 20   append..  (map 
5a40: 28 6c 61 6d 62 64 61 20 28 73 75 62 2d 6b 65 79  (lambda (sub-key
5a50: 29 0a 09 09 20 28 6c 65 74 20 28 28 73 75 62 64  )... (let ((subd
5a60: 61 74 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 72  at (hash-table-r
5a70: 65 66 20 6f 72 64 65 72 65 64 2d 64 61 74 61 20  ef ordered-data 
5a80: 73 75 62 2d 6b 65 79 29 29 29 0a 09 09 20 20 20  sub-key)))...   
5a90: 28 68 61 73 68 2d 74 61 62 6c 65 2d 6b 65 79 73  (hash-table-keys
5aa0: 20 73 75 62 64 61 74 29 29 29 0a 09 20 20 20 20   subdat)))..    
5ab0: 20 20 20 61 2d 6b 65 79 73 29 29 0a 09 20 73 74     a-keys)).. st
5ac0: 72 69 6e 67 3e 3d 3f 29 29 29 0a 0a 3b 3b 20 67  ring>=?)))..;; g
5ad0: 69 76 65 6e 20 6f 72 64 65 72 65 64 20 64 61 74  iven ordered dat
5ae0: 61 20 68 61 73 68 20 72 65 74 75 72 6e 20 61 2d  a hash return a-
5af0: 6b 65 79 73 0a 3b 3b 0a 28 64 65 66 69 6e 65 20  keys.;;.(define 
5b00: 28 70 67 64 62 3a 6f 72 64 65 72 65 64 2d 64 61  (pgdb:ordered-da
5b10: 74 61 2d 3e 61 2d 6b 65 79 73 20 6f 72 64 65 72  ta->a-keys order
5b20: 65 64 2d 64 61 74 61 29 0a 20 20 28 73 6f 72 74  ed-data).  (sort
5b30: 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 6b 65 79   (hash-table-key
5b40: 73 20 6f 72 64 65 72 65 64 2d 64 61 74 61 29 20  s ordered-data) 
5b50: 73 74 72 69 6e 67 3e 3d 3f 29 29 0a 0a 3b 3b 20  string>=?))..;; 
5b60: 67 69 76 65 6e 20 6f 72 64 65 72 65 64 20 64 61  given ordered da
5b70: 74 61 20 68 61 73 68 20 72 65 74 75 72 6e 20 62  ta hash return b
5b80: 2d 6b 65 79 73 0a 3b 3b 0a 28 64 65 66 69 6e 65  -keys.;;.(define
5b90: 20 28 70 67 64 62 3a 6f 72 64 65 72 65 64 2d 64   (pgdb:ordered-d
5ba0: 61 74 61 2d 3e 62 2d 6b 65 79 73 20 6f 72 64 65  ata->b-keys orde
5bb0: 72 65 64 2d 64 61 74 61 20 61 2d 6b 65 79 73 29  red-data a-keys)
5bc0: 0a 20 20 28 64 65 6c 65 74 65 2d 64 75 70 6c 69  .  (delete-dupli
5bd0: 63 61 74 65 73 0a 20 20 20 28 73 6f 72 74 20 28  cates.   (sort (
5be0: 61 70 70 6c 79 0a 09 20 20 61 70 70 65 6e 64 0a  apply..  append.
5bf0: 09 20 20 28 6d 61 70 20 28 6c 61 6d 62 64 61 20  .  (map (lambda 
5c00: 28 73 75 62 2d 6b 65 79 29 0a 09 09 20 28 6c 65  (sub-key)... (le
5c10: 74 20 28 28 73 75 62 64 61 74 20 28 68 61 73 68  t ((subdat (hash
5c20: 2d 74 61 62 6c 65 2d 72 65 66 20 6f 72 64 65 72  -table-ref order
5c30: 65 64 2d 64 61 74 61 20 73 75 62 2d 6b 65 79 29  ed-data sub-key)
5c40: 29 29 0a 09 09 20 20 20 28 68 61 73 68 2d 74 61  ))...   (hash-ta
5c50: 62 6c 65 2d 6b 65 79 73 20 73 75 62 64 61 74 29  ble-keys subdat)
5c60: 29 29 0a 09 20 20 20 20 20 20 20 61 2d 6b 65 79  ))..       a-key
5c70: 73 29 29 0a 09 20 73 74 72 69 6e 67 3e 3d 3f 29  s)).. string>=?)
5c80: 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 70 67 64  ))..(define (pgd
5c90: 62 3a 63 6f 61 6c 65 73 63 65 2d 72 75 6e 73 2d  b:coalesce-runs-
5ca0: 62 79 2d 73 6c 69 63 65 20 72 75 6e 73 20 73 6c  by-slice runs sl
5cb0: 69 63 65 29 0a 20 20 28 6c 65 74 2a 20 28 28 64  ice).  (let* ((d
5cc0: 61 74 61 20 20 28 6d 61 6b 65 2d 68 61 73 68 2d  ata  (make-hash-
5cd0: 74 61 62 6c 65 29 29 29 0a 20 20 20 20 20 20 28  table))).      (
5ce0: 66 6f 72 2d 65 61 63 68 0a 20 20 20 20 20 28 6c  for-each.     (l
5cf0: 61 6d 62 64 61 20 28 72 75 6e 29 0a 20 20 20 20  ambda (run).    
5d00: 20 20 20 28 6c 65 74 2a 20 28 28 74 61 72 67 65     (let* ((targe
5d10: 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 72 75  t (vector-ref ru
5d20: 6e 20 30 29 29 0a 20 20 20 20 20 20 20 20 20 20  n 0)).          
5d30: 20 20 20 20 28 72 75 6e 2d 6e 61 6d 65 20 28 76      (run-name (v
5d40: 65 63 74 6f 72 2d 72 65 66 20 72 75 6e 20 31 29  ector-ref run 1)
5d50: 29 20 20 20 20 0a 09 20 20 20 20 20 20 28 70 61  )    ..      (pa
5d60: 72 74 73 20 20 28 73 74 72 69 6e 67 2d 73 70 6c  rts  (string-spl
5d70: 69 74 20 74 61 72 67 65 74 20 22 2f 22 29 29 0a  it target "/")).
5d80: 09 20 20 20 20 20 20 28 66 69 72 73 74 20 20 28  .      (first  (
5d90: 63 61 72 20 70 61 72 74 73 29 29 0a 09 20 20 20  car parts))..   
5da0: 20 20 20 28 72 65 73 74 20 20 20 28 73 74 72 69     (rest   (stri
5db0: 6e 67 2d 69 6e 74 65 72 73 70 65 72 73 65 20 28  ng-intersperse (
5dc0: 63 64 72 20 70 61 72 74 73 29 20 22 2f 22 29 29  cdr parts) "/"))
5dd0: 0a 09 20 20 20 20 20 20 28 63 6f 6c 64 61 74 20  ..      (coldat 
5de0: 28 68 61 73 68 2d 74 61 62 6c 65 2d 72 65 66 2f  (hash-table-ref/
5df0: 64 65 66 61 75 6c 74 20 64 61 74 61 20 72 65 73  default data res
5e00: 74 20 23 66 29 29 29 0a 09 20 28 69 66 20 28 6e  t #f))).. (if (n
5e10: 6f 74 20 63 6f 6c 64 61 74 29 28 6c 65 74 20 28  ot coldat)(let (
5e20: 28 6e 65 77 68 74 20 28 6d 61 6b 65 2d 68 61 73  (newht (make-has
5e30: 68 2d 74 61 62 6c 65 29 29 29 0a 09 09 09 20 20  h-table)))....  
5e40: 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 73 65 74   (hash-table-set
5e50: 21 20 64 61 74 61 20 72 65 73 74 20 6e 65 77 68  ! data rest newh
5e60: 74 29 0a 09 09 09 20 20 20 28 73 65 74 21 20 63  t)....   (set! c
5e70: 6f 6c 64 61 74 20 6e 65 77 68 74 29 29 29 0a 09  oldat newht)))..
5e80: 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 73 65 74   (hash-table-set
5e90: 21 20 63 6f 6c 64 61 74 20 72 75 6e 2d 6e 61 6d  ! coldat run-nam
5ea0: 65 20 72 75 6e 29 29 29 0a 20 20 20 20 20 72 75  e run))).     ru
5eb0: 6e 73 29 0a 20 20 20 20 64 61 74 61 29 29 0a 0a  ns).    data))..
5ec0: 0a 28 64 65 66 69 6e 65 20 28 70 67 64 62 3a 72  .(define (pgdb:r
5ed0: 75 6e 73 2d 74 6f 2d 68 61 73 68 20 72 75 6e 73  uns-to-hash runs
5ee0: 20 29 0a 20 20 28 6c 65 74 2a 20 28 28 64 61 74   ).  (let* ((dat
5ef0: 61 20 20 28 6d 61 6b 65 2d 68 61 73 68 2d 74 61  a  (make-hash-ta
5f00: 62 6c 65 29 29 29 0a 20 20 20 20 28 66 6f 72 2d  ble))).    (for-
5f10: 65 61 63 68 0a 20 20 20 20 20 28 6c 61 6d 62 64  each.     (lambd
5f20: 61 20 28 72 75 6e 29 0a 20 20 20 20 20 20 20 28  a (run).       (
5f30: 6c 65 74 2a 20 28 28 72 75 6e 2d 6e 61 6d 65 20  let* ((run-name 
5f40: 28 76 65 63 74 6f 72 2d 72 65 66 20 72 75 6e 20  (vector-ref run 
5f50: 30 29 29 0a 09 20 20 20 20 20 20 28 74 65 73 74  0))..      (test
5f60: 20 28 63 6f 6e 63 20 28 76 65 63 74 6f 72 2d 72   (conc (vector-r
5f70: 65 66 20 72 75 6e 20 31 29 20 22 3a 22 20 28 76  ef run 1) ":" (v
5f80: 65 63 74 6f 72 2d 72 65 66 20 72 75 6e 20 33 29  ector-ref run 3)
5f90: 29 29 0a 09 20 20 20 20 20 20 28 63 6f 6c 64 61  ))..      (colda
5fa0: 74 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 72 65  t (hash-table-re
5fb0: 66 2f 64 65 66 61 75 6c 74 20 64 61 74 61 20 72  f/default data r
5fc0: 75 6e 2d 6e 61 6d 65 20 23 66 29 29 29 0a 09 20  un-name #f))).. 
5fd0: 28 69 66 20 28 6e 6f 74 20 63 6f 6c 64 61 74 29  (if (not coldat)
5fe0: 28 6c 65 74 20 28 28 6e 65 77 68 74 20 28 6d 61  (let ((newht (ma
5ff0: 6b 65 2d 68 61 73 68 2d 74 61 62 6c 65 29 29 29  ke-hash-table)))
6000: 0a 09 09 09 20 20 20 28 68 61 73 68 2d 74 61 62  ....   (hash-tab
6010: 6c 65 2d 73 65 74 21 20 64 61 74 61 20 72 75 6e  le-set! data run
6020: 2d 6e 61 6d 65 20 6e 65 77 68 74 29 0a 09 09 09  -name newht)....
6030: 20 20 20 28 73 65 74 21 20 63 6f 6c 64 61 74 20     (set! coldat 
6040: 6e 65 77 68 74 29 29 29 0a 09 20 28 68 61 73 68  newht))).. (hash
6050: 2d 74 61 62 6c 65 2d 73 65 74 21 20 63 6f 6c 64  -table-set! cold
6060: 61 74 20 74 65 73 74 20 72 75 6e 29 29 29 0a 20  at test run))). 
6070: 20 20 20 20 72 75 6e 73 29 0a 20 20 20 20 64 61      runs).    da
6080: 74 61 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 70  ta))..(define (p
6090: 67 64 62 3a 67 65 74 2d 68 69 73 74 6f 72 79 2d  gdb:get-history-
60a0: 68 61 73 68 20 72 75 6e 73 29 0a 20 20 28 6c 65  hash runs).  (le
60b0: 74 2a 20 28 28 64 61 74 61 20 20 28 6d 61 6b 65  t* ((data  (make
60c0: 2d 68 61 73 68 2d 74 61 62 6c 65 29 29 29 0a 20  -hash-table))). 
60d0: 20 20 20 20 28 66 6f 72 2d 65 61 63 68 0a 20 20      (for-each.  
60e0: 20 20 20 28 6c 61 6d 62 64 61 20 28 72 75 6e 29     (lambda (run)
60f0: 0a 20 20 20 20 20 20 20 28 6c 65 74 2a 20 28 28  .       (let* ((
6100: 72 75 6e 2d 6e 61 6d 65 20 28 76 65 63 74 6f 72  run-name (vector
6110: 2d 72 65 66 20 72 75 6e 20 30 29 29 29 0a 09 20  -ref run 0))).. 
6120: 28 68 61 73 68 2d 74 61 62 6c 65 2d 73 65 74 21  (hash-table-set!
6130: 20 64 61 74 61 20 72 75 6e 2d 6e 61 6d 65 20 72   data run-name r
6140: 75 6e 29 29 29 0a 20 20 20 20 20 72 75 6e 73 29  un))).     runs)
6150: 0a 20 20 20 20 64 61 74 61 29 29 0a 0a 28 64 65  .    data))..(de
6160: 66 69 6e 65 20 28 70 67 64 62 3a 67 65 74 2d 70  fine (pgdb:get-p
6170: 67 2d 6c 73 74 20 74 61 62 32 2d 70 61 67 65 73  g-lst tab2-pages
6180: 29 0a 20 20 20 20 28 6c 65 74 20 6c 6f 6f 70 20  ).    (let loop 
6190: 28 28 69 20 31 29 0a 20 20 20 20 20 20 20 20 20  ((i 1).         
61a0: 20 20 20 20 28 6c 73 74 20 60 28 29 29 29 0a 20      (lst `())). 
61b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61c0: 20 20 20 20 20 20 28 63 6f 6e 64 0a 20 20 20 20        (cond.    
61d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
61e0: 20 20 20 20 28 28 3e 20 69 20 74 61 62 32 2d 70      ((> i tab2-p
61f0: 61 67 65 73 20 29 0a 20 20 20 20 20 20 20 20 20  ages ).         
6200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c                 l
6210: 73 74 29 20 0a 20 20 20 20 20 20 20 20 20 20 20  st) .           
6220: 20 20 20 20 20 20 20 20 20 20 20 28 65 6c 73 65             (else
6230: 20 0a 09 09 20 20 09 28 6c 6f 6f 70 20 28 2b 20   ...  .(loop (+ 
6240: 69 20 31 29 20 28 61 70 70 65 6e 64 20 20 20 6c  i 1) (append   l
6250: 73 74 20 28 6c 69 73 74 20 69 29 29 29 29 29 29  st (list i))))))
6260: 29 0a 0a                                         )..