From 2dd948091136d43eb099c1fcd58eebd34d63cd04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eray=20=C3=96zkural?= Date: Mon, 24 Oct 2005 11:07:44 +0000 Subject: [PATCH] * make all db's use lockeddbshelve * fix: long standing bug that prevented dbs and locks from being properly closed at exit, now pisi.finalize does something :) --- pisi/api.py | 16 +++++++++------- pisi/cli/commands.py | 1 - pisi/files.py | 1 - pisi/installdb.py | 9 +++++++++ pisi/lockeddbshelve.py | 13 ++++++++++++- pisi/packagedb.py | 30 ++++++++++++------------------ pisi/repodb.py | 19 ++++++++++++------- pisi/sourcedb.py | 11 +++-------- tools/cat-db.py | 4 +--- 9 files changed, 58 insertions(+), 46 deletions(-) diff --git a/pisi/api.py b/pisi/api.py index c6dae761..9803f5ff 100644 --- a/pisi/api.py +++ b/pisi/api.py @@ -73,15 +73,16 @@ def init(database = True, options = None, ui = None, comar = True): ctx.repodb = None ctx.installdb = None ctx.filesdb = None + ctx.ui.debug('PISI API initialized') def finalize(): - def delete_db(db): - if db: - del db - for x in [ctx.repodb, ctx.installdb, ctx.filesdb]: - delete_db(x) - + pisi.repodb.finalize() + pisi.installdb.finalize() + if ctx.filesdb != None: + ctx.filesdb.close() + packagedb.finalize_db() + ctx.ui.debug('PISI API finalized') def list_upgradable(): ignore_build = ctx.config.options and ctx.config.options.ignore_build_no @@ -221,8 +222,9 @@ def add_repo(name, indexuri): def remove_repo(name): if ctx.repodb.has_repo(name): ctx.repodb.remove_repo(name) + ctx.ui.info(_('Repo %s removed from system.') % repo) else: - ctx.ui.error(_('* Repository %s does not exist. Cannot remove.') + ctx.ui.error(_('Repository %s does not exist. Cannot remove.') % name) def update_repo(repo): diff --git a/pisi/cli/commands.py b/pisi/cli/commands.py index 412c05b2..8cdbb6bd 100644 --- a/pisi/cli/commands.py +++ b/pisi/cli/commands.py @@ -658,7 +658,6 @@ Remove all repository information from the system. self.init() for repo in self.args: pisi.api.remove_repo(repo) - ctx.ui.info(_('Repo %s removed from system.') % repo) self.finalize() else: self.help() diff --git a/pisi/files.py b/pisi/files.py index 40399d39..ec2b1446 100644 --- a/pisi/files.py +++ b/pisi/files.py @@ -108,7 +108,6 @@ class FilesDB(shelve.LockedDBShelf): def __init__(self): shelve.LockedDBShelf.__init__(self, 'files') - #self.files_dir = pisi.util.join_path(ctx.config.db_dir(), 'files') def add_files(self, pkg_name, files): for x in files.list: diff --git a/pisi/installdb.py b/pisi/installdb.py index ea659836..a5a973c2 100644 --- a/pisi/installdb.py +++ b/pisi/installdb.py @@ -77,6 +77,10 @@ class InstallDB: self.dp = shelve.LockedDBShelf('configpending') self.files_dir = pisi.util.join_path(ctx.config.db_dir(), 'files') + def close(self): + self.d.close() + self.dp.close() + def files_name(self, pkg, version, release): from pisi.util import join_path as join pkg_dir = join(ctx.config.lib_dir(), pkg + '-' + version + '-' + release) @@ -166,3 +170,8 @@ def init(): db = InstallDB() return db +def finalize(): + global db + if db: + db.close() + diff --git a/pisi/lockeddbshelve.py b/pisi/lockeddbshelve.py index 2c82c632..76558af3 100644 --- a/pisi/lockeddbshelve.py +++ b/pisi/lockeddbshelve.py @@ -12,7 +12,6 @@ # # Authors: Eray Ozkural - import bsddb.dbshelve as shelve import bsddb.db as db import os @@ -50,8 +49,15 @@ class LockedDBShelf(shelve.DBShelf): raise Error, _("Flags should be one of 'r', 'w', 'c' or 'n' or use the bsddb.db.DB_* flags") filename = os.path.join( pisi.context.config.db_dir(), dbname + '.bdb') self.open(filename, dbname, filetype, flags, mode) + self.filename = filename + self.closed = False + + def __del__(self): + # superclass does something funky, we don't need that + pass def open(self, filename, dbname, filetype, flags, mode): + #print 'open', filename pisi.util.check_dir(pisi.context.config.db_dir()) self.lockfile = file(filename + '.lock', 'w') try: @@ -61,5 +67,10 @@ class LockedDBShelf(shelve.DBShelf): return self.db.open(filename, dbname, filetype, flags, mode) def close(self): + if self.closed: + return self.db.close() self.lockfile.close() + os.unlink(self.filename + '.lock') + #print 'closed', self.filename + self.closed = True diff --git a/pisi/packagedb.py b/pisi/packagedb.py index bde99471..7df85c43 100644 --- a/pisi/packagedb.py +++ b/pisi/packagedb.py @@ -30,6 +30,7 @@ _ = __trans.ugettext import pisi import pisi.util as util import pisi.context as ctx +import pisi.lockeddbshelve as shelve class Error(pisi.Error): pass @@ -38,22 +39,12 @@ class PackageDB(object): """PackageDB class provides an interface to the package database with a delegated dbshelve object""" def __init__(self, id): - util.check_dir(ctx.config.db_dir()) - self.fname = os.path.join(ctx.config.db_dir(), 'package-%s.bdb' % id ) - self.fname2 = os.path.join(ctx.config.db_dir(), 'revdep-%s.bdb' % id ) - self.lockfile = file(self.fname + '.lock', 'w') - try: - fcntl.flock(self.lockfile, fcntl.LOCK_EX | fcntl.LOCK_NB) - except IOError, e: - raise Error(_("Cannot lock PackageDB: %s") % e) - self.d = shelve.open(self.fname) - self.dr = shelve.open(self.fname2) + self.d = shelve.LockedDBShelf('package-%s' % id ) + self.dr = shelve.LockedDBShelf('revdep-%s' % id ) - def __del__(self): - pass - #self.d.close() - #self.dr.close() - #self.lockfile.close() + def close(self): + self.d.close() + self.dr.close() def has_package(self, name): name = str(name) @@ -107,7 +98,7 @@ def get_db(name): def remove_db(name): del packagedbs[name] #erase database file - + def has_package(name): repo = which_repo(name) if repo or thirdparty_packagedb.has_package(name) or inst_packagedb.has_package(name): @@ -160,6 +151,9 @@ def init_db(): def finalize_db(): if pisi.packagedb.thirdparty_packagedb: - del pisi.packagedb.thirdparty_packagedb + pisi.packagedb.thirdparty_packagedb.close() if pisi.packagedb.inst_packagedb: - del pisi.packagedb.inst_packagedb + pisi.packagedb.inst_packagedb.close() + if pisi.packagedb.packagedbs: + pisi.packagedb.packagedbs.close() + diff --git a/pisi/repodb.py b/pisi/repodb.py index 7a147b45..9f8d0207 100644 --- a/pisi/repodb.py +++ b/pisi/repodb.py @@ -53,7 +53,7 @@ class RepoDB(object): for x in self.list(): packagedb.add_db(x) - def __del__(self): + def close(self): self.d.close() def repo_name(self, ix): @@ -103,11 +103,16 @@ class RepoDB(object): db = None def init(): - global db - if db: - return db + if pisi.repodb.db: + return pisi.repodb.db - db = RepoDB() - db.init_dbs() - return db + pisi.repodb.db = RepoDB() + pisi.repodb.db.init_dbs() + return pisi.repodb.db +def finalize(): + global db + if pisi.repodb.db: + db.close() + + diff --git a/pisi/sourcedb.py b/pisi/sourcedb.py index 84fa02a1..5a4c5299 100644 --- a/pisi/sourcedb.py +++ b/pisi/sourcedb.py @@ -29,20 +29,15 @@ _ = __trans.ugettext import pisi.util as util import pisi.context as ctx +import pisi.lockeddbshelve as shelve class SourceDB(object): def __init__(self): - util.check_dir(ctx.config.db_dir()) - self.filename = os.path.join(ctx.config.db_dir(), 'source.bdb') - self.d = shelve.open(self.filename) - self.fdummy = file(self.filename + '.lock', 'w') - fcntl.flock(self.fdummy, fcntl.LOCK_EX) + self.d = shelve.LockedDBShelf('source') def __del__(self): - #fcntl.flock(self.fdummy, fcntl.LOCK_UN) - self.fdummy.close() - #os.unlink(self.filename + '.lock') + self.d.close() def has_source(self, name): name = str(name) diff --git a/tools/cat-db.py b/tools/cat-db.py index 20f8b9cf..ad2c5565 100755 --- a/tools/cat-db.py +++ b/tools/cat-db.py @@ -9,9 +9,7 @@ # # Please read the COPYING file. # - -# perform analysis on problem instances and store results in a database -# avoiding multiple invocations of the same instance +# Author: Eray Ozkural import sys import bsddb.dbshelve as shelve