]>
Commit | Line | Data |
---|---|---|
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 | |
16 | IpiDb\r | |
17 | '''\r | |
18 | \r | |
19 | ##\r | |
20 | # Import Modules\r | |
21 | #\r | |
22 | import sqlite3\r | |
23 | import os.path\r | |
24 | import time\r | |
25 | \r | |
26 | import Logger.Log as Logger\r | |
27 | from Logger import StringTable as ST\r | |
28 | from Logger.ToolError import UPT_ALREADY_RUNNING_ERROR\r | |
d0acc87a | 29 | from Logger.ToolError import UPT_DB_UPDATE_ERROR\r |
421ccda3 | 30 | import 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 | |
42 | class 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 | |
d0acc87a LG |
233 | except sqlite3.IntegrityError, 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 | |
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 | |
250 | if Version == 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 == 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 | |
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 | |
298 | if Version == None or len(Version.strip()) == 0:\r | |
299 | Version = 'N/A'\r | |
300 | \r | |
301 | if DpGuid == None or len(DpGuid.strip()) == 0:\r | |
302 | DpGuid = 'N/A'\r | |
303 | \r | |
304 | if DpVersion == 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 | |
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 | |
328 | if Version == None or len(Version.strip()) == 0:\r | |
329 | Version = 'N/A'\r | |
330 | \r | |
331 | if PkgGuid == None or len(PkgGuid.strip()) == 0:\r | |
332 | PkgGuid = 'N/A'\r | |
333 | \r | |
334 | if PkgVersion == None or len(PkgVersion.strip()) == 0:\r | |
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 | |
364 | if Version == None or len(Version.strip()) == 0:\r | |
365 | Version = 'N/A'\r | |
366 | \r | |
367 | if DpGuid == None or len(DpGuid.strip()) == 0:\r | |
368 | DpGuid = 'N/A'\r | |
369 | \r | |
370 | if DpVersion == 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 | |
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 | |
394 | if DepexGuid == None or len(DepexGuid.strip()) == 0:\r | |
395 | DepexGuid = 'N/A'\r | |
396 | \r | |
397 | if DepexVersion == None or len(DepexVersion.strip()) == 0:\r | |
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 | |
513 | if Version == 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 | |
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 | |
645 | elif Version == 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 | |
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 |