Home | History | Annotate | Download | only in Core
      1 ## @file

      2 # This file is for installed package information database operations

      3 #

      4 # Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>

      5 #

      6 # This program and the accompanying materials are licensed and made available 

      7 # under the terms and conditions of the BSD License which accompanies this 

      8 # distribution. The full text of the license may be found at 

      9 # http://opensource.org/licenses/bsd-license.php

     10 #

     11 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,

     12 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

     13 #

     14 
     15 '''
     16 IpiDb
     17 '''
     18 
     19 ##

     20 # Import Modules

     21 #

     22 import sqlite3
     23 import os.path
     24 import time
     25 
     26 import Logger.Log as Logger
     27 from Logger import StringTable as ST
     28 from Logger.ToolError import UPT_ALREADY_RUNNING_ERROR
     29 from Logger.ToolError import UPT_DB_UPDATE_ERROR
     30 import platform as pf
     31 
     32 ## IpiDb

     33 #

     34 # This class represents the installed package information database

     35 # Add/Remove/Get installed distribution package information here.

     36 # 

     37 # 

     38 # @param object:      Inherited from object class

     39 # @param DbPath:      A string for the path of the database

     40 #

     41 #

     42 class IpiDatabase(object):
     43     def __init__(self, DbPath, Workspace):
     44         Dir = os.path.dirname(DbPath)
     45         if not os.path.isdir(Dir):
     46             os.mkdir(Dir)
     47         self.Conn = sqlite3.connect(DbPath, isolation_level='DEFERRED')
     48         self.Conn.execute("PRAGMA page_size=4096")
     49         self.Conn.execute("PRAGMA synchronous=OFF")
     50         self.Cur = self.Conn.cursor()
     51         self.DpTable = 'DpInfo'
     52         self.PkgTable = 'PkgInfo'
     53         self.ModInPkgTable = 'ModInPkgInfo'
     54         self.StandaloneModTable = 'StandaloneModInfo'
     55         self.ModDepexTable = 'ModDepexInfo'
     56         self.DpFileListTable = 'DpFileListInfo'
     57         self.DummyTable = 'Dummy'
     58         self.Workspace = os.path.normpath(Workspace)
     59 
     60     ## Initialize build database

     61     #

     62     #

     63     def InitDatabase(self, SkipLock = False):
     64         Logger.Verbose(ST.MSG_INIT_IPI_START)
     65         if not SkipLock:
     66             try:
     67                 #

     68                 # Create a dummy table, if already existed,

     69                 # then UPT is already running

     70                 #

     71                 SqlCommand = """
     72                 create table %s (
     73                 Dummy TEXT NOT NULL,
     74                 PRIMARY KEY (Dummy)                                               
     75                 )""" % self.DummyTable
     76                 self.Cur.execute(SqlCommand)
     77                 self.Conn.commit()
     78             except sqlite3.OperationalError:
     79                 Logger.Error("UPT", 
     80                              UPT_ALREADY_RUNNING_ERROR, 
     81                              ST.ERR_UPT_ALREADY_RUNNING_ERROR
     82                              )
     83         
     84         #

     85         # Create new table

     86         #

     87         SqlCommand = """
     88         create table IF NOT EXISTS %s (
     89         DpGuid TEXT NOT NULL,DpVersion TEXT NOT NULL,
     90         InstallTime REAL NOT NULL,
     91         NewPkgFileName TEXT NOT NULL,
     92         PkgFileName TEXT NOT NULL,                                               
     93         RePackage TEXT NOT NULL,
     94         PRIMARY KEY (DpGuid, DpVersion)                                               
     95         )""" % self.DpTable
     96         self.Cur.execute(SqlCommand)
     97         
     98         SqlCommand = """
     99         create table IF NOT EXISTS %s (
    100         FilePath TEXT NOT NULL,
    101         DpGuid TEXT,
    102         DpVersion TEXT,
    103         Md5Sum TEXT,
    104         PRIMARY KEY (FilePath)
    105         )""" % self.DpFileListTable
    106         self.Cur.execute(SqlCommand)
    107         
    108         SqlCommand = """
    109         create table IF NOT EXISTS %s (
    110         PackageGuid TEXT NOT NULL,
    111         PackageVersion TEXT NOT NULL,
    112         InstallTime REAL NOT NULL,
    113         DpGuid TEXT,
    114         DpVersion TEXT,
    115         InstallPath TEXT NOT NULL,
    116         PRIMARY KEY (PackageGuid, PackageVersion, InstallPath)
    117         )""" % self.PkgTable
    118         self.Cur.execute(SqlCommand)
    119                 
    120         SqlCommand = """
    121         create table IF NOT EXISTS %s (
    122         ModuleGuid TEXT NOT NULL,
    123         ModuleVersion TEXT NOT NULL,
    124         ModuleName TEXT NOT NULL,
    125         InstallTime REAL NOT NULL,
    126         PackageGuid TEXT,
    127         PackageVersion TEXT,
    128         InstallPath TEXT NOT NULL,
    129         PRIMARY KEY (ModuleGuid, ModuleVersion, ModuleName, InstallPath)
    130         )""" % self.ModInPkgTable
    131         self.Cur.execute(SqlCommand)
    132         
    133         SqlCommand = """
    134         create table IF NOT EXISTS %s (
    135         ModuleGuid TEXT NOT NULL,
    136         ModuleVersion TEXT NOT NULL,
    137         ModuleName TEXT NOT NULL,
    138         InstallTime REAL NOT NULL,
    139         DpGuid TEXT,
    140         DpVersion TEXT,
    141         InstallPath TEXT NOT NULL,
    142         PRIMARY KEY (ModuleGuid, ModuleVersion, ModuleName, InstallPath)
    143         )""" % self.StandaloneModTable
    144         self.Cur.execute(SqlCommand)
    145         
    146         SqlCommand = """
    147         create table IF NOT EXISTS %s (
    148         ModuleGuid TEXT NOT NULL,
    149         ModuleVersion TEXT NOT NULL,
    150         ModuleName TEXT NOT NULL,
    151         InstallPath TEXT NOT NULL,
    152         DepexGuid TEXT,
    153         DepexVersion TEXT
    154         )""" % self.ModDepexTable
    155         self.Cur.execute(SqlCommand)
    156         
    157         self.Conn.commit()
    158         
    159         Logger.Verbose(ST.MSG_INIT_IPI_FINISH)
    160 
    161     def RollBack(self):
    162         self.Conn.rollback()
    163 
    164     def Commit(self):
    165         self.Conn.commit()
    166 
    167     ## Add a distribution install information from DpObj

    168     #

    169     # @param DpObj:

    170     # @param NewDpPkgFileName: New DpPkg File Name

    171     # @param DpPkgFileName: DpPkg File Name

    172     # @param RePackage: A RePackage

    173     #

    174     def AddDPObject(self, DpObj, NewDpPkgFileName, DpPkgFileName, RePackage):
    175         try:
    176             for PkgKey in DpObj.PackageSurfaceArea.keys():
    177                 PkgGuid = PkgKey[0]
    178                 PkgVersion = PkgKey[1]
    179                 PkgInstallPath = PkgKey[2]
    180                 self._AddPackage(PkgGuid, PkgVersion, DpObj.Header.GetGuid(), \
    181                                  DpObj.Header.GetVersion(), PkgInstallPath)
    182                 PkgObj = DpObj.PackageSurfaceArea[PkgKey]
    183                 for ModKey in PkgObj.GetModuleDict().keys():
    184                     ModGuid = ModKey[0]
    185                     ModVersion = ModKey[1]
    186                     ModName = ModKey[2]
    187                     ModInstallPath = ModKey[3]
    188                     ModInstallPath = \
    189                     os.path.normpath(os.path.join(PkgInstallPath, ModInstallPath))
    190                     self._AddModuleInPackage(ModGuid, ModVersion, ModName, PkgGuid, \
    191                                              PkgVersion, ModInstallPath)
    192                     ModObj = PkgObj.GetModuleDict()[ModKey]
    193                     for Dep in ModObj.GetPackageDependencyList():
    194                         DepexGuid = Dep.GetGuid()
    195                         DepexVersion = Dep.GetVersion()
    196                         self._AddModuleDepex(ModGuid, ModVersion, ModName, ModInstallPath, \
    197                                              DepexGuid, DepexVersion)
    198                 for (FilePath, Md5Sum) in PkgObj.FileList:
    199                     self._AddDpFilePathList(DpObj.Header.GetGuid(), \
    200                                             DpObj.Header.GetVersion(), FilePath, \
    201                                             Md5Sum)
    202     
    203             for ModKey in DpObj.ModuleSurfaceArea.keys():
    204                 ModGuid = ModKey[0]
    205                 ModVersion = ModKey[1]
    206                 ModName = ModKey[2]
    207                 ModInstallPath = ModKey[3]
    208                 self._AddStandaloneModule(ModGuid, ModVersion, ModName, \
    209                                           DpObj.Header.GetGuid(), \
    210                                           DpObj.Header.GetVersion(), \
    211                                           ModInstallPath)
    212                 ModObj = DpObj.ModuleSurfaceArea[ModKey]
    213                 for Dep in ModObj.GetPackageDependencyList():
    214                     DepexGuid = Dep.GetGuid()
    215                     DepexVersion = Dep.GetVersion()
    216                     self._AddModuleDepex(ModGuid, ModVersion, ModName, ModInstallPath, \
    217                                          DepexGuid, DepexVersion)
    218                 for (Path, Md5Sum) in ModObj.FileList:
    219                     self._AddDpFilePathList(DpObj.Header.GetGuid(), \
    220                                             DpObj.Header.GetVersion(), \
    221                                             Path, Md5Sum)
    222     
    223             #

    224             # add tool/misc files

    225             #

    226             for (Path, Md5Sum) in DpObj.FileList:
    227                 self._AddDpFilePathList(DpObj.Header.GetGuid(), \
    228                                         DpObj.Header.GetVersion(), Path, Md5Sum)
    229                                     
    230             self._AddDp(DpObj.Header.GetGuid(), DpObj.Header.GetVersion(), \
    231                         NewDpPkgFileName, DpPkgFileName, RePackage)
    232     
    233         except sqlite3.IntegrityError, DetailMsg:
    234             Logger.Error("UPT",
    235                          UPT_DB_UPDATE_ERROR,
    236                          ST.ERR_UPT_DB_UPDATE_ERROR,
    237                          ExtraData = DetailMsg
    238                          )
    239 
    240     ## Add a distribution install information

    241     #

    242     # @param Guid         Guid of the distribution package  

    243     # @param Version      Version of the distribution package  

    244     # @param NewDpFileName the saved filename of distribution package file

    245     # @param DistributionFileName the filename of distribution package file

    246     #

    247     def _AddDp(self, Guid, Version, NewDpFileName, DistributionFileName, \
    248                RePackage):
    249         
    250         if Version == None or len(Version.strip()) == 0:
    251             Version = 'N/A'
    252         
    253         #

    254         # Add newly installed DP information to DB.

    255         #

    256         if NewDpFileName == None or len(NewDpFileName.strip()) == 0:
    257             PkgFileName = 'N/A'
    258         else:
    259             PkgFileName = NewDpFileName
    260         CurrentTime = time.time()
    261         SqlCommand = \
    262         """insert into %s values('%s', '%s', %s, '%s', '%s', '%s')""" % \
    263         (self.DpTable, Guid, Version, CurrentTime, PkgFileName, \
    264          DistributionFileName, str(RePackage).upper())
    265         self.Cur.execute(SqlCommand)
    266 
    267         
    268     ## Add a file list from DP

    269     #

    270     # @param DpGuid: A DpGuid 

    271     # @param DpVersion: A DpVersion

    272     # @param Path: A Path

    273     # @param Path: A Md5Sum

    274     #

    275     def _AddDpFilePathList(self, DpGuid, DpVersion, Path, Md5Sum):
    276         Path = os.path.normpath(Path)
    277         if pf.system() == 'Windows':
    278             if Path.startswith(self.Workspace):
    279                 Path = Path[len(self.Workspace):]
    280         else:
    281             if Path.startswith(self.Workspace + os.sep):
    282                 Path = Path[len(self.Workspace)+1:]
    283         SqlCommand = """insert into %s values('%s', '%s', '%s', '%s')""" % \
    284         (self.DpFileListTable, Path, DpGuid, DpVersion, Md5Sum)
    285 
    286         self.Cur.execute(SqlCommand)
    287             
    288     ## Add a package install information

    289     #

    290     # @param Guid: A package guid 

    291     # @param Version: A package version

    292     # @param DpGuid: A DpGuid 

    293     # @param DpVersion: A DpVersion

    294     # @param Path: A Path

    295     #

    296     def _AddPackage(self, Guid, Version, DpGuid=None, DpVersion=None, Path=''):
    297         
    298         if Version == None or len(Version.strip()) == 0:
    299             Version = 'N/A'
    300         
    301         if DpGuid == None or len(DpGuid.strip()) == 0:
    302             DpGuid = 'N/A'
    303         
    304         if DpVersion == None or len(DpVersion.strip()) == 0:
    305             DpVersion = 'N/A'
    306         
    307         #

    308         # Add newly installed package information to DB.

    309         #

    310         CurrentTime = time.time()
    311         SqlCommand = \
    312         """insert into %s values('%s', '%s', %s, '%s', '%s', '%s')""" % \
    313         (self.PkgTable, Guid, Version, CurrentTime, DpGuid, DpVersion, Path)
    314         self.Cur.execute(SqlCommand)
    315         
    316     ## Add a module that from a package install information

    317     #

    318     # @param Guid:    Module Guid 

    319     # @param Version: Module version

    320     # @param Name:    Module Name

    321     # @param PkgGuid: Package Guid

    322     # @param PkgVersion: Package version

    323     # @param Path:    Package relative path that module installs

    324     #

    325     def _AddModuleInPackage(self, Guid, Version, Name, PkgGuid=None, \
    326                             PkgVersion=None, Path=''):
    327         
    328         if Version == None or len(Version.strip()) == 0:
    329             Version = 'N/A'
    330         
    331         if PkgGuid == None or len(PkgGuid.strip()) == 0:
    332             PkgGuid = 'N/A'
    333         
    334         if PkgVersion == None or len(PkgVersion.strip()) == 0:
    335             PkgVersion = 'N/A'
    336             
    337         if os.name == 'posix':
    338             Path = Path.replace('\\', os.sep)
    339         else:
    340             Path = Path.replace('/', os.sep)
    341         
    342         #
    343         # Add module from package information to DB.
    344         #
    345         CurrentTime = time.time()
    346         SqlCommand = \
    347         """insert into %s values('%s', '%s', '%s', %s, '%s', '%s', '%s')""" % \
    348         (self.ModInPkgTable, Guid, Version, Name, CurrentTime, PkgGuid, PkgVersion, \
    349          Path)
    350         self.Cur.execute(SqlCommand)
    351     
    352     ## Add a module that is standalone install information
    353     #
    354     # @param Guid: a module Guid
    355     # @param Version: a module Version
    356     # @param Name: a module name
    357     # @param DpGuid: a DpGuid
    358     # @param DpVersion: a DpVersion
    359     # @param Path: path
    360     #
    361     def _AddStandaloneModule(self, Guid, Version, Name, DpGuid=None, \
    362                              DpVersion=None, Path=''):
    363         
    364         if Version == None or len(Version.strip()) == 0:
    365             Version = 'N/A'
    366         
    367         if DpGuid == None or len(DpGuid.strip()) == 0:
    368             DpGuid = 'N/A'
    369         
    370         if DpVersion == None or len(DpVersion.strip()) == 0:
    371             DpVersion = 'N/A'
    372         
    373         #
    374         # Add module standalone information to DB.
    375         #
    376         CurrentTime = time.time()
    377         SqlCommand = \
    378         """insert into %s values('%s', '%s', '%s', %s, '%s', '%s', '%s')""" % \
    379         (self.StandaloneModTable, Guid, Version, Name, CurrentTime, DpGuid, \
    380          DpVersion, Path)
    381         self.Cur.execute(SqlCommand)
    382     
    383     ## Add a module depex
    384     #
    385     # @param Guid: a module Guid
    386     # @param Version: a module Version
    387     # @param Name: a module name
    388     # @param DepexGuid: a module DepexGuid
    389     # @param DepexVersion: a module DepexVersion
    390     #
    391     def _AddModuleDepex(self, Guid, Version, Name, Path, DepexGuid=None, \
    392                         DepexVersion=None):
    393                 
    394         if DepexGuid == None or len(DepexGuid.strip()) == 0:
    395             DepexGuid = 'N/A'
    396         
    397         if DepexVersion == None or len(DepexVersion.strip()) == 0:
    398             DepexVersion = 'N/A'
    399             
    400         if os.name == 'posix':
    401             Path = Path.replace('\\', os.sep)
    402         else:
    403             Path = Path.replace('/', os.sep)
    404         
    405         #
    406         # Add module depex information to DB.
    407         #
    408         SqlCommand = """insert into %s values('%s', '%s', '%s', '%s', '%s', '%s')"""\
    409          % (self.ModDepexTable, Guid, Version, Name, Path, DepexGuid, DepexVersion)
    410         self.Cur.execute(SqlCommand)
    411         
    412     ## Remove a distribution install information, if no version specified, 
    413     # remove all DPs with this Guid.
    414     #
    415     # @param DpGuid: guid of dpex 
    416     # @param DpVersion: version of dpex
    417     #
    418     def RemoveDpObj(self, DpGuid, DpVersion):
    419         
    420         PkgList = self.GetPackageListFromDp(DpGuid, DpVersion)
    421         #
    422         # delete from ModDepex the standalone module's dependency
    423         #

    424         SqlCommand = \
    425         """delete from ModDepexInfo where ModDepexInfo.ModuleGuid in 
    426         (select ModuleGuid from StandaloneModInfo as B where B.DpGuid = '%s' 
    427         and B.DpVersion = '%s')
    428         and ModDepexInfo.ModuleVersion in
    429         (select ModuleVersion from StandaloneModInfo as B 
    430         where B.DpGuid = '%s' and B.DpVersion = '%s')
    431         and ModDepexInfo.ModuleName in
    432         (select ModuleName from StandaloneModInfo as B 
    433         where B.DpGuid = '%s' and B.DpVersion = '%s')
    434         and ModDepexInfo.InstallPath in
    435         (select InstallPath from StandaloneModInfo as B 
    436         where B.DpGuid = '%s' and B.DpVersion = '%s') """ % \
    437         (DpGuid, DpVersion, DpGuid, DpVersion, DpGuid, DpVersion, DpGuid, DpVersion)
    438 
    439         self.Cur.execute(SqlCommand)
    440         #

    441         # delete from ModDepex the from pkg module's dependency

    442         #

    443         for Pkg in PkgList:
    444 
    445             SqlCommand = \
    446             """delete from ModDepexInfo where ModDepexInfo.ModuleGuid in 
    447             (select ModuleGuid from ModInPkgInfo 
    448             where ModInPkgInfo.PackageGuid ='%s' and 
    449             ModInPkgInfo.PackageVersion = '%s')
    450             and ModDepexInfo.ModuleVersion in
    451             (select ModuleVersion from ModInPkgInfo 
    452             where ModInPkgInfo.PackageGuid ='%s' and 
    453             ModInPkgInfo.PackageVersion = '%s')
    454             and ModDepexInfo.ModuleName in
    455             (select ModuleName from ModInPkgInfo 
    456             where ModInPkgInfo.PackageGuid ='%s' and 
    457             ModInPkgInfo.PackageVersion = '%s')
    458             and ModDepexInfo.InstallPath in
    459             (select InstallPath from ModInPkgInfo where 
    460             ModInPkgInfo.PackageGuid ='%s' 
    461             and ModInPkgInfo.PackageVersion = '%s')""" \
    462                             % (Pkg[0], Pkg[1], Pkg[0], Pkg[1], Pkg[0], Pkg[1],Pkg[0], Pkg[1])
    463             
    464             self.Cur.execute(SqlCommand)
    465         #

    466         # delete the standalone module

    467         #

    468         SqlCommand = \
    469         """delete from %s where DpGuid ='%s' and DpVersion = '%s'""" % \
    470         (self.StandaloneModTable, DpGuid, DpVersion)
    471         self.Cur.execute(SqlCommand)
    472         #

    473         # delete the from pkg module

    474         #

    475         for Pkg in PkgList:
    476             SqlCommand = \
    477             """delete from %s where %s.PackageGuid ='%s' 
    478             and %s.PackageVersion = '%s'""" % \
    479             (self.ModInPkgTable, self.ModInPkgTable, Pkg[0], \
    480              self.ModInPkgTable, Pkg[1])
    481             self.Cur.execute(SqlCommand)
    482         #

    483         # delete packages

    484         #

    485         SqlCommand = \
    486         """delete from %s where DpGuid ='%s' and DpVersion = '%s'""" % \
    487         (self.PkgTable, DpGuid, DpVersion)
    488         self.Cur.execute(SqlCommand)
    489         #

    490         # delete file list from DP

    491         #

    492         SqlCommand = \
    493         """delete from %s where DpGuid ='%s' and DpVersion = '%s'""" % \
    494         (self.DpFileListTable, DpGuid, DpVersion)
    495         self.Cur.execute(SqlCommand)
    496         #    

    497         # delete DP

    498         #

    499         SqlCommand = \
    500         """delete from %s where DpGuid ='%s' and DpVersion = '%s'""" % \
    501         (self.DpTable, DpGuid, DpVersion)
    502         self.Cur.execute(SqlCommand)
    503         
    504         #self.Conn.commit()

    505         
    506     ## Get a list of distribution install information.

    507     #

    508     # @param Guid: distribution package guid  

    509     # @param Version: distribution package version 

    510     #

    511     def GetDp(self, Guid, Version):
    512         
    513         if Version == None or len(Version.strip()) == 0:
    514             Version = 'N/A'
    515             Logger.Verbose(ST.MSG_GET_DP_INSTALL_LIST)
    516             (DpGuid, DpVersion) = (Guid, Version)
    517             SqlCommand = """select * from %s where DpGuid ='%s'""" % \
    518             (self.DpTable, DpGuid)
    519             self.Cur.execute(SqlCommand)
    520         
    521         else:
    522             Logger.Verbose(ST.MSG_GET_DP_INSTALL_INFO_START)
    523             (DpGuid, DpVersion) = (Guid, Version)
    524             SqlCommand = \
    525             """select * from %s where DpGuid ='%s' and DpVersion = '%s'""" % \
    526             (self.DpTable, DpGuid, DpVersion)
    527             self.Cur.execute(SqlCommand)
    528 
    529         DpList = []
    530         for DpInfo in self.Cur:
    531             DpGuid = DpInfo[0]
    532             DpVersion = DpInfo[1]
    533             InstallTime = DpInfo[2]
    534             PkgFileName = DpInfo[3]
    535             DpList.append((DpGuid, DpVersion, InstallTime, PkgFileName))
    536             
    537         Logger.Verbose(ST.MSG_GET_DP_INSTALL_INFO_FINISH)    
    538         return DpList
    539     
    540     ## Get a list of distribution install dirs

    541     #

    542     # @param Guid: distribution package guid 

    543     # @param Version: distribution package version 

    544     #

    545     def GetDpInstallDirList(self, Guid, Version):
    546         SqlCommand = """select InstallPath from PkgInfo where DpGuid = '%s' and DpVersion = '%s'""" % (Guid, Version)
    547         self.Cur.execute(SqlCommand)
    548         DirList = []
    549         for Result in self.Cur:
    550             if Result[0] not in DirList:
    551                 DirList.append(Result[0])
    552 
    553         SqlCommand = """select InstallPath from StandaloneModInfo where DpGuid = '%s' and DpVersion = '%s'""" % \
    554                      (Guid, Version)
    555         self.Cur.execute(SqlCommand)
    556         for Result in self.Cur:
    557             if Result[0] not in DirList:
    558                 DirList.append(Result[0])
    559 
    560         return DirList
    561 
    562 
    563     ## Get a list of distribution install file path information.

    564     #

    565     # @param Guid: distribution package guid 

    566     # @param Version: distribution package version 

    567     #

    568     def GetDpFileList(self, Guid, Version):
    569         
    570         (DpGuid, DpVersion) = (Guid, Version)
    571         SqlCommand = \
    572         """select * from %s where DpGuid ='%s' and DpVersion = '%s'""" % \
    573         (self.DpFileListTable, DpGuid, DpVersion)
    574         self.Cur.execute(SqlCommand)
    575 
    576         PathList = []
    577         for Result in self.Cur:
    578             Path = Result[0]
    579             Md5Sum = Result[3]
    580             PathList.append((os.path.join(self.Workspace, Path), Md5Sum))
    581         
    582         return PathList
    583 
    584     ## Get files' repackage attribute if present that are installed into current workspace

    585     #

    586     # @retval FileDict:  a Dict of file, key is file path, value is (DpGuid, DpVersion, NewDpFileName, RePackage)

    587     #

    588     def GetRePkgDict(self):
    589         SqlCommand = """select * from %s """ % (self.DpTable)
    590         self.Cur.execute(SqlCommand)
    591         
    592         DpInfoList = []
    593         for Result in self.Cur:
    594             DpInfoList.append(Result)
    595 
    596         FileDict = {}        
    597         for Result in DpInfoList:
    598             DpGuid = Result[0]
    599             DpVersion = Result[1]
    600             NewDpFileName = Result[3]
    601             RePackage = Result[5]
    602             if RePackage == 'TRUE':
    603                 RePackage = True
    604             else:
    605                 RePackage = False
    606             for FileInfo in self.GetDpFileList(DpGuid, DpVersion):
    607                 PathInfo = FileInfo[0]
    608                 FileDict[PathInfo] = DpGuid, DpVersion, NewDpFileName, RePackage
    609                 
    610         return FileDict
    611     
    612     ## Get (Guid, Version) from distribution file name information.

    613     #

    614     # @param DistributionFile: Distribution File  

    615     #

    616     def GetDpByName(self, DistributionFile):
    617         SqlCommand = """select * from %s where NewPkgFileName like '%s'""" % \
    618         (self.DpTable, '%' + DistributionFile)
    619         self.Cur.execute(SqlCommand)
    620 
    621         for Result in self.Cur:
    622             DpGuid = Result[0]
    623             DpVersion = Result[1]
    624             NewDpFileName = Result[3]
    625    
    626             return (DpGuid, DpVersion, NewDpFileName)
    627         else:
    628             return (None, None, None)
    629         
    630     ## Get a list of package information.

    631     #

    632     # @param Guid: package guid  

    633     # @param Version: package version

    634     #

    635     def GetPackage(self, Guid, Version, DpGuid='', DpVersion=''):
    636         
    637         if DpVersion == '' or DpGuid == '':
    638 
    639             (PackageGuid, PackageVersion) = (Guid, Version)
    640             SqlCommand = """select * from %s where PackageGuid ='%s' 
    641             and PackageVersion = '%s'""" % (self.PkgTable, PackageGuid, \
    642                                             PackageVersion)
    643             self.Cur.execute(SqlCommand)
    644         
    645         elif Version == None or len(Version.strip()) == 0:
    646             
    647             SqlCommand = """select * from %s where PackageGuid ='%s'""" % \
    648             (self.PkgTable, Guid)
    649             self.Cur.execute(SqlCommand)
    650         else:
    651             (PackageGuid, PackageVersion) = (Guid, Version)
    652             SqlCommand = """select * from %s where PackageGuid ='%s' and 
    653             PackageVersion = '%s'
    654                             and DpGuid = '%s' and DpVersion = '%s'""" % \
    655                             (self.PkgTable, PackageGuid, PackageVersion, \
    656                              DpGuid, DpVersion)
    657             self.Cur.execute(SqlCommand)
    658 
    659         PkgList = []
    660         for PkgInfo in self.Cur:
    661             PkgGuid = PkgInfo[0]
    662             PkgVersion = PkgInfo[1]
    663             InstallTime = PkgInfo[2]
    664             InstallPath = PkgInfo[5]
    665             PkgList.append((PkgGuid, PkgVersion, InstallTime, DpGuid, \
    666                             DpVersion, InstallPath))
    667         
    668         return PkgList
    669  
    670        
    671     ## Get a list of module in package information.

    672     #

    673     # @param Guid: A module guid

    674     # @param Version: A module version

    675     #

    676     def GetModInPackage(self, Guid, Version, Name, Path, PkgGuid='', PkgVersion=''):
    677         (ModuleGuid, ModuleVersion, ModuleName, InstallPath) = (Guid, Version, Name, Path)
    678         if PkgVersion == '' or PkgGuid == '':
    679             SqlCommand = """select * from %s where ModuleGuid ='%s' and 
    680             ModuleVersion = '%s' and InstallPath = '%s' 
    681             and ModuleName = '%s'""" % (self.ModInPkgTable, ModuleGuid, \
    682                                        ModuleVersion, InstallPath, ModuleName)
    683             self.Cur.execute(SqlCommand)
    684         else:
    685             SqlCommand = """select * from %s where ModuleGuid ='%s' and 
    686             ModuleVersion = '%s' and InstallPath = '%s' 
    687             and ModuleName = '%s' and PackageGuid ='%s' 
    688             and PackageVersion = '%s'
    689                             """ % (self.ModInPkgTable, ModuleGuid, \
    690                                    ModuleVersion, InstallPath, ModuleName, PkgGuid, PkgVersion)
    691             self.Cur.execute(SqlCommand)
    692 
    693         ModList = []
    694         for ModInfo in self.Cur:
    695             ModGuid = ModInfo[0]
    696             ModVersion = ModInfo[1]
    697             InstallTime = ModInfo[2]
    698             InstallPath = ModInfo[5]
    699             ModList.append((ModGuid, ModVersion, InstallTime, PkgGuid, \
    700                             PkgVersion, InstallPath))
    701         
    702         return ModList
    703     
    704     ## Get a list of module standalone.

    705     #

    706     # @param Guid: A module guid 

    707     # @param Version: A module version 

    708     #

    709     def GetStandaloneModule(self, Guid, Version, Name, Path, DpGuid='', DpVersion=''):
    710         (ModuleGuid, ModuleVersion, ModuleName, InstallPath) = (Guid, Version, Name, Path)
    711         if DpGuid == '':
    712             SqlCommand = """select * from %s where ModuleGuid ='%s' and 
    713             ModuleVersion = '%s' and InstallPath = '%s' 
    714             and ModuleName = '%s'""" % (self.StandaloneModTable, ModuleGuid, \
    715                                        ModuleVersion, InstallPath, ModuleName)
    716             self.Cur.execute(SqlCommand)
    717         
    718         else:
    719             SqlCommand = """select * from %s where ModuleGuid ='%s' and 
    720             ModuleVersion = '%s' and InstallPath = '%s' and ModuleName = '%s' and DpGuid ='%s' and DpVersion = '%s' 
    721                             """ % (self.StandaloneModTable, ModuleGuid, \
    722                                    ModuleVersion, ModuleName, InstallPath, DpGuid, DpVersion)
    723             self.Cur.execute(SqlCommand)
    724 
    725         ModList = []
    726         for ModInfo in self.Cur:
    727             ModGuid = ModInfo[0]
    728             ModVersion = ModInfo[1]
    729             InstallTime = ModInfo[2]
    730             InstallPath = ModInfo[5]
    731             ModList.append((ModGuid, ModVersion, InstallTime, DpGuid, \
    732                             DpVersion, InstallPath))
    733         
    734         return ModList
    735     
    736     ## Get a list of module information that comes from DP.

    737     #

    738     # @param DpGuid: A Distrabution Guid 

    739     # @param DpVersion: A Distrabution version  

    740     #

    741     def GetSModInsPathListFromDp(self, DpGuid, DpVersion):
    742 
    743         PathList = []
    744         SqlCommand = """select InstallPath from %s where DpGuid ='%s' 
    745         and DpVersion = '%s'
    746                         """ % (self.StandaloneModTable, DpGuid, DpVersion)
    747         self.Cur.execute(SqlCommand)
    748 
    749         for Result in self.Cur:
    750             InstallPath = Result[0]
    751             PathList.append(InstallPath)
    752         
    753         return PathList
    754     
    755     ## Get a list of package information.

    756     #

    757     # @param DpGuid: A Distrabution Guid 

    758     # @param DpVersion: A Distrabution version 

    759     #

    760     def GetPackageListFromDp(self, DpGuid, DpVersion):
    761 
    762         SqlCommand = """select * from %s where DpGuid ='%s' and 
    763         DpVersion = '%s' """ % (self.PkgTable, DpGuid, DpVersion)
    764         self.Cur.execute(SqlCommand)
    765 
    766         PkgList = []
    767         for PkgInfo in self.Cur:
    768             PkgGuid = PkgInfo[0]
    769             PkgVersion = PkgInfo[1]
    770             InstallPath = PkgInfo[5]
    771             PkgList.append((PkgGuid, PkgVersion, InstallPath))
    772         
    773         return PkgList
    774     
    775     ## Get a list of modules that depends on package information from a DP.

    776     #

    777     # @param DpGuid: A Distrabution Guid 

    778     # @param DpVersion: A Distrabution version 

    779     #

    780     def GetDpDependentModuleList(self, DpGuid, DpVersion):
    781         
    782         ModList = []
    783         PkgList = self.GetPackageListFromDp(DpGuid, DpVersion)
    784         if len(PkgList) > 0:
    785             return ModList
    786         
    787         for Pkg in PkgList:
    788             #

    789             # get all in-package modules that depends on current 

    790             # Pkg (Guid match, Version match or NA) but not belong to 

    791             # current Pkg

    792             #

    793             SqlCommand = """select t1.ModuleGuid, t1.ModuleVersion, 
    794             t1.InstallPath from %s as t1, %s as t2 where 
    795             t1.ModuleGuid = t2.ModuleGuid and 
    796             t1.ModuleVersion = t2.ModuleVersion and t2.DepexGuid ='%s' 
    797             and (t2.DepexVersion = '%s' or t2.DepexVersion = 'N/A') and
    798             t1.PackageGuid != '%s' and t1.PackageVersion != '%s'
    799                         """ % (self.ModInPkgTable, \
    800                                self.ModDepexTable, Pkg[0], Pkg[1], Pkg[0], \
    801                                Pkg[1])
    802             self.Cur.execute(SqlCommand)
    803             for ModInfo in self.Cur:
    804                 ModGuid = ModInfo[0]
    805                 ModVersion = ModInfo[1]
    806                 InstallPath = ModInfo[2]
    807                 ModList.append((ModGuid, ModVersion, InstallPath))
    808 
    809             #

    810             # get all modules from standalone modules that depends on current 

    811             #Pkg (Guid match, Version match or NA) but not in current dp

    812             #

    813             SqlCommand = \
    814             """select t1.ModuleGuid, t1.ModuleVersion, t1.InstallPath 
    815             from %s as t1, %s as t2 where t1.ModuleGuid = t2.ModuleGuid and 
    816             t1.ModuleVersion = t2.ModuleVersion and t2.DepexGuid ='%s' 
    817             and (t2.DepexVersion = '%s' or t2.DepexVersion = 'N/A') and
    818                             t1.DpGuid != '%s' and t1.DpVersion != '%s'
    819                         """ % \
    820                         (self.StandaloneModTable, self.ModDepexTable, Pkg[0], \
    821                          Pkg[1], DpGuid, DpVersion)
    822             self.Cur.execute(SqlCommand)
    823             for ModInfo in self.Cur:
    824                 ModGuid = ModInfo[0]
    825                 ModVersion = ModInfo[1]
    826                 InstallPath = ModInfo[2]
    827                 ModList.append((ModGuid, ModVersion, InstallPath))
    828         
    829         
    830         return ModList
    831 
    832     ## Get Dp's list of modules.

    833     #

    834     # @param DpGuid: A Distrabution Guid 

    835     # @param DpVersion: A Distrabution version 

    836     #

    837     def GetDpModuleList(self, DpGuid, DpVersion):      
    838         ModList = []
    839         #

    840         # get Dp module list from the DpFileList table

    841         #

    842         SqlCommand = """select FilePath 
    843                         from %s
    844                         where DpGuid = '%s' and DpVersion = '%s' and 
    845                         FilePath like '%%.inf'
    846                     """ % (self.DpFileListTable, DpGuid, DpVersion)
    847         self.Cur.execute(SqlCommand)
    848         for ModuleInfo in self.Cur:
    849             FilePath = ModuleInfo[0]
    850             ModList.append(os.path.join(self.Workspace, FilePath))
    851             
    852         return ModList        
    853 
    854         
    855     ## Get a module depex

    856     #

    857     # @param DpGuid: A module Guid 

    858     # @param DpVersion: A module version 

    859     # @param Path:

    860     #

    861     def GetModuleDepex(self, Guid, Version, Path):
    862                 
    863         #

    864         # Get module depex information to DB.

    865         #

    866         SqlCommand = """select * from %s where ModuleGuid ='%s' and 
    867         ModuleVersion = '%s' and InstallPath ='%s'
    868                             """ % (self.ModDepexTable, Guid, Version, Path)
    869         self.Cur.execute(SqlCommand)
    870 
    871         
    872         DepexList = []
    873         for DepInfo in self.Cur:
    874             DepexGuid = DepInfo[3]
    875             DepexVersion = DepInfo[4]
    876             DepexList.append((DepexGuid, DepexVersion))
    877         
    878         return DepexList
    879  
    880     ## Inventory the distribution installed to current workspace

    881     #

    882     # Inventory the distribution installed to current workspace

    883     #   

    884     def InventoryDistInstalled(self):
    885         SqlCommand = """select * from %s """ % (self.DpTable)
    886         self.Cur.execute(SqlCommand)
    887         
    888         DpInfoList = []
    889         for Result in self.Cur:
    890             DpGuid = Result[0]
    891             DpVersion = Result[1]
    892             DpAliasName = Result[3]
    893             DpFileName = Result[4]            
    894             DpInfoList.append((DpGuid, DpVersion, DpFileName, DpAliasName))
    895         
    896         return DpInfoList     
    897 
    898     ## Close entire database

    899     #

    900     # Close the connection and cursor

    901     #

    902     def CloseDb(self):
    903         #

    904         # drop the dummy table

    905         #

    906         SqlCommand = """
    907         drop table IF EXISTS %s 
    908         """ % self.DummyTable
    909         self.Cur.execute(SqlCommand)
    910         self.Conn.commit()
    911         
    912         self.Cur.close()
    913         self.Conn.close()
    914 
    915     ## Convert To Sql String

    916     #

    917     # 1. Replace "'" with "''" in each item of StringList

    918     # 

    919     # @param StringList:  A list for strings to be converted

    920     #

    921     def __ConvertToSqlString(self, StringList):
    922         if self.DpTable:
    923             pass
    924         return map(lambda s: s.replace("'", "''") , StringList)
    925 
    926 
    927 
    928