関数特性
言語: PLPGSQL
戻り値: integer
setAddSequence_int (set_id, seq_id, seq_fqname, seq_comment) これは SET_ADD_SEQUENCE 事象を処理します。declare
p_set_id alias for $1;
p_seq_id alias for $2;
p_fqname alias for $3;
p_seq_comment alias for $4;
v_local_node_id int4;
v_set_origin int4;
v_sub_provider int4;
v_relkind char;
v_seq_reloid oid;
v_seq_relname name;
v_seq_nspname name;
v_sync_row record;
begin
-- ----
-- 中枢構成にロックを取得
-- ----
lock table sl_config_lock;
-- ----
-- 遠隔オリジンのセットに対して、そのセットに私たちが購読されて
-- いるかの検査。さもなければ、私たちのデータベースには全く
-- 存在しないであろうからそのシーケンスを無視します。
-- ----
v_local_node_id := getLocalNodeId('_schemadoc');
select set_origin into v_set_origin
from sl_set
where set_id = p_set_id;
if not found then
raise exception 'Slony-I: setAddSequence_int(): set % not found',
p_set_id;
end if;
if v_set_origin != v_local_node_id then
select sub_provider into v_sub_provider
from sl_subscribe
where sub_set = p_set_id
and sub_receiver = getLocalNodeId('_schemadoc');
if not found then
return 0;
end if;
end if;
-- ----
-- シーケンスオブジェクト識別子(OID)を獲得し、それがシーケンスか否かを検査します。
-- ----
select PGC.oid, PGC.relkind, PGC.relname, PGN.nspname
into v_seq_reloid, v_relkind, v_seq_relname, v_seq_nspname
from "pg_catalog".pg_class PGC, "pg_catalog".pg_namespace PGN
where PGC.relnamespace = PGN.oid
and slon_quote_input(p_fqname) = slon_quote_brute(PGN.nspname) ||
'.' || slon_quote_brute(PGC.relname);
if not found then
raise exception 'Slony-I: setAddSequence_int(): sequence % not found',
p_fqname;
end if;
if v_relkind != 'S' then
raise exception 'Slony-I: setAddSequence_int(): % is not a sequence',
p_fqname;
end if;
-- ----
-- シーケンスを sl_sequence に追加します。
-- ----
insert into sl_sequence
(seq_id, seq_reloid, seq_relname, seq_nspname, seq_set, seq_comment)
values
(p_seq_id, v_seq_reloid, v_seq_relname, v_seq_nspname, p_set_id, p_seq_comment);
-- ----
-- セットオリジンで最後の sync 事象にたいして sl_seqlog 行を模造します。
-- ----
if v_set_origin = v_local_node_id then
for v_sync_row in select coalesce (max(ev_seqno), 0) as ev_seqno
from sl_event
where ev_origin = v_local_node_id
and ev_type = 'SYNC'
loop
insert into sl_seqlog
(seql_seqid, seql_origin, seql_ev_seqno,
seql_last_value) values
(p_seq_id, v_local_node_id, v_sync_row.ev_seqno,
sequenceLastValue(p_fqname));
end loop;
end if;
return p_seq_id;
end;