]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Workspace/MetaFileTable.py
BaseTools: Fixed metafile parser issues
[mirror_edk2.git] / BaseTools / Source / Python / Workspace / MetaFileTable.py
index 081970dba8eeb4c4e904db237c3fba6ff899bc99..004e9494c3a0b77545d651da725525d4c6f55734 100644 (file)
@@ -26,8 +26,8 @@ from Common.DataType import *
 \r
 class MetaFileTable():\r
     # TRICK: use file ID as the part before '.'\r
-    _ID_STEP_ = 0.00000001\r
-    _ID_MAX_ = 0.99999999\r
+    _ID_STEP_ = 1\r
+    _ID_MAX_ = 99999999\r
 \r
     ## Constructor\r
     def __init__(self, DB, MetaFile, FileType, Temporary, FromItem=None):\r
@@ -35,8 +35,7 @@ class MetaFileTable():
         self.TableName = ""\r
         self.DB = DB\r
         self._NumpyTab = None\r
-        self.FileId = len(DB.TblFile)\r
-        self.ID = self.FileId\r
+\r
         self.CurrentContent = []\r
         DB.TblFile.append([MetaFile.Name,\r
                         MetaFile.Ext,\r
@@ -45,6 +44,8 @@ class MetaFileTable():
                         FileType,\r
                         MetaFile.TimeStamp,\r
                         FromItem])\r
+        self.FileId = len(DB.TblFile)\r
+        self.ID = self.FileId * 10**8\r
         if Temporary:\r
             self.TableName = "_%s_%s_%s" % (FileType, len(DB.TblFile), uuid.uuid4().hex)\r
         else:\r
@@ -53,7 +54,10 @@ class MetaFileTable():
     def IsIntegrity(self):\r
         try:\r
             TimeStamp = self.MetaFile.TimeStamp\r
-            Result = int(self.CurrentContent[-1][0]) < 0\r
+            if not self.CurrentContent:\r
+                Result = False\r
+            else:\r
+                Result = self.CurrentContent[-1][0] < 0\r
             if not Result:\r
                 # update the timestamp in database\r
                 self.DB.SetFileTimeStamp(self.FileId, TimeStamp)\r
@@ -72,12 +76,10 @@ class MetaFileTable():
         self.CurrentContent.append(self._DUMMY_)\r
 \r
     def GetAll(self):\r
-        return [item for item in self.CurrentContent if item[0] > 0 ]\r
+        return [item for item in self.CurrentContent if item[0] >= 0 ]\r
 \r
 ## Python class representation of table storing module data\r
 class ModuleTable(MetaFileTable):\r
-    _ID_STEP_ = 0.00000001\r
-    _ID_MAX_  = 0.99999999\r
     _COLUMN_ = '''\r
         ID REAL PRIMARY KEY,\r
         Model INTEGER NOT NULL,\r
@@ -140,7 +142,6 @@ class ModuleTable(MetaFileTable):
         self.CurrentContent.append(row)\r
         return self.ID\r
 \r
-\r
     ## Query table\r
     #\r
     # @param    Model:      The Model of Record\r
@@ -215,8 +216,6 @@ class PackageTable(MetaFileTable):
                BelongsToItem=-1, StartLine=-1, StartColumn=-1, EndLine=-1, EndColumn=-1, Enabled=0):\r
         (Value1, Value2, Value3, Scope1, Scope2) = (Value1.strip(), Value2.strip(), Value3.strip(), Scope1.strip(), Scope2.strip())\r
         self.ID = self.ID + self._ID_STEP_\r
-        if self.ID >= (MODEL_FILE_INF + self._ID_MAX_):\r
-            self.ID = MODEL_FILE_INF + self._ID_STEP_\r
 \r
         row = [ self.ID,\r
                 Model,\r
@@ -290,6 +289,7 @@ class PackageTable(MetaFileTable):
                             ExtraData=oricomment, File=self.MetaFile, Line=LineNum)\r
             return set(), set(), set()\r
         return set(validateranges), set(validlists), set(expressions)\r
+\r
 ## Python class representation of table storing platform data\r
 class PlatformTable(MetaFileTable):\r
     _COLUMN_ = '''\r
@@ -338,8 +338,6 @@ class PlatformTable(MetaFileTable):
                FromItem=-1, StartLine=-1, StartColumn=-1, EndLine=-1, EndColumn=-1, Enabled=1):\r
         (Value1, Value2, Value3, Scope1, Scope2, Scope3) = (Value1.strip(), Value2.strip(), Value3.strip(), Scope1.strip(), Scope2.strip(), Scope3.strip())\r
         self.ID = self.ID + self._ID_STEP_\r
-        if self.ID >= (MODEL_FILE_INF + self._ID_MAX_):\r
-            self.ID = MODEL_FILE_INF + self._ID_STEP_\r
 \r
         row = [ self.ID,\r
                 Model,\r
@@ -414,10 +412,13 @@ class MetaFileStorage(object):
         ".dec"  : MODEL_FILE_DEC,\r
         ".dsc"  : MODEL_FILE_DSC,\r
     }\r
-\r
+    _ObjectCache = {}\r
     ## Constructor\r
     def __new__(Class, Cursor, MetaFile, FileType=None, Temporary=False, FromItem=None):\r
         # no type given, try to find one\r
+        key = (MetaFile.Path, FileType,Temporary,FromItem)\r
+        if key in Class._ObjectCache:\r
+            return Class._ObjectCache[key]\r
         if not FileType:\r
             if MetaFile.Type in self._FILE_TYPE_:\r
                 FileType = Class._FILE_TYPE_[MetaFile.Type]\r
@@ -433,5 +434,8 @@ class MetaFileStorage(object):
             Args = Args + (FromItem,)\r
 \r
         # create the storage object and return it to caller\r
-        return Class._FILE_TABLE_[FileType](*Args)\r
+        reval = Class._FILE_TABLE_[FileType](*Args)\r
+        if not Temporary:\r
+            Class._ObjectCache[key] = reval\r
+        return reval\r
 \r