From bec6ec83075f9768ff5a469796e7d7a91229c758 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 28 Nov 2023 21:38:55 +0000 Subject: [PATCH 001/210] Bump openssl from 0.10.55 to 0.10.60 in /frameworks/Rust/ohkami Bumps [openssl](https://github.com/sfackler/rust-openssl) from 0.10.55 to 0.10.60. - [Release notes](https://github.com/sfackler/rust-openssl/releases) - [Commits](https://github.com/sfackler/rust-openssl/compare/openssl-v0.10.55...openssl-v0.10.60) --- updated-dependencies: - dependency-name: openssl dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Rust/ohkami/Cargo.lock | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/frameworks/Rust/ohkami/Cargo.lock b/frameworks/Rust/ohkami/Cargo.lock index 29cc979cc9b..5b1aeabfc54 100644 --- a/frameworks/Rust/ohkami/Cargo.lock +++ b/frameworks/Rust/ohkami/Cargo.lock @@ -207,6 +207,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" + [[package]] name = "block-buffer" version = "0.10.3" @@ -935,11 +941,11 @@ checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" [[package]] name = "openssl" -version = "0.10.55" +version = "0.10.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" +checksum = "79a4c6c3a2b158f7f8f2a2fc5a969fa3a068df6fc9dbb4a43845436e3af7c800" dependencies = [ - "bitflags", + "bitflags 2.4.1", "cfg-if", "foreign-types", "libc", @@ -967,9 +973,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.90" +version = "0.9.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" +checksum = "3812c071ba60da8b5677cc12bcb1d42989a65553772897a7e0355545a819838f" dependencies = [ "cc", "libc", @@ -1128,7 +1134,7 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] @@ -1211,7 +1217,7 @@ version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2bc1bb97804af6631813c55739f771071e0f2ed33ee20b68c86ec505d906356c" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "core-foundation-sys", "libc", @@ -1370,7 +1376,7 @@ dependencies = [ "ahash", "atoi", "base64", - "bitflags", + "bitflags 1.3.2", "byteorder", "bytes", "crc", From 7c7aae32293bfacbb42aa899bb0f6e9d50373d00 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Wed, 29 Nov 2023 22:38:52 +0100 Subject: [PATCH 002/210] [php] Yii2 update to PHP 8.3 (#8602) --- frameworks/PHP/yii2/composer.json | 2 +- frameworks/PHP/yii2/yii2-raw.dockerfile | 8 ++++---- frameworks/PHP/yii2/yii2-workerman.dockerfile | 8 ++++---- frameworks/PHP/yii2/yii2.dockerfile | 8 ++++---- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/frameworks/PHP/yii2/composer.json b/frameworks/PHP/yii2/composer.json index fd42939a64f..695b189d305 100755 --- a/frameworks/PHP/yii2/composer.json +++ b/frameworks/PHP/yii2/composer.json @@ -1,7 +1,7 @@ { "require": { "yidas/yii2-composer-bower-skip": "~2.0.13", - "yiisoft/yii2": "~2.0.43", + "yiisoft/yii2": "~2.0.49", "joanhey/adapterman": "^0.6" }, "config": { diff --git a/frameworks/PHP/yii2/yii2-raw.dockerfile b/frameworks/PHP/yii2/yii2-raw.dockerfile index 0d64edd9e3f..b7af0a36511 100644 --- a/frameworks/PHP/yii2/yii2-raw.dockerfile +++ b/frameworks/PHP/yii2/yii2-raw.dockerfile @@ -5,20 +5,20 @@ ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php RUN apt-get update -yqq > /dev/null && \ - apt-get install -yqq nginx git unzip php8.2 php8.2-common php8.2-cli php8.2-fpm php8.2-mysql php8.2-mbstring php8.2-dev > /dev/null + apt-get install -yqq nginx git unzip php8.3 php8.3-common php8.3-cli php8.3-fpm php8.3-mysql php8.3-mbstring php8.3-dev > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.2/fpm/ +COPY deploy/conf/* /etc/php/8.3/fpm/ ADD ./ /yii2 WORKDIR /yii2 -RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.2/fpm/php-fpm.conf ; fi; +RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.3/fpm/php-fpm.conf ; fi; RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet EXPOSE 8080 -CMD service php8.2-fpm start && \ +CMD service php8.3-fpm start && \ nginx -c /yii2/deploy/nginx.conf diff --git a/frameworks/PHP/yii2/yii2-workerman.dockerfile b/frameworks/PHP/yii2/yii2-workerman.dockerfile index 2c54c4e33b6..e5502f5b455 100644 --- a/frameworks/PHP/yii2/yii2-workerman.dockerfile +++ b/frameworks/PHP/yii2/yii2-workerman.dockerfile @@ -5,14 +5,14 @@ ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php RUN apt-get update -yqq > /dev/null && \ - apt-get install -yqq git php8.2-cli php8.2-mysql php8.2-mbstring php8.2-xml > /dev/null + apt-get install -yqq git php8.3-cli php8.3-mysql php8.3-mbstring php8.3-xml > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -RUN apt-get install -y php-pear php8.2-dev libevent-dev > /dev/null -RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.2/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null +RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini -COPY deploy/conf/cli-php.ini /etc/php/8.2/cli/php.ini +COPY deploy/conf/cli-php.ini /etc/php/8.3/cli/php.ini ADD ./ /yii2 WORKDIR /yii2 diff --git a/frameworks/PHP/yii2/yii2.dockerfile b/frameworks/PHP/yii2/yii2.dockerfile index 0d64edd9e3f..b7af0a36511 100644 --- a/frameworks/PHP/yii2/yii2.dockerfile +++ b/frameworks/PHP/yii2/yii2.dockerfile @@ -5,20 +5,20 @@ ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php RUN apt-get update -yqq > /dev/null && \ - apt-get install -yqq nginx git unzip php8.2 php8.2-common php8.2-cli php8.2-fpm php8.2-mysql php8.2-mbstring php8.2-dev > /dev/null + apt-get install -yqq nginx git unzip php8.3 php8.3-common php8.3-cli php8.3-fpm php8.3-mysql php8.3-mbstring php8.3-dev > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.2/fpm/ +COPY deploy/conf/* /etc/php/8.3/fpm/ ADD ./ /yii2 WORKDIR /yii2 -RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.2/fpm/php-fpm.conf ; fi; +RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.3/fpm/php-fpm.conf ; fi; RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet EXPOSE 8080 -CMD service php8.2-fpm start && \ +CMD service php8.3-fpm start && \ nginx -c /yii2/deploy/nginx.conf From 0e87edef9dec8636e0a1e974b03db46afacd4e41 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Wed, 29 Nov 2023 22:39:05 +0100 Subject: [PATCH 003/210] [php] Webman & Wolff update to PHP 8.3 (#8601) * [php] Webman update to PHP 8.3 * [php] Wolff update to PHP 8.3 --- frameworks/PHP/webman/webman.dockerfile | 8 ++++---- frameworks/PHP/wolff/wolff.dockerfile | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/frameworks/PHP/webman/webman.dockerfile b/frameworks/PHP/webman/webman.dockerfile index 923ea5ebf71..512b164d99c 100644 --- a/frameworks/PHP/webman/webman.dockerfile +++ b/frameworks/PHP/webman/webman.dockerfile @@ -6,14 +6,14 @@ RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /de RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null -RUN apt-get install -yqq php8.2-cli php8.2-pgsql php8.2-xml > /dev/null +RUN apt-get install -yqq php8.3-cli php8.3-pgsql php8.3-xml > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -RUN apt-get update -yqq && apt-get install -y php-pear php8.2-dev libevent-dev git > /dev/null -RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.2/cli/conf.d/event.ini +RUN apt-get update -yqq && apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null +RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini -COPY php.ini /etc/php/8.2/cli/php.ini +COPY php.ini /etc/php/8.3/cli/php.ini ADD ./ /webman WORKDIR /webman diff --git a/frameworks/PHP/wolff/wolff.dockerfile b/frameworks/PHP/wolff/wolff.dockerfile index 21939044bd5..1d94b5bc668 100644 --- a/frameworks/PHP/wolff/wolff.dockerfile +++ b/frameworks/PHP/wolff/wolff.dockerfile @@ -1,13 +1,13 @@ -FROM ubuntu:20.04 +FROM ubuntu:22.04 ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php RUN apt-get install -yqq nginx git unzip \ - php8.2-fpm php8.2-mysql php8.2-xml php8.2-mbstring php8.2-intl php8.2-dev php8.2-curl > /dev/null + php8.3-fpm php8.3-mysql php8.3-xml php8.3-mbstring php8.3-intl php8.3-dev php8.3-curl > /dev/null -COPY deploy/conf/* /etc/php/8.2/fpm/ +COPY deploy/conf/* /etc/php/8.3/fpm/ ADD ./ /wolff WORKDIR /wolff @@ -16,11 +16,11 @@ COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet -RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.2/fpm/php-fpm.conf ; fi; +RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.3/fpm/php-fpm.conf ; fi; RUN chmod -R 777 /wolff EXPOSE 8080 -CMD service php8.2-fpm start && \ +CMD service php8.3-fpm start && \ nginx -c /wolff/deploy/nginx.conf 2>&1 > /dev/stderr From 9cd97a212c2b6ea4fe9ae03da498a2cb592b3590 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Wed, 29 Nov 2023 22:39:16 +0100 Subject: [PATCH 004/210] [php] Swoole update to PHP 8.3 (#8599) --- frameworks/PHP/swoole/swoole-async-mysql.dockerfile | 8 ++++---- frameworks/PHP/swoole/swoole-async-postgres.dockerfile | 8 ++++---- frameworks/PHP/swoole/swoole-sync-mysql.dockerfile | 8 ++++---- frameworks/PHP/swoole/swoole-sync-postgres.dockerfile | 8 ++++---- 4 files changed, 16 insertions(+), 16 deletions(-) diff --git a/frameworks/PHP/swoole/swoole-async-mysql.dockerfile b/frameworks/PHP/swoole/swoole-async-mysql.dockerfile index 860a5811bce..9b9daf07c43 100644 --- a/frameworks/PHP/swoole/swoole-async-mysql.dockerfile +++ b/frameworks/PHP/swoole/swoole-async-mysql.dockerfile @@ -1,6 +1,6 @@ FROM ubuntu:22.04 -ENV SWOOLE_VERSION 5.1.0 +ENV SWOOLE_VERSION 5.1.1 ENV ENABLE_COROUTINE 1 ENV DATABASE_DRIVER mysql @@ -10,14 +10,14 @@ RUN apt update -yqq > /dev/null \ && apt install -yqq software-properties-common > /dev/null \ && LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null \ && apt update -yqq > /dev/null \ - && apt install php8.2-cli php8.2-pdo-mysql php8.2-dev -y > /dev/null \ + && apt install php8.3-cli php8.3-pdo-mysql php8.3-dev -y > /dev/null \ && cd /tmp && curl -sSL "https://github.com/swoole/swoole-src/archive/v${SWOOLE_VERSION}.tar.gz" | tar xzf - \ && cd /tmp/swoole-src-${SWOOLE_VERSION} \ && phpize > /dev/null \ && ./configure > /dev/null \ && make -j8 > /dev/null \ && make install > /dev/null \ - && echo "extension=swoole.so" > /etc/php/8.2/cli/conf.d/50-swoole.ini + && echo "extension=swoole.so" > /etc/php/8.3/cli/conf.d/50-swoole.ini WORKDIR /swoole @@ -25,7 +25,7 @@ ADD ./swoole-server.php /swoole ADD ./php.ini /swoole ADD ./database.php /swoole -RUN cat /swoole/php.ini >> /etc/php/8.2/cli/php.ini +RUN cat /swoole/php.ini >> /etc/php/8.3/cli/php.ini EXPOSE 8080 CMD php /swoole/swoole-server.php diff --git a/frameworks/PHP/swoole/swoole-async-postgres.dockerfile b/frameworks/PHP/swoole/swoole-async-postgres.dockerfile index bf5f385a534..d75390c922e 100644 --- a/frameworks/PHP/swoole/swoole-async-postgres.dockerfile +++ b/frameworks/PHP/swoole/swoole-async-postgres.dockerfile @@ -1,6 +1,6 @@ FROM ubuntu:22.04 -ENV SWOOLE_VERSION 5.1.0 +ENV SWOOLE_VERSION 5.1.1 ENV ENABLE_COROUTINE 1 ENV DATABASE_DRIVER pgsql @@ -10,14 +10,14 @@ RUN apt update -yqq > /dev/null \ && apt install -yqq software-properties-common > /dev/null \ && LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null \ && apt update -yqq > /dev/null \ - && apt install php8.2-cli php8.2-pdo-pgsql php8.2-dev libpq-dev -y > /dev/null \ + && apt install php8.3-cli php8.3-pdo-pgsql php8.3-dev libpq-dev -y > /dev/null \ && cd /tmp && curl -sSL "https://github.com/swoole/swoole-src/archive/v${SWOOLE_VERSION}.tar.gz" | tar xzf - \ && cd /tmp/swoole-src-${SWOOLE_VERSION} \ && phpize > /dev/null \ && ./configure --enable-swoole-pgsql > /dev/null \ && make -j8 > /dev/null \ && make install > /dev/null \ - && echo "extension=swoole.so" > /etc/php/8.2/cli/conf.d/50-swoole.ini + && echo "extension=swoole.so" > /etc/php/8.3/cli/conf.d/50-swoole.ini WORKDIR /swoole @@ -25,7 +25,7 @@ ADD ./swoole-server.php /swoole ADD ./php.ini /swoole ADD ./database.php /swoole -RUN cat /swoole/php.ini >> /etc/php/8.2/cli/php.ini +RUN cat /swoole/php.ini >> /etc/php/8.3/cli/php.ini EXPOSE 8080 CMD php /swoole/swoole-server.php diff --git a/frameworks/PHP/swoole/swoole-sync-mysql.dockerfile b/frameworks/PHP/swoole/swoole-sync-mysql.dockerfile index a6261b638f6..4893a1aad1a 100644 --- a/frameworks/PHP/swoole/swoole-sync-mysql.dockerfile +++ b/frameworks/PHP/swoole/swoole-sync-mysql.dockerfile @@ -1,6 +1,6 @@ FROM ubuntu:22.04 -ENV SWOOLE_VERSION 5.1.0 +ENV SWOOLE_VERSION 5.1.1 ENV ENABLE_COROUTINE 0 ENV DATABASE_DRIVER mysql @@ -10,14 +10,14 @@ RUN apt update -yqq > /dev/null \ && apt install -yqq software-properties-common > /dev/null \ && LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null \ && apt update -yqq > /dev/null \ - && apt install php8.2-cli php8.2-pdo-mysql php8.2-dev -y > /dev/null \ + && apt install php8.3-cli php8.3-pdo-mysql php8.3-dev -y > /dev/null \ && cd /tmp && curl -sSL "https://github.com/swoole/swoole-src/archive/v${SWOOLE_VERSION}.tar.gz" | tar xzf - \ && cd /tmp/swoole-src-${SWOOLE_VERSION} \ && phpize > /dev/null \ && ./configure > /dev/null \ && make -j8 > /dev/null \ && make install > /dev/null \ - && echo "extension=swoole.so" > /etc/php/8.2/cli/conf.d/50-swoole.ini + && echo "extension=swoole.so" > /etc/php/8.3/cli/conf.d/50-swoole.ini WORKDIR /swoole @@ -25,7 +25,7 @@ ADD ./swoole-server.php /swoole ADD ./php.ini /swoole ADD ./database.php /swoole -RUN cat /swoole/php.ini >> /etc/php/8.2/cli/php.ini +RUN cat /swoole/php.ini >> /etc/php/8.3/cli/php.ini EXPOSE 8080 CMD php /swoole/swoole-server.php diff --git a/frameworks/PHP/swoole/swoole-sync-postgres.dockerfile b/frameworks/PHP/swoole/swoole-sync-postgres.dockerfile index b70782fb998..9559267ce6c 100644 --- a/frameworks/PHP/swoole/swoole-sync-postgres.dockerfile +++ b/frameworks/PHP/swoole/swoole-sync-postgres.dockerfile @@ -1,6 +1,6 @@ FROM ubuntu:22.04 -ENV SWOOLE_VERSION 5.1.0 +ENV SWOOLE_VERSION 5.1.1 ENV ENABLE_COROUTINE 0 ENV DATABASE_DRIVER pgsql @@ -10,14 +10,14 @@ RUN apt update -yqq > /dev/null \ && apt install -yqq software-properties-common > /dev/null \ && LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null \ && apt update -yqq > /dev/null \ - && apt install php8.2-cli php8.2-pdo-pgsql php8.2-dev libpq-dev -y > /dev/null \ + && apt install php8.3-cli php8.3-pdo-pgsql php8.3-dev libpq-dev -y > /dev/null \ && cd /tmp && curl -sSL "https://github.com/swoole/swoole-src/archive/v${SWOOLE_VERSION}.tar.gz" | tar xzf - \ && cd /tmp/swoole-src-${SWOOLE_VERSION} \ && phpize > /dev/null \ && ./configure > /dev/null \ && make -j2 > /dev/null \ && make install > /dev/null \ - && echo "extension=swoole.so" > /etc/php/8.2/cli/conf.d/50-swoole.ini + && echo "extension=swoole.so" > /etc/php/8.3/cli/conf.d/50-swoole.ini WORKDIR /swoole @@ -25,7 +25,7 @@ ADD ./swoole-server.php /swoole ADD ./php.ini /swoole ADD ./database.php /swoole -RUN cat /swoole/php.ini >> /etc/php/8.2/cli/php.ini +RUN cat /swoole/php.ini >> /etc/php/8.3/cli/php.ini EXPOSE 8080 CMD php /swoole/swoole-server.php From 334bc6d072c1ff275f662b6fbfdf5764eaab16c6 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Wed, 29 Nov 2023 22:39:34 +0100 Subject: [PATCH 005/210] [php] Slim update to PHP 8.3 (#8597) --- frameworks/PHP/slim/composer.json | 2 +- frameworks/PHP/slim/slim-workerman-pgsql.dockerfile | 8 ++++---- frameworks/PHP/slim/slim-workerman.dockerfile | 8 ++++---- frameworks/PHP/slim/slim.dockerfile | 8 ++++---- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/frameworks/PHP/slim/composer.json b/frameworks/PHP/slim/composer.json index 26d8bd5b254..78202c96223 100644 --- a/frameworks/PHP/slim/composer.json +++ b/frameworks/PHP/slim/composer.json @@ -1,6 +1,6 @@ { "require": { - "slim/slim": "^4.10", + "slim/slim": "^4.12", "slim/php-view": "3.2.0", "slim/psr7": "1.*", "slim/http": "1.*", diff --git a/frameworks/PHP/slim/slim-workerman-pgsql.dockerfile b/frameworks/PHP/slim/slim-workerman-pgsql.dockerfile index 28a5e0c7357..4a40505c701 100644 --- a/frameworks/PHP/slim/slim-workerman-pgsql.dockerfile +++ b/frameworks/PHP/slim/slim-workerman-pgsql.dockerfile @@ -8,14 +8,14 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ RUN apt-get upgrade -yqq > /dev/null RUN apt-get install -yqq git \ - php8.2-cli php8.2-pgsql php8.2-mbstring php8.2-xml php8.2-curl > /dev/null + php8.3-cli php8.3-pgsql php8.3-mbstring php8.3-xml php8.3-curl > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -RUN apt-get install -y php-pear php8.2-dev libevent-dev > /dev/null -RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.2/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null +RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini -COPY deploy/conf/cli-php.ini /etc/php/8.2/cli/php.ini +COPY deploy/conf/cli-php.ini /etc/php/8.3/cli/php.ini ADD ./ /slim WORKDIR /slim diff --git a/frameworks/PHP/slim/slim-workerman.dockerfile b/frameworks/PHP/slim/slim-workerman.dockerfile index 80b69e0b0d9..fefb80f8106 100644 --- a/frameworks/PHP/slim/slim-workerman.dockerfile +++ b/frameworks/PHP/slim/slim-workerman.dockerfile @@ -7,14 +7,14 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null RUN apt-get update -yqq > /dev/null && apt-get install -yqq git \ - php8.2-cli php8.2-mysql php8.2-mbstring php8.2-xml php8.2-curl > /dev/null + php8.3-cli php8.3-mysql php8.3-mbstring php8.3-xml php8.3-curl > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -RUN apt-get install -y php-pear php8.2-dev libevent-dev > /dev/null -RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.2/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null +RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini -COPY deploy/conf/cli-php.ini /etc/php/8.2/cli/php.ini +COPY deploy/conf/cli-php.ini /etc/php/8.3/cli/php.ini ADD ./ /slim WORKDIR /slim diff --git a/frameworks/PHP/slim/slim.dockerfile b/frameworks/PHP/slim/slim.dockerfile index c1eb0af9da3..90c81c6deb6 100644 --- a/frameworks/PHP/slim/slim.dockerfile +++ b/frameworks/PHP/slim/slim.dockerfile @@ -7,16 +7,16 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null RUN apt-get install -yqq nginx git unzip \ - php8.2 php8.2-common php8.2-cli php8.2-fpm php8.2-mysql php8.2-xml php8.2-curl > /dev/null + php8.3 php8.3-common php8.3-cli php8.3-fpm php8.3-mysql php8.3-xml php8.3-curl > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.2/fpm/ +COPY deploy/conf/* /etc/php/8.3/fpm/ ADD ./ /slim WORKDIR /slim -RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.2/fpm/php-fpm.conf ; fi; +RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.3/fpm/php-fpm.conf ; fi; RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet @@ -24,5 +24,5 @@ RUN chmod -R 777 /slim EXPOSE 8080 -CMD service php8.2-fpm start && \ +CMD service php8.3-fpm start && \ nginx -c /slim/deploy/nginx.conf From 2f59b5d17e14c0bec898390b0c2831f5291af7d5 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Wed, 29 Nov 2023 22:39:48 +0100 Subject: [PATCH 006/210] [php] Simps update to PHP 8.3 (#8596) --- frameworks/PHP/simps/simps-micro.dockerfile | 2 +- frameworks/PHP/simps/simps.dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/PHP/simps/simps-micro.dockerfile b/frameworks/PHP/simps/simps-micro.dockerfile index 59ddd35f1e7..baa74e103e1 100644 --- a/frameworks/PHP/simps/simps-micro.dockerfile +++ b/frameworks/PHP/simps/simps-micro.dockerfile @@ -1,4 +1,4 @@ -FROM php:8.2-cli +FROM php:8.3-cli RUN pecl install swoole > /dev/null && \ docker-php-ext-enable swoole diff --git a/frameworks/PHP/simps/simps.dockerfile b/frameworks/PHP/simps/simps.dockerfile index 59ddd35f1e7..baa74e103e1 100644 --- a/frameworks/PHP/simps/simps.dockerfile +++ b/frameworks/PHP/simps/simps.dockerfile @@ -1,4 +1,4 @@ -FROM php:8.2-cli +FROM php:8.3-cli RUN pecl install swoole > /dev/null && \ docker-php-ext-enable swoole From 52a9d343041b2241e97596df599fa1fb751bc389 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Wed, 29 Nov 2023 22:48:21 +0100 Subject: [PATCH 007/210] [php] Nette update to PHP 8.3 (#8594) --- frameworks/PHP/nette/nette.dockerfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frameworks/PHP/nette/nette.dockerfile b/frameworks/PHP/nette/nette.dockerfile index 0d89b8d3929..fc917b9ca49 100644 --- a/frameworks/PHP/nette/nette.dockerfile +++ b/frameworks/PHP/nette/nette.dockerfile @@ -5,9 +5,9 @@ ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php RUN apt-get install -yqq nginx git unzip \ - php8.2-fpm php8.2-mysql php8.2-xml php8.2-mbstring php8.2-intl php8.2-dev php8.2-curl > /dev/null + php8.3-fpm php8.3-mysql php8.3-xml php8.3-mbstring php8.3-intl php8.3-dev php8.3-curl > /dev/null -COPY deploy/conf/* /etc/php/8.2/fpm/ +COPY deploy/conf/* /etc/php/8.3/fpm/ ADD ./ /nette WORKDIR /nette @@ -18,11 +18,11 @@ COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet -RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.2/fpm/php-fpm.conf ; fi; +RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.3/fpm/php-fpm.conf ; fi; RUN chmod -R 777 /nette EXPOSE 8080 -CMD service php8.2-fpm start && \ +CMD service php8.3-fpm start && \ nginx -c /nette/deploy/nginx.conf 2>&1 > /dev/stderr From 1adf7805ba0627bf7748b92bae1314e77e3c1ff0 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Wed, 29 Nov 2023 22:48:31 +0100 Subject: [PATCH 008/210] [php] Mixphp update to PHP 8.3 (#8593) --- frameworks/PHP/mixphp/mixphp-swoole-mysql.dockerfile | 4 ++-- .../PHP/mixphp/mixphp-workerman-mysql.dockerfile | 12 ++++++------ .../PHP/mixphp/mixphp-workerman-pgsql.dockerfile | 10 +++++----- frameworks/PHP/mixphp/mixphp.dockerfile | 10 +++++----- 4 files changed, 18 insertions(+), 18 deletions(-) diff --git a/frameworks/PHP/mixphp/mixphp-swoole-mysql.dockerfile b/frameworks/PHP/mixphp/mixphp-swoole-mysql.dockerfile index f9ab771ee37..2001b9fde1d 100644 --- a/frameworks/PHP/mixphp/mixphp-swoole-mysql.dockerfile +++ b/frameworks/PHP/mixphp/mixphp-swoole-mysql.dockerfile @@ -1,4 +1,4 @@ -FROM php:8.0-cli +FROM php:8.3-cli RUN pecl install swoole > /dev/null && docker-php-ext-enable swoole @@ -18,7 +18,7 @@ RUN php -v && php -i | grep opcache WORKDIR /mixphp -RUN curl -sSL https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer +COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer RUN composer install --no-dev --classmap-authoritative --quiet > /dev/null RUN composer dumpautoload -o diff --git a/frameworks/PHP/mixphp/mixphp-workerman-mysql.dockerfile b/frameworks/PHP/mixphp/mixphp-workerman-mysql.dockerfile index d2a27876c01..0861a10948d 100644 --- a/frameworks/PHP/mixphp/mixphp-workerman-mysql.dockerfile +++ b/frameworks/PHP/mixphp/mixphp-workerman-mysql.dockerfile @@ -1,21 +1,21 @@ -FROM ubuntu:20.04 +FROM ubuntu:22.04 ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php -RUN apt-get update -yqq && apt-get install -yqq git unzip wget curl build-essential php8.1-cli php8.1-mbstring php8.1-curl php8.1-xml php8.1-mysql > /dev/null +RUN apt-get update -yqq && apt-get install -yqq git unzip wget curl build-essential php8.3-cli php8.3-mbstring php8.3-curl php8.3-xml php8.3-mysql > /dev/null -RUN apt-get install -y php8.1-dev libevent-dev > /dev/null +RUN apt-get install -y php8.3-dev libevent-dev > /dev/null RUN wget http://pear.php.net/go-pear.phar --quiet && php go-pear.phar -RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.1/cli/conf.d/event.ini +RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini -COPY php-jit.ini /etc/php/8.1/cli/php.ini +COPY php-jit.ini /etc/php/8.3/cli/php.ini ADD ./ /mixphp WORKDIR /mixphp -RUN curl -sSL https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer +COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer RUN composer install --no-dev --classmap-authoritative --quiet > /dev/null RUN composer dumpautoload -o diff --git a/frameworks/PHP/mixphp/mixphp-workerman-pgsql.dockerfile b/frameworks/PHP/mixphp/mixphp-workerman-pgsql.dockerfile index 91a6ef3361a..f469165bf97 100644 --- a/frameworks/PHP/mixphp/mixphp-workerman-pgsql.dockerfile +++ b/frameworks/PHP/mixphp/mixphp-workerman-pgsql.dockerfile @@ -4,20 +4,20 @@ ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php -RUN apt-get update -yqq && apt-get install -yqq git unzip wget curl build-essential php8.2-cli php8.2-mbstring php8.2-curl php8.2-xml php8.2-pgsql > /dev/null +RUN apt-get update -yqq && apt-get install -yqq git unzip wget curl build-essential php8.3-cli php8.3-mbstring php8.3-curl php8.3-xml php8.3-pgsql > /dev/null -RUN apt-get install -y php8.2-dev libevent-dev > /dev/null +RUN apt-get install -y php8.3-dev libevent-dev > /dev/null RUN wget http://pear.php.net/go-pear.phar --quiet && php go-pear.phar -RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.2/cli/conf.d/event.ini +RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini -COPY php-jit.ini /etc/php/8.2/cli/php.ini +COPY php-jit.ini /etc/php/8.3/cli/php.ini ADD ./ /mixphp WORKDIR /mixphp RUN sed -i "s|Benchmark();|BenchmarkRaw();|g" /mixphp/routes/index.php -RUN curl -sSL https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer +COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer RUN composer install --no-dev --classmap-authoritative --quiet > /dev/null RUN composer dumpautoload -o diff --git a/frameworks/PHP/mixphp/mixphp.dockerfile b/frameworks/PHP/mixphp/mixphp.dockerfile index 105fa01bc9e..bbc64fd8705 100644 --- a/frameworks/PHP/mixphp/mixphp.dockerfile +++ b/frameworks/PHP/mixphp/mixphp.dockerfile @@ -4,16 +4,16 @@ ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php -RUN apt-get update -yqq && apt-get install -yqq git unzip wget curl build-essential nginx php8.2-fpm php8.2-mysql php8.2-dev > /dev/null +RUN apt-get update -yqq && apt-get install -yqq git unzip wget curl build-essential nginx php8.3-fpm php8.3-mysql php8.3-dev > /dev/null -COPY deploy/conf/* /etc/php/8.2/fpm/ +COPY deploy/conf/* /etc/php/8.3/fpm/ -RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.2/fpm/php-fpm.conf ; fi; +RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.3/fpm/php-fpm.conf ; fi; ADD ./ /mixphp WORKDIR /mixphp -RUN curl -sSL https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer +COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer RUN composer install --no-dev --classmap-authoritative --quiet > /dev/null RUN composer dumpautoload -o @@ -22,5 +22,5 @@ RUN chmod -R 777 /mixphp/runtime/logs EXPOSE 8080 -CMD service php8.2-fpm start && \ +CMD service php8.3-fpm start && \ nginx -c /mixphp/deploy/nginx.conf From bdbcc0cd081a36c29b9946a1c4fb615bd22d2feb Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Wed, 29 Nov 2023 22:48:42 +0100 Subject: [PATCH 009/210] [php] Mark update to PHP 8.3 (#8592) --- frameworks/PHP/mark/mark.dockerfile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frameworks/PHP/mark/mark.dockerfile b/frameworks/PHP/mark/mark.dockerfile index 865e95656ee..3b39a27ef56 100644 --- a/frameworks/PHP/mark/mark.dockerfile +++ b/frameworks/PHP/mark/mark.dockerfile @@ -5,20 +5,20 @@ ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php RUN apt-get update -yqq > /dev/null && \ - apt-get install -yqq php8.2-cli php8.2-pgsql php8.2-xml > /dev/null + apt-get install -yqq php8.3-cli php8.3-pgsql php8.3-xml > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -RUN apt-get install -y php-pear php8.2-dev libevent-dev git > /dev/null -RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.2/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null +RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini -COPY php.ini /etc/php/8.2/cli/php.ini +COPY php.ini /etc/php/8.3/cli/php.ini ADD ./ /mark WORKDIR /mark RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet -RUN sed -i "s|opcache.jit=off|opcache.jit=tracing|g" /etc/php/8.2/cli/conf.d/10-opcache.ini +RUN sed -i "s|opcache.jit=off|opcache.jit=tracing|g" /etc/php/8.3/cli/conf.d/10-opcache.ini EXPOSE 8080 From fcf80f96bc0a68cff14895390474d18764d4a648 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Wed, 29 Nov 2023 22:48:52 +0100 Subject: [PATCH 010/210] [php] Lumen update to PHP 8.3 (#8591) --- frameworks/PHP/lumen/lumen-laravel-s.dockerfile | 2 +- frameworks/PHP/lumen/lumen-swoole.dockerfile | 2 +- frameworks/PHP/lumen/lumen-workerman.dockerfile | 6 +++--- frameworks/PHP/lumen/lumen.dockerfile | 8 ++++---- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/frameworks/PHP/lumen/lumen-laravel-s.dockerfile b/frameworks/PHP/lumen/lumen-laravel-s.dockerfile index 814556e4f79..a8a0aebd68a 100644 --- a/frameworks/PHP/lumen/lumen-laravel-s.dockerfile +++ b/frameworks/PHP/lumen/lumen-laravel-s.dockerfile @@ -1,4 +1,4 @@ -FROM php:8.2-cli +FROM php:8.3-cli RUN pecl install swoole > /dev/null && \ docker-php-ext-enable swoole diff --git a/frameworks/PHP/lumen/lumen-swoole.dockerfile b/frameworks/PHP/lumen/lumen-swoole.dockerfile index abf5e8b0815..3e4c866c031 100644 --- a/frameworks/PHP/lumen/lumen-swoole.dockerfile +++ b/frameworks/PHP/lumen/lumen-swoole.dockerfile @@ -1,4 +1,4 @@ -FROM php:8.2-cli +FROM php:8.3-cli RUN pecl install swoole > /dev/null && \ docker-php-ext-enable swoole diff --git a/frameworks/PHP/lumen/lumen-workerman.dockerfile b/frameworks/PHP/lumen/lumen-workerman.dockerfile index 721dbb2e32b..bc0f416c759 100644 --- a/frameworks/PHP/lumen/lumen-workerman.dockerfile +++ b/frameworks/PHP/lumen/lumen-workerman.dockerfile @@ -7,12 +7,12 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null RUN apt-get install -yqq nginx git unzip \ - php8.2-cli php8.2-mysql php8.2-mbstring php8.2-xml php8.2-dev > /dev/null + php8.3-cli php8.3-mysql php8.3-mbstring php8.3-xml php8.3-dev > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -RUN apt-get install -y php-pear php8.2-dev libevent-dev > /dev/null -RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.2/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null +RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini ADD ./ /lumen WORKDIR /lumen diff --git a/frameworks/PHP/lumen/lumen.dockerfile b/frameworks/PHP/lumen/lumen.dockerfile index c8bbe761a44..1b5f8a76e62 100644 --- a/frameworks/PHP/lumen/lumen.dockerfile +++ b/frameworks/PHP/lumen/lumen.dockerfile @@ -7,16 +7,16 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null RUN apt-get install -yqq nginx git unzip \ - php8.2-cli php8.2-fpm php8.2-mysql php8.2-mbstring php8.2-xml php8.2-dev > /dev/null + php8.3-cli php8.3-fpm php8.3-mysql php8.3-mbstring php8.3-xml php8.3-dev > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.2/fpm/ +COPY deploy/conf/* /etc/php/8.3/fpm/ ADD ./ /lumen WORKDIR /lumen -RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.2/fpm/php-fpm.conf ; fi; +RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.3/fpm/php-fpm.conf ; fi; RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet @@ -29,5 +29,5 @@ RUN chmod -R 777 /lumen EXPOSE 8080 -CMD service php8.2-fpm start && \ +CMD service php8.3-fpm start && \ nginx -c /lumen/deploy/nginx.conf From f231f90816872becbe0224a6c361c0fdc8459b69 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Wed, 29 Nov 2023 22:49:05 +0100 Subject: [PATCH 011/210] [php] Leaf update to PHP 8.3 (#8590) --- frameworks/PHP/leaf/index.php | 9 +++------ frameworks/PHP/leaf/leaf-workerman.dockerfile | 8 ++++---- frameworks/PHP/leaf/leaf.dockerfile | 8 ++++---- 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/frameworks/PHP/leaf/index.php b/frameworks/PHP/leaf/index.php index 9848de6bd73..197c6c82191 100644 --- a/frameworks/PHP/leaf/index.php +++ b/frameworks/PHP/leaf/index.php @@ -2,13 +2,10 @@ require __DIR__.'/vendor/autoload.php'; -app()->get("/plaintext", function () { - response()->plain('Hello, World!'); -}); +app()->get("/plaintext", fn() => response()->plain('Hello, World!')); + +app()->get('/json', fn() => response()->json(['message' => 'Hello, World!'])); -app()->get('/json', function () { - response()->json(['message' => 'Hello, World!']); -}); app()->run(); // commented with workerman diff --git a/frameworks/PHP/leaf/leaf-workerman.dockerfile b/frameworks/PHP/leaf/leaf-workerman.dockerfile index 12ac67bf00e..80f9248d07a 100644 --- a/frameworks/PHP/leaf/leaf-workerman.dockerfile +++ b/frameworks/PHP/leaf/leaf-workerman.dockerfile @@ -7,14 +7,14 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null RUN apt-get update -yqq > /dev/null && apt-get install -yqq git \ - php8.2-cli php8.2-mysql php8.2-mbstring php8.2-xml php8.2-curl > /dev/null + php8.3-cli php8.3-mysql php8.3-mbstring php8.3-xml php8.3-curl > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -RUN apt-get install -y php-pear php8.2-dev libevent-dev > /dev/null -RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.2/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null +RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini -COPY deploy/conf/cli-php.ini /etc/php/8.2/cli/php.ini +COPY deploy/conf/cli-php.ini /etc/php/8.3/cli/php.ini ADD ./ /leaf WORKDIR /leaf diff --git a/frameworks/PHP/leaf/leaf.dockerfile b/frameworks/PHP/leaf/leaf.dockerfile index 679d4bb6004..167a5af7039 100644 --- a/frameworks/PHP/leaf/leaf.dockerfile +++ b/frameworks/PHP/leaf/leaf.dockerfile @@ -7,16 +7,16 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null RUN apt-get install -yqq nginx git unzip \ - php8.2 php8.2-common php8.2-cli php8.2-fpm php8.2-mysql php8.2-xml php8.2-curl > /dev/null + php8.3 php8.3-common php8.3-cli php8.3-fpm php8.3-mysql php8.3-xml php8.3-curl > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.2/fpm/ +COPY deploy/conf/* /etc/php/8.3/fpm/ ADD ./ /leaf WORKDIR /leaf -RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.2/fpm/php-fpm.conf ; fi; +RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.3/fpm/php-fpm.conf ; fi; RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet @@ -24,5 +24,5 @@ RUN chmod -R 777 /leaf EXPOSE 8080 -CMD service php8.2-fpm start && \ +CMD service php8.3-fpm start && \ nginx -c /leaf/deploy/nginx.conf From 566ee8826b26fcc14a841c6c938cfc8c71a25010 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Wed, 29 Nov 2023 22:49:17 +0100 Subject: [PATCH 012/210] [php] Flight update to PHP 8.3 (#8588) --- frameworks/PHP/flight/flight.dockerfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frameworks/PHP/flight/flight.dockerfile b/frameworks/PHP/flight/flight.dockerfile index 47a6e9ff6d1..07dbf7670c9 100644 --- a/frameworks/PHP/flight/flight.dockerfile +++ b/frameworks/PHP/flight/flight.dockerfile @@ -5,9 +5,9 @@ ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php RUN apt-get update -yqq > /dev/null && \ - apt-get install -yqq nginx git unzip php8.2 php8.2-common php8.2-cli php8.2-fpm php8.2-mysql > /dev/null + apt-get install -yqq nginx git unzip php8.3 php8.3-common php8.3-cli php8.3-fpm php8.3-mysql > /dev/null -COPY deploy/conf/* /etc/php/8.2/fpm/ +COPY deploy/conf/* /etc/php/8.3/fpm/ ADD ./ /flight WORKDIR /flight @@ -18,11 +18,11 @@ COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet -RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.2/fpm/php-fpm.conf ; fi; +RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.3/fpm/php-fpm.conf ; fi; RUN chmod -R 777 /flight EXPOSE 8080 -CMD service php8.2-fpm start && \ +CMD service php8.3-fpm start && \ nginx -c /flight/deploy/nginx.conf From 98aedf56438fa110eedec7f9018e7009bfe80ae3 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Wed, 29 Nov 2023 22:49:32 +0100 Subject: [PATCH 013/210] [php] Comet update to PHP 8.3 (#8587) --- frameworks/PHP/comet/comet-mysql.dockerfile | 8 ++++---- frameworks/PHP/comet/comet.dockerfile | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/frameworks/PHP/comet/comet-mysql.dockerfile b/frameworks/PHP/comet/comet-mysql.dockerfile index 324b2a7ba46..9d694c24d99 100644 --- a/frameworks/PHP/comet/comet-mysql.dockerfile +++ b/frameworks/PHP/comet/comet-mysql.dockerfile @@ -6,14 +6,14 @@ RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /de RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null -RUN apt-get install -yqq php8.1-cli php8.1-xml php8.1-mysql php8.1-mbstring > /dev/null +RUN apt-get install -yqq php8.3-cli php8.3-xml php8.3-mysql php8.3-mbstring > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -RUN apt-get install -y php-pear php8.1-dev libevent-dev git > /dev/null -RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.1/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null +RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini -COPY php.ini /etc/php/8.1/cli/php.ini +COPY php.ini /etc/php/8.3/cli/php.ini ADD ./ /comet WORKDIR /comet diff --git a/frameworks/PHP/comet/comet.dockerfile b/frameworks/PHP/comet/comet.dockerfile index 1eec2fdd414..545a4abcaba 100644 --- a/frameworks/PHP/comet/comet.dockerfile +++ b/frameworks/PHP/comet/comet.dockerfile @@ -6,14 +6,14 @@ RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /de RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null -RUN apt-get install -yqq php8.1-cli php8.1-pgsql php8.1-xml php8.1-mbstring > /dev/null +RUN apt-get install -yqq php8.3-cli php8.3-pgsql php8.3-xml php8.3-mbstring > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -RUN apt-get install -y php-pear php8.1-dev libevent-dev git > /dev/null -RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.1/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null +RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini -COPY php.ini /etc/php/8.1/cli/php.ini +COPY php.ini /etc/php/8.3/cli/php.ini ADD ./ /comet WORKDIR /comet From 4a5ac4b1142673b9729f4c21aa30538b8cee9293 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Wed, 29 Nov 2023 22:49:51 +0100 Subject: [PATCH 014/210] [php] Codeigniter & Duckphp update to PHP 8.3 (#8586) --- frameworks/PHP/codeigniter/codeigniter.dockerfile | 8 ++++---- frameworks/PHP/duckphp/duckphp.dockerfile | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/frameworks/PHP/codeigniter/codeigniter.dockerfile b/frameworks/PHP/codeigniter/codeigniter.dockerfile index ace1114fc92..e04cf572ab6 100644 --- a/frameworks/PHP/codeigniter/codeigniter.dockerfile +++ b/frameworks/PHP/codeigniter/codeigniter.dockerfile @@ -7,16 +7,16 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null RUN apt-get update > /dev/null && apt-get install -yqq nginx git unzip \ - php8.2-cli php8.2-fpm php8.2-mysql php8.2-mbstring php8.2-intl php8.2-curl > /dev/null + php8.3-cli php8.3-fpm php8.3-mysql php8.3-mbstring php8.3-intl php8.3-curl > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.2/fpm/ +COPY deploy/conf/* /etc/php/8.3/fpm/ ADD ./ /codeigniter WORKDIR /codeigniter -RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.2/fpm/php-fpm.conf ; fi; +RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.3/fpm/php-fpm.conf ; fi; RUN composer install --optimize-autoloader --classmap-authoritative --no-dev #--quiet @@ -25,5 +25,5 @@ RUN chmod -R 777 writable EXPOSE 8080 -CMD service php8.2-fpm start && \ +CMD service php8.3-fpm start && \ nginx -c /codeigniter/deploy/nginx.conf diff --git a/frameworks/PHP/duckphp/duckphp.dockerfile b/frameworks/PHP/duckphp/duckphp.dockerfile index ee95b8e1e2b..f81fcdb546f 100644 --- a/frameworks/PHP/duckphp/duckphp.dockerfile +++ b/frameworks/PHP/duckphp/duckphp.dockerfile @@ -6,18 +6,18 @@ RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /de RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php RUN apt-get update -yqq > /dev/null && \ apt-get install -yqq nginx git unzip \ - php8.2-cli php8.2-fpm php8.2-mysql php8.2-dev > /dev/null + php8.3-cli php8.3-fpm php8.3-mysql php8.3-dev > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.2/fpm/ +COPY deploy/conf/* /etc/php/8.3/fpm/ ADD ./ /duckphp WORKDIR /duckphp -RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.2/fpm/php-fpm.conf ; fi; +RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.3/fpm/php-fpm.conf ; fi; RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet -CMD service php8.2-fpm start && \ +CMD service php8.3-fpm start && \ nginx -c /duckphp/deploy/nginx.conf From b2ceb4493e24c1b96fb8409cb7918ad3bff0342e Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Wed, 29 Nov 2023 22:50:00 +0100 Subject: [PATCH 015/210] [php] Cakephp update to PHP 8.3 (#8585) * [php] Cakephp update to PHP 8.3 * Remove xdebug --- frameworks/PHP/cakephp/cakephp-workerman.dockerfile | 10 ++++++---- frameworks/PHP/cakephp/cakephp.dockerfile | 12 ++++++------ 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/frameworks/PHP/cakephp/cakephp-workerman.dockerfile b/frameworks/PHP/cakephp/cakephp-workerman.dockerfile index 2495405d240..0339af783c9 100644 --- a/frameworks/PHP/cakephp/cakephp-workerman.dockerfile +++ b/frameworks/PHP/cakephp/cakephp-workerman.dockerfile @@ -7,12 +7,12 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null RUN apt-get install -yqq git unzip \ - php8.2-cli php8.2-mysql php8.2-mbstring php8.2-intl php8.2-xml php8.2-curl > /dev/null + php8.3-cli php8.3-mysql php8.3-mbstring php8.3-intl php8.3-xml php8.3-curl > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -RUN apt-get install -y php-pear php8.2-dev libevent-dev > /dev/null -RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.2/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null +RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini EXPOSE 8080 @@ -24,7 +24,9 @@ RUN composer install --optimize-autoloader --classmap-authoritative --no-dev -- RUN chmod -R 777 /cakephp -#COPY deploy/conf/cli-php.ini /etc/php/8.2/cli/php.ini +#ENV XDEBUG_CONFIG="remote_host=$(ipconfig getifaddr en0)" +ENV XDEBUG_SESSION=xdebug_is_great +#COPY deploy/conf/cli-php.ini /etc/php/8.3/cli/php.ini CMD php -c deploy/conf/cli-php.ini \ server.php start diff --git a/frameworks/PHP/cakephp/cakephp.dockerfile b/frameworks/PHP/cakephp/cakephp.dockerfile index 80251987428..438d467b820 100644 --- a/frameworks/PHP/cakephp/cakephp.dockerfile +++ b/frameworks/PHP/cakephp/cakephp.dockerfile @@ -7,22 +7,22 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null RUN apt-get install -yqq nginx git unzip \ - php8.2-fpm php8.2-mysql php8.2-xml php8.2-mbstring php8.2-intl php8.2-dev php8.2-curl > /dev/null + php8.3-fpm php8.3-mysql php8.3-xml php8.3-mbstring php8.3-intl php8.3-dev php8.3-curl php-xdebug > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.2/fpm/ -COPY deploy/conf/* /etc/php/8.2/cli/ +COPY deploy/conf/* /etc/php/8.3/fpm/ +COPY deploy/conf/* /etc/php/8.3/cli/ ADD ./ /cakephp WORKDIR /cakephp -RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.2/fpm/php-fpm.conf ; fi; +RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.3/fpm/php-fpm.conf ; fi; -RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet +RUN composer install --optimize-autoloader --classmap-authoritative --no-dev RUN chmod -R 777 /cakephp -CMD service php8.2-fpm start && \ +CMD service php8.3-fpm start && \ nginx -c /cakephp/deploy/nginx.conf From 0b8566bce4f457050842cb6004ceca7472aab837 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Wed, 29 Nov 2023 22:50:10 +0100 Subject: [PATCH 016/210] [php] Symfony update to PHP 8.3 (#8583) --- frameworks/PHP/symfony/server.php | 2 +- frameworks/PHP/symfony/start.php | 2 +- frameworks/PHP/symfony/symfony-mysql.dockerfile | 14 +++++++------- frameworks/PHP/symfony/symfony-raw.dockerfile | 14 +++++++------- frameworks/PHP/symfony/symfony-swoole.dockerfile | 2 +- .../PHP/symfony/symfony-workerman.dockerfile | 8 ++++---- frameworks/PHP/symfony/symfony.dockerfile | 14 +++++++------- 7 files changed, 28 insertions(+), 28 deletions(-) diff --git a/frameworks/PHP/symfony/server.php b/frameworks/PHP/symfony/server.php index 485c961785f..4b1691a91a4 100644 --- a/frameworks/PHP/symfony/server.php +++ b/frameworks/PHP/symfony/server.php @@ -12,7 +12,7 @@ $http_worker->count = (int) shell_exec('nproc') * 4; $http_worker->name = 'AdapterMan-Symfony'; -$http_worker->onWorkerStart = function () { +$http_worker->onWorkerStart = static function () { Header::$date = gmdate('D, d M Y H:i:s').' GMT'; Timer::add(1, function() { Header::$date = gmdate('D, d M Y H:i:s').' GMT'; diff --git a/frameworks/PHP/symfony/start.php b/frameworks/PHP/symfony/start.php index 58dc7be8368..9c1e9045a73 100644 --- a/frameworks/PHP/symfony/start.php +++ b/frameworks/PHP/symfony/start.php @@ -5,7 +5,7 @@ use Symfony\Component\ErrorHandler\Debug; use Symfony\Component\HttpFoundation\Request; -require __DIR__.'/vendor/autoload.php'; +//require __DIR__.'/vendor/autoload.php'; (new Dotenv())->bootEnv(__DIR__.'/.env'); diff --git a/frameworks/PHP/symfony/symfony-mysql.dockerfile b/frameworks/PHP/symfony/symfony-mysql.dockerfile index cb81f390cee..c6361bcacd8 100644 --- a/frameworks/PHP/symfony/symfony-mysql.dockerfile +++ b/frameworks/PHP/symfony/symfony-mysql.dockerfile @@ -8,17 +8,17 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null RUN apt-get install -yqq nginx git unzip curl \ - php8.2-cli php8.2-fpm php8.2-mysql \ - php8.2-mbstring php8.2-xml php8.2-curl php8.2-dev > /dev/null + php8.3-cli php8.3-fpm php8.3-mysql \ + php8.3-mbstring php8.3-xml php8.3-curl php8.3-dev > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.2/fpm/ +COPY deploy/conf/* /etc/php/8.3/fpm/ ADD . /symfony WORKDIR /symfony -RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.2/fpm/php-fpm.conf ; fi; +RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.3/fpm/php-fpm.conf ; fi; RUN mkdir -m 777 -p /symfony/var/cache/{dev,prod} /symfony/var/log @@ -26,14 +26,14 @@ ENV COMPOSER_ALLOW_SUPERUSER=1 RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet --no-scripts RUN cp deploy/mysql/.env . && composer dump-env prod && bin/console cache:clear -RUN echo "opcache.preload=/symfony/var/cache/prod/App_KernelProdContainer.preload.php" >> /etc/php/8.2/fpm/php.ini +RUN echo "opcache.preload=/symfony/var/cache/prod/App_KernelProdContainer.preload.php" >> /etc/php/8.3/fpm/php.ini EXPOSE 8080 # Uncomment next line for Laravel console error logging to be viewable in docker logs -# RUN echo "catch_workers_output = yes" >> /etc/php/8.2/fpm/php-fpm.conf +# RUN echo "catch_workers_output = yes" >> /etc/php/8.3/fpm/php-fpm.conf RUN mkdir -p /run/php -CMD /usr/sbin/php-fpm8.2 --fpm-config /etc/php/8.2/fpm/php-fpm.conf && \ +CMD service php8.3-fpm start && \ nginx -c /symfony/deploy/nginx.conf \ No newline at end of file diff --git a/frameworks/PHP/symfony/symfony-raw.dockerfile b/frameworks/PHP/symfony/symfony-raw.dockerfile index a7df9628f12..2957d6246c2 100644 --- a/frameworks/PHP/symfony/symfony-raw.dockerfile +++ b/frameworks/PHP/symfony/symfony-raw.dockerfile @@ -7,17 +7,17 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null RUN apt-get install -yqq nginx git unzip curl \ - php8.2-cli php8.2-fpm php8.2-pgsql \ - php8.2-mbstring php8.2-xml php8.2-curl > /dev/null + php8.3-cli php8.3-fpm php8.3-pgsql \ + php8.3-mbstring php8.3-xml php8.3-curl > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.2/fpm/ +COPY deploy/conf/* /etc/php/8.3/fpm/ ADD . /symfony WORKDIR /symfony -RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.2/fpm/php-fpm.conf ; fi; +RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.3/fpm/php-fpm.conf ; fi; RUN mkdir -m 777 -p /symfony/var/cache/{dev,prod} /symfony/var/log @@ -25,13 +25,13 @@ ENV COMPOSER_ALLOW_SUPERUSER=1 RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet --no-scripts RUN cp deploy/postgresql/.env . && composer dump-env prod && bin/console cache:clear -RUN echo "opcache.preload=/symfony/var/cache/prod/App_KernelProdContainer.preload.php" >> /etc/php/8.2/fpm/php.ini +RUN echo "opcache.preload=/symfony/var/cache/prod/App_KernelProdContainer.preload.php" >> /etc/php/8.3/fpm/php.ini EXPOSE 8080 # Uncomment next line for Laravel console error logging to be viewable in docker logs -# RUN echo "catch_workers_output = yes" >> /etc/php/8.2/fpm/php-fpm.conf +# RUN echo "catch_workers_output = yes" >> /etc/php/8.3/fpm/php-fpm.conf RUN mkdir -p /run/php -CMD /usr/sbin/php-fpm8.2 --fpm-config /etc/php/8.2/fpm/php-fpm.conf && \ +CMD service php8.3-fpm start && \ nginx -c /symfony/deploy/nginx.conf diff --git a/frameworks/PHP/symfony/symfony-swoole.dockerfile b/frameworks/PHP/symfony/symfony-swoole.dockerfile index de288786aa2..b23c0e67b02 100644 --- a/frameworks/PHP/symfony/symfony-swoole.dockerfile +++ b/frameworks/PHP/symfony/symfony-swoole.dockerfile @@ -1,4 +1,4 @@ -FROM php:8.2-cli +FROM php:8.3-cli RUN pecl install swoole > /dev/null && \ docker-php-ext-enable swoole diff --git a/frameworks/PHP/symfony/symfony-workerman.dockerfile b/frameworks/PHP/symfony/symfony-workerman.dockerfile index 9990cc5300b..b306f90710d 100644 --- a/frameworks/PHP/symfony/symfony-workerman.dockerfile +++ b/frameworks/PHP/symfony/symfony-workerman.dockerfile @@ -7,12 +7,12 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null RUN apt-get install -yqq git unzip \ - php8.2-cli php8.2-pgsql php8.2-mbstring php8.2-xml php8.2-curl > /dev/null + php8.3-cli php8.3-pgsql php8.3-mbstring php8.3-xml php8.3-curl > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -RUN apt-get install -y php-pear php8.2-dev libevent-dev > /dev/null -RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.2/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null +RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini EXPOSE 8080 @@ -25,6 +25,6 @@ ENV COMPOSER_ALLOW_SUPERUSER=1 RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet --no-scripts RUN cp deploy/postgresql/.env . && composer dump-env prod && bin/console cache:clear -COPY deploy/conf/cli-php.ini /etc/php/8.2/cli/php.ini +COPY deploy/conf/cli-php.ini /etc/php/8.3/cli/php.ini CMD php server.php start diff --git a/frameworks/PHP/symfony/symfony.dockerfile b/frameworks/PHP/symfony/symfony.dockerfile index b3678a7a227..392f19e91b6 100644 --- a/frameworks/PHP/symfony/symfony.dockerfile +++ b/frameworks/PHP/symfony/symfony.dockerfile @@ -7,17 +7,17 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null RUN apt-get install -yqq nginx git unzip curl \ - php8.2-cli php8.2-fpm php8.2-pgsql \ - php8.2-mbstring php8.2-xml php8.2-curl php8.2-dev > /dev/null + php8.3-cli php8.3-fpm php8.3-pgsql \ + php8.3-mbstring php8.3-xml php8.3-curl php8.3-dev > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.2/fpm/ +COPY deploy/conf/* /etc/php/8.3/fpm/ ADD . /symfony WORKDIR /symfony -RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.2/fpm/php-fpm.conf ; fi; +RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.3/fpm/php-fpm.conf ; fi; RUN mkdir -m 777 -p /symfony/var/cache/{dev,prod} /symfony/var/log @@ -25,13 +25,13 @@ ENV COMPOSER_ALLOW_SUPERUSER=1 RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet --no-scripts RUN cp deploy/postgresql/.env . && composer dump-env prod && bin/console cache:clear -RUN echo "opcache.preload=/symfony/var/cache/prod/App_KernelProdContainer.preload.php" >> /etc/php/8.2/fpm/php.ini +RUN echo "opcache.preload=/symfony/var/cache/prod/App_KernelProdContainer.preload.php" >> /etc/php/8.3/fpm/php.ini EXPOSE 8080 # Uncomment next line for Laravel console error logging to be viewable in docker logs -# RUN echo "catch_workers_output = yes" >> /etc/php/8.2/fpm/php-fpm.conf +# RUN echo "catch_workers_output = yes" >> /etc/php/8.3/fpm/php-fpm.conf RUN mkdir -p /run/php -CMD /usr/sbin/php-fpm8.2 --fpm-config /etc/php/8.2/fpm/php-fpm.conf && \ +CMD service php8.3-fpm start && \ nginx -c /symfony/deploy/nginx.conf \ No newline at end of file From 871af3ac3e2970cdae2406a41ecb36fd30c40423 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Wed, 29 Nov 2023 22:50:20 +0100 Subject: [PATCH 017/210] [php] Laravel update to PHP 8.3 (#8584) --- frameworks/PHP/laravel/laravel-laravel-s.dockerfile | 2 +- frameworks/PHP/laravel/laravel-roadrunner.dockerfile | 2 +- frameworks/PHP/laravel/laravel-swoole.dockerfile | 2 +- frameworks/PHP/laravel/laravel-workerman.dockerfile | 8 ++++---- frameworks/PHP/laravel/laravel.dockerfile | 10 +++++----- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/frameworks/PHP/laravel/laravel-laravel-s.dockerfile b/frameworks/PHP/laravel/laravel-laravel-s.dockerfile index 4ff73d7911d..4cce4090f3d 100644 --- a/frameworks/PHP/laravel/laravel-laravel-s.dockerfile +++ b/frameworks/PHP/laravel/laravel-laravel-s.dockerfile @@ -1,4 +1,4 @@ -FROM php:8.2-cli +FROM php:8.3-cli RUN pecl install swoole > /dev/null && \ docker-php-ext-enable swoole diff --git a/frameworks/PHP/laravel/laravel-roadrunner.dockerfile b/frameworks/PHP/laravel/laravel-roadrunner.dockerfile index 37e5c11b9d0..8aa87522504 100644 --- a/frameworks/PHP/laravel/laravel-roadrunner.dockerfile +++ b/frameworks/PHP/laravel/laravel-roadrunner.dockerfile @@ -1,4 +1,4 @@ -FROM php:8.2-cli +FROM php:8.3-cli RUN docker-php-ext-install pdo_mysql pcntl opcache sockets > /dev/null diff --git a/frameworks/PHP/laravel/laravel-swoole.dockerfile b/frameworks/PHP/laravel/laravel-swoole.dockerfile index 5cbef757cd0..77cfef19fe0 100644 --- a/frameworks/PHP/laravel/laravel-swoole.dockerfile +++ b/frameworks/PHP/laravel/laravel-swoole.dockerfile @@ -1,4 +1,4 @@ -FROM php:8.2-cli +FROM php:8.3-cli RUN pecl install swoole > /dev/null && \ docker-php-ext-enable swoole diff --git a/frameworks/PHP/laravel/laravel-workerman.dockerfile b/frameworks/PHP/laravel/laravel-workerman.dockerfile index 605d2a1afc2..016c3d0d9a7 100644 --- a/frameworks/PHP/laravel/laravel-workerman.dockerfile +++ b/frameworks/PHP/laravel/laravel-workerman.dockerfile @@ -7,12 +7,12 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null RUN apt-get install -yqq git unzip \ - php8.2-cli php8.2-mysql php8.2-mbstring php8.2-xml php8.2-curl > /dev/null + php8.3-cli php8.3-mysql php8.3-mbstring php8.3-xml php8.3-curl > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -RUN apt-get install -y php-pear php8.2-dev libevent-dev > /dev/null -RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.2/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null +RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini ADD ./ /laravel WORKDIR /laravel @@ -26,6 +26,6 @@ COPY deploy/workerman/composer.json ./ RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet RUN php artisan optimize -COPY deploy/conf/cli-php.ini /etc/php/8.2/cli/php.ini +COPY deploy/conf/cli-php.ini /etc/php/8.3/cli/php.ini CMD php server-man.php start diff --git a/frameworks/PHP/laravel/laravel.dockerfile b/frameworks/PHP/laravel/laravel.dockerfile index 616f4dac552..c1858216a66 100644 --- a/frameworks/PHP/laravel/laravel.dockerfile +++ b/frameworks/PHP/laravel/laravel.dockerfile @@ -7,16 +7,16 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null RUN apt-get install -yqq nginx git unzip \ - php8.2-cli php8.2-fpm php8.2-mysql php8.2-mbstring php8.2-xml php8.2-dev > /dev/null + php8.3-cli php8.3-fpm php8.3-mysql php8.3-mbstring php8.3-xml php8.3-dev > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.2/fpm/ +COPY deploy/conf/* /etc/php/8.3/fpm/ ADD ./ /laravel WORKDIR /laravel -RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.2/fpm/php-fpm.conf ; fi; +RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.3/fpm/php-fpm.conf ; fi; RUN mkdir -p /laravel/bootstrap/cache /laravel/storage/logs /laravel/storage/framework/sessions /laravel/storage/framework/views /laravel/storage/framework/cache RUN chmod -R 777 /laravel @@ -27,8 +27,8 @@ RUN php artisan optimize EXPOSE 8080 # Uncomment next line for Laravel console error logging to be viewable in docker logs -# RUN echo "catch_workers_output = yes" >> /etc/php/8.2/fpm/php-fpm.conf +# RUN echo "catch_workers_output = yes" >> /etc/php/8.3/fpm/php-fpm.conf RUN mkdir -p /run/php -CMD /usr/sbin/php-fpm8.2 --fpm-config /etc/php/8.2/fpm/php-fpm.conf && \ +CMD /usr/sbin/php-fpm8.3 --fpm-config /etc/php/8.3/fpm/php-fpm.conf && \ nginx -c /laravel/deploy/nginx.conf From d5ea0374a20663058745d0ba40055616c84bcee5 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Wed, 29 Nov 2023 22:50:28 +0100 Subject: [PATCH 018/210] [php] Workerman update to PHP 8.3 (#8582) --- frameworks/PHP/workerman/workerman-pgsql.dockerfile | 8 ++++---- frameworks/PHP/workerman/workerman-php8-jit.dockerfile | 10 +++++----- frameworks/PHP/workerman/workerman.dockerfile | 8 ++++---- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/frameworks/PHP/workerman/workerman-pgsql.dockerfile b/frameworks/PHP/workerman/workerman-pgsql.dockerfile index ca4029a2dd1..5e799c4b578 100644 --- a/frameworks/PHP/workerman/workerman-pgsql.dockerfile +++ b/frameworks/PHP/workerman/workerman-pgsql.dockerfile @@ -5,14 +5,14 @@ RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /de RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null -RUN apt-get install -yqq php8.2-cli php8.2-pgsql php8.2-xml > /dev/null +RUN apt-get install -yqq php8.3-cli php8.3-pgsql php8.3-xml > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -RUN apt-get install -y php-pear php8.2-dev libevent-dev git > /dev/null -RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.2/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null +RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini -COPY php.ini /etc/php/8.2/cli/php.ini +COPY php.ini /etc/php/8.3/cli/php.ini ADD ./ /workerman WORKDIR /workerman diff --git a/frameworks/PHP/workerman/workerman-php8-jit.dockerfile b/frameworks/PHP/workerman/workerman-php8-jit.dockerfile index 61413217714..9ead4cd2124 100644 --- a/frameworks/PHP/workerman/workerman-php8-jit.dockerfile +++ b/frameworks/PHP/workerman/workerman-php8-jit.dockerfile @@ -6,21 +6,21 @@ RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /de RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null -RUN apt-get install -yqq php8.2-cli php8.2-pgsql php8.2-xml > /dev/null +RUN apt-get install -yqq php8.3-cli php8.3-pgsql php8.3-xml > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -RUN apt-get install -y php-pear php8.2-dev libevent-dev git > /dev/null -RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.2/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null +RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini -COPY php-jit.ini /etc/php/8.2/cli/php.ini +COPY php-jit.ini /etc/php/8.3/cli/php.ini ADD ./ /workerman WORKDIR /workerman RUN sed -i "s|'/app.php|'/app-pg.php|g" server.php RUN sed -i "s|init()|DbRaw::init()|g" server.php -RUN sed -i "s|opcache.jit=off|opcache.jit=function|g" /etc/php/8.2/cli/conf.d/10-opcache.ini +RUN sed -i "s|opcache.jit=off|opcache.jit=function|g" /etc/php/8.3/cli/conf.d/10-opcache.ini RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet diff --git a/frameworks/PHP/workerman/workerman.dockerfile b/frameworks/PHP/workerman/workerman.dockerfile index 1652e708baa..9b321d73ce5 100644 --- a/frameworks/PHP/workerman/workerman.dockerfile +++ b/frameworks/PHP/workerman/workerman.dockerfile @@ -6,14 +6,14 @@ RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /de RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null -RUN apt-get install -yqq php8.2-cli php8.2-mysql php8.2-xml > /dev/null +RUN apt-get install -yqq php8.3-cli php8.3-mysql php8.3-xml > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -RUN apt-get install -y php-pear php8.2-dev libevent-dev git > /dev/null -RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.2/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null +RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini -COPY php-jit.ini /etc/php/8.2/cli/php.ini +COPY php-jit.ini /etc/php/8.3/cli/php.ini ADD ./ /workerman WORKDIR /workerman From ee15f9016f48fe9dfb6902a140474bc90905ea54 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Wed, 29 Nov 2023 22:50:38 +0100 Subject: [PATCH 019/210] [php] Update plain PHP to v8.3 (#8580) * [php] Update plain PHP to v8.3 * Fix pear --- frameworks/PHP/php/php-caddy.dockerfile | 8 ++++---- frameworks/PHP/php/php-eloquent.dockerfile | 8 ++++---- frameworks/PHP/php/php-h2o.dockerfile | 4 ++-- .../PHP/php/php-laravel-query-builder.dockerfile | 8 ++++---- frameworks/PHP/php/php-pgsql-raw.dockerfile | 8 ++++---- frameworks/PHP/php/php-pools.dockerfile | 10 +++++----- frameworks/PHP/php/php-raw7-tcp.dockerfile | 10 +++++----- frameworks/PHP/php/php-workerman.dockerfile | 8 ++++---- frameworks/PHP/php/php.dockerfile | 9 +++++---- 9 files changed, 37 insertions(+), 36 deletions(-) diff --git a/frameworks/PHP/php/php-caddy.dockerfile b/frameworks/PHP/php/php-caddy.dockerfile index dd3a2b37eee..e148b16570f 100644 --- a/frameworks/PHP/php/php-caddy.dockerfile +++ b/frameworks/PHP/php/php-caddy.dockerfile @@ -7,9 +7,9 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ apt-get update -yqq > /dev/null && apt-get upgrade -yqq RUN apt-get install -yqq git unzip curl \ - php8.2 php8.2-common php8.2-cli php8.2-fpm php8.2-mysql > /dev/null + php8.3 php8.3-common php8.3-cli php8.3-fpm php8.3-mysql > /dev/null -COPY deploy/conf/* /etc/php/8.2/fpm/ +COPY deploy/conf/* /etc/php/8.3/fpm/ # Install Caddyserver RUN apt-get install -y debian-keyring debian-archive-keyring apt-transport-https > /dev/null \ @@ -20,11 +20,11 @@ RUN apt-get install -y debian-keyring debian-archive-keyring apt-transport-https ADD ./ /php WORKDIR /php -RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.2/fpm/php-fpm.conf ; fi; +RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.3/fpm/php-fpm.conf ; fi; RUN chmod -R 777 /php EXPOSE 8080 -CMD service php8.2-fpm start && \ +CMD service php8.3-fpm start && \ caddy run --config deploy/caddy/Caddyfile diff --git a/frameworks/PHP/php/php-eloquent.dockerfile b/frameworks/PHP/php/php-eloquent.dockerfile index 0214c23a181..615f0a10072 100644 --- a/frameworks/PHP/php/php-eloquent.dockerfile +++ b/frameworks/PHP/php/php-eloquent.dockerfile @@ -5,16 +5,16 @@ ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php RUN apt-get update -yqq > /dev/null && \ - apt-get install -yqq nginx git unzip php8.2 php8.2-common php8.2-cli php8.2-fpm php8.2-mysql php8.2-mbstring php8.2-dev > /dev/null + apt-get install -yqq nginx git unzip php8.3 php8.3-common php8.3-cli php8.3-fpm php8.3-mysql php8.3-mbstring php8.3-dev > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.2/fpm/ +COPY deploy/conf/* /etc/php/8.3/fpm/ ADD ./ /php WORKDIR /php -RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.2/fpm/php-fpm.conf ; fi; +RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.3/fpm/php-fpm.conf ; fi; COPY deploy/eloquent/composer* ./ RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet @@ -23,6 +23,6 @@ RUN chmod -R 777 /php EXPOSE 8080 -CMD service php8.2-fpm start && \ +CMD service php8.3-fpm start && \ nginx -c /php/deploy/nginx7.conf -g "daemon off;" diff --git a/frameworks/PHP/php/php-h2o.dockerfile b/frameworks/PHP/php/php-h2o.dockerfile index 26bf9f9d5c2..2d0c6234bcd 100644 --- a/frameworks/PHP/php/php-h2o.dockerfile +++ b/frameworks/PHP/php/php-h2o.dockerfile @@ -39,7 +39,7 @@ RUN apt-get -yqq update && \ FROM "ubuntu:${UBUNTU_VERSION}" -ARG PHP_VERSION=8.2 +ARG PHP_VERSION=8.3 ENV TZ=America/Los_Angeles @@ -70,5 +70,5 @@ ARG TFB_TEST_DATABASE ARG TFB_TEST_NAME CMD sed -i "s/num-threads: x/num-threads: $((2 * $(nproc)))/g" /opt/h2o/etc/h2o.conf && \ - service php8.2-fpm start && \ + service php8.3-fpm start && \ /opt/h2o/bin/h2o -c /opt/h2o/etc/h2o.conf diff --git a/frameworks/PHP/php/php-laravel-query-builder.dockerfile b/frameworks/PHP/php/php-laravel-query-builder.dockerfile index 73c4bb52244..2ca94a15881 100644 --- a/frameworks/PHP/php/php-laravel-query-builder.dockerfile +++ b/frameworks/PHP/php/php-laravel-query-builder.dockerfile @@ -5,16 +5,16 @@ ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php RUN apt-get update -yqq > /dev/null && \ - apt-get install -yqq nginx git unzip php8.2 php8.2-common php8.2-cli php8.2-fpm php8.2-mysql php8.2-mbstring php8.2-dev > /dev/null + apt-get install -yqq nginx git unzip php8.3 php8.3-common php8.3-cli php8.3-fpm php8.3-mysql php8.3-mbstring php8.3-dev > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.2/fpm/ +COPY deploy/conf/* /etc/php/8.3/fpm/ ADD ./ /php WORKDIR /php -RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.2/fpm/php-fpm.conf ; fi; +RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.3/fpm/php-fpm.conf ; fi; COPY deploy/eloquent/composer* ./ RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet @@ -23,5 +23,5 @@ RUN chmod -R 777 /php EXPOSE 8080 -CMD service php8.2-fpm start && \ +CMD service php8.3-fpm start && \ nginx -c /php/deploy/nginx7.conf -g "daemon off;" diff --git a/frameworks/PHP/php/php-pgsql-raw.dockerfile b/frameworks/PHP/php/php-pgsql-raw.dockerfile index b1630d5da95..374656d40b9 100644 --- a/frameworks/PHP/php/php-pgsql-raw.dockerfile +++ b/frameworks/PHP/php/php-pgsql-raw.dockerfile @@ -5,9 +5,9 @@ ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php RUN apt-get update -yqq > /dev/null && \ - apt-get install -yqq nginx git unzip php8.2 php8.2-common php8.2-cli php8.2-fpm php8.2-pgsql > /dev/null + apt-get install -yqq nginx git unzip php8.3 php8.3-common php8.3-cli php8.3-fpm php8.3-pgsql > /dev/null -COPY deploy/conf/* /etc/php/8.2/fpm/ +COPY deploy/conf/* /etc/php/8.3/fpm/ ADD ./ /php WORKDIR /php @@ -17,11 +17,11 @@ RUN sed -i "s|PDO('mysql:|PDO('pgsql:|g" dbquery.php RUN sed -i "s|PDO('mysql:|PDO('pgsql:|g" fortune.php RUN sed -i "s|PDO('mysql:|PDO('pgsql:|g" updateraw.php -RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.2/fpm/php-fpm.conf ; fi; +RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.3/fpm/php-fpm.conf ; fi; RUN chmod -R 777 /php EXPOSE 8080 -CMD service php8.2-fpm start && \ +CMD service php8.3-fpm start && \ nginx -c /php/deploy/nginx7.conf -g "daemon off;" diff --git a/frameworks/PHP/php/php-pools.dockerfile b/frameworks/PHP/php/php-pools.dockerfile index 8b69d016dd9..b62917e0ec3 100644 --- a/frameworks/PHP/php/php-pools.dockerfile +++ b/frameworks/PHP/php/php-pools.dockerfile @@ -5,19 +5,19 @@ ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php RUN apt-get update -yqq > /dev/null && \ - apt-get install -yqq nginx git unzip php8.2 php8.2-common php8.2-cli php8.2-fpm php8.2-mysql > /dev/null + apt-get install -yqq nginx git unzip php8.3 php8.3-common php8.3-cli php8.3-fpm php8.3-mysql > /dev/null -COPY deploy/conf/* /etc/php/8.2/fpm/ +COPY deploy/conf/* /etc/php/8.3/fpm/ ADD ./ /php WORKDIR /php -COPY deploy/conf/php-fpm-pools.conf /etc/php/8.2/fpm/php-fpm.conf -RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 512|pm.max_children = 256|g" /etc/php/8.2/fpm/php-fpm.conf ; fi; +COPY deploy/conf/php-fpm-pools.conf /etc/php/8.3/fpm/php-fpm.conf +RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 512|pm.max_children = 256|g" /etc/php/8.3/fpm/php-fpm.conf ; fi; RUN chmod -R 777 /php EXPOSE 8080 -CMD service php8.2-fpm start && \ +CMD service php8.3-fpm start && \ nginx -c /php/deploy/nginx-pools.conf -g "daemon off;" diff --git a/frameworks/PHP/php/php-raw7-tcp.dockerfile b/frameworks/PHP/php/php-raw7-tcp.dockerfile index 79fb1cdb013..c8cd5eb855c 100644 --- a/frameworks/PHP/php/php-raw7-tcp.dockerfile +++ b/frameworks/PHP/php/php-raw7-tcp.dockerfile @@ -5,21 +5,21 @@ ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php RUN apt-get update -yqq > /dev/null && \ - apt-get install -yqq nginx git unzip php8.2 php8.2-common php8.2-cli php8.2-fpm php8.2-mysql > /dev/null + apt-get install -yqq nginx git unzip php8.3 php8.3-common php8.3-cli php8.3-fpm php8.3-mysql > /dev/null -COPY deploy/conf/* /etc/php/8.2/fpm/ +COPY deploy/conf/* /etc/php/8.3/fpm/ ADD ./ /php WORKDIR /php -RUN sed -i "s|listen = /run/php/php-fpm.sock|listen = 127.0.0.1:9001|g" /etc/php/8.2/fpm/php-fpm.conf +RUN sed -i "s|listen = /run/php/php-fpm.sock|listen = 127.0.0.1:9001|g" /etc/php/8.3/fpm/php-fpm.conf RUN sed -i "s|server unix:/var/run/php/php-fpm.sock;|server 127.0.0.1:9001;|g" deploy/nginx7.conf -RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.2/fpm/php-fpm.conf ; fi; +RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.3/fpm/php-fpm.conf ; fi; RUN chmod -R 777 /php EXPOSE 8080 -CMD service php8.2-fpm start && \ +CMD service php8.3-fpm start && \ nginx -c /php/deploy/nginx7.conf -g "daemon off;" \ No newline at end of file diff --git a/frameworks/PHP/php/php-workerman.dockerfile b/frameworks/PHP/php/php-workerman.dockerfile index e7cc2f4633d..6f392702778 100644 --- a/frameworks/PHP/php/php-workerman.dockerfile +++ b/frameworks/PHP/php/php-workerman.dockerfile @@ -7,12 +7,12 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ apt-get update -yqq > /dev/null && apt-get upgrade -yqq RUN apt-get install -yqq git unzip \ - php8.2 php8.2-common php8.2-cli php8.2-fpm php8.2-mysql > /dev/null + php8.3 php8.3-common php8.3-cli php8.3-fpm php8.3-mysql > /dev/null -RUN apt-get install -y php-pear php8.2-dev libevent-dev > /dev/null -RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.2/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.3-dev php8.3-xml libevent-dev > /dev/null +RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini -COPY deploy/workerman/cli-php.ini /etc/php/8.2/cli/php.ini +COPY deploy/workerman/cli-php.ini /etc/php/8.3/cli/php.ini COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer diff --git a/frameworks/PHP/php/php.dockerfile b/frameworks/PHP/php/php.dockerfile index 9a3e0da9577..5ad4298427f 100644 --- a/frameworks/PHP/php/php.dockerfile +++ b/frameworks/PHP/php/php.dockerfile @@ -6,18 +6,19 @@ RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /de RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ apt-get update -yqq > /dev/null && apt-get upgrade -yqq RUN apt-get install -yqq nginx git unzip \ - php8.2 php8.2-common php8.2-cli php8.2-fpm php8.2-mysql > /dev/null + php8.3 php8.3-common php8.3-cli php8.3-fpm php8.3-mysql > /dev/null -COPY deploy/conf/* /etc/php/8.2/fpm/ +COPY deploy/conf/* /etc/php/8.3/fpm/ ADD ./ /php WORKDIR /php -RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.2/fpm/php-fpm.conf ; fi; +RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.3/fpm/php-fpm.conf ; fi; +RUN sed -i "s|opcache.jit=off|;opcache.jit=off|g" /etc/php/8.3/fpm/conf.d/10-opcache.ini RUN chmod -R 777 /php EXPOSE 8080 -CMD service php8.2-fpm start && \ +CMD service php8.3-fpm start && \ nginx -c /php/deploy/nginx7.conf -g "daemon off;" From 7bd8f6193bff422d986a98e1d52ee778bae244c5 Mon Sep 17 00:00:00 2001 From: Dragos Varovici Date: Wed, 29 Nov 2023 14:51:06 -0700 Subject: [PATCH 020/210] Amber framework updated to 1.4 (#8575) * Amber framework update * Amber pool size config * Max pool size 28 * Amber fix * Amber gitignore * Amber process count * Amber docker static compilation --- frameworks/Crystal/amber/.gitignore | 1 + frameworks/Crystal/amber/amber.dockerfile | 28 +++- .../Crystal/amber/config/application.cr | 10 +- .../amber/config/initializers/database.cr | 3 +- frameworks/Crystal/amber/run.sh | 5 +- frameworks/Crystal/amber/shard.lock | 130 ++++++++++++------ frameworks/Crystal/amber/shard.yml | 26 +++- .../src/controllers/benchmark_controller.cr | 2 +- .../Crystal/amber/src/models/fortune.cr | 10 +- frameworks/Crystal/amber/src/models/world.cr | 8 +- 10 files changed, 148 insertions(+), 75 deletions(-) create mode 100644 frameworks/Crystal/amber/.gitignore diff --git a/frameworks/Crystal/amber/.gitignore b/frameworks/Crystal/amber/.gitignore new file mode 100644 index 00000000000..4eb56dc378b --- /dev/null +++ b/frameworks/Crystal/amber/.gitignore @@ -0,0 +1 @@ +lib/* \ No newline at end of file diff --git a/frameworks/Crystal/amber/amber.dockerfile b/frameworks/Crystal/amber/amber.dockerfile index 9b99c6e6c1f..4acf62ab32c 100644 --- a/frameworks/Crystal/amber/amber.dockerfile +++ b/frameworks/Crystal/amber/amber.dockerfile @@ -1,19 +1,37 @@ -FROM crystallang/crystal:0.26.1 +FROM crystallang/crystal:1.10.1-alpine as build WORKDIR /amber COPY config config COPY src src -COPY run.sh run.sh + COPY shard.lock shard.lock COPY shard.yml shard.yml -ENV GC_MARKERS 1 +RUN apk update +RUN apk add yaml-dev sqlite-dev + +# RUN shards build amber --release +RUN shards install +RUN crystal build --release --no-debug --static src/amber.cr +RUN cp amber bin/amber + +# Main Image +FROM ubuntu:22.04 + +WORKDIR /amber + ENV AMBER_ENV production -ENV DATABASE_URL postgres://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/hello_world?initial_pool_size=56&max_pool_size=56&max_idle_pool_size=56 +ENV DATABASE_URL postgres://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/hello_world?initial_pool_size=10&max_idle_pool_size=10&retry_attempts=3&retry_delay=1 +RUN apt-get update RUN apt-get install -yqq libyaml-dev -RUN shards build amber --release --no-debug + +COPY run.sh run.sh +RUN mkdir bin +COPY --from=build /amber/amber /amber/bin/amber EXPOSE 8080 CMD bash run.sh + + diff --git a/frameworks/Crystal/amber/config/application.cr b/frameworks/Crystal/amber/config/application.cr index 0495ed0d8a1..a5fcb74d1a8 100644 --- a/frameworks/Crystal/amber/config/application.cr +++ b/frameworks/Crystal/amber/config/application.cr @@ -27,14 +27,14 @@ Amber::Server.configure do |settings| # # > Read more about Linux PORT REUSE https://lwn.net/Articles/542629/ # - settings.port_reuse = false + settings.port_reuse = true # # # Process Count: This will enable Amber to be used in cluster mode, # spinning an instance for each number of process specified here. # Rule of thumb, always leave at least 1 core available for system processes/resources. # - settings.process_count = 1 + settings.process_count = (System.cpu_count).to_i32 # # # PORT: This is the port that you're application will run on. Examples would be (80, 443, 3000, 8080) @@ -45,7 +45,5 @@ Amber::Server.configure do |settings| # Log: Is the logger that will be used for Amber and it defaults to ::Logger.new(STDOUT). # You can supply a custom logger. # - settings.logger = Amber::Environment::Logger.new(nil) - # - # -end + settings.logging.severity = "info" +end \ No newline at end of file diff --git a/frameworks/Crystal/amber/config/initializers/database.cr b/frameworks/Crystal/amber/config/initializers/database.cr index 3f9bf640583..2e94e830821 100644 --- a/frameworks/Crystal/amber/config/initializers/database.cr +++ b/frameworks/Crystal/amber/config/initializers/database.cr @@ -1,4 +1,3 @@ require "granite/adapter/pg" -Granite.settings.logger = Logger.new(nil) -Granite::Adapters << Granite::Adapter::Pg.new({name: "pg", url: ENV["DATABASE_URL"]}) +Granite::Connections << Granite::Adapter::Pg.new(name: "pg", url: ENV["DATABASE_URL"]) diff --git a/frameworks/Crystal/amber/run.sh b/frameworks/Crystal/amber/run.sh index cec3997617b..7688dec1068 100644 --- a/frameworks/Crystal/amber/run.sh +++ b/frameworks/Crystal/amber/run.sh @@ -1,7 +1,4 @@ #!/bin/bash -for i in $(seq 1 $(nproc --all)); do - ./bin/amber & -done +./bin/amber -wait diff --git a/frameworks/Crystal/amber/shard.lock b/frameworks/Crystal/amber/shard.lock index 0d6c99c3483..635edcb60c1 100644 --- a/frameworks/Crystal/amber/shard.lock +++ b/frameworks/Crystal/amber/shard.lock @@ -1,86 +1,126 @@ -version: 1.0 +version: 2.0 shards: amber: - github: amberframework/amber - version: 0.9.0 + git: https://github.com/amberframework/amber.git + version: 1.4.1 amber_router: - github: amberframework/amber-router - version: 0.2.0 + git: https://github.com/amberframework/amber-router.git + version: 0.4.4 + + backtracer: + git: https://github.com/sija/backtracer.cr.git + version: 1.2.2 callback: - github: mosop/callback - version: 0.6.3 + git: https://github.com/amberframework/callback.git + version: 0.9.2 cli: - github: mosop/cli - version: 0.7.0 + git: https://github.com/amberframework/cli.git + version: 0.11.4 compiled_license: - github: elorest/compiled_license - version: 0.1.3 + git: https://github.com/elorest/compiled_license.git + version: 1.2.2 db: - github: crystal-lang/crystal-db - version: 0.5.0 + git: https://github.com/crystal-lang/crystal-db.git + version: 0.11.0 + + dotenv: + git: https://github.com/gdotdesign/cr-dotenv.git + version: 1.0.0 + + exception_page: + git: https://github.com/crystal-loot/exception_page.git + version: 0.3.1 + + future: + git: https://github.com/crystal-community/future.cr.git + version: 1.0.0 granite: - github: amberframework/granite - version: 0.13.1 + git: https://github.com/amberframework/granite.git + version: 0.23.3 + + i18n: + git: https://github.com/crimson-knight/i18n.cr.git + version: 0.4.1 + + ifrit: + git: https://github.com/imdrasil/ifrit.git + version: 0.1.3 inflector: - github: phoffer/inflector.cr - version: 0.1.8 + git: https://github.com/phoffer/inflector.cr.git + version: 1.0.0 + + jennifer: + git: https://github.com/imdrasil/jennifer.cr.git + version: 0.13.0 + + json_mapping: + git: https://github.com/crystal-lang/json_mapping.cr.git + version: 0.1.1 kilt: - github: jeromegn/kilt - version: 0.4.0 + git: https://github.com/jeromegn/kilt.git + version: 0.6.1 liquid: - github: TechMagister/liquid.cr - version: 0.3.0 + git: https://github.com/dare892/liquid.cr.git + version: 0.4.1+git.commit.e4ef5ca06bf5bafe74e0b270c7aae2941a91ddd3 micrate: - github: amberframework/micrate - version: 0.3.3 + git: https://github.com/amberframework/micrate.git + version: 0.15.0 mysql: - github: crystal-lang/crystal-mysql - version: 0.5.0 + git: https://github.com/crystal-lang/crystal-mysql.git + version: 0.14.0 optarg: - github: mosop/optarg - version: 0.5.8 + git: https://github.com/amberframework/optarg.git + version: 0.9.3 pg: - github: will/crystal-pg - version: 0.15.0 + git: https://github.com/will/crystal-pg.git + version: 0.26.0 pool: - github: ysbaddaden/pool - version: 0.2.3 + git: https://github.com/ysbaddaden/pool.git + version: 0.3.0 redis: - github: stefanwille/crystal-redis - version: 2.0.0 + git: https://github.com/stefanwille/crystal-redis.git + version: 2.8.3 + + sam: + git: https://github.com/imdrasil/sam.cr.git + version: 0.5.0 shell-table: - github: luckyframework/shell-table.cr - commit: 078a04ea58ead5203bb435a3b5fff448ddabaeea + git: https://github.com/luckyframework/shell-table.cr.git + version: 0.9.3 slang: - github: jeromegn/slang - version: 1.7.1 + git: https://github.com/jeromegn/slang.git + version: 1.7.3 sqlite3: - github: crystal-lang/crystal-sqlite3 - version: 0.10.0 - - string_inflection: - github: mosop/string_inflection - version: 0.2.1 + git: https://github.com/crystal-lang/crystal-sqlite3.git + version: 0.19.0 teeplate: - github: mosop/teeplate - version: 0.6.1 + git: https://github.com/amberframework/teeplate.git + version: 0.11.2 + + wordsmith: + git: https://github.com/luckyframework/wordsmith.git + version: 0.4.0 + + yaml_mapping: + git: https://github.com/crystal-lang/yaml_mapping.cr.git + version: 0.1.1 diff --git a/frameworks/Crystal/amber/shard.yml b/frameworks/Crystal/amber/shard.yml index b4b1cc224d2..c48994d4d4e 100644 --- a/frameworks/Crystal/amber/shard.yml +++ b/frameworks/Crystal/amber/shard.yml @@ -1,5 +1,5 @@ name: amber -version: 0.1.0 +version: 0.2.0 authors: - Amber Team and Contributors @@ -13,8 +13,28 @@ targets: dependencies: amber: github: amberframework/amber - version: 0.9.0 + version: 1.4.1 + + jennifer: + github: imdrasil/jennifer.cr + version: "~> 0.13.0" + + sam: + github: imdrasil/sam.cr + version: 0.5.0 + + pg: + github: will/crystal-pg + version: "= 0.26.0" + + mysql: + github: crystal-lang/crystal-mysql + version: 0.14.0 + + dotenv: + github: gdotdesign/cr-dotenv + version: 1.0.0 granite: github: amberframework/granite - version: 0.13.1 + version: 0.23.3 diff --git a/frameworks/Crystal/amber/src/controllers/benchmark_controller.cr b/frameworks/Crystal/amber/src/controllers/benchmark_controller.cr index 0533fa84651..aa29f7fef39 100644 --- a/frameworks/Crystal/amber/src/controllers/benchmark_controller.cr +++ b/frameworks/Crystal/amber/src/controllers/benchmark_controller.cr @@ -8,7 +8,7 @@ class BenchmarkController < Amber::Controller::Base before_action do all do response.headers["Server"] = "Amber" - response.headers["Date"] = HTTP.format_time(Time.now) + response.headers["Date"] = HTTP.format_time(Time.local) end end diff --git a/frameworks/Crystal/amber/src/models/fortune.cr b/frameworks/Crystal/amber/src/models/fortune.cr index 4bffdd59aa0..cbe4cb46f0c 100644 --- a/frameworks/Crystal/amber/src/models/fortune.cr +++ b/frameworks/Crystal/amber/src/models/fortune.cr @@ -1,9 +1,9 @@ require "granite/adapter/pg" class Fortune < Granite::Base - adapter pg - - table_name fortune - primary id : Int32 - field message : String + connection pg + table fortune + + column id : Int32, primary: true + column message : String end diff --git a/frameworks/Crystal/amber/src/models/world.cr b/frameworks/Crystal/amber/src/models/world.cr index 64347dca5b2..27976b48177 100644 --- a/frameworks/Crystal/amber/src/models/world.cr +++ b/frameworks/Crystal/amber/src/models/world.cr @@ -1,9 +1,9 @@ require "granite/adapter/pg" class World < Granite::Base - adapter pg + connection pg + table world - table_name world - primary id : Int32 - field randomnumber : Int32 + column id : Int32, primary: true + column randomnumber : Int32 end From 1883313dccfb777ca8cdf56ba439896d5d6352ff Mon Sep 17 00:00:00 2001 From: Denis Stepanov Date: Wed, 29 Nov 2023 22:51:20 +0100 Subject: [PATCH 021/210] Update to 4.2 + avoid executing HTTP operations on Vertx thread pool (#8574) --- .../controller/AsyncBenchmarkController.java | 18 ++++++++++++------ frameworks/Java/micronaut/gradle.properties | 2 +- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/frameworks/Java/micronaut/common/src/main/java/benchmark/controller/AsyncBenchmarkController.java b/frameworks/Java/micronaut/common/src/main/java/benchmark/controller/AsyncBenchmarkController.java index 7e40c36a204..df8824142a8 100644 --- a/frameworks/Java/micronaut/common/src/main/java/benchmark/controller/AsyncBenchmarkController.java +++ b/frameworks/Java/micronaut/common/src/main/java/benchmark/controller/AsyncBenchmarkController.java @@ -9,12 +9,15 @@ import io.micronaut.http.annotation.Controller; import io.micronaut.http.annotation.Get; import io.micronaut.http.annotation.QueryValue; +import io.micronaut.scheduling.TaskExecutors; +import jakarta.inject.Named; import views.fortunes; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.concurrent.CompletionStage; +import java.util.concurrent.Executor; import static java.util.Comparator.comparing; @@ -24,11 +27,14 @@ public class AsyncBenchmarkController extends AbstractBenchmarkController { private final AsyncWorldRepository worldRepository; private final AsyncFortuneRepository fortuneRepository; + private final Executor executor; public AsyncBenchmarkController(AsyncWorldRepository worldRepository, - AsyncFortuneRepository fortuneRepository) { + AsyncFortuneRepository fortuneRepository, + @Named(TaskExecutors.BLOCKING) Executor executor) { this.worldRepository = worldRepository; this.fortuneRepository = fortuneRepository; + this.executor = executor; } @Get("/prepare-data-for-test") @@ -39,7 +45,7 @@ public CompletionStage prepareDataForTest() { // https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#single-database-query @Get("/db") public CompletionStage db() { - return worldRepository.findById(randomId()); + return worldRepository.findById(randomId()).thenApplyAsync(world -> world, executor); } // https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#multiple-database-queries @@ -50,20 +56,20 @@ public CompletionStage> queries(@QueryValue String queries) { for (int i = 0; i < count; i++) { ids.add(randomId()); } - return worldRepository.findByIds(ids); + return worldRepository.findByIds(ids).thenApplyAsync(worlds -> worlds, executor); } // https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#fortunes @Get(value = "/fortunes", produces = "text/html;charset=utf-8") public CompletionStage> fortune() { - return fortuneRepository.findAll().thenApply(fortuneList -> { + return fortuneRepository.findAll().thenApplyAsync(fortuneList -> { List all = new ArrayList<>(fortuneList.size() + 1); all.add(new Fortune(0, "Additional fortune added at request time.")); all.addAll(fortuneList); all.sort(comparing(Fortune::message)); String body = fortunes.template(all).render().toString(); return HttpResponse.ok(body).contentType("text/html;charset=utf-8"); - }); + }, executor); } // https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview#database-updates @@ -74,7 +80,7 @@ public CompletionStage> updates(@QueryValue String queries) { world.setRandomNumber(randomWorldNumber()); } worlds.sort(Comparator.comparingInt(World::getId)); // Avoid deadlock - return worldRepository.updateAll(worlds).thenApply(ignore -> worlds); + return worldRepository.updateAll(worlds).thenApplyAsync(ignore -> worlds, executor); }); } diff --git a/frameworks/Java/micronaut/gradle.properties b/frameworks/Java/micronaut/gradle.properties index b292646568c..a4d3cd8e470 100644 --- a/frameworks/Java/micronaut/gradle.properties +++ b/frameworks/Java/micronaut/gradle.properties @@ -1 +1 @@ -micronautVersion = 4.1.6 +micronautVersion = 4.2.0 From 04c9461145d4bb600c1f25121141a4a637f28f41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=88=80?= Date: Thu, 30 Nov 2023 05:51:48 +0800 Subject: [PATCH 022/210] update dockerfile (#8573) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * update smart-servlet to 0.1.3-SNAPSHOT * update aio-enhance to 1.0.3-SNAPSHOT * smart-servlet bugfix * bugfix * update smart-socket to 1.5.6-SNAPSHOT * remove file * update aio-enhance to 1.0.4-SNAPSHOT * 优化代码 * 优化代码 * update smart-socket to 1.5.6 * config threadNum * update smart-socket to 1.5.7-SNAPSHOT * 优化代码 * update smart-socket to 1.5.10-SNAPSHOT * 优化代码 * 优化代码 * 优化代码 * 异常aio-enhance * 优化代码 * 优化代码 * 优化代码 * remove aio-pro * remove headerLimiter * update hikaricp version * replace json util * 更新线程模型 * upgrade smart-servlet to 0.1.9-SNAPSHOT * config thread num * config thread num * revert code * revert code * upgrade smart-servlet to 0.2.1-SNAPSHOT * upgrade smart-servlet to 0.6-SNAPSHOT * upgrade smart-servlet to 0.6-SNAPSHOT * upgrade smart-servlet to 0.6-SNAPSHOT * upgrade smart-servlet to 0.6-SNAPSHOT * upgrade smart-servlet to 0.6-SNAPSHOT * upgrade smart-servlet to 0.6-SNAPSHOT * upgrade smart-servlet to 0.6-SNAPSHOT --- frameworks/Java/smart-socket/pom.xml | 6 +- .../smart-socket-smart-servlet.dockerfile | 6 +- .../Java/smart-socket/smart-socket.dockerfile | 6 +- .../java/org/smartboot/http/JsonUtil.java | 84 +++++++++---------- .../java/org/smartboot/servlet/Bootstrap.java | 12 +-- .../smartboot/servlet/HelloWorldServlet.java | 11 +-- .../org/smartboot/servlet/JsonServlet.java | 10 +-- 7 files changed, 66 insertions(+), 69 deletions(-) diff --git a/frameworks/Java/smart-socket/pom.xml b/frameworks/Java/smart-socket/pom.xml index e4bbc87e873..81fbc295b98 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -8,10 +8,10 @@ jar UTF-8 - 11 - 11 + 17 + 17 2.17.1 - 0.2.1-SNAPSHOT + 0.6-SNAPSHOT 5.0.0 0.9.23 diff --git a/frameworks/Java/smart-socket/smart-socket-smart-servlet.dockerfile b/frameworks/Java/smart-socket/smart-socket-smart-servlet.dockerfile index b6fa2e31680..8b1cbe79930 100644 --- a/frameworks/Java/smart-socket/smart-socket-smart-servlet.dockerfile +++ b/frameworks/Java/smart-socket/smart-socket-smart-servlet.dockerfile @@ -1,13 +1,13 @@ -FROM maven:3.6.1-jdk-11-slim as maven +FROM maven:3.8.6-openjdk-18-slim as maven WORKDIR /smart-socket COPY pom.xml pom.xml COPY src src RUN mvn compile assembly:single -q -FROM openjdk:11.0.3-jdk-slim +FROM openjdk:21-jdk-slim WORKDIR /smart-socket COPY --from=maven /smart-socket/target/smart-socket-benchmark-1.0-jar-with-dependencies.jar app.jar EXPOSE 8080 -CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-cp", "app.jar", "org.smartboot.servlet.Bootstrap"] +CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-cp", "app.jar", "org.smartboot.servlet.Bootstrap"] diff --git a/frameworks/Java/smart-socket/smart-socket.dockerfile b/frameworks/Java/smart-socket/smart-socket.dockerfile index f51ddcbd178..b40ad2c8d43 100644 --- a/frameworks/Java/smart-socket/smart-socket.dockerfile +++ b/frameworks/Java/smart-socket/smart-socket.dockerfile @@ -1,13 +1,13 @@ -FROM maven:3.6.1-jdk-11-slim as maven +FROM maven:3.8.6-openjdk-18-slim as maven WORKDIR /smart-socket COPY pom.xml pom.xml COPY src src RUN mvn compile assembly:single -q -FROM openjdk:11.0.3-jdk-slim +FROM openjdk:21-jdk-slim WORKDIR /smart-socket COPY --from=maven /smart-socket/target/smart-socket-benchmark-1.0-jar-with-dependencies.jar app.jar EXPOSE 8080 -CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AggressiveOpts", "-cp", "app.jar", "org.smartboot.http.Bootstrap"] +CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-cp", "app.jar", "org.smartboot.http.Bootstrap"] diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/JsonUtil.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/JsonUtil.java index 0aa0f44a2d1..b20525ec571 100644 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/JsonUtil.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/http/JsonUtil.java @@ -1,11 +1,12 @@ package org.smartboot.http; +import com.jsoniter.output.JsonStream; +import com.jsoniter.output.JsonStreamPool; import com.jsoniter.spi.JsonException; -import io.edap.x.json.Eson; -import io.edap.x.json.JsonWriter; +import com.jsoniter.spi.Slice; +import jakarta.servlet.http.HttpServletResponse; import org.smartboot.http.server.HttpResponse; -import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** @@ -13,57 +14,56 @@ * @version V1.0 , 2020/6/16 */ public class JsonUtil { + // public static void writeJsonBytes(HttpResponse httpResponse, Object obj) { +// JsonWriter writer = Eson.THREAD_WRITER.get(); +// try { +// writer.reset(); +// Eson.serialize(obj, writer); +// httpResponse.setContentLength(writer.size()); +// writer.toStream(httpResponse.getOutputStream()); +// } catch (IOException e) { +// throw new JsonException(e); +// } +// } public static void writeJsonBytes(HttpResponse httpResponse, Object obj) { - JsonWriter writer = Eson.THREAD_WRITER.get(); + JsonStream stream = JsonStreamPool.borrowJsonStream(); try { - writer.reset(); - Eson.serialize(obj, writer); - httpResponse.setContentLength(writer.size()); - writer.toStream(httpResponse.getOutputStream()); + stream.reset(null); + stream.writeVal(obj.getClass(), obj); + Slice slice = stream.buffer(); + httpResponse.setContentLength(slice.tail()); + httpResponse.getOutputStream().write(slice.data(), 0, slice.tail()); } catch (IOException e) { throw new JsonException(e); + } finally { + JsonStreamPool.returnJsonStream(stream); } } -// public static void writeJsonBytes(HttpResponse httpResponse, Object obj) { -// JsonStream stream = JsonStreamPool.borrowJsonStream(); -// try { -// stream.reset(null); -// stream.writeVal(obj.getClass(), obj); -// Slice slice = stream.buffer(); -// httpResponse.setContentLength(slice.tail()); -// httpResponse.getOutputStream().write(slice.data(), 0, slice.tail()); -// } catch (IOException e) { -// throw new JsonException(e); -// } finally { -// JsonStreamPool.returnJsonStream(stream); -// } -// } + public static void writeJsonBytes(HttpServletResponse httpResponse, Object obj) { + JsonStream stream = JsonStreamPool.borrowJsonStream(); + try { + stream.reset(null); + stream.writeVal(obj.getClass(), obj); + Slice slice = stream.buffer(); + httpResponse.setContentLength(slice.tail()); + httpResponse.getOutputStream().write(slice.data(), 0, slice.tail()); + } catch (IOException e) { + throw new JsonException(e); + } finally { + JsonStreamPool.returnJsonStream(stream); + } + } // public static void writeJsonBytes(HttpServletResponse httpResponse, Object obj) { -// JsonStream stream = JsonStreamPool.borrowJsonStream(); +// JsonWriter writer = Eson.THREAD_WRITER.get(); // try { -// stream.reset(null); -// stream.writeVal(obj.getClass(), obj); -// Slice slice = stream.buffer(); -// httpResponse.setContentLength(slice.tail()); -// httpResponse.getOutputStream().write(slice.data(), 0, slice.tail()); +// writer.reset(); +// Eson.serialize(obj, writer); +// httpResponse.setContentLength(writer.size()); +// writer.toStream(httpResponse.getOutputStream()); // } catch (IOException e) { // throw new JsonException(e); -// } finally { -// JsonStreamPool.returnJsonStream(stream); // } // } - - public static void writeJsonBytes(HttpServletResponse httpResponse, Object obj) { - JsonWriter writer = Eson.THREAD_WRITER.get(); - try { - writer.reset(); - Eson.serialize(obj, writer); - httpResponse.setContentLength(writer.size()); - writer.toStream(httpResponse.getOutputStream()); - } catch (IOException e) { - throw new JsonException(e); - } - } } diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/servlet/Bootstrap.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/servlet/Bootstrap.java index 23efbecbd3f..681ad1a7593 100644 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/servlet/Bootstrap.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/servlet/Bootstrap.java @@ -4,13 +4,9 @@ import org.smartboot.http.server.HttpRequest; import org.smartboot.http.server.HttpResponse; import org.smartboot.http.server.HttpServerHandler; -import org.smartboot.http.server.impl.Request; import org.smartboot.servlet.conf.ServletInfo; -import org.smartboot.socket.StateMachineEnum; -import org.smartboot.socket.extension.processor.AbstractMessageProcessor; -import org.smartboot.socket.transport.AioSession; -import java.io.IOException; +import java.util.concurrent.CompletableFuture; /** * @author 三刀(zhengjunweimail@163.com) @@ -18,7 +14,7 @@ */ public class Bootstrap { - public static void main(String[] args) { + public static void main(String[] args) throws Throwable { ContainerRuntime containerRuntime = new ContainerRuntime(); // plaintext ServletContextRuntime applicationRuntime = new ServletContextRuntime("/"); @@ -50,8 +46,8 @@ public static void main(String[] args) { bootstrap.setPort(8080) .httpHandler(new HttpServerHandler() { @Override - public void handle(HttpRequest request, HttpResponse response) throws IOException { - containerRuntime.doHandle(request, response); + public void handle(HttpRequest request, HttpResponse response, CompletableFuture completableFuture) throws Throwable { + containerRuntime.doHandle(request, response, completableFuture); } }) .start(); diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/servlet/HelloWorldServlet.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/servlet/HelloWorldServlet.java index f5c2ca710c6..c3900de716c 100644 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/servlet/HelloWorldServlet.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/servlet/HelloWorldServlet.java @@ -1,9 +1,10 @@ package org.smartboot.servlet; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + import java.io.IOException; /** @@ -16,7 +17,7 @@ public class HelloWorldServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentLength(BODY.length); - resp.setContentType("text/plain; charset=UTF-8"); + resp.setContentType("text/plain;charset=UTF-8"); resp.setBufferSize(0); resp.getOutputStream().write(BODY); } diff --git a/frameworks/Java/smart-socket/src/main/java/org/smartboot/servlet/JsonServlet.java b/frameworks/Java/smart-socket/src/main/java/org/smartboot/servlet/JsonServlet.java index 1c0081d7f23..064bc80556d 100644 --- a/frameworks/Java/smart-socket/src/main/java/org/smartboot/servlet/JsonServlet.java +++ b/frameworks/Java/smart-socket/src/main/java/org/smartboot/servlet/JsonServlet.java @@ -1,12 +1,12 @@ package org.smartboot.servlet; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServlet; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import org.smartboot.Message; import org.smartboot.http.JsonUtil; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** @@ -16,7 +16,7 @@ public class JsonServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { - resp.setContentType("application/json"); + resp.setContentType("application/json;charset=UTF-8"); resp.setBufferSize(0); JsonUtil.writeJsonBytes(resp, new Message("Hello, World!")); } From e479cde53e7e62b949c7963f0d5c30366f28e7f1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 Nov 2023 21:53:04 +0000 Subject: [PATCH 023/210] Bump ch.qos.logback:logback-classic in /frameworks/Java/light-java Bumps [ch.qos.logback:logback-classic](https://github.com/qos-ch/logback) from 1.2.3 to 1.3.12. - [Commits](https://github.com/qos-ch/logback/compare/v_1.2.3...v_1.3.12) --- updated-dependencies: - dependency-name: ch.qos.logback:logback-classic dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Java/light-java/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/light-java/pom.xml b/frameworks/Java/light-java/pom.xml index b7747ab7bb8..f0e01ee8518 100644 --- a/frameworks/Java/light-java/pom.xml +++ b/frameworks/Java/light-java/pom.xml @@ -24,7 +24,7 @@ 11 11 2.0.1 - 1.2.3 + 1.3.12 2.3.5.Final 3.3.1 8.0.28 From 4fa08fe5829464777575da6a41d9f61ffcd89c2d Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 11 Dec 2023 16:03:12 +0100 Subject: [PATCH 024/210] [php] Workerman testing event 3.1.0RC1 (#8633) --- frameworks/PHP/workerman/workerman-async.dockerfile | 10 +++++----- frameworks/PHP/workerman/workerman-pgsql.dockerfile | 2 +- frameworks/PHP/workerman/workerman-php8-jit.dockerfile | 2 +- frameworks/PHP/workerman/workerman.dockerfile | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/frameworks/PHP/workerman/workerman-async.dockerfile b/frameworks/PHP/workerman/workerman-async.dockerfile index ceef86cbc42..3539a1e8e7a 100644 --- a/frameworks/PHP/workerman/workerman-async.dockerfile +++ b/frameworks/PHP/workerman/workerman-async.dockerfile @@ -6,19 +6,19 @@ RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /de RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null -RUN apt-get install -yqq php7.4-cli php7.4-mysql > /dev/null +RUN apt-get install -yqq php8.3-cli php8.3-mysql > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -RUN apt-get install -y php-pear php7.4-dev libevent-dev git > /dev/null -RUN pecl install event > /dev/null && echo "extension=event.so" > /etc/php/7.4/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.3-dev php8.3-xml libevent-dev git > /dev/null +RUN pecl install event-3.1.0RC1 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini -COPY php.ini /etc/php/7.4/cli/php.ini +COPY php.ini /etc/php/8.3/cli/php.ini ADD ./ /workerman WORKDIR /workerman -RUN composer require react/mysql "^0.3.3" --quiet +RUN composer require react/mysql "^0.6" --quiet RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet EXPOSE 8080 diff --git a/frameworks/PHP/workerman/workerman-pgsql.dockerfile b/frameworks/PHP/workerman/workerman-pgsql.dockerfile index 5e799c4b578..0d3cddcc037 100644 --- a/frameworks/PHP/workerman/workerman-pgsql.dockerfile +++ b/frameworks/PHP/workerman/workerman-pgsql.dockerfile @@ -10,7 +10,7 @@ RUN apt-get install -yqq php8.3-cli php8.3-pgsql php8.3-xml > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null -RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini +RUN pecl install event-3.1.0RC1 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini COPY php.ini /etc/php/8.3/cli/php.ini diff --git a/frameworks/PHP/workerman/workerman-php8-jit.dockerfile b/frameworks/PHP/workerman/workerman-php8-jit.dockerfile index 9ead4cd2124..46a12fe4cbd 100644 --- a/frameworks/PHP/workerman/workerman-php8-jit.dockerfile +++ b/frameworks/PHP/workerman/workerman-php8-jit.dockerfile @@ -11,7 +11,7 @@ RUN apt-get install -yqq php8.3-cli php8.3-pgsql php8.3-xml > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null -RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini +RUN pecl install event-3.1.0RC1 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini COPY php-jit.ini /etc/php/8.3/cli/php.ini diff --git a/frameworks/PHP/workerman/workerman.dockerfile b/frameworks/PHP/workerman/workerman.dockerfile index 9b321d73ce5..154322d30dc 100644 --- a/frameworks/PHP/workerman/workerman.dockerfile +++ b/frameworks/PHP/workerman/workerman.dockerfile @@ -11,7 +11,7 @@ RUN apt-get install -yqq php8.3-cli php8.3-mysql php8.3-xml > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null -RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini +RUN pecl install event-3.1.0RC1 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini COPY php-jit.ini /etc/php/8.3/cli/php.ini From d0067c2665b1b6c48db3cc1f00685c4300d21892 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 11 Dec 2023 16:03:24 +0100 Subject: [PATCH 025/210] [php] Kumbiaphp update to PHP 8.3 (#8632) * [php] Kumbiaphp update to PHP 8.3 * delete commented line * Fix docker * Fix dockerfile * Fix dockerfile branch * Fixed --- .../bench/app/controllers/ku_controller.php | 14 +++++++------- .../kumbiaphp/bench/app/models/fortune.php | 1 + .../PHP/kumbiaphp/bench/app/models/world.php | 1 + frameworks/PHP/kumbiaphp/composer.json | 2 +- .../PHP/kumbiaphp/deploy/conf/cliphp.ini | 2 ++ .../PHP/kumbiaphp/kumbiaphp-raw.dockerfile | 17 +++++++++-------- .../kumbiaphp-workerman-mysql.dockerfile | 19 ++++++++++--------- .../kumbiaphp/kumbiaphp-workerman.dockerfile | 15 +++++---------- frameworks/PHP/kumbiaphp/kumbiaphp.dockerfile | 17 +++++++++-------- frameworks/PHP/kumbiaphp/server.php | 12 ++++++++---- 10 files changed, 53 insertions(+), 47 deletions(-) diff --git a/frameworks/PHP/kumbiaphp/bench/app/controllers/ku_controller.php b/frameworks/PHP/kumbiaphp/bench/app/controllers/ku_controller.php index 0c545d23794..d5b09ead00f 100644 --- a/frameworks/PHP/kumbiaphp/bench/app/controllers/ku_controller.php +++ b/frameworks/PHP/kumbiaphp/bench/app/controllers/ku_controller.php @@ -1,14 +1,12 @@ execute([mt_rand(1, 10000)]); - $worlds[] = KuRaw::$random->fetch(); + $random->execute([mt_rand(1, 10000)]); + $worlds[] = $random->fetch(); } echo json_encode($worlds); } @@ -31,11 +30,12 @@ public function query($count = 1) public function update($count = 1) { $count = min(max((int) $count, 1), 500); + $random = KuRaw::$random; while ($count--) { - KuRaw::$random->execute([mt_rand(1, 10000)]); - $row = KuRaw::$random->fetch(); + $random->execute([mt_rand(1, 10000)]); + $row = $random->fetch(); $row['randomNumber'] = mt_rand(1, 10000); $worlds[] = $row; diff --git a/frameworks/PHP/kumbiaphp/bench/app/models/fortune.php b/frameworks/PHP/kumbiaphp/bench/app/models/fortune.php index 32f718d75f8..3785ee53908 100644 --- a/frameworks/PHP/kumbiaphp/bench/app/models/fortune.php +++ b/frameworks/PHP/kumbiaphp/bench/app/models/fortune.php @@ -1,5 +1,6 @@ /dev/null -RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php -RUN apt-get update -yqq > /dev/null && \ - apt-get install -yqq nginx git unzip \ - php8.1-fpm php8.1-mysql php8.1-dev > /dev/null +RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ + apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null -COPY deploy/conf/* /etc/php/8.1/fpm/ +RUN apt-get install -yqq nginx git unzip \ + php8.3-fpm php8.3-mysql > /dev/null + +COPY deploy/conf/* /etc/php/8.3/fpm/ ADD ./ /kumbiaphp WORKDIR /kumbiaphp RUN git clone -b v1.1.4 --single-branch --depth 1 -q https://github.com/KumbiaPHP/KumbiaPHP.git vendor/Kumbia -RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.1/fpm/php-fpm.conf ; fi; +RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.3/fpm/php-fpm.conf ; fi; EXPOSE 8080 -CMD service php8.1-fpm start && \ +CMD service php8.3-fpm start && \ nginx -c /kumbiaphp/deploy/nginx.conf diff --git a/frameworks/PHP/kumbiaphp/kumbiaphp-workerman-mysql.dockerfile b/frameworks/PHP/kumbiaphp/kumbiaphp-workerman-mysql.dockerfile index 7fe1f85d92d..47bb53f8086 100644 --- a/frameworks/PHP/kumbiaphp/kumbiaphp-workerman-mysql.dockerfile +++ b/frameworks/PHP/kumbiaphp/kumbiaphp-workerman-mysql.dockerfile @@ -1,26 +1,27 @@ -FROM ubuntu:20.04 +FROM ubuntu:22.04 ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null -RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php -RUN apt-get update -yqq > /dev/null && \ - apt-get install -yqq git php8.1-cli php8.1-mysql php8.1-xml > /dev/null +RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ + apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null + +RUN apt-get install -yqq git php8.3-cli php8.3-mysql php8.3-xml > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -RUN apt-get install -y php-pear php8.1-dev libevent-dev > /dev/null -RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.1/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null +RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini -COPY deploy/conf/cliphp.ini /etc/php/8.1/cli/php.ini +COPY deploy/conf/cliphp.ini /etc/php/8.3/cli/php.ini ADD ./ /kumbiaphp WORKDIR /kumbiaphp RUN git clone -b dev --single-branch --depth 1 https://github.com/KumbiaPHP/KumbiaPHP.git vendor/Kumbia -RUN git clone -b master --single-branch --depth 1 https://github.com/KumbiaPHP/ActiveRecord.git vendor/Kumbia/ActiveRecord +RUN git clone -b dev --single-branch --depth 1 https://github.com/KumbiaPHP/ActiveRecord.git vendor/Kumbia/ActiveRecord -RUN sed -i "s|header(|\\\Workerman\\\Protocols\\\Http::header(|g" bench/app/controllers/*.php +RUN sed -i "s|KuRaw::init(|//KuRaw::init(|g" server.php RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet diff --git a/frameworks/PHP/kumbiaphp/kumbiaphp-workerman.dockerfile b/frameworks/PHP/kumbiaphp/kumbiaphp-workerman.dockerfile index dde619cb90b..d5a8ffe7aac 100644 --- a/frameworks/PHP/kumbiaphp/kumbiaphp-workerman.dockerfile +++ b/frameworks/PHP/kumbiaphp/kumbiaphp-workerman.dockerfile @@ -1,29 +1,24 @@ -FROM ubuntu:20.04 +FROM ubuntu:22.04 ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php RUN apt-get update -yqq > /dev/null && \ - apt-get install -yqq git php8.1-cli php8.1-pgsql php8.1-xml > /dev/null + apt-get install -yqq git php8.3-cli php8.3-pgsql php8.3-xml > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -RUN apt-get install -y php-pear php8.1-dev libevent-dev > /dev/null -RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.1/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null +RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini -COPY deploy/conf/cliphp.ini /etc/php/8.1/cli/php.ini +COPY deploy/conf/cliphp.ini /etc/php/8.3/cli/php.ini ADD ./ /kumbiaphp WORKDIR /kumbiaphp RUN git clone -b dev --single-branch --depth 1 https://github.com/KumbiaPHP/KumbiaPHP.git vendor/Kumbia -#RUN sed -i "s|header(|\\\Workerman\\\Protocols\\\Http::header(|g" bench/app/controllers/{index,json}_controller.php -RUN sed -i "s|header(|\\\Workerman\\\Protocols\\\Http::header(|g" bench/app/controllers/plaintext_controller.php -RUN sed -i "s|header(|\\\Workerman\\\Protocols\\\Http::header(|g" bench/app/controllers/json_controller.php -RUN sed -i "s|//KuRaw::init(|KuRaw::init(|g" server.php - RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet EXPOSE 8080 diff --git a/frameworks/PHP/kumbiaphp/kumbiaphp.dockerfile b/frameworks/PHP/kumbiaphp/kumbiaphp.dockerfile index 21c130ec0f5..fc54d6192a5 100644 --- a/frameworks/PHP/kumbiaphp/kumbiaphp.dockerfile +++ b/frameworks/PHP/kumbiaphp/kumbiaphp.dockerfile @@ -1,14 +1,15 @@ -FROM ubuntu:20.04 +FROM ubuntu:22.04 ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null -RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php -RUN apt-get update -yqq > /dev/null && \ - apt-get install -yqq nginx git unzip \ - php8.1-fpm php8.1-mysql php8.1-dev > /dev/null +RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ + apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null -COPY deploy/conf/* /etc/php/8.1/fpm/ +RUN apt-get install -yqq nginx git unzip \ + php8.3-fpm php8.3-mysql > /dev/null + +COPY deploy/conf/* /etc/php/8.3/fpm/ ADD ./ /kumbiaphp WORKDIR /kumbiaphp @@ -16,9 +17,9 @@ WORKDIR /kumbiaphp RUN git clone -b v1.1.4 --single-branch --depth 1 https://github.com/KumbiaPHP/KumbiaPHP.git vendor/Kumbia RUN git clone -b dev --single-branch --depth 1 https://github.com/KumbiaPHP/ActiveRecord.git vendor/Kumbia/ActiveRecord -RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.1/fpm/php-fpm.conf ; fi; +RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.3/fpm/php-fpm.conf ; fi; EXPOSE 8080 -CMD service php8.1-fpm start && \ +CMD service php8.3-fpm start && \ nginx -c /kumbiaphp/deploy/nginx.conf diff --git a/frameworks/PHP/kumbiaphp/server.php b/frameworks/PHP/kumbiaphp/server.php index 17413d0c7a1..3ec60d615fa 100644 --- a/frameworks/PHP/kumbiaphp/server.php +++ b/frameworks/PHP/kumbiaphp/server.php @@ -2,14 +2,18 @@ require_once __DIR__.'/vendor/autoload.php'; require_once __DIR__.'/bench/app/workerbootstrap.php'; +use Adapterman\Adapterman; use Workerman\Worker; -$http_worker = new Worker('http://0.0.0.0:8080'); -$http_worker->count = (int) shell_exec('nproc') * 4; -$http_worker->onWorkerStart = static function () { +Adapterman::init(); + +$http_worker = new Worker('http://0.0.0.0:8080'); +$http_worker->count = (int) shell_exec('nproc') * 4; +$http_worker->name = 'KumbiaPHP'; +$http_worker->onWorkerStart = static function () { kumbiaInit(); - //KuRaw::init(); + KuRaw::init(); }; $http_worker->onMessage = static function ($connection) { From bfe3d6afb460cc70237d01bbdf8ceee1d7188886 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 11 Dec 2023 16:03:58 +0100 Subject: [PATCH 026/210] [php] Openswoole update to PHP 8.3 (#8595) * [php] Openswoole update to PHP 8.3 * Updated to v2.1.0 in Postgresql docker * Fix deprecated error * Fix deprecated errors in postgres * Revert postgres to php8.2 & oswoole 22.0.0 --- frameworks/PHP/openswoole/openswoole-no-async.dockerfile | 2 +- frameworks/PHP/openswoole/openswoole-server-mysql.php | 2 +- frameworks/PHP/openswoole/openswoole-server-postgres.php | 4 ++-- frameworks/PHP/openswoole/openswoole.dockerfile | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frameworks/PHP/openswoole/openswoole-no-async.dockerfile b/frameworks/PHP/openswoole/openswoole-no-async.dockerfile index ddfa2d2da58..98b24e1c497 100644 --- a/frameworks/PHP/openswoole/openswoole-no-async.dockerfile +++ b/frameworks/PHP/openswoole/openswoole-no-async.dockerfile @@ -1,4 +1,4 @@ -FROM php:8.2-cli +FROM php:8.3-cli RUN apt-get update && apt-get install -y git > /dev/null diff --git a/frameworks/PHP/openswoole/openswoole-server-mysql.php b/frameworks/PHP/openswoole/openswoole-server-mysql.php index 8c921a3f184..e020600ce87 100644 --- a/frameworks/PHP/openswoole/openswoole-server-mysql.php +++ b/frameworks/PHP/openswoole/openswoole-server-mysql.php @@ -111,7 +111,7 @@ * * @return string */ -$updates_mysql = function (int $queries = 0, $pool): string { +$updates_mysql = function (int $queries, $pool): string { $db = $pool->get(); $query_count = 1; diff --git a/frameworks/PHP/openswoole/openswoole-server-postgres.php b/frameworks/PHP/openswoole/openswoole-server-postgres.php index 31a712ca9ce..107878f3343 100644 --- a/frameworks/PHP/openswoole/openswoole-server-postgres.php +++ b/frameworks/PHP/openswoole/openswoole-server-postgres.php @@ -40,7 +40,7 @@ * * @return string */ -$db_postgres = function (int $queries = 0, $pool): string { +$db_postgres = function (int $queries, $pool): string { $db = $pool->get(); // Read number of queries to run from URL parameter $query_count = 1; @@ -116,7 +116,7 @@ * * @return string */ -$updates_postgres = function (int $queries = 0, $pool): string { +$updates_postgres = function (int $queries, $pool): string { $db = $pool->get(); $query_count = 1; diff --git a/frameworks/PHP/openswoole/openswoole.dockerfile b/frameworks/PHP/openswoole/openswoole.dockerfile index 836b41c3169..f4f57e78a2d 100644 --- a/frameworks/PHP/openswoole/openswoole.dockerfile +++ b/frameworks/PHP/openswoole/openswoole.dockerfile @@ -1,4 +1,4 @@ -FROM php:8.2-cli +FROM php:8.3-cli RUN apt-get update && apt-get install -y git > /dev/null From 9fe9e211b00b558902ec9e771810661857bbd8d7 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 11 Dec 2023 16:04:24 +0100 Subject: [PATCH 027/210] [php] Imi update to PHP 8.3 (#8589) * [php] Imi update to PHP 8.3 * Faster composeser install * Remove change in hyperf --- frameworks/PHP/imi/composer.json | 4 ++-- frameworks/PHP/imi/imi-swoole.dockerfile | 6 +++--- frameworks/PHP/imi/imi-workerman.dockerfile | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/frameworks/PHP/imi/composer.json b/frameworks/PHP/imi/composer.json index bc3795f0d07..c77718182cf 100644 --- a/frameworks/PHP/imi/composer.json +++ b/frameworks/PHP/imi/composer.json @@ -1,7 +1,7 @@ { "require": { - "imiphp/imi": "~2.1.0", - "imiphp/imi-pgsql": "~2.1.0" + "imiphp/imi": "~2.1", + "imiphp/imi-pgsql": "~2.1" }, "autoload": { "psr-4" : { diff --git a/frameworks/PHP/imi/imi-swoole.dockerfile b/frameworks/PHP/imi/imi-swoole.dockerfile index 11704d8ed3f..2cc80f2b982 100644 --- a/frameworks/PHP/imi/imi-swoole.dockerfile +++ b/frameworks/PHP/imi/imi-swoole.dockerfile @@ -1,6 +1,6 @@ -FROM php:8.2-cli +FROM php:8.3-cli -ENV SWOOLE_VERSION 5.1.0 +ENV SWOOLE_VERSION 5.1.1 ARG TFB_TEST_DATABASE ENV TFB_TEST_DATABASE=${TFB_TEST_DATABASE} @@ -22,7 +22,7 @@ RUN chmod -R ug+rwx /imi/.runtime WORKDIR /imi -RUN curl -sSL https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer +COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer RUN composer install --no-dev --classmap-authoritative --quiet RUN composer require imiphp/imi-swoole:~2.1.0 -W RUN composer dumpautoload -o diff --git a/frameworks/PHP/imi/imi-workerman.dockerfile b/frameworks/PHP/imi/imi-workerman.dockerfile index 55f5cbfa592..306a2512a82 100644 --- a/frameworks/PHP/imi/imi-workerman.dockerfile +++ b/frameworks/PHP/imi/imi-workerman.dockerfile @@ -1,4 +1,4 @@ -FROM php:8.2-cli +FROM php:8.3-cli ARG TFB_TEST_DATABASE ENV TFB_TEST_DATABASE=${TFB_TEST_DATABASE} @@ -21,7 +21,7 @@ RUN chmod -R ug+rwx /imi/.runtime WORKDIR /imi -RUN curl -sSL https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer +COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer RUN composer install --no-dev --classmap-authoritative --quiet RUN composer require imiphp/imi-workerman:~2.1.0 -W RUN composer dumpautoload -o From c3b8875b6c56b1e81c0b2c248e0e80de5d45126f Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 11 Dec 2023 16:04:55 +0100 Subject: [PATCH 028/210] [php] Spiral update to PHP 8.3 (#8598) * [php] Spiral update to PHP 8.3 * Change docker --- frameworks/PHP/spiral/spiral.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/PHP/spiral/spiral.dockerfile b/frameworks/PHP/spiral/spiral.dockerfile index 3b8656690de..ca9d98d9612 100644 --- a/frameworks/PHP/spiral/spiral.dockerfile +++ b/frameworks/PHP/spiral/spiral.dockerfile @@ -1,4 +1,4 @@ -FROM php:8.2.0-cli +FROM php:8.3-cli RUN docker-php-ext-install pdo_mysql > /dev/null From 208c9895d0e3b0d5e554ba01755ac11ae2eab80d Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 11 Dec 2023 16:05:06 +0100 Subject: [PATCH 029/210] [php] Ubiquity update to PHP 8.3 (#8600) * [php] Ubiquity update to PHP 8.3 * Update ngx-php and nginx * Allow Dynamic Properties in Fortunes model * Allow Dynamic Properties in CachedWorld model * Use root namespace * Add AllowDynamicProperties in World model * Update ngx-php to php8.3 & ubuntu22.04 * Small change to rerun CI --- frameworks/PHP/ubiquity/app/models/CachedWorld.php | 1 + frameworks/PHP/ubiquity/app/models/Fortune.php | 1 + frameworks/PHP/ubiquity/app/models/World.php | 1 + .../PHP/ubiquity/ubiquity-ngx-micro.dockerfile | 8 ++++---- frameworks/PHP/ubiquity/ubiquity-ngx-raw.dockerfile | 8 ++++---- frameworks/PHP/ubiquity/ubiquity-ngx.dockerfile | 8 ++++---- .../ubiquity/ubiquity-roadrunner-mysql.dockerfile | 8 ++++---- .../PHP/ubiquity/ubiquity-roadrunner.dockerfile | 8 ++++---- .../PHP/ubiquity/ubiquity-swoole-mysql.dockerfile | 2 +- frameworks/PHP/ubiquity/ubiquity-swoole.dockerfile | 2 +- .../PHP/ubiquity/ubiquity-workerman-mongo.dockerfile | 12 ++++++------ .../PHP/ubiquity/ubiquity-workerman-mysql.dockerfile | 12 ++++++------ .../PHP/ubiquity/ubiquity-workerman-raw.dockerfile | 12 ++++++------ .../PHP/ubiquity/ubiquity-workerman.dockerfile | 12 ++++++------ frameworks/PHP/ubiquity/ubiquity.dockerfile | 10 +++++----- 15 files changed, 54 insertions(+), 51 deletions(-) diff --git a/frameworks/PHP/ubiquity/app/models/CachedWorld.php b/frameworks/PHP/ubiquity/app/models/CachedWorld.php index e438b1b513c..d23623bc8f9 100644 --- a/frameworks/PHP/ubiquity/app/models/CachedWorld.php +++ b/frameworks/PHP/ubiquity/app/models/CachedWorld.php @@ -4,6 +4,7 @@ /** * @table("World") */ +#[\AllowDynamicProperties] class CachedWorld extends World{ } diff --git a/frameworks/PHP/ubiquity/app/models/Fortune.php b/frameworks/PHP/ubiquity/app/models/Fortune.php index 1877df14b1a..b5d244820a5 100644 --- a/frameworks/PHP/ubiquity/app/models/Fortune.php +++ b/frameworks/PHP/ubiquity/app/models/Fortune.php @@ -1,6 +1,7 @@ /dev/null RUN apt-get update -yqq > /dev/null && \ apt-get install -yqq wget git unzip libxml2-dev cmake make systemtap-sdt-dev \ zlib1g-dev libpcre3-dev libargon2-0-dev libsodium-dev \ - php8.0-cli php8.0-dev php8.0-mbstring libphp8.0-embed nginx > /dev/null + php8.3-cli php8.3-dev php8.3-mbstring libphp8.3-embed nginx > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer ADD ./ ./ -ENV NGINX_VERSION=1.21.0 +ENV NGINX_VERSION=1.25.3 -RUN git clone -b v0.0.25 --single-branch --depth 1 https://github.com/rryqszq4/ngx_php7.git > /dev/null +RUN git clone -b v0.0.28 --single-branch --depth 1 https://github.com/rryqszq4/ngx_php7.git > /dev/null RUN wget -q http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \ tar -zxf nginx-${NGINX_VERSION}.tar.gz && \ diff --git a/frameworks/PHP/ubiquity/ubiquity-ngx-raw.dockerfile b/frameworks/PHP/ubiquity/ubiquity-ngx-raw.dockerfile index d30d00b6a4b..81109dc94fb 100644 --- a/frameworks/PHP/ubiquity/ubiquity-ngx-raw.dockerfile +++ b/frameworks/PHP/ubiquity/ubiquity-ngx-raw.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:20.04 +FROM ubuntu:22.04 ARG DEBIAN_FRONTEND=noninteractive @@ -9,15 +9,15 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null RUN apt-get update -yqq > /dev/null && \ apt-get install -yqq wget git unzip libxml2-dev cmake make systemtap-sdt-dev \ zlib1g-dev libpcre3-dev libargon2-0-dev libsodium-dev \ - php8.0-cli php8.0-dev libphp8.0-embed php8.0-pgsql nginx > /dev/null + php8.3-cli php8.3-dev libphp8.3-embed php8.3-pgsql nginx > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer ADD ./ ./ -ENV NGINX_VERSION=1.21.0 +ENV NGINX_VERSION=1.25.3 -RUN git clone -b v0.0.25 --single-branch --depth 1 https://github.com/rryqszq4/ngx_php7.git > /dev/null +RUN git clone -b v0.0.28 --single-branch --depth 1 https://github.com/rryqszq4/ngx_php7.git > /dev/null RUN wget -q http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \ tar -zxf nginx-${NGINX_VERSION}.tar.gz && \ diff --git a/frameworks/PHP/ubiquity/ubiquity-ngx.dockerfile b/frameworks/PHP/ubiquity/ubiquity-ngx.dockerfile index 1b92f2d745d..014e12b9415 100644 --- a/frameworks/PHP/ubiquity/ubiquity-ngx.dockerfile +++ b/frameworks/PHP/ubiquity/ubiquity-ngx.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:20.04 +FROM ubuntu:22.04 ARG DEBIAN_FRONTEND=noninteractive @@ -9,15 +9,15 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null RUN apt-get update -yqq > /dev/null && \ apt-get install -yqq wget git unzip libxml2-dev cmake make systemtap-sdt-dev \ zlib1g-dev libpcre3-dev libargon2-0-dev libsodium-dev \ - php8.0-cli php8.0-dev libphp8.0-embed php8.0-pgsql nginx > /dev/null + php8.3-cli php8.3-dev libphp8.3-embed php8.3-pgsql nginx > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer ADD ./ ./ -ENV NGINX_VERSION=1.21.0 +ENV NGINX_VERSION=1.25.3 -RUN git clone -b v0.0.25 --single-branch --depth 1 https://github.com/rryqszq4/ngx_php7.git > /dev/null +RUN git clone -b v0.0.28 --single-branch --depth 1 https://github.com/rryqszq4/ngx_php7.git > /dev/null RUN wget -q http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \ tar -zxf nginx-${NGINX_VERSION}.tar.gz && \ diff --git a/frameworks/PHP/ubiquity/ubiquity-roadrunner-mysql.dockerfile b/frameworks/PHP/ubiquity/ubiquity-roadrunner-mysql.dockerfile index fdd3263c306..0abc0ab08ca 100644 --- a/frameworks/PHP/ubiquity/ubiquity-roadrunner-mysql.dockerfile +++ b/frameworks/PHP/ubiquity/ubiquity-roadrunner-mysql.dockerfile @@ -5,13 +5,13 @@ ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php RUN apt-get update -yqq > /dev/null && \ - apt-get install -yqq php8.0 php8.0-common php8.0-cgi php-curl php8.0-mysql > /dev/null + apt-get install -yqq php8.3 php8.3-common php8.3-cgi php-curl php8.3-mysql > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer RUN apt-get install -y php-pear php-dev > /dev/null -COPY deploy/conf/php-async.ini /etc/php/8.0/cgi/php.ini +COPY deploy/conf/php-async.ini /etc/php/8.3/cgi/php.ini ADD ./ /ubiquity WORKDIR /ubiquity @@ -33,8 +33,8 @@ RUN chmod 755 /bin/envwrapper.sh RUN chmod 777 -R /ubiquity/.ubiquity/* -#RUN echo "opcache.preload=/ubiquity/app/config/preloader.script.php" >> /etc/php/8.0/cgi/php.ini -RUN echo "opcache.jit_buffer_size=128M\nopcache.jit=tracing\n" >> /etc/php/8.0/cgi/php.ini +#RUN echo "opcache.preload=/ubiquity/app/config/preloader.script.php" >> /etc/php/8.3/cgi/php.ini +RUN echo "opcache.jit_buffer_size=128M\nopcache.jit=tracing\n" >> /etc/php/8.3/cgi/php.ini COPY deploy/conf/roadrunner/mysql/rrServices.php app/config/rrServices.php diff --git a/frameworks/PHP/ubiquity/ubiquity-roadrunner.dockerfile b/frameworks/PHP/ubiquity/ubiquity-roadrunner.dockerfile index 80dee9c051d..a8532d8d779 100644 --- a/frameworks/PHP/ubiquity/ubiquity-roadrunner.dockerfile +++ b/frameworks/PHP/ubiquity/ubiquity-roadrunner.dockerfile @@ -5,14 +5,14 @@ ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php RUN apt-get update -yqq > /dev/null && \ - apt-get install -yqq php8.0 php8.0-common php8.0-cgi php8.0-pgsql php-curl > /dev/null + apt-get install -yqq php8.3 php8.3-common php8.3-cgi php8.3-pgsql php-curl > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer RUN apt-get install -y php-pear php-dev > /dev/null -COPY deploy/conf/php-async.ini /etc/php/8.0/cgi/php.ini +COPY deploy/conf/php-async.ini /etc/php/8.3/cgi/php.ini ADD ./ /ubiquity WORKDIR /ubiquity @@ -34,8 +34,8 @@ RUN chmod 755 /bin/envwrapper.sh RUN chmod 777 -R /ubiquity/.ubiquity/* -#RUN echo "opcache.preload=/ubiquity/app/config/preloader.script.php" >> /etc/php/8.0/cgi/php.ini -RUN echo "opcache.jit_buffer_size=128M\nopcache.jit=function\n" >> /etc/php/8.0/cgi/php.ini +#RUN echo "opcache.preload=/ubiquity/app/config/preloader.script.php" >> /etc/php/8.3/cgi/php.ini +RUN echo "opcache.jit_buffer_size=128M\nopcache.jit=function\n" >> /etc/php/8.3/cgi/php.ini COPY deploy/conf/roadrunner/pgsql/rrServices.php app/config/rrServices.php diff --git a/frameworks/PHP/ubiquity/ubiquity-swoole-mysql.dockerfile b/frameworks/PHP/ubiquity/ubiquity-swoole-mysql.dockerfile index 5e4fd4122bd..d4195a1d945 100644 --- a/frameworks/PHP/ubiquity/ubiquity-swoole-mysql.dockerfile +++ b/frameworks/PHP/ubiquity/ubiquity-swoole-mysql.dockerfile @@ -1,4 +1,4 @@ -FROM php:8.0 +FROM php:8.3-cli RUN apt-get update > /dev/null diff --git a/frameworks/PHP/ubiquity/ubiquity-swoole.dockerfile b/frameworks/PHP/ubiquity/ubiquity-swoole.dockerfile index 0439f54c5e5..ff57c3c54e1 100644 --- a/frameworks/PHP/ubiquity/ubiquity-swoole.dockerfile +++ b/frameworks/PHP/ubiquity/ubiquity-swoole.dockerfile @@ -1,4 +1,4 @@ -FROM php:8.0 +FROM php:8.3-cli RUN apt-get update > /dev/null diff --git a/frameworks/PHP/ubiquity/ubiquity-workerman-mongo.dockerfile b/frameworks/PHP/ubiquity/ubiquity-workerman-mongo.dockerfile index 437cc2fdc26..b8ed0a2df5c 100644 --- a/frameworks/PHP/ubiquity/ubiquity-workerman-mongo.dockerfile +++ b/frameworks/PHP/ubiquity/ubiquity-workerman-mongo.dockerfile @@ -5,14 +5,14 @@ ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php RUN apt-get update -yqq > /dev/null && \ - apt-get install -yqq git php8.1-cli php8.1-mongodb php8.1-xml php8.1-mbstring > /dev/null + apt-get install -yqq git php8.3-cli php8.3-mongodb php8.3-xml php8.3-mbstring > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -RUN apt-get install -y php-pear php8.1-dev libevent-dev > /dev/null -RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.1/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null +RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini -COPY deploy/conf/php-async.ini /etc/php/8.1/cli/php.ini +COPY deploy/conf/php-async.ini /etc/php/8.3/cli/php.ini ADD ./ /ubiquity @@ -31,8 +31,8 @@ RUN chmod 777 -R /ubiquity/.ubiquity/* COPY deploy/conf/workerman/mongo/workerServices.php app/config/workerServices.php -RUN echo "opcache.preload=/ubiquity/app/config/preloader.script.php" >> /etc/php/8.1/cli/php.ini -RUN echo "opcache.jit_buffer_size=128M\nopcache.jit=tracing\n" >> /etc/php/8.1/cli/php.ini +RUN echo "opcache.preload=/ubiquity/app/config/preloader.script.php" >> /etc/php/8.3/cli/php.ini +RUN echo "opcache.jit_buffer_size=128M\nopcache.jit=tracing\n" >> /etc/php/8.3/cli/php.ini EXPOSE 8080 diff --git a/frameworks/PHP/ubiquity/ubiquity-workerman-mysql.dockerfile b/frameworks/PHP/ubiquity/ubiquity-workerman-mysql.dockerfile index 47d2262ea91..12568a07af3 100644 --- a/frameworks/PHP/ubiquity/ubiquity-workerman-mysql.dockerfile +++ b/frameworks/PHP/ubiquity/ubiquity-workerman-mysql.dockerfile @@ -5,14 +5,14 @@ ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php RUN apt-get update -yqq > /dev/null && \ - apt-get install -yqq git php8.1-cli php8.1-mysql php8.1-xml php8.1-mbstring > /dev/null + apt-get install -yqq git php8.3-cli php8.3-mysql php8.3-xml php8.3-mbstring > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -RUN apt-get install -y php-pear php8.1-dev libevent-dev > /dev/null -RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.1/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null +RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini -COPY deploy/conf/php-async.ini /etc/php/8.1/cli/php.ini +COPY deploy/conf/php-async.ini /etc/php/8.3/cli/php.ini ADD ./ /ubiquity WORKDIR /ubiquity @@ -30,8 +30,8 @@ RUN chmod 777 -R /ubiquity/.ubiquity/* COPY deploy/conf/workerman/mysql/workerServices.php app/config/workerServices.php -RUN echo "opcache.preload=/ubiquity/app/config/preloader.script.php" >> /etc/php/8.1/cli/php.ini -RUN echo "opcache.jit_buffer_size=128M\nopcache.jit=tracing\n" >> /etc/php/8.1/cli/php.ini +RUN echo "opcache.preload=/ubiquity/app/config/preloader.script.php" >> /etc/php/8.3/cli/php.ini +RUN echo "opcache.jit_buffer_size=128M\nopcache.jit=tracing\n" >> /etc/php/8.3/cli/php.ini EXPOSE 8080 diff --git a/frameworks/PHP/ubiquity/ubiquity-workerman-raw.dockerfile b/frameworks/PHP/ubiquity/ubiquity-workerman-raw.dockerfile index f095ab239f8..75b757a748d 100644 --- a/frameworks/PHP/ubiquity/ubiquity-workerman-raw.dockerfile +++ b/frameworks/PHP/ubiquity/ubiquity-workerman-raw.dockerfile @@ -5,14 +5,14 @@ ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php RUN apt-get update -yqq > /dev/null && \ - apt-get install -yqq git php8.1-cli php8.1-pgsql php8.1-xml php8.1-mbstring > /dev/null + apt-get install -yqq git php8.3-cli php8.3-pgsql php8.3-xml php8.3-mbstring > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -RUN apt-get install -y php-pear php8.1-dev libevent-dev > /dev/null -RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.1/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null +RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini -COPY deploy/conf/php-async.ini /etc/php/8.1/cli/php.ini +COPY deploy/conf/php-async.ini /etc/php/8.3/cli/php.ini ADD ./ /ubiquity WORKDIR /ubiquity @@ -30,8 +30,8 @@ RUN chmod 777 -R /ubiquity/.ubiquity/* COPY deploy/conf/workerman/pgsql/raw/workerServices.php app/config/workerServices.php -RUN echo "opcache.preload=/ubiquity/app/config/preloader.script.php\n" >> /etc/php/8.1/cli/php.ini -RUN echo "opcache.jit_buffer_size=128M\nopcache.jit=tracing\n" >> /etc/php/8.1/cli/php.ini +RUN echo "opcache.preload=/ubiquity/app/config/preloader.script.php\n" >> /etc/php/8.3/cli/php.ini +RUN echo "opcache.jit_buffer_size=128M\nopcache.jit=tracing\n" >> /etc/php/8.3/cli/php.ini EXPOSE 8080 diff --git a/frameworks/PHP/ubiquity/ubiquity-workerman.dockerfile b/frameworks/PHP/ubiquity/ubiquity-workerman.dockerfile index 5242c94ffbc..4b92ddc6f4a 100644 --- a/frameworks/PHP/ubiquity/ubiquity-workerman.dockerfile +++ b/frameworks/PHP/ubiquity/ubiquity-workerman.dockerfile @@ -5,14 +5,14 @@ ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php RUN apt-get update -yqq > /dev/null && \ - apt-get install -yqq git php8.1-cli php8.1-pgsql php8.1-xml php8.1-mbstring > /dev/null + apt-get install -yqq git php8.3-cli php8.3-pgsql php8.3-xml php8.3-mbstring > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -RUN apt-get install -y php-pear php8.1-dev libevent-dev > /dev/null -RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.1/cli/conf.d/event.ini +RUN apt-get install -y php-pear php8.3-dev libevent-dev > /dev/null +RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini -COPY deploy/conf/php-async.ini /etc/php/8.1/cli/php.ini +COPY deploy/conf/php-async.ini /etc/php/8.3/cli/php.ini ADD ./ /ubiquity WORKDIR /ubiquity @@ -30,8 +30,8 @@ RUN chmod 777 -R /ubiquity/.ubiquity/* COPY deploy/conf/workerman/pgsql/workerServices.php app/config/workerServices.php -RUN echo "opcache.preload=/ubiquity/app/config/preloader.script.php\n" >> /etc/php/8.1/cli/php.ini -RUN echo "opcache.jit_buffer_size=128M\nopcache.jit=function\n" >> /etc/php/8.1/cli/php.ini +RUN echo "opcache.preload=/ubiquity/app/config/preloader.script.php\n" >> /etc/php/8.3/cli/php.ini +RUN echo "opcache.jit_buffer_size=128M\nopcache.jit=function\n" >> /etc/php/8.3/cli/php.ini EXPOSE 8080 diff --git a/frameworks/PHP/ubiquity/ubiquity.dockerfile b/frameworks/PHP/ubiquity/ubiquity.dockerfile index 7417ec1c802..239d849f9b4 100644 --- a/frameworks/PHP/ubiquity/ubiquity.dockerfile +++ b/frameworks/PHP/ubiquity/ubiquity.dockerfile @@ -5,16 +5,16 @@ ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php RUN apt-get update -yqq > /dev/null && \ - apt-get install -yqq nginx git unzip php8.1 php8.1-common php8.1-cli php8.1-fpm php8.1-mysql php8.1-dev > /dev/null + apt-get install -yqq nginx git unzip php8.3 php8.3-common php8.3-cli php8.3-fpm php8.3-mysql php8.3-dev > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.1/fpm/ +COPY deploy/conf/* /etc/php/8.3/fpm/ ADD ./ /ubiquity WORKDIR /ubiquity -RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.1/fpm/php-fpm.conf ; fi; +RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.3/fpm/php-fpm.conf ; fi; RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet @@ -22,9 +22,9 @@ RUN chmod 777 -R /ubiquity/app/cache/* COPY deploy/conf/ubiquity-config.php app/config/config.php -RUN echo "opcache.preload=/ubiquity/app/config/preloader.script.php" >> /etc/php/8.1/fpm/php.ini +RUN echo "opcache.preload=/ubiquity/app/config/preloader.script.php" >> /etc/php/8.3/fpm/php.ini EXPOSE 8080 -CMD service php8.1-fpm start && \ +CMD service php8.3-fpm start && \ nginx -c /ubiquity/deploy/nginx.conf -g "daemon off;" From 680e9180710ce04bab57512fd81b370b63b61016 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Dec 2023 07:05:13 -0800 Subject: [PATCH 030/210] Bump ch.qos.logback:logback-classic in /frameworks/Java/servlet3 (#8604) Bumps [ch.qos.logback:logback-classic](https://github.com/qos-ch/logback) from 1.3.0-alpha4 to 1.3.12. - [Commits](https://github.com/qos-ch/logback/compare/v_1.3.0-alpha4...v_1.3.12) --- updated-dependencies: - dependency-name: ch.qos.logback:logback-classic dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Java/servlet3/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/servlet3/pom.xml b/frameworks/Java/servlet3/pom.xml index e424796691b..d8db7acde68 100644 --- a/frameworks/Java/servlet3/pom.xml +++ b/frameworks/Java/servlet3/pom.xml @@ -93,7 +93,7 @@ ch.qos.logback logback-classic - 1.3.0-alpha4 + 1.3.12 org.slf4j From 4226632cab039203b76ed192d4334a0e2717ff79 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Dec 2023 07:05:19 -0800 Subject: [PATCH 031/210] Bump openssl from 0.10.55 to 0.10.60 in /frameworks/Rust/trillium (#8577) Bumps [openssl](https://github.com/sfackler/rust-openssl) from 0.10.55 to 0.10.60. - [Release notes](https://github.com/sfackler/rust-openssl/releases) - [Commits](https://github.com/sfackler/rust-openssl/compare/openssl-v0.10.55...openssl-v0.10.60) --- updated-dependencies: - dependency-name: openssl dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Rust/trillium/Cargo.lock | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/frameworks/Rust/trillium/Cargo.lock b/frameworks/Rust/trillium/Cargo.lock index 080f122ca49..2fd41a8cf94 100644 --- a/frameworks/Rust/trillium/Cargo.lock +++ b/frameworks/Rust/trillium/Cargo.lock @@ -309,6 +309,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" + [[package]] name = "block-buffer" version = "0.9.0" @@ -1167,11 +1173,11 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "openssl" -version = "0.10.55" +version = "0.10.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" +checksum = "79a4c6c3a2b158f7f8f2a2fc5a969fa3a068df6fc9dbb4a43845436e3af7c800" dependencies = [ - "bitflags", + "bitflags 2.4.1", "cfg-if", "foreign-types", "libc", @@ -1199,9 +1205,9 @@ checksum = "28988d872ab76095a6e6ac88d99b54fd267702734fd7ffe610ca27f533ddb95a" [[package]] name = "openssl-sys" -version = "0.9.90" +version = "0.9.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" +checksum = "3812c071ba60da8b5677cc12bcb1d42989a65553772897a7e0355545a819838f" dependencies = [ "cc", "libc", @@ -1415,7 +1421,7 @@ version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] @@ -1622,7 +1628,7 @@ version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "525bc1abfda2e1998d152c45cf13e696f76d0a4972310b22fac1658b05df7c87" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "core-foundation-sys", "libc", @@ -1819,7 +1825,7 @@ dependencies = [ "ahash", "atoi", "base64", - "bitflags", + "bitflags 1.3.2", "byteorder", "bytes", "chrono", From 9fcb92829ea856d282fe0902c68907def0b5102e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Dec 2023 07:05:29 -0800 Subject: [PATCH 032/210] Bump openssl from 0.10.55 to 0.10.60 in /frameworks/Rust/axum (#8576) Bumps [openssl](https://github.com/sfackler/rust-openssl) from 0.10.55 to 0.10.60. - [Release notes](https://github.com/sfackler/rust-openssl/releases) - [Commits](https://github.com/sfackler/rust-openssl/compare/openssl-v0.10.55...openssl-v0.10.60) --- updated-dependencies: - dependency-name: openssl dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Rust/axum/Cargo.lock | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/frameworks/Rust/axum/Cargo.lock b/frameworks/Rust/axum/Cargo.lock index b13924bd25f..0c970c71e7b 100644 --- a/frameworks/Rust/axum/Cargo.lock +++ b/frameworks/Rust/axum/Cargo.lock @@ -107,7 +107,7 @@ checksum = "f8175979259124331c1d7bf6586ee7e0da434155e4b2d48ec2c8386281d8df39" dependencies = [ "async-trait", "axum-core", - "bitflags", + "bitflags 1.3.2", "bytes", "futures-util", "headers", @@ -161,6 +161,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bitflags" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" + [[package]] name = "block-buffer" version = "0.10.3" @@ -749,7 +755,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3e372db8e5c0d213e0cd0b9be18be2aca3d44cf2fe30a9d46a65581cd454584" dependencies = [ "base64", - "bitflags", + "bitflags 1.3.2", "bytes", "headers-core", "http", @@ -1133,7 +1139,7 @@ checksum = "b5a1df476ac9541b0e4fdc8e2cc48884e66c92c933cd17a1fd75e68caf75752e" dependencies = [ "async-trait", "base64", - "bitflags", + "bitflags 1.3.2", "bson", "chrono", "derivative", @@ -1239,11 +1245,11 @@ checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" [[package]] name = "openssl" -version = "0.10.55" +version = "0.10.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "345df152bc43501c5eb9e4654ff05f794effb78d4efe3d53abc158baddc0703d" +checksum = "79a4c6c3a2b158f7f8f2a2fc5a969fa3a068df6fc9dbb4a43845436e3af7c800" dependencies = [ - "bitflags", + "bitflags 2.4.1", "cfg-if", "foreign-types", "libc", @@ -1271,9 +1277,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.90" +version = "0.9.96" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374533b0e45f3a7ced10fcaeccca020e66656bc03dac384f852e4e5a7a8104a6" +checksum = "3812c071ba60da8b5677cc12bcb1d42989a65553772897a7e0355545a819838f" dependencies = [ "cc", "libc", @@ -1521,7 +1527,7 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ - "bitflags", + "bitflags 1.3.2", ] [[package]] @@ -1691,7 +1697,7 @@ version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2bc1bb97804af6631813c55739f771071e0f2ed33ee20b68c86ec505d906356c" dependencies = [ - "bitflags", + "bitflags 1.3.2", "core-foundation", "core-foundation-sys", "libc", @@ -1928,7 +1934,7 @@ dependencies = [ "ahash", "atoi", "base64", - "bitflags", + "bitflags 1.3.2", "byteorder", "bytes", "crc", @@ -2304,7 +2310,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d1d42a9b3f3ec46ba828e8d376aec14592ea199f70a06a548587ecd1c4ab658" dependencies = [ - "bitflags", + "bitflags 1.3.2", "bytes", "futures-core", "futures-util", From 8edadc3722037c32ee4f840688a217f5b8f85960 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 11 Dec 2023 16:06:05 +0100 Subject: [PATCH 033/210] [ruby/grape] Use OJ for JSON (#8566) OJ is a lot faster than the default json gem. OJ is also used by most other frameworks. Grape supports the `multi_json` gem to switch to another JSON gem. --- frameworks/Ruby/grape/Gemfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frameworks/Ruby/grape/Gemfile b/frameworks/Ruby/grape/Gemfile index 380df952afe..846757d6607 100644 --- a/frameworks/Ruby/grape/Gemfile +++ b/frameworks/Ruby/grape/Gemfile @@ -7,4 +7,5 @@ gem 'activerecord', '7.0.3', :require => 'active_record' gem 'activerecord-import', '1.4.0' gem 'grape', '1.6.2' gem 'rack', '2.2.3.1' -gem 'json', '2.6.2' +gem 'multi_json', require: 'multi_json' +gem 'oj', '~> 3.16' From 644b88682618fca8e20abc826ddb222b615c829b Mon Sep 17 00:00:00 2001 From: fakeshadow <24548779@qq.com> Date: Mon, 11 Dec 2023 23:06:12 +0800 Subject: [PATCH 034/210] [xitca-web] add missing bench category. (#8607) --- frameworks/Rust/xitca-web/Cargo.lock | 18 ++--- frameworks/Rust/xitca-web/Cargo.toml | 26 +++--- .../Rust/xitca-web/benchmark_config.json | 10 ++- frameworks/Rust/xitca-web/src/db.rs | 30 +++++-- frameworks/Rust/xitca-web/src/main_axum.rs | 80 ++++++++++++++++--- frameworks/Rust/xitca-web/src/main_wasm.rs | 4 +- frameworks/Rust/xitca-web/src/util.rs | 2 - .../Rust/xitca-web/xitca-web-axum.dockerfile | 2 +- 8 files changed, 122 insertions(+), 50 deletions(-) diff --git a/frameworks/Rust/xitca-web/Cargo.lock b/frameworks/Rust/xitca-web/Cargo.lock index 6a87ff4b1fb..4429973312f 100644 --- a/frameworks/Rust/xitca-web/Cargo.lock +++ b/frameworks/Rust/xitca-web/Cargo.lock @@ -1100,7 +1100,7 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "xitca-http" version = "0.1.0" -source = "git+https://github.com/HFQR/xitca-web.git?rev=23ad63cbb3a853a548bd447cc59625a5d7c5833e#23ad63cbb3a853a548bd447cc59625a5d7c5833e" +source = "git+https://github.com/HFQR/xitca-web.git?rev=263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f#263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" dependencies = [ "futures-core", "http", @@ -1121,7 +1121,7 @@ dependencies = [ [[package]] name = "xitca-io" version = "0.1.0" -source = "git+https://github.com/HFQR/xitca-web.git?rev=23ad63cbb3a853a548bd447cc59625a5d7c5833e#23ad63cbb3a853a548bd447cc59625a5d7c5833e" +source = "git+https://github.com/HFQR/xitca-web.git?rev=263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f#263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" dependencies = [ "bytes", "tokio", @@ -1132,7 +1132,7 @@ dependencies = [ [[package]] name = "xitca-postgres" version = "0.1.0" -source = "git+https://github.com/HFQR/xitca-web.git?rev=23ad63cbb3a853a548bd447cc59625a5d7c5833e#23ad63cbb3a853a548bd447cc59625a5d7c5833e" +source = "git+https://github.com/HFQR/xitca-web.git?rev=263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f#263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" dependencies = [ "fallible-iterator", "percent-encoding", @@ -1148,7 +1148,7 @@ dependencies = [ [[package]] name = "xitca-router" version = "0.1.0" -source = "git+https://github.com/HFQR/xitca-web.git?rev=23ad63cbb3a853a548bd447cc59625a5d7c5833e#23ad63cbb3a853a548bd447cc59625a5d7c5833e" +source = "git+https://github.com/HFQR/xitca-web.git?rev=263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f#263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" dependencies = [ "xitca-unsafe-collection", ] @@ -1156,7 +1156,7 @@ dependencies = [ [[package]] name = "xitca-server" version = "0.1.0" -source = "git+https://github.com/HFQR/xitca-web.git?rev=23ad63cbb3a853a548bd447cc59625a5d7c5833e#23ad63cbb3a853a548bd447cc59625a5d7c5833e" +source = "git+https://github.com/HFQR/xitca-web.git?rev=263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f#263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" dependencies = [ "socket2 0.5.5", "tokio", @@ -1170,12 +1170,12 @@ dependencies = [ [[package]] name = "xitca-service" version = "0.1.0" -source = "git+https://github.com/HFQR/xitca-web.git?rev=23ad63cbb3a853a548bd447cc59625a5d7c5833e#23ad63cbb3a853a548bd447cc59625a5d7c5833e" +source = "git+https://github.com/HFQR/xitca-web.git?rev=263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f#263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" [[package]] name = "xitca-unsafe-collection" version = "0.1.0" -source = "git+https://github.com/HFQR/xitca-web.git?rev=23ad63cbb3a853a548bd447cc59625a5d7c5833e#23ad63cbb3a853a548bd447cc59625a5d7c5833e" +source = "git+https://github.com/HFQR/xitca-web.git?rev=263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f#263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" dependencies = [ "bytes", ] @@ -1203,13 +1203,13 @@ dependencies = [ "xitca-server", "xitca-service", "xitca-unsafe-collection", - "xitca-web 0.1.0 (git+https://github.com/HFQR/xitca-web.git?rev=23ad63cbb3a853a548bd447cc59625a5d7c5833e)", + "xitca-web 0.1.0 (git+https://github.com/HFQR/xitca-web.git?rev=263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f)", ] [[package]] name = "xitca-web" version = "0.1.0" -source = "git+https://github.com/HFQR/xitca-web.git?rev=23ad63cbb3a853a548bd447cc59625a5d7c5833e#23ad63cbb3a853a548bd447cc59625a5d7c5833e" +source = "git+https://github.com/HFQR/xitca-web.git?rev=263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f#263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" dependencies = [ "futures-core", "pin-project-lite", diff --git a/frameworks/Rust/xitca-web/Cargo.toml b/frameworks/Rust/xitca-web/Cargo.toml index 10af08ac491..d1367c3fb07 100644 --- a/frameworks/Rust/xitca-web/Cargo.toml +++ b/frameworks/Rust/xitca-web/Cargo.toml @@ -21,13 +21,15 @@ required-features = ["web"] [[bin]] name = "xitca-web-axum" path = "./src/main_axum.rs" -required-features = ["axum", "io-uring"] +required-features = ["axum", "io-uring", "pg-sync", "template"] [features] # pg optional -pg = ["xitca-postgres"] +pg = ["xitca-postgres/single-thread"] +# pg send/sync optional +pg-sync = ["xitca-postgres"] # pg io_uring optional -pg-iou = ["xitca-postgres/io-uring"] +pg-iou = ["pg", "xitca-postgres/io-uring"] # http router optional router = ["xitca-http/router"] # web optional @@ -54,7 +56,7 @@ serde_json = { version = "1" } xitca-web = { version = "0.1", features = ["json"], optional = true } # raw-pg optional -xitca-postgres = { version = "0.1", features = ["single-thread"], optional = true } +xitca-postgres = { version = "0.1", optional = true } # template optional sailfish = { version = "0.8", default-features = false, features = ["derive", "perf-inline"], optional = true } @@ -80,13 +82,13 @@ codegen-units = 1 panic = "abort" [patch.crates-io] -xitca-http = { git = "https://github.com/HFQR/xitca-web.git", rev = "23ad63cbb3a853a548bd447cc59625a5d7c5833e" } -xitca-io = { git = "https://github.com/HFQR/xitca-web.git", rev = "23ad63cbb3a853a548bd447cc59625a5d7c5833e" } -xitca-postgres = { git = "https://github.com/HFQR/xitca-web.git", rev = "23ad63cbb3a853a548bd447cc59625a5d7c5833e" } -xitca-router = { git = "https://github.com/HFQR/xitca-web.git", rev = "23ad63cbb3a853a548bd447cc59625a5d7c5833e" } -xitca-server = { git = "https://github.com/HFQR/xitca-web.git", rev = "23ad63cbb3a853a548bd447cc59625a5d7c5833e" } -xitca-service = { git = "https://github.com/HFQR/xitca-web.git", rev = "23ad63cbb3a853a548bd447cc59625a5d7c5833e" } -xitca-unsafe-collection = { git = "https://github.com/HFQR/xitca-web.git", rev = "23ad63cbb3a853a548bd447cc59625a5d7c5833e" } -xitca-web = { git = "https://github.com/HFQR/xitca-web.git", rev = "23ad63cbb3a853a548bd447cc59625a5d7c5833e" } +xitca-http = { git = "https://github.com/HFQR/xitca-web.git", rev = "263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" } +xitca-io = { git = "https://github.com/HFQR/xitca-web.git", rev = "263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" } +xitca-postgres = { git = "https://github.com/HFQR/xitca-web.git", rev = "263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" } +xitca-router = { git = "https://github.com/HFQR/xitca-web.git", rev = "263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" } +xitca-server = { git = "https://github.com/HFQR/xitca-web.git", rev = "263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" } +xitca-service = { git = "https://github.com/HFQR/xitca-web.git", rev = "263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" } +xitca-unsafe-collection = { git = "https://github.com/HFQR/xitca-web.git", rev = "263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" } +xitca-web = { git = "https://github.com/HFQR/xitca-web.git", rev = "263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" } mio = { git = "https://github.com/fakeshadow/mio.git", rev = "52b72d372bfe5807755b7f5e3e1edf282954d6ba" } diff --git a/frameworks/Rust/xitca-web/benchmark_config.json b/frameworks/Rust/xitca-web/benchmark_config.json index 060cb47b354..57c3adddfa8 100755 --- a/frameworks/Rust/xitca-web/benchmark_config.json +++ b/frameworks/Rust/xitca-web/benchmark_config.json @@ -67,10 +67,14 @@ "axum": { "json_url": "/json", "plaintext_url": "/plaintext", + "db_url": "/db", + "fortune_url": "/fortunes", + "query_url": "/queries?q=", + "update_url": "/updates?q=", "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "none", + "approach": "realistic", + "classification": "micro", + "database": "postgres", "framework": "axum [xitca]", "language": "rust", "orm": "raw", diff --git a/frameworks/Rust/xitca-web/src/db.rs b/frameworks/Rust/xitca-web/src/db.rs index 211931c1893..c4614344d0b 100644 --- a/frameworks/Rust/xitca-web/src/db.rs +++ b/frameworks/Rust/xitca-web/src/db.rs @@ -1,4 +1,4 @@ -use std::{cell::RefCell, collections::HashMap, fmt::Write, future::IntoFuture}; +use std::{collections::HashMap, fmt::Write, future::IntoFuture}; use xitca_postgres::{statement::Statement, AsyncIterator, Postgres}; use xitca_unsafe_collection::no_hash::NoHashBuilder; @@ -10,7 +10,10 @@ use super::{ pub struct Client { client: xitca_postgres::Client, - rng: RefCell, + #[cfg(not(feature = "pg-sync"))] + rng: std::cell::RefCell, + #[cfg(feature = "pg-sync")] + rng: std::sync::Mutex, fortune: Statement, world: Statement, updates: HashMap, @@ -29,7 +32,7 @@ impl Drop for Client { pub async fn create(config: &str) -> HandleResult { let (client, driver) = Postgres::new(config.to_string()).connect().await?; - tokio::task::spawn_local(tokio::task::unconstrained(driver.into_future())); + tokio::spawn(tokio::task::unconstrained(driver.into_future())); let fortune = client.prepare("SELECT * FROM fortune", &[]).await?.leak(); @@ -62,7 +65,10 @@ pub async fn create(config: &str) -> HandleResult { Ok(Client { client, - rng: RefCell::new(Rand::default()), + #[cfg(not(feature = "pg-sync"))] + rng: std::cell::RefCell::new(Rand::default()), + #[cfg(feature = "pg-sync")] + rng: std::sync::Mutex::new(Rand::default()), fortune, world, updates, @@ -70,8 +76,18 @@ pub async fn create(config: &str) -> HandleResult { } impl Client { + #[cfg(not(feature = "pg-sync"))] + fn borrow_rng_mut(&self) -> std::cell::RefMut<'_, Rand> { + self.rng.borrow_mut() + } + + #[cfg(feature = "pg-sync")] + fn borrow_rng_mut(&self) -> std::sync::MutexGuard<'_, Rand> { + self.rng.lock().unwrap() + } + pub async fn get_world(&self) -> HandleResult { - let id = self.rng.borrow_mut().gen_id(); + let id = self.borrow_rng_mut().gen_id(); self.client .query_raw(&self.world, [id]) .await? @@ -86,7 +102,7 @@ impl Client { let mut pipe = self.client.pipeline(); { - let mut rng = self.rng.borrow_mut(); + let mut rng = self.borrow_rng_mut(); (0..num).try_for_each(|_| pipe.query_raw(&self.world, [rng.gen_id()]))?; } @@ -112,7 +128,7 @@ impl Client { let mut pipe = self.client.pipeline(); { - let mut rng = self.rng.borrow_mut(); + let mut rng = self.borrow_rng_mut(); (0..num).try_for_each(|_| { let w_id = rng.gen_id(); let r_id = rng.gen_id(); diff --git a/frameworks/Rust/xitca-web/src/main_axum.rs b/frameworks/Rust/xitca-web/src/main_axum.rs index 1345569126d..b0228246346 100644 --- a/frameworks/Rust/xitca-web/src/main_axum.rs +++ b/frameworks/Rust/xitca-web/src/main_axum.rs @@ -3,30 +3,47 @@ #[global_allocator] static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc; +mod db; mod ser; mod util; +use std::sync::Arc; + use axum::{ - http::header::{HeaderValue, SERVER}, - response::IntoResponse, + body::Bytes, + extract::{Json, OriginalUri as Uri, State}, + http::{ + header::{HeaderValue, SERVER}, + StatusCode, + }, + response::{Html, IntoResponse, Response}, routing::{get, Router}, - Json, }; use tower_http::set_header::SetResponseHeaderLayer; -use crate::tower_compat::TowerHttp; +use crate::{ + db::Client, + tower_compat::TowerHttp, + util::{QueryParse, DB_URL}, +}; fn main() -> std::io::Result<()> { let service = TowerHttp::service(|| async { - Router::new() + let cli = db::create(DB_URL).await?; + let service = Router::new() .route("/plaintext", get(plain_text)) .route("/json", get(json)) + .route("/db", get(db)) + .route("/fortunes", get(fortunes)) + .route("/queries", get(queries)) + .route("/updates", get(updates)) + .with_state(Arc::new(cli)) .layer(SetResponseHeaderLayer::if_not_present( SERVER, HeaderValue::from_static("A"), - )) + )); + Ok(service) }); - xitca_server::Builder::new() .bind("xitca-axum", "0.0.0.0:8080", service)? .build() @@ -41,10 +58,48 @@ async fn json() -> impl IntoResponse { Json(ser::Message::new()) } +async fn db(State(cli): State>) -> impl IntoResponse { + cli.get_world().await.map(Json).map_err(Error) +} + +async fn fortunes(State(cli): State>) -> impl IntoResponse { + use sailfish::TemplateOnce; + cli.tell_fortune() + .await + .map_err(Error)? + .render_once() + .map(Html) + .map_err(|e| Error(Box::new(e))) +} + +async fn queries(State(cli): State>, Uri(uri): Uri) -> impl IntoResponse { + cli.get_worlds(uri.query().parse_query()) + .await + .map(Json) + .map_err(Error) +} + +async fn updates(State(cli): State>, Uri(uri): Uri) -> impl IntoResponse { + cli.update(uri.query().parse_query()) + .await + .map(Json) + .map_err(Error) +} + +struct Error(util::Error); + +impl IntoResponse for Error { + fn into_response(self) -> Response { + let mut res = Bytes::new().into_response(); + *res.status_mut() = StatusCode::INTERNAL_SERVER_ERROR; + res + } +} + +// compat module between xitca-http and axum. mod tower_compat { use std::{ cell::RefCell, - convert::Infallible, error, fmt, future::Future, io, @@ -78,24 +133,23 @@ mod tower_compat { impl TowerHttp { pub fn service( - service: F, + func: F, ) -> impl Service< Response = impl ReadyService + Service<(TcpStream, SocketAddr)>, Error = impl fmt::Debug, > where F: Fn() -> Fut + Send + Sync + Clone, - Fut: Future, + Fut: Future>, S: tower::Service, Response = Response>, S::Error: fmt::Debug, B: Body + Send + 'static, B::Error: error::Error + Send + Sync, { fn_build(move |_| { - let service = service.clone(); + let func = func.clone(); async move { - let service = service().await; - Ok::<_, Infallible>(TowerHttp { + func().await.map(|service| TowerHttp { service: RefCell::new(service), _p: PhantomData, }) diff --git a/frameworks/Rust/xitca-web/src/main_wasm.rs b/frameworks/Rust/xitca-web/src/main_wasm.rs index f9961afb6ce..5ca2a96adf2 100644 --- a/frameworks/Rust/xitca-web/src/main_wasm.rs +++ b/frameworks/Rust/xitca-web/src/main_wasm.rs @@ -13,8 +13,6 @@ use xitca_web::{ App, }; -use self::util::SERVER_HEADER_VALUE; - fn main() -> io::Result<()> { let fd = env::var("FD_COUNT") .ok() @@ -44,7 +42,7 @@ where S: for<'r> Service, Response = WebResponse, Error = E>, { service.call(ctx).await.map(|mut res| { - res.headers_mut().append(SERVER, SERVER_HEADER_VALUE); + res.headers_mut().append(SERVER, util::SERVER_HEADER_VALUE); res }) } diff --git a/frameworks/Rust/xitca-web/src/util.rs b/frameworks/Rust/xitca-web/src/util.rs index e9bc8695bd0..624b5dcfa95 100755 --- a/frameworks/Rust/xitca-web/src/util.rs +++ b/frameworks/Rust/xitca-web/src/util.rs @@ -30,7 +30,6 @@ pub type Error = Box; pub type HandleResult = Result; #[cfg(not(target_arch = "wasm32"))] -#[cfg(any(feature = "pg", feature = "pg-iou"))] mod non_wasm { use core::{cell::RefCell, future::Future, pin::Pin}; @@ -77,5 +76,4 @@ mod non_wasm { } #[cfg(not(target_arch = "wasm32"))] -#[cfg(any(feature = "pg", feature = "pg-iou"))] pub use non_wasm::*; diff --git a/frameworks/Rust/xitca-web/xitca-web-axum.dockerfile b/frameworks/Rust/xitca-web/xitca-web-axum.dockerfile index 7c45bef27fb..cbfcfcd467f 100644 --- a/frameworks/Rust/xitca-web/xitca-web-axum.dockerfile +++ b/frameworks/Rust/xitca-web/xitca-web-axum.dockerfile @@ -3,7 +3,7 @@ FROM rust:1.74 ADD ./ /xitca-web WORKDIR /xitca-web -RUN cargo build --release --bin xitca-web-axum --features axum,io-uring +RUN cargo build --release --bin xitca-web-axum --features axum,io-uring,pg-sync,template EXPOSE 8080 From cae068cebc8e73a82abdb0f5f55733add0927890 Mon Sep 17 00:00:00 2001 From: TreeFrog Framework Date: Tue, 12 Dec 2023 00:06:20 +0900 Subject: [PATCH 035/210] [TreeFrog] Using bulk updates (#8611) * modified to use bulk-update query. * update * update --- .../treefrog/controllers/worldcontroller.cpp | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/frameworks/C++/treefrog/controllers/worldcontroller.cpp b/frameworks/C++/treefrog/controllers/worldcontroller.cpp index 61068dcce9b..3f3f71d484d 100644 --- a/frameworks/C++/treefrog/controllers/worldcontroller.cpp +++ b/frameworks/C++/treefrog/controllers/worldcontroller.cpp @@ -3,6 +3,7 @@ #include "pworld.h" #include "mngworld.h" #include +#include void WorldController::index() @@ -246,17 +247,48 @@ void WorldController::cached_pqueries(const QString &num) void WorldController::pupdates(const QString &num) { + const QString statement("UPDATE world SET randomnumber = CASE id"); QVariantList worlds; + QString ids; + QString q = statement; + q.reserve(4096); int d = std::min(std::max(num.toInt(), 1), 500); PWorld world; + auto blkupdate = [&q, &ids, &statement]() { + if (!ids.isEmpty()) { + ids.chop(1); + q += QStringLiteral(" END WHERE id IN (%1)").arg(ids); + TSqlQuery query; + query.exec(q); + ids.clear(); + q = statement; + } + }; + for (int i = 0; i < d; ++i) { int id = Tf::random(1, 10000); world = PWorld::get(id); world.setRandomNumber( Tf::random(1, 10000) ); - world.update(); + q += QLatin1String(" WHEN "); + q += QString::number(world.id()); + q += QLatin1String(" THEN "); + q += QString::number(world.randomNumber()); + ids += QString::number(world.id()); + ids += ','; worlds << world.toVariantMap(); + + if (!((i + 1) % 200)) { + blkupdate(); + } } + + if (d == 1) { + world.update(); + } else { + blkupdate(); + } + renderJson(worlds); } From 0ee7d8a744352d446010b83edaede3762d1c4749 Mon Sep 17 00:00:00 2001 From: pavelmash <7467039+pavelmash@users.noreply.github.com> Date: Mon, 11 Dec 2023 17:06:28 +0200 Subject: [PATCH 036/210] [mORMot] improved HTTP server performance (#8612) Co-authored-by: pavel.mash --- frameworks/Pascal/mormot/setup_and_build.sh | 2 +- frameworks/Pascal/mormot/src/raw.pas | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/frameworks/Pascal/mormot/setup_and_build.sh b/frameworks/Pascal/mormot/setup_and_build.sh index 9afe8eff833..81fc5b37ad0 100755 --- a/frameworks/Pascal/mormot/setup_and_build.sh +++ b/frameworks/Pascal/mormot/setup_and_build.sh @@ -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/c9cefa05e892763ff66a9a51a659b937def36195 +URL=https://github.com/synopse/mORMot2/tarball/c68d24054ffd3e5d63ecb33a2eea49055948e816 #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 diff --git a/frameworks/Pascal/mormot/src/raw.pas b/frameworks/Pascal/mormot/src/raw.pas index b3695c8393c..82b7d8f872a 100644 --- a/frameworks/Pascal/mormot/src/raw.pas +++ b/frameworks/Pascal/mormot/src/raw.pas @@ -201,10 +201,11 @@ constructor TRawAsyncServer.Create( hsoNoStats, // disable low-level statistic counters //hsoThreadCpuAffinity, // worse scaling on multi-servers hsoThreadSmooting, // seems a good option, even if not magical + hsoEnablePipelining, // as expected by /plaintext {$ifdef WITH_LOGS} hsoLogVerbose, {$endif WITH_LOGS} - hsoIncludeDateHeader // required by TPW General Test Requirements #5 + hsoIncludeDateHeader // required by TFB General Test Requirements #5 ] + flags); if pin2Core <> -1 then fHttpServer.Async.SetCpuAffinity(pin2Core); From 29d8bd9366a7a388a019f66789405053516d9ad8 Mon Sep 17 00:00:00 2001 From: Juanjo Aguililla Date: Mon, 11 Dec 2023 16:06:35 +0100 Subject: [PATCH 037/210] [ Kotlin / Hexagon ] Update Hexagon version and improve native image (#8613) * Fix error with URLs in JEE servers * Clean up * Avoid classpath URLs * Fix template loading error * Fix template loading error * Chores * Fix template loading error * Delete MongoDB DB support Storage support in Hexagon will be moved outside the Toolkit, and so, it will be left outside the benchmark. * Fix runtime problem * Update Hexagon version * Make Jackson Blackbird module optional * Add variation with Blackbird module enabled * Upgrade Hexagon version * Enable blackbird Jackson module by default * Update dependencies * Use Hexagon version 2.0.0-B1 (and a little cleanup) * Use Hexagon version 2.0.0-B1 (and a little cleanup) * Use Tomcat instead Resin to test JEE integration * Remove unused environment variable * Clean Tomcat dockerfile * Minor improvements * Minor improvements * Update to release version * Update to the latest Hexagon release * Add Netty adapter test * Remove Gradle Wrapper * Update version * Update version * Minimize template * Skip Hexagon checks in the container * Add Netty Epoll benchmark * Database and template improvements * Update Hexagon version * Update Hexagon version * Update DB settings * Use a single store and template engine to simplify benchmark * Bump mysql-connector-java in /frameworks/Java/wicket Bumps [mysql-connector-java](https://github.com/mysql/mysql-connector-j) from 8.0.27 to 8.0.28. - [Release notes](https://github.com/mysql/mysql-connector-j/releases) - [Changelog](https://github.com/mysql/mysql-connector-j/blob/release/8.0/CHANGES) - [Commits](https://github.com/mysql/mysql-connector-j/compare/8.0.27...8.0.28) --- updated-dependencies: - dependency-name: mysql:mysql-connector-java dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump mongodb-driver-sync from 4.2.0 to 4.2.1 in /frameworks/Java/javalin Bumps [mongodb-driver-sync](https://github.com/mongodb/mongo-java-driver) from 4.2.0 to 4.2.1. - [Release notes](https://github.com/mongodb/mongo-java-driver/releases) - [Commits](https://github.com/mongodb/mongo-java-driver/compare/r4.2.0...r4.2.1) --- updated-dependencies: - dependency-name: org.mongodb:mongodb-driver-sync dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump ujson from 5.2.0 to 5.4.0 in /frameworks/Python/starlette Bumps [ujson](https://github.com/ultrajson/ultrajson) from 5.2.0 to 5.4.0. - [Release notes](https://github.com/ultrajson/ultrajson/releases) - [Commits](https://github.com/ultrajson/ultrajson/compare/5.2.0...5.4.0) --- updated-dependencies: - dependency-name: ujson dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump ujson from 5.2.0 to 5.4.0 in /frameworks/Python/django Bumps [ujson](https://github.com/ultrajson/ultrajson) from 5.2.0 to 5.4.0. - [Release notes](https://github.com/ultrajson/ultrajson/releases) - [Commits](https://github.com/ultrajson/ultrajson/compare/5.2.0...5.4.0) --- updated-dependencies: - dependency-name: ujson dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump ujson from 5.2.0 to 5.4.0 in /frameworks/Python/routerling Bumps [ujson](https://github.com/ultrajson/ultrajson) from 5.2.0 to 5.4.0. - [Release notes](https://github.com/ultrajson/ultrajson/releases) - [Commits](https://github.com/ultrajson/ultrajson/compare/5.2.0...5.4.0) --- updated-dependencies: - dependency-name: ujson dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump ujson from 5.2.0 to 5.4.0 in /frameworks/Python/japronto Bumps [ujson](https://github.com/ultrajson/ultrajson) from 5.2.0 to 5.4.0. - [Release notes](https://github.com/ultrajson/ultrajson/releases) - [Commits](https://github.com/ultrajson/ultrajson/compare/5.2.0...5.4.0) --- updated-dependencies: - dependency-name: ujson dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump ujson from 5.2.0 to 5.4.0 in /frameworks/Python/fastapi Bumps [ujson](https://github.com/ultrajson/ultrajson) from 5.2.0 to 5.4.0. - [Release notes](https://github.com/ultrajson/ultrajson/releases) - [Commits](https://github.com/ultrajson/ultrajson/compare/5.2.0...5.4.0) --- updated-dependencies: - dependency-name: ujson dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump ujson from 5.2.0 to 5.4.0 in /frameworks/Python/uvicorn Bumps [ujson](https://github.com/ultrajson/ultrajson) from 5.2.0 to 5.4.0. - [Release notes](https://github.com/ultrajson/ultrajson/releases) - [Commits](https://github.com/ultrajson/ultrajson/compare/5.2.0...5.4.0) --- updated-dependencies: - dependency-name: ujson dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump ujson from 5.2.0 to 5.4.0 in /frameworks/Python/flask Bumps [ujson](https://github.com/ultrajson/ultrajson) from 5.2.0 to 5.4.0. - [Release notes](https://github.com/ultrajson/ultrajson/releases) - [Commits](https://github.com/ultrajson/ultrajson/compare/5.2.0...5.4.0) --- updated-dependencies: - dependency-name: ujson dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump ujson from 5.1 to 5.4.0 in /frameworks/Python/aiohttp Bumps [ujson](https://github.com/ultrajson/ultrajson) from 5.1 to 5.4.0. - [Release notes](https://github.com/ultrajson/ultrajson/releases) - [Commits](https://github.com/ultrajson/ultrajson/compare/5.1.0...5.4.0) --- updated-dependencies: - dependency-name: ujson dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump rails-html-sanitizer from 1.4.2 to 1.4.3 in /frameworks/Ruby/rails Bumps [rails-html-sanitizer](https://github.com/rails/rails-html-sanitizer) from 1.4.2 to 1.4.3. - [Release notes](https://github.com/rails/rails-html-sanitizer/releases) - [Changelog](https://github.com/rails/rails-html-sanitizer/blob/master/CHANGELOG.md) - [Commits](https://github.com/rails/rails-html-sanitizer/compare/v1.4.2...v1.4.3) --- updated-dependencies: - dependency-name: rails-html-sanitizer dependency-type: indirect ... Signed-off-by: dependabot[bot] * Bump jetty-server in /frameworks/Java/jetty Bumps [jetty-server](https://github.com/eclipse/jetty.project) from 9.4.41.v20210516 to 10.0.10. - [Release notes](https://github.com/eclipse/jetty.project/releases) - [Commits](https://github.com/eclipse/jetty.project/compare/jetty-9.4.41.v20210516...jetty-10.0.10) --- updated-dependencies: - dependency-name: org.eclipse.jetty:jetty-server dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump undertow-core in /frameworks/Java/undertow Bumps [undertow-core](https://github.com/undertow-io/undertow) from 2.2.11.Final to 2.2.15.Final. - [Release notes](https://github.com/undertow-io/undertow/releases) - [Commits](https://github.com/undertow-io/undertow/compare/2.2.11.Final...2.2.15.Final) --- updated-dependencies: - dependency-name: io.undertow:undertow-core dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Update versions * Update README.md * Bump sanic from 22.3.1 to 22.6.1 in /frameworks/Python/sanic Bumps [sanic](https://github.com/sanic-org/sanic) from 22.3.1 to 22.6.1. - [Release notes](https://github.com/sanic-org/sanic/releases) - [Changelog](https://github.com/sanic-org/sanic/blob/main/CHANGELOG.rst) - [Commits](https://github.com/sanic-org/sanic/compare/v22.3.1...v22.6.1) --- updated-dependencies: - dependency-name: sanic dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump postgresql from 42.3.3 to 42.4.1 in /frameworks/Java/light-java Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.3.3 to 42.4.1. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.3.3...REL42.4.1) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump postgresql from 42.3.3 to 42.4.1 in /frameworks/Java/rapidoid Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.3.3 to 42.4.1. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.3.3...REL42.4.1) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump postgresql from 42.3.3 to 42.4.1 in /frameworks/Java/jooby Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.3.3 to 42.4.1. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.3.3...REL42.4.1) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump postgresql from 42.3.3 to 42.4.1 in /frameworks/Java/servlet Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.3.3 to 42.4.1. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.3.3...REL42.4.1) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump postgresql from 42.3.3 to 42.4.1 in /frameworks/Java/spring-webflux Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.3.3 to 42.4.1. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.3.3...REL42.4.1) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump postgresql from 42.3.3 to 42.4.1 in /frameworks/Java/smart-socket Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.3.3 to 42.4.1. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.3.3...REL42.4.1) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump postgresql from 42.3.3 to 42.4.1 in /frameworks/Java/act Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.3.3 to 42.4.1. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.3.3...REL42.4.1) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump postgresql from 42.3.3 to 42.4.1 in /frameworks/Kotlin/kooby Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.3.3 to 42.4.1. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.3.3...REL42.4.1) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump postgresql from 42.3.3 to 42.4.1 in /frameworks/Java/dropwizard Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.3.3 to 42.4.1. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.3.3...REL42.4.1) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump postgresql from 42.3.3 to 42.4.1 in /frameworks/Java/hserver Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.3.3 to 42.4.1. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.3.3...REL42.4.1) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump postgresql from 42.4.0 to 42.4.1 in /frameworks/Java/undertow Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.4.0 to 42.4.1. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.4.0...REL42.4.1) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump postgresql from 42.2.23 to 42.4.1 in /frameworks/Kotlin/ktor/ktor Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.2.23 to 42.4.1. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.2.23...REL42.4.1) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Update dependencies * Bump undertow-core in /frameworks/Java/light-java Bumps [undertow-core](https://github.com/undertow-io/undertow) from 2.2.15.Final to 2.2.19.Final. - [Release notes](https://github.com/undertow-io/undertow/releases) - [Commits](https://github.com/undertow-io/undertow/compare/2.2.15.Final...2.2.19.Final) --- updated-dependencies: - dependency-name: io.undertow:undertow-core dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump undertow-core in /frameworks/Java/undertow Bumps [undertow-core](https://github.com/undertow-io/undertow) from 2.2.18.Final to 2.2.19.Final. - [Release notes](https://github.com/undertow-io/undertow/releases) - [Commits](https://github.com/undertow-io/undertow/compare/2.2.18.Final...2.2.19.Final) --- updated-dependencies: - dependency-name: io.undertow:undertow-core dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Delete Gradle Wrapper * Use different JSON serializer * Restore non Hexagon files * Update Hexagon version * Run pipeline * Run pipeline * Bump axum-core from 0.2.7 to 0.2.8 in /frameworks/Rust/axum Bumps [axum-core](https://github.com/tokio-rs/axum) from 0.2.7 to 0.2.8. - [Release notes](https://github.com/tokio-rs/axum/releases) - [Changelog](https://github.com/tokio-rs/axum/blob/main/CHANGELOG.md) - [Commits](https://github.com/tokio-rs/axum/compare/axum-core-v0.2.7...axum-core-v0.2.8) --- updated-dependencies: - dependency-name: axum-core dependency-type: indirect ... Signed-off-by: dependabot[bot] * Revert "Bump axum-core from 0.2.7 to 0.2.8 in /frameworks/Rust/axum" This reverts commit 4422de8915e70cdca67a07c2e0fdb0610757924b. * Version updates, code refactor and new benchmark cases * Version updates * Version updates * Version updates * [Hexagon] Refactor and updates: * Update Hexagon version * Use Rocker template * Modularize the different scenarios * Fix connection problems * Update Hexagon * Update Gradle * Update dependencies * Update Hexagon version * Update Gradle Wrapper * Add async and native support * Add async and native support * Add async and native support * Replace Vert.x adapter by Netty Epoll Async adapter * Replace Vert.x adapter by Netty Epoll Async adapter * Replace Vert.x adapter by Netty Epoll Async adapter * Replace Vert.x adapter by Netty Epoll Async adapter * Replace Vert.x adapter by Netty Epoll Async adapter * Add Jasync store * Add Jasync store * Update * Update * Update * Update Gradle * Benchmark Netty Epoll only * Add Nima adapter * Update container builds * Fix missing endpoints * Fix Nima benchmarks * Update dependencies * Update dependencies * Update dependencies * Fix build * Fix controller * Fix native tests * Fix native tests * Add note * Add note * Update dependencies * Update dependencies * Update dependencies * Recheck CI jobs * Update dependencies * Update dependencies * Update dependencies * Update dependencies * Update dependencies * Update dependencies * Update Hexagon and Java version, switch templates to JTE * Update Hexagon and improve Netty Epoll configuration * Update Hexagon version * Update dependencies * Update dependencies * Update dependencies * Update dependencies * Update dependencies * Update dependencies * Update dependencies * Update dependencies --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- frameworks/Kotlin/hexagon/build.gradle | 14 +++++++------- .../core/native-image.properties | 3 ++- .../hexagon/gradle/wrapper/gradle-wrapper.jar | Bin 63721 -> 43462 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../hexagon/hexagon-helidon-native.dockerfile | 2 +- .../hexagon/hexagon-jetty-native.dockerfile | 2 +- 6 files changed, 12 insertions(+), 11 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index 06489534605..e82ca30814f 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -1,6 +1,6 @@ plugins { - id "org.jetbrains.kotlin.jvm" version "1.9.20" apply false + id "org.jetbrains.kotlin.jvm" version "1.9.21" apply false id "org.graalvm.buildtools.native" version "0.9.28" apply false } @@ -9,13 +9,13 @@ description = "TFB benchmark" group = "com.hexagonkt" ext { - hexagonVersion = "3.4.3" - jettyVersion = "12.0.3" - nettyVersion = "4.1.100.Final" + hexagonVersion = "3.4.5" + jettyVersion = "12.0.4" + nettyVersion = "4.1.101.Final" hikariVersion = "5.1.0" - postgresqlVersion = "42.6.0" - vertxVersion = "4.4.6" + postgresqlVersion = "42.7.1" + vertxVersion = "4.5.0" cache2kVersion = "2.6.1.Final" applicationClass = "com.hexagonkt.BenchmarkKt" @@ -30,5 +30,5 @@ subprojects { } tasks.wrapper { - gradleVersion = "8.4" + gradleVersion = "8.5" } diff --git a/frameworks/Kotlin/hexagon/core/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/core/native-image.properties b/frameworks/Kotlin/hexagon/core/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/core/native-image.properties index 4dac65fae39..3c802071a99 100644 --- a/frameworks/Kotlin/hexagon/core/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/core/native-image.properties +++ b/frameworks/Kotlin/hexagon/core/src/main/resources/META-INF/native-image/com.hexagonkt.benchmark/core/native-image.properties @@ -2,4 +2,5 @@ Args= \ -march=native \ --static \ --libc=musl \ - --initialize-at-build-time=org.slf4j.LoggerFactory + --gc=G1 \ + --enable-sbom diff --git a/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.jar b/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.jar index 7f93135c49b765f8051ef9d0a6055ff8e46073d8..d64cd4917707c1f8861d8cb53dd15194d4248596 100644 GIT binary patch literal 43462 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 literal 63721 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鯊%1Et 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⁢ zv5o9#E7!G0XmdzfsS{efPNi`1b44~SZ4Z8fuX!I}#8g+(wxzQwUT#Xb2(tbY1+EUhGKoT@KEU9Ktl>_0 z%bjDJg;#*gtJZv!-Zs`?^}v5eKmnbjqlvnSzE@_SP|LG_PJ6CYU+6zY6>92%E+ z=j@TZf-iW4(%U{lnYxQA;7Q!b;^brF8n0D>)`q5>|WDDXLrqYU_tKN2>=#@~OE7grMnNh?UOz-O~6 z6%rHy{#h9K0AT+lDC7q4{hw^|q6*Ry;;L%Q@)Ga}$60_q%D)rv(CtS$CQbpq9|y1e zRSrN4;$Jyl{m5bZw`$8TGvb}(LpY{-cQ)fcyJv7l3S52TLXVDsphtv&aPuDk1OzCA z4A^QtC(!11`IsNx_HnSy?>EKpHJWT^wmS~hc^p^zIIh@9f6U@I2 zC=Mve{j2^)mS#U$e{@Q?SO6%LDsXz@SY+=cK_QMmXBIU)j!$ajc-zLx3V60EXJ!qC zi<%2x8Q24YN+&8U@CIlN zrZkcT9yh%LrlGS9`G)KdP(@9Eo-AQz@8GEFWcb7U=a0H^ZVbLmz{+&M7W(nXJ4sN8 zJLR7eeK(K8`2-}j(T7JsO`L!+CvbueT%izanm-^A1Dn{`1Nw`9P?cq;7no+XfC`K(GO9?O^5zNIt4M+M8LM0=7Gz8UA@Z0N+lg+cX)NfazRu z5D)~HA^(u%w^cz+@2@_#S|u>GpB+j4KzQ^&Wcl9f z&hG#bCA(Yk0D&t&aJE^xME^&E-&xGHhXn%}psEIj641H+Nl-}boj;)Zt*t(4wZ5DN z@GXF$bL=&pBq-#vkTkh>7hl%K5|3 z{`Vn9b$iR-SoGENp}bn4;fR3>9sA%X2@1L3aE9yTra;Wb#_`xWwLSLdfu+PAu+o3| zGVnpzPr=ch{uuoHjtw7+_!L_2;knQ!DuDl0R`|%jr+}jFzXtrHIKc323?JO{l&;VF z*L1+}JU7%QJOg|5|Tc|D8fN zJORAg=_vsy{ak|o);@)Yh8Lkcg@$FG3k@ep36BRa^>~UmnRPziS>Z=`Jb2x*Q#`%A zU*i3&Vg?TluO@X0O;r2Jl6LKLUOVhSqg1*qOt^|8*c7 zo(298@+r$k_wQNGHv{|$tW(T8L+4_`FQ{kEW5Jgg{yf7ey4ss_(SNKfz(N9lx&a;< je(UuV8hP?p&}TPdm1I$XmG#(RzlD&B2izSj9sl%y5~4qc diff --git a/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties b/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties index 3fa8f862f75..1af9e0930b8 100644 --- a/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties +++ b/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/frameworks/Kotlin/hexagon/hexagon-helidon-native.dockerfile b/frameworks/Kotlin/hexagon/hexagon-helidon-native.dockerfile index 54ddbfc48c4..c402f0ee792 100644 --- a/frameworks/Kotlin/hexagon/hexagon-helidon-native.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-helidon-native.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM ghcr.io/graalvm/native-image-community:21-muslib-ol9 as build +FROM container-registry.oracle.com/graalvm/native-image:21-muslib-ol9 as build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon-jetty-native.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jetty-native.dockerfile index 3e9f700ba25..2919fdba8b7 100644 --- a/frameworks/Kotlin/hexagon/hexagon-jetty-native.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-jetty-native.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM ghcr.io/graalvm/native-image-community:21-muslib-ol9 as build +FROM container-registry.oracle.com/graalvm/native-image:21-muslib-ol9 as build USER root WORKDIR /hexagon From af859183d67b456a649648c85f817a04795c13e7 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 11 Dec 2023 16:06:46 +0100 Subject: [PATCH 038/210] [php] Update ngx-php to PHP 8.3 (#8614) * [php] Update ngx-php to PHP 8.3 * Update to Nginx 1.25.3 * Use new version tag --- frameworks/PHP/php-ngx/php-ngx-async.dockerfile | 10 +++++----- frameworks/PHP/php-ngx/php-ngx-mysql.dockerfile | 8 ++++---- frameworks/PHP/php-ngx/php-ngx-pgsql.dockerfile | 10 +++++----- frameworks/PHP/php-ngx/php-ngx.dockerfile | 10 +++++----- 4 files changed, 19 insertions(+), 19 deletions(-) diff --git a/frameworks/PHP/php-ngx/php-ngx-async.dockerfile b/frameworks/PHP/php-ngx/php-ngx-async.dockerfile index b78a6a49ab6..5db7df7e059 100644 --- a/frameworks/PHP/php-ngx/php-ngx-async.dockerfile +++ b/frameworks/PHP/php-ngx/php-ngx-async.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:20.04 +FROM ubuntu:22.04 ARG DEBIAN_FRONTEND=noninteractive @@ -10,13 +10,13 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ RUN apt-get update -yqq > /dev/null && \ apt-get install -yqq wget git libxml2-dev systemtap-sdt-dev \ zlib1g-dev libpcre3-dev libargon2-0-dev libsodium-dev \ - php8.2-cli php8.2-dev libphp8.2-embed php8.2-mysql > /dev/null + php8.3-cli php8.3-dev libphp8.3-embed php8.3-mysql > /dev/null ADD . . -ENV NGINX_VERSION 1.24.0 +ENV NGINX_VERSION 1.25.3 -RUN git clone -b v0.0.27 --single-branch --depth 1 https://github.com/rryqszq4/ngx_php7.git > /dev/null +RUN git clone -b v0.0.28 --single-branch --depth 1 https://github.com/rryqszq4/ngx_php7.git > /dev/null RUN wget -q http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \ tar -zxf nginx-${NGINX_VERSION}.tar.gz && \ @@ -28,7 +28,7 @@ RUN wget -q http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \ --add-module=/ngx_php7/third_party/ngx_devel_kit \ --add-module=/ngx_php7 > /dev/null && \ make > /dev/null && make install > /dev/null -RUN sed -i "s|opcache.jit=off|;opcache.jit=off|g" /etc/php/8.2/embed/conf.d/10-opcache.ini +RUN sed -i "s|opcache.jit=off|;opcache.jit=off|g" /etc/php/8.3/embed/conf.d/10-opcache.ini EXPOSE 8080 diff --git a/frameworks/PHP/php-ngx/php-ngx-mysql.dockerfile b/frameworks/PHP/php-ngx/php-ngx-mysql.dockerfile index 8a03f32516c..841dca26953 100644 --- a/frameworks/PHP/php-ngx/php-ngx-mysql.dockerfile +++ b/frameworks/PHP/php-ngx/php-ngx-mysql.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:20.04 +FROM ubuntu:22.04 ARG DEBIAN_FRONTEND=noninteractive @@ -10,12 +10,12 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ RUN apt-get update -yqq > /dev/null && \ apt-get install -yqq wget git libxml2-dev systemtap-sdt-dev \ zlib1g-dev libpcre3-dev libargon2-0-dev libsodium-dev \ - php8.2-cli php8.2-dev libphp8.2-embed php8.2-mysql > /dev/null + php8.3-cli php8.3-dev libphp8.3-embed php8.3-mysql > /dev/null ADD . . -ENV NGINX_VERSION 1.24.0 +ENV NGINX_VERSION 1.25.3 -RUN git clone -b v0.0.27 --single-branch --depth 1 https://github.com/rryqszq4/ngx-php.git > /dev/null +RUN git clone -b v0.0.28 --single-branch --depth 1 https://github.com/rryqszq4/ngx-php.git > /dev/null RUN wget -q http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \ tar -zxf nginx-${NGINX_VERSION}.tar.gz && \ diff --git a/frameworks/PHP/php-ngx/php-ngx-pgsql.dockerfile b/frameworks/PHP/php-ngx/php-ngx-pgsql.dockerfile index 4b4452f3174..3c5ca60ed16 100644 --- a/frameworks/PHP/php-ngx/php-ngx-pgsql.dockerfile +++ b/frameworks/PHP/php-ngx/php-ngx-pgsql.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:20.04 +FROM ubuntu:22.04 ARG DEBIAN_FRONTEND=noninteractive @@ -10,12 +10,12 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ RUN apt-get update -yqq > /dev/null && \ apt-get install -yqq wget git libxml2-dev systemtap-sdt-dev \ zlib1g-dev libpcre3-dev libargon2-0-dev libsodium-dev \ - php8.2-cli php8.2-dev libphp8.2-embed php8.2-pgsql > /dev/null + php8.3-cli php8.3-dev libphp8.3-embed php8.3-pgsql > /dev/null ADD . . -ENV NGINX_VERSION 1.24.0 +ENV NGINX_VERSION 1.25.3 -RUN git clone -b v0.0.27 --single-branch --depth 1 https://github.com/rryqszq4/ngx-php.git > /dev/null +RUN git clone -b v0.0.28 --single-branch --depth 1 https://github.com/rryqszq4/ngx-php.git > /dev/null RUN wget -q http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \ tar -zxf nginx-${NGINX_VERSION}.tar.gz && \ @@ -32,7 +32,7 @@ RUN sed -i "s|app.php|app-pg.php|g" /deploy/nginx.conf RUN export WORKERS=$(( 4 * $(nproc) )) && \ sed -i "s|worker_processes auto|worker_processes $WORKERS|g" /deploy/nginx.conf -RUN sed -i "s|opcache.jit=off|opcache.jit=function|g" /etc/php/8.2/embed/conf.d/10-opcache.ini +RUN sed -i "s|opcache.jit=off|opcache.jit=function|g" /etc/php/8.3/embed/conf.d/10-opcache.ini EXPOSE 8080 CMD /nginx/sbin/nginx -c /deploy/nginx.conf diff --git a/frameworks/PHP/php-ngx/php-ngx.dockerfile b/frameworks/PHP/php-ngx/php-ngx.dockerfile index d20a9e08f63..0642b2e9509 100644 --- a/frameworks/PHP/php-ngx/php-ngx.dockerfile +++ b/frameworks/PHP/php-ngx/php-ngx.dockerfile @@ -1,4 +1,4 @@ -FROM ubuntu:20.04 +FROM ubuntu:22.04 ARG DEBIAN_FRONTEND=noninteractive @@ -10,12 +10,12 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ RUN apt-get update -yqq > /dev/null && \ apt-get install -yqq wget git libxml2-dev systemtap-sdt-dev \ zlib1g-dev libpcre3-dev libargon2-0-dev libsodium-dev \ - php8.2-cli php8.2-dev libphp8.2-embed php8.2-mysql + php8.3-cli php8.3-dev libphp8.3-embed php8.3-mysql ADD . . -ENV NGINX_VERSION 1.24.0 +ENV NGINX_VERSION 1.25.3 -RUN git clone -b v0.0.27 --single-branch --depth 1 https://github.com/rryqszq4/ngx-php.git > /dev/null +RUN git clone -b v0.0.28 --single-branch --depth 1 https://github.com/rryqszq4/ngx-php.git > /dev/null RUN wget -q http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \ tar -zxf nginx-${NGINX_VERSION}.tar.gz && \ @@ -27,7 +27,7 @@ RUN wget -q http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \ --add-module=/ngx-php/third_party/ngx_devel_kit \ --add-module=/ngx-php > /dev/null && \ make > /dev/null && make install > /dev/null -RUN sed -i "s|opcache.jit=off|;opcache.jit=off|g" /etc/php/8.2/embed/conf.d/10-opcache.ini +RUN sed -i "s|opcache.jit=off|;opcache.jit=off|g" /etc/php/8.3/embed/conf.d/10-opcache.ini EXPOSE 8080 From da5be74b5bf82db0edd4303924d3fd866cfafdf7 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 11 Dec 2023 16:06:54 +0100 Subject: [PATCH 039/210] [php] Amp update to PHP 8.3 (#8615) --- frameworks/PHP/amp/amp.dockerfile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frameworks/PHP/amp/amp.dockerfile b/frameworks/PHP/amp/amp.dockerfile index 08058b50d22..1c164b024cf 100644 --- a/frameworks/PHP/amp/amp.dockerfile +++ b/frameworks/PHP/amp/amp.dockerfile @@ -6,24 +6,24 @@ RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /de RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php RUN apt-get update -yqq > /dev/null && \ apt-get install -yqq git unzip wget curl build-essential \ - php8.2-cli php8.2-mbstring php8.2-dev php8.2-xml php8.2-curl > /dev/null + php8.3-cli php8.3-mbstring php8.3-dev php8.3-xml php8.3-curl > /dev/null # An extension is required! # We deal with concurrencies over 1k, which stream_select doesn't support. RUN wget http://pear.php.net/go-pear.phar --quiet && php go-pear.phar #RUN apt-get install -y libuv1-dev > /dev/null RUN apt-get install -y libevent-dev > /dev/null -#RUN pecl install uv-0.2.4 > /dev/null && echo "extension=uv.so" > /etc/php/8.2/cli/conf.d/uv.ini -RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.2/cli/conf.d/event.ini +#RUN pecl install uv-0.2.4 > /dev/null && echo "extension=uv.so" > /etc/php/8.3/cli/conf.d/uv.ini +RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini ADD ./ /amp WORKDIR /amp -COPY deploy/conf/* /etc/php/8.2/cli/conf.d/ +COPY deploy/conf/* /etc/php/8.3/cli/conf.d/ COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -RUN composer install --prefer-dist --optimize-autoloader --no-dev --quiet +RUN composer install --prefer-dist --optimize-autoloader --no-dev EXPOSE 8080 From dcc7e59f47ab7e4b818f3521343a46a733384439 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 11 Dec 2023 16:07:01 +0100 Subject: [PATCH 040/210] [php] Mako update to PHP 8.3 (#8616) --- frameworks/PHP/mako/mako.dockerfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frameworks/PHP/mako/mako.dockerfile b/frameworks/PHP/mako/mako.dockerfile index 8445c793103..07010604204 100644 --- a/frameworks/PHP/mako/mako.dockerfile +++ b/frameworks/PHP/mako/mako.dockerfile @@ -7,16 +7,16 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null RUN apt-get install -yqq nginx git unzip \ - php8.2-cli php8.2-fpm php8.2-mysql php8.2-mbstring php8.2-xml php8.2-curl > /dev/null + php8.3-cli php8.3-fpm php8.3-mysql php8.3-mbstring php8.3-xml php8.3-curl > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.2/fpm/ +COPY deploy/conf/* /etc/php/8.3/fpm/ ADD ./ /mako WORKDIR /mako -RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.2/fpm/php-fpm.conf ; fi; +RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.3/fpm/php-fpm.conf ; fi; RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --ignore-platform-reqs --quiet @@ -24,5 +24,5 @@ RUN chmod -R 777 app EXPOSE 8080 -CMD service php8.2-fpm start && \ +CMD service php8.3-fpm start && \ nginx -c /mako/deploy/nginx.conf From 7bf940e632a5318c1638fb233fd2b31655119d88 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 11 Dec 2023 16:07:07 +0100 Subject: [PATCH 041/210] [php] Wolff update to v4.1 (#8617) * [php] Wolff update to v4.1 * Small change to rerun Gactions --- frameworks/PHP/wolff/composer.json | 5 +---- frameworks/PHP/wolff/wolff.dockerfile | 2 +- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/frameworks/PHP/wolff/composer.json b/frameworks/PHP/wolff/composer.json index 1b43803812c..9c3ade8f03f 100644 --- a/frameworks/PHP/wolff/composer.json +++ b/frameworks/PHP/wolff/composer.json @@ -22,10 +22,7 @@ ], "require": { "php": ">=7.1.0", - "usbac/wolff-framework": "~4.0" - }, - "require-dev": { - "phpunit/phpunit": "8.*" + "usbac/wolff-framework": "~4.1" }, "autoload": { "psr-4": { diff --git a/frameworks/PHP/wolff/wolff.dockerfile b/frameworks/PHP/wolff/wolff.dockerfile index 1d94b5bc668..a22a0ceb76c 100644 --- a/frameworks/PHP/wolff/wolff.dockerfile +++ b/frameworks/PHP/wolff/wolff.dockerfile @@ -7,7 +7,7 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php RUN apt-get install -yqq nginx git unzip \ php8.3-fpm php8.3-mysql php8.3-xml php8.3-mbstring php8.3-intl php8.3-dev php8.3-curl > /dev/null -COPY deploy/conf/* /etc/php/8.3/fpm/ +COPY deploy/conf/* /etc/php/8.3/fpm/ ADD ./ /wolff WORKDIR /wolff From 6ea31b7444a31dbbd92720d76831ec0fe5958a27 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 11 Dec 2023 16:07:15 +0100 Subject: [PATCH 042/210] [ruby/grape] Fix unicorn config worker_processes (#8619) `worker_processes` is a method that accepts an integer, instead of a variable. --- frameworks/Ruby/grape/config/unicorn.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/frameworks/Ruby/grape/config/unicorn.rb b/frameworks/Ruby/grape/config/unicorn.rb index 972e803e685..697d61d8016 100644 --- a/frameworks/Ruby/grape/config/unicorn.rb +++ b/frameworks/Ruby/grape/config/unicorn.rb @@ -1,6 +1,8 @@ require_relative 'auto_tune' -worker_processes, = auto_tune +num_workers, = auto_tune +worker_processes num_workers + listen "/tmp/unicorn.sock", :backlog => 4096 preload_app true From f90a353a584737b6128708379f6a65c2660b4b36 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 11 Dec 2023 16:07:22 +0100 Subject: [PATCH 043/210] [php] Fatfree update to PHP 8.3 (#8623) --- frameworks/PHP/fat-free/deploy/conf/php.ini | 3 +++ frameworks/PHP/fat-free/fat-free-raw.dockerfile | 10 +++++----- frameworks/PHP/fat-free/fat-free.dockerfile | 11 +++++------ 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/frameworks/PHP/fat-free/deploy/conf/php.ini b/frameworks/PHP/fat-free/deploy/conf/php.ini index d2e924cf326..82133535145 100644 --- a/frameworks/PHP/fat-free/deploy/conf/php.ini +++ b/frameworks/PHP/fat-free/deploy/conf/php.ini @@ -1909,6 +1909,9 @@ opcache.huge_code_pages=1 ; SSL stream context option. ;openssl.capath= +opcache.jit_buffer_size = 128M +opcache.jit = tracing + ; Local Variables: ; tab-width: 4 ; End: \ No newline at end of file diff --git a/frameworks/PHP/fat-free/fat-free-raw.dockerfile b/frameworks/PHP/fat-free/fat-free-raw.dockerfile index 29ae8ba95a3..799ab3ccf3c 100644 --- a/frameworks/PHP/fat-free/fat-free-raw.dockerfile +++ b/frameworks/PHP/fat-free/fat-free-raw.dockerfile @@ -1,13 +1,13 @@ -FROM ubuntu:20.04 +FROM ubuntu:22.04 ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php RUN apt-get update -yqq > /dev/null && \ - apt-get install -yqq nginx git unzip php8.1 php8.1-common php8.1-cli php8.1-fpm php8.1-mysql > /dev/null + apt-get install -yqq nginx git unzip php8.3 php8.3-common php8.3-cli php8.3-fpm php8.3-mysql > /dev/null -COPY deploy/conf/* /etc/php/8.1/fpm/ +COPY deploy/conf/* /etc/php/8.3/fpm/ ADD ./ /fat-free WORKDIR /fat-free @@ -18,11 +18,11 @@ COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet -RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.1/fpm/php-fpm.conf ; fi; +RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.3/fpm/php-fpm.conf ; fi; RUN chmod -R 777 /fat-free EXPOSE 8080 -CMD service php8.1-fpm start && \ +CMD service php8.3-fpm start && \ nginx -c /fat-free/deploy/nginx.conf diff --git a/frameworks/PHP/fat-free/fat-free.dockerfile b/frameworks/PHP/fat-free/fat-free.dockerfile index 8d75cb82cf3..a6df3aca401 100644 --- a/frameworks/PHP/fat-free/fat-free.dockerfile +++ b/frameworks/PHP/fat-free/fat-free.dockerfile @@ -1,13 +1,13 @@ -FROM ubuntu:20.04 +FROM ubuntu:22.04 ARG DEBIAN_FRONTEND=noninteractive RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /dev/null RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php RUN apt-get update -yqq > /dev/null && \ - apt-get install -yqq nginx git unzip php8.1 php8.1-common php8.1-cli php8.1-fpm php8.1-mysql > /dev/null + apt-get install -yqq nginx git unzip php8.3 php8.3-common php8.3-cli php8.3-fpm php8.3-mysql > /dev/null -COPY deploy/conf/* /etc/php/8.1/fpm/ +COPY deploy/conf/* /etc/php/8.3/fpm/ ADD ./ /fat-free WORKDIR /fat-free @@ -18,13 +18,12 @@ ENV F3DIR="/fat-free/src" COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet -#RUN git clone -b 3.7.2 --single-branch --depth 1 "https://github.com/bcosca/fatfree-core.git" src -RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.1/fpm/php-fpm.conf ; fi; +RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.3/fpm/php-fpm.conf ; fi; RUN chmod -R 777 /fat-free EXPOSE 8080 -CMD service php8.1-fpm start && \ +CMD service php8.3-fpm start && \ nginx -c /fat-free/deploy/nginx.conf From 7bbb956a2f2e2f05988bc9f1aab861734c982634 Mon Sep 17 00:00:00 2001 From: David Denton Date: Mon, 11 Dec 2023 15:07:28 +0000 Subject: [PATCH 044/210] http4k: Upgrade GraalVM images to newest versions (JDK21) (#8627) * Improve performance of update query in pgclient * Upgrade GraalVM images to newest --- frameworks/Kotlin/http4k/README.md | 8 ++++---- .../http4k/Http4kGraalVMBenchmarkServer.kt | 4 ++-- .../http4k/http4k-apache-graalvm.dockerfile | 17 +++++++++++------ .../Kotlin/http4k/http4k-graalvm.dockerfile | 18 +++++++++++------- .../http4k/http4k-helidon-graalvm.dockerfile | 17 +++++++++++------ 5 files changed, 39 insertions(+), 25 deletions(-) diff --git a/frameworks/Kotlin/http4k/README.md b/frameworks/Kotlin/http4k/README.md index 58f7c5ea3c3..65e8a3e1570 100644 --- a/frameworks/Kotlin/http4k/README.md +++ b/frameworks/Kotlin/http4k/README.md @@ -3,7 +3,7 @@ ## Infrastructure Software Versions The tests were run with: -* JDK 11 +* JDK 21 * [http4k](https://http4k.org) ## Test URLs @@ -16,10 +16,10 @@ The tests were run with: - Plaintext: http://localhost:9000/plaintext ## Supported backends (w/ Postgres client) -- SunHttp/SunHttpLoom (default - bundled with core module - zero dependencies) +- SunHttp/SunHttpLoom (default - bundled with core module - zero dependencies) (+ SunHttpLoom w/GraalVM) - Apache (5) -- Apache4 -- Helidon +- Apache4 (+ w/GraalVM) +- Helidon (+ w/GraalVM) - KtorCIO - KtorNetty - Jetty/JettyLoom diff --git a/frameworks/Kotlin/http4k/graalvm/src/main/kotlin/http4k/Http4kGraalVMBenchmarkServer.kt b/frameworks/Kotlin/http4k/graalvm/src/main/kotlin/http4k/Http4kGraalVMBenchmarkServer.kt index 20a8d1eb566..a94b241d3f0 100644 --- a/frameworks/Kotlin/http4k/graalvm/src/main/kotlin/http4k/Http4kGraalVMBenchmarkServer.kt +++ b/frameworks/Kotlin/http4k/graalvm/src/main/kotlin/http4k/Http4kGraalVMBenchmarkServer.kt @@ -1,5 +1,5 @@ -import org.http4k.server.SunHttp +import org.http4k.server.SunHttpLoom fun main() { - Http4kBenchmarkServer(PostgresDatabase()).start(SunHttp(9000)) + Http4kBenchmarkServer(PostgresDatabase()).start(SunHttpLoom(9000)) } diff --git a/frameworks/Kotlin/http4k/http4k-apache-graalvm.dockerfile b/frameworks/Kotlin/http4k/http4k-apache-graalvm.dockerfile index a8fa54b4fcc..c6815f305cc 100644 --- a/frameworks/Kotlin/http4k/http4k-apache-graalvm.dockerfile +++ b/frameworks/Kotlin/http4k/http4k-apache-graalvm.dockerfile @@ -10,16 +10,21 @@ COPY core-pgclient core-pgclient COPY apache-graalvm apache-graalvm RUN gradle --quiet --no-daemon apache-graalvm:shadowJar -FROM ghcr.io/graalvm/graalvm-community:21.0.0-ol9-20230919 as graalvm + +FROM ghcr.io/graalvm/native-image-community:21 as graalvm COPY --from=gradle /http4k/core/src/main/resources/* /home/app/http4k-apache-graalvm/ COPY --from=gradle /http4k/apache-graalvm/build/libs/http4k-benchmark.jar /home/app/http4k-apache-graalvm/ COPY --from=gradle /http4k/apache-graalvm/config/*.json /home/app/http4k-apache-graalvm/ -WORKDIR /home/app/http4k-apache-graalvm + RUN native-image \ - -H:ReflectionConfigurationFiles=reflect-config.json \ - -H:ResourceConfigurationFiles=resource-config.json \ + --static --no-fallback \ + -H:+UnlockExperimentalVMOptions \ + -H:ReflectionConfigurationFiles=/home/app/http4k-apache-graalvm/reflect-config.json \ + -H:ResourceConfigurationFiles=/home/app/http4k-apache-graalvm/resource-config.json \ --initialize-at-build-time="org.slf4j.LoggerFactory,org.slf4j.simple.SimpleLogger,org.slf4j.impl.StaticLoggerBinder" \ - --no-fallback -cp http4k-benchmark.jar Http4kGraalVMBenchmarkServerKt + -cp /home/app/http4k-apache-graalvm/http4k-benchmark.jar Http4kGraalVMBenchmarkServerKt +FROM frolvlad/alpine-glibc +COPY --from=graalvm /app/http4kgraalvmbenchmarkserverkt /http4kgraalvmbenchmarkserverkt EXPOSE 9000 -ENTRYPOINT ["/home/app/http4k-apache-graalvm/http4kgraalvmbenchmarkserverkt"] \ No newline at end of file +ENTRYPOINT ["/http4kgraalvmbenchmarkserverkt"] \ No newline at end of file diff --git a/frameworks/Kotlin/http4k/http4k-graalvm.dockerfile b/frameworks/Kotlin/http4k/http4k-graalvm.dockerfile index b59cae84fd3..667932c0441 100644 --- a/frameworks/Kotlin/http4k/http4k-graalvm.dockerfile +++ b/frameworks/Kotlin/http4k/http4k-graalvm.dockerfile @@ -7,19 +7,23 @@ COPY core core COPY core-jdbc core-jdbc COPY core-pgclient core-pgclient COPY graalvm graalvm -COPY sunhttp sunhttp RUN gradle --quiet --no-daemon graalvm:shadowJar -FROM ghcr.io/graalvm/graalvm-community:21.0.0-ol9-20230919 as graalvm + +FROM ghcr.io/graalvm/native-image-community:21 as graalvm COPY --from=gradle /http4k/core/src/main/resources/* /home/app/http4k-graalvm/ COPY --from=gradle /http4k/graalvm/build/libs/http4k-benchmark.jar /home/app/http4k-graalvm/ COPY --from=gradle /http4k/graalvm/config/*.json /home/app/http4k-graalvm/ -WORKDIR /home/app/http4k-graalvm + RUN native-image \ - -H:ReflectionConfigurationFiles=reflect-config.json \ - -H:ResourceConfigurationFiles=resource-config.json \ + --static --no-fallback \ + -H:+UnlockExperimentalVMOptions \ + -H:ReflectionConfigurationFiles=/home/app/http4k-graalvm/reflect-config.json \ + -H:ResourceConfigurationFiles=/home/app/http4k-graalvm/resource-config.json \ --initialize-at-build-time="org.slf4j.LoggerFactory,org.slf4j.simple.SimpleLogger,org.slf4j.impl.StaticLoggerBinder" \ - --no-fallback -cp http4k-benchmark.jar Http4kGraalVMBenchmarkServerKt + -cp /home/app/http4k-graalvm/http4k-benchmark.jar Http4kGraalVMBenchmarkServerKt +FROM frolvlad/alpine-glibc +COPY --from=graalvm /app/http4kgraalvmbenchmarkserverkt /http4kgraalvmbenchmarkserverkt EXPOSE 9000 -ENTRYPOINT ["/home/app/http4k-graalvm/http4kgraalvmbenchmarkserverkt"] +ENTRYPOINT ["/http4kgraalvmbenchmarkserverkt"] \ No newline at end of file diff --git a/frameworks/Kotlin/http4k/http4k-helidon-graalvm.dockerfile b/frameworks/Kotlin/http4k/http4k-helidon-graalvm.dockerfile index 833b73497c1..0dd8a12cd2b 100644 --- a/frameworks/Kotlin/http4k/http4k-helidon-graalvm.dockerfile +++ b/frameworks/Kotlin/http4k/http4k-helidon-graalvm.dockerfile @@ -10,16 +10,21 @@ COPY helidon-jdbc helidon-jdbc COPY helidon-graalvm helidon-graalvm RUN gradle --quiet --no-daemon helidon-graalvm:shadowJar -FROM ghcr.io/graalvm/graalvm-community:21.0.0-ol9-20230919 as graalvm + +FROM ghcr.io/graalvm/native-image-community:21 as graalvm COPY --from=gradle /http4k/core/src/main/resources/* /home/app/http4k-helidon-graalvm/ COPY --from=gradle /http4k/helidon-graalvm/build/libs/http4k-benchmark.jar /home/app/http4k-helidon-graalvm/ COPY --from=gradle /http4k/helidon-graalvm/config/*.json /home/app/http4k-helidon-graalvm/ -WORKDIR /home/app/http4k-helidon-graalvm + RUN native-image \ - -H:ReflectionConfigurationFiles=reflect-config.json \ - -H:ResourceConfigurationFiles=resource-config.json \ + --static --no-fallback \ + -H:+UnlockExperimentalVMOptions \ + -H:ReflectionConfigurationFiles=/home/app/http4k-helidon-graalvm/reflect-config.json \ + -H:ResourceConfigurationFiles=/home/app/http4k-helidon-graalvm/resource-config.json \ --initialize-at-build-time="org.slf4j.LoggerFactory,org.slf4j.simple.SimpleLogger,org.slf4j.impl.StaticLoggerBinder" \ - --no-fallback -cp http4k-benchmark.jar Http4kGraalVMBenchmarkServerKt + -cp /home/app/http4k-helidon-graalvm/http4k-benchmark.jar Http4kGraalVMBenchmarkServerKt +FROM frolvlad/alpine-glibc +COPY --from=graalvm /app/http4kgraalvmbenchmarkserverkt /http4kgraalvmbenchmarkserverkt EXPOSE 9000 -ENTRYPOINT ["/home/app/http4k-helidon-graalvm/http4kgraalvmbenchmarkserverkt"] \ No newline at end of file +ENTRYPOINT ["/http4kgraalvmbenchmarkserverkt"] \ No newline at end of file From 1ecedf4951600ffa828906f8641741c8c1f599e5 Mon Sep 17 00:00:00 2001 From: n-stefan <38526229+n-stefan@users.noreply.github.com> Date: Mon, 11 Dec 2023 17:08:22 +0200 Subject: [PATCH 045/210] Revert "[ASP.NET Core] Inline completions (#8546)" (#8618) This reverts commit 49f05b16e7a02a22b468fd00898a28934462b959. --- frameworks/CSharp/aspnetcore/aspnetcore.dockerfile | 1 - 1 file changed, 1 deletion(-) diff --git a/frameworks/CSharp/aspnetcore/aspnetcore.dockerfile b/frameworks/CSharp/aspnetcore/aspnetcore.dockerfile index 90409f3b188..d1e50dd88e0 100644 --- a/frameworks/CSharp/aspnetcore/aspnetcore.dockerfile +++ b/frameworks/CSharp/aspnetcore/aspnetcore.dockerfile @@ -5,7 +5,6 @@ RUN dotnet publish -c Release -o out /p:DatabaseProvider=Npgsql FROM mcr.microsoft.com/dotnet/aspnet:8.0.0-rc.2 AS runtime ENV URLS http://+:8080 -ENV DOTNET_SYSTEM_NET_SOCKETS_INLINE_COMPLETIONS 1 WORKDIR /app COPY --from=build /app/out ./ From 0f41eed20093070ff77707af078b9f2233dd48cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C4=B5=20=CE=9D=CE=B9=CE=93=CE=9E=CE=97=CE=9B=CF=88=CE=9A?= Date: Mon, 11 Dec 2023 20:38:37 +0530 Subject: [PATCH 046/210] [CSharp] Upgrade `FastEndpoints` to .NET 8 (#8609) --- .../CSharp/fastendpoints/Benchmarks/Benchmarks.csproj | 2 +- frameworks/CSharp/fastendpoints/README.md | 6 +++--- frameworks/CSharp/fastendpoints/fastendpoints.dockerfile | 8 ++------ 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/frameworks/CSharp/fastendpoints/Benchmarks/Benchmarks.csproj b/frameworks/CSharp/fastendpoints/Benchmarks/Benchmarks.csproj index d93151d2ee7..f3b5211caa5 100644 --- a/frameworks/CSharp/fastendpoints/Benchmarks/Benchmarks.csproj +++ b/frameworks/CSharp/fastendpoints/Benchmarks/Benchmarks.csproj @@ -1,7 +1,7 @@ - net7.0 + net8.0 enable enable CA2016;IDE1006 diff --git a/frameworks/CSharp/fastendpoints/README.md b/frameworks/CSharp/fastendpoints/README.md index 8e0f978fdf5..327f2749ab1 100644 --- a/frameworks/CSharp/fastendpoints/README.md +++ b/frameworks/CSharp/fastendpoints/README.md @@ -5,11 +5,11 @@ This includes tests for plaintext and json serialization. **Language** -* C# 10.0 +* C# 12.0 **Platforms** -* .NET Core (Windows and Linux) +* .NET 8 (Windows and Linux) **Web Servers** @@ -18,7 +18,7 @@ This includes tests for plaintext and json serialization. **Web Stack** * [FastEndpoints](https://fast-endpoints.com/) -* ASP.Net 6 +* ASP.NET 8 ## Paths & Source for Tests diff --git a/frameworks/CSharp/fastendpoints/fastendpoints.dockerfile b/frameworks/CSharp/fastendpoints/fastendpoints.dockerfile index e7e53b5d27b..08419edaf8f 100644 --- a/frameworks/CSharp/fastendpoints/fastendpoints.dockerfile +++ b/frameworks/CSharp/fastendpoints/fastendpoints.dockerfile @@ -1,16 +1,12 @@ -FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /app COPY Benchmarks . RUN dotnet publish -c Release -o out -FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS runtime +FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime WORKDIR /app COPY --from=build /app/out ./ -ENV DOTNET_TieredPGO 1 -ENV DOTNET_TC_QuickJitForLoops 1 -ENV DOTNET_ReadyToRun 0 - EXPOSE 8080 ENTRYPOINT ["dotnet", "Benchmarks.dll"] \ No newline at end of file From 0243d0b616b95d707036ca286456701dfab06abe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20N=C3=A4geli?= Date: Mon, 11 Dec 2023 16:08:53 +0100 Subject: [PATCH 047/210] Update GenHTTP to version 8 (#8563) --- .../CSharp/genhttp/Benchmarks/Benchmarks.csproj | 14 +++++++------- .../genhttp/Benchmarks/Tests/FortuneHandler.cs | 2 +- .../Benchmarks/Utilities/ServerHeaderConcern.cs | 3 ++- frameworks/CSharp/genhttp/genhttp.dockerfile | 4 ++-- 4 files changed, 12 insertions(+), 11 deletions(-) diff --git a/frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj b/frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj index f6ba3053312..4df8fb3e39a 100644 --- a/frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj +++ b/frameworks/CSharp/genhttp/Benchmarks/Benchmarks.csproj @@ -2,7 +2,7 @@ - net7.0 + net8.0 10.0 GenHTTP Benchmarks @@ -12,7 +12,7 @@ Exe true - true + true @@ -28,12 +28,12 @@ - - - + + + - - + + diff --git a/frameworks/CSharp/genhttp/Benchmarks/Tests/FortuneHandler.cs b/frameworks/CSharp/genhttp/Benchmarks/Tests/FortuneHandler.cs index d53b3f1328b..6add5edbaeb 100644 --- a/frameworks/CSharp/genhttp/Benchmarks/Tests/FortuneHandler.cs +++ b/frameworks/CSharp/genhttp/Benchmarks/Tests/FortuneHandler.cs @@ -88,7 +88,7 @@ public async ValueTask PrepareAsync() public ValueTask CalculateChecksumAsync() => new(17); - public IEnumerable GetContent(IRequest request) => Enumerable.Empty(); + public IAsyncEnumerable GetContentAsync(IRequest request) => AsyncEnumerable.Empty(); public ValueTask RenderAsync(TemplateModel model) => Template.RenderAsync(model); diff --git a/frameworks/CSharp/genhttp/Benchmarks/Utilities/ServerHeaderConcern.cs b/frameworks/CSharp/genhttp/Benchmarks/Utilities/ServerHeaderConcern.cs index d4020d4fd7e..28b3bee2ba7 100644 --- a/frameworks/CSharp/genhttp/Benchmarks/Utilities/ServerHeaderConcern.cs +++ b/frameworks/CSharp/genhttp/Benchmarks/Utilities/ServerHeaderConcern.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using GenHTTP.Api.Content; @@ -31,7 +32,7 @@ public ServerHeaderConcern(IHandler parent, Func contentFact #region Functionality - public IEnumerable GetContent(IRequest request) => Content.GetContent(request); + public IAsyncEnumerable GetContentAsync(IRequest request) => Content.GetContentAsync(request); public ValueTask PrepareAsync() => Content.PrepareAsync(); diff --git a/frameworks/CSharp/genhttp/genhttp.dockerfile b/frameworks/CSharp/genhttp/genhttp.dockerfile index 5cfddc0ccff..4331fd966f8 100644 --- a/frameworks/CSharp/genhttp/genhttp.dockerfile +++ b/frameworks/CSharp/genhttp/genhttp.dockerfile @@ -1,9 +1,9 @@ -FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /app COPY Benchmarks . RUN dotnet publish -c Release -o out -FROM mcr.microsoft.com/dotnet/runtime:7.0 AS runtime +FROM mcr.microsoft.com/dotnet/runtime:8.0 AS runtime ENV DOTNET_SYSTEM_NET_SOCKETS_INLINE_COMPLETIONS 1 # Full PGO From 9f5fb7d3d39f0cc40d2aab69b1fbadac835f32cf Mon Sep 17 00:00:00 2001 From: Dragos Varovici Date: Mon, 11 Dec 2023 08:09:10 -0700 Subject: [PATCH 048/210] Amber database fix (#8624) * Amber database fix * Amber database fix v2 --- frameworks/Crystal/amber/amber.dockerfile | 2 +- frameworks/Crystal/amber/config/initializers/database.cr | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/frameworks/Crystal/amber/amber.dockerfile b/frameworks/Crystal/amber/amber.dockerfile index 4acf62ab32c..f04867c3205 100644 --- a/frameworks/Crystal/amber/amber.dockerfile +++ b/frameworks/Crystal/amber/amber.dockerfile @@ -21,7 +21,7 @@ FROM ubuntu:22.04 WORKDIR /amber ENV AMBER_ENV production -ENV DATABASE_URL postgres://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/hello_world?initial_pool_size=10&max_idle_pool_size=10&retry_attempts=3&retry_delay=1 +ENV DATABASE_URL postgres://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/hello_world RUN apt-get update RUN apt-get install -yqq libyaml-dev diff --git a/frameworks/Crystal/amber/config/initializers/database.cr b/frameworks/Crystal/amber/config/initializers/database.cr index 2e94e830821..04240c59a66 100644 --- a/frameworks/Crystal/amber/config/initializers/database.cr +++ b/frameworks/Crystal/amber/config/initializers/database.cr @@ -1,3 +1,10 @@ require "granite/adapter/pg" -Granite::Connections << Granite::Adapter::Pg.new(name: "pg", url: ENV["DATABASE_URL"]) +cpu_count = System.cpu_count +pool_size = 56 // cpu_count +database_url = ENV["DATABASE_URL"] +url = "#{database_url}?initial_pool_size=#{pool_size}&max_idle_pool_size=#{pool_size}" + +puts url + +Granite::Connections << Granite::Adapter::Pg.new(name: "pg", url: url) From 895441f881e421a6c01c909844e68d469354dae3 Mon Sep 17 00:00:00 2001 From: Sergio del Amo Date: Mon, 11 Dec 2023 16:09:26 +0100 Subject: [PATCH 049/210] Micronaut Framework 4.2.1 (#8620) --- frameworks/Java/micronaut/gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/micronaut/gradle.properties b/frameworks/Java/micronaut/gradle.properties index a4d3cd8e470..b19ea37c70e 100644 --- a/frameworks/Java/micronaut/gradle.properties +++ b/frameworks/Java/micronaut/gradle.properties @@ -1 +1 @@ -micronautVersion = 4.2.0 +micronautVersion = 4.2.1 From cd97923b51eade80cac0b81994f676b30c1d491b Mon Sep 17 00:00:00 2001 From: Rudi Visser Date: Mon, 11 Dec 2023 16:43:57 +0000 Subject: [PATCH 050/210] Add Reaper benchmark (#8554) --- frameworks/CSharp/reaper/README.md | 17 +++++++++ .../CSharp/reaper/ReaperTechEmpower.sln | 16 ++++++++ .../CSharp/reaper/benchmark_config.json | 26 +++++++++++++ frameworks/CSharp/reaper/reaper.dockerfile | 14 +++++++ .../reaper/src/Benchmark/Benchmark.csproj | 25 ++++++++++++ .../reaper/src/Benchmark/JsonEndpoint.cs | 19 ++++++++++ .../reaper/src/Benchmark/PlainTextEndpoint.cs | 16 ++++++++ .../CSharp/reaper/src/Benchmark/Program.cs | 22 +++++++++++ .../Benchmark/Properties/launchSettings.json | 38 +++++++++++++++++++ .../Benchmark/appsettings.Development.json | 8 ++++ .../reaper/src/Benchmark/appsettings.json | 9 +++++ 11 files changed, 210 insertions(+) create mode 100755 frameworks/CSharp/reaper/README.md create mode 100644 frameworks/CSharp/reaper/ReaperTechEmpower.sln create mode 100755 frameworks/CSharp/reaper/benchmark_config.json create mode 100644 frameworks/CSharp/reaper/reaper.dockerfile create mode 100644 frameworks/CSharp/reaper/src/Benchmark/Benchmark.csproj create mode 100644 frameworks/CSharp/reaper/src/Benchmark/JsonEndpoint.cs create mode 100644 frameworks/CSharp/reaper/src/Benchmark/PlainTextEndpoint.cs create mode 100644 frameworks/CSharp/reaper/src/Benchmark/Program.cs create mode 100644 frameworks/CSharp/reaper/src/Benchmark/Properties/launchSettings.json create mode 100644 frameworks/CSharp/reaper/src/Benchmark/appsettings.Development.json create mode 100644 frameworks/CSharp/reaper/src/Benchmark/appsettings.json diff --git a/frameworks/CSharp/reaper/README.md b/frameworks/CSharp/reaper/README.md new file mode 100755 index 00000000000..c524f6af577 --- /dev/null +++ b/frameworks/CSharp/reaper/README.md @@ -0,0 +1,17 @@ +# Reaper Benchmarking Test + +[Reaper](https://github.com/Reaper-Net/Reaper) is a .NET 8+ Source Generator-based REPR pattern API endpoint library. + +### Test Type Implementation Source Code + +* [JSON](src/Benchmark/JsonEndpoint.cs) +* [PLAINTEXT](src/Benchmark/PlainTextEndpoint.cs) + +## Test URLs +### JSON + +http://localhost:8080/json + +### PLAINTEXT + +http://localhost:8080/plaintext \ No newline at end of file diff --git a/frameworks/CSharp/reaper/ReaperTechEmpower.sln b/frameworks/CSharp/reaper/ReaperTechEmpower.sln new file mode 100644 index 00000000000..91fcb8bab43 --- /dev/null +++ b/frameworks/CSharp/reaper/ReaperTechEmpower.sln @@ -0,0 +1,16 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Benchmark", "src\Benchmark\Benchmark.csproj", "{F7BCAEA7-516A-4D65-915C-F9A43C6E875D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {F7BCAEA7-516A-4D65-915C-F9A43C6E875D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F7BCAEA7-516A-4D65-915C-F9A43C6E875D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F7BCAEA7-516A-4D65-915C-F9A43C6E875D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F7BCAEA7-516A-4D65-915C-F9A43C6E875D}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/frameworks/CSharp/reaper/benchmark_config.json b/frameworks/CSharp/reaper/benchmark_config.json new file mode 100755 index 00000000000..586e8f8d6c2 --- /dev/null +++ b/frameworks/CSharp/reaper/benchmark_config.json @@ -0,0 +1,26 @@ +{ + "framework": "reaper", + "tests": [ + { + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "None", + "framework": "Reaper", + "language": "C#", + "flavor": "CoreCLR", + "orm": "None", + "platform": ".NET", + "webserver": "Kestrel", + "os": "Linux", + "database_os": "Linux", + "display_name": "Reaper [aot,slim]", + "notes": "", + "versus": "aspnetcore-minimal" + } + } + ] +} diff --git a/frameworks/CSharp/reaper/reaper.dockerfile b/frameworks/CSharp/reaper/reaper.dockerfile new file mode 100644 index 00000000000..1e8171b8dd4 --- /dev/null +++ b/frameworks/CSharp/reaper/reaper.dockerfile @@ -0,0 +1,14 @@ +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +WORKDIR /src +COPY src . +RUN apt-get update \ + && apt-get install -y --no-install-recommends \ + clang zlib1g-dev +WORKDIR "/src/Benchmark" +RUN dotnet publish "Benchmark.csproj" -c Release -o /app/publish + +FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS final +WORKDIR /app +EXPOSE 8080 +COPY --from=build /app/publish . +ENTRYPOINT ["./Benchmark"] diff --git a/frameworks/CSharp/reaper/src/Benchmark/Benchmark.csproj b/frameworks/CSharp/reaper/src/Benchmark/Benchmark.csproj new file mode 100644 index 00000000000..e0e1ed8ee20 --- /dev/null +++ b/frameworks/CSharp/reaper/src/Benchmark/Benchmark.csproj @@ -0,0 +1,25 @@ + + + + net8.0 + enable + enable + Linux + true + $(InterceptorsPreviewNamespaces);Reaper.Generated + true + Speed + + + + + .dockerignore + + + + + + + + + diff --git a/frameworks/CSharp/reaper/src/Benchmark/JsonEndpoint.cs b/frameworks/CSharp/reaper/src/Benchmark/JsonEndpoint.cs new file mode 100644 index 00000000000..26fba3b743f --- /dev/null +++ b/frameworks/CSharp/reaper/src/Benchmark/JsonEndpoint.cs @@ -0,0 +1,19 @@ +using Reaper; +using Reaper.Attributes; + +namespace Benchmark; + +public class JsonResponse +{ + public string Message { get; set; } = default!; +} + +[ReaperRoute(HttpVerbs.Get, "/json")] +public class JsonEndpoint : ReaperEndpointXR +{ + public override Task HandleAsync() + { + Context.Response.ContentLength = 27; + return Task.FromResult(new JsonResponse { Message = "Hello, World!" }); + } +} \ No newline at end of file diff --git a/frameworks/CSharp/reaper/src/Benchmark/PlainTextEndpoint.cs b/frameworks/CSharp/reaper/src/Benchmark/PlainTextEndpoint.cs new file mode 100644 index 00000000000..a316a55b6b4 --- /dev/null +++ b/frameworks/CSharp/reaper/src/Benchmark/PlainTextEndpoint.cs @@ -0,0 +1,16 @@ +using Reaper; +using Reaper.Attributes; + +namespace Benchmark; + +[ReaperRoute(HttpVerbs.Get, "/plaintext")] +public class PlainTextEndpoint : ReaperEndpointXR +{ + public override Task HandleAsync() + { + Context.Response.StatusCode = 200; + Context.Response.ContentType = "text/plain"; + Context.Response.ContentLength = 13; + return Task.FromResult("Hello, World!"); + } +} \ No newline at end of file diff --git a/frameworks/CSharp/reaper/src/Benchmark/Program.cs b/frameworks/CSharp/reaper/src/Benchmark/Program.cs new file mode 100644 index 00000000000..7a44cf047bd --- /dev/null +++ b/frameworks/CSharp/reaper/src/Benchmark/Program.cs @@ -0,0 +1,22 @@ +using System.Text.Json.Serialization; +using Benchmark; +using Reaper; + +var builder = WebApplication.CreateSlimBuilder(args); +builder.Logging.ClearProviders(); +builder.Logging.Configure(o => o.ActivityTrackingOptions = ActivityTrackingOptions.None); +builder.Services.ConfigureHttpJsonOptions(o => +{ + o.SerializerOptions.TypeInfoResolverChain.Insert(0, SourceGenerationContext.Default); +}); +builder.UseReaper(); + +var app = builder.Build(); + +app.UseReaperMiddleware(); +app.MapReaperEndpoints(); + +app.Run(); + +[JsonSerializable(typeof(JsonResponse))] +internal partial class SourceGenerationContext : JsonSerializerContext { } \ No newline at end of file diff --git a/frameworks/CSharp/reaper/src/Benchmark/Properties/launchSettings.json b/frameworks/CSharp/reaper/src/Benchmark/Properties/launchSettings.json new file mode 100644 index 00000000000..0f693d699d9 --- /dev/null +++ b/frameworks/CSharp/reaper/src/Benchmark/Properties/launchSettings.json @@ -0,0 +1,38 @@ +{ + "$schema": "http://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:55625", + "sslPort": 44373 + } + }, + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "http://localhost:5286", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "applicationUrl": "https://localhost:7035;http://localhost:5286", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } + } +} diff --git a/frameworks/CSharp/reaper/src/Benchmark/appsettings.Development.json b/frameworks/CSharp/reaper/src/Benchmark/appsettings.Development.json new file mode 100644 index 00000000000..0c208ae9181 --- /dev/null +++ b/frameworks/CSharp/reaper/src/Benchmark/appsettings.Development.json @@ -0,0 +1,8 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} diff --git a/frameworks/CSharp/reaper/src/Benchmark/appsettings.json b/frameworks/CSharp/reaper/src/Benchmark/appsettings.json new file mode 100644 index 00000000000..10f68b8c8b4 --- /dev/null +++ b/frameworks/CSharp/reaper/src/Benchmark/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*" +} From 9a69933ced90764ded16cb0f9f75fdc5b353b6f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kamil=20Ga=C5=82uszka?= Date: Mon, 11 Dec 2023 17:55:50 +0100 Subject: [PATCH 051/210] [Python/robyn]: add JSON test (#8557) --- frameworks/Python/robyn/app-const.py | 15 ++++++++++++--- frameworks/Python/robyn/app.py | 17 ++++++++++++----- frameworks/Python/robyn/benchmark_config.json | 2 ++ frameworks/Python/robyn/config.toml | 2 ++ frameworks/Python/robyn/requirements-const.txt | 4 ++-- frameworks/Python/robyn/requirements.txt | 4 ++-- frameworks/Python/robyn/robyn-const.dockerfile | 2 +- frameworks/Python/robyn/robyn.dockerfile | 2 +- 8 files changed, 34 insertions(+), 14 deletions(-) diff --git a/frameworks/Python/robyn/app-const.py b/frameworks/Python/robyn/app-const.py index f6cce721132..e082ff1b129 100755 --- a/frameworks/Python/robyn/app-const.py +++ b/frameworks/Python/robyn/app-const.py @@ -1,7 +1,7 @@ import multiprocessing import os -from robyn import Robyn +from robyn import Response, Robyn, jsonify from robyn.argument_parser import Config @@ -21,8 +21,17 @@ def plaintext() -> str: return "Hello, world!" +@app.get("/json", const=True) +def json() -> str: + return Response( + status_code=200, + description=jsonify({"message": "Hello, world!"}), + headers={"Content-Type": "application/json"} + ) + + + if __name__ == "__main__": app.add_response_header("Server", "Robyn") - app.add_response_header("Content-Type", "text/plain") - app.start(url="0.0.0.0", port=8080) + app.start(host="0.0.0.0", port=8080) diff --git a/frameworks/Python/robyn/app.py b/frameworks/Python/robyn/app.py index 5e8aae14d81..798b67026e2 100755 --- a/frameworks/Python/robyn/app.py +++ b/frameworks/Python/robyn/app.py @@ -1,7 +1,7 @@ import multiprocessing import os -from robyn import Robyn +from robyn import Response, Robyn, jsonify from robyn.argument_parser import Config @@ -21,8 +21,15 @@ def plaintext() -> str: return "Hello, world!" -if __name__ == "__main__": - app.add_response_header("Server", "Robyn") - app.add_response_header("Content-Type", "text/plain") +@app.get("/json") +def json() -> str: + return Response( + status_code=200, + description=jsonify({"message": "Hello, world!"}), + headers={"Content-Type": "application/json"} + ) + - app.start(url="0.0.0.0", port=8080) +if __name__ == "__main__": + app.add_response_header("Server", "Roby1n") + app.start(host="0.0.0.0", port=8080) diff --git a/frameworks/Python/robyn/benchmark_config.json b/frameworks/Python/robyn/benchmark_config.json index 16a462b0768..3d8c6baa8a3 100755 --- a/frameworks/Python/robyn/benchmark_config.json +++ b/frameworks/Python/robyn/benchmark_config.json @@ -3,6 +3,7 @@ "tests": [ { "default": { + "json_url": "/json", "plaintext_url": "/plaintext", "port": 8080, "approach": "Realistic", @@ -19,6 +20,7 @@ "versus": "None" }, "const": { + "json_url": "/json", "plaintext_url": "/plaintext", "port": 8080, "approach": "Realistic", diff --git a/frameworks/Python/robyn/config.toml b/frameworks/Python/robyn/config.toml index b4bcd32194f..5fcc7591d68 100644 --- a/frameworks/Python/robyn/config.toml +++ b/frameworks/Python/robyn/config.toml @@ -3,6 +3,7 @@ name = "Robyn" [main] urls.plaintext = "/plaintext" +urls.json = "/json" approach = "Realistic" classification = "Micro" os = "Linux" @@ -13,6 +14,7 @@ versus = "None" [const] urls.plaintext = "/plaintext" +urls.json = "/json" approach = "Realistic" classification = "Micro" os = "Linux" diff --git a/frameworks/Python/robyn/requirements-const.txt b/frameworks/Python/robyn/requirements-const.txt index 49ff1ae519f..0056c1d2876 100644 --- a/frameworks/Python/robyn/requirements-const.txt +++ b/frameworks/Python/robyn/requirements-const.txt @@ -1,2 +1,2 @@ -uvloop==0.17.0 -robyn==0.37.0 +uvloop==0.19.0 +robyn==0.45.0 diff --git a/frameworks/Python/robyn/requirements.txt b/frameworks/Python/robyn/requirements.txt index 49ff1ae519f..0056c1d2876 100644 --- a/frameworks/Python/robyn/requirements.txt +++ b/frameworks/Python/robyn/requirements.txt @@ -1,2 +1,2 @@ -uvloop==0.17.0 -robyn==0.37.0 +uvloop==0.19.0 +robyn==0.45.0 diff --git a/frameworks/Python/robyn/robyn-const.dockerfile b/frameworks/Python/robyn/robyn-const.dockerfile index ab65d8de834..a12c64e248f 100644 --- a/frameworks/Python/robyn/robyn-const.dockerfile +++ b/frameworks/Python/robyn/robyn-const.dockerfile @@ -1,4 +1,4 @@ -FROM python:3.11 +FROM python:3.12 ADD ./ /robyn diff --git a/frameworks/Python/robyn/robyn.dockerfile b/frameworks/Python/robyn/robyn.dockerfile index 5d0ecc64845..bc42b5be462 100644 --- a/frameworks/Python/robyn/robyn.dockerfile +++ b/frameworks/Python/robyn/robyn.dockerfile @@ -1,4 +1,4 @@ -FROM python:3.9 +FROM python:3.12 ADD ./ /robyn From 8c9c7f5b51e5550324da02816660afdfab19f543 Mon Sep 17 00:00:00 2001 From: Redkale Date: Tue, 12 Dec 2023 00:57:18 +0800 Subject: [PATCH 052/210] jdbc-service (#8630) * jdbc-service * add redkale-block test * trace.enabled --- frameworks/Java/redkale/BenchmarkService.java | 78 +++++++++++++++++++ frameworks/Java/redkale/benchmark_config.json | 21 +++++ frameworks/Java/redkale/conf/application.xml | 3 +- frameworks/Java/redkale/config.toml | 15 ++++ frameworks/Java/redkale/pom-vertx.xml | 2 +- .../Java/redkale/redkale-block.dockerfile | 16 ++++ .../Java/redkale/redkale-jdbc.dockerfile | 1 + .../redkalex/benchmark/BenchmarkService.java | 12 +-- .../org/redkalex/benchmark/CachedWorld.java | 3 +- 9 files changed, 141 insertions(+), 10 deletions(-) create mode 100644 frameworks/Java/redkale/BenchmarkService.java create mode 100644 frameworks/Java/redkale/redkale-block.dockerfile diff --git a/frameworks/Java/redkale/BenchmarkService.java b/frameworks/Java/redkale/BenchmarkService.java new file mode 100644 index 00000000000..06e760bf879 --- /dev/null +++ b/frameworks/Java/redkale/BenchmarkService.java @@ -0,0 +1,78 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.redkalex.benchmark; + +import java.util.*; +import java.util.concurrent.*; +import java.util.stream.Stream; +import org.redkale.annotation.*; +import org.redkale.net.http.*; +import org.redkale.service.AbstractService; +import org.redkale.source.DataSource; + +/** + * 测试redkale-jdbc, 需要覆盖到原BenchmarkService + * + * @author zhangjx + */ +@RestService(name = " ", repair = false) +public class BenchmarkService extends AbstractService { + + private static final byte[] helloBytes = "Hello, world!".getBytes(); + + @Resource + private DataSource source; + + @NonBlocking + @RestMapping(auth = false) + public byte[] plaintext() { + return helloBytes; + } + + @NonBlocking + @RestMapping(auth = false) + public Message json() { + return new Message("Hello, World!"); + } + + @RestMapping(auth = false) + public World db() { + return source.find(World.class, ThreadLocalRandom.current().nextInt(10000) + 1); + } + + @RestMapping(auth = false) + public List queries(int q) { + return source.findsList(World.class, random(q)); + } + + @RestMapping(auth = false) + public List updates(int q) { + int size = Math.min(500, Math.max(1, q)); + int[] newNumbers = ThreadLocalRandom.current().ints(size, 1, 10001).toArray(); + List words = source.findsList(World.class, random(q)); + source.update(World.updateNewNumbers(words, newNumbers)); + return words; + } + + @RestMapping(auth = false) + public HttpScope fortunes() { + List fortunes = source.queryList(Fortune.class); + fortunes.add(new Fortune(0, "Additional fortune added at request time.")); + Collections.sort(fortunes); + return HttpScope.refer("").referObj(fortunes); + } + + @NonBlocking + @RestMapping(name = "cached-worlds", auth = false) + public CachedWorld[] cachedWorlds(int q) { + return source.finds(CachedWorld.class, random(q)); + } + + private Stream random(int q) { + int size = Math.min(500, Math.max(1, q)); + return ThreadLocalRandom.current().ints(size, 1, 10001).boxed(); + } +} diff --git a/frameworks/Java/redkale/benchmark_config.json b/frameworks/Java/redkale/benchmark_config.json index 86b2fb08d30..eb9e8d92ba2 100644 --- a/frameworks/Java/redkale/benchmark_config.json +++ b/frameworks/Java/redkale/benchmark_config.json @@ -95,6 +95,27 @@ "notes": "", "versus": "Redkale" }, + "block": { + "db_url": "/db", + "query_url": "/queries?q=", + "fortune_url": "/fortunes", + "update_url": "/updates?q=", + "port": 8080, + "approach": "Realistic", + "classification": "Fullstack", + "database": "Postgres", + "framework": "Redkale", + "language": "Java", + "flavor": "None", + "orm": "Raw", + "platform": "Redkale", + "webserver": "Redkale", + "os": "Linux", + "database_os": "Linux", + "display_name": "redkale-block", + "notes": "", + "versus": "Redkale" + }, "vertx": { "db_url": "/db", "query_url": "/queries?q=", diff --git a/frameworks/Java/redkale/conf/application.xml b/frameworks/Java/redkale/conf/application.xml index 3589ce9f086..d7157c9f8d3 100644 --- a/frameworks/Java/redkale/conf/application.xml +++ b/frameworks/Java/redkale/conf/application.xml @@ -3,8 +3,7 @@ - - + diff --git a/frameworks/Java/redkale/config.toml b/frameworks/Java/redkale/config.toml index 19eba869560..73c0a6678e3 100644 --- a/frameworks/Java/redkale/config.toml +++ b/frameworks/Java/redkale/config.toml @@ -70,6 +70,21 @@ platform = "Redkale" webserver = "Redkale" versus = "Redkale" +[block] +urls.db = "/db" +urls.fortune = "/fortunes" +urls.query = "/queries?q=" +urls.update = "/updates?q=" +approach = "Realistic" +classification = "Fullstack" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "Redkale" +webserver = "Redkale" +versus = "Redkale" + [vertx] urls.db = "/db" urls.fortune = "/fortunes" diff --git a/frameworks/Java/redkale/pom-vertx.xml b/frameworks/Java/redkale/pom-vertx.xml index 4d0ffa06212..9879cff1237 100644 --- a/frameworks/Java/redkale/pom-vertx.xml +++ b/frameworks/Java/redkale/pom-vertx.xml @@ -8,7 +8,7 @@ org.redkale.boot.Application 2.8.0-SNAPSHOT - 4.4.4 + 4.5.0 2.1 UTF-8 18 diff --git a/frameworks/Java/redkale/redkale-block.dockerfile b/frameworks/Java/redkale/redkale-block.dockerfile new file mode 100644 index 00000000000..67594021962 --- /dev/null +++ b/frameworks/Java/redkale/redkale-block.dockerfile @@ -0,0 +1,16 @@ +FROM maven:3.8.6-openjdk-18-slim as maven +WORKDIR /redkale +COPY src src +COPY conf conf +COPY pom.xml pom.xml +COPY BenchmarkService.java src/main/java/org/redkalex/benchmark/BenchmarkService.java +RUN mvn package -q + +FROM openjdk:21-jdk-slim +WORKDIR /redkale +COPY conf conf +COPY --from=maven /redkale/target/redkale-benchmark-1.0.0.jar redkale-benchmark.jar + +EXPOSE 8080 + +CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-DAPP_HOME=./", "-jar", "redkale-benchmark.jar"] \ No newline at end of file diff --git a/frameworks/Java/redkale/redkale-jdbc.dockerfile b/frameworks/Java/redkale/redkale-jdbc.dockerfile index 5b621e47179..c6549abfa03 100644 --- a/frameworks/Java/redkale/redkale-jdbc.dockerfile +++ b/frameworks/Java/redkale/redkale-jdbc.dockerfile @@ -3,6 +3,7 @@ WORKDIR /redkale COPY src src COPY conf conf COPY pom-jdbc.xml pom.xml +COPY BenchmarkService.java src/main/java/org/redkalex/benchmark/BenchmarkService.java RUN mvn package -q FROM openjdk:21-jdk-slim diff --git a/frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/BenchmarkService.java b/frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/BenchmarkService.java index 1e48ee8e9b9..20f816362d2 100644 --- a/frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/BenchmarkService.java +++ b/frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/BenchmarkService.java @@ -8,6 +8,7 @@ import java.util.*; import java.util.concurrent.*; import java.util.stream.IntStream; +import java.util.stream.Stream; import org.redkale.annotation.*; import org.redkale.net.http.*; import org.redkale.service.AbstractService; @@ -43,9 +44,7 @@ public CompletableFuture db() { @RestMapping(auth = false) public CompletableFuture> queries(int q) { - int size = Math.min(500, Math.max(1, q)); - IntStream ids = ThreadLocalRandom.current().ints(size, 1, 10001); - return source.findsListAsync(World.class, ids.boxed()); + return source.findsListAsync(World.class, random(q)); } @RestMapping(auth = false) @@ -69,8 +68,11 @@ public CompletableFuture fortunes() { @RestMapping(name = "cached-worlds", auth = false) public CachedWorld[] cachedWorlds(int q) { + return source.finds(CachedWorld.class, random(q)); + } + + private Stream random(int q) { int size = Math.min(500, Math.max(1, q)); - IntStream ids = ThreadLocalRandom.current().ints(size, 1, 10001); - return source.finds(CachedWorld.class, ids.boxed()); + return ThreadLocalRandom.current().ints(size, 1, 10001).boxed(); } } diff --git a/frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/CachedWorld.java b/frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/CachedWorld.java index 65dc5b8cf6d..ec2c0f1e0b2 100644 --- a/frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/CachedWorld.java +++ b/frameworks/Java/redkale/src/main/java/org/redkalex/benchmark/CachedWorld.java @@ -10,9 +10,8 @@ * * @author zhangjx */ -@Entity @Table(name = "world") -@Cacheable(direct = true) +@Entity(cacheable = true, cacheDirect = true) public final class CachedWorld { @Id From 5b2ead28c2268865bb15ae2ac24087482efca43a Mon Sep 17 00:00:00 2001 From: srisaiswaroop Date: Mon, 11 Dec 2023 22:28:08 +0530 Subject: [PATCH 053/210] Added tests for postgres node module with expressjs (#8561) --- .../JavaScript/express/benchmark_config.json | 27 ++++- .../express/express-postgresjs.dockerfile | 12 ++ frameworks/JavaScript/express/package.json | 4 +- .../JavaScript/express/src/clustered.mjs | 25 +++++ .../express/src/database/postgres.mjs | 27 +++++ frameworks/JavaScript/express/src/server.mjs | 105 ++++++++++++++++++ frameworks/JavaScript/express/src/utils.mjs | 68 ++++++++++++ 7 files changed, 265 insertions(+), 3 deletions(-) create mode 100644 frameworks/JavaScript/express/express-postgresjs.dockerfile create mode 100644 frameworks/JavaScript/express/src/clustered.mjs create mode 100644 frameworks/JavaScript/express/src/database/postgres.mjs create mode 100644 frameworks/JavaScript/express/src/server.mjs create mode 100644 frameworks/JavaScript/express/src/utils.mjs diff --git a/frameworks/JavaScript/express/benchmark_config.json b/frameworks/JavaScript/express/benchmark_config.json index 658e5b378e6..0c8a91678cc 100644 --- a/frameworks/JavaScript/express/benchmark_config.json +++ b/frameworks/JavaScript/express/benchmark_config.json @@ -71,7 +71,7 @@ "orm": "Full", "os": "Linux", "database_os": "Linux", - "display_name": "express", + "display_name": "express[mysql-sequelize]", "notes": "", "versus": "nodejs" }, @@ -92,7 +92,30 @@ "orm": "Full", "os": "Linux", "database_os": "Linux", - "display_name": "express", + "display_name": "express[postgres-sequelize]", + "notes": "", + "versus": "nodejs" + }, + "postgresjs": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "db_url": "/db", + "query_url": "/queries?queries=", + "update_url": "/updates?queries=", + "fortune_url": "/fortunes", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "Postgres", + "framework": "express", + "language": "JavaScript", + "flavor": "NodeJS", + "platform": "nodejs", + "webserver": "None", + "orm": "Full", + "os": "Linux", + "database_os": "Linux", + "display_name": "express[postgres.js]", "notes": "", "versus": "nodejs" } diff --git a/frameworks/JavaScript/express/express-postgresjs.dockerfile b/frameworks/JavaScript/express/express-postgresjs.dockerfile new file mode 100644 index 00000000000..d9a5e1b35ba --- /dev/null +++ b/frameworks/JavaScript/express/express-postgresjs.dockerfile @@ -0,0 +1,12 @@ +FROM node:21.1.0-slim + +COPY ./ ./ + +RUN npm install + +ENV NODE_ENV production +ENV DATABASE postgres + +EXPOSE 8080 + +CMD ["node", "src/clustered.mjs"] diff --git a/frameworks/JavaScript/express/package.json b/frameworks/JavaScript/express/package.json index 0b955c658a9..60c1f6a6b32 100644 --- a/frameworks/JavaScript/express/package.json +++ b/frameworks/JavaScript/express/package.json @@ -6,12 +6,14 @@ "body-parser": "1.19.0", "dateformat": "3.0.3", "escape-html": "1.0.3", - "express": "4.17.3", + "express": "4.18.2", "mongoose": "5.13.20", "mysql2": "2.2.5", "pg": "8.5.0", "pg-promise": "10.7.3", "pug": "2.0.1", + "postgres": "^3.4.3", + "slow-json-stringify": "^2.0.1", "sequelize": "6.29.0" } } diff --git a/frameworks/JavaScript/express/src/clustered.mjs b/frameworks/JavaScript/express/src/clustered.mjs new file mode 100644 index 00000000000..07ebbfbc330 --- /dev/null +++ b/frameworks/JavaScript/express/src/clustered.mjs @@ -0,0 +1,25 @@ +import cluster from "node:cluster"; +import os from "node:os"; +import process from "node:process"; + +process.env.DATABASE = "postgres"; + +if (cluster.isPrimary) { + // Master Node + console.log(`Primary ${process.pid} is running`); + + // Fork workers + const numCPUs = os.availableParallelism(); + for (let i = 0; i < numCPUs; i++) { + cluster.fork(); + } + + cluster.on("exit", (worker) => { + console.log(`worker ${worker.process.pid} died`); + process.exit(1); + }); +} else { + // Cluster Node + await import("./server.mjs"); + console.log(`Worker ${process.pid} started`); +} diff --git a/frameworks/JavaScript/express/src/database/postgres.mjs b/frameworks/JavaScript/express/src/database/postgres.mjs new file mode 100644 index 00000000000..5f22801d234 --- /dev/null +++ b/frameworks/JavaScript/express/src/database/postgres.mjs @@ -0,0 +1,27 @@ +import postgres from "postgres"; + +const sql = postgres({ + host: "tfb-database", + user: "benchmarkdbuser", + password: "benchmarkdbpass", + database: "hello_world", + max: 1, +}); + +export const fortunes = async () => await sql`SELECT id, message FROM fortune`; + +export const find = async (id) => + await sql`SELECT id, randomNumber FROM world WHERE id = ${id}`.then( + (arr) => arr[0] + ); + +export const bulkUpdate = async (worlds) => { + const sorted = sql( + worlds + .map((world) => [world.id, world.randomNumber]) + .sort((a, b) => (a[0] < b[0] ? -1 : 1)) + ); + await sql`UPDATE world SET randomNumber = (update_data.randomNumber)::int + FROM (VALUES ${sorted}) AS update_data (id, randomNumber) + WHERE world.id = (update_data.id)::int`; +}; diff --git a/frameworks/JavaScript/express/src/server.mjs b/frameworks/JavaScript/express/src/server.mjs new file mode 100644 index 00000000000..0de81c196cb --- /dev/null +++ b/frameworks/JavaScript/express/src/server.mjs @@ -0,0 +1,105 @@ +import express from "express"; +import { + generateRandomNumber, + getQueriesCount, + handleError, + escape, + jsonSerializer, + worldObjectSerializer, + sortByMessage, + writeResponse, + headerTypes, + GREETING, +} from "./utils.mjs"; + +let db; +const { DATABASE } = process.env; +if (DATABASE) db = await import(`./database/${DATABASE}.mjs`); + +const extra = { id: 0, message: "Additional fortune added at request time." }; + +const app = express(); + +app.get("/plaintext", (req, res) => { + writeResponse(res, GREETING, headerTypes["plain"]); +}); + +app.get("/json", (req, res) => { + writeResponse(res, jsonSerializer({ message: GREETING })); +}); + +if (db) { + app.get("/db", async (req, res) => { + try { + const row = await db.find(generateRandomNumber()); + writeResponse(res, worldObjectSerializer(row)); + } catch (error) { + handleError(error, res); + } + }); + + app.get("/queries", async (req, res) => { + try { + const queriesCount = getQueriesCount(req); + const databaseJobs = new Array(queriesCount) + .fill() + .map(() => db.find(generateRandomNumber())); + const worldObjects = await Promise.all(databaseJobs); + writeResponse(res, JSON.stringify(worldObjects)); + } catch (error) { + handleError(error, res); + } + }); + + app.get("/fortunes", async (req, res) => { + try { + const rows = [extra, ...(await db.fortunes())]; + sortByMessage(rows); + const n = rows.length; + let html = "", + i = 0; + for (; i < n; i++) { + html += `${rows[i].id}${escape( + rows[i].message + )}`; + } + + writeResponse( + res, + `Fortunes${html}
idmessage
`, + headerTypes["html"] + ); + } catch (error) { + handleError(error, res); + } + }); + + app.get("/updates", async (req, res) => { + try { + const queriesCount = getQueriesCount(req); + const databaseJobs = new Array(queriesCount); + for (let i = 0; i < queriesCount; i++) { + databaseJobs[i] = db.find(generateRandomNumber()); + } + const worldObjects = await Promise.all(databaseJobs); + + for (let i = 0; i < queriesCount; i++) { + worldObjects[i].randomNumber = generateRandomNumber(); + } + await db.bulkUpdate(worldObjects); + writeResponse(res, JSON.stringify(worldObjects)); + } catch (error) { + handleError(error, res); + } + }); +} + +app.all("*", (req, res) => { + res.status(404).send("Not Found"); +}); + +const host = process.env.HOST || "0.0.0.0"; +const port = parseInt(process.env.PORT || "8080"); +app.listen(port, host, () => { + console.log(`Server running at http://${host}:${port}/`); +}); diff --git a/frameworks/JavaScript/express/src/utils.mjs b/frameworks/JavaScript/express/src/utils.mjs new file mode 100644 index 00000000000..1acf96b0d51 --- /dev/null +++ b/frameworks/JavaScript/express/src/utils.mjs @@ -0,0 +1,68 @@ +import { sjs, attr } from "slow-json-stringify"; + +export const GREETING = "Hello, World!"; + +export const headerTypes = { + plain: "text/plain", + json: "application/json", + html: "text/html; charset=UTF-8", +}; + +export function writeResponse(res, text, type = headerTypes["json"]) { + res.writeHead(200, { + "content-type": type, + server: "Express", + }); + res.end(text); +} + +export function handleError(error, response) { + console.error(error); + response.end("Internal Server Error"); +} + +export function getQueriesCount(request) { + return Math.min(parseInt(request.query["queries"]) || 1, 500); +} + +export function generateRandomNumber() { + return Math.ceil(Math.random() * 10000); +} + +const escapeHTMLRules = { + "&": "&", + "<": "<", + ">": ">", + '"': """, + "'": "'", + "/": "/", +}; + +const unsafeHTMLMatcher = /[&<>"'\/]/g; + +export function escape(text) { + if (unsafeHTMLMatcher.test(text) === false) return text; + return text.replace(unsafeHTMLMatcher, function (m) { + return escapeHTMLRules[m] || m; + }); +} + +export const jsonSerializer = sjs({ message: attr("string") }); +export const worldObjectSerializer = sjs({ + id: attr("number"), + randomnumber: attr("number"), +}); + +export function sortByMessage(arr) { + const n = arr.length; + for (let i = 1; i < n; i++) { + const c = arr[i]; + let j = i - 1; + while (j > -1 && c.message < arr[j].message) { + arr[j + 1] = arr[j]; + j--; + } + arr[j + 1] = c; + } + return arr; +} From c1a04f6d2116b1592843328f966409b591f221d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lu=C3=ADs=20Cobucci?= Date: Mon, 11 Dec 2023 18:37:48 +0100 Subject: [PATCH 054/210] Remove blocking I/O from ReactPHP implementation (#8550) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [php] Use libuv for ReactPHP LibUv is the most optimised loop implementation for ReactPHP. This alters the setup to allow us to properly compare things. Signed-off-by: Luís Cobucci * [php] Bump ReactPHP dependencies Signed-off-by: Luís Cobucci * [php] Optimise docker layers This just makes development more efficient as we avoid downloading composer and all the dependencies when we only want to propagate updates to the PHP files. Signed-off-by: Luís Cobucci * [php] Update ReactPHP usage This makes us rely on the automatic execution of the Loop and removes usage of deprecated classes. Signed-off-by: Luís Cobucci * [php] Handle SIGINT and SIGTERM in ReactPHP Although this isn't a huge deal, it speeds up development as we don't need to wait docker to trigger SIGKILL. Signed-off-by: Luís Cobucci * [php] Use non-blocking I/O for DB communication Just as AMPHP, ReactPHP requires asynchronous implementations for it to work as expected. When using PDO we will block the process when establishing the DB connection and sending queries. This replaces the implementation with a fully async MySQL client, also cleaning removing unnecessary extensions from the image. Signed-off-by: Luís Cobucci * Upgrade PHP to v8.3 Signed-off-by: Luís Cobucci --------- Signed-off-by: Luís Cobucci --- frameworks/PHP/reactphp/.dockerignore | 5 + frameworks/PHP/reactphp/.gitignore | 2 + frameworks/PHP/reactphp/app.php | 209 +++++++++++--------- frameworks/PHP/reactphp/composer.json | 9 +- frameworks/PHP/reactphp/reactphp.dockerfile | 23 +-- frameworks/PHP/reactphp/server.php | 27 ++- 6 files changed, 152 insertions(+), 123 deletions(-) create mode 100644 frameworks/PHP/reactphp/.dockerignore create mode 100644 frameworks/PHP/reactphp/.gitignore diff --git a/frameworks/PHP/reactphp/.dockerignore b/frameworks/PHP/reactphp/.dockerignore new file mode 100644 index 00000000000..265ee153b77 --- /dev/null +++ b/frameworks/PHP/reactphp/.dockerignore @@ -0,0 +1,5 @@ +vendor +composer.lock +*.dockerfile +.dockerignore +.gitignore diff --git a/frameworks/PHP/reactphp/.gitignore b/frameworks/PHP/reactphp/.gitignore new file mode 100644 index 00000000000..987e2a253ca --- /dev/null +++ b/frameworks/PHP/reactphp/.gitignore @@ -0,0 +1,2 @@ +composer.lock +vendor diff --git a/frameworks/PHP/reactphp/app.php b/frameworks/PHP/reactphp/app.php index 7c4e230e10f..c159b59204f 100644 --- a/frameworks/PHP/reactphp/app.php +++ b/frameworks/PHP/reactphp/app.php @@ -1,134 +1,147 @@ PDO::FETCH_ASSOC, - PDO::ATTR_EMULATE_PREPARES => false - ] - ); - $world = $pdo->prepare('SELECT id,randomNumber FROM World WHERE id=?'); - $update = $pdo->prepare('UPDATE World SET randomNumber=? WHERE id=?'); - $fortune = $pdo->prepare('SELECT id,message FROM Fortune'); - $fortune->setFetchMode(PDO::FETCH_KEY_PAIR); -} +use function React\Promise\all; -function router(Request $request) +/** @return Closure(Request):ResponseInterface */ +function requestHandler(): Closure { - return match($request->getUri()->getPath()) { - '/plaintext' => text(), - '/json' => json(), - '/db' => db(), - '/fortunes' => fortune(), - '/query' => query($request), - '/update' => updateraw($request), - // '/info' => info(), - default => new Response(404, [], 'Error 404'), + $connection = establishDbConnection('benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world?idle=0.5'); + + $world = static function (int $id) use ($connection): PromiseInterface { + return $connection->query('SELECT id,randomNumber FROM World WHERE id=?', [$id]); }; -} -function text() -{ - return new Response(200, [ - 'Content-Type' => 'text/plain' - ], 'Hello, World!'); -} + $fortune = static function () use ($connection): PromiseInterface { + return $connection->query('SELECT id,message FROM Fortune'); + }; -function json() -{ - return new Response(200, [ - 'Content-Type' => 'application/json' - ], json_encode(['message' => 'Hello, World!'])); + $update = static function (int $id, int $randomNumber) use ($connection): PromiseInterface { + return $connection->query('UPDATE World SET randomNumber=? WHERE id=?', [$randomNumber, $id]); + }; + + return static function (Request $request) use ($world, $fortune, $update): ResponseInterface | PromiseInterface { + return match($request->getUri()->getPath()) { + '/plaintext' => Response::plaintext('Hello, World!'), + '/json' => Response::json(['message' => 'Hello, World!']), + '/db' => db($world), + '/fortunes' => fortune($fortune), + '/query' => query(queryCount($request), $world), + '/update' => updateraw(queryCount($request), $world, $update), + // '/info' => info(), + default => new Response(404, [], 'Error 404'), + }; + }; } -function db() -{ - global $world; +function establishDbConnection( + #[SensitiveParameter] + string $uri, +): DbConnection { + $connection = (new DbFactory())->createLazyConnection($uri); + + $interrupt = $connection->quit(...); - $world->execute([mt_rand(1, 10000)]); + $connection->on('close', static function () use (&$interrupt) { + Loop::removeSignal(SIGINT, $interrupt); + Loop::removeSignal(SIGTERM, $interrupt); + }); - return new Response(200, [ - 'Content-Type' => 'application/json' - ], json_encode($world->fetch())); + Loop::addSignal(SIGINT, $interrupt); + Loop::addSignal(SIGTERM, $interrupt); + + return $connection; } -function query($request) +/** @param Closure(int):PromiseInterface $world */ +function db(Closure $world): PromiseInterface { - global $world; + $id = mt_rand(1, 10000); - $query_count = 1; - $q = (int) $request->getQueryParams()['q']; - if ($q > 1) { - $query_count = min($q, 500); - } + return $world($id)->then( + static fn (QueryResult $result): ResponseInterface => Response::json($result->resultRows[0]), + ); +} - while ($query_count--) { - $world->execute([mt_rand(1, 10000)]); - $arr[] = $world->fetch(); +function queryCount(Request $request): int +{ + $count = (int) ($request->getQueryParams()['q'] ?? 1); + + if ($count > 1) { + return min($count, 500); } - return new Response(200, [ - 'Content-Type' => 'application/json' - ], json_encode($arr)); + return 1; } -function updateraw($request) +/** @param Closure(int):PromiseInterface $world */ +function query(int $queryCount, Closure $world): PromiseInterface { - global $world, $update; + $processQueries = static function (int $count) use ($world): iterable { + while ($count--) { + $id = mt_rand(1, 10000); - $query_count = 1; - $q = (int) $request->getQueryParams()['q']; - if ($q > 1) { - $query_count = min($q, 500); - } + yield $world($id)->then(static fn (QueryResult $result): array => $result->resultRows[0]); + } + }; - while ($query_count--) { - $id = mt_rand(1, 10000); - $world->execute([$id]); - $item = $world->fetch(); - $update->execute( - [$item['randomNumber'] = mt_rand(1, 10000), $id] - ); + return all($processQueries($queryCount)) + ->then(static fn (array $result): ResponseInterface => Response::json($result)); +} - $arr[] = $item; - } +/** + * @param Closure(int):PromiseInterface $world + * @param Closure(int, int):PromiseInterface $update + */ +function updateraw(int $queryCount, Closure $world, Closure $update): PromiseInterface +{ + $processQueries = static function (int $count) use ($world, $update): iterable { + while ($count--) { + $id = mt_rand(1, 10000); + + yield $world($id)->then( + static function (QueryResult $result) use ($update): PromiseInterface { + $updated = $result->resultRows[0]; + $updated['randomNumber'] = mt_rand(1, 10000); + + return $update($updated['id'], $updated['randomNumber']) + ->then(static fn (): array => $updated); + } + ); + } + }; - // $pdo->beginTransaction(); - // foreach($arr as $world) { - // $update->execute([$world['randomNumber'], $world['id']]); - // } - // $pdo->commit(); - return new Response(200, [ - 'Content-Type' => 'application/json' - ], json_encode($arr)); + return all($processQueries($queryCount)) + ->then(static fn (array $result): ResponseInterface => Response::json($result)); } -function fortune() +function fortune(Closure $fortune): PromiseInterface { - global $fortune; + $formatResult = static function (array $rows): string { + $rows[] = ['id' => 0, 'message' => 'Additional fortune added at request time.']; + usort($rows, static fn (array $one, array $other) => $one['message'] <=> $other['message']); - $fortune->execute(); + $html = ''; - $arr = $fortune->fetchAll(); - $arr[0] = 'Additional fortune added at request time.'; - asort($arr); + foreach ($rows as $row) { + $message = htmlspecialchars($row['message'], ENT_QUOTES, 'UTF-8'); - $html = ''; - foreach ($arr as $id => $message) { - $message = htmlspecialchars($message, ENT_QUOTES, 'UTF-8'); - $html .= "$id$message"; - } + $html .= "${row['id']}${message}"; + } + + return "Fortunes$html
idmessage
"; + }; - return new Response(200, [ - 'Content-Type' => 'text/html; charset=UTF-8', - ], "Fortunes$html
idmessage
" + return $fortune()->then( + static fn (QueryResult $result): ResponseInterface => Response::html($formatResult($result->resultRows)), ); } @@ -138,4 +151,4 @@ function fortune() phpinfo(); return new Response(200, ['Content-Type' => 'text/plain'], ob_get_clean()); } - */ \ No newline at end of file + */ diff --git a/frameworks/PHP/reactphp/composer.json b/frameworks/PHP/reactphp/composer.json index fdea490c2d2..c03159aaa54 100644 --- a/frameworks/PHP/reactphp/composer.json +++ b/frameworks/PHP/reactphp/composer.json @@ -1,9 +1,10 @@ { "require": { - "php": ">=5.3.0", + "php": ">=8.3.0", "psr/http-message": "^1.0", - "react/event-loop": "^1.2", - "react/http": "^1.6", - "react/socket": "^1.11" + "react/event-loop": "^1.5", + "react/http": "^1.9", + "react/socket": "^1.14", + "react/mysql": "^0.6" } } diff --git a/frameworks/PHP/reactphp/reactphp.dockerfile b/frameworks/PHP/reactphp/reactphp.dockerfile index eb5a070ba1c..05f9d138a16 100644 --- a/frameworks/PHP/reactphp/reactphp.dockerfile +++ b/frameworks/PHP/reactphp/reactphp.dockerfile @@ -6,25 +6,26 @@ RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /de RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php RUN apt-get update -yqq > /dev/null && \ apt-get install -yqq git unzip wget curl build-essential \ - php8.2-cli php8.2-mbstring php8.2-dev php8.2-xml php8.2-curl php8.2-mysql > /dev/null + php8.3-cli php8.3-mbstring php8.3-dev php8.3-xml > /dev/null # An extension is required! # We deal with concurrencies over 1k, which stream_select doesn't support. -RUN wget http://pear.php.net/go-pear.phar --quiet && php go-pear.phar -#RUN apt-get install -y libuv1-dev > /dev/null -RUN apt-get install -y libevent-dev > /dev/null -#RUN pecl install uv-0.2.4 > /dev/null && echo "extension=uv.so" > /etc/php/8.2/cli/conf.d/uv.ini -RUN pecl install event-3.0.8 > /dev/null && echo "extension=event.so" > /etc/php/8.2/cli/conf.d/event.ini +RUN apt-get install -yqq libuv1-dev > /dev/null \ + && pecl install uv-beta > /dev/null \ + && echo "extension=uv.so" > /etc/php/8.3/cli/conf.d/uv.ini -ADD ./ /reactphp -WORKDIR /reactphp +COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.2/cli/conf.d/ +COPY deploy/conf/* /etc/php/8.3/cli/conf.d/ -COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer +WORKDIR /reactphp +COPY composer.json . RUN composer install --prefer-dist --optimize-autoloader --no-dev --quiet +COPY . . + EXPOSE 8080 -CMD php server.php +ENTRYPOINT ["/usr/bin/php"] +CMD ["server.php"] diff --git a/frameworks/PHP/reactphp/server.php b/frameworks/PHP/reactphp/server.php index 107ee1b78bd..ddfb5a07145 100644 --- a/frameworks/PHP/reactphp/server.php +++ b/frameworks/PHP/reactphp/server.php @@ -1,20 +1,27 @@ listen($socket); -$loop = React\EventLoop\Loop::get(); +echo "React Server running at http://0.0.0.0:8080\n"; +echo "EventLoop: ", Loop::get()::class, "\n"; -$server = new React\Http\Server($loop, function (Psr\Http\Message\ServerRequestInterface $request) { - return router($request); -}); +$interrupt = static function () use ($server, $socket, &$interrupt): void { + echo 'Interrupting server', PHP_EOL; -$socket = new React\Socket\Server('0.0.0.0:8080', $loop); -$server->listen($socket); + $socket->close(); -echo "React Server running at http://0.0.0.0:8080\n"; -echo "EventLoop: ", $loop::class, "\n"; + Loop::removeSignal(SIGINT, $interrupt); + Loop::removeSignal(SIGTERM, $interrupt); +}; -$loop->run(); +Loop::addSignal(SIGINT, $interrupt); +Loop::addSignal(SIGTERM, $interrupt); From 9c3d29ebb8879bf68382f16f3bc7b911992cdced Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Dec 2023 10:05:16 -0800 Subject: [PATCH 055/210] Bump ch.qos.logback:logback-classic in /frameworks/Kotlin/ktor/ktor (#8625) Bumps [ch.qos.logback:logback-classic](https://github.com/qos-ch/logback) from 1.2.4 to 1.2.13. - [Commits](https://github.com/qos-ch/logback/compare/v_1.2.4...v_1.2.13) --- updated-dependencies: - dependency-name: ch.qos.logback:logback-classic dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Kotlin/ktor/ktor/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Kotlin/ktor/ktor/pom.xml b/frameworks/Kotlin/ktor/ktor/pom.xml index 07db44a67ed..3e08b86f18c 100644 --- a/frameworks/Kotlin/ktor/ktor/pom.xml +++ b/frameworks/Kotlin/ktor/ktor/pom.xml @@ -18,7 +18,7 @@ 0.7.3 UTF-8 5.0.0 - 1.2.4 + 1.2.13 8.0.28 42.4.3
From 6e83f2a9c82ec412429aa37b8b2bd43e49e38a23 Mon Sep 17 00:00:00 2001 From: Aayush Kapoor Date: Mon, 11 Dec 2023 23:35:51 +0530 Subject: [PATCH 056/210] [Hono] New JavaScript Node.js Framework Hono (#8610) * Add new framework hono * Fix content type plain text header --- frameworks/JavaScript/hono/README.md | 50 ++++++++ .../JavaScript/hono/benchmark_config.json | 47 ++++++++ .../JavaScript/hono/hono-postgres.dockerfile | 12 ++ frameworks/JavaScript/hono/hono.dockerfile | 11 ++ frameworks/JavaScript/hono/package-lock.json | 46 ++++++++ frameworks/JavaScript/hono/package.json | 17 +++ frameworks/JavaScript/hono/src/clustered.js | 23 ++++ .../JavaScript/hono/src/database/postgres.js | 25 ++++ frameworks/JavaScript/hono/src/server.js | 108 ++++++++++++++++++ frameworks/JavaScript/hono/src/utils.js | 81 +++++++++++++ 10 files changed, 420 insertions(+) create mode 100644 frameworks/JavaScript/hono/README.md create mode 100644 frameworks/JavaScript/hono/benchmark_config.json create mode 100644 frameworks/JavaScript/hono/hono-postgres.dockerfile create mode 100644 frameworks/JavaScript/hono/hono.dockerfile create mode 100644 frameworks/JavaScript/hono/package-lock.json create mode 100644 frameworks/JavaScript/hono/package.json create mode 100644 frameworks/JavaScript/hono/src/clustered.js create mode 100644 frameworks/JavaScript/hono/src/database/postgres.js create mode 100644 frameworks/JavaScript/hono/src/server.js create mode 100644 frameworks/JavaScript/hono/src/utils.js diff --git a/frameworks/JavaScript/hono/README.md b/frameworks/JavaScript/hono/README.md new file mode 100644 index 00000000000..34d9f271d37 --- /dev/null +++ b/frameworks/JavaScript/hono/README.md @@ -0,0 +1,50 @@ +# Hono Benchmarking Test + +Hono - [炎] means flame🔥 in Japanese - is a small, simple, and ultrafast web framework for the Edges. It works on any JavaScript runtime: Cloudflare Workers, Fastly Compute, Deno, Bun, Vercel, Lagon, AWS Lambda, Lambda@Edge, and Node.js. https://github.com/honojs/hono + +## Important Libraries + +The tests were run with: + +- [Hono](https://github.com/honojs/hono) +- [Postgres.js](https://github.com/porsager/postgres/) + +## Database + +There are individual handlers for each DB approach. The logic for each of them are found here: + +- [PostgreSQL](database/postgres.js) + +There are **no database endpoints** or drivers attached by default. + +To initialize the application with one of these, run any _one_ of the following commands: + +```sh +$ DATABASE=postgres npm start +``` + +## Test Endpoints + +> Visit the test requirements [here](https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview) + +```sh +$ curl localhost:8080/json +$ curl localhost:8080/plaintext + +# The following are only available with the DATABASE env var + +$ curl localhost:8080/db +$ curl localhost:8080/fortunes + +$ curl localhost:8080/updates?queries= +$ curl localhost:8080/updates?queries=2 +$ curl localhost:8080/updates?queries=1000 +$ curl localhost:8080/updates?queries=foo +$ curl localhost:8080/updates?queries=0 + +$ curl localhost:8080/queries?queries= +$ curl localhost:8080/queries?queries=2 +$ curl localhost:8080/queries?queries=1000 +$ curl localhost:8080/queries?queries=foo +$ curl localhost:8080/queries?queries=0 +``` diff --git a/frameworks/JavaScript/hono/benchmark_config.json b/frameworks/JavaScript/hono/benchmark_config.json new file mode 100644 index 00000000000..116064254e5 --- /dev/null +++ b/frameworks/JavaScript/hono/benchmark_config.json @@ -0,0 +1,47 @@ +{ + "framework": "hono", + "tests": [ + { + "default": { + "approach": "Realistic", + "classification": "Micro", + "database": "None", + "database_os": "Linux", + "display_name": "Hono", + "flavor": "NodeJS", + "framework": "Hono", + "json_url": "/json", + "language": "JavaScript", + "notes": "", + "orm": "Raw", + "os": "Linux", + "plaintext_url": "/plaintext", + "platform": "nodejs", + "port": 8080, + "versus": "nodejs", + "webserver": "None" + }, + "postgres": { + "approach": "Realistic", + "classification": "Platform", + "database": "Postgres", + "database_os": "Linux", + "db_url": "/db", + "display_name": "Hono", + "flavor": "NodeJS", + "fortune_url": "/fortunes", + "framework": "Hono", + "language": "JavaScript", + "notes": "", + "orm": "Raw", + "os": "Linux", + "platform": "None", + "port": 8080, + "query_url": "/queries?queries=", + "update_url": "/updates?queries=", + "versus": "nodejs", + "webserver": "None" + } + } + ] +} diff --git a/frameworks/JavaScript/hono/hono-postgres.dockerfile b/frameworks/JavaScript/hono/hono-postgres.dockerfile new file mode 100644 index 00000000000..ba7d0eee5f6 --- /dev/null +++ b/frameworks/JavaScript/hono/hono-postgres.dockerfile @@ -0,0 +1,12 @@ +FROM node:20-slim + +COPY ./ ./ + +RUN npm install + +ENV NODE_ENV production +ENV DATABASE postgres + +EXPOSE 8080 + +CMD ["npm", "start"] diff --git a/frameworks/JavaScript/hono/hono.dockerfile b/frameworks/JavaScript/hono/hono.dockerfile new file mode 100644 index 00000000000..4262ad19953 --- /dev/null +++ b/frameworks/JavaScript/hono/hono.dockerfile @@ -0,0 +1,11 @@ +FROM node:20-slim + +COPY ./ ./ + +RUN npm install + +ENV NODE_ENV production + +EXPOSE 8080 + +CMD ["npm", "start"] diff --git a/frameworks/JavaScript/hono/package-lock.json b/frameworks/JavaScript/hono/package-lock.json new file mode 100644 index 00000000000..880318c08bf --- /dev/null +++ b/frameworks/JavaScript/hono/package-lock.json @@ -0,0 +1,46 @@ +{ + "name": "hono", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "hono", + "version": "0.0.1", + "license": "MIT", + "dependencies": { + "@hono/node-server": "^1.3.1", + "hono": "^3.10.4", + "postgres": "^3.4.3" + } + }, + "node_modules/@hono/node-server": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.3.1.tgz", + "integrity": "sha512-eQBCDbH1Vv/TiYXNP8aGfJTuXi9xGhEd/EZg9u6dhr7zC5/WKKztcBmbrOTtixVBvvV6bfcay6KEginwiqHyXg==", + "engines": { + "node": ">=18.14.1" + } + }, + "node_modules/hono": { + "version": "3.10.4", + "resolved": "https://registry.npmjs.org/hono/-/hono-3.10.4.tgz", + "integrity": "sha512-2LJd+a3qyvSuyFlyJSRN1CeH5wg6/Rjua/5L5gdT1W+4U7EUZtnHph74klbyysGg69sfZNXsIrR7PJWSjf2Vww==", + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/postgres": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/postgres/-/postgres-3.4.3.tgz", + "integrity": "sha512-iHJn4+M9vbTdHSdDzNkC0crHq+1CUdFhx+YqCE+SqWxPjm+Zu63jq7yZborOBF64c8pc58O5uMudyL1FQcHacA==", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "individual", + "url": "https://github.com/sponsors/porsager" + } + } + } +} diff --git a/frameworks/JavaScript/hono/package.json b/frameworks/JavaScript/hono/package.json new file mode 100644 index 00000000000..9689d3e7d41 --- /dev/null +++ b/frameworks/JavaScript/hono/package.json @@ -0,0 +1,17 @@ +{ + "dependencies": { + "@hono/node-server": "^1.3.1", + "hono": "^3.10.4", + "postgres": "^3.4.3" + }, + "license": "MIT", + "main": "src/server.js", + "name": "hono", + "private": true, + "scripts": { + "dev": "node src/server.js", + "start": "node src/clustered.js" + }, + "type": "module", + "version": "0.0.1" +} diff --git a/frameworks/JavaScript/hono/src/clustered.js b/frameworks/JavaScript/hono/src/clustered.js new file mode 100644 index 00000000000..95a57ec77f3 --- /dev/null +++ b/frameworks/JavaScript/hono/src/clustered.js @@ -0,0 +1,23 @@ +import cluster from "node:cluster"; +import os from "node:os"; +import process from "node:process"; + +if (cluster.isPrimary) { + // Master Node + console.log(`Primary ${process.pid} is running`); + + // Fork workers + const numCPUs = os.availableParallelism(); + for (let i = 0; i < numCPUs; i++) { + cluster.fork(); + } + + cluster.on("exit", (worker) => { + console.log(`worker ${worker.process.pid} died`); + process.exit(1); + }); +} else { + // Cluster Node + await import("./server.js"); + console.log(`Worker ${process.pid} started`); +} diff --git a/frameworks/JavaScript/hono/src/database/postgres.js b/frameworks/JavaScript/hono/src/database/postgres.js new file mode 100644 index 00000000000..54ef83e4da9 --- /dev/null +++ b/frameworks/JavaScript/hono/src/database/postgres.js @@ -0,0 +1,25 @@ +import postgres from "postgres"; + +const sql = postgres({ + host: "tfb-database", + user: "benchmarkdbuser", + password: "benchmarkdbpass", + database: "hello_world", + max: 1, +}); + +export const fortunes = async () => await sql`SELECT id, message FROM fortune`; + +export const find = async (id) => + await sql`SELECT id, randomNumber FROM world WHERE id = ${id}`.then( + (arr) => arr[0] + ); + +export const bulkUpdate = async (worlds) => + await sql`UPDATE world SET randomNumber = (update_data.randomNumber)::int + FROM (VALUES ${sql( + worlds + .map((world) => [world.id, world.randomNumber]) + .sort((a, b) => (a[0] < b[0] ? -1 : 1)) + )}) AS update_data (id, randomNumber) + WHERE world.id = (update_data.id)::int`; diff --git a/frameworks/JavaScript/hono/src/server.js b/frameworks/JavaScript/hono/src/server.js new file mode 100644 index 00000000000..43364616d55 --- /dev/null +++ b/frameworks/JavaScript/hono/src/server.js @@ -0,0 +1,108 @@ +import { serve } from "@hono/node-server"; +import { Hono } from "hono"; +import { + addBenchmarkHeaders, + escape, + generateRandomNumber, + getQueriesCount, + handleError, + sortByMessage, +} from "./utils.js"; + +let db; +const { DATABASE } = process.env; +if (DATABASE) db = await import(`./database/${DATABASE}.js`); + +const app = new Hono(); + +app + .get("/plaintext", (c) => { + addBenchmarkHeaders(c); + return c.text("Hello, World!"); + }) + .get("/json", (c) => { + addBenchmarkHeaders(c); + return c.json({ message: "Hello, World!" }); + }); + +if (db) { + const extra = { id: 0, message: "Additional fortune added at request time." }; + + app + .get("/db", async (c) => { + const randomNumber = await db.find(generateRandomNumber()); + addBenchmarkHeaders(c); + return c.json(randomNumber); + }) + .get("/queries", async (c) => { + const queriesCount = getQueriesCount(c); + + const databaseJobs = new Array(queriesCount); + + for (let i = 0; i < queriesCount; i++) { + databaseJobs[i] = db.find(generateRandomNumber()); + } + + const worldObjects = await Promise.all(databaseJobs); + + addBenchmarkHeaders(c); + return c.json(worldObjects); + }) + .get("/fortunes", async (c) => { + const rows = [extra, ...(await db.fortunes())]; + + sortByMessage(rows); + + const n = rows.length; + + let html = "", + i = 0; + for (; i < n; i++) { + html += `${rows[i].id}${escape( + rows[i].message + )}`; + } + + addBenchmarkHeaders(c); + return c.html( + `Fortunes${html}
idmessage
` + ); + }) + .get("/updates", async (c) => { + const queriesCount = getQueriesCount(c); + + const databaseJobs = new Array(queriesCount); + + for (let i = 0; i < queriesCount; i++) { + databaseJobs[i] = db.find(generateRandomNumber()); + } + + const worldObjects = await Promise.all(databaseJobs); + + for (let i = 0; i < queriesCount; i++) { + worldObjects[i].randomNumber = generateRandomNumber(); + } + + await db.bulkUpdate(worldObjects); + + addBenchmarkHeaders(c); + return c.json(worldObjects); + }); +} + +app + .all("/*", (c) => { + addBenchmarkHeaders(c); + return c.text("Not Found", 404); + }) + .onError(handleError); + +const port = parseInt(process.env.PORT || "8080"); +const hostname = process.env.HOST || "0.0.0.0"; +serve({ fetch: app.fetch, hostname, port }, (info) => { + if (!info) { + console.error(`Couldn't bind to http://${hostname}:${port}!`); + process.exit(1); + } + console.log(`Successfully bound to http://${hostname}:${port}.`); +}); diff --git a/frameworks/JavaScript/hono/src/utils.js b/frameworks/JavaScript/hono/src/utils.js new file mode 100644 index 00000000000..7c17c12f1a6 --- /dev/null +++ b/frameworks/JavaScript/hono/src/utils.js @@ -0,0 +1,81 @@ +/** + * Add Benchmark HTTP response headers. + * + * Add HTTP response headers `Server` and `Date` which is required by the test suite. + * + * https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview + * + * @param {import('hono').Context} c + */ +export function addBenchmarkHeaders(c) { + c.header("Server", "Hono"); +} + +/** + * Handle error for response + * + * @param {Error} err + * @param {import('hono').Context} c + */ +export function handleError(err, c) { + console.error(err); + addBenchmarkHeaders(c); + c.text("Internal Server Error"); +} + +/** + * Get queries count + * + * @param {import('hono').Context} c + */ +export function getQueriesCount(c) { + return Math.min(parseInt(c.req.query("queries")) || 1, 500); +} + +/** + * Generate random number + * + */ +export function generateRandomNumber() { + return Math.ceil(Math.random() * 10000); +} + +/** + * Escape unsafe HTML Code + * + */ +const escapeHTMLRules = { + "&": "&", + "<": "<", + ">": ">", + '"': """, + "'": "'", + "/": "/", +}; + +const unsafeHTMLMatcher = /[&<>"'\/]/g; + +export function escape(text) { + if (unsafeHTMLMatcher.test(text) === false) return text; + return text.replace(unsafeHTMLMatcher, function (m) { + return escapeHTMLRules[m] || m; + }); +} + +/** + * Using Sort method which is performant for the test scenario + * @returns + */ +export function sortByMessage(arr) { + const n = arr.length; + for (let i = 1; i < n; i++) { + const c = arr[i]; + let j = i - 1; + while (j > -1 && c.message < arr[j].message) { + arr[j + 1] = arr[j]; + j--; + } + arr[j + 1] = c; + } + return arr; +} From 94b85856e6d91441158d16dc3b255f85eeb6077b Mon Sep 17 00:00:00 2001 From: Jacob Rothstein Date: Thu, 14 Dec 2023 08:55:28 -0800 Subject: [PATCH 057/210] [trillium-rs] Update trillium framework benchmark (#8608) * update trillium framework benchmark * add jemallocator feature * Add jbr to maintainers * update dependencies --- frameworks/Rust/trillium/Cargo.lock | 2218 +++++++++++------ frameworks/Rust/trillium/Cargo.toml | 26 +- frameworks/Rust/trillium/README.md | 4 + .../Rust/trillium/benchmark_config.json | 3 + frameworks/Rust/trillium/src/application.rs | 8 +- frameworks/Rust/trillium/src/db.rs | 25 +- .../Rust/trillium/src/db/cached_world.rs | 24 + frameworks/Rust/trillium/src/db/fortune.rs | 15 +- frameworks/Rust/trillium/src/main.rs | 18 +- frameworks/Rust/trillium/src/routes.rs | 5 +- .../trillium/src/routes/cached_queries.rs | 80 + frameworks/Rust/trillium/src/routes/db.rs | 19 +- .../Rust/trillium/src/routes/fortune.rs | 22 +- frameworks/Rust/trillium/src/routes/json.rs | 9 +- .../Rust/trillium/src/routes/queries.rs | 37 +- .../Rust/trillium/src/routes/updates.rs | 42 +- .../Rust/trillium/templates/fortunes.html | 4 +- frameworks/Rust/trillium/trillium.dockerfile | 4 +- 18 files changed, 1695 insertions(+), 868 deletions(-) create mode 100644 frameworks/Rust/trillium/src/db/cached_world.rs create mode 100644 frameworks/Rust/trillium/src/routes/cached_queries.rs diff --git a/frameworks/Rust/trillium/Cargo.lock b/frameworks/Rust/trillium/Cargo.lock index 2fd41a8cf94..86433bda069 100644 --- a/frameworks/Rust/trillium/Cargo.lock +++ b/frameworks/Rust/trillium/Cargo.lock @@ -3,20 +3,40 @@ version = 3 [[package]] -name = "Inflector" -version = "0.11.4" +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.7.6" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" dependencies = [ + "cfg-if", "getrandom", "once_cell", "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +dependencies = [ + "memchr", ] [[package]] @@ -26,10 +46,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" [[package]] -name = "arrayvec" -version = "0.5.2" +name = "allocator-api2" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" +checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" [[package]] name = "askama" @@ -50,7 +70,7 @@ checksum = "87bf87e6e8b47264efa9bde63d6225c6276a52e05e91bf37eaa8afd0032d6b71" dependencies = [ "askama_shared", "proc-macro2", - "syn", + "syn 1.0.109", ] [[package]] @@ -75,138 +95,152 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn", + "syn 1.0.109", "toml", ] [[package]] name = "async-channel" -version = "1.6.1" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2114d64672151c0c5eaa5e131ec84a74f06e1e559830dabba01ca30605d66319" +checksum = "1ca33f4bc4ed1babef42cad36cc1f51fa88be00420404e5b1e80ab1b18f7678c" dependencies = [ "concurrent-queue", - "event-listener", + "event-listener 4.0.0", + "event-listener-strategy", "futures-core", + "pin-project-lite", ] [[package]] name = "async-executor" -version = "1.4.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "871f9bb5e0a22eeb7e8cf16641feb87c9dc67032ccf8ff49e772eb9941d3a965" +checksum = "17ae5ebefcc48e7452b4987947920dac9450be1110cadf34d1b8c116bdbaf97c" dependencies = [ + "async-lock 3.2.0", "async-task", "concurrent-queue", - "fastrand", - "futures-lite", - "once_cell", + "fastrand 2.0.1", + "futures-lite 2.1.0", "slab", ] [[package]] name = "async-global-executor" -version = "2.0.2" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9586ec52317f36de58453159d48351bc244bc24ced3effc1fce22f3d48664af6" +checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" dependencies = [ - "async-channel", + "async-channel 2.1.1", "async-executor", - "async-io", - "async-mutex", + "async-io 2.2.2", + "async-lock 3.2.0", "blocking", - "futures-lite", - "num_cpus", + "futures-lite 2.1.0", "once_cell", ] [[package]] name = "async-io" -version = "1.6.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a811e6a479f2439f0c04038796b5cfb3d2ad56c230e0f2d3f7b04d68cfee607b" +checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" dependencies = [ + "async-lock 2.8.0", + "autocfg", + "cfg-if", "concurrent-queue", - "futures-lite", - "libc", + "futures-lite 1.13.0", "log", - "once_cell", "parking", - "polling", + "polling 2.8.0", + "rustix 0.37.27", "slab", - "socket2", + "socket2 0.4.10", "waker-fn", - "winapi", ] [[package]] -name = "async-lock" -version = "2.4.0" +name = "async-io" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6a8ea61bf9947a1007c5cada31e647dbc77b103c679858150003ba697ea798b" +checksum = "6afaa937395a620e33dc6a742c593c01aced20aa376ffb0f628121198578ccc7" dependencies = [ - "event-listener", + "async-lock 3.2.0", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite 2.1.0", + "parking", + "polling 3.3.1", + "rustix 0.38.28", + "slab", + "tracing", + "windows-sys 0.52.0", ] [[package]] -name = "async-mutex" -version = "1.4.0" +name = "async-lock" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479db852db25d9dbf6204e6cb6253698f175c15726470f78af0d918e99d6156e" +checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" dependencies = [ - "event-listener", + "event-listener 2.5.3", ] [[package]] -name = "async-native-tls" -version = "0.3.3" +name = "async-lock" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e9e7a929bd34c68a82d58a4de7f86fffdaf97fb2af850162a7bb19dd7269b33" +checksum = "7125e42787d53db9dd54261812ef17e937c95a51e4d291373b670342fa44310c" dependencies = [ - "async-std", - "native-tls", - "thiserror", - "url", + "event-listener 4.0.0", + "event-listener-strategy", + "pin-project-lite", ] [[package]] -name = "async-process" -version = "1.3.0" +name = "async-net" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83137067e3a2a6a06d67168e49e68a0957d215410473a740cea95a2425c0b7c6" +checksum = "0434b1ed18ce1cf5769b8ac540e33f01fa9471058b5e89da9e06f3c882a8c12f" dependencies = [ - "async-io", + "async-io 1.13.0", "blocking", - "cfg-if", - "event-listener", - "futures-lite", - "libc", - "once_cell", - "signal-hook", - "winapi", + "futures-lite 1.13.0", ] [[package]] name = "async-std" -version = "1.10.0" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8056f1455169ab86dd47b47391e4ab0cbd25410a70e9fe675544f49bafaf952" +checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" dependencies = [ - "async-channel", + "async-channel 1.9.0", "async-global-executor", - "async-io", - "async-lock", - "async-process", + "async-io 1.13.0", + "async-lock 2.8.0", "crossbeam-utils", "futures-channel", "futures-core", "futures-io", - "futures-lite", + "futures-lite 1.13.0", "gloo-timers", "kv-log-macro", "log", "memchr", - "num_cpus", "once_cell", "pin-project-lite", "pin-utils", @@ -216,92 +250,100 @@ dependencies = [ [[package]] name = "async-stream" -version = "0.3.2" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "171374e7e3b2504e0e5236e3b59260560f9fe94bfe9ac39ba5e4e929c5590625" +checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51" dependencies = [ "async-stream-impl", "futures-core", + "pin-project-lite", ] [[package]] name = "async-stream-impl" -version = "0.3.2" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "648ed8c8d2ce5409ccd57453d9d1b214b342a0d69376a6feda1fd6cae3299308" +checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.41", ] [[package]] name = "async-task" -version = "4.0.3" +version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91831deabf0d6d7ec49552e489aed63b7456a7a3c46cff62adad428110b0af0" +checksum = "b4eb2cdb97421e01129ccb49169d8279ed21e829929144f4a22a6e54ac549ca1" [[package]] name = "async-trait" -version = "0.1.52" +version = "0.1.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "061a7acccaa286c011ddc30970520b98fa40e00c9d644633fb26b5fc63a265e3" +checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.41", ] +[[package]] +name = "async_cell" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "834eee9ce518130a3b4d5af09ecc43e9d6b57ee76613f227a1ddd6b77c7a62bc" + [[package]] name = "atoi" -version = "0.4.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616896e05fc0e2649463a93a15183c6a16bf03413a7af88ef1285ddedfa9cda5" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" dependencies = [ "num-traits", ] [[package]] name = "atomic-waker" -version = "1.0.0" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "065374052e7df7ee4047b1160cca5e1467a12351a40b3da123c870ba0b8eda2a" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] -name = "atty" -version = "0.2.14" +name = "atomic-write-file" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +checksum = "edcdbedc2236483ab103a53415653d6b4442ea6141baf1ffa85df29635e88436" dependencies = [ - "hermit-abi", - "libc", - "winapi", + "nix", + "rand", ] [[package]] name = "autocfg" -version = "1.0.1" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] -name = "bae" -version = "0.1.7" +name = "backtrace" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b8de67cc41132507eeece2584804efcb15f85ba516e34c944b7667f480397a" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" dependencies = [ - "heck", - "proc-macro-error", - "proc-macro2", - "quote", - "syn", + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", ] [[package]] name = "base64" -version = "0.13.0" +version = "0.21.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" +checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" [[package]] name = "bitflags" @@ -317,102 +359,123 @@ checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" [[package]] name = "block-buffer" -version = "0.9.0" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ "generic-array", ] [[package]] name = "blocking" -version = "1.1.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046e47d4b2d391b1f6f8b407b1deb8dee56c1852ccd868becf2710f601b5f427" +checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" dependencies = [ - "async-channel", + "async-channel 2.1.1", + "async-lock 3.2.0", "async-task", - "atomic-waker", - "fastrand", - "futures-lite", - "once_cell", + "fastrand 2.0.1", + "futures-io", + "futures-lite 2.1.0", + "piper", + "tracing", ] [[package]] name = "bumpalo" -version = "3.12.0" +version = "3.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" + +[[package]] +name = "bytecount" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" +checksum = "e1e5f035d16fc623ae5f74981db80a439803888314e3a555fd6f04acd51a3205" [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.1.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] -name = "cache-padded" -version = "1.1.1" +name = "camino" +version = "1.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "631ae5198c9be5e753e5cc215e1bd73c2b466a3565173db433f52bb9d3e66dba" +checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c" +dependencies = [ + "serde", +] [[package]] -name = "cc" -version = "1.0.72" +name = "cargo-platform" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee" +checksum = "e34637b3140142bdf929fb439e8aa4ebad7651ebf7b1080b3930aa16ac1459ff" +dependencies = [ + "serde", +] [[package]] -name = "cfg-if" -version = "1.0.0" +name = "cargo_metadata" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", +] [[package]] -name = "chrono" -version = "0.4.19" +name = "cc" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" dependencies = [ "libc", - "num-integer", - "num-traits", - "serde", - "time", - "winapi", ] +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + [[package]] name = "colored" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3616f750b84d8f0de8a58bda93e08e2a81ad3f523089b05f1dffecab48c6cbd" +checksum = "cbf2150cce219b664a8a70df7a1f933836724b503f8a413af9365b4dcc4d90b8" dependencies = [ - "atty", "lazy_static", - "winapi", + "windows-sys 0.48.0", ] [[package]] name = "concurrent-queue" -version = "1.2.2" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ed07550be01594c6026cff2a1d7fe9c8f683caa798e12b68694ac9e88286a3" +checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" dependencies = [ - "cache-padded", + "crossbeam-utils", ] [[package]] name = "core-foundation" -version = "0.9.2" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6888e10551bb93e424d8df1d07f1a8b4fceb0001a3a4b048bfc47554946f47b3" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -420,49 +483,61 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.3" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "cpufeatures" -version = "0.2.1" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95059428f66df56b63431fdb4e1947ed2190586af5c5a8a8b71122bdf5a7f469" +checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" dependencies = [ "libc", ] [[package]] name = "crc" -version = "2.1.0" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49fc9a695bca7f35f5f4c15cddc84415f66a74ea78eef08e90c5024f2b540e23" +checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe" dependencies = [ "crc-catalog", ] [[package]] name = "crc-catalog" -version = "1.1.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccaeedb56da03b09f598226e25e80088cb4cd25f316e6e4df7d695f0feeb1403" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] name = "crossbeam-channel" -version = "0.5.1" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c3242926edf34aec4ac3a77108ad4854bffaa2e4ddc1824124ce59231302d5" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06ed27e177f16d65f0f0c22a213e17c696ace5dd64b14258b52f9417ccb52db4" +checksum = "2d2fe95351b870527a5d09bf563ed3c97c0cffb87cf1c78a591bf48bb218d9aa" dependencies = [ + "autocfg", "cfg-if", "crossbeam-utils", + "memoffset", ] [[package]] name = "crossbeam-queue" -version = "0.3.2" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b10ddc024425c88c2ad148c1b0fd53f4c6d38db9697c9f1588381212fa657c9" +checksum = "b9bcf5bdbfdd6030fb4a1c497b5d5fc5921aa2f60d359a17e249c0e6df3de153" dependencies = [ "cfg-if", "crossbeam-utils", @@ -470,99 +545,186 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.8" +version = "0.8.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf124c720b7686e3c2663cf54062ab0f68a88af2fb6a030e87e30bf721fcb38" +checksum = "c06d96137f14f244c37f989d9fff8f95e6c18b918e71f36638f8c49112e4c78f" dependencies = [ "cfg-if", - "lazy_static", ] [[package]] -name = "crypto-mac" -version = "0.11.1" +name = "crypto-common" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" dependencies = [ "generic-array", - "subtle", + "typenum", +] + +[[package]] +name = "deranged" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eb30d70a07a3b04884d2677f06bec33509dc67ca60d92949e5535352d3191dc" +dependencies = [ + "powerfmt", ] [[package]] -name = "ctor" -version = "0.1.21" +name = "derivative" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccc0a48a9b826acdf4028595adc9db92caea352f7af011a3034acd172a52a0aa" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ + "proc-macro2", "quote", - "syn", + "syn 1.0.109", ] [[package]] name = "digest" -version = "0.9.0" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "generic-array", + "block-buffer", + "crypto-common", + "subtle", ] [[package]] -name = "dirs" -version = "3.0.2" +name = "dotenvy" +version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30baa043103c9d0c2a57cf537cc2f35623889dc0d405e6c3cccfadbc81c71309" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + +[[package]] +name = "either" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" dependencies = [ - "dirs-sys", + "serde", ] [[package]] -name = "dirs-sys" -version = "0.3.6" +name = "encoding_rs" +version = "0.8.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03d86534ed367a67548dc68113a0f5db55432fdfbb6e6f9d77704397d95d5780" +checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" dependencies = [ - "libc", - "redox_users", - "winapi", + "cfg-if", ] [[package]] -name = "dotenv" -version = "0.15.0" +name = "env_logger" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" +checksum = "95b3f3e67048839cb0d0781f445682a35113da7121f7c949db0e2be96a4fbece" +dependencies = [ + "humantime", + "is-terminal", + "log", + "regex", + "termcolor", +] [[package]] -name = "either" -version = "1.6.1" +name = "equivalent" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] -name = "encoding_rs" -version = "0.8.30" +name = "errno" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "error-chain" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d2f06b9cac1506ece98fe3231e3cc9c4410ec3d5b1f24ae1c8946f0742cdefc" +dependencies = [ + "version_check", +] + +[[package]] +name = "etcetera" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7896dc8abb250ffdda33912550faa54c88ec8b998dec0b2c55ab224921ce11df" +checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" dependencies = [ "cfg-if", + "home", + "windows-sys 0.48.0", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "event-listener" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d93877bcde0eb80ca09131a08d23f0a5c18a620b01db137dba666d18cd9b30c2" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", ] [[package]] name = "event-listener" -version = "2.5.1" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "770d968249b5d99410d61f5bf89057f3199a077a04d087092f58e7d10692baae" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7531096570974c3a9dcf9e4b8e1cede1ec26cf5046219fb3b9d897503b9be59" +checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" +dependencies = [ + "event-listener 4.0.0", + "pin-project-lite", +] [[package]] name = "fastrand" -version = "1.7.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" dependencies = [ "instant", ] +[[package]] +name = "fastrand" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" + +[[package]] +name = "finl_unicode" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" + [[package]] name = "fnv" version = "1.0.7" @@ -586,23 +748,21 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.0.1" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ - "matches", "percent-encoding", ] [[package]] name = "futures" -version = "0.3.18" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cd0210d8c325c245ff06fd95a3b13689a1a276ac8cfa8e8720cb840bfb84b9e" +checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" dependencies = [ "futures-channel", "futures-core", - "futures-executor", "futures-io", "futures-sink", "futures-task", @@ -611,9 +771,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.21" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010" +checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" dependencies = [ "futures-core", "futures-sink", @@ -621,26 +781,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3" - -[[package]] -name = "futures-executor" -version = "0.3.18" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b808bf53348a36cab739d7e04755909b9fcaaa69b7d7e588b37b6ec62704c97" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] +checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" [[package]] name = "futures-intrusive" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62007592ac46aa7c2b6416f7deb9a8a8f63a01e0f1d6e1787d5630170db2b63e" +checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" dependencies = [ "futures-core", "lock_api", @@ -649,17 +798,17 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.21" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b" +checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" [[package]] name = "futures-lite" -version = "1.12.0" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" dependencies = [ - "fastrand", + "fastrand 1.9.0", "futures-core", "futures-io", "memchr", @@ -668,34 +817,47 @@ dependencies = [ "waker-fn", ] +[[package]] +name = "futures-lite" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aeee267a1883f7ebef3700f262d2d54de95dfaf38189015a74fdc4e0c7ad8143" +dependencies = [ + "fastrand 2.0.1", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + [[package]] name = "futures-macro" -version = "0.3.21" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512" +checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.41", ] [[package]] name = "futures-sink" -version = "0.3.21" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868" +checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" [[package]] name = "futures-task" -version = "0.3.21" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a" +checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" [[package]] name = "futures-util" -version = "0.3.21" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a" +checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" dependencies = [ "futures-channel", "futures-core", @@ -711,9 +873,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.4" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501466ecc8a30d1d3b7fc9229b122b2ce8ed6e9d9223f1138d4babb253e51817" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", @@ -721,9 +883,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.3" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" +checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" dependencies = [ "cfg-if", "libc", @@ -731,23 +893,34 @@ dependencies = [ ] [[package]] -name = "gloo-timers" -version = "0.2.2" +name = "gimli" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f16c88aa13d2656ef20d1c042086b8767bbe2bdb62526894275a1b062161b2e" -dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", - "web-sys", +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "gloo-timers" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", ] [[package]] name = "h2" -version = "0.3.17" +version = "0.3.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66b91535aa35fea1523ad1b86cb6b53c28e0ae566ba4a460f4457e936cad7c6f" +checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178" dependencies = [ "bytes", "fnv", @@ -764,39 +937,37 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.11.2" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" dependencies = [ "ahash", + "allocator-api2", ] [[package]] name = "hashlink" -version = "0.7.0" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7249a3129cbc1ffccd74857f81464a323a152173cdb134e0fd81bc803b29facf" +checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" dependencies = [ "hashbrown", ] [[package]] name = "heck" -version = "0.3.3" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" dependencies = [ "unicode-segmentation", ] [[package]] name = "hermit-abi" -version = "0.1.19" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] +checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" [[package]] name = "hex" @@ -804,32 +975,49 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + [[package]] name = "hmac" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "crypto-mac", "digest", ] +[[package]] +name = "home" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" +dependencies = [ + "windows-sys 0.48.0", +] + [[package]] name = "http" -version = "0.2.5" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1323096b05d41827dadeaee54c9981958c0f94e670bc94ed80037d1a7b8b186b" +checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" dependencies = [ "bytes", "fnv", - "itoa 0.4.8", + "itoa", ] [[package]] name = "http-body" -version = "0.4.4" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", "http", @@ -838,15 +1026,15 @@ dependencies = [ [[package]] name = "httparse" -version = "1.5.1" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acd94fdbe1d4ff688b67b04eee2e17bd50995534a61539e45adfefb45e5e5503" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" [[package]] name = "httpdate" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "humansize" @@ -854,11 +1042,17 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "02296996cb8796d7c6e3bc2d9211b7802812d36999a51bb754123ead7d37d026" +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + [[package]] name = "hyper" -version = "0.14.16" +version = "0.14.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7ec3e62bdc98a2f0393a5048e4c30ef659440ea6e0e572965103e72bd836f55" +checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" dependencies = [ "bytes", "futures-channel", @@ -869,9 +1063,9 @@ dependencies = [ "http-body", "httparse", "httpdate", - "itoa 0.4.8", + "itoa", "pin-project-lite", - "socket2", + "socket2 0.4.10", "tokio", "tower-service", "tracing", @@ -893,25 +1087,35 @@ dependencies = [ [[package]] name = "idna" -version = "0.2.3" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ - "matches", "unicode-bidi", "unicode-normalization", ] [[package]] name = "indexmap" -version = "1.7.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ - "autocfg", + "equivalent", "hashbrown", ] +[[package]] +name = "inherent" +version = "1.0.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce243b1bfa62ffc028f1cc3b6034ec63d649f3031bc8a4fbbb004e1ac17d1f68" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "instant" version = "0.1.12" @@ -921,38 +1125,74 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys 0.48.0", +] + [[package]] name = "ipnet" -version = "2.3.1" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" + +[[package]] +name = "is-terminal" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f2d64f2edebec4ce84ad108148e67e1064789bee435edc5b60ad398714a3a9" +checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +dependencies = [ + "hermit-abi", + "rustix 0.38.28", + "windows-sys 0.48.0", +] [[package]] name = "itertools" -version = "0.10.3" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3" +checksum = "25db6b064527c5d482d0423354fcd07a89a2dfe07b67892e62411946db7f07b0" dependencies = [ "either", ] [[package]] name = "itoa" -version = "0.4.8" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] -name = "itoa" -version = "1.0.1" +name = "jemalloc-sys" +version = "0.5.4+5.3.0-patched" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac6c1946e1cea1788cbfde01c993b52a10e2da07f4bac608228d1bed20bfebf2" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "jemallocator" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" +checksum = "a0de374a9f8e63150e6f5e8a60cc14c668226d7a347d8aee1a45766e3c4dd3bc" +dependencies = [ + "jemalloc-sys", + "libc", +] [[package]] name = "js-sys" -version = "0.3.55" +version = "0.3.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cc9ffccd38c451a86bf13657df244e9c3f37493cce8e5e21e940963777acc84" +checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" dependencies = [ "wasm-bindgen", ] @@ -974,69 +1214,86 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.112" +version = "0.2.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" + +[[package]] +name = "linux-raw-sys" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + +[[package]] +name = "linux-raw-sys" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b03d17f364a3a042d5e5d46b053bbbf82c92c9430c592dd4c064dc6ee997125" +checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" [[package]] name = "lock_api" -version = "0.4.5" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" dependencies = [ + "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.14" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" dependencies = [ - "cfg-if", "value-bag", ] [[package]] -name = "matches" -version = "0.1.9" +name = "mach2" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" +checksum = "6d0d1830bcd151a6fc4aea1369af235b36c1528fe976b8ff678683c9995eade8" +dependencies = [ + "libc", +] [[package]] name = "md-5" -version = "0.9.1" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5a279bb9607f9f53c22d496eade00d138d1bdcccd07d74650387cf94942a15" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" dependencies = [ - "block-buffer", + "cfg-if", "digest", - "opaque-debug", ] [[package]] name = "memchr" -version = "2.4.1" +version = "2.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" [[package]] -name = "memmem" -version = "0.1.1" +name = "memoffset" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a64a92489e2744ce060c349162be1c5f33c6969234104dbd99ddb5feb08b8c15" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +dependencies = [ + "autocfg", +] [[package]] name = "mime" -version = "0.3.16" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "mime-db" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d7c816ec30c41f873e1eea969aa2261d78756629e468a427244ff8658b75e7d" +checksum = "1c7a61c4bc8a32ee5bf3e11804ec460e771ea496968a213fa187651569ee3418" dependencies = [ "reqwest", "serde", @@ -1059,33 +1316,55 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + [[package]] name = "mio" -version = "0.7.14" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8067b404fe97c70829f082dec8bcf4f71225d7eaea1d8645349cb76fa06205cc" +checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" dependencies = [ "libc", - "log", - "miow", - "ntapi", - "winapi", + "wasi", + "windows-sys 0.48.0", ] [[package]] -name = "miow" -version = "0.3.7" +name = "moka" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" +checksum = "d8017ec3548ffe7d4cef7ac0e12b044c01164a74c0f3119420faeaf13490ad8b" dependencies = [ - "winapi", + "async-lock 2.8.0", + "async-trait", + "crossbeam-channel", + "crossbeam-epoch", + "crossbeam-utils", + "futures-util", + "once_cell", + "parking_lot", + "quanta", + "rustc_version", + "skeptic", + "smallvec", + "tagptr", + "thiserror", + "triomphe", + "uuid", ] [[package]] name = "native-tls" -version = "0.2.8" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48ba9f7719b5a0f42f338907614285fb5fd70e53858141f69898a1fb7203b24d" +checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e" dependencies = [ "lazy_static", "libc", @@ -1100,82 +1379,64 @@ dependencies = [ ] [[package]] -name = "nom" -version = "7.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1d11e1ef389c76fe5b81bcaf2ea32cf88b62bc494e19f493d0b30e7a930109" -dependencies = [ - "memchr", - "minimal-lexical", - "version_check", -] - -[[package]] -name = "ntapi" -version = "0.3.6" +name = "nix" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" +checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" dependencies = [ - "winapi", + "bitflags 2.4.1", + "cfg-if", + "libc", ] [[package]] -name = "num-bigint" -version = "0.3.3" +name = "nom" +version = "7.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6f7833f2cbf2360a6cfd58cd41a53aa7a90bd4c202f5b1c7dd2ed73c57b2c3" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" dependencies = [ - "autocfg", - "num-integer", - "num-traits", + "memchr", + "minimal-lexical", ] [[package]] -name = "num-integer" -version = "0.1.44" +name = "num-traits" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" dependencies = [ "autocfg", - "num-traits", ] [[package]] -name = "num-traits" -version = "0.2.14" +name = "num_threads" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" dependencies = [ - "autocfg", + "libc", ] [[package]] -name = "num_cpus" -version = "1.13.0" +name = "object" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" +checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" dependencies = [ - "hermit-abi", - "libc", + "memchr", ] [[package]] name = "once_cell" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56" - -[[package]] -name = "opaque-debug" -version = "0.3.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "openssl" -version = "0.10.60" +version = "0.10.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79a4c6c3a2b158f7f8f2a2fc5a969fa3a068df6fc9dbb4a43845436e3af7c800" +checksum = "6b8419dc8cc6d866deb801274bba2e6f8f6108c1bb7fcc10ee5ab864931dbb45" dependencies = [ "bitflags 2.4.1", "cfg-if", @@ -1188,26 +1449,26 @@ dependencies = [ [[package]] name = "openssl-macros" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.41", ] [[package]] name = "openssl-probe" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28988d872ab76095a6e6ac88d99b54fd267702734fd7ffe610ca27f533ddb95a" +checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.96" +version = "0.9.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3812c071ba60da8b5677cc12bcb1d42989a65553772897a7e0355545a819838f" +checksum = "c3eaad34cdd97d81de97964fc7f29e2d104f483840d906ef56daa1912338460b" dependencies = [ "cc", "libc", @@ -1215,92 +1476,105 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "ordered-float" +version = "3.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1e1c390732d15f1d48471625cd92d154e66db2c56645e29a9cd26f4699f72dc" +dependencies = [ + "num-traits", +] + [[package]] name = "ouroboros" -version = "0.14.2" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71643f290d126e18ac2598876d01e1d57aed164afc78fdb6e2a0c6589a1f6662" +checksum = "e2ba07320d39dfea882faa70554b4bd342a5f273ed59ba7c1c6b4c840492c954" dependencies = [ "aliasable", "ouroboros_macro", - "stable_deref_trait", + "static_assertions", ] [[package]] name = "ouroboros_macro" -version = "0.14.2" +version = "0.17.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed9a247206016d424fe8497bc611e510887af5c261fbbf977877c4bb55ca4d82" +checksum = "ec4c6225c69b4ca778c0aea097321a64c421cf4577b331c61b229267edabb6f8" dependencies = [ - "Inflector", + "heck", "proc-macro-error", "proc-macro2", "quote", - "syn", + "syn 2.0.41", ] [[package]] name = "parking" -version = "2.0.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" +checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" [[package]] name = "parking_lot" -version = "0.11.2" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ - "instant", "lock_api", "parking_lot_core", ] [[package]] name = "parking_lot_core" -version = "0.8.5" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ "cfg-if", - "instant", "libc", "redox_syscall", "smallvec", - "winapi", + "windows-targets 0.48.5", ] +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + [[package]] name = "percent-encoding" -version = "2.1.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project" -version = "1.0.8" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "576bc800220cc65dac09e99e97b08b358cfab6e17078de8dc5fee223bd2d0c08" +checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.0.8" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e8fe8163d14ce7f0cdac2e040116f22eac817edabff0be91e8aff7e9accf389" +checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.41", ] [[package]] name = "pin-project-lite" -version = "0.2.7" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" [[package]] name = "pin-utils" @@ -1308,30 +1582,64 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "piper" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" +dependencies = [ + "atomic-waker", + "fastrand 2.0.1", + "futures-io", +] + [[package]] name = "pkg-config" -version = "0.3.24" +version = "0.3.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58893f751c9b0412871a09abd62ecd2a00298c6c83befa223ef98c52aef40cbe" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" [[package]] name = "polling" -version = "2.2.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "685404d509889fade3e86fe3a5803bca2ec09b0c0778d5ada6ec8bf7a8de5259" +checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" dependencies = [ + "autocfg", + "bitflags 1.3.2", "cfg-if", + "concurrent-queue", "libc", "log", - "wepoll-ffi", - "winapi", + "pin-project-lite", + "windows-sys 0.48.0", +] + +[[package]] +name = "polling" +version = "3.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf63fa624ab313c11656b4cda960bfc46c410187ad493c41f6ba2d8c1e991c9e" +dependencies = [ + "cfg-if", + "concurrent-queue", + "pin-project-lite", + "rustix 0.38.28", + "tracing", + "windows-sys 0.52.0", ] +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" -version = "0.2.15" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed0cfbc8191465bed66e1718596ee0b0b35d5ee1f41c5df2189d0fe8bde535ba" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "proc-macro-error" @@ -1342,7 +1650,7 @@ dependencies = [ "proc-macro-error-attr", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "version_check", ] @@ -1359,32 +1667,58 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.33" +version = "1.0.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "pulldown-cmark" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a1a2f1f0a7ecff9c31abbe177637be0e97a0aef46cf8738ece09327985d998" +dependencies = [ + "bitflags 1.3.2", + "memchr", + "unicase", +] + +[[package]] +name = "quanta" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb37d2df5df740e582f28f8560cf425f52bb267d872fe58358eadb554909f07a" +checksum = "a17e662a7a8291a865152364c20c7abc5e60486ab2001e8ec10b24862de0b9ab" dependencies = [ - "unicode-xid", + "crossbeam-utils", + "libc", + "mach2", + "once_cell", + "raw-cpuid", + "wasi", + "web-sys", + "winapi", ] [[package]] name = "quote" -version = "1.0.10" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38bc8cc6a5f2e3655e0899c1b848643b2562f853f114bfec7be120678e3ace05" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] [[package]] name = "rand" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", "rand_chacha", "rand_core", - "rand_hc", ] [[package]] @@ -1399,78 +1733,91 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ "getrandom", ] [[package]] -name = "rand_hc" -version = "0.3.1" +name = "raw-cpuid" +version = "10.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" +checksum = "6c297679cb867470fa8c9f67dbba74a78d78e3e98d7cf2b08d6d71540f797332" dependencies = [ - "rand_core", + "bitflags 1.3.2", ] [[package]] name = "redox_syscall" -version = "0.2.10" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ "bitflags 1.3.2", ] [[package]] -name = "redox_users" -version = "0.4.0" +name = "regex" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" dependencies = [ - "getrandom", - "redox_syscall", + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", ] [[package]] -name = "remove_dir_all" -version = "0.5.3" +name = "regex-automata" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" dependencies = [ - "winapi", + "aho-corasick", + "memchr", + "regex-syntax", ] +[[package]] +name = "regex-syntax" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" + [[package]] name = "reqwest" -version = "0.11.7" +version = "0.11.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bea77bc708afa10e59905c3d4af7c8fd43c9214251673095ff8b14345fcbc5" +checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" dependencies = [ "base64", "bytes", "encoding_rs", "futures-core", "futures-util", + "h2", "http", "http-body", "hyper", "hyper-tls", "ipnet", "js-sys", - "lazy_static", "log", "mime", "native-tls", + "once_cell", "percent-encoding", "pin-project-lite", "serde", "serde_json", "serde_urlencoded", + "system-configuration", "tokio", "tokio-native-tls", + "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", @@ -1480,153 +1827,170 @@ dependencies = [ [[package]] name = "rlimit" -version = "0.6.2" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc0bf25554376fd362f54332b8410a625c71f15445bca32ffdfdf4ec9ac91726" +checksum = "3560f70f30a0f16d11d01ed078a07740fe6b489667abc7c7b029155d9f21c3d8" dependencies = [ "libc", ] [[package]] name = "routefinder" -version = "0.5.1" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "480a056df7cdee2fd55df6dc10ce137c70b00cc65f20a16f796d2250ef8e0cd8" +checksum = "94f8f99b10dedd317514253dda1fa7c14e344aac96e1f78149a64879ce282aca" dependencies = [ "smartcow", "smartstring", ] [[package]] -name = "rust_decimal" -version = "1.18.0" +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "rustc_version" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71b5a9625a7e6060b23db692facf49082cc78889a7e6ac94a735356ae49db4b0" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "arrayvec", - "num-traits", - "serde", + "semver", ] [[package]] -name = "rustversion" -version = "1.0.6" +name = "rustix" +version = "0.37.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" +dependencies = [ + "bitflags 1.3.2", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys 0.3.8", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustix" +version = "0.38.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2cc38e8fa666e2de3c4aba7edeb5ffc5246c1c2ed0e3d17e560aeeba736b23f" +checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316" +dependencies = [ + "bitflags 2.4.1", + "errno", + "libc", + "linux-raw-sys 0.4.12", + "windows-sys 0.52.0", +] [[package]] name = "ryu" -version = "1.0.9" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f" +checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] [[package]] name = "schannel" -version = "0.1.19" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" dependencies = [ - "lazy_static", - "winapi", + "windows-sys 0.48.0", ] [[package]] name = "scopeguard" -version = "1.1.0" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "sea-bae" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" +checksum = "3bd3534a9978d0aa7edd2808dc1f8f31c4d0ecd31ddf71d997b3c98e9f3c9114" +dependencies = [ + "heck", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.41", +] [[package]] name = "sea-orm" -version = "0.6.0" +version = "0.12.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd24380b48dacd3ed1c3d467c7b17ffa5818555a2c04066f4a0a9e17d830abc9" +checksum = "c5181eedee8ad0d002d2a288600140fe9937581c4668426a4ff1295c14c736cf" dependencies = [ "async-stream", "async-trait", - "chrono", "futures", - "futures-util", - "once_cell", + "log", "ouroboros", - "rust_decimal", "sea-orm-macros", "sea-query", - "sea-strum", + "sea-query-binder", "serde", - "serde_json", "sqlx", + "strum", + "thiserror", "tracing", "url", - "uuid", ] [[package]] name = "sea-orm-macros" -version = "0.6.0" +version = "0.12.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c199fa8630b1e195d7aef24ce8944af8f4ced67c4eccffd8926453b59f2565a1" +checksum = "816183a751bf9c22087679b20b6142da0b5c6d8981835ebb7b99bf1bf924640a" dependencies = [ - "bae", "heck", "proc-macro2", "quote", - "syn", + "sea-bae", + "syn 2.0.41", + "unicode-ident", ] [[package]] name = "sea-query" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9088ff96158860a75d98a85a654fdd9d97b10515773af6d87339bfc48258c800" -dependencies = [ - "chrono", - "rust_decimal", - "sea-query-derive", - "serde_json", - "uuid", -] - -[[package]] -name = "sea-query-derive" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34cdc022b4f606353fe5dc85b09713a04e433323b70163e81513b141c6ae6eb5" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn", - "thiserror", -] - -[[package]] -name = "sea-strum" -version = "0.23.0" +version = "0.30.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "391d06a6007842cfe79ac6f7f53911b76dfd69fc9a6769f1cf6569d12ce20e1b" +checksum = "41558fa9bb5f4d73952dac0b9d9c2ce23966493fc9ee0008037b01d709838a68" dependencies = [ - "sea-strum_macros", + "derivative", + "inherent", + "ordered-float", ] [[package]] -name = "sea-strum_macros" -version = "0.23.0" +name = "sea-query-binder" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69b4397b825df6ccf1e98bcdabef3bbcfc47ff5853983467850eeab878384f21" +checksum = "36bbb68df92e820e4d5aeb17b4acd5cc8b5d18b2c36a4dd6f4626aabfa7ab1b9" dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn", + "sea-query", + "sqlx", ] [[package]] name = "security-framework" -version = "2.4.2" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "525bc1abfda2e1998d152c45cf13e696f76d0a4972310b22fac1658b05df7c87" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" dependencies = [ "bitflags 1.3.2", "core-foundation", @@ -1637,89 +2001,93 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.4.2" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9dd14d83160b528b7bfd66439110573efcfbe281b17fc2ca9f39f550d619c7e" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" dependencies = [ "core-foundation-sys", "libc", ] +[[package]] +name = "semver" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" +dependencies = [ + "serde", +] + [[package]] name = "serde" -version = "1.0.136" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce31e24b01e1e524df96f1c2fdd054405f8d7376249a5110886fb4b658484789" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.136" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08597e7152fcd306f41838ed3e37be9eaeed2b61c42e2117266a554fab4662f9" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.41", ] [[package]] name = "serde_json" -version = "1.0.79" +version = "1.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e8d9fa5c3b304765ce1fd9c4c8a3de2c8db365a5b91be52f186efc675681d95" +checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" dependencies = [ - "indexmap", - "itoa 1.0.1", + "itoa", "ryu", "serde", ] [[package]] name = "serde_urlencoded" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edfa57a7f8d9c1d260a549e7224100f6c43d43f9103e06dd8b4095a9b2b43ce9" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa 0.4.8", + "itoa", "ryu", "serde", ] [[package]] -name = "sha-1" -version = "0.9.8" +name = "sha1" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ - "block-buffer", "cfg-if", "cpufeatures", "digest", - "opaque-debug", ] [[package]] name = "sha2" -version = "0.9.8" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b69f9a4c9740d74c5baa3fd2e547f9525fa8088a8a958e0ca2409a514e33f5fa" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ - "block-buffer", "cfg-if", "cpufeatures", "digest", - "opaque-debug", ] [[package]] name = "signal-hook" -version = "0.3.12" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c35dfd12afb7828318348b8c408383cf5071a086c1d4ab1c0f9840ec92dbb922" +checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" dependencies = [ "libc", "signal-hook-registry", @@ -1727,79 +2095,106 @@ dependencies = [ [[package]] name = "signal-hook-async-std" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90526e74631c69a79b38212e3d4fda4b00de9d6be56b3cead133bf67ad371af1" +checksum = "0c4aa94397e2023af5b7cff5b8d4785e935cfb77f0e4aab0cae3b26258ace556" dependencies = [ - "async-io", - "futures-lite", + "async-io 1.13.0", + "futures-lite 1.13.0", "libc", "signal-hook", ] [[package]] name = "signal-hook-registry" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" dependencies = [ "libc", ] [[package]] name = "size" -version = "0.1.2" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e5021178e8e70579d009fb545932e274ec2dde4c917791c6063d1002bee2a56" +checksum = "9fed904c7fb2856d868b92464fc8fa597fce366edea1a9cbfaa8cb5fe080bd6d" + +[[package]] +name = "skeptic" +version = "0.13.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16d23b015676c90a0f01c197bfdc786c20342c73a0afdda9025adb0bc42940a8" dependencies = [ - "num-traits", + "bytecount", + "cargo_metadata", + "error-chain", + "glob", + "pulldown-cmark", + "tempfile", + "walkdir", ] [[package]] name = "slab" -version = "0.4.5" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] [[package]] name = "smallvec" -version = "1.7.0" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309" +checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" [[package]] name = "smartcow" -version = "0.1.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05e3ed3ccf93c7425507e5e2261a3fc90d14267d491f360b9b679ae0a4ce693e" +checksum = "656fcb1c1fca8c4655372134ce87d8afdf5ec5949ebabe8d314be0141d8b5da2" dependencies = [ "smartstring", ] [[package]] name = "smartstring" -version = "0.2.9" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31aa6a31c0c2b21327ce875f7e8952322acfcfd0c27569a6e18a647281352c9b" +checksum = "3fb72c633efbaa2dd666986505016c32c3044395ceaf881518399d2f4127ee29" dependencies = [ + "autocfg", "static_assertions", + "version_check", ] [[package]] name = "socket2" -version = "0.4.2" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dc90fe6c7be1a323296982db1836d1ea9e47b6839496dde9a541bc496df3516" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" dependencies = [ "libc", "winapi", ] +[[package]] +name = "socket2" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +dependencies = [ + "libc", + "windows-sys 0.48.0", +] + [[package]] name = "sqlformat" -version = "0.1.8" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4b7922be017ee70900be125523f38bdd644f4f06a1b16e8fa5a8ee8c34bffd4" +checksum = "ce81b7bd7c4493975347ef60d8c7e8b742d4694f4c49f93e0a12ea263938176c" dependencies = [ "itertools", "nom", @@ -1808,103 +2203,133 @@ dependencies = [ [[package]] name = "sqlx" -version = "0.5.9" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7911b0031a0247af40095838002999c7a52fba29d9739e93326e71a5a1bc9d43" +checksum = "dba03c279da73694ef99763320dea58b51095dfe87d001b1d4b5fe78ba8763cf" dependencies = [ "sqlx-core", "sqlx-macros", + "sqlx-postgres", ] [[package]] name = "sqlx-core" -version = "0.5.9" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aec89bfaca8f7737439bad16d52b07f1ccd0730520d3bf6ae9d069fe4b641fb1" +checksum = "d84b0a3c3739e220d94b3239fd69fb1f74bc36e16643423bd99de3b43c21bfbd" dependencies = [ "ahash", + "async-io 1.13.0", + "async-std", "atoi", - "base64", - "bitflags 1.3.2", "byteorder", "bytes", - "chrono", "crc", - "crossbeam-channel", "crossbeam-queue", - "crossbeam-utils", - "dirs", + "dotenvy", "either", + "event-listener 2.5.3", "futures-channel", "futures-core", "futures-intrusive", + "futures-io", "futures-util", "hashlink", "hex", - "hmac", "indexmap", - "itoa 0.4.8", - "libc", "log", - "md-5", "memchr", - "num-bigint", + "native-tls", "once_cell", - "parking_lot", + "paste", "percent-encoding", - "rand", - "rust_decimal", "serde", "serde_json", - "sha-1", "sha2", "smallvec", "sqlformat", - "sqlx-rt", - "stringprep", "thiserror", + "tracing", "url", - "uuid", - "whoami", ] [[package]] name = "sqlx-macros" -version = "0.5.9" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89961c00dc4d7dffb7aee214964b065072bff69e36ddb9e2c107541f75e4f2a5" +dependencies = [ + "proc-macro2", + "quote", + "sqlx-core", + "sqlx-macros-core", + "syn 1.0.109", +] + +[[package]] +name = "sqlx-macros-core" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "584866c833511b1a152e87a7ee20dee2739746f60c858b3c5209150bc4b466f5" +checksum = "d0bd4519486723648186a08785143599760f7cc81c52334a55d6a83ea1e20841" dependencies = [ - "dotenv", + "async-std", + "atomic-write-file", + "dotenvy", "either", "heck", + "hex", "once_cell", "proc-macro2", "quote", + "serde", "serde_json", "sha2", "sqlx-core", - "sqlx-rt", - "syn", + "sqlx-postgres", + "syn 1.0.109", + "tempfile", "url", ] [[package]] -name = "sqlx-rt" -version = "0.5.9" +name = "sqlx-postgres" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d1bd069de53442e7a320f525a6d4deb8bb0621ac7a55f7eccbc2b58b57f43d0" +checksum = "d6ac0ac3b7ccd10cc96c7ab29791a7dd236bd94021f31eec7ba3d46a74aa1c24" dependencies = [ - "async-native-tls", - "async-std", - "native-tls", + "atoi", + "base64", + "bitflags 2.4.1", + "byteorder", + "crc", + "dotenvy", + "etcetera", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "hex", + "hkdf", + "hmac", + "home", + "itoa", + "log", + "md-5", + "memchr", + "once_cell", + "rand", + "serde", + "serde_json", + "sha1", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror", + "tracing", + "whoami", ] -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - [[package]] name = "static_assertions" version = "1.1.0" @@ -1913,134 +2338,207 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "stopper" -version = "0.2.0" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4573bf2456e356934de15c7151d1c9fc8873e8866a7c2b5e0bb20f8244bd0073" +checksum = "810ecf6a47020ea27b2cc949d2f1292b9759e8f2c4cebf71376520124417d9e6" dependencies = [ - "futures-lite", - "pin-project", - "waker-set", + "event-listener 4.0.0", + "futures-lite 2.1.0", + "pin-project-lite", ] [[package]] name = "stringprep" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ee348cb74b87454fff4b551cbf727025810a004f88aeacae7f85b87f4e9a1c1" +checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6" dependencies = [ + "finl_unicode", "unicode-bidi", "unicode-normalization", ] +[[package]] +name = "strum" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290d54ea6f91c969195bdbcd7442c8c2a2ba87da8bf60a7ee86a235d4bc1e125" + [[package]] name = "subtle" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "syn" -version = "1.0.82" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8daf5dd0bb60cbd4137b1b587d2fc0ae729bc07cf01cd70b36a1ed5ade3b9d59" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", - "unicode-xid", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c8b28c477cc3bf0e7966561e3460130e1255f7a1cf71931075f1c5e7a7e269" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", ] +[[package]] +name = "tagptr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" + [[package]] name = "tempfile" -version = "3.2.0" +version = "3.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22" +checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" dependencies = [ "cfg-if", - "libc", - "rand", + "fastrand 2.0.1", "redox_syscall", - "remove_dir_all", - "winapi", + "rustix 0.38.28", + "windows-sys 0.48.0", +] + +[[package]] +name = "termcolor" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff1bc3d3f05aff0403e8ac0d92ced918ec05b666a43f83297ccef5bea8a3d449" +dependencies = [ + "winapi-util", ] [[package]] name = "thiserror" -version = "1.0.30" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "854babe52e4df1653706b98fcfc05843010039b406875930a70e4d9644e5c417" +checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.30" +version = "1.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa32fd3f627f367fe16f893e2597ae3c05020f8bba2666a4e6ea73d377e5714b" +checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.41", ] [[package]] name = "time" -version = "0.1.44" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" +checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" dependencies = [ + "deranged", + "itoa", "libc", - "wasi", - "winapi", + "num_threads", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" +dependencies = [ + "time-core", ] [[package]] name = "tinyvec" -version = "1.5.1" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c1c1d5a42b6245520c249549ec267180beaffcc0615401ac8e31853d4b6d8d2" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" dependencies = [ "tinyvec_macros", ] [[package]] name = "tinyvec_macros" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.14.0" +version = "1.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e992e41e0d2fb9f755b37446f20900f64446ef54874f40a60c78f021ac6144" +checksum = "841d45b238a16291a4e1584e61820b8ae57d696cc5015c459c229ccc6990cc1c" dependencies = [ - "autocfg", + "backtrace", "bytes", "libc", - "memchr", "mio", "pin-project-lite", + "socket2 0.5.5", "tokio-macros", - "winapi", + "windows-sys 0.48.0", ] [[package]] name = "tokio-macros" -version = "1.6.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9efc1aba077437943f7515666aa2b882dfabfbfdf89c819ea75a8d6e9eaba5e" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.41", ] [[package]] name = "tokio-native-tls" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" +checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" dependencies = [ "native-tls", "tokio", @@ -2048,9 +2546,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.2" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f988a1a1adc2fb21f9c12aa96441da33a1728193ae0b95d2be22dbd17fcb4e5c" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" dependencies = [ "bytes", "futures-core", @@ -2062,26 +2560,25 @@ dependencies = [ [[package]] name = "toml" -version = "0.5.8" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31142970826733df8241ef35dc040ef98c679ab14d7c3e54d827099b3acecaa" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ "serde", ] [[package]] name = "tower-service" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.29" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "375a639232caf30edfc78e8d89b2d4c375515393e7af7e16f01cd96917fb2105" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "cfg-if", "log", "pin-project-lite", "tracing-attributes", @@ -2090,32 +2587,32 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.19" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8276d9a4a3a558d7b7ad5303ad50b53d58264641b82914b7ada36bd762e7a716" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.41", ] [[package]] name = "tracing-core" -version = "0.1.21" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f4ed65637b8390770814083d20756f87bfa2c21bf2f110babdc5438351746e4" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ - "lazy_static", + "once_cell", ] [[package]] name = "trillium" -version = "0.2.2" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a229016cb2f3be4209b40cfbd2f3a0cd11aa7d283be8f4612219227d3e4014e4" +checksum = "6a924e0aeb1b4e0cb844cd57d9a8b81bea9cba1a0bdb323bd753920149089fe2" dependencies = [ "async-trait", - "futures-lite", + "futures-lite 2.1.0", "log", "trillium-http", ] @@ -2144,61 +2641,58 @@ dependencies = [ "trillium", ] -[[package]] -name = "trillium-async-std" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaba69d82fa40cfb4ec00169ec29cad318dfbe6e4030d5a24916ef0b29131c16" -dependencies = [ - "async-std", - "log", - "signal-hook", - "signal-hook-async-std", - "trillium", - "trillium-http", - "trillium-server-common", -] - [[package]] name = "trillium-http" -version = "0.2.6" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35699b044a43f0284c9726c78bbea94828edb7ffbd8d7ad552f04506da256747" +checksum = "99e0cb5adb4dc9f3d8a53a6cb1c86372b7dfec0be46f252d38d09909b9ba578c" dependencies = [ "encoding_rs", - "futures-lite", + "futures-lite 2.1.0", "hashbrown", "httparse", "httpdate", "log", - "memmem", + "memchr", "mime", "smallvec", "smartcow", "smartstring", "stopper", "thiserror", + "trillium-macros", ] [[package]] name = "trillium-logger" -version = "0.4.0" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21a01e95a1a2021c465ed2773f9be589bc3b0138523389fd99366d1537c70fcd" +checksum = "50539be128242aa35f43fad99c5168a85739ba2696b0563319ecc036fbb16acc" dependencies = [ - "atty", - "chrono", "colored", + "is-terminal", "log", "size", + "time", "trillium", ] +[[package]] +name = "trillium-macros" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d19bf7f37bc3e66beae9792c0f7a0e3500465cf431da63fdb6af593b0e353a4" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", +] + [[package]] name = "trillium-router" -version = "0.3.2" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20eb6edfe01b2df89944e0371453dbc288d94cf8b779f9fbd89c24ed923217a9" +checksum = "a93cacd817bbd4e8308e5ca8223009e6de60198580d66a7fede1c022ceb16cd7" dependencies = [ "log", "routefinder", @@ -2207,18 +2701,39 @@ dependencies = [ [[package]] name = "trillium-server-common" -version = "0.3.0" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02f8a8649680599d1142d454668be5f864f81809d77543ec5ac615b73241b8aa" +checksum = "72bc41ffb1eb97c76f95b9684ce10fce6ba710d0322bd826b0480f00f3ddc98d" dependencies = [ - "atomic-waker", - "futures-lite", + "async-trait", + "async_cell", + "event-listener 3.1.0", + "futures-lite 2.1.0", "log", "pin-project-lite", "rlimit", "trillium", "trillium-http", - "trillium-tls-common", + "url", +] + +[[package]] +name = "trillium-smol" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d1f9ba437ee34426dd36f01a91e59bf27656bf9e676d68b336d7b3e3932c3f5" +dependencies = [ + "async-global-executor", + "async-io 1.13.0", + "async-net", + "futures-lite 1.13.0", + "log", + "signal-hook", + "signal-hook-async-std", + "trillium", + "trillium-http", + "trillium-macros", + "trillium-server-common", ] [[package]] @@ -2226,78 +2741,76 @@ name = "trillium-techempower" version = "0.1.0" dependencies = [ "askama", - "fastrand", - "futures-lite", - "futures-util", + "env_logger", + "fastrand 2.0.1", + "futures-lite 2.1.0", + "jemallocator", + "moka", "sea-orm", "serde", "serde_json", "trillium", "trillium-api", "trillium-askama", - "trillium-async-std", "trillium-logger", "trillium-router", + "trillium-smol", + "unicycle", ] [[package]] -name = "trillium-tls-common" -version = "0.1.0" +name = "triomphe" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25c024962f8fdad586fb329e91b64ef0f4034652779ef5d3720102ca0f88d714" -dependencies = [ - "async-trait", - "futures-lite", - "url", -] +checksum = "859eb650cfee7434994602c3a68b25d77ad9e68c8a6cd491616ef86661382eb3" [[package]] name = "try-lock" -version = "0.2.3" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typenum" -version = "1.14.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b63708a265f51345575b27fe43f9500ad611579e764c79edbc2037b1121959ec" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicase" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" +checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" dependencies = [ "version_check", ] [[package]] name = "unicode-bidi" -version = "0.3.7" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416" + +[[package]] +name = "unicode-ident" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" -version = "0.1.19" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" dependencies = [ "tinyvec", ] [[package]] name = "unicode-segmentation" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8895849a949e7845e06bd6dc1aa51731a103c42707010a5b591c0038fb73385b" - -[[package]] -name = "unicode-xid" -version = "0.2.2" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" +checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" [[package]] name = "unicode_categories" @@ -2305,37 +2818,50 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" +[[package]] +name = "unicycle" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0edfa5ca2452d3fbf68f7078c5e7f42b96f0c0c7def017994147f8acd8c4264d" +dependencies = [ + "futures-core", + "lock_api", + "parking_lot", + "pin-project", + "uniset", +] + +[[package]] +name = "uniset" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c9f21fe154ca4d5d06fc2ebb8c58cc80e338eacc372ec794943f69e535c131c" + [[package]] name = "url" -version = "2.2.2" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", "idna", - "matches", "percent-encoding", ] [[package]] name = "uuid" -version = "0.8.2" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" dependencies = [ "getrandom", - "serde", ] [[package]] name = "value-bag" -version = "1.0.0-alpha.8" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79923f7731dc61ebfba3633098bf3ac533bbd35ccd8c57e7088d9a5eebe0263f" -dependencies = [ - "ctor", - "version_check", -] +checksum = "4a72e1902dde2bd6441347de2b70b7f5d59bf157c6c62f0c44572607a1d55bbe" [[package]] name = "vcpkg" @@ -2345,47 +2871,46 @@ checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] name = "version_check" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "waker-fn" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" +checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690" [[package]] -name = "waker-set" -version = "0.2.0" +name = "walkdir" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e958152c46345e1af5c61812030ac85200573a0b384c137e83ce2c01ac4bc07" +checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" dependencies = [ - "crossbeam-utils", - "slab", + "same-file", + "winapi-util", ] [[package]] name = "want" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ - "log", "try-lock", ] [[package]] name = "wasi" -version = "0.10.0+wasi-snapshot-preview1" +version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.78" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "632f73e236b219150ea279196e54e610f5dbafa5d61786303d4da54f84e47fce" +checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -2393,24 +2918,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.78" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a317bf8f9fba2476b4b2c85ef4c4af8ff39c3c7f0cdfeed4f82c34a880aa837b" +checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" dependencies = [ "bumpalo", - "lazy_static", "log", + "once_cell", "proc-macro2", "quote", - "syn", + "syn 2.0.41", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.28" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e8d7523cb1f2a4c96c1317ca690031b714a51cc14e05f712446691f413f5d39" +checksum = "ac36a15a220124ac510204aec1c3e5db8a22ab06fd6706d881dc6149f8ed9a12" dependencies = [ "cfg-if", "js-sys", @@ -2420,9 +2945,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.78" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d56146e7c495528bf6587663bea13a8eb588d39b36b679d83972e1a2dbbdacf9" +checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2430,51 +2955,38 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.78" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7803e0eea25835f8abdc585cd3021b3deb11543c6fe226dcd30b228857c5c5ab" +checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.41", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.78" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0237232789cf037d5480773fe568aac745bfe2afbc11a863e97901780a6b47cc" +checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" [[package]] name = "web-sys" -version = "0.3.55" +version = "0.3.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38eb105f1c59d9eaa6b5cdc92b859d85b926e82cb2e0945cd0c9259faa6fe9fb" +checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" dependencies = [ "js-sys", "wasm-bindgen", ] -[[package]] -name = "wepoll-ffi" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d743fdedc5c64377b5fc2bc036b01c7fd642205a0d96356034ae3404d49eb7fb" -dependencies = [ - "cc", -] - [[package]] name = "whoami" -version = "1.2.1" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524b58fa5a20a2fb3014dd6358b70e6579692a56ef6fce928834e488f42f65e8" -dependencies = [ - "wasm-bindgen", - "web-sys", -] +checksum = "22fc3756b8a9133049b26c7f61ab35416c130e8c09b660f5b3958b446f52cc50" [[package]] name = "winapi" @@ -2492,17 +3004,179 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +dependencies = [ + "winapi", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.0", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +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", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" + [[package]] name = "winreg" -version = "0.7.0" +version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ - "winapi", + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "zerocopy" +version = "0.7.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "306dca4455518f1f31635ec308b6b3e4eb1b11758cefafc782827d0aa7acb5c7" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be912bf68235a88fbefd1b73415cb218405958d1655b2ece9035a19920bdf6ba" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.41", ] diff --git a/frameworks/Rust/trillium/Cargo.toml b/frameworks/Rust/trillium/Cargo.toml index 9c1a1bcf338..b85b3848afd 100644 --- a/frameworks/Rust/trillium/Cargo.toml +++ b/frameworks/Rust/trillium/Cargo.toml @@ -3,22 +3,28 @@ name = "trillium-techempower" version = "0.1.0" edition = "2021" +[features] +jemallocator = ["dep:jemallocator"] + [dependencies] askama = "0.11.1" -fastrand = "1.7.0" -futures-lite = "1.12.0" -futures-util = "0.3.21" -serde = { version = "1.0.136", features = ["derive"] } -serde_json = "1.0.79" -trillium = "0.2.2" +fastrand = "2.0.1" +futures-lite = "2.1.0" +serde = { version = "1.0.193", features = ["derive"] } +serde_json = "1.0.108" +trillium = "0.2.11" trillium-api = "0.1.0" trillium-askama = "0.3.0" -trillium-async-std = "0.2.0" -trillium-logger = "0.4.0" -trillium-router = "0.3.2" +trillium-smol = "0.3.1" +trillium-logger = "0.4.3" +trillium-router = "0.3.5" +unicycle = "0.9.4" +env_logger = "0.10.1" +moka = { version = "0.12.1", features = ["future"] } +jemallocator = {version="0.5.4", optional = true} [dependencies.sea-orm] -version = "0.6.0" +version = "0.12.9" default-features = false features = ["runtime-async-std-native-tls", "sqlx-postgres", "macros"] diff --git a/frameworks/Rust/trillium/README.md b/frameworks/Rust/trillium/README.md index 586e669e5c1..007e4d454e2 100755 --- a/frameworks/Rust/trillium/README.md +++ b/frameworks/Rust/trillium/README.md @@ -53,3 +53,7 @@ PostgreSQL. ### Test 6: Plaintext http://localhost:8080/plaintext + +### Test 7: Caching + + http://localhost:8080/cached/20 diff --git a/frameworks/Rust/trillium/benchmark_config.json b/frameworks/Rust/trillium/benchmark_config.json index 19076a3598f..a781bbabdcc 100755 --- a/frameworks/Rust/trillium/benchmark_config.json +++ b/frameworks/Rust/trillium/benchmark_config.json @@ -1,5 +1,6 @@ { "framework": "trillium", + "maintainers": ["jbr"], "tests": [ { "default": { @@ -8,6 +9,8 @@ "query_url": "/queries/", "plaintext_url": "/plaintext", "fortune_url": "/fortunes", + "cached_query_url": "/cached-queries/", + "update_url": "/updates/", "port": 8080, "approach": "Realistic", "classification": "Micro", diff --git a/frameworks/Rust/trillium/src/application.rs b/frameworks/Rust/trillium/src/application.rs index 83992f56eaa..d8ed8106628 100644 --- a/frameworks/Rust/trillium/src/application.rs +++ b/frameworks/Rust/trillium/src/application.rs @@ -1,14 +1,10 @@ use crate::db::Db; use crate::routes::router; -use trillium_logger::Logger; pub fn application() -> impl trillium::Handler { ( - if cfg!(debug_assertions) { - Some(Logger::new()) - } else { - None - }, + #[cfg(debug_assertions)] + trillium_logger::logger(), Db::default(), router(), ) diff --git a/frameworks/Rust/trillium/src/db.rs b/frameworks/Rust/trillium/src/db.rs index fb1d61e4ebe..3f9982a09bc 100644 --- a/frameworks/Rust/trillium/src/db.rs +++ b/frameworks/Rust/trillium/src/db.rs @@ -5,9 +5,23 @@ use trillium::{async_trait, Conn, Handler, Info}; #[derive(Debug, Default)] pub struct Db(Option); +pub mod cached_world; pub mod fortune; pub mod world; +impl Db { + pub(crate) async fn connection() -> DatabaseConnection { + let db_url = env::var("DATABASE_URL").expect("env var DATABASE_URL not found"); + + let connect_options = ConnectOptions::new(db_url.clone()); + + Database::connect(connect_options) + .await + .map_err(|e| format!("could not connect to {}: {}", &db_url, e)) + .unwrap() + } +} + #[async_trait] impl Handler for Db { async fn run(&self, conn: Conn) -> Conn { @@ -16,16 +30,7 @@ impl Handler for Db { async fn init(&mut self, _info: &mut Info) { if self.0.is_none() { - let db_url = env::var("DATABASE_URL").expect("env var DATABASE_URL not found"); - - let connect_options = ConnectOptions::new(db_url.clone()); - - let db = Database::connect(connect_options) - .await - .map_err(|e| format!("could not connect to {}: {}", &db_url, e)) - .unwrap(); - - self.0 = Some(db); + self.0 = Some(Self::connection().await); } } } diff --git a/frameworks/Rust/trillium/src/db/cached_world.rs b/frameworks/Rust/trillium/src/db/cached_world.rs new file mode 100644 index 00000000000..d8ea0b82223 --- /dev/null +++ b/frameworks/Rust/trillium/src/db/cached_world.rs @@ -0,0 +1,24 @@ +use sea_orm::entity::prelude::*; +use serde::Serialize; + +#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Serialize)] +#[sea_orm(table_name = "World")] +#[serde(rename_all = "camelCase")] +pub struct Model { + #[sea_orm(primary_key)] + pub id: i32, + + #[sea_orm(column_name = "randomnumber")] + pub random_number: i32, +} + +#[derive(Copy, Clone, Debug, EnumIter)] +pub enum Relation {} + +impl RelationTrait for Relation { + fn def(&self) -> RelationDef { + unimplemented!() + } +} + +impl ActiveModelBehavior for ActiveModel {} diff --git a/frameworks/Rust/trillium/src/db/fortune.rs b/frameworks/Rust/trillium/src/db/fortune.rs index b046f3ddfe4..b6d69229599 100644 --- a/frameworks/Rust/trillium/src/db/fortune.rs +++ b/frameworks/Rust/trillium/src/db/fortune.rs @@ -1,7 +1,8 @@ use sea_orm::entity::prelude::*; use serde::Serialize; +use std::cmp::Ordering; -#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Serialize)] +#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Serialize, Eq)] #[sea_orm(table_name = "Fortune")] pub struct Model { #[sea_orm(primary_key)] @@ -20,3 +21,15 @@ impl RelationTrait for Relation { } impl ActiveModelBehavior for ActiveModel {} + +impl PartialOrd for Model { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} + +impl Ord for Model { + fn cmp(&self, other: &Self) -> Ordering { + self.message.cmp(&other.message) + } +} diff --git a/frameworks/Rust/trillium/src/main.rs b/frameworks/Rust/trillium/src/main.rs index 65935b84a66..b7105c0ff8e 100644 --- a/frameworks/Rust/trillium/src/main.rs +++ b/frameworks/Rust/trillium/src/main.rs @@ -1,9 +1,23 @@ +#[cfg(feature = "jemallcator")] +#[global_allocator] +static ALLOC: jemallocator::Jemalloc = jemallocator::Jemalloc; + mod application; mod db; mod routes; - use application::application; +use trillium::HttpConfig; fn main() { - trillium_async_std::run(application()) + #[cfg(debug_assertions)] + env_logger::init(); + + let http_config = HttpConfig::default() + .with_response_buffer_len(256) + .with_request_buffer_initial_len(256) + .with_response_header_initial_capacity(5); + + trillium_smol::config() + .with_http_config(http_config) + .run(application()) } diff --git a/frameworks/Rust/trillium/src/routes.rs b/frameworks/Rust/trillium/src/routes.rs index b5cc8864564..4b807f5b0f7 100644 --- a/frameworks/Rust/trillium/src/routes.rs +++ b/frameworks/Rust/trillium/src/routes.rs @@ -1,11 +1,11 @@ use trillium_router::Router; +mod cached_queries; mod db; mod fortune; mod json; mod plaintext; mod queries; mod updates; - pub fn router() -> Router { Router::build(|mut router| { router.get("/fortunes", fortune::handler); @@ -16,5 +16,8 @@ pub fn router() -> Router { router.get("/plaintext", plaintext::handler); router.get("/updates/:updates", updates::handler); router.get("/updates", updates::handler); + let cached_queries = cached_queries::handler(); + router.get("/cached-queries/:count", cached_queries.clone()); + router.get("/cached-queries", cached_queries); }) } diff --git a/frameworks/Rust/trillium/src/routes/cached_queries.rs b/frameworks/Rust/trillium/src/routes/cached_queries.rs new file mode 100644 index 00000000000..25e007bf791 --- /dev/null +++ b/frameworks/Rust/trillium/src/routes/cached_queries.rs @@ -0,0 +1,80 @@ +use crate::db::{ + cached_world::{Entity as CachedWorlds, Model as CachedWorld}, + Db, DbConnExt, +}; +use futures_lite::StreamExt; +use moka::future::Cache; +use sea_orm::{DatabaseConnection, DbErr, EntityTrait}; +use std::{iter, sync::Arc}; +use trillium::{Conn, Handler, Info, Status}; +use trillium_api::ApiConnExt; +use trillium_router::RouterConnExt; +use unicycle::FuturesUnordered; + +pub fn handler() -> CachedWorldHandler { + CachedWorldHandler { + cache: Cache::new(10_000), + } +} + +#[derive(Debug, Clone)] +pub struct CachedWorldHandler { + cache: Cache, +} + +impl CachedWorldHandler { + #[inline(always)] + fn count_param(conn: &Conn) -> usize { + conn.param("count") + .and_then(|s| s.parse().ok()) + .unwrap_or(1) + .min(500) + .max(1) + } + + #[inline(always)] + async fn fetch_cached( + &self, + db: &DatabaseConnection, + id: i32, + ) -> Result> { + self.cache + .try_get_with(id, async { + CachedWorlds::find_by_id(id) + .one(db) + .await? + .ok_or_else(|| DbErr::RecordNotFound(String::from("not found"))) + }) + .await + } +} + +#[trillium::async_trait] +impl Handler for CachedWorldHandler { + async fn init(&mut self, _info: &mut Info) { + if self.cache.entry_count() == 0 { + let db = Db::connection().await; + let mut stream = CachedWorlds::find().stream(&db).await.unwrap(); + while let Some(Ok(world)) = stream.next().await { + self.cache.insert(world.id, world).await + } + self.cache.run_pending_tasks().await; + } + } + + async fn run(&self, conn: Conn) -> Conn { + let count = Self::count_param(&conn); + let db = conn.db(); + let worlds: Result, _> = + iter::repeat_with(|| self.fetch_cached(db, fastrand::i32(1..=10_000))) + .take(count) + .collect::>() + .try_collect() + .await; + + match worlds { + Ok(worlds) => conn.with_json(&worlds), + Err(_) => conn.with_status(Status::InternalServerError), + } + } +} diff --git a/frameworks/Rust/trillium/src/routes/db.rs b/frameworks/Rust/trillium/src/routes/db.rs index de1b8fc2fbd..8dbb00b499d 100644 --- a/frameworks/Rust/trillium/src/routes/db.rs +++ b/frameworks/Rust/trillium/src/routes/db.rs @@ -1,18 +1,13 @@ use crate::db::{world::Entity as World, DbConnExt}; use sea_orm::entity::prelude::*; -use trillium::{conn_unwrap, Conn}; +use trillium::{Conn, Status}; use trillium_api::ApiConnExt; pub async fn handler(conn: Conn) -> Conn { - let random = fastrand::i32(1..10000); - let world = conn_unwrap!( - World::find_by_id(random) - .one(conn.db()) - .await - .ok() - .flatten(), - conn - ); - - conn.with_json(&world) + let id = fastrand::i32(1..=10_000); + match World::find_by_id(id).one(conn.db()).await { + Ok(Some(world)) => conn.with_json(&world), + Err(_) => conn.with_status(Status::InternalServerError), + Ok(None) => conn.with_status(Status::NotFound), + } } diff --git a/frameworks/Rust/trillium/src/routes/fortune.rs b/frameworks/Rust/trillium/src/routes/fortune.rs index 66bcce25aef..e9ea757e7bf 100644 --- a/frameworks/Rust/trillium/src/routes/fortune.rs +++ b/frameworks/Rust/trillium/src/routes/fortune.rs @@ -2,26 +2,34 @@ use crate::db::{ fortune::{Entity as Fortunes, Model as Fortune}, DbConnExt, }; -use sea_orm::entity::prelude::*; -use trillium::{conn_try, Conn, KnownHeaderName::ContentType}; +use futures_lite::StreamExt; +use sea_orm::EntityTrait; +use std::collections::BTreeSet; +use trillium::{Conn, KnownHeaderName::ContentType, Status}; use trillium_askama::{AskamaConnExt, Template}; #[derive(Template)] #[template(path = "fortunes.html")] struct FortuneTemplate<'a> { - fortunes: &'a [Fortune], + fortunes: &'a BTreeSet, } pub async fn handler(conn: Conn) -> Conn { - let db = conn.db(); + let db = conn.db().clone(); - let mut fortunes = conn_try!(Fortunes::find().all(db).await, conn); - fortunes.push(Fortune { + let mut fortunes = BTreeSet::new(); + fortunes.insert(Fortune { id: 0, message: String::from("Additional fortune added at request time."), }); - fortunes.sort_by(|a, b| a.message.cmp(&b.message)); + let Ok(mut stream) = Fortunes::find().stream(&db).await else { + return conn.with_status(Status::InternalServerError); + }; + + while let Some(Ok(fortune)) = stream.next().await { + fortunes.insert(fortune); + } conn.render(FortuneTemplate { fortunes: &fortunes, diff --git a/frameworks/Rust/trillium/src/routes/json.rs b/frameworks/Rust/trillium/src/routes/json.rs index e238b70a8b9..ce203fb921b 100644 --- a/frameworks/Rust/trillium/src/routes/json.rs +++ b/frameworks/Rust/trillium/src/routes/json.rs @@ -1,8 +1,7 @@ -use serde_json::{json, to_string}; -use trillium::{conn_try, Conn, KnownHeaderName}; +use serde_json::json; +use trillium::Conn; +use trillium_api::ApiConnExt; pub async fn handler(conn: Conn) -> Conn { - let body = conn_try!(to_string(&json!({"message": "Hello, World!"})), conn); - conn.ok(body) - .with_header(KnownHeaderName::ContentType, "application/json") + conn.with_json(&json!({"message": "Hello, World!"})) } diff --git a/frameworks/Rust/trillium/src/routes/queries.rs b/frameworks/Rust/trillium/src/routes/queries.rs index a32d13d964c..dfd21e318d2 100644 --- a/frameworks/Rust/trillium/src/routes/queries.rs +++ b/frameworks/Rust/trillium/src/routes/queries.rs @@ -1,11 +1,11 @@ use crate::db::{world::Entity as Worlds, DbConnExt}; use futures_lite::StreamExt; -use futures_util::stream::futures_unordered::FuturesUnordered; -use sea_orm::entity::prelude::*; +use sea_orm::{entity::prelude::*, TransactionTrait}; use std::iter; -use trillium::{conn_try, Conn}; +use trillium::{Conn, Status}; use trillium_api::ApiConnExt; use trillium_router::RouterConnExt; +use unicycle::FuturesUnordered; pub async fn handler(conn: Conn) -> Conn { let queries = conn @@ -15,20 +15,23 @@ pub async fn handler(conn: Conn) -> Conn { .min(500) .max(1); - let db = conn.db(); + let Ok(tx) = conn.db().begin().await else { + return conn.with_status(Status::InternalServerError); + }; - let vec_of_worlds: Result, DbErr> = - iter::repeat_with(|| Worlds::find_by_id(fastrand::i32(1..10000)).one(db)) - .take(queries) - .collect::>() - .map(|x| match x { - Ok(None) => Err(DbErr::RecordNotFound(String::from("not found"))), - other => other, - }) - .try_collect() - .await; + let worlds = iter::repeat_with(|| async { + Worlds::find_by_id(fastrand::i32(1..=10_000)) + .one(&tx) + .await? + .ok_or_else(|| DbErr::RecordNotFound(String::from("not found"))) + }) + .take(queries) + .collect::>() + .try_collect::<_, _, Vec<_>>() + .await; - let vec_of_worlds = conn_try!(vec_of_worlds, conn); - - conn.with_json(&vec_of_worlds) + match worlds { + Ok(worlds) => conn.with_json(&worlds), + Err(_) => conn.with_status(Status::InternalServerError), + } } diff --git a/frameworks/Rust/trillium/src/routes/updates.rs b/frameworks/Rust/trillium/src/routes/updates.rs index c88e5595f67..46e7737d29b 100644 --- a/frameworks/Rust/trillium/src/routes/updates.rs +++ b/frameworks/Rust/trillium/src/routes/updates.rs @@ -1,14 +1,11 @@ -use crate::db::{ - world::{Entity as Worlds, Model as World}, - DbConnExt, -}; - -use futures_util::stream::{futures_unordered::FuturesUnordered, StreamExt}; +use crate::db::{world::Entity as Worlds, DbConnExt}; +use futures_lite::StreamExt; use sea_orm::{entity::prelude::*, IntoActiveModel, Set}; use std::iter; -use trillium::Conn; +use trillium::{Conn, Status}; use trillium_api::ApiConnExt; use trillium_router::RouterConnExt; +use unicycle::FuturesUnordered; pub async fn handler(conn: Conn) -> Conn { let queries = conn @@ -19,19 +16,22 @@ pub async fn handler(conn: Conn) -> Conn { .max(1); let db = conn.db(); + let worlds = iter::repeat_with(|| async { + let mut world = Worlds::find_by_id(fastrand::i32(1..=10_000)) + .one(db) + .await? + .ok_or_else(|| DbErr::RecordNotFound(String::from("not found")))? + .into_active_model(); + world.random_number = Set(fastrand::i32(1..=10_000)); + world.update(db).await + }) + .take(queries) + .collect::>() + .try_collect::<_, _, Vec<_>>() + .await; - let vec_of_worlds: Vec = - iter::repeat_with(|| Worlds::find_by_id(fastrand::i32(1..10000)).one(db)) - .take(queries) - .collect::>() - .filter_map(|x| async move { x.ok().flatten() }) - .filter_map(|w| async move { - let mut am = w.clone().into_active_model(); - am.random_number = Set(fastrand::i32(1..10000)); - am.update(db).await.ok() - }) - .collect() - .await; - - conn.with_json(&vec_of_worlds) + match worlds { + Ok(worlds) => conn.with_json(&worlds), + Err(_) => conn.with_status(Status::InternalServerError), + } } diff --git a/frameworks/Rust/trillium/templates/fortunes.html b/frameworks/Rust/trillium/templates/fortunes.html index 3619c728ea2..fb45d04e019 100644 --- a/frameworks/Rust/trillium/templates/fortunes.html +++ b/frameworks/Rust/trillium/templates/fortunes.html @@ -4,9 +4,9 @@ - {% for fortune in fortunes %} + {%- for fortune in fortunes -%} - {% endfor %} + {%- endfor -%}
idmessage
{{fortune.id}}{{fortune.message}}
diff --git a/frameworks/Rust/trillium/trillium.dockerfile b/frameworks/Rust/trillium/trillium.dockerfile index eac19bbbd6a..877b6b664a2 100644 --- a/frameworks/Rust/trillium/trillium.dockerfile +++ b/frameworks/Rust/trillium/trillium.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.57 +FROM rust:1.74 WORKDIR /trillium COPY src src COPY templates templates @@ -12,5 +12,5 @@ ENV PORT=8080 ENV HOST=0.0.0.0 ENV DATABASE_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world -RUN cargo build --release +RUN cargo build --release --features jemallocator CMD ["./target/release/trillium-techempower"] From 48a8dc40a140bd1242455376c41d49544fd22ac6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=91=E5=B0=8F=E9=A9=AC?= <1417262058@qq.com> Date: Fri, 15 Dec 2023 00:55:52 +0800 Subject: [PATCH 058/210] Updating performance issues in the HServer framework. (#8626) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * hserver framework submit * hserver framework submit * lowercase fix * Required response header missing: Date fix * Date format fix * update hserver version * update hserver threadPool * update hserver * update hserver * update hserver query * update hserver query * Update README.md * update hserver query * update hserver query * update hserver query * update hserver query * update hserver query * update hserver query * Optimal configuration of hserver framework * Optimal configuration of hserver framework * Optimal configuration of hserver framework * Upgrade hserver Framework version and optimize configuration * Upgrade hserver Framework version and optimize configuration * Upgrade hserver Framework version and optimize configuration * Upgrade hserver Framework version and optimize configuration * Upgrade hserver Framework version and optimize configuration * Upgrade hserver Framework version and optimize configuration * Upgrade hserver Framework version and optimize configuration * Upgrade hserver Framework version and optimize configuration * Upgrade hserver Framework version and optimize configuration * Upgrade hserver Framework version and optimize configuration * Upgrade hserver Framework version and optimize configuration * Upgrade hserver Framework version and optimize configuration * Upgrade hserver Framework version and optimize configuration * Upgrade hserver Framework version and optimize configuration * Upgrade hserver Framework version and optimize configuration * Update pom.xml Upgrade dependencies, optimize performance. * Upgrade hserver Framework version and optimize configuration * Upgrade hserver Framework version and optimize configuration and Optimize log printing --------- Co-authored-by: 黑小马 --- frameworks/Java/hserver/pom.xml | 4 ++-- frameworks/Java/hserver/src/main/resources/app.properties | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/frameworks/Java/hserver/pom.xml b/frameworks/Java/hserver/pom.xml index 8d63b000645..02866464a3a 100644 --- a/frameworks/Java/hserver/pom.xml +++ b/frameworks/Java/hserver/pom.xml @@ -11,7 +11,7 @@ hserver-parent cn.hserver - 3.1.M2 + 3.4.M2 UTF-8 @@ -49,4 +49,4 @@ -
\ No newline at end of file + diff --git a/frameworks/Java/hserver/src/main/resources/app.properties b/frameworks/Java/hserver/src/main/resources/app.properties index 78b388d9923..1a3bd9c7ae7 100644 --- a/frameworks/Java/hserver/src/main/resources/app.properties +++ b/frameworks/Java/hserver/src/main/resources/app.properties @@ -3,6 +3,5 @@ username= benchmarkdbuser password= benchmarkdbpass maximumPoolSize= 256 -level=info -#业务线程池 +log=info web.businessPool=-1 From 115d5d864847a776c966264a19a9ee999f0e4ca5 Mon Sep 17 00:00:00 2001 From: Jorge Alexandre Delesderrier da Silva Date: Thu, 14 Dec 2023 13:57:06 -0300 Subject: [PATCH 059/210] [C++/just-boost] performance issues and alpine upgrade (#8635) * just-boost added * performance issues * alpine upgrade --- .../C++/just-boost/just-boost.dockerfile | 4 ++-- frameworks/C++/just-boost/main.cpp | 21 ++++++++++++------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/frameworks/C++/just-boost/just-boost.dockerfile b/frameworks/C++/just-boost/just-boost.dockerfile index 0eb409e1ab9..32aba994393 100644 --- a/frameworks/C++/just-boost/just-boost.dockerfile +++ b/frameworks/C++/just-boost/just-boost.dockerfile @@ -1,14 +1,14 @@ # docker build --progress=plain --build-arg CXXFLAGS="-Wall" -t just-boost -f just-boost.dockerfile . # docker run --rm --name just-boost -p 8000:8000 -d just-boost # docker container stop just-boost -FROM alpine:3.18 +FROM alpine:3.19 ARG APP=just-boost ARG CXXFLAGS=-O3 ENV LANG=C.UTF-8 LC_ALL=C.UTF-8 ENV BCPP_PG_CONN_STR="postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world" -ENV BCPP_N_THREADS=32 +#ENV BCPP_N_THREADS=0 # default 0 : number of cores WORKDIR /usr/src/${APP} diff --git a/frameworks/C++/just-boost/main.cpp b/frameworks/C++/just-boost/main.cpp index fc296da6837..caa15084aea 100644 --- a/frameworks/C++/just-boost/main.cpp +++ b/frameworks/C++/just-boost/main.cpp @@ -117,8 +117,6 @@ handle_target( http::request>&& req, PGconn* conn = nullptr) { - static std::string msg = "Hello, World!"; - //std::cout << "handle_target: " << req.target() << std::endl; http::response res{http::status::ok, req.version()}; res.set(http::field::server, BOOST_BEAST_VERSION_STRING); @@ -130,13 +128,13 @@ handle_target( { // {"message":"Hello, World!"} json::object obj; - obj["message"] = msg; + obj["message"] = "Hello, World!"; res.body() = json::serialize(obj); } else if (req.target() == "/plaintext") { res.set(http::field::content_type, "text/plain"); - res.body() = msg; + res.body() = "Hello, World!"; } else if (req.target() == "/db" || req.target().starts_with("/queries/")) { @@ -328,9 +326,10 @@ do_listen(tcp::endpoint endpoint) { std::rethrow_exception(e); } - catch (std::exception &e) { - std::cerr << "Error in session: " << e.what() << "\n"; - } + catch (std::exception&){} +// catch (std::exception &e) { +// std::cerr << "Error in session: " << e.what() << "\n"; +// } }); } @@ -339,7 +338,13 @@ int main(int argc, char* argv[]) { auto const address = net::ip::make_address(becpp::env("BCPP_ADDRESS", "0.0.0.0")); auto const port = static_cast(std::atoi(becpp::env("BCPP_PORT", "8000"))); - auto const threads = std::max(1, std::atoi(becpp::env("BCPP_N_THREADS", "3"))); + auto env_threads = std::atoi(becpp::env("BCPP_N_THREADS", "0")); + if (env_threads == 0) + { + env_threads = std::thread::hardware_concurrency(); + std::cout << "Using number of cores: " << env_threads << '\n'; + } + auto const threads = std::max(1, env_threads); std::cout << "__GNUG__=" << __GNUG__ << '\n'; std::cout << "__cplusplus=" << __cplusplus << '\n'; From 7a9074cdbb4f04cce139d341356113edb10b6fba Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Dec 2023 02:47:43 +0000 Subject: [PATCH 060/210] Bump hono from 3.10.4 to 3.11.7 in /frameworks/JavaScript/hono Bumps [hono](https://github.com/honojs/hono) from 3.10.4 to 3.11.7. - [Release notes](https://github.com/honojs/hono/releases) - [Commits](https://github.com/honojs/hono/compare/v3.10.4...v3.11.7) --- updated-dependencies: - dependency-name: hono dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/JavaScript/hono/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/JavaScript/hono/package-lock.json b/frameworks/JavaScript/hono/package-lock.json index 880318c08bf..fe0163ffcf6 100644 --- a/frameworks/JavaScript/hono/package-lock.json +++ b/frameworks/JavaScript/hono/package-lock.json @@ -23,9 +23,9 @@ } }, "node_modules/hono": { - "version": "3.10.4", - "resolved": "https://registry.npmjs.org/hono/-/hono-3.10.4.tgz", - "integrity": "sha512-2LJd+a3qyvSuyFlyJSRN1CeH5wg6/Rjua/5L5gdT1W+4U7EUZtnHph74klbyysGg69sfZNXsIrR7PJWSjf2Vww==", + "version": "3.11.7", + "resolved": "https://registry.npmjs.org/hono/-/hono-3.11.7.tgz", + "integrity": "sha512-TcfAq7IdipF+9coxnuzYlSSBXbm9mTyWjjagLCv/2ampboNcKJdi+XCK5G48mHQtpI5+9Rj3J4FfcGgw9vzIww==", "engines": { "node": ">=16.0.0" } From a80dead6ca8b8410887480a654bce30e02bdcf5b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 15 Dec 2023 03:56:45 +0000 Subject: [PATCH 061/210] Bump zerocopy from 0.7.30 to 0.7.31 in /frameworks/Rust/trillium Bumps [zerocopy](https://github.com/google/zerocopy) from 0.7.30 to 0.7.31. - [Release notes](https://github.com/google/zerocopy/releases) - [Changelog](https://github.com/google/zerocopy/blob/main/CHANGELOG.md) - [Commits](https://github.com/google/zerocopy/compare/v0.7.30...v0.7.31) --- updated-dependencies: - dependency-name: zerocopy dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Rust/trillium/Cargo.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frameworks/Rust/trillium/Cargo.lock b/frameworks/Rust/trillium/Cargo.lock index 86433bda069..493be2a5d5d 100644 --- a/frameworks/Rust/trillium/Cargo.lock +++ b/frameworks/Rust/trillium/Cargo.lock @@ -3163,18 +3163,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.30" +version = "0.7.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "306dca4455518f1f31635ec308b6b3e4eb1b11758cefafc782827d0aa7acb5c7" +checksum = "1c4061bedbb353041c12f413700357bec76df2c7e2ca8e4df8bac24c6bf68e3d" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.30" +version = "0.7.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be912bf68235a88fbefd1b73415cb218405958d1655b2ece9035a19920bdf6ba" +checksum = "b3c129550b3e6de3fd0ba67ba5c81818f9805e58b8d7fee80a3a59d2c9fc601a" dependencies = [ "proc-macro2", "quote", From ab09496bdd67b87cd6364788b3814974184e1b15 Mon Sep 17 00:00:00 2001 From: Sergio del Amo Date: Mon, 18 Dec 2023 19:31:22 +0100 Subject: [PATCH 062/210] Micronaut Framework 4.2.2 (#8643) --- frameworks/Java/micronaut/gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/micronaut/gradle.properties b/frameworks/Java/micronaut/gradle.properties index b19ea37c70e..a52f36963cb 100644 --- a/frameworks/Java/micronaut/gradle.properties +++ b/frameworks/Java/micronaut/gradle.properties @@ -1 +1 @@ -micronautVersion = 4.2.1 +micronautVersion = 4.2.2 From c03c976ce2e7e1379ce256da6602820264df75ed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Dec 2023 21:58:36 +0000 Subject: [PATCH 063/210] Bump golang.org/x/crypto in /frameworks/Go/fiber/src Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.7.0 to 0.17.0. - [Commits](https://github.com/golang/crypto/compare/v0.7.0...v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Go/fiber/src/go.mod | 6 +++--- frameworks/Go/fiber/src/go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/frameworks/Go/fiber/src/go.mod b/frameworks/Go/fiber/src/go.mod index cc77f3409c8..c15ab7ef7da 100644 --- a/frameworks/Go/fiber/src/go.mod +++ b/frameworks/Go/fiber/src/go.mod @@ -24,8 +24,8 @@ require ( github.com/valyala/fasthttp v1.50.0 // indirect github.com/valyala/tcplisten v1.0.0 // indirect go.uber.org/atomic v1.10.0 // indirect - golang.org/x/crypto v0.7.0 // indirect + golang.org/x/crypto v0.17.0 // indirect golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/text v0.8.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect ) diff --git a/frameworks/Go/fiber/src/go.sum b/frameworks/Go/fiber/src/go.sum index 8781721ebb7..7e2ce92fc6a 100644 --- a/frameworks/Go/fiber/src/go.sum +++ b/frameworks/Go/fiber/src/go.sum @@ -50,8 +50,8 @@ github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7Fw go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/crypto v0.7.0 h1:AvwMYaRytfdeVt3u6mLaxYtErKYjxA2OXjJ1HHq6t3A= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= +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.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= @@ -61,13 +61,13 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/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/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.8.0 h1:57P1ETyNKtuIjB4SRd15iJxuhj8Gc416Y78H3qgMh68= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +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/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= From e35fc4cbc14890b875238b4b7a703c63f295b509 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Dec 2023 22:04:01 +0000 Subject: [PATCH 064/210] Bump golang.org/x/crypto from 0.14.0 to 0.17.0 in /frameworks/Go/hertz Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.14.0 to 0.17.0. - [Commits](https://github.com/golang/crypto/compare/v0.14.0...v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Go/hertz/go.mod | 6 +++--- frameworks/Go/hertz/go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/frameworks/Go/hertz/go.mod b/frameworks/Go/hertz/go.mod index a43ab903201..19b17e73ff9 100644 --- a/frameworks/Go/hertz/go.mod +++ b/frameworks/Go/hertz/go.mod @@ -28,9 +28,9 @@ require ( github.com/tidwall/pretty v1.2.0 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect - golang.org/x/crypto v0.14.0 // indirect + golang.org/x/crypto v0.17.0 // indirect golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect google.golang.org/protobuf v1.28.0 // indirect ) diff --git a/frameworks/Go/hertz/go.sum b/frameworks/Go/hertz/go.sum index fb87f4188a7..f6906e89f83 100644 --- a/frameworks/Go/hertz/go.sum +++ b/frameworks/Go/hertz/go.sum @@ -77,8 +77,8 @@ golang.org/x/arch v0.0.0-20201008161808-52c3e6f60cff/go.mod h1:flIaEI6LNU6xOCD5P golang.org/x/arch v0.0.0-20210923205945-b76863e36670 h1:18EFjUmQOcUvxNYSkA6jO9VAiXCnxFY6NyDX0bHDmkU= golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +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.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= @@ -86,11 +86,11 @@ golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/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/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.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.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +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/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= From 6310d78804f7f1652c6072d3248bcf61fa69fb9c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Dec 2023 22:11:35 +0000 Subject: [PATCH 065/210] Bump golang.org/x/crypto in /frameworks/Go/gin/gin-gorm Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.14.0 to 0.17.0. - [Commits](https://github.com/golang/crypto/compare/v0.14.0...v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Go/gin/gin-gorm/go.mod | 6 +++--- frameworks/Go/gin/gin-gorm/go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/frameworks/Go/gin/gin-gorm/go.mod b/frameworks/Go/gin/gin-gorm/go.mod index ff15c7e28ec..79aa8a21d9b 100644 --- a/frameworks/Go/gin/gin-gorm/go.mod +++ b/frameworks/Go/gin/gin-gorm/go.mod @@ -42,10 +42,10 @@ 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.14.0 // indirect + golang.org/x/crypto v0.17.0 // indirect golang.org/x/net v0.17.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect google.golang.org/protobuf v1.30.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/frameworks/Go/gin/gin-gorm/go.sum b/frameworks/Go/gin/gin-gorm/go.sum index 04c15d31cc6..fd948b198df 100644 --- a/frameworks/Go/gin/gin-gorm/go.sum +++ b/frameworks/Go/gin/gin-gorm/go.sum @@ -191,8 +191,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.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +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/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= @@ -220,8 +220,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.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.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/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= @@ -230,8 +230,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +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/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= From bb330a11351d82be1a4dcc460ba75d0f409a5352 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Dec 2023 22:51:42 +0000 Subject: [PATCH 066/210] Bump golang.org/x/crypto in /frameworks/Go/hertz/hertz-gorm Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.0.0-20220722155217-630584e8d5aa to 0.17.0. - [Commits](https://github.com/golang/crypto/commits/v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Go/hertz/hertz-gorm/go.mod | 6 +++--- frameworks/Go/hertz/hertz-gorm/go.sum | 9 ++++++--- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/frameworks/Go/hertz/hertz-gorm/go.mod b/frameworks/Go/hertz/hertz-gorm/go.mod index f284bfed3b6..dcc055b386e 100644 --- a/frameworks/Go/hertz/hertz-gorm/go.mod +++ b/frameworks/Go/hertz/hertz-gorm/go.mod @@ -36,8 +36,8 @@ require ( github.com/tidwall/pretty v1.2.0 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect - golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa // indirect - golang.org/x/sys v0.0.0-20220412211240-33da011f77ad // indirect - golang.org/x/text v0.3.7 // indirect + golang.org/x/crypto v0.17.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect google.golang.org/protobuf v1.28.0 // indirect ) diff --git a/frameworks/Go/hertz/hertz-gorm/go.sum b/frameworks/Go/hertz/hertz-gorm/go.sum index c84b073dce6..3ae8633a97a 100644 --- a/frameworks/Go/hertz/hertz-gorm/go.sum +++ b/frameworks/Go/hertz/hertz-gorm/go.sum @@ -187,8 +187,9 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= 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 h1:zuSxTR4o9y82ebqCUJYNGJbGPo6sKVl54f/TVDObg1c= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +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/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= @@ -214,8 +215,9 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad h1:ntjMns5wyP/fN65tdBD4g8J5w8n015+iIIs9rtjXkY0= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/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/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= @@ -223,8 +225,9 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +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/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= From 072a6596a224db6a377de1dc01729a8468b2a011 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Dec 2023 23:27:18 +0000 Subject: [PATCH 067/210] Bump golang.org/x/crypto in /frameworks/Go/echo/src Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.14.0 to 0.17.0. - [Commits](https://github.com/golang/crypto/compare/v0.14.0...v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Go/echo/src/go.mod | 6 +++--- frameworks/Go/echo/src/go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/frameworks/Go/echo/src/go.mod b/frameworks/Go/echo/src/go.mod index 29ed5d97b1e..35307bb0fec 100644 --- a/frameworks/Go/echo/src/go.mod +++ b/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.14.0 // indirect + golang.org/x/crypto v0.17.0 // indirect golang.org/x/net v0.17.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect ) diff --git a/frameworks/Go/echo/src/go.sum b/frameworks/Go/echo/src/go.sum index 320ff5c30de..c7d3f25fbcf 100644 --- a/frameworks/Go/echo/src/go.sum +++ b/frameworks/Go/echo/src/go.sum @@ -22,18 +22,18 @@ 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.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +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/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.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/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +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/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= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= From 76f69b4e61003bd6d2fa7bd68f79130178d494fd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Dec 2023 08:01:58 -0800 Subject: [PATCH 068/210] Bump golang.org/x/crypto in /frameworks/Go/aah/src/benchmark (#8657) Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.14.0 to 0.17.0. - [Commits](https://github.com/golang/crypto/compare/v0.14.0...v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Go/aah/src/benchmark/go.mod | 6 +++--- frameworks/Go/aah/src/benchmark/go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/frameworks/Go/aah/src/benchmark/go.mod b/frameworks/Go/aah/src/benchmark/go.mod index 26910164c0d..99e5799799d 100644 --- a/frameworks/Go/aah/src/benchmark/go.mod +++ b/frameworks/Go/aah/src/benchmark/go.mod @@ -22,11 +22,11 @@ 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.14.0 // indirect + golang.org/x/crypto v0.17.0 // indirect golang.org/x/net v0.17.0 // indirect golang.org/x/oauth2 v0.0.0-20181003184128-c57b0facaced // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/sys v0.15.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 gopkg.in/go-playground/validator.v9 v9.21.0 // indirect diff --git a/frameworks/Go/aah/src/benchmark/go.sum b/frameworks/Go/aah/src/benchmark/go.sum index 0a70faaf940..060b93b6321 100644 --- a/frameworks/Go/aah/src/benchmark/go.sum +++ b/frameworks/Go/aah/src/benchmark/go.sum @@ -42,8 +42,8 @@ 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.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +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.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= @@ -51,12 +51,12 @@ golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= 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.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.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/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.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +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/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= From b0a102e81c1276dd57dad4225d08f4075a9b48d4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Dec 2023 08:02:31 -0800 Subject: [PATCH 069/210] Bump golang.org/x/crypto in /frameworks/Go/goframe/src (#8656) Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.14.0 to 0.17.0. - [Commits](https://github.com/golang/crypto/compare/v0.14.0...v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Go/goframe/src/go.mod | 6 +++--- frameworks/Go/goframe/src/go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/frameworks/Go/goframe/src/go.mod b/frameworks/Go/goframe/src/go.mod index a14d0d3b7cd..d91287f8994 100644 --- a/frameworks/Go/goframe/src/go.mod +++ b/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.14.0 // indirect + golang.org/x/crypto v0.17.0 // indirect golang.org/x/net v0.17.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/frameworks/Go/goframe/src/go.sum b/frameworks/Go/goframe/src/go.sum index a103d1f9e04..5f299548884 100644 --- a/frameworks/Go/goframe/src/go.sum +++ b/frameworks/Go/goframe/src/go.sum @@ -250,8 +250,8 @@ golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5 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.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +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/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= @@ -302,8 +302,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.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= -golang.org/x/sys v0.13.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/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= @@ -313,8 +313,8 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8-0.20211105212822-18b340fc7af2/go.mod h1:EFNZuWvGYxIRUEX+K8UmCFwYmZjqcrnq15ZuVldZkZ0= -golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= -golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +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/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= From 84958dd3dc6c7662fe4fcc197ca69fcbb695c027 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Dec 2023 08:02:37 -0800 Subject: [PATCH 070/210] Bump golang.org/x/crypto in /frameworks/Go/gin/gin-std (#8655) Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.14.0 to 0.17.0. - [Commits](https://github.com/golang/crypto/compare/v0.14.0...v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Go/gin/gin-std/go.mod | 6 +++--- frameworks/Go/gin/gin-std/go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/frameworks/Go/gin/gin-std/go.mod b/frameworks/Go/gin/gin-std/go.mod index b15771ce3cf..dfb44fc809b 100644 --- a/frameworks/Go/gin/gin-std/go.mod +++ b/frameworks/Go/gin/gin-std/go.mod @@ -27,10 +27,10 @@ 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.14.0 // indirect + golang.org/x/crypto v0.17.0 // indirect golang.org/x/net v0.17.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect google.golang.org/protobuf v1.30.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/frameworks/Go/gin/gin-std/go.sum b/frameworks/Go/gin/gin-std/go.sum index d7c446e32e5..07cb748b008 100644 --- a/frameworks/Go/gin/gin-std/go.sum +++ b/frameworks/Go/gin/gin-std/go.sum @@ -65,16 +65,16 @@ 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.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +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/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.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/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +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/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/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= From d27a3174fcf083f62f2961f3f670514f81a333b9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Dec 2023 08:02:46 -0800 Subject: [PATCH 071/210] Bump golang.org/x/crypto in /frameworks/Go/gin/gin-src (#8653) Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.14.0 to 0.17.0. - [Commits](https://github.com/golang/crypto/compare/v0.14.0...v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Go/gin/gin-src/go.mod | 6 +++--- frameworks/Go/gin/gin-src/go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/frameworks/Go/gin/gin-src/go.mod b/frameworks/Go/gin/gin-src/go.mod index df6aca92639..c5f2daa7ab9 100644 --- a/frameworks/Go/gin/gin-src/go.mod +++ b/frameworks/Go/gin/gin-src/go.mod @@ -26,10 +26,10 @@ 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.14.0 // indirect + golang.org/x/crypto v0.17.0 // indirect golang.org/x/net v0.17.0 // indirect - golang.org/x/sys v0.13.0 // indirect - golang.org/x/text v0.13.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect google.golang.org/protobuf v1.30.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/frameworks/Go/gin/gin-src/go.sum b/frameworks/Go/gin/gin-src/go.sum index 956d69bbd6b..b762cd80a2d 100644 --- a/frameworks/Go/gin/gin-src/go.sum +++ b/frameworks/Go/gin/gin-src/go.sum @@ -64,16 +64,16 @@ 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.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc= -golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= +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/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.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/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +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/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= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= From caeb8c67e43afd312889c5318af07b1dae2eb8d4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Dec 2023 08:02:52 -0800 Subject: [PATCH 072/210] Bump golang.org/x/crypto in /frameworks/Go/webgo/src (#8652) Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.0.0-20220919173607-35f4265a4bc0 to 0.17.0. - [Commits](https://github.com/golang/crypto/commits/v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Go/webgo/src/go.mod | 14 +++++++------- frameworks/Go/webgo/src/go.sum | 18 ++++++------------ 2 files changed, 13 insertions(+), 19 deletions(-) diff --git a/frameworks/Go/webgo/src/go.mod b/frameworks/Go/webgo/src/go.mod index b62bcd8c84a..dedb5b8dbe2 100644 --- a/frameworks/Go/webgo/src/go.mod +++ b/frameworks/Go/webgo/src/go.mod @@ -2,16 +2,16 @@ module webgo go 1.19 -require github.com/JaCoB1123/web v0.5.3 +require ( + github.com/JaCoB1123/web v0.5.3 + github.com/tidwall/sjson v1.2.5 +) require ( - github.com/josharian/intern v1.0.0 // indirect - github.com/mailru/easyjson v0.7.7 // indirect github.com/tidwall/gjson v1.14.3 // indirect github.com/tidwall/match v1.1.1 // indirect github.com/tidwall/pretty v1.2.0 // indirect - github.com/tidwall/sjson v1.2.5 // indirect - golang.org/x/crypto v0.0.0-20220919173607-35f4265a4bc0 // indirect - golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8 // indirect - golang.org/x/term v0.0.0-20220919170432-7a66f970e087 // indirect + golang.org/x/crypto v0.17.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/term v0.15.0 // indirect ) diff --git a/frameworks/Go/webgo/src/go.sum b/frameworks/Go/webgo/src/go.sum index b6addf7bc4b..aa60740b3ad 100644 --- a/frameworks/Go/webgo/src/go.sum +++ b/frameworks/Go/webgo/src/go.sum @@ -1,9 +1,5 @@ github.com/JaCoB1123/web v0.5.3 h1:PLoZorwPqDgRNStHxbbSBXbXdiBDmJP3bgBeFXO8Jhg= github.com/JaCoB1123/web v0.5.3/go.mod h1:wX1fuLSacW6lNgIVFGTyCDsUuDyWa92iy9xXCZCidUU= -github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/gjson v1.14.3 h1:9jvXn7olKEHU1S9vwoMGliaT8jq1vJ7IH/n9zD9Dnlw= github.com/tidwall/gjson v1.14.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= @@ -15,19 +11,17 @@ github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de h1:ikNHVSjEfnvz6sxdSPCaPt572qowuyMDMJLLm3Db3ig= golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20220919173607-35f4265a4bc0 h1:a5Yg6ylndHHYJqIPrdq0AhvR6KTvDTAvgBtaidhEevY= -golang.org/x/crypto v0.0.0-20220919173607-35f4265a4bc0/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +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.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200802091954-4b90ce9b60b3 h1:qDJKu1y/1SjhWac4BQZjLljqvqiWUhjmDMnonmVGDAU= golang.org/x/sys v0.0.0-20200802091954-4b90ce9b60b3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8 h1:h+EGohizhe9XlX18rfpa8k8RAc5XyaeamM+0VHRd4lc= -golang.org/x/sys v0.0.0-20220919091848-fb04ddd9f9c8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20220919170432-7a66f970e087 h1:tPwmk4vmvVCMdr98VgL4JH+qZxPL8fqlUOHnyOM8N3w= -golang.org/x/term v0.0.0-20220919170432-7a66f970e087/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +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/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= From 5c20808d2d0e63c2a3428c1e2c22f516929f4d29 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Dec 2023 08:03:26 -0800 Subject: [PATCH 073/210] Bump golang.org/x/crypto in /frameworks/Go/fasthttp/src (#8651) Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.0.0-20220829220503-c86fa9a7ed90 to 0.17.0. - [Commits](https://github.com/golang/crypto/commits/v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Go/fasthttp/src/go.mod | 6 +++--- frameworks/Go/fasthttp/src/go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/frameworks/Go/fasthttp/src/go.mod b/frameworks/Go/fasthttp/src/go.mod index c02732cecb8..12cf4523a7a 100644 --- a/frameworks/Go/fasthttp/src/go.mod +++ b/frameworks/Go/fasthttp/src/go.mod @@ -22,7 +22,7 @@ require ( github.com/klauspost/compress v1.15.10 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/tcplisten v1.0.0 // indirect - golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 // indirect - golang.org/x/sys v0.0.0-20220915200043-7b5979e65e41 // indirect - golang.org/x/text v0.3.8 // indirect + golang.org/x/crypto v0.17.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect ) diff --git a/frameworks/Go/fasthttp/src/go.sum b/frameworks/Go/fasthttp/src/go.sum index 6511752d850..96ecf56867e 100644 --- a/frameworks/Go/fasthttp/src/go.sum +++ b/frameworks/Go/fasthttp/src/go.sum @@ -151,8 +151,8 @@ golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 h1:Y/gsMcFOcR+6S6f3YeMKl5g+dZMEWqcz5Czj/GWYbkM= -golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +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/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= @@ -181,8 +181,8 @@ golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/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-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220915200043-7b5979e65e41 h1:ohgcoMbSofXygzo6AD2I1kz3BFmW1QArPYTtwEM3UXc= -golang.org/x/sys v0.0.0-20220915200043-7b5979e65e41/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/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/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -192,8 +192,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8 h1:nAL+RVCQ9uMn3vJZbV+MRnydTJFPf8qqY42YiA6MrqY= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +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/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= From 85707cc2d6c5d4ded59487457e4bbed980274d42 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Dec 2023 08:03:39 -0800 Subject: [PATCH 074/210] Bump golang.org/x/crypto in /frameworks/Go/go-std/src (#8650) Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.0.0-20220829220503-c86fa9a7ed90 to 0.17.0. - [Commits](https://github.com/golang/crypto/commits/v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Go/go-std/src/go.mod | 4 ++-- frameworks/Go/go-std/src/go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/frameworks/Go/go-std/src/go.mod b/frameworks/Go/go-std/src/go.mod index ad635fe7e0f..e164c404d53 100644 --- a/frameworks/Go/go-std/src/go.mod +++ b/frameworks/Go/go-std/src/go.mod @@ -21,8 +21,8 @@ require ( github.com/rogpeppe/go-internal v1.9.0 // indirect github.com/shopspring/decimal v1.3.1 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect - golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 // indirect - golang.org/x/text v0.3.8 // indirect + golang.org/x/crypto v0.17.0 // indirect + golang.org/x/text v0.14.0 // indirect gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/yaml.v2 v2.4.0 // indirect ) diff --git a/frameworks/Go/go-std/src/go.sum b/frameworks/Go/go-std/src/go.sum index afe042667a2..6118e45288d 100644 --- a/frameworks/Go/go-std/src/go.sum +++ b/frameworks/Go/go-std/src/go.sum @@ -42,8 +42,8 @@ github.com/valyala/quicktemplate v1.7.0 h1:LUPTJmlVcb46OOUY3IeD9DojFpAVbsG+5WFTc github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/VPSJnLYn+LmLk8= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= -golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 h1:Y/gsMcFOcR+6S6f3YeMKl5g+dZMEWqcz5Czj/GWYbkM= -golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +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.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -52,8 +52,8 @@ golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.8 h1:nAL+RVCQ9uMn3vJZbV+MRnydTJFPf8qqY42YiA6MrqY= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +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/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From 0b4c02619064e50b70e8cde80b77bb6171a08d29 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Dec 2023 08:03:45 -0800 Subject: [PATCH 075/210] Bump golang.org/x/crypto in /frameworks/Go/gearbox/src (#8649) Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.0.0-20220829220503-c86fa9a7ed90 to 0.17.0. - [Commits](https://github.com/golang/crypto/commits/v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Go/gearbox/src/go.mod | 6 +++--- frameworks/Go/gearbox/src/go.sum | 12 ++++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/frameworks/Go/gearbox/src/go.mod b/frameworks/Go/gearbox/src/go.mod index f2a5cc6785b..c87099b6da9 100644 --- a/frameworks/Go/gearbox/src/go.mod +++ b/frameworks/Go/gearbox/src/go.mod @@ -25,7 +25,7 @@ require ( github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasthttp v1.40.0 // indirect github.com/valyala/tcplisten v1.0.0 // indirect - golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 // indirect - golang.org/x/sys v0.0.0-20220915200043-7b5979e65e41 // indirect - golang.org/x/text v0.3.8 // indirect + golang.org/x/crypto v0.17.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect ) diff --git a/frameworks/Go/gearbox/src/go.sum b/frameworks/Go/gearbox/src/go.sum index 9f9e9083572..a5140c570aa 100644 --- a/frameworks/Go/gearbox/src/go.sum +++ b/frameworks/Go/gearbox/src/go.sum @@ -159,8 +159,8 @@ golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 h1:Y/gsMcFOcR+6S6f3YeMKl5g+dZMEWqcz5Czj/GWYbkM= -golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +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/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= @@ -189,8 +189,8 @@ golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/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-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220915200043-7b5979e65e41 h1:ohgcoMbSofXygzo6AD2I1kz3BFmW1QArPYTtwEM3UXc= -golang.org/x/sys v0.0.0-20220915200043-7b5979e65e41/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/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/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -200,8 +200,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8 h1:nAL+RVCQ9uMn3vJZbV+MRnydTJFPf8qqY42YiA6MrqY= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +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/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= From 752b9b840500ac9f10c974f86783bc084d59f1a7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Dec 2023 08:03:52 -0800 Subject: [PATCH 076/210] Bump golang.org/x/crypto in /frameworks/Go/atreugo/src (#8648) Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.0.0-20220829220503-c86fa9a7ed90 to 0.17.0. - [Commits](https://github.com/golang/crypto/commits/v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Go/atreugo/src/go.mod | 15 +-- frameworks/Go/atreugo/src/go.sum | 175 ++----------------------------- 2 files changed, 9 insertions(+), 181 deletions(-) diff --git a/frameworks/Go/atreugo/src/go.mod b/frameworks/Go/atreugo/src/go.mod index 68c2acb94fe..2cff5781a35 100644 --- a/frameworks/Go/atreugo/src/go.mod +++ b/frameworks/Go/atreugo/src/go.mod @@ -3,9 +3,7 @@ module atreugo/src go 1.19 require ( - github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c github.com/jackc/pgx/v5 v5.0.4 - github.com/mailru/easyjson v0.7.7 github.com/savsgio/atreugo/v11 v11.9.7 github.com/valyala/quicktemplate v1.7.0 ) @@ -13,22 +11,15 @@ require ( require ( github.com/andybalholm/brotli v1.0.4 // indirect github.com/fasthttp/router v1.4.12 // indirect - github.com/jackc/chunkreader/v2 v2.0.1 // indirect - github.com/jackc/pgconn v1.13.0 // indirect - github.com/jackc/pgio v1.0.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgproto3/v2 v2.3.1 // indirect github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect - github.com/jackc/pgtype v1.12.0 // indirect - github.com/jackc/puddle v1.3.0 // indirect github.com/jackc/puddle/v2 v2.0.0 // indirect - github.com/josharian/intern v1.0.0 // indirect github.com/klauspost/compress v1.15.10 // indirect github.com/savsgio/gotils v0.0.0-20220530130905-52f3993e8d6d // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasthttp v1.40.0 // indirect github.com/valyala/tcplisten v1.0.0 // indirect - golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 // indirect - golang.org/x/sys v0.0.0-20220915200043-7b5979e65e41 // indirect - golang.org/x/text v0.3.8 // indirect + golang.org/x/crypto v0.17.0 // indirect + golang.org/x/sys v0.15.0 // indirect + golang.org/x/text v0.14.0 // indirect ) diff --git a/frameworks/Go/atreugo/src/go.sum b/frameworks/Go/atreugo/src/go.sum index f30a89a3d8d..1a9bef28670 100644 --- a/frameworks/Go/atreugo/src/go.sum +++ b/frameworks/Go/atreugo/src/go.sum @@ -1,138 +1,38 @@ -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/andybalholm/brotli v1.0.2/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= github.com/andybalholm/brotli v1.0.3/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY= github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/atreugo/mock v0.0.0-20200601091009-13c275b330b0 h1:IVqe9WnancrkICl5HqEfGjrnkQ4+VsU5fodcuFVoG/A= github.com/atreugo/mock v0.0.0-20200601091009-13c275b330b0/go.mod h1:HTHAc8RoZXMVTr6wZQN7Jjm3mYMnbfkqqKdnQgSoe9o= -github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= -github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fasthttp/router v1.4.12 h1:QEgK+UKARaC1bAzJgnIhdUMay6nwp+YFq6VGPlyKN1o= github.com/fasthttp/router v1.4.12/go.mod h1:41Qdc4Z4T2pWVVtATHCnoUnOtxdBoeKEYJTXhHwbxCQ= -github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/gofrs/uuid v4.0.0+incompatible h1:1SD/1F5pU8p29ybwgQSwpQk+mwdRrXCYuPhW6m+TnJw= -github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= -github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= -github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= -github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= -github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= -github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= -github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= -github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= -github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= -github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= -github.com/jackc/pgconn v1.13.0 h1:3L1XMNV2Zvca/8BYhzcRFS70Lr0WlDg16Di6SFGAbys= -github.com/jackc/pgconn v1.13.0/go.mod h1:AnowpAqO4CMIIJNZl2VJp+KrkAZciAkhEl0W0JIobpI= -github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= -github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= -github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= -github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c= -github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc= -github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= -github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= -github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= -github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= -github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= -github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.3.1 h1:nwj7qwf0S+Q7ISFfBndqeLwSwxs+4DPsbRFjECT1Y4Y= -github.com/jackc/pgproto3/v2 v2.3.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg= github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= -github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= -github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= -github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= -github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= -github.com/jackc/pgtype v1.12.0 h1:Dlq8Qvcch7kiehm8wPGIW0W3KsCCHJnRacKW0UM8n5w= -github.com/jackc/pgtype v1.12.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= -github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= -github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= -github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= -github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c h1:Dznn52SgVIVst9UyOT9brctYUgxs+CvVfPaC3jKrA50= -github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= -github.com/jackc/pgx/v4 v4.17.2 h1:0Ut0rpeKwvIVbMQ1KbMBU4h6wxehBI535LK6Flheh8E= -github.com/jackc/pgx/v4 v4.17.2/go.mod h1:lcxIZN44yMIrWI78a5CpucdD14hX0SBDbNRvjDBItsw= github.com/jackc/pgx/v5 v5.0.4 h1:r5O6y84qHX/z/HZV40JBdx2obsHz7/uRj5b+CcYEdeY= github.com/jackc/pgx/v5 v5.0.4/go.mod h1:U0ynklHtgg43fue9Ly30w3OCSTDPlXjig9ghrNGaguQ= -github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.3.0 h1:eHK/5clGOatcjX3oWGBO/MpxpbHzSwud5EWTSCI+MX0= -github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle/v2 v2.0.0 h1:Kwk/AlLigcnZsDssc3Zun1dk1tAtQNPaBBxBHWn0Mjc= github.com/jackc/puddle/v2 v2.0.0/go.mod h1:itE7ZJY8xnoo0JqJEpSMprN0f+NQkMCuEV/N9j8h0oc= -github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= -github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.15.0/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.15.10 h1:Ai8UzuomSCDw90e1qNMtb15msBXsNpH6gzkkENQNcJo= github.com/klauspost/compress v1.15.10/go.mod h1:QPwzmACJjUTFsnSHH934V6woptycfrDDJnH7hvFVbGM= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.10.2 h1:AqzbZs4ZoCBp+GtejcpCpcxM3zlSMx29dXbUSeVtJb8= -github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= -github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= -github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/savsgio/atreugo/v11 v11.9.7 h1:nzd/0G0bkvja7e5/wEb27K/7pXlRcSDmE70WR3Fx9MI= github.com/savsgio/atreugo/v11 v11.9.7/go.mod h1:bziyB6t8H3YQ7mdCUX0ZVFTXo/7ANslmVbfRFM+pJOQ= github.com/savsgio/gotils v0.0.0-20220530130905-52f3993e8d6d h1:Q+gqLBOPkFGHyCJxXMRqtUgUbTjI8/Ze8vu8GGyNFwo= github.com/savsgio/gotils v0.0.0-20220530130905-52f3993e8d6d/go.mod h1:Gy+0tqhJvgGlqnTF8CVGP0AaGRjwBtXs/a5PA0Y3+A4= -github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= -github.com/shopspring/decimal v1.2.0 h1:abSATXmQEYyShuxI4/vyW3tV1MrKAJzCZ/0zLUXYbsQ= -github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.30.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus= @@ -142,93 +42,30 @@ github.com/valyala/quicktemplate v1.7.0 h1:LUPTJmlVcb46OOUY3IeD9DojFpAVbsG+5WFTc github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/VPSJnLYn+LmLk8= github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= -github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= 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.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90 h1:Y/gsMcFOcR+6S6f3YeMKl5g+dZMEWqcz5Czj/GWYbkM= -golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -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= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +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.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= -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= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/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-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220915200043-7b5979e65e41 h1:ohgcoMbSofXygzo6AD2I1kz3BFmW1QArPYTtwEM3UXc= -golang.org/x/sys v0.0.0-20220915200043-7b5979e65e41/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +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/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -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.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8 h1:nAL+RVCQ9uMn3vJZbV+MRnydTJFPf8qqY42YiA6MrqY= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= +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/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= From 23be80bc12ed72d4d60deeccf0772e2d58b0e8a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Robin=20Bj=C3=B6rklin?= Date: Tue, 19 Dec 2023 08:04:03 -0800 Subject: [PATCH 077/210] Bump OCaml framework versions (#8639) * chore: bump OCaml/webmachine versions * chore: bump OCaml/httpaf versions --- frameworks/OCaml/httpaf/dune | 2 +- frameworks/OCaml/httpaf/dune-project | 2 +- frameworks/OCaml/httpaf/httpaf.dockerfile | 2 +- frameworks/OCaml/httpaf/httpaf_unix.ml | 2 +- frameworks/OCaml/webmachine/src/dune-project | 2 +- frameworks/OCaml/webmachine/src/lib.opam | 2 +- frameworks/OCaml/webmachine/src/src/bin/dune | 2 +- frameworks/OCaml/webmachine/src/src/bin/tfb.ml | 8 +++----- frameworks/OCaml/webmachine/src/src/lib/dune | 2 +- frameworks/OCaml/webmachine/src/tfb.opam | 2 +- frameworks/OCaml/webmachine/webmachine.dockerfile | 2 +- 11 files changed, 13 insertions(+), 15 deletions(-) diff --git a/frameworks/OCaml/httpaf/dune b/frameworks/OCaml/httpaf/dune index cf1034755fc..53113e9c4fa 100644 --- a/frameworks/OCaml/httpaf/dune +++ b/frameworks/OCaml/httpaf/dune @@ -1,3 +1,3 @@ (executable (name httpaf_unix) - (libraries httpaf httpaf-lwt-unix lwt lwt.unix yojson)) + (libraries httpaf httpaf-lwt-unix lwt lwt.unix yojson unix)) diff --git a/frameworks/OCaml/httpaf/dune-project b/frameworks/OCaml/httpaf/dune-project index 45acd3f0884..f8af889136b 100644 --- a/frameworks/OCaml/httpaf/dune-project +++ b/frameworks/OCaml/httpaf/dune-project @@ -1 +1 @@ -(lang dune 2.7) +(lang dune 3.9) diff --git a/frameworks/OCaml/httpaf/httpaf.dockerfile b/frameworks/OCaml/httpaf/httpaf.dockerfile index 6ed2757d48a..4921ba7d828 100644 --- a/frameworks/OCaml/httpaf/httpaf.dockerfile +++ b/frameworks/OCaml/httpaf/httpaf.dockerfile @@ -2,7 +2,7 @@ # https://github.com/rbjorklin/techempower-ocaml-image # Use pre-built image with all dependencies for faster test times -FROM rbjorklin/techempower-ocaml-image:4.14.1-4bf86567 +FROM rbjorklin/techempower-ocaml-image:5.1.1-b58c72ee # https://caml.inria.fr/pub/docs/manual-ocaml/libref/Gc.html # https://linux.die.net/man/1/ocamlrun diff --git a/frameworks/OCaml/httpaf/httpaf_unix.ml b/frameworks/OCaml/httpaf/httpaf_unix.ml index 44aa15693d0..9fba87e2f61 100644 --- a/frameworks/OCaml/httpaf/httpaf_unix.ml +++ b/frameworks/OCaml/httpaf/httpaf_unix.ml @@ -170,7 +170,7 @@ let main () = accept_loop socket handler); let forever, _ = Lwt.wait () in Lwt_main.run forever; - exit 0 ) + exit 0) done; while true do diff --git a/frameworks/OCaml/webmachine/src/dune-project b/frameworks/OCaml/webmachine/src/dune-project index 661d1e52345..51333bb4e2c 100644 --- a/frameworks/OCaml/webmachine/src/dune-project +++ b/frameworks/OCaml/webmachine/src/dune-project @@ -1,4 +1,4 @@ -(lang dune 2.7) +(lang dune 3.9) (name webmachine-tfb) (generate_opam_files true) diff --git a/frameworks/OCaml/webmachine/src/lib.opam b/frameworks/OCaml/webmachine/src/lib.opam index 33e1ae6314d..30749f8a281 100644 --- a/frameworks/OCaml/webmachine/src/lib.opam +++ b/frameworks/OCaml/webmachine/src/lib.opam @@ -6,7 +6,7 @@ license: "MIT" homepage: "https://github.com/TechEmpower/FrameworkBenchmarks" bug-reports: "https://github.com/TechEmpower/FrameworkBenchmarks/issues" depends: [ - "dune" {>= "2.7" & >= "2.8.5"} + "dune" {>= "3.9" & >= "2.8.5"} "biniou" {>= "1.2.1"} "yojson" {>= "1.7.0"} "atd" {>= "2.2.1"} diff --git a/frameworks/OCaml/webmachine/src/src/bin/dune b/frameworks/OCaml/webmachine/src/src/bin/dune index ccf1f4dfeea..bd8333f4c19 100644 --- a/frameworks/OCaml/webmachine/src/src/bin/dune +++ b/frameworks/OCaml/webmachine/src/src/bin/dune @@ -1,5 +1,5 @@ (executable - (libraries webmachine lwt cohttp-lwt-unix caqti caqti-lwt caqti-driver-postgresql yojson atdgen-runtime lib) + (libraries webmachine lwt cohttp-lwt-unix caqti caqti-lwt caqti-driver-postgresql yojson atdgen-runtime lib unix) (preprocess (pps lwt_ppx)) (public_name tfb) (package tfb) diff --git a/frameworks/OCaml/webmachine/src/src/bin/tfb.ml b/frameworks/OCaml/webmachine/src/src/bin/tfb.ml index 4cdd891a077..62ec6626ff1 100644 --- a/frameworks/OCaml/webmachine/src/src/bin/tfb.ml +++ b/frameworks/OCaml/webmachine/src/src/bin/tfb.ml @@ -39,14 +39,13 @@ let or_error m = Error (Database_error (Caqti_error.show err)) |> Lwt.return let select_random = - Caqti_request.find Caqti_type.int - Caqti_type.(tup2 int int) + let open Caqti_request.Infix in + Caqti_type.(int ->! tup2 int int) "SELECT id, randomNumber FROM World WHERE id = $1" class hello = object (self) inherit [Cohttp_lwt.Body.t] Wm.resource - method! allowed_methods rd = Wm.continue [ `GET ] rd method content_types_provided rd = @@ -68,7 +67,6 @@ class hello = class db = object (self) inherit [Cohttp_lwt.Body.t] Wm.resource - method! allowed_methods rd = Wm.continue [ `GET ] rd method content_types_provided rd = @@ -228,7 +226,7 @@ let main () = Lwt.async (fun () -> Server.create ~mode:(`TCP (`Socket socket)) config); let forever, _ = Lwt.wait () in Lwt_main.run forever; - exit 0 ) + exit 0) done; while true do Unix.pause () diff --git a/frameworks/OCaml/webmachine/src/src/lib/dune b/frameworks/OCaml/webmachine/src/src/lib/dune index b67e786ee29..a9ced8d93a2 100644 --- a/frameworks/OCaml/webmachine/src/src/lib/dune +++ b/frameworks/OCaml/webmachine/src/src/lib/dune @@ -1,7 +1,7 @@ (library (name lib) (public_name lib) - (libraries yojson atdgen-runtime) + (libraries yojson atdgen-runtime unix) (preprocess (pps lwt_ppx))) (rule diff --git a/frameworks/OCaml/webmachine/src/tfb.opam b/frameworks/OCaml/webmachine/src/tfb.opam index d587a0d7eba..ebbb400201e 100644 --- a/frameworks/OCaml/webmachine/src/tfb.opam +++ b/frameworks/OCaml/webmachine/src/tfb.opam @@ -6,7 +6,7 @@ license: "MIT" homepage: "https://github.com/TechEmpower/FrameworkBenchmarks" bug-reports: "https://github.com/TechEmpower/FrameworkBenchmarks/issues" depends: [ - "dune" {>= "2.7" & >= "2.8.5"} + "dune" {>= "3.9" & >= "2.8.5"} "webmachine" {>= "0.7.0"} "lwt" {>= "5.4.1"} "conf-libev" {>= "4-12"} diff --git a/frameworks/OCaml/webmachine/webmachine.dockerfile b/frameworks/OCaml/webmachine/webmachine.dockerfile index b0059706392..ab3f373c8c4 100644 --- a/frameworks/OCaml/webmachine/webmachine.dockerfile +++ b/frameworks/OCaml/webmachine/webmachine.dockerfile @@ -1,6 +1,6 @@ # https://github.com/rbjorklin/techempower-ocaml-image # Use pre-built image with all dependencies for faster test times -FROM rbjorklin/techempower-ocaml-image:4.14.1-4bf86567 +FROM rbjorklin/techempower-ocaml-image:5.1.1-b58c72ee ENV DIR project From cedcbfda61850aac481962abe96b2f686ef3580f Mon Sep 17 00:00:00 2001 From: Chrislearn Young Date: Wed, 20 Dec 2023 00:04:41 +0800 Subject: [PATCH 078/210] [Salvo] Update version to 0.63.x (#8637) --- frameworks/Rust/salvo/Cargo.toml | 10 +++++----- frameworks/Rust/salvo/salvo-diesel.dockerfile | 2 +- frameworks/Rust/salvo/salvo-lru.dockerfile | 2 +- frameworks/Rust/salvo/salvo-mongo-raw.dockerfile | 2 +- frameworks/Rust/salvo/salvo-mongo.dockerfile | 2 +- frameworks/Rust/salvo/salvo-pg-pool.dockerfile | 2 +- frameworks/Rust/salvo/salvo-pg.dockerfile | 2 +- frameworks/Rust/salvo/salvo-sqlx.dockerfile | 2 +- frameworks/Rust/salvo/salvo.dockerfile | 2 +- 9 files changed, 13 insertions(+), 13 deletions(-) diff --git a/frameworks/Rust/salvo/Cargo.toml b/frameworks/Rust/salvo/Cargo.toml index 82b6107eb70..8425ce6f8ce 100644 --- a/frameworks/Rust/salvo/Cargo.toml +++ b/frameworks/Rust/salvo/Cargo.toml @@ -40,16 +40,16 @@ anyhow = "1" async-trait = "0.1" bytes = "1" diesel = { version = "2", features = ["postgres", "r2d2"] } -deadpool = { version = "0.9", features = ["rt_tokio_1", "serde", "async-trait", "managed"] } -deadpool-postgres = "0.10" +deadpool = { version = "0.10", features = ["rt_tokio_1", "serde", "async-trait", "managed"] } +deadpool-postgres = "0.11" futures-util = "0.3" -lru = "0.11.0" -markup = "0.13" +lru = "0.12.0" +markup = "0.15" # mimalloc = { version = "0.1", default-features = false } mongodb = { version = "2.4.0", features = ["zstd-compression", "snappy-compression", "zlib-compression"] } once_cell = "1" rand = { version = "0.8", features = ["min_const_gen", "small_rng"] } -salvo = { version = "0.55", default-features = false, features = ["anyhow", "http1", "affix"] } +salvo = { version = "0.63", default-features = false, features = ["anyhow", "http1", "affix"] } serde = { version = "1", features = ["derive"] } serde_json = "1" # smallvec = "1" diff --git a/frameworks/Rust/salvo/salvo-diesel.dockerfile b/frameworks/Rust/salvo/salvo-diesel.dockerfile index 9a1538291c4..81a2dbaa0a8 100644 --- a/frameworks/Rust/salvo/salvo-diesel.dockerfile +++ b/frameworks/Rust/salvo/salvo-diesel.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.72 +FROM rust:1.74 ENV TECHEMPOWER_POSTGRES_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world ENV TECHEMPOWER_MAX_POOL_SIZE=28 diff --git a/frameworks/Rust/salvo/salvo-lru.dockerfile b/frameworks/Rust/salvo/salvo-lru.dockerfile index 6c21d0630d7..8cb63d2c03e 100644 --- a/frameworks/Rust/salvo/salvo-lru.dockerfile +++ b/frameworks/Rust/salvo/salvo-lru.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.72 +FROM rust:1.74 ENV TECHEMPOWER_POSTGRES_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world diff --git a/frameworks/Rust/salvo/salvo-mongo-raw.dockerfile b/frameworks/Rust/salvo/salvo-mongo-raw.dockerfile index 93d580b6098..ca7a5c8b495 100644 --- a/frameworks/Rust/salvo/salvo-mongo-raw.dockerfile +++ b/frameworks/Rust/salvo/salvo-mongo-raw.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.72 +FROM rust:1.74 ENV TECHEMPOWER_MONGODB_URL=mongodb://tfb-database:27017 ENV TECHEMPOWER_MAX_POOL_SIZE=28 diff --git a/frameworks/Rust/salvo/salvo-mongo.dockerfile b/frameworks/Rust/salvo/salvo-mongo.dockerfile index fe92c417c15..77fccfa0a50 100644 --- a/frameworks/Rust/salvo/salvo-mongo.dockerfile +++ b/frameworks/Rust/salvo/salvo-mongo.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.72 +FROM rust:1.74 ENV TECHEMPOWER_MONGODB_URL=mongodb://tfb-database:27017 ENV TECHEMPOWER_MAX_POOL_SIZE=28 diff --git a/frameworks/Rust/salvo/salvo-pg-pool.dockerfile b/frameworks/Rust/salvo/salvo-pg-pool.dockerfile index 4ce679efee2..40947697908 100644 --- a/frameworks/Rust/salvo/salvo-pg-pool.dockerfile +++ b/frameworks/Rust/salvo/salvo-pg-pool.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.72 +FROM rust:1.74 ENV TECHEMPOWER_POSTGRES_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world ENV TECHEMPOWER_MAX_POOL_SIZE=28 diff --git a/frameworks/Rust/salvo/salvo-pg.dockerfile b/frameworks/Rust/salvo/salvo-pg.dockerfile index a694661fc8c..b4c10866c21 100644 --- a/frameworks/Rust/salvo/salvo-pg.dockerfile +++ b/frameworks/Rust/salvo/salvo-pg.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.72 +FROM rust:1.74 ENV TECHEMPOWER_POSTGRES_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world diff --git a/frameworks/Rust/salvo/salvo-sqlx.dockerfile b/frameworks/Rust/salvo/salvo-sqlx.dockerfile index a947139d101..d3d0f56080b 100644 --- a/frameworks/Rust/salvo/salvo-sqlx.dockerfile +++ b/frameworks/Rust/salvo/salvo-sqlx.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.72 +FROM rust:1.74 ENV TECHEMPOWER_POSTGRES_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world ENV TECHEMPOWER_MAX_POOL_SIZE=56 diff --git a/frameworks/Rust/salvo/salvo.dockerfile b/frameworks/Rust/salvo/salvo.dockerfile index 1e88321d350..186f5d755ee 100644 --- a/frameworks/Rust/salvo/salvo.dockerfile +++ b/frameworks/Rust/salvo/salvo.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.72 +FROM rust:1.74 ADD ./ /salvo WORKDIR /salvo From a044f4251345c6a089801e1bb4faf49daa11b505 Mon Sep 17 00:00:00 2001 From: Shreyas Jejurkar Date: Tue, 19 Dec 2023 21:35:05 +0530 Subject: [PATCH 079/210] feat: Upgrade ASP.NET Core benchmarks to .NET 8 (#8558) * feat: Upgrade ASP.NET Core benchmarks to .NET 8 * feat: upgrade mono based benchmarks to 8 * change to net8 * added the attribute to check * address warnings * remove unused usings * checking other way to check * update package versions for mono * update packages for aspnetcore * Revert "update package versions for mono" This reverts commit 8ae8d00ceaefef0828aff3b95cfcf975dfa13b6e. * Revert "checking other way to check" This reverts commit 51ed21c38bfe56973a3c8cec3aba3e80fe2d6421. * Revert "remove unused usings" This reverts commit 325ad9ed9e8172a4c7c28047e296051ee971fca0. * Revert "address warnings" This reverts commit 75c577008698bb5567a464280731095bfe056be5. * Revert "added the attribute to check" This reverts commit 75c9f37b2d1d8ddf289e64ad02b16744b2ac5085. * Revert "change to net8" This reverts commit 94a719af971890bc458cfc64040ca3b6ddf43552. * Revert "feat: upgrade mono based benchmarks to 8" This reverts commit e5fed6e99153331c0ae3830479ede69d6cd3b990. * update package to 8 as its now available. * upgrade missed package * upgrade npgsql * add missing quote --- frameworks/CSharp/aspnetcore/aspnetcore-minimal.dockerfile | 4 ++-- frameworks/CSharp/aspnetcore/aspnetcore-mvc.dockerfile | 4 ++-- frameworks/CSharp/aspnetcore/aspnetcore-mysql.dockerfile | 4 ++-- frameworks/CSharp/aspnetcore/aspnetcore.dockerfile | 4 ++-- frameworks/CSharp/aspnetcore/src/Minimal/Minimal.csproj | 4 ++-- frameworks/CSharp/aspnetcore/src/Platform/Platform.csproj | 6 +++--- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/frameworks/CSharp/aspnetcore/aspnetcore-minimal.dockerfile b/frameworks/CSharp/aspnetcore/aspnetcore-minimal.dockerfile index 0a6f94bd171..5ab25aa2bb9 100644 --- a/frameworks/CSharp/aspnetcore/aspnetcore-minimal.dockerfile +++ b/frameworks/CSharp/aspnetcore/aspnetcore-minimal.dockerfile @@ -1,9 +1,9 @@ -FROM mcr.microsoft.com/dotnet/sdk:8.0.100-rc.2 AS build +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /app COPY src/Minimal . RUN dotnet publish -c Release -o out -FROM mcr.microsoft.com/dotnet/aspnet:8.0.0-rc.2 AS runtime +FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime ENV URLS http://+:8080 WORKDIR /app diff --git a/frameworks/CSharp/aspnetcore/aspnetcore-mvc.dockerfile b/frameworks/CSharp/aspnetcore/aspnetcore-mvc.dockerfile index ae592c1e2ed..b0d126973cb 100644 --- a/frameworks/CSharp/aspnetcore/aspnetcore-mvc.dockerfile +++ b/frameworks/CSharp/aspnetcore/aspnetcore-mvc.dockerfile @@ -1,9 +1,9 @@ -FROM mcr.microsoft.com/dotnet/sdk:8.0.100-rc.2 AS build +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /app COPY src/Mvc . RUN dotnet publish -c Release -o out -FROM mcr.microsoft.com/dotnet/aspnet:8.0.0-rc.2 AS runtime +FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime ENV URLS http://+:8080 WORKDIR /app diff --git a/frameworks/CSharp/aspnetcore/aspnetcore-mysql.dockerfile b/frameworks/CSharp/aspnetcore/aspnetcore-mysql.dockerfile index 628eb43c57b..505414aa173 100644 --- a/frameworks/CSharp/aspnetcore/aspnetcore-mysql.dockerfile +++ b/frameworks/CSharp/aspnetcore/aspnetcore-mysql.dockerfile @@ -1,9 +1,9 @@ -FROM mcr.microsoft.com/dotnet/sdk:8.0.100-rc.2 AS build +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /app COPY src/Platform . RUN dotnet publish -c Release -o out /p:DatabaseProvider=MySqlConnector -FROM mcr.microsoft.com/dotnet/aspnet:8.0.0-rc.2 AS runtime +FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime ENV URLS http://+:8080 WORKDIR /app diff --git a/frameworks/CSharp/aspnetcore/aspnetcore.dockerfile b/frameworks/CSharp/aspnetcore/aspnetcore.dockerfile index d1e50dd88e0..5a846103428 100644 --- a/frameworks/CSharp/aspnetcore/aspnetcore.dockerfile +++ b/frameworks/CSharp/aspnetcore/aspnetcore.dockerfile @@ -1,9 +1,9 @@ -FROM mcr.microsoft.com/dotnet/sdk:8.0.100-rc.2 AS build +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /app COPY src/Platform . RUN dotnet publish -c Release -o out /p:DatabaseProvider=Npgsql -FROM mcr.microsoft.com/dotnet/aspnet:8.0.0-rc.2 AS runtime +FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime ENV URLS http://+:8080 WORKDIR /app diff --git a/frameworks/CSharp/aspnetcore/src/Minimal/Minimal.csproj b/frameworks/CSharp/aspnetcore/src/Minimal/Minimal.csproj index d0262bd6d69..5ee139c7d58 100644 --- a/frameworks/CSharp/aspnetcore/src/Minimal/Minimal.csproj +++ b/frameworks/CSharp/aspnetcore/src/Minimal/Minimal.csproj @@ -9,8 +9,8 @@ - - + + diff --git a/frameworks/CSharp/aspnetcore/src/Platform/Platform.csproj b/frameworks/CSharp/aspnetcore/src/Platform/Platform.csproj index c826ee1320b..53a605ba86c 100644 --- a/frameworks/CSharp/aspnetcore/src/Platform/Platform.csproj +++ b/frameworks/CSharp/aspnetcore/src/Platform/Platform.csproj @@ -18,9 +18,9 @@ - - - + + + From dadf479adb1bccdd911a32f8bac4137fba5432e6 Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Wed, 3 Jan 2024 21:37:24 +0100 Subject: [PATCH 080/210] [ruby/grape] Reduce connection pool size (#8568) I got the following results locally: ``` +--------+---------+------+-----+-----+-----+-------+--------------+ |threads |plaintext|update| json| db|query|fortune|weighted_score| +--------+---------+------+-----+-----+-----+-------+--------------+ |master | 30018| 5669|51864|20665|10083| | 699| |5 | 19278| 7043|50914|23169|11094| | 817| |3 | 21420| 7287|46779|23205|10921| | 826| |2 | 22695| 7981|48680|24954|11535| | 892| +--------+---------+------+-----+-----+-----+-------+--------------+ ``` --- frameworks/Ruby/grape/config.ru | 1 + frameworks/Ruby/grape/config/database.yml | 2 +- frameworks/Ruby/grape/config/puma.rb | 4 +++- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/frameworks/Ruby/grape/config.ru b/frameworks/Ruby/grape/config.ru index 7ea5bc40e14..1bd2494c83f 100644 --- a/frameworks/Ruby/grape/config.ru +++ b/frameworks/Ruby/grape/config.ru @@ -1,6 +1,7 @@ require 'erb' require 'active_record' require 'yaml' +require_relative 'config/auto_tune' MAX_PK = 10_000 QUERIES_MIN = 1 diff --git a/frameworks/Ruby/grape/config/database.yml b/frameworks/Ruby/grape/config/database.yml index f69080e07bd..40b271b409a 100644 --- a/frameworks/Ruby/grape/config/database.yml +++ b/frameworks/Ruby/grape/config/database.yml @@ -5,5 +5,5 @@ production: database: hello_world username: benchmarkdbuser password: benchmarkdbpass - pool: 512 + pool: 2 timeout: 5000 diff --git a/frameworks/Ruby/grape/config/puma.rb b/frameworks/Ruby/grape/config/puma.rb index efde35cd784..b187587b799 100644 --- a/frameworks/Ruby/grape/config/puma.rb +++ b/frameworks/Ruby/grape/config/puma.rb @@ -4,7 +4,9 @@ num_workers, num_threads = auto_tune workers num_workers -threads num_threads, num_threads + +threads 2, 2 + # Use the `preload_app!` method when specifying a `workers` number. # This directive tells Puma to first boot the application and load code # before forking the application. This takes advantage of Copy On Write From 4895b0562b87d7c501ba53510af7ba3547054f4b Mon Sep 17 00:00:00 2001 From: Francesco Nigro Date: Wed, 3 Jan 2024 21:38:35 +0100 Subject: [PATCH 081/210] Quarkus Vertx + PgClient and renaming (#8606) --- frameworks/Java/quarkus/benchmark_config.json | 51 ++++- frameworks/Java/quarkus/config.toml | 34 +++ frameworks/Java/quarkus/pom.xml | 2 + .../quarkus-hibernate-reactive.dockerfile | 2 + ...uarkus-reactive-routes-pgclient.dockerfile | 45 ++++ .../Java/quarkus/quarkus-vertx.dockerfile | 45 ++++ frameworks/Java/quarkus/quarkus.dockerfile | 2 + .../quarkus/reactive-routes-pgclient/pom.xml | 86 ++++++++ .../benchmark/filter/ServerHeaderFilter.java | 36 +++ .../io/quarkus/benchmark/model/Fortune.java | 25 +++ .../io/quarkus/benchmark/model/World.java | 29 +++ .../repository/FortuneRepository.java | 29 +++ .../benchmark/repository/PgClientFactory.java | 58 +++++ .../benchmark/repository/PgClients.java | 33 +++ .../benchmark/repository/WorldRepository.java | 59 +++++ .../benchmark/resource/BaseResource.java | 32 +++ .../benchmark/resource/DbResource.java | 102 +++++++++ .../benchmark/resource/FortuneResource.java | 43 ++++ .../benchmark/resource/JsonMessage.java | 12 + .../benchmark/resource/JsonResource.java | 17 ++ .../benchmark/resource/PlaintextResource.java | 24 ++ .../benchmark/rocker/RawRockerOutput.java | 65 ++++++ .../rocker/VertxRawRockerOutput.java | 15 ++ .../rocker/VertxRawRockerOutputFactories.java | 29 +++ .../src/main/resources/application.properties | 11 + .../src/main/resources/import.sql | 1 + .../main/resources/views/Fortunes.rocker.html | 8 + frameworks/Java/quarkus/run_quarkus.sh | 1 + frameworks/Java/quarkus/vertx/pom.xml | 83 +++++++ .../filter/HttpResponseDecorator.java | 40 ++++ .../io/quarkus/benchmark/model/Fortune.java | 24 ++ .../quarkus/benchmark/model/JsonMessage.java | 12 + .../io/quarkus/benchmark/model/World.java | 24 ++ .../repository/FortuneRepository.java | 44 ++++ .../benchmark/repository/PgClientFactory.java | 67 ++++++ .../repository/PgConnectionPool.java | 208 ++++++++++++++++++ .../benchmark/repository/WorldRepository.java | 187 ++++++++++++++++ .../benchmark/resource/DbHttpHandler.java | 30 +++ .../resource/FortunesHttpHandler.java | 34 +++ .../resource/HttpQueryParameterUtils.java | 20 ++ .../benchmark/resource/HttpRoutes.java | 109 +++++++++ .../benchmark/resource/JsonHttpHandler.java | 21 ++ .../resource/PlaintextHttpHandler.java | 24 ++ .../resource/QueriesHttpHandler.java | 28 +++ .../benchmark/resource/UpdateHttpHandler.java | 29 +++ .../benchmark/rocker/RawRockerOutput.java | 65 ++++++ .../rocker/VertxRawRockerOutput.java | 15 ++ .../rocker/VertxRawRockerOutputFactories.java | 29 +++ .../src/main/resources/application.properties | 10 + .../vertx/src/main/resources/import.sql | 1 + .../main/resources/views/Fortunes.rocker.html | 8 + 51 files changed, 2006 insertions(+), 2 deletions(-) create mode 100644 frameworks/Java/quarkus/quarkus-reactive-routes-pgclient.dockerfile create mode 100644 frameworks/Java/quarkus/quarkus-vertx.dockerfile create mode 100644 frameworks/Java/quarkus/reactive-routes-pgclient/pom.xml create mode 100644 frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/filter/ServerHeaderFilter.java create mode 100644 frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/model/Fortune.java create mode 100644 frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/model/World.java create mode 100644 frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/repository/FortuneRepository.java create mode 100644 frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/repository/PgClientFactory.java create mode 100644 frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/repository/PgClients.java create mode 100644 frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/repository/WorldRepository.java create mode 100644 frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/BaseResource.java create mode 100644 frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/DbResource.java create mode 100644 frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/FortuneResource.java create mode 100644 frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/JsonMessage.java create mode 100644 frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/JsonResource.java create mode 100644 frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/PlaintextResource.java create mode 100644 frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/rocker/RawRockerOutput.java create mode 100644 frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/rocker/VertxRawRockerOutput.java create mode 100644 frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/rocker/VertxRawRockerOutputFactories.java create mode 100644 frameworks/Java/quarkus/reactive-routes-pgclient/src/main/resources/application.properties create mode 100644 frameworks/Java/quarkus/reactive-routes-pgclient/src/main/resources/import.sql create mode 100644 frameworks/Java/quarkus/reactive-routes-pgclient/src/main/resources/views/Fortunes.rocker.html create mode 100644 frameworks/Java/quarkus/vertx/pom.xml create mode 100644 frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/filter/HttpResponseDecorator.java create mode 100644 frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/model/Fortune.java create mode 100644 frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/model/JsonMessage.java create mode 100644 frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/model/World.java create mode 100644 frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/repository/FortuneRepository.java create mode 100644 frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/repository/PgClientFactory.java create mode 100644 frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/repository/PgConnectionPool.java create mode 100644 frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/repository/WorldRepository.java create mode 100644 frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/resource/DbHttpHandler.java create mode 100644 frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/resource/FortunesHttpHandler.java create mode 100644 frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/resource/HttpQueryParameterUtils.java create mode 100644 frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/resource/HttpRoutes.java create mode 100644 frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/resource/JsonHttpHandler.java create mode 100644 frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/resource/PlaintextHttpHandler.java create mode 100644 frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/resource/QueriesHttpHandler.java create mode 100644 frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/resource/UpdateHttpHandler.java create mode 100644 frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/rocker/RawRockerOutput.java create mode 100644 frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/rocker/VertxRawRockerOutput.java create mode 100644 frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/rocker/VertxRawRockerOutputFactories.java create mode 100644 frameworks/Java/quarkus/vertx/src/main/resources/application.properties create mode 100644 frameworks/Java/quarkus/vertx/src/main/resources/import.sql create mode 100644 frameworks/Java/quarkus/vertx/src/main/resources/views/Fortunes.rocker.html diff --git a/frameworks/Java/quarkus/benchmark_config.json b/frameworks/Java/quarkus/benchmark_config.json index 9b838d3e98a..dd7fa017935 100644 --- a/frameworks/Java/quarkus/benchmark_config.json +++ b/frameworks/Java/quarkus/benchmark_config.json @@ -1,5 +1,6 @@ { "framework": "quarkus", + "maintainers": ["franz1981", "Sanne", "geoand"], "tests": [ { "default": { @@ -21,7 +22,7 @@ "webserver": "Vert.x", "os": "Linux", "database_os": "Linux", - "display_name": "Quarkus, Hibernate ORM", + "display_name": "Quarkus, Hibernate", "notes": "", "versus": "Netty" }, @@ -44,9 +45,55 @@ "webserver": "Vert.x", "os": "Linux", "database_os": "Linux", - "display_name": "Quarkus, Hibernate Reactive", + "display_name": "Quarkus, Reactive", "notes": "", "versus": "Netty" + }, + "vertx": { + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries?queries=", + "update_url": "/updates?queries=", + "fortune_url": "/fortunes", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "database": "Postgres", + "framework": "Quarkus", + "language": "Java", + "flavor": "None", + "orm": "Raw", + "platform": "Vert.x", + "webserver": "Vert.x", + "os": "Linux", + "database_os": "Linux", + "display_name": "Quarkus, Vert.x", + "notes": "", + "versus": "Vert.x" + }, + "reactive-routes-pgclient": { + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries?queries=", + "update_url": "/updates?queries=", + "fortune_url": "/fortunes", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "fullstack", + "database": "Postgres", + "framework": "Quarkus", + "language": "Java", + "flavor": "None", + "orm": "Raw", + "platform": "Vert.x", + "webserver": "Vert.x", + "os": "Linux", + "database_os": "Linux", + "display_name": "Quarkus, PostgreSQL", + "notes": "", + "versus": "Vert.x" } } ] diff --git a/frameworks/Java/quarkus/config.toml b/frameworks/Java/quarkus/config.toml index f6281628ac5..a11c64b4d76 100644 --- a/frameworks/Java/quarkus/config.toml +++ b/frameworks/Java/quarkus/config.toml @@ -34,3 +34,37 @@ orm = "Full" platform = "RESTEasy Reactive" webserver = "Vert.x" versus = "Netty" + +[vertx] +urls.plaintext = "/plaintext" +urls.json = "/json" +urls.db = "/db" +urls.query = "/queries?queries=" +urls.update = "/updates?queries=" +urls.fortune = "/fortunes" +approach = "Realistic" +classification = "Micro" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "Vert.x" +webserver = "Vert.x" +versus = "Vert.x" + +[reactive-routes-pgclient] +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 = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "Vert.x" +webserver = "Vert.x" +versus = "Vert.x" diff --git a/frameworks/Java/quarkus/pom.xml b/frameworks/Java/quarkus/pom.xml index b0d16552e18..0739e3171f7 100644 --- a/frameworks/Java/quarkus/pom.xml +++ b/frameworks/Java/quarkus/pom.xml @@ -28,6 +28,8 @@ quarkus-benchmark-common resteasy-reactive-hibernate resteasy-reactive-hibernate-reactive + vertx + reactive-routes-pgclient diff --git a/frameworks/Java/quarkus/quarkus-hibernate-reactive.dockerfile b/frameworks/Java/quarkus/quarkus-hibernate-reactive.dockerfile index 8e671d7d02f..c9bd706429a 100644 --- a/frameworks/Java/quarkus/quarkus-hibernate-reactive.dockerfile +++ b/frameworks/Java/quarkus/quarkus-hibernate-reactive.dockerfile @@ -8,6 +8,8 @@ COPY --chown=185 pom.xml pom.xml COPY --chown=185 quarkus-benchmark-common quarkus-benchmark-common/ COPY --chown=185 resteasy-reactive-hibernate resteasy-reactive-hibernate/ COPY --chown=185 resteasy-reactive-hibernate-reactive resteasy-reactive-hibernate-reactive/ +COPY --chown=185 vertx vertx/ +COPY --chown=185 reactive-routes-pgclient reactive-routes-pgclient/ # Uncomment to test pre-release quarkus #RUN mkdir -p /root/.m2/repository/io diff --git a/frameworks/Java/quarkus/quarkus-reactive-routes-pgclient.dockerfile b/frameworks/Java/quarkus/quarkus-reactive-routes-pgclient.dockerfile new file mode 100644 index 00000000000..cfd9baa9b41 --- /dev/null +++ b/frameworks/Java/quarkus/quarkus-reactive-routes-pgclient.dockerfile @@ -0,0 +1,45 @@ +FROM registry.access.redhat.com/ubi8/openjdk-17:1.15 as maven +ENV LANGUAGE='en_US:en' + +WORKDIR /quarkus +ENV MODULE=reactive-routes-pgclient + +COPY --chown=185 pom.xml pom.xml +COPY --chown=185 quarkus-benchmark-common quarkus-benchmark-common/ +COPY --chown=185 resteasy-reactive-hibernate resteasy-reactive-hibernate/ +COPY --chown=185 resteasy-reactive-hibernate-reactive resteasy-reactive-hibernate-reactive/ +COPY --chown=185 vertx vertx/ +COPY --chown=185 reactive-routes-pgclient reactive-routes-pgclient/ + +# Uncomment to test pre-release quarkus +#RUN mkdir -p /root/.m2/repository/io +#COPY m2-quarkus /root/.m2/repository/io/quarkus + +USER 185 +WORKDIR /quarkus +RUN mvn -DskipTests install -pl :benchmark,:quarkus-benchmark-common -B -q + +WORKDIR /quarkus/$MODULE +RUN mvn dependency:go-offline -B -q +WORKDIR /quarkus + +COPY $MODULE/src $MODULE/src + +WORKDIR /quarkus/$MODULE +RUN mvn package -B -q +WORKDIR /quarkus + +FROM registry.access.redhat.com/ubi8/openjdk-17-runtime:1.15 +ENV LANGUAGE='en_US:en' +WORKDIR /quarkus +ENV MODULE=reactive-routes-pgclient + +COPY --chown=185 --from=maven /quarkus/$MODULE/target/quarkus-app/lib/ lib +COPY --chown=185 --from=maven /quarkus/$MODULE/target/quarkus-app/app/ app +COPY --chown=185 --from=maven /quarkus/$MODULE/target/quarkus-app/quarkus/ quarkus +COPY --chown=185 --from=maven /quarkus/$MODULE/target/quarkus-app/quarkus-run.jar quarkus-run.jar +COPY --chown=185 run_quarkus.sh run_quarkus.sh + +EXPOSE 8080 +USER 185 +ENTRYPOINT "./run_quarkus.sh" diff --git a/frameworks/Java/quarkus/quarkus-vertx.dockerfile b/frameworks/Java/quarkus/quarkus-vertx.dockerfile new file mode 100644 index 00000000000..48ef610e0cd --- /dev/null +++ b/frameworks/Java/quarkus/quarkus-vertx.dockerfile @@ -0,0 +1,45 @@ +FROM registry.access.redhat.com/ubi8/openjdk-17:1.15 as maven +ENV LANGUAGE='en_US:en' + +WORKDIR /quarkus +ENV MODULE=vertx + +COPY --chown=185 pom.xml pom.xml +COPY --chown=185 quarkus-benchmark-common quarkus-benchmark-common/ +COPY --chown=185 resteasy-reactive-hibernate resteasy-reactive-hibernate/ +COPY --chown=185 resteasy-reactive-hibernate-reactive resteasy-reactive-hibernate-reactive/ +COPY --chown=185 vertx vertx/ +COPY --chown=185 reactive-routes-pgclient reactive-routes-pgclient/ + +# Uncomment to test pre-release quarkus +#RUN mkdir -p /root/.m2/repository/io +#COPY m2-quarkus /root/.m2/repository/io/quarkus + +USER 185 +WORKDIR /quarkus +RUN mvn -DskipTests install -pl :benchmark,:quarkus-benchmark-common -B -q + +WORKDIR /quarkus/$MODULE +RUN mvn dependency:go-offline -B -q +WORKDIR /quarkus + +COPY $MODULE/src $MODULE/src + +WORKDIR /quarkus/$MODULE +RUN mvn package -B -q +WORKDIR /quarkus + +FROM registry.access.redhat.com/ubi8/openjdk-17-runtime:1.15 +ENV LANGUAGE='en_US:en' +WORKDIR /quarkus +ENV MODULE=vertx + +COPY --chown=185 --from=maven /quarkus/$MODULE/target/quarkus-app/lib/ lib +COPY --chown=185 --from=maven /quarkus/$MODULE/target/quarkus-app/app/ app +COPY --chown=185 --from=maven /quarkus/$MODULE/target/quarkus-app/quarkus/ quarkus +COPY --chown=185 --from=maven /quarkus/$MODULE/target/quarkus-app/quarkus-run.jar quarkus-run.jar +COPY --chown=185 run_quarkus.sh run_quarkus.sh + +EXPOSE 8080 +USER 185 +ENTRYPOINT "./run_quarkus.sh" diff --git a/frameworks/Java/quarkus/quarkus.dockerfile b/frameworks/Java/quarkus/quarkus.dockerfile index 05ad3c1896e..506b0532eea 100644 --- a/frameworks/Java/quarkus/quarkus.dockerfile +++ b/frameworks/Java/quarkus/quarkus.dockerfile @@ -8,6 +8,8 @@ COPY --chown=185 pom.xml pom.xml COPY --chown=185 quarkus-benchmark-common quarkus-benchmark-common/ COPY --chown=185 resteasy-reactive-hibernate resteasy-reactive-hibernate/ COPY --chown=185 resteasy-reactive-hibernate-reactive resteasy-reactive-hibernate-reactive/ +COPY --chown=185 vertx vertx/ +COPY --chown=185 reactive-routes-pgclient reactive-routes-pgclient/ # Uncomment to test pre-release quarkus #RUN mkdir -p /root/.m2/repository/io diff --git a/frameworks/Java/quarkus/reactive-routes-pgclient/pom.xml b/frameworks/Java/quarkus/reactive-routes-pgclient/pom.xml new file mode 100644 index 00000000000..599183b4656 --- /dev/null +++ b/frameworks/Java/quarkus/reactive-routes-pgclient/pom.xml @@ -0,0 +1,86 @@ + + + 4.0.0 + + io.quarkus + benchmark + 1.0-SNAPSHOT + + + reactive-routes-pgclient + + + + io.quarkus + quarkus-benchmark-common + + + io.quarkus + quarkus-reactive-pg-client + + + io.quarkus + quarkus-scheduler + + + io.quarkus + quarkus-reactive-routes + + + io.vertx + vertx-web + + + io.vertx + vertx-web-templ-rocker + + + + com.google.guava + guava + 32.0.0-jre + + + io.netty + netty-transport-native-epoll + linux-x86_64 + + + + + + + com.fizzed + rocker-maven-plugin + 1.3.0 + + + generate-rocker-templates + generate-sources + + generate + + + ${project.basedir}/src/main/resources + true + true + false + + + + + + + com.google.guava + guava + 32.0.0-jre + + + + + + + + \ No newline at end of file diff --git a/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/filter/ServerHeaderFilter.java b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/filter/ServerHeaderFilter.java new file mode 100644 index 00000000000..d9bc3ce8a66 --- /dev/null +++ b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/filter/ServerHeaderFilter.java @@ -0,0 +1,36 @@ +package io.quarkus.benchmark.filter; + +import io.quarkus.scheduler.Scheduled; +import io.quarkus.vertx.web.RouteFilter; +import io.vertx.core.http.HttpHeaders; +import io.vertx.ext.web.RoutingContext; +import jakarta.annotation.PostConstruct; +import jakarta.inject.Singleton; + +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; + +@Singleton +public class ServerHeaderFilter { + + private static final CharSequence SERVER_HEADER_VALUE = HttpHeaders.createOptimized("Quarkus"); + private CharSequence date; + + @PostConstruct + public void init() { + updateDate(); + } + + @Scheduled(every = "1s") + void updateDate() { + date = HttpHeaders.createOptimized(DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now())); + } + + @RouteFilter(100) + void addDefaultHeaders(final RoutingContext rc) { + final var headers = rc.response().headers(); + headers.add(HttpHeaders.SERVER, SERVER_HEADER_VALUE); + headers.add(HttpHeaders.DATE, date); + rc.next(); + } +} \ No newline at end of file diff --git a/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/model/Fortune.java b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/model/Fortune.java new file mode 100644 index 00000000000..ed941d8b505 --- /dev/null +++ b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/model/Fortune.java @@ -0,0 +1,25 @@ +package io.quarkus.benchmark.model; + +public class Fortune implements Comparable { + + private final int id; + private final String message; + + public Fortune(final int id, final String message) { + this.id = id; + this.message = message; + } + + public int getId() { + return id; + } + + public String getMessage() { + return message; + } + + @Override + public int compareTo(final Fortune other) { + return message.compareTo(other.message); + } +} \ No newline at end of file diff --git a/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/model/World.java b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/model/World.java new file mode 100644 index 00000000000..f56b7dd0850 --- /dev/null +++ b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/model/World.java @@ -0,0 +1,29 @@ +package io.quarkus.benchmark.model; + +public class World implements Comparable { + + private final Integer id; + private Integer randomNumber; + + public World(final Integer id, final Integer randomNumber) { + this.id = id; + this.randomNumber = randomNumber; + } + + public Integer getId() { + return id; + } + + public int getRandomNumber() { + return randomNumber; + } + + public void setRandomNumber(final Integer randomNumber) { + this.randomNumber = randomNumber; + } + + @Override + public int compareTo(final World o) { + return id.compareTo(o.id); + } +} \ No newline at end of file diff --git a/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/repository/FortuneRepository.java b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/repository/FortuneRepository.java new file mode 100644 index 00000000000..bba1ae2e4c7 --- /dev/null +++ b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/repository/FortuneRepository.java @@ -0,0 +1,29 @@ +package io.quarkus.benchmark.repository; + +import java.util.ArrayList; +import java.util.List; + +import io.quarkus.benchmark.model.Fortune; +import io.smallrye.mutiny.Uni; +import io.vertx.mutiny.sqlclient.Row; +import jakarta.inject.Inject; +import jakarta.inject.Singleton; + +@Singleton +public class FortuneRepository { + + @Inject + PgClients clients; + + public Uni> findAll() { + return clients.getClient().preparedQuery("SELECT * FROM Fortune") + .execute() + .map(rowset -> { + final List ret = new ArrayList<>(rowset.size() + 1); + for (final Row r : rowset) { + ret.add(new Fortune(r.getInteger(0), r.getString(1))); + } + return ret; + }); + } +} \ No newline at end of file diff --git a/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/repository/PgClientFactory.java b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/repository/PgClientFactory.java new file mode 100644 index 00000000000..77297726a79 --- /dev/null +++ b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/repository/PgClientFactory.java @@ -0,0 +1,58 @@ +package io.quarkus.benchmark.repository; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import io.vertx.mutiny.sqlclient.SqlClient; +import jakarta.enterprise.inject.Produces; +import jakarta.inject.Inject; +import jakarta.inject.Singleton; +import org.eclipse.microprofile.config.inject.ConfigProperty; + +import io.vertx.mutiny.core.Vertx; +import io.vertx.mutiny.pgclient.PgPool; +import io.vertx.pgclient.PgConnectOptions; +import io.vertx.sqlclient.PoolOptions; + +@Singleton +public class PgClientFactory { + + // vertx-reactive:postgresql://tfb-database:5432/hello_world + private static final String PG_URI_MATCHER = "vertx-reactive:postgresql://([-a-zA-Z]+):([0-9]+)/(.*)"; + + @ConfigProperty(name = "quarkus.datasource.url") + String url; + + @ConfigProperty(name = "quarkus.datasource.username") + String user; + + @ConfigProperty(name = "quarkus.datasource.password") + String pass; + + @Inject + Vertx vertx; + + @Produces + @Singleton + public PgClients pgClients() { + return new PgClients(this); + } + + + SqlClient sqlClient(final int size) { + final PoolOptions options = new PoolOptions(); + final PgConnectOptions connectOptions = new PgConnectOptions(); + final Matcher matcher = Pattern.compile(PG_URI_MATCHER).matcher(url); + matcher.matches(); + connectOptions.setDatabase(matcher.group(3)); + connectOptions.setHost(matcher.group(1)); + connectOptions.setPort(Integer.parseInt(matcher.group(2))); + connectOptions.setUser(user); + connectOptions.setPassword(pass); + connectOptions.setCachePreparedStatements(true); + // Large pipelining means less flushing and we use a single connection anyway + connectOptions.setPipeliningLimit(100_000); + options.setMaxSize(size); + return PgPool.client(vertx, connectOptions, options); + } +} \ No newline at end of file diff --git a/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/repository/PgClients.java b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/repository/PgClients.java new file mode 100644 index 00000000000..8b54a9cab24 --- /dev/null +++ b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/repository/PgClients.java @@ -0,0 +1,33 @@ +package io.quarkus.benchmark.repository; + +import io.netty.util.concurrent.FastThreadLocal; +import io.vertx.mutiny.sqlclient.SqlClient; + +class PgClients { + private final FastThreadLocal sqlClient = new FastThreadLocal<>() { + @Override + protected void onRemoval(final SqlClient value) { + if (value != null) { + value.close(); + } + } + }; + private PgClientFactory pgClientFactory; + + // for ArC + public PgClients() { + } + + public PgClients(final PgClientFactory pgClientFactory) { + this.pgClientFactory = pgClientFactory; + } + + SqlClient getClient() { + SqlClient ret = sqlClient.get(); + if (ret == null) { + ret = pgClientFactory.sqlClient(1); + sqlClient.set(ret); + } + return ret; + } +} \ No newline at end of file diff --git a/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/repository/WorldRepository.java b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/repository/WorldRepository.java new file mode 100644 index 00000000000..630be2b3861 --- /dev/null +++ b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/repository/WorldRepository.java @@ -0,0 +1,59 @@ +package io.quarkus.benchmark.repository; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +import io.quarkus.benchmark.model.World; +import io.smallrye.mutiny.Uni; +import io.vertx.core.json.JsonObject; +import io.vertx.mutiny.sqlclient.Row; +import io.vertx.mutiny.sqlclient.Tuple; +import jakarta.inject.Inject; +import jakarta.inject.Singleton; + +@Singleton +public class WorldRepository { + + //like muggle's JsonWorld + public static class JsonWorld extends JsonObject { + public JsonWorld(final Integer id, final Integer randomNumber) { + super(Map.of("id", id, "randomNumber", randomNumber)); + } + } + + + @Inject + PgClients clients; + + + public Uni findAsJsonWorld(final Integer id) { + return clients.getClient().preparedQuery("SELECT id, randomNumber FROM World WHERE id = $1") + .execute(Tuple.of(id)) + .map(rowset -> { + final Row row = rowset.iterator().next(); + return new JsonWorld(row.getInteger(0), row.getInteger(1)); + }); + } + + public Uni find(final Integer id) { + return clients.getClient().preparedQuery("SELECT id, randomNumber FROM World WHERE id = $1") + .execute(Tuple.of(id)) + .map(rowset -> { + final Row row = rowset.iterator().next(); + return new World(row.getInteger(0), row.getInteger(1)); + }); + } + + public Uni update(final World[] worlds) { + Arrays.sort(worlds); + final List args = new ArrayList<>(worlds.length); + for (final World world : worlds) { + args.add(Tuple.of(world.getId(), world.getRandomNumber())); + } + return clients.getClient().preparedQuery("UPDATE World SET randomNumber = $2 WHERE id = $1") + .executeBatch(args) + .map(v -> null); + } +} diff --git a/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/BaseResource.java b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/BaseResource.java new file mode 100644 index 00000000000..13a14912ce2 --- /dev/null +++ b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/BaseResource.java @@ -0,0 +1,32 @@ +package io.quarkus.benchmark.resource; + +import io.netty.handler.codec.http.HttpHeaderValues; +import io.vertx.core.http.HttpHeaders; +import io.vertx.core.json.JsonArray; +import io.vertx.core.json.JsonObject; +import io.vertx.core.json.jackson.JacksonCodec; +import io.vertx.ext.web.RoutingContext; + +public abstract class BaseResource { + + // TODO verify how to override/replace io.quarkus.vertx.runtime.jackson.QuarkusJacksonFactory in io.vertx.core.spi.JsonFactory + private static final JacksonCodec JACKSON_CODEC = new JacksonCodec(); + + void sendJson(final RoutingContext rc, final JsonObject json) { + var response = rc.response(); + response.headers().add(HttpHeaders.CONTENT_TYPE, HttpHeaderValues.APPLICATION_JSON); + response.end(JACKSON_CODEC.toBuffer(json, false), null); + } + + void sendJson(final RoutingContext rc, final JsonArray json) { + var response = rc.response(); + response.headers().add(HttpHeaders.CONTENT_TYPE, HttpHeaderValues.APPLICATION_JSON); + response.end(JACKSON_CODEC.toBuffer(json, false), null); + } + + Void handleFail(final RoutingContext rc, final Throwable t) { + rc.response().setStatusCode(500).end(t.toString()); + return null; + } + +} \ No newline at end of file diff --git a/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/DbResource.java b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/DbResource.java new file mode 100644 index 00000000000..e2533434d24 --- /dev/null +++ b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/DbResource.java @@ -0,0 +1,102 @@ +package io.quarkus.benchmark.resource; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.IntStream; + +import io.quarkus.benchmark.model.World; +import io.quarkus.benchmark.repository.WorldRepository; +import io.quarkus.benchmark.repository.WorldRepository.JsonWorld; +import io.quarkus.vertx.web.Route; +import io.smallrye.mutiny.Uni; +import io.vertx.core.json.JsonArray; +import io.vertx.ext.web.RoutingContext; +import jakarta.inject.Inject; +import jakarta.inject.Singleton; + + +@Singleton +public class DbResource extends BaseResource { + + @Inject + WorldRepository worldRepository; + + @Route(path = "db") + public void db(final RoutingContext rc) { + worldRepository.findAsJsonWorld(boxedRandomWorldNumber()) + .subscribe().with(world -> sendJson(rc, world), + t -> handleFail(rc, t)); + } + + @Route(path = "queries") + public void queries(final RoutingContext rc) { + final var queries = rc.request().getParam("queries"); + final var worlds = new Uni[parseQueryCount(queries)]; + final var ret = new JsonWorld[worlds.length]; + // replace below with a for loop + Arrays.setAll(worlds, i -> { + return worldRepository.findAsJsonWorld(boxedRandomWorldNumber()).map(w -> ret[i] = w); + }); + + Uni.combine().all().unis(worlds) + .combinedWith(v -> Arrays.asList(ret)) + .subscribe().with(list -> { + sendJson(rc, new JsonArray(list)); + }, + t -> handleFail(rc, t)); + } + + @Route(path = "updates") + public void updates(final RoutingContext rc) { + final var queries = rc.request().getParam("queries"); + final var worlds = new Uni[parseQueryCount(queries)]; + final var wordsToUpdate = new World[worlds.length]; + Arrays.setAll(worlds, i -> { + return randomWorld().map(w -> { + w.setRandomNumber(boxedRandomWorldNumber()); + wordsToUpdate[i] = w; + return w; + }); + }); + + Uni.combine().all().unis(worlds) + .combinedWith(v -> null) + .flatMap(v -> worldRepository.update(wordsToUpdate)) + .map(updated -> wordsToUpdate) + .subscribe().with(updatedWordsOrderedById -> { + final var jsonWorlds = new JsonArray(new ArrayList<>(updatedWordsOrderedById.length)); + for (final World world : updatedWordsOrderedById) { + jsonWorlds.add(new JsonWorld(world.getId(), world.getRandomNumber())); + } + sendJson(rc, jsonWorlds); + }, + t -> handleFail(rc, t)); + } + + private Uni randomWorld() { + return worldRepository.find(boxedRandomWorldNumber()); + } + + private static final Integer[] BOXED_RND = IntStream.range(1, 10001).boxed().toArray(Integer[]::new); + + private static Integer boxedRandomWorldNumber() { + final int rndValue = ThreadLocalRandom.current().nextInt(1, 10001); + final var boxedRnd = BOXED_RND[rndValue - 1]; + assert boxedRnd.intValue() == rndValue; + return boxedRnd; + } + + private static int parseQueryCount(final String textValue) { + if (textValue == null) { + return 1; + } + final int parsedValue; + try { + parsedValue = Integer.parseInt(textValue); + } catch (final NumberFormatException e) { + return 1; + } + return Math.min(500, Math.max(1, parsedValue)); + } +} \ No newline at end of file diff --git a/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/FortuneResource.java b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/FortuneResource.java new file mode 100644 index 00000000000..5289a52a194 --- /dev/null +++ b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/FortuneResource.java @@ -0,0 +1,43 @@ +package io.quarkus.benchmark.resource; + +import java.util.Collections; + +import io.quarkus.benchmark.model.Fortune; +import io.quarkus.benchmark.rocker.VertxRawRockerOutputFactories; +import io.quarkus.benchmark.repository.FortuneRepository; +import io.quarkus.vertx.web.Route; +import io.vertx.core.http.HttpHeaders; +import io.vertx.ext.web.RoutingContext; +import jakarta.inject.Inject; +import jakarta.inject.Singleton; +import views.Fortunes; + +@Singleton +public class FortuneResource extends BaseResource { + + private static final CharSequence HTML_UTF8_CONTENT_TYPE = HttpHeaders.createOptimized("text/html; charset=UTF-8"); + + @Inject + FortuneRepository repository; + @Inject + VertxRawRockerOutputFactories factories; + + public FortuneResource() { + + } + + @Route(path = "fortunes") + public void fortunes(final RoutingContext rc) { + repository.findAll() + .subscribe() + .with(fortunes -> { + fortunes.add(new Fortune(0, "Additional fortune added at request time.")); + Collections.sort(fortunes); + final var vertxRockerOutput = Fortunes.template(fortunes).render(factories.ioFactory()); + var res = rc.response(); + res.headers().add(HttpHeaders.CONTENT_TYPE, HTML_UTF8_CONTENT_TYPE); + res.end(vertxRockerOutput.buffer(), null); + }, + t -> handleFail(rc, t)); + } +} \ No newline at end of file diff --git a/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/JsonMessage.java b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/JsonMessage.java new file mode 100644 index 00000000000..5a2b743a19b --- /dev/null +++ b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/JsonMessage.java @@ -0,0 +1,12 @@ +package io.quarkus.benchmark.resource; + +import io.vertx.core.json.JsonObject; + +import java.util.Map; + +public class JsonMessage extends JsonObject { + + public JsonMessage(final String message) { + super(Map.of("message", message)); + } +} diff --git a/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/JsonResource.java b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/JsonResource.java new file mode 100644 index 00000000000..d53a821b1d3 --- /dev/null +++ b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/JsonResource.java @@ -0,0 +1,17 @@ +package io.quarkus.benchmark.resource; + + +import io.quarkus.vertx.web.Route; +import io.vertx.ext.web.RoutingContext; +import jakarta.inject.Singleton; + +@Singleton +public class JsonResource extends BaseResource { + + private static final String HELLO = "Hello, World!"; + + @Route(path = "json") + public void json(final RoutingContext rc) { + sendJson(rc, new JsonMessage(HELLO)); + } +} diff --git a/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/PlaintextResource.java b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/PlaintextResource.java new file mode 100644 index 00000000000..fcd24cadcfd --- /dev/null +++ b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/resource/PlaintextResource.java @@ -0,0 +1,24 @@ +package io.quarkus.benchmark.resource; + +import io.netty.handler.codec.http.HttpHeaderValues; +import io.quarkus.vertx.web.Route; +import io.vertx.core.buffer.Buffer; +import io.vertx.core.http.HttpHeaders; +import io.vertx.ext.web.RoutingContext; +import jakarta.inject.Singleton; + +@Singleton +public class PlaintextResource { + private static final String HELLO_WORLD = "Hello, world!"; + private static final Buffer HELLO_WORLD_BUFFER = Buffer.buffer(HELLO_WORLD, "UTF-8"); + private static final CharSequence HELLO_WORLD_LENGTH = HttpHeaders.createOptimized("" + HELLO_WORLD.length()); + + @Route(path = "plaintext") + public void plaintext(final RoutingContext rc) { + final var response = rc.response(); + final var headers = response.headers(); + headers.add(HttpHeaders.CONTENT_TYPE, HttpHeaderValues.TEXT_PLAIN); + headers.add(HttpHeaders.CONTENT_LENGTH, HELLO_WORLD_LENGTH); + response.end(HELLO_WORLD_BUFFER, null); + } +} \ No newline at end of file diff --git a/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/rocker/RawRockerOutput.java b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/rocker/RawRockerOutput.java new file mode 100644 index 00000000000..8dd5bec161b --- /dev/null +++ b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/rocker/RawRockerOutput.java @@ -0,0 +1,65 @@ +package io.quarkus.benchmark.rocker; + +import com.fizzed.rocker.ContentType; +import com.fizzed.rocker.RockerOutputFactory; +import io.netty.buffer.ByteBuf; +import io.vertx.core.buffer.Buffer; +import io.vertx.core.buffer.impl.PartialPooledByteBufAllocator; + +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; + +final class RawRockerOutput implements VertxRawRockerOutput { + + private final ByteBuf buff = PartialPooledByteBufAllocator.INSTANCE.directBuffer(); + private final Buffer buffer = Buffer.buffer(buff); + + RawRockerOutput() { + } + + public static RockerOutputFactory raw() { + final RawRockerOutput output = new RawRockerOutput(); + return (_contentType, charsetName) -> { + output.reset(); + return output; + }; + } + + private void reset() { + buff.resetReaderIndex(); + buff.resetWriterIndex(); + } + + @Override + public RawRockerOutput w(final byte[] bytes) throws IOException { + buffer.appendBytes(bytes); + return this; + } + + @Override + public RawRockerOutput w(final String s) throws IOException { + buffer.appendString(s); + return this; + } + + @Override + public ContentType getContentType() { + return ContentType.RAW; + } + + @Override + public Charset getCharset() { + return StandardCharsets.UTF_8; + } + + @Override + public int getByteLength() { + return buffer.length(); + } + + @Override + public Buffer buffer() { + return buffer; + } +} diff --git a/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/rocker/VertxRawRockerOutput.java b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/rocker/VertxRawRockerOutput.java new file mode 100644 index 00000000000..ada27e4e4bf --- /dev/null +++ b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/rocker/VertxRawRockerOutput.java @@ -0,0 +1,15 @@ +package io.quarkus.benchmark.rocker; + +import com.fizzed.rocker.RockerOutputFactory; +import io.vertx.core.buffer.Buffer; + +public interface VertxRawRockerOutput extends com.fizzed.rocker.RockerOutput { + + // factory + static RockerOutputFactory factory() { + return RawRockerOutput.raw(); + } + + Buffer buffer(); + +} diff --git a/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/rocker/VertxRawRockerOutputFactories.java b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/rocker/VertxRawRockerOutputFactories.java new file mode 100644 index 00000000000..faf834738c4 --- /dev/null +++ b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/java/io/quarkus/benchmark/rocker/VertxRawRockerOutputFactories.java @@ -0,0 +1,29 @@ +package io.quarkus.benchmark.rocker; + +import com.fizzed.rocker.RockerOutputFactory; +import io.netty.util.concurrent.FastThreadLocal; +import io.vertx.core.Context; +import jakarta.inject.Singleton; + +@Singleton +public class VertxRawRockerOutputFactories { + + private final FastThreadLocal> ioPool; + + VertxRawRockerOutputFactories() { + ioPool = new FastThreadLocal<>() { + @Override + protected RockerOutputFactory initialValue() { + if (!Context.isOnEventLoopThread()) { + return null; + } + return VertxRawRockerOutput.factory(); + } + }; + } + + public RockerOutputFactory ioFactory() { + return ioPool.get(); + } + +} diff --git a/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/resources/application.properties b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/resources/application.properties new file mode 100644 index 00000000000..1175db6f746 --- /dev/null +++ b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/resources/application.properties @@ -0,0 +1,11 @@ +quarkus.datasource.url=vertx-reactive:postgresql://tfb-database:5432/hello_world +quarkus.datasource.username=benchmarkdbuser +quarkus.datasource.password=benchmarkdbpass +quarkus.datasource.reactive.max-size=64 +quarkus.log.console.enable=true +quarkus.log.console.level=INFO +quarkus.log.file.enable=false +quarkus.log.level=INFO +quarkus.vertx.prefer-native-transport=true + +quarkus.arc.context-propagation.enabled=false diff --git a/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/resources/import.sql b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/resources/import.sql new file mode 100644 index 00000000000..f76881b4287 --- /dev/null +++ b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/resources/import.sql @@ -0,0 +1 @@ +INSERT INTO Fortune(id, message) VALUES (1, 'Test value One'); \ No newline at end of file diff --git a/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/resources/views/Fortunes.rocker.html b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/resources/views/Fortunes.rocker.html new file mode 100644 index 00000000000..cfa4f8341e2 --- /dev/null +++ b/frameworks/Java/quarkus/reactive-routes-pgclient/src/main/resources/views/Fortunes.rocker.html @@ -0,0 +1,8 @@ +@import java.util.* +@import io.quarkus.benchmark.model.* +@args(List fortunes) +Fortunes +@for ((ForIterator i, Fortune fortune) : fortunes) { + +} +
idmessage
@fortune.getId()@fortune.getMessage()
\ No newline at end of file diff --git a/frameworks/Java/quarkus/run_quarkus.sh b/frameworks/Java/quarkus/run_quarkus.sh index 7f8bc785fd1..e93ef48f616 100755 --- a/frameworks/Java/quarkus/run_quarkus.sh +++ b/frameworks/Java/quarkus/run_quarkus.sh @@ -10,6 +10,7 @@ # Consider using -Dquarkus.http.io-threads=$((`grep --count ^processor /proc/cpuinfo`)) \ JAVA_OPTIONS="-server \ + -Dquarkus.http.limits.max-body-size= \ -Dquarkus.vertx.prefer-native-transport=true \ -XX:-StackTraceInThrowable \ -Dquarkus.http.accept-backlog=-1 \ diff --git a/frameworks/Java/quarkus/vertx/pom.xml b/frameworks/Java/quarkus/vertx/pom.xml new file mode 100644 index 00000000000..e751ed6aa51 --- /dev/null +++ b/frameworks/Java/quarkus/vertx/pom.xml @@ -0,0 +1,83 @@ + + + 4.0.0 + + + io.quarkus + benchmark + 1.0-SNAPSHOT + + + io.quarkus.benchmark + vertx + + + + io.quarkus + quarkus-benchmark-common + + + io.quarkus + quarkus-arc + + + io.vertx + vertx-pg-client + ${vertx.version} + + + io.quarkus + quarkus-vertx + + + io.vertx + vertx-web-templ-rocker + + + + com.google.guava + guava + 32.0.0-jre + + + io.netty + netty-transport-native-epoll + linux-x86_64 + + + + + + + com.fizzed + rocker-maven-plugin + 1.3.0 + + + generate-rocker-templates + generate-sources + + generate + + + ${project.basedir}/src/main/resources + true + true + false + + + + + + + com.google.guava + guava + 32.0.0-jre + + + + + + + + diff --git a/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/filter/HttpResponseDecorator.java b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/filter/HttpResponseDecorator.java new file mode 100644 index 00000000000..8fedfd8fe6b --- /dev/null +++ b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/filter/HttpResponseDecorator.java @@ -0,0 +1,40 @@ +package io.quarkus.benchmark.filter; + +import io.vertx.core.Vertx; +import io.vertx.core.http.HttpHeaders; +import io.vertx.core.http.HttpServerResponse; +import jakarta.annotation.PreDestroy; +import jakarta.inject.Singleton; + +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; + +@Singleton +public class HttpResponseDecorator { + private static final CharSequence HEADER_DATE = HttpHeaders.createOptimized("date"); + private static final CharSequence QUARKUS_SERVER = HttpHeaders.createOptimized("quarkus"); + private final Vertx vertx; + private CharSequence date; + private final long timerId; + + public HttpResponseDecorator(final Vertx vertx) { + this.vertx = vertx; + date = createDateHeader(); + timerId = vertx.setPeriodic(1000, ignore -> date = createDateHeader()); + } + + public static CharSequence createDateHeader() { + return HttpHeaders.createOptimized(DateTimeFormatter.RFC_1123_DATE_TIME.format(ZonedDateTime.now())); + } + + @PreDestroy + public void destroy() { + vertx.cancelTimer(timerId); + } + + public void decorate(final HttpServerResponse response) { + final var headers = response.headers(); + headers.add(HttpHeaders.SERVER, QUARKUS_SERVER); + headers.add(HEADER_DATE, date); + } +} diff --git a/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/model/Fortune.java b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/model/Fortune.java new file mode 100644 index 00000000000..a8a56cc71b9 --- /dev/null +++ b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/model/Fortune.java @@ -0,0 +1,24 @@ +package io.quarkus.benchmark.model; + +public class Fortune implements Comparable { + private final int id; + private final String message; + + public Fortune(final int id, final String message) { + this.id = id; + this.message = message; + } + + public int getId() { + return id; + } + + public String getMessage() { + return message; + } + + @Override + public int compareTo(final Fortune other) { + return message.compareTo(other.message); + } +} \ No newline at end of file diff --git a/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/model/JsonMessage.java b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/model/JsonMessage.java new file mode 100644 index 00000000000..db58d8e1da4 --- /dev/null +++ b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/model/JsonMessage.java @@ -0,0 +1,12 @@ +package io.quarkus.benchmark.model; + +import io.vertx.core.json.JsonObject; + +import java.util.Map; + +public class JsonMessage extends JsonObject { + + public JsonMessage(final String message) { + super(Map.of("message", message)); + } +} diff --git a/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/model/World.java b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/model/World.java new file mode 100644 index 00000000000..07f0b4f972e --- /dev/null +++ b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/model/World.java @@ -0,0 +1,24 @@ +package io.quarkus.benchmark.model; + +public final class World implements Comparable { + private final Integer id; + private final Integer randomNumber; + + public World(final Integer id, final Integer randomNumber) { + this.id = id; + this.randomNumber = randomNumber; + } + + public Integer getId() { + return id; + } + + public Integer getRandomNumber() { + return randomNumber; + } + + @Override + public int compareTo(final World o) { + return id.compareTo(o.id); + } +} \ No newline at end of file diff --git a/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/repository/FortuneRepository.java b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/repository/FortuneRepository.java new file mode 100644 index 00000000000..4130f1f3cbd --- /dev/null +++ b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/repository/FortuneRepository.java @@ -0,0 +1,44 @@ +package io.quarkus.benchmark.repository; + +import io.quarkus.benchmark.model.Fortune; +import io.vertx.core.AsyncResult; +import io.vertx.core.Future; +import io.vertx.core.Handler; +import io.vertx.sqlclient.Row; +import io.vertx.sqlclient.RowIterator; +import jakarta.inject.Inject; +import jakarta.inject.Singleton; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +@Singleton +public class FortuneRepository { + + @Inject + PgConnectionPool pgConnectionPool; + + public void findAllSortedFortunes(final Handler>> resultHandler) { + pgConnectionPool.pgConnection().selectFortuneQuery() + .execute(fortuneRows -> { + if (fortuneRows.succeeded()) { + final List fortunes = new ArrayList<>(fortuneRows.result().size() + 1); + final RowIterator resultSet = fortuneRows.result().iterator(); + if (!resultSet.hasNext()) { + resultHandler.handle(Future.succeededFuture(List.of())); + return; + } + while (resultSet.hasNext()) { + final Row row = resultSet.next(); + fortunes.add(new Fortune(row.getInteger(0), row.getString(1))); + } + fortunes.add(new Fortune(0, "Additional fortune added at request time.")); + Collections.sort(fortunes); + resultHandler.handle(Future.succeededFuture(fortunes)); + } else { + resultHandler.handle(Future.failedFuture(fortuneRows.cause())); + } + }); + } +} diff --git a/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/repository/PgClientFactory.java b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/repository/PgClientFactory.java new file mode 100644 index 00000000000..4289a644669 --- /dev/null +++ b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/repository/PgClientFactory.java @@ -0,0 +1,67 @@ +package io.quarkus.benchmark.repository; + +import io.vertx.core.Vertx; +import io.vertx.pgclient.PgConnectOptions; +import jakarta.annotation.PreDestroy; +import jakarta.enterprise.inject.Produces; +import jakarta.inject.Singleton; +import org.eclipse.microprofile.config.inject.ConfigProperty; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +@Singleton +public class PgClientFactory { + + // vertx-reactive:postgresql://tfb-database:5432/hello_world + private static final String PG_URI_MATCHER = "vertx-reactive:postgresql://([-a-zA-Z]+):([0-9]+)/(.*)"; + @ConfigProperty(name = "quarkus.datasource.url") + String url; + @ConfigProperty(name = "quarkus.datasource.username") + String user; + @ConfigProperty(name = "quarkus.datasource.password") + String pass; + + private final Vertx vertx; + private PgConnectionPool pgConnectionPool; + + public PgClientFactory(final Vertx vertx) { + this.vertx = vertx; + } + + @Produces + @Singleton + PgConnectionPool connectionPool() { + PgConnectionPool pgConnectionPool = null; + try { + pgConnectionPool = new PgConnectionPool(vertx, pgConnectOptions()); + } catch (final Exception e) { + // TODO LOG ME: usually means inability to connect to the database + } finally { + this.pgConnectionPool = pgConnectionPool; + return pgConnectionPool; + } + } + + @PreDestroy + public void closeConnectionPool() { + if (pgConnectionPool != null) { + pgConnectionPool.close(); + } + } + + private PgConnectOptions pgConnectOptions() { + final PgConnectOptions options = new PgConnectOptions(); + final Matcher matcher = Pattern.compile(PG_URI_MATCHER).matcher(url); + matcher.matches(); + options.setDatabase(matcher.group(3)); + options.setHost(matcher.group(1)); + options.setPort(Integer.parseInt(matcher.group(2))); + options.setUser(user); + options.setPassword(pass); + options.setCachePreparedStatements(true); + // Large pipelining means less flushing and we use a single connection anyway + options.setPipeliningLimit(100_000); + return options; + } +} \ No newline at end of file diff --git a/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/repository/PgConnectionPool.java b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/repository/PgConnectionPool.java new file mode 100644 index 00000000000..0a04a9fde25 --- /dev/null +++ b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/repository/PgConnectionPool.java @@ -0,0 +1,208 @@ +package io.quarkus.benchmark.repository; + +import io.netty.util.concurrent.EventExecutor; +import io.netty.util.concurrent.FastThreadLocal; +import io.vertx.core.AsyncResult; +import io.vertx.core.Future; +import io.vertx.core.Handler; +import io.vertx.core.Promise; +import io.vertx.core.Vertx; +import io.vertx.pgclient.PgConnectOptions; +import io.vertx.pgclient.PgConnection; +import io.vertx.sqlclient.PreparedQuery; +import io.vertx.sqlclient.PreparedStatement; +import io.vertx.sqlclient.Row; +import io.vertx.sqlclient.RowSet; +import io.vertx.sqlclient.impl.SqlClientInternal; + +import java.util.ArrayList; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicReferenceArray; + +public class PgConnectionPool implements AutoCloseable { + + static final String SELECT_WORLD = "SELECT id, randomnumber from WORLD where id=$1"; + static final String SELECT_FORTUNE = "SELECT id, message from FORTUNE"; + private final FastThreadLocal pgConnectionPool; + private final AtomicReferenceArray pgConnections; + + public PgConnectionPool(final Vertx vertx, final PgConnectOptions options) { + final var executors = new ArrayList(Runtime.getRuntime().availableProcessors()); + vertx.nettyEventLoopGroup().forEach(executors::add); + final var connectionsCompleted = new CompletableFuture<>(); + final var completedConnections = new AtomicReferenceArray>(executors.size()); + final var allCompleted = new AtomicInteger(executors.size()); + final var connectionAffinityMap = new ConcurrentHashMap(executors.size()); + for (int i = 0; i < executors.size(); i++) { + final int executorId = i; + executors.get(i).execute(() -> connect(vertx, options) + .onComplete(ar -> { + final boolean lastCompleted = allCompleted.decrementAndGet() == 0; + if (!completedConnections.compareAndSet(executorId, null, ar)) { + if (ar.succeeded()) { + ar.result().connection.close(); + } + } else if (ar.succeeded()) { + // assign the executorId to the connection + ar.result().executorId = executorId; + connectionAffinityMap.put(Thread.currentThread(), ar.result()); + } + if (lastCompleted) { + connectionsCompleted.complete(null); + } + })); + } + // TODO make the global timeout to be configurable + try { + connectionsCompleted.join(); + } catch (final Throwable t) { + // let's forcibly close all completed connections + forceCloseEstablishedConnections(completedConnections); + throw new IllegalStateException("cannot establish all connections", t); + } + // let's fast-fail if we cannot establish all connections + pgConnections = new AtomicReferenceArray<>(completedConnections.length()); + for (int i = 0; i < completedConnections.length(); i++) { + final AsyncResult ar = completedConnections.get(i); + if (ar == null || ar.failed()) { + forceCloseEstablishedConnections(completedConnections); + throw new IllegalStateException("cannot establish all connections"); + } else { + pgConnections.set(i, ar.result()); + } + } + pgConnectionPool = new FastThreadLocal<>() { + @Override + protected PgClientConnection initialValue() { + return connectionAffinityMap.get(Thread.currentThread()); + } + + @Override + protected void onRemoval(final PgClientConnection value) { + final PgClientConnection removed = connectionAffinityMap.remove(Thread.currentThread()); + if (removed != null) { + final var connectionToClose = pgConnections.getAndSet(removed.executorId, null); + if (connectionToClose != null) { + assert connectionToClose == removed; + connectionToClose.connection.close(); + } + } + } + }; + } + + private static Handler> onSuccess(final Handler handler) { + return ar -> { + if (ar.succeeded()) { + handler.handle(ar.result()); + } + }; + } + + private static Future connect(final Vertx vertx, final PgConnectOptions options) { + final PgClientConnection result = new PgClientConnection(); + final Promise connectionEstablished = Promise.promise(); + final var future = PgConnection.connect(vertx, options) + .flatMap(conn -> { + result.connection = (SqlClientInternal) conn; + final Future f1 = conn.prepare(SELECT_WORLD) + .andThen(onSuccess(ps -> result.SELECT_WORLD_QUERY = ps.query())); + final Future f2 = conn.prepare(SELECT_FORTUNE) + .andThen(onSuccess(ps -> result.SELECT_FORTUNE_QUERY = ps.query())); + + final int QUERIES = 500; + result.UPDATE_WORLD_QUERY = new PreparedQuery[QUERIES]; + var updateWorldQueries = new ArrayList>(QUERIES); + for (int queryCount = 1; queryCount <= QUERIES; queryCount++) { + updateWorldQueries.add(result.prepareUpdateQueryFor(conn, queryCount)); + } + return Future.join(f1, f2, Future.join(updateWorldQueries)); + }).onComplete(ar -> { + if (ar.failed() && result.connection != null) { + result.connection.close(); + } + }); + future.onComplete(ar -> { + if (ar.succeeded()) { + connectionEstablished.complete(result); + } else { + connectionEstablished.fail(ar.cause()); + } + }); + return connectionEstablished.future(); + } + + private static void forceCloseEstablishedConnections(final AtomicReferenceArray> completedConnections) { + final AsyncResult noResult = Future.succeededFuture(); + for (int i = 0; i < completedConnections.length(); i++) { + final AsyncResult ar = completedConnections.getAndSet(i, noResult); + if (ar != null && ar.succeeded() && ar.result() != null && ar.result().connection != null) { + try { + ar.result().connection.close(); + } catch (final Throwable t2) { + // ignore + } + } + } + } + + public PgClientConnection pgConnection() { + return pgConnectionPool.get(); + } + + @Override + public void close() { + for (int i = 0; i < pgConnections.length(); i++) { + final var connection = pgConnections.getAndSet(i, null); + if (connection != null) { + connection.connection.close(); + } + } + } + + public static class PgClientConnection { + private int executorId; + private PreparedQuery> SELECT_WORLD_QUERY; + private PreparedQuery> SELECT_FORTUNE_QUERY; + private PreparedQuery>[] UPDATE_WORLD_QUERY; + private SqlClientInternal connection; + + public PreparedQuery> selectWorldQuery() { + return SELECT_WORLD_QUERY; + } + + public PreparedQuery> selectFortuneQuery() { + return SELECT_FORTUNE_QUERY; + } + + public PreparedQuery> updateWorldQuery(int queryCount) { + return UPDATE_WORLD_QUERY[queryCount - 1]; + } + + private Future prepareUpdateQueryFor(PgConnection connection, int queryCount) { + return connection.prepare(updateQueryFor(queryCount)).andThen(onSuccess(ps -> UPDATE_WORLD_QUERY[queryCount - 1] = ps.query())); + } + private static String updateQueryFor(int queryCount) { + StringBuilder sql = new StringBuilder(); + sql.append("UPDATE WORLD SET RANDOMNUMBER = CASE ID"); + for (int i = 0; i < queryCount; i++) { + int offset = (i * 2) + 1; + sql.append(" WHEN $" + offset + " THEN $" + (offset + 1)); + } + sql.append(" ELSE RANDOMNUMBER"); + sql.append(" END WHERE ID IN ($1"); + for (int i = 1; i < queryCount; i++) { + int offset = (i * 2) + 1; + sql.append(",$" + offset); + } + sql.append(")"); + return sql.toString(); + } + + public SqlClientInternal rawConnection() { + return connection; + } + } +} \ No newline at end of file diff --git a/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/repository/WorldRepository.java b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/repository/WorldRepository.java new file mode 100644 index 00000000000..3095137ae5e --- /dev/null +++ b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/repository/WorldRepository.java @@ -0,0 +1,187 @@ +package io.quarkus.benchmark.repository; + +import io.quarkus.benchmark.model.World; +import io.vertx.core.AsyncResult; +import io.vertx.core.Future; +import io.vertx.core.Handler; +import io.vertx.core.json.JsonArray; +import io.vertx.core.json.JsonObject; +import io.vertx.sqlclient.PreparedQuery; +import io.vertx.sqlclient.Row; +import io.vertx.sqlclient.RowIterator; +import io.vertx.sqlclient.RowSet; +import io.vertx.sqlclient.Tuple; +import jakarta.inject.Inject; +import jakarta.inject.Singleton; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ThreadLocalRandom; +import java.util.stream.IntStream; + +@Singleton +public class WorldRepository { + + @Inject + private PgConnectionPool connectionPool; + + private static final Integer[] BOXED_RND = IntStream.range(1, 10001).boxed().toArray(Integer[]::new); + + private static Integer boxedRandomWorldNumber() { + final int rndValue = ThreadLocalRandom.current().nextInt(1, 10001); + final var boxedRnd = BOXED_RND[rndValue - 1]; + assert boxedRnd.intValue() == rndValue; + return boxedRnd; + } + + public void loadRandomJsonWorld(final Handler> worldHandler) { + connectionPool.pgConnection().selectWorldQuery().execute(Tuple.of(boxedRandomWorldNumber()), randomWorldRow -> { + if (randomWorldRow.succeeded()) { + final RowIterator resultSet = randomWorldRow.result().iterator(); + if (!resultSet.hasNext()) { + worldHandler.handle(Future.succeededFuture()); + return; + } + final Row row = resultSet.next(); + worldHandler.handle(Future.succeededFuture(new JsonWorld(row.getInteger(0), row.getInteger(1)))); + } else { + worldHandler.handle(Future.failedFuture(randomWorldRow.cause())); + } + }); + } + + public void loadNJsonWorlds(final int count, final Handler> worldsHandler) { + FindRandomWorldsCommand.execute(connectionPool, count, worldsHandler); + } + + public void updateNJsonWorlds(final int count, final Handler> worldsHandler) { + UpdateWorldsCommand.execute(connectionPool, count, worldsHandler); + } + + public static class JsonWorlds extends JsonArray { + private JsonWorlds(final int capacity) { + super(new ArrayList(capacity)); + } + + private JsonWorlds(final World[] worlds) { + this(worlds.length); + for (final World world : worlds) { + add(new JsonWorld(world.getId(), world.getRandomNumber())); + } + } + } + + public static class JsonWorld extends JsonObject { + private JsonWorld(final Integer id, final Integer random) { + super(Map.of("id", id, "randomNumber", random)); + } + } + + private static final class UpdateWorldsCommand { + private final PgConnectionPool.PgClientConnection connection; + private final World[] worldsToUpdate; + private final Handler> resultHandler; + private boolean failed; + private int selectWorldCompletedCount; + + private UpdateWorldsCommand(final PgConnectionPool.PgClientConnection connection, final int queries, final Handler> resultHandler) { + this.connection = connection; + this.worldsToUpdate = new World[queries]; + this.resultHandler = resultHandler; + } + + // execute + public static void execute(final PgConnectionPool connectionPool, final int count, final Handler> resultHandler) { + new UpdateWorldsCommand(connectionPool.pgConnection(), count, resultHandler).run(); + } + + private void run() { + connection.rawConnection().group(c -> { + final PreparedQuery> preparedQuery = c.preparedQuery(PgConnectionPool.SELECT_WORLD); + for (int i = 0; i < worldsToUpdate.length; i++) { + final Integer id = boxedRandomWorldNumber(); + final int index = i; + preparedQuery.execute(Tuple.of(id), worldId -> { + if (!failed) { + if (worldId.failed()) { + failed = true; + resultHandler.handle(Future.failedFuture(worldId.cause())); + return; + } + worldsToUpdate[index] = new World(worldId.result().iterator().next().getInteger(0), boxedRandomWorldNumber()); + if (++selectWorldCompletedCount == worldsToUpdate.length) { + randomWorldsQueryCompleted(); + } + } + }); + } + }); + } + + private void randomWorldsQueryCompleted() { + Arrays.sort(worldsToUpdate); + final List params = new ArrayList<>(worldsToUpdate.length * 2); + for (int i = 0, count = worldsToUpdate.length; i < count; i++) { + var world = worldsToUpdate[i]; + params.add(world.getId()); + params.add(world.getRandomNumber()); + } + connection.updateWorldQuery(worldsToUpdate.length).execute(Tuple.wrap(params), updateResult -> { + if (updateResult.failed()) { + resultHandler.handle(Future.failedFuture(updateResult.cause())); + return; + } + resultHandler.handle(Future.succeededFuture(new JsonWorlds(worldsToUpdate))); + }); + } + } + + private static final class FindRandomWorldsCommand implements Handler>> { + private final Handler> resultHandler; + private final int count; + private final JsonWorlds jsonWorlds; + private final PgConnectionPool.PgClientConnection connection; + private boolean failed; + + private FindRandomWorldsCommand(final PgConnectionPool.PgClientConnection connection, final int count, final Handler> resultHandler) { + this.connection = connection; + this.count = count; + this.jsonWorlds = new JsonWorlds(count); + this.resultHandler = resultHandler; + } + + public static void execute(final PgConnectionPool connectionPool, final int queries, final Handler> resultHandler) { + new FindRandomWorldsCommand(connectionPool.pgConnection(), queries, resultHandler).run(); + } + + private void run() { + connection.rawConnection().group(c -> { + for (int i = 0; i < count; i++) { + c.preparedQuery(PgConnectionPool.SELECT_WORLD).execute(Tuple.of(boxedRandomWorldNumber()), this); + } + }); + } + + @Override + public void handle(final AsyncResult> ar) { + if (!failed) { + if (ar.failed()) { + failed = true; + resultHandler.handle(Future.failedFuture(ar.cause())); + return; + } + + final Tuple row = ar.result().iterator().next(); + jsonWorlds.add(new JsonWorld(row.getInteger(0), row.getInteger(1))); + + // stop condition + if (jsonWorlds.size() == count) { + resultHandler.handle(Future.succeededFuture(jsonWorlds)); + } + } + } + } + +} diff --git a/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/resource/DbHttpHandler.java b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/resource/DbHttpHandler.java new file mode 100644 index 00000000000..01f5b1253ca --- /dev/null +++ b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/resource/DbHttpHandler.java @@ -0,0 +1,30 @@ +package io.quarkus.benchmark.resource; + +import io.netty.handler.codec.http.HttpHeaderValues; +import io.quarkus.benchmark.repository.WorldRepository; +import io.vertx.core.http.HttpHeaders; +import io.vertx.core.http.HttpServerRequest; +import jakarta.inject.Inject; +import jakarta.inject.Singleton; + +@Singleton +public class DbHttpHandler { + + @Inject + WorldRepository worldRepository; + + // write handle + public void handle(final HttpServerRequest request) { + worldRepository.loadRandomJsonWorld(jsonWorld -> { + if (jsonWorld.succeeded()) { + var res = request.response(); + res.headers().add(HttpHeaders.CONTENT_TYPE, HttpHeaderValues.APPLICATION_JSON); + res.end(jsonWorld.result().toBuffer(), null); + } else { + request.response().setStatusCode(500).end(); + } + }); + } + + +} diff --git a/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/resource/FortunesHttpHandler.java b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/resource/FortunesHttpHandler.java new file mode 100644 index 00000000000..4735a3729bd --- /dev/null +++ b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/resource/FortunesHttpHandler.java @@ -0,0 +1,34 @@ +package io.quarkus.benchmark.resource; + +import io.quarkus.benchmark.repository.FortuneRepository; +import io.quarkus.benchmark.rocker.VertxRawRockerOutputFactories; +import io.vertx.core.http.HttpHeaders; +import io.vertx.core.http.HttpServerRequest; +import jakarta.inject.Inject; +import jakarta.inject.Singleton; +import views.Fortunes; + +@Singleton +public class FortunesHttpHandler { + + private static final CharSequence HTML_UTF8_CONTENT_TYPE = HttpHeaders.createOptimized("text/html; charset=UTF-8"); + + @Inject + VertxRawRockerOutputFactories factories; + + @Inject + FortuneRepository fortuneRepository; + + public void handle(final HttpServerRequest request) { + fortuneRepository.findAllSortedFortunes(fortunes -> { + if (fortunes.succeeded()) { + final var vertxRockerOutput = Fortunes.template(fortunes.result()).render(factories.ioFactory()); + var res = request.response(); + res.headers().add(HttpHeaders.CONTENT_TYPE, HTML_UTF8_CONTENT_TYPE); + res.end(vertxRockerOutput.buffer(), null); + } else { + request.response().setStatusCode(500).end(fortunes.cause().getMessage()); + } + }); + } +} diff --git a/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/resource/HttpQueryParameterUtils.java b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/resource/HttpQueryParameterUtils.java new file mode 100644 index 00000000000..dbebbcb7e6a --- /dev/null +++ b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/resource/HttpQueryParameterUtils.java @@ -0,0 +1,20 @@ +package io.quarkus.benchmark.resource; + +import io.vertx.core.http.HttpServerRequest; + +public class HttpQueryParameterUtils { + + public static int queriesFrom(final HttpServerRequest request) { + final String param = request.getParam("queries"); + + if (param == null) { + return 1; + } + try { + final int parsedValue = Integer.parseInt(param); + return Math.min(500, Math.max(1, parsedValue)); + } catch (final NumberFormatException e) { + return 1; + } + } +} diff --git a/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/resource/HttpRoutes.java b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/resource/HttpRoutes.java new file mode 100644 index 00000000000..8ab91bf7648 --- /dev/null +++ b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/resource/HttpRoutes.java @@ -0,0 +1,109 @@ +package io.quarkus.benchmark.resource; + +import io.netty.handler.codec.http.HttpResponseStatus; +import io.netty.util.concurrent.EventExecutor; +import io.quarkus.benchmark.filter.HttpResponseDecorator; +import io.quarkus.runtime.StartupEvent; +import io.vertx.core.Future; +import io.vertx.core.Handler; +import io.vertx.core.Promise; +import io.vertx.core.Vertx; +import io.vertx.core.http.HttpServer; +import io.vertx.core.http.HttpServerOptions; +import io.vertx.core.http.HttpServerRequest; +import jakarta.annotation.PreDestroy; +import jakarta.enterprise.event.Observes; +import jakarta.inject.Inject; +import jakarta.inject.Singleton; + +import java.util.ArrayList; +import java.util.List; + +@Singleton +public class HttpRoutes { + private static final int PORT = 8080; + private static final String PATH_PLAINTEXT = "/plaintext"; + private static final String PATH_JSON = "/json"; + private static final String PATH_DB = "/db"; + private static final String PATH_QUERIES = "/queries"; + private static final String PATH_UPDATES = "/updates"; + private static final String PATH_FORTUNES = "/fortunes"; + private HttpServer[] servers; + @Inject + private HttpResponseDecorator responseDecorator; + @Inject + private PlaintextHttpHandler plaintextHttpHandler; + @Inject + private JsonHttpHandler jsonHandler; + @Inject + private DbHttpHandler dbHandler; + @Inject + private UpdateHttpHandler updateHandler; + @Inject + private QueriesHttpHandler queriesHandler; + @Inject + private FortunesHttpHandler fortunesHandler; + + private static HttpServer[] createAndStartHttpServers(final Vertx vertx, final Handler requestHandler) { + final var executors = new ArrayList(Runtime.getRuntime().availableProcessors()); + vertx.nettyEventLoopGroup().forEach(executors::add); + final HttpServer[] servers = new HttpServer[executors.size()]; + final List> allHttpServerListening = new ArrayList<>(servers.length); + for (int i = 0; i < servers.length; i++) { + final int executorId = i; + final var done = Promise.promise(); + allHttpServerListening.add(done.future()); + executors.get(executorId).execute(() -> { + servers[executorId] = vertx.createHttpServer(new HttpServerOptions()); + servers[executorId] + .requestHandler(requestHandler) + .listen(PORT); + done.complete(); + }); + } + Future.join(allHttpServerListening).toCompletionStage().toCompletableFuture().join(); + return servers; + } + + public void init(@Observes final StartupEvent startupEvent, final Vertx vertx) { + servers = createAndStartHttpServers(vertx, this::handle); + } + + @PreDestroy + public void shutdown() { + for (final HttpServer server : servers) { + server.close(); + } + } + + private void handle(final HttpServerRequest request) { + try { + responseDecorator.decorate(request.response()); + switch (request.path()) { + case PATH_PLAINTEXT: + plaintextHttpHandler.handle(request); + break; + case PATH_JSON: + jsonHandler.handle(request); + break; + case PATH_DB: + dbHandler.handle(request); + break; + case PATH_QUERIES: + queriesHandler.handle(request); + break; + case PATH_UPDATES: + updateHandler.handle(request); + break; + case PATH_FORTUNES: + fortunesHandler.handle(request); + break; + default: + request.response().setStatusCode(HttpResponseStatus.NOT_FOUND.code()).end(); + break; + } + } catch (final Exception e) { + request.response().setStatusCode(HttpResponseStatus.INTERNAL_SERVER_ERROR.code()).end(); + } + } +} diff --git a/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/resource/JsonHttpHandler.java b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/resource/JsonHttpHandler.java new file mode 100644 index 00000000000..23f686d6850 --- /dev/null +++ b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/resource/JsonHttpHandler.java @@ -0,0 +1,21 @@ +package io.quarkus.benchmark.resource; + +import io.netty.handler.codec.http.HttpHeaderValues; +import io.quarkus.benchmark.model.JsonMessage; +import io.vertx.core.MultiMap; +import io.vertx.core.http.HttpHeaders; +import io.vertx.core.http.HttpServerRequest; +import io.vertx.core.http.HttpServerResponse; +import jakarta.inject.Singleton; + +@Singleton +public class JsonHttpHandler { + + public void handle(final HttpServerRequest request) { + final HttpServerResponse response = request.response(); + final MultiMap headers = response.headers(); + headers.add(HttpHeaders.CONTENT_TYPE, HttpHeaderValues.APPLICATION_JSON); + response.end(new JsonMessage("Hello, World!").toBuffer(), null); + } + +} diff --git a/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/resource/PlaintextHttpHandler.java b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/resource/PlaintextHttpHandler.java new file mode 100644 index 00000000000..52f23fc9d18 --- /dev/null +++ b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/resource/PlaintextHttpHandler.java @@ -0,0 +1,24 @@ +package io.quarkus.benchmark.resource; + +import io.netty.handler.codec.http.HttpHeaderValues; +import io.vertx.core.MultiMap; +import io.vertx.core.buffer.Buffer; +import io.vertx.core.http.HttpHeaders; +import io.vertx.core.http.HttpServerRequest; +import io.vertx.core.http.HttpServerResponse; +import jakarta.inject.Singleton; + +@Singleton +public class PlaintextHttpHandler { + private static final String HELLO_WORLD = "Hello, world!"; + private static final Buffer HELLO_WORLD_BUFFER = Buffer.buffer(HELLO_WORLD, "UTF-8"); + private static final CharSequence HELLO_WORLD_LENGTH = HttpHeaders.createOptimized("" + HELLO_WORLD.length()); + + public void handle(final HttpServerRequest request) { + final HttpServerResponse response = request.response(); + final MultiMap headers = response.headers(); + headers.add(HttpHeaders.CONTENT_LENGTH, HELLO_WORLD_LENGTH); + headers.add(HttpHeaders.CONTENT_TYPE, HttpHeaderValues.TEXT_PLAIN); + response.end(HELLO_WORLD_BUFFER, null); + } +} diff --git a/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/resource/QueriesHttpHandler.java b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/resource/QueriesHttpHandler.java new file mode 100644 index 00000000000..5e1ec023fac --- /dev/null +++ b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/resource/QueriesHttpHandler.java @@ -0,0 +1,28 @@ +package io.quarkus.benchmark.resource; + +import io.netty.handler.codec.http.HttpHeaderValues; +import io.quarkus.benchmark.repository.WorldRepository; +import io.vertx.core.http.HttpHeaders; +import io.vertx.core.http.HttpServerRequest; +import jakarta.inject.Inject; +import jakarta.inject.Singleton; + +import static io.quarkus.benchmark.resource.HttpQueryParameterUtils.queriesFrom; + +@Singleton +public class QueriesHttpHandler { + @Inject + WorldRepository worldRepository; + + public void handle(final HttpServerRequest request) { + worldRepository.loadNJsonWorlds(queriesFrom(request), jsonWorlds -> { + if (jsonWorlds.succeeded()) { + var res = request.response(); + res.headers().add(HttpHeaders.CONTENT_TYPE, HttpHeaderValues.APPLICATION_JSON); + res.end(jsonWorlds.result().toBuffer(), null); + } else { + request.response().setStatusCode(500).end(); + } + }); + } +} diff --git a/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/resource/UpdateHttpHandler.java b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/resource/UpdateHttpHandler.java new file mode 100644 index 00000000000..789accc48f0 --- /dev/null +++ b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/resource/UpdateHttpHandler.java @@ -0,0 +1,29 @@ +package io.quarkus.benchmark.resource; + +import io.netty.handler.codec.http.HttpHeaderValues; +import io.quarkus.benchmark.repository.WorldRepository; +import io.vertx.core.http.HttpHeaders; +import io.vertx.core.http.HttpServerRequest; +import jakarta.inject.Inject; +import jakarta.inject.Singleton; + +import static io.quarkus.benchmark.resource.HttpQueryParameterUtils.queriesFrom; + +@Singleton +public class UpdateHttpHandler { + + @Inject + WorldRepository worldRepository; + + public void handle(final HttpServerRequest request) { + worldRepository.updateNJsonWorlds(queriesFrom(request), jsonWorlds -> { + if (jsonWorlds.succeeded()) { + var res = request.response(); + res.headers().add(HttpHeaders.CONTENT_TYPE, HttpHeaderValues.APPLICATION_JSON); + res.end(jsonWorlds.result().toBuffer(), null); + } else { + request.response().setStatusCode(500).end(); + } + }); + } +} diff --git a/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/rocker/RawRockerOutput.java b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/rocker/RawRockerOutput.java new file mode 100644 index 00000000000..8dd5bec161b --- /dev/null +++ b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/rocker/RawRockerOutput.java @@ -0,0 +1,65 @@ +package io.quarkus.benchmark.rocker; + +import com.fizzed.rocker.ContentType; +import com.fizzed.rocker.RockerOutputFactory; +import io.netty.buffer.ByteBuf; +import io.vertx.core.buffer.Buffer; +import io.vertx.core.buffer.impl.PartialPooledByteBufAllocator; + +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; + +final class RawRockerOutput implements VertxRawRockerOutput { + + private final ByteBuf buff = PartialPooledByteBufAllocator.INSTANCE.directBuffer(); + private final Buffer buffer = Buffer.buffer(buff); + + RawRockerOutput() { + } + + public static RockerOutputFactory raw() { + final RawRockerOutput output = new RawRockerOutput(); + return (_contentType, charsetName) -> { + output.reset(); + return output; + }; + } + + private void reset() { + buff.resetReaderIndex(); + buff.resetWriterIndex(); + } + + @Override + public RawRockerOutput w(final byte[] bytes) throws IOException { + buffer.appendBytes(bytes); + return this; + } + + @Override + public RawRockerOutput w(final String s) throws IOException { + buffer.appendString(s); + return this; + } + + @Override + public ContentType getContentType() { + return ContentType.RAW; + } + + @Override + public Charset getCharset() { + return StandardCharsets.UTF_8; + } + + @Override + public int getByteLength() { + return buffer.length(); + } + + @Override + public Buffer buffer() { + return buffer; + } +} diff --git a/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/rocker/VertxRawRockerOutput.java b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/rocker/VertxRawRockerOutput.java new file mode 100644 index 00000000000..ada27e4e4bf --- /dev/null +++ b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/rocker/VertxRawRockerOutput.java @@ -0,0 +1,15 @@ +package io.quarkus.benchmark.rocker; + +import com.fizzed.rocker.RockerOutputFactory; +import io.vertx.core.buffer.Buffer; + +public interface VertxRawRockerOutput extends com.fizzed.rocker.RockerOutput { + + // factory + static RockerOutputFactory factory() { + return RawRockerOutput.raw(); + } + + Buffer buffer(); + +} diff --git a/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/rocker/VertxRawRockerOutputFactories.java b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/rocker/VertxRawRockerOutputFactories.java new file mode 100644 index 00000000000..faf834738c4 --- /dev/null +++ b/frameworks/Java/quarkus/vertx/src/main/java/io/quarkus/benchmark/rocker/VertxRawRockerOutputFactories.java @@ -0,0 +1,29 @@ +package io.quarkus.benchmark.rocker; + +import com.fizzed.rocker.RockerOutputFactory; +import io.netty.util.concurrent.FastThreadLocal; +import io.vertx.core.Context; +import jakarta.inject.Singleton; + +@Singleton +public class VertxRawRockerOutputFactories { + + private final FastThreadLocal> ioPool; + + VertxRawRockerOutputFactories() { + ioPool = new FastThreadLocal<>() { + @Override + protected RockerOutputFactory initialValue() { + if (!Context.isOnEventLoopThread()) { + return null; + } + return VertxRawRockerOutput.factory(); + } + }; + } + + public RockerOutputFactory ioFactory() { + return ioPool.get(); + } + +} diff --git a/frameworks/Java/quarkus/vertx/src/main/resources/application.properties b/frameworks/Java/quarkus/vertx/src/main/resources/application.properties new file mode 100644 index 00000000000..a439fe7208a --- /dev/null +++ b/frameworks/Java/quarkus/vertx/src/main/resources/application.properties @@ -0,0 +1,10 @@ +quarkus.datasource.url=vertx-reactive:postgresql://tfb-database:5432/hello_world +%dev.quarkus.datasource.url=vertx-reactive:postgresql://localhost:5432/hello_world +quarkus.datasource.username=benchmarkdbuser +quarkus.datasource.password=benchmarkdbpass + +quarkus.log.console.enable=true +quarkus.log.console.level=INFO +quarkus.log.file.enable=false +quarkus.log.level=INFO + diff --git a/frameworks/Java/quarkus/vertx/src/main/resources/import.sql b/frameworks/Java/quarkus/vertx/src/main/resources/import.sql new file mode 100644 index 00000000000..f76881b4287 --- /dev/null +++ b/frameworks/Java/quarkus/vertx/src/main/resources/import.sql @@ -0,0 +1 @@ +INSERT INTO Fortune(id, message) VALUES (1, 'Test value One'); \ No newline at end of file diff --git a/frameworks/Java/quarkus/vertx/src/main/resources/views/Fortunes.rocker.html b/frameworks/Java/quarkus/vertx/src/main/resources/views/Fortunes.rocker.html new file mode 100644 index 00000000000..cfa4f8341e2 --- /dev/null +++ b/frameworks/Java/quarkus/vertx/src/main/resources/views/Fortunes.rocker.html @@ -0,0 +1,8 @@ +@import java.util.* +@import io.quarkus.benchmark.model.* +@args(List fortunes) +Fortunes +@for ((ForIterator i, Fortune fortune) : fortunes) { + +} +
idmessage
@fortune.getId()@fortune.getMessage()
\ No newline at end of file From 04c882eaaa63f074a619e80b3d4435af895ba678 Mon Sep 17 00:00:00 2001 From: Fangdun Tsai Date: Thu, 4 Jan 2024 04:38:51 +0800 Subject: [PATCH 082/210] [Viz]: v0.7.0 (#8658) --- frameworks/Rust/viz/Cargo.toml | 7 ++++--- frameworks/Rust/viz/src/db_diesel.rs | 4 +--- frameworks/Rust/viz/src/db_pg.rs | 6 +++--- frameworks/Rust/viz/src/db_sqlx.rs | 6 ++---- frameworks/Rust/viz/src/main.rs | 10 ++++----- frameworks/Rust/viz/src/main_diesel.rs | 10 +++------ frameworks/Rust/viz/src/main_pg.rs | 19 +++++++---------- frameworks/Rust/viz/src/main_sqlx.rs | 8 ++------ frameworks/Rust/viz/src/models.rs | 4 +--- frameworks/Rust/viz/src/models_diesel.rs | 4 +--- frameworks/Rust/viz/src/models_sqlx.rs | 4 +--- frameworks/Rust/viz/src/server.rs | 25 +++++++++++++++++------ frameworks/Rust/viz/viz-diesel.dockerfile | 2 +- frameworks/Rust/viz/viz-pg.dockerfile | 2 +- frameworks/Rust/viz/viz-sqlx.dockerfile | 2 +- frameworks/Rust/viz/viz.dockerfile | 2 +- 16 files changed, 52 insertions(+), 63 deletions(-) diff --git a/frameworks/Rust/viz/Cargo.toml b/frameworks/Rust/viz/Cargo.toml index 462dbb7bc31..d8b34ca3435 100644 --- a/frameworks/Rust/viz/Cargo.toml +++ b/frameworks/Rust/viz/Cargo.toml @@ -24,8 +24,9 @@ path = "src/main_diesel.rs" required-features = ["diesel", "diesel-async", "sailfish"] [dependencies] -viz = "0.4" -hyper = "0.14" +viz = "0.7" +hyper = "1.0" +hyper-util = "0.1" atoi = "2.0" serde = { version = "1.0", features = ["derive"] } nanorand = "0.7" @@ -50,7 +51,7 @@ diesel-async = { version = "0.4", default-features = false, features = [ ], optional = true } yarte = { version = "0.15", features = ["bytes-buf", "json"], optional = true } -markup = { version = "0.13", optional = true } +markup = { version = "0.15", optional = true } v_htmlescape = { version = "0.15", optional = true } sailfish = { version = "0.8", optional = true } diff --git a/frameworks/Rust/viz/src/db_diesel.rs b/frameworks/Rust/viz/src/db_diesel.rs index 9e93bb342ba..624000a7d1d 100644 --- a/frameworks/Rust/viz/src/db_diesel.rs +++ b/frameworks/Rust/viz/src/db_diesel.rs @@ -1,5 +1,3 @@ -use std::borrow::Cow; - use diesel::prelude::*; use diesel_async::{ pooled_connection::bb8::{Pool, RunError}, @@ -112,7 +110,7 @@ pub async fn tell_fortune(pool: Pool) -> Result Result, PgError> { let mut items = vec![Fortune { id: 0, - message: Cow::Borrowed("Additional fortune added at request time."), + message: "Additional fortune added at request time.".to_string(), }]; let stream = self @@ -176,7 +176,7 @@ impl PgConnection { items.push(Fortune { id: row.get(0), - message: Cow::Owned(row.get(1)), + message: row.get(1), }); } diff --git a/frameworks/Rust/viz/src/db_sqlx.rs b/frameworks/Rust/viz/src/db_sqlx.rs index cf8c10c8799..17ca1b2914d 100644 --- a/frameworks/Rust/viz/src/db_sqlx.rs +++ b/frameworks/Rust/viz/src/db_sqlx.rs @@ -1,5 +1,3 @@ -use std::borrow::Cow; - use nanorand::{Rng, WyRand}; pub use sqlx::{ @@ -110,14 +108,14 @@ pub async fn get_fortunes( let mut items = sqlx::query("SELECT * FROM Fortune") .map(|row: PgRow| Fortune { id: row.get(0), - message: Cow::Owned(row.get(1)), + message: row.get(1), }) .fetch_all(&mut *conn) .await?; items.push(Fortune { id: 0, - message: Cow::Borrowed("Additional fortune added at request time."), + message: "Additional fortune added at request time.".to_string(), }); items.sort_by(|it, next| it.message.cmp(&next.message)); diff --git a/frameworks/Rust/viz/src/main.rs b/frameworks/Rust/viz/src/main.rs index 0550a8ffc4a..cce1506c8d0 100644 --- a/frameworks/Rust/viz/src/main.rs +++ b/frameworks/Rust/viz/src/main.rs @@ -3,7 +3,7 @@ use serde::Serialize; use viz::{ header::{HeaderValue, SERVER}, - Error, Request, Response, ResponseExt, Result, Router, ServiceMaker, + Error, Request, Response, ResponseExt, Result, Router, Tree, }; mod server; @@ -36,9 +36,7 @@ async fn main() -> Result<()> { .get("/plaintext", plaintext) .get("/json", json); - server::builder() - .http1_pipeline_flush(true) - .serve(ServiceMaker::from(app)) - .await - .map_err(Error::normal) + let tree = Tree::from(app); + + server::serve(tree).await.map_err(Error::Boxed) } diff --git a/frameworks/Rust/viz/src/main_diesel.rs b/frameworks/Rust/viz/src/main_diesel.rs index a8212b505fd..b8a315a7abf 100644 --- a/frameworks/Rust/viz/src/main_diesel.rs +++ b/frameworks/Rust/viz/src/main_diesel.rs @@ -11,7 +11,7 @@ use nanorand::{Rng, WyRand}; use viz::{ header::{HeaderValue, SERVER}, types::State, - Request, RequestExt, Response, ResponseExt, Result, Router, ServiceMaker, + Request, RequestExt, Response, ResponseExt, Result, Router, Tree, }; mod db_diesel; @@ -89,7 +89,7 @@ async fn main() { let rng = WyRand::new(); - let service = ServiceMaker::from( + let tree = Tree::from( Router::new() .get("/db", db) .get("/fortunes", fortunes) @@ -99,9 +99,5 @@ async fn main() { .with(State::new(rng)), ); - serve(service).await; -} - -async fn serve(service: ServiceMaker) { - server::builder().serve(service).await.unwrap() + server::serve(tree).await.unwrap() } diff --git a/frameworks/Rust/viz/src/main_pg.rs b/frameworks/Rust/viz/src/main_pg.rs index abd3638b134..a1d7212b579 100644 --- a/frameworks/Rust/viz/src/main_pg.rs +++ b/frameworks/Rust/viz/src/main_pg.rs @@ -6,7 +6,7 @@ use std::{ use viz::{ header::{HeaderValue, SERVER}, types::State, - Request, RequestExt, Response, ResponseExt, Result, Router, ServiceMaker, + Request, RequestExt, Response, ResponseExt, Result, Router, Tree, }; use yarte::Template; @@ -19,8 +19,8 @@ use db_pg::{get_conn, PgConnection}; #[derive(Template)] #[template(path = "fortune.hbs")] -pub struct FortunesTemplate<'a> { - pub fortunes: &'a Vec, +pub struct FortunesTemplate { + pub fortunes: Vec, } const DB_URL: &str = @@ -42,11 +42,9 @@ async fn fortunes(req: Request) -> Result { let fortunes = conn.tell_fortune().await?; - let buf = FortunesTemplate { - fortunes: &fortunes, - } - .call() - .expect("error rendering template"); + let buf = FortunesTemplate { fortunes } + .call() + .expect("error rendering template"); let mut res = Response::html(buf); res.headers_mut() @@ -107,8 +105,5 @@ async fn serve() { .get("/updates", updates) .with(State::new(conn)); - server::builder() - .serve(ServiceMaker::from(app)) - .await - .unwrap() + server::serve(Tree::from(app)).await.unwrap() } diff --git a/frameworks/Rust/viz/src/main_sqlx.rs b/frameworks/Rust/viz/src/main_sqlx.rs index 9b150d13901..55ef8f77556 100644 --- a/frameworks/Rust/viz/src/main_sqlx.rs +++ b/frameworks/Rust/viz/src/main_sqlx.rs @@ -4,8 +4,7 @@ use nanorand::{Rng, WyRand}; use viz::{ header::{HeaderValue, SERVER}, types::State, - BytesMut, Error, Request, RequestExt, Response, ResponseExt, Result, Router, - ServiceMaker, + BytesMut, Error, Request, RequestExt, Response, ResponseExt, Result, Router, Tree, }; mod db_sqlx; @@ -101,10 +100,7 @@ async fn main() -> Result<()> { .with(State::new(pool)) .with(State::new(rng)); - server::builder() - .serve(ServiceMaker::from(app)) - .await - .map_err(Error::normal) + server::serve(Tree::from(app)).await.map_err(Error::Boxed) } markup::define! { diff --git a/frameworks/Rust/viz/src/models.rs b/frameworks/Rust/viz/src/models.rs index 016cb56bb63..b059bab4c23 100644 --- a/frameworks/Rust/viz/src/models.rs +++ b/frameworks/Rust/viz/src/models.rs @@ -1,5 +1,3 @@ -use std::borrow::Cow; - use serde::Serialize; #[derive(Serialize, Debug, yarte::Serialize)] @@ -11,5 +9,5 @@ pub struct World { #[derive(Serialize, Debug)] pub struct Fortune { pub id: i32, - pub message: Cow<'static, str>, + pub message: String, } diff --git a/frameworks/Rust/viz/src/models_diesel.rs b/frameworks/Rust/viz/src/models_diesel.rs index c0e3356b404..63711594223 100644 --- a/frameworks/Rust/viz/src/models_diesel.rs +++ b/frameworks/Rust/viz/src/models_diesel.rs @@ -1,5 +1,3 @@ -use std::borrow::Cow; - use diesel::Queryable; use sailfish::TemplateOnce; use serde::Serialize; @@ -13,7 +11,7 @@ pub struct World { #[derive(Serialize, Queryable, Debug)] pub struct Fortune { pub id: i32, - pub message: Cow<'static, str>, + pub message: String, } #[derive(TemplateOnce)] diff --git a/frameworks/Rust/viz/src/models_sqlx.rs b/frameworks/Rust/viz/src/models_sqlx.rs index 23ef27aa8c2..2f3657a9936 100644 --- a/frameworks/Rust/viz/src/models_sqlx.rs +++ b/frameworks/Rust/viz/src/models_sqlx.rs @@ -1,5 +1,3 @@ -use std::borrow::Cow; - use serde::{Deserialize, Serialize}; use sqlx::FromRow; @@ -12,5 +10,5 @@ pub struct World { #[derive(Debug, PartialEq, Deserialize, Serialize, FromRow)] pub struct Fortune { pub id: i32, - pub message: Cow<'static, str>, + pub message: String, } diff --git a/frameworks/Rust/viz/src/server.rs b/frameworks/Rust/viz/src/server.rs index 629ea202be8..492a8618eb4 100644 --- a/frameworks/Rust/viz/src/server.rs +++ b/frameworks/Rust/viz/src/server.rs @@ -1,19 +1,32 @@ +use std::error::Error; use std::io; use std::net::{Ipv4Addr, SocketAddr}; +use std::sync::Arc; -use hyper::server::conn::AddrIncoming; +use hyper::server::conn::http1::Builder; +use hyper_util::rt::TokioIo; use tokio::net::{TcpListener, TcpSocket}; -pub fn builder() -> hyper::server::Builder { +pub async fn serve(tree: viz::Tree) -> Result<(), Box> { + let tree = Arc::new(tree); let addr = SocketAddr::from((Ipv4Addr::UNSPECIFIED, 8080)); let listener = reuse_listener(addr).expect("couldn't bind to addr"); - let incoming = AddrIncoming::from_listener(listener).unwrap(); println!("Started viz server at 8080"); - viz::Server::builder(incoming) - .http1_only(true) - .tcp_nodelay(true) + loop { + let (tcp, _) = listener.accept().await?; + let io = TokioIo::new(tcp); + let tree = tree.clone(); + + tokio::task::spawn(async move { + Builder::new() + .pipeline_flush(true) + .serve_connection(io, viz::Responder::new(tree, None)) + .with_upgrades() + .await + }); + } } fn reuse_listener(addr: SocketAddr) -> io::Result { diff --git a/frameworks/Rust/viz/viz-diesel.dockerfile b/frameworks/Rust/viz/viz-diesel.dockerfile index 0a12925e22e..df385180f91 100644 --- a/frameworks/Rust/viz/viz-diesel.dockerfile +++ b/frameworks/Rust/viz/viz-diesel.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.72 +FROM rust:1.74.1 RUN apt-get update -yqq && apt-get install -yqq cmake g++ diff --git a/frameworks/Rust/viz/viz-pg.dockerfile b/frameworks/Rust/viz/viz-pg.dockerfile index 94a47249193..d917098acf0 100644 --- a/frameworks/Rust/viz/viz-pg.dockerfile +++ b/frameworks/Rust/viz/viz-pg.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.72 +FROM rust:1.74.1 RUN apt-get update -yqq && apt-get install -yqq cmake g++ diff --git a/frameworks/Rust/viz/viz-sqlx.dockerfile b/frameworks/Rust/viz/viz-sqlx.dockerfile index d0045817729..9d21ada4e12 100644 --- a/frameworks/Rust/viz/viz-sqlx.dockerfile +++ b/frameworks/Rust/viz/viz-sqlx.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.72 +FROM rust:1.74.1 RUN apt-get update -yqq && apt-get install -yqq cmake g++ diff --git a/frameworks/Rust/viz/viz.dockerfile b/frameworks/Rust/viz/viz.dockerfile index 4fce0bf378d..e84a96ea0b6 100644 --- a/frameworks/Rust/viz/viz.dockerfile +++ b/frameworks/Rust/viz/viz.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.72 +FROM rust:1.74.1 RUN apt-get update -yqq && apt-get install -yqq cmake g++ From baa58420857a72f97627fc5cc1090d5e80d3684d Mon Sep 17 00:00:00 2001 From: fakeshadow <24548779@qq.com> Date: Thu, 4 Jan 2024 04:39:13 +0800 Subject: [PATCH 083/210] [xitca-web] add sync bench. (#8661) * [xitca-web] add sync bench. * fix wasm build. * add url encode deserialize impl. * update axum. * update dep. reduce loc. * remove toolchain patch. * fix wasm build. --- frameworks/Rust/xitca-web/Cargo.lock | 478 +++++++++++++----- frameworks/Rust/xitca-web/Cargo.toml | 32 +- .../Rust/xitca-web/benchmark_config.json | 22 + frameworks/Rust/xitca-web/rust-toolchain.toml | 2 - frameworks/Rust/xitca-web/src/db.rs | 25 +- frameworks/Rust/xitca-web/src/db_diesel.rs | 121 +++++ frameworks/Rust/xitca-web/src/main.rs | 14 +- frameworks/Rust/xitca-web/src/main_axum.rs | 125 +---- frameworks/Rust/xitca-web/src/main_iou.rs | 7 +- frameworks/Rust/xitca-web/src/main_sync.rs | 76 +++ frameworks/Rust/xitca-web/src/main_wasm.rs | 12 +- frameworks/Rust/xitca-web/src/schema.rs | 13 + frameworks/Rust/xitca-web/src/ser.rs | 73 ++- frameworks/Rust/xitca-web/src/util.rs | 70 +-- .../Rust/xitca-web/xitca-web-axum.dockerfile | 2 +- .../Rust/xitca-web/xitca-web-iou.dockerfile | 2 +- .../Rust/xitca-web/xitca-web-sync.dockerfile | 10 + .../Rust/xitca-web/xitca-web-wasm.dockerfile | 3 +- .../Rust/xitca-web/xitca-web.dockerfile | 2 +- 19 files changed, 784 insertions(+), 305 deletions(-) delete mode 100644 frameworks/Rust/xitca-web/rust-toolchain.toml create mode 100644 frameworks/Rust/xitca-web/src/db_diesel.rs create mode 100644 frameworks/Rust/xitca-web/src/main_sync.rs create mode 100644 frameworks/Rust/xitca-web/src/schema.rs create mode 100644 frameworks/Rust/xitca-web/xitca-web-sync.dockerfile diff --git a/frameworks/Rust/xitca-web/Cargo.lock b/frameworks/Rust/xitca-web/Cargo.lock index 4429973312f..eaa2e63b0a2 100644 --- a/frameworks/Rust/xitca-web/Cargo.lock +++ b/frameworks/Rust/xitca-web/Cargo.lock @@ -19,9 +19,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "async-trait" -version = "0.1.74" +version = "0.1.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" +checksum = "fdf6721fb0140e4f897002dd086c06f6c27775df19cfe1fccb21181a48fd2c98" dependencies = [ "proc-macro2", "quote", @@ -45,18 +45,19 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "axum" -version = "0.6.20" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" +checksum = "202651474fe73c62d9e0a56c6133f7a0ff1dc1c8cf7a5b03381af2a26553ac9d" dependencies = [ "async-trait", "axum-core", - "bitflags 1.3.2", "bytes", "futures-util", "http", "http-body", + "http-body-util", "hyper", + "hyper-util", "itoa", "matchit", "memchr", @@ -77,17 +78,20 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.3.4" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" +checksum = "77cb22c689c44d4c07b0ab44ebc25d69d8ae601a2f28fb8d672d344178fa17aa" dependencies = [ "async-trait", "bytes", "futures-util", "http", "http-body", + "http-body-util", "mime", + "pin-project-lite", "rustversion", + "sync_wrapper", "tower-layer", "tower-service", ] @@ -180,6 +184,41 @@ dependencies = [ "typenum", ] +[[package]] +name = "diesel" +version = "2.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62c6fcf842f17f8c78ecf7c81d75c5ce84436b41ee07e03f490fbb5f5a8731d8" +dependencies = [ + "bitflags 2.4.1", + "byteorder", + "diesel_derives", + "itoa", + "pq-sys", + "r2d2", +] + +[[package]] +name = "diesel_derives" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef8337737574f55a468005a83499da720f20c65586241ffea339db9ecdfd2b44" +dependencies = [ + "diesel_table_macro_syntax", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "diesel_table_macro_syntax" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc5557efc453706fed5e4fa85006fe9817c224c3f480a34c7e5959fd700921c5" +dependencies = [ + "syn", +] + [[package]] name = "digest" version = "0.10.7" @@ -191,6 +230,12 @@ dependencies = [ "subtle", ] +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + [[package]] name = "fallible-iterator" version = "0.2.0" @@ -199,14 +244,14 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "filetime" -version = "0.2.22" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4029edd3e734da6fe05b6cd7bd2960760a616bd2ddd0d59a0124746d6272af0" +checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" dependencies = [ "cfg-if", "libc", "redox_syscall", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -232,30 +277,36 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", ] [[package]] name = "futures-core" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "futures-task" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-util" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-core", "futures-task", @@ -290,6 +341,31 @@ version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" +[[package]] +name = "h2" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d308f63daf4181410c242d34c11f928dcb3aa105852019e043c9d1f4e4368a" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" + [[package]] name = "hermit-abi" version = "0.3.3" @@ -307,18 +383,18 @@ dependencies = [ [[package]] name = "home" -version = "0.5.5" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" dependencies = [ - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "http" -version = "0.2.11" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" +checksum = "b32afd38673a8016f7c9ae69e5af41a58f81b1d31689040f2f1959594ce194ea" dependencies = [ "bytes", "fnv", @@ -327,20 +403,26 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.5" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +checksum = "1cac85db508abc24a2e48553ba12a996e87244a0395ce011e62b37158745d643" dependencies = [ "bytes", "http", - "pin-project-lite", ] [[package]] -name = "http-range-header" -version = "0.3.1" +name = "http-body-util" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "add0ab9360ddbd88cfeb3bd9574a1d85cfdfa14db10b3e21d3700dbc4328758f" +checksum = "41cb79eb393015dadd30fc252023adb0b2400a0caee0fa2a077e6e21a551e840" +dependencies = [ + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", +] [[package]] name = "httparse" @@ -356,25 +438,49 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.27" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +checksum = "fb5aa53871fc917b1a9ed87b683a5d86db645e23acb32c2e0785a353e522fb75" dependencies = [ "bytes", "futures-channel", - "futures-core", "futures-util", + "h2", "http", "http-body", "httparse", "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.10", "tokio", - "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdea9aac0dbe5a9240d68cfd9501e2db94222c6dc06843e06640b9e07f0fdc67" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "pin-project-lite", + "socket2 0.5.5", + "tokio", "tracing", - "want", +] + +[[package]] +name = "indexmap" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +dependencies = [ + "equivalent", + "hashbrown", ] [[package]] @@ -389,9 +495,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "itoap" @@ -401,18 +507,18 @@ checksum = "9028f49264629065d057f340a86acb84867925865f73bbf8d47b4d149a7e88b8" [[package]] name = "libc" -version = "0.2.150" +version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" +checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" [[package]] -name = "libmimalloc-sys" -version = "0.1.35" +name = "lock_api" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3979b5c37ece694f1f5e51e7ecc871fdb0f517ed04ee45f88d15d6d553cb9664" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" dependencies = [ - "cc", - "libc", + "autocfg", + "scopeguard", ] [[package]] @@ -439,18 +545,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.6.4" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" - -[[package]] -name = "mimalloc" -version = "0.1.39" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa01922b5ea280a911e323e4d2fd24b7fe5cc4042e0d2cda3c40775cdc4bdc9c" -dependencies = [ - "libmimalloc-sys", -] +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" [[package]] name = "mime" @@ -474,7 +571,7 @@ source = "git+https://github.com/fakeshadow/mio.git?rev=52b72d372bfe5807755b7f5e dependencies = [ "libc", "wasi", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -504,18 +601,41 @@ dependencies = [ [[package]] name = "object" -version = "0.32.1" +version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" dependencies = [ "memchr", ] [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.48.5", +] [[package]] name = "percent-encoding" @@ -590,11 +710,20 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +[[package]] +name = "pq-sys" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31c0052426df997c0cbd30789eb44ca097e3541717a7b8fa36b1c464ee7edebd" +dependencies = [ + "vcpkg", +] + [[package]] name = "proc-macro2" -version = "1.0.70" +version = "1.0.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +checksum = "75cb1540fadbd5b8fbccc4dddad2734eba435053f725621c070711a14bb5f4b8" dependencies = [ "unicode-ident", ] @@ -608,6 +737,17 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "r2d2" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51de85fb3fb6524929c8a2eb85e6b6d363de4e8c48f9e2c2eac4944abc181c93" +dependencies = [ + "log", + "parking_lot", + "scheduled-thread-pool", +] + [[package]] name = "rand" version = "0.8.5" @@ -640,9 +780,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.3.5" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ "bitflags 1.3.2", ] @@ -661,9 +801,9 @@ checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" [[package]] name = "ryu" -version = "1.0.15" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" [[package]] name = "sailfish" @@ -701,12 +841,27 @@ dependencies = [ "sailfish-compiler", ] +[[package]] +name = "scheduled-thread-pool" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cbc66816425a074528352f5789333ecff06ca41b36b0b0efdfbb29edc391a19" +dependencies = [ + "parking_lot", +] + [[package]] name = "scoped-tls" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + [[package]] name = "serde" version = "1.0.193" @@ -789,6 +944,12 @@ dependencies = [ "autocfg", ] +[[package]] +name = "smallvec" +version = "1.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" + [[package]] name = "socket2" version = "0.4.10" @@ -806,7 +967,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -828,9 +989,9 @@ checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "syn" -version = "2.0.39" +version = "2.0.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +checksum = "ee659fb5f3d355364e1f3e5bc10fb82068efbf824a1e9d1c9504244a6469ad53" dependencies = [ "proc-macro2", "quote", @@ -860,18 +1021,19 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.34.0" +version = "1.35.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0c014766411e834f7af5b8f4cf46257aab4036ca95e9d2c144a10f59ad6f5b9" +checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104" dependencies = [ "backtrace", + "bytes", "libc", "mio", "num_cpus", "pin-project-lite", "signal-hook-registry", "socket2 0.5.5", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -889,6 +1051,20 @@ dependencies = [ "tokio", ] +[[package]] +name = "tokio-util" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", + "tracing", +] + [[package]] name = "tower" version = "0.4.13" @@ -907,17 +1083,15 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.4.4" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c5bb1d698276a2443e5ecfabc1008bf15a36c12e6a7176e7bf089ea9131140" +checksum = "09e12e6351354851911bdf8c2b8f2ab15050c567d70a8b9a37ae7b8301a4080d" dependencies = [ "bitflags 2.4.1", "bytes", - "futures-core", - "futures-util", "http", "http-body", - "http-range-header", + "http-body-util", "pin-project-lite", "tower-layer", "tower-service", @@ -955,12 +1129,6 @@ dependencies = [ "once_cell", ] -[[package]] -name = "try-lock" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" - [[package]] name = "typenum" version = "1.17.0" @@ -969,9 +1137,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicode-bidi" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" +checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416" [[package]] name = "unicode-ident" @@ -989,19 +1157,16 @@ dependencies = [ ] [[package]] -name = "version_check" -version = "0.9.4" +name = "vcpkg" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" [[package]] -name = "want" -version = "0.3.1" +name = "version_check" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "wasi" @@ -1037,7 +1202,16 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.0", ] [[package]] @@ -1046,13 +1220,28 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +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", ] [[package]] @@ -1061,46 +1250,99 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" + [[package]] name = "windows_i686_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +[[package]] +name = "windows_i686_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" + [[package]] name = "windows_i686_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_i686_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" + +[[package]] +name = "xitca-codegen" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "185ec568d3620ab5129371e5fbfbc8c7b2791f10ed4e0ff216f8784cd896127c" +dependencies = [ + "quote", + "syn", +] + [[package]] name = "xitca-http" version = "0.1.0" -source = "git+https://github.com/HFQR/xitca-web.git?rev=263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f#263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5667ed780b72789d84460bd5e13a44f009d24914bf3f7a670239d32b98bce29c" dependencies = [ "futures-core", "http", @@ -1121,7 +1363,8 @@ dependencies = [ [[package]] name = "xitca-io" version = "0.1.0" -source = "git+https://github.com/HFQR/xitca-web.git?rev=263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f#263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e887cc8153538637515e0663704f3492803c5bb48eb7947c80689154d965b7e0" dependencies = [ "bytes", "tokio", @@ -1132,7 +1375,7 @@ dependencies = [ [[package]] name = "xitca-postgres" version = "0.1.0" -source = "git+https://github.com/HFQR/xitca-web.git?rev=263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f#263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" +source = "git+https://github.com/HFQR/xitca-web.git?rev=d79f510197e0f36534fe22b7a467c55dbd683681#d79f510197e0f36534fe22b7a467c55dbd683681" dependencies = [ "fallible-iterator", "percent-encoding", @@ -1148,7 +1391,8 @@ dependencies = [ [[package]] name = "xitca-router" version = "0.1.0" -source = "git+https://github.com/HFQR/xitca-web.git?rev=263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f#263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8696e96f1401baee0bc577bc4cfcdc5c6a90f0c183aa2cc011ecb60f1ae5b73e" dependencies = [ "xitca-unsafe-collection", ] @@ -1156,7 +1400,8 @@ dependencies = [ [[package]] name = "xitca-server" version = "0.1.0" -source = "git+https://github.com/HFQR/xitca-web.git?rev=263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f#263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d07160d17cf458adf7f38a2f7bc37ecb15732909683e614bcfe5f6ac8202bda5" dependencies = [ "socket2 0.5.5", "tokio", @@ -1170,12 +1415,14 @@ dependencies = [ [[package]] name = "xitca-service" version = "0.1.0" -source = "git+https://github.com/HFQR/xitca-web.git?rev=263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f#263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09a4a38548b14925111dd99560f0a10d1eb9e3e117fa5471c35387ed6f77b58c" [[package]] name = "xitca-unsafe-collection" version = "0.1.0" -source = "git+https://github.com/HFQR/xitca-web.git?rev=263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f#263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c38c5b92c72ba986bb2c2f4fc40ec56e841194773c02278f3c8d4c9733807270" dependencies = [ "bytes", ] @@ -1186,11 +1433,10 @@ version = "0.1.0" dependencies = [ "atoi", "axum", + "diesel", "futures-core", "http-body", - "mimalloc", "nanorand", - "pin-project-lite", "sailfish", "serde", "serde_json", @@ -1203,19 +1449,25 @@ dependencies = [ "xitca-server", "xitca-service", "xitca-unsafe-collection", - "xitca-web 0.1.0 (git+https://github.com/HFQR/xitca-web.git?rev=263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f)", + "xitca-web 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "xitca-web" version = "0.1.0" -source = "git+https://github.com/HFQR/xitca-web.git?rev=263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f#263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ed23e2be4e1d6aa730af2646a933cbb8048de5f5549a5040672a95553f6df04" dependencies = [ "futures-core", + "http-body", "pin-project-lite", "serde", "serde_json", + "serde_urlencoded", "tokio", + "tower-layer", + "tower-service", + "xitca-codegen", "xitca-http", "xitca-server", "xitca-service", diff --git a/frameworks/Rust/xitca-web/Cargo.toml b/frameworks/Rust/xitca-web/Cargo.toml index d1367c3fb07..bd4c7f8edbb 100644 --- a/frameworks/Rust/xitca-web/Cargo.toml +++ b/frameworks/Rust/xitca-web/Cargo.toml @@ -23,6 +23,11 @@ name = "xitca-web-axum" path = "./src/main_axum.rs" required-features = ["axum", "io-uring", "pg-sync", "template"] +[[bin]] +name = "xitca-web-sync" +path = "./src/main_sync.rs" +required-features = ["pg-orm", "template", "web-codegen"] + [features] # pg optional pg = ["xitca-postgres/single-thread"] @@ -30,16 +35,20 @@ pg = ["xitca-postgres/single-thread"] pg-sync = ["xitca-postgres"] # pg io_uring optional pg-iou = ["pg", "xitca-postgres/io-uring"] +# pg orm optional +pg-orm = ["diesel"] # http router optional router = ["xitca-http/router"] # web optional web = ["xitca-web"] +# web codegen optional +web-codegen = ["xitca-web/codegen", "xitca-web/urlencoded"] # template optional template = ["sailfish"] # io-uring optional io-uring = ["xitca-http/io-uring", "xitca-server/io-uring"] # axum optional -axum = ["dep:axum", "http-body", "pin-project-lite", "tower", "tower-http"] +axum = ["dep:axum", "http-body", "tower", "tower-http", "xitca-web/tower-http-compat" ] [dependencies] xitca-http = "0.1" @@ -58,20 +67,21 @@ xitca-web = { version = "0.1", features = ["json"], optional = true } # raw-pg optional xitca-postgres = { version = "0.1", optional = true } +# orm optional +diesel = { version = "2", features = ["postgres", "r2d2"], optional = true } + # template optional sailfish = { version = "0.8", default-features = false, features = ["derive", "perf-inline"], optional = true } # axum optional -axum = { version = "0.6", optional = true } -http-body = { version = "0.4", optional = true } -pin-project-lite = { version = "0.2", optional = true } +axum = { version = "0.7", optional = true } +http-body = { version = "1", optional = true } tower = { version = "0.4", optional = true } -tower-http = { version = "0.4", features = ["set-header"], optional = true } +tower-http = { version = "0.5", features = ["set-header"], optional = true } # stuff can not be used or not needed in wasi target [target.'cfg(not(target_family = "wasm"))'.dependencies] futures-core = { version = "0.3", default-features = false } -mimalloc = { version = "0.1", default-features = false } nanorand = { version = "0.7", default-features = false, features = ["tls"] } tokio = "1" @@ -82,13 +92,5 @@ codegen-units = 1 panic = "abort" [patch.crates-io] -xitca-http = { git = "https://github.com/HFQR/xitca-web.git", rev = "263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" } -xitca-io = { git = "https://github.com/HFQR/xitca-web.git", rev = "263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" } -xitca-postgres = { git = "https://github.com/HFQR/xitca-web.git", rev = "263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" } -xitca-router = { git = "https://github.com/HFQR/xitca-web.git", rev = "263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" } -xitca-server = { git = "https://github.com/HFQR/xitca-web.git", rev = "263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" } -xitca-service = { git = "https://github.com/HFQR/xitca-web.git", rev = "263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" } -xitca-unsafe-collection = { git = "https://github.com/HFQR/xitca-web.git", rev = "263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" } -xitca-web = { git = "https://github.com/HFQR/xitca-web.git", rev = "263ea4e01f8f840dfdb3b82ba804d7b0912d5e7f" } - +xitca-postgres = { git = "https://github.com/HFQR/xitca-web.git", rev = "d79f510197e0f36534fe22b7a467c55dbd683681" } mio = { git = "https://github.com/fakeshadow/mio.git", rev = "52b72d372bfe5807755b7f5e3e1edf282954d6ba" } diff --git a/frameworks/Rust/xitca-web/benchmark_config.json b/frameworks/Rust/xitca-web/benchmark_config.json index 57c3adddfa8..f4c152eb729 100755 --- a/frameworks/Rust/xitca-web/benchmark_config.json +++ b/frameworks/Rust/xitca-web/benchmark_config.json @@ -85,6 +85,28 @@ "display_name": "axum [xitca]", "notes": "", "versus": "" + }, + "sync": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "db_url": "/db", + "fortune_url": "/fortunes", + "query_url": "/queries?q=", + "update_url": "/updates?q=", + "port": 8080, + "approach": "realistic", + "classification": "micro", + "database": "postgres", + "framework": "xitca-web [sync]", + "language": "rust", + "orm": "full", + "platform": "none", + "webserver": "xitca-server", + "os": "linux", + "database_os": "linux", + "display_name": "xitca-web [sync]", + "notes": "", + "versus": "" } } ] diff --git a/frameworks/Rust/xitca-web/rust-toolchain.toml b/frameworks/Rust/xitca-web/rust-toolchain.toml deleted file mode 100644 index 3191ef83ece..00000000000 --- a/frameworks/Rust/xitca-web/rust-toolchain.toml +++ /dev/null @@ -1,2 +0,0 @@ -[toolchain] -channel = "nightly-2023-11-24" diff --git a/frameworks/Rust/xitca-web/src/db.rs b/frameworks/Rust/xitca-web/src/db.rs index c4614344d0b..81e8094c527 100644 --- a/frameworks/Rust/xitca-web/src/db.rs +++ b/frameworks/Rust/xitca-web/src/db.rs @@ -1,11 +1,11 @@ use std::{collections::HashMap, fmt::Write, future::IntoFuture}; -use xitca_postgres::{statement::Statement, AsyncIterator, Postgres}; +use xitca_postgres::{statement::Statement, AsyncLendingIterator, Postgres}; use xitca_unsafe_collection::no_hash::NoHashBuilder; use super::{ ser::{Fortune, Fortunes, World}, - util::{HandleResult, Rand}, + util::{HandleResult, Rand, DB_URL}, }; pub struct Client { @@ -29,8 +29,8 @@ impl Drop for Client { } } -pub async fn create(config: &str) -> HandleResult { - let (client, driver) = Postgres::new(config.to_string()).connect().await?; +pub async fn create() -> HandleResult { + let (client, driver) = Postgres::new(DB_URL.to_string()).connect().await?; tokio::spawn(tokio::task::unconstrained(driver.into_future())); @@ -91,11 +91,10 @@ impl Client { self.client .query_raw(&self.world, [id]) .await? - .next() - .await - .ok_or_else(|| format!("World {id} does not exist"))? + .try_next() + .await? .map(|row| World::new(row.get_raw(0), row.get_raw(1))) - .map_err(Into::into) + .ok_or_else(|| format!("World does not exist").into()) } pub async fn get_worlds(&self, num: u16) -> HandleResult> { @@ -110,8 +109,8 @@ impl Client { worlds.reserve(num as usize); let mut res = pipe.run().await?; - while let Some(mut item) = res.next().await.transpose()? { - while let Some(row) = item.next().await.transpose()? { + while let Some(mut item) = res.try_next().await? { + while let Some(row) = item.try_next().await? { worlds.push(World::new(row.get_raw(0), row.get_raw(1))) } } @@ -146,8 +145,8 @@ impl Client { let mut r_ids = params.into_iter().skip(1).step_by(2); let mut res = pipe.run().await?; - while let Some(mut item) = res.next().await.transpose()? { - while let Some(row) = item.next().await.transpose()? { + while let Some(mut item) = res.try_next().await? { + while let Some(row) = item.try_next().await? { let r_id = r_ids.next().unwrap(); worlds.push(World::new(row.get_raw(0), r_id)) } @@ -161,7 +160,7 @@ impl Client { items.push(Fortune::new(0, "Additional fortune added at request time.")); let mut stream = self.client.query_raw::<[i32; 0]>(&self.fortune, []).await?; - while let Some(row) = stream.next().await.transpose()? { + while let Some(row) = stream.try_next().await? { items.push(Fortune::new(row.get_raw(0), row.get_raw::(1))); } items.sort_by(|it, next| it.message.cmp(&next.message)); diff --git a/frameworks/Rust/xitca-web/src/db_diesel.rs b/frameworks/Rust/xitca-web/src/db_diesel.rs new file mode 100644 index 00000000000..49a3e158e18 --- /dev/null +++ b/frameworks/Rust/xitca-web/src/db_diesel.rs @@ -0,0 +1,121 @@ +use std::sync::{Arc, Mutex}; + +use diesel::{prelude::*, r2d2}; + +use crate::{ + ser::{Fortune, Fortunes, World}, + util::{Error, HandleResult, Rand, DB_URL}, +}; + +pub type Pool = Arc<_Pool>; + +pub struct _Pool { + pool: r2d2::Pool>, + rng: Mutex, +} + +pub fn create() -> std::io::Result> { + r2d2::Builder::new() + .max_size(256) + .min_idle(Some(256)) + .test_on_check_out(false) + .idle_timeout(None) + .max_lifetime(None) + .build(r2d2::ConnectionManager::new(DB_URL)) + .map_err(std::io::Error::other) + .map(|pool| { + Arc::new(_Pool { + pool, + rng: Mutex::new(Rand::default()), + }) + }) +} + +#[cold] +#[inline(never)] +fn not_found() -> Error { + format!("world not found").into() +} + +impl _Pool { + pub fn get_world(&self) -> HandleResult { + use crate::schema::world::dsl::*; + + let w_id = self.rng.lock().unwrap().gen_id(); + let mut conn = self.pool.get()?; + world + .filter(id.eq(w_id)) + .load(&mut conn)? + .pop() + .ok_or_else(not_found) + } + + pub fn get_worlds(&self, num: u16) -> HandleResult> { + use crate::schema::world::dsl::*; + + let mut conn = self.pool.get()?; + (0..num) + .map(|_| { + let w_id = self.rng.lock().unwrap().gen_id(); + world + .filter(id.eq(w_id)) + .load::(&mut conn)? + .pop() + .ok_or_else(not_found) + }) + .collect() + } + + pub fn update(&self, num: u16) -> HandleResult> { + use crate::schema::world::dsl::*; + + let mut worlds = { + let mut conn = self.pool.get()?; + let worlds = (0..num) + .map(|_| { + let mut rng = self.rng.lock().unwrap(); + let w_id = rng.gen_id(); + let r_id = rng.gen_id(); + drop(rng); + world + .filter(id.eq(w_id)) + .load::(&mut conn)? + .pop() + .map(|mut w| { + w.randomnumber = r_id; + w + }) + .ok_or_else(not_found) + }) + .collect::>>()?; + + worlds.iter().try_for_each(|w| { + diesel::update(world) + .filter(id.eq(w.id)) + .set(randomnumber.eq(w.randomnumber)) + .execute(&mut conn) + .map(|_| ()) + })?; + + worlds + }; + + worlds.sort_by_key(|w| w.id); + + Ok(worlds) + } + + pub fn tell_fortune(&self) -> HandleResult { + use crate::schema::fortune::dsl::*; + + let mut items = { + let mut conn = self.pool.get()?; + fortune.load::(&mut conn)? + }; + + items.push(Fortune::new(0, "Additional fortune added at request time.")); + items.sort_by(|it, next| it.message.cmp(&next.message)); + + Ok(Fortunes::new(items)) + } +} diff --git a/frameworks/Rust/xitca-web/src/main.rs b/frameworks/Rust/xitca-web/src/main.rs index 2bc0d5fc720..632504dac5e 100755 --- a/frameworks/Rust/xitca-web/src/main.rs +++ b/frameworks/Rust/xitca-web/src/main.rs @@ -1,6 +1,3 @@ -#[global_allocator] -static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc; - mod db; mod ser; mod util; @@ -20,14 +17,12 @@ use xitca_http::{ }; use xitca_service::{fn_service, Service, ServiceExt}; -use self::{ - ser::{json_response, Message}, - util::{context_mw, HandleResult, QueryParse, SERVER_HEADER_VALUE}, -}; +use ser::{json_response, Message}; +use util::{context_mw, HandleResult, QueryParse, SERVER_HEADER_VALUE}; -type Response = http::Response>; type Request = http::Request>; -type Ctx<'a> = self::util::Ctx<'a, Request>; +type Response = http::Response>; +type Ctx<'a> = util::Ctx<'a, Request>; fn main() -> std::io::Result<()> { let service = Router::new() @@ -40,7 +35,6 @@ fn main() -> std::io::Result<()> { .enclosed_fn(middleware_fn) .enclosed(context_mw()) .enclosed(HttpServiceBuilder::h1().io_uring()); - xitca_server::Builder::new() .bind("xitca-web", "0.0.0.0:8080", service)? .build() diff --git a/frameworks/Rust/xitca-web/src/main_axum.rs b/frameworks/Rust/xitca-web/src/main_axum.rs index b0228246346..35b04729f9a 100644 --- a/frameworks/Rust/xitca-web/src/main_axum.rs +++ b/frameworks/Rust/xitca-web/src/main_axum.rs @@ -1,8 +1,5 @@ //! show case of axum running on proper thread per core server with io-uring enabled. -#[global_allocator] -static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc; - mod db; mod ser; mod util; @@ -11,7 +8,7 @@ use std::sync::Arc; use axum::{ body::Bytes, - extract::{Json, OriginalUri as Uri, State}, + extract::{Json, Query, State}, http::{ header::{HeaderValue, SERVER}, StatusCode, @@ -21,15 +18,11 @@ use axum::{ }; use tower_http::set_header::SetResponseHeaderLayer; -use crate::{ - db::Client, - tower_compat::TowerHttp, - util::{QueryParse, DB_URL}, -}; +use crate::{db::Client, ser::Num, tower_compat::TowerHttp}; fn main() -> std::io::Result<()> { let service = TowerHttp::service(|| async { - let cli = db::create(DB_URL).await?; + let cli = db::create().await?; let service = Router::new() .route("/plaintext", get(plain_text)) .route("/json", get(json)) @@ -72,18 +65,12 @@ async fn fortunes(State(cli): State>) -> impl IntoResponse { .map_err(|e| Error(Box::new(e))) } -async fn queries(State(cli): State>, Uri(uri): Uri) -> impl IntoResponse { - cli.get_worlds(uri.query().parse_query()) - .await - .map(Json) - .map_err(Error) +async fn queries(State(cli): State>, Query(Num(num)): Query) -> impl IntoResponse { + cli.get_worlds(num).await.map(Json).map_err(Error) } -async fn updates(State(cli): State>, Uri(uri): Uri) -> impl IntoResponse { - cli.update(uri.query().parse_query()) - .await - .map(Json) - .map_err(Error) +async fn updates(State(cli): State>, Query(Num(num)): Query) -> impl IntoResponse { + cli.update(num).await.map(Json).map_err(Error) } struct Error(util::Error); @@ -98,33 +85,21 @@ impl IntoResponse for Error { // compat module between xitca-http and axum. mod tower_compat { - use std::{ - cell::RefCell, - error, fmt, - future::Future, - io, - marker::PhantomData, - net::SocketAddr, - pin::Pin, - task::{Context, Poll}, - }; + use std::{cell::RefCell, fmt, future::Future, marker::PhantomData, net::SocketAddr}; use axum::extract::ConnectInfo; - use futures_core::stream::Stream; use http_body::Body; - use pin_project_lite::pin_project; use xitca_http::{ - body::none_body_hint, bytes::Bytes, h1::RequestBody, - http::{HeaderMap, Request, RequestExt, Response}, - BodyError, HttpServiceBuilder, + http::{Request, RequestExt, Response}, + HttpServiceBuilder, }; use xitca_io::net::io_uring::TcpStream; use xitca_service::{ fn_build, middleware::UncheckedReady, ready::ReadyService, Service, ServiceExt, }; - use xitca_unsafe_collection::fake_send_sync::FakeSend; + use xitca_web::service::tower_http_compat::{CompatReqBody, CompatResBody}; pub struct TowerHttp { service: RefCell, @@ -141,10 +116,12 @@ mod tower_compat { where F: Fn() -> Fut + Send + Sync + Clone, Fut: Future>, - S: tower::Service, Response = Response>, + S: tower::Service< + Request>>, + Response = Response, + >, S::Error: fmt::Debug, B: Body + Send + 'static, - B::Error: error::Error + Send + Sync, { fn_build(move |_| { let func = func.clone(); @@ -162,11 +139,9 @@ mod tower_compat { impl Service>> for TowerHttp where - S: tower::Service, Response = Response>, - B: Body + Send + 'static, - B::Error: error::Error + Send + Sync, + S: tower::Service>>, Response = Response>, { - type Response = Response>; + type Response = Response>; type Error = S::Error; async fn call( @@ -174,70 +149,12 @@ mod tower_compat { req: Request>, ) -> Result { let (parts, ext) = req.into_parts(); - let (ext, body) = ext.replace_body(()); - let body = _RequestBody { - body: FakeSend::new(body), - }; - let mut req = Request::from_parts(parts, body); - let _ = req.extensions_mut().insert(ConnectInfo(*ext.socket_addr())); + let info = ConnectInfo(*ext.socket_addr()); + let mut req = Request::from_parts(parts, CompatReqBody::new(ext)); + req.extensions_mut().insert(info); let fut = self.service.borrow_mut().call(req); let (parts, body) = fut.await?.into_parts(); - let body = ResponseBody { body }; - let res = Response::from_parts(parts, body); - Ok(res) - } - } - - pub struct _RequestBody { - body: FakeSend, - } - - impl Body for _RequestBody { - type Data = Bytes; - type Error = io::Error; - - fn poll_data( - self: Pin<&mut Self>, - cx: &mut Context<'_>, - ) -> Poll>> { - Pin::new(&mut *self.get_mut().body).poll_next(cx) - } - - fn poll_trailers( - self: Pin<&mut Self>, - _: &mut Context<'_>, - ) -> Poll, Self::Error>> { - Poll::Ready(Ok(None)) - } - } - - pin_project! { - pub struct ResponseBody { - #[pin] - body: B - } - } - - impl Stream for ResponseBody - where - B: Body, - B::Error: error::Error + Send + Sync + 'static, - { - type Item = Result; - - fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll> { - self.project() - .body - .poll_data(cx) - .map_err(|e| BodyError::from(Box::new(e) as Box)) - } - - fn size_hint(&self) -> (usize, Option) { - if Body::is_end_stream(&self.body) { - return none_body_hint(); - } - let hint = Body::size_hint(&self.body); - (hint.lower() as _, hint.upper().map(|u| u as _)) + Ok(Response::from_parts(parts, CompatResBody::new(body))) } } } diff --git a/frameworks/Rust/xitca-web/src/main_iou.rs b/frameworks/Rust/xitca-web/src/main_iou.rs index 7aaa784cef1..789f71cf81b 100644 --- a/frameworks/Rust/xitca-web/src/main_iou.rs +++ b/frameworks/Rust/xitca-web/src/main_iou.rs @@ -1,9 +1,6 @@ // used as reference of if/how moving from epoll to io-uring(or mixture of the two) make sense for // network io. -#[global_allocator] -static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc; - mod db; mod ser; mod util; @@ -40,8 +37,8 @@ type Response = http::Response>; fn main() -> io::Result<()> { let service = fn_service(handler) .enclosed(context_mw()) - .enclosed(fn_build(|service| async { - Ok::<_, Infallible>(Http1IOU { + .enclosed(fn_build(|res: Result<_, _>| async { + res.map(|service| Http1IOU { service, date: DateTimeService::new(), }) diff --git a/frameworks/Rust/xitca-web/src/main_sync.rs b/frameworks/Rust/xitca-web/src/main_sync.rs new file mode 100644 index 00000000000..942cbbbf436 --- /dev/null +++ b/frameworks/Rust/xitca-web/src/main_sync.rs @@ -0,0 +1,76 @@ +mod db_diesel; +mod schema; +mod ser; +mod util; + +use serde::Serialize; +use xitca_web::{ + codegen::route, + handler::{html::Html, json::Json, query::Query, state::StateOwn}, + http::{header::SERVER, WebResponse}, + App, +}; + +use db_diesel::Pool; +use ser::Num; +use util::{HandleResult, SERVER_HEADER_VALUE}; + +fn main() -> std::io::Result<()> { + App::with_state(db_diesel::create()?) + .at_typed(plaintext) + .at_typed(json) + .at_typed(db) + .at_typed(fortunes) + .at_typed(queries) + .at_typed(updates) + .map(header) + .serve() + .bind("0.0.0.0:8080")? + .run() + .wait() +} + +fn header(mut res: WebResponse) -> WebResponse { + res.headers_mut().insert(SERVER, SERVER_HEADER_VALUE); + res +} + +#[route("/plaintext", method = get)] +fn plaintext() -> &'static str { + "Hello, World!" +} + +#[route("/json", method = get)] +fn json() -> Json { + Json(ser::Message::new()) +} + +#[route("/db", method = get)] +fn db(StateOwn(pool): StateOwn) -> HandleResult> { + pool.get_world().map(Json) +} + +#[route("/fortunes", method = get)] +fn fortunes(StateOwn(pool): StateOwn) -> HandleResult> { + use sailfish::TemplateOnce; + pool.tell_fortune()? + .render_once() + .map(Html) + .map_err(Into::into) +} + +#[route("/queries", method = get)] +fn queries( + Query(Num(num)): Query, + StateOwn(pool): StateOwn, +) -> HandleResult> { + pool.get_worlds(num).map(Json) +} + +#[route("/updates", method = get)] +fn updates( + Query(Num(num)): Query, + StateOwn(pool): StateOwn, +) -> HandleResult> { + pool.update(num).map(Json) +} diff --git a/frameworks/Rust/xitca-web/src/main_wasm.rs b/frameworks/Rust/xitca-web/src/main_wasm.rs index 5ca2a96adf2..0e04f650a4c 100644 --- a/frameworks/Rust/xitca-web/src/main_wasm.rs +++ b/frameworks/Rust/xitca-web/src/main_wasm.rs @@ -4,13 +4,11 @@ mod util; use std::{env, io, net::TcpListener, os::wasi::io::FromRawFd}; use xitca_web::{ - dev::service::Service, handler::{handler_service, json::Json}, - http::header::SERVER, - request::WebRequest, - response::WebResponse, + http::{header::SERVER, WebResponse}, route::get, - App, + service::Service, + App, WebContext, }; fn main() -> io::Result<()> { @@ -37,9 +35,9 @@ fn main() -> io::Result<()> { .wait() } -async fn middleware_fn(service: &S, ctx: WebRequest<'_>) -> Result +async fn middleware_fn(service: &S, ctx: WebContext<'_>) -> Result where - S: for<'r> Service, Response = WebResponse, Error = E>, + S: for<'r> Service, Response = WebResponse, Error = E>, { service.call(ctx).await.map(|mut res| { res.headers_mut().append(SERVER, util::SERVER_HEADER_VALUE); diff --git a/frameworks/Rust/xitca-web/src/schema.rs b/frameworks/Rust/xitca-web/src/schema.rs new file mode 100644 index 00000000000..758acfe9927 --- /dev/null +++ b/frameworks/Rust/xitca-web/src/schema.rs @@ -0,0 +1,13 @@ +diesel::table! { + world (id) { + id -> Integer, + randomnumber -> Integer, + } +} + +diesel::table! { + fortune (id) { + id -> Integer, + message -> Text, + } +} diff --git a/frameworks/Rust/xitca-web/src/ser.rs b/frameworks/Rust/xitca-web/src/ser.rs index 3985d4c7888..52c2bc3fdab 100644 --- a/frameworks/Rust/xitca-web/src/ser.rs +++ b/frameworks/Rust/xitca-web/src/ser.rs @@ -2,7 +2,7 @@ use std::borrow::Cow; -use serde::{ser::SerializeStruct, Serialize, Serializer}; +use serde::{ser::SerializeStruct, Deserialize, Deserializer, Serialize, Serializer}; use xitca_http::{ body::Once, bytes::{BufMutWriter, Bytes, BytesMut}, @@ -24,6 +24,9 @@ impl Message { } } +pub struct Num(pub u16); + +#[cfg_attr(feature = "pg-orm", derive(diesel::Queryable))] pub struct World { pub id: i32, pub randomnumber: i32, @@ -36,6 +39,7 @@ impl World { } } +#[cfg_attr(feature = "pg-orm", derive(diesel::Queryable))] pub struct Fortune { pub id: i32, pub message: Cow<'static, str>, @@ -68,6 +72,73 @@ impl Fortunes { } } +impl<'de> Deserialize<'de> for Num { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + use core::{cmp, fmt}; + + use serde::de::{Error, MapAccess, Visitor}; + + const FIELDS: &'static [&'static str] = &["q"]; + + struct Field; + + impl<'de> Deserialize<'de> for Field { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + struct FieldVisitor; + + impl<'de> Visitor<'de> for FieldVisitor { + type Value = Field; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("`q`") + } + + fn visit_str(self, value: &str) -> Result + where + E: Error, + { + match value { + "q" => Ok(Field), + _ => Err(Error::unknown_field(value, FIELDS)), + } + } + } + + deserializer.deserialize_identifier(FieldVisitor) + } + } + + struct NumVisitor; + + impl<'de> Visitor<'de> for NumVisitor { + type Value = Num; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("struct Num") + } + + fn visit_map(self, mut map: V) -> Result + where + V: MapAccess<'de>, + { + map.next_key::()? + .ok_or_else(|| Error::missing_field("q"))?; + let q = map.next_value::().unwrap_or(1); + let q = cmp::min(500, cmp::max(1, q)); + Ok(Num(q)) + } + } + + deserializer.deserialize_struct("Num", FIELDS, NumVisitor) + } +} + impl Serialize for Message { fn serialize(&self, serializer: S) -> Result where diff --git a/frameworks/Rust/xitca-web/src/util.rs b/frameworks/Rust/xitca-web/src/util.rs index 624b5dcfa95..8c4cee9da98 100755 --- a/frameworks/Rust/xitca-web/src/util.rs +++ b/frameworks/Rust/xitca-web/src/util.rs @@ -1,8 +1,8 @@ #![allow(dead_code)] -use core::cmp; +use core::{cell::RefCell, cmp}; -use xitca_http::http::header::HeaderValue; +use xitca_http::{bytes::BytesMut, http::header::HeaderValue}; pub trait QueryParse { fn parse_query(self) -> u16; @@ -29,21 +29,15 @@ pub type Error = Box; pub type HandleResult = Result; -#[cfg(not(target_arch = "wasm32"))] -mod non_wasm { - use core::{cell::RefCell, future::Future, pin::Pin}; - - use xitca_http::{ - bytes::BytesMut, - util::middleware::context::{Context, ContextBuilder}, - }; +pub const DB_URL: &str = "postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world"; - use super::*; - - use crate::db::{self, Client}; - - pub const DB_URL: &str = "postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world"; +pub struct State { + pub client: DB, + pub write_buf: RefCell, +} +#[cfg(not(target_arch = "wasm32"))] +mod non_wasm { #[derive(Default)] pub struct Rand(nanorand::WyRand); @@ -55,24 +49,38 @@ mod non_wasm { } } - pub type Ctx<'a, Req> = Context<'a, Req, State>; - - pub struct State { - pub client: Client, - pub write_buf: RefCell, + #[cfg(any(feature = "pg", feature = "pg-iou"))] + mod pg_state { + use core::{cell::RefCell, future::Future, pin::Pin}; + + use xitca_http::{ + bytes::BytesMut, + util::middleware::context::{Context, ContextBuilder}, + }; + + use crate::{ + db::{self, Client}, + util::{HandleResult, State}, + }; + + pub type Ctx<'a, Req> = Context<'a, Req, State>; + + pub fn context_mw( + ) -> ContextBuilder Pin>>>>> + { + ContextBuilder::new(|| { + Box::pin(async { + db::create().await.map(|client| State { + client, + write_buf: RefCell::new(BytesMut::new()), + }) + }) as _ + }) + } } - pub fn context_mw( - ) -> ContextBuilder Pin>>>> { - ContextBuilder::new(|| { - Box::pin(async { - db::create(DB_URL).await.map(|client| State { - client, - write_buf: RefCell::new(BytesMut::new()), - }) - }) as _ - }) - } + #[cfg(any(feature = "pg", feature = "pg-iou"))] + pub use pg_state::*; } #[cfg(not(target_arch = "wasm32"))] diff --git a/frameworks/Rust/xitca-web/xitca-web-axum.dockerfile b/frameworks/Rust/xitca-web/xitca-web-axum.dockerfile index cbfcfcd467f..803e8bd7976 100644 --- a/frameworks/Rust/xitca-web/xitca-web-axum.dockerfile +++ b/frameworks/Rust/xitca-web/xitca-web-axum.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.74 +FROM rust:1.75 ADD ./ /xitca-web WORKDIR /xitca-web diff --git a/frameworks/Rust/xitca-web/xitca-web-iou.dockerfile b/frameworks/Rust/xitca-web/xitca-web-iou.dockerfile index 4a79ed928bc..77fa783f748 100644 --- a/frameworks/Rust/xitca-web/xitca-web-iou.dockerfile +++ b/frameworks/Rust/xitca-web/xitca-web-iou.dockerfile @@ -1,4 +1,4 @@ -FROM rust:latest +FROM rust:1.75 ADD ./ /xitca-web WORKDIR /xitca-web diff --git a/frameworks/Rust/xitca-web/xitca-web-sync.dockerfile b/frameworks/Rust/xitca-web/xitca-web-sync.dockerfile new file mode 100644 index 00000000000..8494f086a57 --- /dev/null +++ b/frameworks/Rust/xitca-web/xitca-web-sync.dockerfile @@ -0,0 +1,10 @@ +FROM rust:1.75 + +ADD ./ /xitca-web +WORKDIR /xitca-web + +RUN cargo build --release --bin xitca-web-sync --features pg-orm,template,web-codegen + +EXPOSE 8080 + +CMD ./target/release/xitca-web-sync diff --git a/frameworks/Rust/xitca-web/xitca-web-wasm.dockerfile b/frameworks/Rust/xitca-web/xitca-web-wasm.dockerfile index 08b43318c88..f89125def21 100644 --- a/frameworks/Rust/xitca-web/xitca-web-wasm.dockerfile +++ b/frameworks/Rust/xitca-web/xitca-web-wasm.dockerfile @@ -1,7 +1,7 @@ ARG WASMTIME_VERSION=15.0.0 ARG WASM_TARGET=wasm32-wasi-preview1-threads -FROM rust:1.74 AS compile +FROM rust:1.75 AS compile ARG WASMTIME_VERSION ARG WASM_TARGET @@ -10,6 +10,7 @@ WORKDIR /tmp COPY / ./ RUN curl -LSs "https://github.com/bytecodealliance/wasmtime/releases/download/v${WASMTIME_VERSION}/wasmtime-v${WASMTIME_VERSION}-$(uname -m)-linux.tar.xz" | \ tar --strip-components=1 -Jx && \ +rustup default nightly && \ rustup target add ${WASM_TARGET} && \ cargo build --bin xitca-web-wasm --features web --release --target ${WASM_TARGET} diff --git a/frameworks/Rust/xitca-web/xitca-web.dockerfile b/frameworks/Rust/xitca-web/xitca-web.dockerfile index abbceb5e0ca..a7eba25eb39 100644 --- a/frameworks/Rust/xitca-web/xitca-web.dockerfile +++ b/frameworks/Rust/xitca-web/xitca-web.dockerfile @@ -1,4 +1,4 @@ -FROM rust:latest +FROM rust:1.75 ADD ./ /xitca-web WORKDIR /xitca-web From 88cfca68e4810cadb5fbb8fbca2286e85d36ced7 Mon Sep 17 00:00:00 2001 From: itsumura-h <39766805+itsumura-h@users.noreply.github.com> Date: Thu, 4 Jan 2024 05:40:01 +0900 Subject: [PATCH 084/210] FIx benchmark tests for Basolato Nim (#8662) * wip * wip * wip * wip * wip * fix * fix * fix * delete old project * fix * fix * fix * fix * fix * fix * fix dependency version * fix * fix * fix docs * remove unnecessary files * fix readme --- frameworks/Nim/basolato/.gitignore | 14 --- frameworks/Nim/basolato/README.md | 17 ++- .../app/controllers/benchmark_controller.nim | 81 -------------- .../http/controllers/benchmark_controller.nim | 102 ++++++++++++++++++ .../app/http/views/pages/fortune_scf_view.nim | 29 +++++ .../app/middlewares/framework_middleware.nim | 11 -- .../Nim/basolato/app/models/fortune.nim | 3 + frameworks/Nim/basolato/basolato.dockerfile | 78 +++++++++++--- frameworks/Nim/basolato/basolato.nimble | 22 ++++ frameworks/Nim/basolato/benchmark_config.json | 7 +- frameworks/Nim/basolato/config.nims | 29 ++--- frameworks/Nim/basolato/config.toml | 19 ---- frameworks/Nim/basolato/config/database.nim | 30 ++++++ frameworks/Nim/basolato/main | Bin 0 -> 2346680 bytes frameworks/Nim/basolato/main.nim | 25 ++--- frameworks/Nim/basolato/project.nimble | 23 ---- .../basolato/resources/pages/fortune_view.nim | 32 ------ 17 files changed, 279 insertions(+), 243 deletions(-) delete mode 100644 frameworks/Nim/basolato/.gitignore delete mode 100644 frameworks/Nim/basolato/app/controllers/benchmark_controller.nim create mode 100644 frameworks/Nim/basolato/app/http/controllers/benchmark_controller.nim create mode 100644 frameworks/Nim/basolato/app/http/views/pages/fortune_scf_view.nim delete mode 100644 frameworks/Nim/basolato/app/middlewares/framework_middleware.nim create mode 100644 frameworks/Nim/basolato/app/models/fortune.nim create mode 100644 frameworks/Nim/basolato/basolato.nimble delete mode 100644 frameworks/Nim/basolato/config.toml create mode 100644 frameworks/Nim/basolato/config/database.nim create mode 100755 frameworks/Nim/basolato/main delete mode 100644 frameworks/Nim/basolato/project.nimble delete mode 100644 frameworks/Nim/basolato/resources/pages/fortune_view.nim diff --git a/frameworks/Nim/basolato/.gitignore b/frameworks/Nim/basolato/.gitignore deleted file mode 100644 index 80fd75dc186..00000000000 --- a/frameworks/Nim/basolato/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -# Binaries -* -!*.* -!*/ - -# Test coverage -coverage/* -lcov.info - -logs/* -# config.nims -*.sqlite3 -*.db -*.db.bak diff --git a/frameworks/Nim/basolato/README.md b/frameworks/Nim/basolato/README.md index 3f8bc7ed7df..ab9292e0893 100755 --- a/frameworks/Nim/basolato/README.md +++ b/frameworks/Nim/basolato/README.md @@ -2,17 +2,16 @@ ### Test Type Implementation Source Code -* [JSON](./app/controllers/benchmark_controller.nim) -* [PLAINTEXT](./app/controllers/benchmark_controller.nim) -* [DB](./app/controllers/benchmark_controller.nim) -* [QUERY](./app/controllers/benchmark_controller.nim) -* [UPDATE](./app/controllers/benchmark_controller.nim) -* [FORTUNES](./app/controllers/benchmark_controller.nim) +* [JSON](./app/http/controllers/benchmark_controller.nim) +* [PLAINTEXT](./app/http/controllers/benchmark_controller.nim) +* [DB](./app/http/controllers/benchmark_controller.nim) +* [QUERY](./app/http/controllers/benchmark_controller.nim) +* [UPDATE](./app/http/controllers/benchmark_controller.nim) +* [FORTUNES](./app/http/controllers/benchmark_controller.nim) ## Important Libraries The tests were run with: * [Software](https://github.com/itsumura-h/nim-basolato) -* [Example](https://github.com/itsumura-h/nim-basolato/tree/master/examples) ## Test URLs ### JSON @@ -29,11 +28,11 @@ http://localhost:8080/db ### QUERY -http://localhost:8080/query?queries= +http://localhost:8080/queries?queries=1 ### UPDATE -http://localhost:8080/update?queries= +http://localhost:8080/updates?queries=1 ### FORTUNES diff --git a/frameworks/Nim/basolato/app/controllers/benchmark_controller.nim b/frameworks/Nim/basolato/app/controllers/benchmark_controller.nim deleted file mode 100644 index 2221c9ddc3f..00000000000 --- a/frameworks/Nim/basolato/app/controllers/benchmark_controller.nim +++ /dev/null @@ -1,81 +0,0 @@ -import json, random, algorithm, cgi, sugar, sequtils -from strutils import parseInt -# framework -import basolato/controller -import allographer/query_builder -# view -import ../../resources/pages/fortune_view - -type BenchmarkController* = ref object of Controller - -proc newBenchmarkController*(request:Request):BenchmarkController = - randomize() - return BenchmarkController.newController(request) - - -proc json*(this:BenchmarkController):Response = - return render(%*{"message":"Hello, World!"}) - -proc plainText*(this:BenchmarkController):Response = - var headers = newHeaders() - headers.set("Content-Type", "text/plain; charset=UTF-8") - return render("Hello, World!").setHeader(headers) - -proc db*(this:BenchmarkController):Response = - let i = rand(1..10000) - let response = RDB().table("world").find(i) - return render(%*response) - -proc query*(this:BenchmarkController):Response = - var countNum:int - try: - countNum = this.request.params["queries"].parseInt() - except: - countNum = 1 - - if countNum < 1: - countNum = 1 - elif countNum > 500: - countNum = 500 - - var response = newJArray() - for _ in 1..countNum: - let i = rand(1..10000) - let data = RDB().table("world").find(i) - response.add(data) - return render(%*response) - -proc fortune*(this:BenchmarkController):Response = - var rows = RDB().table("Fortune").orderBy("message", Asc).get() - rows = rows.mapIt(%*{ - "id": it["id"], - "message": xmlEncode(it["message"].getStr) - }) - rows.add(%*{ - "id": 0, - "message": "Additional fortune added at request time."} - ) - rows = rows.sortedByIt(it["message"].getStr) - return render(this.view.fortuneView(rows)) - -proc update*(this:BenchmarkController):Response = - var countNum:int - try: - countNum = this.request.params["queries"].parseInt() - except: - countNum = 1 - - if countNum < 1: - countNum = 1 - elif countNum > 500: - countNum = 500 - - var response = newJArray() - transaction: - for _ in 1..countNum: - let i = rand(1..10000) - let newRandomNumber = rand(1..10000) - discard RDB().table("world").find(i) - RDB().table("world").where("id", "=", i).update(%*{"randomNumber": newRandomNumber}) - response.add(%*{"id":i, "randomNumber": newRandomNumber}) - return render(response) diff --git a/frameworks/Nim/basolato/app/http/controllers/benchmark_controller.nim b/frameworks/Nim/basolato/app/http/controllers/benchmark_controller.nim new file mode 100644 index 00000000000..fefbc0644dd --- /dev/null +++ b/frameworks/Nim/basolato/app/http/controllers/benchmark_controller.nim @@ -0,0 +1,102 @@ +import std/algorithm +import std/json +import std/random +import std/strutils +import std/sequtils +# framework +import basolato/controller +# databse +import db_connector/db_postgres +import allographer/query_builder +import ../../../config/database +# model +import ../../models/fortune +# view +import ../views/pages/fortune_scf_view + + +const range1_10000 = 1..10000 +let getFirstPrepare = stdRdb.prepare("getFirst", sql""" SELECT * FROM "World" WHERE id = $1 LIMIT 1 """, 1) +let getFortunePrepare = stdRdb.prepare("getFortunes", sql""" SELECT * FROM "Fortune" ORDER BY message ASC """, 0) + + +proc plaintext*(context:Context, params:Params):Future[Response] {.async.} = + let headers = newHttpHeaders() + headers.add("Content-Type", "text/plain; charset=UTF-8") + return render("Hello, World!", headers) + + +proc json*(context:Context, params:Params):Future[Response] {.async.} = + return render(%*{"message":"Hello, World!"}) + + +proc db*(context:Context, params:Params):Future[Response] {.async.} = + let i = rand(1..10000) + let res = stdRdb.getRow(getFirstPrepare, i) + return render(%*{"id": res[0].parseInt, "randomNumber": res[1].parseInt}) + + +proc query*(context:Context, params:Params):Future[Response] {.async.} = + var countNum = + try: + params.getInt("queries") + except: + 1 + if countNum < 1: + countNum = 1 + elif countNum > 500: + countNum = 500 + + var resp:seq[Row] + for i in 1..countNum: + let n = rand(range1_10000) + resp.add(stdRdb.getRow(getFirstPrepare, n)) + + let response = resp.map( + proc(x:Row):JsonNode = + %*{"id": x[0].parseInt, "randomNumber": x[1].parseInt} + ) + return render(%response) + + +proc fortune*(context:Context, params:Params):Future[Response] {.async.} = + let results = stdRdb.getAllRows(getFortunePrepare) + var rows = results.map( + proc(x:seq[string]):Fortune = + return Fortune(id: x[0].parseInt, message: x[1]) + ) + rows.add( + Fortune( + id: 0, + message: "Additional fortune added at request time." + ) + ) + rows = rows.sortedByIt(it.message) + return render(fortuneScfView(rows).await) + + +proc update*(context:Context, params:Params):Future[Response] {.async.} = + var countNum = + try: + params.getInt("queries") + except: + 1 + if countNum < 1: + countNum = 1 + elif countNum > 500: + countNum = 500 + + var response = newSeq[JsonNode](countNum) + var futures = newSeq[Future[void]](countNum) + for i in 1..countNum: + let index = rand(range1_10000) + let number = rand(range1_10000) + response[i-1] = %*{"id": index, "randomNumber": number} + futures[i-1] = ( + proc():Future[void] {.async.} = + discard stdRdb.getRow(getFirstPrepare, i) + rdb.raw(""" UPDATE "World" SET "randomnumber" = ? WHERE id = ? """, %*[number, index]).exec() + )() + all(futures).await + + return render(%response) diff --git a/frameworks/Nim/basolato/app/http/views/pages/fortune_scf_view.nim b/frameworks/Nim/basolato/app/http/views/pages/fortune_scf_view.nim new file mode 100644 index 00000000000..7f4dc2b4552 --- /dev/null +++ b/frameworks/Nim/basolato/app/http/views/pages/fortune_scf_view.nim @@ -0,0 +1,29 @@ +#? stdtmpl(toString="toString") | standard +#import std/asyncdispatch +#import basolato/view +#import ../../../models/fortune +#proc fortuneScfView*(rows:seq[Fortune]):Future[Component] {.async.} = +# result = Component.new() + + + + + Fortunes + + + + + + + + + #for row in rows: + + + + + #end for +
idmessage
${row.id}${row.message}
+ + + diff --git a/frameworks/Nim/basolato/app/middlewares/framework_middleware.nim b/frameworks/Nim/basolato/app/middlewares/framework_middleware.nim deleted file mode 100644 index 9d6c527fc3c..00000000000 --- a/frameworks/Nim/basolato/app/middlewares/framework_middleware.nim +++ /dev/null @@ -1,11 +0,0 @@ -import re -import basolato/middleware -import basolato/routing -from custom_headers_middleware import corsHeader - -template framework*() = - if request.path.match(re"^(?!.*\.).*$"): - checkCsrfToken(request).catch() - checkAuthToken(request).catch(ErrorAuthRedirect, "/login") - if request.reqMethod == HttpOptions: - route(render(""), [corsHeader()]) diff --git a/frameworks/Nim/basolato/app/models/fortune.nim b/frameworks/Nim/basolato/app/models/fortune.nim new file mode 100644 index 00000000000..33cb0950a31 --- /dev/null +++ b/frameworks/Nim/basolato/app/models/fortune.nim @@ -0,0 +1,3 @@ +type Fortune* = object + id*:int + message*:string diff --git a/frameworks/Nim/basolato/basolato.dockerfile b/frameworks/Nim/basolato/basolato.dockerfile index 495c1766dbc..1e2baf2a0c9 100644 --- a/frameworks/Nim/basolato/basolato.dockerfile +++ b/frameworks/Nim/basolato/basolato.dockerfile @@ -1,27 +1,73 @@ -FROM nimlang/nim:alpine +FROM ubuntu:22.04 AS build -ENV PATH $PATH:/root/.nimble/bin +# prevent timezone dialogue +ENV DEBIAN_FRONTEND=noninteractive -RUN echo http://dl-cdn.alpinelinux.org/alpine/edge/testing >> /etc/apk/repositories -RUN apk update && \ - apk upgrade --no-cache && \ - apk add --no-cache \ - openssh-client \ +RUN apt update && \ + apt upgrade -y +RUN apt install -y --fix-missing \ + gcc \ + xz-utils \ ca-certificates \ - openssl \ - pcre \ - bsd-compat-headers \ - lcov \ - sqlite mariadb-dev libpq && \ - rm /usr/lib/mysqld* -fr && rm /usr/bin/mysql* -fr && \ - update-ca-certificates + curl \ + git + +ARG VERSION="2.0.2" +WORKDIR /root +RUN curl https://nim-lang.org/choosenim/init.sh -o init.sh +RUN sh init.sh -y +RUN rm -f init.sh +ENV PATH $PATH:/root/.nimble/bin +RUN choosenim ${VERSION} + +ENV PATH $PATH:/root/.nimble/bin ADD ./ /basolato WORKDIR /basolato RUN nimble install -y -RUN ducere build +RUN ducere build -p:8080 -o:speed + + +FROM ubuntu:22.04 AS runtime + +# prevent timezone dialogue +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt update && \ + apt upgrade -y +RUN apt install -y --fix-missing \ + xz-utils \ + ca-certificates \ + libpq-dev + +WORKDIR /basolato +COPY --from=build /basolato/main . +RUN chmod 111 main +COPY --from=build /basolato/startServer.sh . +RUN chmod 111 startServer.sh + + +# Secret +ENV SECRET_KEY="pZWEVzA7h2FcKLgVM3ec5Eiik7eU9Ehpf0uLdYOZDgr0uZKIo5LdQE9sjIub3IDkUTrf3X2Jsh1Uw8b02GtAfWRn4C9NptfdSyoK" +# DB Connection +ENV DB_DATABASE="hello_world" +ENV DB_USER="benchmarkdbuser" +ENV DB_PASSWORD="benchmarkdbpass" +ENV DB_HOST="tfb-database" +ENV DB_PORT=5432 +ENV DB_MAX_CONNECTION=2000 +ENV DB_TIMEOUT=30 +# Logging +ENV LOG_IS_DISPLAY=false +ENV LOG_IS_FILE=false +ENV LOG_IS_ERROR_FILE=false +# Session db +# Session type, file or redis, is defined in config.nims +ENV SESSION_TIME=20160 +ENV LOCALE=en + EXPOSE 8080 -CMD ./main +CMD ./startServer.sh diff --git a/frameworks/Nim/basolato/basolato.nimble b/frameworks/Nim/basolato/basolato.nimble new file mode 100644 index 00000000000..34274ee7b07 --- /dev/null +++ b/frameworks/Nim/basolato/basolato.nimble @@ -0,0 +1,22 @@ +# Package +version = "0.1.0" +author = "Anonymous" +description = "A new awesome basolato package" +license = "MIT" +srcDir = "." +bin = @["main"] +backend = "c" + +# Dependencies +requires "nim >= 2.0.0" +requires "https://github.com/itsumura-h/nim-basolato == 0.15.0" +requires "allographer == 0.29.1" +requires "interface_implements >= 0.2.2" +requires "bcrypt >= 0.2.1" +requires "cligen >= 1.5.9" +requires "redis >= 0.3.0" +requires "sass >= 0.1.0" + +task test, "run testament": + echo staticExec("testament p \"./tests/test_*.nim\"") + discard staticExec("find tests/ -type f ! -name \"*.*\" -delete 2> /dev/null") diff --git a/frameworks/Nim/basolato/benchmark_config.json b/frameworks/Nim/basolato/benchmark_config.json index 76b42b1c2dd..1bb2d11484e 100755 --- a/frameworks/Nim/basolato/benchmark_config.json +++ b/frameworks/Nim/basolato/benchmark_config.json @@ -7,8 +7,8 @@ "plaintext_url": "/plaintext", "db_url": "/db", "query_url": "/queries?queries=", - "fortune_url": "/fortunes", "update_url": "/updates?queries=", + "fortune_url": "/fortunes", "port": 8080, "approach": "Realistic", "classification": "Fullstack", @@ -17,14 +17,13 @@ "language": "Nim", "flavor": "None", "orm": "Full", - "platform": "httpbeast", + "platform": "asynchttpserver", "webserver": "None", "os": "Linux", "database_os": "Linux", "display_name": "Basolato", "notes": "", - "versus": "jester", - "tags": ["broken"] + "versus": "httpbeast, prologue" } } ] diff --git a/frameworks/Nim/basolato/config.nims b/frameworks/Nim/basolato/config.nims index 1df9e31ff0d..17fb53724ab 100644 --- a/frameworks/Nim/basolato/config.nims +++ b/frameworks/Nim/basolato/config.nims @@ -1,20 +1,9 @@ -import os - -# DB Connection -putEnv("DB_DRIVER", "postgres") -putEnv("DB_CONNECTION", "tfb-database:5432") -putEnv("DB_USER", "benchmarkdbuser") -putEnv("DB_PASSWORD", "benchmarkdbpass") -putEnv("DB_DATABASE", "hello_world") - -# Logging -putEnv("LOG_IS_DISPLAY", "false") -putEnv("LOG_IS_FILE", "false") -putEnv("LOG_DIR", "/basolato/logs") - -# Security -putEnv("SECRET_KEY", "1p>G$!8SiRa#_%pKb@ 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%0DwOBy(k-;fb2wjfdUSQg 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 z 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¥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 mf2sed&@tFT@d@{(f= 1.2.4" -requires "https://github.com/itsumura-h/nim-basolato >= 0.5.5" -requires "httpbeast >= 0.2.2" -requires "cligen >= 0.9.41" -requires "templates >= 0.5" -requires "bcrypt >= 0.2.1" -requires "nimAES >= 0.1.2" -requires "flatdb >= 0.2.4" -requires "allographer >= 0.9.0" -requires "faker >= 0.12.1" diff --git a/frameworks/Nim/basolato/resources/pages/fortune_view.nim b/frameworks/Nim/basolato/resources/pages/fortune_view.nim deleted file mode 100644 index 0e1c3b3df2b..00000000000 --- a/frameworks/Nim/basolato/resources/pages/fortune_view.nim +++ /dev/null @@ -1,32 +0,0 @@ -import json -import basolato/view - -proc impl(title:string, data:seq[JsonNode]):string = tmpli html""" - - - - - $title - - - - - - - - - $for row in data{ - - - - - } -
idmessage
$(row["id"].get)$(row["message"].get)
- - - -""" - -proc fortuneView*(this:View, data=newSeq[JsonNode]()):string = - let title = "Fortunes" - return impl(title, data) From 90f6e3d6b0b15720c2547c569483ab29767c7ce6 Mon Sep 17 00:00:00 2001 From: Miguel Grinberg Date: Wed, 3 Jan 2024 20:40:15 +0000 Subject: [PATCH 085/210] Upgrade to Microdot 2 (#8663) --- frameworks/Python/microdot/README.md | 21 ++-- .../Python/microdot/{app_async.py => app.py} | 35 +++--- .../microdot/{app_async_raw.py => app_raw.py} | 13 +- frameworks/Python/microdot/app_sync.py | 115 ------------------ frameworks/Python/microdot/app_sync_raw.py | 112 ----------------- .../Python/microdot/benchmark_config.json | 52 +------- frameworks/Python/microdot/gunicorn_conf.py | 15 --- .../microdot/microdot-async-raw.dockerfile | 15 --- .../Python/microdot/microdot-async.dockerfile | 15 --- .../Python/microdot/microdot-raw.dockerfile | 6 +- .../Python/microdot/microdot.dockerfile | 4 +- frameworks/Python/microdot/requirements.txt | 2 +- frameworks/Python/microdot/uvicorn_conf.py | 1 - 13 files changed, 45 insertions(+), 361 deletions(-) rename frameworks/Python/microdot/{app_async.py => app.py} (76%) rename frameworks/Python/microdot/{app_async_raw.py => app_raw.py} (92%) delete mode 100644 frameworks/Python/microdot/app_sync.py delete mode 100644 frameworks/Python/microdot/app_sync_raw.py delete mode 100644 frameworks/Python/microdot/gunicorn_conf.py delete mode 100644 frameworks/Python/microdot/microdot-async-raw.dockerfile delete mode 100644 frameworks/Python/microdot/microdot-async.dockerfile diff --git a/frameworks/Python/microdot/README.md b/frameworks/Python/microdot/README.md index 9aefbcba3a3..c52da3793b9 100644 --- a/frameworks/Python/microdot/README.md +++ b/frameworks/Python/microdot/README.md @@ -8,20 +8,13 @@ Also note that there is additional information provided in the [Python README](. ### Test Source Code -* [JSON](app_sync.py#L60) -* [JSON-async](app_async.py#L60) -* [PLAINTEXT](app_sync.py#L102) -* [PLAINTEXT-async](app_async.py#L102) -* [DB](app_sync.py#L65) -* [DB-async](app_async.py#L65) -* [QUERY](app_sync.py#L73) -* [QUERY-async](app_async.py#L83) -* [CACHED QUERY](app_sync.py#L112) -* [CACHED_QUERY-async](app_async.py#L112) -* [UPDATE](app_sync.py#L89) -* [UPDATE-async](app_async.py#L89) -* [FORTUNES](app_sync.py#L80) -* [FORTUNES-async](app_async.py#L80) +* [JSON](app.py#L60) +* [PLAINTEXT](app.py#L102) +* [DB](app.py#L65) +* [QUERY](app.py#L73) +* [CACHED QUERY](app.py#L112) +* [UPDATE](app.py#L89) +* [FORTUNES](app.py#L80) ## Resources diff --git a/frameworks/Python/microdot/app_async.py b/frameworks/Python/microdot/app.py similarity index 76% rename from frameworks/Python/microdot/app_async.py rename to frameworks/Python/microdot/app.py index 428491ce3d6..a60c7edc98c 100644 --- a/frameworks/Python/microdot/app_async.py +++ b/frameworks/Python/microdot/app.py @@ -1,42 +1,42 @@ #!/usr/bin/env python -from datetime import datetime import os from random import randint, sample -from alchemical.aio import Alchemical -import sqlalchemy as sqla +from alchemical.aio import Alchemical, Model +import sqlalchemy.orm as so from asyncache import cached from cachetools.keys import hashkey -from microdot_asgi import Microdot -from microdot_jinja import render_template +from microdot.asgi import Microdot +from microdot.jinja import Template app = Microdot() -db = Alchemical(os.environ['DATABASE_URL']) +Template.initialize('templates', enable_async=True) +db = Alchemical(os.environ.get('DATABASE_URL', 'sqlite:///')) -class World(db.Model): +class World(Model): __tablename__ = "world" - id = sqla.Column(sqla.Integer, primary_key=True) - randomnumber = sqla.Column(sqla.Integer) + id: so.Mapped[int] = so.mapped_column(primary_key=True) + randomnumber: so.Mapped[int] def to_dict(self): return {"id": self.id, "randomNumber": self.randomnumber} -class CachedWorld(db.Model): +class CachedWorld(Model): __tablename__ = "cachedworld" - id = sqla.Column(sqla.Integer, primary_key=True) - randomnumber = sqla.Column(sqla.Integer) + id: so.Mapped[int] = so.mapped_column(primary_key=True) + randomnumber: so.Mapped[int] def to_dict(self): return {"id": self.id, "randomNumber": self.randomnumber} -class Fortune(db.Model): +class Fortune(Model): __tablename__ = "fortune" - id = sqla.Column(sqla.Integer, primary_key=True) - message = sqla.Column(sqla.String) + id: so.Mapped[int] = so.mapped_column(primary_key=True) + message: so.Mapped[str] def get_num_queries(request, name="queries"): @@ -81,7 +81,10 @@ async def test_fortunes(request): fortunes = list(await session.scalars(Fortune.select())) fortunes.append(Fortune(id=0, message="Additional fortune added at request time.")) fortunes.sort(key=lambda f: f.message) - return render_template("fortunes.html", fortunes=fortunes), {'Content-Type': 'text/html; charset=utf-8'} + return ( + await Template("fortunes.html").render_async(fortunes=fortunes), + {'Content-Type': 'text/html; charset=utf-8'}, + ) @app.route("/updates") diff --git a/frameworks/Python/microdot/app_async_raw.py b/frameworks/Python/microdot/app_raw.py similarity index 92% rename from frameworks/Python/microdot/app_async_raw.py rename to frameworks/Python/microdot/app_raw.py index d6368bc6826..9aa8a7ab362 100644 --- a/frameworks/Python/microdot/app_async_raw.py +++ b/frameworks/Python/microdot/app_raw.py @@ -1,5 +1,4 @@ #!/usr/bin/env python -from datetime import datetime import os from random import randint, sample @@ -7,15 +6,18 @@ from asyncache import cached from cachetools.keys import hashkey -from microdot_asgi import Microdot -from microdot_jinja import render_template +from microdot.asgi import Microdot +from microdot.jinja import Template app = Microdot() +Template.initialize('templates', enable_async=True) + get_world_sql = 'SELECT id, randomnumber FROM world WHERE id = $1' update_world_sql = 'UPDATE world SET randomnumber = $1 WHERE id = $2' fortune_sql = 'SELECT * FROM fortune' db = None + async def asgi(scope, receive, send): if scope['type'] == 'lifespan': while True: @@ -81,7 +83,10 @@ async def test_fortunes(request): fortunes = list(await conn.fetch(fortune_sql)) fortunes.append((0, "Additional fortune added at request time.")) fortunes.sort(key=lambda f: f[1]) - return render_template("fortunes_raw.html", fortunes=fortunes), {'Content-Type': 'text/html; charset=utf-8'} + return ( + await Template("fortunes_raw.html").render_async(fortunes=fortunes), + {'Content-Type': 'text/html; charset=utf-8'}, + ) @app.route("/updates") diff --git a/frameworks/Python/microdot/app_sync.py b/frameworks/Python/microdot/app_sync.py deleted file mode 100644 index 546f4eb649b..00000000000 --- a/frameworks/Python/microdot/app_sync.py +++ /dev/null @@ -1,115 +0,0 @@ -#!/usr/bin/env python -from datetime import datetime -from functools import lru_cache -import os -from random import randint, sample - -from alchemical import Alchemical -import sqlalchemy as sqla -from cachetools import cached -from cachetools.keys import hashkey - -from microdot_wsgi import Microdot -from microdot_jinja import render_template - -app = Microdot() -db = Alchemical(os.environ['DATABASE_URL']) - - -class World(db.Model): - __tablename__ = "world" - id = sqla.Column(sqla.Integer, primary_key=True) - randomnumber = sqla.Column(sqla.Integer) - - def to_dict(self): - return {"id": self.id, "randomNumber": self.randomnumber} - - -class CachedWorld(db.Model): - __tablename__ = "cachedworld" - id = sqla.Column(sqla.Integer, primary_key=True) - randomnumber = sqla.Column(sqla.Integer) - - def to_dict(self): - return {"id": self.id, "randomNumber": self.randomnumber} - - -class Fortune(db.Model): - __tablename__ = "fortune" - id = sqla.Column(sqla.Integer, primary_key=True) - message = sqla.Column(sqla.String) - - -def get_num_queries(request, name="queries"): - try: - num_queries = request.args.get(name, 1, type=int) - except ValueError: - num_queries = 1 - if num_queries < 1: - return 1 - if num_queries > 500: - return 500 - return num_queries - - -def generate_ids(num_queries): - return sample(range(1, 10001), num_queries) - - -@app.route("/json") -def test_json(request): - return {"message": "Hello, World!"} - - -@app.route("/db") -def test_db(request): - id = randint(1, 10000) - with db.Session() as session: - world = session.get(World, id) - return world.to_dict() - - -@app.route("/queries") -def test_queries(request): - with db.Session() as session: - worlds = [session.get(World, id).to_dict() for id in generate_ids(get_num_queries(request))] - return worlds - - -@app.route("/fortunes") -def test_fortunes(request): - with db.Session() as session: - fortunes = list(session.scalars(Fortune.select())) - fortunes.append(Fortune(id=0, message="Additional fortune added at request time.")) - fortunes.sort(key=lambda f: f.message) - return render_template("fortunes.html", fortunes=fortunes), {'Content-Type': 'text/html; charset=utf-8'} - - -@app.route("/updates") -def test_updates(request): - worlds = [] - ids = generate_ids(get_num_queries(request)) - ids.sort() # to avoid deadlocks - with db.begin() as session: - for id in ids: - world = session.get(World, id) - world.randomnumber = (randint(1, 9999) + world.randomnumber - 1) % 10000 + 1 - worlds.append(world.to_dict()) - return worlds - - -@app.route("/plaintext") -def test_plaintext(request): - return b"Hello, World!" - - -@cached(cache={}, key=lambda session, id: hashkey(id)) -def get_cached_world(session, id): - return session.get(World, id).to_dict() - - -@app.route("/cached-queries") -def test_cached_queries(request): - with db.Session() as session: - worlds = [get_cached_world(session, id) for id in generate_ids(get_num_queries(request, 'count'))] - return worlds diff --git a/frameworks/Python/microdot/app_sync_raw.py b/frameworks/Python/microdot/app_sync_raw.py deleted file mode 100644 index 29edc250fae..00000000000 --- a/frameworks/Python/microdot/app_sync_raw.py +++ /dev/null @@ -1,112 +0,0 @@ -#!/usr/bin/env python -from datetime import datetime -from functools import lru_cache -import os -from random import randint, sample - -from microdot_wsgi import Microdot -from microdot_jinja import render_template -import psycopg2 -from psycopg2.extras import execute_batch -from cachetools import cached -from cachetools.keys import hashkey - -app = Microdot() -db = psycopg2.connect(os.environ['DATABASE_URL']) - -get_world_sql = 'SELECT id, randomnumber FROM world WHERE id = $1' -update_world_sql = 'UPDATE world SET randomnumber = $1 WHERE id = $2' -fortune_sql = 'SELECT * FROM fortune' -with db.cursor() as cur: - cur.execute('PREPARE get_world AS ' + get_world_sql) - cur.execute('PREPARE update_world AS ' + update_world_sql) - cur.execute('PREPARE fortune AS ' + fortune_sql) - - -def get_num_queries(request, name="queries"): - try: - num_queries = request.args.get(name, 1, type=int) - except ValueError: - num_queries = 1 - if num_queries < 1: - return 1 - if num_queries > 500: - return 500 - return num_queries - - -def generate_ids(num_queries): - return sample(range(1, 10001), num_queries) - - -@app.route("/json") -def test_json(request): - return {"message": "Hello, World!"} - - -@app.route("/db") -def test_db(request): - id = randint(1, 10000) - with db.cursor() as cur: - cur.execute('EXECUTE get_world (%s)', (id,)) - result = cur.fetchone() - world = {'id': result[0], 'randomNumber': result[1]} - return world - - -def get_world(cur, id): - cur.execute('EXECUTE get_world (%s)', (id,)) - result = cur.fetchone() - return {'id': result[0], 'randomNumber': result[1]} - - -@app.route("/queries") -def test_queries(request): - with db.cursor() as cur: - worlds = [get_world(cur, id) for id in generate_ids(get_num_queries(request))] - return worlds - - -@app.route("/fortunes") -def test_fortunes(request): - with db.cursor() as cur: - cur.execute('EXECUTE fortune') - fortunes = list(cur.fetchall()) - fortunes.append((0, 'Additional fortune added at request time.')) - fortunes.sort(key=lambda f: f[1]) - return render_template("fortunes_raw.html", fortunes=fortunes), {'Content-Type': 'text/html; charset=utf-8'} - - -@app.route("/updates") -def test_updates(request): - worlds = [] - updated_worlds = [] - with db.cursor() as cur: - for id in generate_ids(get_num_queries(request)): - cur.execute('EXECUTE get_world (%s)', (id,)) - result = cur.fetchone() - new_value = randint(1, 10000) - updated_worlds.append((new_value, result[0])) - worlds.append({'id': result[0], 'randomNumber': new_value}) - execute_batch(cur, 'EXECUTE update_world (%s, %s)', updated_worlds) - db.commit() - return worlds - - -@app.route("/plaintext") -def test_plaintext(request): - return b"Hello, World!" - - -@cached(cache={}, key=lambda cur, id: hashkey(id)) -def get_cached_world(cur, id): - cur.execute('EXECUTE get_world (%s)', (id,)) - result = cur.fetchone() - return {'id': result[0], 'randomNumber': result[1]} - - -@app.route("/cached-queries") -def test_cached_queries(request): - with db.cursor() as cur: - worlds = [get_cached_world(cur, id) for id in generate_ids(get_num_queries(request, 'count'))] - return worlds diff --git a/frameworks/Python/microdot/benchmark_config.json b/frameworks/Python/microdot/benchmark_config.json index d1c696c33ea..712e89b44b9 100644 --- a/frameworks/Python/microdot/benchmark_config.json +++ b/frameworks/Python/microdot/benchmark_config.json @@ -19,14 +19,14 @@ "flavor": "None", "orm": "Full", "platform": "None", - "webserver": "Gunicorn", + "webserver": "Uvicorn", "os": "Linux", "database_os": "Linux", - "display_name": "Microdot-WSGI", + "display_name": "Microdot", "notes": "", "versus": "None" }, - "async": { + "raw": { "json_url": "/json", "db_url": "/db", "query_url": "/queries?queries=", @@ -46,51 +46,7 @@ "webserver": "Uvicorn", "os": "Linux", "database_os": "Linux", - "display_name": "Microdot-ASGI", - "notes": "", - "versus": "None" - }, - "raw": { - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "cached_query_url": "/cached-queries?count=", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "postgres", - "framework": "Microdot", - "language": "Python", - "flavor": "None", - "orm": "Raw", - "platform": "None", - "webserver": "Gunicorn", - "os": "Linux", - "database_os": "Linux", - "display_name": "Microdot-WSGI-Raw", - "notes": "", - "versus": "None" - }, - "async-raw": { - "db_url": "/db", - "query_url": "/queries?queries=", - "fortune_url": "/fortunes", - "update_url": "/updates?queries=", - "cached_query_url": "/cached-queries?count=", - "port": 8080, - "approach": "Realistic", - "classification": "Micro", - "database": "postgres", - "framework": "Microdot", - "language": "Python", - "flavor": "None", - "orm": "Raw", - "platform": "None", - "webserver": "Uvicorn", - "os": "Linux", - "database_os": "Linux", - "display_name": "Microdot-ASGI-Raw", + "display_name": "Microdot-Raw", "notes": "", "versus": "None" } diff --git a/frameworks/Python/microdot/gunicorn_conf.py b/frameworks/Python/microdot/gunicorn_conf.py deleted file mode 100644 index 525911bf39e..00000000000 --- a/frameworks/Python/microdot/gunicorn_conf.py +++ /dev/null @@ -1,15 +0,0 @@ -import multiprocessing -import os -import sys - -_is_pypy = hasattr(sys, "pypy_version_info") -_is_travis = os.environ.get("TRAVIS") == "true" - -workers = int(multiprocessing.cpu_count() * 4) -if _is_travis: - workers = 2 - -bind = "0.0.0.0:8080" -keepalive = 120 -errorlog = "-" -pidfile = "gunicorn.pid" diff --git a/frameworks/Python/microdot/microdot-async-raw.dockerfile b/frameworks/Python/microdot/microdot-async-raw.dockerfile deleted file mode 100644 index d238d7a909a..00000000000 --- a/frameworks/Python/microdot/microdot-async-raw.dockerfile +++ /dev/null @@ -1,15 +0,0 @@ -FROM python:3.11-buster - -RUN apt-get update -RUN apt-get install libpq-dev python3-dev -y -ADD ./requirements.txt /microdot/requirements.txt -RUN pip3 install -r /microdot/requirements.txt -ADD ./ /microdot -WORKDIR /microdot - -ENV PYTHONUNBUFFERED 1 -ENV DATABASE_URL postgresql://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/hello_world - -EXPOSE 8080 - -CMD gunicorn app_async_raw:asgi -c uvicorn_conf.py diff --git a/frameworks/Python/microdot/microdot-async.dockerfile b/frameworks/Python/microdot/microdot-async.dockerfile deleted file mode 100644 index 87f96776066..00000000000 --- a/frameworks/Python/microdot/microdot-async.dockerfile +++ /dev/null @@ -1,15 +0,0 @@ -FROM python:3.11-buster - -RUN apt-get update -RUN apt-get install libpq-dev python3-dev -y -ADD ./requirements.txt /microdot/requirements.txt -RUN pip3 install -r /microdot/requirements.txt -ADD ./ /microdot -WORKDIR /microdot - -ENV PYTHONUNBUFFERED 1 -ENV DATABASE_URL postgresql://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/hello_world - -EXPOSE 8080 - -CMD gunicorn app_async:app -c uvicorn_conf.py diff --git a/frameworks/Python/microdot/microdot-raw.dockerfile b/frameworks/Python/microdot/microdot-raw.dockerfile index 6d14a41e20d..e5501998e14 100644 --- a/frameworks/Python/microdot/microdot-raw.dockerfile +++ b/frameworks/Python/microdot/microdot-raw.dockerfile @@ -1,4 +1,4 @@ -FROM python:3.11-buster +FROM python:3.12-slim RUN apt-get update RUN apt-get install libpq-dev python3-dev -y @@ -8,8 +8,8 @@ ADD ./ /microdot WORKDIR /microdot ENV PYTHONUNBUFFERED 1 -ENV DATABASE_URL "host=tfb-database port=5432 user=benchmarkdbuser password=benchmarkdbpass dbname=hello_world" +ENV DATABASE_URL postgresql://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/hello_world EXPOSE 8080 -CMD gunicorn app_sync_raw:app -c gunicorn_conf.py +CMD gunicorn app_raw:asgi -c uvicorn_conf.py diff --git a/frameworks/Python/microdot/microdot.dockerfile b/frameworks/Python/microdot/microdot.dockerfile index 01db2e263b1..a47b8e74026 100644 --- a/frameworks/Python/microdot/microdot.dockerfile +++ b/frameworks/Python/microdot/microdot.dockerfile @@ -1,4 +1,4 @@ -FROM python:3.11-buster +FROM python:3.12-slim RUN apt-get update RUN apt-get install libpq-dev python3-dev -y @@ -12,4 +12,4 @@ ENV DATABASE_URL postgresql://benchmarkdbuser:benchmarkdbpass@tfb-database:5432/ EXPOSE 8080 -CMD gunicorn app_sync:app -c gunicorn_conf.py +CMD gunicorn app:app -c uvicorn_conf.py diff --git a/frameworks/Python/microdot/requirements.txt b/frameworks/Python/microdot/requirements.txt index 05a4c8c3f2c..4d928335e33 100644 --- a/frameworks/Python/microdot/requirements.txt +++ b/frameworks/Python/microdot/requirements.txt @@ -7,6 +7,6 @@ cachetools asyncache alchemical -microdot<2 +microdot>=2.0.1 gunicorn uvicorn[standard] diff --git a/frameworks/Python/microdot/uvicorn_conf.py b/frameworks/Python/microdot/uvicorn_conf.py index 9faf6f02064..5f410a49eb3 100644 --- a/frameworks/Python/microdot/uvicorn_conf.py +++ b/frameworks/Python/microdot/uvicorn_conf.py @@ -1,6 +1,5 @@ import multiprocessing import os -import sys _is_travis = os.environ.get("TRAVIS") == "true" From d8ddd4d016273cc39652dfbca26cfca09e5919e3 Mon Sep 17 00:00:00 2001 From: Chrislearn Young Date: Thu, 4 Jan 2024 04:40:36 +0800 Subject: [PATCH 086/210] [salvo] Enable feature server for fix compile error (#8664) --- frameworks/Rust/salvo/Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Rust/salvo/Cargo.toml b/frameworks/Rust/salvo/Cargo.toml index 8425ce6f8ce..cbeaff5e350 100644 --- a/frameworks/Rust/salvo/Cargo.toml +++ b/frameworks/Rust/salvo/Cargo.toml @@ -49,7 +49,7 @@ markup = "0.15" mongodb = { version = "2.4.0", features = ["zstd-compression", "snappy-compression", "zlib-compression"] } once_cell = "1" rand = { version = "0.8", features = ["min_const_gen", "small_rng"] } -salvo = { version = "0.63", default-features = false, features = ["anyhow", "http1", "affix"] } +salvo = { version = "0.63", default-features = false, features = ["anyhow", "server", "http1", "affix"] } serde = { version = "1", features = ["derive"] } serde_json = "1" # smallvec = "1" From bbdb62178f9dc24177f67fa0ebba4e8dccc3527c Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Wed, 3 Jan 2024 21:40:59 +0100 Subject: [PATCH 087/210] [ruby] Use Ruby 3.3 and update README's (#8666) With the release of Ruby 3.3 we no longer need to use the release candidate. --- frameworks/Ruby/agoo/agoo.dockerfile | 2 +- frameworks/Ruby/grape/README.md | 2 +- frameworks/Ruby/grape/grape-unicorn.dockerfile | 2 +- frameworks/Ruby/grape/grape.dockerfile | 2 +- frameworks/Ruby/hanami/hanami.dockerfile | 2 +- frameworks/Ruby/rack-sequel/README.md | 6 ++---- .../Ruby/rack-sequel/rack-sequel-passenger-mri.dockerfile | 2 +- .../rack-sequel-postgres-passenger-mri.dockerfile | 2 +- .../rack-sequel/rack-sequel-postgres-unicorn-mri.dockerfile | 2 +- frameworks/Ruby/rack-sequel/rack-sequel-postgres.dockerfile | 2 +- .../Ruby/rack-sequel/rack-sequel-unicorn-mri.dockerfile | 2 +- frameworks/Ruby/rack-sequel/rack-sequel.dockerfile | 2 +- frameworks/Ruby/rack/README.md | 2 +- frameworks/Ruby/rack/rack-falcon.dockerfile | 2 +- frameworks/Ruby/rack/rack-unicorn.dockerfile | 2 +- frameworks/Ruby/rack/rack.dockerfile | 2 +- frameworks/Ruby/rails/README.md | 4 ++-- frameworks/Ruby/rails/rails-mysql.dockerfile | 2 +- frameworks/Ruby/rails/rails.dockerfile | 2 +- frameworks/Ruby/roda-sequel/README.md | 2 +- .../Ruby/roda-sequel/roda-sequel-passenger-mri.dockerfile | 2 +- .../roda-sequel-postgres-passenger-mri.dockerfile | 2 +- .../roda-sequel/roda-sequel-postgres-unicorn-mri.dockerfile | 2 +- frameworks/Ruby/roda-sequel/roda-sequel-postgres.dockerfile | 2 +- .../Ruby/roda-sequel/roda-sequel-unicorn-mri.dockerfile | 2 +- frameworks/Ruby/roda-sequel/roda-sequel.dockerfile | 2 +- frameworks/Ruby/sinatra-sequel/README.md | 4 ++-- .../Ruby/sinatra-sequel/sinatra-sequel-base.dockerfile | 2 +- .../sinatra-sequel/sinatra-sequel-passenger-mri.dockerfile | 2 +- .../sinatra-sequel-postgres-passenger-mri.dockerfile | 2 +- .../sinatra-sequel-postgres-unicorn-mri.dockerfile | 2 +- .../Ruby/sinatra-sequel/sinatra-sequel-postgres.dockerfile | 2 +- .../sinatra-sequel/sinatra-sequel-unicorn-mri.dockerfile | 2 +- frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile | 2 +- frameworks/Ruby/sinatra/README.md | 2 +- frameworks/Ruby/sinatra/sinatra-passenger-mri.dockerfile | 2 +- .../Ruby/sinatra/sinatra-postgres-passenger-mri.dockerfile | 2 +- .../Ruby/sinatra/sinatra-postgres-unicorn-mri.dockerfile | 2 +- frameworks/Ruby/sinatra/sinatra-postgres.dockerfile | 2 +- frameworks/Ruby/sinatra/sinatra-unicorn-mri.dockerfile | 2 +- frameworks/Ruby/sinatra/sinatra.dockerfile | 2 +- 41 files changed, 44 insertions(+), 46 deletions(-) diff --git a/frameworks/Ruby/agoo/agoo.dockerfile b/frameworks/Ruby/agoo/agoo.dockerfile index cbd64cb1f69..b423b2b4f4d 100644 --- a/frameworks/Ruby/agoo/agoo.dockerfile +++ b/frameworks/Ruby/agoo/agoo.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3-rc +FROM ruby:3.3 RUN apt-get update -q \ && apt-get install --no-install-recommends -q -y \ diff --git a/frameworks/Ruby/grape/README.md b/frameworks/Ruby/grape/README.md index a6cc29080a3..80bb63763a4 100644 --- a/frameworks/Ruby/grape/README.md +++ b/frameworks/Ruby/grape/README.md @@ -11,7 +11,7 @@ comparing a variety of web servers. ## Infrastructure Software Versions The tests were run with: -* [Ruby 3.3-rc1](http://www.ruby-lang.org/) +* [Ruby 3.3](http://www.ruby-lang.org/) * [Grape 1.6.2](http://www.ruby-grape.org/) * [Rack 2.2.3.1](https://rack.github.io/) * [Unicorn 6.1.0](https://yhbt.net/unicorn/) diff --git a/frameworks/Ruby/grape/grape-unicorn.dockerfile b/frameworks/Ruby/grape/grape-unicorn.dockerfile index b7d800649ba..2b0e1ba1dc3 100644 --- a/frameworks/Ruby/grape/grape-unicorn.dockerfile +++ b/frameworks/Ruby/grape/grape-unicorn.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3-rc +FROM ruby:3.3 ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/grape/grape.dockerfile b/frameworks/Ruby/grape/grape.dockerfile index 76b45401ac9..ea90f27d262 100644 --- a/frameworks/Ruby/grape/grape.dockerfile +++ b/frameworks/Ruby/grape/grape.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3-rc +FROM ruby:3.3 ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/hanami/hanami.dockerfile b/frameworks/Ruby/hanami/hanami.dockerfile index 2230a6d4675..4fb8b4523f7 100644 --- a/frameworks/Ruby/hanami/hanami.dockerfile +++ b/frameworks/Ruby/hanami/hanami.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3-rc +FROM ruby:3.3 ENV BUNDLE_FORCE_RUBY_PLATFORM=true ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/rack-sequel/README.md b/frameworks/Ruby/rack-sequel/README.md index 1aa39b2b4a2..11563d8ffeb 100644 --- a/frameworks/Ruby/rack-sequel/README.md +++ b/frameworks/Ruby/rack-sequel/README.md @@ -12,10 +12,8 @@ a variety of web platforms. The tests will be run with: -* [Ruby 2.4](http://www.ruby-lang.org) -* [JRuby 9.1](http://jruby.org) -* [Rubinius 3](https://rubinius.com)\* -* [Puma 3](http://puma.io) +* [Ruby 3.3](http://www.ruby-lang.org) +* [Puma 6](http://puma.io) * [Passenger 5](https://www.phusionpassenger.com) * [Unicorn 5](https://bogomips.org/unicorn/) * [Rack 2](http://rack.rubyforge.org) diff --git a/frameworks/Ruby/rack-sequel/rack-sequel-passenger-mri.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel-passenger-mri.dockerfile index 1264a3d67e7..381ea34a10b 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel-passenger-mri.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel-passenger-mri.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3-rc +FROM ruby:3.3 ADD ./ /rack-sequel diff --git a/frameworks/Ruby/rack-sequel/rack-sequel-postgres-passenger-mri.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel-postgres-passenger-mri.dockerfile index f4cec089ff8..d157b710c31 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel-postgres-passenger-mri.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel-postgres-passenger-mri.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3-rc +FROM ruby:3.3 ADD ./ /rack-sequel diff --git a/frameworks/Ruby/rack-sequel/rack-sequel-postgres-unicorn-mri.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel-postgres-unicorn-mri.dockerfile index b702ee0cc8b..68f6665bf74 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel-postgres-unicorn-mri.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel-postgres-unicorn-mri.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3-rc +FROM ruby:3.3 ADD ./ /rack-sequel diff --git a/frameworks/Ruby/rack-sequel/rack-sequel-postgres.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel-postgres.dockerfile index 490dce8730e..3737c034cda 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel-postgres.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel-postgres.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3-rc +FROM ruby:3.3 ADD ./ /rack-sequel diff --git a/frameworks/Ruby/rack-sequel/rack-sequel-unicorn-mri.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel-unicorn-mri.dockerfile index 3e03ab1d14a..846d25d0532 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel-unicorn-mri.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel-unicorn-mri.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3-rc +FROM ruby:3.3 ADD ./ /rack-sequel diff --git a/frameworks/Ruby/rack-sequel/rack-sequel.dockerfile b/frameworks/Ruby/rack-sequel/rack-sequel.dockerfile index 9da494ae34a..796978d6d52 100644 --- a/frameworks/Ruby/rack-sequel/rack-sequel.dockerfile +++ b/frameworks/Ruby/rack-sequel/rack-sequel.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3-rc +FROM ruby:3.3 ADD ./ /rack-sequel diff --git a/frameworks/Ruby/rack/README.md b/frameworks/Ruby/rack/README.md index 7bc67727fba..1f4c0a3ad45 100644 --- a/frameworks/Ruby/rack/README.md +++ b/frameworks/Ruby/rack/README.md @@ -11,7 +11,7 @@ comparing a variety of web servers. ## Infrastructure Software Versions The tests were run with: -* [Ruby 3.2](http://www.ruby-lang.org/) +* [Ruby 3.3](http://www.ruby-lang.org/) * [JRuby 9.4](http://jruby.org/) * [Rack 3.0.7](http://rack.github.com/) * [Unicorn 6.1.0](http://unicorn.bogomips.org/) diff --git a/frameworks/Ruby/rack/rack-falcon.dockerfile b/frameworks/Ruby/rack/rack-falcon.dockerfile index b8e5d330cc5..a8975a65038 100644 --- a/frameworks/Ruby/rack/rack-falcon.dockerfile +++ b/frameworks/Ruby/rack/rack-falcon.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3-rc +FROM ruby:3.3 ENV BUNDLE_FORCE_RUBY_PLATFORM=true ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/rack/rack-unicorn.dockerfile b/frameworks/Ruby/rack/rack-unicorn.dockerfile index 917295345ae..11c017d61f2 100644 --- a/frameworks/Ruby/rack/rack-unicorn.dockerfile +++ b/frameworks/Ruby/rack/rack-unicorn.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3-rc +FROM ruby:3.3 #RUN apt-get update -yqq && apt-get install -yqq nginx diff --git a/frameworks/Ruby/rack/rack.dockerfile b/frameworks/Ruby/rack/rack.dockerfile index 5819b3288ed..4ddda8e02c5 100644 --- a/frameworks/Ruby/rack/rack.dockerfile +++ b/frameworks/Ruby/rack/rack.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3-rc +FROM ruby:3.3 ENV BUNDLE_FORCE_RUBY_PLATFORM=true ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/rails/README.md b/frameworks/Ruby/rails/README.md index 6699e544d72..564df6d6479 100644 --- a/frameworks/Ruby/rails/README.md +++ b/frameworks/Ruby/rails/README.md @@ -12,8 +12,8 @@ comparing a variety of web platforms. The tests were run with: -- [Ruby 3.2.2](http://www.ruby-lang.org/) -- [Rails 7.0.8](http://rubyonrails.org/) +- [Ruby 3.3](http://www.ruby-lang.org/) +- [Rails 7.1](http://rubyonrails.org/) - [Puma 6.4](http://puma.io/) - [MySQL](https://dev.mysql.com/) - [PostgreSQL](https://www.postgresql.org/) diff --git a/frameworks/Ruby/rails/rails-mysql.dockerfile b/frameworks/Ruby/rails/rails-mysql.dockerfile index b5496825df0..7129e9bd6d6 100644 --- a/frameworks/Ruby/rails/rails-mysql.dockerfile +++ b/frameworks/Ruby/rails/rails-mysql.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3-rc +FROM ruby:3.3 RUN apt-get update -yqq && apt-get install -yqq --no-install-recommends redis-server diff --git a/frameworks/Ruby/rails/rails.dockerfile b/frameworks/Ruby/rails/rails.dockerfile index 627831fc6e5..d49a378e9bf 100644 --- a/frameworks/Ruby/rails/rails.dockerfile +++ b/frameworks/Ruby/rails/rails.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3-rc +FROM ruby:3.3 RUN apt-get update -yqq && apt-get install -yqq --no-install-recommends redis-server diff --git a/frameworks/Ruby/roda-sequel/README.md b/frameworks/Ruby/roda-sequel/README.md index 311ecd7b500..821d0fbeb6a 100644 --- a/frameworks/Ruby/roda-sequel/README.md +++ b/frameworks/Ruby/roda-sequel/README.md @@ -12,7 +12,7 @@ comparing a variety of web platforms. The tests will be run with: -* [Ruby 2.4](http://www.ruby-lang.org) +* [Ruby 3.3](http://www.ruby-lang.org) * [JRuby 9.1](http://jruby.org) * [Rubinius 3](https://rubinius.com)\* * [Puma 3](http://puma.io) diff --git a/frameworks/Ruby/roda-sequel/roda-sequel-passenger-mri.dockerfile b/frameworks/Ruby/roda-sequel/roda-sequel-passenger-mri.dockerfile index 73c319ebc2d..2aad19e21e1 100644 --- a/frameworks/Ruby/roda-sequel/roda-sequel-passenger-mri.dockerfile +++ b/frameworks/Ruby/roda-sequel/roda-sequel-passenger-mri.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3-rc +FROM ruby:3.3 ADD ./ /roda-sequel WORKDIR /roda-sequel diff --git a/frameworks/Ruby/roda-sequel/roda-sequel-postgres-passenger-mri.dockerfile b/frameworks/Ruby/roda-sequel/roda-sequel-postgres-passenger-mri.dockerfile index a315438d86a..74aaf520136 100644 --- a/frameworks/Ruby/roda-sequel/roda-sequel-postgres-passenger-mri.dockerfile +++ b/frameworks/Ruby/roda-sequel/roda-sequel-postgres-passenger-mri.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3-rc +FROM ruby:3.3 ADD ./ /roda-sequel WORKDIR /roda-sequel diff --git a/frameworks/Ruby/roda-sequel/roda-sequel-postgres-unicorn-mri.dockerfile b/frameworks/Ruby/roda-sequel/roda-sequel-postgres-unicorn-mri.dockerfile index 623d8840e5d..2a7da65809e 100644 --- a/frameworks/Ruby/roda-sequel/roda-sequel-postgres-unicorn-mri.dockerfile +++ b/frameworks/Ruby/roda-sequel/roda-sequel-postgres-unicorn-mri.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3-rc +FROM ruby:3.3 ADD ./ /roda-sequel WORKDIR /roda-sequel diff --git a/frameworks/Ruby/roda-sequel/roda-sequel-postgres.dockerfile b/frameworks/Ruby/roda-sequel/roda-sequel-postgres.dockerfile index 787e4080ea1..d0f073132ca 100644 --- a/frameworks/Ruby/roda-sequel/roda-sequel-postgres.dockerfile +++ b/frameworks/Ruby/roda-sequel/roda-sequel-postgres.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3-rc +FROM ruby:3.3 ADD ./ /roda-sequel WORKDIR /roda-sequel diff --git a/frameworks/Ruby/roda-sequel/roda-sequel-unicorn-mri.dockerfile b/frameworks/Ruby/roda-sequel/roda-sequel-unicorn-mri.dockerfile index fad6582b85a..0595393d903 100644 --- a/frameworks/Ruby/roda-sequel/roda-sequel-unicorn-mri.dockerfile +++ b/frameworks/Ruby/roda-sequel/roda-sequel-unicorn-mri.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3-rc +FROM ruby:3.3 ADD ./ /roda-sequel WORKDIR /roda-sequel diff --git a/frameworks/Ruby/roda-sequel/roda-sequel.dockerfile b/frameworks/Ruby/roda-sequel/roda-sequel.dockerfile index 34fd0da0dd0..0988d366a1e 100644 --- a/frameworks/Ruby/roda-sequel/roda-sequel.dockerfile +++ b/frameworks/Ruby/roda-sequel/roda-sequel.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3-rc +FROM ruby:3.3 ADD ./ /roda-sequel WORKDIR /roda-sequel diff --git a/frameworks/Ruby/sinatra-sequel/README.md b/frameworks/Ruby/sinatra-sequel/README.md index 89ee66adb32..a9e8e72728b 100644 --- a/frameworks/Ruby/sinatra-sequel/README.md +++ b/frameworks/Ruby/sinatra-sequel/README.md @@ -12,9 +12,9 @@ comparing a variety of web platforms. The tests will be run with: -* [Ruby 3.3-rc1](http://www.ruby-lang.org) +* [Ruby 3.3](http://www.ruby-lang.org) * [JRuby 9.4](http://jruby.org) -* [Puma 3](http://puma.io) +* [Puma 6](http://puma.io) * [Passenger 5](https://www.phusionpassenger.com) * [Unicorn 5](https://bogomips.org/unicorn/) * [Sinatra 2](http://www.sinatrarb.com) diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-base.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-base.dockerfile index d96f522e49d..ff757c613a3 100644 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-base.dockerfile +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-base.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3-rc +FROM ruby:3.3 ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-passenger-mri.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-passenger-mri.dockerfile index dfe342c2a74..6aa9e5c3cb8 100644 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-passenger-mri.dockerfile +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-passenger-mri.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3-rc +FROM ruby:3.3 ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-passenger-mri.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-passenger-mri.dockerfile index 3e5cc00c634..f2c31645934 100644 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-passenger-mri.dockerfile +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-passenger-mri.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3-rc +FROM ruby:3.3 ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-unicorn-mri.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-unicorn-mri.dockerfile index 3be003d036b..4a5a7d7bb68 100644 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-unicorn-mri.dockerfile +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres-unicorn-mri.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3-rc +FROM ruby:3.3 ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres.dockerfile index 1ddf88b4d0c..3094fc88cc6 100644 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres.dockerfile +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-postgres.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3-rc +FROM ruby:3.3 ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-unicorn-mri.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-unicorn-mri.dockerfile index 3d42937031e..fea0aff40c0 100644 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel-unicorn-mri.dockerfile +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel-unicorn-mri.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3-rc +FROM ruby:3.3 ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile b/frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile index 78a9fbad91d..944d8fff20c 100644 --- a/frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile +++ b/frameworks/Ruby/sinatra-sequel/sinatra-sequel.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3-rc +FROM ruby:3.3 ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/sinatra/README.md b/frameworks/Ruby/sinatra/README.md index 38e5dc4ea0b..ff118f6ff21 100644 --- a/frameworks/Ruby/sinatra/README.md +++ b/frameworks/Ruby/sinatra/README.md @@ -12,7 +12,7 @@ comparing a variety of web platforms. The tests will be run with: -* [Ruby 3.3-rc](http://www.ruby-lang.org) +* [Ruby 3.3](http://www.ruby-lang.org) * [Puma 6](http://puma.io) * [Passenger 6](https://www.phusionpassenger.com) * [Unicorn 6](https://bogomips.org/unicorn/) diff --git a/frameworks/Ruby/sinatra/sinatra-passenger-mri.dockerfile b/frameworks/Ruby/sinatra/sinatra-passenger-mri.dockerfile index 9ef7f70943d..ccab0a6feac 100644 --- a/frameworks/Ruby/sinatra/sinatra-passenger-mri.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra-passenger-mri.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3-rc +FROM ruby:3.3 ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/sinatra/sinatra-postgres-passenger-mri.dockerfile b/frameworks/Ruby/sinatra/sinatra-postgres-passenger-mri.dockerfile index 92c66ae5985..c74cf454967 100644 --- a/frameworks/Ruby/sinatra/sinatra-postgres-passenger-mri.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra-postgres-passenger-mri.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3-rc +FROM ruby:3.3 ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/sinatra/sinatra-postgres-unicorn-mri.dockerfile b/frameworks/Ruby/sinatra/sinatra-postgres-unicorn-mri.dockerfile index e264737b84f..ec3e0d2f8ff 100644 --- a/frameworks/Ruby/sinatra/sinatra-postgres-unicorn-mri.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra-postgres-unicorn-mri.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3-rc +FROM ruby:3.3 ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile b/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile index 52c38f195fb..89784eed670 100644 --- a/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra-postgres.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3-rc +FROM ruby:3.3 ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/sinatra/sinatra-unicorn-mri.dockerfile b/frameworks/Ruby/sinatra/sinatra-unicorn-mri.dockerfile index 330670f9962..71871552328 100644 --- a/frameworks/Ruby/sinatra/sinatra-unicorn-mri.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra-unicorn-mri.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3-rc +FROM ruby:3.3 ENV RUBY_YJIT_ENABLE=1 diff --git a/frameworks/Ruby/sinatra/sinatra.dockerfile b/frameworks/Ruby/sinatra/sinatra.dockerfile index 614b265a6ea..729eba869be 100644 --- a/frameworks/Ruby/sinatra/sinatra.dockerfile +++ b/frameworks/Ruby/sinatra/sinatra.dockerfile @@ -1,4 +1,4 @@ -FROM ruby:3.3-rc +FROM ruby:3.3 ENV RUBY_YJIT_ENABLE=1 From 16485aff5930e7593d5988ebfc86754621d79d12 Mon Sep 17 00:00:00 2001 From: David Denton Date: Wed, 3 Jan 2024 20:41:12 +0000 Subject: [PATCH 088/210] http4k. Upgrade to new version and introduce Jetty 11 test variants (#8667) * Added Jetty11 files * Upgrade HTTP4k to new version and introduce jetty 11 variants * Fix compile :) --- frameworks/Kotlin/http4k/README.md | 3 +- .../Kotlin/http4k/benchmark_config.json | 66 +++++++++++++++++++ frameworks/Kotlin/http4k/build.gradle.kts | 3 +- frameworks/Kotlin/http4k/config.toml | 54 +++++++++++++++ .../Kotlin/http4k/core/build.gradle.kts | 8 +-- .../Kotlin/http4k/http4k-jetty11.dockerfile | 14 ++++ .../http4k/http4k-jetty11loom-jdbc.dockerfile | 13 ++++ .../http4k-jetty11loom-pgclient.dockerfile | 13 ++++ .../Kotlin/http4k/jetty11/build.gradle.kts | 6 ++ .../src/main/kotlin/Http4kJettyServer.kt | 5 ++ .../http4k/jetty11loom-jdbc/build.gradle.kts | 6 ++ .../src/main/kotlin/Http4kJettyLoomServer.kt | 5 ++ .../jetty11loom-pgclient/build.gradle.kts | 6 ++ .../src/main/kotlin/Http4kJettyLoomServer.kt | 5 ++ frameworks/Kotlin/http4k/settings.gradle.kts | 3 + 15 files changed, 204 insertions(+), 6 deletions(-) create mode 100644 frameworks/Kotlin/http4k/http4k-jetty11.dockerfile create mode 100644 frameworks/Kotlin/http4k/http4k-jetty11loom-jdbc.dockerfile create mode 100644 frameworks/Kotlin/http4k/http4k-jetty11loom-pgclient.dockerfile create mode 100644 frameworks/Kotlin/http4k/jetty11/build.gradle.kts create mode 100644 frameworks/Kotlin/http4k/jetty11/src/main/kotlin/Http4kJettyServer.kt create mode 100644 frameworks/Kotlin/http4k/jetty11loom-jdbc/build.gradle.kts create mode 100644 frameworks/Kotlin/http4k/jetty11loom-jdbc/src/main/kotlin/Http4kJettyLoomServer.kt create mode 100644 frameworks/Kotlin/http4k/jetty11loom-pgclient/build.gradle.kts create mode 100644 frameworks/Kotlin/http4k/jetty11loom-pgclient/src/main/kotlin/Http4kJettyLoomServer.kt diff --git a/frameworks/Kotlin/http4k/README.md b/frameworks/Kotlin/http4k/README.md index 65e8a3e1570..cf06bf0c995 100644 --- a/frameworks/Kotlin/http4k/README.md +++ b/frameworks/Kotlin/http4k/README.md @@ -16,13 +16,14 @@ The tests were run with: - Plaintext: http://localhost:9000/plaintext ## Supported backends (w/ Postgres client) -- SunHttp/SunHttpLoom (default - bundled with core module - zero dependencies) (+ SunHttpLoom w/GraalVM) +- SunHttp/SunHttpLoom (default - bundled with core module - zero dependencies) (+ SunHttpLoom w/GraalVM) - Apache (5) - Apache4 (+ w/GraalVM) - Helidon (+ w/GraalVM) - KtorCIO - KtorNetty - Jetty/JettyLoom +- Jetty/JettyLoom (v11) - Netty - Ratpack - Undertow diff --git a/frameworks/Kotlin/http4k/benchmark_config.json b/frameworks/Kotlin/http4k/benchmark_config.json index 60fbe075918..81dd97b4b47 100755 --- a/frameworks/Kotlin/http4k/benchmark_config.json +++ b/frameworks/Kotlin/http4k/benchmark_config.json @@ -264,6 +264,72 @@ "notes": "https://http4k.org", "versus": "jetty" }, + "jetty11": { + "orm": "Raw", + "database_os": "Linux", + "cached_query_url": "/cached?queries=", + "db_url": "/db", + "json_url": "/json", + "fortune_url": "/fortunes", + "plaintext_url": "/plaintext", + "query_url": "/queries?queries=", + "update_url": "/updates?queries=", + "database": "Postgres", + "port": 9000, + "approach": "Realistic", + "classification": "Micro", + "framework": "http4k", + "language": "Kotlin", + "platform": "jetty11", + "webserver": "None", + "os": "Linux", + "notes": "https://http4k.org", + "versus": "jetty" + }, + "jetty11loom-jdbc": { + "orm": "Raw", + "database_os": "Linux", + "cached_query_url": "/cached?queries=", + "db_url": "/db", + "json_url": "/json", + "fortune_url": "/fortunes", + "plaintext_url": "/plaintext", + "query_url": "/queries?queries=", + "update_url": "/updates?queries=", + "database": "Postgres", + "port": 9000, + "approach": "Realistic", + "classification": "Micro", + "framework": "http4k", + "language": "Kotlin", + "platform": "jetty11-loom-jdbc", + "webserver": "None", + "os": "Linux", + "notes": "https://http4k.org", + "versus": "jetty11" + }, + "jetty11loom-pgclient": { + "orm": "Raw", + "database_os": "Linux", + "cached_query_url": "/cached?queries=", + "db_url": "/db", + "json_url": "/json", + "fortune_url": "/fortunes", + "plaintext_url": "/plaintext", + "query_url": "/queries?queries=", + "update_url": "/updates?queries=", + "database": "Postgres", + "port": 9000, + "approach": "Realistic", + "classification": "Micro", + "framework": "http4k", + "language": "Kotlin", + "platform": "jetty11-loom-pgclient", + "webserver": "None", + "os": "Linux", + "notes": "https://http4k.org", + "versus": "jetty11" + }, "ktorcio": { "orm": "Raw", "database_os": "Linux", diff --git a/frameworks/Kotlin/http4k/build.gradle.kts b/frameworks/Kotlin/http4k/build.gradle.kts index 3e2cebabc3c..954b08a5fbc 100644 --- a/frameworks/Kotlin/http4k/build.gradle.kts +++ b/frameworks/Kotlin/http4k/build.gradle.kts @@ -1,9 +1,10 @@ import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import org.gradle.api.JavaVersion.* import org.jetbrains.kotlin.gradle.tasks.KotlinCompile +import org.jetbrains.kotlin.js.translate.context.Namer.kotlin plugins { - kotlin("jvm") version "1.9.20" + kotlin("jvm") version "1.9.22" application } diff --git a/frameworks/Kotlin/http4k/config.toml b/frameworks/Kotlin/http4k/config.toml index 3033ee189fa..4f3a6f6e614 100644 --- a/frameworks/Kotlin/http4k/config.toml +++ b/frameworks/Kotlin/http4k/config.toml @@ -161,6 +161,60 @@ platform = "jetty-loom-pgclient" webserver = "None" versus = "jetty" +[jetty11] +urls.cached_query = "/cached?queries=" +urls.db = "/db" +urls.fortune = "/fortunes" +urls.json = "/json" +urls.plaintext = "/plaintext" +urls.query = "/queries?queries=" +urls.update = "/updates?queries=" +approach = "Realistic" +classification = "Micro" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "jetty11" +webserver = "None" +versus = "jetty" + +[jetty11loom-jdbc] +urls.cached_query = "/cached?queries=" +urls.db = "/db" +urls.fortune = "/fortunes" +urls.json = "/json" +urls.plaintext = "/plaintext" +urls.query = "/queries?queries=" +urls.update = "/updates?queries=" +approach = "Realistic" +classification = "Micro" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "jetty-loom11-jdbc" +webserver = "None" +versus = "jetty11" + +[jetty11loom-pgclient] +urls.cached_query = "/cached?queries=" +urls.db = "/db" +urls.fortune = "/fortunes" +urls.json = "/json" +urls.plaintext = "/plaintext" +urls.query = "/queries?queries=" +urls.update = "/updates?queries=" +approach = "Realistic" +classification = "Micro" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "jetty11-loom-pgclient" +webserver = "None" +versus = "jetty11" + [helidon-jdbc] urls.cached_query = "/cached?queries=" urls.db = "/db" diff --git a/frameworks/Kotlin/http4k/core/build.gradle.kts b/frameworks/Kotlin/http4k/core/build.gradle.kts index f205c09bc25..3780e39df97 100644 --- a/frameworks/Kotlin/http4k/core/build.gradle.kts +++ b/frameworks/Kotlin/http4k/core/build.gradle.kts @@ -4,16 +4,16 @@ plugins { } dependencies { - api(platform("org.http4k:http4k-bom:5.10.2.0")) - api("org.jetbrains.kotlin:kotlin-stdlib:1.9.20") - api("org.jetbrains.kotlin:kotlin-reflect:1.9.20") + api(platform("org.http4k:http4k-bom:5.12.0.0")) + api("org.jetbrains.kotlin:kotlin-stdlib:1.9.22") + api("org.jetbrains.kotlin:kotlin-reflect:1.9.22") api("org.http4k:http4k-core") api("org.http4k:http4k-format-argo") api("org.http4k:http4k-template-rocker") api("org.apache.commons:commons-lang3:3.12.0") api("org.cache2k:cache2k-core:2.6.1.Final") - compileOnly("com.fizzed:rocker-compiler:1.3.0") + compileOnly("com.fizzed:rocker-compiler:1.4.0") } rocker { diff --git a/frameworks/Kotlin/http4k/http4k-jetty11.dockerfile b/frameworks/Kotlin/http4k/http4k-jetty11.dockerfile new file mode 100644 index 00000000000..de416c28a3d --- /dev/null +++ b/frameworks/Kotlin/http4k/http4k-jetty11.dockerfile @@ -0,0 +1,14 @@ +FROM gradle:8.4.0-jdk21 +USER root +WORKDIR /http4k +COPY build.gradle.kts build.gradle.kts +COPY settings.gradle.kts settings.gradle.kts +COPY core core +COPY core-jdbc core-jdbc +COPY core-pgclient core-pgclient +COPY jetty11 jetty11 +RUN gradle --quiet --no-daemon jetty11:shadowJar + +EXPOSE 9000 + +CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AlwaysPreTouch", "-jar", "jetty11/build/libs/http4k-benchmark.jar"] diff --git a/frameworks/Kotlin/http4k/http4k-jetty11loom-jdbc.dockerfile b/frameworks/Kotlin/http4k/http4k-jetty11loom-jdbc.dockerfile new file mode 100644 index 00000000000..729ef447464 --- /dev/null +++ b/frameworks/Kotlin/http4k/http4k-jetty11loom-jdbc.dockerfile @@ -0,0 +1,13 @@ +FROM gradle:8.4.0-jdk21 +USER root +WORKDIR /http4k +COPY build.gradle.kts build.gradle.kts +COPY settings.gradle.kts settings.gradle.kts +COPY core core +COPY core-jdbc core-jdbc +COPY jetty11loom-jdbc jetty11loom-jdbc +RUN gradle --quiet --no-daemon jetty11loom-jdbc:shadowJar + +EXPOSE 9000 + +CMD ["java", "-server", "-XX:+UseNUMA", "--enable-preview", "-XX:+UseParallelGC", "-XX:+AlwaysPreTouch", "-jar", "jetty11loom-jdbc/build/libs/http4k-benchmark.jar"] diff --git a/frameworks/Kotlin/http4k/http4k-jetty11loom-pgclient.dockerfile b/frameworks/Kotlin/http4k/http4k-jetty11loom-pgclient.dockerfile new file mode 100644 index 00000000000..0560643c10e --- /dev/null +++ b/frameworks/Kotlin/http4k/http4k-jetty11loom-pgclient.dockerfile @@ -0,0 +1,13 @@ +FROM gradle:8.4.0-jdk21 +USER root +WORKDIR /http4k +COPY build.gradle.kts build.gradle.kts +COPY settings.gradle.kts settings.gradle.kts +COPY core core +COPY core-pgclient core-pgclient +COPY jetty11loom-pgclient jetty11loom-pgclient +RUN gradle --quiet --no-daemon jetty11loom-pgclient:shadowJar + +EXPOSE 9000 + +CMD ["java", "-server", "-XX:+UseNUMA", "--enable-preview", "-XX:+UseParallelGC", "-XX:+AlwaysPreTouch", "-jar", "jetty11loom-pgclient/build/libs/http4k-benchmark.jar"] diff --git a/frameworks/Kotlin/http4k/jetty11/build.gradle.kts b/frameworks/Kotlin/http4k/jetty11/build.gradle.kts new file mode 100644 index 00000000000..c01bec2dafa --- /dev/null +++ b/frameworks/Kotlin/http4k/jetty11/build.gradle.kts @@ -0,0 +1,6 @@ +application.mainClass.set("Http4kJettyServerKt") + +dependencies { + api(project(":core-jdbc")) + api("org.http4k:http4k-server-jetty11") +} \ No newline at end of file diff --git a/frameworks/Kotlin/http4k/jetty11/src/main/kotlin/Http4kJettyServer.kt b/frameworks/Kotlin/http4k/jetty11/src/main/kotlin/Http4kJettyServer.kt new file mode 100644 index 00000000000..e157e9033d8 --- /dev/null +++ b/frameworks/Kotlin/http4k/jetty11/src/main/kotlin/Http4kJettyServer.kt @@ -0,0 +1,5 @@ +import org.http4k.server.Jetty11 + +fun main() { + Http4kBenchmarkServer(PostgresDatabase(), false).start(Jetty11(9000)) +} \ No newline at end of file diff --git a/frameworks/Kotlin/http4k/jetty11loom-jdbc/build.gradle.kts b/frameworks/Kotlin/http4k/jetty11loom-jdbc/build.gradle.kts new file mode 100644 index 00000000000..e367717c6ef --- /dev/null +++ b/frameworks/Kotlin/http4k/jetty11loom-jdbc/build.gradle.kts @@ -0,0 +1,6 @@ +application.mainClass.set("Http4kJettyLoomServerKt") + +dependencies { + api(project(":core-jdbc")) + api("org.http4k:http4k-server-jetty11") +} \ No newline at end of file diff --git a/frameworks/Kotlin/http4k/jetty11loom-jdbc/src/main/kotlin/Http4kJettyLoomServer.kt b/frameworks/Kotlin/http4k/jetty11loom-jdbc/src/main/kotlin/Http4kJettyLoomServer.kt new file mode 100644 index 00000000000..d23f47c4ef9 --- /dev/null +++ b/frameworks/Kotlin/http4k/jetty11loom-jdbc/src/main/kotlin/Http4kJettyLoomServer.kt @@ -0,0 +1,5 @@ +import org.http4k.server.Jetty11Loom + +fun main() { + Http4kBenchmarkServer(PostgresDatabase(), false).start(Jetty11Loom(9000)) +} \ No newline at end of file diff --git a/frameworks/Kotlin/http4k/jetty11loom-pgclient/build.gradle.kts b/frameworks/Kotlin/http4k/jetty11loom-pgclient/build.gradle.kts new file mode 100644 index 00000000000..3c555b12ac4 --- /dev/null +++ b/frameworks/Kotlin/http4k/jetty11loom-pgclient/build.gradle.kts @@ -0,0 +1,6 @@ +application.mainClass.set("Http4kJettyLoomServerKt") + +dependencies { + api(project(":core-pgclient")) + api("org.http4k:http4k-server-jetty11") +} \ No newline at end of file diff --git a/frameworks/Kotlin/http4k/jetty11loom-pgclient/src/main/kotlin/Http4kJettyLoomServer.kt b/frameworks/Kotlin/http4k/jetty11loom-pgclient/src/main/kotlin/Http4kJettyLoomServer.kt new file mode 100644 index 00000000000..d23f47c4ef9 --- /dev/null +++ b/frameworks/Kotlin/http4k/jetty11loom-pgclient/src/main/kotlin/Http4kJettyLoomServer.kt @@ -0,0 +1,5 @@ +import org.http4k.server.Jetty11Loom + +fun main() { + Http4kBenchmarkServer(PostgresDatabase(), false).start(Jetty11Loom(9000)) +} \ No newline at end of file diff --git a/frameworks/Kotlin/http4k/settings.gradle.kts b/frameworks/Kotlin/http4k/settings.gradle.kts index 61d5ec3c132..bc46ef57f0e 100644 --- a/frameworks/Kotlin/http4k/settings.gradle.kts +++ b/frameworks/Kotlin/http4k/settings.gradle.kts @@ -30,6 +30,9 @@ include("graalvm") include("jetty") include("jettyloom-jdbc") include("jettyloom-pgclient") +include("jetty11") +include("jetty11loom-jdbc") +include("jetty11loom-pgclient") include("helidon-jdbc") include("helidon-pgclient") include("helidon-graalvm") From a587101e5a888ea3390a0c467e6f259a6b6921ae Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Wed, 3 Jan 2024 21:41:53 +0100 Subject: [PATCH 089/210] [ruby/rails] Use 3 threads per worker (#8668) Using 3 threads instead of 5 seems optimal. Running this locally I got the following results: +---------------------+---------+------+-----+-----+-----+-------+--------------+ | |plaintext|update| json| db|query|fortune|weighted_score| +---------------------+---------+------+-----+-----+-----+-------+--------------+ | 2 threads per worker| 20870| 9478|66764|16220|11634| 10543| 1042| | 1 thread per worker| 20799| 9819|83123|17434|10334| 8653| 1048| | 4 threads per worker| 29257| 10051|69532|18108|11752| 11132| 1093| | 5 threads per worker| 33152| 10203|77062|18459|11721| 11711| 1114| | 3 threads per worker| 25077| 10382|84429|16497|12338| 11246| 1141| +---------------------+---------+------+-----+-----+-----+-------+--------------+ --- frameworks/Ruby/rails/config/database.yml | 2 +- frameworks/Ruby/rails/config/puma.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Ruby/rails/config/database.yml b/frameworks/Ruby/rails/config/database.yml index ae7de0910d7..87c1e85a2ac 100644 --- a/frameworks/Ruby/rails/config/database.yml +++ b/frameworks/Ruby/rails/config/database.yml @@ -5,7 +5,7 @@ default: &default password: benchmarkdbpass host: tfb-database timeout: 5000 - pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> + pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 3 } %> development: <<: *default diff --git a/frameworks/Ruby/rails/config/puma.rb b/frameworks/Ruby/rails/config/puma.rb index 3c5a8d92fe1..3089f8334a2 100644 --- a/frameworks/Ruby/rails/config/puma.rb +++ b/frameworks/Ruby/rails/config/puma.rb @@ -9,7 +9,7 @@ # the maximum value specified for Puma. Default is set to 5 threads for minimum # and maximum; this matches the default thread size of Active Record. # -max_threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 } +max_threads_count = ENV.fetch("RAILS_MAX_THREADS") { 3 } min_threads_count = ENV.fetch("RAILS_MIN_THREADS") { max_threads_count } threads min_threads_count, max_threads_count From dfd3f3af4a40386d5245e460b548ec69638fe563 Mon Sep 17 00:00:00 2001 From: itrofimow Date: Wed, 3 Jan 2024 23:42:12 +0300 Subject: [PATCH 090/210] [C++] [userver] bump userver commit, tune a bit (#8669) * bump userver commit, erase logs with #include #include +#include namespace userver_techempower::bare { namespace { -template -class SmallString final { - public: - SmallString() = default; - - void Append(const char* data, std::size_t length) { - const auto old_size = Size(); - data_.resize(old_size + length); - std::memcpy(Data() + old_size, data, length); - } - - void Append(std::string_view sw) { Append(sw.data(), sw.size()); } - - [[nodiscard]] std::string_view AsSw() const { return {Data(), Size()}; } - - [[nodiscard]] char* Data() { return data_.data(); } - [[nodiscard]] const char* Data() const { return data_.data(); } - - [[nodiscard]] std::size_t Size() const { return data_.size(); } - - void Clear() { data_.resize(0); } - - private: - boost::container::small_vector data_; -}; - struct HttpParser final { http_parser parser{}; http_parser_settings parser_settings{}; std::function on_request_cb{}; - SmallString<50> url; + userver::utils::SmallString<50> url; explicit HttpParser(std::function on_request_cb) : on_request_cb{std::move(on_request_cb)} { @@ -68,26 +43,26 @@ struct HttpParser final { static int HttpOnUrl(http_parser* parser, const char* data, std::size_t length) { auto* self = static_cast(parser->data); - self->url.Append(data, length); + self->url.append(std::string_view{data, length}); return 0; } static int HttpOnMessageBegin(http_parser* parser) { auto* self = static_cast(parser->data); - self->url.Clear(); + self->url.clear(); return 0; } static int HttpOnMessageComplete(http_parser* parser) { auto* self = static_cast(parser->data); - self->on_request_cb(self->url.AsSw()); + self->on_request_cb(static_cast(self->url)); return 0; } }; class ResponseBuffers final { public: - using HeadersString = SmallString<200>; + using HeadersString = userver::utils::SmallString<200>; HeadersString& Next(userver::engine::io::Socket& socket, std::string&& body) { if (Size() == kMaxResponses) { @@ -111,9 +86,9 @@ class ResponseBuffers final { std::size_t index = 0; std::size_t total_size = 0; for (const auto& response : responses_) { - iovec[index++] = {response.headers.Data(), response.headers.Size()}; + iovec[index++] = {response.headers.data(), response.headers.size()}; iovec[index++] = {response.body.data(), response.body.size()}; - total_size += response.headers.Size() + response.body.size(); + total_size += response.headers.size() + response.body.size(); } if (socket.SendAll(iovec.data(), iovec.size(), {}) != total_size) { @@ -191,17 +166,17 @@ void SimpleConnection::Process() { const auto content_length_str = std::to_string(response.body.size()); auto& headers = buffers.Next(socket_, std::move(response.body)); - headers.Append(kCommonHeaders); - headers.Append("Content-Type: "); - headers.Append(response.content_type); + headers.append(kCommonHeaders); + headers.append("Content-Type: "); + headers.append(response.content_type); - headers.Append("\r\nContent-Length: "); - headers.Append(content_length_str); + headers.append("\r\nContent-Length: "); + headers.append(content_length_str); - headers.Append("\r\nDate: "); - headers.Append(GetCachedDate()); + headers.append("\r\nDate: "); + headers.append(GetCachedDate()); - headers.Append(kHeadersEnd); + headers.append(kHeadersEnd); }; HttpParser parser{handle_request}; diff --git a/frameworks/C++/userver/userver_configs/static_config.yaml b/frameworks/C++/userver/userver_configs/static_config.yaml index b4fad14911f..01d66d78fad 100644 --- a/frameworks/C++/userver/userver_configs/static_config.yaml +++ b/frameworks/C++/userver/userver_configs/static_config.yaml @@ -83,6 +83,7 @@ components_manager: max_queue_size: 512 connecting_limit: 15 ignore_unused_query_params: true + connlimit_mode: manual single-query-handler: path: /db From 01c8d30b66a29da948e477124164424e10d40249 Mon Sep 17 00:00:00 2001 From: Jacob Rothstein Date: Wed, 3 Jan 2024 12:42:35 -0800 Subject: [PATCH 091/210] [trillium-rs]: update dependencies and fix feature name typo (#8670) --- frameworks/Rust/trillium/Cargo.lock | 386 +++++++++++++-------------- frameworks/Rust/trillium/Cargo.toml | 20 +- frameworks/Rust/trillium/src/main.rs | 2 +- 3 files changed, 196 insertions(+), 212 deletions(-) diff --git a/frameworks/Rust/trillium/Cargo.lock b/frameworks/Rust/trillium/Cargo.lock index 493be2a5d5d..4ea9fae5587 100644 --- a/frameworks/Rust/trillium/Cargo.lock +++ b/frameworks/Rust/trillium/Cargo.lock @@ -19,9 +19,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" +checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" dependencies = [ "cfg-if", "getrandom", @@ -53,24 +53,31 @@ checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" [[package]] name = "askama" -version = "0.11.1" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb98f10f371286b177db5eeb9a6e5396609555686a35e1d4f7b9a9c6d8af0139" +checksum = "b79091df18a97caea757e28cd2d5fda49c6cd4bd01ddffd7ff01ace0c0ad2c28" dependencies = [ "askama_derive", "askama_escape", - "askama_shared", + "humansize", + "num-traits", + "percent-encoding", ] [[package]] name = "askama_derive" -version = "0.11.2" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87bf87e6e8b47264efa9bde63d6225c6276a52e05e91bf37eaa8afd0032d6b71" +checksum = "2ccf09143e56923c12e027b83a9553210a3c58322ed8419a53461b14a4dccd85" dependencies = [ - "askama_shared", + "askama_parser", + "basic-toml", + "mime", + "mime_guess", "proc-macro2", - "syn 1.0.109", + "quote", + "serde", + "syn 2.0.46", ] [[package]] @@ -80,23 +87,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "619743e34b5ba4e9703bba34deac3427c72507c7159f5fd030aea8cac0cfe341" [[package]] -name = "askama_shared" -version = "0.12.2" +name = "askama_parser" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf722b94118a07fcbc6640190f247334027685d4e218b794dbfe17c32bf38ed0" +checksum = "262eb9cf7be51269c5f2951eeda9ccd14d6934e437457f47b4f066bf55a6770d" dependencies = [ - "askama_escape", - "humansize", - "mime", - "mime_guess", "nom", - "num-traits", - "percent-encoding", - "proc-macro2", - "quote", - "serde", - "syn 1.0.109", - "toml", ] [[package]] @@ -117,7 +113,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ca33f4bc4ed1babef42cad36cc1f51fa88be00420404e5b1e80ab1b18f7678c" dependencies = [ "concurrent-queue", - "event-listener 4.0.0", + "event-listener 4.0.2", "event-listener-strategy", "futures-core", "pin-project-lite", @@ -206,20 +202,20 @@ version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7125e42787d53db9dd54261812ef17e937c95a51e4d291373b670342fa44310c" dependencies = [ - "event-listener 4.0.0", + "event-listener 4.0.2", "event-listener-strategy", "pin-project-lite", ] [[package]] name = "async-net" -version = "1.8.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0434b1ed18ce1cf5769b8ac540e33f01fa9471058b5e89da9e06f3c882a8c12f" +checksum = "b948000fad4873c1c9339d60f2623323a0cfd3816e5181033c6a5cb68b2accf7" dependencies = [ - "async-io 1.13.0", + "async-io 2.2.2", "blocking", - "futures-lite 1.13.0", + "futures-lite 2.1.0", ] [[package]] @@ -267,24 +263,24 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.46", ] [[package]] name = "async-task" -version = "4.5.0" +version = "4.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4eb2cdb97421e01129ccb49169d8279ed21e829929144f4a22a6e54ac549ca1" +checksum = "e1d90cd0b264dfdd8eb5bad0a2c217c1f88fa96a8573f40e7b12de23fb468f46" [[package]] name = "async-trait" -version = "0.1.74" +version = "0.1.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" +checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.46", ] [[package]] @@ -345,6 +341,15 @@ version = "0.21.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" +[[package]] +name = "basic-toml" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2db21524cad41c5591204d22d75e1970a2d1f71060214ca931dc7d5afe2c14e5" +dependencies = [ + "serde", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -417,9 +422,9 @@ dependencies = [ [[package]] name = "cargo-platform" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e34637b3140142bdf929fb439e8aa4ebad7651ebf7b1080b3930aa16ac1459ff" +checksum = "ceed8ef69d8518a5dda55c07425450b58a4e1946f4951eab6d7191ee86c2443d" dependencies = [ "serde", ] @@ -513,9 +518,9 @@ checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] name = "crossbeam-channel" -version = "0.5.9" +version = "0.5.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c3242926edf34aec4ac3a77108ad4854bffaa2e4ddc1824124ce59231302d5" +checksum = "82a9b73a36529d9c47029b9fb3a6f0ea3cc916a261195352ba19e770fc1748b2" dependencies = [ "cfg-if", "crossbeam-utils", @@ -523,21 +528,20 @@ dependencies = [ [[package]] name = "crossbeam-epoch" -version = "0.9.16" +version = "0.9.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d2fe95351b870527a5d09bf563ed3c97c0cffb87cf1c78a591bf48bb218d9aa" +checksum = "0e3681d554572a651dda4186cd47240627c3d0114d45a95f6ad27f2f22e7548d" dependencies = [ "autocfg", "cfg-if", "crossbeam-utils", - "memoffset", ] [[package]] name = "crossbeam-queue" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9bcf5bdbfdd6030fb4a1c497b5d5fc5921aa2f60d359a17e249c0e6df3de153" +checksum = "adc6598521bb5a83d491e8c1fe51db7296019d2ca3cb93cc6c2a20369a4d78a2" dependencies = [ "cfg-if", "crossbeam-utils", @@ -545,9 +549,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.17" +version = "0.8.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d96137f14f244c37f989d9fff8f95e6c18b918e71f36638f8c49112e4c78f" +checksum = "c3a430a770ebd84726f584a90ee7f020d28db52c6d02138900f22341f866d39c" dependencies = [ "cfg-if", ] @@ -564,9 +568,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eb30d70a07a3b04884d2677f06bec33509dc67ca60d92949e5535352d3191dc" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ "powerfmt", ] @@ -674,20 +678,9 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "event-listener" -version = "3.1.0" +version = "4.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d93877bcde0eb80ca09131a08d23f0a5c18a620b01db137dba666d18cd9b30c2" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener" -version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "770d968249b5d99410d61f5bf89057f3199a077a04d087092f58e7d10692baae" +checksum = "218a870470cce1469024e9fb66b901aa983929d81304a1cdb299f28118e550d5" dependencies = [ "concurrent-queue", "parking", @@ -700,7 +693,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" dependencies = [ - "event-listener 4.0.0", + "event-listener 4.0.2", "pin-project-lite", ] @@ -757,9 +750,9 @@ dependencies = [ [[package]] name = "futures" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" dependencies = [ "futures-channel", "futures-core", @@ -771,9 +764,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", "futures-sink", @@ -781,9 +774,9 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-intrusive" @@ -798,9 +791,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-lite" @@ -832,32 +825,32 @@ dependencies = [ [[package]] name = "futures-macro" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.46", ] [[package]] name = "futures-sink" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "futures-task" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-util" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-channel", "futures-core", @@ -995,11 +988,11 @@ dependencies = [ [[package]] name = "home" -version = "0.5.5" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -1038,9 +1031,12 @@ checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "humansize" -version = "1.1.1" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02296996cb8796d7c6e3bc2d9211b7802812d36999a51bb754123ead7d37d026" +checksum = "6cb51c9a029ddc91b07a787f1d86b53ccfa49b0e86688c946ebe8d3555685dd7" +dependencies = [ + "libm", +] [[package]] name = "humantime" @@ -1050,9 +1046,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.27" +version = "0.14.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" dependencies = [ "bytes", "futures-channel", @@ -1065,7 +1061,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.4.10", + "socket2 0.5.5", "tokio", "tower-service", "tracing", @@ -1107,13 +1103,13 @@ dependencies = [ [[package]] name = "inherent" -version = "1.0.10" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce243b1bfa62ffc028f1cc3b6034ec63d649f3031bc8a4fbbb004e1ac17d1f68" +checksum = "0122b7114117e64a63ac49f752a5ca4624d534c7b1c7de796ac196381cd2d947" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.46", ] [[package]] @@ -1144,13 +1140,13 @@ checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "is-terminal" -version = "0.4.9" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +checksum = "0bad00257d07be169d870ab665980b06cdb366d792ad690bf2e76876dc503455" dependencies = [ "hermit-abi", "rustix 0.38.28", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -1218,6 +1214,12 @@ version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +[[package]] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + [[package]] name = "linux-raw-sys" version = "0.3.8" @@ -1251,9 +1253,9 @@ dependencies = [ [[package]] name = "mach2" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d0d1830bcd151a6fc4aea1369af235b36c1528fe976b8ff678683c9995eade8" +checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" dependencies = [ "libc", ] @@ -1270,18 +1272,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" - -[[package]] -name = "memoffset" -version = "0.9.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" -dependencies = [ - "autocfg", -] +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" [[package]] name = "mime" @@ -1338,9 +1331,9 @@ dependencies = [ [[package]] name = "moka" -version = "0.12.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8017ec3548ffe7d4cef7ac0e12b044c01164a74c0f3119420faeaf13490ad8b" +checksum = "f353abec74660d4b8533c2516c86eb062f1ec8ca49a2758f4f2b1b60b06b0c6e" dependencies = [ "async-lock 2.8.0", "async-trait", @@ -1419,9 +1412,9 @@ dependencies = [ [[package]] name = "object" -version = "0.32.1" +version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" dependencies = [ "memchr", ] @@ -1434,9 +1427,9 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "openssl" -version = "0.10.61" +version = "0.10.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b8419dc8cc6d866deb801274bba2e6f8f6108c1bb7fcc10ee5ab864931dbb45" +checksum = "8cde4d2d9200ad5909f8dac647e29482e07c3a35de8a13fce7c9c7747ad9f671" dependencies = [ "bitflags 2.4.1", "cfg-if", @@ -1455,7 +1448,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.46", ] [[package]] @@ -1466,9 +1459,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.97" +version = "0.9.98" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3eaad34cdd97d81de97964fc7f29e2d104f483840d906ef56daa1912338460b" +checksum = "c1665caf8ab2dc9aef43d1c0023bd904633a6a05cb30b0ad59bec2ae986e57a7" dependencies = [ "cc", "libc", @@ -1506,7 +1499,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.46", ] [[package]] @@ -1567,7 +1560,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.46", ] [[package]] @@ -1595,9 +1588,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.27" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +checksum = "69d3587f8a9e599cc7ec2c00e331f71c4e69a5f9a4b8a6efd5b07466b9736f9a" [[package]] name = "polling" @@ -1667,9 +1660,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.70" +version = "1.0.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" +checksum = "2de98502f212cfcea8d0bb305bd0f49d7ebdd75b64ba0a68f937d888f4e0d6db" dependencies = [ "unicode-ident", ] @@ -1703,9 +1696,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.33" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] @@ -1789,9 +1782,9 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "reqwest" -version = "0.11.22" +version = "0.11.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" +checksum = "37b1ae8d9ac08420c66222fb9096fc5de435c3c48542bc5336c51892cffafb41" dependencies = [ "base64", "bytes", @@ -1903,11 +1896,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -1926,14 +1919,14 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.46", ] [[package]] name = "sea-orm" -version = "0.12.9" +version = "0.12.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5181eedee8ad0d002d2a288600140fe9937581c4668426a4ff1295c14c736cf" +checksum = "cf9195a2b2a182cbee3f76cf2a97c20204022f91259bdf8a48b537788202775b" dependencies = [ "async-stream", "async-trait", @@ -1953,23 +1946,23 @@ dependencies = [ [[package]] name = "sea-orm-macros" -version = "0.12.6" +version = "0.12.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "816183a751bf9c22087679b20b6142da0b5c6d8981835ebb7b99bf1bf924640a" +checksum = "66c6acfe3d49625c679955c7e7e7cd2d72b512a5c77bcd535a74aa41590b9f28" dependencies = [ "heck", "proc-macro2", "quote", "sea-bae", - "syn 2.0.41", + "syn 2.0.46", "unicode-ident", ] [[package]] name = "sea-query" -version = "0.30.4" +version = "0.30.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41558fa9bb5f4d73952dac0b9d9c2ce23966493fc9ee0008037b01d709838a68" +checksum = "a4a1feb0a26c02efedb049b22d3884e66f15a40c42b33dcbe49b46abc484c2bd" dependencies = [ "derivative", "inherent", @@ -2011,38 +2004,38 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.20" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" +checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" dependencies = [ "serde", ] [[package]] name = "serde" -version = "1.0.193" +version = "1.0.194" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +checksum = "0b114498256798c94a0689e1a15fec6005dee8ac1f41de56404b67afc2a4b773" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.193" +version = "1.0.194" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +checksum = "a3385e45322e8f9931410f01b3031ec534c3947d0e94c18049af4d9f9907d4e0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.46", ] [[package]] name = "serde_json" -version = "1.0.108" +version = "1.0.110" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +checksum = "6fbd975230bada99c8bb618e0c365c2eefa219158d5c6c29610fd09ff1833257" dependencies = [ "itoa", "ryu", @@ -2342,7 +2335,7 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "810ecf6a47020ea27b2cc949d2f1292b9759e8f2c4cebf71376520124417d9e6" dependencies = [ - "event-listener 4.0.0", + "event-listener 4.0.2", "futures-lite 2.1.0", "pin-project-lite", ] @@ -2383,9 +2376,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.41" +version = "2.0.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c8b28c477cc3bf0e7966561e3460130e1255f7a1cf71931075f1c5e7a7e269" +checksum = "89456b690ff72fddcecf231caedbe615c59480c93358a93dfae7fc29e3ebbf0e" dependencies = [ "proc-macro2", "quote", @@ -2421,15 +2414,15 @@ checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" [[package]] name = "tempfile" -version = "3.8.1" +version = "3.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" +checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa" dependencies = [ "cfg-if", "fastrand 2.0.1", "redox_syscall", "rustix 0.38.28", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -2443,29 +2436,29 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.50" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" +checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.50" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" +checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.46", ] [[package]] name = "time" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" +checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e" dependencies = [ "deranged", "itoa", @@ -2485,9 +2478,9 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.15" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" +checksum = "26197e33420244aeb70c3e8c78376ca46571bc4e701e4791c2cd9f57dcb3a43f" dependencies = [ "time-core", ] @@ -2509,9 +2502,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.35.0" +version = "1.35.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d45b238a16291a4e1584e61820b8ae57d696cc5015c459c229ccc6990cc1c" +checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104" dependencies = [ "backtrace", "bytes", @@ -2531,7 +2524,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.46", ] [[package]] @@ -2558,15 +2551,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "toml" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" -dependencies = [ - "serde", -] - [[package]] name = "tower-service" version = "0.3.2" @@ -2593,7 +2577,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.46", ] [[package]] @@ -2607,9 +2591,9 @@ dependencies = [ [[package]] name = "trillium" -version = "0.2.11" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a924e0aeb1b4e0cb844cd57d9a8b81bea9cba1a0bdb323bd753920149089fe2" +checksum = "8b4a1ea726106cfe880370300042a8712b0911f30a63920597437c76cda47893" dependencies = [ "async-trait", "futures-lite 2.1.0", @@ -2632,9 +2616,9 @@ dependencies = [ [[package]] name = "trillium-askama" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace69c685aec173f963a8ab9cb44a0efb07519878c528d1863e78a153e31331c" +checksum = "2eee9fec08e885273a2cb989ccfdc525ad632cf01d82c3fb630a535a000a790f" dependencies = [ "askama", "mime-db", @@ -2643,9 +2627,9 @@ dependencies = [ [[package]] name = "trillium-http" -version = "0.3.6" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99e0cb5adb4dc9f3d8a53a6cb1c86372b7dfec0be46f252d38d09909b9ba578c" +checksum = "d9b5f80f30b6958cff1e0b5b8587c6e8d1fe2f7e6ba656ea1ef115f745f9106d" dependencies = [ "encoding_rs", "futures-lite 2.1.0", @@ -2665,12 +2649,11 @@ dependencies = [ [[package]] name = "trillium-logger" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50539be128242aa35f43fad99c5168a85739ba2696b0563319ecc036fbb16acc" +checksum = "8a0d5329a0826c06cd7d36a81928345d97ab5277dcc7d1d624335eb52fa22d1a" dependencies = [ "colored", - "is-terminal", "log", "size", "time", @@ -2679,20 +2662,20 @@ dependencies = [ [[package]] name = "trillium-macros" -version = "0.0.4" +version = "0.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d19bf7f37bc3e66beae9792c0f7a0e3500465cf431da63fdb6af593b0e353a4" +checksum = "916054381183f0cfed7604bf7de2044a760624a50d26eef5492468fb73083bbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.46", ] [[package]] name = "trillium-router" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a93cacd817bbd4e8308e5ca8223009e6de60198580d66a7fede1c022ceb16cd7" +checksum = "71daa9c919d4b4a7afae1a846fa2e60aad712e5b924936751630a880a84e9659" dependencies = [ "log", "routefinder", @@ -2701,13 +2684,13 @@ dependencies = [ [[package]] name = "trillium-server-common" -version = "0.4.5" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72bc41ffb1eb97c76f95b9684ce10fce6ba710d0322bd826b0480f00f3ddc98d" +checksum = "9b4f157b81051bb2630b6750d6583f648f545d241ef4b939781f4ad6a45fe700" dependencies = [ "async-trait", "async_cell", - "event-listener 3.1.0", + "event-listener 4.0.2", "futures-lite 2.1.0", "log", "pin-project-lite", @@ -2719,14 +2702,14 @@ dependencies = [ [[package]] name = "trillium-smol" -version = "0.3.1" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d1f9ba437ee34426dd36f01a91e59bf27656bf9e676d68b336d7b3e3932c3f5" +checksum = "91f9ca9fc22be687543ee24d23d9730f7370d57796adc2a2f2ccd9ce51b78199" dependencies = [ "async-global-executor", - "async-io 1.13.0", + "async-io 2.2.2", "async-net", - "futures-lite 1.13.0", + "futures-lite 2.1.0", "log", "signal-hook", "signal-hook-async-std", @@ -2734,6 +2717,7 @@ dependencies = [ "trillium-http", "trillium-macros", "trillium-server-common", + "url", ] [[package]] @@ -2927,7 +2911,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.46", "wasm-bindgen-shared", ] @@ -2961,7 +2945,7 @@ checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.46", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3163,20 +3147,20 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.31" +version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c4061bedbb353041c12f413700357bec76df2c7e2ca8e4df8bac24c6bf68e3d" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.31" +version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3c129550b3e6de3fd0ba67ba5c81818f9805e58b8d7fee80a3a59d2c9fc601a" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.41", + "syn 2.0.46", ] diff --git a/frameworks/Rust/trillium/Cargo.toml b/frameworks/Rust/trillium/Cargo.toml index b85b3848afd..031f0c2d032 100644 --- a/frameworks/Rust/trillium/Cargo.toml +++ b/frameworks/Rust/trillium/Cargo.toml @@ -7,24 +7,24 @@ edition = "2021" jemallocator = ["dep:jemallocator"] [dependencies] -askama = "0.11.1" +askama = "0.12.1" fastrand = "2.0.1" futures-lite = "2.1.0" -serde = { version = "1.0.193", features = ["derive"] } -serde_json = "1.0.108" -trillium = "0.2.11" +serde = { version = "1.0.194", features = ["derive"] } +serde_json = "1.0.110" +trillium = "0.2.13" trillium-api = "0.1.0" -trillium-askama = "0.3.0" -trillium-smol = "0.3.1" -trillium-logger = "0.4.3" -trillium-router = "0.3.5" +trillium-askama = "0.3.1" +trillium-smol = "0.3.3" +trillium-logger = "0.4.4" +trillium-router = "0.3.6" unicycle = "0.9.4" env_logger = "0.10.1" -moka = { version = "0.12.1", features = ["future"] } +moka = { version = "0.12.2", features = ["future"] } jemallocator = {version="0.5.4", optional = true} [dependencies.sea-orm] -version = "0.12.9" +version = "0.12.10" default-features = false features = ["runtime-async-std-native-tls", "sqlx-postgres", "macros"] diff --git a/frameworks/Rust/trillium/src/main.rs b/frameworks/Rust/trillium/src/main.rs index b7105c0ff8e..879a545e754 100644 --- a/frameworks/Rust/trillium/src/main.rs +++ b/frameworks/Rust/trillium/src/main.rs @@ -1,4 +1,4 @@ -#[cfg(feature = "jemallcator")] +#[cfg(feature = "jemallocator")] #[global_allocator] static ALLOC: jemallocator::Jemalloc = jemallocator::Jemalloc; From 6e4fa674519771a1833e792d5d69f0043e5bebf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Strehovsk=C3=BD?= Date: Fri, 5 Jan 2024 03:14:34 +0900 Subject: [PATCH 092/210] [CSharp] Add back AOT version of platform benchmarks (#8671) * Add back AOT version of platform benchmarks These were deleted in #8498 as "Kept for future PRs for simplicity" but the future is now. * Skip fortunes benchmark Looks like RazorSlices nuget got a lot worse between 0.3.0 and 0.7.0. --- .../aspnetcore/aspnetcore-aot.dockerfile | 17 ++++++++++++++ .../CSharp/aspnetcore/benchmark_config.json | 22 +++++++++++++++++++ frameworks/CSharp/aspnetcore/config.toml | 17 ++++++++++++++ .../Platform/BenchmarkApplication.Fortunes.cs | 2 ++ .../src/Platform/BenchmarkApplication.cs | 6 +++++ .../aspnetcore/src/Platform/Platform.csproj | 7 +++++- 6 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 frameworks/CSharp/aspnetcore/aspnetcore-aot.dockerfile diff --git a/frameworks/CSharp/aspnetcore/aspnetcore-aot.dockerfile b/frameworks/CSharp/aspnetcore/aspnetcore-aot.dockerfile new file mode 100644 index 00000000000..a114ee58727 --- /dev/null +++ b/frameworks/CSharp/aspnetcore/aspnetcore-aot.dockerfile @@ -0,0 +1,17 @@ +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +RUN apt-get update +RUN apt-get -yqq install clang zlib1g-dev +WORKDIR /app +COPY src/Platform . +RUN dotnet publish -c Release -o out /p:DatabaseProvider=Npgsql /p:PublishAot=true /p:OptimizationPreference=Speed /p:GarbageCollectionAdaptationMode=0 + +FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime +ENV URLS http://+:8080 + +WORKDIR /app +COPY --from=build /app/out ./ +COPY appsettings.postgresql.json ./appsettings.json + +EXPOSE 8080 + +ENTRYPOINT ["./Platform"] diff --git a/frameworks/CSharp/aspnetcore/benchmark_config.json b/frameworks/CSharp/aspnetcore/benchmark_config.json index c8452e6ddf0..426f94ea5f7 100644 --- a/frameworks/CSharp/aspnetcore/benchmark_config.json +++ b/frameworks/CSharp/aspnetcore/benchmark_config.json @@ -25,6 +25,28 @@ "display_name": "ASP.NET Core [Platform, Pg]", "notes": "" }, + "aot": { + "plaintext_url": "/plaintext", + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries/", + "update_url": "/updates/", + "cached_query_url": "/cached-worlds/", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "Postgres", + "framework": "ASP.NET Core", + "language": "C#", + "orm": "Raw", + "platform": ".NET", + "flavor": "NativeAOT", + "webserver": "Kestrel", + "os": "Linux", + "database_os": "Linux", + "display_name": "ASP.NET Core [Platform, Pg, AOT]", + "notes": "" + }, "minimal": { "plaintext_url": "/plaintext", "json_url": "/json", diff --git a/frameworks/CSharp/aspnetcore/config.toml b/frameworks/CSharp/aspnetcore/config.toml index 46fdecb59c6..9ba1398034c 100644 --- a/frameworks/CSharp/aspnetcore/config.toml +++ b/frameworks/CSharp/aspnetcore/config.toml @@ -19,6 +19,23 @@ platform = ".NET" webserver = "Kestrel" versus = "None" +[aot] +urls.plaintext = "/plaintext" +urls.json = "/json" +urls.db = "/db" +urls.query = "/queries/" +urls.update = "/updates/" +urls.cached_query = "/cached-worlds/" +approach = "Realistic" +classification = "Platform" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = ".NET" +webserver = "Kestrel" +versus = "None" + [minimal] urls.plaintext = "/plaintext" urls.json = "/json" diff --git a/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.Fortunes.cs b/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.Fortunes.cs index 5550be2c495..52a0939559c 100644 --- a/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.Fortunes.cs +++ b/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.Fortunes.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +#if !AOT using System.IO.Pipelines; using System.Runtime.CompilerServices; using System.Threading.Tasks; @@ -64,3 +65,4 @@ private static void EndTemplateRendering(ChunkedBufferWriter chun template.Dispose(); } } +#endif diff --git a/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.cs b/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.cs index 1d7810c2ebc..e256e958c75 100644 --- a/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.cs +++ b/frameworks/CSharp/aspnetcore/src/Platform/BenchmarkApplication.cs @@ -10,7 +10,9 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http; using Microsoft.Extensions.ObjectPool; +#if !AOT using RazorSlices; +#endif namespace PlatformBenchmarks { @@ -54,10 +56,12 @@ public bool Return(ChunkedBufferWriter writer) } } +#if !AOT #if NPGSQL private readonly static SliceFactory> FortunesTemplateFactory = RazorSlice.ResolveSliceFactory>("/Templates/FortunesUtf8.cshtml"); #else private readonly static SliceFactory> FortunesTemplateFactory = RazorSlice.ResolveSliceFactory>("/Templates/FortunesUtf16.cshtml"); +#endif #endif [ThreadStatic] @@ -163,7 +167,9 @@ private bool ProcessRequest(ref BufferWriter writer) private Task ProcessRequestAsync() => _requestType switch { +#if !AOT RequestType.FortunesRaw => FortunesRaw(Writer), +#endif RequestType.SingleQuery => SingleQuery(Writer), RequestType.Caching => Caching(Writer, _queries), RequestType.Updates => Updates(Writer, _queries), diff --git a/frameworks/CSharp/aspnetcore/src/Platform/Platform.csproj b/frameworks/CSharp/aspnetcore/src/Platform/Platform.csproj index 53a605ba86c..fb4d0bf7014 100644 --- a/frameworks/CSharp/aspnetcore/src/Platform/Platform.csproj +++ b/frameworks/CSharp/aspnetcore/src/Platform/Platform.csproj @@ -6,6 +6,7 @@ true preview 38063504-d08c-495a-89c9-daaad2f60f31 + AOT;$(DefineConstants) @@ -21,7 +22,11 @@ - + + + $(MSBuildThisFileDirectory)Templates/**;$(DefaultItemExcludes) + + From 9bb3a10d98de433f632d189372671bc2e8faf805 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Jan 2024 16:08:00 +0000 Subject: [PATCH 093/210] Bump puma from 6.3.1 to 6.4.2 in /frameworks/Ruby/rack Bumps [puma](https://github.com/puma/puma) from 6.3.1 to 6.4.2. - [Release notes](https://github.com/puma/puma/releases) - [Changelog](https://github.com/puma/puma/blob/master/History.md) - [Commits](https://github.com/puma/puma/compare/v6.3.1...v6.4.2) --- updated-dependencies: - dependency-name: puma dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Ruby/rack/Gemfile | 2 +- frameworks/Ruby/rack/Gemfile.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frameworks/Ruby/rack/Gemfile b/frameworks/Ruby/rack/Gemfile index d92ca804595..137e71e099c 100644 --- a/frameworks/Ruby/rack/Gemfile +++ b/frameworks/Ruby/rack/Gemfile @@ -9,7 +9,7 @@ gem 'jdbc-postgres', '~> 42.2', platforms: :jruby, require: 'jdbc/postgres' gem 'json', '~> 2.6', platforms: :jruby gem 'oj', '~> 3.14', platforms: %i[ruby mswin] gem 'pg', '~>1.5', platforms: %i[ruby mswin] -gem 'puma', '~> 6.3' +gem 'puma', '~> 6.4' gem 'sequel' gem 'sequel_pg', platforms: %i[ruby mswin] gem 'tzinfo-data', '1.2023.3' diff --git a/frameworks/Ruby/rack/Gemfile.lock b/frameworks/Ruby/rack/Gemfile.lock index a6c921d3e6c..159df8aa275 100644 --- a/frameworks/Ruby/rack/Gemfile.lock +++ b/frameworks/Ruby/rack/Gemfile.lock @@ -47,7 +47,7 @@ GEM kgio (2.11.4) localhost (1.1.10) mapping (1.1.1) - nio4r (2.5.9) + nio4r (2.7.0) oj (3.14.2) openssl (3.1.0) parallel (1.23.0) @@ -67,7 +67,7 @@ GEM protocol-rack (0.2.4) protocol-http (~> 0.23) rack (>= 1.0) - puma (6.3.1) + puma (6.4.2) nio4r (~> 2.0) rack (3.0.7) rack-test (2.1.0) @@ -118,7 +118,7 @@ DEPENDENCIES json (~> 2.6) oj (~> 3.14) pg (~> 1.5) - puma (~> 6.3) + puma (~> 6.4) rack (~> 3.0) rack-test rubocop From 439d19a03350f4361503463ec2a504c6afa988bd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Jan 2024 17:43:28 +0000 Subject: [PATCH 094/210] Bump jinja2 from 2.11.3 to 3.1.3 in /frameworks/Python/api_hour Bumps [jinja2](https://github.com/pallets/jinja) from 2.11.3 to 3.1.3. - [Release notes](https://github.com/pallets/jinja/releases) - [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst) - [Commits](https://github.com/pallets/jinja/compare/2.11.3...3.1.3) --- updated-dependencies: - dependency-name: jinja2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Python/api_hour/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/api_hour/requirements.txt b/frameworks/Python/api_hour/requirements.txt index 8fb8905ca36..65b3aa84965 100644 --- a/frameworks/Python/api_hour/requirements.txt +++ b/frameworks/Python/api_hour/requirements.txt @@ -6,7 +6,7 @@ asyncio-redis==0.13.4 chardet==2.3.0 gunicorn==19.9.0 hiredis==0.2.0 -Jinja2==2.11.3 +Jinja2==3.1.3 MarkupSafe==0.23 piprot==0.9.1 psycopg2==2.7.5 From e781e00828b6d50de4f37ebb7952fab88e7e17df Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Jan 2024 17:45:20 +0000 Subject: [PATCH 095/210] Bump jinja2 from 3.1.2 to 3.1.3 in /frameworks/Python/bareasgi Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.2 to 3.1.3. - [Release notes](https://github.com/pallets/jinja/releases) - [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst) - [Commits](https://github.com/pallets/jinja/compare/3.1.2...3.1.3) --- updated-dependencies: - dependency-name: jinja2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Python/bareasgi/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/bareasgi/requirements.txt b/frameworks/Python/bareasgi/requirements.txt index 4a81ab13c0a..18330880fea 100644 --- a/frameworks/Python/bareasgi/requirements.txt +++ b/frameworks/Python/bareasgi/requirements.txt @@ -8,7 +8,7 @@ hpack==4.0.0 hypercorn==0.14.3 hyperframe==6.0.1 jetblack-asgi-typing==0.4.0 -Jinja2==3.1.2 +Jinja2==3.1.3 MarkupSafe==2.1.1 orjson==3.8.0 priority==2.0.0 From 6706264eb994a4b72e218734f88f70d7a8057ea9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Jan 2024 18:46:10 +0000 Subject: [PATCH 096/210] Bump jinja2 from 3.0.1 to 3.1.3 in /frameworks/Python/routerling Bumps [jinja2](https://github.com/pallets/jinja) from 3.0.1 to 3.1.3. - [Release notes](https://github.com/pallets/jinja/releases) - [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst) - [Commits](https://github.com/pallets/jinja/compare/3.0.1...3.1.3) --- updated-dependencies: - dependency-name: jinja2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Python/routerling/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/routerling/requirements.txt b/frameworks/Python/routerling/requirements.txt index 7b68e45f102..4a11df1bc19 100644 --- a/frameworks/Python/routerling/requirements.txt +++ b/frameworks/Python/routerling/requirements.txt @@ -3,7 +3,7 @@ asyncpg==0.24.0 click==8.0.1 gunicorn==20.1.0 h11==0.12.0 -Jinja2==3.0.1 +Jinja2==3.1.3 MarkupSafe==2.0.1 routerling==0.3.1 ujson==5.4.0 From 18f9b66bcb4c590be81ee2c63ac16eca3f4feae4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Jan 2024 19:46:39 +0000 Subject: [PATCH 097/210] Bump jinja2 from 3.1.2 to 3.1.3 in /frameworks/Python/sanic Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.2 to 3.1.3. - [Release notes](https://github.com/pallets/jinja/releases) - [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst) - [Commits](https://github.com/pallets/jinja/compare/3.1.2...3.1.3) --- updated-dependencies: - dependency-name: jinja2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Python/sanic/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/sanic/requirements.txt b/frameworks/Python/sanic/requirements.txt index 36f8d2c8246..e118a108cc7 100644 --- a/frameworks/Python/sanic/requirements.txt +++ b/frameworks/Python/sanic/requirements.txt @@ -1,4 +1,4 @@ asyncpg==0.25.0 -Jinja2==3.1.2 +Jinja2==3.1.3 sanic==22.6.1 uvloop==0.16.0 From 17bea6ec07585b18d2fed426496599dc12d22e1b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Jan 2024 19:59:52 +0000 Subject: [PATCH 098/210] Bump jinja2 from 3.1.2 to 3.1.3 in /frameworks/Python/granian Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.2 to 3.1.3. - [Release notes](https://github.com/pallets/jinja/releases) - [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst) - [Commits](https://github.com/pallets/jinja/compare/3.1.2...3.1.3) --- updated-dependencies: - dependency-name: jinja2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Python/granian/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/granian/requirements.txt b/frameworks/Python/granian/requirements.txt index 601bdc3e401..68519dc8ae7 100644 --- a/frameworks/Python/granian/requirements.txt +++ b/frameworks/Python/granian/requirements.txt @@ -1,4 +1,4 @@ asyncpg==0.27.0 granian>=0.7.0,<0.8.0 -jinja2==3.1.2 +jinja2==3.1.3 orjson==3.9.10 From 1c996d31f6fbcbaae3e5bdfa5927d8c43ef29341 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Jan 2024 20:49:21 +0000 Subject: [PATCH 099/210] Bump jinja2 from 3.1.2 to 3.1.3 in /frameworks/Python/fastwsgi Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.2 to 3.1.3. - [Release notes](https://github.com/pallets/jinja/releases) - [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst) - [Commits](https://github.com/pallets/jinja/compare/3.1.2...3.1.3) --- updated-dependencies: - dependency-name: jinja2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Python/fastwsgi/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/fastwsgi/requirements.txt b/frameworks/Python/fastwsgi/requirements.txt index 8b326799874..6fb55802cfd 100644 --- a/frameworks/Python/fastwsgi/requirements.txt +++ b/frameworks/Python/fastwsgi/requirements.txt @@ -3,6 +3,6 @@ ujson==5.7.0 #fastwsgi==0.0.9 git+https://github.com/jamesroberts/fastwsgi.git@5572bb31b859d690be225707b9e7e25af397544b asyncpg==0.27.0 -Jinja2==3.1.2 +Jinja2==3.1.3 cachetools==5.3.0 asyncache==0.3.1 From ad063132a4168c75fa2c0a335c85574ca0cf644d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Jan 2024 21:09:36 +0000 Subject: [PATCH 100/210] Bump jinja2 from 3.1.2 to 3.1.3 in /frameworks/Python/uvicorn Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.2 to 3.1.3. - [Release notes](https://github.com/pallets/jinja/releases) - [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst) - [Commits](https://github.com/pallets/jinja/compare/3.1.2...3.1.3) --- updated-dependencies: - dependency-name: jinja2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Python/uvicorn/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/uvicorn/requirements.txt b/frameworks/Python/uvicorn/requirements.txt index b75fdec808c..91523ce5164 100644 --- a/frameworks/Python/uvicorn/requirements.txt +++ b/frameworks/Python/uvicorn/requirements.txt @@ -1,7 +1,7 @@ asyncpg==0.28.0 gunicorn==20.1.0 httptools==0.6.0 -Jinja2==3.1.2 +Jinja2==3.1.3 ujson==5.8.0 uvloop==0.17.0 uvicorn==0.22.0 From ab4027d1beb78ff87a433f50e4acc39a05f81eb0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 Jan 2024 12:32:18 -0800 Subject: [PATCH 101/210] Bump jinja2 from 3.1.2 to 3.1.3 in /frameworks/Python/fastapi (#8700) Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.2 to 3.1.3. - [Release notes](https://github.com/pallets/jinja/releases) - [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst) - [Commits](https://github.com/pallets/jinja/compare/3.1.2...3.1.3) --- updated-dependencies: - dependency-name: jinja2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Python/fastapi/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/fastapi/requirements.txt b/frameworks/Python/fastapi/requirements.txt index fb2fbfdbf25..4a3ed41bc6a 100644 --- a/frameworks/Python/fastapi/requirements.txt +++ b/frameworks/Python/fastapi/requirements.txt @@ -1,4 +1,4 @@ asyncpg==0.27.0 fastapi==0.93.0 -Jinja2==3.1.2 +Jinja2==3.1.3 ujson==5.7.0 From 732dca649ff1c43cda3bb89f533711cb11fac411 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 Jan 2024 12:32:52 -0800 Subject: [PATCH 102/210] Bump jinja2 from 3.1.2 to 3.1.3 in /frameworks/Python/starlette (#8698) Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.2 to 3.1.3. - [Release notes](https://github.com/pallets/jinja/releases) - [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst) - [Commits](https://github.com/pallets/jinja/compare/3.1.2...3.1.3) --- updated-dependencies: - dependency-name: jinja2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Python/starlette/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/starlette/requirements.txt b/frameworks/Python/starlette/requirements.txt index ec1b4acc589..1d9a9482ca9 100644 --- a/frameworks/Python/starlette/requirements.txt +++ b/frameworks/Python/starlette/requirements.txt @@ -2,7 +2,7 @@ asyncpg==0.26.0 gunicorn==20.1.0 httptools==0.5.0 idna==3.3 -Jinja2==3.1.2 +Jinja2==3.1.3 MarkupSafe==2.1.1 python-dotenv==0.20.0 PyYAML==6.0 From bd87696562f4162ed1d229367f283744f8dd33c7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 Jan 2024 12:33:02 -0800 Subject: [PATCH 103/210] Bump jinja2 from 3.1.2 to 3.1.3 in /frameworks/Python/quart (#8697) Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.2 to 3.1.3. - [Release notes](https://github.com/pallets/jinja/releases) - [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst) - [Commits](https://github.com/pallets/jinja/compare/3.1.2...3.1.3) --- updated-dependencies: - dependency-name: jinja2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Python/quart/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/quart/requirements.txt b/frameworks/Python/quart/requirements.txt index 7bb0976e5a0..9e99d39a225 100644 --- a/frameworks/Python/quart/requirements.txt +++ b/frameworks/Python/quart/requirements.txt @@ -8,7 +8,7 @@ hpack==4.0.0 hypercorn==0.14.2 hyperframe==6.0.1 itsdangerous==2.1.2 -Jinja2==3.1.2 +Jinja2==3.1.3 MarkupSafe==2.1.1 priority==2.0.0 quart==0.18.0 From bac341a63dc2dd7747f98fbcb01b5bd615e794a0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jan 2024 09:20:18 -0800 Subject: [PATCH 104/210] Bump jinja2 from 3.0.3 to 3.1.3 in /frameworks/Python/flask (#8695) Bumps [jinja2](https://github.com/pallets/jinja) from 3.0.3 to 3.1.3. - [Release notes](https://github.com/pallets/jinja/releases) - [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst) - [Commits](https://github.com/pallets/jinja/compare/3.0.3...3.1.3) --- updated-dependencies: - dependency-name: jinja2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Python/flask/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/flask/requirements.txt b/frameworks/Python/flask/requirements.txt index 2865cf8986a..a563bd2770b 100644 --- a/frameworks/Python/flask/requirements.txt +++ b/frameworks/Python/flask/requirements.txt @@ -6,7 +6,7 @@ psycopg2-binary==2.9.3; implementation_name=='cpython' psycopg2-pool==1.1; implementation_name=='cpython' psycopg2cffi==2.9.0; implementation_name=='pypy' itsdangerous==2.1.2 -Jinja2==3.0.3 +Jinja2==3.1.3 MarkupSafe==2.1.2 ujson==5.4.0 orjson==3.8.7; implementation_name=='cpython' From 73e77c75aaa147bdb52900a44886774a543c1936 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jan 2024 09:20:29 -0800 Subject: [PATCH 105/210] Bump jinja2 from 3.0.3 to 3.1.3 in /frameworks/Python/falcon (#8694) Bumps [jinja2](https://github.com/pallets/jinja) from 3.0.3 to 3.1.3. - [Release notes](https://github.com/pallets/jinja/releases) - [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst) - [Commits](https://github.com/pallets/jinja/compare/3.0.3...3.1.3) --- updated-dependencies: - dependency-name: jinja2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Python/falcon/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/falcon/requirements.txt b/frameworks/Python/falcon/requirements.txt index 4e7ea05ad81..81c0d6ee5de 100644 --- a/frameworks/Python/falcon/requirements.txt +++ b/frameworks/Python/falcon/requirements.txt @@ -1,2 +1,2 @@ falcon==3.1.1 -jinja2==3.0.3 +jinja2==3.1.3 From 4a08786c32300f5aa34be7e7930f404c52df950e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jan 2024 09:21:31 -0800 Subject: [PATCH 106/210] Bump jinja2 from 3.0.3 to 3.1.3 in /frameworks/Python/aiohttp (#8690) Bumps [jinja2](https://github.com/pallets/jinja) from 3.0.3 to 3.1.3. - [Release notes](https://github.com/pallets/jinja/releases) - [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst) - [Commits](https://github.com/pallets/jinja/compare/3.0.3...3.1.3) --- updated-dependencies: - dependency-name: jinja2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Python/aiohttp/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/aiohttp/requirements.txt b/frameworks/Python/aiohttp/requirements.txt index bb7f19ececa..840dbfccad5 100644 --- a/frameworks/Python/aiohttp/requirements.txt +++ b/frameworks/Python/aiohttp/requirements.txt @@ -2,7 +2,7 @@ aiohttp==3.9.0 asyncpg==0.25.0 cchardet==2.1.7 gunicorn==20.1 -jinja2==3.0.3 +jinja2==3.1.3 psycopg2==2.9.2 SQLAlchemy==1.4.29 ujson==5.4.0 From 0fc6456a3c9e8c4f31dac59e027b78950c28a750 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jan 2024 09:21:37 -0800 Subject: [PATCH 107/210] Bump jinja2 from 3.1.2 to 3.1.3 in /frameworks/Python/aioworkers (#8689) Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.2 to 3.1.3. - [Release notes](https://github.com/pallets/jinja/releases) - [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst) - [Commits](https://github.com/pallets/jinja/compare/3.1.2...3.1.3) --- updated-dependencies: - dependency-name: jinja2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Python/aioworkers/requirements-pg.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/aioworkers/requirements-pg.txt b/frameworks/Python/aioworkers/requirements-pg.txt index 248c5419654..4a399de7759 100644 --- a/frameworks/Python/aioworkers/requirements-pg.txt +++ b/frameworks/Python/aioworkers/requirements-pg.txt @@ -2,4 +2,4 @@ uvloop==0.17.0 asyncpg==0.27.0 aioworkers-pg==0.2.0 -Jinja2==3.1.2 +Jinja2==3.1.3 From beb30d31c895b4a42f8936ced6fac5af57dc170e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jan 2024 09:21:42 -0800 Subject: [PATCH 108/210] Bump jinja2 from 3.0.3 to 3.1.3 in /frameworks/Python/apidaora (#8688) Bumps [jinja2](https://github.com/pallets/jinja) from 3.0.3 to 3.1.3. - [Release notes](https://github.com/pallets/jinja/releases) - [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst) - [Commits](https://github.com/pallets/jinja/compare/3.0.3...3.1.3) --- updated-dependencies: - dependency-name: jinja2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Python/apidaora/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/apidaora/requirements.txt b/frameworks/Python/apidaora/requirements.txt index 90e4dfac0b7..65f2f5c9b50 100644 --- a/frameworks/Python/apidaora/requirements.txt +++ b/frameworks/Python/apidaora/requirements.txt @@ -1,6 +1,6 @@ asyncpg==0.21.0 gunicorn==20.0.4 -jinja2==3.0.3 +jinja2==3.1.3 uvloop==0.14.0 uvicorn==0.11.7 apidaora==0.26.0 From c4e2e7e7d29f0a9a4e6781cba1ea01352faf1883 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jan 2024 09:21:47 -0800 Subject: [PATCH 109/210] Bump jinja2 from 3.1.2 to 3.1.3 in /frameworks/Python/blacksheep (#8687) Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.2 to 3.1.3. - [Release notes](https://github.com/pallets/jinja/releases) - [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst) - [Commits](https://github.com/pallets/jinja/compare/3.1.2...3.1.3) --- updated-dependencies: - dependency-name: jinja2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Python/blacksheep/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/blacksheep/requirements.txt b/frameworks/Python/blacksheep/requirements.txt index c1a8d3d22a3..2965fca87aa 100644 --- a/frameworks/Python/blacksheep/requirements.txt +++ b/frameworks/Python/blacksheep/requirements.txt @@ -1,4 +1,4 @@ asyncpg==0.27.0 -Jinja2==3.1.2 +Jinja2==3.1.3 blacksheep==1.2.13 ujson==5.7.0 From 0bce4160a925b9015978b880a603d6323f1de243 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jan 2024 09:22:07 -0800 Subject: [PATCH 110/210] Bump jinja2 from 2.11.3 to 3.1.3 in /frameworks/Python/responder (#8685) Bumps [jinja2](https://github.com/pallets/jinja) from 2.11.3 to 3.1.3. - [Release notes](https://github.com/pallets/jinja/releases) - [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst) - [Commits](https://github.com/pallets/jinja/compare/2.11.3...3.1.3) --- updated-dependencies: - dependency-name: jinja2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Python/responder/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/responder/requirements.txt b/frameworks/Python/responder/requirements.txt index 12b381c6b2f..79f0a4304ce 100644 --- a/frameworks/Python/responder/requirements.txt +++ b/frameworks/Python/responder/requirements.txt @@ -1,6 +1,6 @@ asyncpg==0.21.0 gunicorn==20.0.4 -Jinja2==2.11.3 +Jinja2==3.1.3 ujson==2.0.3 uvloop==0.17.0 httptools==0.5.0 From 4325dbbf564963c6444a316351b40b195eaa3458 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 15 Jan 2024 18:22:33 +0100 Subject: [PATCH 111/210] [php] React fix deprecation (#8681) --- frameworks/PHP/reactphp/app.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/PHP/reactphp/app.php b/frameworks/PHP/reactphp/app.php index c159b59204f..4f9dd816652 100644 --- a/frameworks/PHP/reactphp/app.php +++ b/frameworks/PHP/reactphp/app.php @@ -134,7 +134,7 @@ function fortune(Closure $fortune): PromiseInterface foreach ($rows as $row) { $message = htmlspecialchars($row['message'], ENT_QUOTES, 'UTF-8'); - $html .= "${row['id']}${message}"; + $html .= "{$row['id']}{$message}"; } return "Fortunes$html
idmessage
"; From 101e4fbdf10d07d71eba0a4e08b6900fe8fa3c82 Mon Sep 17 00:00:00 2001 From: Nikolay Kim Date: Mon, 15 Jan 2024 23:22:44 +0600 Subject: [PATCH 112/210] ntex: upgrade to ntex-1.0 (#8680) --- frameworks/Rust/ntex/Cargo.toml | 8 +-- frameworks/Rust/ntex/src/main.rs | 4 +- frameworks/Rust/ntex/src/main_db.rs | 94 ++++++++++++++--------------- 3 files changed, 53 insertions(+), 53 deletions(-) diff --git a/frameworks/Rust/ntex/Cargo.toml b/frameworks/Rust/ntex/Cargo.toml index f14828040f7..b1aff0f6435 100755 --- a/frameworks/Rust/ntex/Cargo.toml +++ b/frameworks/Rust/ntex/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "ntex" -version = "0.7.0" +version = "1.0.0" edition = "2018" [[bin]] @@ -37,8 +37,8 @@ tokio = ["ntex/tokio"] async-std = ["ntex/async-std"] [dependencies] -ntex = "0.7.2" -ntex-bytes = { version = "0.1.19", features=["simd"] } +ntex = "1.0.0" +ntex-bytes = { version = "0.1.21", features=["simd"] } mimalloc = { version = "0.1.25", default-features = false } snmalloc-rs = { version = "0.3.3", features = ["native-cpu"] } yarte = { version = "0.15", features = ["bytes-buf", "json"] } @@ -52,7 +52,7 @@ serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" log = { version = "0.4", features = ["release_max_level_off"] } tok_io = {version = "1", package = "tokio" } -tokio-postgres = { git="https://github.com/fafhrd91/postgres.git" } +tokio-postgres = { git="https://github.com/fafhrd91/postgres.git", branch="ntex-1.0" } [profile.release] opt-level = 3 diff --git a/frameworks/Rust/ntex/src/main.rs b/frameworks/Rust/ntex/src/main.rs index c9220d83247..c9fd1e80245 100644 --- a/frameworks/Rust/ntex/src/main.rs +++ b/frameworks/Rust/ntex/src/main.rs @@ -55,7 +55,9 @@ async fn main() -> std::io::Result<()> { http::HttpService::build() .keep_alive(http::KeepAlive::Os) - .client_timeout(Seconds(0)) + .client_timeout(Seconds::ZERO) + .headers_read_rate(Seconds::ZERO, Seconds::ZERO, 0) + .payload_read_rate(Seconds::ZERO, Seconds::ZERO, 0) .h1(web::App::new().service(json).service(plaintext).finish()) })? .workers(num_cpus::get()) diff --git a/frameworks/Rust/ntex/src/main_db.rs b/frameworks/Rust/ntex/src/main_db.rs index 8354a41fd21..437fd70b9e1 100644 --- a/frameworks/Rust/ntex/src/main_db.rs +++ b/frameworks/Rust/ntex/src/main_db.rs @@ -7,7 +7,7 @@ use ntex::http::header::{CONTENT_TYPE, SERVER}; use ntex::http::{HttpService, KeepAlive, Request, Response, StatusCode}; use ntex::service::{Service, ServiceCtx, ServiceFactory}; use ntex::web::{Error, HttpResponse}; -use ntex::{time::Seconds, util::BoxFuture, util::PoolId}; +use ntex::{time::Seconds, util::PoolId}; mod db; mod utils; @@ -17,52 +17,49 @@ struct App(db::PgConnection); impl Service for App { type Response = Response; type Error = Error; - type Future<'f> = BoxFuture<'f, Result> where Self: 'f; - fn call<'a>(&'a self, req: Request, _: ServiceCtx<'a, Self>) -> Self::Future<'a> { - Box::pin(async move { - match req.path() { - "/db" => { - let body = self.0.get_world().await; - let mut res = HttpResponse::with_body(StatusCode::OK, body.into()); - res.headers_mut().insert(SERVER, utils::HDR_SERVER); - res.headers_mut() - .insert(CONTENT_TYPE, utils::HDR_JSON_CONTENT_TYPE); - Ok(res) - } - "/fortunes" => { - let body = self.0.tell_fortune().await; - let mut res = HttpResponse::with_body(StatusCode::OK, body.into()); - res.headers_mut().insert(SERVER, utils::HDR_SERVER); - res.headers_mut() - .insert(CONTENT_TYPE, utils::HDR_HTML_CONTENT_TYPE); - Ok(res) - } - "/query" => { - let worlds = self - .0 - .get_worlds(utils::get_query_param(req.uri().query())) - .await; - let mut res = HttpResponse::with_body(StatusCode::OK, worlds.into()); - res.headers_mut().insert(SERVER, utils::HDR_SERVER); - res.headers_mut() - .insert(CONTENT_TYPE, utils::HDR_JSON_CONTENT_TYPE); - Ok(res) - } - "/update" => { - let worlds = self - .0 - .update(utils::get_query_param(req.uri().query())) - .await; - let mut res = HttpResponse::with_body(StatusCode::OK, worlds.into()); - res.headers_mut().insert(SERVER, utils::HDR_SERVER); - res.headers_mut() - .insert(CONTENT_TYPE, utils::HDR_JSON_CONTENT_TYPE); - Ok(res) - } - _ => Ok(Response::new(StatusCode::NOT_FOUND)), + async fn call(&self, req: Request, _: ServiceCtx<'_, Self>) -> Result { + match req.path() { + "/db" => { + let body = self.0.get_world().await; + let mut res = HttpResponse::with_body(StatusCode::OK, body.into()); + res.headers_mut().insert(SERVER, utils::HDR_SERVER); + res.headers_mut() + .insert(CONTENT_TYPE, utils::HDR_JSON_CONTENT_TYPE); + Ok(res) } - }) + "/fortunes" => { + let body = self.0.tell_fortune().await; + let mut res = HttpResponse::with_body(StatusCode::OK, body.into()); + res.headers_mut().insert(SERVER, utils::HDR_SERVER); + res.headers_mut() + .insert(CONTENT_TYPE, utils::HDR_HTML_CONTENT_TYPE); + Ok(res) + } + "/query" => { + let worlds = self + .0 + .get_worlds(utils::get_query_param(req.uri().query())) + .await; + let mut res = HttpResponse::with_body(StatusCode::OK, worlds.into()); + res.headers_mut().insert(SERVER, utils::HDR_SERVER); + res.headers_mut() + .insert(CONTENT_TYPE, utils::HDR_JSON_CONTENT_TYPE); + Ok(res) + } + "/update" => { + let worlds = self + .0 + .update(utils::get_query_param(req.uri().query())) + .await; + let mut res = HttpResponse::with_body(StatusCode::OK, worlds.into()); + res.headers_mut().insert(SERVER, utils::HDR_SERVER); + res.headers_mut() + .insert(CONTENT_TYPE, utils::HDR_JSON_CONTENT_TYPE); + Ok(res) + } + _ => Ok(Response::new(StatusCode::NOT_FOUND)), + } } } @@ -73,13 +70,12 @@ impl ServiceFactory for AppFactory { type Error = Error; type Service = App; type InitError = (); - type Future<'f> = BoxFuture<'f, Result>; - fn create(&self, _: ()) -> Self::Future<'_> { + async fn create(&self, _: ()) -> Result { const DB_URL: &str = "postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world"; - Box::pin(async move { Ok(App(db::PgConnection::connect(DB_URL).await)) }) + Ok(App(db::PgConnection::connect(DB_URL).await)) } } @@ -97,6 +93,8 @@ async fn main() -> std::io::Result<()> { HttpService::build() .keep_alive(KeepAlive::Os) .client_timeout(Seconds(0)) + .headers_read_rate(Seconds::ZERO, Seconds::ZERO, 0) + .payload_read_rate(Seconds::ZERO, Seconds::ZERO, 0) .h1(AppFactory) })? .workers(num_cpus::get()) From 2b8ca853c7c7afb9be3dcfcace9125d520c4027b Mon Sep 17 00:00:00 2001 From: Petrik de Heus Date: Mon, 15 Jan 2024 18:23:08 +0100 Subject: [PATCH 113/210] [ruby/roda] Remove unused JRuby code (#8674) JRuby is no longer tested. We can remove the specific code for it. --- frameworks/Ruby/roda-sequel/README.md | 4 +--- frameworks/Ruby/roda-sequel/boot.rb | 13 ++----------- .../Ruby/roda-sequel/config/java_tune.sh | 18 ------------------ 3 files changed, 3 insertions(+), 32 deletions(-) delete mode 100644 frameworks/Ruby/roda-sequel/config/java_tune.sh diff --git a/frameworks/Ruby/roda-sequel/README.md b/frameworks/Ruby/roda-sequel/README.md index 821d0fbeb6a..1ca9c7b55a9 100644 --- a/frameworks/Ruby/roda-sequel/README.md +++ b/frameworks/Ruby/roda-sequel/README.md @@ -13,9 +13,7 @@ comparing a variety of web platforms. The tests will be run with: * [Ruby 3.3](http://www.ruby-lang.org) -* [JRuby 9.1](http://jruby.org) -* [Rubinius 3](https://rubinius.com)\* -* [Puma 3](http://puma.io) +* [Puma 6](http://puma.io) * [Passenger 5](https://www.phusionpassenger.com) * [Unicorn 5](https://bogomips.org/unicorn/) * [Roda 3](http://roda.jeremyevans.net) diff --git a/frameworks/Ruby/roda-sequel/boot.rb b/frameworks/Ruby/roda-sequel/boot.rb index f9026ae794b..44e64ce917c 100644 --- a/frameworks/Ruby/roda-sequel/boot.rb +++ b/frameworks/Ruby/roda-sequel/boot.rb @@ -29,11 +29,9 @@ def connect(dbtype) adapters = { mysql: { - jruby: "jdbc:mysql", mri: "mysql2" }, postgresql: { - jruby: "jdbc:postgresql", mri: "postgres" } } @@ -41,12 +39,7 @@ def connect(dbtype) opts = {} # Determine threading/thread pool size and timeout - if defined?(JRUBY_VERSION) - opts[:max_connections] = ( - 2 * Math.log(Integer(ENV.fetch("MAX_CONCURRENCY"))) - ).floor - opts[:pool_timeout] = 10 - elsif defined?(Puma) && + if defined?(Puma) && (threads = Puma.cli_config.options.fetch(:max_threads)) > 1 opts[:max_connections] = (2 * Math.log(threads)).floor opts[:pool_timeout] = 10 @@ -57,9 +50,7 @@ def connect(dbtype) Sequel.connect "%{adapter}://%{host}/%{database}?user=%{user}&password=%{password}" % { adapter: - adapters.fetch(dbtype).fetch( - defined?(JRUBY_VERSION) ? :jruby : :mri - ), + adapters.fetch(dbtype).fetch(:mri), host: "tfb-database", database: "hello_world", user: "benchmarkdbuser", diff --git a/frameworks/Ruby/roda-sequel/config/java_tune.sh b/frameworks/Ruby/roda-sequel/config/java_tune.sh deleted file mode 100644 index 412b1e74fdc..00000000000 --- a/frameworks/Ruby/roda-sequel/config/java_tune.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/sh -stack_size=1 -cache_size=240 -meta_size=192 -avail_mem=$(awk '/^MemAvailable/ { print int(0.6 * $2 / 1024); exit }' /proc/meminfo) -heap_size=$(( avail_mem - meta_size - cache_size - (stack_size * MAX_CONCURRENCY * THREAD_FACTOR) )) - -JRUBY_OPTS="-J-server -J-XX:+AggressiveOpts -J-Djava.net.preferIPv4Stack=true" -#JRUBY_OPTS="$JRUBY_OPTS -J-XX:+UseSerialGC" -JRUBY_OPTS="$JRUBY_OPTS -J-XX:+CMSClassUnloadingEnabled -J-XX:+UseConcMarkSweepGC" -#JRUBY_OPTS="$JRUBY_OPTS -J-XX:+UseG1GC -J-XX:+UseStringDeduplication" -JRUBY_OPTS="$JRUBY_OPTS -J-Xms${heap_size}m -J-Xmx${heap_size}m" -JRUBY_OPTS="$JRUBY_OPTS -J-Xss${stack_size}m" -JRUBY_OPTS="$JRUBY_OPTS -J-XX:MaxMetaspaceSize=${meta_size}m" -JRUBY_OPTS="$JRUBY_OPTS -J-XX:ReservedCodeCacheSize=${cache_size}m" -JRUBY_OPTS="$JRUBY_OPTS -Xcompile.invokedynamic=true -J-XX:+UseNUMA -J-XX:+AlwaysPreTouch" - -export JRUBY_OPTS From 0d27d26d86ebc53620a776e527d700335f21efc3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Jan 2024 09:23:22 -0800 Subject: [PATCH 114/210] Bump puma from 6.4.0 to 6.4.2 in /frameworks/Ruby/rails (#8677) Bumps [puma](https://github.com/puma/puma) from 6.4.0 to 6.4.2. - [Release notes](https://github.com/puma/puma/releases) - [Changelog](https://github.com/puma/puma/blob/master/History.md) - [Commits](https://github.com/puma/puma/compare/v6.4.0...v6.4.2) --- updated-dependencies: - dependency-name: puma dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Ruby/rails/Gemfile.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Ruby/rails/Gemfile.lock b/frameworks/Ruby/rails/Gemfile.lock index b14e081c818..581abdd9c06 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -114,7 +114,7 @@ GEM timeout net-smtp (0.4.0) net-protocol - nio4r (2.5.9) + nio4r (2.7.0) nokogiri (1.15.4) mini_portile2 (~> 2.8.2) racc (~> 1.4) @@ -126,7 +126,7 @@ GEM pg (1.5.4) psych (5.1.0) stringio - puma (6.4.0) + puma (6.4.2) nio4r (~> 2.0) racc (1.7.1) rack (3.0.8) From 0bd20bb0e32738fc40a2efc1c8807a90e55f0bb3 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Mon, 15 Jan 2024 18:23:35 +0100 Subject: [PATCH 115/210] [php] Workerman update libevent to v3.1.1 (#8672) --- frameworks/PHP/workerman/workerman-async.dockerfile | 2 +- frameworks/PHP/workerman/workerman-pgsql.dockerfile | 2 +- frameworks/PHP/workerman/workerman-php8-jit.dockerfile | 2 +- frameworks/PHP/workerman/workerman.dockerfile | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frameworks/PHP/workerman/workerman-async.dockerfile b/frameworks/PHP/workerman/workerman-async.dockerfile index 3539a1e8e7a..4228e2adf98 100644 --- a/frameworks/PHP/workerman/workerman-async.dockerfile +++ b/frameworks/PHP/workerman/workerman-async.dockerfile @@ -11,7 +11,7 @@ RUN apt-get install -yqq php8.3-cli php8.3-mysql > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer RUN apt-get install -y php-pear php8.3-dev php8.3-xml libevent-dev git > /dev/null -RUN pecl install event-3.1.0RC1 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini +RUN pecl install event-3.1.1 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini COPY php.ini /etc/php/8.3/cli/php.ini diff --git a/frameworks/PHP/workerman/workerman-pgsql.dockerfile b/frameworks/PHP/workerman/workerman-pgsql.dockerfile index 0d3cddcc037..f131163c93c 100644 --- a/frameworks/PHP/workerman/workerman-pgsql.dockerfile +++ b/frameworks/PHP/workerman/workerman-pgsql.dockerfile @@ -10,7 +10,7 @@ RUN apt-get install -yqq php8.3-cli php8.3-pgsql php8.3-xml > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null -RUN pecl install event-3.1.0RC1 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini +RUN pecl install event-3.1.1 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini COPY php.ini /etc/php/8.3/cli/php.ini diff --git a/frameworks/PHP/workerman/workerman-php8-jit.dockerfile b/frameworks/PHP/workerman/workerman-php8-jit.dockerfile index 46a12fe4cbd..194a2e8817d 100644 --- a/frameworks/PHP/workerman/workerman-php8-jit.dockerfile +++ b/frameworks/PHP/workerman/workerman-php8-jit.dockerfile @@ -11,7 +11,7 @@ RUN apt-get install -yqq php8.3-cli php8.3-pgsql php8.3-xml > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null -RUN pecl install event-3.1.0RC1 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini +RUN pecl install event-3.1.1 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini COPY php-jit.ini /etc/php/8.3/cli/php.ini diff --git a/frameworks/PHP/workerman/workerman.dockerfile b/frameworks/PHP/workerman/workerman.dockerfile index 154322d30dc..36abb360fc1 100644 --- a/frameworks/PHP/workerman/workerman.dockerfile +++ b/frameworks/PHP/workerman/workerman.dockerfile @@ -11,7 +11,7 @@ RUN apt-get install -yqq php8.3-cli php8.3-mysql php8.3-xml > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer RUN apt-get install -y php-pear php8.3-dev libevent-dev git > /dev/null -RUN pecl install event-3.1.0RC1 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini +RUN pecl install event-3.1.1 > /dev/null && echo "extension=event.so" > /etc/php/8.3/cli/conf.d/event.ini COPY php-jit.ini /etc/php/8.3/cli/php.ini From 2638fd96067b71f7ff3996fa901f7cfe4b5aa711 Mon Sep 17 00:00:00 2001 From: Gabriel Scatolin <17441745+CypherPotato@users.noreply.github.com> Date: Mon, 15 Jan 2024 14:24:18 -0300 Subject: [PATCH 116/210] Add Sisk (#8665) * Add Sisk * upgrade sisk version --- frameworks/CSharp/sisk/.gitignore | 39 ++++++++++++++++++++ frameworks/CSharp/sisk/README.md | 18 +++++++++ frameworks/CSharp/sisk/benchmark_config.json | 21 +++++++++++ frameworks/CSharp/sisk/config.toml | 15 ++++++++ frameworks/CSharp/sisk/sisk.dockerfile | 19 ++++++++++ frameworks/CSharp/sisk/sisk/Program.cs | 26 +++++++++++++ frameworks/CSharp/sisk/sisk/sisk.csproj | 15 ++++++++ 7 files changed, 153 insertions(+) create mode 100644 frameworks/CSharp/sisk/.gitignore create mode 100644 frameworks/CSharp/sisk/README.md create mode 100644 frameworks/CSharp/sisk/benchmark_config.json create mode 100644 frameworks/CSharp/sisk/config.toml create mode 100644 frameworks/CSharp/sisk/sisk.dockerfile create mode 100644 frameworks/CSharp/sisk/sisk/Program.cs create mode 100644 frameworks/CSharp/sisk/sisk/sisk.csproj diff --git a/frameworks/CSharp/sisk/.gitignore b/frameworks/CSharp/sisk/.gitignore new file mode 100644 index 00000000000..df5d0dc676b --- /dev/null +++ b/frameworks/CSharp/sisk/.gitignore @@ -0,0 +1,39 @@ +[Oo]bj/ +[Bb]in/ +TestResults/ +.nuget/ +*.sln +*.sln.ide/ +_ReSharper.*/ +.idea/ +packages/ +artifacts/ +PublishProfiles/ +*.sln +.vs/ +*.user +*.suo +*.cache +*.docstates +_ReSharper.* +nuget.exe +*net45.csproj +*net451.csproj +*k10.csproj +*.psess +*.vsp +*.pidb +*.userprefs +*DS_Store +*.ncrunchsolution +*.*sdf +*.ipch +*.swp +*~ +.build/ +.testPublish/ +launchSettings.json +BenchmarkDotNet.Artifacts/ +BDN.Generated/ +binaries/ +global.json diff --git a/frameworks/CSharp/sisk/README.md b/frameworks/CSharp/sisk/README.md new file mode 100644 index 00000000000..1ecb09ce930 --- /dev/null +++ b/frameworks/CSharp/sisk/README.md @@ -0,0 +1,18 @@ +# Sisk benchmark + +See the [Sisk Framework website](https://sisk.project-principium.dev/) for more information. + +## Infrastructure Software Versions + +**Language** + +* C# 11.0 + +**Platforms** + +* .NET Core + +## Paths & Source for Tests + +* [Plaintext](sisk/Program.cs): "/plaintext" +* [JSON](sisk/Program.cs): "/json" \ No newline at end of file diff --git a/frameworks/CSharp/sisk/benchmark_config.json b/frameworks/CSharp/sisk/benchmark_config.json new file mode 100644 index 00000000000..b2cc682ac22 --- /dev/null +++ b/frameworks/CSharp/sisk/benchmark_config.json @@ -0,0 +1,21 @@ +{ + "framework": "sisk", + "tests": [{ + "default": { + "plaintext_url": "/plaintext", + "json_url": "/json", + "port": 8080, + "approach": "Realistic", + "classification": "Fullstack", + "database": "None", + "framework": "Sisk", + "language": "C#", + "orm": "Raw", + "platform": ".NET", + "webserver": "Sisk", + "os": "Linux", + "database_os": "Linux", + "display_name": "Sisk Framework" + } + }] +} diff --git a/frameworks/CSharp/sisk/config.toml b/frameworks/CSharp/sisk/config.toml new file mode 100644 index 00000000000..25d9855ea65 --- /dev/null +++ b/frameworks/CSharp/sisk/config.toml @@ -0,0 +1,15 @@ +[framework] +name = "sisk" + +[main] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Fullstack" +database = "None" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = ".NET" +webserver = "Sisk" +versus = "None" diff --git a/frameworks/CSharp/sisk/sisk.dockerfile b/frameworks/CSharp/sisk/sisk.dockerfile new file mode 100644 index 00000000000..2a23e04743f --- /dev/null +++ b/frameworks/CSharp/sisk/sisk.dockerfile @@ -0,0 +1,19 @@ +FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +WORKDIR /source + +# copy csproj and restore as distinct layers +COPY sisk/*.csproj . +RUN dotnet restore -r linux-musl-x64 + +# copy and publish app and libraries +COPY sisk/ . +RUN dotnet publish -c release -o /app -r linux-musl-x64 + +# final stage/image +FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS runtime +WORKDIR /app +COPY --from=build /app . + +ENTRYPOINT ["dotnet", "./sisk.dll"] + +EXPOSE 8080 \ No newline at end of file diff --git a/frameworks/CSharp/sisk/sisk/Program.cs b/frameworks/CSharp/sisk/sisk/Program.cs new file mode 100644 index 00000000000..de5c69d1670 --- /dev/null +++ b/frameworks/CSharp/sisk/sisk/Program.cs @@ -0,0 +1,26 @@ +using Sisk.Core.Http; +using Sisk.Core.Routing; +using System.Net.Http.Json; + +var app = HttpServer.CreateBuilder(host => +{ + host.UseListeningPort("http://+:8080/"); +}); + +app.Router.SetRoute(RouteMethod.Get, "/plaintext", PlainText); +app.Router.SetRoute(RouteMethod.Get, "/json", Json); + +app.Start(); + +static HttpResponse PlainText(HttpRequest request) +{ + return new HttpResponse().WithContent("Hello, world!"); +} + +static HttpResponse Json(HttpRequest request) +{ + return new HttpResponse().WithContent(JsonContent.Create(new + { + message = "Hello, world!" + })); +} \ No newline at end of file diff --git a/frameworks/CSharp/sisk/sisk/sisk.csproj b/frameworks/CSharp/sisk/sisk/sisk.csproj new file mode 100644 index 00000000000..624dd50d4a3 --- /dev/null +++ b/frameworks/CSharp/sisk/sisk/sisk.csproj @@ -0,0 +1,15 @@ + + + + Exe + net8.0 + enable + enable + true + + + + + + + From 4dfb9e0f9a493df1fcec7ad89d81da0ea03aa825 Mon Sep 17 00:00:00 2001 From: Ali RajabNezhad Date: Mon, 15 Jan 2024 20:56:01 +0330 Subject: [PATCH 117/210] Add Panther (#8636) --- frameworks/Python/panther/README.md | 36 +++++ frameworks/Python/panther/app.py | 132 ++++++++++++++++++ .../Python/panther/benchmark_config.json | 28 ++++ frameworks/Python/panther/config.toml | 19 +++ frameworks/Python/panther/panther.dockerfile | 12 ++ frameworks/Python/panther/panther_conf.py | 14 ++ frameworks/Python/panther/requirements.txt | 11 ++ .../Python/panther/templates/fortune.html | 14 ++ 8 files changed, 266 insertions(+) create mode 100644 frameworks/Python/panther/README.md create mode 100644 frameworks/Python/panther/app.py create mode 100644 frameworks/Python/panther/benchmark_config.json create mode 100644 frameworks/Python/panther/config.toml create mode 100644 frameworks/Python/panther/panther.dockerfile create mode 100644 frameworks/Python/panther/panther_conf.py create mode 100644 frameworks/Python/panther/requirements.txt create mode 100644 frameworks/Python/panther/templates/fortune.html diff --git a/frameworks/Python/panther/README.md b/frameworks/Python/panther/README.md new file mode 100644 index 00000000000..c1edfd4f5b7 --- /dev/null +++ b/frameworks/Python/panther/README.md @@ -0,0 +1,36 @@ +# Panther Benchmark Test + +This is the Panther portion of a [benchmarking tests suite](../../) +comparing a variety of web development platforms. + +The information below is specific to Panther. For further guidance, +review the [documentation](https://github.com/TechEmpower/FrameworkBenchmarks/wiki). +Also note that there is additional information provided in +the [Python README](../). + +## Description + +[Panther](https://pantherpy.github.io/) Is A Fast & Friendly Web Framework For Building Async APIs With Python 3.10+ +

+ logo +

+ + +## Implementation + +All tests are implemented in a single file ([app.py](app.py)). + +* [JSON](app.py): "/json" +* [DB](app.py): "/db" +* [QUERY](app.py): "/queries?=#"* +* [FORTUNES](app.py): "/fortunes" +* [UPDATE](app.py): "/updates?queries=#"* +* [Plaintext](app.py): "/plaintext" + +*Replace # with an actual number. + +## Resources + +* [GitHub](https://github.com/AliRn76/Panther) +* [Documentation](https://pantherpy.github.io) +* [PyPI](https://pypi.org/project/panther) diff --git a/frameworks/Python/panther/app.py b/frameworks/Python/panther/app.py new file mode 100644 index 00000000000..b3f712cd979 --- /dev/null +++ b/frameworks/Python/panther/app.py @@ -0,0 +1,132 @@ +import multiprocessing +import os +from random import randint, sample + +import asyncpg +import jinja2 +from panther import Panther +from panther.app import API +from panther.request import Request +from panther.response import Response, PlainTextResponse, HTMLResponse + +READ_ROW_SQL = 'SELECT "id", "randomnumber" FROM "world" WHERE id = $1' +WRITE_ROW_SQL = 'UPDATE "world" SET "randomnumber"=$1 WHERE id=$2' +ADDITIONAL_ROW = [0, 'Additional fortune added at request time.'] +MAX_POOL_SIZE = 1000 // multiprocessing.cpu_count() +MIN_POOL_SIZE = max(int(MAX_POOL_SIZE / 2), 1) + +pool = None + + +async def create_db_pool(): + global pool + pool = await asyncpg.create_pool( + user='benchmarkdbuser', + password='benchmarkdbpass', + database='hello_world', + host='tfb-database', + port=5432, + min_size=MIN_POOL_SIZE, + max_size=MAX_POOL_SIZE, + ) + + +async def clean_db_pool(): + await pool.close() + + +def load_fortunes_template(): + path = os.path.join('templates', 'fortune.html') + with open(path, 'r') as template_file: + template_text = template_file.read() + return jinja2.Template(template_text) + + +fortune_template = load_fortunes_template() + + +def get_num_queries(request): + value = request.query_params.get('queries') + if value is None: + return 1 + + try: + query_count = int(value) + except ValueError: + return 1 + if query_count < 1: + return 1 + if query_count > 500: + return 500 + return query_count + + +@API() +async def json_serialization(): + return Response(data={'message': 'Hello, world!'}) + + +@API() +async def single_database_query(): + row_id = randint(1, 10000) + async with pool.acquire() as connection: + number = await connection.fetchval(READ_ROW_SQL, row_id) + return Response(data={'id': row_id, 'randomNumber': number}) + + +@API() +async def multiple_database_queries(request: Request): + num_queries = get_num_queries(request) + row_ids = sample(range(1, 10000), num_queries) + + async with pool.acquire() as connection: + statement = await connection.prepare(READ_ROW_SQL) + worlds = [{'id': i, 'randomNumber': await statement.fetchval(i)} for i in row_ids] + + return Response(data=worlds) + + +@API() +async def fortunes(): + async with pool.acquire() as connection: + fortune_records = await connection.fetch('SELECT * FROM Fortune') + fortune_records.append(ADDITIONAL_ROW) + fortune_records.sort(key=lambda row: row[1]) + data = fortune_template.render(fortunes=fortune_records) + return HTMLResponse(data=data) + + +@API() +async def database_updates(request: Request): + num_queries = get_num_queries(request) + ids = sorted(sample(range(1, 10000 + 1), num_queries)) + numbers = sorted(sample(range(1, 10000), num_queries)) + updates = list(zip(ids, numbers)) + + worlds = [ + {'id': row_id, 'randomNumber': number} for row_id, number in updates + ] + + async with pool.acquire() as connection: + statement = await connection.prepare(READ_ROW_SQL) + for row_id, _ in updates: + await statement.fetchval(row_id) + await connection.executemany(WRITE_ROW_SQL, updates) + return Response(data=worlds) + + +@API() +async def plaintext(): + return PlainTextResponse(b'Hello, world!') + + +url_routing = { + 'json': json_serialization, + 'db': single_database_query, + 'queries': multiple_database_queries, + 'fortunes': fortunes, + 'updates': database_updates, + 'plaintext': plaintext, +} + +app = Panther(__name__, configs=__name__, urls=url_routing, startup=create_db_pool, shutdown=clean_db_pool) diff --git a/frameworks/Python/panther/benchmark_config.json b/frameworks/Python/panther/benchmark_config.json new file mode 100644 index 00000000000..3de0b7a0974 --- /dev/null +++ b/frameworks/Python/panther/benchmark_config.json @@ -0,0 +1,28 @@ +{ + "framework": "panther", + "tests": [{ + "default": { + "json_url": "/json", + "fortune_url": "/fortunes", + "plaintext_url": "/plaintext", + "db_url": "/db", + "query_url": "/queries?queries=", + "update_url": "/updates?queries=", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "framework": "panther", + "language": "Python", + "flavor": "Python3", + "platform": "ASGI", + "webserver": "Uvicorn", + "os": "Linux", + "orm": "Raw", + "database_os": "Linux", + "database": "Postgres", + "display_name": "Panther", + "versus": "None", + "notes": "" + } + }] +} diff --git a/frameworks/Python/panther/config.toml b/frameworks/Python/panther/config.toml new file mode 100644 index 00000000000..f556e171a19 --- /dev/null +++ b/frameworks/Python/panther/config.toml @@ -0,0 +1,19 @@ +[framework] +name = "panther" + +[main] +urls.plaintext = "/plaintext" +urls.json = "/json" +urls.db = "/db" +urls.query = "/queries?queries=" +urls.update = "/updates?queries=" +urls.fortune = "/fortunes" +approach = "Realistic" +classification = "Micro" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "ASGI" +webserver = "Uvicorn" +versus = "None" diff --git a/frameworks/Python/panther/panther.dockerfile b/frameworks/Python/panther/panther.dockerfile new file mode 100644 index 00000000000..31ec0377429 --- /dev/null +++ b/frameworks/Python/panther/panther.dockerfile @@ -0,0 +1,12 @@ +FROM python:3.11-bullseye + +WORKDIR /panther + +COPY ./ /panther + +RUN pip3 install -U pip +RUN pip3 install -r /panther/requirements.txt + +EXPOSE 8080 + +CMD gunicorn app:app -k uvicorn.workers.UvicornWorker -c panther_conf.py diff --git a/frameworks/Python/panther/panther_conf.py b/frameworks/Python/panther/panther_conf.py new file mode 100644 index 00000000000..f2176beb091 --- /dev/null +++ b/frameworks/Python/panther/panther_conf.py @@ -0,0 +1,14 @@ +import multiprocessing +import os + +_is_travis = os.environ.get('TRAVIS') == 'true' + +workers = multiprocessing.cpu_count() +if _is_travis: + workers = 2 + +bind = "0.0.0.0:8080" +keepalive = 120 +errorlog = '-' +pidfile = '/tmp/panther.pid' +loglevel = 'error' diff --git a/frameworks/Python/panther/requirements.txt b/frameworks/Python/panther/requirements.txt new file mode 100644 index 00000000000..38124b17faf --- /dev/null +++ b/frameworks/Python/panther/requirements.txt @@ -0,0 +1,11 @@ +panther==3.2.1 + +cython==3.0.6 +jinja2==3.1.2 + +asyncpg==0.29.0 + +gunicorn==21.2.0 +uvicorn==0.24.0 +uvloop==0.19.0 +httptools==0.6.1 diff --git a/frameworks/Python/panther/templates/fortune.html b/frameworks/Python/panther/templates/fortune.html new file mode 100644 index 00000000000..d9c26bfa96a --- /dev/null +++ b/frameworks/Python/panther/templates/fortune.html @@ -0,0 +1,14 @@ + + + + Fortunes + + + + + {% for fortune in fortunes %} + + {% endfor %} +
idmessage
{{ fortune[0] }}{{ fortune[1]|e }}
+ + From 279647d31d713b26badc69da907193b338877ad0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Jan 2024 15:26:08 +0000 Subject: [PATCH 118/210] Bump h2 from 0.4.0 to 0.4.2 in /frameworks/Rust/xitca-web Bumps [h2](https://github.com/hyperium/h2) from 0.4.0 to 0.4.2. - [Release notes](https://github.com/hyperium/h2/releases) - [Changelog](https://github.com/hyperium/h2/blob/master/CHANGELOG.md) - [Commits](https://github.com/hyperium/h2/compare/v0.4.0...v0.4.2) --- updated-dependencies: - dependency-name: h2 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Rust/xitca-web/Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Rust/xitca-web/Cargo.lock b/frameworks/Rust/xitca-web/Cargo.lock index eaa2e63b0a2..5582939191f 100644 --- a/frameworks/Rust/xitca-web/Cargo.lock +++ b/frameworks/Rust/xitca-web/Cargo.lock @@ -343,9 +343,9 @@ checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] name = "h2" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d308f63daf4181410c242d34c11f928dcb3aa105852019e043c9d1f4e4368a" +checksum = "31d030e59af851932b72ceebadf4a2b5986dba4c3b99dd2493f8273a0f151943" dependencies = [ "bytes", "fnv", From c3c5d60a7c9fd314132baa26776a48ed43ef7e39 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Jan 2024 16:08:07 +0000 Subject: [PATCH 119/210] Bump h2 from 0.3.15 to 0.3.24 in /frameworks/Rust/rocket Bumps [h2](https://github.com/hyperium/h2) from 0.3.15 to 0.3.24. - [Release notes](https://github.com/hyperium/h2/releases) - [Changelog](https://github.com/hyperium/h2/blob/v0.3.24/CHANGELOG.md) - [Commits](https://github.com/hyperium/h2/compare/v0.3.15...v0.3.24) --- updated-dependencies: - dependency-name: h2 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Rust/rocket/Cargo.lock | 36 +++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/frameworks/Rust/rocket/Cargo.lock b/frameworks/Rust/rocket/Cargo.lock index 4f45a3f3f13..b22dcf8b1f9 100644 --- a/frameworks/Rust/rocket/Cargo.lock +++ b/frameworks/Rust/rocket/Cargo.lock @@ -428,6 +428,12 @@ dependencies = [ "cfg-if 1.0.0", ] +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + [[package]] name = "event-listener" version = "2.5.3" @@ -671,9 +677,9 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "h2" -version = "0.3.15" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f9f29bc9dda355256b2916cf526ab02ce0aeaaaf2bad60d65ef3f12f11dd0f4" +checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" dependencies = [ "bytes", "fnv", @@ -681,7 +687,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap", + "indexmap 2.1.0", "slab", "tokio", "tokio-util", @@ -717,6 +723,12 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" + [[package]] name = "hashlink" version = "0.7.0" @@ -856,6 +868,16 @@ dependencies = [ "serde", ] +[[package]] +name = "indexmap" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +dependencies = [ + "equivalent", + "hashbrown 0.14.3", +] + [[package]] name = "inlinable_string" version = "0.1.15" @@ -1554,7 +1576,7 @@ dependencies = [ "either", "figment", "futures", - "indexmap", + "indexmap 1.9.2", "log", "memchr", "multer", @@ -1586,7 +1608,7 @@ checksum = "d6aeb6bb9c61e9cd2c00d70ea267bf36f76a4cc615e5908b349c2f9d93999b47" dependencies = [ "devise", "glob", - "indexmap", + "indexmap 1.9.2", "proc-macro2", "quote", "rocket_http", @@ -1640,7 +1662,7 @@ dependencies = [ "futures", "http", "hyper", - "indexmap", + "indexmap 1.9.2", "log", "memchr", "pear", @@ -1938,7 +1960,7 @@ dependencies = [ "hex", "hkdf", "hmac", - "indexmap", + "indexmap 1.9.2", "itoa", "libc", "log", From b6faf7d3904348bc69af9dc1d6371a4306121e7b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Jan 2024 16:11:57 +0000 Subject: [PATCH 120/210] Bump h2 from 0.3.18 to 0.3.24 in /frameworks/Rust/pavex Bumps [h2](https://github.com/hyperium/h2) from 0.3.18 to 0.3.24. - [Release notes](https://github.com/hyperium/h2/releases) - [Changelog](https://github.com/hyperium/h2/blob/v0.3.24/CHANGELOG.md) - [Commits](https://github.com/hyperium/h2/compare/v0.3.18...v0.3.24) --- updated-dependencies: - dependency-name: h2 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Rust/pavex/Cargo.lock | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/frameworks/Rust/pavex/Cargo.lock b/frameworks/Rust/pavex/Cargo.lock index 55bef569ece..59472e0d09f 100644 --- a/frameworks/Rust/pavex/Cargo.lock +++ b/frameworks/Rust/pavex/Cargo.lock @@ -81,6 +81,12 @@ dependencies = [ "cc", ] +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + [[package]] name = "fnv" version = "1.0.7" @@ -147,9 +153,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.18" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17f8a914c2987b688368b5138aa05321db91f4090cf26118185672ad588bce21" +checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" dependencies = [ "bytes", "fnv", @@ -157,7 +163,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap", + "indexmap 2.1.0", "slab", "tokio", "tokio-util", @@ -170,6 +176,12 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" + [[package]] name = "hermit-abi" version = "0.2.6" @@ -244,10 +256,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", - "hashbrown", + "hashbrown 0.12.3", "serde", ] +[[package]] +name = "indexmap" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +dependencies = [ + "equivalent", + "hashbrown 0.14.3", +] + [[package]] name = "itoa" version = "1.0.6" @@ -350,7 +372,7 @@ dependencies = [ "anyhow", "fs-err", "http", - "indexmap", + "indexmap 1.9.3", "pavex_runtime", "ron", "serde", From 90e56b6f0c74f6b94cc47b76aa08d967223144ab Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Jan 2024 16:17:11 +0000 Subject: [PATCH 121/210] Bump h2 from 0.3.20 to 0.3.24 in /frameworks/Rust/actix Bumps [h2](https://github.com/hyperium/h2) from 0.3.20 to 0.3.24. - [Release notes](https://github.com/hyperium/h2/releases) - [Changelog](https://github.com/hyperium/h2/blob/v0.3.24/CHANGELOG.md) - [Commits](https://github.com/hyperium/h2/compare/v0.3.20...v0.3.24) --- updated-dependencies: - dependency-name: h2 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Rust/actix/Cargo.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Rust/actix/Cargo.lock b/frameworks/Rust/actix/Cargo.lock index 501124b789a..b7601c63273 100644 --- a/frameworks/Rust/actix/Cargo.lock +++ b/frameworks/Rust/actix/Cargo.lock @@ -1071,9 +1071,9 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "h2" -version = "0.3.20" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" +checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" dependencies = [ "bytes", "fnv", @@ -1081,7 +1081,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 1.9.3", + "indexmap 2.0.0", "slab", "tokio", "tokio-util 0.7.8", From e2adb208b7a22256e33968c7f9321dce9efef6ac Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Jan 2024 21:38:16 +0000 Subject: [PATCH 122/210] Bump shlex from 1.1.0 to 1.3.0 in /frameworks/Rust/actix Bumps [shlex](https://github.com/comex/rust-shlex) from 1.1.0 to 1.3.0. - [Changelog](https://github.com/comex/rust-shlex/blob/master/CHANGELOG.md) - [Commits](https://github.com/comex/rust-shlex/commits) --- updated-dependencies: - dependency-name: shlex dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Rust/actix/Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Rust/actix/Cargo.lock b/frameworks/Rust/actix/Cargo.lock index b7601c63273..180b200226d 100644 --- a/frameworks/Rust/actix/Cargo.lock +++ b/frameworks/Rust/actix/Cargo.lock @@ -2046,9 +2046,9 @@ dependencies = [ [[package]] name = "shlex" -version = "1.1.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" From c0701e1a1b1c898ec4d263495003c0568094c627 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Jan 2024 14:43:15 +0000 Subject: [PATCH 123/210] Bump @hono/node-server in /frameworks/JavaScript/hono Bumps [@hono/node-server](https://github.com/honojs/node-server) from 1.3.1 to 1.4.1. - [Release notes](https://github.com/honojs/node-server/releases) - [Commits](https://github.com/honojs/node-server/compare/v1.3.1...v1.4.1) --- updated-dependencies: - dependency-name: "@hono/node-server" dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/JavaScript/hono/package-lock.json | 8 ++++---- frameworks/JavaScript/hono/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/frameworks/JavaScript/hono/package-lock.json b/frameworks/JavaScript/hono/package-lock.json index fe0163ffcf6..173cf4dc47e 100644 --- a/frameworks/JavaScript/hono/package-lock.json +++ b/frameworks/JavaScript/hono/package-lock.json @@ -9,15 +9,15 @@ "version": "0.0.1", "license": "MIT", "dependencies": { - "@hono/node-server": "^1.3.1", + "@hono/node-server": "^1.4.1", "hono": "^3.10.4", "postgres": "^3.4.3" } }, "node_modules/@hono/node-server": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.3.1.tgz", - "integrity": "sha512-eQBCDbH1Vv/TiYXNP8aGfJTuXi9xGhEd/EZg9u6dhr7zC5/WKKztcBmbrOTtixVBvvV6bfcay6KEginwiqHyXg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.4.1.tgz", + "integrity": "sha512-7jB8iMs6T2FhREs4Ugk+7rzn7d5aC6wEX3FAy67ZafzcQqqBVggcLkFPCMauaFJJyjc+bFvMOdFxJXKYsBM6MQ==", "engines": { "node": ">=18.14.1" } diff --git a/frameworks/JavaScript/hono/package.json b/frameworks/JavaScript/hono/package.json index 9689d3e7d41..62b18bb58bf 100644 --- a/frameworks/JavaScript/hono/package.json +++ b/frameworks/JavaScript/hono/package.json @@ -1,6 +1,6 @@ { "dependencies": { - "@hono/node-server": "^1.3.1", + "@hono/node-server": "^1.4.1", "hono": "^3.10.4", "postgres": "^3.4.3" }, From c0bca9fc38414b5b36fe25b33787b492fa3ef7d9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Jan 2024 20:31:52 +0000 Subject: [PATCH 124/210] Bump trillium-http from 0.3.11 to 0.3.12 in /frameworks/Rust/trillium Bumps [trillium-http](https://github.com/trillium-rs/trillium) from 0.3.11 to 0.3.12. - [Release notes](https://github.com/trillium-rs/trillium/releases) - [Commits](https://github.com/trillium-rs/trillium/compare/trillium-http-v0.3.11...trillium-http-v0.3.12) --- updated-dependencies: - dependency-name: trillium-http dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Rust/trillium/Cargo.lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/Rust/trillium/Cargo.lock b/frameworks/Rust/trillium/Cargo.lock index 4ea9fae5587..4da7e199f75 100644 --- a/frameworks/Rust/trillium/Cargo.lock +++ b/frameworks/Rust/trillium/Cargo.lock @@ -2627,9 +2627,9 @@ dependencies = [ [[package]] name = "trillium-http" -version = "0.3.11" +version = "0.3.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b5f80f30b6958cff1e0b5b8587c6e8d1fe2f7e6ba656ea1ef115f745f9106d" +checksum = "098325950afcdccb34312ec0804f31f33da3b7a8f08994d50792182a99f264fd" dependencies = [ "encoding_rs", "futures-lite 2.1.0", From 14aeb13df9541c184ca760b46072bb41d97519c0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Jan 2024 00:10:21 +0000 Subject: [PATCH 125/210] Bump aiohttp from 3.9.0 to 3.9.2 in /frameworks/Python/api_hour Bumps [aiohttp](https://github.com/aio-libs/aiohttp) from 3.9.0 to 3.9.2. - [Release notes](https://github.com/aio-libs/aiohttp/releases) - [Changelog](https://github.com/aio-libs/aiohttp/blob/master/CHANGES.rst) - [Commits](https://github.com/aio-libs/aiohttp/compare/v3.9.0...v3.9.2) --- updated-dependencies: - dependency-name: aiohttp dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Python/api_hour/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/api_hour/requirements.txt b/frameworks/Python/api_hour/requirements.txt index 65b3aa84965..2a65448dcda 100644 --- a/frameworks/Python/api_hour/requirements.txt +++ b/frameworks/Python/api_hour/requirements.txt @@ -1,4 +1,4 @@ -aiohttp==3.9.0 +aiohttp==3.9.2 -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 From f47f45a6b4ef3da44a7cf6652e3d2d30271dde42 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 2 Feb 2024 21:20:07 +0000 Subject: [PATCH 126/210] Bump org.springframework:spring-beans in /frameworks/Java/spring-webflux Bumps [org.springframework:spring-beans](https://github.com/spring-projects/spring-framework) from 5.2.21.BUILD-SNAPSHOT to 5.2.22.BUILD-SNAPSHOT. - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/commits) --- updated-dependencies: - dependency-name: org.springframework:spring-beans dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Java/spring-webflux/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/spring-webflux/pom.xml b/frameworks/Java/spring-webflux/pom.xml index 701d1348d47..bcfa4f32b9f 100644 --- a/frameworks/Java/spring-webflux/pom.xml +++ b/frameworks/Java/spring-webflux/pom.xml @@ -113,7 +113,7 @@ org.springframework spring-beans - 5.2.21.BUILD-SNAPSHOT + 5.2.22.BUILD-SNAPSHOT From 0187c6a03696eeefc16c89c9684a789e178c4ccf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 2 Feb 2024 21:22:09 +0000 Subject: [PATCH 127/210] Bump org.springframework:spring-context Bumps [org.springframework:spring-context](https://github.com/spring-projects/spring-framework) from 5.2.0.M2 to 5.2.22.BUILD-SNAPSHOT. - [Release notes](https://github.com/spring-projects/spring-framework/releases) - [Commits](https://github.com/spring-projects/spring-framework/commits) --- updated-dependencies: - dependency-name: org.springframework:spring-context dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Java/spring-webflux/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/spring-webflux/pom.xml b/frameworks/Java/spring-webflux/pom.xml index bcfa4f32b9f..932a6467e52 100644 --- a/frameworks/Java/spring-webflux/pom.xml +++ b/frameworks/Java/spring-webflux/pom.xml @@ -103,7 +103,7 @@ org.springframework spring-context - 5.2.0.M2 + 5.2.22.BUILD-SNAPSHOT org.springframework From 29912dfe6669c883eee059d4d53f019e5965b900 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Feb 2024 17:56:34 +0000 Subject: [PATCH 128/210] Bump starlette from 0.27.0 to 0.36.2 in /frameworks/Python/starlette Bumps [starlette](https://github.com/encode/starlette) from 0.27.0 to 0.36.2. - [Release notes](https://github.com/encode/starlette/releases) - [Changelog](https://github.com/encode/starlette/blob/master/docs/release-notes.md) - [Commits](https://github.com/encode/starlette/compare/0.27.0...0.36.2) --- updated-dependencies: - dependency-name: starlette dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Python/starlette/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/starlette/requirements.txt b/frameworks/Python/starlette/requirements.txt index 1d9a9482ca9..6c1a7f01ed6 100644 --- a/frameworks/Python/starlette/requirements.txt +++ b/frameworks/Python/starlette/requirements.txt @@ -6,6 +6,6 @@ Jinja2==3.1.3 MarkupSafe==2.1.1 python-dotenv==0.20.0 PyYAML==6.0 -starlette==0.27.0 +starlette==0.36.2 uvicorn==0.20.0 uvloop==0.17.0 From 5e9fdded1a2a8405295fc2475c277016241455df Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 Feb 2024 18:28:44 +0000 Subject: [PATCH 129/210] Bump fastapi from 0.92.0 to 0.109.1 in /frameworks/Python/fastapi Bumps [fastapi](https://github.com/tiangolo/fastapi) from 0.92.0 to 0.109.1. - [Release notes](https://github.com/tiangolo/fastapi/releases) - [Commits](https://github.com/tiangolo/fastapi/compare/0.92.0...0.109.1) --- updated-dependencies: - dependency-name: fastapi dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Python/fastapi/requirements-socketify-pypy.txt | 2 +- frameworks/Python/fastapi/requirements-socketify.txt | 2 +- frameworks/Python/fastapi/requirements.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Python/fastapi/requirements-socketify-pypy.txt b/frameworks/Python/fastapi/requirements-socketify-pypy.txt index 76a50bee96a..8882bf571a5 100644 --- a/frameworks/Python/fastapi/requirements-socketify-pypy.txt +++ b/frameworks/Python/fastapi/requirements-socketify-pypy.txt @@ -1,2 +1,2 @@ -fastapi==0.92.0 +fastapi==0.109.1 git+https://github.com/cirospaciari/socketify.py.git@main#socketify \ No newline at end of file diff --git a/frameworks/Python/fastapi/requirements-socketify.txt b/frameworks/Python/fastapi/requirements-socketify.txt index 03e6d8df2d2..5f4e0c71b78 100644 --- a/frameworks/Python/fastapi/requirements-socketify.txt +++ b/frameworks/Python/fastapi/requirements-socketify.txt @@ -1,3 +1,3 @@ orjson==3.8.7 -fastapi==0.92.0 +fastapi==0.109.1 git+https://github.com/cirospaciari/socketify.py.git@main#socketify \ No newline at end of file diff --git a/frameworks/Python/fastapi/requirements.txt b/frameworks/Python/fastapi/requirements.txt index 4a3ed41bc6a..02ea2224c34 100644 --- a/frameworks/Python/fastapi/requirements.txt +++ b/frameworks/Python/fastapi/requirements.txt @@ -1,4 +1,4 @@ asyncpg==0.27.0 -fastapi==0.93.0 +fastapi==0.109.1 Jinja2==3.1.3 ujson==5.7.0 From 6d38b5f9258d062e8c8f92580621371dcd52fdc1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Feb 2024 03:41:47 +0000 Subject: [PATCH 130/210] Bump nokogiri from 1.15.4 to 1.16.2 in /frameworks/Ruby/rails Bumps [nokogiri](https://github.com/sparklemotion/nokogiri) from 1.15.4 to 1.16.2. - [Release notes](https://github.com/sparklemotion/nokogiri/releases) - [Changelog](https://github.com/sparklemotion/nokogiri/blob/main/CHANGELOG.md) - [Commits](https://github.com/sparklemotion/nokogiri/compare/v1.15.4...v1.16.2) --- updated-dependencies: - dependency-name: nokogiri dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Ruby/rails/Gemfile.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frameworks/Ruby/rails/Gemfile.lock b/frameworks/Ruby/rails/Gemfile.lock index 581abdd9c06..39a530c9227 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -102,7 +102,7 @@ GEM net-smtp marcel (1.0.2) mini_mime (1.1.5) - mini_portile2 (2.8.4) + mini_portile2 (2.8.5) minitest (5.20.0) mutex_m (0.1.2) net-imap (0.4.0) @@ -115,12 +115,12 @@ GEM net-smtp (0.4.0) net-protocol nio4r (2.7.0) - nokogiri (1.15.4) + nokogiri (1.16.2) mini_portile2 (~> 2.8.2) racc (~> 1.4) - nokogiri (1.15.4-arm64-darwin) + nokogiri (1.16.2-arm64-darwin) racc (~> 1.4) - nokogiri (1.15.4-x86_64-linux) + nokogiri (1.16.2-x86_64-linux) racc (~> 1.4) oj (3.16.1) pg (1.5.4) @@ -128,7 +128,7 @@ GEM stringio puma (6.4.2) nio4r (~> 2.0) - racc (1.7.1) + racc (1.7.3) rack (3.0.8) rack-session (2.0.0) rack (>= 3.0.0) From bc684d9273875f9188a21c89382aab2462d9e8ab Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Feb 2024 10:15:47 -0800 Subject: [PATCH 131/210] Bump aiohttp from 3.9.0 to 3.9.2 in /frameworks/Python/aiohttp (#8726) Bumps [aiohttp](https://github.com/aio-libs/aiohttp) from 3.9.0 to 3.9.2. - [Release notes](https://github.com/aio-libs/aiohttp/releases) - [Changelog](https://github.com/aio-libs/aiohttp/blob/master/CHANGES.rst) - [Commits](https://github.com/aio-libs/aiohttp/compare/v3.9.0...v3.9.2) --- updated-dependencies: - dependency-name: aiohttp dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Python/aiohttp/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/aiohttp/requirements.txt b/frameworks/Python/aiohttp/requirements.txt index 840dbfccad5..d833896a168 100644 --- a/frameworks/Python/aiohttp/requirements.txt +++ b/frameworks/Python/aiohttp/requirements.txt @@ -1,4 +1,4 @@ -aiohttp==3.9.0 +aiohttp==3.9.2 asyncpg==0.25.0 cchardet==2.1.7 gunicorn==20.1 From 640c511719084d029759d028a7c0ff9324e034dd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 7 Feb 2024 22:49:24 +0000 Subject: [PATCH 132/210] Bump django from 3.2.23 to 3.2.24 in /frameworks/Python/django Bumps [django](https://github.com/django/django) from 3.2.23 to 3.2.24. - [Commits](https://github.com/django/django/compare/3.2.23...3.2.24) --- updated-dependencies: - dependency-name: django dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Python/django/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/django/requirements.txt b/frameworks/Python/django/requirements.txt index a337c00f8d9..fe2b00a17d3 100644 --- a/frameworks/Python/django/requirements.txt +++ b/frameworks/Python/django/requirements.txt @@ -1,4 +1,4 @@ -Django==3.2.23 +Django==3.2.24 mysqlclient==1.4.6 psycopg2==2.9.6; implementation_name=='cpython' psycopg2cffi==2.9.0; implementation_name=='pypy' From b59569732aeae29df268d98cf2e4e787f1289efe Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Tue, 20 Feb 2024 21:04:39 +0100 Subject: [PATCH 133/210] [php] Update ngx-php (#8739) * [php] Update ngx-php * Less verbose --- frameworks/PHP/php-ngx/app-async.php | 2 +- frameworks/PHP/php-ngx/php-ngx-async.dockerfile | 10 +++++----- frameworks/PHP/php-ngx/php-ngx-mysql.dockerfile | 6 +++--- frameworks/PHP/php-ngx/php-ngx-pgsql.dockerfile | 6 +++--- frameworks/PHP/php-ngx/php-ngx.dockerfile | 8 ++++---- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/frameworks/PHP/php-ngx/app-async.php b/frameworks/PHP/php-ngx/app-async.php index 80b78b39eb7..3d85d02aaed 100644 --- a/frameworks/PHP/php-ngx/app-async.php +++ b/frameworks/PHP/php-ngx/app-async.php @@ -1,5 +1,5 @@ /dev/null && \ RUN apt-get update -yqq > /dev/null && \ apt-get install -yqq wget git libxml2-dev systemtap-sdt-dev \ - zlib1g-dev libpcre3-dev libargon2-0-dev libsodium-dev \ + zlib1g-dev libpcre3-dev libargon2-0-dev libsodium-dev libkrb5-dev \ php8.3-cli php8.3-dev libphp8.3-embed php8.3-mysql > /dev/null ADD . . -ENV NGINX_VERSION 1.25.3 +ENV NGINX_VERSION 1.25.4 -RUN git clone -b v0.0.28 --single-branch --depth 1 https://github.com/rryqszq4/ngx_php7.git > /dev/null +RUN git clone -b v0.0.29 --single-branch --depth 1 https://github.com/rryqszq4/ngx-php.git > /dev/null RUN wget -q http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \ tar -zxf nginx-${NGINX_VERSION}.tar.gz && \ @@ -25,8 +25,8 @@ RUN wget -q http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \ ./configure --user=www --group=www \ --prefix=/nginx \ --with-ld-opt="-Wl,-rpath,$PHP_LIB" \ - --add-module=/ngx_php7/third_party/ngx_devel_kit \ - --add-module=/ngx_php7 > /dev/null && \ + --add-module=/ngx-php/third_party/ngx_devel_kit \ + --add-module=/ngx-php > /dev/null && \ make > /dev/null && make install > /dev/null RUN sed -i "s|opcache.jit=off|;opcache.jit=off|g" /etc/php/8.3/embed/conf.d/10-opcache.ini diff --git a/frameworks/PHP/php-ngx/php-ngx-mysql.dockerfile b/frameworks/PHP/php-ngx/php-ngx-mysql.dockerfile index 841dca26953..90d87b8523d 100644 --- a/frameworks/PHP/php-ngx/php-ngx-mysql.dockerfile +++ b/frameworks/PHP/php-ngx/php-ngx-mysql.dockerfile @@ -9,13 +9,13 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ RUN apt-get update -yqq > /dev/null && \ apt-get install -yqq wget git libxml2-dev systemtap-sdt-dev \ - zlib1g-dev libpcre3-dev libargon2-0-dev libsodium-dev \ + zlib1g-dev libpcre3-dev libargon2-0-dev libsodium-dev libkrb5-dev \ php8.3-cli php8.3-dev libphp8.3-embed php8.3-mysql > /dev/null ADD . . -ENV NGINX_VERSION 1.25.3 +ENV NGINX_VERSION 1.25.4 -RUN git clone -b v0.0.28 --single-branch --depth 1 https://github.com/rryqszq4/ngx-php.git > /dev/null +RUN git clone -b v0.0.29 --single-branch --depth 1 https://github.com/rryqszq4/ngx-php.git > /dev/null RUN wget -q http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \ tar -zxf nginx-${NGINX_VERSION}.tar.gz && \ diff --git a/frameworks/PHP/php-ngx/php-ngx-pgsql.dockerfile b/frameworks/PHP/php-ngx/php-ngx-pgsql.dockerfile index 3c5ca60ed16..b7a157833fd 100644 --- a/frameworks/PHP/php-ngx/php-ngx-pgsql.dockerfile +++ b/frameworks/PHP/php-ngx/php-ngx-pgsql.dockerfile @@ -9,13 +9,13 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ RUN apt-get update -yqq > /dev/null && \ apt-get install -yqq wget git libxml2-dev systemtap-sdt-dev \ - zlib1g-dev libpcre3-dev libargon2-0-dev libsodium-dev \ + zlib1g-dev libpcre3-dev libargon2-0-dev libsodium-dev libkrb5-dev \ php8.3-cli php8.3-dev libphp8.3-embed php8.3-pgsql > /dev/null ADD . . -ENV NGINX_VERSION 1.25.3 +ENV NGINX_VERSION 1.25.4 -RUN git clone -b v0.0.28 --single-branch --depth 1 https://github.com/rryqszq4/ngx-php.git > /dev/null +RUN git clone -b v0.0.29 --single-branch --depth 1 https://github.com/rryqszq4/ngx-php.git > /dev/null RUN wget -q http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \ tar -zxf nginx-${NGINX_VERSION}.tar.gz && \ diff --git a/frameworks/PHP/php-ngx/php-ngx.dockerfile b/frameworks/PHP/php-ngx/php-ngx.dockerfile index 0642b2e9509..671a6312aef 100644 --- a/frameworks/PHP/php-ngx/php-ngx.dockerfile +++ b/frameworks/PHP/php-ngx/php-ngx.dockerfile @@ -9,13 +9,13 @@ RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ RUN apt-get update -yqq > /dev/null && \ apt-get install -yqq wget git libxml2-dev systemtap-sdt-dev \ - zlib1g-dev libpcre3-dev libargon2-0-dev libsodium-dev \ - php8.3-cli php8.3-dev libphp8.3-embed php8.3-mysql + zlib1g-dev libpcre3-dev libargon2-0-dev libsodium-dev libkrb5-dev \ + php8.3-cli php8.3-dev libphp8.3-embed php8.3-mysql > /dev/null ADD . . -ENV NGINX_VERSION 1.25.3 +ENV NGINX_VERSION 1.25.4 -RUN git clone -b v0.0.28 --single-branch --depth 1 https://github.com/rryqszq4/ngx-php.git > /dev/null +RUN git clone -b v0.0.29 --single-branch --depth 1 https://github.com/rryqszq4/ngx-php.git > /dev/null RUN wget -q http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz && \ tar -zxf nginx-${NGINX_VERSION}.tar.gz && \ From 40db94432c2742c7d57ac4a09bd2700accd1f3a8 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Tue, 20 Feb 2024 21:04:48 +0100 Subject: [PATCH 134/210] [php] Phalcon update to PHP 8.3 (#8720) * [php] Phalcon update to PHP 8.3 * Fix mongodb variant --- frameworks/PHP/phalcon/benchmark_config.json | 3 +-- frameworks/PHP/phalcon/composer.json | 2 +- frameworks/PHP/phalcon/phalcon-micro.dockerfile | 14 +++++++------- frameworks/PHP/phalcon/phalcon-mongodb.dockerfile | 14 +++++++------- frameworks/PHP/phalcon/phalcon.dockerfile | 14 +++++++------- 5 files changed, 23 insertions(+), 24 deletions(-) diff --git a/frameworks/PHP/phalcon/benchmark_config.json b/frameworks/PHP/phalcon/benchmark_config.json index 127bce79907..810c897643b 100644 --- a/frameworks/PHP/phalcon/benchmark_config.json +++ b/frameworks/PHP/phalcon/benchmark_config.json @@ -42,8 +42,7 @@ "database_os": "Linux", "display_name": "phalcon-mongodb", "notes": "", - "versus": "php", - "tags": ["broken"] + "versus": "php" }, "micro": { "plaintext_url": "/plaintext", diff --git a/frameworks/PHP/phalcon/composer.json b/frameworks/PHP/phalcon/composer.json index f42463f3153..a1ead267232 100644 --- a/frameworks/PHP/phalcon/composer.json +++ b/frameworks/PHP/phalcon/composer.json @@ -1,6 +1,6 @@ { "require": { "mongodb/mongodb": "^1.6", - "phalcon/incubator-mongodb": "^1.0" + "phalcon/incubator-mongodb": "^2.0" } } diff --git a/frameworks/PHP/phalcon/phalcon-micro.dockerfile b/frameworks/PHP/phalcon/phalcon-micro.dockerfile index b7e77e5dc63..31e405d1af6 100644 --- a/frameworks/PHP/phalcon/phalcon-micro.dockerfile +++ b/frameworks/PHP/phalcon/phalcon-micro.dockerfile @@ -6,21 +6,21 @@ RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /de RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null -RUN apt-get install -y php-pear php8.2-dev > /dev/null -RUN mkdir -p /etc/php/8.2/fpm/conf.d -RUN pecl install phalcon > /dev/null && echo "extension=phalcon.so" > /etc/php/8.2/fpm/conf.d/phalcon.ini +RUN apt-get install -y php-pear php8.3-dev > /dev/null +RUN mkdir -p /etc/php/8.3/fpm/conf.d +RUN pecl install phalcon > /dev/null && echo "extension=phalcon.so" > /etc/php/8.3/fpm/conf.d/phalcon.ini RUN apt-get install -yqq nginx git unzip \ - php8.2-cli php8.2-fpm php8.2-mysql php8.2-mbstring php8.2-xml > /dev/null + php8.3-cli php8.3-fpm php8.3-mysql php8.3-mbstring php8.3-xml > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.2/fpm/ +COPY deploy/conf/* /etc/php/8.3/fpm/ ADD ./ /phalcon WORKDIR /phalcon -RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.2/fpm/php-fpm.conf ; fi; +RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.3/fpm/php-fpm.conf ; fi; RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --ignore-platform-reqs @@ -30,5 +30,5 @@ RUN chmod -R 777 app EXPOSE 8080 -CMD service php8.2-fpm start && \ +CMD service php8.3-fpm start && \ nginx -c /phalcon/deploy/nginx.conf diff --git a/frameworks/PHP/phalcon/phalcon-mongodb.dockerfile b/frameworks/PHP/phalcon/phalcon-mongodb.dockerfile index 3b176037ba1..e545aa8a4ed 100644 --- a/frameworks/PHP/phalcon/phalcon-mongodb.dockerfile +++ b/frameworks/PHP/phalcon/phalcon-mongodb.dockerfile @@ -6,21 +6,21 @@ RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /de RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null -RUN apt-get install -y php-pear php8.2-dev > /dev/null -RUN mkdir -p /etc/php/8.2/fpm/conf.d -RUN pecl install phalcon > /dev/null && echo "extension=phalcon.so" > /etc/php/8.2/fpm/conf.d/phalcon.ini +RUN apt-get install -y php-pear php8.3-dev > /dev/null +RUN mkdir -p /etc/php/8.3/fpm/conf.d +RUN pecl install phalcon > /dev/null && echo "extension=phalcon.so" > /etc/php/8.3/fpm/conf.d/phalcon.ini RUN apt-get install -yqq nginx git unzip \ - php8.2-cli php8.2-fpm php8.2-mbstring php8.2-xml php8.2-mongodb > /dev/null + php8.3-cli php8.3-fpm php8.3-mbstring php8.3-xml php8.3-mongodb > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.2/fpm/ +COPY deploy/conf/* /etc/php/8.3/fpm/ ADD ./ /phalcon WORKDIR /phalcon -RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.2/fpm/php-fpm.conf ; fi; +RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.3/fpm/php-fpm.conf ; fi; RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --quiet --ignore-platform-reqs @@ -30,5 +30,5 @@ RUN chmod -R 777 app EXPOSE 8080 -CMD service php8.2-fpm start && \ +CMD service php8.3-fpm start && \ nginx -c /phalcon/deploy/nginx.conf diff --git a/frameworks/PHP/phalcon/phalcon.dockerfile b/frameworks/PHP/phalcon/phalcon.dockerfile index d5c07177aa3..b07d5433f5f 100644 --- a/frameworks/PHP/phalcon/phalcon.dockerfile +++ b/frameworks/PHP/phalcon/phalcon.dockerfile @@ -6,21 +6,21 @@ RUN apt-get update -yqq && apt-get install -yqq software-properties-common > /de RUN LC_ALL=C.UTF-8 add-apt-repository ppa:ondrej/php > /dev/null && \ apt-get update -yqq > /dev/null && apt-get upgrade -yqq > /dev/null -RUN apt-get install -y php-pear php8.2-dev > /dev/null -RUN mkdir -p /etc/php/8.2/fpm/conf.d -RUN pecl install phalcon > /dev/null && echo "extension=phalcon.so" > /etc/php/8.2/fpm/conf.d/phalcon.ini +RUN apt-get install -y php-pear php8.3-dev > /dev/null +RUN mkdir -p /etc/php/8.3/fpm/conf.d +RUN pecl install phalcon > /dev/null && echo "extension=phalcon.so" > /etc/php/8.3/fpm/conf.d/phalcon.ini RUN apt-get install -yqq nginx git unzip \ - php8.2-cli php8.2-fpm php8.2-mysql php8.2-mbstring php8.2-xml > /dev/null + php8.3-cli php8.3-fpm php8.3-mysql php8.3-mbstring php8.3-xml > /dev/null COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer -COPY deploy/conf/* /etc/php/8.2/fpm/ +COPY deploy/conf/* /etc/php/8.3/fpm/ ADD ./ /phalcon WORKDIR /phalcon -RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.2/fpm/php-fpm.conf ; fi; +RUN if [ $(nproc) = 2 ]; then sed -i "s|pm.max_children = 1024|pm.max_children = 512|g" /etc/php/8.3/fpm/php-fpm.conf ; fi; RUN composer install --optimize-autoloader --classmap-authoritative --no-dev --ignore-platform-reqs @@ -28,5 +28,5 @@ RUN chmod -R 777 app EXPOSE 8080 -CMD service php8.2-fpm start && \ +CMD service php8.3-fpm start && \ nginx -c /phalcon/deploy/nginx.conf From 5bfaa1c909fade2f7ecde89fac055f1631247c05 Mon Sep 17 00:00:00 2001 From: Jacob Rothstein Date: Tue, 20 Feb 2024 12:05:03 -0800 Subject: [PATCH 135/210] upgrade trillium-rs dependencies (#8738) --- frameworks/Rust/trillium/Cargo.lock | 864 +++++++------------ frameworks/Rust/trillium/Cargo.toml | 17 +- frameworks/Rust/trillium/trillium.dockerfile | 2 +- 3 files changed, 311 insertions(+), 572 deletions(-) diff --git a/frameworks/Rust/trillium/Cargo.lock b/frameworks/Rust/trillium/Cargo.lock index 4da7e199f75..ab1aceee5e0 100644 --- a/frameworks/Rust/trillium/Cargo.lock +++ b/frameworks/Rust/trillium/Cargo.lock @@ -2,26 +2,11 @@ # It is not intended for manual editing. version = 3 -[[package]] -name = "addr2line" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - [[package]] name = "ahash" -version = "0.8.7" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" +checksum = "42cd52102d3df161c77a887b608d7a4897d7cc112886a9537b738a887a03aaff" dependencies = [ "cfg-if", "getrandom", @@ -51,6 +36,54 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +[[package]] +name = "anstream" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" + +[[package]] +name = "anstyle-parse" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +dependencies = [ + "anstyle", + "windows-sys 0.52.0", +] + [[package]] name = "askama" version = "0.12.1" @@ -66,9 +99,9 @@ dependencies = [ [[package]] name = "askama_derive" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ccf09143e56923c12e027b83a9553210a3c58322ed8419a53461b14a4dccd85" +checksum = "19fe8d6cb13c4714962c072ea496f3392015f0989b1a2847bb4b2d9effd71d83" dependencies = [ "askama_parser", "basic-toml", @@ -77,7 +110,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.46", + "syn 2.0.48", ] [[package]] @@ -88,9 +121,9 @@ checksum = "619743e34b5ba4e9703bba34deac3427c72507c7159f5fd030aea8cac0cfe341" [[package]] name = "askama_parser" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "262eb9cf7be51269c5f2951eeda9ccd14d6934e437457f47b4f066bf55a6770d" +checksum = "acb1161c6b64d1c3d83108213c2a2533a342ac225aabd0bda218278c2ddb00c0" dependencies = [ "nom", ] @@ -108,13 +141,13 @@ dependencies = [ [[package]] name = "async-channel" -version = "2.1.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ca33f4bc4ed1babef42cad36cc1f51fa88be00420404e5b1e80ab1b18f7678c" +checksum = "f28243a43d821d11341ab73c80bed182dc015c514b951616cf79bd4af39af0c3" dependencies = [ "concurrent-queue", - "event-listener 4.0.2", - "event-listener-strategy", + "event-listener 5.0.0", + "event-listener-strategy 0.5.0", "futures-core", "pin-project-lite", ] @@ -125,11 +158,11 @@ version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17ae5ebefcc48e7452b4987947920dac9450be1110cadf34d1b8c116bdbaf97c" dependencies = [ - "async-lock 3.2.0", + "async-lock 3.3.0", "async-task", "concurrent-queue", "fastrand 2.0.1", - "futures-lite 2.1.0", + "futures-lite 2.2.0", "slab", ] @@ -139,12 +172,12 @@ version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" dependencies = [ - "async-channel 2.1.1", + "async-channel 2.2.0", "async-executor", - "async-io 2.2.2", - "async-lock 3.2.0", + "async-io 2.3.1", + "async-lock 3.3.0", "blocking", - "futures-lite 2.1.0", + "futures-lite 2.2.0", "once_cell", ] @@ -164,24 +197,24 @@ dependencies = [ "polling 2.8.0", "rustix 0.37.27", "slab", - "socket2 0.4.10", + "socket2", "waker-fn", ] [[package]] name = "async-io" -version = "2.2.2" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6afaa937395a620e33dc6a742c593c01aced20aa376ffb0f628121198578ccc7" +checksum = "8f97ab0c5b00a7cdbe5a371b9a782ee7be1316095885c8a4ea1daf490eb0ef65" dependencies = [ - "async-lock 3.2.0", + "async-lock 3.3.0", "cfg-if", "concurrent-queue", "futures-io", - "futures-lite 2.1.0", + "futures-lite 2.2.0", "parking", - "polling 3.3.1", - "rustix 0.38.28", + "polling 3.4.0", + "rustix 0.38.31", "slab", "tracing", "windows-sys 0.52.0", @@ -198,12 +231,12 @@ dependencies = [ [[package]] name = "async-lock" -version = "3.2.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7125e42787d53db9dd54261812ef17e937c95a51e4d291373b670342fa44310c" +checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b" dependencies = [ - "event-listener 4.0.2", - "event-listener-strategy", + "event-listener 4.0.3", + "event-listener-strategy 0.4.0", "pin-project-lite", ] @@ -213,9 +246,9 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b948000fad4873c1c9339d60f2623323a0cfd3816e5181033c6a5cb68b2accf7" dependencies = [ - "async-io 2.2.2", + "async-io 2.3.1", "blocking", - "futures-lite 2.1.0", + "futures-lite 2.2.0", ] [[package]] @@ -263,14 +296,14 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.46", + "syn 2.0.48", ] [[package]] name = "async-task" -version = "4.6.0" +version = "4.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d90cd0b264dfdd8eb5bad0a2c217c1f88fa96a8573f40e7b12de23fb468f46" +checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799" [[package]] name = "async-trait" @@ -280,7 +313,7 @@ checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.46", + "syn 2.0.48", ] [[package]] @@ -320,26 +353,11 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" -[[package]] -name = "backtrace" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - [[package]] name = "base64" -version = "0.21.5" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "basic-toml" @@ -358,9 +376,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.1" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" [[package]] name = "block-buffer" @@ -377,12 +395,12 @@ version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" dependencies = [ - "async-channel 2.1.1", - "async-lock 3.2.0", + "async-channel 2.2.0", + "async-lock 3.3.0", "async-task", "fastrand 2.0.1", "futures-io", - "futures-lite 2.1.0", + "futures-lite 2.2.0", "piper", "tracing", ] @@ -422,9 +440,9 @@ dependencies = [ [[package]] name = "cargo-platform" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ceed8ef69d8518a5dda55c07425450b58a4e1946f4951eab6d7191ee86c2443d" +checksum = "694c8807f2ae16faecc43dc17d74b3eb042482789fd0eb64b39a2e04e087053f" dependencies = [ "serde", ] @@ -457,6 +475,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + [[package]] name = "colored" version = "2.1.0" @@ -494,9 +518,9 @@ checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "cpufeatures" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] @@ -518,43 +542,36 @@ checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] name = "crossbeam-channel" -version = "0.5.10" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82a9b73a36529d9c47029b9fb3a6f0ea3cc916a261195352ba19e770fc1748b2" +checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.17" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e3681d554572a651dda4186cd47240627c3d0114d45a95f6ad27f2f22e7548d" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "autocfg", - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-queue" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adc6598521bb5a83d491e8c1fe51db7296019d2ca3cb93cc6c2a20369a4d78a2" +checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.18" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3a430a770ebd84726f584a90ee7f020d28db52c6d02138900f22341f866d39c" -dependencies = [ - "cfg-if", -] +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" [[package]] name = "crypto-common" @@ -605,9 +622,9 @@ checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" [[package]] name = "either" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" dependencies = [ "serde", ] @@ -621,17 +638,27 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "env_filter" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a009aa4810eb158359dda09d0c87378e4bbb89b5a801f016885a4707ba24f7ea" +dependencies = [ + "log", + "regex", +] + [[package]] name = "env_logger" -version = "0.10.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95b3f3e67048839cb0d0781f445682a35113da7121f7c949db0e2be96a4fbece" +checksum = "6c012a26a7f605efc424dd53697843a72be7dc86ad2d01f7814337794a12231d" dependencies = [ + "anstream", + "anstyle", + "env_filter", "humantime", - "is-terminal", "log", - "regex", - "termcolor", ] [[package]] @@ -678,9 +705,20 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "event-listener" -version = "4.0.2" +version = "4.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "218a870470cce1469024e9fb66b901aa983929d81304a1cdb299f28118e550d5" +checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b72557800024fabbaa2449dd4bf24e37b93702d457a4d4f2b0dd1f0f039f20c1" dependencies = [ "concurrent-queue", "parking", @@ -693,7 +731,17 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" dependencies = [ - "event-listener 4.0.2", + "event-listener 4.0.3", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "feedafcaa9b749175d5ac357452a9d41ea2911da598fde46ce1fe02c37751291" +dependencies = [ + "event-listener 5.0.0", "pin-project-lite", ] @@ -718,12 +766,6 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - [[package]] name = "foreign-types" version = "0.3.2" @@ -812,9 +854,9 @@ dependencies = [ [[package]] name = "futures-lite" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aeee267a1883f7ebef3700f262d2d54de95dfaf38189015a74fdc4e0c7ad8143" +checksum = "445ba825b27408685aaecefd65178908c36c6e96aaf6d8599419d46e624192ba" dependencies = [ "fastrand 2.0.1", "futures-core", @@ -831,7 +873,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.46", + "syn 2.0.48", ] [[package]] @@ -876,21 +918,15 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", "libc", "wasi", ] -[[package]] -name = "gimli" -version = "0.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" - [[package]] name = "glob" version = "0.3.1" @@ -909,25 +945,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "h2" -version = "0.3.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d6250322ef6e60f93f9a2162799302cd6f68f79f6e5d85c8c16f14d1d958178" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - [[package]] name = "hashbrown" version = "0.14.3" @@ -958,9 +975,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.3" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd" [[package]] name = "hex" @@ -995,28 +1012,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "http" -version = "0.2.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "http-body" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" -dependencies = [ - "bytes", - "http", - "pin-project-lite", -] - [[package]] name = "httparse" version = "1.8.0" @@ -1044,43 +1039,6 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" -[[package]] -name = "hyper" -version = "0.14.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2 0.5.5", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper-tls" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" -dependencies = [ - "bytes", - "hyper", - "native-tls", - "tokio", - "tokio-native-tls", -] - [[package]] name = "idna" version = "0.5.0" @@ -1093,9 +1051,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.1.0" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" dependencies = [ "equivalent", "hashbrown", @@ -1109,7 +1067,7 @@ checksum = "0122b7114117e64a63ac49f752a5ca4624d534c7b1c7de796ac196381cd2d947" dependencies = [ "proc-macro2", "quote", - "syn 2.0.46", + "syn 2.0.48", ] [[package]] @@ -1132,28 +1090,11 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "ipnet" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" - -[[package]] -name = "is-terminal" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bad00257d07be169d870ab665980b06cdb366d792ad690bf2e76876dc503455" -dependencies = [ - "hermit-abi", - "rustix 0.38.28", - "windows-sys 0.52.0", -] - [[package]] name = "itertools" -version = "0.12.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25db6b064527c5d482d0423354fcd07a89a2dfe07b67892e62411946db7f07b0" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" dependencies = [ "either", ] @@ -1186,9 +1127,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.66" +version = "0.3.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" +checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee" dependencies = [ "wasm-bindgen", ] @@ -1210,9 +1151,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.151" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libm" @@ -1228,9 +1169,9 @@ checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" [[package]] name = "linux-raw-sys" -version = "0.4.12" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" [[package]] name = "lock_api" @@ -1251,15 +1192,6 @@ dependencies = [ "value-bag", ] -[[package]] -name = "mach2" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" -dependencies = [ - "libc", -] - [[package]] name = "md-5" version = "0.10.6" @@ -1282,17 +1214,6 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" -[[package]] -name = "mime-db" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c7a61c4bc8a32ee5bf3e11804ec460e771ea496968a213fa187651569ee3418" -dependencies = [ - "reqwest", - "serde", - "tokio", -] - [[package]] name = "mime_guess" version = "2.0.4" @@ -1309,31 +1230,11 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" -[[package]] -name = "miniz_oxide" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" -dependencies = [ - "adler", -] - -[[package]] -name = "mio" -version = "0.8.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" -dependencies = [ - "libc", - "wasi", - "windows-sys 0.48.0", -] - [[package]] name = "moka" -version = "0.12.2" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f353abec74660d4b8533c2516c86eb062f1ec8ca49a2758f4f2b1b60b06b0c6e" +checksum = "b1911e88d5831f748a4097a43862d129e3c6fca831eecac9b8db6d01d93c9de2" dependencies = [ "async-lock 2.8.0", "async-trait", @@ -1377,7 +1278,7 @@ version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "cfg-if", "libc", ] @@ -1392,33 +1293,30 @@ dependencies = [ "minimal-lexical", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-traits" -version = "0.2.17" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" dependencies = [ "autocfg", ] [[package]] name = "num_threads" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2819ce041d2ee131036f4fc9d6ae7ae125a3a40e97ba64d04fe799ad9dabbb44" +checksum = "5c7398b9c8b70908f6371f47ed36737907c87c52af34c268fed0bf0ceb92ead9" dependencies = [ "libc", ] -[[package]] -name = "object" -version = "0.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" -dependencies = [ - "memchr", -] - [[package]] name = "once_cell" version = "1.19.0" @@ -1427,11 +1325,11 @@ checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "openssl" -version = "0.10.62" +version = "0.10.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cde4d2d9200ad5909f8dac647e29482e07c3a35de8a13fce7c9c7747ad9f671" +checksum = "15c9d69dd87a29568d4d017cfe8ec518706046a05184e5aea92d0af890b803c8" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "cfg-if", "foreign-types", "libc", @@ -1448,7 +1346,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.46", + "syn 2.0.48", ] [[package]] @@ -1459,9 +1357,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.98" +version = "0.9.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1665caf8ab2dc9aef43d1c0023bd904633a6a05cb30b0ad59bec2ae986e57a7" +checksum = "22e1bf214306098e4832460f797824c05d25aacdf896f64a985fb0fd992454ae" dependencies = [ "cc", "libc", @@ -1499,7 +1397,7 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.46", + "syn 2.0.48", ] [[package]] @@ -1545,22 +1443,22 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +checksum = "0302c4a0442c456bd56f841aee5c3bfd17967563f6fadc9ceb9f9c23cf3807e0" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690" dependencies = [ "proc-macro2", "quote", - "syn 2.0.46", + "syn 2.0.48", ] [[package]] @@ -1588,9 +1486,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.28" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69d3587f8a9e599cc7ec2c00e331f71c4e69a5f9a4b8a6efd5b07466b9736f9a" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "polling" @@ -1610,14 +1508,14 @@ dependencies = [ [[package]] name = "polling" -version = "3.3.1" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf63fa624ab313c11656b4cda960bfc46c410187ad493c41f6ba2d8c1e991c9e" +checksum = "30054e72317ab98eddd8561db0f6524df3367636884b7b21b703e4b280a84a14" dependencies = [ "cfg-if", "concurrent-queue", "pin-project-lite", - "rustix 0.38.28", + "rustix 0.38.31", "tracing", "windows-sys 0.52.0", ] @@ -1660,33 +1558,32 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.74" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2de98502f212cfcea8d0bb305bd0f49d7ebdd75b64ba0a68f937d888f4e0d6db" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ "unicode-ident", ] [[package]] name = "pulldown-cmark" -version = "0.9.3" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a1a2f1f0a7ecff9c31abbe177637be0e97a0aef46cf8738ece09327985d998" +checksum = "57206b407293d2bcd3af849ce869d52068623f19e1b5ff8e8778e3309439682b" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.4.2", "memchr", "unicase", ] [[package]] name = "quanta" -version = "0.11.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17e662a7a8291a865152364c20c7abc5e60486ab2001e8ec10b24862de0b9ab" +checksum = "9ca0b7bac0b97248c40bb77288fc52029cf1459c0461ea1b05ee32ccf011de2c" dependencies = [ "crossbeam-utils", "libc", - "mach2", "once_cell", "raw-cpuid", "wasi", @@ -1735,11 +1632,11 @@ dependencies = [ [[package]] name = "raw-cpuid" -version = "10.7.0" +version = "11.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c297679cb867470fa8c9f67dbba74a78d78e3e98d7cf2b08d6d71540f797332" +checksum = "9d86a7c4638d42c44551f4791a20e687dbb4c3de1f33c43dd71e355cd429def1" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.4.2", ] [[package]] @@ -1753,9 +1650,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.2" +version = "1.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" dependencies = [ "aho-corasick", "memchr", @@ -1765,9 +1662,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" dependencies = [ "aho-corasick", "memchr", @@ -1780,44 +1677,6 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" -[[package]] -name = "reqwest" -version = "0.11.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37b1ae8d9ac08420c66222fb9096fc5de435c3c48542bc5336c51892cffafb41" -dependencies = [ - "base64", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2", - "http", - "http-body", - "hyper", - "hyper-tls", - "ipnet", - "js-sys", - "log", - "mime", - "native-tls", - "once_cell", - "percent-encoding", - "pin-project-lite", - "serde", - "serde_json", - "serde_urlencoded", - "system-configuration", - "tokio", - "tokio-native-tls", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "winreg", -] - [[package]] name = "rlimit" version = "0.10.1" @@ -1829,20 +1688,14 @@ dependencies = [ [[package]] name = "routefinder" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94f8f99b10dedd317514253dda1fa7c14e344aac96e1f78149a64879ce282aca" +checksum = "0971d3c8943a6267d6bd0d782fdc4afa7593e7381a92a3df950ff58897e066b5" dependencies = [ "smartcow", "smartstring", ] -[[package]] -name = "rustc-demangle" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" - [[package]] name = "rustc_version" version = "0.4.0" @@ -1868,14 +1721,14 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.28" +version = "0.38.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316" +checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "errno", "libc", - "linux-raw-sys 0.4.12", + "linux-raw-sys 0.4.13", "windows-sys 0.52.0", ] @@ -1919,14 +1772,14 @@ dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.46", + "syn 2.0.48", ] [[package]] name = "sea-orm" -version = "0.12.10" +version = "0.12.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9195a2b2a182cbee3f76cf2a97c20204022f91259bdf8a48b537788202775b" +checksum = "6632f499b80cc6aaa781b302e4c9fae663e0e3dcf2640e9d80034d5b10731efe" dependencies = [ "async-stream", "async-trait", @@ -1946,23 +1799,23 @@ dependencies = [ [[package]] name = "sea-orm-macros" -version = "0.12.10" +version = "0.12.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66c6acfe3d49625c679955c7e7e7cd2d72b512a5c77bcd535a74aa41590b9f28" +checksum = "ec13bfb4c4aef208f68dbea970dd40d13830c868aa8dcb4e106b956e6bb4f2fa" dependencies = [ "heck", "proc-macro2", "quote", "sea-bae", - "syn 2.0.46", + "syn 2.0.48", "unicode-ident", ] [[package]] name = "sea-query" -version = "0.30.6" +version = "0.30.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a1feb0a26c02efedb049b22d3884e66f15a40c42b33dcbe49b46abc484c2bd" +checksum = "4166a1e072292d46dc91f31617c2a1cdaf55a8be4b5c9f4bf2ba248e3ac4999b" dependencies = [ "derivative", "inherent", @@ -2013,29 +1866,29 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.194" +version = "1.0.196" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b114498256798c94a0689e1a15fec6005dee8ac1f41de56404b67afc2a4b773" +checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.194" +version = "1.0.196" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3385e45322e8f9931410f01b3031ec534c3947d0e94c18049af4d9f9907d4e0" +checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" dependencies = [ "proc-macro2", "quote", - "syn 2.0.46", + "syn 2.0.48", ] [[package]] name = "serde_json" -version = "1.0.110" +version = "1.0.113" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fbd975230bada99c8bb618e0c365c2eefa219158d5c6c29610fd09ff1833257" +checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79" dependencies = [ "itoa", "ryu", @@ -2139,9 +1992,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.2" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" +checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" [[package]] name = "smartcow" @@ -2173,16 +2026,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "socket2" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" -dependencies = [ - "libc", - "windows-sys 0.48.0", -] - [[package]] name = "sqlformat" version = "0.2.3" @@ -2292,7 +2135,7 @@ checksum = "d6ac0ac3b7ccd10cc96c7ab29791a7dd236bd94021f31eec7ba3d46a74aa1c24" dependencies = [ "atoi", "base64", - "bitflags 2.4.1", + "bitflags 2.4.2", "byteorder", "crc", "dotenvy", @@ -2331,12 +2174,12 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] name = "stopper" -version = "0.2.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "810ecf6a47020ea27b2cc949d2f1292b9759e8f2c4cebf71376520124417d9e6" +checksum = "ed8bff52ab3d70adfb76df17a225936c7676efdda1a1567ed5b11c22e3577bd3" dependencies = [ - "event-listener 4.0.2", - "futures-lite 2.1.0", + "event-listener 4.0.3", + "futures-lite 2.2.0", "pin-project-lite", ] @@ -2376,36 +2219,15 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.46" +version = "2.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89456b690ff72fddcecf231caedbe615c59480c93358a93dfae7fc29e3ebbf0e" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "tagptr" version = "0.2.0" @@ -2414,55 +2236,46 @@ checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417" [[package]] name = "tempfile" -version = "3.9.0" +version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01ce4141aa927a6d1bd34a041795abd0db1cccba5d5f24b009f694bdf3a1f3fa" +checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67" dependencies = [ "cfg-if", "fastrand 2.0.1", - "redox_syscall", - "rustix 0.38.28", + "rustix 0.38.31", "windows-sys 0.52.0", ] -[[package]] -name = "termcolor" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff1bc3d3f05aff0403e8ac0d92ced918ec05b666a43f83297ccef5bea8a3d449" -dependencies = [ - "winapi-util", -] - [[package]] name = "thiserror" -version = "1.0.56" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" +checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.56" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" +checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" dependencies = [ "proc-macro2", "quote", - "syn 2.0.46", + "syn 2.0.48", ] [[package]] name = "time" -version = "0.3.31" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e" +checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" dependencies = [ "deranged", "itoa", "libc", + "num-conv", "num_threads", "powerfmt", "serde", @@ -2478,10 +2291,11 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26197e33420244aeb70c3e8c78376ca46571bc4e701e4791c2cd9f57dcb3a43f" +checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" dependencies = [ + "num-conv", "time-core", ] @@ -2500,63 +2314,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" -[[package]] -name = "tokio" -version = "1.35.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104" -dependencies = [ - "backtrace", - "bytes", - "libc", - "mio", - "pin-project-lite", - "socket2 0.5.5", - "tokio-macros", - "windows-sys 0.48.0", -] - -[[package]] -name = "tokio-macros" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.46", -] - -[[package]] -name = "tokio-native-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" -dependencies = [ - "native-tls", - "tokio", -] - -[[package]] -name = "tokio-util" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", - "tracing", -] - -[[package]] -name = "tower-service" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" - [[package]] name = "tracing" version = "0.1.40" @@ -2577,7 +2334,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.46", + "syn 2.0.48", ] [[package]] @@ -2591,12 +2348,12 @@ dependencies = [ [[package]] name = "trillium" -version = "0.2.13" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b4a1ea726106cfe880370300042a8712b0911f30a63920597437c76cda47893" +checksum = "acca545b3933760b2b88b822d83e62ccf9aab8c24d16ae82e56df1f2a5af11c1" dependencies = [ "async-trait", - "futures-lite 2.1.0", + "futures-lite 2.2.0", "log", "trillium-http", ] @@ -2616,23 +2373,23 @@ dependencies = [ [[package]] name = "trillium-askama" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eee9fec08e885273a2cb989ccfdc525ad632cf01d82c3fb630a535a000a790f" +checksum = "f0a4eeb5246ff1baea3c81782ee46bc4601463d75d6a8502bcf44890456b4c1e" dependencies = [ "askama", - "mime-db", + "mime_guess", "trillium", ] [[package]] name = "trillium-http" -version = "0.3.12" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "098325950afcdccb34312ec0804f31f33da3b7a8f08994d50792182a99f264fd" +checksum = "f8afd3a7e9a46df93d81229fcd2011e089ed522c55ef633edee8893a23cb88e9" dependencies = [ "encoding_rs", - "futures-lite 2.1.0", + "futures-lite 2.2.0", "hashbrown", "httparse", "httpdate", @@ -2668,7 +2425,7 @@ checksum = "916054381183f0cfed7604bf7de2044a760624a50d26eef5492468fb73083bbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.46", + "syn 2.0.48", ] [[package]] @@ -2690,8 +2447,8 @@ checksum = "9b4f157b81051bb2630b6750d6583f648f545d241ef4b939781f4ad6a45fe700" dependencies = [ "async-trait", "async_cell", - "event-listener 4.0.2", - "futures-lite 2.1.0", + "event-listener 4.0.3", + "futures-lite 2.2.0", "log", "pin-project-lite", "rlimit", @@ -2707,9 +2464,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91f9ca9fc22be687543ee24d23d9730f7370d57796adc2a2f2ccd9ce51b78199" dependencies = [ "async-global-executor", - "async-io 2.2.2", + "async-io 2.3.1", "async-net", - "futures-lite 2.1.0", + "futures-lite 2.2.0", "log", "signal-hook", "signal-hook-async-std", @@ -2727,7 +2484,7 @@ dependencies = [ "askama", "env_logger", "fastrand 2.0.1", - "futures-lite 2.1.0", + "futures-lite 2.2.0", "jemallocator", "moka", "sea-orm", @@ -2748,12 +2505,6 @@ version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "859eb650cfee7434994602c3a68b25d77ad9e68c8a6cd491616ef86661382eb3" -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - [[package]] name = "typenum" version = "1.17.0" @@ -2771,9 +2522,9 @@ dependencies = [ [[package]] name = "unicode-bidi" -version = "0.3.14" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" @@ -2792,9 +2543,9 @@ dependencies = [ [[package]] name = "unicode-segmentation" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" [[package]] name = "unicode_categories" @@ -2832,20 +2583,26 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "utf8parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" + [[package]] name = "uuid" -version = "1.6.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" +checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a" dependencies = [ "getrandom", ] [[package]] name = "value-bag" -version = "1.4.2" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a72e1902dde2bd6441347de2b70b7f5d59bf157c6c62f0c44572607a1d55bbe" +checksum = "126e423afe2dd9ac52142e7e9d5ce4135d7e13776c529d27fd6bc49f19e3280b" [[package]] name = "vcpkg" @@ -2875,15 +2632,6 @@ dependencies = [ "winapi-util", ] -[[package]] -name = "want" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" -dependencies = [ - "try-lock", -] - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -2892,9 +2640,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.89" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" +checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -2902,24 +2650,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.89" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" +checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.46", + "syn 2.0.48", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.39" +version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac36a15a220124ac510204aec1c3e5db8a22ab06fd6706d881dc6149f8ed9a12" +checksum = "877b9c3f61ceea0e56331985743b13f3d25c406a7098d45180fb5f09bc19ed97" dependencies = [ "cfg-if", "js-sys", @@ -2929,9 +2677,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.89" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" +checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2939,28 +2687,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.89" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" +checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" dependencies = [ "proc-macro2", "quote", - "syn 2.0.46", + "syn 2.0.48", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.89" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" +checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" [[package]] name = "web-sys" -version = "0.3.66" +version = "0.3.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" +checksum = "96565907687f7aceb35bc5fc03770a8a0471d82e479f25832f54a0e3f4b28446" dependencies = [ "js-sys", "wasm-bindgen", @@ -3135,16 +2883,6 @@ version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" -[[package]] -name = "winreg" -version = "0.50.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" -dependencies = [ - "cfg-if", - "windows-sys 0.48.0", -] - [[package]] name = "zerocopy" version = "0.7.32" @@ -3162,5 +2900,5 @@ checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.46", + "syn 2.0.48", ] diff --git a/frameworks/Rust/trillium/Cargo.toml b/frameworks/Rust/trillium/Cargo.toml index 031f0c2d032..6b31ed67ad6 100644 --- a/frameworks/Rust/trillium/Cargo.toml +++ b/frameworks/Rust/trillium/Cargo.toml @@ -9,25 +9,26 @@ jemallocator = ["dep:jemallocator"] [dependencies] askama = "0.12.1" fastrand = "2.0.1" -futures-lite = "2.1.0" -serde = { version = "1.0.194", features = ["derive"] } -serde_json = "1.0.110" -trillium = "0.2.13" +futures-lite = "2.2.0" +serde = { version = "1.0.196", features = ["derive"] } +serde_json = "1.0.113" +trillium = "0.2.16" trillium-api = "0.1.0" -trillium-askama = "0.3.1" +trillium-askama = "0.3.2" trillium-smol = "0.3.3" trillium-logger = "0.4.4" trillium-router = "0.3.6" unicycle = "0.9.4" -env_logger = "0.10.1" -moka = { version = "0.12.2", features = ["future"] } +env_logger = "0.11.2" +moka = { version = "0.12.5", features = ["future"] } jemallocator = {version="0.5.4", optional = true} [dependencies.sea-orm] -version = "0.12.10" +version = "0.12.14" default-features = false features = ["runtime-async-std-native-tls", "sqlx-postgres", "macros"] [profile.release] panic = "abort" lto = "fat" +codegen-units = 1 diff --git a/frameworks/Rust/trillium/trillium.dockerfile b/frameworks/Rust/trillium/trillium.dockerfile index 877b6b664a2..e5e3ac910ba 100644 --- a/frameworks/Rust/trillium/trillium.dockerfile +++ b/frameworks/Rust/trillium/trillium.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.74 +FROM rust:1.76 WORKDIR /trillium COPY src src COPY templates templates From 3818096aa10d736d7118f47334d9da1978a23c7c Mon Sep 17 00:00:00 2001 From: Jeremy Kuhn Date: Tue, 20 Feb 2024 21:05:12 +0100 Subject: [PATCH 136/210] Upgrade to Inverno 1.6.2 (#8733) * Inverno framework test * Remove unused code * Optimization * remove db.sql * Upgrade to Inverno 1.2.2 * Upgrade to Inverno 1.4.1 * Update README.md * Upgrade to Inverno 1.6.2 * Add missing binutils when building docker images * Fix inverno postgres CMD --- .../Java/inverno/inverno-postgres.dockerfile | 9 +- frameworks/Java/inverno/inverno.dockerfile | 7 +- frameworks/Java/inverno/pom.xml | 132 +++++++++++++----- .../src/jmods/io.vertx.core/module-info.java | 99 ------------- .../jmods/r2dbc.postgresql/module-info.java | 38 ----- .../{Handler.java => Controller.java} | 9 +- .../inverno/src/main/java/module-info.java | 6 +- 7 files changed, 114 insertions(+), 186 deletions(-) delete mode 100644 frameworks/Java/inverno/src/jmods/io.vertx.core/module-info.java delete mode 100644 frameworks/Java/inverno/src/jmods/r2dbc.postgresql/module-info.java rename frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/{Handler.java => Controller.java} (96%) diff --git a/frameworks/Java/inverno/inverno-postgres.dockerfile b/frameworks/Java/inverno/inverno-postgres.dockerfile index 5a2928679e3..6a3fcd9070f 100644 --- a/frameworks/Java/inverno/inverno-postgres.dockerfile +++ b/frameworks/Java/inverno/inverno-postgres.dockerfile @@ -1,11 +1,12 @@ -FROM maven:3.8.2-openjdk-16 as maven +FROM maven:3.9.6-amazoncorretto-21 as maven WORKDIR /inverno COPY src src COPY pom.xml pom.xml -RUN mvn package -q +RUN yum -y install binutils +RUN mvn package -q -Pio.inverno.io_uring EXPOSE 8080 -# CMD [ "target/maven-inverno/application_linux_amd64/inverno-benchmark-1.0.0-SNAPSHOT/bin/inverno-benchmark" ] +# CMD [ "target/inverno-benchmark-1.0.0-SNAPSHOT-application_linux_amd64/bin/inverno-benchmark" ] CMD export DBIP=`getent hosts tfb-database | awk '{ print $1 }'` && \ - target/maven-inverno/application_linux_amd64/inverno-benchmark-1.0.0-SNAPSHOT/bin/inverno-benchmark --com.techempower.inverno.benchmark.appConfiguration.db_host=\"$DBIP\" \ No newline at end of file + target/inverno-benchmark-1.0.0-SNAPSHOT-application_linux_amd64/bin/inverno-benchmark --com.techempower.inverno.benchmark.appConfiguration.db_host=\"$DBIP\" diff --git a/frameworks/Java/inverno/inverno.dockerfile b/frameworks/Java/inverno/inverno.dockerfile index 6af60a189dc..1dd39d53b27 100644 --- a/frameworks/Java/inverno/inverno.dockerfile +++ b/frameworks/Java/inverno/inverno.dockerfile @@ -1,9 +1,10 @@ -FROM maven:3.8.2-openjdk-16 as maven +FROM maven:3.9.6-amazoncorretto-21 as maven WORKDIR /inverno COPY src src COPY pom.xml pom.xml -RUN mvn package -q +RUN yum -y install binutils +RUN mvn package -q -Pio.inverno.io_uring EXPOSE 8080 -CMD [ "target/maven-inverno/application_linux_amd64/inverno-benchmark-1.0.0-SNAPSHOT/bin/inverno-benchmark", "--com.techempower.inverno.benchmark.appConfiguration.boot.reactor_prefer_vertx=false" ] +CMD [ "target/inverno-benchmark-1.0.0-SNAPSHOT-application_linux_amd64/bin/inverno-benchmark", "--com.techempower.inverno.benchmark.appConfiguration.boot.reactor_prefer_vertx=false" ] diff --git a/frameworks/Java/inverno/pom.xml b/frameworks/Java/inverno/pom.xml index 296f7d99246..e394d645fad 100644 --- a/frameworks/Java/inverno/pom.xml +++ b/frameworks/Java/inverno/pom.xml @@ -6,7 +6,7 @@ io.inverno.dist inverno-parent - 1.4.1 + 1.6.2 com.techempower inverno-benchmark @@ -17,9 +17,9 @@ Inverno framework benchmark test - 16 - 16 - 16 + 21 + 21 + 21 @@ -79,10 +79,21 @@ ${version.netty} - + + + + io.netty.incubator + netty-incubator-transport-native-io_uring + linux-x86_64 + + + + io.vertx + vertx-io_uring-incubator @@ -90,36 +101,87 @@ log4j-core - - - - - io.inverno.tool - inverno-maven-plugin - - - inverno-package - package - - build-app - - - server - - - inverno-benchmark - -Xms2g -Xmx2g -server -XX:+UseNUMA -XX:+UseParallelGC -Dio.netty.leakDetection.level=disabled -Dvertx.disableHttpHeadersValidation=true -Dvertx.disableMetrics=true -Dvertx.disableH2c=true -Dvertx.disableWebsockets=true -Dvertx.flashPolicyHandler=false -Dvertx.threadChecks=false -Dvertx.disableContextTimings=true -Dvertx.disableTCCL=true --add-modules io.netty.transport.unix.common,io.netty.transport.epoll - - - - zip - - - - - - - + + + + io.inverno.epoll + + + io.netty + netty-transport-native-epoll + linux-x86_64 + + + + + + io.inverno.tool + inverno-maven-plugin + + + inverno-package-app + package + + package-app + + + server + + + inverno-benchmark + -Xms2g -Xmx2g -server -XX:+UseNUMA -XX:+UseParallelGC -Dio.netty.leakDetection.level=disabled -Dio.netty.buffer.checkBounds=false -Dio.netty.buffer.checkBounds=false -Dvertx.disableHttpHeadersValidation=true -Dvertx.disableMetrics=true -Dvertx.disableH2c=true -Dvertx.disableWebsockets=true -Dvertx.flashPolicyHandler=false -Dvertx.threadChecks=false -Dvertx.disableContextTimings=true -Dvertx.disableTCCL=true --add-modules io.netty.transport.unix.common,io.netty.transport.classes.epoll,io.netty.transport.epoll.linux.x86_64 + + + + zip + + + + + + + + + + io.inverno.io_uring + + + io.netty + netty-transport-native-epoll + linux-x86_64 + + + + + + io.inverno.tool + inverno-maven-plugin + + + inverno-package-app + package + + package-app + + + server + + + inverno-benchmark + -Xms2g -Xmx2g -server -XX:+UseNUMA -XX:+UseParallelGC -Dio.netty.leakDetection.level=disabled -Dio.netty.buffer.checkBounds=false -Dio.netty.buffer.checkBounds=false -Dvertx.disableHttpHeadersValidation=true -Dvertx.disableMetrics=true -Dvertx.disableH2c=true -Dvertx.disableWebsockets=true -Dvertx.flashPolicyHandler=false -Dvertx.threadChecks=false -Dvertx.disableContextTimings=true -Dvertx.disableTCCL=true --add-modules io.netty.transport.unix.common,io.netty.incubator.transport.classes.io_uring,io.netty.incubator.transport.io_uring.linux.x86_64 + + + + zip + + + + + + + + + diff --git a/frameworks/Java/inverno/src/jmods/io.vertx.core/module-info.java b/frameworks/Java/inverno/src/jmods/io.vertx.core/module-info.java deleted file mode 100644 index 56fbff0c18c..00000000000 --- a/frameworks/Java/inverno/src/jmods/io.vertx.core/module-info.java +++ /dev/null @@ -1,99 +0,0 @@ -module io.vertx.core { - requires io.netty.handler.proxy; - requires io.netty.resolver.dns; - requires io.netty.transport.epoll; - requires io.netty.transport.unix.common; - requires java.naming; - requires org.apache.logging.log4j; - - requires transitive com.fasterxml.jackson.core; - requires transitive com.fasterxml.jackson.databind; - requires transitive io.netty.buffer; - requires transitive io.netty.codec; - requires transitive io.netty.codec.dns; - requires transitive io.netty.codec.http; - requires transitive io.netty.codec.http2; - requires transitive io.netty.common; - requires transitive io.netty.handler; - requires transitive io.netty.resolver; - requires transitive io.netty.transport; - requires transitive java.compiler; - requires transitive java.logging; - - exports io.vertx.core; - exports io.vertx.core.buffer; - exports io.vertx.core.buffer.impl; - exports io.vertx.core.cli; - exports io.vertx.core.cli.annotations; - exports io.vertx.core.cli.converters; - exports io.vertx.core.cli.impl; - exports io.vertx.core.datagram; - exports io.vertx.core.datagram.impl; - exports io.vertx.core.dns; - exports io.vertx.core.dns.impl; - exports io.vertx.core.dns.impl.decoder; - exports io.vertx.core.eventbus; - exports io.vertx.core.eventbus.impl; - exports io.vertx.core.eventbus.impl.clustered; - exports io.vertx.core.eventbus.impl.codecs; - exports io.vertx.core.file; - exports io.vertx.core.file.impl; - exports io.vertx.core.http; - exports io.vertx.core.http.impl; - exports io.vertx.core.http.impl.cgbystrom; - exports io.vertx.core.http.impl.headers; - exports io.vertx.core.http.impl.ws; - exports io.vertx.core.impl; - exports io.vertx.core.impl.cpu; - exports io.vertx.core.impl.future; - exports io.vertx.core.impl.launcher; - exports io.vertx.core.impl.launcher.commands; - exports io.vertx.core.impl.logging; - exports io.vertx.core.impl.resolver; - exports io.vertx.core.impl.utils; - exports io.vertx.core.impl.verticle; - exports io.vertx.core.json; - exports io.vertx.core.json.impl; - exports io.vertx.core.json.jackson; - exports io.vertx.core.json.pointer; - exports io.vertx.core.json.pointer.impl; - exports io.vertx.core.logging; - exports io.vertx.core.metrics; - exports io.vertx.core.metrics.impl; - exports io.vertx.core.net; - exports io.vertx.core.net.impl; - exports io.vertx.core.net.impl.pkcs1; - exports io.vertx.core.net.impl.pool; - exports io.vertx.core.net.impl.transport; - exports io.vertx.core.parsetools; - exports io.vertx.core.parsetools.impl; - exports io.vertx.core.shareddata; - exports io.vertx.core.shareddata.impl; - exports io.vertx.core.spi; - exports io.vertx.core.spi.cluster; - exports io.vertx.core.spi.cluster.impl; - exports io.vertx.core.spi.cluster.impl.selector; - exports io.vertx.core.spi.json; - exports io.vertx.core.spi.launcher; - exports io.vertx.core.spi.logging; - exports io.vertx.core.spi.metrics; - exports io.vertx.core.spi.observability; - exports io.vertx.core.spi.resolver; - exports io.vertx.core.spi.tracing; - exports io.vertx.core.streams; - exports io.vertx.core.streams.impl; - exports io.vertx.core.tracing; - - provides io.vertx.core.spi.launcher.CommandFactory with - io.vertx.core.impl.launcher.commands.RunCommandFactory, - io.vertx.core.impl.launcher.commands.VersionCommandFactory, - io.vertx.core.impl.launcher.commands.BareCommandFactory, - io.vertx.core.impl.launcher.commands.ListCommandFactory, - io.vertx.core.impl.launcher.commands.StartCommandFactory, - io.vertx.core.impl.launcher.commands.StopCommandFactory; - - uses io.vertx.core.spi.VertxServiceProvider; - uses io.vertx.core.spi.VerticleFactory; - uses io.vertx.core.spi.JsonFactory; - -} diff --git a/frameworks/Java/inverno/src/jmods/r2dbc.postgresql/module-info.java b/frameworks/Java/inverno/src/jmods/r2dbc.postgresql/module-info.java deleted file mode 100644 index 18208e43b04..00000000000 --- a/frameworks/Java/inverno/src/jmods/r2dbc.postgresql/module-info.java +++ /dev/null @@ -1,38 +0,0 @@ -module r2dbc.postgresql { - requires com.ongres.scram.client; - requires com.ongres.scram.common; - requires io.netty.codec; - requires io.netty.resolver; - requires io.netty.transport; - requires io.netty.transport.epoll; - requires io.netty.transport.unix.common; - requires java.naming; - - requires transitive io.netty.buffer; - requires transitive io.netty.common; - requires transitive io.netty.handler; - requires transitive org.reactivestreams; - requires transitive r2dbc.spi; - requires transitive reactor.core; - requires transitive reactor.netty.core; - - exports io.r2dbc.postgresql; - exports io.r2dbc.postgresql.api; - exports io.r2dbc.postgresql.authentication; - exports io.r2dbc.postgresql.client; - exports io.r2dbc.postgresql.codec; - exports io.r2dbc.postgresql.extension; - exports io.r2dbc.postgresql.message; - exports io.r2dbc.postgresql.message.backend; - exports io.r2dbc.postgresql.message.frontend; - exports io.r2dbc.postgresql.replication; - exports io.r2dbc.postgresql.util; - - provides io.r2dbc.postgresql.extension.Extension with - io.r2dbc.postgresql.codec.BuiltinDynamicCodecs; - provides io.r2dbc.spi.ConnectionFactoryProvider with - io.r2dbc.postgresql.PostgresqlConnectionFactoryProvider; - - uses io.r2dbc.postgresql.extension.Extension; - -} diff --git a/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/Handler.java b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/Controller.java similarity index 96% rename from frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/Handler.java rename to frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/Controller.java index 1e7052c275e..639ec561159 100644 --- a/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/Handler.java +++ b/frameworks/Java/inverno/src/main/java/com/techempower/inverno/benchmark/internal/Controller.java @@ -23,13 +23,14 @@ import io.inverno.mod.base.concurrent.Reactor; import io.inverno.mod.base.concurrent.ReactorScope; import io.inverno.mod.base.converter.ConverterException; +import io.inverno.mod.http.base.ExchangeContext; import io.inverno.mod.http.base.HttpException; import io.inverno.mod.http.base.InternalServerErrorException; import io.inverno.mod.http.base.Parameter; import io.inverno.mod.http.base.Status; import io.inverno.mod.http.server.Exchange; -import io.inverno.mod.http.server.ExchangeContext; -import io.inverno.mod.http.server.RootExchangeHandler; +import io.inverno.mod.http.server.ErrorExchange; +import io.inverno.mod.http.server.ServerController; import io.inverno.mod.sql.SqlClient; import io.inverno.mod.sql.UnsafeSqlOperations; import io.netty.buffer.ByteBuf; @@ -42,7 +43,7 @@ import reactor.core.publisher.Mono; @Bean( visibility = Visibility.PRIVATE ) -public class Handler implements RootExchangeHandler> { +public class Controller implements ServerController, ErrorExchange> { private static final String PATH_PLAINTEXT = "/plaintext"; private static final String PATH_JSON = "/json"; @@ -65,7 +66,7 @@ public class Handler implements RootExchangeHandler> sqlClient ) { diff --git a/frameworks/Java/inverno/src/main/java/module-info.java b/frameworks/Java/inverno/src/main/java/module-info.java index 7f0f44d7b65..fefbf5c52a6 100644 --- a/frameworks/Java/inverno/src/main/java/module-info.java +++ b/frameworks/Java/inverno/src/main/java/module-info.java @@ -16,9 +16,9 @@ requires io.vertx.core; requires java.sql; - requires transitive io.netty.transport; - requires static io.netty.transport.unix.common; - requires static io.netty.transport.epoll; + //requires transitive io.netty.transport; + //requires static io.netty.transport.unix.common; + //requires static io.netty.transport.epoll; exports com.techempower.inverno.benchmark; exports com.techempower.inverno.benchmark.model; From d501c45e86a5794db06e679c0dcc441dadbfe78e Mon Sep 17 00:00:00 2001 From: TreeFrog Framework Date: Wed, 21 Feb 2024 05:05:21 +0900 Subject: [PATCH 137/210] Updated TreeFrog framework to v2.8 (#8729) * modified to use bulk-update query. * update * update * updated treefrog to version 2.8 * fix CI error of mysql. --- frameworks/C++/treefrog/models/world.cpp | 11 +++-------- frameworks/C++/treefrog/treefrog-epoll.dockerfile | 2 +- frameworks/C++/treefrog/treefrog-mongodb.dockerfile | 2 +- frameworks/C++/treefrog/treefrog-mysql.dockerfile | 2 +- frameworks/C++/treefrog/treefrog.dockerfile | 2 +- 5 files changed, 7 insertions(+), 12 deletions(-) diff --git a/frameworks/C++/treefrog/models/world.cpp b/frameworks/C++/treefrog/models/world.cpp index 13d65a7c97f..3c08e17e827 100644 --- a/frameworks/C++/treefrog/models/world.cpp +++ b/frameworks/C++/treefrog/models/world.cpp @@ -46,10 +46,7 @@ World &World::operator=(const World &other) bool World::update() { - TSqlQueryORMapper mapper; - mapper.prepare(QStringLiteral("UPDATE world SET randomNumber=? WHERE id=?")); - mapper.addBind(randomNumber()).addBind(id()); - return mapper.exec(); + return TAbstractModel::update(); } World World::create(int randomNumber) @@ -74,10 +71,8 @@ World World::create(const QVariantMap &values) World World::get(uint id) { - TSqlQueryORMapper mapper; - mapper.prepare(QStringLiteral("SELECT * from world WHERE id=?")); - mapper.addBind(id); - return World(mapper.execFirst()); + TSqlORMapper mapper; + return World(mapper.findByPrimaryKey(id)); } int World::count() diff --git a/frameworks/C++/treefrog/treefrog-epoll.dockerfile b/frameworks/C++/treefrog/treefrog-epoll.dockerfile index 0e962dc03be..9eb910f4e9d 100644 --- a/frameworks/C++/treefrog/treefrog-epoll.dockerfile +++ b/frameworks/C++/treefrog/treefrog-epoll.dockerfile @@ -2,7 +2,7 @@ FROM buildpack-deps:jammy ENV DEBIAN_FRONTEND noninteractive ENV DEBCONF_NOWARNINGS yes -ENV TFVER=2.7.1 +ENV TFVER=2.8.0 RUN apt-get update -yqq && apt-get upgrade -yq && \ apt-get install -yqq --no-install-recommends software-properties-common unzip wget libjemalloc-dev \ diff --git a/frameworks/C++/treefrog/treefrog-mongodb.dockerfile b/frameworks/C++/treefrog/treefrog-mongodb.dockerfile index c930ee9449a..df5a3694cdf 100644 --- a/frameworks/C++/treefrog/treefrog-mongodb.dockerfile +++ b/frameworks/C++/treefrog/treefrog-mongodb.dockerfile @@ -2,7 +2,7 @@ FROM buildpack-deps:jammy ENV DEBIAN_FRONTEND noninteractive ENV DEBCONF_NOWARNINGS yes -ENV TFVER=2.7.1 +ENV TFVER=2.8.0 RUN apt-get update -yqq && apt-get upgrade -yq && \ apt-get install -yqq --no-install-recommends software-properties-common unzip wget libjemalloc-dev \ diff --git a/frameworks/C++/treefrog/treefrog-mysql.dockerfile b/frameworks/C++/treefrog/treefrog-mysql.dockerfile index f0b263b6573..a9b6a7d4b2c 100644 --- a/frameworks/C++/treefrog/treefrog-mysql.dockerfile +++ b/frameworks/C++/treefrog/treefrog-mysql.dockerfile @@ -2,7 +2,7 @@ FROM buildpack-deps:jammy ENV DEBIAN_FRONTEND noninteractive ENV DEBCONF_NOWARNINGS yes -ENV TFVER=2.7.1 +ENV TFVER=2.8.0 RUN apt-get update -yqq && apt-get upgrade -yq && \ apt-get install -yqq --no-install-recommends software-properties-common unzip wget libjemalloc-dev \ diff --git a/frameworks/C++/treefrog/treefrog.dockerfile b/frameworks/C++/treefrog/treefrog.dockerfile index c930ee9449a..df5a3694cdf 100644 --- a/frameworks/C++/treefrog/treefrog.dockerfile +++ b/frameworks/C++/treefrog/treefrog.dockerfile @@ -2,7 +2,7 @@ FROM buildpack-deps:jammy ENV DEBIAN_FRONTEND noninteractive ENV DEBCONF_NOWARNINGS yes -ENV TFVER=2.7.1 +ENV TFVER=2.8.0 RUN apt-get update -yqq && apt-get upgrade -yq && \ apt-get install -yqq --no-install-recommends software-properties-common unzip wget libjemalloc-dev \ From 366cbcd234d510791a8b03286202fc01c7e14f92 Mon Sep 17 00:00:00 2001 From: itrofimow Date: Wed, 21 Feb 2024 00:05:29 +0400 Subject: [PATCH 138/210] [C++] [userver] Bump userver commit, switch to SAX-serialization, tune postgres a bit (#8737) --- .../C++/userver/userver-bare.dockerfile | 5 ++-- frameworks/C++/userver/userver.dockerfile | 5 ++-- .../bare/simple_connection.cpp | 13 +++++------ .../userver_benchmark/bare/simple_router.cpp | 10 ++++---- .../userver_benchmark/common/db_helpers.cpp | 21 +++++++++-------- .../userver_benchmark/common/db_helpers.hpp | 13 +++++++---- .../controllers/cached_queries/handler.cpp | 18 +++++++++------ .../controllers/cached_queries/handler.hpp | 9 ++++---- .../controllers/fortunes/handler.cpp | 2 +- .../controllers/json/handler.cpp | 19 +++++++++++---- .../controllers/json/handler.hpp | 11 ++++----- .../controllers/multiple_queries/handler.cpp | 20 ++++++++++------ .../controllers/multiple_queries/handler.hpp | 9 ++++---- .../controllers/single_query/handler.cpp | 20 +++++++++------- .../controllers/single_query/handler.hpp | 9 ++++---- .../controllers/updates/handler.cpp | 23 ++++++++++++------- .../controllers/updates/handler.hpp | 9 ++++---- 17 files changed, 125 insertions(+), 91 deletions(-) diff --git a/frameworks/C++/userver/userver-bare.dockerfile b/frameworks/C++/userver/userver-bare.dockerfile index 22d11c6c926..3fa955f2010 100644 --- a/frameworks/C++/userver/userver-bare.dockerfile +++ b/frameworks/C++/userver/userver-bare.dockerfile @@ -1,4 +1,4 @@ -FROM ghcr.io/userver-framework/ubuntu-userver-build-base:v1 AS builder +FROM ghcr.io/userver-framework/ubuntu-userver-build-base:v2 AS builder RUN apt update && \ apt install -y lsb-release wget software-properties-common gnupg && \ @@ -6,7 +6,8 @@ RUN apt update && \ WORKDIR /src RUN git clone https://github.com/userver-framework/userver.git && \ - cd userver && git checkout b85d540d7022e344f6fcf9fd467c67b046c961fe + cd userver && git checkout fcf0514be560f46740f8a654f2fdce5dc1cd450c + COPY userver_benchmark/ ./ RUN mkdir build && cd build && \ cmake -DUSERVER_IS_THE_ROOT_PROJECT=0 -DUSERVER_FEATURE_CRYPTOPP_BLAKE2=0 \ diff --git a/frameworks/C++/userver/userver.dockerfile b/frameworks/C++/userver/userver.dockerfile index f04c5d866f2..4a5ad789d7e 100644 --- a/frameworks/C++/userver/userver.dockerfile +++ b/frameworks/C++/userver/userver.dockerfile @@ -1,4 +1,4 @@ -FROM ghcr.io/userver-framework/ubuntu-userver-build-base:v1 AS builder +FROM ghcr.io/userver-framework/ubuntu-userver-build-base:v2 AS builder RUN apt update && \ apt install -y lsb-release wget software-properties-common gnupg && \ @@ -6,7 +6,8 @@ RUN apt update && \ WORKDIR /src RUN git clone https://github.com/userver-framework/userver.git && \ - cd userver && git checkout b85d540d7022e344f6fcf9fd467c67b046c961fe + cd userver && git checkout fcf0514be560f46740f8a654f2fdce5dc1cd450c + COPY userver_benchmark/ ./ RUN mkdir build && cd build && \ cmake -DUSERVER_IS_THE_ROOT_PROJECT=0 -DUSERVER_FEATURE_CRYPTOPP_BLAKE2=0 \ diff --git a/frameworks/C++/userver/userver_benchmark/bare/simple_connection.cpp b/frameworks/C++/userver/userver_benchmark/bare/simple_connection.cpp index 0f4e4b7f0a9..c9b5e46b3f6 100644 --- a/frameworks/C++/userver/userver_benchmark/bare/simple_connection.cpp +++ b/frameworks/C++/userver/userver_benchmark/bare/simple_connection.cpp @@ -79,19 +79,18 @@ class ResponseBuffers final { return; } - boost::container::small_vector - iovec(Size() * 2); + boost::container::small_vector io_vector( + Size() * 2); std::size_t index = 0; std::size_t total_size = 0; - for (const auto& response : responses_) { - iovec[index++] = {response.headers.data(), response.headers.size()}; - iovec[index++] = {response.body.data(), response.body.size()}; + for (auto& response : responses_) { + io_vector[index++] = {response.headers.data(), response.headers.size()}; + io_vector[index++] = {response.body.data(), response.body.size()}; total_size += response.headers.size() + response.body.size(); } - if (socket.SendAll(iovec.data(), iovec.size(), {}) != total_size) { + if (socket.SendAll(io_vector.data(), io_vector.size(), {}) != total_size) { throw std::runtime_error{"Socket closed by remote"}; } diff --git a/frameworks/C++/userver/userver_benchmark/bare/simple_router.cpp b/frameworks/C++/userver/userver_benchmark/bare/simple_router.cpp index 61e634a95c3..dd7cf60636a 100644 --- a/frameworks/C++/userver/userver_benchmark/bare/simple_router.cpp +++ b/frameworks/C++/userver/userver_benchmark/bare/simple_router.cpp @@ -52,32 +52,32 @@ SimpleResponse SimpleRouter::RouteRequest(std::string_view url) const { } if (StartsWith(url, kJsonUrlPrefix)) { - return {ToString(json::Handler::GetResponse()), kContentTypeJson}; + return {json::Handler::GetResponse(), kContentTypeJson}; } if (StartsWith(url, kSingleQueryUrlPrefix)) { - return {ToString(single_query_.GetResponse()), kContentTypeJson}; + return {single_query_.GetResponse(), kContentTypeJson}; } if (StartsWith(url, kMultipleQueriesUrlPrefix)) { const auto queries = db_helpers::ParseParamFromQuery( url.substr(kMultipleQueriesUrlPrefix.size()), "queries"); - return {ToString(multiple_queries_.GetResponse(queries)), kContentTypeJson}; + return {multiple_queries_.GetResponse(queries), kContentTypeJson}; } if (StartsWith(url, kUpdatesUrlPrefix)) { const auto queries = db_helpers::ParseParamFromQuery( url.substr(kMultipleQueriesUrlPrefix.size()), "queries"); - return {ToString(updates_.GetResponse(queries)), kContentTypeJson}; + return {updates_.GetResponse(queries), kContentTypeJson}; } if (StartsWith(url, kCachedQueriesUrlPrefix)) { const auto count = db_helpers::ParseParamFromQuery( url.substr(kCachedQueriesUrlPrefix.size()), "count"); - return {ToString(cached_queries_.GetResponse(count)), kContentTypeJson}; + return {cached_queries_.GetResponse(count), kContentTypeJson}; } if (StartsWith(url, kFortunesUrlPrefix)) { diff --git a/frameworks/C++/userver/userver_benchmark/common/db_helpers.cpp b/frameworks/C++/userver/userver_benchmark/common/db_helpers.cpp index 899a2aaa87c..5403c01bd14 100644 --- a/frameworks/C++/userver/userver_benchmark/common/db_helpers.cpp +++ b/frameworks/C++/userver/userver_benchmark/common/db_helpers.cpp @@ -3,7 +3,6 @@ #include #include -#include #include namespace userver_techempower::db_helpers { @@ -30,10 +29,21 @@ int ParseFromQueryVal(std::string_view query_val) { userver::storages::postgres::Query CreateNonLoggingQuery( std::string statement) { return userver::storages::postgres::Query{ - statement, std::nullopt /* name */, + std::move(statement), std::nullopt /* name */, userver::storages::postgres::Query::LogMode::kNameOnly}; } +void WriteToStream(const WorldTableRow& row, + userver::formats::json::StringBuilder& sb) { + userver::formats::json::StringBuilder::ObjectGuard obj{sb}; + + sb.Key("id"); + WriteToStream(row.id, sb); + + sb.Key("randomNumber"); + WriteToStream(row.random_number, sb); +} + int GenerateRandomId() { return userver::utils::RandRange(1, kMaxWorldRows + 1); } @@ -42,13 +52,6 @@ int GenerateRandomValue() { return userver::utils::RandRange(1, kMaxWorldRows + 1); } -userver::formats::json::Value Serialize( - const WorldTableRow& value, - userver::formats::serialize::To) { - return userver::formats::json::MakeObject("id", value.id, "randomNumber", - value.random_number); -} - int ParseParamFromQuery(const userver::server::http::HttpRequest& request, const std::string& name) { const auto& arg_str = request.GetArg(name); diff --git a/frameworks/C++/userver/userver_benchmark/common/db_helpers.hpp b/frameworks/C++/userver/userver_benchmark/common/db_helpers.hpp index a4325c3b0fa..abed0a41cb4 100644 --- a/frameworks/C++/userver/userver_benchmark/common/db_helpers.hpp +++ b/frameworks/C++/userver/userver_benchmark/common/db_helpers.hpp @@ -1,9 +1,12 @@ #pragma once #include +#include #include +#include #include #include +#include #include namespace userver_techempower::db_helpers { @@ -18,6 +21,9 @@ const userver::storages::postgres::Query kSelectRowQuery = constexpr auto kClusterHostType = userver::storages::postgres::ClusterHostType::kMaster; +constexpr userver::storages::postgres::CommandControl kDefaultPgCC{ + std::chrono::seconds{7}, std::chrono::seconds{7}}; + constexpr std::string_view kDbComponentName = "hello-world-db"; struct WorldTableRow final { @@ -25,13 +31,12 @@ struct WorldTableRow final { int random_number; }; +void WriteToStream(const WorldTableRow& row, + userver::formats::json::StringBuilder& sb); + int GenerateRandomId(); int GenerateRandomValue(); -userver::formats::json::Value Serialize( - const WorldTableRow& value, - userver::formats::serialize::To); - int ParseParamFromQuery(const userver::server::http::HttpRequest& request, const std::string& name); diff --git a/frameworks/C++/userver/userver_benchmark/controllers/cached_queries/handler.cpp b/frameworks/C++/userver/userver_benchmark/controllers/cached_queries/handler.cpp index 00b35f94434..305b429b8b8 100644 --- a/frameworks/C++/userver/userver_benchmark/controllers/cached_queries/handler.cpp +++ b/frameworks/C++/userver/userver_benchmark/controllers/cached_queries/handler.cpp @@ -1,28 +1,30 @@ #include "handler.hpp" -#include - #include +#include +#include + namespace userver_techempower::cached_queries { Handler::Handler(const userver::components::ComponentConfig& config, const userver::components::ComponentContext& context) - : userver::server::handlers::HttpHandlerJsonBase{config, context}, + : userver::server::handlers::HttpHandlerBase{config, context}, cache_{context.FindComponent()}, query_arg_name_{"count"} {} -userver::formats::json::Value Handler::HandleRequestJsonThrow( +std::string Handler::HandleRequestThrow( const userver::server::http::HttpRequest& request, - const userver::formats::json::Value&, userver::server::request::RequestContext&) const { const auto queries = db_helpers::ParseParamFromQuery(request, query_arg_name_); + request.GetHttpResponse().SetHeader(userver::http::headers::kContentType, + "application/json"); return GetResponse(queries); } -userver::formats::json::Value Handler::GetResponse(int queries) const { +std::string Handler::GetResponse(int queries) const { boost::container::small_vector result( queries); @@ -31,7 +33,9 @@ userver::formats::json::Value Handler::GetResponse(int queries) const { std::generate(result.begin(), result.end(), [&cache] { return cache.at(db_helpers::GenerateRandomId()); }); - return userver::formats::json::ValueBuilder{result}.ExtractValue(); + userver::formats::json::StringBuilder sb{}; + WriteToStream(result, sb); + return sb.GetString(); } } // namespace userver_techempower::cached_queries diff --git a/frameworks/C++/userver/userver_benchmark/controllers/cached_queries/handler.hpp b/frameworks/C++/userver/userver_benchmark/controllers/cached_queries/handler.hpp index ca286985a3e..dbc187cbd15 100644 --- a/frameworks/C++/userver/userver_benchmark/controllers/cached_queries/handler.hpp +++ b/frameworks/C++/userver/userver_benchmark/controllers/cached_queries/handler.hpp @@ -1,24 +1,23 @@ #pragma once -#include +#include #include "world_cache_component.hpp" namespace userver_techempower::cached_queries { -class Handler final : public userver::server::handlers::HttpHandlerJsonBase { +class Handler final : public userver::server::handlers::HttpHandlerBase { public: static constexpr std::string_view kName = "cached-queries-handler"; Handler(const userver::components::ComponentConfig& config, const userver::components::ComponentContext& context); - userver::formats::json::Value HandleRequestJsonThrow( + std::string HandleRequestThrow( const userver::server::http::HttpRequest& request, - const userver::formats::json::Value&, userver::server::request::RequestContext&) const final; - userver::formats::json::Value GetResponse(int queries) const; + std::string GetResponse(int queries) const; private: const WorldCacheComponent& cache_; diff --git a/frameworks/C++/userver/userver_benchmark/controllers/fortunes/handler.cpp b/frameworks/C++/userver/userver_benchmark/controllers/fortunes/handler.cpp index 4c7619bc86d..acdc0346eb1 100644 --- a/frameworks/C++/userver/userver_benchmark/controllers/fortunes/handler.cpp +++ b/frameworks/C++/userver/userver_benchmark/controllers/fortunes/handler.cpp @@ -147,7 +147,7 @@ std::string Handler::HandleRequestThrow( std::string Handler::GetResponse() const { const auto pg_result = [this] { const auto lock = semaphore_.Acquire(); - return pg_->Execute(db_helpers::kClusterHostType, + return pg_->Execute(db_helpers::kClusterHostType, db_helpers::kDefaultPgCC, select_all_fortunes_query_); }(); diff --git a/frameworks/C++/userver/userver_benchmark/controllers/json/handler.cpp b/frameworks/C++/userver/userver_benchmark/controllers/json/handler.cpp index 390acc7c0cd..fd1c18a6bf4 100644 --- a/frameworks/C++/userver/userver_benchmark/controllers/json/handler.cpp +++ b/frameworks/C++/userver/userver_benchmark/controllers/json/handler.cpp @@ -1,16 +1,25 @@ #include "handler.hpp" +#include +#include + namespace userver_techempower::json { -userver::formats::json::Value Handler::HandleRequestJsonThrow( - const userver::server::http::HttpRequest&, - const userver::formats::json::Value&, +std::string Handler::HandleRequestThrow( + const userver::server::http::HttpRequest& request, userver::server::request::RequestContext&) const { + request.GetHttpResponse().SetHeader(userver::http::headers::kContentType, + "application/json"); return GetResponse(); } -userver::formats::json::Value Handler::GetResponse() { - return userver::formats::json::MakeObject("message", "Hello, World!"); +std::string Handler::GetResponse() { + const auto json = + userver::formats::json::MakeObject("message", "Hello, World!"); + + userver::formats::json::StringBuilder sb{}; + sb.WriteValue(json); + return sb.GetString(); } } // namespace userver_techempower::json diff --git a/frameworks/C++/userver/userver_benchmark/controllers/json/handler.hpp b/frameworks/C++/userver/userver_benchmark/controllers/json/handler.hpp index 7771a94863b..224d9c457fe 100644 --- a/frameworks/C++/userver/userver_benchmark/controllers/json/handler.hpp +++ b/frameworks/C++/userver/userver_benchmark/controllers/json/handler.hpp @@ -1,21 +1,20 @@ #pragma once -#include +#include namespace userver_techempower::json { -class Handler final : public userver::server::handlers::HttpHandlerJsonBase { +class Handler final : public userver::server::handlers::HttpHandlerBase { public: static constexpr std::string_view kName = "json-handler"; - using HttpHandlerJsonBase::HttpHandlerJsonBase; + using HttpHandlerBase::HttpHandlerBase; - userver::formats::json::Value HandleRequestJsonThrow( + std::string HandleRequestThrow( const userver::server::http::HttpRequest&, - const userver::formats::json::Value&, userver::server::request::RequestContext&) const final; - static userver::formats::json::Value GetResponse(); + static std::string GetResponse(); }; } // namespace userver_techempower::json diff --git a/frameworks/C++/userver/userver_benchmark/controllers/multiple_queries/handler.cpp b/frameworks/C++/userver/userver_benchmark/controllers/multiple_queries/handler.cpp index 19438c0ae6b..685259f8934 100644 --- a/frameworks/C++/userver/userver_benchmark/controllers/multiple_queries/handler.cpp +++ b/frameworks/C++/userver/userver_benchmark/controllers/multiple_queries/handler.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -16,7 +17,7 @@ constexpr std::size_t kBestConcurrencyWildGuess = 256; Handler::Handler(const userver::components::ComponentConfig& config, const userver::components::ComponentContext& context) - : userver::server::handlers::HttpHandlerJsonBase{config, context}, + : userver::server::handlers::HttpHandlerBase{config, context}, pg_{context .FindComponent( db_helpers::kDbComponentName) @@ -24,17 +25,18 @@ Handler::Handler(const userver::components::ComponentConfig& config, query_arg_name_{"queries"}, semaphore_{kBestConcurrencyWildGuess} {} -userver::formats::json::Value Handler::HandleRequestJsonThrow( +std::string Handler::HandleRequestThrow( const userver::server::http::HttpRequest& request, - const userver::formats::json::Value&, userver::server::request::RequestContext&) const { const auto queries = db_helpers::ParseParamFromQuery(request, query_arg_name_); + request.GetHttpResponse().SetHeader(userver::http::headers::kContentType, + "application/json"); return GetResponse(queries); } -userver::formats::json::Value Handler::GetResponse(int queries) const { +std::string Handler::GetResponse(int queries) const { boost::container::small_vector result(queries); for (auto& value : result) { value.id = db_helpers::GenerateRandomId(); @@ -43,9 +45,11 @@ userver::formats::json::Value Handler::GetResponse(int queries) const { { const auto lock = semaphore_.Acquire(); - auto trx = pg_->Begin(db_helpers::kClusterHostType, {}); + auto trx = + pg_->Begin(db_helpers::kClusterHostType, {}, db_helpers::kDefaultPgCC); for (auto& value : result) { - value.random_number = trx.Execute(db_helpers::kSelectRowQuery, value.id) + value.random_number = trx.Execute(db_helpers::kDefaultPgCC, + db_helpers::kSelectRowQuery, value.id) .AsSingleRow( userver::storages::postgres::kRowTag) .random_number; @@ -53,7 +57,9 @@ userver::formats::json::Value Handler::GetResponse(int queries) const { trx.Commit(); } - return userver::formats::json::ValueBuilder{result}.ExtractValue(); + userver::formats::json::StringBuilder sb{}; + WriteToStream(result, sb); + return sb.GetString(); } } // namespace userver_techempower::multiple_queries diff --git a/frameworks/C++/userver/userver_benchmark/controllers/multiple_queries/handler.hpp b/frameworks/C++/userver/userver_benchmark/controllers/multiple_queries/handler.hpp index a96de194546..55d227cc5f6 100644 --- a/frameworks/C++/userver/userver_benchmark/controllers/multiple_queries/handler.hpp +++ b/frameworks/C++/userver/userver_benchmark/controllers/multiple_queries/handler.hpp @@ -2,24 +2,23 @@ #include "../../common/db_helpers.hpp" -#include +#include #include namespace userver_techempower::multiple_queries { -class Handler final : public userver::server::handlers::HttpHandlerJsonBase { +class Handler final : public userver::server::handlers::HttpHandlerBase { public: static constexpr std::string_view kName = "multiple-queries-handler"; Handler(const userver::components::ComponentConfig& config, const userver::components::ComponentContext& context); - userver::formats::json::Value HandleRequestJsonThrow( + std::string HandleRequestThrow( const userver::server::http::HttpRequest& request, - const userver::formats::json::Value&, userver::server::request::RequestContext&) const final; - userver::formats::json::Value GetResponse(int queries) const; + std::string GetResponse(int queries) const; private: const userver::storages::postgres::ClusterPtr pg_; diff --git a/frameworks/C++/userver/userver_benchmark/controllers/single_query/handler.cpp b/frameworks/C++/userver/userver_benchmark/controllers/single_query/handler.cpp index a6547041b83..3730af8c54a 100644 --- a/frameworks/C++/userver/userver_benchmark/controllers/single_query/handler.cpp +++ b/frameworks/C++/userver/userver_benchmark/controllers/single_query/handler.cpp @@ -1,6 +1,7 @@ #include "handler.hpp" #include +#include #include namespace userver_techempower::single_query { @@ -13,31 +14,34 @@ constexpr std::size_t kBestConcurrencyWildGuess = 256; Handler::Handler(const userver::components::ComponentConfig& config, const userver::components::ComponentContext& context) - : userver::server::handlers::HttpHandlerJsonBase{config, context}, + : userver::server::handlers::HttpHandlerBase{config, context}, pg_{context .FindComponent( db_helpers::kDbComponentName) .GetCluster()}, semaphore_{kBestConcurrencyWildGuess} {} -userver::formats::json::Value Handler::HandleRequestJsonThrow( - const userver::server::http::HttpRequest&, - const userver::formats::json::Value&, +std::string Handler::HandleRequestThrow( + const userver::server::http::HttpRequest& request, userver::server::request::RequestContext&) const { + request.GetHttpResponse().SetHeader(userver::http::headers::kContentType, + "application/json"); return GetResponse(); } -userver::formats::json::Value Handler::GetResponse() const { +std::string Handler::GetResponse() const { const auto row = [this] { const auto lock = semaphore_.Acquire(); return pg_ - ->Execute(db_helpers::kClusterHostType, db_helpers::kSelectRowQuery, - db_helpers::GenerateRandomId()) + ->Execute(db_helpers::kClusterHostType, db_helpers::kDefaultPgCC, + db_helpers::kSelectRowQuery, db_helpers::GenerateRandomId()) .AsSingleRow( userver::storages::postgres::kRowTag); }(); - return db_helpers::Serialize(row, {}); + userver::formats::json::StringBuilder sb{}; + WriteToStream(row, sb); + return sb.GetString(); } } // namespace userver_techempower::single_query diff --git a/frameworks/C++/userver/userver_benchmark/controllers/single_query/handler.hpp b/frameworks/C++/userver/userver_benchmark/controllers/single_query/handler.hpp index 1352d3c373a..1ae92801d3f 100644 --- a/frameworks/C++/userver/userver_benchmark/controllers/single_query/handler.hpp +++ b/frameworks/C++/userver/userver_benchmark/controllers/single_query/handler.hpp @@ -2,25 +2,24 @@ #include "../../common/db_helpers.hpp" -#include +#include #include namespace userver_techempower::single_query { -class Handler final : public userver::server::handlers::HttpHandlerJsonBase { +class Handler final : public userver::server::handlers::HttpHandlerBase { public: static constexpr std::string_view kName = "single-query-handler"; Handler(const userver::components::ComponentConfig& config, const userver::components::ComponentContext& context); - userver::formats::json::Value HandleRequestJsonThrow( + std::string HandleRequestThrow( const userver::server::http::HttpRequest&, - const userver::formats::json::Value&, userver::server::request::RequestContext&) const final; - userver::formats::json::Value GetResponse() const; + std::string GetResponse() const; private: const userver::storages::postgres::ClusterPtr pg_; diff --git a/frameworks/C++/userver/userver_benchmark/controllers/updates/handler.cpp b/frameworks/C++/userver/userver_benchmark/controllers/updates/handler.cpp index 4bf62bf645e..35c046b57df 100644 --- a/frameworks/C++/userver/userver_benchmark/controllers/updates/handler.cpp +++ b/frameworks/C++/userver/userver_benchmark/controllers/updates/handler.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -26,24 +27,25 @@ constexpr std::size_t kBestConcurrencyWildGuess = 128; Handler::Handler(const userver::components::ComponentConfig& config, const userver::components::ComponentContext& context) - : userver::server::handlers::HttpHandlerJsonBase{config, context}, + : userver::server::handlers::HttpHandlerBase{config, context}, pg_{context.FindComponent("hello-world-db") .GetCluster()}, query_arg_name_{"queries"}, update_query_{db_helpers::CreateNonLoggingQuery(kUpdateQueryStr)}, semaphore_{kBestConcurrencyWildGuess} {} -userver::formats::json::Value Handler::HandleRequestJsonThrow( +std::string Handler::HandleRequestThrow( const userver::server::http::HttpRequest& request, - const userver::formats::json::Value&, userver::server::request::RequestContext&) const { const auto queries = db_helpers::ParseParamFromQuery(request, query_arg_name_); + request.GetHttpResponse().SetHeader(userver::http::headers::kContentType, + "application/json"); return GetResponse(queries); } -userver::formats::json::Value Handler::GetResponse(int queries) const { +std::string Handler::GetResponse(int queries) const { // userver's PG doesn't accept boost::small_vector as an input, sadly std::vector values(queries); for (auto& value : values) { @@ -58,9 +60,11 @@ userver::formats::json::Value Handler::GetResponse(int queries) const { { const auto lock = semaphore_.Acquire(); - auto trx = pg_->Begin(db_helpers::kClusterHostType, {}); + auto trx = + pg_->Begin(db_helpers::kClusterHostType, {}, db_helpers::kDefaultPgCC); for (auto& value : values) { - value.random_number = trx.Execute(db_helpers::kSelectRowQuery, value.id) + value.random_number = trx.Execute(db_helpers::kDefaultPgCC, + db_helpers::kSelectRowQuery, value.id) .AsSingleRow( userver::storages::postgres::kRowTag) .random_number; @@ -74,11 +78,14 @@ userver::formats::json::Value Handler::GetResponse(int queries) const { value.random_number = db_helpers::GenerateRandomValue(); } - trx.ExecuteDecomposeBulk(update_query_, values, values.size()); + trx.ExecuteDecomposeBulk(db_helpers::kDefaultPgCC, update_query_, values, + values.size()); trx.Commit(); } - return userver::formats::json::ValueBuilder{values}.ExtractValue(); + userver::formats::json::StringBuilder sb{}; + WriteToStream(result, sb); + return sb.GetString(); } } // namespace userver_techempower::updates diff --git a/frameworks/C++/userver/userver_benchmark/controllers/updates/handler.hpp b/frameworks/C++/userver/userver_benchmark/controllers/updates/handler.hpp index 15d6d0d29b0..d2a70884aad 100644 --- a/frameworks/C++/userver/userver_benchmark/controllers/updates/handler.hpp +++ b/frameworks/C++/userver/userver_benchmark/controllers/updates/handler.hpp @@ -2,25 +2,24 @@ #include "../../common/db_helpers.hpp" -#include +#include #include #include namespace userver_techempower::updates { -class Handler final : public userver::server::handlers::HttpHandlerJsonBase { +class Handler final : public userver::server::handlers::HttpHandlerBase { public: static constexpr std::string_view kName = "updates-handler"; Handler(const userver::components::ComponentConfig& config, const userver::components::ComponentContext& context); - userver::formats::json::Value HandleRequestJsonThrow( + std::string HandleRequestThrow( const userver::server::http::HttpRequest& request, - const userver::formats::json::Value&, userver::server::request::RequestContext&) const final; - userver::formats::json::Value GetResponse(int queries) const; + std::string GetResponse(int queries) const; private: const userver::storages::postgres::ClusterPtr pg_; From 4031c05adac727db52f4b272113afcae921df116 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Tue, 20 Feb 2024 21:05:39 +0100 Subject: [PATCH 139/210] Mongodb update to v7.0 (#8716) --- toolset/databases/mongodb/mongodb.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toolset/databases/mongodb/mongodb.dockerfile b/toolset/databases/mongodb/mongodb.dockerfile index 1dc7f21cca7..4fe163b8070 100644 --- a/toolset/databases/mongodb/mongodb.dockerfile +++ b/toolset/databases/mongodb/mongodb.dockerfile @@ -1,4 +1,4 @@ -FROM mongo:6.0 +FROM mongo:7.0 ENV MONGO_INITDB_DATABASE=hello_world From 66714ec0b0106d9111e3df346466d6d43bc10363 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Tue, 20 Feb 2024 21:05:48 +0100 Subject: [PATCH 140/210] PostgreSQL update to v16 (#8714) * PostgreSQL update to v16 * Use debian 12 (Bookworm) --- toolset/databases/postgres/postgres.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toolset/databases/postgres/postgres.dockerfile b/toolset/databases/postgres/postgres.dockerfile index 836e4465e8b..bb0ca8aba05 100644 --- a/toolset/databases/postgres/postgres.dockerfile +++ b/toolset/databases/postgres/postgres.dockerfile @@ -1,4 +1,4 @@ -FROM postgres:15-bullseye +FROM postgres:16-bookworm ENV POSTGRES_USER=benchmarkdbuser ENV POSTGRES_PASSWORD=benchmarkdbpass From a4766e6a57ca835c170261a7bca1f752ea7222d0 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Tue, 20 Feb 2024 21:06:02 +0100 Subject: [PATCH 141/210] MySQL update to v8.3 (#8715) --- toolset/databases/mysql/mysql.dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/toolset/databases/mysql/mysql.dockerfile b/toolset/databases/mysql/mysql.dockerfile index 01a58b4234c..196085811a1 100644 --- a/toolset/databases/mysql/mysql.dockerfile +++ b/toolset/databases/mysql/mysql.dockerfile @@ -1,4 +1,4 @@ -FROM mysql:8.0 +FROM mysql:8.3 ENV MYSQL_ROOT_PASSWORD=root ENV MYSQL_USER=benchmarkdbuser From e0757ae57f3a1127498523e17db900e6b68b07b1 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Tue, 20 Feb 2024 21:06:12 +0100 Subject: [PATCH 142/210] Peachpie update to v1.0.25 (#8719) --- frameworks/PHP/peachpie/global.json | 2 +- frameworks/PHP/peachpie/peachpie.dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/PHP/peachpie/global.json b/frameworks/PHP/peachpie/global.json index 166cbe6e9b7..ea99fa32bb0 100644 --- a/frameworks/PHP/peachpie/global.json +++ b/frameworks/PHP/peachpie/global.json @@ -1,5 +1,5 @@ { "msbuild-sdks": { - "Peachpie.NET.Sdk": "1.0.0-preview5" + "Peachpie.NET.Sdk": "1.0.25" } } \ No newline at end of file diff --git a/frameworks/PHP/peachpie/peachpie.dockerfile b/frameworks/PHP/peachpie/peachpie.dockerfile index d8bd752611f..33a85981245 100644 --- a/frameworks/PHP/peachpie/peachpie.dockerfile +++ b/frameworks/PHP/peachpie/peachpie.dockerfile @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/sdk:7.0.100 AS build +FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build WORKDIR /app COPY . . RUN dotnet publish -c Release -o out Server From c4b21c47a0a9575165dbd004a14875460bc003a5 Mon Sep 17 00:00:00 2001 From: qicosmos Date: Wed, 21 Feb 2024 04:06:23 +0800 Subject: [PATCH 143/210] [C++]Update cinatra (#8718) * Create README.md * Create benchmark_config.json * Update README.md * Create cinatra.dockerfile * Create CMakeLists.txt * Create main.cpp * Update cinatra.dockerfile * Update CMakeLists.txt * Update README.md * Update README.md * Update cinatra.dockerfile * Update README.md * Update cinatra.dockerfile * fix path error in docker file This cause start failed * Update cinatra.dockerfile * Update cinatra.dockerfile * minor improve performance * update cinatra * update cmmmit id * update dir * revert dir * update config * update url * update * update --- frameworks/C++/cinatra/README.md | 4 +- frameworks/C++/cinatra/benchmark_config.json | 42 +++++++------- frameworks/C++/cinatra/cinatra.dockerfile | 19 ++----- .../cinatra/cinatra_benchmark/CMakeLists.txt | 57 +------------------ .../C++/cinatra/cinatra_benchmark/main.cpp | 24 +++----- 5 files changed, 40 insertions(+), 106 deletions(-) diff --git a/frameworks/C++/cinatra/README.md b/frameworks/C++/cinatra/README.md index df01ca2c237..cc965dfb351 100644 --- a/frameworks/C++/cinatra/README.md +++ b/frameworks/C++/cinatra/README.md @@ -1,10 +1,10 @@ # cinatra Benchmarking Test -cinatra is a high-performance, easy-to-use http framework developed in Modern C++ (C++17) with the goal of making it easy and quick to develop web applications using the C++ programming language, located at https://github.com/qicosmos/cinatra +cinatra is a high-performance, easy-to-use http framework developed in Modern C++ (C++20) with the goal of making it easy and quick to develop web applications using the C++ programming language, located at https://github.com/qicosmos/cinatra ## Testing Source Code -* [PLAINTEXT](cinatra_benchmark/main.cpp) +* [PLAINTEXT](example/benchmark.cpp) ## Test URLs diff --git a/frameworks/C++/cinatra/benchmark_config.json b/frameworks/C++/cinatra/benchmark_config.json index 9db843e9f98..ceba18e4486 100644 --- a/frameworks/C++/cinatra/benchmark_config.json +++ b/frameworks/C++/cinatra/benchmark_config.json @@ -1,23 +1,25 @@ { "framework": "cinatra", - "tests": [{ - "default": { - "plaintext_url": "/plaintext", - "port": 8090, - "approach": "Realistic", - "classification": "Fullstack", - "database": "None", - "framework": "cinatra", - "language": "C++", - "flavor": "None", - "orm": "None", - "platform": "None", - "webserver": "None", - "os": "Linux", - "database_os": "Linux", - "display_name": "cinatra", - "notes": "", - "versus": "cinatra" + "tests": [ + { + "default": { + "plaintext_url": "/plaintext", + "port": 8090, + "approach": "Realistic", + "classification": "Fullstack", + "database": "None", + "framework": "cinatra", + "language": "C++", + "flavor": "None", + "orm": "None", + "platform": "None", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "cinatra", + "notes": "", + "versus": "cinatra" + } } - }] -} + ] +} \ No newline at end of file diff --git a/frameworks/C++/cinatra/cinatra.dockerfile b/frameworks/C++/cinatra/cinatra.dockerfile index d3731c44673..fcda3f3b083 100644 --- a/frameworks/C++/cinatra/cinatra.dockerfile +++ b/frameworks/C++/cinatra/cinatra.dockerfile @@ -1,22 +1,11 @@ -FROM ubuntu:18.04 +FROM ubuntu:22.04 RUN apt-get update -yqq && \ apt-get install -yqq cmake git uuid-dev gcc g++ autoconf -ENV ASIO=/asio -ENV ASIO_INTERNAL=/asio/asio ENV CINATRA=/cinatra -ENV CINATRA_EXAMPLE=/cinatra/example -WORKDIR / -RUN git clone https://github.com/chriskohlhoff/asio.git -WORKDIR $ASIO -RUN git checkout 8087252a0c3c2f0baad96ddbd6554db17a846376 -WORKDIR $ASIO_INTERNAL -RUN ./autogen.sh && ./configure -RUN make && make install WORKDIR / RUN git clone https://github.com/qicosmos/cinatra.git WORKDIR $CINATRA -RUN git checkout 5acb35cd72c3f72512c0a55e7dea9e25d7779039 -WORKDIR $CINATRA_EXAMPLE -RUN mkdir build && cd build && cmake .. && make +RUN git checkout c9bec308e27174c8b7f0f01c92652509f7b47253 +RUN mkdir build && cd build && cmake .. && make -j EXPOSE 8090 -CMD ./build/cinatra_example +CMD ./build/example/benchmark \ No newline at end of file diff --git a/frameworks/C++/cinatra/cinatra_benchmark/CMakeLists.txt b/frameworks/C++/cinatra/cinatra_benchmark/CMakeLists.txt index 615d6fa46d1..8bd58c0c53e 100644 --- a/frameworks/C++/cinatra/cinatra_benchmark/CMakeLists.txt +++ b/frameworks/C++/cinatra/cinatra_benchmark/CMakeLists.txt @@ -5,61 +5,10 @@ include_directories($ENV{CINATRA_HOME}) if (MSVC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++latest") else () - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -pthread -msse4.2 -std=c++17") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O3 -pthread -std=c++20") endif () -SET(ENABLE_GZIP OFF) -SET(ENABLE_SSL OFF) -SET(ENABLE_CLIENT_SSL OFF) -SET(ENABLE_ASIO_STANDALONE ON) +add_executable(cinatra_example main.cpp) +target_compile_definitions(cinatra_example PRIVATE ASYNC_SIMPLE_HAS_NOT_AIO) -if (ENABLE_SSL) - add_definitions(-DCINATRA_ENABLE_SSL) - message(STATUS "Use SSL") -endif() - -if(ENABLE_GZIP) - add_definitions(-DCINATRA_ENABLE_GZIP) -endif() - -if(ENABLE_CLIENT_SSL) - add_definitions(-DCINATRA_ENABLE_CLIENT_SSL) -endif() - -if(ENABLE_ASIO_STANDALONE) - add_definitions(-DASIO_STANDALONE) -else() - find_package(Boost 1.60 REQUIRED COMPONENTS system) -endif() - -if (ENABLE_SSL) -find_package(OpenSSL REQUIRED) -endif() -if (ENABLE_CLIENT_SSL) - find_package(OpenSSL REQUIRED) -endif() - -if (ENABLE_GZIP) - find_package(ZLIB REQUIRED) -endif() - -set(CINATRA_EXAMPLE - main.cpp - ) - -add_executable(${project_name} ${CINATRA_EXAMPLE}) -include_directories(${Boost_INCLUDE_DIRS} ${OPENSSL_INCLUDE_DIR}) - -target_link_libraries(${project_name} ${Boost_LIBRARIES} uuid -lstdc++fs) -if (ENABLE_SSL) - target_link_libraries(${project_name} ${OPENSSL_LIBRARIES} pthread -ldl) -endif() - -if (ENABLE_CLIENT_SSL) - target_link_libraries(${project_name} ${OPENSSL_LIBRARIES} pthread -ldl) -endif() - -if (ENABLE_GZIP) - target_link_libraries(${project_name} ${ZLIB_LIBRARIES}) -endif() install(TARGETS ${project_name} DESTINATION include) diff --git a/frameworks/C++/cinatra/cinatra_benchmark/main.cpp b/frameworks/C++/cinatra/cinatra_benchmark/main.cpp index 6d4e3fa30e9..a7ee33a846f 100644 --- a/frameworks/C++/cinatra/cinatra_benchmark/main.cpp +++ b/frameworks/C++/cinatra/cinatra_benchmark/main.cpp @@ -1,21 +1,15 @@ -#include #include +#include using namespace cinatra; +using namespace std::chrono_literals; int main() { - http_server server(std::thread::hardware_concurrency()); - bool r = server.listen("0.0.0.0", "8090"); - if (!r) { - std::cout << "listen failed\n"; - return -1; - } - - server.enable_timeout(false); - server.set_http_handler("/plaintext", [](request& req, response& res) { - res.set_status_and_content("Hello, World!"); - }); - - server.run(); - return 0; + coro_http_server server(std::thread::hardware_concurrency(), 8090); + server.set_http_handler( + "/plaintext", [](coro_http_request &req, coro_http_response &resp) { + resp.need_date_head(false); + resp.set_status_and_content(status_type::ok, "Hello, world!"); + }); + server.sync_start(); } From a0bc288d4a1c0722d5e2fab72faf40c20d5e05ed Mon Sep 17 00:00:00 2001 From: Anton Kirilov Date: Tue, 20 Feb 2024 20:06:51 +0000 Subject: [PATCH 144/210] H2O: Use unlimited number of pipelined database queries (#8713) Also, update libpq to revision a37bb7c13. --- frameworks/C/h2o/h2o.dockerfile | 6 +----- frameworks/C/h2o/src/handlers/world.c | 14 +++++++++++--- frameworks/C/h2o/src/main.c | 4 ++-- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/frameworks/C/h2o/h2o.dockerfile b/frameworks/C/h2o/h2o.dockerfile index 8a04c410cac..93c5875472a 100644 --- a/frameworks/C/h2o/h2o.dockerfile +++ b/frameworks/C/h2o/h2o.dockerfile @@ -26,7 +26,6 @@ RUN apt-get -yqq update && \ libz-dev \ make \ ninja-build \ - patch \ pkg-config \ systemtap-sdt-dev @@ -54,13 +53,11 @@ RUN curl -LSs "https://github.com/x86-64/mustache-c/archive/${MUSTACHE_C_REVISIO CFLAGS="-flto -march=native -mtune=native -O3" ./autogen.sh && \ make -j "$(nproc)" install -ARG POSTGRESQL_VERSION=c1ec02be1d79eac95160dea7ced32ace84664617 +ARG POSTGRESQL_VERSION=a37bb7c13995b834095d9d064cad1023a6f99b10 WORKDIR /tmp/postgresql-build RUN curl -LSs "https://github.com/postgres/postgres/archive/${POSTGRESQL_VERSION}.tar.gz" | \ tar --strip-components=1 -xz && \ - curl -LSs "https://www.postgresql.org/message-id/attachment/152078/v5-0001-Add-PQsendPipelineSync-to-libpq.patch" | \ - patch -Np1 && \ CFLAGS="-flto -march=native -mtune=native -O3" ./configure \ --includedir=/usr/local/include/postgresql \ --prefix=/usr/local \ @@ -106,7 +103,6 @@ CMD ["taskset", \ "-a20", \ "-d", \ "dbname=hello_world host=tfb-database password=benchmarkdbpass sslmode=disable user=benchmarkdbuser", \ - "-e256", \ "-f", \ "/opt/h2o_app/share/h2o_app/template", \ "-m1"] diff --git a/frameworks/C/h2o/src/handlers/world.c b/frameworks/C/h2o/src/handlers/world.c index 0a7aaf1d813..5528ddb75c4 100644 --- a/frameworks/C/h2o/src/handlers/world.c +++ b/frameworks/C/h2o/src/handlers/world.c @@ -238,7 +238,7 @@ static int do_multiple_queries(bool do_update, bool use_cache, h2o_req_t *req) // MAX_QUERIES is a relatively small number, so assume no overflow in the following // arithmetic operations. - assert(num_query <= MAX_QUERIES); + assert(num_query && num_query <= MAX_QUERIES); size_t base_size = offsetof(multiple_query_ctx_t, res) + num_query * sizeof(query_result_t); @@ -246,8 +246,16 @@ static int do_multiple_queries(bool do_update, bool use_cache, h2o_req_t *req) base_size = base_size * _Alignof(query_param_t); const config_t * const config = ctx->global_thread_data->config; - const size_t num_query_in_progress = - MIN(num_query, config->max_db_conn_num * config->max_pipeline_query_num); + size_t num_query_in_progress = config->max_db_conn_num * config->max_pipeline_query_num; + + if (num_query_in_progress < config->max_db_conn_num || + num_query_in_progress < config->max_pipeline_query_num) + num_query_in_progress = num_query; + else + num_query_in_progress = MIN(num_query, num_query_in_progress); + + assert(num_query_in_progress); + size_t sz = base_size + num_query_in_progress * sizeof(query_param_t); if (do_update) { diff --git a/frameworks/C/h2o/src/main.c b/frameworks/C/h2o/src/main.c index db598523cce..f393b006542 100644 --- a/frameworks/C/h2o/src/main.c +++ b/frameworks/C/h2o/src/main.c @@ -176,10 +176,10 @@ static int parse_options(int argc, char *argv[], config_t *config) do { \ errno = 0; \ \ - const long long n = strtoll(optarg, NULL, 10); \ + const long n = strtol(optarg, NULL, 10); \ \ if (errno) { \ - print_library_error(__FILE__, __LINE__, "strtoll", errno); \ + print_library_error(__FILE__, __LINE__, "strtol", errno); \ return 1; \ } \ \ From 225e27c7d8a7b1effc03c6353bfdbe21a582231e Mon Sep 17 00:00:00 2001 From: fakeshadow <24548779@qq.com> Date: Wed, 21 Feb 2024 04:11:25 +0800 Subject: [PATCH 145/210] [xitca-web] update dep. (#8712) * [xitca-web] update dep. * ci fix. * fix axum build. --- frameworks/Rust/xitca-web/Cargo.lock | 206 +++++---------------- frameworks/Rust/xitca-web/Cargo.toml | 6 +- frameworks/Rust/xitca-web/src/main_axum.rs | 19 +- frameworks/Rust/xitca-web/src/main_sync.rs | 3 +- 4 files changed, 62 insertions(+), 172 deletions(-) diff --git a/frameworks/Rust/xitca-web/Cargo.lock b/frameworks/Rust/xitca-web/Cargo.lock index 5582939191f..865720c700c 100644 --- a/frameworks/Rust/xitca-web/Cargo.lock +++ b/frameworks/Rust/xitca-web/Cargo.lock @@ -19,9 +19,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "async-trait" -version = "0.1.75" +version = "0.1.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdf6721fb0140e4f897002dd086c06f6c27775df19cfe1fccb21181a48fd2c98" +checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" dependencies = [ "proc-macro2", "quote", @@ -45,9 +45,9 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "axum" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "202651474fe73c62d9e0a56c6133f7a0ff1dc1c8cf7a5b03381af2a26553ac9d" +checksum = "1236b4b292f6c4d6dc34604bb5120d85c3fe1d1aa596bd5cc52ca054d13e7b9e" dependencies = [ "async-trait", "axum-core", @@ -56,8 +56,6 @@ dependencies = [ "http", "http-body", "http-body-util", - "hyper", - "hyper-util", "itoa", "matchit", "memchr", @@ -70,7 +68,6 @@ dependencies = [ "serde_path_to_error", "serde_urlencoded", "sync_wrapper", - "tokio", "tower", "tower-layer", "tower-service", @@ -78,9 +75,9 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.4.1" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77cb22c689c44d4c07b0ab44ebc25d69d8ae601a2f28fb8d672d344178fa17aa" +checksum = "a15c63fd72d41492dc4f497196f5da1fb04fb7529e631d73630d1b491e47a2e3" dependencies = [ "async-trait", "bytes", @@ -113,9 +110,9 @@ dependencies = [ [[package]] name = "base64" -version = "0.21.5" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "bitflags" @@ -125,9 +122,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.1" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" [[package]] name = "block-buffer" @@ -167,9 +164,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "cpufeatures" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] @@ -190,7 +187,7 @@ version = "2.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62c6fcf842f17f8c78ecf7c81d75c5ce84436b41ee07e03f490fbb5f5a8731d8" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "byteorder", "diesel_derives", "itoa", @@ -230,12 +227,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - [[package]] name = "fallible-iterator" version = "0.2.0" @@ -275,27 +266,12 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "futures-channel" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" -dependencies = [ - "futures-core", -] - [[package]] name = "futures-core" version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" -[[package]] -name = "futures-sink" -version = "0.3.30" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" - [[package]] name = "futures-task" version = "0.3.30" @@ -326,9 +302,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", "libc", @@ -341,36 +317,11 @@ version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" -[[package]] -name = "h2" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31d030e59af851932b72ceebadf4a2b5986dba4c3b99dd2493f8273a0f151943" -dependencies = [ - "bytes", - "fnv", - "futures-core", - "futures-sink", - "futures-util", - "http", - "indexmap", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" - [[package]] name = "hermit-abi" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +checksum = "5d3d0e0f38255e7fa3cf31335b3a56f05febd18025f4db5ef7a0cfb4f8da651f" [[package]] name = "hmac" @@ -436,53 +387,6 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" -[[package]] -name = "hyper" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5aa53871fc917b1a9ed87b683a5d86db645e23acb32c2e0785a353e522fb75" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "hyper-util" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdea9aac0dbe5a9240d68cfd9501e2db94222c6dc06843e06640b9e07f0fdc67" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "pin-project-lite", - "socket2 0.5.5", - "tokio", - "tracing", -] - -[[package]] -name = "indexmap" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" -dependencies = [ - "equivalent", - "hashbrown", -] - [[package]] name = "io-uring" version = "0.5.13" @@ -507,9 +411,9 @@ checksum = "9028f49264629065d057f340a86acb84867925865f73bbf8d47b4d149a7e88b8" [[package]] name = "libc" -version = "0.2.151" +version = "0.2.152" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" +checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" [[package]] name = "lock_api" @@ -721,18 +625,18 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.71" +version = "1.0.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75cb1540fadbd5b8fbccc4dddad2734eba435053f725621c070711a14bb5f4b8" +checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.33" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] @@ -864,18 +768,18 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "serde" -version = "1.0.193" +version = "1.0.195" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.193" +version = "1.0.195" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" dependencies = [ "proc-macro2", "quote", @@ -884,9 +788,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.108" +version = "1.0.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4" dependencies = [ "itoa", "ryu", @@ -895,9 +799,9 @@ dependencies = [ [[package]] name = "serde_path_to_error" -version = "0.1.14" +version = "0.1.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4beec8bce849d58d06238cb50db2e1c417cfeafa4c63f692b15c82b7c80f8335" +checksum = "ebd154a240de39fdebcf5775d2675c204d7c13cf39a4c697be6493c8e734337c" dependencies = [ "itoa", "serde", @@ -946,9 +850,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.2" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" +checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" [[package]] name = "socket2" @@ -989,9 +893,9 @@ checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "syn" -version = "2.0.43" +version = "2.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee659fb5f3d355364e1f3e5bc10fb82068efbf824a1e9d1c9504244a6469ad53" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" dependencies = [ "proc-macro2", "quote", @@ -1026,7 +930,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104" dependencies = [ "backtrace", - "bytes", "libc", "mio", "num_cpus", @@ -1051,20 +954,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "tokio-util" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" -dependencies = [ - "bytes", - "futures-core", - "futures-sink", - "pin-project-lite", - "tokio", - "tracing", -] - [[package]] name = "tower" version = "0.4.13" @@ -1075,7 +964,6 @@ dependencies = [ "futures-util", "pin-project", "pin-project-lite", - "tokio", "tower-layer", "tower-service", "tracing", @@ -1083,11 +971,11 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09e12e6351354851911bdf8c2b8f2ab15050c567d70a8b9a37ae7b8301a4080d" +checksum = "0da193277a4e2c33e59e09b5861580c33dd0a637c3883d0fa74ba40c0374af2e" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "bytes", "http", "http-body", @@ -1137,9 +1025,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicode-bidi" -version = "0.3.14" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" @@ -1340,9 +1228,9 @@ dependencies = [ [[package]] name = "xitca-http" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5667ed780b72789d84460bd5e13a44f009d24914bf3f7a670239d32b98bce29c" +checksum = "23b15032fe8f95903c5d16d49dbf3e336c0fd7b558acc9ca385e992651b522b4" dependencies = [ "futures-core", "http", @@ -1390,9 +1278,9 @@ dependencies = [ [[package]] name = "xitca-router" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8696e96f1401baee0bc577bc4cfcdc5c6a90f0c183aa2cc011ecb60f1ae5b73e" +checksum = "687a3fb0a32b89524fab7d780d4cc66942b8ee6a493a7f2ff78384fe677b8e09" dependencies = [ "xitca-unsafe-collection", ] @@ -1449,14 +1337,14 @@ dependencies = [ "xitca-server", "xitca-service", "xitca-unsafe-collection", - "xitca-web 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "xitca-web 0.2.1", ] [[package]] name = "xitca-web" -version = "0.1.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ed23e2be4e1d6aa730af2646a933cbb8048de5f5549a5040672a95553f6df04" +checksum = "f26cb7ab5765524ce47a8c173e16a3184146440e3de3c240ba0d14a617b0f090" dependencies = [ "futures-core", "http-body", diff --git a/frameworks/Rust/xitca-web/Cargo.toml b/frameworks/Rust/xitca-web/Cargo.toml index bd4c7f8edbb..9627c09a692 100644 --- a/frameworks/Rust/xitca-web/Cargo.toml +++ b/frameworks/Rust/xitca-web/Cargo.toml @@ -51,7 +51,7 @@ io-uring = ["xitca-http/io-uring", "xitca-server/io-uring"] axum = ["dep:axum", "http-body", "tower", "tower-http", "xitca-web/tower-http-compat" ] [dependencies] -xitca-http = "0.1" +xitca-http = "0.2" xitca-io = "0.1" xitca-server = "0.1" xitca-service = "0.1" @@ -62,7 +62,7 @@ serde = { version = "1" } serde_json = { version = "1" } # web optional -xitca-web = { version = "0.1", features = ["json"], optional = true } +xitca-web = { version = "0.2", features = ["json"], optional = true } # raw-pg optional xitca-postgres = { version = "0.1", optional = true } @@ -74,7 +74,7 @@ diesel = { version = "2", features = ["postgres", "r2d2"], optional = true } sailfish = { version = "0.8", default-features = false, features = ["derive", "perf-inline"], optional = true } # axum optional -axum = { version = "0.7", optional = true } +axum = { version = "0.7", optional = true, default-features = false, features = ["json", "query"] } http-body = { version = "1", optional = true } tower = { version = "0.4", optional = true } tower-http = { version = "0.5", features = ["set-header"], optional = true } diff --git a/frameworks/Rust/xitca-web/src/main_axum.rs b/frameworks/Rust/xitca-web/src/main_axum.rs index 35b04729f9a..571732a897c 100644 --- a/frameworks/Rust/xitca-web/src/main_axum.rs +++ b/frameworks/Rust/xitca-web/src/main_axum.rs @@ -7,7 +7,6 @@ mod util; use std::sync::Arc; use axum::{ - body::Bytes, extract::{Json, Query, State}, http::{ header::{HeaderValue, SERVER}, @@ -77,7 +76,7 @@ struct Error(util::Error); impl IntoResponse for Error { fn into_response(self) -> Response { - let mut res = Bytes::new().into_response(); + let mut res = self.0.to_string().into_response(); *res.status_mut() = StatusCode::INTERNAL_SERVER_ERROR; res } @@ -85,9 +84,10 @@ impl IntoResponse for Error { // compat module between xitca-http and axum. mod tower_compat { - use std::{cell::RefCell, fmt, future::Future, marker::PhantomData, net::SocketAddr}; + use core::{cell::RefCell, fmt, future::Future, marker::PhantomData}; + + use std::net::SocketAddr; - use axum::extract::ConnectInfo; use http_body::Body; use xitca_http::{ bytes::Bytes, @@ -117,7 +117,7 @@ mod tower_compat { F: Fn() -> Fut + Send + Sync + Clone, Fut: Future>, S: tower::Service< - Request>>, + Request, ()>>, Response = Response, >, S::Error: fmt::Debug, @@ -139,7 +139,10 @@ mod tower_compat { impl Service>> for TowerHttp where - S: tower::Service>>, Response = Response>, + S: tower::Service< + Request, ()>>, + Response = Response, + >, { type Response = Response>; type Error = S::Error; @@ -149,9 +152,7 @@ mod tower_compat { req: Request>, ) -> Result { let (parts, ext) = req.into_parts(); - let info = ConnectInfo(*ext.socket_addr()); - let mut req = Request::from_parts(parts, CompatReqBody::new(ext)); - req.extensions_mut().insert(info); + let req = Request::from_parts(parts, CompatReqBody::new(ext, ())); let fut = self.service.borrow_mut().call(req); let (parts, body) = fut.await?.into_parts(); Ok(Response::from_parts(parts, CompatResBody::new(body))) diff --git a/frameworks/Rust/xitca-web/src/main_sync.rs b/frameworks/Rust/xitca-web/src/main_sync.rs index 942cbbbf436..e56f481c61d 100644 --- a/frameworks/Rust/xitca-web/src/main_sync.rs +++ b/frameworks/Rust/xitca-web/src/main_sync.rs @@ -16,7 +16,8 @@ use ser::Num; use util::{HandleResult, SERVER_HEADER_VALUE}; fn main() -> std::io::Result<()> { - App::with_state(db_diesel::create()?) + App::new() + .with_state(db_diesel::create()?) .at_typed(plaintext) .at_typed(json) .at_typed(db) From ee3bb5963f9de43df0c4df7b0f05b15e335ae711 Mon Sep 17 00:00:00 2001 From: Jonas Platte Date: Tue, 20 Feb 2024 21:11:39 +0100 Subject: [PATCH 146/210] Upgrade axum benchmark dependencies (#8660) * axum: Upgrade DB dependencies * axum: Remove unused Cargo feature * axum: Update Cargo.lock * axum: Upgrade rust version --- frameworks/Rust/axum/Cargo.lock | 1817 ++++++++++------- frameworks/Rust/axum/Cargo.toml | 8 +- .../Rust/axum/axum-mongo-raw.dockerfile | 2 +- frameworks/Rust/axum/axum-mongo.dockerfile | 2 +- frameworks/Rust/axum/axum-pg-pool.dockerfile | 2 +- frameworks/Rust/axum/axum-pg.dockerfile | 2 +- frameworks/Rust/axum/axum-sqlx.dockerfile | 2 +- frameworks/Rust/axum/axum.dockerfile | 2 +- frameworks/Rust/axum/src/database_sqlx.rs | 4 +- 9 files changed, 1083 insertions(+), 758 deletions(-) diff --git a/frameworks/Rust/axum/Cargo.lock b/frameworks/Rust/axum/Cargo.lock index 0c970c71e7b..dbda43b6d71 100644 --- a/frameworks/Rust/axum/Cargo.lock +++ b/frameworks/Rust/axum/Cargo.lock @@ -2,6 +2,15 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + [[package]] name = "adler" version = "1.0.2" @@ -10,24 +19,38 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.7.6" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" dependencies = [ + "cfg-if", "getrandom", "once_cell", "version_check", + "zerocopy", ] [[package]] name = "aho-corasick" -version = "0.7.20" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" dependencies = [ "memchr", ] +[[package]] +name = "allocator-api2" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + [[package]] name = "android_system_properties" version = "0.1.5" @@ -39,9 +62,9 @@ dependencies = [ [[package]] name = "annotate-snippets" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3b9d411ecbaf79885c6df4d75fff75858d5995ff25385657a28af47e82f9c36" +checksum = "ccaf7e9dfbb6ab22c82e473cd1a8a7bd313c19a5b7e40970f3d89ef5a5c9e81e" dependencies = [ "unicode-width", "yansi-term", @@ -49,24 +72,34 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.68" +version = "0.1.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842" +checksum = "fdf6721fb0140e4f897002dd086c06f6c27775df19cfe1fccb21181a48fd2c98" dependencies = [ "proc-macro2", "quote", - "syn 2.0.18", + "syn 2.0.42", ] [[package]] name = "atoi" -version = "1.0.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c57d12312ff59c811c0643f4d80830505833c9ffaebd193d819392b265be8e" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" 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" @@ -77,7 +110,7 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" name = "axum" version = "0.2.0" dependencies = [ - "axum 0.6.18", + "axum 0.6.20", "deadpool", "deadpool-postgres", "dotenv", @@ -101,16 +134,15 @@ dependencies = [ [[package]] name = "axum" -version = "0.6.18" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8175979259124331c1d7bf6586ee7e0da434155e4b2d48ec2c8386281d8df39" +checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" dependencies = [ "async-trait", "axum-core", "bitflags 1.3.2", "bytes", "futures-util", - "headers", "http", "http-body", "hyper", @@ -149,12 +181,39 @@ dependencies = [ "tower-service", ] +[[package]] +name = "backtrace" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + [[package]] name = "base64" version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" +[[package]] +name = "base64" +version = "0.21.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" + +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + [[package]] name = "bitflags" version = "1.3.2" @@ -166,60 +225,78 @@ name = "bitflags" version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +dependencies = [ + "serde", +] + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] [[package]] name = "block-buffer" -version = "0.10.3" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ "generic-array", ] [[package]] name = "bson" -version = "2.4.0" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d76085681585d39016f4d3841eb019201fc54d2dd0d92ad1e4fab3bfb32754" +checksum = "88c18b51216e1f74b9d769cead6ace2f82b965b807e3d73330aabe9faec31c84" dependencies = [ "ahash", - "base64", + "base64 0.13.1", + "bitvec", "hex", - "indexmap", - "lazy_static", + "indexmap 1.9.3", + "js-sys", + "once_cell", "rand", "serde", "serde_bytes", "serde_json", - "time 0.3.17", - "uuid 1.2.2", + "time", + "uuid", ] [[package]] name = "bumpalo" -version = "3.12.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" +checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.3.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfb24e866b15a1af2a1b663f10c6b6b8f397a84aadb828f12e5b289ec23a3a3c" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "cc" -version = "1.0.77" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9f73505338f7d905b19d18738976aae232eb46b8efc15554ffc56deb5d9ebe4" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" dependencies = [ "jobserver", + "libc", ] [[package]] @@ -230,28 +307,21 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.23" +version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b0a3d9ed01224b22057780a37bb8c5dbfe1be8ba48678e7bf57ec4b385411f" +checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" dependencies = [ + "android-tzdata", "iana-time-zone", - "js-sys", - "num-integer", "num-traits", - "time 0.1.45", - "wasm-bindgen", - "winapi", + "windows-targets 0.48.5", ] [[package]] -name = "codespan-reporting" -version = "0.11.1" +name = "const-oid" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" -dependencies = [ - "termcolor", - "unicode-width", -] +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "convert_case" @@ -261,9 +331,9 @@ checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -271,33 +341,33 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.3" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "cpufeatures" -version = "0.2.5" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" +checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" dependencies = [ "libc", ] [[package]] name = "crc" -version = "3.0.0" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53757d12b596c16c78b83458d732a5d1a17ab3f53f2f7412f6fb57cc8a140ab3" +checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe" dependencies = [ "crc-catalog", ] [[package]] name = "crc-catalog" -version = "2.1.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d0165d2900ae6778e36e80bbc4da3b5eefccee9ba939761f9c2882a5d9af3ff" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] name = "crc32fast" @@ -310,9 +380,9 @@ dependencies = [ [[package]] name = "crossbeam-queue" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +checksum = "b9bcf5bdbfdd6030fb4a1c497b5d5fc5921aa2f60d359a17e249c0e6df3de153" dependencies = [ "cfg-if", "crossbeam-utils", @@ -320,9 +390,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.14" +version = "0.8.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" +checksum = "c06d96137f14f244c37f989d9fff8f95e6c18b918e71f36638f8c49112e4c78f" dependencies = [ "cfg-if", ] @@ -337,50 +407,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "cxx" -version = "1.0.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdf07d07d6531bfcdbe9b8b739b104610c6508dcc4d63b410585faf338241daf" -dependencies = [ - "cc", - "cxxbridge-flags", - "cxxbridge-macro", - "link-cplusplus", -] - -[[package]] -name = "cxx-build" -version = "1.0.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2eb5b96ecdc99f72657332953d4d9c50135af1bac34277801cc3937906ebd39" -dependencies = [ - "cc", - "codespan-reporting", - "once_cell", - "proc-macro2", - "quote", - "scratch", - "syn 1.0.105", -] - -[[package]] -name = "cxxbridge-flags" -version = "1.0.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac040a39517fd1674e0f32177648334b0f4074625b5588a64519804ba0553b12" - -[[package]] -name = "cxxbridge-macro" -version = "1.0.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1362b0ddcfc4eb0a1f57b68bd77dd99f0e826958a96abd0ae9bd092e114ffed6" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.105", -] - [[package]] name = "darling" version = "0.13.4" @@ -402,7 +428,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 1.0.105", + "syn 1.0.109", ] [[package]] @@ -413,50 +439,69 @@ checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" dependencies = [ "darling_core", "quote", - "syn 1.0.105", + "syn 1.0.109", ] [[package]] name = "data-encoding" -version = "2.3.3" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d8666cb01533c39dde32bcbab8e227b4ed6679b2c925eba05feabea39508fb" +checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" [[package]] name = "deadpool" -version = "0.9.5" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "421fe0f90f2ab22016f32a9881be5134fdd71c65298917084b0c7477cbc3856e" +checksum = "fb84100978c1c7b37f09ed3ce3e5f843af02c2a2c431bae5b19230dad2c1b490" dependencies = [ "async-trait", "deadpool-runtime", "num_cpus", - "retain_mut", "serde", "tokio", ] [[package]] name = "deadpool-postgres" -version = "0.10.3" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e866e414e9e12fc988f0bfb89a0b86228e7ed196ca509fbc4dcbc738c56e753c" +checksum = "bda39fa1cfff190d8924d447ad04fd22772c250438ca5ce1dfb3c80621c05aaa" dependencies = [ "deadpool", - "log", "tokio", "tokio-postgres", + "tracing", ] [[package]] name = "deadpool-runtime" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaa37046cc0f6c3cc6090fbdbf73ef0b8ef4cfcc37f6befc0020f63e8cf121e1" +checksum = "63dfa964fe2a66f3fde91fc70b267fe193d822c7e603e2a675a49a7f46ad3f49" dependencies = [ "tokio", ] +[[package]] +name = "der" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" +dependencies = [ + "const-oid", + "pem-rfc7468", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eb30d70a07a3b04884d2677f06bec33509dc67ca60d92949e5535352d3191dc" +dependencies = [ + "powerfmt", +] + [[package]] name = "derivative" version = "2.2.0" @@ -465,7 +510,7 @@ checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" dependencies = [ "proc-macro2", "quote", - "syn 1.0.105", + "syn 1.0.109", ] [[package]] @@ -478,40 +523,21 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.0", - "syn 1.0.105", + "syn 1.0.109", ] [[package]] name = "digest" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", + "const-oid", "crypto-common", "subtle", ] -[[package]] -name = "dirs" -version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - [[package]] name = "dotenv" version = "0.15.0" @@ -520,21 +546,24 @@ checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" [[package]] name = "dotenvy" -version = "0.15.6" +version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03d8c417d7a8cb362e0c37e5d815f5eb7c37f79ff93707329d5a194e42e54ca0" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" [[package]] name = "dtoa" -version = "1.0.4" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8a6eee2d5d0d113f015688310da018bd1d864d86bd567c8fca9c266889e1bfa" +checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" [[package]] name = "either" -version = "1.8.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" +checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +dependencies = [ + "serde", +] [[package]] name = "enum-as-inner" @@ -545,7 +574,34 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 1.0.105", + "syn 1.0.109", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "etcetera" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" +dependencies = [ + "cfg-if", + "home", + "windows-sys 0.48.0", ] [[package]] @@ -562,23 +618,37 @@ checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7" [[package]] name = "fastrand" -version = "1.8.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" -dependencies = [ - "instant", -] +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" + +[[package]] +name = "finl_unicode" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" [[package]] name = "flate2" -version = "1.0.25" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8a2db397cb1c8772f31494cb8917e48cd1e64f0fa7efac59fbd741a0a8ce841" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" dependencies = [ "crc32fast", "miniz_oxide", ] +[[package]] +name = "flume" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" +dependencies = [ + "futures-core", + "futures-sink", + "spin 0.9.8", +] + [[package]] name = "fnv" version = "1.0.7" @@ -602,18 +672,24 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.1.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "futures" -version = "0.3.25" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38390104763dc37a5145a53c29c63c1290b5d316d6086ec32c293f6736051bb0" +checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" dependencies = [ "futures-channel", "futures-core", @@ -626,9 +702,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.25" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ba265a92256105f45b719605a571ffe2d1f0fea3807304b522c1d778f79eed" +checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" dependencies = [ "futures-core", "futures-sink", @@ -636,15 +712,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.25" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac" +checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" [[package]] name = "futures-executor" -version = "0.3.25" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7acc85df6714c176ab5edf386123fafe217be88c0840ec11f199441134a074e2" +checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" dependencies = [ "futures-core", "futures-task", @@ -653,49 +729,49 @@ dependencies = [ [[package]] name = "futures-intrusive" -version = "0.4.2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a604f7a68fbf8103337523b1fadc8ade7361ee3f112f7c680ad179651616aed5" +checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" dependencies = [ "futures-core", "lock_api", - "parking_lot 0.11.2", + "parking_lot", ] [[package]] name = "futures-io" -version = "0.3.25" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00f5fb52a06bdcadeb54e8d3671f8888a39697dcb0b81b23b55174030427f4eb" +checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" [[package]] name = "futures-macro" -version = "0.3.25" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdfb8ce053d86b91919aad980c220b1fb8401a9394410e1c289ed7e66b61835d" +checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" dependencies = [ "proc-macro2", "quote", - "syn 1.0.105", + "syn 2.0.42", ] [[package]] name = "futures-sink" -version = "0.3.25" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39c15cf1a4aa79df40f1bb462fb39676d0ad9e366c2a33b590d7c66f4f81fcf9" +checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" [[package]] name = "futures-task" -version = "0.3.25" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ffb393ac5d9a6eaa9d3fdf37ae2776656b706e200c8e16b1bdb227f5198e6ea" +checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" [[package]] name = "futures-util" -version = "0.3.25" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "197676987abd2f9cadff84926f410af1c183608d36641465df73ae8211dc65d6" +checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" dependencies = [ "futures-channel", "futures-core", @@ -711,9 +787,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.6" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", @@ -721,75 +797,60 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.8" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" dependencies = [ "cfg-if", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", ] [[package]] -name = "hashbrown" -version = "0.12.3" +name = "gimli" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash", -] +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] -name = "hashlink" -version = "0.8.1" +name = "hashbrown" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69fe1fcf8b4278d860ad0548329f892a3631fb63f82574df68275f34cdbe0ffa" -dependencies = [ - "hashbrown", -] +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] -name = "headers" -version = "0.3.8" +name = "hashbrown" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3e372db8e5c0d213e0cd0b9be18be2aca3d44cf2fe30a9d46a65581cd454584" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" dependencies = [ - "base64", - "bitflags 1.3.2", - "bytes", - "headers-core", - "http", - "httpdate", - "mime", - "sha1", + "ahash", + "allocator-api2", ] [[package]] -name = "headers-core" -version = "0.2.0" +name = "hashlink" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7f66481bfee273957b1f20485a4ff3362987f85b2c236580d81b4eb7a326429" +checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" dependencies = [ - "http", + "hashbrown 0.14.3", ] [[package]] name = "heck" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" dependencies = [ "unicode-segmentation", ] [[package]] name = "hermit-abi" -version = "0.1.19" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] +checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" [[package]] name = "hex" @@ -799,9 +860,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "hkdf" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" dependencies = [ "hmac", ] @@ -815,6 +876,15 @@ dependencies = [ "digest", ] +[[package]] +name = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "hostname" version = "0.3.1" @@ -828,9 +898,9 @@ dependencies = [ [[package]] name = "http" -version = "0.2.9" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" dependencies = [ "bytes", "fnv", @@ -839,9 +909,9 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", "http", @@ -850,9 +920,9 @@ dependencies = [ [[package]] name = "http-range-header" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bfe8eed0a9285ef776bb792479ea3834e8b94e13d615c2f66d03dd50a435a29" +checksum = "add0ab9360ddbd88cfeb3bd9574a1d85cfdfa14db10b3e21d3700dbc4328758f" [[package]] name = "httparse" @@ -862,15 +932,15 @@ checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" [[package]] name = "httpdate" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] name = "hyper" -version = "0.14.26" +version = "0.14.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" +checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" dependencies = [ "bytes", "futures-channel", @@ -882,7 +952,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2", + "socket2 0.5.5", "tokio", "tower-service", "tracing", @@ -891,26 +961,25 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.53" +version = "0.1.58" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64c122667b287044802d6ce17ee2ddf13207ed924c712de9a66a5814d5b64765" +checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "winapi", + "windows-core", ] [[package]] name = "iana-time-zone-haiku" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" dependencies = [ - "cxx", - "cxx-build", + "cc", ] [[package]] @@ -932,9 +1001,9 @@ dependencies = [ [[package]] name = "idna" -version = "0.3.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -942,70 +1011,71 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.9.2" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", - "hashbrown", + "hashbrown 0.12.3", ] [[package]] -name = "instant" -version = "0.1.12" +name = "indexmap" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" dependencies = [ - "cfg-if", + "equivalent", + "hashbrown 0.14.3", ] [[package]] name = "ipconfig" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd302af1b90f2463a98fa5ad469fc212c8e3175a41c3068601bfa2727591c5be" +checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" dependencies = [ - "socket2", + "socket2 0.5.5", "widestring", - "winapi", + "windows-sys 0.48.0", "winreg", ] [[package]] name = "ipnet" -version = "2.7.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11b0d96e660696543b251e58030cf9787df56da39dab19ad60eae7353040917e" +checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "itertools" -version = "0.10.5" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +checksum = "25db6b064527c5d482d0423354fcd07a89a2dfe07b67892e62411946db7f07b0" dependencies = [ "either", ] [[package]] name = "itoa" -version = "1.0.6" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "jobserver" -version = "0.1.25" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "068b1ee6743e4d11fb9c6a1e6064b3693a1b600e7f5f5988047d98b3dc9fb90b" +checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" dependencies = [ "libc", ] [[package]] name = "js-sys" -version = "0.3.60" +version = "0.3.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" +checksum = "cee9c64da59eae3b50095c18d3e74f8b73c0b86d2792824ff01bbce68ba229ca" dependencies = [ "wasm-bindgen", ] @@ -1015,20 +1085,31 @@ name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +dependencies = [ + "spin 0.5.2", +] [[package]] name = "libc" -version = "0.2.138" +version = "0.2.151" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db6d7e329c562c5dfab7a46a2afabc8b987ab9a4834c9d1ca04dc54c1546cef8" +checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4" [[package]] -name = "link-cplusplus" -version = "1.0.7" +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "libsqlite3-sys" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9272ab7b96c9046fbc5bc56c06c117cb639fe2d509df0c421cad82d2915cf369" +checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716" dependencies = [ "cc", + "pkg-config", + "vcpkg", ] [[package]] @@ -1037,11 +1118,17 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" +[[package]] +name = "linux-raw-sys" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456" + [[package]] name = "lock_api" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" dependencies = [ "autocfg", "scopeguard", @@ -1049,12 +1136,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.17" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "lru-cache" @@ -1073,36 +1157,37 @@ checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" [[package]] name = "matches" -version = "0.1.9" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" [[package]] name = "matchit" -version = "0.7.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b87248edafb776e59e6ee64a79086f65890d3510f2c656c000bf2a7e8a0aea40" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" [[package]] name = "md-5" -version = "0.10.5" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6365506850d44bff6e2fbcb5176cf63650e48bd45ef2fe2665ae1570e0f4b9ca" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" dependencies = [ + "cfg-if", "digest", ] [[package]] name = "memchr" -version = "2.5.0" +version = "2.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" [[package]] name = "mime" -version = "0.3.16" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "minimal-lexical" @@ -1112,46 +1197,46 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.6.2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" dependencies = [ "adler", ] [[package]] name = "mio" -version = "0.8.5" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de" +checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" dependencies = [ "libc", - "log", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.42.0", + "wasi", + "windows-sys 0.48.0", ] [[package]] name = "mongodb" -version = "2.3.1" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5a1df476ac9541b0e4fdc8e2cc48884e66c92c933cd17a1fd75e68caf75752e" +checksum = "46c30763a5c6c52079602be44fa360ca3bfacee55fca73f4734aecd23706a7f2" dependencies = [ "async-trait", - "base64", + "base64 0.13.1", "bitflags 1.3.2", "bson", "chrono", "derivative", + "derive_more", "flate2", "futures-core", "futures-executor", + "futures-io", "futures-util", "hex", "hmac", "lazy_static", "md-5", - "os_info", "pbkdf2", "percent-encoding", "rand", @@ -1164,7 +1249,7 @@ dependencies = [ "sha-1", "sha2", "snap", - "socket2", + "socket2 0.4.10", "stringprep", "strsim", "take_mut", @@ -1175,7 +1260,7 @@ dependencies = [ "trust-dns-proto", "trust-dns-resolver", "typed-builder", - "uuid 0.8.2", + "uuid", "webpki-roots", "zstd", ] @@ -1199,17 +1284,45 @@ dependencies = [ ] [[package]] -name = "nom" -version = "7.1.1" +name = "nix" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" +checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" dependencies = [ - "memchr", - "minimal-lexical", + "bitflags 2.4.1", + "cfg-if", + "libc", ] [[package]] -name = "num-integer" +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "num-bigint-dig" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" +dependencies = [ + "byteorder", + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand", + "smallvec", + "zeroize", +] + +[[package]] +name = "num-integer" version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" @@ -1218,36 +1331,57 @@ dependencies = [ "num-traits", ] +[[package]] +name = "num-iter" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" dependencies = [ "autocfg", + "libm", ] [[package]] name = "num_cpus" -version = "1.14.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6058e64324c71e02bc2b150e4f3bc8286db6c83092132ffa3f6b1eab0f9def5" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ "hermit-abi", "libc", ] +[[package]] +name = "object" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +dependencies = [ + "memchr", +] + [[package]] name = "once_cell" -version = "1.16.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "openssl" -version = "0.10.60" +version = "0.10.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79a4c6c3a2b158f7f8f2a2fc5a969fa3a068df6fc9dbb4a43845436e3af7c800" +checksum = "6b8419dc8cc6d866deb801274bba2e6f8f6108c1bb7fcc10ee5ab864931dbb45" dependencies = [ "bitflags 2.4.1", "cfg-if", @@ -1260,13 +1394,13 @@ dependencies = [ [[package]] name = "openssl-macros" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 1.0.105", + "syn 2.0.42", ] [[package]] @@ -1277,9 +1411,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.96" +version = "0.9.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3812c071ba60da8b5677cc12bcb1d42989a65553772897a7e0355545a819838f" +checksum = "c3eaad34cdd97d81de97964fc7f29e2d104f483840d906ef56daa1912338460b" dependencies = [ "cc", "libc", @@ -1287,27 +1421,6 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "os_info" -version = "3.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4750134fb6a5d49afc80777394ad5d95b04bc12068c6abb92fae8f43817270f" -dependencies = [ - "log", - "winapi", -] - -[[package]] -name = "parking_lot" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" -dependencies = [ - "instant", - "lock_api", - "parking_lot_core 0.8.5", -] - [[package]] name = "parking_lot" version = "0.12.1" @@ -1315,100 +1428,95 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ "lock_api", - "parking_lot_core 0.9.5", + "parking_lot_core", ] [[package]] name = "parking_lot_core" -version = "0.8.5" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d76e8e1493bcac0d2766c42737f34458f1c8c50c0d23bcb24ea953affb273216" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ "cfg-if", - "instant", "libc", "redox_syscall", "smallvec", - "winapi", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ff9f3fef3968a3ec5945535ed654cb38ff72d7495a25619e2247fb15a2ed9ba" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-sys 0.42.0", + "windows-targets 0.48.5", ] [[package]] name = "paste" -version = "1.0.9" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1de2e551fb905ac83f73f7aedf2f0cb4a0da7e35efa24a202a936269f1f18e1" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" [[package]] name = "pbkdf2" -version = "0.10.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271779f35b581956db91a3e55737327a03aa051e90b1c47aeb189508533adfd7" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" dependencies = [ "digest", ] +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "phf" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "928c6535de93548188ef63bb7c4036bd415cd8f36ad25af44b9789b2ee72a48c" +checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" dependencies = [ "phf_shared", ] [[package]] name = "phf_shared" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1fb5f6f826b772a8d4c0394209441e7d37cbbb967ae9c7e0e8134365c9ee676" +checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" dependencies = [ "siphasher", ] [[package]] name = "pin-project" -version = "1.0.12" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc" +checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.0.12" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55" +checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 1.0.105", + "syn 2.0.42", ] [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" [[package]] name = "pin-utils" @@ -1416,19 +1524,40 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "pkcs1" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + [[package]] name = "pkg-config" -version = "0.3.26" +version = "0.3.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" +checksum = "69d3587f8a9e599cc7ec2c00e331f71c4e69a5f9a4b8a6efd5b07466b9736f9a" [[package]] name = "postgres-protocol" -version = "0.6.4" +version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "878c6cbf956e03af9aa8204b407b9cbf47c072164800aa918c516cd4b056c50c" +checksum = "49b6c5ef183cd3ab4ba005f1ca64c21e8bd97ce4699cfea9e8d9a2c4958ca520" dependencies = [ - "base64", + "base64 0.21.5", "byteorder", "bytes", "fallible-iterator", @@ -1442,15 +1571,21 @@ dependencies = [ [[package]] name = "postgres-types" -version = "0.2.4" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73d946ec7d256b04dfadc4e6a3292324e6f417124750fc5c0950f981b703a0f1" +checksum = "8d2234cdee9408b523530a9b6d2d6b373d1db34f6a8e51dc03ded1828d7fb67c" dependencies = [ "bytes", "fallible-iterator", "postgres-protocol", ] +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -1459,19 +1594,19 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "prettyplease" -version = "0.1.21" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c142c0e46b57171fe0c528bee8c5b7569e80f0c17e377cd0e30ea57dbc11bb51" +checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" dependencies = [ "proc-macro2", - "syn 1.0.105", + "syn 1.0.109", ] [[package]] name = "proc-macro2" -version = "1.0.60" +version = "1.0.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dec2b086b7a862cf4de201096214fa870344cf922b2b30c167badb3af3195406" +checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b" dependencies = [ "unicode-ident", ] @@ -1484,13 +1619,19 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" -version = "1.0.28" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" +checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" dependencies = [ "proc-macro2", ] +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "rand" version = "0.8.5" @@ -1523,29 +1664,30 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.16" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ "bitflags 1.3.2", ] [[package]] -name = "redox_users" -version = "0.4.3" +name = "regex" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" dependencies = [ - "getrandom", - "redox_syscall", - "thiserror", + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", ] [[package]] -name = "regex" -version = "1.7.0" +name = "regex-automata" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a" +checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" dependencies = [ "aho-corasick", "memchr", @@ -1554,18 +1696,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.28" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" - -[[package]] -name = "remove_dir_all" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" -dependencies = [ - "winapi", -] +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "resolv-conf" @@ -1577,27 +1710,46 @@ dependencies = [ "quick-error", ] -[[package]] -name = "retain_mut" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4389f1d5789befaf6029ebd9f7dac4af7f7e3d61b69d4f30e2ac02b57e7712b0" - [[package]] name = "ring" -version = "0.16.20" +version = "0.17.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +checksum = "688c63d65483050968b2a8937f7995f443e27041a0f7700aa59b0822aedebb74" dependencies = [ "cc", + "getrandom", "libc", - "once_cell", - "spin", + "spin 0.9.8", "untrusted", - "web-sys", - "winapi", + "windows-sys 0.48.0", ] +[[package]] +name = "rsa" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" +dependencies = [ + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core", + "signature", + "spki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + [[package]] name = "rustc_version" version = "0.2.3" @@ -1613,7 +1765,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.14", + "semver 1.0.20", ] [[package]] @@ -1626,66 +1778,82 @@ dependencies = [ "semver 0.9.0", ] +[[package]] +name = "rustix" +version = "0.38.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72e572a5e8ca657d7366229cdde4bd14c4eb5499a9573d4d366fe1b599daa316" +dependencies = [ + "bitflags 2.4.1", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + [[package]] name = "rustls" -version = "0.20.7" +version = "0.21.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "539a2bfe908f471bfa933876bd1eb6a19cf2176d375f82ef7f99530a40e48c2c" +checksum = "f9d5a6813c0759e4609cd494e8e725babae6a2ca7b62a5536a13daaec6fcb7ba" dependencies = [ "log", "ring", + "rustls-webpki", "sct", - "webpki", ] [[package]] name = "rustls-pemfile" -version = "0.3.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ee86d63972a7c661d1536fefe8c3c8407321c3df668891286de28abcd087360" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" dependencies = [ - "base64", + "base64 0.21.5", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring", + "untrusted", ] [[package]] name = "rustversion" -version = "1.0.9" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97477e48b4cf8603ad5f7aaf897467cf42ab4218a38ef76fb14c2d6773a6d6a8" +checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" [[package]] name = "ryu" -version = "1.0.11" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09" +checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" [[package]] name = "schannel" -version = "0.1.20" +version = "0.1.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" +checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" dependencies = [ - "lazy_static", - "windows-sys 0.36.1", + "windows-sys 0.48.0", ] [[package]] name = "scopeguard" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" - -[[package]] -name = "scratch" -version = "1.0.2" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8132065adcfd6e02db789d9285a0deb2f3fcb04002865ab67d5fb103533898" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sct" -version = "0.7.0" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" dependencies = [ "ring", "untrusted", @@ -1693,9 +1861,9 @@ dependencies = [ [[package]] name = "security-framework" -version = "2.7.0" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bc1bb97804af6631813c55739f771071e0f2ed33ee20b68c86ec505d906356c" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" dependencies = [ "bitflags 1.3.2", "core-foundation", @@ -1706,9 +1874,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.6.1" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" dependencies = [ "core-foundation-sys", "libc", @@ -1725,9 +1893,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.14" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e25dfac463d778e353db5be2449d1cce89bd6fd23c9f1ea21310ce6e5a1b29c4" +checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" [[package]] name = "semver-parser" @@ -1737,40 +1905,40 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "serde" -version = "1.0.150" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e326c9ec8042f1b5da33252c8a37e9ffbd2c9bef0155215b6e6c80c790e05f91" +checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" dependencies = [ "serde_derive", ] [[package]] name = "serde_bytes" -version = "0.11.7" +version = "0.11.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfc50e8183eeeb6178dcb167ae34a8051d63535023ae38b5d8d12beae193d37b" +checksum = "ab33ec92f677585af6d88c65593ae2375adde54efdbf16d597f2cbc7a6d368ff" dependencies = [ "serde", ] [[package]] name = "serde_derive" -version = "1.0.150" +version = "1.0.193" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42a3df25b0713732468deadad63ab9da1f1fd75a48a15024b50363f128db627e" +checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" dependencies = [ "proc-macro2", "quote", - "syn 1.0.105", + "syn 2.0.42", ] [[package]] name = "serde_json" -version = "1.0.89" +version = "1.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020ff22c755c2ed3f8cf162dbb41a7268d934702f3ed3631656ea597e08fc3db" +checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" dependencies = [ - "indexmap", + "indexmap 2.1.0", "itoa", "ryu", "serde", @@ -1778,10 +1946,11 @@ dependencies = [ [[package]] name = "serde_path_to_error" -version = "0.1.8" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "184c643044780f7ceb59104cef98a5a6f12cb2288a7bc701ab93a362b49fd47d" +checksum = "4beec8bce849d58d06238cb50db2e1c417cfeafa4c63f692b15c82b7c80f8335" dependencies = [ + "itoa", "serde", ] @@ -1816,7 +1985,7 @@ dependencies = [ "darling", "proc-macro2", "quote", - "syn 1.0.105", + "syn 1.0.109", ] [[package]] @@ -1832,9 +2001,9 @@ dependencies = [ [[package]] name = "sha1" -version = "0.10.5" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", "cpufeatures", @@ -1843,9 +2012,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.6" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", @@ -1854,61 +2023,100 @@ dependencies = [ [[package]] name = "signal-hook-registry" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" dependencies = [ "libc", ] +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core", +] + [[package]] name = "siphasher" -version = "0.3.10" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" [[package]] name = "slab" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ "autocfg", ] [[package]] name = "smallvec" -version = "1.10.0" +version = "1.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" [[package]] name = "snap" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e9f0ab6ef7eb7353d9119c170a436d1bf248eea575ac42d19d12f4e34130831" +checksum = "1b6b67fb9a61334225b5b790716f609cd58395f895b3fe8b328786812a40bc3b" [[package]] name = "socket2" -version = "0.4.7" +version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" dependencies = [ "libc", "winapi", ] +[[package]] +name = "socket2" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" +dependencies = [ + "libc", + "windows-sys 0.48.0", +] + [[package]] name = "spin" version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + [[package]] name = "sqlformat" -version = "0.2.0" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f87e292b4291f154971a43c3774364e2cbcaec599d3f5bf6fa9d122885dbc38a" +checksum = "ce81b7bd7c4493975347ef60d8c7e8b742d4694f4c49f93e0a12ea263938176c" dependencies = [ "itertools", "nom", @@ -1917,101 +2125,209 @@ dependencies = [ [[package]] name = "sqlx" -version = "0.6.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9249290c05928352f71c077cc44a464d880c63f26f7534728cca008e135c0428" +checksum = "dba03c279da73694ef99763320dea58b51095dfe87d001b1d4b5fe78ba8763cf" dependencies = [ "sqlx-core", "sqlx-macros", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", ] [[package]] name = "sqlx-core" -version = "0.6.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbc16ddba161afc99e14d1713a453747a2b07fc097d2009f4c300ec99286105" +checksum = "d84b0a3c3739e220d94b3239fd69fb1f74bc36e16643423bd99de3b43c21bfbd" dependencies = [ "ahash", "atoi", - "base64", - "bitflags 1.3.2", "byteorder", "bytes", "crc", "crossbeam-queue", - "dirs", "dotenvy", "either", "event-listener", "futures-channel", "futures-core", "futures-intrusive", + "futures-io", "futures-util", "hashlink", "hex", - "hkdf", - "hmac", - "indexmap", - "itoa", - "libc", + "indexmap 2.1.0", "log", - "md-5", "memchr", + "native-tls", "once_cell", "paste", "percent-encoding", - "rand", "serde", "serde_json", - "sha1", "sha2", "smallvec", "sqlformat", - "sqlx-rt", - "stringprep", "thiserror", + "tokio", "tokio-stream", + "tracing", "url", - "whoami", ] [[package]] name = "sqlx-macros" -version = "0.6.2" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89961c00dc4d7dffb7aee214964b065072bff69e36ddb9e2c107541f75e4f2a5" +dependencies = [ + "proc-macro2", + "quote", + "sqlx-core", + "sqlx-macros-core", + "syn 1.0.109", +] + +[[package]] +name = "sqlx-macros-core" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b850fa514dc11f2ee85be9d055c512aa866746adfacd1cb42d867d68e6a5b0d9" +checksum = "d0bd4519486723648186a08785143599760f7cc81c52334a55d6a83ea1e20841" dependencies = [ + "atomic-write-file", "dotenvy", "either", "heck", + "hex", "once_cell", "proc-macro2", "quote", + "serde", + "serde_json", "sha2", "sqlx-core", - "sqlx-rt", - "syn 1.0.105", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", + "syn 1.0.109", + "tempfile", + "tokio", "url", ] [[package]] -name = "sqlx-rt" -version = "0.6.2" +name = "sqlx-mysql" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24c5b2d25fa654cc5f841750b8e1cdedbe21189bf9a9382ee90bfa9dd3562396" +checksum = "e37195395df71fd068f6e2082247891bc11e3289624bbc776a0cdfa1ca7f1ea4" dependencies = [ - "native-tls", + "atoi", + "base64 0.21.5", + "bitflags 2.4.1", + "byteorder", + "bytes", + "crc", + "digest", + "dotenvy", + "either", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "generic-array", + "hex", + "hkdf", + "hmac", + "itoa", + "log", + "md-5", + "memchr", "once_cell", - "tokio", - "tokio-native-tls", + "percent-encoding", + "rand", + "rsa", + "serde", + "sha1", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror", + "tracing", + "whoami", +] + +[[package]] +name = "sqlx-postgres" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6ac0ac3b7ccd10cc96c7ab29791a7dd236bd94021f31eec7ba3d46a74aa1c24" +dependencies = [ + "atoi", + "base64 0.21.5", + "bitflags 2.4.1", + "byteorder", + "crc", + "dotenvy", + "etcetera", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "hex", + "hkdf", + "hmac", + "home", + "itoa", + "log", + "md-5", + "memchr", + "once_cell", + "rand", + "serde", + "serde_json", + "sha1", + "sha2", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror", + "tracing", + "whoami", +] + +[[package]] +name = "sqlx-sqlite" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "210976b7d948c7ba9fced8ca835b11cbb2d677c59c79de41ac0d397e14547490" +dependencies = [ + "atoi", + "flume", + "futures-channel", + "futures-core", + "futures-executor", + "futures-intrusive", + "futures-util", + "libsqlite3-sys", + "log", + "percent-encoding", + "serde", + "sqlx-core", + "tracing", + "url", + "urlencoding", ] [[package]] name = "stringprep" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ee348cb74b87454fff4b551cbf727025810a004f88aeacae7f85b87f4e9a1c1" +checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6" dependencies = [ + "finl_unicode", "unicode-bidi", "unicode-normalization", ] @@ -2024,15 +2340,15 @@ checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" [[package]] name = "subtle" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "syn" -version = "1.0.105" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b9b43d45702de4c839cb9b51d9f529c5dd26a4aff255b42b1ebc03e88ee908" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", @@ -2041,9 +2357,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.18" +version = "2.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32d41677bcbe24c20c52e7c70b0d8db04134c5d1066bf98662e2871ad200ea3e" +checksum = "5b7d0a2c048d661a1a59fcd7355baa232f7ed34e0ee4df2eef3c1c1c0d3852d8" dependencies = [ "proc-macro2", "quote", @@ -2052,9 +2368,9 @@ dependencies = [ [[package]] name = "sync_wrapper" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20518fe4a4c9acf048008599e464deb21beeae3d3578418951a189c235a7a9a8" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" [[package]] name = "take_mut" @@ -2062,67 +2378,54 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f764005d11ee5f36500a149ace24e00e3da98b0158b3e2d53a7495660d3f4d60" +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "tempfile" -version = "3.3.0" +version = "3.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" dependencies = [ "cfg-if", "fastrand", - "libc", "redox_syscall", - "remove_dir_all", - "winapi", -] - -[[package]] -name = "termcolor" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" -dependencies = [ - "winapi-util", + "rustix", + "windows-sys 0.48.0", ] [[package]] name = "thiserror" -version = "1.0.37" +version = "1.0.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10deb33631e3c9018b9baf9dcbbc4f737320d2b576bac10f6aefa048fa407e3e" +checksum = "f11c217e1416d6f036b870f14e0413d480dbf28edbee1f877abaf0206af43bb7" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.37" +version = "1.0.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "982d17546b47146b28f7c22e3d08465f6b8903d0ea13c1660d9d84a6e7adcdbb" +checksum = "01742297787513b79cf8e29d1056ede1313e2420b7b3b15d0a768b4921f549df" dependencies = [ "proc-macro2", "quote", - "syn 1.0.105", + "syn 2.0.42", ] [[package]] name = "time" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" -dependencies = [ - "libc", - "wasi 0.10.0+wasi-snapshot-preview1", - "winapi", -] - -[[package]] -name = "time" -version = "0.3.17" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a561bf4617eebd33bca6434b988f39ed798e527f51a1e797d0ee4f61c0a38376" +checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e" dependencies = [ + "deranged", "itoa", + "powerfmt", "serde", "time-core", "time-macros", @@ -2130,15 +2433,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.6" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d967f99f534ca7e495c575c62638eebc2898a8c84c119b89e250477bc4ba16b2" +checksum = "26197e33420244aeb70c3e8c78376ca46571bc4e701e4791c2cd9f57dcb3a43f" dependencies = [ "time-core", ] @@ -2154,49 +2457,38 @@ dependencies = [ [[package]] name = "tinyvec_macros" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.26.0" +version = "1.35.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03201d01c3c27a29c8a5cee5b55a93ddae1ccf6f08f65365c2c918f8c1b76f64" +checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104" dependencies = [ - "autocfg", + "backtrace", "bytes", "libc", - "memchr", "mio", "num_cpus", - "parking_lot 0.12.1", + "parking_lot", "pin-project-lite", "signal-hook-registry", - "socket2", + "socket2 0.5.5", "tokio-macros", - "windows-sys 0.45.0", + "windows-sys 0.48.0", ] [[package]] name = "tokio-macros" -version = "1.8.2" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 1.0.105", -] - -[[package]] -name = "tokio-native-tls" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d995660bd2b7f8c1568414c1126076c13fbb725c40112dc0120b78eb9b717b" -dependencies = [ - "native-tls", - "tokio", + "syn 2.0.42", ] [[package]] @@ -2215,15 +2507,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8548f756cd6eb4069c5af0fb0cec57001fb42bd1fb7330d8f24067ee3fa62608" dependencies = [ "quote", - "syn 1.0.105", + "syn 1.0.109", "tokio-postgres", ] [[package]] name = "tokio-postgres" -version = "0.7.7" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29a12c1b3e0704ae7dfc25562629798b29c72e6b1d0a681b6f29ab4ae5e7f7bf" +checksum = "d340244b32d920260ae7448cb72b6e238bddc3d4f7603394e7dd46ed8e48f5b8" dependencies = [ "async-trait", "byteorder", @@ -2232,33 +2524,34 @@ dependencies = [ "futures-channel", "futures-util", "log", - "parking_lot 0.12.1", + "parking_lot", "percent-encoding", "phf", "pin-project-lite", "postgres-protocol", "postgres-types", - "socket2", + "rand", + "socket2 0.5.5", "tokio", "tokio-util", + "whoami", ] [[package]] name = "tokio-rustls" -version = "0.23.4" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c43ee83903113e03984cb9e5cebe6c04a5116269e900e3ddba8f068a62adda59" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ "rustls", "tokio", - "webpki", ] [[package]] name = "tokio-stream" -version = "0.1.11" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d660770404473ccd7bc9f8b28494a811bc18542b915c0855c51e8f419d5223ce" +checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" dependencies = [ "futures-core", "pin-project-lite", @@ -2267,12 +2560,13 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.4" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb2e075f03b3d66d8d8785356224ba688d2906a371015e225beeb65ca92c740" +checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15" dependencies = [ "bytes", "futures-core", + "futures-io", "futures-sink", "pin-project-lite", "tokio", @@ -2281,9 +2575,9 @@ dependencies = [ [[package]] name = "toml" -version = "0.5.9" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ "serde", ] @@ -2306,11 +2600,11 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.4.0" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d1d42a9b3f3ec46ba828e8d376aec14592ea199f70a06a548587ecd1c4ab658" +checksum = "61c5bb1d698276a2443e5ecfabc1008bf15a36c12e6a7176e7bf089ea9131140" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.4.1", "bytes", "futures-core", "futures-util", @@ -2336,21 +2630,32 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" [[package]] name = "tracing" -version = "0.1.37" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "cfg-if", "log", "pin-project-lite", + "tracing-attributes", "tracing-core", ] +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.42", +] + [[package]] name = "tracing-core" -version = "0.1.30" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", ] @@ -2392,7 +2697,7 @@ dependencies = [ "lazy_static", "log", "lru-cache", - "parking_lot 0.12.1", + "parking_lot", "resolv-conf", "smallvec", "thiserror", @@ -2402,9 +2707,9 @@ dependencies = [ [[package]] name = "try-lock" -version = "0.2.3" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59547bce71d9c38b83d9c0e92b6066c4253371f15005def0c30d9657f50c7642" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "typed-builder" @@ -2414,26 +2719,26 @@ checksum = "89851716b67b937e393b3daa8423e67ddfc4bbbf1654bcf05488e95e0828db0c" dependencies = [ "proc-macro2", "quote", - "syn 1.0.105", + "syn 1.0.109", ] [[package]] name = "typenum" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicode-bidi" -version = "0.3.8" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" +checksum = "6f2528f27a9eb2b21e69c95319b30bd0efd85d09c379741b0f78ea1d86be2416" [[package]] name = "unicode-ident" -version = "1.0.5" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" @@ -2446,15 +2751,15 @@ dependencies = [ [[package]] name = "unicode-segmentation" -version = "1.10.0" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fdbf052a0783de01e944a6ce7a8cb939e295b1e7be835a1112c3b9a7f047a5a" +checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" [[package]] name = "unicode-width" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" +checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" [[package]] name = "unicode-xid" @@ -2470,35 +2775,32 @@ checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" [[package]] name = "untrusted" -version = "0.7.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.3.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", - "idna 0.3.0", + "idna 0.5.0", "percent-encoding", ] [[package]] -name = "uuid" -version = "0.8.2" +name = "urlencoding" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" -dependencies = [ - "getrandom", -] +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" [[package]] name = "uuid" -version = "1.2.2" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "422ee0de9031b5b948b97a8fc04e3aa35230001a722ddd27943e0be31564ce4c" +checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560" dependencies = [ "getrandom", "serde", @@ -2511,7 +2813,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dd8b599d797eb038d0dde9a3860aacb6bbba3bffa4ac64f807c8673820cc9d9" dependencies = [ "regex", - "syn 1.0.105", + "syn 1.0.109", ] [[package]] @@ -2534,20 +2836,13 @@ checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" [[package]] name = "want" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" dependencies = [ - "log", "try-lock", ] -[[package]] -name = "wasi" -version = "0.10.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -2556,9 +2851,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.83" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" +checksum = "0ed0d4f68a3015cc185aff4db9506a015f4b96f95303897bfa23f846db54064e" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -2566,24 +2861,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.83" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" +checksum = "1b56f625e64f3a1084ded111c4d5f477df9f8c92df113852fa5a374dbda78826" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 1.0.105", + "syn 2.0.42", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.83" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" +checksum = "0162dbf37223cd2afce98f3d0785506dcb8d266223983e4b5b525859e6e182b2" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2591,68 +2886,54 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.83" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" +checksum = "f0eb82fcb7930ae6219a7ecfd55b217f5f0893484b7a13022ebb2b2bf20b5283" dependencies = [ "proc-macro2", "quote", - "syn 1.0.105", + "syn 2.0.42", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.83" +version = "0.2.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" +checksum = "7ab9b36309365056cd639da3134bf87fa8f3d86008abf99e612384a6eecd459f" [[package]] name = "web-sys" -version = "0.3.60" +version = "0.3.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" +checksum = "50c24a44ec86bb68fbecd1b3efed7e85ea5621b39b35ef2766b66cd984f8010f" dependencies = [ "js-sys", "wasm-bindgen", ] -[[package]] -name = "webpki" -version = "0.22.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07ecc0cd7cac091bf682ec5efa18b1cff79d617b84181f38b3951dbe135f607f" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "webpki-roots" -version = "0.22.6" +version = "0.25.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" -dependencies = [ - "webpki", -] +checksum = "1778a42e8b3b90bff8d0f5032bf22250792889a5cdc752aa0020c84abe3aaf10" [[package]] name = "whoami" -version = "1.2.3" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6631b6a2fd59b1841b622e8f1a7ad241ef0a46f2d580464ce8140ac94cbd571" +checksum = "22fc3756b8a9133049b26c7f61ab35416c130e8c09b660f5b3958b446f52cc50" dependencies = [ - "bumpalo", "wasm-bindgen", "web-sys", ] [[package]] name = "widestring" -version = "0.5.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17882f045410753661207383517a6f62ec3dbeb6a4ed2acce01f0728238d1983" +checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8" [[package]] name = "winapi" @@ -2670,15 +2951,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" -[[package]] -name = "winapi-util" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" -dependencies = [ - "winapi", -] - [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -2686,136 +2958,163 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] -name = "windows-sys" -version = "0.36.1" +name = "windows-core" +version = "0.51.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" dependencies = [ - "windows_aarch64_msvc 0.36.1", - "windows_i686_gnu 0.36.1", - "windows_i686_msvc 0.36.1", - "windows_x86_64_gnu 0.36.1", - "windows_x86_64_msvc 0.36.1", + "windows-targets 0.48.5", ] [[package]] name = "windows-sys" -version = "0.42.0" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc 0.42.2", + "windows-targets 0.48.5", ] [[package]] name = "windows-sys" -version = "0.45.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" dependencies = [ - "windows-targets", + "windows-targets 0.52.0", ] [[package]] name = "windows-targets" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc 0.42.2", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", ] +[[package]] +name = "windows-targets" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +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", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.2" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" [[package]] name = "windows_aarch64_msvc" -version = "0.36.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.42.2" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" [[package]] name = "windows_i686_gnu" -version = "0.36.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.42.2" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" [[package]] name = "windows_i686_msvc" -version = "0.36.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.42.2" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" [[package]] name = "windows_x86_64_gnu" -version = "0.36.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.42.2" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.2" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" [[package]] name = "windows_x86_64_msvc" -version = "0.36.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.42.2" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" [[package]] name = "winreg" -version = "0.10.1" +version = "0.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" dependencies = [ - "winapi", + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", ] [[package]] @@ -2839,13 +3138,13 @@ dependencies = [ [[package]] name = "yarte_codegen" -version = "0.15.6" +version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1cf72076dbf4d39fe4779b58380d7213dcb3995d00666dd2d109f1b45879ea4" +checksum = "4a79312078b97a195de91a8c1457c2e0d7abd97e6e605f3cdeb01b3c105d2cff" dependencies = [ "proc-macro2", "quote", - "syn 1.0.105", + "syn 1.0.109", "yarte_helpers", "yarte_hir", ] @@ -2858,7 +3157,7 @@ checksum = "b296edd7e1a81717b6f794baa2de8dfe89646050847161550b2d963b3ca6fe80" dependencies = [ "proc-macro2", "quote", - "syn 1.0.105", + "syn 1.0.109", "yarte_codegen", "yarte_helpers", "yarte_hir", @@ -2867,15 +3166,15 @@ dependencies = [ [[package]] name = "yarte_helpers" -version = "0.15.7" +version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dfe1ef3558dde14b4be5387bdd41e3bd45746570743521470ec3e9cd0826679" +checksum = "e0d1076f8cee9541ea5ffbecd9102f751252c91f085e7d30a18a3ce805ebd3ee" dependencies = [ "dtoa", "itoa", "prettyplease", "serde", - "syn 1.0.105", + "syn 1.0.109", "toml", "v_htmlescape", ] @@ -2889,7 +3188,7 @@ dependencies = [ "derive_more", "proc-macro2", "quote", - "syn 1.0.105", + "syn 1.0.109", "v_eval", "v_htmlescape", "yarte_helpers", @@ -2907,11 +3206,37 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn 1.0.105", + "syn 1.0.109", "unicode-xid", "yarte_helpers", ] +[[package]] +name = "zerocopy" +version = "0.7.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c4061bedbb353041c12f413700357bec76df2c7e2ca8e4df8bac24c6bf68e3d" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3c129550b3e6de3fd0ba67ba5c81818f9805e58b8d7fee80a3a59d2c9fc601a" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.42", +] + +[[package]] +name = "zeroize" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" + [[package]] name = "zstd" version = "0.11.2+zstd.1.5.2" @@ -2933,10 +3258,10 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.4+zstd.1.5.2" +version = "2.0.9+zstd.1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fa202f2ef00074143e219d15b62ffc317d17cc33909feac471c044087cad7b0" +checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" dependencies = [ "cc", - "libc", + "pkg-config", ] diff --git a/frameworks/Rust/axum/Cargo.toml b/frameworks/Rust/axum/Cargo.toml index 1236aab32f9..f4ecf45adf4 100644 --- a/frameworks/Rust/axum/Cargo.toml +++ b/frameworks/Rust/axum/Cargo.toml @@ -29,9 +29,9 @@ name = "axum-pg" path = "src/main_pg.rs" [dependencies] -axum = { version = "0.6.16", default-features = false, features = ["json", "query", "headers", "http1", "tokio"] } -deadpool = { version = "0.9.5", features = ["rt_tokio_1", "serde", "async-trait", "managed" ] } -deadpool-postgres = "0.10.3" +axum = { version = "0.6.16", default-features = false, features = ["json", "query", "http1", "tokio"] } +deadpool = { version = "0.10.0", features = ["rt_tokio_1", "serde", "async-trait", "managed" ] } +deadpool-postgres = "0.12.1" dotenv = "0.15.0" futures = "0.3.25" futures-util = "0.3.25" @@ -41,7 +41,7 @@ num_cpus = "1.14.0" rand = { version = "0.8.5", features = ["small_rng"] } serde = { version = "1.0.149", features = ["derive"] } serde_json = "1.0.89" -sqlx = { version = "0.6.2", features = ["postgres", "macros", "runtime-tokio-native-tls"] } +sqlx = { version = "0.7.3", features = ["postgres", "macros", "runtime-tokio-native-tls"] } tokio = { version = "1.24.2", features = ["full"] } tokio-pg-mapper = "0.2.0" tokio-pg-mapper-derive = "0.2.0" diff --git a/frameworks/Rust/axum/axum-mongo-raw.dockerfile b/frameworks/Rust/axum/axum-mongo-raw.dockerfile index 5eec4f41017..ffdabfc2d8c 100644 --- a/frameworks/Rust/axum/axum-mongo-raw.dockerfile +++ b/frameworks/Rust/axum/axum-mongo-raw.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.67-slim-buster +FROM rust:1.75-slim-buster ENV AXUM_TECHEMPOWER_MONGODB_URL=mongodb://tfb-database:27017 ENV AXUM_TECHEMPOWER_MAX_POOL_SIZE=28 diff --git a/frameworks/Rust/axum/axum-mongo.dockerfile b/frameworks/Rust/axum/axum-mongo.dockerfile index c9ed43a90b2..99a6f76f997 100644 --- a/frameworks/Rust/axum/axum-mongo.dockerfile +++ b/frameworks/Rust/axum/axum-mongo.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.67-slim-buster +FROM rust:1.75-slim-buster ENV AXUM_TECHEMPOWER_MONGODB_URL=mongodb://tfb-database:27017 ENV AXUM_TECHEMPOWER_MAX_POOL_SIZE=28 diff --git a/frameworks/Rust/axum/axum-pg-pool.dockerfile b/frameworks/Rust/axum/axum-pg-pool.dockerfile index 1a436f88b30..c836faa2381 100644 --- a/frameworks/Rust/axum/axum-pg-pool.dockerfile +++ b/frameworks/Rust/axum/axum-pg-pool.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.67-slim-buster +FROM rust:1.75-slim-buster ENV AXUM_TECHEMPOWER_DATABASE_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world ENV AXUM_TECHEMPOWER_MAX_POOL_SIZE=28 diff --git a/frameworks/Rust/axum/axum-pg.dockerfile b/frameworks/Rust/axum/axum-pg.dockerfile index 375e82ce7d3..98d44481007 100644 --- a/frameworks/Rust/axum/axum-pg.dockerfile +++ b/frameworks/Rust/axum/axum-pg.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.67-slim-buster +FROM rust:1.75-slim-buster ENV AXUM_TECHEMPOWER_DATABASE_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world diff --git a/frameworks/Rust/axum/axum-sqlx.dockerfile b/frameworks/Rust/axum/axum-sqlx.dockerfile index 455e282abd0..0cecda65f32 100644 --- a/frameworks/Rust/axum/axum-sqlx.dockerfile +++ b/frameworks/Rust/axum/axum-sqlx.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.67-slim-buster +FROM rust:1.75-slim-buster ENV AXUM_TECHEMPOWER_DATABASE_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world ENV AXUM_TECHEMPOWER_MAX_POOL_SIZE=56 diff --git a/frameworks/Rust/axum/axum.dockerfile b/frameworks/Rust/axum/axum.dockerfile index 6f23b4e1a44..2cd772a3426 100644 --- a/frameworks/Rust/axum/axum.dockerfile +++ b/frameworks/Rust/axum/axum.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.67-slim-buster +FROM rust:1.75-slim-buster RUN apt-get update && apt-get install -y --no-install-recommends \ pkg-config libssl-dev \ diff --git a/frameworks/Rust/axum/src/database_sqlx.rs b/frameworks/Rust/axum/src/database_sqlx.rs index e26baebde03..b156bb3a3b7 100644 --- a/frameworks/Rust/axum/src/database_sqlx.rs +++ b/frameworks/Rust/axum/src/database_sqlx.rs @@ -69,7 +69,7 @@ pub async fn fetch_world( let world: World = sqlx::query_as_with("SELECT id, randomnumber FROM World WHERE id = $1", args) - .fetch_one(&mut conn) + .fetch_one(&mut *conn) .await .expect("error loading world"); Ok(world) @@ -79,7 +79,7 @@ pub async fn fetch_fortunes( mut conn: PoolConnection, ) -> Result, PgError> { let fortunes: Vec = sqlx::query_as("SELECT * FROM Fortune") - .fetch_all(&mut conn) + .fetch_all(&mut *conn) .await .expect("error loading Fortunes"); Ok(fortunes) From 226c5957064799c659817dd878afde4a58e088b4 Mon Sep 17 00:00:00 2001 From: Fangdun Tsai Date: Wed, 21 Feb 2024 04:12:40 +0800 Subject: [PATCH 147/210] chore(deps): update viz to v0.8.0 (#8704) --- frameworks/Rust/viz/Cargo.toml | 2 +- frameworks/Rust/viz/src/db_sqlx.rs | 7 +------ frameworks/Rust/viz/src/main.rs | 6 ++---- frameworks/Rust/viz/src/main_diesel.rs | 22 ++++++++++------------ frameworks/Rust/viz/src/main_pg.rs | 4 ++-- frameworks/Rust/viz/src/main_sqlx.rs | 4 ++-- frameworks/Rust/viz/src/server.rs | 7 ++++--- frameworks/Rust/viz/viz-diesel.dockerfile | 2 +- frameworks/Rust/viz/viz-pg.dockerfile | 2 +- frameworks/Rust/viz/viz-sqlx.dockerfile | 2 +- frameworks/Rust/viz/viz.dockerfile | 2 +- 11 files changed, 26 insertions(+), 34 deletions(-) diff --git a/frameworks/Rust/viz/Cargo.toml b/frameworks/Rust/viz/Cargo.toml index d8b34ca3435..9832cb58fdb 100644 --- a/frameworks/Rust/viz/Cargo.toml +++ b/frameworks/Rust/viz/Cargo.toml @@ -24,7 +24,7 @@ path = "src/main_diesel.rs" required-features = ["diesel", "diesel-async", "sailfish"] [dependencies] -viz = "0.7" +viz = "0.8" hyper = "1.0" hyper-util = "0.1" atoi = "2.0" diff --git a/frameworks/Rust/viz/src/db_sqlx.rs b/frameworks/Rust/viz/src/db_sqlx.rs index 17ca1b2914d..af8322e9d1d 100644 --- a/frameworks/Rust/viz/src/db_sqlx.rs +++ b/frameworks/Rust/viz/src/db_sqlx.rs @@ -6,10 +6,7 @@ pub use sqlx::{ Arguments, PgPool, Postgres, Row, }; -use viz::{ - async_trait, Error, FromRequest, IntoResponse, Request, RequestExt, Response, - StatusCode, -}; +use viz::{Error, FromRequest, IntoResponse, Request, RequestExt, Response, StatusCode}; use crate::models_sqlx::*; use crate::utils::get_query_param; @@ -17,7 +14,6 @@ use crate::RANGE; pub struct DatabaseConnection(pub PoolConnection); -#[async_trait] impl FromRequest for DatabaseConnection { type Error = PgError; @@ -51,7 +47,6 @@ impl IntoResponse for PgError { pub struct Counter(pub u16); -#[async_trait] impl FromRequest for Counter { type Error = Error; diff --git a/frameworks/Rust/viz/src/main.rs b/frameworks/Rust/viz/src/main.rs index cce1506c8d0..1813ac62a22 100644 --- a/frameworks/Rust/viz/src/main.rs +++ b/frameworks/Rust/viz/src/main.rs @@ -3,7 +3,7 @@ use serde::Serialize; use viz::{ header::{HeaderValue, SERVER}, - Error, Request, Response, ResponseExt, Result, Router, Tree, + Error, Request, Response, ResponseExt, Result, Router, }; mod server; @@ -36,7 +36,5 @@ async fn main() -> Result<()> { .get("/plaintext", plaintext) .get("/json", json); - let tree = Tree::from(app); - - server::serve(tree).await.map_err(Error::Boxed) + server::serve(app).await.map_err(Error::Boxed) } diff --git a/frameworks/Rust/viz/src/main_diesel.rs b/frameworks/Rust/viz/src/main_diesel.rs index b8a315a7abf..688b1e207da 100644 --- a/frameworks/Rust/viz/src/main_diesel.rs +++ b/frameworks/Rust/viz/src/main_diesel.rs @@ -11,7 +11,7 @@ use nanorand::{Rng, WyRand}; use viz::{ header::{HeaderValue, SERVER}, types::State, - Request, RequestExt, Response, ResponseExt, Result, Router, Tree, + Request, RequestExt, Response, ResponseExt, Result, Router, }; mod db_diesel; @@ -89,15 +89,13 @@ async fn main() { let rng = WyRand::new(); - let tree = Tree::from( - Router::new() - .get("/db", db) - .get("/fortunes", fortunes) - .get("/queries", queries) - .get("/updates", updates) - .with(State::new(pool)) - .with(State::new(rng)), - ); - - server::serve(tree).await.unwrap() + let app = Router::new() + .get("/db", db) + .get("/fortunes", fortunes) + .get("/queries", queries) + .get("/updates", updates) + .with(State::new(pool)) + .with(State::new(rng)); + + server::serve(app).await.unwrap() } diff --git a/frameworks/Rust/viz/src/main_pg.rs b/frameworks/Rust/viz/src/main_pg.rs index a1d7212b579..f7a0748ef57 100644 --- a/frameworks/Rust/viz/src/main_pg.rs +++ b/frameworks/Rust/viz/src/main_pg.rs @@ -6,7 +6,7 @@ use std::{ use viz::{ header::{HeaderValue, SERVER}, types::State, - Request, RequestExt, Response, ResponseExt, Result, Router, Tree, + Request, RequestExt, Response, ResponseExt, Result, Router, }; use yarte::Template; @@ -105,5 +105,5 @@ async fn serve() { .get("/updates", updates) .with(State::new(conn)); - server::serve(Tree::from(app)).await.unwrap() + server::serve(app).await.unwrap() } diff --git a/frameworks/Rust/viz/src/main_sqlx.rs b/frameworks/Rust/viz/src/main_sqlx.rs index 55ef8f77556..7685a9f6165 100644 --- a/frameworks/Rust/viz/src/main_sqlx.rs +++ b/frameworks/Rust/viz/src/main_sqlx.rs @@ -4,7 +4,7 @@ use nanorand::{Rng, WyRand}; use viz::{ header::{HeaderValue, SERVER}, types::State, - BytesMut, Error, Request, RequestExt, Response, ResponseExt, Result, Router, Tree, + BytesMut, Error, Request, RequestExt, Response, ResponseExt, Result, Router, }; mod db_sqlx; @@ -100,7 +100,7 @@ async fn main() -> Result<()> { .with(State::new(pool)) .with(State::new(rng)); - server::serve(Tree::from(app)).await.map_err(Error::Boxed) + server::serve(app).await.map_err(Error::Boxed) } markup::define! { diff --git a/frameworks/Rust/viz/src/server.rs b/frameworks/Rust/viz/src/server.rs index 492a8618eb4..d70c1de8531 100644 --- a/frameworks/Rust/viz/src/server.rs +++ b/frameworks/Rust/viz/src/server.rs @@ -6,9 +6,10 @@ use std::sync::Arc; use hyper::server::conn::http1::Builder; use hyper_util::rt::TokioIo; use tokio::net::{TcpListener, TcpSocket}; +use viz::{Responder, Router, Tree}; -pub async fn serve(tree: viz::Tree) -> Result<(), Box> { - let tree = Arc::new(tree); +pub async fn serve(router: Router) -> Result<(), Box> { + let tree = Arc::::new(router.into()); let addr = SocketAddr::from((Ipv4Addr::UNSPECIFIED, 8080)); let listener = reuse_listener(addr).expect("couldn't bind to addr"); @@ -22,7 +23,7 @@ pub async fn serve(tree: viz::Tree) -> Result<(), Box> tokio::task::spawn(async move { Builder::new() .pipeline_flush(true) - .serve_connection(io, viz::Responder::new(tree, None)) + .serve_connection(io, Responder::>::new(tree, None)) .with_upgrades() .await }); diff --git a/frameworks/Rust/viz/viz-diesel.dockerfile b/frameworks/Rust/viz/viz-diesel.dockerfile index df385180f91..c1ddd42ddd5 100644 --- a/frameworks/Rust/viz/viz-diesel.dockerfile +++ b/frameworks/Rust/viz/viz-diesel.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.74.1 +FROM rust:1.75 RUN apt-get update -yqq && apt-get install -yqq cmake g++ diff --git a/frameworks/Rust/viz/viz-pg.dockerfile b/frameworks/Rust/viz/viz-pg.dockerfile index d917098acf0..69238ff1c62 100644 --- a/frameworks/Rust/viz/viz-pg.dockerfile +++ b/frameworks/Rust/viz/viz-pg.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.74.1 +FROM rust:1.75 RUN apt-get update -yqq && apt-get install -yqq cmake g++ diff --git a/frameworks/Rust/viz/viz-sqlx.dockerfile b/frameworks/Rust/viz/viz-sqlx.dockerfile index 9d21ada4e12..087feee3c8e 100644 --- a/frameworks/Rust/viz/viz-sqlx.dockerfile +++ b/frameworks/Rust/viz/viz-sqlx.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.74.1 +FROM rust:1.75 RUN apt-get update -yqq && apt-get install -yqq cmake g++ diff --git a/frameworks/Rust/viz/viz.dockerfile b/frameworks/Rust/viz/viz.dockerfile index e84a96ea0b6..bf54a7076c9 100644 --- a/frameworks/Rust/viz/viz.dockerfile +++ b/frameworks/Rust/viz/viz.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.74.1 +FROM rust:1.75 RUN apt-get update -yqq && apt-get install -yqq cmake g++ From 384def5df49694a5b73af39ade147ea5662c06f1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Feb 2024 00:08:16 +0000 Subject: [PATCH 148/210] Bump org.postgresql:postgresql in /frameworks/Java/light-java Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.4.1 to 42.7.2. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/commits) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Java/light-java/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/light-java/pom.xml b/frameworks/Java/light-java/pom.xml index f0e01ee8518..eca4217eec8 100644 --- a/frameworks/Java/light-java/pom.xml +++ b/frameworks/Java/light-java/pom.xml @@ -28,7 +28,7 @@ 2.3.5.Final 3.3.1 8.0.28 - 42.4.1 + 42.7.2 1.8.4 0.9.6 3.8.0 From ab4d98a95533baabbc79bbf5c12897d140e54d66 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Feb 2024 07:23:05 -0800 Subject: [PATCH 149/210] Bump org.postgresql:postgresql in /frameworks/Java/httpserver (#8745) Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.4.1 to 42.7.2. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/commits) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Java/httpserver/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/httpserver/pom.xml b/frameworks/Java/httpserver/pom.xml index 931c9c56f94..4526fb528bf 100644 --- a/frameworks/Java/httpserver/pom.xml +++ b/frameworks/Java/httpserver/pom.xml @@ -29,7 +29,7 @@ org.postgresql postgresql - 42.4.1 + 42.7.2 com.zaxxer From 7aed079246a9a5d8101cbca4dab9217d719b36f1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Feb 2024 07:23:13 -0800 Subject: [PATCH 150/210] Bump org.postgresql:postgresql in /frameworks/Java/jooby (#8746) Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.6.0 to 42.7.2. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/commits) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Java/jooby/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/jooby/pom.xml b/frameworks/Java/jooby/pom.xml index 975c8359c1e..927fe7f14b8 100644 --- a/frameworks/Java/jooby/pom.xml +++ b/frameworks/Java/jooby/pom.xml @@ -13,7 +13,7 @@ 3.0.5 1.10.0 - 42.6.0 + 42.7.2 UTF-8 17 17 From 63f012bf7991f3868bb05eeacb311fe227856561 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Feb 2024 07:24:33 -0800 Subject: [PATCH 151/210] Bump org.postgresql:postgresql in /frameworks/Java/hserver (#8761) Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.3.8 to 42.7.2. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/commits) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Java/hserver/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/hserver/pom.xml b/frameworks/Java/hserver/pom.xml index 02866464a3a..4e304e8caf9 100644 --- a/frameworks/Java/hserver/pom.xml +++ b/frameworks/Java/hserver/pom.xml @@ -16,7 +16,7 @@ UTF-8 3.3.1 - 42.3.8 + 42.7.2 From 4245ffe91f1a57185a344718c991fafd2699ab71 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Feb 2024 07:24:38 -0800 Subject: [PATCH 152/210] Bump org.postgresql:postgresql in /frameworks/Java/helidon/nima (#8760) Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.6.0 to 42.6.1. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.6.0...REL42.6.1) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Java/helidon/nima/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/helidon/nima/pom.xml b/frameworks/Java/helidon/nima/pom.xml index f558927de94..b08de529ffc 100644 --- a/frameworks/Java/helidon/nima/pom.xml +++ b/frameworks/Java/helidon/nima/pom.xml @@ -75,7 +75,7 @@ org.postgresql postgresql - 42.6.0 + 42.6.1 com.fizzed From f79ffb2c4e2adb2e25d855c54114664465f0ae3b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Feb 2024 07:24:44 -0800 Subject: [PATCH 153/210] Bump org.postgresql:postgresql in /frameworks/Java/javalin (#8759) Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.5.1 to 42.7.2. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/commits) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Java/javalin/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/javalin/pom.xml b/frameworks/Java/javalin/pom.xml index 77133c44ab4..f45da15fcaf 100644 --- a/frameworks/Java/javalin/pom.xml +++ b/frameworks/Java/javalin/pom.xml @@ -15,7 +15,7 @@ 2.0.3 2.13.4 5.0.1 - 42.5.1 + 42.7.2 4.7.2 2.2.3 From 9164512b9c8ae610798bd89f3f67b5918082d45d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Feb 2024 07:24:51 -0800 Subject: [PATCH 154/210] Bump org.postgresql:postgresql in /frameworks/Java/servlet (#8758) Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.4.3 to 42.7.2. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/commits) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Java/servlet/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/servlet/pom.xml b/frameworks/Java/servlet/pom.xml index b038c8549c2..052ca85e38e 100644 --- a/frameworks/Java/servlet/pom.xml +++ b/frameworks/Java/servlet/pom.xml @@ -108,7 +108,7 @@ org.postgresql postgresql - 42.4.3 + 42.7.2 From f0e971fff4bfbd392f15090128d49d7735b82458 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Feb 2024 07:24:57 -0800 Subject: [PATCH 155/210] Bump org.postgresql:postgresql in /frameworks/Java/proteus (#8757) Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.4.3 to 42.7.2. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/commits) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Java/proteus/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/proteus/pom.xml b/frameworks/Java/proteus/pom.xml index cb4a0fe1a90..6840966094d 100644 --- a/frameworks/Java/proteus/pom.xml +++ b/frameworks/Java/proteus/pom.xml @@ -252,7 +252,7 @@ org.postgresql postgresql - 42.4.3 + 42.7.2 From a15f7f7f46bf326fb4a9b843a8ad728f0bf777fe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Feb 2024 07:25:03 -0800 Subject: [PATCH 156/210] Bump org.postgresql:postgresql in /frameworks/Java/dropwizard (#8756) Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.4.3 to 42.7.2. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/commits) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Java/dropwizard/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/dropwizard/pom.xml b/frameworks/Java/dropwizard/pom.xml index 312ba647189..5188cb78b1c 100644 --- a/frameworks/Java/dropwizard/pom.xml +++ b/frameworks/Java/dropwizard/pom.xml @@ -19,7 +19,7 @@ 2.3.0 8.0.28 2.9.4 - 42.4.3 + 42.7.2 3.8.0 3.1.0 3.1.1 From 2ee36fee0451e09b413eba51d9d5859361019716 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Feb 2024 07:25:09 -0800 Subject: [PATCH 157/210] Bump org.postgresql:postgresql in /frameworks/Java/smart-socket (#8755) Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.4.3 to 42.7.2. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/commits) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Java/smart-socket/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/smart-socket/pom.xml b/frameworks/Java/smart-socket/pom.xml index 81fbc295b98..b95e7d71c52 100644 --- a/frameworks/Java/smart-socket/pom.xml +++ b/frameworks/Java/smart-socket/pom.xml @@ -56,7 +56,7 @@ org.postgresql postgresql - 42.4.3 + 42.7.2 From 812aa24e219ce639b47859efff22aa45dd16002f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Feb 2024 07:25:15 -0800 Subject: [PATCH 158/210] Bump org.postgresql:postgresql in /frameworks/Kotlin/ktor/ktor (#8754) Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.4.3 to 42.7.2. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/commits) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Kotlin/ktor/ktor/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Kotlin/ktor/ktor/pom.xml b/frameworks/Kotlin/ktor/ktor/pom.xml index 3e08b86f18c..35ad4547a16 100644 --- a/frameworks/Kotlin/ktor/ktor/pom.xml +++ b/frameworks/Kotlin/ktor/ktor/pom.xml @@ -20,7 +20,7 @@ 5.0.0 1.2.13 8.0.28 - 42.4.3 + 42.7.2 From eb5f76af517736ccdd27029b0e4a2cce9e13edcc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Feb 2024 07:25:21 -0800 Subject: [PATCH 159/210] Bump org.postgresql:postgresql in /frameworks/Java/spring-webflux (#8753) Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.4.3 to 42.7.2. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/commits) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Java/spring-webflux/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/spring-webflux/pom.xml b/frameworks/Java/spring-webflux/pom.xml index 932a6467e52..01d32c261c0 100644 --- a/frameworks/Java/spring-webflux/pom.xml +++ b/frameworks/Java/spring-webflux/pom.xml @@ -21,7 +21,7 @@ 11 UTF-8 1.0.0.M2 - 42.4.3 + 42.7.2 0.11.4 0.2.4 1.0.0.M7 From f135f292f48f743ffd5b48519c3ae6698e37326c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Feb 2024 07:25:30 -0800 Subject: [PATCH 160/210] Bump org.postgresql:postgresql in /frameworks/Java/jlhttp (#8752) Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.4.3 to 42.7.2. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/commits) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Java/jlhttp/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/jlhttp/pom.xml b/frameworks/Java/jlhttp/pom.xml index eea865c88aa..5f12f34226c 100644 --- a/frameworks/Java/jlhttp/pom.xml +++ b/frameworks/Java/jlhttp/pom.xml @@ -35,7 +35,7 @@ org.postgresql postgresql - 42.4.3 + 42.7.2 com.zaxxer From d2140b55c8c5c79f0d38fd47046942f4e0a2b4f3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Feb 2024 07:25:39 -0800 Subject: [PATCH 161/210] Bump org.postgresql:postgresql in /frameworks/Java/act (#8747) Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.4.1 to 42.7.2. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/commits) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Java/act/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/act/pom.xml b/frameworks/Java/act/pom.xml index 6d22ea17292..8e66efe9a01 100644 --- a/frameworks/Java/act/pom.xml +++ b/frameworks/Java/act/pom.xml @@ -70,7 +70,7 @@ 1.8 8.0.28 - 42.4.1 + 42.7.2 1.3.2 3.4 com.techempower.act.AppEntry From f48669c4ffac5df14e0ab7574a662935b5eb5bc8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Feb 2024 07:25:46 -0800 Subject: [PATCH 162/210] Bump org.postgresql:postgresql in /frameworks/Java/undertow (#8748) Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.4.1 to 42.7.2. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/commits) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Java/undertow/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/undertow/pom.xml b/frameworks/Java/undertow/pom.xml index 524d4273c74..5ff7009c963 100644 --- a/frameworks/Java/undertow/pom.xml +++ b/frameworks/Java/undertow/pom.xml @@ -19,7 +19,7 @@ 3.3.0 3.2.2 0.9.10 - 42.4.1 + 42.7.2 2.3.5.Final From d9280a64e83a5320fb17de417e5406d0f746ef2d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Feb 2024 07:25:51 -0800 Subject: [PATCH 163/210] Bump org.postgresql:postgresql in /frameworks/Java/rapidoid (#8751) Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.4.3 to 42.7.2. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/commits) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Java/rapidoid/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/rapidoid/pom.xml b/frameworks/Java/rapidoid/pom.xml index 0a016c06467..e9d05ef289a 100644 --- a/frameworks/Java/rapidoid/pom.xml +++ b/frameworks/Java/rapidoid/pom.xml @@ -28,7 +28,7 @@ org.postgresql postgresql - 42.4.3 + 42.7.2 com.zaxxer From 0061d825c25be98ead92abf84f6614e905068cd7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Feb 2024 07:26:02 -0800 Subject: [PATCH 164/210] Bump org.postgresql:postgresql in /frameworks/Java/armeria (#8750) Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.4.3 to 42.7.2. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/commits) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Java/armeria/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/armeria/pom.xml b/frameworks/Java/armeria/pom.xml index a568b3035f6..e73e9d61e3c 100644 --- a/frameworks/Java/armeria/pom.xml +++ b/frameworks/Java/armeria/pom.xml @@ -33,7 +33,7 @@ org.postgresql postgresql - 42.4.3 + 42.7.2 com.github.spullara.mustache.java From 466547e4641679100d6849ebad51ad160261cd46 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Feb 2024 07:26:10 -0800 Subject: [PATCH 165/210] Bump org.postgresql:postgresql in /frameworks/Kotlin/kooby (#8749) Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.6.0 to 42.7.2. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/commits) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Kotlin/kooby/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Kotlin/kooby/pom.xml b/frameworks/Kotlin/kooby/pom.xml index b5396de42a9..44397e8f522 100644 --- a/frameworks/Kotlin/kooby/pom.xml +++ b/frameworks/Kotlin/kooby/pom.xml @@ -13,7 +13,7 @@ 3.0.5 - 42.6.0 + 42.7.2 UTF-8 17 17 From 6fef5f22d24c3a322adfd13f270113549c500e4f Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Wed, 21 Feb 2024 16:26:49 +0100 Subject: [PATCH 166/210] Update GH actions (#8743) * Update GH actions Deprecated actions changed * Update in all workflows * More actions updated --- .github/workflows/build.yml | 10 +++++----- .github/workflows/get-maintainers.yml | 6 +++--- .github/workflows/label-failing-pr.yml | 4 ++-- .github/workflows/ping-maintainers.yml | 4 ++-- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 737a5a3017b..5bc13308a7c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -10,7 +10,7 @@ jobs: run: | mkdir -p ./pr echo ${{ github.event.number }} > ./pr/NR - - uses: actions/upload-artifact@v2 + - uses: actions/upload-artifact@v4 if: github.event_name == 'pull_request' with: name: pr @@ -20,7 +20,7 @@ jobs: # # We need to fetch more than one commit to be able to access HEAD^2 in case # of a pull request - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 10 # In case of a push event, the commit we care about is simply HEAD. @@ -46,7 +46,7 @@ jobs: echo "$(git log --format=%B -n 1 HEAD^2)" >> $GITHUB_ENV echo "EOF" >> $GITHUB_ENV echo "PREVIOUS_COMMIT=$(git log --format=%H -n 1 HEAD^2~1)" >> $GITHUB_ENV - - uses: actions/setup-python@v4 + - uses: actions/setup-python@v5 with: python-version: '3.10' architecture: 'x64' @@ -110,10 +110,10 @@ jobs: PREVIOUS_COMMIT: ${{ needs.setup.outputs.previous_commit }} PR_NUMBER: ${{ github.event.pull_request.number }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 10 - - uses: actions/setup-python@v4 + - uses: actions/setup-python@v5 with: python-version: '3.10' architecture: 'x64' diff --git a/.github/workflows/get-maintainers.yml b/.github/workflows/get-maintainers.yml index 7370310eb80..fb35e03b8c4 100644 --- a/.github/workflows/get-maintainers.yml +++ b/.github/workflows/get-maintainers.yml @@ -8,7 +8,7 @@ jobs: get_maintainers: runs-on: ubuntu-22.04 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 with: fetch-depth: 10 - name: Get commit branch and commit message from PR @@ -19,7 +19,7 @@ jobs: echo "$(git log --format=%B -n 1 HEAD^2)" >> $GITHUB_ENV echo "EOF" >> $GITHUB_ENV echo "PREVIOUS_COMMIT=$(git log --format=%H -n 1 HEAD^2~1)" >> $GITHUB_ENV - - uses: actions/setup-python@v4 + - uses: actions/setup-python@v5 with: python-version: '3.10' architecture: 'x64' @@ -31,7 +31,7 @@ jobs: run: | python ./toolset/github_actions/get_maintainers.py > ./maintainers/maintainers.md - name: Save Maintainers - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: name: maintainers path: maintainers/ diff --git a/.github/workflows/label-failing-pr.yml b/.github/workflows/label-failing-pr.yml index 84ba509086c..10910510ace 100644 --- a/.github/workflows/label-failing-pr.yml +++ b/.github/workflows/label-failing-pr.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-22.04 steps: - name: 'Download artifact' - uses: actions/github-script@v3.1.0 + uses: actions/github-script@v7 with: # scripts lightly modified from https://securitylab.github.com/research/github-actions-preventing-pwn-requests script: | @@ -32,7 +32,7 @@ jobs: fs.writeFileSync('${{github.workspace}}/pr.zip', Buffer.from(download.data)); - run: unzip pr.zip - name: Label PR - uses: actions/github-script@v3 + uses: actions/github-script@v7 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | diff --git a/.github/workflows/ping-maintainers.yml b/.github/workflows/ping-maintainers.yml index dd8dd607f68..5f97223b437 100644 --- a/.github/workflows/ping-maintainers.yml +++ b/.github/workflows/ping-maintainers.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-22.04 steps: - name: 'Download maintainers artifact' - uses: actions/github-script@v6 + uses: actions/github-script@v7 with: script: | let artifacts = await github.rest.actions.listWorkflowRunArtifacts({ @@ -32,7 +32,7 @@ jobs: fs.writeFileSync('${{github.workspace}}/maintainers.zip', Buffer.from(download.data)); - run: unzip maintainers.zip - name: Ping maintainers - uses: actions/github-script@v6 + uses: actions/github-script@v7 with: github-token: ${{ secrets.GITHUB_TOKEN }} script: | From 7fe1360c402a08c5b74e743ac70edc8919a7eff7 Mon Sep 17 00:00:00 2001 From: Joan Miquel Date: Wed, 21 Feb 2024 16:27:01 +0100 Subject: [PATCH 167/210] [php] Symfony update to v7 (#8741) * [php] Symfony update to v7 * Update cli-php.ini * Add attributes.yaml --- frameworks/PHP/symfony/composer.json | 16 ++++++++-------- .../PHP/symfony/config/routes/annotations.yaml | 7 ------- .../PHP/symfony/config/routes/attributes.yaml | 9 +++++++++ frameworks/PHP/symfony/deploy/conf/cli-php.ini | 2 +- 4 files changed, 18 insertions(+), 16 deletions(-) delete mode 100644 frameworks/PHP/symfony/config/routes/annotations.yaml create mode 100644 frameworks/PHP/symfony/config/routes/attributes.yaml diff --git a/frameworks/PHP/symfony/composer.json b/frameworks/PHP/symfony/composer.json index 074ee8b8e1a..bfee2e6ed58 100644 --- a/frameworks/PHP/symfony/composer.json +++ b/frameworks/PHP/symfony/composer.json @@ -2,18 +2,18 @@ "type": "project", "license": "proprietary", "require": { - "php": ">=8.1", + "php": ">=8.2", "ext-ctype": "*", "ext-iconv": "*", "ext-mbstring": "*", - "symfony/console": "^6", - "symfony/dotenv": "^6", + "symfony/console": "^7", + "symfony/dotenv": "^7", "symfony/flex": "^2", - "symfony/framework-bundle": "^6", + "symfony/framework-bundle": "^7", "symfony/orm-pack": "^2", - "symfony/twig-bundle": "^6", - "symfony/yaml": "^6.0", - "joanhey/adapterman": "^0.5" + "symfony/twig-bundle": "^7", + "symfony/yaml": "^7", + "joanhey/adapterman": "^0.6" }, "minimum-stability": "dev", "prefer-stable": true, @@ -65,7 +65,7 @@ "extra": { "symfony": { "allow-contrib": false, - "require": "^6", + "require": "^7", "docker": true } } diff --git a/frameworks/PHP/symfony/config/routes/annotations.yaml b/frameworks/PHP/symfony/config/routes/annotations.yaml deleted file mode 100644 index e92efc59693..00000000000 --- a/frameworks/PHP/symfony/config/routes/annotations.yaml +++ /dev/null @@ -1,7 +0,0 @@ -controllers: - resource: ../../src/Controller/ - type: annotation - -kernel: - resource: ../../src/Kernel.php - type: annotation diff --git a/frameworks/PHP/symfony/config/routes/attributes.yaml b/frameworks/PHP/symfony/config/routes/attributes.yaml new file mode 100644 index 00000000000..296cf15dacc --- /dev/null +++ b/frameworks/PHP/symfony/config/routes/attributes.yaml @@ -0,0 +1,9 @@ +controllers: + resource: + path: ../../src/Controller/ + namespace: App\Controller + type: attribute + +kernel: + resource: App\Kernel + type: attribute \ No newline at end of file diff --git a/frameworks/PHP/symfony/deploy/conf/cli-php.ini b/frameworks/PHP/symfony/deploy/conf/cli-php.ini index d3dfaa8270a..bcccffbc63b 100644 --- a/frameworks/PHP/symfony/deploy/conf/cli-php.ini +++ b/frameworks/PHP/symfony/deploy/conf/cli-php.ini @@ -13,4 +13,4 @@ memory_limit = 512M opcache.jit_buffer_size = 128M opcache.jit = tracing -disable_functions=header,header_remove,http_response_code,setcookie,session_create_id,session_id,session_name,session_save_path,session_status,session_start,session_write_close,session_regenerate_id,set_time_limit +disable_functions=header,header_remove,headers_sent,http_response_code,setcookie,session_create_id,session_id,session_name,session_save_path,session_status,session_start,session_write_close,session_regenerate_id,set_time_limit From 90877c003b961a5b875ef58ec10ff0c9f6753038 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 21 Feb 2024 07:28:19 -0800 Subject: [PATCH 168/210] Bump ip from 2.0.0 to 2.0.1 in /frameworks/JavaScript/spliffy (#8740) Bumps [ip](https://github.com/indutny/node-ip) from 2.0.0 to 2.0.1. - [Commits](https://github.com/indutny/node-ip/compare/v2.0.0...v2.0.1) --- updated-dependencies: - dependency-name: ip dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/JavaScript/spliffy/package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/JavaScript/spliffy/package-lock.json b/frameworks/JavaScript/spliffy/package-lock.json index 22f2726af09..f0c6a55ff5b 100644 --- a/frameworks/JavaScript/spliffy/package-lock.json +++ b/frameworks/JavaScript/spliffy/package-lock.json @@ -1128,9 +1128,9 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.1.tgz", + "integrity": "sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==" }, "is-property": { "version": "1.0.2", From b632215c4412d2cfab20a06506edf1d87e5fd63a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 22 Feb 2024 18:28:27 +0000 Subject: [PATCH 169/210] Bump github.com/gofiber/fiber/v2 in /frameworks/Go/fiber/src Bumps [github.com/gofiber/fiber/v2](https://github.com/gofiber/fiber) from 2.50.0 to 2.52.1. - [Release notes](https://github.com/gofiber/fiber/releases) - [Commits](https://github.com/gofiber/fiber/compare/v2.50.0...v2.52.1) --- updated-dependencies: - dependency-name: github.com/gofiber/fiber/v2 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Go/fiber/src/go.mod | 10 +++++----- frameworks/Go/fiber/src/go.sum | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/frameworks/Go/fiber/src/go.mod b/frameworks/Go/fiber/src/go.mod index c15ab7ef7da..ee8f0e442a0 100644 --- a/frameworks/Go/fiber/src/go.mod +++ b/frameworks/Go/fiber/src/go.mod @@ -4,24 +4,24 @@ go 1.19 require ( github.com/goccy/go-json v0.10.0 - github.com/gofiber/fiber/v2 v2.50.0 + github.com/gofiber/fiber/v2 v2.52.1 github.com/jackc/pgx/v5 v5.2.0 github.com/valyala/quicktemplate v1.7.0 ) require ( github.com/andybalholm/brotli v1.0.5 // indirect - github.com/google/uuid v1.3.1 // indirect + github.com/google/uuid v1.5.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect github.com/jackc/puddle/v2 v2.1.2 // indirect - github.com/klauspost/compress v1.16.7 // indirect + github.com/klauspost/compress v1.17.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect github.com/rivo/uniseg v0.2.0 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect - github.com/valyala/fasthttp v1.50.0 // indirect + github.com/valyala/fasthttp v1.51.0 // indirect github.com/valyala/tcplisten v1.0.0 // indirect go.uber.org/atomic v1.10.0 // indirect golang.org/x/crypto v0.17.0 // indirect diff --git a/frameworks/Go/fiber/src/go.sum b/frameworks/Go/fiber/src/go.sum index 7e2ce92fc6a..6ae2a6703ae 100644 --- a/frameworks/Go/fiber/src/go.sum +++ b/frameworks/Go/fiber/src/go.sum @@ -6,11 +6,11 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/goccy/go-json v0.10.0 h1:mXKd9Qw4NuzShiRlOXKews24ufknHO7gx30lsDyokKA= github.com/goccy/go-json v0.10.0/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/gofiber/fiber/v2 v2.50.0 h1:ia0JaB+uw3GpNSCR5nvC5dsaxXjRU5OEu36aytx+zGw= -github.com/gofiber/fiber/v2 v2.50.0/go.mod h1:21eytvay9Is7S6z+OgPi7c7n4++tnClWmhpimVHMimw= +github.com/gofiber/fiber/v2 v2.52.1 h1:1RoU2NS+b98o1L77sdl5mboGPiW+0Ypsi5oLmcYlgHI= +github.com/gofiber/fiber/v2 v2.52.1/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= +github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg= @@ -21,13 +21,13 @@ github.com/jackc/puddle/v2 v2.1.2 h1:0f7vaaXINONKTsxYDn4otOAiJanX/BMeAtY//BXqzlg github.com/jackc/puddle/v2 v2.1.2/go.mod h1:2lpufsF5mRHO6SuZkm0fNYxM6SWHfvyFj62KwNzgels= github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= -github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM= +github.com/klauspost/compress v1.17.0/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -41,8 +41,8 @@ github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PK github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.30.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus= -github.com/valyala/fasthttp v1.50.0 h1:H7fweIlBm0rXLs2q0XbalvJ6r0CUPFWK3/bB4N13e9M= -github.com/valyala/fasthttp v1.50.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA= +github.com/valyala/fasthttp v1.51.0 h1:8b30A5JlZ6C7AS81RsWjYMQmrZG6feChmgAolCl1SqA= +github.com/valyala/fasthttp v1.51.0/go.mod h1:oI2XroL+lI7vdXyYoQk03bXBThfFl2cVdIA3Xl7cH8g= github.com/valyala/quicktemplate v1.7.0 h1:LUPTJmlVcb46OOUY3IeD9DojFpAVbsG+5WFTcjMJzCM= github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/VPSJnLYn+LmLk8= github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= From 76a208171df83080242a9209a7ab9c310e7bf032 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Feb 2024 21:35:47 +0000 Subject: [PATCH 170/210] Bump orjson from 3.6.5 to 3.9.15 in /frameworks/Python/pyramid Bumps [orjson](https://github.com/ijl/orjson) from 3.6.5 to 3.9.15. - [Release notes](https://github.com/ijl/orjson/releases) - [Changelog](https://github.com/ijl/orjson/blob/master/CHANGELOG.md) - [Commits](https://github.com/ijl/orjson/compare/3.6.5...3.9.15) --- updated-dependencies: - dependency-name: orjson dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Python/pyramid/requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Python/pyramid/requirements.txt b/frameworks/Python/pyramid/requirements.txt index 9a4521e4b5a..73d07efbeb0 100644 --- a/frameworks/Python/pyramid/requirements.txt +++ b/frameworks/Python/pyramid/requirements.txt @@ -12,7 +12,7 @@ gunicorn==20.1.0 # via -r requirements.in hupper==1.10.3 # via pyramid -orjson==3.6.5 +orjson==3.9.15 # via -r requirements.in pastedeploy==2.1.1 # via plaster-pastedeploy @@ -38,9 +38,9 @@ venusian==3.0.0 # via pyramid webob==1.8.7 # via pyramid -zope.deprecation==4.4.0 +zope-deprecation==4.4.0 # via pyramid -zope.interface==5.4.0 +zope-interface==5.4.0 # via pyramid # The following packages are considered to be unsafe in a requirements file: From 16227c357c2b070e7b59a4987d18f61d84150809 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 26 Feb 2024 21:51:35 +0000 Subject: [PATCH 171/210] Bump orjson from 3.9.10 to 3.9.15 in /frameworks/Python/heaven Bumps [orjson](https://github.com/ijl/orjson) from 3.9.10 to 3.9.15. - [Release notes](https://github.com/ijl/orjson/releases) - [Changelog](https://github.com/ijl/orjson/blob/master/CHANGELOG.md) - [Commits](https://github.com/ijl/orjson/compare/3.9.10...3.9.15) --- updated-dependencies: - dependency-name: orjson dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Python/heaven/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/heaven/requirements.txt b/frameworks/Python/heaven/requirements.txt index 3e8a09ee6f7..d3a26597539 100644 --- a/frameworks/Python/heaven/requirements.txt +++ b/frameworks/Python/heaven/requirements.txt @@ -1,4 +1,4 @@ asyncpg==0.29.0 heaven==0.2.4 -orjson==3.9.10 +orjson==3.9.15 gunicorn==20.1.0 From cbe002e5a762905c8e58ca34a2e8597be1a1c2d1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 27 Feb 2024 21:42:10 +0000 Subject: [PATCH 172/210] Bump rails from 7.1.0 to 7.1.3.1 in /frameworks/Ruby/rails Bumps [rails](https://github.com/rails/rails) from 7.1.0 to 7.1.3.1. - [Release notes](https://github.com/rails/rails/releases) - [Commits](https://github.com/rails/rails/compare/v7.1.0...v7.1.3.1) --- updated-dependencies: - dependency-name: rails dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Ruby/rails/Gemfile | 2 +- frameworks/Ruby/rails/Gemfile.lock | 157 +++++++++++++++-------------- 2 files changed, 80 insertions(+), 79 deletions(-) diff --git a/frameworks/Ruby/rails/Gemfile b/frameworks/Ruby/rails/Gemfile index 04b3343f6c4..eb36722fcfa 100644 --- a/frameworks/Ruby/rails/Gemfile +++ b/frameworks/Ruby/rails/Gemfile @@ -6,6 +6,6 @@ gem 'trilogy', group: :mysql gem 'oj', '~> 3.16' gem 'pg', '1.5.4', group: :postgresql gem 'puma', '~> 6.4' -gem 'rails', '~> 7.1.0' +gem 'rails', '~> 7.1.3' gem 'redis', '~> 5.0' gem 'tzinfo-data' diff --git a/frameworks/Ruby/rails/Gemfile.lock b/frameworks/Ruby/rails/Gemfile.lock index 39a530c9227..db5f4e25cee 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -1,70 +1,71 @@ GEM remote: https://rubygems.org/ specs: - actioncable (7.1.0) - actionpack (= 7.1.0) - activesupport (= 7.1.0) + actioncable (7.1.3.1) + actionpack (= 7.1.3.1) + activesupport (= 7.1.3.1) nio4r (~> 2.0) websocket-driver (>= 0.6.1) zeitwerk (~> 2.6) - actionmailbox (7.1.0) - actionpack (= 7.1.0) - activejob (= 7.1.0) - activerecord (= 7.1.0) - activestorage (= 7.1.0) - activesupport (= 7.1.0) + actionmailbox (7.1.3.1) + actionpack (= 7.1.3.1) + activejob (= 7.1.3.1) + activerecord (= 7.1.3.1) + activestorage (= 7.1.3.1) + activesupport (= 7.1.3.1) mail (>= 2.7.1) net-imap net-pop net-smtp - actionmailer (7.1.0) - actionpack (= 7.1.0) - actionview (= 7.1.0) - activejob (= 7.1.0) - activesupport (= 7.1.0) + actionmailer (7.1.3.1) + actionpack (= 7.1.3.1) + actionview (= 7.1.3.1) + activejob (= 7.1.3.1) + activesupport (= 7.1.3.1) mail (~> 2.5, >= 2.5.4) net-imap net-pop net-smtp rails-dom-testing (~> 2.2) - actionpack (7.1.0) - actionview (= 7.1.0) - activesupport (= 7.1.0) + actionpack (7.1.3.1) + actionview (= 7.1.3.1) + activesupport (= 7.1.3.1) nokogiri (>= 1.8.5) + racc rack (>= 2.2.4) rack-session (>= 1.0.1) rack-test (>= 0.6.3) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - actiontext (7.1.0) - actionpack (= 7.1.0) - activerecord (= 7.1.0) - activestorage (= 7.1.0) - activesupport (= 7.1.0) + actiontext (7.1.3.1) + actionpack (= 7.1.3.1) + activerecord (= 7.1.3.1) + activestorage (= 7.1.3.1) + activesupport (= 7.1.3.1) globalid (>= 0.6.0) nokogiri (>= 1.8.5) - actionview (7.1.0) - activesupport (= 7.1.0) + actionview (7.1.3.1) + activesupport (= 7.1.3.1) builder (~> 3.1) erubi (~> 1.11) rails-dom-testing (~> 2.2) rails-html-sanitizer (~> 1.6) - activejob (7.1.0) - activesupport (= 7.1.0) + activejob (7.1.3.1) + activesupport (= 7.1.3.1) globalid (>= 0.3.6) - activemodel (7.1.0) - activesupport (= 7.1.0) - activerecord (7.1.0) - activemodel (= 7.1.0) - activesupport (= 7.1.0) + activemodel (7.1.3.1) + activesupport (= 7.1.3.1) + activerecord (7.1.3.1) + activemodel (= 7.1.3.1) + activesupport (= 7.1.3.1) timeout (>= 0.4.0) - activestorage (7.1.0) - actionpack (= 7.1.0) - activejob (= 7.1.0) - activerecord (= 7.1.0) - activesupport (= 7.1.0) + activestorage (7.1.3.1) + actionpack (= 7.1.3.1) + activejob (= 7.1.3.1) + activerecord (= 7.1.3.1) + activesupport (= 7.1.3.1) marcel (~> 1.0) - activesupport (7.1.0) + activesupport (7.1.3.1) base64 bigdecimal concurrent-ruby (~> 1.0, >= 1.0.2) @@ -74,25 +75,25 @@ GEM minitest (>= 5.1) mutex_m tzinfo (~> 2.0) - base64 (0.1.1) - bigdecimal (3.1.4) + base64 (0.2.0) + bigdecimal (3.1.6) builder (3.2.4) - concurrent-ruby (1.1.10) + concurrent-ruby (1.2.3) connection_pool (2.4.1) crass (1.0.6) - date (3.3.3) - drb (2.1.1) + date (3.3.4) + drb (2.2.0) ruby2_keywords erubi (1.12.0) globalid (1.2.1) activesupport (>= 6.1) i18n (1.14.1) concurrent-ruby (~> 1.0) - io-console (0.6.0) - irb (1.8.1) + io-console (0.7.2) + irb (1.11.2) rdoc - reline (>= 0.3.8) - loofah (2.21.3) + reline (>= 0.4.2) + loofah (2.22.0) crass (~> 1.0.2) nokogiri (>= 1.12.0) mail (2.8.1) @@ -103,16 +104,16 @@ GEM marcel (1.0.2) mini_mime (1.1.5) mini_portile2 (2.8.5) - minitest (5.20.0) - mutex_m (0.1.2) - net-imap (0.4.0) + minitest (5.22.2) + mutex_m (0.2.0) + net-imap (0.4.10) date net-protocol net-pop (0.1.2) net-protocol - net-protocol (0.2.1) + net-protocol (0.2.2) timeout - net-smtp (0.4.0) + net-smtp (0.4.0.1) net-protocol nio4r (2.7.0) nokogiri (1.16.2) @@ -124,12 +125,12 @@ GEM racc (~> 1.4) oj (3.16.1) pg (1.5.4) - psych (5.1.0) + psych (5.1.2) stringio puma (6.4.2) nio4r (~> 2.0) racc (1.7.3) - rack (3.0.8) + rack (3.0.9.1) rack-session (2.0.0) rack (>= 3.0.0) rack-test (2.1.0) @@ -137,20 +138,20 @@ GEM rackup (2.1.0) rack (>= 3) webrick (~> 1.8) - rails (7.1.0) - actioncable (= 7.1.0) - actionmailbox (= 7.1.0) - actionmailer (= 7.1.0) - actionpack (= 7.1.0) - actiontext (= 7.1.0) - actionview (= 7.1.0) - activejob (= 7.1.0) - activemodel (= 7.1.0) - activerecord (= 7.1.0) - activestorage (= 7.1.0) - activesupport (= 7.1.0) + rails (7.1.3.1) + actioncable (= 7.1.3.1) + actionmailbox (= 7.1.3.1) + actionmailer (= 7.1.3.1) + actionpack (= 7.1.3.1) + actiontext (= 7.1.3.1) + actionview (= 7.1.3.1) + activejob (= 7.1.3.1) + activemodel (= 7.1.3.1) + activerecord (= 7.1.3.1) + activestorage (= 7.1.3.1) + activesupport (= 7.1.3.1) bundler (>= 1.15.0) - railties (= 7.1.0) + railties (= 7.1.3.1) rails-dom-testing (2.2.0) activesupport (>= 5.0.0) minitest @@ -158,29 +159,29 @@ GEM rails-html-sanitizer (1.6.0) loofah (~> 2.21) nokogiri (~> 1.14) - railties (7.1.0) - actionpack (= 7.1.0) - activesupport (= 7.1.0) + railties (7.1.3.1) + actionpack (= 7.1.3.1) + activesupport (= 7.1.3.1) irb rackup (>= 1.0.0) rake (>= 12.2) thor (~> 1.0, >= 1.2.2) zeitwerk (~> 2.6) - rake (13.0.6) - rdoc (6.5.0) + rake (13.1.0) + rdoc (6.6.2) psych (>= 4.0.0) redis (5.0.7) redis-client (>= 0.9.0) redis-client (0.17.0) connection_pool - reline (0.3.9) + reline (0.4.3) io-console (~> 0.5) ruby2_keywords (0.0.5) - stringio (3.0.8) - thor (1.2.2) - timeout (0.4.0) + stringio (3.1.0) + thor (1.3.1) + timeout (0.4.1) trilogy (2.6.0) - tzinfo (2.0.5) + tzinfo (2.0.6) concurrent-ruby (~> 1.0) tzinfo-data (1.2021.5) tzinfo (>= 1.0.0) @@ -188,7 +189,7 @@ GEM websocket-driver (0.7.6) websocket-extensions (>= 0.1.0) websocket-extensions (0.1.5) - zeitwerk (2.6.12) + zeitwerk (2.6.13) PLATFORMS arm64-darwin-20 @@ -199,7 +200,7 @@ DEPENDENCIES oj (~> 3.16) pg (= 1.5.4) puma (~> 6.4) - rails (~> 7.1.0) + rails (~> 7.1.3) redis (~> 5.0) trilogy tzinfo-data From aef129579fbbda11a91ba373e89ab9920ad09e9e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 28 Feb 2024 23:00:54 +0000 Subject: [PATCH 173/210] Bump rack from 3.0.7 to 3.0.9.1 in /frameworks/Ruby/rack Bumps [rack](https://github.com/rack/rack) from 3.0.7 to 3.0.9.1. - [Release notes](https://github.com/rack/rack/releases) - [Changelog](https://github.com/rack/rack/blob/main/CHANGELOG.md) - [Commits](https://github.com/rack/rack/compare/v3.0.7...v3.0.9.1) --- updated-dependencies: - dependency-name: rack dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Ruby/rack/Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Ruby/rack/Gemfile.lock b/frameworks/Ruby/rack/Gemfile.lock index 159df8aa275..d8bc4105c68 100644 --- a/frameworks/Ruby/rack/Gemfile.lock +++ b/frameworks/Ruby/rack/Gemfile.lock @@ -69,7 +69,7 @@ GEM rack (>= 1.0) puma (6.4.2) nio4r (~> 2.0) - rack (3.0.7) + rack (3.0.9.1) rack-test (2.1.0) rack (>= 1.3) rainbow (3.1.1) From 090c3193fab6c2455012efa93bf324f265e9b6cf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Mar 2024 21:28:11 +0000 Subject: [PATCH 174/210] Bump mio from 0.8.0 to 0.8.11 in /frameworks/Rust/astra Bumps [mio](https://github.com/tokio-rs/mio) from 0.8.0 to 0.8.11. - [Release notes](https://github.com/tokio-rs/mio/releases) - [Changelog](https://github.com/tokio-rs/mio/blob/master/CHANGELOG.md) - [Commits](https://github.com/tokio-rs/mio/compare/v0.8.0...v0.8.11) --- updated-dependencies: - dependency-name: mio dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Rust/astra/Cargo.lock | 105 ++++++++++++++++++++----------- 1 file changed, 68 insertions(+), 37 deletions(-) diff --git a/frameworks/Rust/astra/Cargo.lock b/frameworks/Rust/astra/Cargo.lock index 3cd9550884b..3eb313f1e71 100644 --- a/frameworks/Rust/astra/Cargo.lock +++ b/frameworks/Rust/astra/Cargo.lock @@ -125,7 +125,7 @@ checksum = "d39cd93900197114fa1fcb7ae84ca742095eed9442088988ae74fa744e930e77" dependencies = [ "cfg-if", "libc", - "wasi", + "wasi 0.10.2+wasi-snapshot-preview1", ] [[package]] @@ -262,9 +262,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.108" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8521a1b57e76b1ec69af7599e75e38e7b7fad6610f037db8c79b127201b5d119" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libmimalloc-sys" @@ -301,33 +301,14 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.0" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba272f85fa0b41fc91872be579b3bbe0f56b792aa361a380eb669469f68dafb2" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "log", - "miow", - "ntapi", - "winapi", -] - -[[package]] -name = "miow" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" -dependencies = [ - "winapi", -] - -[[package]] -name = "ntapi" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44" -dependencies = [ - "winapi", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys", ] [[package]] @@ -556,23 +537,73 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" [[package]] -name = "winapi" -version = "0.3.9" +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] [[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" +name = "windows_x86_64_msvc" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" From 4ee4a89318b742c49da076bad20efd14f422a07b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Mar 2024 21:40:40 +0000 Subject: [PATCH 175/210] Bump mio from 0.8.5 to 0.8.11 in /frameworks/Rust/warp-rust Bumps [mio](https://github.com/tokio-rs/mio) from 0.8.5 to 0.8.11. - [Release notes](https://github.com/tokio-rs/mio/releases) - [Changelog](https://github.com/tokio-rs/mio/blob/master/CHANGELOG.md) - [Commits](https://github.com/tokio-rs/mio/compare/v0.8.5...v0.8.11) --- updated-dependencies: - dependency-name: mio dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Rust/warp-rust/Cargo.lock | 92 ++++++++++++++++++++++++---- 1 file changed, 79 insertions(+), 13 deletions(-) diff --git a/frameworks/Rust/warp-rust/Cargo.lock b/frameworks/Rust/warp-rust/Cargo.lock index b9a3dc06488..fbd9a71340e 100644 --- a/frameworks/Rust/warp-rust/Cargo.lock +++ b/frameworks/Rust/warp-rust/Cargo.lock @@ -969,9 +969,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.139" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "line-wrap" @@ -1069,14 +1069,14 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.5" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "log", "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -1889,7 +1889,7 @@ dependencies = [ "pin-project-lite", "socket2", "tokio-macros", - "windows-sys", + "windows-sys 0.42.0", ] [[package]] @@ -2379,13 +2379,37 @@ version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.42.1", + "windows_aarch64_msvc 0.42.1", + "windows_i686_gnu 0.42.1", + "windows_i686_msvc 0.42.1", + "windows_x86_64_gnu 0.42.1", + "windows_x86_64_gnullvm 0.42.1", + "windows_x86_64_msvc 0.42.1", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", ] [[package]] @@ -2394,42 +2418,84 @@ version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + [[package]] name = "windows_aarch64_msvc" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7" +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + [[package]] name = "windows_i686_gnu" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640" +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + [[package]] name = "windows_i686_msvc" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605" +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + [[package]] name = "windows_x86_64_gnu" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45" +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + [[package]] name = "windows_x86_64_msvc" version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd" +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + [[package]] name = "xml-rs" version = "0.8.14" From c2f78f8ac17534c89c9e43fde4ce6cf9bd1fc690 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 4 Mar 2024 21:49:36 +0000 Subject: [PATCH 176/210] Bump mio from 0.8.6 to 0.8.11 in /frameworks/Rust/pavex Bumps [mio](https://github.com/tokio-rs/mio) from 0.8.6 to 0.8.11. - [Release notes](https://github.com/tokio-rs/mio/releases) - [Changelog](https://github.com/tokio-rs/mio/blob/master/CHANGELOG.md) - [Commits](https://github.com/tokio-rs/mio/compare/v0.8.6...v0.8.11) --- updated-dependencies: - dependency-name: mio dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Rust/pavex/Cargo.lock | 96 +++++++++++++++++++++++++++----- 1 file changed, 81 insertions(+), 15 deletions(-) diff --git a/frameworks/Rust/pavex/Cargo.lock b/frameworks/Rust/pavex/Cargo.lock index 59472e0d09f..cf9569133b4 100644 --- a/frameworks/Rust/pavex/Cargo.lock +++ b/frameworks/Rust/pavex/Cargo.lock @@ -278,9 +278,9 @@ checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" [[package]] name = "libc" -version = "0.2.142" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "lock_api" @@ -315,14 +315,14 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "mio" -version = "0.8.6" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", "log", "wasi", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -361,7 +361,7 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-sys", + "windows-sys 0.45.0", ] [[package]] @@ -607,7 +607,7 @@ dependencies = [ "signal-hook-registry", "socket2", "tokio-macros", - "windows-sys", + "windows-sys 0.45.0", ] [[package]] @@ -717,7 +717,16 @@ version = "0.45.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" dependencies = [ - "windows-targets", + "windows-targets 0.42.2", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", ] [[package]] @@ -726,13 +735,28 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", ] [[package]] @@ -741,38 +765,80 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + [[package]] name = "windows_aarch64_msvc" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + [[package]] name = "windows_i686_gnu" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + [[package]] name = "windows_i686_msvc" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + [[package]] name = "windows_x86_64_gnu" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + [[package]] name = "windows_x86_64_msvc" version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" From c2d11db2a23db4de25655042c582f03a61e61c1b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Mar 2024 15:15:40 +0000 Subject: [PATCH 177/210] Bump github.com/jackc/pgx/v4 in /frameworks/Go/fasthttp/src Bumps [github.com/jackc/pgx/v4](https://github.com/jackc/pgx) from 4.17.2 to 4.18.2. - [Changelog](https://github.com/jackc/pgx/blob/v4.18.2/CHANGELOG.md) - [Commits](https://github.com/jackc/pgx/compare/v4.17.2...v4.18.2) --- updated-dependencies: - dependency-name: github.com/jackc/pgx/v4 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Go/fasthttp/src/go.mod | 14 ++++++------- frameworks/Go/fasthttp/src/go.sum | 34 ++++++++++++++----------------- 2 files changed, 22 insertions(+), 26 deletions(-) diff --git a/frameworks/Go/fasthttp/src/go.mod b/frameworks/Go/fasthttp/src/go.mod index 12cf4523a7a..59cdcddeacd 100644 --- a/frameworks/Go/fasthttp/src/go.mod +++ b/frameworks/Go/fasthttp/src/go.mod @@ -3,7 +3,7 @@ module fasthttp/app go 1.19 require ( - github.com/jackc/pgx/v4 v4.17.2 + github.com/jackc/pgx/v4 v4.18.2 github.com/savsgio/gotils v0.0.0-20220530130905-52f3993e8d6d github.com/valyala/fasthttp v1.40.0 github.com/valyala/quicktemplate v1.7.0 @@ -12,17 +12,17 @@ require ( require ( github.com/andybalholm/brotli v1.0.4 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect - github.com/jackc/pgconn v1.13.0 // indirect + github.com/jackc/pgconn v1.14.3 // indirect github.com/jackc/pgio v1.0.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgproto3/v2 v2.3.1 // indirect - github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect - github.com/jackc/pgtype v1.12.0 // indirect + github.com/jackc/pgproto3/v2 v2.3.3 // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/pgtype v1.14.0 // indirect github.com/jackc/puddle v1.3.0 // indirect github.com/klauspost/compress v1.15.10 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/tcplisten v1.0.0 // indirect - golang.org/x/crypto v0.17.0 // indirect - golang.org/x/sys v0.15.0 // indirect + golang.org/x/crypto v0.20.0 // indirect + golang.org/x/sys v0.17.0 // indirect golang.org/x/text v0.14.0 // indirect ) diff --git a/frameworks/Go/fasthttp/src/go.sum b/frameworks/Go/fasthttp/src/go.sum index 96ecf56867e..b8c91b7aa99 100644 --- a/frameworks/Go/fasthttp/src/go.sum +++ b/frameworks/Go/fasthttp/src/go.sum @@ -30,8 +30,8 @@ github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsU github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= -github.com/jackc/pgconn v1.13.0 h1:3L1XMNV2Zvca/8BYhzcRFS70Lr0WlDg16Di6SFGAbys= -github.com/jackc/pgconn v1.13.0/go.mod h1:AnowpAqO4CMIIJNZl2VJp+KrkAZciAkhEl0W0JIobpI= +github.com/jackc/pgconn v1.14.3 h1:bVoTr12EGANZz66nZPkMInAV/KHD2TxH9npjXXgiB3w= +github.com/jackc/pgconn v1.14.3/go.mod h1:RZbme4uasqzybK2RK5c65VsHxoyaml09lx3tXOcO/VM= github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= @@ -47,22 +47,23 @@ github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvW github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.3.1 h1:nwj7qwf0S+Q7ISFfBndqeLwSwxs+4DPsbRFjECT1Y4Y= -github.com/jackc/pgproto3/v2 v2.3.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg= +github.com/jackc/pgproto3/v2 v2.3.3 h1:1HLSx5H+tXR9pW3in3zaztoEwQYRC9SQaYUHjTSUOag= +github.com/jackc/pgproto3/v2 v2.3.3/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= -github.com/jackc/pgtype v1.12.0 h1:Dlq8Qvcch7kiehm8wPGIW0W3KsCCHJnRacKW0UM8n5w= -github.com/jackc/pgtype v1.12.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= +github.com/jackc/pgtype v1.14.0 h1:y+xUdabmyMkJLyApYuPj38mW+aAIqCe5uuBB51rH3Vw= +github.com/jackc/pgtype v1.14.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= -github.com/jackc/pgx/v4 v4.17.2 h1:0Ut0rpeKwvIVbMQ1KbMBU4h6wxehBI535LK6Flheh8E= -github.com/jackc/pgx/v4 v4.17.2/go.mod h1:lcxIZN44yMIrWI78a5CpucdD14hX0SBDbNRvjDBItsw= +github.com/jackc/pgx/v4 v4.18.2 h1:xVpYkNR5pk5bMCZGfClbO962UIqVABcAGt7ha1s/FeU= +github.com/jackc/pgx/v4 v4.18.2/go.mod h1:Ey4Oru5tH5sB6tV7hDmfWFahwF15Eb7DNXlRKx2CkVw= github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= @@ -109,15 +110,12 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.30.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus= @@ -150,9 +148,8 @@ golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5 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-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -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.20.0 h1:jmAMJJZXr5KiCw05dfYK9QnqaqKLYXijU23lsEdcQqg= +golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= 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= @@ -181,8 +178,8 @@ golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/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-20220227234510-4e6760a101f9/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.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.17.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/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -214,5 +211,4 @@ gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:a gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= From 122834539b8670bac4208a6f331233bf3505a3f4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 12 Mar 2024 15:24:51 +0000 Subject: [PATCH 178/210] Bump github.com/jackc/pgx/v4 in /frameworks/Go/goframe/src Bumps [github.com/jackc/pgx/v4](https://github.com/jackc/pgx) from 4.17.2 to 4.18.2. - [Changelog](https://github.com/jackc/pgx/blob/v4.18.2/CHANGELOG.md) - [Commits](https://github.com/jackc/pgx/compare/v4.17.2...v4.18.2) --- updated-dependencies: - dependency-name: github.com/jackc/pgx/v4 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Go/goframe/src/go.mod | 16 +++++++------- frameworks/Go/goframe/src/go.sum | 37 +++++++++++++++----------------- 2 files changed, 25 insertions(+), 28 deletions(-) diff --git a/frameworks/Go/goframe/src/go.mod b/frameworks/Go/goframe/src/go.mod index d91287f8994..81cd961b3a6 100644 --- a/frameworks/Go/goframe/src/go.mod +++ b/frameworks/Go/goframe/src/go.mod @@ -5,7 +5,7 @@ go 1.19 require ( github.com/bytedance/sonic v1.4.0 github.com/gogf/gf/v2 v2.1.4 - github.com/jackc/pgx/v4 v4.17.2 + github.com/jackc/pgx/v4 v4.18.2 github.com/valyala/quicktemplate v1.7.0 ) @@ -23,12 +23,12 @@ require ( github.com/gorilla/websocket v1.5.0 // indirect github.com/grokify/html-strip-tags-go v0.0.1 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect - github.com/jackc/pgconn v1.13.0 // indirect + github.com/jackc/pgconn v1.14.3 // indirect github.com/jackc/pgio v1.0.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgproto3/v2 v2.3.1 // indirect - github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect - github.com/jackc/pgtype v1.12.0 // indirect + github.com/jackc/pgproto3/v2 v2.3.3 // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/pgtype v1.14.0 // indirect github.com/jackc/puddle v1.3.0 // indirect github.com/klauspost/cpuid/v2 v2.0.9 // indirect github.com/magiconair/properties v1.8.6 // indirect @@ -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.17.0 // indirect - golang.org/x/net v0.17.0 // indirect - golang.org/x/sys v0.15.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/text v0.14.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/frameworks/Go/goframe/src/go.sum b/frameworks/Go/goframe/src/go.sum index 5f299548884..3b2bb947b83 100644 --- a/frameworks/Go/goframe/src/go.sum +++ b/frameworks/Go/goframe/src/go.sum @@ -83,8 +83,8 @@ github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsU github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= -github.com/jackc/pgconn v1.13.0 h1:3L1XMNV2Zvca/8BYhzcRFS70Lr0WlDg16Di6SFGAbys= -github.com/jackc/pgconn v1.13.0/go.mod h1:AnowpAqO4CMIIJNZl2VJp+KrkAZciAkhEl0W0JIobpI= +github.com/jackc/pgconn v1.14.3 h1:bVoTr12EGANZz66nZPkMInAV/KHD2TxH9npjXXgiB3w= +github.com/jackc/pgconn v1.14.3/go.mod h1:RZbme4uasqzybK2RK5c65VsHxoyaml09lx3tXOcO/VM= github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= @@ -100,22 +100,23 @@ github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvW github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.3.1 h1:nwj7qwf0S+Q7ISFfBndqeLwSwxs+4DPsbRFjECT1Y4Y= -github.com/jackc/pgproto3/v2 v2.3.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg= +github.com/jackc/pgproto3/v2 v2.3.3 h1:1HLSx5H+tXR9pW3in3zaztoEwQYRC9SQaYUHjTSUOag= +github.com/jackc/pgproto3/v2 v2.3.3/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= -github.com/jackc/pgtype v1.12.0 h1:Dlq8Qvcch7kiehm8wPGIW0W3KsCCHJnRacKW0UM8n5w= -github.com/jackc/pgtype v1.12.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= +github.com/jackc/pgtype v1.14.0 h1:y+xUdabmyMkJLyApYuPj38mW+aAIqCe5uuBB51rH3Vw= +github.com/jackc/pgtype v1.14.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= -github.com/jackc/pgx/v4 v4.17.2 h1:0Ut0rpeKwvIVbMQ1KbMBU4h6wxehBI535LK6Flheh8E= -github.com/jackc/pgx/v4 v4.17.2/go.mod h1:lcxIZN44yMIrWI78a5CpucdD14hX0SBDbNRvjDBItsw= +github.com/jackc/pgx/v4 v4.18.2 h1:xVpYkNR5pk5bMCZGfClbO962UIqVABcAGt7ha1s/FeU= +github.com/jackc/pgx/v4 v4.18.2/go.mod h1:Ey4Oru5tH5sB6tV7hDmfWFahwF15Eb7DNXlRKx2CkVw= github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= @@ -191,15 +192,13 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/tidwall/gjson v1.12.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/gjson v1.13.0 h1:3TFY9yxOQShrvmjdM76K+jc66zJeT6D3/VFFYCGQf7M= github.com/tidwall/gjson v1.13.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= @@ -249,9 +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.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -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.20.0 h1:jmAMJJZXr5KiCw05dfYK9QnqaqKLYXijU23lsEdcQqg= +golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= 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= @@ -269,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.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +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/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= @@ -302,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.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +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/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= @@ -311,7 +309,6 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8-0.20211105212822-18b340fc7af2/go.mod h1:EFNZuWvGYxIRUEX+K8UmCFwYmZjqcrnq15ZuVldZkZ0= golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= From 7ed69e121f380350652aec510ad8554f97385637 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Mar 2024 21:48:35 +0000 Subject: [PATCH 179/210] Bump google.golang.org/protobuf in /frameworks/Go/hertz/hertz-gorm Bumps google.golang.org/protobuf from 1.28.0 to 1.33.0. --- updated-dependencies: - dependency-name: google.golang.org/protobuf dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Go/hertz/hertz-gorm/go.mod | 2 +- frameworks/Go/hertz/hertz-gorm/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Go/hertz/hertz-gorm/go.mod b/frameworks/Go/hertz/hertz-gorm/go.mod index dcc055b386e..1830315e192 100644 --- a/frameworks/Go/hertz/hertz-gorm/go.mod +++ b/frameworks/Go/hertz/hertz-gorm/go.mod @@ -39,5 +39,5 @@ require ( golang.org/x/crypto v0.17.0 // indirect golang.org/x/sys v0.15.0 // indirect golang.org/x/text v0.14.0 // indirect - google.golang.org/protobuf v1.28.0 // indirect + google.golang.org/protobuf v1.33.0 // indirect ) diff --git a/frameworks/Go/hertz/hertz-gorm/go.sum b/frameworks/Go/hertz/hertz-gorm/go.sum index 3ae8633a97a..716359ab28f 100644 --- a/frameworks/Go/hertz/hertz-gorm/go.sum +++ b/frameworks/Go/hertz/hertz-gorm/go.sum @@ -246,8 +246,8 @@ golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1N golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= From 192d288a6bf2d8b12aaa9b5533e80a374071db0b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Mar 2024 21:54:59 +0000 Subject: [PATCH 180/210] Bump github.com/jackc/pgx/v4 in /frameworks/Go/hertz/hertz-gorm Bumps [github.com/jackc/pgx/v4](https://github.com/jackc/pgx) from 4.17.2 to 4.18.2. - [Changelog](https://github.com/jackc/pgx/blob/v4.18.2/CHANGELOG.md) - [Commits](https://github.com/jackc/pgx/compare/v4.17.2...v4.18.2) --- updated-dependencies: - dependency-name: github.com/jackc/pgx/v4 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Go/hertz/hertz-gorm/go.mod | 14 +++++++------- frameworks/Go/hertz/hertz-gorm/go.sum | 23 ++++++++++++++--------- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/frameworks/Go/hertz/hertz-gorm/go.mod b/frameworks/Go/hertz/hertz-gorm/go.mod index 1830315e192..761cb65fa64 100644 --- a/frameworks/Go/hertz/hertz-gorm/go.mod +++ b/frameworks/Go/hertz/hertz-gorm/go.mod @@ -20,13 +20,13 @@ require ( github.com/henrylee2cn/ameda v1.4.10 // indirect github.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect - github.com/jackc/pgconn v1.13.0 // indirect + github.com/jackc/pgconn v1.14.3 // indirect github.com/jackc/pgio v1.0.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgproto3/v2 v2.3.1 // indirect - github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect - github.com/jackc/pgtype v1.12.0 // indirect - github.com/jackc/pgx/v4 v4.17.2 // indirect + github.com/jackc/pgproto3/v2 v2.3.3 // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/pgtype v1.14.0 // indirect + github.com/jackc/pgx/v4 v4.18.2 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/klauspost/cpuid/v2 v2.0.9 // indirect @@ -36,8 +36,8 @@ require ( github.com/tidwall/pretty v1.2.0 // indirect github.com/twitchyliquid64/golang-asm v0.15.1 // indirect golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect - golang.org/x/crypto v0.17.0 // indirect - golang.org/x/sys v0.15.0 // indirect + golang.org/x/crypto v0.20.0 // indirect + golang.org/x/sys v0.17.0 // indirect golang.org/x/text v0.14.0 // indirect google.golang.org/protobuf v1.33.0 // indirect ) diff --git a/frameworks/Go/hertz/hertz-gorm/go.sum b/frameworks/Go/hertz/hertz-gorm/go.sum index 716359ab28f..8dba8ad80e8 100644 --- a/frameworks/Go/hertz/hertz-gorm/go.sum +++ b/frameworks/Go/hertz/hertz-gorm/go.sum @@ -57,8 +57,9 @@ github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsU github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= -github.com/jackc/pgconn v1.13.0 h1:3L1XMNV2Zvca/8BYhzcRFS70Lr0WlDg16Di6SFGAbys= github.com/jackc/pgconn v1.13.0/go.mod h1:AnowpAqO4CMIIJNZl2VJp+KrkAZciAkhEl0W0JIobpI= +github.com/jackc/pgconn v1.14.3 h1:bVoTr12EGANZz66nZPkMInAV/KHD2TxH9npjXXgiB3w= +github.com/jackc/pgconn v1.14.3/go.mod h1:RZbme4uasqzybK2RK5c65VsHxoyaml09lx3tXOcO/VM= github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= @@ -74,22 +75,26 @@ github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvW github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.3.1 h1:nwj7qwf0S+Q7ISFfBndqeLwSwxs+4DPsbRFjECT1Y4Y= github.com/jackc/pgproto3/v2 v2.3.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg= +github.com/jackc/pgproto3/v2 v2.3.3 h1:1HLSx5H+tXR9pW3in3zaztoEwQYRC9SQaYUHjTSUOag= +github.com/jackc/pgproto3/v2 v2.3.3/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= -github.com/jackc/pgtype v1.12.0 h1:Dlq8Qvcch7kiehm8wPGIW0W3KsCCHJnRacKW0UM8n5w= github.com/jackc/pgtype v1.12.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= +github.com/jackc/pgtype v1.14.0 h1:y+xUdabmyMkJLyApYuPj38mW+aAIqCe5uuBB51rH3Vw= +github.com/jackc/pgtype v1.14.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= -github.com/jackc/pgx/v4 v4.17.2 h1:0Ut0rpeKwvIVbMQ1KbMBU4h6wxehBI535LK6Flheh8E= github.com/jackc/pgx/v4 v4.17.2/go.mod h1:lcxIZN44yMIrWI78a5CpucdD14hX0SBDbNRvjDBItsw= +github.com/jackc/pgx/v4 v4.18.2 h1:xVpYkNR5pk5bMCZGfClbO962UIqVABcAGt7ha1s/FeU= +github.com/jackc/pgx/v4 v4.18.2/go.mod h1:Ey4Oru5tH5sB6tV7hDmfWFahwF15Eb7DNXlRKx2CkVw= github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= @@ -188,8 +193,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.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.20.0 h1:jmAMJJZXr5KiCw05dfYK9QnqaqKLYXijU23lsEdcQqg= +golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= 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= @@ -216,8 +221,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-20220110181412-a018aaa089fe/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/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.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.17.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= From c0208907e6eed067652abe4048e8c1e3eb7b8838 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Mar 2024 22:33:07 +0000 Subject: [PATCH 181/210] Bump google.golang.org/protobuf in /frameworks/Go/gin/gin-gorm Bumps google.golang.org/protobuf from 1.30.0 to 1.33.0. --- updated-dependencies: - dependency-name: google.golang.org/protobuf dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Go/gin/gin-gorm/go.mod | 2 +- frameworks/Go/gin/gin-gorm/go.sum | 8 ++------ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/frameworks/Go/gin/gin-gorm/go.mod b/frameworks/Go/gin/gin-gorm/go.mod index 79aa8a21d9b..51829884754 100644 --- a/frameworks/Go/gin/gin-gorm/go.mod +++ b/frameworks/Go/gin/gin-gorm/go.mod @@ -46,6 +46,6 @@ require ( golang.org/x/net v0.17.0 // indirect golang.org/x/sys v0.15.0 // indirect golang.org/x/text v0.14.0 // indirect - google.golang.org/protobuf v1.30.0 // indirect + google.golang.org/protobuf v1.33.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/frameworks/Go/gin/gin-gorm/go.sum b/frameworks/Go/gin/gin-gorm/go.sum index fd948b198df..944d72828a2 100644 --- a/frameworks/Go/gin/gin-gorm/go.sum +++ b/frameworks/Go/gin/gin-gorm/go.sum @@ -36,8 +36,6 @@ github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MG github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.3.0+incompatible h1:CaSVZxm5B+7o45rtab4jC2G37WGYX1zQfuU2i6DSvnc= github.com/gofrs/uuid v4.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -244,11 +242,9 @@ golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From 1987fc8fba40ca06a07c955d0f98693e1d75beaa Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 13 Mar 2024 22:41:02 +0000 Subject: [PATCH 182/210] Bump github.com/jackc/pgx/v4 in /frameworks/Go/gin/gin-gorm Bumps [github.com/jackc/pgx/v4](https://github.com/jackc/pgx) from 4.17.2 to 4.18.2. - [Changelog](https://github.com/jackc/pgx/blob/v4.18.2/CHANGELOG.md) - [Commits](https://github.com/jackc/pgx/compare/v4.17.2...v4.18.2) --- updated-dependencies: - dependency-name: github.com/jackc/pgx/v4 dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Go/gin/gin-gorm/go.mod | 16 ++++++++-------- frameworks/Go/gin/gin-gorm/go.sum | 27 ++++++++++++++++----------- 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/frameworks/Go/gin/gin-gorm/go.mod b/frameworks/Go/gin/gin-gorm/go.mod index 51829884754..cb57b57d80a 100644 --- a/frameworks/Go/gin/gin-gorm/go.mod +++ b/frameworks/Go/gin/gin-gorm/go.mod @@ -20,13 +20,13 @@ require ( github.com/gofrs/uuid v4.3.0+incompatible // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect - github.com/jackc/pgconn v1.13.0 // indirect + github.com/jackc/pgconn v1.14.3 // indirect github.com/jackc/pgio v1.0.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgproto3/v2 v2.3.1 // indirect - github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect - github.com/jackc/pgtype v1.12.0 // indirect - github.com/jackc/pgx/v4 v4.17.2 // indirect + github.com/jackc/pgproto3/v2 v2.3.3 // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/pgtype v1.14.0 // indirect + github.com/jackc/pgx/v4 v4.18.2 // indirect github.com/jinzhu/inflection v1.0.0 // indirect github.com/jinzhu/now v1.1.5 // indirect github.com/json-iterator/go v1.1.12 // indirect @@ -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.17.0 // indirect - golang.org/x/net v0.17.0 // indirect - golang.org/x/sys v0.15.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/text v0.14.0 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/frameworks/Go/gin/gin-gorm/go.sum b/frameworks/Go/gin/gin-gorm/go.sum index 944d72828a2..a347b479b9d 100644 --- a/frameworks/Go/gin/gin-gorm/go.sum +++ b/frameworks/Go/gin/gin-gorm/go.sum @@ -50,8 +50,9 @@ github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsU github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= -github.com/jackc/pgconn v1.13.0 h1:3L1XMNV2Zvca/8BYhzcRFS70Lr0WlDg16Di6SFGAbys= github.com/jackc/pgconn v1.13.0/go.mod h1:AnowpAqO4CMIIJNZl2VJp+KrkAZciAkhEl0W0JIobpI= +github.com/jackc/pgconn v1.14.3 h1:bVoTr12EGANZz66nZPkMInAV/KHD2TxH9npjXXgiB3w= +github.com/jackc/pgconn v1.14.3/go.mod h1:RZbme4uasqzybK2RK5c65VsHxoyaml09lx3tXOcO/VM= github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= @@ -67,22 +68,26 @@ github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvW github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.3.1 h1:nwj7qwf0S+Q7ISFfBndqeLwSwxs+4DPsbRFjECT1Y4Y= github.com/jackc/pgproto3/v2 v2.3.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg= +github.com/jackc/pgproto3/v2 v2.3.3 h1:1HLSx5H+tXR9pW3in3zaztoEwQYRC9SQaYUHjTSUOag= +github.com/jackc/pgproto3/v2 v2.3.3/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= -github.com/jackc/pgtype v1.12.0 h1:Dlq8Qvcch7kiehm8wPGIW0W3KsCCHJnRacKW0UM8n5w= github.com/jackc/pgtype v1.12.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= +github.com/jackc/pgtype v1.14.0 h1:y+xUdabmyMkJLyApYuPj38mW+aAIqCe5uuBB51rH3Vw= +github.com/jackc/pgtype v1.14.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= -github.com/jackc/pgx/v4 v4.17.2 h1:0Ut0rpeKwvIVbMQ1KbMBU4h6wxehBI535LK6Flheh8E= github.com/jackc/pgx/v4 v4.17.2/go.mod h1:lcxIZN44yMIrWI78a5CpucdD14hX0SBDbNRvjDBItsw= +github.com/jackc/pgx/v4 v4.18.2 h1:xVpYkNR5pk5bMCZGfClbO962UIqVABcAGt7ha1s/FeU= +github.com/jackc/pgx/v4 v4.18.2/go.mod h1:Ey4Oru5tH5sB6tV7hDmfWFahwF15Eb7DNXlRKx2CkVw= github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= @@ -189,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.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.20.0 h1:jmAMJJZXr5KiCw05dfYK9QnqaqKLYXijU23lsEdcQqg= +golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= 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= @@ -200,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.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +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/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= @@ -218,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.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +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/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= From c923b2518e16911578fd1a3fce33fdbcd417c529 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Mar 2024 08:00:12 -0700 Subject: [PATCH 183/210] Bump google.golang.org/protobuf in /frameworks/Go/gin/gin-std (#8808) Bumps google.golang.org/protobuf from 1.30.0 to 1.33.0. --- updated-dependencies: - dependency-name: google.golang.org/protobuf dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Go/gin/gin-std/go.mod | 2 +- frameworks/Go/gin/gin-std/go.sum | 8 ++------ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/frameworks/Go/gin/gin-std/go.mod b/frameworks/Go/gin/gin-std/go.mod index dfb44fc809b..9c0fbb13ce8 100644 --- a/frameworks/Go/gin/gin-std/go.mod +++ b/frameworks/Go/gin/gin-std/go.mod @@ -31,6 +31,6 @@ require ( golang.org/x/net v0.17.0 // indirect golang.org/x/sys v0.15.0 // indirect golang.org/x/text v0.14.0 // indirect - google.golang.org/protobuf v1.30.0 // indirect + google.golang.org/protobuf v1.33.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/frameworks/Go/gin/gin-std/go.sum b/frameworks/Go/gin/gin-std/go.sum index 07cb748b008..4a4e2132598 100644 --- a/frameworks/Go/gin/gin-std/go.sum +++ b/frameworks/Go/gin/gin-std/go.sum @@ -24,8 +24,6 @@ github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfC github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -75,10 +73,8 @@ 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/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/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From e3805f4bd4d5caa19766b2be0919512f77fbf3e2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Mar 2024 08:00:20 -0700 Subject: [PATCH 184/210] Bump google.golang.org/protobuf in /frameworks/Go/gin/gin-src (#8806) Bumps google.golang.org/protobuf from 1.30.0 to 1.33.0. --- updated-dependencies: - dependency-name: google.golang.org/protobuf dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Go/gin/gin-src/go.mod | 2 +- frameworks/Go/gin/gin-src/go.sum | 8 ++------ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/frameworks/Go/gin/gin-src/go.mod b/frameworks/Go/gin/gin-src/go.mod index c5f2daa7ab9..46b9a94832b 100644 --- a/frameworks/Go/gin/gin-src/go.mod +++ b/frameworks/Go/gin/gin-src/go.mod @@ -30,6 +30,6 @@ require ( golang.org/x/net v0.17.0 // indirect golang.org/x/sys v0.15.0 // indirect golang.org/x/text v0.14.0 // indirect - google.golang.org/protobuf v1.30.0 // indirect + google.golang.org/protobuf v1.33.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/frameworks/Go/gin/gin-src/go.sum b/frameworks/Go/gin/gin-src/go.sum index b762cd80a2d..7b727e54dc3 100644 --- a/frameworks/Go/gin/gin-src/go.sum +++ b/frameworks/Go/gin/gin-src/go.sum @@ -24,9 +24,7 @@ github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfC github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= @@ -75,10 +73,8 @@ golang.org/x/sys v0.15.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= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From e055fcf46e13abe3224e78e0db3ca5414b89e960 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Mar 2024 08:00:29 -0700 Subject: [PATCH 185/210] Bump google.golang.org/protobuf in /frameworks/Go/hertz (#8804) Bumps google.golang.org/protobuf from 1.28.0 to 1.33.0. --- updated-dependencies: - dependency-name: google.golang.org/protobuf dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Go/hertz/go.mod | 2 +- frameworks/Go/hertz/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Go/hertz/go.mod b/frameworks/Go/hertz/go.mod index 19b17e73ff9..8b6eae3c706 100644 --- a/frameworks/Go/hertz/go.mod +++ b/frameworks/Go/hertz/go.mod @@ -32,5 +32,5 @@ require ( golang.org/x/sync v0.1.0 // indirect golang.org/x/sys v0.15.0 // indirect golang.org/x/text v0.14.0 // indirect - google.golang.org/protobuf v1.28.0 // indirect + google.golang.org/protobuf v1.33.0 // indirect ) diff --git a/frameworks/Go/hertz/go.sum b/frameworks/Go/hertz/go.sum index f6906e89f83..35646b94c0c 100644 --- a/frameworks/Go/hertz/go.sum +++ b/frameworks/Go/hertz/go.sum @@ -96,8 +96,8 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IV golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= -google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From 52d5aa427c8221da98984d4ddc90d1d1db9c3d7d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Mar 2024 08:00:39 -0700 Subject: [PATCH 186/210] Bump google.golang.org/protobuf in /frameworks/Go/sprapp (#8803) Bumps google.golang.org/protobuf from 1.27.1 to 1.33.0. --- updated-dependencies: - dependency-name: google.golang.org/protobuf dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Go/sprapp/go.mod | 50 ++++++++++++++++++------------------- frameworks/Go/sprapp/go.sum | 3 ++- 2 files changed, 27 insertions(+), 26 deletions(-) diff --git a/frameworks/Go/sprapp/go.mod b/frameworks/Go/sprapp/go.mod index 8a92f3e6416..54ae324ad27 100644 --- a/frameworks/Go/sprapp/go.mod +++ b/frameworks/Go/sprapp/go.mod @@ -3,32 +3,32 @@ module sprapp go 1.18 require ( - github.com/cloudwego/hertz v0.7.1 - github.com/cloudxaas/gocpu v0.0.10 - github.com/cloudxaas/gostrconv v0.0.4 - github.com/panjf2000/ants/v2 v2.8.2 - golang.org/x/sys v0.14.0 + github.com/cloudwego/hertz v0.7.1 + github.com/cloudxaas/gocpu v0.0.10 + github.com/cloudxaas/gostrconv v0.0.4 + github.com/panjf2000/ants/v2 v2.8.2 + golang.org/x/sys v0.14.0 ) require ( - github.com/bytedance/go-tagexpr/v2 v2.9.2 // indirect - github.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7 // indirect - github.com/bytedance/sonic v1.8.1 // indirect - github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect - github.com/cloudwego/netpoll v0.5.0 // indirect - github.com/cloudxaas/gocx v0.0.3 // indirect - github.com/cloudxaas/gohash v0.0.13 // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/golang/protobuf v1.5.0 // indirect - github.com/henrylee2cn/ameda v1.4.10 // indirect - github.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 // indirect - github.com/klauspost/cpuid/v2 v2.0.9 // indirect - github.com/nyaruka/phonenumbers v1.0.55 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/tidwall/gjson v1.14.4 // indirect - github.com/tidwall/match v1.1.1 // indirect - github.com/tidwall/pretty v1.2.0 // indirect - github.com/twitchyliquid64/golang-asm v0.15.1 // indirect - golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect - google.golang.org/protobuf v1.27.1 // indirect + github.com/bytedance/go-tagexpr/v2 v2.9.2 // indirect + github.com/bytedance/gopkg v0.0.0-20220413063733-65bf48ffb3a7 // indirect + github.com/bytedance/sonic v1.8.1 // indirect + github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311 // indirect + github.com/cloudwego/netpoll v0.5.0 // indirect + github.com/cloudxaas/gocx v0.0.3 // indirect + github.com/cloudxaas/gohash v0.0.13 // indirect + github.com/fsnotify/fsnotify v1.5.4 // indirect + github.com/golang/protobuf v1.5.0 // indirect + github.com/henrylee2cn/ameda v1.4.10 // indirect + github.com/henrylee2cn/goutil v0.0.0-20210127050712-89660552f6f8 // indirect + github.com/klauspost/cpuid/v2 v2.0.9 // indirect + github.com/nyaruka/phonenumbers v1.0.55 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/tidwall/gjson v1.14.4 // indirect + github.com/tidwall/match v1.1.1 // indirect + github.com/tidwall/pretty v1.2.0 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect + google.golang.org/protobuf v1.33.0 // indirect ) diff --git a/frameworks/Go/sprapp/go.sum b/frameworks/Go/sprapp/go.sum index 460ac53c333..60bedb8d316 100644 --- a/frameworks/Go/sprapp/go.sum +++ b/frameworks/Go/sprapp/go.sum @@ -93,8 +93,9 @@ golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From 2cda5c54e281ce98c082afbdc1639159389fa58a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Mar 2024 08:00:48 -0700 Subject: [PATCH 187/210] Bump github.com/jackc/pgx/v4 in /frameworks/Go/gearbox/src (#8799) Bumps [github.com/jackc/pgx/v4](https://github.com/jackc/pgx) from 4.17.2 to 4.18.2. - [Changelog](https://github.com/jackc/pgx/blob/v4.18.2/CHANGELOG.md) - [Commits](https://github.com/jackc/pgx/compare/v4.17.2...v4.18.2) --- updated-dependencies: - dependency-name: github.com/jackc/pgx/v4 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Go/gearbox/src/go.mod | 14 ++++++------- frameworks/Go/gearbox/src/go.sum | 34 ++++++++++++++------------------ 2 files changed, 22 insertions(+), 26 deletions(-) diff --git a/frameworks/Go/gearbox/src/go.mod b/frameworks/Go/gearbox/src/go.mod index c87099b6da9..79708752ac5 100644 --- a/frameworks/Go/gearbox/src/go.mod +++ b/frameworks/Go/gearbox/src/go.mod @@ -4,19 +4,19 @@ go 1.19 require ( github.com/gogearbox/gearbox v1.2.4 - github.com/jackc/pgx/v4 v4.17.2 + github.com/jackc/pgx/v4 v4.18.2 github.com/valyala/quicktemplate v1.7.0 ) require ( github.com/andybalholm/brotli v1.0.4 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect - github.com/jackc/pgconn v1.13.0 // indirect + github.com/jackc/pgconn v1.14.3 // indirect github.com/jackc/pgio v1.0.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgproto3/v2 v2.3.1 // indirect - github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect - github.com/jackc/pgtype v1.12.0 // indirect + github.com/jackc/pgproto3/v2 v2.3.3 // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/pgtype v1.14.0 // indirect github.com/jackc/puddle v1.3.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.15.10 // indirect @@ -25,7 +25,7 @@ require ( github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasthttp v1.40.0 // indirect github.com/valyala/tcplisten v1.0.0 // indirect - golang.org/x/crypto v0.17.0 // indirect - golang.org/x/sys v0.15.0 // indirect + golang.org/x/crypto v0.20.0 // indirect + golang.org/x/sys v0.17.0 // indirect golang.org/x/text v0.14.0 // indirect ) diff --git a/frameworks/Go/gearbox/src/go.sum b/frameworks/Go/gearbox/src/go.sum index a5140c570aa..443a9ec1b19 100644 --- a/frameworks/Go/gearbox/src/go.sum +++ b/frameworks/Go/gearbox/src/go.sum @@ -32,8 +32,8 @@ github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsU github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= -github.com/jackc/pgconn v1.13.0 h1:3L1XMNV2Zvca/8BYhzcRFS70Lr0WlDg16Di6SFGAbys= -github.com/jackc/pgconn v1.13.0/go.mod h1:AnowpAqO4CMIIJNZl2VJp+KrkAZciAkhEl0W0JIobpI= +github.com/jackc/pgconn v1.14.3 h1:bVoTr12EGANZz66nZPkMInAV/KHD2TxH9npjXXgiB3w= +github.com/jackc/pgconn v1.14.3/go.mod h1:RZbme4uasqzybK2RK5c65VsHxoyaml09lx3tXOcO/VM= github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= @@ -49,22 +49,23 @@ github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvW github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.3.1 h1:nwj7qwf0S+Q7ISFfBndqeLwSwxs+4DPsbRFjECT1Y4Y= -github.com/jackc/pgproto3/v2 v2.3.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg= +github.com/jackc/pgproto3/v2 v2.3.3 h1:1HLSx5H+tXR9pW3in3zaztoEwQYRC9SQaYUHjTSUOag= +github.com/jackc/pgproto3/v2 v2.3.3/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= -github.com/jackc/pgtype v1.12.0 h1:Dlq8Qvcch7kiehm8wPGIW0W3KsCCHJnRacKW0UM8n5w= -github.com/jackc/pgtype v1.12.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= +github.com/jackc/pgtype v1.14.0 h1:y+xUdabmyMkJLyApYuPj38mW+aAIqCe5uuBB51rH3Vw= +github.com/jackc/pgtype v1.14.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= -github.com/jackc/pgx/v4 v4.17.2 h1:0Ut0rpeKwvIVbMQ1KbMBU4h6wxehBI535LK6Flheh8E= -github.com/jackc/pgx/v4 v4.17.2/go.mod h1:lcxIZN44yMIrWI78a5CpucdD14hX0SBDbNRvjDBItsw= +github.com/jackc/pgx/v4 v4.18.2 h1:xVpYkNR5pk5bMCZGfClbO962UIqVABcAGt7ha1s/FeU= +github.com/jackc/pgx/v4 v4.18.2/go.mod h1:Ey4Oru5tH5sB6tV7hDmfWFahwF15Eb7DNXlRKx2CkVw= github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= @@ -116,15 +117,12 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.30.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus= @@ -158,9 +156,8 @@ golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5 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-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -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.20.0 h1:jmAMJJZXr5KiCw05dfYK9QnqaqKLYXijU23lsEdcQqg= +golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= 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= @@ -189,8 +186,8 @@ golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/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-20220227234510-4e6760a101f9/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.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.17.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/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -222,5 +219,4 @@ gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:a gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= From a01a67919f886d6c95270a7211969f4537f72588 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Ros?= Date: Thu, 14 Mar 2024 08:20:11 -0700 Subject: [PATCH 188/210] Add startup message for Spring (#8782) --- frameworks/Java/spring/src/main/java/hello/App.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/frameworks/Java/spring/src/main/java/hello/App.java b/frameworks/Java/spring/src/main/java/hello/App.java index 435bbcf0dd4..e8e93b65902 100644 --- a/frameworks/Java/spring/src/main/java/hello/App.java +++ b/frameworks/Java/spring/src/main/java/hello/App.java @@ -7,8 +7,10 @@ import org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; +import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Profile; +import org.springframework.context.event.EventListener; import com.zaxxer.hikari.HikariDataSource; @@ -19,6 +21,11 @@ public static void main(String[] args) { SpringApplication.run(App.class, args); } + @EventListener(ApplicationReadyEvent.class) + public void runAfterStartup() { + System.out.println("Application is ready"); + } + @Bean @Profile({ "jdbc", "jpa" }) public DataSource datasource(DataSourceProperties dataSourceProperties) { From a5153f98df0b01001668de4d0d59fbfdeab43ae8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Mar 2024 21:45:59 +0000 Subject: [PATCH 189/210] Bump github.com/jackc/pgx/v5 in /frameworks/Go/atreugo/src Bumps [github.com/jackc/pgx/v5](https://github.com/jackc/pgx) from 5.0.4 to 5.5.4. - [Changelog](https://github.com/jackc/pgx/blob/master/CHANGELOG.md) - [Commits](https://github.com/jackc/pgx/compare/v5.0.4...v5.5.4) --- updated-dependencies: - dependency-name: github.com/jackc/pgx/v5 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Go/atreugo/src/go.mod | 7 ++++--- frameworks/Go/atreugo/src/go.sum | 20 +++++++++++--------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/frameworks/Go/atreugo/src/go.mod b/frameworks/Go/atreugo/src/go.mod index 2cff5781a35..a8b0f986fef 100644 --- a/frameworks/Go/atreugo/src/go.mod +++ b/frameworks/Go/atreugo/src/go.mod @@ -3,7 +3,7 @@ module atreugo/src go 1.19 require ( - github.com/jackc/pgx/v5 v5.0.4 + github.com/jackc/pgx/v5 v5.5.4 github.com/savsgio/atreugo/v11 v11.9.7 github.com/valyala/quicktemplate v1.7.0 ) @@ -12,14 +12,15 @@ require ( github.com/andybalholm/brotli v1.0.4 // indirect github.com/fasthttp/router v1.4.12 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect - github.com/jackc/puddle/v2 v2.0.0 // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/puddle/v2 v2.2.1 // indirect github.com/klauspost/compress v1.15.10 // indirect github.com/savsgio/gotils v0.0.0-20220530130905-52f3993e8d6d // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasthttp v1.40.0 // indirect github.com/valyala/tcplisten v1.0.0 // indirect golang.org/x/crypto v0.17.0 // indirect + golang.org/x/sync v0.1.0 // indirect golang.org/x/sys v0.15.0 // indirect golang.org/x/text v0.14.0 // indirect ) diff --git a/frameworks/Go/atreugo/src/go.sum b/frameworks/Go/atreugo/src/go.sum index 1a9bef28670..628a4244926 100644 --- a/frameworks/Go/atreugo/src/go.sum +++ b/frameworks/Go/atreugo/src/go.sum @@ -12,12 +12,12 @@ github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEW github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg= -github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= -github.com/jackc/pgx/v5 v5.0.4 h1:r5O6y84qHX/z/HZV40JBdx2obsHz7/uRj5b+CcYEdeY= -github.com/jackc/pgx/v5 v5.0.4/go.mod h1:U0ynklHtgg43fue9Ly30w3OCSTDPlXjig9ghrNGaguQ= -github.com/jackc/puddle/v2 v2.0.0 h1:Kwk/AlLigcnZsDssc3Zun1dk1tAtQNPaBBxBHWn0Mjc= -github.com/jackc/puddle/v2 v2.0.0/go.mod h1:itE7ZJY8xnoo0JqJEpSMprN0f+NQkMCuEV/N9j8h0oc= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.5.4 h1:Xp2aQS8uXButQdnCMWNmvx6UysWQQC+u1EoizjguY+8= +github.com/jackc/pgx/v5 v5.5.4/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A= +github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= +github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.15.0/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= @@ -31,8 +31,8 @@ github.com/savsgio/gotils v0.0.0-20220530130905-52f3993e8d6d h1:Q+gqLBOPkFGHyCJx github.com/savsgio/gotils v0.0.0-20220530130905-52f3993e8d6d/go.mod h1:Gy+0tqhJvgGlqnTF8CVGP0AaGRjwBtXs/a5PA0Y3+A4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.30.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus= @@ -50,6 +50,8 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210510120150-4163338589ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -67,5 +69,5 @@ 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/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= From d3e97d99a323fcb567fe0b186c8a702c020e526b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 14 Mar 2024 21:52:07 +0000 Subject: [PATCH 190/210] Bump github.com/jackc/pgx/v5 from 5.4.3 to 5.5.4 in /frameworks/Go/hertz Bumps [github.com/jackc/pgx/v5](https://github.com/jackc/pgx) from 5.4.3 to 5.5.4. - [Changelog](https://github.com/jackc/pgx/blob/master/CHANGELOG.md) - [Commits](https://github.com/jackc/pgx/compare/v5.4.3...v5.5.4) --- updated-dependencies: - dependency-name: github.com/jackc/pgx/v5 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Go/hertz/go.mod | 2 +- frameworks/Go/hertz/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frameworks/Go/hertz/go.mod b/frameworks/Go/hertz/go.mod index 8b6eae3c706..b04b09619ce 100644 --- a/frameworks/Go/hertz/go.mod +++ b/frameworks/Go/hertz/go.mod @@ -5,7 +5,7 @@ go 1.20 require ( github.com/cloudwego/hertz v0.7.1 github.com/goccy/go-json v0.10.2 - github.com/jackc/pgx/v5 v5.4.3 + github.com/jackc/pgx/v5 v5.5.4 ) require ( diff --git a/frameworks/Go/hertz/go.sum b/frameworks/Go/hertz/go.sum index 35646b94c0c..0d3f782c63b 100644 --- a/frameworks/Go/hertz/go.sum +++ b/frameworks/Go/hertz/go.sum @@ -37,8 +37,8 @@ github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsI github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= -github.com/jackc/pgx/v5 v5.4.3 h1:cxFyXhxlvAifxnkKKdlxv8XqUf59tDlYjnV5YYfsJJY= -github.com/jackc/pgx/v5 v5.4.3/go.mod h1:Ig06C2Vu0t5qXC60W8sqIthScaEnFvojjj9dSljmHRA= +github.com/jackc/pgx/v5 v5.5.4 h1:Xp2aQS8uXButQdnCMWNmvx6UysWQQC+u1EoizjguY+8= +github.com/jackc/pgx/v5 v5.5.4/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A= github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= From 77888758a37ac17efc7523cc8bc823e960df5fd8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 18 Mar 2024 21:48:05 +0000 Subject: [PATCH 191/210] Bump django from 3.2.24 to 3.2.25 in /frameworks/Python/django Bumps [django](https://github.com/django/django) from 3.2.24 to 3.2.25. - [Commits](https://github.com/django/django/compare/3.2.24...3.2.25) --- updated-dependencies: - dependency-name: django dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Python/django/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Python/django/requirements.txt b/frameworks/Python/django/requirements.txt index fe2b00a17d3..d5f982d585e 100644 --- a/frameworks/Python/django/requirements.txt +++ b/frameworks/Python/django/requirements.txt @@ -1,4 +1,4 @@ -Django==3.2.24 +Django==3.2.25 mysqlclient==1.4.6 psycopg2==2.9.6; implementation_name=='cpython' psycopg2cffi==2.9.0; implementation_name=='pypy' From a2b397aa12ad3c0064da92992bba38aad0f7a2c5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Mar 2024 08:31:06 -0700 Subject: [PATCH 192/210] Bump typeorm from 0.2.29 to 0.3.0 in /frameworks/TypeScript/nest (#8818) Bumps [typeorm](https://github.com/typeorm/typeorm) from 0.2.29 to 0.3.0. - [Release notes](https://github.com/typeorm/typeorm/releases) - [Changelog](https://github.com/typeorm/typeorm/blob/master/CHANGELOG.md) - [Commits](https://github.com/typeorm/typeorm/compare/0.2.29...0.3.0) --- updated-dependencies: - dependency-name: typeorm dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/TypeScript/nest/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/TypeScript/nest/package.json b/frameworks/TypeScript/nest/package.json index 219569e19e4..09416024d1b 100644 --- a/frameworks/TypeScript/nest/package.json +++ b/frameworks/TypeScript/nest/package.json @@ -32,7 +32,7 @@ "reflect-metadata": "0.1.13", "rimraf": "3.0.2", "rxjs": "6.5.4", - "typeorm": "0.2.29" + "typeorm": "0.3.0" }, "devDependencies": { "@nestjs/cli": "7.5.3", From a5bd43a7e6bdae747f71c8d5b95e451185a80cdc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Mar 2024 08:31:18 -0700 Subject: [PATCH 193/210] Bump github.com/jackc/pgx/v5 in /frameworks/Go/fiber/src (#8810) Bumps [github.com/jackc/pgx/v5](https://github.com/jackc/pgx) from 5.2.0 to 5.5.4. - [Changelog](https://github.com/jackc/pgx/blob/master/CHANGELOG.md) - [Commits](https://github.com/jackc/pgx/compare/v5.2.0...v5.5.4) --- updated-dependencies: - dependency-name: github.com/jackc/pgx/v5 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Go/fiber/src/go.mod | 7 +++---- frameworks/Go/fiber/src/go.sum | 20 +++++++++----------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/frameworks/Go/fiber/src/go.mod b/frameworks/Go/fiber/src/go.mod index ee8f0e442a0..2372b8f57f7 100644 --- a/frameworks/Go/fiber/src/go.mod +++ b/frameworks/Go/fiber/src/go.mod @@ -5,7 +5,7 @@ go 1.19 require ( github.com/goccy/go-json v0.10.0 github.com/gofiber/fiber/v2 v2.52.1 - github.com/jackc/pgx/v5 v5.2.0 + github.com/jackc/pgx/v5 v5.5.4 github.com/valyala/quicktemplate v1.7.0 ) @@ -13,8 +13,8 @@ require ( github.com/andybalholm/brotli v1.0.5 // indirect github.com/google/uuid v1.5.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect - github.com/jackc/puddle/v2 v2.1.2 // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/puddle/v2 v2.2.1 // indirect github.com/klauspost/compress v1.17.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect @@ -23,7 +23,6 @@ require ( github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasthttp v1.51.0 // indirect github.com/valyala/tcplisten v1.0.0 // indirect - go.uber.org/atomic v1.10.0 // indirect golang.org/x/crypto v0.17.0 // indirect golang.org/x/sync v0.1.0 // indirect golang.org/x/sys v0.15.0 // indirect diff --git a/frameworks/Go/fiber/src/go.sum b/frameworks/Go/fiber/src/go.sum index 6ae2a6703ae..5ae0d5e53e3 100644 --- a/frameworks/Go/fiber/src/go.sum +++ b/frameworks/Go/fiber/src/go.sum @@ -13,12 +13,12 @@ github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU= github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg= -github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= -github.com/jackc/pgx/v5 v5.2.0 h1:NdPpngX0Y6z6XDFKqmFQaE+bCtkqzvQIOt1wvBlAqs8= -github.com/jackc/pgx/v5 v5.2.0/go.mod h1:Ptn7zmohNsWEsdxRawMzk3gaKma2obW+NWTnKa0S4nk= -github.com/jackc/puddle/v2 v2.1.2 h1:0f7vaaXINONKTsxYDn4otOAiJanX/BMeAtY//BXqzlg= -github.com/jackc/puddle/v2 v2.1.2/go.mod h1:2lpufsF5mRHO6SuZkm0fNYxM6SWHfvyFj62KwNzgels= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= +github.com/jackc/pgx/v5 v5.5.4 h1:Xp2aQS8uXButQdnCMWNmvx6UysWQQC+u1EoizjguY+8= +github.com/jackc/pgx/v5 v5.5.4/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A= +github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk= +github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.17.0 h1:Rnbp4K9EjcDuVuHtd0dgA4qNuv9yKDYKK1ulpJwgrqM= @@ -36,8 +36,8 @@ github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.30.0/go.mod h1:2rsYD01CKFrjjsvFxx75KlEUNpWNBY9JWD3K/7o2Cus= @@ -47,8 +47,6 @@ github.com/valyala/quicktemplate v1.7.0 h1:LUPTJmlVcb46OOUY3IeD9DojFpAVbsG+5WFTc github.com/valyala/quicktemplate v1.7.0/go.mod h1:sqKJnoaOF88V07vkO+9FL8fb9uZg/VPSJnLYn+LmLk8= github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= -go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= -go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8= golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= @@ -70,5 +68,5 @@ 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/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= From eb39f06bb82fecd0cdfcc6d7092795f013bc1010 Mon Sep 17 00:00:00 2001 From: Anton Kirilov Date: Mon, 25 Mar 2024 15:31:37 +0000 Subject: [PATCH 194/210] Clean up the PostgreSQL configuration files (#8762) --- toolset/databases/postgres/config.sh | 6 +- .../postgres/create-postgres-database.sql | 5 - toolset/databases/postgres/pg_hba.conf | 100 --- .../databases/postgres/postgres.dockerfile | 18 +- .../databases/postgres/postgresql-min.conf | 143 --- toolset/databases/postgres/postgresql.conf | 449 +--------- .../databases/postgres/postgresql.conf.sample | 813 ------------------ 7 files changed, 21 insertions(+), 1513 deletions(-) mode change 100644 => 100755 toolset/databases/postgres/config.sh delete mode 100644 toolset/databases/postgres/create-postgres-database.sql delete mode 100644 toolset/databases/postgres/pg_hba.conf delete mode 100644 toolset/databases/postgres/postgresql-min.conf delete mode 100644 toolset/databases/postgres/postgresql.conf.sample diff --git a/toolset/databases/postgres/config.sh b/toolset/databases/postgres/config.sh old mode 100644 new mode 100755 index ba42d10eec9..ea3d95e4b7c --- a/toolset/databases/postgres/config.sh +++ b/toolset/databases/postgres/config.sh @@ -1 +1,5 @@ -cat /tmp/postgresql.conf >> $PGDATA/postgresql.conf +#!/bin/bash + +set -e + +cat /tmp/postgresql.conf >> "${PGDATA}/postgresql.conf" diff --git a/toolset/databases/postgres/create-postgres-database.sql b/toolset/databases/postgres/create-postgres-database.sql deleted file mode 100644 index 9a8a08ec2ab..00000000000 --- a/toolset/databases/postgres/create-postgres-database.sql +++ /dev/null @@ -1,5 +0,0 @@ -CREATE USER benchmarkdbuser WITH PASSWORD 'benchmarkdbpass'; - -ALTER USER benchmarkdbuser WITH SUPERUSER; - -CREATE DATABASE hello_world WITH TEMPLATE = template0 ENCODING 'UTF8'; diff --git a/toolset/databases/postgres/pg_hba.conf b/toolset/databases/postgres/pg_hba.conf deleted file mode 100644 index ac4b3621dc2..00000000000 --- a/toolset/databases/postgres/pg_hba.conf +++ /dev/null @@ -1,100 +0,0 @@ -# PostgreSQL Client Authentication Configuration File -# =================================================== -# -# Refer to the "Client Authentication" section in the PostgreSQL -# documentation for a complete description of this file. A short -# synopsis follows. -# -# This file controls: which hosts are allowed to connect, how clients -# are authenticated, which PostgreSQL user names they can use, which -# databases they can access. Records take one of these forms: -# -# local DATABASE USER METHOD [OPTIONS] -# host DATABASE USER ADDRESS METHOD [OPTIONS] -# hostssl DATABASE USER ADDRESS METHOD [OPTIONS] -# hostnossl DATABASE USER ADDRESS METHOD [OPTIONS] -# -# (The uppercase items must be replaced by actual values.) -# -# The first field is the connection type: "local" is a Unix-domain -# socket, "host" is either a plain or SSL-encrypted TCP/IP socket, -# "hostssl" is an SSL-encrypted TCP/IP socket, and "hostnossl" is a -# plain TCP/IP socket. -# -# DATABASE can be "all", "sameuser", "samerole", "replication", a -# database name, or a comma-separated list thereof. The "all" -# keyword does not match "replication". Access to replication -# must be enabled in a separate record (see example below). -# -# USER can be "all", a user name, a group name prefixed with "+", or a -# comma-separated list thereof. In both the DATABASE and USER fields -# you can also write a file name prefixed with "@" to include names -# from a separate file. -# -# ADDRESS specifies the set of hosts the record matches. It can be a -# host name, or it is made up of an IP address and a CIDR mask that is -# an integer (between 0 and 32 (IPv4) or 128 (IPv6) inclusive) that -# specifies the number of significant bits in the mask. A host name -# that starts with a dot (.) matches a suffix of the actual host name. -# Alternatively, you can write an IP address and netmask in separate -# columns to specify the set of hosts. Instead of a CIDR-address, you -# can write "samehost" to match any of the server's own IP addresses, -# or "samenet" to match any address in any subnet that the server is -# directly connected to. -# -# METHOD can be "trust", "reject", "md5", "password", "gss", "sspi", -# "krb5", "ident", "peer", "pam", "ldap", "radius" or "cert". Note that -# "password" sends passwords in clear text; "md5" is preferred since -# it sends encrypted passwords. -# -# OPTIONS are a set of options for the authentication in the format -# NAME=VALUE. The available options depend on the different -# authentication methods -- refer to the "Client Authentication" -# section in the documentation for a list of which options are -# available for which authentication methods. -# -# Database and user names containing spaces, commas, quotes and other -# special characters must be quoted. Quoting one of the keywords -# "all", "sameuser", "samerole" or "replication" makes the name lose -# its special character, and just match a database or username with -# that name. -# -# This file is read on server startup and when the postmaster receives -# a SIGHUP signal. If you edit the file on a running system, you have -# to SIGHUP the postmaster for the changes to take effect. You can -# use "pg_ctl reload" to do that. - -# Put your actual configuration here -# ---------------------------------- -# -# If you want to allow non-local connections, you need to add more -# "host" records. In that case you will also need to make PostgreSQL -# listen on a non-local interface via the listen_addresses -# configuration parameter, or via the -i or -h command line switches. - - - - -# DO NOT DISABLE! -# If you change this first entry you will need to make sure that the -# database superuser can access the database using some other method. -# Noninteractive access to all databases is required during automatic -# maintenance (custom daily cronjobs, replication, and similar tasks). -# -# Database administrative login by Unix domain socket -local all postgres peer - -# TYPE DATABASE USER ADDRESS METHOD - -# "local" is for Unix domain socket connections only -local all all peer -# IPv4 local connections: -host all all 127.0.0.1/32 md5 -# IPv6 local connections: -host all all ::1/128 md5 -# Allow replication connections from localhost, by a user with the -# replication privilege. -#local replication postgres peer -#host replication postgres 127.0.0.1/32 md5 -#host replication postgres ::1/128 md5 -host all all 0.0.0.0/0 md5 diff --git a/toolset/databases/postgres/postgres.dockerfile b/toolset/databases/postgres/postgres.dockerfile index bb0ca8aba05..4a23b39ee70 100644 --- a/toolset/databases/postgres/postgres.dockerfile +++ b/toolset/databases/postgres/postgres.dockerfile @@ -1,16 +1,14 @@ FROM postgres:16-bookworm -ENV POSTGRES_USER=benchmarkdbuser -ENV POSTGRES_PASSWORD=benchmarkdbpass -ENV POSTGRES_DB=hello_world +ENV PGDATA=/ssd/postgresql \ + POSTGRES_DB=hello_world \ + POSTGRES_HOST_AUTH_METHOD=md5 \ + POSTGRES_INITDB_ARGS=--auth-host=md5 \ + POSTGRES_PASSWORD=benchmarkdbpass \ + POSTGRES_USER=benchmarkdbuser -ENV POSTGRES_HOST_AUTH_METHOD=md5 -ENV POSTGRES_INITDB_ARGS=--auth-host=md5 -ENV PGDATA=/ssd/postgresql +COPY postgresql.conf /tmp/ -COPY postgresql-min.conf /tmp/postgresql.conf - -COPY create-postgres.sql /docker-entrypoint-initdb.d/ -COPY config.sh /docker-entrypoint-initdb.d/ +COPY config.sh create-postgres.sql /docker-entrypoint-initdb.d/ COPY 60-postgresql-shm.conf /etc/sysctl.d/60-postgresql-shm.conf diff --git a/toolset/databases/postgres/postgresql-min.conf b/toolset/databases/postgres/postgresql-min.conf deleted file mode 100644 index 1e91048d027..00000000000 --- a/toolset/databases/postgres/postgresql-min.conf +++ /dev/null @@ -1,143 +0,0 @@ -# See postgresql.conf.sample for a full conf file - -listen_addresses = '*' # what IP address(es) to listen on; -max_connections = 2000 # (change requires restart) - -ssl = false # (change requires restart) - -# - Memory - -# values from: http://blog.pgaddict.com/posts/performance-since-postgresql-7-4-to-9-4-pgbench -# details: http://www.postgresql.org/docs/9.4/static/runtime-config-resource.html -# http://www.postgresql.org/docs/9.4/static/runtime-config-wal.html -# http://www.postgresql.org/docs/9.4/static/runtime-config-query.html -shared_buffers = 256MB # min 128kB -work_mem = 64MB # min 64kB -maintenance_work_mem = 512MB # min 1MB -# checkpoint_segments = 64 -checkpoint_completion_target = 0.9 -effective_cache_size = 8GB - -# when executed on the SSD (otherwise 4) -random_page_cost = 2 - -shared_preload_libraries = 'pg_stat_statements' # (change requires restart) -pg_stat_statements.track = all -pg_stat_statements.max = 500000 -track_activity_query_size = 2048 - -#------------------------------------------------------------------------------ -# WRITE AHEAD LOG -#------------------------------------------------------------------------------ - -# - Settings - - -wal_level = minimal # minimal, archive, or hot_standby - -# WARNING: disabling synchronous commit may be dangerous in certain cases. -# See http://www.postgresql.org/docs/current/static/runtime-config-wal.html -# for details. -synchronous_commit = off - -#------------------------------------------------------------------------------ -# REPLICATION -#------------------------------------------------------------------------------ - -# - Master Server - - -# These settings are ignored on a standby server - -max_wal_senders = 0 # max number of walsender processes - # (change requires restart) - -#------------------------------------------------------------------------------ -# ERROR REPORTING AND LOGGING -#------------------------------------------------------------------------------ - -log_line_prefix = '%t ' # special values: - # %a = application name - # %u = user name - # %d = database name - # %r = remote host and port - # %h = remote host - # %p = process ID - # %t = timestamp without milliseconds - # %m = timestamp with milliseconds - # %i = command tag - # %e = SQL state - # %c = session ID - # %l = session line number - # %s = session start timestamp - # %v = virtual transaction ID - # %x = transaction ID (0 if none) - # %q = stop here in non-session - # processes - # %% = '%' - # e.g. '<%u%%%d> ' - -#------------------------------------------------------------------------------ -# CLIENT CONNECTION DEFAULTS -#------------------------------------------------------------------------------ - -# - Statement Behavior - - -#search_path = '"$user",public' # schema names -#default_tablespace = '' # a tablespace name, '' uses the default -#temp_tablespaces = '' # a list of tablespace names, '' uses - # only default tablespace -#check_function_bodies = on -#default_transaction_isolation = 'read committed' -#default_transaction_read_only = off -#default_transaction_deferrable = off -#session_replication_role = 'origin' -#statement_timeout = 0 # in milliseconds, 0 is disabled -#vacuum_freeze_min_age = 50000000 -#vacuum_freeze_table_age = 150000000 -#bytea_output = 'hex' # hex, escape -#xmlbinary = 'base64' -#xmloption = 'content' - -# - Locale and Formatting - - -#datestyle = 'iso, mdy' -#intervalstyle = 'postgres' -#timezone = '(defaults to server environment setting)' -#timezone_abbreviations = 'Default' # Select the set of available time zone - # abbreviations. Currently, there are - # Default - # Australia - # India - # You can create your own file in - # share/timezonesets/. -#extra_float_digits = 0 # min -15, max 3 -#client_encoding = sql_ascii # actually, defaults to database - # encoding - -# These settings are initialized by initdb, but they can be changed. -#lc_messages = 'en_US.UTF-8' # locale for system error message - # strings -#lc_monetary = 'en_US.UTF-8' # locale for monetary formatting -#lc_numeric = 'en_US.UTF-8' # locale for number formatting -#lc_time = 'en_US.UTF-8' # locale for time formatting - -# default configuration for text search -#default_text_search_config = 'pg_catalog.english' - -# - Other Defaults - - -#dynamic_library_path = '$libdir' -#local_preload_libraries = '' - - -#------------------------------------------------------------------------------ -# LOCK MANAGEMENT -#------------------------------------------------------------------------------ - -#deadlock_timeout = 1s -#max_locks_per_transaction = 64 # min 10 - # (change requires restart) -# Note: Each lock table slot uses ~270 bytes of shared memory, and there are -# max_locks_per_transaction * (max_connections + max_prepared_transactions) -# lock table slots. -max_pred_locks_per_transaction = 256 # min 10 - # (change requires restart) - diff --git a/toolset/databases/postgres/postgresql.conf b/toolset/databases/postgres/postgresql.conf index fd90cd2b15b..c241696206d 100644 --- a/toolset/databases/postgres/postgresql.conf +++ b/toolset/databases/postgres/postgresql.conf @@ -1,108 +1,10 @@ -# ----------------------------- -# PostgreSQL configuration file -# ----------------------------- -# -# This file consists of lines of the form: -# -# name = value -# -# (The "=" is optional.) Whitespace may be used. Comments are introduced with -# "#" anywhere on a line. The complete list of parameter names and allowed -# values can be found in the PostgreSQL documentation. -# -# The commented-out settings shown in this file represent the default values. -# Re-commenting a setting is NOT sufficient to revert it to the default value; -# you need to reload the server. -# -# This file is read on server startup and when the server receives a SIGHUP -# signal. If you edit the file on a running system, you have to SIGHUP the -# server for the changes to take effect, or use "pg_ctl reload". Some -# parameters, which are marked below, require a server shutdown and restart to -# take effect. -# -# Any parameter can also be given as a command-line option to the server, e.g., -# "postgres -c log_connections=on". Some parameters can be changed at run time -# with the "SET" SQL command. -# -# Memory units: kB = kilobytes Time units: ms = milliseconds -# MB = megabytes s = seconds -# GB = gigabytes min = minutes -# h = hours -# d = days - - -#------------------------------------------------------------------------------ -# FILE LOCATIONS -#------------------------------------------------------------------------------ - -# The default values of these variables are driven from the -D command-line -# option or PGDATA environment variable, represented here as ConfigDir. - -data_directory = '/ssd/postgresql' # use data in another directory - # (change requires restart) -hba_file = '/etc/postgresql/PG_VERSION/main/pg_hba.conf' # host-based authentication file - # (change requires restart) -ident_file = '/etc/postgresql/PG_VERSION/main/pg_ident.conf' # ident configuration file - # (change requires restart) - -# If external_pid_file is not explicitly set, no extra PID file is written. -external_pid_file = '/var/run/postgresql/PG_VERSION-main.pid' # write an extra PID file - # (change requires restart) - - -#------------------------------------------------------------------------------ -# CONNECTIONS AND AUTHENTICATION -#------------------------------------------------------------------------------ - -# - Connection Settings - +# For a full conf file see: +# https://github.com/TechEmpower/FrameworkBenchmarks/blob/d8f043d183d1ccbba41157bd57314ef61059edb8/toolset/databases/postgres/postgresql.conf.sample listen_addresses = '*' # what IP address(es) to listen on; - # comma-separated list of addresses; - # defaults to 'localhost', '*' = all - # (change requires restart) -port = 5432 # (change requires restart) max_connections = 2000 # (change requires restart) -# Note: Increasing max_connections costs ~400 bytes of shared memory per -# connection slot, plus lock space (see max_locks_per_transaction). -#superuser_reserved_connections = 3 # (change requires restart) -unix_socket_directories = '/var/run/postgresql' # (change requires restart) -#unix_socket_group = '' # (change requires restart) -#unix_socket_permissions = 0777 # begin with 0 to use octal notation - # (change requires restart) -#bonjour = off # advertise server via Bonjour - # (change requires restart) -#bonjour_name = '' # defaults to the computer name - # (change requires restart) - -# - Security and Authentication - -#authentication_timeout = 1min # 1s-600s ssl = false # (change requires restart) -#ssl_ciphers = 'ALL:!ADH:!LOW:!EXP:!MD5:@STRENGTH' # allowed SSL ciphers - # (change requires restart) -#ssl_renegotiation_limit = 512MB # amount of data between renegotiations -password_encryption = md5 -#db_user_namespace = off - -# Kerberos and GSSAPI -#krb_server_keyfile = '' -#krb_srvname = 'postgres' # (Kerberos only) -#krb_caseins_users = off - -# - TCP Keepalives - -# see "man 7 tcp" for details - -#tcp_keepalives_idle = 0 # TCP_KEEPIDLE, in seconds; - # 0 selects the system default -#tcp_keepalives_interval = 0 # TCP_KEEPINTVL, in seconds; - # 0 selects the system default -#tcp_keepalives_count = 0 # TCP_KEEPCNT; - # 0 selects the system default - - -#------------------------------------------------------------------------------ -# RESOURCE USAGE (except WAL) -#------------------------------------------------------------------------------ # - Memory - # values from: http://blog.pgaddict.com/posts/performance-since-postgresql-7-4-to-9-4-pgbench @@ -119,47 +21,11 @@ effective_cache_size = 8GB # when executed on the SSD (otherwise 4) random_page_cost = 2 -#shared_buffers = 32MB # min 128kB - # (change requires restart) -#temp_buffers = 8MB # min 800kB -#max_prepared_transactions = 0 # zero disables the feature - # (change requires restart) -# Note: Increasing max_prepared_transactions costs ~600 bytes of shared memory -# per transaction slot, plus lock space (see max_locks_per_transaction). -# It is not advisable to set max_prepared_transactions nonzero unless you -# actively intend to use prepared transactions. -#work_mem = 1MB # min 64kB -#maintenance_work_mem = 16MB # min 1MB -#max_stack_depth = 2MB # min 100kB - -# - Kernel Resource Usage - - -#max_files_per_process = 1000 # min 25 - # (change requires restart) shared_preload_libraries = 'pg_stat_statements' # (change requires restart) pg_stat_statements.track = all pg_stat_statements.max = 500000 track_activity_query_size = 2048 -# - Cost-Based Vacuum Delay - - -#vacuum_cost_delay = 0ms # 0-100 milliseconds -#vacuum_cost_page_hit = 1 # 0-10000 credits -#vacuum_cost_page_miss = 10 # 0-10000 credits -#vacuum_cost_page_dirty = 20 # 0-10000 credits -#vacuum_cost_limit = 200 # 1-10000 credits - -# - Background Writer - - -#bgwriter_delay = 200ms # 10-10000ms between rounds -#bgwriter_lru_maxpages = 100 # 0-1000 max buffers written/round -#bgwriter_lru_multiplier = 2.0 # 0-10.0 multipler on buffers scanned/round - -# - Asynchronous Behavior - - -#effective_io_concurrency = 1 # 1-1000. 0 disables prefetching - - #------------------------------------------------------------------------------ # WRITE AHEAD LOG #------------------------------------------------------------------------------ @@ -167,45 +33,12 @@ track_activity_query_size = 2048 # - Settings - wal_level = minimal # minimal, archive, or hot_standby - # (change requires restart) -#fsync = on # turns forced synchronization on or off # WARNING: disabling synchronous commit may be dangerous in certain cases. # See http://www.postgresql.org/docs/current/static/runtime-config-wal.html # for details. synchronous_commit = off -#wal_sync_method = fsync # the default is the first option - # supported by the operating system: - # open_datasync - # fdatasync (default on Linux) - # fsync - # fsync_writethrough - # open_sync -#full_page_writes = on # recover from partial page writes -#wal_buffers = -1 # min 32kB, -1 sets based on shared_buffers - # (change requires restart) -#wal_writer_delay = 200ms # 1-10000 milliseconds - -#commit_delay = 0 # range 0-100000, in microseconds -#commit_siblings = 5 # range 1-1000 - -# - Checkpoints - - -#checkpoint_segments = 3 # in logfile segments, min 1, 16MB each -#checkpoint_timeout = 5min # range 30s-1h -#checkpoint_completion_target = 0.5 # checkpoint target duration, 0.0 - 1.0 -#checkpoint_warning = 30s # 0 disables - -# - Archiving - - -#archive_mode = off # allows archiving to be done - # (change requires restart) -#archive_command = '' # command to use to archive a logfile segment -#archive_timeout = 0 # force a logfile segment switch after this - # number of seconds; 0 disables - - #------------------------------------------------------------------------------ # REPLICATION #------------------------------------------------------------------------------ @@ -216,185 +49,11 @@ synchronous_commit = off max_wal_senders = 0 # max number of walsender processes # (change requires restart) -#wal_sender_delay = 1s # walsender cycle time, 1-10000 milliseconds -#wal_keep_segments = 0 # in logfile segments, 16MB each; 0 disables -#vacuum_defer_cleanup_age = 0 # number of xacts by which cleanup is delayed -#replication_timeout = 60s # in milliseconds; 0 disables -#synchronous_standby_names = '' # standby servers that provide sync rep - # comma-separated list of application_name - # from standby(s); '*' = all - -# - Standby Servers - - -# These settings are ignored on a master server - -#hot_standby = off # "on" allows queries during recovery - # (change requires restart) -#max_standby_archive_delay = 30s # max delay before canceling queries - # when reading WAL from archive; - # -1 allows indefinite delay -#max_standby_streaming_delay = 30s # max delay before canceling queries - # when reading streaming WAL; - # -1 allows indefinite delay -#wal_receiver_status_interval = 10s # send replies at least this often - # 0 disables -#hot_standby_feedback = off # send info from standby to prevent - # query conflicts - - -#------------------------------------------------------------------------------ -# QUERY TUNING -#------------------------------------------------------------------------------ - -# - Planner Method Configuration - - -#enable_bitmapscan = on -#enable_hashagg = on -#enable_hashjoin = on -#enable_indexscan = on -#enable_material = on -#enable_mergejoin = on -#enable_nestloop = on -#enable_seqscan = on -#enable_sort = on -#enable_tidscan = on - -# - Planner Cost Constants - - -#seq_page_cost = 1.0 # measured on an arbitrary scale -#random_page_cost = 4.0 # same scale as above -#cpu_tuple_cost = 0.01 # same scale as above -#cpu_index_tuple_cost = 0.005 # same scale as above -#cpu_operator_cost = 0.0025 # same scale as above -#effective_cache_size = 128MB - -# - Genetic Query Optimizer - - -#geqo = on -#geqo_threshold = 12 -#geqo_effort = 5 # range 1-10 -#geqo_pool_size = 0 # selects default based on effort -#geqo_generations = 0 # selects default based on effort -#geqo_selection_bias = 2.0 # range 1.5-2.0 -#geqo_seed = 0.0 # range 0.0-1.0 - -# - Other Planner Options - - -#default_statistics_target = 100 # range 1-10000 -#constraint_exclusion = partition # on, off, or partition -#cursor_tuple_fraction = 0.1 # range 0.0-1.0 -#from_collapse_limit = 8 -#join_collapse_limit = 8 # 1 disables collapsing of explicit - # JOIN clauses - #------------------------------------------------------------------------------ # ERROR REPORTING AND LOGGING #------------------------------------------------------------------------------ -# - Where to Log - - -#log_destination = 'stderr' # Valid values are combinations of - # stderr, csvlog, syslog, and eventlog, - # depending on platform. csvlog - # requires logging_collector to be on. - -# This is used when logging to stderr: -#logging_collector = off # Enable capturing of stderr and csvlog - # into log files. Required to be on for - # csvlogs. - # (change requires restart) - -# These are only used if logging_collector is on: -#log_directory = 'pg_log' # directory where log files are written, - # can be absolute or relative to PGDATA -#log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # log file name pattern, - # can include strftime() escapes -#log_file_mode = 0600 # creation mode for log files, - # begin with 0 to use octal notation -#log_truncate_on_rotation = off # If on, an existing log file with the - # same name as the new log file will be - # truncated rather than appended to. - # But such truncation only occurs on - # time-driven rotation, not on restarts - # or size-driven rotation. Default is - # off, meaning append to existing files - # in all cases. -#log_rotation_age = 1d # Automatic rotation of logfiles will - # happen after that time. 0 disables. -#log_rotation_size = 10MB # Automatic rotation of logfiles will - # happen after that much log output. - # 0 disables. - -# These are relevant when logging to syslog: -#syslog_facility = 'LOCAL0' -#syslog_ident = 'postgres' - -#silent_mode = off # Run server silently. - # DO NOT USE without syslog or - # logging_collector - # (change requires restart) - - -# - When to Log - - -#client_min_messages = notice # values in order of decreasing detail: - # debug5 - # debug4 - # debug3 - # debug2 - # debug1 - # log - # notice - # warning - # error - -#log_min_messages = warning # values in order of decreasing detail: - # debug5 - # debug4 - # debug3 - # debug2 - # debug1 - # info - # notice - # warning - # error - # log - # fatal - # panic - -#log_min_error_statement = error # values in order of decreasing detail: - # debug5 - # debug4 - # debug3 - # debug2 - # debug1 - # info - # notice - # warning - # error - # log - # fatal - # panic (effectively off) - -#log_min_duration_statement = -1 # -1 is disabled, 0 logs all statements - # and their durations, > 0 logs only - # statements running at least this number - # of milliseconds - - -# - What to Log - - -#debug_print_parse = off -#debug_print_rewritten = off -#debug_print_plan = off -#debug_pretty_print = on -#log_checkpoints = off -#log_connections = off -#log_disconnections = off -#log_duration = off -#log_error_verbosity = default # terse, default, or verbose messages -#log_hostname = off log_line_prefix = '%t ' # special values: # %a = application name # %u = user name @@ -415,64 +74,6 @@ log_line_prefix = '%t ' # special values: # processes # %% = '%' # e.g. '<%u%%%d> ' -#log_lock_waits = off # log lock waits >= deadlock_timeout -#log_statement = 'none' # none, ddl, mod, all -#log_temp_files = -1 # log temporary files equal or larger - # than the specified size in kilobytes; - # -1 disables, 0 logs all temp files -#log_timezone = '(defaults to server environment setting)' - - -#------------------------------------------------------------------------------ -# RUNTIME STATISTICS -#------------------------------------------------------------------------------ - -# - Query/Index Statistics Collector - - -#track_activities = on -#track_counts = on -#track_functions = none # none, pl, all -#track_activity_query_size = 1024 # (change requires restart) -#update_process_title = on -#stats_temp_directory = 'pg_stat_tmp' - - -# - Statistics Monitoring - - -#log_parser_stats = off -#log_planner_stats = off -#log_executor_stats = off -#log_statement_stats = off - - -#------------------------------------------------------------------------------ -# AUTOVACUUM PARAMETERS -#------------------------------------------------------------------------------ - -#autovacuum = on # Enable autovacuum subprocess? 'on' - # requires track_counts to also be on. -#log_autovacuum_min_duration = -1 # -1 disables, 0 logs all actions and - # their durations, > 0 logs only - # actions running at least this number - # of milliseconds. -#autovacuum_max_workers = 3 # max number of autovacuum subprocesses - # (change requires restart) -#autovacuum_naptime = 1min # time between autovacuum runs -#autovacuum_vacuum_threshold = 50 # min number of row updates before - # vacuum -#autovacuum_analyze_threshold = 50 # min number of row updates before - # analyze -#autovacuum_vacuum_scale_factor = 0.2 # fraction of table size before vacuum -#autovacuum_analyze_scale_factor = 0.1 # fraction of table size before analyze -#autovacuum_freeze_max_age = 200000000 # maximum XID age before forced vacuum - # (change requires restart) -#autovacuum_vacuum_cost_delay = 20ms # default vacuum cost delay for - # autovacuum, in milliseconds; - # -1 means use vacuum_cost_delay -#autovacuum_vacuum_cost_limit = -1 # default vacuum cost limit for - # autovacuum, -1 means use - # vacuum_cost_limit - #------------------------------------------------------------------------------ # CLIENT CONNECTION DEFAULTS @@ -498,7 +99,7 @@ log_line_prefix = '%t ' # special values: # - Locale and Formatting - -datestyle = 'iso, mdy' +#datestyle = 'iso, mdy' #intervalstyle = 'postgres' #timezone = '(defaults to server environment setting)' #timezone_abbreviations = 'Default' # Select the set of available time zone @@ -513,14 +114,14 @@ datestyle = 'iso, mdy' # encoding # These settings are initialized by initdb, but they can be changed. -lc_messages = 'en_US.UTF-8' # locale for system error message +#lc_messages = 'en_US.UTF-8' # locale for system error message # strings -lc_monetary = 'en_US.UTF-8' # locale for monetary formatting -lc_numeric = 'en_US.UTF-8' # locale for number formatting -lc_time = 'en_US.UTF-8' # locale for time formatting +#lc_monetary = 'en_US.UTF-8' # locale for monetary formatting +#lc_numeric = 'en_US.UTF-8' # locale for number formatting +#lc_time = 'en_US.UTF-8' # locale for time formatting # default configuration for text search -default_text_search_config = 'pg_catalog.english' +#default_text_search_config = 'pg_catalog.english' # - Other Defaults - @@ -541,37 +142,3 @@ default_text_search_config = 'pg_catalog.english' max_pred_locks_per_transaction = 256 # min 10 # (change requires restart) -#------------------------------------------------------------------------------ -# VERSION/PLATFORM COMPATIBILITY -#------------------------------------------------------------------------------ - -# - Previous PostgreSQL Versions - - -#array_nulls = on -#backslash_quote = safe_encoding # on, off, or safe_encoding -#default_with_oids = off -#escape_string_warning = on -#lo_compat_privileges = off -#quote_all_identifiers = off -#sql_inheritance = on -#standard_conforming_strings = on -#synchronize_seqscans = on - -# - Other Platforms and Clients - - -#transform_null_equals = off - - -#------------------------------------------------------------------------------ -# ERROR HANDLING -#------------------------------------------------------------------------------ - -#exit_on_error = off # terminate session on any error? -#restart_after_crash = on # reinitialize after backend crash? - - -#------------------------------------------------------------------------------ -# CUSTOMIZED OPTIONS -#------------------------------------------------------------------------------ - -#custom_variable_classes = '' # list of custom variable class names diff --git a/toolset/databases/postgres/postgresql.conf.sample b/toolset/databases/postgres/postgresql.conf.sample deleted file mode 100644 index ed322b6f46c..00000000000 --- a/toolset/databases/postgres/postgresql.conf.sample +++ /dev/null @@ -1,813 +0,0 @@ -# ----------------------------- -# PostgreSQL configuration file -# ----------------------------- -# -# This file consists of lines of the form: -# -# name = value -# -# (The "=" is optional.) Whitespace may be used. Comments are introduced with -# "#" anywhere on a line. The complete list of parameter names and allowed -# values can be found in the PostgreSQL documentation. -# -# The commented-out settings shown in this file represent the default values. -# Re-commenting a setting is NOT sufficient to revert it to the default value; -# you need to reload the server. -# -# This file is read on server startup and when the server receives a SIGHUP -# signal. If you edit the file on a running system, you have to SIGHUP the -# server for the changes to take effect, run "pg_ctl reload", or execute -# "SELECT pg_reload_conf()". Some parameters, which are marked below, -# require a server shutdown and restart to take effect. -# -# Any parameter can also be given as a command-line option to the server, e.g., -# "postgres -c log_connections=on". Some parameters can be changed at run time -# with the "SET" SQL command. -# -# Memory units: B = bytes Time units: us = microseconds -# kB = kilobytes ms = milliseconds -# MB = megabytes s = seconds -# GB = gigabytes min = minutes -# TB = terabytes h = hours -# d = days - - -#------------------------------------------------------------------------------ -# FILE LOCATIONS -#------------------------------------------------------------------------------ - -# The default values of these variables are driven from the -D command-line -# option or PGDATA environment variable, represented here as ConfigDir. - -#data_directory = 'ConfigDir' # use data in another directory - # (change requires restart) -#hba_file = 'ConfigDir/pg_hba.conf' # host-based authentication file - # (change requires restart) -#ident_file = 'ConfigDir/pg_ident.conf' # ident configuration file - # (change requires restart) - -# If external_pid_file is not explicitly set, no extra PID file is written. -#external_pid_file = '' # write an extra PID file - # (change requires restart) - - -#------------------------------------------------------------------------------ -# CONNECTIONS AND AUTHENTICATION -#------------------------------------------------------------------------------ - -# - Connection Settings - - -#listen_addresses = 'localhost' # what IP address(es) to listen on; - # comma-separated list of addresses; - # defaults to 'localhost'; use '*' for all - # (change requires restart) -#port = 5432 # (change requires restart) -#max_connections = 100 # (change requires restart) -#reserved_connections = 0 # (change requires restart) -#superuser_reserved_connections = 3 # (change requires restart) -#unix_socket_directories = '/tmp' # comma-separated list of directories - # (change requires restart) -#unix_socket_group = '' # (change requires restart) -#unix_socket_permissions = 0777 # begin with 0 to use octal notation - # (change requires restart) -#bonjour = off # advertise server via Bonjour - # (change requires restart) -#bonjour_name = '' # defaults to the computer name - # (change requires restart) - -# - TCP settings - -# see "man tcp" for details - -#tcp_keepalives_idle = 0 # TCP_KEEPIDLE, in seconds; - # 0 selects the system default -#tcp_keepalives_interval = 0 # TCP_KEEPINTVL, in seconds; - # 0 selects the system default -#tcp_keepalives_count = 0 # TCP_KEEPCNT; - # 0 selects the system default -#tcp_user_timeout = 0 # TCP_USER_TIMEOUT, in milliseconds; - # 0 selects the system default - -#client_connection_check_interval = 0 # time between checks for client - # disconnection while running queries; - # 0 for never - -# - Authentication - - -#authentication_timeout = 1min # 1s-600s -#password_encryption = scram-sha-256 # scram-sha-256 or md5 -#db_user_namespace = off - -# GSSAPI using Kerberos -#krb_server_keyfile = 'FILE:${sysconfdir}/krb5.keytab' -#krb_caseins_users = off - -# - SSL - - -#ssl = off -#ssl_ca_file = '' -#ssl_cert_file = 'server.crt' -#ssl_crl_file = '' -#ssl_crl_dir = '' -#ssl_key_file = 'server.key' -#ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL' # allowed SSL ciphers -#ssl_prefer_server_ciphers = on -#ssl_ecdh_curve = 'prime256v1' -#ssl_min_protocol_version = 'TLSv1.2' -#ssl_max_protocol_version = '' -#ssl_dh_params_file = '' -#ssl_passphrase_command = '' -#ssl_passphrase_command_supports_reload = off - - -#------------------------------------------------------------------------------ -# RESOURCE USAGE (except WAL) -#------------------------------------------------------------------------------ - -# - Memory - - -#shared_buffers = 128MB # min 128kB - # (change requires restart) -#huge_pages = try # on, off, or try - # (change requires restart) -#huge_page_size = 0 # zero for system default - # (change requires restart) -#temp_buffers = 8MB # min 800kB -#max_prepared_transactions = 0 # zero disables the feature - # (change requires restart) -# Caution: it is not advisable to set max_prepared_transactions nonzero unless -# you actively intend to use prepared transactions. -#work_mem = 4MB # min 64kB -#hash_mem_multiplier = 2.0 # 1-1000.0 multiplier on hash table work_mem -#maintenance_work_mem = 64MB # min 1MB -#autovacuum_work_mem = -1 # min 1MB, or -1 to use maintenance_work_mem -#logical_decoding_work_mem = 64MB # min 64kB -#max_stack_depth = 2MB # min 100kB -#shared_memory_type = mmap # the default is the first option - # supported by the operating system: - # mmap - # sysv - # windows - # (change requires restart) -#dynamic_shared_memory_type = posix # the default is usually the first option - # supported by the operating system: - # posix - # sysv - # windows - # mmap - # (change requires restart) -#min_dynamic_shared_memory = 0MB # (change requires restart) - -# - Disk - - -#temp_file_limit = -1 # limits per-process temp file space - # in kilobytes, or -1 for no limit - -# - Kernel Resources - - -#max_files_per_process = 1000 # min 64 - # (change requires restart) - -# - Cost-Based Vacuum Delay - - -#vacuum_cost_delay = 0 # 0-100 milliseconds (0 disables) -#vacuum_cost_page_hit = 1 # 0-10000 credits -#vacuum_cost_page_miss = 2 # 0-10000 credits -#vacuum_cost_page_dirty = 20 # 0-10000 credits -#vacuum_cost_limit = 200 # 1-10000 credits - -# - Background Writer - - -#bgwriter_delay = 200ms # 10-10000ms between rounds -#bgwriter_lru_maxpages = 100 # max buffers written/round, 0 disables -#bgwriter_lru_multiplier = 2.0 # 0-10.0 multiplier on buffers scanned/round -#bgwriter_flush_after = 0 # measured in pages, 0 disables - -# - Asynchronous Behavior - - -#backend_flush_after = 0 # measured in pages, 0 disables -#effective_io_concurrency = 1 # 1-1000; 0 disables prefetching -#maintenance_io_concurrency = 10 # 1-1000; 0 disables prefetching -#max_worker_processes = 8 # (change requires restart) -#max_parallel_workers_per_gather = 2 # taken from max_parallel_workers -#max_parallel_maintenance_workers = 2 # taken from max_parallel_workers -#max_parallel_workers = 8 # maximum number of max_worker_processes that - # can be used in parallel operations -#parallel_leader_participation = on -#old_snapshot_threshold = -1 # 1min-60d; -1 disables; 0 is immediate - # (change requires restart) - - -#------------------------------------------------------------------------------ -# WRITE-AHEAD LOG -#------------------------------------------------------------------------------ - -# - Settings - - -#wal_level = replica # minimal, replica, or logical - # (change requires restart) -#fsync = on # flush data to disk for crash safety - # (turning this off can cause - # unrecoverable data corruption) -#synchronous_commit = on # synchronization level; - # off, local, remote_write, remote_apply, or on -#wal_sync_method = fsync # the default is the first option - # supported by the operating system: - # open_datasync - # fdatasync (default on Linux and FreeBSD) - # fsync - # fsync_writethrough - # open_sync -#full_page_writes = on # recover from partial page writes -#wal_log_hints = off # also do full page writes of non-critical updates - # (change requires restart) -#wal_compression = off # enables compression of full-page writes; - # off, pglz, lz4, zstd, or on -#wal_init_zero = on # zero-fill new WAL files -#wal_recycle = on # recycle WAL files -#wal_buffers = -1 # min 32kB, -1 sets based on shared_buffers - # (change requires restart) -#wal_writer_delay = 200ms # 1-10000 milliseconds -#wal_writer_flush_after = 1MB # measured in pages, 0 disables -#wal_skip_threshold = 2MB - -#commit_delay = 0 # range 0-100000, in microseconds -#commit_siblings = 5 # range 1-1000 - -# - Checkpoints - - -#checkpoint_timeout = 5min # range 30s-1d -#checkpoint_completion_target = 0.9 # checkpoint target duration, 0.0 - 1.0 -#checkpoint_flush_after = 0 # measured in pages, 0 disables -#checkpoint_warning = 30s # 0 disables -#max_wal_size = 1GB -#min_wal_size = 80MB - -# - Prefetching during recovery - - -#recovery_prefetch = try # prefetch pages referenced in the WAL? -#wal_decode_buffer_size = 512kB # lookahead window used for prefetching - # (change requires restart) - -# - Archiving - - -#archive_mode = off # enables archiving; off, on, or always - # (change requires restart) -#archive_library = '' # library to use to archive a WAL file - # (empty string indicates archive_command should - # be used) -#archive_command = '' # command to use to archive a WAL file - # placeholders: %p = path of file to archive - # %f = file name only - # e.g. 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f' -#archive_timeout = 0 # force a WAL file switch after this - # number of seconds; 0 disables - -# - Archive Recovery - - -# These are only used in recovery mode. - -#restore_command = '' # command to use to restore an archived WAL file - # placeholders: %p = path of file to restore - # %f = file name only - # e.g. 'cp /mnt/server/archivedir/%f %p' -#archive_cleanup_command = '' # command to execute at every restartpoint -#recovery_end_command = '' # command to execute at completion of recovery - -# - Recovery Target - - -# Set these only when performing a targeted recovery. - -#recovery_target = '' # 'immediate' to end recovery as soon as a - # consistent state is reached - # (change requires restart) -#recovery_target_name = '' # the named restore point to which recovery will proceed - # (change requires restart) -#recovery_target_time = '' # the time stamp up to which recovery will proceed - # (change requires restart) -#recovery_target_xid = '' # the transaction ID up to which recovery will proceed - # (change requires restart) -#recovery_target_lsn = '' # the WAL LSN up to which recovery will proceed - # (change requires restart) -#recovery_target_inclusive = on # Specifies whether to stop: - # just after the specified recovery target (on) - # just before the recovery target (off) - # (change requires restart) -#recovery_target_timeline = 'latest' # 'current', 'latest', or timeline ID - # (change requires restart) -#recovery_target_action = 'pause' # 'pause', 'promote', 'shutdown' - # (change requires restart) - - -#------------------------------------------------------------------------------ -# REPLICATION -#------------------------------------------------------------------------------ - -# - Sending Servers - - -# Set these on the primary and on any standby that will send replication data. - -#max_wal_senders = 10 # max number of walsender processes - # (change requires restart) -#max_replication_slots = 10 # max number of replication slots - # (change requires restart) -#wal_keep_size = 0 # in megabytes; 0 disables -#max_slot_wal_keep_size = -1 # in megabytes; -1 disables -#wal_sender_timeout = 60s # in milliseconds; 0 disables -#track_commit_timestamp = off # collect timestamp of transaction commit - # (change requires restart) - -# - Primary Server - - -# These settings are ignored on a standby server. - -#synchronous_standby_names = '' # standby servers that provide sync rep - # method to choose sync standbys, number of sync standbys, - # and comma-separated list of application_name - # from standby(s); '*' = all -#vacuum_defer_cleanup_age = 0 # number of xacts by which cleanup is delayed - -# - Standby Servers - - -# These settings are ignored on a primary server. - -#primary_conninfo = '' # connection string to sending server -#primary_slot_name = '' # replication slot on sending server -#hot_standby = on # "off" disallows queries during recovery - # (change requires restart) -#max_standby_archive_delay = 30s # max delay before canceling queries - # when reading WAL from archive; - # -1 allows indefinite delay -#max_standby_streaming_delay = 30s # max delay before canceling queries - # when reading streaming WAL; - # -1 allows indefinite delay -#wal_receiver_create_temp_slot = off # create temp slot if primary_slot_name - # is not set -#wal_receiver_status_interval = 10s # send replies at least this often - # 0 disables -#hot_standby_feedback = off # send info from standby to prevent - # query conflicts -#wal_receiver_timeout = 60s # time that receiver waits for - # communication from primary - # in milliseconds; 0 disables -#wal_retrieve_retry_interval = 5s # time to wait before retrying to - # retrieve WAL after a failed attempt -#recovery_min_apply_delay = 0 # minimum delay for applying changes during recovery - -# - Subscribers - - -# These settings are ignored on a publisher. - -#max_logical_replication_workers = 4 # taken from max_worker_processes - # (change requires restart) -#max_sync_workers_per_subscription = 2 # taken from max_logical_replication_workers -#max_parallel_apply_workers_per_subscription = 2 # taken from max_logical_replication_workers - - -#------------------------------------------------------------------------------ -# QUERY TUNING -#------------------------------------------------------------------------------ - -# - Planner Method Configuration - - -#enable_async_append = on -#enable_bitmapscan = on -#enable_gathermerge = on -#enable_hashagg = on -#enable_hashjoin = on -#enable_incremental_sort = on -#enable_indexscan = on -#enable_indexonlyscan = on -#enable_material = on -#enable_memoize = on -#enable_mergejoin = on -#enable_nestloop = on -#enable_parallel_append = on -#enable_parallel_hash = on -#enable_partition_pruning = on -#enable_partitionwise_join = off -#enable_partitionwise_aggregate = off -#enable_presorted_aggregate = on -#enable_seqscan = on -#enable_sort = on -#enable_tidscan = on - -# - Planner Cost Constants - - -#seq_page_cost = 1.0 # measured on an arbitrary scale -#random_page_cost = 4.0 # same scale as above -#cpu_tuple_cost = 0.01 # same scale as above -#cpu_index_tuple_cost = 0.005 # same scale as above -#cpu_operator_cost = 0.0025 # same scale as above -#parallel_setup_cost = 1000.0 # same scale as above -#parallel_tuple_cost = 0.1 # same scale as above -#min_parallel_table_scan_size = 8MB -#min_parallel_index_scan_size = 512kB -#effective_cache_size = 4GB - -#jit_above_cost = 100000 # perform JIT compilation if available - # and query more expensive than this; - # -1 disables -#jit_inline_above_cost = 500000 # inline small functions if query is - # more expensive than this; -1 disables -#jit_optimize_above_cost = 500000 # use expensive JIT optimizations if - # query is more expensive than this; - # -1 disables - -# - Genetic Query Optimizer - - -#geqo = on -#geqo_threshold = 12 -#geqo_effort = 5 # range 1-10 -#geqo_pool_size = 0 # selects default based on effort -#geqo_generations = 0 # selects default based on effort -#geqo_selection_bias = 2.0 # range 1.5-2.0 -#geqo_seed = 0.0 # range 0.0-1.0 - -# - Other Planner Options - - -#default_statistics_target = 100 # range 1-10000 -#constraint_exclusion = partition # on, off, or partition -#cursor_tuple_fraction = 0.1 # range 0.0-1.0 -#from_collapse_limit = 8 -#jit = on # allow JIT compilation -#join_collapse_limit = 8 # 1 disables collapsing of explicit - # JOIN clauses -#plan_cache_mode = auto # auto, force_generic_plan or - # force_custom_plan -#recursive_worktable_factor = 10.0 # range 0.001-1000000 - - -#------------------------------------------------------------------------------ -# REPORTING AND LOGGING -#------------------------------------------------------------------------------ - -# - Where to Log - - -#log_destination = 'stderr' # Valid values are combinations of - # stderr, csvlog, jsonlog, syslog, and - # eventlog, depending on platform. - # csvlog and jsonlog require - # logging_collector to be on. - -# This is used when logging to stderr: -#logging_collector = off # Enable capturing of stderr, jsonlog, - # and csvlog into log files. Required - # to be on for csvlogs and jsonlogs. - # (change requires restart) - -# These are only used if logging_collector is on: -#log_directory = 'log' # directory where log files are written, - # can be absolute or relative to PGDATA -#log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' # log file name pattern, - # can include strftime() escapes -#log_file_mode = 0600 # creation mode for log files, - # begin with 0 to use octal notation -#log_rotation_age = 1d # Automatic rotation of logfiles will - # happen after that time. 0 disables. -#log_rotation_size = 10MB # Automatic rotation of logfiles will - # happen after that much log output. - # 0 disables. -#log_truncate_on_rotation = off # If on, an existing log file with the - # same name as the new log file will be - # truncated rather than appended to. - # But such truncation only occurs on - # time-driven rotation, not on restarts - # or size-driven rotation. Default is - # off, meaning append to existing files - # in all cases. - -# These are relevant when logging to syslog: -#syslog_facility = 'LOCAL0' -#syslog_ident = 'postgres' -#syslog_sequence_numbers = on -#syslog_split_messages = on - -# This is only relevant when logging to eventlog (Windows): -# (change requires restart) -#event_source = 'PostgreSQL' - -# - When to Log - - -#log_min_messages = warning # values in order of decreasing detail: - # debug5 - # debug4 - # debug3 - # debug2 - # debug1 - # info - # notice - # warning - # error - # log - # fatal - # panic - -#log_min_error_statement = error # values in order of decreasing detail: - # debug5 - # debug4 - # debug3 - # debug2 - # debug1 - # info - # notice - # warning - # error - # log - # fatal - # panic (effectively off) - -#log_min_duration_statement = -1 # -1 is disabled, 0 logs all statements - # and their durations, > 0 logs only - # statements running at least this number - # of milliseconds - -#log_min_duration_sample = -1 # -1 is disabled, 0 logs a sample of statements - # and their durations, > 0 logs only a sample of - # statements running at least this number - # of milliseconds; - # sample fraction is determined by log_statement_sample_rate - -#log_statement_sample_rate = 1.0 # fraction of logged statements exceeding - # log_min_duration_sample to be logged; - # 1.0 logs all such statements, 0.0 never logs - - -#log_transaction_sample_rate = 0.0 # fraction of transactions whose statements - # are logged regardless of their duration; 1.0 logs all - # statements from all transactions, 0.0 never logs - -#log_startup_progress_interval = 10s # Time between progress updates for - # long-running startup operations. - # 0 disables the feature, > 0 indicates - # the interval in milliseconds. - -# - What to Log - - -#debug_print_parse = off -#debug_print_rewritten = off -#debug_print_plan = off -#debug_pretty_print = on -#log_autovacuum_min_duration = 10min # log autovacuum activity; - # -1 disables, 0 logs all actions and - # their durations, > 0 logs only - # actions running at least this number - # of milliseconds. -#log_checkpoints = on -#log_connections = off -#log_disconnections = off -#log_duration = off -#log_error_verbosity = default # terse, default, or verbose messages -#log_hostname = off -#log_line_prefix = '%m [%p] ' # special values: - # %a = application name - # %u = user name - # %d = database name - # %r = remote host and port - # %h = remote host - # %b = backend type - # %p = process ID - # %P = process ID of parallel group leader - # %t = timestamp without milliseconds - # %m = timestamp with milliseconds - # %n = timestamp with milliseconds (as a Unix epoch) - # %Q = query ID (0 if none or not computed) - # %i = command tag - # %e = SQL state - # %c = session ID - # %l = session line number - # %s = session start timestamp - # %v = virtual transaction ID - # %x = transaction ID (0 if none) - # %q = stop here in non-session - # processes - # %% = '%' - # e.g. '<%u%%%d> ' -#log_lock_waits = off # log lock waits >= deadlock_timeout -#log_recovery_conflict_waits = off # log standby recovery conflict waits - # >= deadlock_timeout -#log_parameter_max_length = -1 # when logging statements, limit logged - # bind-parameter values to N bytes; - # -1 means print in full, 0 disables -#log_parameter_max_length_on_error = 0 # when logging an error, limit logged - # bind-parameter values to N bytes; - # -1 means print in full, 0 disables -#log_statement = 'none' # none, ddl, mod, all -#log_replication_commands = off -#log_temp_files = -1 # log temporary files equal or larger - # than the specified size in kilobytes; - # -1 disables, 0 logs all temp files -#log_timezone = 'GMT' - -# - Process Title - - -#cluster_name = '' # added to process titles if nonempty - # (change requires restart) -#update_process_title = on - - -#------------------------------------------------------------------------------ -# STATISTICS -#------------------------------------------------------------------------------ - -# - Cumulative Query and Index Statistics - - -#track_activities = on -#track_activity_query_size = 1024 # (change requires restart) -#track_counts = on -#track_io_timing = off -#track_wal_io_timing = off -#track_functions = none # none, pl, all -#stats_fetch_consistency = cache - - -# - Monitoring - - -#compute_query_id = auto -#log_statement_stats = off -#log_parser_stats = off -#log_planner_stats = off -#log_executor_stats = off - - -#------------------------------------------------------------------------------ -# AUTOVACUUM -#------------------------------------------------------------------------------ - -#autovacuum = on # Enable autovacuum subprocess? 'on' - # requires track_counts to also be on. -#autovacuum_max_workers = 3 # max number of autovacuum subprocesses - # (change requires restart) -#autovacuum_naptime = 1min # time between autovacuum runs -#autovacuum_vacuum_threshold = 50 # min number of row updates before - # vacuum -#autovacuum_vacuum_insert_threshold = 1000 # min number of row inserts - # before vacuum; -1 disables insert - # vacuums -#autovacuum_analyze_threshold = 50 # min number of row updates before - # analyze -#autovacuum_vacuum_scale_factor = 0.2 # fraction of table size before vacuum -#autovacuum_vacuum_insert_scale_factor = 0.2 # fraction of inserts over table - # size before insert vacuum -#autovacuum_analyze_scale_factor = 0.1 # fraction of table size before analyze -#autovacuum_freeze_max_age = 200000000 # maximum XID age before forced vacuum - # (change requires restart) -#autovacuum_multixact_freeze_max_age = 400000000 # maximum multixact age - # before forced vacuum - # (change requires restart) -#autovacuum_vacuum_cost_delay = 2ms # default vacuum cost delay for - # autovacuum, in milliseconds; - # -1 means use vacuum_cost_delay -#autovacuum_vacuum_cost_limit = -1 # default vacuum cost limit for - # autovacuum, -1 means use - # vacuum_cost_limit - - -#------------------------------------------------------------------------------ -# CLIENT CONNECTION DEFAULTS -#------------------------------------------------------------------------------ - -# - Statement Behavior - - -#client_min_messages = notice # values in order of decreasing detail: - # debug5 - # debug4 - # debug3 - # debug2 - # debug1 - # log - # notice - # warning - # error -#search_path = '"$user", public' # schema names -#row_security = on -#default_table_access_method = 'heap' -#default_tablespace = '' # a tablespace name, '' uses the default -#default_toast_compression = 'pglz' # 'pglz' or 'lz4' -#temp_tablespaces = '' # a list of tablespace names, '' uses - # only default tablespace -#check_function_bodies = on -#default_transaction_isolation = 'read committed' -#default_transaction_read_only = off -#default_transaction_deferrable = off -#session_replication_role = 'origin' -#statement_timeout = 0 # in milliseconds, 0 is disabled -#lock_timeout = 0 # in milliseconds, 0 is disabled -#idle_in_transaction_session_timeout = 0 # in milliseconds, 0 is disabled -#idle_session_timeout = 0 # in milliseconds, 0 is disabled -#vacuum_freeze_table_age = 150000000 -#vacuum_freeze_min_age = 50000000 -#vacuum_failsafe_age = 1600000000 -#vacuum_multixact_freeze_table_age = 150000000 -#vacuum_multixact_freeze_min_age = 5000000 -#vacuum_multixact_failsafe_age = 1600000000 -#bytea_output = 'hex' # hex, escape -#xmlbinary = 'base64' -#xmloption = 'content' -#gin_pending_list_limit = 4MB -#createrole_self_grant = '' # set and/or inherit - -# - Locale and Formatting - - -#datestyle = 'iso, mdy' -#intervalstyle = 'postgres' -#timezone = 'GMT' -#timezone_abbreviations = 'Default' # Select the set of available time zone - # abbreviations. Currently, there are - # Default - # Australia (historical usage) - # India - # You can create your own file in - # share/timezonesets/. -#extra_float_digits = 1 # min -15, max 3; any value >0 actually - # selects precise output mode -#client_encoding = sql_ascii # actually, defaults to database - # encoding - -# These settings are initialized by initdb, but they can be changed. -#lc_messages = 'C' # locale for system error message - # strings -#lc_monetary = 'C' # locale for monetary formatting -#lc_numeric = 'C' # locale for number formatting -#lc_time = 'C' # locale for time formatting - -# default configuration for text search -#default_text_search_config = 'pg_catalog.simple' - -# - Shared Library Preloading - - -#local_preload_libraries = '' -#session_preload_libraries = '' -#shared_preload_libraries = '' # (change requires restart) -#jit_provider = 'llvmjit' # JIT library to use - -# - Other Defaults - - -#dynamic_library_path = '$libdir' -#gin_fuzzy_search_limit = 0 - - -#------------------------------------------------------------------------------ -# LOCK MANAGEMENT -#------------------------------------------------------------------------------ - -#deadlock_timeout = 1s -#max_locks_per_transaction = 64 # min 10 - # (change requires restart) -#max_pred_locks_per_transaction = 64 # min 10 - # (change requires restart) -#max_pred_locks_per_relation = -2 # negative values mean - # (max_pred_locks_per_transaction - # / -max_pred_locks_per_relation) - 1 -#max_pred_locks_per_page = 2 # min 0 - - -#------------------------------------------------------------------------------ -# VERSION AND PLATFORM COMPATIBILITY -#------------------------------------------------------------------------------ - -# - Previous PostgreSQL Versions - - -#array_nulls = on -#backslash_quote = safe_encoding # on, off, or safe_encoding -#escape_string_warning = on -#lo_compat_privileges = off -#quote_all_identifiers = off -#standard_conforming_strings = on -#synchronize_seqscans = on - -# - Other Platforms and Clients - - -#transform_null_equals = off - - -#------------------------------------------------------------------------------ -# ERROR HANDLING -#------------------------------------------------------------------------------ - -#exit_on_error = off # terminate session on any error? -#restart_after_crash = on # reinitialize after backend crash? -#data_sync_retry = off # retry or panic on failure to fsync - # data? - # (change requires restart) -#recovery_init_sync_method = fsync # fsync, syncfs (Linux 5.8+) - - -#------------------------------------------------------------------------------ -# CONFIG FILE INCLUDES -#------------------------------------------------------------------------------ - -# These options allow settings to be loaded from files other than the -# default postgresql.conf. Note that these are directives, not variable -# assignments, so they can usefully be given more than once. - -#include_dir = '...' # include files ending in '.conf' from - # a directory, e.g., 'conf.d' -#include_if_exists = '...' # include file only if it exists -#include = '...' # include file - - -#------------------------------------------------------------------------------ -# CUSTOMIZED OPTIONS -#------------------------------------------------------------------------------ - -# Add settings for extensions here \ No newline at end of file From bb28a9f2b0317204c2403c168e6b6c76a9c946f2 Mon Sep 17 00:00:00 2001 From: carrot <149851+lopcode@users.noreply.github.com> Date: Mon, 25 Mar 2024 15:38:30 +0000 Subject: [PATCH 195/210] Update Pellet to 0.0.16 (#8817) --- frameworks/Kotlin/pellet/pellet.dockerfile | 4 +-- .../Kotlin/pellet/sample/build.gradle.kts | 22 +++++++--------- .../src/main/kotlin/benchmark/Benchmark.kt | 17 ++++++------ .../main/kotlin/benchmark/data/FortuneDAO.kt | 2 +- .../kotlin/benchmark/data/TFBRepository.kt | 26 ++++++++++++------- .../main/kotlin/benchmark/data/WorldDAO.kt | 4 +-- 6 files changed, 39 insertions(+), 36 deletions(-) diff --git a/frameworks/Kotlin/pellet/pellet.dockerfile b/frameworks/Kotlin/pellet/pellet.dockerfile index cb96c1079c5..f57e433dcd6 100644 --- a/frameworks/Kotlin/pellet/pellet.dockerfile +++ b/frameworks/Kotlin/pellet/pellet.dockerfile @@ -1,10 +1,10 @@ -FROM gradle:jdk18 as gradle +FROM gradle:jdk21 as gradle WORKDIR /sample COPY sample/build.gradle.kts build.gradle.kts COPY sample/src src RUN gradle clean shadowJar --no-daemon -FROM openjdk:18-jdk-buster +FROM openjdk:21-jdk-buster WORKDIR /sample COPY --from=gradle /sample/build/libs/sample-1.0.0-all.jar app.jar diff --git a/frameworks/Kotlin/pellet/sample/build.gradle.kts b/frameworks/Kotlin/pellet/sample/build.gradle.kts index a41736ca3a7..f12dad8adbd 100644 --- a/frameworks/Kotlin/pellet/sample/build.gradle.kts +++ b/frameworks/Kotlin/pellet/sample/build.gradle.kts @@ -1,8 +1,8 @@ plugins { application id("com.github.johnrengelman.shadow") version "7.1.0" - kotlin("jvm") version "1.7.10" - kotlin("plugin.serialization") version "1.7.10" + kotlin("jvm") version "1.9.23" + kotlin("plugin.serialization") version "1.9.23" id("nu.studer.rocker") version "3.0.4" } @@ -25,31 +25,27 @@ rocker { } dependencies { - implementation(platform("dev.pellet:pellet-bom:0.0.15")) + implementation(platform("dev.pellet:pellet-bom:0.0.16")) implementation("dev.pellet:pellet-server") implementation("dev.pellet:pellet-logging") implementation("org.slf4j:slf4j-api:1.7.36") - implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.0-RC") + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3") implementation(platform(kotlin("bom"))) implementation(kotlin("stdlib-jdk8")) - implementation(platform("org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.6.4")) - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core") - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-jdk8") - implementation("io.vertx:vertx-pg-client:4.3.2") + implementation("io.vertx:vertx-pg-client:4.5.5") + implementation("io.vertx:vertx-lang-kotlin:4.5.5") implementation("com.ongres.scram:client:2.1") - implementation("io.vertx:vertx-lang-kotlin:4.3.2") - implementation("io.vertx:vertx-lang-kotlin-coroutines:4.3.2") } java { toolchain { - sourceCompatibility = JavaVersion.VERSION_18 - targetCompatibility = JavaVersion.VERSION_18 + sourceCompatibility = JavaVersion.VERSION_21 + targetCompatibility = JavaVersion.VERSION_21 } } tasks.withType { - kotlinOptions.jvmTarget = "18" + kotlinOptions.jvmTarget = "21" } application { diff --git a/frameworks/Kotlin/pellet/sample/src/main/kotlin/benchmark/Benchmark.kt b/frameworks/Kotlin/pellet/sample/src/main/kotlin/benchmark/Benchmark.kt index b756c01f476..51dd307d511 100644 --- a/frameworks/Kotlin/pellet/sample/src/main/kotlin/benchmark/Benchmark.kt +++ b/frameworks/Kotlin/pellet/sample/src/main/kotlin/benchmark/Benchmark.kt @@ -10,7 +10,6 @@ import dev.pellet.server.PelletConnector import dev.pellet.server.codec.mime.MediaType import dev.pellet.server.responder.http.PelletHTTPRouteContext import dev.pellet.server.routing.http.HTTPRouteResponse -import kotlinx.coroutines.runBlocking import kotlinx.serialization.json.Json import java.time.Instant import java.time.ZoneId @@ -25,7 +24,7 @@ val jsonEncoder = Json { prettyPrint = false } -fun main() = runBlocking { +fun main() { val sharedRouter = httpRouter { get("/plaintext", ::handlePlain) get("/json", ::handleJson) @@ -44,14 +43,14 @@ fun main() = runBlocking { router = sharedRouter } } - pellet.start().join() + pellet.start() } val dateFormatter = DateTimeFormatter .ofPattern("EEE, dd MMM yyyy HH:mm:ss z", Locale.ENGLISH) .withZone(ZoneId.of("GMT")) -private suspend fun handlePlain( +private fun handlePlain( context: PelletHTTPRouteContext ): HTTPRouteResponse { return HTTPRouteResponse.Builder() @@ -67,7 +66,7 @@ data class ResponseBody( val message: String ) -private suspend fun handleJson( +private fun handleJson( context: PelletHTTPRouteContext ): HTTPRouteResponse { val responseBody = ResponseBody(message = "Hello, World!") @@ -81,7 +80,7 @@ private suspend fun handleJson( private val repository = TFBRepository() -private suspend fun handleDb( +private fun handleDb( context: PelletHTTPRouteContext ): HTTPRouteResponse { val result = repository.fetchWorld() @@ -93,7 +92,7 @@ private suspend fun handleDb( .build() } -private suspend fun handleQuery( +private fun handleQuery( context: PelletHTTPRouteContext ): HTTPRouteResponse { val rawQueries = context.firstQueryParameter("queries").getOrNull() @@ -110,7 +109,7 @@ private suspend fun handleQuery( .build() } -private suspend fun handleUpdates( +private fun handleUpdates( context: PelletHTTPRouteContext ): HTTPRouteResponse { val rawQueries = context.firstQueryParameter("queries").getOrNull() @@ -133,7 +132,7 @@ private suspend fun handleUpdates( .build() } -private suspend fun handleFortunes( +private fun handleFortunes( context: PelletHTTPRouteContext ): HTTPRouteResponse { val newFortune = Fortune(0, "Additional fortune added at request time.") diff --git a/frameworks/Kotlin/pellet/sample/src/main/kotlin/benchmark/data/FortuneDAO.kt b/frameworks/Kotlin/pellet/sample/src/main/kotlin/benchmark/data/FortuneDAO.kt index 889c42ad809..2413066f829 100644 --- a/frameworks/Kotlin/pellet/sample/src/main/kotlin/benchmark/data/FortuneDAO.kt +++ b/frameworks/Kotlin/pellet/sample/src/main/kotlin/benchmark/data/FortuneDAO.kt @@ -2,5 +2,5 @@ package benchmark.data interface FortuneDAO { - suspend fun fetchFortunes(): List + fun fetchFortunes(): List } \ No newline at end of file diff --git a/frameworks/Kotlin/pellet/sample/src/main/kotlin/benchmark/data/TFBRepository.kt b/frameworks/Kotlin/pellet/sample/src/main/kotlin/benchmark/data/TFBRepository.kt index c73285c8df5..75357a462de 100644 --- a/frameworks/Kotlin/pellet/sample/src/main/kotlin/benchmark/data/TFBRepository.kt +++ b/frameworks/Kotlin/pellet/sample/src/main/kotlin/benchmark/data/TFBRepository.kt @@ -1,8 +1,7 @@ package benchmark.data -import io.vertx.kotlin.coroutines.await +import io.vertx.pgclient.PgBuilder import io.vertx.pgclient.PgConnectOptions -import io.vertx.pgclient.PgPool import io.vertx.sqlclient.PoolOptions import io.vertx.sqlclient.Tuple import java.util.concurrent.ThreadLocalRandom @@ -20,14 +19,19 @@ class TFBRepository: WorldDAO, FortuneDAO { } private val poolOptions = PoolOptions() - private val client = PgPool.client(connectOptions, poolOptions) + private val client = PgBuilder.client() + .with(poolOptions) + .connectingTo(connectOptions) + .build() - override suspend fun fetchWorld(): WorldDTO { + override fun fetchWorld(): WorldDTO { val worldId = ThreadLocalRandom.current().nextInt(1, 10001) val result = client .preparedQuery("select id, randomNumber from world where id = $1") .execute(Tuple.of(worldId)) - .await() + .toCompletionStage() + .toCompletableFuture() + .get() val row = result.first() return WorldDTO( row.getInteger(0), @@ -35,20 +39,24 @@ class TFBRepository: WorldDAO, FortuneDAO { ) } - override suspend fun updateWorlds(worlds: List) { + override fun updateWorlds(worlds: List) { val batch = worlds.map { Tuple.of(it.id, it.randomNumber) } client .preparedQuery("update world set randomNumber = $1 where id = $2") .executeBatch(batch) - .await() + .toCompletionStage() + .toCompletableFuture() + .get() } - override suspend fun fetchFortunes(): List { + override fun fetchFortunes(): List { val results = client.preparedQuery("select id, message from fortune") .execute() - .await() + .toCompletionStage() + .toCompletableFuture() + .get() return results.map { Fortune( it.getInteger(0), diff --git a/frameworks/Kotlin/pellet/sample/src/main/kotlin/benchmark/data/WorldDAO.kt b/frameworks/Kotlin/pellet/sample/src/main/kotlin/benchmark/data/WorldDAO.kt index 20324a49fb2..fd91eb40d1a 100644 --- a/frameworks/Kotlin/pellet/sample/src/main/kotlin/benchmark/data/WorldDAO.kt +++ b/frameworks/Kotlin/pellet/sample/src/main/kotlin/benchmark/data/WorldDAO.kt @@ -2,6 +2,6 @@ package benchmark.data interface WorldDAO { - suspend fun fetchWorld(): WorldDTO - suspend fun updateWorlds(worlds: List) + fun fetchWorld(): WorldDTO + fun updateWorlds(worlds: List) } \ No newline at end of file From b498ab6d7bd6e1e402aa9b5ac5967eff19a02d0d Mon Sep 17 00:00:00 2001 From: Juanjo Aguililla Date: Mon, 25 Mar 2024 16:40:35 +0100 Subject: [PATCH 196/210] [Kotlin/Hexagon] Update dependencies (#8779) * Fix error with URLs in JEE servers * Clean up * Avoid classpath URLs * Fix template loading error * Fix template loading error * Chores * Fix template loading error * Delete MongoDB DB support Storage support in Hexagon will be moved outside the Toolkit, and so, it will be left outside the benchmark. * Fix runtime problem * Update Hexagon version * Make Jackson Blackbird module optional * Add variation with Blackbird module enabled * Upgrade Hexagon version * Enable blackbird Jackson module by default * Update dependencies * Use Hexagon version 2.0.0-B1 (and a little cleanup) * Use Hexagon version 2.0.0-B1 (and a little cleanup) * Use Tomcat instead Resin to test JEE integration * Remove unused environment variable * Clean Tomcat dockerfile * Minor improvements * Minor improvements * Update to release version * Update to the latest Hexagon release * Add Netty adapter test * Remove Gradle Wrapper * Update version * Update version * Minimize template * Skip Hexagon checks in the container * Add Netty Epoll benchmark * Database and template improvements * Update Hexagon version * Update Hexagon version * Update DB settings * Use a single store and template engine to simplify benchmark * Bump mysql-connector-java in /frameworks/Java/wicket Bumps [mysql-connector-java](https://github.com/mysql/mysql-connector-j) from 8.0.27 to 8.0.28. - [Release notes](https://github.com/mysql/mysql-connector-j/releases) - [Changelog](https://github.com/mysql/mysql-connector-j/blob/release/8.0/CHANGES) - [Commits](https://github.com/mysql/mysql-connector-j/compare/8.0.27...8.0.28) --- updated-dependencies: - dependency-name: mysql:mysql-connector-java dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump mongodb-driver-sync from 4.2.0 to 4.2.1 in /frameworks/Java/javalin Bumps [mongodb-driver-sync](https://github.com/mongodb/mongo-java-driver) from 4.2.0 to 4.2.1. - [Release notes](https://github.com/mongodb/mongo-java-driver/releases) - [Commits](https://github.com/mongodb/mongo-java-driver/compare/r4.2.0...r4.2.1) --- updated-dependencies: - dependency-name: org.mongodb:mongodb-driver-sync dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump ujson from 5.2.0 to 5.4.0 in /frameworks/Python/starlette Bumps [ujson](https://github.com/ultrajson/ultrajson) from 5.2.0 to 5.4.0. - [Release notes](https://github.com/ultrajson/ultrajson/releases) - [Commits](https://github.com/ultrajson/ultrajson/compare/5.2.0...5.4.0) --- updated-dependencies: - dependency-name: ujson dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump ujson from 5.2.0 to 5.4.0 in /frameworks/Python/django Bumps [ujson](https://github.com/ultrajson/ultrajson) from 5.2.0 to 5.4.0. - [Release notes](https://github.com/ultrajson/ultrajson/releases) - [Commits](https://github.com/ultrajson/ultrajson/compare/5.2.0...5.4.0) --- updated-dependencies: - dependency-name: ujson dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump ujson from 5.2.0 to 5.4.0 in /frameworks/Python/routerling Bumps [ujson](https://github.com/ultrajson/ultrajson) from 5.2.0 to 5.4.0. - [Release notes](https://github.com/ultrajson/ultrajson/releases) - [Commits](https://github.com/ultrajson/ultrajson/compare/5.2.0...5.4.0) --- updated-dependencies: - dependency-name: ujson dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump ujson from 5.2.0 to 5.4.0 in /frameworks/Python/japronto Bumps [ujson](https://github.com/ultrajson/ultrajson) from 5.2.0 to 5.4.0. - [Release notes](https://github.com/ultrajson/ultrajson/releases) - [Commits](https://github.com/ultrajson/ultrajson/compare/5.2.0...5.4.0) --- updated-dependencies: - dependency-name: ujson dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump ujson from 5.2.0 to 5.4.0 in /frameworks/Python/fastapi Bumps [ujson](https://github.com/ultrajson/ultrajson) from 5.2.0 to 5.4.0. - [Release notes](https://github.com/ultrajson/ultrajson/releases) - [Commits](https://github.com/ultrajson/ultrajson/compare/5.2.0...5.4.0) --- updated-dependencies: - dependency-name: ujson dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump ujson from 5.2.0 to 5.4.0 in /frameworks/Python/uvicorn Bumps [ujson](https://github.com/ultrajson/ultrajson) from 5.2.0 to 5.4.0. - [Release notes](https://github.com/ultrajson/ultrajson/releases) - [Commits](https://github.com/ultrajson/ultrajson/compare/5.2.0...5.4.0) --- updated-dependencies: - dependency-name: ujson dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump ujson from 5.2.0 to 5.4.0 in /frameworks/Python/flask Bumps [ujson](https://github.com/ultrajson/ultrajson) from 5.2.0 to 5.4.0. - [Release notes](https://github.com/ultrajson/ultrajson/releases) - [Commits](https://github.com/ultrajson/ultrajson/compare/5.2.0...5.4.0) --- updated-dependencies: - dependency-name: ujson dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump ujson from 5.1 to 5.4.0 in /frameworks/Python/aiohttp Bumps [ujson](https://github.com/ultrajson/ultrajson) from 5.1 to 5.4.0. - [Release notes](https://github.com/ultrajson/ultrajson/releases) - [Commits](https://github.com/ultrajson/ultrajson/compare/5.1.0...5.4.0) --- updated-dependencies: - dependency-name: ujson dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump rails-html-sanitizer from 1.4.2 to 1.4.3 in /frameworks/Ruby/rails Bumps [rails-html-sanitizer](https://github.com/rails/rails-html-sanitizer) from 1.4.2 to 1.4.3. - [Release notes](https://github.com/rails/rails-html-sanitizer/releases) - [Changelog](https://github.com/rails/rails-html-sanitizer/blob/master/CHANGELOG.md) - [Commits](https://github.com/rails/rails-html-sanitizer/compare/v1.4.2...v1.4.3) --- updated-dependencies: - dependency-name: rails-html-sanitizer dependency-type: indirect ... Signed-off-by: dependabot[bot] * Bump jetty-server in /frameworks/Java/jetty Bumps [jetty-server](https://github.com/eclipse/jetty.project) from 9.4.41.v20210516 to 10.0.10. - [Release notes](https://github.com/eclipse/jetty.project/releases) - [Commits](https://github.com/eclipse/jetty.project/compare/jetty-9.4.41.v20210516...jetty-10.0.10) --- updated-dependencies: - dependency-name: org.eclipse.jetty:jetty-server dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump undertow-core in /frameworks/Java/undertow Bumps [undertow-core](https://github.com/undertow-io/undertow) from 2.2.11.Final to 2.2.15.Final. - [Release notes](https://github.com/undertow-io/undertow/releases) - [Commits](https://github.com/undertow-io/undertow/compare/2.2.11.Final...2.2.15.Final) --- updated-dependencies: - dependency-name: io.undertow:undertow-core dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Update versions * Update README.md * Bump sanic from 22.3.1 to 22.6.1 in /frameworks/Python/sanic Bumps [sanic](https://github.com/sanic-org/sanic) from 22.3.1 to 22.6.1. - [Release notes](https://github.com/sanic-org/sanic/releases) - [Changelog](https://github.com/sanic-org/sanic/blob/main/CHANGELOG.rst) - [Commits](https://github.com/sanic-org/sanic/compare/v22.3.1...v22.6.1) --- updated-dependencies: - dependency-name: sanic dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump postgresql from 42.3.3 to 42.4.1 in /frameworks/Java/light-java Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.3.3 to 42.4.1. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.3.3...REL42.4.1) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump postgresql from 42.3.3 to 42.4.1 in /frameworks/Java/rapidoid Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.3.3 to 42.4.1. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.3.3...REL42.4.1) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump postgresql from 42.3.3 to 42.4.1 in /frameworks/Java/jooby Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.3.3 to 42.4.1. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.3.3...REL42.4.1) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump postgresql from 42.3.3 to 42.4.1 in /frameworks/Java/servlet Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.3.3 to 42.4.1. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.3.3...REL42.4.1) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump postgresql from 42.3.3 to 42.4.1 in /frameworks/Java/spring-webflux Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.3.3 to 42.4.1. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.3.3...REL42.4.1) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump postgresql from 42.3.3 to 42.4.1 in /frameworks/Java/smart-socket Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.3.3 to 42.4.1. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.3.3...REL42.4.1) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump postgresql from 42.3.3 to 42.4.1 in /frameworks/Java/act Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.3.3 to 42.4.1. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.3.3...REL42.4.1) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump postgresql from 42.3.3 to 42.4.1 in /frameworks/Kotlin/kooby Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.3.3 to 42.4.1. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.3.3...REL42.4.1) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump postgresql from 42.3.3 to 42.4.1 in /frameworks/Java/dropwizard Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.3.3 to 42.4.1. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.3.3...REL42.4.1) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump postgresql from 42.3.3 to 42.4.1 in /frameworks/Java/hserver Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.3.3 to 42.4.1. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.3.3...REL42.4.1) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump postgresql from 42.4.0 to 42.4.1 in /frameworks/Java/undertow Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.4.0 to 42.4.1. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.4.0...REL42.4.1) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump postgresql from 42.2.23 to 42.4.1 in /frameworks/Kotlin/ktor/ktor Bumps [postgresql](https://github.com/pgjdbc/pgjdbc) from 42.2.23 to 42.4.1. - [Release notes](https://github.com/pgjdbc/pgjdbc/releases) - [Changelog](https://github.com/pgjdbc/pgjdbc/blob/master/CHANGELOG.md) - [Commits](https://github.com/pgjdbc/pgjdbc/compare/REL42.2.23...REL42.4.1) --- updated-dependencies: - dependency-name: org.postgresql:postgresql dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Update dependencies * Bump undertow-core in /frameworks/Java/light-java Bumps [undertow-core](https://github.com/undertow-io/undertow) from 2.2.15.Final to 2.2.19.Final. - [Release notes](https://github.com/undertow-io/undertow/releases) - [Commits](https://github.com/undertow-io/undertow/compare/2.2.15.Final...2.2.19.Final) --- updated-dependencies: - dependency-name: io.undertow:undertow-core dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Bump undertow-core in /frameworks/Java/undertow Bumps [undertow-core](https://github.com/undertow-io/undertow) from 2.2.18.Final to 2.2.19.Final. - [Release notes](https://github.com/undertow-io/undertow/releases) - [Commits](https://github.com/undertow-io/undertow/compare/2.2.18.Final...2.2.19.Final) --- updated-dependencies: - dependency-name: io.undertow:undertow-core dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Delete Gradle Wrapper * Use different JSON serializer * Restore non Hexagon files * Update Hexagon version * Run pipeline * Run pipeline * Bump axum-core from 0.2.7 to 0.2.8 in /frameworks/Rust/axum Bumps [axum-core](https://github.com/tokio-rs/axum) from 0.2.7 to 0.2.8. - [Release notes](https://github.com/tokio-rs/axum/releases) - [Changelog](https://github.com/tokio-rs/axum/blob/main/CHANGELOG.md) - [Commits](https://github.com/tokio-rs/axum/compare/axum-core-v0.2.7...axum-core-v0.2.8) --- updated-dependencies: - dependency-name: axum-core dependency-type: indirect ... Signed-off-by: dependabot[bot] * Revert "Bump axum-core from 0.2.7 to 0.2.8 in /frameworks/Rust/axum" This reverts commit 4422de8915e70cdca67a07c2e0fdb0610757924b. * Version updates, code refactor and new benchmark cases * Version updates * Version updates * Version updates * [Hexagon] Refactor and updates: * Update Hexagon version * Use Rocker template * Modularize the different scenarios * Fix connection problems * Update Hexagon * Update Gradle * Update dependencies * Update Hexagon version * Update Gradle Wrapper * Add async and native support * Add async and native support * Add async and native support * Replace Vert.x adapter by Netty Epoll Async adapter * Replace Vert.x adapter by Netty Epoll Async adapter * Replace Vert.x adapter by Netty Epoll Async adapter * Replace Vert.x adapter by Netty Epoll Async adapter * Replace Vert.x adapter by Netty Epoll Async adapter * Add Jasync store * Add Jasync store * Update * Update * Update * Update Gradle * Benchmark Netty Epoll only * Add Nima adapter * Update container builds * Fix missing endpoints * Fix Nima benchmarks * Update dependencies * Update dependencies * Update dependencies * Fix build * Fix controller * Fix native tests * Fix native tests * Add note * Add note * Update dependencies * Update dependencies * Update dependencies * Recheck CI jobs * Update dependencies * Update dependencies * Update dependencies * Update dependencies * Update dependencies * Update dependencies * Update Hexagon and Java version, switch templates to JTE * Update Hexagon and improve Netty Epoll configuration * Update Hexagon version * Update dependencies * Update dependencies * Update dependencies * Update dependencies * Update dependencies * Update dependencies * Update dependencies * Update dependencies * Update dependencies * Update dependencies * Update dependencies * Update dependencies * Update dependencies * Update Hexagon version --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- frameworks/Kotlin/hexagon/build.gradle | 16 +++++++-------- .../gradle/wrapper/gradle-wrapper.properties | 2 +- frameworks/Kotlin/hexagon/gradlew.bat | 20 +++++++++---------- .../hexagon-helidon-pgclient.dockerfile | 2 +- .../Kotlin/hexagon/hexagon-helidon.dockerfile | 2 +- .../hexagon-jettyloom-pgclient.dockerfile | 2 +- .../hexagon/hexagon-jettyloom.dockerfile | 2 +- .../hexagon-nettyepoll-pgclient.dockerfile | 2 +- .../hexagon/hexagon-nettyepoll.dockerfile | 2 +- .../Kotlin/hexagon/hexagon-tomcat.dockerfile | 2 +- frameworks/Kotlin/hexagon/hexagon.dockerfile | 2 +- 11 files changed, 27 insertions(+), 27 deletions(-) diff --git a/frameworks/Kotlin/hexagon/build.gradle b/frameworks/Kotlin/hexagon/build.gradle index e82ca30814f..9279d3b38fd 100644 --- a/frameworks/Kotlin/hexagon/build.gradle +++ b/frameworks/Kotlin/hexagon/build.gradle @@ -1,7 +1,7 @@ plugins { - id "org.jetbrains.kotlin.jvm" version "1.9.21" apply false - id "org.graalvm.buildtools.native" version "0.9.28" apply false + id "org.jetbrains.kotlin.jvm" version "1.9.23" apply false + id "org.graalvm.buildtools.native" version "0.10.1" apply false } version = "1.0.0" @@ -9,13 +9,13 @@ description = "TFB benchmark" group = "com.hexagonkt" ext { - hexagonVersion = "3.4.5" - jettyVersion = "12.0.4" - nettyVersion = "4.1.101.Final" + hexagonVersion = "3.5.1" + jettyVersion = "12.0.7" + nettyVersion = "4.1.107.Final" hikariVersion = "5.1.0" - postgresqlVersion = "42.7.1" - vertxVersion = "4.5.0" + postgresqlVersion = "42.7.3" + vertxVersion = "4.5.5" cache2kVersion = "2.6.1.Final" applicationClass = "com.hexagonkt.BenchmarkKt" @@ -30,5 +30,5 @@ subprojects { } tasks.wrapper { - gradleVersion = "8.5" + gradleVersion = "8.6" } diff --git a/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties b/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties index 1af9e0930b8..a80b22ce5cf 100644 --- a/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties +++ b/frameworks/Kotlin/hexagon/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/frameworks/Kotlin/hexagon/gradlew.bat b/frameworks/Kotlin/hexagon/gradlew.bat index 93e3f59f135..25da30dbdee 100644 --- a/frameworks/Kotlin/hexagon/gradlew.bat +++ b/frameworks/Kotlin/hexagon/gradlew.bat @@ -43,11 +43,11 @@ set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail @@ -57,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. +echo. 1>&2 +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 +echo. 1>&2 +echo Please set the JAVA_HOME variable in your environment to match the 1>&2 +echo location of your Java installation. 1>&2 goto fail diff --git a/frameworks/Kotlin/hexagon/hexagon-helidon-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-helidon-pgclient.dockerfile index 0ecb7488d43..d87e78307b0 100644 --- a/frameworks/Kotlin/hexagon/hexagon-helidon-pgclient.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-helidon-pgclient.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/gradle:8.4-jdk21-alpine AS build +FROM docker.io/gradle:8.6-jdk21-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon-helidon.dockerfile b/frameworks/Kotlin/hexagon/hexagon-helidon.dockerfile index 5c790a00c72..913a9459a06 100644 --- a/frameworks/Kotlin/hexagon/hexagon-helidon.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-helidon.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/gradle:8.4-jdk21-alpine AS build +FROM docker.io/gradle:8.6-jdk21-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile index 10f40528c0a..90d51b0b30b 100644 --- a/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-jettyloom-pgclient.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/gradle:8.4-jdk21-alpine AS build +FROM docker.io/gradle:8.6-jdk21-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile b/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile index ce807d1c2fe..93b0e22a963 100644 --- a/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-jettyloom.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/gradle:8.4-jdk21-alpine AS build +FROM docker.io/gradle:8.6-jdk21-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile index d07a610bcd8..ba9b55020b9 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-nettyepoll-pgclient.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/gradle:8.4-jdk21-alpine AS build +FROM docker.io/gradle:8.6-jdk21-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile b/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile index c813f85bf27..a7c28730e03 100644 --- a/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-nettyepoll.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/gradle:8.4-jdk21-alpine AS build +FROM docker.io/gradle:8.6-jdk21-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile index c28cb74d5d4..abd537c0dd3 100644 --- a/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon-tomcat.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/gradle:8.4-jdk21-alpine AS build +FROM docker.io/gradle:8.6-jdk21-alpine AS build USER root WORKDIR /hexagon diff --git a/frameworks/Kotlin/hexagon/hexagon.dockerfile b/frameworks/Kotlin/hexagon/hexagon.dockerfile index 7723b0cae2d..a8eec2e6809 100644 --- a/frameworks/Kotlin/hexagon/hexagon.dockerfile +++ b/frameworks/Kotlin/hexagon/hexagon.dockerfile @@ -1,7 +1,7 @@ # # BUILD # -FROM docker.io/gradle:8.4-jdk21-alpine AS build +FROM docker.io/gradle:8.6-jdk21-alpine AS build USER root WORKDIR /hexagon From c0d1546048b0dafba6d84e263957267a714cf498 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Mar 2024 20:06:06 +0000 Subject: [PATCH 197/210] Bump io.netty:netty-codec-http in /frameworks/Java/netty Bumps [io.netty:netty-codec-http](https://github.com/netty/netty) from 4.1.92.Final to 4.1.108.Final. - [Commits](https://github.com/netty/netty/compare/netty-4.1.92.Final...netty-4.1.108.Final) --- updated-dependencies: - dependency-name: io.netty:netty-codec-http dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Java/netty/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/netty/pom.xml b/frameworks/Java/netty/pom.xml index e11a42ffc60..3b1f26781de 100644 --- a/frameworks/Java/netty/pom.xml +++ b/frameworks/Java/netty/pom.xml @@ -11,7 +11,7 @@ 11 11 - 4.1.92.Final + 4.1.108.Final 0.0.21.Final From de1e356452ed019d7d84c56160402c0f662f777e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 25 Mar 2024 20:10:14 +0000 Subject: [PATCH 198/210] Bump rdoc from 6.6.2 to 6.6.3.1 in /frameworks/Ruby/rails Bumps [rdoc](https://github.com/ruby/rdoc) from 6.6.2 to 6.6.3.1. - [Release notes](https://github.com/ruby/rdoc/releases) - [Changelog](https://github.com/ruby/rdoc/blob/master/History.rdoc) - [Commits](https://github.com/ruby/rdoc/compare/v6.6.2...v6.6.3.1) --- updated-dependencies: - dependency-name: rdoc dependency-type: indirect ... Signed-off-by: dependabot[bot] --- frameworks/Ruby/rails/Gemfile.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Ruby/rails/Gemfile.lock b/frameworks/Ruby/rails/Gemfile.lock index db5f4e25cee..334455e2ac5 100644 --- a/frameworks/Ruby/rails/Gemfile.lock +++ b/frameworks/Ruby/rails/Gemfile.lock @@ -168,7 +168,7 @@ GEM thor (~> 1.0, >= 1.2.2) zeitwerk (~> 2.6) rake (13.1.0) - rdoc (6.6.2) + rdoc (6.6.3.1) psych (>= 4.0.0) redis (5.0.7) redis-client (>= 0.9.0) From e603c6c10b08200eb34c8d9d65fc309a3883b307 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Mar 2024 10:45:25 -0700 Subject: [PATCH 199/210] Bump black from 21.5b1 to 24.3.0 in /frameworks/Python/async-worker (#8822) Bumps [black](https://github.com/psf/black) from 21.5b1 to 24.3.0. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/commits/24.3.0) --- updated-dependencies: - dependency-name: black dependency-type: direct:development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- frameworks/Python/async-worker/Pipfile.lock | 81 +++++++++++++++++---- 1 file changed, 68 insertions(+), 13 deletions(-) diff --git a/frameworks/Python/async-worker/Pipfile.lock b/frameworks/Python/async-worker/Pipfile.lock index e1c3bbb5bbc..aaa9ae7968e 100644 --- a/frameworks/Python/async-worker/Pipfile.lock +++ b/frameworks/Python/async-worker/Pipfile.lock @@ -298,33 +298,72 @@ }, "black": { "hashes": [ - "sha256:23695358dbcb3deafe7f0a3ad89feee5999a46be5fec21f4f1d108be0bcdb3b1", - "sha256:8a60071a0043876a4ae96e6c69bd3a127dad2c1ca7c8083573eb82f92705d008" + "sha256:2818cf72dfd5d289e48f37ccfa08b460bf469e67fb7c4abb07edc2e9f16fb63f", + "sha256:41622020d7120e01d377f74249e677039d20e6344ff5851de8a10f11f513bf93", + "sha256:4acf672def7eb1725f41f38bf6bf425c8237248bb0804faa3965c036f7672d11", + "sha256:4be5bb28e090456adfc1255e03967fb67ca846a03be7aadf6249096100ee32d0", + "sha256:4f1373a7808a8f135b774039f61d59e4be7eb56b2513d3d2f02a8b9365b8a8a9", + "sha256:56f52cfbd3dabe2798d76dbdd299faa046a901041faf2cf33288bc4e6dae57b5", + "sha256:65b76c275e4c1c5ce6e9870911384bff5ca31ab63d19c76811cb1fb162678213", + "sha256:65c02e4ea2ae09d16314d30912a58ada9a5c4fdfedf9512d23326128ac08ac3d", + "sha256:6905238a754ceb7788a73f02b45637d820b2f5478b20fec82ea865e4f5d4d9f7", + "sha256:79dcf34b33e38ed1b17434693763301d7ccbd1c5860674a8f871bd15139e7837", + "sha256:7bb041dca0d784697af4646d3b62ba4a6b028276ae878e53f6b4f74ddd6db99f", + "sha256:7d5e026f8da0322b5662fa7a8e752b3fa2dac1c1cbc213c3d7ff9bdd0ab12395", + "sha256:9f50ea1132e2189d8dff0115ab75b65590a3e97de1e143795adb4ce317934995", + "sha256:a0c9c4a0771afc6919578cec71ce82a3e31e054904e7197deacbc9382671c41f", + "sha256:aadf7a02d947936ee418777e0247ea114f78aff0d0959461057cae8a04f20597", + "sha256:b5991d523eee14756f3c8d5df5231550ae8993e2286b8014e2fdea7156ed0959", + "sha256:bf21b7b230718a5f08bd32d5e4f1db7fc8788345c8aea1d155fc17852b3410f5", + "sha256:c45f8dff244b3c431b36e3224b6be4a127c6aca780853574c00faf99258041eb", + "sha256:c7ed6668cbbfcd231fa0dc1b137d3e40c04c7f786e626b405c62bcd5db5857e4", + "sha256:d7de8d330763c66663661a1ffd432274a2f92f07feeddd89ffd085b5744f85e7", + "sha256:e19cb1c6365fd6dc38a6eae2dcb691d7d83935c10215aef8e6c38edee3f77abd", + "sha256:e2af80566f43c85f5797365077fb64a393861a3730bd110971ab7a0c94e873e7" ], "index": "pypi", - "version": "==21.5b1" + "markers": "python_version >= '3.8'", + "version": "==24.3.0" }, "click": { "hashes": [ - "sha256:8c04c11192119b1ef78ea049e0a6f0463e4c48ef00a30160c704337586f3ad7a", - "sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6" + "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", + "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" ], - "markers": "python_version >= '3.6'", - "version": "==8.0.1" + "markers": "python_version >= '3.7'", + "version": "==8.1.7" }, "mypy-extensions": { "hashes": [ - "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d", - "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8" + "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", + "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782" + ], + "markers": "python_version >= '3.5'", + "version": "==1.0.0" + }, + "packaging": { + "hashes": [ + "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", + "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9" ], - "version": "==0.4.3" + "markers": "python_version >= '3.7'", + "version": "==24.0" }, "pathspec": { "hashes": [ - "sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd", - "sha256:aa0cb481c4041bf52ffa7b0d8fa6cd3e88a2ca4879c533c9153882ee2556790d" + "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", + "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712" + ], + "markers": "python_version >= '3.8'", + "version": "==0.12.1" + }, + "platformdirs": { + "hashes": [ + "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068", + "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768" ], - "version": "==0.8.1" + "markers": "python_version >= '3.8'", + "version": "==4.2.0" }, "regex": { "hashes": [ @@ -379,6 +418,22 @@ ], "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==0.10.2" + }, + "tomli": { + "hashes": [ + "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", + "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" + ], + "markers": "python_version < '3.11'", + "version": "==2.0.1" + }, + "typing-extensions": { + "hashes": [ + "sha256:6f1117ac0cbe64536f34520c4688cd144794f9b1d79690bfe0389aa12a347976", + "sha256:7427ef26efa5e4e465e3765af0e52d3897e3684c908efe20e3331e1ce51884b3" + ], + "markers": "python_version < '3.11'", + "version": "==4.11.0rc1" } } } From 30ab632b759e91139a877be662d148bb1aa4d46a Mon Sep 17 00:00:00 2001 From: Mark Reed <5108907+MarkReedZ@users.noreply.github.com> Date: Thu, 28 Mar 2024 16:24:12 -0400 Subject: [PATCH 200/210] Add mrhttp (#8819) * Add mrhttp * Trigger action --------- Co-authored-by: Mark Reed --- frameworks/Python/mrhttp/README.md | 20 ++++++++++++++++ frameworks/Python/mrhttp/app.py | 18 +++++++++++++++ .../Python/mrhttp/benchmark_config.json | 23 +++++++++++++++++++ frameworks/Python/mrhttp/config.toml | 15 ++++++++++++ frameworks/Python/mrhttp/mrhttp.dockerfile | 13 +++++++++++ frameworks/Python/mrhttp/requirements.txt | 6 +++++ 6 files changed, 95 insertions(+) create mode 100644 frameworks/Python/mrhttp/README.md create mode 100644 frameworks/Python/mrhttp/app.py create mode 100644 frameworks/Python/mrhttp/benchmark_config.json create mode 100644 frameworks/Python/mrhttp/config.toml create mode 100644 frameworks/Python/mrhttp/mrhttp.dockerfile create mode 100644 frameworks/Python/mrhttp/requirements.txt diff --git a/frameworks/Python/mrhttp/README.md b/frameworks/Python/mrhttp/README.md new file mode 100644 index 00000000000..ab294b9a94c --- /dev/null +++ b/frameworks/Python/mrhttp/README.md @@ -0,0 +1,20 @@ +# MrHTTP Benchmark Test + +This is the MrHTTP portion of a [benchmarking tests suite](../../) +comparing a variety of web development platforms. + +The information below is specific to MrHTTP. For further guidance, +review the [documentation](https://github.com/TechEmpower/FrameworkBenchmarks/wiki). +Also note that there is additional information provided in +the [Python README](../). + +## Description + +[MrHTTP](https://github.com/MarkReedZ/mrhttp) is an asynchronous web framework for python 3.5+ written in C that has hit 8.5 million requests per second. + +## Test Paths & Sources + +All of the test implementations are located within a single file ([app.py](app.py)). + +* [JSON Serialization](app.py): "/json" +* [Plaintext](app.py): "/plaintext" diff --git a/frameworks/Python/mrhttp/app.py b/frameworks/Python/mrhttp/app.py new file mode 100644 index 00000000000..2e91f309f25 --- /dev/null +++ b/frameworks/Python/mrhttp/app.py @@ -0,0 +1,18 @@ + +import multiprocessing +import mrhttp +import mrjson as json + +app = mrhttp.Application() + +@app.route('/json', _type="json") +def j(r): + return json.dumps({'message': 'Hello, world!'}) + +@app.route('/plaintext', _type="text", options=['cache']) +def p(r): + return "Hello, world!" + + +app.run('0.0.0.0', 8080, cores=multiprocessing.cpu_count()) + diff --git a/frameworks/Python/mrhttp/benchmark_config.json b/frameworks/Python/mrhttp/benchmark_config.json new file mode 100644 index 00000000000..8303a252e1f --- /dev/null +++ b/frameworks/Python/mrhttp/benchmark_config.json @@ -0,0 +1,23 @@ +{ + "framework": "mrhttp", + "tests": [{ + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Micro", + "framework": "mrhttp", + "language": "Python", + "flavor": "Python3", + "platform": "None", + "webserver": "None", + "os": "Linux", + "orm": "Raw", + "database_os": "Linux", + "database": "None", + "display_name": "MrHTTP", + "notes": "" + } + }] +} diff --git a/frameworks/Python/mrhttp/config.toml b/frameworks/Python/mrhttp/config.toml new file mode 100644 index 00000000000..f9c36bcfa78 --- /dev/null +++ b/frameworks/Python/mrhttp/config.toml @@ -0,0 +1,15 @@ +[framework] +name = "mrhttp" + +[main] +urls.plaintext = "/plaintext" +urls.json = "/json" +approach = "Realistic" +classification = "Micro" +database = "None" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "None" +webserver = "None" +versus = "None" diff --git a/frameworks/Python/mrhttp/mrhttp.dockerfile b/frameworks/Python/mrhttp/mrhttp.dockerfile new file mode 100644 index 00000000000..a8cb1e5b201 --- /dev/null +++ b/frameworks/Python/mrhttp/mrhttp.dockerfile @@ -0,0 +1,13 @@ + +FROM python:3.8.12 + +ADD ./ /mrhttp + +WORKDIR /mrhttp + +RUN pip3 install -r /mrhttp/requirements.txt + +EXPOSE 8080 + +CMD python3 app.py + diff --git a/frameworks/Python/mrhttp/requirements.txt b/frameworks/Python/mrhttp/requirements.txt new file mode 100644 index 00000000000..047961f9463 --- /dev/null +++ b/frameworks/Python/mrhttp/requirements.txt @@ -0,0 +1,6 @@ +asyncpg==0.25.0 +mrjson==1.4 +ujson==5.4.0 +mrpacker==1.5 +mrhttp==0.12 +uvloop==0.19.0 From a56bc7e1219c94d79ef2667927de40c91fad0002 Mon Sep 17 00:00:00 2001 From: Gabriel Cursino Date: Thu, 28 Mar 2024 17:25:37 -0300 Subject: [PATCH 201/210] [JavaScript] Add Mesh (#8816) * [JavaScript] Add Mesh * chore: use mongodb@3 * fix: headers --- frameworks/JavaScript/mesh/README.md | 48 +++ frameworks/JavaScript/mesh/app.js | 18 + .../JavaScript/mesh/benchmark_config.json | 92 +++++ frameworks/JavaScript/mesh/drivers/mongodb.js | 16 + frameworks/JavaScript/mesh/drivers/mysql.js | 24 ++ .../JavaScript/mesh/drivers/postgres.js | 20 + .../JavaScript/mesh/mesh-mongodb.dockerfile | 12 + .../JavaScript/mesh/mesh-mysql.dockerfile | 12 + .../JavaScript/mesh/mesh-postgres.dockerfile | 12 + frameworks/JavaScript/mesh/mesh.dockerfile | 11 + frameworks/JavaScript/mesh/package-lock.json | 369 ++++++++++++++++++ frameworks/JavaScript/mesh/package.json | 13 + frameworks/JavaScript/mesh/server.js | 104 +++++ 13 files changed, 751 insertions(+) create mode 100644 frameworks/JavaScript/mesh/README.md create mode 100644 frameworks/JavaScript/mesh/app.js create mode 100644 frameworks/JavaScript/mesh/benchmark_config.json create mode 100644 frameworks/JavaScript/mesh/drivers/mongodb.js create mode 100644 frameworks/JavaScript/mesh/drivers/mysql.js create mode 100644 frameworks/JavaScript/mesh/drivers/postgres.js create mode 100644 frameworks/JavaScript/mesh/mesh-mongodb.dockerfile create mode 100644 frameworks/JavaScript/mesh/mesh-mysql.dockerfile create mode 100644 frameworks/JavaScript/mesh/mesh-postgres.dockerfile create mode 100644 frameworks/JavaScript/mesh/mesh.dockerfile create mode 100644 frameworks/JavaScript/mesh/package-lock.json create mode 100644 frameworks/JavaScript/mesh/package.json create mode 100644 frameworks/JavaScript/mesh/server.js diff --git a/frameworks/JavaScript/mesh/README.md b/frameworks/JavaScript/mesh/README.md new file mode 100644 index 00000000000..cf161c498e7 --- /dev/null +++ b/frameworks/JavaScript/mesh/README.md @@ -0,0 +1,48 @@ +# Mesh Benchmarking Test + +This is the [`Mesh`](https://github.com/ionited/mesh) portion of a [benchmarking test suite](../) comparing a variety of web development platforms. + +Information about Mesh can be found at https://github.com/ionited/mesh + +## Database Drivers + +There are individual handlers for each DB approach. The logic for each of them are found here: + +* [MySQL](drivers/mysql.js) +* [MongoDB](drivers/mongodb.js) +* [PostgreSQL](drivers/postgres.js) + +There are **no database endpoints** or drivers attached by default.
+To initialize the application with one of these, run any _one_ of the following commands: + +```sh +$ DATABASE=mysql node app.js +$ DATABASE=mongodb node app.js +$ DATABASE=postgres node app.js +``` + +## Test Endpoints + +> Visit the test requirements [here](https://github.com/TechEmpower/FrameworkBenchmarks/wiki/Project-Information-Framework-Tests-Overview) + +```sh +$ curl localhost:8080/json +$ curl localhost:8080/plaintext + +# The following are only available w/ DATABASE + +$ curl localhost:8080/db +$ curl localhost:8080/fortunes + +$ curl localhost:8080/updates?queries= +$ curl localhost:8080/updates?queries=2 +$ curl localhost:8080/updates?queries=1000 +$ curl localhost:8080/updates?queries=foo +$ curl localhost:8080/updates?queries=0 + +$ curl localhost:8080/queries?queries= +$ curl localhost:8080/queries?queries=2 +$ curl localhost:8080/queries?queries=1000 +$ curl localhost:8080/queries?queries=foo +$ curl localhost:8080/queries?queries=0 +``` diff --git a/frameworks/JavaScript/mesh/app.js b/frameworks/JavaScript/mesh/app.js new file mode 100644 index 00000000000..20d9145ebab --- /dev/null +++ b/frameworks/JavaScript/mesh/app.js @@ -0,0 +1,18 @@ +const cluster = require("cluster"); +const numCPUs = require("os").cpus().length; + +if (cluster.isPrimary) { + console.log(`Primary ${process.pid} is running`); + + // Fork workers. + for (let i = 0; i < numCPUs; i++) { + cluster.fork(); + } + + cluster.on('exit', (worker, code, signal) => { + console.log(`worker ${worker.process.pid} died`); + }); +} else { + // worker task + require("./server"); +} diff --git a/frameworks/JavaScript/mesh/benchmark_config.json b/frameworks/JavaScript/mesh/benchmark_config.json new file mode 100644 index 00000000000..bf91e85e86f --- /dev/null +++ b/frameworks/JavaScript/mesh/benchmark_config.json @@ -0,0 +1,92 @@ +{ + "framework": "mesh", + "tests": [ + { + "default": { + "json_url": "/json", + "plaintext_url": "/plaintext", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "None", + "framework": "mesh", + "language": "JavaScript", + "flavor": "NodeJS", + "orm": "Raw", + "platform": "nodejs", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "Mesh", + "notes": "", + "versus": "nodejs" + }, + "mysql": { + "dockerfile": "mesh-mysql.dockerfile", + "db_url": "/db", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "update_url": "/updates?queries=", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "MySQL", + "framework": "mesh", + "language": "JavaScript", + "flavor": "NodeJS", + "orm": "Raw", + "platform": "nodejs", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "Mesh", + "notes": "", + "versus": "nodejs" + }, + "postgres": { + "dockerfile": "mesh-postgres.dockerfile", + "db_url": "/db", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "update_url": "/updates?queries=", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "Postgres", + "framework": "mesh", + "language": "JavaScript", + "flavor": "NodeJS", + "orm": "Raw", + "platform": "None", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "Mesh", + "notes": "", + "versus": "nodejs" + }, + "mongodb": { + "dockerfile": "mesh-mongodb.dockerfile", + "db_url": "/db", + "query_url": "/queries?queries=", + "fortune_url": "/fortunes", + "update_url": "/updates?queries=", + "port": 8080, + "approach": "Realistic", + "classification": "Platform", + "database": "MongoDB", + "framework": "mesh", + "language": "JavaScript", + "flavor": "NodeJS", + "orm": "Raw", + "platform": "None", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "Mesh", + "notes": "", + "versus": "nodejs" + } + } + ] +} diff --git a/frameworks/JavaScript/mesh/drivers/mongodb.js b/frameworks/JavaScript/mesh/drivers/mongodb.js new file mode 100644 index 00000000000..6d12fabc90e --- /dev/null +++ b/frameworks/JavaScript/mesh/drivers/mongodb.js @@ -0,0 +1,16 @@ +const { MongoClient } = require('mongodb'); + +let World, Fortune; +const projection = { _id:0 }; + +MongoClient.connect('mongodb://tfb-database:27017', { useNewUrlParser:true }, (err, ctx) => { + const DB = ctx.db('hello_world'); + Fortune = DB.collection('fortune'); + World = DB.collection('world'); +}); + +exports.fortunes = () => Fortune.find({}, { projection }).toArray(); + +exports.find = id => World.findOne({ id }, { projection }); + +exports.update = obj => World.replaceOne({ id:obj.id }, obj); diff --git a/frameworks/JavaScript/mesh/drivers/mysql.js b/frameworks/JavaScript/mesh/drivers/mysql.js new file mode 100644 index 00000000000..24ce23bf247 --- /dev/null +++ b/frameworks/JavaScript/mesh/drivers/mysql.js @@ -0,0 +1,24 @@ +const { createConnection } = require('mysql'); + +const connection = createConnection({ + host: 'tfb-database', + user: 'benchmarkdbuser', + password: 'benchmarkdbpass', + database: 'hello_world' +}); + +connection.connect(); + +function query(text, values) { + return new Promise((res, rej) => { + connection.query(text, values || [], (err, results) => { + return err ? rej(err) : res(results); + }); + }); +} + +exports.fortunes = () => query('SELECT * FROM fortune'); + +exports.find = id => query('SELECT * FROM world WHERE id = ?', [id]).then(arr => arr[0]); + +exports.update = obj => query('UPDATE world SET randomNumber = ? WHERE id = ?', [obj.randomNumber, obj.id]); diff --git a/frameworks/JavaScript/mesh/drivers/postgres.js b/frameworks/JavaScript/mesh/drivers/postgres.js new file mode 100644 index 00000000000..2c8388823a6 --- /dev/null +++ b/frameworks/JavaScript/mesh/drivers/postgres.js @@ -0,0 +1,20 @@ +const { Client } = require('pg'); + +const client = new Client({ + host: 'tfb-database', + user: 'benchmarkdbuser', + password: 'benchmarkdbpass', + database: 'hello_world' +}); + +client.connect(); + +function query(text, values) { + return client.query(text, values || []).then(r => r.rows); +} + +exports.fortunes = () => query('SELECT * FROM fortune'); + +exports.find = id => query('SELECT * FROM world WHERE id = $1', [id]).then(arr => arr[0]); + +exports.update = obj => query('UPDATE world SET randomNumber = $1 WHERE id = $2', [obj.randomNumber, obj.id]); diff --git a/frameworks/JavaScript/mesh/mesh-mongodb.dockerfile b/frameworks/JavaScript/mesh/mesh-mongodb.dockerfile new file mode 100644 index 00000000000..ed44c5dce07 --- /dev/null +++ b/frameworks/JavaScript/mesh/mesh-mongodb.dockerfile @@ -0,0 +1,12 @@ +FROM node:20-slim + +COPY ./ ./ + +RUN npm install + +ENV NODE_ENV production +ENV DATABASE mongodb + +EXPOSE 8080 + +CMD ["node", "app.js"] diff --git a/frameworks/JavaScript/mesh/mesh-mysql.dockerfile b/frameworks/JavaScript/mesh/mesh-mysql.dockerfile new file mode 100644 index 00000000000..4eb47cce4aa --- /dev/null +++ b/frameworks/JavaScript/mesh/mesh-mysql.dockerfile @@ -0,0 +1,12 @@ +FROM node:20-slim + +COPY ./ ./ + +RUN npm install + +ENV NODE_ENV production +ENV DATABASE mysql + +EXPOSE 8080 + +CMD ["node", "app.js"] diff --git a/frameworks/JavaScript/mesh/mesh-postgres.dockerfile b/frameworks/JavaScript/mesh/mesh-postgres.dockerfile new file mode 100644 index 00000000000..4b948d766d3 --- /dev/null +++ b/frameworks/JavaScript/mesh/mesh-postgres.dockerfile @@ -0,0 +1,12 @@ +FROM node:20-slim + +COPY ./ ./ + +RUN npm install + +ENV NODE_ENV production +ENV DATABASE postgres + +EXPOSE 8080 + +CMD ["node", "app.js"] diff --git a/frameworks/JavaScript/mesh/mesh.dockerfile b/frameworks/JavaScript/mesh/mesh.dockerfile new file mode 100644 index 00000000000..e479cd4a1e2 --- /dev/null +++ b/frameworks/JavaScript/mesh/mesh.dockerfile @@ -0,0 +1,11 @@ +FROM node:20-slim + +COPY ./ ./ + +RUN npm install + +ENV NODE_ENV production + +EXPOSE 8080 + +CMD ["node", "app.js"] diff --git a/frameworks/JavaScript/mesh/package-lock.json b/frameworks/JavaScript/mesh/package-lock.json new file mode 100644 index 00000000000..a4aa12eb197 --- /dev/null +++ b/frameworks/JavaScript/mesh/package-lock.json @@ -0,0 +1,369 @@ +{ + "name": "mesh", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "mesh", + "version": "0.0.1", + "dependencies": { + "@ionited/mesh": "^0.6.0", + "mongodb": "^3.7.4", + "mysql": "^2.18.1", + "pg": "^8.11.3" + } + }, + "node_modules/@ionited/mesh": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@ionited/mesh/-/mesh-0.6.0.tgz", + "integrity": "sha512-SnRY0JML4Sa7WZ3J6hFibti/euRONuagTOE0QnEbwsMTzPFzVDl1fdQTO4NZKcDPVyBC74XdEUTw9+AEz+ZFlA==", + "dependencies": { + "uWebSockets.js": "github:uNetworking/uWebSockets.js#v20.43.0" + } + }, + "node_modules/bignumber.js": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", + "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==", + "engines": { + "node": "*" + } + }, + "node_modules/bl": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz", + "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==", + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/bson": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz", + "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg==", + "engines": { + "node": ">=0.6.19" + } + }, + "node_modules/buffer-writer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz", + "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/denque": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz", + "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/memory-pager": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", + "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", + "optional": true + }, + "node_modules/mongodb": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.4.tgz", + "integrity": "sha512-K5q8aBqEXMwWdVNh94UQTwZ6BejVbFhh1uB6c5FKtPE9eUMZPUO3sRZdgIEcHSrAWmxzpG/FeODDKL388sqRmw==", + "dependencies": { + "bl": "^2.2.1", + "bson": "^1.1.4", + "denque": "^1.4.1", + "optional-require": "^1.1.8", + "safe-buffer": "^5.1.2" + }, + "engines": { + "node": ">=4" + }, + "optionalDependencies": { + "saslprep": "^1.0.0" + }, + "peerDependenciesMeta": { + "aws4": { + "optional": true + }, + "bson-ext": { + "optional": true + }, + "kerberos": { + "optional": true + }, + "mongodb-client-encryption": { + "optional": true + }, + "mongodb-extjson": { + "optional": true + }, + "snappy": { + "optional": true + } + } + }, + "node_modules/mysql": { + "version": "2.18.1", + "resolved": "https://registry.npmjs.org/mysql/-/mysql-2.18.1.tgz", + "integrity": "sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==", + "dependencies": { + "bignumber.js": "9.0.0", + "readable-stream": "2.3.7", + "safe-buffer": "5.1.2", + "sqlstring": "2.3.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mysql/node_modules/sqlstring": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.1.tgz", + "integrity": "sha512-ooAzh/7dxIG5+uDik1z/Rd1vli0+38izZhGzSa34FwR7IbelPWCCKSNIl8jlL/F7ERvy8CB2jNeM1E9i9mXMAQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/optional-require": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz", + "integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==", + "dependencies": { + "require-at": "^1.0.6" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/packet-reader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz", + "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==" + }, + "node_modules/pg": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/pg/-/pg-8.11.3.tgz", + "integrity": "sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==", + "dependencies": { + "buffer-writer": "2.0.0", + "packet-reader": "1.0.0", + "pg-connection-string": "^2.6.2", + "pg-pool": "^3.6.1", + "pg-protocol": "^1.6.0", + "pg-types": "^2.1.0", + "pgpass": "1.x" + }, + "engines": { + "node": ">= 8.0.0" + }, + "optionalDependencies": { + "pg-cloudflare": "^1.1.1" + }, + "peerDependencies": { + "pg-native": ">=3.0.1" + }, + "peerDependenciesMeta": { + "pg-native": { + "optional": true + } + } + }, + "node_modules/pg-cloudflare": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.1.1.tgz", + "integrity": "sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==", + "optional": true + }, + "node_modules/pg-connection-string": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz", + "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==" + }, + "node_modules/pg-int8": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", + "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/pg-pool": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.1.tgz", + "integrity": "sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==", + "peerDependencies": { + "pg": ">=8.0" + } + }, + "node_modules/pg-protocol": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz", + "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==" + }, + "node_modules/pg-types": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", + "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", + "dependencies": { + "pg-int8": "1.0.1", + "postgres-array": "~2.0.0", + "postgres-bytea": "~1.0.0", + "postgres-date": "~1.0.4", + "postgres-interval": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/pgpass": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", + "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", + "dependencies": { + "split2": "^4.1.0" + } + }, + "node_modules/postgres-array": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", + "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/postgres-bytea": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", + "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-date": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", + "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postgres-interval": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", + "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", + "dependencies": { + "xtend": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/require-at": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz", + "integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/saslprep": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", + "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", + "optional": true, + "dependencies": { + "sparse-bitfield": "^3.0.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sparse-bitfield": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", + "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", + "optional": true, + "dependencies": { + "memory-pager": "^1.0.2" + } + }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/uWebSockets.js": { + "version": "20.43.0", + "resolved": "git+ssh://git@github.com/uNetworking/uWebSockets.js.git#1977b5039938ad863d42fc4958d48c17e5a1fa06", + "license": "Apache-2.0" + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + } + } +} diff --git a/frameworks/JavaScript/mesh/package.json b/frameworks/JavaScript/mesh/package.json new file mode 100644 index 00000000000..2f65506f61e --- /dev/null +++ b/frameworks/JavaScript/mesh/package.json @@ -0,0 +1,13 @@ +{ + "name": "mesh", + "version": "0.0.1", + "description": "Mesh tests for TechEmpower Framework Benchmarks.", + "main": "app.js", + "private": true, + "dependencies": { + "@ionited/mesh": "^0.6.0", + "mongodb": "^3.7.4", + "mysql": "^2.18.1", + "pg": "^8.11.3" + } +} diff --git a/frameworks/JavaScript/mesh/server.js b/frameworks/JavaScript/mesh/server.js new file mode 100644 index 00000000000..a606c8abed3 --- /dev/null +++ b/frameworks/JavaScript/mesh/server.js @@ -0,0 +1,104 @@ +const db = process.env.DATABASE; + +const { App } = require('@ionited/mesh'); + +const addHeaders = (res, contentType) => res.header('Content-Type', contentType).header('Server', 'Mesh'); + +const escapeHTMLRules = { + "&": "&", + "<": "<", + ">": ">", + '"': """, + "'": "'", + "/": "/", +}; + +const unsafeHTMLMatcher = /[&<>"'\/]/g; + +const escape = text => { + if (unsafeHTMLMatcher.test(text) === false) return text; + return text.replace(unsafeHTMLMatcher, m => escapeHTMLRules[m] || m); +} + +const random = () => Math.floor(Math.random() * 1e4) + 1; + +const app = new App(); + +app + +.get('/json', (_, res) => { + addHeaders(res, 'application/json'); + + res.json({ message: 'Hello, World!' }); +}) + +.get('/plaintext', (_, res) => { + addHeaders(res, 'text/plain'); + + res.send('Hello, World!'); +}); + +if (db) { + const DRIVER = require(`./drivers/${db}`); + + app + + .get('/db', async (_, res) => { + addHeaders(res, 'application/json'); + + res.json(await DRIVER.find(random())); + }) + + .get('/queries', async (req, res) => { + const { queries } = req.query(); + + const count = Math.min(parseInt(queries) || 1, 500); + + const arr = []; + + for (let i = 0; i < count; i++) arr.push(await DRIVER.find(random())); + + addHeaders(res, 'application/json'); + + res.json(arr); + }) + + .get('/fortunes', async (_, res) => { + const items = [{ + id: 0, + message: 'Additional fortune added at request time.' + }, ...await DRIVER.fortunes()].sort((a, b) => a.message.localeCompare(b.message)); + + let html = 'Fortunes'; + + for (let i = 0; i < items.length; i++) html += ``; + + html += '
idmessage
${items[i].id}${escape(items[i].message)}
'; + + addHeaders(res, 'text/html; charset=utf-8'); + + res.send(html); + }) + + .get('/updates', async (req, res) => { + const { queries } = req.query(); + + const count = Math.min(parseInt(queries) || 1, 500); + + const arr = []; + + for (let i = 0; i < count; i++) arr.push(await DRIVER.find(random())); + + for (let i = 0; i < count; i++) { + arr[i].randomNumber = random(); + + await DRIVER.update(arr[i]); + } + + addHeaders(res, 'application/json'); + + res.json(arr); + }); +} + +app.listen(8080); From c47af754b20d05c227964dfeb09d179916f20397 Mon Sep 17 00:00:00 2001 From: kanarus Date: Fri, 29 Mar 2024 05:27:25 +0900 Subject: [PATCH 202/210] Updated ohkami benchmark implementation with ohkami v0.15 (#8763) --- frameworks/Rust/ohkami/.gitignore | 2 +- frameworks/Rust/ohkami/Cargo.lock | 1748 +++++++++--------- frameworks/Rust/ohkami/Cargo.toml | 16 +- frameworks/Rust/ohkami/README.md | 44 +- frameworks/Rust/ohkami/benchmark_config.json | 36 +- frameworks/Rust/ohkami/config.toml | 19 + frameworks/Rust/ohkami/ohkami.dockerfile | 24 +- frameworks/Rust/ohkami/src/components.rs | 60 - frameworks/Rust/ohkami/src/main.rs | 147 +- frameworks/Rust/ohkami/src/models.rs | 36 + frameworks/Rust/ohkami/src/postgres.rs | 102 + frameworks/Rust/ohkami/src/templates.rs | 18 + 12 files changed, 1184 insertions(+), 1068 deletions(-) create mode 100644 frameworks/Rust/ohkami/config.toml delete mode 100644 frameworks/Rust/ohkami/src/components.rs create mode 100644 frameworks/Rust/ohkami/src/models.rs create mode 100644 frameworks/Rust/ohkami/src/postgres.rs create mode 100644 frameworks/Rust/ohkami/src/templates.rs diff --git a/frameworks/Rust/ohkami/.gitignore b/frameworks/Rust/ohkami/.gitignore index c41cc9e35e3..ea8c4bf7f35 100644 --- a/frameworks/Rust/ohkami/.gitignore +++ b/frameworks/Rust/ohkami/.gitignore @@ -1 +1 @@ -/target \ No newline at end of file +/target diff --git a/frameworks/Rust/ohkami/Cargo.lock b/frameworks/Rust/ohkami/Cargo.lock index 5b1aeabfc54..905a89d8a8e 100644 --- a/frameworks/Rust/ohkami/Cargo.lock +++ b/frameworks/Rust/ohkami/Cargo.lock @@ -2,204 +2,110 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + [[package]] name = "ahash" -version = "0.7.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +checksum = "42cd52102d3df161c77a887b608d7a4897d7cc112886a9537b738a887a03aaff" dependencies = [ + "cfg-if", "getrandom", "once_cell", "version_check", + "zerocopy", ] [[package]] name = "aho-corasick" -version = "0.7.20" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" dependencies = [ "memchr", ] [[package]] -name = "android_system_properties" -version = "0.1.5" +name = "allocator-api2" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] +checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" [[package]] name = "annotate-snippets" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3b9d411ecbaf79885c6df4d75fff75858d5995ff25385657a28af47e82f9c36" +checksum = "ccaf7e9dfbb6ab22c82e473cd1a8a7bd313c19a5b7e40970f3d89ef5a5c9e81e" dependencies = [ "unicode-width", "yansi-term", ] [[package]] -name = "async-channel" -version = "1.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf46fee83e5ccffc220104713af3292ff9bc7c64c7de289f66dae8e38d826833" -dependencies = [ - "concurrent-queue", - "event-listener", - "futures-core", -] - -[[package]] -name = "async-executor" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17adb73da160dfb475c183343c8cccd80721ea5a605d3eb57125f0a7b7a92d0b" -dependencies = [ - "async-lock", - "async-task", - "concurrent-queue", - "fastrand", - "futures-lite", - "slab", -] - -[[package]] -name = "async-global-executor" -version = "2.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1b6f5d7df27bd294849f8eec66ecfc63d11814df7a4f5d74168a2394467b776" -dependencies = [ - "async-channel", - "async-executor", - "async-io", - "async-lock", - "blocking", - "futures-lite", - "once_cell", -] - -[[package]] -name = "async-io" -version = "1.12.0" +name = "atoi" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c374dda1ed3e7d8f0d9ba58715f924862c63eae6849c92d3a18e7fbde9e2794" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" dependencies = [ - "async-lock", - "autocfg", - "concurrent-queue", - "futures-lite", - "libc", - "log", - "parking", - "polling", - "slab", - "socket2", - "waker-fn", - "windows-sys 0.42.0", + "num-traits", ] [[package]] -name = "async-lock" -version = "2.6.0" +name = "atomic-write-file" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8101efe8695a6c17e02911402145357e718ac92d3ff88ae8419e84b1707b685" +checksum = "edcdbedc2236483ab103a53415653d6b4442ea6141baf1ffa85df29635e88436" dependencies = [ - "event-listener", - "futures-lite", + "nix", + "rand", ] [[package]] -name = "async-native-tls" -version = "0.4.0" +name = "autocfg" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d57d4cec3c647232e1094dc013546c0b33ce785d8aeb251e1f20dfaf8a9a13fe" -dependencies = [ - "futures-util", - "native-tls", - "thiserror", - "url", -] +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] -name = "async-process" -version = "1.6.0" +name = "backtrace" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6381ead98388605d0d9ff86371043b5aa922a3905824244de40dc263a14fcba4" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" dependencies = [ - "async-io", - "async-lock", - "autocfg", - "blocking", + "addr2line", + "cc", "cfg-if", - "event-listener", - "futures-lite", "libc", - "signal-hook", - "windows-sys 0.42.0", + "miniz_oxide", + "object", + "rustc-demangle", ] [[package]] -name = "async-std" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d" -dependencies = [ - "async-channel", - "async-global-executor", - "async-io", - "async-lock", - "async-process", - "crossbeam-utils", - "futures-channel", - "futures-core", - "futures-io", - "futures-lite", - "gloo-timers", - "kv-log-macro", - "log", - "memchr", - "once_cell", - "pin-project-lite", - "pin-utils", - "slab", - "wasm-bindgen-futures", -] - -[[package]] -name = "async-task" -version = "4.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a40729d2133846d9ed0ea60a8b9541bccddab49cd30f0715a1da672fe9a2524" - -[[package]] -name = "atoi" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c57d12312ff59c811c0643f4d80830505833c9ffaebd193d819392b265be8e" -dependencies = [ - "num-traits", -] - -[[package]] -name = "atomic-waker" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "065374052e7df7ee4047b1160cca5e1467a12351a40b3da123c870ba0b8eda2a" - -[[package]] -name = "autocfg" -version = "1.1.0" +name = "base64" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] -name = "base64" -version = "0.13.1" +name = "base64ct" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "bitflags" @@ -209,56 +115,48 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" - -[[package]] -name = "block-buffer" -version = "0.10.3" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cce20737498f97b993470a6e536b8523f0af7892a4f928cceb1ac5e52ebe7e" +checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" dependencies = [ - "generic-array", + "serde", ] [[package]] -name = "blocking" -version = "1.3.0" +name = "block-buffer" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c67b173a56acffd6d2326fb7ab938ba0b00a71480e14902b2591c87bc5741e8" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ - "async-channel", - "async-lock", - "async-task", - "atomic-waker", - "fastrand", - "futures-lite", + "generic-array", ] [[package]] -name = "bumpalo" -version = "3.11.1" +name = "byte_reader" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba" +checksum = "087a18fc062e9ae6d8c0fc7d9afc22e373f3eda1244379eefabff7e2b2cad206" [[package]] name = "byteorder" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.3.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfb24e866b15a1af2a1b663f10c6b6b8f397a84aadb828f12e5b289ec23a3a3c" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "cc" -version = "1.0.78" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a20104e2335ce8a659d6dd92a51a767a0c062599c73b343fd152cb401e828c3d" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +dependencies = [ + "libc", +] [[package]] name = "cfg-if" @@ -267,38 +165,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] -name = "chrono" -version = "0.4.23" +name = "const-oid" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b0a3d9ed01224b22057780a37bb8c5dbfe1be8ba48678e7bf57ec4b385411f" -dependencies = [ - "iana-time-zone", - "js-sys", - "num-integer", - "num-traits", - "time", - "wasm-bindgen", - "winapi", -] - -[[package]] -name = "codespan-reporting" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" -dependencies = [ - "termcolor", - "unicode-width", -] - -[[package]] -name = "concurrent-queue" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd7bef69dc86e3c610e4e7aed41035e2a7ed12e72dd7530f61327a6579a4390b" -dependencies = [ - "crossbeam-utils", -] +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "convert_case" @@ -308,9 +178,9 @@ checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" [[package]] name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ "core-foundation-sys", "libc", @@ -318,52 +188,48 @@ dependencies = [ [[package]] name = "core-foundation-sys" -version = "0.8.3" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "cpufeatures" -version = "0.2.5" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28d997bd5e24a5928dd43e46dc529867e207907fe0b239c3477d924f7f2ca320" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] [[package]] name = "crc" -version = "3.0.0" +version = "3.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53757d12b596c16c78b83458d732a5d1a17ab3f53f2f7412f6fb57cc8a140ab3" +checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe" dependencies = [ "crc-catalog", ] [[package]] name = "crc-catalog" -version = "2.1.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d0165d2900ae6778e36e80bbc4da3b5eefccee9ba939761f9c2882a5d9af3ff" +checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" [[package]] name = "crossbeam-queue" -version = "0.3.8" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-utils" -version = "0.8.14" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" -dependencies = [ - "cfg-if", -] +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" [[package]] name = "crypto-common" @@ -376,57 +242,14 @@ dependencies = [ ] [[package]] -name = "ctor" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" -dependencies = [ - "quote", - "syn", -] - -[[package]] -name = "cxx" -version = "1.0.85" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5add3fc1717409d029b20c5b6903fc0c0b02fa6741d820054f4a2efa5e5816fd" -dependencies = [ - "cc", - "cxxbridge-flags", - "cxxbridge-macro", - "link-cplusplus", -] - -[[package]] -name = "cxx-build" -version = "1.0.85" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c87959ba14bc6fbc61df77c3fcfe180fc32b93538c4f1031dd802ccb5f2ff0" -dependencies = [ - "cc", - "codespan-reporting", - "once_cell", - "proc-macro2", - "quote", - "scratch", - "syn", -] - -[[package]] -name = "cxxbridge-flags" -version = "1.0.85" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69a3e162fde4e594ed2b07d0f83c6c67b745e7f28ce58c6df5e6b6bef99dfb59" - -[[package]] -name = "cxxbridge-macro" -version = "1.0.85" +name = "der" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e7e2adeb6a0d4a282e581096b06e1791532b7d576dcde5ccd9382acf55db8e6" +checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" dependencies = [ - "proc-macro2", - "quote", - "syn", + "const-oid", + "pem-rfc7468", + "zeroize", ] [[package]] @@ -439,57 +262,68 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn", + "syn 1.0.109", ] [[package]] name = "digest" -version = "0.10.6" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer", + "const-oid", "crypto-common", "subtle", ] [[package]] -name = "dirs" -version = "4.0.0" +name = "dotenvy" +version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" -dependencies = [ - "dirs-sys", -] +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" [[package]] -name = "dirs-sys" -version = "0.3.7" +name = "dtoa" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" + +[[package]] +name = "either" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" dependencies = [ - "libc", - "redox_users", - "winapi", + "serde", ] [[package]] -name = "dotenvy" -version = "0.15.6" +name = "equivalent" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03d8c417d7a8cb362e0c37e5d815f5eb7c37f79ff93707329d5a194e42e54ca0" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] -name = "dtoa" -version = "1.0.5" +name = "errno" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c00704156a7de8df8da0911424e30c2049957b0a714542a44e05fe693dd85313" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] [[package]] -name = "either" -version = "1.8.0" +name = "etcetera" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797" +checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" +dependencies = [ + "cfg-if", + "home", + "windows-sys 0.48.0", +] [[package]] name = "event-listener" @@ -499,11 +333,25 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "fastrand" -version = "1.8.0" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" + +[[package]] +name = "finl_unicode" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" + +[[package]] +name = "flume" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499" +checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" dependencies = [ - "instant", + "futures-core", + "futures-sink", + "spin 0.9.8", ] [[package]] @@ -523,18 +371,18 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.1.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] [[package]] name = "futures-channel" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ba265a92256105f45b719605a571ffe2d1f0fea3807304b522c1d778f79eed" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", "futures-sink", @@ -542,15 +390,26 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-executor" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] [[package]] name = "futures-intrusive" -version = "0.4.2" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a604f7a68fbf8103337523b1fadc8ade7361ee3f112f7c680ad179651616aed5" +checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" dependencies = [ "futures-core", "lock_api", @@ -559,53 +418,38 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00f5fb52a06bdcadeb54e8d3671f8888a39697dcb0b81b23b55174030427f4eb" - -[[package]] -name = "futures-lite" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48" -dependencies = [ - "fastrand", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite", - "waker-fn", -] +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-macro" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdfb8ce053d86b91919aad980c220b1fb8401a9394410e1c289ed7e66b61835d" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.49", ] [[package]] name = "futures-sink" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39c15cf1a4aa79df40f1bb462fb39676d0ad9e366c2a33b590d7c66f4f81fcf9" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "futures-task" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ffb393ac5d9a6eaa9d3fdf37ae2776656b706e200c8e16b1bdb227f5198e6ea" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-util" -version = "0.3.25" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "197676987abd2f9cadff84926f410af1c183608d36641465df73ae8211dc65d6" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-core", "futures-io", @@ -620,9 +464,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.14.6" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bff49e947297f3312447abdca79f45f4738097cc82b06e72054d2223f601f1b9" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ "typenum", "version_check", @@ -630,54 +474,55 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.8" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi", ] [[package]] -name = "gloo-timers" -version = "0.2.5" +name = "gimli" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98c4a8d6391675c6b2ee1a6c8d06e8e2d03605c44cec1270675985a4c2a5500b" -dependencies = [ - "futures-channel", - "futures-core", - "js-sys", - "wasm-bindgen", -] +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] name = "hashbrown" -version = "0.12.3" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" dependencies = [ "ahash", + "allocator-api2", ] [[package]] name = "hashlink" -version = "0.8.1" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69fe1fcf8b4278d860ad0548329f892a3631fb63f82574df68275f34cdbe0ffa" +checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" dependencies = [ "hashbrown", ] [[package]] name = "heck" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" dependencies = [ "unicode-segmentation", ] +[[package]] +name = "hermit-abi" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd" + [[package]] name = "hex" version = "0.4.3" @@ -686,9 +531,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "hkdf" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" dependencies = [ "hmac", ] @@ -703,34 +548,19 @@ dependencies = [ ] [[package]] -name = "iana-time-zone" -version = "0.1.53" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64c122667b287044802d6ce17ee2ddf13207ed924c712de9a66a5814d5b64765" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "winapi", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.1" +name = "home" +version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0703ae284fc167426161c2e3f1da3ea71d94b21bedbcc9494e92b28e334e3dca" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" dependencies = [ - "cxx", - "cxx-build", + "windows-sys 0.52.0", ] [[package]] name = "idna" -version = "0.3.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -738,82 +568,72 @@ dependencies = [ [[package]] name = "indexmap" -version = "1.9.2" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399" +checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" dependencies = [ - "autocfg", + "equivalent", "hashbrown", ] -[[package]] -name = "instant" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" -dependencies = [ - "cfg-if", -] - [[package]] name = "itertools" -version = "0.10.5" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" dependencies = [ "either", ] [[package]] name = "itoa" -version = "1.0.5" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] -name = "js-sys" -version = "0.3.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "kv-log-macro" -version = "1.0.7" +name = "lazy_static" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" dependencies = [ - "log", + "spin 0.5.2", ] [[package]] -name = "lazy_static" -version = "1.4.0" +name = "libc" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] -name = "libc" -version = "0.2.138" +name = "libm" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db6d7e329c562c5dfab7a46a2afabc8b987ab9a4834c9d1ca04dc54c1546cef8" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" [[package]] -name = "link-cplusplus" -version = "1.0.8" +name = "libsqlite3-sys" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecd207c9c713c34f95a097a5b029ac2ce6010530c7b49d7fea24d977dede04f5" +checksum = "cf4e226dcd58b4be396f7bd3c20da8fdee2911400705297ba7d2d7cc2c30f716" dependencies = [ "cc", + "pkg-config", + "vcpkg", ] +[[package]] +name = "linux-raw-sys" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" + [[package]] name = "lock_api" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" dependencies = [ "autocfg", "scopeguard", @@ -821,28 +641,25 @@ dependencies = [ [[package]] name = "log" -version = "0.4.17" +version = "0.4.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", - "value-bag", -] +checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" [[package]] name = "md-5" -version = "0.10.5" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6365506850d44bff6e2fbcb5176cf63650e48bd45ef2fe2665ae1570e0f4b9ca" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" dependencies = [ + "cfg-if", "digest", ] [[package]] name = "memchr" -version = "2.5.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" [[package]] name = "minimal-lexical" @@ -850,6 +667,26 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" +[[package]] +name = "miniz_oxide" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.48.0", +] + [[package]] name = "native-tls" version = "0.2.11" @@ -868,84 +705,151 @@ 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.1" +version = "7.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8903e5a29a317527874d0402f867152a3d21c908bb0b933e416c65e301d4c36" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" dependencies = [ "memchr", "minimal-lexical", ] [[package]] -name = "nu-ansi-term" -version = "0.46.0" +name = "num-bigint-dig" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" dependencies = [ - "overload", - "winapi", + "byteorder", + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand", + "smallvec", + "zeroize", ] [[package]] name = "num-integer" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9" dependencies = [ "autocfg", + "num-integer", "num-traits", ] [[package]] name = "num-traits" -version = "0.2.15" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" dependencies = [ "autocfg", + "libm", ] [[package]] -name = "ohkami" -version = "0.1.0" +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "ohkami 0.3.3", - "rand", - "serde", - "sqlx", - "yarte", + "hermit-abi", + "libc", +] + +[[package]] +name = "object" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +dependencies = [ + "memchr", ] [[package]] name = "ohkami" -version = "0.3.3" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5865b230c6e90ca5146fc32495d8e6fc601756727affb1567d0a9d0096de6c0" +checksum = "0e19a311d70d741f4a08f54374df6501bc2ebde819b5a69b95763ea2335f5f19" dependencies = [ - "async-std", - "chrono", + "byte_reader", + "hmac", + "ohkami_lib", + "ohkami_macros", "serde", "serde_json", + "sha2", + "tokio", +] + +[[package]] +name = "ohkami_framework_benchmarks" +version = "0.15.0" +dependencies = [ + "futures-util", + "ohkami", + "rand", "sqlx", - "tracing", - "tracing-subscriber", + "tokio", + "yarte", +] + +[[package]] +name = "ohkami_lib" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bf187aa0f73c2b91d9ac5c7eb1437c8d1a015d765d4fc3db8113c90a82ae2a0" + +[[package]] +name = "ohkami_macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02c09a65693c4398af64b085040fe937f7d42d9b164306b5271fc169fa276db7" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] name = "once_cell" -version = "1.16.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "openssl" -version = "0.10.60" +version = "0.10.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79a4c6c3a2b158f7f8f2a2fc5a969fa3a068df6fc9dbb4a43845436e3af7c800" +checksum = "15c9d69dd87a29568d4d017cfe8ec518706046a05184e5aea92d0af890b803c8" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "cfg-if", "foreign-types", "libc", @@ -956,13 +860,13 @@ dependencies = [ [[package]] name = "openssl-macros" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b501e44f11665960c7e7fcf062c7d96a14ade4aa98116c004b2e37b5be7d736c" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.49", ] [[package]] @@ -973,9 +877,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.96" +version = "0.9.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3812c071ba60da8b5677cc12bcb1d42989a65553772897a7e0355545a819838f" +checksum = "22e1bf214306098e4832460f797824c05d25aacdf896f64a985fb0fd992454ae" dependencies = [ "cc", "libc", @@ -983,60 +887,55 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - -[[package]] -name = "parking" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" - [[package]] name = "parking_lot" -version = "0.11.2" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" dependencies = [ - "instant", "lock_api", "parking_lot_core", ] [[package]] name = "parking_lot_core" -version = "0.8.6" +version = "0.9.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ "cfg-if", - "instant", "libc", "redox_syscall", "smallvec", - "winapi", + "windows-targets 0.48.5", ] [[package]] name = "paste" -version = "1.0.11" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + +[[package]] +name = "pem-rfc7468" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d01a5bd0424d00070b0098dd17ebca6f961a959dead1dbcbbbc1d1cd8d3deeba" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] [[package]] name = "percent-encoding" -version = "2.2.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" [[package]] name = "pin-utils" @@ -1045,25 +944,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] -name = "pkg-config" -version = "0.3.26" +name = "pkcs1" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] [[package]] -name = "polling" -version = "2.5.2" +name = "pkcs8" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22122d5ec4f9fe1b3916419b76be1e80bcb93f618d071d2edf841b137b2a2bd6" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ - "autocfg", - "cfg-if", - "libc", - "log", - "wepoll-ffi", - "windows-sys 0.42.0", + "der", + "spki", ] +[[package]] +name = "pkg-config" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -1072,28 +978,28 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" [[package]] name = "prettyplease" -version = "0.1.22" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c8992a85d8e93a28bdf76137db888d3874e3b230dee5ed8bebac4c9f7617773" +checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" dependencies = [ "proc-macro2", - "syn", + "syn 1.0.109", ] [[package]] name = "proc-macro2" -version = "1.0.49" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a8eca9f9c4ffde41714334dee777596264c7825420f521abc92b5b5deb63a5" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.23" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] @@ -1130,29 +1036,30 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.16" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" dependencies = [ "bitflags 1.3.2", ] [[package]] -name = "redox_users" -version = "0.4.3" +name = "regex" +version = "1.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" dependencies = [ - "getrandom", - "redox_syscall", - "thiserror", + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", ] [[package]] -name = "regex" -version = "1.7.0" +name = "regex-automata" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a" +checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" dependencies = [ "aho-corasick", "memchr", @@ -1161,19 +1068,36 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.6.28" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] -name = "remove_dir_all" -version = "0.5.3" +name = "rsa" +version = "0.9.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7" +checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc" dependencies = [ - "winapi", + "const-oid", + "digest", + "num-bigint-dig", + "num-integer", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core", + "signature", + "spki", + "subtle", + "zeroize", ] +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + [[package]] name = "rustc_version" version = "0.4.0" @@ -1183,39 +1107,45 @@ dependencies = [ "semver", ] +[[package]] +name = "rustix" +version = "0.38.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" +dependencies = [ + "bitflags 2.4.2", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + [[package]] name = "ryu" -version = "1.0.12" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b4b9743ed687d4b4bcedf9ff5eaa7398495ae14e61cba0a295704edbc7decde" +checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" [[package]] name = "schannel" -version = "0.1.20" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" dependencies = [ - "lazy_static", - "windows-sys 0.36.1", + "windows-sys 0.52.0", ] [[package]] name = "scopeguard" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" - -[[package]] -name = "scratch" -version = "1.0.3" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddccb15bcce173023b3fedd9436f882a0739b8dfb45e4f6b6002bee5929f61b2" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "security-framework" -version = "2.7.0" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bc1bb97804af6631813c55739f771071e0f2ed33ee20b68c86ec505d906356c" +checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" dependencies = [ "bitflags 1.3.2", "core-foundation", @@ -1226,9 +1156,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.6.1" +version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0160a13a177a45bfb43ce71c01580998474f556ad854dcbca936dd2841a5c556" +checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" dependencies = [ "core-foundation-sys", "libc", @@ -1236,35 +1166,35 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.16" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58bc9567378fc7690d6b2addae4e60ac2eeea07becb2c64b9f218b53865cba2a" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" [[package]] name = "serde" -version = "1.0.151" +version = "1.0.196" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fed41fc1a24994d044e6db6935e69511a1153b52c15eb42493b26fa87feba0" +checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.151" +version = "1.0.196" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "255abe9a125a985c05190d687b320c12f9b1f0b99445e608c21ba0782c719ad8" +checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.49", ] [[package]] name = "serde_json" -version = "1.0.91" +version = "1.0.113" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877c235533714907a8c2464236f5c4b2a17262ef1bd71f38f35ea592c8da6883" +checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79" dependencies = [ "itoa", "ryu", @@ -1273,9 +1203,9 @@ dependencies = [ [[package]] name = "sha1" -version = "0.10.5" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", "cpufeatures", @@ -1284,9 +1214,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.6" +version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", @@ -1294,63 +1224,79 @@ dependencies = [ ] [[package]] -name = "sharded-slab" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "signal-hook" -version = "0.3.14" +name = "signal-hook-registry" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a253b5e89e2698464fc26b545c9edceb338e18a89effeeecfea192c3025be29d" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" dependencies = [ "libc", - "signal-hook-registry", ] [[package]] -name = "signal-hook-registry" -version = "1.4.0" +name = "signature" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51e73328dc4ac0c7ccbda3a494dfa03df1de2f46018127f60c693f2648455b0" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ - "libc", + "digest", + "rand_core", ] [[package]] name = "slab" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ "autocfg", ] [[package]] name = "smallvec" -version = "1.10.0" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" +checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" [[package]] name = "socket2" -version = "0.4.7" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd" +checksum = "7b5fac59a5cb5dd637972e5fca70daf0523c9067fcdc4842f053dae04a18f8e9" dependencies = [ "libc", - "winapi", + "windows-sys 0.48.0", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", ] [[package]] name = "sqlformat" -version = "0.2.0" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f87e292b4291f154971a43c3774364e2cbcaec599d3f5bf6fa9d122885dbc38a" +checksum = "ce81b7bd7c4493975347ef60d8c7e8b742d4694f4c49f93e0a12ea263938176c" dependencies = [ "itertools", "nom", @@ -1359,114 +1305,224 @@ dependencies = [ [[package]] name = "sqlx" -version = "0.6.2" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dba03c279da73694ef99763320dea58b51095dfe87d001b1d4b5fe78ba8763cf" +dependencies = [ + "sqlx-core", + "sqlx-macros", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", +] + +[[package]] +name = "sqlx-core" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d84b0a3c3739e220d94b3239fd69fb1f74bc36e16643423bd99de3b43c21bfbd" +dependencies = [ + "ahash", + "atoi", + "byteorder", + "bytes", + "crc", + "crossbeam-queue", + "dotenvy", + "either", + "event-listener", + "futures-channel", + "futures-core", + "futures-intrusive", + "futures-io", + "futures-util", + "hashlink", + "hex", + "indexmap", + "log", + "memchr", + "native-tls", + "once_cell", + "paste", + "percent-encoding", + "serde", + "serde_json", + "sha2", + "smallvec", + "sqlformat", + "thiserror", + "tokio", + "tokio-stream", + "tracing", + "url", +] + +[[package]] +name = "sqlx-macros" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9249290c05928352f71c077cc44a464d880c63f26f7534728cca008e135c0428" +checksum = "89961c00dc4d7dffb7aee214964b065072bff69e36ddb9e2c107541f75e4f2a5" dependencies = [ + "proc-macro2", + "quote", + "sqlx-core", + "sqlx-macros-core", + "syn 1.0.109", +] + +[[package]] +name = "sqlx-macros-core" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0bd4519486723648186a08785143599760f7cc81c52334a55d6a83ea1e20841" +dependencies = [ + "atomic-write-file", + "dotenvy", + "either", + "heck", + "hex", + "once_cell", + "proc-macro2", + "quote", + "serde", + "serde_json", + "sha2", "sqlx-core", - "sqlx-macros", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", + "syn 1.0.109", + "tempfile", + "tokio", + "url", ] [[package]] -name = "sqlx-core" -version = "0.6.2" +name = "sqlx-mysql" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcbc16ddba161afc99e14d1713a453747a2b07fc097d2009f4c300ec99286105" +checksum = "e37195395df71fd068f6e2082247891bc11e3289624bbc776a0cdfa1ca7f1ea4" dependencies = [ - "ahash", "atoi", "base64", - "bitflags 1.3.2", + "bitflags 2.4.2", "byteorder", "bytes", "crc", - "crossbeam-queue", - "dirs", + "digest", "dotenvy", "either", - "event-listener", "futures-channel", "futures-core", - "futures-intrusive", + "futures-io", "futures-util", - "hashlink", + "generic-array", "hex", "hkdf", "hmac", - "indexmap", "itoa", - "libc", "log", "md-5", "memchr", "once_cell", - "paste", "percent-encoding", "rand", + "rsa", "serde", - "serde_json", "sha1", "sha2", "smallvec", - "sqlformat", - "sqlx-rt", + "sqlx-core", "stringprep", "thiserror", - "url", + "tracing", "whoami", ] [[package]] -name = "sqlx-macros" -version = "0.6.2" +name = "sqlx-postgres" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b850fa514dc11f2ee85be9d055c512aa866746adfacd1cb42d867d68e6a5b0d9" +checksum = "d6ac0ac3b7ccd10cc96c7ab29791a7dd236bd94021f31eec7ba3d46a74aa1c24" dependencies = [ + "atoi", + "base64", + "bitflags 2.4.2", + "byteorder", + "crc", "dotenvy", - "either", - "heck", + "etcetera", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "hex", + "hkdf", + "hmac", + "home", + "itoa", + "log", + "md-5", + "memchr", "once_cell", - "proc-macro2", - "quote", + "rand", + "serde", + "serde_json", + "sha1", "sha2", + "smallvec", "sqlx-core", - "sqlx-rt", - "syn", - "url", + "stringprep", + "thiserror", + "tracing", + "whoami", ] [[package]] -name = "sqlx-rt" -version = "0.6.2" +name = "sqlx-sqlite" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24c5b2d25fa654cc5f841750b8e1cdedbe21189bf9a9382ee90bfa9dd3562396" +checksum = "210976b7d948c7ba9fced8ca835b11cbb2d677c59c79de41ac0d397e14547490" dependencies = [ - "async-native-tls", - "async-std", - "native-tls", + "atoi", + "flume", + "futures-channel", + "futures-core", + "futures-executor", + "futures-intrusive", + "futures-util", + "libsqlite3-sys", + "log", + "percent-encoding", + "serde", + "sqlx-core", + "tracing", + "url", + "urlencoding", ] [[package]] name = "stringprep" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ee348cb74b87454fff4b551cbf727025810a004f88aeacae7f85b87f4e9a1c1" +checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6" dependencies = [ + "finl_unicode", "unicode-bidi", "unicode-normalization", ] [[package]] name = "subtle" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "syn" -version = "1.0.107" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ "proc-macro2", "quote", @@ -1474,99 +1530,120 @@ dependencies = [ ] [[package]] -name = "tempfile" -version = "3.3.0" +name = "syn" +version = "2.0.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4" +checksum = "915aea9e586f80826ee59f8453c1101f9d1c4b3964cd2460185ee8e299ada496" dependencies = [ - "cfg-if", - "fastrand", - "libc", - "redox_syscall", - "remove_dir_all", - "winapi", + "proc-macro2", + "quote", + "unicode-ident", ] [[package]] -name = "termcolor" -version = "1.1.3" +name = "tempfile" +version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67" dependencies = [ - "winapi-util", + "cfg-if", + "fastrand", + "rustix", + "windows-sys 0.52.0", ] [[package]] name = "thiserror" -version = "1.0.38" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a9cd18aa97d5c45c6603caea1da6628790b37f7a34b6ca89522331c5180fed0" +checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.38" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fb327af4685e4d03fa8cbcf1716380da910eeb2bb8be417e7f9fd3fb164f36f" +checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.49", ] [[package]] -name = "thread_local" -version = "1.1.4" +name = "tinyvec" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" dependencies = [ - "once_cell", + "tinyvec_macros", ] [[package]] -name = "time" -version = "0.1.45" +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" +checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" dependencies = [ + "backtrace", + "bytes", "libc", - "wasi 0.10.0+wasi-snapshot-preview1", - "winapi", + "mio", + "num_cpus", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.48.0", ] [[package]] -name = "tinyvec" -version = "1.6.0" +name = "tokio-macros" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ - "tinyvec_macros", + "proc-macro2", + "quote", + "syn 2.0.49", ] [[package]] -name = "tinyvec_macros" -version = "0.1.0" +name = "tokio-stream" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" +checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] [[package]] name = "toml" -version = "0.5.10" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1333c76748e868a4d9d1017b5ab53171dfd095f70c712fdb4653a406547f598f" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" dependencies = [ "serde", ] [[package]] name = "tracing" -version = "0.1.37" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "cfg-if", + "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -1574,67 +1651,41 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.23" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.49", ] [[package]] name = "tracing-core" -version = "0.1.30" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", - "valuable", -] - -[[package]] -name = "tracing-log" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" -dependencies = [ - "lazy_static", - "log", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70" -dependencies = [ - "nu-ansi-term", - "sharded-slab", - "smallvec", - "thread_local", - "tracing-core", - "tracing-log", ] [[package]] name = "typenum" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "unicode-bidi" -version = "0.3.8" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" -version = "1.0.6" +version = "1.0.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-normalization" @@ -1647,15 +1698,15 @@ dependencies = [ [[package]] name = "unicode-segmentation" -version = "1.10.0" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fdbf052a0783de01e944a6ce7a8cb939e295b1e7be835a1112c3b9a7f047a5a" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" [[package]] name = "unicode-width" -version = "0.1.10" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" +checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" [[package]] name = "unicode-xid" @@ -1671,15 +1722,21 @@ checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" [[package]] name = "url" -version = "2.3.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", "idna", "percent-encoding", ] +[[package]] +name = "urlencoding" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" + [[package]] name = "v_eval" version = "0.6.0" @@ -1687,7 +1744,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0dd8b599d797eb038d0dde9a3860aacb6bbba3bffa4ac64f807c8673820cc9d9" dependencies = [ "regex", - "syn", + "syn 1.0.109", ] [[package]] @@ -1696,22 +1753,6 @@ version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4e8257fbc510f0a46eb602c10215901938b5c2a7d5e70fc11483b1d3c9b5b18c" -[[package]] -name = "valuable" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" - -[[package]] -name = "value-bag" -version = "1.0.0-alpha.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2209b78d1249f7e6f3293657c9779fe31ced465df091bbd433a1cf88e916ec55" -dependencies = [ - "ctor", - "version_check", -] - [[package]] name = "vcpkg" version = "0.2.15" @@ -1724,119 +1765,17 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" -[[package]] -name = "waker-fn" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" - -[[package]] -name = "wasi" -version = "0.10.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" -[[package]] -name = "wasm-bindgen" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268" -dependencies = [ - "cfg-if", - "wasm-bindgen-macro", -] - -[[package]] -name = "wasm-bindgen-backend" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142" -dependencies = [ - "bumpalo", - "log", - "once_cell", - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-futures" -version = "0.4.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23639446165ca5a5de86ae1d8896b737ae80319560fbaa4c2887b7da6e7ebd7d" -dependencies = [ - "cfg-if", - "js-sys", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "wasm-bindgen-backend", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f" - -[[package]] -name = "web-sys" -version = "0.3.60" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "wepoll-ffi" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d743fdedc5c64377b5fc2bc036b01c7fd642205a0d96356034ae3404d49eb7fb" -dependencies = [ - "cc", -] - [[package]] name = "whoami" -version = "1.2.3" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6631b6a2fd59b1841b622e8f1a7ad241ef0a46f2d580464ce8140ac94cbd571" -dependencies = [ - "bumpalo", - "wasm-bindgen", - "web-sys", -] +checksum = "22fc3756b8a9133049b26c7f61ab35416c130e8c09b660f5b3958b446f52cc50" [[package]] name = "winapi" @@ -1854,15 +1793,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" -[[package]] -name = "winapi-util" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" -dependencies = [ - "winapi", -] - [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -1871,103 +1801,135 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-sys" -version = "0.36.1" +version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows_aarch64_msvc 0.36.1", - "windows_i686_gnu 0.36.1", - "windows_i686_msvc 0.36.1", - "windows_x86_64_gnu 0.36.1", - "windows_x86_64_msvc 0.36.1", + "windows-targets 0.48.5", ] [[package]] name = "windows-sys" -version = "0.42.0" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.0", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc 0.42.0", - "windows_i686_gnu 0.42.0", - "windows_i686_msvc 0.42.0", - "windows_x86_64_gnu 0.42.0", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc 0.42.0", + "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", ] [[package]] name = "windows_aarch64_gnullvm" -version = "0.42.0" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" [[package]] name = "windows_aarch64_msvc" -version = "0.36.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.42.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" [[package]] name = "windows_i686_gnu" -version = "0.36.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.42.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" [[package]] name = "windows_i686_msvc" -version = "0.36.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.42.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" [[package]] name = "windows_x86_64_gnu" -version = "0.36.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.42.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" [[package]] name = "windows_x86_64_gnullvm" -version = "0.42.0" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" [[package]] name = "windows_x86_64_msvc" -version = "0.36.1" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.42.0" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" [[package]] name = "yansi-term" @@ -1990,13 +1952,13 @@ dependencies = [ [[package]] name = "yarte_codegen" -version = "0.15.6" +version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1cf72076dbf4d39fe4779b58380d7213dcb3995d00666dd2d109f1b45879ea4" +checksum = "4a79312078b97a195de91a8c1457c2e0d7abd97e6e605f3cdeb01b3c105d2cff" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", "yarte_helpers", "yarte_hir", ] @@ -2009,7 +1971,7 @@ checksum = "b296edd7e1a81717b6f794baa2de8dfe89646050847161550b2d963b3ca6fe80" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 1.0.109", "yarte_codegen", "yarte_helpers", "yarte_hir", @@ -2018,15 +1980,15 @@ dependencies = [ [[package]] name = "yarte_helpers" -version = "0.15.7" +version = "0.15.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8dfe1ef3558dde14b4be5387bdd41e3bd45746570743521470ec3e9cd0826679" +checksum = "e0d1076f8cee9541ea5ffbecd9102f751252c91f085e7d30a18a3ce805ebd3ee" dependencies = [ "dtoa", "itoa", "prettyplease", "serde", - "syn", + "syn 1.0.109", "toml", "v_htmlescape", ] @@ -2040,7 +2002,7 @@ dependencies = [ "derive_more", "proc-macro2", "quote", - "syn", + "syn 1.0.109", "v_eval", "v_htmlescape", "yarte_helpers", @@ -2058,7 +2020,33 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn", + "syn 1.0.109", "unicode-xid", "yarte_helpers", ] + +[[package]] +name = "zerocopy" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.49", +] + +[[package]] +name = "zeroize" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" diff --git a/frameworks/Rust/ohkami/Cargo.toml b/frameworks/Rust/ohkami/Cargo.toml index a521a7b4f08..15475ee8cd9 100644 --- a/frameworks/Rust/ohkami/Cargo.toml +++ b/frameworks/Rust/ohkami/Cargo.toml @@ -1,11 +1,13 @@ [package] -name = "ohkami" -version = "0.1.0" +name = "ohkami_framework_benchmarks" +version = "0.15.0" edition = "2021" +authors = ["kanarus "] [dependencies] -ohkami = { version = "0.3.3", features = ["sqlx", "postgres"] } -serde = { version = "1.0", features = ["derive"] } -sqlx = "0.6" -rand = "0.8.5" -yarte = "0.15" +ohkami = { version = "=0.15.0", features = ["rt_tokio"] } +tokio = { version = "1.36.0" , features = ["full"] } +rand = { version = "0.8.5" , features = ["small_rng"] } +sqlx = { version = "0.7.3" , features = ["postgres", "macros", "runtime-tokio-native-tls"] } +yarte = { version = "0.15.7" } +futures-util = { version = "0.3.30" } \ No newline at end of file diff --git a/frameworks/Rust/ohkami/README.md b/frameworks/Rust/ohkami/README.md index e234565d4b4..2d61eb2ee76 100644 --- a/frameworks/Rust/ohkami/README.md +++ b/frameworks/Rust/ohkami/README.md @@ -1,15 +1,41 @@ -# [ohkami](https://github.com/kana-rus/ohkami) web framework +# [ohkami](https://github.com/kana-rus/ohkami) - Intuitive and Declarative Web Framework for Rust ## Description -ohkami is **simple** and **macro free** wen framework. + +> 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` + +- [User Guide](https://docs.rs/ohkami/latest/ohkami/) +- [API Documentation](https://docs.rs/ohkami/latest/ohkami/) +- Cargo package: [ohkami](https://crates.io/crates/ohkami) ## Database -- PostgreSQL + +PostgreSQL with [sqlx](https://github.com/launchbadge/sqlx) ## Test URLs -- JSON Encoding: [http://localhost:8080/json](http://localhost:8080/json) -- Single Row Query: [http://localhost:8080/db](http://localhost:8080/db) -- Multi Row Query: [http://localhost:8080/queries](http://localhost:8080/queries) -- Fortunes: [http://localhost:8080/fortunes](http://localhost:8080/fortunes) -- Update Query: [http://localhost:8080/updates](http://localhost:8080/updates) -- Plaintext: [http://localhost:8080/plaintext](http://localhost:8080/plaintext) \ No newline at end of file + +### 1. JSON Serialization + + http://localhost:8000/json + +### 2. Single Database Query + + http://localhost:8000/db + +### 3. Multiple Database Queries + + http://localhost:8000/queries?q={count} + +### 4. Fortunes + + http://localhost:8000/fortunes + +### 5. Database Updates + + http://localhost:8000/updates?q={count} + +### 6. Plaintext + + http://localhost:8000/plaintext \ No newline at end of file diff --git a/frameworks/Rust/ohkami/benchmark_config.json b/frameworks/Rust/ohkami/benchmark_config.json index b80c54f8be3..d09a2d32926 100644 --- a/frameworks/Rust/ohkami/benchmark_config.json +++ b/frameworks/Rust/ohkami/benchmark_config.json @@ -3,24 +3,26 @@ "tests": [ { "default": { - "json_url": "/json", - "plaintext_url": "/plaintext", - "fortune_url": "/fortunes", - "db_url": "/db", - "query_url": "/queries?q=", - "update_url": "/updates?q=", - "port": 8080, - "approach": "Realistic", + "json_url": "/json", + "db_url": "/db", + "query_url": "/queries?q=", + "fortune_url": "/fortunes", + "update_url": "/updates?q=", + "plaintext_url": "/plaintext", + "port": 8000, + "approach": "Realistic", "classification": "Micro", - "database": "Postgres", - "framework": "ohkami", - "language": "Rust", - "orm": "Raw", - "platform": "Rust", - "webserver": "ohkami", - "os": "Linux", - "database_os": "Linux", - "display_name": "ohkami" + "database": "Postgres", + "framework": "ohkami", + "language": "Rust", + "orm": "Raw", + "platform": "None", + "webserver": "ohkami", + "os": "Linux", + "database_os": "Linux", + "display_name": "ohkami", + "notes": "", + "versus": "None" } } ] diff --git a/frameworks/Rust/ohkami/config.toml b/frameworks/Rust/ohkami/config.toml new file mode 100644 index 00000000000..85eddc62c99 --- /dev/null +++ b/frameworks/Rust/ohkami/config.toml @@ -0,0 +1,19 @@ +[framework] +name = "ohkami" + +[main] +urls.json = "/json" +urls.db = "/db" +urls.query = "/queries?q=" +urls.fortune = "/fortunes" +urls.update = "/updates?q=" +urls.plaintext = "/plaintext" +approach = "Realistic" +classification = "Micro" +database = "Postgres" +database_os = "Linux" +os = "Linux" +orm = "Raw" +platform = "None" +webserver = "ohkami" +versus = "None" \ No newline at end of file diff --git a/frameworks/Rust/ohkami/ohkami.dockerfile b/frameworks/Rust/ohkami/ohkami.dockerfile index ccecec92039..e528d58373e 100644 --- a/frameworks/Rust/ohkami/ohkami.dockerfile +++ b/frameworks/Rust/ohkami/ohkami.dockerfile @@ -1,13 +1,19 @@ -FROM rust:1.65 +FROM rust:1.76-slim-buster +WORKDIR /ohkami_framework_benchmarks -RUN apt update -yqq \ - && apt install -yqq cmake g++ +ENV DATABASE_URL=postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world +ENV MAX_CONNECTIONS=56 +ENV MIN_CONNECTIONS=56 -ADD ./ /ohkami -WORKDIR /ohkami +COPY ./src ./src +COPY ./templates ./templates +COPY ./Cargo.toml ./Cargo.toml +COPY ./Cargo.lock ./Cargo.lock -RUN cargo clean \ - && RUSTFLAGS="-C target-cpu=native" cargo build --release +RUN apt update && apt install -y --no-install-recommends \ + libpq-dev pkg-config libssl-dev && \ + rm -rf /var/lib/apt/lists/* -EXPOSE 8080 -CMD ./target/release/ohkami \ No newline at end of file +RUN RUSTFLAGS="-C target-cpu=native" cargo build --release +EXPOSE 8000 +CMD ./target/release/ohkami_framework_benchmarks \ No newline at end of file diff --git a/frameworks/Rust/ohkami/src/components.rs b/frameworks/Rust/ohkami/src/components.rs deleted file mode 100644 index 7fab61e573b..00000000000 --- a/frameworks/Rust/ohkami/src/components.rs +++ /dev/null @@ -1,60 +0,0 @@ -pub(crate) mod consts { - use std::ops::RangeInclusive; - - pub const RAND_RANGE: RangeInclusive = 1..=10000; - pub const DB_URL: &'static str = "postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world?sslmode=disable"; - pub const MAX_CONNECTIONS: u32 = 10000; -} - -pub(crate) mod models { - use serde::Serialize; - use sqlx::FromRow; - use yarte::Template; - - #[derive(FromRow, Serialize)] - pub struct World { - id: i32, - randomnumber: i32, - } impl World { - pub fn set_randomnumber(&mut self, new_randomnumber: i32) { - self.randomnumber = new_randomnumber - } - } - - #[derive(FromRow, Serialize)] - pub struct Fortune { - pub id: i32, - pub message: String, - } - #[derive(Template)] - #[template(path = "fortunes.hbs")] - pub(crate) struct FortunesTemplate { - pub(crate) fortunes: Vec - } -} - -pub(crate) mod functions { - use ohkami::{prelude::Body, result::{Result, ElseResponseWithErr}, response::Response}; - use rand::Rng; - use yarte::Template; - use super::{models::{Fortune, FortunesTemplate}, consts::RAND_RANGE}; - - pub fn random_i32() -> i32 { - rand::thread_rng().gen_range(RAND_RANGE) as i32 - } - pub fn random_i32s(n: usize) -> std::vec::IntoIter { - let mut generator = rand::thread_rng(); - let mut i32s = Vec::with_capacity(n); - for _ in 0..n { - i32s.push(generator.gen_range(RAND_RANGE) as i32) - } - i32s.into_iter() - } - pub fn render_html(fortunes: Vec) -> Result { - Response::OK(Body::html( - FortunesTemplate {fortunes} - .call() - ._else(|_| Response::InternalServerError("failed to render template"))? - )) - } -} diff --git a/frameworks/Rust/ohkami/src/main.rs b/frameworks/Rust/ohkami/src/main.rs index de77651f067..bcac0f3a2ef 100644 --- a/frameworks/Rust/ohkami/src/main.rs +++ b/frameworks/Rust/ohkami/src/main.rs @@ -1,97 +1,74 @@ -use ohkami::{prelude::*, json}; -use sqlx::postgres::PgPoolOptions; -mod components; use components::{ - consts::{DB_URL, MAX_CONNECTIONS}, - models::{World, Fortune}, - functions::{random_i32, random_i32s, render_html}, -}; - -fn main() -> Result<()> { - let config = Config { - db_profile: DBprofile { - pool_options: PgPoolOptions::new().max_connections(MAX_CONNECTIONS), - url: DB_URL, - }, - log_subscribe: None, - ..Default::default() - }; - - Server::setup_with(config) - .GET("/json", || async {Response::OK(json!("message": "Hello, World!"))}) - .GET("/plaintext", || async {Response::OK("Hello, World!")}) - .GET("/db", handle_db) - .GET("/fortunes", handle_fortunes) - .GET("/queries", handle_queries) - .GET("/updates", handle_updates) - .serve_on(":8080") +mod models; +pub use models::{Fortune, Message, World, WorldsQuery}; + +mod postgres; +pub use postgres::Postgres; + +mod templates; +pub use templates::FortunesTemplate; + +use ohkami::{Ohkami, Route, Memory}; + + +#[tokio::main] +async fn main() { + struct SetServer; + impl ohkami::BackFang for SetServer { + type Error = std::convert::Infallible; + #[inline(always)] + async fn bite(&self, res: &mut ohkami::Response, _req: &ohkami::Request) -> Result<(), Self::Error> { + res.headers.set().Server("ohkami"); + Ok(()) + } + } + + Ohkami::with((SetServer, Postgres::init().await), ( + "/json" .GET(json_serialization), + "/db" .GET(single_database_query), + "/queries" .GET(multiple_database_query), + "/fortunes" .GET(fortunes), + "/updates" .GET(database_updates), + "/plaintext".GET(plaintext), + )).howl("0.0.0.0:8000").await +} + +async fn json_serialization() -> Message { + Message { + message: "Hello, World!" + } } -async fn handle_db(ctx: Context) -> Result { - let id = random_i32(); - let world = sqlx::query_as::<_, World>( - "SELECT id, randomnumber FROM world WHERE id = $1" - ).bind(id) - .fetch_one(ctx.pool()) - .await?; - Response::OK(json(&world)?) +async fn single_database_query(p: Memory<'_, Postgres>) -> World { + p.select_random_world().await } -async fn handle_fortunes(ctx: Context) -> Result { - let mut fortunes = sqlx::query_as::<_, Fortune>( - "SELECT id, message FROM fortune" - ) - .fetch_all(ctx.pool()) - .await?; +async fn multiple_database_query(q: WorldsQuery<'_>, p: Memory<'_, Postgres>) -> Vec { + let n = q.parse(); + p.select_n_random_worlds(n).await +} + +async fn fortunes(p: Memory<'_, Postgres>) -> FortunesTemplate { + let mut fortunes = p.select_all_fortunes().await; + fortunes.push(Fortune { id: 0, - message: "Additional fortune added at request time.".into(), + message: String::from("Additional fortune added at request time."), }); - fortunes.sort_unstable_by(|it, next| it.message.cmp(&next.message)); - render_html(fortunes) + + fortunes.sort_unstable_by(|a, b| str::cmp(&a.message, &b.message)); + + FortunesTemplate { fortunes } } -async fn handle_queries(ctx: Context) -> Result { - let count = { - let queries = ctx.query::<&str>("q").unwrap_or("1").parse::().unwrap_or(1); - if queries < 1 {1} else if 500 < queries {500} else {queries} - }; - let mut worlds = Vec::with_capacity(count); - for id in random_i32s(count) { - worlds.push( - sqlx::query_as::<_, World>( - "SELECT id, randomnumber FROM world WHERE id = $1" - ).bind(id) - .fetch_one(ctx.pool()) - .await? - ) - } - Response::OK(json(&worlds)?) +async fn database_updates(q: WorldsQuery<'_>, p: Memory<'_, Postgres>) -> Vec { + let n = q.parse(); + let mut worlds = p.select_n_random_worlds(n).await; + + p.update_random_ids_of_worlds(&mut worlds).await; + + worlds } -async fn handle_updates(ctx: Context) -> Result { - let count = { - let queries = ctx.query::<&str>("q").unwrap_or("1").parse::().unwrap_or(1); - if queries < 1 {1} else if 500 < queries {500} else {queries} - }; - let mut worlds = Vec::with_capacity(count); - let mut new_randomnumbers = random_i32s(count); - for id in random_i32s(count) { - let mut world = sqlx::query_as::<_, World>( - "SELECT id, randomnumber FROM world WHERE id = $1" - ).bind(id) - .fetch_one(ctx.pool()) - .await?; - - let new_randomnumber = new_randomnumbers.next().unwrap(); - world.set_randomnumber(new_randomnumber); - - sqlx::query("UPDATE world SET randomnumber = $1 WHERE id = $2") - .bind(new_randomnumber) - .bind(id) - .execute(ctx.pool()) - .await?; - - worlds.push(world) - } - Response::OK(json(&worlds)?) +async fn plaintext() -> &'static str { + "Hello, World!" } diff --git a/frameworks/Rust/ohkami/src/models.rs b/frameworks/Rust/ohkami/src/models.rs new file mode 100644 index 00000000000..3896cedc28a --- /dev/null +++ b/frameworks/Rust/ohkami/src/models.rs @@ -0,0 +1,36 @@ +use ohkami::typed::{ResponseBody, Query}; + + +#[ResponseBody(JSONS)] +pub struct Message { + pub message: &'static str, +} + +#[derive(sqlx::FromRow)] +pub struct Fortune { + pub id: i32, + pub message: String, +} + +#[derive(sqlx::FromRow)] +#[ResponseBody(JSONS)] +pub struct World { + pub id: i32, + #[serde(rename="randomNumber")] + pub randomnumber: i32, +} + +#[Query] +pub struct WorldsQuery<'q> { + q: Option<&'q str>, +} +impl WorldsQuery<'_> { + #[inline(always)] + pub fn parse(self) -> usize { + match self.q.unwrap_or("1").parse::().unwrap_or(1) { + n @ 1..=500 => n, + 0 => 1, + 501.. => 500, + } + } +} diff --git a/frameworks/Rust/ohkami/src/postgres.rs b/frameworks/Rust/ohkami/src/postgres.rs new file mode 100644 index 00000000000..3f5a50a02ea --- /dev/null +++ b/frameworks/Rust/ohkami/src/postgres.rs @@ -0,0 +1,102 @@ +use futures_util::{stream::FuturesUnordered, TryStreamExt}; +use rand::{rngs::SmallRng, SeedableRng, Rng, thread_rng}; +use crate::models::{World, Fortune}; + + +#[derive(Clone)] +pub struct Postgres(sqlx::PgPool); + +impl Postgres { + pub async fn init() -> impl ohkami::FrontFang { + pub struct UsePostgres(Postgres); + + impl ohkami::FrontFang for UsePostgres { + type Error = std::convert::Infallible; + #[inline(always)] + async fn bite(&self, req: &mut ohkami::Request) -> Result<(), Self::Error> { + req.memorize(self.0.clone()); + Ok(()) + } + } + + macro_rules! load_env { + ($($name:ident as $t:ty)*) => { + $( + #[allow(non_snake_case)] + let $name = ::std::env::var(stringify!($name)) + .expect(concat!( + "Failed to load environment variable ", + "`", stringify!($name), "`" + )) + .parse::<$t>() + .unwrap(); + )* + }; + } load_env! { + MAX_CONNECTIONS as u32 + MIN_CONNECTIONS as u32 + DATABASE_URL as String + } + + UsePostgres(Self( + sqlx::postgres::PgPoolOptions::new() + .max_connections(MAX_CONNECTIONS) + .min_connections(MIN_CONNECTIONS) + .connect(&DATABASE_URL).await + .unwrap() + )) + } +} + +impl Postgres { + pub async fn select_random_world(&self) -> World { + let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); + + sqlx::query_as( + "SELECT id, randomnumber FROM World WHERE id = $1") + .bind((rng.gen::() % 10_000 + 1) as i32) + .fetch_one(&self.0).await + .expect("Failed to fetch a world") + } + + pub async fn select_all_fortunes(&self) -> Vec { + sqlx::query_as( + "SELECT id, message FROM Fortune") + .fetch_all(&self.0).await + .expect("Failed to fetch fortunes") + } + + pub async fn select_n_random_worlds(&self, n: usize) -> Vec { + let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); + + let selects = FuturesUnordered::new(); + for _ in 0..n { + selects.push( + sqlx::query_as( + "SELECT id, randomnumber FROM World WHERE id = $1") + .bind((rng.gen::() % 10_000 + 1) as i32) + .fetch_one(&self.0) + ) + } + + selects.try_collect().await.expect("Failed to fetch worlds") + } + + pub async fn update_random_ids_of_worlds(&self, worlds: &mut Vec) { + let mut rng = SmallRng::from_rng(&mut thread_rng()).unwrap(); + + let updates = FuturesUnordered::new(); + for w in worlds { + w.randomnumber = (rng.gen::() % 10_000 + 1) as i32; + updates.push( + sqlx::query( + "UPDATE World SET randomnumber = $1 WHERE id = $2") + .bind(w.randomnumber) + .bind(w.id) + .execute(&self.0) + ) + } + + let _: sqlx::postgres::PgQueryResult = updates.try_collect().await.expect("Failed to fetch worlds"); + } +} diff --git a/frameworks/Rust/ohkami/src/templates.rs b/frameworks/Rust/ohkami/src/templates.rs new file mode 100644 index 00000000000..d52ffcb2b3a --- /dev/null +++ b/frameworks/Rust/ohkami/src/templates.rs @@ -0,0 +1,18 @@ +use ohkami::{Response, IntoResponse}; +use crate::models::Fortune; + + +#[derive(yarte::Template)] +#[template(path="fortunes")] +pub struct FortunesTemplate { + pub fortunes: Vec, +} +impl IntoResponse for FortunesTemplate { + #[inline(always)] + fn into_response(self) -> Response { + ohkami::utils::HTML( + ::call(&self) + .expect("Failed to render fortunes template") + ).into_response() + } +} From ff3d1104aae9285c95bfa256017491a5e68cdc12 Mon Sep 17 00:00:00 2001 From: lospejos Date: Thu, 28 Mar 2024 22:27:45 +0200 Subject: [PATCH 203/210] Bumped version for Java, Jooby, Maven and other libraries/dependencies (#8796) --- frameworks/Java/jooby/jooby-jetty.dockerfile | 2 +- frameworks/Java/jooby/jooby-mvc.dockerfile | 2 +- frameworks/Java/jooby/jooby-netty.dockerfile | 2 +- .../Java/jooby/jooby-pgclient.dockerfile | 2 +- frameworks/Java/jooby/jooby.dockerfile | 2 +- frameworks/Java/jooby/pom.xml | 24 +++++++++---------- 6 files changed, 17 insertions(+), 17 deletions(-) diff --git a/frameworks/Java/jooby/jooby-jetty.dockerfile b/frameworks/Java/jooby/jooby-jetty.dockerfile index e832ecc3359..bd3786886ca 100644 --- a/frameworks/Java/jooby/jooby-jetty.dockerfile +++ b/frameworks/Java/jooby/jooby-jetty.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.9.0-eclipse-temurin-17 +FROM maven:3.9.6-eclipse-temurin-21-jammy WORKDIR /jooby COPY pom.xml pom.xml COPY src src diff --git a/frameworks/Java/jooby/jooby-mvc.dockerfile b/frameworks/Java/jooby/jooby-mvc.dockerfile index 3153f04df69..feaeb23bc8e 100644 --- a/frameworks/Java/jooby/jooby-mvc.dockerfile +++ b/frameworks/Java/jooby/jooby-mvc.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.9.0-eclipse-temurin-17 +FROM maven:3.9.6-eclipse-temurin-21-jammy WORKDIR /jooby COPY pom.xml pom.xml COPY src src diff --git a/frameworks/Java/jooby/jooby-netty.dockerfile b/frameworks/Java/jooby/jooby-netty.dockerfile index 141f166e27c..dd6afe017c7 100644 --- a/frameworks/Java/jooby/jooby-netty.dockerfile +++ b/frameworks/Java/jooby/jooby-netty.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.9.0-eclipse-temurin-17 +FROM maven:3.9.6-eclipse-temurin-21-jammy WORKDIR /jooby COPY pom.xml pom.xml COPY src src diff --git a/frameworks/Java/jooby/jooby-pgclient.dockerfile b/frameworks/Java/jooby/jooby-pgclient.dockerfile index b4a9ba32aad..e3c58df435c 100644 --- a/frameworks/Java/jooby/jooby-pgclient.dockerfile +++ b/frameworks/Java/jooby/jooby-pgclient.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.9.0-eclipse-temurin-17 +FROM maven:3.9.6-eclipse-temurin-21-jammy WORKDIR /jooby COPY pom.xml pom.xml COPY src src diff --git a/frameworks/Java/jooby/jooby.dockerfile b/frameworks/Java/jooby/jooby.dockerfile index d262363b076..98d1b029d36 100644 --- a/frameworks/Java/jooby/jooby.dockerfile +++ b/frameworks/Java/jooby/jooby.dockerfile @@ -1,4 +1,4 @@ -FROM maven:3.9.0-eclipse-temurin-17 +FROM maven:3.9.6-eclipse-temurin-21-jammy WORKDIR /jooby COPY pom.xml pom.xml COPY src src diff --git a/frameworks/Java/jooby/pom.xml b/frameworks/Java/jooby/pom.xml index 927fe7f14b8..90b9758b991 100644 --- a/frameworks/Java/jooby/pom.xml +++ b/frameworks/Java/jooby/pom.xml @@ -11,12 +11,12 @@ jooby - 3.0.5 - 1.10.0 + 3.0.8 + 2.0.2 42.7.2 UTF-8 - 17 - 17 + 21 + 21 com.techempower.App @@ -41,7 +41,7 @@ com.mysql mysql-connector-j - 8.0.33 + 8.3.0 @@ -55,13 +55,13 @@ io.vertx vertx-pg-client - 4.4.4 + 4.5.4 com.dslplatform - dsl-json-java8 + dsl-json ${dsl-json.version}
@@ -72,7 +72,7 @@ org.codehaus.mojo build-helper-maven-plugin - 3.3.0 + 3.5.0 add-source @@ -91,7 +91,7 @@ com.fizzed rocker-maven-plugin - 1.3.0 + 1.4.0 generate-rocker-templates @@ -110,7 +110,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.11.0 + 3.12.1 @@ -120,7 +120,7 @@ com.dslplatform - dsl-json-java8 + dsl-json ${dsl-json.version} @@ -130,7 +130,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.4.1 + 3.5.2 uber-jar From 6ff7a0c63ebf7b4760c1a2104d684d2bc227dabd Mon Sep 17 00:00:00 2001 From: fakeshadow <24548779@qq.com> Date: Fri, 29 Mar 2024 04:29:47 +0800 Subject: [PATCH 204/210] [xitca-web] dep update. (#8781) * [xitca-web] dep update. * add auto reconnect to db client. * fix build. --- frameworks/Rust/xitca-web/Cargo.lock | 163 +++++++++--------- frameworks/Rust/xitca-web/Cargo.toml | 12 +- frameworks/Rust/xitca-web/src/db.rs | 41 ++--- frameworks/Rust/xitca-web/src/main_sync.rs | 17 +- frameworks/Rust/xitca-web/src/main_wasm.rs | 39 ++--- frameworks/Rust/xitca-web/src/ser.rs | 1 + .../Rust/xitca-web/xitca-web-axum.dockerfile | 2 +- .../Rust/xitca-web/xitca-web-iou.dockerfile | 2 +- .../Rust/xitca-web/xitca-web-sync.dockerfile | 2 +- .../Rust/xitca-web/xitca-web-wasm.dockerfile | 2 +- .../Rust/xitca-web/xitca-web.dockerfile | 2 +- 11 files changed, 123 insertions(+), 160 deletions(-) diff --git a/frameworks/Rust/xitca-web/Cargo.lock b/frameworks/Rust/xitca-web/Cargo.lock index 865720c700c..fd001345246 100644 --- a/frameworks/Rust/xitca-web/Cargo.lock +++ b/frameworks/Rust/xitca-web/Cargo.lock @@ -149,12 +149,9 @@ checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "cc" -version = "1.0.83" +version = "1.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "libc", -] +checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" [[package]] name = "cfg-if" @@ -319,9 +316,9 @@ checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] name = "hermit-abi" -version = "0.3.4" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d3d0e0f38255e7fa3cf31335b3a56f05febd18025f4db5ef7a0cfb4f8da651f" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hmac" @@ -343,9 +340,9 @@ dependencies = [ [[package]] name = "http" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b32afd38673a8016f7c9ae69e5af41a58f81b1d31689040f2f1959594ce194ea" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" dependencies = [ "bytes", "fnv", @@ -411,9 +408,9 @@ checksum = "9028f49264629065d057f340a86acb84867925865f73bbf8d47b4d149a7e88b8" [[package]] name = "libc" -version = "0.2.152" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "lock_api" @@ -427,9 +424,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 = "matchit" @@ -461,9 +458,9 @@ checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" dependencies = [ "adler", ] @@ -486,9 +483,9 @@ checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" [[package]] name = "num-traits" -version = "0.2.17" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" dependencies = [ "autocfg", ] @@ -549,18 +546,18 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pin-project" -version = "1.1.3" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.3" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", @@ -625,9 +622,9 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.76" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ "unicode-ident", ] @@ -705,9 +702,9 @@ checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" [[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 = "sailfish" @@ -768,18 +765,18 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "serde" -version = "1.0.195" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.195" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", @@ -788,9 +785,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.111" +version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4" +checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" dependencies = [ "itoa", "ryu", @@ -866,12 +863,12 @@ dependencies = [ [[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]] @@ -893,9 +890,9 @@ checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" [[package]] name = "syn" -version = "2.0.48" +version = "2.0.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" dependencies = [ "proc-macro2", "quote", @@ -925,9 +922,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.35.1" +version = "1.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104" +checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" dependencies = [ "backtrace", "libc", @@ -935,7 +932,7 @@ dependencies = [ "num_cpus", "pin-project-lite", "signal-hook-registry", - "socket2 0.5.5", + "socket2 0.5.6", "windows-sys 0.48.0", ] @@ -971,9 +968,9 @@ dependencies = [ [[package]] name = "tower-http" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0da193277a4e2c33e59e09b5861580c33dd0a637c3883d0fa74ba40c0374af2e" +checksum = "1e9cd434a998747dd2c4276bc96ee2e0c7a2eadf3cae88e52be55a05fa9053f5" dependencies = [ "bitflags 2.4.2", "bytes", @@ -1037,9 +1034,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", ] @@ -1099,7 +1096,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.4", ] [[package]] @@ -1119,17 +1116,17 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" 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.4", + "windows_aarch64_msvc 0.52.4", + "windows_i686_gnu 0.52.4", + "windows_i686_msvc 0.52.4", + "windows_x86_64_gnu 0.52.4", + "windows_x86_64_gnullvm 0.52.4", + "windows_x86_64_msvc 0.52.4", ] [[package]] @@ -1140,9 +1137,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" +checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" [[package]] name = "windows_aarch64_msvc" @@ -1152,9 +1149,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_aarch64_msvc" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" +checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" [[package]] name = "windows_i686_gnu" @@ -1164,9 +1161,9 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_gnu" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" +checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" [[package]] name = "windows_i686_msvc" @@ -1176,9 +1173,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_i686_msvc" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" +checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" [[package]] name = "windows_x86_64_gnu" @@ -1188,9 +1185,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnu" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" +checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" [[package]] name = "windows_x86_64_gnullvm" @@ -1200,9 +1197,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_gnullvm" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" +checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" [[package]] name = "windows_x86_64_msvc" @@ -1212,15 +1209,15 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "windows_x86_64_msvc" -version = "0.52.0" +version = "0.52.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" +checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" [[package]] name = "xitca-codegen" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "185ec568d3620ab5129371e5fbfbc8c7b2791f10ed4e0ff216f8784cd896127c" +checksum = "866906a5f280481ef022ccdec1640730550304bb86b016815d9982fde2f48e3e" dependencies = [ "quote", "syn", @@ -1228,9 +1225,9 @@ dependencies = [ [[package]] name = "xitca-http" -version = "0.2.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23b15032fe8f95903c5d16d49dbf3e336c0fd7b558acc9ca385e992651b522b4" +checksum = "8b1982607f88759de96dec5b234e9cf835d6a4995e395b65a201e656d0641974" dependencies = [ "futures-core", "http", @@ -1238,7 +1235,7 @@ dependencies = [ "httpdate", "itoa", "pin-project-lite", - "socket2 0.5.5", + "socket2 0.5.6", "tokio", "tokio-uring", "tracing", @@ -1250,9 +1247,9 @@ dependencies = [ [[package]] name = "xitca-io" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e887cc8153538637515e0663704f3492803c5bb48eb7947c80689154d965b7e0" +checksum = "7581c12bcd8b2194271da2117926a577e4e974ab840c7a3f61cc187a249335c8" dependencies = [ "bytes", "tokio", @@ -1263,7 +1260,7 @@ dependencies = [ [[package]] name = "xitca-postgres" version = "0.1.0" -source = "git+https://github.com/HFQR/xitca-web.git?rev=d79f510197e0f36534fe22b7a467c55dbd683681#d79f510197e0f36534fe22b7a467c55dbd683681" +source = "git+https://github.com/HFQR/xitca-web.git?rev=13a28c51a2f6e23e4e6b96e508a8af1e5e79d0b6#13a28c51a2f6e23e4e6b96e508a8af1e5e79d0b6" dependencies = [ "fallible-iterator", "percent-encoding", @@ -1287,11 +1284,11 @@ dependencies = [ [[package]] name = "xitca-server" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d07160d17cf458adf7f38a2f7bc37ecb15732909683e614bcfe5f6ac8202bda5" +checksum = "f48656d81909cb34fcf01288cdaf2bd77848d0f0dcbdc0c429b6ed376f78f4d5" dependencies = [ - "socket2 0.5.5", + "socket2 0.5.6", "tokio", "tokio-uring", "tracing", @@ -1308,9 +1305,9 @@ checksum = "09a4a38548b14925111dd99560f0a10d1eb9e3e117fa5471c35387ed6f77b58c" [[package]] name = "xitca-unsafe-collection" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c38c5b92c72ba986bb2c2f4fc40ec56e841194773c02278f3c8d4c9733807270" +checksum = "552a6bf21a5d0dc470644cb3b99f98f44bd414cd6fcca74610465d8196b1d23e" dependencies = [ "bytes", ] @@ -1337,14 +1334,14 @@ dependencies = [ "xitca-server", "xitca-service", "xitca-unsafe-collection", - "xitca-web 0.2.1", + "xitca-web 0.4.0", ] [[package]] name = "xitca-web" -version = "0.2.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26cb7ab5765524ce47a8c173e16a3184146440e3de3c240ba0d14a617b0f090" +checksum = "cfae98470b0f55b978ebdccd1317a658590aa6fecec4db61522adaa8e6943747" dependencies = [ "futures-core", "http-body", diff --git a/frameworks/Rust/xitca-web/Cargo.toml b/frameworks/Rust/xitca-web/Cargo.toml index 9627c09a692..8717e681c50 100644 --- a/frameworks/Rust/xitca-web/Cargo.toml +++ b/frameworks/Rust/xitca-web/Cargo.toml @@ -51,18 +51,18 @@ io-uring = ["xitca-http/io-uring", "xitca-server/io-uring"] axum = ["dep:axum", "http-body", "tower", "tower-http", "xitca-web/tower-http-compat" ] [dependencies] -xitca-http = "0.2" -xitca-io = "0.1" -xitca-server = "0.1" +xitca-http = "0.4" +xitca-io = "0.2" +xitca-server = "0.2" xitca-service = "0.1" -xitca-unsafe-collection = "0.1" +xitca-unsafe-collection = "0.1.1" atoi = "2" serde = { version = "1" } serde_json = { version = "1" } # web optional -xitca-web = { version = "0.2", features = ["json"], optional = true } +xitca-web = { version = "0.4", features = ["json"], optional = true } # raw-pg optional xitca-postgres = { version = "0.1", optional = true } @@ -92,5 +92,5 @@ codegen-units = 1 panic = "abort" [patch.crates-io] -xitca-postgres = { git = "https://github.com/HFQR/xitca-web.git", rev = "d79f510197e0f36534fe22b7a467c55dbd683681" } +xitca-postgres = { git = "https://github.com/HFQR/xitca-web.git", rev = "13a28c51a2f6e23e4e6b96e508a8af1e5e79d0b6" } mio = { git = "https://github.com/fakeshadow/mio.git", rev = "52b72d372bfe5807755b7f5e3e1edf282954d6ba" } diff --git a/frameworks/Rust/xitca-web/src/db.rs b/frameworks/Rust/xitca-web/src/db.rs index 81e8094c527..755dfaacf70 100644 --- a/frameworks/Rust/xitca-web/src/db.rs +++ b/frameworks/Rust/xitca-web/src/db.rs @@ -1,6 +1,8 @@ -use std::{collections::HashMap, fmt::Write, future::IntoFuture}; +use std::{collections::HashMap, fmt::Write}; -use xitca_postgres::{statement::Statement, AsyncLendingIterator, Postgres}; +use xitca_postgres::{ + pipeline::Pipeline, statement::Statement, AsyncLendingIterator, SharedClient, +}; use xitca_unsafe_collection::no_hash::NoHashBuilder; use super::{ @@ -9,7 +11,7 @@ use super::{ }; pub struct Client { - client: xitca_postgres::Client, + client: SharedClient, #[cfg(not(feature = "pg-sync"))] rng: std::cell::RefCell, #[cfg(feature = "pg-sync")] @@ -19,27 +21,14 @@ pub struct Client { updates: HashMap, } -impl Drop for Client { - fn drop(&mut self) { - drop(self.fortune.clone().into_guarded(&self.client)); - drop(self.world.clone().into_guarded(&self.client)); - for (_, stmt) in std::mem::take(&mut self.updates) { - drop(stmt.into_guarded(&self.client)) - } - } -} - pub async fn create() -> HandleResult { - let (client, driver) = Postgres::new(DB_URL.to_string()).connect().await?; - - tokio::spawn(tokio::task::unconstrained(driver.into_future())); + let mut client = SharedClient::new(DB_URL.to_string()).await?; - let fortune = client.prepare("SELECT * FROM fortune", &[]).await?.leak(); + let fortune = client.prepare_cached("SELECT * FROM fortune", &[]).await?; let world = client - .prepare("SELECT * FROM world WHERE id=$1", &[]) - .await? - .leak(); + .prepare_cached("SELECT * FROM world WHERE id=$1", &[]) + .await?; let mut updates = HashMap::default(); @@ -59,7 +48,7 @@ pub async fn create() -> HandleResult { q.pop(); q.push(')'); - let st = client.prepare(&q, &[]).await?.leak(); + let st = client.prepare_cached(&q, &[]).await?; updates.insert(num, st); } @@ -94,11 +83,11 @@ impl Client { .try_next() .await? .map(|row| World::new(row.get_raw(0), row.get_raw(1))) - .ok_or_else(|| format!("World does not exist").into()) + .ok_or_else(|| "World does not exist".into()) } pub async fn get_worlds(&self, num: u16) -> HandleResult> { - let mut pipe = self.client.pipeline(); + let mut pipe = Pipeline::new(); { let mut rng = self.borrow_rng_mut(); @@ -108,7 +97,7 @@ impl Client { let mut worlds = Vec::new(); worlds.reserve(num as usize); - let mut res = pipe.run().await?; + let mut res = self.client.pipeline(pipe).await?; while let Some(mut item) = res.try_next().await? { while let Some(row) = item.try_next().await? { worlds.push(World::new(row.get_raw(0), row.get_raw(1))) @@ -124,7 +113,7 @@ impl Client { let mut params = Vec::new(); params.reserve(len * 3); - let mut pipe = self.client.pipeline(); + let mut pipe = Pipeline::new(); { let mut rng = self.borrow_rng_mut(); @@ -144,7 +133,7 @@ impl Client { worlds.reserve(len); let mut r_ids = params.into_iter().skip(1).step_by(2); - let mut res = pipe.run().await?; + let mut res = self.client.pipeline(pipe).await?; while let Some(mut item) = res.try_next().await? { while let Some(row) = item.try_next().await? { let r_id = r_ids.next().unwrap(); diff --git a/frameworks/Rust/xitca-web/src/main_sync.rs b/frameworks/Rust/xitca-web/src/main_sync.rs index e56f481c61d..03f6c9ea3a3 100644 --- a/frameworks/Rust/xitca-web/src/main_sync.rs +++ b/frameworks/Rust/xitca-web/src/main_sync.rs @@ -6,8 +6,9 @@ mod util; use serde::Serialize; use xitca_web::{ codegen::route, - handler::{html::Html, json::Json, query::Query, state::StateOwn}, + handler::{html::Html, json::Json, query::Query, state::StateOwn, text::Text}, http::{header::SERVER, WebResponse}, + route::get, App, }; @@ -18,8 +19,8 @@ use util::{HandleResult, SERVER_HEADER_VALUE}; fn main() -> std::io::Result<()> { App::new() .with_state(db_diesel::create()?) - .at_typed(plaintext) - .at_typed(json) + .at("/plaintext", get(Text("Hello, World!"))) + .at("/json", get(Json(ser::Message::new()))) .at_typed(db) .at_typed(fortunes) .at_typed(queries) @@ -36,16 +37,6 @@ fn header(mut res: WebResponse) -> WebResponse { res } -#[route("/plaintext", method = get)] -fn plaintext() -> &'static str { - "Hello, World!" -} - -#[route("/json", method = get)] -fn json() -> Json { - Json(ser::Message::new()) -} - #[route("/db", method = get)] fn db(StateOwn(pool): StateOwn) -> HandleResult> { pool.get_world().map(Json) diff --git a/frameworks/Rust/xitca-web/src/main_wasm.rs b/frameworks/Rust/xitca-web/src/main_wasm.rs index 0e04f650a4c..4a38435a151 100644 --- a/frameworks/Rust/xitca-web/src/main_wasm.rs +++ b/frameworks/Rust/xitca-web/src/main_wasm.rs @@ -1,46 +1,31 @@ mod ser; mod util; -use std::{env, io, net::TcpListener, os::wasi::io::FromRawFd}; - use xitca_web::{ - handler::{handler_service, json::Json}, + handler::{json::Json, text::Text}, http::{header::SERVER, WebResponse}, route::get, - service::Service, - App, WebContext, + App, }; -fn main() -> io::Result<()> { - let fd = env::var("FD_COUNT") +fn main() -> std::io::Result<()> { + let listener = std::env::var("FD_COUNT") .ok() - .and_then(|var| var.parse().ok()) + .and_then(|v| v.parse().ok()) + .map(|fd| unsafe { std::os::wasi::io::FromRawFd::from_raw_fd(fd) }) .expect("failed to parse FD_COUNT env"); - let listener = unsafe { TcpListener::from_raw_fd(fd) }; - App::new() - .at( - "/json", - get(handler_service(|| async { Json(ser::Message::new()) })), - ) - .at( - "/plaintext", - get(handler_service(|| async { "Hello, World!" })), - ) - .enclosed_fn(middleware_fn) + .at("/json", get(Json(ser::Message::new()))) + .at("/plaintext", get(Text("Hello, World!"))) + .map(header) .serve() .listen(listener)? .run() .wait() } -async fn middleware_fn(service: &S, ctx: WebContext<'_>) -> Result -where - S: for<'r> Service, Response = WebResponse, Error = E>, -{ - service.call(ctx).await.map(|mut res| { - res.headers_mut().append(SERVER, util::SERVER_HEADER_VALUE); - res - }) +fn header(mut res: WebResponse) -> WebResponse { + res.headers_mut().append(SERVER, util::SERVER_HEADER_VALUE); + res } diff --git a/frameworks/Rust/xitca-web/src/ser.rs b/frameworks/Rust/xitca-web/src/ser.rs index 52c2bc3fdab..8e15ce71671 100644 --- a/frameworks/Rust/xitca-web/src/ser.rs +++ b/frameworks/Rust/xitca-web/src/ser.rs @@ -11,6 +11,7 @@ use xitca_http::{ use crate::util::Error; +#[derive(Clone)] pub struct Message { message: &'static str, } diff --git a/frameworks/Rust/xitca-web/xitca-web-axum.dockerfile b/frameworks/Rust/xitca-web/xitca-web-axum.dockerfile index 803e8bd7976..6c0422ea4ff 100644 --- a/frameworks/Rust/xitca-web/xitca-web-axum.dockerfile +++ b/frameworks/Rust/xitca-web/xitca-web-axum.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.75 +FROM rust:1.76 ADD ./ /xitca-web WORKDIR /xitca-web diff --git a/frameworks/Rust/xitca-web/xitca-web-iou.dockerfile b/frameworks/Rust/xitca-web/xitca-web-iou.dockerfile index 77fa783f748..35e53b29db8 100644 --- a/frameworks/Rust/xitca-web/xitca-web-iou.dockerfile +++ b/frameworks/Rust/xitca-web/xitca-web-iou.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.75 +FROM rust:1.76 ADD ./ /xitca-web WORKDIR /xitca-web diff --git a/frameworks/Rust/xitca-web/xitca-web-sync.dockerfile b/frameworks/Rust/xitca-web/xitca-web-sync.dockerfile index 8494f086a57..93f848de2ec 100644 --- a/frameworks/Rust/xitca-web/xitca-web-sync.dockerfile +++ b/frameworks/Rust/xitca-web/xitca-web-sync.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.75 +FROM rust:1.76 ADD ./ /xitca-web WORKDIR /xitca-web diff --git a/frameworks/Rust/xitca-web/xitca-web-wasm.dockerfile b/frameworks/Rust/xitca-web/xitca-web-wasm.dockerfile index f89125def21..d5611eb092d 100644 --- a/frameworks/Rust/xitca-web/xitca-web-wasm.dockerfile +++ b/frameworks/Rust/xitca-web/xitca-web-wasm.dockerfile @@ -1,7 +1,7 @@ ARG WASMTIME_VERSION=15.0.0 ARG WASM_TARGET=wasm32-wasi-preview1-threads -FROM rust:1.75 AS compile +FROM rust:1.76 AS compile ARG WASMTIME_VERSION ARG WASM_TARGET diff --git a/frameworks/Rust/xitca-web/xitca-web.dockerfile b/frameworks/Rust/xitca-web/xitca-web.dockerfile index a7eba25eb39..88ff778663c 100644 --- a/frameworks/Rust/xitca-web/xitca-web.dockerfile +++ b/frameworks/Rust/xitca-web/xitca-web.dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.75 +FROM rust:1.76 ADD ./ /xitca-web WORKDIR /xitca-web From 46f68aeccda87c50a862749cdbf4894748aa094b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Ros?= Date: Thu, 28 Mar 2024 13:30:41 -0700 Subject: [PATCH 205/210] Use stable toolchain (#8812) --- frameworks/Rust/actix/rust-toolchain.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Rust/actix/rust-toolchain.toml b/frameworks/Rust/actix/rust-toolchain.toml index 5d56faf9ae0..292fe499e3b 100644 --- a/frameworks/Rust/actix/rust-toolchain.toml +++ b/frameworks/Rust/actix/rust-toolchain.toml @@ -1,2 +1,2 @@ [toolchain] -channel = "nightly" +channel = "stable" From 992aa4565d43e18eab76b5eafe998b1b995703d0 Mon Sep 17 00:00:00 2001 From: Anton Kirilov Date: Fri, 29 Mar 2024 17:14:18 +0000 Subject: [PATCH 206/210] Update H2O to revision 18b175f71 (#8826) --- frameworks/C/h2o/h2o.dockerfile | 6 +++++- frameworks/PHP/php/php-h2o.dockerfile | 6 +++++- frameworks/Ruby/h2o_mruby/h2o_mruby.dockerfile | 4 +++- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/frameworks/C/h2o/h2o.dockerfile b/frameworks/C/h2o/h2o.dockerfile index 93c5875472a..86ae416dd77 100644 --- a/frameworks/C/h2o/h2o.dockerfile +++ b/frameworks/C/h2o/h2o.dockerfile @@ -13,6 +13,7 @@ RUN apt-get -yqq update && \ curl \ flex \ g++ \ + libbpfcc-dev \ libbrotli-dev \ libcap-dev \ libicu-dev \ @@ -27,9 +28,11 @@ RUN apt-get -yqq update && \ make \ ninja-build \ pkg-config \ + rsync \ + ruby \ systemtap-sdt-dev -ARG H2O_VERSION=13ba727ad12dfb2338165d2bcfb2136457e33c8a +ARG H2O_VERSION=18b175f71ede08b50d3e5ae8303dacef3ea510fc WORKDIR /tmp/h2o-build RUN curl -LSs "https://github.com/h2o/h2o/archive/${H2O_VERSION}.tar.gz" | \ @@ -39,6 +42,7 @@ RUN curl -LSs "https://github.com/h2o/h2o/archive/${H2O_VERSION}.tar.gz" | \ -DCMAKE_AR=/usr/bin/gcc-ar \ -DCMAKE_C_FLAGS="-flto -march=native -mtune=native" \ -DCMAKE_RANLIB=/usr/bin/gcc-ranlib \ + -DWITH_MRUBY=on \ -G Ninja \ -S . && \ cmake --build build -j && \ diff --git a/frameworks/PHP/php/php-h2o.dockerfile b/frameworks/PHP/php/php-h2o.dockerfile index 2d0c6234bcd..cd73427a08e 100644 --- a/frameworks/PHP/php/php-h2o.dockerfile +++ b/frameworks/PHP/php/php-h2o.dockerfile @@ -4,7 +4,7 @@ ARG H2O_PREFIX=/opt/h2o FROM "ubuntu:${UBUNTU_VERSION}" AS compile -ARG H2O_VERSION=13ba727ad12dfb2338165d2bcfb2136457e33c8a +ARG H2O_VERSION=18b175f71ede08b50d3e5ae8303dacef3ea510fc ARG DEBIAN_FRONTEND=noninteractive ARG H2O_PREFIX @@ -14,6 +14,7 @@ RUN apt-get -yqq update && \ cmake \ curl \ g++ \ + libbpfcc-dev \ libbrotli-dev \ libcap-dev \ libssl-dev \ @@ -23,6 +24,8 @@ RUN apt-get -yqq update && \ libz-dev \ ninja-build \ pkg-config \ + rsync \ + ruby \ systemtap-sdt-dev && \ curl -LSs "https://github.com/h2o/h2o/archive/${H2O_VERSION}.tar.gz" | \ tar --strip-components=1 -xz && \ @@ -32,6 +35,7 @@ RUN apt-get -yqq update && \ -DCMAKE_C_FLAGS="-flto -march=native -mtune=native" \ -DCMAKE_INSTALL_PREFIX="${H2O_PREFIX}" \ -DCMAKE_RANLIB=/usr/bin/gcc-ranlib \ + -DWITH_MRUBY=on \ -G Ninja \ -S . && \ cmake --build build -j && \ diff --git a/frameworks/Ruby/h2o_mruby/h2o_mruby.dockerfile b/frameworks/Ruby/h2o_mruby/h2o_mruby.dockerfile index 9b7c57be690..3274f168c87 100644 --- a/frameworks/Ruby/h2o_mruby/h2o_mruby.dockerfile +++ b/frameworks/Ruby/h2o_mruby/h2o_mruby.dockerfile @@ -4,7 +4,7 @@ ARG H2O_PREFIX=/opt/h2o FROM "ubuntu:${UBUNTU_VERSION}" AS compile -ARG H2O_VERSION=13ba727ad12dfb2338165d2bcfb2136457e33c8a +ARG H2O_VERSION=18b175f71ede08b50d3e5ae8303dacef3ea510fc ARG DEBIAN_FRONTEND=noninteractive ARG H2O_PREFIX @@ -14,6 +14,7 @@ RUN apt-get -yqq update && \ cmake \ curl \ g++ \ + libbpfcc-dev \ libbrotli-dev \ libcap-dev \ libssl-dev \ @@ -23,6 +24,7 @@ RUN apt-get -yqq update && \ libz-dev \ ninja-build \ pkg-config \ + rsync \ ruby \ systemtap-sdt-dev && \ curl -LSs "https://github.com/h2o/h2o/archive/${H2O_VERSION}.tar.gz" | \ From a49db36d8f1affd40cef2cebd5e4e6ff6536350b Mon Sep 17 00:00:00 2001 From: Jeremy Kuhn Date: Fri, 29 Mar 2024 22:17:49 +0100 Subject: [PATCH 207/210] Upgrade to Inverno 1.7.0 (#8766) * Inverno framework test * Remove unused code * Optimization * remove db.sql * Upgrade to Inverno 1.2.2 * Upgrade to Inverno 1.4.1 * Update README.md * Upgrade to Inverno 1.6.2 * Add missing binutils when building docker images * Fix inverno postgres CMD * Upgrade to Inverno 1.7.0 --- frameworks/Java/inverno/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/inverno/pom.xml b/frameworks/Java/inverno/pom.xml index e394d645fad..40158dba480 100644 --- a/frameworks/Java/inverno/pom.xml +++ b/frameworks/Java/inverno/pom.xml @@ -6,7 +6,7 @@ io.inverno.dist inverno-parent - 1.6.2 + 1.7.0 com.techempower inverno-benchmark From 63f79fbb91a27fe8a8554582dda67a60ce427863 Mon Sep 17 00:00:00 2001 From: Dragos Varovici Date: Fri, 29 Mar 2024 15:18:01 -0600 Subject: [PATCH 208/210] Add Zig zap framework (#8791) * Zig zap framework * Zig zap framework db and fortune tests * Zig zap framework fortunes --- frameworks/Zig/zap/.gitignore | 2 + frameworks/Zig/zap/README.md | 25 ++ frameworks/Zig/zap/benchmark_config.json | 26 ++ frameworks/Zig/zap/build.zig | 99 +++++++ frameworks/Zig/zap/build.zig.zon | 21 ++ frameworks/Zig/zap/run.sh | 3 + frameworks/Zig/zap/src/endpoints.zig | 334 +++++++++++++++++++++++ frameworks/Zig/zap/src/main.zig | 95 +++++++ frameworks/Zig/zap/src/middleware.zig | 129 +++++++++ frameworks/Zig/zap/src/pool.zig | 78 ++++++ frameworks/Zig/zap/zap.dockerfile | 42 +++ 11 files changed, 854 insertions(+) create mode 100644 frameworks/Zig/zap/.gitignore create mode 100644 frameworks/Zig/zap/README.md create mode 100644 frameworks/Zig/zap/benchmark_config.json create mode 100644 frameworks/Zig/zap/build.zig create mode 100644 frameworks/Zig/zap/build.zig.zon create mode 100644 frameworks/Zig/zap/run.sh create mode 100644 frameworks/Zig/zap/src/endpoints.zig create mode 100644 frameworks/Zig/zap/src/main.zig create mode 100644 frameworks/Zig/zap/src/middleware.zig create mode 100644 frameworks/Zig/zap/src/pool.zig create mode 100644 frameworks/Zig/zap/zap.dockerfile diff --git a/frameworks/Zig/zap/.gitignore b/frameworks/Zig/zap/.gitignore new file mode 100644 index 00000000000..170dc0f1403 --- /dev/null +++ b/frameworks/Zig/zap/.gitignore @@ -0,0 +1,2 @@ +zig-cache/**/*', +zig-out: 'zig-out/**/*', diff --git a/frameworks/Zig/zap/README.md b/frameworks/Zig/zap/README.md new file mode 100644 index 00000000000..71117a3400c --- /dev/null +++ b/frameworks/Zig/zap/README.md @@ -0,0 +1,25 @@ + +# [Zap](https://github.com/zigzap/zap) - Blazingly fast backends in zig + +## Description + +Zap is the zig microframework for web applications. + +## Test URLs + +### Test 1: JSON Encoding + + http://localhost:3000/json + +### Test 2: Plaintext + + http://localhost:3000/plaintext + +### Test 2: Single Row Query + + http://localhost:3000/db + +### Test 4: Fortunes (Template rendering) + + http://localhost:3000/fortunes + diff --git a/frameworks/Zig/zap/benchmark_config.json b/frameworks/Zig/zap/benchmark_config.json new file mode 100644 index 00000000000..0b77f27d77d --- /dev/null +++ b/frameworks/Zig/zap/benchmark_config.json @@ -0,0 +1,26 @@ +{ + "framework": "zap", + "tests": [{ + "default": { + "json_url": "/json", + "db_url": "/db", + "fortune_url": "/fortunes", + "plaintext_url": "/plaintext", + "port": 3000, + "approach": "Realistic", + "classification": "Fullstack", + "database": "Postgres", + "framework": "Zap", + "language": "Zig", + "flavor": "None", + "orm": "Full", + "platform": "None", + "webserver": "None", + "os": "Linux", + "database_os": "Linux", + "display_name": "Zap (Zig)", + "notes": "", + "versus": "" + } + }] +} diff --git a/frameworks/Zig/zap/build.zig b/frameworks/Zig/zap/build.zig new file mode 100644 index 00000000000..70c740351a1 --- /dev/null +++ b/frameworks/Zig/zap/build.zig @@ -0,0 +1,99 @@ +const std = @import("std"); + +// Although this function looks imperative, note that its job is to +// declaratively construct a build graph that will be executed by an external +// runner. +pub fn build(b: *std.Build) void { + // Standard target options allows the person running `zig build` to choose + // what target to build for. Here we do not override the defaults, which + // means any target is allowed, and the default is native. Other options + // for restricting supported target set are available. + const target = b.standardTargetOptions(.{}); + + // Standard optimization options allow the person running `zig build` to select + // between Debug, ReleaseSafe, ReleaseFast, and ReleaseSmall. Here we do nots + // set a preferred release mode, allowing the user to decide how to optimize. + const optimize = b.standardOptimizeOption(.{}); + + const exe = b.addExecutable(.{ + .name = "zap", + // In this case the main source file is merely a path, however, in more + // complicated build scripts, this could be a generated file. + .root_source_file = .{ .path = "src/main.zig" }, + .target = target, + .optimize = optimize, + }); + + //exe.addPackagePath("random", "src/random.zig"); + + const zap = b.dependency("zap", .{ + .target = target, + .optimize = optimize, + .openssl = false, // set to true to enable TLS support + }); + exe.addModule("zap", zap.module("zap")); + + const pg = b.dependency("pg", .{ + .target = target, + .optimize = optimize, + }); + exe.addModule("pg", pg.module("pg")); + + const dig = b.dependency("dig", .{ + .target = target, + .optimize = optimize, + }); + exe.addModule("dns", dig.module("dns")); + + // const mustache = b.dependency("mustache", .{ + // .target = target, + // .optimize = optimize, + // }); + // exe.addModule("mustache", mustache.module("mustache")); + + exe.linkLibrary(zap.artifact("facil.io")); + + // This declares intent for the executable to be installed into the + // standard location when the user invokes the "install" step (the default + // step when running `zig build`). + b.installArtifact(exe); + + // This *creates* a Run step in the build graph, to be executed when another + // step is evaluated that depends on it. The next line below will establish + // such a dependency. + const run_cmd = b.addRunArtifact(exe); + + // By making the run step depend on the install step, it will be run from the + // installation directory rather than directly from within the cache directory. + // This is not necessary, however, if the application depends on other installed + // files, this ensures they will be present and in the expected location. + run_cmd.step.dependOn(b.getInstallStep()); + + // This allows the user to pass arguments to the application in the build + // command itself, like this: `zig build run -- arg1 arg2 etc` + if (b.args) |args| { + run_cmd.addArgs(args); + } + + // This creates a build step. It will be visible in the `zig build --help` menu, + // and can be selected like this: `zig build run` + // This will evaluate the `run` step rather than the default, which is "install". + const run_step = b.step("run", "Run the app"); + run_step.dependOn(&run_cmd.step); + + // Creates a step for unit testing. This only builds the test executable + // but does not run it. + const unit_tests = b.addTest(.{ + .root_source_file = .{ .path = "src/main.zig" }, + .target = target, + .optimize = optimize, + }); + + const run_unit_tests = b.addRunArtifact(unit_tests); + + // Similar to creating the run step earlier, this exposes a `test` step to + // the `zig build --help` menu, providing a way for the user to request + // running the unit tests. + const test_step = b.step("test", "Run unit tests"); + test_step.dependOn(&run_unit_tests.step); +} diff --git a/frameworks/Zig/zap/build.zig.zon b/frameworks/Zig/zap/build.zig.zon new file mode 100644 index 00000000000..3abfe719e55 --- /dev/null +++ b/frameworks/Zig/zap/build.zig.zon @@ -0,0 +1,21 @@ +.{ + .name = "Zap testing", + .version = "0.1.0", + + .dependencies = .{ + // zap v0.5.1 + .zap = .{ + .url = "https://github.com/zigzap/zap/archive/refs/tags/v0.5.1.tar.gz", + .hash = "1220d4802fb09d4e99c0e7265f90d6f3cfdc3e5e31c1b05f0924ee2dd26d9d6dbbf4", + }, + .pg = .{ + .url = "https://github.com/karlseguin/pg.zig/archive/f3f4a0b3b9996bfb1bf9bd0bdd0d73b36e915a86.tar.gz", + .hash = "1220337202642ee66408a35f254549f22cf3a096c6fa6c28e6f87a0161d5a6c0f4ab" + }, + .dig = .{ + .url = "https://github.com/lun-4/zigdig/archive/2ec407ec3c7f347e747717977958e9ba339eb82f.tar.gz", + .hash = "1220dfdb3089dfe9a4e4bc1226fcff08d91d0c0853f287d98d8b81270da251790331" + }, + + } +} \ No newline at end of file diff --git a/frameworks/Zig/zap/run.sh b/frameworks/Zig/zap/run.sh new file mode 100644 index 00000000000..95c2266e8bd --- /dev/null +++ b/frameworks/Zig/zap/run.sh @@ -0,0 +1,3 @@ +echo "Waiting for ZAP to start..." + +zap \ No newline at end of file diff --git a/frameworks/Zig/zap/src/endpoints.zig b/frameworks/Zig/zap/src/endpoints.zig new file mode 100644 index 00000000000..aeeffbf4e0a --- /dev/null +++ b/frameworks/Zig/zap/src/endpoints.zig @@ -0,0 +1,334 @@ +const std = @import("std"); +const zap = @import("zap"); +const pg = @import("pg"); + +const Mustache = @import("zap").Mustache; +const Thread = std.Thread; +const Mutex = Thread.Mutex; + +const middleware = @import("middleware.zig"); + +const Message = struct { + message: []const u8, +}; + +const World = struct { + id: i32, + randomNumber: i32, +}; + +const Fortune = struct { + id: i32, + message: []const u8, +}; + +pub const FortunesEndpoint = struct { + ep: zap.Endpoint = undefined, + mustache: Mustache, + mutex: Mutex, + + const Self = @This(); + + pub fn init() Self { + const template = "Fortunes{{#fortunes}}{{/fortunes}}
idmessage
{{id}}{{message}}
"; + const mustache = Mustache.fromData(template) catch unreachable; + + return .{ + .ep = zap.Endpoint.init(.{ + .path = "/fortunes", + .get = get, + }), + .mustache = mustache, + .mutex = Mutex{}, + }; + } + + pub fn deinit(self: *Self) void { + self.mustache.deinit(); + } + + pub fn endpoint(self: *Self) *zap.Endpoint { + return &self.ep; + } + + fn compareStrings(_: void, lhs: []const u8, rhs: []const u8) bool { + return std.mem.order(u8, lhs, rhs).compare(std.math.CompareOperator.lt); + } + + fn cmpFortuneByMessage(_: void, a: Fortune, b: Fortune) bool { + return std.mem.order(u8, a.message, b.message).compare(std.math.CompareOperator.lt); + } + + fn getFortunes(pool: *pg.Pool) ![]const Fortune { + var conn = try pool.acquire(); + defer conn.release(); + + var rows = try conn.query("SELECT id, message FROM Fortune", .{}); + rows.deinit(); + + var fortunes = std.ArrayList(Fortune).init(middleware.SharedAllocator.getAllocator()); + defer fortunes.deinit(); + + while (try rows.next()) |row| { + var fortune = Fortune{ .id = row.get(i32, 0), .message = row.get([]const u8, 1) }; + _ = try fortunes.append(fortune); + } + + var fortune = Fortune{ .id = 0, .message = "Additional fortune added at request time." }; + _ = try fortunes.append(fortune); + + var fortunes_slice = try fortunes.toOwnedSlice(); + std.mem.sort(Fortune, fortunes_slice, {}, cmpFortuneByMessage); + + return fortunes_slice; + } + + fn getFortunesHtml(self: *Self, pool: *pg.Pool) ![]const u8 { + var fortunes = try getFortunes(pool); + + self.mutex.lock(); + const ret = self.mustache.build(.{ .fortunes = fortunes }); + defer ret.deinit(); + self.mutex.unlock(); + + const raw = ret.str().?; + + // std.debug.print("mustache output {s}\n", .{raw}); + + var html = try deescapeHtml(raw); + + // std.debug.print("html output {s}\n", .{html}); + + return html; + } + + pub fn get(ep: *zap.Endpoint, req: zap.Request) void { + const self = @fieldParentPtr(Self, "ep", ep); + + if (!checkPath(ep, req)) return; + + req.setHeader("content-type", "text/html; charset=utf-8") catch return; + + var pool: *pg.Pool = undefined; + + const maybe_context: ?*middleware.Context = req.getUserContext(middleware.Context); + if (maybe_context) |context| { + if (context.pg) |cpg| { + pool = cpg.pool; + } + } + + var fortunes_html = getFortunesHtml(self, pool) catch return; + + req.sendBody(fortunes_html) catch return; + + return; + } +}; + +pub const DbEndpoint = struct { + ep: zap.Endpoint = undefined, + mutex: Mutex, + const Self = @This(); + + pub fn init() Self { + return .{ + .ep = zap.Endpoint.init(.{ + .path = "/db", + .get = get, + }), + .mutex = Mutex{}, + }; + } + + pub fn endpoint(self: *Self) *zap.Endpoint { + return &self.ep; + } + + pub fn get(ep: *zap.Endpoint, req: zap.Request) void { + const self = @fieldParentPtr(Self, "ep", ep); + + if (!checkPath(ep, req)) return; + + req.setContentType(.JSON) catch return; + + var random_number: u32 = 0; + var pool: *pg.Pool = undefined; + + const maybe_context: ?*middleware.Context = req.getUserContext(middleware.Context); + if (maybe_context) |context| { + if (context.prng) |prng| { + if (context.pg) |cpg| { + pool = cpg.pool; + + self.mutex.lock(); + random_number = 1 + (prng.rnd.random().uintAtMost(u32, 9999)); + self.mutex.unlock(); + } + } + } + + // std.debug.print("Attempting to return random: {}\n", .{random_number}); + + if (random_number == 0) { + return; + } + + var conn = pool.acquire() catch return; + defer conn.release(); + + var row_result = conn.row("SELECT id, randomNumber FROM World WHERE id = $1", .{random_number}) catch |err| { + std.debug.print("Error querying database: {}\n", .{err}); + return; + }; + var row = row_result.?; + defer row.deinit(); + + var world = World{ .id = row.get(i32, 0), .randomNumber = row.get(i32, 1) }; + + var buf: [100]u8 = undefined; + var json_to_send: []const u8 = undefined; + if (zap.stringifyBuf(&buf, world, .{})) |json_message| { + json_to_send = json_message; + } else { + json_to_send = "null"; + } + + req.sendBody(json_to_send) catch return; + + return; + } +}; + +pub const PlaintextEndpoint = struct { + ep: zap.Endpoint = undefined, + const Self = @This(); + + pub fn init() Self { + return .{ + .ep = zap.Endpoint.init(.{ + .path = "/plaintext", + .get = get, + }), + }; + } + + pub fn endpoint(self: *Self) *zap.Endpoint { + return &self.ep; + } + + pub fn get(ep: *zap.Endpoint, req: zap.Request) void { + const self = @fieldParentPtr(Self, "ep", ep); + _ = self; + + if (!checkPath(ep, req)) return; + + req.setContentType(.TEXT) catch return; + + req.sendBody("Hello, World!") catch return; + return; + } +}; + +pub const JsonEndpoint = struct { + ep: zap.Endpoint = undefined, + const Self = @This(); + + pub fn init() Self { + return .{ + .ep = zap.Endpoint.init(.{ + .path = "/json", + .get = get, + }), + }; + } + + pub fn endpoint(self: *Self) *zap.Endpoint { + return &self.ep; + } + + pub fn get(ep: *zap.Endpoint, req: zap.Request) void { + const self = @fieldParentPtr(Self, "ep", ep); + _ = self; + + if (!checkPath(ep, req)) return; + + req.setContentType(.JSON) catch return; + + var message = Message{ .message = "Hello, World!" }; + + var buf: [100]u8 = undefined; + var json_to_send: []const u8 = undefined; + if (zap.stringifyBuf(&buf, message, .{})) |json_message| { + json_to_send = json_message; + } else { + json_to_send = "null"; + } + + req.sendBody(json_to_send) catch return; + return; + } +}; + +fn checkPath(ep: *zap.Endpoint, req: zap.Request) bool { + if (!std.mem.eql(u8, ep.settings.path, req.path.?)) { + // std.debug.print("Path mismatch: {s} != {s}\n", .{ ep.settings.path, req.path.? }); + + return false; + } + + // std.debug.print("Path match: {s} == {s}\n", .{ ep.settings.path, req.path.? }); + + return true; +} + +fn deescapeHtml(input: []const u8) ![]const u8 { + var output = std.ArrayList(u8).init(middleware.SharedAllocator.getAllocator()); + defer output.deinit(); + + var i: usize = 0; + while (i < input.len) { + if (std.mem.startsWith(u8, input[i..], " ")) { + try output.append(' '); + i += 5; + } else if (std.mem.startsWith(u8, input[i..], """)) { + try output.append('"'); + i += 5; + } else if (std.mem.startsWith(u8, input[i..], "&")) { + try output.append('&'); + i += 5; + } else if (std.mem.startsWith(u8, input[i..], "'")) { + try output.append('\''); + i += 5; + } else if (std.mem.startsWith(u8, input[i..], "(")) { + try output.append('('); + i += 5; + } else if (std.mem.startsWith(u8, input[i..], ")")) { + try output.append(')'); + i += 5; + } else if (std.mem.startsWith(u8, input[i..], "+")) { + try output.append('+'); + i += 5; + } else if (std.mem.startsWith(u8, input[i..], ",")) { + try output.append(','); + i += 5; + } else if (std.mem.startsWith(u8, input[i..], ".")) { + try output.append('.'); + i += 5; + } else if (std.mem.startsWith(u8, input[i..], "/")) { + try output.append('/'); + i += 5; + } else if (std.mem.startsWith(u8, input[i..], ":")) { + try output.append(':'); + i += 5; + } else if (std.mem.startsWith(u8, input[i..], ";")) { + try output.append(';'); + i += 5; + } else { + try output.append(input[i]); + i += 1; + } + } + + return output.toOwnedSlice(); +} diff --git a/frameworks/Zig/zap/src/main.zig b/frameworks/Zig/zap/src/main.zig new file mode 100644 index 00000000000..489fb5d5b7e --- /dev/null +++ b/frameworks/Zig/zap/src/main.zig @@ -0,0 +1,95 @@ +const std = @import("std"); +const zap = @import("zap"); +const pg = @import("pg"); +const regex = @import("regex"); +const dns = @import("dns"); +const pool = @import("pool.zig"); + +const endpoints = @import("endpoints.zig"); +const middleware = @import("middleware.zig"); + +const RndGen = std.rand.DefaultPrng; +const Allocator = std.mem.Allocator; +const Pool = pg.Pool; + +pub fn main() !void { + var gpa = std.heap.GeneralPurposeAllocator(.{ + .thread_safe = true, + }){}; + + var tsa = std.heap.ThreadSafeAllocator{ + .child_allocator = gpa.allocator(), + }; + + var allocator = tsa.allocator(); + + var pg_pool = try pool.initPool(allocator); + defer pg_pool.deinit(); + + var rnd = std.rand.DefaultPrng.init(blk: { + var seed: u64 = undefined; + try std.os.getrandom(std.mem.asBytes(&seed)); + break :blk seed; + }); + + middleware.SharedAllocator.init(allocator); + + // create the endpoint + var dbEndpoint = endpoints.DbEndpoint.init(); + var plaintextEndpoint = endpoints.PlaintextEndpoint.init(); + var jsonEndpoint = endpoints.JsonEndpoint.init(); + var fortunesEndpoint = endpoints.FortunesEndpoint.init(); + + // we wrap the endpoint with a middleware handler + var jsonEndpointHandler = zap.Middleware.EndpointHandler(middleware.Handler, middleware.Context).init( + jsonEndpoint.endpoint(), // the endpoint + null, // no other handler (we are the last in the chain) + false, // break on finish. See EndpointHandler for this. Not applicable here. + ); + + var plaintextEndpointHandler = zap.Middleware.EndpointHandler(middleware.Handler, middleware.Context).init( + plaintextEndpoint.endpoint(), + jsonEndpointHandler.getHandler(), + false, + ); + + var fortunesEndpointHandler = zap.Middleware.EndpointHandler(middleware.Handler, middleware.Context).init( + fortunesEndpoint.endpoint(), // the endpoint + plaintextEndpointHandler.getHandler(), // no other handler (we are the last in the chain) + false, + ); + + var dbEndpointHandler = zap.Middleware.EndpointHandler(middleware.Handler, middleware.Context).init( + dbEndpoint.endpoint(), // the endpoint + fortunesEndpointHandler.getHandler(), // no other handler (we are the last in the chain) + false, + ); + + var headerHandler = middleware.HeaderMiddleWare.init(dbEndpointHandler.getHandler()); + var prngHandler = middleware.PrngMiddleWare.init(headerHandler.getHandler(), &rnd); + var pgHandler = middleware.PgMiddleWare.init(prngHandler.getHandler(), pg_pool); + + var listener = try zap.Middleware.Listener(middleware.Context).init( + .{ + .on_request = null, // must be null + .port = 3000, + .log = false, + .max_clients = 100000, + }, + pgHandler.getHandler(), + + middleware.SharedAllocator.getAllocator, + ); + try listener.listen(); + + const cpuCount = @as(i16, @intCast(std.Thread.getCpuCount() catch 1)); + + std.debug.print("Listening on 0.0.0.0:3000 on {d} threads\n", .{cpuCount}); + + // start worker threads + zap.start(.{ + .threads = 16 * cpuCount, + .workers = 1, + }); +} + diff --git a/frameworks/Zig/zap/src/middleware.zig b/frameworks/Zig/zap/src/middleware.zig new file mode 100644 index 00000000000..20c01b7ffde --- /dev/null +++ b/frameworks/Zig/zap/src/middleware.zig @@ -0,0 +1,129 @@ +const std = @import("std"); +const zap = @import("zap"); +const pg = @import("pg"); + +// just a way to share our allocator via callback +pub const SharedAllocator = struct { + // static + var allocator: std.mem.Allocator = undefined; + + const Self = @This(); + + // just a convenience function + pub fn init(a: std.mem.Allocator) void { + allocator = a; + } + + // static function we can pass to the listener later + pub fn getAllocator() std.mem.Allocator { + return allocator; + } +}; + +// create a combined context struct +pub const Context = struct { + prng: ?PrngMiddleWare.Prng = null, + pg: ?PgMiddleWare.Pg = null, +}; + +pub const Handler = zap.Middleware.Handler(Context); + +pub const HeaderMiddleWare = struct { + handler: Handler, + + const Self = @This(); + + pub fn init(other: ?*Handler) Self { + return .{ + .handler = Handler.init(onRequest, other), + }; + } + + // we need the handler as a common interface to chain stuff + pub fn getHandler(self: *Self) *Handler { + return &self.handler; + } + + // note that the first parameter is of type *Handler, not *Self !!! + pub fn onRequest(handler: *Handler, req: zap.Request, context: *Context) bool { + // this is how we would get our self pointer + var self = @fieldParentPtr(Self, "handler", handler); + _ = self; + + req.setHeader("Server", "Zap") catch return false; + + // continue in the chain + return handler.handleOther(req, context); + } +}; + +pub const PrngMiddleWare = struct { + handler: Handler, + rnd: *std.rand.DefaultPrng, + + const Self = @This(); + + const Prng = struct { + rnd: *std.rand.DefaultPrng = undefined, + }; + + pub fn init(other: ?*Handler, rnd: *std.rand.DefaultPrng) Self { + return .{ + .handler = Handler.init(onRequest, other), + .rnd = rnd, + }; + } + + // we need the handler as a common interface to chain stuff + pub fn getHandler(self: *Self) *Handler { + return &self.handler; + } + + // note that the first parameter is of type *Handler, not *Self !!! + pub fn onRequest(handler: *Handler, req: zap.Request, context: *Context) bool { + + // this is how we would get our self pointer + var self = @fieldParentPtr(Self, "handler", handler); + + context.prng = Prng{ .rnd = self.rnd }; + + // continue in the chain + return handler.handleOther(req, context); + } +}; + +pub const PgMiddleWare = struct { + handler: Handler, + pool: *pg.Pool, + + const Self = @This(); + + const Pg = struct { + pool: *pg.Pool = undefined, + }; + + pub fn init(other: ?*Handler, pool: *pg.Pool) Self { + return .{ + .handler = Handler.init(onRequest, other), + .pool = pool, + }; + } + + // we need the handler as a common interface to chain stuff + pub fn getHandler(self: *Self) *Handler { + return &self.handler; + } + + // note that the first parameter is of type *Handler, not *Self !!! + pub fn onRequest(handler: *Handler, req: zap.Request, context: *Context) bool { + + // this is how we would get our self pointer + var self = @fieldParentPtr(Self, "handler", handler); + + // do our work: fill in the user field of the context + context.pg = Pg{ .pool = self.pool }; + + // continue in the chain + return handler.handleOther(req, context); + } +}; diff --git a/frameworks/Zig/zap/src/pool.zig b/frameworks/Zig/zap/src/pool.zig new file mode 100644 index 00000000000..7241780a464 --- /dev/null +++ b/frameworks/Zig/zap/src/pool.zig @@ -0,0 +1,78 @@ +const std = @import("std"); +const pg = @import("pg"); +const regex = @import("regex"); +const dns = @import("dns"); + +const Allocator = std.mem.Allocator; +const Pool = pg.Pool; +const ArrayList = std.ArrayList; +const Regex = regex.Regex; + +pub fn initPool(allocator: Allocator) !*pg.Pool { + const info = try parsePostgresConnStr(); + std.debug.print("Cconnection info: {s}:{s}@{s}:{d}/{s}\n", .{ info.username, info.password, info.hostname, info.port, info.database }); + + const hostname = std.os.getenv("PG_HOST") orelse "localhost"; + var addresses = try dns.helpers.getAddressList(hostname, allocator); + defer addresses.deinit(); + + var hostAddress = std.net.Address.parseIp("127.0.0.1", 0) catch unreachable; + + for (addresses.addrs) |address| { + hostAddress = address; + } + + std.debug.print("tfb hostname {}\n", .{hostAddress.in}); + + const host = try addressAsString(hostAddress); + + var pg_pool = try Pool.init(allocator, .{ .size = 28, .connect = .{ + .port = info.port, + .host = host, + }, .auth = .{ + .username = info.username, + .database = info.database, + .password = info.password, + }, .timeout = 10_000,}); + + return pg_pool; +} + +pub const ConnectionInfo = struct { + username: []const u8, + password: []const u8, + hostname: []const u8, + port: u16, + database: []const u8, +}; + +fn addressAsString(address: std.net.Address) ![]const u8 { + const bytes = @as(*const [4]u8, @ptrCast(&address.in.sa.addr)); + + var buffer: [256]u8 = undefined; + var source = std.io.StreamSource{ .buffer = std.io.fixedBufferStream(&buffer) }; + var writer = source.writer(); + + //try writer.writeAll("Hello, World!"); + + try writer.print("{}.{}.{}.{}", .{ + bytes[0], + bytes[1], + bytes[2], + bytes[3], + }); + + const output = source.buffer.getWritten(); + + return output; +} + +fn parsePostgresConnStr() !ConnectionInfo { + return ConnectionInfo{ + .username = std.os.getenv("PG_USER") orelse "benchmarkdbuser", + .password = std.os.getenv("PG_PASS") orelse "benchmarkdbpass", + .hostname = std.os.getenv("PG_HOST") orelse "localhost", // , + .port = try std.fmt.parseInt(u16, std.os.getenv("PG_PORT") orelse "5432", 0), + .database = std.os.getenv("PG_DB") orelse "hello_world", + }; +} diff --git a/frameworks/Zig/zap/zap.dockerfile b/frameworks/Zig/zap/zap.dockerfile new file mode 100644 index 00000000000..580f037bcef --- /dev/null +++ b/frameworks/Zig/zap/zap.dockerfile @@ -0,0 +1,42 @@ +#FROM ziglang/static-base:llvm15-aarch64-3 as build +FROM buddyspencer/ziglang:0.11.0-r3 as build + +WORKDIR /zap + +COPY src src + +COPY build.zig.zon build.zig.zon +COPY build.zig build.zig + +RUN apk update +RUN apk add yaml-dev sqlite-dev +RUN apk add bind-tools +RUN apk add --no-cache bash +RUN dig +short localhost | head -n 1 +RUN zig build -Doptimize=ReleaseFast --prefix-exe-dir /usr/bin +RUN zig version +RUN ls + +EXPOSE 3000 + +CMD ["sh", "run.sh"] + +FROM alpine:3.19 + +WORKDIR /zap + +ENV PG_USER=benchmarkdbuser +ENV PG_PASS=benchmarkdbpass +ENV PG_DB=hello_world +ENV PG_HOST=tfb-database +ENV PG_PORT=5432 + +COPY run.sh run.sh + +RUN apk update + +COPY --from=build /usr/bin/zap /usr/bin/zap + +EXPOSE 3000 + +CMD ["sh", "run.sh"] \ No newline at end of file From f542c4ca97181224aee0ff5617351d3c381d2218 Mon Sep 17 00:00:00 2001 From: itrofimow Date: Sat, 30 Mar 2024 01:18:47 +0400 Subject: [PATCH 209/210] [C++] [userver] Bump userver commit, optimize updates and queries, tweak tracing and metrics (#8768) * [C++] [userver] Optimize updates and queries * bump userver commit * reserve the QueryQueue appropriately * bump userver commit * switch to llhttp in userver-bare * tweak userver-builtin tracing/metrics/logs --- .../C++/userver/userver-bare.dockerfile | 7 ++- frameworks/C++/userver/userver.dockerfile | 7 ++- .../userver/userver_benchmark/CMakeLists.txt | 2 +- .../bare/simple_connection.cpp | 28 +++++---- .../controllers/multiple_queries/handler.cpp | 30 +++++----- .../controllers/updates/handler.cpp | 57 +++++++++++-------- .../userver_benchmark/userver_techempower.cpp | 18 +++++- .../userver_configs/static_config.yaml | 2 + 8 files changed, 88 insertions(+), 63 deletions(-) diff --git a/frameworks/C++/userver/userver-bare.dockerfile b/frameworks/C++/userver/userver-bare.dockerfile index 3fa955f2010..59704d05f25 100644 --- a/frameworks/C++/userver/userver-bare.dockerfile +++ b/frameworks/C++/userver/userver-bare.dockerfile @@ -6,7 +6,7 @@ RUN apt update && \ WORKDIR /src RUN git clone https://github.com/userver-framework/userver.git && \ - cd userver && git checkout fcf0514be560f46740f8a654f2fdce5dc1cd450c + cd userver && git checkout c2ca5454f0b0e93dd0a2e082904dedda5cda3052 COPY userver_benchmark/ ./ RUN mkdir build && cd build && \ @@ -14,8 +14,9 @@ RUN mkdir build && cd build && \ -DUSERVER_FEATURE_UTEST=0 \ -DUSERVER_FEATURE_POSTGRESQL=1 \ -DUSERVER_FEATURE_ERASE_LOG_WITH_LEVEL=warning \ - -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-march=native" -DCMAKE_C_FLAGS="-march=native" \ - -DCMAKE_CXX_COMPILER=clang++-16 -DCMAKE_C_COMPILER=clang-16 -DUSERVER_USE_LD=lld-16 -DUSERVER_LTO_CACHE=0 .. && \ + -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-march=native -flto=thin" -DCMAKE_C_FLAGS="-march=native -flto=thin" \ + -DCMAKE_CXX_COMPILER=clang++-16 -DCMAKE_C_COMPILER=clang-16 -DUSERVER_USE_LD=lld-16 \ + -DUSERVER_LTO=0 .. && \ make -j $(nproc) FROM builder AS runner diff --git a/frameworks/C++/userver/userver.dockerfile b/frameworks/C++/userver/userver.dockerfile index 4a5ad789d7e..667d7ebd96b 100644 --- a/frameworks/C++/userver/userver.dockerfile +++ b/frameworks/C++/userver/userver.dockerfile @@ -6,7 +6,7 @@ RUN apt update && \ WORKDIR /src RUN git clone https://github.com/userver-framework/userver.git && \ - cd userver && git checkout fcf0514be560f46740f8a654f2fdce5dc1cd450c + cd userver && git checkout c2ca5454f0b0e93dd0a2e082904dedda5cda3052 COPY userver_benchmark/ ./ RUN mkdir build && cd build && \ @@ -14,8 +14,9 @@ RUN mkdir build && cd build && \ -DUSERVER_FEATURE_UTEST=0 \ -DUSERVER_FEATURE_POSTGRESQL=1 \ -DUSERVER_FEATURE_ERASE_LOG_WITH_LEVEL=warning \ - -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-march=native" -DCMAKE_C_FLAGS="-march=native" \ - -DCMAKE_CXX_COMPILER=clang++-16 -DCMAKE_C_COMPILER=clang-16 -DUSERVER_USE_LD=lld-16 -DUSERVER_LTO_CACHE=0 .. && \ + -DCMAKE_BUILD_TYPE=Release -DCMAKE_CXX_FLAGS="-march=native -flto=thin" -DCMAKE_C_FLAGS="-march=native -flto=thin" \ + -DCMAKE_CXX_COMPILER=clang++-16 -DCMAKE_C_COMPILER=clang-16 -DUSERVER_USE_LD=lld-16 \ + -DUSERVER_LTO=0 .. && \ make -j $(nproc) FROM builder AS runner diff --git a/frameworks/C++/userver/userver_benchmark/CMakeLists.txt b/frameworks/C++/userver/userver_benchmark/CMakeLists.txt index 7bcfcbf15df..507550f5755 100644 --- a/frameworks/C++/userver/userver_benchmark/CMakeLists.txt +++ b/frameworks/C++/userver/userver_benchmark/CMakeLists.txt @@ -15,4 +15,4 @@ add_subdirectory(userver) userver_setup_environment() add_executable(${PROJECT_NAME} ${SOURCES} userver_techempower.cpp) -target_link_libraries(${PROJECT_NAME} PRIVATE userver-core userver-postgresql) +target_link_libraries(${PROJECT_NAME} PRIVATE userver-core userver-postgresql userver-llhttp) diff --git a/frameworks/C++/userver/userver_benchmark/bare/simple_connection.cpp b/frameworks/C++/userver/userver_benchmark/bare/simple_connection.cpp index c9b5e46b3f6..bb6a5a1880f 100644 --- a/frameworks/C++/userver/userver_benchmark/bare/simple_connection.cpp +++ b/frameworks/C++/userver/userver_benchmark/bare/simple_connection.cpp @@ -3,7 +3,7 @@ #include #include -#include +#include #include #include "simple_server.hpp" @@ -18,8 +18,8 @@ namespace userver_techempower::bare { namespace { struct HttpParser final { - http_parser parser{}; - http_parser_settings parser_settings{}; + llhttp_t parser{}; + llhttp_settings_t parser_settings{}; std::function on_request_cb{}; @@ -27,33 +27,32 @@ struct HttpParser final { explicit HttpParser(std::function on_request_cb) : on_request_cb{std::move(on_request_cb)} { - http_parser_init(&parser, HTTP_REQUEST); - parser.data = this; - - http_parser_settings_init(&parser_settings); + llhttp_settings_init(&parser_settings); parser_settings.on_url = HttpOnUrl; parser_settings.on_message_begin = HttpOnMessageBegin; parser_settings.on_message_complete = HttpOnMessageComplete; + + llhttp_init(&parser, HTTP_REQUEST, &parser_settings); + parser.data = this; } - void Execute(const char* data, std::size_t length) { - http_parser_execute(&parser, &parser_settings, data, length); + auto Execute(const char* data, std::size_t length) { + return llhttp_execute(&parser, data, length); } - static int HttpOnUrl(http_parser* parser, const char* data, - std::size_t length) { + static int HttpOnUrl(llhttp_t* parser, const char* data, std::size_t length) { auto* self = static_cast(parser->data); self->url.append(std::string_view{data, length}); return 0; } - static int HttpOnMessageBegin(http_parser* parser) { + static int HttpOnMessageBegin(llhttp_t* parser) { auto* self = static_cast(parser->data); self->url.clear(); return 0; } - static int HttpOnMessageComplete(http_parser* parser) { + static int HttpOnMessageComplete(llhttp_t* parser) { auto* self = static_cast(parser->data); self->on_request_cb(static_cast(self->url)); return 0; @@ -192,8 +191,7 @@ void SimpleConnection::Process() { break; } - parser.Execute(buffer.data(), last_bytes_read); - if (parser.parser.http_errno != 0) { + if (parser.Execute(buffer.data(), last_bytes_read) != HPE_OK) { break; } diff --git a/frameworks/C++/userver/userver_benchmark/controllers/multiple_queries/handler.cpp b/frameworks/C++/userver/userver_benchmark/controllers/multiple_queries/handler.cpp index 685259f8934..48ff33684e1 100644 --- a/frameworks/C++/userver/userver_benchmark/controllers/multiple_queries/handler.cpp +++ b/frameworks/C++/userver/userver_benchmark/controllers/multiple_queries/handler.cpp @@ -37,24 +37,24 @@ std::string Handler::HandleRequestThrow( } std::string Handler::GetResponse(int queries) const { - boost::container::small_vector result(queries); - for (auto& value : result) { - value.id = db_helpers::GenerateRandomId(); - } - - { + const auto db_result = [this, queries] { const auto lock = semaphore_.Acquire(); - auto trx = - pg_->Begin(db_helpers::kClusterHostType, {}, db_helpers::kDefaultPgCC); - for (auto& value : result) { - value.random_number = trx.Execute(db_helpers::kDefaultPgCC, - db_helpers::kSelectRowQuery, value.id) - .AsSingleRow( - userver::storages::postgres::kRowTag) - .random_number; + auto query_queue = pg_->CreateQueryQueue(db_helpers::kClusterHostType, + db_helpers::kDefaultPgCC.execute); + query_queue.Reserve(queries); + for (std::size_t i = 0; i < static_cast(queries); ++i) { + query_queue.Push(db_helpers::kDefaultPgCC, db_helpers::kSelectRowQuery, + db_helpers::GenerateRandomId()); } - trx.Commit(); + + return query_queue.Collect(db_helpers::kDefaultPgCC.execute); + }(); + + boost::container::small_vector result(queries); + for (std::size_t i = 0; i < static_cast(queries); ++i) { + result[i] = db_result[i].AsSingleRow( + userver::storages::postgres::kRowTag); } userver::formats::json::StringBuilder sb{}; diff --git a/frameworks/C++/userver/userver_benchmark/controllers/updates/handler.cpp b/frameworks/C++/userver/userver_benchmark/controllers/updates/handler.cpp index 35c046b57df..6b0e975e839 100644 --- a/frameworks/C++/userver/userver_benchmark/controllers/updates/handler.cpp +++ b/frameworks/C++/userver/userver_benchmark/controllers/updates/handler.cpp @@ -7,6 +7,15 @@ #include +namespace userver::storages::postgres::io::traits { + +// Hijack userver's whitelist of allowed containers +template +struct IsCompatibleContainer> + : std::true_type {}; + +} // namespace userver::storages::postgres::io::traits + namespace userver_techempower::updates { namespace { @@ -46,41 +55,39 @@ std::string Handler::HandleRequestThrow( } std::string Handler::GetResponse(int queries) const { - // userver's PG doesn't accept boost::small_vector as an input, sadly - std::vector values(queries); - for (auto& value : values) { - value.id = db_helpers::GenerateRandomId(); + boost::container::small_vector ids(queries); + for (auto& id : ids) { + id = db_helpers::GenerateRandomId(); } // we have to sort ids to not deadlock in update - std::sort(values.begin(), values.end(), - [](const auto& lhs, const auto& rhs) { return lhs.id < rhs.id; }); + std::sort(ids.begin(), ids.end(), + [](const auto& lhs, const auto& rhs) { return lhs < rhs; }); - boost::container::small_vector result; + boost::container::small_vector values(queries); + for (auto& value : values) { + value = db_helpers::GenerateRandomValue(); + } - { + const auto db_results = [this, &ids, &values] { const auto lock = semaphore_.Acquire(); - auto trx = - pg_->Begin(db_helpers::kClusterHostType, {}, db_helpers::kDefaultPgCC); - for (auto& value : values) { - value.random_number = trx.Execute(db_helpers::kDefaultPgCC, - db_helpers::kSelectRowQuery, value.id) - .AsSingleRow( - userver::storages::postgres::kRowTag) - .random_number; + auto query_queue = pg_->CreateQueryQueue(db_helpers::kClusterHostType, + db_helpers::kDefaultPgCC.execute); + query_queue.Reserve(ids.size() + 1 /* for the update query */); + for (const auto id : ids) { + query_queue.Push(db_helpers::kDefaultPgCC, db_helpers::kSelectRowQuery, + id); } - // We copy values here (and hope compiler optimizes it into one memcpy call) - // to not serialize into json within transaction - result.assign(values.begin(), values.end()); + query_queue.Push(db_helpers::kDefaultPgCC, update_query_, ids, values); - for (auto& value : values) { - value.random_number = db_helpers::GenerateRandomValue(); - } + return query_queue.Collect(db_helpers::kDefaultPgCC.execute); + }(); - trx.ExecuteDecomposeBulk(db_helpers::kDefaultPgCC, update_query_, values, - values.size()); - trx.Commit(); + boost::container::small_vector result(queries); + for (std::size_t i = 0; i < result.size(); ++i) { + result[i] = db_results[i].AsSingleRow( + userver::storages::postgres::kRowTag); } userver::formats::json::StringBuilder sb{}; diff --git a/frameworks/C++/userver/userver_benchmark/userver_techempower.cpp b/frameworks/C++/userver/userver_benchmark/userver_techempower.cpp index 4b7dda0e2ae..6e994d3021c 100644 --- a/frameworks/C++/userver/userver_benchmark/userver_techempower.cpp +++ b/frameworks/C++/userver/userver_benchmark/userver_techempower.cpp @@ -4,6 +4,7 @@ #include +#include #include #include #include @@ -45,6 +46,20 @@ class NoopTracingManager final userver::server::http::HttpResponse&) const final {} }; +class MinimalMiddlewarePipelineBuilder final + : public userver::server::middlewares::PipelineBuilder { + public: + static constexpr std::string_view kName{ + "minimal-middleware-pipeline-builder"}; + using userver::server::middlewares::PipelineBuilder::PipelineBuilder; + + private: + userver::server::middlewares::MiddlewaresList BuildPipeline( + userver::server::middlewares::MiddlewaresList) const override { + return {"userver-unknown-exceptions-handling-middleware"}; + } +}; + int Main(int argc, char* argv[]) { auto component_list = userver::components::MinimalServerComponentList() @@ -63,8 +78,9 @@ int Main(int argc, char* argv[]) { .Append() // cache component .Append() .Append() - // tracing tweaks + // tracing and metrics tweaks .Append() + .Append() // bare .Append() .Append(); diff --git a/frameworks/C++/userver/userver_configs/static_config.yaml b/frameworks/C++/userver/userver_configs/static_config.yaml index 01d66d78fad..b34b772237b 100644 --- a/frameworks/C++/userver/userver_configs/static_config.yaml +++ b/frameworks/C++/userver/userver_configs/static_config.yaml @@ -29,6 +29,7 @@ components_manager: handler-defaults: set_tracing_headers: false server-name: us + middleware-pipeline-builder: minimal-middleware-pipeline-builder simple-router: simple-server: port: 8081 @@ -62,6 +63,7 @@ components_manager: noop-tracing-manager: tracing-manager-locator: component-name: noop-tracing-manager + minimal-middleware-pipeline-builder: plaintext-handler: path: /plaintext From 92a2c9aa80b53f82f5dd0d33f124d0ae70ada643 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 2 Apr 2024 16:16:33 +0000 Subject: [PATCH 210/210] Bump io.vertx:vertx-core from 4.4.2 to 4.5.3 in /frameworks/Java/vertx Bumps [io.vertx:vertx-core](https://github.com/eclipse/vert.x) from 4.4.2 to 4.5.3. - [Commits](https://github.com/eclipse/vert.x/compare/4.4.2...4.5.3) --- updated-dependencies: - dependency-name: io.vertx:vertx-core dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- frameworks/Java/vertx/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frameworks/Java/vertx/pom.xml b/frameworks/Java/vertx/pom.xml index 80b21f4422e..12ef914a5c5 100644 --- a/frameworks/Java/vertx/pom.xml +++ b/frameworks/Java/vertx/pom.xml @@ -10,7 +10,7 @@ 17 vertx.App - 4.4.2 + 4.5.3 2.15.0 4.1.92.Final 0.0.21.Final

ykV6V!I^X0F>qZ84T8`EkEiph&yxn=P~wUot|NwvN(%c4YgR0l!K zFGlys#eKjvE3~!afc7V#yt&RrtsMx534P@B>PrC$0OG>{Wc&??cf=!oIe|qBxBntb#izi9-oO3y^K)l;ISu~4fT~8KoRD-?`U=EiDvVRM7fdPk69f{J{w%! z%r?0MTqa9?QRkl}l~2rRRpvw|EeX+oB~GOVkm22rtw&!LeW3 zB>MG=s%9Ia8J&EgC3Gjfep_Tfkxj&8QV`WOP!W<;T0>rA^mD;Q%ab+%Z z4mgg7A)#(vWw2e{hh5F&TpSQQB+b-{j{d_6%JVZ>I@r~BLgqm}@r(LH<bhSCWkZQ2Pgz!WPr?%YZoBX zi*@7-kU8Q8A$1$za)Jx2$4V5XZ&5e2z*^$25BIWlR8DIxxP(5pR<4nj{>Ln=+vu4B zrXKbr3FbRuYY%N&K2Fr}?psLS)_iqWzZ;)Yk_fz9+4o(h=PgTmrvQsZRGt6Yndw!c zFKBuXxZdb&7>H!O;I6R3Dk$o{)k3n!^+=QoEka8BRx-(SW54NAJ_XD?$^ZY4YiBYa zLk4!}+L`w-zlmH$oTu{Nw~BZKtzg%l_pKs!2Zgy_6MY5FNrdHGmi?bzJJa?Nn(6Gd zGam}}L`AJ}Z}o2=F}2os8Kt0o_pS4VOm7e&XmnQ?ojrS&aAHM(6MyHmGpoPE_{_P& zw^sr!+Eu2Y^__`jS>KgQ0Vy{^bR>Fum+M?>yP?vv|I8q61*Ob!#s^%BL3|tmq5sOd zew*X9%!>DpMo-^>(6=1X(>I%%vZJRDhs}l{>W)NDFKPuP$D(gw$dAM14vrDu8M^d{ zVP!IR%=Bh0By}iedVZxO!Y~ZR8(+{hq?IS@VqAdmDLDHg;*jTE>k@vyYw{8P#cM$L z4+()1Uc>J|@EkGI-!rTz93GQ$zC|@cjSvnGt{cK(5^?Z5T6A~J6c65+GxEW^IUBME z9s$e(nfl0L5ozDxoRtHTk{~2AR*DO+`LBj$1P_ zm|5#>EFe2~JMPDL=id;IeRW2mGrxSE6m!rd;5MG)&ny_7Z1xm3Tc?Vn<#xiIjJ-JB zC4MbZNP{}_w9Q>+o3r%H1#ILAJhx!05NU3m=;=zYo|~D1a?@@R^MD@?h7X zeIMJJ=4xznd0{t>c7?xQh8bu0a)Qt`XDa+xXq(@fHqDYC_#kv#fCdxz)&sjat)D}t z?QS&yWU%2Q&LU*$4w3kVoGEp);(?|#req%Y$W>4n7o zpbz02B3KuPRl%vN{WPUXZB9rkq;Vcl#fg=iBUI1gX%~LErVi~b6-rvw+bfhg9NJG@ z1-#Xl4qVtC1?m61wzQszu~ctt)ZJx*p|KGIsctLVLmLVwT4FUpA?7 zAzOo|X}YQY5`XpXCR3+NVEgPqHs>2K-JQoi!C)W3I%>=oSA~#l14u44G!ijxZkTdc z^cz)z8;_H5$;2CFmrOEt^A!eq1FGx>mp%se!{k&dSv<8#x_BxyRG;70*m;q@Ti5nA z6Q$uS%@O6Pccpiuk=_GC)ao<{cVHhyx(`7BEsR)N*W%SIK6elZUu7LZf4Ya?JZLl8 zPR|3r$U}Q{&{@(;Rw^#S<|H<6#O$`e7pG?Ihe#htMW#H zX7F0SzoR($<$UmH7K_&{Co5i8DF_cwwIIYBYfPil@HEn2Z!HTc0GbAnpXR)n?#@Ra z0=2W%imE8W`mpRiI`B?Yqu zL?J4L$C0(F$FU~~J{`cO{|eVH&8WtT-vj!aSk6xWRc4|_{In0VOS}mHixA8J1Wk#} ziF#9F3w>z=#jU2)7xklrXo`;c83ys7F{Yz#KD@f6hllGLw#}qi{0sd%MUBnI>$Hi9o5_+OtgQ7VR&2@iQpQn<(} z%HOrrP>|78>*cZZr)}sib$mLDFHz%>%Y9w#J-1i<@H5N--gE0N_qq3PbY$K;!g5J6 zcF@Jrn>m*E{&g|zn>0Y+q!AQq*-}IxXfLONVM19gdxWcgL>5f*T`W@0dIs>oPO>H6 z`zh znE8U|{a&k0IagdHEJAa=WU>)X5Q*%&pc8!Ei@?sCPZ4&m>ew;x#*8i#nJ7;1ePBd^ z9WVp}PVlk1mMX(O=iTf2m0c5g_qu%U&`z9z6jy`DoOoJis=mwI72vK(FM;|O9dANk zM8BYGywDd5Pk%^IUDWd(314jWFN);fbMwl}5Td;AJ@=lQ5c^x}<jVYYV!9q&`V%F=^&dkwEE@vB0!aGm4Wp%4sWX32SwAj=66 zjgIE5FyPq~I!JG!MuI#VY->w0M04I`VRREP%QHfn9o{aA%1Gl{SA7;GB+vo%EZ}r1 z8LK_lgX(Fm`c0ce&&bs2Y}8CnYiy(Pg%0~FN@Q&Rk>gI}MZ?#izol1uzJMO!ft>gz zLjoV7R2IKs`tF@fa}Q2UG?q$lkOno>gJBw=nyB}CScBz-6(PM}0=@6Z7Tp>av&T=U zTdGx@S8#jbvgGjE?!mB)km_4!9fwzxz-UEYYz)@zy8x80;@-knda~r*euot)?|kxm ziFr4>_kDJiI_A`+=AOdPCZ4irHOD6OJGyt!U&Q~$_kn)r-M}0=(iR>_-uP;ks7M!> z-*;<~fYn?&kSv;-=roP=aPB)>xV#?Ccw4c*ggD@^y$@wD#=F{TIBaun#jeCq4Q$2!jJ1Tm;av{fKgkquk>LdwqP<=>?V0;;oJXLX5rtT1FN3B zHfG_in6*Wkg_~xXg%Zn*e*Yb2VG-e6;=>{9ybpv+x+9VU$@IwGVs0 zQ@s%&K^n=}8>g5gUwlUAjKyy``R2UBKT=>UKKVP0#R;(Ca~q4PQ_*6yu^9iv8jBs- zhrP3<2lnZnEOf}>B6;i-NS7uy3yZKRew|o<+fbrgFfbRUd1oxxQg0vjx<74%T(Pcv z=sxUg5MoFb;WGsPd;74r=CosN_F;eeB1rx}+lPHUYtOq6d%?-{kHxcYzPb1#zdC_8 zX)>(J2B_?aKE<_$UDPRA-Itg9t+19&SX2`z#r7wC83LdJQ+alvI za>TZNd?Cm_5^_sFi)g_&zj^I0X~5Lt(TDV_*~N^~A}HPtH+CQ!YY`bjSfU%#kZ$=# zB{th@?BUg-ZuNJeLb&vwfCP~0Pfx& zWlV3FvVrawiWDOcfCz1~MpXh@i8CKoM+$iY2GvC$_(uQ@sy33NdSM|Zn%V2xUn_}e zG95NisJ#rm-H0L~N7=g*A=JJRJIAhTbLz^BA-9>?YR&e<=$Gwlc4bX$r|?$m5@ro7 zt|gk#kG*82SkFW@TdgJMGsw<=(-%qWm^jQ>gzO*aR%^);xD)6)oX$<8%x-H1tQ3^h z{jvCBc3aCAZ>LA2*==o-S+Ue(c3W2{?s2ZOP_%2koEuTRS3uxY!G)u#!9$3#&FpYw zqZUM-(A`4uMziyJAezIP`(m?tYIa^rs{iU9Cdf84@g(TNHq(r(i9Zd}EM*<;)jj&v zFKx`2AmDCXfZ2iF+4kOSKzm1Zq&+2+`qR({x)XbAA`N1W6AYT2TFjEFWKj%>Ly_py zgP&mK!M|cwlsJ!T5neEvb-gs2o!Et}6i8|~gnG5KCHID)!OQ|^%uZ~+c78eQwZDS~ z;{Z$EdH=dpkx(r1V9pOc~07?rnl2VM+#A;q= zTRViUy+|z!8W}%W<*`P_NC!(0O%v318Aw+wnK7b9_2NtAgkEP*nTb*VE4df#ckWO zMTkdl+lFz}?3{58lsGoCpc=DnyV%9YhJvs+)4Ri&E7|10yJT#Ln=KfrA`3~=KL*U9 zL7C~E@=p2v$I+_t18cumzip>6)=x#XPu4PFx}Dv}->t7p%T zhf(l8V3J{)y?guKqii3$o2K*b-hSEUM{CAiak7_G0eY@UKaUY41T{-oXCcuQ>hW5T zPefmT{QMoew|hMSjy(=d<=(xWLwWEYryV-cRcRzz{zG;-VNQy%N~F?E@$G%GFasy-QJA!(8}FRbAB9?K_X~ zxYM{OhS(%H7-)uda_jaHI&FvL7Tmi1Y##qadt0{~Xz)jD-Tv_ia;{i`fvww*z8*E6 z9d^!t=YFHRj&#TOaff>p%pTvL9**(-E5XdV-{@>#!2twK#g@oT^=r8I8_B{K*!(_Z z(@ov+<3waspwMJ=u+OHuNiDdwzu)Lm4&0Miiv@^_xiam(dX~-u%&uN)1>fM` zNfv8gB)nLNqz#3=-i8D#n_XvaL$a}~QWCmh7unZshGQ7Pr)d75BD1^u-NQWko88?- z<4lr!^--;9+!!&7LK!-J_0f<=K%?Pehv{5SyaKaCk_M)scCR-b1JO4hC9y*)z0!(g zbMw(yA5vl7z^J5zDN1B>#jX>CD=?)E6YUzcn%d!tJU1UrqLdoVT3oJxSt(p`*3E0h z6;^5=22OBmMdv?}q4;NNHX4f{CSktwqsp|Y>nLH7+3fhv%YQ$v zA{}$^-|xNy=?j|GtI3geBdE3n;QsIKK-zo-P*meCAV7ZC9Z1E%tmAhe4ILX{ihcLb zu;_**Cd0Q{PWLRU)&>7+8Ek%cjBe*@I@FB)WUTQJ`I*DVe8?C`=2HLyblhw(M$4fx z<<>E*PFU2FWZfz4+t-Z^LzLCablM zdXs^pSu!3*IFhk-Ec86r!<=EIMX%~>28MBp+HrVi9r$W**2-qMIk5UUEGGxFVc*;wDcc41N+uWc=&^~Gt zF#VrJmzo$@y`HGf+qwe`-*PTTPZ7ha_}__<%MK~$Yt#sIkQ_wkffs`4EQKA@(fz|; zX}1xbsR!jlXI-MRxuR1K#*;j8Zj->?1t z;dgEZc;WrSmmVaEV9X%lcUcxByeuNs1%t=bE0rz4%awUZ_%-o-gumgBApG5gfWpNW zuiUx)!%v_Z86hDY&S?(eP~wJH?WB#idAFZnUeWASLXqY?%i_<^N;AF~t8LM$18d(s z%i{Zs&_nQuNV4xN3+t1>uooDdhY2#myWIBC_th2yfg;waf_N{elr z7bu1o`q{I6OWG8_3qb-`^b)5%AY_%_NM|fS>OuG1B3@~ zCN2WJ`cMc0j~<605&EBVVN}!KR>OEcM0yBiR~2}L^|Xh3UMp=>R(Km^*AE0{y0 z$Q1!w~b35XiHu0?veQZRjhDNU;p z)JgIn3%|Wpl#q!%s563EIvG3Dv?rrtF+0Y2?|w1z=vHho_5Rt`i==(E;4T(WQc70t zWCGa;*HECv^8J1FjJEX~aoiPNKTGJ1(G3S<-O0_Ap6tHqqODNeT zV5M?t1e0E;P?AXp?3a(Sg=oO(3-W@pp)eIL#M2Otm$)|sT>h3srd+{?My5Dv>27~y z%Eurk#~5hVA3ybm0I96wcLUr&+nqs0Y+mi+b}j{&fD)PWq(?|(1mo1|Sf;Kk&!QZQW#WbDmY$ga=7ZFrpG3|~ zXkLL~g7%Km_AapFp=0eWxE<}?u00TJPgdN}rYIQ5UfBuv>I{+To~2wqiEW!WlrKgY z*3NDl`#8Bq;h{`LviD4GbsUsuiP+Knwbn1*1D~Uw)!akUq zW=pm?Bi(NNZFs)%S2Y6NI2R3;xyQa+;Wir$i1q!8kSoEK)Uyh6eT|K!;P0|zDdabd9{K0RQtXLMSn2IGmO`?4$JW1Rjz#=cp{vD%Q0kn) z+=(uH1nQs*^tgG29pjQZ##JEbAnFs!Y$P}Pe5|s;*VJsU@jS}*HW+}>Z(#Pj_c62; zxyqA!b=}7-|L6h#WSCK!e?zwlS^BmO?9Z?6W?W2S))dWLsXl1i(%x=Mx@hhmNzfu* zu*!vW##tYS*+SbFtOms|hvDbSm)enzGu5t7{RL_Z5Hz|Y8!;%6*MG*g2$XYEaCDUjjs@|Oliz!qnv z(vo{b{ZJ+Xnl3C+xsb0K7@_^k&BIKS&BHcH@n`b?!``>Y*EMDFx6IWjktiYR74NE7 zJW7j_;u5sfqm&k581)#6rdnD}MMzwCgqaerHr^cu8I&-zWvZ!ns!Ev|>V2Z6@s4MI z-|t#`pZB>*%KU!6Kc=5gbIv{cti9J>YwfkyUVH6zZ2z%++_oohnP0OVD?lsyE(f8y zqC?bZai(LrQY)`VJGulOU38RndGQdftHpI{05d4@!WoCQ-Nh3f5dkqvY5%92Ff5pgzU!iO66^h!B4{UsX#?#T zi8LiHFr=UzuNqx?mQ4-a%K&tz}~;yYy~5!11vNt`{x?0l4?9YSond(xh^s#z36H#MnPyiL$huo@mieG7RnBr(v?%sJ`tEU|ZkD zR6_M_H^^Vk4^}pw(=5VsQD|*EZzi>VsI?wE zz>+19S-$9gj-Vh(IcM&&XUv@W>0{PP^%%jHx37Jmp@Wgh6q>xwh4^GF)4LvHi0rTB6vU{<&-tQ{lw6bjoMkZ-t zK1v7M(K{MDl2~t*#>56O#w$Cq0@*IN$r)?qG+m)8e!6Hy!#sN(q}ag#abpR@mr!eM zEvxyld4zRNZ0x{2fQF*;#SR>*11=gnkQV&s>0|Jx*jk>&%vZ$L;zH$7F{L1h*X19W!x( zSG8RWE(phTYs}>smM^d{#8EC>n4rt?T0HVCn~!PRn=W*+Gv=6TXFL1vz=V$5+23S$ z4wdN6{_Bs#Y!A()7xF4Hbq?oNclj#>no(Dwvf0P9M}Z z#KY|AQA5Fi(WLBGu>jT5XQBJ|HG4}UO-5E|X?G3(E*va5+s14q49;{~dBuIE^z|iZwT9?jZhu zR4b`f*Ky? z@0__gjw$||nxQXiahZ!1fQ-${Cm7}iGpI*-==^SlaxXTW`Xj0(&jinn-FvxVklAAw z4UQSM^h?wdxMP@%?MSI5AW=%$n$pe#si2N zQjy>92o+hlv&eoEsXRpnWSY}GOg4U>x>6Uh+#`k%4T9MOIyJdtq~6&&4*ho@2%%p= zpHLLjdp%6&?T`!8BY`OpY-S&bXe7hUZG1rt&7kXWgkWM_hw+Zt0#zDxAFk0q7Z%U& z0D3KDOVAbb(=!B>cQ}e9zUPWh40i9DfwcpFXH#En?^fC*9e|{{U#$NLb)q_$-n33Z zcJyv3;j^iU7S0&Z)l1u9P*<+QSKh-bz@X={gE^76en<#?O%3B}C-}{Ku+(o67h{#N zY+slQjRJ-34pj27RswUO5Sz0zL;&hu0o(UILv}A_x@@NnyaN!|*Mb!P;QkQrG3_AB zL55prWp3&K{Sm(^;84_ZwB0^}yFy$y%QIBg;_L+br8dph%^J9mzw|R;OOLDql=}Cf zN)y&0w#8D`ei>Ty?~nX;`38Ve2g2`4DFngX14^U1%B6S({}mtEgu*YG86E80{3DV(#S7 zHo;V}6>fjU_vDYm=POnzkHMw@{O{#4m{W(^bM7O5RT96CeE;qK83pc&s;=)N*OwT1 z&!#4Ao{PV|(73Z1m@LyQxM22?Pu2>I8-vNh8bu}G+cTTnAF{QB)u^uDmrerx&y%G+ z-<3Q9C{qP!^q}}LU{=H>89471STI1~7Alu)>Va+}a0(IlOilJ=1l*I15{KbNptd+i z+_EN=n#5sv`^^P4x3EH>wXvc#eltT&QGZ>b%YsXR)^WMflB536adc<;lON38w7adH z$kxy+GXXne-C2xf2)y>Y{_uZ8D~eUE)SG{(Nw7 zeL8iyY-vZ+U8pyx$0n|BtmvCdH!kZ7-MHE&)Q!3|+#=^5L}&u0cI$7E?&5}OjNFsE zobKX!4)k5*b^UxqAl=208C}vOrn_j3Pj}H8pYEddznt!(HJI*VZAP9zFRh)zwfiT{ zkHdy`+xil{5yC>q>RQrn+)%d@UbOzIgcnQ4fe6!qOU{HB@$_hMp4x_8 z-kcMXMrOFKwSt=cQ7O92LSKYO_cC5wCTrw`j2G|0%iFd(suw%-x6XLcauEnqBaY-Q zh$E-GGI%CUR8;q+e{(u|QA?GR&x8fN@;y)Lj*^JbK1pmAp9LADXu0&g1EUzqY43nX7} z3xp#FVq2=e!pmY0%jD-9kK)*ZXqfnx)vahSP81V&mvU$H-(QUnRAX{yyxzxlDv&$l zV{EL+ur#?dzHwiR$(^y*w^9AEEWbXGKI4k@V(i8J|Khh7y>Jz!Q60=c>``Ku$!xw# zxJr3lmVpiaO&s;!ZMVMkgx&k6{_wMRGFfeWhJ~G_HQ7hThSr*y^;&HCx**S)> zNGb&Jgu&HkzG8o!eIJjElWbe>Q5BF~>3)#g1h;5}A1d}jT-d4j5ErN>_x(ZXTFE#y zhHnF27lT;8$Y$=M^B}eSI=36{VgP03hqnUDLMy6b%s#w1X97mKP*ip)(W7@JEb zKwHFQ&uA_XDXD@&3uMn2TW_6V?y0P)%a?MoXOm|HlE4FFpe!jI{G(Zy3zdb29LU?F zlu2-vJ+%%-^CDv8Cdz2tn{8%OWj?@d_{c<`it#ytt%nn3_yTP<*^pH-P$ira!B~Da z)&?;fn6e|WHaJvN0%pV=DjJ6KP;FPxezXX=i8Au1_%}t&`lqZIO^8|0l|&gPGRKH= zLZXZpK4$NXmN8>YqKv<7HcI+uc7Z0m)JWqLDdGd8gOK@Y-`f-x0Ho8gm@ zj`c-GFtZ2iFQ~bRh8HR`@mL8mk|S-#_S8=mti_d)dZXprCasc;*Z`j+Axmzpu$vBS zqvq$+Xg3x^K|=YnP}cwx*eMgzBb`D8KdguYz0DX;8XK5f8h^-@Hsg3yWPH`pI6;x% zz_$-avLn7AgWk>~G|h`t)oZEBJ$jOqHp6c+zYcQ&1DO_XBd*2JdL_75YuC;g5~S=# zF>B(?jLA-elj9-1`fNZ_K^1K-`^o1A#w6Xzaw8kcwcM0uA%@b-0)FEDY+d zXVds}%^1tz)v2UbT;ozM*X_v1xLWT z67ofMt6_^Eh~+yNJZ|!Wo@f=$x=8YZC+ebo?P~IZ_t$j0e08r}T`t06z}XQPpv%8a z@`Bw^Bf1kwUhrvcs5_9>$&S;6*U@$d=;D+I@@x$K6eZYKcZILsAF>b(I|+u1Kq$IO zsKY(kICYI&gj&7^2(`K*>k{e~Gb8=kT;;bUwcwJ9V^O|*R*Z99(JT*Z_KGLeGgpyN z8k4mg!y8}x&7}5dUyr`m%C$+6KeUu>3FWg96ntu96cjvOwk2Zx>yRA}QXEYB3J zP5}HYmoOPzQeUjlCw%)4gIjx5_Hsr|mUS2CD$Qk5FUvbHj8gx^9jI#1sIZ$&QH!XL zCu#+Hn_v<3rv~%|shw*y@mNuTAQr=|;EsbJIyl=+-Z$e};Hc}}SGu%mNq2Ar!=4)W z6*{IO)L}86R|Sk?P8mO-3V^{Z&*anvli+=J{wzwnJHc#!^D1o;^!&kW51~#V+Jv4p zv74NC*q|mfrc3?m z7_1yYS%}?OnLJYWGw=qtTAo>o@8Y%U{yv!5;tT+-0=pO`XguNFzQ%pPZG&YuU{rK> z&*1r;-OtQHZBuj_a6-2p_{WIQYN}8vLciox8G{h?MHX*DF{L|1L)CC)G{uw+ShlGx zLzi#!ydazDV_+cCf+aG?f>gm7M5+*yamY7un=q-cxxDUxJhrsCZ7E|uY8yTk1Z|av zrFiwyo>$Br*UMS|9Ei$+B-ONcRrIG<@NmM)pLo+ z(hli4J&&@QIh0o(UXZk6kXMYabfcWSk{{}gYBcMV^k@h+V=z!AoNM&74+a2cpB1b> zX7<^x%16Gj$f1jjUPJ5V4`s%x7LWuj(C!#fkHGVWC}+oMr#J*Q&Dp;mXn%fs4wVL! z8BK}Fjfgcz)p9nfV~d}l8s|9Wcnw;4PFO2fO$o^I)a7$YAA6o?miUtDrj>(9Q5=`7 z=1Sj0y-kq5(O4Tf7m-kOMsQ(LD6QbLqnIoxmq+urjVIKAAUrh-@kzeQkKv2i)SC8@ z@qSF)3eXcMN>Abs|9MB!?>HH2r!-v^EjHV}`Cy(L@G+dOBPQy6s&ePEf*OgA_fYww zr;#;!xac58PSPqHO_j?g2KGV> zJ>6i`s`&x(y&IXhh9)BP2GGZ&g-M9krxSAQ11 zP}}dKw+WiG51Io%NjwqPA?A9pQWMpS?FWHMH#x`hWgQuTh0!$=Lpr~n&{zTmlhlbn z5YBC?ov89J@lc-hlaVTj4QdKGN>2F#%6~jjq4No^@RWbKU)Q}#*O_}p4FkdqB4FGefQ zE}$jIIFn>-lrR-F@4;=`HSAsoX9y78*R|fxm{XvccBVQ7ZA4yB*&VE`dUCT`Md&oG zqUK4P;~n{-R*~wd7H1b68L&*D)ZtOFFDBM;2@UX@C_C^`P-m-8n0hT3uKE7$y4{KDCzNgT{b7 z8)asU>-*uBXrl*Px{NKIt}SV)T7l=Fs`)iYc_D@qlQL6AnD$H_!Z2c)F^uFiyV(H~ z&I)!>&hAT{Acya5Ael|uprUC8lg5^EQ97kel+DB^T$na8< z-Z2bhxlC>H*7Mj@HudS(Zl!Edha~S}lwS2wfZtEyXDV6E`E@_z&c^g3Gf#wZKN-v1 zD2P{W(^e&k*(Lb;?Ox1bR#{ogYuy{-hHIm#{(S9Op;x{1$K>q-mB-?RP6qLCQXnuH zj-r`9L?%O7ki`$;krBA92)CxfX{ij#w*ACl_0;7vU%8AR2{h-GWu*p$Vi(YG^qzTcX%TShhj^vi0hh71oFB zV&~&eV&=y!&JWCw)$^*<&Wy{Cx=1mi5!~M*2Yi8U$fC?gOU~Ag2qcDYy2@QO*L;SD z{z-BiAE1)kg@UjWvmlg?n~HC>=nfXOq#JPok;8`MUYuoh*R;VmeaaUpB?ZQxwlV^0 z<^KyqSG0O3tIVcGdymWj^O=qOC$aQBYlCQh}J_t$g!( zF?jq4%2%qSH}rr`VFK4$Dm)3+nm>n~b;cYD*%I4d3Sm6QE=gbhQ>gaJlZn~g+PNw1 zR*rm~T1MK!KyxX!Y)8>~_Y#HyB^j~-HlSEq=*IB8K&0KxAH~Sh;&Xi_bt&YiQ-|bM ze+)V#y=|af-->PnEiYl6;;no|20Wd&A#denEPxH@c8q@7(DvJ`*HL%e_S>x}h}(X< zf&hW-w+qb^-}c+TPlavT(`_!3Izry*QC^oi2zOoDe#@*7UU7ug>TQDI`CDwiZF`Q# zu6bZ_+z#7;9zw_GMCc~0=bV9NQP=f!5eImcHc{k3WiMUCOIjTjCxj8p3<$N^VSC|o zSE!q1)ckfkY;BlsyS~Ggzg5f*+m8u5Y>%E5RJPqXy7XJ_ur&i`+BmDc!*=F+!BaW9 zkI)hHPNbK@mEy>-QDx{b4Fa>fW7I;kK%42&(dA^bj$>3ooug3DIms~sQcX))9)-pq zFW|-kat@EK?AH3s9bg4|n=rth$J)#p<6EFX_P(Zo;wn27cD66;C*H89OxZ!W&VfbW z!+GI)_(3$bPptRHV4AAuY%{a8OXD@OVt~dCdj%l!{?*LUM`A8;QXC>QC5-8ZOb|fm zFgDIpi;2;I`{N*1+kFCU7NTx6;IZGUG@zbuSdZ7Scw1|rs9ry6j~{``hiTICoZ0h4>X3W~6Y%1e>WZs%<9=U4)gKt?093Hg=)8`s0PJ>-fL*Ll@W-&CM zi>a1$BUZjEj4AKX5l9U z;6XE8#%0eo>yJeW-N!<^UcCl#>U);@qbWU0cnk;=V+r%IvDcm~L(dQ9^3UQgD+_tU z^(;Ydbd7tuB65^P#ICON+^w;^H^(qD&=e z$wkDo?1;O?Cfx-~7UQX{O-LE8Excyx} zgZ|75P7Rt6^QvIDHH2nfJd2BU*+w}*>$1mWaTpExS0k?(_|o159!GG!$yvmrr(Qz0;^O~y&+HknpsxUm7y4mFvP zxw}PEe92`@`!s=H$HJl#gq17&;LlFN=Ca=nj$*v4tH`bQMHANvcLXd?UqyLfSXbe3 zt$@fb-@t>>Vc=219%WM>d}zpJ@QCkRV8-s{G-A$O#*efRTZ}=7_ZE!sVJC}We>tzi ziyC2Y{V5@<9Isc_$1`;FM}ig^dV=02STjG;tB3A%HF#-hU!bmDu+5ZozySCQjYN&I zPlejI9!kmoUhvZKI0POHUb-3miBRsilRe5UufVW?uvNyS3_M?%Nvc)9pKBOAM`tCd zc7>7v)#Bf`0^6F>IE+CXqqF@(OIkmx02c5*99*X zqJ<6+s~y#$N^xD_9u|7M#lAP)|7@9dJRoEn3BLpoKWzmfA^gqPSYE8J%ay;OCkZZB z{^ls*?|y#6UlT$$a2P}l`oAj&$;|!U%f-wNc*~p{WvfO6xqfyjNeP8EgAc*xgOs#r zsKv>@N{shr;NvBLET|Dlz^iGzY9?ijhOp%xP;$MTh65qKN2ozTAG1yvqWihEmblrK z*#~f3FVzFK*{HL7K9iB@GyrKl4^9rpj`EEFWojnX^3Mcs$Ac({^LE@o0GF*`N9qdm z#OLk!e7N9YohzACg}eiTrjEm1m%JTCYI?|gWULVK0kjRxN56%)W8jG{Z9Fg2i}TUd zE(RMnd9&v{pGgzNb`^t-AMz?~Vx?e#=L*RYY`m9+qkEYS#NW;p@(%3muDe23>l5P& zNeVXp>&Qec7tn4{bnx)i75eip9t(#-eE!9EfP(tq+{1w;#?eiyiNU?Tz%$y;95`bB zMu)?Gx(lx^!+BNEjJ41_F&|_&b}L;Z+)yhZ(5T%*ai+ijmf#w#s%EE=C@{$1A=}sTk>*9N1W5>!#HSP+452Y#i5#wxdHs7K6uULuQQ$SSR25I#fKo7!mT>F<63i z&qBe?Z{(1~3$HpW@PaiZjJX#z^$t@4h~2(4m#Oz7Hn+^zid&y!-S<`0sL5);Po zGE5rf#<%h)sx_}w`0K2Y#Z+>g6~y>h)ajd3#_-utjF5mKg1J$qDJk9k{WVDs-%P?y zUe01;T=Gmut;>3uPkaX#J<8m};RJ#Vx|7K-v?KhLhR&gYw}D|uy0n|qEBJn=z+xB{ z>thbX{cm%Jq3m~{a(G<(`QWYwTmUytTOICK#_=Q0+jReb+_~#-dYdqJ4aI8G`Mr9Z z=pJvxkdgs<0k0AR2^Ts92KQdbU_s4ckT)UZoUwS(`F1zsWEYol(aihVEwNB8H1*6c zE0KD6!W$hw&WDwWxmewMq&Am1;pptzB$YRzt72=JD%P{_OPl2owy=MAbIKf)O{KPZ z$G?r@$`oz)5fGH#4Ij=oHqtkG1gjj0Dy#5Xt>>F6L3%g>n2mrV-6~VBf4H7mmWKUq z(DivfwUZj4YKOk4)O0{m?d(n`5fKU<)BI(qZ@wy}%E5fK6qF!8xs`!#@G#%7rGQ46 zL_FMdL~v){-6DjOLAC|C$v3PW5D+ARxCLgCHwToVoh2c+=3GE72+s={xGWJru||E{ z0>LCbH{Ll1#5@YD<*dF3wlLeKDTsp_WEt+ngkSw`N6?BXF@f+1OgaE z9Oxj7|FGA@!^2GI?66l0AgDP!nwD7JIp4H{)!jYpH5TA8CdxH$yW`y4CXDmb>4CXa zTjn?qj4%qcZXr@8=g%ntv7A2Z|Ev=+N1cE0*E?6zX``X@C>lmut-Vb@0F6sI!ww76 z$_i{t`X{^+C$ED*t-AD2neQlFyCf(HZR!A+ zEz7His8QZS=oBdN5JZ~{THiA0Z{-0)M$fc`2X;0!Z;4BVv)?p&6L^q=!TpNfXvf(C zq$sx^@AU17O6)9QFz^~@m+%HtcN^E1URthNd7&j;Z>|mIs^5x2quZ)+Q$pCmdz+bt z+qsgoqs7@?pMeNEK}b}tD$|)@0GKeMmb5imzOU_%oK0(SUi+Qubn|JdOW!cvwGwV~ z26{Ctv9GX(>bZqP>>5*x93IG~2H018$xXAVYhPyF8g-89c9D*yPB^I#hDFhda+wVE zQwi~ufZM%bahTopL-{UXO64j$WJ0G*s=tEopx{*iuQlL(pP?sJchhtm(p^~>)a>v( zR9OA=NDLo*tI9e;>~@l&)#r;XG4dCU7A#-q#U@3S$>Sq@Q<0dNymf!JJ*RlWdh921 z8gDr=2?P4t;#}A+R%5LNs7){n34q?UI70}4M(^U@I_wGCsNv~~$B z1p><0lH_2BgLvI`G1Wu6*i$Y6Mmz|=f?>qLh7r3fBe+*=7_o4aQ0O(e;NzAaBd(hx zjF5fh5LN{>ce4v-3*KYI9;O+?h%;O)^Doh6F6AY_h|!3G^D&~g%e!tcqV4l;GNPFP z9wT11cp66hVNwhua1yjfJ(LvTWaW}gr4}g{=GPoSf|h4ecb+KJyh|gpaj4*V* z7iMum%_xu!VJR#${2FQqxtH>b`}l@mM`;U3YYTpUz4x^6OZNOD{Q3ppHc+FW<}3a} zKL!T*HS0AiRrx=hARYOUmjJ*1hQmfaew}DYAY-Dd182}@-Q-su0X%+fY8y5DdhC)I zezA|?kY(W&&6}lmUe^}nlE)5`n*QLX3qozwAOpJD^l4m1{Z^2{J zj>M%F2BZ0HLd7_T-o_+qCQ8SC-#BRQoIE5no67lLZ-G|RgYK8QX?eIrC)p1cijZJ7 zPo-MrwgLT+c@UFqBS@L$?A7AjjgVjGDNX5C${Jg0c!&>d0kvytz1w>4w!ytk*Y8K+ z%qTJ$K?c(T-vw%XkFA#J_;BmZrrw)RoTPfbaDcv0?ABYum{Y|eUH=7f$)<|5OXx>U ziLX>5wlk*5nld(t&)xEZEYZB6ei=y_0mG>qJ}t=JkYW$h^#`);Z0g-t43(;%mf9sB zr1WEuz)9*%`K>2G_>%EFH*AbpgdO^j4q54PW}23^miL^?j44b5X)F}zCjW(7k6EotZU7-`q zxs5t|)I_l13<~>4%g3T(@NNPxw!+{CVf6#VcxRw_$4n%fSQ2XQSm#3ciQHPUsY}F2 z!GH})ew{h4CHW5cx~cF*`?{&n*h7;{r7~S+Q`^|L^ee}h=L>4qHDoY`!-*C%6W9b5 zxHE7d;S#KY0$YqulseQJn&Z|$mgk0)VnBZTi9iaS45Zx0n=EWoiUIi)AwdaageaCoJ@TgMhv%L0%NM3OHtBLCZE8xnlu>w8-t(8dCHN)8`a1etNUt;IaedOunjrp9e zAG|HE)k(2#$KaVkr?zGTL0o?8givpIJl=E_FH0A?$K#P=I-x>1ZS4Ed8ZuF>aE z>FqqcC3M@7tjg$sI@O}!*0-$KRlFmWFLF^8J8oC3JQ{}6LP_1ki^heY`Fo*s0ONw1 zch{CojcwR6#MVknO$DkGAwxr=|66MM`5pz8{upgrE;zBvUjQ>opJ0$OJ}t;zie|#f zcNSNeEj5jJL0hbu>D@MYx6R(|T<>;)ciZaSF7a-cdbf^u+wR?Vc(*+;P7Drt-ff|G zTkPJZ>xXf)WK-KNa3?NyRTCN4;|@W>d=Q?v_{>aP@2(H#_Fj{0v=f(>#!g&h3F&$S z+r`yPG4j|nPT47^3W6`6^5snMnQAhOw*{D5uRv?jFI!c(NQF|WK$d3 zH^Ng4ISKVfE)siF;TZdRaEjT;RBCAate7j9w*bf^X!C1|Pz|MDYQ>BL_mDip0)a)k zwSp~X5oA%c)g9luZ()4;Uo5EEoeMQoZgkmw7Aq)8aGXn5&R24uJaR<<+zj_qu69MR#JghgjO^ zy2-)UxLdM5Lygte4l;3^XN;mtevZMFW@CocRlMyPh?Qx zdaNiCF%FE<>u1#49M{6|Kulp!`57SBQ+(R#(%mD0L`G(&@}J>2w`GO~q{!)eITc zH+AOJRCYuwzU?5;nHoa-NqE7FLPE{~V2_SiYxh|893$s2rpY^5S*RIRo>>!}&Sa$k z%P`hq%cYx>xWWU?N0R3Hh4u=xzjAEh%CUJXOPzz6$d%uYsH@?00|Zprgb`S56qV)S z2`YR712y=ko>JbOl}x(+M3sZ#XxGTWNOP-4u8tuKf{TubY?ZNH*G3g|u<)v$`#VZR z2ftSpGH|n{>}E#SFj-^#3aO65iWm~{U^xZ7=pkML<-1CGR@%rYnF8hOD*R;%KP3YH z#fPk4TQr9bf(sz?nODm{iEg^Tm+-etkuK-OmJ8CivQqHZOdw}HW3^PH09iu(EpN=psciEBxqQ!Nl5~{WxaAb|+cy-^lCb>|Knd!-bYi zbz;e|e?g;jf(}5rsEIdjFnG4!A)=$!=S7XqFA`sDaeM9!p&=3Z)owe6K=^+A)xFpFH_UF(Ch_kfQz!q}(S% zN--dJSI8x#g@Kg&WJoCnW{ViC@-z11epaJ15H)!h+z1?x3Q$50mbyRUiBjm6 zqxJ!Bl80=Kp(ACbW;hLjM`V8b7mLV1A~Fpfs!jg_M1Bb(BBdKEB5u5HrmT!W6#~TF zL}M~r?4|T$EUkfkAV_6-3HNWE-XxzdfM&4}&=-{xf`SJu5I~cMUbUM5nyGJ+_!1v8 z(D(Rk?{S&$@iBNDgOTh-3#BlOO<+$n#(C^Q5-IK*^FP2DpnWxI4aRaWxvsr7{g}Kv-sI zTL<=4Pj-5Y!)ZmNwS@@*xk#@UyeT!q@UbA zfHXyna@0a>1LxP>!7Hhs9AbI~s8E~siM|`IzTyKb3U0Xj)aCUwlIotGfc{10;rJ)r zu54&o1g;T_;FkL1FQY53perzk8aQO|)?e@zG!bhqc&x0%>}{3MQ_><nmbZD=@os4Yo2MP#EzMW+lyjcBrKM$VIo+Du67RO3cU$V+(tI)R z(rhxf<=!o=4)b)RcU$4zj`41(pv}AW?rpkNB8_}h%BFffNLC23NZcC$RGt+w&K|^j zaQ@w&sZ{gx2aAEZ4lnwK37KkrTN!hs4>r%h-l?$f?JKbF^Adpli-BdN19&#p>%jzj ztE`4LA5LT@;b0>0l{HMAu3<7F8m^sGP}8yoD$D3Q)pOS&*xiWj1{mwdT7h+=N23(0 z(TbIpiFNwRTP)8?BW9r#*sgp>%C$DL8&(%wr%t1Axm^{LxZx*~F)IaTsTv?f9V-P3 zZW268e)OKyTBuT2 ztgnV@-AX+I@($J+BvuE)vBBDUu(koL{cw=5_9I@hd@8IxQKtLgvd%3WthN9q0Mroj zE!dCwD(6HrfBs%LOBIDBCe@S6d1>qOH}C|aIm5@N5cbFP@Usl`DIBe>^h=D*d+xfd!j9u>h@=KVAt(J za(Aadqm;`@_u*>@-5W(Os4Fg8^waqot89F8*`nDGb8g_V*^qY#c9zDM8L#wfO~xLv zXtX$2y(2hk3oy*&?C6l<^17o+P@OzBd2{SfcYD3{4&t3n{q&Hj6ps4Xk3%(99?2I?Z8JgjAQ16rg2*g z&7^kXeWqwHA>3tY(0m{Zb{GA2IWQQnSYqy86L~wRtXuW)0+?QXp zphi-#0rXyi;z~OdU2UXzmGZ$~<$+%coS#?~Tuv_C3u+$0TlCui;C`*4i4rSGSpJ3w zQbJ!9;P6q^xrMWFFSyI6Z2XmtD_eH1ye_@Tz*aIn^7jVu%+cOd?q1&}Ga9fs-L{p< zKj;onHB*%4MUBsP1kbzY`%F)2(>LFfkNxYuyP~)IpRiYRUaKd0jK(@ zm?3f0hM^%*0a?Isi%W!ap$Y-zq4zzx4c%MvTBeLy5*eCM)V>p!E2%Gd(JhxL`*XqzR4^5QhRK_=j%@0!dkunYH9LF^ z06;Q1UA*|dHQ9=XKxH`_e?b9D@Ad$30I(;EUbJ{s&&^{Oa6}=9fy**yGju(oca|4* zoyfI{IEj4sUAc&yeiB3;jpi(o>6P=;u1qUibAtAFwceQwun2;O$08V=Fuqo{6S=&c z$jy9$=ZxkES7%`L4kU0Cv#f+)uKE#W(3x|9Yv7d6{Pp9g6h-2E4~gnKb5Urk97v2$ zKw?N338RwRWupEPv=)6_w}9?rDqdG9W8Q$su3zxj2o@~SdA-iD)&^!3s_Ef*=ysgS zeh3J~tL#CqL{;|k63!IPNdN*$ILiGUN$kL=Xgt-OpT9l%sYY(B%OL*F<^f?PV@ak2^ zYvHMOafREJ+aR@p4??>3(YG7{Ii}ikpN{KF^}H$|+z^^-@ht9S^39DRWt93px91YL zhaba`eExCidJ`4LqpCO>Xi;F&Ih)Un{>QV*D)hP5ob$v&oJY0s!ecHFOiQB$dv7mV za4lX`3r^fyw4guR)MN}a5VP%aTscoQqaqoBym9_KQJf#5j|~pZ5gb-GIG70$xvG2< z;y-0^8c1-J&#?`hp9{mzj?O{F{7_!^0>*PaZOpMCbR}!VTEDu?Xk^!zDSKhHk;6l z={Ax7qbj>_gNrO=t_Gj)2V~JH2?fulHV?rV8}R8bK_)C2Twa;6VSIE$+^%6PK#7AV zRBMo}sCUjiQCjktj5x2(dgqm<7^%N?t&r50QtBBfz}ffTXv(o`*y_nkb<*Y2r8?<; z{jQyK@!E)`p|#_-e-Bv=>j1KYL~VL5GGNU1Gn@9eDhNbsehGaE*duPu$0gS6AIjGV zJZ(o4(?NK#XEsQLclHL5nn=NHH~ULvN!f0m;{u&&Xad=84jSniBx_@6Cuh4km1Ev- zUnOL_dG%4#jGM5m9|?WuL##X|VVRU}ued3_%LY=qFl@+j{D_yZLbn{XKlzAA8QvdW z2AFcAs^_Cx^ICan3cUm~2{DF=&`)2G<>alL zm!AKp8&M&qCC1AaI+s_)+muh=AgYpc`E0#iLY+gc84RpA`EQs*Dj$%3G7Cl{U*W5| z(UNW?spsp2i6xeCp+>UZ|9p2_TI9v4OIqX&;>$#Bi;b|z_%@`k6CfiMs_b8~| z4?HWV-UqNsoS(DrOPg`oZg!>20f$NjcyyYbg^C7E2ZFL@4`jRP6RdJ1^j8&LtM#Uf z-H@n-Rhn!!r@B?9K1SjqHF-i&qEO7fqe;D-4RJi2Nw)Yr)dVPL0w;aHa32H=u38J% z2f&yP7gZpyND1jSELe zZd`OuN?~_b*gYb!-$K_CmX>9gqI2Hahx(w~(K)>~;z$og=RD9?dh{SKf#{nGVwEF0 zr%cMb8J+WkMB*k#=Pcv82c)=3NRh5m_9aH=3_v_M6k`?DG`RD{M$(rrdGVriZe*P{ zxTPFgXLyCLbfT1YIXY*Mc0j^*+=C;&=$!th12?k+Dj~DC;XM@n&k{D9KT5G2Em-YqH|`bO#rprrRbbfurCOCFM<9*{6aro0wa7ls{?mt_&B?( z;p|odoB#I>MgAV=m=fos%_;)=agK_xuFZuIeTQyByKs6yi-pK zj=v^4=j3ZV(?E^JV02E|cj)G?jm|k3@#oNxfqndf8c|`OV9w~AhhFoMIqOE}tmNZR zjmgnD6Eo~2qjT;e5wipC7h1MBAG``?}HG!1Nf$)au`VztXpS$(eO~ zYq6Lm_~fapJPie18(IO6z730)i_jbMe4DwscatwKd6pS}-2vvVJHA-<^f)}|%Fb3B~vzxJ0{TQByJFuJl{*|U@0JMJF@NV)&?}WPG zx;&iLTVsek{kyIcdG9)DpDV=UEh^B*Q6hhL3y8c9C~b+%cQB7)E=8BsZy2+iyh|K{ zKYtsCVAPL(4@?p?N93NY$t3|N0=cB!{LqbB zk9zhWupnM7eZ5CP*U#e7Qdii~eztwzMIA26uxGzw-LPl>k!n{A0?n9ia|QHgCJbc8 z(%@FY_ZBi&gDdbA1Cqvg_R}F4z)1+ZTx;4dWbU6U3_}bR%PY* zUZH&#Jd4>UxCbAiMG5*TjZIxnDT`#=oh2)Rx~Ip`#HgD#TrSy>xI}f>eJTyqVfR?U zh*hvR+H6V2x$g#Ub+1)KyT-C9HwsjyeCz* zDhO18bPRKQ2H+-0PyBE@67DgD)6#S!Q5YfMlN$VmbT5Dd&^99-VO z)V+LEWgM{!>|pb@L0czCN1=fBNjDZ`cV=Y(IF3&-Us(Y8$|feE>d7;EOy~{HH{r{! zGbe2#cak&DouSTr2}pe+@YE2`xKVj)Y`qBP2ihpGvR$z z5GE$;({mjeygKOFDQHzseQ3h~mq4q}U&H{qz^)?sF1~D2@Yq4CK|;|mGJaP-n^(IU zyLX9pulaISb;@D(F~lu8wLMn#a;C!dBVK7dPuI82gN;`2JoFdQRZVE6Ieg4}{0iz4 zGpZ^us%By^$9>;UF`)=&rnvf-^MA+?Tl8l%=Koyk>vxJww>FY<{(^t7Knw@4L2RXT zv$J{*TwnM+p!cROZzq-No-U3ZbaST)n#6eO@+frkOxR16(n@GYmOrpD$tX)v?uj=3xRaz z#G&+LHPaKLZoZpfX=u{9LEXq!wwb@o0Wcd@^Fa!ov-Ke=8-Ax{z3bhjCrM-s-tjJT zx?%8+__G?k)VGp;NQ*8i23-RY(w%~Dae=x%vP zpYBqMV0OSeB8e?d0i5D(|3NDf6*fehdpyt_d^A~zt6FFKj+0mu59hW<11xi!9=9#S zBj>#rAPjUfF$67JwBByUl`p@}lIBe;YfD+N3_N}Dz6*#yCU*X8Da%7$LW(O%l5FZ< z0+UY5aJdy1 zDYblt)a_sCJGZin62R^TS`|_o+%A>*J| zTA}YFVa1^0J;E$e|L0+J1Oli6-y-`bhmAkhVmAtY*K37VzPP4-#4Q!> zsKrf6Gg#@XyK)#w5Y>Qd?F)e* zs^bCYmq}5O9i0VHO^{J14#bIin-D~`(N)lvrM1$}KoFH2I+q1Xi*tW8h{|djvkUl2hP)S+Nrp|N$ik43Rg3`-CFx7MJ8|((d8p6R;AFTsiP^DSJukQk+ZbFr6 zvWJ(gP`Y`pXQG$$0;8;LFxBq?g~8!;)QA)`hBezim&R$fuIZoiu1wND9XHF649Hhh zXYMTUaXPa(5#ISXI})S6-ox`ic&OD8qQB163Pbwq*NZm^5bB2tD(k-f8eL}x9dp zzs6QeKLh$p_wzA)(eKTF7Sv$jB?W=5jxRd;^wu{baJhm&fA7P}=&eHUk+l!Sh;sJZ zKUQy**!L6l){YbnPj5YRj!}%6qCLjN>aF}>l`(p2r``d*HQKE*_1;BY)LVV#LFTO9 zx*t%~TV+#)#1Xx<*1zNQR=0ydM>Sa=db@8IwUZ#wN0k~BqH$-tb4tvTVf`uy(GKjv z|AIif%Y>6m6x5_=aK>H4W~p zt$oRtzVNBA=6cp?VIx7H9#?Wh6w9(RTlR!YA5a=$yH1~zDF)=t3fTb2 z&VoQo$HnY*{PId@F;oGE;mr8hgU!Wa77yOzCwUqQx;7MhaQsDByqt&TV5Y&to^JK0 z6p9G~&FBmnNh!os2e*B~NhLL%7u{mq5h0bBGkiguN709iW}as~jAURaWF2-D@JuoV z;aO5Z=N*p%O@D3byKq)RALtkkVep$Fklz6<`qrcL^g{%H0M@SAlxEoe}5a+szuc(^CkyQc-1vJsBZ?a2l5TziPvy1uLC1P$ z+Y4ey_w|b*-VXOWg_>aFG)E)KHuDg^>%?3LA4G&*{4}`IUjZUHCHrj|yAil|-{l&o=@dN~U8%Z~=oI<-QOXhl)Lz zy}#!Sk-A{}v3=bRWJ>Pq16RcKRqE-sv**0&@y?!hk*kErr};YUsR6DUnM*jfI}a@1 z?|hK#|3T!_xfV5FxJYc|Q_Z)Sq#(j3^6AmzwM$;)(`xUF{lB_gVj^^&n))jupJu%$ zl|LpIf8}wJPZvz`R!Naipitz~xuzfNnu$$%>o|{FW=Chd8QtBCe46-BH1g?ETYD(- zX(h9ZuS(?8e_j_rQBkl&Y3ljh%Av@o$!_a$kx!TCM<+-N6Z!P=2$vR(qDA8)pKkd# zgu^1AwA%Z5BDF&P5AO;qf8@nmCoYx3bR*OQ?2kaUZeU~BFvY{hMn3K6K1zyw>M>N- z+U1}NJ7%id!@}i=e7c?=kpqZ{e0t_sLyNe`C$qCrg^8jz%7ysIr+?i-yKh((`dnLX z<9lRb{MrOXwhNI@CI1rA8}{e_?H!@+1H5>VPnWa4Fkb*7jh!Kd`IjqXbr7;#3OkE@ zT3365IV&9blxKP(0T|iT&&OCAb}90yjbB={l)>4qsZiUN7+Mf;CKx1JU#3VQSS;r1%wg--K^+U`y#;`Lnvz?BnL^oK~ z0s5JUC+t7NT*vR2h^Kj+TT#@lh^LAU%6TB-sgPkks3#Qh^tHna(k+J%=0lAmL8*L&%5LbmY z;qQ}H*Uw)ZS>tqa9-~xs8OQDyhr3LR(cRabijguCeT6l~$>aa(d5kwKYMrf0RosDtY5D zk2Pjha-i>#v0;~*anQ|G$p?2tS0x`E>S~)(B52QJob@7qq#L1fI8lcNH=fg6k2{ZX z$N~XW{SxVJXjSrw+j`upQSM2%qB4b$F;q}3Bl)A;y_ znAu)IQ=%JI?L5X38fhSTw^k=H=P|a9U!5H1vL&=SIYB>A=wF@mKghD%w>l}3hg_Wu zr+&x|I6~A!i!-Gb%Ksr?FIy(nY+klZ%Eo{i4T&q3aR@cV3(a_$hb`{u;a{=*B-qBT zSO%97x#69!SWZ8XFUo!}Ys(I}S1N6BUeOH%XY2`778pjM6BheC8W4|8BJg%o$)J#Y zc>r5P&U>&iDkRsBgpmA|ZFUxcSNOk=q>An!4PhkKVgtk6=1#--{y@?{X9V7p5LV31 z6JCqZ{3Og(Ud%l6?%CAcic*lQ=jmJ(R@E%`-<0wbCWL1ju+g zD+L*E5>lkAlzoY57$4Ll6;*0fDmMNocO1ZDs8;VY#BQV^Gh@lIBU4#Y*^jThMbaW4qPD|xYXtNmwS zyB>kpt6c=4o!Hh*>ky>Ffi!=|QSS0g=p(6xgJMFuZo~ovBT!ct!=)`*UFytR8Efo#t#f!ijz(rvu zAp);h3QjAedEuNb zjuvM@5#13vBk)e$D~4UpMcyhdDFW|legiU7bd(@A_-MK0j=)>@9H~_nFLnAM(@-Q; zLCx7xt6ks-ySDzPu&WX5!YVAkwM8hgkQZ+ab7h6FOX`k%B=syQOgG9pF1Wyni@@8y zTG$03a4jYcV_#MWcHJ(dj*GzCfnKk01m2rJ^ubh62+i5Z(UdK^X)xyoS`?jpB=v!P z%p`6(j{}uw364@z#x48_cZJy?*Y4{^ouXE&)MXUqP{wXL< zQCXl^&a{gIr~1g6b<-}^@^Prfih;li6#W#29*>8 zvQQyq3OA5CohL#{F(BVKS}3%HBi}&EeKNLE49Hs*a)A$0?vo*<7?7taWU~)a?vo*< z7?AxGvH_5tMcmCE8nc?c=H9?^#iU&fz0C z6aYVM>Ycne{NA`b4!JU?GD_M(j;DqvbdeGqk>3uZD(vX52Kzr zF}nRwP^%eD1OKkr1N%Lx{@aGGAqXJZcp6K*bd{N5yGxrh^*Pu8nnBitnR6C z3fms(34yn1MrAJNz%g)#!WPl0o zj9rt^3{>Y>>SrK-ZZI30-HLn7Lgs34!5kr#O_R7;2*&J;J*CHDJYEHN#>(8Tb;C=! z`7o;Oz|Ppqhr|r+TkZ%AoziaYjD0me*Us2B>hgWOSsFbZ3o_keY56rq%! znOKjL0U(49(TxaWL`6toMv8Pf8ACB%Za2voRvQM=1tKm>NT&JeU!aiXc(-6PKydv9 z+Tj=dn4696l+u5Ul0N%FLQzSJ(<7;aQhKEV#We2RcW|(SC;y5LZo%0J#6e2l5?{Z2 zbB+x3+lU7UvnnCW^AL7U;qLsq%b%u`L}%QIF``oecEp52?5IPB3jdCsU4;@eMIUew z)awao6B0wEF%wq_j_<85*k%Nw6x06M5{3AI41ELD;F+fz7RYy{#Gf$ zhr996`@UhlGX(8{48du(U`A*xqEcT7F=XX+fCUBvk5!9wpL{}uDs~2%3?GjFqliYc z$#K)@9C>=F(1|2Ff2Uj|D>x7&+ZG6cR1LoQpf!&qGYff5_0bPAyVH6(G!g@fNZoAF z0iT&grO>*OHjkS^BwJ1)to46&@5CQPKpT9qlUJcuf^DcQYAnx6j!Dtms+7$KK^Yj~ z4CI-9ye-&algo{UKH+E-WK$2ZT$$e}%;&+k>bXD!L)`3ps&}kTO(zc(k!blubnpYy zt6Rjtxoy>y@qluEV0y~~V#K5U){uB42>k&b2OroW7YBz8@vNLXm1(WFo2&fRtp~|u z#k8?=>YX}(#2G)whH#r#1<{4vRaQkM?8aSO3Cquk-veckuz6_Fhz;u0z^@OLuo$Ri zg}S>QPMrc4=DDd;dOO#`G14|#pd=4>lXx#64Ig|$}`Wq5_jO+aLbg&;5 z7g%^XSXi5$PWkmoA-(CK$aGcs^1akgw9;BA0oYH}C(s>g(f;Qf^u}L78`lD|+0*8t zBC3N>CCHOnP}7JvAh{A4L<#=X;P+bGbK9I`!V~Xo`s+}W)I01!ZF&apfBBxnrvd?pRu%Rc#-KWol@!qv?x4(nl-~7x?$c*I z;Fkdusfk2`MY}mxpVi|jO>`xxR{^&&AWTIakH|9adtP)IcO<{wL@k<0SNTNi6S@>_ zJru&MOg9b2C^4VZ@k2BlhqKm@(6PR(xwdkwaYD_Lf}!M6Ips z2$l?3EW>Z79GmzEt&DS1O#(scFkRf%CO2S_)(oyllMHrrI5_fA% zum7B&ZTv_*TR|P@cc0e2lLiaE-pgr0wKm2m=Uu!P(b#Prcq>TT>kRTF59%3hq{PPR zOrUgyl!}=*{d#3D1QE9l7s8rS=~ml9s0ta>%au0UY-?ykE^=HWH(<>@Y}(9|Wb
abU3%UY5oq|U;6FK#?_B9x0&FU^byv(ju0TQ zkd<{mP1b<@WTgw>;bo|x-00LH=(4F((qxsoKjOWJ&{l##1u=eaunRnvR=))vn~;0e z0*@u|T>$oF3Y&n*VR4&F=}p5@1J9l`Jb|!nC#RqU^|wpbuTbH##H53F4pfN{FjVop zCa?0C6_`JBCmrmI=@9i`8R-9V>y1l^y+lRNbzczErrk_M?;8OD+yubmF%M0?D^sGt z)dJ2xjaSdB@*m*DkGQN}@0W<$rT3>@q4e(FP5POr z^xp4O=?%O99Q2f4|99A}LMogDrPtuY$|$|G_b90JF8W+54=cS9_WeYqcPiz|Q+glv zb(P*(Tg5891Ab}^9hjN8~FxP|1*c>Z;F2zRdM#S4{e(Y56SnO-7+lz){{RME9S%Ck
dX52T5RLx3Z$%Jb>M7VAmuRvn}3udd9)zu*A536 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