* 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:
+9
-7
@@ -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):
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user