Added debug statement
[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 ## Convert to SQL required string format\r
24 def 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
36 class 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         self.Exec("insert into %s values(%s)" % (self.Table, self._DUMMY_))\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 ## TableFile\r
151 #\r
152 # This class defined a table used for file\r
153 #\r
154 # @param object:       Inherited from object class\r
155 #\r
156 class TableFile(Table):\r
157     _COLUMN_ = '''\r
158         ID INTEGER PRIMARY KEY,\r
159         Name VARCHAR NOT NULL,\r
160         ExtName VARCHAR,\r
161         Path VARCHAR,\r
162         FullPath VARCHAR NOT NULL,\r
163         Model INTEGER DEFAULT 0,\r
164         TimeStamp SINGLE NOT NULL\r
165         '''\r
166     def __init__(self, Cursor):\r
167         Table.__init__(self, Cursor, 'File')\r
168 \r
169     ## Insert table\r
170     #\r
171     # Insert a record into table File\r
172     #\r
173     # @param Name:      Name of a File\r
174     # @param ExtName:   ExtName of a File\r
175     # @param Path:      Path of a File\r
176     # @param FullPath:  FullPath of a File\r
177     # @param Model:     Model of a File\r
178     # @param TimeStamp: TimeStamp of a File\r
179     #\r
180     def Insert(self, Name, ExtName, Path, FullPath, Model, TimeStamp):\r
181         (Name, ExtName, Path, FullPath) = ConvertToSqlString((Name, ExtName, Path, FullPath))\r
182         return Table.Insert(\r
183             self,\r
184             Name,\r
185             ExtName,\r
186             Path,\r
187             FullPath,\r
188             Model,\r
189             TimeStamp\r
190             )\r
191 \r
192     ## InsertFile\r
193     #\r
194     # Insert one file to table\r
195     #\r
196     # @param FileFullPath:  The full path of the file\r
197     # @param Model:         The model of the file\r
198     #\r
199     # @retval FileID:       The ID after record is inserted\r
200     #\r
201     def InsertFile(self, FileFullPath, Model):\r
202         (Filepath, Name) = os.path.split(FileFullPath)\r
203         (Root, Ext) = os.path.splitext(FileFullPath)\r
204         TimeStamp = os.stat(FileFullPath)[8]\r
205         File = FileClass(-1, Name, Ext, Filepath, FileFullPath, Model, '', [], [], [])\r
206         return self.Insert(\r
207             Name,\r
208             Ext,\r
209             Filepath,\r
210             FileFullPath,\r
211             Model,\r
212             TimeStamp\r
213             )\r
214 \r
215     ## Get ID of a given file\r
216     #\r
217     #   @param  FilePath    Path of file\r
218     #\r
219     #   @retval ID          ID value of given file in the table\r
220     #\r
221     def GetFileId(self, FilePath):\r
222         QueryScript = "select ID from %s where FullPath = '%s'" % (self.Table, FilePath)\r
223         RecordList = self.Exec(QueryScript)\r
224         if len(RecordList) == 0:\r
225             return None\r
226         return RecordList[0][0]\r
227 \r
228     ## Get type of a given file\r
229     #\r
230     #   @param  FileId      ID of a file\r
231     #\r
232     #   @retval file_type   Model value of given file in the table\r
233     #\r
234     def GetFileType(self, FileId):\r
235         QueryScript = "select Model from %s where ID = '%s'" % (self.Table, FileId)\r
236         RecordList = self.Exec(QueryScript)\r
237         if len(RecordList) == 0:\r
238             return None\r
239         return RecordList[0][0]\r
240 \r
241     ## Get file timestamp of a given file\r
242     #\r
243     #   @param  FileId      ID of file\r
244     #\r
245     #   @retval timestamp   TimeStamp value of given file in the table\r
246     #\r
247     def GetFileTimeStamp(self, FileId):\r
248         QueryScript = "select TimeStamp from %s where ID = '%s'" % (self.Table, FileId)\r
249         RecordList = self.Exec(QueryScript)\r
250         if len(RecordList) == 0:\r
251             return None\r
252         return RecordList[0][0]\r
253 \r
254     ## Update the timestamp of a given file\r
255     #\r
256     #   @param  FileId      ID of file\r
257     #   @param  TimeStamp   Time stamp of file\r
258     #\r
259     def SetFileTimeStamp(self, FileId, TimeStamp):\r
260         self.Exec("update %s set TimeStamp=%s where ID='%s'" % (self.Table, TimeStamp, FileId))\r
261 \r
262     ## Get list of file with given type\r
263     #\r
264     #   @param  FileType    Type value of file\r
265     #\r
266     #   @retval file_list   List of files with the given type\r
267     #\r
268     def GetFileList(self, FileType):\r
269         RecordList = self.Exec("select FullPath from %s where Model=%s" % (self.Table, FileType))\r
270         if len(RecordList) == 0:\r
271             return []\r
272         return [R[0] for R in RecordList]\r
273 \r
274 ## TableDataModel\r
275 #\r
276 # This class defined a table used for data model\r
277 #\r
278 # @param object:       Inherited from object class\r
279 #\r
280 #\r
281 class TableDataModel(Table):\r
282     _COLUMN_ = """\r
283         ID INTEGER PRIMARY KEY,\r
284         CrossIndex INTEGER NOT NULL,\r
285         Name VARCHAR NOT NULL,\r
286         Description VARCHAR\r
287         """\r
288     def __init__(self, Cursor):\r
289         Table.__init__(self, Cursor, 'DataModel')\r
290 \r
291     ## Insert table\r
292     #\r
293     # Insert a record into table DataModel\r
294     #\r
295     # @param ID:           ID of a ModelType\r
296     # @param CrossIndex:   CrossIndex of a ModelType\r
297     # @param Name:         Name of a ModelType\r
298     # @param Description:  Description of a ModelType\r
299     #\r
300     def Insert(self, CrossIndex, Name, Description):\r
301         (Name, Description) = ConvertToSqlString((Name, Description))\r
302         return Table.Insert(self, CrossIndex, Name, Description)\r
303 \r
304     ## Init table\r
305     #\r
306     # Create all default records of table DataModel\r
307     #\r
308     def InitTable(self):\r
309         EdkLogger.verbose("\nInitialize table DataModel started ...")\r
310         Count = self.GetCount()\r
311         if Count != None and Count != 0:\r
312             return\r
313         for Item in DataClass.MODEL_LIST:\r
314             CrossIndex = Item[1]\r
315             Name = Item[0]\r
316             Description = Item[0]\r
317             self.Insert(CrossIndex, Name, Description)\r
318         EdkLogger.verbose("Initialize table DataModel ... DONE!")\r
319 \r
320     ## Get CrossIndex\r
321     #\r
322     # Get a model's cross index from its name\r
323     #\r
324     # @param ModelName:    Name of the model\r
325     # @retval CrossIndex:  CrossIndex of the model\r
326     #\r
327     def GetCrossIndex(self, ModelName):\r
328         CrossIndex = -1\r
329         SqlCommand = """select CrossIndex from DataModel where name = '""" + ModelName + """'"""\r
330         self.Cur.execute(SqlCommand)\r
331         for Item in self.Cur:\r
332             CrossIndex = Item[0]\r
333 \r
334         return CrossIndex\r
335 \r