1.80.  mergeset( integer, integer )

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

Génère un événement MERGE_SET pour demander que les ensembles soient fusionnés. Les ensembles doivent exister. L'origine doit correspondre au même nœud. Le même ensemble de nœuds doivent être abonnés aux deux ensembles.

declare
        p_set_id                        alias for $1;
        p_add_id                        alias for $2;
        v_origin                        int4;
begin
        -- ----
        -- Grab the central configuration lock
        -- ----
        lock table sl_config_lock;
        
        -- ----
        -- Check that both sets exist and originate here
        -- ----
        if p_set_id = p_add_id then
                raise exception 'Slony-I: merged set ids cannot be identical';
        end if;
        select set_origin into v_origin from sl_set
                        where set_id = p_set_id;
        if not found then
                raise exception 'Slony-I: set % not found', p_set_id;
        end if;
        if v_origin != getLocalNodeId('_schemadoc') then
                raise exception 'Slony-I: set % does not originate on local node',
                                p_set_id;
        end if;

        select set_origin into v_origin from sl_set
                        where set_id = p_add_id;
        if not found then
                raise exception 'Slony-I: set % not found', p_add_id;
        end if;
        if v_origin != getLocalNodeId('_schemadoc') then
                raise exception 'Slony-I: set % does not originate on local node',
                                p_add_id;
        end if;

        -- ----
        -- Check that both sets are subscribed by the same set of nodes
        -- ----
        if exists (select true from sl_subscribe SUB1
                                where SUB1.sub_set = p_set_id
                                and SUB1.sub_receiver not in (select SUB2.sub_receiver
                                                from sl_subscribe SUB2
                                                where SUB2.sub_set = p_add_id))
        then
                raise exception 'Slony-I: subscriber lists of set % and % are different',
                                p_set_id, p_add_id;
        end if;

        if exists (select true from sl_subscribe SUB1
                                where SUB1.sub_set = p_add_id
                                and SUB1.sub_receiver not in (select SUB2.sub_receiver
                                                from sl_subscribe SUB2
                                                where SUB2.sub_set = p_set_id))
        then
                raise exception 'Slony-I: subscriber lists of set % and % are different',
                                p_add_id, p_set_id;
        end if;

        -- ----
        -- Check that all ENABLE_SUBSCRIPTION events for the set are confirmed
        -- ----
        if exists (select true from sl_event
                        where ev_type = 'ENABLE_SUBSCRIPTION'
                        and ev_data1 = p_add_id::text
                        and ev_seqno > (select max(con_seqno) from sl_confirm
                                        where con_origin = ev_origin
                                        and con_received::text = ev_data3))
        then
                raise exception 'Slony-I: set % has subscriptions in progress - cannot merge',
                                p_add_id;
        end if;
                          

        -- ----
        -- Create a SYNC event, merge the sets, create a MERGE_SET event
        -- ----
        perform createEvent('_schemadoc', 'SYNC', NULL);
        perform mergeSet_int(p_set_id, p_add_id);
        return  createEvent('_schemadoc', 'MERGE_SET', 
                        p_set_id::text, p_add_id::text);
end;