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; |