]>
git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/Python/Workspace/MetaDataTable.py
2 # This file is used to create/update/query/erase table for files
4 # Copyright (c) 2008 - 2018, 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
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.
17 import Common
.LongFilePathOs
as os
19 import Common
.EdkLogger
as EdkLogger
20 from CommonDataClass
import DataClass
21 from CommonDataClass
.DataClass
import FileClass
23 ## Convert to SQL required string format
24 def ConvertToSqlString(StringList
):
25 return map(lambda s
: "'" + s
.replace("'", "''") + "'", StringList
)
29 # This class defined a common table
31 # @param object: Inherited from object class
33 # @param Cursor: Cursor of the database
34 # @param TableName: Name of the table
42 def __init__(self
, Cursor
, Name
='', IdBase
=0, Temporary
=False):
45 self
.IdBase
= int(IdBase
)
47 self
.Temporary
= Temporary
56 def Create(self
, NewTable
=True):
61 SqlCommand
= """create temp table IF NOT EXISTS %s (%s)""" % (self
.Table
, self
._COLUMN
_)
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()
70 # Insert a record into a table
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
)
84 # Query all records of the table
87 SqlCommand
= """select * from %s""" % self
.Table
88 self
.Cur
.execute(SqlCommand
)
90 EdkLogger
.verbose(str(Rs
))
91 TotalCount
= self
.GetId()
98 SqlCommand
= """drop table IF EXISTS %s""" % self
.Table
99 self
.Cur
.execute(SqlCommand
)
103 # Get a count of all records of the table
105 # @retval Count: Total count of all records
108 SqlCommand
= """select count(ID) from %s""" % self
.Table
109 Record
= self
.Cur
.execute(SqlCommand
).fetchall()
113 SqlCommand
= """select max(ID) from %s""" % self
.Table
114 Record
= self
.Cur
.execute(SqlCommand
).fetchall()
120 ## Init the ID of the table
122 # Init the ID of the table
125 self
.ID
= self
.GetId()
129 # Exec Sql Command, return result
131 # @param SqlCommand: The SqlCommand to be executed
133 # @retval RecordSet: The result after executed
135 def Exec(self
, SqlCommand
):
136 EdkLogger
.debug(EdkLogger
.DEBUG_5
, SqlCommand
)
137 self
.Cur
.execute(SqlCommand
)
138 RecordSet
= self
.Cur
.fetchall()
141 def SetEndFlag(self
):
142 self
.Exec("insert into %s values(%s)" % (self
.Table
, self
._DUMMY
_))
144 # Need to execution commit for table data changed.
146 self
.Cur
.connection
.commit()
148 def IsIntegral(self
):
149 Result
= self
.Exec("select min(ID) from %s" % (self
.Table
))
150 if Result
[0][0] != -1:
155 return self
.Exec("select * from %s where ID > 0 order by ID" % (self
.Table
))
159 # This class defined a table used for file
161 # @param object: Inherited from object class
163 class TableFile(Table
):
165 ID INTEGER PRIMARY KEY,
166 Name VARCHAR NOT NULL,
169 FullPath VARCHAR NOT NULL,
170 Model INTEGER DEFAULT 0,
171 TimeStamp SINGLE NOT NULL,
172 FromItem REAL NOT NULL
174 def __init__(self
, Cursor
):
175 Table
.__init
__(self
, Cursor
, 'File')
179 # Insert a record into table File
181 # @param Name: Name of a File
182 # @param ExtName: ExtName of a File
183 # @param Path: Path of a File
184 # @param FullPath: FullPath of a File
185 # @param Model: Model of a File
186 # @param TimeStamp: TimeStamp of a File
188 def Insert(self
, Name
, ExtName
, Path
, FullPath
, Model
, TimeStamp
, FromItem
=0):
189 (Name
, ExtName
, Path
, FullPath
) = ConvertToSqlString((Name
, ExtName
, Path
, FullPath
))
203 # Insert one file to table
205 # @param FileFullPath: The full path of the file
206 # @param Model: The model of the file
208 # @retval FileID: The ID after record is inserted
210 def InsertFile(self
, File
, Model
, FromItem
=''):
230 ## Get ID of a given file
232 # @param FilePath Path of file
234 # @retval ID ID value of given file in the table
236 def GetFileId(self
, File
, FromItem
=None):
238 QueryScript
= "select ID from %s where FullPath = '%s' and FromItem = %s" % (self
.Table
, str(File
), str(FromItem
))
240 QueryScript
= "select ID from %s where FullPath = '%s'" % (self
.Table
, str(File
))
241 RecordList
= self
.Exec(QueryScript
)
242 if len(RecordList
) == 0:
244 return RecordList
[0][0]
246 ## Get type of a given file
248 # @param FileId ID of a file
250 # @retval file_type Model value of given file in the table
252 def GetFileType(self
, FileId
):
253 QueryScript
= "select Model from %s where ID = '%s'" % (self
.Table
, FileId
)
254 RecordList
= self
.Exec(QueryScript
)
255 if len(RecordList
) == 0:
257 return RecordList
[0][0]
259 ## Get file timestamp of a given file
261 # @param FileId ID of file
263 # @retval timestamp TimeStamp value of given file in the table
265 def GetFileTimeStamp(self
, FileId
):
266 QueryScript
= "select TimeStamp from %s where ID = '%s'" % (self
.Table
, FileId
)
267 RecordList
= self
.Exec(QueryScript
)
268 if len(RecordList
) == 0:
270 return RecordList
[0][0]
272 ## Update the timestamp of a given file
274 # @param FileId ID of file
275 # @param TimeStamp Time stamp of file
277 def SetFileTimeStamp(self
, FileId
, TimeStamp
):
278 self
.Exec("update %s set TimeStamp=%s where ID='%s'" % (self
.Table
, TimeStamp
, FileId
))
280 ## Get list of file with given type
282 # @param FileType Type value of file
284 # @retval file_list List of files with the given type
286 def GetFileList(self
, FileType
):
287 RecordList
= self
.Exec("select FullPath from %s where Model=%s" % (self
.Table
, FileType
))
288 if len(RecordList
) == 0:
290 return [R
[0] for R
in RecordList
]
294 # This class defined a table used for data model
296 # @param object: Inherited from object class
299 class TableDataModel(Table
):
301 ID INTEGER PRIMARY KEY,
302 CrossIndex INTEGER NOT NULL,
303 Name VARCHAR NOT NULL,
306 def __init__(self
, Cursor
):
307 Table
.__init
__(self
, Cursor
, 'DataModel')
311 # Insert a record into table DataModel
313 # @param ID: ID of a ModelType
314 # @param CrossIndex: CrossIndex of a ModelType
315 # @param Name: Name of a ModelType
316 # @param Description: Description of a ModelType
318 def Insert(self
, CrossIndex
, Name
, Description
):
319 (Name
, Description
) = ConvertToSqlString((Name
, Description
))
320 return Table
.Insert(self
, CrossIndex
, Name
, Description
)
324 # Create all default records of table DataModel
327 EdkLogger
.verbose("\nInitialize table DataModel started ...")
328 Count
= self
.GetCount()
329 if Count
is not None and Count
!= 0:
331 for Item
in DataClass
.MODEL_LIST
:
334 Description
= Item
[0]
335 self
.Insert(CrossIndex
, Name
, Description
)
336 EdkLogger
.verbose("Initialize table DataModel ... DONE!")
340 # Get a model's cross index from its name
342 # @param ModelName: Name of the model
343 # @retval CrossIndex: CrossIndex of the model
345 def GetCrossIndex(self
, ModelName
):
347 SqlCommand
= """select CrossIndex from DataModel where name = '""" + ModelName
+ """'"""
348 self
.Cur
.execute(SqlCommand
)
349 for Item
in self
.Cur
: