関数特性
言語: PLPGSQL
戻り値: integer
RebuildListenEntriesOne(p_origin, p_receiver) Rebuilding of sl_listen entries for one origin, receiver pair.declare p_origin alias for $1; p_receiver alias for $2; v_row record; begin -- 1. レシーバがオリジンからどんなセットでも購読されるのであれば -- 同一のプロバイダ(複数可)上を監視します。 for v_row in select distinct sub_provider from sl_subscribe, sl_set, sl_path where sub_set = set_id and set_origin = p_origin and sub_receiver = p_receiver and sub_provider = pa_server and sub_receiver = pa_client loop perform storeListen_int(p_origin, v_row.sub_provider, p_receiver); end loop; if found then return 1; end if; -- 2. もしレシーバがプロバイダに直接経路を所有していれば -- それを使います。 if exists (select true from sl_path where pa_server = p_origin and pa_client = p_receiver) then perform storeListen_int(p_origin, p_origin, p_receiver); return 1; end if; -- 3. レシーバに対するプロバイダもしくは、プロバイダとしてレシーバを使用している -- 全てのノードを監視します(通常の購読ルートに従って -- ください)。 for v_row in select distinct provider from ( select sub_provider as provider from sl_subscribe where sub_receiver = p_receiver union select sub_receiver as provider from sl_subscribe where sub_provider = p_receiver and exists (select true from sl_path where pa_server = sub_receiver and pa_client = sub_provider) ) as S loop perform storeListen_int(p_origin, v_row.provider, p_receiver); end loop; if found then return 1; end if; -- 4. もしも全てが失敗であれば、つまり正しい経路が私たちを導いてくれる購読が存在しない場合 -- プロバイダとして経路を所有している全てのノードを使用します。 -- この事は通常クラスタが構築されたか、もしくは新規ノードが追加された場合のみ起こります。 -- この知恵の無い単純な処理(ブルートフォース)代替システムはもし全くもって可能であれば、 -- 事象の伝播を保証します。 for v_row in select pa_server as provider from sl_path where pa_client = p_receiver loop perform storeListen_int(p_origin, v_row.provider, p_receiver); end loop; if found then return 1; end if; return 0; end;