]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/Eot/Database.py
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / BaseTools / Source / Python / Eot / Database.py
CommitLineData
52302d4d
LG
1## @file\r
2# This file is used to create a database used by EOT tool\r
3#\r
1be2ed90 4# Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>\r
2e351cbe 5# SPDX-License-Identifier: BSD-2-Clause-Patent\r
52302d4d
LG
6#\r
7\r
8##\r
9# Import Modules\r
10#\r
11import sqlite3\r
1be2ed90 12import Common.LongFilePathOs as os, time\r
52302d4d
LG
13\r
14import Common.EdkLogger as EdkLogger\r
15import CommonDataClass.DataClass as DataClass\r
16\r
17from Table.TableDataModel import TableDataModel\r
18from Table.TableFile import TableFile\r
19from Table.TableFunction import TableFunction\r
20from Table.TableIdentifier import TableIdentifier\r
21from Table.TableEotReport import TableEotReport\r
22from Table.TableInf import TableInf\r
23from Table.TableDec import TableDec\r
24from Table.TableDsc import TableDsc\r
25from Table.TableFdf import TableFdf\r
26from Table.TableQuery import TableQuery\r
27\r
28##\r
29# Static definitions\r
30#\r
31DATABASE_PATH = "Eot.db"\r
32\r
33## Database class\r
34#\r
fb0b35e0 35# This class defined the EOT database\r
52302d4d
LG
36# During the phase of initialization, the database will create all tables and\r
37# insert all records of table DataModel\r
38#\r
39class Database(object):\r
40 ## The constructor\r
41 #\r
42 # @param self: The object pointer\r
43 # @param DbPath: The file path of the database\r
44 #\r
45 def __init__(self, DbPath):\r
46 self.DbPath = DbPath\r
47 self.Conn = None\r
48 self.Cur = None\r
49 self.TblDataModel = None\r
50 self.TblFile = None\r
51 self.TblFunction = None\r
52 self.TblIdentifier = None\r
53 self.TblReport = None\r
54 self.TblInf = None\r
55 self.TblDec = None\r
56 self.TblDsc = None\r
57 self.TblFdf = None\r
58 self.TblQuery = None\r
59 self.TblQuery2 = None\r
60\r
61 ## InitDatabase() method\r
62 # 1. Delete all old existing tables\r
63 # 2. Create new tables\r
64 # 3. Initialize table DataModel\r
65 #\r
66 # @param self: The object pointer\r
67 # @param NewDatabase: Check if it needs to create a new database\r
68 #\r
69 def InitDatabase(self, NewDatabase = True):\r
70 EdkLogger.verbose("\nInitialize EOT database started ...")\r
71 #\r
72 # Drop all old existing tables\r
73 #\r
74 if NewDatabase:\r
75 if os.path.exists(self.DbPath):\r
76 os.remove(self.DbPath)\r
77 self.Conn = sqlite3.connect(self.DbPath, isolation_level = 'DEFERRED')\r
78 self.Conn.execute("PRAGMA page_size=8192")\r
79 self.Conn.execute("PRAGMA synchronous=OFF")\r
fb0b35e0 80 # to avoid non-ascii character conversion error\r
52302d4d
LG
81 self.Conn.text_factory = str\r
82 self.Cur = self.Conn.cursor()\r
83\r
84 self.TblDataModel = TableDataModel(self.Cur)\r
85 self.TblFile = TableFile(self.Cur)\r
86 self.TblFunction = TableFunction(self.Cur)\r
87 self.TblIdentifier = TableIdentifier(self.Cur)\r
88 self.TblReport = TableEotReport(self.Cur)\r
89 self.TblInf = TableInf(self.Cur)\r
90 self.TblDec = TableDec(self.Cur)\r
91 self.TblDsc = TableDsc(self.Cur)\r
92 self.TblFdf = TableFdf(self.Cur)\r
93 self.TblQuery = TableQuery(self.Cur)\r
94 self.TblQuery2 = TableQuery(self.Cur)\r
95 self.TblQuery2.Table = 'Query2'\r
96\r
97 # Create new tables\r
98 if NewDatabase:\r
99 self.TblDataModel.Create()\r
100 self.TblFile.Create()\r
101 self.TblFunction.Create()\r
102 self.TblReport.Create()\r
103 self.TblInf.Create()\r
104 self.TblDec.Create()\r
105 self.TblDsc.Create()\r
106 self.TblFdf.Create()\r
107 self.TblQuery.Create()\r
108 self.TblQuery2.Create()\r
109\r
110 # Init each table's ID\r
111 self.TblDataModel.InitID()\r
112 self.TblFile.InitID()\r
113 self.TblFunction.InitID()\r
114 self.TblReport.InitID()\r
115 self.TblInf.InitID()\r
116 self.TblDec.InitID()\r
117 self.TblDsc.InitID()\r
118 self.TblFdf.InitID()\r
119 self.TblQuery.Drop()\r
120 self.TblQuery.Create()\r
121 self.TblQuery.InitID()\r
122 self.TblQuery2.Drop()\r
123 self.TblQuery2.Create()\r
124 self.TblQuery2.InitID()\r
125\r
126 # Initialize table DataModel\r
127 if NewDatabase:\r
128 self.TblDataModel.InitTable()\r
129\r
130 EdkLogger.verbose("Initialize EOT database ... DONE!")\r
131\r
132 ## QueryTable() method\r
133 #\r
134 # Query a table\r
135 #\r
136 # @param self: The object pointer\r
137 # @param Table: The instance of the table to be queried\r
138 #\r
139 def QueryTable(self, Table):\r
140 Table.Query()\r
141\r
142 ## Close() method\r
143 #\r
144 # Commit all first\r
145 # Close the connection and cursor\r
146 #\r
147 def Close(self):\r
148 # Commit to file\r
149 self.Conn.commit()\r
150\r
151 # Close connection and cursor\r
152 self.Cur.close()\r
153 self.Conn.close()\r
154\r
155 ## InsertOneFile() method\r
156 #\r
157 # Insert one file's information to the database\r
158 # 1. Create a record in TableFile\r
159 # 2. Create functions one by one\r
160 # 2.1 Create variables of function one by one\r
161 # 2.2 Create pcds of function one by one\r
162 # 3. Create variables one by one\r
163 # 4. Create pcds one by one\r
164 #\r
165 # @param self: The object pointer\r
166 # @param File: The object of the file to be inserted\r
167 #\r
168 def InsertOneFile(self, File):\r
169 # Insert a record for file\r
170 FileID = self.TblFile.Insert(File.Name, File.ExtName, File.Path, File.FullPath, Model = File.Model, TimeStamp = File.TimeStamp)\r
171 IdTable = TableIdentifier(self.Cur)\r
172 IdTable.Table = "Identifier%s" % FileID\r
173 IdTable.Create()\r
174\r
175 # Insert function of file\r
176 for Function in File.FunctionList:\r
177 FunctionID = self.TblFunction.Insert(Function.Header, Function.Modifier, Function.Name, Function.ReturnStatement, \\r
178 Function.StartLine, Function.StartColumn, Function.EndLine, Function.EndColumn, \\r
179 Function.BodyStartLine, Function.BodyStartColumn, FileID, \\r
180 Function.FunNameStartLine, Function.FunNameStartColumn)\r
181\r
182 # Insert Identifier of function\r
183 for Identifier in Function.IdentifierList:\r
184 IdentifierID = IdTable.Insert(Identifier.Modifier, Identifier.Type, Identifier.Name, Identifier.Value, Identifier.Model, \\r
185 FileID, FunctionID, Identifier.StartLine, Identifier.StartColumn, Identifier.EndLine, Identifier.EndColumn)\r
186 # Insert Identifier of file\r
187 for Identifier in File.IdentifierList:\r
188 IdentifierID = IdTable.Insert(Identifier.Modifier, Identifier.Type, Identifier.Name, Identifier.Value, Identifier.Model, \\r
189 FileID, -1, Identifier.StartLine, Identifier.StartColumn, Identifier.EndLine, Identifier.EndColumn)\r
190\r
191 EdkLogger.verbose("Insert information from file %s ... DONE!" % File.FullPath)\r
192\r
193 ## UpdateIdentifierBelongsToFunction() method\r
194 #\r
fb0b35e0 195 # Update the field "BelongsToFunction" for each Identifier\r
52302d4d
LG
196 #\r
197 # @param self: The object pointer\r
198 #\r
199 def UpdateIdentifierBelongsToFunction(self):\r
200 EdkLogger.verbose("Update 'BelongsToFunction' for Identifiers started ...")\r
201\r
202 SqlCommand = """select ID, BelongsToFile, StartLine, EndLine from Function"""\r
203 Records = self.TblFunction.Exec(SqlCommand)\r
204 Data1 = []\r
205 Data2 = []\r
206 for Record in Records:\r
207 FunctionID = Record[0]\r
208 BelongsToFile = Record[1]\r
209 StartLine = Record[2]\r
210 EndLine = Record[3]\r
211\r
212 SqlCommand = """Update Identifier%s set BelongsToFunction = %s where BelongsToFile = %s and StartLine > %s and EndLine < %s""" % \\r
213 (BelongsToFile, FunctionID, BelongsToFile, StartLine, EndLine)\r
214 self.TblIdentifier.Exec(SqlCommand)\r
215\r
216 SqlCommand = """Update Identifier%s set BelongsToFunction = %s, Model = %s where BelongsToFile = %s and Model = %s and EndLine = %s""" % \\r
217 (BelongsToFile, FunctionID, DataClass.MODEL_IDENTIFIER_FUNCTION_HEADER, BelongsToFile, DataClass.MODEL_IDENTIFIER_COMMENT, StartLine - 1)\r
218 self.TblIdentifier.Exec(SqlCommand)\r
219\r
220\r
221##\r
222#\r
223# This acts like the main() function for the script, unless it is 'import'ed into another\r
224# script.\r
225#\r
226if __name__ == '__main__':\r
227 EdkLogger.Initialize()\r
228 EdkLogger.SetLevel(EdkLogger.DEBUG_0)\r
229 EdkLogger.verbose("Start at " + time.strftime('%H:%M:%S', time.localtime()))\r
230\r
231 Db = Database(DATABASE_PATH)\r
232 Db.InitDatabase()\r
233 Db.QueryTable(Db.TblDataModel)\r
234\r
235 identifier1 = DataClass.IdentifierClass(-1, '', '', "i''1", 'aaa', DataClass.MODEL_IDENTIFIER_COMMENT, 1, -1, 32, 43, 54, 43)\r
236 identifier2 = DataClass.IdentifierClass(-1, '', '', 'i1', 'aaa', DataClass.MODEL_IDENTIFIER_COMMENT, 1, -1, 15, 43, 20, 43)\r
237 identifier3 = DataClass.IdentifierClass(-1, '', '', 'i1', 'aaa', DataClass.MODEL_IDENTIFIER_COMMENT, 1, -1, 55, 43, 58, 43)\r
238 identifier4 = DataClass.IdentifierClass(-1, '', '', "i1'", 'aaa', DataClass.MODEL_IDENTIFIER_COMMENT, 1, -1, 77, 43, 88, 43)\r
239 fun1 = DataClass.FunctionClass(-1, '', '', 'fun1', '', 21, 2, 60, 45, 1, 23, 0, [], [])\r
240 file = DataClass.FileClass(-1, 'F1', 'c', 'C:\\', 'C:\\F1.exe', DataClass.MODEL_FILE_C, '2007-12-28', [fun1], [identifier1, identifier2, identifier3, identifier4], [])\r
241 Db.InsertOneFile(file)\r
242\r
243 Db.QueryTable(Db.TblFile)\r
244 Db.QueryTable(Db.TblFunction)\r
245 Db.QueryTable(Db.TblIdentifier)\r
246\r
247 Db.Close()\r
248 EdkLogger.verbose("End at " + time.strftime('%H:%M:%S', time.localtime()))\r
249\r