1. Change key word "Variable" to "Identifier", all related items are changed
[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 from TableDataModel import TableDataModel\r
20 from TableFile import TableFile\r
21 from TableFunction import TableFunction\r
22 from TablePcd import TablePcd\r
23 from TableIdentifier import TableIdentifier\r
24 import Common.EdkLogger as EdkLogger\r
25 import DataClass\r
26 \r
27 ##\r
28 # Static definitions\r
29 #\r
30 DATABASE_PATH = "Database/Ecc.db"\r
31 \r
32 ## TableDataModel\r
33 #\r
34 # This class defined the ECC databse\r
35 # During the phase of initialization, the database will create all tables and\r
36 # insert all records of table DataModel\r
37\r
38 # @param object:    Inherited from object class\r
39 # @param DbPath:    A string for the path of the ECC database\r
40 #\r
41 # @var Conn:        Connection of the ECC database\r
42 # @var Cur:         Cursor of the connection\r
43 # @var TblDataModel:  Local instance for TableDataModel\r
44 #\r
45 class Database(object):\r
46     def __init__(self, DbPath):\r
47         EdkLogger.SetLevel(EdkLogger.DEBUG_0)\r
48         self.Conn = sqlite3.connect(DbPath)\r
49         self.Cur = self.Conn.cursor()\r
50         self.TblDataModel = TableDataModel(self.Cur)\r
51         self.TblFile = TableFile(self.Cur)\r
52         self.TblFunction = TableFunction(self.Cur)\r
53         self.TblIdentifier = TableIdentifier(self.Cur)\r
54         self.TblPcd = TablePcd(self.Cur)\r
55     \r
56     ## Initialize ECC database\r
57     #\r
58     # 1. Delete all old existing tables\r
59     # 2. Create new tables\r
60     # 3. Initialize table DataModel\r
61     #\r
62     def InitDatabase(self):\r
63         EdkLogger.verbose("\nInitialize ECC database started ...")\r
64         #\r
65         # Drop all old existing tables\r
66         #\r
67         self.TblDataModel.Drop()\r
68         self.TblFile.Drop()\r
69         self.TblFunction.Drop()\r
70         self.TblPcd.Drop()\r
71         self.TblIdentifier.Drop()\r
72         \r
73         #\r
74         # Create new tables\r
75         #\r
76         self.TblDataModel.Create()\r
77         self.TblFile.Create()\r
78         self.TblFunction.Create()\r
79         self.TblPcd.Create()\r
80         self.TblIdentifier.Create()\r
81         \r
82         #\r
83         # Initialize table DataModel\r
84         #\r
85         self.TblDataModel.InitTable()\r
86         EdkLogger.verbose("Initialize ECC database ... DONE!")\r
87 \r
88     ## Query a table\r
89     #\r
90     # @param Table:  The instance of the table to be queried\r
91     #\r
92     def QueryTable(self, Table):\r
93         Table.Query()\r
94     \r
95     ## Insert one file information\r
96     #\r
97     # Insert one file's information to the database\r
98     # 1. Create a record in TableFile\r
99     # 2. Create functions one by one\r
100     #    2.1 Create variables of function one by one\r
101     #    2.2 Create pcds of function one by one\r
102     # 3. Create variables one by one\r
103     # 4. Create pcds one by one\r
104     #\r
105     def InsertOneFile(self, File):\r
106         #\r
107         # Insert a record for file\r
108         #\r
109         FileID = self.TblFile.GetCount() + 1\r
110         self.TblFile.Insert(FileID, File.Name, File.ExtName, File.Path, File.FullPath, Model = File.Model)\r
111 \r
112         #\r
113         # Insert function of file\r
114         #\r
115         for Function in File.FunctionList:\r
116             FunctionID = self.TblFunction.GetCount() + 1\r
117             self.TblFunction.Insert(FunctionID, Function.Header, Function.Modifier, Function.Name, Function.ReturnStatement, \\r
118                                     Function.StartLine, Function.StartColumn, Function.EndLine, Function.EndColumn, FileID)\r
119             #\r
120             # Insert Identifier of function\r
121             #\r
122             for Identifier in Function.IdentifierList:\r
123                 IdentifierID = self.TblIdentifier.GetCount() + 1\r
124                 self.TblIdentifier.Insert(IdentifierID, Identifier.Modifier, Identifier.Type, Identifier.Name, Identifier.Value, Identifier.Model, \\r
125                                         FileID, FunctionID, Identifier.StartLine, Identifier.StartColumn, Identifier.EndLine, Identifier.EndColumn)\r
126             #\r
127             # Insert Pcd of function\r
128             #\r
129             for Pcd in Function.PcdList:\r
130                 PcdID = self.TblPcd.GetCount() + 1\r
131                 self.TblPcd.Insert(PcdID, Pcd.CName, Pcd.TokenSpaceGuidCName, Pcd.Token, Pcd.DatumType, Pcd.Model, \\r
132                                    FileID, FunctionID, Pcd.StartLine, Pcd.StartColumn, Pcd.EndLine, Pcd.EndColumn)\r
133         #\r
134         # Insert Identifier of file\r
135         #\r
136         for Identifier in File.IdentifierList:\r
137             IdentifierID = self.TblIdentifier.GetCount() + 1\r
138             self.TblIdentifier.Insert(IdentifierID, Identifier.Modifier, Identifier.Type, Identifier.Name, Identifier.Value, Identifier.Model, \\r
139                                     FileID, -1, Identifier.StartLine, Identifier.StartColumn, Identifier.EndLine, Identifier.EndColumn)\r
140         #\r
141         # Insert Pcd of file\r
142         #\r
143         for Pcd in File.PcdList:\r
144             PcdID = self.TblPcd.GetCount() + 1\r
145             self.TblPcd.Insert(PcdID, Pcd.CName, Pcd.TokenSpaceGuidCName, Pcd.Token, Pcd.DatumType, Pcd.Model, \\r
146                                FileID, -1, Pcd.StartLine, Pcd.StartColumn, Pcd.EndLine, Pcd.EndColumn)\r
147                 \r
148         EdkLogger.verbose("Insert information of file %s ... DONE!" % File.FullPath)\r
149 \r
150     ## UpdateIdentifierBelongsToFunction\r
151     #\r
152     # Update the field "BelongsToFunction" for each Indentifier\r
153     #\r
154     #\r
155     def UpdateIdentifierBelongsToFunction(self):\r
156         EdkLogger.verbose("Update 'BelongsToFunction' for Identifiers started ...")\r
157         \r
158         SqlCommand = """select ID, BelongsToFile, StartLine, EndLine, Model from Identifier"""\r
159         EdkLogger.debug(4, SqlCommand)\r
160         self.Cur.execute(SqlCommand)\r
161         Records = self.Cur.fetchall()\r
162         for Record in Records:\r
163             IdentifierID = Record[0]\r
164             BelongsToFile = Record[1]\r
165             StartLine = Record[2]\r
166             EndLine = Record[3]\r
167             Model = Record[4]\r
168 \r
169             EdkLogger.debug(4, "For common identifiers ... ")\r
170             SqlCommand = """select ID from Function \r
171                         where StartLine < %s and EndLine > %s\r
172                         and BelongsToFile = %s""" % (StartLine, EndLine, BelongsToFile)\r
173             EdkLogger.debug(4, SqlCommand)\r
174             self.Cur.execute(SqlCommand)\r
175             IDs = self.Cur.fetchall()\r
176             for ID in IDs:\r
177                 SqlCommand = """Update Identifier set BelongsToFunction = %s where ID = %s""" % (ID[0], IdentifierID)\r
178                 EdkLogger.debug(4, SqlCommand)\r
179                 self.Cur.execute(SqlCommand)\r
180             \r
181             EdkLogger.debug(4, "For function headers ... ") \r
182             if Model == DataClass.MODEL_IDENTIFIER_COMMENT:\r
183                 SqlCommand = """select ID from Function \r
184                         where StartLine = %s + 1\r
185                         and BelongsToFile = %s""" % (EndLine, BelongsToFile)\r
186                 EdkLogger.debug(4, SqlCommand)\r
187                 self.Cur.execute(SqlCommand)\r
188                 IDs = self.Cur.fetchall()\r
189                 for ID in IDs:\r
190                     SqlCommand = """Update Identifier set BelongsToFunction = %s, Model = %s where ID = %s""" % (ID[0], DataClass.MODEL_IDENTIFIER_FUNCTION_HEADER, IdentifierID)\r
191                     EdkLogger.debug(4, SqlCommand)\r
192                     self.Cur.execute(SqlCommand)\r
193         \r
194         EdkLogger.verbose("Update 'BelongsToFunction' for Identifiers ... DONE")\r
195 \r
196 ##\r
197 #\r
198 # This acts like the main() function for the script, unless it is 'import'ed into another\r
199 # script.\r
200 #\r
201 if __name__ == '__main__':\r
202     Db = Database(DATABASE_PATH)\r
203     Db.InitDatabase()\r
204     Db.QueryTable(Db.TblDataModel)\r
205     \r
206     identifier1 = DataClass.IdentifierClass(-1, '', '', 'i1', 'aaa', DataClass.MODEL_IDENTIFIER_COMMENT, 1, -1, 32,  43,  54,  43)\r
207     identifier2 = DataClass.IdentifierClass(-1, '', '', 'i1', 'aaa', DataClass.MODEL_IDENTIFIER_COMMENT, 1, -1, 15,  43,  20,  43)\r
208     identifier3 = DataClass.IdentifierClass(-1, '', '', 'i1', 'aaa', DataClass.MODEL_IDENTIFIER_COMMENT, 1, -1, 55,  43,  58,  43)\r
209     identifier4 = DataClass.IdentifierClass(-1, '', '', 'i1', 'aaa', DataClass.MODEL_IDENTIFIER_COMMENT, 1, -1, 77,  43,  88,  43)\r
210     fun1 = DataClass.FunctionClass(-1, '', '', 'fun1', '', 21, 2, 60,  45, 1, [], [])\r
211     file = DataClass.FileClass(-1, 'F1', 'c', 'C:\\', 'C:\\F1.exe', DataClass.MODEL_FILE_C, [fun1], [identifier1, identifier2, identifier3, identifier4], [])\r
212     Db.InsertOneFile(file)\r
213     Db.UpdateIdentifierBelongsToFunction()\r
214         \r
215     Db.QueryTable(Db.TblFile)\r
216     Db.QueryTable(Db.TblFunction)\r
217     Db.QueryTable(Db.TblPcd)\r
218     Db.QueryTable(Db.TblIdentifier)\r
219