Added doxygen comments
[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         self.Cur.execute(SqlCommand)\r
65         self.ID = self.GetId()\r
66 \r
67     ## Insert table\r
68     #\r
69     # Insert a record into a table\r
70     #\r
71     def Insert(self, *Args):\r
72         self.ID = self.ID + self._ID_STEP_\r
73         if self.ID >= (self.IdBase + self._ID_MAX_):\r
74             self.ID = self.IdBase + self._ID_STEP_\r
75         Values = ", ".join([str(Arg) for Arg in Args])\r
76         SqlCommand = "insert into %s values(%s, %s)" % (self.Table, self.ID, Values)\r
77         self.Cur.execute(SqlCommand)\r
78         return self.ID\r
79     \r
80     ## Query table\r
81     #\r
82     # Query all records of the table\r
83     #  \r
84     def Query(self):\r
85         SqlCommand = """select * from %s""" % self.Table\r
86         self.Cur.execute(SqlCommand)\r
87         for Rs in self.Cur:\r
88             EdkLogger.verbose(str(Rs))        \r
89         TotalCount = self.GetId()\r
90 \r
91     ## Drop a table\r
92     #\r
93     # Drop the table\r
94     #\r
95     def Drop(self):\r
96         SqlCommand = """drop table IF EXISTS %s""" % self.Table\r
97         self.Cur.execute(SqlCommand)\r
98     \r
99     ## Get count\r
100     #\r
101     # Get a count of all records of the table\r
102     #\r
103     # @retval Count:  Total count of all records\r
104     #\r
105     def GetCount(self):\r
106         SqlCommand = """select count(ID) from %s""" % self.Table        \r
107         Record = self.Cur.execute(SqlCommand).fetchall()\r
108         return Record[0][0]\r
109         \r
110     def GetId(self):\r
111         SqlCommand = """select max(ID) from %s""" % self.Table        \r
112         Record = self.Cur.execute(SqlCommand).fetchall()\r
113         Id = Record[0][0]\r
114         if Id == None:\r
115             Id = self.IdBase\r
116         return Id\r
117     \r
118     ## Init the ID of the table\r
119     #\r
120     # Init the ID of the table\r
121     #\r
122     def InitID(self):\r
123         self.ID = self.GetId()\r
124     \r
125     ## Exec\r
126     #\r
127     # Exec Sql Command, return result\r
128     #\r
129     # @param SqlCommand:  The SqlCommand to be executed\r
130     #\r
131     # @retval RecordSet:  The result after executed\r
132     #\r
133     def Exec(self, SqlCommand):\r
134         # "###", SqlCommand\r
135         self.Cur.execute(SqlCommand)\r
136         RecordSet = self.Cur.fetchall()\r
137         return RecordSet\r
138 \r
139     def SetEndFlag(self):\r
140         self.Exec("insert into %s values(%s)" % (self.Table, self._DUMMY_))\r
141 \r
142     def IsIntegral(self):\r
143         Result = self.Exec("select min(ID) from %s" % (self.Table))\r
144         if Result[0][0] != -1:\r
145             return False\r
146         return True\r
147 \r
148 ## TableFile\r
149 #\r
150 # This class defined a table used for file\r
151\r
152 # @param object:       Inherited from object class\r
153 #\r
154 class TableFile(Table):\r
155     _COLUMN_ = '''\r
156         ID INTEGER PRIMARY KEY,\r
157         Name VARCHAR NOT NULL,\r
158         ExtName VARCHAR,\r
159         Path VARCHAR,\r
160         FullPath VARCHAR NOT NULL,\r
161         Model INTEGER DEFAULT 0,\r
162         TimeStamp SINGLE NOT NULL\r
163         '''\r
164     def __init__(self, Cursor):\r
165         Table.__init__(self, Cursor, 'File')\r
166     \r
167     ## Insert table\r
168     #\r
169     # Insert a record into table File\r
170     #\r
171     # @param Name:      Name of a File\r
172     # @param ExtName:   ExtName of a File\r
173     # @param Path:      Path of a File\r
174     # @param FullPath:  FullPath of a File\r
175     # @param Model:     Model of a File\r
176     # @param TimeStamp: TimeStamp of a File\r
177     #\r
178     def Insert(self, Name, ExtName, Path, FullPath, Model, TimeStamp):\r
179         (Name, ExtName, Path, FullPath) = ConvertToSqlString((Name, ExtName, Path, FullPath))\r
180         return Table.Insert(\r
181             self, \r
182             Name,\r
183             ExtName, \r
184             Path, \r
185             FullPath, \r
186             Model, \r
187             TimeStamp\r
188             )\r
189 \r
190     ## InsertFile\r
191     #\r
192     # Insert one file to table\r
193     #\r
194     # @param FileFullPath:  The full path of the file\r
195     # @param Model:         The model of the file \r
196     # \r
197     # @retval FileID:       The ID after record is inserted\r
198     #\r
199     def InsertFile(self, FileFullPath, Model):\r
200         (Filepath, Name) = os.path.split(FileFullPath)\r
201         (Root, Ext) = os.path.splitext(FileFullPath)\r
202         TimeStamp = os.stat(FileFullPath)[8]\r
203         File = FileClass(-1, Name, Ext, Filepath, FileFullPath, Model, '', [], [], [])\r
204         return self.Insert(\r
205             Name, \r
206             Ext, \r
207             Filepath, \r
208             FileFullPath, \r
209             Model, \r
210             TimeStamp\r
211             )\r
212 \r
213     ## Get ID of a given file\r
214     #\r
215     #   @param  FilePath    Path of file\r
216     # \r
217     #   @retval ID          ID value of given file in the table\r
218     # \r
219     def GetFileId(self, FilePath):\r
220         QueryScript = "select ID from %s where FullPath = '%s'" % (self.Table, FilePath)\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     ## Get type of a given file\r
227     #\r
228     #   @param  FileId      ID of a file\r
229     # \r
230     #   @retval file_type   Model value of given file in the table\r
231     # \r
232     def GetFileType(self, FileId):\r
233         QueryScript = "select Model from %s where ID = '%s'" % (self.Table, FileId)\r
234         RecordList = self.Exec(QueryScript)\r
235         if len(RecordList) == 0:\r
236             return None\r
237         return RecordList[0][0]\r
238 \r
239     ## Get file timestamp of a given file\r
240     #\r
241     #   @param  FileId      ID of file\r
242     # \r
243     #   @retval timestamp   TimeStamp value of given file in the table\r
244     # \r
245     def GetFileTimeStamp(self, FileId):\r
246         QueryScript = "select TimeStamp from %s where ID = '%s'" % (self.Table, FileId)\r
247         RecordList = self.Exec(QueryScript)\r
248         if len(RecordList) == 0:\r
249             return None\r
250         return RecordList[0][0]\r
251 \r
252     ## Update the timestamp of a given file\r
253     #\r
254     #   @param  FileId      ID of file\r
255     #   @param  TimeStamp   Time stamp of file\r
256     # \r
257     def SetFileTimeStamp(self, FileId, TimeStamp):\r
258         self.Exec("update %s set TimeStamp=%s where ID='%s'" % (self.Table, TimeStamp, FileId))\r
259 \r
260     ## Get list of file with given type\r
261     #\r
262     #   @param  FileType    Type value of file\r
263     # \r
264     #   @retval file_list   List of files with the given type\r
265     # \r
266     def GetFileList(self, FileType):\r
267         RecordList = self.Exec("select FullPath from %s where Model=%s" % (self.Table, FileType))\r
268         if len(RecordList) == 0:\r
269             return []\r
270         return [R[0] for R in RecordList]\r
271 \r
272 ## TableDataModel\r
273 #\r
274 # This class defined a table used for data model\r
275\r
276 # @param object:       Inherited from object class\r
277 #\r
278 #\r
279 class TableDataModel(Table):\r
280     _COLUMN_ = """\r
281         ID INTEGER PRIMARY KEY,\r
282         CrossIndex INTEGER NOT NULL,\r
283         Name VARCHAR NOT NULL,\r
284         Description VARCHAR\r
285         """\r
286     def __init__(self, Cursor):\r
287         Table.__init__(self, Cursor, 'DataModel')\r
288     \r
289     ## Insert table\r
290     #\r
291     # Insert a record into table DataModel\r
292     #\r
293     # @param ID:           ID of a ModelType\r
294     # @param CrossIndex:   CrossIndex of a ModelType\r
295     # @param Name:         Name of a ModelType\r
296     # @param Description:  Description of a ModelType\r
297     #\r
298     def Insert(self, CrossIndex, Name, Description):\r
299         (Name, Description) = ConvertToSqlString((Name, Description))\r
300         return Table.Insert(self, CrossIndex, Name, Description)\r
301     \r
302     ## Init table\r
303     #\r
304     # Create all default records of table DataModel\r
305     #  \r
306     def InitTable(self):\r
307         EdkLogger.verbose("\nInitialize table DataModel started ...")\r
308         Count = self.GetCount()\r
309         if Count != None and Count != 0:\r
310             return\r
311         for Item in DataClass.MODEL_LIST:\r
312             CrossIndex = Item[1]\r
313             Name = Item[0]\r
314             Description = Item[0]\r
315             self.Insert(CrossIndex, Name, Description)\r
316         EdkLogger.verbose("Initialize table DataModel ... DONE!")\r
317     \r
318     ## Get CrossIndex\r
319     #\r
320     # Get a model's cross index from its name\r
321     #\r
322     # @param ModelName:    Name of the model\r
323     # @retval CrossIndex:  CrossIndex of the model\r
324     #\r
325     def GetCrossIndex(self, ModelName):\r
326         CrossIndex = -1\r
327         SqlCommand = """select CrossIndex from DataModel where name = '""" + ModelName + """'"""\r
328         self.Cur.execute(SqlCommand)\r
329         for Item in self.Cur:\r
330             CrossIndex = Item[0]\r
331         \r
332         return CrossIndex\r
333 \r