From 67de4c99b46c5f77950393a0f5b88a400949c331 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Fri, 18 Oct 2019 10:49:25 +0300 Subject: Revert "Drop: use of old persistent state classes" This reverts commit 8344a860d226d8a5172bcb2e9de5946717a950ca. --- ick2/trans.py | 98 ++++++++++++++--------------------------------------------- 1 file changed, 23 insertions(+), 75 deletions(-) (limited to 'ick2/trans.py') diff --git a/ick2/trans.py b/ick2/trans.py index da2f80d..119f277 100644 --- a/ick2/trans.py +++ b/ick2/trans.py @@ -14,75 +14,22 @@ # along with this program. If not, see . -import copy - - import ick2 -def wrap(kind, name, as_dict): - return { - 'kind': kind, - 'name': name, - 'res': copy.deepcopy(as_dict), - } - - -def unwrap(obj): - return obj['kind'], obj['name'], copy.deepcopy(obj['res']) - - -def find_by_name(store, token, kind, name): - rids = store.search(token, None) # FIXME for real searches - for rid in rids: - obj, rev = store.show(token, rid) - if obj is not None: - okind, oname, as_dict = unwrap(obj) - if okind == kind and oname == name: - return as_dict, rid, rev - - raise ick2.NotFound(kind=kind, name=name) - - -def find_names_by_kind(store, token, kind): - rids = store.search(token, None) # FIXME for real searches - for rid in rids: - obj, rev = store.show(token, rid) - if obj is not None: - okind, oname, as_dict = unwrap(obj) - if okind == kind: - yield oname - - class TransactionalResource: - def __init__(self, new, token, store, kind, name): + def __init__(self, token, state, kind, name): self.token = token - self.store = store + self.state = state self.kind = kind self.name = name - - self.rid = None - self.rev = None - self.resource = None - - if new: - try: - find_by_name(self.store, token, kind, name) - except ick2.NotFound: - as_dict = {} - else: - raise ick2.ExistsAlready(name) + if state.has_resource(self.token, kind, name): + self.new = False + self.resource = state.get_resource(self.token, kind, name) else: - try: - as_dict, self.rid, self.rev = find_by_name( - self.store, token, kind, name) - except ick2.NotFound: - raise - - self.resource = ick2.resource_from_dict(as_dict) - assert ((new and self.rid is None) or - (not new and self.rid is not None)) + self.new = True + self.resource = ick2.resource_from_dict({}) methods = [ 'as_dict', @@ -99,12 +46,12 @@ class TransactionalResource: def __exit__(self, exc_type, value, traceback): if exc_type is None: - as_dict = self.resource.as_dict() - obj = wrap(self.kind, self.name, as_dict) - if self.rid is None: - self.store.create(self.token, obj) + if self.new: + self.state.write_resource( + self.token, self.kind, self.name, self.resource) else: - self.store.update(self.token, self.rid, obj, self.rev) + self.state.update_resource( + self.token, self.kind, self.name, self.resource) class TransactionalState: @@ -113,21 +60,22 @@ class TransactionalState: self.state = state def new(self, token, kind, name): - return TransactionalResource(True, token, self.state, kind, name) + if self.state.has_resource(token, kind, name): + raise ick2.ExistsAlaready(name) + return TransactionalResource(token, self.state, kind, name) def modify(self, token, kind, name): - return TransactionalResource(False, token, self.state, kind, name) + if not self.state.has_resource(token, kind, name): + raise ick2.NotFound(kind=kind, name=name) + return TransactionalResource(token, self.state, kind, name) def get_resource(self, token, kind, name): - as_dict, rid, rev = find_by_name(self.state, token, kind, name) - return ick2.resource_from_dict(as_dict) + return self.state.get_resource(token, kind, name) def get_resources(self, token, kind): - return [ - self.get_resource(token, kind, name) - for name in find_names_by_kind(self.state, token, kind) - ] + return self.state.get_resources(token, kind) def remove_resource(self, token, kind, name): - as_dict, rid, rev = find_by_name(self.state, token, kind, name) - self.state.delete(token, rid) + if not self.state.has_resource(token, kind, name): + raise ick2.NotFound(kind=kind, name=name) + self.state.remove_resource(token, kind, name) -- cgit v1.2.1