Megatest

Hex Artifact Content
Login

Artifact 6fd66727e06fb57ff1db1221b1ec299681c865ee:


0000: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
0010: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0030: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0040: 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 43 6f 70 79  ========.;; Copy
0050: 72 69 67 68 74 20 32 30 31 37 2c 20 4d 61 74 74  right 2017, Matt
0060: 68 65 77 20 57 65 6c 6c 61 6e 64 2e 0a 3b 3b 20  hew Welland..;; 
0070: 0a 3b 3b 20 20 54 68 69 73 20 70 72 6f 67 72 61  .;;  This progra
0080: 6d 20 69 73 20 6d 61 64 65 20 61 76 61 69 6c 61  m is made availa
0090: 62 6c 65 20 75 6e 64 65 72 20 74 68 65 20 47 4e  ble under the GN
00a0: 55 20 47 50 4c 20 76 65 72 73 69 6f 6e 20 32 2e  U GPL version 2.
00b0: 30 20 6f 72 0a 3b 3b 20 20 67 72 65 61 74 65 72  0 or.;;  greater
00c0: 2e 20 53 65 65 20 74 68 65 20 61 63 63 6f 6d 70  . See the accomp
00d0: 61 6e 79 69 6e 67 20 66 69 6c 65 20 43 4f 50 59  anying file COPY
00e0: 49 4e 47 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  ING for details.
00f0: 0a 3b 3b 20 0a 3b 3b 20 20 54 68 69 73 20 70 72  .;; .;;  This pr
0100: 6f 67 72 61 6d 20 69 73 20 64 69 73 74 72 69 62  ogram is distrib
0110: 75 74 65 64 20 57 49 54 48 4f 55 54 20 41 4e 59  uted WITHOUT ANY
0120: 20 57 41 52 52 41 4e 54 59 3b 20 77 69 74 68 6f   WARRANTY; witho
0130: 75 74 20 65 76 65 6e 20 74 68 65 0a 3b 3b 20 20  ut even the.;;  
0140: 69 6d 70 6c 69 65 64 20 77 61 72 72 61 6e 74 79  implied warranty
0150: 20 6f 66 20 4d 45 52 43 48 41 4e 54 41 42 49 4c   of MERCHANTABIL
0160: 49 54 59 20 6f 72 20 46 49 54 4e 45 53 53 20 46  ITY or FITNESS F
0170: 4f 52 20 41 20 50 41 52 54 49 43 55 4c 41 52 0a  OR A PARTICULAR.
0180: 3b 3b 20 20 50 55 52 50 4f 53 45 2e 0a 3b 3b 3d  ;;  PURPOSE..;;=
0190: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
01d0: 3d 3d 3d 3d 3d 0a 0a 28 64 65 63 6c 61 72 65 20  =====..(declare 
01e0: 28 75 6e 69 74 20 70 67 64 62 29 29 0a 28 64 65  (unit pgdb)).(de
01f0: 63 6c 61 72 65 20 28 75 73 65 73 20 63 6f 6e 66  clare (uses conf
0200: 69 67 66 29 29 0a 0a 3b 3b 20 49 20 64 6f 6e 27  igf))..;; I don'
0210: 74 20 6b 6e 6f 77 20 68 6f 77 20 74 6f 20 6d 69  t know how to mi
0220: 78 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 75 6e  x compilation un
0230: 69 74 73 20 61 6e 64 20 6d 6f 64 75 6c 65 73 2c  its and modules,
0240: 20 73 6f 20 6e 6f 20 6d 6f 64 75 6c 65 20 68 65   so no module he
0250: 72 65 2e 0a 3b 3b 0a 3b 3b 20 28 6d 6f 64 75 6c  re..;;.;; (modul
0260: 65 20 70 67 64 62 0a 3b 3b 20 20 20 20 20 28 0a  e pgdb.;;     (.
0270: 3b 3b 20 20 20 20 20 20 6f 70 65 6e 2d 70 67 64  ;;      open-pgd
0280: 62 0a 3b 3b 20 20 20 20 20 20 29 0a 3b 3b 20 0a  b.;;      ).;; .
0290: 3b 3b 20 28 69 6d 70 6f 72 74 20 73 63 68 65 6d  ;; (import schem
02a0: 65 29 0a 3b 3b 20 28 69 6d 70 6f 72 74 20 64 61  e).;; (import da
02b0: 74 61 2d 73 74 72 75 63 74 75 72 65 73 29 0a 3b  ta-structures).;
02c0: 3b 20 28 69 6d 70 6f 72 74 20 63 68 69 63 6b 65  ; (import chicke
02d0: 6e 29 0a 0a 28 75 73 65 20 74 79 70 65 64 2d 72  n)..(use typed-r
02e0: 65 63 6f 72 64 73 20 28 70 72 65 66 69 78 20 64  ecords (prefix d
02f0: 62 69 20 64 62 69 3a 29 29 0a 0a 3b 3b 20 67 69  bi dbi:))..;; gi
0300: 76 65 6e 20 61 20 63 6f 6e 66 69 67 64 61 74 20  ven a configdat 
0310: 6c 6f 6f 6b 75 70 20 74 68 65 20 63 6f 6e 6e 65  lookup the conne
0320: 63 74 69 6f 6e 20 69 6e 66 6f 20 61 6e 64 20 6f  ction info and o
0330: 70 65 6e 20 74 68 65 20 64 62 0a 3b 3b 0a 28 64  pen the db.;;.(d
0340: 65 66 69 6e 65 20 28 70 67 64 62 3a 6f 70 65 6e  efine (pgdb:open
0350: 20 63 6f 6e 66 69 67 64 61 74 20 23 21 6b 65 79   configdat #!key
0360: 20 28 64 62 6e 61 6d 65 20 23 66 29 28 64 62 69   (dbname #f)(dbi
0370: 73 70 65 63 20 23 66 29 29 20 20 0a 20 20 28 6c  spec #f))  .  (l
0380: 65 74 20 28 28 70 67 63 6f 6e 66 20 28 6f 72 20  et ((pgconf (or 
0390: 64 62 69 73 70 65 63 0a 09 09 20 20 20 20 28 61  dbispec...    (a
03a0: 72 67 73 3a 67 65 74 2d 61 72 67 20 22 2d 70 67  rgs:get-arg "-pg
03b0: 73 79 6e 63 22 29 0a 09 09 20 20 20 20 28 69 66  sync")...    (if
03c0: 20 63 6f 6e 66 69 67 64 61 74 0a 09 09 09 28 63   configdat....(c
03d0: 6f 6e 66 69 67 66 3a 6c 6f 6f 6b 75 70 20 63 6f  onfigf:lookup co
03e0: 6e 66 69 67 64 61 74 20 22 65 78 74 2d 73 79 6e  nfigdat "ext-syn
03f0: 63 22 20 28 6f 72 20 64 62 6e 61 6d 65 20 22 70  c" (or dbname "p
0400: 67 64 62 22 29 29 0a 09 09 09 23 66 29 0a 09 09  gdb"))....#f)...
0410: 20 20 20 20 29 29 29 0a 20 20 20 20 28 69 66 20      ))).    (if 
0420: 70 67 63 6f 6e 66 0a 09 28 6c 65 74 2a 20 28 28  pgconf..(let* ((
0430: 63 6f 6e 66 64 61 74 20 28 6d 61 70 20 28 6c 61  confdat (map (la
0440: 6d 62 64 61 20 28 63 6f 6e 66 2d 69 74 65 6d 29  mbda (conf-item)
0450: 0a 09 09 09 20 20 20 20 20 20 20 28 6c 65 74 20  ....       (let 
0460: 28 28 70 61 72 74 73 20 28 73 74 72 69 6e 67 2d  ((parts (string-
0470: 73 70 6c 69 74 20 63 6f 6e 66 2d 69 74 65 6d 20  split conf-item 
0480: 22 3a 22 29 29 29 0a 09 09 09 09 20 28 69 66 20  ":")))..... (if 
0490: 28 3e 20 28 6c 65 6e 67 74 68 20 70 61 72 74 73  (> (length parts
04a0: 29 20 31 29 0a 09 09 09 09 20 20 20 20 20 28 6c  ) 1).....     (l
04b0: 65 74 20 28 28 6b 65 79 20 28 63 61 72 20 70 61  et ((key (car pa
04c0: 72 74 73 29 29 0a 09 09 09 09 09 20 20 20 28 76  rts))......   (v
04d0: 61 6c 20 28 63 61 64 72 20 70 61 72 74 73 29 29  al (cadr parts))
04e0: 29 0a 09 09 09 09 20 20 20 20 20 20 20 28 63 6f  ).....       (co
04f0: 6e 73 20 28 73 74 72 69 6e 67 2d 3e 73 79 6d 62  ns (string->symb
0500: 6f 6c 20 6b 65 79 29 20 76 61 6c 29 29 0a 09 09  ol key) val))...
0510: 09 09 20 20 20 20 20 28 62 65 67 69 6e 0a 09 09  ..     (begin...
0520: 09 09 20 20 20 20 20 20 20 28 70 72 69 6e 74 20  ..       (print 
0530: 22 45 52 52 4f 52 3a 20 42 61 64 20 63 6f 6e 66  "ERROR: Bad conf
0540: 69 67 20 73 65 74 74 69 6e 67 20 22 20 63 6f 6e  ig setting " con
0550: 66 2d 69 74 65 6d 20 22 2c 20 73 68 6f 75 6c 64  f-item ", should
0560: 20 62 65 20 6b 65 79 3a 76 61 6c 22 29 0a 09 09   be key:val")...
0570: 09 09 20 20 20 20 20 20 20 60 28 2c 28 73 74 72  ..       `(,(str
0580: 69 6e 67 2d 3e 73 79 6d 62 6f 6c 20 28 63 61 72  ing->symbol (car
0590: 20 70 61 72 74 73 29 29 20 2e 20 23 66 29 29 29   parts)) . #f)))
05a0: 29 29 0a 09 09 09 20 20 20 20 20 28 73 74 72 69  ))....     (stri
05b0: 6e 67 2d 73 70 6c 69 74 20 70 67 63 6f 6e 66 29  ng-split pgconf)
05c0: 29 29 0a 09 20 20 20 20 20 20 20 28 64 62 74 79  ))..       (dbty
05d0: 70 65 20 20 20 28 73 74 72 69 6e 67 2d 3e 73 79  pe   (string->sy
05e0: 6d 62 6f 6c 20 28 6f 72 20 28 61 6c 69 73 74 2d  mbol (or (alist-
05f0: 72 65 66 20 27 64 62 74 79 70 65 20 63 6f 6e 66  ref 'dbtype conf
0600: 64 61 74 29 20 22 70 67 22 29 29 29 29 0a 09 20  dat) "pg")))).. 
0610: 20 28 69 66 20 28 61 6c 69 73 74 2d 72 65 66 20   (if (alist-ref 
0620: 27 64 62 74 79 70 65 20 63 6f 6e 66 64 61 74 29  'dbtype confdat)
0630: 0a 09 20 20 20 20 20 20 28 64 62 69 3a 6f 70 65  ..      (dbi:ope
0640: 6e 20 64 62 74 79 70 65 20 28 61 6c 69 73 74 2d  n dbtype (alist-
0650: 64 65 6c 65 74 65 20 27 64 62 74 79 70 65 20 63  delete 'dbtype c
0660: 6f 6e 66 64 61 74 29 29 29 29 0a 09 23 66 29 29  onfdat))))..#f))
0670: 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  )..;;===========
0680: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0690: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
06a0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
06b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20 20  ===========.;;  
06c0: 41 20 52 20 45 20 41 20 53 0a 3b 3b 3d 3d 3d 3d  A R E A S.;;====
06d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
06e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
06f0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0700: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0710: 3d 3d 0a 0a 28 64 65 66 73 74 72 75 63 74 20 61  ==..(defstruct a
0720: 72 65 61 20 69 64 20 61 72 65 61 2d 6e 61 6d 65  rea id area-name
0730: 20 61 72 65 61 2d 70 61 74 68 20 6c 61 73 74 2d   area-path last-
0740: 75 70 64 61 74 65 29 0a 0a 28 64 65 66 69 6e 65  update)..(define
0750: 20 28 70 67 64 62 3a 61 64 64 2d 61 72 65 61 20   (pgdb:add-area 
0760: 64 62 68 20 61 72 65 61 2d 6e 61 6d 65 20 61 72  dbh area-name ar
0770: 65 61 2d 70 61 74 68 29 0a 20 20 28 64 62 69 3a  ea-path).  (dbi:
0780: 65 78 65 63 20 64 62 68 20 22 49 4e 53 45 52 54  exec dbh "INSERT
0790: 20 49 4e 54 4f 20 61 72 65 61 73 20 28 61 72 65   INTO areas (are
07a0: 61 5f 6e 61 6d 65 2c 61 72 65 61 5f 70 61 74 68  a_name,area_path
07b0: 29 20 56 41 4c 55 45 53 20 28 3f 2c 3f 29 22 20  ) VALUES (?,?)" 
07c0: 61 72 65 61 2d 6e 61 6d 65 20 61 72 65 61 2d 70  area-name area-p
07d0: 61 74 68 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  ath))..(define (
07e0: 70 67 64 62 3a 67 65 74 2d 61 72 65 61 73 20 64  pgdb:get-areas d
07f0: 62 68 29 0a 20 20 3b 3b 20 28 6d 61 70 0a 20 20  bh).  ;; (map.  
0800: 3b 3b 20 20 28 6c 61 6d 62 64 61 20 28 72 6f 77  ;;  (lambda (row
0810: 29 0a 20 20 3b 3b 20 20 20 20 28 70 72 69 6e 74  ).  ;;    (print
0820: 20 22 72 6f 77 3a 20 22 20 72 6f 77 29 29 0a 20   "row: " row)). 
0830: 20 28 64 62 69 3a 67 65 74 2d 72 6f 77 73 20 64   (dbi:get-rows d
0840: 62 68 20 22 53 45 4c 45 43 54 20 69 64 2c 61 72  bh "SELECT id,ar
0850: 65 61 5f 6e 61 6d 65 2c 61 72 65 61 5f 70 61 74  ea_name,area_pat
0860: 68 2c 6c 61 73 74 5f 73 79 6e 63 20 46 52 4f 4d  h,last_sync FROM
0870: 20 61 72 65 61 73 3b 22 29 29 20 3b 3b 20 29 0a   areas;")) ;; ).
0880: 0a 3b 3b 20 67 69 76 65 6e 20 61 6e 20 61 72 65  .;; given an are
0890: 61 5f 70 61 74 68 20 67 65 74 20 74 68 65 20 61  a_path get the a
08a0: 72 65 61 20 69 6e 66 6f 0a 3b 3b 0a 28 64 65 66  rea info.;;.(def
08b0: 69 6e 65 20 28 70 67 64 62 3a 67 65 74 2d 61 72  ine (pgdb:get-ar
08c0: 65 61 2d 62 79 2d 70 61 74 68 20 64 62 68 20 61  ea-by-path dbh a
08d0: 72 65 61 2d 70 61 74 68 29 0a 20 20 28 64 62 69  rea-path).  (dbi
08e0: 3a 67 65 74 2d 6f 6e 65 2d 72 6f 77 20 64 62 68  :get-one-row dbh
08f0: 20 22 53 45 4c 45 43 54 20 69 64 2c 61 72 65 61   "SELECT id,area
0900: 5f 6e 61 6d 65 2c 61 72 65 61 5f 70 61 74 68 2c  _name,area_path,
0910: 6c 61 73 74 5f 73 79 6e 63 20 46 52 4f 4d 20 61  last_sync FROM a
0920: 72 65 61 73 20 57 48 45 52 45 20 61 72 65 61 5f  reas WHERE area_
0930: 70 61 74 68 3d 3f 3b 22 20 61 72 65 61 2d 70 61  path=?;" area-pa
0940: 74 68 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 70  th))..(define (p
0950: 67 64 62 3a 77 72 69 74 65 2d 73 79 6e 63 2d 74  gdb:write-sync-t
0960: 69 6d 65 20 64 62 68 20 61 72 65 61 2d 69 6e 66  ime dbh area-inf
0970: 6f 20 6e 65 77 2d 73 79 6e 63 2d 74 69 6d 65 29  o new-sync-time)
0980: 0a 20 20 28 6c 65 74 20 28 28 61 72 65 61 2d 69  .  (let ((area-i
0990: 64 20 28 76 65 63 74 6f 72 2d 72 65 66 20 61 72  d (vector-ref ar
09a0: 65 61 2d 69 6e 66 6f 20 30 29 29 29 0a 20 20 20  ea-info 0))).   
09b0: 20 28 64 62 69 3a 65 78 65 63 20 64 62 68 20 22   (dbi:exec dbh "
09c0: 55 50 44 41 54 45 20 61 72 65 61 73 20 53 45 54  UPDATE areas SET
09d0: 20 6c 61 73 74 5f 73 79 6e 63 3d 3f 20 57 48 45   last_sync=? WHE
09e0: 52 45 20 69 64 3d 3f 3b 22 20 6e 65 77 2d 73 79  RE id=?;" new-sy
09f0: 6e 63 2d 74 69 6d 65 20 61 72 65 61 2d 69 64 29  nc-time area-id)
0a00: 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ))..;;==========
0a10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0a20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0a30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0a40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 3b 3b 20  ============.;; 
0a50: 20 54 20 41 20 52 20 47 20 45 20 54 20 53 0a 3b   T A R G E T S.;
0a60: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;===============
0a70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0a80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0a90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0aa0: 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 47 69 76 65  =======..;; Give
0ab0: 6e 20 61 20 74 61 72 67 65 74 2d 73 70 65 63 2c  n a target-spec,
0ac0: 20 72 65 74 75 72 6e 20 74 68 65 20 69 64 2e 20   return the id. 
0ad0: 53 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20  Should probably 
0ae0: 68 61 6e 64 6c 65 20 74 68 69 73 20 77 69 74 68  handle this with
0af0: 20 61 20 6a 6f 69 6e 2e 2e 2e 0a 3b 3b 20 69 66   a join....;; if
0b00: 20 74 61 72 67 65 74 2d 73 70 65 63 20 6e 6f 74   target-spec not
0b10: 20 66 6f 75 6e 64 2c 20 63 72 65 61 74 65 20 61   found, create a
0b20: 20 72 65 63 6f 72 64 20 66 6f 72 20 69 74 2e 0a   record for it..
0b30: 3b 3b 0a 28 64 65 66 69 6e 65 20 28 70 67 64 62  ;;.(define (pgdb
0b40: 3a 67 65 74 2d 74 74 79 70 65 20 64 62 68 20 74  :get-ttype dbh t
0b50: 61 72 67 65 74 2d 73 70 65 63 29 0a 20 20 28 6c  arget-spec).  (l
0b60: 65 74 20 28 28 73 70 65 63 2d 69 64 20 28 64 62  et ((spec-id (db
0b70: 69 3a 67 65 74 2d 6f 6e 65 20 64 62 68 20 22 53  i:get-one dbh "S
0b80: 45 4c 45 43 54 20 69 64 20 46 52 4f 4d 20 74 74  ELECT id FROM tt
0b90: 79 70 65 20 57 48 45 52 45 20 74 61 72 67 65 74  ype WHERE target
0ba0: 5f 73 70 65 63 3d 3f 3b 22 20 74 61 72 67 65 74  _spec=?;" target
0bb0: 2d 73 70 65 63 29 29 29 0a 20 20 20 20 28 6f 72  -spec))).    (or
0bc0: 20 73 70 65 63 2d 69 64 0a 09 28 69 66 20 28 68   spec-id..(if (h
0bd0: 61 6e 64 6c 65 2d 65 78 63 65 70 74 69 6f 6e 73  andle-exceptions
0be0: 0a 09 09 65 78 6e 0a 09 09 28 62 65 67 69 6e 0a  ...exn...(begin.
0bf0: 09 09 20 20 28 70 72 69 6e 74 2d 63 61 6c 6c 2d  ..  (print-call-
0c00: 63 68 61 69 6e 29 0a 09 09 20 20 28 64 65 62 75  chain)...  (debu
0c10: 67 3a 70 72 69 6e 74 20 30 20 2a 64 65 66 61 75  g:print 0 *defau
0c20: 6c 74 2d 6c 6f 67 2d 70 6f 72 74 2a 20 22 45 52  lt-log-port* "ER
0c30: 52 4f 52 3a 20 63 61 6e 6e 6f 74 20 63 72 65 61  ROR: cannot crea
0c40: 74 65 20 74 74 79 70 65 20 65 6e 74 72 79 2c 20  te ttype entry, 
0c50: 22 20 28 28 63 6f 6e 64 69 74 69 6f 6e 2d 70 72  " ((condition-pr
0c60: 6f 70 65 72 74 79 2d 61 63 63 65 73 73 6f 72 20  operty-accessor 
0c70: 27 65 78 6e 20 27 6d 65 73 73 61 67 65 29 20 65  'exn 'message) e
0c80: 78 6e 29 29 0a 09 09 20 20 23 66 29 0a 09 20 20  xn))...  #f)..  
0c90: 20 20 20 20 28 64 62 69 3a 65 78 65 63 20 64 62      (dbi:exec db
0ca0: 68 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  h "INSERT INTO t
0cb0: 74 79 70 65 20 28 74 61 72 67 65 74 5f 73 70 65  type (target_spe
0cc0: 63 29 20 56 41 4c 55 45 53 20 28 3f 29 3b 22 20  c) VALUES (?);" 
0cd0: 74 61 72 67 65 74 2d 73 70 65 63 29 29 0a 09 20  target-spec)).. 
0ce0: 20 20 20 28 70 67 64 62 3a 67 65 74 2d 74 74 79     (pgdb:get-tty
0cf0: 70 65 20 64 62 68 20 74 61 72 67 65 74 2d 73 70  pe dbh target-sp
0d00: 65 63 29 29 29 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d  ec)))))..;;=====
0d10: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0d20: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0d30: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0d40: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0d50: 3d 0a 3b 3b 20 20 52 20 55 20 4e 20 53 0a 3b 3b  =.;;  R U N S.;;
0d60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0d70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0d80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0d90: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0da0: 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 67 69 76 65 6e  ======..;; given
0db0: 20 61 20 74 61 72 67 65 74 20 73 70 65 63 20 69   a target spec i
0dc0: 64 2c 20 74 61 72 67 65 74 20 61 6e 64 20 72 75  d, target and ru
0dd0: 6e 2d 6e 61 6d 65 20 72 65 74 75 72 6e 20 74 68  n-name return th
0de0: 65 20 72 75 6e 2d 69 64 0a 3b 3b 20 69 66 20 6e  e run-id.;; if n
0df0: 6f 20 72 75 6e 20 66 6f 75 6e 64 20 72 65 74 75  o run found retu
0e00: 72 6e 20 23 66 0a 3b 3b 0a 28 64 65 66 69 6e 65  rn #f.;;.(define
0e10: 20 28 70 67 64 62 3a 67 65 74 2d 72 75 6e 2d 69   (pgdb:get-run-i
0e20: 64 20 64 62 68 20 73 70 65 63 2d 69 64 20 74 61  d dbh spec-id ta
0e30: 72 67 65 74 20 72 75 6e 2d 6e 61 6d 65 29 0a 20  rget run-name). 
0e40: 20 28 64 62 69 3a 67 65 74 2d 6f 6e 65 20 64 62   (dbi:get-one db
0e50: 68 20 22 53 45 4c 45 43 54 20 69 64 20 46 52 4f  h "SELECT id FRO
0e60: 4d 20 72 75 6e 73 20 57 48 45 52 45 20 74 74 79  M runs WHERE tty
0e70: 70 65 5f 69 64 3d 3f 20 41 4e 44 20 74 61 72 67  pe_id=? AND targ
0e80: 65 74 3d 3f 20 41 4e 44 20 72 75 6e 5f 6e 61 6d  et=? AND run_nam
0e90: 65 3d 3f 3b 22 0a 09 20 20 20 20 20 20 20 73 70  e=?;"..       sp
0ea0: 65 63 2d 69 64 20 74 61 72 67 65 74 20 72 75 6e  ec-id target run
0eb0: 2d 6e 61 6d 65 29 29 0a 0a 3b 3b 20 67 69 76 65  -name))..;; give
0ec0: 6e 20 61 20 72 75 6e 2d 69 64 20 72 65 74 75 72  n a run-id retur
0ed0: 6e 20 61 6c 6c 20 74 68 65 20 72 75 6e 20 69 6e  n all the run in
0ee0: 66 6f 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 28 70  fo.;;.(define (p
0ef0: 67 64 62 3a 67 65 74 2d 72 75 6e 2d 69 6e 66 6f  gdb:get-run-info
0f00: 20 64 62 68 20 72 75 6e 2d 69 64 29 20 3b 3b 20   dbh run-id) ;; 
0f10: 74 6f 20 6a 6f 69 6e 20 74 74 79 70 65 20 6f 72  to join ttype or
0f20: 20 6e 6f 74 3f 0a 20 20 28 64 62 69 3a 67 65 74   not?.  (dbi:get
0f30: 2d 6f 6e 65 2d 72 6f 77 0a 20 20 20 64 62 68 20  -one-row.   dbh 
0f40: 20 20 3b 3b 20 30 20 20 20 20 31 20 20 20 20 20    ;; 0    1     
0f50: 20 20 32 20 20 20 20 20 20 20 33 20 20 20 20 20    2       3     
0f60: 20 34 20 20 20 20 20 35 20 20 20 20 20 20 36 20   4     5      6 
0f70: 20 20 20 20 20 20 37 20 20 20 20 20 20 20 20 38        7        8
0f80: 20 20 20 20 20 20 20 20 20 39 20 20 20 20 20 20           9      
0f90: 20 20 20 31 30 20 20 20 20 20 20 20 20 20 20 31     10          1
0fa0: 31 20 20 20 20 20 20 20 20 20 31 32 0a 20 20 20  1         12.   
0fb0: 22 53 45 4c 45 43 54 20 69 64 2c 74 61 72 67 65  "SELECT id,targe
0fc0: 74 2c 74 74 79 70 65 5f 69 64 2c 72 75 6e 5f 6e  t,ttype_id,run_n
0fd0: 61 6d 65 2c 73 74 61 74 65 2c 73 74 61 74 75 73  ame,state,status
0fe0: 2c 6f 77 6e 65 72 2c 65 76 65 6e 74 5f 74 69 6d  ,owner,event_tim
0ff0: 65 2c 63 6f 6d 6d 65 6e 74 2c 66 61 69 6c 5f 63  e,comment,fail_c
1000: 6f 75 6e 74 2c 70 61 73 73 5f 63 6f 75 6e 74 2c  ount,pass_count,
1010: 6c 61 73 74 5f 75 70 64 61 74 65 2c 61 72 65 61  last_update,area
1020: 5f 69 64 0a 20 20 20 20 20 20 20 46 52 4f 4d 20  _id.       FROM 
1030: 72 75 6e 73 20 57 48 45 52 45 20 69 64 3d 3f 3b  runs WHERE id=?;
1040: 22 20 72 75 6e 2d 69 64 29 29 0a 0a 3b 3b 20 72  " run-id))..;; r
1050: 65 66 72 65 73 68 20 74 68 65 20 64 61 74 61 20  efresh the data 
1060: 69 6e 20 61 20 72 75 6e 20 72 65 63 6f 72 64 0a  in a run record.
1070: 3b 3b 0a 28 64 65 66 69 6e 65 20 28 70 67 64 62  ;;.(define (pgdb
1080: 3a 72 65 66 72 65 73 68 2d 72 75 6e 2d 69 6e 66  :refresh-run-inf
1090: 6f 20 64 62 68 20 72 75 6e 2d 69 64 20 73 74 61  o dbh run-id sta
10a0: 74 65 20 73 74 61 74 75 73 20 6f 77 6e 65 72 20  te status owner 
10b0: 65 76 65 6e 74 2d 74 69 6d 65 20 63 6f 6d 6d 65  event-time comme
10c0: 6e 74 20 66 61 69 6c 2d 63 6f 75 6e 74 20 70 61  nt fail-count pa
10d0: 73 73 2d 63 6f 75 6e 74 29 20 3b 3b 20 61 72 65  ss-count) ;; are
10e0: 61 2d 69 64 29 0a 20 20 28 64 62 69 3a 65 78 65  a-id).  (dbi:exe
10f0: 63 0a 20 20 20 64 62 68 0a 20 20 20 22 55 50 44  c.   dbh.   "UPD
1100: 41 54 45 20 72 75 6e 73 20 53 45 54 0a 20 20 20  ATE runs SET.   
1110: 20 20 20 73 74 61 74 65 3d 3f 2c 73 74 61 74 75     state=?,statu
1120: 73 3d 3f 2c 6f 77 6e 65 72 3d 3f 2c 65 76 65 6e  s=?,owner=?,even
1130: 74 5f 74 69 6d 65 3d 3f 2c 63 6f 6d 6d 65 6e 74  t_time=?,comment
1140: 3d 3f 2c 66 61 69 6c 5f 63 6f 75 6e 74 3d 3f 2c  =?,fail_count=?,
1150: 70 61 73 73 5f 63 6f 75 6e 74 3d 3f 0a 20 20 20  pass_count=?.   
1160: 20 20 57 48 45 52 45 20 69 64 3d 3f 3b 22 0a 20    WHERE id=?;". 
1170: 20 20 73 74 61 74 65 20 73 74 61 74 75 73 20 6f    state status o
1180: 77 6e 65 72 20 65 76 65 6e 74 2d 74 69 6d 65 20  wner event-time 
1190: 63 6f 6d 6d 65 6e 74 20 66 61 69 6c 2d 63 6f 75  comment fail-cou
11a0: 6e 74 20 70 61 73 73 2d 63 6f 75 6e 74 20 72 75  nt pass-count ru
11b0: 6e 2d 69 64 29 29 0a 0a 3b 3b 20 67 69 76 65 6e  n-id))..;; given
11c0: 20 61 6c 6c 20 6e 65 65 64 65 64 20 69 6e 66 6f   all needed info
11d0: 20 63 72 65 61 74 65 20 72 75 6e 20 72 65 63 6f   create run reco
11e0: 72 64 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 28 70  rd.;;.(define (p
11f0: 67 64 62 3a 69 6e 73 65 72 74 2d 72 75 6e 20 64  gdb:insert-run d
1200: 62 68 20 74 74 79 70 65 2d 69 64 20 74 61 72 67  bh ttype-id targ
1210: 65 74 20 72 75 6e 2d 6e 61 6d 65 20 73 74 61 74  et run-name stat
1220: 65 20 73 74 61 74 75 73 20 6f 77 6e 65 72 20 65  e status owner e
1230: 76 65 6e 74 2d 74 69 6d 65 20 63 6f 6d 6d 65 6e  vent-time commen
1240: 74 20 66 61 69 6c 2d 63 6f 75 6e 74 20 70 61 73  t fail-count pas
1250: 73 2d 63 6f 75 6e 74 29 0a 20 20 28 64 62 69 3a  s-count).  (dbi:
1260: 65 78 65 63 0a 20 20 20 64 62 68 0a 20 20 20 22  exec.   dbh.   "
1270: 49 4e 53 45 52 54 20 49 4e 54 4f 20 72 75 6e 73  INSERT INTO runs
1280: 20 28 74 74 79 70 65 5f 69 64 2c 74 61 72 67 65   (ttype_id,targe
1290: 74 2c 72 75 6e 5f 6e 61 6d 65 2c 73 74 61 74 65  t,run_name,state
12a0: 2c 73 74 61 74 75 73 2c 6f 77 6e 65 72 2c 65 76  ,status,owner,ev
12b0: 65 6e 74 5f 74 69 6d 65 2c 63 6f 6d 6d 65 6e 74  ent_time,comment
12c0: 2c 66 61 69 6c 5f 63 6f 75 6e 74 2c 70 61 73 73  ,fail_count,pass
12d0: 5f 63 6f 75 6e 74 29 0a 20 20 20 20 20 20 56 41  _count).      VA
12e0: 4c 55 45 53 20 28 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c  LUES (?,?,?,?,?,
12f0: 3f 2c 3f 2c 3f 2c 3f 2c 3f 29 3b 22 0a 20 20 20  ?,?,?,?,?);".   
1300: 20 74 74 79 70 65 2d 69 64 20 74 61 72 67 65 74   ttype-id target
1310: 20 72 75 6e 2d 6e 61 6d 65 20 73 74 61 74 65 20   run-name state 
1320: 73 74 61 74 75 73 20 6f 77 6e 65 72 20 65 76 65  status owner eve
1330: 6e 74 2d 74 69 6d 65 20 63 6f 6d 6d 65 6e 74 20  nt-time comment 
1340: 66 61 69 6c 2d 63 6f 75 6e 74 20 70 61 73 73 2d  fail-count pass-
1350: 63 6f 75 6e 74 29 29 0a 0a 3b 3b 3d 3d 3d 3d 3d  count))..;;=====
1360: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1370: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1380: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
1390: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
13a0: 3d 0a 3b 3b 20 20 54 20 45 20 53 20 54 20 53 0a  =.;;  T E S T S.
13b0: 3b 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;;==============
13c0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
13d0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
13e0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
13f0: 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 67 69 76  ========..;; giv
1400: 65 6e 20 72 75 6e 2d 69 64 2c 20 74 65 73 74 5f  en run-id, test_
1410: 6e 61 6d 65 20 61 6e 64 20 69 74 65 6d 5f 70 61  name and item_pa
1420: 74 68 20 72 65 74 75 72 6e 20 74 65 73 74 2d 69  th return test-i
1430: 64 0a 3b 3b 0a 28 64 65 66 69 6e 65 20 28 70 67  d.;;.(define (pg
1440: 64 62 3a 67 65 74 2d 74 65 73 74 2d 69 64 20 64  db:get-test-id d
1450: 62 68 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e  bh run-id test-n
1460: 61 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 0a 20  ame item-path). 
1470: 20 28 64 62 69 3a 67 65 74 2d 6f 6e 65 0a 20 20   (dbi:get-one.  
1480: 20 64 62 68 0a 20 20 20 22 53 45 4c 45 43 54 20   dbh.   "SELECT 
1490: 69 64 20 46 52 4f 4d 20 74 65 73 74 73 20 57 48  id FROM tests WH
14a0: 45 52 45 20 72 75 6e 5f 69 64 3d 3f 20 41 4e 44  ERE run_id=? AND
14b0: 20 74 65 73 74 5f 6e 61 6d 65 3d 3f 20 41 4e 44   test_name=? AND
14c0: 20 69 74 65 6d 5f 70 61 74 68 3d 3f 3b 22 0a 20   item_path=?;". 
14d0: 20 20 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61    run-id test-na
14e0: 6d 65 20 69 74 65 6d 2d 70 61 74 68 29 29 0a 0a  me item-path))..
14f0: 3b 3b 20 63 72 65 61 74 65 20 6e 65 77 20 74 65  ;; create new te
1500: 73 74 20 72 65 63 6f 72 64 0a 3b 3b 0a 28 64 65  st record.;;.(de
1510: 66 69 6e 65 20 28 70 67 64 62 3a 69 6e 73 65 72  fine (pgdb:inser
1520: 74 2d 74 65 73 74 20 64 62 68 20 72 75 6e 2d 69  t-test dbh run-i
1530: 64 20 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d  d test-name item
1540: 2d 70 61 74 68 20 73 74 61 74 65 20 73 74 61 74  -path state stat
1550: 75 73 20 68 6f 73 74 20 63 70 75 6c 6f 61 64 20  us host cpuload 
1560: 64 69 73 6b 66 72 65 65 20 75 6e 61 6d 65 20 72  diskfree uname r
1570: 75 6e 2d 64 69 72 20 6c 6f 67 2d 66 69 6c 65 20  un-dir log-file 
1580: 72 75 6e 2d 64 75 72 61 74 69 6f 6e 20 63 6f 6d  run-duration com
1590: 6d 65 6e 74 20 65 76 65 6e 74 2d 74 69 6d 65 20  ment event-time 
15a0: 61 72 63 68 69 76 65 64 29 0a 20 20 28 64 62 69  archived).  (dbi
15b0: 3a 65 78 65 63 0a 20 20 20 64 62 68 0a 20 20 20  :exec.   dbh.   
15c0: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 65 73  "INSERT INTO tes
15d0: 74 73 20 28 72 75 6e 5f 69 64 2c 74 65 73 74 5f  ts (run_id,test_
15e0: 6e 61 6d 65 2c 69 74 65 6d 5f 70 61 74 68 2c 73  name,item_path,s
15f0: 74 61 74 65 2c 73 74 61 74 75 73 2c 68 6f 73 74  tate,status,host
1600: 2c 63 70 75 6c 6f 61 64 2c 64 69 73 6b 66 72 65  ,cpuload,diskfre
1610: 65 2c 75 6e 61 6d 65 2c 72 75 6e 64 69 72 2c 66  e,uname,rundir,f
1620: 69 6e 61 6c 5f 6c 6f 67 66 2c 72 75 6e 5f 64 75  inal_logf,run_du
1630: 72 61 74 69 6f 6e 2c 63 6f 6d 6d 65 6e 74 2c 65  ration,comment,e
1640: 76 65 6e 74 5f 74 69 6d 65 2c 61 72 63 68 69 76  vent_time,archiv
1650: 65 64 29 0a 20 20 20 20 20 20 20 56 41 4c 55 45  ed).       VALUE
1660: 53 20 28 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f  S (?,?,?,?,?,?,?
1670: 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f 2c 3f  ,?,?,?,?,?,?,?,?
1680: 29 3b 22 0a 0a 20 20 20 72 75 6e 2d 69 64 20 20  );"..   run-id  
1690: 74 65 73 74 2d 6e 61 6d 65 20 69 74 65 6d 2d 70  test-name item-p
16a0: 61 74 68 20 20 20 20 73 74 61 74 65 20 20 20 73  ath    state   s
16b0: 74 61 74 75 73 20 20 20 20 20 68 6f 73 74 20 20  tatus     host  
16c0: 63 70 75 6c 6f 61 64 20 64 69 73 6b 66 72 65 65  cpuload diskfree
16d0: 20 75 6e 61 6d 65 0a 20 20 20 72 75 6e 2d 64 69   uname.   run-di
16e0: 72 20 6c 6f 67 2d 66 69 6c 65 20 20 72 75 6e 2d  r log-file  run-
16f0: 64 75 72 61 74 69 6f 6e 20 63 6f 6d 6d 65 6e 74  duration comment
1700: 20 65 76 65 6e 74 2d 74 69 6d 65 20 61 72 63 68   event-time arch
1710: 69 76 65 64 29 29 0a 0a 3b 3b 20 75 70 64 61 74  ived))..;; updat
1720: 65 20 65 78 69 73 74 69 6e 67 20 74 65 73 74 20  e existing test 
1730: 72 65 63 6f 72 64 0a 3b 3b 0a 28 64 65 66 69 6e  record.;;.(defin
1740: 65 20 28 70 67 64 62 3a 75 70 64 61 74 65 2d 74  e (pgdb:update-t
1750: 65 73 74 20 64 62 68 20 74 65 73 74 2d 69 64 20  est dbh test-id 
1760: 72 75 6e 2d 69 64 20 74 65 73 74 2d 6e 61 6d 65  run-id test-name
1770: 20 69 74 65 6d 2d 70 61 74 68 20 73 74 61 74 65   item-path state
1780: 20 73 74 61 74 75 73 20 68 6f 73 74 20 63 70 75   status host cpu
1790: 6c 6f 61 64 20 64 69 73 6b 66 72 65 65 20 75 6e  load diskfree un
17a0: 61 6d 65 20 72 75 6e 2d 64 69 72 20 6c 6f 67 2d  ame run-dir log-
17b0: 66 69 6c 65 20 72 75 6e 2d 64 75 72 61 74 69 6f  file run-duratio
17c0: 6e 20 63 6f 6d 6d 65 6e 74 20 65 76 65 6e 74 2d  n comment event-
17d0: 74 69 6d 65 20 61 72 63 68 69 76 65 64 29 0a 20  time archived). 
17e0: 20 28 64 62 69 3a 65 78 65 63 0a 20 20 20 64 62   (dbi:exec.   db
17f0: 68 0a 20 20 20 22 55 50 44 41 54 45 20 74 65 73  h.   "UPDATE tes
1800: 74 73 20 53 45 54 0a 20 20 20 20 20 20 72 75 6e  ts SET.      run
1810: 5f 69 64 3d 3f 2c 74 65 73 74 5f 6e 61 6d 65 3d  _id=?,test_name=
1820: 3f 2c 69 74 65 6d 5f 70 61 74 68 3d 3f 2c 73 74  ?,item_path=?,st
1830: 61 74 65 3d 3f 2c 73 74 61 74 75 73 3d 3f 2c 68  ate=?,status=?,h
1840: 6f 73 74 3d 3f 2c 63 70 75 6c 6f 61 64 3d 3f 2c  ost=?,cpuload=?,
1850: 64 69 73 6b 66 72 65 65 3d 3f 2c 75 6e 61 6d 65  diskfree=?,uname
1860: 3d 3f 2c 72 75 6e 64 69 72 3d 3f 2c 66 69 6e 61  =?,rundir=?,fina
1870: 6c 5f 6c 6f 67 66 3d 3f 2c 72 75 6e 5f 64 75 72  l_logf=?,run_dur
1880: 61 74 69 6f 6e 3d 3f 2c 63 6f 6d 6d 65 6e 74 3d  ation=?,comment=
1890: 3f 2c 65 76 65 6e 74 5f 74 69 6d 65 3d 3f 2c 61  ?,event_time=?,a
18a0: 72 63 68 69 76 65 64 3d 3f 0a 20 20 20 20 57 48  rchived=?.    WH
18b0: 45 52 45 20 69 64 3d 3f 3b 22 0a 0a 20 20 20 72  ERE id=?;"..   r
18c0: 75 6e 2d 69 64 20 20 74 65 73 74 2d 6e 61 6d 65  un-id  test-name
18d0: 20 69 74 65 6d 2d 70 61 74 68 20 20 20 20 73 74   item-path    st
18e0: 61 74 65 20 20 20 73 74 61 74 75 73 20 20 20 20  ate   status    
18f0: 20 68 6f 73 74 20 20 63 70 75 6c 6f 61 64 20 64   host  cpuload d
1900: 69 73 6b 66 72 65 65 20 75 6e 61 6d 65 0a 20 20  iskfree uname.  
1910: 20 72 75 6e 2d 64 69 72 20 6c 6f 67 2d 66 69 6c   run-dir log-fil
1920: 65 20 20 72 75 6e 2d 64 75 72 61 74 69 6f 6e 20  e  run-duration 
1930: 63 6f 6d 6d 65 6e 74 20 65 76 65 6e 74 2d 74 69  comment event-ti
1940: 6d 65 20 61 72 63 68 69 76 65 64 20 74 65 73 74  me archived test
1950: 2d 69 64 29 29 0a 0a 28 64 65 66 69 6e 65 20 28  -id))..(define (
1960: 70 67 64 62 3a 67 65 74 2d 74 65 73 74 73 20 64  pgdb:get-tests d
1970: 62 68 20 74 61 72 67 65 74 2d 70 61 74 74 29 0a  bh target-patt).
1980: 20 20 28 64 62 69 3a 67 65 74 2d 72 6f 77 73 0a    (dbi:get-rows.
1990: 20 20 20 64 62 68 0a 20 20 20 22 53 45 4c 45 43     dbh.   "SELEC
19a0: 54 20 74 2e 69 64 2c 74 2e 72 75 6e 5f 69 64 2c  T t.id,t.run_id,
19b0: 74 2e 74 65 73 74 5f 6e 61 6d 65 2c 74 2e 69 74  t.test_name,t.it
19c0: 65 6d 5f 70 61 74 68 2c 74 2e 73 74 61 74 65 2c  em_path,t.state,
19d0: 74 2e 73 74 61 74 75 73 2c 74 2e 68 6f 73 74 2c  t.status,t.host,
19e0: 74 2e 63 70 75 6c 6f 61 64 2c 74 2e 64 69 73 6b  t.cpuload,t.disk
19f0: 66 72 65 65 2c 74 2e 75 6e 61 6d 65 2c 74 2e 72  free,t.uname,t.r
1a00: 75 6e 64 69 72 2c 74 2e 66 69 6e 61 6c 5f 6c 6f  undir,t.final_lo
1a10: 67 66 2c 74 2e 72 75 6e 5f 64 75 72 61 74 69 6f  gf,t.run_duratio
1a20: 6e 2c 74 2e 63 6f 6d 6d 65 6e 74 2c 74 2e 65 76  n,t.comment,t.ev
1a30: 65 6e 74 5f 74 69 6d 65 2c 74 2e 61 72 63 68 69  ent_time,t.archi
1a40: 76 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ved,.           
1a50: 72 2e 69 64 2c 72 2e 74 61 72 67 65 74 2c 72 2e  r.id,r.target,r.
1a60: 74 74 79 70 65 5f 69 64 2c 72 2e 72 75 6e 5f 6e  ttype_id,r.run_n
1a70: 61 6d 65 2c 72 2e 73 74 61 74 65 2c 72 2e 73 74  ame,r.state,r.st
1a80: 61 74 75 73 2c 72 2e 6f 77 6e 65 72 2c 72 2e 65  atus,r.owner,r.e
1a90: 76 65 6e 74 5f 74 69 6d 65 2c 72 2e 63 6f 6d 6d  vent_time,r.comm
1aa0: 65 6e 74 0a 20 20 20 20 20 46 52 4f 4d 20 74 65  ent.     FROM te
1ab0: 73 74 73 20 41 53 20 74 20 49 4e 4e 45 52 20 4a  sts AS t INNER J
1ac0: 4f 49 4e 20 72 75 6e 73 20 41 53 20 72 20 4f 4e  OIN runs AS r ON
1ad0: 20 74 2e 72 75 6e 5f 69 64 3d 72 2e 69 64 0a 20   t.run_id=r.id. 
1ae0: 20 20 20 20 20 57 48 45 52 45 20 72 2e 74 61 72       WHERE r.tar
1af0: 67 65 74 20 4c 49 4b 45 20 3f 3b 22 20 74 61 72  get LIKE ?;" tar
1b00: 67 65 74 2d 70 61 74 74 29 29 0a 0a 28 64 65 66  get-patt))..(def
1b10: 69 6e 65 20 28 70 67 64 62 3a 67 65 74 2d 73 74  ine (pgdb:get-st
1b20: 61 74 73 2d 67 69 76 65 6e 2d 74 79 70 65 2d 74  ats-given-type-t
1b30: 61 72 67 65 74 20 64 62 68 20 74 74 79 70 65 2d  arget dbh ttype-
1b40: 69 64 20 74 61 72 67 65 74 2d 70 61 74 74 29 0a  id target-patt).
1b50: 20 20 28 64 62 69 3a 67 65 74 2d 72 6f 77 73 0a    (dbi:get-rows.
1b60: 20 20 20 64 62 68 0a 20 20 20 3b 3b 20 20 20 20     dbh.   ;;    
1b70: 22 53 45 4c 45 43 54 20 43 4f 55 4e 54 28 74 2e  "SELECT COUNT(t.
1b80: 69 64 29 2c 74 2e 73 74 61 74 75 73 2c 72 2e 74  id),t.status,r.t
1b90: 61 72 67 65 74 20 46 52 4f 4d 20 74 65 73 74 73  arget FROM tests
1ba0: 20 41 53 20 74 20 49 4e 4e 45 52 20 4a 4f 49 4e   AS t INNER JOIN
1bb0: 20 72 75 6e 73 20 41 53 20 72 20 4f 4e 20 74 2e   runs AS r ON t.
1bc0: 72 75 6e 5f 69 64 3d 72 2e 69 64 0a 20 20 20 3b  run_id=r.id.   ;
1bd0: 3b 20 20 20 20 20 20 20 20 20 57 48 45 52 45 20  ;         WHERE 
1be0: 74 2e 73 74 61 74 65 3d 27 43 4f 4d 50 4c 45 54  t.state='COMPLET
1bf0: 45 44 27 20 41 4e 44 20 74 74 79 70 65 5f 69 64  ED' AND ttype_id
1c00: 3d 3f 20 41 4e 44 20 72 2e 74 61 72 67 65 74 20  =? AND r.target 
1c10: 4c 49 4b 45 20 3f 20 47 52 4f 55 50 20 42 59 20  LIKE ? GROUP BY 
1c20: 72 2e 74 61 72 67 65 74 2c 74 2e 73 74 61 74 75  r.target,t.statu
1c30: 73 3b 22 0a 20 20 20 22 53 45 4c 45 43 54 20 72  s;".   "SELECT r
1c40: 2e 74 61 72 67 65 74 2c 43 4f 55 4e 54 28 2a 29  .target,COUNT(*)
1c50: 20 41 53 20 74 6f 74 61 6c 2c 0a 20 20 20 20 20   AS total,.     
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1c70: 55 4d 28 43 41 53 45 20 57 48 45 4e 20 74 2e 73  UM(CASE WHEN t.s
1c80: 74 61 74 75 73 3d 27 50 41 53 53 27 20 54 48 45  tatus='PASS' THE
1c90: 4e 20 31 20 45 4c 53 45 20 30 20 45 4e 44 29 20  N 1 ELSE 0 END) 
1ca0: 41 53 20 70 61 73 73 2c 0a 20 20 20 20 20 20 20  AS pass,.       
1cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 55 4d               SUM
1cc0: 28 43 41 53 45 20 57 48 45 4e 20 74 2e 73 74 61  (CASE WHEN t.sta
1cd0: 74 75 73 3d 27 46 41 49 4c 27 20 54 48 45 4e 20  tus='FAIL' THEN 
1ce0: 31 20 45 4c 53 45 20 30 20 45 4e 44 29 20 41 53  1 ELSE 0 END) AS
1cf0: 20 66 61 69 6c 2c 0a 20 20 20 20 20 20 20 20 20   fail,.         
1d00: 20 20 20 20 20 20 20 20 20 20 20 53 55 4d 28 43             SUM(C
1d10: 41 53 45 20 57 48 45 4e 20 74 2e 73 74 61 74 75  ASE WHEN t.statu
1d20: 73 20 49 4e 20 28 27 50 41 53 53 27 2c 27 46 41  s IN ('PASS','FA
1d30: 49 4c 27 29 20 54 48 45 4e 20 30 20 45 4c 53 45  IL') THEN 0 ELSE
1d40: 20 31 20 45 4e 44 29 20 41 53 20 6f 74 68 65 72   1 END) AS other
1d50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 46 52 4f  .            FRO
1d60: 4d 20 74 65 73 74 73 20 41 53 20 74 20 49 4e 4e  M tests AS t INN
1d70: 45 52 20 4a 4f 49 4e 20 72 75 6e 73 20 41 53 20  ER JOIN runs AS 
1d80: 72 20 4f 4e 20 74 2e 72 75 6e 5f 69 64 3d 72 2e  r ON t.run_id=r.
1d90: 69 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 57  id.            W
1da0: 48 45 52 45 20 74 2e 73 74 61 74 65 3d 27 43 4f  HERE t.state='CO
1db0: 4d 50 4c 45 54 45 44 27 20 41 4e 44 20 74 74 79  MPLETED' AND tty
1dc0: 70 65 5f 69 64 3d 3f 20 41 4e 44 20 72 2e 74 61  pe_id=? AND r.ta
1dd0: 72 67 65 74 20 4c 49 4b 45 20 3f 20 47 52 4f 55  rget LIKE ? GROU
1de0: 50 20 42 59 20 72 2e 74 61 72 67 65 74 3b 22 0a  P BY r.target;".
1df0: 20 20 20 74 74 79 70 65 2d 69 64 20 74 61 72 67     ttype-id targ
1e00: 65 74 2d 70 61 74 74 29 29 0a 0a 28 64 65 66 69  et-patt))..(defi
1e10: 6e 65 20 28 70 67 64 62 3a 67 65 74 2d 73 74 61  ne (pgdb:get-sta
1e20: 74 73 2d 67 69 76 65 6e 2d 74 61 72 67 65 74 20  ts-given-target 
1e30: 64 62 68 20 74 61 72 67 65 74 2d 70 61 74 74 29  dbh target-patt)
1e40: 0a 20 20 28 64 62 69 3a 67 65 74 2d 72 6f 77 73  .  (dbi:get-rows
1e50: 0a 20 20 20 64 62 68 0a 20 20 20 3b 3b 20 20 20  .   dbh.   ;;   
1e60: 20 22 53 45 4c 45 43 54 20 43 4f 55 4e 54 28 74   "SELECT COUNT(t
1e70: 2e 69 64 29 2c 74 2e 73 74 61 74 75 73 2c 72 2e  .id),t.status,r.
1e80: 74 61 72 67 65 74 20 46 52 4f 4d 20 74 65 73 74  target FROM test
1e90: 73 20 41 53 20 74 20 49 4e 4e 45 52 20 4a 4f 49  s AS t INNER JOI
1ea0: 4e 20 72 75 6e 73 20 41 53 20 72 20 4f 4e 20 74  N runs AS r ON t
1eb0: 2e 72 75 6e 5f 69 64 3d 72 2e 69 64 0a 20 20 20  .run_id=r.id.   
1ec0: 3b 3b 20 20 20 20 20 20 20 20 20 57 48 45 52 45  ;;         WHERE
1ed0: 20 74 2e 73 74 61 74 65 3d 27 43 4f 4d 50 4c 45   t.state='COMPLE
1ee0: 54 45 44 27 20 41 4e 44 20 74 74 79 70 65 5f 69  TED' AND ttype_i
1ef0: 64 3d 3f 20 41 4e 44 20 72 2e 74 61 72 67 65 74  d=? AND r.target
1f00: 20 4c 49 4b 45 20 3f 20 47 52 4f 55 50 20 42 59   LIKE ? GROUP BY
1f10: 20 72 2e 74 61 72 67 65 74 2c 74 2e 73 74 61 74   r.target,t.stat
1f20: 75 73 3b 22 0a 20 20 20 22 53 45 4c 45 43 54 20  us;".   "SELECT 
1f30: 72 2e 74 61 72 67 65 74 2c 43 4f 55 4e 54 28 2a  r.target,COUNT(*
1f40: 29 20 41 53 20 74 6f 74 61 6c 2c 0a 20 20 20 20  ) AS total,.    
1f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f60: 53 55 4d 28 43 41 53 45 20 57 48 45 4e 20 74 2e  SUM(CASE WHEN t.
1f70: 73 74 61 74 75 73 3d 27 50 41 53 53 27 20 54 48  status='PASS' TH
1f80: 45 4e 20 31 20 45 4c 53 45 20 30 20 45 4e 44 29  EN 1 ELSE 0 END)
1f90: 20 41 53 20 70 61 73 73 2c 0a 20 20 20 20 20 20   AS pass,.      
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 55                SU
1fb0: 4d 28 43 41 53 45 20 57 48 45 4e 20 74 2e 73 74  M(CASE WHEN t.st
1fc0: 61 74 75 73 3d 27 46 41 49 4c 27 20 54 48 45 4e  atus='FAIL' THEN
1fd0: 20 31 20 45 4c 53 45 20 30 20 45 4e 44 29 20 41   1 ELSE 0 END) A
1fe0: 53 20 66 61 69 6c 2c 0a 20 20 20 20 20 20 20 20  S fail,.        
1ff0: 20 20 20 20 20 20 20 20 20 20 20 20 53 55 4d 28              SUM(
2000: 43 41 53 45 20 57 48 45 4e 20 74 2e 73 74 61 74  CASE WHEN t.stat
2010: 75 73 20 49 4e 20 28 27 50 41 53 53 27 2c 27 46  us IN ('PASS','F
2020: 41 49 4c 27 29 20 54 48 45 4e 20 30 20 45 4c 53  AIL') THEN 0 ELS
2030: 45 20 31 20 45 4e 44 29 20 41 53 20 6f 74 68 65  E 1 END) AS othe
2040: 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 46 52  r.            FR
2050: 4f 4d 20 74 65 73 74 73 20 41 53 20 74 20 49 4e  OM tests AS t IN
2060: 4e 45 52 20 4a 4f 49 4e 20 72 75 6e 73 20 41 53  NER JOIN runs AS
2070: 20 72 20 4f 4e 20 74 2e 72 75 6e 5f 69 64 3d 72   r ON t.run_id=r
2080: 2e 69 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  .id.            
2090: 57 48 45 52 45 20 74 2e 73 74 61 74 65 3d 27 43  WHERE t.state='C
20a0: 4f 4d 50 4c 45 54 45 44 27 20 41 4e 44 20 72 2e  OMPLETED' AND r.
20b0: 74 61 72 67 65 74 20 4c 49 4b 45 20 3f 20 47 52  target LIKE ? GR
20c0: 4f 55 50 20 42 59 20 72 2e 74 61 72 67 65 74 3b  OUP BY r.target;
20d0: 22 0a 20 20 20 74 61 72 67 65 74 2d 70 61 74 74  ".   target-patt
20e0: 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 70 67 64  ))..(define (pgd
20f0: 62 3a 67 65 74 2d 6c 61 74 65 73 74 2d 72 75 6e  b:get-latest-run
2100: 2d 73 74 61 74 73 2d 67 69 76 65 6e 2d 74 61 72  -stats-given-tar
2110: 67 65 74 20 64 62 68 20 74 74 79 70 65 2d 69 64  get dbh ttype-id
2120: 20 74 61 72 67 65 74 2d 70 61 74 74 29 0a 20 20   target-patt).  
2130: 28 64 62 69 3a 67 65 74 2d 72 6f 77 73 0a 20 20  (dbi:get-rows.  
2140: 20 64 62 68 0a 20 20 20 3b 3b 20 20 20 20 22 53   dbh.   ;;    "S
2150: 45 4c 45 43 54 20 43 4f 55 4e 54 28 74 2e 69 64  ELECT COUNT(t.id
2160: 29 2c 74 2e 73 74 61 74 75 73 2c 72 2e 74 61 72  ),t.status,r.tar
2170: 67 65 74 20 46 52 4f 4d 20 74 65 73 74 73 20 41  get FROM tests A
2180: 53 20 74 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 72  S t INNER JOIN r
2190: 75 6e 73 20 41 53 20 72 20 4f 4e 20 74 2e 72 75  uns AS r ON t.ru
21a0: 6e 5f 69 64 3d 72 2e 69 64 0a 20 20 20 3b 3b 20  n_id=r.id.   ;; 
21b0: 20 20 20 20 20 20 20 20 57 48 45 52 45 20 74 2e          WHERE t.
21c0: 73 74 61 74 65 3d 27 43 4f 4d 50 4c 45 54 45 44  state='COMPLETED
21d0: 27 20 41 4e 44 20 74 74 79 70 65 5f 69 64 3d 3f  ' AND ttype_id=?
21e0: 20 41 4e 44 20 72 2e 74 61 72 67 65 74 20 4c 49   AND r.target LI
21f0: 4b 45 20 3f 20 47 52 4f 55 50 20 42 59 20 72 2e  KE ? GROUP BY r.
2200: 74 61 72 67 65 74 2c 74 2e 73 74 61 74 75 73 3b  target,t.status;
2210: 22 0a 20 20 20 22 53 45 4c 45 43 54 20 72 2e 74  ".   "SELECT r.t
2220: 61 72 67 65 74 2c 43 4f 55 4e 54 28 2a 29 20 41  arget,COUNT(*) A
2230: 53 20 74 6f 74 61 6c 2c 0a 20 20 20 20 20 20 20  S total,.       
2240: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 55 4d               SUM
2250: 28 43 41 53 45 20 57 48 45 4e 20 74 2e 73 74 61  (CASE WHEN t.sta
2260: 74 75 73 3d 27 50 41 53 53 27 20 54 48 45 4e 20  tus='PASS' THEN 
2270: 31 20 45 4c 53 45 20 30 20 45 4e 44 29 20 41 53  1 ELSE 0 END) AS
2280: 20 70 61 73 73 2c 0a 20 20 20 20 20 20 20 20 20   pass,.         
2290: 20 20 20 20 20 20 20 20 20 20 20 53 55 4d 28 43             SUM(C
22a0: 41 53 45 20 57 48 45 4e 20 74 2e 73 74 61 74 75  ASE WHEN t.statu
22b0: 73 3d 27 46 41 49 4c 27 20 54 48 45 4e 20 31 20  s='FAIL' THEN 1 
22c0: 45 4c 53 45 20 30 20 45 4e 44 29 20 41 53 20 66  ELSE 0 END) AS f
22d0: 61 69 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ail,.           
22e0: 20 20 20 20 20 20 20 20 20 53 55 4d 28 43 41 53           SUM(CAS
22f0: 45 20 57 48 45 4e 20 74 2e 73 74 61 74 75 73 20  E WHEN t.status 
2300: 49 4e 20 28 27 50 41 53 53 27 2c 27 46 41 49 4c  IN ('PASS','FAIL
2310: 27 29 20 54 48 45 4e 20 30 20 45 4c 53 45 20 31  ') THEN 0 ELSE 1
2320: 20 45 4e 44 29 20 41 53 20 6f 74 68 65 72 2c 20   END) AS other, 
2330: 72 2e 69 64 0a 20 20 20 20 20 20 20 20 20 20 20  r.id.           
2340: 20 46 52 4f 4d 20 74 65 73 74 73 20 41 53 20 74   FROM tests AS t
2350: 20 49 4e 4e 45 52 20 4a 4f 49 4e 20 72 75 6e 73   INNER JOIN runs
2360: 20 41 53 20 72 20 4f 4e 20 74 2e 72 75 6e 5f 69   AS r ON t.run_i
2370: 64 3d 72 2e 69 64 0a 20 20 20 20 20 20 20 20 20  d=r.id.         
2380: 20 20 20 57 48 45 52 45 20 74 2e 73 74 61 74 65     WHERE t.state
2390: 20 6c 69 6b 65 20 27 25 27 20 20 41 4e 44 20 74   like '%'  AND t
23a0: 74 79 70 65 5f 69 64 3d 3f 20 41 4e 44 20 72 2e  type_id=? AND r.
23b0: 74 61 72 67 65 74 20 4c 49 4b 45 20 3f 20 0a 20  target LIKE ? . 
23c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d0: 61 6e 64 20 72 2e 69 64 20 69 6e 20 0a 28 53 45  and r.id in .(SE
23e0: 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 6f 6e  LECT DISTINCT on
23f0: 20 28 74 61 72 67 65 74 29 20 69 64 20 66 72 6f   (target) id fro
2400: 6d 20 72 75 6e 73 20 77 68 65 72 65 20 74 61 72  m runs where tar
2410: 67 65 74 20 6c 69 6b 65 20 3f 20 41 4e 44 20 74  get like ? AND t
2420: 74 79 70 65 5f 69 64 3d 3f 20 6f 72 64 65 72 20  type_id=? order 
2430: 62 79 20 74 61 72 67 65 74 2c 65 76 65 6e 74 5f  by target,event_
2440: 74 69 6d 65 20 64 65 73 63 29 20 47 52 4f 55 50  time desc) GROUP
2450: 20 42 59 20 72 2e 74 61 72 67 65 74 2c 72 2e 69   BY r.target,r.i
2460: 64 3b 22 0a 20 20 20 74 74 79 70 65 2d 69 64 20  d;".   ttype-id 
2470: 74 61 72 67 65 74 2d 70 61 74 74 20 74 61 72 67  target-patt targ
2480: 65 74 2d 70 61 74 74 20 74 74 79 70 65 2d 69 64  et-patt ttype-id
2490: 29 29 0a 0a 28 64 65 66 69 6e 65 20 28 70 67 64  ))..(define (pgd
24a0: 62 3a 67 65 74 2d 72 75 6e 2d 73 74 61 74 73 2d  b:get-run-stats-
24b0: 68 69 73 74 6f 72 79 2d 67 69 76 65 6e 2d 74 61  history-given-ta
24c0: 72 67 65 74 20 64 62 68 20 74 74 79 70 65 2d 69  rget dbh ttype-i
24d0: 64 20 74 61 72 67 65 74 2d 70 61 74 74 29 0a 20  d target-patt). 
24e0: 20 28 64 62 69 3a 67 65 74 2d 72 6f 77 73 0a 20   (dbi:get-rows. 
24f0: 20 20 64 62 68 0a 20 20 20 3b 3b 20 20 20 20 22    dbh.   ;;    "
2500: 53 45 4c 45 43 54 20 43 4f 55 4e 54 28 74 2e 69  SELECT COUNT(t.i
2510: 64 29 2c 74 2e 73 74 61 74 75 73 2c 72 2e 74 61  d),t.status,r.ta
2520: 72 67 65 74 20 46 52 4f 4d 20 74 65 73 74 73 20  rget FROM tests 
2530: 41 53 20 74 20 49 4e 4e 45 52 20 4a 4f 49 4e 20  AS t INNER JOIN 
2540: 72 75 6e 73 20 41 53 20 72 20 4f 4e 20 74 2e 72  runs AS r ON t.r
2550: 75 6e 5f 69 64 3d 72 2e 69 64 0a 20 20 20 3b 3b  un_id=r.id.   ;;
2560: 20 20 20 20 20 20 20 20 20 57 48 45 52 45 20 74           WHERE t
2570: 2e 73 74 61 74 65 3d 27 43 4f 4d 50 4c 45 54 45  .state='COMPLETE
2580: 44 27 20 41 4e 44 20 74 74 79 70 65 5f 69 64 3d  D' AND ttype_id=
2590: 3f 20 41 4e 44 20 72 2e 74 61 72 67 65 74 20 4c  ? AND r.target L
25a0: 49 4b 45 20 3f 20 47 52 4f 55 50 20 42 59 20 72  IKE ? GROUP BY r
25b0: 2e 74 61 72 67 65 74 2c 74 2e 73 74 61 74 75 73  .target,t.status
25c0: 3b 22 0a 20 20 20 22 53 45 4c 45 43 54 20 72 2e  ;".   "SELECT r.
25d0: 72 75 6e 5f 6e 61 6d 65 2c 43 4f 55 4e 54 28 2a  run_name,COUNT(*
25e0: 29 20 41 53 20 74 6f 74 61 6c 2c 0a 20 20 20 20  ) AS total,.    
25f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2600: 53 55 4d 28 43 41 53 45 20 57 48 45 4e 20 74 2e  SUM(CASE WHEN t.
2610: 73 74 61 74 75 73 3d 27 50 41 53 53 27 20 54 48  status='PASS' TH
2620: 45 4e 20 31 20 45 4c 53 45 20 30 20 45 4e 44 29  EN 1 ELSE 0 END)
2630: 20 41 53 20 70 61 73 73 2c 0a 20 20 20 20 20 20   AS pass,.      
2640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 55                SU
2650: 4d 28 43 41 53 45 20 57 48 45 4e 20 74 2e 73 74  M(CASE WHEN t.st
2660: 61 74 75 73 3d 27 46 41 49 4c 27 20 54 48 45 4e  atus='FAIL' THEN
2670: 20 31 20 45 4c 53 45 20 30 20 45 4e 44 29 20 41   1 ELSE 0 END) A
2680: 53 20 66 61 69 6c 2c 0a 20 20 20 20 20 20 20 20  S fail,.        
2690: 20 20 20 20 20 20 20 20 20 20 20 20 53 55 4d 28              SUM(
26a0: 43 41 53 45 20 57 48 45 4e 20 74 2e 73 74 61 74  CASE WHEN t.stat
26b0: 75 73 20 49 4e 20 28 27 50 41 53 53 27 2c 27 46  us IN ('PASS','F
26c0: 41 49 4c 27 29 20 54 48 45 4e 20 30 20 45 4c 53  AIL') THEN 0 ELS
26d0: 45 20 31 20 45 4e 44 29 20 41 53 20 6f 74 68 65  E 1 END) AS othe
26e0: 72 0a 20 20 20 20 20 20 20 20 20 20 20 20 46 52  r.            FR
26f0: 4f 4d 20 74 65 73 74 73 20 41 53 20 74 20 49 4e  OM tests AS t IN
2700: 4e 45 52 20 4a 4f 49 4e 20 72 75 6e 73 20 41 53  NER JOIN runs AS
2710: 20 72 20 4f 4e 20 74 2e 72 75 6e 5f 69 64 3d 72   r ON t.run_id=r
2720: 2e 69 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  .id.            
2730: 57 48 45 52 45 20 74 2e 73 74 61 74 65 20 6c 69  WHERE t.state li
2740: 6b 65 20 27 25 27 20 20 41 4e 44 20 74 74 79 70  ke '%'  AND ttyp
2750: 65 5f 69 64 3d 3f 20 41 4e 44 20 72 2e 74 61 72  e_id=? AND r.tar
2760: 67 65 74 20 4c 49 4b 45 20 3f 20 0a 20 20 20 20  get LIKE ? .    
2770: 20 20 20 20 20 20 20 20 20 20 20 20 20 47 52 4f               GRO
2780: 55 50 20 42 59 20 72 2e 72 75 6e 5f 6e 61 6d 65  UP BY r.run_name
2790: 3b 22 0a 20 20 20 74 74 79 70 65 2d 69 64 20 74  ;".   ttype-id t
27a0: 61 72 67 65 74 2d 70 61 74 74 20 29 29 0a 0a 28  arget-patt ))..(
27b0: 64 65 66 69 6e 65 20 28 70 67 64 62 3a 67 65 74  define (pgdb:get
27c0: 2d 61 6c 6c 2d 72 75 6e 2d 73 74 61 74 73 2d 74  -all-run-stats-t
27d0: 61 72 67 65 74 2d 73 6c 69 63 65 20 64 62 68 20  arget-slice dbh 
27e0: 74 61 72 67 65 74 2d 70 61 74 74 29 0a 28 64 62  target-patt).(db
27f0: 69 3a 67 65 74 2d 72 6f 77 73 0a 20 20 20 64 62  i:get-rows.   db
2800: 68 0a 20 20 20 22 53 45 4c 45 43 54 20 20 72 2e  h.   "SELECT  r.
2810: 74 61 72 67 65 74 2c 20 72 2e 72 75 6e 5f 6e 61  target, r.run_na
2820: 6d 65 2c 72 2e 65 76 65 6e 74 5f 74 69 6d 65 2c  me,r.event_time,
2830: 20 43 4f 55 4e 54 28 2a 29 20 41 53 20 74 6f 74   COUNT(*) AS tot
2840: 61 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  al,.            
2850: 20 20 20 20 20 20 20 20 53 55 4d 28 43 41 53 45          SUM(CASE
2860: 20 57 48 45 4e 20 74 2e 73 74 61 74 75 73 3d 27   WHEN t.status='
2870: 50 41 53 53 27 20 54 48 45 4e 20 31 20 45 4c 53  PASS' THEN 1 ELS
2880: 45 20 30 20 45 4e 44 29 20 41 53 20 70 61 73 73  E 0 END) AS pass
2890: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28a0: 20 20 20 20 20 20 53 55 4d 28 43 41 53 45 20 57        SUM(CASE W
28b0: 48 45 4e 20 74 2e 73 74 61 74 75 73 3d 27 46 41  HEN t.status='FA
28c0: 49 4c 27 20 54 48 45 4e 20 31 20 45 4c 53 45 20  IL' THEN 1 ELSE 
28d0: 30 20 45 4e 44 29 20 41 53 20 66 61 69 6c 2c 0a  0 END) AS fail,.
28e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f0: 20 20 20 20 53 55 4d 28 43 41 53 45 20 57 48 45      SUM(CASE WHE
2900: 4e 20 74 2e 73 74 61 74 75 73 20 49 4e 20 28 27  N t.status IN ('
2910: 50 41 53 53 27 2c 27 46 41 49 4c 27 29 20 54 48  PASS','FAIL') TH
2920: 45 4e 20 30 20 45 4c 53 45 20 31 20 45 4e 44 29  EN 0 ELSE 1 END)
2930: 20 41 53 20 6f 74 68 65 72 0a 20 20 20 20 20 20   AS other.      
2940: 20 20 20 20 20 20 46 52 4f 4d 20 74 65 73 74 73        FROM tests
2950: 20 41 53 20 74 20 49 4e 4e 45 52 20 4a 4f 49 4e   AS t INNER JOIN
2960: 20 72 75 6e 73 20 41 53 20 72 20 4f 4e 20 74 2e   runs AS r ON t.
2970: 72 75 6e 5f 69 64 3d 72 2e 69 64 0a 20 20 20 20  run_id=r.id.    
2980: 20 20 20 20 20 20 20 20 57 48 45 52 45 20 72 2e          WHERE r.
2990: 74 61 72 67 65 74 20 4c 49 4b 45 20 3f 20 0a 20  target LIKE ? . 
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20              .   
29b0: 20 20 20 20 20 20 20 20 20 47 52 4f 55 50 20 42           GROUP B
29c0: 59 20 72 2e 74 61 72 67 65 74 2c 72 2e 72 75 6e  Y r.target,r.run
29d0: 5f 6e 61 6d 65 2c 20 72 2e 65 76 65 6e 74 5f 74  _name, r.event_t
29e0: 69 6d 65 3b 22 0a 20 20 20 20 74 61 72 67 65 74  ime;".    target
29f0: 2d 70 61 74 74 29 29 0a 0a 0a 28 64 65 66 69 6e  -patt))...(defin
2a00: 65 20 28 70 67 64 62 3a 67 65 74 2d 74 61 72 67  e (pgdb:get-targ
2a10: 65 74 2d 74 79 70 65 73 20 64 62 68 29 0a 20 20  et-types dbh).  
2a20: 28 64 62 69 3a 67 65 74 2d 72 6f 77 73 20 64 62  (dbi:get-rows db
2a30: 68 20 22 53 45 4c 45 43 54 20 69 64 2c 74 61 72  h "SELECT id,tar
2a40: 67 65 74 5f 73 70 65 63 20 46 52 4f 4d 20 74 74  get_spec FROM tt
2a50: 79 70 65 3b 22 29 29 0a 20 0a 20 28 64 65 66 69  ype;")). . (defi
2a60: 6e 65 20 28 70 67 64 62 3a 67 65 74 2d 64 69 73  ne (pgdb:get-dis
2a70: 74 69 63 74 2d 74 61 72 67 65 74 2d 73 6c 69 63  tict-target-slic
2a80: 65 20 64 62 68 29 0a 20 20 28 64 62 69 3a 67 65  e dbh).  (dbi:ge
2a90: 74 2d 72 6f 77 73 20 64 62 68 20 22 20 73 65 6c  t-rows dbh " sel
2aa0: 65 63 74 20 64 69 73 74 69 6e 63 74 20 6f 6e 20  ect distinct on 
2ab0: 28 73 70 6c 69 74 5f 70 61 72 74 20 28 74 61 72  (split_part (tar
2ac0: 67 65 74 2c 20 27 2f 27 2c 20 31 29 29 20 28 73  get, '/', 1)) (s
2ad0: 70 6c 69 74 5f 70 61 72 74 20 28 74 61 72 67 65  plit_part (targe
2ae0: 74 2c 20 27 2f 27 2c 20 31 29 29 20 66 72 6f 6d  t, '/', 1)) from
2af0: 20 72 75 6e 73 3b 22 29 29 0a 0a 0a 3b 3b 20 0a   runs;"))...;; .
2b00: 28 64 65 66 69 6e 65 20 28 70 67 64 62 3a 67 65  (define (pgdb:ge
2b10: 74 2d 74 61 72 67 65 74 73 20 64 62 68 20 74 61  t-targets dbh ta
2b20: 72 67 65 74 2d 70 61 74 74 29 0a 20 20 28 6c 65  rget-patt).  (le
2b30: 74 20 28 28 74 74 79 70 65 73 20 28 70 67 64 62  t ((ttypes (pgdb
2b40: 3a 67 65 74 2d 74 61 72 67 65 74 2d 74 79 70 65  :get-target-type
2b50: 73 20 64 62 68 29 29 29 0a 20 20 20 20 28 6d 61  s dbh))).    (ma
2b60: 70 0a 20 20 20 20 20 28 6c 61 6d 62 64 61 20 28  p.     (lambda (
2b70: 74 74 79 70 65 2d 64 61 74 29 0a 20 20 20 20 20  ttype-dat).     
2b80: 20 20 28 6c 65 74 20 28 28 74 74 2d 69 64 20 28    (let ((tt-id (
2b90: 76 65 63 74 6f 72 2d 72 65 66 20 74 74 79 70 65  vector-ref ttype
2ba0: 2d 64 61 74 20 30 29 29 0a 09 20 20 20 20 20 28  -dat 0))..     (
2bb0: 74 74 79 70 65 20 28 76 65 63 74 6f 72 2d 72 65  ttype (vector-re
2bc0: 66 20 74 74 79 70 65 2d 64 61 74 20 31 29 29 29  f ttype-dat 1)))
2bd0: 0a 09 20 28 63 6f 6e 73 20 74 74 79 70 65 0a 09  .. (cons ttype..
2be0: 20 20 20 20 20 20 20 28 64 62 69 3a 67 65 74 2d         (dbi:get-
2bf0: 72 6f 77 73 20 0a 09 09 64 62 68 0a 09 09 22 53  rows ...dbh..."S
2c00: 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 74  ELECT DISTINCT t
2c10: 61 72 67 65 74 20 46 52 4f 4d 20 72 75 6e 73 20  arget FROM runs 
2c20: 57 48 45 52 45 20 74 61 72 67 65 74 20 4c 49 4b  WHERE target LIK
2c30: 45 20 3f 20 41 4e 44 20 74 74 79 70 65 5f 69 64  E ? AND ttype_id
2c40: 3d 3f 3b 22 20 74 61 72 67 65 74 2d 70 61 74 74  =?;" target-patt
2c50: 20 74 74 2d 69 64 29 29 0a 09 20 29 29 0a 20 20   tt-id)).. )).  
2c60: 20 20 20 74 74 79 70 65 73 29 29 29 0a 0a 28 64     ttypes)))..(d
2c70: 65 66 69 6e 65 20 28 70 67 64 62 3a 67 65 74 2d  efine (pgdb:get-
2c80: 74 61 72 67 65 74 73 2d 6f 66 2d 74 79 70 65 20  targets-of-type 
2c90: 64 62 68 20 74 74 79 70 65 2d 69 64 20 74 61 72  dbh ttype-id tar
2ca0: 67 65 74 2d 70 61 74 74 29 0a 20 20 28 64 62 69  get-patt).  (dbi
2cb0: 3a 67 65 74 2d 72 6f 77 73 20 64 62 68 20 22 53  :get-rows dbh "S
2cc0: 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54 20 74  ELECT DISTINCT t
2cd0: 61 72 67 65 74 20 46 52 4f 4d 20 72 75 6e 73 20  arget FROM runs 
2ce0: 57 48 45 52 45 20 74 61 72 67 65 74 20 4c 49 4b  WHERE target LIK
2cf0: 45 20 3f 20 41 4e 44 20 74 74 79 70 65 5f 69 64  E ? AND ttype_id
2d00: 3d 3f 3b 22 20 74 61 72 67 65 74 2d 70 61 74 74  =?;" target-patt
2d10: 20 74 74 79 70 65 2d 69 64 29 29 0a 0a 28 64 65   ttype-id))..(de
2d20: 66 69 6e 65 20 28 70 67 64 62 3a 67 65 74 2d 72  fine (pgdb:get-r
2d30: 75 6e 73 2d 62 79 2d 74 61 72 67 65 74 20 64 62  uns-by-target db
2d40: 68 20 74 61 72 67 65 74 73 20 72 75 6e 2d 70 61  h targets run-pa
2d50: 74 74 29 0a 20 20 20 28 64 62 69 3a 67 65 74 2d  tt).   (dbi:get-
2d60: 72 6f 77 73 20 64 62 68 20 22 53 45 4c 45 43 54  rows dbh "SELECT
2d70: 20 72 2e 72 75 6e 5f 6e 61 6d 65 2c 20 74 2e 74   r.run_name, t.t
2d80: 65 73 74 5f 6e 61 6d 65 2c 20 74 2e 73 74 61 74  est_name, t.stat
2d90: 75 73 2c 20 74 2e 69 74 65 6d 5f 70 61 74 68 2c  us, t.item_path,
2da0: 20 74 2e 69 64 2c 20 74 2e 72 75 6e 64 69 72 2c   t.id, t.rundir,
2db0: 20 74 2e 66 69 6e 61 6c 5f 6c 6f 67 66 20 46 52   t.final_logf FR
2dc0: 4f 4d 20 72 75 6e 73 20 61 73 20 72 20 49 4e 4e  OM runs as r INN
2dd0: 45 52 20 4a 4f 49 4e 20 74 65 73 74 73 20 41 53  ER JOIN tests AS
2de0: 20 74 20 4f 4e 20 74 2e 72 75 6e 5f 69 64 3d 72   t ON t.run_id=r
2df0: 2e 69 64 20 20 0a 20 20 20 20 20 20 20 20 20 20  .id  .          
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e10: 57 48 45 52 45 20 74 2e 73 74 61 74 65 3d 27 43  WHERE t.state='C
2e20: 4f 4d 50 4c 45 54 45 44 27 20 41 4e 44 20 72 2e  OMPLETED' AND r.
2e30: 74 61 72 67 65 74 20 6c 69 6b 65 20 3f 20 41 4e  target like ? AN
2e40: 44 20 20 72 2e 72 75 6e 5f 6e 61 6d 65 20 6c 69  D  r.run_name li
2e50: 6b 65 20 3f 3b 22 20 74 61 72 67 65 74 73 20 72  ke ?;" targets r
2e60: 75 6e 2d 70 61 74 74 29 0a 29 0a 0a 28 64 65 66  un-patt).)..(def
2e70: 69 6e 65 20 28 70 67 64 62 3a 67 65 74 2d 74 65  ine (pgdb:get-te
2e80: 73 74 2d 62 79 2d 69 64 20 64 62 68 20 69 64 29  st-by-id dbh id)
2e90: 0a 20 20 28 64 62 69 3a 67 65 74 2d 72 6f 77 73  .  (dbi:get-rows
2ea0: 20 64 62 68 20 22 53 45 4c 45 43 54 20 74 2e 74   dbh "SELECT t.t
2eb0: 65 73 74 5f 6e 61 6d 65 2c 20 74 2e 69 74 65 6d  est_name, t.item
2ec0: 5f 70 61 74 68 2c 20 74 2e 72 75 6e 64 69 72 2c  _path, t.rundir,
2ed0: 20 74 2e 66 69 6e 61 6c 5f 6c 6f 67 66 20 46 52   t.final_logf FR
2ee0: 4f 4d 20 72 75 6e 73 20 61 73 20 72 20 49 4e 4e  OM runs as r INN
2ef0: 45 52 20 4a 4f 49 4e 20 74 65 73 74 73 20 41 53  ER JOIN tests AS
2f00: 20 74 20 4f 4e 20 74 2e 72 75 6e 5f 69 64 3d 72   t ON t.run_id=r
2f10: 2e 69 64 20 20 0a 20 20 20 20 20 20 20 20 20 20  .id  .          
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f30: 57 48 45 52 45 20 74 2e 69 64 20 3d 20 3f 3b 22  WHERE t.id = ?;"
2f40: 20 69 64 29 0a 29 0a 0a 3b 3b 3d 3d 3d 3d 3d 3d   id).)..;;======
2f50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2f60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2f70: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2f80: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2f90: 0a 3b 3b 20 20 56 20 41 20 52 20 49 20 4f 20 55  .;;  V A R I O U
2fa0: 20 53 20 20 20 44 20 41 20 54 20 41 20 20 20 4d   S   D A T A   M
2fb0: 20 41 20 53 20 53 20 41 20 47 20 45 20 20 20 52   A S S A G E   R
2fc0: 20 4f 20 55 20 54 20 49 20 4e 20 45 20 53 0a 3b   O U T I N E S.;
2fd0: 3b 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ;===============
2fe0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
2ff0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3000: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
3010: 3d 3d 3d 3d 3d 3d 3d 0a 0a 3b 3b 20 70 72 6f 62  =======..;; prob
3020: 61 62 6c 79 20 77 61 6e 74 20 74 6f 20 6d 6f 76  ably want to mov
3030: 65 20 74 68 65 73 65 20 74 6f 20 61 20 64 69 66  e these to a dif
3040: 66 65 72 65 6e 74 20 6d 6f 64 65 6c 20 66 69 6c  ferent model fil
3050: 65 0a 0a 3b 3b 20 63 72 65 61 74 65 20 61 20 68  e..;; create a h
3060: 61 73 68 20 6f 66 20 68 61 73 68 65 73 20 77 69  ash of hashes wi
3070: 74 68 20 6b 65 79 73 20 65 78 74 72 61 63 74 65  th keys extracte
3080: 64 20 66 72 6f 6d 20 61 6c 6c 2d 70 61 72 74 73  d from all-parts
3090: 0a 3b 3b 20 75 73 69 6e 67 20 72 6f 77 2d 6f 72  .;; using row-or
30a0: 2d 63 6f 6c 20 74 6f 20 63 68 6f 6f 73 65 20 72  -col to choose r
30b0: 6f 77 20 6f 72 20 63 6f 6c 75 6d 6e 0a 3b 3b 20  ow or column.;; 
30c0: 20 20 68 74 7b 72 6f 77 20 6b 65 79 7d 3d 3e 68    ht{row key}=>h
30d0: 74 7b 63 6f 6c 20 6b 65 79 7d 3d 3e 64 61 74 61  t{col key}=>data
30e0: 0a 3b 3b 0a 3b 3b 20 66 6e 75 6d 20 69 73 20 74  .;;.;; fnum is t
30f0: 68 65 20 66 69 65 6c 64 20 6e 75 6d 62 65 72 20  he field number 
3100: 69 6e 20 74 68 65 20 74 75 70 6c 65 73 20 74 6f  in the tuples to
3110: 20 62 65 20 73 70 6c 69 74 0a 3b 3b 0a 28 64 65   be split.;;.(de
3120: 66 69 6e 65 20 28 70 67 64 62 3a 63 6f 61 6c 65  fine (pgdb:coale
3130: 73 63 65 2d 72 75 6e 73 20 64 62 68 20 72 75 6e  sce-runs dbh run
3140: 73 20 61 6c 6c 2d 70 61 72 74 73 20 72 6f 77 2d  s all-parts row-
3150: 6f 72 2d 63 6f 6c 20 66 6e 75 6d 29 0a 20 20 28  or-col fnum).  (
3160: 6c 65 74 2a 20 28 28 64 61 74 61 20 20 28 6d 61  let* ((data  (ma
3170: 6b 65 2d 68 61 73 68 2d 74 61 62 6c 65 29 29 29  ke-hash-table)))
3180: 0a 20 20 20 20 3b 3b 09 20 28 72 6e 75 6d 73 20  .    ;;. (rnums 
3190: 28 0a 20 20 20 20 3b 3b 20 66 6f 72 20 6e 6f 77  (.    ;; for now
31a0: 20 6a 75 73 74 20 64 6f 20 66 69 72 73 74 20 3d   just do first =
31b0: 3e 20 72 65 6d 61 69 6e 64 65 72 0a 20 20 20 20  > remainder.    
31c0: 28 66 6f 72 2d 65 61 63 68 0a 20 20 20 20 20 28  (for-each.     (
31d0: 6c 61 6d 62 64 61 20 28 72 75 6e 29 0a 20 20 20  lambda (run).   
31e0: 20 20 20 20 28 6c 65 74 2a 20 28 28 74 61 72 67      (let* ((targ
31f0: 65 74 20 28 76 65 63 74 6f 72 2d 72 65 66 20 72  et (vector-ref r
3200: 75 6e 20 66 6e 75 6d 29 29 0a 09 20 20 20 20 20  un fnum))..     
3210: 20 28 70 61 72 74 73 20 20 28 73 74 72 69 6e 67   (parts  (string
3220: 2d 73 70 6c 69 74 20 74 61 72 67 65 74 20 22 2f  -split target "/
3230: 22 29 29 0a 09 20 20 20 20 20 20 28 66 69 72 73  "))..      (firs
3240: 74 20 20 28 63 61 72 20 70 61 72 74 73 29 29 0a  t  (car parts)).
3250: 09 20 20 20 20 20 20 28 72 65 73 74 20 20 20 28  .      (rest   (
3260: 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70 65 72  string-intersper
3270: 73 65 20 28 63 64 72 20 70 61 72 74 73 29 20 22  se (cdr parts) "
3280: 2f 22 29 29 0a 09 20 20 20 20 20 20 28 63 6f 6c  /"))..      (col
3290: 64 61 74 20 28 68 61 73 68 2d 74 61 62 6c 65 2d  dat (hash-table-
32a0: 72 65 66 2f 64 65 66 61 75 6c 74 20 64 61 74 61  ref/default data
32b0: 20 66 69 72 73 74 20 23 66 29 29 29 0a 09 20 28   first #f))).. (
32c0: 69 66 20 28 6e 6f 74 20 63 6f 6c 64 61 74 29 28  if (not coldat)(
32d0: 6c 65 74 20 28 28 6e 65 77 68 74 20 28 6d 61 6b  let ((newht (mak
32e0: 65 2d 68 61 73 68 2d 74 61 62 6c 65 29 29 29 0a  e-hash-table))).
32f0: 09 09 09 20 20 20 28 68 61 73 68 2d 74 61 62 6c  ...   (hash-tabl
3300: 65 2d 73 65 74 21 20 64 61 74 61 20 66 69 72 73  e-set! data firs
3310: 74 20 6e 65 77 68 74 29 0a 09 09 09 20 20 20 28  t newht)....   (
3320: 73 65 74 21 20 63 6f 6c 64 61 74 20 6e 65 77 68  set! coldat newh
3330: 74 29 29 29 0a 09 20 28 68 61 73 68 2d 74 61 62  t))).. (hash-tab
3340: 6c 65 2d 73 65 74 21 20 63 6f 6c 64 61 74 20 72  le-set! coldat r
3350: 65 73 74 20 72 75 6e 29 29 29 0a 20 20 20 20 20  est run))).     
3360: 72 75 6e 73 29 0a 20 20 20 20 64 61 74 61 29 29  runs).    data))
3370: 0a 0a 3b 3b 20 67 69 76 65 6e 20 6f 72 64 65 72  ..;; given order
3380: 65 64 20 64 61 74 61 20 68 61 73 68 20 72 65 74  ed data hash ret
3390: 75 72 6e 20 61 2d 6b 65 79 73 0a 3b 3b 0a 28 64  urn a-keys.;;.(d
33a0: 65 66 69 6e 65 20 28 70 67 64 62 3a 6f 72 64 65  efine (pgdb:orde
33b0: 72 65 64 2d 64 61 74 61 2d 3e 61 2d 6b 65 79 73  red-data->a-keys
33c0: 20 6f 72 64 65 72 65 64 2d 64 61 74 61 29 0a 20   ordered-data). 
33d0: 20 28 73 6f 72 74 20 28 68 61 73 68 2d 74 61 62   (sort (hash-tab
33e0: 6c 65 2d 6b 65 79 73 20 6f 72 64 65 72 65 64 2d  le-keys ordered-
33f0: 64 61 74 61 29 20 73 74 72 69 6e 67 3e 3d 3f 29  data) string>=?)
3400: 29 0a 0a 3b 3b 20 67 69 76 65 6e 20 6f 72 64 65  )..;; given orde
3410: 72 65 64 20 64 61 74 61 20 68 61 73 68 20 72 65  red data hash re
3420: 74 75 72 6e 20 62 2d 6b 65 79 73 0a 3b 3b 0a 28  turn b-keys.;;.(
3430: 64 65 66 69 6e 65 20 28 70 67 64 62 3a 6f 72 64  define (pgdb:ord
3440: 65 72 65 64 2d 64 61 74 61 2d 3e 62 2d 6b 65 79  ered-data->b-key
3450: 73 20 6f 72 64 65 72 65 64 2d 64 61 74 61 20 61  s ordered-data a
3460: 2d 6b 65 79 73 29 0a 20 20 28 64 65 6c 65 74 65  -keys).  (delete
3470: 2d 64 75 70 6c 69 63 61 74 65 73 0a 20 20 20 28  -duplicates.   (
3480: 73 6f 72 74 20 28 61 70 70 6c 79 0a 09 20 20 61  sort (apply..  a
3490: 70 70 65 6e 64 0a 09 20 20 28 6d 61 70 20 28 6c  ppend..  (map (l
34a0: 61 6d 62 64 61 20 28 73 75 62 2d 6b 65 79 29 0a  ambda (sub-key).
34b0: 09 09 20 28 6c 65 74 20 28 28 73 75 62 64 61 74  .. (let ((subdat
34c0: 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 72 65 66   (hash-table-ref
34d0: 20 6f 72 64 65 72 65 64 2d 64 61 74 61 20 73 75   ordered-data su
34e0: 62 2d 6b 65 79 29 29 29 0a 09 09 20 20 20 28 68  b-key)))...   (h
34f0: 61 73 68 2d 74 61 62 6c 65 2d 6b 65 79 73 20 73  ash-table-keys s
3500: 75 62 64 61 74 29 29 29 0a 09 20 20 20 20 20 20  ubdat)))..      
3510: 20 61 2d 6b 65 79 73 29 29 0a 09 20 73 74 72 69   a-keys)).. stri
3520: 6e 67 3e 3d 3f 29 29 29 0a 0a 28 64 65 66 69 6e  ng>=?)))..(defin
3530: 65 20 28 70 67 64 62 3a 63 6f 61 6c 65 73 63 65  e (pgdb:coalesce
3540: 2d 72 75 6e 73 2d 62 79 2d 73 6c 69 63 65 20 72  -runs-by-slice r
3550: 75 6e 73 20 73 6c 69 63 65 29 0a 20 20 28 6c 65  uns slice).  (le
3560: 74 2a 20 28 28 64 61 74 61 20 20 28 6d 61 6b 65  t* ((data  (make
3570: 2d 68 61 73 68 2d 74 61 62 6c 65 29 29 29 0a 20  -hash-table))). 
3580: 20 20 20 20 20 28 66 6f 72 2d 65 61 63 68 0a 20       (for-each. 
3590: 20 20 20 20 28 6c 61 6d 62 64 61 20 28 72 75 6e      (lambda (run
35a0: 29 0a 20 20 20 20 20 20 20 28 6c 65 74 2a 20 28  ).       (let* (
35b0: 28 74 61 72 67 65 74 20 28 76 65 63 74 6f 72 2d  (target (vector-
35c0: 72 65 66 20 72 75 6e 20 30 29 29 0a 20 20 20 20  ref run 0)).    
35d0: 20 20 20 20 20 20 20 20 20 20 28 72 75 6e 2d 6e            (run-n
35e0: 61 6d 65 20 28 76 65 63 74 6f 72 2d 72 65 66 20  ame (vector-ref 
35f0: 72 75 6e 20 31 29 29 20 20 20 20 0a 09 20 20 20  run 1))    ..   
3600: 20 20 20 28 70 61 72 74 73 20 20 28 73 74 72 69     (parts  (stri
3610: 6e 67 2d 73 70 6c 69 74 20 74 61 72 67 65 74 20  ng-split target 
3620: 22 2f 22 29 29 0a 09 20 20 20 20 20 20 28 66 69  "/"))..      (fi
3630: 72 73 74 20 20 28 63 61 72 20 70 61 72 74 73 29  rst  (car parts)
3640: 29 0a 09 20 20 20 20 20 20 28 72 65 73 74 20 20  )..      (rest  
3650: 20 28 73 74 72 69 6e 67 2d 69 6e 74 65 72 73 70   (string-intersp
3660: 65 72 73 65 20 28 63 64 72 20 70 61 72 74 73 29  erse (cdr parts)
3670: 20 22 2f 22 29 29 0a 09 20 20 20 20 20 20 28 63   "/"))..      (c
3680: 6f 6c 64 61 74 20 28 68 61 73 68 2d 74 61 62 6c  oldat (hash-tabl
3690: 65 2d 72 65 66 2f 64 65 66 61 75 6c 74 20 64 61  e-ref/default da
36a0: 74 61 20 72 65 73 74 20 23 66 29 29 29 0a 09 20  ta rest #f))).. 
36b0: 28 69 66 20 28 6e 6f 74 20 63 6f 6c 64 61 74 29  (if (not coldat)
36c0: 28 6c 65 74 20 28 28 6e 65 77 68 74 20 28 6d 61  (let ((newht (ma
36d0: 6b 65 2d 68 61 73 68 2d 74 61 62 6c 65 29 29 29  ke-hash-table)))
36e0: 0a 09 09 09 20 20 20 28 68 61 73 68 2d 74 61 62  ....   (hash-tab
36f0: 6c 65 2d 73 65 74 21 20 64 61 74 61 20 72 65 73  le-set! data res
3700: 74 20 6e 65 77 68 74 29 0a 09 09 09 20 20 20 28  t newht)....   (
3710: 73 65 74 21 20 63 6f 6c 64 61 74 20 6e 65 77 68  set! coldat newh
3720: 74 29 29 29 0a 09 20 28 68 61 73 68 2d 74 61 62  t))).. (hash-tab
3730: 6c 65 2d 73 65 74 21 20 63 6f 6c 64 61 74 20 72  le-set! coldat r
3740: 75 6e 2d 6e 61 6d 65 20 72 75 6e 29 29 29 0a 20  un-name run))). 
3750: 20 20 20 20 72 75 6e 73 29 0a 20 20 20 20 64 61      runs).    da
3760: 74 61 29 29 0a 0a 0a 28 64 65 66 69 6e 65 20 28  ta))...(define (
3770: 70 67 64 62 3a 72 75 6e 73 2d 74 6f 2d 68 61 73  pgdb:runs-to-has
3780: 68 20 72 75 6e 73 20 29 0a 20 20 28 6c 65 74 2a  h runs ).  (let*
3790: 20 28 28 64 61 74 61 20 20 28 6d 61 6b 65 2d 68   ((data  (make-h
37a0: 61 73 68 2d 74 61 62 6c 65 29 29 29 0a 20 20 20  ash-table))).   
37b0: 20 28 66 6f 72 2d 65 61 63 68 0a 20 20 20 20 20   (for-each.     
37c0: 28 6c 61 6d 62 64 61 20 28 72 75 6e 29 0a 20 20  (lambda (run).  
37d0: 20 20 20 20 20 28 6c 65 74 2a 20 28 28 72 75 6e       (let* ((run
37e0: 2d 6e 61 6d 65 20 28 76 65 63 74 6f 72 2d 72 65  -name (vector-re
37f0: 66 20 72 75 6e 20 30 29 29 0a 09 20 20 20 20 20  f run 0))..     
3800: 20 28 74 65 73 74 20 28 63 6f 6e 63 20 28 76 65   (test (conc (ve
3810: 63 74 6f 72 2d 72 65 66 20 72 75 6e 20 31 29 20  ctor-ref run 1) 
3820: 22 3a 22 20 28 76 65 63 74 6f 72 2d 72 65 66 20  ":" (vector-ref 
3830: 72 75 6e 20 33 29 29 29 0a 09 20 20 20 20 20 20  run 3)))..      
3840: 28 63 6f 6c 64 61 74 20 28 68 61 73 68 2d 74 61  (coldat (hash-ta
3850: 62 6c 65 2d 72 65 66 2f 64 65 66 61 75 6c 74 20  ble-ref/default 
3860: 64 61 74 61 20 72 75 6e 2d 6e 61 6d 65 20 23 66  data run-name #f
3870: 29 29 29 0a 09 20 28 69 66 20 28 6e 6f 74 20 63  ))).. (if (not c
3880: 6f 6c 64 61 74 29 28 6c 65 74 20 28 28 6e 65 77  oldat)(let ((new
3890: 68 74 20 28 6d 61 6b 65 2d 68 61 73 68 2d 74 61  ht (make-hash-ta
38a0: 62 6c 65 29 29 29 0a 09 09 09 20 20 20 28 68 61  ble)))....   (ha
38b0: 73 68 2d 74 61 62 6c 65 2d 73 65 74 21 20 64 61  sh-table-set! da
38c0: 74 61 20 72 75 6e 2d 6e 61 6d 65 20 6e 65 77 68  ta run-name newh
38d0: 74 29 0a 09 09 09 20 20 20 28 73 65 74 21 20 63  t)....   (set! c
38e0: 6f 6c 64 61 74 20 6e 65 77 68 74 29 29 29 0a 09  oldat newht)))..
38f0: 20 28 68 61 73 68 2d 74 61 62 6c 65 2d 73 65 74   (hash-table-set
3900: 21 20 63 6f 6c 64 61 74 20 74 65 73 74 20 72 75  ! coldat test ru
3910: 6e 29 29 29 0a 20 20 20 20 20 72 75 6e 73 29 0a  n))).     runs).
3920: 20 20 20 20 64 61 74 61 29 29 0a 0a 28 64 65 66      data))..(def
3930: 69 6e 65 20 28 70 67 64 62 3a 67 65 74 2d 68 69  ine (pgdb:get-hi
3940: 73 74 6f 72 79 2d 68 61 73 68 20 72 75 6e 73 29  story-hash runs)
3950: 0a 20 20 28 6c 65 74 2a 20 28 28 64 61 74 61 20  .  (let* ((data 
3960: 20 28 6d 61 6b 65 2d 68 61 73 68 2d 74 61 62 6c   (make-hash-tabl
3970: 65 29 29 29 0a 20 20 20 20 20 28 66 6f 72 2d 65  e))).     (for-e
3980: 61 63 68 0a 20 20 20 20 20 28 6c 61 6d 62 64 61  ach.     (lambda
3990: 20 28 72 75 6e 29 0a 20 20 20 20 20 20 20 28 6c   (run).       (l
39a0: 65 74 2a 20 28 28 72 75 6e 2d 6e 61 6d 65 20 28  et* ((run-name (
39b0: 76 65 63 74 6f 72 2d 72 65 66 20 72 75 6e 20 30  vector-ref run 0
39c0: 29 29 29 0a 09 20 28 68 61 73 68 2d 74 61 62 6c  ))).. (hash-tabl
39d0: 65 2d 73 65 74 21 20 64 61 74 61 20 72 75 6e 2d  e-set! data run-
39e0: 6e 61 6d 65 20 72 75 6e 29 29 29 0a 20 20 20 20  name run))).    
39f0: 20 72 75 6e 73 29 0a 20 20 20 20 64 61 74 61 29   runs).    data)
3a00: 29 0a                                            ).