diff --git a/TODO b/TODO index ddab0ffe..779de81b 100644 --- a/TODO +++ b/TODO @@ -38,7 +38,7 @@ Legend: 2. Alpha + write specfile (eray) - / file locking for database access + / file locking for database access (eray) - verify metodlari - SpecFile - MetaData diff --git a/pisi/packagedb.py b/pisi/packagedb.py index cdd38869..9da2d4e5 100644 --- a/pisi/packagedb.py +++ b/pisi/packagedb.py @@ -7,25 +7,20 @@ # we basically store everything in PackageInfo class # yes, we are cheap -from bsddb.dbshelve import DBShelf +#from bsddb.dbshelve import DBShelf +import bsddb.dbshelve as shelve import os, fcntl import util from config import config from bsddb import db -class PackageDB(DBShelf): +class PackageDB(object): def __init__(self): - DBShelf.__init__(self) util.check_dir(config.db_dir()) filename = os.path.join(config.db_dir(), 'package.bdb') - #d.open(filename, dbname, filetype, flags, mode) - flags = db.DB_CREATE - mode = 0660 - filetype=db.DB_HASH - dbname = None - self.open( filename, dbname, filetype, flags, mode ) + self.d = shelve.open(filename) self.fdummy = open(filename) fcntl.flock(self.fdummy, fcntl.LOCK_EX) @@ -35,19 +30,19 @@ class PackageDB(DBShelf): def has_package(self, name): name = str(name) - return self.has_key(name) + return self.d.has_key(name) def get_package(self, name): name = str(name) - return self[name] + return self.d[name] def add_package(self, package_info): name = str(package_info.name) - self[name] = package_info + self.d[name] = package_info def remove_package(self, name): name = str(name) - del self[name] + del self.d[name] packagedb = PackageDB() diff --git a/pisi/sourcedb.py b/pisi/sourcedb.py index fcf3b421..75e93bcd 100644 --- a/pisi/sourcedb.py +++ b/pisi/sourcedb.py @@ -7,12 +7,41 @@ # yes, we are cheap import bsddb.dbshelve as shelve +import os, fcntl -util.check_dir(config.db_dir()) -d = shelve.open(config.db_dir() + '/source.bdb') +import util +from config import config +from bsddb import db -def add_source(name, source_info): - d[name] = source_info +class SourceDB(object): + + def __init__(self): + util.check_dir(config.db_dir()) + filename = os.path.join(config.db_dir(), 'source.bdb') + self.d = shelve.open(filename) + self.fdummy = open(filename) + fcntl.flock(self.fdummy, fcntl.LOCK_EX) + + def __del__(self): + #fcntl.flock(self.fdummy, fcntl.LOCK_UN) + self.fdummy.close() + + def has_source(self, name): + name = str(name) + return self.d.has_key(name) + + def get_source(self, name): + name = str(name) + return self.d[name] + + def add_source(self, source_info): + assert source_info.verify() + name = str(source_info.name) + self.d[name] = source_info + + def remove_source(self, name): + name = str(name) + del self.d[name] + +sourcedb = SourceDB() -def remove_source(name): - del d[name] diff --git a/pisi/specfile.py b/pisi/specfile.py index e65d8b9f..fd38a3b3 100644 --- a/pisi/specfile.py +++ b/pisi/specfile.py @@ -128,6 +128,11 @@ class SourceInfo: xml.addNodeUnder(node, "History", update.elt(xml)) return node + def verify(self): + ret = True + ret &= len(self.history) > 0 + return ret + class PackageInfo: """A structure to hold package information. Package information is located under tag in PSPEC file. Opposite to Source each diff --git a/tests/sourcedbtests.py b/tests/sourcedbtests.py index 548051c2..6fc0fe67 100644 --- a/tests/sourcedbtests.py +++ b/tests/sourcedbtests.py @@ -2,7 +2,7 @@ import unittest import os -from pisi import packagedb +from pisi.sourcedb import sourcedb from pisi import util from pisi import context @@ -12,12 +12,12 @@ class SourceDBTestCase(unittest.TestCase): self.ctx = context.BuildContext("samples/popt/popt.pspec") def testAdd(self): - sourcedb.add_source("testsourcedb", self.ctx.spec.source) - self.assert_(sourcedb.has_package("testsourcedb")) + sourcedb.add_source(self.ctx.spec.source) + self.assert_(sourcedb.has_source("popt")) def testRemove(self): self.testAdd() - sourcedb.remove_package("testsourcedb") - self.assert_(not sourcedb.has_package("testsourcedb")) + sourcedb.remove_source("popt") + self.assert_(not sourcedb.has_source("popt")) suite = unittest.makeSuite(SourceDBTestCase)