]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - BaseTools/Source/Python/UPT/Core/IpiDb.py
BaseTools: Clean up source files
[mirror_edk2.git] / BaseTools / Source / Python / UPT / Core / IpiDb.py
... / ...
CommitLineData
1## @file\r
2# This file is for installed package information database operations\r
3#\r
4# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>\r
5#\r
6# This program and the accompanying materials are licensed and made available\r
7# under the terms and conditions of the BSD License which accompanies this\r
8# distribution. The full text of the license may be found at\r
9# http://opensource.org/licenses/bsd-license.php\r
10#\r
11# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13#\r
14\r
15'''\r
16IpiDb\r
17'''\r
18\r
19##\r
20# Import Modules\r
21#\r
22import sqlite3\r
23import os.path\r
24import time\r
25\r
26import Logger.Log as Logger\r
27from Logger import StringTable as ST\r
28from Logger.ToolError import UPT_ALREADY_RUNNING_ERROR\r
29from Logger.ToolError import UPT_DB_UPDATE_ERROR\r
30import platform as pf\r
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
43 def __init__(self, DbPath, Workspace):\r
44 Dir = os.path.dirname(DbPath)\r
45 if not os.path.isdir(Dir):\r
46 os.mkdir(Dir)\r
47 self.Conn = sqlite3.connect(unicode(DbPath), isolation_level='DEFERRED')\r
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
58 self.Workspace = os.path.normpath(Workspace)\r
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
124 ModuleName TEXT NOT NULL,\r
125 InstallTime REAL NOT NULL,\r
126 PackageGuid TEXT,\r
127 PackageVersion TEXT,\r
128 InstallPath TEXT NOT NULL,\r
129 PRIMARY KEY (ModuleGuid, ModuleVersion, ModuleName, InstallPath)\r
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
137 ModuleName TEXT NOT NULL,\r
138 InstallTime REAL NOT NULL,\r
139 DpGuid TEXT,\r
140 DpVersion TEXT,\r
141 InstallPath TEXT NOT NULL,\r
142 PRIMARY KEY (ModuleGuid, ModuleVersion, ModuleName, InstallPath)\r
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
150 ModuleName TEXT NOT NULL,\r
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
161 def RollBack(self):\r
162 self.Conn.rollback()\r
163\r
164 def Commit(self):\r
165 self.Conn.commit()\r
166\r
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
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
204 ModGuid = ModKey[0]\r
205 ModVersion = ModKey[1]\r
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
213 for Dep in ModObj.GetPackageDependencyList():\r
214 DepexGuid = Dep.GetGuid()\r
215 DepexVersion = Dep.GetVersion()\r
216 self._AddModuleDepex(ModGuid, ModVersion, ModName, ModInstallPath, \\r
217 DepexGuid, DepexVersion)\r
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
227 self._AddDpFilePathList(DpObj.Header.GetGuid(), \\r
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
233 except sqlite3.IntegrityError as DetailMsg:\r
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
239\r
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
250 if Version is None or len(Version.strip()) == 0:\r
251 Version = 'N/A'\r
252\r
253 #\r
254 # Add newly installed DP information to DB.\r
255 #\r
256 if NewDpFileName is None or len(NewDpFileName.strip()) == 0:\r
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
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
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
298 if Version is None or len(Version.strip()) == 0:\r
299 Version = 'N/A'\r
300\r
301 if DpGuid is None or len(DpGuid.strip()) == 0:\r
302 DpGuid = 'N/A'\r
303\r
304 if DpVersion is None or len(DpVersion.strip()) == 0:\r
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
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
324 #\r
325 def _AddModuleInPackage(self, Guid, Version, Name, PkgGuid=None, \\r
326 PkgVersion=None, Path=''):\r
327\r
328 if Version is None or len(Version.strip()) == 0:\r
329 Version = 'N/A'\r
330\r
331 if PkgGuid is None or len(PkgGuid.strip()) == 0:\r
332 PkgGuid = 'N/A'\r
333\r
334 if PkgVersion is None or len(PkgVersion.strip()) == 0:\r
335 PkgVersion = 'N/A'\r
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
341\r
342 #\r
343 # Add module from package information to DB.\r
344 #\r
345 CurrentTime = time.time()\r
346 SqlCommand = \\r
347 """insert into %s values('%s', '%s', '%s', %s, '%s', '%s', '%s')""" % \\r
348 (self.ModInPkgTable, Guid, Version, Name, CurrentTime, PkgGuid, PkgVersion, \\r
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
356 # @param Name: a module name\r
357 # @param DpGuid: a DpGuid\r
358 # @param DpVersion: a DpVersion\r
359 # @param Path: path\r
360 #\r
361 def _AddStandaloneModule(self, Guid, Version, Name, DpGuid=None, \\r
362 DpVersion=None, Path=''):\r
363\r
364 if Version is None or len(Version.strip()) == 0:\r
365 Version = 'N/A'\r
366\r
367 if DpGuid is None or len(DpGuid.strip()) == 0:\r
368 DpGuid = 'N/A'\r
369\r
370 if DpVersion is None or len(DpVersion.strip()) == 0:\r
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
378 """insert into %s values('%s', '%s', '%s', %s, '%s', '%s', '%s')""" % \\r
379 (self.StandaloneModTable, Guid, Version, Name, CurrentTime, DpGuid, \\r
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
387 # @param Name: a module name\r
388 # @param DepexGuid: a module DepexGuid\r
389 # @param DepexVersion: a module DepexVersion\r
390 #\r
391 def _AddModuleDepex(self, Guid, Version, Name, Path, DepexGuid=None, \\r
392 DepexVersion=None):\r
393\r
394 if DepexGuid is None or len(DepexGuid.strip()) == 0:\r
395 DepexGuid = 'N/A'\r
396\r
397 if DepexVersion is None or len(DepexVersion.strip()) == 0:\r
398 DepexVersion = 'N/A'\r
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
404\r
405 #\r
406 # Add module depex information to DB.\r
407 #\r
408 SqlCommand = """insert into %s values('%s', '%s', '%s', '%s', '%s', '%s')"""\\r
409 % (self.ModDepexTable, Guid, Version, Name, Path, DepexGuid, DepexVersion)\r
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
431 and ModDepexInfo.ModuleName in\r
432 (select ModuleName from StandaloneModInfo as B\r
433 where B.DpGuid = '%s' and B.DpVersion = '%s')\r
434 and ModDepexInfo.InstallPath in\r
435 (select InstallPath from StandaloneModInfo as B\r
436 where B.DpGuid = '%s' and B.DpVersion = '%s') """ % \\r
437 (DpGuid, DpVersion, DpGuid, DpVersion, DpGuid, DpVersion, DpGuid, DpVersion)\r
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
454 and ModDepexInfo.ModuleName in\r
455 (select ModuleName from ModInPkgInfo\r
456 where ModInPkgInfo.PackageGuid ='%s' and\r
457 ModInPkgInfo.PackageVersion = '%s')\r
458 and ModDepexInfo.InstallPath in\r
459 (select InstallPath from ModInPkgInfo where\r
460 ModInPkgInfo.PackageGuid ='%s'\r
461 and ModInPkgInfo.PackageVersion = '%s')""" \\r
462 % (Pkg[0], Pkg[1], Pkg[0], Pkg[1], Pkg[0], Pkg[1], Pkg[0], Pkg[1])\r
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
504 #self.Conn.commit()\r
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
513 if Version is None or len(Version.strip()) == 0:\r
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
580 PathList.append((os.path.join(self.Workspace, Path), Md5Sum))\r
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
617 SqlCommand = """select * from %s where NewPkgFileName = '%s'""" % \\r
618 (self.DpTable, DistributionFile)\r
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
645 elif Version is None or len(Version.strip()) == 0:\r
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
676 def GetModInPackage(self, Guid, Version, Name, Path, PkgGuid='', PkgVersion=''):\r
677 (ModuleGuid, ModuleVersion, ModuleName, InstallPath) = (Guid, Version, Name, Path)\r
678 if PkgVersion == '' or PkgGuid == '':\r
679 SqlCommand = """select * from %s where ModuleGuid ='%s' and\r
680 ModuleVersion = '%s' and InstallPath = '%s'\r
681 and ModuleName = '%s'""" % (self.ModInPkgTable, ModuleGuid, \\r
682 ModuleVersion, InstallPath, ModuleName)\r
683 self.Cur.execute(SqlCommand)\r
684 else:\r
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
688 and PackageVersion = '%s'\r
689 """ % (self.ModInPkgTable, ModuleGuid, \\r
690 ModuleVersion, InstallPath, ModuleName, PkgGuid, PkgVersion)\r
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
709 def GetStandaloneModule(self, Guid, Version, Name, Path, DpGuid='', DpVersion=''):\r
710 (ModuleGuid, ModuleVersion, ModuleName, InstallPath) = (Guid, Version, Name, Path)\r
711 if DpGuid == '':\r
712 SqlCommand = """select * from %s where ModuleGuid ='%s' and\r
713 ModuleVersion = '%s' and InstallPath = '%s'\r
714 and ModuleName = '%s'""" % (self.StandaloneModTable, ModuleGuid, \\r
715 ModuleVersion, InstallPath, ModuleName)\r
716 self.Cur.execute(SqlCommand)\r
717\r
718 else:\r
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
721 """ % (self.StandaloneModTable, ModuleGuid, \\r
722 ModuleVersion, ModuleName, InstallPath, DpGuid, DpVersion)\r
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
850 ModList.append(os.path.join(self.Workspace, FilePath))\r
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
870\r
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
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
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\r