]> git.proxmox.com Git - mirror_edk2.git/blame - 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
CommitLineData
d0acc87a
LG
1## @file\r
2# This file is used to create/update/query/erase table for files\r
3#\r
4# Copyright (c) 2008, Intel Corporation. All rights reserved.<BR>\r
5# This program and the accompanying materials\r
6# are licensed and made available under the terms and conditions of the BSD License\r
7# which accompanies this distribution. The full text of the license may be found at\r
8# http://opensource.org/licenses/bsd-license.php\r
9#\r
10# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12#\r
13\r
14##\r
15# Import Modules\r
16#\r
17import os\r
18\r
19import Common.EdkLogger as EdkLogger\r
20from CommonDataClass import DataClass\r
21from CommonDataClass.DataClass import FileClass\r
22\r
23## Convert to SQL required string format\r
24def ConvertToSqlString(StringList):\r
25 return map(lambda s: "'" + s.replace("'", "''") + "'", StringList)\r
26\r
27## TableFile\r
28#\r
29# This class defined a common table\r
30#\r
31# @param object: Inherited from object class\r
32#\r
33# @param Cursor: Cursor of the database\r
34# @param TableName: Name of the table\r
35#\r
36class Table(object):\r
37 _COLUMN_ = ''\r
38 _ID_STEP_ = 1\r
39 _ID_MAX_ = 0x80000000\r
40 _DUMMY_ = 0\r
41\r
42 def __init__(self, Cursor, Name='', IdBase=0, Temporary=False):\r
43 self.Cur = Cursor\r
44 self.Table = Name\r
45 self.IdBase = int(IdBase)\r
46 self.ID = int(IdBase)\r
47 self.Temporary = Temporary\r
48\r
49 def __str__(self):\r
50 return self.Table\r
51\r
52 ## Create table\r
53 #\r
54 # Create a table\r
55 #\r
56 def Create(self, NewTable=True):\r
57 if NewTable:\r
58 self.Drop()\r
59\r
60 if self.Temporary:\r
61 SqlCommand = """create temp table IF NOT EXISTS %s (%s)""" % (self.Table, self._COLUMN_)\r
62 else:\r
63 SqlCommand = """create table IF NOT EXISTS %s (%s)""" % (self.Table, self._COLUMN_)\r
64 EdkLogger.debug(EdkLogger.DEBUG_8, SqlCommand)\r
65 self.Cur.execute(SqlCommand)\r
66 self.ID = self.GetId()\r
67\r
68 ## Insert table\r
69 #\r
70 # Insert a record into a table\r
71 #\r
72 def Insert(self, *Args):\r
73 self.ID = self.ID + self._ID_STEP_\r
74 if self.ID >= (self.IdBase + self._ID_MAX_):\r
75 self.ID = self.IdBase + self._ID_STEP_\r
76 Values = ", ".join([str(Arg) for Arg in Args])\r
77 SqlCommand = "insert into %s values(%s, %s)" % (self.Table, self.ID, Values)\r
78 EdkLogger.debug(EdkLogger.DEBUG_5, SqlCommand)\r
79 self.Cur.execute(SqlCommand)\r
80 return self.ID\r
81\r
82 ## Query table\r
83 #\r
84 # Query all records of the table\r
85 #\r
86 def Query(self):\r
87 SqlCommand = """select * from %s""" % self.Table\r
88 self.Cur.execute(SqlCommand)\r
89 for Rs in self.Cur:\r
90 EdkLogger.verbose(str(Rs))\r
91 TotalCount = self.GetId()\r
92\r
93 ## Drop a table\r
94 #\r
95 # Drop the table\r
96 #\r
97 def Drop(self):\r
98 SqlCommand = """drop table IF EXISTS %s""" % self.Table\r
99 self.Cur.execute(SqlCommand)\r
100\r
101 ## Get count\r
102 #\r
103 # Get a count of all records of the table\r
104 #\r
105 # @retval Count: Total count of all records\r
106 #\r
107 def GetCount(self):\r
108 SqlCommand = """select count(ID) from %s""" % self.Table\r
109 Record = self.Cur.execute(SqlCommand).fetchall()\r
110 return Record[0][0]\r
111\r
112 def GetId(self):\r
113 SqlCommand = """select max(ID) from %s""" % self.Table\r
114 Record = self.Cur.execute(SqlCommand).fetchall()\r
115 Id = Record[0][0]\r
116 if Id == None:\r
117 Id = self.IdBase\r
118 return Id\r
119\r
120 ## Init the ID of the table\r
121 #\r
122 # Init the ID of the table\r
123 #\r
124 def InitID(self):\r
125 self.ID = self.GetId()\r
126\r
127 ## Exec\r
128 #\r
129 # Exec Sql Command, return result\r
130 #\r
131 # @param SqlCommand: The SqlCommand to be executed\r
132 #\r
133 # @retval RecordSet: The result after executed\r
134 #\r
135 def Exec(self, SqlCommand):\r
136 EdkLogger.debug(EdkLogger.DEBUG_5, SqlCommand)\r
137 self.Cur.execute(SqlCommand)\r
138 RecordSet = self.Cur.fetchall()\r
139 return RecordSet\r
140\r
141 def SetEndFlag(self):\r
142 pass\r
143\r
144 def IsIntegral(self):\r
145 Result = self.Exec("select min(ID) from %s" % (self.Table))\r
146 if Result[0][0] != -1:\r
147 return False\r
148 return True\r
149\r
150 def GetAll(self):\r
151 return self.Exec("select * from %s where ID > 0 order by ID" % (self.Table))\r
152\r
153\r
154## TableDataModel\r
155#\r
156# This class defined a table used for data model\r
157#\r
158# @param object: Inherited from object class\r
159#\r
160#\r
161class TableDataModel(Table):\r
162 _COLUMN_ = """\r
163 ID INTEGER PRIMARY KEY,\r
164 CrossIndex INTEGER NOT NULL,\r
165 Name VARCHAR NOT NULL,\r
166 Description VARCHAR\r
167 """\r
168 def __init__(self, Cursor):\r
169 Table.__init__(self, Cursor, 'DataModel')\r
170\r
171 ## Insert table\r
172 #\r
173 # Insert a record into table DataModel\r
174 #\r
175 # @param ID: ID of a ModelType\r
176 # @param CrossIndex: CrossIndex of a ModelType\r
177 # @param Name: Name of a ModelType\r
178 # @param Description: Description of a ModelType\r
179 #\r
180 def Insert(self, CrossIndex, Name, Description):\r
181 (Name, Description) = ConvertToSqlString((Name, Description))\r
182 return Table.Insert(self, CrossIndex, Name, Description)\r
183\r
184 ## Init table\r
185 #\r
186 # Create all default records of table DataModel\r
187 #\r
188 def InitTable(self):\r
189 EdkLogger.verbose("\nInitialize table DataModel started ...")\r
190 Count = self.GetCount()\r
191 if Count != None and Count != 0:\r
192 return\r
193 for Item in DataClass.MODEL_LIST:\r
194 CrossIndex = Item[1]\r
195 Name = Item[0]\r
196 Description = Item[0]\r
197 self.Insert(CrossIndex, Name, Description)\r
198 EdkLogger.verbose("Initialize table DataModel ... DONE!")\r
199\r
200 ## Get CrossIndex\r
201 #\r
202 # Get a model's cross index from its name\r
203 #\r
204 # @param ModelName: Name of the model\r
205 # @retval CrossIndex: CrossIndex of the model\r
206 #\r
207 def GetCrossIndex(self, ModelName):\r
208 CrossIndex = -1\r
209 SqlCommand = """select CrossIndex from DataModel where name = '""" + ModelName + """'"""\r
210 self.Cur.execute(SqlCommand)\r
211 for Item in self.Cur:\r
212 CrossIndex = Item[0]\r
213\r
214 return CrossIndex\r
215\r