Ejemplo n.º 1
0
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)