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 ).