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
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
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
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)
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