]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/UPT/Core/IpiDb.py
Sync BaseTool trunk (version r2460) into EDKII BaseTools. The change mainly includes:
[mirror_edk2.git] / BaseTools / Source / Python / UPT / Core / IpiDb.py
CommitLineData
4234283c
LG
1## @file\r
2# This file is for installed package information database operations\r
3#\r
4# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
5#\r
6# This program and the accompanying materials are licensed and made available \r
7# under the terms and conditions of the BSD License which accompanies this \r
8# distribution. The full text of the license may be found at \r
9# http://opensource.org/licenses/bsd-license.php\r
10#\r
11# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13#\r
14\r
15'''\r
16IpiDb\r
17'''\r
18\r
19##\r
20# Import Modules\r
21#\r
22import sqlite3\r
23import os.path\r
24import time\r
25\r
26import Logger.Log as Logger\r
27from Logger import StringTable as ST\r
28from Logger.ToolError import UPT_ALREADY_RUNNING_ERROR\r
d0acc87a 29from Logger.ToolError import UPT_DB_UPDATE_ERROR\r
4234283c
LG
30\r
31## IpiDb\r
32#\r
33# This class represents the installed package information database\r
34# Add/Remove/Get installed distribution package information here.\r
35# \r
36# \r
37# @param object: Inherited from object class\r
38# @param DbPath: A string for the path of the database\r
39#\r
40#\r
41class IpiDatabase(object):\r
42 def __init__(self, DbPath):\r
43 Dir = os.path.dirname(DbPath)\r
44 if not os.path.isdir(Dir):\r
45 os.mkdir(Dir)\r
46 self.Conn = sqlite3.connect(DbPath, isolation_level='DEFERRED')\r
47 self.Conn.execute("PRAGMA page_size=4096")\r
48 self.Conn.execute("PRAGMA synchronous=OFF")\r
49 self.Cur = self.Conn.cursor()\r
50 self.DpTable = 'DpInfo'\r
51 self.PkgTable = 'PkgInfo'\r
52 self.ModInPkgTable = 'ModInPkgInfo'\r
53 self.StandaloneModTable = 'StandaloneModInfo'\r
54 self.ModDepexTable = 'ModDepexInfo'\r
55 self.DpFileListTable = 'DpFileListInfo'\r
56 self.DummyTable = 'Dummy'\r
57\r
58 ## Initialize build database\r
59 #\r
60 #\r
61 def InitDatabase(self, SkipLock = False):\r
62 Logger.Verbose(ST.MSG_INIT_IPI_START)\r
63 if not SkipLock:\r
64 try:\r
65 #\r
66 # Create a dummy table, if already existed,\r
67 # then UPT is already running\r
68 #\r
69 SqlCommand = """\r
70 create table %s (\r
71 Dummy TEXT NOT NULL,\r
72 PRIMARY KEY (Dummy) \r
73 )""" % self.DummyTable\r
74 self.Cur.execute(SqlCommand)\r
75 self.Conn.commit()\r
76 except sqlite3.OperationalError:\r
77 Logger.Error("UPT", \r
78 UPT_ALREADY_RUNNING_ERROR, \r
79 ST.ERR_UPT_ALREADY_RUNNING_ERROR\r
80 )\r
81 \r
82 #\r
83 # Create new table\r
84 #\r
85 SqlCommand = """\r
86 create table IF NOT EXISTS %s (\r
87 DpGuid TEXT NOT NULL,DpVersion TEXT NOT NULL,\r
88 InstallTime REAL NOT NULL,\r
89 NewPkgFileName TEXT NOT NULL,\r
90 PkgFileName TEXT NOT NULL, \r
91 RePackage TEXT NOT NULL,\r
92 PRIMARY KEY (DpGuid, DpVersion) \r
93 )""" % self.DpTable\r
94 self.Cur.execute(SqlCommand)\r
95 \r
96 SqlCommand = """\r
97 create table IF NOT EXISTS %s (\r
98 FilePath TEXT NOT NULL,\r
99 DpGuid TEXT,\r
100 DpVersion TEXT,\r
101 Md5Sum TEXT,\r
102 PRIMARY KEY (FilePath)\r
103 )""" % self.DpFileListTable\r
104 self.Cur.execute(SqlCommand)\r
105 \r
106 SqlCommand = """\r
107 create table IF NOT EXISTS %s (\r
108 PackageGuid TEXT NOT NULL,\r
109 PackageVersion TEXT NOT NULL,\r
110 InstallTime REAL NOT NULL,\r
111 DpGuid TEXT,\r
112 DpVersion TEXT,\r
113 InstallPath TEXT NOT NULL,\r
114 PRIMARY KEY (PackageGuid, PackageVersion, InstallPath)\r
115 )""" % self.PkgTable\r
116 self.Cur.execute(SqlCommand)\r
117 \r
118 SqlCommand = """\r
119 create table IF NOT EXISTS %s (\r
120 ModuleGuid TEXT NOT NULL,\r
121 ModuleVersion TEXT NOT NULL,\r
d0acc87a 122 ModuleName TEXT NOT NULL,\r
4234283c
LG
123 InstallTime REAL NOT NULL,\r
124 PackageGuid TEXT,\r
125 PackageVersion TEXT,\r
126 InstallPath TEXT NOT NULL,\r
d0acc87a 127 PRIMARY KEY (ModuleGuid, ModuleVersion, ModuleName, InstallPath)\r
4234283c
LG
128 )""" % self.ModInPkgTable\r
129 self.Cur.execute(SqlCommand)\r
130 \r
131 SqlCommand = """\r
132 create table IF NOT EXISTS %s (\r
133 ModuleGuid TEXT NOT NULL,\r
134 ModuleVersion TEXT NOT NULL,\r
d0acc87a 135 ModuleName TEXT NOT NULL,\r
4234283c
LG
136 InstallTime REAL NOT NULL,\r
137 DpGuid TEXT,\r
138 DpVersion TEXT,\r
139 InstallPath TEXT NOT NULL,\r
d0acc87a 140 PRIMARY KEY (ModuleGuid, ModuleVersion, ModuleName, InstallPath)\r
4234283c
LG
141 )""" % self.StandaloneModTable\r
142 self.Cur.execute(SqlCommand)\r
143 \r
144 SqlCommand = """\r
145 create table IF NOT EXISTS %s (\r
146 ModuleGuid TEXT NOT NULL,\r
147 ModuleVersion TEXT NOT NULL,\r
d0acc87a 148 ModuleName TEXT NOT NULL,\r
4234283c
LG
149 InstallPath TEXT NOT NULL,\r
150 DepexGuid TEXT,\r
151 DepexVersion TEXT\r
152 )""" % self.ModDepexTable\r
153 self.Cur.execute(SqlCommand)\r
154 \r
155 self.Conn.commit()\r
156 \r
157 Logger.Verbose(ST.MSG_INIT_IPI_FINISH)\r
158\r
159 ## Add a distribution install information from DpObj\r
160 #\r
161 # @param DpObj:\r
162 # @param NewDpPkgFileName: New DpPkg File Name\r
163 # @param DpPkgFileName: DpPkg File Name\r
164 # @param RePackage: A RePackage\r
165 #\r
166 def AddDPObject(self, DpObj, NewDpPkgFileName, DpPkgFileName, RePackage):\r
d0acc87a
LG
167 try:\r
168 for PkgKey in DpObj.PackageSurfaceArea.keys():\r
169 PkgGuid = PkgKey[0]\r
170 PkgVersion = PkgKey[1]\r
171 PkgInstallPath = PkgKey[2]\r
172 self._AddPackage(PkgGuid, PkgVersion, DpObj.Header.GetGuid(), \\r
173 DpObj.Header.GetVersion(), PkgInstallPath)\r
174 PkgObj = DpObj.PackageSurfaceArea[PkgKey]\r
175 for ModKey in PkgObj.GetModuleDict().keys():\r
176 ModGuid = ModKey[0]\r
177 ModVersion = ModKey[1]\r
178 ModName = ModKey[2]\r
179 ModInstallPath = ModKey[3]\r
180 ModInstallPath = \\r
181 os.path.normpath(os.path.join(PkgInstallPath, ModInstallPath))\r
182 self._AddModuleInPackage(ModGuid, ModVersion, ModName, PkgGuid, \\r
183 PkgVersion, ModInstallPath)\r
184 ModObj = PkgObj.GetModuleDict()[ModKey]\r
185 for Dep in ModObj.GetPackageDependencyList():\r
186 DepexGuid = Dep.GetGuid()\r
187 DepexVersion = Dep.GetVersion()\r
188 self._AddModuleDepex(ModGuid, ModVersion, ModName, ModInstallPath, \\r
189 DepexGuid, DepexVersion)\r
190 for (FilePath, Md5Sum) in PkgObj.FileList:\r
191 self._AddDpFilePathList(DpObj.Header.GetGuid(), \\r
192 DpObj.Header.GetVersion(), FilePath, \\r
193 Md5Sum)\r
194 \r
195 for ModKey in DpObj.ModuleSurfaceArea.keys():\r
4234283c
LG
196 ModGuid = ModKey[0]\r
197 ModVersion = ModKey[1]\r
d0acc87a
LG
198 ModName = ModKey[2]\r
199 ModInstallPath = ModKey[3]\r
200 self._AddStandaloneModule(ModGuid, ModVersion, ModName, \\r
201 DpObj.Header.GetGuid(), \\r
202 DpObj.Header.GetVersion(), \\r
203 ModInstallPath)\r
204 ModObj = DpObj.ModuleSurfaceArea[ModKey]\r
4234283c
LG
205 for Dep in ModObj.GetPackageDependencyList():\r
206 DepexGuid = Dep.GetGuid()\r
207 DepexVersion = Dep.GetVersion()\r
d0acc87a 208 self._AddModuleDepex(ModGuid, ModVersion, ModName, ModInstallPath, \\r
4234283c 209 DepexGuid, DepexVersion)\r
d0acc87a
LG
210 for (Path, Md5Sum) in ModObj.FileList:\r
211 self._AddDpFilePathList(DpObj.Header.GetGuid(), \\r
212 DpObj.Header.GetVersion(), \\r
213 Path, Md5Sum)\r
214 \r
215 #\r
216 # add tool/misc files\r
217 #\r
218 for (Path, Md5Sum) in DpObj.FileList:\r
4234283c 219 self._AddDpFilePathList(DpObj.Header.GetGuid(), \\r
d0acc87a
LG
220 DpObj.Header.GetVersion(), Path, Md5Sum)\r
221 \r
222 self._AddDp(DpObj.Header.GetGuid(), DpObj.Header.GetVersion(), \\r
223 NewDpPkgFileName, DpPkgFileName, RePackage)\r
224 \r
225 self.Conn.commit()\r
226 except sqlite3.IntegrityError, DetailMsg:\r
227 Logger.Error("UPT",\r
228 UPT_DB_UPDATE_ERROR,\r
229 ST.ERR_UPT_DB_UPDATE_ERROR,\r
230 ExtraData = DetailMsg\r
231 )\r
4234283c 232\r
4234283c
LG
233 ## Add a distribution install information\r
234 #\r
235 # @param Guid Guid of the distribution package \r
236 # @param Version Version of the distribution package \r
237 # @param NewDpFileName the saved filename of distribution package file\r
238 # @param DistributionFileName the filename of distribution package file\r
239 #\r
240 def _AddDp(self, Guid, Version, NewDpFileName, DistributionFileName, \\r
241 RePackage):\r
242 \r
243 if Version == None or len(Version.strip()) == 0:\r
244 Version = 'N/A'\r
245 \r
246 #\r
247 # Add newly installed DP information to DB.\r
248 #\r
249 if NewDpFileName == None or len(NewDpFileName.strip()) == 0:\r
250 PkgFileName = 'N/A'\r
251 else:\r
252 PkgFileName = NewDpFileName\r
253 CurrentTime = time.time()\r
254 SqlCommand = \\r
255 """insert into %s values('%s', '%s', %s, '%s', '%s', '%s')""" % \\r
256 (self.DpTable, Guid, Version, CurrentTime, PkgFileName, \\r
257 DistributionFileName, str(RePackage).upper())\r
258 self.Cur.execute(SqlCommand)\r
259\r
260 \r
261 ## Add a file list from DP\r
262 #\r
263 # @param DpGuid: A DpGuid \r
264 # @param DpVersion: A DpVersion\r
265 # @param Path: A Path\r
266 # @param Path: A Md5Sum\r
267 #\r
268 def _AddDpFilePathList(self, DpGuid, DpVersion, Path, Md5Sum):\r
269 \r
270 SqlCommand = """insert into %s values('%s', '%s', '%s', '%s')""" % \\r
271 (self.DpFileListTable, Path, DpGuid, DpVersion, Md5Sum)\r
272\r
273 self.Cur.execute(SqlCommand)\r
274 \r
275 ## Add a package install information\r
276 #\r
277 # @param Guid: A package guid \r
278 # @param Version: A package version\r
279 # @param DpGuid: A DpGuid \r
280 # @param DpVersion: A DpVersion\r
281 # @param Path: A Path\r
282 #\r
283 def _AddPackage(self, Guid, Version, DpGuid=None, DpVersion=None, Path=''):\r
284 \r
285 if Version == None or len(Version.strip()) == 0:\r
286 Version = 'N/A'\r
287 \r
288 if DpGuid == None or len(DpGuid.strip()) == 0:\r
289 DpGuid = 'N/A'\r
290 \r
291 if DpVersion == None or len(DpVersion.strip()) == 0:\r
292 DpVersion = 'N/A'\r
293 \r
294 #\r
295 # Add newly installed package information to DB.\r
296 #\r
297 CurrentTime = time.time()\r
298 SqlCommand = \\r
299 """insert into %s values('%s', '%s', %s, '%s', '%s', '%s')""" % \\r
300 (self.PkgTable, Guid, Version, CurrentTime, DpGuid, DpVersion, Path)\r
301 self.Cur.execute(SqlCommand)\r
302 \r
303 ## Add a module that from a package install information\r
304 #\r
d0acc87a
LG
305 # @param Guid: Module Guid \r
306 # @param Version: Module version\r
307 # @param Name: Module Name\r
308 # @param PkgGuid: Package Guid\r
309 # @param PkgVersion: Package version\r
310 # @param Path: Package relative path that module installs\r
4234283c 311 #\r
d0acc87a 312 def _AddModuleInPackage(self, Guid, Version, Name, PkgGuid=None, \\r
4234283c
LG
313 PkgVersion=None, Path=''):\r
314 \r
315 if Version == None or len(Version.strip()) == 0:\r
316 Version = 'N/A'\r
317 \r
318 if PkgGuid == None or len(PkgGuid.strip()) == 0:\r
319 PkgGuid = 'N/A'\r
320 \r
321 if PkgVersion == None or len(PkgVersion.strip()) == 0:\r
322 PkgVersion = 'N/A'\r
323 \r
324 #\r
325 # Add module from package information to DB.\r
326 #\r
327 CurrentTime = time.time()\r
328 SqlCommand = \\r
d0acc87a
LG
329 """insert into %s values('%s', '%s', '%s', %s, '%s', '%s', '%s')""" % \\r
330 (self.ModInPkgTable, Guid, Version, Name, CurrentTime, PkgGuid, PkgVersion, \\r
4234283c
LG
331 Path)\r
332 self.Cur.execute(SqlCommand)\r
333 \r
334 ## Add a module that is standalone install information\r
335 #\r
336 # @param Guid: a module Guid\r
337 # @param Version: a module Version\r
d0acc87a 338 # @param Name: a module name\r
4234283c
LG
339 # @param DpGuid: a DpGuid\r
340 # @param DpVersion: a DpVersion\r
341 # @param Path: path\r
342 #\r
d0acc87a 343 def _AddStandaloneModule(self, Guid, Version, Name, DpGuid=None, \\r
4234283c
LG
344 DpVersion=None, Path=''):\r
345 \r
346 if Version == None or len(Version.strip()) == 0:\r
347 Version = 'N/A'\r
348 \r
349 if DpGuid == None or len(DpGuid.strip()) == 0:\r
350 DpGuid = 'N/A'\r
351 \r
352 if DpVersion == None or len(DpVersion.strip()) == 0:\r
353 DpVersion = 'N/A'\r
354 \r
355 #\r
356 # Add module standalone information to DB.\r
357 #\r
358 CurrentTime = time.time()\r
359 SqlCommand = \\r
d0acc87a
LG
360 """insert into %s values('%s', '%s', '%s', %s, '%s', '%s', '%s')""" % \\r
361 (self.StandaloneModTable, Guid, Version, Name, CurrentTime, DpGuid, \\r
4234283c
LG
362 DpVersion, Path)\r
363 self.Cur.execute(SqlCommand)\r
364 \r
365 ## Add a module depex\r
366 #\r
367 # @param Guid: a module Guid\r
368 # @param Version: a module Version\r
d0acc87a 369 # @param Name: a module name\r
4234283c
LG
370 # @param DepexGuid: a module DepexGuid\r
371 # @param DepexVersion: a module DepexVersion\r
372 #\r
d0acc87a 373 def _AddModuleDepex(self, Guid, Version, Name, Path, DepexGuid=None, \\r
4234283c
LG
374 DepexVersion=None):\r
375 \r
376 if DepexGuid == None or len(DepexGuid.strip()) == 0:\r
377 DepexGuid = 'N/A'\r
378 \r
379 if DepexVersion == None or len(DepexVersion.strip()) == 0:\r
380 DepexVersion = 'N/A'\r
381 \r
382 #\r
383 # Add module depex information to DB.\r
384 #\r
d0acc87a
LG
385 SqlCommand = """insert into %s values('%s', '%s', '%s', '%s', '%s', '%s')"""\\r
386 % (self.ModDepexTable, Guid, Version, Name, Path, DepexGuid, DepexVersion)\r
4234283c
LG
387 self.Cur.execute(SqlCommand)\r
388 \r
389 ## Remove a distribution install information, if no version specified, \r
390 # remove all DPs with this Guid.\r
391 #\r
392 # @param DpGuid: guid of dpex \r
393 # @param DpVersion: version of dpex\r
394 #\r
395 def RemoveDpObj(self, DpGuid, DpVersion):\r
396 \r
397 PkgList = self.GetPackageListFromDp(DpGuid, DpVersion)\r
398 #\r
399 # delete from ModDepex the standalone module's dependency\r
400 #\r
401 SqlCommand = \\r
402 """delete from ModDepexInfo where ModDepexInfo.ModuleGuid in \r
403 (select ModuleGuid from StandaloneModInfo as B where B.DpGuid = '%s' \r
404 and B.DpVersion = '%s')\r
405 and ModDepexInfo.ModuleVersion in\r
406 (select ModuleVersion from StandaloneModInfo as B \r
407 where B.DpGuid = '%s' and B.DpVersion = '%s')\r
d0acc87a
LG
408 and ModDepexInfo.ModuleName in\r
409 (select ModuleName from StandaloneModInfo as B \r
410 where B.DpGuid = '%s' and B.DpVersion = '%s')\r
4234283c
LG
411 and ModDepexInfo.InstallPath in\r
412 (select InstallPath from StandaloneModInfo as B \r
413 where B.DpGuid = '%s' and B.DpVersion = '%s') """ % \\r
d0acc87a 414 (DpGuid, DpVersion, DpGuid, DpVersion, DpGuid, DpVersion, DpGuid, DpVersion)\r
4234283c
LG
415\r
416 self.Cur.execute(SqlCommand)\r
417 #\r
418 # delete from ModDepex the from pkg module's dependency\r
419 #\r
420 for Pkg in PkgList:\r
421\r
422 SqlCommand = \\r
423 """delete from ModDepexInfo where ModDepexInfo.ModuleGuid in \r
424 (select ModuleGuid from ModInPkgInfo \r
425 where ModInPkgInfo.PackageGuid ='%s' and \r
426 ModInPkgInfo.PackageVersion = '%s')\r
427 and ModDepexInfo.ModuleVersion in\r
428 (select ModuleVersion from ModInPkgInfo \r
429 where ModInPkgInfo.PackageGuid ='%s' and \r
430 ModInPkgInfo.PackageVersion = '%s')\r
d0acc87a
LG
431 and ModDepexInfo.ModuleName in\r
432 (select ModuleName from ModInPkgInfo \r
433 where ModInPkgInfo.PackageGuid ='%s' and \r
434 ModInPkgInfo.PackageVersion = '%s')\r
4234283c
LG
435 and ModDepexInfo.InstallPath in\r
436 (select InstallPath from ModInPkgInfo where \r
437 ModInPkgInfo.PackageGuid ='%s' \r
438 and ModInPkgInfo.PackageVersion = '%s')""" \\r
d0acc87a 439 % (Pkg[0], Pkg[1], Pkg[0], Pkg[1], Pkg[0], Pkg[1],Pkg[0], Pkg[1])\r
4234283c
LG
440 \r
441 self.Cur.execute(SqlCommand)\r
442 #\r
443 # delete the standalone module\r
444 #\r
445 SqlCommand = \\r
446 """delete from %s where DpGuid ='%s' and DpVersion = '%s'""" % \\r
447 (self.StandaloneModTable, DpGuid, DpVersion)\r
448 self.Cur.execute(SqlCommand)\r
449 #\r
450 # delete the from pkg module\r
451 #\r
452 for Pkg in PkgList:\r
453 SqlCommand = \\r
454 """delete from %s where %s.PackageGuid ='%s' \r
455 and %s.PackageVersion = '%s'""" % \\r
456 (self.ModInPkgTable, self.ModInPkgTable, Pkg[0], \\r
457 self.ModInPkgTable, Pkg[1])\r
458 self.Cur.execute(SqlCommand)\r
459 #\r
460 # delete packages\r
461 #\r
462 SqlCommand = \\r
463 """delete from %s where DpGuid ='%s' and DpVersion = '%s'""" % \\r
464 (self.PkgTable, DpGuid, DpVersion)\r
465 self.Cur.execute(SqlCommand)\r
466 #\r
467 # delete file list from DP\r
468 #\r
469 SqlCommand = \\r
470 """delete from %s where DpGuid ='%s' and DpVersion = '%s'""" % \\r
471 (self.DpFileListTable, DpGuid, DpVersion)\r
472 self.Cur.execute(SqlCommand)\r
473 # \r
474 # delete DP\r
475 #\r
476 SqlCommand = \\r
477 """delete from %s where DpGuid ='%s' and DpVersion = '%s'""" % \\r
478 (self.DpTable, DpGuid, DpVersion)\r
479 self.Cur.execute(SqlCommand)\r
480 \r
481 self.Conn.commit()\r
482 \r
483 ## Get a list of distribution install information.\r
484 #\r
485 # @param Guid: distribution package guid \r
486 # @param Version: distribution package version \r
487 #\r
488 def GetDp(self, Guid, Version):\r
489 \r
490 if Version == None or len(Version.strip()) == 0:\r
491 Version = 'N/A'\r
492 Logger.Verbose(ST.MSG_GET_DP_INSTALL_LIST)\r
493 (DpGuid, DpVersion) = (Guid, Version)\r
494 SqlCommand = """select * from %s where DpGuid ='%s'""" % \\r
495 (self.DpTable, DpGuid)\r
496 self.Cur.execute(SqlCommand)\r
497 \r
498 else:\r
499 Logger.Verbose(ST.MSG_GET_DP_INSTALL_INFO_START)\r
500 (DpGuid, DpVersion) = (Guid, Version)\r
501 SqlCommand = \\r
502 """select * from %s where DpGuid ='%s' and DpVersion = '%s'""" % \\r
503 (self.DpTable, DpGuid, DpVersion)\r
504 self.Cur.execute(SqlCommand)\r
505\r
506 DpList = []\r
507 for DpInfo in self.Cur:\r
508 DpGuid = DpInfo[0]\r
509 DpVersion = DpInfo[1]\r
510 InstallTime = DpInfo[2]\r
511 PkgFileName = DpInfo[3]\r
512 DpList.append((DpGuid, DpVersion, InstallTime, PkgFileName))\r
513 \r
514 Logger.Verbose(ST.MSG_GET_DP_INSTALL_INFO_FINISH) \r
515 return DpList\r
516 \r
517 ## Get a list of distribution install dirs\r
518 #\r
519 # @param Guid: distribution package guid \r
520 # @param Version: distribution package version \r
521 #\r
522 def GetDpInstallDirList(self, Guid, Version):\r
523 SqlCommand = """select InstallPath from PkgInfo where DpGuid = '%s' and DpVersion = '%s'""" % (Guid, Version)\r
524 self.Cur.execute(SqlCommand)\r
525 DirList = []\r
526 for Result in self.Cur:\r
527 if Result[0] not in DirList:\r
528 DirList.append(Result[0])\r
529\r
530 SqlCommand = """select InstallPath from StandaloneModInfo where DpGuid = '%s' and DpVersion = '%s'""" % \\r
531 (Guid, Version)\r
532 self.Cur.execute(SqlCommand)\r
533 for Result in self.Cur:\r
534 if Result[0] not in DirList:\r
535 DirList.append(Result[0])\r
536\r
537 return DirList\r
538\r
539\r
540 ## Get a list of distribution install file path information.\r
541 #\r
542 # @param Guid: distribution package guid \r
543 # @param Version: distribution package version \r
544 #\r
545 def GetDpFileList(self, Guid, Version):\r
546 \r
547 (DpGuid, DpVersion) = (Guid, Version)\r
548 SqlCommand = \\r
549 """select * from %s where DpGuid ='%s' and DpVersion = '%s'""" % \\r
550 (self.DpFileListTable, DpGuid, DpVersion)\r
551 self.Cur.execute(SqlCommand)\r
552\r
553 PathList = []\r
554 for Result in self.Cur:\r
555 Path = Result[0]\r
556 Md5Sum = Result[3]\r
557 PathList.append((Path, Md5Sum))\r
558 \r
559 return PathList\r
560\r
561 ## Get files' repackage attribute if present that are installed into current workspace\r
562 #\r
563 # @retval FileDict: a Dict of file, key is file path, value is (DpGuid, DpVersion, NewDpFileName, RePackage)\r
564 #\r
565 def GetRePkgDict(self):\r
566 SqlCommand = """select * from %s """ % (self.DpTable)\r
567 self.Cur.execute(SqlCommand)\r
568 \r
569 DpInfoList = []\r
570 for Result in self.Cur:\r
571 DpInfoList.append(Result)\r
572\r
573 FileDict = {} \r
574 for Result in DpInfoList:\r
575 DpGuid = Result[0]\r
576 DpVersion = Result[1]\r
577 NewDpFileName = Result[3]\r
578 RePackage = Result[5]\r
579 if RePackage == 'TRUE':\r
580 RePackage = True\r
581 else:\r
582 RePackage = False\r
583 for FileInfo in self.GetDpFileList(DpGuid, DpVersion):\r
584 PathInfo = FileInfo[0]\r
585 FileDict[PathInfo] = DpGuid, DpVersion, NewDpFileName, RePackage\r
586 \r
587 return FileDict\r
588 \r
589 ## Get (Guid, Version) from distribution file name information.\r
590 #\r
591 # @param DistributionFile: Distribution File \r
592 #\r
593 def GetDpByName(self, DistributionFile):\r
594 SqlCommand = """select * from %s where NewPkgFileName like '%s'""" % \\r
595 (self.DpTable, '%' + DistributionFile)\r
596 self.Cur.execute(SqlCommand)\r
597\r
598 for Result in self.Cur:\r
599 DpGuid = Result[0]\r
600 DpVersion = Result[1]\r
601 NewDpFileName = Result[3]\r
602 \r
603 return (DpGuid, DpVersion, NewDpFileName)\r
604 else:\r
605 return (None, None, None)\r
606 \r
607 ## Get a list of package information.\r
608 #\r
609 # @param Guid: package guid \r
610 # @param Version: package version\r
611 #\r
612 def GetPackage(self, Guid, Version, DpGuid='', DpVersion=''):\r
613 \r
614 if DpVersion == '' or DpGuid == '':\r
615\r
616 (PackageGuid, PackageVersion) = (Guid, Version)\r
617 SqlCommand = """select * from %s where PackageGuid ='%s' \r
618 and PackageVersion = '%s'""" % (self.PkgTable, PackageGuid, \\r
619 PackageVersion)\r
620 self.Cur.execute(SqlCommand)\r
621 \r
622 elif Version == None or len(Version.strip()) == 0:\r
623 \r
624 SqlCommand = """select * from %s where PackageGuid ='%s'""" % \\r
625 (self.PkgTable, Guid)\r
626 self.Cur.execute(SqlCommand)\r
627 else:\r
628 (PackageGuid, PackageVersion) = (Guid, Version)\r
629 SqlCommand = """select * from %s where PackageGuid ='%s' and \r
630 PackageVersion = '%s'\r
631 and DpGuid = '%s' and DpVersion = '%s'""" % \\r
632 (self.PkgTable, PackageGuid, PackageVersion, \\r
633 DpGuid, DpVersion)\r
634 self.Cur.execute(SqlCommand)\r
635\r
636 PkgList = []\r
637 for PkgInfo in self.Cur:\r
638 PkgGuid = PkgInfo[0]\r
639 PkgVersion = PkgInfo[1]\r
640 InstallTime = PkgInfo[2]\r
641 InstallPath = PkgInfo[5]\r
642 PkgList.append((PkgGuid, PkgVersion, InstallTime, DpGuid, \\r
643 DpVersion, InstallPath))\r
644 \r
645 return PkgList\r
646 \r
647 \r
648 ## Get a list of module in package information.\r
649 #\r
650 # @param Guid: A module guid\r
651 # @param Version: A module version\r
652 #\r
d0acc87a
LG
653 def GetModInPackage(self, Guid, Version, Name, Path, PkgGuid='', PkgVersion=''):\r
654 (ModuleGuid, ModuleVersion, ModuleName, InstallPath) = (Guid, Version, Name, Path)\r
4234283c 655 if PkgVersion == '' or PkgGuid == '':\r
4234283c 656 SqlCommand = """select * from %s where ModuleGuid ='%s' and \r
d0acc87a
LG
657 ModuleVersion = '%s' and InstallPath = '%s' \r
658 and ModuleName = '%s'""" % (self.ModInPkgTable, ModuleGuid, \\r
659 ModuleVersion, InstallPath, ModuleName)\r
4234283c 660 self.Cur.execute(SqlCommand)\r
4234283c 661 else:\r
4234283c 662 SqlCommand = """select * from %s where ModuleGuid ='%s' and \r
d0acc87a
LG
663 ModuleVersion = '%s' and InstallPath = '%s' \r
664 and ModuleName = '%s' and PackageGuid ='%s' \r
4234283c
LG
665 and PackageVersion = '%s'\r
666 """ % (self.ModInPkgTable, ModuleGuid, \\r
d0acc87a 667 ModuleVersion, InstallPath, ModuleName, PkgGuid, PkgVersion)\r
4234283c
LG
668 self.Cur.execute(SqlCommand)\r
669\r
670 ModList = []\r
671 for ModInfo in self.Cur:\r
672 ModGuid = ModInfo[0]\r
673 ModVersion = ModInfo[1]\r
674 InstallTime = ModInfo[2]\r
675 InstallPath = ModInfo[5]\r
676 ModList.append((ModGuid, ModVersion, InstallTime, PkgGuid, \\r
677 PkgVersion, InstallPath))\r
678 \r
679 return ModList\r
680 \r
681 ## Get a list of module standalone.\r
682 #\r
683 # @param Guid: A module guid \r
684 # @param Version: A module version \r
685 #\r
d0acc87a
LG
686 def GetStandaloneModule(self, Guid, Version, Name, Path, DpGuid='', DpVersion=''):\r
687 (ModuleGuid, ModuleVersion, ModuleName, InstallPath) = (Guid, Version, Name, Path)\r
4234283c 688 if DpGuid == '':\r
4234283c 689 SqlCommand = """select * from %s where ModuleGuid ='%s' and \r
d0acc87a
LG
690 ModuleVersion = '%s' and InstallPath = '%s' \r
691 and ModuleName = '%s'""" % (self.StandaloneModTable, ModuleGuid, \\r
692 ModuleVersion, InstallPath, ModuleName)\r
4234283c
LG
693 self.Cur.execute(SqlCommand)\r
694 \r
695 else:\r
4234283c 696 SqlCommand = """select * from %s where ModuleGuid ='%s' and \r
d0acc87a 697 ModuleVersion = '%s' and InstallPath = '%s' and ModuleName = '%s' and DpGuid ='%s' and DpVersion = '%s' \r
4234283c 698 """ % (self.StandaloneModTable, ModuleGuid, \\r
d0acc87a 699 ModuleVersion, ModuleName, InstallPath, DpGuid, DpVersion)\r
4234283c
LG
700 self.Cur.execute(SqlCommand)\r
701\r
702 ModList = []\r
703 for ModInfo in self.Cur:\r
704 ModGuid = ModInfo[0]\r
705 ModVersion = ModInfo[1]\r
706 InstallTime = ModInfo[2]\r
707 InstallPath = ModInfo[5]\r
708 ModList.append((ModGuid, ModVersion, InstallTime, DpGuid, \\r
709 DpVersion, InstallPath))\r
710 \r
711 return ModList\r
712 \r
713 ## Get a list of module information that comes from DP.\r
714 #\r
715 # @param DpGuid: A Distrabution Guid \r
716 # @param DpVersion: A Distrabution version \r
717 #\r
718 def GetSModInsPathListFromDp(self, DpGuid, DpVersion):\r
719\r
720 PathList = []\r
721 SqlCommand = """select InstallPath from %s where DpGuid ='%s' \r
722 and DpVersion = '%s'\r
723 """ % (self.StandaloneModTable, DpGuid, DpVersion)\r
724 self.Cur.execute(SqlCommand)\r
725\r
726 for Result in self.Cur:\r
727 InstallPath = Result[0]\r
728 PathList.append(InstallPath)\r
729 \r
730 return PathList\r
731 \r
732 ## Get a list of package information.\r
733 #\r
734 # @param DpGuid: A Distrabution Guid \r
735 # @param DpVersion: A Distrabution version \r
736 #\r
737 def GetPackageListFromDp(self, DpGuid, DpVersion):\r
738\r
739 SqlCommand = """select * from %s where DpGuid ='%s' and \r
740 DpVersion = '%s' """ % (self.PkgTable, DpGuid, DpVersion)\r
741 self.Cur.execute(SqlCommand)\r
742\r
743 PkgList = []\r
744 for PkgInfo in self.Cur:\r
745 PkgGuid = PkgInfo[0]\r
746 PkgVersion = PkgInfo[1]\r
747 InstallPath = PkgInfo[5]\r
748 PkgList.append((PkgGuid, PkgVersion, InstallPath))\r
749 \r
750 return PkgList\r
751 \r
752 ## Get a list of modules that depends on package information from a DP.\r
753 #\r
754 # @param DpGuid: A Distrabution Guid \r
755 # @param DpVersion: A Distrabution version \r
756 #\r
757 def GetDpDependentModuleList(self, DpGuid, DpVersion):\r
758 \r
759 ModList = []\r
760 PkgList = self.GetPackageListFromDp(DpGuid, DpVersion)\r
761 if len(PkgList) > 0:\r
762 return ModList\r
763 \r
764 for Pkg in PkgList:\r
765 #\r
766 # get all in-package modules that depends on current \r
767 # Pkg (Guid match, Version match or NA) but not belong to \r
768 # current Pkg\r
769 #\r
770 SqlCommand = """select t1.ModuleGuid, t1.ModuleVersion, \r
771 t1.InstallPath from %s as t1, %s as t2 where \r
772 t1.ModuleGuid = t2.ModuleGuid and \r
773 t1.ModuleVersion = t2.ModuleVersion and t2.DepexGuid ='%s' \r
774 and (t2.DepexVersion = '%s' or t2.DepexVersion = 'N/A') and\r
775 t1.PackageGuid != '%s' and t1.PackageVersion != '%s'\r
776 """ % (self.ModInPkgTable, \\r
777 self.ModDepexTable, Pkg[0], Pkg[1], Pkg[0], \\r
778 Pkg[1])\r
779 self.Cur.execute(SqlCommand)\r
780 for ModInfo in self.Cur:\r
781 ModGuid = ModInfo[0]\r
782 ModVersion = ModInfo[1]\r
783 InstallPath = ModInfo[2]\r
784 ModList.append((ModGuid, ModVersion, InstallPath))\r
785\r
786 #\r
787 # get all modules from standalone modules that depends on current \r
788 #Pkg (Guid match, Version match or NA) but not in current dp\r
789 #\r
790 SqlCommand = \\r
791 """select t1.ModuleGuid, t1.ModuleVersion, t1.InstallPath \r
792 from %s as t1, %s as t2 where t1.ModuleGuid = t2.ModuleGuid and \r
793 t1.ModuleVersion = t2.ModuleVersion and t2.DepexGuid ='%s' \r
794 and (t2.DepexVersion = '%s' or t2.DepexVersion = 'N/A') and\r
795 t1.DpGuid != '%s' and t1.DpVersion != '%s'\r
796 """ % \\r
797 (self.StandaloneModTable, self.ModDepexTable, Pkg[0], \\r
798 Pkg[1], DpGuid, DpVersion)\r
799 self.Cur.execute(SqlCommand)\r
800 for ModInfo in self.Cur:\r
801 ModGuid = ModInfo[0]\r
802 ModVersion = ModInfo[1]\r
803 InstallPath = ModInfo[2]\r
804 ModList.append((ModGuid, ModVersion, InstallPath))\r
805 \r
806 \r
807 return ModList\r
808\r
809 ## Get Dp's list of modules.\r
810 #\r
811 # @param DpGuid: A Distrabution Guid \r
812 # @param DpVersion: A Distrabution version \r
813 #\r
814 def GetDpModuleList(self, DpGuid, DpVersion): \r
815 ModList = []\r
816 #\r
817 # get Dp module list from the DpFileList table\r
818 #\r
819 SqlCommand = """select FilePath \r
820 from %s\r
821 where DpGuid = '%s' and DpVersion = '%s' and \r
822 FilePath like '%%.inf'\r
823 """ % (self.DpFileListTable, DpGuid, DpVersion)\r
824 self.Cur.execute(SqlCommand)\r
825 for ModuleInfo in self.Cur:\r
826 FilePath = ModuleInfo[0]\r
827 ModList.append(FilePath)\r
828 \r
829 return ModList \r
830\r
831 \r
832 ## Get a module depex\r
833 #\r
834 # @param DpGuid: A module Guid \r
835 # @param DpVersion: A module version \r
836 # @param Path:\r
837 #\r
838 def GetModuleDepex(self, Guid, Version, Path):\r
839 \r
840 #\r
841 # Get module depex information to DB.\r
842 #\r
843 SqlCommand = """select * from %s where ModuleGuid ='%s' and \r
844 ModuleVersion = '%s' and InstallPath ='%s'\r
845 """ % (self.ModDepexTable, Guid, Version, Path)\r
846 self.Cur.execute(SqlCommand)\r
847 self.Conn.commit()\r
848 \r
849 DepexList = []\r
850 for DepInfo in self.Cur:\r
851 DepexGuid = DepInfo[3]\r
852 DepexVersion = DepInfo[4]\r
853 DepexList.append((DepexGuid, DepexVersion))\r
854 \r
855 return DepexList\r
856 \r
857 ## Close entire database\r
858 #\r
859 # Close the connection and cursor\r
860 #\r
861 def CloseDb(self):\r
862 #\r
863 # drop the dummy table\r
864 #\r
865 SqlCommand = """\r
866 drop table IF EXISTS %s \r
867 """ % self.DummyTable\r
868 self.Cur.execute(SqlCommand)\r
869 self.Conn.commit()\r
870 \r
871 self.Cur.close()\r
872 self.Conn.close()\r
873\r
874 ## Convert To Sql String\r
875 #\r
876 # 1. Replace "'" with "''" in each item of StringList\r
877 # \r
878 # @param StringList: A list for strings to be converted\r
879 #\r
880 def __ConvertToSqlString(self, StringList):\r
881 if self.DpTable:\r
882 pass\r
883 return map(lambda s: s.replace("'", "''") , StringList)\r
884\r
885\r
886\r
887