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