]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/Workspace/MetaDataTable.py
CryptoPkg: Fix GCC build break for BaseCryptLib.
[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
40d841f6
LG
4# Copyright (c) 2008, Intel Corporation. All rights reserved.<BR>\r
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
17import os\r
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
76 Values = ", ".join([str(Arg) for Arg in Args])\r
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
116 if Id == None:\r
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
143\r
144 def IsIntegral(self):\r
145 Result = self.Exec("select min(ID) from %s" % (self.Table))\r
146 if Result[0][0] != -1:\r
147 return False\r
148 return True\r
149\r
150## TableFile\r
151#\r
152# This class defined a table used for file\r
153#\r
154# @param object: Inherited from object class\r
155#\r
156class TableFile(Table):\r
157 _COLUMN_ = '''\r
158 ID INTEGER PRIMARY KEY,\r
159 Name VARCHAR NOT NULL,\r
160 ExtName VARCHAR,\r
161 Path VARCHAR,\r
162 FullPath VARCHAR NOT NULL,\r
163 Model INTEGER DEFAULT 0,\r
164 TimeStamp SINGLE NOT NULL\r
165 '''\r
166 def __init__(self, Cursor):\r
167 Table.__init__(self, Cursor, 'File')\r
168\r
169 ## Insert table\r
170 #\r
171 # Insert a record into table File\r
172 #\r
173 # @param Name: Name of a File\r
174 # @param ExtName: ExtName of a File\r
175 # @param Path: Path of a File\r
176 # @param FullPath: FullPath of a File\r
177 # @param Model: Model of a File\r
178 # @param TimeStamp: TimeStamp of a File\r
179 #\r
180 def Insert(self, Name, ExtName, Path, FullPath, Model, TimeStamp):\r
181 (Name, ExtName, Path, FullPath) = ConvertToSqlString((Name, ExtName, Path, FullPath))\r
182 return Table.Insert(\r
183 self,\r
184 Name,\r
185 ExtName,\r
186 Path,\r
187 FullPath,\r
188 Model,\r
189 TimeStamp\r
190 )\r
191\r
192 ## InsertFile\r
193 #\r
194 # Insert one file to table\r
195 #\r
196 # @param FileFullPath: The full path of the file\r
197 # @param Model: The model of the file\r
198 #\r
199 # @retval FileID: The ID after record is inserted\r
200 #\r
201 def InsertFile(self, FileFullPath, Model):\r
202 (Filepath, Name) = os.path.split(FileFullPath)\r
203 (Root, Ext) = os.path.splitext(FileFullPath)\r
204 TimeStamp = os.stat(FileFullPath)[8]\r
205 File = FileClass(-1, Name, Ext, Filepath, FileFullPath, Model, '', [], [], [])\r
206 return self.Insert(\r
207 Name,\r
208 Ext,\r
209 Filepath,\r
210 FileFullPath,\r
211 Model,\r
212 TimeStamp\r
213 )\r
214\r
215 ## Get ID of a given file\r
216 #\r
217 # @param FilePath Path of file\r
218 #\r
219 # @retval ID ID value of given file in the table\r
220 #\r
221 def GetFileId(self, FilePath):\r
222 QueryScript = "select ID from %s where FullPath = '%s'" % (self.Table, FilePath)\r
223 RecordList = self.Exec(QueryScript)\r
224 if len(RecordList) == 0:\r
225 return None\r
226 return RecordList[0][0]\r
227\r
228 ## Get type of a given file\r
229 #\r
230 # @param FileId ID of a file\r
231 #\r
232 # @retval file_type Model value of given file in the table\r
233 #\r
234 def GetFileType(self, FileId):\r
235 QueryScript = "select Model from %s where ID = '%s'" % (self.Table, FileId)\r
236 RecordList = self.Exec(QueryScript)\r
237 if len(RecordList) == 0:\r
238 return None\r
239 return RecordList[0][0]\r
240\r
241 ## Get file timestamp of a given file\r
242 #\r
243 # @param FileId ID of file\r
244 #\r
245 # @retval timestamp TimeStamp value of given file in the table\r
246 #\r
247 def GetFileTimeStamp(self, FileId):\r
248 QueryScript = "select TimeStamp from %s where ID = '%s'" % (self.Table, FileId)\r
249 RecordList = self.Exec(QueryScript)\r
250 if len(RecordList) == 0:\r
251 return None\r
252 return RecordList[0][0]\r
253\r
254 ## Update the timestamp of a given file\r
255 #\r
256 # @param FileId ID of file\r
257 # @param TimeStamp Time stamp of file\r
258 #\r
259 def SetFileTimeStamp(self, FileId, TimeStamp):\r
260 self.Exec("update %s set TimeStamp=%s where ID='%s'" % (self.Table, TimeStamp, FileId))\r
261\r
262 ## Get list of file with given type\r
263 #\r
264 # @param FileType Type value of file\r
265 #\r
266 # @retval file_list List of files with the given type\r
267 #\r
268 def GetFileList(self, FileType):\r
269 RecordList = self.Exec("select FullPath from %s where Model=%s" % (self.Table, FileType))\r
270 if len(RecordList) == 0:\r
271 return []\r
272 return [R[0] for R in RecordList]\r
273\r
274## TableDataModel\r
275#\r
276# This class defined a table used for data model\r
277#\r
278# @param object: Inherited from object class\r
279#\r
280#\r
281class TableDataModel(Table):\r
282 _COLUMN_ = """\r
283 ID INTEGER PRIMARY KEY,\r
284 CrossIndex INTEGER NOT NULL,\r
285 Name VARCHAR NOT NULL,\r
286 Description VARCHAR\r
287 """\r
288 def __init__(self, Cursor):\r
289 Table.__init__(self, Cursor, 'DataModel')\r
290\r
291 ## Insert table\r
292 #\r
293 # Insert a record into table DataModel\r
294 #\r
295 # @param ID: ID of a ModelType\r
296 # @param CrossIndex: CrossIndex of a ModelType\r
297 # @param Name: Name of a ModelType\r
298 # @param Description: Description of a ModelType\r
299 #\r
300 def Insert(self, CrossIndex, Name, Description):\r
301 (Name, Description) = ConvertToSqlString((Name, Description))\r
302 return Table.Insert(self, CrossIndex, Name, Description)\r
303\r
304 ## Init table\r
305 #\r
306 # Create all default records of table DataModel\r
307 #\r
308 def InitTable(self):\r
309 EdkLogger.verbose("\nInitialize table DataModel started ...")\r
310 Count = self.GetCount()\r
311 if Count != None and Count != 0:\r
312 return\r
313 for Item in DataClass.MODEL_LIST:\r
314 CrossIndex = Item[1]\r
315 Name = Item[0]\r
316 Description = Item[0]\r
317 self.Insert(CrossIndex, Name, Description)\r
318 EdkLogger.verbose("Initialize table DataModel ... DONE!")\r
319\r
320 ## Get CrossIndex\r
321 #\r
322 # Get a model's cross index from its name\r
323 #\r
324 # @param ModelName: Name of the model\r
325 # @retval CrossIndex: CrossIndex of the model\r
326 #\r
327 def GetCrossIndex(self, ModelName):\r
328 CrossIndex = -1\r
329 SqlCommand = """select CrossIndex from DataModel where name = '""" + ModelName + """'"""\r
330 self.Cur.execute(SqlCommand)\r
331 for Item in self.Cur:\r
332 CrossIndex = Item[0]\r
333\r
334 return CrossIndex\r
335\r