Example #1
0
    def get_dbdir_summary(self, dirpath, name):
        """
        Returns (people_count, bsddb_version, schema_version) of
        current DB.
        Returns ("Unknown", "Unknown", "Unknown") if invalid DB or other error.
        """
        if config.get('preferences.use-bsddb3'):
            from bsddb3 import dbshelve, db
        else:
            from bsddb import dbshelve, db

        from gen.db import META, PERSON_TBL
        from gen.db.dbconst import BDBVERSFN

        bdbversion_file = os.path.join(dirpath, BDBVERSFN)
        if os.path.isfile(bdbversion_file):
            vers_file = open(bdbversion_file)
            bsddb_version = vers_file.readline().strip()
        else:
            return "Unknown", "Unknown", "Unknown"

        current_bsddb_version = str(db.version())
        if bsddb_version != current_bsddb_version:
            return "Unknown", bsddb_version, "Unknown"

        env = db.DBEnv()
        flags = db.DB_CREATE | db.DB_PRIVATE |\
            db.DB_INIT_MPOOL |\
            db.DB_INIT_LOG | db.DB_INIT_TXN
        try:
            env.open(dirpath, flags)
        except Exception as msg:
            LOG.warning("Error opening db environment for '%s': %s" %
                        (name, str(msg)))
            try:
                env.close()
            except Exception as msg:
                LOG.warning("Error closing db environment for '%s': %s" %
                            (name, str(msg)))
            return "Unknown", bsddb_version, "Unknown"
        dbmap1 = dbshelve.DBShelf(env)
        fname = os.path.join(dirpath, META + ".db")
        try:
            dbmap1.open(fname, META, db.DB_HASH, db.DB_RDONLY)
        except:
            env.close()
            return "Unknown", bsddb_version, "Unknown"
        schema_version = dbmap1.get('version', default=None)
        dbmap1.close()
        dbmap2 = dbshelve.DBShelf(env)
        fname = os.path.join(dirpath, PERSON_TBL + ".db")
        try:
            dbmap2.open(fname, PERSON_TBL, db.DB_HASH, db.DB_RDONLY)
        except:
            env.close()
            return "Unknown", bsddb_version, schema_version
        count = len(dbmap2)
        dbmap2.close()
        env.close()
        return (count, bsddb_version, schema_version)
Example #2
0
    def _open_tables(self):
        dbmap = dbshelve.DBShelf(self.env)
        dbmap.db.set_pagesize(16384)
        dbmap.open(self.full_name, 'person', db.DB_HASH,
                   db.DB_CREATE | db.DB_AUTO_COMMIT, 0o666)
        person_map = dbmap

        table_flags = db.DB_CREATE | db.DB_AUTO_COMMIT

        surnames = db.DB(self.env)
        surnames.set_flags(db.DB_DUP | db.DB_DUPSORT)
        surnames.open(self.full_name,
                      "surnames",
                      db.DB_BTREE,
                      flags=table_flags)

        def find_surname(key, data):
            val = data.surname
            if isinstance(val, str):
                val = val.encode('utf-8')
            return val

        person_map.associate(surnames, find_surname, table_flags)

        return (person_map, surnames)
Example #3
0
    def _open_treetables(self):
        dbmap = dbshelve.DBShelf(self.env)
        dbmap.db.set_pagesize(16384)
        dbmap.open(self.full_name, 'places', db.DB_HASH,
                   db.DB_CREATE | db.DB_AUTO_COMMIT, 0o666)
        place_map = dbmap

        table_flags = db.DB_CREATE | db.DB_AUTO_COMMIT

        placerefs = db.DB(self.env)
        placerefs.set_flags(db.DB_DUP | db.DB_DUPSORT)
        placerefs.open(self.full_name,
                       "placerefs",
                       db.DB_BTREE,
                       flags=table_flags)

        def find_placeref(key, data):
            val = data[2]
            if isinstance(val, str):
                val = val.encode('utf-8')
            return val

        place_map.associate(placerefs, find_placeref, table_flags)

        return (place_map, placerefs)
Example #4
0
    def do_open(self):
        self.homeDir = homeDir = os.path.join(
            os.path.dirname(sys.argv[0]), 'db_home')
        try: os.mkdir(homeDir)
        except os.error: pass
        self.env = db.DBEnv()
        self.env.open(homeDir, self.envflags | db.DB_INIT_MPOOL | db.DB_CREATE)

        self.filename = os.path.split(self.filename)[1]
        self.d = dbshelve.DBShelf(self.env)
        self.d.open(self.filename, self.dbtype, self.dbflags)
Example #5
0
 def __init__(self, generator, directory=None, prefix=None, suffix=None):
     """Create a new generator list cache.
     
     generator - the generator to cache
     directory - optional directory to create the cache
                 (defaults to dbfile_directory)
     prefix - filename prefix for the cache (defaults to dbfile_prefix)
     suffix - filename suffix for the cache (defaults to dbfile_suffix)
     
     Following attributes are bound to the instance:
     generator - the generator itself
     uid - the unique ID of this cache ("%s-%s" % (os.getpid(), id(self))
     path - the path to the cachefile
     cache - the cache object
     
     Note that using negative indices automatically leads to consuming
     the whole generator.
     """
     assert hasattr(generator, "next") and \
         hasattr(generator, "__iter__")
     super(dbcache, self).__init__()
     if directory is None:
         directory = dbcache.dbfile_directory
     if prefix is None:
         prefix = dbcache.dbfile_prefix
     if suffix is None:
         suffix = dbcache.dbfile_suffix
     self.generator = generator
     self.uid = "%i-%i" % (os.getpid(), id(self))
     self.path = "%s/%s%s%s" % \
         (directory, suffix, self.uid, prefix)
     try:
         os.unlink(self.path)
     except OSError:
         pass
     self.__idx = None
     self.__len = None
     self.cache = dbshelve.DBShelf()
     self.cache.open(self.path, None, db.DB_HASH, db.DB_CREATE)
Example #6
0
 def do_open(self):
     self.d = dbshelve.DBShelf()
     self.d.open(self.filename, self.dbtype, self.dbflags)
Example #7
0
        """
        return self.db.put(key, data, txn or self.txn, **kwargs)

    def delete(self, key, txn=None, **kwargs):
        """
        Removes a key/data pair from the database
        """
        self.db.delete(key, txn or self.txn, **kwargs)


# test code
if __name__ == "__main__":
    print("1")
    from bsddb3 import db, dbshelve
    print("2")
    x = db.DBEnv()
    print("3")
    x.open('/tmp', db.DB_CREATE | db.DB_PRIVATE |\
                         db.DB_INIT_MPOOL |\
                         db.DB_INIT_LOG | db.DB_INIT_TXN)
    print("4")
    d = dbshelve.DBShelf(x)
    print("5")
    #from tran import BSDDBTxn as T
    print("6")
    T = BSDDBTxn
    with T(x) as tx:
        print("stat", tx.stat())
        print("id", tx.id())
        tx.checkpoint()