]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/Workspace/MetaDataTable.py
BaseTools: Fix two drivers include the same file issue
[mirror_edk2.git] / BaseTools / Source / Python / Workspace / MetaDataTable.py
CommitLineData
30fdf114
LG
1## @file\r
2# This file is used to create/update/query/erase table for files\r
3#\r
8252e6bf 4# Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved.<BR>\r
40d841f6 5# This program and the accompanying materials\r
30fdf114
LG
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
1be2ed90 17import Common.LongFilePathOs as os\r
30fdf114
LG
18\r
19import Common.EdkLogger as EdkLogger\r
20from CommonDataClass import DataClass\r
21from CommonDataClass.DataClass import FileClass\r
22\r
23## Convert to SQL required string format\r
24def ConvertToSqlString(StringList):\r
25 return map(lambda s: "'" + s.replace("'", "''") + "'", StringList)\r
26\r
27## TableFile\r
28#\r
29# This class defined a common table\r
30#\r
31# @param object: Inherited from object class\r
32#\r
33# @param Cursor: Cursor of the database\r
34# @param TableName: Name of the table\r
35#\r
36class Table(object):\r
37 _COLUMN_ = ''\r
38 _ID_STEP_ = 1\r
39 _ID_MAX_ = 0x80000000\r
40 _DUMMY_ = 0\r
41\r
42 def __init__(self, Cursor, Name='', IdBase=0, Temporary=False):\r
43 self.Cur = Cursor\r
44 self.Table = Name\r
45 self.IdBase = int(IdBase)\r
46 self.ID = int(IdBase)\r
47 self.Temporary = Temporary\r
48\r
49 def __str__(self):\r
50 return self.Table\r
51\r
52 ## Create table\r
53 #\r
54 # Create a table\r
55 #\r
56 def Create(self, NewTable=True):\r
57 if NewTable:\r
58 self.Drop()\r
59\r
60 if self.Temporary:\r
61 SqlCommand = """create temp table IF NOT EXISTS %s (%s)""" % (self.Table, self._COLUMN_)\r
62 else:\r
63 SqlCommand = """create table IF NOT EXISTS %s (%s)""" % (self.Table, self._COLUMN_)\r
64 EdkLogger.debug(EdkLogger.DEBUG_8, SqlCommand)\r
65 self.Cur.execute(SqlCommand)\r
66 self.ID = self.GetId()\r
67\r
68 ## Insert table\r
69 #\r
70 # Insert a record into a table\r
71 #\r
72 def Insert(self, *Args):\r
73 self.ID = self.ID + self._ID_STEP_\r
74 if self.ID >= (self.IdBase + self._ID_MAX_):\r
75 self.ID = self.IdBase + self._ID_STEP_\r
8252e6bf 76 Values = ", ".join(str(Arg) for Arg in Args)\r
30fdf114
LG
77 SqlCommand = "insert into %s values(%s, %s)" % (self.Table, self.ID, Values)\r
78 EdkLogger.debug(EdkLogger.DEBUG_5, SqlCommand)\r
79 self.Cur.execute(SqlCommand)\r
80 return self.ID\r
81\r
82 ## Query table\r
83 #\r
84 # Query all records of the table\r
85 #\r
86 def Query(self):\r
87 SqlCommand = """select * from %s""" % self.Table\r
88 self.Cur.execute(SqlCommand)\r
89 for Rs in self.Cur:\r
90 EdkLogger.verbose(str(Rs))\r
91 TotalCount = self.GetId()\r
92\r
93 ## Drop a table\r
94 #\r
95 # Drop the table\r
96 #\r
97 def Drop(self):\r
98 SqlCommand = """drop table IF EXISTS %s""" % self.Table\r
99 self.Cur.execute(SqlCommand)\r
100\r
101 ## Get count\r
102 #\r
103 # Get a count of all records of the table\r
104 #\r
105 # @retval Count: Total count of all records\r
106 #\r
107 def GetCount(self):\r
108 SqlCommand = """select count(ID) from %s""" % self.Table\r
109 Record = self.Cur.execute(SqlCommand).fetchall()\r
110 return Record[0][0]\r
111\r
112 def GetId(self):\r
113 SqlCommand = """select max(ID) from %s""" % self.Table\r
114 Record = self.Cur.execute(SqlCommand).fetchall()\r
115 Id = Record[0][0]\r
4231a819 116 if Id is None:\r
30fdf114
LG
117 Id = self.IdBase\r
118 return Id\r
119\r
120 ## Init the ID of the table\r
121 #\r
122 # Init the ID of the table\r
123 #\r
124 def InitID(self):\r
125 self.ID = self.GetId()\r
126\r
127 ## Exec\r
128 #\r
129 # Exec Sql Command, return result\r
130 #\r
131 # @param SqlCommand: The SqlCommand to be executed\r
132 #\r
133 # @retval RecordSet: The result after executed\r
134 #\r
135 def Exec(self, SqlCommand):\r
136 EdkLogger.debug(EdkLogger.DEBUG_5, SqlCommand)\r
137 self.Cur.execute(SqlCommand)\r
138 RecordSet = self.Cur.fetchall()\r
139 return RecordSet\r
140\r
141 def SetEndFlag(self):\r
142 self.Exec("insert into %s values(%s)" % (self.Table, self._DUMMY_))\r
0d2711a6
LG
143 #\r
144 # Need to execution commit for table data changed.\r
145 #\r
146 self.Cur.connection.commit()\r
30fdf114
LG
147\r
148 def IsIntegral(self):\r
149 Result = self.Exec("select min(ID) from %s" % (self.Table))\r
150 if Result[0][0] != -1:\r
151 return False\r
152 return True\r
153\r
0d2711a6
LG
154 def GetAll(self):\r
155 return self.Exec("select * from %s where ID > 0 order by ID" % (self.Table))\r
156\r
30fdf114
LG
157## TableFile\r
158#\r
159# This class defined a table used for file\r
160#\r
161# @param object: Inherited from object class\r
162#\r
163class TableFile(Table):\r
164 _COLUMN_ = '''\r
165 ID INTEGER PRIMARY KEY,\r
166 Name VARCHAR NOT NULL,\r
167 ExtName VARCHAR,\r
168 Path VARCHAR,\r
169 FullPath VARCHAR NOT NULL,\r
170 Model INTEGER DEFAULT 0,\r
395f3336
YF
171 TimeStamp SINGLE NOT NULL,\r
172 FromItem REAL NOT NULL\r
30fdf114
LG
173 '''\r
174 def __init__(self, Cursor):\r
175 Table.__init__(self, Cursor, 'File')\r
176\r
177 ## Insert table\r
178 #\r
179 # Insert a record into table File\r
180 #\r
181 # @param Name: Name of a File\r
182 # @param ExtName: ExtName of a File\r
183 # @param Path: Path of a File\r
184 # @param FullPath: FullPath of a File\r
185 # @param Model: Model of a File\r
186 # @param TimeStamp: TimeStamp of a File\r
187 #\r
395f3336 188 def Insert(self, Name, ExtName, Path, FullPath, Model, TimeStamp, FromItem=0):\r
30fdf114
LG
189 (Name, ExtName, Path, FullPath) = ConvertToSqlString((Name, ExtName, Path, FullPath))\r
190 return Table.Insert(\r
191 self,\r
192 Name,\r
193 ExtName,\r
194 Path,\r
195 FullPath,\r
196 Model,\r
395f3336
YF
197 TimeStamp,\r
198 FromItem\r
30fdf114
LG
199 )\r
200\r
201 ## InsertFile\r
202 #\r
203 # Insert one file to table\r
204 #\r
205 # @param FileFullPath: The full path of the file\r
206 # @param Model: The model of the file\r
207 #\r
208 # @retval FileID: The ID after record is inserted\r
209 #\r
395f3336
YF
210 def InsertFile(self, File, Model, FromItem=''):\r
211 if FromItem:\r
212 return self.Insert(\r
213 File.Name,\r
214 File.Ext,\r
215 File.Dir,\r
216 File.Path,\r
217 Model,\r
218 File.TimeStamp,\r
219 FromItem\r
220 )\r
30fdf114 221 return self.Insert(\r
0d2711a6
LG
222 File.Name,\r
223 File.Ext,\r
224 File.Dir,\r
225 File.Path,\r
226 Model,\r
227 File.TimeStamp\r
228 )\r
30fdf114
LG
229\r
230 ## Get ID of a given file\r
231 #\r
232 # @param FilePath Path of file\r
233 #\r
234 # @retval ID ID value of given file in the table\r
235 #\r
395f3336
YF
236 def GetFileId(self, File, FromItem=None):\r
237 if FromItem:\r
238 QueryScript = "select ID from %s where FullPath = '%s' and FromItem = %s" % (self.Table, str(File), str(FromItem))\r
239 else:\r
240 QueryScript = "select ID from %s where FullPath = '%s'" % (self.Table, str(File))\r
30fdf114
LG
241 RecordList = self.Exec(QueryScript)\r
242 if len(RecordList) == 0:\r
243 return None\r
244 return RecordList[0][0]\r
245\r
246 ## Get type of a given file\r
247 #\r
248 # @param FileId ID of a file\r
249 #\r
250 # @retval file_type Model value of given file in the table\r
251 #\r
252 def GetFileType(self, FileId):\r
253 QueryScript = "select Model from %s where ID = '%s'" % (self.Table, FileId)\r
254 RecordList = self.Exec(QueryScript)\r
255 if len(RecordList) == 0:\r
256 return None\r
257 return RecordList[0][0]\r
258\r
259 ## Get file timestamp of a given file\r
260 #\r
261 # @param FileId ID of file\r
262 #\r
263 # @retval timestamp TimeStamp value of given file in the table\r
264 #\r
265 def GetFileTimeStamp(self, FileId):\r
266 QueryScript = "select TimeStamp from %s where ID = '%s'" % (self.Table, FileId)\r
267 RecordList = self.Exec(QueryScript)\r
268 if len(RecordList) == 0:\r
269 return None\r
270 return RecordList[0][0]\r
271\r
272 ## Update the timestamp of a given file\r
273 #\r
274 # @param FileId ID of file\r
275 # @param TimeStamp Time stamp of file\r
276 #\r
277 def SetFileTimeStamp(self, FileId, TimeStamp):\r
278 self.Exec("update %s set TimeStamp=%s where ID='%s'" % (self.Table, TimeStamp, FileId))\r
279\r
280 ## Get list of file with given type\r
281 #\r
282 # @param FileType Type value of file\r
283 #\r
284 # @retval file_list List of files with the given type\r
285 #\r
286 def GetFileList(self, FileType):\r
287 RecordList = self.Exec("select FullPath from %s where Model=%s" % (self.Table, FileType))\r
288 if len(RecordList) == 0:\r
289 return []\r
290 return [R[0] for R in RecordList]\r
291\r
292## TableDataModel\r
293#\r
294# This class defined a table used for data model\r
295#\r
296# @param object: Inherited from object class\r
297#\r
298#\r
299class TableDataModel(Table):\r
300 _COLUMN_ = """\r
301 ID INTEGER PRIMARY KEY,\r
302 CrossIndex INTEGER NOT NULL,\r
303 Name VARCHAR NOT NULL,\r
304 Description VARCHAR\r
305 """\r
306 def __init__(self, Cursor):\r
307 Table.__init__(self, Cursor, 'DataModel')\r
308\r
309 ## Insert table\r
310 #\r
311 # Insert a record into table DataModel\r
312 #\r
313 # @param ID: ID of a ModelType\r
314 # @param CrossIndex: CrossIndex of a ModelType\r
315 # @param Name: Name of a ModelType\r
316 # @param Description: Description of a ModelType\r
317 #\r
318 def Insert(self, CrossIndex, Name, Description):\r
319 (Name, Description) = ConvertToSqlString((Name, Description))\r
320 return Table.Insert(self, CrossIndex, Name, Description)\r
321\r
322 ## Init table\r
323 #\r
324 # Create all default records of table DataModel\r
325 #\r
326 def InitTable(self):\r
327 EdkLogger.verbose("\nInitialize table DataModel started ...")\r
328 Count = self.GetCount()\r
4231a819 329 if Count is not None and Count != 0:\r
30fdf114
LG
330 return\r
331 for Item in DataClass.MODEL_LIST:\r
332 CrossIndex = Item[1]\r
333 Name = Item[0]\r
334 Description = Item[0]\r
335 self.Insert(CrossIndex, Name, Description)\r
336 EdkLogger.verbose("Initialize table DataModel ... DONE!")\r
337\r
338 ## Get CrossIndex\r
339 #\r
340 # Get a model's cross index from its name\r
341 #\r
342 # @param ModelName: Name of the model\r
343 # @retval CrossIndex: CrossIndex of the model\r
344 #\r
345 def GetCrossIndex(self, ModelName):\r
346 CrossIndex = -1\r
347 SqlCommand = """select CrossIndex from DataModel where name = '""" + ModelName + """'"""\r
348 self.Cur.execute(SqlCommand)\r
349 for Item in self.Cur:\r
350 CrossIndex = Item[0]\r
351\r
352 return CrossIndex\r
353\r