BGPmon-Analytics-db-1
view release on metacpan or search on metacpan
bin/bgpmon_analytics_db_2_pphQueryFuncs.psql view on Meta::CPAN
/*Script to redefine the functions used for the 6watch database
run like so: " > psql -f 1_import_functions dbname dbuser"*/
/*Helper function to dynamically generate a peer's table name*/
DROP FUNCTION IF EXISTS pph.find_most_active_prefix();
DROP FUNCTION IF EXISTS pph.get_prefixes_per_as(INTEGER);
DROP FUNCTION IF EXISTS pph.get_as_per_prefix(CIDR);
DROP FUNCTION IF EXISTS pph.get_table_growth(INET,VARCHAR,TIMESTAMP,TIMESTAMP,
INTERVAL);
DROP FUNCTION IF EXISTS pph.get_table_at_time(INET,VARCHAR,TIMESTAMP);
DROP FUNCTION IF EXISTS pph.get_unique_prefix_growth(INET,VARCHAR,TIMESTAMP,
TIMESTAMP,INTERVAL);
DROP FUNCTION IF EXISTS pph.get_unique_prefixes_at_time(INET,VARCHAR,TIMESTAMP);
/******************************************************************************
* find_most_active_prefix
* input:
* output: returns prefix
* effects: find the prefix withthe most timerange entries (across all peers)
******************************************************************************/
CREATE OR REPLACE FUNCTION pph.find_most_active_prefix() RETURNS CIDR AS $$
DECLARE
p CURSOR FOR SELECT * FROM pph.prefixes;
top_pref CIDR;
top_count INTEGER = 0;
curr_count INTEGER = 0;
BEGIN
FOR prefix IN p LOOP
EXECUTE 'SELECT COUNT(1)
FROM pph.timeranges AS t, pph.ppms AS p1, pph.prefixes AS p2
WHERE p2.pref = '''||prefix.pref||''' AND
p2.dbid = p1.prefix_dbid AND
t.ppm_dbid = p1.dbid' INTO curr_count;
IF curr_count > top_count THEN
top_count = curr_count;
top_pref = prefix.pref;
END IF;
END LOOP;
RETURN top_pref;
END;
$$ LANGUAGE plpgsql;
/******************************************************************************
* get_prefixes_per_as
* input: ASN
* output: set of prefixes
* effects:
******************************************************************************/
CREATE OR REPLACE FUNCTION pph.get_prefixes_per_as(INTEGER) RETURNS SETOF CIDR AS $$
BEGIN
RETURN QUERY
SELECT DISTINCT pref
FROM pph.prefixes AS p1,pph.ppms AS p2,pph.timeranges AS t
WHERE origin_as = $1 AND
t.ppm_dbid = p2.dbid AND
p2.prefix_dbid = p1.dbid;
END;
$$ LANGUAGE plpgsql;
/******************************************************************************
* get_as_per_prefix
* input: prefix
* output: set of ASNs
* effects:
******************************************************************************/
CREATE OR REPLACE FUNCTION pph.get_as_per_prefix(CIDR) RETURNS SETOF INTEGER AS $$
BEGIN
RETURN QUERY
SELECT DISTINCT origin_as
FROM pph.prefixes AS p1,pph.ppms AS p2,pph.timeranges AS t
WHERE pref = $1 AND
t.ppm_dbid = p2.dbid AND
p2.prefix_dbid = p1.dbid;
END;
$$ LANGUAGE plpgsql;
/******************************************************************************
* get_table_growth
* input: peer address, collector, start, end, timestep
* output: set of ASNs
* effects:
******************************************************************************/
CREATE OR REPLACE FUNCTION pph.get_table_growth(INET,VARCHAR,TIMESTAMP,TIMESTAMP,INTERVAL) RETURNS SETOF INTEGER AS $$
DECLARE
i TIMESTAMP;
BEGIN
i := $3;
WHILE i <= $4 LOOP
RETURN NEXT COUNT(1) FROM pph.get_table_at_time($1,$2,i);
i := i + $5;
END LOOP;
END;
$$ LANGUAGE plpgsql;
/******************************************************************************
* get_unique_prefix_growth
* input: peer address, collector, start, end, timestep
* output: series of integers, each is the number of unique prefixes ata point
* in time
* effects:
******************************************************************************/
CREATE OR REPLACE FUNCTION pph.get_unique_prefix_growth(INET,VARCHAR,TIMESTAMP,TIMESTAMP,INTERVAL) RETURNS SETOF INTEGER AS $$
DECLARE
i TIMESTAMP;
BEGIN
i := $3;
WHILE i <= $4 LOOP
RETURN NEXT COUNT(1) FROM pph.get_unique_prefixes_at_time($1,$2,i);
i := i + $5;
END LOOP;
END;
$$ LANGUAGE plpgsql;
/******************************************************************************
* get_table_at_time
* input: peer address, collector, time
* output: table size
* effects:
******************************************************************************/
CREATE OR REPLACE FUNCTION pph.get_table_at_time(INET,VARCHAR,TIMESTAMP) RETURNS SETOF CIDR AS $$
DECLARE
peer_table VARCHAR;
BEGIN
peer_table := generate_peer_table_name($1,$2);
RETURN QUERY EXECUTE
'SELECT DISTINCT pref
FROM pph.prefixes AS p1,pph.ppms AS p2,pph.peers AS p3,'||quote_ident(peer_table)||' AS t
WHERE (p3.addr,p3.collector) = (''' || $1 || ''', ''' || $2 || ''') AND
p2.peer_dbid = p3.dbid AND
p2.prefix_dbid = p1.dbid AND
( run in 0.568 second using v1.01-cache-2.11-cpan-39bf76dae61 )