• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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#
17import uuid
18
19import Common.EdkLogger as EdkLogger
20import EccGlobalData
21
22from MetaDataTable import Table
23from MetaDataTable import ConvertToSqlString
24from CommonDataClass.DataClass import MODEL_FILE_DSC, MODEL_FILE_DEC, MODEL_FILE_INF, \
25                                      MODEL_FILE_OTHERS
26
27class 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
47class 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
129class 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
208class 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
303class 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
335