|
@@ -1,21 +1,21 @@
|
|
|
#include "UpdatesCtrlRaw.h"
|
|
|
-#include "models/World.h"
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
-using namespace drogon_model::hello_world;
|
|
|
using namespace drogon::orm;
|
|
|
-const void update(
|
|
|
- const std::shared_ptr<std::vector<World>> &results,
|
|
|
- const std::shared_ptr<std::function<void(const HttpResponsePtr &)>>
|
|
|
- &callbackPtr,
|
|
|
- const DbClientPtr &client)
|
|
|
+
|
|
|
+const std::string &UpdatesCtrlRaw::getSQL(size_t count)
|
|
|
{
|
|
|
- auto size = results->size();
|
|
|
+ auto &sqlMap = *updateSQLs_;
|
|
|
+ auto iter = sqlMap.find(count);
|
|
|
+ if (iter != sqlMap.end())
|
|
|
+ {
|
|
|
+ return *(iter->second);
|
|
|
+ }
|
|
|
std::string sql;
|
|
|
- sql.reserve(256);
|
|
|
+ sql.reserve(80 + count * 25);
|
|
|
sql.append("update world set randomnumber=case id ");
|
|
|
int placeholdersCounter = 1;
|
|
|
- for (size_t i = 0; i < size; i++)
|
|
|
+ for (size_t i = 0; i < count; i++)
|
|
|
{
|
|
|
auto tmpStr = drogon::utils::formattedString("when $%d then $%d ",
|
|
|
placeholdersCounter,
|
|
@@ -24,7 +24,7 @@ const void update(
|
|
|
sql.append(tmpStr);
|
|
|
}
|
|
|
sql.append("else randomnumber end where id in (");
|
|
|
- for (size_t i = 0; i < size; i++)
|
|
|
+ for (size_t i = 0; i < count; i++)
|
|
|
{
|
|
|
auto tmpStr =
|
|
|
drogon::utils::formattedString("$%d,", placeholdersCounter);
|
|
@@ -32,8 +32,18 @@ const void update(
|
|
|
sql.append(tmpStr);
|
|
|
}
|
|
|
sql[sql.length() - 1] = ')';
|
|
|
-
|
|
|
- auto sqlBinder = *client << std::move(sql);
|
|
|
+ auto ret =
|
|
|
+ sqlMap.insert({count, std::make_unique<std::string>(std::move(sql))});
|
|
|
+ return *(ret.first->second);
|
|
|
+}
|
|
|
+void UpdatesCtrlRaw::update(
|
|
|
+ const std::shared_ptr<std::vector<World>> &results,
|
|
|
+ const std::shared_ptr<std::function<void(const HttpResponsePtr &)>>
|
|
|
+ &callbackPtr,
|
|
|
+ const DbClientPtr &client)
|
|
|
+{
|
|
|
+ auto const &sql = getSQL(results->size());
|
|
|
+ auto sqlBinder = *client << string_view(sql.data(), sql.length());
|
|
|
Json::Value json;
|
|
|
json.resize(0);
|
|
|
for (auto const &w : *results)
|
|
@@ -51,7 +61,8 @@ const void update(
|
|
|
sqlBinder << w.getValueOfId();
|
|
|
}
|
|
|
|
|
|
- sqlBinder >> [callbackPtr, json = std::move(json)](const Result &r) mutable {
|
|
|
+ sqlBinder >> [callbackPtr,
|
|
|
+ json = std::move(json)](const Result &r) mutable {
|
|
|
(*callbackPtr)(HttpResponse::newHttpJsonResponse(std::move(json)));
|
|
|
} >> [callbackPtr](const DrogonDbException &e) {
|
|
|
Json::Value json{};
|
|
@@ -68,7 +79,7 @@ void UpdatesCtrlRaw::asyncHandleHttpRequest(
|
|
|
// write your application logic here
|
|
|
static std::once_flag once;
|
|
|
std::call_once(once, []() { srand(time(NULL)); });
|
|
|
- size_t queries = 1;
|
|
|
+ int queries = 1;
|
|
|
auto ¶meter = req->getParameter("queries");
|
|
|
if (!parameter.empty())
|
|
|
{
|
|
@@ -83,16 +94,23 @@ void UpdatesCtrlRaw::asyncHandleHttpRequest(
|
|
|
std::move(callback));
|
|
|
auto resultSetPtr = std::make_shared<std::vector<World>>();
|
|
|
resultSetPtr->reserve(queries);
|
|
|
- if (!*_dbClient)
|
|
|
+ if (!*dbClient_)
|
|
|
{
|
|
|
- *_dbClient = drogon::app().getFastDbClient();
|
|
|
+ *dbClient_ = drogon::app().getFastDbClient();
|
|
|
}
|
|
|
- for (size_t i = 0; i < queries; i++)
|
|
|
+ auto errFlag = std::make_shared<bool>(false);
|
|
|
+ for (int i = 0; i < queries; i++)
|
|
|
{
|
|
|
int id = rand() % 10000 + 1;
|
|
|
- **_dbClient << "select * from world where id=$1" << id >>
|
|
|
- [callbackPtr, resultSetPtr, &client = *_dbClient, queries](
|
|
|
- const Result &r) mutable {
|
|
|
+ **dbClient_ << "select * from world where id=$1" << id >>
|
|
|
+ [callbackPtr,
|
|
|
+ resultSetPtr,
|
|
|
+ &client = *dbClient_,
|
|
|
+ queries,
|
|
|
+ this,
|
|
|
+ errFlag](const Result &r) mutable {
|
|
|
+ if (*errFlag)
|
|
|
+ return;
|
|
|
if (r.size() == 1)
|
|
|
{
|
|
|
resultSetPtr->emplace_back(World(r[0]));
|
|
@@ -103,13 +121,20 @@ void UpdatesCtrlRaw::asyncHandleHttpRequest(
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
+ if (*errFlag)
|
|
|
+ return;
|
|
|
+ *errFlag = true;
|
|
|
Json::Value json{};
|
|
|
json["code"] = 0;
|
|
|
json["message"] = "Internal error";
|
|
|
- (*callbackPtr)(HttpResponse::newHttpJsonResponse(std::move(json)));
|
|
|
+ (*callbackPtr)(
|
|
|
+ HttpResponse::newHttpJsonResponse(std::move(json)));
|
|
|
}
|
|
|
} >>
|
|
|
- [callbackPtr](const DrogonDbException &e) {
|
|
|
+ [callbackPtr, errFlag](const DrogonDbException &e) {
|
|
|
+ if (*errFlag)
|
|
|
+ return;
|
|
|
+ *errFlag = true;
|
|
|
Json::Value json{};
|
|
|
json["code"] = 1;
|
|
|
json["message"] = e.base().what();
|