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;
}