]> git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/Python/Ecc/MetaFileWorkspace/MetaFileTable.py
54a3016948b1fbe762296b11901c99e3cdf6dd47
[mirror_edk2.git] / BaseTools / Source / Python / Ecc / MetaFileWorkspace / MetaFileTable.py
1 ## @file
2 # This file is used to create/update/query/erase a meta file table
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 uuid
18
19 import Common.EdkLogger as EdkLogger
20 import EccGlobalData
21
22 from MetaDataTable import Table
23 from MetaDataTable import ConvertToSqlString
24 from CommonDataClass.DataClass import MODEL_FILE_DSC, MODEL_FILE_DEC, MODEL_FILE_INF, \
25 MODEL_FILE_OTHERS
26
27 class MetaFileTable(Table):
28 ## Constructor
29 def __init__(self, Cursor, MetaFile, FileType, TableName, Temporary = False):
30 self.MetaFile = MetaFile
31 self.TblFile = EccGlobalData.gDb.TblFile
32 if (FileType == MODEL_FILE_INF):
33 TableName = "Inf"
34 if (FileType == MODEL_FILE_DSC):
35 if Temporary:
36 TableName = "_%s_%s" % ("Dsc", uuid.uuid4().hex)
37 else:
38 TableName = "Dsc"
39 if (FileType == MODEL_FILE_DEC):
40 TableName = "Dec"
41
42 Table.__init__(self, Cursor, TableName, 0, Temporary)
43 self.Create(False)
44
45
46 ## Python class representation of table storing module data
47 class ModuleTable(MetaFileTable):
48 _COLUMN_ = '''
49 ID REAL PRIMARY KEY,
50 Model INTEGER NOT NULL,
51 Value1 TEXT NOT NULL,
52 Value2 TEXT,
53 Value3 TEXT,
54 Usage TEXT,
55 Scope1 TEXT,
56 Scope2 TEXT,
57 BelongsToItem REAL NOT NULL,
58 BelongsToFile SINGLE NOT NULL,
59 StartLine INTEGER NOT NULL,
60 StartColumn INTEGER NOT NULL,
61 EndLine INTEGER NOT NULL,
62 EndColumn INTEGER NOT NULL,
63 Enabled INTEGER DEFAULT 0
64 '''
65 # used as table end flag, in case the changes to database is not committed to db file
66 _DUMMY_ = "-1, -1, '====', '====', '====', '====', '====', -1, -1, -1, -1, -1, -1, -1"
67
68 ## Constructor
69 def __init__(self, Cursor):
70 MetaFileTable.__init__(self, Cursor, '', MODEL_FILE_INF, "Inf", False)
71
72 ## Insert a record into table Inf
73 #
74 # @param Model: Model of a Inf item
75 # @param Value1: Value1 of a Inf item
76 # @param Value2: Value2 of a Inf item
77 # @param Value3: Value3 of a Inf item
78 # @param Scope1: Arch of a Inf item
79 # @param Scope2 Platform os a Inf item
80 # @param BelongsToItem: The item belongs to which another item
81 # @param StartLine: StartLine of a Inf item
82 # @param StartColumn: StartColumn of a Inf item
83 # @param EndLine: EndLine of a Inf item
84 # @param EndColumn: EndColumn of a Inf item
85 # @param Enabled: If this item enabled
86 #
87 def Insert(self, Model, Value1, Value2, Value3, Scope1='COMMON', Scope2='COMMON',
88 BelongsToItem=-1, BelongsToFile = -1, StartLine=-1, StartColumn=-1, EndLine=-1, EndColumn=-1, Enabled=0, Usage=''):
89 (Value1, Value2, Value3, Usage, Scope1, Scope2) = ConvertToSqlString((Value1, Value2, Value3, Usage, Scope1, Scope2))
90 return Table.Insert(
91 self,
92 Model,
93 Value1,
94 Value2,
95 Value3,
96 Usage,
97 Scope1,
98 Scope2,
99 BelongsToItem,
100 BelongsToFile,
101 StartLine,
102 StartColumn,
103 EndLine,
104 EndColumn,
105 Enabled
106 )
107
108 ## Query table
109 #
110 # @param Model: The Model of Record
111 # @param Arch: The Arch attribute of Record
112 # @param Platform The Platform attribute of Record
113 #
114 # @retval: A recordSet of all found records
115 #
116 def Query(self, Model, Arch=None, Platform=None):
117 ConditionString = "Model=%s AND Enabled>=0" % Model
118 ValueString = "Value1,Value2,Value3,Usage,Scope1,Scope2,ID,StartLine"
119
120 if Arch != None and Arch != 'COMMON':
121 ConditionString += " AND (Scope1='%s' OR Scope1='COMMON')" % Arch
122 if Platform != None and Platform != 'COMMON':
123 ConditionString += " AND (Scope2='%s' OR Scope2='COMMON' OR Scope2='DEFAULT')" % Platform
124
125 SqlCommand = "SELECT %s FROM %s WHERE %s" % (ValueString, self.Table, ConditionString)
126 return self.Exec(SqlCommand)
127
128 ## Python class representation of table storing package data
129 class PackageTable(MetaFileTable):
130 _COLUMN_ = '''
131 ID REAL PRIMARY KEY,
132 Model INTEGER NOT NULL,
133 Value1 TEXT NOT NULL,
134 Value2 TEXT,
135 Value3 TEXT,
136 Scope1 TEXT,
137 Scope2 TEXT,
138 BelongsToItem REAL NOT NULL,
139 BelongsToFile SINGLE NOT NULL,
140 StartLine INTEGER NOT NULL,
141 StartColumn INTEGER NOT NULL,
142 EndLine INTEGER NOT NULL,
143 EndColumn INTEGER NOT NULL,
144 Enabled INTEGER DEFAULT 0
145 '''
146 # used as table end flag, in case the changes to database is not committed to db file
147 _DUMMY_ = "-1, -1, '====', '====', '====', '====', '====', -1, -1, -1, -1, -1, -1, -1"
148
149 ## Constructor
150 def __init__(self, Cursor):
151 MetaFileTable.__init__(self, Cursor, '', MODEL_FILE_DEC, "Dec", False)
152
153 ## Insert table
154 #
155 # Insert a record into table Dec
156 #
157 # @param Model: Model of a Dec item
158 # @param Value1: Value1 of a Dec item
159 # @param Value2: Value2 of a Dec item
160 # @param Value3: Value3 of a Dec item
161 # @param Scope1: Arch of a Dec item
162 # @param Scope2: Module type of a Dec item
163 # @param BelongsToItem: The item belongs to which another item
164 # @param StartLine: StartLine of a Dec item
165 # @param StartColumn: StartColumn of a Dec item
166 # @param EndLine: EndLine of a Dec item
167 # @param EndColumn: EndColumn of a Dec item
168 # @param Enabled: If this item enabled
169 #
170 def Insert(self, Model, Value1, Value2, Value3, Scope1='COMMON', Scope2='COMMON',
171 BelongsToItem=-1, BelongsToFile = -1, StartLine=-1, StartColumn=-1, EndLine=-1, EndColumn=-1, Enabled=0):
172 (Value1, Value2, Value3, Scope1, Scope2) = ConvertToSqlString((Value1, Value2, Value3, Scope1, Scope2))
173 return Table.Insert(
174 self,
175 Model,
176 Value1,
177 Value2,
178 Value3,
179 Scope1,
180 Scope2,
181 BelongsToItem,
182 BelongsToFile,
183 StartLine,
184 StartColumn,
185 EndLine,
186 EndColumn,
187 Enabled
188 )
189
190 ## Query table
191 #
192 # @param Model: The Model of Record
193 # @param Arch: The Arch attribute of Record
194 #
195 # @retval: A recordSet of all found records
196 #
197 def Query(self, Model, Arch=None):
198 ConditionString = "Model=%s AND Enabled>=0" % Model
199 ValueString = "Value1,Value2,Value3,Scope1,ID,StartLine"
200
201 if Arch != None and Arch != 'COMMON':
202 ConditionString += " AND (Scope1='%s' OR Scope1='COMMON')" % Arch
203
204 SqlCommand = "SELECT %s FROM %s WHERE %s" % (ValueString, self.Table, ConditionString)
205 return self.Exec(SqlCommand)
206
207 ## Python class representation of table storing platform data
208 class PlatformTable(MetaFileTable):
209 _COLUMN_ = '''
210 ID REAL PRIMARY KEY,
211 Model INTEGER NOT NULL,
212 Value1 TEXT NOT NULL,
213 Value2 TEXT,
214 Value3 TEXT,
215 Scope1 TEXT,
216 Scope2 TEXT,
217 BelongsToItem REAL NOT NULL,
218 BelongsToFile SINGLE NOT NULL,
219 FromItem REAL NOT NULL,
220 StartLine INTEGER NOT NULL,
221 StartColumn INTEGER NOT NULL,
222 EndLine INTEGER NOT NULL,
223 EndColumn INTEGER NOT NULL,
224 Enabled INTEGER DEFAULT 0
225 '''
226 # used as table end flag, in case the changes to database is not committed to db file
227 _DUMMY_ = "-1, -1, '====', '====', '====', '====', '====', -1, -1, -1, -1, -1, -1, -1, -1"
228
229 ## Constructor
230 def __init__(self, Cursor, MetaFile = '', FileType = MODEL_FILE_DSC, Temporary = False):
231 MetaFileTable.__init__(self, Cursor, MetaFile, FileType, "Dsc", Temporary)
232
233 ## Insert table
234 #
235 # Insert a record into table Dsc
236 #
237 # @param Model: Model of a Dsc item
238 # @param Value1: Value1 of a Dsc item
239 # @param Value2: Value2 of a Dsc item
240 # @param Value3: Value3 of a Dsc item
241 # @param Scope1: Arch of a Dsc item
242 # @param Scope2: Module type of a Dsc item
243 # @param BelongsToItem: The item belongs to which another item
244 # @param FromItem: The item belongs to which dsc file
245 # @param StartLine: StartLine of a Dsc item
246 # @param StartColumn: StartColumn of a Dsc item
247 # @param EndLine: EndLine of a Dsc item
248 # @param EndColumn: EndColumn of a Dsc item
249 # @param Enabled: If this item enabled
250 #
251 def Insert(self, Model, Value1, Value2, Value3, Scope1='COMMON', Scope2='COMMON', BelongsToItem=-1, BelongsToFile = -1,
252 FromItem=-1, StartLine=-1, StartColumn=-1, EndLine=-1, EndColumn=-1, Enabled=1):
253 (Value1, Value2, Value3, Scope1, Scope2) = ConvertToSqlString((Value1, Value2, Value3, Scope1, Scope2))
254 return Table.Insert(
255 self,
256 Model,
257 Value1,
258 Value2,
259 Value3,
260 Scope1,
261 Scope2,
262 BelongsToItem,
263 BelongsToFile,
264 FromItem,
265 StartLine,
266 StartColumn,
267 EndLine,
268 EndColumn,
269 Enabled
270 )
271
272 ## Query table
273 #
274 # @param Model: The Model of Record
275 # @param Scope1: Arch of a Dsc item
276 # @param Scope2: Module type of a Dsc item
277 # @param BelongsToItem: The item belongs to which another item
278 # @param FromItem: The item belongs to which dsc file
279 #
280 # @retval: A recordSet of all found records
281 #
282 def Query(self, Model, Scope1=None, Scope2=None, BelongsToItem=None, FromItem=None):
283 ConditionString = "Model=%s AND Enabled>0" % Model
284 ValueString = "Value1,Value2,Value3,Scope1,Scope2,ID,StartLine"
285
286 if Scope1 != None and Scope1 != 'COMMON':
287 ConditionString += " AND (Scope1='%s' OR Scope1='COMMON')" % Scope1
288 if Scope2 != None and Scope2 != 'COMMON':
289 ConditionString += " AND (Scope2='%s' OR Scope2='COMMON' OR Scope2='DEFAULT')" % Scope2
290
291 if BelongsToItem != None:
292 ConditionString += " AND BelongsToItem=%s" % BelongsToItem
293 else:
294 ConditionString += " AND BelongsToItem<0"
295
296 if FromItem != None:
297 ConditionString += " AND FromItem=%s" % FromItem
298
299 SqlCommand = "SELECT %s FROM %s WHERE %s" % (ValueString, self.Table, ConditionString)
300 return self.Exec(SqlCommand)
301
302 ## Factory class to produce different storage for different type of meta-file
303 class MetaFileStorage(object):
304 _FILE_TABLE_ = {
305 MODEL_FILE_INF : ModuleTable,
306 MODEL_FILE_DEC : PackageTable,
307 MODEL_FILE_DSC : PlatformTable,
308 MODEL_FILE_OTHERS : MetaFileTable,
309 }
310
311 _FILE_TYPE_ = {
312 ".inf" : MODEL_FILE_INF,
313 ".dec" : MODEL_FILE_DEC,
314 ".dsc" : MODEL_FILE_DSC,
315 }
316
317 ## Constructor
318 def __new__(Class, Cursor, MetaFile, FileType=None, Temporary=False):
319 # no type given, try to find one
320 if not FileType:
321 if MetaFile.Type in self._FILE_TYPE_:
322 FileType = Class._FILE_TYPE_[MetaFile.Type]
323 else:
324 FileType = MODEL_FILE_OTHERS
325
326 # don't pass the type around if it's well known
327 if FileType == MODEL_FILE_OTHERS:
328 Args = (Cursor, MetaFile, FileType, Temporary)
329 else:
330 Args = (Cursor, MetaFile, FileType, Temporary)
331
332 # create the storage object and return it to caller
333 return Class._FILE_TABLE_[FileType](*Args)
334