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