Changed GenFds to use database based module/package/platform information retrieval...
[people/mcb30/basetools.git] / Source / Python / Workspace / MetaDataTable.py
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\r
5 # All rights reserved. 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
17 import os\r
18 \r
19 import Common.EdkLogger as EdkLogger\r
20 from CommonDataClass import DataClass\r
21 from CommonDataClass.DataClass import FileClass\r
22 \r
23 def ConvertToSqlString(StringList):\r
24     return map(lambda s: "'" + s.replace("'", "''") + "'", StringList)\r
25 \r
26 ## TableFile\r
27 #\r
28 # This class defined a common table\r
29\r
30 # @param object:     Inherited from object class\r
31 #\r
32 # @param Cursor:     Cursor of the database\r
33 # @param TableName:  Name of the table\r
34 #\r
35 class Table(object):\r
36     _COLUMN_ = ''\r
37     _ID_STEP_ = 1\r
38     _ID_MAX_ = 0x80000000\r
39     _DUMMY_ = 0\r
40 \r
41     def __init__(self, Cursor, Name='', IdBase=0, Temporary=False):\r
42         self.Cur = Cursor\r
43         self.Table = Name\r
44         self.IdBase = int(IdBase)\r
45         self.ID = int(IdBase)\r
46         self.Temporary = Temporary\r
47 \r
48     def __str__(self):\r
49         return self.Table\r
50 \r
51     ## Create table\r
52     #\r
53     # Create a table\r
54     #\r
55     def Create(self, NewTable=True):\r
56         if NewTable:\r
57             self.Drop()\r
58 \r
59         if self.Temporary:\r
60             SqlCommand = """create temp table IF NOT EXISTS %s (%s)""" % (self.Table, self._COLUMN_)\r
61         else:\r
62             SqlCommand = """create table IF NOT EXISTS %s (%s)""" % (self.Table, self._COLUMN_)\r
63         self.Cur.execute(SqlCommand)\r
64         self.ID = self.GetId()\r
65 \r
66     ## Insert table\r
67     #\r
68     # Insert a record into a table\r
69     #\r
70     def Insert(self, *Args):\r
71         self.ID = self.ID + self._ID_STEP_\r
72         if self.ID >= (self.IdBase + self._ID_MAX_):\r
73             self.ID = self.IdBase + self._ID_STEP_\r
74         Values = ", ".join([str(Arg) for Arg in Args])\r
75         SqlCommand = "insert into %s values(%s, %s)" % (self.Table, self.ID, Values)\r
76         self.Cur.execute(SqlCommand)\r
77         return self.ID\r
78     \r
79     ## Query table\r
80     #\r
81     # Query all records of the table\r
82     #  \r
83     def Query(self):\r
84         SqlCommand = """select * from %s""" % self.Table\r
85         self.Cur.execute(SqlCommand)\r
86         for Rs in self.Cur:\r
87             EdkLogger.verbose(str(Rs))        \r
88         TotalCount = self.GetId()\r
89 \r
90     ## Drop a table\r
91     #\r
92     # Drop the table\r
93     #\r
94     def Drop(self):\r
95         SqlCommand = """drop table IF EXISTS %s""" % self.Table\r
96         self.Cur.execute(SqlCommand)\r
97     \r
98     ## Get count\r
99     #\r
100     # Get a count of all records of the table\r
101     #\r
102     # @retval Count:  Total count of all records\r
103     #\r
104     def GetCount(self):\r
105         SqlCommand = """select count(ID) from %s""" % self.Table        \r
106         Record = self.Cur.execute(SqlCommand).fetchall()\r
107         return Record[0][0]\r
108         \r
109     def GetId(self):\r
110         SqlCommand = """select max(ID) from %s""" % self.Table        \r
111         Record = self.Cur.execute(SqlCommand).fetchall()\r
112         Id = Record[0][0]\r
113         if Id == None:\r
114             Id = self.IdBase\r
115         return Id\r
116     \r
117     ## Init the ID of the table\r
118     #\r
119     # Init the ID of the table\r
120     #\r
121     def InitID(self):\r
122         self.ID = self.GetId()\r
123     \r
124     ## Exec\r
125     #\r
126     # Exec Sql Command, return result\r
127     #\r
128     # @param SqlCommand:  The SqlCommand to be executed\r
129     #\r
130     # @retval RecordSet:  The result after executed\r
131     #\r
132     def Exec(self, SqlCommand):\r
133         # "###", SqlCommand\r
134         self.Cur.execute(SqlCommand)\r
135         RecordSet = self.Cur.fetchall()\r
136         return RecordSet\r
137 \r
138     def SetEndFlag(self):\r
139         self.Exec("insert into %s values(%s)" % (self.Table, self._DUMMY_))\r
140 \r
141     def IsIntegral(self):\r
142         Result = self.Exec("select min(ID) from %s" % (self.Table))\r
143         if Result[0][0] != -1:\r
144             return False\r
145         return True\r
146 \r
147 ## TableFile\r
148 #\r
149 # This class defined a table used for file\r
150\r
151 # @param object:       Inherited from object class\r
152 #\r
153 class TableFile(Table):\r
154     _COLUMN_ = '''\r
155         ID INTEGER PRIMARY KEY,\r
156         Name VARCHAR NOT NULL,\r
157         ExtName VARCHAR,\r
158         Path VARCHAR,\r
159         FullPath VARCHAR NOT NULL,\r
160         Model INTEGER DEFAULT 0,\r
161         TimeStamp SINGLE NOT NULL\r
162         '''\r
163     def __init__(self, Cursor):\r
164         Table.__init__(self, Cursor, 'File')\r
165     \r
166     ## Insert table\r
167     #\r
168     # Insert a record into table File\r
169     #\r
170     # @param Name:      Name of a File\r
171     # @param ExtName:   ExtName of a File\r
172     # @param Path:      Path of a File\r
173     # @param FullPath:  FullPath of a File\r
174     # @param Model:     Model of a File\r
175     # @param TimeStamp: TimeStamp of a File\r
176     #\r
177     def Insert(self, Name, ExtName, Path, FullPath, Model, TimeStamp):\r
178         (Name, ExtName, Path, FullPath) = ConvertToSqlString((Name, ExtName, Path, FullPath))\r
179         return Table.Insert(\r
180             self, \r
181             Name,\r
182             ExtName, \r
183             Path, \r
184             FullPath, \r
185             Model, \r
186             TimeStamp\r
187             )\r
188 \r
189     ## InsertFile\r
190     #\r
191     # Insert one file to table\r
192     #\r
193     # @param FileFullPath:  The full path of the file\r
194     # @param Model:         The model of the file \r
195     # \r
196     # @retval FileID:       The ID after record is inserted\r
197     #\r
198     def InsertFile(self, FileFullPath, Model):\r
199         (Filepath, Name) = os.path.split(FileFullPath)\r
200         (Root, Ext) = os.path.splitext(FileFullPath)\r
201         TimeStamp = os.stat(FileFullPath)[8]\r
202         File = FileClass(-1, Name, Ext, Filepath, FileFullPath, Model, '', [], [], [])\r
203         return self.Insert(\r
204             Name, \r
205             Ext, \r
206             Filepath, \r
207             FileFullPath, \r
208             Model, \r
209             TimeStamp\r
210             )\r
211 \r
212     def GetFileId(self, FilePath):\r
213         QueryScript = "select ID from %s where FullPath = '%s'" % (self.Table, FilePath)\r
214         RecordList = self.Exec(QueryScript)\r
215         if len(RecordList) == 0:\r
216             return None\r
217         return RecordList[0][0]\r
218 \r
219     def GetFileType(self, FileId):\r
220         QueryScript = "select Model from %s where ID = '%s'" % (self.Table, FileId)\r
221         RecordList = self.Exec(QueryScript)\r
222         if len(RecordList) == 0:\r
223             return None\r
224         return RecordList[0][0]\r
225 \r
226     def GetFileTimeStamp(self, FileId):\r
227         QueryScript = "select TimeStamp from %s where ID = '%s'" % (self.Table, FileId)\r
228         RecordList = self.Exec(QueryScript)\r
229         if len(RecordList) == 0:\r
230             return None\r
231         return RecordList[0][0]\r
232 \r
233     def SetFileTimeStamp(self, FileId, TimeStamp):\r
234         self.Exec("update %s set TimeStamp=%s where ID='%s'" % (self.Table, TimeStamp, FileId))\r
235 \r
236     def GetFileList(self, FileType):\r
237         RecordList = self.Exec("select FullPath from %s where Model=%s" % (self.Table, FileType))\r
238         if len(RecordList) == 0:\r
239             return []\r
240         return [R[0] for R in RecordList]\r
241 \r
242 ## TableDataModel\r
243 #\r
244 # This class defined a table used for data model\r
245\r
246 # @param object:       Inherited from object class\r
247 #\r
248 #\r
249 class TableDataModel(Table):\r
250     _COLUMN_ = """\r
251         ID INTEGER PRIMARY KEY,\r
252         CrossIndex INTEGER NOT NULL,\r
253         Name VARCHAR NOT NULL,\r
254         Description VARCHAR\r
255         """\r
256     def __init__(self, Cursor):\r
257         Table.__init__(self, Cursor, 'DataModel')\r
258     \r
259     ## Insert table\r
260     #\r
261     # Insert a record into table DataModel\r
262     #\r
263     # @param ID:           ID of a ModelType\r
264     # @param CrossIndex:   CrossIndex of a ModelType\r
265     # @param Name:         Name of a ModelType\r
266     # @param Description:  Description of a ModelType\r
267     #\r
268     def Insert(self, CrossIndex, Name, Description):\r
269         (Name, Description) = ConvertToSqlString((Name, Description))\r
270         return Table.Insert(self, CrossIndex, Name, Description)\r
271     \r
272     ## Init table\r
273     #\r
274     # Create all default records of table DataModel\r
275     #  \r
276     def InitTable(self):\r
277         EdkLogger.verbose("\nInitialize table DataModel started ...")\r
278         Count = self.GetCount()\r
279         if Count != None and Count != 0:\r
280             return\r
281         for Item in DataClass.MODEL_LIST:\r
282             CrossIndex = Item[1]\r
283             Name = Item[0]\r
284             Description = Item[0]\r
285             self.Insert(CrossIndex, Name, Description)\r
286         EdkLogger.verbose("Initialize table DataModel ... DONE!")\r
287     \r
288     ## Get CrossIndex\r
289     #\r
290     # Get a model's cross index from its name\r
291     #\r
292     # @param ModelName:    Name of the model\r
293     # @retval CrossIndex:  CrossIndex of the model\r
294     #\r
295     def GetCrossIndex(self, ModelName):\r
296         CrossIndex = -1\r
297         SqlCommand = """select CrossIndex from DataModel where name = '""" + ModelName + """'"""\r
298         self.Cur.execute(SqlCommand)\r
299         for Item in self.Cur:\r
300             CrossIndex = Item[0]\r
301         \r
302         return CrossIndex\r
303 \r