|
@@ -1,10 +1,11 @@
|
|
#include "UpdatesCtrlRaw.h"
|
|
#include "UpdatesCtrlRaw.h"
|
|
using namespace drogon::orm;
|
|
using namespace drogon::orm;
|
|
-const void update(const std::shared_ptr<std::vector<Result>> &results,
|
|
|
|
- const std::shared_ptr<std::function<void(const HttpResponsePtr &)>> &callbackPtr,
|
|
|
|
- const DbClientPtr &client)
|
|
|
|
|
|
+const void update(
|
|
|
|
+ const std::shared_ptr<std::vector<Result>> &results,
|
|
|
|
+ const std::shared_ptr<std::function<void(const HttpResponsePtr &)>>
|
|
|
|
+ &callbackPtr,
|
|
|
|
+ const DbClientPtr &client)
|
|
{
|
|
{
|
|
-
|
|
|
|
auto size = results->size();
|
|
auto size = results->size();
|
|
std::string sql;
|
|
std::string sql;
|
|
sql.reserve(256);
|
|
sql.reserve(256);
|
|
@@ -12,14 +13,17 @@ const void update(const std::shared_ptr<std::vector<Result>> &results,
|
|
int placeholdersCounter = 1;
|
|
int placeholdersCounter = 1;
|
|
for (size_t i = 0; i < size; i++)
|
|
for (size_t i = 0; i < size; i++)
|
|
{
|
|
{
|
|
- auto tmpStr = drogon::utils::formattedString("when $%d then $%d ", placeholdersCounter, placeholdersCounter + 1);
|
|
|
|
|
|
+ auto tmpStr = drogon::utils::formattedString("when $%d then $%d ",
|
|
|
|
+ placeholdersCounter,
|
|
|
|
+ placeholdersCounter + 1);
|
|
placeholdersCounter += 2;
|
|
placeholdersCounter += 2;
|
|
sql.append(tmpStr);
|
|
sql.append(tmpStr);
|
|
}
|
|
}
|
|
sql.append("else randomnumber end where id in (");
|
|
sql.append("else randomnumber end where id in (");
|
|
for (size_t i = 0; i < size; i++)
|
|
for (size_t i = 0; i < size; i++)
|
|
{
|
|
{
|
|
- auto tmpStr = drogon::utils::formattedString("$%d,", placeholdersCounter);
|
|
|
|
|
|
+ auto tmpStr =
|
|
|
|
+ drogon::utils::formattedString("$%d,", placeholdersCounter);
|
|
++placeholdersCounter;
|
|
++placeholdersCounter;
|
|
sql.append(tmpStr);
|
|
sql.append(tmpStr);
|
|
}
|
|
}
|
|
@@ -27,42 +31,47 @@ const void update(const std::shared_ptr<std::vector<Result>> &results,
|
|
|
|
|
|
auto sqlBinder = *client << std::move(sql);
|
|
auto sqlBinder = *client << std::move(sql);
|
|
|
|
|
|
- auto jsonPtr = std::make_shared<Json::Value>();
|
|
|
|
- jsonPtr->resize(0);
|
|
|
|
- for (auto &r : *results)
|
|
|
|
|
|
+ std::string jsonStr;
|
|
|
|
+ jsonStr.reserve(size * 36);
|
|
|
|
+ jsonStr.append("[", 1);
|
|
|
|
+ for (auto const &r : *results)
|
|
{
|
|
{
|
|
auto randId = rand() % 10000 + 1;
|
|
auto randId = rand() % 10000 + 1;
|
|
auto id = r[0]["id"].as<int>();
|
|
auto id = r[0]["id"].as<int>();
|
|
sqlBinder << id;
|
|
sqlBinder << id;
|
|
sqlBinder << randId;
|
|
sqlBinder << randId;
|
|
- Json::Value j;
|
|
|
|
- j["id"] = id;
|
|
|
|
- j["randomnumber"] = randId;
|
|
|
|
- jsonPtr->append(std::move(j));
|
|
|
|
|
|
+ char json[64];
|
|
|
|
+ auto size =
|
|
|
|
+ sprintf(json, "{\"id\":%d,\"randomnumber\":%d}", id, randId);
|
|
|
|
+ jsonStr.append(json, size);
|
|
|
|
+ jsonStr.append(",", 1);
|
|
}
|
|
}
|
|
- for (auto &r : *results)
|
|
|
|
|
|
+ jsonStr[jsonStr.length() - 1] = ']';
|
|
|
|
+ for (auto const &r : *results)
|
|
{
|
|
{
|
|
sqlBinder << r[0]["id"].as<int>();
|
|
sqlBinder << r[0]["id"].as<int>();
|
|
}
|
|
}
|
|
|
|
|
|
- sqlBinder >>
|
|
|
|
- [jsonPtr = std::move(jsonPtr), callbackPtr](const Result &r) mutable {
|
|
|
|
- (*callbackPtr)(HttpResponse::newHttpJsonResponse(*jsonPtr));
|
|
|
|
- } >>
|
|
|
|
- [callbackPtr](const DrogonDbException &e) {
|
|
|
|
- Json::Value ret;
|
|
|
|
- ret["result"] = "error!";
|
|
|
|
- auto resp = HttpResponse::newHttpJsonResponse(ret);
|
|
|
|
- (*callbackPtr)(resp);
|
|
|
|
- };
|
|
|
|
|
|
+ sqlBinder >> [jsonStr = std::move(jsonStr),
|
|
|
|
+ callbackPtr](const Result &r) mutable {
|
|
|
|
+ auto resp = HttpResponse::newHttpResponse();
|
|
|
|
+ resp->setContentTypeCode(ContentType::CT_APPLICATION_JSON);
|
|
|
|
+ resp->setBody(std::move(jsonStr));
|
|
|
|
+ (*callbackPtr)(resp);
|
|
|
|
+ } >> [callbackPtr](const DrogonDbException &e) {
|
|
|
|
+ Json::Value ret;
|
|
|
|
+ ret["result"] = "error!";
|
|
|
|
+ auto resp = HttpResponse::newHttpJsonResponse(ret);
|
|
|
|
+ (*callbackPtr)(resp);
|
|
|
|
+ };
|
|
}
|
|
}
|
|
-void UpdatesCtrlRaw::asyncHandleHttpRequest(const HttpRequestPtr &req, std::function<void(const HttpResponsePtr &)> &&callback)
|
|
|
|
|
|
+void UpdatesCtrlRaw::asyncHandleHttpRequest(
|
|
|
|
+ const HttpRequestPtr &req,
|
|
|
|
+ std::function<void(const HttpResponsePtr &)> &&callback)
|
|
{
|
|
{
|
|
- //write your application logic here
|
|
|
|
|
|
+ // write your application logic here
|
|
static std::once_flag once;
|
|
static std::once_flag once;
|
|
- std::call_once(once, []() {
|
|
|
|
- srand(time(NULL));
|
|
|
|
- });
|
|
|
|
|
|
+ std::call_once(once, []() { srand(time(NULL)); });
|
|
size_t queries = 1;
|
|
size_t queries = 1;
|
|
auto ¶meter = req->getParameter("queries");
|
|
auto ¶meter = req->getParameter("queries");
|
|
if (!parameter.empty())
|
|
if (!parameter.empty())
|
|
@@ -73,18 +82,18 @@ void UpdatesCtrlRaw::asyncHandleHttpRequest(const HttpRequestPtr &req, std::func
|
|
else if (queries < 1)
|
|
else if (queries < 1)
|
|
queries = 1;
|
|
queries = 1;
|
|
}
|
|
}
|
|
- auto json = std::make_shared<Json::Value>();
|
|
|
|
- json->resize(0);
|
|
|
|
- auto callbackPtr = std::shared_ptr<std::function<void(const HttpResponsePtr &)>>(new std::function<void(const HttpResponsePtr &)>(std::move(callback)));
|
|
|
|
|
|
+ auto callbackPtr =
|
|
|
|
+ std::make_shared<std::function<void(const HttpResponsePtr &)>>(
|
|
|
|
+ std::move(callback));
|
|
auto resultSetPtr = std::make_shared<std::vector<Result>>();
|
|
auto resultSetPtr = std::make_shared<std::vector<Result>>();
|
|
resultSetPtr->reserve(queries);
|
|
resultSetPtr->reserve(queries);
|
|
auto client = app().getFastDbClient();
|
|
auto client = app().getFastDbClient();
|
|
for (size_t i = 0; i < queries; i++)
|
|
for (size_t i = 0; i < queries; i++)
|
|
{
|
|
{
|
|
int id = rand() % 10000 + 1;
|
|
int id = rand() % 10000 + 1;
|
|
- *client << "select * from world where id=$1"
|
|
|
|
- << id >>
|
|
|
|
- [callbackPtr, resultSetPtr, client, queries](const Result &r) mutable {
|
|
|
|
|
|
+ *client << "select * from world where id=$1" << id >>
|
|
|
|
+ [callbackPtr, resultSetPtr, client, queries](
|
|
|
|
+ const Result &r) mutable {
|
|
resultSetPtr->push_back(r);
|
|
resultSetPtr->push_back(r);
|
|
if (resultSetPtr->size() == queries)
|
|
if (resultSetPtr->size() == queries)
|
|
{
|
|
{
|