class Model: def __init__(self, clsobj=XParcel): self.__db = DB() self.__cache = Cache() self.__clsobj = clsobj self.maxCount = 4096 def open(self, filepath, mode='w'): self.mode = mode intMode = {'r':DB_RDONLY, 'w':DB_CREATE|DB_TRUNCATE, 'a':DB_CREATE}[mode] self.__db.setcache(256*1024*1024, 0) return self.__db.open(filepath, intMode) def close(self): self.sync() self.__db.close() def put(self, key, data): self.__cache.put(key, data) self.__measure() def get(self, key): value = self.__cache.get(key) if not value: value = self.db_get(key) if value: self.__cache.put(key, value) self.__measure() return value def keys(self): self.sync() cursor = self.__db.cursor() result = cursor.get(None, DB_FIRST|XDB_NOT_RETRIEVE_VAL) while result: if not result[0].startswith('__'): yield result[0] result = cursor.get(None, DB_NEXT|XDB_NOT_RETRIEVE_VAL) cursor.close() def values(self): self.sync() cursor = self.__db.cursor() result = cursor.get(None, DB_FIRST) while result: if not result[0].startswith('__'): obj = self.__clsobj() obj.unpack(result[1]) yield obj result = cursor.get(None, DB_NEXT) cursor.close() def sync(self): for key, value in self.__cache.items(): self.db_put(key, value) def items(self): self.__cache.cache_sync() cursor = self.__db.cursor() result = cursor.get(None, DB_FIRST) while result: if not result[0].startswith('__'): obj = self.__clsobj() obj.unpack(result[1]) yield result[0], obj result = cursor.get(None, DB_NEXT) cursor.close() def __measure(self): while len(self.__cache) > self.maxCount: #print len(self.__cache), self.__cache.__dict__ key, value = self.__cache.top() self.db_put(key, value) self.__cache.pop() def db_get(self, key): result = self.__db.get(key, 0) if result: obj = self.__clsobj() obj.unpack(result[1]) return obj return None def db_put(self, key, data): if self.mode != 'r': return self.__db.put(key, data.pack(), 0)