1. Add some interfaces for ECC tool in DEC/INF/DSC parser
authorhche10x <hche10x@7335b38e-4728-0410-8992-fb3ffe349368>
Tue, 11 Mar 2008 09:12:56 +0000 (09:12 +0000)
committerhche10x <hche10x@7335b38e-4728-0410-8992-fb3ffe349368>
Tue, 11 Mar 2008 09:12:56 +0000 (09:12 +0000)
2. Fix some bugs in TableReport

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

Source/Python/Common/Database.py
Source/Python/Common/DecClassObject.py
Source/Python/Common/DscClassObject.py
Source/Python/Common/InfClassObject.py
Source/Python/Ecc/Database.py
Source/Python/Ecc/Ecc.py
Source/Python/Ecc/EccToolError.py
Source/Python/Table/TableReport.py

index d26896b..263122e 100644 (file)
@@ -1,7 +1,7 @@
 ## @file\r
 # This file is used to create a database used by ECC tool\r
 #\r
-# Copyright (c) 2007, Intel Corporation\r
+# Copyright (c) 2007 ~ 2008, 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
@@ -23,7 +23,6 @@ from String import *
 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
index f4ff414..78280ba 100644 (file)
@@ -376,7 +376,12 @@ class Dec(DecObject):
         for Arch in self.SupArchList:\r
             for Record in RecordSet:\r
                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
-                    MergeArches(Lists, GetGuidsProtocolsPpisOfDec(Record[0], Type, ContainerFile, Record[2]), Arch)\r
+                    (Name, Value) = GetGuidsProtocolsPpisOfDec(Record[0], Type, ContainerFile, Record[2])\r
+                    MergeArches(Lists, (Name, Value), Arch)\r
+                    if self.IsToDatabase:\r
+                        SqlCommand = """update %s set Value1 = '%s', Value2 = '%s'\r
+                                        where ID = %s""" % (self.TblDec.Table, ConvertToSqlString2(Name), ConvertToSqlString2(Value), Record[3])\r
+                        self.TblDec.Exec(SqlCommand)\r
         \r
         ListMember = None\r
         if Type == TAB_GUIDS:\r
@@ -421,6 +426,11 @@ class Dec(DecObject):
                     else:\r
                         CheckFileExist(self.Identification.FileRelativePath, List[1], ContainerFile, 'LibraryClasses', Record[0])\r
                     MergeArches(LibraryClasses, (List[0], List[1]), Arch)\r
+                    if self.IsToDatabase:\r
+                        SqlCommand = """update %s set Value1 = '%s', Value2 = '%s', Value3 = '%s'\r
+                                        where ID = %s""" % (self.TblDec.Table, ConvertToSqlString2(List[0]), ConvertToSqlString2(List[1]), SUP_MODULE_LIST_STRING, Record[3])\r
+                        self.TblDec.Exec(SqlCommand)\r
+\r
         \r
         for Key in LibraryClasses.keys():\r
             LibraryClass = LibraryClassClass()\r
@@ -525,10 +535,10 @@ if __name__ == '__main__':
     W = os.getenv('WORKSPACE')\r
     F = os.path.join(W, 'Nt32Pkg/Nt32Pkg.dec')\r
 \r
-    Db = Database.Database(DATABASE_PATH)\r
+    Db = Database.Database('Dec.db')\r
     Db.InitDatabase()\r
     \r
-    P = Dec(os.path.normpath(F), False, True, W, Db)\r
+    P = Dec(os.path.normpath(F), True, True, W, Db)\r
     P.ShowPackage()\r
     \r
     Db.Close()\r
index 0da225b..769677c 100755 (executable)
@@ -1379,7 +1379,7 @@ if __name__ == '__main__':
     W = os.getenv('WORKSPACE')\r
     F = os.path.join(W, 'Nt32Pkg/Nt32Pkg.dsc')\r
     \r
-    Db = Database.Database(DATABASE_PATH)\r
+    Db = Database.Database('Dsc.db')\r
     Db.InitDatabase()\r
     \r
     P = Dsc(os.path.normpath(F), True, True, W, Db)\r
index b82122a..a47ea18 100755 (executable)
@@ -657,9 +657,10 @@ class Inf(InfObject):
                     #\r
                     # Update to Database\r
                     #\r
-                    #SqlCommand = """update %s set Value1 = '%s', Value2 = '%s', Value3 = '%s'\r
-                    #                where ID = %s""" % (self.TblInf.Table, ConvertToSqlString2(Family), ConvertToSqlString2(ToolChain), ConvertToSqlString2(Flag), Record[3])\r
-                    #self.TblInf.Exec(SqlCommand)\r
+                    if self.IsToDatabase:\r
+                        SqlCommand = """update %s set Value1 = '%s', Value2 = '%s', Value3 = '%s'\r
+                                        where ID = %s""" % (self.TblInf.Table, ConvertToSqlString2(Family), ConvertToSqlString2(ToolChain), ConvertToSqlString2(Flag), Record[3])\r
+                        self.TblInf.Exec(SqlCommand)\r
 \r
         for Key in BuildOptions.keys():\r
             BuildOption = BuildOptionClass(Key[0], Key[1], Key[2])\r
@@ -751,9 +752,10 @@ class Inf(InfObject):
                     #\r
                     # Update to Database\r
                     #\r
-                    #SqlCommand = """update %s set Value1 = '%s', Value2 = '%s', Value3 = '%s'\r
-                    #                where ID = %s""" % (self.TblInf.Table, ConvertToSqlString2(LibClassName), ConvertToSqlString2(LibClassIns), ConvertToSqlString2(SupModelList), Record[3])\r
-                    #self.TblInf.Exec(SqlCommand)\r
+                    if self.IsToDatabase:\r
+                        SqlCommand = """update %s set Value1 = '%s', Value2 = '%s', Value3 = '%s'\r
+                                        where ID = %s""" % (self.TblInf.Table, ConvertToSqlString2(LibClassName), ConvertToSqlString2(LibClassIns), ConvertToSqlString2(SupModelList), Record[3])\r
+                        self.TblInf.Exec(SqlCommand)\r
         \r
         for Key in LibraryClasses.keys():\r
             KeyList = Key[0].split(DataType.TAB_VALUE_SPLIT)\r
@@ -786,7 +788,13 @@ class Inf(InfObject):
         for Arch in self.SupArchList:\r
             for Record in RecordSet:\r
                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
-                    MergeArches(Packages, GetPackage(Record[0], ContainerFile, self.WorkspaceDir, Record[2]), Arch)\r
+                    (Package, Pcd) = GetPackage(Record[0], ContainerFile, self.WorkspaceDir, Record[2])\r
+                    MergeArches(Packages, (Package, Pcd), Arch)\r
+                    if self.IsToDatabase:\r
+                        SqlCommand = """update %s set Value1 = '%s', Value2 = '%s'\r
+                                        where ID = %s""" % (self.TblInf.Table, ConvertToSqlString2(Package), ConvertToSqlString2(Pcd), Record[3])\r
+                        self.TblInf.Exec(SqlCommand)\r
+\r
                     \r
         for Key in Packages.keys():\r
             Package = ModulePackageDependencyClass()\r
@@ -924,7 +932,12 @@ class Inf(InfObject):
         for Arch in self.SupArchList:\r
             for Record in RecordSet:\r
                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
-                    MergeArches(Sources, GetSource(Record[0], ContainerFile, self.Identification.FileRelativePath, Record[2]), Arch)\r
+                    (Filename, Family, TagName, ToolCode, Pcd) = GetSource(Record[0], ContainerFile, self.Identification.FileRelativePath, Record[2])\r
+                    MergeArches(Sources, (Filename, Family, TagName, ToolCode, Pcd), Arch)\r
+                    if self.IsToDatabase:\r
+                        SqlCommand = """update %s set Value1 = '%s', Value2 = '%s', Value3 = '%s', Value4 = '%s', Value5 = '%s'\r
+                                        where ID = %s""" % (self.TblInf.Table, ConvertToSqlString2(Filename), ConvertToSqlString2(Family), ConvertToSqlString2(TagName), ConvertToSqlString2(ToolCode), ConvertToSqlString2(Pcd), Record[3])\r
+                        self.TblInf.Exec(SqlCommand)\r
 \r
         for Key in Sources.keys():\r
             Source = ModuleSourceFileClass(Key[0], Key[2], Key[3], Key[1], Key[4], Sources[Key])\r
@@ -1005,7 +1018,12 @@ class Inf(InfObject):
         for Arch in self.SupArchList:\r
             for Record in RecordSet:\r
                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
-                    MergeArches(Binaries, GetBinary(Record[0], ContainerFile, self.Identification.FileRelativePath, Record[2]), Arch)\r
+                    (FileType, Filename, Target, Pcd) = GetBinary(Record[0], ContainerFile, self.Identification.FileRelativePath, Record[2])\r
+                    MergeArches(Binaries, (FileType, Filename, Target, Pcd), Arch)\r
+                    if self.IsToDatabase:\r
+                        SqlCommand = """update %s set Value1 = '%s', Value2 = '%s', Value3 = '%s', Value4 = '%s'\r
+                                        where ID = %s""" % (self.TblInf.Table, ConvertToSqlString2(FileType), ConvertToSqlString2(Filename), ConvertToSqlString2(Target), ConvertToSqlString2(Pcd), Record[3])\r
+                        self.TblInf.Exec(SqlCommand)\r
 \r
         for Key in Binaries.keys():\r
             Binary = ModuleBinaryFileClass(NormPath(Key[1]), Key[0], Key[2], Key[3], Binaries[Key])\r
@@ -1032,7 +1050,12 @@ class Inf(InfObject):
         for Arch in self.SupArchList:\r
             for Record in RecordSet:\r
                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
-                    MergeArches(Lists, GetGuidsProtocolsPpisOfInf(Record[0], Type, ContainerFile, Record[2]), Arch)\r
+                    (Name, Value) = GetGuidsProtocolsPpisOfInf(Record[0], Type, ContainerFile, Record[2])\r
+                    MergeArches(Lists, (Name, Value), Arch)\r
+                    if self.IsToDatabase:\r
+                        SqlCommand = """update %s set Value1 = '%s', Value2 = '%s'\r
+                                        where ID = %s""" % (self.TblInf.Table, ConvertToSqlString2(Name), ConvertToSqlString2(Value), Record[3])\r
+                        self.TblInf.Exec(SqlCommand)\r
         \r
         ListMember = None\r
         if Type == TAB_GUIDS:\r
@@ -1061,10 +1084,10 @@ if __name__ == '__main__':
     W = os.getenv('WORKSPACE')\r
     F = os.path.join(W, 'MdeModulePkg/Application/HelloWorld/HelloWorld.inf')\r
     \r
-    Db = Database.Database(DATABASE_PATH)\r
+    Db = Database.Database('Inf.db')\r
     Db.InitDatabase()\r
     \r
-    P = Inf(os.path.normpath(F), False, True, W, Db)\r
+    P = Inf(os.path.normpath(F), True, True, W, Db)\r
     P.ShowModule()\r
     \r
     Db.Close()\r
index ab3b78d..b91c821 100644 (file)
@@ -25,6 +25,7 @@ from Table.TableFile import TableFile
 from Table.TableFunction import TableFunction\r
 from Table.TablePcd import TablePcd\r
 from Table.TableIdentifier import TableIdentifier\r
+from Table.TableReport import TableReport\r
 \r
 ##\r
 # Static definitions\r
@@ -57,6 +58,7 @@ class Database(object):
         self.TblFunction = TableFunction(self.Cur)\r
         self.TblIdentifier = TableIdentifier(self.Cur)\r
         self.TblPcd = TablePcd(self.Cur)\r
+        self.TblReport = TableReport(self.Cur)\r
     \r
     ## Initialize ECC database\r
     #\r
@@ -82,6 +84,7 @@ class Database(object):
         self.TblFile.Create()\r
         self.TblFunction.Create()\r
         self.TblPcd.Create()\r
+        self.TblReport.Create()\r
         #self.TblIdentifier.Create()\r
         \r
         #\r
index 723afff..044c782 100644 (file)
@@ -86,6 +86,7 @@ class Ecc(object):
         EccGlobalData.gDb.InitDatabase()\r
         #c.CollectSourceCodeDataIntoDB(EccGlobalData.gTarget)\r
         EdkLogger.quiet("Parsing target done!")\r
+        #EccGlobalData.gDb.TblReport.ToCSV()\r
 \r
     ##\r
     #\r
index fe99aa2..eeebcc5 100644 (file)
@@ -42,8 +42,10 @@ ERROR_C_FUNCTION_LAYOUT_CHECK_NO_INIT_OF_VARIABLE = 5007
 ERROR_C_FUNCTION_LAYOUT_CHECK_NO_STATIC = 5008\r
 \r
 ERROR_INCLUDE_FILE_CHECK_ALL = 6000\r
-ERROR_INCLUDE_FILE_CHECK_IFNDEF_STATEMENT = 6001\r
-ERROR_INCLUDE_FILE_CHECK_DATA = 6002\r
+ERROR_INCLUDE_FILE_CHECK_IFNDEF_STATEMENT_1 = 6001\r
+ERROR_INCLUDE_FILE_CHECK_IFNDEF_STATEMENT_2 = 6002\r
+ERROR_INCLUDE_FILE_CHECK_IFNDEF_STATEMENT_3 = 6003\r
+ERROR_INCLUDE_FILE_CHECK_DATA = 6004\r
 \r
 ERROR_DECLARATION_DATA_TYPE_CHECK_ALL = 7000\r
 ERROR_DECLARATION_DATA_TYPE_CHECK_NO_USE_C_TYPE = 7001\r
@@ -71,92 +73,97 @@ ERROR_DOXYGEN_CHECK_COMMAND = 9005
 \r
 ERROR_META_DATA_FILE_CHECK_ALL = 10000\r
 ERROR_META_DATA_FILE_CHECK_PATH_NAME = 10001\r
-ERROR_META_DATA_FILE_CHECK_LIBRARY_INSTANCE = 10002\r
-ERROR_META_DATA_FILE_CHECK_LIBRARY_INSTANCE_DEPENDENT = 10003\r
-ERROR_META_DATA_FILE_CHECK_LIBRARY_INSTANCE_ORDER = 10004\r
-ERROR_META_DATA_FILE_CHECK_LIBRARY_NO_USE = 10005\r
-ERROR_META_DATA_FILE_CHECK_BINARY_INF_IN_FDF = 10006\r
-ERROR_META_DATA_FILE_CHECK_PCD_DUPLICATE = 10007\r
-ERROR_META_DATA_FILE_CHECK_PCD_FLASH = 10008\r
-ERROR_META_DATA_FILE_CHECK_PCD_NO_USE = 10009\r
-ERROR_META_DATA_FILE_CHECK_DUPLICATE_GUID = 10010\r
-ERROR_META_DATA_FILE_CHECK_DUPLICATE_PROTOCOL = 10011\r
-ERROR_META_DATA_FILE_CHECK_DUPLICATE_PPI = 10012\r
+ERROR_META_DATA_FILE_CHECK_LIBRARY_INSTANCE_1 = 10002\r
+ERROR_META_DATA_FILE_CHECK_LIBRARY_INSTANCE_2 = 10003\r
+ERROR_META_DATA_FILE_CHECK_LIBRARY_INSTANCE_DEPENDENT = 10004\r
+ERROR_META_DATA_FILE_CHECK_LIBRARY_INSTANCE_ORDER = 10005\r
+ERROR_META_DATA_FILE_CHECK_LIBRARY_NO_USE = 10006\r
+ERROR_META_DATA_FILE_CHECK_BINARY_INF_IN_FDF = 10007\r
+ERROR_META_DATA_FILE_CHECK_PCD_DUPLICATE = 10008\r
+ERROR_META_DATA_FILE_CHECK_PCD_FLASH = 10009\r
+ERROR_META_DATA_FILE_CHECK_PCD_NO_USE = 10010\r
+ERROR_META_DATA_FILE_CHECK_DUPLICATE_GUID = 10011\r
+ERROR_META_DATA_FILE_CHECK_DUPLICATE_PROTOCOL = 10012\r
+ERROR_META_DATA_FILE_CHECK_DUPLICATE_PPI = 10013\r
 \r
 ERROR_SPELLING_CHECK_ALL = 11000\r
 \r
 gEccErrorMessage = {\r
     ERROR_GENERAL_CHECK_ALL : "",\r
-    ERROR_GENERAL_CHECK_NO_TAB : "",\r
-    ERROR_GENERAL_CHECK_INDENTATION : "",\r
-    ERROR_GENERAL_CHECK_LINE : "",\r
-    ERROR_GENERAL_CHECK_NO_ASM : "",\r
-    ERROR_GENERAL_CHECK_NO_PROGMA : "",\r
-    ERROR_GENERAL_CHECK_CARRIAGE_RETURN : "",\r
-    ERROR_GENERAL_CHECK_FILE_EXISTENCE : "",\r
+    ERROR_GENERAL_CHECK_NO_TAB : "'TAB' is not allowed in source code, please replace them with spaces",\r
+    ERROR_GENERAL_CHECK_INDENTATION : "Indentation is not followed coding style",\r
+    ERROR_GENERAL_CHECK_LINE : "The width of each line is not followed coding style",\r
+    ERROR_GENERAL_CHECK_NO_ASM : "There should be no use of _asm in the source file",\r
+    ERROR_GENERAL_CHECK_NO_PROGMA : """There should be no use of "#progma" in source file except "#pragma pack(#)\"""",\r
+    ERROR_GENERAL_CHECK_CARRIAGE_RETURN : "There should be a carriage return at the end of the file",\r
+    ERROR_GENERAL_CHECK_FILE_EXISTENCE : "File not found",\r
     \r
     ERROR_SPACE_CHECK_ALL : "",\r
     \r
     ERROR_PREDICATE_EXPRESSION_CHECK_ALL : "",\r
-    ERROR_PREDICATE_EXPRESSION_CHECK_BOOLEAN_VALUE : "",\r
-    ERROR_PREDICATE_EXPRESSION_CHECK_NO_BOOLEAN_OPERATOR : "",\r
-    ERROR_PREDICATE_EXPRESSION_CHECK_COMPARISON_NULL_TYPE : "",\r
+    ERROR_PREDICATE_EXPRESSION_CHECK_BOOLEAN_VALUE : "Boolean values and variable type BOOLEAN should not use explicit comparisons to TRUE or FALSE",\r
+    ERROR_PREDICATE_EXPRESSION_CHECK_NO_BOOLEAN_OPERATOR : "Non-Boolean comparisons should use a compare operator (==, !=, >, < >=, <=)",\r
+    ERROR_PREDICATE_EXPRESSION_CHECK_COMPARISON_NULL_TYPE : "A comparison of any pointer to zero must be done via the NULL type",\r
     \r
     ERROR_HEADER_CHECK_ALL : "",\r
-    ERROR_HEADER_CHECK_FILE : "",\r
-    ERROR_HEADER_CHECK_FUNCTION : "",\r
+    ERROR_HEADER_CHECK_FILE : "File header doesn't exist",\r
+    ERROR_HEADER_CHECK_FUNCTION : "Function header doesn't exist",\r
     \r
     ERROR_C_FUNCTION_LAYOUT_CHECK_ALL : "",\r
-    ERROR_C_FUNCTION_LAYOUT_CHECK_RETURN_TYPE : "",\r
-    ERROR_C_FUNCTION_LAYOUT_CHECK_OPTIONAL_FUNCTIONAL_MODIFIER : "",\r
-    ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_NAME : "",\r
-    ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_PROTO_TYPE : "",\r
-    ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_BODY : "",\r
-    ERROR_C_FUNCTION_LAYOUT_CHECK_DATA_DECLARATION : "",\r
-    ERROR_C_FUNCTION_LAYOUT_CHECK_NO_INIT_OF_VARIABLE : "",\r
-    ERROR_C_FUNCTION_LAYOUT_CHECK_NO_STATIC : "",\r
+    ERROR_C_FUNCTION_LAYOUT_CHECK_RETURN_TYPE : "Return type of a function should exist and in the first line",\r
+    ERROR_C_FUNCTION_LAYOUT_CHECK_OPTIONAL_FUNCTIONAL_MODIFIER : "Any optional functional modifiers should exist and next to the return type",\r
+    ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_NAME : """Function name should be left justified and followed by the beginning of the parameter list, and the closing parenthesis is on its own line and also indented two spaces""",\r
+    ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_PROTO_TYPE : "Function prototypes in include files have the same form as function definitions",\r
+    ERROR_C_FUNCTION_LAYOUT_CHECK_FUNCTION_BODY : "The body of a function should be contained by open and close braces that must be in the first column",\r
+    ERROR_C_FUNCTION_LAYOUT_CHECK_DATA_DECLARATION : "The data declarations should be the first code in a module",\r
+    ERROR_C_FUNCTION_LAYOUT_CHECK_NO_INIT_OF_VARIABLE : "There should be no initialization of a variable as part of its declaration",\r
+    ERROR_C_FUNCTION_LAYOUT_CHECK_NO_STATIC : "There should be no use of STATIC for functions",\r
     \r
     ERROR_INCLUDE_FILE_CHECK_ALL : "",\r
-    ERROR_INCLUDE_FILE_CHECK_IFNDEF_STATEMENT : "",\r
-    ERROR_INCLUDE_FILE_CHECK_DATA : "",\r
+    ERROR_INCLUDE_FILE_CHECK_IFNDEF_STATEMENT_1 : "All include file contents should be guarded by a #ifndef statement.",\r
+    ERROR_INCLUDE_FILE_CHECK_IFNDEF_STATEMENT_2 : "The #ifndef must be the first line of code following the file header comment",\r
+    ERROR_INCLUDE_FILE_CHECK_IFNDEF_STATEMENT_3 : "The #endif must appear on the last line in the file",\r
+    ERROR_INCLUDE_FILE_CHECK_DATA : "Include files should contain only public or only private data but not contain code or define data variables",\r
     \r
     ERROR_DECLARATION_DATA_TYPE_CHECK_ALL : "",\r
-    ERROR_DECLARATION_DATA_TYPE_CHECK_NO_USE_C_TYPE : "",\r
-    ERROR_DECLARATION_DATA_TYPE_CHECK_IN_OUT_MODIFIER : "",\r
-    ERROR_DECLARATION_DATA_TYPE_CHECK_EFI_API_MODIFIER : "",\r
-    ERROR_DECLARATION_DATA_TYPE_CHECK_ENUMERATED_TYPE : "",\r
-    ERROR_DECLARATION_DATA_TYPE_CHECK_STRUCTURE_DECLARATION : "",\r
-    ERROR_DECLARATION_DATA_TYPE_CHECK_UNION_TYPE : "",\r
+    ERROR_DECLARATION_DATA_TYPE_CHECK_NO_USE_C_TYPE : "There should be no use of int, unsigned, char, void, static, long in any .c, .h or .asl files",\r
+    ERROR_DECLARATION_DATA_TYPE_CHECK_IN_OUT_MODIFIER : """The modifiers IN, OUT, OPTIONAL, and UNALIGNED should be used only to qualify arguments to a function and should not appear in a data type declaration""",\r
+    ERROR_DECLARATION_DATA_TYPE_CHECK_EFI_API_MODIFIER : "The EFIAPI modifier should be used at the entry of drivers, events, and member functions of protocols",\r
+    ERROR_DECLARATION_DATA_TYPE_CHECK_ENUMERATED_TYPE : "Enumerated Type should have a 'typedef' and the name is capital",\r
+    ERROR_DECLARATION_DATA_TYPE_CHECK_STRUCTURE_DECLARATION : "Structure Type should have a 'typedef' and the name is capital",\r
+    ERROR_DECLARATION_DATA_TYPE_CHECK_UNION_TYPE : "Union Type should have a 'typedef' and the name is capital",\r
     \r
     ERROR_NAMING_CONVENTION_CHECK_ALL : "",\r
-    ERROR_NAMING_CONVENTION_CHECK_DEFINE_STATEMENT : "",\r
-    ERROR_NAMING_CONVENTION_CHECK_TYPEDEF_STATEMENT : "",\r
-    ERROR_NAMING_CONVENTION_CHECK_IFNDEF_STATEMENT : "",\r
-    ERROR_NAMING_CONVENTION_CHECK_PATH_NAME : "",\r
-    ERROR_NAMING_CONVENTION_CHECK_VARIABLE_NAME : "",\r
-    ERROR_NAMING_CONVENTION_CHECK_FUNCTION_NAME : "",\r
-    ERROR_NAMING_CONVENTION_CHECK_SINGLE_CHARACTER_VARIABLE : "",\r
+    ERROR_NAMING_CONVENTION_CHECK_DEFINE_STATEMENT : "Only capital letters are allowed to be used for #define declarations",\r
+    ERROR_NAMING_CONVENTION_CHECK_TYPEDEF_STATEMENT : "Only capital letters are allowed to be used for typedef declarations",\r
+    ERROR_NAMING_CONVENTION_CHECK_IFNDEF_STATEMENT : "The #ifndef at the start of an include file should use both prefix and postfix underscore characters, '_'",\r
+    ERROR_NAMING_CONVENTION_CHECK_PATH_NAME : """Path name is not followed by below rules: 1. First character should be upper case 2. Existing lower case in a word 3. No space existence""",\r
+    ERROR_NAMING_CONVENTION_CHECK_VARIABLE_NAME : """Variable name is not followed by below rules: 1. First character should be upper case 2. Existing lower case in a word 3. No space existence""",\r
+    ERROR_NAMING_CONVENTION_CHECK_FUNCTION_NAME : """Function name is not followed by below rules: 1. First character should be upper case 2. Existing lower case in a word 3. No space existence""",\r
+    ERROR_NAMING_CONVENTION_CHECK_SINGLE_CHARACTER_VARIABLE : "There should be no use of short variable name with single character",\r
     \r
     ERROR_DOXYGEN_CHECK_ALL : "",\r
-    ERROR_DOXYGEN_CHECK_FILE_HEADER : "",\r
-    ERROR_DOXYGEN_CHECK_FUNCTION_HEADER : "",\r
-    ERROR_DOXYGEN_CHECK_COMMENT_DESCRIPTION : "",\r
-    ERROR_DOXYGEN_CHECK_COMMENT_FORMAT : "",\r
-    ERROR_DOXYGEN_CHECK_COMMAND : "",\r
+    ERROR_DOXYGEN_CHECK_FILE_HEADER : "The file headers should be followed Doxygen special documentation blocks in section 2.3.5",\r
+    ERROR_DOXYGEN_CHECK_FUNCTION_HEADER : "The function headers should be followed Doxygen special documentation blocks in section 2.3.5",\r
+    ERROR_DOXYGEN_CHECK_COMMENT_DESCRIPTION : """The first line of text in a comment block should be a brief description of the element being documented and the brief description must end with a period.""",\r
+    ERROR_DOXYGEN_CHECK_COMMENT_FORMAT : "For comment line with '///< ... text ...' format, if it is used, it should be after the code section",\r
+    ERROR_DOXYGEN_CHECK_COMMAND : "Only Doxygen commands @bug and @todo are allowed to mark the code",\r
     \r
     ERROR_META_DATA_FILE_CHECK_ALL : "",\r
-    ERROR_META_DATA_FILE_CHECK_PATH_NAME : "",\r
-    ERROR_META_DATA_FILE_CHECK_LIBRARY_INSTANCE : "",\r
-    ERROR_META_DATA_FILE_CHECK_LIBRARY_INSTANCE_DEPENDENT : "",\r
-    ERROR_META_DATA_FILE_CHECK_LIBRARY_INSTANCE_ORDER : "",\r
-    ERROR_META_DATA_FILE_CHECK_LIBRARY_NO_USE : "",\r
-    ERROR_META_DATA_FILE_CHECK_BINARY_INF_IN_FDF : "",\r
-    ERROR_META_DATA_FILE_CHECK_PCD_DUPLICATE : "",\r
-    ERROR_META_DATA_FILE_CHECK_PCD_FLASH : "",\r
-    ERROR_META_DATA_FILE_CHECK_PCD_NO_USE : "",\r
-    ERROR_META_DATA_FILE_CHECK_DUPLICATE_GUID : "",\r
-    ERROR_META_DATA_FILE_CHECK_DUPLICATE_PROTOCOL : "",\r
-    ERROR_META_DATA_FILE_CHECK_DUPLICATE_PPI : "",\r
+    ERROR_META_DATA_FILE_CHECK_PATH_NAME : "The file defined in meta-data does not exist",\r
+    ERROR_META_DATA_FILE_CHECK_LIBRARY_INSTANCE_1 : "A library instances defined for a given module (or dependent library instance) doesn't match the module's type.", \r
+    ERROR_META_DATA_FILE_CHECK_LIBRARY_INSTANCE_2 : "A library instance must specify the Supported Module Types in its INF file",\r
+    ERROR_META_DATA_FILE_CHECK_LIBRARY_INSTANCE_DEPENDENT : "A library instance should has been defined for all dependent library classes",\r
+    ERROR_META_DATA_FILE_CHECK_LIBRARY_INSTANCE_ORDER : "The library Instances specified by the LibraryClasses sections should be listed in order of dependencies",\r
+    ERROR_META_DATA_FILE_CHECK_LIBRARY_NO_USE : "There should be no unnecessary inclusion of library classes in the INF file",\r
+    ERROR_META_DATA_FILE_CHECK_BINARY_INF_IN_FDF : "An INF file is specified in the FDF file, but not in the DSC file, then the INF file must be for a Binary module only",\r
+    ERROR_META_DATA_FILE_CHECK_PCD_DUPLICATE : "Duplicate PCDs are found in both FDF and DSC",\r
+    ERROR_META_DATA_FILE_CHECK_PCD_FLASH : "PCD settings in the FDF file should only be related to flash",\r
+    ERROR_META_DATA_FILE_CHECK_PCD_NO_USE : "There should be no PCDs which is used in INF files but not specified in DSC or FDF files",\r
+    ERROR_META_DATA_FILE_CHECK_DUPLICATE_GUID : "Duplicate guid found",\r
+    ERROR_META_DATA_FILE_CHECK_DUPLICATE_PROTOCOL : "Duplicate protocol found",\r
+    ERROR_META_DATA_FILE_CHECK_DUPLICATE_PPI : "Duplicate ppi found",\r
     \r
     ERROR_SPELLING_CHECK_ALL : "",\r
-    }
\ No newline at end of file
+    }\r
+\r
index 310177b..549169d 100644 (file)
 #\r
 import Common.EdkLogger as EdkLogger\r
 from Table import Table\r
+import EccToolError\r
 \r
-## TableDsc\r
+## TableReport\r
 #\r
 # This class defined a table used for data model\r
 # \r
 # @param object:       Inherited from object class\r
 #\r
 #\r
-class TableDsc(Table):\r
+class TableReport(Table):\r
     def __init__(self, Cursor):\r
         Table.__init__(self, Cursor)\r
         self.Table = 'Report'\r
@@ -34,7 +35,7 @@ class TableDsc(Table):
     # Create table report\r
     #\r
     # @param ID:             ID of an Error\r
-    # @param ErrorID:        ID of an Error TypeModel of a Dsc item\r
+    # @param ErrorID:        ID of an Error TypeModel of a Report item\r
     # @param BelongsToItem:  The error belongs to which item\r
     # @param BelongsToFile:  The error belongs to which file\r
     # @param Enabled:        If this error enabled\r
@@ -43,6 +44,7 @@ class TableDsc(Table):
     def Create(self):\r
         SqlCommand = """create table IF NOT EXISTS %s (ID INTEGER PRIMARY KEY,\r
                                                        ErrorID INTEGER NOT NULL,\r
+                                                       BelongsToTable TEXT NOT NULL,\r
                                                        BelongsToItem SINGLE NOT NULL,\r
                                                        BelongsToFile SINGLE NOT NULL,\r
                                                        Enabled INTEGER DEFAULT 0,\r
@@ -55,16 +57,17 @@ class TableDsc(Table):
     # Insert a record into table report\r
     #\r
     # @param ID:             ID of an Error\r
-    # @param ErrorID:        ID of an Error TypeModel of a Dsc item\r
+    # @param ErrorID:        ID of an Error TypeModel of a report item\r
+    # @param BelongsToTable: The error item belongs to which table\r
     # @param BelongsToItem:  The error belongs to which item\r
     # @param BelongsToFile:  The error belongs to which file\r
     # @param Enabled:        If this error enabled\r
     # @param Corrected:      if this error corrected\r
     #\r
-    def Insert(self, ErrorID, BelongsToItem, BelongsToFile, Enabled, Corrected):\r
+    def Insert(self, ErrorID, BelongsToTable, BelongsToItem = -1, BelongsToFile = -1, Enabled = 0, Corrected = -1):\r
         self.ID = self.ID + 1\r
-        SqlCommand = """insert into %s values(%s, %s, %s, %s, %s, %s)""" \\r
-                     % (self.Table, self.ID, ErrorID, BelongsToItem, BelongsToFile, Enabled, Corrected)\r
+        SqlCommand = """insert into %s values(%s, %s, '%s', %s, %s, %s, %s)""" \\r
+                     % (self.Table, self.ID, ErrorID, BelongsToTable, BelongsToItem, BelongsToFile, Enabled, Corrected)\r
         Table.Insert(self, SqlCommand)\r
         \r
         return self.ID\r
@@ -74,16 +77,34 @@ class TableDsc(Table):
     # @retval:       A recordSet of all found records \r
     #\r
     def Query(self):\r
-        SqlCommand = """select ID, ErrorID, BelongsToItem, BelongsToFile, Corrected from %s\r
-                        where Enabled > -1""" % (self.Table)\r
-        EdkLogger.debug(4, "SqlCommand: %s" % SqlCommand)\r
-        self.Cur.execute(SqlCommand)\r
-        return self.Cur.fetchall()\r
+        SqlCommand = """select ID, ErrorID, BelongsToTable, BelongsToItem, BelongsToFile, Corrected from %s\r
+                        where Enabled > -1 order by ErrorID""" % (self.Table)\r
+        return self.Exec(SqlCommand)\r
 \r
     ## Convert to CSV\r
     #\r
-    # @param Filename:  To filename to save the report content\r
+    # Get all enabled records from table report and save them to a .csv file\r
     #\r
+    # @param Filename:  To filename to save the report content\r
     #\r
     def ToCSV(self, Filename = 'Report.csv'):\r
-        pass
\ No newline at end of file
+        File = open(Filename, 'w+')\r
+        File.write("""No, File, LineNo, Error Code, Error Message\r\n""")\r
+        RecordSet = self.Query()\r
+        Index = 0\r
+        for Record in RecordSet:\r
+            Index = Index + 1\r
+            ErrorID = Record[1]\r
+            BelongsToTable = Record[2]\r
+            BelongsToItem = Record[3]\r
+            BelongsToFile = Record[4]\r
+            IsCorrected = Record[5]\r
+            SqlCommand = """select A.StartLine, B.FullPath from %s as A, File as B\r
+                            where A.ID = %s and B.ID = %s\r
+                         """ % (BelongsToTable, BelongsToItem, BelongsToFile)\r
+            NewRecord = self.Exec(SqlCommand)\r
+            if NewRecord != []:\r
+                File.write("""%s, %s, %s, %s, %s\r\n""" % (Index, NewRecord[0][0], NewRecord[0][1], ErrorID, EccToolError.gEccErrorMessage[ErrorID])) \r
+        \r
+        File.close()\r
+\r