mirror of
https://github.com/simon987/hexlib.git
synced 2025-04-20 02:06:42 +00:00
Add sep option in volatile state
This commit is contained in:
parent
53a262a138
commit
30902c8235
40
hexlib/db.py
40
hexlib/db.py
@ -12,8 +12,9 @@ from hexlib.env import get_redis
|
|||||||
class PersistentState:
|
class PersistentState:
|
||||||
"""Quick and dirty persistent dict-like SQLite wrapper"""
|
"""Quick and dirty persistent dict-like SQLite wrapper"""
|
||||||
|
|
||||||
def __init__(self, dbfile="state.db", **dbargs):
|
def __init__(self, dbfile="state.db", logger=None, **dbargs):
|
||||||
self.dbfile = dbfile
|
self.dbfile = dbfile
|
||||||
|
self.logger = logger
|
||||||
if dbargs is None:
|
if dbargs is None:
|
||||||
dbargs = {"timeout": 30000}
|
dbargs = {"timeout": 30000}
|
||||||
self.dbargs = dbargs
|
self.dbargs = dbargs
|
||||||
@ -25,14 +26,15 @@ class PersistentState:
|
|||||||
class VolatileState:
|
class VolatileState:
|
||||||
"""Quick and dirty volatile dict-like redis wrapper"""
|
"""Quick and dirty volatile dict-like redis wrapper"""
|
||||||
|
|
||||||
def __init__(self, prefix, redis_db=None):
|
def __init__(self, prefix, redis_db=None, sep=""):
|
||||||
if redis_db is None:
|
if redis_db is None:
|
||||||
redis_db = get_redis()
|
redis_db = get_redis()
|
||||||
self.rdb = redis_db
|
self.rdb = redis_db
|
||||||
self.prefix = prefix
|
self.prefix = prefix
|
||||||
|
self._sep = sep
|
||||||
|
|
||||||
def __getitem__(self, table):
|
def __getitem__(self, table):
|
||||||
return RedisTable(self, table)
|
return RedisTable(self, table, self._sep)
|
||||||
|
|
||||||
|
|
||||||
class VolatileQueue:
|
class VolatileQueue:
|
||||||
@ -56,59 +58,63 @@ class VolatileQueue:
|
|||||||
class VolatileBooleanState:
|
class VolatileBooleanState:
|
||||||
"""Quick and dirty volatile dict-like redis wrapper for boolean values"""
|
"""Quick and dirty volatile dict-like redis wrapper for boolean values"""
|
||||||
|
|
||||||
def __init__(self, prefix, redis_db=None):
|
def __init__(self, prefix, redis_db=None, sep=""):
|
||||||
if redis_db is None:
|
if redis_db is None:
|
||||||
redis_db = get_redis()
|
redis_db = get_redis()
|
||||||
self.rdb = redis_db
|
self.rdb = redis_db
|
||||||
self.prefix = prefix
|
self.prefix = prefix
|
||||||
|
self._sep = sep
|
||||||
|
|
||||||
def __getitem__(self, table):
|
def __getitem__(self, table):
|
||||||
return RedisBooleanTable(self, table)
|
return RedisBooleanTable(self, table, self._sep)
|
||||||
|
|
||||||
|
|
||||||
class RedisTable:
|
class RedisTable:
|
||||||
def __init__(self, state, table):
|
def __init__(self, state, table, sep=""):
|
||||||
self._state = state
|
self._state = state
|
||||||
self._table = table
|
self._table = table
|
||||||
|
self._sep = sep
|
||||||
|
self._key = f"{self._state.prefix}{self._sep}{self._table}"
|
||||||
|
|
||||||
def __setitem__(self, key, value):
|
def __setitem__(self, key, value):
|
||||||
self._state.rdb.hset(self._state.prefix + self._table, str(key), umsgpack.dumps(value))
|
self._state.rdb.hset(self._key, str(key), umsgpack.dumps(value))
|
||||||
|
|
||||||
def __getitem__(self, key):
|
def __getitem__(self, key):
|
||||||
val = self._state.rdb.hget(self._state.prefix + self._table, str(key))
|
val = self._state.rdb.hget(self._key, str(key))
|
||||||
if val:
|
if val:
|
||||||
return umsgpack.loads(val)
|
return umsgpack.loads(val)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def __delitem__(self, key):
|
def __delitem__(self, key):
|
||||||
self._state.rdb.hdel(self._state.prefix + self._table, str(key))
|
self._state.rdb.hdel(self._key, str(key))
|
||||||
|
|
||||||
def __iter__(self):
|
def __iter__(self):
|
||||||
val = self._state.rdb.hgetall(self._state.prefix + self._table)
|
val = self._state.rdb.hgetall(self._key)
|
||||||
if val:
|
if val:
|
||||||
return ((k, umsgpack.loads(v)) for k, v in
|
return ((k, umsgpack.loads(v)) for k, v in val.items())
|
||||||
self._state.rdb.hgetall(self._state.prefix + self._table).items())
|
|
||||||
|
|
||||||
|
|
||||||
class RedisBooleanTable:
|
class RedisBooleanTable:
|
||||||
def __init__(self, state, table):
|
def __init__(self, state, table, sep=""):
|
||||||
self._state = state
|
self._state = state
|
||||||
self._table = table
|
self._table = table
|
||||||
|
self._sep = sep
|
||||||
|
self._key = f"{self._state.prefix}{self._sep}{self._table}"
|
||||||
|
|
||||||
def __setitem__(self, key, value):
|
def __setitem__(self, key, value):
|
||||||
if value:
|
if value:
|
||||||
self._state.rdb.sadd(self._state.prefix + self._table, str(key))
|
self._state.rdb.sadd(self._key, str(key))
|
||||||
else:
|
else:
|
||||||
self.__delitem__(key)
|
self.__delitem__(key)
|
||||||
|
|
||||||
def __getitem__(self, key):
|
def __getitem__(self, key):
|
||||||
return self._state.rdb.sismember(self._state.prefix + self._table, str(key))
|
return self._state.rdb.sismember(self._key, str(key))
|
||||||
|
|
||||||
def __delitem__(self, key):
|
def __delitem__(self, key):
|
||||||
self._state.rdb.srem(self._state.prefix + self._table, str(key))
|
self._state.rdb.srem(self._key, str(key))
|
||||||
|
|
||||||
def __iter__(self):
|
def __iter__(self):
|
||||||
return iter(self._state.rdb.smembers(self._state.prefix + self._table))
|
return iter(self._state.rdb.smembers(self._key))
|
||||||
|
|
||||||
|
|
||||||
class Table:
|
class Table:
|
||||||
|
2
setup.py
2
setup.py
@ -2,7 +2,7 @@ from setuptools import setup
|
|||||||
|
|
||||||
setup(
|
setup(
|
||||||
name="hexlib",
|
name="hexlib",
|
||||||
version="1.37",
|
version="1.38",
|
||||||
description="Misc utility methods",
|
description="Misc utility methods",
|
||||||
author="simon987",
|
author="simon987",
|
||||||
author_email="me@simon987.net",
|
author_email="me@simon987.net",
|
||||||
|
@ -16,6 +16,17 @@ class TestVolatileState(TestCase):
|
|||||||
|
|
||||||
self.assertDictEqual(val, s["a"]["1"])
|
self.assertDictEqual(val, s["a"]["1"])
|
||||||
|
|
||||||
|
def test_sep(self):
|
||||||
|
s = VolatileState(prefix="test1", sep=":")
|
||||||
|
val = {
|
||||||
|
"field1": 1,
|
||||||
|
"arr1": [1, 2, 3]
|
||||||
|
}
|
||||||
|
|
||||||
|
s["a"]["1"] = val
|
||||||
|
|
||||||
|
self.assertDictEqual(val, s["a"]["1"])
|
||||||
|
|
||||||
def test_iter(self):
|
def test_iter(self):
|
||||||
s = VolatileState(prefix="test2")
|
s = VolatileState(prefix="test2")
|
||||||
|
|
||||||
@ -52,6 +63,16 @@ class TestVolatileBoolState(TestCase):
|
|||||||
self.assertTrue(s["a"]["2"])
|
self.assertTrue(s["a"]["2"])
|
||||||
self.assertFalse(s["a"]["3"])
|
self.assertFalse(s["a"]["3"])
|
||||||
|
|
||||||
|
def test_sep(self):
|
||||||
|
s = VolatileBooleanState(prefix="test1", sep=":")
|
||||||
|
|
||||||
|
s["a"]["1"] = True
|
||||||
|
s["a"]["2"] = True
|
||||||
|
|
||||||
|
self.assertTrue(s["a"]["1"])
|
||||||
|
self.assertTrue(s["a"]["2"])
|
||||||
|
self.assertFalse(s["a"]["3"])
|
||||||
|
|
||||||
def test_iter(self):
|
def test_iter(self):
|
||||||
s = VolatileBooleanState(prefix="test2")
|
s = VolatileBooleanState(prefix="test2")
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user