16d44bb615e7e5b52f2ff38d04831479b1f29c09
[people/mcb30/basetools.git] / Source / Python / Ecc / Database.py
1 ## @file\r
2 # This file is used to create a database used by ECC tool\r
3 #\r
4 # Copyright (c) 2007, Intel Corporation\r
5 # All rights reserved. This program and the accompanying materials\r
6 # are licensed and made available under the terms and conditions of the BSD License\r
7 # which accompanies this distribution.  The full text of the license may be found at\r
8 # http://opensource.org/licenses/bsd-license.php\r
9 #\r
10 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12 #\r
13 \r
14 ##\r
15 # Import Modules\r
16 #\r
17 import sqlite3\r
18 import os\r
19 \r
20 import Common.EdkLogger as EdkLogger\r
21 import CommonDataClass.DataClass as DataClass\r
22 \r
23 from Table.TableDataModel import TableDataModel\r
24 from Table.TableFile import TableFile\r
25 from Table.TableFunction import TableFunction\r
26 from Table.TablePcd import TablePcd\r
27 from Table.TableIdentifier import TableIdentifier\r
28 \r
29 ##\r
30 # Static definitions\r
31 #\r
32 DATABASE_PATH = "Database/Ecc.db"\r
33 \r
34 ## Database\r
35 #\r
36 # This class defined the ECC databse\r
37 # During the phase of initialization, the database will create all tables and\r
38 # insert all records of table DataModel\r
39\r
40 # @param object:    Inherited from object class\r
41 # @param DbPath:    A string for the path of the ECC database\r
42 #\r
43 # @var Conn:        Connection of the ECC database\r
44 # @var Cur:         Cursor of the connection\r
45 # @var TblDataModel:  Local instance for TableDataModel\r
46 #\r
47 class Database(object):\r
48     def __init__(self, DbPath):\r
49         self.Conn = sqlite3.connect(DbPath)\r
50         self.Cur = self.Conn.cursor()\r
51         self.TblDataModel = TableDataModel(self.Cur)\r
52         self.TblFile = TableFile(self.Cur)\r
53         self.TblFunction = TableFunction(self.Cur)\r
54         self.TblIdentifier = TableIdentifier(self.Cur)\r
55         self.TblPcd = TablePcd(self.Cur)\r
56     \r
57     ## Initialize ECC database\r
58     #\r
59     # 1. Delete all old existing tables\r
60     # 2. Create new tables\r
61     # 3. Initialize table DataModel\r
62     #\r
63     def InitDatabase(self):\r
64         EdkLogger.verbose("\nInitialize ECC database started ...")\r
65         #\r
66         # Drop all old existing tables\r
67         #\r
68         self.TblDataModel.Drop()\r
69         self.TblFile.Drop()\r
70         self.TblFunction.Drop()\r
71         self.TblPcd.Drop()\r
72         self.TblIdentifier.Drop()\r
73         \r
74         #\r
75         # Create new tables\r
76         #\r
77         self.TblDataModel.Create()\r
78         self.TblFile.Create()\r
79         self.TblFunction.Create()\r
80         self.TblPcd.Create()\r
81         self.TblIdentifier.Create()\r
82         \r
83         #\r
84         # Initialize table DataModel\r
85         #\r
86         self.TblDataModel.InitTable()\r
87         EdkLogger.verbose("Initialize ECC database ... DONE!")\r
88 \r
89     ## Query a table\r
90     #\r
91     # @param Table:  The instance of the table to be queried\r
92     #\r
93     def QueryTable(self, Table):\r
94         Table.Query()\r
95     \r
96     ## Insert one file information\r
97     #\r
98     # Insert one file's information to the database\r
99     # 1. Create a record in TableFile\r
100     # 2. Create functions one by one\r
101     #    2.1 Create variables of function one by one\r
102     #    2.2 Create pcds of function one by one\r
103     # 3. Create variables one by one\r
104     # 4. Create pcds one by one\r
105     #\r
106     def InsertOneFile(self, File):\r
107         #\r
108         # Insert a record for file\r
109         #\r
110         FileID = self.TblFile.GetCount() + 1\r
111         self.TblFile.Insert(FileID, File.Name, File.ExtName, File.Path, File.FullPath, Model = File.Model)\r
112 \r
113         #\r
114         # Insert function of file\r
115         #\r
116         for Function in File.FunctionList:\r
117             FunctionID = self.TblFunction.GetCount() + 1\r
118             self.TblFunction.Insert(FunctionID, Function.Header, Function.Modifier, Function.Name, Function.ReturnStatement, \\r
119                                     Function.StartLine, Function.StartColumn, Function.EndLine, Function.EndColumn, FileID)\r
120             #\r
121             # Insert Identifier of function\r
122             #\r
123             for Identifier in Function.IdentifierList:\r
124                 IdentifierID = self.TblIdentifier.GetCount() + 1\r
125                 self.TblIdentifier.Insert(IdentifierID, Identifier.Modifier, Identifier.Type, Identifier.Name, Identifier.Value, Identifier.Model, \\r
126                                         FileID, FunctionID, Identifier.StartLine, Identifier.StartColumn, Identifier.EndLine, Identifier.EndColumn)\r
127             #\r
128             # Insert Pcd of function\r
129             #\r
130             for Pcd in Function.PcdList:\r
131                 PcdID = self.TblPcd.GetCount() + 1\r
132                 self.TblPcd.Insert(PcdID, Pcd.CName, Pcd.TokenSpaceGuidCName, Pcd.Token, Pcd.DatumType, Pcd.Model, \\r
133                                    FileID, FunctionID, Pcd.StartLine, Pcd.StartColumn, Pcd.EndLine, Pcd.EndColumn)\r
134         #\r
135         # Insert Identifier of file\r
136         #\r
137         for Identifier in File.IdentifierList:\r
138             IdentifierID = self.TblIdentifier.GetCount() + 1\r
139             self.TblIdentifier.Insert(IdentifierID, Identifier.Modifier, Identifier.Type, Identifier.Name, Identifier.Value, Identifier.Model, \\r
140                                     FileID, -1, Identifier.StartLine, Identifier.StartColumn, Identifier.EndLine, Identifier.EndColumn)\r
141         #\r
142         # Insert Pcd of file\r
143         #\r
144         for Pcd in File.PcdList:\r
145             PcdID = self.TblPcd.GetCount() + 1\r
146             self.TblPcd.Insert(PcdID, Pcd.CName, Pcd.TokenSpaceGuidCName, Pcd.Token, Pcd.DatumType, Pcd.Model, \\r
147                                FileID, -1, Pcd.StartLine, Pcd.StartColumn, Pcd.EndLine, Pcd.EndColumn)\r
148                 \r
149         EdkLogger.verbose("Insert information of file %s ... DONE!" % File.FullPath)\r
150 \r
151     ## UpdateIdentifierBelongsToFunction\r
152     #\r
153     # Update the field "BelongsToFunction" for each Indentifier\r
154     #\r
155     #\r
156     def UpdateIdentifierBelongsToFunction(self):\r
157         EdkLogger.verbose("Update 'BelongsToFunction' for Identifiers started ...")\r
158         \r
159         SqlCommand = """select ID, BelongsToFile, StartLine, EndLine, Model from Identifier"""\r
160         EdkLogger.debug(4, "SqlCommand: %s" %SqlCommand)\r
161         self.Cur.execute(SqlCommand)\r
162         Records = self.Cur.fetchall()\r
163         for Record in Records:\r
164             IdentifierID = Record[0]\r
165             BelongsToFile = Record[1]\r
166             StartLine = Record[2]\r
167             EndLine = Record[3]\r
168             Model = Record[4]\r
169 \r
170             #\r
171             # Check whether an identifier belongs to a function\r
172             #\r
173             EdkLogger.debug(4, "For common identifiers ... ")\r
174             SqlCommand = """select ID from Function \r
175                         where StartLine < %s and EndLine > %s\r
176                         and BelongsToFile = %s""" % (StartLine, EndLine, BelongsToFile)\r
177             EdkLogger.debug(4, "SqlCommand: %s" %SqlCommand)\r
178             self.Cur.execute(SqlCommand)\r
179             IDs = self.Cur.fetchall()\r
180             for ID in IDs:\r
181                 SqlCommand = """Update Identifier set BelongsToFunction = %s where ID = %s""" % (ID[0], IdentifierID)\r
182                 EdkLogger.debug(4, "SqlCommand: %s" %SqlCommand)\r
183                 self.Cur.execute(SqlCommand)\r
184             \r
185             #\r
186             # Check whether the identifier is a function header\r
187             #\r
188             EdkLogger.debug(4, "For function headers ... ") \r
189             if Model == DataClass.MODEL_IDENTIFIER_COMMENT:\r
190                 SqlCommand = """select ID from Function \r
191                         where StartLine = %s + 1\r
192                         and BelongsToFile = %s""" % (EndLine, BelongsToFile)\r
193                 EdkLogger.debug(4, "SqlCommand: %s" %SqlCommand)\r
194                 self.Cur.execute(SqlCommand)\r
195                 IDs = self.Cur.fetchall()\r
196                 for ID in IDs:\r
197                     SqlCommand = """Update Identifier set BelongsToFunction = %s, Model = %s where ID = %s""" % (ID[0], DataClass.MODEL_IDENTIFIER_FUNCTION_HEADER, IdentifierID)\r
198                     EdkLogger.debug(4, "SqlCommand: %s" %SqlCommand)\r
199                     self.Cur.execute(SqlCommand)\r
200         \r
201         EdkLogger.verbose("Update 'BelongsToFunction' for Identifiers ... DONE")\r
202 \r
203 ##\r
204 #\r
205 # This acts like the main() function for the script, unless it is 'import'ed into another\r
206 # script.\r
207 #\r
208 if __name__ == '__main__':\r
209     EdkLogger.SetLevel(EdkLogger.DEBUG_0)\r
210     \r
211     Db = Database(DATABASE_PATH)\r
212     Db.InitDatabase()\r
213     Db.QueryTable(Db.TblDataModel)\r
214     \r
215     identifier1 = DataClass.IdentifierClass(-1, '', '', 'i1', 'aaa', DataClass.MODEL_IDENTIFIER_COMMENT, 1, -1, 32,  43,  54,  43)\r
216     identifier2 = DataClass.IdentifierClass(-1, '', '', 'i1', 'aaa', DataClass.MODEL_IDENTIFIER_COMMENT, 1, -1, 15,  43,  20,  43)\r
217     identifier3 = DataClass.IdentifierClass(-1, '', '', 'i1', 'aaa', DataClass.MODEL_IDENTIFIER_COMMENT, 1, -1, 55,  43,  58,  43)\r
218     identifier4 = DataClass.IdentifierClass(-1, '', '', 'i1', 'aaa', DataClass.MODEL_IDENTIFIER_COMMENT, 1, -1, 77,  43,  88,  43)\r
219     fun1 = DataClass.FunctionClass(-1, '', '', 'fun1', '', 21, 2, 60,  45, 1, [], [])\r
220     file = DataClass.FileClass(-1, 'F1', 'c', 'C:\\', 'C:\\F1.exe', DataClass.MODEL_FILE_C, [fun1], [identifier1, identifier2, identifier3, identifier4], [])\r
221     Db.InsertOneFile(file)\r
222     Db.UpdateIdentifierBelongsToFunction()\r
223         \r
224     Db.QueryTable(Db.TblFile)\r
225     Db.QueryTable(Db.TblFunction)\r
226     Db.QueryTable(Db.TblPcd)\r
227     Db.QueryTable(Db.TblIdentifier)\r
228