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()