]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Workspace/MetaFileTable.py
Sync BaseTools Trunk (version r2387) to EDKII main trunk.
[mirror_edk2.git] / BaseTools / Source / Python / Workspace / MetaFileTable.py
index d8dacacd64e14d15fc2fa6ff6740cd18f03d26fc..f20eab96887829db0cab77b0aaaddeac1ef38197 100644 (file)
 ##\r
 # Import Modules\r
 #\r
+import uuid\r
+\r
 import Common.EdkLogger as EdkLogger\r
-from MetaDataTable import Table\r
+\r
+from MetaDataTable import Table, TableFile\r
 from MetaDataTable import ConvertToSqlString\r
+from CommonDataClass.DataClass import MODEL_FILE_DSC, MODEL_FILE_DEC, MODEL_FILE_INF, \\r
+                                      MODEL_FILE_OTHERS\r
 \r
-## Python class representation of table storing module data\r
-class ModuleTable(Table):\r
+class MetaFileTable(Table):\r
     # TRICK: use file ID as the part before '.'\r
+    _ID_STEP_ = 0.00000001\r
+    _ID_MAX_ = 0.99999999\r
+\r
+    ## Constructor\r
+    def __init__(self, Cursor, MetaFile, FileType, Temporary):\r
+        self.MetaFile = MetaFile\r
+\r
+        self._FileIndexTable = TableFile(Cursor)\r
+        self._FileIndexTable.Create(False)\r
+\r
+        FileId = self._FileIndexTable.GetFileId(MetaFile)\r
+        if not FileId:\r
+            FileId = self._FileIndexTable.InsertFile(MetaFile, FileType)\r
+\r
+        if Temporary:\r
+            TableName = "_%s_%s_%s" % (FileType, FileId, uuid.uuid4().hex)\r
+        else:\r
+            TableName = "_%s_%s" % (FileType, FileId)\r
+\r
+        #Table.__init__(self, Cursor, TableName, FileId, False)\r
+        Table.__init__(self, Cursor, TableName, FileId, Temporary)\r
+        self.Create(not self.IsIntegrity())\r
+\r
+    def IsIntegrity(self):\r
+        try:\r
+            Result = self.Cur.execute("select ID from %s where ID<0" % (self.Table)).fetchall()\r
+            if not Result:\r
+                return False\r
+\r
+            TimeStamp = self.MetaFile.TimeStamp\r
+            if TimeStamp != self._FileIndexTable.GetFileTimeStamp(self.IdBase):\r
+                # update the timestamp in database\r
+                self._FileIndexTable.SetFileTimeStamp(self.IdBase, TimeStamp)\r
+                return False\r
+        except Exception, Exc:\r
+            EdkLogger.debug(EdkLogger.DEBUG_5, str(Exc))\r
+            return False\r
+        return True\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
@@ -42,8 +87,8 @@ class ModuleTable(Table):
     _DUMMY_ = "-1, -1, '====', '====', '====', '====', '====', -1, -1, -1, -1, -1, -1"\r
 \r
     ## Constructor\r
-    def __init__(self, Cursor, Name='Inf', IdBase=0, Temporary=False):\r
-        Table.__init__(self, Cursor, Name, IdBase, Temporary)\r
+    def __init__(self, Cursor, MetaFile, Temporary):\r
+        MetaFileTable.__init__(self, Cursor, MetaFile, MODEL_FILE_INF, Temporary)\r
 \r
     ## Insert a record into table Inf\r
     #\r
@@ -100,9 +145,7 @@ class ModuleTable(Table):
         return self.Exec(SqlCommand)\r
 \r
 ## Python class representation of table storing package data\r
-class PackageTable(Table):\r
-    _ID_STEP_ = 0.00000001\r
-    _ID_MAX_ = 0.99999999\r
+class PackageTable(MetaFileTable):\r
     _COLUMN_ = '''\r
         ID REAL PRIMARY KEY,\r
         Model INTEGER NOT NULL,\r
@@ -122,8 +165,8 @@ class PackageTable(Table):
     _DUMMY_ = "-1, -1, '====', '====', '====', '====', '====', -1, -1, -1, -1, -1, -1"\r
 \r
     ## Constructor\r
-    def __init__(self, Cursor, Name='Dec', IdBase=0, Temporary=False):\r
-        Table.__init__(self, Cursor, Name, IdBase, Temporary)\r
+    def __init__(self, Cursor, MetaFile, Temporary):\r
+        MetaFileTable.__init__(self, Cursor, MetaFile, MODEL_FILE_DEC, Temporary)\r
 \r
     ## Insert table\r
     #\r
@@ -179,9 +222,7 @@ class PackageTable(Table):
         return self.Exec(SqlCommand)\r
 \r
 ## Python class representation of table storing platform data\r
-class PlatformTable(Table):\r
-    _ID_STEP_ = 0.00000001\r
-    _ID_MAX_ = 0.99999999\r
+class PlatformTable(MetaFileTable):\r
     _COLUMN_ = '''\r
         ID REAL PRIMARY KEY,\r
         Model INTEGER NOT NULL,\r
@@ -202,8 +243,8 @@ class PlatformTable(Table):
     _DUMMY_ = "-1, -1, '====', '====', '====', '====', '====', -1, -1, -1, -1, -1, -1, -1"\r
 \r
     ## Constructor\r
-    def __init__(self, Cursor, Name='Dsc', IdBase=0, Temporary=False):\r
-        Table.__init__(self, Cursor, Name, IdBase, Temporary)\r
+    def __init__(self, Cursor, MetaFile, Temporary):\r
+        MetaFileTable.__init__(self, Cursor, MetaFile, MODEL_FILE_DSC, Temporary)\r
 \r
     ## Insert table\r
     #\r
@@ -254,7 +295,7 @@ class PlatformTable(Table):
     # @retval:       A recordSet of all found records \r
     #\r
     def Query(self, Model, Scope1=None, Scope2=None, BelongsToItem=None, FromItem=None):\r
-        ConditionString = "Model=%s AND Enabled>=0" % Model\r
+        ConditionString = "Model=%s AND Enabled>0" % Model\r
         ValueString = "Value1,Value2,Value3,Scope1,Scope2,ID,StartLine"\r
 \r
         if Scope1 != None and Scope1 != 'COMMON':\r
@@ -273,3 +314,36 @@ class PlatformTable(Table):
         SqlCommand = "SELECT %s FROM %s WHERE %s" % (ValueString, self.Table, ConditionString)\r
         return self.Exec(SqlCommand)\r
 \r
+## Factory class to produce different storage for different type of meta-file\r
+class MetaFileStorage(object):\r
+    _FILE_TABLE_ = {\r
+        MODEL_FILE_INF      :   ModuleTable,\r
+        MODEL_FILE_DEC      :   PackageTable,\r
+        MODEL_FILE_DSC      :   PlatformTable,\r
+        MODEL_FILE_OTHERS   :   MetaFileTable,\r
+    }\r
+\r
+    _FILE_TYPE_ = {\r
+        ".inf"  : MODEL_FILE_INF,\r
+        ".dec"  : MODEL_FILE_DEC,\r
+        ".dsc"  : MODEL_FILE_DSC,\r
+    }\r
+\r
+    ## Constructor\r
+    def __new__(Class, Cursor, MetaFile, FileType=None, Temporary=False):\r
+        # no type given, try to find one\r
+        if not FileType:\r
+            if MetaFile.Type in self._FILE_TYPE_:\r
+                FileType = Class._FILE_TYPE_[MetaFile.Type]\r
+            else:\r
+                FileType = MODEL_FILE_OTHERS\r
+\r
+        # don't pass the type around if it's well known\r
+        if FileType == MODEL_FILE_OTHERS:\r
+            Args = (Cursor, MetaFile, FileType, Temporary)\r
+        else:\r
+            Args = (Cursor, MetaFile, Temporary)\r
+\r
+        # create the storage object and return it to caller\r
+        return Class._FILE_TABLE_[FileType](*Args)\r
+\r