Christopher B. Browne's Home Page
cbbrowne@acm.org

8.131. updatereloid(integer, integer)

Function Properties

PLPGSQLbigint
updateReloid(set_id, only_on_node) Updates the respective reloids in sl_table and sl_seqeunce based on their respective FQN
    declare
            p_set_id                alias for $1;
            p_only_on_node          alias for $2;
            v_no_id                 int4;
            v_set_origin            int4;
    	prec			record;
    begin
            -- ----
            -- Grab the central configuration lock
            -- ----
            lock table sl_config_lock;
    
            -- ----
            -- Check that we either are the set origin or a current
            -- subscriber of the set.
            -- ----
            v_no_id := getLocalNodeId('_schemadoc');
            select set_origin into v_set_origin
                            from sl_set
                            where set_id = p_set_id
                            for update;
            if not found then
                    raise exception 'Slony-I: set % not found', p_set_id;
            end if;
            if v_set_origin <> v_no_id
                    and not exists (select 1 from sl_subscribe
                            where sub_set = p_set_id
                            and sub_receiver = v_no_id)
            then
                    return 0;
            end if;
    
            -- ----
            -- If execution on only one node is requested, check that
            -- we are that node.
            -- ----
            if p_only_on_node > 0 and p_only_on_node <> v_no_id then
                    return 0;
            end if;
    
    	-- Update OIDs for tables to values pulled from non-table objects in pg_class
    	-- This ensures that we won't have collisions when repairing the oids
    	for prec in select tab_id from sl_table loop
    		update sl_table set tab_reloid = (select oid from pg_class pc where relkind <> 'r' and not exists (select 1 from sl_table t2 where t2.tab_reloid = pc.oid) limit 1)
    		where tab_id = prec.tab_id;
    	end loop;
    
    	for prec in select tab_id, tab_relname, tab_nspname from sl_table loop
    	        update sl_table set
            	        tab_reloid = (select PGC.oid
    	                from pg_catalog.pg_class PGC, pg_catalog.pg_namespace PGN
    	                where slon_quote_brute(PGC.relname) = slon_quote_brute(prec.tab_relname)
    	                        and PGC.relnamespace = PGN.oid
    				and slon_quote_brute(PGN.nspname) = slon_quote_brute(prec.tab_nspname))
    		where tab_id = prec.tab_id;
    	end loop;
    
    	for prec in select seq_id from sl_sequence loop
    		update sl_sequence set seq_reloid = (select oid from pg_class pc where relkind <> 'S' and not exists (select 1 from sl_sequence t2 where t2.seq_reloid = pc.oid) limit 1)
    		where seq_id = prec.seq_id;
    	end loop;
    
    	for prec in select seq_id, seq_relname, seq_nspname from sl_sequence loop
    	        update sl_sequence set
    	                seq_reloid = (select PGC.oid
    	                from pg_catalog.pg_class PGC, pg_catalog.pg_namespace PGN
    	                where slon_quote_brute(PGC.relname) = slon_quote_brute(prec.seq_relname)
                    	and PGC.relnamespace = PGN.oid
    			and slon_quote_brute(PGN.nspname) = slon_quote_brute(prec.seq_nspname))
    		where seq_id = prec.seq_id;
    	end loop;
    
    	return 1;
    end;

Google

If this was useful, let others know by an Affero rating

Contact me at cbbrowne@acm.org