##\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
+ TimeStamp = self.MetaFile.TimeStamp\r
+ Result = self.Cur.execute("select ID from %s where ID<0" % (self.Table)).fetchall()\r
+ if not Result:\r
+ # update the timestamp in database\r
+ self._FileIndexTable.SetFileTimeStamp(self.IdBase, TimeStamp) \r
+ return False\r
+\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
_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
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
_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
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
_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
# @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
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