diff --git a/BaseTools/Source/Python/Workspace/MetaDataTable.py b/BaseTools/Source/Python/Workspace/MetaDataTable.py index e37a10c82f..bd751eadfb 100644 --- a/BaseTools/Source/Python/Workspace/MetaDataTable.py +++ b/BaseTools/Source/Python/Workspace/MetaDataTable.py @@ -168,7 +168,8 @@ class TableFile(Table): Path VARCHAR, FullPath VARCHAR NOT NULL, Model INTEGER DEFAULT 0, - TimeStamp SINGLE NOT NULL + TimeStamp SINGLE NOT NULL, + FromItem REAL NOT NULL ''' def __init__(self, Cursor): Table.__init__(self, Cursor, 'File') @@ -184,7 +185,7 @@ class TableFile(Table): # @param Model: Model of a File # @param TimeStamp: TimeStamp of a File # - def Insert(self, Name, ExtName, Path, FullPath, Model, TimeStamp): + def Insert(self, Name, ExtName, Path, FullPath, Model, TimeStamp, FromItem=0): (Name, ExtName, Path, FullPath) = ConvertToSqlString((Name, ExtName, Path, FullPath)) return Table.Insert( self, @@ -193,7 +194,8 @@ class TableFile(Table): Path, FullPath, Model, - TimeStamp + TimeStamp, + FromItem ) ## InsertFile @@ -205,7 +207,17 @@ class TableFile(Table): # # @retval FileID: The ID after record is inserted # - def InsertFile(self, File, Model): + def InsertFile(self, File, Model, FromItem=''): + if FromItem: + return self.Insert( + File.Name, + File.Ext, + File.Dir, + File.Path, + Model, + File.TimeStamp, + FromItem + ) return self.Insert( File.Name, File.Ext, @@ -221,8 +233,11 @@ class TableFile(Table): # # @retval ID ID value of given file in the table # - def GetFileId(self, File): - QueryScript = "select ID from %s where FullPath = '%s'" % (self.Table, str(File)) + def GetFileId(self, File, FromItem=None): + if FromItem: + QueryScript = "select ID from %s where FullPath = '%s' and FromItem = %s" % (self.Table, str(File), str(FromItem)) + else: + QueryScript = "select ID from %s where FullPath = '%s'" % (self.Table, str(File)) RecordList = self.Exec(QueryScript) if len(RecordList) == 0: return None diff --git a/BaseTools/Source/Python/Workspace/MetaFileParser.py b/BaseTools/Source/Python/Workspace/MetaFileParser.py index f089758fe6..f35778d18a 100644 --- a/BaseTools/Source/Python/Workspace/MetaFileParser.py +++ b/BaseTools/Source/Python/Workspace/MetaFileParser.py @@ -886,7 +886,7 @@ class DscParser(MetaFileParser): # def __init__(self, FilePath, FileType, Arch, Table, Owner= -1, From= -1): # prevent re-initialization - if hasattr(self, "_Table"): + if hasattr(self, "_Table") and self._Table is Table: return MetaFileParser.__init__(self, FilePath, FileType, Arch, Table, Owner, From) self._Version = 0x00010005 # Only EDK2 dsc file is supported @@ -1557,12 +1557,12 @@ class DscParser(MetaFileParser): self._FileWithError = IncludedFile1 - IncludedFileTable = MetaFileStorage(self._Table.Cur, IncludedFile1, MODEL_FILE_DSC, False) FromItem = self._Content[self._ContentIndex - 1][0] if self._InSubsection: Owner = self._Content[self._ContentIndex - 1][8] else: Owner = self._Content[self._ContentIndex - 1][0] + IncludedFileTable = MetaFileStorage(self._Table.Cur, IncludedFile1, MODEL_FILE_DSC, False, FromItem=FromItem) Parser = DscParser(IncludedFile1, self._FileType, self._Arch, IncludedFileTable, Owner=Owner, From=FromItem) diff --git a/BaseTools/Source/Python/Workspace/MetaFileTable.py b/BaseTools/Source/Python/Workspace/MetaFileTable.py index 69b2c40e7f..f528c1ee66 100644 --- a/BaseTools/Source/Python/Workspace/MetaFileTable.py +++ b/BaseTools/Source/Python/Workspace/MetaFileTable.py @@ -31,15 +31,15 @@ class MetaFileTable(Table): _ID_MAX_ = 0.99999999 ## Constructor - def __init__(self, Cursor, MetaFile, FileType, Temporary): + def __init__(self, Cursor, MetaFile, FileType, Temporary, FromItem=None): self.MetaFile = MetaFile self._FileIndexTable = TableFile(Cursor) self._FileIndexTable.Create(False) - FileId = self._FileIndexTable.GetFileId(MetaFile) + FileId = self._FileIndexTable.GetFileId(MetaFile, FromItem) if not FileId: - FileId = self._FileIndexTable.InsertFile(MetaFile, FileType) + FileId = self._FileIndexTable.InsertFile(MetaFile, FileType, FromItem) if Temporary: TableName = "_%s_%s_%s" % (FileType, FileId, uuid.uuid4().hex) @@ -285,8 +285,8 @@ class PlatformTable(MetaFileTable): _DUMMY_ = "-1, -1, '====', '====', '====', '====', '====','====', -1, -1, -1, -1, -1, -1, -1" ## Constructor - def __init__(self, Cursor, MetaFile, Temporary): - MetaFileTable.__init__(self, Cursor, MetaFile, MODEL_FILE_DSC, Temporary) + def __init__(self, Cursor, MetaFile, Temporary, FromItem=0): + MetaFileTable.__init__(self, Cursor, MetaFile, MODEL_FILE_DSC, Temporary, FromItem) ## Insert table # @@ -379,7 +379,7 @@ class MetaFileStorage(object): } ## Constructor - def __new__(Class, Cursor, MetaFile, FileType=None, Temporary=False): + def __new__(Class, Cursor, MetaFile, FileType=None, Temporary=False, FromItem=None): # no type given, try to find one if not FileType: if MetaFile.Type in self._FILE_TYPE_: @@ -392,6 +392,8 @@ class MetaFileStorage(object): Args = (Cursor, MetaFile, FileType, Temporary) else: Args = (Cursor, MetaFile, Temporary) + if FromItem: + Args = Args + (FromItem,) # create the storage object and return it to caller return Class._FILE_TABLE_[FileType](*Args)