Exemple #1
0
    def create_request(self,
                       query=None,
                       variables=None,
                       mutations=None,
                       commit_now=None,
                       resp_format="JSON"):
        if resp_format == "JSON":
            resp_format = api.Request.RespFormat.JSON
        elif resp_format == "RDF":
            resp_format = api.Request.RespFormat.RDF
        else:
            raise errors.TransactionError(
                'Response format should be either RDF or JSON')
        """Creates a request object"""
        request = api.Request(start_ts=self._ctx.start_ts,
                              commit_now=commit_now,
                              read_only=self._read_only,
                              best_effort=self._best_effort,
                              resp_format=resp_format)

        if variables is not None:
            for key, value in variables.items():
                if util.is_string(key) and util.is_string(value):
                    request.vars[key] = value
                else:
                    raise errors.TransactionError(
                        'Values and keys in variable map must be strings')
        if query:
            request.query = query.encode('utf8')
        if mutations:
            request.mutations.extend(mutations)
        return request
Exemple #2
0
    def _common_commit(self):
        if self._read_only:
            raise errors.TransactionError(
                'Readonly transaction cannot run mutations or be committed')
        if self._finished:
            raise errors.TransactionError(
                'Transaction has already been committed or discarded')

        self._finished = True
        return self._mutated
Exemple #3
0
    def do_request(self,
                   request,
                   timeout=None,
                   metadata=None,
                   credentials=None):
        """Executes a query/mutate operation on the server."""
        if self._finished:
            raise errors.TransactionError(
                'Transaction has already been committed or discarded')

        if len(request.mutations) > 0:
            if self._read_only:
                raise errors.TransactionError(
                    'Readonly transaction cannot run mutations')
            self._mutated = True

        request.hash = self._ctx.hash
        new_metadata = self._dg.add_login_metadata(metadata)
        query_error = None
        try:
            response = self._dc.query(request,
                                      timeout=timeout,
                                      metadata=new_metadata,
                                      credentials=credentials)
        except Exception as error:
            if util.is_jwt_expired(error):
                self._dg.retry_login()
                new_metadata = self._dg.add_login_metadata(metadata)
                try:
                    response = self._dc.query(request,
                                              timeout=timeout,
                                              metadata=new_metadata,
                                              credentials=credentials)
                except Exception as error:
                    query_error = error
            else:
                query_error = error

        if query_error is not None:
            try:
                self.discard(timeout=timeout,
                             metadata=metadata,
                             credentials=credentials)
            except:
                # Ignore error - user should see the original error.
                pass

            self._common_except_mutate(query_error)

        if request.commit_now:
            self._finished = True

        self.merge_context(response.txn)
        return response
Exemple #4
0
    def merge_context(self, src=None):
        """Merges context from this instance with src."""
        if src is None:
            # This condition will be true only if the server doesn't return a
            # txn context after a query or mutation.
            return

        if self._ctx.start_ts == 0:
            self._ctx.start_ts = src.start_ts
        elif self._ctx.start_ts != src.start_ts:
            # This condition should never be true.
            raise errors.TransactionError('StartTs mismatch')
        self._ctx.hash = src.hash
        self._ctx.keys.extend(src.keys)
        self._ctx.preds.extend(src.preds)
Exemple #5
0
    def create_request(self,
                       query=None,
                       variables=None,
                       mutations=None,
                       commit_now=None):
        """Creates a request object"""
        request = api.Request(start_ts=self._ctx.start_ts,
                              commit_now=commit_now,
                              read_only=self._read_only,
                              best_effort=self._best_effort)

        if variables is not None:
            for key, value in variables.items():
                if util.is_string(key) and util.is_string(value):
                    request.vars[key] = value
                else:
                    raise errors.TransactionError(
                        'Values and keys in variable map must be strings')
        if query:
            request.query = query.encode('utf8')
        if mutations:
            request.mutations.extend(mutations)
        return request