Example #1
0
class Database():
    '''A wrapper around a bsddb database, acting as a dictionary.
    Can accept all Python datatypes as keys and values. All bencoding types
    are just dictionaries, lists, integers and strings, so this is enough!'''

    def __init__(self, dbname, flag='c'):
        '''Read the database given by dbname. '''
        dbPath = dbname
        engine = create_engine("sqlite:///%s" % dbPath, echo=True)
        self.data = MetaData(engine)
        print self.data

    def __contains__(self, key):
        '''Return true if database contains a key'''
        key = dumps(key)
        # has_key returns 1 or 0 (but shouldn't this just by key in data?)
        boolean = self.data.has_key(key)
        return bool(boolean)

    def __getitem__(self, key):
        '''Return the value held by the key'''
        key = dumps(key)
        value = self.data[key]
        return loads(value)

    has_key = __contains__
    get = __getitem__

    def __setitem__(self, key, value):
        '''Set the value of key to the value given. '''
        key = dumps(key)
        value = dumps(value)
        self.data[key] = value

    def __repr__(self):
        '''represents the database'''
        keys = self.data.keys()
        items = [(loads(key), loads(self.data[key])) for key in keys]
        return str(dict(items))

    def clear(self):
        '''Remove all data in the database. '''
        self.data.clear()

    def items(self):
        '''Return a list of tuples of the keys and values '''
        keys = self.data.keys()
        items = [(loads(key), loads(self.data[key])) for key in keys]
        return items

    def values(self):
        '''Returns a list of values '''
        values = [loads(value) for value in self.data.values()]
        return values

    def pop(self, key):
        '''Return the value held by key, or default
           if it isn't in the database '''
        key = dumps(key)
        value = self.data[key]
        del self.data[key]
        return loads(value)

    def setdefault(self, key, default):
        '''Return the value held by key, or default if isn't in the database'''
        key = dumps(key)
        try:
            value = self.data[key]
        except KeyError:
            return default
        return loads(value)

    def __del__(self):
        '''Syncs database'''
        self.data.sync()