mirror of
				https://github.com/LibreTranslate/LibreTranslate.git
				synced 2025-11-04 03:27:14 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			167 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			167 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
import redis
 | 
						|
 | 
						|
storage = None
 | 
						|
def get_storage():
 | 
						|
    return storage
 | 
						|
 | 
						|
class Storage:
 | 
						|
    def exists(self, key):
 | 
						|
        raise Exception("not implemented")
 | 
						|
 | 
						|
    def set_bool(self, key, value):
 | 
						|
        raise Exception("not implemented")
 | 
						|
    def get_bool(self, key):
 | 
						|
        raise Exception("not implemented")
 | 
						|
 | 
						|
    def set_int(self, key, value):
 | 
						|
        raise Exception("not implemented")
 | 
						|
    def get_int(self, key):
 | 
						|
        raise Exception("not implemented")
 | 
						|
 | 
						|
    def set_str(self, key, value):
 | 
						|
        raise Exception("not implemented")
 | 
						|
    def get_str(self, key):
 | 
						|
        raise Exception("not implemented")
 | 
						|
 | 
						|
    def set_hash_int(self, ns, key, value):
 | 
						|
        raise Exception("not implemented")
 | 
						|
    def get_hash_int(self, ns, key):
 | 
						|
        raise Exception("not implemented")
 | 
						|
    def inc_hash_int(self, ns, key):
 | 
						|
        raise Exception("not implemented")
 | 
						|
    def dec_hash_int(self, ns, key):
 | 
						|
        raise Exception("not implemented")
 | 
						|
    
 | 
						|
    def get_hash_keys(self, ns):
 | 
						|
        raise Exception("not implemented")
 | 
						|
    def del_hash(self, ns, key):
 | 
						|
        raise Exception("not implemented")
 | 
						|
    
 | 
						|
class MemoryStorage(Storage):
 | 
						|
    def __init__(self):
 | 
						|
        self.store = {}
 | 
						|
    
 | 
						|
    def exists(self, key):
 | 
						|
        return key in self.store
 | 
						|
 | 
						|
    def set_bool(self, key, value):
 | 
						|
        self.store[key] = bool(value)
 | 
						|
    
 | 
						|
    def get_bool(self, key):
 | 
						|
        return bool(self.store[key])
 | 
						|
 | 
						|
    def set_int(self, key, value):
 | 
						|
        self.store[key] = int(value)
 | 
						|
 | 
						|
    def get_int(self, key):
 | 
						|
        return int(self.store.get(key, 0))
 | 
						|
    
 | 
						|
    def set_str(self, key, value):
 | 
						|
        self.store[key] = value
 | 
						|
    
 | 
						|
    def get_str(self, key):
 | 
						|
        return str(self.store.get(key, ""))
 | 
						|
 | 
						|
    def set_hash_int(self, ns, key, value):
 | 
						|
        if ns not in self.store:
 | 
						|
            self.store[ns] = {}
 | 
						|
        self.store[ns][key] = int(value)
 | 
						|
 | 
						|
    def get_hash_int(self, ns, key):
 | 
						|
        d = self.store.get(ns, {})
 | 
						|
        return int(d.get(key, 0))
 | 
						|
 | 
						|
    def inc_hash_int(self, ns, key):
 | 
						|
        if ns not in self.store:
 | 
						|
            self.store[ns] = {}
 | 
						|
        
 | 
						|
        if key not in self.store[ns]:
 | 
						|
            self.store[ns][key] = 0
 | 
						|
        else:
 | 
						|
            self.store[ns][key] += 1
 | 
						|
 | 
						|
    def dec_hash_int(self, ns, key):
 | 
						|
        if ns not in self.store:
 | 
						|
            self.store[ns] = {}
 | 
						|
        
 | 
						|
        if key not in self.store[ns]:
 | 
						|
            self.store[ns][key] = 0
 | 
						|
        else:
 | 
						|
            self.store[ns][key] -= 1
 | 
						|
 | 
						|
    def get_all_hash_int(self, ns):
 | 
						|
        if ns in self.store:
 | 
						|
            return [{str(k): int(v)} for k,v in self.store[ns].items()]
 | 
						|
        else:
 | 
						|
            return []
 | 
						|
 | 
						|
    def del_hash(self, ns, key):
 | 
						|
        del self.store[ns][key]
 | 
						|
 | 
						|
 | 
						|
class RedisStorage(Storage):
 | 
						|
    def __init__(self, redis_uri):
 | 
						|
        self.conn = redis.from_url(redis_uri)
 | 
						|
        self.conn.ping()
 | 
						|
    
 | 
						|
    def exists(self, key):
 | 
						|
        return bool(self.conn.exists(key))
 | 
						|
 | 
						|
    def set_bool(self, key, value):
 | 
						|
        self.conn.set(key, "1" if value else "0")
 | 
						|
    
 | 
						|
    def get_bool(self, key):
 | 
						|
        return bool(self.conn.get(key))
 | 
						|
 | 
						|
    def set_int(self, key, value):
 | 
						|
        self.conn.set(key, str(value))
 | 
						|
 | 
						|
    def get_int(self, key):
 | 
						|
        v = self.conn.get(key)
 | 
						|
        if v is None:
 | 
						|
            return 0
 | 
						|
        else:
 | 
						|
            return v
 | 
						|
    
 | 
						|
    def set_str(self, key, value):
 | 
						|
        self.conn.set(key, value)
 | 
						|
    
 | 
						|
    def get_str(self, key):
 | 
						|
        v = self.conn.get(key)
 | 
						|
        if v is None:
 | 
						|
            return ""
 | 
						|
        else:
 | 
						|
            return v.decode('utf-8')
 | 
						|
    
 | 
						|
    def get_hash_int(self, ns, key):
 | 
						|
        v = self.conn.hget(ns, key)
 | 
						|
        if v is None:
 | 
						|
            return 0
 | 
						|
        else:
 | 
						|
            return int(v)
 | 
						|
    
 | 
						|
    def set_hash_int(self, ns, key, value):
 | 
						|
        self.conn.hset(ns, key, value)
 | 
						|
 | 
						|
    def inc_hash_int(self, ns, key):
 | 
						|
        return int(self.conn.hincrby(ns, key))
 | 
						|
 | 
						|
    def dec_hash_int(self, ns, key):
 | 
						|
        return int(self.conn.hincrby(ns, key, -1))
 | 
						|
 | 
						|
    def get_all_hash_int(self, ns):
 | 
						|
        return {k.decode("utf-8"): int(v) for k,v in self.conn.hgetall(ns).items()}
 | 
						|
 | 
						|
    def del_hash(self, ns, key):
 | 
						|
        self.conn.hdel(ns, key)
 | 
						|
 | 
						|
def setup(storage_uri):
 | 
						|
    global storage
 | 
						|
    if storage_uri.startswith("memory://"):
 | 
						|
        storage = MemoryStorage()
 | 
						|
    elif storage_uri.startswith("redis://"):
 | 
						|
        storage = RedisStorage(storage_uri)
 | 
						|
    else:
 | 
						|
        raise Exception("Invalid storage URI: " + storage_uri)
 | 
						|
 | 
						|
    return storage |