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