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