git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8964 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			629 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			629 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| ## @file
 | |
| # This file is for installed package information database operations
 | |
| #
 | |
| # Copyright (c) 2007 ~ 2008, Intel Corporation
 | |
| # All rights reserved. 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 time
 | |
| import Common.EdkLogger as EdkLogger
 | |
| 
 | |
| from CommonDataClass import DistributionPackageClass
 | |
| 
 | |
| ## IpiDb
 | |
| #
 | |
| # This class represents the installed package information databse
 | |
| # 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 IpiDatabase(object):
 | |
|     def __init__(self, DbPath):
 | |
|         Dir = os.path.dirname(DbPath)
 | |
|         if not os.path.isdir(Dir):
 | |
|             os.mkdir(Dir)
 | |
|         self.Conn = sqlite3.connect(DbPath, isolation_level = 'DEFERRED')
 | |
|         self.Conn.execute("PRAGMA page_size=4096")
 | |
|         self.Conn.execute("PRAGMA synchronous=OFF")
 | |
|         self.Cur = self.Conn.cursor()
 | |
|         self.DpTable = 'DpInfo'
 | |
|         self.PkgTable = 'PkgInfo'
 | |
|         self.ModInPkgTable = 'ModInPkgInfo'
 | |
|         self.StandaloneModTable = 'StandaloneModInfo'
 | |
|         self.ModDepexTable = 'ModDepexInfo'
 | |
|         self.DpFileListTable = 'DpFileListInfo'
 | |
|     
 | |
|     ## Initialize build database
 | |
|     #
 | |
|     #
 | |
|     def InitDatabase(self):
 | |
|         EdkLogger.verbose("\nInitialize IPI database started ...")
 | |
|         
 | |
|         #
 | |
|         # Create new table
 | |
|         #
 | |
|         SqlCommand = """create table IF NOT EXISTS %s (DpGuid TEXT NOT NULL,
 | |
|                                                        DpVersion TEXT NOT NULL,
 | |
|                                                        InstallTime REAL NOT NULL,
 | |
|                                                        PkgFileName TEXT,
 | |
|                                                        PRIMARY KEY (DpGuid, DpVersion)
 | |
|                                                       )""" % self.DpTable
 | |
|         self.Cur.execute(SqlCommand)
 | |
|         
 | |
|         SqlCommand = """create table IF NOT EXISTS %s (FilePath TEXT NOT NULL,
 | |
|                                                        DpGuid TEXT,
 | |
|                                                        DpVersion TEXT,
 | |
|                                                        PRIMARY KEY (FilePath)
 | |
|                                                       )""" % self.DpFileListTable
 | |
|         self.Cur.execute(SqlCommand)
 | |
|         
 | |
|         SqlCommand = """create table IF NOT EXISTS %s (PackageGuid TEXT NOT NULL,
 | |
|                                                        PackageVersion TEXT NOT NULL,
 | |
|                                                        InstallTime REAL NOT NULL,
 | |
|                                                        DpGuid TEXT,
 | |
|                                                        DpVersion TEXT,
 | |
|                                                        InstallPath TEXT NOT NULL,
 | |
|                                                        PRIMARY KEY (PackageGuid, PackageVersion, InstallPath)
 | |
|                                                       )""" % self.PkgTable
 | |
|         self.Cur.execute(SqlCommand)
 | |
|         
 | |
|         SqlCommand = """create table IF NOT EXISTS %s (ModuleGuid TEXT NOT NULL,
 | |
|                                                        ModuleVersion TEXT NOT NULL,
 | |
|                                                        InstallTime REAL NOT NULL,
 | |
|                                                        PackageGuid TEXT,
 | |
|                                                        PackageVersion TEXT,
 | |
|                                                        InstallPath TEXT NOT NULL,
 | |
|                                                        PRIMARY KEY (ModuleGuid, ModuleVersion, InstallPath)
 | |
|                                                       )""" % self.ModInPkgTable
 | |
|         self.Cur.execute(SqlCommand)
 | |
|         
 | |
|         SqlCommand = """create table IF NOT EXISTS %s (ModuleGuid TEXT NOT NULL,
 | |
|                                                        ModuleVersion TEXT NOT NULL,
 | |
|                                                        InstallTime REAL NOT NULL,
 | |
|                                                        DpGuid TEXT,
 | |
|                                                        DpVersion TEXT,
 | |
|                                                        InstallPath TEXT NOT NULL,
 | |
|                                                        PRIMARY KEY (ModuleGuid, ModuleVersion, InstallPath)
 | |
|                                                       )""" % self.StandaloneModTable
 | |
|         self.Cur.execute(SqlCommand)
 | |
|         
 | |
|         SqlCommand = """create table IF NOT EXISTS %s (ModuleGuid TEXT NOT NULL,
 | |
|                                                        ModuleVersion TEXT NOT NULL,
 | |
|                                                        InstallPath TEXT NOT NULL,
 | |
|                                                        DepexGuid TEXT,
 | |
|                                                        DepexVersion TEXT
 | |
|                                                       )""" % self.ModDepexTable
 | |
|         self.Cur.execute(SqlCommand)
 | |
|         
 | |
|         self.Conn.commit()
 | |
|         
 | |
|         EdkLogger.verbose("Initialize IPI database ... DONE!")
 | |
| 
 | |
|     ## Add a distribution install information from DpObj
 | |
|     #
 | |
|     # @param DpObj:
 | |
|     #
 | |
|     def AddDPObject(self, DpObj):
 | |
|         
 | |
|         for PkgKey in DpObj.PackageSurfaceArea.keys():
 | |
|             PkgGuid = PkgKey[0]
 | |
|             PkgVersion = PkgKey[1]
 | |
|             PkgInstallPath = PkgKey[2]
 | |
|             self.AddPackage(PkgGuid, PkgVersion, DpObj.Header.Guid, DpObj.Header.Version, PkgInstallPath)
 | |
|             PkgObj = DpObj.PackageSurfaceArea[PkgKey]
 | |
|             for ModKey in PkgObj.Modules.keys():
 | |
|                 ModGuid = ModKey[0]
 | |
|                 ModVersion = ModKey[1]
 | |
|                 ModInstallPath = ModKey[2]
 | |
|                 self.AddModuleInPackage(ModGuid, ModVersion, PkgGuid, PkgVersion, ModInstallPath)
 | |
|                 ModObj = PkgObj.Modules[ModKey]
 | |
|                 for Dep in ModObj.PackageDependencies:
 | |
|                     DepexGuid = Dep.PackageGuid
 | |
|                     DepexVersion = Dep.PackageVersion
 | |
|                     self.AddModuleDepex(ModGuid, ModVersion, ModInstallPath, DepexGuid, DepexVersion)
 | |
|             for FilePath in PkgObj.FileList:
 | |
|                 self.AddDpFilePathList(DpObj.Header.Guid, DpObj.Header.Version, FilePath)
 | |
| 
 | |
|         for ModKey in DpObj.ModuleSurfaceArea.keys():
 | |
|             ModGuid = ModKey[0]
 | |
|             ModVersion = ModKey[1]
 | |
|             ModInstallPath = ModKey[2]
 | |
|             self.AddStandaloneModule(ModGuid, ModVersion, DpObj.Header.Guid, DpObj.Header.Version, ModInstallPath)
 | |
|             ModObj = DpObj.ModuleSurfaceArea[ModKey]
 | |
|             for Dep in ModObj.PackageDependencies:
 | |
|                 DepexGuid = Dep.PackageGuid
 | |
|                 DepexVersion = Dep.PackageVersion
 | |
|                 self.AddModuleDepex(ModGuid, ModVersion, ModInstallPath, DepexGuid, DepexVersion)
 | |
|             for FilePath in ModObj.FileList:
 | |
|                 self.AddDpFilePathList(DpObj.Header.Guid, DpObj.Header.Version, FilePath)
 | |
|                 
 | |
|         self.AddDp(DpObj.Header.Guid, DpObj.Header.Version, DpObj.Header.FileName)    
 | |
|     ## Add a distribution install information
 | |
|     #
 | |
|     # @param Guid:  
 | |
|     # @param Version:
 | |
|     # @param PkgFileName:
 | |
|     #
 | |
|     def AddDp(self, Guid, Version, PkgFileName = None):
 | |
|         
 | |
|         if Version == None or len(Version.strip()) == 0:
 | |
|             Version = 'N/A'
 | |
|         
 | |
|         #
 | |
|         # Add newly installed DP information to DB.
 | |
|         #
 | |
|         if PkgFileName == None or len(PkgFileName.strip()) == 0:
 | |
|             PkgFileName = 'N/A'
 | |
|         (Guid, Version, PkgFileName) = (Guid, Version, PkgFileName)
 | |
|         CurrentTime = time.time()
 | |
|         SqlCommand = """insert into %s values('%s', '%s', %s, '%s')""" % (self.DpTable, Guid, Version, CurrentTime, PkgFileName)
 | |
|         self.Cur.execute(SqlCommand)
 | |
|         self.Conn.commit()
 | |
|         
 | |
|     ## Add a file list from DP
 | |
|     #
 | |
|     # @param DpGuid:  
 | |
|     # @param DpVersion:
 | |
|     # @param Path
 | |
|     #
 | |
|     def AddDpFilePathList(self, DpGuid, DpVersion, Path):
 | |
|         
 | |
|         SqlCommand = """insert into %s values('%s', '%s', '%s')""" % (self.DpFileListTable, Path, DpGuid, DpVersion)
 | |
|         self.Cur.execute(SqlCommand)
 | |
|         self.Conn.commit()
 | |
|             
 | |
|     ## Add a package install information
 | |
|     #
 | |
|     # @param Guid:  
 | |
|     # @param Version:
 | |
|     # @param DpGuid:  
 | |
|     # @param DpVersion:
 | |
|     # @param Path
 | |
|     #
 | |
|     def AddPackage(self, Guid, Version, DpGuid = None, DpVersion = None, Path = ''):
 | |
|         
 | |
|         if Version == None or len(Version.strip()) == 0:
 | |
|             Version = 'N/A'
 | |
|         
 | |
|         if DpGuid == None or len(DpGuid.strip()) == 0:
 | |
|             DpGuid = 'N/A'
 | |
|         
 | |
|         if DpVersion == None or len(DpVersion.strip()) == 0:
 | |
|             DpVersion = 'N/A'
 | |
|         
 | |
|         #
 | |
|         # Add newly installed package information to DB.
 | |
|         #
 | |
|         
 | |
|         CurrentTime = time.time()
 | |
|         SqlCommand = """insert into %s values('%s', '%s', %s, '%s', '%s', '%s')""" % (self.PkgTable, Guid, Version, CurrentTime, DpGuid, DpVersion, Path)
 | |
|         self.Cur.execute(SqlCommand)
 | |
|         self.Conn.commit()
 | |
|         
 | |
|     ## Add a module that from a package install information
 | |
|     #
 | |
|     # @param Guid:  
 | |
|     # @param Version:
 | |
|     # @param PkgFileName:
 | |
|     #
 | |
|     def AddModuleInPackage(self, Guid, Version, PkgGuid = None, PkgVersion = None, Path = ''):
 | |
|         
 | |
|         if Version == None or len(Version.strip()) == 0:
 | |
|             Version = 'N/A'
 | |
|         
 | |
|         if PkgGuid == None or len(PkgGuid.strip()) == 0:
 | |
|             PkgGuid = 'N/A'
 | |
|         
 | |
|         if PkgVersion == None or len(PkgVersion.strip()) == 0:
 | |
|             PkgVersion = 'N/A'
 | |
|         
 | |
|         #
 | |
|         # Add module from package information to DB.
 | |
|         #
 | |
|         CurrentTime = time.time()
 | |
|         SqlCommand = """insert into %s values('%s', '%s', %s, '%s', '%s', '%s')""" % (self.ModInPkgTable, Guid, Version, CurrentTime, PkgGuid, PkgVersion, Path)
 | |
|         self.Cur.execute(SqlCommand)
 | |
|         self.Conn.commit()
 | |
|     
 | |
|     ## Add a module that is standalone install information
 | |
|     #
 | |
|     # @param Guid:  
 | |
|     # @param Version:
 | |
|     # @param PkgFileName:
 | |
|     #
 | |
|     def AddStandaloneModule(self, Guid, Version, DpGuid = None, DpVersion = None, Path = ''):
 | |
|         
 | |
|         if Version == None or len(Version.strip()) == 0:
 | |
|             Version = 'N/A'
 | |
|         
 | |
|         if DpGuid == None or len(DpGuid.strip()) == 0:
 | |
|             DpGuid = 'N/A'
 | |
|         
 | |
|         if DpVersion == None or len(DpVersion.strip()) == 0:
 | |
|             DpVersion = 'N/A'
 | |
|         
 | |
|         #
 | |
|         # Add module standalone information to DB.
 | |
|         #
 | |
|         CurrentTime = time.time()
 | |
|         SqlCommand = """insert into %s values('%s', '%s', %s, '%s', '%s', '%s')""" % (self.StandaloneModTable, Guid, Version, CurrentTime, DpGuid, DpVersion, Path)
 | |
|         self.Cur.execute(SqlCommand)
 | |
|         self.Conn.commit()
 | |
|     
 | |
|     ## Add a module depex
 | |
|     #
 | |
|     # @param Guid:  
 | |
|     # @param Version:
 | |
|     # @param DepexGuid:
 | |
|     # @param DepexVersion:
 | |
|     #
 | |
|     def AddModuleDepex(self, Guid, Version, Path, DepexGuid = None, DepexVersion = None):
 | |
|                 
 | |
|         if DepexGuid == None or len(DepexGuid.strip()) == 0:
 | |
|             DepexGuid = 'N/A'
 | |
|         
 | |
|         if DepexVersion == None or len(DepexVersion.strip()) == 0:
 | |
|             DepexVersion = 'N/A'
 | |
|         
 | |
|         #
 | |
|         # Add module depex information to DB.
 | |
|         #
 | |
|         
 | |
|         SqlCommand = """insert into %s values('%s', '%s', '%s', '%s', '%s')""" % (self.ModDepexTable, Guid, Version, Path, DepexGuid, DepexVersion)
 | |
|         self.Cur.execute(SqlCommand)
 | |
|         self.Conn.commit()
 | |
|         
 | |
|     ## Remove a distribution install information, if no version specified, remove all DPs with this Guid.
 | |
|     #
 | |
|     # @param DpObj:  
 | |
|     #
 | |
|     def RemoveDpObj(self, DpGuid, DpVersion):
 | |
|         
 | |
|         PkgList = self.GetPackageListFromDp(DpGuid, DpVersion)
 | |
|         
 | |
|         # delete from ModDepex the standalone module's dependency
 | |
|         SqlCommand = """delete from ModDepexInfo where ModDepexInfo.ModuleGuid in 
 | |
|                         (select ModuleGuid from StandaloneModInfo as B where B.DpGuid = '%s' and B.DpVersion = '%s')
 | |
|                          and ModDepexInfo.ModuleVersion in
 | |
|                         (select ModuleVersion from StandaloneModInfo as B where B.DpGuid = '%s' and B.DpVersion = '%s')
 | |
|                          and ModDepexInfo.InstallPath in
 | |
|                         (select InstallPath from StandaloneModInfo as B where B.DpGuid = '%s' and B.DpVersion = '%s') """ \
 | |
|                         %(DpGuid, DpVersion, DpGuid, DpVersion, DpGuid, DpVersion)
 | |
| 
 | |
| #        SqlCommand = """delete from %s where %s.DpGuid ='%s' and %s.DpVersion = '%s' and 
 | |
| #                        %s.ModuleGuid = %s.ModuleGuid and %s.ModuleVersion = %s.ModuleVersion and 
 | |
| #                        %s.InstallPath = %s.InstallPath""" \
 | |
| #                        % (self.ModDepexTable, self.StandaloneModTable, DpGuid, self.StandaloneModTable, DpVersion, self.ModDepexTable, self.StandaloneModTable, self.ModDepexTable, self.StandaloneModTable, self.ModDepexTable, self.StandaloneModTable)
 | |
| #        print SqlCommand
 | |
|         self.Cur.execute(SqlCommand)
 | |
|         
 | |
|         # delete from ModDepex the from pkg module's dependency
 | |
|         for Pkg in PkgList:
 | |
| #            SqlCommand = """delete from %s where %s.PackageGuid ='%s' and %s.PackageVersion = '%s' and 
 | |
| #                        %s.ModuleGuid = %s.ModuleGuid and %s.ModuleVersion = %s.ModuleVersion and 
 | |
| #                        %s.InstallPath = %s.InstallPath""" \
 | |
| #                        % (self.ModDepexTable, self.ModInPkgTable, Pkg[0], self.ModInPkgTable, Pkg[1], self.ModDepexTable, self.ModInPkgTable, self.ModDepexTable, self.ModInPkgTable, self.ModDepexTable, self.ModInPkgTable)
 | |
|             SqlCommand = """delete from ModDepexInfo where ModDepexInfo.ModuleGuid in 
 | |
|                             (select ModuleGuid from ModInPkgInfo where ModInPkgInfo.PackageGuid ='%s' and ModInPkgInfo.PackageVersion = '%s')
 | |
|                             and ModDepexInfo.ModuleVersion in
 | |
|                             (select ModuleVersion from ModInPkgInfo where ModInPkgInfo.PackageGuid ='%s' and ModInPkgInfo.PackageVersion = '%s')
 | |
|                             and ModDepexInfo.InstallPath in
 | |
|                             (select InstallPath from ModInPkgInfo where ModInPkgInfo.PackageGuid ='%s' and ModInPkgInfo.PackageVersion = '%s')""" \
 | |
|                             % (Pkg[0], Pkg[1],Pkg[0], Pkg[1],Pkg[0], Pkg[1])
 | |
|             
 | |
|             self.Cur.execute(SqlCommand)
 | |
|         
 | |
|         # delete the standalone module
 | |
|         SqlCommand = """delete from %s where DpGuid ='%s' and DpVersion = '%s'""" % (self.StandaloneModTable, DpGuid, DpVersion)
 | |
|         self.Cur.execute(SqlCommand)
 | |
|         
 | |
|         # delete the from pkg module
 | |
|         for Pkg in PkgList:
 | |
|             SqlCommand = """delete from %s where %s.PackageGuid ='%s' and %s.PackageVersion = '%s'""" \
 | |
|                         % (self.ModInPkgTable, self.ModInPkgTable, Pkg[0], self.ModInPkgTable, Pkg[1])
 | |
|             self.Cur.execute(SqlCommand)
 | |
|         
 | |
|         # delete packages
 | |
|         SqlCommand = """delete from %s where DpGuid ='%s' and DpVersion = '%s'""" % (self.PkgTable, DpGuid, DpVersion)
 | |
|         self.Cur.execute(SqlCommand)
 | |
|         
 | |
|         # delete file list from DP
 | |
|         SqlCommand = """delete from %s where DpGuid ='%s' and DpVersion = '%s'""" % (self.DpFileListTable, DpGuid, DpVersion)
 | |
|         self.Cur.execute(SqlCommand)
 | |
|             
 | |
|         # delete DP
 | |
|         SqlCommand = """delete from %s where DpGuid ='%s' and DpVersion = '%s'""" % (self.DpTable, DpGuid, DpVersion)
 | |
|         self.Cur.execute(SqlCommand)
 | |
|         
 | |
|         self.Conn.commit()
 | |
|         
 | |
|     ## Get a list of distribution install information.
 | |
|     #
 | |
|     # @param Guid:  
 | |
|     # @param Version:  
 | |
|     #
 | |
|     def GetDp(self, Guid, Version):
 | |
|         
 | |
|         if Version == None or len(Version.strip()) == 0:
 | |
|             Version = 'N/A'
 | |
|             EdkLogger.verbose("\nGetting list of DP install information started ...")
 | |
|             (DpGuid, DpVersion) = (Guid, Version)
 | |
|             SqlCommand = """select * from %s where DpGuid ='%s'""" % (self.DpTable, DpGuid)
 | |
|             self.Cur.execute(SqlCommand)
 | |
|         
 | |
|         else:
 | |
|             EdkLogger.verbose("\nGetting DP install information started ...")
 | |
|             (DpGuid, DpVersion) = (Guid, Version)
 | |
|             SqlCommand = """select * from %s where DpGuid ='%s' and DpVersion = '%s'""" % (self.DpTable, DpGuid, DpVersion)
 | |
|             self.Cur.execute(SqlCommand)
 | |
| 
 | |
|         DpList = []
 | |
|         for DpInfo in self.Cur:
 | |
|             DpGuid = DpInfo[0]
 | |
|             DpVersion = DpInfo[1]
 | |
|             InstallTime = DpInfo[2]
 | |
|             PkgFileName = DpInfo[3]
 | |
|             DpList.append((DpGuid, DpVersion, InstallTime, PkgFileName))
 | |
|         
 | |
|         EdkLogger.verbose("Getting DP install information ... DONE!")
 | |
|         return DpList
 | |
|     
 | |
|     ## Get a list of distribution install file path information.
 | |
|     #
 | |
|     # @param Guid:  
 | |
|     # @param Version:  
 | |
|     #
 | |
|     def GetDpFileList(self, Guid, Version):
 | |
|         
 | |
|         (DpGuid, DpVersion) = (Guid, Version)
 | |
|         SqlCommand = """select * from %s where DpGuid ='%s' and DpVersion = '%s'""" % (self.DpFileListTable, DpGuid, DpVersion)
 | |
|         self.Cur.execute(SqlCommand)
 | |
| 
 | |
|         PathList = []
 | |
|         for Result in self.Cur:
 | |
|             Path = Result[0]
 | |
|             PathList.append(Path)
 | |
|         
 | |
|         return PathList
 | |
|     
 | |
|     ## Get a list of package information.
 | |
|     #
 | |
|     # @param Guid:  
 | |
|     # @param Version:  
 | |
|     #
 | |
|     def GetPackage(self, Guid, Version, DpGuid = '', DpVersion = ''):
 | |
|         
 | |
|         if DpVersion == '' or DpGuid == '':
 | |
| 
 | |
|             (PackageGuid, PackageVersion) = (Guid, Version)
 | |
|             SqlCommand = """select * from %s where PackageGuid ='%s' and PackageVersion = '%s'""" % (self.PkgTable, PackageGuid, PackageVersion)
 | |
|             self.Cur.execute(SqlCommand)
 | |
|         
 | |
|         elif Version == None or len(Version.strip()) == 0:
 | |
|             
 | |
|             SqlCommand = """select * from %s where PackageGuid ='%s'""" % (self.PkgTable, Guid)
 | |
|             self.Cur.execute(SqlCommand)
 | |
|         else:
 | |
|             (PackageGuid, PackageVersion) = (Guid, Version)
 | |
|             SqlCommand = """select * from %s where PackageGuid ='%s' and PackageVersion = '%s'
 | |
|                             and DpGuid = '%s' and DpVersion = '%s'""" % (self.PkgTable, PackageGuid, PackageVersion, DpGuid, DpVersion)
 | |
|             self.Cur.execute(SqlCommand)
 | |
| 
 | |
|         PkgList = []
 | |
|         for PkgInfo in self.Cur:
 | |
|             PkgGuid = PkgInfo[0]
 | |
|             PkgVersion = PkgInfo[1]
 | |
|             InstallTime = PkgInfo[2]
 | |
|             InstallPath = PkgInfo[5]
 | |
|             PkgList.append((PkgGuid, PkgVersion, InstallTime, DpGuid, DpVersion, InstallPath))
 | |
|         
 | |
|         return PkgList
 | |
|     
 | |
|     ## Get a list of module in package information.
 | |
|     #
 | |
|     # @param Guid:  
 | |
|     # @param Version:  
 | |
|     #
 | |
|     def GetModInPackage(self, Guid, Version, PkgGuid = '', PkgVersion = ''):
 | |
|         
 | |
|         if PkgVersion == '' or PkgGuid == '':
 | |
| 
 | |
|             (ModuleGuid, ModuleVersion) = (Guid, Version)
 | |
|             SqlCommand = """select * from %s where ModuleGuid ='%s' and ModuleVersion = '%s'""" % (self.ModInPkgTable, ModuleGuid, ModuleVersion)
 | |
|             self.Cur.execute(SqlCommand)
 | |
|         
 | |
|         else:
 | |
|             (ModuleGuid, ModuleVersion) = (Guid, Version)
 | |
|             SqlCommand = """select * from %s where ModuleGuid ='%s' and ModuleVersion = '%s' and PackageGuid ='%s' and PackageVersion = '%s'
 | |
|                             """ % (self.ModInPkgTable, ModuleGuid, ModuleVersion, PkgGuid, PkgVersion)
 | |
|             self.Cur.execute(SqlCommand)
 | |
| 
 | |
|         ModList = []
 | |
|         for ModInfo in self.Cur:
 | |
|             ModGuid = ModInfo[0]
 | |
|             ModVersion = ModInfo[1]
 | |
|             InstallTime = ModInfo[2]
 | |
|             InstallPath = ModInfo[5]
 | |
|             ModList.append((ModGuid, ModVersion, InstallTime, PkgGuid, PkgVersion, InstallPath))
 | |
|         
 | |
|         return ModList
 | |
|     
 | |
|     ## Get a list of module standalone.
 | |
|     #
 | |
|     # @param Guid:  
 | |
|     # @param Version:  
 | |
|     #
 | |
|     def GetStandaloneModule(self, Guid, Version, DpGuid = '', DpVersion = ''):
 | |
|         
 | |
|         if DpGuid == '':
 | |
| 
 | |
|             (ModuleGuid, ModuleVersion) = (Guid, Version)
 | |
|             SqlCommand = """select * from %s where ModuleGuid ='%s' and ModuleVersion = '%s'""" % (self.StandaloneModTable, ModuleGuid, ModuleVersion)
 | |
|             self.Cur.execute(SqlCommand)
 | |
|         
 | |
|         else:
 | |
|             (ModuleGuid, ModuleVersion) = (Guid, Version)
 | |
|             SqlCommand = """select * from %s where ModuleGuid ='%s' and ModuleVersion = '%s' and DpGuid ='%s' and DpVersion = '%s'
 | |
|                             """ % (self.StandaloneModTable, ModuleGuid, ModuleVersion, DpGuid, DpVersion)
 | |
|             self.Cur.execute(SqlCommand)
 | |
| 
 | |
|         ModList = []
 | |
|         for ModInfo in self.Cur:
 | |
|             ModGuid = ModInfo[0]
 | |
|             ModVersion = ModInfo[1]
 | |
|             InstallTime = ModInfo[2]
 | |
|             InstallPath = ModInfo[5]
 | |
|             ModList.append((ModGuid, ModVersion, InstallTime, DpGuid, DpVersion, InstallPath))
 | |
|         
 | |
|         return ModList
 | |
|     
 | |
|     ## Get a list of module information that comes from DP.
 | |
|     #
 | |
|     # @param DpGuid:  
 | |
|     # @param DpVersion:  
 | |
|     #
 | |
|     def GetStandaloneModuleInstallPathListFromDp(self, DpGuid, DpVersion):
 | |
| 
 | |
|         PathList = []
 | |
|         SqlCommand = """select t1.InstallPath from %s t1 where t1.DpGuid ='%s' and t1.DpVersion = '%s'
 | |
|                         """ % (self.StandaloneModTable, DpGuid, DpVersion)
 | |
|         self.Cur.execute(SqlCommand)
 | |
| 
 | |
|         for Result in self.Cur:
 | |
|             InstallPath = Result[0]
 | |
|             PathList.append(InstallPath)
 | |
|         
 | |
|         return PathList
 | |
|     
 | |
|     ## Get a list of package information.
 | |
|     #
 | |
|     # @param DpGuid:  
 | |
|     # @param DpVersion:  
 | |
|     #
 | |
|     def GetPackageListFromDp(self, DpGuid, DpVersion):
 | |
|         
 | |
| 
 | |
|         SqlCommand = """select * from %s where DpGuid ='%s' and DpVersion = '%s'
 | |
|                         """ % (self.PkgTable, DpGuid, DpVersion)
 | |
|         self.Cur.execute(SqlCommand)
 | |
| 
 | |
|         PkgList = []
 | |
|         for PkgInfo in self.Cur:
 | |
|             PkgGuid = PkgInfo[0]
 | |
|             PkgVersion = PkgInfo[1]
 | |
|             InstallPath = PkgInfo[5]
 | |
|             PkgList.append((PkgGuid, PkgVersion, InstallPath))
 | |
|         
 | |
|         return PkgList
 | |
|     
 | |
|     ## Get a list of modules that depends on package information from a DP.
 | |
|     #
 | |
|     # @param DpGuid:  
 | |
|     # @param DpVersion:  
 | |
|     #
 | |
|     def GetDpDependentModuleList(self, DpGuid, DpVersion):
 | |
|         
 | |
|         ModList = []
 | |
|         PkgList = self.GetPackageListFromDp(DpGuid, DpVersion)
 | |
|         if len(PkgList) > 0:
 | |
|             return ModList
 | |
|         
 | |
|         for Pkg in PkgList:
 | |
|             SqlCommand = """select t1.ModuleGuid, t1.ModuleVersion, t1.InstallPath 
 | |
|                             from %s as t1, %s as t2, where t1.ModuleGuid = t2.ModuleGuid and 
 | |
|                             t1.ModuleVersion = t2.ModuleVersion and t2.DepexGuid ='%s' and (t2.DepexVersion = '%s' or t2.DepexVersion = 'N/A') and
 | |
|                             t1.PackageGuid != '%s' and t1.PackageVersion != '%s'
 | |
|                         """ % (self.ModInPkgTable, self.ModDepexTable, Pkg[0], Pkg[1], Pkg[0], Pkg[1])
 | |
|             self.Cur.execute(SqlCommand)
 | |
|             for ModInfo in self.Cur:
 | |
|                 ModGuid = ModInfo[0]
 | |
|                 ModVersion = ModInfo[1]
 | |
|                 InstallPath = ModInfo[2]
 | |
|                 ModList.append((ModGuid, ModVersion, InstallPath))
 | |
| 
 | |
|             SqlCommand = """select t1.ModuleGuid, t1.ModuleVersion, t1.InstallPath 
 | |
|                             from %s as t1, %s as t2, where t1.ModuleGuid = t2.ModuleGuid and 
 | |
|                             t1.ModuleVersion = t2.ModuleVersion and t2.DepexGuid ='%s' and (t2.DepexVersion = '%s' or t2.DepexVersion = 'N/A') and
 | |
|                             t1.DpGuid != '%s' and t1.DpVersion != '%s'
 | |
|                         """ % (self.StandaloneModTable, self.ModDepexTable, Pkg[0], Pkg[1], DpGuid, DpVersion)
 | |
|             self.Cur.execute(SqlCommand)
 | |
|             for ModInfo in self.Cur:
 | |
|                 ModGuid = ModInfo[0]
 | |
|                 ModVersion = ModInfo[1]
 | |
|                 InstallPath = ModInfo[2]
 | |
|                 ModList.append((ModGuid, ModVersion, InstallPath))
 | |
|         
 | |
|         
 | |
|         return ModList
 | |
|     
 | |
|     ## Get a module depex
 | |
|     #
 | |
|     # @param Guid:  
 | |
|     # @param Version:
 | |
|     # @param Path:
 | |
|     #
 | |
|     def GetModuleDepex(self, Guid, Version, Path):
 | |
|                 
 | |
|         #
 | |
|         # Get module depex information to DB.
 | |
|         #
 | |
|         
 | |
|         SqlCommand = """select * from %s where ModuleGuid ='%s' and ModuleVersion = '%s' and InstallPath ='%s'
 | |
|                             """ % (self.ModDepexTable, Guid, Version, Path)
 | |
|         self.Cur.execute(SqlCommand)
 | |
|         self.Conn.commit()
 | |
|         
 | |
|         DepexList = []
 | |
|         for DepInfo in self.Cur:
 | |
|             DepexGuid = DepInfo[3]
 | |
|             DepexVersion = DepInfo[4]
 | |
|             DepexList.append((DepexGuid, DepexVersion))
 | |
|         
 | |
|         return DepexList
 | |
|     
 | |
|     ## Close entire database
 | |
|     #
 | |
|     # Close the connection and cursor
 | |
|     #
 | |
|     def CloseDb(self):
 | |
|         
 | |
|         self.Cur.close()
 | |
|         self.Conn.close()
 | |
| 
 | |
|     ## Convert To Sql String
 | |
|     #
 | |
|     # 1. Replace "'" with "''" in each item of StringList
 | |
|     # 
 | |
|     # @param StringList:  A list for strings to be converted
 | |
|     #
 | |
|     def __ConvertToSqlString(self, StringList):
 | |
|         return map(lambda s: s.replace("'", "''") , StringList)
 | |
| ##
 | |
| #
 | |
| # 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)
 | |
|     DATABASE_PATH = "C://MyWork//Conf//.cache//XML.db"
 | |
|     Db = IpiDatabase(DATABASE_PATH)
 | |
|     Db.InitDatabase()
 | |
| 
 | |
|      |