def delete(self, key): """Delete an entity. Delete an existing entity from the store. key (unicode): the key of the entity that has to be deleted raise (InvalidKey): if key isn't a unicode or if no entity with that key is present in the store. """ if not isinstance(key, str) or key not in self._store: raise InvalidKey("Key not in store.") with LOCK: # delete entity old_value = self._store[key] del self._store[key] # enforce consistency for depend in self._depends: for o_key, o_value in list(iteritems(depend._store)): if not o_value.consistent(self._all_stores): depend.delete(o_key) # notify callbacks self._update_timestamp() for callback in self._delete_callbacks: callback(self.timestamp, key, old_value) # reflect changes on the persistent storage try: os.remove(os.path.join(self._path, key + '.json')) except OSError: logger.error("Unable to delete entity", exc_info=True)
def retrieve(self, key): """Retrieve an entity. Retrieve an existing entity from the store. key (unicode): the key of the entity that has to be retrieved raise (InvalidKey): if key isn't a unicode or if no entity with that key is present in the store. """ if not isinstance(key, str) or key not in self._store: raise InvalidKey("Key not in store.") # retrieve entity return self._store[key].get()
def update(self, key, data): """Update an entity. Update an existing entity with the given key and the given data. key (unicode): the key of the entity that has to be updated data (dict): the new properties of the entity raise (InvalidKey): if key isn't a unicode or if no entity with that key is present in the store. raise (InvalidData): if data cannot be parsed, if it's missing some properties or if properties are of the wrong type. """ if not isinstance(key, str) or key not in self._store: raise InvalidKey("Key not in store.") # update entity with LOCK: item = self._entity() item.set(data) if not item.consistent(self._all_stores): raise InvalidData("Inconsistent data") item.key = key old_item = self._store[key] self._store[key] = item # notify callbacks self._update_timestamp() for callback in self._update_callbacks: callback(self.timestamp, key, old_item, item) # reflect changes on the persistent storage try: path = os.path.join(self._path, key + '.json') if PY3: with io.open(path, 'wt', encoding="utf-8") as rec: json.dump(self._store[key].get(), rec) else: with io.open(path, 'wb') as rec: json.dump(self._store[key].get(), rec) except IOError: logger.error("I/O error occured while updating entity", exc_info=True)
def create(self, key, data): """Create a new entity. Create a new entity with the given key and the given data. key (unicode): the key with which the entity will be later accessed data (dict): the properties of the entity raise (InvalidKey): if key isn't a unicode or if an entity with the same key is already present in the store. raise (InvalidData): if data cannot be parsed, if it's missing some properties or if properties are of the wrong type. """ if not isinstance(key, str) or key in self._store: raise InvalidKey("Key already in store.") # create entity with LOCK: item = self._entity() item.set(data) if not item.consistent(): raise InvalidData("Inconsistent data") item.key = key self._store[key] = item # notify callbacks for callback in self._create_callbacks: callback(key, item) # reflect changes on the persistent storage try: path = os.path.join(self._path, key + '.json') if PY3: with io.open(path, 'wt', encoding="utf-8") as rec: json.dump(self._store[key].get(), rec) else: with io.open(path, 'wb') as rec: json.dump(self._store[key].get(), rec) except IOError: logger.error("I/O error occured while creating entity", exc_info=True)