declare
v_receiver record ;
v_provider record ;
v_origin record ;
v_reachable int4[] ;
begin
-- First remove the entire configuration
delete from sl_listen;
-- Loop over every possible pair of receiver and provider
for v_receiver in select no_id from sl_node loop
for v_provider in select pa_server as no_id from sl_path where pa_client = v_receiver.no_id loop
-- Find all nodes that v_provider.no_id can receiver events from without using v_receiver.no_id
for v_origin in select * from ReachableFromNode(v_provider.no_id, array[v_receiver.no_id]) as r(no_id) loop
-- If v_receiver.no_id subscribes a set from v_provider.no_id, events have to travel the same
-- path as the data. Ignore possible sl_listen that would break that rule.
perform 1 from sl_subscribe
join sl_set on sl_set.set_id = sl_subscribe.sub_set
where
sub_receiver = v_receiver.no_id and
sub_provider != v_provider.no_id and
set_origin = v_origin.no_id ;
if not found then
insert into sl_listen (li_receiver, li_provider, li_origin)
values (v_receiver.no_id, v_provider.no_id, v_origin.no_id) ;
end if ;
end loop ;
end loop ;
end loop ;
return null ;
end ; |