1. Adjust the structure of TableFile
[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, TimeStamp = File.TimeStamp)\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, \\r
120                                     Function.BodyStartLine, Function.BodyStartColumn, FileID)\r
121             #\r
122             # Insert Identifier of function\r
123             #\r
124             for Identifier in Function.IdentifierList:\r
125                 IdentifierID = self.TblIdentifier.GetCount() + 1\r
126                 self.TblIdentifier.Insert(IdentifierID, Identifier.Modifier, Identifier.Type, Identifier.Name, Identifier.Value, Identifier.Model, \\r
127                                         FileID, FunctionID, Identifier.StartLine, Identifier.StartColumn, Identifier.EndLine, Identifier.EndColumn)\r
128             #\r
129             # Insert Pcd of function\r
130             #\r
131             for Pcd in Function.PcdList:\r
132                 PcdID = self.TblPcd.GetCount() + 1\r
133                 self.TblPcd.Insert(PcdID, Pcd.CName, Pcd.TokenSpaceGuidCName, Pcd.Token, Pcd.DatumType, Pcd.Model, \\r
134                                    FileID, FunctionID, Pcd.StartLine, Pcd.StartColumn, Pcd.EndLine, Pcd.EndColumn)\r
135         #\r
136         # Insert Identifier of file\r
137         #\r
138         for Identifier in File.IdentifierList:\r
139             IdentifierID = self.TblIdentifier.GetCount() + 1\r
140             self.TblIdentifier.Insert(IdentifierID, Identifier.Modifier, Identifier.Type, Identifier.Name, Identifier.Value, Identifier.Model, \\r
141                                     FileID, -1, Identifier.StartLine, Identifier.StartColumn, Identifier.EndLine, Identifier.EndColumn)\r
142         #\r
143         # Insert Pcd of file\r
144         #\r
145         for Pcd in File.PcdList:\r
146             PcdID = self.TblPcd.GetCount() + 1\r
147             self.TblPcd.Insert(PcdID, Pcd.CName, Pcd.TokenSpaceGuidCName, Pcd.Token, Pcd.DatumType, Pcd.Model, \\r
148                                FileID, -1, Pcd.StartLine, Pcd.StartColumn, Pcd.EndLine, Pcd.EndColumn)\r
149                 \r
150         EdkLogger.verbose("Insert information of file %s ... DONE!" % File.FullPath)\r
151 \r
152     ## UpdateIdentifierBelongsToFunction\r
153     #\r
154     # Update the field "BelongsToFunction" for each Indentifier\r
155     #\r
156     #\r
157     def UpdateIdentifierBelongsToFunction(self):\r
158         EdkLogger.verbose("Update 'BelongsToFunction' for Identifiers started ...")\r
159         \r
160         SqlCommand = """select ID, BelongsToFile, StartLine, EndLine, Model from Identifier"""\r
161         EdkLogger.debug(4, "SqlCommand: %s" %SqlCommand)\r
162         self.Cur.execute(SqlCommand)\r
163         Records = self.Cur.fetchall()\r
164         for Record in Records:\r
165             IdentifierID = Record[0]\r
166             BelongsToFile = Record[1]\r
167             StartLine = Record[2]\r
168             EndLine = Record[3]\r
169             Model = Record[4]\r
170 \r
171             #\r
172             # Check whether an identifier belongs to a function\r
173             #\r
174             EdkLogger.debug(4, "For common identifiers ... ")\r
175             SqlCommand = """select ID from Function \r
176                         where StartLine < %s and EndLine > %s\r
177                         and BelongsToFile = %s""" % (StartLine, EndLine, BelongsToFile)\r
178             EdkLogger.debug(4, "SqlCommand: %s" %SqlCommand)\r
179             self.Cur.execute(SqlCommand)\r
180             IDs = self.Cur.fetchall()\r
181             for ID in IDs:\r
182                 SqlCommand = """Update Identifier set BelongsToFunction = %s where ID = %s""" % (ID[0], IdentifierID)\r
183                 EdkLogger.debug(4, "SqlCommand: %s" %SqlCommand)\r
184                 self.Cur.execute(SqlCommand)\r
185             \r
186             #\r
187             # Check whether the identifier is a function header\r
188             #\r
189             EdkLogger.debug(4, "For function headers ... ") \r
190             if Model == DataClass.MODEL_IDENTIFIER_COMMENT:\r
191                 SqlCommand = """select ID from Function \r
192                         where StartLine = %s + 1\r
193                         and BelongsToFile = %s""" % (EndLine, BelongsToFile)\r
194                 EdkLogger.debug(4, "SqlCommand: %s" %SqlCommand)\r
195                 self.Cur.execute(SqlCommand)\r
196                 IDs = self.Cur.fetchall()\r
197                 for ID in IDs:\r
198                     SqlCommand = """Update Identifier set BelongsToFunction = %s, Model = %s where ID = %s""" % (ID[0], DataClass.MODEL_IDENTIFIER_FUNCTION_HEADER, IdentifierID)\r
199                     EdkLogger.debug(4, "SqlCommand: %s" %SqlCommand)\r
200                     self.Cur.execute(SqlCommand)\r
201         \r
202         EdkLogger.verbose("Update 'BelongsToFunction' for Identifiers ... DONE")\r
203 \r
204 ##\r
205 #\r
206 # This acts like the main() function for the script, unless it is 'import'ed into another\r
207 # script.\r
208 #\r
209 if __name__ == '__main__':\r
210     EdkLogger.SetLevel(EdkLogger.DEBUG_0)\r
211     \r
212     Db = Database(DATABASE_PATH)\r
213     Db.InitDatabase()\r
214     Db.QueryTable(Db.TblDataModel)\r
215     \r
216     identifier1 = DataClass.IdentifierClass(-1, '', '', 'i1', 'aaa', DataClass.MODEL_IDENTIFIER_COMMENT, 1, -1, 32,  43,  54,  43)\r
217     identifier2 = DataClass.IdentifierClass(-1, '', '', 'i1', 'aaa', DataClass.MODEL_IDENTIFIER_COMMENT, 1, -1, 15,  43,  20,  43)\r
218     identifier3 = DataClass.IdentifierClass(-1, '', '', 'i1', 'aaa', DataClass.MODEL_IDENTIFIER_COMMENT, 1, -1, 55,  43,  58,  43)\r
219     identifier4 = DataClass.IdentifierClass(-1, '', '', 'i1', 'aaa', DataClass.MODEL_IDENTIFIER_COMMENT, 1, -1, 77,  43,  88,  43)\r
220     fun1 = DataClass.FunctionClass(-1, '', '', 'fun1', '', 21, 2, 60,  45, 1, 23, 0, [], [])\r
221     file = DataClass.FileClass(-1, 'F1', 'c', 'C:\\', 'C:\\F1.exe', DataClass.MODEL_FILE_C, '2007-12-28', [fun1], [identifier1, identifier2, identifier3, identifier4], [])\r
222     Db.InsertOneFile(file)\r
223     Db.UpdateIdentifierBelongsToFunction()\r
224         \r
225     Db.QueryTable(Db.TblFile)\r
226     Db.QueryTable(Db.TblFunction)\r
227     Db.QueryTable(Db.TblPcd)\r
228     Db.QueryTable(Db.TblIdentifier)\r
229