]> git.proxmox.com Git - mirror_edk2.git/blame - BaseTools/Source/Python/UPT/Core/IpiDb.py
BaseTools: Refactor python except statements
[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
09e27ac5 4# Copyright (c) 2011 - 2017, Intel Corporation. All rights reserved.<BR>\r
4234283c
LG
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
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
36# \r
37# \r
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
09e27ac5 47 self.Conn = sqlite3.connect(unicode(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
74 PRIMARY KEY (Dummy) \r
75 )""" % self.DummyTable\r
76 self.Cur.execute(SqlCommand)\r
77 self.Conn.commit()\r
78 except sqlite3.OperationalError:\r
79 Logger.Error("UPT", \r
80 UPT_ALREADY_RUNNING_ERROR, \r
81 ST.ERR_UPT_ALREADY_RUNNING_ERROR\r
82 )\r
83 \r
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
92 PkgFileName TEXT NOT NULL, \r
93 RePackage TEXT NOT NULL,\r
94 PRIMARY KEY (DpGuid, DpVersion) \r
95 )""" % self.DpTable\r
96 self.Cur.execute(SqlCommand)\r
97 \r
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
107 \r
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
119 \r
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
132 \r
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
145 \r
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
156 \r
157 self.Conn.commit()\r
158 \r
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
202 \r
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
222 \r
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
LG
228 DpObj.Header.GetVersion(), Path, Md5Sum)\r
229 \r
230 self._AddDp(DpObj.Header.GetGuid(), DpObj.Header.GetVersion(), \\r
231 NewDpPkgFileName, DpPkgFileName, RePackage)\r
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
242 # @param Guid Guid of the distribution package \r
243 # @param Version Version of the distribution package \r
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
249 \r
4231a819 250 if Version is None or len(Version.strip()) == 0:\r
4234283c
LG
251 Version = 'N/A'\r
252 \r
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
267 \r
268 ## Add a file list from DP\r
269 #\r
270 # @param DpGuid: A DpGuid \r
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
287 \r
288 ## Add a package install information\r
289 #\r
290 # @param Guid: A package guid \r
291 # @param Version: A package version\r
292 # @param DpGuid: A DpGuid \r
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
297 \r
4231a819 298 if Version is None or len(Version.strip()) == 0:\r
4234283c
LG
299 Version = 'N/A'\r
300 \r
4231a819 301 if DpGuid is None or len(DpGuid.strip()) == 0:\r
4234283c
LG
302 DpGuid = 'N/A'\r
303 \r
4231a819 304 if DpVersion is None or len(DpVersion.strip()) == 0:\r
4234283c
LG
305 DpVersion = 'N/A'\r
306 \r
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
315 \r
316 ## Add a module that from a package install information\r
317 #\r
d0acc87a
LG
318 # @param Guid: Module Guid \r
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
LG
326 PkgVersion=None, Path=''):\r
327 \r
4231a819 328 if Version is None or len(Version.strip()) == 0:\r
4234283c
LG
329 Version = 'N/A'\r
330 \r
4231a819 331 if PkgGuid is None or len(PkgGuid.strip()) == 0:\r
4234283c
LG
332 PkgGuid = 'N/A'\r
333 \r
4231a819 334 if PkgVersion is None or len(PkgVersion.strip()) == 0:\r
4234283c 335 PkgVersion = 'N/A'\r
421ccda3
HC
336 \r
337 if os.name == 'posix':\r
338 Path = Path.replace('\\', os.sep)\r
339 else:\r
340 Path = Path.replace('/', os.sep)\r
4234283c
LG
341 \r
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
351 \r
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
LG
362 DpVersion=None, Path=''):\r
363 \r
4231a819 364 if Version is None or len(Version.strip()) == 0:\r
4234283c
LG
365 Version = 'N/A'\r
366 \r
4231a819 367 if DpGuid is None or len(DpGuid.strip()) == 0:\r
4234283c
LG
368 DpGuid = 'N/A'\r
369 \r
4231a819 370 if DpVersion is None or len(DpVersion.strip()) == 0:\r
4234283c
LG
371 DpVersion = 'N/A'\r
372 \r
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
382 \r
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
LG
392 DepexVersion=None):\r
393 \r
4231a819 394 if DepexGuid is None or len(DepexGuid.strip()) == 0:\r
4234283c
LG
395 DepexGuid = 'N/A'\r
396 \r
4231a819 397 if DepexVersion is None or len(DepexVersion.strip()) == 0:\r
4234283c 398 DepexVersion = 'N/A'\r
421ccda3
HC
399 \r
400 if os.name == 'posix':\r
401 Path = Path.replace('\\', os.sep)\r
402 else:\r
403 Path = Path.replace('/', os.sep)\r
4234283c
LG
404 \r
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
LG
410 self.Cur.execute(SqlCommand)\r
411 \r
412 ## Remove a distribution install information, if no version specified, \r
413 # remove all DPs with this Guid.\r
414 #\r
415 # @param DpGuid: guid of dpex \r
416 # @param DpVersion: version of dpex\r
417 #\r
418 def RemoveDpObj(self, DpGuid, DpVersion):\r
419 \r
420 PkgList = self.GetPackageListFromDp(DpGuid, DpVersion)\r
421 #\r
422 # delete from ModDepex the standalone module's dependency\r
423 #\r
424 SqlCommand = \\r
425 """delete from ModDepexInfo where ModDepexInfo.ModuleGuid in \r
426 (select ModuleGuid from StandaloneModInfo as B where B.DpGuid = '%s' \r
427 and B.DpVersion = '%s')\r
428 and ModDepexInfo.ModuleVersion in\r
429 (select ModuleVersion from StandaloneModInfo as B \r
430 where B.DpGuid = '%s' and B.DpVersion = '%s')\r
d0acc87a
LG
431 and ModDepexInfo.ModuleName in\r
432 (select ModuleName from StandaloneModInfo as B \r
433 where B.DpGuid = '%s' and B.DpVersion = '%s')\r
4234283c
LG
434 and ModDepexInfo.InstallPath in\r
435 (select InstallPath from StandaloneModInfo as B \r
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
446 """delete from ModDepexInfo where ModDepexInfo.ModuleGuid in \r
447 (select ModuleGuid from ModInPkgInfo \r
448 where ModInPkgInfo.PackageGuid ='%s' and \r
449 ModInPkgInfo.PackageVersion = '%s')\r
450 and ModDepexInfo.ModuleVersion in\r
451 (select ModuleVersion from ModInPkgInfo \r
452 where ModInPkgInfo.PackageGuid ='%s' and \r
453 ModInPkgInfo.PackageVersion = '%s')\r
d0acc87a
LG
454 and ModDepexInfo.ModuleName in\r
455 (select ModuleName from ModInPkgInfo \r
456 where ModInPkgInfo.PackageGuid ='%s' and \r
457 ModInPkgInfo.PackageVersion = '%s')\r
4234283c
LG
458 and ModDepexInfo.InstallPath in\r
459 (select InstallPath from ModInPkgInfo where \r
460 ModInPkgInfo.PackageGuid ='%s' \r
461 and ModInPkgInfo.PackageVersion = '%s')""" \\r
d0acc87a 462 % (Pkg[0], Pkg[1], Pkg[0], Pkg[1], Pkg[0], Pkg[1],Pkg[0], Pkg[1])\r
4234283c
LG
463 \r
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
477 """delete from %s where %s.PackageGuid ='%s' \r
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
496 # \r
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
503 \r
421ccda3 504 #self.Conn.commit()\r
4234283c
LG
505 \r
506 ## Get a list of distribution install information.\r
507 #\r
508 # @param Guid: distribution package guid \r
509 # @param Version: distribution package version \r
510 #\r
511 def GetDp(self, Guid, Version):\r
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
520 \r
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
536 \r
537 Logger.Verbose(ST.MSG_GET_DP_INSTALL_INFO_FINISH) \r
538 return DpList\r
539 \r
540 ## Get a list of distribution install dirs\r
541 #\r
542 # @param Guid: distribution package guid \r
543 # @param Version: distribution package version \r
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
565 # @param Guid: distribution package guid \r
566 # @param Version: distribution package version \r
567 #\r
568 def GetDpFileList(self, Guid, Version):\r
569 \r
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
4234283c
LG
581 \r
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
591 \r
592 DpInfoList = []\r
593 for Result in self.Cur:\r
594 DpInfoList.append(Result)\r
595\r
596 FileDict = {} \r
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
609 \r
610 return FileDict\r
611 \r
612 ## Get (Guid, Version) from distribution file name information.\r
613 #\r
614 # @param DistributionFile: Distribution File \r
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
625 \r
626 return (DpGuid, DpVersion, NewDpFileName)\r
627 else:\r
628 return (None, None, None)\r
629 \r
630 ## Get a list of package information.\r
631 #\r
632 # @param Guid: package guid \r
633 # @param Version: package version\r
634 #\r
635 def GetPackage(self, Guid, Version, DpGuid='', DpVersion=''):\r
636 \r
637 if DpVersion == '' or DpGuid == '':\r
638\r
639 (PackageGuid, PackageVersion) = (Guid, Version)\r
640 SqlCommand = """select * from %s where PackageGuid ='%s' \r
641 and PackageVersion = '%s'""" % (self.PkgTable, PackageGuid, \\r
642 PackageVersion)\r
643 self.Cur.execute(SqlCommand)\r
644 \r
4231a819 645 elif Version is None or len(Version.strip()) == 0:\r
4234283c
LG
646 \r
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
652 SqlCommand = """select * from %s where PackageGuid ='%s' and \r
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
667 \r
668 return PkgList\r
669 \r
670 \r
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
4234283c 679 SqlCommand = """select * from %s where ModuleGuid ='%s' and \r
d0acc87a
LG
680 ModuleVersion = '%s' and InstallPath = '%s' \r
681 and ModuleName = '%s'""" % (self.ModInPkgTable, ModuleGuid, \\r
682 ModuleVersion, InstallPath, ModuleName)\r
4234283c 683 self.Cur.execute(SqlCommand)\r
4234283c 684 else:\r
4234283c 685 SqlCommand = """select * from %s where ModuleGuid ='%s' and \r
d0acc87a
LG
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
701 \r
702 return ModList\r
703 \r
704 ## Get a list of module standalone.\r
705 #\r
706 # @param Guid: A module guid \r
707 # @param Version: A module version \r
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
4234283c 712 SqlCommand = """select * from %s where ModuleGuid ='%s' and \r
d0acc87a
LG
713 ModuleVersion = '%s' and InstallPath = '%s' \r
714 and ModuleName = '%s'""" % (self.StandaloneModTable, ModuleGuid, \\r
715 ModuleVersion, InstallPath, ModuleName)\r
4234283c
LG
716 self.Cur.execute(SqlCommand)\r
717 \r
718 else:\r
4234283c 719 SqlCommand = """select * from %s where ModuleGuid ='%s' and \r
d0acc87a 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
733 \r
734 return ModList\r
735 \r
736 ## Get a list of module information that comes from DP.\r
737 #\r
738 # @param DpGuid: A Distrabution Guid \r
739 # @param DpVersion: A Distrabution version \r
740 #\r
741 def GetSModInsPathListFromDp(self, DpGuid, DpVersion):\r
742\r
743 PathList = []\r
744 SqlCommand = """select InstallPath from %s where DpGuid ='%s' \r
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
752 \r
753 return PathList\r
754 \r
755 ## Get a list of package information.\r
756 #\r
757 # @param DpGuid: A Distrabution Guid \r
758 # @param DpVersion: A Distrabution version \r
759 #\r
760 def GetPackageListFromDp(self, DpGuid, DpVersion):\r
761\r
762 SqlCommand = """select * from %s where DpGuid ='%s' and \r
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
772 \r
773 return PkgList\r
774 \r
775 ## Get a list of modules that depends on package information from a DP.\r
776 #\r
777 # @param DpGuid: A Distrabution Guid \r
778 # @param DpVersion: A Distrabution version \r
779 #\r
780 def GetDpDependentModuleList(self, DpGuid, DpVersion):\r
781 \r
782 ModList = []\r
783 PkgList = self.GetPackageListFromDp(DpGuid, DpVersion)\r
784 if len(PkgList) > 0:\r
785 return ModList\r
786 \r
787 for Pkg in PkgList:\r
788 #\r
789 # get all in-package modules that depends on current \r
790 # Pkg (Guid match, Version match or NA) but not belong to \r
791 # current Pkg\r
792 #\r
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
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
810 # get all modules from standalone modules that depends on current \r
811 #Pkg (Guid match, Version match or NA) but not in current dp\r
812 #\r
813 SqlCommand = \\r
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
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
828 \r
829 \r
830 return ModList\r
831\r
832 ## Get Dp's list of modules.\r
833 #\r
834 # @param DpGuid: A Distrabution Guid \r
835 # @param DpVersion: A Distrabution version \r
836 #\r
837 def GetDpModuleList(self, DpGuid, DpVersion): \r
838 ModList = []\r
839 #\r
840 # get Dp module list from the DpFileList table\r
841 #\r
842 SqlCommand = """select FilePath \r
843 from %s\r
844 where DpGuid = '%s' and DpVersion = '%s' and \r
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
LG
851 \r
852 return ModList \r
853\r
854 \r
855 ## Get a module depex\r
856 #\r
857 # @param DpGuid: A module Guid \r
858 # @param DpVersion: A module version \r
859 # @param Path:\r
860 #\r
861 def GetModuleDepex(self, Guid, Version, Path):\r
862 \r
863 #\r
864 # Get module depex information to DB.\r
865 #\r
866 SqlCommand = """select * from %s where ModuleGuid ='%s' and \r
867 ModuleVersion = '%s' and InstallPath ='%s'\r
868 """ % (self.ModDepexTable, Guid, Version, Path)\r
869 self.Cur.execute(SqlCommand)\r
421ccda3 870\r
4234283c
LG
871 \r
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
877 \r
878 return DepexList\r
421ccda3
HC
879 \r
880 ## Inventory the distribution installed to current workspace\r
881 #\r
882 # Inventory the distribution installed to current workspace\r
883 # \r
884 def InventoryDistInstalled(self):\r
885 SqlCommand = """select * from %s """ % (self.DpTable)\r
886 self.Cur.execute(SqlCommand)\r
887 \r
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
893 DpFileName = Result[4] \r
894 DpInfoList.append((DpGuid, DpVersion, DpFileName, DpAliasName))\r
895 \r
896 return DpInfoList \r
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
907 drop table IF EXISTS %s \r
908 """ % self.DummyTable\r
909 self.Cur.execute(SqlCommand)\r
910 self.Conn.commit()\r
911 \r
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
918 # \r
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
924 return map(lambda s: s.replace("'", "''") , StringList)\r
925\r
926\r
927\r
928