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