1.83.  rebuildlistenentries( )

Propriétés de la fonction
Langage: PLPGSQL
Type du code retour: integer

Appelé par différentes fonctions de modification de l'abonnement et des chemins, cette fonction réécrit les entrées sl_listen, ajoutant toutes celles qui nécessitent l'autorisation des communications entre les nœuds du cluster Slony-I.

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 ;