std::shared_ptr Connection::beginAnyQuery()

in squangle/mysql_client/Connection.cpp [150:191]


std::shared_ptr<QueryType> Connection::beginAnyQuery(
    Operation::ConnectionProxy&& conn_proxy,
    QueryArg&& query) {
  CHECK_THROW(conn_proxy.get(), db::InvalidConnectionException);
  CHECK_THROW(conn_proxy.get()->ok(), db::InvalidConnectionException);
  conn_proxy.get()->checkOperationInProgress();
  auto ret = std::make_shared<QueryType>(
      std::move(conn_proxy), std::forward<QueryArg>(query));
  Duration timeout = ret->connection()->conn_options_.getQueryTimeout();
  if (timeout.count() > 0) {
    ret->setTimeout(timeout);
  }

  auto* conn = ret->connection();
  conn->mysql_client_->addOperation(ret);
  conn->socket_handler_.setOperation(ret.get());
  ret->setPreOperationCallback([conn](Operation& op) {
    if (conn->callbacks_.pre_operation_callback_) {
      conn->callbacks_.pre_operation_callback_(op);
    }
  });
  ret->setPostOperationCallback([conn](Operation& op) {
    if (conn->callbacks_.post_operation_callback_) {
      conn->callbacks_.post_operation_callback_(op);
    }
  });
  auto opType = ret->getOperationType();
  if (opType == db::OperationType::Query ||
      opType == db::OperationType::MultiQuery) {
    ret->setPreQueryCallback([conn](FetchOperation& op) {
      return conn->callbacks_.pre_query_callback_
          ? conn->callbacks_.pre_query_callback_(op)
          : folly::makeSemiFuture(folly::unit);
    });
    ret->setPostQueryCallback([conn](AsyncPostQueryResult&& result) {
      return conn->callbacks_.post_query_callback_
          ? conn->callbacks_.post_query_callback_(std::move(result))
          : folly::makeSemiFuture(std::move(result));
    });
  }
  return ret;
}