Browse Source

Update drogon (#5361)

An Tao 5 years ago
parent
commit
c4c7675924

+ 1 - 1
frameworks/C++/drogon/drogon-core.dockerfile

@@ -44,7 +44,7 @@ RUN git clone https://github.com/an-tao/drogon
 
 
 WORKDIR $DROGON_ROOT
 WORKDIR $DROGON_ROOT
 
 
-RUN git checkout 139d2db02b324be02430a18dfe93fe822b141b4d
+RUN git checkout feb0b73e783190185954a3626706aeaec802bf6d
 RUN git submodule update --init
 RUN git submodule update --init
 RUN mkdir build
 RUN mkdir build
 
 

+ 1 - 1
frameworks/C++/drogon/drogon.dockerfile

@@ -44,7 +44,7 @@ RUN git clone https://github.com/an-tao/drogon
 
 
 WORKDIR $DROGON_ROOT
 WORKDIR $DROGON_ROOT
 
 
-RUN git checkout 139d2db02b324be02430a18dfe93fe822b141b4d
+RUN git checkout feb0b73e783190185954a3626706aeaec802bf6d
 RUN git submodule update --init
 RUN git submodule update --init
 RUN mkdir build
 RUN mkdir build
 
 

+ 5 - 6
frameworks/C++/drogon/drogon_benchmark/controllers/DbCtrl.cc

@@ -26,14 +26,13 @@ void DbCtrl::asyncHandleHttpRequest(
     mapper.findByPrimaryKey(
     mapper.findByPrimaryKey(
         id,
         id,
         [callbackPtr](World w) {
         [callbackPtr](World w) {
-            auto j = w.toJson();
-            auto resp = HttpResponse::newHttpJsonResponse(j);
+            auto resp = HttpResponse::newHttpJsonResponse(w.toJson());
             (*callbackPtr)(resp);
             (*callbackPtr)(resp);
         },
         },
         [callbackPtr](const DrogonDbException &e) {
         [callbackPtr](const DrogonDbException &e) {
-            Json::Value ret;
-            ret["result"] = "error!";
-            auto resp = HttpResponse::newHttpJsonResponse(ret);
-            (*callbackPtr)(resp);
+            Json::Value json{};
+            json["code"] = 1;
+            json["message"] = e.base().what();
+            (*callbackPtr)(HttpResponse::newHttpJsonResponse(std::move(json)));
         });
         });
 }
 }

+ 15 - 12
frameworks/C++/drogon/drogon_benchmark/controllers/DbCtrlRaw.cc

@@ -23,21 +23,24 @@ void DbCtrlRaw::asyncHandleHttpRequest(
             std::move(callback));
             std::move(callback));
 
 
     **_dbClient << "select * from world where id=$1" << id >>
     **_dbClient << "select * from world where id=$1" << id >>
-        [callbackPtr, id](const Result &rows) {
-            auto resp = HttpResponse::newHttpResponse();
-            char json[64];
-            auto size = sprintf(json,
-                                "{\"id\":%d,\"randomnumber\":%s}",
-                                id,
-                                rows[0][1ul].c_str());
-            resp->setBody(std::string(json, size));
-            resp->setContentTypeCode(CT_APPLICATION_JSON);
-            (*callbackPtr)(resp);
+        [callbackPtr](const Result &rows) {
+            if (rows.size() == 1)
+            {
+                auto obj = World(rows[0]);
+                (*callbackPtr)(HttpResponse::newHttpJsonResponse(obj.toJson()));
+            }
+            else
+            {
+                Json::Value json{};
+                json["code"] = 0;
+                json["message"] = "Internal error";
+                (*callbackPtr)(HttpResponse::newHttpJsonResponse(std::move(json)));
+            }
         } >>
         } >>
         [callbackPtr](const DrogonDbException &err) {
         [callbackPtr](const DrogonDbException &err) {
             Json::Value json{};
             Json::Value json{};
-            json["code"] = 0;
+            json["code"] = 1;
             json["message"] = err.base().what();
             json["message"] = err.base().what();
-            (*callbackPtr)(HttpResponse::newHttpJsonResponse(json));
+            (*callbackPtr)(HttpResponse::newHttpJsonResponse(std::move(json)));
         };
         };
 }
 }

+ 15 - 9
frameworks/C++/drogon/drogon_benchmark/controllers/FortuneCtrlRaw.cc

@@ -1,8 +1,9 @@
 #include "FortuneCtrlRaw.h"
 #include "FortuneCtrlRaw.h"
-#include "models/Fortune.h"
+#include <drogon/orm/Result.h>
 #include <algorithm>
 #include <algorithm>
 
 
-using namespace drogon_model::hello_world;
+using namespace drogon::orm;
+
 void FortuneCtrlRaw::asyncHandleHttpRequest(
 void FortuneCtrlRaw::asyncHandleHttpRequest(
     const HttpRequestPtr &req,
     const HttpRequestPtr &req,
     std::function<void(const HttpResponsePtr &)> &&callback)
     std::function<void(const HttpResponsePtr &)> &&callback)
@@ -17,21 +18,26 @@ void FortuneCtrlRaw::asyncHandleHttpRequest(
 
 
     **_dbClient << "select * from fortune where 1=$1" << 1 >>
     **_dbClient << "select * from fortune where 1=$1" << 1 >>
         [callbackPtr](const Result &r) {
         [callbackPtr](const Result &r) {
-            std::vector<std::pair<string_view, string_view>> rows;
+            std::vector<Fortune> rows;
+            rows.reserve(r.size() + 1);
             for (auto const &row : r)
             for (auto const &row : r)
             {
             {
                 rows.emplace_back(row[0ul].as<string_view>(),   // id
                 rows.emplace_back(row[0ul].as<string_view>(),   // id
                                   row[1ul].as<string_view>());  // message
                                   row[1ul].as<string_view>());  // message
             }
             }
-            rows.emplace_back("0", "Additional fortune added at request time.");
+            Fortune newRow;
+            newRow.id_ = "0";
+            newRow.message_ = "Additional fortune added at request time.";
+            rows.emplace_back(std::move(newRow));
             std::sort(rows.begin(),
             std::sort(rows.begin(),
                       rows.end(),
                       rows.end(),
-                      [](const std::pair<string_view, string_view> &p1,
-                         const std::pair<string_view, string_view> &p2)
-                          -> bool {
-                          if (p1.second < p2.second)
+                      [](const Fortune &f1, const Fortune &f2) -> bool {
+                          if (f1.message_ < f2.message_)
                               return true;
                               return true;
-                          return false;
+                          else
+                          {
+                              return false;
+                          }
                       });
                       });
             HttpViewData data;
             HttpViewData data;
             data.insert("rows", std::move(rows));
             data.insert("rows", std::move(rows));

+ 10 - 0
frameworks/C++/drogon/drogon_benchmark/controllers/FortuneCtrlRaw.h

@@ -3,6 +3,16 @@
 #include <drogon/IOThreadStorage.h>
 #include <drogon/IOThreadStorage.h>
 
 
 using namespace drogon;
 using namespace drogon;
+struct Fortune
+{
+    Fortune(string_view &&id, string_view &&message)
+        : id_(std::move(id)), message_(std::move(message))
+    {
+    }
+    Fortune() = default;
+    string_view id_;
+    string_view message_;
+};
 class FortuneCtrlRaw : public drogon::HttpSimpleController<FortuneCtrlRaw>
 class FortuneCtrlRaw : public drogon::HttpSimpleController<FortuneCtrlRaw>
 {
 {
   public:
   public:

+ 1 - 2
frameworks/C++/drogon/drogon_benchmark/controllers/JsonCtrl.cc

@@ -5,6 +5,5 @@ void JsonCtrl::asyncHandleHttpRequest(
 {
 {
     Json::Value ret;
     Json::Value ret;
     ret["message"] = "Hello, World!";
     ret["message"] = "Hello, World!";
-    auto resp = HttpResponse::newHttpJsonResponse(ret);
-    callback(resp);
+    callback(HttpResponse::newHttpJsonResponse(std::move(ret)));
 }
 }

+ 5 - 5
frameworks/C++/drogon/drogon_benchmark/controllers/QueriesCtrl.cc

@@ -43,14 +43,14 @@ void QueriesCtrl::asyncHandleHttpRequest(
                 (*counter)--;
                 (*counter)--;
                 if ((*counter) == 0)
                 if ((*counter) == 0)
                 {
                 {
-                    (*callbackPtr)(HttpResponse::newHttpJsonResponse(*json));
+                    (*callbackPtr)(HttpResponse::newHttpJsonResponse(std::move(*json)));
                 }
                 }
             },
             },
             [callbackPtr](const DrogonDbException &e) {
             [callbackPtr](const DrogonDbException &e) {
-                Json::Value ret;
-                ret["result"] = "error!";
-                auto resp = HttpResponse::newHttpJsonResponse(ret);
-                (*callbackPtr)(resp);
+                Json::Value json{};
+                json["code"] = 1;
+                json["message"] = e.base().what();
+                (*callbackPtr)(HttpResponse::newHttpJsonResponse(std::move(json)));
             });
             });
     }
     }
 }
 }

+ 30 - 24
frameworks/C++/drogon/drogon_benchmark/controllers/QueriesCtrlRaw.cc

@@ -1,4 +1,9 @@
 #include "QueriesCtrlRaw.h"
 #include "QueriesCtrlRaw.h"
+#include "models/World.h"
+#include <stdlib.h>
+
+using namespace drogon_model::hello_world;
+
 using namespace drogon::orm;
 using namespace drogon::orm;
 void QueriesCtrlRaw::asyncHandleHttpRequest(
 void QueriesCtrlRaw::asyncHandleHttpRequest(
     const HttpRequestPtr &req,
     const HttpRequestPtr &req,
@@ -25,41 +30,42 @@ void QueriesCtrlRaw::asyncHandleHttpRequest(
     {
     {
         *_dbClient = drogon::app().getFastDbClient();
         *_dbClient = drogon::app().getFastDbClient();
     }
     }
-    auto jsonStr = std::make_shared<std::string>();
-    jsonStr->reserve(queries * 36);
-    jsonStr->append("[", 1);
+    auto json = std::make_shared<Json::Value>();
+    json->resize(0);
     for (int i = 0; i < queries; i++)
     for (int i = 0; i < queries; i++)
     {
     {
         int id = rand() % 10000 + 1;
         int id = rand() % 10000 + 1;
         **_dbClient << "select * from world where id=$1" << id >>
         **_dbClient << "select * from world where id=$1" << id >>
-            [callbackPtr, counter, jsonStr, id](const Result &r) mutable {
-                (*counter)--;
+            [callbackPtr, counter, json](const Result &r) mutable {
+                if (*counter <= 0)
+                    return;
                 if (r.size() > 0)
                 if (r.size() > 0)
                 {
                 {
-                    char json[64];
-                    auto size = sprintf(json,
-                                        "{\"id\":%d,\"randomnumber\":%s}",
-                                        id,
-                                        r[0][1ul].c_str());
-                    jsonStr->append(json, size);
-                }
-                if ((*counter) == 0)
-                {
-                    jsonStr->append("]", 1);
-                    auto resp = HttpResponse::newHttpResponse();
-                    resp->setContentTypeCode(ContentType::CT_APPLICATION_JSON);
-                    resp->setBody(std::move(*jsonStr));
-                    (*callbackPtr)(resp);
+                    auto w = World(r[0]);
+                    json->append(w.toJson());
+                    (*counter)--;
+                    if ((*counter) == 0)
+                    {
+                        (*callbackPtr)(HttpResponse::newHttpJsonResponse(std::move(*json)));
+                    }
                 }
                 }
                 else
                 else
                 {
                 {
-                    jsonStr->append(",");
+                    *counter = -1;
+                    Json::Value json{};
+                    json["code"] = 0;
+                    json["message"] = "Internal error";
+                    (*callbackPtr)(HttpResponse::newHttpJsonResponse(std::move(json)));
                 }
                 }
             } >>
             } >>
-            [callbackPtr](const DrogonDbException &e) {
-                Json::Value ret;
-                ret["result"] = "error!";
-                auto resp = HttpResponse::newHttpJsonResponse(ret);
+            [callbackPtr, counter](const DrogonDbException &e) {
+                if (*counter <= 0)
+                    return;
+                *counter = -1;
+                Json::Value json{};
+                json["code"] = 1;
+                json["message"] = e.base().what();
+                auto resp = HttpResponse::newHttpJsonResponse(std::move(json));
                 (*callbackPtr)(resp);
                 (*callbackPtr)(resp);
             };
             };
     }
     }

+ 9 - 9
frameworks/C++/drogon/drogon_benchmark/controllers/UpdatesCtrl.cc

@@ -53,21 +53,21 @@ void UpdatesCtrl::asyncHandleHttpRequest(
                         if ((*counter) == 0)
                         if ((*counter) == 0)
                         {
                         {
                             (*callbackPtr)(
                             (*callbackPtr)(
-                                HttpResponse::newHttpJsonResponse(*json));
+                                HttpResponse::newHttpJsonResponse(std::move(*json)));
                         }
                         }
                     },
                     },
                     [callbackPtr](const DrogonDbException &e) {
                     [callbackPtr](const DrogonDbException &e) {
-                        Json::Value ret;
-                        ret["result"] = "error!";
-                        auto resp = HttpResponse::newHttpJsonResponse(ret);
-                        (*callbackPtr)(resp);
+                        Json::Value json{};
+                        json["code"] = 1;
+                        json["message"] = e.base().what();
+                        (*callbackPtr)(HttpResponse::newHttpJsonResponse(std::move(json)));
                     });
                     });
             },
             },
             [callbackPtr](const DrogonDbException &e) {
             [callbackPtr](const DrogonDbException &e) {
-                Json::Value ret;
-                ret["result"] = "error!";
-                auto resp = HttpResponse::newHttpJsonResponse(ret);
-                (*callbackPtr)(resp);
+                Json::Value json{};
+                json["code"] = 1;
+                json["message"] = e.base().what();
+                (*callbackPtr)(HttpResponse::newHttpJsonResponse(std::move(json)));
             });
             });
     }
     }
 }
 }

+ 39 - 32
frameworks/C++/drogon/drogon_benchmark/controllers/UpdatesCtrlRaw.cc

@@ -1,7 +1,11 @@
 #include "UpdatesCtrlRaw.h"
 #include "UpdatesCtrlRaw.h"
+#include "models/World.h"
+#include <stdlib.h>
+
+using namespace drogon_model::hello_world;
 using namespace drogon::orm;
 using namespace drogon::orm;
 const void update(
 const void update(
-    const std::shared_ptr<std::vector<Result>> &results,
+    const std::shared_ptr<std::vector<World>> &results,
     const std::shared_ptr<std::function<void(const HttpResponsePtr &)>>
     const std::shared_ptr<std::function<void(const HttpResponsePtr &)>>
         &callbackPtr,
         &callbackPtr,
     const DbClientPtr &client)
     const DbClientPtr &client)
@@ -30,38 +34,30 @@ const void update(
     sql[sql.length() - 1] = ')';
     sql[sql.length() - 1] = ')';
 
 
     auto sqlBinder = *client << std::move(sql);
     auto sqlBinder = *client << std::move(sql);
-
-    std::string jsonStr;
-    jsonStr.reserve(size * 36);
-    jsonStr.append("[", 1);
-    for (auto const &r : *results)
+    Json::Value json;
+    json.resize(0);
+    for (auto const &w : *results)
     {
     {
         auto randId = rand() % 10000 + 1;
         auto randId = rand() % 10000 + 1;
-        auto id = r[0]["id"].as<int>();
-        sqlBinder << id;
+        sqlBinder << w.getValueOfId();
         sqlBinder << randId;
         sqlBinder << randId;
-        char json[64];
-        auto size =
-            sprintf(json, "{\"id\":%d,\"randomnumber\":%d}", id, randId);
-        jsonStr.append(json, size);
-        jsonStr.append(",", 1);
+        Json::Value world;
+        world["id"] = w.getValueOfId();
+        world["randomnumber"] = randId;
+        json.append(std::move(world));
     }
     }
-    jsonStr[jsonStr.length() - 1] = ']';
-    for (auto const &r : *results)
+    for (auto const &w : *results)
     {
     {
-        sqlBinder << r[0]["id"].as<int>();
+        sqlBinder << w.getValueOfId();
     }
     }
 
 
-    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);
+    sqlBinder >> [callbackPtr, json = std::move(json)](const Result &r) mutable {
+        (*callbackPtr)(HttpResponse::newHttpJsonResponse(std::move(json)));
     } >> [callbackPtr](const DrogonDbException &e) {
     } >> [callbackPtr](const DrogonDbException &e) {
-        Json::Value ret;
-        ret["result"] = "error!";
-        auto resp = HttpResponse::newHttpJsonResponse(ret);
+        Json::Value json{};
+        json["code"] = 1;
+        json["message"] = e.base().what();
+        auto resp = HttpResponse::newHttpJsonResponse(std::move(json));
         (*callbackPtr)(resp);
         (*callbackPtr)(resp);
     };
     };
 }
 }
@@ -85,7 +81,7 @@ void UpdatesCtrlRaw::asyncHandleHttpRequest(
     auto callbackPtr =
     auto callbackPtr =
         std::make_shared<std::function<void(const HttpResponsePtr &)>>(
         std::make_shared<std::function<void(const HttpResponsePtr &)>>(
             std::move(callback));
             std::move(callback));
-    auto resultSetPtr = std::make_shared<std::vector<Result>>();
+    auto resultSetPtr = std::make_shared<std::vector<World>>();
     resultSetPtr->reserve(queries);
     resultSetPtr->reserve(queries);
     if (!*_dbClient)
     if (!*_dbClient)
     {
     {
@@ -97,16 +93,27 @@ void UpdatesCtrlRaw::asyncHandleHttpRequest(
         **_dbClient << "select * from world where id=$1" << id >>
         **_dbClient << "select * from world where id=$1" << id >>
             [callbackPtr, resultSetPtr, &client = *_dbClient, queries](
             [callbackPtr, resultSetPtr, &client = *_dbClient, queries](
                 const Result &r) mutable {
                 const Result &r) mutable {
-                resultSetPtr->push_back(r);
-                if (resultSetPtr->size() == queries)
+                if (r.size() == 1)
+                {
+                    resultSetPtr->emplace_back(World(r[0]));
+                    if (resultSetPtr->size() == queries)
+                    {
+                        update(resultSetPtr, callbackPtr, client);
+                    }
+                }
+                else
                 {
                 {
-                    update(resultSetPtr, callbackPtr, client);
+                    Json::Value json{};
+                    json["code"] = 0;
+                    json["message"] = "Internal error";
+                    (*callbackPtr)(HttpResponse::newHttpJsonResponse(std::move(json)));
                 }
                 }
             } >>
             } >>
             [callbackPtr](const DrogonDbException &e) {
             [callbackPtr](const DrogonDbException &e) {
-                Json::Value ret;
-                ret["result"] = "error!";
-                auto resp = HttpResponse::newHttpJsonResponse(ret);
+                Json::Value json{};
+                json["code"] = 1;
+                json["message"] = e.base().what();
+                auto resp = HttpResponse::newHttpJsonResponse(std::move(json));
                 (*callbackPtr)(resp);
                 (*callbackPtr)(resp);
             };
             };
     }
     }

+ 7 - 4
frameworks/C++/drogon/drogon_benchmark/views/fortune_raw.csp

@@ -1,11 +1,14 @@
+<%inc
+#include "controllers/FortuneCtrlRaw.h"
+%>
 <%c++
 <%c++
-auto &rows=@@.get<std::vector<std::pair<string_view,string_view>>>("rows");
+auto &rows=@@.get<std::vector<Fortune>>("rows");
 %>
 %>
 <!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>
 <!DOCTYPE html><html><head><title>Fortunes</title></head><body><table><tr><th>id</th><th>message</th></tr>
 <%c++for(auto const &row:rows){%>
 <%c++for(auto const &row:rows){%>
-<tr><td>{%row.first%}</td><td><%c++ if(HttpViewData::needTranslation(row.second))
-                                         $$<<HttpViewData::htmlTranslate(row.second);
+<tr><td>{%row.id_%}</td><td><%c++ if(HttpViewData::needTranslation(row.message_))
+                                         $$<<HttpViewData::htmlTranslate(row.message_);
                                     else
                                     else
-                                         $$<<row.second;%></td></tr>
+                                         $$<<row.message_;%></td></tr>
 <%c++}%>
 <%c++}%>
 </table></body></html>
 </table></body></html>