]> git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/Python/Ecc/MetaFileWorkspace/MetaDataTable.py
Sync BaseTool trunk (version r2460) into EDKII BaseTools. The change mainly includes:
[mirror_edk2.git] / BaseTools / Source / Python / Ecc / MetaFileWorkspace / MetaDataTable.py
1 ## @file
2 # This file is used to create/update/query/erase table for files
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 os
18
19 import Common.EdkLogger as EdkLogger
20 from CommonDataClass import DataClass
21 from CommonDataClass.DataClass import FileClass
22
23 ## Convert to SQL required string format
24 def ConvertToSqlString(StringList):
25 return map(lambda s: "'" + s.replace("'", "''") + "'", StringList)
26
27 ## TableFile
28 #
29 # This class defined a common table
30 #
31 # @param object: Inherited from object class
32 #
33 # @param Cursor: Cursor of the database
34 # @param TableName: Name of the table
35 #
36 class Table(object):
37 _COLUMN_ = ''
38 _ID_STEP_ = 1
39 _ID_MAX_ = 0x80000000
40 _DUMMY_ = 0
41
42 def __init__(self, Cursor, Name='', IdBase=0, Temporary=False):
43 self.Cur = Cursor
44 self.Table = Name
45 self.IdBase = int(IdBase)
46 self.ID = int(IdBase)
47 self.Temporary = Temporary
48
49 def __str__(self):
50 return self.Table
51
52 ## Create table
53 #
54 # Create a table
55 #
56 def Create(self, NewTable=True):
57 if NewTable:
58 self.Drop()
59
60 if self.Temporary:
61 SqlCommand = """create temp table IF NOT EXISTS %s (%s)""" % (self.Table, self._COLUMN_)
62 else:
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()
67
68 ## Insert table
69 #
70 # Insert a record into a table
71 #
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)
80 return self.ID
81
82 ## Query table
83 #
84 # Query all records of the table
85 #
86 def Query(self):
87 SqlCommand = """select * from %s""" % self.Table
88 self.Cur.execute(SqlCommand)
89 for Rs in self.Cur:
90 EdkLogger.verbose(str(Rs))
91 TotalCount = self.GetId()
92
93 ## Drop a table
94 #
95 # Drop the table
96 #
97 def Drop(self):
98 SqlCommand = """drop table IF EXISTS %s""" % self.Table
99 self.Cur.execute(SqlCommand)
100
101 ## Get count
102 #
103 # Get a count of all records of the table
104 #
105 # @retval Count: Total count of all records
106 #
107 def GetCount(self):
108 SqlCommand = """select count(ID) from %s""" % self.Table
109 Record = self.Cur.execute(SqlCommand).fetchall()
110 return Record[0][0]
111
112 def GetId(self):
113 SqlCommand = """select max(ID) from %s""" % self.Table
114 Record = self.Cur.execute(SqlCommand).fetchall()
115 Id = Record[0][0]
116 if Id == None:
117 Id = self.IdBase
118 return Id
119
120 ## Init the ID of the table
121 #
122 # Init the ID of the table
123 #
124 def InitID(self):
125 self.ID = self.GetId()
126
127 ## Exec
128 #
129 # Exec Sql Command, return result
130 #
131 # @param SqlCommand: The SqlCommand to be executed
132 #
133 # @retval RecordSet: The result after executed
134 #
135 def Exec(self, SqlCommand):
136 EdkLogger.debug(EdkLogger.DEBUG_5, SqlCommand)
137 self.Cur.execute(SqlCommand)
138 RecordSet = self.Cur.fetchall()
139 return RecordSet
140
141 def SetEndFlag(self):
142 pass
143
144 def IsIntegral(self):
145 Result = self.Exec("select min(ID) from %s" % (self.Table))
146 if Result[0][0] != -1:
147 return False
148 return True
149
150 def GetAll(self):
151 return self.Exec("select * from %s where ID > 0 order by ID" % (self.Table))
152
153
154 ## TableDataModel
155 #
156 # This class defined a table used for data model
157 #
158 # @param object: Inherited from object class
159 #
160 #
161 class TableDataModel(Table):
162 _COLUMN_ = """
163 ID INTEGER PRIMARY KEY,
164 CrossIndex INTEGER NOT NULL,
165 Name VARCHAR NOT NULL,
166 Description VARCHAR
167 """
168 def __init__(self, Cursor):
169 Table.__init__(self, Cursor, 'DataModel')
170
171 ## Insert table
172 #
173 # Insert a record into table DataModel
174 #
175 # @param ID: ID of a ModelType
176 # @param CrossIndex: CrossIndex of a ModelType
177 # @param Name: Name of a ModelType
178 # @param Description: Description of a ModelType
179 #
180 def Insert(self, CrossIndex, Name, Description):
181 (Name, Description) = ConvertToSqlString((Name, Description))
182 return Table.Insert(self, CrossIndex, Name, Description)
183
184 ## Init table
185 #
186 # Create all default records of table DataModel
187 #
188 def InitTable(self):
189 EdkLogger.verbose("\nInitialize table DataModel started ...")
190 Count = self.GetCount()
191 if Count != None and Count != 0:
192 return
193 for Item in DataClass.MODEL_LIST:
194 CrossIndex = Item[1]
195 Name = Item[0]
196 Description = Item[0]
197 self.Insert(CrossIndex, Name, Description)
198 EdkLogger.verbose("Initialize table DataModel ... DONE!")
199
200 ## Get CrossIndex
201 #
202 # Get a model's cross index from its name
203 #
204 # @param ModelName: Name of the model
205 # @retval CrossIndex: CrossIndex of the model
206 #
207 def GetCrossIndex(self, ModelName):
208 CrossIndex = -1
209 SqlCommand = """select CrossIndex from DataModel where name = '""" + ModelName + """'"""
210 self.Cur.execute(SqlCommand)
211 for Item in self.Cur:
212 CrossIndex = Item[0]
213
214 return CrossIndex
215