Browse Source

Update drogon (#5030)

An Tao 6 years ago
parent
commit
d60f252082

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

@@ -44,7 +44,7 @@ RUN git clone https://github.com/an-tao/drogon
 
 WORKDIR $DROGON_ROOT
 
-RUN git checkout ba49a0e0e623aa0d0bbfe669e34127850ade0b24
+RUN git checkout aa26e9a90388b6a6fe5356e2d12b6f6091c82818
 RUN git submodule update --init
 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
 
-RUN git checkout ba49a0e0e623aa0d0bbfe669e34127850ade0b24
+RUN git checkout aa26e9a90388b6a6fe5356e2d12b6f6091c82818
 RUN git submodule update --init
 RUN mkdir build
 

+ 42 - 25
frameworks/C++/drogon/drogon_benchmark/CMakeLists.txt

@@ -1,33 +1,50 @@
-cmake_minimum_required(VERSION 3.2)
-Project(drogon_benchmark)
+cmake_minimum_required(VERSION 3.5)
+project(drogon_benchmark)
 
 set(CMAKE_CXX_STANDARD 17)
+set(BENCHMARK_SOURCES
+    main.cc
+    controllers/DbCtrl.cc
+    controllers/DbCtrlRaw.cc
+    controllers/FortuneCtrl.cc
+    controllers/FortuneCtrlRaw.cc
+    controllers/QueriesCtrl.cc
+    controllers/QueriesCtrlRaw.cc
+    controllers/UpdatesCtrl.cc
+    controllers/UpdatesCtrlRaw.cc
+    models/Fortune.cc
+    models/World.cc
+    plugins/SyncPlugin.cc)
 
-find_package(Drogon REQUIRED)
-link_libraries(${DROGON_LIBRARIES})
-include_directories(${DROGON_INCLUDE_DIRS})
-
-AUX_SOURCE_DIRECTORY(./ SRC_DIR)
-AUX_SOURCE_DIRECTORY(controllers CTL_SRC)
-AUX_SOURCE_DIRECTORY(filters FILTER_SRC)
-AUX_SOURCE_DIRECTORY(models MODEL_SRC)
-
-FILE(GLOB SCP_LIST ${CMAKE_CURRENT_SOURCE_DIR}/views/*.csp)
+file(GLOB SCP_LIST ${CMAKE_CURRENT_SOURCE_DIR}/views/*.csp)
 foreach(cspFile ${SCP_LIST})
-    message(STATUS "cspFile:" ${cspFile})
-    EXEC_PROGRAM(basename ARGS "${cspFile} .csp" OUTPUT_VARIABLE classname)
-    message(STATUS "view classname:" ${classname})
-    add_custom_command(OUTPUT ${classname}.h ${classname}.cc
-            COMMAND drogon_ctl
-            ARGS create view ${cspFile}
-            DEPENDS ${cspFile}
-            VERBATIM )
-    set(VIEWSRC ${VIEWSRC} ${classname}.cc)
+  message(STATUS "cspFile:" ${cspFile})
+  exec_program(basename
+               ARGS
+               "${cspFile} .csp"
+               OUTPUT_VARIABLE
+               classname)
+  message(STATUS "view classname:" ${classname})
+  add_custom_command(OUTPUT ${classname}.h ${classname}.cc
+                     COMMAND drogon_ctl
+                             ARGS
+                             create
+                             view
+                             ${cspFile}
+                     DEPENDS ${cspFile}
+                     VERBATIM)
+  set(BENCHMARK_SOURCES ${BENCHMARK_SOURCES} ${classname}.cc)
 endforeach()
 
-include_directories(${CMAKE_CURRENT_SOURCE_DIR})
-add_executable(drogon_benchmark ${SRC_DIR} ${CTL_SRC} ${FILTER_SRC} ${VIEWSRC} ${MODEL_SRC})
+add_executable(${PROJECT_NAME} ${BENCHMARK_SOURCES})
+find_package(Drogon REQUIRED)
+target_link_libraries(${PROJECT_NAME} PRIVATE Drogon::Drogon)
+
+target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
 
 add_custom_command(TARGET drogon_benchmark POST_BUILD
-                   COMMAND ${CMAKE_COMMAND} -E copy_if_different
-                   ${CMAKE_SOURCE_DIR}/*.json $<TARGET_FILE_DIR:drogon_benchmark>)
+                   COMMAND ${CMAKE_COMMAND}
+                           -E
+                           copy_if_different
+                           ${CMAKE_SOURCE_DIR}/*.json
+                           $<TARGET_FILE_DIR:drogon_benchmark>)

+ 18 - 20
frameworks/C++/drogon/drogon_benchmark/config.json

@@ -103,21 +103,21 @@
         "static_files_cache_time": 5,
         //simple_controllers_map:Configuring mapping from path to simple controller
         "simple_controllers_map": [
-            {
-                "path": "/plaintext",
-                "controller": "PlaintextCtrl",
-                "http_methods": [
-                    "get"
-                ]
-            },
-            {
-                "path": "/json",
-                "controller": "JsonCtrl",
-                "http_methods": [
-                    "get"
-                ],
-                "filters": []
-            },
+            // {
+            //     "path": "/plaintext",
+            //     "controller": "PlaintextCtrl",
+            //     "http_methods": [
+            //         "get"
+            //     ]
+            // },
+            // {
+            //     "path": "/json",
+            //     "controller": "JsonCtrl",
+            //     "http_methods": [
+            //         "get"
+            //     ],
+            //     "filters": []
+            // },
             {
                 "path": "/db",
                 "controller": "DbCtrl",
@@ -176,15 +176,13 @@
     //plugins: Define all plugins running in the application
     "plugins": [{
         //name: The class name of the plugin
-        //"name": "TestPlugin",
+        "name": "SyncPlugin",
         //dependencies: Plugins that the plugin depends on. It can be commented out
         "dependencies": [],
         //config: The configuration of the plugin. This json object is the parameter to initialize the plugin.
         //It can be commented out
-        "config": {
-            "heartbeat_interval": 2
-        }
+        "config": {}
     }],
     //custom_config: custom configuration for users. This object can be get by the app().getCustomConfig() method. 
     "custom_config": {}
-}
+}

+ 51 - 0
frameworks/C++/drogon/drogon_benchmark/plugins/SyncPlugin.cc

@@ -0,0 +1,51 @@
+/**
+ *
+ *  SyncPlugin.cc
+ *
+ */
+
+#include "SyncPlugin.h"
+#include <drogon/drogon.h>
+
+using namespace drogon;
+
+void SyncPlugin::initAndStart(const Json::Value &config)
+{
+    /// Initialize and start the plugin
+    drogon::app().registerSyncAdvice(
+        [](const HttpRequestPtr &req) -> HttpResponsePtr {
+            if (req->method() != Get)
+            {
+                return HttpResponsePtr{};
+            }
+            switch (req->path().length())
+            {
+                case 5:
+                    if (req->path() == "/json")
+                    {
+                        Json::Value ret;
+                        ret["message"] = "Hello, World!";
+                        return HttpResponse::newHttpJsonResponse(ret);
+                    }
+                    break;
+                case 10:
+                    if (req->path() == "/plaintext")
+                    {
+                        auto resp = HttpResponse::newHttpResponse();
+                        resp->setBody("Hello, World!");
+                        resp->setContentTypeCodeAndCustomString(
+                            CT_TEXT_PLAIN, "Content-Type: text/plain\r\n");
+                        return resp;
+                    }
+                    break;
+                default:
+                    break;
+            }
+            return HttpResponsePtr{};
+        });
+}
+
+void SyncPlugin::shutdown()
+{
+    /// Shutdown the plugin
+}

+ 24 - 0
frameworks/C++/drogon/drogon_benchmark/plugins/SyncPlugin.h

@@ -0,0 +1,24 @@
+/**
+ *
+ *  SyncPlugin.h
+ *
+ */
+
+#pragma once
+
+#include <drogon/plugins/Plugin.h>
+
+
+class SyncPlugin : public drogon::Plugin<SyncPlugin>
+{
+  public:
+    SyncPlugin() {}
+    /// This method must be called by drogon to initialize and start the plugin.
+    /// It must be implemented by the user.
+    virtual void initAndStart(const Json::Value &config) override;
+
+    /// This method must be called by drogon to shutdown the plugin.
+    /// It must be implemented by the user.
+    virtual void shutdown() override;
+};
+

+ 2 - 9
frameworks/C++/drogon/drogon_benchmark/views/fortune.csp

@@ -5,18 +5,11 @@ using namespace drogon_model::hello_world;
 <%c++
 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){%>
 <tr><td>{%row.getValueOfId()%}</td><td><%c++ if(HttpViewData::needTranslation(row.getValueOfMessage()))
                                          $$<<HttpViewData::htmlTranslate(row.getValueOfMessage());
                                     else
                                          $$<<row.getValueOfMessage();%></td></tr>
 <%c++}%>
-</table>
-</body>
-</html>
+</table></body></html>

+ 2 - 9
frameworks/C++/drogon/drogon_benchmark/views/fortune_raw.csp

@@ -1,18 +1,11 @@
 <%c++
 auto &rows=@@.get<std::vector<std::pair<string_view,string_view>>>("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){%>
 <tr><td>{%row.first%}</td><td><%c++ if(HttpViewData::needTranslation(row.second))
                                          $$<<HttpViewData::htmlTranslate(row.second);
                                     else
                                          $$<<row.second;%></td></tr>
 <%c++}%>
-</table>
-</body>
-</html>
+</table></body></html>