diff options
Diffstat (limited to 'ick2/trans.py')
-rw-r--r-- | ick2/trans.py | 108 |
1 files changed, 25 insertions, 83 deletions
diff --git a/ick2/trans.py b/ick2/trans.py index da2f80d..c5dc22f 100644 --- a/ick2/trans.py +++ b/ick2/trans.py @@ -14,75 +14,19 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. -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): - self.token = token - self.store = store + def __init__(self, state, kind, rid): + 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) + self.rid = rid + if state.has_resource(kind, rid): + self.resource = state.get_resource(kind, rid) 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.resource = ick2.resource_from_dict({}) methods = [ 'as_dict', @@ -99,12 +43,7 @@ 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) - else: - self.store.update(self.token, self.rid, obj, self.rev) + self.state.write_resource(self.kind, self.rid, self.resource) class TransactionalState: @@ -112,22 +51,25 @@ class TransactionalState: def __init__(self, state): self.state = state - def new(self, token, kind, name): - return TransactionalResource(True, token, self.state, kind, name) + def new(self, kind, rid): + return TransactionalResource(self.state, kind, rid) - def modify(self, token, kind, name): - return TransactionalResource(False, token, self.state, kind, name) + def modify(self, kind, rid): + if not self.state.has_resource(kind, rid): + raise ick2.NotFound(kind=kind, rid=rid) + return TransactionalResource(self.state, kind, rid) - 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) + def get_resource_ids(self, kind): + return self.state.get_resource_ids(kind) - def get_resources(self, token, kind): - return [ - self.get_resource(token, kind, name) - for name in find_names_by_kind(self.state, token, kind) - ] + def has_resource(self, kind, rid): + return self.state.has_resource(kind, rid) + + def get_resource(self, kind, rid): + return self.state.get_resource(kind, rid) + + def get_resources(self, kind): + return self.state.get_resources(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) + def remove_resource(self, kind, rid): + self.state.remove_resource(kind, rid) |