Browse Source

Merge branch 'TechEmpower:master' into master

Jeremy Kuhn 1 year ago
parent
commit
4d4e53a8be
100 changed files with 2347 additions and 394 deletions
  1. 7 7
      frameworks/C++/drogon/drogon-core.dockerfile
  2. 7 7
      frameworks/C++/drogon/drogon.dockerfile
  3. 2 2
      frameworks/C++/drogon/drogon_benchmark/controllers/FortuneCtrlRaw.cc
  4. 4 3
      frameworks/C++/drogon/drogon_benchmark/controllers/FortuneCtrlRaw.h
  5. 1 1
      frameworks/C++/drogon/drogon_benchmark/controllers/UpdatesCtrlRaw.cc
  6. 40 0
      frameworks/C++/paozhu/README.md
  7. 31 0
      frameworks/C++/paozhu/benchmark_config.json
  8. 22 0
      frameworks/C++/paozhu/config.toml
  9. 41 0
      frameworks/C++/paozhu/paozhu.dockerfile
  10. 508 0
      frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt
  11. 51 0
      frameworks/C++/paozhu/paozhu_benchmark/common/autocontrolmethod.hpp
  12. 32 0
      frameworks/C++/paozhu/paozhu_benchmark/common/json_reflect_headers.h
  13. 16 0
      frameworks/C++/paozhu/paozhu_benchmark/common/reghttpmethod.hpp
  14. 20 0
      frameworks/C++/paozhu/paozhu_benchmark/common/reghttpmethod_pre.hpp
  15. 20 0
      frameworks/C++/paozhu/paozhu_benchmark/conf/orm.conf
  16. 42 0
      frameworks/C++/paozhu/paozhu_benchmark/conf/server.conf
  17. 19 0
      frameworks/C++/paozhu/paozhu_benchmark/controller/include/techempower.h
  18. 241 0
      frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp
  19. 15 0
      frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json.h
  20. 290 0
      frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp
  21. 3 3
      frameworks/C/h2o/h2o.dockerfile
  22. 5 5
      frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj
  23. 1 2
      frameworks/FSharp/giraffe/README.md
  24. 1 1
      frameworks/FSharp/giraffe/giraffe-newtonsoft.dockerfile
  25. 1 1
      frameworks/FSharp/giraffe/giraffe.dockerfile
  26. 4 4
      frameworks/FSharp/giraffe/src/App/App.fsproj
  27. 3 3
      frameworks/FSharp/zebra/src/App/App.fsproj
  28. 1 1
      frameworks/FSharp/zebra/zebra-simple.dockerfile
  29. 1 1
      frameworks/FSharp/zebra/zebra.dockerfile
  30. 3 3
      frameworks/Go/aah/src/benchmark/go.mod
  31. 6 6
      frameworks/Go/aah/src/benchmark/go.sum
  32. 3 3
      frameworks/Go/echo/src/go.mod
  33. 6 6
      frameworks/Go/echo/src/go.sum
  34. 3 3
      frameworks/Go/gin/gin-gorm/go.mod
  35. 6 6
      frameworks/Go/gin/gin-gorm/go.sum
  36. 3 3
      frameworks/Go/gin/gin-src/go.mod
  37. 6 6
      frameworks/Go/gin/gin-src/go.sum
  38. 3 3
      frameworks/Go/gin/gin-std/go.mod
  39. 6 6
      frameworks/Go/gin/gin-std/go.sum
  40. 3 3
      frameworks/Go/goframe/src/go.mod
  41. 6 6
      frameworks/Go/goframe/src/go.sum
  42. 1 1
      frameworks/Go/kami/src/go.mod
  43. 2 2
      frameworks/Go/kami/src/go.sum
  44. 2 2
      frameworks/Go/ronykit/src/go.mod
  45. 5 5
      frameworks/Go/ronykit/src/go.sum
  46. 1 1
      frameworks/Java/light-java/pom.xml
  47. 9 0
      frameworks/Java/today/.gitignore
  48. 26 0
      frameworks/Java/today/README.md
  49. 30 0
      frameworks/Java/today/benchmark_config.json
  50. 63 0
      frameworks/Java/today/build.gradle
  51. 20 0
      frameworks/Java/today/config.toml
  52. 7 0
      frameworks/Java/today/gradle.properties
  53. 15 0
      frameworks/Java/today/settings.gradle
  54. 70 0
      frameworks/Java/today/src/main/java/cn/taketoday/benchmark/AppConfig.java
  55. 13 0
      frameworks/Java/today/src/main/java/cn/taketoday/benchmark/BenchmarkApplication.java
  56. 120 0
      frameworks/Java/today/src/main/java/cn/taketoday/benchmark/http/BenchmarkHttpHandler.java
  57. 54 0
      frameworks/Java/today/src/main/java/cn/taketoday/benchmark/model/Fortune.java
  58. 55 0
      frameworks/Java/today/src/main/java/cn/taketoday/benchmark/model/World.java
  59. 9 0
      frameworks/Java/today/src/main/resources/application-dev.yaml
  60. 14 0
      frameworks/Java/today/src/main/resources/application-test.yaml
  61. 41 0
      frameworks/Java/today/src/main/resources/application.yaml
  62. 21 0
      frameworks/Java/today/src/main/resources/templates/fortunes.ftl
  63. 11 0
      frameworks/Java/today/today.dockerfile
  64. 1 1
      frameworks/Java/undertow-jersey/pom.xml
  65. 1 1
      frameworks/Java/undertow/pom.xml
  66. 1 1
      frameworks/JavaScript/express/package.json
  67. 1 1
      frameworks/JavaScript/fastify/package.json
  68. 1 1
      frameworks/JavaScript/hapi/package.json
  69. 7 7
      frameworks/JavaScript/hono/package-lock.json
  70. 1 1
      frameworks/JavaScript/hono/package.json
  71. 1 1
      frameworks/JavaScript/koa/package.json
  72. 1 1
      frameworks/JavaScript/nodejs/package.json
  73. 1 1
      frameworks/JavaScript/sailsjs/package.json
  74. 31 55
      frameworks/JavaScript/spliffy/package-lock.json
  75. 1 1
      frameworks/JavaScript/spliffy/package.json
  76. 2 1
      frameworks/PHP/php/php-h2o.dockerfile
  77. 2 2
      frameworks/Pascal/mormot/setup_and_build.sh
  78. 13 8
      frameworks/Pascal/mormot/src/raw.pas
  79. 1 1
      frameworks/Python/aiohttp/requirements.txt
  80. 2 2
      frameworks/Python/api_hour/requirements.txt
  81. 1 1
      frameworks/Python/blacksheep/requirements-gunicorn.txt
  82. 1 1
      frameworks/Python/bottle/requirements.txt
  83. 1 1
      frameworks/Python/eve/requirements.txt
  84. 1 1
      frameworks/Python/heaven/requirements.txt
  85. 1 1
      frameworks/Python/morepath/requirements.txt
  86. 1 1
      frameworks/Python/panther/requirements.txt
  87. 3 1
      frameworks/Python/pyramid/requirements.txt
  88. 1 1
      frameworks/Python/quart/requirements-uvicorn.txt
  89. 1 1
      frameworks/Python/responder/requirements.txt
  90. 1 1
      frameworks/Python/routerling/requirements.txt
  91. 1 1
      frameworks/Python/turbogears/requirements.txt
  92. 1 1
      frameworks/Python/uvicorn/requirements.txt
  93. 1 1
      frameworks/Python/web2py/requirements.txt
  94. 1 1
      frameworks/Python/weppy/requirements.txt
  95. 1 1
      frameworks/Python/wsgi/requirements.txt
  96. 2 1
      frameworks/Ruby/h2o_mruby/h2o_mruby.dockerfile
  97. 2 2
      frameworks/Rust/axum/Cargo.lock
  98. 180 178
      frameworks/Rust/ohkami/Cargo.lock
  99. 5 5
      frameworks/Rust/ohkami/Cargo.toml
  100. 1 1
      frameworks/Rust/ohkami/README.md

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

@@ -1,4 +1,4 @@
-FROM ubuntu:20.04
+FROM ubuntu:22.04
 
 COPY ./ ./
 
@@ -11,7 +11,7 @@ RUN  apt-get update -yqq && \
      zlib1g-dev && \
      add-apt-repository ppa:ubuntu-toolchain-r/test -y && \
 	 apt-get update -yqq && \
-	 apt-get install -yqq gcc-10 g++-10
+	 apt-get install -yqq gcc g++
 
 RUN locale-gen en_US.UTF-8
 
@@ -19,10 +19,10 @@ ENV LANG en_US.UTF-8
 ENV LANGUAGE en_US:en
 ENV LC_ALL en_US.UTF-8
 
-ENV CC=gcc-10
-ENV CXX=g++-10
-ENV AR=gcc-ar-10
-ENV RANLIB=gcc-ranlib-10
+ENV CC=gcc
+ENV CXX=g++
+ENV AR=gcc-ar
+ENV RANLIB=gcc-ranlib
 
 ENV IROOT=/install
 ENV DROGON_ROOT=$IROOT/drogon
@@ -41,7 +41,7 @@ RUN git clone https://github.com/an-tao/drogon
 
 WORKDIR $DROGON_ROOT
 
-RUN git checkout ebf87d69d7bb45dfa478ba364ef9374d9be25092
+RUN git checkout 96919df488e0ebaa0ed304bbd76bba33508df3cc 
 RUN git submodule update --init
 RUN mkdir build
 

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

@@ -1,4 +1,4 @@
-FROM ubuntu:20.04
+FROM ubuntu:22.04
 
 COPY ./ ./
 
@@ -11,7 +11,7 @@ RUN  apt-get update -yqq && \
      zlib1g-dev && \
      add-apt-repository ppa:ubuntu-toolchain-r/test -y && \
 	 apt-get update -yqq && \
-	 apt-get install -yqq gcc-10 g++-10
+	 apt-get install -yqq gcc g++
 
 RUN locale-gen en_US.UTF-8
 
@@ -19,10 +19,10 @@ ENV LANG en_US.UTF-8
 ENV LANGUAGE en_US:en
 ENV LC_ALL en_US.UTF-8
 
-ENV CC=gcc-10
-ENV CXX=g++-10
-ENV AR=gcc-ar-10
-ENV RANLIB=gcc-ranlib-10
+ENV CC=gcc
+ENV CXX=g++
+ENV AR=gcc-ar
+ENV RANLIB=gcc-ranlib
 
 ENV IROOT=/install
 ENV DROGON_ROOT=$IROOT/drogon
@@ -41,7 +41,7 @@ RUN git clone https://github.com/an-tao/drogon
 
 WORKDIR $DROGON_ROOT
 
-RUN git checkout ebf87d69d7bb45dfa478ba364ef9374d9be25092
+RUN git checkout 96919df488e0ebaa0ed304bbd76bba33508df3cc 
 RUN git submodule update --init
 RUN mkdir build
 

+ 2 - 2
frameworks/C++/drogon/drogon_benchmark/controllers/FortuneCtrlRaw.cc

@@ -22,8 +22,8 @@ void FortuneCtrlRaw::asyncHandleHttpRequest(
         rows.reserve(r.size() + 1);
         for (auto const &row : r)
         {
-            rows.emplace_back(row[0ul].as<string_view>(),   // id
-                              row[1ul].as<string_view>());  // message
+            rows.emplace_back(row[0ul].as<std::string_view>(),   // id
+                              row[1ul].as<std::string_view>());  // message
         }
         rows.emplace_back("0", "Additional fortune added at request time.");
         std::sort(rows.begin(),

+ 4 - 3
frameworks/C++/drogon/drogon_benchmark/controllers/FortuneCtrlRaw.h

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

+ 1 - 1
frameworks/C++/drogon/drogon_benchmark/controllers/UpdatesCtrlRaw.cc

@@ -43,7 +43,7 @@ void UpdatesCtrlRaw::update(
     const DbClientPtr &client)
 {
     auto const &sql = getSQL(results->size());
-    auto sqlBinder = *client << string_view(sql.data(), sql.length());
+    auto sqlBinder = *client << std::string_view(sql.data(), sql.length());
     Json::Value json;
     json.resize(0);
     for (auto const &w : *results)

+ 40 - 0
frameworks/C++/paozhu/README.md

@@ -0,0 +1,40 @@
+# paozhu Benchmarking Test
+
+This is the [Paozhu](https://github.com/hggq/paozhu) 
+
+This Benchmarking Test code from https://github.com/hggq/paozhu/releases/tag/v1.5.8
+
+### Test Type Implementation Source Code
+
+* [Benchmark code](controller/src/techempower.cpp)
+* [ORM config](conf/orm.conf) 
+* [Server config](conf/server.conf) 
+
+## Test URLs
+### JSON
+
+http://localhost:8888/json
+
+### PLAINTEXT
+
+http://localhost:8888/plaintext
+
+
+### Single Database Query
+
+http://localhost:8888/db
+
+### Fortune
+
+http://localhost:8888/fortunes
+
+### Multiple Database Queries
+
+http://localhost:8888/queries?queries=10
+
+### Database Updates
+
+http://localhost:8888/updates?queries=10
+
+### Cache
+http://localhost:8888/cached-queries?count=20

+ 31 - 0
frameworks/C++/paozhu/benchmark_config.json

@@ -0,0 +1,31 @@
+{
+  "framework": "paozhu",
+  "tests": [
+    {
+      "default": {
+        "json_url": "/json",
+        "plaintext_url": "/plaintext",
+        "db_url": "/db",
+        "fortune_url": "/fortunes",
+        "query_url": "/queries?queries=",
+        "update_url": "/updates?queries=",
+        "cached_query_url": "/cached-queries?count=",
+        "port": 8888,
+        "approach": "Realistic",
+        "classification": "Fullstack",
+        "database": "MySQL",
+        "framework": "paozhu",
+        "language": "C++",
+        "flavor": "None",
+        "orm": "Micro",
+        "platform": "None",
+        "webserver": "None",
+        "os": "Linux",
+        "database_os": "Linux",
+        "display_name": "paozhu",
+        "notes": "",
+        "versus": "None"
+      }
+    }
+  ]
+}

+ 22 - 0
frameworks/C++/paozhu/config.toml

@@ -0,0 +1,22 @@
+[framework]
+name = "paozhu"
+authors = ["Huang ziquan <[email protected]>"]
+github = "https://github.com/hggq/paozhu"
+
+[main]
+urls.plaintext = "/plaintext"
+urls.json = "/json"
+urls.db = "/db"
+urls.query = "/queries?queries="
+urls.update = "/updates?queries="
+urls.fortune = "/fortunes"
+urls.cached_query = "/cached-queries?count="
+approach = "Realistic"
+classification = "Fullstack"
+database = "MySQL"
+database_os = "Linux"
+os = "Linux"
+orm = "Micro"
+platform = "None"
+webserver = "None"
+versus = "None"

+ 41 - 0
frameworks/C++/paozhu/paozhu.dockerfile

@@ -0,0 +1,41 @@
+FROM ubuntu:22.04
+RUN apt-get update -yqq && apt-get install -yqq apt-utils software-properties-common wget unzip cmake git
+RUN apt-get install -yqq gcc g++ openssl libssl-dev zlib1g-dev build-essential locales
+
+RUN apt-get -y install brotli libbrotli-dev 
+RUN apt-get -y install libreadline-dev 
+RUN apt-get -y install mysql-client
+RUN apt-get -y install libmysqlclient-dev
+
+RUN locale-gen en_US.UTF-8
+ENV LANG en_US.UTF-8
+ENV LANGUAGE en_US:en
+ENV LC_ALL en_US.UTF-8
+
+COPY ./ ./
+WORKDIR /
+
+# RUN wget https://github.com/hggq/paozhu/releases/download/v1.5.8/benchmark.zip
+RUN git clone https://github.com/hggq/paozhu
+# RUN unzip benchmark.zip
+RUN rm -Rf ./paozhu/controller
+ 
+COPY ./paozhu_benchmark/controller ./paozhu/
+COPY ./paozhu_benchmark/common/autocontrolmethod.hpp ./paozhu/common/
+COPY ./paozhu_benchmark/common/reghttpmethod_pre.hpp ./paozhu/common/
+COPY ./paozhu_benchmark/common/reghttpmethod.hpp ./paozhu/common/
+
+COPY ./paozhu_benchmark/conf/server.conf ./paozhu/conf/server.conf
+COPY ./paozhu_benchmark/conf/orm.conf ./paozhu/conf/orm.conf
+COPY ./paozhu_benchmark/CMakeLists.txt ./paozhu/CMakeLists.txt
+
+WORKDIR /paozhu
+RUN unzip asio.zip
+
+RUN cmake . -B build -DCMAKE_BUILD_TYPE=Release 
+RUN cmake --build build
+
+
+EXPOSE 8888
+
+CMD ./bin/paozhu 

+ 508 - 0
frameworks/C++/paozhu/paozhu_benchmark/CMakeLists.txt

@@ -0,0 +1,508 @@
+CMAKE_MINIMUM_REQUIRED(VERSION 3.20)
+
+cmake_policy(SET CMP0048 NEW)
+
+set(ENABLE_VCPKG OFF CACHE BOOL "choose ON to enable")
+set(ENABLE_BOOST OFF CACHE BOOL "choose ON to enable")
+set(ENABLE_GD OFF CACHE BOOL "choose ON to enable")
+set(ENABLE_WIN_VCPKG OFF CACHE BOOL "choose ON to enable")
+
+if (ENABLE_GD STREQUAL "ON")
+    list(FIND VCPKG_MANIFEST_FEATURES "gd" index)
+    if (index EQUAL -1)
+        message(STATUS "Auto append features: gd")
+        list(APPEND VCPKG_MANIFEST_FEATURES "gd")
+    endif ()
+endif ()
+
+if (ENABLE_BOOST STREQUAL "ON")
+    list(FIND VCPKG_MANIFEST_FEATURES "boost" index)
+    if (index EQUAL -1)
+        message(STATUS "Auto append features: boost")
+        list(APPEND VCPKG_MANIFEST_FEATURES "boost")
+    endif ()
+endif ()
+
+PROJECT(Paozhu_web_framework)
+set(CMAKE_CXX_STANDARD 20)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+
+set(mode "CMAKE_BUILD_TYPE")
+
+set(BOOST_OPEN "  ")
+set(GD_OPEN " ")
+
+if(ENABLE_BOOST STREQUAL "ON")
+  message("ENABLE_BOOST")
+  set(BOOST_OPEN " -DENABLE_BOOST ")
+endif()
+
+if(ENABLE_GD STREQUAL "ON")
+    message("ENABLE_GD")
+    set(GD_OPEN " -DENABLE_GD ")
+endif()
+
+set(sys_so_path "/usr/lib64")
+
+if (IS_DIRECTORY "/usr/lib/x86_64-linux-gnu")
+  set(sys_so_path "/usr/lib/x86_64-linux-gnu")
+endif()
+
+if (CMAKE_SYSTEM_NAME MATCHES "Windows")
+  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_WIN32_WINNT=0x0601")
+endif()
+
+if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /utf-8 /EHsc")
+endif ()
+
+if(${mode} AND (CMAKE_BUILD_TYPE STREQUAL "Debug"))
+
+    if(CMAKE_SYSTEM_NAME MATCHES "Windows")
+        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DASIO_STANDALONE -DDEBUG ${BOOST_OPEN} ${GD_OPEN}")
+        if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
+            set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /fsanitize=address")
+        elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+            set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pthread -g")
+        endif ()
+    else()
+        set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -Wextra")
+        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pthread -g -fsanitize=address -DASIO_STANDALONE -DDEBUG ${BOOST_OPEN} ${GD_OPEN} -I/usr/local/include -I/usr/local/mysql/include   -I/usr/include -I/usr/include/mysql " )
+    endif ()
+    message("Debug mode:${CMAKE_CXX_FLAGS_DEBUG}")
+
+elseif(${mode} AND (CMAKE_BUILD_TYPE STREQUAL "Release"))
+
+    if (CMAKE_SYSTEM_NAME MATCHES "Windows")
+        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DASIO_STANDALONE ${BOOST_OPEN} ${GD_OPEN} -O3")
+        if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+            set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pthread")
+        endif ()
+    else ()
+        set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -Wall -Wextra -O3")
+        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread  -DASIO_STANDALONE ${BOOST_OPEN} ${GD_OPEN}  -I/usr/local/include -I/usr/local/mysql/include -I/usr/include -I/usr/include/mysql  " )
+        file(MAKE_DIRECTORY /usr/local/etc/paozhu)
+        file(COPY ${CMAKE_CURRENT_SOURCE_DIR}/conf/ DESTINATION /usr/local/etc/paozhu/)
+    endif ()
+    message("Release mode:${CMAKE_CXX_FLAGS_RELEASE}")
+
+else()
+    set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -Wextra")
+    message("Debug mode:${CMAKE_CXX_FLAGS_DEBUG}")
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pthread  -g -fsanitize=address  -DASIO_STANDALONE -DDEBUG ${BOOST_OPEN} ${GD_OPEN} -I/usr/local/include -I/usr/local/mysql/include   -I/usr/include  -I/usr/include/mysql  " )
+
+    if(NOT CMAKE_SYSTEM_NAME MATCHES "Windows")
+        set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address")
+    endif ()
+endif()
+
+
+
+file(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/temp)
+file(MAKE_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/log)
+set(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/bin)
+set(USE_STANDALONE_ASIO ON)
+set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
+
+message(STATUS "SOURCE dir ${CMAKE_CURRENT_SOURCE_DIR}")
+
+
+set(CMAKE_BUILD_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/build)
+set(CMAKE_CACHEFILE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/build)
+set(CMAKE_CURRENT_BINARY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/build)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/common)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/controller)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpcli)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/viewsrc/include)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/websockets/include)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include)
+
+if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_empty)
+  file(REMOVE_RECURSE ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_empty)
+endif ()
+#EXECUTE_PROCESS(COMMAND rm ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_empty)
+set(PAOZHU_PRE paozhu_pre)
+add_executable(${PAOZHU_PRE} ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpcli/autopickmethod.cpp ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpserver/src/md5.cpp)
+add_executable(paozhu_empty ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpcli/autoemptymethod.cpp)
+
+
+
+file(GLOB_RECURSE orm_list ${CMAKE_CURRENT_SOURCE_DIR}/orm/*.cpp)
+file(GLOB_RECURSE source_list ${CMAKE_CURRENT_SOURCE_DIR}/models/*.cpp)
+file(GLOB_RECURSE FRAMEWORK_CPP_PATH ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpserver/*.cpp)
+file(GLOB_RECURSE common_list ${CMAKE_CURRENT_SOURCE_DIR}/common/*.cpp)
+file(GLOB_RECURSE controller_list ${CMAKE_CURRENT_SOURCE_DIR}/controller/src/*.cpp)
+file(GLOB_RECURSE viewsrc_list ${CMAKE_CURRENT_SOURCE_DIR}/viewsrc/view/*.cpp)
+file(GLOB_RECURSE reflect_list ${CMAKE_CURRENT_SOURCE_DIR}/libs/*.cpp)
+file(GLOB_RECURSE src_list ${CMAKE_CURRENT_SOURCE_DIR}/src/*.cpp)
+
+foreach(cppfile IN LISTS controller_list)
+  string(REGEX REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/controller/src/" "" cppfilename ${cppfile})
+  string(REGEX REPLACE ".cpp" "" cppbasename ${cppfilename})
+#  message(${cppbasename})
+  if(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/controller/include/${cppbasename}.h")
+  else()
+      file(TOUCH "${CMAKE_CURRENT_SOURCE_DIR}/controller/include/${cppbasename}.h")
+  endif()
+endforeach()
+
+function(include_sub_directories_recursively root_dir)
+    if (IS_DIRECTORY ${root_dir})               # 当前路径是一个目录吗,是的话就加入到包含目录
+        #        if (${root_dir} MATCHES "include")
+        message("include dir: " ${root_dir})
+        include_directories(${root_dir})
+        #        endif()
+    endif()
+
+    file(GLOB ALL_SUB RELATIVE ${root_dir} ${root_dir}/*) # 获得当前目录下的所有文件,让如ALL_SUB列表中
+
+    foreach(sub ${ALL_SUB})
+        if (IS_DIRECTORY ${root_dir}/${sub})
+            include_sub_directories_recursively(${root_dir}/${sub}) # 对子目录递归调用,包含
+        endif()
+    endforeach()
+endfunction()
+
+include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpserver)
+include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/orm)
+include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/models)
+include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/controller/include)
+include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/libs)
+include_sub_directories_recursively(${CMAKE_CURRENT_SOURCE_DIR}/include)
+
+add_executable(paozhu_cli ${CMAKE_CURRENT_SOURCE_DIR}/vendor/httpcli/http_cli.cpp)
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin)
+
+
+if(${mode} AND (CMAKE_BUILD_TYPE STREQUAL "Release"))
+  add_executable(paozhu ${CMAKE_CURRENT_SOURCE_DIR}/test/testbenchmark.cpp ${common_list} ${viewsrc_list} ${FRAMEWORK_CPP_PATH} ${orm_list} ${reflect_list} ${src_list} ${source_list} ${controller_list})
+else()
+  add_executable(paozhu ${CMAKE_CURRENT_SOURCE_DIR}/test/test.cpp ${common_list} ${viewsrc_list} ${FRAMEWORK_CPP_PATH} ${orm_list} ${reflect_list} ${src_list} ${source_list} ${controller_list})
+endif()
+
+if (ENABLE_WIN_VCPKG STREQUAL "ON")
+else ()
+add_custom_command(
+    TARGET paozhu_empty paozhu
+    DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_pre
+    PRE_BUILD
+    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/
+    COMMAND echo "-- controls method --"
+    COMMAND ${PAOZHU_PRE} ${CMAKE_CURRENT_SOURCE_DIR}/
+    COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_CURRENT_SOURCE_DIR}/bin/paozhu_empty
+    )
+endif()
+
+if (ENABLE_VCPKG)
+    add_compile_definitions(ENABLE_VCPKG)
+    find_package(asio CONFIG REQUIRED)
+    target_link_libraries(paozhu asio::asio)
+
+    if (ENABLE_BOOST)
+        add_compile_definitions(ENABLE_BOOST)
+        set(Boost_NO_WARN_NEW_VERSIONS ON)
+        find_package(Boost REQUIRED COMPONENTS filesystem coroutine)
+        target_link_libraries(paozhu Boost::boost Boost::filesystem Boost::coroutine)
+    endif ()
+
+    find_package(OpenSSL REQUIRED)
+    target_link_libraries(paozhu OpenSSL::Crypto OpenSSL::SSL)
+
+    find_package(ZLIB REQUIRED)
+    target_link_libraries(paozhu ZLIB::ZLIB)
+
+    # find_package(libmysql REQUIRED)
+    find_package(unofficial-libmariadb CONFIG REQUIRED)
+    find_path(MYSQL_ROOT_DIR mysql)
+    # target_link_libraries(paozhu ${MYSQL_LIBRARIES})
+    # target_link_libraries(paozhu_cli ${MYSQL_LIBRARIES})
+    target_link_libraries(paozhu unofficial::libmariadb)
+    target_link_libraries(paozhu_cli unofficial::libmariadb)
+    target_include_directories(paozhu PUBLIC ${MYSQL_ROOT_DIR}/mysql)
+    target_include_directories(paozhu_cli PUBLIC ${MYSQL_ROOT_DIR}/mysql)
+
+    if (ENABLE_GD STREQUAL "ON")
+        find_package(PkgConfig)
+        pkg_check_modules(LIBGD REQUIRED IMPORTED_TARGET gdlib)
+        target_link_libraries(paozhu PkgConfig::LIBGD)
+
+        find_path(QRENCODE_INCLUDE_DIR NAMES qrencode.h)
+        find_library(QRENCODE_LIBRARY_RELEASE qrencode)
+        # find_library(QRENCODE_LIBRARY_DEBUG qrencoded)
+        # set(QRENCODE_LIBRARIES optimized ${QRENCODE_LIBRARY_RELEASE} debug ${QRENCODE_LIBRARY_DEBUG})
+        target_include_directories(paozhu PRIVATE ${QRENCODE_INCLUDE_DIR})
+        target_link_libraries(paozhu ${QRENCODE_LIBRARY_RELEASE})
+        # MESSAGE(STATUS ${QRENCODE_LIBRARY_RELEASE})
+
+        # warning: Fixed an issue where ports/libqrencode would not automatically
+        #          copy dll files to the bin directory
+        if (CMAKE_SYSTEM_NAME MATCHES "Windows")
+            set(PATH_TO_QRENCODE_DLL "")
+            if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
+                set(PATH_TO_QRENCODE_DLL "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/bin/qrencode.dll")
+            elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+                set(PATH_TO_QRENCODE_DLL "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib/libqrencode.dll")
+            endif ()
+            message(STATUS "Selected libqrencode.dll: ${PATH_TO_QRENCODE_DLL}")
+
+            add_custom_command(
+                    TARGET paozhu POST_BUILD
+                    COMMAND ${CMAKE_COMMAND} -E copy_if_different
+                    ${PATH_TO_QRENCODE_DLL} ${CMAKE_CURRENT_SOURCE_DIR}/bin/
+            )
+        endif ()
+
+        find_package(PNG REQUIRED)
+        target_link_libraries(paozhu PNG::PNG)
+
+        find_package(Freetype REQUIRED)
+        target_link_libraries(paozhu Freetype::Freetype)
+    endif ()
+
+    find_package(unofficial-brotli CONFIG REQUIRED)
+    target_link_libraries(paozhu unofficial::brotli::brotlidec unofficial::brotli::brotlienc)
+else ()
+
+if(USE_STANDALONE_ASIO)
+if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
+set(ASIO_PATH "/usr/local/opt/asio/include" "/usr/local/include")
+else()
+set(ASIO_PATH ${CMAKE_CURRENT_SOURCE_DIR}/asio "/usr/include")
+endif()
+
+    target_compile_definitions(paozhu INTERFACE ASIO_STANDALONE)
+    find_path(ASIO_PATH asio.hpp)
+    message(state " Standalone Asio found: " ${ASIO_PATH})
+    if(NOT ASIO_PATH)
+        message(FATAL_ERROR "Standalone Asio not found")
+    else()
+        target_include_directories(paozhu INTERFACE ${ASIO_PATH})
+    endif()
+
+    include_directories(${ASIO_PATH})
+
+endif()
+
+
+if(ENABLE_BOOST STREQUAL "ON")
+message("---ENABLE_BOOST-----")
+find_package(Boost REQUIRED
+             COMPONENTS system filesystem)
+if(Boost_FOUND)
+    add_compile_definitions(ENABLE_BOOST)
+    include_directories("${Boost_INCLUDE_DIRS}/boost")
+
+    MESSAGE( STATUS "Boost_INCLUDE_DIRS = ${Boost_INCLUDE_DIRS}")
+    MESSAGE( STATUS "Boost_LIBRARIES = ${Boost_LIBRARY_DIRS}")
+    MESSAGE( STATUS "Boost_LIB_VERSION = ${Boost_LIB_VERSION}")
+    link_directories(${Boost_LIBRARY_DIRS})
+    target_link_libraries (paozhu ${Boost_LIBRARIES})
+endif()
+
+endif()
+
+
+find_package(OpenSSL REQUIRED)
+
+if(OPENSSL_FOUND)
+
+  message(STATUS "OPENSSL_VERSION = ${OPENSSL_VERSION}")
+  message(STATUS "OPENSSL_SSL_LIBRARY = ${OPENSSL_SSL_LIBRARY}")
+  message(STATUS "OPENSSL_CRYPTO_LIBRARY = ${OPENSSL_CRYPTO_LIBRARY}")
+  message(STATUS "OPENSSL_INCLUDE_DIR = ${OPENSSL_INCLUDE_DIR}")
+  INCLUDE_DIRECTORIES("${OPENSSL_INCLUDE_DIR}")
+  target_link_libraries (paozhu ${OPENSSL_SSL_LIBRARY})
+  target_link_libraries (paozhu ${OPENSSL_CRYPTO_LIBRARY})
+endif()
+
+
+find_package(ZLIB REQUIRED)
+if(ZLIB_FOUND)
+  message(STATUS "Zlib Found! ${ZLIB_LIBRARIES}")
+  include_directories(${ZLIB_INCLUDE_DIR})
+  set(zlib_library ${ZLIB_LIBRARIES})
+  target_link_libraries(paozhu z)
+endif()
+
+find_path(MYSQL_ROOT_DIR mysql)
+MESSAGE( STATUS "MYSQL_ROOT_DIR = ${MYSQL_ROOT_DIR} ")
+find_package_handle_standard_args(mysql REQUIRED_VARS MYSQL_ROOT_DIR)
+
+FIND_PATH(MYSQL_INCLUDE_DIR mysql.h
+  /usr/local/include/mysql
+  /usr/include/mysql
+  /usr/local/mysql/include
+)
+SET(MYSQL_NAMES mysqlclient)
+FIND_LIBRARY(MYSQL_LIBRARY
+  NAMES ${MYSQL_NAMES}
+  PATHS /usr/lib /usr/local/lib /usr/local/mysql/lib
+  PATH_SUFFIXES mysql
+)
+
+IF (MYSQL_INCLUDE_DIR AND MYSQL_LIBRARY)
+  SET(MYSQL_FOUND TRUE)
+  SET( MYSQL_LIBRARIES ${MYSQL_LIBRARY} )
+ELSE (MYSQL_INCLUDE_DIR AND MYSQL_LIBRARY)
+  SET(MYSQL_FOUND FALSE)
+  SET( MYSQL_LIBRARIES )
+ENDIF (MYSQL_INCLUDE_DIR AND MYSQL_LIBRARY)
+
+IF (MYSQL_FOUND)
+  IF (NOT MYSQL_FIND_QUIETLY)
+    MESSAGE(STATUS "Found MySQL: ${MYSQL_LIBRARY}")
+  ENDIF (NOT MYSQL_FIND_QUIETLY)
+ELSE (MYSQL_FOUND)
+  IF (MYSQL_FIND_REQUIRED)
+    MESSAGE(STATUS "Looked for MySQL libraries named ${MYSQL_NAMES}.")
+    MESSAGE(FATAL_ERROR "Could NOT find MySQL library")
+  ENDIF (MYSQL_FIND_REQUIRED)
+ENDIF (MYSQL_FOUND)
+
+target_include_directories(paozhu PUBLIC ${MYSQL_INCLUDE_DIR})
+target_link_libraries(paozhu ${MYSQL_LIBRARY})
+
+target_include_directories(paozhu_cli PUBLIC ${MYSQL_INCLUDE_DIR})
+target_link_libraries(paozhu_cli ${MYSQL_LIBRARY})
+
+
+
+if(ENABLE_GD STREQUAL "ON")
+message("---ENABLE_GD-----")
+
+if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
+  set(GD_ROOT_DIR "/usr/local/opt/gd/lib")
+else()
+  set(GD_ROOT_DIR "${sys_so_path}")
+endif()
+
+set(find_gdname gd)
+
+find_library(GD_LIB_DIR
+  NAMES ${find_gdname}
+  PATHS "${GD_ROOT_DIR}"
+  NO_DEFAULT_PATH
+)
+
+if(NOT GD_LIB_DIR)
+message(FATAL_ERROR
+"GD Graphics Library NOT FOUND! please install . "
+)
+endif()
+
+message(STATUS "GD Graphics Library  at: ${GD_LIB_DIR}")
+
+if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
+set(QR_ROOT_DIR "/usr/local/opt/qrencode/lib")
+else()
+set(QR_ROOT_DIR "${sys_so_path}")
+endif()
+
+set(find_qrname qrencode)
+
+find_library(QR_LIB_DIR
+  NAMES ${find_qrname}
+  PATHS "${QR_ROOT_DIR}"
+  NO_DEFAULT_PATH
+)
+
+if(NOT QR_LIB_DIR)
+message(FATAL_ERROR
+"qrencode Library  NOT FOUND! please install . "
+)
+endif()
+
+message(STATUS "qrencode at: ${QR_LIB_DIR}")
+
+INCLUDE_DIRECTORIES("${GD_ROOT_DIR}/include")
+INCLUDE_DIRECTORIES("${QR_ROOT_DIR}/include")
+link_directories("${QR_ROOT_DIR}/lib")
+link_directories("${GD_ROOT_DIR}/lib")
+target_link_libraries(paozhu ${GD_LIB_DIR})
+target_link_libraries(paozhu ${QR_LIB_DIR})
+
+if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
+set(PNG_ROOT_DIR "/usr/local/opt/libpng/lib")
+else()
+set(PNG_ROOT_DIR "${sys_so_path}")
+endif()
+
+find_library(PNG_LIB_DIR
+  NAMES png
+  PATHS "${PNG_ROOT_DIR}"
+  NO_DEFAULT_PATH
+)
+target_link_libraries(paozhu ${PNG_LIB_DIR})
+
+if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
+  set(FREETYPE_ROOT_DIR "/usr/local/opt/freetype/lib")
+else()
+  set(FREETYPE_ROOT_DIR "${sys_so_path}")
+endif()
+
+find_library(FREETYPE_LIB_DIR
+  NAMES freetype
+  PATHS "${FREETYPE_ROOT_DIR}"
+  NO_DEFAULT_PATH
+)
+target_link_libraries(paozhu ${FREETYPE_LIB_DIR})
+#end ENABLE_GD
+endif()
+
+if(CMAKE_SYSTEM_NAME MATCHES "Darwin")
+  set(BROTLI_ROOT_DIR "/usr/local/opt/brotli/lib")
+else()
+  set(BROTLI_ROOT_DIR "${sys_so_path}")
+endif()
+
+
+
+#find_package(Brotli COMPONENTS encoder decoder common REQUIRED)
+
+message(STATUS "Brotli at: ${BROTLI_ROOT_DIR}")
+
+set(find_brname brotlienc)
+set(find_brdename brotlidec)
+find_library(BR_LIB_DIR
+  NAMES ${find_brname}
+  PATHS "${BROTLI_ROOT_DIR}"
+  NO_DEFAULT_PATH
+)
+find_library(BRDEC_LIB_DIR
+  NAMES ${find_brdename}
+  PATHS "${BROTLI_ROOT_DIR}"
+  NO_DEFAULT_PATH
+)
+INCLUDE_DIRECTORIES("${BROTLI_ROOT_DIR}/include")
+link_directories("${BROTLI_ROOT_DIR}/lib")
+
+if(NOT BR_LIB_DIR)
+message(FATAL_ERROR
+"Brotli Library  NOT FOUND! please install . "
+)
+endif()
+
+message(STATUS "Brotli at: ${BR_LIB_DIR}")
+target_link_libraries(paozhu ${BR_LIB_DIR})
+
+
+if(NOT BRDEC_LIB_DIR)
+message(FATAL_ERROR
+"Brotli Library  NOT FOUND! please install . "
+)
+endif()
+
+message(STATUS "Brotli at: ${BRDEC_LIB_DIR}")
+target_link_libraries(paozhu ${BRDEC_LIB_DIR})
+
+
+message("Compile framework mode")
+
+target_link_libraries(paozhu  m  dl)
+
+endif ()
+
+if (CMAKE_SYSTEM_NAME MATCHES "Windows")
+   target_link_libraries(paozhu ws2_32)
+   target_link_libraries(paozhu_cli ws2_32)
+endif ()

+ 51 - 0
frameworks/C++/paozhu/paozhu_benchmark/common/autocontrolmethod.hpp

@@ -0,0 +1,51 @@
+
+#ifndef __HTTP_AUTO_REG_CONTROL_HTTPMETHOD_HPP
+#define __HTTP_AUTO_REG_CONTROL_HTTPMETHOD_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+#pragma once
+#endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "httppeer.h" 
+
+#include "techempower.h"
+
+
+namespace http
+{
+  void _initauto_control_httpmethodregto(std::map<std::string, regmethold_t> &methodcallback)
+  {
+    struct regmethold_t temp;
+
+		temp.pre = nullptr;
+		temp.regfun = techempowerplaintext;
+		methodcallback.emplace("plaintext",temp);
+		temp.pre = nullptr;
+		temp.regfun = techempowerjson;
+		methodcallback.emplace("json",temp);
+		temp.pre = nullptr;
+		temp.regfun = techempowerdb;
+		methodcallback.emplace("db",temp);
+		temp.pre = nullptr;
+		temp.regfun = techempowerqueries;
+		methodcallback.emplace("queries",temp);
+		temp.pre = nullptr;
+		temp.regfun = techempowerfortunes;
+		methodcallback.emplace("fortunes",temp);
+		temp.pre = nullptr;
+		temp.regfun = techempowerupdates;
+		methodcallback.emplace("updates",temp);
+		temp.pre = nullptr;
+		temp.regfun = techempowercached_queries;
+		methodcallback.emplace("cached-queries",temp);
+		temp.pre = nullptr;
+		temp.regfun = techempowercached_db;
+		methodcallback.emplace("cached-db",temp);
+
+
+    }
+}
+
+#endif
+
+    

+ 32 - 0
frameworks/C++/paozhu/paozhu_benchmark/common/json_reflect_headers.h

@@ -0,0 +1,32 @@
+#pragma once
+#include <sstream>
+#include <string>
+#include <vector>
+#include <map>
+
+#include "types/techempower_json.h"
+#include "unicode.h"
+
+template <typename JSON_REF_OBJ_TEMP>
+std::string json_encode([[maybe_unused]] const JSON_REF_OBJ_TEMP &json_reflectobj) { return ""; }
+
+template <typename JSON_REF_OBJ_TEMP>
+std::string json_encode([[maybe_unused]] const std::vector<JSON_REF_OBJ_TEMP> &json_reflectobj) { return ""; }
+
+template <typename JSON_REF_OBJ_TEMP>
+unsigned int json_decode([[maybe_unused]] JSON_REF_OBJ_TEMP &json_reflectobj, [[maybe_unused]] const std::string &_json_data, [[maybe_unused]] unsigned int _offset) { return 0; }
+
+template <typename JSON_REF_OBJ_TEMP>
+unsigned int json_decode([[maybe_unused]] std::vector<JSON_REF_OBJ_TEMP> &json_reflectobj, [[maybe_unused]] const std::string &_json_data, [[maybe_unused]] unsigned int _offset) { return 0; }
+
+namespace http
+{
+
+std::string json_encode(const techempower_outjson_t &json_reflectobj);
+
+std::string json_encode(const std::vector<techempower_outjson_t> &json_reflectobj);
+
+unsigned int json_decode(techempower_outjson_t &json_reflectobj, const std::string &_json_data, unsigned int _offset = 0);
+
+unsigned int json_decode(std::vector<techempower_outjson_t> &json_reflectobj, const std::string &_json_data, unsigned int _offset = 0);
+}// namespace http

+ 16 - 0
frameworks/C++/paozhu/paozhu_benchmark/common/reghttpmethod.hpp

@@ -0,0 +1,16 @@
+#ifndef __HTTP_REGHTTPMETHOD_HPP
+#define __HTTP_REGHTTPMETHOD_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+#pragma once
+#endif// defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "httppeer.h"
+namespace http
+{
+void _inithttpmethodregto(std::map<std::string, regmethold_t> &methodcallback)
+{
+}
+
+}// namespace http
+#endif

+ 20 - 0
frameworks/C++/paozhu/paozhu_benchmark/common/reghttpmethod_pre.hpp

@@ -0,0 +1,20 @@
+#ifndef __HTTP_REGHTTPMETHOD_PRE_HPP
+#define __HTTP_REGHTTPMETHOD_PRE_HPP
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1200)
+#pragma once
+#endif// defined(_MSC_VER) && (_MSC_VER >= 1200)
+
+#include "httppeer.h"
+namespace http
+{
+void _inithttpmethodregto_pre(std::map<std::string, regmethold_t> &methodcallback)
+{
+    struct regmethold_t temp;
+    //temp.pre = adminlogin;
+    //temp.regfun = adminmar;
+    //methodcallback.emplace("adminmar", temp);
+}
+
+}// namespace http
+#endif

+ 20 - 0
frameworks/C++/paozhu/paozhu_benchmark/conf/orm.conf

@@ -0,0 +1,20 @@
+[default]
+type=main
+host=tfb-database
+port=3306
+dbname=hello_world
+user=benchmarkdbuser
+password=benchmarkdbpass
+pretable=
+maxpool=5
+dbtype=mysql
+
+type=second
+host=tfb-database
+port=3306
+dbname=hello_world
+user=benchmarkdbuser
+password=benchmarkdbpass
+pretable=
+maxpool=20
+dbtype=mysql

+ 42 - 0
frameworks/C++/paozhu/paozhu_benchmark/conf/server.conf

@@ -0,0 +1,42 @@
+[default]
+threadmax=1024
+threadmin=5
+httpport=8888
+httpsport=4430
+cothreadnum=8 ;Coroutines run on thread num
+
+http2_enable=0
+debug_enable=1
+deamon_enable=0
+mainhost=localhost
+certificate_chain_file=localhost.pem
+private_key_file=localhost.key
+tmp_dh_file=dh4096.pem
+reboot_password=e10adc3949ba59abbe56e057f20f883e ;md5(md5("123456")+"rand_char"+md5("123456"))
+session_type=1 ;session save type 0.file 1.memory 2.redis 3.memcache 4.reserve
+static_file_compress_cache=1 ;1 enable, Cache static file compress(gzip,br) content to cache directory 
+modelspath=/root/benchmark/models
+serverpath=/root/benchmark
+viewpath=/root/benchmark/view
+viewsopath=/root/benchmark/module/view
+
+controlpath=/root/benchmark/controller
+controlsopath=/root/benchmark/module/controller
+
+temppath=/root/benchmark/temp
+logpath=/root/benchmark/log
+wwwpath=/root/benchmark/www/default
+pluginspath=/root/benchmark/plugins
+libspath=/root/benchmark/libs
+directorylist=0
+index=index.html
+;usehtmlcache=1
+;usehtmlcachetime=3600
+rewrite_404=0   ;1 file 2 action url path
+rewrite_404_action=index.html
+method_pre=
+method_after=
+show_visitinfo=0
+upload_max_size=16777216
+
+

+ 19 - 0
frameworks/C++/paozhu/paozhu_benchmark/controller/include/techempower.h

@@ -0,0 +1,19 @@
+
+#pragma once
+#include <chrono>
+#include <thread>
+#include "httppeer.h"
+
+namespace http
+{
+
+            
+	std::string techempowerplaintext(std::shared_ptr<httppeer> peer);
+	std::string techempowerjson(std::shared_ptr<httppeer> peer);
+	std::string techempowerdb(std::shared_ptr<httppeer> peer);
+	std::string techempowerqueries(std::shared_ptr<httppeer> peer);
+	std::string techempowerfortunes(std::shared_ptr<httppeer> peer);
+	std::string techempowerupdates(std::shared_ptr<httppeer> peer);
+	std::string techempowercached_queries(std::shared_ptr<httppeer> peer);
+	std::string techempowercached_db(std::shared_ptr<httppeer> peer);
+}

+ 241 - 0
frameworks/C++/paozhu/paozhu_benchmark/controller/src/techempower.cpp

@@ -0,0 +1,241 @@
+#include "orm.h"
+#include <chrono>
+#include <thread>
+#include <algorithm>
+#include <random>
+#include <chrono>
+#include "httppeer.h"
+#include "techempower.h"
+#include "techempower_json.h"
+#include "datetime.h"
+#include "func.h"
+#include "pzcache.h"
+#include "json_reflect_headers.h"
+namespace http
+{
+//@urlpath(null,plaintext)
+std::string techempowerplaintext(std::shared_ptr<httppeer> peer)
+{
+    peer->type("text/plain; charset=UTF-8");
+    peer->set_header("Date", get_gmttime());
+    peer->output = "Hello, World!";
+    return "";
+}
+
+//@urlpath(null,json)
+std::string techempowerjson(std::shared_ptr<httppeer> peer)
+{
+    peer->type("application/json; charset=UTF-8");
+    peer->set_header("Date", get_gmttime());
+    struct techempower_outjson_t a;
+    a.message    = "Hello, World!";
+    peer->output = json_encode(a);
+    return "";
+}
+
+//@urlpath(null,db)
+std::string techempowerdb(std::shared_ptr<httppeer> peer)
+{
+    peer->type("application/json; charset=UTF-8");
+    peer->set_header("Date", get_gmttime());
+    auto myworld        = orm::World();
+    unsigned int rd_num = rand_range(1, 10000);
+    myworld.get_one(rd_num);
+
+    peer->output = myworld.data_tojson();
+    return "";
+}
+
+//@urlpath(null,queries)
+std::string techempowerqueries(std::shared_ptr<httppeer> peer)
+{
+    peer->type("application/json; charset=UTF-8");
+    peer->set_header("Date", get_gmttime());
+
+    unsigned int get_num = peer->get["queries"].to_int();
+    if (get_num == 0)
+    {
+        get_num = 1;
+    }
+    else if (get_num > 500)
+    {
+        get_num = 500;
+    }
+    auto myworld = orm::World();
+    myworld.record.reserve(get_num);
+    for (unsigned int i = 0; i < get_num; i++)
+    {
+        myworld.wheresql.clear();
+        unsigned int rd_num = rand_range(1, 10000);
+        myworld.where("id", rd_num).fetch_append();
+    }
+
+    peer->output = myworld.to_json();
+    return "";
+}
+
+//@urlpath(null,fortunes)
+std::string techempowerfortunes(std::shared_ptr<httppeer> peer)
+{
+    peer->type("text/html; charset=UTF-8");
+    peer->set_header("Date", get_gmttime());
+
+    auto myfortune = orm::Fortune();
+    myfortune.fetch();
+    myfortune.data.id      = 0;
+    myfortune.data.message = "Additional fortune added at request time.";
+    myfortune.record.push_back(myfortune.data);
+
+    std::sort(myfortune.record.begin(), myfortune.record.end(), [](const auto &lhs, const auto &rhs)
+              { return lhs.message < rhs.message; });
+    peer->val["list"].set_array();
+    OBJ_ARRAY item;
+    for (unsigned int i = 0; i < myfortune.record.size(); i++)
+    {
+        item["id"]      = myfortune.record[i].id;
+        item["message"] = html_encode(myfortune.record[i].message);
+        peer->val["list"].push(item);
+    }
+
+    peer->view("techempower/fortunes");
+    return "";
+}
+
+//@urlpath(null,updates)
+std::string techempowerupdates(std::shared_ptr<httppeer> peer)
+{
+    peer->type("application/json; charset=UTF-8");
+    peer->set_header("Date", get_gmttime());
+    unsigned int get_num = peer->get["queries"].to_int();
+
+    if (get_num == 0)
+    {
+        get_num = 1;
+    }
+    else if (get_num > 500)
+    {
+        get_num = 500;
+    }
+    auto myworld = orm::World();
+    myworld.record.clear();
+    myworld.record.reserve(get_num);
+    for (unsigned int i = 0; i < get_num; i++)
+    {
+        myworld.wheresql.clear();
+        myworld.where("id", rand_range(1, 10000)).fetch_append();
+        if (myworld.effect() > 0)
+        {
+            unsigned int j                 = myworld.record.size() - 1;
+            myworld.data.randomnumber      = rand_range(1, 10000);
+            myworld.record[j].randomnumber = myworld.data.randomnumber;
+            myworld.update("randomnumber");
+        }
+    }
+    peer->output = myworld.to_json();
+    return "";
+}
+
+//@urlpath(null,cached-queries)
+std::string techempowercached_queries(std::shared_ptr<httppeer> peer)
+{
+    peer->type("application/json; charset=UTF-8");
+    peer->set_header("Date", get_gmttime());
+
+    unsigned int get_num = peer->get["count"].to_int();
+    if (get_num == 0)
+    {
+        get_num = 1;
+    }
+    else if (get_num > 500)
+    {
+        get_num = 500;
+    }
+    auto myworld          = orm::World();
+    std::string mycacheid = "alldatacache";
+
+    pzcache<std::vector<orm::worldbase::meta>> &temp_cache = pzcache<std::vector<orm::worldbase::meta>>::conn();
+
+    std::vector<orm::worldbase::meta> allcachedata_array;
+    allcachedata_array.reserve(10000);
+    //create rand data to cache
+    if (temp_cache.check(mycacheid) > -1)
+    {
+        allcachedata_array = temp_cache.get(mycacheid);
+    }
+    else
+    {
+        allcachedata_array.resize(10000);
+        for (unsigned int i = 0; i < 10000; i++)
+        {
+            allcachedata_array[i].id           = i + 1;
+            allcachedata_array[i].randomnumber = rand_range(1, 10000);
+        }
+        temp_cache.save(mycacheid, allcachedata_array, 120);
+    }
+    //get rand data from cache
+    mycacheid = "my" + std::to_string(get_num);
+    myworld.record.reserve(get_num);
+    if (temp_cache.check(mycacheid) > -1)
+    {
+        myworld.record = temp_cache.get(mycacheid);
+    }
+    else
+    {
+        if (allcachedata_array.size() == 10000)
+        {
+            for (unsigned int i = 0; i < get_num; i++)
+            {
+                unsigned int temp_rid = rand_range(0, 9999);
+                myworld.record.push_back(allcachedata_array[temp_rid]);
+            }
+        }
+        temp_cache.save(mycacheid, myworld.record, 120);
+    }
+
+    peer->output = myworld.to_json();
+    return "";
+}
+
+//@urlpath(null,cached-db)
+std::string techempowercached_db(std::shared_ptr<httppeer> peer)
+{
+    peer->type("application/json; charset=UTF-8");
+    peer->set_header("Date", get_gmttime());
+    //this test from database to cache
+    unsigned int get_num = peer->get["count"].to_int();
+    if (get_num == 0)
+    {
+        get_num = 1;
+    }
+    else if (get_num > 500)
+    {
+        get_num = 500;
+    }
+    auto myworld          = orm::World();
+    std::string mycacheid = "my" + std::to_string(get_num);
+
+    pzcache<std::vector<orm::worldbase::meta>> &temp_cache = pzcache<std::vector<orm::worldbase::meta>>::conn();
+
+    myworld.record.reserve(get_num);
+    if (temp_cache.check(mycacheid) > -1)
+    {
+        myworld.record = temp_cache.get(mycacheid);
+    }
+    else
+    {
+        std::vector<unsigned int> cacheid;
+        for (unsigned int i = 0; i < get_num; i++)
+        {
+            cacheid.push_back(rand_range(1, 10000));
+        }
+
+        std::string sqlstr = array_to_sql(cacheid);
+        myworld.whereIn("id", sqlstr).fetch();
+        temp_cache.save(mycacheid, myworld.record, 120);
+    }
+
+    peer->output = myworld.to_json();
+    return "";
+}
+
+}// namespace http

+ 15 - 0
frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json.h

@@ -0,0 +1,15 @@
+#ifndef LIBS_TYPES_TECHEMPOWER_TYPE_H
+#define LIBS_TYPES_TECHEMPOWER_TYPE_H
+#include <string>
+#include <sstream>
+
+namespace http
+{
+//@reflect json to_json from_json
+struct techempower_outjson_t
+{
+    std::string message;
+};
+
+}// namespace http
+#endif

+ 290 - 0
frameworks/C++/paozhu/paozhu_benchmark/libs/types/techempower_json_jsonreflect.cpp

@@ -0,0 +1,290 @@
+#include <sstream>
+#include <string>
+#include <vector>
+#include <map>
+#include "types/techempower_json.h"
+#include "json_reflect_headers.h"
+#include "unicode.h"
+#include "func.h"
+
+namespace http
+{
+
+
+std::string json_encode(const techempower_outjson_t &json_reflectobj)
+	{
+ 
+    std::stringstream _stream;
+    _stream << "{"; 
+    _stream << "\"message\":\"" << http::utf8_to_jsonstring(json_reflectobj.message)<< "\"";
+                
+    _stream << "}";
+
+    return _stream.str();
+            
+	}
+
+
+std::string json_encode(const std::vector<techempower_outjson_t> &json_reflectobj)
+        {
+        std::stringstream _stream;
+        _stream << "["; 
+    
+            for(unsigned int i=0;i<json_reflectobj.size();i++) 
+            {
+                if(i>0)
+                {
+                    _stream <<",";
+                }
+                _stream <<json_encode(json_reflectobj[i]);
+            }
+    
+        _stream << "]";
+
+        return _stream.str();
+        }
+              
+     unsigned int json_decode(techempower_outjson_t &json_reflectobj,const std::string &_json_data,unsigned int _offset)
+     {           
+             bool _isarray=false;
+        for(;_offset<_json_data.size();_offset++)
+        {
+            if(_json_data[_offset]=='{')
+            {
+                break;
+            }
+            if(_json_data[_offset]=='[')
+            {
+                _isarray=true;
+                break;
+            }
+        }
+
+        if(_isarray)
+        {
+            for(;_offset<_json_data.size();_offset++)
+            {
+                if(_json_data[_offset]=='{')
+                {
+                    _isarray=false;
+                    break;
+                }   
+            }
+        }
+
+        if(_isarray==false)
+        {
+            if(_json_data[_offset]=='{')
+            {
+                _offset++;
+            }
+            std::string _json_key_name,_json_value_name;
+            for(;_offset<_json_data.size();_offset++)
+            {
+
+                //去除空格
+                _offset=http::json_string_trim(_json_data,_offset);
+                //如果是右侧括号表示这个对象已经结束
+                if(_json_data[_offset]==0x7D)
+                {
+                    return _offset;
+                }
+                //直到引号
+                if(_json_data[_offset]==0x22)
+                {
+                    unsigned int temp_offset=_offset;
+                    _json_value_name.clear();
+                    _json_key_name=http::jsonstring_to_utf8(&_json_data[_offset],_json_data.size()-_offset,temp_offset);
+
+                    _offset=temp_offset;
+                    if(_offset < _json_data.size() &&_json_data[_offset]==0x22)
+                    {
+                        _offset+=1;
+                    }
+                    //键名 后就是键值类型 循环去除空格
+                    _offset=http::json_string_trim(_json_data,_offset);
+                    if(_offset < _json_data.size() &&_json_data[_offset]!=':')
+                    {
+                        return _offset; 
+                    }
+                    _offset++;
+                    _offset=http::json_string_trim(_json_data,_offset);
+                    
+                    if(_offset < _json_data.size() &&_json_data[_offset]=='{')
+                    {   //还是一个对象,表示有嵌套对象
+                        //1 内置 struct map<std::string,*>
+                        //递归代码
+                    
+                            _offset++;
+                            for ( ; _offset < _json_data.size(); _offset++)
+                            {
+                                if (_json_data[_offset] == '}')
+                                {
+                                    //offset++;
+                                    break;
+                                }
+                                if (_json_data[_offset] == '"')
+                                {
+                                    _offset++;
+                                    for ( ; _offset < _json_data.size(); _offset++)
+                                    {
+                                        if (_json_data[_offset] == '"'&&_json_data[_offset-1]!=0x5C)
+                                        {
+                                            break;
+                                        }
+                                    }
+                                }
+                            }
+                                                
+
+                        if(_offset < _json_data.size() && (_json_data[_offset]==']'||_json_data[_offset]=='}'))
+                        {
+                            _offset-=1;
+                        }
+                        //直接下一个,不用处理键值
+                        continue;   
+                    }
+                    else if(_json_data[_offset]=='[')
+                    {   //表示有数组 
+                        //////////////////////////////////////////////////////////////////////
+                        //begin level1 []
+                        //vector<std::string> vector<std::pair<std::string,*>>   vector<vector<int|long|float|double>>
+                        //如果是非内置类型 直接使用json_decode<>
+
+                        //递归代码     
+
+                    
+                            _offset++;
+                            for ( ; _offset < _json_data.size(); _offset++)
+                            {
+                                if (_json_data[_offset] == ']')
+                                {
+                                    //offset++;
+                                    break;
+                                }
+                                if (_json_data[_offset] == '"')
+                                {
+                                    _offset++;
+                                    for ( ; _offset < _json_data.size(); _offset++)
+                                    {
+                                        if (_json_data[_offset] == '"'&&_json_data[_offset-1]!=0x5C)
+                                        {
+                                            break;
+                                        }
+                                    }
+                                }
+                            }
+                        
+                        //直接下一个,不用处理键值
+                        if(_offset < _json_data.size() && (_json_data[_offset]==']'||_json_data[_offset]=='}'))
+                        {
+                            _offset-=1;
+                        }
+                        continue;    
+                        //end level1[]
+                        ////////////////////////////////////////////////////////////////////
+                    }
+                    else if(_json_data[_offset]==0x22)
+                    {
+                        //如果键值也是字符串
+                        temp_offset=_offset;
+                        _json_value_name=http::jsonstring_to_utf8(&_json_data[_offset],_json_data.size()-_offset,temp_offset);
+                        _offset=temp_offset;
+                        if(_json_data[_offset]==0x22)
+                        {
+                            if((_offset+1)<_json_data.size())
+                            {
+                                if(_json_data[_offset+1]!=']'&&_json_data[_offset+1]!='}')
+                                {
+                                    _offset+=1;
+                                }
+                            }
+                        }
+                    }
+                    else
+                    {
+                        //表示是数字 bool NULL
+                        for(;_offset<_json_data.size();_offset++)
+                        {
+                            //结束条件
+                            if(_json_data[_offset]==','||_json_data[_offset]==']'||_json_data[_offset]=='}'||_json_data[_offset]==0x20||_json_data[_offset]==0x0A||_json_data[_offset]==0x0D||_json_data[_offset]=='\t')
+                            {
+                                break;
+                            }
+                            _json_value_name.push_back(_json_data[_offset]);
+                        }
+                        //让前面循环退出或返回
+                        if(_offset < _json_data.size() && _json_data[_offset]=='}')
+                        {
+                            _offset-=1;
+                        }
+                    }
+                    ////////////////////////////////////////////////////////
+                    // level1
+                    //处理对象赋值
+                    if (http::str_casecmp(_json_key_name, "message"))
+                            {
+
+                                json_reflectobj.message=_json_value_name;     
+                            }
+                            
+                    ////////////////////////////////////////////////////////
+                    //继续循环下一个键值
+                    continue;
+                }
+            }
+        }
+        return _offset;
+    }
+  
+unsigned int json_decode(std::vector<techempower_outjson_t> &json_reflectobj,const std::string &_json_data,unsigned int _offset)
+      {          
+             bool _isarray=false;
+        for(;_offset<_json_data.size();_offset++)
+        {
+            if(_json_data[_offset]=='{')
+            {
+                break;
+            }
+            if(_json_data[_offset]=='[')
+            {
+                _isarray=true;
+                break;
+            }
+        }
+
+        if(_isarray)
+        {
+            if(_json_data[_offset]=='[')
+            {
+                _offset+=1;
+            }
+            for(;_offset<_json_data.size();_offset++)
+            {
+                _offset=http::json_string_trim(_json_data,_offset);
+                //直接返回,这样可以防插入空的对象
+                if(_json_data[_offset]==0x5D)
+                {
+                    return _offset;
+                }else if(_json_data[_offset]=='{')
+                {
+                    techempower_outjson_t temp;
+                    _offset=json_decode(temp,_json_data,_offset);
+                    json_reflectobj.push_back(temp);
+                }
+
+            }
+            
+        }
+        else
+        {
+            techempower_outjson_t temp;
+            _offset=json_decode(temp,_json_data,_offset);
+            json_reflectobj.push_back(temp);
+            
+        }
+
+        return _offset; 
+    }
+         
+}

+ 3 - 3
frameworks/C/h2o/h2o.dockerfile

@@ -1,4 +1,4 @@
-ARG UBUNTU_VERSION=22.04
+ARG UBUNTU_VERSION=24.04
 
 ARG H2O_APP_PREFIX=/opt/h2o_app
 
@@ -25,6 +25,7 @@ RUN apt-get -yqq update && \
       libwslay-dev \
       libyajl-dev \
       libz-dev \
+      llvm-dev \
       make \
       ninja-build \
       pkg-config \
@@ -46,8 +47,7 @@ RUN curl -LSs "https://github.com/h2o/h2o/archive/${H2O_VERSION}.tar.gz" | \
       -G Ninja \
       -S . && \
     cmake --build build -j && \
-    cmake --install build && \
-    cp -a deps/picotls/include/picotls* deps/quicly/include/quicly* /usr/local/include
+    cmake --install build
 
 ARG MUSTACHE_C_REVISION=7fe52392879d0188c172d94bb4fde7c513d6b929
 

+ 5 - 5
frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj

@@ -28,12 +28,12 @@
     
   <ItemGroup>
 	  
-    <PackageReference Include="GenHTTP.Core" Version="8.0.0" />
-    <PackageReference Include="GenHTTP.Modules.Razor" Version="8.0.0" />
-    <PackageReference Include="GenHTTP.Modules.Webservices" Version="8.0.0" />
+    <PackageReference Include="GenHTTP.Core" Version="8.2.0" />
+    <PackageReference Include="GenHTTP.Modules.Razor" Version="8.2.0" />
+    <PackageReference Include="GenHTTP.Modules.Webservices" Version="8.2.0" />
 	  
-    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.0" />
-    <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.0" />
+    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.4" />
+    <PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.2" />
 	  
   </ItemGroup>
   

+ 1 - 2
frameworks/FSharp/giraffe/README.md

@@ -1,9 +1,8 @@
 # Giraffe Benchmarks on Linux
 
-This application tests Giraffe in 3 modes:
+This application tests Giraffe in 2 modes:
 
 - Default: Using Giraffe's Endpoint Routing APIs with the `System.Text.Json` serializer
-- Utf8Json: Testing the JSON endpoint with the `Utf8Json` serializer
 - Newtonsoft: Testing the JSON endpoint with the `NewtonsoftJson` serializer
 
 ## Infrastructure Software Versions

+ 1 - 1
frameworks/FSharp/giraffe/giraffe-newtonsoft.dockerfile

@@ -1,4 +1,4 @@
-FROM mcr.microsoft.com/dotnet/sdk:8.0.100 AS build
+FROM mcr.microsoft.com/dotnet/sdk:8.0.204 AS build
 WORKDIR /app
 COPY src/App .
 RUN dotnet publish -c Release -o out

+ 1 - 1
frameworks/FSharp/giraffe/giraffe.dockerfile

@@ -1,4 +1,4 @@
-FROM mcr.microsoft.com/dotnet/sdk:8.0.100 AS build
+FROM mcr.microsoft.com/dotnet/sdk:8.0.204 AS build
 WORKDIR /app
 COPY src/App .
 RUN dotnet publish -c Release -o out

+ 4 - 4
frameworks/FSharp/giraffe/src/App/App.fsproj

@@ -6,10 +6,10 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Update="FSharp.Core" Version="8.0.100" />
-    <PackageReference Include="Dapper" Version="2.1.21" />
-    <PackageReference Include="Giraffe" Version="6.2.0" />
-    <PackageReference Include="Npgsql" Version="8.0.0-rc.2" />
+    <PackageReference Update="FSharp.Core" Version="8.0.200" />
+    <PackageReference Include="Dapper" Version="2.1.44" />
+    <PackageReference Include="Giraffe" Version="6.4.0" />
+    <PackageReference Include="Npgsql" Version="8.0.2" />
   </ItemGroup>
 
   <ItemGroup>

+ 3 - 3
frameworks/FSharp/zebra/src/App/App.fsproj

@@ -9,10 +9,10 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <PackageReference Include="Dapper" Version="2.1.21" />
-    <PackageReference Include="Npgsql" Version="8.0.0-rc.2" />
+    <PackageReference Include="Dapper" Version="2.1.44" />
+    <PackageReference Include="Npgsql" Version="8.0.2" />
     <PackageReference Include="Utf8Json" Version="1.3.7" />
-    <PackageReference Update="FSharp.Core" Version="8.0.100" />
+    <PackageReference Update="FSharp.Core" Version="8.0.200" />
   </ItemGroup>
 
   <ItemGroup>

+ 1 - 1
frameworks/FSharp/zebra/zebra-simple.dockerfile

@@ -1,4 +1,4 @@
-FROM mcr.microsoft.com/dotnet/sdk:8.0.100 AS build
+FROM mcr.microsoft.com/dotnet/sdk:8.0.204 AS build
 WORKDIR /app
 COPY src/App .
 RUN dotnet publish -c Release -o out

+ 1 - 1
frameworks/FSharp/zebra/zebra.dockerfile

@@ -1,4 +1,4 @@
-FROM mcr.microsoft.com/dotnet/sdk:8.0.100 AS build
+FROM mcr.microsoft.com/dotnet/sdk:8.0.204 AS build
 WORKDIR /app
 COPY src/App .
 RUN dotnet publish -c Release -o out

+ 3 - 3
frameworks/Go/aah/src/benchmark/go.mod

@@ -22,10 +22,10 @@ require (
 	github.com/satori/go.uuid v1.2.0 // indirect
 	github.com/shopspring/decimal v1.3.1 // indirect
 	github.com/urfave/cli v1.20.0 // indirect
-	golang.org/x/crypto v0.17.0 // indirect
-	golang.org/x/net v0.17.0 // indirect
+	golang.org/x/crypto v0.21.0 // indirect
+	golang.org/x/net v0.23.0 // indirect
 	golang.org/x/oauth2 v0.0.0-20181003184128-c57b0facaced // indirect
-	golang.org/x/sys v0.15.0 // indirect
+	golang.org/x/sys v0.18.0 // indirect
 	golang.org/x/text v0.14.0 // indirect
 	google.golang.org/appengine v1.6.7 // indirect
 	gopkg.in/go-playground/assert.v1 v1.2.1 // indirect

+ 6 - 6
frameworks/Go/aah/src/benchmark/go.sum

@@ -42,17 +42,17 @@ github.com/urfave/cli v1.20.0 h1:fDqGv3UG/4jbVl/QkFwEdddtEDjh/5Ov6X+0B/3bPaw=
 github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
 golang.org/x/crypto v0.0.0-20181012144002-a92615f3c490/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
-golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
+golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
+golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
 golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
-golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
-golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
+golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
+golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
 golang.org/x/oauth2 v0.0.0-20181003184128-c57b0facaced h1:4oqSq7eft7MdPKBGQK11X9WYUxmj6ZLgGTqYIbY1kyw=
 golang.org/x/oauth2 v0.0.0-20181003184128-c57b0facaced/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
-golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
+golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=

+ 3 - 3
frameworks/Go/echo/src/go.mod

@@ -13,8 +13,8 @@ require (
 	github.com/mattn/go-isatty v0.0.16 // indirect
 	github.com/valyala/bytebufferpool v1.0.0 // indirect
 	github.com/valyala/fasttemplate v1.2.1 // indirect
-	golang.org/x/crypto v0.17.0 // indirect
-	golang.org/x/net v0.17.0 // indirect
-	golang.org/x/sys v0.15.0 // indirect
+	golang.org/x/crypto v0.21.0 // indirect
+	golang.org/x/net v0.23.0 // indirect
+	golang.org/x/sys v0.18.0 // indirect
 	golang.org/x/text v0.14.0 // indirect
 )

+ 6 - 6
frameworks/Go/echo/src/go.sum

@@ -22,16 +22,16 @@ github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6Kllzaw
 github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
 github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4=
 github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
-golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
-golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
-golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
-golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
+golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
+golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
+golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
+golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
 golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
-golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
+golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
 golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

+ 3 - 3
frameworks/Go/gin/gin-gorm/go.mod

@@ -42,9 +42,9 @@ require (
 	github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
 	github.com/ugorji/go/codec v1.2.11 // indirect
 	golang.org/x/arch v0.3.0 // indirect
-	golang.org/x/crypto v0.20.0 // indirect
-	golang.org/x/net v0.21.0 // indirect
-	golang.org/x/sys v0.17.0 // indirect
+	golang.org/x/crypto v0.21.0 // indirect
+	golang.org/x/net v0.23.0 // indirect
+	golang.org/x/sys v0.18.0 // indirect
 	golang.org/x/text v0.14.0 // indirect
 	google.golang.org/protobuf v1.33.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect

+ 6 - 6
frameworks/Go/gin/gin-gorm/go.sum

@@ -194,8 +194,8 @@ golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWP
 golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
-golang.org/x/crypto v0.20.0 h1:jmAMJJZXr5KiCw05dfYK9QnqaqKLYXijU23lsEdcQqg=
-golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ=
+golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
+golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
 golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
 golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
@@ -205,8 +205,8 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL
 golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=
-golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
+golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
+golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -223,8 +223,8 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
-golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
+golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=

+ 3 - 3
frameworks/Go/gin/gin-src/go.mod

@@ -26,9 +26,9 @@ require (
 	github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
 	github.com/ugorji/go/codec v1.2.11 // indirect
 	golang.org/x/arch v0.3.0 // indirect
-	golang.org/x/crypto v0.17.0 // indirect
-	golang.org/x/net v0.17.0 // indirect
-	golang.org/x/sys v0.15.0 // indirect
+	golang.org/x/crypto v0.21.0 // indirect
+	golang.org/x/net v0.23.0 // indirect
+	golang.org/x/sys v0.18.0 // indirect
 	golang.org/x/text v0.14.0 // indirect
 	google.golang.org/protobuf v1.33.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect

+ 6 - 6
frameworks/Go/gin/gin-src/go.sum

@@ -62,14 +62,14 @@ github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZ
 golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
 golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k=
 golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
-golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
-golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
-golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
-golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
+golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
+golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
+golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
+golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
 golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
-golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
+golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
 golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=

+ 3 - 3
frameworks/Go/gin/gin-std/go.mod

@@ -27,9 +27,9 @@ require (
 	github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
 	github.com/ugorji/go/codec v1.2.11 // indirect
 	golang.org/x/arch v0.3.0 // indirect
-	golang.org/x/crypto v0.17.0 // indirect
-	golang.org/x/net v0.17.0 // indirect
-	golang.org/x/sys v0.15.0 // indirect
+	golang.org/x/crypto v0.21.0 // indirect
+	golang.org/x/net v0.23.0 // indirect
+	golang.org/x/sys v0.18.0 // indirect
 	golang.org/x/text v0.14.0 // indirect
 	google.golang.org/protobuf v1.33.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect

+ 6 - 6
frameworks/Go/gin/gin-std/go.sum

@@ -63,14 +63,14 @@ github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZ
 golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
 golang.org/x/arch v0.3.0 h1:02VY4/ZcO/gBOH6PUaoiptASxtXU10jazRCP865E97k=
 golang.org/x/arch v0.3.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
-golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
-golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
-golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
-golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
+golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
+golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
+golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
+golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
 golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
-golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
+golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
 golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
 google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=

+ 3 - 3
frameworks/Go/goframe/src/go.mod

@@ -42,9 +42,9 @@ require (
 	go.opentelemetry.io/otel/sdk v1.7.0 // indirect
 	go.opentelemetry.io/otel/trace v1.7.0 // indirect
 	golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect
-	golang.org/x/crypto v0.20.0 // indirect
-	golang.org/x/net v0.21.0 // indirect
-	golang.org/x/sys v0.17.0 // indirect
+	golang.org/x/crypto v0.21.0 // indirect
+	golang.org/x/net v0.23.0 // indirect
+	golang.org/x/sys v0.18.0 // indirect
 	golang.org/x/text v0.14.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
 )

+ 6 - 6
frameworks/Go/goframe/src/go.sum

@@ -248,8 +248,8 @@ golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWP
 golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
 golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
-golang.org/x/crypto v0.20.0 h1:jmAMJJZXr5KiCw05dfYK9QnqaqKLYXijU23lsEdcQqg=
-golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ=
+golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
+golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
 golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
 golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
@@ -267,8 +267,8 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT
 golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=
-golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
+golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
+golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -300,8 +300,8 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
-golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
+golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=

+ 1 - 1
frameworks/Go/kami/src/go.mod

@@ -5,7 +5,7 @@ go 1.19
 require (
 	github.com/go-sql-driver/mysql v1.6.0
 	github.com/guregu/kami v2.2.1+incompatible
-	golang.org/x/net v0.17.0
+	golang.org/x/net v0.23.0
 )
 
 require (

+ 2 - 2
frameworks/Go/kami/src/go.sum

@@ -10,8 +10,8 @@ github.com/zenazn/goji v1.0.1 h1:4lbD8Mx2h7IvloP7r2C0D6ltZP6Ufip8Hn0wmSK5LR8=
 github.com/zenazn/goji v1.0.1/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
-golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
-golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
+golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
+golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=

+ 2 - 2
frameworks/Go/ronykit/src/go.mod

@@ -27,7 +27,7 @@ require (
 	github.com/valyala/bytebufferpool v1.0.0 // indirect
 	github.com/valyala/fasthttp v1.50.0 // indirect
 	github.com/valyala/tcplisten v1.0.0 // indirect
-	golang.org/x/net v0.17.0 // indirect
-	golang.org/x/sys v0.13.0 // indirect
+	golang.org/x/net v0.23.0 // indirect
+	golang.org/x/sys v0.18.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
 )

+ 5 - 5
frameworks/Go/ronykit/src/go.sum

@@ -62,13 +62,13 @@ github.com/valyala/fasthttp v1.50.0 h1:H7fweIlBm0rXLs2q0XbalvJ6r0CUPFWK3/bB4N13e
 github.com/valyala/fasthttp v1.50.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA=
 github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8=
 github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc=
-golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
-golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
+golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
+golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
 golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
-golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
+golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
+golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
 golang.org/x/tools v0.12.0 h1:YW6HUoUmYBpwSgyaGaZq1fHjrBjX1rlpZ54T6mu2kss=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=

+ 1 - 1
frameworks/Java/light-java/pom.xml

@@ -25,7 +25,7 @@
         <maven.compiler.target>11</maven.compiler.target>
         <version.light-4j>2.0.1</version.light-4j>
         <version.logback>1.3.12</version.logback>
-        <version.undertow>2.3.5.Final</version.undertow>
+        <version.undertow>2.3.12.Final</version.undertow>
         <version.hikaricp>3.3.1</version.hikaricp>
         <version.mysql>8.0.28</version.mysql>
         <version.postgres>42.7.2</version.postgres>

+ 9 - 0
frameworks/Java/today/.gitignore

@@ -0,0 +1,9 @@
+# Ignore Gradle project-specific cache directory
+.gradle
+
+# Ignore Gradle build output directory
+build
+
+.idea
+today.properties
+gradle

+ 26 - 0
frameworks/Java/today/README.md

@@ -0,0 +1,26 @@
+# [TODAY Infrastructure](https://github.com/TAKETODAY/today-infrastructure) Benchmarking Test
+
+## Test URLs
+### JSON
+
+http://localhost:8080/json
+
+### PLAINTEXT
+
+http://localhost:8080/plaintext
+
+### DB
+
+http://localhost:8080/db
+
+### QUERY
+
+http://localhost:8080/queries?queries=
+
+### UPDATE
+
+http://localhost:8080/update?queries=
+
+### FORTUNES
+
+http://localhost:8080/fortunes

+ 30 - 0
frameworks/Java/today/benchmark_config.json

@@ -0,0 +1,30 @@
+{
+  "framework": "today",
+  "tests": [
+    {
+      "default": {
+        "json_url": "/json",
+        "plaintext_url": "/plaintext",
+        "db_url": "/db",
+        "query_url": "/queries?queries=",
+        "fortune_url": "/fortunes",
+        "update_url": "/updates?queries=",
+        "port": 8080,
+        "approach": "Realistic",
+        "classification": "Fullstack",
+        "database": "mysql",
+        "framework": "Today",
+        "language": "Java",
+        "flavor": "None",
+        "orm": "micro",
+        "platform": "Netty",
+        "webserver": "None",
+        "os": "Linux",
+        "database_os": "Linux",
+        "display_name": "Today",
+        "notes": "",
+        "versus": "None"
+      }
+    }
+  ]
+}

+ 63 - 0
frameworks/Java/today/build.gradle

@@ -0,0 +1,63 @@
+description = "benchmark"
+
+apply plugin: "java"
+apply plugin: "application"
+apply plugin: 'cn.taketoday.application'
+apply plugin: 'io.spring.dependency-management'
+
+configure(allprojects) {
+  group = "cn.taketoday.benchmark"
+
+  repositories {
+    mavenCentral()
+    maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
+  }
+}
+
+dependencies {
+  implementation 'cn.taketoday:today-starter-netty'
+  implementation 'cn.taketoday:today-starter-json'
+  implementation 'cn.taketoday:today-starter-jdbc'
+  implementation 'cn.taketoday:today-starter-web'
+  implementation 'cn.taketoday:today-starter-freemarker'
+
+  implementation 'mysql:mysql-connector-java'
+
+  implementation 'ch.qos.logback:logback-classic'
+
+  implementation('io.netty:netty-transport-native-epoll') {
+    artifact {
+      classifier = 'linux-x86_64'
+    }
+  }
+
+//  implementation('io.netty:netty-transport-native-kqueue') {
+//    artifact {
+//      classifier = 'osx-aarch_64'
+//    }
+//  }
+
+}
+
+java {
+  sourceCompatibility = JavaVersion.VERSION_17
+  targetCompatibility = JavaVersion.VERSION_17
+}
+
+application {
+  mainClass = 'cn.taketoday.benchmark.BenchmarkApplication'
+  applicationDefaultJvmArgs = [
+      "-server",
+      "-XX:+UseNUMA",
+      "-XX:+UseG1GC",
+      "-XX:+DisableExplicitGC",
+      "-XX:-StackTraceInThrowable",
+      "-XX:+UseStringDeduplication",
+      "-Dinfra.profiles.active=test",
+      "-Dio.netty.buffer.checkBounds=false",
+      "-Dio.netty.buffer.checkAccessible=false",
+      "-Dio.netty.leakDetection.level=disabled",
+      "--add-opens=java.base/java.nio=ALL-UNNAMED",
+      "--add-opens=java.base/sun.nio.ch=ALL-UNNAMED"
+  ]
+}

+ 20 - 0
frameworks/Java/today/config.toml

@@ -0,0 +1,20 @@
+[framework]
+name = "today"
+
+[main]
+urls.plaintext = "/plaintext"
+urls.json = "/json"
+urls.db = "/db"
+urls.query = "/queries?queries="
+urls.update = "/updates?queries="
+urls.fortune = "/fortunes"
+approach = "Realistic"
+classification = "Fullstack"
+database = "mysql"
+database_os = "Linux"
+display_name = "today"
+os = "Linux"
+orm = "raw"
+platform = "Netty"
+webserver = "None"
+versus = "None"

+ 7 - 0
frameworks/Java/today/gradle.properties

@@ -0,0 +1,7 @@
+version=1.0.0
+#infraVersion=4.0.0-Draft.6-SNAPSHOT
+infraVersion=4.0.0-Draft.6
+
+org.gradle.caching=true
+org.gradle.jvmargs=-Xmx2048m
+org.gradle.parallel=true

+ 15 - 0
frameworks/Java/today/settings.gradle

@@ -0,0 +1,15 @@
+buildscript {
+  repositories {
+    mavenLocal()
+    maven {
+      url "https://oss.sonatype.org/content/repositories/snapshots/"
+    }
+    mavenCentral()
+  }
+
+  dependencies {
+    classpath "cn.taketoday:infra-gradle-plugin:$infraVersion"
+  }
+}
+
+rootProject.name = 'today'

+ 70 - 0
frameworks/Java/today/src/main/java/cn/taketoday/benchmark/AppConfig.java

@@ -0,0 +1,70 @@
+package cn.taketoday.benchmark;
+
+import java.time.ZonedDateTime;
+
+import javax.sql.DataSource;
+
+import cn.taketoday.beans.factory.annotation.DisableAllDependencyInjection;
+import cn.taketoday.beans.factory.config.BeanDefinition;
+import cn.taketoday.context.annotation.Configuration;
+import cn.taketoday.context.annotation.Role;
+import cn.taketoday.framework.web.netty.NettyRequestConfig;
+import cn.taketoday.framework.web.netty.SendErrorHandler;
+import cn.taketoday.jdbc.RepositoryManager;
+import cn.taketoday.jdbc.persistence.EntityManager;
+import cn.taketoday.stereotype.Component;
+import io.netty.handler.codec.http.DefaultHttpHeadersFactory;
+import io.netty.handler.codec.http.HttpHeaders;
+import io.netty.handler.codec.http.HttpHeadersFactory;
+import io.netty.handler.codec.http.multipart.DefaultHttpDataFactory;
+
+import static cn.taketoday.http.HttpHeaders.DATE_FORMATTER;
+
+/**
+ * @author <a href="https://github.com/TAKETODAY">Harry Yang</a>
+ * @since 1.0 2024/3/19 12:59
+ */
+@DisableAllDependencyInjection
+@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
+@Configuration(proxyBeanMethods = false)
+class AppConfig {
+
+  private static final DefaultHttpHeadersFactory headersFactory = DefaultHttpHeadersFactory.headersFactory();
+
+  @Component
+  static RepositoryManager repositoryManager(DataSource dataSource) {
+    return new RepositoryManager(dataSource);
+  }
+
+  @Component
+  static EntityManager entityManager(RepositoryManager repositoryManager) {
+    return repositoryManager.getEntityManager();
+  }
+
+  @Component
+  @Role(BeanDefinition.ROLE_INFRASTRUCTURE)
+  static NettyRequestConfig nettyRequestConfig(SendErrorHandler sendErrorHandler) {
+    var factory = new DefaultHttpDataFactory(false);
+    return NettyRequestConfig.forBuilder()
+            .httpDataFactory(factory)
+            .sendErrorHandler(sendErrorHandler)
+            .headersFactory(new HttpHeadersFactory() {
+
+              @Override
+              public HttpHeaders newHeaders() {
+                HttpHeaders headers = headersFactory.newHeaders();
+                headers.set("Server", "TODAY");
+                headers.set("Date", DATE_FORMATTER.format(ZonedDateTime.now()));
+                return headers;
+              }
+
+              @Override
+              public HttpHeaders newEmptyHeaders() {
+                return headersFactory.newEmptyHeaders();
+              }
+            })
+            .secure(false)
+            .build();
+  }
+
+}

+ 13 - 0
frameworks/Java/today/src/main/java/cn/taketoday/benchmark/BenchmarkApplication.java

@@ -0,0 +1,13 @@
+package cn.taketoday.benchmark;
+
+import cn.taketoday.framework.Application;
+import cn.taketoday.framework.InfraApplication;
+
+@InfraApplication
+public class BenchmarkApplication {
+
+  public static void main(String[] args) {
+    Application.run(BenchmarkApplication.class, args);
+  }
+
+}

+ 120 - 0
frameworks/Java/today/src/main/java/cn/taketoday/benchmark/http/BenchmarkHttpHandler.java

@@ -0,0 +1,120 @@
+package cn.taketoday.benchmark.http;
+
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.ThreadLocalRandom;
+import java.util.stream.IntStream;
+
+import cn.taketoday.benchmark.model.Fortune;
+import cn.taketoday.benchmark.model.World;
+import cn.taketoday.http.MediaType;
+import cn.taketoday.http.ResponseEntity;
+import cn.taketoday.jdbc.persistence.EntityManager;
+import cn.taketoday.lang.Nullable;
+import cn.taketoday.ui.Model;
+import cn.taketoday.web.annotation.GET;
+import cn.taketoday.web.annotation.RestController;
+import cn.taketoday.web.view.ViewRef;
+
+/**
+ * @author <a href="https://github.com/TAKETODAY">Harry Yang</a>
+ * @since 1.0 2024/3/19 12:56
+ */
+@RestController
+final class BenchmarkHttpHandler {
+
+  private static final int MIN_WORLD_NUMBER = 1;
+  private static final int MAX_WORLD_NUMBER = 10_000;
+
+  private final EntityManager entityManager;
+
+  BenchmarkHttpHandler(EntityManager entityManager) {
+    this.entityManager = entityManager;
+  }
+
+  @GET("/json")
+  public ResponseEntity<Map<String, String>> json() {
+    return ResponseEntity.ok()
+            .contentType(MediaType.APPLICATION_JSON)
+            .body(Map.of("message", "Hello, World!"));
+  }
+
+  @GET("/plaintext")
+  public String plaintext() {
+    return "Hello, World!";
+  }
+
+  @GET("/db")
+  public World db() {
+    return entityManager.findById(World.class, nextInt());
+  }
+
+  @GET("/queries")
+  public List<World> queries(@Nullable String queries) {
+    return randomNumbers()
+            .mapToObj(this::findWorldById)
+            .limit(parseQueryCount(queries))
+            .toList();
+  }
+
+  @GET("/updates")
+  public List<World> updates(@Nullable String queries) {
+    return randomNumbers()
+            .mapToObj(this::findWorldById)
+            .filter(Objects::nonNull)
+            .peek(world -> {
+              world.setRandomNumber(nextInt());
+              entityManager.updateById(world);
+            })
+            .limit(parseQueryCount(queries))
+            .toList();
+  }
+
+  @GET("/fortunes")
+  public ViewRef fortunes(Model model) {
+    List<Fortune> fortunes = entityManager.find(Fortune.class);
+    fortunes.add(new Fortune(0, "Additional fortune added at request time."));
+    fortunes.sort(Comparator.comparing(Fortune::getMessage));
+
+    model.addAttribute("fortunes", fortunes);
+    return ViewRef.forViewName("fortunes");
+  }
+
+  @Nullable
+  private World findWorldById(int id) {
+    return entityManager.findById(World.class, boxed[id]);
+  }
+
+  //
+
+  private static IntStream randomNumbers() {
+    return ThreadLocalRandom.current()
+            .ints(MIN_WORLD_NUMBER, MAX_WORLD_NUMBER)
+            .distinct();
+  }
+
+  private static final Integer[] boxed = IntStream.range(MIN_WORLD_NUMBER, MAX_WORLD_NUMBER + 1)
+          .boxed()
+          .toArray(Integer[]::new);
+
+  private static Integer nextInt() {
+    return boxed[ThreadLocalRandom.current().nextInt(MIN_WORLD_NUMBER, MAX_WORLD_NUMBER)];
+  }
+
+  private static int parseQueryCount(@Nullable String textValue) {
+    if (textValue == null) {
+      return 1;
+    }
+    int parsedValue;
+    try {
+      parsedValue = Integer.parseInt(textValue);
+    }
+    catch (NumberFormatException e) {
+      return 1;
+    }
+    return Math.min(500, Math.max(1, parsedValue));
+  }
+
+}

+ 54 - 0
frameworks/Java/today/src/main/java/cn/taketoday/benchmark/model/Fortune.java

@@ -0,0 +1,54 @@
+package cn.taketoday.benchmark.model;
+
+import java.util.Objects;
+
+import cn.taketoday.jdbc.persistence.Id;
+import cn.taketoday.jdbc.persistence.Table;
+
+@Table("fortune")
+public class Fortune {
+
+  @Id
+  private Integer id;
+
+  private String message;
+
+  public Fortune() { }
+
+  public Fortune(Integer id, String message) {
+    this.id = id;
+    this.message = message;
+  }
+
+  public void setId(Integer id) {
+    this.id = id;
+  }
+
+  public void setMessage(String message) {
+    this.message = message;
+  }
+
+  public Integer getId() {
+    return id;
+  }
+
+  public String getMessage() {
+    return message;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o)
+      return true;
+    if (!(o instanceof Fortune fortune))
+      return false;
+    return Objects.equals(id, fortune.id)
+            && Objects.equals(message, fortune.message);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(id, message);
+  }
+
+}

+ 55 - 0
frameworks/Java/today/src/main/java/cn/taketoday/benchmark/model/World.java

@@ -0,0 +1,55 @@
+package cn.taketoday.benchmark.model;
+
+import java.util.Objects;
+
+import cn.taketoday.jdbc.persistence.Column;
+import cn.taketoday.jdbc.persistence.Id;
+import cn.taketoday.jdbc.persistence.Table;
+
+@Table("world")
+public class World {
+
+  @Id
+  private Integer id;
+
+  @Column("randomNumber")
+  private Integer randomNumber;
+
+  public World() { }
+
+  public World(Integer id, Integer randomNumber) {
+    this.id = id;
+    this.randomNumber = randomNumber;
+  }
+
+  public Integer getId() {
+    return id;
+  }
+
+  public Integer getRandomNumber() {
+    return randomNumber;
+  }
+
+  public void setId(Integer id) {
+    this.id = id;
+  }
+
+  public void setRandomNumber(Integer randomNumber) {
+    this.randomNumber = randomNumber;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o)
+      return true;
+    if (!(o instanceof World world))
+      return false;
+    return Objects.equals(id, world.id)
+            && Objects.equals(randomNumber, world.randomNumber);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(id, randomNumber);
+  }
+}

+ 9 - 0
frameworks/Java/today/src/main/resources/application-dev.yaml

@@ -0,0 +1,9 @@
+datasource:
+  url: jdbc:mysql://localhost:3306/hello_world?useUnicode=true&characterEncoding=utf8&useSSL=false&autoReconnect=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
+  username: root
+  password: 88888888
+
+logging:
+  level:
+    root: info
+    sql: debug

+ 14 - 0
frameworks/Java/today/src/main/resources/application-test.yaml

@@ -0,0 +1,14 @@
+datasource:
+  url: jdbc:mysql://tfb-database:3306/hello_world?useUnicode=true&characterEncoding=utf8&useSSL=false&autoReconnect=true&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
+  username: benchmarkdbuser
+  password: benchmarkdbpass
+
+logging:
+  level:
+    root: info
+
+server:
+  netty:
+    acceptor-threads: 4
+    worker-threads: 8
+    max-connection: 65535

+ 41 - 0
frameworks/Java/today/src/main/resources/application.yaml

@@ -0,0 +1,41 @@
+app:
+  name: benchmark-app
+
+server:
+  port: 8080
+
+infra:
+  output:
+    ansi:
+      enabled: always
+
+freemarker:
+  cache: true
+  settings:
+    classic_compatible: true
+    date_format: yyyy-MM-dd
+    datetime_format: yyyy-MM-dd HH:mm:ss
+    default_encoding: UTF-8
+    locale: UTF-8
+    log_template_exceptions: false
+    number_format: 0.####
+    tag_syntax: auto_detect
+    template_exception_handler: ignore
+    template_update_delay: 0
+    time_format: HH:mm:ss
+    url_escaping_charset: UTF-8
+
+datasource:
+  name: 'app-datasource'
+  type: com.zaxxer.hikari.HikariDataSource
+  driver-class-name: com.mysql.cj.jdbc.Driver
+  hikari:
+    maximum-pool-size: 20
+    max-lifetime: 120000
+    connection-test-query: 'select 1'
+
+logging:
+  level:
+    root: OFF
+  pattern:
+    dateformat: 'yyyy-MM-dd HH:mm:ss.SSS'

+ 21 - 0
frameworks/Java/today/src/main/resources/templates/fortunes.ftl

@@ -0,0 +1,21 @@
+<#-- @ftlvariable name="fortunes" type="cn.taketoday.benchmark.model.Fortune[]" -->
+<!DOCTYPE html>
+<html>
+<head>
+  <title>Fortunes</title>
+</head>
+<body>
+<table>
+  <tr>
+    <th>id</th>
+    <th>message</th>
+  </tr>
+    <#list fortunes as fortune>
+      <tr>
+        <td>#{fortune.id}</td>
+        <td>${fortune.message?html}</td>
+      </tr>
+    </#list>
+</table>
+</body>
+</html>

+ 11 - 0
frameworks/Java/today/today.dockerfile

@@ -0,0 +1,11 @@
+FROM gradle:8.6.0-jdk17 as build
+COPY --chown=gradle:gradle . /home/gradle/src
+WORKDIR /home/gradle/src
+RUN gradle installInfraDist --no-daemon
+
+FROM openjdk:21
+WORKDIR /today
+COPY --from=build /home/gradle/src/build/install/today-infra-app/ ./
+
+EXPOSE 8080
+ENTRYPOINT "./bin/today"

+ 1 - 1
frameworks/Java/undertow-jersey/pom.xml

@@ -174,7 +174,7 @@
     <dependency>
       <groupId>io.undertow</groupId>
       <artifactId>undertow-core</artifactId>
-      <version>2.3.5.Final</version>
+      <version>2.3.12.Final</version>
     </dependency>
 
     <dependency>

+ 1 - 1
frameworks/Java/undertow/pom.xml

@@ -20,7 +20,7 @@
     <maven-jar-plugin.version>3.2.2</maven-jar-plugin.version>
     <mustache.version>0.9.10</mustache.version>
     <postgresql.version>42.7.2</postgresql.version>
-    <undertow.version>2.3.5.Final</undertow.version>
+    <undertow.version>2.3.12.Final</undertow.version>
   </properties>
 
   <dependencies>

+ 1 - 1
frameworks/JavaScript/express/package.json

@@ -8,7 +8,7 @@
     "escape-html": "1.0.3",
     "express": "4.18.2",
     "mongoose": "5.13.20",
-    "mysql2": "2.2.5",
+    "mysql2": "3.9.7",
     "pg": "8.5.0",
     "pg-promise": "10.7.3",
     "pug": "2.0.1",

+ 1 - 1
frameworks/JavaScript/fastify/package.json

@@ -10,7 +10,7 @@
     "handlebars": "4.7.6",
     "knex": "2.4.2",
     "mongodb": "3.5.9",
-    "mysql2": "2.2.5",
+    "mysql2": "3.9.7",
     "pg": "8.5.1"
   }
 }

+ 1 - 1
frameworks/JavaScript/hapi/package.json

@@ -10,7 +10,7 @@
     "handlebars": "4.3.0",
     "mongoose": "5.13.20",
     "mysql": "2.16.0",
-    "mysql2": "1.6.5",
+    "mysql2": "3.9.7",
     "pg": "8.5.1",
     "pg-hstore": "2.3.2",
     "sequelize": "6.29.0"

+ 7 - 7
frameworks/JavaScript/hono/package-lock.json

@@ -9,23 +9,23 @@
       "version": "0.0.1",
       "license": "MIT",
       "dependencies": {
-        "@hono/node-server": "^1.4.1",
+        "@hono/node-server": "^1.10.1",
         "hono": "^3.10.4",
         "postgres": "^3.4.3"
       }
     },
     "node_modules/@hono/node-server": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.4.1.tgz",
-      "integrity": "sha512-7jB8iMs6T2FhREs4Ugk+7rzn7d5aC6wEX3FAy67ZafzcQqqBVggcLkFPCMauaFJJyjc+bFvMOdFxJXKYsBM6MQ==",
+      "version": "1.10.1",
+      "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.10.1.tgz",
+      "integrity": "sha512-5BKW25JH5PQKPDkTcIgv3yNUPtOAbnnjFFgWvIxxAY/B/ZNeYjjWoAeDmqhIiCgOAJ3Tauuw+0G+VainhuZRYQ==",
       "engines": {
         "node": ">=18.14.1"
       }
     },
     "node_modules/hono": {
-      "version": "3.11.7",
-      "resolved": "https://registry.npmjs.org/hono/-/hono-3.11.7.tgz",
-      "integrity": "sha512-TcfAq7IdipF+9coxnuzYlSSBXbm9mTyWjjagLCv/2ampboNcKJdi+XCK5G48mHQtpI5+9Rj3J4FfcGgw9vzIww==",
+      "version": "3.12.12",
+      "resolved": "https://registry.npmjs.org/hono/-/hono-3.12.12.tgz",
+      "integrity": "sha512-5IAMJOXfpA5nT+K0MNjClchzz0IhBHs2Szl7WFAhrFOsbtQsYmNynFyJRg/a3IPsmCfxcrf8txUGiNShXpK5Rg==",
       "engines": {
         "node": ">=16.0.0"
       }

+ 1 - 1
frameworks/JavaScript/hono/package.json

@@ -1,6 +1,6 @@
 {
   "dependencies": {
-    "@hono/node-server": "^1.4.1",
+    "@hono/node-server": "^1.10.1",
     "hono": "^3.10.4",
     "postgres": "^3.4.3"
   },

+ 1 - 1
frameworks/JavaScript/koa/package.json

@@ -12,7 +12,7 @@
     "koa-hbs": "1.0.0",
     "koa-router": "7.4.0",
     "mongoose": "5.13.20",
-    "mysql2": "1.5.3",
+    "mysql2": "3.9.7",
     "pg": "8.5.1",
     "pg-hstore": "2.3.2",
     "sequelize": "6.29.0"

+ 1 - 1
frameworks/JavaScript/nodejs/package.json

@@ -8,7 +8,7 @@
     "mongodb": "3.7.3",
     "mongoose": "5.13.20",
     "mysql": "2.16.0",
-    "mysql2": "1.6.5",
+    "mysql2": "3.9.7",
     "parseurl": "1.3.2",
     "pg": "8.5.0",
     "pg-hstore": "2.3.2",

+ 1 - 1
frameworks/JavaScript/sailsjs/package.json

@@ -10,7 +10,7 @@
     "ejs": "2.5.7",
     "handlebars": "4.7.6",
     "mysql": "2.16.0",
-    "mysql2": "1.6.5",
+    "mysql2": "3.9.7",
     "pg": "6.0.5",
     "pg-hstore": "2.3.2",
     "rc": "1.1.6",

+ 31 - 55
frameworks/JavaScript/spliffy/package-lock.json

@@ -1073,9 +1073,9 @@
       "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
     },
     "denque": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz",
-      "integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ=="
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
+      "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw=="
     },
     "etag": {
       "version": "1.8.1",
@@ -1135,7 +1135,7 @@
     "is-property": {
       "version": "1.0.2",
       "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
-      "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ="
+      "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g=="
     },
     "isarray": {
       "version": "0.0.1",
@@ -1152,17 +1152,14 @@
       }
     },
     "long": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz",
-      "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA=="
+      "version": "5.2.3",
+      "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz",
+      "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q=="
     },
     "lru-cache": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
-      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
-      "requires": {
-        "yallist": "^4.0.0"
-      }
+      "version": "8.0.5",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz",
+      "integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA=="
     },
     "memory-pager": {
       "version": "1.5.0",
@@ -1192,48 +1189,32 @@
       }
     },
     "mysql2": {
-      "version": "2.2.5",
-      "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.2.5.tgz",
-      "integrity": "sha512-XRqPNxcZTpmFdXbJqb+/CtYVLCx14x1RTeNMD4954L331APu75IC74GDqnZMEt1kwaXy6TySo55rF2F3YJS78g==",
+      "version": "3.9.7",
+      "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.9.7.tgz",
+      "integrity": "sha512-KnJT8vYRcNAZv73uf9zpXqNbvBG7DJrs+1nACsjZP1HMJ1TgXEy8wnNilXAn/5i57JizXKtrUtwDB7HxT9DDpw==",
       "requires": {
-        "denque": "^1.4.1",
+        "denque": "^2.1.0",
         "generate-function": "^2.3.1",
-        "iconv-lite": "^0.6.2",
-        "long": "^4.0.0",
-        "lru-cache": "^6.0.0",
-        "named-placeholders": "^1.1.2",
+        "iconv-lite": "^0.6.3",
+        "long": "^5.2.1",
+        "lru-cache": "^8.0.0",
+        "named-placeholders": "^1.1.3",
         "seq-queue": "^0.0.5",
         "sqlstring": "^2.3.2"
-      },
-      "dependencies": {
-        "sqlstring": {
-          "version": "2.3.2",
-          "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz",
-          "integrity": "sha512-vF4ZbYdKS8OnoJAWBmMxCQDkiEBkGQYU7UZPtL8flbDRSNkhaXvRJ279ZtI6M+zDaQovVU4tuRgzK5fVhvFAhg=="
-        }
       }
     },
     "named-placeholders": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz",
-      "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==",
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz",
+      "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==",
       "requires": {
-        "lru-cache": "^4.1.3"
+        "lru-cache": "^7.14.1"
       },
       "dependencies": {
         "lru-cache": {
-          "version": "4.1.5",
-          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
-          "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
-          "requires": {
-            "pseudomap": "^1.0.2",
-            "yallist": "^2.1.2"
-          }
-        },
-        "yallist": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
-          "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI="
+          "version": "7.18.3",
+          "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
+          "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="
         }
       }
     },
@@ -1377,11 +1358,6 @@
         "xtend": "^4.0.0"
       }
     },
-    "pseudomap": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
-      "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM="
-    },
     "punycode": {
       "version": "2.3.0",
       "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
@@ -1410,7 +1386,7 @@
     "seq-queue": {
       "version": "0.0.5",
       "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz",
-      "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4="
+      "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q=="
     },
     "smart-buffer": {
       "version": "4.2.0",
@@ -1443,6 +1419,11 @@
         "readable-stream": "^3.0.0"
       }
     },
+    "sqlstring": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz",
+      "integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg=="
+    },
     "string_decoder": {
       "version": "1.3.0",
       "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
@@ -1503,11 +1484,6 @@
       "version": "4.0.2",
       "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
       "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
-    },
-    "yallist": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
     }
   }
 }

+ 1 - 1
frameworks/JavaScript/spliffy/package.json

@@ -6,7 +6,7 @@
     "@srfnstack/spliffy": "0.6.1",
     "html-escaper": "3.0.3",
     "mongodb": "^4.17.0",
-    "mysql2": "^2.2.5",
+    "mysql2": "^3.9.7",
     "node-cache": "5.1.2",
     "pg": "8.6.0",
     "pg-native": "3.0.1"

+ 2 - 1
frameworks/PHP/php/php-h2o.dockerfile

@@ -1,4 +1,4 @@
-ARG UBUNTU_VERSION=22.04
+ARG UBUNTU_VERSION=24.04
 
 ARG H2O_PREFIX=/opt/h2o
 
@@ -22,6 +22,7 @@ RUN apt-get -yqq update && \
       libuv1-dev \
       libwslay-dev \
       libz-dev \
+      llvm-dev \
       ninja-build \
       pkg-config \
       rsync \

+ 2 - 2
frameworks/Pascal/mormot/setup_and_build.sh

@@ -27,7 +27,7 @@ rm -rf ./libs
 mkdir -p ./libs/mORMot/static
 # echo "Getting the latest pre-release URL..."
 # USED_TAG=$(wget -qO- https://api.github.com/repos/synopse/mORMot2/releases/latest | jq -r '.tag_name')
-USED_TAG="2.1.stable"
+USED_TAG="2.2.stable"
 
 echo "Used release tag $USED_TAG"
 URL="https://github.com/synopse/mORMot2/releases/download/$USED_TAG/mormot2static.tgz"
@@ -35,7 +35,7 @@ echo "Download statics from $URL ..."
 wget -qO- "$URL" | tar -xz -C ./libs/mORMot/static
 
 # uncomment for fixed commit URL
-URL=https://github.com/synopse/mORMot2/tarball/c68d24054ffd3e5d63ecb33a2eea49055948e816
+URL=https://github.com/synopse/mORMot2/tarball/7dc50900266f07454fe60b60e4a2755ce445ddeb
 #URL="https://api.github.com/repos/synopse/mORMot2/tarball/$USED_TAG"
 echo "Download and unpacking mORMot sources from $URL ..."
 wget -qO- "$URL" | tar -xz -C ./libs/mORMot  --strip-components=1

+ 13 - 8
frameworks/Pascal/mormot/src/raw.pas

@@ -46,7 +46,7 @@ uses
 type
   // data structures
   TMessageRec = packed record
-    message: RawUtf8;
+    message: PUtf8Char;
   end;
   TWorldRec = packed record
     id: integer;
@@ -55,7 +55,7 @@ type
   TWorlds = array of TWorldRec;
   TFortune = packed record
     id: integer;
-    message: RawUtf8;
+    message: PUtf8Char;
   end;
   TFortunes = array of TFortune;
 
@@ -277,6 +277,7 @@ var
   arr: TDynArray;
   n: integer;
   f: ^TFortune;
+  mus: TSynMustacheContextData;
 begin
   result := HTTP_BADREQUEST;
   if stmt = nil then
@@ -286,13 +287,16 @@ begin
   begin
     f := arr.NewPtr;
     f.id := stmt.ColumnInt(0);
-    f.message := stmt.ColumnUtf8(1);
+    f.message := stmt.ColumnPUtf8(1);
   end;
   f := arr.NewPtr;
   f.id := 0;
   f.message := FORTUNES_MESSAGE;
   arr.Sort(FortuneCompareByMessage);
-  ctxt.OutContent := fTemplate.RenderDataArray(arr);
+  mus := stmt.Connection.GetThreadOwned(TSynMustacheContextData);
+  if mus = nil then
+    mus := stmt.Connection.SetThreadOwned(fTemplate.NewMustacheContextData);
+  ctxt.OutContent := mus.RenderArray(arr);
   ctxt.OutContentType := HTML_CONTENT_TYPE;
   result := HTTP_SUCCESS;
 end;
@@ -310,7 +314,7 @@ function TRawAsyncServer.json(ctxt: THttpServerRequest): cardinal;
 var
   msgRec: TMessageRec;
 begin
-  msgRec.message := HELLO_WORLD;
+  msgRec.message := pointer(HELLO_WORLD);
   ctxt.SetOutJson(@msgRec, TypeInfo(TMessageRec));
   result := HTTP_SUCCESS;
 end;
@@ -471,7 +475,8 @@ begin
     W := TTextWriter.CreateOwnedStream(tmp{%H-});
     try
       W.AddShort('UPDATE world SET randomNumber = v.randomNumber FROM (VALUES');
-      for i := 1 to cnt do begin
+      for i := 1 to cnt do
+      begin
         W.AddShort('(?::integer, ?::integer)');
         W.Add(',');
       end;
@@ -702,9 +707,9 @@ begin
 
   // register some RTTI for records JSON serialization
   Rtti.RegisterFromText([
-    TypeInfo(TMessageRec), 'message:RawUtf8',
+    TypeInfo(TMessageRec), 'message:PUtf8Char',
     TypeInfo(TWorldRec),   'id,randomNumber:integer',
-    TypeInfo(TFortune),    'id:integer message:RawUtf8']);
+    TypeInfo(TFortune),    'id:integer message:PUtf8Char']);
 
   // compute default execution context from HW information
   cpuCount := CurrentCpuSet(cpuMask); // may run from a "taskset" command

+ 1 - 1
frameworks/Python/aiohttp/requirements.txt

@@ -1,4 +1,4 @@
-aiohttp==3.9.2
+aiohttp==3.9.4
 asyncpg==0.25.0
 cchardet==2.1.7
 gunicorn==20.1

+ 2 - 2
frameworks/Python/api_hour/requirements.txt

@@ -1,10 +1,10 @@
-aiohttp==3.9.2
+aiohttp==3.9.4
 -e git+https://github.com/Eyepea/aiohttp_jinja2.git@c9675e5c1e1ee7741b30aea8d8fbffcde016c7a0#egg=aiohttp_jinja2-master
 aiopg==0.7.0
 -e git+https://github.com/Eyepea/API-Hour.git@577abbdcbb8cc2810dad46e260b338b15db4d0e3#egg=api_hour-master
 asyncio-redis==0.13.4
 chardet==2.3.0
-gunicorn==19.9.0
+gunicorn==22.0.0
 hiredis==0.2.0
 Jinja2==3.1.3
 MarkupSafe==0.23

+ 1 - 1
frameworks/Python/blacksheep/requirements-gunicorn.txt

@@ -1 +1 @@
-gunicorn==20.1.0
+gunicorn==22.0.0

+ 1 - 1
frameworks/Python/bottle/requirements.txt

@@ -2,7 +2,7 @@ bottle==0.12.19
 bottle-sqlalchemy==0.4.3
 greenlet==0.4.14
 gunicorn==19.9.0
-meinheld==0.6.1
+meinheld==1.0.2
 mysqlclient==1.3.12
 SQLAlchemy==1.3.0
 ujson==1.35

+ 1 - 1
frameworks/Python/eve/requirements.txt

@@ -3,6 +3,6 @@ Flask==1.0
 greenlet==0.4.14
 gunicorn==19.9.0
 itsdangerous==0.24
-meinheld==0.6.1
+meinheld==1.0.2
 uWSGI==2.0.22
 Werkzeug==0.15.5

+ 1 - 1
frameworks/Python/heaven/requirements.txt

@@ -1,4 +1,4 @@
 asyncpg==0.29.0
 heaven==0.2.4
 orjson==3.9.15
-gunicorn==20.1.0
+gunicorn==22.0.0

+ 1 - 1
frameworks/Python/morepath/requirements.txt

@@ -4,7 +4,7 @@ gunicorn==19.9.0
 importscan==0.1
 Jinja2==2.11.3
 MarkupSafe==1.0
-meinheld==0.6.1
+meinheld==1.0.2
 more.jinja2==0.2
 more.pony==0.1
 morepath==0.18.1

+ 1 - 1
frameworks/Python/panther/requirements.txt

@@ -5,7 +5,7 @@ jinja2==3.1.2
 
 asyncpg==0.29.0
 
-gunicorn==21.2.0
+gunicorn==22.0.0
 uvicorn==0.24.0
 uvloop==0.19.0
 httptools==0.6.1

+ 3 - 1
frameworks/Python/pyramid/requirements.txt

@@ -8,12 +8,14 @@ chameleon==3.9.1
     # via pyramid-chameleon
 greenlet==1.1.2
     # via sqlalchemy
-gunicorn==20.1.0
+gunicorn==22.0.0
     # via -r requirements.in
 hupper==1.10.3
     # via pyramid
 orjson==3.9.15
     # via -r requirements.in
+packaging==24.0
+    # via gunicorn
 pastedeploy==2.1.1
     # via plaster-pastedeploy
 plaster==1.0

+ 1 - 1
frameworks/Python/quart/requirements-uvicorn.txt

@@ -1,5 +1,5 @@
 anyio==3.6.1
-gunicorn==20.1.0
+gunicorn==22.0.0
 httptools==0.4.0
 idna==3.7
 python-dotenv==0.20.0

+ 1 - 1
frameworks/Python/responder/requirements.txt

@@ -1,5 +1,5 @@
 asyncpg==0.21.0
-gunicorn==20.0.4
+gunicorn==22.0.0
 Jinja2==3.1.3
 ujson==2.0.3
 uvloop==0.17.0

+ 1 - 1
frameworks/Python/routerling/requirements.txt

@@ -1,7 +1,7 @@
 asgiref==3.4.1
 asyncpg==0.24.0
 click==8.0.1
-gunicorn==20.1.0
+gunicorn==22.0.0
 h11==0.12.0
 Jinja2==3.1.3
 MarkupSafe==2.0.1

+ 1 - 1
frameworks/Python/turbogears/requirements.txt

@@ -6,5 +6,5 @@ mysqlclient==1.3.7
 jinja2==2.11.3
 
 gunicorn==19.9.0
-meinheld==0.6.1
+meinheld==1.0.2
 greenlet==0.4.14

+ 1 - 1
frameworks/Python/uvicorn/requirements.txt

@@ -1,5 +1,5 @@
 asyncpg==0.28.0
-gunicorn==20.1.0
+gunicorn==22.0.0
 httptools==0.6.0
 Jinja2==3.1.3
 ujson==5.8.0

+ 1 - 1
frameworks/Python/web2py/requirements.txt

@@ -1,4 +1,4 @@
 mysqlclient==1.3.12
 gunicorn==19.7.1
-meinheld==0.6.1
+meinheld==1.0.2
 greenlet==0.4.14

+ 1 - 1
frameworks/Python/weppy/requirements.txt

@@ -1,6 +1,6 @@
 psycopg2==2.7.5
 weppy==1.3
 gunicorn==19.9.0
-meinheld==0.6.1
+meinheld==1.0.2
 uwsgi==2.0.22
 greenlet==0.4.14

+ 1 - 1
frameworks/Python/wsgi/requirements.txt

@@ -1,4 +1,4 @@
 ujson==1.35
 gunicorn==19.9.0
-meinheld==0.6.1
+meinheld==1.0.2
 greenlet==0.4.14

+ 2 - 1
frameworks/Ruby/h2o_mruby/h2o_mruby.dockerfile

@@ -1,4 +1,4 @@
-ARG UBUNTU_VERSION=22.04
+ARG UBUNTU_VERSION=24.04
 
 ARG H2O_PREFIX=/opt/h2o
 
@@ -22,6 +22,7 @@ RUN apt-get -yqq update && \
       libuv1-dev \
       libwslay-dev \
       libz-dev \
+      llvm-dev \
       ninja-build \
       pkg-config \
       rsync \

+ 2 - 2
frameworks/Rust/axum/Cargo.lock

@@ -1793,9 +1793,9 @@ dependencies = [
 
 [[package]]
 name = "rustls"
-version = "0.21.10"
+version = "0.21.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba"
+checksum = "7fecbfb7b1444f477b345853b1fce097a2c6fb637b2bfb87e6bc5db0f043fae4"
 dependencies = [
  "log",
  "ring",

+ 180 - 178
frameworks/Rust/ohkami/Cargo.lock

@@ -19,9 +19,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
 
 [[package]]
 name = "ahash"
-version = "0.8.8"
+version = "0.8.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "42cd52102d3df161c77a887b608d7a4897d7cc112886a9537b738a887a03aaff"
+checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011"
 dependencies = [
  "cfg-if",
  "getrandom",
@@ -32,18 +32,18 @@ dependencies = [
 
 [[package]]
 name = "aho-corasick"
-version = "1.1.2"
+version = "1.1.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0"
+checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
 dependencies = [
  "memchr",
 ]
 
 [[package]]
 name = "allocator-api2"
-version = "0.2.16"
+version = "0.2.18"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5"
+checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f"
 
 [[package]]
 name = "annotate-snippets"
@@ -64,27 +64,17 @@ dependencies = [
  "num-traits",
 ]
 
-[[package]]
-name = "atomic-write-file"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "edcdbedc2236483ab103a53415653d6b4442ea6141baf1ffa85df29635e88436"
-dependencies = [
- "nix",
- "rand",
-]
-
 [[package]]
 name = "autocfg"
-version = "1.1.0"
+version = "1.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+checksum = "f1fdabc7756949593fe60f30ec81974b613357de856987752631dea1e3394c80"
 
 [[package]]
 name = "backtrace"
-version = "0.3.69"
+version = "0.3.71"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837"
+checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d"
 dependencies = [
  "addr2line",
  "cc",
@@ -115,9 +105,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
 
 [[package]]
 name = "bitflags"
-version = "2.4.2"
+version = "2.5.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf"
+checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1"
 dependencies = [
  "serde",
 ]
@@ -133,9 +123,9 @@ dependencies = [
 
 [[package]]
 name = "byte_reader"
-version = "2.0.0"
+version = "3.0.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "087a18fc062e9ae6d8c0fc7d9afc22e373f3eda1244379eefabff7e2b2cad206"
+checksum = "0fac67f5455e694831246ed9a2d62c98dbb7586281dcfaba6621888ac9b576df"
 
 [[package]]
 name = "byteorder"
@@ -145,18 +135,15 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
 
 [[package]]
 name = "bytes"
-version = "1.5.0"
+version = "1.6.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223"
+checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9"
 
 [[package]]
 name = "cc"
-version = "1.0.83"
+version = "1.0.95"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0"
-dependencies = [
- "libc",
-]
+checksum = "d32a725bc159af97c3e629873bb9f88fb8cf8a4867175f76dc987815ea07c83b"
 
 [[package]]
 name = "cfg-if"
@@ -203,9 +190,9 @@ dependencies = [
 
 [[package]]
 name = "crc"
-version = "3.0.1"
+version = "3.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe"
+checksum = "69e6e4d7b33a94f0991c26729976b10ebde1d34c3ee82408fb536164fa10d636"
 dependencies = [
  "crc-catalog",
 ]
@@ -243,9 +230,9 @@ dependencies = [
 
 [[package]]
 name = "der"
-version = "0.7.8"
+version = "0.7.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c"
+checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0"
 dependencies = [
  "const-oid",
  "pem-rfc7468",
@@ -291,9 +278,9 @@ checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653"
 
 [[package]]
 name = "either"
-version = "1.10.0"
+version = "1.11.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a"
+checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2"
 dependencies = [
  "serde",
 ]
@@ -333,9 +320,9 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0"
 
 [[package]]
 name = "fastrand"
-version = "2.0.1"
+version = "2.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5"
+checksum = "658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984"
 
 [[package]]
 name = "finl_unicode"
@@ -430,7 +417,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.49",
+ "syn 2.0.60",
 ]
 
 [[package]]
@@ -474,9 +461,9 @@ dependencies = [
 
 [[package]]
 name = "getrandom"
-version = "0.2.12"
+version = "0.2.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5"
+checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c"
 dependencies = [
  "cfg-if",
  "libc",
@@ -519,9 +506,9 @@ dependencies = [
 
 [[package]]
 name = "hermit-abi"
-version = "0.3.6"
+version = "0.3.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd"
+checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
 
 [[package]]
 name = "hex"
@@ -568,9 +555,9 @@ dependencies = [
 
 [[package]]
 name = "indexmap"
-version = "2.2.3"
+version = "2.2.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177"
+checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26"
 dependencies = [
  "equivalent",
  "hashbrown",
@@ -587,9 +574,9 @@ dependencies = [
 
 [[package]]
 name = "itoa"
-version = "1.0.10"
+version = "1.0.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c"
+checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
 
 [[package]]
 name = "lazy_static"
@@ -641,9 +628,9 @@ dependencies = [
 
 [[package]]
 name = "log"
-version = "0.4.20"
+version = "0.4.21"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
+checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c"
 
 [[package]]
 name = "md-5"
@@ -657,9 +644,9 @@ dependencies = [
 
 [[package]]
 name = "memchr"
-version = "2.7.1"
+version = "2.7.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149"
+checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d"
 
 [[package]]
 name = "minimal-lexical"
@@ -678,9 +665,9 @@ dependencies = [
 
 [[package]]
 name = "mio"
-version = "0.8.10"
+version = "0.8.11"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09"
+checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c"
 dependencies = [
  "libc",
  "wasi",
@@ -705,17 +692,6 @@ dependencies = [
  "tempfile",
 ]
 
-[[package]]
-name = "nix"
-version = "0.27.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053"
-dependencies = [
- "bitflags 2.4.2",
- "cfg-if",
- "libc",
-]
-
 [[package]]
 name = "nom"
 version = "7.1.3"
@@ -794,14 +770,15 @@ dependencies = [
 
 [[package]]
 name = "ohkami"
-version = "0.15.0"
+version = "0.17.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0e19a311d70d741f4a08f54374df6501bc2ebde819b5a69b95763ea2335f5f19"
+checksum = "ffca2ddf66df3484fd9dfa7f88f923e2082b9934dc7e247616002f8bf71ec81c"
 dependencies = [
  "byte_reader",
  "hmac",
  "ohkami_lib",
  "ohkami_macros",
+ "rustc-hash",
  "serde",
  "serde_json",
  "sha2",
@@ -810,7 +787,7 @@ dependencies = [
 
 [[package]]
 name = "ohkami_framework_benchmarks"
-version = "0.15.0"
+version = "0.17.1"
 dependencies = [
  "futures-util",
  "ohkami",
@@ -822,15 +799,20 @@ dependencies = [
 
 [[package]]
 name = "ohkami_lib"
-version = "0.1.1"
+version = "0.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8bf187aa0f73c2b91d9ac5c7eb1437c8d1a015d765d4fc3db8113c90a82ae2a0"
+checksum = "a306cca964938b3e37157c716b4423f09026ceb4439ec5f9353265d03d217b72"
+dependencies = [
+ "byte_reader",
+ "percent-encoding",
+ "serde",
+]
 
 [[package]]
 name = "ohkami_macros"
-version = "0.6.0"
+version = "0.7.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "02c09a65693c4398af64b085040fe937f7d42d9b164306b5271fc169fa276db7"
+checksum = "1cdb435788e84e7262f0ee3fb1d206a4c1830ec17856eb0924b9d8c5f75c7519"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -845,11 +827,11 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
 
 [[package]]
 name = "openssl"
-version = "0.10.63"
+version = "0.10.64"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "15c9d69dd87a29568d4d017cfe8ec518706046a05184e5aea92d0af890b803c8"
+checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f"
 dependencies = [
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
  "cfg-if",
  "foreign-types",
  "libc",
@@ -866,7 +848,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.49",
+ "syn 2.0.60",
 ]
 
 [[package]]
@@ -877,9 +859,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
 
 [[package]]
 name = "openssl-sys"
-version = "0.9.99"
+version = "0.9.102"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "22e1bf214306098e4832460f797824c05d25aacdf896f64a985fb0fd992454ae"
+checksum = "c597637d56fbc83893a35eb0dd04b2b8e7a50c91e64e9493e398b5df4fb45fa2"
 dependencies = [
  "cc",
  "libc",
@@ -933,9 +915,9 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
 
 [[package]]
 name = "pin-project-lite"
-version = "0.2.13"
+version = "0.2.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58"
+checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02"
 
 [[package]]
 name = "pin-utils"
@@ -988,18 +970,18 @@ dependencies = [
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.78"
+version = "1.0.81"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae"
+checksum = "3d1597b0c024618f09a9c3b8655b7e430397a36d23fdafec26d6965e9eec3eba"
 dependencies = [
  "unicode-ident",
 ]
 
 [[package]]
 name = "quote"
-version = "1.0.35"
+version = "1.0.36"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef"
+checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
 dependencies = [
  "proc-macro2",
 ]
@@ -1045,9 +1027,9 @@ dependencies = [
 
 [[package]]
 name = "regex"
-version = "1.10.3"
+version = "1.10.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15"
+checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c"
 dependencies = [
  "aho-corasick",
  "memchr",
@@ -1057,9 +1039,9 @@ dependencies = [
 
 [[package]]
 name = "regex-automata"
-version = "0.4.5"
+version = "0.4.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd"
+checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea"
 dependencies = [
  "aho-corasick",
  "memchr",
@@ -1068,9 +1050,9 @@ dependencies = [
 
 [[package]]
 name = "regex-syntax"
-version = "0.8.2"
+version = "0.8.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
+checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56"
 
 [[package]]
 name = "rsa"
@@ -1098,6 +1080,12 @@ version = "0.1.23"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
 
+[[package]]
+name = "rustc-hash"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
+
 [[package]]
 name = "rustc_version"
 version = "0.4.0"
@@ -1109,11 +1097,11 @@ dependencies = [
 
 [[package]]
 name = "rustix"
-version = "0.38.31"
+version = "0.38.34"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949"
+checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f"
 dependencies = [
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
  "errno",
  "libc",
  "linux-raw-sys",
@@ -1122,9 +1110,9 @@ dependencies = [
 
 [[package]]
 name = "ryu"
-version = "1.0.16"
+version = "1.0.17"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c"
+checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1"
 
 [[package]]
 name = "schannel"
@@ -1143,9 +1131,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
 
 [[package]]
 name = "security-framework"
-version = "2.9.2"
+version = "2.10.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de"
+checksum = "770452e37cad93e0a50d5abc3990d2bc351c36d0328f86cefec2f2fb206eaef6"
 dependencies = [
  "bitflags 1.3.2",
  "core-foundation",
@@ -1156,9 +1144,9 @@ dependencies = [
 
 [[package]]
 name = "security-framework-sys"
-version = "2.9.1"
+version = "2.10.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a"
+checksum = "41f3cc463c0ef97e11c3461a9d3787412d30e8e7eb907c79180c4a57bf7c04ef"
 dependencies = [
  "core-foundation-sys",
  "libc",
@@ -1172,29 +1160,29 @@ checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca"
 
 [[package]]
 name = "serde"
-version = "1.0.196"
+version = "1.0.198"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32"
+checksum = "9846a40c979031340571da2545a4e5b7c4163bdae79b301d5f86d03979451fcc"
 dependencies = [
  "serde_derive",
 ]
 
 [[package]]
 name = "serde_derive"
-version = "1.0.196"
+version = "1.0.198"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67"
+checksum = "e88edab869b01783ba905e7d0153f9fc1a6505a96e4ad3018011eedb838566d9"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.49",
+ "syn 2.0.60",
 ]
 
 [[package]]
 name = "serde_json"
-version = "1.0.113"
+version = "1.0.116"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79"
+checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813"
 dependencies = [
  "itoa",
  "ryu",
@@ -1225,9 +1213,9 @@ dependencies = [
 
 [[package]]
 name = "signal-hook-registry"
-version = "1.4.1"
+version = "1.4.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1"
+checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1"
 dependencies = [
  "libc",
 ]
@@ -1253,18 +1241,18 @@ dependencies = [
 
 [[package]]
 name = "smallvec"
-version = "1.13.1"
+version = "1.13.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7"
+checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
 
 [[package]]
 name = "socket2"
-version = "0.5.5"
+version = "0.5.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9"
+checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871"
 dependencies = [
  "libc",
- "windows-sys 0.48.0",
+ "windows-sys 0.52.0",
 ]
 
 [[package]]
@@ -1305,9 +1293,9 @@ dependencies = [
 
 [[package]]
 name = "sqlx"
-version = "0.7.3"
+version = "0.7.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dba03c279da73694ef99763320dea58b51095dfe87d001b1d4b5fe78ba8763cf"
+checksum = "c9a2ccff1a000a5a59cd33da541d9f2fdcd9e6e8229cc200565942bff36d0aaa"
 dependencies = [
  "sqlx-core",
  "sqlx-macros",
@@ -1318,9 +1306,9 @@ dependencies = [
 
 [[package]]
 name = "sqlx-core"
-version = "0.7.3"
+version = "0.7.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d84b0a3c3739e220d94b3239fd69fb1f74bc36e16643423bd99de3b43c21bfbd"
+checksum = "24ba59a9342a3d9bab6c56c118be528b27c9b60e490080e9711a04dccac83ef6"
 dependencies = [
  "ahash",
  "atoi",
@@ -1328,7 +1316,6 @@ dependencies = [
  "bytes",
  "crc",
  "crossbeam-queue",
- "dotenvy",
  "either",
  "event-listener",
  "futures-channel",
@@ -1359,9 +1346,9 @@ dependencies = [
 
 [[package]]
 name = "sqlx-macros"
-version = "0.7.3"
+version = "0.7.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "89961c00dc4d7dffb7aee214964b065072bff69e36ddb9e2c107541f75e4f2a5"
+checksum = "4ea40e2345eb2faa9e1e5e326db8c34711317d2b5e08d0d5741619048a803127"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -1372,11 +1359,10 @@ dependencies = [
 
 [[package]]
 name = "sqlx-macros-core"
-version = "0.7.3"
+version = "0.7.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d0bd4519486723648186a08785143599760f7cc81c52334a55d6a83ea1e20841"
+checksum = "5833ef53aaa16d860e92123292f1f6a3d53c34ba8b1969f152ef1a7bb803f3c8"
 dependencies = [
- "atomic-write-file",
  "dotenvy",
  "either",
  "heck",
@@ -1399,13 +1385,13 @@ dependencies = [
 
 [[package]]
 name = "sqlx-mysql"
-version = "0.7.3"
+version = "0.7.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e37195395df71fd068f6e2082247891bc11e3289624bbc776a0cdfa1ca7f1ea4"
+checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418"
 dependencies = [
  "atoi",
  "base64",
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
  "byteorder",
  "bytes",
  "crc",
@@ -1441,13 +1427,13 @@ dependencies = [
 
 [[package]]
 name = "sqlx-postgres"
-version = "0.7.3"
+version = "0.7.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d6ac0ac3b7ccd10cc96c7ab29791a7dd236bd94021f31eec7ba3d46a74aa1c24"
+checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e"
 dependencies = [
  "atoi",
  "base64",
- "bitflags 2.4.2",
+ "bitflags 2.5.0",
  "byteorder",
  "crc",
  "dotenvy",
@@ -1468,7 +1454,6 @@ dependencies = [
  "rand",
  "serde",
  "serde_json",
- "sha1",
  "sha2",
  "smallvec",
  "sqlx-core",
@@ -1480,9 +1465,9 @@ dependencies = [
 
 [[package]]
 name = "sqlx-sqlite"
-version = "0.7.3"
+version = "0.7.4"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "210976b7d948c7ba9fced8ca835b11cbb2d677c59c79de41ac0d397e14547490"
+checksum = "b244ef0a8414da0bed4bb1910426e890b19e5e9bccc27ada6b797d05c55ae0aa"
 dependencies = [
  "atoi",
  "flume",
@@ -1531,9 +1516,9 @@ dependencies = [
 
 [[package]]
 name = "syn"
-version = "2.0.49"
+version = "2.0.60"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "915aea9e586f80826ee59f8453c1101f9d1c4b3964cd2460185ee8e299ada496"
+checksum = "909518bc7b1c9b779f1bbf07f2929d35af9f0f37e47c6e9ef7f9dddc1e1821f3"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -1542,9 +1527,9 @@ dependencies = [
 
 [[package]]
 name = "tempfile"
-version = "3.10.0"
+version = "3.10.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67"
+checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1"
 dependencies = [
  "cfg-if",
  "fastrand",
@@ -1554,22 +1539,22 @@ dependencies = [
 
 [[package]]
 name = "thiserror"
-version = "1.0.57"
+version = "1.0.59"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b"
+checksum = "f0126ad08bff79f29fc3ae6a55cc72352056dfff61e3ff8bb7129476d44b23aa"
 dependencies = [
  "thiserror-impl",
 ]
 
 [[package]]
 name = "thiserror-impl"
-version = "1.0.57"
+version = "1.0.59"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81"
+checksum = "d1cd413b5d558b4c5bf3680e324a6fa5014e7b7c067a51e69dbdf47eb7148b66"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.49",
+ "syn 2.0.60",
 ]
 
 [[package]]
@@ -1589,9 +1574,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
 
 [[package]]
 name = "tokio"
-version = "1.36.0"
+version = "1.37.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931"
+checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787"
 dependencies = [
  "backtrace",
  "bytes",
@@ -1614,14 +1599,14 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.49",
+ "syn 2.0.60",
 ]
 
 [[package]]
 name = "tokio-stream"
-version = "0.1.14"
+version = "0.1.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842"
+checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af"
 dependencies = [
  "futures-core",
  "pin-project-lite",
@@ -1657,7 +1642,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.49",
+ "syn 2.0.60",
 ]
 
 [[package]]
@@ -1689,9 +1674,9 @@ checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
 
 [[package]]
 name = "unicode-normalization"
-version = "0.1.22"
+version = "0.1.23"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921"
+checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5"
 dependencies = [
  "tinyvec",
 ]
@@ -1771,11 +1756,21 @@ version = "0.11.0+wasi-snapshot-preview1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
 
+[[package]]
+name = "wasite"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b"
+
 [[package]]
 name = "whoami"
-version = "1.4.1"
+version = "1.5.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "22fc3756b8a9133049b26c7f61ab35416c130e8c09b660f5b3958b446f52cc50"
+checksum = "a44ab49fad634e88f55bf8f9bb3abd2f27d7204172a112c7c9987e01c1c94ea9"
+dependencies = [
+ "redox_syscall",
+ "wasite",
+]
 
 [[package]]
 name = "winapi"
@@ -1814,7 +1809,7 @@ version = "0.52.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
 dependencies = [
- "windows-targets 0.52.0",
+ "windows-targets 0.52.5",
 ]
 
 [[package]]
@@ -1834,17 +1829,18 @@ dependencies = [
 
 [[package]]
 name = "windows-targets"
-version = "0.52.0"
+version = "0.52.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd"
+checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb"
 dependencies = [
- "windows_aarch64_gnullvm 0.52.0",
- "windows_aarch64_msvc 0.52.0",
- "windows_i686_gnu 0.52.0",
- "windows_i686_msvc 0.52.0",
- "windows_x86_64_gnu 0.52.0",
- "windows_x86_64_gnullvm 0.52.0",
- "windows_x86_64_msvc 0.52.0",
+ "windows_aarch64_gnullvm 0.52.5",
+ "windows_aarch64_msvc 0.52.5",
+ "windows_i686_gnu 0.52.5",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc 0.52.5",
+ "windows_x86_64_gnu 0.52.5",
+ "windows_x86_64_gnullvm 0.52.5",
+ "windows_x86_64_msvc 0.52.5",
 ]
 
 [[package]]
@@ -1855,9 +1851,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
 
 [[package]]
 name = "windows_aarch64_gnullvm"
-version = "0.52.0"
+version = "0.52.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea"
+checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263"
 
 [[package]]
 name = "windows_aarch64_msvc"
@@ -1867,9 +1863,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
 
 [[package]]
 name = "windows_aarch64_msvc"
-version = "0.52.0"
+version = "0.52.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef"
+checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6"
 
 [[package]]
 name = "windows_i686_gnu"
@@ -1879,9 +1875,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
 
 [[package]]
 name = "windows_i686_gnu"
-version = "0.52.0"
+version = "0.52.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313"
+checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9"
 
 [[package]]
 name = "windows_i686_msvc"
@@ -1891,9 +1893,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
 
 [[package]]
 name = "windows_i686_msvc"
-version = "0.52.0"
+version = "0.52.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a"
+checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf"
 
 [[package]]
 name = "windows_x86_64_gnu"
@@ -1903,9 +1905,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
 
 [[package]]
 name = "windows_x86_64_gnu"
-version = "0.52.0"
+version = "0.52.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd"
+checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9"
 
 [[package]]
 name = "windows_x86_64_gnullvm"
@@ -1915,9 +1917,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
 
 [[package]]
 name = "windows_x86_64_gnullvm"
-version = "0.52.0"
+version = "0.52.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e"
+checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596"
 
 [[package]]
 name = "windows_x86_64_msvc"
@@ -1927,9 +1929,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
 
 [[package]]
 name = "windows_x86_64_msvc"
-version = "0.52.0"
+version = "0.52.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04"
+checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0"
 
 [[package]]
 name = "yansi-term"
@@ -2042,11 +2044,11 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6"
 dependencies = [
  "proc-macro2",
  "quote",
- "syn 2.0.49",
+ "syn 2.0.60",
 ]
 
 [[package]]
 name = "zeroize"
-version = "1.7.0"
+version = "1.8.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d"
+checksum = "63381fa6624bf92130a6b87c0d07380116f80b565c42cf0d754136f0238359ef"

+ 5 - 5
frameworks/Rust/ohkami/Cargo.toml

@@ -1,13 +1,13 @@
 [package]
 name    = "ohkami_framework_benchmarks"
-version = "0.15.0"
+version = "0.17.1"
 edition = "2021"
 authors = ["kanarus <[email protected]>"]
 
 [dependencies]
-ohkami       = { version = "=0.15.0", features = ["rt_tokio"] }
-tokio        = { version = "1.36.0" , features = ["full"] }
+ohkami       = { version = "=0.17.1", features = ["rt_tokio"] }
+tokio        = { version = "1.37.0" , features = ["full"] }
 rand         = { version = "0.8.5"  , features = ["small_rng"] }
-sqlx         = { version = "0.7.3"  , features = ["postgres", "macros", "runtime-tokio-native-tls"] }
+sqlx         = { version = "0.7.4"  , features = ["postgres", "macros", "runtime-tokio-native-tls"] }
 yarte        = { version = "0.15.7" }
-futures-util = { version = "0.3.30" }
+futures-util = { version = "0.3.30" }

+ 1 - 1
frameworks/Rust/ohkami/README.md

@@ -4,7 +4,7 @@
 
 > Build web app in intuitive and declarative code
 > - *macro-less and type-safe* APIs for intuitive and declarative code
-> - *multi runtime* support:`tokio`, `async-std`
+> - *multi runtime* support:`tokio`, `async-std`, `worker` (Cloudflare Workers)
 
 - [User Guide](https://docs.rs/ohkami/latest/ohkami/)
 - [API Documentation](https://docs.rs/ohkami/latest/ohkami/)

Some files were not shown because too many files changed in this diff