def _put(self, instance, tega_id=None, version=None, deepcopy=True, ephemeral=False): qname = instance.qname_() path = qname2path(qname) if not tega_id: tega_id = self.tega_id if deepcopy: instance = instance.deepcopy_() if ephemeral: instance.ephemeral_() try: instance_ = get(path) if not instance_.is_ephemeral_(): raise Exception('non-ephemeral node cannot be ephemeral') except KeyError: pass add_ephemeral_node(tega_id, path) if version and _collision_check(qname, version): raise ValueError('collision detected') else: # # PUT OPERATION # # _idb _idb # / copy (E) / / (F) # o root(A) o o O ..> [Old roots] # / \ ..> \ ..> \ # o o (B) o o # / \ / \ / \ # o o o o X o # ^ set version (C) # | change parent(replace) (D) # put operation # if isinstance(instance, Cont): instance.freeze_() root_oid = qname[0] prev_version, new_version, new_root, above_tail = self._copy_on_write( qname, above_tail=True) self._instance_version_set(instance, new_version) if above_tail: instance.change_(above_tail) else: new_root = instance if not root_oid in self.candidate: self.candidate[root_oid] = (prev_version, new_version, new_root) # Commit queue self._enqueue_commit(OPE.PUT, path, tega_id, instance, ephemeral)
def _put(self, instance, tega_id=None, version=None, deepcopy=True, ephemeral=False): qname = instance.qname_() path = qname2path(qname) if not tega_id: tega_id = self.tega_id if deepcopy: instance = instance.deepcopy_() if ephemeral: instance.ephemeral_() try: instance_ = get(path) if not instance_.is_ephemeral_(): raise Exception('non-ephemeral node cannot be ephemeral') except KeyError: pass add_ephemeral_node(tega_id, path) if version and _collision_check(qname, version): raise ValueError('collision detected') else: # # PUT OPERATION # # _idb _idb # / copy (E) / / (F) # o root(A) o o O ..> [Old roots] # / \ ..> \ ..> \ # o o (B) o o # / \ / \ / \ # o o o o X o # ^ set version (C) # | change parent(replace) (D) # put operation # if isinstance(instance, Cont): instance.freeze_() root_oid = qname[0] prev_version, new_version, new_root, above_tail = self._copy_on_write(qname, above_tail=True) self._instance_version_set(instance, new_version) if above_tail: instance.change_(above_tail) else: new_root = instance if not root_oid in self.candidate: self.candidate[root_oid] = (prev_version, new_version, new_root) # Commit queue self._enqueue_commit(OPE.PUT, path, tega_id, instance, ephemeral)
def _select(original, regex_qname, regex_groups): ''' Selects children. ''' regex_oid = regex_qname[0] for k, v in original.items(): m = re.match(regex_oid, k) if m: g = m.groups() if g: regex_groups_ = copy.copy(regex_groups) regex_groups_.append(g) else: regex_groups_ = regex_groups if isinstance(original, Cont) and len(regex_qname) > 1: yield from _select(v, regex_qname[1:], regex_groups_) else: yield (qname2path(v.qname_()), v, regex_groups_)