* 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 :)
This commit is contained in:
Eray Özkural
2005-10-24 11:07:44 +00:00
parent 79e969eb50
commit 2dd9480911
9 changed files with 58 additions and 46 deletions
+9 -7
View File
@@ -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):
-1
View File
@@ -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()
-1
View File
@@ -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:
+9
View File
@@ -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()
+12 -1
View File
@@ -12,7 +12,6 @@
#
# Authors: Eray Ozkural <eray@uludag.org.tr>
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
+12 -18
View File
@@ -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()
+12 -7
View File
@@ -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()
+3 -8
View File
@@ -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)
+1 -3
View File
@@ -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 <eray@uludag.org.tr>
import sys
import bsddb.dbshelve as shelve