]>
git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/Python/Workspace/MetaFileTable.py
2 # This file is used to create/update/query/erase a meta file table
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
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.
19 import Common
.EdkLogger
as EdkLogger
21 from MetaDataTable
import Table
, TableFile
22 from MetaDataTable
import ConvertToSqlString
23 from CommonDataClass
.DataClass
import MODEL_FILE_DSC
, MODEL_FILE_DEC
, MODEL_FILE_INF
, \
26 class MetaFileTable(Table
):
27 # TRICK: use file ID as the part before '.'
28 _ID_STEP_
= 0.00000001
32 def __init__(self
, Cursor
, MetaFile
, FileType
, Temporary
):
33 self
.MetaFile
= MetaFile
35 self
._FileIndexTable
= TableFile(Cursor
)
36 self
._FileIndexTable
.Create(False)
38 FileId
= self
._FileIndexTable
.GetFileId(MetaFile
)
40 FileId
= self
._FileIndexTable
.InsertFile(MetaFile
, FileType
)
43 TableName
= "_%s_%s_%s" % (FileType
, FileId
, uuid
.uuid4().hex)
45 TableName
= "_%s_%s" % (FileType
, FileId
)
47 #Table.__init__(self, Cursor, TableName, FileId, False)
48 Table
.__init
__(self
, Cursor
, TableName
, FileId
, Temporary
)
49 self
.Create(not self
.IsIntegrity())
51 def IsIntegrity(self
):
53 TimeStamp
= self
.MetaFile
.TimeStamp
54 Result
= self
.Cur
.execute("select ID from %s where ID<0" % (self
.Table
)).fetchall()
56 # update the timestamp in database
57 self
._FileIndexTable
.SetFileTimeStamp(self
.IdBase
, TimeStamp
)
60 if TimeStamp
!= self
._FileIndexTable
.GetFileTimeStamp(self
.IdBase
):
61 # update the timestamp in database
62 self
._FileIndexTable
.SetFileTimeStamp(self
.IdBase
, TimeStamp
)
64 except Exception, Exc
:
65 EdkLogger
.debug(EdkLogger
.DEBUG_5
, str(Exc
))
69 ## Python class representation of table storing module data
70 class ModuleTable(MetaFileTable
):
71 _ID_STEP_
= 0.00000001
75 Model INTEGER NOT NULL,
81 BelongsToItem REAL NOT NULL,
82 StartLine INTEGER NOT NULL,
83 StartColumn INTEGER NOT NULL,
84 EndLine INTEGER NOT NULL,
85 EndColumn INTEGER NOT NULL,
86 Enabled INTEGER DEFAULT 0
88 # used as table end flag, in case the changes to database is not committed to db file
89 _DUMMY_
= "-1, -1, '====', '====', '====', '====', '====', -1, -1, -1, -1, -1, -1"
92 def __init__(self
, Cursor
, MetaFile
, Temporary
):
93 MetaFileTable
.__init
__(self
, Cursor
, MetaFile
, MODEL_FILE_INF
, Temporary
)
95 ## Insert a record into table Inf
97 # @param Model: Model of a Inf item
98 # @param Value1: Value1 of a Inf item
99 # @param Value2: Value2 of a Inf item
100 # @param Value3: Value3 of a Inf item
101 # @param Scope1: Arch of a Inf item
102 # @param Scope2 Platform os a Inf item
103 # @param BelongsToItem: The item belongs to which another item
104 # @param StartLine: StartLine of a Inf item
105 # @param StartColumn: StartColumn of a Inf item
106 # @param EndLine: EndLine of a Inf item
107 # @param EndColumn: EndColumn of a Inf item
108 # @param Enabled: If this item enabled
110 def Insert(self
, Model
, Value1
, Value2
, Value3
, Scope1
='COMMON', Scope2
='COMMON',
111 BelongsToItem
=-1, StartLine
=-1, StartColumn
=-1, EndLine
=-1, EndColumn
=-1, Enabled
=0):
112 (Value1
, Value2
, Value3
, Scope1
, Scope2
) = ConvertToSqlString((Value1
, Value2
, Value3
, Scope1
, Scope2
))
131 # @param Model: The Model of Record
132 # @param Arch: The Arch attribute of Record
133 # @param Platform The Platform attribute of Record
135 # @retval: A recordSet of all found records
137 def Query(self
, Model
, Arch
=None, Platform
=None, BelongsToItem
=None):
138 ConditionString
= "Model=%s AND Enabled>=0" % Model
139 ValueString
= "Value1,Value2,Value3,Scope1,Scope2,ID,StartLine"
141 if Arch
!= None and Arch
!= 'COMMON':
142 ConditionString
+= " AND (Scope1='%s' OR Scope1='COMMON')" % Arch
143 if Platform
!= None and Platform
!= 'COMMON':
144 ConditionString
+= " AND (Scope2='%s' OR Scope2='COMMON' OR Scope2='DEFAULT')" % Platform
145 if BelongsToItem
!= None:
146 ConditionString
+= " AND BelongsToItem=%s" % BelongsToItem
148 SqlCommand
= "SELECT %s FROM %s WHERE %s" % (ValueString
, self
.Table
, ConditionString
)
149 return self
.Exec(SqlCommand
)
151 ## Python class representation of table storing package data
152 class PackageTable(MetaFileTable
):
155 Model INTEGER NOT NULL,
156 Value1 TEXT NOT NULL,
161 BelongsToItem REAL NOT NULL,
162 StartLine INTEGER NOT NULL,
163 StartColumn INTEGER NOT NULL,
164 EndLine INTEGER NOT NULL,
165 EndColumn INTEGER NOT NULL,
166 Enabled INTEGER DEFAULT 0
168 # used as table end flag, in case the changes to database is not committed to db file
169 _DUMMY_
= "-1, -1, '====', '====', '====', '====', '====', -1, -1, -1, -1, -1, -1"
172 def __init__(self
, Cursor
, MetaFile
, Temporary
):
173 MetaFileTable
.__init
__(self
, Cursor
, MetaFile
, MODEL_FILE_DEC
, Temporary
)
177 # Insert a record into table Dec
179 # @param Model: Model of a Dec item
180 # @param Value1: Value1 of a Dec item
181 # @param Value2: Value2 of a Dec item
182 # @param Value3: Value3 of a Dec item
183 # @param Scope1: Arch of a Dec item
184 # @param Scope2: Module type of a Dec item
185 # @param BelongsToItem: The item belongs to which another item
186 # @param StartLine: StartLine of a Dec item
187 # @param StartColumn: StartColumn of a Dec item
188 # @param EndLine: EndLine of a Dec item
189 # @param EndColumn: EndColumn of a Dec item
190 # @param Enabled: If this item enabled
192 def Insert(self
, Model
, Value1
, Value2
, Value3
, Scope1
='COMMON', Scope2
='COMMON',
193 BelongsToItem
=-1, StartLine
=-1, StartColumn
=-1, EndLine
=-1, EndColumn
=-1, Enabled
=0):
194 (Value1
, Value2
, Value3
, Scope1
, Scope2
) = ConvertToSqlString((Value1
, Value2
, Value3
, Scope1
, Scope2
))
213 # @param Model: The Model of Record
214 # @param Arch: The Arch attribute of Record
216 # @retval: A recordSet of all found records
218 def Query(self
, Model
, Arch
=None):
219 ConditionString
= "Model=%s AND Enabled>=0" % Model
220 ValueString
= "Value1,Value2,Value3,Scope1,ID,StartLine"
222 if Arch
!= None and Arch
!= 'COMMON':
223 ConditionString
+= " AND (Scope1='%s' OR Scope1='COMMON')" % Arch
225 SqlCommand
= "SELECT %s FROM %s WHERE %s" % (ValueString
, self
.Table
, ConditionString
)
226 return self
.Exec(SqlCommand
)
228 ## Python class representation of table storing platform data
229 class PlatformTable(MetaFileTable
):
232 Model INTEGER NOT NULL,
233 Value1 TEXT NOT NULL,
238 BelongsToItem REAL NOT NULL,
239 FromItem REAL NOT NULL,
240 StartLine INTEGER NOT NULL,
241 StartColumn INTEGER NOT NULL,
242 EndLine INTEGER NOT NULL,
243 EndColumn INTEGER NOT NULL,
244 Enabled INTEGER DEFAULT 0
246 # used as table end flag, in case the changes to database is not committed to db file
247 _DUMMY_
= "-1, -1, '====', '====', '====', '====', '====', -1, -1, -1, -1, -1, -1, -1"
250 def __init__(self
, Cursor
, MetaFile
, Temporary
):
251 MetaFileTable
.__init
__(self
, Cursor
, MetaFile
, MODEL_FILE_DSC
, Temporary
)
255 # Insert a record into table Dsc
257 # @param Model: Model of a Dsc item
258 # @param Value1: Value1 of a Dsc item
259 # @param Value2: Value2 of a Dsc item
260 # @param Value3: Value3 of a Dsc item
261 # @param Scope1: Arch of a Dsc item
262 # @param Scope2: Module type of a Dsc item
263 # @param BelongsToItem: The item belongs to which another item
264 # @param FromItem: The item belongs to which dsc file
265 # @param StartLine: StartLine of a Dsc item
266 # @param StartColumn: StartColumn of a Dsc item
267 # @param EndLine: EndLine of a Dsc item
268 # @param EndColumn: EndColumn of a Dsc item
269 # @param Enabled: If this item enabled
271 def Insert(self
, Model
, Value1
, Value2
, Value3
, Scope1
='COMMON', Scope2
='COMMON', BelongsToItem
=-1,
272 FromItem
=-1, StartLine
=-1, StartColumn
=-1, EndLine
=-1, EndColumn
=-1, Enabled
=1):
273 (Value1
, Value2
, Value3
, Scope1
, Scope2
) = ConvertToSqlString((Value1
, Value2
, Value3
, Scope1
, Scope2
))
293 # @param Model: The Model of Record
294 # @param Scope1: Arch of a Dsc item
295 # @param Scope2: Module type of a Dsc item
296 # @param BelongsToItem: The item belongs to which another item
297 # @param FromItem: The item belongs to which dsc file
299 # @retval: A recordSet of all found records
301 def Query(self
, Model
, Scope1
=None, Scope2
=None, BelongsToItem
=None, FromItem
=None):
302 ConditionString
= "Model=%s AND Enabled>0" % Model
303 ValueString
= "Value1,Value2,Value3,Scope1,Scope2,ID,StartLine"
305 if Scope1
!= None and Scope1
!= 'COMMON':
306 ConditionString
+= " AND (Scope1='%s' OR Scope1='COMMON')" % Scope1
307 if Scope2
!= None and Scope2
!= 'COMMON':
308 ConditionString
+= " AND (Scope2='%s' OR Scope2='COMMON' OR Scope2='DEFAULT')" % Scope2
310 if BelongsToItem
!= None:
311 ConditionString
+= " AND BelongsToItem=%s" % BelongsToItem
313 ConditionString
+= " AND BelongsToItem<0"
316 ConditionString
+= " AND FromItem=%s" % FromItem
318 SqlCommand
= "SELECT %s FROM %s WHERE %s" % (ValueString
, self
.Table
, ConditionString
)
319 return self
.Exec(SqlCommand
)
321 ## Factory class to produce different storage for different type of meta-file
322 class MetaFileStorage(object):
324 MODEL_FILE_INF
: ModuleTable
,
325 MODEL_FILE_DEC
: PackageTable
,
326 MODEL_FILE_DSC
: PlatformTable
,
327 MODEL_FILE_OTHERS
: MetaFileTable
,
331 ".inf" : MODEL_FILE_INF
,
332 ".dec" : MODEL_FILE_DEC
,
333 ".dsc" : MODEL_FILE_DSC
,
337 def __new__(Class
, Cursor
, MetaFile
, FileType
=None, Temporary
=False):
338 # no type given, try to find one
340 if MetaFile
.Type
in self
._FILE
_TYPE
_:
341 FileType
= Class
._FILE
_TYPE
_[MetaFile
.Type
]
343 FileType
= MODEL_FILE_OTHERS
345 # don't pass the type around if it's well known
346 if FileType
== MODEL_FILE_OTHERS
:
347 Args
= (Cursor
, MetaFile
, FileType
, Temporary
)
349 Args
= (Cursor
, MetaFile
, Temporary
)
351 # create the storage object and return it to caller
352 return Class
._FILE
_TABLE
_[FileType
](*Args
)