_ID_MAX_ = 0x80000000\r
_DUMMY_ = 0\r
\r
- def __init__(self, Cursor, Name='', IdBase=0, Temporary=False):\r
- self.Cur = Cursor\r
+ def __init__(self, Db, Name='', IdBase=0, Temporary=False):\r
+ self.Db = Db\r
self.Table = Name\r
self.IdBase = int(IdBase)\r
self.ID = int(IdBase)\r
self.Temporary = Temporary\r
+ self.Contents = []\r
\r
def __str__(self):\r
return self.Table\r
# Create a table\r
#\r
def Create(self, NewTable=True):\r
- if NewTable:\r
- self.Drop()\r
-\r
- if self.Temporary:\r
- SqlCommand = """create temp table IF NOT EXISTS %s (%s)""" % (self.Table, self._COLUMN_)\r
- else:\r
- SqlCommand = """create table IF NOT EXISTS %s (%s)""" % (self.Table, self._COLUMN_)\r
- EdkLogger.debug(EdkLogger.DEBUG_8, SqlCommand)\r
- self.Cur.execute(SqlCommand)\r
+ self.Db.CreateEmptyTable(self.Table)\r
self.ID = self.GetId()\r
\r
## Insert table\r
self.ID = self.ID + self._ID_STEP_\r
if self.ID >= (self.IdBase + self._ID_MAX_):\r
self.ID = self.IdBase + self._ID_STEP_\r
- Values = ", ".join(str(Arg) for Arg in Args)\r
- SqlCommand = "insert into %s values(%s, %s)" % (self.Table, self.ID, Values)\r
- EdkLogger.debug(EdkLogger.DEBUG_5, SqlCommand)\r
- self.Cur.execute(SqlCommand)\r
- return self.ID\r
+ row = [self.ID]\r
+ row.extend(Args)\r
+ self.Contents.append(row)\r
\r
- ## Query table\r
- #\r
- # Query all records of the table\r
- #\r
- def Query(self):\r
- SqlCommand = """select * from %s""" % self.Table\r
- self.Cur.execute(SqlCommand)\r
- for Rs in self.Cur:\r
- EdkLogger.verbose(str(Rs))\r
- TotalCount = self.GetId()\r
+ return self.ID\r
\r
- ## Drop a table\r
- #\r
- # Drop the table\r
- #\r
- def Drop(self):\r
- SqlCommand = """drop table IF EXISTS %s""" % self.Table\r
- self.Cur.execute(SqlCommand)\r
\r
## Get count\r
#\r
# @retval Count: Total count of all records\r
#\r
def GetCount(self):\r
- SqlCommand = """select count(ID) from %s""" % self.Table\r
- Record = self.Cur.execute(SqlCommand).fetchall()\r
- return Record[0][0]\r
+ tab = self.Db.GetTable(self.Table)\r
+ return len(tab)\r
+\r
\r
def GetId(self):\r
- SqlCommand = """select max(ID) from %s""" % self.Table\r
- Record = self.Cur.execute(SqlCommand).fetchall()\r
- Id = Record[0][0]\r
+ tab = self.Db.GetTable(self.Table)\r
+ Id = max([int(item[0]) for item in tab])\r
if Id is None:\r
Id = self.IdBase\r
return Id\r
#\r
def Exec(self, SqlCommand):\r
EdkLogger.debug(EdkLogger.DEBUG_5, SqlCommand)\r
- self.Cur.execute(SqlCommand)\r
- RecordSet = self.Cur.fetchall()\r
+ self.Db.execute(SqlCommand)\r
+ RecordSet = self.Db.fetchall()\r
return RecordSet\r
\r
def SetEndFlag(self):\r
- self.Exec("insert into %s values(%s)" % (self.Table, self._DUMMY_))\r
- #\r
- # Need to execution commit for table data changed.\r
- #\r
- self.Cur.connection.commit()\r
+ Tab = self.Db.GetTable(self.Table)\r
+ Tab.append(self._DUMMY_)\r
+\r
\r
def IsIntegral(self):\r
- Result = self.Exec("select min(ID) from %s" % (self.Table))\r
- if Result[0][0] != -1:\r
+ tab = self.Db.GetTable(self.Table)\r
+ Id = min([int(item[0]) for item in tab])\r
+ if Id != -1:\r
return False\r
return True\r
\r
def GetAll(self):\r
- return self.Exec("select * from %s where ID > 0 order by ID" % (self.Table))\r
+ tab = self.Db.GetTable(self.Table)\r
+ return tab\r
+\r
\r
## TableFile\r
#\r
File.TimeStamp\r
)\r
\r
- ## Get ID of a given file\r
- #\r
- # @param FilePath Path of file\r
- #\r
- # @retval ID ID value of given file in the table\r
- #\r
- def GetFileId(self, File, FromItem=None):\r
- if FromItem:\r
- QueryScript = "select ID from %s where FullPath = '%s' and FromItem = %s" % (self.Table, str(File), str(FromItem))\r
- else:\r
- QueryScript = "select ID from %s where FullPath = '%s'" % (self.Table, str(File))\r
- RecordList = self.Exec(QueryScript)\r
- if len(RecordList) == 0:\r
- return None\r
- return RecordList[0][0]\r
-\r
## Get type of a given file\r
#\r
# @param FileId ID of a file\r
def GetCrossIndex(self, ModelName):\r
CrossIndex = -1\r
SqlCommand = """select CrossIndex from DataModel where name = '""" + ModelName + """'"""\r
- self.Cur.execute(SqlCommand)\r
- for Item in self.Cur:\r
+ self.Db.execute(SqlCommand)\r
+ for Item in self.Db:\r
CrossIndex = Item[0]\r
\r
return CrossIndex\r
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
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
#\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
# @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
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
#\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
# @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
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
#\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
# @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
# Import Modules\r
#\r
from __future__ import absolute_import\r
-import sqlite3\r
from Common.StringUtils import *\r
from Common.DataType import *\r
from Common.Misc import *\r
FilePath,\r
FileType,\r
Arch,\r
- MetaFileStorage(self.WorkspaceDb.Cur, FilePath, FileType)\r
+ MetaFileStorage(self.WorkspaceDb, FilePath, FileType)\r
)\r
# alwasy do post-process, in case of macros change\r
MetaFile.DoPostProcess()\r
# @param GlobalMacros Global macros used for replacement during file parsing\r
# @prarm RenewDb=False Create new database file if it's already there\r
#\r
- def __init__(self, DbPath, RenewDb=False):\r
- self._DbClosedFlag = False\r
- if not DbPath:\r
- DbPath = os.path.normpath(mws.join(GlobalData.gWorkspace, 'Conf', GlobalData.gDatabasePath))\r
-\r
- # don't create necessary path for db in memory\r
- if DbPath != ':memory:':\r
- DbDir = os.path.split(DbPath)[0]\r
- if not os.path.exists(DbDir):\r
- os.makedirs(DbDir)\r
-\r
- # remove db file in case inconsistency between db and file in file system\r
- if self._CheckWhetherDbNeedRenew(RenewDb, DbPath):\r
- os.remove(DbPath)\r
-\r
- # create db with optimized parameters\r
- self.Conn = sqlite3.connect(DbPath, isolation_level='DEFERRED')\r
- self.Conn.execute("PRAGMA synchronous=OFF")\r
- self.Conn.execute("PRAGMA temp_store=MEMORY")\r
- self.Conn.execute("PRAGMA count_changes=OFF")\r
- self.Conn.execute("PRAGMA cache_size=8192")\r
- #self.Conn.execute("PRAGMA page_size=8192")\r
-\r
- # to avoid non-ascii character conversion issue\r
- self.Conn.text_factory = str\r
- self.Cur = self.Conn.cursor()\r
-\r
+ def __init__(self):\r
+ self.DB = dict()\r
# create table for internal uses\r
- self.TblDataModel = TableDataModel(self.Cur)\r
- self.TblFile = TableFile(self.Cur)\r
+ self.TblDataModel = DataClass.MODEL_LIST\r
+ self.TblFile = []\r
self.Platform = None\r
\r
# conversion object for build or file format conversion purpose\r
self.BuildObject = WorkspaceDatabase.BuildObjectFactory(self)\r
self.TransformObject = WorkspaceDatabase.TransformObjectFactory(self)\r
\r
- ## Check whether workspace database need to be renew.\r
- # The renew reason maybe:\r
- # 1) If user force to renew;\r
- # 2) If user do not force renew, and\r
- # a) If the time of last modified python source is newer than database file;\r
- # b) If the time of last modified frozen executable file is newer than database file;\r
- #\r
- # @param force User force renew database\r
- # @param DbPath The absolute path of workspace database file\r
- #\r
- # @return Bool value for whether need renew workspace databse\r
- #\r
- def _CheckWhetherDbNeedRenew (self, force, DbPath):\r
- # if database does not exist, we need do nothing\r
- if not os.path.exists(DbPath): return False\r
-\r
- # if user force to renew database, then not check whether database is out of date\r
- if force: return True\r
-\r
- #\r
- # Check the time of last modified source file or build.exe\r
- # if is newer than time of database, then database need to be re-created.\r
- #\r
- timeOfToolModified = 0\r
- if hasattr(sys, "frozen"):\r
- exePath = os.path.abspath(sys.executable)\r
- timeOfToolModified = os.stat(exePath).st_mtime\r
- else:\r
- curPath = os.path.dirname(__file__) # curPath is the path of WorkspaceDatabase.py\r
- rootPath = os.path.split(curPath)[0] # rootPath is root path of python source, such as /BaseTools/Source/Python\r
- if rootPath == "" or rootPath is None:\r
- EdkLogger.verbose("\nFail to find the root path of build.exe or python sources, so can not \\r
-determine whether database file is out of date!\n")\r
-\r
- # walk the root path of source or build's binary to get the time last modified.\r
-\r
- for root, dirs, files in os.walk (rootPath):\r
- for dir in dirs:\r
- # bypass source control folder\r
- if dir.lower() in [".svn", "_svn", "cvs"]:\r
- dirs.remove(dir)\r
+ def SetFileTimeStamp(self,FileId,TimeStamp):\r
+ self.TblFile[FileId][6] = TimeStamp\r
\r
- for file in files:\r
- ext = os.path.splitext(file)[1]\r
- if ext.lower() == ".py": # only check .py files\r
- fd = os.stat(os.path.join(root, file))\r
- if timeOfToolModified < fd.st_mtime:\r
- timeOfToolModified = fd.st_mtime\r
- if timeOfToolModified > os.stat(DbPath).st_mtime:\r
- EdkLogger.verbose("\nWorkspace database is out of data!")\r
- return True\r
+ def GetFileTimeStamp(self,FileId):\r
+ return self.TblFile[FileId][6]\r
\r
- return False\r
-\r
- ## Initialize build database\r
- def InitDatabase(self):\r
- EdkLogger.verbose("\nInitialize build database started ...")\r
-\r
- #\r
- # Create new tables\r
- #\r
- self.TblDataModel.Create(False)\r
- self.TblFile.Create(False)\r
-\r
- #\r
- # Initialize table DataModel\r
- #\r
- self.TblDataModel.InitTable()\r
- EdkLogger.verbose("Initialize build database ... DONE!")\r
-\r
- ## Query a table\r
- #\r
- # @param Table: The instance of the table to be queried\r
- #\r
- def QueryTable(self, Table):\r
- Table.Query()\r
-\r
- def __del__(self):\r
- self.Close()\r
-\r
- ## Close entire database\r
- #\r
- # Commit all first\r
- # Close the connection and cursor\r
- #\r
- def Close(self):\r
- if not self._DbClosedFlag:\r
- self.Conn.commit()\r
- self.Cur.close()\r
- self.Conn.close()\r
- self._DbClosedFlag = True\r
\r
## Summarize all packages in the database\r
def GetPackageList(self, Platform, Arch, TargetName, ToolChainTag):\r
## Summarize all platforms in the database\r
def PlatformList(self):\r
RetVal = []\r
- for PlatformFile in self.TblFile.GetFileList(MODEL_FILE_DSC):\r
+ for PlatformFile in [item[3] for item in self.TblFile if item[5] == MODEL_FILE_DSC]:\r
try:\r
RetVal.append(self.BuildObject[PathClass(PlatformFile), TAB_COMMON])\r
except:\r