|
@@ -2,6 +2,7 @@
|
|
|
|
|
|
#include <userver/components/component_context.hpp>
|
|
#include <userver/components/component_context.hpp>
|
|
#include <userver/formats/serialize/common_containers.hpp>
|
|
#include <userver/formats/serialize/common_containers.hpp>
|
|
|
|
+#include <userver/http/common_headers.hpp>
|
|
#include <userver/storages/postgres/postgres.hpp>
|
|
#include <userver/storages/postgres/postgres.hpp>
|
|
|
|
|
|
#include <boost/container/small_vector.hpp>
|
|
#include <boost/container/small_vector.hpp>
|
|
@@ -26,24 +27,25 @@ constexpr std::size_t kBestConcurrencyWildGuess = 128;
|
|
|
|
|
|
Handler::Handler(const userver::components::ComponentConfig& config,
|
|
Handler::Handler(const userver::components::ComponentConfig& config,
|
|
const userver::components::ComponentContext& context)
|
|
const userver::components::ComponentContext& context)
|
|
- : userver::server::handlers::HttpHandlerJsonBase{config, context},
|
|
|
|
|
|
+ : userver::server::handlers::HttpHandlerBase{config, context},
|
|
pg_{context.FindComponent<userver::components::Postgres>("hello-world-db")
|
|
pg_{context.FindComponent<userver::components::Postgres>("hello-world-db")
|
|
.GetCluster()},
|
|
.GetCluster()},
|
|
query_arg_name_{"queries"},
|
|
query_arg_name_{"queries"},
|
|
update_query_{db_helpers::CreateNonLoggingQuery(kUpdateQueryStr)},
|
|
update_query_{db_helpers::CreateNonLoggingQuery(kUpdateQueryStr)},
|
|
semaphore_{kBestConcurrencyWildGuess} {}
|
|
semaphore_{kBestConcurrencyWildGuess} {}
|
|
|
|
|
|
-userver::formats::json::Value Handler::HandleRequestJsonThrow(
|
|
|
|
|
|
+std::string Handler::HandleRequestThrow(
|
|
const userver::server::http::HttpRequest& request,
|
|
const userver::server::http::HttpRequest& request,
|
|
- const userver::formats::json::Value&,
|
|
|
|
userver::server::request::RequestContext&) const {
|
|
userver::server::request::RequestContext&) const {
|
|
const auto queries =
|
|
const auto queries =
|
|
db_helpers::ParseParamFromQuery(request, query_arg_name_);
|
|
db_helpers::ParseParamFromQuery(request, query_arg_name_);
|
|
|
|
|
|
|
|
+ request.GetHttpResponse().SetHeader(userver::http::headers::kContentType,
|
|
|
|
+ "application/json");
|
|
return GetResponse(queries);
|
|
return GetResponse(queries);
|
|
}
|
|
}
|
|
|
|
|
|
-userver::formats::json::Value Handler::GetResponse(int queries) const {
|
|
|
|
|
|
+std::string Handler::GetResponse(int queries) const {
|
|
// userver's PG doesn't accept boost::small_vector as an input, sadly
|
|
// userver's PG doesn't accept boost::small_vector as an input, sadly
|
|
std::vector<db_helpers::WorldTableRow> values(queries);
|
|
std::vector<db_helpers::WorldTableRow> values(queries);
|
|
for (auto& value : values) {
|
|
for (auto& value : values) {
|
|
@@ -58,9 +60,11 @@ userver::formats::json::Value Handler::GetResponse(int queries) const {
|
|
{
|
|
{
|
|
const auto lock = semaphore_.Acquire();
|
|
const auto lock = semaphore_.Acquire();
|
|
|
|
|
|
- auto trx = pg_->Begin(db_helpers::kClusterHostType, {});
|
|
|
|
|
|
+ auto trx =
|
|
|
|
+ pg_->Begin(db_helpers::kClusterHostType, {}, db_helpers::kDefaultPgCC);
|
|
for (auto& value : values) {
|
|
for (auto& value : values) {
|
|
- value.random_number = trx.Execute(db_helpers::kSelectRowQuery, value.id)
|
|
|
|
|
|
+ value.random_number = trx.Execute(db_helpers::kDefaultPgCC,
|
|
|
|
+ db_helpers::kSelectRowQuery, value.id)
|
|
.AsSingleRow<db_helpers::WorldTableRow>(
|
|
.AsSingleRow<db_helpers::WorldTableRow>(
|
|
userver::storages::postgres::kRowTag)
|
|
userver::storages::postgres::kRowTag)
|
|
.random_number;
|
|
.random_number;
|
|
@@ -74,11 +78,14 @@ userver::formats::json::Value Handler::GetResponse(int queries) const {
|
|
value.random_number = db_helpers::GenerateRandomValue();
|
|
value.random_number = db_helpers::GenerateRandomValue();
|
|
}
|
|
}
|
|
|
|
|
|
- trx.ExecuteDecomposeBulk(update_query_, values, values.size());
|
|
|
|
|
|
+ trx.ExecuteDecomposeBulk(db_helpers::kDefaultPgCC, update_query_, values,
|
|
|
|
+ values.size());
|
|
trx.Commit();
|
|
trx.Commit();
|
|
}
|
|
}
|
|
|
|
|
|
- return userver::formats::json::ValueBuilder{values}.ExtractValue();
|
|
|
|
|
|
+ userver::formats::json::StringBuilder sb{};
|
|
|
|
+ WriteToStream(result, sb);
|
|
|
|
+ return sb.GetString();
|
|
}
|
|
}
|
|
|
|
|
|
} // namespace userver_techempower::updates
|
|
} // namespace userver_techempower::updates
|