Subversion Repositories DevTools

Rev

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 IS
        SELECT pv.*, pkg.pkg_name
          FROM package_versions pv,
                       packages pkg
         WHERE pv.pv_id = NNparent_id
                   AND pv.pkg_id = pkg.pkg_id;
    parent_rec parent_cur%ROWTYPE;

    CURSOR patch_cur IS
        SELECT pv.*, pg.pkg_name
          FROM package_versions pv,
                       packages pg
         WHERE pv.pkg_id = parPkg_id
                   AND pv.pkg_version = SSpatch_version
                   AND pv.pkg_id = pg.pkg_id;
    patch_rec patch_cur%ROWTYPE;

        CURSOR releases_cur IS
        SELECT rc.pv_id
                  FROM release_content rc
                 WHERE rc.pv_id = patch_rec.pv_id;
    releases_rec releases_cur%ROWTYPE;


BEGIN

        -- Get Last Install Order
    SELECT Count(*) INTO LastInstallOrder
          FROM PACKAGE_PATCHES pp
         WHERE pp.PV_ID = NNparent_id;


    -- Get parent details
        OPEN parent_cur;
    FETCH parent_cur INTO parent_rec;
        parPkg_id := parent_rec.pkg_id;


        -- Find if patch exists in database
    OPEN patch_cur;
    FETCH patch_cur INTO patch_rec;


    -- Parent must be official
    IF parent_rec.dlocked = 'Y' THEN

            IF patch_cur%NOTFOUND
            THEN
                isPatchDlocked := '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_ORDER
                                       FROM package_versions pv
                                          WHERE pv.pv_id = patchPv_id
                                            AND 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 );


            ELSE

                    patchPv_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%NOTFOUND
                        THEN
                                -- This pv_id is trully a patch, hence add Y to column IS_PATCH
                                UPDATE package_versions SET
                                           is_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_ORDER
                                               FROM package_versions pv
                                                  WHERE pv.pv_id = patchPv_id
                                                    AND 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 dependencies
    IF (oPatchDepCollector.COUNT > 0) AND (isPatchDlocked = 'N') THEN
        -- Delete Existing Dependencies
        DELETE
          FROM PACKAGE_DEPENDENCIES dep
         WHERE dep.PV_ID = patchPv_id;


        -- Insert new dependencies
        INSERT 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_TYPE
          FROM PACKAGE_VERSIONS pv
         WHERE 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;
/