]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/Python/Eot/Database.py
Sync EDKII BaseTools to BaseTools project r1903.
[mirror_edk2.git] / BaseTools / Source / Python / Eot / Database.py
diff --git a/BaseTools/Source/Python/Eot/Database.py b/BaseTools/Source/Python/Eot/Database.py
new file mode 100644 (file)
index 0000000..e3fb4f2
--- /dev/null
@@ -0,0 +1,255 @@
+## @file\r
+# This file is used to create a database used by EOT tool\r
+#\r
+# Copyright (c) 2007 - 2010, 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, time\r
+\r
+import Common.EdkLogger as EdkLogger\r
+import CommonDataClass.DataClass as DataClass\r
+\r
+from Table.TableDataModel import TableDataModel\r
+from Table.TableFile import TableFile\r
+from Table.TableFunction import TableFunction\r
+from Table.TableIdentifier import TableIdentifier\r
+from Table.TableEotReport import TableEotReport\r
+from Table.TableInf import TableInf\r
+from Table.TableDec import TableDec\r
+from Table.TableDsc import TableDsc\r
+from Table.TableFdf import TableFdf\r
+from Table.TableQuery import TableQuery\r
+\r
+##\r
+# Static definitions\r
+#\r
+DATABASE_PATH = "Eot.db"\r
+\r
+## Database class\r
+#\r
+# This class defined the EOT databse\r
+# During the phase of initialization, the database will create all tables and\r
+# insert all records of table DataModel\r
+#\r
+class Database(object):\r
+    ## The constructor\r
+    #\r
+    #   @param  self:      The object pointer\r
+    #   @param  DbPath:    The file path of the database\r
+    #\r
+    def __init__(self, DbPath):\r
+        self.DbPath = DbPath\r
+        self.Conn = None\r
+        self.Cur = None\r
+        self.TblDataModel = None\r
+        self.TblFile = None\r
+        self.TblFunction = None\r
+        self.TblIdentifier = None\r
+        self.TblReport = None\r
+        self.TblInf = None\r
+        self.TblDec = None\r
+        self.TblDsc = None\r
+        self.TblFdf = None\r
+        self.TblQuery = None\r
+        self.TblQuery2 = None\r
+\r
+    ## InitDatabase() method\r
+    #  1. Delete all old existing tables\r
+    #  2. Create new tables\r
+    #  3. Initialize table DataModel\r
+    #\r
+    #  @param self: The object pointer\r
+    #  @param NewDatabase: Check if it needs to create a new database\r
+    #\r
+    def InitDatabase(self, NewDatabase = True):\r
+        EdkLogger.verbose("\nInitialize EOT database started ...")\r
+        #\r
+        # Drop all old existing tables\r
+        #\r
+        if NewDatabase:\r
+            if os.path.exists(self.DbPath):\r
+                os.remove(self.DbPath)\r
+        self.Conn = sqlite3.connect(self.DbPath, isolation_level = 'DEFERRED')\r
+        self.Conn.execute("PRAGMA page_size=8192")\r
+        self.Conn.execute("PRAGMA synchronous=OFF")\r
+        # to avoid non-ascii charater conversion error\r
+        self.Conn.text_factory = str\r
+        self.Cur = self.Conn.cursor()\r
+\r
+        self.TblDataModel = TableDataModel(self.Cur)\r
+        self.TblFile = TableFile(self.Cur)\r
+        self.TblFunction = TableFunction(self.Cur)\r
+        self.TblIdentifier = TableIdentifier(self.Cur)\r
+        self.TblReport = TableEotReport(self.Cur)\r
+        self.TblInf = TableInf(self.Cur)\r
+        self.TblDec = TableDec(self.Cur)\r
+        self.TblDsc = TableDsc(self.Cur)\r
+        self.TblFdf = TableFdf(self.Cur)\r
+        self.TblQuery = TableQuery(self.Cur)\r
+        self.TblQuery2 = TableQuery(self.Cur)\r
+        self.TblQuery2.Table = 'Query2'\r
+\r
+        # Create new tables\r
+        if NewDatabase:\r
+            self.TblDataModel.Create()\r
+            self.TblFile.Create()\r
+            self.TblFunction.Create()\r
+            self.TblReport.Create()\r
+            self.TblInf.Create()\r
+            self.TblDec.Create()\r
+            self.TblDsc.Create()\r
+            self.TblFdf.Create()\r
+            self.TblQuery.Create()\r
+            self.TblQuery2.Create()\r
+\r
+        # Init each table's ID\r
+        self.TblDataModel.InitID()\r
+        self.TblFile.InitID()\r
+        self.TblFunction.InitID()\r
+        self.TblReport.InitID()\r
+        self.TblInf.InitID()\r
+        self.TblDec.InitID()\r
+        self.TblDsc.InitID()\r
+        self.TblFdf.InitID()\r
+        self.TblQuery.Drop()\r
+        self.TblQuery.Create()\r
+        self.TblQuery.InitID()\r
+        self.TblQuery2.Drop()\r
+        self.TblQuery2.Create()\r
+        self.TblQuery2.InitID()\r
+\r
+        # Initialize table DataModel\r
+        if NewDatabase:\r
+            self.TblDataModel.InitTable()\r
+\r
+        EdkLogger.verbose("Initialize EOT database ... DONE!")\r
+\r
+    ## QueryTable() method\r
+    #\r
+    #  Query a table\r
+    #\r
+    #  @param self: The object pointer\r
+    #  @param Table: The instance of the table to be queried\r
+    #\r
+    def QueryTable(self, Table):\r
+        Table.Query()\r
+\r
+    ## Close() method\r
+    #\r
+    # Commit all first\r
+    # Close the connection and cursor\r
+    #\r
+    def Close(self):\r
+        # Commit to file\r
+        self.Conn.commit()\r
+\r
+        # Close connection and cursor\r
+        self.Cur.close()\r
+        self.Conn.close()\r
+\r
+    ## InsertOneFile() method\r
+    #\r
+    # Insert one file's information to the database\r
+    # 1. Create a record in TableFile\r
+    # 2. Create functions one by one\r
+    #    2.1 Create variables of function one by one\r
+    #    2.2 Create pcds of function one by one\r
+    # 3. Create variables one by one\r
+    # 4. Create pcds one by one\r
+    #\r
+    # @param self: The object pointer\r
+    # @param File: The object of the file to be inserted\r
+    #\r
+    def InsertOneFile(self, File):\r
+        # Insert a record for file\r
+        FileID = self.TblFile.Insert(File.Name, File.ExtName, File.Path, File.FullPath, Model = File.Model, TimeStamp = File.TimeStamp)\r
+        IdTable = TableIdentifier(self.Cur)\r
+        IdTable.Table = "Identifier%s" % FileID\r
+        IdTable.Create()\r
+\r
+        # Insert function of file\r
+        for Function in File.FunctionList:\r
+            FunctionID = self.TblFunction.Insert(Function.Header, Function.Modifier, Function.Name, Function.ReturnStatement, \\r
+                                    Function.StartLine, Function.StartColumn, Function.EndLine, Function.EndColumn, \\r
+                                    Function.BodyStartLine, Function.BodyStartColumn, FileID, \\r
+                                    Function.FunNameStartLine, Function.FunNameStartColumn)\r
+\r
+            # Insert Identifier of function\r
+            for Identifier in Function.IdentifierList:\r
+                IdentifierID = IdTable.Insert(Identifier.Modifier, Identifier.Type, Identifier.Name, Identifier.Value, Identifier.Model, \\r
+                                        FileID, FunctionID, Identifier.StartLine, Identifier.StartColumn, Identifier.EndLine, Identifier.EndColumn)\r
+        # Insert Identifier of file\r
+        for Identifier in File.IdentifierList:\r
+            IdentifierID = IdTable.Insert(Identifier.Modifier, Identifier.Type, Identifier.Name, Identifier.Value, Identifier.Model, \\r
+                                    FileID, -1, Identifier.StartLine, Identifier.StartColumn, Identifier.EndLine, Identifier.EndColumn)\r
+\r
+        EdkLogger.verbose("Insert information from file %s ... DONE!" % File.FullPath)\r
+\r
+    ## UpdateIdentifierBelongsToFunction() method\r
+    #\r
+    #  Update the field "BelongsToFunction" for each Indentifier\r
+    #\r
+    #  @param self: The object pointer\r
+    #\r
+    def UpdateIdentifierBelongsToFunction(self):\r
+        EdkLogger.verbose("Update 'BelongsToFunction' for Identifiers started ...")\r
+\r
+        SqlCommand = """select ID, BelongsToFile, StartLine, EndLine from Function"""\r
+        Records = self.TblFunction.Exec(SqlCommand)\r
+        Data1 = []\r
+        Data2 = []\r
+        for Record in Records:\r
+            FunctionID = Record[0]\r
+            BelongsToFile = Record[1]\r
+            StartLine = Record[2]\r
+            EndLine = Record[3]\r
+\r
+            SqlCommand = """Update Identifier%s set BelongsToFunction = %s where BelongsToFile = %s and StartLine > %s and EndLine < %s""" % \\r
+                        (BelongsToFile, FunctionID, BelongsToFile, StartLine, EndLine)\r
+            self.TblIdentifier.Exec(SqlCommand)\r
+\r
+            SqlCommand = """Update Identifier%s set BelongsToFunction = %s, Model = %s where BelongsToFile = %s and Model = %s and EndLine = %s""" % \\r
+                         (BelongsToFile, FunctionID, DataClass.MODEL_IDENTIFIER_FUNCTION_HEADER, BelongsToFile, DataClass.MODEL_IDENTIFIER_COMMENT, StartLine - 1)\r
+            self.TblIdentifier.Exec(SqlCommand)\r
+\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
+    EdkLogger.verbose("Start at " + time.strftime('%H:%M:%S', time.localtime()))\r
+\r
+    Db = Database(DATABASE_PATH)\r
+    Db.InitDatabase()\r
+    Db.QueryTable(Db.TblDataModel)\r
+\r
+    identifier1 = DataClass.IdentifierClass(-1, '', '', "i''1", 'aaa', DataClass.MODEL_IDENTIFIER_COMMENT, 1, -1, 32,  43,  54,  43)\r
+    identifier2 = DataClass.IdentifierClass(-1, '', '', 'i1', 'aaa', DataClass.MODEL_IDENTIFIER_COMMENT, 1, -1, 15,  43,  20,  43)\r
+    identifier3 = DataClass.IdentifierClass(-1, '', '', 'i1', 'aaa', DataClass.MODEL_IDENTIFIER_COMMENT, 1, -1, 55,  43,  58,  43)\r
+    identifier4 = DataClass.IdentifierClass(-1, '', '', "i1'", 'aaa', DataClass.MODEL_IDENTIFIER_COMMENT, 1, -1, 77,  43,  88,  43)\r
+    fun1 = DataClass.FunctionClass(-1, '', '', 'fun1', '', 21, 2, 60,  45, 1, 23, 0, [], [])\r
+    file = DataClass.FileClass(-1, 'F1', 'c', 'C:\\', 'C:\\F1.exe', DataClass.MODEL_FILE_C, '2007-12-28', [fun1], [identifier1, identifier2, identifier3, identifier4], [])\r
+    Db.InsertOneFile(file)\r
+\r
+    Db.QueryTable(Db.TblFile)\r
+    Db.QueryTable(Db.TblFunction)\r
+    Db.QueryTable(Db.TblIdentifier)\r
+\r
+    Db.Close()\r
+    EdkLogger.verbose("End at " + time.strftime('%H:%M:%S', time.localtime()))\r
+\r