1.106.  setmovetable( integer, integer )

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

Cette fonction traite l'événement SET_MOVE_TABLE. La table est déplacée vers l'ensemble de destination.

declare
        p_tab_id                        alias for $1;
        p_new_set_id            alias for $2;
        v_old_set_id            int4;
        v_origin                        int4;
begin
        -- ----
        -- Grab the central configuration lock
        -- ----
        lock table sl_config_lock;

        -- ----
        -- Get the tables current set
        -- ----
        select tab_set into v_old_set_id from sl_table
                        where tab_id = p_tab_id;
        if not found then
                raise exception 'Slony-I: table %d not found', p_tab_id;
        end if;
        
        -- ----
        -- Check that both sets exist and originate here
        -- ----
        if p_new_set_id = v_old_set_id then
                raise exception 'Slony-I: set ids cannot be identical';
        end if;
        select set_origin into v_origin from sl_set
                        where set_id = p_new_set_id;
        if not found then
                raise exception 'Slony-I: set % not found', p_new_set_id;
        end if;
        if v_origin != getLocalNodeId('_schemadoc') then
                raise exception 'Slony-I: set % does not originate on local node',
                                p_new_set_id;
        end if;

        select set_origin into v_origin from sl_set
                        where set_id = v_old_set_id;
        if not found then
                raise exception 'Slony-I: set % not found', v_old_set_id;
        end if;
        if v_origin != getLocalNodeId('_schemadoc') then
                raise exception 'Slony-I: set % does not originate on local node',
                                v_old_set_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_new_set_id
                                and SUB1.sub_receiver not in (select SUB2.sub_receiver
                                                from sl_subscribe SUB2
                                                where SUB2.sub_set = v_old_set_id))
        then
                raise exception 'Slony-I: subscriber lists of set % and % are different',
                                p_new_set_id, v_old_set_id;
        end if;

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

        -- ----
        -- Change the set the table belongs to
        -- ----
        perform createEvent('_schemadoc', 'SYNC', NULL);
        perform setMoveTable_int(p_tab_id, p_new_set_id);
        return  createEvent('_schemadoc', 'SET_MOVE_TABLE', 
                        p_tab_id::text, p_new_set_id::text);
end;