rem rem $Header: L:\\\\model\\repman40\\api\\RCS\\cikbl.hpb 1.2 1998/12/14 17:45:16 cvanes Exp $ rem Rem Copyright (c) 1996 by Oracle Corporation Rem NAME Rem cikbl.hpb - Rem DESCRIPTION Rem Rem RETURNS Rem Rem NOTES Rem Rem MODIFIED (MM/DD/YY) Rem cvanes 07/10/96 - Creation REM *************************************************************************** REM Hand-carved package body for KEY BASED LINK created on 10-JAN-96 REM *************************************************************************** CREATE OR REPLACE PACKAGE BODY cihkbl IS -- Generic post-process routines PROCEDURE check_delete(id number); sac_type constant varchar2(6) := 'MCL'; pac_type constant varchar2(6) := 'MCN'; --======================== PRE-PROCESS (INS,UPD) ============================-- PROCEDURE pre_process(operation varchar2,id number, pl in out NOCOPY ciokey_based_link.data) IS BEGIN -- Access rights for key based link derive from the module component inclusion -- Chris : CHeck the acc rights here!!! -- Access rights checking performed by triggers in config 4.0.9 -- ciiacc.check_access_rights(pl.v.mcn_reference_from,pac_type, -- 'UPD','SAC'); -- Validate user-defined properties if cieval.is_extended then cieval.check_element(id,pl.v.types,(operation='UPD') ,pl.v.user_defined_property_0,pl.i.user_defined_property_0 ,pl.v.user_defined_property_1,pl.i.user_defined_property_1 ,pl.v.user_defined_property_2,pl.i.user_defined_property_2 ,pl.v.user_defined_property_3,pl.i.user_defined_property_3 ,pl.v.user_defined_property_4,pl.i.user_defined_property_4 ,pl.v.user_defined_property_5,pl.i.user_defined_property_5 ,pl.v.user_defined_property_6,pl.i.user_defined_property_6 ,pl.v.user_defined_property_7,pl.i.user_defined_property_7 ,pl.v.user_defined_property_8,pl.i.user_defined_property_8 ,pl.v.user_defined_property_9,pl.i.user_defined_property_9 ,pl.v.user_defined_property_10,pl.i.user_defined_property_10 ,pl.v.user_defined_property_11,pl.i.user_defined_property_11 ,pl.v.user_defined_property_12,pl.i.user_defined_property_12 ,pl.v.user_defined_property_13,pl.i.user_defined_property_13 ,pl.v.user_defined_property_14,pl.i.user_defined_property_14 ,pl.v.user_defined_property_15,pl.i.user_defined_property_15 ,pl.v.user_defined_property_16,pl.i.user_defined_property_16 ,pl.v.user_defined_property_17,pl.i.user_defined_property_17 ,pl.v.user_defined_property_18,pl.i.user_defined_property_18 ,pl.v.user_defined_property_19,pl.i.user_defined_property_19 ); end if; -- Initialize unassigned properties with default values on INSERT if operation = 'INS' then pl.v.element_type_name := sac_type; pl.i.element_type_name := true; pl.v.module_component_link_type := 'KBL'; pl.i.module_component_link_type := true; if pl.v.primary_key_reference is NOT NULL then pl.v.key_based_link_via := 'PCO'; elsif pl.v.join_constraint_reference is NOT NULL then pl.v.key_based_link_via := 'FCO'; end if; pl.i.key_based_link_via := true; end if; cihkbl.common_secondary_updates(operation, 'KBL', pl.v.mcn_reference_from, pl.v.mcn_reference_to, pl.v.module_reference_from, pl.v.module_reference_to); pl.i.module_reference_from := true; pl.i.module_reference_to := true; END; --======================== PRE-PROCESS (DEL,SEL) ============================-- PROCEDURE pre_process(operation varchar2,id number) IS BEGIN -- Access rights for key based link derive from the module component inclusion -- Access rights checking performed by triggers in config 4.0.9 -- ciiacc.check_access_rights(id,sac_type,operation,'SAC'); -- if operation is 'DELETE', make sure no non-cascading references exist if operation = 'DEL' then check_delete(id); end if; END; --===================== POST-PROCESS (INS,UPD,SEL) ==========================-- PROCEDURE post_process(operation varchar2,id number, pl ciokey_based_link.data) IS BEGIN -- Removed UID constraint check call. null; END; --========================= POST PROCESS (DEL) ==============================-- PROCEDURE post_process(operation varchar2,id number) IS BEGIN if operation = 'DEL' then -- Delete the key based link and all it's related sub-bits ciiutl.delete_element(id,sac_type); end if; END; --============================= CHECK DELETE ================================-- PROCEDURE check_delete(id number) IS dummy number; error_count number := 0; BEGIN null; END; --====================== COMMON SECONDARY UPDATES ===========================-- PROCEDURE common_secondary_updates(operation in varchar2 ,caller in varchar2 ,mcn_reference_from in number ,mcn_reference_to in number ,module_reference_from out number ,module_reference_to out number) IS -- Assumes that GEM.lan_ref is set (which is true if there is an associated MCN) cursor general_modules(mcn_ref number) is select mcn.general_module_reference ,lan.internal_name from ci_module_component_inclusions mcn ,ci_general_modules gem ,ci_languages lan where lan.id = gem.language_reference and gem.id = mcn.general_module_reference and mcn.id = mcn_ref; win_ref_from number; win_ref_to number; win_name_from varchar2(30); mco_name_to varchar2(30); gem_name_to varchar2(30); cnt_nai number; gem_ref_from number; gem_ref_to number; lan_to ci_languages.internal_name%type; lan_from ci_languages.internal_name%type; BEGIN open general_modules(mcn_reference_to); fetch general_modules into gem_ref_to, lan_to; close general_modules; module_reference_to:=gem_ref_to; open general_modules(mcn_reference_from); fetch general_modules into gem_ref_from, lan_from; close general_modules; module_reference_from:=gem_ref_from; if cdapi.load_mode then return; end if; if lan_from = 'Web' and caller = 'KBL' then return; end if; -- Bug 1250430 if operation = 'INS' then select mcn.window_reference, win.name into win_ref_from, win_name_from from ci_module_component_inclusions mcn ,ci_windows win where mcn.id = common_secondary_updates.mcn_reference_from and win.id (+) = mcn.window_reference; --if KBL is across GEM boundary if gem_ref_to != gem_ref_from then select mcn.window_reference, gem.name into win_ref_to, gem_name_to from ci_module_component_inclusions mcn ,ci_general_modules gem where mcn.id = common_secondary_updates.mcn_reference_to and gem.id = gem_ref_to; else --if KBL is within one GEM select mcn.window_reference, mun.name into win_ref_to, mco_name_to from ci_module_component_inclusions mcn ,ci_module_units mun where mcn.id = common_secondary_updates.mcn_reference_to and mun.id = nvl(mcn.module_component_reference, mcn.subcomponent_reference); end if; -- Create navigation item if the kbl crosses a window boundary if win_ref_from != nvl(win_ref_to, -1) and win_ref_from is not null then declare nai cionavigation_action_item.data; modmod ciomodule_network.data; begin if gem_ref_to != gem_ref_from then -- if KBL crossses GEM boundary -- ensure we don't create a duplicate select count(*) into cnt_nai from ci_navigation_action_items nai_t ,ci_module_networks modmod where nai_t.action_item_for = 'WIN' and nai_t.navigation_to = 'GEM' and nai_t.window_reference = win_ref_from and modmod.child_module_reference = gem_ref_to and nai_t.module_network_reference = modmod.id; if cnt_nai = 0 then -- Insert a new Module Network to associate to modmod.v.parent_module_reference := gem_ref_from; modmod.i.parent_module_reference := true; modmod.v.child_module_reference := gem_ref_to; modmod.i.child_module_reference := true; ciomodule_network.ins(null, modmod); nai.v.name := unique_aci_name(substrb(win_name_from,1,13) || '_' || substrb(gem_name_to,1,13) ,win_ref_from); nai.i.name := true; nai.v.window_reference := win_ref_from; nai.i.window_reference := true; nai.v.module_network_reference := modmod.v.id; nai.i.module_network_reference := true; cionavigation_action_item.ins(null, nai); end if; else -- if KBL is within one GEM -- ensure we don't create a duplicate select count(*) into cnt_nai from ci_navigation_action_items nai_t where nai_t.action_item_for = 'WIN' and nai_t.navigation_to = 'MCN' and nai_t.window_reference = win_ref_from and nai_t.mcn_reference_to = common_secondary_updates.mcn_reference_to; if cnt_nai = 0 then nai.v.name := unique_aci_name(substrb(win_name_from,1,13) || '_' || substrb(mco_name_to,1,13) ,win_ref_from); nai.i.name := true; nai.v.window_reference := win_ref_from; nai.i.window_reference := true; nai.v.mcn_reference_to := mcn_reference_to; nai.i.mcn_reference_to := true; cionavigation_action_item.ins(null, nai); end if; end if; end; end if; end if; END; --========================== UNIQUE ACI NAME ================================-- -- Returns aci_name with a number appended to it so that it obeys -- uniqueness constraint of ACIs FUNCTION unique_aci_name(aci_name in varchar2, mcn_win_ref in number) RETURN varchar2 IS -- exploits the fact that this is only called by functions creating an ACI -- for a WIN (not an MCN) cursor aci_names(win_reference number) is select name from ci_action_items aci where aci.window_reference = aci_names.win_reference; NamesList ciiutl.NameTabTyp; Cnt number := 1; BEGIN for aci_name in aci_names(mcn_win_ref) loop NamesList(Cnt) := aci_name.name; Cnt := Cnt + 1; end loop; return(ciiutl.unique_name(aci_name, NamesList, 'ACI')); END; --================================== END ====================================-- -- -- Package instantiation block -- BEGIN is_installed := true; END; /