git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10915 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			185 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			185 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
## @file
 | 
						|
# This file is for installed package information database operations
 | 
						|
#
 | 
						|
# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
 | 
						|
# This program and the accompanying materials
 | 
						|
# are licensed and made available under the terms and conditions of the BSD License
 | 
						|
# which accompanies this distribution.  The full text of the license may be found at
 | 
						|
# http://opensource.org/licenses/bsd-license.php
 | 
						|
#
 | 
						|
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 | 
						|
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | 
						|
#
 | 
						|
 | 
						|
##
 | 
						|
# Import Modules
 | 
						|
#
 | 
						|
import sqlite3
 | 
						|
import os
 | 
						|
 | 
						|
import Common.EdkLogger as EdkLogger
 | 
						|
import IpiDb
 | 
						|
 | 
						|
(DEPEX_CHECK_SUCCESS, DEPEX_CHECK_MODULE_NOT_FOUND, \
 | 
						|
DEPEX_CHECK_PACKAGE_NOT_FOUND, DEPEX_CHECK_DP_NOT_FOUND) = (0, 1, 2, 3)
 | 
						|
 | 
						|
## IpiDb
 | 
						|
#
 | 
						|
# This class represents the installed package information database
 | 
						|
# Add/Remove/Get installed distribution package information here.
 | 
						|
# 
 | 
						|
# 
 | 
						|
# @param object:      Inherited from object class
 | 
						|
# @param DbPath:      A string for the path of the database
 | 
						|
#
 | 
						|
# @var Conn:          Connection of the database
 | 
						|
# @var Cur:           Cursor of the connection
 | 
						|
#
 | 
						|
class DependencyRules(object):
 | 
						|
    def __init__(self, Db):
 | 
						|
        self.IpiDb = Db
 | 
						|
    
 | 
						|
    ## Check whether a module exists in current workspace.
 | 
						|
    #
 | 
						|
    # @param Guid:  
 | 
						|
    # @param Version:
 | 
						|
    #
 | 
						|
    def CheckModuleExists(self, Guid, Version, ReturnCode = DEPEX_CHECK_SUCCESS):
 | 
						|
        EdkLogger.verbose("\nCheck module exists in workspace started ...")
 | 
						|
        ModuleList = []
 | 
						|
        ModuleList = self.IpiDb.GetModInPackage(Guid, Version)
 | 
						|
        ModuleList.extend(self.IpiDb.GetStandaloneModule(Guid, Version))
 | 
						|
        EdkLogger.verbose("Check module exists in workspace ... DONE!")
 | 
						|
        if len(ModuleList) > 0:
 | 
						|
            return True
 | 
						|
        else:
 | 
						|
            ReturnCode = DEPEX_CHECK_MODULE_NOT_FOUND
 | 
						|
            return False
 | 
						|
        
 | 
						|
 | 
						|
    ## Check whether a module depex satisfied by current workspace.
 | 
						|
    #
 | 
						|
    # @param ModuleObj:  
 | 
						|
    # @param DpObj:
 | 
						|
    #
 | 
						|
    def CheckModuleDepexSatisfied(self, ModuleObj, DpObj = None, ReturnCode = DEPEX_CHECK_SUCCESS):
 | 
						|
        EdkLogger.verbose("\nCheck module depex met by workspace started ...")
 | 
						|
        for Dep in ModuleObj.PackageDependencies:
 | 
						|
            Exist = self.CheckPackageExists(Dep.PackageGuid, Dep.PackageVersion, ReturnCode)
 | 
						|
            if not Exist:
 | 
						|
                if DpObj == None:
 | 
						|
                    ReturnCode = DEPEX_CHECK_PACKAGE_NOT_FOUND
 | 
						|
                    return False
 | 
						|
                for GuidVerPair in DpObj.PackageSurfaceArea.keys():
 | 
						|
                    if Dep.PackageGuid == GuidVerPair[0]:
 | 
						|
                        if Dep.PackageVersion == None or len(Dep.PackageVersion) == 0:
 | 
						|
                            break
 | 
						|
                        if Dep.PackageVersion == GuidVerPair[1]:
 | 
						|
                            break
 | 
						|
                        else:
 | 
						|
                            ReturnCode = DEPEX_CHECK_PACKAGE_NOT_FOUND
 | 
						|
                            return False
 | 
						|
                else:
 | 
						|
                    ReturnCode = DEPEX_CHECK_PACKAGE_NOT_FOUND
 | 
						|
                    return False
 | 
						|
        return True
 | 
						|
        
 | 
						|
        EdkLogger.verbose("Check module depex met by workspace ... DONE!")
 | 
						|
    
 | 
						|
    ## Check whether a package exists in current workspace.
 | 
						|
    #
 | 
						|
    # @param Guid:  
 | 
						|
    # @param Version:
 | 
						|
    #
 | 
						|
    def CheckPackageExists(self, Guid, Version, ReturnCode = DEPEX_CHECK_SUCCESS):
 | 
						|
        EdkLogger.verbose("\nCheck package exists in workspace started ...")
 | 
						|
        PkgList = []
 | 
						|
        PkgList = self.IpiDb.GetPackage(Guid, Version)
 | 
						|
        if len(PkgList) > 0:
 | 
						|
            return True
 | 
						|
        else:
 | 
						|
            ReturnCode = DEPEX_CHECK_PACKAGE_NOT_FOUND
 | 
						|
            return False
 | 
						|
        
 | 
						|
        EdkLogger.verbose("Check package exists in workspace ... DONE!")
 | 
						|
        
 | 
						|
    ## Check whether a package depex satisfied by current workspace.
 | 
						|
    #
 | 
						|
    # @param ModuleObj:  
 | 
						|
    # @param DpObj:
 | 
						|
    #
 | 
						|
    def CheckPackageDepexSatisfied(self, PkgObj, DpObj = None, ReturnCode = DEPEX_CHECK_SUCCESS):
 | 
						|
        
 | 
						|
        for ModKey in PkgObj.Modules.keys():
 | 
						|
            ModObj = PkgObj.Modules[ModKey]
 | 
						|
            if self.CheckModuleDepexSatisfied(ModObj, DpObj, ReturnCode):
 | 
						|
                continue
 | 
						|
            else:
 | 
						|
                return False
 | 
						|
        return True
 | 
						|
        
 | 
						|
    ## Check whether a DP exists in current workspace.
 | 
						|
    #
 | 
						|
    # @param Guid:  
 | 
						|
    # @param Version:
 | 
						|
    #
 | 
						|
    def CheckDpExists(self, Guid, Version, ReturnCode = DEPEX_CHECK_SUCCESS):
 | 
						|
        EdkLogger.verbose("\nCheck DP exists in workspace started ...")
 | 
						|
        DpList = []
 | 
						|
        DpList = self.IpiDb.GetDp(Guid, Version)
 | 
						|
        if len(DpList) > 0:
 | 
						|
            return True
 | 
						|
        else:
 | 
						|
            ReturnCode = DEPEX_CHECK_DP_NOT_FOUND
 | 
						|
            return False
 | 
						|
        
 | 
						|
        EdkLogger.verbose("Check DP exists in workspace ... DONE!")
 | 
						|
        
 | 
						|
    ## Check whether a DP depex satisfied by current workspace.
 | 
						|
    #
 | 
						|
    # @param ModuleObj:  
 | 
						|
    # @param DpObj:
 | 
						|
    #
 | 
						|
    def CheckDpDepexSatisfied(self, DpObj, ReturnCode = DEPEX_CHECK_SUCCESS):
 | 
						|
        
 | 
						|
        for PkgKey in DpObj.PackageSurfaceArea.keys():
 | 
						|
            PkgObj = DpObj.PackageSurfaceArea[PkgKey]
 | 
						|
            if self.CheckPackageDepexSatisfied(PkgObj, DpObj, ReturnCode):
 | 
						|
                continue
 | 
						|
            else:
 | 
						|
                return False
 | 
						|
            
 | 
						|
        for ModKey in DpObj.ModuleSurfaceArea.keys():
 | 
						|
            ModObj = PkgObj.ModuleSurfaceArea[ModKey]
 | 
						|
            if self.CheckModuleDepexSatisfied(ModObj, DpObj, ReturnCode):
 | 
						|
                continue
 | 
						|
            else:
 | 
						|
                return False
 | 
						|
        
 | 
						|
        return True
 | 
						|
    
 | 
						|
    ## Check whether a DP depex satisfied by current workspace.
 | 
						|
    #
 | 
						|
    # @param ModuleObj:  
 | 
						|
    # @param DpObj:
 | 
						|
    #
 | 
						|
    def CheckDpDepexForRemove(self, DpGuid, DpVersion, ReturnCode = DEPEX_CHECK_SUCCESS):
 | 
						|
        
 | 
						|
        # Get mod list that is dependent on pkg installed from this DP.
 | 
						|
        ModList = self.IpiDb.GetDpDependentModuleList(DpGuid, DpVersion)
 | 
						|
        
 | 
						|
        if len(ModList) > 0:
 | 
						|
            return False
 | 
						|
        
 | 
						|
        return True
 | 
						|
##
 | 
						|
#
 | 
						|
# This acts like the main() function for the script, unless it is 'import'ed into another
 | 
						|
# script.
 | 
						|
#
 | 
						|
if __name__ == '__main__':
 | 
						|
    EdkLogger.Initialize()
 | 
						|
    EdkLogger.SetLevel(EdkLogger.DEBUG_0)
 | 
						|
 | 
						|
 | 
						|
     |