Blame | Last modification | View Log | RSS feed
CREATE PACKAGE BODY "RELEASE_MANAGER"."PK_RELEASE_TEST" IS/*------------------------------|| Last Modified: S.Vukovic|| Modified Date: 12/Sep/2005|| Body Version: 3.0------------------------------*//*-------------------------------------------------------------------------------------------------------*/PROCEDURE New_Release ( sReleaseName IN VARCHAR2, sReleaseComments IN VARCHAR2, nProjId IN NUMBER, nSourceRtagId IN NUMBER, sIsBranched IN CHAR, nUserId IN NUMBER ) ISRtagId NUMBER;ParentRtagId NUMBER;RecCount NUMBER := 0;BEGIN/*--------------- Business Rules Here -------------------*/-- Check for missing parametersIF (sReleaseName IS NULL) OR (nUserId IS NULL)THENRAISE_APPLICATION_ERROR (-20000, 'Missing some parameters! sReleaseName= '|| sReleaseName ||', nUserId='|| nUserId );END IF;-- Check for duplicate Release NamesSELECT COUNT(rt.RTAG_ID) INTO RecCountFROM RELEASE_TAGS rtWHERE UPPER( rt.RTAG_NAME ) = UPPER( sReleaseName )AND rt.PROJ_ID = nProjId;IF (RecCount > 0) THENRAISE_APPLICATION_ERROR (-20000, 'Release Name '|| sReleaseName ||' is Already Used in this Project.');END IF;/*-------------------------------------------------------*/-- Get rtag_idSELECT SEQ_RTAG_ID.NEXTVAL INTO RtagId FROM DUAL;-- Get Parent RtagIdParentRtagId := GET_PARENT_RTAG ( RtagId, nSourceRtagId, sIsBranched );-- Create new releaseINSERT INTO RELEASE_TAGS ( RTAG_ID, RTAG_NAME, DESCRIPTION, CREATED_STAMP, CREATOR_ID,OFFICIAL, REBUILD_ENV, REBUILD_STAMP,PARENT_RTAG_ID, PROJ_ID )VALUES ( RtagId,sReleaseName,sReleaseComments,ORA_SYSDATE,nUserId,'N','N',0,ParentRtagId,nProjId );-- Update display OrderUPDATE_DISPLAY_ORDER ( nProjId );/* Log Project Action */Log_Project_Action ( nProjId, 'new_release', nUserId, sReleaseName, RtagId );-- Import Release ContentsIF (NOT nSourceRtagId IS NULL) THENImport_Release_Contents ( nSourceRtagId, RtagId, nUserId );END IF;END;/*-------------------------------------------------------------------------------------------------------*/PROCEDURE UPDATE_DISPLAY_ORDER ( nProjId IN NUMBER ) ISBEGIN/*--------------- Business Rules Here -------------------*//*-------------------------------------------------------*/UPDATE RELEASE_TAGS urt SETurt.DISPLAY_ORDER = (SELECT qry.REC_NUMFROM (SELECT rel.*, ROWNUM AS REC_NUMFROM (SELECT rt.RTAG_ID,rt.DISPLAY_ORDER,DECODE( rt.PARENT_RTAG_ID,rt.RTAG_ID, 0, rt.PARENT_RTAG_ID ) AS PARENT_RTAG_IDFROM RELEASE_TAGS rtWHERE rt.PROJ_ID = nProjId) relSTART WITH rel.PARENT_RTAG_ID = 0CONNECT BY PRIOR rel.RTAG_ID = rel.PARENT_RTAG_IDORDER SIBLINGS BY rel.DISPLAY_ORDER) qryWHERE qry.RTAG_ID = urt.RTAG_ID)WHERE urt.PROJ_ID = nProjId;END;/*-------------------------------------------------------------------------------------------------------*/PROCEDURE MOVE_RELEASE ( sRtagIdList IN VARCHAR2, nProjId IN NUMBER, nUserId IN NUMBER ) ISnIdCollector RELMGR_NUMBER_TAB_t := RELMGR_NUMBER_TAB_t();SeqNum NUMBER;BEGIN/*--------------- Business Rules Here -------------------*//*-------------------------------------------------------*/nIdCollector := IN_LIST_NUMBER ( sRtagIdList );-- Set start sequence numberSeqNum := 1;FOR i IN 1..nIdCollector.COUNTLOOP-- Update new display orderUPDATE RELEASE_TAGS rt SETrt.DISPLAY_ORDER = SeqNumWHERE rt.PROJ_ID = nProjIdAND rt.RTAG_ID = nIdCollector(i);SeqNum := SeqNum + 1;END LOOP;END;/*-------------------------------------------------------------------------------------------------------*/PROCEDURE Update_Release ( nRtagId IN NUMBER, sReleaseName IN VARCHAR2, sReleaseComments IN VARCHAR2, nParentRtagId IN NUMBER, nMASSRtagId IN NUMBER, nConfigSpecBranch IN VARCHAR2, nUserId IN NUMBER ) ISRecCount NUMBER := 0;ProjId NUMBER;BEGIN/*--------------- Business Rules Here -------------------*/-- Check for missing parametersIF (sReleaseName IS NULL) OR (nUserId IS NULL) OR (nRtagId IS NULL)THENRAISE_APPLICATION_ERROR (-20000, 'Missing some parameters! sReleaseName= '|| sReleaseName ||', nUserId='|| nUserId ||', nRtagId='|| nRtagId);END IF;-- Check for duplicate Release NamesSELECT rt.PROJ_ID INTO ProjIdFROM RELEASE_TAGS rtWHERE rt.RTAG_ID = nRtagId;SELECT COUNT(rt.RTAG_ID) INTO RecCountFROM RELEASE_TAGS rtWHERE UPPER( rt.RTAG_NAME ) = UPPER( sReleaseName )AND rt.RTAG_ID != nRtagIdAND rt.PROJ_ID = ProjId;IF (RecCount > 0) THENRAISE_APPLICATION_ERROR (-20000, 'Release Name '|| sReleaseName ||' is Already Used in this Project.');END IF;/*-------------------------------------------------------*/-- Update release detailsUPDATE RELEASE_TAGS rt SETrt.RTAG_NAME = sReleaseName,rt.DESCRIPTION = sReleaseComments,rt.PARENT_RTAG_ID = nParentRtagId,rt.ASSOC_MASS_REF = nMASSRtagId,rt.CONFIG_SPEC_BRANCH = nConfigSpecBranchWHERE rt.RTAG_ID = nRtagId;-- Update display OrderUPDATE_DISPLAY_ORDER ( ProjId );/* Log Project Action */Log_Project_Action ( ProjId, 'update_release', nUserId, 'Release Name: <br>Release Comments:', nRtagId );END;/*-------------------------------------------------------------------------------------------------------*/PROCEDURE Destroy_Release ( nRtagId IN NUMBER, nUserId IN NUMBER ) ISRecCount NUMBER := 0;sReleaseId VARCHAR2(4000);ProjId NUMBER;BEGIN/*--------------- Business Rules Here -------------------*/IF (nRtagId IS NULL)THENRAISE_APPLICATION_ERROR (-20000, 'Missing some parameters! nRtagId= '|| nRtagId );END IF;-- Check for any kidsSELECT COUNT( rt.RTAG_ID ) INTO RecCountFROM RELEASE_TAGS rtWHERE rt.PARENT_RTAG_ID = nRtagIdAND rt.RTAG_ID != rt.PARENT_RTAG_ID;IF (RecCount > 0) THENRAISE_APPLICATION_ERROR (-20000, 'Cannot destroy this release. You need to destroy its children releases first.' );END IF;/*-------------------------------------------------------*/-- Clear the release contentsClean_Release_Contents ( nRtagId, nUserId );/* Log Project Action */SELECT rt.PROJ_ID, rt.RTAG_NAME ||'['|| rt.RTAG_VERSION ||'.'|| rt.RTAG_LIFE_CYCLE ||']' INTO ProjId, sReleaseIdFROM RELEASE_TAGS rtWHERE rt.RTAG_ID = nRtagId;Log_Project_Action ( ProjId, 'destroy_release', nUserId, sReleaseId, nRtagId );-- Remove ReleaseDELETEFROM RELEASE_TAGS rtWHERE rt.RTAG_ID = nRtagId;END;/*-------------------------------------------------------------------------------------------------------*/PROCEDURE Import_Release_Contents ( nSourceRtagId IN NUMBER, nTargetRtagId IN NUMBER, nUserId IN NUMBER ) ISsSourceLocation VARCHAR2(4000);sTargetLocation VARCHAR2(4000);ProjId NUMBER;cReleaseMode CHAR(1);BEGIN/*--------------- Business Rules Here -------------------*/IF (nSourceRtagId IS NULL) OR (nTargetRtagId IS NULL)THENRAISE_APPLICATION_ERROR (-20000, 'Missing some parameters! nSourceRtagId= '|| nSourceRtagId ||', nTargetRtagId='|| nTargetRtagId );END IF;IF (nSourceRtagId = nTargetRtagId) THENRAISE_APPLICATION_ERROR (-20000, 'Cannot import release contents from same release.' );END IF;-- Check if Target release is in OPEN modeSELECT rt.OFFICIAL INTO cReleaseModeFROM RELEASE_TAGS rtWHERE rt.RTAG_ID = nTargetRtagId;IF (cReleaseMode != 'N') THENRAISE_APPLICATION_ERROR (-20000, 'Release must be in OPEN mode to import the contents.' );END IF;/*-------------------------------------------------------*/-- Clean target contentsClean_Release_Contents ( nTargetRtagId, nUserId );-- Import Released Area ContentsINSERT INTO RELEASE_CONTENT ( RTAG_ID, PV_ID, BASE_VIEW_ID, INSERT_STAMP, INSERTOR_ID,PKG_STATE )SELECT nTargetRtagId AS RTAG_ID,rc.PV_ID,rc.BASE_VIEW_ID,rc.INSERT_STAMP,rc.INSERTOR_ID,rc.PKG_STATEFROM RELEASE_CONTENT rcWHERE rc.RTAG_ID = nSourceRtagId;-- Import Ignore Warning statesINSERT INTO IGNORE_WARNINGS ( RTAG_ID, PV_ID, DPV_ID )SELECT nTargetRtagId AS RTAG_ID,igw.PV_ID,igw.DPV_IDFROM IGNORE_WARNINGS igwWHERE igw.rtag_id = nSourceRtagId;/* Log Project Action */-- Get Source LocationSELECT pr.PROJ_NAME ||' > '|| rt.RTAG_NAME ||' ['|| rt.RTAG_VERSION ||'.'|| rt.RTAG_LIFE_CYCLE ||']' INTO sSourceLocationFROM RELEASE_TAGS rt,PROJECTS prWHERE rt.PROJ_ID = pr.PROJ_IDAND rt.RTAG_ID = nSourceRtagId;-- Get Target LocationSELECT pr.PROJ_NAME ||' > '|| rt.RTAG_NAME ||' ['|| rt.RTAG_VERSION ||'.'|| rt.RTAG_LIFE_CYCLE ||']' INTO sTargetLocationFROM RELEASE_TAGS rt,PROJECTS prWHERE rt.PROJ_ID = pr.PROJ_IDAND rt.RTAG_ID = nTargetRtagId;-- Get project idSELECT rt.PROJ_ID INTO ProjIdFROM RELEASE_TAGS rtWHERE rt.RTAG_ID = nTargetRtagId;Log_Project_Action ( ProjId, 'import_release_contents', nUserId, 'SOURCE: '|| sSourceLocation ||' TARGET: '|| sTargetLocation, nTargetRtagId );END;/*-------------------------------------------------------------------------------------------------------*/PROCEDURE Clean_Release_Contents ( nRtagId IN NUMBER, nUserId IN NUMBER ) ISRecCount NUMBER;BEGIN/*--------------- Business Rules Here -------------------*/IF (nRtagId IS NULL)THENRAISE_APPLICATION_ERROR (-20000, 'Missing some parameters! nRtagId= '|| nRtagId );END IF;-- Check if other release references this releaseSELECT COUNT( rl.RTAG_ID ) INTO RecCountFROM RELEASE_LINKS rlWHERE rl.REF_RTAG_ID = nRtagId;IF (RecCount > 0) THENRAISE_APPLICATION_ERROR (-20000, 'This release is referenced by other release and cannot be destroyed.' );END IF;/*-------------------------------------------------------*/-- Delete Release linksDELETEFROM RELEASE_LINKS rlWHERE rl.RTAG_ID = nRtagId;-- Delete ignore warningDELETEFROM IGNORE_WARNINGS iwWHERE iw.RTAG_ID = nRtagId;-- Delete Build Order cached calculationsDELETEFROM BUILD_ORDER boWHERE bo.RTAG_ID = nRtagId;-- Delete Notification HistoryDELETEFROM NOTIFICATION_HISTORY nhWHERE nh.RTAG_ID = nRtagId;-- Delete Released Area ContentsDELETEFROM RELEASE_CONTENT rcWHERE rc.RTAG_ID = nRtagId;-- Delete Work In Progress Area ContentsDELETEFROM WORK_IN_PROGRESS wipWHERE wip.RTAG_ID = nRtagId;-- Delete Pending Area ContentsDELETEFROM PLANNED plWHERE pl.RTAG_ID = nRtagId;END;/*-------------------------------------------------------------------------------------------------------*/FUNCTION GET_PARENT_RTAG ( nRtagId IN NUMBER, nSourceRtagId IN NUMBER, cIsBranch IN CHAR ) RETURN NUMBER ISnSourceParentRtagId NUMBER;BEGIN/*--------------- Business Rules Here -------------------*/IF (nRtagId IS NULL) OR (cIsBranch IS NULL)THENRAISE_APPLICATION_ERROR (-20000, 'Missing some parameters! nRtagId= '|| nRtagId ||', cIsBranch= '|| cIsBranch );END IF;/*-------------------------------------------------------*/IF ( nSourceRtagId IS NULL ) THEN-- Create new on main branchRETURN nRtagId;ELSE-- Create from source rtag_id-- Find parent of Source RtagIdSELECT rt.PARENT_RTAG_ID INTO nSourceParentRtagIdFROM RELEASE_TAGS rtWHERE rt.RTAG_ID = nSourceRtagId;IF (UPPER(cIsBranch) = 'Y') THENRETURN nSourceRtagId;ELSEIF (nSourceRtagId = nSourceParentRtagId) THENRETURN nRtagId;ELSERETURN nSourceParentRtagId;END IF;END IF;END IF;END;/*-------------------------------------------------------------------------------------------------------*/-- PROCEDURE Get_Next_Version ( nSourceRtagId IN NUMBER,-- sNextVersion OUT VARCHAR2,-- nNextLifeCycle OUT NUMBER,-- nParentRtagId OUT NUMBER,-- nProjId IN NUMBER ) IS---- SourceBranchCount NUMBER;-- ProjRootVersion VARCHAR2(4000);-- LastLifeCycle NUMBER;-- ROOT_VERSION_NOT_FOUND NUMBER := -1;-- SET_PARENT_AS_YOURSELF NUMBER := -1;---- SourceProjId NUMBER;-- SourceVersion RELEASE_TAGS.RTAG_VERSION%TYPE;-- SourceLifeCycle RELEASE_TAGS.RTAG_LIFE_CYCLE%TYPE;---- BEGIN-- /*--------------- Business Rules Here -------------------*/-- /*-------------------------------------------------------*/------ BEGIN-- -- Get Project root version-- SELECT rt.RTAG_VERSION INTO ProjRootVersion-- FROM RELEASE_TAGS rt-- WHERE rt.PROJ_ID = nProjId-- AND rt.RTAG_ID = rt.PARENT_RTAG_ID;---- EXCEPTION-- WHEN NO_DATA_FOUND THEN-- ProjRootVersion := ROOT_VERSION_NOT_FOUND;-- END;---------- BEGIN-- -- Get info for source rtagid-- SELECT rt.PROJ_ID, rt.RTAG_VERSION, rt.RTAG_LIFE_CYCLE INTO SourceProjId, SourceVersion, SourceLifeCycle-- FROM RELEASE_TAGS rt-- WHERE rt.RTAG_ID = nSourceRtagId;---- EXCEPTION-- WHEN NO_DATA_FOUND THEN-- SourceProjId := NULL;-- SourceVersion := NULL;-- SourceLifeCycle := NULL;-- END;------ IF (nSourceRtagId IS NULL) OR ( SourceProjId != nProjId ) THEN---- /* Blank Release Required OR Release imported from other project */---- IF (ProjRootVersion = ROOT_VERSION_NOT_FOUND) THEN-- /* No Releases found in the project, hence calculate next version available. */---- -- Set parent rtag-- nParentRtagId := SET_PARENT_AS_YOURSELF;------ BEGIN-- -- Get Next Available Global Root Version-- SELECT MAX( TO_NUMBER( rt.RTAG_VERSION ) ) INTO ProjRootVersion-- FROM RELEASE_TAGS rt-- WHERE rt.RTAG_ID = rt.PARENT_RTAG_ID;---- -- Set Next Rtag Version-- sNextVersion := CAST( ProjRootVersion + 1 AS VARCHAR2 );---- -- Restart Lifecycle-- nNextLifeCycle := 0;------ EXCEPTION-- WHEN NO_DATA_FOUND THEN-- -- Release Manager has no releases, hence start from 1-- sNextVersion := '1';-- nNextLifeCycle := 0;---- END;-------- ELSE-- /* Releases found in this project. */---- SELECT qry.RTAG_ID, qry.RTAG_LIFE_CYCLE INTO nParentRtagId, LastLifeCycle-- FROM (-- SELECT rt.RTAG_ID, rt.RTAG_LIFE_CYCLE-- FROM RELEASE_TAGS rt-- WHERE rt.PROJ_ID = nProjId-- AND rt.RTAG_VERSION = ProjRootVersion-- ORDER BY rt.RTAG_LIFE_CYCLE DESC-- ) qry-- WHERE ROWNUM = 1;------ -- Set same Rtag Version-- sNextVersion := ProjRootVersion;---- -- Increase Lifecycle-- nNextLifeCycle := LastLifeCycle + 1;---- END IF;-------- ELSE-- /* Create Release From other release within this project */---- -- Set parent id-- nParentRtagId := nSourceRtagId;------ -- Get number of source branches-- SELECT COUNT(rt.RTAG_ID) INTO SourceBranchCount-- FROM RELEASE_TAGS rt-- WHERE rt.PROJ_ID = nProjId-- AND rt.PARENT_RTAG_ID = nSourceRtagId;------ IF SourceBranchCount = 0 THEN-- /* Release is Head (i.e. Tip on its branch ) */---- -- Set Next Rtag Version-- sNextVersion := SourceVersion;---- -- Increase Lifecycle-- nNextLifeCycle := SourceLifeCycle + 1;------ ELSIF SourceBranchCount = 1 THEN-- /* Release IS NOT Head, but can be branched */---- -- Set Next Rtag Version-- sNextVersion := SourceVersion ||'.'|| SourceLifeCycle;---- -- Reset Lifecycle to 1-- nNextLifeCycle := 1;------ ELSE-- -- Limit of two branches is reached-- RAISE_APPLICATION_ERROR (-20000, 'This release is already branched and cannot be branched again. ');---- END IF;-------------- END IF;------END;/*-------------------------------------------------------------------------------------------------------*/PROCEDURE GET_VIEW_CONTENT ( RtagId IN NUMBER, ViewId IN NUMBER, RecordSet OUT typeCur ) ISIsBaseView CHAR(1);BEGIN-- Check if the view is BASE VIEWSELECT vi.BASE_VIEW INTO IsBaseViewFROM VIEWS viWHERE vi.VIEW_ID = ViewId;IF (IsBaseView = 'Y') THEN-- Get Base view contentOPEN RecordSet FORSELECT DECODE ( rel.pkg_state, NULL, 0, rel.pkg_state ) AS PKG_STATE,pv.pv_id,pkg.pkg_name,pv.pkg_version,pv.dlocked,pv.pv_description,pv.BUILD_TYPEFROM release_content rel,packages pkg,package_versions pvWHERE pv.pkg_id = pkg.pkg_idAND rel.pv_id = pv.pv_idAND rel.BASE_VIEW_ID = ViewIdAND rel.RTAG_ID = RtagIdORDER BY UPPER(pkg.PKG_NAME);ELSE-- Get non base view contentOPEN RecordSet FORSELECT DECODE ( rel.pkg_state, NULL, 0, rel.pkg_state ) AS PKG_STATE,pv.pv_id,pkg.pkg_name,pv.pkg_version,pv.dlocked,pv.pv_description,pv.BUILD_TYPEFROM release_content rel,packages pkg,package_versions pv,VIEW_DEF vdWHERE pv.pkg_id = pkg.pkg_idAND rel.pv_id = pv.pv_idAND vd.VIEW_ID = ViewIdAND vd.PKG_ID = pv.PKG_IDAND rel.RTAG_ID = RtagIdORDER BY UPPER(pkg.PKG_NAME);END IF;END;/*-------------------------------------------------------------------------------------------------------*/PROCEDURE ADD_PACKAGE ( newPvId IN NUMBER, ViewId IN NUMBER, RtagId IN NUMBER, UserId IN NUMBER ) ISReleaseLocation VARCHAR2(4000);sPkgVersion VARCHAR2(4000);nPkgId NUMBER;sVExt VARCHAR2(4000);IsPatch PACKAGE_VERSIONS.IS_PATCH%TYPE := 'N';-- Find package for replacementCURSOR curReplacePkg ISSELECT pv.PV_IDFROM RELEASE_CONTENT rc,PACKAGE_VERSIONS pvWHERE rc.PV_ID = pv.PV_IDAND rc.RTAG_ID = RtagIdAND pv.PKG_ID = nPkgIdAND NVL( pv.V_EXT, 'LINK_A_NULL' ) = NVL( sVExt, 'LINK_A_NULL' );recReplacePkg curReplacePkg%ROWTYPE;BEGIN-- Get is_patch, pkg_id and v_extSELECT pv.IS_PATCH, pv.PKG_ID, pv.V_EXT INTO IsPatch, nPkgId, sVExtFROM PACKAGE_VERSIONS pvWHERE pv.PV_ID = newPvId;-- Never put patch in relesed areaIF (IsPatch != 'Y') OR (IsPatch IS NULL) THEN-- Try to get a package to be replaced with this new one.-- Use unique constraint of PKG_ID and V_EXTOPEN curReplacePkg;FETCH curReplacePkg INTO recReplacePkg;IF curReplacePkg%FOUND THEN-- Replace packageREPLACE_PACKAGE ( newPvId, recReplacePkg.PV_ID, RtagId, UserId );ELSE-- Add new packageINSERT INTO RELEASE_CONTENT ( RTAG_ID, PV_ID, BASE_VIEW_ID, INSERT_STAMP, INSERTOR_ID, PKG_STATE )VALUES( RtagId, newPvId, ViewId, Ora_Sysdate, UserId, 0);/* LOG ACTION */SELECT proj.PROJ_NAME ||' / '|| rt.RTAG_NAME INTO ReleaseLocationFROM PROJECTS proj,RELEASE_TAGS rtWHERE rt.PROJ_ID = proj.PROJ_IDAND rt.RTAG_ID = RtagId;SELECT pv.PKG_VERSION INTO sPkgVersionFROM PACKAGE_VERSIONS pvWHERE pv.PV_ID = newPvId;Log_Action ( newPvId, 'add', UserId, 'Location: '|| ReleaseLocation );END IF;CLOSE curReplacePkg;END IF;END;/*-------------------------------------------------------------------------------------------------------*/PROCEDURE REPLACE_PACKAGE ( newPvId IN NUMBER, oldPvId IN NUMBER, RtagId IN NUMBER, UserId IN NUMBER ) ISReleaseLocation VARCHAR2(4000);sPkgVersion VARCHAR2(4000);BEGIN-- Replace PackageUPDATE RELEASE_CONTENTSET pv_id = newPvId,insert_stamp = Ora_Sysdate,insertor_id = UserIdWHERE rtag_id = RtagIdAND pv_id = oldPvId;/* LOG ACTION */SELECT proj.PROJ_NAME ||' / '|| rt.RTAG_NAME INTO ReleaseLocationFROM PROJECTS proj,RELEASE_TAGS rtWHERE rt.PROJ_ID = proj.PROJ_IDAND rt.RTAG_ID = RtagId;SELECT pv.PKG_VERSION INTO sPkgVersionFROM PACKAGE_VERSIONS pvWHERE pv.PV_ID = newPvId;Log_Action ( oldPvId, 'replaced_with', UserId, 'Replacing with: '|| sPkgVersion ||' at '|| ReleaseLocation );Log_Action ( newPvId, 'add', UserId, 'Location: '|| ReleaseLocation );END;/*-------------------------------------------------------------------------------------------------------*/PROCEDURE REMOVE_PACKAGE ( PvId IN NUMBER, RtagId IN NUMBER, UserId IN NUMBER ) ISReleaseLocation VARCHAR2(4000);BEGIN-- Delete old packageDELETEFROM RELEASE_CONTENT rcWHERE rc.PV_ID = PvIdAND rc.RTAG_ID = RtagId;/* LOG ACTION */SELECT proj.PROJ_NAME ||' / '|| rt.RTAG_NAME INTO ReleaseLocationFROM PROJECTS proj,RELEASE_TAGS rtWHERE rt.PROJ_ID = proj.PROJ_IDAND rt.RTAG_ID = RtagId;Log_Action ( PvId, 'delete_from_released', UserId, 'Location: '|| ReleaseLocation );END;/*-------------------------------------------------------------------------------------------------------*/PROCEDURE REMOVE_MATCHING_PACKAGE ( PvId IN NUMBER, RtagId IN NUMBER, UserId IN NUMBER ) ISReleaseLocation VARCHAR2(4000);CURSOR curMatchingPackage ISSELECT mpv.PV_IDFROM RELEASE_CONTENT rc,PACKAGE_VERSIONS mpv,PACKAGE_VERSIONS pvWHERE rc.PV_ID = mpv.PV_IDAND rc.RTAG_ID = RtagIdAND pv.PV_ID = PvIdAND pv.PKG_ID = mpv.PKG_IDAND NVL( pv.V_EXT, '|LINK_A_NULL|' ) = NVL( mpv.V_EXT, '|LINK_A_NULL|' );recMatchingPackage curMatchingPackage%ROWTYPE;BEGINOPEN curMatchingPackage;FETCH curMatchingPackage INTO recMatchingPackage;IF curMatchingPackage%FOUND THEN-- Delete old packageDELETEFROM RELEASE_CONTENT rcWHERE rc.PV_ID = recMatchingPackage.PV_IDAND rc.RTAG_ID = RtagId;/* LOG ACTION */SELECT proj.PROJ_NAME ||' / '|| rt.RTAG_NAME INTO ReleaseLocationFROM PROJECTS proj,RELEASE_TAGS rtWHERE rt.PROJ_ID = proj.PROJ_IDAND rt.RTAG_ID = RtagId;Log_Action ( recMatchingPackage.PV_ID, 'delete_from_released', UserId, 'Location: '|| ReleaseLocation );END IF;CLOSE curMatchingPackage;END;/*-------------------------------------------------------------------------------------------------------*/FUNCTION GET_PACKAGE_VIEW ( PvId IN NUMBER, RtagId IN NUMBER ) RETURN NUMBER ISReturnValue NUMBER;BEGINSELECT rc.BASE_VIEW_ID INTO ReturnValueFROM RELEASE_CONTENT rcWHERE rc.RTAG_ID = RtagIdAND rc.PV_ID = PvId;RETURN ReturnValue;END;/*-------------------------------------------------------------------------------------------------------*/PROCEDURE RUN_POST_ACTIONS ( PvId IN NUMBER, RtagId IN NUMBER ) ISBEGIN-- Reset Ignore warnings up-the-treeRESET_IGNORE_WARNINGS ( TO_CHAR(PvId), RtagId );-- Refresh Package statesTOUCH_RELEASE ( RtagId );END;/*-------------------------------------------------------------------------------------------------------*/PROCEDURE RUN_POST_ACTIONS_BULK ( PvId IN NUMBER ) ISCURSOR curReleases ISSELECT rc.RTAG_IDFROM RELEASE_CONTENT rcWHERE rc.PV_ID = PvId;recReleases curReleases%ROWTYPE;BEGINOPEN curReleases;FETCH curReleases INTO recReleases;WHILE curReleases%FOUNDLOOPRUN_POST_ACTIONS ( PvId, recReleases.RTAG_ID );FETCH curReleases INTO recReleases;END LOOP;CLOSE curReleases;END;/*-------------------------------------------------------------------------------------------------------*/PROCEDURE CHANGE_PACKAGE_VIEW ( PvId IN NUMBER, RtagId IN NUMBER, NewViewId IN NUMBER ) ISBEGINUPDATE RELEASE_CONTENT rc SETrc.BASE_VIEW_ID = NewViewIdWHERE rc.PV_ID = PvIdAND rc.RTAG_ID = RtagId;END;/*-------------------------------------------------------------------------------------------------------*/PROCEDURE ADD_RELEASE_REFERENCE ( nRtagId IN NUMBER, nRefRtagId IN NUMBER, ProblemString OUT VARCHAR2 ) ISRowCount NUMBER;CURSOR curPackageClash ISSELECT pkg.PKG_NAME,er.*FROM (/* Get existing referenced packages */SELECT pv.PKG_ID,pv.V_EXTFROM RELEASE_LINKS rl,RELEASE_CONTENT rc,PACKAGE_VERSIONS pvWHERE rl.RTAG_ID = nRtagIdAND rl.REF_RTAG_ID = rc.RTAG_IDAND rc.PV_ID = pv.PV_ID) er,(/* Get current reference packages */SELECT pv.PKG_ID,pv.V_EXTFROM RELEASE_CONTENT rc,PACKAGE_VERSIONS pvWHERE rc.RTAG_ID = nRefRtagIdAND rc.PV_ID = pv.PV_ID) cr,PACKAGES PKGWHERE er.PKG_ID = cr.PKG_IDAND NVL(er.V_EXT, '|LINK_A_NULL|') = NVL(cr.V_EXT, '|LINK_A_NULL|')AND er.PKG_ID = pkg.PKG_ID;recPackageClash curPackageClash%ROWTYPE;BEGIN/*--------------- Business Rules Here -------------------*/IF (nRtagId = 0) OR ( nRtagId IS NULL ) THENRAISE_APPLICATION_ERROR (-20000, 'nRtagId is not supplied. [nRtagId='|| nRtagId ||']' );END IF;IF (nRefRtagId = 0) OR ( nRefRtagId IS NULL ) THENRAISE_APPLICATION_ERROR (-20000, 'nRefRtagId is not supplied. [nRefRtagId='|| nRefRtagId ||']' );END IF;/*-------------------------------------------------------*/ProblemString := NULL;-- Check if release already has referencesSELECT COUNT(rl.RTAG_ID) INTO RowCountFROM RELEASE_LINKS rlWHERE rl.RTAG_ID = nRtagId;IF RowCount > 0 THEN-- Found existing references-- Make sure there is no package clashesOPEN curPackageClash;FETCH curPackageClash INTO recPackageClash;IF curPackageClash%FOUND THENProblemString := ProblemString ||'Following is partial list of package already referenced from other release:'|| UTL_TCP.CRLF;WHILE curPackageClash%FOUNDLOOPEXIT WHEN LENGTH( ProblemString || '- '|| recPackageClash.PKG_NAME ||' '|| recPackageClash.V_EXT || UTL_TCP.CRLF ) > 200; -- Do not allow variable overflowProblemString := ProblemString || '- '|| recPackageClash.PKG_NAME ||' '|| recPackageClash.V_EXT || UTL_TCP.CRLF;FETCH curPackageClash INTO recPackageClash;END LOOP;END IF;CLOSE curPackageClash;ELSE-- No references found, hence reference a release-- Remove exising package from this release to be referencedREMOVE_RELEASE_REFERENCE ( nRtagId, nRefRtagId);-- Add new linked packages to releaseINSERT INTO RELEASE_CONTENT rc (RTAG_ID, PV_ID, BASE_VIEW_ID, INSERT_STAMP, INSERTOR_ID, PKG_STATE)SELECT nRtagId,rc.PV_ID,rc.BASE_VIEW_ID,rc.INSERT_STAMP,rc.INSERTOR_ID,rc.PKG_STATEFROM RELEASE_CONTENT rcWHERE rc.RTAG_ID = nRefRtagId;-- Copy ignore warnings for referenced packagesINSERT INTO IGNORE_WARNINGS iw (RTAG_ID, PV_ID, DPV_ID, IS_PATCH_IGNORE)SELECT nRtagId,iw.PV_ID,iw.DPV_ID,iw.IS_PATCH_IGNOREFROM IGNORE_WARNINGS iw,RELEASE_CONTENT rcWHERE iw.RTAG_ID = rc.RTAG_IDAND iw.PV_ID = rc.PV_IDAND rc.RTAG_ID = nRefRtagId;-- Reference releaseINSERT INTO RELEASE_LINKS (RTAG_ID, REF_RTAG_ID)VALUES ( nRtagId, nRefRtagId );-- Refresh Package statesTOUCH_RELEASE ( nRtagId );END IF;END;/*-------------------------------------------------------------------------------------------------------*/PROCEDURE REMOVE_RELEASE_REFERENCE ( nRtagId IN NUMBER, nRefRtagId IN NUMBER ) ISBEGIN/*--------------- Business Rules Here -------------------*/IF (nRtagId = 0) OR ( nRtagId IS NULL ) THENRAISE_APPLICATION_ERROR (-20000, 'nRtagId is not supplied. [nRtagId='|| nRtagId ||']' );END IF;IF (nRefRtagId = 0) OR ( nRefRtagId IS NULL ) THENRAISE_APPLICATION_ERROR (-20000, 'nRefRtagId is not supplied. [nRefRtagId='|| nRefRtagId ||']' );END IF;/*-------------------------------------------------------*/-- Remove ignore warnings for those packages who use referenced packagesDELETE FROM IGNORE_WARNINGS iwWHERE iw.RTAG_ID = nRtagIdAND iw.DPV_ID IN (SELECT dep.DPV_IDFROM (/* Get referenced packages */SELECT pv.PKG_ID,pv.V_EXTFROM RELEASE_CONTENT rc,PACKAGE_VERSIONS pvWHERE rc.RTAG_ID = nRefRtagIdAND rc.PV_ID = pv.PV_ID) cr,(/* Get all dependencies for current release */SELECT DISTINCTpv.PKG_ID,pv.V_EXT,dep.DPV_IDFROM RELEASE_CONTENT rc,PACKAGE_DEPENDENCIES dep,PACKAGE_VERSIONS pvWHERE rc.RTAG_ID = nRtagIdAND rc.PV_ID = dep.PV_IDAND dep.PV_ID = pv.PV_ID) depWHERE dep.PKG_ID = cr.PKG_IDAND NVL(dep.V_EXT, '|LINK_A_NULL|') = NVL(cr.V_EXT, '|LINK_A_NULL|'));-- Remove ignore warnings for those package which are going to be replaced with the referenceDELETE FROM IGNORE_WARNINGS iwWHERE iw.RTAG_ID = nRtagIdAND iw.PV_ID IN (SELECT pv.PV_IDFROM (/* Get referenced packages */SELECT pv.PKG_ID,pv.V_EXTFROM RELEASE_CONTENT rc,PACKAGE_VERSIONS pvWHERE rc.RTAG_ID = nRefRtagIdAND rc.PV_ID = pv.PV_ID) cr,RELEASE_CONTENT rc,PACKAGE_VERSIONS pvWHERE pv.PKG_ID = cr.PKG_IDAND NVL(pv.V_EXT, '|LINK_A_NULL|') = NVL(cr.V_EXT, '|LINK_A_NULL|')AND rc.RTAG_ID = nRtagIdAND rc.PV_ID = pv.PV_ID);-- Remove matching packages from releaseDELETE FROM RELEASE_CONTENT rcWHERE rc.RTAG_ID = nRtagIdAND rc.PV_ID IN (SELECT pv.PV_IDFROM (/* Get referenced packages */SELECT pv.PKG_ID,pv.V_EXTFROM RELEASE_CONTENT rc,PACKAGE_VERSIONS pvWHERE rc.RTAG_ID = nRefRtagIdAND rc.PV_ID = pv.PV_ID) cr,RELEASE_CONTENT rc,PACKAGE_VERSIONS pvWHERE pv.PKG_ID = cr.PKG_IDAND NVL(pv.V_EXT, '|LINK_A_NULL|') = NVL(cr.V_EXT, '|LINK_A_NULL|')AND rc.RTAG_ID = nRtagIdAND rc.PV_ID = pv.PV_ID);-- Remove Reference releaseDELETEFROM RELEASE_LINKS rlWHERE rl.RTAG_ID = nRtagIdAND rl.REF_RTAG_ID = nRefRtagId;-- Refresh Package statesTOUCH_RELEASE ( nRtagId );END;/*-------------------------------------------------------------------------------------------------------*/PROCEDURE CAN_USER_WRITE_TO_RELEASE ( RtagId IN NUMBER, PvId IN NUMBER, Permission IN CHAR ) IScReleaseMode CHAR(1);cPvMode CHAR(1);BEGIN-- Get Release ModeSELECT rt.OFFICIAL INTO cReleaseModeFROM RELEASE_TAGS rtWHERE rt.RTAG_ID = RtagId;-- Get Package ModeSELECT pv.DLOCKED INTO cPvModeFROM PACKAGE_VERSIONS pvWHERE pv.PV_ID = PvId;-- Only check if package is lockedIF (cPvMode = 'Y') THENIF (cReleaseMode != 'N') AND (Permission != 'Y')THENRAISE_APPLICATION_ERROR (-20000, 'Cannot add package to this release. Release needs to be in Open Mode.' );END IF;END IF;END;/*-------------------------------------------------------------------------------------------------------*/END PK_RELEASE_TEST;/ALTER PACKAGE "RELEASE_MANAGER"."PK_RELEASE_TEST"COMPILE BODYPLSQL_OPTIMIZE_LEVEL= 2PLSQL_CODE_TYPE= INTERPRETEDPLSQL_DEBUG= FALSEREUSE SETTINGS TIMESTAMP '2007-08-29 16:25:16'/