diff --git a/pisi.e3p b/pisi.e3p index dcea1c19..0b37cdf2 100644 --- a/pisi.e3p +++ b/pisi.e3p @@ -1,7 +1,7 @@ - + Python @@ -462,6 +462,10 @@ tests searchtests.py + + pisi + dbshelve.py + @@ -503,10 +507,10 @@ {'standardLayout': 1} + - - + diff --git a/pisi/atomicoperations.py b/pisi/atomicoperations.py index bbf9748a..130d6fd8 100644 --- a/pisi/atomicoperations.py +++ b/pisi/atomicoperations.py @@ -179,7 +179,6 @@ class Install(AtomicOperation): if not ctx.ui.confirm(x): raise Error(_('Package downgrade declined')) - # schedule for reinstall self.old_files = ctx.installdb.files(pkg.name) self.old_path = ctx.installdb.pkg_dir(pkg.name, iversion, irelease) diff --git a/pisi/component.py b/pisi/component.py index 8ec4960d..fa2795ce 100644 --- a/pisi/component.py +++ b/pisi/component.py @@ -87,13 +87,15 @@ class ComponentDB(object): def close(self): self.d.close() - def has_component(self, name): - return self.d.has_key(str(name)) + def has_component(self, name, txn = None): + return self.d.has_key(str(name), txn) - def get_component(self, name): - if not self.has_component(name): - self.d[name] = Component(name = name) - return self.d[name] + def get_component(self, name, txn = None): + def proc(txn): + if not self.has_component(name): + self.d[name] = Component(name = name) + return self.d[name] + return self.d.txn_proc(proc, txn) def list_components(self): list = [] @@ -101,27 +103,33 @@ class ComponentDB(object): list.append(pkg) return list - def update_component(self, component): - if self.d.has_key(component.name): - # preserve the list of packages - component.packages = self.d[component.name].packages - self.d[component.name] = component + def update_component(self, component, txn = None): + def proc(txn): + if self.d.has_key(component.name): + # preserve the list of packages + component.packages = self.d[component.name].packages + self.d[component.name] = component + self.d.txn_proc(proc, txn) - def add_package(self, component_name, package): - component = self.get_component(component_name) - component.packages.append(package) - self.d[component_name] = component # update + def add_package(self, component_name, package, txn = None): + def proc(txn): + component = self.get_component(component_name, txn) + component.packages.append(package) + self.d.put(component_name, component, txn) # update + self.d.txn_proc(proc, txn) - def remove_package(self, component_name, package): - if not self.has_component(component_name): - raise Error(_('Information for component %s not available') % component_name) - component = self.get_component(component_name) - component.packages.remove(package) - self.d[component_name] = component # update + def remove_package(self, component_name, package, txn = None): + def proc(txn): + if not self.has_component(component_name, txn): + raise Error(_('Information for component %s not available') % component_name) + component = self.get_component(component_name, txn) + component.packages.remove(package) + self.d.put(component_name, component, txn) # update + self.d.txn_proc(proc, txn) - def clear(self): - self.d.clear() + def clear(self, txn = None): + self.d.clear(txn) - def remove_component(self, name): + def remove_component(self, name, txn = None): name = str(name) - del self.d[name] + self.d.delete(name, txn) diff --git a/pisi/index.py b/pisi/index.py index ebb83fb6..3b0edc02 100644 --- a/pisi/index.py +++ b/pisi/index.py @@ -34,9 +34,11 @@ from pisi.uri import URI import pisi.component as component import pisi.specfile as specfile + class Error(pisi.Error): pass + class Index(XmlFile): __metaclass__ = autoxml.autoxml diff --git a/pisi/installdb.py b/pisi/installdb.py index e5792982..eaff85be 100644 --- a/pisi/installdb.py +++ b/pisi/installdb.py @@ -96,26 +96,33 @@ class InstallDB: def pkg_dir(self, pkg, version, release): return join(ctx.config.lib_dir(), pkg + '-' + version + '-' + release) - def is_recorded(self, pkg): + def is_recorded(self, pkg, txn = None): pkg = str(pkg) - return self.d.has_key(pkg) + def proc(txn): + return self.d.has_key(pkg) + return self.d.txn_proc(proc, txn) - def is_installed(self, pkg): + def is_installed(self, pkg, txn = None): pkg = str(pkg) - if self.is_recorded(pkg): - info = self.d[pkg] - return info.state=='i' or info.state=='ip' - else: - return False + def proc(txn): + if self.is_recorded(pkg, txn): + info = self.d.get(pkg, txn) + return info.state=='i' or info.state=='ip' + else: + return False + return self.d.txn_proc(proc, txn) - def list_installed(self): - list = [] - for (pkg, info) in self.d.items(): - if info.state=='i' or info.state=='ip': - list.append(pkg) - return list + def list_installed(self, txn = None): + def proc(txn): + list = [] + for (pkg, info) in self.d.items(txn): + if info.state=='i' or info.state=='ip': + list.append(pkg) + return list + return self.d.txn_proc(proc, txn) def list_pending(self): + # warning: reads the entire db dict = {} for (pkg, x) in self.dp.items(): pkginfo = self.d[pkg] @@ -139,18 +146,20 @@ class InstallDB: else: return False - def install(self, pkg, version, release, build, distro = ""): + def install(self, pkg, version, release, build, distro = "", txn = None): """install package with specific version, release, build""" pkg = str(pkg) - if self.is_installed(pkg): - raise InstallDBError(_("Already installed")) - if ctx.config.get_option('ignore_comar'): - state = 'ip' - self.dp[pkg] = True - else: - state = 'i' - - self.d[pkg] = InstallInfo(state, version, release, build, distro) + def proc(txn): + if self.is_installed(pkg, txn): + raise InstallDBError(_("Already installed")) + if ctx.config.get_option('ignore_comar'): + state = 'ip' + self.dp.put(pkg, True, txn) + else: + state = 'i' + self.d.put(pkg, InstallInfo(state, version, release, build, distro), txn) + + self.d.txn_proc(proc,txn) def clear_pending(self, pkg): pkg = str(pkg) @@ -188,4 +197,3 @@ def finalize(): if db: db.close() db = None - diff --git a/pisi/packagedb.py b/pisi/packagedb.py index 27505cfb..029bd732 100644 --- a/pisi/packagedb.py +++ b/pisi/packagedb.py @@ -67,24 +67,30 @@ class PackageDB(object): #TODO: list_upgrades? - def add_package(self, package_info): + def add_package(self, package_info, txn = None): name = str(package_info.name) - self.d[name] = package_info - for dep in package_info.runtimeDependencies(): - dep_name = str(dep.package) - if self.dr.has_key(dep_name): - self.dr[dep_name].append( (name, dep) ) - else: - self.dr[dep_name] = [ (name, dep) ] - # add component - ctx.componentdb.add_package(package_info.partOf, package_info.name) - # index summary and description - for (lang, doc) in package_info.summary.iteritems(): - if lang in ['en', 'tr']: - pisi.search.add_doc('summary', lang, package_info.name, doc) - for (lang, doc) in package_info.description.iteritems(): - if lang in ['en', 'tr']: - pisi.search.add_doc('description', lang, package_info.name, doc) + + def proc(txn): + self.d.put(name, package_info, txn) + for dep in package_info.runtimeDependencies(): + dep_name = str(dep.package) + if self.dr.has_key(dep_name, txn): + revdep = self.dr.get(dep_name, txn) + revdep.append( (name, dep) ) + self.dr.put(dep_name, revdep, txn) + else: + self.dr.put(dep_name, [ (name, dep) ], txn) + # add component + ctx.componentdb.add_package(package_info.partOf, package_info.name, txn) + # index summary and description + for (lang, doc) in package_info.summary.iteritems(): + if lang in ['en', 'tr']: + pisi.search.add_doc('summary', lang, package_info.name, doc) + for (lang, doc) in package_info.description.iteritems(): + if lang in ['en', 'tr']: + pisi.search.add_doc('description', lang, package_info.name, doc) + + self.d.txn_proc(proc, txn) def clear(self): self.d.clear()