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