Beispiel #1
0
    def _execute_on_shard(self, query, bind_vars, shard_idx):
        query, bind_vars = dbapi.prepare_query_bind_vars(query, bind_vars)
        for x in xrange(self.max_attempts):
            try:
                conn = self.conns[shard_idx]
                if conn is None:
                    conn = self._dial_shard(shard_idx)

                if self.txn:
                    self.txn.stmts.append(query)
                    if conn not in self.txt.conns:
                        # Defer the begin until we actually issue a statement.
                        conn.begin()
                        self.txt.conns.append(conn)

                return conn._execute(query, bind_vars)
            except dbexceptions.OperationalError as e:
                # Tear down regardless of the precise failure.
                self.conns[shard_idx] = None
                if isinstance(e, tablet3.TimeoutError):
                    # On any timeout let the error bubble up and just redial next time.
                    raise e

                if isinstance(e, tablet3.RetryError):
                    # Give the tablet a moment to restart itself. This isn't
                    # strictly necessary since there is a significant chance you
                    # will end up talking to another host.
                    time.sleep(self.reconnect_delay)
        raise dbexceptions.OperationalError('tablets unreachable',
                                            self.keyspace_name, shard_idx,
                                            self.db_type)
Beispiel #2
0
    def _execute_batch(self, query_list, bind_vars_list, shard_idx):
        new_query_list = []
        new_bind_vars_list = []
        for query, bind_vars in zip(query_list, bind_vars_list):
            query, bind_vars = dbapi.prepare_query_bind_vars(query, bind_vars)
            new_query_list.append(query)
            new_bind_vars_list.append(bind_vars)
        query_list = new_query_list
        bind_vars_list = new_bind_vars_list

        for x in xrange(self.max_attempts):
            try:
                conn = self.conns[shard_idx]
                if conn is None:
                    conn = self._dial_shard(shard_idx)

                return conn._execute_batch(query_list, bind_vars_list)
            except dbexceptions.OperationalError as e:
                # Tear down regardless of the precise failure.
                self.conns[shard_idx] = None
                if isinstance(e, tablet3.TimeoutError):
                    # On any timeout let the error bubble up and just redial next time.
                    raise e

                if isinstance(e, tablet3.RetryError):
                    # Give the tablet a moment to restart itself. This isn't
                    # strictly necessary since there is a significant chance you
                    # will end up talking to another host.
                    time.sleep(self.reconnect_delay)
        raise dbexceptions.OperationalError('tablets unreachable',
                                            self.keyspace_name, shard_idx,
                                            self.db_type)
Beispiel #3
0
def _create_v2_request_with_keyranges(
    sql, new_binds, keyspace_name, tablet_type, keyranges, not_in_transaction):
  """Make a request dict from arguments.

  Args:
    sql: Str sql with format tokens.
    new_binds: Dict of bind variables.
    keyspace_name: Str keyspace name.
    tablet_type: Str tablet_type.
    keyranges: A list of keyrange.KeyRange objects.
    not_in_transaction: Bool True if a transaction should not be started
      (generally used when sql is not a write).

  Returns:
    A (str: value) dict.
  """
  sql, new_binds = dbapi.prepare_query_bind_vars(sql, new_binds)
  new_binds = field_types.convert_bind_vars(new_binds)
  req = {
      'Sql': sql,
      'BindVariables': new_binds,
      'Keyspace': keyspace_name,
      'TabletType': topodata_pb2.TabletType.Value(tablet_type.upper()),
      'KeyRanges': keyranges,
      'NotInTransaction': not_in_transaction,
  }
  return req
Beispiel #4
0
def _create_v2_request_with_keyspace_ids(sql, new_binds, keyspace_name, tablet_type, keyspace_ids, not_in_transaction):
    """Make a request dict from arguments.

  Args:
    sql: Str sql with format tokens.
    new_binds: Dict of bind variables.
    keyspace_name: Str keyspace name.
    tablet_type: Str tablet_type.
    keyspace_ids: Bytes list of keyspace IDs.
    not_in_transaction: Bool True if a transaction should not be started
      (generally used when sql is not a write).

  Returns:
    A (str: value) dict.
  """
    # keyspace_ids are Keyspace Ids packed to byte[]
    sql, new_binds = dbapi.prepare_query_bind_vars(sql, new_binds)
    new_binds = field_types.convert_bind_vars(new_binds)
    req = {
        "Sql": sql,
        "BindVariables": new_binds,
        "Keyspace": keyspace_name,
        "TabletType": topodata_pb2.TabletType.Value(tablet_type.upper()),
        "KeyspaceIds": keyspace_ids,
        "NotInTransaction": not_in_transaction,
    }
    return req
Beispiel #5
0
  def _execute_on_shard(self, query, bind_vars, shard_idx):
    query, bind_vars = dbapi.prepare_query_bind_vars(query, bind_vars)
    for x in xrange(self.max_attempts):
      try:
        conn = self.conns[shard_idx]
        if conn is None:
          conn = self._dial_shard(shard_idx)

        if self.txn:
          self.txn.stmts.append(query)
          if conn not in self.txt.conns:
            # Defer the begin until we actually issue a statement.
            conn.begin()
            self.txt.conns.append(conn)

        return conn._execute(query, bind_vars)
      except dbexceptions.OperationalError as e:
        # Tear down regardless of the precise failure.
        self.conns[shard_idx] = None
        if isinstance(e, tablet3.TimeoutError):
          # On any timeout let the error bubble up and just redial next time.
          raise e

        if isinstance(e, tablet3.RetryError):
          # Give the tablet a moment to restart itself. This isn't
          # strictly necessary since there is a significant chance you
          # will end up talking to another host.
          time.sleep(self.reconnect_delay)
    raise dbexceptions.OperationalError('tablets unreachable', self.keyspace_name, shard_idx, self.db_type)
Beispiel #6
0
  def _execute_batch(self, query_list, bind_vars_list, shard_idx):
    new_query_list = []
    new_bind_vars_list = []
    for query, bind_vars in zip(query_list, bind_vars_list):
      query, bind_vars = dbapi.prepare_query_bind_vars(query, bind_vars)
      new_query_list.append(query)
      new_bind_vars_list.append(bind_vars)
    query_list = new_query_list
    bind_vars_list = new_bind_vars_list

    for x in xrange(self.max_attempts):
      try:
        conn = self.conns[shard_idx]
        if conn is None:
          conn = self._dial_shard(shard_idx)

        return conn._execute_batch(query_list, bind_vars_list)
      except dbexceptions.OperationalError as e:
        # Tear down regardless of the precise failure.
        self.conns[shard_idx] = None
        if isinstance(e, tablet3.TimeoutError):
          # On any timeout let the error bubble up and just redial next time.
          raise e

        if isinstance(e, tablet3.RetryError):
          # Give the tablet a moment to restart itself. This isn't
          # strictly necessary since there is a significant chance you
          # will end up talking to another host.
          time.sleep(self.reconnect_delay)
    raise dbexceptions.OperationalError('tablets unreachable', self.keyspace_name, shard_idx, self.db_type)
Beispiel #7
0
    def _execute_batch(self,
                       sql_list,
                       bind_variables_list,
                       keyspace,
                       tablet_type,
                       keyspace_ids,
                       not_in_transaction=False):
        query_list = []
        for sql, bind_vars in zip(sql_list, bind_variables_list):
            sql, bind_vars = dbapi.prepare_query_bind_vars(sql, bind_vars)
            query = {}
            query['Sql'] = sql
            query['BindVariables'] = field_types.convert_bind_vars(bind_vars)
            query_list.append(query)

        rowsets = []

        try:
            req = {
                'Queries': query_list,
                'Keyspace': keyspace,
                'TabletType': tablet_type,
                'KeyspaceIds': keyspace_ids,
                'NotInTransaction': not_in_transaction,
            }
            self._add_session(req)
            response = self.client.call('VTGate.ExecuteBatchKeyspaceIds', req)
            self._update_session(response)
            if 'Error' in response.reply and response.reply['Error']:
                raise gorpc.AppError(response.reply['Error'],
                                     'VTGate.ExecuteBatchKeyspaceIds')
            for reply in response.reply['List']:
                fields = []
                conversions = []
                results = []
                rowcount = 0

                for field in reply['Fields']:
                    fields.append((field['Name'], field['Type']))
                    conversions.append(
                        field_types.conversions.get(field['Type']))

                for row in reply['Rows']:
                    results.append(tuple(_make_row(row, conversions)))

                rowcount = reply['RowsAffected']
                lastrowid = reply['InsertId']
                rowsets.append((results, rowcount, lastrowid, fields))
        except gorpc.GoRpcError as e:
            self.logger_object.log_private_data(bind_variables_list)
            raise convert_exception(e,
                                    str(self),
                                    sql_list,
                                    keyspace_ids,
                                    keyspace=keyspace,
                                    tablet_type=tablet_type)
        except:
            logging.exception('gorpc low-level error')
            raise
        return rowsets
Beispiel #8
0
def _create_v2_request_with_keyspace_ids(
    sql, new_binds, keyspace_name, tablet_type, keyspace_ids,
    not_in_transaction):
  """Make a request dict from arguments.

  Args:
    sql: Str sql with format tokens.
    new_binds: Dict of bind variables.
    keyspace_name: Str keyspace name.
    tablet_type: Str tablet_type.
    keyspace_ids: Bytes list of keyspace IDs.
    not_in_transaction: Bool True if a transaction should not be started
      (generally used when sql is not a write).

  Returns:
    A (str: value) dict.
  """
  # keyspace_ids are Keyspace Ids packed to byte[]
  sql, new_binds = dbapi.prepare_query_bind_vars(sql, new_binds)
  new_binds = field_types.convert_bind_vars(new_binds)
  req = {
      'Sql': sql,
      'BindVariables': new_binds,
      'Keyspace': keyspace_name,
      'TabletType': topodata_pb2.TabletType.Value(tablet_type.upper()),
      'KeyspaceIds': keyspace_ids,
      'NotInTransaction': not_in_transaction,
  }
  return req
Beispiel #9
0
def _create_req_with_keyranges(sql, new_binds, keyspace_name, tablet_type,
                               keyranges, not_in_transaction):
    """Make a request dict from arguments.

  Args:
    sql: Str sql with format tokens.
    new_binds: Dict of bind variables.
    keyspace_name: Str keyspace name.
    tablet_type: Str tablet_type.
    keyranges: A list of keyrange.KeyRange objects.
    not_in_transaction: Bool True if a transaction should not be started
      (generally used when sql is not a write).

  Returns:
    A (str: value) dict.
  """
    sql, new_binds = dbapi.prepare_query_bind_vars(sql, new_binds)
    new_binds = field_types.convert_bind_vars(new_binds)
    req = {
        'Sql': sql,
        'BindVariables': new_binds,
        'Keyspace': keyspace_name,
        'TabletType': tablet_type,
        'KeyRanges': keyranges,
        'NotInTransaction': not_in_transaction,
    }
    return req
Beispiel #10
0
 def _execute(self, sql, bind_variables):
   sql, bind_variables = dbapi.prepare_query_bind_vars(sql, bind_variables)
   try:
     result = self.conn._execute(sql, bind_variables)
   except dbexceptions.IntegrityError as e:
     vtdb_logger.get_logger().integrity_error(e)
     raise
   return result
Beispiel #11
0
 def _execute(self, sql, bind_variables):
   sql, bind_variables = dbapi.prepare_query_bind_vars(sql, bind_variables)
   try:
     result = self.conn._execute(sql, bind_variables)
   except dbexceptions.IntegrityError as e:
     vtdb_logger.get_logger().integrity_error(e)
     raise
   return result
Beispiel #12
0
def _create_req(sql, new_binds, tablet_type):
    sql, new_binds = dbapi.prepare_query_bind_vars(sql, new_binds)
    new_binds = field_types.convert_bind_vars(new_binds)
    req = {
        'Sql': sql,
        'BindVariables': new_binds,
        'TabletType': tablet_type,
    }
    return req
Beispiel #13
0
  def _execute_batch(self, sql_list, bind_variables_list):
    sane_sql_list = []
    sane_bind_vars_list = []
    for sql, bind_variables in zip(sql_list, bind_variables_list):
      sane_sql, sane_bind_vars = dbapi.prepare_query_bind_vars(sql, bind_variables)
      sane_sql_list.append(sane_sql)
      sane_bind_vars_list.append(sane_bind_vars)

    result = self.conn._execute_batch(sane_sql_list, sane_bind_vars_list)
    return result
Beispiel #14
0
  def _execute_batch(self, sql_list, bind_variables_list):
    sane_sql_list = []
    sane_bind_vars_list = []
    for sql, bind_variables in zip(sql_list, bind_variables_list):
      sane_sql, sane_bind_vars = dbapi.prepare_query_bind_vars(sql, bind_variables)
      sane_sql_list.append(sane_sql)
      sane_bind_vars_list.append(sane_bind_vars)

    result = self.conn._execute_batch(sane_sql_list, sane_bind_vars_list)
    return result
Beispiel #15
0
def _create_req_with_keyranges(sql, new_binds, keyspace, tablet_type, keyranges):
  sql, new_binds = dbapi.prepare_query_bind_vars(sql, new_binds)
  new_binds = field_types.convert_bind_vars(new_binds)
  req = {
        'Sql': sql,
        'BindVariables': new_binds,
        'Keyspace': keyspace,
        'TabletType': tablet_type,
        'KeyRanges': [keyrange.KeyRange(kr) for kr in keyranges],
        }
  return req
Beispiel #16
0
  def _execute_batch(
      self, sql_list, bind_variables_list, keyspace_list, keyspace_ids_list,
      tablet_type, as_transaction, effective_caller_id=None):
    query_list = []
    for sql, bind_vars, keyspace, keyspace_ids in zip(
        sql_list, bind_variables_list, keyspace_list, keyspace_ids_list):
      sql, bind_vars = dbapi.prepare_query_bind_vars(sql, bind_vars)
      query = {}
      query['Sql'] = sql
      query['BindVariables'] = field_types.convert_bind_vars(bind_vars)
      query['Keyspace'] = keyspace
      query['KeyspaceIds'] = keyspace_ids
      query_list.append(query)

    rowsets = []

    try:
      req = {
          'Queries': query_list,
          'TabletType': tablet_type,
          'AsTransaction': as_transaction,
      }
      self._add_caller_id(req, effective_caller_id)
      self._add_session(req)
      response = self._get_client().call('VTGate.ExecuteBatchKeyspaceIds', req)
      self._update_session(response)
      if response.reply.get('Error'):
        raise gorpc.AppError(
            response.reply['Error'], 'VTGate.ExecuteBatchKeyspaceIds')
      for reply in response.reply['List']:
        fields = []
        conversions = []
        results = []
        rowcount = 0

        for field in reply['Fields']:
          fields.append((field['Name'], field['Type']))
          conversions.append(field_types.conversions.get(field['Type']))

        for row in reply['Rows']:
          results.append(tuple(_make_row(row, conversions)))

        rowcount = reply['RowsAffected']
        lastrowid = reply['InsertId']
        rowsets.append((results, rowcount, lastrowid, fields))
    except gorpc.GoRpcError as e:
      self.logger_object.log_private_data(bind_variables_list)
      raise self._convert_exception(
          e, sql_list, keyspace_ids_list,
          keyspace='', tablet_type=tablet_type)
    except Exception:
      logging.exception('gorpc low-level error')
      raise
    return rowsets
Beispiel #17
0
def _create_req_with_keyspace_ids(sql, new_binds, keyspace, tablet_type, keyspace_ids):
  sql, new_binds = dbapi.prepare_query_bind_vars(sql, new_binds)
  new_binds = field_types.convert_bind_vars(new_binds)
  req = {
        'Sql': sql,
        'BindVariables': new_binds,
        'Keyspace': keyspace,
        'TabletType': tablet_type,
        'KeyspaceIds': [str(kid) for kid in keyspace_ids],
        }
  return req
Beispiel #18
0
  def _execute_batch(self, sql_list, bind_variables_list):
    sane_sql_list = []
    sane_bind_vars_list = []
    for sql, bind_variables in zip(sql_list, bind_variables_list):
      sane_sql, sane_bind_vars = dbapi.prepare_query_bind_vars(sql, bind_variables)
      sane_sql_list.append(sane_sql)
      sane_bind_vars_list.append(sane_bind_vars)

    result = tablet2.TabletConnection._execute_batch(self, sane_sql_list, sane_bind_vars_list)
    self._time_failed = 0
    return result
Beispiel #19
0
  def _execute_entity_ids(
      self, sql, bind_variables, keyspace, tablet_type,
      entity_keyspace_id_map, entity_column_name, not_in_transaction=False,
      effective_caller_id=None):
    sql, new_binds = dbapi.prepare_query_bind_vars(sql, bind_variables)
    new_binds = field_types.convert_bind_vars(new_binds)
    req = {
        'Sql': sql,
        'BindVariables': new_binds,
        'Keyspace': keyspace,
        'TabletType': tablet_type,
        'EntityKeyspaceIDs': [
            {'ExternalID': xid, 'KeyspaceID': kid}
            for xid, kid in entity_keyspace_id_map.iteritems()],
        'EntityColumnName': entity_column_name,
        'NotInTransaction': not_in_transaction,
        }

    self._add_caller_id(req, effective_caller_id)
    self._add_session(req)

    fields = []
    conversions = []
    results = []
    rowcount = 0
    lastrowid = 0
    try:
      response = self._get_client().call('VTGate.ExecuteEntityIds', req)
      self._update_session(response)
      reply = response.reply
      if response.reply.get('Error'):
        raise gorpc.AppError(response.reply['Error'], 'VTGate.ExecuteEntityIds')

      if reply.get('Result'):
        res = reply['Result']
        for field in res['Fields']:
          fields.append((field['Name'], field['Type']))
          conversions.append(field_types.conversions.get(field['Type']))

        for row in res['Rows']:
          results.append(tuple(_make_row(row, conversions)))

        rowcount = res['RowsAffected']
        lastrowid = res['InsertId']
    except gorpc.GoRpcError as e:
      self.logger_object.log_private_data(bind_variables)
      raise self._convert_exception(
          e, sql, entity_keyspace_id_map,
          keyspace=keyspace, tablet_type=tablet_type)
    except Exception:
      logging.exception('gorpc low-level error')
      raise
    return results, rowcount, lastrowid, fields
Beispiel #20
0
def _create_req_with_keyranges(sql, new_binds, keyspace, tablet_type, keyranges):
  # keyranges are keyspace.KeyRange objects with start/end packed to byte[]
  sql, new_binds = dbapi.prepare_query_bind_vars(sql, new_binds)
  new_binds = field_types.convert_bind_vars(new_binds)
  req = {
        'Sql': sql,
        'BindVariables': new_binds,
        'Keyspace': keyspace,
        'TabletType': tablet_type,
        'KeyRanges': keyranges,
        }
  return req
Beispiel #21
0
    def _execute_entity_ids(self, sql, bind_variables, keyspace, tablet_type,
                            entity_keyspace_id_map, entity_column_name):
        sql, new_binds = dbapi.prepare_query_bind_vars(sql, bind_variables)
        new_binds = field_types.convert_bind_vars(new_binds)
        req = {
            'Sql':
            sql,
            'BindVariables':
            new_binds,
            'Keyspace':
            keyspace,
            'TabletType':
            tablet_type,
            'EntityKeyspaceIDs': [{
                'ExternalID': xid,
                'KeyspaceID': kid
            } for xid, kid in entity_keyspace_id_map.iteritems()],
            'EntityColumnName':
            entity_column_name,
        }

        self._add_session(req)

        fields = []
        conversions = []
        results = []
        try:
            response = self.client.call('VTGate.ExecuteEntityIds', req)
            self._update_session(response)
            reply = response.reply
            if 'Error' in response.reply and response.reply['Error']:
                raise gorpc.AppError(response.reply['Error'],
                                     'VTGate.ExecuteEntityIds')

            if 'Result' in reply:
                res = reply['Result']
                for field in res['Fields']:
                    fields.append((field['Name'], field['Type']))
                    conversions.append(
                        field_types.conversions.get(field['Type']))

                for row in res['Rows']:
                    results.append(tuple(_make_row(row, conversions)))

                rowcount = res['RowsAffected']
                lastrowid = res['InsertId']
        except gorpc.GoRpcError as e:
            self.logger_object.log_private_data(bind_variables)
            raise convert_exception(e, str(self), sql)
        except:
            logging.exception('gorpc low-level error')
            raise
        return results, rowcount, lastrowid, fields
Beispiel #22
0
def _create_req_with_keyranges(sql, new_binds, keyspace, tablet_type, keyranges):
  # keyranges are keyspace.KeyRange objects with start/end packed to byte[]
  sql, new_binds = dbapi.prepare_query_bind_vars(sql, new_binds)
  new_binds = field_types.convert_bind_vars(new_binds)
  req = {
        'Sql': sql,
        'BindVariables': new_binds,
        'Keyspace': keyspace,
        'TabletType': tablet_type,
        'KeyRanges': keyranges,
        }
  return req
Beispiel #23
0
def _create_req_with_keyspace_ids(sql, new_binds, keyspace, tablet_type, keyspace_ids):
  # keyspace_ids are Keyspace Ids packed to byte[]
  sql, new_binds = dbapi.prepare_query_bind_vars(sql, new_binds)
  new_binds = field_types.convert_bind_vars(new_binds)
  req = {
        'Sql': sql,
        'BindVariables': new_binds,
        'Keyspace': keyspace,
        'TabletType': tablet_type,
        'KeyspaceIds': keyspace_ids,
        }
  return req
Beispiel #24
0
def _create_req_with_keyspace_ids(sql, new_binds, keyspace, tablet_type, keyspace_ids):
  # keyspace_ids are Keyspace Ids packed to byte[]
  sql, new_binds = dbapi.prepare_query_bind_vars(sql, new_binds)
  new_binds = field_types.convert_bind_vars(new_binds)
  req = {
        'Sql': sql,
        'BindVariables': new_binds,
        'Keyspace': keyspace,
        'TabletType': tablet_type,
        'KeyspaceIds': keyspace_ids,
        }
  return req
Beispiel #25
0
def _create_req_with_keyranges(sql, new_binds, keyspace, tablet_type, keyranges, not_in_transaction):
    # keyranges are keyspace.KeyRange objects with start/end packed to byte[]
    sql, new_binds = dbapi.prepare_query_bind_vars(sql, new_binds)
    new_binds = field_types.convert_bind_vars(new_binds)
    req = {
        "Sql": sql,
        "BindVariables": new_binds,
        "Keyspace": keyspace,
        "TabletType": tablet_type,
        "KeyRanges": keyranges,
        "NotInTransaction": not_in_transaction,
    }
    return req
Beispiel #26
0
    def _execute_entity_ids(self,
                            sql,
                            bind_variables,
                            keyspace,
                            tablet_type,
                            entity_keyspace_id_map,
                            entity_column_name,
                            not_in_transaction=False,
                            effective_caller_id=None):
        sql, new_binds = dbapi.prepare_query_bind_vars(sql, bind_variables)
        new_binds = field_types.convert_bind_vars(new_binds)
        req = {
            'Sql':
            sql,
            'BindVariables':
            new_binds,
            'Keyspace':
            keyspace,
            'TabletType':
            tablet_type,
            'EntityKeyspaceIDs': [{
                'ExternalID': xid,
                'KeyspaceID': kid
            } for xid, kid in entity_keyspace_id_map.iteritems()],
            'EntityColumnName':
            entity_column_name,
            'NotInTransaction':
            not_in_transaction,
        }

        self._add_caller_id(req, effective_caller_id)
        self._add_session(req)
        try:
            exec_method = 'VTGate.ExecuteEntityIds'
            response = self._get_client().call(exec_method, req)
            self._update_session(response)
            vtgate_utils.extract_rpc_error(exec_method, response)
            reply = response.reply
            return self._get_rowset_from_query_result(reply.get('Result'))
        except (gorpc.GoRpcError, vtgate_utils.VitessError) as e:
            self.logger_object.log_private_data(bind_variables)
            raise self._convert_exception(e,
                                          sql,
                                          entity_keyspace_id_map,
                                          keyspace=keyspace,
                                          tablet_type=tablet_type)
        except Exception:
            logging.exception('gorpc low-level error')
            raise
Beispiel #27
0
  def _execute_batch(self, sql_list, bind_variables_list):
    sane_sql_list = []
    sane_bind_vars_list = []
    for sql, bind_variables in zip(sql_list, bind_variables_list):
      sane_sql, sane_bind_vars = dbapi.prepare_query_bind_vars(sql, bind_variables)
      sane_sql_list.append(sane_sql)
      sane_bind_vars_list.append(sane_bind_vars)

    try:
      result = self.conn._execute_batch(sane_sql_list, sane_bind_vars_list)
    except dbexceptions.IntegrityError as e:
      vtdb_logger.get_logger().integrity_error(e)
      raise

    return result
Beispiel #28
0
  def _execute_batch(self, sql_list, bind_variables_list):
    sane_sql_list = []
    sane_bind_vars_list = []
    for sql, bind_variables in zip(sql_list, bind_variables_list):
      sane_sql, sane_bind_vars = dbapi.prepare_query_bind_vars(sql, bind_variables)
      sane_sql_list.append(sane_sql)
      sane_bind_vars_list.append(sane_bind_vars)

    try:
      result = self.conn._execute_batch(sane_sql_list, sane_bind_vars_list)
    except dbexceptions.IntegrityError as e:
      vtdb_logger.get_logger().integrity_error(e)
      raise

    return result
Beispiel #29
0
  def _execute_batch(self, sql_list, bind_variables_list, keyspace, tablet_type, keyspace_ids):
    query_list = []
    for sql, bind_vars in zip(sql_list, bind_variables_list):
      sql, bind_vars = dbapi.prepare_query_bind_vars(sql, bind_vars)
      query = {}
      query['Sql'] = sql
      query['BindVariables'] = field_types.convert_bind_vars(bind_vars)
      query_list.append(query)

    rowsets = []

    try:
      req = {
          'Queries': query_list,
          'Keyspace': keyspace,
          'TabletType': tablet_type,
          'KeyspaceIds': keyspace_ids,
      }
      self._add_session(req)
      response = self.client.call('VTGate.ExecuteBatchKeyspaceIds', req)
      self._update_session(response)
      if 'Error' in response.reply and response.reply['Error']:
        raise gorpc.AppError(response.reply['Error'], 'VTGate.ExecuteBatchKeyspaceIds')
      for reply in response.reply['List']:
        fields = []
        conversions = []
        results = []
        rowcount = 0

        for field in reply['Fields']:
          fields.append((field['Name'], field['Type']))
          conversions.append(field_types.conversions.get(field['Type']))

        for row in reply['Rows']:
          results.append(tuple(_make_row(row, conversions)))

        rowcount = reply['RowsAffected']
        lastrowid = reply['InsertId']
        rowsets.append((results, rowcount, lastrowid, fields))
    except gorpc.GoRpcError as e:
      raise convert_exception(e, str(self), sql_list, bind_variables_list)
    except:
      logging.exception('gorpc low-level error')
      raise
    return rowsets
Beispiel #30
0
  def _execute_entity_ids(self, sql, bind_variables, keyspace, tablet_type, entity_keyspace_id_map, entity_column_name):
    sql, new_binds = dbapi.prepare_query_bind_vars(sql, bind_variables)
    new_binds = field_types.convert_bind_vars(new_binds)
    req = {
        'Sql': sql,
        'BindVariables': new_binds,
        'Keyspace': keyspace,
        'TabletType': tablet_type,
        'EntityKeyspaceIDs': [
            {'ExternalID': xid, 'KeyspaceID': kid}
            for xid, kid in entity_keyspace_id_map.iteritems()],
        'EntityColumnName': entity_column_name,
        }

    self._add_session(req)

    fields = []
    conversions = []
    results = []
    try:
      response = self.client.call('VTGate.ExecuteEntityIds', req)
      self._update_session(response)
      reply = response.reply
      if 'Error' in response.reply and response.reply['Error']:
        raise gorpc.AppError(response.reply['Error'], 'VTGate.ExecuteEntityIds')

      if 'Result' in reply:
        res = reply['Result']
        for field in res['Fields']:
          fields.append((field['Name'], field['Type']))
          conversions.append(field_types.conversions.get(field['Type']))

        for row in res['Rows']:
          results.append(tuple(_make_row(row, conversions)))

        rowcount = res['RowsAffected']
        lastrowid = res['InsertId']
    except gorpc.GoRpcError as e:
      raise convert_exception(e, str(self), sql, bind_variables)
    except:
      logging.exception('gorpc low-level error')
      raise
    return results, rowcount, lastrowid, fields
Beispiel #31
0
 def build_query_list():
     query_list = []
     for sql, bind_vars, keyspace, keyspace_ids, shards in zip(
         sql_list, bind_variables_list, keyspace_list, keyspace_ids_list, shards_list
     ):
         sql, bind_vars = dbapi.prepare_query_bind_vars(sql, bind_vars)
         query = {}
         query["Sql"] = sql
         query["BindVariables"] = field_types.convert_bind_vars(bind_vars)
         query["Keyspace"] = keyspace
         if keyspace_ids:
             if shards:
                 raise dbexceptions.ProgrammingError(
                     "Keyspace_ids and shards cannot both be defined " "for the same executemany query."
                 )
             query["KeyspaceIds"] = keyspace_ids
         else:
             query["Shards"] = shards
         query_list.append(query)
     return query_list
Beispiel #32
0
    def _execute_batch(self, sql_list, bind_variables_list, tablet_type):
        query_list = []
        for sql, bind_vars in zip(sql_list, bind_variables_list):
            sql, bind_vars = dbapi.prepare_query_bind_vars(sql, bind_vars)
            query = {}
            query["Sql"] = sql
            query["BindVariables"] = field_types.convert_bind_vars(bind_vars)
            query_list.append(query)

        rowsets = []

        try:
            req = {"Queries": query_list, "TabletType": tablet_type}
            self._add_session(req)
            response = self.client.call("VTGate.ExecuteBatch", req)
            self._update_session(response)
            if "Error" in response.reply and response.reply["Error"]:
                raise gorpc.AppError(response.reply["Error"], "VTGate.ExecuteBatch")
            for reply in response.reply["List"]:
                fields = []
                conversions = []
                results = []
                rowcount = 0

                for field in reply["Fields"]:
                    fields.append((field["Name"], field["Type"]))
                    conversions.append(field_types.conversions.get(field["Type"]))

                for row in reply["Rows"]:
                    results.append(tuple(_make_row(row, conversions)))

                rowcount = reply["RowsAffected"]
                lastrowid = reply["InsertId"]
                rowsets.append((results, rowcount, lastrowid, fields))
        except gorpc.GoRpcError as e:
            self.logger_object.log_private_data(bind_variables_list)
            raise convert_exception(e, str(self), sql_list)
        except:
            logging.exception("gorpc low-level error")
            raise
        return rowsets
Beispiel #33
0
 def build_query_list():
   """Create a query dict list from parameters."""
   query_list = []
   for sql, bind_vars, keyspace_name, keyspace_ids, shards in zip(
       sql_list, bind_variables_list, keyspace_list, keyspace_ids_list,
       shards_list):
     sql, bind_vars = dbapi.prepare_query_bind_vars(sql, bind_vars)
     query = {}
     query['Sql'] = sql
     query['BindVariables'] = field_types.convert_bind_vars(bind_vars)
     query['Keyspace'] = keyspace_name
     if keyspace_ids:
       if shards:
         raise dbexceptions.ProgrammingError(
             'Keyspace_ids and shards cannot both be defined '
             'for the same executemany query.')
       query['KeyspaceIds'] = keyspace_ids
     else:
       query['Shards'] = shards
     query_list.append(query)
   return query_list
Beispiel #34
0
 def build_query_list():
     query_list = []
     for sql, bind_vars, keyspace, keyspace_ids, shards in zip(
             sql_list, bind_variables_list, keyspace_list,
             keyspace_ids_list, shards_list):
         sql, bind_vars = dbapi.prepare_query_bind_vars(sql, bind_vars)
         query = {}
         query['Sql'] = sql
         query['BindVariables'] = field_types.convert_bind_vars(
             bind_vars)
         query['Keyspace'] = keyspace
         if keyspace_ids:
             if shards:
                 raise dbexceptions.ProgrammingError(
                     'Keyspace_ids and shards cannot both be defined '
                     'for the same executemany query.')
             query['KeyspaceIds'] = keyspace_ids
         else:
             query['Shards'] = shards
         query_list.append(query)
     return query_list
Beispiel #35
0
    def _execute_entity_ids(
        self,
        sql,
        bind_variables,
        keyspace,
        tablet_type,
        entity_keyspace_id_map,
        entity_column_name,
        not_in_transaction=False,
        effective_caller_id=None,
    ):
        sql, new_binds = dbapi.prepare_query_bind_vars(sql, bind_variables)
        new_binds = field_types.convert_bind_vars(new_binds)
        req = {
            "Sql": sql,
            "BindVariables": new_binds,
            "Keyspace": keyspace,
            "TabletType": tablet_type,
            "EntityKeyspaceIDs": [
                {"ExternalID": xid, "KeyspaceID": kid} for xid, kid in entity_keyspace_id_map.iteritems()
            ],
            "EntityColumnName": entity_column_name,
            "NotInTransaction": not_in_transaction,
        }

        self._add_caller_id(req, effective_caller_id)
        self._add_session(req)
        try:
            exec_method = "VTGate.ExecuteEntityIds"
            response = self._get_client().call(exec_method, req)
            self._update_session(response)
            vtgate_utils.extract_rpc_error(exec_method, response)
            reply = response.reply
            return self._get_rowset_from_query_result(reply.get("Result"))
        except (gorpc.GoRpcError, vtgate_utils.VitessError) as e:
            self.logger_object.log_private_data(bind_variables)
            raise self._convert_exception(e, sql, entity_keyspace_id_map, keyspace=keyspace, tablet_type=tablet_type)
        except Exception:
            logging.exception("gorpc low-level error")
            raise
Beispiel #36
0
    def _execute(self,
                 sql,
                 bind_variables,
                 keyspace_name,
                 tablet_type,
                 shards=None,
                 keyspace_ids=None,
                 keyranges=None,
                 entity_keyspace_id_map=None,
                 entity_column_name=None,
                 not_in_transaction=False,
                 effective_caller_id=None,
                 **kwargs):

        # FIXME(alainjobart): keyspace should be in routing_kwargs,
        # as it's not used for v3.

        # FIXME(alainjobart): the v3 part doesn't take the ptyhon-style queries
        # for bind variables (the %(xxx)s), but our style (the :xxx).
        # this is not consistent with the rest.

        try:
            routing_kwargs = {}
            exec_method = None

            if shards is not None:
                routing_kwargs['shards'] = shards
                exec_method = 'ExecuteShards'
                sql, bind_variables = dbapi.prepare_query_bind_vars(
                    sql, bind_variables)

                request = vtgate_pb2.ExecuteShardsRequest(
                    query=query_pb2.BoundQuery(sql=sql),
                    tablet_type=topodata_pb2.TabletType.Value(
                        tablet_type.upper()),
                    keyspace=keyspace_name,
                    not_in_transaction=not_in_transaction,
                )
                _add_caller_id(request, effective_caller_id)
                self._add_session(request)
                request.shards.extend(shards)
                _convert_bind_vars(bind_variables,
                                   request.query.bind_variables)

                response = self.stub.ExecuteShards(request, self.timeout)

            elif keyspace_ids is not None:
                routing_kwargs['keyspace_ids'] = keyspace_ids
                exec_method = 'ExecuteKeyspaceIds'
                sql, bind_variables = dbapi.prepare_query_bind_vars(
                    sql, bind_variables)

                request = vtgate_pb2.ExecuteKeyspaceIdsRequest(
                    query=query_pb2.BoundQuery(sql=sql),
                    tablet_type=topodata_pb2.TabletType.Value(
                        tablet_type.upper()),
                    keyspace=keyspace_name,
                    not_in_transaction=not_in_transaction,
                )
                _add_caller_id(request, effective_caller_id)
                self._add_session(request)
                request.keyspace_ids.extend(keyspace_ids)
                _convert_bind_vars(bind_variables,
                                   request.query.bind_variables)

                response = self.stub.ExecuteKeyspaceIds(request, self.timeout)

            elif keyranges is not None:
                routing_kwargs['keyranges'] = keyranges
                exec_method = 'ExecuteKeyRanges'
                sql, bind_variables = dbapi.prepare_query_bind_vars(
                    sql, bind_variables)

                request = vtgate_pb2.ExecuteKeyRangesRequest(
                    query=query_pb2.BoundQuery(sql=sql),
                    tablet_type=topodata_pb2.TabletType.Value(
                        tablet_type.upper()),
                    keyspace=keyspace_name,
                    not_in_transaction=not_in_transaction,
                )
                _add_caller_id(request, effective_caller_id)
                self._add_session(request)
                _add_key_ranges(request, keyranges)
                _convert_bind_vars(bind_variables,
                                   request.query.bind_variables)

                response = self.stub.ExecuteKeyRanges(request, self.timeout)

            elif entity_keyspace_id_map is not None:
                routing_kwargs[
                    'entity_keyspace_id_map'] = entity_keyspace_id_map
                routing_kwargs['entity_column_name'] = entity_column_name
                exec_method = 'ExecuteEntityIds'
                sql, bind_variables = dbapi.prepare_query_bind_vars(
                    sql, bind_variables)

                request = vtgate_pb2.ExecuteEntityIdsRequest(
                    query=query_pb2.BoundQuery(sql=sql),
                    tablet_type=topodata_pb2.TabletType.Value(
                        tablet_type.upper()),
                    keyspace=keyspace_name,
                    entity_column_name=entity_column_name,
                    not_in_transaction=not_in_transaction,
                )
                _add_caller_id(request, effective_caller_id)
                self._add_session(request)
                _convert_bind_vars(bind_variables,
                                   request.query.bind_variables)
                _convert_entity_ids(entity_keyspace_id_map,
                                    request.entity_keyspace_ids)

                response = self.stub.ExecuteEntityIds(request, self.timeout)

            else:
                exec_method = 'Execute'

                request = vtgate_pb2.ExecuteRequest(
                    query=query_pb2.BoundQuery(sql=sql),
                    tablet_type=topodata_pb2.TabletType.Value(
                        tablet_type.upper()),
                    not_in_transaction=not_in_transaction,
                )
                _add_caller_id(request, effective_caller_id)
                self._add_session(request)
                _convert_bind_vars(bind_variables,
                                   request.query.bind_variables)

                response = self.stub.Execute(request, self.timeout)

            self.session = response.session
            _extract_rpc_error(exec_method, response.error)
            return _get_rowset_from_query_result(response.result)

        except (face.AbortionError, vtgate_utils.VitessError) as e:
            self.logger_object.log_private_data(bind_variables)
            raise _convert_exception(e,
                                     sql,
                                     keyspace=keyspace_name,
                                     tablet_type=tablet_type,
                                     **routing_kwargs)
Beispiel #37
0
  def _execute(
      self, sql, bind_variables, keyspace_name, tablet_type,
      keyspace_ids=None, keyranges=None,
      entity_keyspace_id_map=None, entity_column_name=None,
      not_in_transaction=False, effective_caller_id=None):
    """Execute query.

    Args:
      sql: The sql text, with %(format)s-style tokens.
      bind_variables: (str: value) dict of bind variables corresponding
        to sql %(format)s tokens.
      keyspace_name: Str name of keyspace.
      tablet_type: Str tablet type (e.g. master, rdonly, replica).
      keyspace_ids: bytes list of keyspace ID lists.
      keyranges: KeyRange objects.
      entity_keyspace_id_map: (column value: bytes) map from a column
        to a keyspace id. If defined, vtgate adds a per-shard expression
        to the WHERE clause, and ignores keyspace_ids and keyranges
        parameters.
      entity_column_name: Str name of entity column used by
        entity_keyspace_id_map.
      not_in_transaction: bool.
      effective_caller_id: CallerID object.

    Returns:
      The (results, rowcount, lastrowid, fields) tuple.
    """

    routing_kwargs = {}
    exec_method = None
    req = None
    if entity_keyspace_id_map is not None:
      # This supercedes keyspace_ids and keyranges.
      routing_kwargs['entity_keyspace_id_map'] = entity_keyspace_id_map
      routing_kwargs['entity_column_name'] = entity_column_name
      if entity_column_name is None:
        raise dbexceptions.ProgrammingError(
            '_execute called with entity_keyspace_id_map and no '
            'entity_column_name')
      sql, new_binds = dbapi.prepare_query_bind_vars(sql, bind_variables)
      new_binds = field_types.convert_bind_vars(new_binds)
      req = {
          'Sql': sql,
          'BindVariables': new_binds,
          'Keyspace': keyspace_name,
          'TabletType': topodata_pb2.TabletType.Value(tablet_type.upper()),
          'EntityKeyspaceIDs': [
              {'ExternalID': xid, 'KeyspaceID': kid}
              for xid, kid in entity_keyspace_id_map.iteritems()],
          'EntityColumnName': entity_column_name,
          'NotInTransaction': not_in_transaction,
      }
      exec_method = 'VTGate.ExecuteEntityIds'
    elif keyspace_ids is not None:
      if keyranges is not None:
        raise dbexceptions.ProgrammingError(
            '_execute called with keyspace_ids and keyranges both defined')
      routing_kwargs['keyspace_ids'] = keyspace_ids
      req = _create_v2_request_with_keyspace_ids(
          sql, bind_variables, keyspace_name, tablet_type, keyspace_ids,
          not_in_transaction)
      exec_method = 'VTGate.ExecuteKeyspaceIds'
    elif keyranges is not None:
      routing_kwargs['keyranges'] = keyranges
      req = _create_v2_request_with_keyranges(
          sql, bind_variables, keyspace_name, tablet_type, keyranges,
          not_in_transaction)
      exec_method = 'VTGate.ExecuteKeyRanges'
    else:
      req = _create_v3_request(
          sql, bind_variables, tablet_type, not_in_transaction)
      if keyspace_name is not None:
        raise dbexceptions.ProgrammingError(
            '_execute called with keyspace_name but no routing args')
      exec_method = 'VTGate.Execute'

    self._add_caller_id(req, effective_caller_id)
    if not not_in_transaction:
      self._add_session(req)
    try:
      response = self._get_client().call(exec_method, req)
      self._update_session(response)
      vtgate_utils.extract_rpc_error(exec_method, response)
      reply = response.reply
      return self._get_rowset_from_query_result(reply.get('Result'))
    except (gorpc.GoRpcError, vtgate_utils.VitessError) as e:
      self.logger_object.log_private_data(bind_variables)
      raise self._convert_exception(
          e, sql, keyspace=keyspace_name, tablet_type=tablet_type,
          **routing_kwargs)
    except Exception:
      logging.exception('gorpc low-level error')
      raise
Beispiel #38
0
 def _execute(self, sql, bind_variables):
   sql, bind_variables = dbapi.prepare_query_bind_vars(sql, bind_variables)
   result = tablet2.TabletConnection._execute(self, sql, bind_variables)
   self._time_failed = 0
   return result
Beispiel #39
0
 def _stream_execute(self, sql, bind_variables):
   sql, bind_variables = dbapi.prepare_query_bind_vars(sql, bind_variables)
   result = tablet2.TabletConnection._stream_execute(self, sql, bind_variables)
   self._time_failed = 0
   return result
Beispiel #40
0
    def _execute(
        self,
        sql,
        bind_variables,
        keyspace,
        tablet_type,
        keyspace_ids=None,
        keyranges=None,
        entity_keyspace_id_map=None,
        entity_column_name=None,
        not_in_transaction=False,
        effective_caller_id=None,
    ):

        routing_kwargs = {}
        exec_method = None
        req = None
        if keyspace_ids is not None:
            routing_kwargs["keyspace_ids"] = keyspace_ids
            req = _create_req_with_keyspace_ids(
                sql, bind_variables, keyspace, tablet_type, keyspace_ids, not_in_transaction
            )
            exec_method = "VTGate.ExecuteKeyspaceIds"
        elif keyranges is not None:
            routing_kwargs["keyranges"] = keyranges
            req = _create_req_with_keyranges(sql, bind_variables, keyspace, tablet_type, keyranges, not_in_transaction)
            exec_method = "VTGate.ExecuteKeyRanges"
        elif entity_keyspace_id_map is not None:
            routing_kwargs["entity_keyspace_id_map"] = entity_keyspace_id_map
            routing_kwargs["entity_column_name"] = entity_column_name
            if entity_column_name is None:
                raise dbexceptions.ProgrammingError(
                    "_execute called with entity_keyspace_id_map and no " "entity_column_name"
                )
            sql, new_binds = dbapi.prepare_query_bind_vars(sql, bind_variables)
            new_binds = field_types.convert_bind_vars(new_binds)
            req = {
                "Sql": sql,
                "BindVariables": new_binds,
                "Keyspace": keyspace,
                "TabletType": tablet_type,
                "EntityKeyspaceIDs": [
                    {"ExternalID": xid, "KeyspaceID": kid} for xid, kid in entity_keyspace_id_map.iteritems()
                ],
                "EntityColumnName": entity_column_name,
                "NotInTransaction": not_in_transaction,
            }
            exec_method = "VTGate.ExecuteEntityIds"
        else:
            raise dbexceptions.ProgrammingError(
                "_execute called with no keyspace_ids, keyranges, or " "entity_keyspace_id_map"
            )

        def check_incompatible_args(arg_name):
            if arg_name not in routing_kwargs:
                raise dbexceptions.ProgrammingError(
                    "_execute called with routing_args=%s, "
                    "incompatible routing arg=%s" % (sorted(routing_kwargs), arg_name)
                )

        if keyranges is not None:
            check_incompatible_args("keyranges")
        if entity_column_name is not None:
            check_incompatible_args("entity_column_name")
        if entity_keyspace_id_map is not None:
            check_incompatible_args("entity_keyspace_id_map")

        self._add_caller_id(req, effective_caller_id)
        self._add_session(req)
        try:
            response = self._get_client().call(exec_method, req)
            self._update_session(response)
            vtgate_utils.extract_rpc_error(exec_method, response)
            reply = response.reply
            return self._get_rowset_from_query_result(reply.get("Result"))
        except (gorpc.GoRpcError, vtgate_utils.VitessError) as e:
            self.logger_object.log_private_data(bind_variables)
            raise self._convert_exception(e, sql, keyspace=keyspace, tablet_type=tablet_type, **routing_kwargs)
        except Exception:
            logging.exception("gorpc low-level error")
            raise
Beispiel #41
0
 def _stream_execute(self, sql, bind_variables):
   sql, bind_variables = dbapi.prepare_query_bind_vars(sql, bind_variables)
   result = tablet.TabletConnection._stream_execute(self, sql, bind_variables)
   return result
Beispiel #42
0
    def _stream_execute(self,
                        sql,
                        bind_variables,
                        keyspace_name,
                        tablet_type,
                        shards=None,
                        keyspace_ids=None,
                        keyranges=None,
                        not_in_transaction=False,
                        effective_caller_id=None,
                        **kwargs):

        try:
            sql, bind_variables = dbapi.prepare_query_bind_vars(
                sql, bind_variables)

            if shards is not None:
                request = vtgate_pb2.StreamExecuteShardsRequest(
                    query=query_pb2.BoundQuery(sql=sql),
                    tablet_type=topodata_pb2.TabletType.Value(
                        tablet_type.upper()),
                    keyspace=keyspace_name,
                )
                _add_caller_id(request, effective_caller_id)
                request.shards.extend(shards)
                _convert_bind_vars(bind_variables,
                                   request.query.bind_variables)
                it = self.stub.StreamExecuteShards(request, self.timeout)

            elif keyspace_ids is not None:
                request = vtgate_pb2.StreamExecuteKeyspaceIdsRequest(
                    query=query_pb2.BoundQuery(sql=sql),
                    tablet_type=topodata_pb2.TabletType.Value(
                        tablet_type.upper()),
                    keyspace=keyspace_name,
                )
                _add_caller_id(request, effective_caller_id)
                request.keyspace_ids.extend(keyspace_ids)
                _convert_bind_vars(bind_variables,
                                   request.query.bind_variables)
                it = self.stub.StreamExecuteKeyspaceIds(request, self.timeout)

            elif keyranges is not None:
                request = vtgate_pb2.StreamExecuteKeyRangesRequest(
                    query=query_pb2.BoundQuery(sql=sql),
                    tablet_type=topodata_pb2.TabletType.Value(
                        tablet_type.upper()),
                    keyspace=keyspace_name,
                )
                _add_caller_id(request, effective_caller_id)
                _add_key_ranges(request, keyranges)
                _convert_bind_vars(bind_variables,
                                   request.query.bind_variables)
                it = self.stub.StreamExecuteKeyRanges(request, self.timeout)

            else:
                request = vtgate_pb2.StreamExecuteRequest(
                    query=query_pb2.BoundQuery(sql=sql),
                    tablet_type=topodata_pb2.TabletType.Value(
                        tablet_type.upper()),
                )
                _add_caller_id(request, effective_caller_id)
                _convert_bind_vars(bind_variables,
                                   request.query.bind_variables)
                it = self.stub.StreamExecute(request, self.timeout)

            first_response = it.next()
        except (face.AbortionError, vtgate_utils.VitessError) as e:
            self.logger_object.log_private_data(bind_variables)
            raise _convert_exception(e,
                                     sql,
                                     keyspace_ids,
                                     keyranges,
                                     keyspace=keyspace_name,
                                     tablet_type=tablet_type)

        fields = []
        conversions = []
        for field in first_response.result.fields:
            fields.append((field.name, field.type))
            conversions.append(field_types_proto3.conversions.get(field.type))

        def row_generator():
            try:
                for response in it:
                    for row in response.result.rows:
                        yield tuple(_make_row(row, conversions))
            except Exception:
                logging.exception('gRPC low-level error')
                raise

        return row_generator(), fields
Beispiel #43
0
def _create_req(sql, new_binds, tablet_type):
    sql, new_binds = dbapi.prepare_query_bind_vars(sql, new_binds)
    new_binds = field_types.convert_bind_vars(new_binds)
    req = {"Sql": sql, "BindVariables": new_binds, "TabletType": tablet_type}
    return req
Beispiel #44
0
 def _stream_execute(self, sql, bind_variables):
   sql, bind_variables = dbapi.prepare_query_bind_vars(sql, bind_variables)
   result = self.conn._stream_execute(sql, bind_variables)
   return result
Beispiel #45
0
  def _stream_execute(
      self, sql, bind_variables, keyspace_name, tablet_type, keyspace_ids=None,
      keyranges=None, not_in_transaction=False, effective_caller_id=None,
      **kwargs):

    try:
      sql, bind_variables = dbapi.prepare_query_bind_vars(sql, bind_variables)

      if keyspace_ids is not None:
        request = vtgate_pb2.StreamExecuteKeyspaceIdsRequest(
            query=query_pb2.BoundQuery(sql=sql),
            tablet_type=topodata_pb2.TabletType.Value(tablet_type.upper()),
            keyspace=keyspace_name,
        )
        _add_caller_id(request, effective_caller_id)
        request.keyspace_ids.extend(keyspace_ids)
        _convert_bind_vars(bind_variables, request.query.bind_variables)
        it = self.stub.StreamExecuteKeyspaceIds(request, self.timeout)

      elif keyranges is not None:
        request = vtgate_pb2.StreamExecuteKeyRangesRequest(
            query=query_pb2.BoundQuery(sql=sql),
            tablet_type=topodata_pb2.TabletType.Value(tablet_type.upper()),
            keyspace=keyspace_name,
        )
        _add_caller_id(request, effective_caller_id)
        _add_key_ranges(request, keyranges)
        _convert_bind_vars(bind_variables, request.query.bind_variables)
        it = self.stub.StreamExecuteKeyRanges(request, self.timeout)

      else:
        request = vtgate_pb2.StreamExecuteRequest(
            query=query_pb2.BoundQuery(sql=sql),
            tablet_type=topodata_pb2.TabletType.Value(tablet_type.upper()),
        )
        _add_caller_id(request, effective_caller_id)
        _convert_bind_vars(bind_variables, request.query.bind_variables)
        it = self.stub.StreamExecute(request, self.timeout)

      first_response = it.next()
    except (face.AbortionError, vtgate_utils.VitessError) as e:
      self.logger_object.log_private_data(bind_variables)
      raise _convert_exception(
          e, sql, keyspace_ids, keyranges,
          keyspace=keyspace_name, tablet_type=tablet_type)

    fields = []
    conversions = []
    for field in first_response.result.fields:
      fields.append((field.name, field.type))
      conversions.append(field_types_proto3.conversions.get(field.type))

    def row_generator():
      try:
        for response in it:
          for row in response.result.rows:
            yield tuple(_make_row(row, conversions))
      except Exception:
        logging.exception('gRPC low-level error')
        raise

    return row_generator(), fields
Beispiel #46
0
  def _execute_batch(
      self, sql_list, bind_variables_list, keyspace_list, keyspace_ids_list,
      shards_list, tablet_type, as_transaction, effective_caller_id=None,
      **kwargs):

    try:
      if keyspace_ids_list[0]:
        exec_method = 'ExecuteBatchKeyspaceIds'
        request = vtgate_pb2.ExecuteBatchKeyspaceIdsRequest(
            tablet_type=topodata_pb2.TabletType.Value(tablet_type.upper()),
            as_transaction=as_transaction,
        )
        _add_caller_id(request, effective_caller_id)
        self._add_session(request)

        for sql, bind_variables, keyspace_name, keyspace_ids in zip(
            sql_list, bind_variables_list, keyspace_list, keyspace_ids_list):
          sql, bind_variables = dbapi.prepare_query_bind_vars(sql,
                                                              bind_variables)
          query = request.queries.add()
          query.query.sql = sql
          query.keyspace = keyspace_name
          query.keyspace_ids.extend(keyspace_ids)
          _convert_bind_vars(bind_variables, query.query.bind_variables)

        response = self.stub.ExecuteBatchKeyspaceIds(request, self.timeout)

      else:
        exec_method = 'ExecuteBatchShards'
        request = vtgate_pb2.ExecuteBatchShardsRequest(
            tablet_type=topodata_pb2.TabletType.Value(tablet_type.upper()),
            as_transaction=as_transaction,
        )
        _add_caller_id(request, effective_caller_id)
        self._add_session(request)

        for sql, bind_variables, keyspace_name, shards in zip(
            sql_list, bind_variables_list, keyspace_list, shards_list):
          sql, bind_variables = dbapi.prepare_query_bind_vars(sql,
                                                              bind_variables)
          query = request.queries.add()
          query.query.sql = sql
          query.keyspace = keyspace_name
          query.shards.extend(shards)
          _convert_bind_vars(bind_variables, query.query.bind_variables)

        response = self.stub.ExecuteBatchShards(request, self.timeout)

      self.session = response.session
      _extract_rpc_error(exec_method, response.error)

      rowsets = []
      for result in response.results:
        rowset = _get_rowset_from_query_result(result)
        rowsets.append(rowset)
      return rowsets

    except (face.AbortionError, vtgate_utils.VitessError) as e:
      self.logger_object.log_private_data(bind_variables_list)
      raise _convert_exception(
          e, sql_list, exec_method, keyspace='', tablet_type=tablet_type)
Beispiel #47
0
  def _execute(self, sql, bind_variables, keyspace_name, tablet_type,
               shards=None,
               keyspace_ids=None,
               keyranges=None,
               entity_keyspace_id_map=None, entity_column_name=None,
               not_in_transaction=False, effective_caller_id=None, **kwargs):

    # FIXME(alainjobart): keyspace should be in routing_kwargs,
    # as it's not used for v3.

    # FIXME(alainjobart): the v3 part doesn't take the ptyhon-style queries
    # for bind variables (the %(xxx)s), but our style (the :xxx).
    # this is not consistent with the rest.

    try:
      routing_kwargs = {}
      exec_method = None

      if entity_keyspace_id_map is not None:
        routing_kwargs['entity_keyspace_id_map'] = entity_keyspace_id_map
        routing_kwargs['entity_column_name'] = entity_column_name
        exec_method = 'ExecuteEntityIds'
        sql, bind_variables = dbapi.prepare_query_bind_vars(sql, bind_variables)

        request = vtgate_pb2.ExecuteEntityIdsRequest(
            query=query_pb2.BoundQuery(sql=sql),
            tablet_type=topodata_pb2.TabletType.Value(tablet_type.upper()),
            keyspace=keyspace_name,
            entity_column_name=entity_column_name,
            not_in_transaction=not_in_transaction,
        )
        _add_caller_id(request, effective_caller_id)
        self._add_session(request)
        _convert_bind_vars(bind_variables, request.query.bind_variables)
        _convert_entity_ids(entity_keyspace_id_map, request.entity_keyspace_ids)

        response = self.stub.ExecuteEntityIds(request, self.timeout)

      elif keyspace_ids is not None:
        routing_kwargs['keyspace_ids'] = keyspace_ids
        exec_method = 'ExecuteKeyspaceIds'
        sql, bind_variables = dbapi.prepare_query_bind_vars(sql, bind_variables)

        request = vtgate_pb2.ExecuteKeyspaceIdsRequest(
            query=query_pb2.BoundQuery(sql=sql),
            tablet_type=topodata_pb2.TabletType.Value(tablet_type.upper()),
            keyspace=keyspace_name,
            not_in_transaction=not_in_transaction,
        )
        _add_caller_id(request, effective_caller_id)
        self._add_session(request)
        request.keyspace_ids.extend(keyspace_ids)
        _convert_bind_vars(bind_variables, request.query.bind_variables)

        response = self.stub.ExecuteKeyspaceIds(request, self.timeout)

      elif keyranges is not None:
        routing_kwargs['keyranges'] = keyranges
        exec_method = 'ExecuteKeyRanges'
        sql, bind_variables = dbapi.prepare_query_bind_vars(sql, bind_variables)

        request = vtgate_pb2.ExecuteKeyRangesRequest(
            query=query_pb2.BoundQuery(sql=sql),
            tablet_type=topodata_pb2.TabletType.Value(tablet_type.upper()),
            keyspace=keyspace_name,
            not_in_transaction=not_in_transaction,
        )
        _add_caller_id(request, effective_caller_id)
        self._add_session(request)
        _add_key_ranges(request, keyranges)
        _convert_bind_vars(bind_variables, request.query.bind_variables)

        response = self.stub.ExecuteKeyRanges(request, self.timeout)

      else:
        exec_method = 'Execute'

        request = vtgate_pb2.ExecuteRequest(
            query=query_pb2.BoundQuery(sql=sql),
            tablet_type=topodata_pb2.TabletType.Value(tablet_type.upper()),
            not_in_transaction=not_in_transaction,
        )
        _add_caller_id(request, effective_caller_id)
        self._add_session(request)
        _convert_bind_vars(bind_variables, request.query.bind_variables)

        response = self.stub.Execute(request, self.timeout)

      self.session = response.session
      _extract_rpc_error(exec_method, response.error)
      return _get_rowset_from_query_result(response.result)

    except (face.AbortionError, vtgate_utils.VitessError) as e:
      self.logger_object.log_private_data(bind_variables)
      raise _convert_exception(
          e, sql, keyspace=keyspace_name, tablet_type=tablet_type,
          **routing_kwargs)
Beispiel #48
0
    def _execute(self,
                 sql,
                 bind_variables,
                 keyspace_name,
                 tablet_type,
                 keyspace_ids=None,
                 keyranges=None,
                 entity_keyspace_id_map=None,
                 entity_column_name=None,
                 not_in_transaction=False,
                 effective_caller_id=None):
        """Execute query.

    Args:
      sql: The sql text, with %(format)s-style tokens.
      bind_variables: (str: value) dict of bind variables corresponding
        to sql %(format)s tokens.
      keyspace_name: Str name of keyspace.
      tablet_type: Str tablet type (e.g. master, rdonly, replica).
      keyspace_ids: bytes list of keyspace ID lists.
      keyranges: KeyRange objects.
      entity_keyspace_id_map: (column value: bytes) map from a column
        to a keyspace id. If defined, vtgate adds a per-shard expression
        to the WHERE clause, and ignores keyspace_ids and keyranges
        parameters.
      entity_column_name: Str name of entity column used by
        entity_keyspace_id_map.
      not_in_transaction: bool.
      effective_caller_id: CallerID object.

    Returns:
      The (results, rowcount, lastrowid, fields) tuple.
    """

        routing_kwargs = {}
        exec_method = None
        req = None
        if entity_keyspace_id_map is not None:
            # This supercedes keyspace_ids and keyranges.
            routing_kwargs['entity_keyspace_id_map'] = entity_keyspace_id_map
            routing_kwargs['entity_column_name'] = entity_column_name
            if entity_column_name is None:
                raise dbexceptions.ProgrammingError(
                    '_execute called with entity_keyspace_id_map and no '
                    'entity_column_name')
            sql, new_binds = dbapi.prepare_query_bind_vars(sql, bind_variables)
            new_binds = field_types.convert_bind_vars(new_binds)
            req = {
                'Sql':
                sql,
                'BindVariables':
                new_binds,
                'Keyspace':
                keyspace_name,
                'TabletType':
                tablet_type,
                'EntityKeyspaceIDs': [{
                    'ExternalID': xid,
                    'KeyspaceID': kid
                } for xid, kid in entity_keyspace_id_map.iteritems()],
                'EntityColumnName':
                entity_column_name,
                'NotInTransaction':
                not_in_transaction,
            }
            exec_method = 'VTGate.ExecuteEntityIds'
        elif keyspace_ids is not None:
            if keyranges is not None:
                raise dbexceptions.ProgrammingError(
                    '_execute called with keyspace_ids and keyranges both defined'
                )
            routing_kwargs['keyspace_ids'] = keyspace_ids
            req = _create_req_with_keyspace_ids(sql, bind_variables,
                                                keyspace_name, tablet_type,
                                                keyspace_ids,
                                                not_in_transaction)
            exec_method = 'VTGate.ExecuteKeyspaceIds'
        elif keyranges is not None:
            routing_kwargs['keyranges'] = keyranges
            req = _create_req_with_keyranges(sql, bind_variables,
                                             keyspace_name, tablet_type,
                                             keyranges, not_in_transaction)
            exec_method = 'VTGate.ExecuteKeyRanges'
        else:
            raise dbexceptions.ProgrammingError(
                '_execute called with no entity_keyspace_id_map, '
                'keyspace_ids, or keyranges')

        self._add_caller_id(req, effective_caller_id)
        if not not_in_transaction:
            self._add_session(req)
        try:
            response = self._get_client().call(exec_method, req)
            self._update_session(response)
            vtgate_utils.extract_rpc_error(exec_method, response)
            reply = response.reply
            return self._get_rowset_from_query_result(reply.get('Result'))
        except (gorpc.GoRpcError, vtgate_utils.VitessError) as e:
            self.logger_object.log_private_data(bind_variables)
            raise self._convert_exception(e,
                                          sql,
                                          keyspace=keyspace_name,
                                          tablet_type=tablet_type,
                                          **routing_kwargs)
        except Exception:
            logging.exception('gorpc low-level error')
            raise
Beispiel #49
0
    def _execute_batch(self,
                       sql_list,
                       bind_variables_list,
                       keyspace_list,
                       keyspace_ids_list,
                       shards_list,
                       tablet_type,
                       as_transaction,
                       effective_caller_id=None,
                       **kwargs):

        try:
            if keyspace_ids_list[0]:
                exec_method = 'ExecuteBatchKeyspaceIds'
                request = vtgate_pb2.ExecuteBatchKeyspaceIdsRequest(
                    tablet_type=topodata_pb2.TabletType.Value(
                        tablet_type.upper()),
                    as_transaction=as_transaction,
                )
                _add_caller_id(request, effective_caller_id)
                self._add_session(request)

                for sql, bind_variables, keyspace_name, keyspace_ids in zip(
                        sql_list, bind_variables_list, keyspace_list,
                        keyspace_ids_list):
                    sql, bind_variables = dbapi.prepare_query_bind_vars(
                        sql, bind_variables)
                    query = request.queries.add()
                    query.query.sql = sql
                    query.keyspace = keyspace_name
                    query.keyspace_ids.extend(keyspace_ids)
                    _convert_bind_vars(bind_variables,
                                       query.query.bind_variables)

                response = self.stub.ExecuteBatchKeyspaceIds(
                    request, self.timeout)

            else:
                exec_method = 'ExecuteBatchShards'
                request = vtgate_pb2.ExecuteBatchShardsRequest(
                    tablet_type=topodata_pb2.TabletType.Value(
                        tablet_type.upper()),
                    as_transaction=as_transaction,
                )
                _add_caller_id(request, effective_caller_id)
                self._add_session(request)

                for sql, bind_variables, keyspace_name, shards in zip(
                        sql_list, bind_variables_list, keyspace_list,
                        shards_list):
                    sql, bind_variables = dbapi.prepare_query_bind_vars(
                        sql, bind_variables)
                    query = request.queries.add()
                    query.query.sql = sql
                    query.keyspace = keyspace_name
                    query.shards.extend(shards)
                    _convert_bind_vars(bind_variables,
                                       query.query.bind_variables)

                response = self.stub.ExecuteBatchShards(request, self.timeout)

            self.session = response.session
            _extract_rpc_error(exec_method, response.error)

            rowsets = []
            for result in response.results:
                rowset = _get_rowset_from_query_result(result)
                rowsets.append(rowset)
            return rowsets

        except (face.AbortionError, vtgate_utils.VitessError) as e:
            self.logger_object.log_private_data(bind_variables_list)
            raise _convert_exception(e,
                                     sql_list,
                                     exec_method,
                                     keyspace='',
                                     tablet_type=tablet_type)
Beispiel #50
0
 def _stream_execute(self, sql, bind_variables):
     sql, bind_variables = dbapi.prepare_query_bind_vars(
         sql, bind_variables)
     result = self.conn._stream_execute(sql, bind_variables)
     return result
Beispiel #51
0
 def _execute(self, sql, bind_variables):
     sql, bind_variables = dbapi.prepare_query_bind_vars(
         sql, bind_variables)
     result = tablet.TabletConnection._execute(self, sql, bind_variables)
     return result