Beispiel #1
0
    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)
Beispiel #2
0
    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)
Beispiel #3
0
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_)
Beispiel #4
0
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_)