From 78878638e8642c8e6627e3d4ec1fff6f0a026404 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eray=20=C3=96zkural?= Date: Thu, 20 Apr 2006 13:02:27 +0000 Subject: [PATCH] * this patch will have to wait for a while --- pisi/packagedb-metadata.py | 173 +++++++++++++++++++++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 pisi/packagedb-metadata.py diff --git a/pisi/packagedb-metadata.py b/pisi/packagedb-metadata.py new file mode 100644 index 00000000..036e6271 --- /dev/null +++ b/pisi/packagedb-metadata.py @@ -0,0 +1,173 @@ +# -*- coding: utf-8 -*- +# +# Copyright (C) 2005, TUBITAK/UEKAE +# +# This program is free software; you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation; either version 2 of the License, or (at your option) +# any later version. +# +# Please read the COPYING file. +# + +# package database +# interface for update/query to local package repository + +# Authors: Eray Ozkural +# Baris Metin + +# we basically store everything in MetaData +# yes, we are cheap + +import os +import fcntl +import types + +import gettext +__trans = gettext.translation('pisi', fallback=True) +_ = __trans.ugettext + +import pisi +import pisi.util as util +import pisi.context as ctx +import pisi.lockeddbshelve as shelve +from pisi.itembyrepodb import ItemByRepoDB +import pisi.itembyrepodb as itembyrepodb +from pisi.metadata import MetaData + +class Error(pisi.Error): + pass + +class NotfoundError(pisi.Error): + def __init__(self, pkg): + pisi.Error.__init__("Package %s not found" % pkg) + self.pkg = pkg + +class PackageDB(object): + """PackageDB class provides an interface to the package database + using shelf objects""" + + def __init__(self): + self.d = ItemByRepoDB('package') + self.dr = ItemByRepoDB('revdep') + + def close(self): + self.d.close() + self.dr.close() + + def destroy(self): + self.d.destroy() + self.dr.destroy() + + def has_metadata(self, name, repo=None, txn = None): + return self.d.has_key(name, repo, txn=txn) + + def has_package(self, name, repo=None, txn = None): + return self.d.has_key(name, repo, txn=txn) + + def get_metadata(self, name, repo=None, txn = None): + try: + return self.d.get_item(name, repo, txn=txn) + except pisi.itembyrepodb.NotfoundError, e: + raise Error(_('Package %s not found') % name) + + def get_package(self, name, repo=None, txn = None): + return self.get_metadata(name, repo, txn).package + + def get_metadata_repo(self, name, repo=None, txn = None): + return self.d.get_item_repo(name, repo, txn=txn) + + def get_package_repo(self, name, repo=None, txn = None): + metadata, repo = self.get_metadata_repo(name, repo, txn=txn) + return metadata.package, repo + + def which_repo(self, name, txn = None): + return self.d.which_repo(name, txn=txn) + + def get_rev_deps(self, name, repo = None, txn = None): + if self.dr.has_key(name, repo, txn=txn): + return self.dr.get_item(name, repo, txn=txn) + else: + return [] + + def list_metadatas(self, repo=None, show_tracking=False): + return self.d.list(repo, show_tracking=show_tracking) + + def list_packages(self, repo=None, show_tracking=False): + return self.list_metadatas(repo, show_tracking) + + def add_metadata(self, metadata, repo, txn = None): + package_info = metadata.package + name = str(package_info.name) + + def proc(txn): + self.d.add_item(name, metadata, repo, txn) + for dep in package_info.runtimeDependencies(): + dep_name = str(dep.package) + if self.dr.has_key(dep_name, None, txn): + revdep = self.dr.get_item(dep_name, None, txn) + revdep = filter(lambda (n,d):n!=name, revdep) + revdep.append( (name, dep) ) + self.dr.add_item(dep_name, revdep, repo, txn) + else: + self.dr.add_item(dep_name, [ (name, dep) ], repo, 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, txn) + for (lang, doc) in package_info.description.iteritems(): + if lang in ['en', 'tr']: + pisi.search.add_doc('description', lang, package_info.name, doc, txn) + ctx.txn_proc(proc, txn) + + def add_package(self, package_info, repo, txn = None): + metadata = MetaData() + metadata.package = package_info + self.add_metadata(metadata, repo, txn) + + def clear(self, txn = None): + self.d.clear() + self.dr.clear() + + def remove_metadata(self, name, repo = None, txn = None): + name = str(name) + def proc(txn): + metadata = self.d.get_item(name, repo, txn=txn) + package_info = metadata.package + self.d.remove_item(name, repo, txn=txn) + if self.dr.has_key(name, repo, txn=txn): + self.dr.remove_item(name, repo, txn=txn) + #WORKAROUND: do not remove component if it is not in repo + if type(repo)==types.StringType: + ctx.componentdb.remove_package(package_info.partOf, package_info.name, txn) + self.d.txn_proc(proc, txn) + + def remove_package(self, name, repo = None, txn = None): + return self.remove_metadata(name, repo, txn) + + def remove_repo(self, repo, txn = None): + def proc(txn): + self.d.remove_repo(repo, txn=txn) + self.dr.remove_repo(repo, txn=txn) + self.d.txn_proc(proc, txn) + +pkgdb = None + +def remove_tracking_package(name, txn = None): + # remove the guy from the tracking databases + if pkgdb.has_package(name, itembyrepodb.installed, txn=txn): + pkgdb.remove_package(name, itembyrepodb.installed, txn=txn) + if pkgdb.has_package(name, itembyrepodb.thirdparty, txn=txn): + pkgdb.remove_package(name, itembyrepodb.thirdparty, txn=txn) + +def init_db(): + global pkgdb + pkgdb = PackageDB() + return pkgdb + +def finalize_db(): + global pkgdb + if pkgdb: + pkgdb.close()