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