1. Add -m and -s to support only scanning meta-data files or source code files
[people/mcb30/basetools.git] / Source / Python / Common / DecClassObject.py
index 76bedba..b95ff62 100644 (file)
@@ -23,7 +23,7 @@ from CommonDataClass.PackageClass import *
 from CommonDataClass.CommonClass import PcdClass\r
 from BuildToolError import *\r
 from Table.TableDec import TableDec\r
-import Database as Database\r
+import Database\r
 from Parsing import *\r
 import GlobalData\r
 \r
@@ -57,56 +57,6 @@ class DecObject(object):
     def __init__(self):\r
         object.__init__()\r
 \r
-## DecDefines\r
-#\r
-# This class defined basic Defines used in Dec object\r
-# \r
-# @param DecObject:        Inherited from DecObject class\r
-#\r
-# @var DefinesDictionary:  To store value for DefinesDictionary \r
-#\r
-class DecDefines(DecObject):\r
-    def __init__(self):\r
-        self.DefinesDictionary = {\r
-            #\r
-            # Required Fields\r
-            #\r
-            TAB_DEC_DEFINES_DEC_SPECIFICATION           : [''],\r
-            TAB_DEC_DEFINES_PACKAGE_NAME                : [''],\r
-            TAB_DEC_DEFINES_PACKAGE_GUID                : [''],\r
-            TAB_DEC_DEFINES_PACKAGE_VERSION             : ['']\r
-        }\r
-\r
-## DecContents\r
-#\r
-# This class defined basic Contents used in Dec object\r
-# \r
-# @param DecObject:            Inherited from DecObject class\r
-#\r
-# @var Includes:               To store value for Includes\r
-# @var Guids:                  To store value for Guids\r
-# @var Protocols:              To store value for Protocols\r
-# @var Ppis:                   To store value for Ppis\r
-# @var LibraryClasses:         To store value for LibraryClasses\r
-# @var PcdsFixedAtBuild:       To store value for PcdsFixedAtBuild\r
-# @var PcdsPatchableInModule:  To store value for PcdsPatchableInModule\r
-# @var PcdsFeatureFlag:        To store value for PcdsFeatureFlag\r
-# @var PcdsDynamic:            To store value for PcdsDynamic\r
-# @var PcdsDynamicEx:          To store value for PcdsDynamicEx\r
-#\r
-class DecContents(DecObject):\r
-    def __init__(self):\r
-        self.Includes = []\r
-        self.Guids = []\r
-        self.Protocols = []\r
-        self.Ppis = []\r
-        self.LibraryClasses = []\r
-        self.PcdsFixedAtBuild = []\r
-        self.PcdsPatchableInModule = []\r
-        self.PcdsFeatureFlag = []\r
-        self.PcdsDynamic = []\r
-        self.PcdsDynamicEx = []\r
-\r
 ## Dec\r
 #\r
 # This class defined the structure used in Dec object\r
@@ -132,27 +82,24 @@ class DecContents(DecObject):
 # @var KeyList:             To store value for KeyList, a list for all Keys used in Dec\r
 #\r
 class Dec(DecObject):\r
-    def __init__(self, Filename = None, IsMergeAllArches = False, IsToPackage = False, WorkspaceDir = None, Database = None, SupArchList = DataType.ARCH_LIST):\r
+    def __init__(self, Filename = None, IsToDatabase = False, IsToPackage = False, WorkspaceDir = None, Database = None, SupArchList = DataType.ARCH_LIST):\r
         self.Identification = Identification()\r
-        self.Defines = DecDefines()\r
-        self.UserExtensions = ''\r
         self.Package = PackageClass()\r
+        self.UserExtensions = ''\r
         self.WorkspaceDir = WorkspaceDir\r
-        self.Cur = Database.Cur\r
-        self.TblFile = Database.TblFile\r
-        self.TblDec = TableDec(Database.Cur)\r
         self.SupArchList = SupArchList\r
+        self.IsToDatabase = IsToDatabase\r
         \r
-        self.Contents = {}\r
-#        for Arch in DataType.ARCH_LIST_FULL:\r
-#            self.Contents[Arch] = DecContents()\r
-        \r
+        self.Cur = Database.Cur\r
+        self.TblFile = Database.TblFile\r
+        self.TblDec = Database.TblDec\r
+        self.FileID = -1\r
+\r
         self.KeyList = [\r
             TAB_INCLUDES, TAB_GUIDS, TAB_PROTOCOLS, TAB_PPIS, TAB_LIBRARY_CLASSES, \\r
             TAB_PCDS_FIXED_AT_BUILD_NULL, TAB_PCDS_PATCHABLE_IN_MODULE_NULL, TAB_PCDS_FEATURE_FLAG_NULL, \\r
             TAB_PCDS_DYNAMIC_NULL, TAB_PCDS_DYNAMIC_EX_NULL, TAB_DEC_DEFINES\r
         ]\r
-    \r
         #\r
         # Upper all KEYs to ignore case sensitive when parsing\r
         #\r
@@ -171,44 +118,12 @@ class Dec(DecObject):
         if Filename != None:\r
             self.LoadDecFile(Filename)\r
         \r
-        #\r
-        # Merge contents of Dec from all arches if IsMergeAllArches is True\r
-        #\r
-        if IsMergeAllArches:\r
-            self.MergeAllArches()\r
-        \r
         #\r
         # Transfer to Package Object if IsToPackage is True\r
         #\r
         if IsToPackage:\r
             self.DecToPackage()\r
     \r
-    ## Parse Dec file\r
-    #\r
-    # Go through input lines one by one to find the value defined in Key section.\r
-    # Save them to KeyField\r
-    #\r
-    # @param Lines:     Lines need to be parsed\r
-    # @param Key:       The key value of the section to be located\r
-    # @param KeyField:  To save the found contents\r
-    #\r
-    def ParseDec(self, Lines, Key, KeyField):\r
-        newKey = SplitModuleType(Key)\r
-        if newKey[0].upper().find(DataType.TAB_LIBRARY_CLASSES.upper()) != -1:\r
-            GetLibraryClassesWithModuleType(Lines, Key, KeyField, TAB_COMMENT_SPLIT)\r
-        else:\r
-            GetMultipleValuesOfKeyFromLines(Lines, Key, KeyField, TAB_COMMENT_SPLIT)\r
-\r
-    ## Merge contents of Dec from all arches\r
-    #\r
-    # Find the contents defined in all arches and merge them to all\r
-    #   \r
-    def MergeAllArches(self):\r
-        for Key in self.KeyList:\r
-            for Arch in DataType.ARCH_LIST:\r
-                Command = "self.Contents[Arch]." + Key + ".extend(" + "self.Contents['" + DataType.TAB_ARCH_COMMON + "']." + Key + ")"\r
-                eval(Command)\r
-\r
     ## Load Dec file\r
     #\r
     # Load the file if it exists\r
@@ -222,13 +137,13 @@ class Dec(DecObject):
         Filename = NormPath(Filename)\r
         self.Identification.FileFullPath = Filename\r
         (self.Identification.FileRelativePath, self.Identification.FileName) = os.path.split(Filename)\r
-        FileID = self.TblFile.InsertFile(Filename, MODEL_FILE_DSC)\r
+        self.FileID = self.TblFile.InsertFile(Filename, MODEL_FILE_DEC)\r
         \r
         #\r
         # Init DecTable\r
         #\r
-        self.TblDec.Table = "Dec%s" % FileID\r
-        self.TblDec.Create()\r
+        #self.TblDec.Table = "Dec%s" % self.FileID\r
+        #self.TblDec.Create()\r
         \r
         #\r
         # Init common datas\r
@@ -240,20 +155,23 @@ class Dec(DecObject):
         #\r
         # Parse file content\r
         #\r
-        FileContent = open(Filename, 'r').read()\r
-        for Line in FileContent.splitlines():\r
+        IsFindBlockComment = False\r
+        ReservedLine = ''\r
+        for Line in open(Filename, 'r'):\r
             LineNo = LineNo + 1\r
             #\r
-            # Reomve spaces in head and tail\r
-            #\r
-            Line = Line.strip()\r
-            \r
-            #\r
-            # Ignore comments\r
+            # Remove comment block\r
             #\r
-            if Line.startswith(TAB_COMMENT_SPLIT):\r
+            if Line.find(TAB_COMMENT_R8_START) > -1:\r
+                ReservedLine = GetSplitValueList(Line, TAB_COMMENT_R8_START, 1)[0]\r
+                IsFindBlockComment = True\r
+            if Line.find(TAB_COMMENT_R8_END) > -1:\r
+                Line = ReservedLine + GetSplitValueList(Line, TAB_COMMENT_R8_END, 1)[1]\r
+                ReservedLine = ''\r
+                IsFindBlockComment = False\r
+            if IsFindBlockComment:\r
                 continue\r
-            \r
+\r
             #\r
             # Remove comments at tail and remove spaces again\r
             #\r
@@ -270,7 +188,9 @@ class Dec(DecObject):
                 #\r
                 # Insert items data of previous section\r
                 #\r
-                self.InsertSectionItemsIntoDatabase(FileID, Filename, CurrentSection, SectionItemList, ArchList, ThirdList, IfDefList)\r
+                Model = Section[CurrentSection.upper()]\r
+                InsertSectionItemsIntoDatabase(self.TblDec, self.FileID, Filename, Model, CurrentSection, SectionItemList, ArchList, ThirdList, IfDefList, self.RecordSet)\r
+\r
                 #\r
                 # Parse the new section\r
                 #\r
@@ -278,10 +198,15 @@ class Dec(DecObject):
                 ArchList = []\r
                 ThirdList = []\r
                 \r
+                CurrentSection = ''\r
                 LineList = GetSplitValueList(Line[len(TAB_SECTION_START):len(Line) - len(TAB_SECTION_END)], TAB_COMMA_SPLIT)\r
                 for Item in LineList:\r
                     ItemList = GetSplitValueList(Item, TAB_SPLIT)\r
-                    CurrentSection = ItemList[0]\r
+                    if CurrentSection == '':\r
+                        CurrentSection = ItemList[0]\r
+                    else:\r
+                        if CurrentSection != ItemList[0]:\r
+                            EdkLogger.error("Parser", PARSER_ERROR, "Different section names '%s' and '%s' are found in one section definition, this is not allowed." % (CurrentSection, ItemList[0]), File=Filename, Line=LineNo, RaiseError = EdkLogger.IsRaiseError)\r
                     if CurrentSection.upper() not in self.KeyList:\r
                         RaiseParserError(Line, CurrentSection, Filename, '', LineNo)\r
                     ItemList.append('')\r
@@ -290,7 +215,7 @@ class Dec(DecObject):
                         RaiseParserError(Line, CurrentSection, Filename, '', LineNo)\r
                     else:\r
                         if ItemList[1] != '' and ItemList[1].upper() not in ARCH_LIST_FULL:\r
-                            EdkLogger.error("Parser", PARSER_ERROR, "Invalid Arch definition '%s' found" % ItemList[1], File=Filename, Line=LineNo)\r
+                            EdkLogger.error("Parser", PARSER_ERROR, "Invalid Arch definition '%s' found" % ItemList[1], File=Filename, Line=LineNo, RaiseError = EdkLogger.IsRaiseError)\r
                         ArchList.append(ItemList[1].upper())\r
                         ThirdList.append(ItemList[2])\r
 \r
@@ -301,7 +226,7 @@ class Dec(DecObject):
             #\r
             if CurrentSection == TAB_UNKNOWN:\r
                 ErrorMsg = "%s is not in any defined section" % Line\r
-                EdkLogger.error("Parser", PARSER_ERROR, ErrorMsg, File=Filename, Line=LineNo)\r
+                EdkLogger.error("Parser", PARSER_ERROR, ErrorMsg, File=Filename, Line=LineNo, RaiseError = EdkLogger.IsRaiseError)\r
 \r
             #\r
             # Add a section item\r
@@ -313,70 +238,14 @@ class Dec(DecObject):
         #\r
         # Insert items data of last section\r
         #\r
-        self.InsertSectionItemsIntoDatabase(FileID, Filename, CurrentSection, SectionItemList, ArchList, ThirdList, IfDefList)\r
+        Model = Section[CurrentSection.upper()]\r
+        InsertSectionItemsIntoDatabase(self.TblDec, self.FileID, Filename, Model, CurrentSection, SectionItemList, ArchList, ThirdList, IfDefList, self.RecordSet)\r
         \r
         #\r
         # Replace all DEFINE macros with its actual values\r
         #\r
         ParseDefineMacro2(self.TblDec, self.RecordSet, GlobalData.gGlobalDefines)\r
 \r
-    ## Parse DEFINE statement\r
-    #\r
-    # Get DEFINE macros\r
-    #\r
-    # 1. Insert a record into TblDec\r
-    # Value1: Macro Name\r
-    # Value2: Macro Value\r
-    #\r
-    def ParseDefine(self, LineValue, StartLine, Table, FileID, Filename, SectionName, Model, Arch):\r
-        EdkLogger.debug(EdkLogger.DEBUG_2, "DEFINE statement '%s' found in section %s" % (LineValue, SectionName))\r
-        SectionModel = Section[SectionName.upper()]\r
-        Define = GetSplitValueList(CleanString(LineValue[LineValue.upper().find(DataType.TAB_DEFINE.upper() + ' ') + len(DataType.TAB_DEFINE + ' ') : ]), TAB_EQUAL_SPLIT, 1)\r
-        Table.Insert(Model, Define[0], Define[1], '', Arch, SectionModel, FileID, StartLine, -1, StartLine, -1, 0)\r
-    \r
-    ## First time to insert records to database\r
-    # \r
-    # Insert item data of a section to database\r
-    # @param FileID:           The ID of belonging file\r
-    # @param Filename:         The name of belonging file\r
-    # @param CurrentSection:   The name of currect section\r
-    # @param SectionItemList:  A list of items of the section\r
-    # @param ArchList:         A list of arches\r
-    # @param ThirdList:        A list of third parameters, ModuleType for LibraryClass and SkuId for Dynamic Pcds\r
-    # @param IfDefList:        A list of all conditional statements\r
-    #\r
-    def InsertSectionItemsIntoDatabase(self, FileID, Filename, CurrentSection, SectionItemList, ArchList, ThirdList, IfDefList):\r
-        #\r
-        # Insert each item data of a section\r
-        #\r
-        for Index in range(0, len(ArchList)):\r
-            Arch = ArchList[Index]\r
-            Third = ThirdList[Index]\r
-            if Arch == '':\r
-                Arch = TAB_ARCH_COMMON\r
-\r
-            Model = Section[CurrentSection.upper()]\r
-            Records = self.RecordSet[Model]\r
-            for SectionItem in SectionItemList:\r
-                BelongsToItem, EndLine, EndColumn = -1, -1, -1\r
-                LineValue, StartLine, EndLine = SectionItem[0], SectionItem[1], SectionItem[1]\r
-\r
-                EdkLogger.debug(4, "Parsing %s ..." %LineValue)\r
-                #\r
-                # And then parse DEFINE statement\r
-                #\r
-                if LineValue.upper().find(DataType.TAB_DEFINE.upper() + ' ') > -1:\r
-                    self.ParseDefine(LineValue, StartLine, self.TblDec, FileID, Filename, CurrentSection, MODEL_META_DATA_DEFINE, Arch)\r
-                    continue\r
-                \r
-                #\r
-                # At last parse other sections\r
-                #\r
-                ID = self.TblDec.Insert(Model, LineValue, '', '', Arch, -1, FileID, StartLine, -1, StartLine, -1, 0)\r
-                Records.append([LineValue, Arch, StartLine, ID, Third])\r
-            \r
-            self.RecordSet[Model] = Records\r
-\r
     ## Transfer to Package Object\r
     # \r
     # Transfer all contents of a Dec file to a standard Package Object\r
@@ -400,17 +269,17 @@ class Dec(DecObject):
         #\r
         # Generate Guids\r
         #\r
-        self.GenGuids(ContainerFile)\r
+        self.GenGuidProtocolPpis(DataType.TAB_GUIDS, ContainerFile)\r
 \r
         #\r
         # Generate Protocols\r
         #\r
-        self.GenProtocols(ContainerFile)\r
+        self.GenGuidProtocolPpis(DataType.TAB_PROTOCOLS, ContainerFile)\r
 \r
         #\r
         # Generate Ppis\r
         #\r
-        self.GenPpis(ContainerFile)\r
+        self.GenGuidProtocolPpis(DataType.TAB_PPIS, ContainerFile)\r
         \r
         #\r
         # Generate LibraryClasses\r
@@ -449,12 +318,12 @@ class Dec(DecObject):
         for Arch in self.SupArchList:\r
             PackageHeader = PackageHeaderClass()\r
             \r
-            PackageHeader.Name = QueryDefinesItem(self.TblDec, TAB_DEC_DEFINES_PACKAGE_NAME, Arch)[0]\r
-            PackageHeader.Guid = QueryDefinesItem(self.TblDec, TAB_DEC_DEFINES_PACKAGE_GUID, Arch)[0]\r
-            PackageHeader.Version = QueryDefinesItem(self.TblDec, TAB_DEC_DEFINES_PACKAGE_VERSION, Arch)[0]\r
+            PackageHeader.Name = QueryDefinesItem(self.TblDec, TAB_DEC_DEFINES_PACKAGE_NAME, Arch, self.FileID)[0]\r
+            PackageHeader.Guid = QueryDefinesItem(self.TblDec, TAB_DEC_DEFINES_PACKAGE_GUID, Arch, self.FileID)[0]\r
+            PackageHeader.Version = QueryDefinesItem(self.TblDec, TAB_DEC_DEFINES_PACKAGE_VERSION, Arch, self.FileID)[0]\r
             PackageHeader.FileName = self.Identification.FileName\r
             PackageHeader.FullPath = self.Identification.FileFullPath\r
-            PackageHeader.DecSpecification = QueryDefinesItem(self.TblDec, TAB_DEC_DEFINES_DEC_SPECIFICATION, Arch)[0]\r
+            PackageHeader.DecSpecification = QueryDefinesItem(self.TblDec, TAB_DEC_DEFINES_DEC_SPECIFICATION, Arch, self.FileID)[0]\r
             \r
             self.Package.Header[Arch] = PackageHeader\r
     \r
@@ -487,74 +356,6 @@ class Dec(DecObject):
             Include.SupArchList = Includes[Key]\r
             self.Package.Includes.append(Include)\r
     \r
-    ## GenGuids\r
-    #\r
-    # Gen Guids of Dec\r
-    # <CName>=<GuidValue>\r
-    #\r
-    # @param ContainerFile: The Dec file full path \r
-    #\r
-    def GenGuids(self, ContainerFile):\r
-        EdkLogger.debug(2, "Generate %s ..." % TAB_GUIDS)\r
-        Guids = {}\r
-        #\r
-        # Get all Guids\r
-        #\r
-        RecordSet = self.RecordSet[MODEL_EFI_GUID]\r
-        \r
-        #\r
-        # Go through each arch\r
-        #\r
-        for Arch in self.SupArchList:\r
-            for Record in RecordSet:\r
-                if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
-                    List = GetSplitValueList(Record[0], DataType.TAB_EQUAL_SPLIT)\r
-                    if len(List) != 2:\r
-                        RaiseParserError(Record[0], 'Guids', ContainerFile, '<CName>=<GuidValue>', Record[2])\r
-                    else:\r
-                        MergeArches(Guids, (List[0], List[1]), Arch)\r
-                \r
-        for Key in Guids.keys():\r
-            Guid = GuidClass()\r
-            Guid.CName = Key[0]\r
-            Guid.Guid = Key[1]\r
-            Guid.SupArchList = Guids[Key]\r
-            self.Package.GuidDeclarations.append(Guid)\r
-\r
-    ## GenProtocols\r
-    #\r
-    # Gen Protocols of Dec\r
-    # <CName>=<GuidValue>\r
-    #\r
-    # @param ContainerFile: The Dec file full path \r
-    #\r
-    def GenProtocols(self, ContainerFile):\r
-        EdkLogger.debug(2, "Generate %s ..." % TAB_PROTOCOLS)\r
-        Protocols = {}\r
-        #\r
-        # Get all Guids\r
-        #\r
-        RecordSet = self.RecordSet[MODEL_EFI_PROTOCOL]\r
-        \r
-        #\r
-        # Go through each arch\r
-        #\r
-        for Arch in self.SupArchList:\r
-            for Record in RecordSet:\r
-                if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
-                    List = GetSplitValueList(Record[0], DataType.TAB_EQUAL_SPLIT)\r
-                    if len(List) != 2:\r
-                        RaiseParserError(Record[0], 'Protocols', ContainerFile, '<CName>=<GuidValue>', Record[2])\r
-                    else:\r
-                        MergeArches(Protocols, (List[0], List[1]), Arch)\r
-                \r
-        for Key in Protocols.keys():\r
-            Protocol = ProtocolClass()\r
-            Protocol.CName = Key[0]\r
-            Protocol.Guid = Key[1]\r
-            Protocol.SupArchList = Protocols[Key]\r
-            self.Package.ProtocolDeclarations.append(Protocol)\r
-    \r
     ## GenPpis\r
     #\r
     # Gen Ppis of Dec\r
@@ -562,13 +363,13 @@ class Dec(DecObject):
     #\r
     # @param ContainerFile: The Dec file full path \r
     #\r
-    def GenPpis(self, ContainerFile):\r
-        EdkLogger.debug(2, "Generate %s ..." % TAB_PPIS)\r
-        Ppis = {}\r
+    def GenGuidProtocolPpis(self, Type, ContainerFile):\r
+        EdkLogger.debug(2, "Generate %s ..." % Type)\r
+        Lists = {}\r
         #\r
-        # Get all Guids\r
+        # Get all Items\r
         #\r
-        RecordSet = self.RecordSet[MODEL_EFI_PPI]\r
+        RecordSet = self.RecordSet[Section[Type.upper()]]\r
         \r
         #\r
         # Go through each arch\r
@@ -576,18 +377,28 @@ 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
-                    List = GetSplitValueList(Record[0], DataType.TAB_EQUAL_SPLIT)\r
-                    if len(List) != 2:\r
-                        RaiseParserError(Record[0], 'Ppis', ContainerFile, '<CName>=<GuidValue>', Record[2])\r
-                    else:\r
-                        MergeArches(Ppis, (List[0], List[1]), 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
-        for Key in Ppis.keys():\r
-            Ppi = PpiClass()\r
-            Ppi.CName = Key[0]\r
-            Ppi.Guid = Key[1]\r
-            Ppi.SupArchList = Ppis[Key]\r
-            self.Package.PpiDeclarations.append(Ppi)\r
+        ListMember = None\r
+        if Type == TAB_GUIDS:\r
+            ListMember = self.Package.GuidDeclarations\r
+        elif Type == TAB_PROTOCOLS:\r
+            ListMember = self.Package.ProtocolDeclarations\r
+        elif Type == TAB_PPIS:\r
+            ListMember = self.Package.PpiDeclarations\r
+        \r
+        for Key in Lists.keys():\r
+            ListClass = GuidProtocolPpiCommonClass()\r
+            ListClass.CName = Key[0]\r
+            ListClass.Guid = Key[1]\r
+            ListClass.SupArchList = Lists[Key]\r
+            ListMember.append(ListClass)\r
+            \r
     \r
     ## GenLibraryClasses\r
     #\r
@@ -616,6 +427,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
@@ -635,6 +451,7 @@ class Dec(DecObject):
     def GenPcds(self, ContainerFile):\r
         EdkLogger.debug(2, "Generate %s ..." % TAB_PCDS)\r
         Pcds = {}\r
+        PcdToken = {}\r
         #\r
         # Get all Guids\r
         #\r
@@ -650,19 +467,36 @@ class Dec(DecObject):
         for Arch in self.SupArchList:\r
             for Record in RecordSet1:\r
                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
-                    MergeArches(Pcds, self.GetPcdOfDec(Record[0], TAB_PCDS_FIXED_AT_BUILD, ContainerFile, Record[2]), Arch)\r
+                    (TokenGuidCName, TokenName, Value, DatumType, Token, Type) = GetPcdOfDec(Record[0], TAB_PCDS_FIXED_AT_BUILD, ContainerFile, Record[2])\r
+                    MergeArches(Pcds, (TokenGuidCName, TokenName, Value, DatumType, Token, Type), Arch)\r
+                    PcdToken[Record[3]] = (TokenGuidCName, TokenName)\r
             for Record in RecordSet2:\r
                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
-                    MergeArches(Pcds, self.GetPcdOfDec(Record[0], TAB_PCDS_PATCHABLE_IN_MODULE, ContainerFile, Record[2]), Arch)\r
+                    (TokenGuidCName, TokenName, Value, DatumType, Token, Type) = GetPcdOfDec(Record[0], TAB_PCDS_PATCHABLE_IN_MODULE, ContainerFile, Record[2])\r
+                    MergeArches(Pcds, (TokenGuidCName, TokenName, Value, DatumType, Token, Type), Arch)\r
+                    PcdToken[Record[3]] = (TokenGuidCName, TokenName)\r
             for Record in RecordSet3:\r
                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
-                    MergeArches(Pcds, self.GetPcdOfDec(Record[0], TAB_PCDS_FEATURE_FLAG, ContainerFile, Record[2]), Arch)\r
+                    (TokenGuidCName, TokenName, Value, DatumType, Token, Type) = GetPcdOfDec(Record[0], TAB_PCDS_FEATURE_FLAG, ContainerFile, Record[2])\r
+                    MergeArches(Pcds, (TokenGuidCName, TokenName, Value, DatumType, Token, Type), Arch)\r
+                    PcdToken[Record[3]] = (TokenGuidCName, TokenName)\r
             for Record in RecordSet4:\r
                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
-                    MergeArches(Pcds, self.GetPcdOfDec(Record[0], TAB_PCDS_DYNAMIC_EX, ContainerFile, Record[2]), Arch)\r
+                    (TokenGuidCName, TokenName, Value, DatumType, Token, Type) = GetPcdOfDec(Record[0], TAB_PCDS_DYNAMIC_EX, ContainerFile, Record[2])\r
+                    MergeArches(Pcds, (TokenGuidCName, TokenName, Value, DatumType, Token, Type), Arch)\r
+                    PcdToken[Record[3]] = (TokenGuidCName, TokenName)\r
             for Record in RecordSet5:\r
                 if Record[1] == Arch or Record[1] == TAB_ARCH_COMMON:\r
-                    MergeArches(Pcds, self.GetPcdOfDec(Record[0], TAB_PCDS_DYNAMIC, ContainerFile, Record[2]), Arch)                    \r
+                    (TokenGuidCName, TokenName, Value, DatumType, Token, Type) = GetPcdOfDec(Record[0], TAB_PCDS_DYNAMIC, ContainerFile, Record[2])\r
+                    MergeArches(Pcds, (TokenGuidCName, TokenName, Value, DatumType, Token, Type), Arch)\r
+                    PcdToken[Record[3]] = (TokenGuidCName, TokenName)\r
+        #\r
+        # Update to database\r
+        #\r
+        if self.IsToDatabase:\r
+            for Key in PcdToken.keys():\r
+                SqlCommand = """update %s set Value2 = '%s' where ID = %s""" % (self.TblDec.Table, ".".join((PcdToken[Key][0], PcdToken[Key][1])), Key)\r
+                self.TblDec.Exec(SqlCommand)\r
 \r
         for Key in Pcds.keys():\r
             Pcd = PcdClass()\r
@@ -675,37 +509,6 @@ class Dec(DecObject):
             Pcd.SupArchList = Pcds[Key]\r
             self.Package.PcdDeclarations.append(Pcd)\r
     \r
-    ## Get Pcd Values of Dec\r
-    #\r
-    # Get Pcd of Dec as <TokenSpcCName>.<TokenCName>|<Value>|<DatumType>|<Token>\r
-    # @retval (TokenSpcCName, TokenCName, Value, DatumType, Token, ItemType) Formatted Pcd Item\r
-    #\r
-    def GetPcdOfDec(self, Item, Type, File, LineNo = -1):\r
-        Format = '<TokenSpaceGuidCName>.<PcdCName>|<Value>|<DatumType>|<Token>'\r
-        List = GetSplitValueList(Item)\r
-        if len(List) != 4:\r
-            RaiseParserError(Item, 'Pcds' + Type, File, Format, LineNo)\r
-        TokenInfo = GetSplitValueList(List[0], DataType.TAB_SPLIT)\r
-        if len(TokenInfo) != 2:\r
-            RaiseParserError(Item, 'Pcds' + Type, File, Format, LineNo)\r
-        \r
-        return (TokenInfo[0], TokenInfo[1], List[1], List[2], List[3], Type)\r
-    \r
-    ## Show detailed information of Dec\r
-    #\r
-    # Print all members and their values of Dec class\r
-    #\r
-    def ShowDec(self):\r
-        print TAB_SECTION_START + TAB_INF_DEFINES + TAB_SECTION_END\r
-        printDict(self.Defines.DefinesDictionary)\r
-\r
-        for key in self.KeyList:\r
-            for arch in DataType.ARCH_LIST_FULL:\r
-                Command = "printList(TAB_SECTION_START + '" + \\r
-                                    key + DataType.TAB_SPLIT + arch + \\r
-                                    "' + TAB_SECTION_END, self.Contents[arch]." + key + ')'\r
-                eval(Command)\r
-    \r
     ## Show detailed information of Package\r
     #\r
     # Print all members and their values of Package class\r
@@ -749,12 +552,12 @@ if __name__ == '__main__':
     EdkLogger.SetLevel(EdkLogger.DEBUG_0)\r
     \r
     W = os.getenv('WORKSPACE')\r
-    #F = os.path.join(W, 'Nt32Pkg/Nt32Pkg.dec')\r
-    F = os.path.join(W, 'MdeModulePkg\MdeModulePkg.dec')\r
-    Db = Database.Database(DATABASE_PATH)\r
+    F = os.path.join(W, 'Nt32Pkg/Nt32Pkg.dec')\r
+\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