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