2022-01-31 13:10:04 +01:00
|
|
|
# local imports
|
|
|
|
from .state import State
|
2022-02-01 15:38:24 +01:00
|
|
|
from .error import StateItemExists
|
2022-01-31 13:10:04 +01:00
|
|
|
|
|
|
|
|
|
|
|
class PersistedState(State):
|
|
|
|
|
|
|
|
def __init__(self, factory, bits, logger=None):
|
|
|
|
super(PersistedState, self).__init__(bits, logger=logger)
|
|
|
|
self.__store_factory = factory
|
|
|
|
self.__stores = {}
|
|
|
|
|
|
|
|
|
|
|
|
def __ensure_store(self, k):
|
|
|
|
if self.__stores.get(k) == None:
|
|
|
|
self.__stores[k] = self.__store_factory(k)
|
|
|
|
|
|
|
|
|
2022-02-01 10:34:36 +01:00
|
|
|
def put(self, key, contents=None, state=None, force=False):
|
2022-02-01 14:54:27 +01:00
|
|
|
to_state = super(PersistedState, self).put(key, state=state, contents=contents, force=force)
|
|
|
|
|
|
|
|
k = self.name(to_state)
|
|
|
|
|
2022-01-31 13:10:04 +01:00
|
|
|
self.__ensure_store(k)
|
2022-02-01 10:34:36 +01:00
|
|
|
self.__stores[k].add(key, contents, force=force)
|
2022-01-31 13:10:04 +01:00
|
|
|
|
|
|
|
|
2022-02-01 14:54:27 +01:00
|
|
|
def set(self, key, or_state):
|
|
|
|
from_state = self.state(key)
|
|
|
|
k_from = self.name(from_state)
|
2022-01-31 13:10:04 +01:00
|
|
|
|
2022-02-01 14:54:27 +01:00
|
|
|
to_state = super(PersistedState, self).set(key, or_state)
|
2022-01-31 13:10:04 +01:00
|
|
|
k_to = self.name(to_state)
|
2022-02-01 14:54:27 +01:00
|
|
|
self.__ensure_store(k_to)
|
2022-01-31 13:10:04 +01:00
|
|
|
|
2022-02-01 14:54:27 +01:00
|
|
|
contents = self.__stores[k_from].get(key)
|
|
|
|
self.__stores[k_to].add(key, contents)
|
|
|
|
self.__stores[k_from].remove(key)
|
|
|
|
|
|
|
|
return to_state
|
|
|
|
|
|
|
|
|
|
|
|
def unset(self, key, not_state):
|
2022-02-01 08:01:57 +01:00
|
|
|
from_state = self.state(key)
|
2022-01-31 13:10:04 +01:00
|
|
|
k_from = self.name(from_state)
|
|
|
|
|
2022-02-01 14:54:27 +01:00
|
|
|
to_state = super(PersistedState, self).unset(key, not_state)
|
|
|
|
|
|
|
|
k_to = self.name(to_state)
|
|
|
|
self.__ensure_store(k_to)
|
|
|
|
|
|
|
|
contents = self.__stores[k_from].get(key)
|
|
|
|
self.__stores[k_to].add(key, contents)
|
|
|
|
self.__stores[k_from].remove(key)
|
|
|
|
|
|
|
|
return to_state
|
|
|
|
|
|
|
|
|
|
|
|
def move(self, key, to_state):
|
|
|
|
from_state = self.state(key)
|
|
|
|
to_state = super(PersistedState, self).move(key, to_state)
|
2022-02-02 10:27:57 +01:00
|
|
|
return self.__movestore(key, from_state, to_state)
|
2022-02-01 14:54:27 +01:00
|
|
|
|
2022-02-02 10:27:57 +01:00
|
|
|
|
|
|
|
def __movestore(self, key, from_state, to_state):
|
|
|
|
k_from = self.name(from_state)
|
2022-02-01 14:54:27 +01:00
|
|
|
k_to = self.name(to_state)
|
2022-02-02 10:27:57 +01:00
|
|
|
|
2022-01-31 13:10:04 +01:00
|
|
|
self.__ensure_store(k_to)
|
|
|
|
|
2022-02-01 08:01:57 +01:00
|
|
|
contents = self.__stores[k_from].get(key)
|
|
|
|
self.__stores[k_to].add(key, contents)
|
|
|
|
self.__stores[k_from].remove(key)
|
2022-01-31 13:10:04 +01:00
|
|
|
|
2022-02-01 14:54:27 +01:00
|
|
|
return to_state
|
2022-01-31 13:10:04 +01:00
|
|
|
|
|
|
|
|
2022-02-01 08:01:57 +01:00
|
|
|
def purge(self, key):
|
|
|
|
state = self.state(key)
|
2022-01-31 13:10:04 +01:00
|
|
|
k = self.name(state)
|
|
|
|
|
2022-02-02 22:46:11 +01:00
|
|
|
# self.__ensure_store(k)
|
2022-02-01 08:01:57 +01:00
|
|
|
self.__stores[k].remove(key)
|
|
|
|
super(PersistedState, self).purge(key)
|
2022-02-01 15:38:24 +01:00
|
|
|
|
|
|
|
|
|
|
|
def sync(self, state):
|
|
|
|
k = self.name(state)
|
|
|
|
|
2022-02-03 11:05:59 +01:00
|
|
|
self.__ensure_store(k)
|
|
|
|
|
2022-02-01 15:38:24 +01:00
|
|
|
for o in self.__stores[k].list():
|
2022-02-02 22:46:11 +01:00
|
|
|
self.__ensure_store(k)
|
2022-02-01 15:38:24 +01:00
|
|
|
try:
|
|
|
|
super(PersistedState, self).put(o[0], state=state, contents=o[1])
|
|
|
|
except StateItemExists:
|
|
|
|
pass
|
2022-02-02 08:24:43 +01:00
|
|
|
|
|
|
|
|
|
|
|
def path(self, state, key=None):
|
|
|
|
k = self.name(state)
|
|
|
|
|
2022-02-02 22:46:11 +01:00
|
|
|
self.__ensure_store(k)
|
|
|
|
|
2022-02-02 08:24:43 +01:00
|
|
|
return self.__stores[k].path(key=key)
|
2022-02-02 10:27:57 +01:00
|
|
|
|
|
|
|
|
|
|
|
def next(self, key=None):
|
|
|
|
from_state = self.state(key)
|
|
|
|
to_state = super(PersistedState, self).next(key)
|
|
|
|
return self.__movestore(key, from_state, to_state)
|