Blame | Last modification | View Log | RSS feed
CREATE PROCEDURE "RELEASE_MANAGER"."NEW_PATCH" ( SSpatch_version IN PACKAGE_VERSIONS.pkg_version%TYPE,NNparent_id IN NUMBER,sPatchIdList IN VARCHAR2,NNuser_id IN NUMBER ) IS/* ---------------------------------------------------------------------------Version: 3.5--------------------------------------------------------------------------- */patchPv_id NUMBER;parPkg_id NUMBER;LastInstallOrder NUMBER;isPatchDlocked PACKAGE_VERSIONS.DLOCKED%TYPE;SSV_MM PACKAGE_VERSIONS.V_MM%TYPE;SSV_NMM PACKAGE_VERSIONS.V_NMM%TYPE;SSV_EXT PACKAGE_VERSIONS.V_EXT%TYPE;oPatchDepCollector RELMGR_NUMBER_TAB_t := RELMGR_NUMBER_TAB_t();CURSOR parent_cur ISSELECT pv.*, pkg.pkg_nameFROM package_versions pv,packages pkgWHERE pv.pv_id = NNparent_idAND pv.pkg_id = pkg.pkg_id;parent_rec parent_cur%ROWTYPE;CURSOR patch_cur ISSELECT pv.*, pg.pkg_nameFROM package_versions pv,packages pgWHERE pv.pkg_id = parPkg_idAND pv.pkg_version = SSpatch_versionAND pv.pkg_id = pg.pkg_id;patch_rec patch_cur%ROWTYPE;CURSOR releases_cur ISSELECT rc.pv_idFROM release_content rcWHERE rc.pv_id = patch_rec.pv_id;releases_rec releases_cur%ROWTYPE;BEGIN-- Get Last Install OrderSELECT Count(*) INTO LastInstallOrderFROM PACKAGE_PATCHES ppWHERE pp.PV_ID = NNparent_id;-- Get parent detailsOPEN parent_cur;FETCH parent_cur INTO parent_rec;parPkg_id := parent_rec.pkg_id;-- Find if patch exists in databaseOPEN patch_cur;FETCH patch_cur INTO patch_rec;-- Parent must be officialIF parent_rec.dlocked = 'Y' THENIF patch_cur%NOTFOUNDTHENisPatchDlocked := 'N';-- Create new patch version --SELECT SEQ_PV_ID.nextval INTO patchPv_id FROM DUAL;Split_version ( SSpatch_version, SSV_MM, SSV_NMM, SSV_EXT );INSERT INTO package_versions ( pv_id, pkg_id, pkg_version, dlocked, created_stamp, creator_id, modified_stamp, modifier_id, V_MM, V_NMM, V_EXT, src_path, pv_description, owner_id, is_patch, LAST_PV_ID, bs_id, is_autobuildable, ripple_field )VALUES (patchPv_id,parPkg_id,SSpatch_version,isPatchDlocked,ORA_SYSDATE,NNuser_id,ORA_SYSDATETIME,NNuser_id,SSV_MM,SSV_NMM,SSV_EXT,parent_rec.src_path,'This is a patch to ' || parent_rec.pkg_name || ' ' || parent_rec.pkg_version,NNuser_id,'Y',patchPv_id,parent_rec.bs_id,parent_rec.is_autobuildable,parent_rec.ripple_field);INSERT INTO package_patches ( pv_id, patch_id, INSTALL_ORDER )( SELECT NNparent_id AS pv_id,pv.pv_id AS patch_id,LastInstallOrder + 1 AS INSTALL_ORDERFROM package_versions pvWHERE pv.pv_id = patchPv_idAND pv.is_patch = 'Y' );/* LOG ACTION */Log_Action ( patchPv_id, 'new_version', NNuser_id,'Patch version created: '|| SSpatch_version );Log_Action ( NNparent_id, 'patch_add', NNuser_id,'New patch created and attached: '|| SSpatch_version );ELSEpatchPv_id := patch_rec.pv_id;isPatchDlocked := patch_rec.dlocked;-- Find if pv_id exists in release content (i.e. it cannot be a patch)OPEN releases_cur;FETCH releases_cur INTO releases_rec;IF releases_cur%NOTFOUNDTHEN-- This pv_id is trully a patch, hence add Y to column IS_PATCHUPDATE package_versions SETis_patch = 'Y'WHERE pv_id = patchPv_id;INSERT INTO package_patches ( pv_id, patch_id, INSTALL_ORDER )( SELECT NNparent_id AS pv_id,pv.pv_id AS patch_id,LastInstallOrder + 1 AS INSTALL_ORDERFROM package_versions pvWHERE pv.pv_id = patchPv_idAND pv.is_patch = 'Y' );END IF;CLOSE releases_cur;/* LOG ACTION */Log_Action ( NNparent_id, 'patch_add', NNuser_id,'Patch version was found and attached: '|| SSpatch_version );END IF;END IF;/* Create Patch Dependencies */oPatchDepCollector := IN_LIST_NUMBER ( sPatchIdList );-- Make sure patch is unofficial before altering its dependenciesIF (oPatchDepCollector.COUNT > 0) AND (isPatchDlocked = 'N') THEN-- Delete Existing DependenciesDELETEFROM PACKAGE_DEPENDENCIES depWHERE dep.PV_ID = patchPv_id;-- Insert new dependenciesINSERT INTO PACKAGE_DEPENDENCIES ( PV_ID, DPV_ID, PKG_ID, DPKG_ID, BUILD_TYPE )SELECT patchPv_id AS PV_ID,pv.PV_ID AS DPV_ID,parPkg_id AS PKG_ID,pv.PKG_ID AS DPKG_ID,'L' AS BUILD_TYPEFROM PACKAGE_VERSIONS pvWHERE pv.PV_ID IN ( SELECT * FROM TABLE ( CAST ( oPatchDepCollector AS RELMGR_NUMBER_TAB_t ) ) );END IF;CLOSE parent_cur;CLOSE patch_cur;END New_Patch;/