1. Add a table to handle dsc data
authorhche10x <hche10x@7335b38e-4728-0410-8992-fb3ffe349368>
Tue, 22 Jan 2008 07:59:24 +0000 (07:59 +0000)
committerhche10x <hche10x@7335b38e-4728-0410-8992-fb3ffe349368>
Tue, 22 Jan 2008 07:59:24 +0000 (07:59 +0000)
2. Adjust structure of DataClass
3. Modify all table's insert sql command
4. Commit all database value to file after database closed
5. Add some new interfaces in String.py

git-svn-id: https://buildtools.tianocore.org/svn/buildtools/trunk/BaseTools@967 7335b38e-4728-0410-8992-fb3ffe349368

12 files changed:
Source/Python/Common/DataType.py
Source/Python/Common/Database.py [new file with mode: 0644]
Source/Python/Common/String.py
Source/Python/CommonDataClass/DataClass.py
Source/Python/Ecc/Database.py
Source/Python/Table/Table.py
Source/Python/Table/TableDataModel.py
Source/Python/Table/TableDsc.py
Source/Python/Table/TableFile.py
Source/Python/Table/TableFunction.py
Source/Python/Table/TableIdentifier.py
Source/Python/Table/TablePcd.py

index be86b08..4d2f7d4 100644 (file)
@@ -339,3 +339,13 @@ TAB_ELSE_IF = '!elseif'
 TAB_ELSE = '!else'\r
 TAB_IF_DEF = '!ifdef'\r
 TAB_IF_N_DEF = '!ifndef'\r
+\r
+#\r
+# Unknown section\r
+#\r
+TAB_UNKNOWN = 'UNKNOWN'\r
+\r
+#\r
+# Build database path\r
+#\r
+DATABASE_PATH = "BuildDatabase.db"\r
diff --git a/Source/Python/Common/Database.py b/Source/Python/Common/Database.py
new file mode 100644 (file)
index 0000000..d2aded8
--- /dev/null
@@ -0,0 +1,110 @@
+## @file\r
+# This file is used to create a database used by ECC tool\r
+#\r
+# Copyright (c) 2007, Intel Corporation\r
+# All rights reserved. This program and the accompanying materials\r
+# are licensed and made available under the terms and conditions of the BSD License\r
+# which accompanies this distribution.  The full text of the license may be found at\r
+# http://opensource.org/licenses/bsd-license.php\r
+#\r
+# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+\r
+##\r
+# Import Modules\r
+#\r
+import sqlite3\r
+import os\r
+\r
+import EdkLogger as EdkLogger\r
+from CommonDataClass.DataClass import *\r
+from String import *\r
+from DataType import *\r
+\r
+from Table.TableDataModel import TableDataModel\r
+from Table.TableDsc import TableDsc\r
+from Table.TableFile import TableFile\r
+\r
+## Database\r
+#\r
+# This class defined the build databse\r
+# During the phase of initialization, the database will create all tables and\r
+# insert all records of table DataModel\r
+# \r
+# @param object:      Inherited from object class\r
+# @param DbPath:      A string for the path of the ECC database\r
+#\r
+# @var Conn:          Connection of the ECC database\r
+# @var Cur:           Cursor of the connection\r
+# @var TblDataModel:  Local instance for TableDataModel\r
+#\r
+class Database(object):\r
+    def __init__(self, DbPath):\r
+        self.Conn = sqlite3.connect(DbPath)\r
+        self.Cur = self.Conn.cursor()\r
+        self.TblDataModel = TableDataModel(self.Cur)\r
+        self.TblDsc = TableDsc(self.Cur)\r
+        self.TblFile = TableFile(self.Cur)\r
+    \r
+    ## Initialize build database\r
+    #\r
+    # 1. Delete all old existing tables\r
+    # 2. Create new tables\r
+    # 3. Initialize table DataModel\r
+    #\r
+    def InitDatabase(self):\r
+        EdkLogger.verbose("\nInitialize ECC database started ...")\r
+        #\r
+        # Drop all old existing tables\r
+        #\r
+        self.TblDataModel.Drop()\r
+        self.TblDsc.Drop()\r
+        self.TblFile.Drop()\r
+        \r
+        #\r
+        # Create new tables\r
+        #\r
+        self.TblDataModel.Create()\r
+        self.TblDsc.Create()\r
+        self.TblFile.Create()\r
+        \r
+        #\r
+        # Initialize table DataModel\r
+        #\r
+        self.TblDataModel.InitTable()\r
+        EdkLogger.verbose("Initialize ECC 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
+    ## Close entire database\r
+    #\r
+    # Commit all first \r
+    # Close the connection and cursor\r
+    #\r
+    def Close(self):\r
+        self.Conn.commit()\r
+        self.Cur.close()\r
+        self.Conn.close()\r
+\r
+##\r
+#\r
+# This acts like the main() function for the script, unless it is 'import'ed into another\r
+# script.\r
+#\r
+if __name__ == '__main__':\r
+    EdkLogger.Initialize()\r
+    EdkLogger.SetLevel(EdkLogger.DEBUG_0)\r
+    \r
+    Db = Database(DATABASE_PATH)\r
+    Db.InitDatabase()\r
+    Db.QueryTable(Db.TblDataModel)   \r
+    Db.QueryTable(Db.TblFile)\r
+    Db.QueryTable(Db.TblDsc)\r
+    Db.Close()\r
+    
\ No newline at end of file
index db12144..e46d460 100644 (file)
@@ -688,11 +688,13 @@ def GetLineNo(FileContent, Line):
 # @param File:     File which has the string\r
 # @param Format:   Correct format\r
 #\r
-def RaiseParserError(Line, Section, File, Format):\r
-    LineNo = GetLineNo(open(os.path.normpath(File), 'r').read(), Line)\r
+def RaiseParserError(Line, Section, File, Format = '', LineNo = -1):\r
+    if LineNo == -1:\r
+        LineNo = GetLineNo(open(os.path.normpath(File), 'r').read(), Line)\r
     ErrorMsg = "Invalid statement '%s' is found in section '%s'" % (Line, Section)\r
-    EdkLogger.error("Parser", PARSER_ERROR, ErrorMsg, File=File, Line=LineNo,\r
-                    ExtraData="Correct format is " + Format)\r
+    if Format != '':\r
+        Format = "Correct format is " + Format\r
+    EdkLogger.error("Parser", PARSER_ERROR, ErrorMsg, File=File, Line=LineNo, ExtraData=Format)\r
 \r
 ## WorkspaceFile\r
 #\r
@@ -706,6 +708,22 @@ def RaiseParserError(Line, Section, File, Format):
 def WorkspaceFile(WorkspaceDir, Filename):\r
     return os.path.join(NormPath(WorkspaceDir), NormPath(Filename))\r
 \r
+## Split string\r
+#\r
+# Revmove '"' which startswith and endswith string\r
+#\r
+# @param String:  The string need to be splited \r
+#\r
+# @retval String: The string after removed '""'\r
+#\r
+def SplitString(String):\r
+    if String.startswith('\"'):\r
+        String = String[1:]\r
+    if String.endswith('\"'):\r
+        String = String[:-1]\r
+        \r
+    return String\r
+\r
 ##\r
 #\r
 # This acts like the main() function for the script, unless it is 'import'ed into another\r
index c850865..40e30b0 100644 (file)
@@ -26,7 +26,8 @@ MODEL_FILE_ASM = 1003
 MODEL_FILE_INF = 1011\r
 MODEL_FILE_DEC = 1012\r
 MODEL_FILE_DSC = 1013\r
-MODEL_FILE_DSC = 1014\r
+MODEL_FILE_FDF = 1014\r
+MODEL_FILE_INC = 1015\r
 \r
 MODEL_IDENTIFIER_FILE_HEADER = 2001\r
 MODEL_IDENTIFIER_FUNCTION_HEADER = 2002\r
@@ -55,12 +56,20 @@ MODEL_EFI_LIBRARY_INSTANCE = 3005
 MODEL_EFI_PCD = 3006\r
 MODEL_EFI_SOURCE_FILE = 3007\r
 MODEL_EFI_BINARY_FILE = 3008\r
+MODEL_EFI_SKU_ID = 3009\r
 \r
+MODEL_PCD = 4000\r
 MODEL_PCD_FIXED_AT_BUILD = 4001\r
 MODEL_PCD_PATCHABLE_IN_MODULE = 4002\r
 MODEL_PCD_FEATURE_FLAG = 4003\r
 MODEL_PCD_DYNAMIC_EX = 4004\r
-MODEL_PCD_DYNAMIC = 4005\r
+MODEL_PCD_DYNAMIC_EX_DEFAULT = 4005\r
+MODEL_PCD_DYNAMIC_EX_VPD = 4006\r
+MODEL_PCD_DYNAMIC_EX_HII = 4007\r
+MODEL_PCD_DYNAMIC = 4008\r
+MODEL_PCD_DYNAMIC_DEFAULT = 4009\r
+MODEL_PCD_DYNAMIC_VPD = 4010\r
+MODEL_PCD_DYNAMIC_HII = 4011\r
 \r
 MODEL_META_DATA_HEADER = 5001\r
 MODEL_META_DATA_INCLUDE = 5002\r
@@ -71,6 +80,7 @@ MODEL_META_DATA_CONDITIONAL_STATEMENT_IFDEF = 5006
 MODEL_META_DATA_CONDITIONAL_STATEMENT_IFNDEF = 5007\r
 MODEL_META_DATA_BUILD_OPTION = 5008\r
 MODEL_META_DATA_COMPONENT = 5009\r
+MODEL_META_DATA_USER_EXTENSION = 5010\r
 \r
 MODEL_LIST = [('MODEL_UNKNOWN', MODEL_UNKNOWN),\r
               ('MODEL_FILE_C', MODEL_FILE_C),\r
@@ -79,7 +89,8 @@ MODEL_LIST = [('MODEL_UNKNOWN', MODEL_UNKNOWN),
               ('MODEL_FILE_INF', MODEL_FILE_INF),\r
               ('MODEL_FILE_DEC', MODEL_FILE_DEC),\r
               ('MODEL_FILE_DSC', MODEL_FILE_DSC),\r
-              ('MODEL_FILE_DSC', MODEL_FILE_DSC),\r
+              ('MODEL_FILE_FDF', MODEL_FILE_FDF),\r
+              ('MODEL_FILE_INC', MODEL_FILE_INC),\r
               ('MODEL_IDENTIFIER_FILE_HEADER', MODEL_IDENTIFIER_FILE_HEADER),\r
               ('MODEL_IDENTIFIER_FUNCTION_HEADER', MODEL_IDENTIFIER_FUNCTION_HEADER),\r
               ('MODEL_IDENTIFIER_COMMENT', MODEL_IDENTIFIER_COMMENT),\r
@@ -96,20 +107,30 @@ MODEL_LIST = [('MODEL_UNKNOWN', MODEL_UNKNOWN),
               ('MODEL_IDENTIFIER_MACRO_DEFINE', MODEL_IDENTIFIER_MACRO_DEFINE),\r
               ('MODEL_IDENTIFIER_MACRO_ENDIF', MODEL_IDENTIFIER_MACRO_ENDIF),\r
               ('MODEL_IDENTIFIER_MACRO_PROGMA', MODEL_IDENTIFIER_MACRO_PROGMA),\r
+              ('MODEL_IDENTIFIER_FUNCTION_CALLING', MODEL_IDENTIFIER_FUNCTION_CALLING),\r
+              ('MODEL_IDENTIFIER_TYPEDEF', MODEL_IDENTIFIER_TYPEDEF),\r
               ('MODEL_EFI_PROTOCOL', MODEL_EFI_PROTOCOL),\r
               ('MODEL_EFI_PPI', MODEL_EFI_PPI),\r
               ('MODEL_EFI_GUID', MODEL_EFI_GUID),\r
               ('MODEL_EFI_LIBRARY_CLASS', MODEL_EFI_LIBRARY_CLASS),\r
               ('MODEL_EFI_LIBRARY_INSTANCE', MODEL_EFI_LIBRARY_INSTANCE),\r
               ('MODEL_EFI_PCD', MODEL_EFI_PCD),\r
+              ('MODEL_EFI_SKU_ID', MODEL_EFI_SKU_ID),\r
               ('MODEL_IDENTIFIER_UNION', MODEL_IDENTIFIER_UNION),\r
               ('MODEL_EFI_SOURCE_FILE', MODEL_EFI_SOURCE_FILE),\r
               ('MODEL_EFI_BINARY_FILE', MODEL_EFI_BINARY_FILE),\r
+              ('MODEL_PCD', MODEL_PCD),\r
               ('MODEL_PCD_FIXED_AT_BUILD', MODEL_PCD_FIXED_AT_BUILD),\r
               ('MODEL_PCD_PATCHABLE_IN_MODULE', MODEL_PCD_PATCHABLE_IN_MODULE),\r
               ('MODEL_PCD_FEATURE_FLAG', MODEL_PCD_FEATURE_FLAG),\r
               ('MODEL_PCD_DYNAMIC_EX', MODEL_PCD_DYNAMIC_EX),\r
+              ('MODEL_PCD_DYNAMIC_EX_DEFAULT', MODEL_PCD_DYNAMIC_EX_DEFAULT),\r
+              ('MODEL_PCD_DYNAMIC_EX_VPD', MODEL_PCD_DYNAMIC_EX_VPD),\r
+              ('MODEL_PCD_DYNAMIC_EX_HII', MODEL_PCD_DYNAMIC_EX_HII),\r
               ('MODEL_PCD_DYNAMIC', MODEL_PCD_DYNAMIC),\r
+              ('MODEL_PCD_DYNAMIC_DEFAULT', MODEL_PCD_DYNAMIC_DEFAULT),\r
+              ('MODEL_PCD_DYNAMIC_VPD', MODEL_PCD_DYNAMIC_VPD),\r
+              ('MODEL_PCD_DYNAMIC_HII', MODEL_PCD_DYNAMIC_HII),\r
               ("MODEL_META_DATA_HEADER", MODEL_META_DATA_HEADER),\r
               ("MODEL_META_DATA_INCLUDE", MODEL_META_DATA_INCLUDE),\r
               ("MODEL_META_DATA_DEFINE", MODEL_META_DATA_DEFINE),\r
@@ -118,7 +139,8 @@ MODEL_LIST = [('MODEL_UNKNOWN', MODEL_UNKNOWN),
               ("MODEL_META_DATA_CONDITIONAL_STATEMENT_IFDEF", MODEL_META_DATA_CONDITIONAL_STATEMENT_IFDEF),\r
               ("MODEL_META_DATA_CONDITIONAL_STATEMENT_IFNDEF", MODEL_META_DATA_CONDITIONAL_STATEMENT_IFNDEF),\r
               ("MODEL_META_DATA_BUILD_OPTION", MODEL_META_DATA_BUILD_OPTION),\r
-              ("MODEL_META_DATA_COMPONENT", MODEL_META_DATA_COMPONENT)\r
+              ("MODEL_META_DATA_COMPONENT", MODEL_META_DATA_COMPONENT),\r
+              ('MODEL_META_DATA_USER_EXTENSION', MODEL_META_DATA_USER_EXTENSION)\r
              ]\r
 \r
 ## FunctionClass\r
index f92c3cd..c5d2529 100644 (file)
@@ -93,6 +93,16 @@ class Database(object):
     def QueryTable(self, Table):\r
         Table.Query()\r
     \r
+    ## Close entire database\r
+    #\r
+    # Commit all first\r
+    # Close the connection and cursor\r
+    #\r
+    def Close(self):\r
+        self.Conn.commit()\r
+        self.Cur.close()\r
+        self.Conn.close()\r
+    \r
     ## Insert one file information\r
     #\r
     # Insert one file's information to the database\r
@@ -207,6 +217,7 @@ class Database(object):
 # script.\r
 #\r
 if __name__ == '__main__':\r
+    EdkLogger.Initialize()\r
     EdkLogger.SetLevel(EdkLogger.DEBUG_0)\r
     \r
     Db = Database(DATABASE_PATH)\r
@@ -226,4 +237,6 @@ if __name__ == '__main__':
     Db.QueryTable(Db.TblFunction)\r
     Db.QueryTable(Db.TblPcd)\r
     Db.QueryTable(Db.TblIdentifier)\r
+    \r
+    Db.Close()\r
     
\ No newline at end of file
index a305d84..8a586b7 100644 (file)
@@ -81,4 +81,17 @@ class Table(object):
         self.Cur.execute(SqlCommand)\r
         for Item in self.Cur:\r
             return Item[0]\r
-\r
+    \r
+    ## Generate ID\r
+    #\r
+    # Generate an ID if input ID is -1\r
+    #\r
+    # @param ID:   Input ID \r
+    #\r
+    # @retval ID:  New generated ID\r
+    #\r
+    def GenerateID(self, ID):\r
+        if ID == -1:\r
+            ID = self.GetCount() + 1\r
+        \r
+        return ID
\ No newline at end of file
index 7e684aa..3ba5f19 100644 (file)
@@ -57,6 +57,7 @@ class TableDataModel(Table):
     # @param Description:  Description of a ModelType\r
     #\r
     def Insert(self, ID, CrossIndex, Name, Description):\r
+        ID = self.GenerateID(ID)\r
         SqlCommand = """insert into %s values(%s, %s, '%s', '%s')""" % (self.Table, ID, CrossIndex, Name, Description)\r
         Table.Insert(self, SqlCommand)\r
     \r
index 334f22f..cc1b9c8 100644 (file)
@@ -81,6 +81,7 @@ class TableDsc(Table):
     # @param EndColumn:      EndColumn of a Dsc item\r
     #\r
     def Insert(self, ID, Model, Value1, Value2, Value3, Arch, BelongsToItem, BelongsToFile, StartLine, StartColumn, EndLine, EndColumn):\r
+        ID = self.GenerateID(ID)\r
         SqlCommand = """insert into %s values(%s, %s, '%s', '%s', '%s', '%s', %s, %s, %s, %s, %s, %s)""" \\r
                      % (self.Table, ID, Model, Value1, Value2, Value3, Arch, BelongsToItem, BelongsToFile, StartLine, StartColumn, EndLine, EndColumn)\r
         Table.Insert(self, SqlCommand)\r
index ca76d26..4018146 100644 (file)
@@ -64,6 +64,7 @@ class TableFile(Table):
     # @param TimeStamp: TimeStamp of a File\r
     #\r
     def Insert(self, ID, Name, ExtName, Path, FullPath, Model, TimeStamp):\r
+        ID = self.GenerateID(ID)\r
         SqlCommand = """insert into %s values(%s, '%s', '%s', '%s', '%s', %s, '%s')""" \\r
                                            % (self.Table, ID, Name, ExtName, Path, FullPath, Model, TimeStamp)\r
         Table.Insert(self, SqlCommand)\r
index 1fcaea5..de0f5cf 100644 (file)
@@ -79,6 +79,7 @@ class TableFunction(Table):
     # @param BelongsToFile:    The Function belongs to which file\r
     #\r
     def Insert(self, ID, Header, Modifier, Name, ReturnStatement, StartLine, StartColumn, EndLine, EndColumn, BodyStartLine, BodyStartColumn, BelongsToFile):\r
+        ID = self.GenerateID(ID)\r
         SqlCommand = """insert into %s values(%s, '%s', '%s', '%s', '%s', %s, %s, %s, %s, %s, %s, %s)""" \\r
                                     % (self.Table, ID, Header, Modifier, Name, ReturnStatement, StartLine, StartColumn, EndLine, EndColumn, BodyStartLine, BodyStartColumn, BelongsToFile)\r
         Table.Insert(self, SqlCommand)\r
index e2f83b5..fa46be7 100644 (file)
@@ -80,6 +80,7 @@ class TableIdentifier(Table):
     # @param EndColumn:          EndColumn of a Identifier\r
     #\r
     def Insert(self, ID, Modifier, Type, Name, Value, Model, BelongsToFile, BelongsToFunction, StartLine, StartColumn, EndLine, EndColumn):\r
+        ID = self.GenerateID(ID)    \r
         SqlCommand = """insert into %s values(%s, '%s', '%s', '%s', '%s', %s, %s, %s, %s, %s, %s, %s)""" \\r
                                            % (self.Table, ID, Modifier, Type, Name, Value, Model, BelongsToFile, BelongsToFunction, StartLine, StartColumn, EndLine, EndColumn)\r
         Table.Insert(self, SqlCommand)\r
index 918d2ea..57c6da7 100644 (file)
@@ -80,6 +80,7 @@ class TablePcd(Table):
     # @param EndColumn:            EndColumn of a Pcd\r
     #\r
     def Insert(self, ID, CName, TokenSpaceGuidCName, Token, DatumType, Model, BelongsToFile, BelongsToFunction, StartLine, StartColumn, EndLine, EndColumn):\r
+        ID = self.GenerateID(ID)\r
         SqlCommand = """insert into %s values(%s, '%s', '%s', %s, '%s', %s, %s, %s, %s, %s, %s, %s)""" \\r
                                            % (self.Table, ID, CName, TokenSpaceGuidCName, Token, DatumType, Model, BelongsToFile, BelongsToFunction, StartLine, StartColumn, EndLine, EndColumn)\r
         Table.Insert(self, SqlCommand)\r