]>
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 - 2014, 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
173 def __init__(self
, Cursor
):
174 Table
.__init
__(self
, Cursor
, 'File')
178 # Insert a record into table File
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
187 def Insert(self
, Name
, ExtName
, Path
, FullPath
, Model
, TimeStamp
):
188 (Name
, ExtName
, Path
, FullPath
) = ConvertToSqlString((Name
, ExtName
, Path
, FullPath
))
201 # Insert one file to table
203 # @param FileFullPath: The full path of the file
204 # @param Model: The model of the file
206 # @retval FileID: The ID after record is inserted
208 def InsertFile(self
, File
, Model
):
218 ## Get ID of a given file
220 # @param FilePath Path of file
222 # @retval ID ID value of given file in the table
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:
229 return RecordList
[0][0]
231 ## Get type of a given file
233 # @param FileId ID of a file
235 # @retval file_type Model value of given file in the table
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:
242 return RecordList
[0][0]
244 ## Get file timestamp of a given file
246 # @param FileId ID of file
248 # @retval timestamp TimeStamp value of given file in the table
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:
255 return RecordList
[0][0]
257 ## Update the timestamp of a given file
259 # @param FileId ID of file
260 # @param TimeStamp Time stamp of file
262 def SetFileTimeStamp(self
, FileId
, TimeStamp
):
263 self
.Exec("update %s set TimeStamp=%s where ID='%s'" % (self
.Table
, TimeStamp
, FileId
))
265 ## Get list of file with given type
267 # @param FileType Type value of file
269 # @retval file_list List of files with the given type
271 def GetFileList(self
, FileType
):
272 RecordList
= self
.Exec("select FullPath from %s where Model=%s" % (self
.Table
, FileType
))
273 if len(RecordList
) == 0:
275 return [R
[0] for R
in RecordList
]
279 # This class defined a table used for data model
281 # @param object: Inherited from object class
284 class TableDataModel(Table
):
286 ID INTEGER PRIMARY KEY,
287 CrossIndex INTEGER NOT NULL,
288 Name VARCHAR NOT NULL,
291 def __init__(self
, Cursor
):
292 Table
.__init
__(self
, Cursor
, 'DataModel')
296 # Insert a record into table DataModel
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
303 def Insert(self
, CrossIndex
, Name
, Description
):
304 (Name
, Description
) = ConvertToSqlString((Name
, Description
))
305 return Table
.Insert(self
, CrossIndex
, Name
, Description
)
309 # Create all default records of table DataModel
312 EdkLogger
.verbose("\nInitialize table DataModel started ...")
313 Count
= self
.GetCount()
314 if Count
!= None and Count
!= 0:
316 for Item
in DataClass
.MODEL_LIST
:
319 Description
= Item
[0]
320 self
.Insert(CrossIndex
, Name
, Description
)
321 EdkLogger
.verbose("Initialize table DataModel ... DONE!")
325 # Get a model's cross index from its name
327 # @param ModelName: Name of the model
328 # @retval CrossIndex: CrossIndex of the model
330 def GetCrossIndex(self
, ModelName
):
332 SqlCommand
= """select CrossIndex from DataModel where name = '""" + ModelName
+ """'"""
333 self
.Cur
.execute(SqlCommand
)
334 for Item
in self
.Cur
: