]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/Workspace/MetaDataTable.py
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[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
2e351cbe 5# SPDX-License-Identifier: BSD-2-Clause-Patent\r
30fdf114
LG
6#\r
7\r
8##\r
9# Import Modules\r
10#\r
1be2ed90 11import Common.LongFilePathOs as os\r
30fdf114
LG
12\r
13import Common.EdkLogger as EdkLogger\r
14from CommonDataClass import DataClass\r
15from CommonDataClass.DataClass import FileClass\r
16\r
17## Convert to SQL required string format\r
18def ConvertToSqlString(StringList):\r
f8d11e5a 19 return list(map(lambda s: "'" + s.replace("'", "''") + "'", StringList))\r
30fdf114
LG
20\r
21## TableFile\r
22#\r
23# This class defined a common table\r
24#\r
25# @param object: Inherited from object class\r
26#\r
27# @param Cursor: Cursor of the database\r
28# @param TableName: Name of the table\r
29#\r
30class Table(object):\r
31 _COLUMN_ = ''\r
32 _ID_STEP_ = 1\r
33 _ID_MAX_ = 0x80000000\r
34 _DUMMY_ = 0\r
35\r
2f818ed0
B
36 def __init__(self, Db, Name='', IdBase=0, Temporary=False):\r
37 self.Db = Db\r
30fdf114
LG
38 self.Table = Name\r
39 self.IdBase = int(IdBase)\r
40 self.ID = int(IdBase)\r
41 self.Temporary = Temporary\r
2f818ed0 42 self.Contents = []\r
30fdf114
LG
43\r
44 def __str__(self):\r
45 return self.Table\r
46\r
47 ## Create table\r
48 #\r
49 # Create a table\r
50 #\r
51 def Create(self, NewTable=True):\r
2f818ed0 52 self.Db.CreateEmptyTable(self.Table)\r
30fdf114
LG
53 self.ID = self.GetId()\r
54\r
55 ## Insert table\r
56 #\r
57 # Insert a record into a table\r
58 #\r
59 def Insert(self, *Args):\r
60 self.ID = self.ID + self._ID_STEP_\r
61 if self.ID >= (self.IdBase + self._ID_MAX_):\r
62 self.ID = self.IdBase + self._ID_STEP_\r
2f818ed0
B
63 row = [self.ID]\r
64 row.extend(Args)\r
65 self.Contents.append(row)\r
30fdf114 66\r
2f818ed0 67 return self.ID\r
30fdf114 68\r
30fdf114
LG
69\r
70 ## Get count\r
71 #\r
72 # Get a count of all records of the table\r
73 #\r
74 # @retval Count: Total count of all records\r
75 #\r
76 def GetCount(self):\r
2f818ed0
B
77 tab = self.Db.GetTable(self.Table)\r
78 return len(tab)\r
79\r
30fdf114
LG
80\r
81 def GetId(self):\r
2f818ed0
B
82 tab = self.Db.GetTable(self.Table)\r
83 Id = max([int(item[0]) for item in tab])\r
4231a819 84 if Id is None:\r
30fdf114
LG
85 Id = self.IdBase\r
86 return Id\r
87\r
88 ## Init the ID of the table\r
89 #\r
90 # Init the ID of the table\r
91 #\r
92 def InitID(self):\r
93 self.ID = self.GetId()\r
94\r
95 ## Exec\r
96 #\r
97 # Exec Sql Command, return result\r
98 #\r
99 # @param SqlCommand: The SqlCommand to be executed\r
100 #\r
101 # @retval RecordSet: The result after executed\r
102 #\r
103 def Exec(self, SqlCommand):\r
104 EdkLogger.debug(EdkLogger.DEBUG_5, SqlCommand)\r
2f818ed0
B
105 self.Db.execute(SqlCommand)\r
106 RecordSet = self.Db.fetchall()\r
30fdf114
LG
107 return RecordSet\r
108\r
109 def SetEndFlag(self):\r
2f818ed0
B
110 Tab = self.Db.GetTable(self.Table)\r
111 Tab.append(self._DUMMY_)\r
112\r
30fdf114
LG
113\r
114 def IsIntegral(self):\r
2f818ed0
B
115 tab = self.Db.GetTable(self.Table)\r
116 Id = min([int(item[0]) for item in tab])\r
117 if Id != -1:\r
30fdf114
LG
118 return False\r
119 return True\r
120\r
0d2711a6 121 def GetAll(self):\r
2f818ed0
B
122 tab = self.Db.GetTable(self.Table)\r
123 return tab\r
124\r
0d2711a6 125\r
30fdf114
LG
126## TableFile\r
127#\r
128# This class defined a table used for file\r
129#\r
130# @param object: Inherited from object class\r
131#\r
132class TableFile(Table):\r
133 _COLUMN_ = '''\r
134 ID INTEGER PRIMARY KEY,\r
135 Name VARCHAR NOT NULL,\r
136 ExtName VARCHAR,\r
137 Path VARCHAR,\r
138 FullPath VARCHAR NOT NULL,\r
139 Model INTEGER DEFAULT 0,\r
395f3336
YF
140 TimeStamp SINGLE NOT NULL,\r
141 FromItem REAL NOT NULL\r
30fdf114
LG
142 '''\r
143 def __init__(self, Cursor):\r
144 Table.__init__(self, Cursor, 'File')\r
145\r
146 ## Insert table\r
147 #\r
148 # Insert a record into table File\r
149 #\r
150 # @param Name: Name of a File\r
151 # @param ExtName: ExtName of a File\r
152 # @param Path: Path of a File\r
153 # @param FullPath: FullPath of a File\r
154 # @param Model: Model of a File\r
155 # @param TimeStamp: TimeStamp of a File\r
156 #\r
395f3336 157 def Insert(self, Name, ExtName, Path, FullPath, Model, TimeStamp, FromItem=0):\r
30fdf114
LG
158 (Name, ExtName, Path, FullPath) = ConvertToSqlString((Name, ExtName, Path, FullPath))\r
159 return Table.Insert(\r
160 self,\r
161 Name,\r
162 ExtName,\r
163 Path,\r
164 FullPath,\r
165 Model,\r
395f3336
YF
166 TimeStamp,\r
167 FromItem\r
30fdf114
LG
168 )\r
169\r
170 ## InsertFile\r
171 #\r
172 # Insert one file to table\r
173 #\r
174 # @param FileFullPath: The full path of the file\r
175 # @param Model: The model of the file\r
176 #\r
177 # @retval FileID: The ID after record is inserted\r
178 #\r
395f3336
YF
179 def InsertFile(self, File, Model, FromItem=''):\r
180 if FromItem:\r
181 return self.Insert(\r
182 File.Name,\r
183 File.Ext,\r
184 File.Dir,\r
185 File.Path,\r
186 Model,\r
187 File.TimeStamp,\r
188 FromItem\r
189 )\r
30fdf114 190 return self.Insert(\r
0d2711a6
LG
191 File.Name,\r
192 File.Ext,\r
193 File.Dir,\r
194 File.Path,\r
195 Model,\r
196 File.TimeStamp\r
197 )\r
30fdf114 198\r
30fdf114
LG
199 ## Get type of a given file\r
200 #\r
201 # @param FileId ID of a file\r
202 #\r
203 # @retval file_type Model value of given file in the table\r
204 #\r
205 def GetFileType(self, FileId):\r
206 QueryScript = "select Model from %s where ID = '%s'" % (self.Table, FileId)\r
207 RecordList = self.Exec(QueryScript)\r
208 if len(RecordList) == 0:\r
209 return None\r
210 return RecordList[0][0]\r
211\r
212 ## Get file timestamp of a given file\r
213 #\r
214 # @param FileId ID of file\r
215 #\r
216 # @retval timestamp TimeStamp value of given file in the table\r
217 #\r
218 def GetFileTimeStamp(self, FileId):\r
219 QueryScript = "select TimeStamp from %s where ID = '%s'" % (self.Table, FileId)\r
220 RecordList = self.Exec(QueryScript)\r
221 if len(RecordList) == 0:\r
222 return None\r
223 return RecordList[0][0]\r
224\r
225 ## Update the timestamp of a given file\r
226 #\r
227 # @param FileId ID of file\r
228 # @param TimeStamp Time stamp of file\r
229 #\r
230 def SetFileTimeStamp(self, FileId, TimeStamp):\r
231 self.Exec("update %s set TimeStamp=%s where ID='%s'" % (self.Table, TimeStamp, FileId))\r
232\r
233 ## Get list of file with given type\r
234 #\r
235 # @param FileType Type value of file\r
236 #\r
237 # @retval file_list List of files with the given type\r
238 #\r
239 def GetFileList(self, FileType):\r
240 RecordList = self.Exec("select FullPath from %s where Model=%s" % (self.Table, FileType))\r
241 if len(RecordList) == 0:\r
242 return []\r
243 return [R[0] for R in RecordList]\r
244\r
245## TableDataModel\r
246#\r
247# This class defined a table used for data model\r
248#\r
249# @param object: Inherited from object class\r
250#\r
251#\r
252class TableDataModel(Table):\r
253 _COLUMN_ = """\r
254 ID INTEGER PRIMARY KEY,\r
255 CrossIndex INTEGER NOT NULL,\r
256 Name VARCHAR NOT NULL,\r
257 Description VARCHAR\r
258 """\r
259 def __init__(self, Cursor):\r
260 Table.__init__(self, Cursor, 'DataModel')\r
261\r
262 ## Insert table\r
263 #\r
264 # Insert a record into table DataModel\r
265 #\r
266 # @param ID: ID of a ModelType\r
267 # @param CrossIndex: CrossIndex of a ModelType\r
268 # @param Name: Name of a ModelType\r
269 # @param Description: Description of a ModelType\r
270 #\r
271 def Insert(self, CrossIndex, Name, Description):\r
272 (Name, Description) = ConvertToSqlString((Name, Description))\r
273 return Table.Insert(self, CrossIndex, Name, Description)\r
274\r
275 ## Init table\r
276 #\r
277 # Create all default records of table DataModel\r
278 #\r
279 def InitTable(self):\r
280 EdkLogger.verbose("\nInitialize table DataModel started ...")\r
281 Count = self.GetCount()\r
4231a819 282 if Count is not None and Count != 0:\r
30fdf114
LG
283 return\r
284 for Item in DataClass.MODEL_LIST:\r
285 CrossIndex = Item[1]\r
286 Name = Item[0]\r
287 Description = Item[0]\r
288 self.Insert(CrossIndex, Name, Description)\r
289 EdkLogger.verbose("Initialize table DataModel ... DONE!")\r
290\r
291 ## Get CrossIndex\r
292 #\r
293 # Get a model's cross index from its name\r
294 #\r
295 # @param ModelName: Name of the model\r
296 # @retval CrossIndex: CrossIndex of the model\r
297 #\r
298 def GetCrossIndex(self, ModelName):\r
299 CrossIndex = -1\r
300 SqlCommand = """select CrossIndex from DataModel where name = '""" + ModelName + """'"""\r
2f818ed0
B
301 self.Db.execute(SqlCommand)\r
302 for Item in self.Db:\r
30fdf114
LG
303 CrossIndex = Item[0]\r
304\r
305 return CrossIndex\r
306\r