]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Workspace/MetaFileTable.py
BaseTools: Replace the sqlite database with list
[mirror_edk2.git] / BaseTools / Source / Python / Workspace / MetaFileTable.py
index e0a0b8d923517388871eed61cde6dc12997d1c5b..081970dba8eeb4c4e904db237c3fba6ff899bc99 100644 (file)
@@ -20,55 +20,60 @@ import uuid
 import Common.EdkLogger as EdkLogger\r
 from Common.BuildToolError import FORMAT_INVALID\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
 from Common.DataType import *\r
 \r
-class MetaFileTable(Table):\r
+class MetaFileTable():\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, FromItem=None):\r
+    def __init__(self, DB, MetaFile, FileType, Temporary, FromItem=None):\r
         self.MetaFile = MetaFile\r
-\r
-        self._FileIndexTable = TableFile(Cursor)\r
-        self._FileIndexTable.Create(False)\r
-\r
-        FileId = self._FileIndexTable.GetFileId(MetaFile, FromItem)\r
-        if not FileId:\r
-            FileId = self._FileIndexTable.InsertFile(MetaFile, FileType, FromItem)\r
-\r
+        self.TableName = ""\r
+        self.DB = DB\r
+        self._NumpyTab = None\r
+        self.FileId = len(DB.TblFile)\r
+        self.ID = self.FileId\r
+        self.CurrentContent = []\r
+        DB.TblFile.append([MetaFile.Name,\r
+                        MetaFile.Ext,\r
+                        MetaFile.Dir,\r
+                        MetaFile.Path,\r
+                        FileType,\r
+                        MetaFile.TimeStamp,\r
+                        FromItem])\r
         if Temporary:\r
-            TableName = "_%s_%s_%s" % (FileType, FileId, uuid.uuid4().hex)\r
+            self.TableName = "_%s_%s_%s" % (FileType, len(DB.TblFile), 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
+            self.TableName = "_%s_%s" % (FileType, len(DB.TblFile))\r
 \r
     def IsIntegrity(self):\r
         try:\r
             TimeStamp = self.MetaFile.TimeStamp\r
-            Result = self.Cur.execute("select ID from %s where ID<0" % (self.Table)).fetchall()\r
+            Result = int(self.CurrentContent[-1][0]) < 0\r
             if not Result:\r
                 # update the timestamp in database\r
-                self._FileIndexTable.SetFileTimeStamp(self.IdBase, TimeStamp)\r
+                self.DB.SetFileTimeStamp(self.FileId, TimeStamp)\r
                 return False\r
 \r
-            if TimeStamp != self._FileIndexTable.GetFileTimeStamp(self.IdBase):\r
+            if TimeStamp != self.DB.GetFileTimeStamp(self.FileId):\r
                 # update the timestamp in database\r
-                self._FileIndexTable.SetFileTimeStamp(self.IdBase, TimeStamp)\r
+                self.DB.SetFileTimeStamp(self.FileId, TimeStamp)\r
                 return False\r
         except Exception as Exc:\r
             EdkLogger.debug(EdkLogger.DEBUG_5, str(Exc))\r
             return False\r
         return True\r
 \r
+    def SetEndFlag(self):\r
+        self.CurrentContent.append(self._DUMMY_)\r
+\r
+    def GetAll(self):\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
@@ -89,11 +94,11 @@ class ModuleTable(MetaFileTable):
         Enabled INTEGER DEFAULT 0\r
         '''\r
     # used as table end flag, in case the changes to database is not committed to db file\r
-    _DUMMY_ = "-1, -1, '====', '====', '====', '====', '====', -1, -1, -1, -1, -1, -1"\r
+    _DUMMY_ = [-1, -1, '====', '====', '====', '====', '====', -1, -1, -1, -1, -1, -1]\r
 \r
     ## Constructor\r
-    def __init__(self, Cursor, MetaFile, Temporary):\r
-        MetaFileTable.__init__(self, Cursor, MetaFile, MODEL_FILE_INF, Temporary)\r
+    def __init__(self, Db, MetaFile, Temporary):\r
+        MetaFileTable.__init__(self, Db, MetaFile, MODEL_FILE_INF, Temporary)\r
 \r
     ## Insert a record into table Inf\r
     #\r
@@ -112,22 +117,29 @@ class ModuleTable(MetaFileTable):
     #\r
     def Insert(self, Model, Value1, Value2, Value3, Scope1=TAB_ARCH_COMMON, Scope2=TAB_COMMON,\r
                BelongsToItem=-1, StartLine=-1, StartColumn=-1, EndLine=-1, EndColumn=-1, Enabled=0):\r
-        (Value1, Value2, Value3, Scope1, Scope2) = ConvertToSqlString((Value1, Value2, Value3, Scope1, Scope2))\r
-        return Table.Insert(\r
-                        self,\r
-                        Model,\r
-                        Value1,\r
-                        Value2,\r
-                        Value3,\r
-                        Scope1,\r
-                        Scope2,\r
-                        BelongsToItem,\r
-                        StartLine,\r
-                        StartColumn,\r
-                        EndLine,\r
-                        EndColumn,\r
-                        Enabled\r
-                        )\r
+\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
+                Value1,\r
+                Value2,\r
+                Value3,\r
+                Scope1,\r
+                Scope2,\r
+                BelongsToItem,\r
+                StartLine,\r
+                StartColumn,\r
+                EndLine,\r
+                EndColumn,\r
+                Enabled\r
+            ]\r
+        self.CurrentContent.append(row)\r
+        return self.ID\r
+\r
 \r
     ## Query table\r
     #\r
@@ -138,18 +150,25 @@ class ModuleTable(MetaFileTable):
     # @retval:       A recordSet of all found records\r
     #\r
     def Query(self, Model, Arch=None, Platform=None, BelongsToItem=None):\r
-        ConditionString = "Model=%s AND Enabled>=0" % Model\r
-        ValueString = "Value1,Value2,Value3,Scope1,Scope2,ID,StartLine"\r
+\r
+        QueryTab = self.CurrentContent\r
+        result = [item for item in QueryTab if item[1] == Model and item[-1]>=0 ]\r
 \r
         if Arch is not None and Arch != TAB_ARCH_COMMON:\r
-            ConditionString += " AND (Scope1='%s' OR Scope1='COMMON')" % Arch\r
+            ArchList = set(['COMMON'])\r
+            ArchList.add(Arch)\r
+            result = [item for item in result if item[5] in ArchList]\r
+\r
         if Platform is not None and Platform != TAB_COMMON:\r
-            ConditionString += " AND (Scope2='%s' OR Scope2='COMMON' OR Scope2='DEFAULT')" % Platform\r
+            Platformlist = set( ['COMMON','DEFAULT'])\r
+            Platformlist.add(Platform)\r
+            result = [item for item in result if item[6] in Platformlist]\r
+\r
         if BelongsToItem is not None:\r
-            ConditionString += " AND BelongsToItem=%s" % BelongsToItem\r
+            result = [item for item in result if item[7] == BelongsToItem]\r
 \r
-        SqlCommand = "SELECT %s FROM %s WHERE %s" % (ValueString, self.Table, ConditionString)\r
-        return self.Exec(SqlCommand)\r
+        result = [ [r[2],r[3],r[4],r[5],r[6],r[0],r[9]] for r in result ]\r
+        return result\r
 \r
 ## Python class representation of table storing package data\r
 class PackageTable(MetaFileTable):\r
@@ -169,7 +188,7 @@ class PackageTable(MetaFileTable):
         Enabled INTEGER DEFAULT 0\r
         '''\r
     # used as table end flag, in case the changes to database is not committed to db file\r
-    _DUMMY_ = "-1, -1, '====', '====', '====', '====', '====', -1, -1, -1, -1, -1, -1"\r
+    _DUMMY_ = [-1, -1, '====', '====', '====', '====', '====', -1, -1, -1, -1, -1, -1]\r
 \r
     ## Constructor\r
     def __init__(self, Cursor, MetaFile, Temporary):\r
@@ -194,22 +213,27 @@ class PackageTable(MetaFileTable):
     #\r
     def Insert(self, Model, Value1, Value2, Value3, Scope1=TAB_ARCH_COMMON, Scope2=TAB_COMMON,\r
                BelongsToItem=-1, StartLine=-1, StartColumn=-1, EndLine=-1, EndColumn=-1, Enabled=0):\r
-        (Value1, Value2, Value3, Scope1, Scope2) = ConvertToSqlString((Value1, Value2, Value3, Scope1, Scope2))\r
-        return Table.Insert(\r
-                        self,\r
-                        Model,\r
-                        Value1,\r
-                        Value2,\r
-                        Value3,\r
-                        Scope1,\r
-                        Scope2,\r
-                        BelongsToItem,\r
-                        StartLine,\r
-                        StartColumn,\r
-                        EndLine,\r
-                        EndColumn,\r
-                        Enabled\r
-                        )\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
+                Value1,\r
+                Value2,\r
+                Value3,\r
+                Scope1,\r
+                Scope2,\r
+                BelongsToItem,\r
+                StartLine,\r
+                StartColumn,\r
+                EndLine,\r
+                EndColumn,\r
+                Enabled\r
+            ]\r
+        self.CurrentContent.append(row)\r
+        return self.ID\r
 \r
     ## Query table\r
     #\r
@@ -219,23 +243,26 @@ class PackageTable(MetaFileTable):
     # @retval:       A recordSet of all found records\r
     #\r
     def Query(self, Model, Arch=None):\r
-        ConditionString = "Model=%s AND Enabled>=0" % Model\r
-        ValueString = "Value1,Value2,Value3,Scope1,Scope2,ID,StartLine"\r
+\r
+        QueryTab = self.CurrentContent\r
+        result = [item for item in QueryTab if item[1] == Model and item[-1]>=0 ]\r
 \r
         if Arch is not None and Arch != TAB_ARCH_COMMON:\r
-            ConditionString += " AND (Scope1='%s' OR Scope1='COMMON')" % Arch\r
+            ArchList = set(['COMMON'])\r
+            ArchList.add(Arch)\r
+            result = [item for item in result if item[5] in ArchList]\r
 \r
-        SqlCommand = "SELECT %s FROM %s WHERE %s" % (ValueString, self.Table, ConditionString)\r
-        return self.Exec(SqlCommand)\r
+        return [[r[2], r[3], r[4], r[5], r[6], r[0], r[8]] for r in result]\r
 \r
     def GetValidExpression(self, TokenSpaceGuid, PcdCName):\r
-        SqlCommand = "select Value1,StartLine from %s WHERE Value2='%s' and Value3='%s'" % (self.Table, TokenSpaceGuid, PcdCName)\r
-        self.Cur.execute(SqlCommand)\r
+\r
+        QueryTab = self.CurrentContent\r
+        result = [[item[2], item[8]] for item in QueryTab if item[3] == TokenSpaceGuid and item[4] == PcdCName]\r
         validateranges = []\r
         validlists = []\r
         expressions = []\r
         try:\r
-            for row in self.Cur:\r
+            for row in result:\r
                 comment = row[0]\r
 \r
                 LineNum = row[1]\r
@@ -283,7 +310,7 @@ class PlatformTable(MetaFileTable):
         Enabled INTEGER DEFAULT 0\r
         '''\r
     # used as table end flag, in case the changes to database is not committed to db file\r
-    _DUMMY_ = "-1, -1, '====', '====', '====', '====', '====','====', -1, -1, -1, -1, -1, -1, -1"\r
+    _DUMMY_ = [-1, -1, '====', '====', '====', '====', '====','====', -1, -1, -1, -1, -1, -1, -1]\r
 \r
     ## Constructor\r
     def __init__(self, Cursor, MetaFile, Temporary, FromItem=0):\r
@@ -309,24 +336,30 @@ class PlatformTable(MetaFileTable):
     #\r
     def Insert(self, Model, Value1, Value2, Value3, Scope1=TAB_ARCH_COMMON, Scope2=TAB_COMMON, Scope3=TAB_DEFAULT_STORES_DEFAULT,BelongsToItem=-1,\r
                FromItem=-1, StartLine=-1, StartColumn=-1, EndLine=-1, EndColumn=-1, Enabled=1):\r
-        (Value1, Value2, Value3, Scope1, Scope2, Scope3) = ConvertToSqlString((Value1, Value2, Value3, Scope1, Scope2, Scope3))\r
-        return Table.Insert(\r
-                        self,\r
-                        Model,\r
-                        Value1,\r
-                        Value2,\r
-                        Value3,\r
-                        Scope1,\r
-                        Scope2,\r
-                        Scope3,\r
-                        BelongsToItem,\r
-                        FromItem,\r
-                        StartLine,\r
-                        StartColumn,\r
-                        EndLine,\r
-                        EndColumn,\r
-                        Enabled\r
-                        )\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
+                Value1,\r
+                Value2,\r
+                Value3,\r
+                Scope1,\r
+                Scope2,\r
+                Scope3,\r
+                BelongsToItem,\r
+                FromItem,\r
+                StartLine,\r
+                StartColumn,\r
+                EndLine,\r
+                EndColumn,\r
+                Enabled\r
+            ]\r
+        self.CurrentContent.append(row)\r
+        return self.ID\r
+\r
 \r
     ## Query table\r
     #\r
@@ -339,30 +372,33 @@ class PlatformTable(MetaFileTable):
     # @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
-        ValueString = "Value1,Value2,Value3,Scope1,Scope2,Scope3,ID,StartLine"\r
+\r
+        QueryTab = self.CurrentContent\r
+        result = [item for item in QueryTab if item[1] == Model and item[-1]>0 ]\r
 \r
         if Scope1 is not None and Scope1 != TAB_ARCH_COMMON:\r
-            ConditionString += " AND (Scope1='%s' OR Scope1='COMMON')" % Scope1\r
-        if Scope2 is not None and Scope2 != TAB_COMMON:\r
-            # Cover the case that CodeBase is 'COMMON' for BuildOptions section\r
+            Sc1 = set(['COMMON'])\r
+            Sc1.add(Scope1)\r
+            result = [item for item in result if item[5] in Sc1]\r
+        Sc2 = set( ['COMMON','DEFAULT'])\r
+        if Scope2 and Scope2 != TAB_COMMON:\r
             if '.' in Scope2:\r
                 Index = Scope2.index('.')\r
                 NewScope = TAB_COMMON + Scope2[Index:]\r
-                ConditionString += " AND (Scope2='%s' OR Scope2='COMMON' OR Scope2='DEFAULT' OR Scope2='%s')" % (Scope2, NewScope)\r
-            else:\r
-                ConditionString += " AND (Scope2='%s' OR Scope2='COMMON' OR Scope2='DEFAULT')" % Scope2\r
+                Sc2.add(NewScope)\r
+            Sc2.add(Scope2)\r
+            result = [item for item in result if item[6] in Sc2]\r
 \r
         if BelongsToItem is not None:\r
-            ConditionString += " AND BelongsToItem=%s" % BelongsToItem\r
+            result = [item for item in result if item[8] == BelongsToItem]\r
         else:\r
-            ConditionString += " AND BelongsToItem<0"\r
-\r
+            result = [item for item in result if item[8] < 0]\r
         if FromItem is not None:\r
-            ConditionString += " AND FromItem=%s" % FromItem\r
+            result = [item for item in result if item[9] == FromItem]\r
+\r
+        result = [ [r[2],r[3],r[4],r[5],r[6],r[7],r[0],r[9]] for r in result ]\r
+        return result\r
 \r
-        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