* 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.repodb = None
|
||||||
ctx.installdb = None
|
ctx.installdb = None
|
||||||
ctx.filesdb = None
|
ctx.filesdb = None
|
||||||
|
ctx.ui.debug('PISI API initialized')
|
||||||
|
|
||||||
def finalize():
|
def finalize():
|
||||||
def delete_db(db):
|
pisi.repodb.finalize()
|
||||||
if db:
|
pisi.installdb.finalize()
|
||||||
del db
|
if ctx.filesdb != None:
|
||||||
for x in [ctx.repodb, ctx.installdb, ctx.filesdb]:
|
ctx.filesdb.close()
|
||||||
delete_db(x)
|
|
||||||
|
|
||||||
packagedb.finalize_db()
|
packagedb.finalize_db()
|
||||||
|
ctx.ui.debug('PISI API finalized')
|
||||||
|
|
||||||
def list_upgradable():
|
def list_upgradable():
|
||||||
ignore_build = ctx.config.options and ctx.config.options.ignore_build_no
|
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):
|
def remove_repo(name):
|
||||||
if ctx.repodb.has_repo(name):
|
if ctx.repodb.has_repo(name):
|
||||||
ctx.repodb.remove_repo(name)
|
ctx.repodb.remove_repo(name)
|
||||||
|
ctx.ui.info(_('Repo %s removed from system.') % repo)
|
||||||
else:
|
else:
|
||||||
ctx.ui.error(_('* Repository %s does not exist. Cannot remove.')
|
ctx.ui.error(_('Repository %s does not exist. Cannot remove.')
|
||||||
% name)
|
% name)
|
||||||
|
|
||||||
def update_repo(repo):
|
def update_repo(repo):
|
||||||
|
|||||||
@@ -658,7 +658,6 @@ Remove all repository information from the system.
|
|||||||
self.init()
|
self.init()
|
||||||
for repo in self.args:
|
for repo in self.args:
|
||||||
pisi.api.remove_repo(repo)
|
pisi.api.remove_repo(repo)
|
||||||
ctx.ui.info(_('Repo %s removed from system.') % repo)
|
|
||||||
self.finalize()
|
self.finalize()
|
||||||
else:
|
else:
|
||||||
self.help()
|
self.help()
|
||||||
|
|||||||
@@ -108,7 +108,6 @@ class FilesDB(shelve.LockedDBShelf):
|
|||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
shelve.LockedDBShelf.__init__(self, 'files')
|
shelve.LockedDBShelf.__init__(self, 'files')
|
||||||
#self.files_dir = pisi.util.join_path(ctx.config.db_dir(), 'files')
|
|
||||||
|
|
||||||
def add_files(self, pkg_name, files):
|
def add_files(self, pkg_name, files):
|
||||||
for x in files.list:
|
for x in files.list:
|
||||||
|
|||||||
@@ -77,6 +77,10 @@ class InstallDB:
|
|||||||
self.dp = shelve.LockedDBShelf('configpending')
|
self.dp = shelve.LockedDBShelf('configpending')
|
||||||
self.files_dir = pisi.util.join_path(ctx.config.db_dir(), 'files')
|
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):
|
def files_name(self, pkg, version, release):
|
||||||
from pisi.util import join_path as join
|
from pisi.util import join_path as join
|
||||||
pkg_dir = join(ctx.config.lib_dir(), pkg + '-' + version + '-' + release)
|
pkg_dir = join(ctx.config.lib_dir(), pkg + '-' + version + '-' + release)
|
||||||
@@ -166,3 +170,8 @@ def init():
|
|||||||
db = InstallDB()
|
db = InstallDB()
|
||||||
return db
|
return db
|
||||||
|
|
||||||
|
def finalize():
|
||||||
|
global db
|
||||||
|
if db:
|
||||||
|
db.close()
|
||||||
|
|
||||||
|
|||||||
+12
-1
@@ -12,7 +12,6 @@
|
|||||||
#
|
#
|
||||||
# Authors: Eray Ozkural <eray@uludag.org.tr>
|
# Authors: Eray Ozkural <eray@uludag.org.tr>
|
||||||
|
|
||||||
|
|
||||||
import bsddb.dbshelve as shelve
|
import bsddb.dbshelve as shelve
|
||||||
import bsddb.db as db
|
import bsddb.db as db
|
||||||
import os
|
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")
|
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')
|
filename = os.path.join( pisi.context.config.db_dir(), dbname + '.bdb')
|
||||||
self.open(filename, dbname, filetype, flags, mode)
|
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):
|
def open(self, filename, dbname, filetype, flags, mode):
|
||||||
|
#print 'open', filename
|
||||||
pisi.util.check_dir(pisi.context.config.db_dir())
|
pisi.util.check_dir(pisi.context.config.db_dir())
|
||||||
self.lockfile = file(filename + '.lock', 'w')
|
self.lockfile = file(filename + '.lock', 'w')
|
||||||
try:
|
try:
|
||||||
@@ -61,5 +67,10 @@ class LockedDBShelf(shelve.DBShelf):
|
|||||||
return self.db.open(filename, dbname, filetype, flags, mode)
|
return self.db.open(filename, dbname, filetype, flags, mode)
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
|
if self.closed:
|
||||||
|
return
|
||||||
self.db.close()
|
self.db.close()
|
||||||
self.lockfile.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
|
||||||
import pisi.util as util
|
import pisi.util as util
|
||||||
import pisi.context as ctx
|
import pisi.context as ctx
|
||||||
|
import pisi.lockeddbshelve as shelve
|
||||||
|
|
||||||
class Error(pisi.Error):
|
class Error(pisi.Error):
|
||||||
pass
|
pass
|
||||||
@@ -38,22 +39,12 @@ class PackageDB(object):
|
|||||||
"""PackageDB class provides an interface to the package database with
|
"""PackageDB class provides an interface to the package database with
|
||||||
a delegated dbshelve object"""
|
a delegated dbshelve object"""
|
||||||
def __init__(self, id):
|
def __init__(self, id):
|
||||||
util.check_dir(ctx.config.db_dir())
|
self.d = shelve.LockedDBShelf('package-%s' % id )
|
||||||
self.fname = os.path.join(ctx.config.db_dir(), 'package-%s.bdb' % id )
|
self.dr = shelve.LockedDBShelf('revdep-%s' % 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)
|
|
||||||
|
|
||||||
def __del__(self):
|
def close(self):
|
||||||
pass
|
self.d.close()
|
||||||
#self.d.close()
|
self.dr.close()
|
||||||
#self.dr.close()
|
|
||||||
#self.lockfile.close()
|
|
||||||
|
|
||||||
def has_package(self, name):
|
def has_package(self, name):
|
||||||
name = str(name)
|
name = str(name)
|
||||||
@@ -107,7 +98,7 @@ def get_db(name):
|
|||||||
def remove_db(name):
|
def remove_db(name):
|
||||||
del packagedbs[name]
|
del packagedbs[name]
|
||||||
#erase database file
|
#erase database file
|
||||||
|
|
||||||
def has_package(name):
|
def has_package(name):
|
||||||
repo = which_repo(name)
|
repo = which_repo(name)
|
||||||
if repo or thirdparty_packagedb.has_package(name) or inst_packagedb.has_package(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():
|
def finalize_db():
|
||||||
if pisi.packagedb.thirdparty_packagedb:
|
if pisi.packagedb.thirdparty_packagedb:
|
||||||
del pisi.packagedb.thirdparty_packagedb
|
pisi.packagedb.thirdparty_packagedb.close()
|
||||||
if pisi.packagedb.inst_packagedb:
|
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():
|
for x in self.list():
|
||||||
packagedb.add_db(x)
|
packagedb.add_db(x)
|
||||||
|
|
||||||
def __del__(self):
|
def close(self):
|
||||||
self.d.close()
|
self.d.close()
|
||||||
|
|
||||||
def repo_name(self, ix):
|
def repo_name(self, ix):
|
||||||
@@ -103,11 +103,16 @@ class RepoDB(object):
|
|||||||
db = None
|
db = None
|
||||||
|
|
||||||
def init():
|
def init():
|
||||||
global db
|
if pisi.repodb.db:
|
||||||
if db:
|
return pisi.repodb.db
|
||||||
return db
|
|
||||||
|
|
||||||
db = RepoDB()
|
pisi.repodb.db = RepoDB()
|
||||||
db.init_dbs()
|
pisi.repodb.db.init_dbs()
|
||||||
return db
|
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.util as util
|
||||||
import pisi.context as ctx
|
import pisi.context as ctx
|
||||||
|
import pisi.lockeddbshelve as shelve
|
||||||
|
|
||||||
class SourceDB(object):
|
class SourceDB(object):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
util.check_dir(ctx.config.db_dir())
|
self.d = shelve.LockedDBShelf('source')
|
||||||
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)
|
|
||||||
|
|
||||||
def __del__(self):
|
def __del__(self):
|
||||||
#fcntl.flock(self.fdummy, fcntl.LOCK_UN)
|
self.d.close()
|
||||||
self.fdummy.close()
|
|
||||||
#os.unlink(self.filename + '.lock')
|
|
||||||
|
|
||||||
def has_source(self, name):
|
def has_source(self, name):
|
||||||
name = str(name)
|
name = str(name)
|
||||||
|
|||||||
+1
-3
@@ -9,9 +9,7 @@
|
|||||||
#
|
#
|
||||||
# Please read the COPYING file.
|
# Please read the COPYING file.
|
||||||
#
|
#
|
||||||
|
# Author: Eray Ozkural <eray@uludag.org.tr>
|
||||||
# perform analysis on problem instances and store results in a database
|
|
||||||
# avoiding multiple invocations of the same instance
|
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
import bsddb.dbshelve as shelve
|
import bsddb.dbshelve as shelve
|
||||||
|
|||||||
Reference in New Issue
Block a user